diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 39a97226cbd5..f81159d09315 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -24,7 +24,6 @@ # MULTIPLE OWNERS - # Host Hell diff --git a/.github/workflows/auto_changelog.yml b/.github/workflows/auto_changelog.yml index 37dc7d2e054e..a2a438ee0098 100644 --- a/.github/workflows/auto_changelog.yml +++ b/.github/workflows/auto_changelog.yml @@ -10,11 +10,11 @@ permissions: contents: write jobs: auto_changelog: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: github.event.pull_request.merged == true steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Generate App Token id: app-token-generation diff --git a/.github/workflows/autowiki.yml b/.github/workflows/autowiki.yml index 2f6cadbbf922..d6e8c5890972 100644 --- a/.github/workflows/autowiki.yml +++ b/.github/workflows/autowiki.yml @@ -8,7 +8,7 @@ permissions: jobs: autowiki: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - name: "Check for AUTOWIKI_USERNAME" id: secrets_set @@ -20,7 +20,7 @@ jobs: echo "SECRETS_ENABLED=$SECRET_EXISTS" >> $GITHUB_OUTPUT - name: Checkout if: steps.secrets_set.outputs.SECRETS_ENABLED - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install BYOND if: steps.secrets_set.outputs.SECRETS_ENABLED uses: ./.github/actions/restore_or_install_byond diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index 184fd52bd829..e42012491855 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -17,7 +17,7 @@ jobs: start_gate: if: ( !contains(github.event.head_commit.message, '[ci skip]') ) name: Start Gate - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - name: Mandatory Empty Step run: exit 0 @@ -80,7 +80,7 @@ jobs: run_alternate_tests, run_linters, ] - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - name: Decide whether the needed jobs succeeded or failed uses: re-actors/alls-green@release/v1 diff --git a/.github/workflows/codeowner_reviews.yml b/.github/workflows/codeowner_reviews.yml index cc5d8e8a20e0..f1cb174de37b 100644 --- a/.github/workflows/codeowner_reviews.yml +++ b/.github/workflows/codeowner_reviews.yml @@ -7,12 +7,12 @@ on: jobs: assign-users: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 5 steps: # Checks-out your repository under $GITHUB_WORKSPACE, so the job can access it - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 #Parse the Codeowner file on non draft PRs - name: CodeOwnersParser diff --git a/.github/workflows/collect_data.yml b/.github/workflows/collect_data.yml index b82575bfd873..60cf249dfca0 100644 --- a/.github/workflows/collect_data.yml +++ b/.github/workflows/collect_data.yml @@ -18,7 +18,7 @@ on: jobs: collect_data: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 timeout-minutes: 5 outputs: maps: ${{ steps.map_finder.outputs.maps }} @@ -27,7 +27,7 @@ jobs: required_build_versions: ${{ steps.setup_required_build_versions.outputs.required_build_versions }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Find Maps id: map_finder run: | diff --git a/.github/workflows/compare_screenshots.yml b/.github/workflows/compare_screenshots.yml index d9fdaa2b1ff9..b814905b9b8e 100644 --- a/.github/workflows/compare_screenshots.yml +++ b/.github/workflows/compare_screenshots.yml @@ -6,14 +6,14 @@ on: jobs: compare_screenshots: timeout-minutes: 15 - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup directory run: mkdir -p artifacts # If we ever add more artifacts, this is going to break, but it'll be obvious. - name: Download screenshot tests - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v7 with: path: artifacts - name: ls -R @@ -34,7 +34,7 @@ jobs: echo ${{ github.event.pull_request.number }} > artifacts/screenshot_comparisons/pull_request_number.txt - name: Upload bad screenshots if: failure() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: bad-screenshots path: artifacts/screenshot_comparisons diff --git a/.github/workflows/compile_all_maps.yml b/.github/workflows/compile_all_maps.yml index 2512d5fa9796..c80c0f4ae052 100644 --- a/.github/workflows/compile_all_maps.yml +++ b/.github/workflows/compile_all_maps.yml @@ -10,11 +10,11 @@ on: jobs: compile_all_stations: name: Compile All Station Maps - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 timeout-minutes: 5 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup Bun uses: ./.github/actions/setup_bun - name: Restore BYOND from Cache @@ -31,11 +31,11 @@ jobs: compile_all_templates: name: Compile All Templates - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 timeout-minutes: 5 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup Bun uses: ./.github/actions/setup_bun - name: Restore BYOND from Cache diff --git a/.github/workflows/compile_changelogs.yml b/.github/workflows/compile_changelogs.yml index fd4214890f9e..d23589260fb7 100644 --- a/.github/workflows/compile_changelogs.yml +++ b/.github/workflows/compile_changelogs.yml @@ -8,7 +8,7 @@ on: jobs: compile: name: "Compile changelogs" - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 permissions: contents: write steps: @@ -35,7 +35,7 @@ jobs: - name: "Checkout" if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 25 persist-credentials: false diff --git a/.github/workflows/discord_discussions.yml b/.github/workflows/discord_discussions.yml index 68876aed1853..da1b2b223876 100644 --- a/.github/workflows/discord_discussions.yml +++ b/.github/workflows/discord_discussions.yml @@ -18,7 +18,7 @@ concurrency: jobs: manage-discord-discussion: name: Manage Discord Discussion - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: contains(github.event.pull_request.labels.*.name, 'Discord Discussion') steps: - name: Fail if vars.DISCORD_DISCUSSIONS_CHANNEL_ID is unset @@ -34,7 +34,7 @@ jobs: dotnet-quality: ga - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Build Tgstation.DiscordDiscussions run: dotnet publish -c Release -o discord_discussions_bins tools/Tgstation.DiscordDiscussions/Tgstation.DiscordDiscussions.csproj diff --git a/.github/workflows/discord_pr_announce.yml b/.github/workflows/discord_pr_announce.yml index d6150e76fb3f..6ceb35463998 100644 --- a/.github/workflows/discord_pr_announce.yml +++ b/.github/workflows/discord_pr_announce.yml @@ -5,7 +5,7 @@ on: jobs: notify: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.event.action != 'labeled' || github.event.label.name == 'Stale' }} steps: - name: "Check for DISCORD_WEBHOOK" diff --git a/.github/workflows/gbp.yml b/.github/workflows/gbp.yml index 4931252e962e..f25f0bd05e21 100644 --- a/.github/workflows/gbp.yml +++ b/.github/workflows/gbp.yml @@ -5,14 +5,14 @@ on: jobs: # labeler must run before gbp because gbp calculates itself based on labels labeler: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: github.event.action == 'opened' || github.event.action == 'synchronize' permissions: pull-requests: write # to apply labels issues: write # to apply labels steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Run Auto Labeler uses: actions/github-script@v7 with: @@ -27,7 +27,7 @@ jobs: }); console.log(`Labels updated: ${new_labels}`); gbp: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: github.event.action == 'opened' || github.event.action == 'closed' steps: - name: "Check for ACTION_ENABLER secret and pass true to output if it exists to be checked by later steps" @@ -40,7 +40,7 @@ jobs: echo "ACTIONS_ENABLED=$SECRET_EXISTS" >> $GITHUB_OUTPUT - name: Checkout if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup git if: steps.value_holder.outputs.ACTIONS_ENABLED run: | @@ -48,7 +48,7 @@ jobs: git config --global user.email "<>" - name: Checkout alternate branch if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: "gbp-balances" # The branch name path: gbp-balances diff --git a/.github/workflows/gbp_collect.yml b/.github/workflows/gbp_collect.yml index 1e83e860ab72..715af0126efc 100644 --- a/.github/workflows/gbp_collect.yml +++ b/.github/workflows/gbp_collect.yml @@ -6,7 +6,7 @@ on: workflow_dispatch: jobs: gbp_collection: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - name: "Check for ACTION_ENABLER secret and pass true to output if it exists to be checked by later steps" id: value_holder @@ -18,7 +18,7 @@ jobs: echo "ACTIONS_ENABLED=$SECRET_EXISTS" >> $GITHUB_OUTPUT - name: Checkout if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup git if: steps.value_holder.outputs.ACTIONS_ENABLED run: | @@ -26,7 +26,7 @@ jobs: git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - name: Checkout alternate branch if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: "gbp-balances" # The branch name path: gbp-balances diff --git a/.github/workflows/generate_client_storage.yml b/.github/workflows/generate_client_storage.yml new file mode 100644 index 000000000000..f601288b14b3 --- /dev/null +++ b/.github/workflows/generate_client_storage.yml @@ -0,0 +1,33 @@ +name: "Generate Client Storage" +on: + push: + branches: + - master + paths: + - tgui/public/* + +jobs: + dispatch_repo: + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) + name: Repository Dispatch + runs-on: ubuntu-24.04 + steps: + - name: Generate App Token + id: app-token-generation + uses: actions/create-github-app-token@v2 + if: env.APP_PRIVATE_KEY != '' && env.APP_ID != '' + with: + app-id: ${{ secrets.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + owner: tgstation + env: + APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }} + APP_ID: ${{ secrets.APP_ID }} + + - name: Send Repository Dispatch + if: success() + uses: peter-evans/repository-dispatch@v4 + with: + token: ${{ steps.app-token-generation.outputs.token }} + repository: tgstation/byond-client-storage + event-type: on_master_push diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_documentation.yml index 79dc2593681d..3949732751c5 100644 --- a/.github/workflows/generate_documentation.yml +++ b/.github/workflows/generate_documentation.yml @@ -10,12 +10,12 @@ jobs: permissions: contents: write # for JamesIves/github-pages-deploy-action to push changes in repo if: ( !contains(github.event.head_commit.message, '[ci skip]') ) - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 concurrency: gen-docs steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/SpacemanDMM key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }} @@ -27,7 +27,7 @@ jobs: touch dmdoc/.nojekyll echo codedocs.tgstation13.org > dmdoc/CNAME - name: Deploy - uses: JamesIves/github-pages-deploy-action@v4.7.3 + uses: JamesIves/github-pages-deploy-action@v4.7.6 with: branch: gh-pages clean: true diff --git a/.github/workflows/remove_guide_comments.yml b/.github/workflows/remove_guide_comments.yml index 4bbc0c602515..e5e168df7f58 100644 --- a/.github/workflows/remove_guide_comments.yml +++ b/.github/workflows/remove_guide_comments.yml @@ -6,10 +6,10 @@ on: types: [opened] jobs: remove_guide_comments: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Remove guide comments uses: actions/github-script@v7 with: diff --git a/.github/workflows/rerun_flaky_tests.yml b/.github/workflows/rerun_flaky_tests.yml index 95f52ddf7b40..013308ff34a7 100644 --- a/.github/workflows/rerun_flaky_tests.yml +++ b/.github/workflows/rerun_flaky_tests.yml @@ -12,11 +12,11 @@ permissions: # DARKPACK ADDITION END jobs: rerun_flaky_tests: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.run_attempt == 1 }} steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Rerun flaky tests uses: actions/github-script@v7 with: @@ -24,11 +24,11 @@ jobs: const { rerunFlakyTests } = await import('${{ github.workspace }}/tools/pull_request_hooks/rerunFlakyTests.js') await rerunFlakyTests({ github, context }) report_flaky_tests: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.run_attempt == 2 }} steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Report flaky tests uses: actions/github-script@v7 with: diff --git a/.github/workflows/round_id_linker.yml b/.github/workflows/round_id_linker.yml index 7fb0ee8c4f32..9b3ddfe2d36b 100644 --- a/.github/workflows/round_id_linker.yml +++ b/.github/workflows/round_id_linker.yml @@ -5,7 +5,7 @@ on: jobs: link_rounds: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: tgstation/round_linker@master with: diff --git a/.github/workflows/run_integration_tests.yml b/.github/workflows/run_integration_tests.yml index e50b47324e3e..22401f63f289 100644 --- a/.github/workflows/run_integration_tests.yml +++ b/.github/workflows/run_integration_tests.yml @@ -26,17 +26,17 @@ jobs: # Otherwise, it will output `Run Tests (map; max)`. # For example, `Run Tests (runtimestation; 515)`. name: Run Tests (${{ inputs.major && format('{0}.{1}; ', inputs.major, inputs.minor) || '' }}${{ inputs.map }}; ${{ inputs.max_required_byond_client }}) - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 15 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Restore BYOND from Cache uses: ./.github/actions/restore_or_install_byond with: major: ${{ inputs.major }} minor: ${{ inputs.minor }} - name: Download build outputs - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v7 with: name: build-artifact-${{ inputs.major || env.BYOND_MAJOR }}-${{ inputs.minor || env.BYOND_MINOR}} path: ./ @@ -63,7 +63,7 @@ jobs: bash tools/ci/run_server.sh ${{ inputs.map }} - name: Upload screenshot tests if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: test_artifacts_${{ inputs.map }}_${{ inputs.major }}_${{ inputs.minor }} path: data/screenshots_new/ diff --git a/.github/workflows/run_linters.yml b/.github/workflows/run_linters.yml index 942234bb701c..387eab3ff9b6 100644 --- a/.github/workflows/run_linters.yml +++ b/.github/workflows/run_linters.yml @@ -5,13 +5,13 @@ on: jobs: linters: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 timeout-minutes: 5 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Restore SpacemanDMM cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/SpacemanDMM key: ${{ runner.os }}-spacemandmm-${{ hashFiles('dependencies.sh') }} @@ -20,21 +20,21 @@ jobs: - name: Setup Bun uses: ./.github/actions/setup_bun - name: Restore Bootstrap cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: tools/bootstrap/.cache - key: ${{ runner.os }}-bootstrap-${{ hashFiles('tools/requirements.txt') }} + key: ${{ runner.os }}-bootstrap-${{ hashFiles('/tools/requirements.txt') }} restore-keys: | ${{ runner.os }}-bootstrap- - name: Restore Rust cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.cargo - key: ${{ runner.os }}-rust-${{ hashFiles('tools/ci/ci_dependencies.sh')}} + key: ${{ runner.os }}-rust-${{ hashFiles('/tools/ci/ci_dependencies.sh')}} restore-keys: | ${{ runner.os }}-rust- - name: Restore Cutter cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: tools/icon_cutter/cache key: ${{ runner.os }}-cutter-${{ hashFiles('dependencies.sh') }} @@ -72,7 +72,9 @@ jobs: 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 - tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < tools/ticked_file_enforcement/schemas/modular_darkpack.json + tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < modular_darkpack/tools/ticked_file_enforcement/modular_darkpack_master_files.json + tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < modular_darkpack/tools/ticked_file_enforcement/modular_darkpack_modules.json + tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < modular_darkpack/tools/ticked_file_enforcement/modular_darkpack_unit_tests.json - name: Check Define Sanity if: steps.linter-setup.conclusion == 'success' && !cancelled() run: tools/bootstrap/python -m define_sanity.check diff --git a/.github/workflows/setup_build_artifact.yml b/.github/workflows/setup_build_artifact.yml index aaf4cfb45538..57e3a7715f55 100644 --- a/.github/workflows/setup_build_artifact.yml +++ b/.github/workflows/setup_build_artifact.yml @@ -11,10 +11,10 @@ on: jobs: setup_build_artifact: name: Setup build artifact (${{ format('{0}.{1}', inputs.major, inputs.minor) }}) - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 timeout-minutes: 5 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup Bun uses: ./.github/actions/setup_bun - name: Restore BYOND from Cache @@ -35,7 +35,7 @@ jobs: bash tools/ci/copy_build_output.sh $OUTPUT_DIR - name: Upload artifact if: success() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: build-artifact-${{ inputs.major }}-${{ inputs.minor }} path: ${{ env.OUTPUT_DIR }} diff --git a/.github/workflows/show_screenshot_test_results.yml b/.github/workflows/show_screenshot_test_results.yml index 6901e1d1d176..2cfd4f2fd4a8 100644 --- a/.github/workflows/show_screenshot_test_results.yml +++ b/.github/workflows/show_screenshot_test_results.yml @@ -13,7 +13,7 @@ jobs: show_screenshot_test_results: if: ( !contains(github.event.head_commit.message, '[ci skip]') && github.event.workflow_run.run_attempt == 1 ) name: Show Screenshot Test Results - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - name: "Check for ARTIFACTS_FILE_HOUSE_KEY" id: secrets_set @@ -25,7 +25,7 @@ jobs: echo "SECRETS_ENABLED=$SECRET_EXISTS" >> $GITHUB_OUTPUT - name: Checkout if: steps.secrets_set.outputs.SECRETS_ENABLED - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Prepare module if: steps.secrets_set.outputs.SECRETS_ENABLED run: | diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index cec11541e429..1a8bc4d3e910 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -12,18 +12,22 @@ jobs: permissions: issues: write # for actions/stale to close stale issues pull-requests: write # for actions/stale to close stale PRs - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/stale@v10 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: "This PR has been inactive for long enough to be automatically marked as stale. This means it is at risk of being auto closed in ~ 7 days, please address any outstanding review items and ensure your PR is finished, if these are all true and you are auto-staled anyway, you need to actively ask maintainers if your PR will be merged. Once you have done any of the previous actions then you should request a maintainer remove the stale label on your PR, to reset the stale timer. If you feel no maintainer will respond in that time, you may wish to close this PR youself, while you seek maintainer comment, as you will then be able to reopen the PR yourself" + stale-issue-message: "This issue has been marked for cleanup and will be automatically closed in ~ 14 days. If there is evidence that the issue still occurs, leave a comment with it attached and contact a maintainer to have the label removed." days-before-stale: 7 days-before-close: 7 + days-before-issue-stale: 14 + days-before-issue-close: 14 stale-pr-label: "Stale" - days-before-issue-stale: -1 - stale-issue-label: "Cleanup Flagged" + stale-issue-label: "Stale" + any-of-issue-labels: "Cleanup Flagged,🤖 Flaky Test Report" remove-issue-stale-when-updated: false + exempt-issue-labels: "RED LABEL" exempt-pr-labels: "RED LABEL,Good First PR" operations-per-run: 300 diff --git a/.github/workflows/test_merge_bot.yml b/.github/workflows/test_merge_bot.yml index 101c3ad2b322..ee5d01e15f56 100644 --- a/.github/workflows/test_merge_bot.yml +++ b/.github/workflows/test_merge_bot.yml @@ -11,7 +11,7 @@ on: jobs: test_merge_bot: name: Test Merge Detector - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - name: Check for GET_TEST_MERGES_URL id: secrets_set @@ -23,7 +23,7 @@ jobs: echo "GET_TEST_MERGES_URL=$SECRET_EXISTS" >> $GITHUB_OUTPUT - name: Checkout if: steps.secrets_set.outputs.GET_TEST_MERGES_URL - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Prepare module if: steps.secrets_set.outputs.GET_TEST_MERGES_URL run: | diff --git a/.github/workflows/tgs_test.yml b/.github/workflows/tgs_test.yml index feb89bac9c05..fefe765bb753 100644 --- a/.github/workflows/tgs_test.yml +++ b/.github/workflows/tgs_test.yml @@ -42,7 +42,7 @@ jobs: test_tgs_docker: if: ( !contains(github.event.head_commit.message, '[ci skip]') ) name: Test TGS Docker - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 concurrency: group: test_tgs_docker-${{ github.head_ref || github.run_id }} cancel-in-progress: true @@ -64,7 +64,7 @@ jobs: dotnet-version: 8.0.x - name: Checkout Repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Test TGS Integration run: dotnet run -c Release --project tools/tgs_test ${{ github.repository }} /tgs_instances/tgstation ${{ env.TGS_API_PORT }} ${{ github.event.pull_request.head.sha || github.sha }} ${{ secrets.GITHUB_TOKEN }} ${{ env.PR_NUMBER }} diff --git a/.github/workflows/update_tgs_dmapi.yml b/.github/workflows/update_tgs_dmapi.yml index 885ac26c8391..6335f9047f50 100644 --- a/.github/workflows/update_tgs_dmapi.yml +++ b/.github/workflows/update_tgs_dmapi.yml @@ -7,14 +7,14 @@ on: jobs: update-dmapi: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 name: Update the TGS DMAPI permissions: contents: write pull-requests: write steps: - name: Clone - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Branch run: | diff --git a/.vscode/launch.json b/.vscode/launch.json index d87097ad419c..e137e741ef40 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -15,6 +15,13 @@ "preLaunchTask": "Build All (low memory mode)", "dmb": "${workspaceFolder}/${command:CurrentDMB}" }, + { + "type": "byond", + "request": "launch", + "name": "Launch DreamSeeker (absolute minimum)", + "preLaunchTask": "Build All (absolute minimum)", + "dmb": "${workspaceFolder}/${command:CurrentDMB}" + }, { "type": "byond", "request": "launch", @@ -52,6 +59,14 @@ "dmb": "${workspaceFolder}/${command:CurrentDMB}", "dreamDaemon": true }, + { + "type": "byond", + "request": "launch", + "name": "Launch DreamDaemon (absolute minimum)", + "preLaunchTask": "Build All (absolute minimum)", + "dmb": "${workspaceFolder}/${command:CurrentDMB}", + "dreamDaemon": true + }, { "type": "byond", "request": "launch", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index f3c14cea754e..aa32b74939a5 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -40,6 +40,26 @@ "dependsOn": "dm: reparse", "label": "Build All (low memory mode)" }, + { + "type": "process", + "command": "tools/build/build.sh", + "args": ["-DLOWMEMORYMODE", "-DABSOLUTE_MINIMUM"], + "windows": { + "command": ".\\tools\\build\\build.bat", + "args": ["-DLOWMEMORYMODE", "-DABSOLUTE_MINIMUM"] + }, + "options": { + "env": { + "DM_EXE": "${config:dreammaker.byondPath}" + } + }, + "problemMatcher": ["$dreammaker", "$tsc", "$eslint-stylish"], + "group": { + "kind": "build" + }, + "dependsOn": "dm: reparse", + "label": "Build All (absolute minimum)" + }, { "type": "process", "command": "tools/build/build.sh", diff --git a/README.md b/README.md index b22476d84cb8..77ea01de5206 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ [![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 | Link | -| ----------------------- | ------------------------------------------------------------------------------------ | -| Code | [https://github.com/ApocryphaXIII/Apocrypha13](https://github.com/ApocryphaXIII/Apocrypha13)| -| The Second City Discord | [https://discord.gg/rmAbJcuChD](https://discord.gg/rmAbJcuChD) | -| Coderbus Discord | [https://discord.gg/Vh8TJp9](https://discord.gg/Vh8TJp9) | +| Website | Link | +| ----------------------- | -------------------------------------------- | +| Code | https://github.com/ApocryphaXIII/Apocrypha13 | +| The Second City Discord | https://discord.gg/rmAbJcuChD | +| Coderbus Discord | https://discord.gg/Vh8TJp9 | This is the codebase for Apocrypha13, a downstream/fork for the Darkpack13 Project, a fork of TGstation 2025 @@ -40,9 +40,9 @@ For overall design documentation see [HackMD](https://hackmd.io/@tgstation). ## LICENSE -All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.html). +All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/12/31 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.html). -All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html). +All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/12/31 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html). (Including tools unless their readme specifies otherwise.) See LICENSE and GPLv3.txt for more details. diff --git a/SQL/darkpack/darkpack_database_changelog.md b/SQL/darkpack/darkpack_database_changelog.md new file mode 100644 index 000000000000..d8c8fe8f29be --- /dev/null +++ b/SQL/darkpack/darkpack_database_changelog.md @@ -0,0 +1,25 @@ +Any time you make a change to the schema files, remember to increment the database schema version. Generally increment the minor number, major should be reserved for significant changes to the schema. Both values go up to 255. Keep this up to date with `../database_changelog.md` and be sure to update that one's latest database version accordingly as well. + +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.34; The query to update the schema revision table is: + +```sql +INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 34); +``` + +or + +```sql +INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 34); +``` + +In any query remember to add a prefix to the table names if you use one. + +--- + +Version 5.34, 14 January 2026, by XeonMations, Buffyuwu + +```sql +ALTER TABLE `library` MODIFY COLUMN `category` VARCHAR(255); +``` diff --git a/SQL/database_changelog.md b/SQL/database_changelog.md index 1e146f4ebeda..dc59adec3e46 100644 --- a/SQL/database_changelog.md +++ b/SQL/database_changelog.md @@ -2,16 +2,16 @@ 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.33; The query to update the schema revision table is: +The latest database version is 5.34; The query to update the schema revision table is: ```sql -INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 33); +INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 34); /* DARKPACK EDIT, ORIGINAL: INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 33); */ ``` or ```sql -INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 33); +INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 34); /* DARKPACK EDIT, ORIGINAL: INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 33); */ ``` In any query remember to add a prefix to the table names if you use one. diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql index a42a4a8d985d..3fa640c99366 100644 --- a/SQL/tgstation_schema.sql +++ b/SQL/tgstation_schema.sql @@ -261,7 +261,7 @@ CREATE TABLE `library` ( `author` varchar(45) NOT NULL, `title` varchar(45) NOT NULL, `content` text NOT NULL, - `category` enum('Any','Fiction','Non-Fiction','Adult','Reference','Religion') NOT NULL, + `category` VARCHAR(255) NOT NULL, /* DARKPACK EDIT, ORIGINAL: `category` enum('Any','Fiction','Non-Fiction','Adult','Reference','Religion') NOT NULL, */ `ckey` varchar(32) NOT NULL DEFAULT 'LEGACY', `datetime` datetime NOT NULL, `deleted` tinyint(1) unsigned DEFAULT NULL, @@ -647,7 +647,7 @@ CREATE TABLE `ticket` ( KEY `idx_ticket_act_time_rid` (`action`, `timestamp`, `round_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -DELIMITER $$ +DELIMITER // CREATE PROCEDURE `set_poll_deleted`( IN `poll_id` INT ) @@ -658,16 +658,16 @@ UPDATE `poll_option` SET deleted = 1 WHERE pollid = poll_id; UPDATE `poll_vote` SET deleted = 1 WHERE pollid = poll_id; UPDATE `poll_textreply` SET deleted = 1 WHERE pollid = poll_id; END -$$ +// CREATE TRIGGER `role_timeTlogupdate` AFTER UPDATE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.CKEY, NEW.job, NEW.minutes-OLD.minutes); END -$$ +// CREATE TRIGGER `role_timeTloginsert` AFTER INSERT ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.ckey, NEW.job, NEW.minutes); END -$$ +// CREATE TRIGGER `role_timeTlogdelete` AFTER DELETE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (OLD.ckey, OLD.job, 0-OLD.minutes); END -$$ +// DELIMITER ; -- diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql index d0497ff5c3e6..1df1c636263a 100644 --- a/SQL/tgstation_schema_prefixed.sql +++ b/SQL/tgstation_schema_prefixed.sql @@ -260,7 +260,7 @@ CREATE TABLE `SS13_library` ( `author` varchar(45) NOT NULL, `title` varchar(45) NOT NULL, `content` text NOT NULL, - `category` enum('Any','Fiction','Non-Fiction','Adult','Reference','Religion') NOT NULL, + `category` VARCHAR(255) NOT NULL, /* DARKPACK EDIT, ORIGINAL: `category` enum('Any','Fiction','Non-Fiction','Adult','Reference','Religion') NOT NULL, */ `ckey` varchar(32) NOT NULL DEFAULT 'LEGACY', `datetime` datetime NOT NULL, `deleted` tinyint(1) unsigned DEFAULT NULL, @@ -646,7 +646,7 @@ CREATE TABLE `SS13_ticket` ( KEY `idx_ticket_act_time_rid` (`action`, `timestamp`, `round_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -DELIMITER $$ +DELIMITER // CREATE PROCEDURE `set_poll_deleted`( IN `poll_id` INT ) @@ -657,16 +657,16 @@ UPDATE `SS13_poll_option` SET deleted = 1 WHERE pollid = poll_id; UPDATE `SS13_poll_vote` SET deleted = 1 WHERE pollid = poll_id; UPDATE `SS13_poll_textreply` SET deleted = 1 WHERE pollid = poll_id; END -$$ +// CREATE TRIGGER `SS13_role_timeTlogupdate` AFTER UPDATE ON `SS13_role_time` FOR EACH ROW BEGIN INSERT into SS13_role_time_log (ckey, job, delta) VALUES (NEW.CKEY, NEW.job, NEW.minutes-OLD.minutes); END -$$ +// CREATE TRIGGER `SS13_role_timeTloginsert` AFTER INSERT ON `SS13_role_time` FOR EACH ROW BEGIN INSERT into SS13_role_time_log (ckey, job, delta) VALUES (NEW.ckey, NEW.job, NEW.minutes); END -$$ +// CREATE TRIGGER `SS13_role_timeTlogdelete` AFTER DELETE ON `SS13_role_time` FOR EACH ROW BEGIN INSERT into SS13_role_time_log (ckey, job, delta) VALUES (OLD.ckey, OLD.job, 0-OLD.minutes); END -$$ +// DELIMITER ; -- diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm index 79126e4fdd2e..4107abfea553 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm @@ -123,10 +123,8 @@ /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) "op" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/structure/sign/warning/secure_area, +/obj/structure/flora/tree/pine, +/obj/structure/sign/warning/secure_area/directional/south, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) "tW" = ( @@ -134,7 +132,6 @@ dir = 4 }, /obj/structure/flora/rock/pile/icy/style_2, -/obj/structure/sign/warning/secure_area, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) "uy" = ( @@ -201,6 +198,11 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"Fj" = ( +/obj/structure/flora/grass/brown/style_random, +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "Fn" = ( /obj/structure/railing{ dir = 6 @@ -304,11 +306,8 @@ /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/nospawn) "Wr" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/structure/sign/nanotrasen, -/turf/open/misc/asteroid/snow/icemoon, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/nospawn) "Wt" = ( /obj/effect/turf_decal/stripes/line, @@ -439,9 +438,9 @@ fl (5,1,1) = {" fl kd +Sc Wr vJ -vJ kd kd mP @@ -868,8 +867,8 @@ mP mP mP bE -nT op +Sc "} (20,1,1) = {" cO @@ -902,7 +901,7 @@ wg "} (21,1,1) = {" tW -kd +Fj lH Wt mP diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_ore_vent.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_ore_vent.dmm index 51584f90f86a..7109d813b1aa 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_ore_vent.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_ore_vent.dmm @@ -1,12 +1,15 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( +/obj/effect/mapping_helpers/no_atoms_ontop, /turf/template_noop, /area/template_noop) "l" = ( +/obj/effect/mapping_helpers/no_atoms_ontop, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) "L" = ( /obj/structure/ore_vent/random/icebox, +/obj/effect/mapping_helpers/no_atoms_ontop, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm index c9b3d35aa726..fe11d7a8b6c2 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm @@ -805,14 +805,12 @@ /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/machinery/airalarm/directional/south{ - pixel_y = 35 - }, +/obj/machinery/airalarm/directional/north, /turf/open/floor/iron/cafeteria, /area/ruin/pizzeria/kitchen) "IW" = ( /obj/effect/spawner/random/entertainment/cigarette, -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/nospawn) "IY" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm index b44fbe0b1b55..fad279c0710e 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm @@ -199,7 +199,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/iron, /area/ruin/plasma_facility/operations) @@ -325,7 +325,7 @@ /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) "fx" = ( -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /turf/open/lava/plasma/ice_moon, /area/ruin/plasma_facility/operations) "fJ" = ( @@ -399,7 +399,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /turf/open/floor/iron/grimy, /area/ruin/plasma_facility/commons) "gH" = ( @@ -748,18 +748,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, /area/ruin/plasma_facility/commons) -"lW" = ( -/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/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) "lX" = ( /obj/structure/table/reinforced, /obj/item/flashlight/lantern, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /turf/open/floor/iron/smooth{ initial_gas_mix = "ICEMOON_ATMOS" }, @@ -853,7 +845,6 @@ }, /area/ruin/plasma_facility/commons) "nu" = ( -/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, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -978,7 +969,7 @@ /area/ruin/plasma_facility/commons) "pl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 + dir = 4 }, /obj/effect/turf_decal/tile/brown/half, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -1028,13 +1019,19 @@ /turf/open/floor/plating/icemoon, /area/ruin/plasma_facility/operations) "pX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/plating/icemoon, /area/ruin/plasma_facility/operations) "qk" = ( /obj/structure/flora/grass/green/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"qr" = ( +/obj/structure/sign/warning/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "qv" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/east, @@ -1181,8 +1178,11 @@ /obj/item/stock_parts/capacitor, /turf/open/floor/plating/icemoon, /area/ruin/plasma_facility/commons) +"sN" = ( +/turf/closed/wall, +/area/icemoon/underground/explored) "sP" = ( -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/ruin/plasma_facility/operations) "sX" = ( @@ -1310,6 +1310,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) +"vh" = ( +/obj/structure/flora/grass/brown/style_random, +/obj/structure/sign/warning/directional/west, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "vt" = ( /turf/closed/wall, /area/ruin/plasma_facility/operations) @@ -1583,11 +1588,9 @@ /obj/structure/fence{ dir = 4 }, -/obj/structure/sign/warning, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) "BZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/mining{ name = "Processing Control" @@ -1859,7 +1862,6 @@ /turf/open/floor/plating/icemoon, /area/ruin/plasma_facility/operations) "Ib" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_half{ @@ -1928,7 +1930,7 @@ /area/icemoon/underground/explored) "Jn" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /turf/open/floor/iron/smooth{ initial_gas_mix = "ICEMOON_ATMOS" }, @@ -2015,6 +2017,11 @@ /obj/machinery/light/small/blacklight/directional/south, /turf/open/floor/iron/grimy, /area/ruin/plasma_facility/commons) +"Kj" = ( +/obj/structure/flora/rock/icy/style_random, +/obj/structure/sign/warning/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "Km" = ( /obj/structure/girder, /turf/open/floor/plating/icemoon, @@ -2077,7 +2084,7 @@ /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) "KY" = ( -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/ruin/plasma_facility/commons) "Lh" = ( @@ -2126,7 +2133,7 @@ /turf/open/floor/wood/large, /area/ruin/plasma_facility/commons) "LY" = ( -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /turf/open/floor/plating, /area/ruin/plasma_facility/commons) "LZ" = ( @@ -2227,7 +2234,9 @@ /turf/open/floor/iron/white/textured_half, /area/ruin/plasma_facility/commons) "Nm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /obj/effect/turf_decal/tile/brown/half{ dir = 1 }, @@ -2564,6 +2573,17 @@ }, /turf/open/floor/stone, /area/ruin/plasma_facility/commons) +"SI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/edge{ + dir = 1 + }, +/area/ruin/plasma_facility/commons) "SR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -2582,6 +2602,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/edge{ dir = 1 }, @@ -2661,6 +2682,7 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/edge, /area/ruin/plasma_facility/commons) "VS" = ( @@ -2720,7 +2742,6 @@ /turf/open/floor/iron/corner, /area/ruin/plasma_facility/commons) "WU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/machinery/light_switch/directional/east, @@ -2912,7 +2933,7 @@ /area/ruin/plasma_facility/commons) "ZC" = ( /obj/effect/decal/cleanable/glass, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) "ZH" = ( @@ -3168,7 +3189,7 @@ Yw Yw Yw BY -LZ +Kj rs fP rs @@ -3187,7 +3208,7 @@ AG AG LZ BY -ms +qr hJ Py Yw @@ -3301,7 +3322,7 @@ zX XI XI Nm -lW +DN pl Mc af @@ -3335,8 +3356,8 @@ ri ri qW XW -PB -bM +SI +DN VD gj ac @@ -4085,8 +4106,8 @@ rk dr dr dr -NC -ms +sN +qr AG AG AG @@ -4241,7 +4262,7 @@ AG AG AG AG -NC +sN dr II vt @@ -4276,7 +4297,7 @@ AG AG AG AG -zF +vh rs rs oi diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm index 6ef2066b1915..3a55529f5fab 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm @@ -439,7 +439,7 @@ /area/ruin/powered) "PQ" = ( /obj/effect/decal/cleanable/blood/splatter, -/mob/living/simple_animal/hostile/illusion{ +/mob/living/basic/illusion{ death_message = "disperses into the air in a cloud of red mist, you feel slightly more at ease."; desc = "You can't quite make out what you're seeing."; faction = list("cult"); diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm index 24e409e0f7ca..61bc59a530a5 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm @@ -463,7 +463,9 @@ /obj/item/reagent_containers/condiment/rice, /obj/item/reagent_containers/condiment/milk, /obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/sugar, /obj/structure/closet/secure_closet/freezer/empty, +/obj/item/knife/kitchen, /obj/item/storage/box/donkpockets, /obj/item/coffee_cartridge, /obj/item/coffee_cartridge/decaf, @@ -496,6 +498,7 @@ /obj/structure/closet/crate/freezer, /obj/item/food/grown/potato, /obj/item/food/grown/potato, +/obj/item/food/grown/carrot, /obj/item/food/grown/onion, /obj/item/food/grown/garlic, /turf/open/floor/iron/white, diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_cheap.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_cheap.dmm index 462f5b486aad..ee2ab997b2d8 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_cheap.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_cheap.dmm @@ -8,7 +8,11 @@ pixel_x = -2 }, /obj/item/paper/monitorkey, -/obj/item/paperwork, +/obj/item/radio/intercom/syndicate/freerange{ + dir = 1; + pixel_y = 32 + }, +/obj/item/folder/syndicate/mining, /turf/open/floor/plating, /area/ruin/comms_agent) "b" = ( @@ -39,9 +43,6 @@ /turf/open/floor/plating, /area/ruin/comms_agent) "q" = ( -/obj/item/radio/intercom/syndicate/freerange{ - pixel_x = -31 - }, /obj/machinery/modular_computer/preset{ dir = 4 }, diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_luxury.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_luxury.dmm index a7b2d4dea8be..ce78df7db268 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_luxury.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_luxury.dmm @@ -144,11 +144,11 @@ /area/ruin/comms_agent) "M" = ( /obj/structure/filingcabinet, -/obj/item/paperwork, /obj/item/paper/monitorkey, /obj/item/paper/fluff/ruins/listeningstation/briefing{ pixel_x = -2 }, +/obj/item/folder/syndicate/mining, /turf/open/floor/wood/tile, /area/ruin/comms_agent) "N" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_standard.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_standard.dmm index b1edb418dfb3..9d77d3535fec 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_standard.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_standard.dmm @@ -49,11 +49,11 @@ /area/ruin/comms_agent) "u" = ( /obj/structure/filingcabinet, -/obj/item/paperwork, /obj/item/paper/monitorkey, /obj/item/paper/fluff/ruins/listeningstation/briefing{ pixel_x = -2 }, +/obj/item/folder/syndicate/mining, /turf/open/floor/wood/tile, /area/ruin/comms_agent) "v" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm index 54b33b5e8111..6749491b68b6 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm @@ -195,6 +195,14 @@ pixel_x = -3; pixel_y = 7 }, +/obj/machinery/button/door/directional/north{ + id = "ice_comms_car"; + name = "Garage Door Button"; + pixel_x = -23; + pixel_y = 0; + req_access = list("research"); + dir = 8 + }, /turf/open/floor/plating/icemoon, /area/ruin/powered/shuttle) "zz" = ( @@ -239,13 +247,6 @@ dir = 4 }, /obj/machinery/light/small/directional/south, -/obj/machinery/button/door/directional/north{ - id = "ice_comms_car"; - name = "Garage Door Button"; - pixel_x = -23; - pixel_y = 22; - req_access = list("research") - }, /turf/open/floor/plating/icemoon, /area/ruin/powered/shuttle) "FK" = ( @@ -312,7 +313,7 @@ /obj/structure/rack, /obj/item/wrench, /obj/item/crowbar/large/twenty_force, -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /turf/open/floor/plating/icemoon, /area/ruin/powered/shuttle) "Kr" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm index c62c9f09e4eb..45defb797ed4 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm @@ -202,10 +202,6 @@ /obj/machinery/light/small/red/directional/north, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/ruin/powered/mailroom) -"vU" = ( -/obj/structure/sign/departments/cargo, -/turf/closed/indestructible/reinforced, -/area/ruin/powered/mailroom) "vV" = ( /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/iron/smooth_large, @@ -470,6 +466,7 @@ pixel_x = 4; pixel_y = 3 }, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/iron/white, /area/ruin/powered/mailroom) "Wr" = ( @@ -485,16 +482,13 @@ "WE" = ( /turf/closed/wall/r_wall, /area/ruin/powered/mailroom) -"Xa" = ( -/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, +/obj/structure/sign/departments/cargo/directional/south, /turf/open/floor/iron/textured, /area/ruin/powered/mailroom) "XO" = ( @@ -693,7 +687,7 @@ SY iO MC Wr -Xa +ms Wj ch Mi @@ -767,7 +761,7 @@ MT ba ba Xi -vU +ms iV zr iV diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_ore_vent.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_ore_vent.dmm index db409d08c8cf..a4d4953702ab 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_ore_vent.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_ore_vent.dmm @@ -1,12 +1,16 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( +/obj/effect/mapping_helpers/no_atoms_ontop, /turf/template_noop, /area/template_noop) "l" = ( +/obj/effect/mapping_helpers/no_atoms_ontop, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/unexplored) "L" = ( /obj/structure/ore_vent/random/icebox/lower, +/obj/effect/mapping_helpers/no_atoms_ontop, +/obj/effect/mapping_helpers/no_atoms_ontop, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/unexplored) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_outpost31.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_outpost31.dmm index 24b4221ebf27..b6531a220082 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_outpost31.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_outpost31.dmm @@ -555,7 +555,6 @@ /turf/open/floor/wood, /area/ruin/outpost31/kennel) "kP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /turf/open/floor/pod/dark, @@ -626,6 +625,7 @@ /obj/machinery/power/apc/auto_name/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron/white/smooth_half, /area/ruin/outpost31/medical) "lW" = ( @@ -834,7 +834,6 @@ /area/ruin/outpost31/recroom) "qt" = ( /obj/machinery/door/airlock/external/glass/ruin, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "o31a" @@ -1046,7 +1045,6 @@ /turf/open/floor/catwalk_floor/iron, /area/ruin/outpost31) "uj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /obj/effect/decal/cleanable/dirt/dust, @@ -1211,7 +1209,6 @@ /area/ruin/outpost31/lootroom) "xP" = ( /obj/machinery/door/airlock/external/glass/ruin, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "o31B" @@ -1241,11 +1238,6 @@ initial_gas_mix = "o2=14;n2=30;TEMP=293.15" }, /area/ruin/outpost31/lab) -"yQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/pod/dark, -/area/ruin/outpost31) "yW" = ( /obj/structure/sign/warning/biohazard, /turf/closed/indestructible/reinforced, @@ -1259,7 +1251,6 @@ /area/ruin/outpost31/lab) "zd" = ( /obj/machinery/door/airlock/grunge, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/autoname, @@ -1380,12 +1371,6 @@ /obj/item/ammo_box/c9mm, /turf/open/floor/carpet/green, /area/ruin/outpost31/commander_room) -"AE" = ( -/obj/machinery/door/airlock/grunge, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/autoname, -/turf/open/floor/carpet/green, -/area/ruin/outpost31/commander_room) "AG" = ( /obj/machinery/door/airlock/grunge, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, @@ -1399,6 +1384,14 @@ /obj/item/paper_bin, /turf/open/floor/iron, /area/ruin/outpost31/radiomap) +"AX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/outpost31) "Bb" = ( /obj/machinery/light/warm/directional/south, /obj/effect/turf_decal/tile/neutral, @@ -1594,6 +1587,14 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/ruin/outpost31) +"EM" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/outpost31) "ES" = ( /obj/item/kirbyplants/random/dead, /obj/effect/turf_decal/siding/white{ @@ -1633,6 +1634,12 @@ /obj/structure/table, /turf/open/floor/iron/cafeteria, /area/ruin/outpost31/kitchendiningroom) +"Fy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/catwalk_floor/iron, +/area/ruin/outpost31) "FH" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/tile/neutral{ @@ -1767,7 +1774,6 @@ /area/ruin/outpost31/medical) "Ie" = ( /obj/machinery/door/airlock/external/glass/ruin, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "o31d" @@ -1859,6 +1865,11 @@ dir = 4 }, /area/ruin/outpost31/medical) +"JU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron, +/area/ruin/outpost31) "Kh" = ( /obj/structure/thing_boss_phase_depleter, /turf/open/floor/circuit/red/off{ @@ -2035,7 +2046,6 @@ /turf/open/floor/iron/freezer, /area/ruin/outpost31/crewquarters) "NP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, @@ -2122,7 +2132,6 @@ /turf/open/floor/iron/kitchen/small, /area/ruin/outpost31/kitchendiningroom) "PR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -2587,6 +2596,12 @@ "Yo" = ( /turf/open/misc/asteroid/snow/icemoon/do_not_chasm, /area/icemoon/underground/explored) +"YC" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/mapping_helpers/airlock/autoname, +/obj/structure/cable, +/turf/open/floor/carpet/green, +/area/ruin/outpost31/commander_room) "YG" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -3016,7 +3031,7 @@ uB uB Sg Lf -yQ +lM qI Sg SN @@ -3100,7 +3115,7 @@ yp ES aq Ht -QU +AX lO aV Wu @@ -3142,7 +3157,7 @@ kh UH Ml vX -ge +Fy oN rO gu @@ -3875,10 +3890,10 @@ Ly Ly Ly Ly -uA -AE -vX -YK +Ly +iA +cp +JU Uy xc xc @@ -3918,9 +3933,9 @@ fM Ly Ly uA -iA -Ht -qK +YC +EM +JU Uy xc uB diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index b4d563d8fed0..2e6a25bdab3d 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -146,10 +146,6 @@ /obj/structure/fluff/beach_umbrella/engine, /turf/open/misc/beach/sand, /area/ruin/powered/beach) -"ct" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/wood, -/area/ruin/powered/beach) "cE" = ( /obj/effect/turf_decal/sand, /obj/effect/turf_decal/stripes/asteroid/line{ @@ -263,7 +259,7 @@ /turf/open/floor/wood, /area/ruin/powered/beach) "gX" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/layer4, +/obj/machinery/atmospherics/components/unary/passive_vent/layer4, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/explored) "hj" = ( @@ -304,7 +300,9 @@ /area/ruin/powered/beach) "hC" = ( /obj/machinery/light/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 + }, /obj/structure/chair/stool/bar/directional/south, /turf/open/floor/wood, /area/ruin/powered/beach) @@ -330,7 +328,6 @@ dir = 1 }, /obj/structure/table/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/wood, /area/ruin/powered/beach) "hX" = ( @@ -359,12 +356,6 @@ /obj/item/reagent_containers/cup/glass/colocup, /turf/open/floor/wood, /area/ruin/powered/beach) -"kg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/pod/light, -/area/ruin/powered/beach) "kh" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 @@ -441,6 +432,15 @@ /obj/item/reagent_containers/condiment/flour, /turf/open/floor/wood, /area/ruin/powered/beach) +"oe" = ( +/obj/effect/spawner/random/bedsheet{ + dir = 4 + }, +/obj/structure/bed{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) "og" = ( /obj/structure/weightmachine/weightlifter, /turf/open/floor/pod/dark, @@ -460,9 +460,6 @@ /area/ruin/powered/beach) "oU" = ( /obj/machinery/seed_extractor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, /turf/open/floor/pod/light, /area/ruin/powered/beach) "pz" = ( @@ -552,6 +549,15 @@ /obj/item/toy/beach_ball, /turf/open/misc/beach/sand, /area/ruin/powered/beach) +"rO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/ruin/powered/beach) "rU" = ( /obj/item/reagent_containers/condiment/enzyme, /obj/item/reagent_containers/cup/beaker{ @@ -605,7 +611,6 @@ /turf/open/floor/light/colour_cycle/dancefloor_a, /area/ruin/powered/beach) "vf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/table/wood/poker, /obj/item/storage/dice, /obj/item/stack/spacecash/c1000, @@ -631,10 +636,9 @@ /turf/open/floor/pod/light, /area/ruin/powered/beach) "xa" = ( -/obj/structure/sign/warning/secure_area, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/closed/wall/mineral/sandstone, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/sign/warning/secure_area/directional/west, +/turf/open/floor/plating, /area/ruin/powered/beach) "xe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ @@ -822,33 +826,16 @@ }, /turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) -"CZ" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/ruin/powered/beach) "Df" = ( /obj/structure/table, /obj/machinery/reagentgrinder, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/wood, /area/ruin/powered/beach) -"Dg" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/ruin/powered/beach) "Ds" = ( /obj/structure/closet/secure_closet/freezer/kitchen/all_access, /turf/open/floor/wood, /area/ruin/powered/beach) -"Eq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/turf/open/floor/wood, -/area/ruin/powered/beach) "Eu" = ( /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/water/beach, @@ -959,7 +946,7 @@ /area/ruin/powered/beach) "Iq" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 + dir = 8 }, /turf/open/floor/pod/light, /area/ruin/powered/beach) @@ -1014,7 +1001,7 @@ /area/ruin/powered/beach) "JP" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 + dir = 8 }, /turf/open/floor/pod/light, /area/ruin/powered/beach) @@ -1109,9 +1096,7 @@ /turf/open/floor/wood, /area/ruin/powered/beach) "OP" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/machinery/light/directional/south, /turf/open/floor/wood, /area/ruin/powered/beach) @@ -1506,7 +1491,7 @@ Cs Cs aj Zi -xa +BE BE Mf FO @@ -1518,8 +1503,8 @@ aj HW aC aC -Eq -ct +kh +aC hS cd Bp @@ -1538,7 +1523,7 @@ Wa as pE mh -Wa +xa gs VI VI @@ -1660,7 +1645,7 @@ Ti Ti hC vf -ct +aC BN Lm Lm @@ -2157,9 +2142,9 @@ Lm hX VO og -wY -wY -wY +gC +gC +rO Fr yc Bp @@ -2179,7 +2164,7 @@ kh aj de TC -hq +oe MZ hj mw @@ -2221,9 +2206,9 @@ dc hX VO og -gC +wY EN -kg +wY wY Pr MZ @@ -2253,7 +2238,7 @@ CL wY wY wY -gC +wY oF oU wY @@ -2285,9 +2270,9 @@ qF BE yc FD -gC wY -kg +wY +wY wY AY MZ @@ -2317,9 +2302,9 @@ UZ IL MZ sV -Dg +sV jh -CZ +sV sV Zi Mf diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm index bbf0c14f8f32..cc9f5e7a2958 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm @@ -266,7 +266,7 @@ /turf/open/floor/wood, /area/ruin/powered/snow_biodome) "hA" = ( -/obj/machinery/light/built/directional/north, +/obj/machinery/light/empty/directional/north, /obj/effect/mapping_helpers/no_lava, /turf/open/floor/pod/dark{ initial_gas_mix = "LAVALAND_ATMOS" diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_crashsite.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_crashsite.dmm index 6150ca807272..4a162ed4e76e 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_crashsite.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_crashsite.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( /turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "b" = ( /obj/machinery/door/airlock/titanium{ name = "Escape Pod Airlock" @@ -45,11 +45,11 @@ "h" = ( /obj/effect/decal/cleanable/rubble, /turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "i" = ( /obj/effect/mob_spawn/corpse/goliath, /turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "j" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -63,7 +63,7 @@ /area/ruin/unpowered) "l" = ( /turf/open/water/hot_spring/lavaland_atmos, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "m" = ( /obj/machinery/door/airlock/survival_pod/glass, /turf/open/floor/pod/dark, @@ -75,7 +75,7 @@ /area/ruin/unpowered) "o" = ( /turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "p" = ( /obj/structure/rack, /obj/item/storage/toolbox/emergency, @@ -97,17 +97,17 @@ "t" = ( /obj/structure/flora/tree/stump, /turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "u" = ( /obj/structure/bonfire/prelit, /turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "v" = ( /obj/effect/decal/cleanable/rubble, /obj/item/stack/sheet/mineral/titanium, /obj/item/stack/sheet/mineral/titanium, /turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "w" = ( /obj/effect/decal/cleanable/glass/titanium, /obj/item/stack/sheet/mineral/titanium, @@ -119,7 +119,7 @@ dir = 8 }, /turf/open/misc/ashplanet/wateryrock/lavaland_atmos, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "y" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -130,22 +130,22 @@ "z" = ( /obj/item/book/manual/fish_catalog, /turf/open/misc/ashplanet/wateryrock/lavaland_atmos, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "B" = ( /mob/living/basic/mining/goliath, /turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "D" = ( /obj/item/gun/energy/recharge/kinetic_accelerator, /turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "E" = ( /turf/open/misc/ashplanet/wateryrock/lavaland_atmos, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "F" = ( /obj/effect/mob_spawn/corpse/human/cargo_tech, /turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "G" = ( /turf/template_noop, /area/template_noop) @@ -176,7 +176,7 @@ "L" = ( /obj/item/storage/toolbox/fishing, /turf/open/misc/ashplanet/wateryrock/lavaland_atmos, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "M" = ( /obj/structure/rack, /obj/item/pickaxe/emergency, @@ -194,14 +194,14 @@ "P" = ( /obj/effect/mob_spawn/corpse/human/miner, /turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "Q" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/ruin/unpowered) "R" = ( /mob/living/basic/mining/goliath/ancient, /turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "S" = ( /obj/structure/bed/pod, /obj/item/bedsheet/black, @@ -214,7 +214,7 @@ "U" = ( /obj/item/bait_can/worm/premium, /turf/open/misc/ashplanet/wateryrock/lavaland_atmos, -/area/lavaland/surface) +/area/lavaland/surface/outdoors) "V" = ( /obj/structure/table/survival_pod, /obj/item/food/meat/steak/goliath, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm index f61188c3a460..2b4b18d6c680 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm @@ -40,6 +40,7 @@ "bh" = ( /obj/effect/decal/cleanable/blood/oil, /obj/structure/chair/office/light, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/mineral/titanium/white, /area/ruin/powered/graveyard_shuttle) "bi" = ( @@ -298,6 +299,7 @@ "vP" = ( /obj/item/light/bulb/broken, /obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/mineral/titanium/white, /area/ruin/powered/graveyard_shuttle) "vS" = ( @@ -623,10 +625,6 @@ /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/powered/graveyard_shuttle) -"ZC" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/mineral/titanium, -/area/ruin/powered/graveyard_shuttle) "ZH" = ( /obj/structure/stone_tile/surrounding_tile, /turf/open/misc/asteroid/basalt/wasteland{ @@ -1499,9 +1497,9 @@ AB bf aH aH -ZC +aH IR -ZC +aH aH aH aH diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm index d03c2800eea7..790879899dbe 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm @@ -585,6 +585,7 @@ pixel_y = -1 }, /obj/structure/closet/crate/freezer, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer2, /turf/open/floor/iron/freezer{ baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, @@ -714,7 +715,7 @@ }, /area/ruin/thelizardsgas_lavaland) "Eh" = ( -/obj/machinery/atmospherics/components/tank/oxygen{ +/obj/machinery/atmospherics/components/tank/air/layer2{ dir = 8 }, /turf/open/floor/iron/smooth{ @@ -730,7 +731,6 @@ /area/ruin/thelizardsgas_lavaland) "Es" = ( /obj/machinery/door/airlock/external/ruin, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ @@ -850,6 +850,12 @@ baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, /area/ruin/thelizardsgas_lavaland) +"Im" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/turf/open/floor/iron{ + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + }, +/area/ruin/thelizardsgas_lavaland) "IC" = ( /obj/structure/cable, /obj/structure/railing, @@ -1038,7 +1044,6 @@ pixel_y = 2; pixel_x = 6 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden/layer4, /turf/open/floor/iron{ baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface }, @@ -1530,7 +1535,7 @@ IU HL xW rM -IU +Im pp FA dC diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_mookvillage.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_mookvillage.dmm index 70ebd3ce4286..241b2b608f25 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_mookvillage.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_mookvillage.dmm @@ -106,6 +106,7 @@ "x" = ( /obj/structure/table/wood/shuttle_bar, /obj/item/clothing/head/costume/garland/poppy, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/wood/lavaland, /area/lavaland/surface/outdoors) "y" = ( @@ -119,10 +120,6 @@ /obj/structure/chair/pew/right, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"C" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/wood, -/area/lavaland/surface/outdoors) "E" = ( /obj/structure/flora/grass/jungle/b, /turf/open/misc/grass/jungle/lavaland, @@ -588,7 +585,7 @@ a a a a -C +h x c c diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index bd903799d9f0..b79b36502388 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -346,6 +346,20 @@ pixel_x = 6 }, /obj/item/reagent_containers/cup/bottle/epinephrine, +/obj/item/stack/sheet/mineral/silver{ + amount = 5; + pixel_x = 5 + }, +/obj/item/stack/sheet/mineral/silver{ + amount = 5; + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/stack/sheet/mineral/silver{ + amount = 5; + pixel_y = 4; + pixel_x = -3 + }, /turf/open/floor/iron/white/corner{ dir = 4 }, @@ -369,9 +383,12 @@ /turf/open/floor/engine, /area/ruin/syndicate_lava_base/engineering) "dQ" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/testlab) +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/secure_area/directional/west, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/ruin/syndicate_lava_base/main) "dV" = ( /obj/machinery/atmospherics/miner/plasma, /turf/open/floor/engine/plasma, @@ -666,7 +683,6 @@ /turf/open/floor/iron, /area/ruin/syndicate_lava_base/chemistry) "fx" = ( -/obj/structure/sign/warning/secure_area, /obj/machinery/porta_turret/syndicate{ dir = 9 }, @@ -774,6 +790,8 @@ "gg" = ( /obj/structure/sign/warning/fire/directional/north, /obj/structure/sign/warning/xeno_mining/directional/south, +/obj/structure/sign/warning/secure_area/directional/northeast, +/obj/structure/sign/warning/secure_area/directional/southeast, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/cargo) "gh" = ( @@ -795,24 +813,11 @@ /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, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink/kitchen/directional/west, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) -"gO" = ( -/obj/structure/sign/departments/cargo, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/cargo) "gP" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown{ @@ -1100,10 +1105,6 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"iq" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/main) "iF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -1702,6 +1703,9 @@ /area/ruin/syndicate_lava_base/engineering) "nA" = ( /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/white/corner, /area/ruin/syndicate_lava_base/medbay) "nB" = ( @@ -1758,9 +1762,9 @@ /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/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/medbay) @@ -1864,10 +1868,11 @@ "oD" = ( /obj/structure/sign/warning/xeno_mining/directional/west, /obj/structure/sign/warning/fire/directional/east, +/obj/structure/sign/warning/secure_area/directional/southwest, +/obj/structure/sign/warning/secure_area/directional/southeast, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/arrivals) "oF" = ( -/obj/structure/sign/warning/secure_area, /obj/machinery/porta_turret/syndicate{ dir = 9 }, @@ -1899,6 +1904,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/mapping_helpers/airalarm/syndicate_access, /obj/machinery/airalarm/directional/south, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/main) "pk" = ( @@ -1922,9 +1928,9 @@ /area/ruin/syndicate_lava_base/engineering) "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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/medbay) "pu" = ( @@ -2003,9 +2009,11 @@ }, /area/ruin/syndicate_lava_base/medbay) "qA" = ( -/obj/structure/reagent_dispensers/beerkeg, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) +/obj/machinery/wall_healer/free/directional/north, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/ruin/syndicate_lava_base/medbay) "qN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2167,10 +2175,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/cargo) -"sB" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/cargo) "sH" = ( /obj/machinery/door/airlock/virology/glass{ name = "Monkey Pen" @@ -2218,7 +2222,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/machinery/duct, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) "tB" = ( @@ -2330,7 +2333,8 @@ /area/ruin/syndicate_lava_base/bar) "vo" = ( /obj/machinery/light/small/directional/east, -/obj/machinery/duct, +/obj/structure/table/reinforced, +/obj/machinery/microwave, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) "vy" = ( @@ -2394,7 +2398,6 @@ 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; @@ -2469,8 +2472,9 @@ /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) "xX" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, +/obj/item/reagent_containers/condiment/enzyme, +/obj/item/food/chocolatebar, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) "ye" = ( @@ -2581,13 +2585,6 @@ /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 @@ -2613,7 +2610,42 @@ /turf/open/floor/iron, /area/ruin/syndicate_lava_base/cargo) "zy" = ( -/obj/machinery/duct, +/obj/structure/closet/crate/freezer{ + pixel_x = 0; + pixel_y = 0 + }, +/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{ + pixel_x = 0; + pixel_y = 0 + }, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) "zC" = ( @@ -2670,6 +2702,7 @@ /obj/structure/cable, /obj/effect/mapping_helpers/apc/syndicate_access, /obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/oven/range, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) "Ab" = ( @@ -3157,8 +3190,8 @@ /turf/open/floor/plating/lavaland_atmos, /area/ruin/syndicate_lava_base/main) "GG" = ( -/obj/machinery/microwave, /obj/structure/table/reinforced, +/obj/machinery/processor, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) "GI" = ( @@ -3277,6 +3310,7 @@ }, /obj/machinery/duct, /obj/machinery/light/small/directional/north, +/obj/structure/sign/departments/cargo/directional/east, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) "Iv" = ( @@ -3455,7 +3489,6 @@ /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) "KX" = ( @@ -3651,10 +3684,6 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"Oj" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/arrivals) "Oq" = ( /obj/effect/spawner/random/vending/colavend{ hacked = 1 @@ -3789,6 +3818,11 @@ /obj/effect/turf_decal/sand/plating/volcanic, /turf/open/floor/plating/lavaland_atmos, /area/ruin/syndicate_lava_base/arrivals) +"Qp" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/wall_healer/free/directional/south, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) "Qu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -3866,19 +3900,18 @@ /turf/open/floor/engine/plasma, /area/ruin/syndicate_lava_base/engineering) "RG" = ( -/obj/structure/sink/kitchen/directional/west, -/obj/structure/closet/secure_closet/freezer/kitchen/maintenance{ - req_access = null - }, +/obj/structure/closet/secure_closet/freezer/meat/all_access, /obj/item/storage/box/donkpockets{ - pixel_x = 2 + pixel_x = 0; + pixel_y = 0 }, /obj/item/storage/box/donkpockets{ - pixel_y = 3 + pixel_y = 0; + pixel_x = 0 }, /obj/item/storage/box/donkpockets{ - pixel_x = -2; - pixel_y = 6 + pixel_x = 0; + pixel_y = 0 }, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) @@ -3911,9 +3944,6 @@ /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) "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, @@ -4242,6 +4272,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/main) "WA" = ( @@ -4318,36 +4349,9 @@ /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, +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance{ + req_access = null + }, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) "XE" = ( @@ -4517,8 +4521,18 @@ /turf/open/floor/plating, /area/ruin/syndicate_lava_base/cargo) "ZA" = ( -/obj/structure/reagent_dispensers/plumbed, /obj/machinery/light/small/directional/north, +/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, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) "ZH" = ( @@ -5327,7 +5341,7 @@ Vb mT mT mT -Oj +mT ab ab ab @@ -5651,7 +5665,7 @@ pa pa pa ae -dQ +ae TD hd hy @@ -5701,7 +5715,7 @@ ae ae ae oP -fH +dQ IX yA hz @@ -5753,7 +5767,7 @@ Mr EC jd IX -he +Qp hz UX Xi @@ -5865,9 +5879,9 @@ Vj BH rV jy -qA -gv mN +gv +jZ tA SN jy @@ -6067,11 +6081,11 @@ hz wx ha kQ -ln +qA lJ pW lI -zq +lJ nM ob al @@ -6252,14 +6266,14 @@ SQ Iw dy dy -gO +dy Tb hC dy ha -iq +ha eZ -iq +ha ha ha yG @@ -6650,7 +6664,7 @@ ab ab ab ab -sB +dy gh fx si 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 8ca5c0cd2b50..0a4fce58b465 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_1.dmm @@ -133,6 +133,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) "R" = ( @@ -147,10 +148,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) -"V" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/telecomms) "W" = ( /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) @@ -200,7 +197,7 @@ a (4,1,1) = {" f f -V +f O f f diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_2.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_2.dmm index fd703febfb16..6f294481474f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_2.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_2.dmm @@ -3,9 +3,7 @@ /turf/template_noop, /area/template_noop) "b" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood, /area/ruin/syndicate_lava_base/telecomms) "h" = ( @@ -93,7 +91,6 @@ "F" = ( /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/effect/turf_decal/siding/wood/corner, /turf/open/floor/wood, /area/ruin/syndicate_lava_base/telecomms) @@ -229,7 +226,7 @@ a K y b -y +S T K a @@ -238,8 +235,8 @@ a a K y -S y +S T K a diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_3.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_3.dmm index cd6670dfb21f..8d8bba7502d1 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_3.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_3.dmm @@ -227,7 +227,6 @@ "W" = ( /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, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/telecomms) @@ -315,7 +314,7 @@ a G O s -p +s j k G 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 9dfb448cffec..a636d9d65efb 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_feasible.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_feasible.dmm @@ -17,14 +17,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"ad" = ( -/obj/structure/table/reinforced, -/obj/item/restraints/handcuffs, -/obj/item/taperecorder, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) "ae" = ( /obj/machinery/firealarm/directional/south, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -33,19 +25,6 @@ /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/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) "ag" = ( /obj/structure/table/reinforced, /obj/item/restraints/handcuffs, @@ -67,12 +46,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"aj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) "ak" = ( /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, @@ -83,14 +56,6 @@ /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) "am" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /obj/machinery/door/firedoor, @@ -106,7 +71,7 @@ /area/ruin/syndicate_lava_base/testlab) "ao" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 + dir = 1 }, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) @@ -122,33 +87,8 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"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) "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, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/testlab) -"as" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, +/obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) "at" = ( @@ -174,43 +114,6 @@ /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) -"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) -"ay" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"az" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) "aA" = ( /obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, @@ -240,12 +143,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"aC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) "aD" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/testlab) @@ -262,35 +159,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"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, -/obj/item/storage/box/monkeycubes/syndicate, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) "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) "aJ" = ( /obj/structure/chair{ dir = 1 @@ -300,11 +172,6 @@ /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, @@ -313,7 +180,6 @@ /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" = ( @@ -340,16 +206,6 @@ /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, -/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) "aS" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/engine, @@ -365,20 +221,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /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) "aW" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/engine, @@ -411,16 +253,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) +"GB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/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 - }, +"Kf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) @@ -459,8 +302,8 @@ ah ah an aY -ah -aI +ar +aD aL au aa @@ -470,8 +313,8 @@ aa aD aW ah -ao -ah +GB +aH ao ah ac @@ -484,10 +327,10 @@ aa aD IP ah -aH ah aH ah +ah aD aB aO @@ -498,8 +341,8 @@ aa aD ah ah -Zh -ah +aM +aH aM ah am @@ -512,7 +355,7 @@ aa aD aW ah -aQ +Kf gS gS aQ diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_unlikely.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_unlikely.dmm index c84eec64e9ad..27d1bd0f3b36 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_unlikely.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_unlikely.dmm @@ -33,12 +33,9 @@ "i" = ( /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) -"n" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/testlab) "w" = ( /obj/structure/closet/emcloset, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/testlab) "A" = ( @@ -128,7 +125,7 @@ N "} (4,1,1) = {" d -n +B w A a diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_1.dmm index 4f032c8ac053..b0fe3041c9b7 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_1.dmm @@ -63,7 +63,7 @@ }, /obj/modular_map_connector, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "L" = ( /turf/closed/wall, /area/ruin/space/djstation) @@ -76,7 +76,7 @@ name = "Kitchen" }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "P" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_2.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_2.dmm index c7cdd09fbdd7..41e0fa8eb705 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_2.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_2.dmm @@ -49,7 +49,7 @@ /obj/effect/mapping_helpers/airlock/locked, /obj/structure/barricade/wooden, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "L" = ( /turf/closed/wall, /area/ruin/space/djstation) @@ -60,7 +60,7 @@ /obj/effect/mapping_helpers/airlock/locked, /obj/structure/barricade/wooden, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "S" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_4.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_4.dmm index 9b6e108bf6ec..fa6fdf97f409 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_4.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/kitchen_4.dmm @@ -116,7 +116,7 @@ name = "Kitchen" }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "V" = ( /obj/structure/table, /obj/item/reagent_containers/spray/cleaner{ @@ -140,7 +140,7 @@ }, /obj/modular_map_connector, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) (1,1,1) = {" e diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm index efdb18e781a6..3d8b5681d58b 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm @@ -24,7 +24,7 @@ name = "Rest Room" }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "u" = ( /obj/machinery/duct, /turf/open/floor/iron/grimy, @@ -51,7 +51,7 @@ }, /obj/modular_map_connector, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "F" = ( /obj/structure/curtain, /obj/machinery/shower/directional/south, diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_2.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_2.dmm index ef304f1d9303..ed849a2aa621 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_2.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_2.dmm @@ -21,7 +21,7 @@ name = "Rest Room" }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "v" = ( /obj/structure/bed/maint, /turf/open/floor/iron/dark/textured, @@ -32,7 +32,7 @@ }, /obj/modular_map_connector, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "J" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm index 9102b5e7acc6..c85247898122 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm @@ -56,7 +56,7 @@ name = "Rest Room" }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "s" = ( /obj/machinery/shower/directional/east, /turf/open/floor/iron/freezer, @@ -91,7 +91,7 @@ }, /obj/modular_map_connector, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "C" = ( /obj/machinery/duct, /obj/machinery/light/directional/south, diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm index 52ec466ae862..0a3ef02eab42 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm @@ -29,7 +29,7 @@ /obj/effect/mapping_helpers/airlock/locked, /obj/structure/barricade/wooden, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "q" = ( /obj/structure/girder, /obj/effect/mapping_helpers/burnt_floor, @@ -50,7 +50,7 @@ "C" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "E" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/plating/airless, @@ -72,10 +72,6 @@ /obj/effect/mapping_helpers/airlock/locked, /obj/structure/barricade/wooden, /turf/template_noop, -/area/template_noop) -"U" = ( -/obj/structure/lattice, -/turf/template_noop, /area/space/nearstation) "W" = ( /obj/structure/lattice, @@ -85,7 +81,7 @@ pixel_y = -1 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Y" = ( /obj/structure/lattice, /obj/effect/spawner/random/structure/grille, @@ -126,9 +122,9 @@ a "} (3,1,1) = {" a -U -U -U +C +C +C J x g @@ -139,12 +135,12 @@ W (4,1,1) = {" a a -U +C a -U +C a -U -U +C +C q a "} @@ -153,10 +149,10 @@ a a a a -U +C a a -U +C J a "} @@ -165,7 +161,7 @@ a a a a -U +C a a M diff --git a/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm b/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm index ebe9895b5dd2..e3f1697c0427 100644 --- a/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm +++ b/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm @@ -8,7 +8,7 @@ "c" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "d" = ( /obj/structure/frame/computer, /turf/open/floor/plating/airless, diff --git a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm index 136697eacc11..00dec1bb707a 100644 --- a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm +++ b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm @@ -66,7 +66,7 @@ "aK" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aL" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -81,7 +81,7 @@ "aQ" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aT" = ( /obj/structure/rack, /obj/item/clothing/suit/space/eva, @@ -211,7 +211,7 @@ "bK" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating/airless, -/area/template_noop) +/area/space/nearstation) "bN" = ( /obj/structure/grille/broken, /obj/item/stack/cable_coil/cut, @@ -227,14 +227,14 @@ "bP" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bR" = ( /obj/structure/disposalpipe/trunk{ dir = 1 }, /obj/structure/disposaloutlet, /turf/open/floor/plating/airless, -/area/template_noop) +/area/space/nearstation) "bT" = ( /obj/structure/grille, /obj/item/shard{ @@ -249,7 +249,7 @@ "bW" = ( /obj/item/shard, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bX" = ( /turf/open/floor/plating/airless, /area/ruin/space/has_grav/abandonedzoo) @@ -319,7 +319,7 @@ "ly" = ( /obj/machinery/power/shieldwallgen/unlocked, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "nI" = ( /obj/structure/alien/resin/wall, /obj/machinery/light/floor/broken, diff --git a/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm b/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm index 4108db225969..f877e7c8ae37 100644 --- a/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm +++ b/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm @@ -756,7 +756,7 @@ pixel_x = -6; pixel_y = 4 }, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = 7; pixel_y = 9 }, @@ -767,9 +767,7 @@ /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/allamericandiner) "HF" = ( -/obj/structure/noticeboard/directional/north{ - dir = 2 - }, +/obj/structure/noticeboard/directional/north, /obj/machinery/deepfryer, /obj/effect/decal/cleanable/dirt, /obj/item/paper/fluff/ruins/allamericandiner, diff --git a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm index 171775eca42e..17fe1864a16c 100644 --- a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm @@ -545,7 +545,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/computer/rdconsole{ +/obj/machinery/computer/rdconsole/unlocked{ dir = 4 }, /obj/effect/decal/cleanable/dirt, @@ -682,7 +682,7 @@ /turf/open/floor/iron/white, /area/misc/anomaly_research) "sX" = ( -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/effect/spawner/random/environmentally_safe_anomaly/bioscramblerless, /obj/item/reagent_containers/cup/bottle/wittel, /obj/effect/spawner/random/trash/grime, @@ -1807,7 +1807,7 @@ /turf/closed/mineral/snowmountain/cavern, /area/misc/anomaly_research) "Yo" = ( -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/effect/spawner/random/trash/garbage, /obj/effect/spawner/random/trash/mopbucket, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm index 03a29e782d14..38437408106f 100644 --- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm +++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm @@ -218,7 +218,7 @@ "aY" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aZ" = ( /turf/closed/wall, /area/ruin/space/has_grav/derelictoutpost) diff --git a/_maps/RandomRuins/SpaceRuins/bus.dmm b/_maps/RandomRuins/SpaceRuins/bus.dmm index 4a77be7c7d54..177654f63add 100644 --- a/_maps/RandomRuins/SpaceRuins/bus.dmm +++ b/_maps/RandomRuins/SpaceRuins/bus.dmm @@ -8,7 +8,7 @@ "ac" = ( /obj/item/trash/sosjerky, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "am" = ( /obj/structure/fluff/bus/passable/seat, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index 9912d559703c..12b94e1b65b8 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -5,32 +5,32 @@ "ab" = ( /obj/structure/girder/displaced, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ac" = ( /obj/item/stack/sheet/mineral/plastitanium, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ad" = ( /obj/item/wallframe/camera, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "af" = ( /obj/structure/lattice/catwalk, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ag" = ( /obj/structure/lattice/catwalk, /obj/structure/closet/crate/secure/weapon, /obj/item/gun/energy/e_gun/mini, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ah" = ( /obj/structure/lattice/catwalk, /mob/living/basic/trooper/pirate/ranged/space{ environment_smash = 0 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aj" = ( /obj/docking_port/stationary{ dir = 2; @@ -42,15 +42,15 @@ width = 22 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ao" = ( /obj/item/stack/sheet/mineral/titanium, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aD" = ( /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bl" = ( /mob/living/basic/carp, /turf/template_noop, @@ -58,11 +58,11 @@ "br" = ( /obj/item/stack/sheet/iron, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bs" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, @@ -115,7 +115,7 @@ "dc" = ( /obj/item/shard, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "dr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -228,7 +228,7 @@ /obj/structure/lattice, /obj/structure/broken_flooring/plating/directional/south, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "fG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/frame/computer, @@ -248,11 +248,6 @@ }, /turf/open/floor/plating/airless, /area/shuttle/ruin/caravan/freighter2) -"hj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/airless, -/area/shuttle/ruin/caravan/freighter2) "iR" = ( /obj/effect/turf_decal/bot_white, /obj/effect/decal/cleanable/dirt, @@ -275,7 +270,7 @@ width = 15 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "kG" = ( /obj/docking_port/stationary{ dir = 4; @@ -287,7 +282,7 @@ width = 9 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "kU" = ( /obj/docking_port/stationary{ dir = 2; @@ -299,7 +294,7 @@ width = 27 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "kX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -311,7 +306,7 @@ /obj/structure/lattice, /obj/structure/broken_flooring/pile/directional/west, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "lC" = ( /turf/closed/mineral/random/high_chance, /area/ruin/space/has_grav) @@ -414,7 +409,6 @@ /turf/open/floor/plating/airless, /area/shuttle/ruin/caravan/freighter2) "oI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/airless, /area/shuttle/ruin/caravan/freighter2) @@ -471,7 +465,7 @@ "re" = ( /obj/structure/broken_flooring/singular/directional/east, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "rj" = ( /obj/effect/turf_decal/bot_white/right, /obj/machinery/power/apc/auto_name/directional/west, @@ -656,7 +650,7 @@ "As" = ( /obj/structure/broken_flooring/singular/directional/south, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "AA" = ( /obj/effect/turf_decal/box/white/corners{ dir = 8 @@ -680,7 +674,7 @@ "Bq" = ( /obj/structure/broken_flooring/pile/directional/east, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Bv" = ( /obj/structure/chair{ dir = 4 @@ -873,7 +867,7 @@ "Ku" = ( /obj/structure/broken_flooring/plating/directional/east, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "KC" = ( /obj/item/stack/cable_coil{ amount = 1 @@ -885,7 +879,7 @@ /obj/structure/lattice, /obj/structure/broken_flooring/plating/directional/east, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Lx" = ( /obj/structure/rack, /obj/item/tank/jetpack/carbondioxide, @@ -939,7 +933,9 @@ /turf/open/floor/iron/dark/airless, /area/shuttle/ruin/caravan/freighter3) "Nm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, /obj/effect/decal/cleanable/dirt, /mob/living/basic/trooper/pirate/ranged/space{ environment_smash = 0 @@ -1094,6 +1090,7 @@ /area/shuttle/ruin/caravan/freighter2) "Wb" = ( /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/iron/airless, /area/shuttle/ruin/caravan/freighter2) "WC" = ( @@ -3473,7 +3470,7 @@ aa bN iR Nm -hj +oI oI IZ Bz diff --git a/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm b/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm index b2d0e0076858..8f27318f8232 100644 --- a/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm +++ b/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm @@ -122,12 +122,9 @@ dir = 8 }, /obj/machinery/light/small/directional/north, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron/white, /area/ruin/space/has_grav/powered/ancient_shuttle) -"n" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall, -/area/ruin/space/has_grav/powered/ancient_shuttle) "o" = ( /obj/machinery/vending/snack/teal, /obj/effect/decal/cleanable/dirt, @@ -521,7 +518,7 @@ a (18,1,1) = {" a d -n +T A K T diff --git a/_maps/RandomRuins/SpaceRuins/clownplanet.dmm b/_maps/RandomRuins/SpaceRuins/clownplanet.dmm index fa0b50cc4435..67b7b1f74e89 100644 --- a/_maps/RandomRuins/SpaceRuins/clownplanet.dmm +++ b/_maps/RandomRuins/SpaceRuins/clownplanet.dmm @@ -30,8 +30,8 @@ /turf/open/floor/engine, /area/ruin/space/has_grav/powered/clownplanet) "ai" = ( -/obj/structure/sign/warning, -/turf/closed/wall/mineral/sandstone, +/obj/structure/sign/warning/directional/south, +/turf/open/floor/bronze, /area/ruin/space/has_grav/powered/clownplanet) "aj" = ( /turf/open/floor/grass{ @@ -118,7 +118,9 @@ /turf/open/floor/iron/bluespace, /area/ruin/space/has_grav/powered/clownplanet) "az" = ( -/obj/structure/signpost, +/obj/structure/signpost{ + teleports = 1 + }, /turf/open/floor/grass{ color = "#1eff00" }, @@ -613,8 +615,8 @@ aa (10,1,1) = {" ae ae -ac ai +af aM aE ak @@ -743,8 +745,8 @@ ae (15,1,1) = {" ae ae -ac ai +af aO aP aj diff --git a/_maps/RandomRuins/SpaceRuins/commsbuoy_nt.dmm b/_maps/RandomRuins/SpaceRuins/commsbuoy_nt.dmm index 43c2ff963264..956e8813e939 100644 --- a/_maps/RandomRuins/SpaceRuins/commsbuoy_nt.dmm +++ b/_maps/RandomRuins/SpaceRuins/commsbuoy_nt.dmm @@ -54,9 +54,7 @@ /turf/template_noop, /area/template_noop) "gw" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/mineral/titanium, /area/ruin/space/nt_commsbuoy) "hb" = ( @@ -141,17 +139,13 @@ /turf/open/floor/plating, /area/ruin/space/nt_commsbuoy) "jy" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, /obj/machinery/light/small/directional/south, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/mineral/titanium, /area/ruin/space/nt_commsbuoy) "jz" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/machinery/light/small/directional/north, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/mineral/titanium, /area/ruin/space/nt_commsbuoy) "kZ" = ( @@ -386,9 +380,6 @@ /turf/closed/wall/mineral/iron, /area/ruin/space/nt_commsbuoy) "FH" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/structure/rack, /obj/item/clothing/suit/space/syndicate/orange{ pixel_x = 6; @@ -398,6 +389,7 @@ pixel_x = 9; pixel_y = -5 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/mineral/titanium, /area/ruin/space/nt_commsbuoy) "FK" = ( @@ -406,9 +398,7 @@ /area/space/nearstation) "Gd" = ( /obj/structure/fluff/commsbuoy_processor, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/mineral/titanium/blue, /area/ruin/space/nt_commsbuoy) "Gq" = ( @@ -527,7 +517,7 @@ dir = 8 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Ws" = ( /obj/structure/marker_beacon/cerulean, /turf/open/floor/plating/reinforced/airless, diff --git a/_maps/RandomRuins/SpaceRuins/crashedship.dmm b/_maps/RandomRuins/SpaceRuins/crashedship.dmm index 60e8714e865a..13428e3432f3 100644 --- a/_maps/RandomRuins/SpaceRuins/crashedship.dmm +++ b/_maps/RandomRuins/SpaceRuins/crashedship.dmm @@ -256,7 +256,7 @@ "mb" = ( /obj/item/stack/ore/glass, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "mu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, @@ -633,7 +633,7 @@ "zg" = ( /obj/item/stack/tile/wood, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "zm" = ( /obj/structure/table/wood, /obj/effect/spawner/random/decoration, @@ -955,7 +955,7 @@ "ID" = ( /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "IG" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood/parquet, @@ -1028,11 +1028,11 @@ "KF" = ( /obj/item/stack/cable_coil/cut, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "KO" = ( /obj/item/light/tube/broken, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Ln" = ( /obj/effect/turf_decal/trimline/brown/filled/warning, /obj/effect/turf_decal/trimline/brown/line{ @@ -1094,7 +1094,7 @@ "MC" = ( /obj/effect/mob_spawn/corpse/human/laborer, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Nc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1309,7 +1309,7 @@ /obj/item/shard, /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Xy" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/effect/turf_decal/trimline/yellow/filled/line{ diff --git a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm index a2baaa8dc206..8900f33d7f8e 100644 --- a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm @@ -112,6 +112,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron/dark/diagonal, /area/ruin/space/has_grav/dangerous_research/dorms) "bu" = ( @@ -1654,7 +1655,7 @@ /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/purple, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "uP" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -1843,7 +1844,6 @@ /area/ruin/space/has_grav/dangerous_research) "xD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 8 }, @@ -1872,7 +1872,7 @@ "xZ" = ( /obj/structure/sign/poster/official/random/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 + dir = 1 }, /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark, @@ -1996,7 +1996,7 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 + dir = 4 }, /obj/effect/turf_decal/tile/neutral/half{ dir = 8 @@ -2018,7 +2018,7 @@ "zY" = ( /obj/structure/lattice/catwalk, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "zZ" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 4 @@ -2100,6 +2100,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/dark/diagonal, /area/ruin/space/has_grav/dangerous_research/dorms) "AQ" = ( @@ -2147,6 +2148,12 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/dorms) +"Bp" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/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/space/has_grav/dangerous_research/dorms) "Bq" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -2226,11 +2233,6 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/dorms) -"Cf" = ( -/obj/effect/turf_decal/tile/purple/diagonal_edge, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/diagonal, -/area/ruin/space/has_grav/dangerous_research) "Cl" = ( /turf/closed/wall, /area/ruin/space/has_grav/dangerous_research/maint) @@ -2411,7 +2413,7 @@ "Ey" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "EA" = ( /turf/open/floor/plating/rust, /area/ruin/space/has_grav/dangerous_research/lab) @@ -2452,7 +2454,6 @@ /area/ruin/space/has_grav/dangerous_research/dorms) "Fi" = ( /obj/structure/table/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/dorms) @@ -2578,6 +2579,7 @@ }, /obj/item/pen/red, /obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/dorms) "Go" = ( @@ -2793,6 +2795,7 @@ name = "Alternate Sciences Research Center" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/diagonal, /area/ruin/space/has_grav/dangerous_research) "KS" = ( @@ -2965,7 +2968,6 @@ }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/purple/diagonal_edge, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/diagonal, /area/ruin/space/has_grav/dangerous_research) "Ni" = ( @@ -3100,7 +3102,6 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/chair/office/light, /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, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/dorms) @@ -3117,6 +3118,7 @@ /obj/effect/turf_decal/tile/neutral/diagonal_edge, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/dark/diagonal, /area/ruin/space/has_grav/dangerous_research/dorms) "OM" = ( @@ -3189,6 +3191,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/dark/diagonal, /area/ruin/space/has_grav/dangerous_research/dorms) "PL" = ( @@ -3216,20 +3219,9 @@ /obj/structure/chair/office{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/dorms) -"Qa" = ( -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/dangerous_research/lab) "Qe" = ( /turf/closed/wall/r_wall/rust, /area/ruin/space/has_grav/dangerous_research/dorms) @@ -3353,12 +3345,6 @@ }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research) -"Rt" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron/dark/diagonal, -/area/ruin/space/has_grav/dangerous_research/dorms) "Rx" = ( /obj/structure/closet{ name = "Greyham's Locker" @@ -3503,6 +3489,7 @@ "Te" = ( /obj/effect/turf_decal/tile/purple/diagonal_edge, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/diagonal, /area/ruin/space/has_grav/dangerous_research) "TD" = ( @@ -3535,11 +3522,6 @@ /obj/effect/turf_decal/tile/neutral/half, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/lab) -"Uc" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/cable, -/turf/open/floor/iron/dark/diagonal, -/area/ruin/space/has_grav/dangerous_research/dorms) "Uk" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3729,12 +3711,6 @@ /obj/structure/cable, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/dangerous_research/lab) -"Xi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/cable, -/turf/open/floor/iron/dark/diagonal, -/area/ruin/space/has_grav/dangerous_research/dorms) "Xk" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -4248,7 +4224,7 @@ BN fg BN AK -Qa +BN zO rq jp @@ -4341,7 +4317,7 @@ ts ts qf OL -Rt +OW wb ts ts @@ -4383,7 +4359,7 @@ he tD hL bl -Uc +aD AT ts KS @@ -4425,7 +4401,7 @@ Rx ts xA AO -Rt +OW HF ts DX @@ -4467,10 +4443,10 @@ ts ts Zg PJ -Rt +OW Mb ts -Bm +Ny OC Fi PP @@ -4509,11 +4485,11 @@ Cs HQ OW nz -Xi +Lk nv ts Bm -Ny +Bp Gn xZ eQ @@ -4725,8 +4701,8 @@ Hq Hq RD Nc -tv -Cf +lp +wJ fO Bq Bq diff --git a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm index 9f560335da06..ced8c535a3fd 100644 --- a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm @@ -766,15 +766,9 @@ "eq" = ( /turf/closed/wall/mineral/iron, /area/ruin/space/has_grav/deepstorage/airlock) -"ev" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/deepstorage/armory) "ew" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 + dir = 1 }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/deepstorage/armory) @@ -1530,6 +1524,14 @@ /obj/effect/baseturf_helper/asteroid/airless, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) +"nh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/space/has_grav/deepstorage/hydroponics) "oo" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -2389,6 +2391,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/hydroponics) "MV" = ( @@ -4381,7 +4384,7 @@ db dt dt pq -ev +dt xY fb fo @@ -4425,8 +4428,8 @@ ag aQ vG bC -zf -sL +nh +bC Lg aQ wK diff --git a/_maps/RandomRuins/SpaceRuins/derelict2.dmm b/_maps/RandomRuins/SpaceRuins/derelict2.dmm index b6e80272c26e..0fbccff35d0a 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict2.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict2.dmm @@ -5,7 +5,7 @@ "b" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "c" = ( /obj/machinery/door/airlock/external/ruin, /turf/open/floor/plating, @@ -13,7 +13,7 @@ "d" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "e" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/west, @@ -40,7 +40,7 @@ "k" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "l" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/north, @@ -76,7 +76,7 @@ "p" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "q" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/iron, diff --git a/_maps/RandomRuins/SpaceRuins/derelict3.dmm b/_maps/RandomRuins/SpaceRuins/derelict3.dmm index cf362dc206aa..e0b8bcd95def 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict3.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict3.dmm @@ -11,7 +11,7 @@ "d" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) (1,1,1) = {" a diff --git a/_maps/RandomRuins/SpaceRuins/derelict6.dmm b/_maps/RandomRuins/SpaceRuins/derelict6.dmm index 5126f8ebac96..93c890866304 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict6.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict6.dmm @@ -6,20 +6,20 @@ /obj/structure/lattice, /obj/structure/broken_flooring/singular/directional/north, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ac" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ae" = ( /obj/item/stack/sheet/iron, /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "af" = ( /obj/structure/broken_flooring/pile/directional/west, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ag" = ( /turf/open/floor/iron/airless, /area/ruin/space/has_grav) @@ -33,7 +33,7 @@ "aj" = ( /obj/structure/broken_flooring/pile/directional/east, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ak" = ( /obj/item/stack/rods, /obj/effect/mapping_helpers/broken_floor, @@ -43,7 +43,7 @@ /obj/structure/broken_flooring/singular/directional/east, /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "am" = ( /obj/item/stack/rods, /turf/open/floor/plating/airless, @@ -87,7 +87,7 @@ "aA" = ( /obj/structure/broken_flooring/pile/directional/north, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aB" = ( /obj/item/stack/tile/iron/base, /obj/effect/mapping_helpers/broken_floor, @@ -203,12 +203,12 @@ /obj/structure/lattice, /obj/item/stack/sheet/iron, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aZ" = ( /obj/structure/lattice, /obj/item/shard, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ba" = ( /mob/living/basic/ghost, /turf/open/floor/iron/cafeteria/airless, @@ -266,7 +266,7 @@ "bo" = ( /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bp" = ( /obj/item/stack/sheet/iron, /obj/structure/girder, @@ -291,7 +291,7 @@ "bv" = ( /obj/structure/broken_flooring/pile/directional/south, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bw" = ( /obj/structure/lattice, /obj/structure/broken_flooring/plating/directional/north{ @@ -320,7 +320,7 @@ "bA" = ( /obj/structure/broken_flooring/singular/directional/south, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bC" = ( /obj/structure/lattice, /obj/structure/broken_flooring/corner/directional/north, @@ -343,7 +343,7 @@ "bG" = ( /obj/structure/broken_flooring/singular/directional/east, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bH" = ( /obj/structure/broken_flooring/plating/directional/south{ name = "broken plating" diff --git a/_maps/RandomRuins/SpaceRuins/derelict7.dmm b/_maps/RandomRuins/SpaceRuins/derelict7.dmm index e55afd60f982..49cd1a71613f 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict7.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict7.dmm @@ -69,7 +69,7 @@ /obj/item/stack/tile/iron/base, /obj/structure/disposalpipe/broken, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "gK" = ( /obj/structure/closet/cabinet, /obj/item/storage/pill_bottle/happy, @@ -79,12 +79,12 @@ "gX" = ( /obj/structure/girder/displaced, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "hf" = ( /obj/structure/lattice, /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "iB" = ( /obj/item/shard, /obj/effect/turf_decal/tile/yellow{ @@ -108,7 +108,7 @@ /obj/structure/lattice, /obj/item/stack/tile/iron/base, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "lU" = ( /obj/item/stack/tile/iron/base, /obj/effect/mapping_helpers/broken_floor, @@ -120,7 +120,7 @@ "or" = ( /obj/item/stack/tile/iron/base, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "oy" = ( /obj/structure/table_frame, /obj/effect/turf_decal/tile/yellow/opposingcorners{ @@ -132,7 +132,7 @@ /obj/structure/lattice, /obj/item/stack/sheet/iron, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "oX" = ( /obj/structure/door_assembly/door_assembly_med, /turf/open/floor/plating/airless, @@ -146,7 +146,7 @@ /obj/structure/lattice, /obj/structure/girder/displaced, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "pr" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating/airless, @@ -156,11 +156,8 @@ /turf/open/floor/plating/airless, /area/ruin/space/has_grav) "qi" = ( -/obj/structure/sign/directions/medical{ - dir = 4; - pixel_y = 26 - }, -/turf/open/floor/iron/airless, +/obj/structure/sign/directions/medical/directional/east, +/turf/closed/wall, /area/ruin/space/has_grav) "rt" = ( /obj/item/stack/rods, @@ -173,12 +170,12 @@ "tj" = ( /obj/item/shard, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "tk" = ( /obj/structure/lattice, /obj/machinery/light/broken/directional/north, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "tF" = ( /obj/structure/grille/broken, /obj/effect/decal/cleanable/glass, @@ -190,7 +187,7 @@ /obj/item/stack/tile/iron/base, /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "uB" = ( /obj/structure/disposalpipe/broken{ dir = 1 @@ -208,12 +205,12 @@ /obj/item/stack/tile/iron/base, /obj/item/stack/sheet/iron, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "wJ" = ( /obj/structure/lattice, /obj/item/shard, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "wT" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, @@ -277,11 +274,11 @@ /obj/structure/lattice, /obj/effect/spawner/random/structure/crate_abandoned, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "CT" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Di" = ( /obj/structure/frame/machine, /obj/item/circuitboard/machine/vendor, @@ -296,7 +293,7 @@ /obj/structure/lattice, /obj/item/vending_refill/assist, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "EE" = ( /obj/effect/spawner/random/trash/botanical_waste, /obj/effect/mapping_helpers/broken_floor, @@ -305,7 +302,7 @@ "Fv" = ( /obj/item/stack/sheet/iron, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "FQ" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/airless, @@ -324,11 +321,11 @@ /obj/structure/lattice, /obj/item/wallframe/apc, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "HO" = ( /obj/item/stack/tile/wood, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Il" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/public/glass, @@ -404,7 +401,7 @@ "NM" = ( /obj/effect/spawner/random/medical/surgery_tool, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "NN" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 1 @@ -418,7 +415,7 @@ "Pi" = ( /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Pn" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -430,17 +427,17 @@ /obj/structure/girder/displaced, /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Qk" = ( /obj/structure/lattice, /obj/item/stack/tile/wood, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Qw" = ( /obj/structure/lattice, /obj/structure/table_frame, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Qy" = ( /obj/item/wallframe/airalarm, /obj/structure/disposalpipe/segment{ @@ -499,7 +496,7 @@ /obj/structure/lattice, /obj/item/light/tube/broken, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Wr" = ( /obj/structure/door_assembly/door_assembly_mai, /obj/effect/mapping_helpers/broken_floor, @@ -519,7 +516,7 @@ /obj/item/wallframe/intercom, /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) (1,1,1) = {" DY @@ -614,7 +611,7 @@ dV (7,1,1) = {" rN eP -eP +qi AY JI IE @@ -630,7 +627,7 @@ IR eP ea eP -qi +nf fc Nw eP diff --git a/_maps/RandomRuins/SpaceRuins/derelict8.dmm b/_maps/RandomRuins/SpaceRuins/derelict8.dmm index 41b53c9b8166..f91b7aafb310 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict8.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict8.dmm @@ -3,7 +3,7 @@ /obj/item/stack/tile/iron/base, /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ck" = ( /obj/effect/spawner/random/structure/girder{ spawn_loot_chance = 80 @@ -22,7 +22,7 @@ /obj/structure/lattice, /obj/item/stack/tile/iron/base, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "dS" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/light/broken/directional/south, @@ -32,12 +32,12 @@ "es" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "eu" = ( /obj/structure/lattice, /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "hs" = ( /obj/effect/spawner/random/trash/bin, /obj/effect/decal/cleanable/dirt, @@ -119,7 +119,7 @@ /obj/structure/lattice, /obj/effect/spawner/random/trash/food_packaging, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "yf" = ( /obj/structure/table, /obj/item/food/deadmouse{ @@ -136,11 +136,11 @@ /obj/item/stack/tile/iron/base, /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "zh" = ( /obj/item/stack/tile/iron/base, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "zt" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, @@ -155,7 +155,7 @@ "zK" = ( /obj/item/shard, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "BD" = ( /obj/structure/table, /obj/item/gps/spaceruin{ @@ -176,7 +176,7 @@ /obj/structure/lattice, /obj/structure/girder/displaced, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "DQ" = ( /obj/effect/decal/cleanable/glass, /obj/structure/grille, @@ -242,12 +242,12 @@ "Of" = ( /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "OD" = ( /obj/structure/lattice, /obj/item/stack/cable_coil/cut, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "OM" = ( /obj/effect/spawner/random/bureaucracy/paper, /obj/structure/table, diff --git a/_maps/RandomRuins/SpaceRuins/derelict_construction.dmm b/_maps/RandomRuins/SpaceRuins/derelict_construction.dmm index c6825c841427..bc3c45fd2d9f 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict_construction.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict_construction.dmm @@ -261,12 +261,12 @@ "DU" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "DY" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/burgundy, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "DZ" = ( /obj/structure/frame, /turf/open/misc/asteroid, @@ -346,10 +346,6 @@ /obj/structure/door_assembly/door_assembly_sec, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictconstruction) -"LL" = ( -/obj/structure/lattice, -/turf/template_noop, -/area/space/nearstation) "Md" = ( /turf/open/floor/plating/foam, /area/ruin/space/has_grav/derelictconstruction) @@ -545,9 +541,9 @@ qM qM qM uw -LL +DU qM -LL +DU qM eu qM @@ -574,10 +570,10 @@ qM qM qM uw -LL -LL +DU +DU fa -LL +DU uw Ik bY @@ -603,9 +599,9 @@ qM qM qM Ax -LL +DU qM -LL +DU qM Ax Vq @@ -634,8 +630,8 @@ qM Wj Sw Sw -LL -LL +DU +DU Ax Md ao @@ -663,7 +659,7 @@ qM uw eu qM -LL +DU Sw Ax gi @@ -985,10 +981,10 @@ qR Za qR qR -LL -LL -LL -LL +DU +DU +DU +DU Ax bY bY diff --git a/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm b/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm index d62b5885ef62..b3cd97c716b9 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm @@ -95,7 +95,7 @@ dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/layer4{ - dir = 4 + dir = 1 }, /obj/structure/cable, /turf/open/floor/pod/light, @@ -283,7 +283,6 @@ /obj/effect/decal/cleanable/blood/footprints{ 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/tgmcemblem{ @@ -410,7 +409,7 @@ "mC" = ( /obj/item/stack/tile/iron/smooth_corner, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "na" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/computer/terminal/sulaco/map, @@ -427,7 +426,7 @@ /obj/structure/lattice, /obj/item/stack/tile/iron/smooth_half, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "nG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/tracks/xeno{ @@ -606,7 +605,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/layer4{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/carpet, /area/ruin/space/has_grav/derelictsulaco) "uk" = ( @@ -968,6 +966,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/floor/broken, +/obj/structure/cable, /turf/open/floor/carpet, /area/ruin/space/has_grav/derelictsulaco) "GL" = ( @@ -1127,7 +1126,7 @@ "KI" = ( /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "KS" = ( /obj/machinery/door/window/brigdoor/left/directional/east, /obj/machinery/keycard_auth/wall_mounted/directional/north, @@ -1234,7 +1233,7 @@ "Ne" = ( /obj/item/stack/tile/iron/smooth_half, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Ng" = ( /obj/machinery/camera/directional/south{ network = list() @@ -1311,7 +1310,7 @@ /obj/structure/lattice, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "PZ" = ( /obj/structure/table/reinforced, /obj/item/storage/box/ids{ @@ -1375,7 +1374,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Sj" = ( /obj/structure/alien/weeds, /obj/structure/bed/nest, @@ -1516,7 +1515,7 @@ /obj/item/stack/tile/iron/smooth_half, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "VO" = ( /obj/structure/alien/weeds, /obj/structure/barricade/sandbags, @@ -1565,7 +1564,7 @@ anchored = 1 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "WQ" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/red/fourcorners, @@ -1583,7 +1582,7 @@ /obj/structure/lattice, /obj/item/stack/tile/iron/smooth_corner, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "XC" = ( /obj/structure/alien/weeds, /obj/machinery/atmospherics/components/unary/vent_pump/layer4{ @@ -1671,7 +1670,7 @@ "ZZ" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) (1,1,1) = {" hi @@ -2537,7 +2536,7 @@ VO Op OQ Ng -sr +VT lf hi hi diff --git a/_maps/RandomRuins/SpaceRuins/dj_station.dmm b/_maps/RandomRuins/SpaceRuins/dj_station.dmm index 89aa0534e1bb..a3ef3d4d6545 100644 --- a/_maps/RandomRuins/SpaceRuins/dj_station.dmm +++ b/_maps/RandomRuins/SpaceRuins/dj_station.dmm @@ -50,7 +50,7 @@ key = "radioroom" }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "u" = ( /obj/machinery/telecomms/relay/preset/telecomms, /turf/open/floor/plating, @@ -143,7 +143,7 @@ key = "solars" }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "V" = ( /obj/structure/sign/warning/vacuum/external/directional/south, /obj/effect/spawner/random/maintenance, diff --git a/_maps/RandomRuins/SpaceRuins/emptyshell.dmm b/_maps/RandomRuins/SpaceRuins/emptyshell.dmm index b0c5d4cf2601..5950409a498f 100644 --- a/_maps/RandomRuins/SpaceRuins/emptyshell.dmm +++ b/_maps/RandomRuins/SpaceRuins/emptyshell.dmm @@ -5,7 +5,7 @@ "b" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "c" = ( /turf/closed/wall/r_wall, /area/ruin/space/has_grav) diff --git a/_maps/RandomRuins/SpaceRuins/fasttravel.dmm b/_maps/RandomRuins/SpaceRuins/fasttravel.dmm index ca51f7525f5a..8e50bd9f8056 100644 --- a/_maps/RandomRuins/SpaceRuins/fasttravel.dmm +++ b/_maps/RandomRuins/SpaceRuins/fasttravel.dmm @@ -55,7 +55,7 @@ amount = 10 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "lq" = ( /obj/machinery/conveyor{ dir = 8; @@ -187,7 +187,7 @@ "CX" = ( /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "DZ" = ( /obj/machinery/power/rtg/advanced, /obj/structure/cable, diff --git a/_maps/RandomRuins/SpaceRuins/film_studio.dmm b/_maps/RandomRuins/SpaceRuins/film_studio.dmm index 595583e81405..c426b7d2bb02 100644 --- a/_maps/RandomRuins/SpaceRuins/film_studio.dmm +++ b/_maps/RandomRuins/SpaceRuins/film_studio.dmm @@ -31,7 +31,7 @@ "aG" = ( /obj/structure/lattice, /turf/open/space/basic, -/area/template_noop) +/area/space/nearstation) "aI" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/curtain/cloth/fancy, @@ -182,7 +182,7 @@ /area/ruin/space/has_grav/film_studio/director) "dd" = ( /turf/open/space/basic, -/area/template_noop) +/area/space/nearstation) "dg" = ( /turf/closed/wall, /area/ruin/space/has_grav/film_studio/starboard) @@ -348,6 +348,7 @@ name = "Cabin 3" }, /obj/effect/mapping_helpers/airlock/access/all/away, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/ruin/space/has_grav/film_studio/dorms) "gl" = ( @@ -2263,7 +2264,6 @@ /obj/structure/chair/comfy/black{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/ruin/space/has_grav/film_studio/director) "Np" = ( @@ -3577,13 +3577,13 @@ dd XK bA NB -NB +Zd xd NB -NB +Zd On pY -NB +Zd gW NB aO @@ -5202,7 +5202,7 @@ WC KP dg DP -Wy +zL zL ST Ym diff --git a/_maps/RandomRuins/SpaceRuins/forgottenship.dmm b/_maps/RandomRuins/SpaceRuins/forgottenship.dmm index 581c5b320611..1544232c33d2 100644 --- a/_maps/RandomRuins/SpaceRuins/forgottenship.dmm +++ b/_maps/RandomRuins/SpaceRuins/forgottenship.dmm @@ -54,8 +54,8 @@ /turf/open/floor/plastic, /area/ruin/space/has_grav/syndicate_forgotten_ship) "an" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall/r_wall/plastitanium/syndicate, +/obj/structure/sign/warning/vacuum/external/directional/south, +/turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/syndicate_forgotten_ship) "ao" = ( /turf/open/floor/carpet/royalblack, @@ -243,7 +243,7 @@ amount = 10 }, /obj/item/stack/cable_coil, -/obj/item/circuitboard/computer/rdconsole, +/obj/item/circuitboard/computer/rdconsole/unlocked, /obj/item/storage/box/stockparts/deluxe, /obj/item/storage/box/stockparts/deluxe, /obj/item/storage/box/beakers, @@ -442,7 +442,7 @@ /obj/structure/lattice/catwalk, /obj/structure/cable, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bO" = ( /obj/structure/bodycontainer/crematorium{ id = "fscremate" @@ -568,10 +568,6 @@ /obj/machinery/stasis, /turf/open/floor/plastic, /area/ruin/space/has_grav/syndicate_forgotten_ship) -"ck" = ( -/obj/structure/sign/departments/cargo, -/turf/closed/wall/r_wall/plastitanium/syndicate, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) "cm" = ( /obj/machinery/door/airlock/grunge{ name = "Syndicate Ship Airlock" @@ -815,12 +811,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/syndicate_forgotten_ship) -"cU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) "cW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ @@ -922,7 +912,7 @@ /area/ruin/space/has_grav/powered/syndicate_forgotten_vault) "dj" = ( /turf/closed/mineral/random/high_chance, -/area/template_noop) +/area/space/nearstation) "dl" = ( /obj/machinery/door/password/voice/sfc{ password = null @@ -1050,11 +1040,11 @@ /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") + req_access = list("syndicate"); + dir = 1 }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/syndicate_forgotten_ship) @@ -1107,6 +1097,7 @@ /obj/structure/closet/crate/secure/engineering{ req_access = list("syndicate") }, +/obj/structure/sign/departments/cargo/directional/north, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/syndicate_forgotten_cargopod) "Cy" = ( @@ -1182,6 +1173,10 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/syndicate_forgotten_ship) +"OW" = ( +/obj/structure/sign/warning/vacuum/external/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/syndicate_forgotten_ship) "VF" = ( /obj/structure/table/reinforced, /obj/machinery/button/door{ @@ -1921,7 +1916,7 @@ ao bx aH cD -cU +aw by al al @@ -1968,7 +1963,7 @@ ao bx aS cx -aS +aw by al al @@ -2015,7 +2010,7 @@ bn bZ tv cE -aS +aw bZ bY bE @@ -2479,8 +2474,8 @@ aa bZ al al -an -al +bZ +OW at ah cA @@ -2488,8 +2483,8 @@ cP ah ah aL -al an +bZ al bJ bZ @@ -2500,7 +2495,7 @@ aa aa aY aY -ck +bb yv bj bj diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm index 09fcc9957602..20bd5e3613c9 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm @@ -36,6 +36,7 @@ /obj/item/paper/crumpled, /obj/item/restraints/handcuffs/cable/zipties/used, /obj/effect/decal/cleanable/blood/gibs/old, +/obj/structure/sign/warning/directional/south, /turf/open/floor/plating/dumpsterair, /area/ruin/space/has_grav/garbagetruck/foodwaste) "bx" = ( @@ -537,10 +538,6 @@ /mob/living/basic/mouse, /turf/open/floor/plating/dumpsterair, /area/ruin/space/has_grav/garbagetruck/foodwaste) -"yi" = ( -/obj/structure/sign/warning, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/garbagetruck/foodwaste) "yv" = ( /obj/item/trash/can{ pixel_x = -8; @@ -844,10 +841,8 @@ /turf/open/floor/plating/dumpsterair, /area/ruin/space/has_grav/garbagetruck/foodwaste) "Ie" = ( -/obj/machinery/airalarm{ - pixel_y = 25 - }, /obj/structure/cable, +/obj/machinery/airalarm/directional/north, /turf/open/floor/catwalk_floor/iron, /area/ruin/space/has_grav/garbagetruck/foodwaste) "II" = ( @@ -883,6 +878,7 @@ /obj/item/fish/ratfish, /obj/structure/closet/crate/freezer, /obj/effect/spawner/random/medical/surgery_tool, +/obj/structure/sign/warning/directional/south, /turf/open/floor/plating/dumpsterair, /area/ruin/space/has_grav/garbagetruck/foodwaste) "KD" = ( @@ -1162,7 +1158,7 @@ "VL" = ( /obj/machinery/power/shuttle_engine/propulsion, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Xi" = ( /obj/item/food/badrecipe/moldy/bacteria, /obj/effect/decal/cleanable/food/egg_smudge, @@ -1295,7 +1291,7 @@ nS fV Vb bs -yi +Sa "} (4,1,1) = {" og @@ -1449,7 +1445,7 @@ uJ FL Nm JH -yi +Sa "} (11,1,1) = {" qM diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm index 4ac2217e945e..1abd0beb6d1c 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm @@ -134,10 +134,8 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/medicalwaste) "mZ" = ( -/obj/machinery/airalarm{ - pixel_y = 25 - }, /obj/structure/cable, +/obj/machinery/airalarm/directional/north, /turf/open/floor/catwalk_floor/iron, /area/ruin/space/has_grav/garbagetruck/medicalwaste) "nW" = ( @@ -192,6 +190,7 @@ /obj/item/poster/random_contraband, /obj/item/organ/tongue/zombie, /obj/structure/closet/crate/trashcart, +/obj/structure/sign/warning/directional/south, /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/medicalwaste) "rB" = ( @@ -616,6 +615,7 @@ brute_damage = 200; mob_type = /mob/living/carbon/human/species/lizard }, +/obj/structure/sign/warning/directional/south, /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/medicalwaste) "Ua" = ( @@ -651,7 +651,7 @@ "VL" = ( /obj/machinery/power/shuttle_engine/propulsion, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "VV" = ( /obj/effect/decal/cleanable/blood/gibs/robot_debris/up, /obj/structure/frame/computer, @@ -665,10 +665,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron, /area/ruin/space/has_grav/garbagetruck/medicalwaste) -"XC" = ( -/obj/structure/sign/warning, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/garbagetruck/medicalwaste) "XD" = ( /obj/structure/sinkframe, /obj/structure/broken_flooring/pile, @@ -760,7 +756,7 @@ AB py io TM -XC +MC "} (4,1,1) = {" iw @@ -914,7 +910,7 @@ Tp zH AU qX -XC +MC "} (11,1,1) = {" gh diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm index 568f2e9194ff..21136cc1089d 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm @@ -98,6 +98,7 @@ /obj/item/trash/syndi_cakes, /obj/effect/decal/cleanable/plastic, /obj/item/t_scanner, +/obj/structure/sign/warning/directional/south, /turf/open/floor/plating/dumpsterair, /area/ruin/space/has_grav/garbagetruck/squat) "gq" = ( @@ -237,10 +238,8 @@ /turf/open/floor/plating/dumpsterair, /area/ruin/space/has_grav/garbagetruck/squat) "lE" = ( -/obj/machinery/airalarm{ - pixel_y = 25 - }, /obj/structure/cable, +/obj/machinery/airalarm/directional/north, /turf/open/floor/catwalk_floor/iron, /area/ruin/space/has_grav/garbagetruck/squat) "lY" = ( @@ -786,10 +785,6 @@ /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/plating/dumpsterair, /area/ruin/space/has_grav/garbagetruck/squat) -"Pz" = ( -/obj/structure/sign/warning, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/garbagetruck/squat) "PE" = ( /obj/machinery/door/airlock/shuttle, /turf/open/floor/plating, @@ -886,7 +881,7 @@ "VL" = ( /obj/machinery/power/shuttle_engine/propulsion, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "WK" = ( /obj/effect/decal/cleanable/fuel_pool, /obj/item/clothing/shoes/workboots{ @@ -908,6 +903,7 @@ /obj/item/cigarette/carp, /obj/item/extinguisher/mini, /obj/effect/decal/cleanable/fuel_pool, +/obj/structure/sign/warning/directional/south, /turf/open/floor/plating/dumpsterair, /area/ruin/space/has_grav/garbagetruck/squat) "XS" = ( @@ -997,7 +993,7 @@ tu hm pC fF -Pz +mV "} (4,1,1) = {" Ye @@ -1151,7 +1147,7 @@ yF Nd Er Xv -Pz +mV "} (11,1,1) = {" JX diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm index 00f49ef1cf19..10c1a56fa260 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm @@ -75,6 +75,7 @@ /obj/item/clothing/shoes/kindle_kicks{ pixel_y = -10 }, +/obj/structure/sign/warning/directional/south, /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/toystore) "hH" = ( @@ -196,10 +197,6 @@ /obj/item/food/spidereggs, /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/toystore) -"rb" = ( -/obj/structure/sign/warning, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/garbagetruck/toystore) "rc" = ( /obj/effect/decal/cleanable/blood/oil, /obj/item/flashlight/flare/torch, @@ -314,10 +311,8 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/toystore) "wu" = ( -/obj/machinery/airalarm{ - pixel_y = 25 - }, /obj/structure/cable, +/obj/machinery/airalarm/directional/north, /turf/open/floor/catwalk_floor/iron, /area/ruin/space/has_grav/garbagetruck/toystore) "ww" = ( @@ -746,7 +741,7 @@ /obj/item/coin/plastic, /obj/structure/safe, /obj/structure/spider/stickyweb, -/obj/item/tank/jetpack/oxygen{ +/obj/item/tank/jetpack{ desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas. It's blue, and has a triangle chiselled into the paint." }, /obj/item/switchblade, @@ -798,6 +793,7 @@ }, /obj/structure/mop_bucket, /obj/item/broken_bottle, +/obj/structure/sign/warning/directional/south, /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/toystore) "UD" = ( @@ -811,7 +807,7 @@ "VL" = ( /obj/machinery/power/shuttle_engine/propulsion, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Wl" = ( /obj/structure/plasticflaps/opaque, /turf/open/floor/plating, @@ -953,7 +949,7 @@ xC Ix dq TO -rb +Yr "} (4,1,1) = {" yP @@ -1107,7 +1103,7 @@ ld Hy Rl hD -rb +Yr "} (11,1,1) = {" Zi diff --git a/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm b/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm index 03a5efc398f5..075260585625 100644 --- a/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm +++ b/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm @@ -25,7 +25,8 @@ /obj/machinery/button/door/invisible_tripwire{ id = "donk_vault_lasertrap"; suicide_pact = 1; - suicide_pact_id = "donk_vault_lasertrap" + suicide_pact_id = "donk_vault_lasertrap"; + dir = 1 }, /turf/open/floor/wood, /area/ruin/space/has_grav/hauntedtradingpost/office) @@ -78,7 +79,7 @@ /obj/structure/grille, /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bd" = ( /obj/structure/table/wood, /obj/structure/cable/layer1, @@ -357,7 +358,8 @@ suicide_pact = 1; suicide_pact_id = "donk_office_trap_shutters"; id = "donk_office_trap_shutters"; - sync_doors = 0 + sync_doors = 0; + dir = 4 }, /turf/open/floor/wood/large, /area/ruin/space/has_grav/hauntedtradingpost/office) @@ -514,7 +516,8 @@ suicide_pact = 1; suicide_pact_id = "donk_office_trap_shutters"; id = "donk_office_trap_shutters"; - sync_doors = 0 + sync_doors = 0; + dir = 4 }, /turf/open/floor/wood/large, /area/ruin/space/has_grav/hauntedtradingpost/office) @@ -581,11 +584,9 @@ }, /obj/effect/decal/cleanable/dirt/dust, /obj/structure/sink/directional/south, -/obj/machinery/button/door{ - pixel_y = 22; - pixel_x = -12; - id = "donk_market"; - name = "shutter button" +/obj/machinery/button/door/directional/north{ + pixel_x = 10; + id = "donk_market" }, /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hauntedtradingpost/public) @@ -837,6 +838,9 @@ /obj/structure/curtain/cloth/fancy, /turf/open/floor/carpet/donk, /area/ruin/space/has_grav/hauntedtradingpost/public) +"ht" = ( +/turf/closed/wall/mineral/plastitanium, +/area/ruin/space/has_grav/hauntedtradingpost/aicore) "hw" = ( /obj/effect/mapping_helpers/airalarm/syndicate_access, /obj/machinery/airalarm/directional/south, @@ -879,7 +883,6 @@ }, /obj/item/coin/gold, /obj/item/vending_refill/donksnackvendor, -/obj/item/circuitboard/machine/vending/donksnackvendor, /turf/open/floor/catwalk_floor/iron_dark, /area/ruin/space/has_grav/hauntedtradingpost/public) "hL" = ( @@ -915,21 +918,21 @@ /turf/open/floor/carpet/orange/airless, /area/ruin/space/has_grav/hauntedtradingpost/public/corridor) "ia" = ( -/obj/structure/safe/floor, -/obj/item/fishing_hook/shiny{ - desc = "A fancy fishing hook made out of gold."; - name = "fancy gold fishing hook" - }, -/obj/item/food/bait/natural, /obj/structure/cable/layer1, /obj/effect/decal/cleanable/dirt, -/obj/item/stack/spacecash/c1000, -/obj/item/stack/spacecash/c1000, /obj/machinery/button/door/invisible_tripwire{ id = "donk_vault_lasertrap"; suicide_pact = 1; suicide_pact_id = "donk_vault_lasertrap" }, +/obj/item/food/bait/natural, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c1000, +/obj/item/fishing_hook/shiny{ + desc = "A fancy fishing hook made out of gold."; + name = "fancy gold fishing hook" + }, +/obj/structure/safe/floor, /turf/open/floor/catwalk_floor/iron_dark, /area/ruin/space/has_grav/hauntedtradingpost/office) "ic" = ( @@ -1020,7 +1023,8 @@ id = "donk_office_entrance_trap_gamma"; donk_ai_slave = 1; multiuse = 1; - resets_self = 1 + resets_self = 1; + dir = 1 }, /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hauntedtradingpost/office) @@ -1152,7 +1156,8 @@ suicide_pact = 1; suicide_pact_id = "donk_office_trap_shutters"; id = "donk_office_trap_shutters"; - sync_doors = 0 + sync_doors = 0; + dir = 4 }, /turf/open/floor/wood/large, /area/ruin/space/has_grav/hauntedtradingpost/office) @@ -1241,7 +1246,7 @@ /obj/structure/lattice, /obj/structure/grille, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "kx" = ( /mob/living/basic/bot/dedbot{ bot_mode_flags = 29 @@ -1426,12 +1431,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hauntedtradingpost/public/corridor) -"mh" = ( -/obj/item/circuitboard/machine/vendatray{ - pixel_y = 15 - }, -/turf/open/floor/carpet/orange, -/area/ruin/space/has_grav/hauntedtradingpost/public) "mn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/airalarm/directional/south, @@ -1807,9 +1806,7 @@ /area/ruin/space/has_grav/hauntedtradingpost/office) "pG" = ( /obj/structure/lattice/catwalk, -/obj/effect/spawner/structure/electrified_grille{ - spawn_list = list(/obj/structure/grille,/obj/structure/cable/layer1) - }, +/obj/effect/spawner/structure/electrified_grille/layer1, /turf/template_noop, /area/ruin/space/has_grav/hauntedtradingpost/office) "pN" = ( @@ -1943,7 +1940,7 @@ /turf/template_noop, /area/template_noop) "qY" = ( -/obj/item/tank/jetpack/oxygen/security{ +/obj/item/tank/jetpack/security{ name = "red jetpack (oxygen)" }, /obj/item/tank/internals/oxygen/red, @@ -2105,7 +2102,7 @@ /obj/structure/table/reinforced/plastitaniumglass, /obj/effect/spawner/random/exotic/technology, /obj/effect/mapping_helpers/apc/syndicate_access, -/obj/item/gun/energy/laser/carbine/cybersun, +/obj/item/gun/energy/laser/cybersun, /obj/effect/mapping_helpers/apc/full_charge, /obj/machinery/power/apc/auto_name/directional/south{ cable_layer = 1 @@ -2151,15 +2148,12 @@ /obj/structure/cable/layer1, /obj/structure/table/reinforced/plastitaniumglass, /obj/machinery/cell_charger, -/obj/machinery/button/door{ - pixel_y = 23; - pixel_x = 10; - id = "donk_office_peek"; - name = "shutter button" - }, /obj/item/stock_parts/power_store/cell/bluespace{ pixel_y = 2 }, +/obj/machinery/button/door/directional/north{ + id = "donk_office_peek" + }, /turf/open/floor/catwalk_floor/iron_dark, /area/ruin/space/has_grav/hauntedtradingpost/aicore) "sD" = ( @@ -2882,7 +2876,7 @@ /obj/effect/spawner/random/structure/grille, /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "yU" = ( /obj/item/rack_parts{ pixel_y = 8; @@ -2990,17 +2984,11 @@ "zQ" = ( /mob/living/basic/viscerator, /obj/effect/turf_decal/bot_red, -/obj/machinery/button/door{ - pixel_y = 23; - pixel_x = 8; - normaldoorcontrol = 1; - specialfunctions = 4; - id = "donk_aicore_door_bolts"; - name = "Door Bolt Button"; - skin = "-warning"; - silicon_access_disabled = 1 - }, /obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/button/door/directional/north{ + id = "donk_aicore_door_bolts" + }, +/obj/structure/sign/warning/directional/west, /turf/open/floor/circuit/red/off, /area/ruin/space/has_grav/hauntedtradingpost/aicore) "Ab" = ( @@ -3046,9 +3034,7 @@ /area/ruin/space/has_grav/hauntedtradingpost/employees/corridor) "At" = ( /obj/structure/lattice/catwalk, -/obj/effect/spawner/structure/electrified_grille{ - spawn_list = list(/obj/structure/grille,/obj/structure/cable/layer1) - }, +/obj/effect/spawner/structure/electrified_grille/layer1, /turf/template_noop, /area/ruin/space/has_grav/hauntedtradingpost/employees/corridor) "Au" = ( @@ -3142,7 +3128,7 @@ /obj/structure/lattice, /obj/effect/spawner/random/structure/grille, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Bj" = ( /obj/structure/rack, /obj/effect/spawner/random/medical/minor_healing, @@ -3283,7 +3269,8 @@ id = "donk_office_entrance_trap_alpha"; resets_self = 1; donk_ai_slave = 1; - multiuse = 1 + multiuse = 1; + dir = 1 }, /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hauntedtradingpost/office) @@ -3412,9 +3399,7 @@ id = "Donk_Trash_Chute" }, /obj/machinery/light/small/dim/directional/west, -/obj/machinery/button/door{ - pixel_y = 10; - pixel_x = -23; +/obj/machinery/button/door/directional/west{ id = "donk_waste" }, /turf/open/floor/plating, @@ -3460,9 +3445,7 @@ /area/ruin/space/has_grav/hauntedtradingpost/employees) "EC" = ( /obj/structure/lattice/catwalk, -/obj/effect/spawner/structure/electrified_grille{ - spawn_list = list(/obj/structure/grille,/obj/structure/cable/layer1) - }, +/obj/effect/spawner/structure/electrified_grille/layer1, /turf/template_noop, /area/ruin/space/has_grav/hauntedtradingpost/employees/workstation) "EK" = ( @@ -3645,7 +3628,6 @@ /turf/open/floor/carpet/donk, /area/ruin/space/has_grav/hauntedtradingpost/office) "Ga" = ( -/obj/effect/spawner/random/entertainment/arcade, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -3654,8 +3636,10 @@ }, /obj/machinery/button/door/invisible_tripwire{ id = "donk_refuel_window"; - donk_ai_slave = 1 + donk_ai_slave = 1; + dir = 1 }, +/obj/effect/spawner/random/entertainment/arcade, /turf/open/floor/catwalk_floor/iron_smooth, /area/ruin/space/has_grav/hauntedtradingpost/public/corridor) "Ge" = ( @@ -3974,15 +3958,8 @@ /area/ruin/space/has_grav/hauntedtradingpost/aicore) "Im" = ( /obj/effect/turf_decal/stripes/red/line, -/obj/machinery/button/door{ - pixel_y = -23; - pixel_x = -8; - normaldoorcontrol = 1; - specialfunctions = 4; - id = "donk_aicore_door_bolts"; - name = "Door Bolt Button"; - skin = "-warning"; - silicon_access_disabled = 1 +/obj/machinery/button/door/directional/south{ + id = "donk_aicore_door_bolts" }, /turf/open/floor/circuit/red/off, /area/ruin/space/has_grav/hauntedtradingpost/aicore) @@ -4072,7 +4049,8 @@ suicide_pact = 1; suicide_pact_id = "donk_office_trap_shutters"; id = "donk_office_trap_shutters"; - sync_doors = 0 + sync_doors = 0; + dir = 4 }, /turf/open/floor/wood/large, /area/ruin/space/has_grav/hauntedtradingpost/office) @@ -4095,6 +4073,12 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/hauntedtradingpost/maint) +"Ju" = ( +/mob/living/basic/viscerator, +/obj/effect/turf_decal/bot_red, +/obj/structure/sign/warning/directional/east, +/turf/open/floor/circuit/red/off, +/area/ruin/space/has_grav/hauntedtradingpost/aicore) "Jw" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/donk, @@ -4223,23 +4207,20 @@ /obj/machinery/light/small/directional/north, /obj/effect/mapping_helpers/airalarm/syndicate_access, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/button/door{ - pixel_y = 25; - pixel_x = 12; - id = "donk_toilet" - }, -/obj/machinery/button/door{ - pixel_y = 25; - pixel_x = -12; - id = "donk_toilet_window"; - name = "window shutter button" - }, /obj/machinery/airalarm/directional/south, /obj/effect/decal/cleanable/dirt, /obj/structure/toilet/secret{ secret_type = /obj/item/toy/plush/nukeplushie; dir = 4 }, +/obj/machinery/button/door/directional/north{ + pixel_x = -12; + id = "donk_toilet" + }, +/obj/machinery/button/door/directional/north{ + pixel_x = 12; + id = "donk_toilet_window" + }, /turf/open/floor/plating, /area/ruin/space/has_grav/hauntedtradingpost/maint/disposals) "KZ" = ( @@ -4345,10 +4326,6 @@ /turf/open/floor/wood, /area/ruin/space/has_grav/hauntedtradingpost/public/corridor) "LI" = ( -/obj/item/circuitboard/machine/vending/donksofttoyvendor{ - pixel_y = -2; - pixel_x = -6 - }, /obj/effect/decal/cleanable/glass, /turf/open/floor/carpet/donk, /area/ruin/space/has_grav/hauntedtradingpost/employees) @@ -4582,11 +4559,8 @@ /obj/item/stock_parts/capacitor/super{ pixel_y = 5 }, -/obj/machinery/button/door{ - pixel_y = 23; - pixel_x = -10; - id = "donk_corridor_peek"; - name = "shutter button" +/obj/machinery/button/door/directional/north{ + id = "donk_corridor_peek" }, /turf/open/floor/catwalk_floor/iron_dark, /area/ruin/space/has_grav/hauntedtradingpost/aicore) @@ -4610,7 +4584,7 @@ "NS" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "NY" = ( /obj/structure/cable/layer1, /obj/machinery/vending/coffee{ @@ -4798,7 +4772,8 @@ id = "donk_office_entrance_trap_beta"; resets_self = 1; donk_ai_slave = 1; - multiuse = 1 + multiuse = 1; + dir = 1 }, /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hauntedtradingpost/office) @@ -4884,8 +4859,7 @@ /turf/open/floor/catwalk_floor/iron_dark, /area/ruin/space/has_grav/hauntedtradingpost/maint) "QA" = ( -/obj/structure/sign/warning, -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/plating, /area/ruin/space/has_grav/hauntedtradingpost/aicore) "QF" = ( @@ -5040,7 +5014,7 @@ width = 35 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "RI" = ( /obj/structure/chair/sofa/left/brown{ dir = 1 @@ -5179,13 +5153,6 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/hauntedtradingpost/maint/toystorage) "SX" = ( -/obj/machinery/button/door{ - pixel_y = 24; - pixel_x = 9; - id = "donk_office_trap_shutters"; - name = "shutter button"; - sync_doors = 0 - }, /obj/machinery/button/door/selfdestructs{ normaldoorcontrol = 1; id = "donk_door_bolts"; @@ -5195,6 +5162,10 @@ desc = "A button for unbolting doors throughout the facility."; name = "door bolt override" }, +/obj/machinery/button/door/directional/north{ + id = "donk_office_trap_shutters"; + pixel_x = 10 + }, /turf/open/floor/wood/large, /area/ruin/space/has_grav/hauntedtradingpost/office) "SY" = ( @@ -5307,7 +5278,7 @@ name = "external vent" }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "TU" = ( /obj/structure/cable/layer1, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, @@ -5566,9 +5537,7 @@ /area/ruin/space/has_grav/hauntedtradingpost/public/corridor) "Wf" = ( /obj/structure/lattice/catwalk, -/obj/effect/spawner/structure/electrified_grille{ - spawn_list = list(/obj/structure/grille,/obj/structure/cable/layer1) - }, +/obj/effect/spawner/structure/electrified_grille/layer1, /turf/template_noop, /area/ruin/space/has_grav/hauntedtradingpost/office/meetingroom) "Wg" = ( @@ -6015,7 +5984,7 @@ /obj/structure/lattice, /obj/structure/grille/broken, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ZI" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -6695,7 +6664,7 @@ jk je Nw Ii -ve +ht QA lA nE @@ -6756,7 +6725,7 @@ tl Ht uZ eE -mh +Ip He TY RX @@ -6831,7 +6800,7 @@ BE yb Im MR -kl +Ju Gk iv PX @@ -6875,7 +6844,7 @@ pX je Nw AB -ve +MR QA kl nE diff --git a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm index 4d3ac05f1be2..7ddd26f84194 100644 --- a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm +++ b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm @@ -347,7 +347,7 @@ "bm" = ( /obj/structure/table, /obj/item/stamp/denied, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = 6; pixel_y = 6 }, @@ -876,7 +876,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/hellfactory) "ux" = ( -/obj/machinery/light/small/directional/west, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/ruin/space/has_grav/hellfactory) "uL" = ( diff --git a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm index 9565fa689c34..96b778786af6 100644 --- a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm +++ b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm @@ -35,7 +35,7 @@ "aB" = ( /obj/item/shard, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aV" = ( /obj/machinery/light/small/red/dim/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -84,7 +84,7 @@ /obj/item/ammo_casing/spent, /obj/item/ammo_casing/spent, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bD" = ( /obj/effect/decal/cleanable/blood/gibs{ icon_state = "gib3-old"; @@ -450,7 +450,7 @@ "fM" = ( /obj/structure/door_assembly/door_assembly_ext, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "fX" = ( /obj/structure/toilet{ dir = 4 @@ -463,7 +463,7 @@ "gG" = ( /obj/effect/spawner/random/trash/food_packaging, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "gW" = ( /obj/effect/turf_decal{ dir = 4 @@ -945,7 +945,7 @@ pixel_x = 15 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "qb" = ( /obj/effect/turf_decal{ dir = 8 @@ -1014,14 +1014,14 @@ "qF" = ( /obj/item/ammo_casing/spent, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "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/template_noop, -/area/template_noop) +/area/space/nearstation) "qR" = ( /obj/effect/decal/cleanable/blood/gibs/old, /obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, @@ -1103,7 +1103,7 @@ "rO" = ( /obj/structure/broken_flooring/pile/directional/south, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "so" = ( /obj/effect/mapping_helpers/broken_floor, /obj/item/broken_missile, @@ -1150,7 +1150,7 @@ "sT" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "sZ" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -1365,7 +1365,7 @@ amount = 25 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "wt" = ( /obj/effect/turf_decal{ icon_state = "warningline_white"; @@ -1448,7 +1448,7 @@ /obj/effect/spawner/random/trash, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/mineral/plastitanium/airless, -/area/template_noop) +/area/space/nearstation) "xo" = ( /obj/effect/decal/cleanable/glass, /obj/structure/cable, @@ -1651,11 +1651,11 @@ }, /obj/effect/decal/cleanable/glass, /turf/open/floor/plating/airless, -/area/template_noop) +/area/space/nearstation) "zU" = ( /obj/structure/broken_flooring/pile/directional/east, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "zV" = ( /obj/machinery/suit_storage_unit/open, /obj/effect/turf_decal{ @@ -1839,7 +1839,7 @@ "Eg" = ( /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Er" = ( /obj/effect/turf_decal{ icon_state = "arrows_red"; @@ -1879,7 +1879,7 @@ "EB" = ( /obj/structure/girder/displaced, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "EL" = ( /obj/effect/turf_decal{ icon_state = "warningline_white" @@ -2086,12 +2086,12 @@ "HD" = ( /obj/structure/broken_flooring/singular/directional/south, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "HP" = ( /obj/structure/broken_flooring/plating/directional/north, /obj/structure/broken_flooring/pile/directional/west, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Im" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/mineral/plastitanium, @@ -2325,7 +2325,7 @@ /obj/item/ammo_casing/spent, /obj/structure/alien/weeds, /turf/open/floor/mineral/plastitanium/airless, -/area/template_noop) +/area/space/nearstation) "Ln" = ( /obj/effect/decal/cleanable/glass, /obj/item/ammo_casing/spent, @@ -2518,7 +2518,7 @@ amount = 23 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Ou" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -2624,7 +2624,7 @@ /obj/item/ammo_casing/spent, /obj/item/ammo_casing/spent, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Qm" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -2649,7 +2649,7 @@ "QL" = ( /obj/structure/broken_flooring/singular/directional/east, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Ru" = ( /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, @@ -2657,7 +2657,7 @@ /obj/item/storage/box/bodybags, /obj/item/storage/box/bodybags, /obj/item/storage/box/bodybags, -/obj/item/tank/jetpack/oxygen, +/obj/item/tank/jetpack, /obj/item/storage/box/coffeepack, /obj/item/storage/box/coffeepack, /obj/item/storage/box/emptysandbags, @@ -2728,7 +2728,7 @@ "RY" = ( /obj/effect/spawner/random/trash, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Sr" = ( /obj/effect/turf_decal{ icon_state = "warningline_white"; @@ -2937,7 +2937,7 @@ "VR" = ( /obj/item/tank/internals/oxygen/empty, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "VU" = ( /obj/structure/cable, /obj/effect/decal/cleanable/vomit/old, @@ -3004,7 +3004,7 @@ amount = 50 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Xc" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, diff --git a/_maps/RandomRuins/SpaceRuins/interdyne.dmm b/_maps/RandomRuins/SpaceRuins/interdyne.dmm index ae2a3578e2fc..c053639750b6 100644 --- a/_maps/RandomRuins/SpaceRuins/interdyne.dmm +++ b/_maps/RandomRuins/SpaceRuins/interdyne.dmm @@ -8,12 +8,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"aI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "aY" = ( /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) @@ -54,6 +48,7 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/effect/gibspawner/generic, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) "cJ" = ( @@ -670,11 +665,6 @@ /obj/machinery/light/blacklight/directional/north, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) -"DA" = ( -/mob/living/basic/zombie, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "DH" = ( /turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/interdyne) @@ -995,6 +985,12 @@ /obj/structure/sink/directional/south, /turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/interdyne) +"OU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "OW" = ( /obj/machinery/power/smes/engineering{ input_available = 100000; @@ -1783,8 +1779,8 @@ fu eJ WU Zi -gV -vd +oO +OU xb Zi Rn @@ -1819,7 +1815,7 @@ Yi US NG In -SE +QD FF Zi Rn @@ -2161,7 +2157,7 @@ mp Zi fu Nb -DA +uy ga Zi Gk @@ -2196,7 +2192,7 @@ SC Zi ub cG -aI +OU QD Zi XS diff --git a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm index c1188e986636..cb069a04b11d 100644 --- a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm @@ -24,7 +24,6 @@ /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, @@ -53,7 +52,6 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) "by" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/item/multitool{ pixel_x = 8; pixel_y = 3 @@ -80,18 +78,10 @@ /turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) "ch" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/cerulean, /turf/template_noop, /area/ruin/space) -"cj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/small, -/area/ruin/space/has_grav/listeningstation) "cq" = ( /obj/effect/turf_decal/bot, /obj/item/weldingtool/largetank, @@ -123,7 +113,6 @@ /obj/structure/table, /obj/item/storage/medkit/regular, /obj/item/clothing/neck/stethoscope, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/small/directional/north, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 @@ -131,20 +120,23 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) "dv" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) -"dW" = ( +"dM" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/trash/cigbutt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) -"eR" = ( +"dW" = ( +/obj/structure/cable, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, +/turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) "eW" = ( /obj/structure/table, @@ -241,13 +233,9 @@ /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, +/obj/structure/sign/nanotrasen/directional/north, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/plating/airless, /area/ruin/space) "nG" = ( @@ -322,12 +310,6 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/listeningstation) -"tf" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/small, -/area/ruin/space/has_grav/listeningstation) "tl" = ( /obj/structure/marker_beacon/cerulean, /turf/open/floor/plating/airless, @@ -350,17 +332,16 @@ /area/ruin/space/has_grav/listeningstation) "vt" = ( /obj/structure/lattice/catwalk, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/structure/marker_beacon/cerulean, +/obj/structure/sign/nanotrasen/directional/west, /turf/template_noop, /area/ruin/space) "vC" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/spawner/random/trash/cigbutt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) "vI" = ( @@ -372,7 +353,6 @@ req_access = list("syndicate") }, /obj/item/paper/fluff/ruins/listeningstation/reports/september, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) @@ -421,6 +401,7 @@ "ym" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) "yx" = ( @@ -453,7 +434,6 @@ /area/ruin/space/has_grav/listeningstation) "zo" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) @@ -471,10 +451,8 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) "zV" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, /obj/structure/cable, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/plating/airless, /area/ruin/space) "zZ" = ( @@ -609,13 +587,9 @@ /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, +/obj/structure/sign/nanotrasen/directional/south, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/plating/airless, /area/ruin/space) "FV" = ( @@ -684,7 +658,7 @@ width = 9 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "KG" = ( /obj/structure/curtain, /obj/effect/decal/cleanable/dirt, @@ -704,7 +678,6 @@ /obj/structure/chair/sofa/right/brown{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/ruin/space/has_grav/listeningstation) "LU" = ( @@ -751,7 +724,6 @@ "Ni" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/south, /obj/structure/closet/secure_closet/freezer/empty/open, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/small, /area/ruin/space/has_grav/listeningstation) "NO" = ( @@ -786,7 +758,6 @@ "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) @@ -819,6 +790,7 @@ dir = 4 }, /obj/machinery/light/warm/directional/south, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/listeningstation) "Sx" = ( @@ -863,6 +835,8 @@ /obj/structure/chair/sofa/left/brown{ 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/ruin/space/has_grav/listeningstation) "Uh" = ( @@ -916,6 +890,9 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) +"We" = ( +/turf/open/floor/plating, +/area/ruin/space/has_grav/listeningstation) "WD" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -930,10 +907,8 @@ /area/ruin/space/has_grav/listeningstation) "WG" = ( /obj/structure/lattice/catwalk, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, /obj/structure/marker_beacon/cerulean, +/obj/structure/sign/nanotrasen/directional/south, /turf/template_noop, /area/ruin/space) "WW" = ( @@ -945,7 +920,6 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/iv_drip, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/space/has_grav/listeningstation) "Yf" = ( @@ -1320,9 +1294,9 @@ MS It ad by -cj -db -Sz +wm +ym +wk JB vI vI @@ -1342,9 +1316,9 @@ JB JB JB eW -eR -eR -cj +FV +FV +wm dv TO LR @@ -1367,12 +1341,12 @@ Dv WD rG Or -SB +We FV ca BX dW -Sz +We JB vI vI @@ -1392,9 +1366,9 @@ LU Mt nX Sx -vC +dM ym -tf +dW ym ym Ni diff --git a/_maps/RandomRuins/SpaceRuins/meatderelict.dmm b/_maps/RandomRuins/SpaceRuins/meatderelict.dmm index 2933e4723eb1..48ea0933387c 100644 --- a/_maps/RandomRuins/SpaceRuins/meatderelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/meatderelict.dmm @@ -87,6 +87,13 @@ /obj/structure/microscope, /turf/open/indestructible/white, /area/ruin/space/has_grav/powered/biooutpost) +"bV" = ( +/obj/structure/broken_flooring/corner/always_floorplane{ + dir = 4 + }, +/obj/structure/sign/warning/directional/west, +/turf/open/indestructible/meat, +/area/ruin/space/has_grav/powered/biooutpost) "ch" = ( /turf/open/indestructible/white{ icon_state = "showroomfloor" @@ -333,9 +340,11 @@ /turf/open/indestructible/meat, /area/ruin/space/has_grav/powered/biooutpost) "hR" = ( -/obj/structure/sign/warning, -/turf/closed/indestructible/reinforced, -/area/ruin/space/has_grav/powered/biooutpost/vault) +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/directional/east, +/turf/open/indestructible/white, +/area/ruin/space/has_grav/powered/biooutpost) "hW" = ( /obj/effect/turf_decal/siding/purple, /obj/effect/decal/cleanable/blood/splatter, @@ -1314,6 +1323,7 @@ dir = 5 }, /obj/structure/sign/warning/chem_diamond/directional/west, +/obj/structure/sign/warning/directional/south, /turf/open/indestructible/dark, /area/ruin/space/has_grav/powered/biooutpost) "za" = ( @@ -1388,8 +1398,12 @@ /turf/open/indestructible/dark, /area/ruin/space/has_grav/powered/biooutpost) "AT" = ( -/obj/structure/sign/warning, -/turf/closed/indestructible/riveted/plastinum/nodiagonal, +/obj/structure/puzzle_blockade{ + id = "md_armory" + }, +/obj/effect/turf_decal/stripes/full, +/obj/structure/sign/warning/directional/north, +/turf/open/indestructible/white, /area/ruin/space/has_grav/powered/biooutpost) "AV" = ( /obj/effect/turf_decal/stripes/full, @@ -1704,6 +1718,12 @@ /obj/machinery/light/small/broken/directional/south, /turf/open/indestructible/dark, /area/ruin/space/has_grav/powered/biooutpost) +"Gq" = ( +/obj/structure/sign/directions/security/directional/south{ + pixel_y = 0 + }, +/turf/closed/indestructible/riveted/plastinum/nodiagonal, +/area/ruin/space/has_grav/powered/biooutpost/vault) "GA" = ( /obj/effect/turf_decal/siding/purple{ dir = 8 @@ -2528,9 +2548,6 @@ /turf/open/indestructible/plating, /area/ruin/space/has_grav/powered/biooutpost) "XO" = ( -/obj/structure/sign/directions/security/directional/south{ - pixel_x = 32 - }, /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/structure/sign/poster/official/random/directional/east, /obj/effect/decal/cleanable/dirt, @@ -2984,7 +3001,7 @@ Jh AP DJ yU -AT +Jh vF ih hf @@ -3262,7 +3279,7 @@ Jh wX wM DJ -cp +hR XO Ju op @@ -3304,9 +3321,9 @@ UX UX EC xr -hR -UX +EC UX +Gq UX op Gd @@ -3560,8 +3577,8 @@ EN EN eP EC -hR -IK +EC +AT IK IK PQ @@ -3721,7 +3738,7 @@ Rb Sj EC Yc -hR +EC EC xr EC @@ -3763,7 +3780,7 @@ UD qV ij Nz -sJ +bV OM Vu NE diff --git a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm index 2591d4991e57..7ea38800f8e6 100644 --- a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm +++ b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm @@ -33,12 +33,12 @@ "hR" = ( /obj/item/shard/titanium, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "if" = ( /obj/structure/lattice, /obj/structure/mecha_wreckage/gygax, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "is" = ( /turf/template_noop, /area/template_noop) @@ -98,12 +98,12 @@ pixel_x = 12 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "lc" = ( /obj/structure/lattice, /obj/item/stack/sheet/iron, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "lB" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/blood, @@ -172,7 +172,7 @@ "wJ" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "xJ" = ( /obj/structure/chair/office{ dir = 1 @@ -268,7 +268,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Lk" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large/airless, @@ -298,7 +298,7 @@ "PG" = ( /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Qc" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ dir = 8 @@ -322,7 +322,7 @@ dir = 8 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Vl" = ( /obj/machinery/power/shuttle_engine/heater, /turf/open/floor/plating/airless, diff --git a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm index be9dfaaa1a7f..bac43576d133 100644 --- a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm @@ -5,7 +5,7 @@ "ab" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ac" = ( /turf/open/floor/plating/airless, /area/ruin/space/tcommsat_oldaisat) @@ -13,16 +13,16 @@ /obj/structure/lattice, /obj/structure/grille/broken, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ae" = ( /obj/structure/lattice, /obj/structure/grille, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "af" = ( /obj/structure/grille, /turf/open/floor/plating/airless, -/area/template_noop) +/area/space/nearstation) "ag" = ( /turf/closed/wall/r_wall, /area/ruin/space/tcommsat_oldaisat) @@ -33,7 +33,7 @@ "ai" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aj" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/plating/airless, @@ -78,7 +78,7 @@ /obj/structure/lattice, /obj/structure/window/reinforced/spawner/directional/east, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "au" = ( /obj/structure/cable, /turf/open/floor/plating/airless, @@ -96,7 +96,7 @@ /obj/structure/lattice, /obj/structure/window/reinforced/spawner/directional/west, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ay" = ( /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/iron/airless, @@ -160,7 +160,7 @@ "aL" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aM" = ( /obj/item/folder/yellow, /turf/open/floor/iron/airless, @@ -177,14 +177,14 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aP" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aQ" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/east, @@ -194,22 +194,19 @@ /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/west, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aS" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/north, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aT" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/template_noop, -/area/template_noop) -"aU" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall, -/area/ruin/space/tcommsat_oldaisat) +/area/space/nearstation) "aV" = ( /obj/machinery/light/small/directional/west, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/iron/airless, /area/ruin/space/tcommsat_oldaisat) "aW" = ( @@ -326,16 +323,16 @@ /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/north, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "br" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bs" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bt" = ( /obj/structure/table, /obj/item/gps/spaceruin, @@ -361,7 +358,7 @@ /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bz" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/item/shard{ @@ -400,7 +397,7 @@ /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bG" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/west, @@ -562,12 +559,12 @@ /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/south, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ck" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "cl" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -596,7 +593,7 @@ /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/south, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "cq" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/west, @@ -649,7 +646,7 @@ icon_state = "medium" }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "cz" = ( /obj/structure/lattice, /obj/item/stack/rods, @@ -657,7 +654,7 @@ icon_state = "medium" }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "cB" = ( /obj/effect/spawner/structure/window/hollow/reinforced, /turf/open/floor/plating, @@ -665,7 +662,7 @@ "cC" = ( /obj/structure/grille/broken, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "cD" = ( /obj/machinery/door/airlock/hatch, /turf/open/floor/iron, @@ -2354,7 +2351,7 @@ ag ag ag ag -aU +ag bf ag ag diff --git a/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm b/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm index 3fef3d7f7fe7..082f1341908d 100644 --- a/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm +++ b/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm @@ -206,7 +206,7 @@ "nv" = ( /obj/item/stack/sheet/mineral/plastitanium, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "nF" = ( /obj/item/radio/intercom/directional/south, /obj/effect/decal/cleanable/blood/old, @@ -268,7 +268,6 @@ "sL" = ( /obj/structure/table, /obj/effect/spawner/random/engineering/tool, -/obj/machinery/light/directional/north, /obj/item/stack/cable_coil, /turf/open/floor/mineral/plastitanium/red/airless, /area/ruin/space/unpowered) @@ -439,6 +438,7 @@ pixel_x = 8 }, /obj/machinery/status_display/evac/directional/north, +/obj/machinery/light/directional/north, /turf/open/floor/mineral/plastitanium/red/airless, /area/ruin/space/unpowered) "Da" = ( @@ -521,7 +521,7 @@ "Jd" = ( /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "JH" = ( /obj/structure/frame/machine, /turf/open/floor/circuit/red/airless, @@ -544,7 +544,7 @@ "KM" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Lz" = ( /obj/structure/table, /obj/item/tank/internals/emergency_oxygen/engi, @@ -562,11 +562,9 @@ /turf/open/floor/iron/dark/airless, /area/ruin/space/unpowered) "Mw" = ( -/obj/machinery/status_display/ai{ - pixel_x = 32 - }, /obj/machinery/light/directional/east, /obj/effect/decal/cleanable/blood/old, +/obj/machinery/status_display/ai/directional/east, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/unpowered) "MB" = ( @@ -646,7 +644,7 @@ "Tc" = ( /obj/item/stack/rods/two, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Tx" = ( /obj/machinery/door/window/brigdoor/right/directional/west{ req_access = list("syndicate"); @@ -732,7 +730,7 @@ "YT" = ( /obj/item/shard, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Zh" = ( /obj/structure/table, /obj/item/storage/medkit/ancient{ diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index f6091bb08a65..93141bbfef43 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -288,7 +288,9 @@ /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/bridge) "bA" = ( -/obj/structure/ai_core/deactivated, +/obj/structure/ai_core{ + state = 5 + }, /turf/open/floor/iron/dark, /area/ruin/space/ancientstation/delta/ai) "bC" = ( @@ -710,7 +712,7 @@ "dq" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/watertank/high{ - desc = "A highly-pressurized water tank, this one seems almost empty.."; + desc = "A highly-pressurized water tank. This one seems almost empty.."; tank_volume = 1000 }, /obj/effect/decal/cleanable/dirt, @@ -1006,7 +1008,7 @@ /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) "eF" = ( -/obj/machinery/computer/rdconsole, +/obj/machinery/computer/rdconsole/unlocked, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/ruin/space/ancientstation/delta/rnd) @@ -2291,8 +2293,8 @@ dir = 6 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/ghost_role/human/oldsec, /obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/ghost_role/human/oldstation/sec, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/dorms) "ks" = ( @@ -2395,18 +2397,6 @@ /obj/item/clothing/neck/link_scryer/loaded/charlie, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/dorms) -"kO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/ghost_role/human/oldsci, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/dorms) "kP" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -2545,7 +2535,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/ghost_role/human/oldeng, +/obj/effect/mob_spawn/ghost_role/human/oldstation/sci, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/dorms) "lq" = ( @@ -2563,7 +2553,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/ghost_role/human/oldsci, +/obj/effect/mob_spawn/ghost_role/human/oldstation/eng, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/dorms) "lw" = ( @@ -2612,13 +2602,6 @@ /area/ruin/space/ancientstation/charlie/hydro) "lI" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/west{ - id = "Beta Secure Storage"; - name = "Engineering Secure Storage"; - req_access = list("engine_equip"); - pixel_x = 25; - pixel_y = 23 - }, /obj/item/shard/plasma, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) @@ -2695,10 +2678,6 @@ "mc" = ( /turf/closed/mineral/plasma, /area/ruin/space/ancientstation/charlie/dorms) -"md" = ( -/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 @@ -3018,7 +2997,7 @@ "nr" = ( /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ns" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/south, @@ -3373,6 +3352,7 @@ dir = 4 }, /obj/machinery/light_switch/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) "pB" = ( @@ -4137,7 +4117,6 @@ /area/ruin/space/ancientstation/delta/biolab) "vh" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 8 }, @@ -4551,6 +4530,7 @@ /obj/machinery/door/window/right/directional/east{ req_access = list("away_general") }, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/engine, /area/ruin/space/ancientstation/delta/biolab) "xT" = ( @@ -5563,7 +5543,6 @@ /turf/open/floor/plating/rust, /area/ruin/space/ancientstation/delta/hall) "Fm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 1 }, @@ -7066,7 +7045,7 @@ /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 8 }, -/obj/machinery/light/built/directional/west, +/obj/machinery/light/empty/directional/west, /turf/open/floor/iron/white/textured_edge{ dir = 4 }, @@ -7833,6 +7812,9 @@ /obj/item/geiger_counter, /obj/item/geiger_counter, /obj/machinery/light/small/broken/directional/north, +/obj/machinery/button/door/directional/north{ + id = "Beta Secure Storage" + }, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) "TA" = ( @@ -8219,6 +8201,7 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) "WR" = ( @@ -12496,9 +12479,9 @@ jJ cq Qg bN -ln +lr bN -kO +ln bN lr uX @@ -15389,7 +15372,7 @@ uo GX NG Lo -md +rp xM Go Yl diff --git a/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm b/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm index cb2dbf4aca06..a9f3a5da151c 100644 --- a/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldteleporter.dmm @@ -5,7 +5,7 @@ "b" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "c" = ( /turf/open/floor/plating/airless, /area/ruin/space/oldteleporter) diff --git a/_maps/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/RandomRuins/SpaceRuins/onehalf.dmm index 0048ccb3976e..8b1ef6e7cedf 100644 --- a/_maps/RandomRuins/SpaceRuins/onehalf.dmm +++ b/_maps/RandomRuins/SpaceRuins/onehalf.dmm @@ -6,16 +6,16 @@ /obj/structure/lattice/catwalk, /obj/structure/cable, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ad" = ( /obj/structure/lattice/catwalk, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ae" = ( /obj/item/stack/cable_coil/cut, /obj/structure/lattice/catwalk, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ag" = ( /turf/closed/wall, /area/ruin/space/has_grav/onehalf/dorms_med) @@ -106,7 +106,7 @@ "aw" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ax" = ( /obj/structure/lattice, /turf/template_noop, @@ -227,7 +227,7 @@ /obj/structure/lattice, /obj/item/storage/toolbox/syndicate, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aT" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -570,7 +570,7 @@ "bV" = ( /obj/item/stack/sheet/iron, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bW" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, @@ -651,7 +651,7 @@ icon_state = "small" }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ck" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment{ @@ -705,14 +705,14 @@ "cr" = ( /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "cs" = ( /obj/item/stack/sheet/plasteel{ amount = 10 }, /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ct" = ( /obj/structure/lattice, /obj/item/shard{ @@ -747,7 +747,7 @@ "cA" = ( /obj/item/stack/tile/wood, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "cB" = ( /turf/template_noop, /area/ruin/space/has_grav/onehalf/hallway) @@ -813,7 +813,7 @@ "cN" = ( /obj/item/stack/sheet/plasteel, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "cQ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -828,19 +828,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) -"cT" = ( +"cU" = ( +/obj/structure/table/reinforced, /obj/machinery/button/door{ id = "bridge_onehalf"; name = "Bridge Blast Door"; - pixel_x = 32; pixel_y = 5 }, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) -"cU" = ( -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/ruin/space/has_grav/onehalf/bridge) "cY" = ( /obj/structure/table/reinforced, /obj/item/gps/spaceruin, @@ -879,23 +875,23 @@ /obj/item/stack/sheet/plasteel, /obj/structure/lattice/catwalk, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "di" = ( /obj/item/shard{ icon_state = "medium" }, /obj/structure/lattice/catwalk, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "dj" = ( /obj/item/stack/rods, /obj/structure/lattice/catwalk, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "dl" = ( /obj/item/stack/cable_coil/cut, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ms" = ( /obj/item/stack/tile/iron/base, /obj/structure/cable, @@ -1411,7 +1407,7 @@ Vh Vh cJ cn -cT +cn cn cq ad diff --git a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm index d2cf049c0a57..9a6e450321e8 100644 --- a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm +++ b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm @@ -5,23 +5,23 @@ "ab" = ( /obj/structure/fluff/paper/corner, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ac" = ( /obj/structure/fluff/paper, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ad" = ( /obj/structure/fluff/paper/corner{ dir = 8 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ae" = ( /obj/structure/fluff/paper{ dir = 4 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "af" = ( /turf/closed/indestructible/paper, /area/ruin/space/has_grav/powered) @@ -30,20 +30,20 @@ dir = 10 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ah" = ( /obj/structure/fluff/paper/corner, /obj/structure/fluff/paper/corner{ dir = 8 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ai" = ( /obj/structure/fluff/paper{ dir = 6 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aj" = ( /obj/machinery/door/airlock/freezer{ name = "Airlock"; @@ -137,7 +137,7 @@ dir = 8 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ax" = ( /obj/structure/fluff/paper/corner{ dir = 1 @@ -375,19 +375,19 @@ dir = 9 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bd" = ( /obj/structure/fluff/paper{ dir = 1 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "be" = ( /obj/structure/fluff/paper/corner{ dir = 4 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bf" = ( /obj/structure/fluff/paper{ dir = 4 @@ -454,7 +454,7 @@ dir = 10 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bo" = ( /obj/structure/fluff/paper/corner{ dir = 4 @@ -463,7 +463,7 @@ dir = 8 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bp" = ( /obj/structure/fluff/paper{ dir = 8 @@ -518,13 +518,13 @@ dir = 1 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bx" = ( /obj/structure/fluff/paper{ dir = 5 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "by" = ( /obj/structure/fluff/paper/corner, /turf/open/indestructible/paper, diff --git a/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm b/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm index e44e1a8adcc8..4175d832b83c 100644 --- a/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm +++ b/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm @@ -5,7 +5,7 @@ "b" = ( /obj/structure/girder/reinforced, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "c" = ( /obj/structure/girder/reinforced, /turf/open/misc/asteroid/airless, diff --git a/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm b/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm index 98831dd9d2be..86727c3b383a 100644 --- a/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/russian_derelict.dmm @@ -113,6 +113,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, /area/ruin/space/ks13/hallway/central) +"aQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/airless, +/area/ruin/space/ks13/hallway/aft) "aU" = ( /obj/item/shard, /obj/structure/lattice, @@ -1675,7 +1679,7 @@ "rd" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "re" = ( /obj/structure/girder, /turf/open/floor/plating/airless, @@ -1704,10 +1708,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, /area/ruin/space/ks13/engineering/atmos) -"rk" = ( -/obj/structure/lattice, -/turf/template_noop, -/area/space/nearstation) "rl" = ( /turf/closed/wall/r_wall, /area/ruin/space/ks13/command/bridge) @@ -6388,9 +6388,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/ruin/space/ks13/medical/morgue) -"PG" = ( -/turf/closed/wall/r_wall, -/area/template_noop) "PH" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/power/apc/auto_name/directional/north, @@ -6992,7 +6989,7 @@ /obj/structure/frame/computer{ dir = 1 }, -/obj/item/circuitboard/computer/rdconsole, +/obj/item/circuitboard/computer/rdconsole/unlocked, /obj/structure/cable, /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating/airless, @@ -8135,9 +8132,9 @@ /turf/open/floor/circuit/red/off, /area/ruin/space/ks13/ai/corridor) "YE" = ( -/obj/structure/plaque/static_plaque/golden/commission/ks13, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/structure/plaque/static_plaque/golden/commission/ks13, /turf/open/floor/iron/airless, /area/ruin/space/ks13/hallway/central) "YF" = ( @@ -8510,17 +8507,17 @@ aa aa aa aa -rk +rd aa aa aa -rk +rd nW -rk +rd aa aa -rk -rk +rd +rd aa aa aa @@ -8620,10 +8617,10 @@ aa aa aa aa -rk -rk -rk -rk +rd +rd +rd +rd aa IQ IQ @@ -8633,9 +8630,9 @@ yW IQ IQ IF -rk -rk -rk +rd +rd +rd aa aa aa @@ -8748,8 +8745,8 @@ PA uf Kb Kb -rk -rk +rd +rd aa aa aa @@ -8957,7 +8954,7 @@ aa aa aa aa -rk +rd MB QU zF @@ -8973,7 +8970,7 @@ LE Qu uf Qe -rk +rd nd aa aa @@ -9070,7 +9067,7 @@ aa aa aa aa -rk +rd MB wt Eu @@ -9085,9 +9082,9 @@ Eq vl Lj uf -rk +rd qG -rk +rd aa qG aa @@ -9201,7 +9198,7 @@ uf No Bp Bp -rk +rd uF aa aa @@ -9313,8 +9310,8 @@ NO uf eG oD -rk -rk +rd +rd uF aa aa @@ -9428,7 +9425,7 @@ Nc uF uF uF -rk +rd aa aa aa @@ -9521,7 +9518,7 @@ aa aa aa aa -rk +rd aa aI EL @@ -9537,7 +9534,7 @@ GY CU Xj uf -rk +rd gn ZD aa @@ -9634,7 +9631,7 @@ aa aa aa aa -rk +rd aa MB Ky @@ -9650,8 +9647,8 @@ rw rw Tb uf -rk -rk +rd +rd UP aa aa @@ -9746,9 +9743,9 @@ aa aa aa aa -rk -rk -rk +rd +rd +rd MB MB MB @@ -9763,9 +9760,9 @@ ZR yq rm uf -rk +rd qG -rk +rd aa aa aa @@ -9862,7 +9859,7 @@ aa aa aa aa -rk +rd aa MB BO @@ -9975,7 +9972,7 @@ aa aa aa aa -rk +rd aa MB MB @@ -9997,10 +9994,10 @@ Jr aa aa aa -rk +rd aa aa -rk +rd aa aa aa @@ -10088,10 +10085,10 @@ aa aa aa aa -rk -rk -rk -rk +rd +rd +rd +rd yq DH sX @@ -10110,13 +10107,13 @@ Is aa aa aa -rk -rk -rk -rk -rk -rk -rk +rd +rd +rd +rd +rd +rd +rd aa aa aa @@ -10202,9 +10199,9 @@ aa aa aa aa -rk -rk -rk +rd +rd +rd yq SW SK @@ -10220,23 +10217,23 @@ Is ow MN Is -rk -rk +rd +rd aa -rk +rd uF uF IF uF -rk -rk -rk -rk -rk -rk +rd +rd +rd +rd +rd +rd IF -rk -rk +rd +rd aa aa aa @@ -10316,8 +10313,8 @@ aa aa aa aa -rk -rk +rd +rd yq PF TT @@ -10334,21 +10331,21 @@ MN Is MN MN -rk -rk -rk -rk -rk -rk +rd +rd +rd +rd +rd +rd IF -rk +rd IF IF -rk +rd uF uF IF -rk +rd aa aa aa @@ -10430,7 +10427,7 @@ aa aa aa aa -rk +rd yq yq yq @@ -10461,7 +10458,7 @@ Ii Ii uF aa -rk +rd aa aa aa @@ -10573,12 +10570,12 @@ cI qJ qv aa -rk -rk -rk -rk -rk -rk +rd +rd +rd +rd +rd +rd aa aa aa @@ -10673,7 +10670,7 @@ vb Jr Ut Ww -MW +Jr Wt Sp pK @@ -10685,12 +10682,12 @@ qv OX kG Me -rk -rk +rd +rd aa aa aa -rk +rd aa aa aa @@ -10761,9 +10758,9 @@ aa aa aa aa -rk -rk -rk +rd +rd +rd aa aa aa @@ -10779,7 +10776,7 @@ qO wC WE OR -MW +Jr JJ Hi vb @@ -10798,12 +10795,12 @@ VE vZ QZ Me -rk +rd aa aa aa aa -rk +rd aa aa aa @@ -10874,10 +10871,10 @@ aa aa aa aa -rk +rd aa -rk -rk +rd +rd aa aa aa @@ -10911,14 +10908,14 @@ Ag VE rR Iy -rk -rk +rd +rd aa -rk -rk -rk -rk -rk +rd +rd +rd +rd +rd aa aa aa @@ -10980,18 +10977,18 @@ aa aa aa aa -rk -rk -rk -rk -rk -rk -rk +rd +rd +rd +rd +rd +rd +rd QG QG QG -rk -rk +rd +rd aa aa aa @@ -11025,13 +11022,13 @@ VE rR Iy aa -rk -rk -rk +rd +rd +rd aa aa aa -rk +rd aa aa aa @@ -11092,12 +11089,12 @@ aa aa aa aa -rk -rk -rk -rk -rk -rk +rd +rd +rd +rd +rd +rd QG QG QG @@ -11105,7 +11102,7 @@ QG QG QG QG -rk +rd aa aa aa @@ -11137,14 +11134,14 @@ qv vZ zr Iy -rk -rk +rd +rd aa -rk -rk +rd +rd aa -rk -rk +rd +rd aa aa aa @@ -11204,13 +11201,13 @@ aa aa aa aa -rk -rk -rk -rk -rk -rk -rk +rd +rd +rd +rd +rd +rd +rd QG QG Xt @@ -11218,8 +11215,8 @@ Xb DT QG QG -rk -rk +rd +rd aa aa II @@ -11250,13 +11247,13 @@ qv Zj qv Me -rk -rk -rk +rd +rd +rd ZK -rk -rk -rk +rd +rd +rd aa aa aa @@ -11314,15 +11311,15 @@ aa aa aa aa -rk -rk -rk -rk -rk -rk -rk -rk -rk +rd +rd +rd +rd +rd +rd +rd +rd +rd sU QG PH @@ -11332,7 +11329,7 @@ Rq sL QG sU -rk +rd aa aU Ho @@ -11369,9 +11366,9 @@ bm ZK ke Ez -rk -rk -rk +rd +rd +rd aa aa aa @@ -11426,16 +11423,16 @@ aa aa aa aa -rk +rd nQ -rk +rd Kb sU sU -rk -rk -rk -rk +rd +rd +rd +rd sU Dy Us @@ -11482,9 +11479,9 @@ bm XO TK Fv -rk +rd IF -rk +rd aa aa aa @@ -11513,13 +11510,13 @@ aa aa aa aa -rk +rd aa aa aa -rk -rk -rk +rd +rd +rd aa aa aa @@ -11537,10 +11534,10 @@ aa aa aa aa -rk -rk -rk -rk +rd +rd +rd +rd Kb sU sU @@ -11597,8 +11594,8 @@ TK Ez jV NW -rk -rk +rd +rd aa aa aa @@ -11625,16 +11622,16 @@ aa aa aa aa -rk +rd aa -rk -rk -rk +rd +rd +rd aa aa aa -rk -rk +rd +rd aa aa aa @@ -11649,10 +11646,10 @@ aa aa aa aa -rk -rk -rk -rk +rd +rd +rd +rd Kb sU gd @@ -11738,7 +11735,7 @@ aa aa aa aa -rk +rd Yc Yc Yc @@ -11747,7 +11744,7 @@ Yc Yc Yc aa -rk +rd aa aa aa @@ -11763,9 +11760,9 @@ aa aa aa aa -rk +rd Kb -rk +rd Kb sU aj @@ -11818,7 +11815,7 @@ Fa iT TW BM -jV +aQ Uo gG jV @@ -11852,7 +11849,7 @@ aa aa aa aa -rk +rd Yc Pw fU @@ -11860,15 +11857,15 @@ zA fU Yc aa -rk -rk -rk -rk -rk -rk -rk -rk -rk +rd +rd +rd +rd +rd +rd +rd +rd +rd nQ aa aa @@ -11964,7 +11961,7 @@ aa aa aa aa -rk +rd Yc Yc eA @@ -11990,7 +11987,7 @@ aa aa aa aa -rk +rd Kb Wk MG @@ -12078,9 +12075,9 @@ aa aa aa aa -rk -rk -rk +rd +rd +rd Yc AW KO @@ -12103,7 +12100,7 @@ aa aa aa aa -rk +rd Kb sU UZ @@ -12193,7 +12190,7 @@ aa aa aa aa -rk +rd Yc Yc lk @@ -12206,7 +12203,7 @@ Jw Jw Jw Jw -rk +rd aa aa OY @@ -12307,7 +12304,7 @@ aa aa aa aa -rk +rd Yc fU fU @@ -12319,8 +12316,8 @@ fU fU YC Yc -rk -rk +rd +rd aa uu Pm @@ -12433,7 +12430,7 @@ st Yc Yc aa -rk +rd aa uu NJ @@ -12998,7 +12995,7 @@ qC Yc Yc Yc -rk +rd aa aa aa @@ -13007,7 +13004,7 @@ aa aa aa rd -rk +rd Kb sU fg @@ -13232,7 +13229,7 @@ aa aa aa aa -PG +Kb IF Kb Wk @@ -13347,7 +13344,7 @@ aa aa rd Kb -rk +rd BK Wk HO @@ -13459,8 +13456,8 @@ aa aa aa rd -rk -rk +rd +rd Kb sU HO @@ -13500,18 +13497,18 @@ xW BU Dn cB -rk -rk -rk +rd +rd +rd xW aa -rk +rd Sq aa -rk -rk +rd +rd aa -rk +rd aa ZK Pu @@ -13550,7 +13547,7 @@ aa aa aa aa -rk +rd Yc Yc Yc @@ -13573,8 +13570,8 @@ aa aa aa rd -rk -rk +rd +rd Kb sU sU @@ -13614,17 +13611,17 @@ vP AE Rx sK -rk -rk +rd +rd xW -rk -rk -rk +rd +rd +rd aa aa -rk +rd aa -rk +rd aa ZK Pu @@ -13646,8 +13643,8 @@ aa aa aa aa -rk -rk +rd +rd aa aa "} @@ -13663,7 +13660,7 @@ aa aa aa aa -rk +rd IF Yc yz @@ -13686,9 +13683,9 @@ aa aa aa rd -rk -rk -rk +rd +rd +rd Kb sU sU @@ -13725,21 +13722,21 @@ AQ xE AO BT -rk +rd sq xV -rk +rd xW aa -rk -rk -rk -rk -rk -rk -rk -aa -ZK +rd +rd +rd +rd +rd +rd +rd +aa +ZK HI Ze jV @@ -13759,10 +13756,10 @@ aa aa aa aa -rk +rd aa -rk -rk +rd +rd "} (48,1,1) = {" aa @@ -13776,7 +13773,7 @@ aa aa aa aa -rk +rd IF Yc yz @@ -13807,8 +13804,8 @@ aa aa aa aa -rk -rk +rd +rd sU rr up @@ -13839,14 +13836,14 @@ Ar Ai ML Cf -rk +rd XA -rk +rd Lq Uu Ar Ar -rk +rd ia LB LB @@ -13871,7 +13868,7 @@ NW NW NW NW -rk +rd NW NW NW @@ -13921,8 +13918,8 @@ aa aa aa aa -rk -rk +rd +rd rr rr ab @@ -13958,12 +13955,12 @@ hY XA AM xs -rk -rk +rd +rd uQ Xv aa -rk +rd Xv Lq Pe @@ -13974,9 +13971,9 @@ aa aa aa aa -rk -rk -rk +rd +rd +rd BK aa aa @@ -13985,7 +13982,7 @@ aa aa aa aa -rk +rd aa aa NW @@ -14002,7 +13999,7 @@ aa aa aa aa -rk +rd IF Yc yz @@ -14035,7 +14032,7 @@ aa aa aa aa -rk +rd rr rr rr @@ -14071,12 +14068,12 @@ vz Bf rg sY -rk +rd DF -rk +rd XA XA -rk +rd XA Lq xk @@ -14085,7 +14082,7 @@ ZK Kb Kb BK -rk +rd aa BZ aa @@ -14115,7 +14112,7 @@ aa aa aa aa -rk +rd IF Yc yz @@ -14148,9 +14145,9 @@ aa aa aa aa -rk +rd aa -rk +rd rr rr rr @@ -14184,10 +14181,10 @@ gm Lq Lq jk -rk +rd hY -rk -rk +rd +rd DO DO DO @@ -14197,12 +14194,12 @@ vN jV NW aa -rk -rk -rk -rk -rk -rk +rd +rd +rd +rd +rd +rd aa aa aa @@ -14228,7 +14225,7 @@ aa aa aa aa -rk +rd IF Yc yz @@ -14253,17 +14250,17 @@ aa aa aa aa -rk -rk +rd +rd aa aa aa aa aa aa -rk +rd aa -rk +rd wv AX KB @@ -14295,13 +14292,13 @@ RP Ib JF Lq -rk +rd ZJ Sv pB sH MA -rk +rd DF zY Lq @@ -14310,12 +14307,12 @@ vN jV NW aa -rk +rd aa -rk +rd aa -rk -rk +rd +rd mR aa aa @@ -14372,11 +14369,11 @@ aa aa aa aa -rk +rd aa -rk -rk -rk +rd +rd +rd Mj MT QR @@ -14403,10 +14400,10 @@ Ay Qr Qr Rv -rk -rk -rk -rk +rd +rd +rd +rd Lq Cf mS @@ -14424,7 +14421,7 @@ jV NW aa mR -rk +rd hK mR yt @@ -14454,7 +14451,7 @@ aa aa aa aa -rk +rd IF Yc yz @@ -14478,16 +14475,16 @@ aa aa aa aa -rk -rk +rd +rd aa aa aa aa aa GI -rk -rk +rd +rd aa aa Mj @@ -14509,7 +14506,7 @@ zX Uj Uj CP -rk +rd aw OK vi @@ -14517,8 +14514,8 @@ OK Lq xN Yf -rk -rk +rd +rd uG Lq Wy @@ -14594,14 +14591,14 @@ GI aa Nk GI -rk -rk +rd +rd aa aa -rk +rd aa -rk -rk +rd +rd aa Mj pT @@ -14623,15 +14620,15 @@ Mt Xy Su OK -rk -rk +rd +rd OK vi Lq xN om vI -rk +rd uG Qr zY @@ -14666,7 +14663,7 @@ aa vE aa aa -rk +rd "} (56,1,1) = {" aa @@ -14680,7 +14677,7 @@ aa aa aa aa -rk +rd IF Yc yz @@ -14705,13 +14702,13 @@ aa aa GI gQ -rk +rd aa aa -rk +rd aa aa -rk +rd aa aa aa @@ -14737,7 +14734,7 @@ Xm CP il Uj -rk +rd Ir Ir Lq @@ -14824,7 +14821,7 @@ aa aa aa aa -rk +rd aa aa aa @@ -14848,7 +14845,7 @@ NT Cy YZ Th -rk +rd Tt Ir Ir @@ -14906,7 +14903,7 @@ aa aa aa aa -rk +rd IF Yc yz @@ -14936,8 +14933,8 @@ aa aa aa aa -rk -rk +rd +rd aa aa aa @@ -14954,10 +14951,10 @@ tT yl yl TC -rk -rk -rk -rk +rd +rd +rd +rd NT vQ ZL @@ -14968,9 +14965,9 @@ vi aa oU IF -rk -rk -rk +rd +rd +rd ZK VO CV @@ -15005,7 +15002,7 @@ uz vE uz aa -rk +rd "} (59,1,1) = {" aa @@ -15019,7 +15016,7 @@ aa aa aa aa -rk +rd IF Yc yz @@ -15048,9 +15045,9 @@ De aa aa aa -rk -rk -rk +rd +rd +rd aa aa aa @@ -15067,10 +15064,10 @@ tT DM yl wv -rk -rk -rk -rk +rd +rd +rd +rd Cy tb Qi @@ -15080,10 +15077,10 @@ il vi aa aa -rk +rd Gf aa -rk +rd ZK ZK ZK @@ -15115,24 +15112,24 @@ aa aa aa aa -rk +rd aa aa -rk +rd "} (60,1,1) = {" aa aa aa -rk -rk +rd +rd aa aa -rk -rk +rd +rd aa aa -rk +rd Kb Yc yz @@ -15180,21 +15177,21 @@ wv pT xd TC -rk -rk -rk -rk +rd +rd +rd +rd IF tb TB tb IF IF -rk +rd aa aa aa -rk +rd aa aa Gf @@ -15225,24 +15222,24 @@ NW NW NW NW -rk +rd NW NW -rk -rk +rd +rd NW -rk +rd "} (61,1,1) = {" aa aa aa -rk +rd NW NW NW NW -rk +rd aa aa aa @@ -15293,21 +15290,21 @@ XV iF cf wv -rk -rk +rd +rd aa aa -rk +rd GA tK rM GA -rk +rd aa aa AC -rk -rk +rd +rd aa aa Gf @@ -15334,31 +15331,31 @@ sz AK AK AK -rk +rd aa aa aa aa aa aa -rk -rk -rk +rd +rd +rd aa "} (62,1,1) = {" -rk -rk +rd +rd aa aa -rk +rd aa aa NW aa aa aa -rk +rd IF Yc yz @@ -15410,7 +15407,7 @@ aa aa aa aa -rk +rd GA kt rM @@ -15419,11 +15416,11 @@ aa aa aa aa -rk +rd GI aa -rk -rk +rd +rd aa aa aa @@ -15447,7 +15444,7 @@ mR mR mR mR -rk +rd aa aa aa @@ -15460,18 +15457,18 @@ aa aa "} (63,1,1) = {" -rk +rd aa nD ri bP -rk -rk +rd +rd NW aa aa aa -rk +rd IF Yc yz @@ -15513,16 +15510,16 @@ yR xd wv wv -rk +rd XW cu th XW -rk -rk -rk -rk -rk +rd +rd +rd +rd +rd IF tb IX @@ -15532,10 +15529,10 @@ aa aa aa aa -rk -rk -rk -rk +rd +rd +rd +rd aa aa aa @@ -15560,7 +15557,7 @@ AK AK sz sz -rk +rd aa aa aa @@ -15584,7 +15581,7 @@ NW aa aa aa -rk +rd IF Yc yz @@ -15625,18 +15622,18 @@ xd UM AX wv -rk -rk +rd +rd Uv xT xY OO -rk +rd aa -rk +rd aa aa -rk +rd LV EV PO @@ -15646,8 +15643,8 @@ aa aa aa aa -rk -rk +rd +rd aa aa aa @@ -15673,8 +15670,8 @@ mR mR mR mR -rk -rk +rd +rd aa aa aa @@ -15694,10 +15691,10 @@ bP aa aa NW -rk -rk -rk -rk +rd +rd +rd +rd IF Yc yz @@ -15746,7 +15743,7 @@ IN Uv aa aa -rk +rd aa aa IF @@ -15759,8 +15756,8 @@ aa aa aa aa -rk -rk +rd +rd aa aa aa @@ -15779,15 +15776,15 @@ aa jV Ez yX -rk -rk +rd +rd aa -rk +rd aa -rk -rk +rd +rd aa -rk +rd aa aa aa @@ -15851,7 +15848,7 @@ VD VD wv wv -rk +rd aa OO QI @@ -15862,17 +15859,17 @@ aa GI aa aa -rk +rd aa GA PO GA -rk -rk -rk +rd +rd +rd aa aa -rk +rd aa aa aa @@ -15892,14 +15889,14 @@ aa jV ZT yX -rk +rd aa aa -rk +rd aa aa -rk -rk +rd +rd to aa aa @@ -15964,7 +15961,7 @@ iS Kb aa aa -rk +rd aa OO QI @@ -15975,7 +15972,7 @@ aa aa aa aa -rk +rd aa tb dS @@ -15984,9 +15981,9 @@ aa aa aa aa -rk -rk -rk +rd +rd +rd aa aa aa @@ -16003,14 +16000,14 @@ aa aa aa jV -rk +rd yX -rk +rd aa -rk -rk +rd +rd aa -rk +rd aa aa aa @@ -16073,9 +16070,9 @@ Pc Db IL Aw -rk +rd Dr -rk +rd aa XW XW @@ -16088,7 +16085,7 @@ XW aa aa aa -rk +rd aa tb zs @@ -16096,8 +16093,8 @@ tb aa aa aa -rk -rk +rd +rd aa aa aa @@ -16115,15 +16112,15 @@ aa aa aa yM -rk -rk -rk -rk +rd +rd +rd +rd aa -rk +rd aa aa -rk +rd aa aa aa @@ -16184,7 +16181,7 @@ Jz JC Zv Rs -rk +rd vY pt Dr @@ -16202,16 +16199,16 @@ aa aa aa IF -rk +rd GA BP GA aa aa -rk +rd BZ -rk -rk +rd +rd aa aa aa @@ -16230,13 +16227,13 @@ aa aa Fu aa -rk +rd aa aa -rk +rd aa aa -rk +rd aa aa aa @@ -16299,7 +16296,7 @@ FQ sa Hu IL -rk +rd Wx aa Lx @@ -16314,7 +16311,7 @@ XW TI XW aa -rk +rd aa tb TB @@ -16324,10 +16321,10 @@ aa aa BZ aa -rk -rk -rk -rk +rd +rd +rd +rd AC aa aa @@ -16341,16 +16338,16 @@ aa aa aa aa -rk +rd aa -rk +rd aa aa -rk -rk -rk -rk -rk +rd +rd +rd +rd +rd aa aa aa @@ -16412,7 +16409,7 @@ dx Bg Wm Ol -rk +rd An aa uF @@ -16427,16 +16424,16 @@ wD Xd XW aa -rk +rd aa tb za GA aa aa -rk -rk -rk +rd +rd +rd aa aa aa @@ -16454,15 +16451,15 @@ aa aa aa aa -rk -rk -rk +rd +rd +rd aa aa aa aa aa -rk +rd aa aa aa @@ -16477,7 +16474,7 @@ aa aa "} (72,1,1) = {" -rk +rd aa bP ri @@ -16547,8 +16544,8 @@ pd GA aa aa -rk -rk +rd +rd aa aa aa @@ -16567,15 +16564,15 @@ aa aa aa aa -rk +rd aa aa aa aa aa aa -rk -rk +rd +rd aa aa aa @@ -16590,7 +16587,7 @@ aa aa "} (73,1,1) = {" -rk +rd aa bP ri @@ -16635,7 +16632,7 @@ Qd SE rl IF -rk +rd aa aa aa @@ -16654,7 +16651,7 @@ dO Sw IF IF -rk +rd GA TB GA @@ -16671,23 +16668,23 @@ aa aa aa aa -rk +rd aa aa aa -rk +rd aa aa aa -rk -rk +rd +rd aa aa aa aa -rk -rk -rk +rd +rd +rd aa aa aa @@ -16784,23 +16781,23 @@ Dh aa aa aa -rk +rd aa aa aa -rk +rd aa aa -rk -rk +rd +rd aa -rk -rk -rk +rd +rd +rd aa aa aa -rk +rd aa aa aa @@ -16824,10 +16821,10 @@ bP aa aa NW -rk +rd NW NW -rk +rd NW NW NW @@ -16843,13 +16840,13 @@ dT IF IF IF -rk +rd aa aa aa aa aa -rk +rd Bw rl Ae @@ -16894,27 +16891,27 @@ or Be XM zm -rk -rk -rk -rk -rk -rk -rk -rk -rk -rk -rk -rk -rk -rk +rd +rd +rd +rd +rd +rd +rd +rd +rd +rd +rd +rd +rd +rd aa to -rk -rk -rk -rk -rk +rd +rd +rd +rd +rd to aa aa @@ -16940,7 +16937,7 @@ NW aa aa aa -rk +rd aa aa aa @@ -16949,21 +16946,21 @@ aa aa aa aa -rk +rd dT Ad dT aa aa -rk -rk +rd +rd aa aa aa aa aa aa -rk +rd rl GV GV @@ -16974,7 +16971,7 @@ GV GV rl Bw -rk +rd aa IF IF @@ -17010,13 +17007,13 @@ cb aa aa aa -rk +rd aa aa aa -rk -rk -rk +rd +rd +rd aa aa aa @@ -17024,7 +17021,7 @@ aa aa aa aa -rk +rd aa aa aa @@ -17047,8 +17044,8 @@ aa bP ri bP -rk -rk +rd +rd NW aa aa @@ -17062,11 +17059,11 @@ aa aa aa aa -rk +rd aa aa -rk -rk +rd +rd aa aa aa @@ -17077,17 +17074,17 @@ aa aa aa aa -rk -rk +rd +rd aa aa aa aa AC aa -rk +rd aa -rk +rd aa IF IF @@ -17123,13 +17120,13 @@ Gf aa aa aa -rk +rd aa aa aa -rk +rd aa -rk +rd aa aa aa @@ -17159,11 +17156,11 @@ NW aa aa aa -rk +rd aa aa -rk -rk +rd +rd aa aa aa @@ -17199,7 +17196,7 @@ aa aa aa aa -rk +rd aa aa Kb @@ -17242,7 +17239,7 @@ aa aa uq aa -rk +rd aa aa aa @@ -17272,11 +17269,11 @@ NW NW NW NW -rk +rd NW NW NW -rk +rd aa aa aa @@ -17355,7 +17352,7 @@ aa IF NW NW -rk +rd aa aa aa @@ -17381,14 +17378,14 @@ aa aa "} (80,1,1) = {" -rk +rd aa aa aa aa -rk -rk -rk +rd +rd +rd aa aa aa @@ -17468,7 +17465,7 @@ NW NW NW aa -rk +rd aa aa aa @@ -17580,8 +17577,8 @@ IF aa IF aa -rk -rk +rd +rd aa aa aa @@ -17653,7 +17650,7 @@ aa aa aa aa -rk +rd IF IF IF @@ -17661,7 +17658,7 @@ IF IF IF IF -rk +rd aa aa aa @@ -17693,8 +17690,8 @@ Kb Kb Kb Kb -rk -rk +rd +rd aa aa aa @@ -17766,15 +17763,15 @@ aa aa aa aa -rk -rk +rd +rd aa aa aa aa aa -rk -rk +rd +rd aa aa aa @@ -17807,7 +17804,7 @@ NW NW NW aa -rk +rd aa aa aa diff --git a/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm b/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm index ad0c72415948..fb9745de0ce2 100644 --- a/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm +++ b/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm @@ -29,7 +29,7 @@ "eb" = ( /obj/item/shard, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "en" = ( /obj/machinery/power/smes/magical{ desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; @@ -60,11 +60,11 @@ "hp" = ( /obj/item/stack/rods, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "iF" = ( /obj/item/stack/sheet/iron, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "jd" = ( /obj/item/stack/sheet/iron, /turf/open/floor/plating/airless, @@ -148,7 +148,7 @@ "Bv" = ( /obj/structure/broken_flooring/singular/directional/south, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "BA" = ( /obj/effect/decal/cleanable/blood/gibs/robot_debris, /obj/effect/decal/cleanable/glass, @@ -236,7 +236,7 @@ "Ng" = ( /obj/item/stack/tile/iron/showroomfloor, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Ns" = ( /obj/item/chair, /obj/item/clothing/head/utility/surgerycap, @@ -272,7 +272,7 @@ "Rm" = ( /obj/item/circuitboard/machine/restaurant_portal, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "RI" = ( /obj/effect/decal/cleanable/shreds, /turf/open/floor/iron/cafeteria/airless, diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index e18683a83340..e8448c8a0471 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -137,14 +137,12 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/machinery/button/door/directional/south{ - id = "a5"; - name = "privacy button"; - pixel_y = 24 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, +/obj/machinery/button/door/directional/north{ + id = "a5" + }, /turf/open/floor/carpet/purple, /area/ruin/space/has_grav/hotel/guestroom/room_5) "by" = ( @@ -356,7 +354,7 @@ pixel_y = 17 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "dK" = ( /obj/structure/frame/computer{ dir = 1 @@ -579,17 +577,14 @@ /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel/bar) "gv" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/sign/warning/fire{ - desc = "A sign that states the labeled room's number."; - icon_state = "roomnum"; - name = "Room Number 1"; - pixel_y = -24 +/obj/machinery/light/small/directional/south, +/obj/machinery/button{ + id = "hcb2"; + name = "shutters control"; + pixel_y = -25 }, -/turf/open/floor/wood/tile, -/area/ruin/space/has_grav/hotel) +/turf/open/floor/catwalk_floor, +/area/ruin/space/has_grav/hotel/dock) "gB" = ( /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/carpet/black, @@ -634,16 +629,15 @@ /turf/open/floor/wood/tile, /area/ruin/space/has_grav/hotel) "hg" = ( -/obj/effect/turf_decal/siding/wood, /obj/structure/sign/warning/fire{ desc = "A sign that states the labeled room's number."; dir = 10; icon_state = "roomnum"; name = "Room Number 6"; - pixel_y = 24 + pixel_y = -5 }, -/turf/open/floor/wood/tile, -/area/ruin/space/has_grav/hotel) +/turf/closed/wall, +/area/ruin/space/has_grav/hotel/guestroom/room_6) "hh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -1160,7 +1154,7 @@ pixel_y = 17 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "lf" = ( /obj/structure/window/spawner/directional/north, /obj/machinery/shower/directional/south, @@ -1197,7 +1191,7 @@ pixel_y = 17 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "lw" = ( /obj/item/storage/toolbox/mechanical, /turf/open/floor/plating, @@ -1205,7 +1199,7 @@ "lB" = ( /obj/structure/fluff/tram_rail, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "lE" = ( /obj/machinery/light/directional/east, /turf/open/floor/iron/grimy, @@ -1239,7 +1233,6 @@ /obj/effect/turf_decal/siding/white{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) @@ -1281,7 +1274,7 @@ dir = 8 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "mj" = ( /obj/structure/chair/sofa/right/brown{ dir = 4 @@ -1543,7 +1536,7 @@ /obj/structure/fluff/tram_rail, /obj/structure/lattice/catwalk, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ot" = ( /obj/structure/table/wood/fancy/red, /obj/item/paper_bin, @@ -1573,7 +1566,7 @@ }, /obj/structure/fluff/tram_rail, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "po" = ( /obj/structure/fluff/beach_umbrella/syndi, /turf/open/misc/beach/sand, @@ -1666,7 +1659,7 @@ pixel_y = 17 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "qF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1686,7 +1679,7 @@ pixel_y = 17 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "qM" = ( /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/hotel/guestroom/room_1) @@ -1897,7 +1890,6 @@ }, /obj/effect/turf_decal/siding/white, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) "tj" = ( @@ -1929,16 +1921,13 @@ /turf/open/floor/carpet/blue, /area/ruin/space/has_grav/hotel) "tW" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/sign/warning/fire{ - desc = "A sign that states the labeled room's number."; - dir = 8; - icon_state = "roomnum"; - name = "Room Number 4"; - pixel_y = 24 +/obj/machinery/button{ + id = "hcb2"; + name = "shutters control"; + pixel_y = 8 }, -/turf/open/floor/wood/tile, -/area/ruin/space/has_grav/hotel) +/turf/closed/wall, +/area/ruin/space/has_grav/hotel/dock) "ua" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/light/small/directional/south, @@ -2019,10 +2008,8 @@ /obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/machinery/button/door/directional/south{ - id = "a3"; - name = "privacy button"; - pixel_y = 24 +/obj/machinery/button/door/directional/north{ + id = "a3" }, /turf/open/floor/carpet/red, /area/ruin/space/has_grav/hotel/guestroom/room_3) @@ -2102,7 +2089,8 @@ id = "hcb1"; name = "shutters control"; pixel_x = 26; - pixel_y = 8 + pixel_y = 8; + dir = 4 }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2326,8 +2314,6 @@ /area/ruin/space/has_grav/hotel/pool) "xS" = ( /obj/item/beacon, -/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/dock) "xZ" = ( @@ -2393,7 +2379,7 @@ "yB" = ( /obj/structure/lattice/catwalk, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "yD" = ( /obj/structure/sink/directional/west, /obj/machinery/firealarm/directional/north, @@ -2432,7 +2418,7 @@ "yV" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "yY" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/tile, @@ -2449,12 +2435,6 @@ /area/ruin/space/has_grav/hotel/power) "zr" = ( /obj/effect/turf_decal/loading_area, -/obj/machinery/button{ - id = "hcb2"; - name = "shutters control"; - pixel_x = -25; - pixel_y = 8 - }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel/dock) "zy" = ( @@ -2588,6 +2568,13 @@ /obj/machinery/vending/coffee, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel) +"BP" = ( +/obj/machinery/button{ + id = "hcd1"; + name = "shutters control" + }, +/turf/closed/wall, +/area/ruin/space/has_grav/hotel/dock) "BU" = ( /obj/structure/cable, /turf/open/floor/circuit/green, @@ -2901,7 +2888,7 @@ /obj/structure/lattice, /obj/structure/grille, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "FT" = ( /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/hotel/dock) @@ -3123,7 +3110,7 @@ /obj/structure/lattice, /obj/structure/grille/broken, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Iq" = ( /obj/item/kirbyplants/organic/plant16, /obj/structure/sign/poster/random/directional/west, @@ -3176,7 +3163,7 @@ "IZ" = ( /obj/structure/fluff/tram_rail/end, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Je" = ( /obj/structure/cable, /obj/item/reagent_containers/cup/bucket, @@ -3397,18 +3384,14 @@ /turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/hotel/guestroom/room_2) "MY" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/table/wood/fancy/red, -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/east, -/obj/machinery/button/door/directional/north{ - id = "a2"; - name = "privacy button"; - pixel_y = -24 +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + icon_state = "roomnum"; + name = "Room Number 5"; + dir = 5 }, -/turf/open/floor/carpet/green, -/area/ruin/space/has_grav/hotel/guestroom/room_2) +/turf/closed/wall, +/area/ruin/space/has_grav/hotel/guestroom/room_5) "Ne" = ( /obj/effect/turf_decal/loading_area, /obj/machinery/light/small/directional/east, @@ -3429,23 +3412,22 @@ /turf/open/floor/carpet/blue, /area/ruin/space/has_grav/hotel) "ND" = ( -/obj/machinery/button{ - id = "hcd1"; - name = "shutters control"; - pixel_x = -25; - pixel_y = -25 +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + dir = 8; + icon_state = "roomnum"; + name = "Room Number 4" }, -/turf/open/floor/iron/dark/side, -/area/ruin/space/has_grav/hotel/dock) +/turf/closed/wall, +/area/ruin/space/has_grav/hotel/guestroom/room_4) "NG" = ( -/obj/machinery/button{ - id = "hcb2"; - name = "shutters control"; - pixel_x = -25; - pixel_y = -25 +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + icon_state = "roomnum"; + name = "Room Number 1" }, -/turf/open/floor/catwalk_floor, -/area/ruin/space/has_grav/hotel/dock) +/turf/closed/wall, +/area/ruin/space/has_grav/hotel/guestroom/room_1) "NJ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3626,7 +3608,6 @@ /obj/effect/turf_decal/siding/white{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) @@ -3891,18 +3872,15 @@ /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) "Tq" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, /obj/structure/sign/warning/fire{ desc = "A sign that states the labeled room's number."; - dir = 6; + dir = 1; icon_state = "roomnum"; - name = "Room Number 5"; - pixel_y = -24 + name = "Room Number 2"; + pixel_y = -10 }, -/turf/open/floor/wood/tile, -/area/ruin/space/has_grav/hotel) +/turf/closed/wall, +/area/ruin/space/has_grav/hotel/guestroom/room_2) "Ts" = ( /turf/open/floor/carpet/purple, /area/ruin/space/has_grav/hotel/guestroom/room_5) @@ -3918,18 +3896,15 @@ /turf/template_noop, /area/ruin/space/has_grav/hotel) "TG" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, /obj/structure/sign/warning/fire{ desc = "A sign that states the labeled room's number."; dir = 4; icon_state = "roomnum"; name = "Room Number 3"; - pixel_y = -24 + pixel_y = 10 }, -/turf/open/floor/wood/tile, -/area/ruin/space/has_grav/hotel) +/turf/closed/wall, +/area/ruin/space/has_grav/hotel/guestroom/room_3) "TH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4072,7 +4047,8 @@ id = "hcb1"; name = "shutters control"; pixel_x = -25; - pixel_y = 8 + pixel_y = 8; + dir = 8 }, /turf/open/floor/catwalk_floor, /area/ruin/space/has_grav/hotel/dock) @@ -4092,7 +4068,7 @@ pixel_y = 17 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "VM" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/machinery/power/apc/auto_name/directional/south, @@ -4369,12 +4345,9 @@ /area/ruin/space/has_grav/hotel/bar) "Yf" = ( /obj/effect/turf_decal/siding/wood, -/obj/structure/sign/warning/fire{ - desc = "A sign that states the labeled room's number."; - dir = 1; - icon_state = "roomnum"; - name = "Room Number 2"; - pixel_y = 24 +/obj/machinery/button/door/directional/north{ + id = "a2"; + pixel_y = 32 }, /turf/open/floor/wood/tile, /area/ruin/space/has_grav/hotel) @@ -4466,7 +4439,6 @@ "Zg" = ( /obj/effect/turf_decal/siding/white, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) "Zl" = ( @@ -4483,7 +4455,7 @@ }, /obj/structure/fluff/tram_rail/end, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Zo" = ( /obj/structure/sink/directional/west, /turf/open/floor/iron/showroomfloor, @@ -5557,13 +5529,13 @@ ez Ka Xg XS -xI hg +yY Lj PF wr -Tq -LD +QH +MY bu lZ hO @@ -6579,13 +6551,13 @@ Fy On eR Gg -Hm -tW +ND +yY cf PF cf +QH TG -vy vx Xx Rl @@ -7256,9 +7228,9 @@ VV aC lW sh -Ct -VV +gv VV +tW iP jf jy @@ -7329,7 +7301,7 @@ VV hZ hE xd -NG +hZ LB zr nw @@ -7381,14 +7353,14 @@ WD CL Ml OS -MY -Ff +OS +Tq Yf cf PF cf -gv -BK +QH +NG Xw Bb SN @@ -8211,7 +8183,7 @@ VV lI xS FT -VV +BP VV Cl Cl @@ -8283,7 +8255,7 @@ nX hU lI KZ -ND +FT hB Jj Cl diff --git a/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm b/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm index 48844fb46b22..6464c4901fd9 100644 --- a/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm +++ b/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm @@ -37,7 +37,7 @@ /area/ruin/space) "aC" = ( /obj/effect/turf_decal/stripes/red/full, -/obj/machinery/light/small/built, +/obj/machinery/light/small/empty, /obj/item/light/bulb/broken, /turf/open/floor/iron/dark/smooth_large/airless, /area/ruin/space) diff --git a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm index 6965d1acea39..e90910816365 100644 --- a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm +++ b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm @@ -534,7 +534,7 @@ "nM" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "od" = ( /turf/closed/wall/rust, /area/ruin/space/has_grav/the_outlet/storefront) @@ -1566,7 +1566,7 @@ "LA" = ( /obj/item/stack/rods/two, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "LL" = ( /mob/living/basic/construct/proteon/hostile, /obj/effect/decal/cleanable/crayon/rune2, diff --git a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm index 05d7ab995c54..b62a9b01b05d 100644 --- a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm +++ b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm @@ -41,7 +41,6 @@ "cm" = ( /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 }, @@ -223,7 +222,6 @@ /area/ruin/space/has_grav/thelizardsgas) "xy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -234,7 +232,7 @@ desc = "An incredibly bad idea." }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "zn" = ( /obj/structure/rack, /obj/effect/spawner/random/food_or_drink/snack, @@ -377,7 +375,7 @@ /area/ruin/space/has_grav/thelizardsgas) "Kw" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ - dir = 1 + dir = 4 }, /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/plating, diff --git a/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm b/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm index cfb0424aeeeb..e2efec50286e 100644 --- a/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm +++ b/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm @@ -195,7 +195,7 @@ /obj/structure/lattice, /obj/structure/girder, /turf/open/floor/plating/rust/airless, -/area/template_noop) +/area/space/nearstation) "my" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 8 @@ -307,7 +307,7 @@ "rK" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "sb" = ( /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/turretedoutpost) diff --git a/_maps/RandomRuins/SpaceRuins/vaporwave.dmm b/_maps/RandomRuins/SpaceRuins/vaporwave.dmm index c98f09869345..830bd7508ec9 100644 --- a/_maps/RandomRuins/SpaceRuins/vaporwave.dmm +++ b/_maps/RandomRuins/SpaceRuins/vaporwave.dmm @@ -5,7 +5,7 @@ "b" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "c" = ( /obj/structure/lattice, /turf/open/misc/asteroid/airless, diff --git a/_maps/RandomRuins/SpaceRuins/waystation.dmm b/_maps/RandomRuins/SpaceRuins/waystation.dmm index 336c57b1dc86..c950663a8266 100644 --- a/_maps/RandomRuins/SpaceRuins/waystation.dmm +++ b/_maps/RandomRuins/SpaceRuins/waystation.dmm @@ -111,7 +111,7 @@ "dd" = ( /obj/structure/broken_flooring/pile/directional/west, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "dl" = ( /obj/machinery/door/airlock/mining/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -277,7 +277,7 @@ pixel_y = 24 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 + dir = 8 }, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) @@ -285,6 +285,11 @@ /obj/machinery/power/shuttle_engine/propulsion, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/powered/waystation/assaultpod) +"fk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/ruin/space/has_grav/waystation/cargobay) "fm" = ( /obj/machinery/conveyor{ dir = 1; @@ -316,9 +321,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/noticeboard/directional/north{ - dir = 2 - }, +/obj/structure/noticeboard/directional/north, /obj/item/paper/fluff/ruins/waystation/menu, /obj/item/paper/fluff/ruins/waystation/toilet, /turf/open/floor/iron, @@ -563,7 +566,7 @@ "kn" = ( /obj/structure/broken_flooring/pile/directional/north, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "ko" = ( /obj/machinery/door/airlock{ name = "Freezer" @@ -713,7 +716,7 @@ pixel_x = -6; pixel_y = 4 }, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = 7; pixel_y = 9 }, @@ -825,7 +828,7 @@ width = 35 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "nQ" = ( /obj/effect/turf_decal/loading_area{ dir = 1 @@ -864,7 +867,6 @@ pixel_x = 12; pixel_y = 7 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) "or" = ( @@ -1155,6 +1157,13 @@ /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) +"se" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/grille, +/turf/open/floor/plating, +/area/ruin/space/has_grav/waystation/power) "su" = ( /obj/effect/turf_decal/tile/bar{ dir = 1 @@ -1220,6 +1229,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate_abandoned, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) "ux" = ( @@ -1257,7 +1267,7 @@ "vi" = ( /obj/structure/girder, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "vn" = ( /obj/effect/turf_decal/siding/red{ dir = 1 @@ -1325,7 +1335,7 @@ "wf" = ( /obj/item/stack/rods/two, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "wj" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/siding/green, @@ -1381,7 +1391,7 @@ "xi" = ( /obj/structure/broken_flooring/pile/directional/east, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "xq" = ( /obj/machinery/conveyor{ dir = 1; @@ -1499,6 +1509,7 @@ /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) "zd" = ( @@ -1564,6 +1575,14 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) +"AT" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/ruin/space/has_grav/waystation/cargobay) "AW" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -1580,9 +1599,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/noticeboard/directional/west{ - dir = 4 - }, +/obj/structure/noticeboard/directional/west, /obj/item/paper/fluff/ruins/waystation/sop, /obj/structure/cable, /turf/open/floor/iron, @@ -1669,7 +1686,6 @@ /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/dim/directional/west, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) @@ -1700,11 +1716,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/ruin/space/has_grav/waystation) -"Ee" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/waystation/cargobay) "Eh" = ( /obj/effect/turf_decal/tile/brown/half/contrasted, /obj/structure/filingcabinet, @@ -1843,7 +1854,7 @@ }, /obj/effect/mapping_helpers/broken_floor, /obj/item/light/tube/broken, -/obj/machinery/light/built/directional/east, +/obj/machinery/light/empty/directional/east, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargooffice) "HH" = ( @@ -2398,7 +2409,7 @@ /area/ruin/space/has_grav/waystation/cargooffice) "Qx" = ( /obj/structure/table, -/obj/item/stamp, +/obj/item/stamp/granted, /obj/item/stamp/denied{ pixel_x = 8 }, @@ -2525,7 +2536,7 @@ "Tl" = ( /obj/item/shell/airlock, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Tx" = ( /obj/effect/turf_decal/siding/brown{ dir = 8 @@ -2601,7 +2612,9 @@ /turf/closed/wall, /area/ruin/space/has_grav/waystation/cargooffice) "UH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) @@ -4732,7 +4745,7 @@ pK pK Br yg -Mu +se Mu Mu yg @@ -4993,7 +5006,7 @@ Vb Vb Bq jH -Vb +AT Xr rn Vb @@ -5052,11 +5065,11 @@ Jf gu bW Jy -Xa +fk Ko -GI +bW hH -Xa +fk AJ bW kc @@ -5064,7 +5077,7 @@ bW Ko Xa ut -Ee +Xa CN Xa GN @@ -5114,11 +5127,11 @@ LW gu Xa Ko -Xa +fk Kn -GI +bW Kn -Xa +fk CN Xa vy @@ -5126,7 +5139,7 @@ bW Ko bW zc -Ee +Xa Kn Xa zI @@ -5177,8 +5190,8 @@ bW Xa Kn UH -KI -GI +Ko +bW oo fd ka diff --git a/_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm b/_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm index ca8d7627ef73..231a679be864 100644 --- a/_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm +++ b/_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm @@ -5,7 +5,7 @@ "b" = ( /obj/docking_port/stationary/picked/whiteship, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) (1,1,1) = {" a @@ -834,7 +834,7 @@ a a a a -b +a a a a @@ -1244,7 +1244,7 @@ a a a a -a +b a a a diff --git a/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm b/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm index 12bc608bda91..3f430bc63d8d 100644 --- a/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm +++ b/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm @@ -5,7 +5,7 @@ pixel_x = 9 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "aw" = ( /obj/effect/decal/cleanable/glass/plastitanium, /turf/open/floor/mineral/titanium/white/airless, @@ -987,7 +987,7 @@ pixel_x = 8 }, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "FX" = ( /obj/effect/turf_decal/tile/blue/half/contrasted, /obj/machinery/sleeper{ diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index 91c1feb25456..a190ac27e3e1 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -139,9 +139,9 @@ /area/awaymission/cabin) "aE" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/baseturf_helper/asteroid/snow, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/power/turbine/inlet_compressor, /turf/open/floor/plating, /area/awaymission/cabin) "aF" = ( @@ -198,17 +198,10 @@ /turf/open/floor/carpet, /area/awaymission/cabin) "aQ" = ( -/obj/structure{ - anchored = 1; - density = 1; - desc = "Generates power from lava!"; - dir = 1; - icon = 'icons/obj/pipes_n_cables/simple.dmi'; - icon_state = "compressor"; - name = "geothermal generator" - }, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/power/turbine/core_rotor, +/obj/structure/cable, /turf/open/floor/plating, /area/awaymission/cabin) "aR" = ( @@ -701,17 +694,9 @@ /turf/open/floor/plating, /area/awaymission/cabin) "dv" = ( -/obj/structure{ - anchored = 1; - density = 1; - desc = "Generates power from lava!"; - icon = 'icons/obj/pipes_n_cables/simple.dmi'; - icon_state = "turbine"; - name = "geothermal generator" - }, -/obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/power/turbine/turbine_outlet, /turf/open/floor/plating, /area/awaymission/cabin) "dC" = ( @@ -1545,9 +1530,9 @@ /turf/open/floor/carpet, /area/awaymission/cabin/caves/mountain) "hL" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/snow, -/area/awaymission/cabin/caves/mountain) +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/misc/ice/smooth, +/area/awaymission/cabin/caves) "hM" = ( /turf/closed/wall/mineral/snow, /area/awaymission/cabin/caves/mountain) @@ -1674,7 +1659,8 @@ /area/awaymission/cabin/caves) "iP" = ( /obj/structure/sign/picture_frame{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/wood, /area/awaymission/cabin/caves) @@ -2499,8 +2485,11 @@ /turf/closed/indestructible/syndicate, /area/awaymission/cabin/caves/sovietcave) "no" = ( -/obj/structure/sign/warning, -/turf/closed/indestructible/syndicate, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/directional/south, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, /area/awaymission/cabin/caves/sovietcave) "np" = ( /turf/closed/indestructible/fakedoor{ @@ -2857,6 +2846,14 @@ }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"qx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/spider/stickyweb, +/obj/structure/sign/warning/directional/south, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) "qz" = ( /obj/effect/light_emitter{ set_cap = 3; @@ -3602,10 +3599,8 @@ /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." - }, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/sign/poster/contraband/free_drone/directional/west, /turf/open/indestructible, /area/awaymission/cabin/caves/mountain) "yP" = ( @@ -4057,6 +4052,13 @@ }, /turf/open/floor/plating/snowed, /area/awaymission/cabin/snowforest) +"EK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/directional/north, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) "EL" = ( /obj/machinery/light/directional/east, /obj/effect/decal/cleanable/dirt, @@ -4155,6 +4157,10 @@ /obj/structure/flora/tree/pine/style_random, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"Gf" = ( +/obj/structure/sign/poster/official/soft_cap_pop_art/directional/north, +/turf/open/floor/wood, +/area/awaymission/cabin) "Gk" = ( /obj/structure/closet/crate/bin, /obj/machinery/light/small/directional/east, @@ -5109,6 +5115,11 @@ /obj/effect/decal/cleanable/molten_object/large, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) +"SW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/baseturf_helper/asteroid/snow, +/turf/open/floor/plating, +/area/awaymission/cabin) "To" = ( /obj/effect/decal/cleanable/blood/old, /obj/item/hatchet/wooden, @@ -5535,16 +5546,12 @@ /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, +/turf/closed/wall, /area/awaymission/cabin/caves) "Zf" = ( /obj/structure/fence{ @@ -5585,6 +5592,16 @@ /obj/machinery/light/directional/south, /turf/open/floor/wood/freezing, /area/awaymission/cabin/lumbermill) +"ZZ" = ( +/obj/effect/light_emitter{ + name = "cave light"; + set_cap = 3; + set_luminosity = 6; + light_color = "#9bbbff" + }, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/misc/asteroid/snow/snow_cabin, +/area/awaymission/cabin/caves) (1,1,1) = {" ab @@ -17122,7 +17139,7 @@ vh vh vh Zb -Su +ZZ oz oz oz @@ -18921,7 +18938,7 @@ vh vh vh Zb -Su +ZZ oz oz oz @@ -29131,8 +29148,8 @@ Yp aA jj an -eg aq +eg an cN aq @@ -29388,8 +29405,8 @@ an an an an -ct -aq +Gf +eg an jE aq @@ -29645,8 +29662,8 @@ sG au ji an -eg -bh +aq +ht an cO cO @@ -36321,7 +36338,7 @@ vh xt an aw -ed +SW ed hv an @@ -48293,12 +48310,12 @@ gx gx gx gx +hM hL PV PV PV PV -PV Oe Oe Oe @@ -49321,12 +49338,12 @@ gx gx gx gx +hM hL PV PV PV PV -PV gx gx gx @@ -68760,10 +68777,10 @@ gx gx gx gx +ii +EK no -im -im -no +ii gx gx gx @@ -69274,10 +69291,10 @@ gx gx gx gx -no -im -lS -no +ii +EK +qx +ii gx gx gx diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/TheBeach.dmm index 6b29a5e2fc52..cc06de9ed5dc 100644 --- a/_maps/RandomZLevels/TheBeach.dmm +++ b/_maps/RandomZLevels/TheBeach.dmm @@ -93,7 +93,7 @@ /turf/open/floor/wood, /area/awaymission/beach) "bg" = ( -/obj/structure/no_effect_signpost{ +/obj/structure/signpost{ pixel_y = 6; desc = "Northwest: Hotel. South: Seaside Bar. East: Dressing Rooms." }, diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 9891aa74685e..f3f34b78b3f5 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -152,7 +152,7 @@ /area/awaymission/caves/bmp_asteroid/level_four) "ba" = ( /obj/structure/table/wood/fancy, -/obj/item/clothing/gloves/krav_maga/combatglovesplus, +/obj/item/clothing/gloves/kaza_ruk/combatglovesplus, /turf/open/floor/engine/cult, /area/awaymission/caves/bmp_asteroid/level_four) "bf" = ( @@ -1038,7 +1038,7 @@ /turf/open/misc/asteroid/basalt, /area/awaymission/caves/bmp_asteroid) "nw" = ( -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/structure/spider/stickyweb, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid/level_two) @@ -1149,7 +1149,7 @@ desc = "A warning sign which warns of potential mech traffic to and from different levels of the mine."; name = "\improper MECH TUNNEL PASSAGE A2 TO B1" }, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /turf/open/misc/asteroid/basalt, /area/awaymission/caves/bmp_asteroid/level_two) "vR" = ( @@ -1190,7 +1190,7 @@ "yS" = ( /obj/structure/closet/crate, /obj/item/paper/fluff/awaymissions/caves/shipment_receipt, -/obj/item/gun/energy/laser, +/obj/item/gun/energy/laser/soul, /obj/item/slimepotion/fireproof, /obj/item/slimepotion/fireproof, /obj/item/clothing/glasses/thermal, @@ -1314,7 +1314,7 @@ /turf/open/floor/iron, /area/awaymission/caves/research) "FS" = ( -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/structure/spider/stickyweb, /mob/living/basic/spider/giant/hunter/away_caves, /turf/open/floor/iron, @@ -1324,7 +1324,7 @@ /turf/open/misc/asteroid/basalt, /area/awaymission/caves/bmp_asteroid/level_two) "Gt" = ( -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/machinery/suit_storage_unit/mining{ desc = "An industrial unit made to hold space suits. Age has seemed to rust the sliding door mechanisms, making it difficult to open."; name = "rusted suit storage unit" @@ -1347,7 +1347,7 @@ /turf/open/floor/iron, /area/awaymission/caves/research) "IE" = ( -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/structure/sign/warning/pods/directional/east{ desc = "A warning sign which warns of potential mech traffic to and from different levels of the mine."; name = "\improper MECH TUNNEL PASSAGE B1 TO A2" @@ -1397,7 +1397,7 @@ /turf/open/misc/asteroid/basalt, /area/awaymission/caves/bmp_asteroid/level_two) "Mk" = ( -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /turf/open/floor/wood, /area/awaymission/caves/northblock) "Mq" = ( @@ -1453,7 +1453,7 @@ }, /area/awaymission/caves/bmp_asteroid) "PS" = ( -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /obj/machinery/suit_storage_unit/mining{ desc = "An industrial unit made to hold space suits. Age has seemed to rust the sliding door mechanisms, making it difficult to open."; name = "rusted suit storage unit" diff --git a/_maps/RandomZLevels/heretic.dmm b/_maps/RandomZLevels/heretic.dmm new file mode 100644 index 000000000000..f69126634259 --- /dev/null +++ b/_maps/RandomZLevels/heretic.dmm @@ -0,0 +1,75414 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/machinery/vending/sustenance, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"af" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"ah" = ( +/obj/structure/statue/uranium/nuke, +/turf/open/floor/mineral/uranium, +/area/awaymission/beach/heretic) +"ai" = ( +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"ak" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"al" = ( +/obj/item/radio/intercom/mi13/directional/north, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"am" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/admin, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"an" = ( +/obj/machinery/light/directional/west, +/obj/structure/closet/crate/secure/weapon{ + name = "p90 ammo crate" + }, +/obj/item/stack/sheet/cardboard/fifty, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"ao" = ( +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack{ + pixel_y = 9; + pixel_x = 15; + anchored = 1; + name = "Sam Site Missle rack" + }, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"aq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/door_assembly/door_assembly_material, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"ar" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"as" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/heretic_gateway_low, +/turf/open/floor/carpet/green, +/area/awaymission/beach/heretic) +"au" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"aw" = ( +/obj/structure/fluff/tram_rail, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"ay" = ( +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"az" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"aA" = ( +/obj/structure/table, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"aB" = ( +/obj/item/kirbyplants/organic/plant10, +/obj/effect/turf_decal/tile/green, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"aC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"aD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"aE" = ( +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"aF" = ( +/obj/structure/filingcabinet, +/obj/structure/filingcabinet{ + pixel_x = 10; + pixel_y = 0 + }, +/obj/structure/filingcabinet{ + pixel_x = -10; + pixel_y = 0 + }, +/turf/open/floor/carpet/green, +/area/awaymission/caves/heretic_laboratory) +"aK" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/pod/dark, +/area/awaymission/beach/heretic) +"aL" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/thermoplastic/light, +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/obj/structure/chair/sofa/bench/tram/solo{ + dir = 8 + }, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"aM" = ( +/obj/structure/fluff/bus/dense, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"aO" = ( +/obj/machinery/door/airlock{ + name = "Guest Room" + }, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"aP" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/machinery/camera/xray/directional/east, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"aQ" = ( +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"aR" = ( +/obj/machinery/power/rtg/lavaland, +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"aV" = ( +/obj/structure/table, +/obj/item/storage/toolbox/syndicate, +/obj/item/trench_tool, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"aW" = ( +/obj/structure/table/reinforced, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/glass/shaker{ + pixel_x = -6 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"ba" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"bb" = ( +/obj/machinery/computer/records/security{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/awaymission/beach/heretic) +"bc" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"be" = ( +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"bf" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"bi" = ( +/obj/effect/landmark/transport/nav_beacon/tram/platform/heretic/left, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"bl" = ( +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/trash/food_packaging, +/obj/structure/closet/crate/secure/trashcart/filled, +/turf/open/floor/plating/airless, +/area/awaymission/caves/heretic_laboratory_clean) +"bn" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"bq" = ( +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"br" = ( +/obj/item/bedsheet/black/double{ + dir = 4; + pixel_x = 0; + pixel_y = 2 + }, +/obj/structure/bed/double{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"bt" = ( +/obj/effect/turf_decal/tile/bar/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"bu" = ( +/mob/living/basic/trooper/nanotrasen/peaceful, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"bv" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"by" = ( +/obj/structure/fence, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"bA" = ( +/obj/structure/table, +/obj/item/binoculars, +/obj/item/binoculars, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"bB" = ( +/turf/closed/mineral/ash_rock, +/area/awaymission/beach/heretic) +"bG" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"bH" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"bJ" = ( +/obj/machinery/light/directional/north, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"bN" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"bP" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"bR" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"bT" = ( +/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, +/area/awaymission/caves/heretic_laboratory) +"bZ" = ( +/obj/machinery/door/airlock/multi_tile{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"cb" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "p"; + pixel_x = -8; + pixel_y = 1 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"ce" = ( +/obj/effect/turf_decal/siding/blue/corner, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"ci" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"cj" = ( +/mob/living/basic/heretic_summon/stalker, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"ck" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 6 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"cl" = ( +/turf/open/misc/beach/coast{ + dir = 9 + }, +/area/awaymission/caves/heretic_laboratory_clean) +"cp" = ( +/obj/effect/decal/cleanable/blood/tracks/xeno{ + dir = 10 + }, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"cq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"cs" = ( +/obj/machinery/quantum_server, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"ct" = ( +/obj/structure/closet/secure_closet/freezer/fridge/open, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"cw" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/stack/sheet/iron/fifty{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"cy" = ( +/obj/structure/table, +/obj/item/healthanalyzer, +/obj/item/healthanalyzer, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/gauze, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"cz" = ( +/obj/structure/holosign/barrier/atmos/sturdy, +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"cC" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"cF" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/mecha_wreckage/ripley/mk2, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"cI" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/door/puzzle/keycard/heretic_entrance, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"cK" = ( +/obj/effect/turf_decal/tile/bar/anticorner/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"cL" = ( +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"cN" = ( +/obj/structure/closet/cabinet, +/obj/effect/turf_decal/tile/bar/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"cO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible{ + dir = 5 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"cP" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"cQ" = ( +/turf/closed/wall/rock, +/area/awaymission/caves/heretic_laboratory) +"cR" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/effect/turf_decal/weather/sand{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"cT" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/dresser, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"cV" = ( +/obj/structure/frame/machine/secured, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"cX" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"db" = ( +/obj/machinery/vending/games, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"dd" = ( +/obj/effect/spawner/random/trash/cigbutt, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"de" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"df" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/spawner/random/structure/shipping_container, +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"dj" = ( +/mob/living/basic/construct/proteon, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/bar/fourcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"dk" = ( +/obj/machinery/teleport/station{ + name = "Forcefield generator" + }, +/turf/open/floor/plating/airless, +/area/awaymission/caves/heretic_laboratory_clean) +"dl" = ( +/obj/item/stack/sheet/mineral/sandbags, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"dm" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ + dir = 8 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"do" = ( +/obj/machinery/door/airlock, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"dp" = ( +/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 = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"dr" = ( +/obj/structure/table, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"du" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"dw" = ( +/obj/machinery/light/directional/west, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory_clean) +"dy" = ( +/obj/structure/table, +/obj/machinery/light/floor, +/obj/item/gun/magic/midas_hand, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"dA" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/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, +/turf/open/indestructible/plating, +/area/awaymission/caves/heretic_laboratory) +"dC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"dD" = ( +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"dF" = ( +/obj/machinery/light/very_dim/directional/east, +/obj/machinery/suit_storage_unit/industrial, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"dG" = ( +/obj/machinery/disposal/delivery_chute{ + name = "EXTREMELY hazardous waste disposal chute" + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/end, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"dI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"dL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"dO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"dP" = ( +/obj/structure/fence/corner{ + dir = 8 + }, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"dR" = ( +/turf/open/misc/beach/coast/corner{ + dir = 8 + }, +/area/awaymission/beach/heretic) +"dS" = ( +/obj/machinery/power/rtg/lavaland, +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"dU" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/spawner/surgery_tray/full, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"dW" = ( +/obj/machinery/atmospherics/miner/nitrogen, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"dX" = ( +/obj/machinery/camera/xray/directional/south, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"dY" = ( +/obj/structure/bookcase/random, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"eg" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/security, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/puzzle/keycard/highsec_access, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"eh" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"ek" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"el" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/obj/effect/turf_decal/siding/blue, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"eo" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/admin, +/obj/machinery/door/puzzle/keycard/biological_anomalies, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"ep" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/machinery/door/puzzle/keycard/misc_anomalies, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"eq" = ( +/obj/structure/table, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"et" = ( +/obj/structure/table, +/obj/item/storage/toolbox/electrical, +/obj/item/storage/toolbox/electrical{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"ev" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/closed/indestructible/reinforced, +/area/awaymission/caves/heretic_laboratory) +"ew" = ( +/obj/item/radio/intercom/mi13/directional/west, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"ey" = ( +/obj/structure/railing{ + dir = 9 + }, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"eB" = ( +/obj/structure/filingcabinet, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"eE" = ( +/obj/machinery/door/airlock{ + name = "Kitchen" + }, +/obj/effect/mapping_helpers/airlock/access/all/service, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"eH" = ( +/obj/structure/fluff/tram_rail, +/obj/effect/turf_decal/delivery, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"eJ" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"eK" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"eM" = ( +/obj/machinery/computer/operating/oldstation{ + dir = 8 + }, +/turf/open/floor/stone, +/area/awaymission/beach/heretic) +"eN" = ( +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"eQ" = ( +/obj/machinery/light/directional/east, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"eS" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/bar/half/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"eT" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"eW" = ( +/obj/structure/table, +/obj/item/ammo_box/magazine/m7mm, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory_clean) +"eY" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "j"; + pixel_x = -14; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "u"; + pixel_x = -4; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "m"; + pixel_x = 10; + pixel_y = 1 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"fb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/cafeteria, +/area/awaymission/caves/heretic_laboratory_clean) +"fg" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/thinplating/dark, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"fh" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Beachside Inn" + }, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"fk" = ( +/obj/effect/mapping_helpers/airlock/access/all/admin, +/obj/machinery/door/airlock/virology, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"fl" = ( +/obj/structure/projected_forcefield, +/obj/effect/oneway, +/turf/open/floor/mineral/titanium, +/area/awaymission/caves/heretic_laboratory_clean) +"fm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"fo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/trash/grime, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"fp" = ( +/obj/machinery/door/airlock/virology, +/obj/machinery/door/puzzle/keycard/cbrn_area, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"fq" = ( +/obj/machinery/vending/hotdog, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"fu" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/effect/turf_decal/siding/blue/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/blue/corner, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"fw" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/admin/captain, +/obj/machinery/door/puzzle/keycard/weapon_anomalies, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"fx" = ( +/obj/machinery/door/airlock/highsecurity, +/obj/effect/mapping_helpers/airlock/access/all/away/general, +/turf/open/floor/iron/checker, +/area/awaymission/caves/heretic_laboratory) +"fz" = ( +/obj/structure/table, +/obj/item/paper/fluff/awaymissions/heretic/floorsafe, +/obj/item/clothing/neck/stethoscope, +/turf/open/floor/iron/cafeteria, +/area/awaymission/caves/heretic_laboratory_clean) +"fA" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/security, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"fB" = ( +/obj/structure/closet/secure_closet/security/sec, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"fC" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"fD" = ( +/obj/machinery/telecomms/processor, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"fE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ + dir = 5 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"fF" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Dorms" + }, +/obj/effect/mapping_helpers/airlock/access/all/away/general, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"fH" = ( +/obj/machinery/light/floor, +/obj/structure/table, +/obj/item/fake_items/feddy_fazbear, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"fI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock{ + name = "Personal Dorm" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply, +/obj/machinery/door/puzzle/keycard/highsec_access, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"fJ" = ( +/obj/machinery/light/small/directional/south, +/obj/item/kirbyplants/random, +/turf/open/floor/carpet/green, +/area/awaymission/beach/heretic) +"fK" = ( +/obj/structure/table, +/obj/item/stack/sticky_tape{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/item/stack/sticky_tape{ + pixel_x = -6; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"fL" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/carpet/green, +/area/awaymission/beach/heretic) +"fM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"fP" = ( +/obj/item/stack/sheet/mineral/uranium, +/obj/item/coin/uranium, +/obj/item/coin/uranium, +/obj/item/coin/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/coin/uranium, +/obj/item/stack/ore/uranium, +/obj/item/reagent_containers/cup/bottle/radium, +/obj/structure/closet/crate/wooden, +/obj/item/nuke_core{ + anchored = 1 + }, +/turf/open/floor/mineral/uranium, +/area/awaymission/beach/heretic) +"fR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"fV" = ( +/obj/effect/turf_decal/tile/bar/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"fW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"fX" = ( +/obj/item/stack/cable_coil/thirty, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"fY" = ( +/obj/structure/closet/crate/grave, +/obj/effect/spawner/random/heretic_gateway, +/turf/open/misc/dirt/jungle, +/area/awaymission/beach/heretic) +"fZ" = ( +/obj/structure/flora/tree/jungle/style_random, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"ga" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, +/obj/structure/transport/linear/tram, +/obj/structure/thermoplastic/light, +/obj/machinery/computer/tram_controls/heretic_tram_computer{ + icon_state = "tram_alt_controls"; + dir = 8 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"gb" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/door/window/right/directional/west, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"gd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"gg" = ( +/obj/item/coin/uranium, +/obj/item/coin/uranium, +/obj/item/coin/uranium, +/obj/item/coin/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/coin/uranium, +/obj/item/stack/ore/uranium, +/obj/item/reagent_containers/cup/bottle/radium, +/obj/structure/closet/crate/wooden, +/obj/item/nuke_core{ + anchored = 1 + }, +/turf/open/floor/mineral/uranium, +/area/awaymission/beach/heretic) +"gh" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"gi" = ( +/obj/effect/heretic_rune/big, +/mob/living/basic/faithless, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"gj" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/closed/indestructible/reinforced, +/area/awaymission/caves/heretic_laboratory_clean) +"gm" = ( +/turf/open/floor/wood/parquet, +/area/awaymission/caves/heretic_laboratory) +"gp" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"gq" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"gr" = ( +/obj/effect/turf_decal/delivery, +/obj/item/stack/sheet/mineral/wood, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"gs" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/barricade/security, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"gt" = ( +/obj/structure/closet/firecloset/full, +/turf/open/indestructible/plating, +/area/awaymission/caves/heretic_laboratory) +"gu" = ( +/obj/structure/flora/rock/pile/style_random, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"gv" = ( +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/east, +/obj/structure/flora/bush/jungle/c/style_random, +/turf/open/misc/grass/jungle, +/area/awaymission/caves/heretic_laboratory) +"gw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/button/transport/tram{ + specific_transport_id = "heretic_1"; + pixel_y = 8; + id = 2 + }, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"gx" = ( +/obj/structure/mop_bucket, +/obj/effect/spawner/random/trash/bucket, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/mop/advanced, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"gy" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/structure/holosign/barrier/atmos/sturdy, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"gz" = ( +/obj/effect/decal/remains/xeno, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"gA" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/carpet/green, +/area/awaymission/beach/heretic) +"gB" = ( +/obj/structure/dresser, +/turf/open/floor/carpet/purple, +/area/awaymission/caves/heretic_laboratory) +"gC" = ( +/obj/structure/table, +/obj/machinery/recharger, +/turf/open/floor/pod/dark, +/area/awaymission/beach/heretic) +"gF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"gI" = ( +/obj/machinery/door/window/survival_pod/left/directional/east, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"gJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar/fourcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"gK" = ( +/turf/open/misc/beach/coast{ + dir = 8 + }, +/area/awaymission/beach/heretic) +"gN" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"gO" = ( +/obj/structure/bodycontainer/crematorium{ + id = "crematoriumchapel"; + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"gQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/barricade/security, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"gS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/obj/structure/door_assembly/door_assembly_highsecurity, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"gT" = ( +/obj/machinery/computer/crew{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/awaymission/beach/heretic) +"gU" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/item/toy/plush/moth, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"gW" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"gX" = ( +/obj/machinery/vending/sustenance, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"gY" = ( +/obj/machinery/conveyor/auto{ + dir = 9 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"ha" = ( +/obj/effect/decal/remains/robot, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"hb" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"hc" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"hd" = ( +/obj/structure/table/wood/fancy, +/obj/item/flashlight/flare/candle/infinite, +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"he" = ( +/obj/structure/sign/poster/contraband/communist_state/directional/west, +/obj/effect/spawner/random/trash/moisture_trap, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"hf" = ( +/obj/structure/fluff/bus/passable/seat{ + pixel_y = 15 + }, +/turf/open/floor/iron/dark, +/area/awaymission/beach/heretic) +"hg" = ( +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"hi" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"hk" = ( +/turf/open/misc/beach/coast{ + dir = 4 + }, +/area/awaymission/beach/heretic) +"ho" = ( +/obj/structure/table/glass, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/mesh, +/obj/effect/turf_decal/siding{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/white/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"hp" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"hq" = ( +/obj/structure/flora/tree/palm/style_random, +/obj/structure/flora/coconuts, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"hr" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/transport/tram{ + specific_transport_id = "heretic_1"; + pixel_y = 8; + id = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"hs" = ( +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"hu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/obj/structure/dresser, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"hv" = ( +/obj/machinery/light/directional/north, +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"hB" = ( +/mob/living/basic/crab, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"hC" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/door/puzzle/keycard/heretic_entrance, +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"hD" = ( +/obj/structure/table, +/obj/machinery/light/floor, +/obj/item/gun/energy/dueling, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"hE" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"hF" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"hG" = ( +/obj/structure/flora/tree/palm/style_random, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"hI" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/vending/snack, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"hJ" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"hK" = ( +/obj/structure/table/wood/fancy, +/obj/item/plate/oven_tray, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"hL" = ( +/obj/machinery/light/directional/south, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/awaymission/beach/heretic) +"hM" = ( +/obj/machinery/door/airlock{ + name = "Employees Only"; + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"hQ" = ( +/obj/structure/table, +/turf/open/floor/wood/parquet, +/area/awaymission/caves/heretic_laboratory) +"hS" = ( +/obj/effect/decal/cleanable/blood/tracks/xeno{ + dir = 6 + }, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"hU" = ( +/obj/machinery/autolathe, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"hV" = ( +/obj/machinery/door/airlock/wood{ + name = "Beach Bar" + }, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"hX" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"hY" = ( +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"ia" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"id" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"ie" = ( +/obj/item/bedsheet/black/double{ + pixel_x = 0; + pixel_y = 6 + }, +/obj/structure/bed/double, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"if" = ( +/obj/machinery/cryo_cell{ + dir = 4 + }, +/turf/open/floor/iron/white/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"ig" = ( +/obj/structure/fluff/bus/passable{ + icon_state = "bottomdoor" + }, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"ih" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/dark_green, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"ij" = ( +/obj/structure/table/bronze, +/obj/item/flashlight/lamp/green, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"ik" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"il" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/transport/linear/tram, +/obj/structure/thermoplastic/light, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"im" = ( +/obj/item/mop/advanced, +/obj/structure/closet, +/obj/item/reagent_containers/cup/bottle/water, +/obj/item/reagent_containers/cup/glass/waterbottle/large, +/obj/item/stock_parts/water_recycler, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"in" = ( +/obj/structure/window/spawner/directional/west, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/south, +/obj/structure/flora/bush/jungle/c/style_random, +/turf/open/misc/grass/jungle, +/area/awaymission/caves/heretic_laboratory) +"ip" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"iu" = ( +/obj/machinery/light/floor, +/turf/closed/wall/mineral/titanium, +/area/awaymission/beach/heretic) +"iw" = ( +/obj/effect/turf_decal/trimline/red/filled/end, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"ix" = ( +/obj/structure/window/spawner/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"iz" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"iB" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/table, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"iC" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"iD" = ( +/mob/living/basic/heretic_summon/fire_shark/wild, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/dark_green/fourcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"iF" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"iH" = ( +/obj/structure/closet/secure_closet, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"iI" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/closet/cabinet, +/obj/effect/spawner/random/heretic_gateway_low, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"iJ" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medical Freezer" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/medical, +/turf/open/floor/iron/freezer, +/area/awaymission/caves/heretic_laboratory) +"iL" = ( +/obj/structure/fluff/tram_rail/anchor{ + dir = 1 + }, +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/thermoplastic/light, +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"iN" = ( +/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 = 1 + }, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"iO" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"iP" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"iQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/blessing/invisible, +/turf/open/floor/catwalk_floor/iron_dark, +/area/awaymission/caves/heretic_laboratory) +"iR" = ( +/obj/structure/fluff/tram_rail/end, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"iS" = ( +/obj/structure/transport/linear/tram, +/obj/structure/thermoplastic/light, +/obj/machinery/transport/tram_controller/heretic_tram_controller, +/obj/structure/tram, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"iU" = ( +/obj/item/bedsheet{ + pixel_x = 19; + pixel_y = 0 + }, +/obj/structure/bed{ + pixel_x = 17; + pixel_y = 0 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"iW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"iX" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"iZ" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "p"; + pixel_x = -8; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"ja" = ( +/obj/effect/turf_decal/tile/bar/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"jc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark/half{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"je" = ( +/obj/structure/fluff/tram_rail, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/remains/human, +/obj/structure/reagent_dispensers/fueltank/large{ + max_integrity = 1; + name = "Extremely fragile high capacity fuel tank" + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"jf" = ( +/obj/structure/fluff/tram_rail/anchor{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"jg" = ( +/obj/machinery/door/airlock/highsecurity, +/obj/effect/mapping_helpers/airlock/access/all/security, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"ji" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/turf/open/floor/plating/airless, +/area/awaymission/caves/heretic_laboratory_clean) +"jj" = ( +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"jk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"jo" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/holosign/barrier/engineering, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"jq" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/structure/holosign/barrier/atmos/tram, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"js" = ( +/obj/machinery/door/airlock{ + name = "Showers" + }, +/turf/open/floor/iron/freezer, +/area/awaymission/caves/heretic_laboratory) +"ju" = ( +/obj/structure/table/wood, +/obj/machinery/light/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/carpet/purple, +/area/awaymission/caves/heretic_laboratory) +"jx" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"jy" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/cafeteria, +/area/awaymission/caves/heretic_laboratory_clean) +"jz" = ( +/obj/effect/gibspawner/human, +/turf/open/misc/beach/sand, +/area/awaymission/caves/heretic_laboratory_clean) +"jF" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"jG" = ( +/obj/effect/mob_spawn/corpse/human, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"jK" = ( +/obj/machinery/power/smes/magical{ + desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; + name = "power storage unit" + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"jO" = ( +/obj/machinery/vending/medical, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"jP" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"jQ" = ( +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"jS" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/turf/open/floor/iron/cafeteria, +/area/awaymission/caves/heretic_laboratory_clean) +"jT" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"jU" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"jV" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/effect/decal/remains/robot, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"jW" = ( +/obj/effect/turf_decal/tile/dark/half{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"jX" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/water/deep_beach, +/area/awaymission/beach/heretic) +"jY" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/remains/robot, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"jZ" = ( +/turf/open/floor/iron/freezer, +/area/awaymission/caves/heretic_laboratory) +"kc" = ( +/obj/machinery/power/rtg/lavaland, +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"kd" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, +/obj/structure/chair/sofa/bench/tram/solo{ + dir = 4 + }, +/obj/structure/transport/linear/tram, +/obj/structure/thermoplastic/light, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"kf" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"kg" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 8 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"kj" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"kk" = ( +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/north, +/obj/structure/flora/bush/jungle/c/style_random, +/turf/open/misc/grass/jungle, +/area/awaymission/caves/heretic_laboratory) +"kl" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/light_emitter/fake_outdoors, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"km" = ( +/obj/machinery/door/airlock/highsecurity, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"kn" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"ko" = ( +/obj/item/stack/sheet/mineral/uranium, +/obj/item/nuke_core{ + anchored = 1 + }, +/obj/item/coin/uranium, +/obj/item/coin/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/coin/uranium, +/obj/item/stack/ore/uranium, +/obj/item/toy/brokenradio, +/obj/structure/closet/crate/wooden, +/turf/open/floor/mineral/uranium, +/area/awaymission/beach/heretic) +"kr" = ( +/turf/open/floor/stone, +/area/awaymission/beach/heretic) +"kw" = ( +/obj/machinery/light/very_dim/directional/west, +/obj/structure/chair/comfy/shuttle/tactical, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"kz" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/item/radio/intercom/mi13/directional/east, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"kD" = ( +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"kE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"kF" = ( +/obj/item/flashlight/flare/candle/infinite, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"kG" = ( +/obj/structure/sink{ + pixel_y = 15 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"kH" = ( +/obj/structure/chair/sofa/bench/right, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"kI" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/effect/turf_decal/stripes, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"kK" = ( +/obj/machinery/light/floor, +/obj/item/slimepotion/genderchange, +/obj/structure/closet/crate/freezer, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"kO" = ( +/obj/structure/table, +/obj/item/fake_items/l6_saw, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory_clean) +"kQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory_clean) +"kR" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"kV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"kW" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Grocery Store"; + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"kX" = ( +/obj/structure/sign/poster/abductor/ayy_recruitment/directional/south, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"ld" = ( +/obj/structure/closet/crate/secure/weapon{ + name = "p90 ammo crate" + }, +/obj/item/ammo_box/magazine/napad, +/obj/item/ammo_box/magazine/napad, +/obj/item/ammo_box/magazine/napad, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"lh" = ( +/obj/effect/spawner/random/heretic_gateway_low, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"lj" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/medicine, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"lm" = ( +/turf/closed/mineral/ash_rock, +/area/awaymission/caves/heretic_laboratory) +"lo" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"ls" = ( +/obj/machinery/vending/sustenance, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"lt" = ( +/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/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"lu" = ( +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory_clean) +"lv" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"lx" = ( +/mob/living/basic/construct/juggernaut, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/bar/fourcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"lz" = ( +/obj/effect/decal/cleanable/plasma, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"lA" = ( +/obj/item/radio/intercom/mi13/directional/north, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"lB" = ( +/obj/machinery/autolathe, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"lC" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/admin/captain, +/obj/machinery/door/puzzle/keycard/misc_anomalies, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"lD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/carpet/purple, +/area/awaymission/caves/heretic_laboratory) +"lE" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"lH" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/effect/mapping_helpers/damaged_window, +/obj/effect/blessing/invisible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"lJ" = ( +/obj/effect/turf_decal/tile/dark_green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"lK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"lL" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/bananalamp, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"lO" = ( +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"lV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"lW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"lX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"lY" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/turf_decal/tile/bar/anticorner/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"lZ" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"ma" = ( +/obj/effect/decal/remains/human, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"mc" = ( +/obj/structure/sink{ + dir = 8; + pixel_y = 1; + pixel_x = 13 + }, +/turf/open/floor/iron/white, +/area/awaymission/beach/heretic) +"md" = ( +/obj/machinery/shieldgen, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"me" = ( +/obj/machinery/light/floor, +/obj/structure/closet/crate/freezer, +/obj/item/organ/heart/gland, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"mg" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/light/directional/south, +/obj/item/radio/intercom/mi13/directional/south, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"mi" = ( +/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/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"mj" = ( +/obj/structure/fence/door, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"mm" = ( +/obj/structure/table, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"mn" = ( +/obj/structure/fence/door{ + dir = 8 + }, +/turf/open/misc/dirt/jungle, +/area/awaymission/beach/heretic) +"mo" = ( +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"mq" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"mt" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"mu" = ( +/obj/structure/bed, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"mv" = ( +/turf/open/misc/beach/sand, +/area/awaymission/caves/heretic_laboratory_clean) +"mC" = ( +/obj/machinery/power/rtg/lavaland, +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"mE" = ( +/obj/structure/bodycontainer/morgue/beeper_off, +/turf/open/floor/iron/dark/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"mF" = ( +/obj/machinery/vending/drugs, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"mG" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"mH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/curtain, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"mI" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"mJ" = ( +/obj/machinery/suit_storage_unit/open, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory_clean) +"mL" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"mM" = ( +/turf/open/water/jungle, +/area/awaymission/beach/heretic) +"mN" = ( +/obj/structure/fluff/tram_rail/anchor, +/obj/structure/holosign/barrier/atmos/tram, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"mO" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/open/floor/iron/cafeteria, +/area/awaymission/caves/heretic_laboratory_clean) +"mR" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"mS" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/structure/curtain, +/turf/open/floor/iron/freezer, +/area/awaymission/caves/heretic_laboratory) +"mT" = ( +/obj/structure/closet/secure_closet/freezer/meat, +/turf/open/floor/iron/cafeteria, +/area/awaymission/caves/heretic_laboratory_clean) +"mV" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"mW" = ( +/obj/structure/flora/rock/pile/jungle/large/style_random, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"mX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"mY" = ( +/obj/effect/turf_decal/trimline/blue/end{ + dir = 8 + }, +/turf/open/floor/iron/white/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"mZ" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/toxin, +/obj/item/storage/medkit/toxin, +/turf/open/floor/pod/dark, +/area/awaymission/beach/heretic) +"na" = ( +/obj/structure/flora/bush/jungle/a/style_random, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"nb" = ( +/turf/closed/wall, +/area/awaymission/caves/heretic_laboratory) +"nd" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/door/puzzle/keycard/cbrn_area, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"ne" = ( +/obj/item/seeds/cherry/bomb, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"ng" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible, +/obj/machinery/door/airlock/maintenance, +/turf/open/indestructible/plating, +/area/awaymission/caves/heretic_laboratory) +"nh" = ( +/obj/machinery/conveyor/auto{ + dir = 6 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"ni" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"nj" = ( +/obj/structure/rack, +/obj/item/stack/sheet/mineral/coal/ten, +/obj/item/stack/sheet/mineral/coal/ten, +/obj/item/stack/sheet/mineral/coal/ten, +/obj/item/stack/sheet/mineral/coal/ten, +/obj/item/stack/sheet/mineral/coal/ten, +/obj/item/stack/sheet/mineral/coal/ten, +/obj/item/stack/sheet/mineral/coal/ten, +/obj/item/stack/sheet/mineral/coal/ten, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"nk" = ( +/obj/structure/flora/tree/palm, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"np" = ( +/obj/structure/sign/poster/contraband/arc_slimes/directional/east, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"nr" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/bed, +/obj/item/bedsheet/black, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"nv" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"nw" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/item/radio/intercom/mi13/directional/west, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"ny" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"nz" = ( +/obj/structure/frame/machine/secured, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"nD" = ( +/obj/structure/projected_forcefield, +/obj/effect/oneway{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/awaymission/caves/heretic_laboratory_clean) +"nE" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"nF" = ( +/obj/structure/closet/secure_closet/medical2, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"nG" = ( +/obj/structure/dresser, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"nI" = ( +/turf/open/water/deep_beach, +/area/awaymission/beach/heretic) +"nJ" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/barricade/wooden, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"nL" = ( +/obj/machinery/shieldgen, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"nM" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/awaymission/beach/heretic) +"nN" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"nO" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet/green, +/area/awaymission/beach/heretic) +"nP" = ( +/obj/item/paper/fluff/old_pirate_note{ + pixel_x = -5; + pixel_y = -7 + }, +/obj/item/pen/fountain{ + pixel_y = -11; + pixel_x = -8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"nQ" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"nR" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing, +/obj/effect/turf_decal/stripes, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/machinery/shieldgen, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"nT" = ( +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"nV" = ( +/obj/machinery/teleport/station{ + name = "Forcefield generator" + }, +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"ob" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"oc" = ( +/obj/machinery/door/airlock/public/glass{ + name = "General Store"; + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"od" = ( +/obj/machinery/conveyor/auto, +/obj/item/toy/plush/moth, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"oe" = ( +/obj/effect/turf_decal/delivery, +/obj/item/stack/sheet/mineral/wood, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/structure/holosign/barrier/atmos/tram, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"oi" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/supply, +/obj/machinery/door/puzzle/keycard/heretic_entrance, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"oj" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/sand{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"ol" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/mob/living/basic/trooper/nanotrasen/ranged/smg/peaceful, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"om" = ( +/obj/structure/table, +/obj/machinery/light/small/directional/south, +/obj/structure/bedsheetbin, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"oo" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"op" = ( +/obj/item/bedsheet/black/double{ + pixel_x = 0; + pixel_y = 2 + }, +/obj/machinery/light/floor, +/obj/machinery/light/directional/east, +/obj/structure/bed/double, +/obj/effect/blessing/invisible, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"os" = ( +/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/heretic) +"ov" = ( +/obj/structure/closet/secure_closet/medical2, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/effect/spawner/random/heretic_gateway_low, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"oz" = ( +/obj/structure/rack, +/obj/item/gun/energy/disabler/smg, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"oC" = ( +/obj/machinery/pdapainter, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"oD" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"oF" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "p"; + pixel_x = -8; + pixel_y = 1 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"oI" = ( +/obj/effect/mapping_helpers/airlock/access/all/service, +/obj/machinery/door/airlock/glass{ + name = "Bar" + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"oL" = ( +/obj/effect/turf_decal/tile/dark_green/half{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"oN" = ( +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"oO" = ( +/obj/machinery/conveyor/auto{ + dir = 5 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"oP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"oQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"oS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"oW" = ( +/obj/structure/filingcabinet{ + pixel_x = -6; + pixel_y = 0 + }, +/obj/structure/filingcabinet{ + pixel_x = 3; + pixel_y = 0 + }, +/obj/structure/filingcabinet{ + pixel_x = -15; + pixel_y = 0 + }, +/obj/structure/filingcabinet{ + pixel_x = 12; + pixel_y = 0 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"pa" = ( +/obj/item/stack/sheet/runed_metal/five, +/turf/open/misc/beach/sand, +/area/awaymission/caves/heretic_laboratory_clean) +"pb" = ( +/obj/machinery/door/poddoor/shutters/window/indestructible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory_clean) +"pc" = ( +/obj/effect/decal/cleanable/glass/plastitanium, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"pd" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory) +"pe" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/cafeteria, +/area/awaymission/caves/heretic_laboratory_clean) +"pf" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/item/mop/advanced, +/obj/effect/spawner/random/structure/closet_empty, +/obj/item/reagent_containers/cup/bucket, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"pg" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "p"; + pixel_x = -8; + pixel_y = 1 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"pi" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"pm" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/carpet/green, +/area/awaymission/beach/heretic) +"pn" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/candle_box, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"po" = ( +/obj/structure/fluff/bus/passable/seat, +/turf/open/floor/iron/dark, +/area/awaymission/beach/heretic) +"pp" = ( +/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, +/area/awaymission/caves/heretic_laboratory) +"pr" = ( +/obj/structure/safe/floor{ + desc = "A huge chunk of metal with a dial embedded in it. Fine print on the dial reads \"Hardened Marine confidential containment safe, guaranteed thermite resistant, explosion resistant, and assistant resistant.\"" + }, +/obj/effect/spawner/random/heretic_gateway, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"ps" = ( +/obj/structure/table, +/obj/structure/sink{ + dir = 8; + pixel_y = 6; + pixel_x = 13 + }, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"pt" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/obj/structure/chair/sofa/bench/tram/solo{ + dir = 8 + }, +/obj/structure/transport/linear/tram, +/obj/structure/thermoplastic/light, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"pu" = ( +/obj/structure/closet/cabinet, +/obj/effect/turf_decal/tile/dark_red/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"pv" = ( +/turf/open/misc/beach/coast{ + dir = 1 + }, +/area/awaymission/beach/heretic) +"pw" = ( +/obj/structure/fluff/tram_rail, +/obj/effect/turf_decal/delivery, +/obj/structure/reagent_dispensers/fueltank/large{ + max_integrity = 1; + name = "Extremely fragile high capacity fuel tank" + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"px" = ( +/obj/effect/decal/remains/xeno, +/obj/machinery/light/directional/east, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"py" = ( +/obj/structure/mop_bucket/janitorialcart, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"pB" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"pC" = ( +/obj/effect/decal/cleanable/fuel_pool, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"pD" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/tracks/xeno{ + dir = 5 + }, +/obj/structure/marker_beacon/jade, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"pF" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit, +/obj/item/storage/medkit, +/turf/open/floor/pod/dark, +/area/awaymission/beach/heretic) +"pH" = ( +/obj/structure/fluff/tram_rail/anchor, +/obj/effect/turf_decal/delivery, +/obj/effect/gibspawner/generic/animal, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"pJ" = ( +/mob/living/basic/bot/cleanbot, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"pL" = ( +/obj/machinery/light/directional/south, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"pN" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"pO" = ( +/obj/effect/mapping_helpers/airlock/access/all/supply, +/obj/machinery/door/airlock{ + name = "Personal Dorm" + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"pP" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/security, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/puzzle/keycard/highsec_access, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"pQ" = ( +/obj/item/radio/intercom/mi13/directional/west, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"pU" = ( +/obj/structure/falsewall, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"pW" = ( +/obj/structure/table, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"pX" = ( +/obj/structure/fluff/bus/dense{ + icon_state = "frontwallbottomrear" + }, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"pY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/shard, +/obj/item/stack/sheet/iron/five, +/obj/item/stack/cable_coil/thirty, +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"qb" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"qc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_green/half{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"qe" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/effect/spawner/random/heretic_gateway, +/obj/effect/blessing/invisible, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"qg" = ( +/obj/item/clothing/glasses/meson, +/turf/open/floor/black, +/area/awaymission/caves/heretic_laboratory_clean) +"qk" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"ql" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ + dir = 8 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"qm" = ( +/obj/machinery/door/airlock/hatch, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/puzzle/keycard/heretic_entrance, +/obj/effect/mapping_helpers/airlock/access/all/supply, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"qn" = ( +/obj/effect/decal/cleanable/blood/tracks/xeno, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"qp" = ( +/obj/structure/toilet{ + pixel_y = 18 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"qq" = ( +/obj/structure/flora/bush/jungle/b/style_random, +/obj/structure/flora/grass/jungle/a/style_random, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"qr" = ( +/obj/effect/mapping_helpers/airlock/access/all/supply, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"qt" = ( +/obj/structure/cable, +/obj/machinery/power/port_gen/pacman/pre_loaded, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"qu" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"qv" = ( +/obj/structure/mineral_door/wood, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"qA" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"qB" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"qC" = ( +/obj/item/clothing/head/utility/radiation/cbrnhood, +/obj/item/clothing/suit/utility/radiation/cbrnsuit, +/obj/structure/closet/cabinet, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"qE" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"qG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/turf_decal/siding/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"qI" = ( +/obj/structure/fluff/tram_rail/anchor{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/reagent_dispensers/fueltank/large{ + max_integrity = 1; + name = "Extremely fragile high capacity fuel tank" + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"qK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"qL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"qM" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"qO" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/green/double, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"qP" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"qT" = ( +/obj/structure/chair, +/obj/effect/turf_decal/box, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"qU" = ( +/obj/item/bedsheet/black/double{ + dir = 4; + pixel_x = 0; + pixel_y = 2 + }, +/obj/structure/bed/double{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"qV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"qW" = ( +/obj/structure/toilet{ + dir = 4; + pixel_x = -2 + }, +/turf/open/floor/iron/white, +/area/awaymission/beach/heretic) +"qY" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_green{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"rc" = ( +/obj/machinery/door/airlock{ + name = "Employees Only"; + dir = 4 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"rf" = ( +/obj/machinery/light/directional/west, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"rh" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"ri" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/blue/corner{ + dir = 8 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"rl" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 1 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"rt" = ( +/obj/item/bedsheet/black/double{ + dir = 4; + pixel_x = 0; + pixel_y = 10 + }, +/obj/structure/bed/double{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"ru" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"rx" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/turf_decal/tile/dark_green/anticorner/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"ry" = ( +/obj/structure/table, +/obj/item/book/bible, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"rA" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 9 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"rB" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/brute, +/obj/item/storage/medkit/brute, +/turf/open/floor/pod/light, +/area/awaymission/beach/heretic) +"rC" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/carpet/green, +/area/awaymission/beach/heretic) +"rF" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"rG" = ( +/obj/effect/decal/cleanable/rubble, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"rK" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/door/puzzle/keycard/biological_anomalies, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"rM" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"rN" = ( +/obj/structure/rack, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"rP" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"rR" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/siding/blue/corner{ + dir = 8 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"rS" = ( +/mob/living/basic/construct/harvester, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/dark_red/fourcorners, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"rT" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "p"; + pixel_x = -8; + pixel_y = 1 + }, +/obj/structure/fluff/tram_rail, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"rU" = ( +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/north, +/obj/structure/table, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"rX" = ( +/obj/structure/closet/cabinet, +/obj/effect/spawner/random/heretic_gateway_low, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"sa" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/siding/blue/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/blue/corner{ + dir = 8 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"sb" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/blue/corner{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"sc" = ( +/obj/structure/fluff/tram_rail, +/obj/structure/thermoplastic/light, +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/obj/structure/chair/sofa/bench/tram/solo{ + dir = 8 + }, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"sd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/flashlight/lantern/on, +/turf/open/floor/black, +/area/awaymission/caves/heretic_laboratory_clean) +"se" = ( +/turf/open/floor/pod/dark, +/area/awaymission/beach/heretic) +"sf" = ( +/obj/machinery/vending/donksofttoyvendor, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"sg" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"sj" = ( +/obj/effect/decal/cleanable/blood/oil/slippery, +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"sk" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = -12 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"so" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/bar/half/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"sp" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"sq" = ( +/obj/machinery/light/very_dim/directional/west, +/obj/machinery/suit_storage_unit/industrial, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"sr" = ( +/obj/machinery/computer/crew{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"ss" = ( +/obj/item/clothing/shoes/combat/swat, +/obj/item/clothing/gloves/combat, +/obj/item/clothing/mask/gas/atmos, +/obj/item/clothing/glasses/meson, +/obj/structure/closet/cabinet, +/obj/item/clothing/under/rank/centcom/military/eng, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"sw" = ( +/obj/structure/disposalpipe/segment, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory_clean) +"sx" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"sy" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"sA" = ( +/obj/machinery/door/airlock{ + name = "Employees Only" + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"sC" = ( +/obj/structure/flora/bush/jungle/a/style_random, +/mob/living/basic/venus_human_trap, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"sD" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"sF" = ( +/obj/machinery/vending/medical, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"sG" = ( +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"sJ" = ( +/obj/structure/table, +/obj/item/storage/medkit/brute{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/medkit/brute, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"sK" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"sL" = ( +/obj/structure/flora/grass/jungle/a/style_random, +/obj/item/seeds/replicapod, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"sM" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/door/puzzle/keycard/misc_anomalies, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"sN" = ( +/obj/item/radio/intercom/mi13/directional/south, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"sO" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/item/radio/intercom/mi13/directional/south, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"sS" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"sU" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_green/half{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"sZ" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"ta" = ( +/obj/structure/mineral_door/wood, +/turf/open/floor/stone, +/area/awaymission/beach/heretic) +"tb" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/screwdriver, +/obj/item/crowbar, +/obj/item/multitool, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"tc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"td" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"te" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/awaymission/beach/heretic) +"tf" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/barricade/wooden, +/obj/structure/barricade/wooden/crude, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"tg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"tl" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/effect/blessing/invisible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"tm" = ( +/obj/structure/flora/rock, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"to" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/parquet, +/area/awaymission/caves/heretic_laboratory) +"tq" = ( +/obj/effect/spawner/structure/window, +/obj/structure/curtain/cloth/fancy, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"tr" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/beach/heretic) +"ts" = ( +/obj/machinery/light/directional/west, +/obj/effect/blessing/invisible, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"ty" = ( +/obj/machinery/door/airlock/hatch, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/purple, +/area/awaymission/caves/heretic_laboratory) +"tA" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"tB" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/security, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"tD" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/iron/stairs/right, +/area/awaymission/beach/heretic) +"tJ" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"tL" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"tM" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory) +"tN" = ( +/obj/machinery/conveyor/auto{ + dir = 9 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"tP" = ( +/obj/structure/barricade/wooden, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"tQ" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"tR" = ( +/obj/effect/spawner/message_in_a_bottle/low_prob, +/turf/open/water/beach, +/area/awaymission/beach/heretic) +"tS" = ( +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"tU" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"tX" = ( +/obj/machinery/shower/directional/west, +/obj/structure/window/spawner/directional/north, +/obj/structure/curtain, +/obj/machinery/door/window/right/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"tY" = ( +/obj/item/binoculars, +/turf/open/floor/black, +/area/awaymission/caves/heretic_laboratory_clean) +"tZ" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"ua" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar/fourcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"uc" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"ue" = ( +/obj/structure/flora/coconuts, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"uf" = ( +/obj/effect/decal/cleanable/rubble, +/obj/structure/flora/rock/pile, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"ug" = ( +/obj/structure/fluff/tram_rail, +/obj/structure/transport/linear/tram, +/obj/structure/thermoplastic/light, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"uh" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"uj" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"ul" = ( +/obj/item/radio/intercom/mi13/directional/north, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"um" = ( +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"un" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"up" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"uq" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"us" = ( +/obj/structure/flora/bush/jungle/c/style_random, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"ut" = ( +/obj/structure/sink/directional/west, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/freezer, +/area/awaymission/caves/heretic_laboratory) +"uu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"uy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/indestructible/plating, +/area/awaymission/caves/heretic_laboratory) +"uz" = ( +/turf/closed/wall/mineral/uranium, +/area/awaymission/beach/heretic) +"uA" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/structure/holosign/barrier/atmos/tram, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"uB" = ( +/obj/structure/closet/cabinet, +/obj/item/book/random, +/turf/open/floor/carpet/purple, +/area/awaymission/caves/heretic_laboratory) +"uE" = ( +/obj/structure/table, +/obj/machinery/light/floor, +/obj/item/fake_items/abductor_win_stick, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"uH" = ( +/obj/structure/fluff/tram_rail, +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/obj/structure/chair/sofa/bench/tram/solo{ + dir = 8 + }, +/obj/structure/transport/linear/tram, +/obj/structure/thermoplastic/light, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"uI" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"uJ" = ( +/obj/machinery/door/airlock{ + name = "Personal Dorm" + }, +/obj/effect/mapping_helpers/airlock/access/all/away/general, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory) +"uK" = ( +/obj/effect/decal/cleanable/fuel_pool, +/obj/structure/holosign/barrier/engineering, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"uL" = ( +/obj/machinery/power/port_gen/pacman/pre_loaded, +/turf/open/misc/dirt/jungle, +/area/awaymission/beach/heretic) +"uM" = ( +/obj/structure/table/glass, +/obj/item/storage/medkit/regular, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/suture, +/obj/effect/turf_decal/siding{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/iron/white/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"uN" = ( +/obj/machinery/light/floor, +/obj/item/slimepotion/lovepotion, +/obj/item/slimepotion/lovepotion, +/obj/structure/closet/crate/freezer, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"uO" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"uQ" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/dark_green/half/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"uR" = ( +/obj/structure/sign/poster/official/here_for_your_safety/directional/east, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"uS" = ( +/mob/living/basic/trooper/nanotrasen/ranged/smg/peaceful, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"uT" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/iron/stairs/left, +/area/awaymission/beach/heretic) +"uV" = ( +/obj/machinery/door/airlock/highsecurity, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"uW" = ( +/obj/effect/decal/cleanable/blood/oil/slippery, +/obj/effect/spawner/random/structure/shipping_container, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"uX" = ( +/obj/structure/table, +/obj/machinery/light/floor, +/obj/item/gun/energy/disabler/smoothbore, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"va" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/purple, +/area/awaymission/caves/heretic_laboratory) +"vb" = ( +/obj/structure/fluff/tram_rail/anchor{ + dir = 1 + }, +/obj/structure/holosign/barrier/atmos/tram, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"vd" = ( +/obj/structure/closet/crate/secure/trashcart/filled, +/obj/effect/spawner/random/heretic_gateway_low, +/turf/open/misc/dirt/jungle, +/area/awaymission/beach/heretic) +"vf" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory_clean) +"vj" = ( +/obj/machinery/vending/medical, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"vk" = ( +/obj/effect/blessing/invisible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"vm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"vn" = ( +/obj/structure/closet/cabinet, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/spawner/random/heretic_gateway_low, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"vo" = ( +/obj/structure/cable, +/obj/machinery/power/floodlight, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"vp" = ( +/obj/machinery/washing_machine, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"vq" = ( +/obj/structure/closet/cardboard, +/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, +/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/effect/spawner/random/heretic_gateway_low, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"vr" = ( +/obj/effect/mapping_helpers/airlock/access/all/admin, +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"vs" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"vt" = ( +/obj/machinery/vending/medical, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"vu" = ( +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"vv" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"vw" = ( +/obj/effect/decal/cleanable/blood/tracks/xeno{ + dir = 8 + }, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"vx" = ( +/obj/effect/mapping_helpers/airlock/access/all/service, +/obj/machinery/door/airlock{ + name = "Kitchen" + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"vy" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 8 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"vB" = ( +/obj/structure/closet/l3closet, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"vF" = ( +/obj/effect/landmark/transport/nav_beacon/tram/nav/heretic, +/obj/effect/landmark/transport/nav_beacon/tram/platform/heretic/middle, +/obj/structure/transport/linear/tram, +/obj/structure/thermoplastic/light, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"vI" = ( +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack{ + pixel_y = 8; + pixel_x = -15; + anchored = 1; + name = "Sam Site Missle rack" + }, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"vK" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"vL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"vN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"vO" = ( +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"vR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"vS" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/white/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"vT" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/gibspawner/human, +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"vU" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "p"; + pixel_x = -8; + pixel_y = 1 + }, +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"vY" = ( +/obj/effect/decal/cleanable/glass/plastitanium, +/obj/effect/spawner/random/structure/shipping_container, +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"wa" = ( +/obj/structure/mineral_door/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"wb" = ( +/obj/structure/closet, +/obj/item/shovel, +/obj/item/bodybag, +/turf/open/floor/stone, +/area/awaymission/beach/heretic) +"wc" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"wd" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"we" = ( +/turf/open/floor/iron/cafeteria, +/area/awaymission/caves/heretic_laboratory_clean) +"wf" = ( +/turf/closed/wall/mineral/titanium, +/area/awaymission/beach/heretic) +"wh" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/awaymission/caves/heretic_laboratory_clean) +"wi" = ( +/turf/closed/indestructible/riveted, +/area/awaymission/caves/heretic_laboratory_clean) +"wl" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/puzzle/keycard/highsec_access, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"wm" = ( +/obj/item/broken_bottle, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"wn" = ( +/turf/open/floor/plating/airless, +/area/awaymission/caves/heretic_laboratory_clean) +"wq" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"ws" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner, +/obj/machinery/camera/xray/directional/north, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"wt" = ( +/mob/living/basic/heretic_summon/stalker, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"wu" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/sand{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"wy" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"wz" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"wC" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"wD" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"wE" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/parquet, +/area/awaymission/caves/heretic_laboratory) +"wF" = ( +/obj/machinery/suit_storage_unit, +/turf/open/floor/pod/dark, +/area/awaymission/beach/heretic) +"wH" = ( +/obj/structure/table/glass, +/obj/item/storage/medkit/regular, +/obj/effect/turf_decal/siding{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/white/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"wI" = ( +/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{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"wJ" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "j"; + pixel_x = -14; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "u"; + pixel_x = -4; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "m"; + pixel_x = 10; + pixel_y = 1 + }, +/obj/structure/fluff/tram_rail, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"wL" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/transport/tram{ + specific_transport_id = "heretic_1"; + pixel_y = 8; + id = 3 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"wM" = ( +/obj/effect/spawner/random/trash/garbage, +/turf/open/misc/dirt/jungle, +/area/awaymission/beach/heretic) +"wN" = ( +/obj/structure/projected_forcefield, +/obj/effect/oneway{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/awaymission/caves/heretic_laboratory_clean) +"wO" = ( +/turf/open/misc/beach/coast/corner{ + dir = 4 + }, +/area/awaymission/caves/heretic_laboratory_clean) +"wP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"wR" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"wT" = ( +/obj/machinery/door/puzzle/keycard/heretic_entrance, +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"wX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"wY" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "d"; + pixel_x = -15; + pixel_y = 6 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "a"; + pixel_x = -6; + pixel_y = 4 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "n"; + pixel_x = 4; + pixel_y = 4 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "g"; + pixel_x = 16; + pixel_y = 3 + }, +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"wZ" = ( +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"xa" = ( +/obj/machinery/computer/pod/old/mass_driver_controller/feeder{ + pixel_x = 24 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"xb" = ( +/obj/machinery/vending/sustenance, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"xd" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"xe" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"xi" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"xj" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"xk" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/admin, +/obj/machinery/door/puzzle/keycard/weapon_anomalies, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"xl" = ( +/turf/closed/indestructible/reinforced, +/area/awaymission/caves/heretic_laboratory_clean) +"xm" = ( +/obj/effect/turf_decal/tile/dark/half{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"xn" = ( +/obj/structure/fluff/bus/dense{ + icon_state = "reartire" + }, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"xo" = ( +/obj/structure/table/wood, +/obj/item/pen, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"xr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/carpet/purple, +/area/awaymission/caves/heretic_laboratory) +"xs" = ( +/obj/effect/turf_decal/siding/blue, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"xu" = ( +/obj/effect/spawner/structure/window, +/obj/structure/curtain/cloth, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"xv" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = 6; + pixel_y = 10 + }, +/obj/item/wrench/medical, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"xx" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/door/puzzle/keycard/weapon_anomalies, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"xB" = ( +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"xC" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"xD" = ( +/obj/machinery/deepfryer, +/turf/open/floor/iron/cafeteria, +/area/awaymission/caves/heretic_laboratory_clean) +"xE" = ( +/obj/effect/turf_decal/weather/sand, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"xF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"xG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"xH" = ( +/obj/effect/turf_decal/trimline/red/filled, +/obj/item/mecha_ammo/missiles_srm{ + pixel_y = 3; + name = "Sam Site Missiles"; + anchored = 1 + }, +/obj/item/mecha_ammo/missiles_srm{ + pixel_y = 10; + name = "Sam Site Missiles"; + anchored = 1 + }, +/obj/structure/rack, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"xI" = ( +/obj/item/bedsheet/black/double{ + dir = 4; + pixel_x = 0; + pixel_y = 6 + }, +/obj/structure/bed/double{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"xJ" = ( +/obj/machinery/door/poddoor/shutters/indestructible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"xM" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "d"; + pixel_x = -15; + pixel_y = 6 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "a"; + pixel_x = -6; + pixel_y = 4 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "n"; + pixel_x = 4; + pixel_y = 4 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "g"; + pixel_x = 16; + pixel_y = 3 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"xO" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"xQ" = ( +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"xS" = ( +/obj/structure/window/fulltile, +/obj/structure/flora/bush/ferny/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/awaymission/caves/heretic_laboratory) +"xT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"xW" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"xY" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"ya" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"yb" = ( +/obj/machinery/conveyor/auto/inverted{ + dir = 6 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"yc" = ( +/mob/living/basic/heretic_summon/stalker, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"yd" = ( +/obj/structure/table, +/obj/item/ammo_box/magazine/lahtimagazine{ + anchored = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory_clean) +"ye" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"yg" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/machinery/door/puzzle/keycard/weapon_anomalies, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"yj" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/heretic_gateway_low, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"yk" = ( +/obj/structure/curtain/cloth/fancy/mechanical/start_closed, +/obj/effect/spawner/structure/window/reinforced/shuttle, +/turf/open/floor/pod/light, +/area/awaymission/beach/heretic) +"yo" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"yp" = ( +/obj/structure/table, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"yu" = ( +/obj/structure/fluff/tram_rail/anchor, +/obj/structure/fluff/tram_rail, +/obj/structure/thermoplastic/light, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"yw" = ( +/obj/structure/table, +/obj/machinery/light/floor, +/obj/item/clothing/shoes/gunboots/disabler, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"yx" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/item/radio/intercom/mi13/directional/south, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"yz" = ( +/obj/item/stack/ore/uranium, +/obj/item/coin/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/item/stack/sheet/mineral/uranium, +/obj/structure/closet/crate/wooden, +/obj/item/nuke_core{ + anchored = 1 + }, +/turf/open/floor/mineral/uranium, +/area/awaymission/beach/heretic) +"yA" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"yD" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"yE" = ( +/obj/machinery/telecomms/hub, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"yF" = ( +/obj/item/binoculars, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"yG" = ( +/obj/structure/closet/athletic_mixed, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"yI" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"yJ" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"yK" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"yL" = ( +/obj/machinery/door/airlock{ + name = "Personal Dorm" + }, +/obj/effect/mapping_helpers/airlock/access/all/security, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"yM" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/item/radio/intercom/mi13/directional/west, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"yN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"yO" = ( +/obj/structure/chair/plastic, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"yQ" = ( +/obj/effect/turf_decal/siding/blue, +/obj/effect/turf_decal/siding/blue/corner{ + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"yS" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory_clean) +"yV" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"yW" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"yX" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"yZ" = ( +/obj/machinery/door/airlock/hatch, +/obj/structure/barricade/wooden, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"za" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"zb" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"zc" = ( +/obj/effect/light_emitter/fake_outdoors, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"ze" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"zh" = ( +/obj/structure/fluff/tram_rail/anchor{ + dir = 1 + }, +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"zk" = ( +/mob/living/basic/trooper/nanotrasen/peaceful, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"zl" = ( +/obj/structure/falsewall, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"zo" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"zr" = ( +/obj/effect/decal/cleanable/plasma, +/obj/structure/holosign/barrier/engineering, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"zs" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"zu" = ( +/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind{ + pixel_x = -17; + pixel_y = 17 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"zv" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"zE" = ( +/obj/structure/bookcase/random, +/obj/effect/blessing/invisible, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"zF" = ( +/obj/structure/fluff/tram_rail/anchor{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"zH" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/stone, +/area/awaymission/beach/heretic) +"zI" = ( +/obj/machinery/light/floor, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"zK" = ( +/obj/effect/decal/cleanable/rubble, +/obj/structure/flora/rock, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"zO" = ( +/mob/living/basic/rabbit{ + name = "Primal force of evil"; + desc = "Why is this bunny being put in a cell this extreme and why does it have a nametag that says 'hello my name is: SATAN'" + }, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"zQ" = ( +/turf/closed/indestructible/reinforced, +/area/awaymission/beach/heretic) +"zR" = ( +/obj/structure/flora/rock/pile/style_random, +/turf/open/misc/dirt/jungle, +/area/awaymission/beach/heretic) +"zS" = ( +/obj/structure/chair/sofa/bench, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"zT" = ( +/obj/structure/table/wood/fancy, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"zV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"zW" = ( +/obj/machinery/door/airlock/highsecurity, +/obj/effect/mapping_helpers/airlock/access/all/away/general, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"zZ" = ( +/obj/structure/fluff/bus/dense{ + icon_state = "frontwallbottom" + }, +/obj/effect/decal/cleanable/blood/oil, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"Ac" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"Ae" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/obj/structure/cable, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Af" = ( +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/south, +/obj/structure/flora/bush/jungle/c/style_random, +/turf/open/misc/grass/jungle, +/area/awaymission/caves/heretic_laboratory) +"Ag" = ( +/obj/structure/dresser, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory) +"Ai" = ( +/obj/item/seeds/nettle/death, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"Am" = ( +/obj/structure/flora/bush/grassy/style_random, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"Ao" = ( +/obj/structure/fluff/tram_rail, +/obj/effect/turf_decal/delivery, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Ap" = ( +/obj/structure/fluff/bus/dense{ + icon_state = "hoodbottom" + }, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"Aq" = ( +/obj/effect/decal/cleanable/glass/plastitanium, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"As" = ( +/obj/machinery/door/window/survival_pod/left/directional/east, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"At" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Av" = ( +/obj/machinery/door/airlock/hatch, +/obj/structure/barricade/wooden, +/obj/structure/barricade/wooden/crude, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Aw" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Ax" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"Ay" = ( +/obj/effect/mapping_helpers/airlock/access/all/service, +/obj/machinery/door/airlock/glass{ + name = "Bar" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Az" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"AA" = ( +/obj/structure/flora/bush/jungle/c/style_random, +/obj/effect/decal/cleanable/blood/tracks/xeno{ + dir = 8 + }, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"AB" = ( +/obj/machinery/light/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"AC" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"AD" = ( +/mob/living/basic/heretic_summon/stalker, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"AG" = ( +/obj/structure/bookcase/random, +/obj/machinery/light/directional/east, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"AI" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"AJ" = ( +/obj/structure/toilet{ + dir = 4; + pixel_x = -2 + }, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"AK" = ( +/obj/effect/decal/cleanable/blood/tracks/xeno{ + dir = 5 + }, +/turf/open/floor/mineral/uranium, +/area/awaymission/beach/heretic) +"AL" = ( +/obj/structure/table/wood, +/obj/item/book/manual/ripley_build_and_repair, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"AM" = ( +/obj/structure/table, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"AO" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"AP" = ( +/obj/structure/chair/plastic, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"AQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"AR" = ( +/obj/item/reagent_containers/cup/soda_cans/sol_dry{ + pixel_y = 18; + pixel_x = 9 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"AS" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/effect/turf_decal/siding/blue/corner, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"AT" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"AZ" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lantern/on, +/turf/open/floor/plating/airless, +/area/awaymission/caves/heretic_laboratory_clean) +"Bc" = ( +/obj/item/radio/intercom/mi13/directional/east, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"Be" = ( +/obj/machinery/gateway, +/turf/open/floor/pod/dark, +/area/awaymission/beach/heretic) +"Bf" = ( +/obj/item/clothing/head/collectable/welding, +/obj/item/weldingtool, +/obj/item/stack/cable_coil/five, +/obj/item/wrench, +/obj/item/screwdriver, +/obj/structure/closet/crate, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Bg" = ( +/obj/structure/table, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"Bi" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/indestructible, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"Bj" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Bl" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/sign/poster/contraband/eat/directional/west, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"Bm" = ( +/obj/structure/table/wood, +/obj/structure/bedsheetbin/empty{ + name = "Towel bin" + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Bq" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"Br" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Bs" = ( +/obj/structure/fluff/bus/passable{ + icon_state = "topdoor" + }, +/turf/open/floor/iron/dark, +/area/awaymission/beach/heretic) +"Bv" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"Bx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/bar/half/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"By" = ( +/obj/machinery/iv_drip, +/obj/effect/turf_decal/siding, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/white/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"BE" = ( +/obj/machinery/teleport/station{ + name = "Forcefield generator" + }, +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"BM" = ( +/obj/item/weldingtool/hugetank, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"BN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"BS" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"BU" = ( +/obj/structure/holosign/barrier/atmos/tram, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"BV" = ( +/turf/open/floor/pod/light, +/area/awaymission/beach/heretic) +"BW" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/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, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"BX" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"BY" = ( +/obj/structure/window/reinforced/plasma/plastitanium, +/obj/machinery/door/poddoor/shutters, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"BZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Ce" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Cf" = ( +/obj/structure/flora/rock/pile/jungle/large/style_random, +/turf/open/water/jungle, +/area/awaymission/beach/heretic) +"Ci" = ( +/obj/effect/baseturf_helper/beach/sand, +/turf/closed/mineral/ash_rock, +/area/awaymission/beach/heretic) +"Ck" = ( +/obj/effect/turf_decal/trimline/blue/end{ + dir = 4 + }, +/turf/open/floor/iron/white/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"Cm" = ( +/mob/living/basic/heretic_summon/stalker, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Cn" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Co" = ( +/turf/open/misc/beach/coast{ + dir = 1 + }, +/area/awaymission/caves/heretic_laboratory_clean) +"Cp" = ( +/obj/structure/toilet{ + pixel_y = 18 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory_clean) +"Cs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Ct" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Cv" = ( +/obj/effect/spawner/random/structure/shipping_container, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"Cx" = ( +/mob/living/basic/heretic_summon/maid_in_the_mirror, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/dark_green/fourcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Cy" = ( +/obj/structure/holosign/barrier/atmos/tram, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Cz" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"CA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"CB" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"CC" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/turf_decal/stripes, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"CD" = ( +/obj/machinery/shower/directional/west, +/obj/structure/fluff/shower_drain, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/white/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"CG" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"CI" = ( +/obj/effect/turf_decal/trimline/blue/line, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/turf/open/floor/iron/white/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"CJ" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"CP" = ( +/obj/item/radio/intercom/mi13/directional/east, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"CQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"CS" = ( +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"CT" = ( +/obj/effect/blessing/invisible, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"CU" = ( +/obj/item/holosign_creator/atmos, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"CV" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/closet/secure_closet/bar, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"CW" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/sand{ + dir = 6 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"CX" = ( +/obj/machinery/light/directional/east, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"CZ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Dc" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"Df" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/hos/double, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Dg" = ( +/obj/effect/mapping_helpers/airlock/access/all/admin/captain, +/obj/machinery/door/airlock/hatch, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Di" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/effect/blessing/invisible, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"Dj" = ( +/turf/closed/indestructible/rock, +/area/awaymission/beach/heretic) +"Dk" = ( +/obj/structure/fluff/tram_rail/anchor, +/obj/structure/fluff/tram_rail, +/obj/structure/thermoplastic/light, +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/obj/effect/decal/remains/human, +/obj/structure/chair/comfy/beige{ + dir = 4 + }, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"Dp" = ( +/obj/effect/mapping_helpers/airlock/access/all/admin/captain, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/hatch, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Dr" = ( +/obj/structure/chair/plastic, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"Ds" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Dt" = ( +/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, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Du" = ( +/obj/structure/table, +/obj/item/pizzabox/meat, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"Dx" = ( +/turf/open/misc/beach/coast{ + dir = 5 + }, +/area/awaymission/beach/heretic) +"Dz" = ( +/obj/structure/table/glass, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/mesh, +/obj/item/stack/medical/suture, +/obj/effect/turf_decal/siding{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/white/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"DB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar/fourcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"DC" = ( +/obj/structure/bookcase/random, +/obj/machinery/light/directional/west, +/obj/effect/blessing/invisible, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"DG" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"DJ" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/security, +/obj/machinery/door/puzzle/keycard/biological_anomalies, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"DL" = ( +/turf/open/floor/carpet/green, +/area/awaymission/beach/heretic) +"DN" = ( +/obj/effect/spawner/random/trash/moisture_trap, +/turf/open/floor/plating/airless, +/area/awaymission/caves/heretic_laboratory_clean) +"DR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ + dir = 6 + }, +/turf/closed/indestructible/reinforced, +/area/awaymission/caves/heretic_laboratory) +"DT" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"DU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 6 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/catwalk_floor/iron_dark, +/area/awaymission/caves/heretic_laboratory) +"DX" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"DY" = ( +/obj/effect/turf_decal/tile/dark_green/half{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"DZ" = ( +/obj/effect/decal/cleanable/blood/tracks/xeno{ + dir = 8 + }, +/turf/open/floor/mineral/uranium, +/area/awaymission/beach/heretic) +"Ea" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Eb" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/effect/mapping_helpers/damaged_window, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Ec" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Eg" = ( +/obj/machinery/conveyor/auto{ + dir = 5 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Ei" = ( +/obj/structure/flora/bush/jungle/b/style_random, +/obj/effect/decal/cleanable/blood/tracks/xeno{ + dir = 8 + }, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"Ek" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"El" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Em" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"Er" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/dark/half{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Es" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Et" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Ew" = ( +/obj/effect/spawner/random/heretic_gateway_low, +/obj/structure/closet, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Ex" = ( +/obj/structure/fluff/tram_rail/anchor{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Ey" = ( +/obj/structure/projected_forcefield, +/obj/effect/oneway{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/awaymission/caves/heretic_laboratory_clean) +"Ez" = ( +/obj/machinery/vending/cigarette/beach, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"EA" = ( +/obj/structure/closet/crate/grave, +/obj/effect/spawner/random/heretic_gateway_low, +/turf/open/misc/dirt/jungle, +/area/awaymission/beach/heretic) +"EF" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 10 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"EG" = ( +/obj/effect/spawner/random/food_or_drink/seed_rare, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"EH" = ( +/obj/machinery/computer/shuttle/ferry/request{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/awaymission/beach/heretic) +"EI" = ( +/turf/open/water/beach, +/area/awaymission/caves/heretic_laboratory_clean) +"EJ" = ( +/turf/open/water/beach, +/area/awaymission/beach/heretic) +"EK" = ( +/obj/item/seeds/firelemon, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"EO" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = 6; + pixel_y = 10 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"EP" = ( +/obj/machinery/deployable_turret/hmg, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"EQ" = ( +/obj/machinery/cryo_cell{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"ER" = ( +/obj/structure/fluff/tram_rail, +/obj/structure/thermoplastic/light, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"ES" = ( +/obj/machinery/shower{ + pixel_y = 15 + }, +/obj/effect/turf_decal/weather/sand, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"EX" = ( +/obj/structure/table, +/obj/item/flashlight, +/obj/item/flashlight{ + pixel_x = -3; + pixel_y = 10 + }, +/obj/item/flashlight{ + pixel_x = 5; + pixel_y = 9 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"EY" = ( +/obj/effect/spawner/surgery_tray/full/morgue, +/obj/structure/table, +/turf/open/floor/stone, +/area/awaymission/beach/heretic) +"EZ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Fa" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Fb" = ( +/obj/structure/table, +/obj/item/storage/medkit/emergency, +/obj/item/storage/medkit/emergency{ + pixel_x = 0; + pixel_y = 7 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Fe" = ( +/obj/effect/decal/cleanable/blood/oil/slippery, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 6 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"Fh" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/item/gun/ballistic/shotgun/riot, +/obj/item/gun/ballistic/shotgun/riot, +/obj/item/gun/ballistic/shotgun/riot, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Fi" = ( +/obj/structure/fluff/tram_rail, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/remains/robot, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Fk" = ( +/obj/structure/closet/l3closet/janitor, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Fl" = ( +/turf/open/misc/beach/coast/corner{ + dir = 1 + }, +/area/awaymission/beach/heretic) +"Fm" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Fn" = ( +/obj/item/kirbyplants/organic/plant10, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Fr" = ( +/obj/structure/fluff/tram_rail/anchor, +/obj/structure/transport/linear/tram, +/obj/structure/thermoplastic/light, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Fs" = ( +/turf/open/floor/iron/dark, +/area/awaymission/beach/heretic) +"Fu" = ( +/obj/structure/table, +/obj/machinery/light/floor, +/obj/item/fake_items/wabbajack, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"Fw" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/thermoplastic/light, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"Fx" = ( +/obj/structure/fluff/bus/dense{ + icon_state = "frontwallbottom" + }, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"Fy" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 8 + }, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory_clean) +"Fz" = ( +/obj/machinery/door/airlock{ + name = "Kitchen" + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"FB" = ( +/obj/structure/closet/cabinet, +/obj/effect/turf_decal/tile/dark_green/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"FC" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/bar/half/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"FD" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"FF" = ( +/obj/machinery/light/very_dim/directional/east, +/obj/structure/chair/comfy/shuttle/tactical, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"FG" = ( +/obj/structure/flora/tree/jungle/small/style_random, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"FH" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/bar, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"FM" = ( +/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/heretic) +"FO" = ( +/obj/effect/mob_spawn/corpse/human/wizard/red, +/turf/open/misc/beach/sand, +/area/awaymission/caves/heretic_laboratory_clean) +"FP" = ( +/obj/structure/holosign/barrier/engineering, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"FQ" = ( +/obj/effect/decal/cleanable/blood/oil, +/obj/structure/holosign/barrier/engineering, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"FR" = ( +/obj/machinery/recharge_station, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"FS" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"FT" = ( +/obj/structure/toilet{ + dir = 1 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"FU" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/machinery/door/puzzle/keycard/misc_anomalies, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"FW" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"FX" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"FY" = ( +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"FZ" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Ga" = ( +/obj/structure/bed/double{ + dir = 4 + }, +/obj/item/bedsheet/rd/double{ + dir = 1 + }, +/turf/open/floor/carpet/purple, +/area/awaymission/caves/heretic_laboratory) +"Gb" = ( +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Gd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"Gf" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/effect/mapping_helpers/damaged_window, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Gg" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Gh" = ( +/turf/closed/wall/mineral/iron, +/area/awaymission/beach/heretic) +"Gi" = ( +/obj/structure/sink/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Gj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Gk" = ( +/obj/machinery/door/airlock/hatch, +/obj/machinery/door/puzzle/keycard/heretic_entrance, +/obj/effect/mapping_helpers/airlock/access/all/supply, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Gm" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 24; + pixel_x = -7 + }, +/obj/structure/flora/coconuts, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"Go" = ( +/obj/structure/flora/bush/jungle/b/style_random, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"Gp" = ( +/mob/living/basic/bot/medbot/mysterious, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory_clean) +"Gq" = ( +/obj/structure/sign/poster/contraband/energy_swords/directional/east, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Gs" = ( +/obj/structure/table/wood/fancy, +/obj/item/flashlight/flare/candle/infinite, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"Gt" = ( +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Gu" = ( +/obj/structure/table/wood/fancy, +/obj/item/kitchen/fork, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"Gv" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/light/floor, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Gw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Gy" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Gz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"GC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"GD" = ( +/obj/structure/rack, +/turf/open/floor/pod/dark, +/area/awaymission/beach/heretic) +"GE" = ( +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"GF" = ( +/obj/structure/dresser, +/obj/effect/blessing/invisible, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"GH" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"GJ" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"GL" = ( +/obj/effect/spawner/random/trash/deluxe_garbage, +/obj/effect/spawner/random/trash/deluxe_garbage, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"GM" = ( +/obj/structure/closet/crate/secure/trashcart/filled, +/turf/open/misc/dirt/jungle, +/area/awaymission/beach/heretic) +"GN" = ( +/obj/machinery/light/floor, +/obj/item/slimepotion/slime/mutator, +/obj/structure/closet/crate/freezer, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"GO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"GP" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"GR" = ( +/obj/effect/turf_decal/trimline/red/arrow_cw, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack{ + pixel_y = 9; + pixel_x = 15; + anchored = 1; + name = "Sam Site Missle rack" + }, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"GT" = ( +/obj/machinery/light/floor, +/obj/structure/closet/crate/freezer, +/obj/item/organ/appendix/corrupt, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"GU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"GV" = ( +/obj/structure/fluff/tram_rail, +/obj/effect/turf_decal/delivery, +/obj/structure/barricade/wooden, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"GW" = ( +/obj/structure/fluff/tram_rail, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"GY" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/turf_decal/tile/bar/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"GZ" = ( +/obj/structure/rack, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory_clean) +"Hb" = ( +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory) +"Hc" = ( +/obj/structure/table, +/obj/machinery/light/directional/east, +/obj/item/ammo_box/magazine/m7mm, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory_clean) +"Hf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Hh" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Hi" = ( +/obj/structure/railing{ + dir = 9 + }, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"Hj" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/mapping_helpers/airlock/access/all/service, +/obj/machinery/door/airlock/glass{ + name = "Bar" + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Hk" = ( +/obj/effect/turf_decal/siding/blue, +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"Hl" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Hn" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/mapping_helpers/airlock/access/all/service, +/obj/machinery/door/airlock/glass{ + name = "Bar" + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Hp" = ( +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Hq" = ( +/obj/item/stack/rods, +/obj/item/stack/rods, +/obj/item/stack/sheet/iron, +/obj/item/stack/sheet/iron, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Hr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Hs" = ( +/obj/structure/chair/sofa/bench/left, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Ht" = ( +/obj/structure/filingcabinet{ + pixel_x = -1; + pixel_y = 0 + }, +/obj/structure/filingcabinet{ + pixel_x = 8; + pixel_y = 0 + }, +/obj/structure/filingcabinet{ + pixel_x = -10; + pixel_y = 0 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Hv" = ( +/obj/structure/table, +/obj/machinery/light/floor, +/obj/item/fakeartefact, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"Hx" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/carpet/green, +/area/awaymission/beach/heretic) +"Hz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"HA" = ( +/obj/effect/turf_decal/weather/sand{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"HC" = ( +/obj/effect/blessing/invisible, +/turf/open/floor/catwalk_floor/iron_dark, +/area/awaymission/caves/heretic_laboratory) +"HF" = ( +/obj/machinery/computer/cargo/request{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"HH" = ( +/turf/open/floor/mineral/uranium, +/area/awaymission/beach/heretic) +"HJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"HL" = ( +/obj/effect/mapping_helpers/airlock/access/all/security, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"HM" = ( +/mob/living/basic/heretic_summon/stalker, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"HN" = ( +/turf/open/misc/beach/coast{ + dir = 10 + }, +/area/awaymission/beach/heretic) +"HQ" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"HR" = ( +/obj/machinery/door/airlock/hatch, +/obj/effect/mapping_helpers/airlock/access/all/admin/captain, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"HU" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/item/stack/sheet/mineral/sandbags, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"HV" = ( +/turf/open/misc/beach/coast/corner{ + dir = 4 + }, +/area/awaymission/beach/heretic) +"HW" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"HX" = ( +/obj/structure/closet/cabinet, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory) +"Ia" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Ib" = ( +/obj/item/gun/ballistic/automatic/napad/no_mag{ + pixel_x = -3 + }, +/obj/structure/rack, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"Ic" = ( +/obj/structure/table/wood, +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/carpet/purple, +/area/awaymission/caves/heretic_laboratory) +"Id" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Ie" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/airlock/wood, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"If" = ( +/turf/open/floor/carpet/neon, +/area/awaymission/caves/heretic_laboratory) +"Ii" = ( +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/trash/food_packaging, +/obj/structure/closet/crate/secure/trashcart/filled, +/turf/open/floor/plating/airless, +/area/awaymission/caves/heretic_laboratory_clean) +"Ij" = ( +/obj/item/reagent_containers/cup/soda_cans/starkist{ + pixel_y = 16; + pixel_x = 10 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"Ik" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Il" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/cafeteria, +/area/awaymission/caves/heretic_laboratory_clean) +"Im" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/dresser, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"In" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Io" = ( +/obj/machinery/door/window/right/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Ir" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "e"; + pixel_x = -6; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "r"; + pixel_x = 5; + pixel_y = 3 + }, +/obj/machinery/light/red/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Iv" = ( +/obj/structure/table/wood, +/obj/structure/bedsheetbin/empty{ + name = "Towel bin" + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Iw" = ( +/obj/structure/closet/crate/grave, +/turf/open/misc/dirt/jungle, +/area/awaymission/beach/heretic) +"Iz" = ( +/obj/effect/decal/cleanable/rubble, +/obj/structure/flora/rock/pile, +/obj/effect/decal/cleanable/plasma, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"IA" = ( +/obj/machinery/washing_machine, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"IB" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/effect/light_emitter/fake_outdoors, +/turf/open/misc/asteroid, +/area/awaymission/beach/heretic) +"ID" = ( +/obj/structure/closet/cabinet, +/obj/effect/turf_decal/tile/dark_green/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"IF" = ( +/obj/structure/fluff/tram_rail/anchor, +/obj/effect/turf_decal/delivery, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"IG" = ( +/mob/living/basic/heretic_summon/raw_prophet, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/dark_green/fourcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"II" = ( +/obj/structure/fluff/tram_rail, +/obj/effect/oneway{ + dir = 4 + }, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"IJ" = ( +/turf/open/misc/beach/coast{ + dir = 9 + }, +/area/awaymission/beach/heretic) +"IK" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"IL" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"IP" = ( +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"IQ" = ( +/obj/machinery/shower/directional/east, +/obj/structure/window/spawner/directional/north, +/obj/structure/curtain, +/obj/machinery/door/window/right/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"IS" = ( +/obj/machinery/griddle, +/turf/open/floor/iron/cafeteria, +/area/awaymission/caves/heretic_laboratory_clean) +"IV" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/obj/machinery/power/smes/magical{ + desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; + name = "power storage unit" + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"IX" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/item/stack/sheet/mineral/wood, +/obj/effect/decal/remains/xeno, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"IZ" = ( +/obj/effect/turf_decal/tile/green/half/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Ja" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"Jb" = ( +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Jf" = ( +/obj/structure/table, +/obj/machinery/light/floor, +/obj/structure/holosign/barrier/atmos/sturdy, +/obj/item/fake_items/sm_sliver, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"Jg" = ( +/obj/machinery/computer/camera_advanced{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Ji" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 31 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"Jn" = ( +/obj/structure/sign/poster/contraband/double_rainbow/directional/east, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Jo" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Jp" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Jq" = ( +/obj/structure/fence/corner, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"Js" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Jt" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Jv" = ( +/turf/open/floor/black, +/area/awaymission/caves/heretic_laboratory_clean) +"Jw" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/awaymission/beach/heretic) +"Jy" = ( +/obj/effect/mob_spawn/corpse/human/old_pirate_captain, +/obj/structure/bed/maint, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"Jz" = ( +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"JA" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"JB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/indestructible/plating, +/area/awaymission/caves/heretic_laboratory) +"JD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"JE" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/water/beach, +/area/awaymission/beach/heretic) +"JG" = ( +/obj/structure/fluff/tram_rail/anchor, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"JH" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory_clean) +"JI" = ( +/obj/effect/spawner/random/food_or_drink/seed_vault, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"JK" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"JM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/mech_bay_power_console{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"JN" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "j"; + pixel_x = -14; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "u"; + pixel_x = -4; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "m"; + pixel_x = 10; + pixel_y = 1 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"JO" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"JQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"JR" = ( +/obj/effect/turf_decal/tile/dark_green/half/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"JS" = ( +/obj/structure/table/reinforced, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"JT" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/item/toy/plush/moth, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"JU" = ( +/obj/structure/falsewall, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"JW" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/drinks/fullupgrade, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"JX" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"JY" = ( +/obj/structure/table, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Ka" = ( +/obj/effect/spawner/structure/window/reinforced/indestructible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Kb" = ( +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"Kd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/trash/graffiti, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Kg" = ( +/obj/effect/mapping_helpers/airlock/access/all/admin, +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Kj" = ( +/obj/machinery/blackbox_recorder, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Kk" = ( +/obj/machinery/computer/camera_advanced{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"Kl" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/drone, +/obj/item/storage/toolbox/electrical, +/obj/item/storage/toolbox/emergency, +/obj/item/clothing/head/utility/welding, +/obj/item/clothing/head/utility/welding, +/turf/open/floor/pod/dark, +/area/awaymission/beach/heretic) +"Km" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Kn" = ( +/obj/structure/fluff/tram_rail, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/remains/human, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Ko" = ( +/obj/structure/curtain, +/obj/machinery/shower{ + dir = 1 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"Kp" = ( +/obj/effect/landmark/transport/transport_id/heretic, +/obj/structure/transport/linear/tram, +/obj/structure/thermoplastic/light, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Kq" = ( +/obj/machinery/stasis{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Ks" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Ku" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible, +/obj/machinery/door/airlock/maintenance, +/turf/open/indestructible/plating, +/area/awaymission/caves/heretic_laboratory) +"Kx" = ( +/obj/item/grenade/c4, +/obj/item/grenade/c4, +/obj/item/grenade/c4, +/obj/effect/spawner/random/heretic_gateway_low, +/obj/structure/closet, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Ky" = ( +/obj/structure/rack, +/obj/item/shovel/spade, +/obj/item/shovel/spade, +/obj/item/shovel/spade, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"KB" = ( +/turf/closed/indestructible/reinforced, +/area/awaymission/caves/heretic_laboratory) +"KD" = ( +/obj/machinery/door/airlock/medical, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/mapping_helpers/airlock/access/all/medical, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"KE" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/paper_bin/bundlenatural, +/obj/item/pen, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"KF" = ( +/obj/structure/chair/plastic, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"KG" = ( +/obj/item/bedsheet/black/double{ + pixel_x = 0; + pixel_y = 2 + }, +/obj/machinery/light/floor, +/obj/structure/bed/double, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"KH" = ( +/obj/item/radio/intercom/mi13/directional/south, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"KJ" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"KO" = ( +/obj/machinery/computer/communications{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"KQ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"KR" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"KS" = ( +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"KT" = ( +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"La" = ( +/obj/effect/baseturf_helper/beach/sand, +/turf/closed/indestructible/rock, +/area/awaymission/caves/heretic_laboratory_clean) +"Lb" = ( +/obj/structure/table, +/obj/machinery/light/floor, +/obj/item/fake_items/time_stopper, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"Lc" = ( +/obj/structure/chair/sofa/bench{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Le" = ( +/obj/structure/table, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory_clean) +"Lf" = ( +/turf/open/floor/carpet/green, +/area/awaymission/caves/heretic_laboratory) +"Lh" = ( +/turf/closed/indestructible/rock, +/area/awaymission/caves/heretic_laboratory_clean) +"Li" = ( +/obj/structure/fluff/bus/passable{ + icon_state = "wheredahoodat" + }, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"Lj" = ( +/obj/effect/turf_decal/tile/dark/half{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Ln" = ( +/obj/machinery/door/airlock/titanium, +/turf/open/floor/pod/dark, +/area/awaymission/beach/heretic) +"Lo" = ( +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/table, +/turf/open/floor/carpet/green, +/area/awaymission/caves/heretic_laboratory) +"Lp" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Lv" = ( +/obj/structure/fluff/bus/passable, +/turf/open/floor/iron/dark, +/area/awaymission/beach/heretic) +"Lw" = ( +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/sec/surgery{ + pixel_y = 5 + }, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Lx" = ( +/obj/machinery/mass_driver/feeder{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Ly" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/dark_green/half{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"LC" = ( +/obj/effect/turf_decal/delivery, +/obj/item/stack/sheet/mineral/wood, +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"LE" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"LI" = ( +/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/caves/heretic_laboratory) +"LL" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory) +"LN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"LS" = ( +/obj/effect/spawner/random/trash/bin, +/turf/open/misc/dirt/jungle, +/area/awaymission/beach/heretic) +"LU" = ( +/obj/item/bedsheet/black/double{ + pixel_x = 0; + pixel_y = 6 + }, +/obj/structure/bed/double, +/obj/effect/blessing/invisible, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"Ma" = ( +/obj/machinery/door/airlock/highsecurity, +/obj/effect/mapping_helpers/airlock/access/all/security, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Mb" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Md" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Mf" = ( +/obj/structure/fluff/tram_rail/end, +/obj/effect/turf_decal/delivery, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Mg" = ( +/obj/structure/fluff/tram_rail, +/obj/effect/turf_decal/delivery, +/obj/item/stack/sheet/mineral/wood, +/obj/effect/decal/remains/robot, +/obj/structure/holosign/barrier/atmos/tram, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Mh" = ( +/obj/structure/holosign/barrier/atmos/sturdy, +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Mj" = ( +/obj/effect/turf_decal/trimline/red/line, +/turf/closed/wall/mineral/iron, +/area/awaymission/beach/heretic) +"Mk" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Ml" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/catwalk_floor/iron_dark, +/area/awaymission/caves/heretic_laboratory) +"Mn" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"Mo" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"Mq" = ( +/obj/structure/dresser, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"Mr" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/holosign/barrier/atmos/tram, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Ms" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/sign/poster/contraband/donk_co/directional/east, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"Mt" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/admin, +/obj/machinery/door/puzzle/keycard/misc_anomalies, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Mu" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Mw" = ( +/obj/item/stack/ore/uranium, +/turf/open/water/jungle, +/area/awaymission/beach/heretic) +"Mz" = ( +/obj/structure/bodycontainer/crematorium{ + dir = 4; + id = "crematoriumChapel" + }, +/turf/open/floor/iron/dark/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"MB" = ( +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"MD" = ( +/obj/machinery/door/airlock/medical{ + name = "Surgery B" + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/medical, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"MH" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"MI" = ( +/obj/item/clothing/neck/stethoscope, +/obj/item/wrench, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"ML" = ( +/obj/structure/bookcase/random, +/obj/machinery/light/directional/west, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"MP" = ( +/obj/structure/fluff/tram_rail, +/obj/structure/thermoplastic/light, +/obj/effect/spawner/random/structure/shipping_container, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"MR" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"MS" = ( +/obj/machinery/vending/donksnack, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"MT" = ( +/mob/living/basic/heretic_summon/stalker, +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"MV" = ( +/turf/closed/indestructible/reinforced/titanium, +/area/awaymission/caves/heretic_laboratory_clean) +"MW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"MX" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"MY" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Na" = ( +/turf/open/misc/dirt/jungle, +/area/awaymission/beach/heretic) +"Nb" = ( +/obj/effect/mapping_helpers/airlock/access/all/security, +/obj/machinery/door/airlock/security{ + name = "Armory" + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Nc" = ( +/obj/machinery/light/directional/east, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Ne" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"Ni" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"Nj" = ( +/obj/machinery/light/directional/west, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Nm" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Nn" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/security, +/obj/machinery/door/puzzle/keycard/misc_anomalies, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Np" = ( +/obj/effect/decal/cleanable/blood/tracks/xeno, +/turf/open/floor/mineral/uranium, +/area/awaymission/beach/heretic) +"Nq" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/door/airlock/hatch, +/obj/effect/mapping_helpers/airlock/access/all/service, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Ns" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"Nt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Nu" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/double, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"Nv" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"Nz" = ( +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/turf/open/misc/beach/sand, +/area/awaymission/caves/heretic_laboratory_clean) +"NA" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"NB" = ( +/obj/effect/spawner/random/heretic_gateway, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"ND" = ( +/obj/structure/sign/poster/contraband/babel_device/directional/east, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"NG" = ( +/obj/structure/safe/floor, +/obj/item/reagent_containers/cup/glass/bottle/beer, +/obj/item/reagent_containers/cup/glass/bottle/beer, +/obj/item/cigarette/rollie/cannabis, +/obj/item/cigarette/rollie/cannabis, +/obj/item/cigarette/rollie/cannabis, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"NI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/mob/living/basic/migo, +/obj/effect/turf_decal/tile/bar/fourcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"NO" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/item/toy/plush/moth, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"NQ" = ( +/obj/structure/sink/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory_clean) +"NU" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"NW" = ( +/obj/effect/spawner/random/structure/shipping_container, +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"NX" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"NY" = ( +/obj/structure/table/optable, +/turf/open/floor/stone, +/area/awaymission/beach/heretic) +"Oa" = ( +/obj/structure/chair/comfy{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Oc" = ( +/obj/structure/table/wood, +/obj/item/pen, +/turf/open/floor/plating/airless, +/area/awaymission/caves/heretic_laboratory_clean) +"Od" = ( +/obj/machinery/door/airlock/external/ruin, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"Oe" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"Of" = ( +/obj/structure/chair/wood, +/turf/open/floor/carpet/green, +/area/awaymission/beach/heretic) +"Og" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Oh" = ( +/obj/structure/fluff/tram_rail/anchor{ + dir = 1 + }, +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/thermoplastic/light, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"Oi" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 6 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Ok" = ( +/obj/effect/turf_decal/tile/dark_red/half/contrasted, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Ol" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/carpet/neon, +/area/awaymission/caves/heretic_laboratory) +"Op" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/structure/sign/poster/contraband/free_tonto/directional/west, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Oq" = ( +/obj/item/seeds/organ_tree, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"Or" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Ot" = ( +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Ow" = ( +/obj/structure/flora/grass/jungle/a/style_random, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"Ox" = ( +/obj/effect/turf_decal/tile/dark_green/half{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Oz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/trash/grille_or_waste, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"OC" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/sign/poster/abductor/ayy_piping/directional/east, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"OD" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"OG" = ( +/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/plating, +/area/awaymission/caves/heretic_laboratory) +"OJ" = ( +/obj/machinery/teleport/station{ + name = "Forcefield generator" + }, +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"OK" = ( +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/stack/rods/fifty, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"OL" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/radio/intercom/mi13/directional/east, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"OM" = ( +/obj/item/clothing/mask/gas/welding/up, +/obj/effect/decal/cleanable/blood/tracks/xeno, +/obj/item/organ/tail/xeno, +/obj/item/stack/sheet/animalhide/xeno, +/obj/item/stack/sheet/xenochitin, +/obj/effect/decal/cleanable/blood/gibs/xeno/larva/body, +/obj/effect/decal/remains/xeno, +/obj/effect/light_emitter, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"OP" = ( +/obj/machinery/light/directional/north, +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/pod/dark, +/area/awaymission/beach/heretic) +"OQ" = ( +/obj/machinery/vending/boozeomat, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"OR" = ( +/obj/structure/table/wood, +/obj/structure/curtain/cloth, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"OS" = ( +/obj/effect/temp_visual/drawing_heretic_rune, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"OW" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"OY" = ( +/obj/machinery/door/airlock/medical, +/obj/effect/mapping_helpers/airlock/access/all/medical, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"OZ" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/dark/half{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Pa" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "j"; + pixel_x = -14; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "u"; + pixel_x = -4; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "m"; + pixel_x = 10; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Pb" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Pc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/blessing/invisible, +/turf/open/floor/catwalk_floor/iron_dark, +/area/awaymission/caves/heretic_laboratory) +"Ph" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/pod/light, +/area/awaymission/beach/heretic) +"Pj" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Pl" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"Pp" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Pq" = ( +/obj/machinery/vending/sustenance, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Pw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Px" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Py" = ( +/turf/open/floor/carpet/blue, +/area/awaymission/beach/heretic) +"Pz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"PA" = ( +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"PC" = ( +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"PD" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"PE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/mob/living/basic/faithless, +/obj/effect/turf_decal/tile/bar/fourcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"PF" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/door/poddoor/shutters/indestructible, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"PG" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/machinery/door/firedoor/heavy, +/obj/effect/mapping_helpers/airlock/access/all/admin/captain, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/puzzle/keycard/misc_anomalies, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"PK" = ( +/obj/machinery/door/airlock/titanium, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/pod/light, +/area/awaymission/beach/heretic) +"PL" = ( +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/west, +/obj/structure/flora/bush/jungle/c/style_random, +/obj/effect/blessing/invisible, +/turf/open/misc/grass/jungle, +/area/awaymission/caves/heretic_laboratory) +"PN" = ( +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/west, +/obj/structure/flora/bush/jungle/c/style_random, +/turf/open/misc/grass/jungle, +/area/awaymission/caves/heretic_laboratory) +"PP" = ( +/obj/structure/flora/tree/palm/style_random, +/obj/structure/flora/coconuts, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"PT" = ( +/obj/machinery/light/floor, +/obj/structure/closet/crate/freezer, +/obj/item/organ/eyes/corrupt, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"PU" = ( +/obj/machinery/door/airlock{ + name = "Personal Dorm" + }, +/obj/effect/mapping_helpers/airlock/access/all/security, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"PV" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/admin, +/obj/machinery/door/puzzle/keycard/highsec_access, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"PX" = ( +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/east, +/obj/structure/flora/bush/jungle/c/style_random, +/turf/open/misc/grass/jungle, +/area/awaymission/caves/heretic_laboratory) +"Qb" = ( +/obj/structure/safe/floor, +/obj/item/keycard/highsec_access, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"Qd" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Qf" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/sand{ + dir = 5 + }, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"Qh" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Qi" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/rd/double, +/turf/open/floor/carpet/purple, +/area/awaymission/caves/heretic_laboratory) +"Qj" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Qk" = ( +/obj/item/bedsheet/black/double{ + dir = 4; + pixel_x = 0; + pixel_y = 6 + }, +/obj/structure/bed/double{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"Ql" = ( +/obj/structure/fence{ + dir = 8 + }, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"Qm" = ( +/mob/living/basic/heretic_summon/ash_spirit, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/dark_green/fourcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Qn" = ( +/obj/effect/mapping_helpers/airlock/access/all/supply, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Qo" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/obj/structure/curtain/cloth/fancy/mechanical/start_closed, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"Qr" = ( +/obj/effect/spawner/random/trash/bacteria, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Qt" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/turf_decal/tile/dark_red/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Qx" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"Qz" = ( +/obj/structure/table, +/obj/machinery/light/floor, +/obj/item/gun/energy/shrink_ray/one_shot, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"QA" = ( +/mob/living/basic/heretic_summon/stalker, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"QB" = ( +/obj/effect/decal/cleanable/blood/tracks/xeno{ + dir = 5 + }, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"QE" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"QF" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"QG" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"QI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/door/airlock/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"QK" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet/green, +/area/awaymission/beach/heretic) +"QL" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"QM" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"QN" = ( +/obj/machinery/cryo_cell{ + dir = 8 + }, +/turf/open/floor/iron/white/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"QO" = ( +/obj/structure/fluff/tram_rail, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, +/obj/structure/chair/sofa/bench/tram/solo{ + dir = 4 + }, +/obj/structure/transport/linear/tram, +/obj/structure/thermoplastic/light, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"QP" = ( +/mob/living/basic/venus_human_trap, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"QW" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"QZ" = ( +/obj/machinery/door/airlock/highsecurity, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Ra" = ( +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Rb" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"Re" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"Rf" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"Rl" = ( +/obj/structure/closet/cardboard, +/obj/effect/spawner/random/heretic_gateway_low, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Rn" = ( +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory_clean) +"Rp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Rq" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Rs" = ( +/obj/structure/flora/bush/jungle/a/style_random, +/obj/effect/decal/cleanable/blood/tracks/xeno{ + dir = 10 + }, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"Rt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Ru" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Rv" = ( +/obj/effect/turf_decal/tile/bar/fourcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Rw" = ( +/obj/effect/decal/cleanable/blood/tracks/xeno{ + dir = 9 + }, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"Ry" = ( +/turf/open/lava, +/area/awaymission/caves/heretic_laboratory_clean) +"Rz" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/beach/heretic) +"RA" = ( +/obj/structure/table, +/obj/machinery/light/floor, +/obj/item/gun/magic/staff, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"RB" = ( +/obj/structure/closet/cabinet, +/obj/effect/turf_decal/tile/bar/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"RE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/barricade/wooden, +/obj/structure/barricade/wooden/crude, +/obj/effect/light_emitter/fake_outdoors, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"RH" = ( +/obj/item/fishing_rod, +/obj/structure/closet/crate/trashcart, +/obj/item/reagent_containers/cup/glass/bottle/rum/aged, +/obj/effect/spawner/random/heretic_gateway, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"RI" = ( +/obj/structure/window/fulltile, +/obj/structure/flora/bush/ferny/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/grass, +/area/awaymission/caves/heretic_laboratory) +"RM" = ( +/obj/machinery/door/airlock/highsecurity, +/obj/effect/mapping_helpers/airlock/access/all/away/general, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"RP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/half{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"RR" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/gibspawner/human/bodypartless, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"RS" = ( +/obj/machinery/shower/directional/east, +/obj/structure/fluff/shower_drain, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/white/smooth_large, +/area/awaymission/caves/heretic_laboratory) +"RT" = ( +/obj/structure/table/wood/fancy, +/obj/item/knife/combat, +/obj/item/knife/hunting, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"RU" = ( +/obj/structure/sign/poster/official/safety_internals/directional/west, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"RW" = ( +/obj/structure/table, +/obj/item/stack/sheet/rglass/fifty{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/stack/sheet/rglass/fifty{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"RY" = ( +/obj/structure/table, +/obj/effect/spawner/random/exotic/tool, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"RZ" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Sb" = ( +/obj/machinery/camera/xray/directional/north, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"Sc" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/light/small/directional/north, +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"Sd" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/awaymission/caves/heretic_laboratory) +"Sg" = ( +/obj/structure/rack, +/obj/machinery/light/directional/north, +/obj/item/shovel, +/obj/item/shovel, +/obj/item/shovel, +/obj/item/shovel, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"Sh" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Si" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"Sk" = ( +/obj/structure/fluff/tram_rail, +/obj/effect/decal/remains/human, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Sl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"Sm" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/indestructible, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"Sn" = ( +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/obj/structure/sign/poster/contraband/blood_geometer/directional/north, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Sq" = ( +/obj/item/keycard/heretic_entrance, +/turf/open/floor/black, +/area/awaymission/caves/heretic_laboratory_clean) +"Sr" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/indestructible/plating, +/area/awaymission/caves/heretic_laboratory) +"Ss" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/sign/poster/contraband/eistee/directional/west, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"St" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/dark_green/half/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Su" = ( +/obj/structure/table, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Sv" = ( +/turf/closed/mineral/ash_rock, +/area/awaymission/caves/heretic_laboratory_clean) +"Sx" = ( +/obj/machinery/door/window/right/directional/south, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"SB" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"SC" = ( +/obj/structure/closet/cabinet, +/obj/item/sticker/pslime, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory) +"SG" = ( +/obj/machinery/vending/engivend, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"SI" = ( +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"SL" = ( +/obj/structure/fluff/bus/dense{ + icon_state = "fronttire" + }, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"SM" = ( +/obj/effect/decal/cleanable/blood/oil, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"SN" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"SP" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/chair/stool/bar/directional/north, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"SQ" = ( +/obj/item/paper/fluff/awaymissions/heretic/blackroomhint, +/turf/open/floor/black, +/area/awaymission/caves/heretic_laboratory_clean) +"SR" = ( +/obj/machinery/telecomms/relay/preset/telecomms, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"ST" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"SW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/cafeteria, +/area/awaymission/caves/heretic_laboratory_clean) +"SX" = ( +/obj/structure/fluff/bus/passable, +/obj/item/reagent_containers/condiment/saltshaker, +/turf/open/floor/iron/dark, +/area/awaymission/beach/heretic) +"SY" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"Tb" = ( +/obj/effect/light_emitter/fake_outdoors, +/turf/open/water/beach, +/area/awaymission/beach/heretic) +"Tc" = ( +/obj/structure/closet/cabinet, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Td" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical/glass, +/obj/effect/mapping_helpers/airlock/access/all/medical, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Te" = ( +/obj/structure/barricade/wooden, +/obj/structure/barricade/wooden/crude, +/obj/machinery/light/directional/east, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Tf" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 8 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Ti" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Tk" = ( +/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/awaymission/caves/heretic_laboratory) +"Tl" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"Tm" = ( +/obj/structure/bookcase/random, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"Tn" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Tp" = ( +/obj/structure/rack, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Tq" = ( +/obj/machinery/door/window/survival_pod/left/directional/east, +/obj/machinery/light/directional/north, +/turf/open/floor/carpet/green, +/area/awaymission/caves/heretic_laboratory) +"Ts" = ( +/obj/effect/turf_decal/tile/bar/half/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"TA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"TB" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"TD" = ( +/mob/living/basic/construct/wraith, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/bar/fourcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"TF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"TG" = ( +/obj/machinery/light/directional/east, +/obj/effect/blessing/invisible, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"TH" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"TI" = ( +/obj/structure/chair/plastic{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"TJ" = ( +/obj/machinery/shower/directional/east, +/obj/structure/window/spawner/directional/north, +/obj/machinery/door/window/right/directional/east, +/obj/structure/curtain, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory_clean) +"TL" = ( +/obj/structure/chair/plastic, +/turf/open/floor/plating/airless, +/area/awaymission/caves/heretic_laboratory_clean) +"TM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"TN" = ( +/obj/structure/table, +/obj/item/paperwork/research, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"TO" = ( +/obj/effect/decal/remains/robot, +/obj/machinery/light/directional/east, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"TQ" = ( +/obj/machinery/door/puzzle/keycard/highsec_access, +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"TT" = ( +/obj/structure/fluff/bus/dense{ + icon_state = "hoodtop" + }, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"TV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ + dir = 4 + }, +/turf/closed/indestructible/reinforced, +/area/awaymission/caves/heretic_laboratory) +"TY" = ( +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Ua" = ( +/turf/open/misc/beach/coast{ + dir = 8 + }, +/area/awaymission/caves/heretic_laboratory_clean) +"Uc" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/sand{ + dir = 9 + }, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"Ug" = ( +/turf/open/misc/beach/coast/corner, +/area/awaymission/beach/heretic) +"Ui" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Uj" = ( +/obj/item/stack/sheet/plasteel/twenty, +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Um" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/effect/oneway{ + dir = 4 + }, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"Un" = ( +/obj/effect/baseturf_helper/beach/sand, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Uo" = ( +/obj/machinery/light/directional/east, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"Up" = ( +/obj/machinery/vending/security, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Uq" = ( +/obj/machinery/shower{ + pixel_y = 15 + }, +/obj/structure/curtain, +/turf/open/floor/iron/white, +/area/awaymission/beach/heretic) +"Ur" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/machinery/camera/xray/directional/north, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"Uy" = ( +/obj/item/kirbyplants/fern, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/green/half/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"UA" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/west, +/turf/open/floor/carpet/green, +/area/awaymission/beach/heretic) +"UC" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory_clean) +"UD" = ( +/obj/machinery/teleport/station{ + name = "Forcefield generator" + }, +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"UE" = ( +/obj/structure/rack, +/obj/effect/spawner/random/armory/disablers, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"UF" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "e"; + pixel_x = -6; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "r"; + pixel_x = 5; + pixel_y = 3 + }, +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"UG" = ( +/obj/machinery/vending/modularpc, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"UK" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"UL" = ( +/obj/structure/transport/linear/tram, +/obj/structure/thermoplastic/light, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"UN" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Telecomms" + }, +/obj/effect/mapping_helpers/airlock/access/all/away/general, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"UO" = ( +/obj/machinery/computer/atmos_alert{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"UQ" = ( +/obj/machinery/atmospherics/miner/oxygen, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"US" = ( +/obj/structure/closet/radiation, +/turf/open/floor/mineral/uranium, +/area/awaymission/beach/heretic) +"UT" = ( +/obj/machinery/power/shuttle_engine/propulsion/left{ + dir = 8 + }, +/turf/open/floor/plating, +/area/awaymission/beach/heretic) +"UV" = ( +/obj/effect/turf_decal/tile/dark/half{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"UX" = ( +/mob/living/basic/heretic_summon/stalker, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"UY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/mob/living/basic/trooper/nanotrasen/ranged/smg/peaceful, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Vb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Ve" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Vh" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Vi" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Vj" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Vl" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Vn" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Vr" = ( +/obj/machinery/door/window/right/directional/north, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"Vt" = ( +/turf/open/indestructible/plating, +/area/awaymission/caves/heretic_laboratory) +"Vy" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"Vz" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/decal/remains/xeno, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"VA" = ( +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory_clean) +"VB" = ( +/obj/structure/table, +/obj/item/radio{ + pixel_x = -4 + }, +/obj/item/radio, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"VC" = ( +/obj/structure/fluff/tram_rail/anchor{ + dir = 1 + }, +/obj/structure/transport/linear/tram, +/obj/structure/thermoplastic/light, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"VD" = ( +/obj/machinery/atmospherics/components/trinary/mixer/airmix/inverse{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"VF" = ( +/obj/structure/holosign/barrier/atmos/sturdy, +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"VG" = ( +/obj/structure/table, +/obj/item/fake_items/lahti_l39{ + pixel_x = 16 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory_clean) +"VI" = ( +/obj/structure/table, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"VJ" = ( +/obj/structure/rack, +/obj/item/storage/box/drinkingglasses, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"VQ" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"VR" = ( +/obj/structure/fence, +/turf/open/misc/dirt/jungle, +/area/awaymission/beach/heretic) +"VT" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 5 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"VW" = ( +/obj/machinery/power/smes/magical{ + desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; + name = "power storage unit" + }, +/obj/machinery/light/directional/west, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"VX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"VY" = ( +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"VZ" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/carpet/green, +/area/awaymission/beach/heretic) +"Wa" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"Wc" = ( +/obj/effect/decal/remains/human, +/obj/machinery/light/directional/east, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Wd" = ( +/turf/open/floor/iron/checker, +/area/awaymission/caves/heretic_laboratory) +"Wi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/turf_decal/siding/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Wj" = ( +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Wk" = ( +/obj/item/bedsheet/black{ + dir = 4 + }, +/obj/structure/bed{ + dir = 4 + }, +/turf/open/floor/stone, +/area/awaymission/beach/heretic) +"Wl" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/clown/directional/east, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Wn" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Wo" = ( +/obj/machinery/power/rtg/lavaland, +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Wr" = ( +/obj/effect/blessing/invisible, +/obj/effect/blessing/invisible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"Ws" = ( +/obj/structure/fluff/beach_umbrella/science, +/turf/open/misc/beach/sand, +/area/awaymission/beach/heretic) +"Ww" = ( +/obj/structure/table, +/obj/item/storage/toolbox/drone, +/obj/item/flashlight, +/obj/item/flashlight, +/obj/item/flashlight/flare, +/obj/item/flashlight/flare, +/obj/item/flashlight/flare, +/obj/item/flashlight/flare{ + pixel_y = 6 + }, +/obj/item/flashlight/flare{ + pixel_y = 6 + }, +/obj/item/flashlight/flare{ + pixel_y = 6 + }, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Wx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Wy" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "j"; + pixel_x = -14; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "u"; + pixel_x = -4; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "m"; + pixel_x = 10; + pixel_y = 1 + }, +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Wz" = ( +/obj/effect/turf_decal/trimline/red/arrow_ccw, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack{ + pixel_y = 8; + pixel_x = -15; + anchored = 1; + name = "Sam Site Missle rack" + }, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"WA" = ( +/obj/machinery/door/airlock/hatch, +/obj/effect/mapping_helpers/airlock/access/all/service, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"WD" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/supply, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/puzzle/keycard/heretic_entrance, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"WF" = ( +/obj/structure/dresser, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory_clean) +"WJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/carpet/green, +/area/awaymission/beach/heretic) +"WK" = ( +/obj/structure/fluff/tram_rail/end{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"WN" = ( +/obj/item/radio/intercom/mi13/directional/east, +/obj/effect/blessing/invisible, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"WO" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"WP" = ( +/obj/machinery/door/airlock/hatch, +/obj/structure/holosign/barrier/atmos/sturdy, +/obj/effect/blessing/invisible, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"WR" = ( +/obj/effect/decal/cleanable/rubble, +/obj/effect/decal/cleanable/plasma, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"WT" = ( +/obj/effect/spawner/random/trash, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"WU" = ( +/obj/structure/table, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/parquet, +/area/awaymission/caves/heretic_laboratory) +"WV" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"WY" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"WZ" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/turf_decal/tile/dark_green/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Xa" = ( +/obj/structure/flora/bush/jungle/a/style_random, +/obj/effect/decal/cleanable/blood/tracks/xeno, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"Xb" = ( +/obj/structure/table, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"Xc" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"Xd" = ( +/obj/structure/falsewall, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Xe" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Xg" = ( +/obj/structure/closet/secure_closet, +/obj/item/crowbar, +/obj/item/wrench, +/obj/item/clothing/neck/stethoscope, +/obj/item/stack/tile/iron/small, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Xh" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Xk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Xl" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Xm" = ( +/obj/structure/fluff/tram_rail/anchor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Xn" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Xo" = ( +/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/awaymission/caves/heretic_laboratory) +"Xq" = ( +/obj/item/wrench, +/obj/effect/light_emitter, +/turf/open/misc/grass/jungle/station, +/area/awaymission/beach/heretic) +"Xs" = ( +/obj/machinery/stasis{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Xu" = ( +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Xv" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Xx" = ( +/obj/machinery/shower/directional/south, +/obj/structure/curtain, +/obj/structure/fluff/shower_drain, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Xy" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/item/radio/intercom/mi13/directional/west, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"XB" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = 6; + pixel_y = 10 + }, +/obj/item/storage/pill_bottle/mannitol, +/obj/item/reagent_containers/dropper{ + pixel_y = 6 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"XC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"XI" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/machinery/camera/directional/east{ + network = list("ss13","medbay"); + c_tag = "Medical - Surgery B" + }, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/machinery/light_switch/directional/east{ + pixel_x = 22; + pixel_y = -9 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"XL" = ( +/obj/machinery/door/window/survival_pod/left/directional/east, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"XO" = ( +/obj/structure/sign/poster/contraband/beekind/directional/west, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"XQ" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/item/radio/intercom/mi13/directional/east, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"XR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/bar/half/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"XS" = ( +/obj/structure/chair/plastic{ + dir = 1 + }, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"XU" = ( +/obj/machinery/computer/operating, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"XV" = ( +/obj/structure/fluff/bus/passable/seat/driver, +/turf/open/floor/iron/dark, +/area/awaymission/beach/heretic) +"XY" = ( +/obj/item/bedsheet/black/double{ + pixel_x = 0; + pixel_y = 10 + }, +/obj/structure/bed/double, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"XZ" = ( +/obj/structure/fluff/tram_rail/anchor, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Ya" = ( +/obj/structure/mop_bucket/janitorialcart, +/obj/item/reagent_containers/cup/bucket/wooden, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Yb" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/bar/half/contrasted, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Yc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"Yd" = ( +/obj/machinery/conveyor/auto{ + dir = 10 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Ye" = ( +/obj/machinery/vending/wardrobe/medi_wardrobe, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/caves/heretic_laboratory) +"Yh" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Yi" = ( +/obj/structure/reagent_dispensers/fueltank/large, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Yj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/indestructible/plating, +/area/awaymission/caves/heretic_laboratory) +"Ym" = ( +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/west, +/obj/structure/window/spawner/directional/south, +/obj/structure/flora/bush/jungle/c/style_random, +/obj/effect/blessing/invisible, +/turf/open/misc/grass/jungle, +/area/awaymission/caves/heretic_laboratory) +"Yn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/light_emitter/fake_outdoors, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory_clean) +"Yo" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"Yp" = ( +/obj/structure/table, +/turf/open/floor/carpet/green, +/area/awaymission/caves/heretic_laboratory) +"Yq" = ( +/obj/structure/closet/cabinet, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"Yr" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/mop_bucket/janitorialcart, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Yt" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/textured, +/area/awaymission/caves/heretic_laboratory) +"Yu" = ( +/obj/structure/table, +/obj/machinery/light/directional/east, +/obj/item/ammo_box/magazine/lahtimagazine{ + anchored = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory_clean) +"Yv" = ( +/turf/closed/wall/mineral/plastitanium{ + color = "#000000" + }, +/area/awaymission/caves/heretic_laboratory_clean) +"Yw" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"Yx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 1 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Yy" = ( +/obj/structure/chair/comfy/shuttle/tactical, +/mob/living/basic/trooper/nanotrasen/ranged/smg/peaceful{ + name = "Man filled with fear"; + desc = "This man, has terror in his eyes, he stays deadset on the console and he is constantly twitching, he doesnt acknowledge you and he doesnt do anything besides sit there. This mans mind seems to be lost" + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"YA" = ( +/obj/structure/table, +/obj/item/storage/medkit/regular{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/medkit/regular, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"YG" = ( +/obj/structure/fluff/tram_rail/anchor, +/obj/structure/fluff/tram_rail, +/turf/open/misc/asteroid, +/area/awaymission/caves/heretic_laboratory) +"YL" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/item/stack/sheet/rglass/fifty{ + pixel_x = -6; + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory) +"YN" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/iron/cafeteria, +/area/awaymission/caves/heretic_laboratory_clean) +"YO" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"YP" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/barricade/wooden, +/obj/structure/barricade/wooden/crude, +/obj/effect/light_emitter/fake_outdoors, +/turf/open/floor/wood, +/area/awaymission/beach/heretic) +"YR" = ( +/obj/machinery/oven/range, +/turf/open/floor/iron/cafeteria, +/area/awaymission/caves/heretic_laboratory_clean) +"YS" = ( +/obj/effect/landmark/transport/nav_beacon/tram/platform/heretic/right, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"YW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory_clean) +"YX" = ( +/obj/machinery/autolathe, +/turf/open/floor/carpet/royalblack, +/area/awaymission/beach/heretic) +"Za" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/purple, +/area/awaymission/caves/heretic_laboratory) +"Zb" = ( +/obj/effect/spawner/random/heretic_gateway_low, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Zc" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/awaymission/beach/heretic) +"Zd" = ( +/obj/effect/decal/cleanable/rubble, +/obj/structure/flora/rock/pile, +/turf/open/floor/asphalt, +/area/awaymission/beach/heretic) +"Zf" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/remains/human, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Zg" = ( +/turf/open/misc/beach/coast{ + dir = 6 + }, +/area/awaymission/beach/heretic) +"Zi" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Zj" = ( +/obj/machinery/shower/directional/east, +/obj/item/soap, +/turf/open/floor/iron/freezer, +/area/awaymission/caves/heretic_laboratory) +"Zk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"Zo" = ( +/obj/effect/gibspawner, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Zp" = ( +/mob/living/basic/slime/pet{ + name = "Gilbert"; + desc = "What a cute slime, they seem relieved to see you" + }, +/turf/open/floor/wood, +/area/awaymission/caves/heretic_laboratory) +"Zs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/caves/heretic_laboratory) +"Zv" = ( +/obj/machinery/shower/directional/north, +/obj/structure/curtain, +/obj/structure/fluff/shower_drain, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Zw" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"Zy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"ZD" = ( +/obj/machinery/vending/wardrobe/sec_wardrobe, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"ZG" = ( +/obj/item/weldingtool/hugetank, +/obj/item/clothing/head/utility/welding, +/obj/item/wrench, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory_clean) +"ZH" = ( +/turf/open/misc/beach/coast, +/area/awaymission/beach/heretic) +"ZI" = ( +/obj/structure/falsewall, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/caves/heretic_laboratory) +"ZK" = ( +/obj/effect/turf_decal/tile/dark_green/half{ + dir = 8 + }, +/obj/item/radio/intercom/mi13/directional/west, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"ZL" = ( +/obj/machinery/door/airlock/highsecurity{ + max_integrity = 10000; + normal_integrity = 10000 + }, +/obj/effect/mapping_helpers/airlock/access/all/security, +/obj/machinery/door/puzzle/keycard/weapon_anomalies, +/turf/open/floor/iron/small, +/area/awaymission/caves/heretic_laboratory) +"ZM" = ( +/obj/machinery/computer/telecomms/monitor{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory_clean) +"ZO" = ( +/obj/machinery/door/airlock/highsecurity, +/obj/effect/mapping_helpers/airlock/access/all/away/general, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"ZP" = ( +/obj/effect/turf_decal/trimline/red/filled, +/turf/open/floor/iron/large, +/area/awaymission/beach/heretic) +"ZQ" = ( +/obj/machinery/light/directional/east, +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/blessing/invisible, +/turf/open/floor/iron/dark, +/area/awaymission/caves/heretic_laboratory) +"ZV" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/caves/heretic_laboratory_clean) +"ZX" = ( +/obj/effect/decal/cleanable/blood/tracks{ + 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/awaymission/caves/heretic_laboratory) +"ZY" = ( +/obj/machinery/mech_bay_recharge_port, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/large, +/area/awaymission/caves/heretic_laboratory) +"ZZ" = ( +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/west, +/obj/structure/flora/bush/jungle/c/style_random, +/obj/effect/blessing/invisible, +/turf/open/misc/grass/jungle, +/area/awaymission/caves/heretic_laboratory) + +(1,1,1) = {" +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +"} +(2,1,1) = {" +Lh +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +La +Lh +"} +(3,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +KB +KB +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(4,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +oO +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +yV +OC +yV +tN +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +Eg +NO +gY +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +KB +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(5,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +fC +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +yb +yV +yV +yV +yV +yV +yV +wT +yV +tN +xl +JT +kF +gU +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +mE +mE +Mz +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(6,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +fC +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +hg +WV +GW +hg +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +xl +KB +KB +KB +KB +KB +KB +KB +xl +Mh +xl +nh +od +Yd +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +xQ +xQ +xQ +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(7,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +fC +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +hg +WV +GW +hg +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +rA +yX +yX +yX +yX +yX +gy +IK +gy +yX +yX +yX +yX +yX +yX +yX +yX +yX +yX +yX +yX +Ct +QG +QG +QG +Xd +cX +UX +du +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(8,1,1) = {" +Lh +Dj +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +fC +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +nb +zh +YG +nb +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +sx +KB +ay +ay +ay +KB +xl +Mh +xl +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +ZI +KB +KB +KB +KB +Yr +yo +pf +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(9,1,1) = {" +Lh +Dj +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +fC +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +hg +WV +GW +hg +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +sx +KB +ay +rF +ay +KB +wn +wh +wn +KB +Yi +GL +fW +fW +fW +ay +ay +ay +KB +lm +lm +Xk +lm +lm +lm +KB +KB +iJ +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(10,1,1) = {" +Lh +Dj +nI +nI +EJ +EJ +EJ +EJ +tR +EJ +tR +EJ +tR +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +fC +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +hg +WV +GW +hg +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +sx +KB +KB +KB +KB +KB +wn +wh +wn +KB +Bf +fW +fW +fW +ay +ay +ay +ay +KB +lm +KQ +Rp +lv +Zi +lm +KB +nF +up +sk +KB +ov +up +sk +KB +ov +up +sk +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(11,1,1) = {" +Lh +Dj +nI +nI +EJ +EJ +EJ +tR +IJ +gK +gK +gK +HN +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +fC +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +nb +zh +YG +nb +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +sx +KB +Sv +Sv +Sv +Sv +wn +wh +wn +KB +fW +Qd +nE +kg +KB +hJ +hJ +hJ +KB +lm +lO +Rp +jT +lm +lm +KB +XU +mY +Vj +KB +XU +mY +Vj +KB +XU +mY +Vj +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(12,1,1) = {" +Lh +Dj +nI +nI +EJ +EJ +EJ +EJ +pv +Gm +RH +wm +Fl +HN +tR +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +fC +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +hg +WV +GW +hg +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +sx +KB +Sv +Sv +Sv +Sv +wn +wh +wn +KB +fW +qP +cL +aw +mq +xQ +xQ +xQ +KB +Zi +ay +Xk +lO +lm +lm +KB +Og +CI +mg +KB +Og +CI +mg +KB +Og +CI +mg +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(13,1,1) = {" +Lh +Dj +nI +nI +EJ +EJ +EJ +tR +pv +PA +dd +Jy +os +ZH +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +fC +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +hg +WV +GW +hg +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +sx +KB +Sv +Sv +Sv +Sv +wn +wh +wn +KB +ay +wz +cL +aw +mq +xQ +xQ +xQ +KB +lm +jT +Xk +KQ +lO +lm +KB +dU +Ck +Vj +KB +dU +Ck +Vj +KB +dU +Ck +Vj +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(14,1,1) = {" +Lh +Dj +nI +nI +EJ +EJ +EJ +EJ +pv +PA +nP +PA +PA +ZH +tR +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +fC +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +nb +iL +Dk +nb +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +sx +KB +Sv +Sv +Sv +Sv +wn +wh +wn +KB +ay +wz +cL +aw +mq +xQ +xQ +xQ +KB +lm +Nc +Rp +Gb +lm +lm +KB +XI +uh +Dt +KB +XI +uh +Dt +KB +XI +uh +Dt +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(15,1,1) = {" +Lh +Dj +nI +nI +EJ +EJ +EJ +tR +pv +hB +PA +dd +PA +ZH +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +fC +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +hg +Fw +MP +hg +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +sx +KB +Sv +Sv +Sv +Sv +wn +wh +wn +KB +KB +zF +cL +JG +KB +xQ +xQ +Pj +KB +KB +KB +ZI +KB +KB +KB +KB +KB +MD +KB +KB +KB +MD +KB +KB +KB +MD +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(16,1,1) = {" +Lh +Dj +nI +nI +EJ +EJ +EJ +EJ +Dx +hk +dR +FM +PA +ZH +tR +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +fC +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +hg +Fw +ER +hg +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +sx +KB +Sv +Sv +Sv +Sv +wn +wh +wn +KB +xQ +wz +cL +aw +mq +xQ +xQ +bR +Td +JA +vs +cC +sD +sD +sD +id +wd +sg +qB +qB +qB +sg +qB +qB +qB +HW +yJ +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(17,1,1) = {" +Lh +Dj +nI +nI +EJ +EJ +EJ +EJ +tR +EJ +Dx +hk +hk +Zg +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +fC +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +KB +KB +KB +nb +Oh +yu +nb +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +sx +KB +Sv +Sv +Sv +Sv +wn +wh +wn +KB +xQ +wz +cL +aw +mq +xQ +xQ +bR +Td +JA +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(18,1,1) = {" +Lh +Dj +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +tR +EJ +tR +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +cz +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +lB +iz +RW +KB +hg +aL +sc +hg +KB +Sv +Sv +Sv +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +JU +KB +Sv +Sv +Sv +Sv +wn +wh +wn +KB +xQ +wz +cL +aw +mq +xQ +xQ +bR +Td +JA +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Km +Xu +Xu +Xu +Km +vS +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(19,1,1) = {" +Lh +Dj +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +TQ +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +Sv +Sv +Sv +KB +KB +KB +KB +KB +KB +KB +Sv +KB +Cn +mo +aV +KB +hg +WV +GW +hg +KB +Sv +Sv +Sv +KB +gN +ye +CB +tA +CB +lo +ye +Yc +CB +Mo +KB +Sv +Sv +Sv +Sv +wn +wh +wn +KB +KB +zF +cL +JG +KB +xQ +xQ +Pj +KB +KB +KB +KB +KB +KB +KB +KB +DT +Xu +Xu +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(20,1,1) = {" +Lh +Dj +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +Qr +WT +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +xl +Sv +Sv +Sv +KB +jK +cL +VW +cL +jK +KB +Sv +KB +cw +As +YL +KB +nb +zh +YG +nb +KB +Sv +Sv +Sv +KB +eT +um +df +lE +lE +vY +Yt +um +NW +JO +KB +Sv +Sv +Sv +Sv +wn +wh +wn +KB +hr +wz +bi +aw +mq +xQ +xQ +sN +KB +RS +vj +Kq +RS +Ye +Kq +KB +Xu +Xu +Xu +KB +if +Xu +if +Xu +if +vN +Md +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(21,1,1) = {" +Lh +Dj +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +WT +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +xl +Sv +Sv +Sv +KB +IV +XL +IV +XL +IV +KB +Sv +KB +fK +mo +mo +KB +hg +WV +GW +hg +KB +Sv +Sv +Sv +KB +QF +um +lE +Vy +AO +aE +AO +vT +cq +rP +KB +xl +xl +xl +xl +wn +wh +wn +KB +xQ +wz +cL +aw +mq +xQ +xQ +xQ +BZ +ny +Xu +Xu +Xu +Xu +Xu +KB +Xu +Xu +Xu +KB +Gw +Vb +Vb +Vb +Vb +qG +Qj +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(22,1,1) = {" +Lh +Dj +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +Sv +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +Co +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +zk +zk +vu +vu +xa +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +xl +Sv +Sv +Sv +KB +If +If +If +If +If +KB +Sv +KB +Fb +mo +mo +KB +hg +WV +GW +hg +KB +Sv +Sv +Sv +KB +QF +um +AO +AO +aE +aE +aE +aE +sj +JO +KB +bl +Ii +DN +Ka +wn +wh +wn +KB +xQ +wz +cL +aw +mq +xQ +xQ +xQ +BZ +nv +Xu +Dz +uM +Xu +yx +KB +bG +Xu +uI +KB +lA +Xu +Xu +Xu +Xu +Xu +XB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(23,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +Sv +Sv +EI +EI +EI +EI +EI +EI +EI +EI +EI +EI +Sv +Sv +Sv +EI +EI +EI +EI +EI +EI +EI +cl +Ua +wO +mv +pa +Nz +mv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +wi +Az +Az +Az +Az +Az +Az +Az +Az +Az +Az +wi +PD +PD +PD +PD +PD +Lx +wi +Az +Az +Az +Az +Az +Az +Az +Az +Az +Az +wi +vu +vu +vu +xl +Sv +Sv +Sv +KB +Ol +If +If +If +Ol +KB +Sv +KB +EX +mo +mo +KB +nb +zh +YG +nb +KB +Sv +Sv +Sv +KB +QF +um +mV +AO +uq +AO +aE +aE +cq +JO +KB +Ii +wn +wn +Ka +wn +wh +wn +KB +KB +zF +cL +JG +KB +xQ +xQ +xQ +BZ +nv +Xu +CJ +By +Xu +jx +KD +jx +Xu +Vj +OY +nv +Xu +Xu +Xu +Xu +Xu +EO +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(24,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +EI +EI +EI +EI +EI +EI +EI +EI +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Ua +Ua +Ua +Ua +wO +FO +mv +Nz +mv +mv +pa +mv +mv +mv +mv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +Sv +Sv +Sv +KB +KB +KB +QZ +KB +KB +KB +KB +KB +KB +QZ +QZ +KB +KB +Um +II +KB +KB +KB +KB +KB +KB +yW +wt +AO +aE +aE +uW +aE +aE +Cv +lX +KB +wn +wn +wn +Ka +wn +wh +wn +KB +xQ +wz +cL +aw +mq +xQ +xQ +xQ +BZ +nv +Xu +wH +ho +Xu +FX +KB +iO +Xu +zs +KB +yJ +Xu +Xu +Xu +Xu +Xu +xv +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(25,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +EI +EI +EI +EI +EI +EI +EI +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +mv +mv +mv +mv +mv +mv +mv +mv +mv +mv +mv +jz +mv +mv +xl +Uj +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +KB +KB +KB +KB +gt +KB +qk +qk +qk +qk +qk +qk +qk +qk +qk +qk +yK +kf +iR +mo +mo +aE +aE +Sl +aE +aE +AO +aE +aE +mV +aE +jj +aE +aE +Aq +KB +wn +wn +ji +Ka +wn +wh +wn +KB +xQ +wz +cL +aw +mq +xQ +xQ +xQ +BZ +yJ +Xu +Xu +Xu +Xu +Xu +KB +Xu +Xu +Xu +KB +Hr +Hr +Hr +Hr +Hr +Wi +Qj +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(26,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +Tb +EI +EI +EI +EI +EI +EI +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +mv +Nz +mv +mv +mv +Nz +mv +mv +mv +mv +Nz +mv +Nz +xl +ZG +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +KB +uy +uy +uy +uy +Sr +jk +mX +VX +Gz +Gz +Gz +Gz +Gz +pp +ik +ik +to +to +ik +ik +kV +kV +kV +kV +kV +TF +Zy +jj +uq +aE +aE +uq +Yt +JO +KB +wn +TL +Oc +Ka +wn +wh +wn +KB +xQ +wz +cL +aw +mq +xQ +xQ +xQ +KB +CD +vt +Xs +CD +mF +Xs +KB +Xu +Xu +Xu +KB +EQ +Xu +QN +Xu +QN +vN +nN +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(27,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +Tb +EI +EI +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +pa +mv +mv +mv +mv +mv +jz +mv +mv +mv +mv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +KB +uy +KB +KB +KB +KB +KB +KB +KB +zW +zW +KB +KB +KB +KB +FS +gm +to +gm +gm +ya +aE +aE +aE +aE +aE +um +Zy +Zy +Zy +ak +xY +zo +Ek +Fe +KB +wn +wn +AZ +Ka +wn +wh +wn +KB +KB +zF +cL +JG +KB +xQ +xQ +Pj +KB +KB +KB +KB +KB +KB +KB +KB +DT +Xu +Xu +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(28,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +pa +mv +jz +mv +Nz +mv +mv +mv +mv +mv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +KB +uy +Yj +Ku +Ae +Ae +Ae +JD +oP +Ae +GU +Ae +fE +cL +KB +OD +hQ +WU +hQ +hQ +At +KB +KB +KB +KB +Dc +um +Yt +aE +OS +fX +au +wY +um +JM +KB +wn +wn +wn +Ka +wn +wh +wn +KB +xQ +wz +cL +aw +mq +xQ +xQ +bR +Td +JA +Xu +Xu +Xu +Xu +Xu +QA +Xu +Xu +Xu +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(29,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +tR +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +pa +mv +mv +mv +mv +mv +mv +mv +mv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +KB +JB +JB +ng +zV +VD +Nt +Nt +Nt +cO +GO +cL +fR +cL +KB +Cn +hQ +wE +gm +hQ +FW +KB +aF +Lo +KB +QF +um +um +sj +pY +Yt +qE +UF +pc +ZY +KB +wn +wn +wn +Ka +wn +wh +wn +KB +xQ +wz +cL +aw +mq +xQ +xQ +bR +Td +JA +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +Xu +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(30,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +mv +mv +mv +mv +mv +mv +Sv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +KB +KB +KB +DR +Cs +wP +aD +Rq +aD +wP +aD +UK +dC +et +KB +Cn +hQ +to +gm +hQ +FW +KB +Lf +Sd +KB +QW +gW +gW +xC +Bc +dl +HU +dl +yF +cF +KB +wn +wn +wn +Ka +wn +wh +wn +KB +xQ +wz +cL +aw +mq +xQ +xQ +bR +Td +JA +Km +Xu +Xu +Xu +Xu +Km +Xu +Xu +vS +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(31,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +Sv +Sv +Sv +TV +ip +Zs +cL +Pz +eQ +Zs +cL +Pz +cL +cP +KB +Cn +mo +to +gm +mo +FW +KB +Tq +Yp +KB +KB +KB +KB +KB +KB +oi +WD +oi +KB +KB +KB +KB +zl +KB +KB +wn +wh +wn +KB +KB +zF +cL +JG +KB +xQ +xQ +Pj +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(32,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +nV +mC +Ry +Ry +Ry +Ry +Ry +Ry +aR +BE +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +Sv +Sv +Sv +TV +KB +Rt +Hl +Aw +KB +Rt +Hl +Ea +KB +KB +KB +mo +mo +ik +mo +mo +mo +KB +mo +mo +Ht +KB +bq +bq +bq +bq +bq +wC +bq +bq +bq +bq +bq +bq +bq +KB +wn +wh +wn +KB +xQ +wz +cL +aw +mq +xQ +xQ +xQ +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(33,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +wi +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +dS +wi +Ey +Ey +Ey +Ey +Ey +Ey +wi +Wo +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +wi +vu +vu +vu +xl +Sv +Sv +Sv +TV +KB +ql +ay +dm +KB +ql +ay +dm +KB +KB +KB +KB +KB +qm +Gk +KB +KB +KB +mo +mo +oW +KB +bq +bq +bq +bq +bq +wC +bq +bq +bq +bq +bq +bq +bq +KB +wn +wh +dk +KB +xQ +wz +cL +aw +mq +xQ +xQ +UX +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(34,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +PD +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +fl +hd +RT +Gs +KT +KT +SI +wN +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +PD +vu +vu +vu +xl +Sv +Sv +Sv +TV +KB +ay +UQ +ay +KB +ay +dW +ay +KB +py +KB +Px +Fa +ik +mo +mo +mo +KB +KB +Xh +KB +KB +bq +bq +in +Gv +bq +oN +xS +El +bq +Gv +PN +bq +Br +KB +xl +Mh +xl +KB +Sh +wz +cL +aw +gq +xQ +KB +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(35,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +PD +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +fl +Gu +KT +KT +KT +KT +rU +wN +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +PD +vu +zk +vu +xl +Sv +Sv +Sv +TV +KB +KB +KB +KB +KB +KB +KB +KB +KB +ay +SB +tL +mo +ik +mo +mo +mo +mo +mo +mo +mo +Xh +bq +bq +Af +yO +bq +hX +xS +kH +bq +XS +kk +bq +bq +KB +xl +IK +xl +KB +KB +vb +BU +mN +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +gj +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(36,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +PD +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +fl +hK +KT +zO +KT +KT +im +wN +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +PD +vu +vu +vu +xl +Sv +Sv +Sv +Fy +lu +lu +Sv +Sv +Sv +Sv +Sv +Sv +KB +Fk +KB +tL +ik +ik +mo +mo +mo +mo +mo +mo +mo +Xh +bq +bq +Af +yO +bq +Lc +xS +zS +bq +XS +kk +bq +bq +KB +xl +IK +xl +Sv +KB +wz +cL +aw +xl +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(37,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +zk +PD +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +fl +Gs +zT +Gs +KT +KT +KT +wN +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +PD +zk +vu +vu +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +KB +KB +KB +KB +tL +Et +KB +KB +KB +ix +Io +KB +KB +KB +KB +bq +bq +Af +yO +CA +Lc +xS +zS +bq +XS +kk +bq +bq +KB +xl +IK +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(38,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +PD +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +fl +KT +qU +Qk +rt +KT +KT +wN +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +PD +vu +vu +vu +xl +Sv +xl +xl +xl +xl +xl +xl +xl +xl +KB +gB +Za +va +va +ty +bT +KJ +KB +lm +KB +DT +Xu +KB +Gi +iP +KB +mI +bq +Af +Gv +Wx +Lc +xS +zS +bq +Gv +kk +bq +Br +KB +xl +IK +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(39,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +PD +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +fl +KT +KG +ie +XY +KT +SI +wN +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +PD +vu +vu +vu +xl +Sv +xl +vu +vu +dI +iB +MH +vu +vu +KB +Qi +lD +Ic +uB +KB +tL +KJ +KB +lm +KB +Bm +vp +KB +qp +Hh +qv +bq +bq +Af +yO +bq +Lc +xS +zS +bq +XS +kk +bq +bq +KB +xl +IK +xl +Sv +KB +zF +cL +JG +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(40,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +wi +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +kc +wi +nD +nD +nD +nD +nD +nD +wi +mC +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +wi +vu +vu +vu +xl +Sv +xl +vu +vu +Gd +Rf +jU +vu +vu +KB +KB +KB +KB +KB +KB +tL +KJ +KB +KB +KB +KB +KB +KB +KB +KB +KB +bq +bq +Af +yO +bq +Lc +xS +zS +bq +XS +kk +bq +bq +KB +xl +IK +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(41,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +OJ +Wo +Ry +Ry +Ry +Ry +Ry +Ry +dS +UD +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +Sv +xl +vu +vu +lW +LN +UC +vu +vu +KB +gB +Za +va +va +ty +bT +KJ +KB +uB +ju +xr +Ga +KB +Gi +iP +KB +mI +bq +Af +yO +bq +bH +xS +Hs +bq +XS +kk +bq +bq +KB +xl +IK +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(42,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +Sv +xl +vu +vu +vu +vu +vu +vu +vu +KB +Qi +lD +Ic +uB +KB +tU +KJ +ty +va +va +Za +gB +KB +qp +Xu +qv +bq +bq +gv +Gv +bq +oN +xS +El +bq +Gv +PX +bq +Br +KB +xl +IK +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(43,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +Sv +xl +Or +Ka +Ka +Ka +Ka +Ka +Or +KB +KB +KB +KB +KB +KB +tL +KJ +KB +KB +KB +KB +KB +KB +KB +KB +KB +bq +bq +bq +bq +bq +wC +bq +bq +bq +bq +bq +bq +bq +KB +xl +IK +xl +Sv +KB +zF +cL +JG +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(44,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +Sv +xl +hs +hs +eq +TN +eq +hs +hs +KB +gB +xr +ju +uB +KB +tL +KJ +ty +va +va +Za +gB +KB +Gi +Xu +qv +bq +bq +xG +xG +xG +wC +CP +bq +bq +Gq +bq +bq +bq +KB +xl +IK +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(45,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +Sv +xl +hs +Pl +hs +hs +hs +Pl +hs +KB +Qi +Za +va +va +ty +bT +KJ +KB +uB +Ic +lD +Qi +KB +qp +iP +KB +KB +KB +Qn +KB +KB +Nq +KB +WA +KB +KB +pO +KB +KB +KB +xl +IK +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(46,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +Sv +xl +xl +xl +xl +Si +xl +xl +xl +KB +KB +KB +KB +KB +KB +mo +KJ +KB +KB +KB +KB +KB +KB +KB +KB +KB +he +xi +OG +KB +bq +wC +bq +bq +bq +yL +ay +ay +gx +KB +xl +IK +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(47,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +Sv +Sv +Sv +Sv +xl +mo +Tn +Yh +LI +LI +TH +LI +LI +LI +ik +ik +KJ +Hp +OG +OG +OG +OG +Kd +OG +OG +OG +OG +OG +OG +KB +bq +wC +bq +bq +bq +KB +ba +ay +Ya +KB +xl +VF +xl +Sv +KB +zF +cL +JG +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(48,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +Sv +Sv +Sv +Sv +xl +mo +TB +sK +Ru +TB +TB +TB +TB +TB +TB +TB +uc +KB +OG +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +bq +wC +xS +bq +bq +xl +xl +xl +xl +xl +xl +hC +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(49,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +Az +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Ry +Az +vu +vu +vu +xl +Sv +xl +xl +xl +xl +bn +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +KB +OG +KB +Sv +Sv +KB +CV +Xy +Sx +Xv +Ss +Xv +Hl +CA +wC +xS +bq +bq +Az +hE +Bl +Nv +Vr +Yw +gb +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(50,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +wi +Az +Az +Az +Az +Az +wi +PD +PD +PD +PD +PD +wi +Az +Az +Az +Az +wi +PD +PD +PD +PD +PD +wi +Az +Az +Az +Az +Az +wi +vu +vu +vu +xl +Sv +xl +Kb +rf +Kb +Kb +Kb +rf +Kb +xl +xl +Ib +ld +an +ld +Ib +xl +KB +OG +KB +Sv +Sv +KB +xW +WY +xW +SP +Xv +Xv +Hl +Wx +wC +xS +bq +bq +Az +hE +hE +AP +Bv +Yw +Yw +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(51,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +zk +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +xl +Sv +xl +Kb +Kb +dr +ry +dr +Kb +Kb +xl +xl +Wa +Wa +Wa +Wa +sO +xl +KB +OG +KB +Sv +Sv +KB +aW +WY +xW +SP +Xv +Xv +oI +bq +wC +xS +bq +bq +vx +hE +hE +AP +Bv +Yw +Yw +xl +Sv +KB +zF +cL +JG +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(52,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +zk +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +xl +Sv +xl +WP +Ka +Ka +Ka +Ka +Ka +WP +xl +xl +qC +Wa +Wa +Wa +qC +xl +KB +Oz +KB +Sv +Sv +KB +mi +WY +xW +SP +Bj +Vi +KB +mI +wC +xS +bq +bq +xl +qA +ZV +AP +Bv +Yw +GH +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(53,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +Rl +vq +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +vu +xl +Sv +xl +vk +vk +vk +vk +vk +vk +Wr +xl +xl +nd +nd +fp +nd +nd +xl +KB +OG +KB +Sv +Sv +KB +OQ +WY +xW +SP +kj +eJ +Ay +CQ +wC +RI +CQ +CQ +aq +Rb +Rb +Dr +de +zb +zb +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(54,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +vu +vu +vu +vu +vu +vu +Ce +GC +Ti +vu +vu +vu +vu +vu +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +Sv +xl +vk +vk +vk +vk +vk +vk +vk +xl +FY +FY +FY +FY +FY +FY +FY +KB +OG +KB +Sv +Sv +KB +SN +WY +xW +SP +Xv +Xv +Hl +bq +wC +xS +bq +bq +Az +hE +hE +AP +Bv +Yw +zb +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(55,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +vu +vu +vu +vu +GC +vu +vu +vu +vu +vu +vu +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +Sv +xl +vk +vk +vk +gO +vk +vk +vk +xl +FY +FY +FY +kR +FY +FY +FY +KB +OG +KB +Sv +Sv +KB +JW +WY +JS +Xv +Xv +Xv +Hl +bq +wC +xS +bq +bq +Az +hE +Ms +KF +Bv +kz +zb +xl +Sv +KB +zF +cL +JG +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(56,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +vu +vu +vu +vu +vu +GC +vu +vu +vu +vu +vu +vu +xl +Sv +Sv +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +xl +xl +xl +xl +fk +xl +xl +xl +fk +KB +OG +KB +KB +KB +KB +KB +Hj +KB +KB +KB +KB +KB +bq +wC +xS +bq +bq +xl +xl +xl +xl +xl +xl +aq +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(57,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +vu +vu +Hl +Hl +Hl +Hl +Hl +Xe +Hl +Hl +Hl +Hl +vu +vu +xl +Sv +Sv +KB +Cm +tS +tS +Nj +tS +tS +tS +tS +Ks +tS +tS +Nj +tS +tS +tS +KB +Sv +xl +WF +ss +hs +xl +WF +ss +hs +KB +OG +KB +Gi +Xu +IQ +KB +WY +WY +WY +WY +WY +KB +bq +wC +xS +bq +bq +xl +IS +YR +jy +jS +YN +fb +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(58,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +HR +KB +KB +bA +bq +sr +sr +HF +Jg +UO +bA +KB +KB +HR +KB +KB +Sv +KB +tS +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +tS +KB +Sv +xl +hv +hs +hs +xl +hv +hs +hs +KB +OG +KB +qp +Km +Xu +Hn +WY +WY +iI +cT +nr +KB +bq +wC +xS +bq +bq +xl +we +we +we +we +SW +fb +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(59,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +bq +bq +RU +KB +bq +kn +kn +kn +bP +kn +kn +bq +KB +RU +bq +bq +KB +Sv +KB +tS +lV +tS +tS +tS +tS +tS +tS +af +tS +tS +tS +tS +lV +tS +KB +Sv +xl +qO +hs +iF +xl +qO +hs +iF +KB +OG +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +bq +Qh +HQ +bq +bq +xl +we +we +we +we +Il +fb +xl +Sv +KB +zF +cL +JG +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(60,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +bq +bq +bq +KB +bq +bq +uS +bq +CQ +bq +bu +bq +KB +bq +bq +bq +KB +Sv +KB +tS +lV +tS +KB +KB +ci +ci +ci +ci +ci +KB +KB +tS +lV +tS +KB +Sv +xl +xl +am +xl +xl +xl +am +xl +KB +fo +OG +OG +OG +OG +OG +fW +fW +fW +fW +fW +qr +hp +bq +wC +bq +hp +xl +xD +mT +mO +pe +fz +fb +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(61,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +mI +bq +bq +HR +bq +bq +bq +UY +CQ +ol +bq +bq +HR +bq +bq +Br +KB +Sv +KB +tS +lV +tS +KB +Fh +Nm +NU +Nm +WO +Nm +Fh +KB +tS +lV +tS +KB +Sv +Sv +xl +vu +xl +Sv +xl +vu +xl +KB +KB +KB +KB +KB +KB +OG +KB +KB +KB +KB +KB +KB +KB +KB +eg +KB +KB +xl +xl +xl +xl +xl +xl +eE +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(62,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +bq +bq +bq +KB +bq +hp +CP +bq +CQ +bq +hp +bq +KB +bq +bq +bq +KB +Sv +KB +tS +lV +tS +vr +WO +YO +Xn +Id +OL +Xn +Xn +Kg +lV +lV +tS +KB +Sv +Sv +xl +vu +xl +Sv +xl +vu +xl +Sv +Sv +Sv +Sv +Sv +KB +OG +KB +Sv +Sv +Sv +Sv +Sv +KB +vB +ZX +vB +KB +NQ +Rn +TJ +xl +td +rX +Hz +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +MV +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(63,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +KB +KB +KB +KB +KB +KB +KB +Dp +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +Kg +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +Kg +KB +KB +KB +KB +KB +PV +KB +KB +KB +PV +KB +KB +KB +KB +KB +KB +KB +OG +KB +Sv +Sv +Sv +Sv +Sv +KB +Xx +ZX +Zv +KB +Cp +JH +Rn +Fz +hs +gF +Hz +xl +Sv +KB +zF +cL +JG +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +MV +MV +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(64,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +tS +lV +tS +tS +tS +tS +tS +tS +Ks +tS +tS +tS +tS +lV +tS +tS +tS +tS +tS +KB +tS +tS +tS +tS +tS +lV +tS +tS +tS +tS +tS +Ks +tS +tS +tS +tS +tS +tS +tS +tS +qL +qL +fI +OG +KB +Sv +Sv +Sv +Sv +Sv +KB +vO +ZX +Ra +KB +xl +xl +xl +xl +WF +dO +tc +pU +hI +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Sq +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +MV +MV +MV +MV +MV +MV +MV +MV +Lh +Lh +"} +(65,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +tS +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +tS +tS +tS +tS +tS +KB +tS +tS +tS +tS +tS +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +tS +KB +KB +KB +Sv +Sv +Sv +Sv +Sv +KB +Xx +ZX +Zv +KB +lm +lm +lm +xl +hs +hs +hs +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +MV +MV +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(66,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +bJ +tS +tS +tS +CX +tS +af +tS +tS +CX +tS +tS +tS +tS +CX +tS +tS +tS +Cm +KB +Cm +tS +tS +CX +tS +tS +tS +CX +tS +tS +tS +aQ +tS +tS +tS +CX +tS +tS +tS +tS +lV +tS +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +vB +ZX +vB +KB +lm +lm +lm +xl +hs +ij +Nu +xl +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +MV +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(67,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +KB +KB +KB +KB +KB +KB +Dg +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +sF +sf +GP +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +bJ +lV +tS +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +pP +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +KB +zF +cL +JG +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(68,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +xl +xl +dY +ML +dY +dY +ML +dY +Kb +Kb +Kb +rf +dr +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +KB +KB +KB +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +KB +tS +lV +tS +KB +ID +BS +ls +Jb +Jb +bc +bc +bc +TM +uj +Yb +bc +bc +bc +Jb +Jb +cV +BS +FB +KB +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(69,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +Kb +Kb +Kb +Kb +Kb +Kb +Kb +Kb +Kb +Kb +Kb +Kb +Kb +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +uy +uy +uy +uy +uy +uy +uy +uy +uy +uy +uy +uy +uy +uy +uy +uy +BW +lV +lV +tS +KB +eN +Wj +EZ +Wj +Wj +tl +tl +tl +TM +Ml +Yb +tl +tl +tl +Wj +CG +EZ +Vl +JR +KB +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(70,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +Kb +Kb +Kb +Kb +Kb +Kb +Kb +Kb +Kb +Kb +dr +Kb +Kb +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +tS +lV +tS +KB +Xl +JR +Qm +fm +xT +Lp +AQ +Lp +iN +Ml +so +Lp +dp +Lp +xT +St +iD +eN +uQ +KB +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(71,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +xl +xl +FY +bZ +xl +xl +xl +dY +dY +dY +Kb +pJ +dr +Kb +Kb +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +KB +IP +IP +IP +KB +CU +gI +MB +KB +IP +XO +IP +KB +IP +IP +IP +KB +tS +lV +tS +KB +eN +Wj +Gy +Wj +Wj +tl +tl +tl +TM +Ml +Yb +tl +tl +tl +Wj +Ds +Gy +nQ +JR +KB +Sv +KB +zF +cL +JG +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(72,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +zE +DC +CT +CT +ts +GF +xl +dr +Kb +Kb +Kb +Kb +Kb +Kb +Kb +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +KB +IP +yw +IP +KB +AT +Jf +ob +KB +IP +Qz +IP +KB +IP +uN +IP +KB +tS +lV +tS +KB +WZ +Gt +Gt +Gt +Gt +Ia +Ia +Ia +TM +Ml +Yb +Ia +Ia +Ia +Gt +Gt +Gt +Gt +rx +KB +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(73,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +CT +CT +CT +CT +CT +GF +xl +dY +AG +dY +Kb +Kb +Kb +Uo +dr +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +KB +IP +IP +IP +KB +ze +Bq +BX +KB +IP +IP +IP +KB +IP +IP +IP +KB +tS +lV +tS +KB +KB +KB +KB +KB +KB +KB +KB +KB +AC +Ml +eS +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(74,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +zE +zE +CT +CT +CT +GF +xl +xl +xl +xl +pb +pb +xl +xl +xl +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +KB +yg +fw +yg +KB +FU +PG +FU +KB +yg +fw +yg +KB +rK +DJ +rK +KB +bJ +lV +tS +KB +ID +BS +ls +Jb +Jb +bc +bc +bc +TM +Ml +Yb +tl +tl +tl +Wj +Wj +Pq +pW +FB +KB +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(75,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +iU +br +xI +CT +CT +Di +xl +xl +vf +dw +VA +VA +dw +vf +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +KB +jW +jW +jW +CZ +AI +wI +AI +nw +jW +jc +jW +lJ +Ox +Ox +Ox +KB +tS +lV +tS +KB +eN +Wj +EZ +Wj +Wj +tl +tl +tl +TM +Ml +Yb +tl +tl +tl +Wj +Wj +EZ +Wj +JR +KB +Sv +KB +zF +cL +JG +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(76,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +CT +op +LU +WN +TG +qe +xl +xl +VA +VA +VA +VA +VA +VA +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +KB +tS +tS +tS +tS +tS +lV +lV +lV +lV +lV +lV +lV +lV +lV +lV +fA +lV +lV +tS +KB +Xl +JR +IG +fm +xT +Lp +AQ +Lp +iN +Ml +so +Lp +dp +Lp +xT +St +Cx +eN +uQ +KB +Sv +KB +wz +cL +aw +Yv +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(77,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +xl +xl +xl +xl +xl +xl +xl +xl +VA +yd +VG +kO +eW +VA +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +KB +UV +UV +UV +OZ +UV +UV +UV +ih +oL +sU +oL +Ly +oL +oL +oL +KB +tS +lV +tS +KB +eN +Wj +Gy +Wj +Wj +tl +tl +tl +TM +Ml +Yb +tl +tl +tl +Wj +Wj +Gy +Wj +JR +KB +Sv +KB +wz +cL +aw +sd +SQ +Jv +tY +qg +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(78,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +VA +yd +Le +eW +eW +Gp +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +KB +yg +fw +yg +KB +xx +xk +xx +KB +rK +DJ +rK +KB +rK +DJ +rK +KB +tS +lV +tS +KB +WZ +Gt +Gt +Gt +Gt +Ia +Ia +Ia +TM +Ml +Yb +Ia +Ia +Ia +Gt +Gt +Gt +Gt +rx +KB +Sv +KB +wz +cL +aw +Yv +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(79,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +mJ +Yu +Le +eW +Hc +GZ +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +tS +lV +tS +KB +KB +KB +KB +KB +KB +KB +KB +KB +QE +Ml +eS +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +KB +zF +cL +JG +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(80,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +xl +xl +xl +xl +xl +xl +xl +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +KB +IP +hD +IP +KB +IP +uX +IP +KB +IP +GN +IP +KB +IP +kK +IP +KB +tS +lV +tS +KB +RB +FD +xb +be +be +Fm +Fm +Fm +TM +Ml +Yb +tl +tl +tl +NA +NA +aa +sZ +Tc +KB +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(81,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +tS +lV +tS +KB +Jz +cK +ua +bt +Wj +lH +tl +tl +TM +Ml +Yb +tl +tl +tl +Wj +Wj +qV +Wj +Wj +KB +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(82,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +bJ +lV +tS +KB +za +Rv +gJ +gJ +fM +gS +wX +gS +Yx +DU +so +Lp +dp +Lp +xT +lK +cj +RZ +pL +KB +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(83,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +tS +lV +tS +KB +Jz +fV +DB +ja +Wj +tl +tl +tl +TM +Pc +Yb +tl +tl +tl +Wj +Wj +dL +Wj +Wj +KB +Sv +KB +zF +cL +JG +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(84,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +uy +KB +IP +Fu +IP +KB +IP +RA +IP +KB +IP +Lb +IP +KB +IP +fH +IP +KB +TA +lV +tS +KB +GY +dD +dD +dD +dD +Eb +qb +qb +TM +Pc +Yb +tl +tl +tl +MY +MY +MY +MY +bv +KB +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(85,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +uy +uy +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +tS +lV +tS +KB +KB +KB +KB +KB +KB +KB +KB +KB +Jo +Pc +mL +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(86,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +dA +KB +KB +ep +lC +ep +KB +ep +lC +ep +KB +sM +Mt +sM +KB +rK +DJ +rK +KB +tS +lV +tS +KB +wy +oD +oD +oD +oD +oD +oD +Wj +XC +Pc +Wj +Fn +wq +xj +Op +Zw +MS +db +UG +KB +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(87,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +KB +KB +KB +CQ +KB +Tf +AI +AI +AI +xO +DG +DG +DG +yM +AI +RP +AI +qY +DY +DY +DY +KB +tS +lV +tS +KB +In +Wj +Wj +Wj +Wj +Wj +Wj +Wj +Wj +Pc +Wj +Wj +Wj +Wj +Wj +Wj +Wj +Wj +IZ +KB +Sv +KB +zF +cL +JG +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(88,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +cI +wl +dG +ai +xM +tB +tS +tS +tS +tS +tS +tS +tS +tS +tS +tS +lV +lV +lV +lV +lV +lV +fA +lV +lV +tS +tB +In +Wj +ZZ +PL +PL +PL +Ym +Wj +Wj +Pc +HC +HC +HC +HC +HC +HC +HC +Wj +Uy +KB +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(89,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Xk +KB +KB +KB +Ir +KB +Lj +xm +xm +xm +Er +UV +UV +UV +Vh +QL +MW +QL +wD +QL +QL +QL +KB +tS +lV +tS +KB +In +Wj +Wj +Wj +Wj +Wj +Wj +Wj +Wj +Pc +Wj +Wj +Wj +Wj +Wj +Wj +Wj +Wj +IZ +KB +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(90,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Xk +KB +Sv +KB +KB +KB +KB +xx +ZL +xx +KB +xx +xk +xx +KB +ep +Mt +ep +KB +sM +Nn +sM +KB +tS +lV +tS +KB +Mk +Pb +Pb +Pb +Pb +Pb +Pb +Wj +aC +Pc +Wj +aB +XQ +JX +Wl +gX +SG +fq +jO +KB +Sv +KB +wz +cL +aw +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +"} +(91,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Xk +KB +Sv +Sv +Sv +Sv +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +tS +lV +tS +KB +KB +KB +KB +KB +KB +KB +KB +KB +MX +Pc +FH +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +KB +zF +cL +JG +xl +Yv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Jv +Yv +xl +Sv +Sv +bB +bB +bB +bB +bB +bB +bB +Dj +"} +(92,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Xk +KB +Sv +Sv +Sv +Sv +KB +IP +uE +IP +KB +IP +dy +IP +KB +IP +Hv +IP +KB +IP +Hv +IP +KB +Ik +lV +tS +KB +pu +Hq +nz +Ot +Ot +gh +gh +gh +TM +Pc +Yb +Fm +Fm +Gf +be +be +xb +FD +cN +KB +Sv +KB +wz +cL +aw +xl +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +Yv +xl +bB +bB +bB +CS +CS +vK +CS +Iz +Dj +Dj +"} +(93,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Xk +KB +Sv +Sv +Sv +Sv +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +tS +lV +tS +KB +TY +Wj +az +xQ +xQ +tl +tl +tl +TM +Pc +Yb +tl +tl +lH +Wj +Wj +BN +Wj +Ts +KB +Sv +KB +wz +cL +aw +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +bB +bB +CS +CS +CS +CS +CS +jo +zK +Dj +Dj +"} +(94,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Xk +KB +Sv +Sv +Sv +Sv +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +bJ +lV +tS +KB +Ui +Ok +rS +yN +xT +Lp +AQ +Lp +iN +Pc +XR +Lp +AQ +Lp +xT +Bx +lx +Jz +FC +KB +Sv +KB +wz +cL +aw +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +MV +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +CS +CS +CS +CS +CS +CS +CS +SM +rG +Dj +Dj +"} +(95,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Xk +KB +Sv +Sv +Sv +Sv +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +tS +lV +tS +KB +Sn +xQ +kE +Wj +Wj +tl +tl +tl +TM +Pc +Yb +tl +tl +lH +Wj +Wj +yI +Wj +Ts +KB +Sv +KB +vb +BU +mN +KB +KB +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +MV +MV +MV +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +CS +CS +CS +CS +CS +CS +CS +CS +vK +zr +WR +Dj +Dj +"} +(96,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Xk +KB +Sv +Sv +Sv +Sv +KB +IP +GT +IP +KB +IP +me +IP +KB +IP +me +IP +KB +IP +me +IP +KB +tS +lV +tS +KB +Qt +VY +VY +VY +VY +ni +ni +ni +TM +Pc +Yb +qb +qb +Eb +dD +dD +dD +dD +lY +KB +Sv +KB +wz +cL +aw +gd +xQ +xQ +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +MV +MV +MV +MV +MV +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +lz +CS +uf +Dj +Dj +"} +(97,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Xk +KB +Sv +Sv +Sv +Sv +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +tS +lV +tS +KB +KB +KB +KB +KB +KB +KB +KB +KB +AC +Pc +eS +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +KB +wz +cL +aw +gd +xQ +xQ +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +MV +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +Lh +Lh +Lh +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +vK +FQ +WR +Dj +Dj +"} +(98,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Zk +KB +Sv +Sv +Sv +Sv +KB +rK +DJ +rK +KB +rK +DJ +rK +KB +rK +eo +rK +KB +rK +DJ +rK +KB +tS +lV +tS +KB +RB +FD +xb +be +be +Fm +Fm +Fm +TM +Pc +Yb +Fm +Fm +Fm +be +be +xb +FD +cN +KB +Sv +KB +wz +cL +aw +Es +xQ +xQ +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +MV +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +SM +pC +Zd +Dj +Dj +"} +(99,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Zk +KB +Sv +Sv +Sv +Sv +KB +Ox +Ox +Ox +Ox +Ox +Ox +Ox +ZK +Ox +qc +Ox +Ox +Ox +Ox +Ox +KB +tS +lV +tS +KB +Jz +Wj +BN +Wj +Wj +tl +tl +tl +TM +Pc +Yb +tl +tl +tl +Wj +Wj +BN +Wj +Ts +KB +Sv +KB +zF +cL +JG +ev +xQ +xQ +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +MV +Sv +Sv +Sv +Sv +Lh +Lh +Lh +Lh +Lh +Lh +Lh +bB +bB +bB +bB +Lh +Lh +Lh +Lh +Lh +Lh +Dj +Dj +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +vK +uK +zK +Dj +Dj +"} +(100,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Zk +KB +Sv +Sv +Sv +Sv +KB +tS +tS +tS +tS +tS +tS +tS +tS +tS +lV +lV +lV +lV +lV +lV +fA +lV +lV +tS +KB +za +Ts +TD +JQ +xT +Lp +AQ +FZ +iN +Pc +so +Lp +AQ +Lp +xT +Bx +dj +Jz +FC +KB +Sv +KB +wz +cL +aw +gd +xQ +xQ +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +Sv +Sv +Sv +Sv +MV +Sv +Sv +Sv +Lh +Lh +Lh +bB +bB +bB +bB +bB +bB +nT +LE +bB +bB +bB +Lh +Lh +Lh +Lh +Dj +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +vK +rG +Dj +Dj +"} +(101,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Zk +KB +Sv +Sv +Sv +Sv +KB +oL +oL +oL +Ly +oL +oL +oL +Ly +oL +sU +oL +Ly +oL +oL +oL +KB +tS +tS +tS +KB +Jz +Wj +yI +Wj +Wj +tl +tl +tl +TM +Pc +Yb +tl +tl +tl +Wj +Wj +yI +Wj +Ts +KB +Sv +KB +wz +cL +aw +gd +xQ +xQ +fF +mo +mo +mo +mo +ew +mo +mo +KB +Ag +SC +KB +Ag +HX +KB +Ag +HX +KB +Sv +Sv +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +bB +bB +bB +Am +LE +nT +nT +Am +nT +HM +bB +bB +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +bB +Dj +"} +(102,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Zk +KB +Sv +Sv +Sv +Sv +KB +rK +DJ +rK +KB +rK +DJ +rK +KB +rK +DJ +rK +KB +rK +DJ +rK +KB +bJ +tS +tS +KB +GY +dD +dD +dD +dD +qb +qb +qb +TM +Pc +Yb +qb +qb +qb +dD +dD +dD +dD +lY +KB +Sv +KB +wz +cL +aw +Es +xQ +xQ +fF +mo +mo +mo +Jt +mo +mo +mo +KB +pd +tM +KB +pd +tM +KB +pd +tM +KB +Sv +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +bB +bB +bB +bB +bB +nT +LE +nT +nT +LE +nT +LE +Am +LE +bB +bB +bB +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(103,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +mH +KB +Sv +Sv +Sv +Sv +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +AC +Pc +eS +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +KB +zF +cL +JG +ev +xQ +xQ +KB +KB +Ma +KB +KB +KB +Js +mo +KB +LL +Hb +KB +LL +Zp +KB +LL +Hb +KB +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +bB +bB +nT +nT +nT +nT +nT +nT +te +te +te +te +bN +bN +te +te +te +te +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(104,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ia +KB +Sv +Sv +Sv +Sv +KB +IP +PT +IP +KB +IP +me +IP +KB +IP +me +IP +KB +IP +me +IP +KB +Sv +Sv +Sv +KB +RB +FD +xb +be +be +Fm +Fm +Fm +TM +Pc +Yb +Fm +Fm +Fm +be +be +xb +FD +cN +KB +Sv +KB +wz +cL +aw +gd +xQ +xQ +KB +ay +ay +ay +pQ +KB +mo +mo +KB +KB +uJ +KB +KB +uJ +KB +KB +uJ +KB +Lh +Lh +Lh +bB +bB +bB +bB +bB +bB +nT +nT +nT +HM +nT +nT +nT +te +mt +Mq +te +eK +QM +te +Mq +mt +te +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(105,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ia +KB +Sv +Sv +Sv +Sv +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +IP +IP +IP +KB +Sv +Sv +Sv +KB +Jz +Wj +BN +Wj +Wj +tl +tl +tl +TM +Pc +Yb +tl +tl +tl +Wj +Wj +BN +Wj +Ts +KB +Sv +KB +wz +cL +aw +gd +xQ +xQ +KB +ay +ay +ay +ay +KB +mo +mo +mo +mo +mo +mo +mo +mo +mo +mo +mo +KB +Lh +Lh +Lh +bB +te +te +te +te +te +hM +te +te +te +nT +nT +nT +te +Ne +KS +aO +PC +PC +aO +KS +sp +te +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(106,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ia +KB +Sv +Sv +Sv +Sv +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +Sv +Sv +KB +za +Ts +PE +JQ +xT +Lp +AQ +Lp +iN +Pc +so +Lp +AQ +Lp +xT +Bx +NI +Jz +FC +KB +Sv +KB +wz +cL +aw +Es +xQ +xQ +KB +ba +ay +ay +ay +KB +mo +mo +Jt +mo +mo +Jt +np +mo +Jt +mo +mo +KB +Lh +Lh +Lh +bB +te +kD +xe +kD +kD +xs +oC +rN +te +te +nT +nT +te +mu +lL +te +PC +PC +te +lL +mu +te +Sv +bB +CS +FP +CS +FP +CS +FP +CS +FP +CS +FP +CS +FP +CS +bB +Lh +Lh +"} +(107,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Hf +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +AJ +Gi +KB +AJ +Gi +KB +Sv +Sv +Sv +Sv +Sv +Sv +KB +Jz +Wj +yI +Wj +Wj +tl +tl +tl +TM +iQ +Yb +tl +tl +tl +Wj +Wj +yI +Wj +Ts +KB +Sv +KB +zF +cL +JG +ev +xQ +UX +KB +jP +jP +jP +jP +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +Lh +Lh +bB +bB +te +kD +kD +fg +ce +rR +fu +yD +sb +hb +nT +nT +te +te +te +te +PC +tQ +te +te +te +te +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(108,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Hf +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Km +Xu +KB +Ve +Km +KB +Sv +Sv +Sv +Sv +Sv +Sv +KB +GY +dD +dD +dD +dD +qb +qb +qb +TM +oQ +Yb +qb +qb +qb +dD +dD +dD +dD +lY +KB +Sv +KB +kd +ga +QO +gd +xQ +xQ +KB +ay +ay +ay +ay +KB +aA +JY +KR +KR +KB +ay +ay +ay +ay +ay +kX +KB +Lh +bB +bB +nT +sA +kD +qT +fg +xs +rN +el +VJ +hF +hb +nT +nT +Am +te +AM +gp +PC +PC +oS +om +te +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(109,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Hf +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +qv +KB +wa +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +HL +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +KB +il +Kp +ug +gd +xQ +xQ +KB +KB +xJ +xJ +KB +KB +qM +mo +mo +mo +KB +KB +KB +KB +KB +KB +KB +KB +Lh +bB +nT +nT +te +Bg +Ez +ck +yQ +rN +el +rN +hF +hb +nT +nT +nT +te +yG +gp +PC +PC +oS +IA +te +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(110,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Hf +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +vp +Xu +vs +qK +Xu +Xu +tS +tS +Nj +tS +tS +tS +tS +tS +tS +tS +tS +tS +tS +tS +tS +tS +qL +tS +tS +tS +tS +tS +tS +tS +tS +tS +KB +Sv +KB +il +vF +ug +Es +xQ +xQ +fx +Wd +Wd +Wd +Wd +RM +Gj +mo +mo +mo +RM +ay +ay +tZ +ay +ay +KB +Lh +Lh +bB +nT +nT +te +rN +YX +nj +Hk +rN +el +rN +hF +hb +nT +nT +te +te +te +te +eh +PC +te +te +te +te +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(111,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Hf +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Iv +qK +qK +qK +qK +qK +HJ +HJ +HJ +HJ +HJ +HJ +GE +HJ +HJ +qL +lt +qL +qL +qL +lt +qL +qL +qL +lt +qL +qL +qL +lt +qL +qL +qL +KB +Sv +KB +VC +UL +Fr +ev +ul +xQ +fx +Wd +Wd +Wd +Wd +RM +Gj +mo +mo +mo +RM +ay +ay +ay +ay +ay +KB +Lh +Lh +bB +HM +LE +te +Ur +GJ +GJ +ri +AS +sa +ek +rl +hb +nT +nT +te +mt +Mq +te +PC +PC +te +Mq +mt +te +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(112,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Hf +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +wa +KB +wa +KB +KB +Wn +Wn +Nb +Wn +Wn +Wn +KB +KB +KB +PU +KB +KB +KB +PU +KB +KB +KB +PU +KB +KB +KB +PU +KB +KB +KB +PU +KB +Sv +KB +pt +iS +uH +gw +xQ +xQ +KB +KB +pi +pi +KB +KB +Yo +mo +mo +mo +KB +KB +KB +KB +ay +IL +KB +Lh +Lh +bB +Am +nT +te +te +MR +MR +lZ +xs +rN +rN +te +te +nT +nT +te +Ne +KS +aO +PC +PC +aO +KS +sp +te +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(113,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Hf +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +AB +qK +KB +qK +vs +KB +Up +Vn +Vn +Vn +Vn +ZD +KB +nG +vn +xG +KB +nG +vn +xG +KB +nG +Yq +xG +KB +nG +Yq +xG +KB +nG +Yq +xG +KB +Sv +KB +wz +cL +aw +gd +xQ +xQ +KB +ew +JK +xo +mo +KB +aA +Su +KR +KR +KB +SR +Kj +KB +ay +ay +KB +Lh +Lh +bB +nT +nT +HM +te +Sg +Ky +hF +vy +GJ +DX +te +nT +nT +nT +te +mu +lL +te +PC +PC +te +lL +mu +te +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(114,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Hf +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Pw +tX +KB +Pw +tX +KB +al +Vn +Vn +Vn +Vn +Vn +KB +mI +Wx +vm +KB +mI +Wx +vm +KB +mI +Wx +vm +KB +mI +Wx +vm +KB +mI +Wx +vm +KB +Sv +KB +wz +cL +aw +Es +xQ +xQ +KB +Js +mo +Oa +mo +KB +KB +KB +KB +KB +KB +ay +ay +KB +ay +ay +KB +Lh +Lh +bB +LE +Am +LE +te +hb +hb +oc +kW +hb +hb +te +nT +nT +nT +te +te +te +te +PC +PC +te +te +te +te +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(115,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Hf +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +KB +KB +KB +KB +KB +Vn +Vn +Vn +Vn +Vn +Vn +KB +Df +fB +Jn +KB +Df +iH +El +KB +Df +iH +uR +KB +Df +Xg +NG +KB +Df +iH +El +KB +Sv +KB +zF +cL +JG +ev +xQ +xQ +KB +mo +mo +mo +mo +KB +Zj +mS +KB +mo +KB +ay +pN +KB +RM +RM +KB +Sv +Sv +bB +nT +nT +nT +nT +nT +nT +un +tJ +nT +nT +nT +nT +nT +nT +nT +nT +dX +te +PC +PC +KE +jQ +eB +te +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(116,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Hf +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +FR +vv +ZQ +oz +UE +UE +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +KB +wz +cL +aw +gd +xQ +xQ +KB +mo +mo +mo +mo +KB +ut +jZ +js +mo +UN +ay +hU +KB +tb +KT +Qx +Qx +gQ +RE +vL +vL +vL +vL +vL +vL +PC +PC +vL +vL +vL +vL +vL +vL +vL +vL +vL +fh +PC +PC +Rz +wR +Ns +te +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(117,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Hf +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +KB +KB +KB +KB +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +cL +aw +gd +xQ +xQ +KB +KB +jg +KB +KB +KB +KB +KB +KB +mo +KB +KB +KB +KB +ws +YW +iW +YW +gs +YP +NX +NX +NX +NX +NX +NX +NX +NX +NX +NX +NX +PC +PC +NX +NX +NX +NX +fh +PC +PC +Rz +jQ +jQ +te +Sv +bB +CS +aM +Fs +Lv +pX +CS +CS +aM +Fs +Lv +pX +CS +CS +bB +Lh +Lh +"} +(118,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Hf +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +cL +aw +Es +xQ +xQ +do +mo +mo +mo +mo +mo +mo +mo +mo +mo +mo +mo +KB +Sv +rh +Sv +Sv +Sv +Sv +bB +nT +nT +nT +nT +nT +nT +nT +nT +nT +nT +nT +un +tJ +nT +nT +nT +nT +te +PC +PC +te +rc +te +te +Sv +bB +CS +aM +po +Lv +Fx +CS +CS +aM +po +Lv +Fx +CS +CS +bB +Lh +Lh +"} +(119,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Pp +Mb +Mb +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +sw +yS +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +zF +cL +JG +ev +xQ +xQ +do +mo +mo +mo +mo +ND +mo +mo +mo +mo +mo +mo +KB +Sv +Sv +Sv +bB +bB +bB +bB +by +by +by +by +by +by +by +by +by +by +dP +un +tJ +nT +nT +HM +te +te +PC +PC +qu +WJ +fJ +te +bB +bB +CS +aM +po +Lv +xn +CS +CS +aM +po +Lv +xn +CS +CS +bB +Lh +Lh +"} +(120,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +cL +aw +gd +xQ +xQ +KB +KB +KB +KB +KB +KB +Hl +Hl +ZO +ZO +Hl +Hl +KB +Lh +Lh +bB +bB +zI +xB +xB +xB +zI +xB +xB +xB +zI +xB +xB +xB +zI +Ql +un +tJ +nT +nT +te +te +Hx +Hx +Hx +Hx +VZ +DL +tq +HM +bB +CS +aM +po +Lv +Fx +CS +CS +aM +po +Lv +Fx +CS +CS +bB +Lh +Lh +"} +(121,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +cL +aw +gd +xQ +xQ +KB +Sv +Sv +Sv +Sv +KB +cy +xQ +xQ +xQ +xQ +Xo +KB +Lh +Lh +bB +Ql +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +Ql +un +tJ +nT +te +te +DL +DL +DL +DL +DL +DL +QK +tq +Am +Ql +CS +aM +hf +Lv +Fx +CS +CS +aM +hf +Lv +Fx +CS +CS +bB +Lh +Lh +"} +(122,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +cL +aw +Es +xQ +xQ +KB +Sv +Sv +Sv +Sv +KB +YA +xQ +xQ +xQ +xQ +Tk +KB +Lh +Lh +bB +Ql +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +Ql +un +tJ +nT +te +gA +DL +DL +DL +DL +DL +DL +DL +tq +LE +Ql +CS +aM +po +SX +zZ +CS +CS +aM +po +SX +zZ +CS +CS +bB +Lh +Lh +"} +(123,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +EJ +Dx +dR +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +vb +BU +mN +KB +KB +KB +KB +KB +KB +KB +KB +KB +sJ +OK +VB +Lw +RY +Ww +KB +Lh +Lh +bB +Ql +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +Ql +un +tJ +nT +te +fL +DL +DL +DL +DL +DL +as +te +te +nT +Ql +CS +aM +po +Lv +Fx +CS +CS +aM +po +Lv +Fx +CS +CS +bB +Lh +Lh +"} +(124,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +cL +aw +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +KB +KB +KB +KB +KB +KB +Lh +Lh +bB +Ql +zI +xB +xB +UT +UT +UT +UT +UT +UT +UT +xB +xB +zI +Ql +un +tJ +nT +te +te +DL +QK +QK +QK +DL +te +te +nT +LE +Ql +CS +aM +po +Lv +Fx +CS +CS +aM +po +Lv +Fx +CS +CS +bB +Lh +Lh +"} +(125,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +hG +PA +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +cL +aw +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +Ql +xB +xB +xB +Sm +Bi +Bi +PF +Bi +Bi +Sm +xB +xB +xB +Ql +un +tJ +nT +nT +te +tq +tq +tq +tq +tq +te +nT +LE +Am +Ql +CS +aM +XV +Bs +ig +CS +CS +aM +XV +Bs +ig +CS +CS +bB +Lh +Lh +"} +(126,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +EJ +EJ +EJ +Dx +dR +PA +PA +PA +ue +PA +PA +PA +PA +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +cL +aw +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +Ql +xB +xB +wf +wf +wf +bb +EH +gT +wf +wf +wf +xB +xB +Ql +un +tJ +nT +nT +nT +nT +nT +nT +nT +nT +nT +nT +nT +nT +Ql +CS +Li +TT +Ap +SL +CS +CS +Li +TT +Ap +SL +CS +CS +bB +Lh +Lh +"} +(127,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +zF +cL +JG +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +Ql +xB +xB +wf +wF +gC +wf +Ph +wf +gC +GD +wf +xB +xB +Ql +un +tJ +PC +PC +PC +PC +PC +PC +PC +PC +PC +PC +PC +nT +mj +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(128,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +cL +aw +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +Ql +zI +xB +iu +wF +se +wf +PK +wf +se +Kl +wf +xB +zI +Ql +un +tJ +nT +nT +nT +nT +nT +nT +nT +nT +nT +nT +nT +nT +Ql +CS +aM +Fs +Lv +pX +CS +CS +aM +Fs +Lv +pX +CS +CS +bB +Lh +Lh +"} +(129,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +cL +aw +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +Ql +xB +xB +wf +wf +Ln +wf +BV +wf +Ln +wf +wf +xB +xB +Ql +un +tJ +nT +te +te +xu +xu +xu +te +te +te +LE +nT +LE +Ql +CS +aM +po +Lv +Fx +CS +CS +aM +po +Lv +Fx +CS +CS +bB +Lh +Lh +"} +(130,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +Dx +dR +PA +PA +PA +PA +PA +PA +PA +hG +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +cL +aw +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +bB +bB +Ql +xB +xB +xB +wf +aK +se +BV +se +Jw +wf +xB +xB +xB +mj +un +tJ +nT +te +Sc +Of +QK +pm +tg +yj +te +nT +Am +nT +Ql +CS +aM +po +Lv +xn +CS +CS +aM +po +Lv +xn +CS +CS +bB +Lh +Lh +"} +(131,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +zF +cL +JG +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +bB +Sb +Ql +xB +xB +xB +wf +OP +BV +BV +BV +hL +wf +xB +xB +xB +Ql +un +tJ +nT +te +tJ +DL +DL +DL +un +Du +xu +LE +nT +HM +bB +CS +aM +po +Lv +Fx +CS +CS +aM +po +Lv +Fx +CS +CS +bB +Lh +Lh +"} +(132,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +cL +aw +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +bB +bB +Ql +zI +xB +xB +Od +se +BV +Be +BV +BV +Od +xB +xB +zI +Ql +un +PC +vR +Ie +OW +vL +vL +vL +Tl +ct +xu +nT +nT +LE +bB +CS +aM +hf +Lv +Fx +CS +CS +aM +hf +Lv +Fx +CS +CS +bB +Lh +Lh +"} +(133,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +eY +aw +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +Ql +xB +xB +xB +wf +OP +BV +BV +BV +hL +wf +xB +xB +xB +Ql +un +tJ +nT +te +AL +PC +QM +Xb +ps +sy +te +Am +nT +bB +bB +CS +aM +po +SX +zZ +CS +CS +aM +po +SX +zZ +CS +CS +bB +Lh +Lh +"} +(134,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +oF +aw +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +Ql +xB +xB +xB +wf +aK +se +BV +se +Jw +wf +xB +xB +xB +Ql +un +tJ +nT +te +PC +PC +pn +te +te +te +te +nT +bB +bB +bB +CS +aM +po +Lv +Fx +CS +CS +aM +po +Lv +Fx +CS +CS +bB +Lh +Lh +"} +(135,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +Dx +dR +PA +PA +rM +AR +hG +PA +PA +PA +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +KB +zF +cL +JG +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +Ql +xB +xB +xB +wf +wf +pF +rB +mZ +wf +wf +xB +xB +xB +Ql +un +tJ +nT +te +PC +PC +Tm +te +Uq +qW +te +LE +bB +Sv +bB +CS +aM +po +Lv +Fx +CS +CS +aM +po +Lv +Fx +CS +CS +bB +Lh +Lh +"} +(136,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +Py +Py +PA +PA +PA +PA +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +ay +wz +cL +aw +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +Ql +zI +xB +xB +xB +wf +Qo +yk +Qo +wf +yc +xB +xB +zI +Ql +un +tJ +dX +te +PC +PC +PC +Ie +tr +mc +te +nT +bB +Lh +bB +CS +aM +XV +Bs +ig +CS +CS +aM +XV +Bs +ig +CS +CS +bB +Lh +Lh +"} +(137,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +EJ +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +lh +PA +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +AD +ay +wz +cL +aw +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +Ql +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +Ql +un +tJ +nT +te +PC +tQ +te +te +te +te +te +bB +bB +Lh +bB +CS +Li +TT +Ap +SL +CS +CS +Li +TT +Ap +SL +CS +CS +bB +Lh +Lh +"} +(138,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +hG +PA +Ws +Ij +PA +PA +PA +PA +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +rF +wz +cL +aw +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +Ql +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +Ql +un +tJ +HM +te +NX +sS +te +mu +Ac +uO +te +bB +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(139,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +EJ +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +ue +DL +DL +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +KB +zF +cL +JG +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +Ql +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +xB +Ql +un +tJ +nT +te +fL +un +te +Im +Ni +iC +te +bB +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(140,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +hG +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +cL +aw +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +Ql +zI +xB +xB +xB +zI +xB +xB +xB +zI +xB +xB +xB +zI +Ql +un +tJ +nT +te +nO +un +Ie +PC +xF +mt +te +bB +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(141,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +cL +aw +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +Jq +by +by +by +by +by +by +by +by +by +by +by +by +by +Jq +un +tJ +nT +te +te +te +te +te +te +te +te +bB +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(142,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +Dx +dR +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +xd +aw +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +bB +bB +bB +bB +bB +bB +nT +Am +LE +nT +nT +LE +PC +Re +Re +NX +Ja +nT +nT +nT +nT +LE +nT +bB +bB +bB +bB +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(143,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +EJ +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +zF +xd +JG +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +Lh +Lh +Lh +bB +bB +MT +nT +LE +nT +nT +LE +nT +nT +hc +nT +nT +nT +nT +nT +LE +nT +Am +nT +nT +bB +Lh +Lh +Lh +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(144,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +hG +ue +PA +PA +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +xd +aw +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +Lh +Lh +Lh +bB +te +te +te +te +te +te +te +te +te +QI +te +te +te +Am +nT +nT +nT +nT +nT +bB +bB +Lh +Lh +Lh +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(145,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +EJ +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +wz +xd +aw +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +Lh +Lh +bB +te +UA +fL +un +PC +PC +PC +PC +lj +Ax +NX +bf +te +nT +nT +nT +LE +nT +LE +bB +Lh +Lh +Lh +Lh +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(146,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +wz +xd +aw +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +Lh +Lh +bB +te +vL +vL +aP +Xc +PC +PC +PC +PC +tJ +DL +nM +xu +nT +nT +HM +nT +Am +nT +bB +Lh +Lh +Lh +Lh +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(147,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +kQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +vb +jq +mN +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +Lh +bB +te +QI +te +te +te +PC +Tm +zv +QM +tJ +DL +QK +xu +nT +nT +nT +LE +nT +nT +bB +Lh +Lh +Lh +Lh +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(148,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +hG +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Yn +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Gg +wz +Pa +aw +Gg +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +Lh +bB +te +PC +hu +mu +te +QI +te +te +VI +tJ +DL +rC +xu +nT +LE +nT +Am +nT +nT +bB +Lh +Lh +Lh +Sv +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(149,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +ue +PA +PA +PA +PA +PA +PA +PA +PA +hG +PA +PA +PA +PA +PA +PA +te +te +te +te +te +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +uz +uz +IB +uz +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +ay +wz +iZ +aw +ay +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +Lh +bB +te +uu +Zc +KS +te +wc +Ko +te +Du +OW +vL +Cz +te +nT +nT +nT +nT +nT +bB +bB +Lh +Lh +Lh +Sv +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(150,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Uc +te +te +PC +PC +te +te +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +uz +uz +fP +HH +DZ +US +uz +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +rF +wz +xd +aw +rF +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +Lh +bB +te +mt +lL +Em +te +kG +FT +te +sy +PC +yp +eK +te +LE +nT +nT +nT +LE +bB +Lh +Lh +Lh +Sv +Sv +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(151,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +wu +hV +PC +PC +PC +ru +te +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +bB +bB +bB +bB +mM +mM +mM +ah +gg +DZ +HH +yz +uz +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +KB +zF +xd +JG +KB +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +te +te +te +te +te +te +te +te +te +xu +xu +te +te +nT +nT +LE +nT +bB +bB +Lh +Lh +Lh +Sv +Sv +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(152,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +wu +OR +PC +PC +PC +mm +te +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +bB +mM +mM +mM +mM +mM +Mw +mM +Mw +mM +mM +HH +AK +Np +mM +uz +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +ay +wz +xd +aw +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +LE +nT +Am +nT +Am +HM +bB +bB +bB +Lh +Lh +Lh +Sv +Sv +Sv +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(153,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +bB +bB +Sv +Sv +Sv +Sv +bB +bB +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +ue +PA +PA +PA +PA +wu +OR +PC +PC +PC +yp +te +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +HH +ko +HH +mM +Mw +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +ay +wz +xd +aw +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +bB +bB +bB +bB +bB +bB +bB +bB +Lh +Lh +Lh +Lh +Lh +Sv +Sv +Sv +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(154,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +bB +bB +Sv +bB +bB +bB +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PP +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +wu +OR +PC +PC +PC +te +te +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +Ow +Cf +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +Mw +HH +mM +mM +mM +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +rF +wz +xd +aw +rF +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(155,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +bB +bB +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +Dx +dR +PA +PA +PA +PA +PA +PA +PA +PA +PA +hG +PA +PA +PA +PA +PA +PA +wu +OR +PC +PC +PC +te +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +nT +nT +fZ +Cf +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +bB +bB +bB +Sv +Sv +Sv +Sv +KB +ay +KB +zF +xd +JG +KB +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(156,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +wu +te +OR +OR +OR +te +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +nT +nT +nT +Ow +nT +Cf +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +Mw +mM +mM +mM +mM +mM +bB +bB +Sv +Sv +Sv +KB +ay +ay +wz +xd +aw +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(157,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PP +PA +Qf +oj +oj +oj +oj +CW +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +nT +nT +FG +us +nT +Go +Cf +mM +mM +mM +mM +mM +mM +mM +mM +mM +Mw +mM +mM +mM +mM +mM +mM +mM +mM +Cf +nT +bB +bB +Sv +Sv +KB +ay +ay +wz +xd +aw +JN +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +Ci +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(158,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +ey +oo +oo +oo +oo +oo +oo +oo +oo +oo +oo +oo +oo +oo +oo +oo +oo +oo +uT +uT +oo +oo +oo +oo +oo +oo +kI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +hG +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +Ow +nT +na +nT +nT +FG +Cf +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +Cf +Go +nT +bB +Sv +Sv +KB +ay +rF +wz +xd +aw +pg +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(159,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +SY +hY +hY +hY +hY +xl +xl +xl +uV +xl +xl +xl +xl +hY +xl +xl +uV +xl +xl +xl +BY +xH +xH +ZP +iw +hY +hY +oo +oo +kI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +hG +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +nT +fZ +nT +Go +nT +nT +na +Cf +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mW +nT +fZ +bB +Sv +Sv +KB +ay +KB +zF +xd +JG +KB +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Lh +Lh +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(160,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +pB +hY +hY +hY +hY +xl +Kx +jG +vu +sq +Tp +Tp +xl +hY +xl +yE +IP +IP +kw +ZM +BY +hY +hY +ao +GR +hY +hY +hY +hY +hY +kI +nI +nI +jX +nI +nI +jX +nI +nI +jX +nI +nI +jX +nI +nI +jX +nI +nI +jX +nI +nI +jX +nI +nI +jX +nI +nI +jX +nI +nI +jX +nI +EJ +JE +EJ +EJ +JE +EJ +EJ +JE +EJ +EJ +JE +pv +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +Oe +EF +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +nT +nT +nT +FG +na +nT +nT +Cf +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +Cf +nT +nT +nT +bB +Sv +Sv +KB +ay +ay +wz +xd +aw +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(161,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EP +hY +hY +hY +xl +nL +vu +gi +vu +vu +pr +xl +md +xl +cs +IP +IP +Yy +KO +BY +hY +hY +Gh +Mj +hY +hY +hY +hY +hY +hY +nR +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +Dx +dR +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +FG +na +nT +Ow +nT +nT +FG +Cf +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +Cf +nT +nT +FG +bB +Sv +Sv +KB +ay +ay +wz +xd +aw +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(162,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +Hi +hY +hY +hY +hY +xl +Ew +jG +jG +dF +Tp +Tp +xl +hY +xl +fD +IP +IP +FF +Kk +BY +hY +hY +vI +Wz +hY +hY +hY +hY +hY +CC +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +hG +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +hq +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +nT +nT +nT +fZ +nT +nT +na +Cf +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +pD +mM +mM +Cf +qn +qn +Xa +cp +bB +Sv +Sv +KB +ay +rF +wz +xd +aw +rF +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +bB +bB +bB +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(163,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +SY +hY +hY +hY +hY +xl +xl +xl +km +xl +xl +xl +xl +hY +xl +xl +km +xl +xl +xl +BY +xH +xH +ZP +iw +hY +hY +VQ +VQ +CC +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +ue +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +nT +nT +FG +nT +nT +nT +fZ +nT +Cf +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +Cf +nT +FG +nT +vw +bB +Sv +Sv +KB +ay +KB +zF +xd +JG +KB +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +Na +Na +Na +Na +Na +Na +Na +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(164,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +ar +VQ +VQ +VQ +VQ +VQ +VQ +VQ +VQ +VQ +VQ +VQ +VQ +VQ +VQ +VQ +VQ +VQ +tD +tD +VQ +VQ +VQ +VQ +VQ +VQ +CC +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +te +te +te +PA +PA +PA +PA +PA +PA +Mn +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +nT +JI +na +nT +FG +nT +sC +nT +Cf +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +Cf +Cf +nT +nT +nT +fZ +AA +bB +bB +Sv +KB +ay +ay +wz +xd +aw +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +Na +EA +Na +Na +Na +Iw +Na +Na +zR +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(165,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PP +PA +PA +PA +PA +cR +te +ES +PA +PA +hG +PA +PA +PA +Mn +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +nT +fZ +ne +nT +nT +nT +FG +us +Cf +mM +mM +mM +mM +mM +mM +mM +mM +mM +mM +Cf +Go +nT +nT +nT +nT +nT +QB +Rs +bB +Sv +KB +ay +ay +wz +xd +aw +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(166,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +nk +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +HA +te +xE +PA +PA +PA +PA +PA +PA +Mn +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +FG +Ow +nT +nT +FG +Go +nT +nT +Ow +nT +Cf +mM +mM +mM +mM +mM +mM +mM +Cf +Cf +nT +nT +nT +FG +us +nT +nT +FG +vw +bB +Sv +KB +ay +rF +mG +Mu +eH +rF +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +zR +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(167,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +cR +te +ES +PA +PA +PA +PA +PA +PA +Mn +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +nT +nT +nT +nT +na +nT +nT +FG +na +Cf +mM +mM +mM +Cf +mM +mM +Cf +Cf +nT +nT +na +nT +nT +fZ +nT +nT +Rw +hS +bB +Sv +KB +ay +KB +jf +Mu +Xm +KB +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +zR +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(168,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +bB +bB +bB +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +te +te +te +PA +PA +PA +PA +PA +PA +Mn +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +nT +fZ +nT +NB +nT +fZ +EK +nT +nT +Cf +Cf +Cf +Cf +mM +Cf +Cf +nT +nT +nT +fZ +nT +nT +nT +nT +nT +nT +vw +fZ +bB +Sv +KB +ay +ay +Wy +xd +aw +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +Na +Na +Iw +Na +Na +Na +Iw +Na +Na +Na +Iw +Na +Na +Na +Na +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(169,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +bB +bB +bB +Sv +bB +bB +bB +EJ +IJ +gK +HN +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +TI +PA +PA +nk +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +Oq +nT +nT +FG +nT +nT +nT +FG +us +nT +na +nT +Cf +mM +nT +nT +fZ +nT +nT +us +nT +nT +FG +nT +nT +vw +nT +bB +Sv +KB +ay +ay +vU +xd +aw +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(170,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +PA +ZH +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +Ji +zu +PA +PA +ue +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +hG +PA +Mn +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +na +sL +EG +na +nT +nT +nT +nT +nT +nT +Ow +nT +nT +nT +nT +nT +nT +nT +FG +nT +fZ +nT +nT +fZ +nT +vw +FG +bB +bB +KB +ay +rF +wz +mR +aw +rF +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +zR +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(171,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +bB +bB +Sv +Sv +Sv +bB +bB +bB +bB +PA +PA +Fl +HN +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +Ai +nT +nT +Go +nT +nT +nT +fZ +na +nT +FG +nT +nT +FG +na +nT +qq +nT +na +nT +nT +nT +nT +nT +na +nT +Ei +nT +nT +bB +nb +ay +KB +zF +xd +XZ +KB +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(172,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +bB +bB +bB +bB +bB +PA +PA +hG +PA +PA +PA +ZH +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +hG +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +nT +FG +nT +nT +nT +nT +FG +nT +nT +nT +nT +nT +nT +nT +nT +nT +FG +nT +nT +nT +nT +nT +FG +Ow +nT +QB +Xa +qn +OM +nb +ay +ay +hi +xd +aw +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +Na +Na +Na +Na +Iw +Na +Na +Na +EA +Na +Na +Na +Iw +Na +Na +Na +Iw +Na +Na +Na +zR +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +LE +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(173,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +Dx +dR +PA +PA +PA +PA +Ug +Zg +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PA +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +nT +fZ +nT +fZ +nT +us +nT +na +nT +nT +nT +fZ +nT +nT +FG +nT +nT +nT +nT +nT +fZ +nT +nT +us +nT +FG +nT +BM +Xq +nb +AD +ay +mG +Mu +eH +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +zR +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +bB +bB +Sv +Sv +Sv +Sv +Sv +bB +bB +nT +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(174,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +Dx +dR +PA +PA +PA +ZH +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +ue +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +nT +nT +nT +nT +na +nT +nT +FG +nT +nT +nT +na +nT +nT +us +nT +nT +FG +nT +Ow +nT +Go +nT +nT +nT +nT +bB +bB +nb +ay +rF +mG +Mu +eH +rF +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +bB +bB +Sv +Sv +bB +bB +bB +nT +nT +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(175,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +Dx +hk +hk +hk +Zg +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +ue +PA +PA +PA +PA +Mn +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +nT +nT +FG +QP +nT +FG +Ow +nT +nT +nT +FG +nT +nT +nT +fZ +nT +nT +nT +na +nT +nT +FG +nT +nT +nT +fZ +bB +Sv +KB +ay +KB +zF +xd +XZ +KB +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +LE +bB +bB +bB +bB +nT +nT +FG +nT +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(176,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +hG +PA +PA +PA +PA +PA +ue +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +Ow +QP +na +nT +nT +nT +nT +fZ +nT +us +nT +nT +nT +nT +fZ +nT +nT +nT +fZ +nT +nT +nT +nT +nT +nT +FG +bB +bB +Sv +KB +ay +ay +wz +xd +aw +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +zR +Na +Na +Na +Iw +Na +Na +Na +fY +Na +Na +Na +Iw +Na +Na +Na +EA +Na +Na +Na +Na +LE +nT +nT +Ql +nT +nT +Am +nT +LE +Am +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(177,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +ue +PA +PA +PA +PA +PA +PA +hG +PA +PA +PA +PA +PA +hG +PA +PA +PA +PA +PA +Mn +PA +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +us +nT +nT +nT +nT +nT +nT +FG +nT +Go +nT +nT +nT +na +nT +FG +nT +nT +nT +nT +nT +fZ +nT +nT +bB +bB +Sv +Sv +KB +ay +ay +hi +xd +wJ +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +zR +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +nT +nT +LE +LE +Ql +nT +LE +nT +nT +nT +nT +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(178,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PP +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +nT +Go +nT +FG +nT +us +nT +nT +na +nT +nT +nT +FG +nT +nT +us +Go +nT +FG +nT +nT +nT +na +nT +bB +Sv +Sv +Sv +KB +ay +rF +wz +xd +rT +rF +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +nT +nT +nT +nT +Ql +nT +Am +nT +nT +nT +LE +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(179,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +IJ +HV +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +nT +nT +nT +nT +na +nT +nT +nT +fZ +nT +nT +nT +nT +Ow +na +nT +nT +nT +nT +nT +FG +us +nT +bB +bB +bB +Sv +Sv +KB +ay +KB +zF +xd +JG +KB +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +nT +nT +nT +nT +mj +nT +nT +nT +nT +nT +nT +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(180,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +nT +FG +nT +nT +nT +FG +nT +nT +nT +nT +FG +nT +fZ +nT +nT +nT +nT +fZ +nT +Go +bB +bB +bB +Sv +Sv +Sv +Sv +KB +ay +JN +mG +Mu +eH +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +Na +Na +Na +Na +Iw +Na +Na +Na +Iw +Na +Na +Na +Iw +Na +Na +Na +EA +Na +Na +Na +nT +LE +nT +nT +Ql +nT +LE +nT +nT +nT +Am +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(181,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +bB +bB +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +nT +nT +nT +fZ +nT +nT +nT +na +nT +nT +nT +nT +nT +nT +nT +FG +nT +na +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +cb +Zf +Mu +Kn +JN +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +zR +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +nT +nT +LE +Ql +nT +nT +Am +nT +LE +nT +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(182,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +bB +Sv +bB +bB +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +hG +PA +PA +PA +PA +hG +PA +PA +PA +hG +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +nT +nT +nT +Ow +nT +us +nT +nT +FG +us +Ow +nT +nT +FG +nT +nT +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +rF +jV +mR +aw +pg +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +LE +bB +bB +bB +nT +nT +nT +nT +nT +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(183,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +bB +bB +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PA +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +nT +nT +nT +na +nT +nT +nT +nT +nT +nT +nT +FG +us +nT +na +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +KB +zF +ha +JG +KB +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +bB +bB +bB +bB +Sv +bB +bB +bB +nT +Am +nT +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(184,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +bB +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +IJ +HV +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +bB +bB +bB +bB +nT +Go +nT +nT +nT +nT +bB +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +JN +wz +mR +aw +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +zR +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Na +Iw +Na +Na +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +bB +bB +nT +LE +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(185,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +Mn +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +bB +bB +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +cb +Wy +Zo +Sk +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +VR +VR +mn +VR +zQ +zQ +zQ +zQ +zQ +zQ +Na +Na +Na +Na +Na +Na +Na +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +nT +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(186,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +hG +ue +PA +PA +PA +PA +PA +PA +PA +PA +PA +te +te +te +PA +PA +PA +PA +PA +PA +Mn +PA +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +ay +vU +xd +aw +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +vd +wM +wM +zQ +wb +zH +kr +Wk +zQ +Na +Na +Na +Na +Na +Na +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(187,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +hG +PA +PA +PA +cR +te +ES +PA +PA +PA +PA +PA +PA +Mn +PA +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +KB +jf +Mu +IF +KB +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +LS +uL +zQ +EY +kr +kr +kr +zQ +Na +Na +Na +Na +Na +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(188,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +HA +te +xE +PA +PA +PA +PA +Sv +vu +iX +vu +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +ay +Zf +Mu +Kn +JN +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +GM +zQ +kr +kr +kr +kr +zQ +Na +Na +Na +zR +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(189,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +cR +te +ES +PA +PA +PA +bB +Sv +vu +iX +vu +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +ay +jY +gr +Ao +cb +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +bB +zQ +NY +eM +kr +kr +ta +Na +Na +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(190,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +EJ +EJ +EJ +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +ue +PA +PA +PA +te +te +te +PA +PA +bB +bB +Sv +vu +iX +vu +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +rF +jF +Mu +eH +TO +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +zQ +zQ +zQ +zQ +zQ +zQ +bB +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(191,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +EJ +EJ +nI +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +IJ +HV +PA +PA +PA +PA +PP +PA +PA +PA +PA +PA +PA +hG +PA +PA +PA +PA +PA +PA +PA +PA +bB +Sv +Sv +zc +kl +zc +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +KB +Ex +Vz +pH +KB +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +bB +bB +bB +bB +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(192,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +nI +nI +nI +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +Sv +cQ +yZ +Av +yZ +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Cy +Cy +Mr +oe +Mg +Cy +Cy +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(193,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +EJ +nI +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +Ec +mG +Mu +Ao +Zb +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(194,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +EJ +EJ +nI +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +bB +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +rF +jF +gr +Kn +Te +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(195,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +KB +jf +gr +IF +KB +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(196,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +hG +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +tP +RR +yA +eH +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(197,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +ay +IX +Mu +Ao +Ec +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(198,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +hG +ue +PA +PA +PA +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +rF +jY +gr +eH +rF +ay +KB +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(199,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +IJ +HV +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +KB +Ex +gr +IF +KB +ay +KB +xl +wZ +wZ +wZ +wZ +wZ +wZ +wZ +wZ +wZ +wZ +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(200,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PP +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +ay +mG +LC +Ao +gz +ay +KB +xl +wZ +MB +MB +MB +MB +MB +MB +MB +MB +wZ +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(201,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +ay +jF +Mu +eH +Ec +ay +KB +xl +wZ +MB +MB +MB +MB +MB +Qb +MB +MB +wZ +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(202,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +EJ +EJ +EJ +EJ +EJ +EJ +EJ +pv +PA +PA +PA +PA +PA +PA +PA +PA +PA +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +px +Zf +gr +Fi +Wc +ay +KB +xl +wZ +MB +MB +MB +MB +MB +MB +MB +MB +wZ +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(203,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +EJ +EJ +EJ +EJ +EJ +EJ +IJ +HV +PA +ue +PA +PA +PA +PA +PA +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +KB +Ex +Mu +IF +KB +ay +KB +xl +wZ +MB +MB +MB +MB +MB +MB +MB +MB +wZ +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(204,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +EJ +EJ +EJ +EJ +pv +PA +PA +hG +PA +PA +PA +PA +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +Ec +mG +Mu +je +ma +ay +KB +xl +wZ +MB +MB +MB +MB +MB +MB +MB +MB +wZ +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(205,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +bB +bB +EJ +EJ +pv +PA +PA +PA +PA +PA +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +ay +nJ +tf +GV +Ec +ay +KB +xl +wZ +MB +MB +MB +MB +MB +MB +MB +MB +wZ +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(206,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +bB +PA +PA +PA +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +rF +mG +tf +GV +rF +ay +ay +xl +wZ +MB +MB +MB +MB +MB +MB +MB +MB +wZ +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +FP +CS +FP +CS +FP +CS +FP +CS +FP +CS +FP +CS +bB +Lh +Lh +"} +(207,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +bB +bB +bB +bB +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +KB +qI +YS +Xm +KB +wL +KH +xl +wZ +MB +MB +MB +MB +MB +MB +MB +MB +wZ +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(208,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +ay +nJ +tf +eH +ay +ay +ay +xl +wZ +wZ +wZ +wZ +wZ +wZ +wZ +wZ +wZ +wZ +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(209,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +ay +mG +Mu +pw +ay +ay +KB +xl +xl +xl +sG +xl +xl +xl +xl +xl +xl +xl +xl +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(210,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +ay +nJ +Mu +GV +ay +ay +KB +ay +ay +ay +MI +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(211,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +ay +WK +tf +Mf +ay +ay +KB +ay +KB +KB +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(212,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Un +ay +ay +sx +ay +ay +ay +KB +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(213,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +rF +ay +sx +ay +rF +ay +KB +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(214,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +KB +Cy +uA +Cy +KB +Hp +KB +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(215,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +sx +ay +KB +ay +Cy +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(216,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +sx +ay +KB +KB +KB +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(217,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +yZ +Av +yZ +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(218,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +sx +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(219,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +sx +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(220,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +sx +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(221,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +cQ +cQ +cQ +cQ +cQ +cQ +cQ +cQ +cQ +cQ +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +Cy +uA +Cy +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(222,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +sx +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +sx +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(223,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +VT +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Jp +Oi +AD +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(224,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +vo +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(225,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +cQ +cQ +cQ +cQ +cQ +cQ +cQ +cQ +cQ +cQ +cQ +cQ +cQ +cQ +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +ay +ST +ay +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(226,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +ay +ST +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(227,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +Zb +qt +ay +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(228,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +KB +KB +KB +KB +KB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(229,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(230,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(231,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(232,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(233,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(234,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(235,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(236,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(237,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(238,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(239,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(240,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(241,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(242,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(243,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(244,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(245,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +CS +bB +Lh +Lh +"} +(246,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +CS +pC +CS +CS +CS +SM +CS +CS +CS +bB +Lh +Lh +"} +(247,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +SM +CS +CS +CS +CS +CS +CS +CS +CS +lz +CS +bB +Lh +Lh +"} +(248,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +lz +CS +CS +CS +CS +lz +CS +pC +CS +CS +CS +bB +Lh +Lh +"} +(249,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +pC +CS +CS +pC +CS +SM +CS +CS +CS +lz +CS +CS +bB +Lh +Lh +"} +(250,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +CS +CS +CS +lz +pC +CS +CS +pC +CS +CS +pC +CS +bB +Lh +Lh +"} +(251,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +CS +FP +lz +FP +CS +FP +lz +FP +SM +FP +lz +FP +SM +bB +Lh +Lh +"} +(252,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +bB +gu +gu +tm +gu +gu +gu +gu +gu +tm +gu +gu +tm +gu +bB +Lh +Lh +"} +(253,1,1) = {" +Lh +Dj +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +nI +EJ +bB +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Sv +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Lh +Lh +"} +(254,1,1) = {" +Lh +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Dj +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +"} +(255,1,1) = {" +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +Lh +"} diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index bad2d094eb4c..7ec1338d0c0a 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -1176,9 +1176,6 @@ /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) "il" = ( -/obj/machinery/newscaster{ - pixel_x = -30 - }, /obj/item/chair{ pixel_x = 5; pixel_y = 5 @@ -1191,6 +1188,7 @@ /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, +/obj/machinery/newscaster/directional/west, /turf/open/floor/iron, /area/awaymission/moonoutpost19/research) "io" = ( @@ -1212,10 +1210,7 @@ /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) "is" = ( -/obj/structure/fence/post{ - dir = 4 - }, -/obj/structure/sign/warning, +/obj/structure/sign/warning/directional/north, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, @@ -1440,12 +1435,8 @@ /turf/open/floor/iron, /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 - }, /obj/effect/turf_decal/lunar_sand/plating, +/obj/structure/sign/warning/vacuum/directional/west, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) "kj" = ( @@ -1943,14 +1934,9 @@ /turf/open/floor/mineral/titanium/yellow, /area/awaymission/moonoutpost19/arrivals) "mJ" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A beacon used by a teleporter."; - icon = 'icons/obj/devices/tracker.dmi'; - icon_state = "beacon"; - name = "tracking beacon" - }, -/obj/effect/landmark/awaystart/moonoutpost, -/turf/open/floor/mineral/titanium/yellow, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/vacuum/directional/north, +/turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) "mK" = ( /obj/machinery/door/airlock/titanium{ @@ -2885,12 +2871,10 @@ }, /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/structure/sign/warning/biohazard/directional/east, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) "sn" = ( @@ -3860,14 +3844,6 @@ }, /turf/open/floor/carpet/red, /area/awaymission/moonoutpost19/arrivals) -"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) @@ -3983,12 +3959,8 @@ }, /area/awaymission/moonoutpost19/research) "zK" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; - name = "\improper HOSTILE ATMOSPHERE AHEAD"; - pixel_y = 32 - }, /obj/effect/turf_decal/lunar_sand/plating, +/obj/structure/sign/warning/vacuum/directional/north, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) "zN" = ( @@ -4621,10 +4593,10 @@ }, /area/awaymission/moonoutpost19/main) "DS" = ( -/obj/structure/fence{ - dir = 4 +/obj/structure/flora/rock/style_random{ + pixel_y = -2 }, -/obj/structure/sign/warning, +/obj/structure/sign/warning/directional/north, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, @@ -5162,13 +5134,11 @@ /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 }, +/obj/structure/sign/departments/science/directional/north, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) "Ia" = ( @@ -33674,7 +33644,7 @@ My ld mc mt -mJ +mI mt mc ld @@ -35472,8 +35442,8 @@ hI My My My -yT -Ue +iM +mJ iM My My @@ -36460,7 +36430,7 @@ LG dA My My -DS +dA My My My @@ -39801,6 +39771,7 @@ My My My My +Jb is My My @@ -39814,7 +39785,6 @@ My My My My -My ea en en @@ -44688,8 +44658,8 @@ dA My My My +YX DS -Wg My My My diff --git a/_maps/RandomZLevels/museum.dmm b/_maps/RandomZLevels/museum.dmm index 4c7fe9782de3..ab6be28cdfb4 100644 --- a/_maps/RandomZLevels/museum.dmm +++ b/_maps/RandomZLevels/museum.dmm @@ -119,7 +119,7 @@ /turf/open/floor/wood/large, /area/awaymission/museum) "bg" = ( -/obj/structure/no_effect_signpost{ +/obj/structure/signpost{ name = "if youre reading this you stink and also made by jimmyl" }, /turf/open/floor/bluespace, @@ -735,7 +735,8 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/sign/painting{ pixel_y = 32; - persistence_id = "museumgate" + persistence_id = "museumgate"; + dir = 1 }, /obj/machinery/light/floor, /obj/effect/decal/cleanable/dirt/dust, @@ -1047,16 +1048,14 @@ /obj/effect/turf_decal/stripes/asteroid/line{ dir = 1 }, -/obj/machinery/button{ - pixel_y = 32 - }, /turf/open/indestructible/plating, /area/awaymission/museum) "iI" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/sign/painting{ pixel_y = 32; - persistence_id = "museumgate" + persistence_id = "museumgate"; + dir = 1 }, /obj/machinery/light/floor, /turf/open/floor/iron/dark, @@ -1760,7 +1759,7 @@ dir = 1 }, /obj/structure/table, -/obj/item/food/sandwich/cheese/grilled, +/obj/item/food/sandwich/grilled_cheese, /turf/open/floor/iron/dark, /area/awaymission/museum) "of" = ( @@ -2464,8 +2463,9 @@ }, /area/awaymission/museum) "tK" = ( -/obj/structure/sign/warning, -/turf/closed/indestructible/reinforced, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/warning/directional/south, +/turf/open/indestructible/plating, /area/awaymission/museum) "tM" = ( /obj/structure/table/wood, @@ -3250,6 +3250,7 @@ /obj/machinery/door/window/elevator/left/directional/south{ transport_linked_id = "museum_cargo" }, +/obj/structure/sign/warning/directional/east, /turf/open/chasm/true/no_smooth, /area/awaymission/museum) "Ak" = ( @@ -4648,6 +4649,7 @@ /obj/structure/broken_flooring/side/always_floorplane{ dir = 8 }, +/obj/structure/sign/warning/directional/east, /turf/open/indestructible/plating, /area/awaymission/museum) "Mv" = ( @@ -4756,6 +4758,7 @@ dir = 1 }, /obj/structure/closet/crate/bin, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/mineral/titanium/blue, /area/awaymission/museum) "NB" = ( @@ -5200,6 +5203,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/sign/warning/directional/west, +/obj/structure/sign/warning/directional/east, /turf/open/indestructible/plating, /area/awaymission/museum) "Rl" = ( @@ -5371,8 +5376,8 @@ /turf/open/floor/iron/white/small, /area/awaymission/museum) "Tr" = ( -/obj/structure/plaque/static_plaque/golden/commission/kilo, /obj/machinery/light/floor, +/obj/structure/plaque/static_plaque/golden/commission/kilo, /turf/open/floor/mineral/gold, /area/awaymission/museum) "Tt" = ( @@ -5443,6 +5448,7 @@ dir = 1 }, /obj/item/kirbyplants/random/fullysynthetic, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/mineral/titanium/blue, /area/awaymission/museum) "TO" = ( @@ -5478,6 +5484,7 @@ transport_linked_id = "museum_cargo" }, /obj/effect/spawner/random/maintenance/no_decals/seven, +/obj/structure/sign/warning/directional/west, /turf/open/chasm/true/no_smooth, /area/awaymission/museum) "Um" = ( @@ -5759,6 +5766,7 @@ "We" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/portable_atmospherics/canister/oxygen, +/obj/structure/sign/warning/directional/south, /turf/open/indestructible/plating, /area/awaymission/museum) "Wf" = ( @@ -6026,10 +6034,6 @@ /obj/effect/mapping_helpers/airlock/access/all/away/generic3, /turf/open/indestructible/plating, /area/awaymission/museum) -"Ye" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/reinforced/titanium/nodiagonal, -/area/awaymission/museum) "Yg" = ( /obj/effect/mob_spawn/cockroach, /obj/effect/decal/cleanable/dirt/dust, @@ -29524,7 +29528,7 @@ iW go iW TN -Ye +fe FK FK FK @@ -30072,7 +30076,7 @@ Qk Ma Ma Ma -tK +FK FK FK Kh @@ -30295,7 +30299,7 @@ DU iW iW Ny -Ye +fe FK FK FK @@ -30323,7 +30327,7 @@ FK bF FK We -tK +FK Ma VE zr @@ -30586,7 +30590,7 @@ do Ma Ma Ma -tK +FK FK FK Kh @@ -32120,8 +32124,8 @@ DY FK TB ZZ -XK tK +FK Kh Kh FK @@ -32132,7 +32136,7 @@ FK lU lU lU -tK +FK FK FK Uq @@ -33406,7 +33410,7 @@ FK FK FK FK -tK +FK FK FK FK @@ -33417,7 +33421,7 @@ FK FK PB PB -tK +FK FK FK Uq diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm index 64f2a725a51f..c3513c00bfcc 100644 --- a/_maps/RandomZLevels/research.dmm +++ b/_maps/RandomZLevels/research.dmm @@ -1350,7 +1350,6 @@ /turf/open/floor/iron/white, /area/awaymission/research/interior/engineering) "gP" = ( -/obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, @@ -1474,7 +1473,6 @@ /area/awaymission/research/interior/security) "hr" = ( /obj/machinery/light/directional/east, -/obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, @@ -1543,7 +1541,6 @@ /area/awaymission/research/interior/security) "hH" = ( /obj/machinery/vending/security, -/obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, @@ -1604,18 +1601,11 @@ /turf/open/floor/iron/white, /area/awaymission/research/interior) "hP" = ( -/obj/structure/sign/directions/medical{ - pixel_x = 32; - pixel_y = -32 - }, /obj/structure/sign/directions/evac{ - pixel_x = 32; - pixel_y = -24 + pixel_y = 10 }, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, +/obj/structure/sign/directions/medical, +/turf/closed/wall/r_wall, /area/awaymission/research/interior) "hQ" = ( /turf/open/floor/iron/white/corner{ @@ -1624,7 +1614,6 @@ /area/awaymission/research/interior) "hR" = ( /obj/structure/table, -/obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, @@ -2836,11 +2825,13 @@ }, /obj/machinery/power/apc/auto_name/directional/west, /obj/effect/mapping_helpers/apc/cell_5k, +/obj/structure/cable, /turf/open/floor/iron, /area/awaymission/research/interior/dorm) "oT" = ( /obj/structure/table, /obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/research/interior/security) "pt" = ( @@ -2906,14 +2897,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/awaymission/research/interior/gateway) -"qY" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) "qZ" = ( /obj/structure/chair/stool/directional/west, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -3049,7 +3032,6 @@ /obj/effect/turf_decal/siding/yellow{ dir = 8 }, -/obj/structure/cable, /turf/open/floor/iron, /area/awaymission/research/interior/dorm) "vT" = ( @@ -3140,24 +3122,18 @@ /turf/open/floor/iron/white, /area/awaymission/research/interior/security) "yj" = ( -/obj/structure/sign/directions/security{ +/obj/structure/sign/directions/science{ dir = 1; - pixel_x = 32; - pixel_y = 40 + pixel_y = 10 }, /obj/structure/sign/directions/engineering{ dir = 1; - pixel_x = 32; - pixel_y = 33 + pixel_y = -10 }, -/obj/structure/sign/directions/science{ - dir = 1; - pixel_x = 32; - pixel_y = 26 +/obj/structure/sign/directions/security{ + dir = 1 }, -/mob/living/basic/trooper/syndicate/ranged/smg, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron/white, +/turf/closed/wall/r_wall, /area/awaymission/research/interior) "yn" = ( /obj/item/ammo_casing/c45, @@ -3196,14 +3172,6 @@ /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, @@ -3241,7 +3209,6 @@ /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, @@ -3255,6 +3222,7 @@ "BQ" = ( /mob/living/basic/trooper/nanotrasen/ranged/smg, /obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/research/interior/security) "BY" = ( @@ -3518,6 +3486,11 @@ }, /turf/open/floor/iron, /area/awaymission/research/interior/dorm) +"Jg" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/awaymission/research/interior/security) "Jl" = ( /obj/item/kirbyplants/organic/plant20{ pixel_y = 3 @@ -3753,6 +3726,13 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/awaymission/research/interior/genetics) +"PM" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/white, +/area/awaymission/research/interior/security) "Qd" = ( /obj/machinery/door/airlock/medical{ name = "Medical" @@ -3844,6 +3824,7 @@ dir = 4 }, /obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/research/interior/medbay) "SJ" = ( @@ -42258,7 +42239,7 @@ Nf eJ eJ hB -hP +kv ia ia it @@ -42269,7 +42250,7 @@ ia ia ia ia -yj +sn ut HS kv @@ -42516,7 +42497,7 @@ eJ eJ hC hM -cp +hP cp eH cp @@ -42525,7 +42506,7 @@ cp cp cp cp -cp +yj js ry ke @@ -45851,9 +45832,9 @@ jp si hF fr -LX -LX -LX +Jg +Jg +Jg ho hF si @@ -46108,10 +46089,10 @@ do do do By -QQ -QQ -QQ -ho +LX +Jg +LX +hn do do do @@ -46881,7 +46862,7 @@ hF fr BQ QQ -LX +Jg ho hF si @@ -47135,11 +47116,11 @@ do do do do -fr -Or +fq +PM Or -QQ -ho +LX +hn do do do @@ -47160,7 +47141,7 @@ kL kZ Fl Th -zU +lD iW aO aH @@ -47653,10 +47634,10 @@ fq Kg yc oT -LX -LX -LX -LX +Jg +Jg +Jg +Jg CW do bD @@ -47908,7 +47889,7 @@ ok eS fq LX -qY +wN wN LX LX diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index b656d7b4a943..7169a3cc75fa 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -1510,6 +1510,7 @@ /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/hydro) "fS" = ( @@ -1517,10 +1518,13 @@ /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/hydro) "fV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 4 @@ -1737,12 +1741,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) -"gL" = ( -/obj/structure/sink/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) "gM" = ( /obj/item/stack/cable_coil{ amount = 1 @@ -1938,10 +1936,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) -"hA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) "hB" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/weather/snow, @@ -2301,10 +2295,6 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/gateway) "iB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, /obj/effect/landmark/awaystart/snowdin, /obj/machinery/holopad, /obj/effect/decal/cleanable/dirt, @@ -2353,7 +2343,6 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "iL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 }, @@ -2372,7 +2361,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "iP" = ( @@ -2576,11 +2564,12 @@ "ju" = ( /obj/effect/landmark/awaystart/snowdin, /obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 10 + }, /turf/open/floor/iron, /area/awaymission/snowdin/post/gateway) "jv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/landmark/awaystart/snowdin, /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, @@ -2616,7 +2605,6 @@ /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) "jB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/sink/directional/west, /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 @@ -2647,7 +2635,6 @@ }, /obj/effect/landmark/awaystart/snowdin, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "jF" = ( @@ -2658,6 +2645,7 @@ "jG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "jH" = ( @@ -2750,11 +2738,10 @@ id = "snowdin_gate" }, /obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/iron, /area/awaymission/snowdin/post/gateway) "jZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/door/poddoor/shutters/preopen{ id = "snowdin_gate" }, @@ -2797,27 +2784,14 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "ki" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"kj" = ( -/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) -"kk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) "km" = ( /obj/structure/sign/poster/contraband/tools/directional/east, /obj/structure/closet/crate/preopen, @@ -2844,7 +2818,9 @@ /turf/closed/wall/ice, /area/awaymission/snowdin/cave/mountain) "kv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 + }, /obj/machinery/shower/directional/south, /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) @@ -2883,7 +2859,9 @@ /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) "kB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) "kF" = ( @@ -2909,11 +2887,10 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/iron, /area/awaymission/snowdin/post) "kK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -2979,7 +2956,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "kV" = ( @@ -2988,6 +2964,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "kW" = ( @@ -3043,7 +3020,6 @@ /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) "lj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) "lk" = ( @@ -3238,14 +3214,12 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "lH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/snowdin/post/hydro) "lI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron, @@ -3259,21 +3233,16 @@ /obj/item/paper/crumpled/ruins/snowdin/foreshadowing, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) -"lK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) "lM" = ( /obj/machinery/door/airlock/external/glass/ruin, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) "lN" = ( /obj/machinery/door/airlock/external/glass/ruin, /obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) "lO" = ( @@ -3428,6 +3397,9 @@ /area/awaymission/snowdin/post) "ml" = ( /obj/effect/turf_decal/snowdin_station_sign/seven, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, /turf/open/floor/iron, /area/awaymission/snowdin/post) "mm" = ( @@ -3537,12 +3509,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/awaymission/snowdin/post/custodials) -"mI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) "mJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, @@ -3655,7 +3621,7 @@ /area/awaymission/snowdin/outside) "nd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 + dir = 4 }, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -3669,28 +3635,12 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/awaymission/snowdin/post) -"nf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) "ng" = ( /obj/structure/flora/grass/both/style_random, /obj/structure/flora/tree/pine/style_random, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) -"nh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) "ni" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 }, @@ -3905,6 +3855,7 @@ /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/secpost) "oh" = ( @@ -3912,6 +3863,7 @@ dir = 1 }, /obj/item/shard, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/awaymission/snowdin/post/secpost) "ol" = ( @@ -4017,29 +3969,18 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/secpost) "oE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/awaymission/snowdin/post/secpost) -"oF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"oG" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) "oH" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/awaymission/snowdin/post/secpost) "oI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + welded = 1; + dir = 4 + }, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 1 }, @@ -4061,7 +4002,9 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post) "oL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ @@ -4173,6 +4116,14 @@ /obj/machinery/microwave, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/cavern2) +"pi" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "snowdin_gate" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/gateway) "pj" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -4217,15 +4168,6 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/secpost) -"pp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) "pq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -4246,13 +4188,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/snowdin/post) -"pt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) "pu" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -5370,9 +5305,7 @@ /area/awaymission/snowdin/post/mining_main/mechbay) "tQ" = ( /obj/machinery/light/small/directional/south, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "tR" = ( @@ -5427,10 +5360,8 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern1) "un" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, /obj/machinery/light/small/broken/directional/east, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/post/cavern2) "up" = ( @@ -5703,7 +5634,6 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/cavern1) "vy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 6 }, @@ -5769,6 +5699,9 @@ /obj/effect/baseturf_helper/asteroid/snow, /turf/open/floor/plating, /area/awaymission/snowdin/post/broken_shuttle) +"vO" = ( +/turf/closed/wall, +/area/awaymission/snowdin/outside) "vP" = ( /obj/structure/plasticflaps, /obj/machinery/conveyor{ @@ -5778,15 +5711,17 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main/mechbay) "vR" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, -/area/awaymission/snowdin/post/broken_shuttle) +/obj/structure/flora/tree/stump, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/misc/asteroid/snow, +/area/awaymission/snowdin/outside) "vT" = ( /obj/structure/chair, /turf/open/floor/mineral/titanium/blue, /area/awaymission/snowdin/post/broken_shuttle) "vU" = ( /obj/item/chair, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/mineral/titanium/blue, /area/awaymission/snowdin/post/broken_shuttle) "vW" = ( @@ -5805,6 +5740,7 @@ /obj/structure/chair{ dir = 1 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/mineral/titanium/blue, /area/awaymission/snowdin/post/broken_shuttle) "wc" = ( @@ -6983,6 +6919,11 @@ slowdown = 1 }, /area/awaymission/snowdin/outside) +"AV" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/turf/open/floor/plating, +/area/awaymission/snowdin/post) "AW" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating/snowed/cavern, @@ -7503,7 +7444,7 @@ /area/awaymission/snowdin/cave) "De" = ( /obj/structure/table/reinforced, -/obj/machinery/light/built/directional/west, +/obj/machinery/light/empty/directional/west, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) "Df" = ( @@ -7589,7 +7530,7 @@ /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/cave) "Dx" = ( -/obj/machinery/light/built/directional/south, +/obj/machinery/light/empty/directional/south, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) "DA" = ( @@ -7881,7 +7822,7 @@ /area/awaymission/snowdin/cave) "ES" = ( /obj/structure/table/reinforced, -/obj/machinery/light/built/directional/south, +/obj/machinery/light/empty/directional/south, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) "ET" = ( @@ -7894,6 +7835,15 @@ /obj/item/stack/ore/iron, /turf/closed/mineral/iron/ice, /area/awaymission/snowdin/cave/cavern) +"EW" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/misc/asteroid/snow, +/area/awaymission/snowdin/outside) "EX" = ( /obj/item/pickaxe/drill{ pixel_x = 3; @@ -8156,6 +8106,7 @@ dir = 4 }, /obj/structure/table, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_main/mechbay) "GJ" = ( @@ -8391,6 +8342,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_main/mechbay) "HS" = ( @@ -8769,6 +8721,12 @@ "JV" = ( /turf/open/misc/ice, /area/awaymission/snowdin/outside) +"Ka" = ( +/obj/effect/landmark/awaystart/snowdin, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/gateway) "Kc" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 @@ -9403,6 +9361,7 @@ /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/hydro) "Nt" = ( @@ -9558,7 +9517,6 @@ /turf/open/floor/iron/white, /area/awaymission/snowdin/post) "Oh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/broken/directional/south, /turf/open/floor/iron/showroomfloor, @@ -9814,6 +9772,7 @@ "PL" = ( /obj/structure/chair, /obj/machinery/light/small/directional/west, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/mineral/titanium/blue, /area/awaymission/snowdin/post/broken_shuttle) "PM" = ( @@ -10333,10 +10292,6 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/research) "Sr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/plating, /area/awaymission/snowdin/post) @@ -10518,6 +10473,20 @@ /mob/living/basic/bear/snow, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) +"Th" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/snowdin/post/dorm) +"Tj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post) "Tk" = ( /obj/effect/turf_decal/weather/snow/corner, /turf/open/misc/asteroid/snow{ @@ -10693,11 +10662,11 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main/mechbay) "Us" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, /obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "Ut" = ( @@ -10783,10 +10752,8 @@ /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "Va" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/structure/sign/nanotrasen, +/obj/structure/flora/grass/both/style_random, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) "Vb" = ( @@ -10853,6 +10820,16 @@ /obj/machinery/light/broken/directional/south, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) +"Vs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, +/turf/open/floor/iron, +/area/awaymission/snowdin/post) "Vt" = ( /obj/docking_port/stationary{ dir = 4; @@ -10867,6 +10844,7 @@ /area/awaymission/snowdin/post/mining_main) "Vu" = ( /obj/machinery/light/broken/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "Vw" = ( @@ -10879,16 +10857,17 @@ /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/cave) "Vy" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = -32 +/obj/effect/turf_decal/weather/snow, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 }, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/iron/dark/snowdin, +/area/awaymission/snowdin/outside) "Vz" = ( /obj/machinery/light/small/directional/east, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/post/cavern2) "VB" = ( @@ -10918,9 +10897,7 @@ /area/awaymission/snowdin/post/hydro) "VO" = ( /obj/machinery/light/small/directional/north, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) "VP" = ( @@ -11157,6 +11134,7 @@ dir = 1 }, /obj/machinery/light/small/directional/east, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/mineral/titanium/blue, /area/awaymission/snowdin/post/broken_shuttle) "Xk" = ( @@ -11294,7 +11272,6 @@ "Yd" = ( /obj/machinery/light/small/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) "Ye" = ( @@ -11311,6 +11288,10 @@ }, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) +"Yg" = ( +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/misc/asteroid/snow, +/area/awaymission/snowdin/outside) "Yh" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -11474,7 +11455,9 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/gateway) "Zj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 4 @@ -17291,7 +17274,7 @@ eQ je aS kw -lf +Th lV aK Zy @@ -20188,9 +20171,9 @@ Zy Zy Zy vL -vR +vL vX -vR +vL vL Zy Zy @@ -20249,8 +20232,8 @@ eo Zy Zy YE +vO Va -TI Zy Zy Zy @@ -20634,7 +20617,7 @@ jU js jU me -mI +jo nd nF Ob @@ -21149,7 +21132,7 @@ jU lp mg mK -nf +nL nH og oE @@ -21216,9 +21199,9 @@ Zy Zy Zy vL -vR +vL vX -vR +vL vL Zy Zy @@ -21406,10 +21389,10 @@ jU lq mh mL -nf +nL QZ oh -oF +oz pn pL qq @@ -21663,10 +21646,10 @@ kG lr mi mM -nf +nL nF Zj -oG +po po pM qq @@ -21761,8 +21744,8 @@ Zy Zy Zy Zy -Va -Tr +SS +Vy YT YT YT @@ -21791,8 +21774,8 @@ Qj Zy YE Zy -Va -Qj +vO +EW Zy Zy Zy @@ -21938,8 +21921,8 @@ dX dX Zy Zy -Va -Zy +SS +Yg Zy Zy Cu @@ -22177,11 +22160,11 @@ kI lt mk mL -nh +js nJ hM oI -pp +kF pN dK qM @@ -22433,7 +22416,7 @@ jY kJ lu ml -jU +Tj ni nK HU @@ -22620,8 +22603,8 @@ Zy Zy Zy Zy -Va -Zy +SS +Yg Zy Zy Zy @@ -22691,7 +22674,7 @@ kK lv js jW -nM +jm nL dK js @@ -22942,12 +22925,12 @@ fG hn hT iC -ju -jY -kJ +Ka +pi +Vs lw -jo -js +AV +rm rm nM QN @@ -23209,7 +23192,7 @@ jX jm hM oL -pt +jX pR dK qM @@ -23303,8 +23286,8 @@ YE Zy Zy Zy -Va -Zy +SS +Yg Zy Zy Qj @@ -23480,8 +23463,8 @@ Cu Zy Zy dX -Va -Zy +SS +Yg Zy Zy Zy @@ -24162,8 +24145,8 @@ Zy Zy Wp Zy -Va -ZX +SS +vR Zy Zy Zy @@ -27314,7 +27297,7 @@ iJ gI hz gI -lK +iK ms hz nA @@ -27564,14 +27547,14 @@ bf bf bf fV -gL -hA -lK +mv +mt +iK iL jB iL iL -lK +iK mv iK nA @@ -29367,7 +29350,7 @@ gP hD id Us -iW +my ki kV lN @@ -29625,7 +29608,7 @@ Oe ie iP jF -kj +hE kW id ld @@ -29882,7 +29865,7 @@ Oe if iQ jG -kk +jJ kX ie mz @@ -35536,8 +35519,8 @@ ai ai ai Zy -Va -Zy +SS +Yg Zy Zy Zy @@ -35807,8 +35790,8 @@ Zy dX dX Zy -Va -Zy +SS +Yg Zy Zy Zy @@ -37335,8 +37318,8 @@ ai ai ai Zy -Va -Zy +SS +Yg Zy Zy Zy @@ -37349,8 +37332,8 @@ Zy ZK Zy Zy -Va -Zy +SS +Yg Zy Zy Zy @@ -59379,7 +59362,7 @@ WN WN WN WN -Vy +WN Gk GI Hc @@ -61435,7 +61418,7 @@ WN WN Nz WN -Vy +WN Gk HR Hi diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index 12aa7f7458b5..624f05678ace 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -112,12 +112,6 @@ /turf/open/floor/iron/grimy, /area/awaymission/undergroundoutpost45/central) "az" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A beacon used by a teleporter."; - icon = 'icons/obj/devices/tracker.dmi'; - icon_state = "beacon"; - name = "tracking beacon" - }, /obj/effect/landmark/awaystart/underground, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -258,7 +252,6 @@ 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" = ( @@ -474,7 +467,6 @@ "cw" = ( /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" = ( @@ -503,7 +495,7 @@ /area/awaymission/undergroundoutpost45/central) "cH" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 + dir = 4 }, /obj/structure/chair/wood{ dir = 1 @@ -526,7 +518,7 @@ /area/awaymission/undergroundoutpost45/central) "cK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 + dir = 4 }, /obj/structure/bed, /obj/item/bedsheet, @@ -876,7 +868,6 @@ /obj/structure/disposalpipe/segment, /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" = ( @@ -917,6 +908,7 @@ 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/awaymission/undergroundoutpost45/central) "ek" = ( @@ -957,7 +949,7 @@ "eq" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 + dir = 4 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) @@ -1122,6 +1114,7 @@ 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/awaymission/undergroundoutpost45/central) "fa" = ( @@ -1193,7 +1186,9 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "fp" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, @@ -1206,7 +1201,9 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "fr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -1306,7 +1303,6 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "fI" = ( @@ -1917,7 +1913,7 @@ /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/gateway) "ig" = ( -/obj/machinery/computer/rdconsole{ +/obj/machinery/computer/rdconsole/unlocked{ dir = 4; req_access = null }, @@ -2144,7 +2140,9 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/gateway) "iT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /obj/structure/chair{ dir = 8 }, @@ -2262,6 +2260,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/gateway) "jz" = ( @@ -2497,7 +2496,7 @@ /area/awaymission/undergroundoutpost45/crew_quarters) "kr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 + dir = 2 }, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, @@ -2554,7 +2553,7 @@ /area/awaymission/undergroundoutpost45/gateway) "kB" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 + dir = 2 }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -2566,7 +2565,6 @@ /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) "kF" = ( @@ -2630,7 +2628,7 @@ /area/awaymission/undergroundoutpost45/research) "kU" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 + dir = 2 }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/purple{ @@ -2697,7 +2695,7 @@ /area/awaymission/undergroundoutpost45/crew_quarters) "le" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 + dir = 1 }, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) @@ -2748,6 +2746,7 @@ /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/gateway) "lu" = ( @@ -2893,7 +2892,7 @@ /area/awaymission/undergroundoutpost45/research) "lL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 + dir = 1 }, /obj/effect/turf_decal/tile/purple, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2913,6 +2912,7 @@ }, /obj/effect/turf_decal/tile/purple, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) "lO" = ( @@ -3013,7 +3013,6 @@ /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 }, @@ -4411,14 +4410,13 @@ "qU" = ( /obj/machinery/light/small/directional/west, /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/layer4{ - dir = 8 + dir = 2 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, @@ -4662,8 +4660,8 @@ /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/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/side{ dir = 4 }, @@ -4774,7 +4772,6 @@ /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" = ( @@ -5840,11 +5837,8 @@ /turf/open/floor/iron/checker, /area/awaymission/undergroundoutpost45/engineering) "vQ" = ( -/obj/structure/noticeboard{ - dir = 1; - pixel_y = -27 - }, /obj/effect/decal/cleanable/dirt, +/obj/structure/noticeboard/directional/south, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "vR" = ( @@ -6540,7 +6534,6 @@ /obj/structure/chair/wood{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) "Bz" = ( @@ -6837,6 +6830,8 @@ /obj/machinery/airalarm/directional/west, /obj/effect/mapping_helpers/airalarm/all_access, /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/iron{ dir = 8 }, @@ -6876,6 +6871,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) +"GS" = ( +/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/central) "Hp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6971,7 +6971,6 @@ /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" = ( @@ -6983,6 +6982,7 @@ }, /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) "Jm" = ( @@ -7121,25 +7121,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/undergroundoutpost45/gateway) -"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, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /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, @@ -7286,6 +7275,7 @@ "ON" = ( /obj/effect/turf_decal/tile/purple, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) "OO" = ( @@ -7312,6 +7302,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/research) +"Px" = ( +/obj/structure/sign/warning/vacuum{ + desc = "A beacon used by a teleporter."; + icon = 'icons/obj/devices/tracker.dmi'; + icon_state = "beacon"; + name = "tracking beacon" + }, +/turf/closed/wall, +/area/awaymission/undergroundoutpost45/central) "PB" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7362,7 +7361,6 @@ /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/layer4, /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) "Qu" = ( @@ -7606,11 +7604,6 @@ /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 @@ -7734,6 +7727,7 @@ 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) "Xd" = ( @@ -7751,6 +7745,11 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) +"XD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/awaymission/undergroundoutpost45/research) "XF" = ( /obj/structure/ore_box, /turf/open/misc/asteroid/plasma, @@ -7773,10 +7772,6 @@ /obj/structure/glowshroom/single, /turf/open/misc/asteroid/plasma, /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, @@ -28313,8 +28308,8 @@ gU gv gv kA -cA -XU +Qb +mb mF gv ad @@ -28566,12 +28561,12 @@ hw ib ib iT -LX +gJ gK Rx kB lt -XU +mb mG gw zq @@ -35251,7 +35246,7 @@ zq zq zq hH -Mg +mU lM hH mR @@ -35776,7 +35771,7 @@ lu gx Ap qV -YF +XD sw gz tR @@ -37787,7 +37782,7 @@ aK aC aP aP -aC +Px aC bv aC @@ -37800,7 +37795,7 @@ cH ae aF Gc -IV +GS ej LZ LZ @@ -38057,14 +38052,14 @@ fB cZ gf gf -zJ -zJ -zJ -zJ -zJ -zJ +aS +aS +aS +aS +aS Ai aS +aS aC fO gr @@ -38320,7 +38315,7 @@ ez eN fa fp -Ai +aS aS da gA @@ -38577,7 +38572,7 @@ el el el fq -Ai +aS aS da gs @@ -38591,8 +38586,8 @@ WD WD Ij HA -HA -Ug +zA +gs lQ gs nG @@ -38834,7 +38829,7 @@ eA eB el fq -Ai +aS fU ae fK @@ -38849,7 +38844,7 @@ gg gg jR Ro -Ug +gs gA mp fN @@ -39091,7 +39086,7 @@ eB eO el fq -Ai +aS fV ae zq @@ -39348,7 +39343,7 @@ el el el fq -Ai +aS aF aP zq @@ -39605,7 +39600,7 @@ eC eC aY fr -Ai +aS fW aP zq @@ -42446,7 +42441,7 @@ iH jc jz hK -Vo +hK lj lU fN diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 7249d53f5cbf..b97729d306d6 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,11 +1,21 @@ //#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. -//#define SHOW_INVENTORY_ICONS //uncomment this to make mapping software use inventory icons rather then world icons +//#define ABSOLUTE_MINIMUM //uncomment this to load a smaller centcomm and smaller runtime station, only works together with LOWMEMORYMODE +//#define SHOW_INVENTORY_ICONS //uncomment this to make mapping software use inventory icons rather then world icons // DARKPACK EDIT ADD +#ifdef ABSOLUTE_MINIMUM +#define LOWMEMORYMODE +#endif + +#ifndef ABSOLUTE_MINIMUM #include "map_files\generic\CentCom.dmm" +#else +#include "map_files\generic\CentCom_minimal.dmm" +#endif #ifndef LOWMEMORYMODE #ifdef ALL_MAPS // DARKPACK EDIT CHANGE START + #include "map_files\Vampire\westfield_mall.dmm" #include "map_files\Vampire\runtimetown.dmm" #include "map_files\debug\multiz.dmm" #include "map_files\debug\runtimestation.dmm" diff --git a/_maps/gateway_test.json b/_maps/gateway_test.json index df38ec4c5b86..4acdadf06445 100644 --- a/_maps/gateway_test.json +++ b/_maps/gateway_test.json @@ -8,8 +8,8 @@ "ignored_unit_tests": [ "/datum/unit_test/antag_moodlets", "/datum/unit_test/cargo_dep_order_locations", - "/datum/unit_test/job_roundstart_spawnpoints", - "/datum/unit_test/required_map_items", + "/datum/unit_test/maptest_job_roundstart_spawnpoints", + "/datum/unit_test/maptest_required_map_items", "/datum/unit_test/space_dragon_expiration", "/datum/unit_test/spy_bounty", "/datum/unit_test/traitor" diff --git a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm index c95e81d965f5..078db1be7b9a 100644 --- a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm +++ b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm @@ -2,20 +2,21 @@ "aad" = ( /turf/closed/wall, /area/station/service/hydroponics) -"aah" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/science/server) -"aat" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"aaq" = ( /obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, +/obj/structure/sign/poster/random/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/firealarm_sanity, +/turf/open/floor/catwalk_floor/iron_smooth, /area/station/engineering/main) +"aas" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Laundromat" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/textured, +/area/station/commons/dorms/laundry) "aau" = ( /obj/structure/railing{ dir = 1 @@ -23,6 +24,13 @@ /obj/structure/showcase/machinery/implanter, /turf/open/floor/wood, /area/station/command/corporate_showroom) +"aaN" = ( +/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/catwalk_floor/iron_smooth, +/area/station/engineering/main) "aaO" = ( /obj/structure/plaque/static_plaque/golden{ desc = "Come get your own gold plaque!"; @@ -31,56 +39,28 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"aaS" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/stack{ - dir = 1 - }, -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/obj/item/paper/crumpled{ - pixel_x = -3; - pixel_y = 2 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "aaV" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"abi" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/rack, -/obj/item/grenade/chem_grenade/smart_metal_foam, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 5 - }, -/obj/item/holosign_creator/atmos{ - pixel_x = -1; - pixel_y = -5 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "abm" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Quartermaster" - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/supply/qm, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/brown/fourcorners, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/trimline/dark_red/filled/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_red/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, +/area/station/cargo/storage) "abp" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/east, @@ -89,20 +69,22 @@ /turf/open/floor/plating, /area/station/maintenance/space_hut) "abs" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, +/obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters{ - id = "commissaryshutter"; + dir = 1; + id = "Rcommissaryshutter"; name = "Vacant Commissary Shutter" }, -/obj/effect/turf_decal/tile/dark_green/fourcorners, -/turf/open/floor/iron/dark, +/turf/open/floor/plating, /area/station/commons/vacant_room/office) "abE" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/medical/pharmacy, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plating, -/area/station/maintenance/port/aft) +/area/station/medical/chem_storage) "abF" = ( /obj/structure/railing{ dir = 1 @@ -116,25 +98,17 @@ /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "abI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/shaft_miner, +/obj/machinery/autolathe, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, /turf/open/floor/iron, -/area/station/cargo/miningoffice) +/area/station/cargo/storage) "abM" = ( +/obj/structure/railing, /obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/machinery/conveyor{ - dir = 8; - id = "cargounload" - }, -/obj/effect/spawner/random/maintenance, -/obj/structure/closet/crate, -/obj/item/storage/belt/fannypack/yellow, -/obj/structure/railing{ - dir = 1 + dir = 6 }, -/obj/structure/railing, /turf/open/floor/iron, /area/station/cargo/storage) "abT" = ( @@ -146,6 +120,28 @@ }, /turf/open/floor/iron, /area/station/science/robotics) +"acc" = ( +/obj/item/flashlight/lamp{ + pixel_y = 7 + }, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/qm) +"acd" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "acl" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -156,22 +152,11 @@ /turf/open/floor/carpet/stellar, /area/station/maintenance/hallway/abandoned_recreation) "acx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/directions/engineering/directional/north{ - dir = 8 - }, -/obj/structure/sign/directions/engineering/directional/north{ - dir = 8; - pixel_y = 26 - }, -/obj/structure/sign/directions/engineering/directional/north{ - dir = 8; - pixel_y = 38 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/cargo_technician, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/cargo/storage) "acI" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -184,7 +169,7 @@ "acL" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/ladder, -/turf/open/floor/wood, +/turf/open/floor/iron/dark, /area/station/command/gateway) "acN" = ( /obj/structure/flora/rock/pile/style_2, @@ -199,12 +184,17 @@ }, /turf/open/misc/asteroid, /area/station/science/robotics) -"acU" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ - dir = 5 +"acS" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/obj/effect/turf_decal/siding/dark_blue, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "acV" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/structure/table, @@ -214,18 +204,17 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron, /area/station/science/research) -"ade" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"adg" = ( +/obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/lattice/catwalk, -/obj/item/trash/tray, -/turf/open/water, -/area/station/maintenance/starboard/fore) -"ado" = ( -/obj/machinery/light/directional/west, -/turf/open/openspace, -/area/station/engineering/break_room) +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"adq" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet, +/area/station/security/detectives_office) "adv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, @@ -256,11 +245,6 @@ }, /turf/open/openspace, /area/station/science/xenobiology) -"aej" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable/layer1, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "aep" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -268,20 +252,21 @@ /turf/open/floor/wood, /area/station/hallway/secondary/service) "aeq" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/turf/open/floor/iron/white/textured_edge, -/area/station/medical/surgery) -"afg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/surgery) +"afg" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark_blue/corner, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 }, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) @@ -296,29 +281,44 @@ /turf/open/misc/asteroid, /area/station/science/xenobiology/hallway) "afl" = ( -/obj/structure/sink/directional/west, -/obj/effect/turf_decal/tile/blue/opposingcorners{ +/obj/machinery/light/floor{ + color = "#66ccff" + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/warning{ + dir = 4 + }, +/obj/structure/closet/secure_closet/personal/patient, +/turf/open/floor/iron/dark/smooth_corner{ dir = 1 }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/general/visible, -/turf/open/floor/iron/dark, /area/station/medical/cryo) "afn" = ( -/obj/structure/railing{ - dir = 4 - }, /obj/effect/turf_decal/siding/blue{ 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/command/bridge) -"afr" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/end{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "aft" = ( /obj/structure/stairs/west, /obj/structure/railing, @@ -327,14 +327,23 @@ "afu" = ( /turf/open/openspace, /area/station/commons/dorms) -"afB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/cigbutt{ - pixel_x = -12; - pixel_y = 15 +"afA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/table, +/obj/item/stack/sheet/iron, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/dark/textured_large, +/area/station/commons/dorms) +"afI" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard) "afK" = ( /obj/machinery/turretid{ name = "AI Chamber turret control"; @@ -357,21 +366,18 @@ }, /obj/structure/lattice/catwalk, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "afL" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, /turf/open/floor/iron/dark, /area/station/science/lobby) -"afP" = ( -/obj/structure/chair/pew{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/maintenance/starboard/lesser) +"afQ" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor/iron, +/area/station/commons/dorms) "afR" = ( /turf/open/openspace, /area/station/hallway/primary/aft) @@ -386,15 +392,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/prison/mess) -"agh" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/firealarm/directional/south, -/obj/machinery/camera/autoname/directional/south, +"agq" = ( /obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/engineering/break_room) +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/port/fore) +"agu" = ( +/obj/structure/sign/departments/medbay/alt/directional/south, +/turf/open/floor/iron/edge, +/area/station/hallway/primary/central) "agy" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 4 @@ -408,20 +416,62 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/engineering/lobby) +"agB" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/upper) "agF" = ( /obj/structure/disposalpipe/segment{ dir = 6 }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"agO" = ( -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +"agL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"agX" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/directional/west, +/turf/open/space/openspace, +/area/space/nearstation) +"ahf" = ( +/turf/closed/wall/r_wall, +/area/station/medical/chemistry) "ahh" = ( /obj/effect/turf_decal/delivery, /obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) +"ahl" = ( +/obj/machinery/pipedispenser/disposal, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) +"ahx" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 2; + pixel_y = 11 + }, +/obj/item/clothing/head/utility/welding{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/item/toy/figure/lawyer{ + pixel_x = 6; + pixel_y = 6 + }, +/turf/open/floor/iron/checker, +/area/station/maintenance/port/aft) "ahC" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix{ dir = 8 @@ -448,12 +498,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/openspace, /area/station/hallway/primary/aft) -"ahT" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) "ahU" = ( /obj/effect/turf_decal/delivery, /obj/effect/spawner/random/vending/snackvend, @@ -474,22 +518,18 @@ /turf/open/floor/iron/dark, /area/station/science/cytology) "aia" = ( -/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/carpet, -/area/station/command/meeting_room/council) -"aii" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/gravity_generator) +/obj/machinery/computer/communications{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/circuit, +/area/station/command/bridge) "aim" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/iron, -/area/station/commons/storage/primary) +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "aiq" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/doppler_array{ @@ -505,18 +545,11 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"aiv" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/directional/east, -/obj/machinery/camera/autoname/directional/east, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "aiA" = ( /obj/effect/turf_decal/delivery, /obj/structure/closet/emcloset, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "aiE" = ( /obj/structure/railing, /obj/structure/cable, @@ -535,7 +568,11 @@ /area/station/science/robotics/lab) "aiP" = ( /obj/effect/turf_decal/trimline/brown/filled/line, -/turf/open/floor/iron, +/obj/structure/chair/sofa/middle/brown{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, /area/station/cargo/storage) "aiY" = ( /obj/structure/railing{ @@ -545,6 +582,13 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"ajw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/icecream_vat, +/obj/structure/light_construct/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/starboard/central) "ajB" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -579,15 +623,16 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "ajU" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/item/surgical_drapes, -/obj/machinery/airalarm/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white/textured_large, +/obj/effect/turf_decal/trimline/blue/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/surgery) "ajV" = ( /obj/structure/lattice/catwalk, @@ -617,6 +662,13 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/grimy, /area/station/security/interrogation) +"akk" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "ako" = ( /obj/structure/railing/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -642,6 +694,16 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) +"akv" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/machinery/holopad, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "akE" = ( /obj/structure/chair{ dir = 1 @@ -659,35 +721,13 @@ codes_txt = "patrol;next_patrol=8-Kitchen"; location = "7-Gateway" }, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) -"akK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/hallway) "akL" = ( /obj/machinery/telecomms/server/presets/engineering, /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"akS" = ( -/obj/structure/rack, -/obj/item/storage/crayons{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/storage/box/lights/bulbs{ - pixel_x = 5 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -4; - pixel_y = -7 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "akU" = ( /obj/effect/landmark/start/hangover, /obj/structure/disposalpipe/segment{ @@ -696,7 +736,9 @@ /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/large, +/turf/open/floor/iron/edge{ + dir = 8 + }, /area/station/hallway/primary/central) "akW" = ( /obj/effect/turf_decal/trimline/dark_blue/line{ @@ -713,7 +755,16 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"alb" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "alh" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -722,9 +773,11 @@ /obj/structure/railing/corner/end/flip{ 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/openspace, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "ali" = ( /obj/structure/plaque/static_plaque/golden/commission/pubby{ pixel_y = 32 @@ -749,13 +802,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"alk" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "als" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -767,16 +813,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/sorting/mail, /obj/effect/mapping_helpers/mail_sorting/medbay/virology, +/obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/medical/virology) -"alx" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) +"alA" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/closet/firecloset, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) "alF" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table_frame, @@ -787,21 +832,36 @@ /obj/effect/spawner/random/maintenance/no_decals, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"alG" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ - dir = 4 +"alM" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/engineering{ + name = "Engine Room" }, -/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ - dir = 4 +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/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 = 1 }, -/turf/open/openspace, -/area/station/engineering/atmos/project) +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmoslowersm" + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "alT" = ( /obj/structure/disposalpipe/segment, /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"amd" = ( +/obj/structure/closet/secure_closet/engineering_personal{ + anchored = 1 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "ame" = ( /obj/machinery/newscaster/directional/west, /obj/machinery/light/directional/west, @@ -815,16 +875,24 @@ /turf/open/floor/iron/dark, /area/station/security/warden) "ams" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 1 +/obj/machinery/door/window/left/directional/west, +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -5; + pixel_y = 4 }, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 8 +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "hop"; + name = "Privacy Shutters" }, -/obj/effect/landmark/navigate_destination/hop, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) +/obj/machinery/door/window/brigdoor/right/directional/east{ + name = "Head of Personnel's Desk"; + req_access = list("hop") + }, +/obj/item/pen, +/turf/open/floor/plating, +/area/station/command/heads_quarters/hop) "amt" = ( /obj/effect/decal/cleanable/dirt, /obj/item/reagent_containers/cup/bucket{ @@ -845,13 +913,12 @@ }, /obj/machinery/light/directional/west, /turf/open/floor/iron/dark/textured_half, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "amJ" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/miningoffice) "amU" = ( @@ -860,6 +927,22 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) +"amW" = ( +/obj/structure/table/optable, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/floor/iron/showroomfloor, +/area/station/medical/surgery) +"amY" = ( +/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/opposingcorners{ + dir = 1 + }, +/obj/structure/sign/poster/official/work_for_a_future/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "anj" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -871,6 +954,11 @@ "anm" = ( /turf/closed/wall, /area/station/service/library/printer) +"ano" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "anp" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -888,65 +976,73 @@ }, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"anB" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/vending/engivend, -/turf/open/floor/iron/smooth, -/area/station/engineering/main) "anG" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/openspace, /area/station/security/detectives_office) -"anJ" = ( -/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/lobby) "anY" = ( /turf/open/floor/engine/hull/air, /area/station/maintenance/port/fore) +"aod" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engineering" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room/upper) "aoh" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/engineering/tank, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"aor" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/engineering/atmos/project) +"aoi" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/closet/crate, +/obj/item/stack/rods{ + amount = 25 + }, +/obj/item/stack/sheet/iron{ + amount = 30 + }, +/obj/item/stack/cable_coil, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "aoz" = ( /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, /turf/open/floor/iron/dark/textured_corner{ dir = 1 }, /area/station/medical/morgue) -"aoK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/athletic_mixed, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "aoQ" = ( +/obj/effect/turf_decal/arrows{ + 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/dark, +/turf/open/floor/iron/dark/smooth_large, /area/station/command/gateway) +"aoY" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/closet/radiation, +/obj/structure/sign/warning/no_smoking/directional/west, +/turf/open/floor/iron, +/area/station/engineering/lobby) "apa" = ( /obj/structure/rack, /obj/machinery/door/window/left/directional/east{ - name = "Jetpack Storage" + name = "Magboot Storage"; + req_access = list("eva") }, /obj/item/clothing/shoes/magboots{ pixel_x = -4; @@ -957,8 +1053,8 @@ pixel_x = 4; pixel_y = -3 }, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "apf" = ( /obj/machinery/status_display/evac/directional/north, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -981,42 +1077,36 @@ }, /turf/open/floor/iron/checker, /area/station/service/bar) -"apA" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ +"apv" = ( +/obj/effect/turf_decal/siding{ dir = 1 }, -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "CO2 Multideck Adapter"; - dir = 4 - }, -/obj/machinery/meter{ - name = "C02 meter" +/obj/effect/turf_decal/trimline/white/corner, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) +"apy" = ( +/obj/item/ammo_casing/spent{ + pixel_x = -8; + pixel_y = -4 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) -"apE" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"apI" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "ceprivacy"; - name = "Chief Engineers Privacy Shutters" +/obj/item/ammo_casing/spent{ + pixel_x = -3; + pixel_y = 3 }, -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/command/heads_quarters/ce) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) "apK" = ( /turf/closed/wall/r_wall, /area/station/security/range) "apM" = ( /obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "apR" = ( /turf/closed/wall/r_wall, @@ -1064,18 +1154,19 @@ }, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"aqj" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +"aqi" = ( +/obj/effect/turf_decal/trimline/brown/arrow_cw{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/arrow_ccw, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "aqk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "aqm" = ( /turf/closed/mineral/random/stationside/asteroid/porus, /area/space/nearstation) @@ -1084,33 +1175,33 @@ /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/machinery/holopad, -/turf/open/floor/carpet, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) -"aqy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"aqp" = ( +/obj/structure/railing/corner{ + dir = 8 }, -/obj/structure/cable, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/plating, -/area/station/engineering/main) +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "aqD" = ( /turf/open/floor/iron/white/smooth_large, /area/station/security/prison) -"aqG" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"aqQ" = ( -/obj/item/kirbyplants/photosynthetic, -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/eighties, -/area/station/maintenance/starboard/fore) +"aqE" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) +"aqP" = ( +/obj/structure/lattice/catwalk, +/obj/effect/spawner/random/engineering/atmospherics_portable, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/port/fore) "aqS" = ( /obj/item/cigbutt{ pixel_x = -15 @@ -1126,14 +1217,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"are" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 +"arc" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "ars" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1167,40 +1257,25 @@ dir = 8 }, /area/station/science/robotics) -"arw" = ( -/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/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "arz" = ( /obj/item/radio/intercom/directional/west, /turf/open/openspace, /area/station/science/xenobiology) +"arG" = ( +/obj/structure/railing, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "arK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/light/directional/east, /obj/machinery/light_switch/directional/east, /turf/open/floor/wood, /area/station/service/chapel) -"arL" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"arN" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law{ - pixel_y = 6 - }, -/obj/structure/cable, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/wood, -/area/station/security/courtroom) "arT" = ( /turf/closed/wall/r_wall, /area/station/science/xenobiology) @@ -1216,6 +1291,14 @@ /obj/effect/landmark/start/cook, /turf/open/floor/glass, /area/station/service/kitchen) +"asl" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/ferny/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/effect/landmark/start/hangover, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/grass, +/area/station/commons/dorms) "asx" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -1231,22 +1314,20 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"asA" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "asI" = ( /obj/structure/railing/corner{ dir = 4 }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "asK" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/airalarm/directional/south, @@ -1255,16 +1336,46 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) -"asY" = ( -/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/structure/disposalpipe/segment{ +"asM" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - Mix Cell"; + name = "atmospherics camera" + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos/upper) +"asU" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ dir = 4 }, +/turf/closed/wall/r_wall, +/area/station/maintenance/aft/upper) +"asV" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "!"; + pixel_x = 9; + pixel_y = -1 + }, +/turf/closed/wall, +/area/station/maintenance/starboard/aft/upper) +"asY" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/table/reinforced/rglass, +/obj/item/reagent_containers/spray/cleaner, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) +"asZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "ata" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -1272,6 +1383,10 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"atf" = ( +/obj/machinery/holopad, +/turf/open/floor/glass, +/area/station/medical/patients_rooms/room_a) "ati" = ( /obj/machinery/door/airlock/security/glass{ id_tag = "outerbrig"; @@ -1285,13 +1400,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) -"atj" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "atm" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -1313,6 +1421,25 @@ dir = 8 }, /area/station/hallway/secondary/service) +"atE" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/station/medical/break_room) +"atJ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "atV" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/purple, @@ -1325,19 +1452,22 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"aud" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/lattice/catwalk, -/obj/structure/disposalpipe/segment{ +"atZ" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/arrow_ccw{ dir = 4 }, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) -"aug" = ( -/obj/machinery/vending/games, +/obj/item/kirbyplants/random, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/area/station/hallway/primary/aft) +"auf" = ( +/obj/effect/landmark/start/assistant, +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "aum" = ( /obj/structure/sign/poster/official/random/directional/south, /obj/effect/turf_decal/siding/wood, @@ -1359,21 +1489,19 @@ /obj/effect/turf_decal/tile/purple/full, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) +"aur" = ( +/obj/structure/chair{ + dir = 4; + pixel_y = -2 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "aut" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ dir = 6 }, /turf/open/space/openspace, /area/space/nearstation) -"auA" = ( -/obj/machinery/disposal/bin, -/obj/machinery/light/directional/east, -/obj/machinery/newscaster/directional/east, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) "auF" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -1383,15 +1511,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/brig) -"auP" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/lobby) "auS" = ( /obj/item/toy/plush/moth{ name = "Goofy Greg"; @@ -1421,28 +1540,30 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/cargo/storage) -"avY" = ( -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/storage/medkit/o2{ - pixel_x = 3; +"avj" = ( +/obj/structure/table, +/obj/item/gavelhammer{ pixel_y = 3 }, -/obj/item/storage/medkit/o2, -/obj/item/storage/medkit/o2{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/table/reinforced, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/security/courtroom) +"avw" = ( +/obj/machinery/vatgrower, +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) +"avI" = ( /obj/structure/lattice/catwalk, -/obj/machinery/door/window/right/directional/west{ - name = "First Aid Supplies"; - req_access = list("medical") - }, /turf/open/openspace, -/area/station/medical/storage) +/area/station/maintenance/starboard/upper) +"avJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/start/hangover, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "avZ" = ( /obj/structure/railing{ dir = 4 @@ -1456,11 +1577,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/research) -"awv" = ( -/obj/structure/cable, -/obj/item/assembly/mousetrap/armed, -/turf/open/floor/plating, -/area/station/maintenance/port) +"awk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/engineering/atmospherics_portable, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "aww" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1478,9 +1600,16 @@ /turf/open/floor/iron, /area/station/hallway/primary/aft) "awD" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/obj/structure/sign/directions/command/directional/north{ + dir = 2; + pixel_y = 0 + }, +/obj/structure/sign/directions/security/directional/north{ + dir = 2; + pixel_y = 7 + }, +/turf/closed/wall, +/area/station/maintenance/port/greater) "awG" = ( /turf/open/misc/asteroid/airless, /area/station/science/ordnance/bomb) @@ -1490,21 +1619,33 @@ }, /obj/effect/turf_decal/siding/dark, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat_interior) -"awK" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/interior) "awP" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"axn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +"awR" = ( +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible{ + dir = 5 + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) +"awV" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"awX" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"axj" = ( +/obj/structure/chair/plastic{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine/hull/air, +/area/station/commons/fitness/recreation) "axr" = ( /obj/structure/railing{ dir = 4 @@ -1521,15 +1662,21 @@ /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) "axN" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance" - }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/any/medical/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/medical/abandoned) +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "axQ" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/dark, @@ -1538,21 +1685,14 @@ /obj/effect/turf_decal/bot/right, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"ayn" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 9 - }, -/obj/effect/turf_decal/siding/brown/corner, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) -"ayr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/skub{ - pixel_x = 7; - pixel_y = 18 +"ayi" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/machinery/door/firedoor, +/obj/structure/fluff/shower_drain, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "ayA" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -1567,16 +1707,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"ayD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/water, -/area/station/maintenance/port/fore) "ayF" = ( /obj/structure/closet/crate/trashcart/filled, /obj/item/poster/random_contraband{ @@ -1584,6 +1714,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) +"ayI" = ( +/obj/structure/table/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "ayR" = ( /obj/structure/table, /obj/item/storage/crayons{ @@ -1593,6 +1730,18 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/wood, /area/station/service/library/printer) +"ayU" = ( +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/obj/structure/hoop{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "ayZ" = ( /obj/docking_port/stationary/escape_pod{ dir = 2 @@ -1617,24 +1766,60 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"azj" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron, +/area/station/commons/locker) "azn" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/medical/abandoned) +"azo" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/obj/structure/table, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = 5 + }, +/obj/item/stack/sheet/mineral/plasma{ + pixel_x = 2 + }, +/obj/structure/sign/poster/official/periodic_table/directional/east, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "azt" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, /turf/open/space/basic, /area/station/solars/port/aft) "azx" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/carpet, -/area/station/command/bridge) +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) +"azG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/flag/mars/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "azI" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -1671,18 +1856,21 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/research) -"aAk" = ( -/obj/structure/table/wood, -/obj/item/paper/crumpled{ - pixel_x = 2; - pixel_y = 7 +"aAg" = ( +/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 = 8 }, -/obj/item/pen{ - pixel_x = -4; - pixel_y = 1 +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/fore) +"aAn" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) +/turf/open/floor/iron, +/area/station/engineering/lobby) "aAr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/closet_maintenance, @@ -1700,6 +1888,24 @@ }, /turf/open/floor/iron, /area/station/science/robotics) +"aAM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/tank/internals/oxygen, +/obj/item/clothing/mask/breath, +/obj/machinery/light/small/directional/east, +/obj/structure/table/reinforced, +/obj/machinery/airalarm/directional/east, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/aft) +"aBc" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/medical/break_room) "aBl" = ( /obj/structure/bookcase/random, /turf/open/floor/wood/large, @@ -1721,38 +1927,65 @@ /obj/structure/cable, /turf/open/openspace, /area/station/hallway/primary/port) -"aBv" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/station/engineering/break_room) -"aBy" = ( -/obj/structure/table/wood, -/obj/machinery/fax{ - fax_name = "Chief Medical Officer's Office"; - name = "Chief Medical Officer's Fax Machine" +"aBu" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 11 }, -/obj/machinery/keycard_auth/wall_mounted/directional/north, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) -"aBF" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/science/xenobiology/hallway) -"aBN" = ( -/obj/structure/railing{ - dir = 9 +/obj/machinery/cell_charger{ + pixel_x = -2 }, -/obj/effect/turf_decal/siding/yellow{ - dir = 9 +/obj/item/stock_parts/power_store/cell/high{ + charge = 100; + maxcharge = 15000; + pixel_x = -5 }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 +/obj/item/multitool{ + pixel_x = 6; + pixel_y = 2 }, -/obj/structure/disposalpipe/trunk{ - dir = 4 +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"aBy" = ( +/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/window/reinforced/spawner/directional/south, +/obj/machinery/door/window/right/directional/west{ + name = "First Aid Supplies"; + req_access = list("medical") }, +/obj/structure/table/reinforced/rglass, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) +"aBz" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/maintenance/aft) +"aBF" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/science/xenobiology/hallway) +"aBN" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/landmark/navigate_destination/chemfactory, /turf/open/floor/iron/dark, /area/station/medical/chemistry) "aBO" = ( @@ -1777,10 +2010,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) -"aBV" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/wood, -/area/station/commons/dorms) "aBW" = ( /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ dir = 4 @@ -1820,11 +2049,11 @@ }, /obj/machinery/status_display/evac/directional/south, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "aCD" = ( /obj/machinery/holopad/secure, /turf/open/floor/iron/smooth, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "aCE" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -1843,31 +2072,47 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) -"aDh" = ( -/obj/structure/rack, -/obj/item/cardboard_cutout{ - pixel_x = -5 +"aDb" = ( +/obj/machinery/button/elevator{ + id = "catwalk_engi"; + pixel_y = -24 }, -/obj/item/cardboard_cutout, -/obj/item/cardboard_cutout{ - pixel_x = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) +"aDd" = ( +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) +"aDk" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/north, +/obj/structure/sign/poster/official/no_erp/directional/east, /turf/open/floor/plating, -/area/station/maintenance/port) +/area/station/commons/dorms) "aDm" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /obj/machinery/holopad, -/obj/structure/cable, /turf/open/floor/iron/dark/textured_edge{ dir = 1 }, /area/station/medical/morgue) -"aDp" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 +"aDw" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, +/obj/effect/turf_decal/trimline/yellow/mid_joiner{ + dir = 8 + }, +/turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "aDF" = ( /obj/structure/reagent_dispensers/watertank, @@ -1908,24 +2153,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"aDY" = ( -/obj/machinery/door/airlock/virology{ - autoclose = 0; - frequency = 1449; - id_tag = "virology_airlock_interior"; - name = "Malpractice Tower Exterior Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "viro-passthrough" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/medical/virology, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/virology) +"aEg" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "aEm" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 @@ -1935,14 +2166,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/explab) -"aEr" = ( -/obj/machinery/atmospherics/components/binary/pump/off{ - dir = 8; - name = "O2 To Port" +"aEA" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ + dir = 1; + initialize_directions = 1 }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) "aEG" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/closet/emcloset, @@ -1963,25 +2195,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "aEZ" = ( /turf/open/floor/iron, /area/station/science/breakroom) -"aFg" = ( -/turf/open/openspace, -/area/station/maintenance/starboard/aft) +"aFe" = ( +/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_smooth, +/area/station/engineering/atmos) "aFi" = ( /obj/structure/ladder, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"aFk" = ( -/obj/structure/sign/clock/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"aFm" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"aFn" = ( +/obj/structure/table/wood/fancy/cyan, +/obj/item/book/manual/wiki/atmospherics{ + pixel_y = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "aFt" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -2007,28 +2242,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) -"aFP" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/dark/arrow_ccw{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark/arrow_ccw{ - dir = 4 - }, -/turf/open/floor/iron/edge{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"aFQ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/computer/atmos_control/nitrous_tank{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "aFV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, @@ -2043,25 +2256,41 @@ dir = 4 }, /turf/open/openspace, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "aGb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/railing, /obj/structure/fake_stairs/directional/east, /turf/open/floor/iron, /area/station/cargo/storage) +"aGe" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/cup/soda_cans/monkey_energy{ + pixel_x = 8; + pixel_y = 16 + }, +/obj/item/stock_parts/power_store/cell/high{ + charge = 100; + maxcharge = 15000; + pixel_y = 6 + }, +/obj/item/cigbutt{ + pixel_x = -11; + pixel_y = 15 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/aft/upper) "aGf" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/hallway/secondary/entry) -"aGp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/layer1, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +"aGx" = ( +/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/aft) "aGG" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 4 @@ -2073,41 +2302,22 @@ "aGR" = ( /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) -"aGX" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/item/radio/intercom/directional/north, -/obj/machinery/rnd/production/protolathe/department/engineering, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) -"aHc" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "SM_Outside_shutters"; - name = 4 +"aHb" = ( +/obj/structure/sign/poster/contraband/grey_tide/directional/north, +/obj/structure/rack, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = -13 }, -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) -"aHe" = ( -/obj/machinery/button/door/directional/west{ - id = "Cabin5"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 24; - specialfunctions = 4 +/obj/effect/turf_decal/tile/yellow{ + dir = 1 }, -/obj/item/storage/box/lights/mixed, -/obj/item/kirbyplants/random/dead{ - name = "dead plant" +/obj/item/storage/toolbox/mechanical, +/obj/item/storage/toolbox/electrical{ + pixel_y = -2 }, -/turf/open/floor/wood, -/area/station/commons/dorms) -"aHo" = ( -/obj/structure/safe, -/obj/item/storage/fancy/pickles_jar, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/iron, +/area/station/commons/storage/primary) "aHp" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/trimline/dark/arrow_cw{ @@ -2121,19 +2331,22 @@ dir = 8 }, /area/station/hallway/primary/fore) -"aHD" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Virology Maintenance" +"aHB" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -4; + pixel_y = 9 }, -/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 = 2 +/obj/item/cigbutt, +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood/large, +/area/station/commons/dorms) +"aHH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port) +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "aHO" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -2161,19 +2374,16 @@ codes_txt = "delivery;dir=2"; location = "Court" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/security/courtroom) -"aIt" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/camera/autoname/directional/west, -/obj/structure/railing{ - dir = 4 +"aIh" = ( +/obj/machinery/camera/preset/ordnance{ + c_tag = "Cannon's exit" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) +/turf/open/floor/plating/airless, +/area/station/maintenance/starboard/aft) "aIA" = ( /obj/structure/railing{ dir = 8 @@ -2199,6 +2409,13 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/station/security/brig) +"aIJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "aIL" = ( /obj/structure/chair/stool/bar/directional/east, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -2227,10 +2444,37 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/detectives_office/private_investigators_office) +"aIR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/window{ + dir = 8; + name = "Cargo Bay Shutters"; + id = "qm_cargobay" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/cargo/storage) "aIU" = ( /obj/machinery/holopad/secure, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) +"aIY" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/modular_computer/preset/engineering{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/light/small/directional/north, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/plating, +/area/station/engineering/atmos/office) +"aIZ" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/engine, +/area/station/engineering/atmos) "aJg" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/service/theatre, @@ -2251,12 +2495,28 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) +"aJn" = ( +/obj/structure/sign/poster/official/fruit_bowl, +/turf/closed/wall, +/area/station/maintenance/starboard/aft/upper) +"aJs" = ( +/obj/effect/turf_decal/trimline/dark_green, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "aJu" = ( /obj/structure/sign/poster/official/random/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"aJA" = ( +/obj/effect/spawner/random/trash/mess, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "aJD" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -2281,26 +2541,34 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/ordnance/storage) +"aJR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "aJV" = ( /obj/effect/spawner/random/food_or_drink, /turf/open/floor/plating, /area/station/maintenance/port) "aKc" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/large, +/turf/open/floor/iron/corner{ + dir = 1 + }, /area/station/hallway/primary/central) "aKj" = ( -/obj/structure/closet/crate, -/obj/item/gps, -/obj/item/assembly/timer, -/obj/item/gps, -/obj/item/assembly/signaler, -/obj/item/analyzer{ - pixel_x = 7; - pixel_y = 3 +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 8 }, -/turf/open/floor/iron, -/area/station/commons/storage/primary) +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "aKk" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -2310,40 +2578,34 @@ }, /turf/open/floor/iron/airless, /area/station/maintenance/starboard/aft) -"aKq" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 +"aKo" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/barricade/wooden/crude, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "aKz" = ( /obj/structure/railing{ dir = 8 }, -/obj/structure/closet, -/obj/effect/spawner/random/aimodule/harmful{ - pixel_y = 5 +/obj/structure/table/wood/fancy/blue, +/obj/effect/spawner/random/aimodule/neutral{ + pixel_y = 10 }, -/obj/item/ai_module/reset/purge{ - pixel_y = -2 +/obj/effect/spawner/random/aimodule/neutral{ + pixel_x = 3; + pixel_y = -3 }, -/obj/item/stack/cable_coil, -/obj/effect/decal/cleanable/blood/oil, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "aKA" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark, /area/station/service/chapel) -"aKB" = ( -/obj/item/cigbutt{ - pixel_x = -12; - pixel_y = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "aKE" = ( /obj/machinery/door/airlock/virology, /obj/effect/turf_decal/tile/dark_green/fourcorners, @@ -2351,6 +2613,24 @@ /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/iron/dark, /area/station/science/cytology) +"aKG" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 8 + }, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) +"aKJ" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 4 + }, +/obj/item/cigbutt, +/obj/structure/sign/calendar/directional/north, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "aKR" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 @@ -2382,9 +2662,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"aLd" = ( -/turf/open/floor/glass/airless, -/area/station/maintenance/starboard/lesser) "aLl" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -2399,6 +2676,17 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"aLq" = ( +/obj/machinery/light/directional/east, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/mail_sorting/supply/disposals, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/sorting) "aLu" = ( /obj/item/paint/white{ pixel_x = 11; @@ -2406,6 +2694,25 @@ }, /turf/open/floor/glass/reinforced, /area/station/service/library) +"aLA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/large, +/area/station/commons/dorms) +"aLB" = ( +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) +"aLG" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing, +/obj/machinery/duct, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "aLJ" = ( /turf/open/floor/carpet, /area/station/security/courtroom) @@ -2417,28 +2724,14 @@ /turf/open/space/openspace, /area/space/nearstation) "aLT" = ( -/obj/machinery/computer/records/medical{ - dir = 1 - }, /obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"aLW" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) -"aLX" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 }, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron, -/area/station/engineering/lobby) +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "aLY" = ( /obj/item/stack/cable_coil{ pixel_y = -12 @@ -2446,13 +2739,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"aMa" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/stack{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "aMd" = ( /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -2476,38 +2762,26 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"aMq" = ( +"aMl" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) -"aMs" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) +/obj/structure/fluff/paper/stack{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "aMw" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, /turf/open/floor/iron/dark, /area/station/engineering/storage) -"aMz" = ( -/obj/item/restraints/legcuffs/beartrap/prearmed, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"aMD" = ( -/obj/item/flashlight/lantern{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "aMK" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "main_surgery" +/obj/effect/turf_decal/siding/dark_blue/inner_corner{ + dir = 8 }, -/obj/machinery/smartfridge/organ, -/obj/machinery/door/firedoor, /turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) +/area/station/medical/medbay/central) "aMM" = ( /obj/effect/decal/cleanable/plasma, /obj/item/stack/rods/two, @@ -2524,27 +2798,15 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/carpet, +/obj/structure/cable, +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "aNc" = ( /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/zoo) -"aNf" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 1 - }, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/upper) -"aNg" = ( -/obj/structure/chair/sofa/corner/brown, -/obj/item/instrument/eguitar, -/obj/structure/sign/poster/contraband/space_cube/directional/north, -/obj/machinery/light/small/broken/directional/east, -/turf/open/floor/eighties, -/area/station/maintenance/starboard/fore) "aNB" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 @@ -2565,6 +2827,19 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"aNE" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/showcase/horrific_experiment, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) +"aNI" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "aNL" = ( /obj/effect/turf_decal/tile/dark_blue{ dir = 1 @@ -2573,10 +2848,13 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"aNT" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"aNP" = ( +/obj/structure/cable, +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/folder/yellow, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "aNU" = ( /obj/structure/chair/office{ dir = 4 @@ -2602,11 +2880,27 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"aOo" = ( +/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/plating, +/area/station/maintenance/aft/upper) "aOs" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/burgundy, /turf/open/space/openspace, /area/space/nearstation) +"aOE" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark, +/area/station/science/lobby) +"aOI" = ( +/obj/effect/spawner/random/clothing/wardrobe_closet_colored, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "aOK" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -2614,6 +2908,12 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"aOL" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "aOQ" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 @@ -2631,28 +2931,16 @@ /turf/open/floor/plating, /area/station/maintenance/port/greater) "aPg" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/table, -/obj/item/megaphone/cargo{ - pixel_y = 3 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/qm) +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/structure/railing, +/turf/open/floor/iron, +/area/station/cargo/storage) "aPq" = ( /obj/structure/table/wood, /obj/item/gavelblock, /obj/item/gavelhammer, /turf/open/floor/wood, /area/station/security/courtroom) -"aPr" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "aPv" = ( /obj/structure/railing/corner{ dir = 8 @@ -2686,7 +2974,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/obj/machinery/newscaster/directional/south, /obj/machinery/light/directional/south, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain/private) @@ -2694,30 +2981,19 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"aQa" = ( -/obj/structure/lattice/catwalk, -/obj/structure/ladder, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) "aQc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/service/library/printer) -"aQj" = ( -/obj/effect/turf_decal/siding/brown{ - 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/start/hangover, -/obj/structure/disposalpipe/segment{ +"aQq" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/stripes/white/line{ dir = 4 }, /turf/open/floor/iron, -/area/station/commons/dorms) +/area/station/commons/fitness/recreation) "aQu" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -2738,20 +3014,11 @@ /obj/structure/table, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) -"aQL" = ( -/obj/structure/cable, -/obj/machinery/camera/autoname/directional/west, -/obj/structure/disposalpipe/segment, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) -"aQM" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/siding/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) +"aQO" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "aRa" = ( /obj/effect/turf_decal/trimline/red/corner{ dir = 1 @@ -2765,19 +3032,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"aRb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/science/server) -"aRg" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +"aRc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos/upper) "aRy" = ( /obj/structure/railing/corner/end/flip{ dir = 4 @@ -2787,27 +3045,32 @@ dir = 8 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"aRW" = ( -/obj/machinery/requests_console/directional/west, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"aSd" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/obj/machinery/shower/directional/east, -/obj/item/razor, -/turf/open/floor/iron/freezer, -/area/station/commons/dorms) +/area/station/ai/satellite/interior) +"aSc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ + dir = 8 + }, +/turf/open/floor/engine/airless, +/area/station/engineering/atmos/upper) +"aSg" = ( +/turf/closed/wall, +/area/station/command/heads_quarters/cmo) +"aSk" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "aSq" = ( /obj/structure/cable, /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) -"aSB" = ( -/turf/open/floor/engine/hull/air, -/area/station/engineering/break_room) "aSD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2821,7 +3084,9 @@ /obj/effect/turf_decal/trimline/red/filled/mid_joiner{ dir = 8 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 8 + }, /area/station/hallway/primary/central) "aSF" = ( /obj/structure/lattice/catwalk, @@ -2831,6 +3096,37 @@ }, /turf/open/openspace, /area/station/command/gateway) +"aSH" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/commons/toilet/restrooms) +"aSL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard) +"aSP" = ( +/obj/structure/rack, +/obj/item/clothing/ears/earmuffs, +/obj/item/clothing/under/color/red, +/obj/item/clothing/neck/tie/red{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/head/soft/red, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) +"aSU" = ( +/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/cargo/storage) "aSW" = ( /turf/closed/wall, /area/station/service/hydroponics/garden/abandoned) @@ -2839,7 +3135,7 @@ dir = 8 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "aSY" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -2880,11 +3176,14 @@ /obj/effect/mapping_helpers/airlock/access/any/science/xenobio, /turf/open/floor/iron/dark, /area/station/science/lobby) -"aTH" = ( -/obj/effect/spawner/random/structure/crate, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +"aTB" = ( +/obj/structure/lattice/catwalk, +/obj/item/toy/plush/lizard_plushie/green{ + name = "Hides-In-Rafters" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/turf/open/openspace, +/area/station/maintenance/aft/upper) "aTS" = ( /obj/structure/table, /obj/item/wrench{ @@ -2897,13 +3196,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"aTV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "aTW" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/effect/turf_decal/trimline/red/filled/warning{ @@ -2948,37 +3240,15 @@ }, /turf/open/floor/glass, /area/station/security/brig) -"aUD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/holopad, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/lobby) -"aUF" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/rack, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) "aUO" = ( /obj/structure/railing{ dir = 4 }, -/obj/effect/turf_decal/siding/wood{ +/obj/effect/turf_decal/stripes{ dir = 4 }, -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -3; - pixel_y = 8 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -3; - pixel_y = 2 - }, -/turf/open/floor/carpet, -/area/station/ai_monitored/command/storage/eva) +/turf/open/floor/iron/textured, +/area/station/command/eva) "aUU" = ( /obj/structure/closet/crate/freezer, /obj/item/food/grown/tomato, @@ -3042,21 +3312,17 @@ /area/station/maintenance/starboard/aft) "aVm" = ( /obj/structure/disposalpipe/segment{ - dir = 10 + dir = 9 }, /turf/open/floor/wood, /area/station/maintenance/starboard/central) "aVy" = ( /obj/structure/sign/directions/security/directional/north{ dir = 2; - pixel_y = 38 + pixel_y = 0 }, -/turf/open/openspace, +/turf/closed/wall/r_wall, /area/station/maintenance/port) -"aVD" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/engineering/lobby) "aVG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -3073,35 +3339,28 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"aVL" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk{ +"aVN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/corner{ dir = 4 }, -/obj/machinery/wall_healer/directional/north, -/obj/machinery/camera/autoname/directional/north{ - network = list("ss13","medbay"); - c_tag = "Medbay - Lobby" - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"aVN" = ( -/turf/closed/wall, -/area/station/command/teleporter) -"aVP" = ( -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/area/station/hallway/primary/central) +"aVQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "aVT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine/hull/air, /area/station/maintenance/port/fore) +"aVZ" = ( +/obj/structure/cable, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) "aWa" = ( /obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, /obj/structure/chair/sofa/left/brown{ @@ -3113,19 +3372,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"aWc" = ( -/obj/structure/lattice, -/obj/machinery/power/tracker, -/turf/open/space/basic, -/area/station/solars/starboard/fore) "aWk" = ( /obj/machinery/light/directional/west, -/obj/machinery/camera/autoname/directional/west{ - c_tag = "Medbay - Upper Chief Medical Office West"; - network = list("ss13","medbay") - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "aWm" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/security/lockers) @@ -3151,6 +3403,27 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"aWA" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "body"; + name = "body" + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"aWE" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/textured_large, +/area/station/medical/virology) "aWH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3160,29 +3433,32 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"aWN" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 +"aWM" = ( +/obj/effect/turf_decal/siding/dark/corner{ + dir = 8 }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"aWN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/railing/corner{ dir = 8 }, /obj/structure/cable, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, /turf/open/floor/iron, /area/station/cargo/storage) "aWP" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) -"aWT" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, +"aWU" = ( +/obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) +/area/station/engineering/supermatter/room/upper) "aWV" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain/private) @@ -3202,27 +3478,6 @@ /obj/effect/landmark/start/hangover, /turf/open/openspace, /area/station/hallway/secondary/exit/departure_lounge) -"aXn" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/showcase/horrific_experiment, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) -"aXH" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "aXN" = ( /obj/structure/rack, /obj/item/storage/box/lights/mixed, @@ -3238,8 +3493,16 @@ "aXW" = ( /obj/structure/lattice/catwalk, /obj/structure/ladder, +/obj/machinery/computer/security/telescreen/aiupload/directional/north, +/obj/structure/reagent_dispensers/wall/peppertank/directional/west, /turf/open/openspace, /area/station/security/checkpoint/customs) +"aXY" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft) "aXZ" = ( /obj/effect/turf_decal/tile/green/opposingcorners{ dir = 1 @@ -3247,36 +3510,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"aYk" = ( -/obj/structure/easel, -/obj/item/canvas/twentythree_twentythree{ - pixel_x = 3 - }, -/obj/item/canvas/twentythree_twentythree{ - pixel_x = 3 - }, -/obj/item/canvas/twentythree_twentythree{ - pixel_x = 3 - }, -/obj/effect/turf_decal/tile/green/opposingcorners{ - dir = 1 - }, -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark, -/area/station/commons/storage/art) "aYm" = ( -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/medbay/central) -"aYq" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/structure/fluff/paper/corner, -/obj/structure/fluff/paper/stack{ - dir = 9 +/obj/structure/cable, +/obj/effect/spawner/random/trash/cigbutt, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/chem_storage) "aYt" = ( /obj/machinery/light/directional/north, /obj/structure/railing{ @@ -3300,6 +3541,13 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/plating, /area/station/security/execution/education) +"aYF" = ( +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/obj/structure/closet/athletic_mixed, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "aYR" = ( /obj/item/kirbyplants/random, /obj/machinery/light/directional/south, @@ -3312,36 +3560,54 @@ }, /turf/open/floor/wood, /area/station/security/courtroom) +"aYU" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos) +"aZa" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "nay"; + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "aZd" = ( -/obj/effect/turf_decal/siding/green, /obj/effect/spawner/random/engineering/tracking_beacon, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, /mob/living/basic/bot/cleanbot/autopatrol, /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=6-Courtroom"; location = "5-Litterbox" }, -/turf/open/floor/iron/dark/smooth_large, +/obj/effect/turf_decal/tile/dark_green, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, /area/station/hallway/primary/central) "aZf" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/maintenance/port/aft) "aZo" = ( -/obj/effect/turf_decal/siding/wood, /obj/machinery/firealarm/directional/south, -/obj/structure/tank_holder/extinguisher, /obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/stripes, +/obj/structure/tank_dispenser/oxygen{ + pixel_x = -1; + pixel_y = 2 + }, +/turf/open/floor/iron/textured, +/area/station/command/eva) "aZs" = ( /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/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) +"aZy" = ( +/obj/effect/spawner/random/trash/grime, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "aZA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3367,25 +3633,18 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) -"aZP" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "viro-passthrough" +"aZG" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay-office"; + name = "Medbay Shutters"; + dir = 4 }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, -/area/station/maintenance/port) -"aZQ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/obj/machinery/air_sensor/incinerator_tank, -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer2{ - dir = 6 - }, -/turf/open/floor/engine/airless, -/area/station/maintenance/disposal/incinerator) +/area/station/medical/office) "aZT" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood, @@ -3397,17 +3656,34 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) -"bam" = ( -/obj/machinery/duct, -/obj/structure/cable, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) +"bab" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "ban" = ( /obj/structure/closet/lasertag/red, /obj/effect/decal/cleanable/dirt, /obj/item/clothing/under/color/red, /turf/open/floor/eighties/red, /area/station/maintenance/hallway/abandoned_recreation) +"bas" = ( +/obj/structure/lattice/catwalk, +/obj/structure/ladder, +/turf/open/openspace, +/area/station/medical/medbay/central) +"bau" = ( +/obj/item/radio/intercom/directional/north, +/obj/structure/closet/radiation, +/obj/item/clothing/glasses/meson, +/obj/machinery/firealarm/directional/west, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/smooth_corner, +/area/station/engineering/main) +"bav" = ( +/obj/effect/turf_decal/bot, +/obj/structure/sign/warning/fire/directional/east, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos) "baw" = ( /obj/structure/sink/directional/east, /obj/structure/mirror/directional/west, @@ -3416,26 +3692,32 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"bax" = ( +/obj/effect/decal/cleanable/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 10 + }, +/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 = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "baA" = ( /obj/machinery/light/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "baD" = ( /obj/structure/cable/layer3, /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/ai_monitored/turret_protected/aisat/foyer) -"baF" = ( -/obj/structure/reagent_dispensers/plumbed{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/ai/satellite/foyer) "baI" = ( /obj/structure/sign/warning/cold_temp/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -3449,6 +3731,12 @@ /obj/structure/ladder, /turf/open/openspace, /area/station/maintenance/port/fore) +"baY" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "bba" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/railing/corner{ @@ -3461,6 +3749,9 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/openspace, /area/station/hallway/primary/central) +"bbn" = ( +/turf/closed/wall, +/area/station/commons/dorms/laundry) "bbx" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -3474,15 +3765,6 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/security/eva) -"bbO" = ( -/obj/item/flashlight/flashdark{ - name = "Envy Flashlight" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "bbV" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/power/apc/auto_name/directional/west, @@ -3490,6 +3772,14 @@ /obj/effect/mapping_helpers/apc/unlocked, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"bbX" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/smooth_large, +/area/station/engineering/storage/tech) "bbY" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /obj/machinery/navbeacon{ @@ -3521,12 +3811,35 @@ /turf/open/floor/wood/large, /area/station/service/kitchen) "bcg" = ( -/obj/structure/disposalpipe/trunk/multiz/down{ - dir = 1 +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast-2"; + name = "Bridge Blast Door" }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge Access"; + id_tag = "innerbridge" + }, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/turf/open/floor/iron/dark, /area/station/command/bridge) +"bch" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance/three, +/obj/item/circuitboard/machine/cyborgrecharger, +/obj/structure/sign/poster/contraband/energy_swords/directional/north, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/department/crew_quarters/dorms) +"bci" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "cargocatwalkmaint" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "bcl" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -3535,7 +3848,7 @@ dir = 8 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "bcH" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/table/reinforced, @@ -3562,10 +3875,6 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) -"bcW" = ( -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/maintenance/starboard/lesser) "bda" = ( /obj/effect/spawner/random/structure/grille, /obj/effect/decal/cleanable/dirt, @@ -3579,11 +3888,14 @@ dir = 1 }, /area/station/science/ordnance/storage) -"bdh" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable/layer1, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +"bdf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/athletic_mixed, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "bdi" = ( /obj/machinery/light/directional/south, /obj/structure/rack, @@ -3591,7 +3903,16 @@ /obj/structure/cable, /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) +"bdn" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/medical/chemistry) +"bdq" = ( +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "bdw" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -3618,7 +3939,15 @@ }, /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/carpet/executive, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"bdM" = ( +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "SM_shutters"; + name = "Supermatter Radiation Shutters" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/supermatter) "bdT" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -3635,28 +3964,55 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/security/lockers) +"bdW" = ( +/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/light/small/dim/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/central) +"bdX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "bea" = ( /obj/structure/railing{ dir = 5 }, /turf/open/floor/engine/hull/air, /area/station/maintenance/port) -"beb" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron, -/area/station/commons/dorms) "bec" = ( /obj/machinery/door/airlock/command{ name = "Emergency Communication Console" }, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/access/any/command/general, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/hallway/secondary/entry) "beg" = ( /turf/closed/wall/r_wall, /area/station/security/prison/safe) +"ber" = ( +/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{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/catwalk_floor/iron, +/area/station/hallway/primary/central) +"bex" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "beF" = ( /obj/structure/table/wood/fancy, /obj/item/lead_pipe{ @@ -3672,25 +4028,33 @@ }, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"bfc" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/duct, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) +"beT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "bfh" = ( -/obj/structure/lattice/catwalk, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/suit_storage_unit/medical, -/turf/open/openspace, -/area/station/medical/storage) +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/shower/directional/east, +/obj/effect/turf_decal/siding/blue/end{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/floor/iron/showroomfloor, +/area/station/medical/chemistry) "bfj" = ( /obj/structure/broken_flooring/corner/directional/south, /obj/structure/sign/poster/official/safety_internals/directional/north, /turf/open/floor/plating, /area/station/maintenance/department/medical) +"bfl" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/ferny/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/station/commons/dorms) "bfo" = ( /obj/item/storage/backpack{ pixel_x = 5; @@ -3699,13 +4063,10 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "bfq" = ( +/obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 + dir = 1 }, -/obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) "bfw" = ( @@ -3718,34 +4079,76 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/security/interrogation) +"bfC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) +"bfH" = ( +/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/starboard/upper) "bfN" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, -/obj/structure/table, -/obj/item/clothing/gloves/cargo_gauntlet{ - pixel_y = 3 - }, -/obj/item/clothing/gloves/cargo_gauntlet{ - pixel_y = 3 - }, -/obj/item/clothing/gloves/cargo_gauntlet{ - pixel_y = 3 - }, -/obj/machinery/newscaster/directional/north, +/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/status_display/ai/directional/west, /turf/open/floor/iron, /area/station/cargo/storage) -"bgm" = ( -/obj/structure/stairs/south, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"bgA" = ( -/obj/machinery/suit_storage_unit{ - storage_type = /obj/item/clothing/shoes/magboots +"bfQ" = ( +/obj/structure/closet/wardrobe/miner, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"bfY" = ( +/obj/structure/cable, +/obj/machinery/holopad, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"bge" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos) +"bgs" = ( +/obj/item/paper_bin{ + pixel_x = 5; + pixel_y = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/table, +/obj/item/pen{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/stamp/granted{ + pixel_x = -7; + pixel_y = 2 + }, +/turf/open/floor/wood/large, +/area/station/service/library/private) +"bgx" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "bgB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -3765,9 +4168,14 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 }, -/obj/machinery/vending/assist, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, +/obj/structure/table/reinforced, +/obj/machinery/button/door/directional/west{ + id = "Lcommissaryshutter"; + name = "Left Shutter Control"; + pixel_x = 0 + }, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) "bhc" = ( @@ -3784,22 +4192,41 @@ /obj/machinery/telecomms/hub/preset, /turf/open/floor/iron/dark, /area/station/tcommsat/server) +"bhn" = ( +/obj/machinery/air_sensor/carbon_tank, +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos/upper) "bht" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"bhy" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/scrubber, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos) "bhJ" = ( /obj/structure/easel, /turf/open/floor/plating, /area/station/maintenance/disposal) -"bhN" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" +"bhM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 }, -/obj/effect/spawner/random/maintenance, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"bhN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"bhQ" = ( +/obj/structure/cable/multilayer/multiz, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/station/solars/starboard/fore) "bhU" = ( /obj/machinery/igniter/incinerator_ordmix, /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ @@ -3808,19 +4235,17 @@ /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) "bic" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/hallway/secondary/command) +/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/edge, +/area/station/hallway/primary/central) "bie" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/service/chapel/office) -"bij" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) "bio" = ( /obj/effect/turf_decal/arrows/white{ color = "#F7F707"; @@ -3828,11 +4253,6 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) -"bit" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/textured_large, -/area/station/medical/abandoned) "bix" = ( /obj/machinery/camera/autoname/directional/east, /turf/open/floor/engine, @@ -3851,6 +4271,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"biI" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) +"biO" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/office) "biP" = ( /obj/structure/railing{ dir = 8 @@ -3896,7 +4326,7 @@ name = "Armory Shutters" }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "biZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3911,15 +4341,30 @@ "bjq" = ( /turf/open/floor/plating, /area/station/maintenance/department/science/central) +"bjr" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "bjD" = ( /obj/effect/spawner/random/maintenance, /obj/structure/rack, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"bjH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 1 + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/engine_smes) "bjK" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "bkc" = ( /obj/machinery/light/warm/directional/west, /obj/machinery/computer/mech_bay_power_console{ @@ -3946,7 +4391,24 @@ /obj/structure/rack, /obj/effect/spawner/random/armory/dragnet, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) +"bkk" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) +"bkr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark/textured_large, +/area/station/commons/dorms) "bkt" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner, @@ -3962,14 +4424,18 @@ /turf/open/floor/wood, /area/station/security/courtroom) "bkv" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/railing{ + dir = 5 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +/obj/structure/rack, +/obj/item/pipe_dispenser{ + pixel_y = 8 }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) +/obj/item/clothing/glasses/meson/engine{ + pixel_y = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "bkA" = ( /obj/effect/turf_decal/delivery, /obj/effect/spawner/random/entertainment/arcade{ @@ -3977,6 +4443,14 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) +"bkC" = ( +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4{ + dir = 1; + name = "Airlock Supply Pump"; + target_pressure = 300 + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "bkD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -3984,8 +4458,9 @@ }, /obj/effect/landmark/blobstart, /obj/machinery/light/floor, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/effect/decal/cleanable/greenglow, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "bkO" = ( /obj/structure/sign/clock/directional/east, /obj/effect/decal/cleanable/dirt/dust, @@ -3995,13 +4470,13 @@ }, /turf/open/floor/iron/small, /area/station/security/mechbay) -"blh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/trunk/multiz{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) +"blm" = ( +/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/catwalk_floor, +/area/station/cargo/storage) "bln" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -4015,13 +4490,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) -"blq" = ( -/obj/effect/decal/cleanable/glitter, -/obj/effect/decal/cleanable/blood/oil, -/obj/effect/spawner/random/maintenance/two, -/obj/structure/rack, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"bly" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "blz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4063,7 +4540,6 @@ /obj/item/stack/sheet/glass/fifty, /obj/item/stack/sheet/glass/fifty, /obj/item/stack/sheet/glass/fifty, -/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/disposalpipe/segment{ dir = 6 }, @@ -4075,6 +4551,14 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron, /area/station/construction/storage_wing) +"blF" = ( +/turf/closed/wall, +/area/station/maintenance/starboard/aft/upper) +"blI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/iron/dark/smooth_large, +/area/station/engineering/storage) "blJ" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/stripes/line{ @@ -4083,12 +4567,13 @@ /obj/effect/turf_decal/trimline/green/filled/corner, /turf/open/floor/iron/textured_large, /area/station/medical/virology) -"bmc" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"blW" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) "bmg" = ( /obj/effect/turf_decal/trimline/dark_blue/line{ dir = 4 @@ -4106,7 +4591,12 @@ pixel_y = 4 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"bmw" = ( +/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) "bmx" = ( /obj/structure/transport/linear/public, /turf/open/openspace, @@ -4121,11 +4611,12 @@ /obj/effect/mapping_helpers/mail_sorting/service/bar, /obj/effect/mapping_helpers/mail_sorting/service/theater, /obj/structure/cable, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "bmH" = ( /obj/machinery/barsign{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -4141,10 +4632,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/security/courtroom) -"bmO" = ( -/obj/structure/closet/radiation, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +"bmK" = ( +/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/cable, +/turf/open/floor/iron, +/area/station/engineering/lobby) "bmP" = ( /obj/structure/railing{ dir = 8 @@ -4160,10 +4654,6 @@ }, /turf/open/floor/iron, /area/station/science/explab) -"bmQ" = ( -/obj/structure/musician/piano, -/turf/open/floor/plating, -/area/station/maintenance/port) "bmS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4173,6 +4663,13 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"bnh" = ( +/obj/effect/spawner/random/trash/graffiti{ + pixel_y = 32 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "bnl" = ( /obj/effect/turf_decal/tile/dark/anticorner/contrasted{ dir = 8 @@ -4202,30 +4699,60 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 1 }, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "bnW" = ( /obj/structure/cable, /obj/machinery/door/airlock/engineering, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"boh" = ( -/obj/item/radio/intercom/directional/east, -/obj/structure/lattice/catwalk, -/turf/open/floor/engine/hull/air, -/area/station/engineering/break_room) "boj" = ( /obj/structure/reagent_dispensers/watertank, /obj/machinery/light_switch/directional/east, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) +"bop" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 1; + pixel_y = -2 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "boq" = ( /obj/item/toy/snappop, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"bor" = ( +/obj/structure/safe/floor{ + name = "Critical Supplies Safe" + }, +/obj/item/reagent_containers/cup/glass/bottle/wine_voltaic{ + pixel_y = 5; + pixel_x = 7 + }, +/obj/item/reagent_containers/cup/glass/shaker{ + pixel_y = 6; + pixel_x = -6 + }, +/obj/item/reagent_containers/cup/glass/bottle/vodka{ + pixel_y = 15; + pixel_x = 6 + }, +/obj/item/reagent_containers/cup/glass/bottle/juice/orangejuice{ + pixel_x = -5; + pixel_y = 15 + }, +/obj/item/reagent_containers/cup/glass/flask{ + pixel_x = -6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "bot" = ( /obj/structure/lattice/catwalk, /obj/structure/ladder, @@ -4237,10 +4764,34 @@ /obj/structure/grille, /turf/open/floor/engine/hull, /area/space/nearstation) +"boz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/departments/chemistry/directional/south, +/turf/open/floor/engine/hull/air, +/area/station/medical/medbay/central) +"boF" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/item/clothing/under/costume/seifuku/teal{ + pixel_x = -1; + pixel_y = -9 + }, +/obj/structure/table, +/obj/item/storage/fancy/cigarettes/cigpack_midori{ + pixel_x = 8; + pixel_y = 12 + }, +/obj/item/instrument/piano_synth/headphones{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/structure/sign/poster/contraband/syndicate_pistol/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "boP" = ( /obj/item/chair, +/obj/machinery/light/small/red/dim/directional/south, /turf/open/floor/iron/textured_large, -/area/space/nearstation) +/area/station/medical/abandoned) "boS" = ( /obj/structure/rack, /obj/item/gun/energy/laser/redtag, @@ -4258,6 +4809,25 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port) +"boY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/office) +"bpf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper{ + dir = 8 + }, +/obj/item/paper/crumpled{ + pixel_x = 2; + pixel_y = 6 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "bpl" = ( /obj/structure/railing{ dir = 8 @@ -4304,31 +4874,20 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"bpB" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "bpK" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/hos) "bpU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/showcase/machinery/cloning_pod{ - desc = "An old prototype cloning pod, permanently decommissioned following the incident."; - name = "decommissioned cloner" +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/wood/large, +/area/station/medical/break_room) +"bqd" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 }, -/obj/effect/decal/cleanable/greenglow, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"bpZ" = ( -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/light_switch/directional/east, -/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "bqk" = ( /obj/effect/turf_decal/siding/dark/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4336,7 +4895,7 @@ /turf/open/floor/iron/dark/textured_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bqm" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4353,26 +4912,15 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) -"bqv" = ( -/obj/effect/turf_decal/siding, -/obj/effect/turf_decal/trimline/white/line{ - dir = 8; - pixel_x = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/obj/structure/disposalpipe/segment{ - dir = 4 +"bqO" = ( +/obj/structure/chair/office{ + dir = 1 }, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) -"bqA" = ( -/obj/effect/turf_decal/siding/brown, -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/artistic, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/obj/structure/lattice/catwalk, +/obj/effect/landmark/start/depsec/supply, +/obj/effect/landmark/event_spawn, +/turf/open/openspace, +/area/station/security/checkpoint/supply) "bqR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4382,14 +4930,11 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) -"bqS" = ( -/obj/machinery/light_switch/directional/east, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, +"bqU" = ( +/obj/machinery/computer/security/telescreen/minisat/directional/west, +/obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) +/area/station/engineering/transit_tube) "bqV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4408,6 +4953,23 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) +"brb" = ( +/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/starboard) +"brf" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"brh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/engineering/tank, +/turf/open/floor/iron, +/area/station/maintenance/starboard/central) "brm" = ( /obj/effect/turf_decal/stripes/red/line, /obj/effect/turf_decal/stripes/red/line{ @@ -4422,6 +4984,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) +"brz" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/item/clothing/mask/joy, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/aft/upper) "brP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/north, @@ -4432,11 +4999,6 @@ /obj/machinery/vending/cigarette, /turf/open/openspace, /area/station/construction/storage_wing) -"bsa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/fore) "bsc" = ( /obj/effect/spawner/random/trash/graffiti, /obj/effect/spawner/random/trash/box, @@ -4459,17 +5021,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/white/smooth_edge, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "bsx" = ( /obj/machinery/porta_turret/ai{ dir = 4 }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "bsy" = ( /obj/effect/decal/cleanable/crayon/rune2, /turf/open/floor/plating, /area/station/maintenance/port) +"bsC" = ( +/obj/structure/chair/sofa/right/brown, +/obj/item/pillow, +/obj/item/toy/plush/moth{ + name = "Mender Moff" + }, +/obj/structure/sign/poster/official/get_your_legs/directional/north, +/turf/open/floor/carpet/black, +/area/station/medical/psychology) "bsE" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -4478,35 +5049,23 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/medical/abandoned) -"bsH" = ( -/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 = 2 - }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "bsK" = ( -/obj/structure/table, -/obj/item/folder/white{ - pixel_x = 6 - }, -/obj/item/paper_bin{ - pixel_x = 6; - pixel_y = 12 +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 }, -/obj/item/pen{ - pixel_x = 6; - pixel_y = 12 +/obj/structure/table, +/obj/item/stack/rods{ + amount = 25; + pixel_x = 2 }, -/obj/machinery/reagentgrinder{ - pixel_x = -8; - pixel_y = 8 +/obj/item/stack/rods{ + amount = 25; + pixel_y = 4 }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 +/obj/item/stack/sheet/iron/fifty{ + pixel_x = 5 }, +/obj/item/stack/sheet/iron/fifty, /turf/open/floor/iron/dark, /area/station/medical/chemistry) "bsW" = ( @@ -4521,21 +5080,13 @@ }, /turf/open/floor/iron/checker, /area/station/service/bar) -"btb" = ( -/obj/machinery/roulette, -/turf/open/floor/engine, -/area/station/engineering/break_room) "btc" = ( /obj/item/paper_bin/carbon, /obj/structure/closet, /obj/item/hand_labeler, /obj/item/hand_labeler_refill, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/station/maintenance/port/aft) -"btj" = ( -/obj/machinery/vending/donksnack, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "btv" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -4576,47 +5127,82 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"btJ" = ( -/obj/structure/chair/sofa/corp, -/obj/item/clothing/head/soft/blue, -/obj/machinery/camera/autoname/directional/north{ - network = list("ss13","medbay"); - c_tag = "Medbay - Lower Break Room" +"btU" = ( +/obj/item/bouquet/sunflower{ + pixel_y = 4 }, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) +/obj/structure/table/reinforced, +/obj/structure/sign/poster/contraband/atmosia_independence/directional/north{ + desc = "Welcome."; + name = "Welcome." + }, +/obj/item/clothing/glasses/orange{ + pixel_y = 5 + }, +/turf/open/floor/iron/vaporwave, +/area/station/maintenance/starboard/aft/upper) +"btV" = ( +/obj/machinery/door/poddoor/preopen{ + id = "cmoprivacy"; + name = "Privacy Shutter" + }, +/obj/structure/cable, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) +"buc" = ( +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "buh" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine/hull/air, -/area/station/medical/chemistry) +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/suit_storage_unit/cmo, +/turf/open/floor/carpet/cyan, +/area/station/command/heads_quarters/cmo) "buk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white/textured, -/area/station/medical/surgery) -"buu" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/blue{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"bun" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"bup" = ( /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 = 10 +/obj/effect/decal/cleanable/crayon{ + icon_state = "nay"; + pixel_y = 32 }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) +"but" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/button/door/directional/east{ + id = "Cabin6"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "buA" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 +/obj/structure/disposalpipe/segment, +/obj/structure/table, +/obj/item/megaphone/cargo{ + pixel_y = 3 }, -/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/miningoffice) -"buP" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/light_switch/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "buZ" = ( /obj/machinery/door/airlock/security/glass{ id_tag = "outerbrig"; @@ -4643,9 +5229,12 @@ /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) "bvv" = ( -/obj/structure/cable, /obj/effect/landmark/event_spawn, -/turf/open/floor/iron/dark, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/holopad, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, /area/station/command/gateway) "bvz" = ( /obj/effect/decal/cleanable/dirt, @@ -4654,6 +5243,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"bvE" = ( +/obj/effect/spawner/random/trash/botanical_waste, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/aft/upper) "bvG" = ( /obj/item/toy/snappop, /obj/structure/cable, @@ -4663,18 +5256,16 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "bvH" = ( -/obj/item/airlock_painter/decal, -/obj/item/poster/random_official, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/table/reinforced, +/obj/item/surgery_tray/full/morgue{ + pixel_x = 7 }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"bvI" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/morgue) +"bvJ" = ( +/turf/open/floor/iron/freezer, +/area/station/commons/dorms) "bvN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4703,8 +5294,11 @@ /area/station/science/research) "bvY" = ( /obj/machinery/wall_healer/directional/north, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/stripes{ + dir = 9 + }, +/turf/open/floor/iron/textured, +/area/station/command/eva) "bvZ" = ( /obj/structure/railing{ dir = 8 @@ -4712,25 +5306,34 @@ /obj/machinery/door/firedoor/border_only{ dir = 8 }, -/obj/structure/cable, /turf/open/floor/wood, /area/station/commons/toilet/restrooms) -"bwd" = ( -/obj/structure/disposalpipe/segment, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) "bwg" = ( -/obj/structure/bed, -/obj/item/bedsheet/hop, /obj/structure/secure_safe/directional/south, /obj/machinery/airalarm/directional/east, /obj/effect/landmark/start/head_of_personnel, -/turf/open/floor/carpet, +/obj/structure/bed/double, +/obj/item/bedsheet/hop/double, +/turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) "bwi" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/hallway/primary/port) +"bwv" = ( +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/machinery/door/airlock/security/glass{ + name = "Security Post - Cargo" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/red/opposingcorners{ + 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/station/security/checkpoint/supply) "bwx" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -4738,6 +5341,18 @@ }, /turf/open/floor/engine/hull/air, /area/station/hallway/secondary/exit/departure_lounge) +"bwB" = ( +/obj/machinery/door/poddoor/preopen{ + id = "cmoprivacy"; + name = "Privacy Shutter" + }, +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) "bwH" = ( /turf/closed/wall/r_wall, /area/station/security/lockers) @@ -4753,18 +5368,42 @@ /turf/open/floor/circuit/telecomms, /area/station/science/xenobiology) "bxa" = ( -/obj/effect/turf_decal/siding/blue/corner{ +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay-office"; + name = "Medbay Shutters"; dir = 1 }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/right/directional/north{ + req_access = list("medical"); + name = "Medbay Reception" + }, +/obj/item/folder/white, +/obj/item/folder/blue{ + pixel_y = 3; + pixel_x = -4 + }, +/obj/item/pen, /turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/area/station/medical/office) "bxd" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos/hfr_room) -"bxl" = ( -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron, -/area/station/commons/storage/primary) +"bxg" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/medical) +"bxv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/station/maintenance/aft) "bxx" = ( /turf/open/floor/engine/n2o, /area/station/engineering/atmos/upper) @@ -4830,8 +5469,17 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "bxZ" = ( -/turf/open/floor/glass, -/area/station/maintenance/port) +/obj/structure/cable, +/obj/effect/turf_decal/weather/snow, +/obj/structure/plasticflaps/kitchen, +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/surgery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/medical/coldroom) "byf" = ( /turf/open/floor/engine/hull/air, /area/station/construction/storage_wing) @@ -4845,14 +5493,6 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"byA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/hfr_room) "byC" = ( /obj/machinery/button/door/directional/east{ id = "Prison Gate"; @@ -4862,34 +5502,16 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) "byE" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Abandoned Hallway" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction) -"byJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/mask/breath, -/obj/machinery/light/small/directional/east, -/obj/structure/table/reinforced, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/obj/structure/lattice/catwalk, +/obj/machinery/vending/games, +/turf/open/openspace, +/area/station/cargo/storage) "byR" = ( -/obj/machinery/door/airlock/command{ - name = "Council Chamber" +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + 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/mapping_helpers/airlock/access/all/command/general, -/obj/machinery/door/firedoor, -/turf/open/floor/carpet, -/area/station/command/bridge) +/turf/open/floor/iron/edge, +/area/station/hallway/primary/central) "byU" = ( /obj/structure/railing{ dir = 4 @@ -4902,9 +5524,29 @@ /obj/machinery/computer/mech_bay_power_console, /turf/open/floor/iron/smooth, /area/station/science/robotics) +"byW" = ( +/obj/structure/cable, +/obj/effect/landmark/start/hangover, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "byY" = ( /turf/open/floor/wood, /area/station/hallway/primary/central) +"bzd" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port) "bzk" = ( /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark, @@ -4940,27 +5582,29 @@ /area/station/maintenance/central) "bzS" = ( /obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 +/obj/machinery/recharger{ + pixel_x = -6; + pixel_y = 4 }, -/obj/item/disk/nuclear{ - pixel_x = 1; - pixel_y = -2 +/obj/item/reagent_containers/cup/glass/flask/gold{ + pixel_x = 5 }, -/obj/item/pen/fourcolor{ - pixel_x = -15; - pixel_y = 1 +/obj/item/toy/figure/captain{ + pixel_x = 7; + pixel_y = 10 }, -/obj/machinery/newscaster/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) "bzV" = ( /obj/structure/lattice/catwalk, /obj/effect/spawner/random/maintenance, /turf/open/openspace, /area/station/hallway/primary/central) +"bAf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "bAh" = ( /obj/machinery/door/airlock/hatch{ name = "MiniSat Foyer" @@ -4971,7 +5615,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) +"bAo" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/chair/office/light{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "bAq" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/machinery/computer/shuttle/mining{ @@ -5010,6 +5661,16 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/openspace, /area/station/science/xenobiology) +"bAS" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/landmark/start/station_engineer, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/engineering/lobby) "bAW" = ( /turf/open/floor/iron, /area/station/engineering/lobby) @@ -5031,12 +5692,14 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) -"bBu" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/cable, -/obj/machinery/light_switch/directional/north, +"bBq" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/obj/effect/turf_decal/siding/yellow, /turf/open/floor/iron, -/area/station/engineering/main) +/area/station/engineering/atmos/upper) "bBv" = ( /obj/effect/turf_decal/box/corners{ dir = 1 @@ -5053,12 +5716,6 @@ dir = 1 }, /area/station/science/robotics) -"bBy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/textured_large, -/area/station/medical/virology) "bBB" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/shrink_ccw{ dir = 1 @@ -5068,26 +5725,45 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_half, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "bBK" = ( -/obj/effect/landmark/observer_start, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 1 }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) +"bBL" = ( +/obj/structure/table/wood, +/obj/item/clothing/under/misc/burial, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "bBV" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/openspace, /area/station/science/explab) -"bCa" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) +"bBZ" = ( +/obj/machinery/button/flasher{ + id = "hopflash"; + pixel_x = -24; + pixel_y = -4; + dir = 8 + }, +/obj/machinery/button/door/directional/west{ + id = "hop"; + name = "Lockdown Blast Doors"; + pixel_y = 6; + req_access = list("hop") + }, +/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/information, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/machinery/modular_computer/preset/id, +/turf/open/floor/wood/tile, +/area/station/command/heads_quarters/hop) "bCb" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 8; @@ -5121,21 +5797,31 @@ }, /turf/open/floor/iron/checker, /area/station/service/janitor) +"bCr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "bCv" = ( /obj/structure/railing{ dir = 4 }, -/obj/effect/turf_decal/siding/red{ +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/structure/table, -/obj/item/radio/intercom/directional/west{ - pixel_x = -1 - }, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 +/obj/item/pen{ + pixel_y = 9; + pixel_x = -4 }, -/turf/open/floor/iron/dark, +/turf/open/floor/wood/large, /area/station/hallway/primary/central) "bCx" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -5146,51 +5832,33 @@ /turf/open/floor/iron, /area/station/hallway/secondary/construction) "bCC" = ( -/obj/machinery/suit_storage_unit/captain, /obj/machinery/status_display/evac/directional/north, -/turf/open/floor/wood, +/obj/structure/table/wood, +/obj/machinery/fax{ + fax_name = "Captain's Office"; + name = "Captain's Fax Machine" + }, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) "bCD" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, /obj/structure/sign/directions/command{ - dir = 8; - pixel_y = 38 - }, -/obj/structure/sign/directions/medical/directional/north{ - dir = 8 - }, -/obj/structure/sign/directions/evac/directional/north{ - dir = 8; - pixel_y = 26 + dir = 1; + pixel_y = 10 }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"bCP" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 +/obj/structure/sign/directions/dorms{ + dir = 1; + pixel_y = 4 }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 +/obj/structure/sign/directions/medical{ + dir = 1; + pixel_y = -2 }, -/turf/open/floor/iron, -/area/station/engineering/lobby) -"bDm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/welded, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/plating, -/area/station/maintenance/port) -"bDn" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "N2 to Port" +/obj/structure/sign/directions/evac{ + dir = 1; + pixel_y = -8 }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) +/turf/closed/wall, +/area/station/science/lab) "bDq" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -5218,32 +5886,33 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron, /area/station/science/breakroom) -"bDQ" = ( -/obj/machinery/disposal/bin, -/obj/machinery/light/directional/east, -/obj/machinery/newscaster/directional/east, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/wood, -/area/station/commons/dorms) +"bDz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "bDS" = ( /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"bDZ" = ( -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) +/area/station/ai/satellite/foyer) +"bEi" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "bEp" = ( /obj/machinery/firealarm/directional/south, /turf/open/floor/plating, /area/station/engineering/storage_shared) "bEr" = ( -/obj/structure/table/wood, -/obj/item/toy/cards/deck{ - pixel_y = 4 - }, -/obj/item/trash/can{ - pixel_x = -10; - pixel_y = -14 +/obj/structure/railing, +/obj/machinery/conveyor_switch/oneway{ + dir = 1; + id = "mining"; + pixel_y = 10 }, /turf/open/floor/iron/textured, /area/station/cargo/storage) @@ -5257,6 +5926,12 @@ }, /turf/open/floor/iron, /area/station/science/lab) +"bEA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/commons/dorms) "bEB" = ( /obj/machinery/computer/mecha{ dir = 8 @@ -5264,6 +5939,13 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/security/checkpoint/science) +"bEH" = ( +/obj/effect/turf_decal/trimline/brown/filled/end{ + dir = 1 + }, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "bEI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5271,41 +5953,33 @@ /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) "bEJ" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ +/obj/item/cigbutt, +/obj/effect/turf_decal/bot_white, +/obj/effect/spawner/random/structure/crate, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron/dark/textured_large, +/area/station/cargo/storage) +"bEP" = ( +/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, +/area/station/maintenance/starboard/central/upper) +"bEU" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light_switch/directional/south, +/obj/machinery/computer/operating{ dir = 4 }, -/obj/machinery/wall_healer/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"bEK" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ +/turf/open/floor/iron/dark/textured_corner{ dir = 4 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) -"bES" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"bEU" = ( -/obj/structure/closet/crate/trashcart/filled, -/obj/structure/disposalpipe/trunk/multiz{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) +/area/station/medical/surgery) +"bEV" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/wood, +/area/station/commons/dorms) "bFb" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -5318,15 +5992,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/large, /area/station/hallway/primary/central) -"bFc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) "bFe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5336,6 +6001,18 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) +"bFl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/dorms) +"bFm" = ( +/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/structure/cable, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/station/engineering/lobby) "bFn" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/air_input, /turf/open/floor/engine/air, @@ -5346,6 +6023,31 @@ /obj/item/surgical_drapes, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/port) +"bFx" = ( +/obj/structure/table, +/obj/item/storage/toolbox/artistic{ + pixel_x = -1; + pixel_y = 12 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = -7 + }, +/obj/item/stamp/granted{ + pixel_x = 7; + pixel_y = -1 + }, +/obj/item/stamp/denied{ + pixel_x = 8; + pixel_y = -7 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/wood, +/area/station/service/library/printer) "bFI" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt/dust, @@ -5364,6 +6066,12 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/station/security/brig) +"bFW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "bGa" = ( /obj/structure/railing{ dir = 4 @@ -5371,6 +6079,10 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/science/xenobiology) +"bGe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "bGh" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/green/filled/mid_joiner, @@ -5393,14 +6105,22 @@ /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/plating, /area/station/construction/storage_wing) -"bGs" = ( -/obj/item/biopsy_tool{ - pixel_x = -9; - pixel_y = 2 +"bGv" = ( +/obj/structure/closet/crate, +/obj/item/gps, +/obj/item/assembly/timer, +/obj/item/gps, +/obj/item/assembly/signaler, +/obj/item/analyzer{ + pixel_x = 7; + pixel_y = 3 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/station/maintenance/starboard/lesser) +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "bGF" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt, @@ -5421,16 +6141,6 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/art) -"bGR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 6 - }, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) "bGX" = ( /obj/effect/turf_decal/arrows/white{ dir = 4 @@ -5461,31 +6171,18 @@ dir = 1 }, /area/station/service/chapel) -"bHa" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Primary Tool Storage" - }, -/obj/effect/landmark/navigate_destination/tools, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "bHb" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/security_space_law{ pixel_y = 6 }, /obj/structure/lattice/catwalk, +/obj/machinery/camera/directional/south{ + c_tag = "Cargo Bay - Security Post (High)"; + pixel_x = 14 + }, /turf/open/openspace, /area/station/security/checkpoint/supply) -"bHj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "bHn" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 4 @@ -5503,7 +6200,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bHr" = ( /obj/machinery/atmospherics/pipe/smart/manifold/supply/visible, /obj/machinery/computer/security/telescreen/isolation/directional/west{ @@ -5516,46 +6213,43 @@ /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) "bHC" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ +/turf/open/floor/iron/stairs{ dir = 1 }, -/obj/machinery/computer/atmos_control/oxygen_tank, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/area/station/maintenance/starboard) "bHG" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/storage_shared) -"bHM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/space/nearstation) +"bHJ" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) +"bHL" = ( +/obj/structure/sign/poster/contraband/communist_state/directional/south, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/starboard/central/upper) "bHN" = ( /obj/structure/railing{ dir = 4 }, /turf/open/floor/engine/hull/air, /area/station/maintenance/port) -"bHO" = ( -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/lesser) "bHV" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ +/turf/closed/wall, +/area/station/medical/medbay/lobby) +"bIf" = ( +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ dir = 4 }, -/obj/item/stack/medical/mesh{ - pixel_y = 4 - }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/obj/item/kirbyplants/random, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "bIi" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/wood, @@ -5565,12 +6259,25 @@ /obj/machinery/light/floor, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) -"bIp" = ( -/obj/structure/dresser, +"bIm" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/computer/turbine_computer, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) +"bIp" = ( /obj/machinery/status_display/ai/directional/north, /obj/machinery/airalarm/directional/east, -/turf/open/floor/wood, +/obj/structure/dresser, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) +"bIq" = ( +/obj/machinery/suit_storage_unit{ + storage_type = /obj/item/clothing/shoes/magboots + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "bIF" = ( /obj/machinery/atmospherics/components/binary/pump/layer4, /obj/item/storage/box/matches{ @@ -5621,38 +6328,18 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/warden) -"bIP" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 10 - }, -/obj/structure/rack, -/obj/item/book/manual/wiki/engineering_guide{ - pixel_x = -2 - }, -/obj/item/book/manual/wiki/engineering_construction{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/item/book/manual/wiki/engineering_hacking{ - pixel_x = 2; - pixel_y = 3 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) -"bIS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"bIX" = ( /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 5 }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/turf/closed/wall, +/area/station/maintenance/aft) "bIZ" = ( -/obj/structure/closet/secure_closet/security/med, -/obj/item/book/manual/wiki/security_space_law, /obj/structure/reagent_dispensers/wall/peppertank/directional/east, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, +/obj/effect/landmark/start/depsec/medical, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) "bJj" = ( @@ -5672,22 +6359,15 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) -"bJs" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/commons/dorms) +"bJo" = ( +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/upper) "bJt" = ( /obj/structure/chair{ dir = 8 }, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"bJB" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "bJJ" = ( /obj/machinery/vending/cigarette, /obj/structure/disposalpipe/segment{ @@ -5702,19 +6382,6 @@ /obj/structure/stairs/north, /turf/open/floor/wood, /area/station/security/courtroom) -"bKb" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/engineering/lobby) "bKd" = ( /obj/effect/turf_decal/siding/dark{ dir = 5 @@ -5723,15 +6390,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"bKh" = ( -/obj/structure/table/glass, -/obj/item/flashlight/flare/candle{ - pixel_x = 9; - pixel_y = 4 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/interior) "bKj" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -5747,11 +6406,11 @@ /obj/structure/chair/office{ dir = 8 }, -/obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, /obj/effect/landmark/start/depsec/supply, +/obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) "bKt" = ( @@ -5769,13 +6428,26 @@ }, /obj/structure/plasticflaps/kitchen, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/satellite) -"bKC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb, +/area/station/ai/satellite/maintenance/storage) +"bKw" = ( +/obj/machinery/light/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing/corner{ + dir = 4 + }, /obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/main) +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) +"bKI" = ( +/obj/machinery/vending/autodrobe, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "bKK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5800,44 +6472,38 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) -"bLf" = ( -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/ferny/style_random, -/mob/living/basic/pet/cat/space{ - name = "Tomas" - }, -/turf/open/floor/grass, -/area/station/maintenance/starboard/fore) "bLh" = ( /obj/effect/landmark/start/scientist, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) +"bLm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"bLp" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "space-outpost" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "bLu" = ( /obj/machinery/light/directional/east, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"bLx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "bLE" = ( /obj/effect/landmark/firealarm_sanity, /turf/open/floor/engine/hull/air, /area/station/hallway/primary/aft) -"bLG" = ( -/obj/structure/table, -/obj/item/petri_dish{ - pixel_x = 4; - pixel_y = 7 - }, -/obj/item/petri_dish, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) -"bLK" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) "bLL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, @@ -5848,13 +6514,19 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"bLP" = ( +/obj/effect/turf_decal/trimline/yellow/filled, +/obj/item/kirbyplants/random/fullysynthetic, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "bMa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/dim/directional/east, /obj/machinery/button/crematorium{ id = "crematoriumChapel"; - pixel_x = 26 + pixel_x = 26; + dir = 4 }, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark, @@ -5867,15 +6539,12 @@ /turf/open/floor/plating, /area/station/security/prison/shower) "bMd" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/railing{ +/obj/structure/ladder, +/obj/effect/turf_decal/stripes{ dir = 4 }, -/obj/structure/ladder, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/turf/open/floor/iron/textured, +/area/station/command/eva) "bMe" = ( /obj/machinery/door/airlock/external{ name = "Arrival Airlock" @@ -5892,11 +6561,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"bMh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) "bMi" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -5908,25 +6572,32 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"bMq" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) "bMw" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 }, /turf/open/floor/iron/dark, /area/station/security/office) -"bMD" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ +"bMx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/upper) +"bMR" = ( +/obj/machinery/power/emitter{ dir = 4 }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/catwalk_floor, -/area/station/engineering/lobby) +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) +"bNe" = ( +/obj/structure/chair/stool/directional/east, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "bNk" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 8 @@ -5936,49 +6607,59 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"bNl" = ( +/obj/vehicle/ridden/wheelchair, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "bNt" = ( /turf/closed/wall, /area/station/maintenance/port/greater) -"bNu" = ( -/obj/structure/table, -/obj/item/hand_labeler{ - pixel_y = 7 - }, -/obj/item/camera_film{ - pixel_y = 3 - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/green/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/commons/storage/art) -"bNC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "bNH" = ( /obj/machinery/power/shieldwallgen, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/structure/cable, /obj/machinery/firealarm/directional/east, /turf/open/floor/wood, /area/station/command/teleporter) +"bNO" = ( +/obj/machinery/camera/autoname/directional/west, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "bNX" = ( /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"bNY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"bOa" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + filter_type = list(/datum/gas/nitrogen) + }, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"bOb" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "commissaryshutter"; + name = "Vacant Commissary Shutter" + }, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/commons/vacant_room/office) +"bOf" = ( +/obj/structure/chair/sofa/middle/brown{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/obj/effect/landmark/start/hangover, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "bOi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -5994,6 +6675,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/tcommsat/server) +"bOt" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/security_space_law{ + pixel_y = 6 + }, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/wood, +/area/station/security/courtroom) "bOw" = ( /turf/closed/wall, /area/station/construction/mining/aux_base) @@ -6010,6 +6699,14 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/brig) +"bOK" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + 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/engineering/supermatter/room/upper) "bOO" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/heat_exchanging/simple, @@ -6025,26 +6722,33 @@ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"bPq" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "bPr" = ( -/obj/structure/reagent_dispensers/plumbed/storage, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, -/obj/machinery/camera/autoname/directional/east{ - network = list("ss13","medbay"); - c_tag = "Medbay - Upper Chemistry East" - }, -/obj/machinery/light_switch/directional/east, +/obj/structure/tank_holder/extinguisher, /turf/open/floor/iron/dark, /area/station/medical/chemistry) "bPw" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/emergency, -/obj/effect/spawner/random/maintenance, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/obj/machinery/status_display/supply{ + pixel_y = 32 + }, +/obj/machinery/disposal/delivery_chute{ + dir = 4 + }, +/obj/structure/window/spawner/directional/south, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk, +/obj/structure/plasticflaps, +/turf/open/floor/iron/textured_large, +/area/station/cargo/sorting) "bPC" = ( /turf/open/floor/plating, /area/station/maintenance/port/aft) @@ -6056,17 +6760,18 @@ /turf/open/floor/wood, /area/station/service/lawoffice) "bPH" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 +/obj/effect/turf_decal/trimline/blue/filled/end{ + dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 1 + dir = 8 }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "bPN" = ( /obj/structure/table, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6077,6 +6782,23 @@ /obj/effect/mapping_helpers/mail_sorting/science/xenobiology, /turf/open/floor/iron/dark/smooth_large, /area/station/science/explab) +"bPO" = ( +/obj/machinery/light/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"bPS" = ( +/obj/machinery/duct, +/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/structure/cable, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"bPT" = ( +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/aft) "bPW" = ( /turf/closed/wall, /area/station/commons/fitness/recreation) @@ -6094,19 +6816,16 @@ /obj/item/clothing/mask/breath, /turf/open/floor/wood, /area/station/command/teleporter) -"bQt" = ( -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) -"bQz" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/structure/railing, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "bQC" = ( -/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Cargo Lockdown Shutters"; + id = "cargolockdown"; + dir = 8 + }, /turf/open/floor/plating, -/area/station/maintenance/disposal) +/area/station/security/checkpoint/supply) "bQF" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/structure/closet/secure_closet, @@ -6165,60 +6884,32 @@ }, /turf/open/openspace, /area/station/science/xenobiology) -"bRl" = ( -/obj/structure/table, -/obj/item/clothing/suit/utility/fire/firefighter, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "bRm" = ( -/obj/machinery/smartfridge/chemistry/preloaded, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "chemshutters"; - name = "Chemistry Shutters" +/obj/machinery/chem_dispenser, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) -"bRv" = ( -/obj/machinery/holopad, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/service/library/printer) "bRx" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 8 }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) -"bRC" = ( -/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/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron, -/area/station/engineering/lobby) -"bRD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/pai_card{ - pixel_y = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) "bRQ" = ( -/obj/item/cigbutt, -/obj/effect/mapping_helpers/airlock/access/all/supply/qm, -/obj/machinery/door/airlock/mining{ - name = "Quartermaster's Office" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/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/bot_white, +/turf/open/floor/iron/dark/textured_large, +/area/station/cargo/storage) "bRT" = ( /obj/machinery/conveyor_switch/oneway{ dir = 8; @@ -6229,26 +6920,14 @@ /turf/open/floor/plating, /area/station/maintenance/disposal) "bRW" = ( -/obj/effect/turf_decal/arrows{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 + dir = 9 }, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/dark/smooth_corner, /area/station/command/gateway) -"bSe" = ( -/obj/machinery/door/airlock{ - name = "Unisex Showers" - }, -/obj/structure/cable, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) +"bSg" = ( +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "bSk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6272,6 +6951,10 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/eva) +"bSt" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/hallway/secondary/construction) "bSu" = ( /obj/item/paint/red{ pixel_x = -7; @@ -6362,22 +7045,28 @@ /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_recreation) "bTl" = ( -/obj/structure/rack, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/airlock_painter, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/turf/open/floor/iron, -/area/station/commons/storage/primary) +/obj/structure/closet/firecloset, +/obj/effect/spawner/random/maintenance, +/obj/structure/sign/warning/electric_shock/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "bTo" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) +"bTp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/obj/machinery/meter, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"bTq" = ( +/obj/structure/chair/sofa/corp, +/turf/open/floor/carpet/blue, +/area/station/medical/break_room) "bTF" = ( /obj/structure/closet/crate/secure/trashcart/filled, /turf/open/floor/plating, @@ -6400,11 +7089,11 @@ /turf/open/floor/iron, /area/station/engineering/lobby) "bTU" = ( -/obj/effect/turf_decal/siding/green/corner, /obj/machinery/disposal/bin/tagger, -/obj/structure/disposalpipe/trunk{ +/obj/effect/turf_decal/siding/green{ dir = 4 }, +/obj/structure/disposalpipe/trunk, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "bTW" = ( @@ -6414,16 +7103,6 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/plating, /area/station/construction/storage_wing) -"bTZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=21-Central"; - location = "20-Genetics" - }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "bUa" = ( /obj/machinery/computer/dna_console, /turf/open/floor/iron/dark/textured_large, @@ -6440,28 +7119,13 @@ dir = 8 }, /area/station/hallway/primary/fore) -"bUp" = ( -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/structure/urinal/directional/north, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) -"bUr" = ( -/obj/effect/turf_decal/siding{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "bUO" = ( -/obj/machinery/computer/records/security, /obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 6 }, -/turf/open/floor/carpet, +/obj/machinery/photocopier/prebuilt, +/turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) "bUQ" = ( /obj/effect/spawner/random/trash/graffiti, @@ -6476,34 +7140,37 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) +"bVq" = ( +/obj/structure/bookcase/random/religion, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "bVs" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment{ dir = 10 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "bVB" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, -/area/station/medical/coldroom) +/area/station/maintenance/department/medical) "bVI" = ( -/obj/machinery/requests_console/directional/north{ - department = "Head of Security's Desk"; - name = "Head of Security Requests Console"; - pixel_y = -30 - }, /obj/effect/mapping_helpers/requests_console/information, /obj/effect/mapping_helpers/requests_console/announcement, /obj/effect/mapping_helpers/requests_console/assistance, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, +/obj/machinery/requests_console/directional/south{ + department = "Head Of Security's Desk"; + name = "Head Of Security Requests Console" + }, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) "bVK" = ( @@ -6520,11 +7187,11 @@ /turf/open/floor/engine/hull/air, /area/station/science/research) "bVS" = ( -/obj/structure/bookcase/random/reference, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/meeting_room/council) +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/hallway/primary/central) "bVV" = ( /obj/effect/turf_decal/siding/dark, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6532,7 +7199,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 4 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bVW" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -6543,6 +7210,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/glass, /area/station/science/zoo) +"bWe" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/firealarm/directional/south, +/turf/open/openspace, +/area/station/engineering/atmos/office) +"bWm" = ( +/obj/machinery/light_switch/directional/east, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "bWo" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -6561,13 +7241,7 @@ }, /obj/effect/turf_decal/trimline/dark_blue/mid_joiner, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"bWC" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) +/area/station/ai/satellite/interior) "bWE" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 5 @@ -6575,14 +7249,23 @@ /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "bWI" = ( -/obj/structure/reagent_dispensers/plumbed/storage, -/turf/open/floor/wood, -/area/station/medical/medbay/central) -"bWQ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor{ + color = "#66ccff" + }, +/obj/item/kirbyplants/random, +/obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) +/area/station/medical/cryo) +"bWR" = ( +/obj/structure/fluff/paper/stack{ + dir = 10 + }, +/obj/structure/sign/flag/nanotrasen/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "bWY" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, @@ -6594,20 +7277,23 @@ name = "Abandoned Arcade" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/iron/dark, /area/station/maintenance/hallway/abandoned_recreation) -"bXg" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 6 - }, -/obj/effect/turf_decal/siding/brown/corner{ +"bXk" = ( +/obj/machinery/duct, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/fore) +"bXl" = ( +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) +/obj/effect/spawner/random/trash/cigbutt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/tile, +/area/station/security/detectives_office/private_investigators_office) "bXn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6620,20 +7306,11 @@ }, /turf/open/floor/iron/checker, /area/station/service/bar) -"bXp" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/railing, -/turf/open/openspace, -/area/station/engineering/lobby) "bXt" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, /turf/open/floor/iron, /area/station/cargo/miningoffice) "bXy" = ( @@ -6647,13 +7324,6 @@ "bXA" = ( /turf/closed/wall/r_wall, /area/station/security/warden) -"bXH" = ( -/obj/machinery/camera/autoname/directional/west, -/obj/effect/turf_decal/siding/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "bXO" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -6666,6 +7336,12 @@ }, /turf/open/floor/iron/dark, /area/station/science/lobby) +"bYd" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "bYe" = ( /obj/structure/table, /obj/item/paper_bin/carbon{ @@ -6692,6 +7368,15 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/port/aft) +"bYt" = ( +/obj/effect/spawner/random/techstorage/ai_all, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/south, +/obj/structure/rack, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "bYz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/official/anniversary_vintage_reprint/directional/south, @@ -6737,6 +7422,11 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron, /area/station/science/explab) +"bZf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/blobstart, +/turf/open/floor/engine, +/area/station/maintenance/starboard) "bZo" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/green/filled/mid_joiner, @@ -6746,16 +7436,29 @@ /obj/machinery/door/window/right/directional/west, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) -"bZq" = ( -/obj/machinery/washing_machine, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/station/maintenance/starboard/lesser) "bZs" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 5 }, -/obj/structure/reagent_dispensers/fueltank, +/obj/structure/rack, +/obj/item/gps/mining{ + pixel_x = 6; + pixel_y = 2 + }, +/obj/item/gps/mining, +/obj/item/gps/mining{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/pickaxe{ + pixel_x = 5 + }, +/obj/item/shovel{ + pixel_x = -5 + }, +/obj/structure/railing{ + dir = 8 + }, /turf/open/floor/iron, /area/station/cargo/miningoffice) "bZt" = ( @@ -6772,6 +7475,30 @@ }, /turf/open/openspace, /area/station/commons/fitness/recreation) +"bZu" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "N2O Multideck Adapter"; + dir = 4 + }, +/obj/machinery/meter{ + name = "N2O meter" + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"bZw" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "bZx" = ( /obj/structure/table, /obj/item/stock_parts/subspace/transmitter, @@ -6785,54 +7512,63 @@ /turf/open/floor/iron/dark, /area/station/engineering/storage/tcomms) "bZC" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/carpet, -/area/station/ai_monitored/turret_protected/ai_upload) +/obj/machinery/airalarm/directional/north, +/obj/item/kirbyplants/organic/plant19{ + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/ai/upload/chamber) "bZD" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ - dir = 1 +/obj/structure/disposalpipe/segment, +/obj/machinery/computer/crew{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ - dir = 4 +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 6 }, -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/turf/open/openspace, -/area/station/medical/cryo) +/turf/open/floor/holofloor/dark, +/area/station/command/heads_quarters/cmo) +"bZI" = ( +/obj/structure/table/wood, +/obj/item/paper/crumpled{ + pixel_x = 2; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = -4; + pixel_y = 1 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "bZJ" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/brown/arrow_ccw{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"bZK" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, /turf/open/floor/iron, -/area/station/hallway/primary/starboard) +/area/station/cargo/storage) "bZN" = ( /obj/machinery/light/directional/south, /turf/open/openspace, /area/station/science/xenobiology) -"bZQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"bZR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/obj/machinery/space_heater, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) -"cac" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/lesser) "cai" = ( /obj/effect/turf_decal/siding/purple/corner{ dir = 1 @@ -6854,6 +7590,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/science/central) +"cal" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/engineering_all, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "cam" = ( /obj/structure/table/wood, /obj/machinery/light_switch, @@ -6862,36 +7609,53 @@ dir = 8 }, /area/station/service/chapel) -"cay" = ( +"cav" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Medbay" + }, +/obj/effect/turf_decal/tile/blue/full, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) +"caB" = ( +/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/plating, +/area/station/maintenance/starboard/fore/upper) "caE" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/machinery/camera/autoname/directional/east, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) +"caF" = ( +/obj/effect/turf_decal/trimline/green/filled/line, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"caF" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +"caK" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, -/area/station/maintenance/port/fore) +/area/station/maintenance/starboard/fore/upper) "caO" = ( /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/disposal) "caQ" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 +/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/autolathe, -/obj/structure/sign/poster/official/do_not_question/directional/north, -/obj/machinery/wall_healer/directional/west, -/turf/open/floor/iron, +/obj/effect/turf_decal/bot_white, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/iron/dark/textured_large, /area/station/cargo/storage) "caS" = ( /obj/structure/railing, @@ -6915,22 +7679,26 @@ /area/station/solars/starboard/fore) "cbm" = ( /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) +"cbn" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/item/modular_computer/laptop/preset/civilian{ + pixel_y = 3 + }, +/turf/open/floor/wood/large, +/area/station/engineering/lobby) "cbo" = ( /obj/item/radio/intercom/directional/south, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/office) -"cbq" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner/end, -/obj/structure/railing/corner/end{ - pixel_y = 2 - }, -/obj/structure/cable/multilayer/multiz, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) "cbt" = ( /obj/effect/turf_decal/siding/dark/corner, /turf/open/floor/iron/dark/telecomms, @@ -6939,29 +7707,31 @@ /obj/machinery/vending/cigarette, /turf/open/floor/plating, /area/station/maintenance/port) -"cbB" = ( -/obj/machinery/requests_console/directional/west{ - department = "Security"; - name = "Security Requests Console" - }, +"cbA" = ( /obj/structure/table, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/machinery/recharger{ - pixel_x = 10; - pixel_y = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 }, -/obj/structure/reagent_dispensers/wall/peppertank/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/engineering) +/obj/item/geiger_counter{ + pixel_y = 6; + pixel_x = -3 + }, +/obj/item/radio{ + pixel_x = 4; + pixel_y = 5 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "cbC" = ( /obj/machinery/suit_storage_unit/standard_unit, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/box, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "cbI" = ( /obj/machinery/vatgrower{ dir = 4 @@ -6983,23 +7753,37 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"cbS" = ( -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/ferny/style_random, -/obj/structure/flora/bush/pale/style_random, -/turf/open/floor/grass, -/area/station/maintenance/starboard/fore) "cbT" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/ce) "cbV" = ( +/obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/conveyor{ dir = 8; id = "HoPsToy" }, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/carpet, +/obj/machinery/door/window/brigdoor/right/directional/east{ + req_access = list("hop") + }, +/turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) +"cca" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/power_store/cell/high{ + charge = 100; + maxcharge = 15000 + }, +/obj/item/clothing/glasses/meson{ + pixel_y = 8 + }, +/obj/item/clothing/glasses/meson{ + pixel_y = 8 + }, +/obj/structure/sign/warning/no_smoking/directional/north, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "ccc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7020,11 +7804,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"cck" = ( -/obj/structure/broken_flooring/singular/directional/east, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/plating, -/area/station/engineering/storage_shared) "ccm" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7037,19 +7816,25 @@ /turf/open/floor/iron, /area/station/hallway/primary/aft) "ccr" = ( -/turf/open/floor/carpet/purple, -/area/station/ai_monitored/turret_protected/ai_upload) -"ccy" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/dark/textured_large, -/area/station/maintenance/starboard/aft) -"ccH" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/computer/upload/ai{ + dir = 4 + }, +/obj/machinery/door/window/left/directional/east{ + name = "AI Upload Console Window"; + req_access = list("ai_upload") }, +/turf/open/floor/circuit/green, +/area/station/ai/upload/chamber) +"ccH" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, +/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/white/textured_large, /area/station/medical/medbay/central) "ccM" = ( @@ -7060,11 +7845,6 @@ "ccN" = ( /turf/closed/wall, /area/station/medical/surgery) -"ccV" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "ccY" = ( /obj/machinery/door/airlock/medical{ name = "Coroner's Office" @@ -7075,22 +7855,6 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/morgue, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) -"ccZ" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=18-Bathroom"; - location = "17-Dorms" - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "cdc" = ( /turf/closed/wall, /area/station/service/kitchen/coldroom) @@ -7102,9 +7866,15 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) -"cdi" = ( -/turf/closed/wall, -/area/station/engineering/gravity_generator) +"cdo" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/camera/autoname/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/lobby) "cdq" = ( /obj/effect/turf_decal/weather/dirt{ dir = 8 @@ -7122,20 +7892,14 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/glass/reinforced, /area/station/service/library) -"cdP" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/cleanable/crayon{ - icon_state = "revolution"; - name = "graffiti"; - paint_colour = "#FF0000"; - pixel_y = 32 +"cdJ" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"cea" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/obj/machinery/holopad, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "ceb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood, @@ -7148,9 +7912,6 @@ "ceh" = ( /obj/structure/chair, /obj/item/radio/intercom/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, /turf/open/floor/wood, /area/station/maintenance/starboard/central) "cel" = ( @@ -7166,23 +7927,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/cytology) -"cep" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/effect/turf_decal/bot, -/obj/structure/sign/warning/fire/directional/east, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/atmos/upper) -"cer" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/stack{ - desc = "A stack of various papers, absolutely unreadable due to scorch marks and aging."; - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "ces" = ( /obj/structure/toilet{ dir = 8; @@ -7198,63 +7942,47 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) -"cew" = ( -/obj/structure/table, -/obj/item/aicard, -/obj/item/ai_module/reset, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/flash/handheld, -/obj/machinery/light/directional/east, +"cet" = ( +/obj/structure/lattice/catwalk, /turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"ceB" = ( -/obj/structure/chair/comfy{ +/area/station/engineering/supermatter/room/upper) +"ceC" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/trimline/dark_red/filled/warning{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_half{ dir = 1 }, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) +/area/station/cargo/storage) "ceG" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/customs) "ceQ" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, /obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/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" + }, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "ceR" = ( /obj/machinery/netpod, /obj/item/radio/intercom/directional/north, /turf/open/floor/catwalk_floor/iron_dark, /area/station/cargo/bitrunning/den) -"ceV" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/obj/effect/landmark/start/coroner, -/turf/open/floor/iron/dark/textured_edge, -/area/station/medical/morgue) "ceX" = ( /obj/machinery/telecomms/server/presets/supply, /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"cfi" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 8 - }, -/area/station/medical/pharmacy) -"cfn" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/station/maintenance/port/aft) "cfp" = ( /obj/machinery/button/door/directional/east{ id = "commissarydoor"; @@ -7290,20 +8018,6 @@ /obj/machinery/light/dim/directional/south, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) -"cfs" = ( -/obj/machinery/button/elevator{ - id = "catwalk_engi"; - pixel_y = -24 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8; - pixel_x = -2 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "cfx" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -7321,38 +8035,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) -"cfI" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/radio/intercom/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"cfP" = ( +"cfS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"cfQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"cfT" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/machinery/light/warm/directional/east, /turf/open/floor/iron, -/area/station/engineering/lobby) +/area/station/cargo/storage) "cgg" = ( /obj/effect/decal/remains/human, /obj/item/clothing/head/utility/hardhat/welding/atmos{ @@ -7368,49 +8056,75 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/small, /area/station/security/mechbay) -"cgE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output{ +"cgG" = ( +/obj/structure/chair/pew/right{ + dir = 4 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/carpet, +/area/station/maintenance/starboard) +"cgI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer2{ dir = 1 }, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - Plasma Cell"; - name = "atmospherics camera" +/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/turf/open/floor/engine/plasma, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/landmark/navigate_destination/incinerator, +/turf/open/floor/engine, /area/station/engineering/atmos/upper) "cgK" = ( /obj/structure/cable, /turf/closed/wall, /area/station/maintenance/solars/port/aft) "cgX" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/ladder, /obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/qm) +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/obj/structure/railing, +/obj/item/multitool{ + pixel_x = -8; + pixel_y = 3 + }, +/obj/structure/table, +/obj/item/storage/box/lights/mixed{ + pixel_x = 4; + pixel_y = 11 + }, +/obj/item/hand_labeler_refill{ + pixel_x = 7; + pixel_y = -2 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "chb" = ( /obj/item/vending_refill/coffee, /turf/open/floor/plating, /area/station/maintenance/disposal) -"chc" = ( -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/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, -/area/station/engineering/atmos/upper) "chd" = ( /obj/structure/ladder, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "chf" = ( /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/security/office) +"chg" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/openspace, +/area/station/maintenance/starboard/upper) "chr" = ( /obj/machinery/holopad, /turf/open/floor/wood/tile, @@ -7420,23 +8134,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"chz" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"chv" = ( +/turf/open/floor/iron/stairs{ + dir = 1 }, -/obj/effect/spawner/structure/window/reinforced/tinted, +/area/station/maintenance/aft) +"chz" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"chG" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) -"chI" = ( -/obj/effect/landmark/start/hangover, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/glass, -/area/station/commons/fitness/recreation) "chO" = ( /obj/structure/table/glass, /obj/item/reagent_containers/cup/glass/coffee{ @@ -7452,36 +8159,18 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/turf_decal/arrows{ - dir = 1 - }, /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/gateway) -"chR" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix Bypass" - }, -/obj/effect/turf_decal/trimline/blue, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"chU" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Crew Quarters Access" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 2 +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 }, -/obj/effect/landmark/navigate_destination/dorms, -/turf/open/floor/iron/edge, -/area/station/commons/dorms) +/area/station/command/gateway) +"chV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/toy/basketball, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "chX" = ( /obj/machinery/camera/directional/south{ c_tag = "Science - Xenobiology Big Pen Top"; @@ -7489,11 +8178,6 @@ }, /turf/open/openspace, /area/station/science/xenobiology) -"chZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "cib" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7501,33 +8185,37 @@ /obj/structure/disposalpipe/segment{ dir = 2 }, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "cif" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) -"cik" = ( -/obj/structure/table/wood, -/obj/machinery/computer/records/medical/laptop, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) "cil" = ( /obj/item/radio/intercom/directional/south, /turf/closed/wall/r_wall, /area/station/engineering/main) -"ciS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 +"ciN" = ( +/obj/effect/turf_decal/siding{ + dir = 1 }, -/obj/effect/landmark/firealarm_sanity, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/virology) +/obj/effect/turf_decal/trimline/white/line, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) +"ciT" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "cjb" = ( /obj/structure/frame/computer{ anchored = 1 @@ -7552,25 +8240,88 @@ /turf/open/floor/wood/large, /area/station/medical/psychology) "cjE" = ( -/obj/machinery/computer/rdconsole, +/obj/machinery/computer/rdconsole/unlocked, /turf/open/floor/wood, /area/station/command/heads_quarters/rd) +"cjQ" = ( +/obj/item/clothing/under/color/grey, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = -13 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = -13 + }, +/obj/structure/rack, +/obj/machinery/camera/autoname/directional/west, +/obj/item/flashlight, +/obj/item/radio/intercom/directional/north, +/obj/item/wrench, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"cjW" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/obj/structure/cable, +/turf/open/floor/iron/textured_large, +/area/station/medical/virology) +"cjY" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"cjZ" = ( +/obj/machinery/computer/security/telescreen/cmo/directional/north, +/obj/effect/landmark/start/chief_medical_officer, +/obj/structure/chair/comfy{ + dir = 8 + }, +/obj/machinery/button/door/directional/west{ + id = "cmoprivacy"; + name = "CMO Office Privacy"; + req_access = list("cmo"); + pixel_y = -2 + }, +/obj/machinery/button/door/directional/west{ + id = "medbay-office"; + name = "Medbay Lockdown"; + req_access = list("medical"); + pixel_y = 8 + }, +/turf/open/floor/holofloor/dark, +/area/station/command/heads_quarters/cmo) +"cka" = ( +/obj/structure/frame, +/obj/structure/sign/poster/contraband/shamblers_juice/directional/east, +/turf/open/floor/eighties, +/area/station/maintenance/department/crew_quarters/dorms) "ckd" = ( /obj/machinery/suit_storage_unit/standard_unit, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 +/obj/effect/turf_decal/siding/dark{ + dir = 6 }, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "cke" = ( -/obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ dir = 4 }, -/obj/structure/disposalpipe/trunk{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /turf/open/floor/iron/dark/smooth_large, @@ -7585,6 +8336,14 @@ /obj/machinery/hydroponics/soil, /turf/open/misc/sandy_dirt, /area/station/service/hydroponics/garden/abandoned) +"ckF" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/closet/firecloset, +/turf/open/floor/iron, +/area/station/engineering/lobby) "ckG" = ( /obj/structure/table, /obj/item/clothing/glasses/sunglasses/big{ @@ -7607,7 +8366,9 @@ /area/station/hallway/primary/port) "ckZ" = ( /obj/structure/cable, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 1 + }, /area/station/hallway/primary/central) "cla" = ( /obj/effect/turf_decal/trimline/red/filled/line{ @@ -7635,38 +8396,30 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"clh" = ( -/obj/effect/mapping_helpers/broken_floor, +"clk" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/fluff/paper/stack{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/filingcabinet/chestdrawer, -/obj/item/folder/yellow, -/obj/item/hand_labeler_refill{ - pixel_x = -1 - }, -/obj/structure/fluff/paper{ - dir = 1 - }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, +/area/station/maintenance/starboard/central) +"clq" = ( +/obj/structure/sign/warning/vacuum/directional/north, +/turf/open/floor/plating/airless, /area/station/maintenance/starboard/aft) "cly" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/plating, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/loading_area/red{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 8 + }, /area/station/cargo/storage) "clB" = ( /obj/structure/lattice/catwalk, /obj/machinery/light/directional/west, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) -"clF" = ( -/obj/structure/table, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/structure/sign/poster/contraband/the_big_gas_giant_truth/directional/west, -/turf/open/floor/wood, -/area/station/commons/dorms) +/area/station/ai/satellite/chamber) "clG" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 @@ -7682,20 +8435,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "clT" = ( /obj/item/geiger_counter, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"clX" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) "clZ" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) -"cme" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/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, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "cmf" = ( /obj/item/radio/intercom/directional/north, /turf/open/openspace, @@ -7707,11 +8466,20 @@ /turf/open/floor/iron, /area/station/science/robotics/lab) "cmp" = ( -/obj/effect/turf_decal/siding/white/corner{ - dir = 8 +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/chair/office/light{ + dir = 4 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"cmt" = ( +/obj/structure/table, +/obj/structure/sign/poster/contraband/energy_swords/directional/north, +/obj/item/clothing/head/costume/tv_head{ + pixel_y = 8 + }, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/department/crew_quarters/dorms) "cmK" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/pale/style_random, @@ -7731,15 +8499,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/service/chapel) -"cmO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/closed/wall, -/area/station/maintenance/starboard/lesser) -"cmR" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "cmS" = ( /turf/closed/wall/r_wall, /area/station/security/mechbay) @@ -7751,22 +8510,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/security/courtroom) -"cmY" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, +"cmW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "cnw" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, /turf/open/openspace, /area/station/hallway/primary/starboard) +"cny" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) "cnL" = ( -/obj/effect/turf_decal/siding/white{ - dir = 10 +/obj/effect/turf_decal/siding/blue{ + dir = 8 }, +/obj/effect/turf_decal/arrows, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "cnP" = ( @@ -7775,6 +8538,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/security/lockers) +"cnT" = ( +/obj/machinery/firealarm/directional/south, +/obj/machinery/modular_computer/preset/cargochat/engineering{ + dir = 1 + }, +/obj/machinery/requests_console/directional/west{ + name = "Engineering Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/wood/large, +/area/station/engineering/lobby) +"cnU" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "coc" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/curtain/bounty, @@ -7793,13 +8572,6 @@ /obj/structure/railing/corner, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"cot" = ( -/obj/machinery/atmospherics/components/trinary/filter/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "cox" = ( /obj/structure/railing, /obj/machinery/door/firedoor/border_only, @@ -7809,15 +8581,17 @@ /turf/open/floor/wood/large, /area/station/hallway/primary/central) "coI" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, /obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/tlv_cold_room, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/structure/showcase/machinery/cloning_pod{ + desc = "An old prototype cloning pod, permanently decommissioned following the incident."; + name = "decommissioned cloner" + }, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "coP" = ( /obj/effect/turf_decal/weather/dirt, /obj/structure/flora/bush/large/style_2{ @@ -7837,36 +8611,43 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/security/prison) +"cpl" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"cps" = ( +/obj/machinery/newscaster/directional/west, +/obj/structure/hedge, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/large, +/area/station/medical/break_room) "cpy" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 +/obj/structure/chair/comfy/black{ + dir = 4 }, -/turf/open/floor/carpet, -/area/station/command/bridge) +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room/council) "cpA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/science/ordnance/storage) -"cpD" = ( -/obj/structure/table, -/obj/effect/spawner/random/entertainment/musical_instrument, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"cpE" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/candle_box{ - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +"cpF" = ( +/obj/item/cigbutt, +/obj/machinery/light/small/directional/east, +/obj/structure/sign/clock/directional/east, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "cpG" = ( -/obj/machinery/computer/records/medical, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/obj/machinery/airalarm/directional/west, +/obj/machinery/computer/records/security, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) "cpM" = ( @@ -7875,22 +8656,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/cytology) -"cpN" = ( -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "cpQ" = ( -/obj/structure/chair{ - dir = 1 +/obj/machinery/airalarm/directional/north, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/structure/sign/clock/directional/west, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 }, -/obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) +/area/station/cargo/miningoffice) "cqe" = ( -/obj/structure/curtain, -/obj/machinery/shower/directional/south, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/surgery) +/obj/effect/landmark/start/medical_doctor, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/light/floor, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "cqh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7915,10 +8701,6 @@ }, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"cqp" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "cqt" = ( /obj/docking_port/stationary/laborcamp_home{ dir = 8 @@ -7926,13 +8708,13 @@ /turf/open/space/openspace, /area/space) "cqw" = ( -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 8 }, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "cqG" = ( /obj/item/trash/boritos, @@ -7983,7 +8765,7 @@ /turf/open/floor/iron/white/smooth_edge{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "crh" = ( /obj/structure/flora/bush/pale/style_random, /obj/structure/flora/bush/ferny/style_random, @@ -8006,16 +8788,10 @@ /area/station/service/library/private) "crk" = ( /obj/machinery/door/firedoor, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) -"crn" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 +/turf/open/floor/iron/edge{ + dir = 1 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/area/station/hallway/primary/central) "crs" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced/spawner/directional/south, @@ -8029,18 +8805,10 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/herringbone, /area/station/commons/lounge) -"crE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"crG" = ( -/obj/machinery/door/airlock/maintenance, -/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/maintenance, +"crP" = ( +/obj/effect/spawner/random/engineering/tank, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/maintenance/department/crew_quarters/dorms) "crS" = ( /obj/structure/sign/poster/contraband/atmosia_independence/directional/north{ desc = "The captain is expressely FORBIDDEN here. Only those who took from him are allowed."; @@ -8061,11 +8829,12 @@ /turf/open/floor/engine, /area/station/service/hydroponics) "csb" = ( -/obj/machinery/door/poddoor/shutters{ - id = "qm_cargobay"; - name = "Cargo Bay Shutters" - }, /obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/window{ + dir = 8; + name = "Cargo Bay Shutters"; + id = "qm_cargobay" + }, /turf/open/floor/plating, /area/station/cargo/storage) "csd" = ( @@ -8079,14 +8848,6 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"csf" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "N2O to Port" - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "csh" = ( /obj/structure/cable, /turf/open/floor/iron/dark, @@ -8114,6 +8875,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/station/hallway/secondary/service) +"csr" = ( +/obj/structure/stairs/east, +/turf/open/floor/iron, +/area/station/commons/dorms) "cst" = ( /obj/effect/turf_decal/trimline/red/filled/mid_joiner{ dir = 1 @@ -8142,7 +8907,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "csC" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -8154,19 +8919,13 @@ /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) "csE" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "cargounload" +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 4 }, -/obj/machinery/conveyor_switch/oneway{ - id = "cargounload"; - name = "Unloading Conveyor"; - pixel_x = -13; - pixel_y = -4 - }, /turf/open/floor/iron, /area/station/cargo/storage) "csF" = ( @@ -8187,21 +8946,30 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/plating, /area/station/cargo/storage) -"csN" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 10 +"csS" = ( +/obj/machinery/disposal/delivery_chute{ + dir = 8; + name = "Outside Cargo" }, -/obj/structure/railing/corner{ +/obj/effect/turf_decal/delivery, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/south, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/sign/departments/cargo/directional/east, +/obj/structure/plasticflaps, +/turf/open/floor/iron/textured_large, +/area/station/cargo/sorting) +"csW" = ( +/obj/machinery/door/firedoor/border_only{ dir = 4 }, -/turf/open/openspace, -/area/station/engineering/lobby) -"csS" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/structure/window/reinforced/tinted, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/obj/effect/landmark/firealarm_sanity, +/turf/open/floor/iron/stairs/medium{ + dir = 4 + }, +/area/station/medical/abandoned) "ctb" = ( /turf/open/floor/glass/reinforced, /area/station/command/heads_quarters/rd) @@ -8219,20 +8987,6 @@ dir = 8 }, /area/station/hallway/primary/fore) -"cth" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/crayon{ - icon_state = "body"; - name = "body"; - pixel_y = 7 - }, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "ctl" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/dirt, @@ -8240,15 +8994,22 @@ /obj/item/book/codex_gigas, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"ctE" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ +"ctm" = ( +/obj/machinery/light/directional/west, +/obj/structure/sign/departments/aiupload/directional/west, +/obj/effect/turf_decal/trimline/dark/arrow_cw{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 8 +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"ctE" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rear_surgery"; + name = "Surgery Shutters"; + dir = 1 }, -/obj/structure/cable, -/turf/open/floor/iron/white/textured_large, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, /area/station/medical/surgery) "ctK" = ( /obj/effect/turf_decal/trimline/red/filled/line{ @@ -8256,6 +9017,12 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) +"ctL" = ( +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "ctN" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -8273,31 +9040,29 @@ /area/station/maintenance/port/aft) "cud" = ( /obj/machinery/conveyor{ - dir = 4; + dir = 1; id = "cargoload" }, -/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/turf_decal/stripes/end, /turf/open/floor/iron, /area/station/cargo/storage) +"cuL" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "cuQ" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/iron/dark, /area/station/science/lobby) -"cuT" = ( -/obj/machinery/light/directional/east, -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) "cuY" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) "cvj" = ( /obj/machinery/door/airlock/external{ @@ -8306,6 +9071,15 @@ /obj/effect/landmark/navigate_destination/dockescpod, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"cvq" = ( +/obj/structure/table/wood, +/obj/item/phone{ + desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "cvH" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -8313,6 +9087,12 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) +"cvM" = ( +/obj/structure/chair/pew/left{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/maintenance/starboard) "cvP" = ( /turf/closed/wall/r_wall, /area/station/command/meeting_room/council) @@ -8334,8 +9114,23 @@ }, /turf/open/floor/iron/checker, /area/station/service/bar/backroom) +"cwe" = ( +/obj/structure/disposalpipe/segment{ + 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/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/lobby) "cwf" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "chem_lockdown"; + name = "Chemistry Shutters" + }, /turf/open/floor/plating, /area/station/medical/chemistry) "cwl" = ( @@ -8346,20 +9141,11 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"cwo" = ( -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "CO2 Multideck Adapter"; - dir = 8 - }, -/obj/machinery/meter{ - name = "C02 meter" - }, -/obj/effect/turf_decal/tile/dark/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "cwq" = ( /obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) "cwu" = ( /obj/structure/filingcabinet, @@ -8368,16 +9154,36 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) +"cwy" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"cwA" = ( +/obj/structure/sign/directions/engineering/directional/east{ + dir = 1; + pixel_x = 0 + }, +/turf/closed/wall, +/area/station/maintenance/starboard/central) "cwL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall, /area/station/commons/toilet/auxiliary) "cwO" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/camera/autoname/directional/west{ - c_tag = "Medbay - Upper Plumbing Area West" +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 }, -/turf/open/openspace, +/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/machinery/light_switch/directional/west, +/turf/open/floor/iron/dark, /area/station/medical/chemistry) "cwP" = ( /turf/open/openspace, @@ -8401,6 +9207,13 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) +"cxi" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/item/kirbyplants, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "cxj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8412,35 +9225,38 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"cxD" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Primary Surgical Theatre" +"cxs" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room" }, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/medical/surgery, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) -"cxE" = ( -/turf/open/floor/glass, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port) +"cxD" = ( +/obj/effect/turf_decal/trimline/blue/filled/end{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"cxE" = ( +/turf/open/floor/glass, /area/station/tcommsat/server) "cxK" = ( /obj/structure/sign/poster/contraband/missing_gloves, /turf/closed/wall, /area/station/maintenance/port) -"cxL" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet/black, -/area/station/service/library/private) -"cxQ" = ( -/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/commons/dorms) "cxU" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -8454,8 +9270,12 @@ }, /obj/structure/rack, /obj/effect/spawner/random/armory/disablers, +/obj/machinery/camera/motion{ + c_tag = "Armory - Internal"; + dir = 8 + }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "cyd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/bodycontainer/crematorium{ @@ -8465,40 +9285,25 @@ /turf/open/floor/iron/dark, /area/station/service/chapel/office) "cyx" = ( -/obj/structure/table, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/screwdriver{ - pixel_x = 1; - pixel_y = -2 - }, -/obj/item/grenade/chem_grenade{ - pixel_x = 11; - pixel_y = 11 - }, -/obj/item/grenade/chem_grenade{ - pixel_x = 8; - pixel_y = 11 - }, -/obj/item/grenade/chem_grenade{ - pixel_x = 3; - pixel_y = 11 - }, -/obj/item/grenade/chem_grenade{ - pixel_y = 11 - }, -/obj/item/clothing/glasses/science{ - pixel_x = -2; - pixel_y = 7 - }, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ dir = 4 }, +/obj/structure/chair/office/light{ + dir = 4 + }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) +"cyD" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "cyG" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8531,28 +9336,18 @@ /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 2 - }, -/obj/effect/mapping_helpers/mail_sorting/medbay/virology, +/obj/structure/sign/eyechart/directional/east, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"cyN" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 8 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/stripes/line{ - dir = 8; - pixel_x = -2 - }, +"cyO" = ( +/obj/machinery/field/generator, +/obj/effect/turf_decal/bot_white, /turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/area/station/engineering/supermatter/room/upper) "cyT" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -8565,6 +9360,7 @@ "czp" = ( /obj/machinery/light/floor, /obj/structure/cat_house, +/obj/effect/turf_decal/siding/green, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "czs" = ( @@ -8604,6 +9400,10 @@ dir = 1 }, /area/station/hallway/secondary/entry) +"czx" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "czF" = ( /obj/structure/railing/corner{ dir = 1 @@ -8612,17 +9412,17 @@ dir = 1 }, /obj/structure/cable, -/obj/effect/turf_decal/tile/green/opposingcorners{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"czJ" = ( -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) +"czG" = ( +/obj/machinery/duct, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "czK" = ( /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, @@ -8643,8 +9443,14 @@ name = "\improper APLU \"Cargostormer 3\"" }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/east, /turf/open/floor/iron/recharge_floor, /area/station/cargo/warehouse) +"cAh" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/curtain/cloth, +/turf/open/floor/plating, +/area/station/medical/patients_rooms/room_a) "cAk" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -8662,14 +9468,6 @@ /obj/machinery/light/directional, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"cAv" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) "cAz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8683,18 +9481,23 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/brig) +"cAG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "cAH" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, -/obj/structure/table/reinforced, -/obj/machinery/microwave/engineering, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron/textured, /area/station/cargo/storage) -"cAI" = ( -/obj/structure/fireaxecabinet/directional/east, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) "cAM" = ( /obj/structure/railing{ dir = 8 @@ -8714,18 +9517,13 @@ /turf/open/floor/iron, /area/station/hallway/primary/port) "cAW" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "HoPsToy" - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/window/brigdoor/right/directional/east{ - req_access = list("hop") +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/turf/open/floor/carpet, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) "cBc" = ( /obj/effect/turf_decal/siding/wood, @@ -8764,10 +9562,36 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/wood, /area/station/service/library/printer) -"cBu" = ( -/obj/structure/sign/warning/vacuum/directional/north, -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/lesser) +"cBl" = ( +/obj/effect/decal/cleanable/glitter, +/obj/effect/decal/cleanable/blood/oil, +/obj/effect/spawner/random/maintenance/two, +/obj/structure/rack, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"cBs" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft) +"cBv" = ( +/obj/machinery/power/emitter/prototype{ + desc = "Hell yeah."; + dir = 4; + name = "Betsy" + }, +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "cBA" = ( /obj/machinery/door/poddoor/preopen{ id = "Prison Gate"; @@ -8801,24 +9625,54 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/art) +"cBF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "cBT" = ( -/obj/structure/lattice/catwalk, -/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/table/reinforced/rglass, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 3 }, -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 6 +/obj/item/flashlight/pen{ + pixel_x = -3; + pixel_y = 3 }, -/turf/open/openspace, -/area/station/medical/cryo) -"cBY" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 9 +/obj/item/stamp/head/cmo{ + pixel_x = 8; + pixel_y = 10 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/obj/structure/cable, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 10 + }, +/turf/open/floor/holofloor/dark, +/area/station/command/heads_quarters/cmo) +"cBU" = ( +/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/effect/mapping_helpers/airlock/access/all/supply/qm, +/obj/machinery/door/airlock/mining{ + name = "Quartermaster's Office" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) +"cCb" = ( +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "cCj" = ( /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -8847,6 +9701,22 @@ }, /turf/open/floor/iron/dark/diagonal, /area/station/service/theater) +"cCo" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/station/maintenance/starboard/upper) +"cCp" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 4; + initialize_directions = 4 + }, +/obj/effect/turf_decal/bot_red, +/obj/structure/sign/warning/hot_temp/directional/west, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "cCq" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 @@ -8857,31 +9727,21 @@ }, /turf/open/floor/iron/dark/textured, /area/station/construction/mining/aux_base) -"cCr" = ( -/obj/structure/table/wood/poker, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) "cCt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/white/textured_edge{ - dir = 4 - }, -/area/station/medical/surgery) -"cCv" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/lattice/catwalk, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/water, -/area/station/maintenance/starboard/fore) +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "cCx" = ( /obj/structure/stairs/west, /obj/structure/railing, @@ -8890,29 +9750,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) -"cCA" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/bookbinder, -/turf/open/floor/wood, -/area/station/service/library/printer) -"cCI" = ( -/obj/machinery/door/airlock/external, -/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/access/any/science/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "cCM" = ( /turf/open/openspace, /area/station/engineering/lobby) "cCN" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/structure/chair/sofa/left/brown{ - dir = 1 - }, /obj/machinery/newscaster/directional/south, -/obj/effect/landmark/start/shaft_miner, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, /turf/open/floor/iron/textured, /area/station/cargo/storage) "cCX" = ( @@ -8931,11 +9777,22 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/science/robotics/lab) +"cDd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 8; + pixel_y = -2 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "cDq" = ( -/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/hull/air, +/obj/machinery/chem_master, +/obj/structure/sign/warning/secure_area/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, /area/station/medical/chemistry) "cDs" = ( /obj/effect/spawner/structure/window/reinforced, @@ -8948,23 +9805,18 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/security/prison) -"cDA" = ( -/obj/effect/spawner/random/trash/janitor_supplies, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "cDB" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white/textured_corner{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/holopad, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/surgery) -"cDI" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos/upper) +"cDF" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) "cDY" = ( /obj/machinery/light/small/directional/west, /obj/structure/rack, @@ -8996,13 +9848,23 @@ }, /turf/open/floor/iron, /area/station/engineering/storage_shared) -"cEf" = ( -/obj/structure/chair/pew/right{ - dir = 4 +"cEj" = ( +/obj/structure/table/reinforced, +/obj/item/stamp/denied{ + pixel_x = 7; + pixel_y = 8 }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/maintenance/starboard/lesser) +/obj/item/stamp/granted{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron, +/area/station/cargo/storage) "cEm" = ( /obj/structure/rack, /obj/item/storage/box/gloves{ @@ -9011,11 +9873,6 @@ /obj/item/storage/box/disks, /turf/open/floor/iron/dark/textured_large, /area/station/science/genetics) -"cEn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/holopad, -/turf/open/floor/plating, -/area/station/engineering/storage_shared) "cEH" = ( /obj/structure/table, /obj/item/stock_parts/power_store/cell/high{ @@ -9039,11 +9896,21 @@ /turf/open/floor/wood, /area/station/command/teleporter) "cER" = ( -/obj/effect/turf_decal/tile/brown{ +/obj/effect/turf_decal/siding/green{ dir = 1 }, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/plaque{ + icon_state = "L11" + }, +/turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) +"cET" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) "cFa" = ( /turf/open/openspace, /area/station/service/kitchen) @@ -9055,14 +9922,6 @@ /obj/effect/mapping_helpers/airlock/access/any/science/ordnance, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) -"cFc" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/showcase/horrific_experiment, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) "cFp" = ( /obj/structure/urinal/directional/east, /obj/effect/decal/cleanable/dirt, @@ -9115,6 +9974,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) +"cFN" = ( +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "cFY" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -9140,17 +10006,25 @@ }, /area/station/hallway/secondary/exit/departure_lounge) "cGp" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/plating, -/area/station/cargo/storage) +/obj/docking_port/stationary{ + dir = 4; + dwidth = 3; + height = 8; + name = "Cargo Bay"; + shuttle_id = "cargo_home"; + width = 13 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/turf/open/floor/engine/hull, +/area/space/nearstation) "cGB" = ( /obj/machinery/light/directional/east, /obj/machinery/camera/autoname/directional/east, -/obj/machinery/button/door/directional/south{ - id = "lawyer_shutters"; +/obj/machinery/button/door/directional/east{ name = "law office shutter control"; - pixel_x = 24; - pixel_y = 7 + id = "lawyer_shutters" }, /turf/open/floor/carpet, /area/station/service/lawoffice) @@ -9181,29 +10055,21 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"cGS" = ( -/obj/structure/sign/warning/radiation/rad_area, -/turf/closed/wall/r_wall, -/area/station/engineering/hallway) -"cHp" = ( -/obj/structure/lattice/catwalk, -/obj/structure/table, -/turf/open/openspace, -/area/station/hallway/secondary/exit/departure_lounge) -"cHq" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/orange, -/obj/item/storage/box/mousetraps{ - pixel_x = 3; - pixel_y = 3 +"cHt" = ( +/obj/effect/landmark/start/quartermaster, +/obj/structure/chair/office{ + dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "cHv" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) +"cHx" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "cHz" = ( /obj/structure/chair/sofa/left/brown, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -9213,14 +10079,6 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron, /area/station/science/breakroom) -"cHC" = ( -/obj/structure/railing, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/grass, -/area/station/hallway/primary/starboard) "cHD" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9233,39 +10091,40 @@ /obj/structure/closet/toolcloset, /turf/open/floor/wood, /area/station/commons/storage/tools) -"cHK" = ( -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/structure/frame/computer{ - anchored = 1; - dir = 8 +"cHL" = ( +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "cHP" = ( -/obj/machinery/computer/atmos_alert{ +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 1 }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "cHS" = ( -/obj/machinery/disposal/delivery_chute{ - dir = 8 +/obj/item/dest_tagger{ + pixel_x = 8; + pixel_y = 8 }, -/obj/effect/turf_decal/trimline/brown/filled, -/obj/structure/disposalpipe/trunk{ - dir = 1 +/obj/item/dest_tagger{ + pixel_x = -6; + pixel_y = 8 }, -/obj/structure/railing, -/turf/open/floor/iron, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/item/dest_tagger, +/obj/item/clothing/head/soft{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/structure/cable, +/obj/structure/table, +/turf/open/floor/iron/dark/textured, /area/station/cargo/sorting) "cHZ" = ( /obj/effect/turf_decal/tile/red/half/contrasted, @@ -9276,17 +10135,12 @@ /area/station/medical/morgue) "cIl" = ( /obj/machinery/disposal/bin, -/obj/machinery/camera/autoname/directional/south, /obj/machinery/light/directional/south, /obj/structure/disposalpipe/trunk{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) -"cIp" = ( -/obj/item/binoculars, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) "cIq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -9338,57 +10192,12 @@ specific_transport_id = "catwalk_ai" }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) -"cIH" = ( -/obj/machinery/light/directional/east, -/obj/structure/railing, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/engineering/storage) -"cIM" = ( -/obj/effect/turf_decal/trimline/yellow/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/dark, -/area/station/engineering/break_room) -"cIN" = ( -/obj/structure/table/reinforced, -/obj/item/stamp/denied{ - pixel_x = 7; - pixel_y = 8 - }, -/obj/item/stamp{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron, -/area/station/cargo/storage) +/area/station/ai/satellite/chamber) "cIT" = ( /obj/structure/lattice/catwalk, /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/openspace, /area/station/maintenance/port/aft) -"cIX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/footprints{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"cJb" = ( -/obj/item/trash/can, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port) "cJk" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/shrink_cw, /obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, @@ -9397,7 +10206,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/white/smooth_half, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "cJp" = ( /obj/item/kirbyplants/random, /obj/machinery/light/dim/directional/east, @@ -9434,11 +10243,6 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/wood, /area/station/security/detectives_office) -"cJE" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "cJI" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -9449,25 +10253,28 @@ /turf/closed/wall/r_wall, /area/station/security/prison) "cJK" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/warning{ - dir = 1 +/turf/open/floor/iron/dark/textured, +/area/station/cargo/sorting) +"cJZ" = ( +/obj/structure/chair/pew/right{ + dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"cJU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper{ - dir = 8 +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood, +/area/station/maintenance/starboard) +"cKa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock{ + id_tag = "Cabin7"; + name = "Cabin 7" }, -/obj/item/paper/crumpled{ - pixel_x = 2; - pixel_y = 6 +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) +/turf/open/floor/iron/dark/textured, +/area/station/commons/dorms) "cKc" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -9488,7 +10295,9 @@ /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 1 + }, /area/station/hallway/primary/central) "cKs" = ( /obj/effect/decal/cleanable/dirt, @@ -9502,22 +10311,19 @@ /obj/effect/decal/cleanable/generic, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) +"cKK" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/station/commons/dorms) "cKO" = ( /obj/structure/chair, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/start/prisoner, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) -"cKR" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/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/lobby) "cKX" = ( /obj/machinery/smartfridge, /obj/effect/turf_decal/tile/green/full, @@ -9545,10 +10351,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"cLq" = ( -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "cLF" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/red/filled/line, @@ -9560,17 +10362,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"cLP" = ( -/obj/structure/table/wood, -/obj/item/radio/intercom{ - broadcasting = 1; - dir = 8; - listening = 0; - name = "Station Intercom (Court)" - }, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/security/courtroom) "cLQ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -9580,6 +10371,16 @@ /obj/structure/stairs/north, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"cMj" = ( +/obj/machinery/vending/clothing, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "cMq" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/disposalpipe/segment{ @@ -9595,6 +10396,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/chapel) +"cME" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/structure/cable, +/obj/machinery/modular_computer/preset/engineering{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) "cMI" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -9604,24 +10415,30 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) -"cMW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 8; - name = "Waste Release" +"cMJ" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"cMR" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/large, +/area/station/engineering/lobby) "cMY" = ( /obj/effect/turf_decal/box/white{ color = "#9FED58" }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"cNl" = ( -/obj/effect/spawner/random/structure/tank_holder, +"cNf" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/structure/sign/warning/vacuum/directional/north, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/maintenance/aft) "cNq" = ( /obj/structure/table/wood, /obj/item/book/bible{ @@ -9630,11 +10447,12 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, /area/station/service/chapel) -"cNt" = ( -/obj/structure/sign/warning/radiation/rad_area, -/obj/structure/cable, -/turf/closed/wall/r_wall, -/area/station/engineering/main) +"cNr" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "cNu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -9649,20 +10467,13 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"cNH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"cNO" = ( +"cNK" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/lattice/catwalk, -/turf/open/water, -/area/station/maintenance/starboard/fore) +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "cNS" = ( /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 @@ -9676,25 +10487,63 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"cOf" = ( -/obj/structure/table/wood/poker, -/obj/item/wrench, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "cOg" = ( /obj/structure/cable, /obj/structure/table, /obj/item/storage/box/lights/mixed, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"cOj" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "cOm" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/freezer, /area/station/maintenance/port) +"cOr" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/light_switch/directional/south, +/obj/machinery/smartfridge/chemistry, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "cOu" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/station/solars/starboard/fore) +"cOz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/fore) +"cOE" = ( +/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/construction) +"cOJ" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/effect/decal/cleanable/glitter, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"cOP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/glass, +/area/station/maintenance/port) +"cOR" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "cOS" = ( /obj/item/radio/intercom/directional/north, /obj/machinery/camera/directional/north{ @@ -9709,6 +10558,7 @@ dir = 4 }, /obj/machinery/camera/autoname/directional/west, +/obj/machinery/newscaster/directional/south, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain/private) "cPk" = ( @@ -9725,8 +10575,18 @@ c_tag = "Medbay - Lower Virology East Hallway" }, /obj/item/radio/intercom/directional/east, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron/textured_large, /area/station/medical/virology) +"cPr" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "cPz" = ( /obj/structure/railing{ dir = 4 @@ -9742,20 +10602,27 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) -"cPW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +"cPB" = ( +/obj/structure/flora/tree/palm/style_random, +/turf/open/floor/iron/vaporwave, +/area/station/maintenance/starboard/aft/upper) +"cPD" = ( +/obj/effect/turf_decal/trimline/white/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, /obj/structure/disposalpipe/segment{ - dir = 6 + dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "cPX" = ( -/obj/machinery/status_display/ai/directional/east, +/obj/item/radio/intercom/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/turf/open/floor/carpet/black, +/area/station/ai/upload/chamber) "cPY" = ( /obj/machinery/door/airlock/research{ name = "Research and Development Lab" @@ -9776,6 +10643,24 @@ /obj/structure/chair/comfy/black, /turf/open/floor/glass, /area/station/security/brig) +"cQd" = ( +/obj/structure/table/glass, +/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/button/door/directional/east{ + id = "officecommissarydoor"; + name = "Office Door Lock"; + normaldoorcontrol = 1; + pixel_x = 0; + specialfunctions = 4 + }, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/office) +"cQi" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/engineering/atmos/office) "cQu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock/maintenance, @@ -9784,6 +10669,13 @@ /obj/effect/mapping_helpers/airlock/access/all/service/general, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) +"cQv" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "cQF" = ( /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /obj/machinery/door/firedoor, @@ -9801,26 +10693,25 @@ /turf/open/openspace, /area/station/maintenance/port/fore) "cRa" = ( -/obj/effect/turf_decal/siding/red, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/turf/open/floor/iron/dark, +/obj/item/kirbyplants/random, +/obj/structure/railing, +/turf/open/floor/wood/large, /area/station/hallway/primary/central) "cRb" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags{ - pixel_x = 7; - pixel_y = 12 - }, -/obj/item/emergency_bed{ - pixel_y = 8 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +/obj/machinery/door/airlock/public/glass{ + name = "Medbay" }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/obj/effect/turf_decal/tile/blue/full, +/obj/effect/landmark/navigate_destination/med, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "cRc" = ( /obj/structure/ladder, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -9829,9 +10720,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"cRk" = ( -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) "cRn" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -9843,7 +10731,6 @@ /turf/open/floor/iron/dark, /area/station/security/brig) "cRL" = ( -/obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/stairs/medium{ dir = 8 }, @@ -9859,6 +10746,7 @@ /obj/structure/disposalpipe/sorting/mail{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) "cRX" = ( @@ -9871,16 +10759,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) +"cRZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/warning/radiation/rad_area/directional/south, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "cSf" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/airalarm/directional/south, -/obj/machinery/conveyor{ - dir = 8; - id = "mining" - }, -/obj/structure/railing{ - dir = 1 - }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/cargo/miningoffice) "cSg" = ( @@ -9894,6 +10781,11 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"cSs" = ( +/obj/effect/spawner/structure/window, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "cSt" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 1 @@ -9919,6 +10811,7 @@ /area/station/science/research) "cSy" = ( /obj/structure/ladder, +/obj/effect/turf_decal/stripes/white/box, /turf/open/floor/plating, /area/station/maintenance/port) "cSA" = ( @@ -9927,6 +10820,16 @@ }, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"cSD" = ( +/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 = 9 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/science/research) "cSF" = ( /obj/structure/chair/office{ dir = 8 @@ -9935,6 +10838,11 @@ /obj/effect/landmark/start/bitrunner, /turf/open/floor/iron/dark/textured_large, /area/station/cargo/bitrunning/den) +"cSH" = ( +/obj/structure/chair/office, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "cSL" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -9947,11 +10855,6 @@ /turf/open/floor/iron, /area/station/science/lab) "cSN" = ( -/obj/structure/table, -/obj/item/clothing/head/utility/welding{ - pixel_x = -3; - pixel_y = 6 - }, /turf/open/floor/iron/checker, /area/station/maintenance/port/aft) "cSO" = ( @@ -9960,7 +10863,11 @@ /obj/structure/disposalpipe/junction/flip{ dir = 8 }, -/turf/open/floor/carpet, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "cSW" = ( /obj/structure/chair{ @@ -9988,18 +10895,20 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"cTv" = ( -/obj/effect/turf_decal/trimline/white/line{ - dir = 8 +"cTk" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark/smooth_half, +/area/station/service/library) +"cTo" = ( +/obj/machinery/computer/cargo{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/trimline/brown/arrow_ccw{ + dir = 1 }, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/storage) "cTJ" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/maintenance/two, @@ -10012,25 +10921,22 @@ }, /turf/open/floor/plating, /area/station/construction/storage_wing) -"cTL" = ( -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "N20 Multideck Adapter" - }, -/obj/machinery/meter{ - name = "N20 meter" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "cTR" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 1 }, /turf/open/floor/engine/hull, /area/space/nearstation) -"cTS" = ( -/obj/effect/spawner/random/engineering/tank, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/aft) +"cTU" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 10 + }, +/obj/machinery/pdapainter/medbay, +/turf/open/floor/holofloor/dark, +/area/station/command/heads_quarters/cmo) "cTW" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -10039,14 +10945,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"cTX" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Secure Tech Storage" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, -/obj/effect/mapping_helpers/airlock/access/all/command/general, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "cTZ" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/machinery/portable_atmospherics/canister/air, @@ -10055,30 +10953,21 @@ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "cUf" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/station/maintenance/port) -"cUi" = ( -/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/wood, -/area/station/command/heads_quarters/cmo) -"cUo" = ( -/obj/effect/turf_decal/siding{ - dir = 1 +"cUj" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 9 }, -/obj/effect/turf_decal/trimline/white/corner, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"cUl" = ( +/obj/structure/cable, +/turf/open/floor/iron/textured_edge, +/area/station/command/gateway) "cUp" = ( /obj/structure/table, /obj/item/clothing/suit/jacket/straight_jacket{ @@ -10135,8 +11024,8 @@ /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "cVi" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -10150,6 +11039,11 @@ /obj/effect/decal/cleanable/confetti, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"cVq" = ( +/obj/effect/spawner/random/structure/crate, +/obj/structure/sign/poster/contraband/hacking_guide/directional/south, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "cVr" = ( /obj/structure/chair/comfy/black{ dir = 1 @@ -10176,27 +11070,56 @@ /obj/structure/reagent_dispensers/wall/peppertank/directional/north, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"cVH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/lattice/catwalk, -/obj/structure/disposalpipe/segment{ - dir = 5 +"cVQ" = ( +/obj/structure/easel, +/obj/item/canvas/twentythree_twentythree{ + pixel_x = 3 + }, +/obj/item/canvas/twentythree_twentythree{ + pixel_x = 3 + }, +/obj/item/canvas/twentythree_twentythree{ + pixel_x = 3 }, +/obj/effect/turf_decal/tile/green/opposingcorners{ + dir = 1 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark, +/area/station/commons/storage/art) +"cVW" = ( +/obj/structure/lattice/catwalk, +/obj/effect/landmark/start/hangover, /turf/open/openspace, -/area/station/maintenance/starboard/aft) -"cVN" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 8 +/area/station/maintenance/starboard/upper) +"cWb" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/storage) +"cWc" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance" }, -/turf/open/floor/iron, -/area/station/commons/dorms) +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port) "cWd" = ( -/obj/structure/chair/comfy/brown{ - dir = 1 +/obj/structure/table/wood, +/obj/item/clipboard{ + pixel_x = 7; + pixel_y = 11 }, -/obj/effect/landmark/start/captain, -/turf/open/floor/carpet, +/obj/item/pinpointer/nuke{ + pixel_x = -7; + pixel_y = 5 + }, +/obj/effect/turf_decal/siding/wood/end, +/obj/item/disk/nuclear{ + pixel_x = 1; + pixel_y = -2 + }, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) "cWg" = ( /obj/structure/railing{ @@ -10230,7 +11153,17 @@ /obj/effect/turf_decal/siding/dark, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"cWr" = ( +/obj/structure/lattice/catwalk, +/obj/item/phone{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/structure/table, +/obj/machinery/airalarm/directional/south, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "cWt" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -10243,10 +11176,24 @@ dir = 8 }, /area/station/commons/lounge) -"cWG" = ( -/obj/machinery/vending/cola/pwr_game, -/turf/open/floor/wood, -/area/station/commons/dorms) +"cWu" = ( +/obj/structure/broken_flooring/singular/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"cWF" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"cWL" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/ai/upload/chamber) "cWN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -10255,9 +11202,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"cWU" = ( -/turf/closed/wall/r_wall, -/area/station/maintenance/starboard/aft) "cWW" = ( /obj/effect/turf_decal/trimline/red/arrow_ccw{ dir = 1 @@ -10273,6 +11217,20 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) +"cXd" = ( +/obj/item/radio/intercom/directional/north, +/obj/structure/bed/double, +/obj/item/bedsheet/cmo/double, +/turf/open/floor/carpet/cyan, +/area/station/command/heads_quarters/cmo) +"cXf" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/turf/open/floor/engine/hull, +/area/station/maintenance/starboard/upper) "cXj" = ( /obj/structure/table/reinforced/rglass, /obj/machinery/fax{ @@ -10281,19 +11239,24 @@ }, /turf/open/floor/glass, /area/station/security/brig) -"cXw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"cXk" = ( +/obj/structure/closet/emcloset, +/obj/machinery/airalarm/directional/west, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/engineering/atmos/office) +"cXm" = ( +/obj/effect/landmark/carpspawn, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"cXF" = ( +/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/obj/structure/disposalpipe/junction/yjunction{ - dir = 4 - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=7-Gateway"; - location = "6-Courtroom" - }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/washing_machine, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "cXM" = ( /obj/effect/mapping_helpers/airlock/access/all/service/general, /obj/machinery/door/airlock/maintenance{ @@ -10302,6 +11265,14 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"cXO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/firecloset, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "cXV" = ( /obj/machinery/vending/cigarette, /obj/machinery/firealarm/directional/east, @@ -10315,6 +11286,10 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/plating, /area/station/cargo/storage) +"cYn" = ( +/obj/effect/spawner/random/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "cYo" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/enzyme{ @@ -10338,21 +11313,6 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"cYq" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight{ - pixel_y = 14 - }, -/obj/item/storage/toolbox/mechanical, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"cYx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "cYB" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/lattice/catwalk, @@ -10371,7 +11331,7 @@ /obj/structure/ladder, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "cYT" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -10388,6 +11348,13 @@ dir = 1 }, /area/station/science/lab) +"cZg" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Freezer to Loop" + }, +/obj/effect/turf_decal/trimline/yellow, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "cZh" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -10413,6 +11380,11 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/openspace, /area/station/command/heads_quarters/rd) +"cZn" = ( +/obj/structure/musician/piano, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard/upper) "cZo" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -10424,12 +11396,42 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/maintenance/port) +"cZr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter) +"cZz" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"cZD" = ( +/obj/machinery/door/airlock{ + name = "Emergency Storage" + }, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "cZE" = ( /obj/effect/turf_decal/tile/dark/half/contrasted{ dir = 8 }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) +"cZI" = ( +/obj/structure/cable, +/turf/closed/wall, +/area/station/maintenance/starboard/fore/upper) "cZN" = ( /obj/structure/railing{ dir = 4 @@ -10452,20 +11454,11 @@ dir = 8 }, /area/station/science/ordnance/storage) -"dak" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/engine/hull/air, -/area/station/medical/chemistry) -"daw" = ( -/obj/structure/lattice/catwalk, -/obj/structure/filingcabinet, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/effect/spawner/random/bureaucracy/paper, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) +"dal" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "dax" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -10475,28 +11468,9 @@ /obj/structure/cable, /turf/open/floor/wood/large, /area/station/hallway/secondary/service) -"daz" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "daC" = ( /turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat_interior) -"daE" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/area/station/ai/satellite/interior) "daW" = ( /obj/structure/ladder, /obj/structure/sign/poster/contraband/space_cola/directional/north, @@ -10557,34 +11531,28 @@ }, /turf/open/floor/wood, /area/station/service/lawoffice) -"dbT" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 +"dch" = ( +/obj/structure/chair/office{ + dir = 1 }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"dcv" = ( -/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/security/detectives_office/private_investigators_office) +/obj/structure/sign/poster/contraband/pwr_game/directional/west, +/obj/machinery/light/small/directional/west, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "dcE" = ( /turf/open/space/basic, /area/space) +"dcO" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine, +/area/station/maintenance/starboard) "dde" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/port) -"ddh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/engineering/atmos/project) "ddr" = ( /obj/machinery/airalarm/directional/west, /obj/structure/cable, @@ -10599,21 +11567,13 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/science/zoo) -"ddw" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Chapel Office Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 +"ddu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"ddx" = ( -/obj/structure/disposalpipe/segment, -/obj/item/banner/command/mundane, -/turf/open/floor/plating, -/area/station/maintenance/port) +/turf/open/openspace, +/area/station/engineering/lobby) "ddz" = ( /obj/effect/turf_decal/siding/white, /obj/item/kirbyplants/organic/plant21{ @@ -10623,45 +11583,42 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"ddM" = ( -/obj/structure/cable, +"ddI" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/bin, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron, -/area/station/engineering/storage_shared) -"ddW" = ( -/obj/structure/railing, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/fore) "dea" = ( /obj/machinery/door/window/left/directional/west{ name = "Gateway Chamber" }, -/turf/open/floor/wood, +/turf/open/floor/iron/dark, /area/station/command/gateway) "deg" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, /area/station/cargo/sorting) "dej" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 }, -/obj/structure/closet/secure_closet/miner, -/obj/machinery/camera/directional/north{ - c_tag = "Cargo Bay - Mining" +/obj/effect/turf_decal/trimline/brown/arrow_ccw{ + dir = 10 }, -/obj/machinery/light/directional/north, /turf/open/floor/iron, -/area/station/cargo/miningoffice) +/area/station/hallway/primary/starboard) +"dep" = ( +/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/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "dex" = ( /obj/structure/railing/corner{ dir = 1 @@ -10674,6 +11631,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"dey" = ( +/obj/item/radio/intercom/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "deC" = ( /obj/structure/ladder, /obj/effect/decal/cleanable/dirt, @@ -10691,9 +11652,8 @@ /turf/open/floor/engine/hull/air, /area/station/maintenance/port) "deJ" = ( -/obj/effect/turf_decal/siding/green/corner{ - dir = 4 - }, +/obj/effect/turf_decal/siding/white, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "deR" = ( @@ -10729,11 +11689,18 @@ /turf/open/openspace, /area/station/hallway/primary/central) "dft" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/cigarette, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/iron, -/area/station/maintenance/starboard/central) +/obj/machinery/light_switch/directional/north, +/obj/structure/sign/clock/directional/east, +/obj/machinery/suit_storage_unit/mining/eva, +/obj/effect/turf_decal/siding/dark/end{ + dir = 1 + }, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/qm) +"dfy" = ( +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "dfC" = ( /obj/item/paper_bin{ pixel_x = -6; @@ -10761,30 +11728,14 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/hallway/secondary/entry) -"dfG" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"dfI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/main) "dfK" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance" }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, -/area/station/medical/coldroom) +/area/station/maintenance/department/medical) "dfL" = ( /obj/machinery/atmospherics/components/unary/portables_connector/layer4, /obj/machinery/portable_atmospherics/canister/oxygen, @@ -10792,11 +11743,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"dfO" = ( -/obj/structure/lattice/catwalk, -/obj/structure/sign/flag/nanotrasen/directional/north, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) "dfR" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -10811,12 +11757,15 @@ /obj/effect/turf_decal/box/white, /turf/open/floor/iron/dark/textured_corner, /area/station/science/ordnance/storage) -"dgm" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 +"dgl" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "dgy" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/trimline/purple/filled/line, @@ -10831,18 +11780,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/black, /area/station/medical/psychology) -"dgR" = ( -/obj/structure/table/reinforced, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/item/toy/crayon/spraycan, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +"dhf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet, +/obj/item/surgicaldrill, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/iron/white, +/area/station/maintenance/starboard) "dho" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -10861,6 +11805,10 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) +"dht" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "dhx" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/siding/wood{ @@ -10868,13 +11816,15 @@ }, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"dhL" = ( -/obj/effect/turf_decal/siding/brown, -/obj/structure/railing, -/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, +"dhy" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/upper) +"dhZ" = ( +/obj/structure/lattice, +/turf/open/openspace, /area/station/commons/dorms) "dic" = ( /obj/effect/turf_decal/trimline/dark_blue/corner{ @@ -10882,7 +11832,7 @@ }, /obj/machinery/light/directional/west, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dig" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -10925,7 +11875,7 @@ }, /obj/effect/turf_decal/siding/dark/corner, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dir" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -10974,14 +11924,6 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) -"diE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) "diJ" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/railing{ @@ -10998,28 +11940,34 @@ /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) "diP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/south, /obj/item/cigbutt, -/mob/living/simple_animal/bot/mulebot{ - name = "Old Yeller" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - location = "Cargo Storage" +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/machinery/suit_storage_unit/industrial/loader, +/obj/machinery/button/door/directional/south{ + id = "qm_warehouse"; + name = "Warehouse Shutters"; + pixel_x = -6 }, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) +"djc" = ( +/obj/item/radio/intercom/directional/east, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "dje" = ( /obj/structure/closet/secure_closet/engineering_electrical, /turf/open/floor/iron/smooth, /area/station/engineering/main) -"djf" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/medical/medbay/central) +"djn" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "djt" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -11042,13 +11990,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"djE" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "djG" = ( /obj/structure/lattice/catwalk, /obj/machinery/light_switch/directional/east, +/obj/machinery/firealarm/directional/south, /turf/open/openspace, /area/station/security/checkpoint/supply) "djL" = ( @@ -11058,6 +12003,20 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"djM" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/filingcabinet, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/floor/iron/dark/textured_large, +/area/station/maintenance/aft/upper) +"djX" = ( +/obj/effect/spawner/random/maintenance, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/upper) +"dkb" = ( +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "dkd" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -11066,9 +12025,14 @@ /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) "dkm" = ( +/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, -/turf/closed/wall/r_wall, -/area/station/command/meeting_room/council) +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "Bridge Blast Door" + }, +/turf/open/floor/plating, +/area/station/command/bridge) "dko" = ( /obj/structure/disposalpipe/sorting/mail{ dir = 8 @@ -11091,7 +12055,7 @@ /obj/machinery/light/directional/west, /obj/effect/spawner/random/armory/barrier_grenades/six, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "dkz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11110,14 +12074,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/security/courtroom) -"dkQ" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "dkY" = ( /obj/machinery/disposal/bin, /obj/machinery/light/directional/north, @@ -11143,14 +12099,6 @@ /obj/structure/disposalpipe/segment, /turf/open/openspace, /area/station/hallway/secondary/construction) -"dlk" = ( -/obj/structure/lattice, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) -"dll" = ( -/obj/machinery/microwave, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "dlo" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -11158,6 +12106,28 @@ "dlt" = ( /turf/open/floor/plating/airless, /area/station/maintenance/starboard/aft) +"dlv" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"dlx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/edge{ + dir = 1 + }, +/area/station/hallway/primary/central) +"dlK" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 + }, +/obj/structure/chair/stool/directional/east, +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "dlW" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/caution/stand_clear, @@ -11171,16 +12141,48 @@ /obj/effect/landmark/start/depsec/science, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"dmn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair{ +"dmj" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"dmk" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"dmn" = ( +/obj/machinery/light/warm/dim/directional/east, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "dmp" = ( /turf/open/floor/wood, /area/station/command/corporate_showroom) +"dmC" = ( +/obj/item/wrench, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/station/commons/dorms) +"dmI" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/lobby) "dmJ" = ( /obj/structure/table/wood, /obj/item/radio/intercom, @@ -11194,31 +12196,44 @@ /obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) +"dmM" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/morgue) "dmV" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"dnb" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Showers" - }, -/obj/structure/closet/radiation, -/obj/item/clothing/glasses/meson, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 8 - }, -/area/station/engineering/main) "dnj" = ( /obj/effect/spawner/random/structure/grille, /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"dno" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/machinery/light/very_dim/directional/south, +/obj/effect/turf_decal/stripes/red/box, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"dns" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) "dnx" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/security/court, @@ -11241,29 +12256,36 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/command/corporate_showroom) +"dnJ" = ( +/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, +/turf/open/floor/catwalk_floor/iron, +/area/station/commons/dorms) +"dnK" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos) "dnM" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, /turf/open/openspace, /area/station/medical/abandoned) -"dnO" = ( -/obj/structure/sign/warning/secure_area/directional/south, -/obj/structure/chair{ - dir = 4; - pixel_y = -2 - }, -/obj/item/binoculars, -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/lesser) "dnW" = ( /obj/effect/spawner/random/structure/chair_maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"dod" = ( -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/space/openspace, -/area/space/nearstation) "dol" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -11299,20 +12321,9 @@ /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) "dou" = ( -/obj/structure/lattice/catwalk, -/obj/structure/table/reinforced, -/obj/item/defibrillator/loaded{ - pixel_y = 6 - }, -/obj/item/defibrillator/loaded{ - pixel_y = 6 - }, -/obj/item/defibrillator/loaded{ - pixel_y = 6 - }, /obj/machinery/status_display/evac/directional/west, -/turf/open/openspace, -/area/station/medical/storage) +/turf/closed/wall/r_wall, +/area/station/medical/chemistry) "doy" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -11321,17 +12332,17 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "doA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/iron/dark/smooth_edge, -/area/station/medical/pharmacy) -"doH" = ( -/obj/item/trash/can{ - pixel_x = 3 +/obj/effect/landmark/start/chemist, +/obj/structure/chair/office/light, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "doK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11341,11 +12352,13 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) -"doL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall, -/area/station/maintenance/starboard/fore) +"doM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) "doO" = ( /obj/machinery/light/directional/north, /obj/machinery/airalarm/directional/north, @@ -11353,19 +12366,16 @@ /obj/machinery/cell_charger{ pixel_y = 3 }, -/obj/item/stock_parts/power_store/cell/high{ - charge = 100; - maxcharge = 15000; - pixel_y = 8 - }, /obj/item/stock_parts/power_store/cell/high{ charge = 100; maxcharge = 15000; pixel_y = 3 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/turf/open/floor/iron/textured, +/area/station/command/eva) "dpo" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -11389,10 +12399,9 @@ dir = 6 }, /obj/machinery/computer/shuttle/mining{ - dir = 1; - req_access = null + dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron, /area/station/cargo/miningoffice) "dpR" = ( @@ -11406,13 +12415,6 @@ /obj/item/binoculars, /turf/open/floor/engine/hull, /area/space/nearstation) -"dpT" = ( -/obj/effect/turf_decal/siding/brown, -/obj/structure/closet/lasertag/blue, -/obj/effect/landmark/start/hangover/closet, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "dpV" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -11447,16 +12449,6 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark, /area/station/science/lobby) -"dqo" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "dqB" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -11466,19 +12458,13 @@ dir = 1 }, /obj/machinery/light/small/directional/south, -/obj/structure/closet/crate, -/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) "dqC" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/security/interrogation) -"dqF" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/table, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) "dqH" = ( /obj/structure/table, /obj/item/gun/grenadelauncher{ @@ -11496,7 +12482,14 @@ /obj/machinery/light_switch/directional/north, /obj/machinery/light/directional/north, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) +"dqI" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "dqJ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -11509,10 +12502,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/chapel) +"dqP" = ( +/obj/machinery/light/warm/dim/directional/north, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/hallway/primary/central) "dqY" = ( /obj/machinery/camera/autoname/directional/west, /turf/open/openspace, /area/station/hallway/primary/aft) +"dqZ" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"dra" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "drb" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -11520,6 +12526,22 @@ /obj/machinery/vending/cigarette, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"drg" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/button/door/directional/south{ + id = "evashutter"; + name = "E.V.A. Storage Shutter Control"; + req_access = list("command") + }, +/turf/open/floor/iron/edge, +/area/station/hallway/primary/central) +"dri" = ( +/obj/structure/sign/poster/contraband/missing_gloves/directional/east, +/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/aft) "drk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11530,24 +12552,19 @@ /turf/open/floor/plating, /area/station/construction/storage_wing) "drn" = ( -/obj/effect/turf_decal/tile/red/opposingcorners{ +/obj/structure/chair/plastic{ dir = 1 }, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/wood/large, /area/station/hallway/primary/central) "drt" = ( /obj/structure/sign/poster/official/fruit_bowl/directional/north, /turf/open/floor/iron/white/smooth_large, /area/station/security/prison) -"drA" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/barricade/wooden/crude, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "drC" = ( /turf/open/floor/iron/stairs/medium{ dir = 8 @@ -11555,11 +12572,11 @@ /area/station/hallway/secondary/service) "drI" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "drJ" = ( /obj/structure/cable, @@ -11580,19 +12597,9 @@ }, /turf/open/floor/iron/checker, /area/station/service/bar) -"drW" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ - dir = 9 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "drX" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/eva) -"dsg" = ( -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/station/maintenance/starboard/lesser) +/area/station/command/eva) "dso" = ( /obj/structure/stairs/east, /obj/structure/railing, @@ -11605,17 +12612,13 @@ /turf/open/floor/engine/hull, /area/space/nearstation) "dsw" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/openspace, -/area/station/medical/storage) +/obj/structure/chair, +/turf/open/floor/glass, +/area/station/medical/patients_rooms/room_a) "dsx" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "dsD" = ( /obj/effect/turf_decal/siding/dark, /obj/effect/turf_decal/trimline/dark_blue/warning{ @@ -11627,11 +12630,16 @@ /obj/machinery/telecomms/broadcaster/preset_left, /turf/open/floor/iron/dark/textured_large, /area/station/tcommsat/server) -"dsR" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"dsN" = ( +/obj/machinery/door/airlock{ + name = "Unisex Showers" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/fluff/shower_drain, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "dsV" = ( /obj/structure/chair/comfy/beige{ dir = 8 @@ -11643,21 +12651,11 @@ /obj/structure/lattice, /turf/open/openspace, /area/station/hallway/primary/central) -"dsY" = ( -/obj/structure/lattice, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) -"dtj" = ( -/obj/machinery/light/directional/south, -/obj/machinery/shower/directional/east, -/obj/structure/fluff/shower_drain, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 4 - }, -/area/station/engineering/main) +"dsZ" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "dtn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11675,25 +12673,14 @@ dir = 1 }, /area/station/science/cytology) -"dto" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight/lamp, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"dtu" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "holodeck" +"dtv" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - Air Supply"; + name = "atmospherics camera" }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/obj/machinery/light/small/directional/north, +/turf/open/floor/engine/air, +/area/station/engineering/atmos/upper) "dtx" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -11701,12 +12688,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/central) -"dtC" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 +"dtL" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/computer/security{ + dir = 4 }, -/turf/open/openspace, -/area/station/engineering/lobby) +/obj/effect/turf_decal/tile/red/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "dtO" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 4 @@ -11715,10 +12704,23 @@ /turf/open/floor/iron/dark, /area/station/science/cytology) "dtP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/vacuum/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/obj/structure/sign/directions/medical/directional/east{ + dir = 2; + pixel_y = 9; + pixel_x = 0 + }, +/obj/structure/sign/directions/science/directional/east{ + dir = 2; + pixel_y = 3; + pixel_x = 0 + }, +/obj/structure/sign/directions/security/directional/east{ + dir = 2; + pixel_y = -3; + pixel_x = 0 + }, +/turf/closed/wall, +/area/station/commons/vacant_room/office) "dtR" = ( /obj/effect/decal/cleanable/food/egg_smudge{ pixel_x = -7; @@ -11726,6 +12728,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"dtT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/oil, +/obj/item/cigbutt{ + pixel_x = -12; + pixel_y = 11 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "dua" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -11735,32 +12747,20 @@ /obj/structure/table, /turf/open/openspace, /area/station/construction/storage_wing) -"dul" = ( -/obj/effect/turf_decal/bot_white, -/obj/structure/sign/warning/radiation/rad_area/directional/north, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/gravity_generator) -"duq" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) -"dux" = ( -/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/turf_decal/siding/brown/corner{ +"duf" = ( +/obj/machinery/computer/station_alert, +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/iron, -/area/station/commons/dorms) +/turf/open/floor/wood/large, +/area/station/engineering/lobby) +"duw" = ( +/obj/structure/rack, +/obj/item/circuitboard/computer/holodeck, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "duz" = ( -/obj/structure/table, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 }, @@ -11783,55 +12783,73 @@ pixel_x = -7; pixel_y = -1 }, +/obj/structure/table, +/obj/machinery/button/door/directional/east{ + id = "chemshutters"; + name = "Chemistry Shutters"; + req_access = list("pharmacy") + }, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) +"duC" = ( +/obj/structure/lattice, +/turf/open/openspace, +/area/station/maintenance/starboard/aft/upper) "duE" = ( -/obj/machinery/light_switch/directional/west{ - pixel_x = -24; - pixel_y = 27 +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/structure/cable, -/turf/open/floor/carpet, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) -"duQ" = ( -/obj/structure/sign/warning/vacuum/external/directional/east, -/obj/machinery/light/directional/west, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) +"duG" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/duct, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) "dvn" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/iron, /area/station/science/research) +"dvr" = ( +/obj/machinery/firealarm/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/atmospherics/pipe/layer_manifold/cyan/visible, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "dvs" = ( /obj/structure/sign/poster/contraband/random/directional/north, -/obj/item/storage/bag/trash/filled, /turf/open/floor/plating, /area/station/maintenance/disposal) -"dvu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/wood, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/item/pen/red{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 +"dvt" = ( +/obj/machinery/door/airlock{ + name = "Emergency Storage" }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/aft) "dvw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/floor/iron/dark, /area/station/science/ordnance) "dvK" = ( /obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/computer/security/mining{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/obj/machinery/airalarm/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/shaft_miner, +/obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/cargo/miningoffice) "dvL" = ( @@ -11846,6 +12864,18 @@ /obj/structure/flora/bush/pale/style_random, /turf/open/floor/grass, /area/station/hallway/primary/central) +"dwh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/arrow_ccw{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "dwi" = ( /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -11863,14 +12893,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"dwq" = ( -/obj/structure/ladder, -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "dwB" = ( /obj/structure/cable, /obj/structure/closet/syndicate{ @@ -11895,19 +12917,35 @@ }, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) -"dwP" = ( -/obj/effect/turf_decal/siding/blue/corner{ - dir = 1 +"dwQ" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room/upper) +"dwU" = ( +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "ceprivacy"; + name = "Chief Engineers Privacy Shutters" }, -/obj/machinery/iv_drip, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room/upper) +"dwY" = ( +/obj/structure/table, +/obj/item/clothing/under/costume/seifuku/tan{ + pixel_x = -14; + pixel_y = -2 }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 4 +/obj/item/trash/boritos{ + pixel_x = 1; + pixel_y = 9 }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/obj/item/clothing/glasses/sunglasses/gar/orange{ + pixel_x = 4 + }, +/obj/structure/sign/poster/contraband/energy_swords/directional/north, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/department/crew_quarters/dorms) "dxf" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -11915,32 +12953,14 @@ }, /turf/open/openspace, /area/station/hallway/secondary/exit/departure_lounge) -"dxh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/random/directional/north, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) -"dxv" = ( -/obj/machinery/atmospherics/pipe/multiz/orange/visible{ - dir = 8 - }, -/obj/machinery/meter, -/obj/structure/railing/corner, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "dxx" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) "dxA" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/wood, -/area/station/medical/medbay/central) +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "dxB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -11962,14 +12982,28 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"dxQ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing{ + 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/openspace, +/area/station/engineering/lobby) +"dxU" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "dyd" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/xenobiology) -"dyg" = ( -/obj/effect/landmark/event_spawn, -/turf/open/openspace, -/area/station/security/detectives_office) "dyi" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -11990,6 +13024,11 @@ /obj/machinery/suit_storage_unit/engine, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) +"dyu" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/spear, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "dyx" = ( /obj/machinery/door/airlock/public/glass{ name = "Farewell Room" @@ -12005,7 +13044,10 @@ "dyA" = ( /obj/machinery/light/directional/east, /obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark/textured_large, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/white, /area/station/medical/medbay/central) "dyE" = ( /obj/effect/turf_decal/stripes/corner{ @@ -12013,44 +13055,21 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) -"dyG" = ( -/obj/item/pickaxe{ - pixel_x = -5; - pixel_y = -7 - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/fore) +"dyM" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos/upper) "dyN" = ( /turf/open/openspace, /area/station/command/heads_quarters/rd) -"dyQ" = ( -/obj/item/radio/intercom/directional/east, -/obj/effect/landmark/firealarm_sanity, -/turf/open/floor/wood, -/area/station/commons/toilet/restrooms) "dyS" = ( -/obj/structure/chair/office{ - dir = 1 - }, /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/hangover, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"dzg" = ( -/obj/structure/rack, -/obj/item/clothing/head/utility/welding, -/obj/item/wrench, -/obj/item/weldingtool, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "dzj" = ( /obj/machinery/door/window/brigdoor/security/cell/left/directional/east{ id = "Cell 1"; @@ -12062,6 +13081,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) +"dzn" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating/airless, +/area/station/maintenance/aft/upper) "dzo" = ( /mob/living/basic/spider/giant/tarantula{ name = "Mr Johnson" @@ -12070,15 +13094,20 @@ /obj/effect/decal/cleanable/blood/xeno, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"dzt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/junction/yjunction{ +"dzw" = ( +/turf/open/floor/wood/large, +/area/station/engineering/lobby) +"dzx" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/north, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/turf/open/floor/iron/textured_edge{ dir = 1 }, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) -"dzx" = ( -/turf/open/floor/iron/dark, /area/station/command/gateway) "dzH" = ( /obj/machinery/camera/autoname/directional/north, @@ -12086,14 +13115,11 @@ /obj/machinery/light/directional/east, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"dzI" = ( -/turf/open/openspace, -/area/station/maintenance/starboard/fore) "dzK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "dzP" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12123,33 +13149,30 @@ /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) "dAV" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/item/radio/intercom/directional/south, -/obj/machinery/conveyor{ - dir = 8; - id = "mining" - }, -/obj/machinery/bouldertech/refinery/smelter, -/obj/structure/railing{ - dir = 1 +/obj/structure/sign/poster/random/directional/south, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 }, /turf/open/floor/iron, -/area/station/cargo/miningoffice) -"dAW" = ( -/obj/structure/sink/directional/east, -/obj/structure/mirror/directional/west, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) +/area/station/cargo/storage) +"dAY" = ( +/obj/machinery/door/firedoor/heavy, +/obj/machinery/door/airlock/highsecurity{ + name = "Controlled Hazard Chamber" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/medical/chemistry) "dBd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/item/radio/intercom/directional/north, /obj/effect/spawner/random/structure/musician/piano/random_piano, /turf/open/floor/iron/dark/diagonal, /area/station/service/theater) -"dBe" = ( -/obj/item/kirbyplants/photosynthetic, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "dBk" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -12163,6 +13186,14 @@ "dBm" = ( /turf/closed/wall, /area/station/hallway/primary/central) +"dBo" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/lobby) "dBp" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -12183,10 +13214,17 @@ /obj/item/reagent_containers/cup/bottle/sodium{ pixel_x = 1 }, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, /turf/open/floor/iron/dark/smooth_large, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) +"dBz" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/station/medical/virology) "dBB" = ( /obj/structure/lattice/catwalk, /obj/item/stack/rods, @@ -12197,10 +13235,15 @@ /obj/effect/spawner/random/structure/barricade, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"dBG" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/iron/dark, -/area/station/engineering/lobby) +"dBE" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/duct, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "dBM" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 @@ -12212,7 +13255,7 @@ /turf/open/floor/iron/dark/textured_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dCg" = ( /obj/effect/turf_decal/arrows/red{ dir = 4; @@ -12236,12 +13279,16 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/service/library) -"dCE" = ( -/obj/effect/turf_decal/siding/brown/end{ +"dCs" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 10 + }, +/obj/effect/turf_decal/siding/yellow{ dir = 4 }, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) +/turf/open/floor/iron, +/area/station/engineering/atmos/upper) "dCY" = ( /obj/machinery/door/firedoor, /turf/open/floor/engine/hull/air, @@ -12252,37 +13299,36 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) -"dDq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"dDg" = ( /obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/maintenance/starboard) +"dDx" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/turf/open/openspace, +/area/station/maintenance/aft/upper) +"dDG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/cigbutt{ + pixel_x = -12; + pixel_y = 15 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "dDL" = ( /obj/structure/lattice, /turf/open/space/openspace, /area/space/nearstation) -"dDO" = ( -/obj/structure/ladder, -/turf/open/floor/glass/reinforced, -/area/station/solars/starboard/fore) "dDS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/brig) -"dDV" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) -"dEg" = ( -/obj/structure/chair/sofa/left/brown, -/obj/item/flashlight, -/obj/structure/sign/poster/contraband/grey_tide/directional/north, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "dEk" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -12318,6 +13364,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"dEr" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "dEu" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -12357,11 +13407,6 @@ }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"dEX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "dEY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12375,15 +13420,15 @@ /obj/structure/railing/corner{ dir = 8 }, -/obj/machinery/door/airlock/medical{ - name = "Medbay Storage" - }, /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/access/all/medical/general, /obj/machinery/door/firedoor, -/turf/open/floor/iron/dark/textured_large, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/door/airlock/multi_tile/public/glass, +/obj/effect/mapping_helpers/airlock/access/any/medical/general, +/obj/effect/mapping_helpers/airlock/autoname, +/turf/open/floor/iron/white, /area/station/medical/medbay/central) "dFm" = ( /obj/structure/lattice/catwalk, @@ -12395,11 +13440,6 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) -"dFo" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "dFt" = ( /obj/structure/stairs/north, /turf/open/floor/iron, @@ -12414,20 +13454,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/medical/virology) -"dFT" = ( -/obj/effect/turf_decal/siding/brown, -/obj/structure/closet/lasertag/red, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"dFY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/cigbutt, -/obj/machinery/suit_storage_unit/atmos, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) "dFZ" = ( /obj/effect/turf_decal/siding/red, /turf/open/floor/wood, @@ -12438,24 +13464,11 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "dGi" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Abandoned Hallway" - }, -/obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 4 }, /turf/open/floor/iron, -/area/station/hallway/secondary/construction) -"dGm" = ( -/obj/effect/turf_decal/siding/dark{ - dir = 9 - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/morgue) +/area/station/hallway/primary/starboard) "dGu" = ( /obj/structure/frame/computer{ anchored = 1 @@ -12470,49 +13483,40 @@ /obj/effect/turf_decal/siding/blue{ dir = 1 }, +/obj/machinery/camera/autoname/directional/north, /turf/open/openspace, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "dGy" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 9 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) -"dGM" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/eighties, -/area/station/maintenance/starboard/fore) -"dGS" = ( /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/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Shared Storage" +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/turf_decal/trimline/blue/arrow_ccw{ + dir = 8 }, -/turf/open/floor/iron, -/area/station/engineering/lobby) -"dHb" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/item/encryptionkey/headset_service{ - pixel_y = 5 +/obj/effect/turf_decal/trimline/blue/arrow_cw{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"dHh" = ( -/obj/machinery/door/airlock{ - name = "Emergency Storage" +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) +"dGQ" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Primary Tool Storage" }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination/tools, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"dGX" = ( +/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/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard) +"dGY" = ( +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/main) "dHm" = ( /obj/machinery/door/airlock/virology{ name = "Abandoned Bathroom" @@ -12521,39 +13525,32 @@ /turf/open/floor/iron/freezer, /area/station/maintenance/port) "dHq" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/poddoor/shutters{ - id = "commissaryshutter"; - name = "Vacant Commissary Shutter" - }, -/obj/effect/turf_decal/tile/dark_green/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/office) -"dHC" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight, -/obj/item/pipe_dispenser, -/obj/item/analyzer, -/obj/item/storage/toolbox/mechanical, -/obj/item/pipe_dispenser, /obj/effect/turf_decal/stripes/line{ - dir = 9 + dir = 4 }, -/obj/item/pipe_dispenser{ - pixel_y = 8 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"dHK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/lattice/catwalk, -/obj/structure/sign/poster/contraband/singletank_bomb/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 9 +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 }, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) +/area/station/command/gateway) +"dHx" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) +"dHD" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) "dHL" = ( /turf/closed/wall, /area/station/maintenance/central) @@ -12564,11 +13561,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"dHS" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/commons/dorms) "dIt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12578,15 +13570,6 @@ }, /turf/open/floor/glass, /area/station/security/brig) -"dIB" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) "dIM" = ( /obj/structure/plasticflaps, /obj/machinery/conveyor/auto{ @@ -12599,9 +13582,8 @@ /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) "dIT" = ( -/obj/structure/lattice, -/turf/open/openspace, -/area/station/command/heads_quarters/cmo) +/turf/open/floor/glass, +/area/station/medical/medbay/central) "dIU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/shipping_container, @@ -12623,12 +13605,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/cafeteria) -"dJn" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 +"dJp" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 }, -/turf/open/floor/iron, -/area/station/engineering/lobby) +/turf/open/floor/plating/airless, +/area/station/maintenance/starboard/aft/upper) "dJt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12641,23 +13625,20 @@ /turf/open/floor/iron, /area/station/engineering/storage_shared) "dJC" = ( -/obj/machinery/door/airlock/mining{ - name = "Cargo Bay" +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/loading_area/red{ + dir = 4 }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, -/obj/machinery/door/poddoor/shutters/preopen{ - name = "Cargo Bay Shutters"; - id = "qm_cargobay"; +/turf/open/floor/iron/dark/smooth_edge{ dir = 8 }, -/turf/open/floor/plating, /area/station/cargo/storage) "dJE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction{ +/obj/effect/mapping_helpers/mail_sorting/medbay/chemistry, +/obj/structure/disposalpipe/sorting/mail{ dir = 4 }, /turf/open/floor/iron/white/textured_large, @@ -12665,19 +13646,26 @@ "dJF" = ( /obj/structure/railing/corner, /obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) +"dJH" = ( +/obj/machinery/door/airlock/command{ + name = "Auxiliary E.V.A. Storage" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "dJJ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, /turf/open/floor/engine, /area/station/service/hydroponics) -"dJR" = ( -/obj/effect/spawner/random/structure/girder, -/obj/effect/spawner/structure/electrified_grille, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "dJV" = ( /obj/machinery/camera/autoname/directional/east, /obj/machinery/vending/cigarette, @@ -12690,15 +13678,6 @@ "dJW" = ( /turf/open/floor/glass/reinforced/airless, /area/station/solars/starboard/aft) -"dKa" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/soda_cans/cola{ - pixel_x = -4; - pixel_y = 9 - }, -/obj/item/cigbutt, -/turf/open/floor/wood, -/area/station/commons/dorms) "dKq" = ( /obj/structure/mirror/directional/north, /obj/structure/sink/directional/south, @@ -12734,15 +13713,13 @@ /area/station/service/hydroponics) "dKu" = ( /obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/turf_decal/siding/blue{ dir = 1 }, +/obj/machinery/holopad, /turf/open/openspace, /area/station/medical/medbay/central) "dKv" = ( @@ -12759,10 +13736,11 @@ /area/station/commons/storage/art) "dKD" = ( /obj/structure/filingcabinet, -/obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) "dKG" = ( @@ -12772,22 +13750,38 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"dKH" = ( +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) "dKL" = ( -/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/structure/window/reinforced/spawner/directional/west, /obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/qm) +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"dKM" = ( +/obj/machinery/holopad, +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "dKN" = ( /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dKT" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 +/obj/machinery/conveyor{ + id = "mining" }, -/obj/structure/chair/sofa/middle/brown{ +/obj/structure/railing{ dir = 8 }, /turf/open/floor/iron/textured, @@ -12825,13 +13819,11 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"dLO" = ( -/obj/machinery/door/airlock/maintenance{ - name = "CE's Maintenance Access" - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, -/turf/open/floor/plating, -/area/station/engineering/lobby) +"dLS" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "dLU" = ( /obj/machinery/door/airlock/maintenance{ name = "Research Maintenance" @@ -12860,20 +13852,26 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/wood/tile, /area/station/service/abandoned_gambling_den) -"dMp" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/structure/closet/emcloset, -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/lesser) -"dMJ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 10 +"dMh" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) +"dMG" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "dMK" = ( /obj/structure/table/wood, /obj/item/instrument/guitar{ @@ -12913,10 +13911,10 @@ /turf/open/floor/iron, /area/station/hallway/primary/port) "dNc" = ( -/obj/item/kirbyplants/random, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/wood, +/obj/effect/turf_decal/siding/wood/corner, +/obj/machinery/camera/autoname/directional/west, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "dNj" = ( /obj/structure/cable, @@ -12938,16 +13936,12 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/service) -"dNu" = ( -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) -"dNw" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/obj/effect/spawner/random/maintenance/three, -/obj/item/circuitboard/machine/cyborgrecharger, -/obj/structure/sign/poster/contraband/energy_swords/directional/north, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/fore) +"dNx" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/box, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "dNA" = ( /obj/machinery/door/airlock{ id_tag = "courtlockdown"; @@ -12958,20 +13952,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/security/courtroom) -"dNL" = ( -/obj/item/bouquet/sunflower{ - pixel_y = 4 - }, -/obj/structure/table/reinforced, -/obj/structure/sign/poster/contraband/atmosia_independence/directional/north{ - desc = "Welcome."; - name = "Welcome." - }, -/obj/item/clothing/glasses/orange{ - pixel_y = 5 - }, -/turf/open/floor/iron/vaporwave, -/area/station/maintenance/starboard/lesser) "dNP" = ( /turf/open/floor/wood, /area/station/command/heads_quarters/rd) @@ -12997,7 +13977,9 @@ dir = 8 }, /obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 8 + }, /area/station/hallway/primary/central) "dNW" = ( /obj/machinery/modular_computer/preset/civilian, @@ -13035,11 +14017,6 @@ /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"dOl" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/turf/open/openspace, -/area/station/engineering/break_room) "dOm" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -13050,31 +14027,36 @@ }, /turf/open/openspace, /area/station/commons/fitness/recreation) -"dOq" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/lesser) -"dOr" = ( -/obj/machinery/smartfridge/organ, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 +"dOC" = ( +/obj/item/toy/cards/deck{ + pixel_y = 4 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) -"dOG" = ( -/obj/structure/cable, -/turf/closed/wall/r_wall, -/area/station/medical/medbay/central) +/obj/structure/table, +/obj/item/food/hotcrossbun{ + pixel_x = 10; + pixel_y = 12 + }, +/turf/open/floor/iron/large, +/area/station/engineering/lobby) +"dOE" = ( +/obj/structure/closet/emcloset, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 + }, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "dOH" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 4 }, -/obj/item/pushbroom, -/obj/structure/rack, -/obj/machinery/light/directional/east, -/obj/machinery/status_display/supply{ - pixel_x = 32 +/obj/machinery/door/firedoor/border_only{ + dir = 1 }, /turf/open/floor/iron, /area/station/cargo/storage) @@ -13090,15 +14072,51 @@ /obj/machinery/light/directional/south, /turf/open/openspace, /area/station/cargo/storage) -"dPu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"dPj" = ( +/obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/computer/atmos_alert, /obj/effect/turf_decal/tile/yellow/opposingcorners{ dir = 1 }, +/turf/open/floor/iron/checker, +/area/station/engineering/atmos/upper) +"dPl" = ( +/turf/open/floor/glass/airless, +/area/station/maintenance/aft) +"dPq" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/stack, +/obj/structure/fluff/paper/stack{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) +"dPv" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"dPC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) +/area/station/engineering/supermatter/room/upper) +"dPM" = ( +/obj/item/kirbyplants/random, +/obj/machinery/button/door/directional/east{ + id = "Cabin3"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "dPP" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/disposalpipe/trunk{ @@ -13109,14 +14127,17 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"dPQ" = ( -/obj/structure/railing, -/turf/open/openspace, -/area/station/engineering/storage_shared) "dPR" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"dQk" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/openspace, +/area/station/maintenance/starboard/upper) "dQx" = ( /obj/structure/railing{ dir = 4 @@ -13127,9 +14148,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"dQz" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/closet, +/obj/item/storage/box/lights/mixed, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) +"dQM" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "dQP" = ( /obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 1 + }, /area/station/hallway/primary/central) "dQQ" = ( /obj/effect/turf_decal/siding/dark/corner{ @@ -13144,7 +14179,7 @@ dir = 4 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dQV" = ( /obj/machinery/holopad, /turf/open/floor/iron, @@ -13170,18 +14205,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat/teleporter) -"dRk" = ( -/obj/effect/turf_decal/siding/blue/corner{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/station/command/bridge) +/area/station/ai/satellite/teleporter) "dRl" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/science/robotics) +"dRx" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/landmark/start/depsec/engineering, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) "dRU" = ( /obj/structure/table/wood, /obj/effect/spawner/random/maintenance, @@ -13201,6 +14239,12 @@ /obj/structure/cable, /turf/open/floor/grass, /area/station/hallway/secondary/entry) +"dSq" = ( +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft) "dSs" = ( /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/stripes/line{ @@ -13210,22 +14254,14 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/science/ordnance) -"dSy" = ( +"dSu" = ( /obj/structure/cable, -/obj/structure/closet/crate/engineering/electrical, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/stack/cable_coil, -/turf/open/floor/glass/reinforced, -/area/station/solars/starboard/fore) +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "dSA" = ( /obj/structure/railing{ dir = 1 @@ -13233,11 +14269,6 @@ /obj/structure/ladder, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"dSG" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/oil/slippery, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) "dSJ" = ( /obj/structure/sign/poster/official/cleanliness/directional/west, /obj/structure/disposalpipe/segment{ @@ -13253,27 +14284,25 @@ /obj/structure/ladder, /turf/open/floor/engine/hull/air, /area/station/maintenance/port) -"dSX" = ( -/obj/effect/decal/cleanable/dirt, +"dSY" = ( +/obj/structure/railing{ + dir = 8 + }, /obj/effect/spawner/random/maintenance, -/obj/effect/decal/cleanable/blood/oil, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"dTb" = ( -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/booze, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/aft/upper) +"dTa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "dTc" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, /turf/open/floor/iron, /area/station/science/research) -"dTi" = ( -/obj/effect/spawner/random/maintenance, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) "dTo" = ( /obj/structure/chair/pew{ dir = 8 @@ -13290,6 +14319,12 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/science/robotics/lab) +"dTs" = ( +/obj/machinery/duct, +/obj/effect/spawner/random/structure/grille, +/obj/effect/spawner/random/structure/barricade, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "dTv" = ( /obj/structure/table/reinforced, /obj/machinery/newscaster/directional/east, @@ -13302,8 +14337,16 @@ "dTL" = ( /turf/closed/wall, /area/station/commons/locker) -"dTT" = ( -/obj/structure/railing{ +"dTQ" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"dTT" = ( +/obj/structure/railing{ dir = 4 }, /obj/structure/lattice/catwalk, @@ -13313,16 +14356,25 @@ }, /turf/open/openspace, /area/station/science/xenobiology) +"dTX" = ( +/obj/machinery/computer/mech_bay_power_console, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/cigbutt{ + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "dUb" = ( /turf/open/openspace, /area/station/hallway/primary/central) "dUe" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) +/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/cargo/storage) "dUo" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ dir = 1 @@ -13331,35 +14383,20 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_edge, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "dUw" = ( -/obj/structure/closet/l3closet, -/obj/structure/railing, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) -"dUG" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/cup/soda_cans/monkey_energy{ - pixel_x = 8; - pixel_y = 16 - }, -/obj/item/stock_parts/power_store/cell/high{ - charge = 100; - maxcharge = 15000; - pixel_y = 6 +/obj/effect/turf_decal/siding/blue/corner{ + dir = 1 }, -/obj/item/cigbutt{ - pixel_x = -11; - pixel_y = 15 +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"dUH" = ( -/obj/machinery/vending/cola/pwr_game, -/turf/open/floor/eighties, -/area/station/engineering/lobby) +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"dUK" = ( +/obj/structure/disposalpipe/segment, +/turf/open/openspace, +/area/station/maintenance/starboard/upper) "dUN" = ( /obj/machinery/door/poddoor/shutters/window{ dir = 4; @@ -13369,7 +14406,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "dUP" = ( /obj/structure/flora/bush/pale/style_random, /obj/structure/flora/bush/ferny/style_random, @@ -13404,14 +14441,13 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"dVe" = ( -/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/electric_shock/directional/west, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +"dVd" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/commons/dorms) "dVh" = ( /obj/effect/turf_decal/trimline/yellow/arrow_cw{ dir = 8 @@ -13450,6 +14486,18 @@ }, /turf/open/floor/wood/large, /area/station/service/library) +"dVq" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 8 + }, +/obj/machinery/meter, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/sign/warning/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "dVs" = ( /obj/effect/turf_decal/siding/dark{ dir = 5 @@ -13469,14 +14517,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/openspace, /area/station/engineering/lobby) +"dVx" = ( +/obj/structure/closet/emcloset, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/sepia, +/area/station/hallway/secondary/construction) "dVL" = ( /turf/open/floor/iron/textured_large, /area/station/security/prison) -"dVM" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/custom_shuttle, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "dVO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/full, @@ -13497,32 +14545,25 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"dWg" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ +"dWe" = ( +/obj/structure/railing{ dir = 4 }, -/turf/open/floor/iron/smooth, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor/iron_dark, /area/station/engineering/atmos/upper) "dWi" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance" }, -/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/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, -/area/station/medical/coldroom) -"dWj" = ( -/obj/effect/spawner/random/decoration/showcase, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) +/area/station/maintenance/department/medical) "dWp" = ( /obj/effect/turf_decal/siding/blue{ dir = 1 @@ -13555,20 +14596,17 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"dWM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/reagent_containers/cup/beaker, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) "dXh" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L10" +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/dark_green/fourcorners, +/obj/machinery/door/poddoor/shutters{ + dir = 1; + id = "Lcommissaryshutter"; + name = "Vacant Commissary Shutter" }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/office) "dXi" = ( /obj/machinery/vending/cigarette, /turf/open/floor/engine/hull, @@ -13594,37 +14632,32 @@ /obj/structure/railing/corner{ dir = 4 }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/openspace, -/area/station/command/bridge) -"dXx" = ( -/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, +/area/station/command/meeting_room/council) +"dXq" = ( /obj/structure/lattice/catwalk, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/door/window/right/directional/west{ - name = "First Aid Supplies"; - req_access = list("medical") - }, +/obj/machinery/light/directional/north, /turf/open/openspace, -/area/station/medical/storage) +/area/station/engineering/supermatter/room/upper) +"dXu" = ( +/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 = 10 + }, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "dXy" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "dXA" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/all/engineering/aux_base, /turf/open/floor/plating, /area/station/maintenance/port/aft) @@ -13633,11 +14666,9 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/security/prison) -"dXD" = ( -/obj/structure/cable, -/obj/effect/spawner/random/trash/graffiti, -/turf/open/floor/plating, -/area/station/maintenance/port) +"dXE" = ( +/turf/open/floor/wood, +/area/station/maintenance/aft) "dXM" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -13647,12 +14678,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/warden) -"dXN" = ( -/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/starboard/aft) "dXP" = ( /obj/structure/chair/stool/bar/directional/west, /obj/effect/landmark/start/hangover, @@ -13673,12 +14698,6 @@ }, /turf/open/floor/iron, /area/station/science/research) -"dXY" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "dYa" = ( /obj/machinery/requests_console/directional/north{ department = "Chapel"; @@ -13700,11 +14719,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood/large, /area/station/hallway/primary/central) -"dYl" = ( -/obj/structure/weightmachine/weightlifter, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "dYq" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner, @@ -13738,21 +14752,18 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"dZd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +"dZn" = ( +/obj/machinery/button/door/incinerator_vent_atmos_aux{ + pixel_y = 24 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"dZs" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/fluff/paper/stack{ - dir = 4 +/obj/machinery/button/door/incinerator_vent_atmos_main{ + pixel_y = 40 }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) +/obj/machinery/button/ignition/incinerator/atmos{ + pixel_y = 9 + }, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/upper) "dZv" = ( /obj/structure/railing{ dir = 6 @@ -13773,7 +14784,7 @@ name = "AI Satellite Teleporter room" }, /turf/open/floor/catwalk_floor/iron_smooth, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "dZA" = ( /obj/machinery/light/floor, /turf/open/floor/carpet/black, @@ -13793,11 +14804,28 @@ /obj/structure/closet/crate/wooden/toy, /turf/open/floor/wood/large, /area/station/service/theater_dressing) +"dZI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/maintenance/starboard) +"dZJ" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/directional/south, +/turf/open/space/basic, +/area/space/nearstation) "dZM" = ( /obj/structure/girder/reinforced, /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"dZS" = ( +/obj/structure/sign/warning/radiation/rad_area/directional/east, +/obj/effect/spawner/random/engineering/atmospherics_portable, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/fore) "dZZ" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ dir = 1; @@ -13820,6 +14848,10 @@ "eaj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "Bridge Blast Door" + }, /turf/open/floor/plating, /area/station/hallway/secondary/command) "eak" = ( @@ -13830,36 +14862,15 @@ dir = 8 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "eao" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/east{ - name = "Cargo Desk"; - req_access = list("shipping") - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/arrows, +/turf/open/floor/iron/dark/textured_large, /area/station/cargo/sorting) "eap" = ( /turf/closed/wall, /area/station/hallway/secondary/entry) -"eas" = ( -/obj/machinery/wall_healer/directional/east, -/obj/machinery/camera/autoname/directional/east, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/medical) -"eaw" = ( -/obj/effect/turf_decal/siding/brown, -/obj/effect/turf_decal/siding/brown/corner{ - dir = 1 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) "eaL" = ( /obj/structure/table/reinforced, /obj/structure/displaycase/forsale{ @@ -13883,8 +14894,22 @@ /area/station/science/lobby) "eaM" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + dir = 8; + id = "commissaryshutter"; + name = "Vacant Commissary Shutter" + }, /turf/open/floor/plating, /area/station/commons/vacant_room/office) +"eaN" = ( +/obj/effect/turf_decal/trimline/white/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "eaO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -13894,68 +14919,42 @@ /obj/item/hemostat, /turf/open/floor/iron/white, /area/station/maintenance/hallway/abandoned_recreation) -"eaT" = ( -/obj/effect/turf_decal/siding/wood{ +"eaU" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/item/cigbutt, -/obj/effect/landmark/start/hangover, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "eaV" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) -"eaX" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 9 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "ebj" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp, /turf/open/floor/plating, /area/station/security/detectives_office/private_investigators_office) -"ebA" = ( -/obj/structure/chair/sofa/left/brown{ - dir = 8 +"ebK" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/assembly/flash/handheld{ + pixel_x = 7; + pixel_y = 2 }, -/obj/item/cigbutt{ - pixel_x = -8; - pixel_y = 4 +/obj/machinery/recharger{ + pixel_y = 3 }, -/obj/structure/sign/poster/contraband/kudzu/directional/east, -/turf/open/floor/eighties, -/area/station/maintenance/starboard/fore) -"ebC" = ( -/obj/effect/turf_decal/siding/brown, -/obj/structure/easel, -/obj/item/canvas/twentythree_twentythree, -/obj/item/canvas/twentythree_twentythree, -/obj/item/canvas/twentythree_twentythree, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"ebD" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/item/cigarette/cigar{ + pixel_x = -6; + pixel_y = 5 }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "ebL" = ( /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark/textured_corner, /area/station/science/ordnance/storage) -"ebM" = ( -/obj/structure/rack, -/obj/item/circuitboard/computer/holodeck, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "ebO" = ( /obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 4 @@ -13966,10 +14965,6 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"ebS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/ai_monitored/command/storage/eva) "ebY" = ( /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ @@ -13994,10 +14989,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"ech" = ( -/obj/machinery/camera/autoname/directional/west, -/turf/open/openspace, -/area/station/commons/dorms) "ecu" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -14020,6 +15011,19 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) +"ecz" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/firealarm/directional/west{ + pixel_y = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/light_switch/directional/west{ + pixel_y = -6 + }, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "ecB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/purple/filled/corner{ @@ -14037,7 +15041,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/white/smooth_corner, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "ecJ" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 4 @@ -14055,10 +15059,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"ecP" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "ecS" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -14091,51 +15091,28 @@ /area/station/science/lobby) "edf" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"edl" = ( -/obj/structure/lattice/catwalk, -/obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/water, -/area/station/maintenance/port/fore) -"eds" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/obj/structure/disposalpipe/segment{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ - dir = 6 - }, -/turf/open/floor/iron/corner{ - dir = 1 - }, -/area/station/hallway/secondary/exit/departure_lounge) -"edu" = ( -/obj/machinery/camera/autoname/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable/layer1, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +"edm" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/eighties, +/area/station/maintenance/department/crew_quarters/dorms) "edz" = ( /obj/effect/turf_decal/plaque{ - icon_state = "L11" - }, -/obj/effect/turf_decal/siding/green{ - dir = 1 + icon_state = "L12" }, +/obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) +"edC" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/turf_decal/siding/yellow, +/turf/open/floor/iron, +/area/station/engineering/atmos/upper) "edJ" = ( /obj/effect/landmark/start/assistant, /obj/structure/disposalpipe/segment{ @@ -14148,41 +15125,52 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) -"edY" = ( -/obj/effect/turf_decal/stripes/line{ +"edR" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ dir = 1 }, -/obj/structure/table/reinforced, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/meson{ - pixel_y = 8 - }, -/obj/item/clothing/glasses/meson{ - pixel_y = 8 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/turf/open/openspace, +/area/station/maintenance/starboard/upper) "eeb" = ( /obj/structure/chair/greyscale, /obj/effect/landmark/start/hangover, /turf/open/floor/glass/reinforced, /area/station/hallway/secondary/construction) -"eed" = ( -/obj/machinery/computer/atmos_control/carbon_tank, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 +"eeg" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) +"eeh" = ( +/obj/machinery/camera/autoname/directional/west, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/stripes/box, +/obj/structure/ladder, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"eej" = ( +/obj/structure/secure_safe/directional/south, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) +"eel" = ( +/obj/machinery/shower/directional/south, +/obj/structure/sink/directional/east, +/obj/structure/mirror/directional/west, +/obj/item/mail/junkmail{ + pixel_y = -6; + pixel_x = 4 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/turf/open/floor/iron/freezer, +/area/station/commons/dorms) "een" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/textured_large, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/white, /area/station/medical/medbay/central) "eeq" = ( /obj/structure/chair/office{ @@ -14199,23 +15187,26 @@ /obj/machinery/wall_healer/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"eeA" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ +"eeE" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/trimline/green/filled/corner{ dir = 1 }, -/obj/structure/cable, -/turf/open/floor/iron/dark/textured_edge, -/area/station/medical/morgue) +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/turf/open/floor/iron/textured_large, +/area/station/medical/virology) "eeH" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance" }, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, -/area/station/medical/coldroom) +/area/station/maintenance/department/medical) "eeN" = ( /obj/machinery/ntnet_relay, /obj/effect/turf_decal/siding/dark{ @@ -14223,11 +15214,38 @@ }, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"eeO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "eeW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/hallway/secondary/service) +"efc" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/department/crew_quarters/dorms) +"efg" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/obj/structure/table, +/obj/machinery/status_display/evac/directional/north, +/obj/item/paper_bin{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/item/pen{ + pixel_y = 5 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "efh" = ( /obj/item/cigbutt{ pixel_x = -9; @@ -14254,10 +15272,13 @@ /turf/open/floor/wood, /area/station/command/heads_quarters/hos) "efC" = ( -/obj/effect/turf_decal/siding/red{ - dir = 8 +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/floor/iron/dark, +/obj/item/paper_bin/bundlenatural, +/obj/item/pen, +/turf/open/floor/wood/large, /area/station/hallway/primary/central) "efD" = ( /obj/structure/extinguisher_cabinet/directional/east, @@ -14287,27 +15308,40 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"efM" = ( +/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/storage) "efN" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 }, -/obj/machinery/button/elevator{ - id = "catwalk_sec"; - pixel_y = 25 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/button/elevator/directional/north{ + id = "catwalk_sec" + }, /turf/open/floor/iron/dark, /area/station/security/brig) -"efZ" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) +"efQ" = ( +/obj/structure/railing/corner, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) "ega" = ( /obj/effect/spawner/random/maintenance, /turf/open/floor/plating/airless, /area/space/nearstation) +"egg" = ( +/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/plating, +/area/station/maintenance/starboard/fore/upper) "egi" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -14317,7 +15351,7 @@ /turf/open/floor/iron/dark/textured_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "egk" = ( /obj/item/trash/candy, /obj/structure/cable, @@ -14326,23 +15360,21 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) -"egp" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +"ego" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/trunk/multiz{ dir = 4 }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"egp" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) -"egr" = ( -/obj/structure/lattice/catwalk, -/obj/item/clothing/shoes/wheelys/rollerskates{ - pixel_x = 3; - pixel_y = -5 - }, -/turf/open/openspace, -/area/station/maintenance/starboard/fore) "egw" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/railing/corner{ @@ -14353,12 +15385,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/hallway/primary/central) -"egC" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +"egA" = ( +/obj/structure/table, +/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/supermatter/room/upper) "egD" = ( /obj/structure/table/reinforced, /turf/open/floor/engine/vacuum, @@ -14373,6 +15405,17 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) +"egH" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/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/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/science/lobby) "egK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14409,7 +15452,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ehi" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -14417,12 +15460,14 @@ }, /turf/open/floor/engine/hull/air, /area/station/hallway/primary/aft) -"ehO" = ( -/obj/item/trash/can{ - pixel_x = -8 +"ehu" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/engine, +/area/station/engineering/atmos/upper) "ehX" = ( /obj/effect/spawner/random/trash/garbage{ spawn_scatter_radius = 1 @@ -14435,10 +15480,13 @@ /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "ehZ" = ( -/obj/effect/turf_decal/siding/blue{ +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/siding/blue/corner{ dir = 1 }, -/obj/machinery/light/directional/south, +/obj/effect/turf_decal/arrows{ + dir = 8 + }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "eia" = ( @@ -14456,22 +15504,18 @@ dir = 4 }, /area/station/hallway/primary/fore) -"eij" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "eis" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/grime, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"eiu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark/smooth_large, +/area/station/science/explab) "eiW" = ( /obj/item/beacon, /turf/open/floor/engine/vacuum, @@ -14482,7 +15526,18 @@ /obj/item/paper_bin, /obj/item/pen, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"ejc" = ( +/obj/structure/cable, +/obj/structure/sign/nanotrasen{ + pixel_y = 32; + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "ejh" = ( /obj/effect/turf_decal/stripes/asteroid/corner, /obj/effect/spawner/random/engineering/atmospherics_portable, @@ -14491,13 +15546,25 @@ "ejo" = ( /turf/closed/wall, /area/station/science/xenobiology/hallway) -"ejA" = ( -/obj/machinery/space_heater, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +"ejz" = ( +/obj/machinery/computer/shuttle/mining{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"ejB" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper{ + dir = 4 + }, +/obj/structure/fluff/paper/stack{ + dir = 8 + }, +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/floor/wood, +/area/station/maintenance/aft) "ejP" = ( /obj/effect/turf_decal/siding/dark{ dir = 6 @@ -14506,7 +15573,7 @@ dir = 1 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ejQ" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -14562,22 +15629,20 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) -"eku" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/iron{ - amount = 30 +"ekw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"ekB" = ( -/obj/structure/bed, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/spawner/random/bedsheet, -/turf/open/floor/wood, +/turf/open/floor/iron/dark/smooth_large, /area/station/commons/dorms) +"ekH" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/toilet, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "ekL" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -14619,16 +15684,11 @@ name = "Inner Maintenance" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, /area/station/construction/storage_wing) -"els" = ( -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) "elw" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -14668,20 +15728,25 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) +"elH" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Catwalk Access" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "elO" = ( /obj/structure/chair/sofa/corp/corner{ dir = 4 }, /obj/item/radio/intercom/directional/north, /turf/open/floor/carpet/executive, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "elP" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/trinary/filter/atmos/co2, -/turf/open/floor/iron/dark, +/obj/machinery/cryo_cell, +/turf/open/floor/iron/dark/textured, /area/station/medical/cryo) "elS" = ( /obj/structure/closet/crate/trashcart/filled, @@ -14698,35 +15763,55 @@ /obj/structure/table, /turf/open/floor/engine/hull/air, /area/station/construction/storage_wing) +"emb" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) +"emd" = ( +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/glass/plasma, +/area/station/engineering/atmos/upper) "emh" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 10 }, -/obj/structure/table/reinforced, -/obj/item/storage/photo_album/qm, -/obj/structure/extinguisher_cabinet/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron/textured, /area/station/cargo/storage) "emj" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 3; - height = 8; - name = "Cargo Bay"; - shuttle_id = "cargo_home"; - width = 13 +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/arrows/red{ + dir = 4 }, -/turf/open/floor/engine/hull, -/area/space/nearstation) +/obj/effect/turf_decal/arrows/red{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/storage) "emn" = ( +/obj/structure/table/reinforced/rglass, /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 + dir = 6 + }, +/obj/item/book/manual/wiki/medicine{ + pixel_x = 1; + pixel_y = 5 }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ dir = 4 }, /turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) +/area/station/medical/medbay/central) "emE" = ( /obj/effect/turf_decal/siding/brown/corner{ dir = 8 @@ -14754,19 +15839,14 @@ /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) "emH" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ dir = 8 }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) -"emL" = ( -/obj/effect/turf_decal/siding/brown/end{ - dir = 1 - }, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) "emM" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -14776,39 +15856,37 @@ /turf/open/floor/iron, /area/station/science/robotics/lab) "emR" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +/obj/effect/turf_decal/bot_white, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/landmark/start/quartermaster, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) -"emS" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"enh" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/table, -/obj/item/paper_bin/carbon{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/item/book/manual/wiki/tcomms{ - pixel_x = 14; - pixel_y = 5 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark/textured_large, +/area/station/cargo/storage) +"ene" = ( +/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/opposingcorners{ + dir = 1 }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"enk" = ( +/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/opposingcorners{ dir = 1 }, -/obj/machinery/computer/security/telescreen/tcomms/directional/south{ - name = "Telecomms Camera Monitor" +/obj/structure/railing/corner/end{ + pixel_y = 2 }, /turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) +/area/station/engineering/storage/tech) "eny" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty{ @@ -14817,17 +15895,17 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/wood, /area/station/commons/storage/tools) +"enA" = ( +/obj/structure/lattice/catwalk, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/openspace, +/area/station/maintenance/aft/upper) "enE" = ( /obj/effect/turf_decal/siding/green/corner{ dir = 1 }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"enK" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "enN" = ( /obj/structure/urinal/directional/east, /obj/effect/decal/cleanable/dirt/dust, @@ -14841,6 +15919,11 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) +"enY" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "eoe" = ( /obj/vehicle/ridden/atv{ dir = 4; @@ -14848,6 +15931,17 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/greater) +"eoj" = ( +/obj/structure/window/spawner/directional/north, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay-office"; + name = "Medbay Shutters"; + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/computer/records/medical, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/office) "eoq" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -14860,6 +15954,11 @@ }, /turf/open/floor/iron/white, /area/station/maintenance/hallway/abandoned_recreation) +"eot" = ( +/obj/structure/girder, +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) "eoF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/decoration/paint, @@ -14879,6 +15978,15 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port) +"eoN" = ( +/obj/structure/lattice/catwalk, +/obj/structure/table, +/obj/item/stack/rods{ + pixel_y = 3 + }, +/obj/structure/sign/poster/contraband/lizard/directional/south, +/turf/open/openspace, +/area/station/maintenance/department/crew_quarters/dorms) "epi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14904,14 +16012,25 @@ /turf/open/floor/iron/dark/textured_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat/teleporter) -"epE" = ( -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/ferny/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/effect/landmark/event_spawn, -/turf/open/floor/grass, -/area/station/commons/dorms) +/area/station/ai/satellite/teleporter) +"epn" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Chapel Office" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/maintenance/starboard) +"epv" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/hot_temp/directional/south, +/turf/open/space/basic, +/area/space/nearstation) +"epH" = ( +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) "epR" = ( /obj/effect/turf_decal/trimline/dark_blue/line{ dir = 4 @@ -14926,7 +16045,7 @@ dir = 8 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "epY" = ( /obj/structure/plaque/static_plaque/golden/commission/efficiency{ pixel_y = 32 @@ -14947,6 +16066,7 @@ pixel_x = 3; pixel_y = 9 }, +/obj/effect/turf_decal/siding/green, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "eqi" = ( @@ -14969,11 +16089,6 @@ /obj/structure/closet/emcloset/anchored, /turf/open/floor/plating, /area/station/engineering/storage_shared) -"eqp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "eqt" = ( /obj/machinery/camera/autoname/directional/south, /turf/open/openspace, @@ -14985,13 +16100,21 @@ /obj/effect/turf_decal/siding/dark/corner, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "eqx" = ( /obj/structure/railing{ dir = 6 }, /turf/open/floor/engine/hull/air, /area/station/maintenance/port/aft) +"eqR" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/structure/cable, +/obj/effect/landmark/start/depsec/engineering, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) "eqU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -15013,32 +16136,17 @@ }, /turf/open/floor/wood/large, /area/station/hallway/primary/central) -"erj" = ( -/obj/structure/stairs/south, -/turf/open/floor/iron/stairs{ - dir = 1 - }, -/area/station/maintenance/starboard/lesser) "erp" = ( -/obj/structure/lattice, -/obj/machinery/camera/directional/west, -/turf/open/openspace, -/area/station/hallway/primary/central) -"err" = ( -/obj/structure/sign/poster/official/no_erp/directional/north, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) -"ers" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/obj/machinery/status_display/evac/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/dark_blue/opposingcorners, /obj/structure/cable, -/turf/open/floor/carpet, -/area/station/security/courtroom) +/turf/open/floor/iron/dark, +/area/station/command/bridge) "eru" = ( /obj/structure/stairs/east, /obj/structure/railing, +/obj/machinery/newscaster/directional/east, /turf/open/floor/iron/stairs/medium{ dir = 8 }, @@ -15060,7 +16168,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -15073,11 +16181,6 @@ /obj/structure/fake_stairs/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"erI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bookcase/random/religion, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) "erM" = ( /obj/machinery/vending/autodrobe, /obj/item/clothing/head/cone{ @@ -15098,25 +16201,36 @@ }, /turf/open/floor/wood/large, /area/station/service/theater_dressing) +"erV" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engine Room" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmoslowersm" + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "esb" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, /turf/open/floor/iron/dark, /area/station/security/medical) -"esk" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 6 +"esr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/skub{ + pixel_x = 7; + pixel_y = 18 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "esu" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, @@ -15132,27 +16246,39 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/construction) +"esD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) "esH" = ( /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/security/medical) -"eta" = ( -/obj/machinery/vending/coffee, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark/textured_large, +"esR" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/sign/warning/cold_temp/directional/east{ + name = "Cryogenics"; + pixel_x = 26 + }, +/turf/open/floor/iron/white, /area/station/medical/medbay/central) -"etf" = ( -/obj/machinery/door/airlock{ - id_tag = "Cabin7"; - name = "Cabin 1" +"eta" = ( +/obj/machinery/door/airlock/medical{ + name = "Medbay Storage" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/commons/dorms) +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/floor/iron/white, +/area/station/medical/storage) "etl" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -15170,28 +16296,26 @@ pixel_y = 3 }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "etp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/table, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron, -/area/station/maintenance/starboard/central) -"etu" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/shutters{ - id = "abandoned_kitchen"; - name = "Kitchen Shudders" +/obj/effect/turf_decal/stripes{ + dir = 1 }, -/obj/item/rag, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "etN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer4, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) +"etQ" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Malpractice Tower" + }, +/obj/effect/turf_decal/tile/green/full, +/obj/effect/mapping_helpers/airlock/access/all/medical/virology, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/virology) "etU" = ( /obj/structure/lattice/catwalk, /obj/structure/closet/crate/cardboard, @@ -15211,6 +16335,24 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/detectives_office/private_investigators_office) +"euu" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"eux" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - co2 Cell"; + name = "atmospherics camera" + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos/upper) "euD" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -15218,19 +16360,17 @@ "euG" = ( /turf/closed/wall, /area/station/cargo/bitrunning/den) +"euH" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/structure/stairs/south, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "euI" = ( /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/carpet, /area/station/maintenance/starboard/aft) -"euN" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/spawner/random/trash/cigbutt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood/tile, -/area/station/security/detectives_office/private_investigators_office) "eva" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/official/random/directional/west, @@ -15252,19 +16392,6 @@ /obj/effect/mapping_helpers/airlock/access/any/science/xenobio, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) -"evj" = ( -/obj/structure/chair/stool/directional/east, -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"evv" = ( -/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/layer5{ - dir = 8; - name = "air mixer" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "evC" = ( /obj/effect/turf_decal/trimline/yellow/arrow_cw{ dir = 8 @@ -15276,25 +16403,13 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) -"evH" = ( -/obj/structure/broken_flooring/singular/directional/east, -/obj/machinery/space_heater, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"evO" = ( -/turf/closed/wall/r_wall, -/area/station/maintenance/starboard/lesser) -"ewf" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 +"ewg" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 }, -/obj/machinery/airalarm/directional/east, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "ewi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15310,7 +16425,7 @@ pixel_x = 6 }, /turf/open/floor/grass, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ewl" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -15324,26 +16439,16 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) -"ewm" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/obj/machinery/power/energy_accumulator/tesla_coil/anchored{ - cable_layer = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 6 - }, -/obj/structure/cable/layer1, -/turf/open/floor/engine, -/area/station/engineering/supermatter) -"ewx" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/item/weldingtool/empty{ - pixel_x = -5; - pixel_y = -6 +"ewt" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/turf/open/floor/iron/edge, +/area/station/hallway/primary/central) +"ewu" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/aft/upper) "ewA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15353,7 +16458,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "ewD" = ( /turf/closed/wall, /area/station/service/cafeteria) @@ -15361,21 +16466,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"ewK" = ( -/obj/machinery/power/turbine/inlet_compressor{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"ewY" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "exb" = ( /obj/structure/lattice/catwalk, /obj/machinery/door/firedoor, @@ -15393,6 +16483,23 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"exk" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"exn" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "exo" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 @@ -15403,30 +16510,27 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/lab) -"exM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/item/stack/rods/two, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"exS" = ( -/obj/structure/railing{ +"exr" = ( +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "N2 Multideck Adapter"; dir = 8 }, -/obj/structure/table/glass, -/obj/machinery/digital_clock/directional/south, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/machinery/meter{ + name = "N2 meter" }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"exV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"exS" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "exY" = ( /obj/item/storage/box/evidence{ pixel_x = 7; @@ -15443,42 +16547,75 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"eyg" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/stack, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "eys" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/office) +"eyC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "eyD" = ( /obj/structure/toilet/greyscale{ pixel_y = 17 }, /turf/open/floor/iron/white/smooth_large, /area/station/security/prison) -"eza" = ( -/obj/structure/lattice/catwalk, -/obj/structure/ladder, -/obj/structure/railing{ - dir = 6 +"eyP" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/turf/open/openspace, -/area/station/commons/dorms) -"ezm" = ( +/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/holopad, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/qm) +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) +"eyQ" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/urinal/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard/upper) +"ezh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"ezm" = ( +/obj/structure/sign/poster/random/directional/south, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "ezq" = ( /obj/structure/reflector/single/anchored{ dir = 5 }, /turf/open/floor/iron/dark/textured, /area/station/engineering/supermatter/room) +"ezt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"ezz" = ( +/obj/structure/lattice/catwalk, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/aft/upper) "ezE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15489,12 +16626,6 @@ /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron, /area/station/engineering/lobby) -"ezL" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "ezP" = ( /obj/structure/training_machine, /obj/machinery/airalarm/directional/east, @@ -15503,16 +16634,11 @@ }, /turf/open/floor/engine, /area/station/science/auxlab/firing_range) -"ezT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "ezW" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 1 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) "ezX" = ( @@ -15523,33 +16649,35 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"eAd" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, +"ezY" = ( +/obj/structure/sign/warning/fire/directional/south, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) +"eAg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/station/command/heads_quarters/captain/private) +"eAh" = ( /obj/structure/railing{ - dir = 5 + dir = 1 }, -/obj/structure/railing/corner{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 4 }, +/obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/engineering/lobby) -"eAg" = ( -/obj/structure/table/wood, -/obj/item/clipboard{ - pixel_x = 7; - pixel_y = 11 - }, -/obj/machinery/recharger{ - pixel_x = -6; - pixel_y = 4 +"eAl" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 }, -/obj/item/toy/figure/captain{ - pixel_x = 7; - pixel_y = 10 +/obj/structure/railing{ + dir = 4 }, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) +/turf/open/floor/iron, +/area/station/engineering/lobby) "eAH" = ( /obj/effect/spawner/random/trash/garbage, /turf/open/floor/plating, @@ -15569,20 +16697,15 @@ /obj/effect/turf_decal/siding/blue/corner{ dir = 4 }, +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/railing{ + dir = 1 + }, /turf/open/openspace, /area/station/medical/medbay/central) -"eAP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet, -/obj/item/surgicaldrill, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/iron/white, -/area/station/maintenance/starboard/lesser) -"eAT" = ( -/obj/structure/lattice/catwalk, -/obj/effect/spawner/random/engineering/tank, -/turf/open/water, -/area/station/maintenance/port/fore) "eAV" = ( /obj/structure/railing/corner/end{ dir = 4 @@ -15601,27 +16724,29 @@ "eBc" = ( /obj/structure/table/reinforced/rglass, /turf/open/floor/carpet/executive, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "eBd" = ( /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"eBf" = ( -/obj/machinery/meter, -/obj/structure/grille, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 8 - }, -/turf/closed/wall/r_wall, -/area/station/maintenance/disposal/incinerator) +"eBi" = ( +/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/catwalk_floor, +/area/station/maintenance/starboard/fore) +"eBo" = ( +/turf/open/floor/iron, +/area/station/commons/locker) "eBt" = ( /obj/structure/tank_dispenser/oxygen{ pixel_x = -1; pixel_y = 2 }, /obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/carpet, +/turf/open/floor/carpet/purple, /area/station/command/gateway) "eBu" = ( /obj/structure/flora/bush/flowers_br/style_random, @@ -15643,6 +16768,22 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/wood, /area/station/security/detectives_office) +"eBD" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/firealarm/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"eBF" = ( +/obj/structure/chair/plastic{ + dir = 1 + }, +/turf/open/floor/engine/hull/air, +/area/station/commons/fitness/recreation) "eBP" = ( /obj/structure/cable, /obj/structure/mirror/broken/directional/west, @@ -15651,34 +16792,38 @@ /turf/open/floor/iron/cafeteria, /area/station/maintenance/port) "eBQ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/camera/autoname/directional/east, /obj/structure/cable, -/turf/open/floor/iron/dark/textured_corner{ - dir = 1 - }, +/turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) +"eBX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/oven, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard) "eBZ" = ( /obj/effect/spawner/random/structure/closet_empty/crate, /turf/open/floor/iron/checker, /area/station/maintenance/hallway/abandoned_recreation) -"eCu" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/structure/frame/computer{ - anchored = 1; - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) +"eCa" = ( +/obj/structure/frame/machine/secured, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron/dark, +/area/station/engineering/storage_shared) "eCy" = ( /obj/structure/lattice, /turf/open/floor/engine/hull, /area/space/nearstation) +"eCA" = ( +/obj/effect/turf_decal/siding/brown/corner, +/obj/structure/railing/corner, +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/commons/dorms) "eCD" = ( /obj/item/kirbyplants/random, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -15689,33 +16834,27 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"eCF" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/openspace, +/area/station/commons/dorms) "eCM" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/exotic/technology, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"eCO" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/stack{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "eCV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/construction/storage_wing) "eDj" = ( -/obj/machinery/camera/directional/north{ - c_tag = "AI Upload Chamber - Upper"; - network = list("aiupload") - }, +/obj/machinery/camera/autoname/motion/directional/north, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "eDl" = ( /obj/item/clothing/head/cone{ pixel_x = -7; @@ -15724,6 +16863,12 @@ /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"eDq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "eDr" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -15731,6 +16876,13 @@ /obj/effect/landmark/start/detective, /turf/open/floor/carpet, /area/station/security/detectives_office) +"eDI" = ( +/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/station/commons/dorms) "eDO" = ( /obj/machinery/telecomms/bus/preset_four, /obj/effect/turf_decal/tile/yellow/fourcorners, @@ -15738,13 +16890,43 @@ /obj/effect/mapping_helpers/airalarm/tlv_no_checks, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"eDP" = ( +/obj/effect/landmark/start/chief_engineer, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) +"eEf" = ( +/obj/structure/railing, +/obj/structure/table/wood, +/obj/item/folder/yellow{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/item/folder/blue{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/folder/red{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/folder{ + pixel_x = 2 + }, +/obj/item/taperecorder{ + pixel_x = -13; + pixel_y = 5 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/station/service/library/private) "eEi" = ( /obj/structure/ladder, /obj/machinery/light_switch/directional/south, /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "eEv" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/aft) @@ -15766,10 +16948,14 @@ }, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) -"eEN" = ( -/obj/effect/spawner/random/engineering/atmospherics_portable, +"eER" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/athletic_mixed, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/maintenance/starboard) "eES" = ( /obj/item/food/pie/cream, /obj/structure/closet/crate/coffin, @@ -15786,24 +16972,23 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) -"eEW" = ( -/obj/machinery/light/directional/north, -/obj/structure/lattice/catwalk, +"eFk" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, /obj/structure/cable, -/turf/open/openspace, -/area/station/engineering/atmos/project) -"eFm" = ( -/obj/structure/closet/radiation, -/obj/machinery/light/directional/west, -/turf/open/floor/engine, -/area/station/engineering/atmos/hfr_room) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "eFq" = ( -/obj/machinery/door/airlock/command{ - name = "Captain's Quarters" +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/command/captain, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "eFs" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/bot, @@ -15815,6 +17000,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/checker, /area/station/maintenance/hallway/abandoned_recreation) +"eFE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) "eFJ" = ( /obj/item/kirbyplants/photosynthetic, /obj/effect/turf_decal/trimline/dark_blue/filled/line{ @@ -15825,7 +17015,7 @@ }, /obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "eGc" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -15845,21 +17035,11 @@ /area/station/security/checkpoint/customs) "eGk" = ( /obj/structure/sign/plaques/kiddie/perfect_drone{ - pixel_y = 32 - }, -/turf/open/openspace, -/area/station/command/corporate_showroom) -"eGp" = ( -/obj/machinery/computer/station_alert{ + pixel_y = 32; dir = 1 }, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) -"eGq" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/camera/autoname/directional/east, /turf/open/openspace, -/area/station/engineering/break_room) +/area/station/command/corporate_showroom) "eGs" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15885,21 +17065,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"eGE" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/trimline/yellow/filled/end{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "eGM" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 +/obj/effect/turf_decal/siding/wood{ + dir = 4 }, -/obj/effect/landmark/start/paramedic, -/turf/open/openspace, -/area/station/medical/cryo) +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/cmo) "eGP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -15917,6 +17092,11 @@ /obj/item/reagent_containers/cup/bottle/morphine, /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) +"eHa" = ( +/obj/machinery/firealarm/directional/east, +/obj/structure/chair/sofa/corp/corner, +/turf/open/floor/carpet/blue, +/area/station/medical/break_room) "eHg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15938,27 +17118,11 @@ }, /turf/open/openspace, /area/station/hallway/primary/central) -"eHz" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/item/clothing/under/costume/seifuku/teal{ - pixel_x = -1; - pixel_y = -9 - }, -/obj/structure/table, -/obj/item/storage/fancy/cigarettes/cigpack_midori{ - pixel_x = 8; - pixel_y = 12 - }, -/obj/item/instrument/piano_synth/headphones{ - pixel_x = 3; - pixel_y = 5 - }, -/obj/structure/sign/poster/contraband/syndicate_pistol/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "eHF" = ( -/turf/open/floor/iron/solarpanel/airless, -/area/station/solars/starboard/fore) +/obj/structure/ladder, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/starboard/upper) "eHO" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/broken_flooring/pile/always_floorplane/directional/west, @@ -15974,7 +17138,17 @@ pixel_y = 6 }, /turf/open/floor/iron/white/textured_half, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"eHZ" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/machinery/door/airlock/engineering/glass{ + name = "Shared Engineering Storage" + }, +/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/dark/textured_large, +/area/station/engineering/storage) "eIh" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16008,6 +17182,11 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) +"eIq" = ( +/obj/effect/spawner/random/structure/crate, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) "eIs" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -16052,15 +17231,27 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) +"eIN" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "eIO" = ( /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) -"eIR" = ( -/obj/machinery/airalarm/directional/north, +"eIQ" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/station/commons/dorms) +/obj/structure/chair/sofa/left/brown{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"eJa" = ( +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/sorting) "eJb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16075,19 +17266,31 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) -"eJw" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ +"eJp" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ dir = 1 }, -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "N2 Multideck Adapter"; - dir = 8 +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) +"eJx" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 }, -/obj/machinery/meter{ - name = "N2 meter" +/obj/structure/railing/corner{ + dir = 1 }, -/turf/open/floor/iron/smooth, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, /area/station/engineering/atmos/upper) +"eJS" = ( +/obj/machinery/holopad, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "eJX" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -16098,97 +17301,46 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"eJZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/firecloset, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"eKc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/trash/moisture_trap, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "eKh" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, +/turf/closed/wall, +/area/station/medical/cryo) +"eKq" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Port to Engine" }, +/obj/effect/turf_decal/trimline/brown, /turf/open/floor/iron/dark, -/area/station/medical/cryo) +/area/station/engineering/supermatter/room/upper) "eKz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/lounge) -"eKF" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/structure/table, -/obj/item/clothing/shoes/magboots{ - desc = "Magnetic boots, for the solar enthusiasts. Idential to a regular magboot in everything but soul."; - name = "Solars' Magboots"; - pixel_x = -1; - pixel_y = 4 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 4; - pixel_y = 0 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam, -/obj/item/crowbar, -/obj/item/clothing/shoes/magboots, -/obj/item/clothing/shoes/magboots, -/obj/item/clothing/gloves/color/yellow{ - pixel_x = 0; - pixel_y = 3 - }, -/obj/item/clothing/ears/earmuffs{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/ears/earmuffs{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/machinery/camera/autoname/directional/west, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) -"eKH" = ( +"eKA" = ( /obj/structure/lattice/catwalk, -/obj/structure/table/reinforced, -/obj/item/storage/fancy/candle_box{ - pixel_x = 12; - pixel_y = 11 - }, -/obj/item/gun/syringe{ - desc = "The Holy Syringe Gun. Identical to the regular syringe gun. You have a feeling that you shouldn't touch this."; - name = "Holy Syringe Gun"; - pixel_x = -3; - pixel_y = 3 +/obj/effect/turf_decal/stripes/line, +/obj/structure/railing{ + dir = 1 }, /turf/open/openspace, -/area/station/medical/storage) +/area/station/engineering/supermatter/room/upper) "eKL" = ( -/obj/machinery/suit_storage_unit/ce, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/broken/directional/east, +/obj/structure/bed/maint, +/obj/effect/landmark/start/hangover, +/obj/structure/sign/clock/directional/east, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "eKW" = ( /obj/structure/railing, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "eLc" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -16203,17 +17355,6 @@ /obj/effect/landmark/start/security_officer, /turf/open/floor/iron/dark/smooth_large, /area/station/security/lockers) -"eLh" = ( -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos/project) "eLl" = ( /obj/machinery/door/airlock/command{ name = "Captain's Office" @@ -16223,7 +17364,8 @@ /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/command/captain, /obj/structure/disposalpipe/segment, -/turf/open/floor/carpet, +/obj/machinery/door/firedoor, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "eLp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16239,6 +17381,16 @@ "eLU" = ( /turf/closed/wall/r_wall, /area/station/command/gateway) +"eLV" = ( +/obj/item/storage/toolbox/artistic, +/obj/item/storage/toolbox/artistic, +/obj/structure/rack, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "eMa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -16247,25 +17399,18 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) "eMd" = ( -/obj/machinery/chem_master, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ +/obj/structure/chair/office/light{ dir = 1 }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, +/obj/effect/landmark/start/chemist, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) -"eMh" = ( -/obj/machinery/power/smes, -/obj/structure/cable, -/turf/open/floor/glass/reinforced, -/area/station/maintenance/solars/port/aft) +"eMf" = ( +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/effect/spawner/random/structure/closet_maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "eMi" = ( /obj/machinery/door/airlock/public/glass{ name = "Arrivals Lounge" @@ -16286,22 +17431,25 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) -"eMo" = ( -/obj/structure/table, -/obj/machinery/camera/autoname/directional/west, -/obj/structure/sign/departments/aisat/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) "eME" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/obj/structure/table, +/obj/item/book/manual/wiki/medicine{ + pixel_x = -7; + pixel_y = 7 }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ - dir = 4 +/obj/item/reagent_containers/dropper{ + pixel_y = 7 }, -/turf/open/floor/iron/dark/smooth_large, +/obj/item/clothing/neck/stethoscope{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/storage/pill_bottle/mannitol{ + pixel_x = -5; + pixel_y = 3 + }, +/turf/open/floor/iron/dark/textured, /area/station/medical/cryo) "eMI" = ( /obj/effect/spawner/structure/window/reinforced, @@ -16309,10 +17457,30 @@ /obj/effect/landmark/navigate_destination/sec, /turf/open/floor/plating, /area/station/security/brig) +"eMN" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/crayon{ + icon_state = "revolution"; + name = "graffiti"; + paint_colour = "#FF0000"; + pixel_y = 32 + }, +/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, +/area/station/maintenance/starboard/central/upper) "eNb" = ( /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/port) +"eNg" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace, +/area/station/commons/dorms) "eNz" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -16326,14 +17494,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/warden) -"eND" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/right/brown{ - dir = 4 - }, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) "eNE" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -16344,6 +17504,26 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/port) +"eNH" = ( +/obj/item/bedsheet/qm/double, +/obj/structure/bed/double, +/obj/effect/landmark/start/quartermaster, +/obj/item/stack/spacecash/c10{ + pixel_x = -5 + }, +/obj/item/toy/plush/lizard_plushie/greyscale{ + name = "Steals-The-Crates"; + pixel_y = 7 + }, +/obj/structure/cable, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/qm) "eNO" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -16378,13 +17558,6 @@ /mob/living/basic/pet/dog/pug/mcgriff, /turf/open/floor/iron/dark, /area/station/security/warden) -"eNY" = ( -/obj/structure/table/reinforced, -/obj/structure/disposalpipe/segment{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "eOa" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16392,17 +17565,22 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) -"eOh" = ( -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/commons/toilet/restrooms) -"eOn" = ( -/obj/item/cigbutt{ - pixel_x = -11; - pixel_y = -5 +"eOf" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/maintenance/starboard/fore/upper) +"eOh" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) "eOo" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -16417,29 +17595,14 @@ /turf/open/floor/plating, /area/station/engineering/supermatter/room) "eOx" = ( -/obj/structure/table, /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, -/obj/item/assembly/timer{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/item/assembly/igniter{ - pixel_x = 3; - pixel_y = -1 - }, -/obj/item/radio/headset/headset_med{ - pixel_x = 15; - pixel_y = 4 - }, /obj/machinery/camera/autoname/directional/south{ network = list("ss13","medbay"); c_tag = "Medbay - Lower Pharmacy" }, -/obj/machinery/button/door/directional/south{ - id = "chemshutters"; - name = "Chemistry Shutters" - }, +/obj/item/radio/intercom/directional/south, +/obj/machinery/chem_master, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "eOA" = ( @@ -16455,31 +17618,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/medical/virology) -"eOB" = ( -/obj/structure/flora/bush/jungle{ - pixel_y = -7 - }, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/ladder, -/turf/open/floor/grass, -/area/station/maintenance/starboard/fore) -"eOD" = ( -/obj/structure/rack, -/obj/machinery/firealarm/directional/south, -/obj/effect/spawner/random/techstorage/rnd_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "eOG" = ( /obj/effect/mapping_helpers/damaged_window, /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/security/detectives_office/private_investigators_office) -"eOM" = ( -/obj/structure/broken_flooring/corner/directional/west, -/obj/effect/decal/cleanable/dirt, +"eOH" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 1; + pixel_y = -2 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) +/area/station/maintenance/starboard) "eOS" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/official/random/directional/south, @@ -16492,19 +17646,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"ePm" = ( -/obj/structure/rack, -/obj/item/radio{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/radio{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/radio, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "ePn" = ( /obj/structure/mop_bucket/janitorialcart{ dir = 4 @@ -16512,32 +17653,38 @@ /obj/effect/turf_decal/tile/purple/full, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) -"ePM" = ( -/obj/structure/railing, -/obj/effect/decal/cleanable/dirt, +"ePz" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/transit_tube/station/dispenser/flipped{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, /turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) -"ePT" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance" +/area/station/engineering/transit_tube) +"ePI" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"ePX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"ePT" = ( /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/dark, -/area/station/engineering/atmos/hfr_room) -"eQg" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/obj/machinery/door/airlock/medical, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "eQj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -16573,24 +17720,21 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) +"eQC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard) "eQF" = ( /turf/open/floor/iron, /area/station/commons/storage/primary) -"eQO" = ( -/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 = 2 - }, -/obj/machinery/light/directional/west, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +"eQZ" = ( +/obj/item/radio/intercom/directional/south, +/obj/structure/closet/crate/trashcart/laundry, +/obj/effect/spawner/random/clothing/costume, +/obj/effect/spawner/random/clothing/backpack, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "eRb" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock" @@ -16601,37 +17745,29 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) -"eRd" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 +"eRc" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 }, -/obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"eRg" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Chapel Office Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 +/area/station/commons/fitness/recreation) +"eRd" = ( +/obj/effect/turf_decal/siding/green{ + dir = 1 }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) -"eRm" = ( -/obj/machinery/disposal/bin, -/obj/machinery/light/directional/east, -/obj/machinery/newscaster/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/trunk{ - dir = 8 +/obj/effect/turf_decal/plaque{ + icon_state = "L7" }, -/turf/open/floor/plating, -/area/station/commons/dorms) +/obj/effect/landmark/observer_start, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "eRs" = ( -/obj/effect/turf_decal/siding/green, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L5" }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) @@ -16657,17 +17793,16 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) "eRC" = ( -/obj/structure/table, -/obj/item/rag{ - pixel_x = 2; - pixel_y = 5 - }, -/obj/item/reagent_containers/cup/bucket{ - pixel_x = -7; - pixel_y = 12 +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "HoPsToy"; + name = "Loading Conveyor"; + pixel_y = 8 }, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/wood, +/turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) "eRE" = ( /obj/structure/displaycase/labcage, @@ -16691,21 +17826,19 @@ }, /turf/open/floor/iron/dark, /area/station/security/warden) -"eRR" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/security_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"eRT" = ( -/obj/effect/turf_decal/stripes/line{ +"eRO" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port to Engine"; 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/effect/turf_decal/trimline/brown, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"eRT" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 }, +/obj/machinery/iv_drip, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) "eRX" = ( @@ -16727,13 +17860,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/construction/storage_wing) -"eSh" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/structure/closet/radiation, -/turf/open/floor/iron, -/area/station/engineering/lobby) +"eSk" = ( +/obj/structure/railing/corner, +/obj/structure/railing, +/obj/structure/lattice/catwalk, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "eSm" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -16757,20 +17889,34 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"eSK" = ( -/obj/structure/disposalpipe/sorting/mail{ - dir = 1 +"eSG" = ( +/obj/effect/turf_decal/siding, +/obj/effect/turf_decal/trimline/white/line{ + dir = 8; + pixel_x = 8 }, -/obj/effect/mapping_helpers/mail_sorting/supply/disposals, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) -"eSO" = ( -/obj/structure/sign/warning/electric_shock/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) +"eSI" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/obj/effect/turf_decal/siding/yellow, +/turf/open/floor/iron, +/area/station/engineering/atmos/upper) +"eSK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/sorting) "eSV" = ( /obj/structure/railing/corner, /obj/effect/turf_decal/siding/brown/corner, @@ -16781,18 +17927,29 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"eSW" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, +"eSY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/lattice/catwalk, /obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/lobby) +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "eTe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) +"eTi" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/engineering/atmos/hfr_room) +"eTm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/wall_healer/directional/south, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "eTr" = ( /obj/machinery/door/airlock/grunge{ name = "Under The Stairs" @@ -16800,25 +17957,18 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/iron, /area/station/maintenance/department/medical) -"eTt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/openspace, -/area/station/engineering/atmos/project) "eTD" = ( -/obj/structure/closet/secure_closet/chief_medical, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/obj/machinery/vending/medical, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "eTG" = ( /obj/structure/table, /obj/machinery/coffeemaker/impressa{ @@ -16843,14 +17993,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/service/cafeteria) +"eTP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/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/openspace, +/area/station/engineering/lobby) "eTY" = ( /turf/open/floor/iron/freezer, /area/station/maintenance/port) -"eTZ" = ( -/obj/machinery/light_switch/directional/east, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "eUa" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -16861,22 +18017,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) -"eUh" = ( -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_x = 5; - pixel_y = -3 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"eUl" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) "eUr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16902,6 +18042,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/service/cafeteria) +"eUQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/modular_computer/preset/cargochat/medical{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"eUT" = ( +/obj/effect/spawner/random/engineering/tank, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/aft/upper) "eUV" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -16964,12 +18120,16 @@ }, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) -"eVu" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 +"eVr" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "chemshutters"; + name = "Pharmacy Shutters" }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/turf/open/floor/plating, +/area/station/medical/pharmacy) "eVx" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/wood/corner{ @@ -16978,12 +18138,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"eVy" = ( -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "eVF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17006,22 +18160,53 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/wood/tile, /area/station/maintenance/port/aft) -"eWb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"eWq" = ( +"eVY" = ( /obj/structure/cable, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/project) -"eWt" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/box/white, -/turf/open/floor/iron/dark/textured_corner{ - dir = 1 +/obj/item/stack/sticky_tape{ + pixel_x = 12; + pixel_y = 14 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "!"; + pixel_x = 2; + pixel_y = 29 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "!"; + pixel_x = -5; + pixel_y = 27 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) +"eWb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"eWc" = ( +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/stripes{ + dir = 6 + }, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) +"eWn" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Secure Tech Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/storage/tech) +"eWt" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/box/white, +/turf/open/floor/iron/dark/textured_corner{ + dir = 1 }, /area/station/science/ordnance/storage) "eWA" = ( @@ -17032,6 +18217,13 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) +"eWD" = ( +/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/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/lobby) "eWJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17042,34 +18234,56 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/openspace, /area/station/science/genetics) +"eWS" = ( +/obj/effect/spawner/random/structure/chair_flipped{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) +"eWU" = ( +/obj/machinery/holopad, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "eWW" = ( /obj/structure/railing, /obj/effect/turf_decal/trimline/yellow/warning, /turf/open/floor/engine/hull, /area/space/nearstation) +"eWZ" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/camera/autoname/directional/west, +/obj/structure/railing{ + dir = 4 + }, +/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/west, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "eXe" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, /turf/open/floor/iron/dark, /area/station/science/lobby) -"eXf" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/cable/layer1, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "eXp" = ( -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) +"eXq" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "eXw" = ( /obj/structure/table/optable, /obj/effect/turf_decal/tile/purple/half{ @@ -17089,6 +18303,17 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/glass/reinforced, /area/station/service/library) +"eXz" = ( +/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/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "eXF" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -17111,16 +18336,38 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/dark/textured_half, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) +"eXJ" = ( +/obj/machinery/computer/apc_control{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/siding/yellow{ + dir = 9 + }, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "eXS" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) -"eYe" = ( -/obj/structure/displaycase/captain{ - pixel_y = 5 +"eXT" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/turf/open/floor/carpet, +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Quartermaster's Office"; + name = "Quartermaster's Fax Machine" + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) +"eYe" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) "eYm" = ( /obj/effect/turf_decal/stripes/line{ @@ -17146,21 +18393,16 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"eYH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) +"eYN" = ( +/obj/structure/chair/office{ + dir = 3 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/security/checkpoint/engineering) "eYP" = ( /obj/structure/showcase/machinery/tv/broken, /turf/open/floor/plating, /area/station/maintenance/port) -"eYS" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "eZd" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/machinery/vending/coffee{ @@ -17169,11 +18411,12 @@ fair_market_price = 0; name = "\improper Jim Norton's Quebecois Coffee" }, -/obj/structure/disposalpipe/broken{ - dir = 8 - }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"eZk" = ( +/obj/effect/spawner/random/trash/cigbutt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "eZt" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -17199,16 +18442,18 @@ dir = 1 }, /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, +/obj/structure/sign/departments/chemistry/pharmacy/directional/east, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "eZF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/firecloset, -/turf/open/floor/iron, -/area/station/maintenance/starboard/central) +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "eZL" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -17223,10 +18468,70 @@ }, /turf/open/openspace, /area/station/commons/fitness/recreation) -"eZV" = ( -/obj/structure/cable, +"eZT" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/structure/closet/crate/science, +/obj/item/reagent_containers/cup/bottle/epinephrine{ + pixel_x = 6; + pixel_y = -6 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = -2; + pixel_y = -7 + }, +/obj/item/reagent_containers/dropper{ + pixel_x = 2; + pixel_y = -11 + }, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"eZU" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/table, +/obj/item/clothing/shoes/magboots{ + desc = "Magnetic boots, for the solar enthusiasts. Idential to a regular magboot in everything but soul."; + name = "Solars' Magboots"; + pixel_x = -1; + pixel_y = 4 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = 4; + pixel_y = 0 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/crowbar, +/obj/item/clothing/shoes/magboots, +/obj/item/clothing/shoes/magboots, +/obj/item/clothing/gloves/color/yellow{ + pixel_x = 0; + pixel_y = 3 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/machinery/camera/autoname/directional/west, +/obj/item/clothing/ears/earmuffs{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/item/tank/jetpack{ + pixel_y = 4 + }, +/obj/machinery/light/directional/west, +/obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) +/area/station/engineering/engine_smes) "fai" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -17247,15 +18552,14 @@ }, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"faw" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ +"fbe" = ( +/obj/structure/bed, +/obj/item/bedsheet/ce, +/obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Air to Distro" - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) "fbk" = ( /turf/open/floor/plating, /area/station/engineering/transit_tube) @@ -17277,6 +18581,10 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) +"fbq" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) "fbu" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/oxygen_input, /turf/open/floor/engine/o2, @@ -17304,40 +18612,21 @@ dir = 8 }, /area/station/command/corporate_showroom) -"fbK" = ( -/obj/structure/sign/poster/contraband/donk_co, -/turf/closed/wall, -/area/station/maintenance/port) "fch" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 1 +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 4 }, -/turf/open/floor/iron/white/textured, -/area/station/medical/surgery) +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "fcn" = ( /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/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) -"fct" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/mapping_helpers/mail_sorting/engineering/ce_office, -/obj/structure/disposalpipe/sorting/mail{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "fcw" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/full, @@ -17359,21 +18648,13 @@ "fcK" = ( /turf/closed/wall/r_wall, /area/station/security/detectives_office/private_investigators_office) -"fcT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "fdb" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/white, +/area/station/medical/office) "fdd" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/security/eva) @@ -17388,23 +18669,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"fdz" = ( +/obj/effect/turf_decal/siding/purple/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/purple/corner, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/science/lab) "fdE" = ( /obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, /turf/open/floor/engine, /area/station/science/xenobiology) -"fdI" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/structure/fluff/paper/stack{ - dir = 5 - }, -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/item/camera_film, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "fdJ" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/railing{ @@ -17421,6 +18706,12 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) +"fdN" = ( +/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/textured, +/area/station/commons/dorms) "fdT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17430,11 +18721,24 @@ }, /turf/open/floor/glass, /area/station/science/zoo) +"fdV" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) +"fef" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/urinal/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "fei" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/door/airlock/research/glass{ - name = "Slime Euthanization Chamber" +/obj/machinery/door/airlock/research{ + glass = 1; + name = "Slime Euthanization Chamber"; + opacity = 0 }, +/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, +/obj/structure/plasticflaps/kitchen, /turf/open/floor/engine, /area/station/science/xenobiology) "feA" = ( @@ -17446,12 +18750,7 @@ /area/station/maintenance/port/aft) "feE" = ( /obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/sign/departments/medbay/alt/directional/south, /turf/open/openspace, /area/station/medical/medbay/central) "feJ" = ( @@ -17459,23 +18758,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/ai) -"feR" = ( -/obj/effect/spawner/random/trash/grime, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"ffj" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/area/station/ai/satellite/chamber) +"feM" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"ffg" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 }, -/obj/structure/disposalpipe/segment{ - dir = 6 +/obj/structure/chair/office{ + dir = 3 }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) "ffp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -17483,9 +18780,19 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs) -"ffr" = ( -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/fore) +"ffs" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/bot_red, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "ffC" = ( /obj/machinery/atmospherics/components/trinary/mixer/flipped{ dir = 8 @@ -17493,11 +18800,13 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark/textured_half, /area/station/science/ordnance/storage) -"ffI" = ( -/obj/item/statuebust, -/obj/machinery/light/cold/no_nightlight/directional/west, -/turf/open/floor/iron/vaporwave, -/area/station/maintenance/starboard/lesser) +"ffE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/closet/firecloset, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "ffN" = ( /obj/structure/stairs/north, /turf/open/floor/wood, @@ -17512,10 +18821,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/science/lab) -"ffR" = ( -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron, -/area/station/commons/dorms) "ffT" = ( /obj/structure/railing/corner/end/flip, /obj/effect/turf_decal/stripes/corner, @@ -17537,19 +18842,9 @@ "fgd" = ( /obj/structure/table/glass, /obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/west{ - id = "commissaryshutter"; - name = "Office Shutter Control"; - pixel_x = 0 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"fgg" = ( -/obj/structure/lattice, -/obj/effect/spawner/random/maintenance, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) "fgq" = ( /obj/machinery/vending/cigarette, /turf/open/floor/iron, @@ -17559,10 +18854,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) -"fgx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "fgz" = ( /obj/machinery/door/airlock{ name = "Law Office" @@ -17582,11 +18873,15 @@ "fgH" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"fgK" = ( +/obj/effect/landmark/firealarm_sanity, +/turf/open/floor/iron/textured_large, +/area/station/medical/abandoned) "fgT" = ( /obj/structure/railing{ dir = 1 @@ -17598,17 +18893,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"fha" = ( -/obj/structure/chair/sofa/middle/brown{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) -"fhd" = ( -/obj/machinery/shieldgen, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/engine, -/area/station/engineering/break_room) "fhf" = ( /obj/machinery/door/airlock/maintenance{ name = "Security Maintenance" @@ -17635,6 +18919,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood/large, /area/station/hallway/secondary/service) +"fht" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "fhw" = ( /obj/structure/table/reinforced/rglass, /obj/item/reagent_containers/cup/glass/mug/nanotrasen{ @@ -17642,15 +18930,7 @@ pixel_y = 4 }, /turf/open/floor/carpet/executive, -/area/station/ai_monitored/turret_protected/aisat_interior) -"fhA" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/interior) "fhF" = ( /obj/effect/turf_decal/siding/dark/corner{ dir = 8 @@ -17662,7 +18942,7 @@ dir = 4 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "fhJ" = ( /turf/open/floor/engine/hull/air, /area/station/hallway/secondary/entry) @@ -17687,31 +18967,23 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron/dark, /area/station/science/cytology) -"fii" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "fik" = ( -/obj/structure/rack, -/obj/item/cardboard_cutout{ - pixel_x = -5 - }, -/obj/item/cardboard_cutout, -/obj/item/cardboard_cutout{ - pixel_x = 8 +/obj/structure/cable, +/obj/structure/bodycontainer/morgue{ + dir = 2 }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port) +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/morgue) "fin" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, /area/station/medical/virology) +"fir" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/space/openspace, +/area/space/nearstation) "fiC" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -17729,6 +19001,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) +"fiZ" = ( +/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/dirt, +/obj/structure/light_construct/directional/east{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "fjc" = ( /obj/effect/turf_decal/trimline/dark_blue/corner{ dir = 8 @@ -17747,15 +19030,49 @@ dir = 8 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "fji" = ( /turf/open/floor/carpet/executive, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"fjl" = ( +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/obj/structure/closet/crate/medical, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/stamp/granted{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/stamp/denied{ + pixel_x = 4; + pixel_y = -2 + }, +/obj/effect/spawner/random/maintenance, +/obj/item/pen/red{ + pixel_y = 10 + }, +/obj/structure/curtain/cloth/fancy/mechanical{ + name = "Psychologist's Office Curtains"; + id = "psychpriv" + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "fjn" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"fjo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "fjp" = ( /obj/item/survivalcapsule, /obj/item/pickaxe/mini, @@ -17769,7 +19086,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "fjv" = ( /obj/effect/turf_decal/trimline/red/warning{ @@ -17777,12 +19094,19 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) -"fjy" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ +"fjz" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron, -/area/station/engineering/lobby) +/turf/closed/wall, +/area/station/maintenance/starboard/central) +"fjO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "fjP" = ( /obj/structure/lattice/catwalk, /obj/item/clothing/accessory/clown_enjoyer_pin{ @@ -17804,12 +19128,11 @@ /obj/machinery/door/airlock/medical{ name = "Abandoned Room" }, -/obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/port) "fjY" = ( @@ -17820,11 +19143,16 @@ }, /turf/open/floor/iron/textured, /area/station/security/brig) -"fkh" = ( -/obj/structure/ladder, +"fkd" = ( +/obj/structure/sign/warning/directional/west, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"fki" = ( /obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/central) "fko" = ( /obj/structure/table, /obj/item/storage/medkit/brute{ @@ -17834,9 +19162,9 @@ /turf/open/floor/iron/kitchen, /area/station/maintenance/port/aft) "fkp" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) +/obj/machinery/newscaster/directional/east, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "fkr" = ( /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/plating, @@ -17885,25 +19213,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/openspace, /area/station/hallway/primary/central) -"fkP" = ( -/obj/item/kirbyplants/synthetic/plant26{ - pixel_x = 10; - pixel_y = 18 - }, -/obj/item/kirbyplants/synthetic/plant27{ - pixel_x = 13; - pixel_y = 5 - }, -/obj/machinery/light/directional/north, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/morgue) -"fkR" = ( -/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, -/area/station/engineering/lobby) "fkX" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -17938,7 +19247,7 @@ dir = 1 }, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "flH" = ( /obj/effect/turf_decal/trimline/yellow/arrow_cw{ dir = 8 @@ -17951,6 +19260,16 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) +"flK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "flS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/wood{ @@ -17959,6 +19278,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"flU" = ( +/obj/structure/table, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/structure/sign/poster/contraband/the_big_gas_giant_truth/directional/south, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "flY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17993,26 +19318,35 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"fmq" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/aft) +"fms" = ( +/obj/structure/cable/multilayer/multiz, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/starboard/central/upper) "fmw" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"fmx" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/tcomms_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"fmN" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/turf/open/openspace, -/area/station/commons/dorms) "fmO" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/engineering/storage_shared) +"fmS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "fmV" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -18024,15 +19358,14 @@ /obj/structure/cable, /turf/closed/wall, /area/station/security/interrogation) -"fnp" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "space-outpost" +"fno" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/external, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "fnv" = ( /obj/machinery/porta_turret/ai{ dir = 4 @@ -18041,17 +19374,23 @@ dir = 10 }, /turf/open/floor/engine/hull/reinforced/air, -/area/station/ai_monitored/turret_protected/ai) -"fnD" = ( -/obj/machinery/door/airlock/maintenance{ - name = "CE's Maintenance Access" - }, -/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/engineering/construction, -/turf/open/floor/plating, +/area/station/ai/satellite/chamber) +"fnF" = ( +/obj/machinery/duct, +/turf/open/floor/iron/large, /area/station/engineering/lobby) +"fnH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "fnT" = ( /obj/structure/lattice/catwalk, /obj/structure/sign/poster/contraband/random/directional/east, @@ -18066,18 +19405,6 @@ }, /turf/open/openspace, /area/station/construction/storage_wing) -"fnW" = ( -/obj/item/stack/sheet/iron{ - amount = 34 - }, -/obj/item/stack/rods{ - amount = 23 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "fnY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -18096,6 +19423,12 @@ }, /turf/open/floor/wood/large, /area/station/service/kitchen) +"foi" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/commons/dorms) "foj" = ( /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, @@ -18110,8 +19443,28 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) +"fop" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/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/north, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"for" = ( +/obj/structure/cable, +/obj/effect/spawner/random/trash/graffiti, +/turf/open/floor/plating, +/area/station/maintenance/port) "fou" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -18125,19 +19478,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/science/research) -"foH" = ( -/obj/effect/turf_decal/loading_area, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/disposal/incinerator) -"foJ" = ( -/obj/machinery/meter/monitored/distro_loop, -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible/layer2{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/pumproom) "foN" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, @@ -18148,13 +19488,6 @@ }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/station/tcommsat/server) -"foZ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 10 - }, -/turf/open/openspace, -/area/station/engineering/break_room) "fpe" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -18167,6 +19500,10 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) +"fpf" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "fpj" = ( /obj/structure/closet/firecloset/full, /turf/open/floor/plating, @@ -18206,13 +19543,12 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) -"fpz" = ( -/obj/structure/lattice/catwalk, -/obj/structure/chair{ - dir = 1 +"fpw" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/edge{ + dir = 4 }, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) +/area/station/hallway/primary/central) "fpB" = ( /obj/structure/table, /obj/item/storage/photo_album/prison, @@ -18241,12 +19577,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/space_hut) -"fpM" = ( -/obj/structure/table, -/obj/machinery/firealarm/directional/west, -/obj/effect/spawner/random/clothing/gloves, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "fpN" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 1 @@ -18265,34 +19595,17 @@ }, /turf/open/floor/wood, /area/station/service/library/printer) -"fqj" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood/oil, -/obj/item/cigbutt{ - pixel_x = 8; - pixel_y = -2 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "fqn" = ( /obj/structure/stairs/east, /turf/open/floor/iron/stairs/medium{ dir = 8 }, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "fqr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/vending/cola/shamblers, /turf/open/floor/plating, /area/station/construction/storage_wing) -"fqz" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "fqC" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -18347,34 +19660,60 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) -"fro" = ( -/obj/machinery/computer/records/security{ - dir = 4 +"frc" = ( +/obj/structure/chair/sofa/middle/brown, +/obj/item/clothing/under/costume/seifuku/red{ + pixel_y = -7 + }, +/obj/item/clothing/head/costume/crown{ + pixel_x = 10; + pixel_y = 8 }, +/obj/structure/sign/poster/official/pda_ad/directional/north, +/turf/open/floor/eighties, +/area/station/maintenance/department/crew_quarters/dorms) +"fro" = ( /obj/effect/turf_decal/siding/blue{ dir = 1 }, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/red/opposingcorners, /obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 + }, +/obj/structure/bookcase/random/reference, +/obj/item/book/manual/wiki/surgery{ + pixel_x = -14; + pixel_y = 6 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "fry" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/railing, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/stripes{ + dir = 2 + }, +/turf/open/floor/iron/textured, +/area/station/command/eva) "frB" = ( /obj/structure/railing/corner{ dir = 1 }, -/obj/structure/bodycontainer/morgue, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) "frE" = ( @@ -18386,12 +19725,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"frJ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "frK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18411,6 +19744,12 @@ /obj/structure/sign/poster/random/directional/south, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"frN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/station/engineering/lobby) "frP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18425,6 +19764,18 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) +"frT" = ( +/obj/machinery/atmospherics/pipe/multiz/purple/visible{ + dir = 8; + name = "mix to recycle multi-deck adapter" + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/box/white, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "frY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/airalarm/directional/north, @@ -18432,24 +19783,13 @@ /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/station/ai_monitored/command/nuke_storage) -"fsf" = ( -/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/fitness/recreation) +/area/station/command/vault) "fsj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, /obj/machinery/light/directional/south, /turf/open/floor/plating, /area/station/engineering/storage_shared) -"fso" = ( -/obj/machinery/duct, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "fsw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18462,12 +19802,18 @@ }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/effect/landmark/navigate_destination/research, /turf/open/floor/iron/dark, /area/station/science/lobby) +"fsy" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "fsM" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -18486,7 +19832,7 @@ name = "Warden's Place" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "fsO" = ( /obj/structure/rack, /obj/item/storage/crayons{ @@ -18507,6 +19853,18 @@ /obj/structure/closet/secure_closet/security/science, /turf/open/openspace, /area/station/security/checkpoint/science) +"fsW" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/machinery/air_sensor/incinerator_tank, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer2{ + dir = 6 + }, +/turf/open/floor/engine/airless, +/area/station/engineering/atmos/upper) +"fsX" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "ftk" = ( /obj/structure/table, /obj/item/stock_parts/micro_laser, @@ -18531,28 +19889,16 @@ /area/station/construction/storage_wing) "ftA" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) "ftG" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/engine/n2, /area/station/engineering/atmos/upper) -"ftK" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/obj/structure/fluff/paper/stack{ - dir = 4 - }, -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/spawner/random/bureaucracy/paper, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "ftR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -18573,17 +19919,10 @@ /obj/machinery/door/airlock/maintenance{ name = "Storage Room" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron/dark/smooth_large, /area/station/maintenance/port) -"fus" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 - }, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "fut" = ( /obj/machinery/door/airlock/research{ name = "Testing Labs" @@ -18609,18 +19948,34 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/glass, /area/station/hallway/secondary/entry) -"fuU" = ( -/obj/machinery/firealarm/directional/east, -/obj/structure/reagent_dispensers/foamtank, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) +"fuV" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - co2 Cell"; + name = "atmospherics camera" + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos/upper) "fuW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /turf/open/floor/carpet, /area/station/service/chapel) +"fva" = ( +/obj/structure/table, +/obj/item/clothing/suit/utility/fire/firefighter, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"fvb" = ( +/obj/structure/table, +/obj/structure/bedsheetbin{ + pixel_y = 6 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "fve" = ( /obj/structure/chair, /obj/effect/turf_decal/tile/dark_blue{ @@ -18651,7 +20006,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "fvk" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -18659,38 +20014,6 @@ /obj/structure/window/spawner/directional/north, /turf/open/floor/wood, /area/station/service/library) -"fvu" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/vending/wardrobe/engi_wardrobe, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/main) -"fvG" = ( -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/machinery/door/airlock/maintenance_hatch, -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/aft) -"fvM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/trash/can{ - pixel_x = -8 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"fwd" = ( -/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "fwn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18714,25 +20037,26 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) "fwq" = ( -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) +/obj/machinery/door/airlock/public/glass{ + name = "Crew Quarters Access" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/commons/dorms) +"fwv" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/white, +/area/station/medical/office) "fwx" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) -"fwz" = ( -/obj/item/kirbyplants/fern{ - pixel_x = -3; - pixel_y = 18 - }, -/obj/structure/sign/flag/nanotrasen/directional/north, -/obj/structure/fluff/paper/stack, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) +/area/station/ai/satellite/chamber) "fwB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -18758,6 +20082,10 @@ /turf/open/floor/wood, /area/station/command/teleporter) "fwP" = ( +/obj/machinery/door/window/brigdoor/right/directional/north{ + req_access = list("command"); + name = "Conference Room" + }, /turf/open/floor/iron/stairs/medium{ dir = 1 }, @@ -18769,12 +20097,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured_corner, -/area/station/ai_monitored/turret_protected/aisat_interior) -"fxc" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/virology) +/area/station/ai/satellite/interior) "fxi" = ( /obj/machinery/door/airlock/public/glass{ name = "Vault Storage" @@ -18784,11 +20107,17 @@ /obj/structure/cable, /obj/effect/landmark/navigate_destination/vault, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"fxp" = ( -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/command/vault) +"fxL" = ( +/obj/structure/table, +/obj/item/toy/gun{ + pixel_x = 1; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/aft) "fxS" = ( /obj/structure/railing{ dir = 8 @@ -18797,8 +20126,9 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "fxY" = ( /obj/machinery/vending/cigarette, /obj/structure/disposalpipe/segment{ @@ -18834,6 +20164,18 @@ /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"fyo" = ( +/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/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "fyp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/smartfridge/drying, @@ -18843,12 +20185,6 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"fyw" = ( -/obj/machinery/newscaster/directional/north, -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "fyx" = ( /obj/structure/rack, /obj/effect/turf_decal/tile/red/opposingcorners, @@ -18863,56 +20199,13 @@ /obj/item/poster/random_contraband, /turf/open/floor/iron/dark, /area/station/maintenance/port) -"fyz" = ( -/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, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=9-Bridge"; - location = "8-Kitchen" - }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) -"fyD" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"fyE" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/obj/structure/railing{ - dir = 5 - }, -/turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai_upload) -"fyH" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/railing/corner, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/engineering/lobby) "fyY" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/structure/table/wood/fancy/orange, -/obj/item/gun/energy/recharge/kinetic_accelerator{ - name = "the QM's Accelerator"; - pixel_y = 6 +/obj/machinery/conveyor{ + id = "cargounload" }, -/obj/item/cigbutt, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) +/obj/structure/sign/departments/cargo/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/storage) "fzd" = ( /obj/structure/ladder, /turf/open/floor/plating, @@ -18923,42 +20216,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"fzl" = ( -/obj/structure/table, -/obj/item/clothing/suit/hazardvest{ - pixel_x = -13; - pixel_y = 3 - }, -/obj/item/clothing/suit/hazardvest{ - pixel_y = 4 - }, -/obj/item/clothing/suit/hazardvest{ - pixel_x = 10; - pixel_y = 3 - }, -/obj/item/clothing/head/cone{ - pixel_x = -10; - pixel_y = -11 - }, -/obj/item/clothing/head/cone{ - pixel_x = -10; - pixel_y = -11 - }, -/obj/item/clothing/head/cone{ - pixel_x = -10; - pixel_y = -11 - }, -/obj/item/clothing/head/cone{ - pixel_x = -10; - pixel_y = -11 - }, -/obj/item/clothing/head/cone{ - pixel_x = -10; - pixel_y = -11 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/area/station/ai/satellite/interior) "fzv" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -19001,26 +20259,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"fzP" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) -"fzS" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/engineering/lobby) "fzT" = ( /obj/effect/turf_decal/siding/purple{ dir = 4 @@ -19045,30 +20283,14 @@ dir = 8 }, /area/station/hallway/primary/central) -"fAb" = ( -/obj/machinery/computer/atmos_control/nocontrol/incinerator{ - dir = 8 - }, -/obj/machinery/airlock_controller/incinerator_atmos{ - pixel_x = 32; - pixel_y = 0 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "fAl" = ( /turf/closed/wall/r_wall, /area/station/science/lab) -"fAB" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/turf/open/floor/iron/textured_large, -/area/station/medical/virology) +"fAD" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/plating/airless, +/area/station/maintenance/starboard/aft) "fAI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19079,10 +20301,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"fAV" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "fAW" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable, @@ -19097,25 +20315,15 @@ /obj/item/stack/spacecash/c10, /turf/open/floor/carpet/black, /area/station/commons/lounge) -"fBh" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "fBm" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"fBn" = ( -/obj/item/clothing/head/utility/hardhat/red{ - pixel_x = -3; - pixel_y = 11 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"fBs" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "fBB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19123,10 +20331,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/station/service/library/printer) +"fBI" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos) "fBQ" = ( /obj/structure/sign/directions/upload, /turf/closed/wall, -/area/station/medical/medbay/central) +/area/station/hallway/primary/aft) "fBR" = ( /obj/structure/railing/corner/end{ dir = 4 @@ -19136,18 +20349,18 @@ }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"fBU" = ( +/area/station/ai/satellite/interior) +"fBT" = ( +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"fBU" = ( /obj/machinery/photocopier/prebuilt, /obj/structure/sign/clock/directional/east, /turf/open/floor/wood/large, /area/station/medical/psychology) -"fBX" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) "fBY" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/structure/table, @@ -19161,11 +20374,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"fCe" = ( -/obj/structure/ladder, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) "fCk" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19176,12 +20384,30 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"fCx" = ( +/obj/machinery/power/emitter{ + dir = 4 + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "fCL" = ( /obj/structure/lattice/catwalk, /obj/structure/rack, /obj/effect/spawner/random/maintenance/five, /turf/open/openspace, /area/station/hallway/secondary/entry) +"fCM" = ( +/obj/effect/landmark/start/hangover, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"fCQ" = ( +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "fCV" = ( /turf/closed/wall/r_wall, /area/station/science/robotics/lab) @@ -19203,19 +20429,20 @@ dir = 4 }, /obj/machinery/door/firedoor, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "fDd" = ( /obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/large, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/edge, /area/station/hallway/primary/central) -"fDg" = ( -/turf/open/floor/iron, -/area/station/medical/pharmacy) "fDk" = ( -/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/blue/filled/line, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, +/obj/structure/closet/l3closet, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) "fDs" = ( @@ -19244,6 +20471,10 @@ /obj/structure/cable, /turf/open/openspace, /area/station/hallway/primary/central) +"fDH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/commons/dorms) "fDQ" = ( /obj/structure/railing{ dir = 8 @@ -19257,6 +20488,16 @@ }, /turf/open/floor/iron, /area/station/science/research) +"fDV" = ( +/obj/structure/table, +/obj/machinery/firealarm/directional/west, +/obj/effect/spawner/random/clothing/gloves, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -4; + pixel_y = 9 + }, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "fEc" = ( /obj/machinery/door/airlock/public/glass{ name = "Community Center" @@ -19264,6 +20505,14 @@ /obj/machinery/door/firedoor, /turf/open/floor/wood, /area/station/service/library) +"fEf" = ( +/obj/structure/closet/secure_closet/medical3, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "fEs" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -19271,36 +20520,40 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/science/ordnance/storage) "fEA" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/machinery/airalarm/directional/north, -/obj/structure/tank_holder/extinguisher, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, +/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, +/obj/structure/closet/secure_closet/security/cargo, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) -"fEO" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 +"fEQ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 8 + }, +/obj/machinery/chem_master, +/obj/machinery/button/door/directional/west{ + id = "chemshutters"; + name = "Chemistry Shutters"; + req_access = list("pharmacy") + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "fES" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/port) -"fEU" = ( -/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 = 9 - }, -/turf/open/floor/iron, -/area/station/science/research) "fEW" = ( /obj/structure/sign/poster/random/directional/east, /turf/open/floor/plating, @@ -19313,25 +20566,32 @@ /turf/open/floor/wood, /area/station/service/library) "fFl" = ( +/obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/medical{ - name = "Medical Cold Room" + name = "Abandoned Room" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/turf/open/floor/iron/freezer, -/area/station/medical/coldroom) +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/turf/open/floor/iron/textured_large, +/area/station/maintenance/department/medical) "fFm" = ( -/obj/structure/table/optable, +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/obj/structure/table/reinforced/rglass, /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 + dir = 10 + }, +/obj/item/storage/box/rxglasses{ + pixel_x = -4; + pixel_y = 8 }, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ dir = 8 }, -/obj/item/surgical_drapes, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, +/obj/machinery/newscaster/directional/west, /turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) +/area/station/medical/medbay/central) "fFq" = ( /obj/structure/sign/poster/random/directional/north, /turf/open/openspace, @@ -19339,30 +20599,26 @@ "fFA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "fFE" = ( -/obj/structure/lattice/catwalk, -/obj/structure/table/reinforced, -/obj/item/flashlight/flare/candle{ - pixel_x = 4; - pixel_y = 15 - }, -/obj/item/flashlight/flare/candle{ - pixel_x = -3; - pixel_y = 9 +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 }, -/obj/item/reagent_containers/syringe{ - pixel_x = 10; - pixel_y = 10 +/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/cell_charger{ - pixel_x = -1; - pixel_y = 3 +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"fFF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/openspace, -/area/station/medical/storage) +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "fFG" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/security_space_law{ @@ -19372,6 +20628,20 @@ /obj/machinery/light/directional/north, /turf/open/openspace, /area/station/security/checkpoint/science) +"fFN" = ( +/obj/structure/table/reinforced, +/obj/item/stack/sheet/iron{ + amount = 30 + }, +/obj/item/stack/sheet/glass/fifty, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) +"fGg" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/starboard/aft/upper) "fGj" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -19397,52 +20667,73 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/textured_large, /area/station/medical/virology) +"fGn" = ( +/obj/structure/sign/warning/radiation/rad_area/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "fGo" = ( /obj/structure/lattice, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/space/openspace, /area/space/nearstation) -"fGp" = ( -/obj/structure/railing{ - dir = 8 +"fGI" = ( +/obj/structure/closet/crate/engineering{ + name = "Basic Materials" }, -/obj/effect/turf_decal/siding/yellow{ - dir = 8 +/obj/item/stock_parts/power_store/cell/high, +/obj/item/stock_parts/power_store/cell/high, +/obj/item/electronics/airlock, +/obj/item/electronics/airlock, +/obj/item/electronics/airlock, +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 +/obj/item/stack/rods{ + amount = 50 }, -/obj/structure/closet/secure_closet/chemical, -/turf/open/floor/iron/dark, -/area/station/medical/chemistry) -"fGD" = ( -/obj/machinery/firealarm/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/upper) -"fGL" = ( -/obj/structure/disposaloutlet{ - dir = 4 +/obj/item/stack/sheet/glass{ + amount = 50 }, -/obj/effect/turf_decal/trimline/brown/filled, -/obj/structure/disposalpipe/trunk, -/obj/structure/railing{ - dir = 10 +/obj/item/stack/sheet/iron{ + amount = 50 }, -/obj/machinery/status_display/supply{ - pixel_y = 32 +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) +"fGL" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/bot/right, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + location = "Cargo Storage4" }, -/turf/open/floor/iron, +/mob/living/simple_animal/bot/mulebot{ + name = "Old Yeller" + }, +/turf/open/floor/iron/recharge_floor, /area/station/cargo/sorting) -"fGM" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) -"fGT" = ( -/obj/structure/lattice/catwalk, -/obj/effect/spawner/random/bureaucracy/paper, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) +"fGQ" = ( +/obj/structure/broken_flooring/corner/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"fGU" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/blue/corner{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"fHb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "fHc" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -19454,11 +20745,6 @@ /turf/open/floor/iron/dark, /area/station/science/ordnance) "fHf" = ( -/obj/structure/bed/medical/emergency, -/obj/item/emergency_bed{ - pixel_x = -5; - pixel_y = 15 - }, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, @@ -19466,42 +20752,30 @@ /obj/machinery/firealarm/directional/west{ pixel_y = -28 }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"fHg" = ( -/obj/structure/sign/poster/contraband/missing_gloves/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/port/aft) -"fHi" = ( -/obj/machinery/mech_bay_recharge_port, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"fHk" = ( -/obj/effect/spawner/random/entertainment/arcade{ - dir = 4 - }, -/turf/open/floor/eighties, -/area/station/engineering/lobby) -"fHp" = ( -/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."; +/obj/effect/landmark/start/hangover, +/obj/structure/chair{ dir = 4; - name = "decommissioned sleeper" + pixel_y = -2 }, -/obj/effect/decal/cleanable/greenglow, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) +"fHp" = ( +/obj/structure/table/wood, +/obj/machinery/airalarm/directional/west, +/obj/machinery/microwave, +/turf/open/floor/wood/large, +/area/station/medical/break_room) "fHG" = ( /obj/structure/lattice, /obj/machinery/camera/autoname/directional/north, /turf/open/openspace, /area/station/hallway/secondary/entry) +"fHO" = ( +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "fHR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19517,17 +20791,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/carpet, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) -"fIg" = ( +"fIf" = ( /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/starboard/fore) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood/large, +/area/station/medical/break_room) "fIh" = ( /obj/effect/mapping_helpers/ianbirthday, -/turf/open/floor/carpet, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) "fIl" = ( /obj/structure/lattice/catwalk, @@ -19580,12 +20861,10 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"fJc" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ - dir = 8 - }, -/turf/open/floor/engine/airless, -/area/station/maintenance/disposal/incinerator) +"fIS" = ( +/obj/structure/sign/departments/medbay/alt/directional/west, +/turf/open/floor/iron/stairs/medium, +/area/station/medical/medbay/central) "fJx" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -19626,12 +20905,15 @@ "fJL" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/engineering) -"fJN" = ( -/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, -/area/station/engineering/supermatter/room) +"fJY" = ( +/obj/structure/transport/linear{ + radial_travel = 0 + }, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/turf/open/openspace, +/area/station/engineering/atmos/upper) "fKi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19645,31 +20927,27 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/hallway/secondary/construction) -"fKD" = ( +"fKl" = ( /obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/terminal{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) -"fKJ" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 }, -/turf/closed/wall/r_wall, -/area/station/maintenance/starboard/aft) +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"fKA" = ( +/obj/structure/sign/departments/chemistry/directional/south, +/turf/open/floor/engine/hull/air, +/area/station/medical/medbay/central) "fKO" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/newscaster/directional/west, /turf/open/floor/plating, /area/station/medical/virology) -"fKS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/lesser) "fLb" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 1 @@ -19681,24 +20959,20 @@ /turf/open/openspace, /area/station/science/xenobiology) "fLr" = ( -/turf/open/floor/iron/large, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/edge, /area/station/hallway/primary/central) "fLs" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/item/radio/off{ - pixel_x = 3; - pixel_y = 5 - }, -/obj/machinery/recharger{ - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "fLv" = ( /obj/effect/turf_decal/siding/dark{ dir = 6 @@ -19712,35 +20986,6 @@ /obj/machinery/telecomms/broadcaster/preset_right, /turf/open/floor/iron/dark/textured_large, /area/station/tcommsat/server) -"fLC" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/vending/cigarette, -/turf/open/floor/wood, -/area/station/commons/toilet/restrooms) -"fLD" = ( -/obj/machinery/light/small/directional/east, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/stack/sheet/glass/fifty, -/obj/structure/closet/crate/engineering/electrical, -/turf/open/floor/glass/reinforced, -/area/station/solars/starboard/fore) "fLX" = ( /obj/structure/table/reinforced, /obj/item/storage/crayons{ @@ -19748,25 +20993,45 @@ pixel_y = 11 }, /obj/effect/spawner/random/bureaucracy/crayon, +/obj/item/poster/random_contraband, /turf/open/floor/plating, /area/station/maintenance/port) -"fMe" = ( -/obj/structure/barricade/sandbags, +"fMd" = ( /obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 2 + }, /turf/open/openspace, -/area/station/maintenance/starboard/aft) +/area/station/medical/abandoned) "fMl" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) +"fMr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/sofa/right/brown{ + dir = 4 + }, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "fMu" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 }, /turf/open/floor/iron, /area/station/engineering/lobby) +"fMx" = ( +/turf/closed/wall, +/area/station/medical/office) "fMC" = ( /obj/effect/decal/cleanable/glitter{ color = "ff8080" @@ -19774,17 +21039,15 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"fNa" = ( -/obj/effect/turf_decal/siding/blue{ +"fMH" = ( +/turf/closed/wall, +/area/station/maintenance/department/crew_quarters/dorms) +"fMS" = ( +/obj/effect/turf_decal/stripes/white/line{ dir = 4 }, -/obj/machinery/fax{ - fax_name = "Medical"; - name = "Medical Fax Machine" - }, -/obj/structure/table/glass, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "fNe" = ( /obj/effect/turf_decal/trimline/red/warning{ dir = 1 @@ -19804,36 +21067,39 @@ /obj/structure/cable, /turf/open/floor/engine/hull/air, /area/station/maintenance/port) -"fNv" = ( -/obj/structure/closet/emcloset, -/obj/effect/landmark/start/hangover/closet, -/obj/machinery/light/directional/west, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +"fNn" = ( +/obj/structure/chair/sofa/corner/brown, +/obj/effect/spawner/random/maintenance, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/cargo/storage) +"fNr" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "fNw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/railing/corner{ dir = 8 }, -/obj/structure/closet/crate/freezer/surplus_limbs, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) +"fNx" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "fNB" = ( -/obj/structure/cable, -/turf/closed/wall/r_wall, -/area/station/maintenance/central) -"fNG" = ( -/obj/structure/safe/floor, -/obj/item/food/fortunecookie, -/obj/item/lead_pipe, -/obj/item/reagent_containers/hypospray/medipen/methamphetamine, -/obj/item/clothing/glasses/sunglasses, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/obj/machinery/door/firedoor, +/turf/open/floor/iron/edge, +/area/station/hallway/primary/central) "fNL" = ( /obj/structure/railing{ dir = 1 @@ -19841,14 +21107,25 @@ /obj/structure/showcase/machinery/cloning_pod, /turf/open/floor/wood, /area/station/command/corporate_showroom) +"fNP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/sign/departments/maint/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "fNS" = ( /obj/structure/lattice/catwalk, /obj/structure/table/reinforced, -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, /obj/item/flashlight/lamp, /obj/machinery/light/directional/north, /turf/open/openspace, /area/station/security/checkpoint/customs) +"fNW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/sorting) "fNX" = ( /obj/machinery/cell_charger, /obj/structure/table, @@ -19862,15 +21139,12 @@ }, /obj/effect/turf_decal/siding/dark, /turf/open/floor/iron/white/textured_half, -/area/station/ai_monitored/turret_protected/aisat_interior) -"fNZ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/closet, -/obj/item/storage/box/lights/mixed, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/interior) +"fNY" = ( +/obj/machinery/duct, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) "fOb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -19879,6 +21153,15 @@ }, /turf/open/floor/plating, /area/station/command/heads_quarters/hop) +"fOc" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing, +/obj/machinery/duct, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "fOe" = ( /obj/structure/railing{ dir = 1 @@ -19894,9 +21177,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"fOM" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/engine, +"fOs" = ( +/obj/structure/railing/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"fOF" = ( +/obj/item/kirbyplants/random, +/obj/machinery/camera/autoname/directional/east, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"fOY" = ( +/obj/machinery/shower/directional/east, +/obj/structure/fluff/shower_drain, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 4 + }, /area/station/engineering/main) "fPb" = ( /obj/effect/turf_decal/siding/thinplating/dark{ @@ -19906,20 +21208,71 @@ /turf/open/floor/wood, /area/station/service/library) "fPf" = ( -/obj/effect/landmark/event_spawn, +/obj/structure/chair/sofa/middle/brown{ + dir = 8 + }, +/obj/structure/lattice/catwalk, +/obj/effect/landmark/start/bitrunner, /turf/open/openspace, /area/station/cargo/storage) -"fPi" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/turf/open/floor/catwalk_floor, +"fPn" = ( +/obj/structure/table, +/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/folder/yellow{ + pixel_x = 4 + }, +/turf/open/floor/iron/large, +/area/station/engineering/lobby) +"fPo" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Auxiliary Tech Storage" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) +"fPs" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/power/tracker, +/obj/structure/cable, +/turf/open/space/basic, +/area/station/solars/starboard/fore) +"fPt" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/mob/living/basic/bot/medbot, +/obj/machinery/holopad, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"fPv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 1 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/station/engineering/atmos/upper) -"fPl" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "fPy" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -19949,6 +21302,10 @@ }, /turf/open/floor/plating, /area/station/security/brig) +"fPN" = ( +/obj/effect/turf_decal/stripes/line, +/turf/closed/wall/r_wall, +/area/station/engineering/supermatter/room/upper) "fPR" = ( /obj/structure/closet/secure_closet/hos, /obj/item/clothing/glasses/hud/security/sunglasses/gars, @@ -19956,36 +21313,14 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/carpet/royalblack, /area/station/command/heads_quarters/hos) -"fPT" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "fPX" = ( +/obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 10 }, -/obj/structure/rack, -/obj/item/gps/mining{ - pixel_x = 6; - pixel_y = 2 - }, -/obj/item/gps/mining{ - pixel_x = -6; - pixel_y = 2 - }, -/obj/item/gps/mining, -/obj/item/shovel{ - pixel_x = -5 - }, -/obj/item/pickaxe{ - pixel_x = 5 - }, +/obj/structure/sign/poster/random/directional/south, /turf/open/floor/iron, -/area/station/cargo/miningoffice) +/area/station/cargo/storage) "fQb" = ( /obj/effect/turf_decal/trimline/red/warning{ dir = 8 @@ -19994,7 +21329,14 @@ /area/station/security/office) "fQp" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) +"fQG" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/freezer, +/area/station/commons/dorms) "fQI" = ( /obj/structure/table, /obj/machinery/cell_charger{ @@ -20006,49 +21348,28 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/science/explab) "fQL" = ( -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) "fQQ" = ( /obj/machinery/vending/games, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"fQR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"fRd" = ( -/obj/machinery/disposal/bin/tagger, -/obj/machinery/button/door/directional/north{ - id = "main_surgery"; - name = "privacy shutters control" - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ +"fQT" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk{ +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"fRd" = ( +/obj/effect/turf_decal/siding/dark_blue{ dir = 4 }, -/obj/machinery/firealarm/directional/west, +/obj/machinery/light/floor, /turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) -"fRe" = ( -/obj/structure/railing/corner/end/flip{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/medical/medbay/central) "fRg" = ( /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ dir = 4 @@ -20064,16 +21385,35 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"fRE" = ( -/obj/machinery/computer/security/qm{ +"fRo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/effect/turf_decal/siding/blue{ dir = 4 }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 +/obj/machinery/light/small/directional/north, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/catwalk_floor{ + initial_gas_mix = "n2=100;TEMP=80" }, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) +/area/station/science/server) +"fRy" = ( +/obj/machinery/light/directional/south, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) +"fRE" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/spawner/random/structure/crate, +/obj/machinery/light/warm/dim/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/storage) "fRG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20110,6 +21450,15 @@ /obj/machinery/door/firedoor, /turf/open/openspace, /area/station/hallway/primary/central) +"fRU" = ( +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"fRX" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "fSb" = ( /obj/item/trash/can{ pixel_x = -8 @@ -20122,10 +21471,10 @@ /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/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) "fSg" = ( @@ -20138,7 +21487,7 @@ /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/bed/medical/emergency, /obj/item/storage/medkit/regular, -/turf/open/floor/wood, +/turf/open/floor/iron/dark, /area/station/command/gateway) "fSm" = ( /obj/structure/cable, @@ -20153,7 +21502,7 @@ /turf/open/floor/iron/white/textured_corner{ dir = 4 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "fSO" = ( /obj/structure/lattice/catwalk, /obj/structure/light_construct/directional/east{ @@ -20167,9 +21516,18 @@ /obj/structure/sign/poster/contraband/shamblers_juice/directional/north, /turf/open/floor/catwalk_floor/iron_dark, /area/station/cargo/bitrunning/den) +"fTa" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "fTf" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) "fTi" = ( /turf/open/floor/carpet/royalblack, @@ -20195,6 +21553,18 @@ /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/iron/smooth, /area/station/science/robotics) +"fTu" = ( +/turf/open/floor/engine/hull/air, +/area/station/maintenance/aft/upper) +"fTw" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/door/firedoor/heavy, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "fTx" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/glass, @@ -20212,10 +21582,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/service/cafeteria) -"fTF" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/station/engineering/main) +"fTC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "fTM" = ( /obj/structure/chair, /obj/effect/turf_decal/tile/dark_blue{ @@ -20232,39 +21603,22 @@ /obj/structure/sign/departments/aisat/directional/north, /obj/machinery/light/directional/north, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"fTZ" = ( -/obj/effect/decal/cleanable/dirt, -/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/maintenance/starboard/lesser) +/area/station/ai/satellite/foyer) +"fTV" = ( +/turf/closed/wall/r_wall, +/area/station/maintenance/starboard/central/upper) "fUb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) -"fUd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/security/detectives_office/private_investigators_office) -"fUg" = ( -/obj/machinery/space_heater, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"fUh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"fUc" = ( +/obj/structure/table/wood, +/obj/item/food/grown/harebell, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "fUi" = ( /obj/structure/lattice/catwalk, /obj/item/stack/cable_coil/thirty, @@ -20279,12 +21633,18 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/science/genetics) -"fUu" = ( +"fUr" = ( +/obj/machinery/door/airlock/atmos/glass{ + name = "Atmospherics" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/obj/structure/cable, /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/airless, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "fUv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20294,19 +21654,16 @@ }, /turf/open/floor/wood, /area/station/hallway/secondary/service) -"fUE" = ( -/obj/machinery/vending/clothing, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"fUJ" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/turf/open/floor/wood, -/area/station/commons/dorms) +"fUy" = ( +/obj/machinery/duct, +/obj/structure/rack, +/obj/machinery/light_switch/directional/south, +/obj/effect/spawner/random/trash/soap, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "fUL" = ( /obj/machinery/computer/rdservercontrol, /obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/tlv_cold_room, /turf/open/floor/iron/dark, /area/station/science/server) "fUM" = ( @@ -20328,17 +21685,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) -"fVa" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"fVd" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/engineering/main) "fVh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20348,16 +21694,6 @@ }, /turf/open/floor/engine/hull/air, /area/station/science/research) -"fVj" = ( -/obj/machinery/door/airlock{ - id_tag = "Cabin6"; - name = "Cabin 2" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/commons/dorms) "fVk" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20367,10 +21703,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"fVn" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) +"fVp" = ( +/obj/structure/girder/reinforced, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "fVq" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ dir = 1 @@ -20382,7 +21719,7 @@ /turf/open/floor/iron/white/smooth_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "fVs" = ( /obj/structure/chair{ dir = 1 @@ -20393,23 +21730,13 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "fVx" = ( -/obj/structure/table/wood, -/obj/item/hand_labeler{ - pixel_x = 3; - pixel_y = 10 - }, -/obj/item/stack/package_wrap{ - pixel_x = -7; - pixel_y = 4 - }, -/obj/item/stamp/denied{ - pixel_x = -15; - pixel_y = 11 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/carpet, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) "fVC" = ( /obj/structure/chair/stool/bar/directional/west, @@ -20424,11 +21751,17 @@ "fVD" = ( /turf/closed/wall, /area/station/maintenance/solars/port/aft) -"fVM" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, +"fVE" = ( +/obj/structure/table/glass, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/button/door/directional/west{ + id = "commissaryshutter"; + name = "Office Shutter Control"; + pixel_x = 0 + }, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/office) "fVQ" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/brigdoor/left/directional/east{ @@ -20439,14 +21772,13 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs) -"fVU" = ( -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage{ - pixel_x = 5; - pixel_y = 9 - }, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) +"fVR" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/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/supermatter/room/upper) "fVX" = ( /obj/structure/table, /obj/machinery/door/poddoor/shutters/preopen{ @@ -20456,14 +21788,11 @@ }, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"fWc" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/spawner/random/clothing/backpack, -/turf/open/floor/iron, -/area/station/commons/dorms) +"fWe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "fWt" = ( /obj/effect/turf_decal/trimline/yellow/arrow_ccw{ dir = 4 @@ -20476,11 +21805,18 @@ dir = 4 }, /area/station/hallway/primary/fore) -"fWz" = ( -/obj/machinery/holopad, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/engine, -/area/station/engineering/atmos/hfr_room) +"fWy" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"fWB" = ( +/obj/machinery/washing_machine, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "fWG" = ( /obj/structure/cable/layer3, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20489,7 +21825,7 @@ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "fWI" = ( /obj/structure/girder, /obj/effect/spawner/random/structure/grille, @@ -20499,6 +21835,10 @@ /obj/effect/spawner/random/engineering/tank, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"fWL" = ( +/obj/structure/ladder, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "fWQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -20515,19 +21855,9 @@ /turf/open/floor/wood/large, /area/station/commons/lounge) "fWW" = ( -/obj/item/cigbutt{ - pixel_x = -14; - pixel_y = -7 - }, /obj/machinery/flasher/directional/south, -/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ - dir = 1 - }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "fWY" = ( /turf/closed/wall, /area/station/service/bar) @@ -20551,14 +21881,13 @@ }, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"fXp" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +"fXr" = ( +/turf/open/floor/glass, +/area/station/maintenance/starboard/aft/upper) "fXB" = ( /obj/machinery/status_display/evac/directional/north, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "fXD" = ( /obj/effect/spawner/random/trash/crushed_can, /obj/structure/broken_flooring/side/always_floorplane/directional/east, @@ -20571,6 +21900,21 @@ /obj/effect/mapping_helpers/broken_machine, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"fXF" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/corner{ + dir = 4 + }, +/obj/structure/fluff/paper/stack{ + dir = 4 + }, +/obj/structure/filingcabinet, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/item/folder/yellow{ + pixel_y = -6 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "fXJ" = ( /obj/structure/table/reinforced, /obj/item/binoculars, @@ -20598,29 +21942,39 @@ }, /turf/open/floor/iron, /area/station/science/robotics) -"fXO" = ( -/obj/structure/table, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "fXP" = ( /turf/closed/wall, /area/station/hallway/primary/aft) -"fXT" = ( -/obj/effect/turf_decal/trimline/white/line{ - dir = 4 - }, +"fXW" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/textured_large, +/area/station/medical/abandoned) +"fYa" = ( +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port) "fYd" = ( /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"fYo" = ( +/obj/structure/sign/directions/dorms{ + dir = 1; + pixel_y = 4 + }, +/obj/structure/sign/directions/evac/directional/north{ + dir = 8; + pixel_y = -5 + }, +/turf/closed/wall, +/area/station/commons/locker) "fYq" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -20629,18 +21983,23 @@ /obj/effect/turf_decal/trimline/neutral, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"fYt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/turf/open/floor/iron/freezer, -/area/station/engineering/atmos/pumproom) "fYu" = ( -/obj/structure/bodycontainer/morgue/beeper_off, -/obj/machinery/camera/autoname/directional/west{ - network = list("ss13","medbay"); - c_tag = "Medbay - Upper Secure Morgue" - }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) +"fYy" = ( +/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/machinery/pipedispenser, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/engineering/atmos/upper) "fYF" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 @@ -20650,20 +22009,44 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"fYG" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/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/station/maintenance/starboard/central/upper) "fYH" = ( -/obj/structure/table, -/obj/structure/sign/poster/contraband/energy_swords/directional/north, -/obj/item/clothing/head/costume/tv_head{ - pixel_y = 8 +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/turf_decal/trimline/green/filled/mid_joiner, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/virology) +"fYR" = ( +/obj/structure/railing{ + dir = 1 }, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/fore) +/obj/structure/lattice/catwalk, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "fYS" = ( /obj/structure/disposalpipe/trunk/multiz{ dir = 4 }, /turf/closed/wall, /area/station/service/lawoffice) +"fZb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 8; + pixel_y = -2 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "fZc" = ( /obj/effect/turf_decal/siding/red{ dir = 4 @@ -20677,20 +22060,29 @@ /turf/open/floor/wood, /area/station/security/courtroom) "fZg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/qm) +/obj/machinery/holopad, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) +"fZh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood, +/obj/item/stamp/granted{ + pixel_x = -5; + pixel_y = 11 + }, +/obj/item/stamp/denied{ + pixel_x = 7 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "fZn" = ( /obj/effect/spawner/random/trash/food_packaging, /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"fZq" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/head/costume/foilhat, -/turf/open/floor/wood, -/area/station/commons/dorms) "fZy" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/railing{ @@ -20698,13 +22090,6 @@ }, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"fZB" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/machinery/modular_computer/preset/engineering{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "fZD" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 5 @@ -20728,66 +22113,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/research) -"fZP" = ( -/obj/structure/chair{ - dir = 4; - pixel_y = -2 - }, -/obj/structure/disposalpipe/segment{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"fZR" = ( -/obj/effect/spawner/random/structure/tank_holder, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +"gaa" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 }, -/turf/open/floor/iron, -/area/station/engineering/main) +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "gad" = ( /obj/effect/turf_decal/weather/dirt{ dir = 6 }, /turf/open/water/jungle, /area/station/science/genetics) -"gaf" = ( -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 1 - }, -/turf/open/floor/engine/hull/reinforced, -/area/space/nearstation) -"gaj" = ( -/obj/effect/turf_decal/trimline/red, -/obj/effect/turf_decal/trimline/red/mid_joiner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/mid_joiner, -/obj/effect/turf_decal/trimline/red/mid_joiner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/mid_joiner{ - dir = 4 - }, -/obj/item/cigbutt{ - pixel_x = 7; - pixel_y = 14 - }, -/obj/item/cigbutt{ - pixel_x = 1; - pixel_y = 1 - }, -/obj/item/cigbutt{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/item/cigbutt{ - pixel_x = -9; - pixel_y = -2 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "gal" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20797,20 +22135,10 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) -"gav" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "gaE" = ( /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) -"gaL" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "gaM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20854,18 +22182,37 @@ /turf/open/floor/carpet, /area/station/commons/storage/tools) "gbb" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ +/obj/machinery/newscaster/directional/east, +/obj/machinery/light_switch/directional/north, +/obj/machinery/camera/autoname/directional/east{ + network = list("ss13","medbay"); + c_tag = "Medbay - Upper Cryo" + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 5 + }, +/turf/open/floor/holofloor/dark, +/area/station/command/heads_quarters/cmo) +"gbo" = ( +/obj/effect/spawner/random/entertainment/arcade{ dir = 8 }, -/obj/machinery/atmospherics/pipe/multiz/general/visible, -/turf/open/openspace, -/area/station/medical/cryo) -"gbd" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/commons/storage/primary) +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"gbw" = ( +/obj/item/cigbutt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/duct, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "gby" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20875,10 +22222,11 @@ /area/station/security/interrogation) "gbE" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/storage) "gbH" = ( @@ -20897,6 +22245,12 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/fore) +"gbN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/north, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "gbR" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -20905,6 +22259,18 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/security/prison/mess) +"gcb" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/corner{ + dir = 8 + }, +/obj/structure/fluff/paper/stack{ + dir = 4 + }, +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/floor/wood, +/area/station/maintenance/aft) "gcc" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -20928,35 +22294,33 @@ /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) "gcf" = ( -/obj/structure/table/glass, -/obj/machinery/cell_charger{ - pixel_x = -2; - pixel_y = 11 - }, -/obj/item/assembly/signaler{ - pixel_x = -9; - pixel_y = 4 - }, -/obj/item/stock_parts/power_store/cell/high{ - charge = 100; - maxcharge = 15000; - pixel_x = -1; - pixel_y = 9 - }, -/obj/item/food/chocolatebar{ - pixel_x = 6; - pixel_y = -3 +/obj/structure/chair/comfy/beige{ + dir = 4 }, -/turf/open/floor/carpet, -/area/station/command/bridge) +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room/council) "gch" = ( /obj/machinery/door/airlock/virology/glass{ name = "Entrance to Malpractice Tower" }, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/access/all/medical/virology, +/obj/machinery/door/firedoor, /turf/open/floor/iron/textured_large, /area/station/medical/virology) +"gci" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay-office"; + name = "Medbay Shutters"; + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/medical/medbay/central) "gck" = ( /obj/structure/railing{ dir = 8 @@ -20964,16 +22328,18 @@ /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/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) -"gcm" = ( -/obj/effect/turf_decal/siding/brown, -/obj/structure/chair/sofa/corp{ +"gco" = ( +/obj/machinery/computer/security/telescreen/minisat/directional/south{ + name = "AI Ministat Camera Monitor" + }, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/modular_computer/preset/engineering{ dir = 1 }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) "gct" = ( /obj/effect/turf_decal/box/white, /turf/open/floor/engine, @@ -20987,6 +22353,10 @@ /obj/effect/turf_decal/trimline/purple/filled/mid_joiner, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) +"gcx" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "gcE" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -21004,8 +22374,19 @@ /obj/effect/turf_decal/trimline/green/filled/line, /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) +"gcT" = ( +/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/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "gde" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/structure/cable, @@ -21020,6 +22401,17 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"gdt" = ( +/obj/structure/window/spawner/directional/east, +/obj/structure/disposaloutlet, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/light/very_dim/directional/north, +/obj/structure/plasticflaps, +/obj/effect/turf_decal/stripes/red/box, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "gdu" = ( /obj/item/toy/plush/moth{ name = "Stockpile Sammy"; @@ -21036,21 +22428,39 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"gdx" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/light/directional/south, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/cmo) "gdG" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) -"gdP" = ( -/obj/structure/lattice/catwalk, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 +"gdS" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/port) +"gdW" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 6 }, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) -"gef" = ( -/obj/structure/chair/office, -/turf/open/floor/iron, -/area/station/engineering/lobby) +/obj/machinery/meter{ + name = "O2 meter" + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"ged" = ( +/obj/structure/closet/secure_closet/atmospherics, +/obj/structure/fireaxecabinet/directional/south, +/turf/open/floor/glass/plasma, +/area/station/engineering/atmos/upper) "gei" = ( /obj/structure/railing{ dir = 4 @@ -21062,15 +22472,6 @@ /obj/structure/railing/corner, /turf/open/floor/engine/hull, /area/space/nearstation) -"gex" = ( -/obj/structure/railing, -/obj/structure/flora/bush/fullgrass/style_random, -/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/west, -/turf/open/floor/grass, -/area/station/hallway/primary/starboard) "geA" = ( /obj/effect/turf_decal/siding/red/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21085,26 +22486,23 @@ /obj/machinery/door/poddoor/incinerator_ordmix, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) -"geE" = ( -/obj/structure/closet/crate/secure/engineering{ - name = "Advanced Materials" - }, -/obj/item/stack/sheet/plasteel, -/obj/item/stack/sheet/mineral/plasma{ - amount = 30 - }, -/obj/effect/turf_decal/delivery/white{ - color = "#52B4E9" +"geJ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 }, -/turf/open/floor/engine, -/area/station/engineering/break_room) +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "geK" = ( /turf/open/floor/iron, /area/station/cargo/storage) "geL" = ( -/obj/machinery/pdapainter/medbay, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "geM" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -21120,17 +22518,29 @@ /obj/effect/landmark/navigate_destination/bar, /turf/open/floor/wood/large, /area/station/commons/lounge) +"geU" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/firealarm/directional/south, +/turf/open/openspace, +/area/station/medical/medbay/central) "gfc" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/sign/poster/contraband/microwave/directional/south, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"gfd" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "gfh" = ( /obj/structure/railing{ dir = 4 }, /turf/open/floor/engine/hull/air, /area/station/maintenance/port/aft) +"gfi" = ( +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "gfo" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -21140,17 +22550,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"gfs" = ( -/obj/machinery/airalarm/directional/north, -/obj/structure/cable, -/obj/machinery/computer/turbine_computer, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "gfz" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/disposalpipe/segment, @@ -21172,7 +22571,8 @@ "gfG" = ( /obj/machinery/light/directional/west, /obj/structure/sign/painting/library{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/glass/reinforced, /area/station/service/library) @@ -21203,28 +22603,20 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 }, -/obj/machinery/button/elevator{ - id = "catwalk_sec"; - pixel_y = 25 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /obj/machinery/camera/autoname/directional/north, +/obj/machinery/button/elevator/directional/north{ + id = "catwalk_sec" + }, /turf/open/floor/iron/dark, /area/station/security/brig) -"ggp" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/spawner/random/medical/memeorgans, -/turf/open/floor/iron/white, -/area/station/maintenance/starboard/lesser) "ggq" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/aft) "ggt" = ( @@ -21236,61 +22628,75 @@ /obj/structure/lattice/catwalk, /obj/structure/ladder, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"ggA" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "SM_Outside_shutters"; + name = "Outside Shutters"; + dir = 1 + }, +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"ggD" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard/upper) "ggE" = ( /obj/machinery/porta_turret/ai{ dir = 4 }, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ggH" = ( -/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/red/opposingcorners{ dir = 1 }, +/obj/effect/landmark/start/depsec/supply, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) -"ggJ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 8 +"ggK" = ( +/obj/effect/turf_decal/siding, +/obj/effect/turf_decal/trimline/white/line{ + dir = 1 }, -/obj/machinery/status_display/evac/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/openspace, -/area/station/medical/virology) -"ggN" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/wood/large, -/area/station/service/theater_dressing) +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "ggQ" = ( /obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"ggU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"ggW" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) +"ggR" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/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, +/area/station/medical/office) "ggX" = ( -/obj/structure/cable/multilayer/multiz, -/obj/machinery/firealarm/directional/east, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/engineering/hallway) +/area/station/engineering/engine_smes) "ghb" = ( /obj/machinery/light/directional/east, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "ghe" = ( /obj/structure/table, /obj/item/pen/fountain{ @@ -21324,12 +22730,28 @@ /turf/open/floor/iron/dark/diagonal, /area/station/service/theater) "ghA" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 6 +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/edge{ + dir = 4 }, -/turf/open/openspace, /area/station/hallway/primary/central) +"ghI" = ( +/obj/structure/table, +/obj/item/stock_parts/subspace/analyzer, +/obj/item/stock_parts/subspace/analyzer, +/obj/item/stock_parts/subspace/analyzer, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Telecomms - Storage" + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "ghO" = ( /obj/item/coin/antagtoken, /obj/item/coin/antagtoken{ @@ -21344,54 +22766,33 @@ /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) "ghR" = ( -/obj/structure/rack, /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 1 + dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ dir = 8 }, -/obj/item/tank/internals/anesthetic{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/tank/internals/anesthetic, -/obj/item/tank/internals/anesthetic{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/item/clothing/mask/breath/medical{ - pixel_y = -6 - }, -/obj/item/clothing/mask/breath/medical{ - pixel_y = -3 - }, -/obj/item/clothing/mask/breath/medical, +/obj/machinery/status_display/ai/directional/west, /turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) +/area/station/medical/medbay/central) "ghV" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/science/lobby) "ghZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/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/catwalk_floor, /area/station/cargo/storage) "gie" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 8 +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/iron/white/textured_large, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, /area/station/medical/medbay/central) "gif" = ( /obj/machinery/door/airlock/security{ @@ -21404,33 +22805,31 @@ name = "Armory" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "gih" = ( -/obj/machinery/chem_dispenser, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/dark, -/area/station/medical/chemistry) -"gii" = ( -/obj/machinery/computer/telecomms/server{ - dir = 8; - network = "tcommsat" +/obj/structure/rack, +/obj/item/plunger{ + pixel_x = -5; + pixel_y = 11 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 +/obj/item/plunger{ + pixel_y = 6 }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"gim" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 +/obj/machinery/button/door/directional/east{ + id = "chem_lockdown"; + name = "chemistry lockdown control"; + req_access = list("pharmacy") }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"gij" = ( +/obj/machinery/duct, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "gir" = ( /obj/effect/decal/cleanable/blood/old, /obj/structure/disposalpipe/trunk/multiz{ @@ -21438,43 +22837,63 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) -"gix" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) "giz" = ( /obj/machinery/door/firedoor/border_only{ dir = 4 }, /turf/open/floor/carpet/black, /area/station/service/theater) -"giB" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Secure Tech Storage" - }, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "giE" = ( -/obj/structure/railing{ +/obj/effect/turf_decal/siding/blue{ dir = 8 }, -/obj/effect/turf_decal/siding/blue{ +/obj/structure/railing{ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) +"giG" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"gjd" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 6 + }, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) +"gji" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible, +/obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark, -/area/station/command/bridge) -"giT" = ( -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) -"gjb" = ( -/turf/closed/wall/r_wall, -/area/station/engineering/hallway) +/area/station/engineering/atmos/upper) +"gjj" = ( +/obj/machinery/holopad, +/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/iron/dark/textured_large, +/area/station/medical/morgue) "gjn" = ( /obj/item/kirbyplants/random, /obj/machinery/airalarm/directional/south, @@ -21489,6 +22908,11 @@ /obj/machinery/air_sensor, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"gjA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/textured_large, +/area/station/medical/abandoned) "gjB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair{ @@ -21501,20 +22925,11 @@ "gjH" = ( /turf/open/openspace, /area/station/hallway/secondary/service) -"gjM" = ( -/obj/structure/fluff/paper/stack, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) -"gjU" = ( -/obj/effect/spawner/structure/window, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/security/courtroom) +"gjR" = ( +/obj/machinery/light_switch/directional/west, +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "gjW" = ( /obj/effect/decal/cleanable/food/tomato_smudge, /obj/effect/decal/cleanable/dirt/dust, @@ -21524,29 +22939,17 @@ /obj/structure/railing{ dir = 8 }, -/obj/machinery/conveyor{ - dir = 4; - id = "cargoload" - }, -/obj/structure/closet/crate, -/obj/effect/spawner/random/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/toy/figure/cargotech, -/obj/item/toy/figure/cargotech, -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/storage) -"gki" = ( /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/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "gkn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21562,7 +22965,22 @@ dir = 1 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"gkB" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Bridge Escape" + }, +/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/turf_decal/tile/dark_blue/fourcorners, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "gkN" = ( /obj/structure/closet/crate/trashcart/filled, /obj/effect/spawner/random/maintenance, @@ -21572,21 +22990,6 @@ /obj/effect/landmark/start/botanist, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"gkP" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "CO2 to Port" - }, -/obj/effect/turf_decal/tile/dark/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) -"gkW" = ( -/obj/machinery/shower/directional/west, -/obj/structure/fluff/shower_drain, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 1 - }, -/area/station/engineering/main) "gla" = ( /obj/structure/railing/corner{ dir = 4 @@ -21610,10 +23013,6 @@ }, /turf/open/floor/glass, /area/station/service/kitchen) -"gll" = ( -/obj/effect/landmark/event_spawn, -/turf/open/openspace, -/area/station/science/research) "glm" = ( /obj/structure/ladder, /obj/structure/lattice/catwalk, @@ -21625,7 +23024,20 @@ dir = 1 }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) +"glw" = ( +/obj/effect/turf_decal/siding, +/obj/effect/turf_decal/trimline/white/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "glz" = ( /turf/open/floor/iron/chapel{ dir = 1 @@ -21635,26 +23047,20 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"glF" = ( +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "glH" = ( -/obj/effect/landmark/start/paramedic, -/turf/open/floor/wood, -/area/station/medical/medbay/central) -"glJ" = ( -/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/yellow/filled/corner, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) +/obj/effect/spawner/structure/window, +/obj/structure/disposalpipe/trunk/multiz{ + dir = 2 + }, +/turf/open/floor/plating, +/area/station/medical/cryo) "glL" = ( /turf/closed/wall/mineral/plastitanium, /area/space/nearstation) -"glN" = ( -/obj/machinery/camera/preset/ordnance{ - c_tag = "Cannon's exit" - }, -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/lesser) "glU" = ( /obj/machinery/door/airlock/mining{ name = "Cargo Bay" @@ -21663,19 +23069,10 @@ /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/supply/general, /obj/effect/turf_decal/tile/brown/fourcorners, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/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, /turf/open/floor/iron, /area/station/cargo/storage) -"gmc" = ( -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) "gmd" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -21744,21 +23141,22 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/dark, /area/station/science/lobby) -"gmh" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) -"gmm" = ( -/obj/machinery/air_sensor/plasma_tank, -/obj/structure/window/reinforced/plasma/spawner/directional/north, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos/upper) +"gmq" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/engineering/lobby) "gmt" = ( /obj/item/clothing/head/wig/random, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/space/nearstation) +"gmu" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "gmy" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -21770,10 +23168,21 @@ }, /turf/open/openspace, /area/station/construction/storage_wing) +"gmD" = ( +/turf/closed/wall/r_wall, +/area/station/engineering/supermatter/room/upper) "gmE" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/primary/central) +"gmF" = ( +/obj/structure/lattice/catwalk, +/obj/item/clothing/shoes/wheelys/rollerskates{ + pixel_x = 3; + pixel_y = -5 + }, +/turf/open/openspace, +/area/station/maintenance/department/crew_quarters/dorms) "gmJ" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron/smooth_large, @@ -21799,35 +23208,37 @@ /turf/open/floor/iron, /area/station/science/xenobiology/hallway) "gnf" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/tile/red/opposingcorners{ +/obj/structure/chair/plastic{ dir = 1 }, -/turf/open/floor/iron/dark, +/turf/open/floor/wood/large, /area/station/hallway/primary/central) -"gng" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/west, -/turf/open/space/openspace, -/area/space/nearstation) "gnk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"gnm" = ( +/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/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/office) "gnp" = ( /obj/structure/showcase/machinery/tv, /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/port/greater) "gnt" = ( -/obj/structure/cable, -/obj/structure/railing/corner/end/flip{ - dir = 8 - }, -/obj/structure/railing/corner/end{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "gnu" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/effect/decal/cleanable/dirt, @@ -21836,10 +23247,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"gnw" = ( -/obj/structure/ladder, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) "gnx" = ( /obj/structure/table/reinforced, /obj/machinery/recharger{ @@ -21864,7 +23271,7 @@ /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "gnK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/closed/wall/r_wall, @@ -21882,24 +23289,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"gnU" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) -"gnV" = ( -/obj/structure/cable, -/obj/effect/landmark/start/assistant, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction/flip{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark/arrow_ccw, -/obj/effect/turf_decal/trimline/dark/arrow_ccw, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "gnY" = ( /obj/structure/railing{ dir = 4 @@ -21911,17 +23300,8 @@ }, /area/station/maintenance/port/aft) "gob" = ( -/obj/item/wheelchair{ - pixel_y = -3 - }, -/obj/item/wheelchair, -/obj/item/wheelchair{ - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/structure/rack, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/landmark/start/paramedic, /turf/open/floor/iron/dark, /area/station/medical/cryo) "gog" = ( @@ -21948,18 +23328,7 @@ name = "Private Channel" }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) -"gom" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "viro-passthrough" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) +/area/station/ai/satellite/chamber) "got" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, @@ -21976,19 +23345,15 @@ dir = 8 }, /area/station/cargo/storage) -"goI" = ( -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/effect/turf_decal/trimline/green/filled/mid_joiner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/virology) -"goM" = ( -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer2{ - dir = 1 +"goK" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/machinery/status_display/ai/directional/south, +/obj/effect/turf_decal/siding/dark{ + dir = 10 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "goN" = ( /obj/machinery/light/directional/south, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -22006,10 +23371,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) -"goU" = ( -/obj/structure/cable/layer1, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "goW" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/decal/cleanable/dirt, @@ -22018,17 +23379,21 @@ }, /turf/open/floor/wood, /area/station/hallway/primary/central) -"gph" = ( +"gpb" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/reagent_dispensers/watertank/high, /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/mail_sorting/engineering/ce_office, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1 +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) +"gpd" = ( +/obj/structure/railing{ + dir = 8 }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +/turf/open/floor/carpet/black, +/area/station/service/library/private) "gpk" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 1 @@ -22049,27 +23414,26 @@ /turf/open/floor/iron/checker, /area/station/service/janitor) "gpx" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners{ +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) +"gpD" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "gpI" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"gpJ" = ( -/obj/structure/table, -/obj/item/phone{ - pixel_x = 6; - pixel_y = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "gpO" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -22077,12 +23441,26 @@ id = "qm_cargobay"; dir = 8 }, +/obj/structure/cable, /turf/open/floor/plating, /area/station/security/checkpoint/supply) -"gpU" = ( -/obj/effect/spawner/structure/window, +"gpS" = ( +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/commons/dorms) +/area/station/hallway/primary/fore) +"gpT" = ( +/obj/machinery/door/airlock/grunge{ + name = "Morgue" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, +/turf/open/floor/iron/dark/small, +/area/station/medical/morgue) +"gpU" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/hallway/primary/central) "gqa" = ( /obj/structure/mop_bucket/janitorialcart{ dir = 8 @@ -22095,19 +23473,17 @@ }, /turf/open/floor/iron/checker, /area/station/service/janitor) -"gqb" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 1 +"gqc" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/fax{ + fax_name = "Chief Engineer's Office"; + name = "Chief Engineer's Fax Machine" }, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) -"gqh" = ( -/obj/item/cigbutt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/disposalpipe/trunk/multiz, -/turf/open/floor/wood, -/area/station/commons/dorms) +/obj/effect/turf_decal/siding/yellow/end{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "gqj" = ( /obj/machinery/door/airlock/wood{ name = "Curator Office" @@ -22116,16 +23492,24 @@ /obj/machinery/door/firedoor, /turf/open/floor/wood/large, /area/station/hallway/secondary/service) +"gql" = ( +/obj/machinery/atmospherics/pipe/multiz/orange/visible{ + dir = 8 + }, +/obj/machinery/meter, +/obj/structure/railing/corner, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "gqn" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) "gqp" = ( @@ -22135,20 +23519,26 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"gqv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "gqz" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ dir = 5 }, /turf/open/space/openspace, /area/space/nearstation) +"gqH" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos) "gqI" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/station/security/warden) -"gqM" = ( -/obj/effect/spawner/random/trash/cigbutt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "gqT" = ( /obj/structure/railing{ dir = 8 @@ -22157,11 +23547,19 @@ dir = 4 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "grb" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) +"grc" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/turf/open/floor/catwalk_floor{ + initial_gas_mix = "n2=100;TEMP=80" + }, +/area/station/science/server) "grd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -22172,13 +23570,11 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) -"gro" = ( -/obj/structure/cable/layer1, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +"grm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/emcloset, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "grr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -22186,11 +23582,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) -"grx" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/obj/item/clothing/mask/joy, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/aft) "grJ" = ( /obj/item/kirbyplants/random, /obj/structure/sign/poster/official/random/directional/south, @@ -22204,6 +23595,13 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) +"gsd" = ( +/obj/effect/decal/cleanable/dirt, +/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/maintenance/starboard) "gse" = ( /turf/open/floor/wood, /area/station/hallway/secondary/service) @@ -22214,10 +23612,6 @@ /obj/structure/cable, /turf/open/openspace, /area/station/hallway/secondary/construction) -"gsq" = ( -/obj/effect/landmark/firealarm_sanity, -/turf/open/openspace, -/area/station/medical/chemistry) "gsL" = ( /obj/effect/landmark/event_spawn, /obj/structure/disposalpipe/segment, @@ -22226,18 +23620,6 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) -"gtd" = ( -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"gti" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/structure/sign/directions/supply/directional/east{ - dir = 2 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "gtk" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/railing{ @@ -22245,6 +23627,17 @@ }, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"gtm" = ( +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmosmaintedge" + }, +/turf/open/floor/plating, +/area/station/engineering/atmos) "gtq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22252,6 +23645,17 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood/tile, /area/station/science/robotics) +"gts" = ( +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/chair/comfy/beige{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "gtt" = ( /obj/structure/railing{ dir = 8 @@ -22261,9 +23665,6 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) -"gtw" = ( -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) "gty" = ( /obj/structure/railing, /obj/effect/turf_decal/trimline/purple/filled/line, @@ -22281,12 +23682,15 @@ /obj/structure/bed, /turf/open/floor/plating, /area/station/security/execution/education) -"gtG" = ( -/obj/structure/disposalpipe/trunk/multiz/down{ +"gtC" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 }, -/turf/open/floor/plating, -/area/station/medical/medbay/central) +/obj/effect/turf_decal/trimline/yellow/mid_joiner{ + dir = 4 + }, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "gtO" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/wood, @@ -22306,28 +23710,20 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"gtW" = ( -/obj/structure/table/wood, -/obj/item/book/bible{ - pixel_y = 4 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) "gtZ" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/siding/wood, /obj/machinery/firealarm/directional/west, /turf/open/floor/wood, /area/station/hallway/primary/central) -"gug" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" +"guh" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 }, -/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/freezer, -/area/station/commons/toilet/restrooms) +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) "guk" = ( /obj/effect/landmark/start/scientist, /turf/open/floor/iron/dark, @@ -22344,7 +23740,7 @@ /obj/structure/cable, /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/maintenance/port) "gup" = ( @@ -22356,25 +23752,12 @@ }, /turf/open/floor/iron, /area/station/science/research) -"guy" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "guD" = ( /obj/effect/turf_decal/siding/dark{ dir = 1 }, /turf/open/floor/iron/dark/textured_half, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"guF" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) +/area/station/ai/satellite/foyer) "guO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -22388,14 +23771,12 @@ "guV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/event_spawn, -/obj/machinery/conveyor_switch/oneway{ - dir = 1; - id = "mining" +/obj/structure/cable, +/obj/structure/disposalpipe/junction{ + dir = 1 }, /turf/open/floor/iron, -/area/station/cargo/miningoffice) +/area/station/cargo/storage) "gvb" = ( /obj/machinery/light/directional/west, /obj/structure/cable, @@ -22418,22 +23799,30 @@ /obj/item/radio/intercom/prison/directional/west, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) -"gvk" = ( -/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/lesser) +"gvi" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/office) "gvI" = ( /obj/effect/turf_decal/stripes/end, /turf/open/floor/iron/dark/smooth_large, /area/station/science/ordnance/storage) -"gvK" = ( +"gvM" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) +"gvR" = ( +/obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, -/obj/structure/lattice/catwalk, -/obj/structure/holosign/barrier/engineering, -/turf/open/openspace, -/area/station/engineering/atmos/project) +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/structure/closet/secure_closet/security/med, +/obj/item/book/manual/wiki/security_space_law, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) "gvU" = ( /obj/machinery/plate_press, /obj/effect/turf_decal/stripes/line, @@ -22442,22 +23831,17 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/security/prison) -"gwg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"gwx" = ( -/obj/machinery/door/airlock/external{ - name = "MiniSat Space Access Airlock" +"gwk" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/trunk/multiz{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "AI-Transit-Tube-Access" +/obj/machinery/door/poddoor/preopen{ + id = "capshut" }, -/obj/effect/mapping_helpers/airlock/access/all/command/minisat, +/obj/structure/cable, /turf/open/floor/plating, -/area/station/engineering/transit_tube) +/area/station/command/heads_quarters/captain/private) "gwD" = ( /obj/item/stack/ore/gold{ pixel_x = -8; @@ -22477,6 +23861,21 @@ "gwK" = ( /turf/open/floor/engine/hull/air, /area/station/security/courtroom) +"gwN" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"gxb" = ( +/obj/structure/table/reinforced, +/obj/item/binoculars, +/obj/item/binoculars, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "gxl" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -22501,7 +23900,9 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/corner{ + dir = 8 + }, /area/station/hallway/primary/central) "gyc" = ( /obj/structure/table/wood, @@ -22519,15 +23920,23 @@ dir = 1 }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) "gyh" = ( -/obj/machinery/chem_heater/withbuffer, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, +/obj/structure/reagent_dispensers/plumbed/storage, +/obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/medical/chemistry) +"gyi" = ( +/obj/structure/dresser, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/wood, +/area/station/commons/dorms) "gym" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -22557,6 +23966,15 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) +"gyr" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/structure/table, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) "gys" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/bed{ @@ -22568,8 +23986,13 @@ /area/station/security/brig) "gyw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet, -/area/station/command/bridge) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "gyz" = ( /obj/machinery/camera/autoname/directional/west, /turf/open/floor/plating, @@ -22613,10 +24036,26 @@ /obj/structure/fake_stairs/directional/north, /turf/open/floor/iron, /area/station/engineering/lobby) +"gzc" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "gzh" = ( /obj/structure/closet/firecloset, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"gzi" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/railing, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "gzm" = ( /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, @@ -22640,29 +24079,27 @@ /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) "gzt" = ( -/obj/structure/table/wood, -/obj/item/folder/blue{ - pixel_x = 6; - pixel_y = -3 - }, -/obj/item/paper_bin{ - pixel_x = -5; - pixel_y = 9 - }, -/obj/item/pen/fountain/captain{ - pixel_y = -6 - }, -/obj/item/stamp/denied{ - pixel_x = 8; - pixel_y = 10 +/obj/effect/landmark/start/captain, +/obj/structure/chair/comfy/black{ + dir = 8 }, -/turf/open/floor/carpet, +/obj/effect/turf_decal/siding/wood/end, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "gzH" = ( /obj/item/kirbyplants/photosynthetic, /obj/effect/turf_decal/siding/dark, /turf/open/floor/iron/white/textured_half, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"gzJ" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) "gAa" = ( /obj/machinery/modular_computer/preset/id{ dir = 1 @@ -22675,6 +24112,9 @@ "gAb" = ( /obj/structure/chair/office, /obj/effect/landmark/start/station_engineer, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/lobby) "gAd" = ( @@ -22686,39 +24126,35 @@ "gAf" = ( /turf/closed/wall/r_wall, /area/station/hallway/secondary/entry) +"gAh" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "gAl" = ( /obj/item/restraints/legcuffs/beartrap/prearmed, /turf/open/floor/plating, /area/station/maintenance/port) -"gAt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair{ - dir = 8; - pixel_y = -2 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"gAC" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/engineering) +"gAz" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "gAI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/science/ordnance/storage) -"gAM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"gAS" = ( +/obj/item/ammo_casing/spent{ + pixel_x = -11; + pixel_y = -5 + }, +/obj/item/ammo_casing/spent{ + pixel_x = -6; + pixel_y = 2 + }, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/central/upper) "gAT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/trimline/red/warning{ @@ -22739,39 +24175,84 @@ /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) "gAZ" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) -"gBf" = ( -/obj/structure/lattice/catwalk, -/obj/item/stack/rods, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) -"gBg" = ( -/obj/structure/flora/rock/pile, -/obj/structure/flora/bush/jungle/b/style_2, -/obj/effect/turf_decal/siding/thinplating_new/dark/end{ - dir = 4 +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = -3 }, -/obj/structure/railing, -/obj/structure/railing{ - dir = 1 +/obj/item/storage/medkit/o2{ + pixel_x = 3; + pixel_y = 3 }, -/obj/structure/disposalpipe/segment, -/turf/open/misc/asteroid, -/area/station/science/robotics) -"gBp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/closet_maintenance, -/obj/effect/spawner/random/maintenance/four, +/obj/item/storage/medkit/o2, +/obj/item/storage/medkit/o2{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/machinery/door/window/right/directional/west{ + name = "First Aid Supplies"; + req_access = list("medical") + }, +/obj/structure/table/reinforced/rglass, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) +"gBe" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/stack, +/turf/open/floor/wood, +/area/station/maintenance/aft) +"gBg" = ( +/obj/structure/flora/rock/pile, +/obj/structure/flora/bush/jungle/b/style_2, +/obj/effect/turf_decal/siding/thinplating_new/dark/end{ + dir = 4 + }, +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/misc/asteroid, +/area/station/science/robotics) +"gBp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance/four, /turf/open/floor/plating, /area/station/construction/storage_wing) +"gBr" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"gBu" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/button/door/directional/east{ + id = "Cabin7"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "gBA" = ( /obj/machinery/camera/directional/south{ c_tag = "Science - Xenobiology Big Pen" }, /turf/open/floor/engine, /area/station/science/xenobiology) +"gBC" = ( +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "O2 Multideck Adapter"; + dir = 2 + }, +/obj/machinery/meter{ + name = "O2 meter" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/turf_decal/box/white, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "gBE" = ( /obj/structure/chair/sofa/right/brown{ dir = 8 @@ -22790,11 +24271,17 @@ /turf/open/floor/iron, /area/station/hallway/primary/port) "gBG" = ( -/obj/machinery/computer/communications{ - dir = 1 +/obj/machinery/firealarm/directional/east, +/obj/machinery/modular_computer/preset/id{ + dir = 8 }, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/carpet, +/obj/machinery/button/door/directional/south{ + id = "capshut"; + name = "Captain Shutters"; + pixel_x = -6; + pixel_y = -28 + }, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) "gBR" = ( /obj/structure/lattice/catwalk, @@ -22809,39 +24296,17 @@ }, /turf/open/openspace, /area/station/command/gateway) -"gBV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8; - pixel_x = -2 - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/engine, -/area/station/engineering/break_room) -"gBY" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/iron/freezer, -/area/station/engineering/atmos/pumproom) -"gCa" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 10 - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) -"gCn" = ( -/obj/structure/lattice, -/obj/item/toy/figure/ninja{ - name = "Space Ninja"; - desc = "How did he get there??"; - pixel_x = -8; - pixel_y = 7 +"gBZ" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{ + dir = 8 }, -/turf/open/space/basic, -/area/space/nearstation) -"gCv" = ( -/obj/structure/ladder, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"gCu" = ( +/obj/structure/broken_flooring/side/directional/east, +/obj/machinery/light_switch/directional/north, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/engineering/storage_shared) "gCx" = ( /obj/structure/table/reinforced/rglass, /obj/item/megaphone/sec{ @@ -22860,12 +24325,6 @@ /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, /turf/open/floor/plating, /area/station/security/interrogation) -"gCQ" = ( -/obj/machinery/shower/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/freezer, -/area/station/commons/dorms) "gCU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22875,20 +24334,47 @@ /area/station/security/prison) "gDc" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/trunk/multiz{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/door/poddoor/preopen{ + id = "capshut" }, +/obj/structure/cable, /turf/open/floor/plating, /area/station/command/heads_quarters/captain/private) +"gDe" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft) +"gDk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/engineering/atmos/upper) +"gDo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "gDs" = ( -/obj/item/kirbyplants/random, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "gDE" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -22934,6 +24420,16 @@ }, /turf/open/floor/iron, /area/station/science/research) +"gDZ" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "gEb" = ( /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/dark_blue{ @@ -22972,12 +24468,6 @@ /obj/machinery/grill, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) -"gEE" = ( -/obj/structure/chair/pew/left{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/station/maintenance/starboard/lesser) "gEN" = ( /obj/machinery/porta_turret/ai{ dir = 4 @@ -22986,18 +24476,7 @@ dir = 5 }, /turf/open/floor/engine/hull/reinforced/air, -/area/station/ai_monitored/turret_protected/ai) -"gEZ" = ( -/obj/item/toy/cards/deck{ - pixel_y = 4 - }, -/obj/structure/table, -/obj/item/food/hotcrossbun{ - pixel_x = 10; - pixel_y = 12 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) +/area/station/ai/satellite/chamber) "gFa" = ( /obj/structure/table/reinforced, /obj/item/plant_analyzer, @@ -23019,34 +24498,28 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) -"gFk" = ( -/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/yellow/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) "gFm" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /turf/closed/wall, /area/station/service/hydroponics/garden/abandoned) -"gFp" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/engineering{ - name = "Engine Room" +"gFn" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "gFt" = ( -/obj/machinery/smartfridge/organ, -/obj/item/radio/intercom/directional/south, +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/obj/machinery/newscaster/directional/south, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) "gFx" = ( @@ -23056,23 +24529,27 @@ /turf/open/floor/iron/dark, /area/station/security/brig) "gFB" = ( -/obj/structure/closet/secure_closet/security/cargo, -/obj/machinery/light_switch/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Cargo Bay - Security Post (Low)" - }, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, +/obj/structure/cable, +/obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) +"gFF" = ( +/obj/machinery/mech_bay_recharge_port, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/maintenance/starboard/aft/upper) "gFI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/camera/autoname/directional/south{ network = list("minisat") }, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "gFU" = ( /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -23084,24 +24561,6 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/dark, /area/station/security/medical) -"gFW" = ( -/obj/machinery/duct, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"gGb" = ( -/obj/machinery/computer/apc_control{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) -"gGl" = ( -/turf/open/floor/iron/stairs{ - dir = 1 - }, -/area/station/maintenance/starboard/lesser) "gGx" = ( /obj/structure/railing/corner{ dir = 1 @@ -23112,10 +24571,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, /area/station/science/cytology) -"gGB" = ( -/obj/structure/cable, -/turf/closed/wall, -/area/station/maintenance/starboard/fore) "gGF" = ( /obj/structure/railing/corner, /obj/effect/turf_decal/siding/wood/corner, @@ -23132,14 +24587,16 @@ /turf/open/floor/grass, /area/station/hallway/secondary/entry) "gGJ" = ( -/obj/machinery/modular_computer/preset/id{ - dir = 8 - }, /obj/structure/disposalpipe/segment{ - dir = 9 + dir = 10 }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/recharge_station, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "gGO" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -23156,19 +24613,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/processing) -"gHa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"gHs" = ( /obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail{ - dir = 4 - }, -/obj/effect/mapping_helpers/mail_sorting/medbay/chemistry, -/obj/effect/mapping_helpers/mail_sorting/medbay/cmo_office, -/obj/effect/mapping_helpers/mail_sorting/medbay/general, -/obj/effect/mapping_helpers/mail_sorting/medbay/virology, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) +/obj/structure/filingcabinet/medical, +/turf/open/floor/carpet/cyan, +/area/station/command/heads_quarters/cmo) "gHC" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -23188,12 +24637,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"gHH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/icecream_vat, -/turf/open/floor/iron, -/area/station/maintenance/starboard/central) "gHJ" = ( /obj/structure/table, /obj/machinery/requests_console/directional/west{ @@ -23250,10 +24693,28 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"gIz" = ( +/obj/item/statuebust, +/turf/open/floor/iron/vaporwave, +/area/station/maintenance/starboard/aft/upper) "gIE" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/storage/art) +"gIQ" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "SM_Outside_shutters"; + name = "Outside Shutters"; + dir = 1 + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"gIR" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "gJg" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ dir = 8 @@ -23270,31 +24731,44 @@ }, /turf/open/space/basic, /area/space/nearstation) -"gJi" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/camera/autoname/directional/north, -/turf/open/openspace, -/area/station/maintenance/starboard/fore) -"gJp" = ( -/obj/structure/lattice/catwalk, -/obj/structure/ladder, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/openspace, -/area/station/medical/cryo) -"gJT" = ( -/obj/structure/rack, -/obj/item/clothing/glasses/meson, -/obj/item/geiger_counter, -/obj/item/clothing/head/utility/radiation, -/obj/item/clothing/suit/utility/radiation, +"gJm" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) +"gJp" = ( /obj/machinery/firealarm/directional/north, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 1 + }, +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/holofloor/dark, +/area/station/command/heads_quarters/cmo) +"gJv" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"gJw" = ( +/obj/effect/spawner/random/maintenance, +/obj/effect/decal/cleanable/blood/oil, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) +"gJY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/checkpoint/engineering) "gKa" = ( /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/tile/dark_blue{ @@ -23303,54 +24777,50 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"gKk" = ( -/obj/item/stack/sticky_tape{ - pixel_x = 8; - pixel_y = 14 - }, -/obj/structure/table, -/obj/item/stack/sticky_tape{ - pixel_x = -4; - pixel_y = 11 - }, -/obj/item/screwdriver, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "gKo" = ( /obj/structure/flora/bush/flowers_br/style_random, /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, /area/station/hallway/secondary/entry) -"gKs" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/camera/autoname/directional/north, -/obj/structure/table/reinforced, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/obj/machinery/airalarm/directional/north, +"gKq" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"gKw" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/hot_temp/directional/north, +/turf/open/space/basic, +/area/space/nearstation) +"gKE" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, -/area/station/engineering/storage) -"gKL" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +/area/station/command/bridge) "gKN" = ( /obj/machinery/holopad/secure{ pixel_y = -1 }, /mob/living/simple_animal/bot/secbot/beepsky/armsky, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/security/armory) -"gKO" = ( -/obj/structure/chair/pew/right{ - dir = 4 +/area/station/security/armory) +"gKT" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) +"gKX" = ( +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +/obj/effect/turf_decal/weather/snow, +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/maintenance/port) "gLc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/grime, @@ -23363,7 +24833,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "gLs" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/stripes/corner{ @@ -23377,21 +24847,14 @@ /turf/open/floor/iron/dark, /area/station/science/cytology) "gLD" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/requests_console/directional/east{ - name = "Quartermaster's Requests Console"; - department = "Quartermaster's Desk" - }, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/mapping_helpers/requests_console/ore_update, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) +/obj/effect/turf_decal/bot_white, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/iron/dark/textured_large, +/area/station/cargo/storage) +"gLE" = ( +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/glass/reinforced, +/area/station/medical/chemistry) "gLN" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark/textured_large, @@ -23401,27 +24864,29 @@ /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "gLT" = ( -/obj/structure/railing/corner/end{ - dir = 8 +/obj/machinery/holopad, +/obj/structure/railing{ + dir = 1 }, -/obj/effect/turf_decal/trimline/brown/filled/warning{ +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ dir = 1 }, /turf/open/floor/iron/textured, /area/station/cargo/storage) "gLU" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/sign/directions/engineering/directional/north{ - dir = 2 + dir = 2; + pixel_y = 0 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/turf/closed/wall, +/area/station/commons/toilet/auxiliary) "gLW" = ( /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, @@ -23441,6 +24906,13 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison/safe) +"gMB" = ( +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "gMI" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ @@ -23453,24 +24925,52 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/space/openspace, /area/space/nearstation) -"gMP" = ( -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics Testing Room" +"gMW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/machinery/door/firedoor/heavy, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) +/turf/open/floor/wood, +/area/station/commons/dorms) "gNf" = ( /obj/structure/light_construct/directional/east, /obj/effect/mapping_helpers/broken_floor, +/obj/structure/table/wood, +/obj/effect/spawner/random/maintenance, /turf/open/floor/wood, /area/station/maintenance/starboard/central) +"gNg" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"gNh" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "gNi" = ( /turf/open/floor/carpet, /area/station/security/detectives_office) +"gNp" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "gNq" = ( /obj/structure/table/reinforced, /turf/open/floor/wood, @@ -23478,30 +24978,28 @@ "gNr" = ( /turf/closed/wall, /area/station/service/library) +"gNx" = ( +/turf/closed/wall/r_wall, +/area/station/maintenance/aft) "gNy" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/light_switch/directional/west{ - pixel_y = 6 +/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/item/kirbyplants/random, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, +/turf/open/floor/iron/textured, /area/station/cargo/storage) "gND" = ( -/obj/effect/turf_decal/siding/blue/corner{ +/obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - name = "medical bed" - }, -/obj/machinery/defibrillator_mount/directional/south, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/obj/structure/table/reinforced/rglass, +/turf/open/floor/iron/white, +/area/station/medical/office) "gNK" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -23514,31 +25012,37 @@ /area/station/hallway/primary/aft) "gNL" = ( /obj/effect/turf_decal/plaque{ - icon_state = "L9" - }, -/obj/effect/turf_decal/siding/green{ - dir = 1 + icon_state = "L10" }, +/obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) +"gNR" = ( +/obj/effect/spawner/random/trash/mess, +/obj/item/toy/crayon/spraycan{ + pixel_x = 12; + pixel_y = 13 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "gNS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/cargo_technician, -/turf/open/floor/iron, -/area/station/cargo/storage) -"gNU" = ( -/obj/structure/railing{ - dir = 8 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 +/turf/open/floor/iron/dark/textured, +/area/station/cargo/sorting) +"gNU" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/aicard{ + pixel_x = 5 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/item/assembly/timer{ + pixel_x = -7 }, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "gNX" = ( /obj/machinery/computer/security/hos{ dir = 4 @@ -23555,24 +25059,27 @@ }, /turf/open/floor/plating, /area/station/science/lobby) -"gOd" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/item/pai_card, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"gOC" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 +"gOp" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/storage/briefcase/secure{ + pixel_y = 3 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/item/reagent_containers/cup/glass/bottle/whiskey{ + pixel_y = 9; + pixel_x = -6 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/medical/chemistry) -"gOE" = ( -/obj/machinery/atmospherics/components/unary/passive_vent, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) +/area/station/command/bridge) +"gOv" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "gOH" = ( /obj/structure/sink/kitchen/directional/west, /obj/machinery/light_switch/directional/east, @@ -23582,14 +25089,12 @@ /area/station/service/kitchen/coldroom) "gOK" = ( /obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, -/area/station/ai_monitored/command/storage/eva) -"gOL" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/o2{ - dir = 8 +/obj/effect/turf_decal/siding/dark{ + dir = 9 }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "gOR" = ( /obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron, @@ -23613,21 +25118,26 @@ /obj/machinery/drone_dispenser, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) -"gPj" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - Nitrogen Cell"; - name = "atmospherics camera" +"gPk" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ + dir = 8 }, -/turf/open/floor/engine/n2, +/obj/effect/turf_decal/bot_white, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/dark, /area/station/engineering/atmos/upper) "gPu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue/opposingcorners{ +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "gPv" = ( /obj/structure/chair/plastic{ dir = 4 @@ -23641,12 +25151,21 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"gPA" = ( -/obj/structure/chair{ +"gPz" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/carpet/black, +/area/station/service/library/private) +"gPC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/turf/open/floor/wood, -/area/station/commons/dorms) +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "gPE" = ( /obj/machinery/light/directional/west, /turf/open/openspace, @@ -23665,6 +25184,35 @@ /obj/machinery/airalarm/directional/north, /turf/open/openspace, /area/station/hallway/secondary/service) +"gPP" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 11 + }, +/obj/item/stamp/granted{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/stamp/denied{ + pixel_x = 6 + }, +/obj/item/pen{ + pixel_x = -1; + pixel_y = 13 + }, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"gPS" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 2; + name = "N2 to Mix" + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "gPW" = ( /turf/closed/wall, /area/station/maintenance/hallway/abandoned_recreation) @@ -23680,19 +25228,15 @@ /turf/open/floor/carpet/black, /area/station/maintenance/hallway/abandoned_recreation) "gQa" = ( -/obj/machinery/door/airlock/mining{ - name = "Quartermaster's Quarters" - }, -/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/qm, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) +/obj/effect/turf_decal/bot_white, +/obj/effect/spawner/random/structure/crate, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron/dark/textured_large, +/area/station/cargo/storage) "gQc" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "gQf" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 8 @@ -23702,21 +25246,18 @@ }, /obj/structure/sign/flag/nanotrasen/directional/south, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"gQi" = ( -/obj/machinery/vatgrower, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/interior) +"gQj" = ( +/obj/structure/table/wood, +/obj/item/book/bible, +/turf/open/floor/carpet, +/area/station/maintenance/starboard) "gQu" = ( /obj/structure/railing{ dir = 1 }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "gQA" = ( /obj/effect/turf_decal/trimline/dark/arrow_cw{ dir = 8 @@ -23739,14 +25280,25 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"gQH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "gQI" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/railing/corner/end{ dir = 8 }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, /turf/open/floor/iron, /area/station/cargo/storage) "gQL" = ( @@ -23770,46 +25322,20 @@ }, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"gQW" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/engine, -/area/station/engineering/break_room) -"gRn" = ( -/obj/effect/turf_decal/siding/yellow{ - dir = 8 - }, -/obj/structure/closet/crate/science, -/obj/structure/railing{ - dir = 8 - }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/reagent_containers/cup/bottle/epinephrine{ - pixel_x = 6; - pixel_y = -6 - }, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = -2; - pixel_y = -7 - }, -/obj/item/reagent_containers/dropper{ - pixel_x = 2; - pixel_y = -11 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/chemistry) -"gRx" = ( -/obj/machinery/portable_atmospherics/canister/plasma, -/obj/effect/turf_decal/delivery/white{ - color = "#ff6600" +"gQY" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"gRv" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/turf/open/floor/engine, -/area/station/engineering/break_room) +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "gRB" = ( /obj/machinery/door/airlock/research{ name = "Research and Development Lab" @@ -23834,7 +25360,7 @@ /area/station/service/chapel) "gRG" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "gRH" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, @@ -23846,43 +25372,63 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) -"gRI" = ( -/obj/machinery/modular_computer/preset/id{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) -"gRQ" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) -"gRT" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 - }, -/obj/effect/decal/cleanable/glitter, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "gRZ" = ( /obj/effect/turf_decal/bot, /obj/item/robot_suit, /turf/open/floor/iron/dark/textured_large, /area/station/science/robotics/lab) -"gSn" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ +"gSd" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/storage/briefcase/secure{ + pixel_x = 5; + pixel_y = 9 + }, +/obj/item/clothing/head/soft/blue{ + pixel_x = 10; + pixel_y = 1 + }, +/obj/item/toy/figure/cmo{ + pixel_x = -5 + }, +/turf/open/floor/holofloor/dark, +/area/station/command/heads_quarters/cmo) +"gSh" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner{ dir = 4 }, -/turf/open/floor/iron, +/turf/open/floor/wood, +/area/station/commons/toilet/restrooms) +"gSn" = ( +/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, /area/station/cargo/storage) "gSq" = ( /obj/machinery/light/directional/west, /turf/open/floor/wood/large, /area/station/hallway/primary/central) +"gSF" = ( +/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" + }, +/obj/structure/mirror/directional/west, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "gSG" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -23892,8 +25438,15 @@ dir = 1 }, /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 1 + }, /area/station/hallway/primary/central) +"gSH" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating/airless, +/area/station/maintenance/aft) "gSK" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -23914,37 +25467,11 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "gSX" = ( -/obj/machinery/plumbing/sender, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine/hull/air, -/area/station/medical/chemistry) -"gSY" = ( -/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/engineering/lobby) -"gTe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) -"gTm" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/machinery/light/directional/north, -/obj/structure/rack, -/obj/item/lightreplacer{ - pixel_y = 7 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 }, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) +/turf/open/floor/carpet/cyan, +/area/station/command/heads_quarters/cmo) "gTn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, @@ -23960,16 +25487,19 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/dark/textured_large, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/white, /area/station/medical/medbay/central) -"gTH" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/mug{ - pixel_x = -3; - pixel_y = 4 +"gTu" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) +/turf/open/floor/plating, +/area/station/maintenance/starboard) "gTL" = ( /obj/machinery/door/airlock/public/glass{ name = "Circle Center" @@ -23979,37 +25509,53 @@ dir = 1 }, /area/station/hallway/primary/aft) +"gTP" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "SM_Outside_shutters"; + name = "Outside Shutters"; + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "gTW" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/freezer, -/obj/item/food/raw_patty/corgi{ - pixel_x = -6; - pixel_y = 1 - }, -/obj/item/food/raw_patty/chicken{ - pixel_x = -2; - pixel_y = -4 - }, -/obj/item/food/raw_patty/bear{ - pixel_x = 4; - pixel_y = -6 - }, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, /obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) -"gTX" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/obj/structure/showcase/machinery/oldpod{ + desc = "An old NT branded sleeper, decommissioned after the lead acetate incident. None of the functional machinery remains inside."; + dir = 4; + name = "decommissioned sleeper" + }, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) +"gUc" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/item/lightreplacer{ + pixel_y = 7 + }, +/obj/structure/sign/poster/contraband/missing_gloves/directional/north, +/obj/structure/table/reinforced, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/turf/open/floor/iron/dark, +/area/station/engineering/storage) "gUh" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/red/dim/directional/south, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) +"gUr" = ( +/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/lobby) "gUv" = ( /obj/machinery/holopad, /turf/open/floor/carpet, @@ -24022,6 +25568,25 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/wood, /area/station/service/library) +"gUE" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/obj/structure/rack, +/obj/structure/cable, +/obj/item/radio/intercom/directional/west, +/obj/item/multitool{ + pixel_x = 8 + }, +/obj/item/flatpack{ + board = /obj/item/circuitboard/machine/flatpacker; + pixel_x = -5 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage) +"gUI" = ( +/turf/closed/wall/r_wall, +/area/station/maintenance/aft/upper) "gUQ" = ( /obj/machinery/door/airlock/public/glass{ name = "Nanotrasen Museum" @@ -24031,10 +25596,30 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/command/corporate_showroom) -"gVi" = ( -/obj/structure/window/spawner/directional/west, +"gUV" = ( +/obj/machinery/door/airlock{ + name = "Commentator Stand Access" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 + }, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/maintenance/starboard/aft/upper) +"gVf" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) +"gVj" = ( +/obj/item/clothing/head/cone{ + pixel_x = 8; + pixel_y = -6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "gVn" = ( /obj/machinery/light/directional/south, /turf/open/floor/engine, @@ -24044,12 +25629,13 @@ dir = 4 }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "gVv" = ( -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "gVB" = ( @@ -24061,6 +25647,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) +"gVQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/commons/dorms/laundry) "gVZ" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -24076,32 +25666,12 @@ network = list("minisat") }, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"gWm" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/duct, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/foyer) "gWo" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/security/lockers) -"gWp" = ( -/obj/structure/table, -/obj/item/toy/cards/deck/wizoff{ - pixel_x = 6; - pixel_y = 5 - }, -/obj/item/pen{ - pixel_x = -5; - pixel_y = -1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) "gWu" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -24112,27 +25682,25 @@ }, /turf/open/openspace, /area/station/commons/fitness/recreation) -"gWA" = ( -/obj/item/storage/box/shipping{ - pixel_x = -11; - pixel_y = 6 +"gWI" = ( +/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 = 8 }, -/obj/item/storage/toolbox/electrical{ - pixel_y = -2 +/obj/effect/turf_decal/tile/yellow{ + dir = 1 }, -/obj/item/radio/intercom/directional/north, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron, -/area/station/commons/storage/primary) +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "gWM" = ( /obj/machinery/camera/autoname/directional/south, +/obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/hallway/primary/central) "gWO" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) "gWR" = ( @@ -24171,7 +25739,7 @@ dir = 6 }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "gXj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/easel, @@ -24187,11 +25755,11 @@ "gXG" = ( /turf/closed/wall, /area/station/science/robotics) -"gXQ" = ( -/obj/structure/cable/multilayer/multiz, -/obj/structure/lattice/catwalk, -/turf/open/floor/plating, -/area/station/engineering/atmos/upper) +"gXH" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/station/maintenance/aft) "gXR" = ( /obj/machinery/atmospherics/components/binary/tank_compressor{ dir = 8 @@ -24199,12 +25767,18 @@ /turf/open/floor/iron/dark/textured_half, /area/station/science/ordnance) "gXT" = ( -/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/warning{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 4 }, -/turf/open/floor/iron/dark, /area/station/medical/cryo) "gYu" = ( /obj/item/lazarus_injector, @@ -24214,7 +25788,7 @@ /obj/item/grenade/chem_grenade/holy, /obj/structure/safe, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "gYz" = ( /obj/structure/table/reinforced, /obj/item/flashlight/lamp{ @@ -24227,7 +25801,7 @@ }, /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "gYG" = ( /obj/machinery/atmospherics/pipe/multiz/dark/visible{ dir = 8 @@ -24244,22 +25818,28 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "gYP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/holopad, -/obj/structure/cable, -/turf/open/floor/iron/textured, -/area/station/cargo/storage) -"gYS" = ( -/obj/structure/table/reinforced, -/obj/item/cigbutt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"gYY" = ( -/obj/effect/spawner/random/structure/girder, -/obj/effect/spawner/random/structure/grille, +/obj/machinery/conveyor{ + dir = 8; + id = "cargounload" + }, +/obj/structure/closet/crate, +/obj/item/toy/figure/cargotech, +/obj/item/toy/figure/cargotech, +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/cargo/storage) +"gYU" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/dinner, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/aft/upper) "gYZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -24279,12 +25859,18 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"gZj" = ( -/obj/structure/chair/sofa/corp/corner{ +"gZi" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 }, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"gZj" = ( +/obj/structure/table/reinforced/rglass, +/obj/effect/spawner/surgery_tray/full, +/turf/open/floor/iron/dark/textured, +/area/station/medical/surgery) "gZn" = ( /obj/machinery/door/airlock/silver{ id_tag = "restroom_cap"; @@ -24294,34 +25880,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain/private) -"gZq" = ( -/obj/structure/table/wood, -/obj/item/folder/white{ - pixel_y = 1; - pixel_x = 5 - }, -/obj/item/folder/blue{ - pixel_x = 2; - pixel_y = 1 - }, -/obj/item/paper_bin{ - pixel_x = -4; - pixel_y = 3 - }, -/obj/item/stamp/head/cmo{ - pixel_x = 8; - pixel_y = 10 - }, -/obj/item/flashlight/pen{ - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) -"gZu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/gravity_generator) "gZy" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/airalarm/directional/south, @@ -24341,36 +25899,11 @@ }, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"gZD" = ( -/obj/structure/bookcase/random, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) "gZO" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/engine/n2o, /area/station/engineering/atmos/upper) "gZT" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/medicine{ - pixel_x = -7; - pixel_y = 7 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/obj/machinery/firealarm/directional/west, -/obj/item/clothing/neck/stethoscope{ - pixel_x = 5; - pixel_y = 6 - }, -/obj/item/reagent_containers/dropper{ - pixel_y = 7 - }, -/obj/item/storage/pill_bottle/mannitol{ - pixel_x = -5; - pixel_y = 3 - }, /turf/open/floor/iron/dark, /area/station/medical/cryo) "gZW" = ( @@ -24464,32 +25997,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"hbO" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/structure/table, -/obj/item/tank/jetpack/oxygen{ - pixel_y = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) -"hbS" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"hcf" = ( -/obj/machinery/atmospherics/components/binary/crystallizer{ - dir = 4 +"hch" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/warning/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "hci" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -24500,17 +26017,15 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/central) "hcj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light/warm/dim/directional/west, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/qm) +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "hcx" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "hcC" = ( /obj/machinery/door/airlock/public/glass{ name = "Community Center" @@ -24528,27 +26043,42 @@ "hcH" = ( /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/end/flip{ dir = 4 }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) -"hcL" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 - }, -/turf/open/floor/eighties, -/area/station/maintenance/starboard/fore) "hcZ" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) +"hda" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/door/airlock/engineering{ + name = "Telecomms Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "hdi" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -24594,6 +26124,10 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) +"hdK" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/station/maintenance/starboard) "hdN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -24602,6 +26136,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"hdV" = ( +/turf/closed/wall/r_wall, +/area/station/maintenance/starboard/upper) "hdX" = ( /obj/machinery/light/dim/directional/north, /obj/structure/closet/secure_closet/personal, @@ -24634,18 +26171,12 @@ dir = 1 }, /area/station/service/chapel) -"heo" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) -"heq" = ( -/obj/structure/chair/plastic{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, +"hew" = ( +/obj/structure/closet/crate/coffin, +/obj/effect/spawner/random/maintenance, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/maintenance/starboard) "heC" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -24657,27 +26188,23 @@ "hfr" = ( /obj/structure/railing/corner, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) -"hfx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"hfz" = ( -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/wood, -/area/station/commons/dorms) +/area/station/ai/satellite/chamber) "hfF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/medical/minor_healing, /turf/open/floor/iron, /area/station/maintenance/department/medical) +"hfL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, +/obj/machinery/meter/monitored/distro_loop, +/obj/effect/turf_decal/box/red, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) "hfM" = ( -/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) "hfX" = ( @@ -24686,13 +26213,26 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/turf/open/floor/wood, +/turf/open/floor/plating, /area/station/maintenance/starboard/central) "hfZ" = ( /obj/effect/spawner/random/maintenance, /obj/structure/light_construct/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"hgb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/mecha_wreckage/ripley, +/obj/structure/sign/calendar/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/station/commons/dorms) +"hgi" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "hgm" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -24702,7 +26242,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "hgs" = ( /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/machinery/door/airlock/maintenance{ @@ -24732,18 +26272,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"hgC" = ( -/obj/effect/turf_decal/siding{ - dir = 4 - }, -/obj/structure/hoop{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) "hgG" = ( /obj/structure/table/wood, /obj/item/book/bible{ @@ -24758,10 +26286,26 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"hgJ" = ( +/obj/structure/lattice/catwalk, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "hgL" = ( /obj/machinery/vending/snack/orange, /turf/open/floor/wood, /area/station/service/library) +"hgN" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/arrow_ccw{ + 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/primary/aft) "hgW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -24782,10 +26326,10 @@ pixel_x = 1 }, /obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, /turf/open/floor/iron/dark/smooth_large, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "hhp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/circuit/telecomms, @@ -24796,17 +26340,13 @@ /turf/open/floor/wood, /area/station/command/heads_quarters/rd) "hhw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/west{ - pixel_y = 6 - }, -/obj/machinery/button/door/directional/west{ - pixel_y = -8; - id = "qm_warehouse"; - name = "Warehouse Shutters" +/obj/effect/turf_decal/siding/wood{ + dir = 4 }, -/turf/open/floor/iron/dark/textured, -/area/station/cargo/warehouse) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "hhz" = ( /obj/structure/railing/corner{ dir = 1 @@ -24814,17 +26354,41 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/dark, /turf/open/floor/catwalk_floor/iron_white, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"hhG" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) "hhH" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/secure/freezer/pizza, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, /obj/machinery/light/cold/dim/directional/east, /obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/structure/showcase/machinery/oldpod{ + desc = "An old NT branded sleeper, decommissioned after the lead acetate incident. None of the functional machinery remains inside."; + dir = 8; + name = "decommissioned sleeper" + }, +/obj/item/surgicaldrill, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) +"hhJ" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/obj/structure/sign/warning/radiation/rad_area/directional/south, +/obj/machinery/light/small/directional/west, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "hhL" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -24843,10 +26407,10 @@ /turf/open/floor/carpet, /area/station/maintenance/starboard/aft) "hhP" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/explab) "hhT" = ( @@ -24863,20 +26427,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) -"hig" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) -"hik" = ( -/obj/machinery/door/airlock{ - id_tag = "Cabin3"; - name = "Cabin 6" - }, -/turf/open/floor/wood, -/area/station/commons/dorms) "hip" = ( /obj/effect/decal/cleanable/glitter{ color = "ff8080" @@ -24887,6 +26437,18 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) +"his" = ( +/obj/structure/table, +/obj/item/shard{ + pixel_x = 9 + }, +/obj/item/clothing/glasses/regular{ + pixel_x = -10; + pixel_y = 6 + }, +/obj/structure/sign/poster/official/corporate_perks_vacation/directional/south, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/department/crew_quarters/dorms) "hiu" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/engine/hull/air, @@ -24903,6 +26465,19 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron/dark, /area/station/security/medical) +"hiA" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom" + }, +/obj/machinery/door/firedoor, +/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, +/area/station/security/courtroom) "hiK" = ( /obj/structure/railing/corner{ dir = 4 @@ -24910,34 +26485,37 @@ /obj/effect/turf_decal/siding/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, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"hiS" = ( -/obj/structure/table, -/obj/item/multitool{ - pixel_x = -5 +/obj/structure/cable, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 8 }, -/obj/item/multitool{ - pixel_x = 5 +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 }, -/obj/item/t_scanner{ - pixel_y = 8 +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"hja" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "hjG" = ( /obj/structure/table/wood, /turf/open/floor/wood, /area/station/hallway/secondary/construction) +"hjH" = ( +/obj/machinery/door/airlock/command{ + name = "Chief Engineer's Office" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/engineering/ce, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "hjL" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/tile/dark_green{ @@ -24957,6 +26535,11 @@ }, /turf/open/floor/iron/checker, /area/station/service/bar) +"hkr" = ( +/obj/structure/cable, +/obj/effect/spawner/random/trash/ghetto_containers, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "hkv" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -24987,6 +26570,16 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"hkO" = ( +/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/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "hkZ" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -24997,7 +26590,7 @@ /area/station/maintenance/hallway/abandoned_recreation) "hld" = ( /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "hlg" = ( /obj/structure/table, /obj/item/stock_parts/matter_bin{ @@ -25009,23 +26602,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) -"hlh" = ( -/obj/structure/lattice/catwalk, -/obj/structure/filingcabinet, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/effect/decal/cleanable/cobweb, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) -"hlm" = ( -/mob/living/basic/axolotl{ - name = "The Lost Axolotl" - }, -/obj/structure/sink/directional/west, -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/structure/mirror/broken/directional/east, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) "hls" = ( /obj/structure/railing{ dir = 10 @@ -25044,13 +26620,22 @@ "hlt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/start/coroner, -/obj/machinery/light/directional/east, +/obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) +"hlD" = ( +/obj/machinery/door/airlock{ + name = "Emergency Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "hlE" = ( /obj/machinery/airalarm/directional/north, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "hlF" = ( /obj/effect/decal/cleanable/crayon{ icon_state = "revolution"; @@ -25064,22 +26649,18 @@ }, /turf/open/floor/wood, /area/station/maintenance/starboard/central) -"hlG" = ( -/obj/structure/rack, -/obj/item/clothing/under/color/jumpskirt/grey, -/obj/item/clothing/under/color/grey, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"hlJ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 +"hmb" = ( +/obj/structure/table/wood, +/obj/item/toy/cards/deck{ + pixel_y = 4 }, -/obj/machinery/airalarm/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/cable, -/turf/open/floor/wood/tile, -/area/station/security/detectives_office/private_investigators_office) +/obj/item/trash/can{ + pixel_x = -10; + pixel_y = -14 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/cargo/storage) "hmc" = ( /obj/structure/lattice/catwalk, /obj/item/toy/figure/assistant, @@ -25098,11 +26679,18 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"hmw" = ( +"hmp" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/maintenance/starboard) +"hmw" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) "hmz" = ( @@ -25111,25 +26699,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"hmG" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/structure/sign/poster/contraband/soviet_propaganda/directional/north, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) -"hmM" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"hmT" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/toilet{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/station/commons/dorms) "hmX" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -25140,42 +26709,11 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/smooth, /area/station/engineering/main) -"hmY" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 6 - }, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) "hmZ" = ( /obj/effect/spawner/random/vending/snackvend, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) -"hnb" = ( -/obj/effect/turf_decal/siding/white, -/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 = 2 - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=22-Mech-Bay"; - location = "21-Central" - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) -"hng" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - Air Supply"; - name = "atmospherics camera" - }, -/turf/open/floor/engine/air, -/area/station/engineering/atmos/upper) -"hnh" = ( -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) "hni" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25226,14 +26764,23 @@ /obj/structure/railing{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) +"hnI" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/starboard/fore) "hnK" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -25242,15 +26789,13 @@ }, /turf/open/openspace, /area/station/commons/fitness/recreation) -"hnU" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/structure/table, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 5 +"hnO" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot_red, /turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) +/area/station/engineering/atmos/upper) "hnV" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -25265,6 +26810,10 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/science/lobby) +"hoe" = ( +/obj/structure/ladder, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "hof" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -25280,10 +26829,13 @@ }, /turf/open/floor/wood/large, /area/station/service/library) +"hop" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/station/commons/dorms) "hoq" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) "hoJ" = ( @@ -25293,21 +26845,10 @@ /turf/open/floor/catwalk_floor/iron_dark, /area/station/cargo/bitrunning/den) "hoP" = ( -/obj/structure/table/reinforced, -/obj/item/surgery_tray/full/morgue{ - pixel_x = 7 - }, /obj/machinery/firealarm/directional/south, -/obj/machinery/newscaster/directional/west, +/obj/machinery/smartfridge/organ, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) -"hpe" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/turf/open/floor/iron, -/area/station/engineering/lobby) "hpk" = ( /obj/structure/lattice, /obj/machinery/camera/autoname/directional/south, @@ -25317,10 +26858,16 @@ /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"hpo" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/commons/dorms) +"hpr" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/maintenance/starboard) +"hpw" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "hpz" = ( /obj/structure/table/wood/poker, /obj/effect/spawner/random/entertainment/money_medium, @@ -25329,14 +26876,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"hpB" = ( -/obj/structure/table, -/obj/item/screwdriver{ - pixel_y = 16 - }, -/obj/item/wirecutters, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "hpH" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -25359,30 +26898,36 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) "hqf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/caution{ + pixel_y = -14 + }, +/obj/effect/turf_decal/arrows{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, /area/station/command/gateway) -"hqg" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "hqh" = ( /obj/machinery/suit_storage_unit/standard_unit, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/siding/dark{ + dir = 10 }, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) -"hqi" = ( +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) +"hqj" = ( +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"hql" = ( -/obj/effect/turf_decal/stripes/line, -/turf/closed/wall/r_wall, -/area/station/engineering/break_room) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/office) "hqr" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -25417,25 +26962,15 @@ }, /turf/open/floor/iron/dark, /area/station/security/medical) -"hqZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/table/wood, -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/obj/item/paper/crumpled{ - pixel_x = 7 - }, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 +"hqV" = ( +/obj/structure/railing/corner{ + dir = 8 }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "hri" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/vending/snackvend, @@ -25444,30 +26979,60 @@ "hrk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "hrm" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/turf_decal/trimline/blue/warning, +/obj/effect/turf_decal/trimline/blue/line{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 5 +/turf/open/floor/iron/dark/smooth_half{ + dir = 4 }, -/turf/open/floor/iron/dark, /area/station/medical/cryo) +"hrC" = ( +/obj/item/ammo_casing/spent{ + pixel_x = 7; + pixel_y = 9 + }, +/obj/item/ammo_casing/spent{ + pixel_x = 2; + pixel_y = -9 + }, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) "hrD" = ( /turf/open/openspace, /area/station/command/heads_quarters/hop) -"hsd" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 +"hrE" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"hrN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 8 }, -/obj/machinery/light/directional/west, /turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/area/station/engineering/atmos/upper) +"hrX" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"hsg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/dorms) "hsh" = ( /obj/effect/mapping_helpers/airlock/access/any/service/library, /obj/machinery/door/airlock/wood{ @@ -25483,6 +27048,14 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/solars/starboard/aft) +"hsj" = ( +/obj/structure/cable, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "hsx" = ( /obj/effect/landmark/start/roboticist, /turf/open/floor/iron/white/textured_large, @@ -25553,32 +27126,27 @@ }, /turf/closed/wall, /area/station/hallway/primary/central) -"htb" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/stack{ - dir = 4 +"hsU" = ( +/obj/structure/chair/sofa/corner/brown{ + dir = 1 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) -"htc" = ( -/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/commons/dorms) +"htj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/light/floor{ + color = "#66ccff" + }, +/obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/area/station/medical/cryo) "htm" = ( +/obj/machinery/light/directional/east, /obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 + dir = 4 }, /turf/open/floor/iron, -/area/station/cargo/miningoffice) +/area/station/cargo/storage) "htn" = ( /obj/effect/turf_decal/box/white{ color = "#F7F707" @@ -25589,7 +27157,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "htD" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -25597,9 +27165,7 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) "htF" = ( -/obj/machinery/computer/pod/old/mass_driver_controller/trash{ - pixel_x = -24 - }, +/obj/structure/chair/stool/directional/south, /turf/open/floor/plating, /area/station/maintenance/disposal) "htH" = ( @@ -25607,17 +27173,42 @@ /obj/structure/cable, /turf/open/openspace, /area/station/hallway/primary/central) +"htN" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/machinery/computer/station_alert{ + dir = 8 + }, +/obj/effect/turf_decal/bot/right, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "htV" = ( /obj/structure/transit_tube, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"hua" = ( +/obj/machinery/door/airlock{ + id_tag = "Cabin3"; + name = "Cabin 6" + }, +/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/textured_large, +/area/station/commons/dorms) "hub" = ( /obj/effect/turf_decal/siding/blue{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "hue" = ( /obj/machinery/ai_slipper{ uses = 10 @@ -25627,7 +27218,7 @@ /obj/structure/cable, /obj/structure/cable/layer3, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hui" = ( /obj/structure/railing{ dir = 8 @@ -25663,6 +27254,21 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"huv" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/toilet/restrooms) "huz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -25670,11 +27276,6 @@ }, /turf/open/floor/plating, /area/station/construction/storage_wing) -"huR" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "hvc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -25690,6 +27291,19 @@ /obj/item/binoculars, /turf/open/space/openspace, /area/space/nearstation) +"hvy" = ( +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/door/airlock/command{ + name = "Abandoned Lab" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) "hvG" = ( /obj/structure/railing{ dir = 1 @@ -25701,6 +27315,21 @@ /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"hvL" = ( +/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/mining{ + name = "Mining Office" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "hvS" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -25717,10 +27346,42 @@ }, /turf/open/floor/wood/large, /area/station/service/library) +"hwe" = ( +/obj/machinery/recharge_station, +/obj/machinery/light/small/directional/east, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/toilet/restrooms) "hwn" = ( /obj/effect/spawner/random/trash/crushed_can, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"hwu" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/mid_joiner{ + dir = 4 + }, +/obj/structure/sign/warning/directional/west, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) +"hwL" = ( +/obj/structure/table, +/obj/item/t_scanner{ + pixel_y = 8 + }, +/obj/item/multitool{ + pixel_x = 5 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/item/multitool{ + pixel_x = -5 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "hwP" = ( /obj/structure/chair/sofa/middle/brown, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -25730,14 +27391,21 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron, /area/station/science/breakroom) +"hwQ" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/station/maintenance/aft) "hwR" = ( /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 6 }, -/obj/effect/turf_decal/arrows{ - dir = 1 +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 }, -/turf/open/floor/iron/dark, /area/station/command/gateway) "hwT" = ( /obj/structure/chair/sofa/left/brown{ @@ -25746,14 +27414,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/carpet/black, /area/station/medical/psychology) -"hwU" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "hwV" = ( /obj/structure/closet/firecloset, /obj/machinery/camera/autoname/directional/north, @@ -25765,12 +27425,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"hxa" = ( -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/space/openspace, -/area/space/nearstation) "hxc" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -25782,13 +27436,19 @@ /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) "hxd" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/tile/red/opposingcorners{ +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/iron/dark, +/obj/item/paper/fluff/junkmail_redpill, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/wood/large, /area/station/hallway/primary/central) +"hxf" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos) "hxg" = ( /obj/machinery/door/airlock/external{ name = "Transport Airlock" @@ -25808,13 +27468,16 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, /obj/structure/cable, -/obj/machinery/camera/autoname/directional/north, +/obj/effect/spawner/random/structure/crate, +/obj/effect/turf_decal/bot, +/obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) +"hxA" = ( +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/iron, +/area/station/commons/dorms) "hxC" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -25823,34 +27486,38 @@ }, /turf/open/floor/carpet/stellar, /area/station/maintenance/hallway/abandoned_recreation) -"hxJ" = ( -/obj/machinery/light/directional/east, -/obj/machinery/camera/autoname/directional/east, +"hxM" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 5 + }, /turf/open/openspace, -/area/station/commons/toilet/restrooms) +/area/station/maintenance/starboard/upper) "hxT" = ( /obj/machinery/door/airlock/grunge{ name = "Under The Stairs" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical) +"hxU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/crate, +/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/maintenance/starboard) "hxV" = ( /obj/effect/turf_decal/tile/red/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/range) "hxW" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "cargoload" - }, -/obj/structure/closet/crate, -/obj/effect/spawner/random/maintenance, -/obj/effect/turf_decal/trimline/brown/filled/line, -/turf/open/floor/iron, -/area/station/cargo/storage) +/obj/effect/turf_decal/box/corners, +/turf/open/floor/engine/hull, +/area/space/nearstation) "hyc" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron/chapel, @@ -25865,11 +27532,6 @@ /obj/structure/cable, /turf/open/floor/grass, /area/station/science/zoo) -"hye" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "hyf" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -25895,6 +27557,12 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) +"hyw" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/rack, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/starboard/central/upper) "hyx" = ( /obj/effect/decal/cleanable/dirt, /obj/item/restraints/legcuffs/beartrap/prearmed, @@ -25915,13 +27583,17 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/large, /area/station/service/library) +"hzk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "hzo" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/flora/grass/jungle/b/style_3, /obj/structure/flora/bush/flowers_br/style_2, /turf/open/floor/grass, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hzq" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -25930,6 +27602,7 @@ }, /obj/item/clothing/shoes/wheelys/rollerskates, /obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) "hzv" = ( @@ -25945,8 +27618,12 @@ "hzG" = ( /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/smooth_large, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "hzQ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -25962,36 +27639,17 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "hzY" = ( -/obj/effect/turf_decal/siding/red{ - dir = 10 - }, -/obj/machinery/door/window/brigdoor/left/directional/south{ - name = "Trial Cell"; - req_one_access = list("brig", "command") +/obj/effect/landmark/firealarm_sanity, +/turf/open/openspace, +/area/station/command/heads_quarters/hop) +"hAb" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 }, +/obj/machinery/status_display/ai/directional/north, +/obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"hAd" = ( -/obj/effect/turf_decal/siding{ - dir = 8 - }, -/obj/structure/hoop{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) -"hAh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/obj/item/wrench, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/engineering/storage/tech) "hAi" = ( /obj/machinery/door/airlock/public/glass{ name = "Circle Center" @@ -26043,55 +27701,94 @@ /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) "hAt" = ( -/obj/machinery/computer/security/telescreen/minisat/directional/west{ - name = "Minisat Monitor" +/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/dark_blue{ + dir = 4 }, -/turf/open/floor/carpet, -/area/station/command/bridge) +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "hAx" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/vending/sustenance, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/security/prison) +"hAy" = ( +/obj/machinery/duct, +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light_switch/directional/east, +/obj/structure/cable, +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"hAz" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "hAC" = ( -/turf/open/floor/wood, -/area/station/command/meeting_room/council) +/obj/machinery/computer/accounting{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "hAH" = ( /obj/machinery/door/airlock/public/glass{ name = "Science Store" }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/purple/fourcorners, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron/dark, /area/station/science/lobby) "hAM" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/medbay/central) -"hBh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/structure/sign/poster/random/directional/north, -/obj/item/paper_bin/carbon{ - pixel_x = 16; - pixel_y = 6 +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/item/pen{ - pixel_x = -8 +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/chem_storage) +"hBh" = ( +/obj/structure/sign/clock/directional/east, +/obj/effect/turf_decal/stripes{ + dir = 5 }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/central) -"hBw" = ( -/obj/structure/railing{ +/turf/open/floor/iron/textured, +/area/station/cargo/storage) +"hBj" = ( +/obj/machinery/holopad, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"hBs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/turf/open/floor/plating, +/area/station/maintenance/starboard) "hBy" = ( /obj/structure/flora/bush/pale/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -26125,11 +27822,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/explab) -"hBS" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "hBY" = ( /obj/machinery/elevator_control_panel/directional/east{ linked_elevator_id = "catwalk_cafe"; @@ -26138,12 +27830,6 @@ pixel_y = 26; preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") }, -/obj/structure/sign/directions/upload/directional/north{ - desc = "It stands for Up Le Dable"; - dir = 2; - name = "Button Indicator"; - pixel_y = 40 - }, /obj/structure/railing{ dir = 4 }, @@ -26154,16 +27840,6 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"hCe" = ( -/obj/structure/table/wood/poker, -/obj/item/toy/cards/deck{ - pixel_y = 4 - }, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"hCg" = ( -/turf/open/floor/engine, -/area/station/engineering/break_room) "hCj" = ( /obj/effect/spawner/random/entertainment/arcade, /obj/structure/sign/poster/party_game/directional/north, @@ -26186,31 +27862,23 @@ /turf/open/floor/iron, /area/station/hallway/primary/aft) "hCy" = ( -/obj/effect/turf_decal/siding/red{ - dir = 4 - }, -/obj/structure/table, -/obj/item/gavelblock, -/obj/item/gavelhammer{ - pixel_x = -5; - pixel_y = -1 - }, /obj/structure/railing{ dir = 4 }, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 +/obj/structure/chair/plastic, +/obj/effect/turf_decal/siding/wood{ + dir = 4 }, -/turf/open/floor/iron/dark, +/turf/open/floor/wood/large, /area/station/hallway/primary/central) -"hCB" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +"hCL" = ( +/obj/effect/spawner/random/engineering/atmospherics_portable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "hCP" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/disposal) "hCQ" = ( @@ -26218,7 +27886,7 @@ dir = 1 }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "hCY" = ( /obj/machinery/camera/directional/east{ c_tag = "Interrogation room"; @@ -26233,6 +27901,10 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, +/obj/machinery/light/small/directional/east, +/obj/structure/closet{ + name = "janitorial supplies" + }, /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, @@ -26245,7 +27917,7 @@ /area/station/science/lab) "hDg" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "hDk" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -26266,6 +27938,13 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/engine, /area/station/service/hydroponics) +"hDF" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "hDG" = ( /obj/structure/railing/corner/end{ dir = 4 @@ -26277,13 +27956,7 @@ dir = 1 }, /turf/open/floor/catwalk_floor/iron_white, -/area/station/ai_monitored/turret_protected/aisat_interior) -"hDS" = ( -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 5 - }, -/turf/open/floor/engine/hull/reinforced, -/area/space/nearstation) +/area/station/ai/satellite/interior) "hDT" = ( /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron, @@ -26314,7 +27987,7 @@ }, /obj/effect/mapping_helpers/mail_sorting/service/hop_office, /obj/structure/cable, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "hEf" = ( /obj/structure/cable, @@ -26327,37 +28000,18 @@ /obj/effect/spawner/random/structure/chair_maintenance, /turf/open/floor/iron/dark/smooth_large, /area/station/maintenance/port) +"hEu" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/starboard/fore/upper) "hEE" = ( -/obj/effect/turf_decal/siding/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/event_spawn, -/obj/structure/railing/corner/end/flip{ - dir = 8 - }, -/obj/structure/railing/corner/end{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"hEN" = ( -/obj/structure/chair/sofa/right/brown, -/obj/effect/spawner/random/maintenance, -/obj/structure/sign/poster/contraband/pwr_game/directional/north, -/turf/open/floor/eighties, -/area/station/maintenance/starboard/fore) -"hET" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ +/obj/effect/turf_decal/stripes{ dir = 2 }, -/turf/open/floor/iron/textured_large, -/area/station/medical/virology) +/turf/open/floor/iron/textured, +/area/station/command/eva) "hEU" = ( /obj/effect/turf_decal/trimline/dark_blue/end{ dir = 4 @@ -26374,14 +28028,14 @@ }, /obj/effect/turf_decal/trimline/dark_blue/mid_joiner, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "hEW" = ( /obj/structure/cable/layer3, /obj/effect/turf_decal/siding/dark{ dir = 1 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "hFc" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -26404,17 +28058,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"hFq" = ( -/obj/structure/rack, -/obj/item/clothing/suit/utility/radiation, -/obj/item/clothing/head/utility/radiation, -/obj/item/geiger_counter, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +"hFp" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/obj/machinery/camera/directional/north{ + c_tag = "Engineering - Shared Storage" + }, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron, +/area/station/engineering/lobby) "hFy" = ( /obj/structure/ladder, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26422,10 +28075,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/science/central) -"hFA" = ( -/obj/structure/lattice/catwalk, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "hFG" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -26454,10 +28103,16 @@ /obj/machinery/door/airlock/maintenance, /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/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"hFW" = ( +/obj/machinery/newscaster/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/bin, +/turf/open/floor/plating, +/area/station/commons/dorms) "hFZ" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency{ @@ -26474,6 +28129,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"hGh" = ( +/obj/effect/decal/cleanable/glitter, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "hGl" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -26493,29 +28152,17 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) -"hGu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/full, -/obj/effect/turf_decal/tile/dark/full, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/department/medical) -"hGD" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 +"hGy" = ( +/obj/item/trash/can{ + pixel_x = -8 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/turf/open/floor/wood/large, +/area/station/commons/dorms) "hGH" = ( +/obj/machinery/flasher/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "hGJ" = ( /obj/structure/lattice/catwalk, /obj/item/trash/can{ @@ -26550,10 +28197,23 @@ /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) "hHd" = ( -/obj/structure/window/reinforced/spawner/directional/west, /obj/effect/landmark/navigate_destination/teleporter, /turf/open/floor/iron/stairs/medium, /area/station/hallway/primary/central) +"hHi" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"hHj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/lobby) "hHr" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 10 @@ -26561,28 +28221,18 @@ /turf/open/floor/iron, /area/station/cargo/storage) "hHs" = ( -/obj/structure/table/reinforced, -/obj/item/poster/random_contraband, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/port) +/obj/machinery/airalarm/directional/west, +/obj/machinery/computer/operating{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/morgue) "hHA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, /area/station/cargo/storage) -"hHE" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer2{ - dir = 1 - }, -/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) "hHF" = ( /obj/machinery/disposal/bin/tagger, /obj/machinery/airalarm/directional/south, @@ -26609,16 +28259,6 @@ }, /turf/open/floor/wood, /area/station/command/corporate_showroom) -"hHP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/fluff/paper/stack{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "hIc" = ( /obj/structure/lattice/catwalk, /obj/structure/ladder, @@ -26630,37 +28270,26 @@ name = "Head of Personnel's Fax Machine" }, /obj/structure/table/wood, -/turf/open/floor/wood, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) -"hIn" = ( -/obj/structure/cable, -/obj/item/stack/sticky_tape{ - pixel_x = 12; - pixel_y = 14 - }, -/obj/structure/sign/poster/contraband/fake_bombable/directional/south, -/obj/effect/decal/cleanable/crayon{ - icon_state = "!"; - pixel_x = 2; - pixel_y = 29 - }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "!"; - pixel_x = -5; - pixel_y = 27 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "hIt" = ( /obj/machinery/door/airlock/grunge, /obj/effect/mapping_helpers/airlock/access/any/command/general, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hIA" = ( /turf/closed/wall, /area/station/cargo/miningoffice) +"hIE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/textured_large, +/area/station/medical/virology) "hII" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/closet/emcloset{ @@ -26669,7 +28298,7 @@ /obj/machinery/airalarm/directional/east, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hIQ" = ( /obj/effect/turf_decal/siding/red{ dir = 4 @@ -26683,27 +28312,49 @@ /turf/open/floor/wood, /area/station/security/courtroom) "hIS" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/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/cargo/storage) -"hIZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/freezer/kitchen/maintenance, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/turf/closed/wall, +/area/station/cargo/sorting) "hJa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) +"hJc" = ( +/obj/structure/cable, +/obj/effect/spawner/random/trash/grille_or_waste, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "hJm" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) +"hJp" = ( +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/item/folder/yellow{ + pixel_x = 2; + pixel_y = -12 + }, +/obj/structure/table, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) +"hJx" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) "hJz" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -26715,11 +28366,13 @@ /turf/open/floor/iron/kitchen, /area/station/hallway/secondary/service) "hJA" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L8" +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/holopad, +/turf/open/floor/iron/edge{ + dir = 1 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "hJB" = ( /obj/structure/lattice/catwalk, @@ -26733,12 +28386,6 @@ /obj/structure/window/reinforced/plasma/spawner/directional/south, /turf/open/space/basic, /area/space/nearstation) -"hJL" = ( -/obj/structure/mirror/directional/north, -/obj/structure/sink/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/station/commons/dorms) "hJS" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line, @@ -26765,10 +28412,13 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) -"hKh" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"hKe" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage) "hKm" = ( /obj/machinery/light/small/directional/north, /obj/effect/landmark/firealarm_sanity, @@ -26780,20 +28430,62 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) +"hKr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) +"hKs" = ( +/obj/effect/landmark/start/station_engineer, +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/station/engineering/lobby) +"hKt" = ( +/obj/machinery/requests_console/directional/west{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/structure/table, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/structure/reagent_dispensers/wall/peppertank/directional/south, +/obj/item/wrench, +/obj/item/radio/off{ + pixel_x = -5; + pixel_y = 2 + }, +/obj/item/screwdriver{ + pixel_y = 2 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) "hKw" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "hKy" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -5; + pixel_y = 4 }, -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ - dir = 4 +/obj/item/stamp/head/hop{ + pixel_x = 8; + pixel_y = 4 }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) +/obj/item/stamp/denied{ + pixel_y = 11 + }, +/obj/structure/cable, +/turf/open/floor/wood/tile, +/area/station/command/heads_quarters/hop) "hKE" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -26810,58 +28502,38 @@ /obj/machinery/suit_storage_unit/security, /turf/open/floor/iron/dark/smooth_large, /area/station/security/eva) -"hKP" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/medical/chemistry) -"hKS" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/structure/table/reinforced, -/obj/item/stock_parts/power_store/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/pipe_dispenser{ - pixel_y = 8 - }, -/obj/item/clothing/glasses/meson/engine{ - pixel_y = 4 - }, -/obj/machinery/cell_charger, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "hLd" = ( /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/security/prison) -"hLp" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) -"hLu" = ( -/obj/effect/turf_decal/siding{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/white/line{ - dir = 1 +"hLe" = ( +/obj/item/bikehorn/rubberducky, +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"hLi" = ( +/obj/structure/girder, +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"hLl" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/orange, +/obj/item/storage/box/mousetraps{ + pixel_x = 3; + pixel_y = 3 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/iron, +/area/station/maintenance/starboard) +"hLr" = ( +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt, +/obj/item/pai_card, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "hLC" = ( -/obj/machinery/computer/prisoner/management, /obj/item/radio/intercom/directional/north, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) @@ -26913,24 +28585,26 @@ }, /turf/open/floor/plating, /area/station/service/hydroponics/garden/abandoned) -"hLS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/pdapainter/engineering, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "hLT" = ( /obj/docking_port/stationary/escape_pod{ dir = 8 }, /turf/open/floor/engine/hull, /area/space/nearstation) -"hMc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/clock/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +"hLW" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood, +/obj/item/folder/yellow{ + pixel_x = 3; + pixel_y = 6 + }, +/obj/item/stack/package_wrap{ + pixel_x = 4; + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "hMd" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, @@ -26948,6 +28622,18 @@ /obj/structure/cable, /turf/open/floor/grass, /area/station/hallway/secondary/entry) +"hMp" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 1 + }, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos) +"hMq" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/directional/south, +/turf/open/space/openspace, +/area/space/nearstation) "hMs" = ( /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, @@ -26961,6 +28647,12 @@ /obj/effect/turf_decal/trimline/dark/arrow_cw, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"hMz" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "hMC" = ( /turf/open/floor/iron, /area/station/science/robotics) @@ -26989,40 +28681,34 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) -"hMF" = ( -/obj/machinery/button/door/incinerator_vent_atmos_aux{ - pixel_y = 24 - }, -/obj/machinery/button/door/incinerator_vent_atmos_main{ - pixel_y = 40 - }, -/obj/machinery/button/ignition/incinerator/atmos{ - pixel_y = 9 - }, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/station/maintenance/disposal/incinerator) -"hMI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"hMJ" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) +"hML" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "cargounload" + }, +/obj/structure/closet/crate, +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, +/obj/structure/plasticflaps, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"hMU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +/area/station/cargo/storage) +"hMS" = ( +/obj/effect/spawner/random/techstorage/rnd_secure_all, +/obj/machinery/status_display/ai/directional/south, +/obj/machinery/light/small/directional/south, +/obj/structure/rack, +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) +/area/station/engineering/storage/tech) "hMV" = ( /obj/structure/table, /obj/item/binoculars{ @@ -27042,33 +28728,33 @@ /turf/open/floor/glass, /area/station/security/brig) "hNa" = ( -/obj/structure/reagent_dispensers/watertank, +/obj/machinery/light/directional/north, +/obj/structure/table, +/obj/item/reagent_containers/cup/bucket{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/item/rag{ + pixel_x = 2; + pixel_y = 5 + }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/siding/wood{ - dir = 8 + dir = 1 }, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, +/turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) "hNb" = ( -/obj/machinery/computer/upload/borg{ - dir = 4 +/obj/item/kirbyplants/organic/plant9{ + pixel_y = 14; + pixel_x = 4 }, -/obj/machinery/flasher/directional/west, -/turf/open/floor/carpet/purple, -/area/station/ai_monitored/turret_protected/ai_upload) +/turf/open/floor/carpet/black, +/area/station/ai/upload/chamber) "hNf" = ( /obj/structure/cable, /turf/open/floor/plating, /area/station/security/interrogation) -"hNj" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) "hNs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -27086,14 +28772,6 @@ /obj/structure/stairs/west, /turf/open/floor/plating, /area/station/security/courtroom) -"hNJ" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 4; - initialize_directions = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "hNW" = ( /obj/effect/spawner/structure/window, /obj/effect/turf_decal/stripes/line{ @@ -27109,8 +28787,19 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "hOe" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27123,19 +28812,30 @@ }, /turf/open/floor/engine/hull/air, /area/station/maintenance/port/aft) +"hOo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "hOw" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/machinery/camera/directional/south, +/obj/machinery/computer/security/mining{ + dir = 4 }, -/obj/structure/closet/emcloset, /turf/open/floor/iron, /area/station/cargo/miningoffice) "hOC" = ( -/obj/effect/turf_decal/siding/red{ - dir = 6 +/obj/structure/railing{ + dir = 4 }, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, /area/station/hallway/primary/central) "hOG" = ( /obj/structure/disposalpipe/segment{ @@ -27143,6 +28843,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"hOJ" = ( +/obj/structure/cable, +/obj/effect/landmark/start/assistant, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark/arrow_ccw, +/obj/effect/turf_decal/trimline/dark/arrow_ccw, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "hOO" = ( /obj/structure/table/wood, /turf/open/floor/glass/reinforced, @@ -27155,13 +28865,14 @@ dir = 8 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"hOZ" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 8 - }, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) +/area/station/ai/satellite/interior) +"hOV" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "hPa" = ( /obj/structure/railing{ dir = 1 @@ -27176,27 +28887,42 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) -"hPH" = ( -/obj/machinery/door/airlock/external{ - name = "Welcome." +"hPj" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/item/storage/box/lights/mixed{ + pixel_x = 8; + pixel_y = 8 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "space-outpost" +/obj/item/electronics/airlock, +/obj/item/electronics/airlock{ + pixel_x = -6; + pixel_y = -4 }, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/external, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"hPL" = ( -/obj/machinery/door/airlock{ - id_tag = "Cabin5"; - name = "Cabin 3" +/obj/item/stock_parts/power_store/cell/emproof{ + pixel_x = -4; + pixel_y = 6 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/commons/dorms) +/obj/item/stock_parts/power_store/cell/emproof{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/stock_parts/power_store/cell/emproof{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"hPq" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "hPP" = ( /obj/structure/stairs/north, /obj/structure/railing{ @@ -27204,6 +28930,14 @@ }, /turf/open/floor/iron/stairs/left, /area/station/engineering/lobby) +"hPQ" = ( +/obj/structure/lattice/catwalk, +/obj/item/kirbyplants/random, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) +"hPR" = ( +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "hPU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27221,6 +28955,10 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"hPW" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "hPY" = ( /obj/effect/turf_decal/trimline/dark/arrow_cw{ dir = 10 @@ -27232,14 +28970,13 @@ dir = 4 }, /area/station/hallway/secondary/exit/departure_lounge) -"hQa" = ( -/obj/machinery/disposal/bin, +"hPZ" = ( /obj/structure/cable, -/obj/structure/disposalpipe/trunk{ - dir = 4 +/obj/machinery/power/terminal{ + dir = 1 }, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "hQd" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -27248,6 +28985,19 @@ /obj/machinery/light/directional/south, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"hQh" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Primary Tool Storage" + }, +/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/door/firedoor, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "hQk" = ( /obj/item/reagent_containers/cup/soup_pot{ pixel_x = 6; @@ -27275,48 +29025,17 @@ }, /turf/open/floor/wood, /area/station/service/chapel) -"hQQ" = ( -/obj/structure/broken_flooring/singular/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/fore) "hQU" = ( -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, /obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"hQV" = ( -/obj/effect/turf_decal/siding/brown/corner, -/obj/structure/railing/corner, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/commons/dorms) -"hQZ" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"hRa" = ( -/obj/structure/table, -/obj/item/storage/belt/medical{ - pixel_y = 6 - }, -/obj/item/storage/belt/medical{ - pixel_y = 3 - }, -/obj/item/storage/belt/medical, -/obj/item/storage/belt/medical{ - pixel_y = -5 +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/obj/item/storage/belt/medical{ - pixel_y = -8 +/obj/item/pen{ + pixel_x = 8 }, -/obj/effect/turf_decal/tile/blue/full, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) "hRd" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -27370,9 +29089,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/armory, /turf/open/floor/plating, /area/station/security/execution/education) -"hRD" = ( -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/aft) "hRH" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -27393,8 +29109,14 @@ "hRT" = ( /obj/structure/chair, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/security/courtroom) +"hRV" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "hRW" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -27417,13 +29139,33 @@ pixel_y = 6 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/security/courtroom) +"hSa" = ( +/obj/item/clothing/head/soft/orange, +/obj/structure/closet/secure_closet/engineering_chief, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) "hSd" = ( /obj/machinery/camera/autoname/directional/south, /obj/machinery/vending/games, /turf/open/floor/wood, /area/station/service/library) +"hSe" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) +"hSg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "hSh" = ( /obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -27437,25 +29179,21 @@ "hSk" = ( /turf/closed/wall, /area/station/security/checkpoint/medical) +"hSq" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/corner{ + dir = 4 + }, +/obj/structure/fluff/paper/stack, +/turf/open/floor/plating, +/area/station/maintenance/aft) "hSu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, /obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 + dir = 4 }, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) -"hSv" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "hSy" = ( /obj/structure/table, /obj/item/clothing/glasses/welding{ @@ -27467,18 +29205,22 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) "hSz" = ( -/obj/machinery/computer/operating{ +/obj/structure/cable, +/obj/effect/landmark/start/medical_doctor, +/obj/effect/turf_decal/trimline/blue/warning{ dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/turf/open/floor/iron/white/textured_large, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/surgery) "hSA" = ( /obj/machinery/light/directional/north, /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/wood, /area/station/commons/storage/tools) +"hSJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/engineering/transit_tube) "hSW" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -27502,10 +29244,19 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"hTt" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +"hTy" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 8 + }, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "hTE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/weather/snow, @@ -27541,18 +29292,28 @@ "hTN" = ( /obj/structure/cable/layer3, /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) +"hUb" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"hUg" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/turf/open/floor/plating, +/area/station/engineering/lobby) +"hUh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/flashlight/lamp, +/obj/structure/light_construct/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/starboard/central) "hUs" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/tcommsat/server) -"hUw" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/catwalk_floor, -/area/station/engineering/lobby) "hUA" = ( /obj/effect/turf_decal/arrows{ dir = 8 @@ -27560,38 +29321,15 @@ /obj/effect/spawner/random/structure/closet_empty/crate, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"hUM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"hUU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"hVc" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/item/radio/intercom/directional/north, -/obj/effect/mapping_helpers/burnt_floor, +"hUP" = ( +/obj/structure/sign/warning/vacuum/external/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"hVd" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"hVi" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) -"hVk" = ( -/obj/structure/railing/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/area/station/commons/dorms) "hVr" = ( /obj/structure/sign/warning/cold_temp/directional/west{ desc = "A sign that notes the room within is the Cold Room. Not that it's actually cold."; @@ -27614,17 +29352,33 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/grimy, /area/station/security/interrogation) +"hVx" = ( +/obj/structure/cable, +/obj/machinery/camera/autoname/directional/south{ + c_tag = "Medbay - Upper Chief Medical Office South"; + network = list("ss13","medbay") + }, +/obj/structure/closet/secure_closet/medical3, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "hVz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) -"hVH" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 +"hVC" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 6 }, -/obj/machinery/light/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/siding/red{ + dir = 9 + }, +/turf/open/floor/iron/textured_corner, +/area/station/command/gateway) "hWb" = ( /obj/structure/chair{ dir = 1; @@ -27642,10 +29396,17 @@ /obj/structure/railing, /turf/open/floor/grass, /area/station/science/zoo) -"hWw" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/wood, -/area/station/security/courtroom) +"hWt" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/blue, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "hWA" = ( /obj/effect/turf_decal/trimline/dark_blue/warning{ dir = 1 @@ -27660,7 +29421,38 @@ /turf/open/floor/iron/white/smooth_corner{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) +"hWF" = ( +/obj/structure/lattice/catwalk, +/obj/item/clothing/under/costume/seifuku{ + pixel_y = -1 + }, +/obj/structure/table, +/obj/structure/sign/poster/official/pda_ad/directional/south, +/turf/open/openspace, +/area/station/maintenance/department/crew_quarters/dorms) +"hWJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/aft) +"hWN" = ( +/obj/structure/cable, +/obj/effect/landmark/start/hangover, +/obj/structure/sign/nanotrasen{ + pixel_y = 32; + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "hWU" = ( /obj/effect/decal/cleanable/glitter{ color = "ff8080" @@ -27674,11 +29466,9 @@ /area/station/maintenance/starboard/aft) "hXc" = ( /obj/effect/turf_decal/plaque{ - icon_state = "L3" - }, -/obj/effect/turf_decal/siding/green{ - dir = 1 + icon_state = "L4" }, +/obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "hXe" = ( @@ -27694,21 +29484,33 @@ }, /turf/open/floor/engine, /area/station/science/auxlab/firing_range) +"hXi" = ( +/obj/effect/turf_decal/trimline/brown, +/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ + dir = 4; + name = "Atmos to Engine" + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "hXm" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/opposingcorners{ +/obj/effect/landmark/start/shaft_miner, +/obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, -/obj/effect/landmark/start/depsec/supply, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/supply) +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"hXp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/effect/landmark/blobstart, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/fore) "hXr" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 +/obj/machinery/firealarm/directional/south, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" }, /turf/open/floor/iron/textured, /area/station/cargo/storage) @@ -27726,22 +29528,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/ai) -"hXA" = ( -/obj/machinery/light/directional/west, -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -1; - pixel_y = 5 - }, -/obj/item/pen{ - pixel_y = 5 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/engineering) +/area/station/ai/satellite/chamber) "hXD" = ( /obj/effect/turf_decal/siding/blue{ dir = 1 @@ -27751,63 +29538,64 @@ }, /turf/open/floor/iron/white/smooth_half, /area/station/hallway/secondary/entry) -"hXE" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/turf/open/floor/iron/freezer, -/area/station/commons/dorms) "hXT" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) -"hYa" = ( +"hXV" = ( /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/dark/smooth_large, -/area/station/engineering/main) +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"hXW" = ( +/obj/structure/table/reinforced, +/obj/item/wirecutters, +/obj/item/screwdriver, +/obj/item/stack/cable_coil, +/obj/item/crowbar, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "hYc" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable, /turf/open/floor/carpet, /area/station/service/abandoned_gambling_den) +"hYd" = ( +/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/siding/thinplating/dark{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "hYf" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/iron/dark, /area/station/security/brig) -"hYg" = ( -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) -"hYj" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 6 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) +"hYl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/gravity_generator) "hYo" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ +/obj/effect/turf_decal/bot_white, +/obj/effect/spawner/random/structure/crate, +/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/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) -"hYu" = ( -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron/dark/textured_large, +/area/station/cargo/storage) "hYx" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -27817,7 +29605,12 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) +"hYE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bookcase/random/religion, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "hYF" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -27834,7 +29627,7 @@ /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/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hYK" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 @@ -27846,10 +29639,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) -"hYV" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/engine/hull/air, -/area/station/engineering/break_room) +"hYW" = ( +/obj/structure/cable/multilayer/multiz, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "hZa" = ( /obj/effect/landmark/carpspawn, /turf/open/floor/engine/hull, @@ -27867,19 +29660,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"hZi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) "hZq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/status_display/ai/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, +/obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "hZx" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -27909,7 +29693,9 @@ /obj/effect/turf_decal/trimline/red/filled/mid_joiner{ dir = 1 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 1 + }, /area/station/hallway/primary/central) "hZE" = ( /obj/effect/decal/cleanable/dirt, @@ -27925,6 +29711,9 @@ }, /obj/effect/mapping_helpers/airlock/access/all/command/hop, /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/plating, /area/station/command/heads_quarters/hop) "hZZ" = ( @@ -27934,84 +29723,64 @@ /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/plating, /area/station/maintenance/port) -"iak" = ( -/obj/structure/railing{ - dir = 1 +"iah" = ( +/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/engineering/ce_office, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8 }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 }, -/turf/open/openspace, -/area/station/engineering/lobby) +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"iai" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "iar" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/machinery/holopad{ - pixel_y = 6 - }, /obj/machinery/airalarm/directional/south, +/obj/machinery/chem_dispenser, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) -"iaE" = ( -/obj/effect/landmark/start/assistant, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 4 - }, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) +"iaC" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "iaF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/entertainment/arcade, /turf/open/floor/iron/checker, -/area/station/maintenance/hallway/abandoned_recreation) -"iaG" = ( -/obj/effect/landmark/event_spawn, -/turf/open/openspace, -/area/station/command/gateway) -"iaR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/area/station/maintenance/hallway/abandoned_recreation) +"iaY" = ( /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/maintenance/starboard/lesser) -"ibc" = ( -/obj/effect/turf_decal/siding/brown, -/obj/structure/closet/boxinggloves, -/obj/effect/landmark/start/hangover/closet, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/obj/machinery/door/airlock/medical{ + name = "Medbay Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/floor/iron/white, +/area/station/medical/storage) "ibj" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/science/research) "ibo" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L14" - }, -/obj/effect/turf_decal/siding/white/corner, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) -"ibq" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 4; - initialize_directions = 4 - }, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) -"ibr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/glass/reinforced, +/area/station/command/bridge) "ibs" = ( /obj/structure/chair{ dir = 8 @@ -28021,25 +29790,15 @@ dir = 4 }, /area/station/service/chapel) -"ibt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair{ - dir = 1; - pixel_y = -2 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"ibw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "iby" = ( -/obj/structure/railing/corner/end, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/dark/textured_large, +/obj/structure/railing/corner/end, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/white, /area/station/medical/medbay/central) "ibz" = ( /obj/structure/statue/bronze/marx{ @@ -28056,6 +29815,26 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"ibC" = ( +/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/cyan/visible/layer5{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"ibE" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table/wood, +/obj/item/paper/crumpled{ + pixel_x = 2; + pixel_y = 7 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "ibF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28065,11 +29844,12 @@ /area/station/service/cafeteria) "ibI" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ibJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) "ibK" = ( @@ -28082,41 +29862,39 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"ibM" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "ibO" = ( /obj/structure/chair/comfy/brown{ dir = 8 }, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"ich" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/engine_access, -/obj/effect/mapping_helpers/airalarm/link{ - chamber_id = "engine" +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/obj/effect/mapping_helpers/airalarm/tlv_no_checks, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/carpet/royalblue, +/area/station/command/heads_quarters/captain/private) +"ibZ" = ( +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/trimline/dark_red/filled/warning{ dir = 4 }, -/obj/structure/cable/layer1, -/turf/open/floor/engine, -/area/station/engineering/supermatter) -"icj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/sign/poster/contraband/rebels_unite/directional/west, -/obj/item/ammo_casing/spent{ - pixel_x = 8; - pixel_y = 6 +/obj/effect/turf_decal/trimline/dark_red/filled/warning{ + dir = 8 }, -/obj/item/ammo_casing/spent{ - pixel_x = -11; - pixel_y = -5 +/turf/open/floor/iron/dark/textured_half{ + dir = 1 }, -/obj/structure/disposalpipe/segment, +/area/station/cargo/storage) +"icg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/maintenance/starboard/upper) "icw" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -28125,22 +29903,16 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) "icz" = ( -/obj/structure/lattice/catwalk, -/obj/structure/table/reinforced, -/obj/item/flashlight/flare/candle{ - pixel_x = -4; - pixel_y = 15 - }, -/obj/item/flashlight/flare/candle{ - pixel_x = 3; - pixel_y = 9 +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 }, -/obj/item/storage/box/matches{ - pixel_x = -6; - pixel_y = 6 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/openspace, -/area/station/medical/storage) +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "icB" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -28157,11 +29929,38 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"icW" = ( +/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/siding/wood/end{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/medical/break_room) "idd" = ( -/obj/effect/turf_decal/delivery, /obj/structure/broken_flooring/corner/always_floorplane/directional/west, +/obj/effect/turf_decal/delivery, +/obj/effect/spawner/random/engineering/tank, +/obj/structure/railing{ + dir = 1 + }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"idf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/storage/box/lights/mixed{ + pixel_y = 8 + }, +/obj/item/storage/toolbox/emergency, +/obj/structure/table/reinforced, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/aft) "idj" = ( /obj/effect/turf_decal/siding/purple{ dir = 4 @@ -28174,20 +29973,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/lab) -"idm" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) "idq" = ( /turf/open/floor/iron/stairs/medium{ dir = 8 }, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "idI" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -28199,29 +29989,17 @@ /turf/closed/wall/r_wall, /area/station/engineering/storage/tech) "idO" = ( -/obj/effect/turf_decal/siding/white{ - dir = 6 +/turf/open/floor/iron/edge{ + dir = 1 }, -/turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"idQ" = ( -/obj/structure/table/wood, -/obj/item/book/bible, -/turf/open/floor/carpet, -/area/station/maintenance/starboard/lesser) -"iea" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 +"idV" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/virology) -"iee" = ( -/obj/structure/table/reinforced, -/obj/item/radio/headset, -/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/maintenance/starboard) "iei" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -28230,67 +30008,49 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"iem" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/mecha_wreckage/ripley, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) -"ien" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/engineering/main) -"iep" = ( -/obj/structure/table, -/obj/item/geiger_counter{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/screwdriver{ - pixel_y = 10 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/engineering) "iev" = ( /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/dark/arrow_cw{ + dir = 8 + }, /turf/open/floor/iron, /area/station/hallway/primary/aft) "ieD" = ( -/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron/stairs/medium{ dir = 4 }, /area/station/medical/abandoned) +"ifk" = ( +/obj/structure/chair/office/light, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "ifn" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/fueltank, /obj/effect/decal/cleanable/cobweb, /obj/machinery/light/small/dim/directional/north, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) -"ifA" = ( -/obj/effect/spawner/random/trash/moisture_trap, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "ifC" = ( /obj/structure/sign/poster/contraband/blood_geometer, /turf/closed/wall, /area/station/maintenance/port) -"ifF" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/plumbing/input, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) +"ifU" = ( +/obj/machinery/camera/autoname/directional/north, +/turf/open/openspace, +/area/station/commons/dorms) "ifV" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 @@ -28330,19 +30090,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) -"igm" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/glass{ - amount = 12 - }, -/obj/item/stack/cable_coil{ - pixel_x = -1; - pixel_y = -3 - }, -/obj/item/extinguisher/mini, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "igo" = ( /obj/effect/turf_decal/siding/wideplating_new{ dir = 9 @@ -28368,18 +30115,27 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/storage) -"igK" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +"igR" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/plumbing/input, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) "ihd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sink/directional/east, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) +"ihj" = ( +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "ihl" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -28391,6 +30147,18 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) +"ihn" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port) "ihv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/wood{ @@ -28398,19 +30166,10 @@ }, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"ihE" = ( -/obj/structure/table/wood, -/obj/item/clothing/under/misc/burial, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) -"ihF" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/obj/structure/table, -/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/commons/dorms) +"ihJ" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "ihP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28450,6 +30209,16 @@ }, /turf/open/floor/iron/white/textured_corner, /area/station/science/robotics) +"iia" = ( +/obj/machinery/smartfridge/chemistry/preloaded, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "chemshutters"; + name = "Pharmacy Shutters" + }, +/turf/open/floor/plating, +/area/station/medical/pharmacy) "iib" = ( /obj/structure/table, /obj/item/storage/box/hug{ @@ -28463,8 +30232,16 @@ /turf/open/floor/wood/large, /area/station/service/theater_dressing) "iis" = ( -/turf/closed/wall, -/area/station/command/heads_quarters/captain/private) +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/conveyor{ + dir = 8; + id = "HoPsToy" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "iiF" = ( /obj/structure/railing/corner{ dir = 4 @@ -28475,6 +30252,25 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"iiN" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/station/maintenance/starboard) +"iiO" = ( +/obj/effect/turf_decal/arrows{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/turf_decal/siding/red{ + dir = 8 + }, +/turf/open/floor/iron/textured_edge{ + dir = 8 + }, +/area/station/command/gateway) "iiV" = ( /obj/structure/table/wood/poker, /obj/effect/spawner/random/entertainment/cigarette_pack, @@ -28504,13 +30300,24 @@ }, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"ijs" = ( -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "iju" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/security/checkpoint/supply) +/obj/machinery/conveyor_switch/oneway{ + id = "cargounload"; + name = "Unloading Conveyor"; + pixel_x = 5; + pixel_y = -10 + }, +/obj/effect/turf_decal/trimline/brown/filled/line, +/turf/open/floor/iron, +/area/station/cargo/storage) +"ijv" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) "ijB" = ( /obj/machinery/light/directional/east, /obj/structure/railing/corner/end{ @@ -28519,19 +30326,29 @@ /turf/open/floor/wood, /area/station/command/corporate_showroom) "ijF" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/airalarm/directional/south, -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +/obj/effect/spawner/random/structure/crate, +/obj/effect/turf_decal/bot_white, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron/dark/textured_large, +/area/station/cargo/storage) +"ijJ" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/structure/railing/corner{ dir = 4 }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) -"ijH" = ( -/obj/machinery/vending/assist, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/primary) +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/white/textured_half, +/area/station/science/robotics) +"ijL" = ( +/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/spawner/random/structure/steam_vent, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/fore) "ikc" = ( /obj/structure/railing, /turf/open/openspace, @@ -28563,13 +30380,6 @@ /obj/effect/turf_decal/siding/wood/corner, /turf/open/floor/wood/large, /area/station/service/library) -"ikK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/engineering/atmospherics_portable, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "ikL" = ( /obj/structure/disposalpipe/trunk{ dir = 2 @@ -28584,13 +30394,10 @@ /obj/effect/turf_decal/siding/wood/corner, /turf/open/floor/wood/large, /area/station/hallway/primary/central) -"ikZ" = ( -/turf/open/floor/eighties, -/area/station/maintenance/starboard/fore) "ilg" = ( /obj/machinery/vending/cart, /obj/item/radio/intercom/directional/east, -/turf/open/floor/wood, +/turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) "ils" = ( /obj/structure/mop_bucket, @@ -28604,18 +30411,22 @@ /obj/effect/spawner/random/maintenance/no_decals, /turf/open/floor/engine/hull, /area/space/nearstation) -"ilB" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/filingcabinet, -/obj/effect/spawner/random/bureaucracy/paper, -/turf/open/floor/iron/dark/textured_large, -/area/station/maintenance/starboard/aft) +"ily" = ( +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "ilE" = ( /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/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"ilO" = ( +/obj/structure/railing, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "ilV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -28624,10 +30435,6 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) -"imd" = ( -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/gravity_generator) "ime" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/railing, @@ -28635,11 +30442,19 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/security/prison) -"imo" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/light/directional/north, -/turf/open/openspace, -/area/station/service/kitchen) +"imf" = ( +/obj/structure/sign/warning/secure_area/directional/south, +/obj/structure/chair{ + dir = 4; + pixel_y = -2 + }, +/obj/item/binoculars, +/turf/open/floor/plating/airless, +/area/station/maintenance/starboard/aft) +"imi" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine/hull/air, +/area/station/commons/dorms) "imq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28663,6 +30478,21 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"imH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/central) +"imI" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/machinery/duct, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) "imJ" = ( /obj/structure/railing/corner{ dir = 4 @@ -28680,6 +30510,14 @@ }, /turf/open/floor/iron/checker, /area/station/service/bar/backroom) +"imN" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood/large, +/area/station/service/theater_dressing) "imQ" = ( /obj/structure/table, /obj/item/storage/medkit/toxin{ @@ -28706,22 +30544,47 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/security/prison) +"ing" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) "inh" = ( -/turf/open/openspace, -/area/station/command/bridge) -"inp" = ( -/obj/effect/turf_decal/tile/dark_green{ +/obj/structure/table/wood, +/obj/item/stack/package_wrap{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/hand_labeler{ + pixel_x = 3; + pixel_y = 10 + }, +/obj/machinery/recharger, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/wood/tile, +/area/station/command/heads_quarters/hop) +"ini" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/obj/effect/decal/cleanable/generic, /turf/open/floor/iron, -/area/station/maintenance/starboard/fore) +/area/station/commons/locker) +"inm" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "int" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/ladder, /turf/open/floor/plating, /area/station/solars/starboard/aft) +"inv" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/airless, +/area/station/maintenance/starboard/aft/upper) "inw" = ( /obj/structure/transit_tube/curved/flipped, /turf/open/space/openspace, @@ -28731,15 +30594,17 @@ /obj/machinery/door/airlock/external{ name = "Medical Escape Pod" }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, /turf/open/floor/iron/textured_half{ dir = 8 }, /area/station/medical/abandoned) -"inG" = ( -/obj/structure/sign/poster/official/get_your_legs/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/carpet/black, -/area/station/service/library/private) +"inD" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/station/service/library) "inI" = ( /obj/machinery/shower/directional/west, /obj/structure/fluff/shower_drain, @@ -28751,12 +30616,32 @@ }, /area/station/engineering/main) "inK" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "cargounload" +/obj/machinery/conveyor_switch/oneway{ + id = "cargoload"; + name = "Loading Conveyor"; + pixel_x = 5; + pixel_y = -5 }, -/turf/open/floor/iron, +/obj/machinery/holopad, +/turf/open/floor/iron/dark, /area/station/cargo/storage) +"inL" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) +"inQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/table/reinforced, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser{ + pixel_y = 8 + }, +/obj/item/pipe_dispenser, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "inT" = ( /obj/machinery/door/airlock/command{ name = "Head of Personnel" @@ -28767,7 +30652,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/hop, /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, -/turf/open/floor/wood, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) "inU" = ( /obj/structure/railing{ @@ -28775,6 +30660,13 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/science/genetics) +"inZ" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 4; + name = "killroom vent" + }, +/turf/open/floor/circuit/telecomms, +/area/station/science/xenobiology) "ioc" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/dark, @@ -28786,35 +30678,32 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"ioo" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ +"ion" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 }, -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay Staff Entrance" +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 4 }, -/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/medical/general, -/turf/open/floor/iron/white/textured_large, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"ioo" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay-office"; + name = "Medbay Shutters"; + dir = 4 + }, +/turf/open/floor/plating, /area/station/medical/medbay/central) "ioq" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, +/obj/machinery/holopad, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) -"ios" = ( -/obj/machinery/door/airlock{ - id_tag = "Cabin4"; - name = "Cabin 5" - }, -/turf/open/floor/wood, -/area/station/commons/dorms) -"iov" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/engineering/lobby) "iox" = ( /obj/machinery/vending/wardrobe/sec_wardrobe, /obj/structure/cable, @@ -28834,7 +30723,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/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "ioN" = ( /obj/structure/sign/warning/vacuum/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -28890,6 +30779,13 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"ipi" = ( +/obj/effect/turf_decal/siding/green/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "ipm" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -28897,6 +30793,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"ipo" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/vending/coffee, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"ipr" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/effect/spawner/random/bedsheet{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/commons/dorms) "ipt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock/public/glass{ @@ -28910,6 +30822,20 @@ }, /turf/open/floor/iron/edge, /area/station/hallway/primary/fore) +"ipv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/north, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron, +/area/station/commons/locker) +"ipL" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering{ + name = "Engineering" + }, +/turf/open/floor/iron, +/area/station/engineering/lobby) "ipQ" = ( /obj/structure/bookcase/random/reference, /turf/open/floor/wood/large, @@ -28918,17 +30844,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, -/obj/structure/table, -/obj/item/clothing/head/soft{ - pixel_x = -7; - pixel_y = 12 - }, -/obj/item/stamp/denied{ - pixel_x = 7; - pixel_y = 8 - }, /obj/machinery/airalarm/directional/north, -/obj/item/stamp/granted, /turf/open/floor/iron, /area/station/cargo/storage) "ipS" = ( @@ -28942,7 +30858,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ipW" = ( /obj/machinery/computer/telecomms/server{ dir = 1; @@ -28955,36 +30871,32 @@ dir = 8 }, /area/station/tcommsat/server) -"iqf" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ +"ipY" = ( +/obj/structure/lattice/catwalk, +/obj/structure/filingcabinet, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/openspace, +/area/station/maintenance/aft/upper) +"iqe" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "holodeck" }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/dark/textured_large, +/area/station/commons/fitness/recreation) "iqj" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output, /turf/open/floor/engine/n2, /area/station/engineering/atmos/upper) -"iqo" = ( -/obj/structure/table/reinforced, -/obj/item/toy/redbutton{ - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"iqs" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Waste to Filter"; - dir = 4 - }, -/obj/effect/turf_decal/trimline/red, -/turf/open/floor/iron/freezer, -/area/station/engineering/atmos/pumproom) "iqv" = ( /obj/structure/railing{ dir = 8 @@ -29005,20 +30917,23 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"iqy" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/fore) "iqC" = ( /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/light/small/broken/directional/east, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/plating, /area/station/maintenance/central) +"iqF" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/mix_input, +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos/upper) +"iqX" = ( +/obj/structure/closet/wardrobe/grey, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "ire" = ( /obj/machinery/restaurant_portal/bar, /obj/effect/turf_decal/siding/wood/end{ @@ -29030,6 +30945,20 @@ "irh" = ( /turf/closed/wall, /area/station/medical/cryo) +"irj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/crayon{ + icon_state = "body"; + name = "body"; + pixel_y = 7 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) "irn" = ( /obj/structure/railing{ dir = 8 @@ -29041,7 +30970,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/openspace, -/area/station/command/bridge) +/area/station/command/meeting_room/council) +"iro" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "irp" = ( /obj/machinery/exodrone_launcher, /obj/item/exodrone, @@ -29050,12 +30985,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"iry" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "irL" = ( /obj/item/kirbyplants/organic/plant21{ pixel_x = -11; @@ -29065,6 +30994,7 @@ pixel_x = 4; pixel_y = 5 }, +/obj/effect/turf_decal/siding/green, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "irU" = ( @@ -29087,29 +31017,18 @@ /obj/effect/decal/cleanable/fuel_pool, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"isn" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/engine/hull, -/area/station/maintenance/disposal/incinerator) "isp" = ( /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, /area/station/maintenance/starboard/fore) -"isv" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/stack{ - dir = 9 - }, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/structure/fluff/paper{ - dir = 1 +"isr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, -/obj/structure/sign/flag/nanotrasen/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "isy" = ( /obj/machinery/newscaster/directional/west, /obj/effect/turf_decal/tile/dark_blue{ @@ -29146,21 +31065,33 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) -"isX" = ( -/obj/machinery/air_sensor/nitrous_tank, -/obj/structure/window/reinforced/plasma/spawner/directional/north, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos/upper) +"isY" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "ite" = ( -/obj/effect/turf_decal/siding/red{ +/obj/structure/railing{ dir = 4 }, -/turf/open/floor/iron/dark, +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood/large, /area/station/hallway/primary/central) "ith" = ( /obj/item/cigbutt, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/station/maintenance/port/aft) +"iti" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/main) "itl" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 8 @@ -29171,9 +31102,13 @@ /turf/open/floor/engine/hull, /area/space/nearstation) "itm" = ( -/obj/structure/transport/linear, -/turf/open/openspace, -/area/station/engineering/break_room) +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "ito" = ( /obj/structure/chair/sofa/right/brown{ dir = 4 @@ -29181,9 +31116,6 @@ /obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, /turf/open/floor/glass/reinforced, /area/station/service/library) -"itq" = ( -/turf/open/floor/engine/hull/air, -/area/station/engineering/lobby) "itr" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/structure/extinguisher_cabinet/directional/south, @@ -29200,11 +31132,25 @@ /obj/effect/turf_decal/siding/blue/corner{ dir = 1 }, -/turf/open/floor/carpet, -/area/station/command/bridge) +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 10 + }, +/obj/item/pen{ + pixel_x = -1; + pixel_y = 13 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 1; + pixel_y = 6 + }, +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room/council) "itA" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 8 + }, /area/station/hallway/primary/central) "itI" = ( /obj/effect/turf_decal/siding/purple/corner, @@ -29228,25 +31174,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/openspace, /area/station/hallway/primary/starboard) -"itP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"itV" = ( -/obj/item/stack/sheet/mineral/wood{ - pixel_x = -5; - pixel_y = -6 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/security/detectives_office/private_investigators_office) "itX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29254,6 +31181,22 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/main) +"iub" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"iug" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "ius" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -29262,19 +31205,15 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/dark, /area/station/security/medical) -"iuu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/vending/wardrobe/atmos_wardrobe, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) -"iux" = ( -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 4 +"iuN" = ( +/obj/structure/railing, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/obj/effect/turf_decal/siding/thinplating, +/turf/open/floor/grass, +/area/station/hallway/primary/starboard) "iuO" = ( /obj/effect/landmark/transport/transport_id{ specific_transport_id = "catwalk_cafe" @@ -29287,6 +31226,16 @@ }, /turf/open/floor/plating/elevatorshaft, /area/station/service/kitchen) +"iuQ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/office) "iuR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -29298,12 +31247,21 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/engine/hull/air, /area/station/hallway/secondary/exit/departure_lounge) +"ivo" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "ivr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 +/obj/machinery/modular_computer/preset/command{ + dir = 1 }, -/turf/open/floor/carpet, -/area/station/command/meeting_room/council) +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/circuit, +/area/station/command/bridge) "ivu" = ( /obj/structure/table/wood, /obj/structure/disposalpipe/segment, @@ -29313,49 +31271,39 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, -/obj/machinery/vending/wardrobe/cargo_wardrobe, -/obj/machinery/light/directional/north, -/obj/item/radio/intercom/directional/north, +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Cargo Office"; + name = "Cargo Office Fax Machine" + }, +/obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron, /area/station/cargo/storage) "ivD" = ( -/obj/structure/bookcase/random/reference, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/carpet, -/area/station/command/meeting_room/council) -"ivI" = ( -/obj/effect/spawner/random/trash/mess, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/obj/machinery/firealarm/directional/east, +/turf/open/floor/glass/reinforced, +/area/station/command/bridge) "ivJ" = ( /obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4{ dir = 4 }, /obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ivL" = ( -/obj/structure/ladder, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, -/obj/machinery/camera/autoname/directional/south{ - network = list("ss13","medbay"); - c_tag = "Medbay - Upper Chemistry South" - }, +/obj/machinery/vending/wardrobe/chem_wardrobe, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"ivM" = ( -/obj/effect/turf_decal/siding/blue{ +"ivP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "iwa" = ( /obj/effect/turf_decal/trimline/red/line, /obj/effect/turf_decal/trimline/red/line{ @@ -29370,26 +31318,48 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) -"iwp" = ( +"iwg" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, /obj/structure/table, -/obj/item/plant_analyzer{ - pixel_y = 8 +/obj/machinery/cell_charger{ + pixel_y = 9 }, -/obj/item/healthanalyzer, -/obj/item/radio/intercom/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Secure - Tech Storage" +/obj/item/stock_parts/power_store/cell/high{ + charge = 100; + maxcharge = 15000 }, +/obj/item/stock_parts/power_store/cell/high{ + charge = 100; + maxcharge = 15000 + }, +/obj/item/stack/cable_coil, +/obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"iwl" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/structure/frame/computer{ + anchored = 1; + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) "iwq" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/storage_shared) "iwu" = ( /obj/machinery/camera/autoname/directional/east, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) "iwB" = ( /turf/open/floor/iron/dark, @@ -29399,19 +31369,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) -"iwN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/clock/directional/east, -/obj/structure/chair/plastic{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "iwS" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) +"iwY" = ( +/obj/machinery/washing_machine, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/station/maintenance/starboard) "ixf" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -29426,9 +31392,24 @@ /obj/structure/closet/cabinet, /turf/open/floor/wood/tile, /area/station/service/abandoned_gambling_den) +"ixj" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/engine/hull, +/area/station/solars/starboard/fore) "ixF" = ( /turf/closed/wall, /area/station/service/chapel) +"ixG" = ( +/obj/item/cigbutt{ + pixel_x = -9; + pixel_y = -2 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "ixR" = ( /obj/structure/table, /obj/item/storage/dice{ @@ -29442,31 +31423,25 @@ /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) "ixS" = ( -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/engine/hull/air, -/area/station/command/meeting_room/council) -"iyb" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room" +/obj/machinery/computer/records/medical, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"ixW" = ( +/obj/machinery/pdapainter/engineering, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) +"iyh" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/machinery/power/energy_accumulator/tesla_coil/anchored, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 5 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/heavy, -/obj/structure/cable/layer1, +/obj/structure/cable, /turf/open/floor/engine, -/area/station/engineering/main) -"iyk" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Auxiliary Tech Storage" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/engineering/supermatter) "iym" = ( /obj/structure/railing/corner{ dir = 8 @@ -29477,35 +31452,38 @@ /turf/open/floor/carpet/black, /area/station/service/library/private) "iyn" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners{ +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/end{ dir = 1 }, -/obj/structure/disposalpipe/junction{ - dir = 2 +/obj/structure/disposalpipe/segment{ + dir = 9 }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "iyq" = ( /obj/machinery/flasher/directional/west, /obj/machinery/light/directional/west, /obj/item/kirbyplants/random, /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) +"iys" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/obj/item/banner/cargo/mundane, +/turf/open/floor/iron, +/area/station/cargo/sorting) "iyv" = ( /turf/open/floor/wood, /area/station/security/courtroom) -"iyx" = ( -/obj/structure/chair/sofa/middle/brown, -/obj/item/clothing/under/costume/seifuku/red{ - pixel_y = -7 - }, -/obj/item/clothing/head/costume/crown{ - pixel_x = 10; - pixel_y = 8 - }, -/obj/structure/sign/poster/official/pda_ad/directional/north, -/turf/open/floor/eighties, -/area/station/maintenance/starboard/fore) "iyA" = ( /obj/structure/table/wood, /obj/item/toy/crayon/spraycan/lubecan{ @@ -29537,24 +31515,44 @@ /turf/open/water/jungle, /area/station/science/genetics) "iyI" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/engineering_hacking{ - pixel_x = -3; - pixel_y = 3 +/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/book/manual/wiki/engineering_guide, -/obj/item/book/manual/wiki/engineering_construction{ - pixel_x = 3; - pixel_y = -3 +/turf/open/floor/iron/edge{ + dir = 8 }, -/turf/open/floor/iron, -/area/station/commons/storage/primary) +/area/station/hallway/primary/central) "iyL" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 1; + pixel_y = -2 }, -/turf/open/floor/wood, -/area/station/medical/medbay/central) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard) +"iyS" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/camera/autoname/directional/east, +/turf/open/openspace, +/area/station/engineering/atmos/office) +"iyV" = ( +/obj/structure/table, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/item/newspaper, +/turf/open/floor/wood/large, +/area/station/commons/dorms) +"iyZ" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/structure/cable, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/starboard/central/upper) "izb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29569,42 +31567,48 @@ /area/station/hallway/primary/aft) "izg" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/freezer, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, /obj/machinery/camera/autoname/directional/east, /obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/structure/showcase/machinery/oldpod{ + desc = "An old NT branded sleeper, decommissioned after the lead acetate incident. None of the functional machinery remains inside."; + dir = 8; + name = "decommissioned sleeper" + }, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "izh" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, /obj/structure/railing{ dir = 4 }, -/obj/effect/turf_decal/siding/blue{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 4 }, -/obj/structure/chair/office{ - dir = 8; - name = "HoS' Chair" +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 4 }, -/obj/effect/turf_decal/tile/red/opposingcorners, -/obj/structure/railing/corner/end/flip{ - dir = 8 +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) +"izk" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/machinery/plumbing/receiver{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "izl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/security/courtroom) -"izp" = ( -/obj/item/stack/rods{ - amount = 7 - }, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/aft) "izF" = ( /obj/machinery/firealarm/directional/south, /obj/structure/disposalpipe/segment{ @@ -29631,11 +31635,19 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"izU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/sepia, -/area/station/hallway/secondary/construction) +"izP" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 8 + }, +/turf/open/floor/eighties, +/area/station/maintenance/department/crew_quarters/dorms) +"izV" = ( +/obj/machinery/airlock_controller/incinerator_atmos{ + pixel_x = 32; + pixel_y = 0 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "izW" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -29645,6 +31657,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"iAa" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron, +/area/station/engineering/lobby) "iAe" = ( /obj/structure/railing{ dir = 8 @@ -29663,15 +31682,6 @@ /obj/effect/landmark/start/roboticist, /turf/open/floor/iron, /area/station/science/robotics) -"iAr" = ( -/obj/structure/table/wood, -/obj/item/phone{ - desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; - pixel_x = -3; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "iAu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29684,20 +31694,17 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/commons/storage/art) -"iAH" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/structure/reagent_dispensers/fueltank, +"iAw" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) -"iBj" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/remains/human, -/obj/structure/frame/machine, +/area/station/command/bridge) +"iAx" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/structure/table, +/obj/item/kitchen/rollingpin, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard) "iBn" = ( /obj/machinery/vending/wardrobe/curator_wardrobe, /obj/machinery/light_switch/directional/east, @@ -29707,25 +31714,28 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine/hull/air, /area/station/construction/storage_wing) -"iBG" = ( -/obj/structure/broken_flooring/singular/directional/south, +"iBK" = ( +/obj/structure/sign/warning/no_smoking/directional/east, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"iBI" = ( -/obj/effect/decal/cleanable/dirt, +/area/station/maintenance/port/aft) +"iBM" = ( /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/maintenance/starboard/lesser) -"iBK" = ( -/obj/effect/spawner/random/engineering/tank, -/obj/structure/railing{ - dir = 1 +/obj/structure/cable, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 }, -/obj/effect/turf_decal/delivery, -/obj/structure/sign/warning/no_smoking/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/station/hallway/primary/central) +"iBW" = ( +/obj/item/trash/shok_roks/berry, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) "iBZ" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -29748,17 +31758,13 @@ /area/station/science/lab) "iCd" = ( /obj/structure/table/reinforced, +/obj/machinery/door/firedoor, /obj/machinery/door/window/brigdoor/left/directional/east{ req_access = list("brig_entrance") }, -/obj/machinery/recharger{ - pixel_x = 5; - pixel_y = 9 - }, -/obj/item/screwdriver{ - pixel_y = -4 - }, -/obj/machinery/door/firedoor, +/obj/item/paper_bin, +/obj/item/folder/red, +/obj/item/pen, /turf/open/floor/plating, /area/station/security/checkpoint/medical) "iCe" = ( @@ -29780,15 +31786,11 @@ }, /obj/effect/turf_decal/siding/dark, /turf/open/floor/iron/white/textured_half, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "iCq" = ( /obj/machinery/holopad, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"iCx" = ( -/obj/effect/spawner/random/trash/botanical_waste, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) "iCB" = ( /obj/structure/closet/bombcloset, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -29797,16 +31799,12 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"iCN" = ( -/obj/structure/closet/crate/coffin, -/obj/effect/spawner/random/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"iCS" = ( -/obj/structure/disposalpipe/segment, +"iCV" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard) "iDe" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -29836,13 +31834,11 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) -"iDw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/structure/steam_vent, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +"iDE" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/plumbing/sender, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "iDF" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 4 @@ -29865,7 +31861,8 @@ pixel_y = -4 }, /obj/structure/sign/plaques/kiddie/perfect_man{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/machinery/light/directional/east, /turf/open/floor/carpet, @@ -29881,15 +31878,10 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/engine, /area/station/science/auxlab/firing_range) -"iDS" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) +"iEe" = ( +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard) "iEf" = ( /obj/machinery/air_sensor/ordnance_burn_chamber, /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ @@ -29919,13 +31911,6 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) -"iEp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/left/brown{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "iEq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29946,7 +31931,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "iEH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29959,14 +31944,14 @@ /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "iEI" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 +/obj/effect/turf_decal/stripes{ + dir = 4 }, -/obj/structure/railing/corner{ +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/turf/open/floor/iron/textured, +/area/station/command/eva) "iEJ" = ( /obj/effect/spawner/random/vending/snackvend, /obj/effect/decal/cleanable/dirt, @@ -29980,6 +31965,15 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, /area/station/maintenance/port) +"iEL" = ( +/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/dark/textured_large, +/area/station/medical/morgue) "iEQ" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -29989,16 +31983,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/openspace, /area/station/hallway/secondary/exit/departure_lounge) -"iET" = ( -/obj/effect/turf_decal/siding, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/obj/structure/disposalpipe/segment{ +"iES" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ dir = 4 }, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) +/turf/closed/wall/r_wall, +/area/station/command/bridge) "iEV" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -30020,11 +32010,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/ordnance/storage) -"iFf" = ( -/obj/structure/cable/multilayer/multiz, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) "iFn" = ( /obj/structure/railing/corner/end/flip{ dir = 8 @@ -30053,13 +32038,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/service/cafeteria) +"iFy" = ( +/obj/effect/turf_decal/siding/dark_blue/inner_corner, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "iFz" = ( /obj/structure/cable/layer3, /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/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "iFB" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -30069,12 +32058,16 @@ /obj/effect/spawner/random/maintenance, /turf/open/openspace, /area/station/hallway/primary/starboard) -"iFM" = ( -/obj/structure/lattice/catwalk, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/space/basic, -/area/station/maintenance/solars/port/aft) +"iFK" = ( +/obj/machinery/door/airlock{ + id_tag = "Cabin7"; + name = "Cabin 1" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/turf/open/floor/iron/dark/textured_large, +/area/station/commons/dorms) "iFR" = ( /obj/structure/chair{ dir = 8 @@ -30083,9 +32076,15 @@ /turf/open/floor/carpet, /area/station/security/courtroom) "iFS" = ( -/obj/machinery/camera/autoname/directional/east, -/turf/open/openspace, -/area/station/command/meeting_room/council) +/obj/machinery/computer/monitor{ + name = "bridge power monitoring console"; + dir = 8 + }, +/obj/machinery/light/warm/dim/directional/east, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "iFU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30101,11 +32100,20 @@ /obj/item/stack/rods, /turf/open/openspace, /area/station/maintenance/port/aft) -"iGc" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/toilet, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"iGe" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 + }, +/obj/item/camera_film{ + pixel_y = 2; + pixel_x = 2 + }, +/obj/item/camera{ + pixel_y = 4 + }, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "iGm" = ( /obj/structure/bed, /obj/structure/toilet/greyscale{ @@ -30117,6 +32125,17 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison/safe) +"iGo" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"iGu" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "iGy" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -30132,17 +32151,6 @@ "iGB" = ( /turf/closed/wall, /area/station/commons/storage/tools) -"iGC" = ( -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer2{ - dir = 1 - }, -/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) "iGD" = ( /obj/structure/table/reinforced, /obj/item/storage/briefcase/secure{ @@ -30162,24 +32170,36 @@ /turf/open/floor/wood, /area/station/command/heads_quarters/rd) "iGH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 }, -/turf/open/floor/iron/white/textured_edge{ - dir = 8 +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 4 }, -/area/station/medical/surgery) +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "iGI" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 4 + }, /obj/structure/railing/corner{ dir = 4 }, -/obj/effect/turf_decal/siding/blue/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ dir = 4 }, -/obj/effect/turf_decal/tile/red/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) +"iGO" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "iGP" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable/layer3, @@ -30189,7 +32209,7 @@ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "iGQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30199,12 +32219,34 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) +"iGT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/black, +/area/station/service/library/private) +"iHi" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "iHo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"iHr" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Gravity Generator Area" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/gravity_generator) "iHu" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/pale/style_random, @@ -30244,6 +32286,14 @@ }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"iHO" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "iHQ" = ( /obj/structure/marker_beacon/indigo, /obj/structure/lattice/catwalk, @@ -30290,11 +32340,6 @@ }, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) -"iIL" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/closet/firecloset, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "iIP" = ( /obj/effect/turf_decal/box/corners{ dir = 4 @@ -30319,34 +32364,48 @@ /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) "iJc" = ( -/obj/structure/tank_dispenser/oxygen{ - pixel_x = -1; - pixel_y = 2 - }, -/obj/effect/turf_decal/siding/wood, /obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) -"iJn" = ( -/obj/structure/railing{ - dir = 4 +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/stripes{ + dir = 10 + }, +/obj/structure/table, +/obj/item/storage/toolbox/electrical{ + pixel_x = -3; + pixel_y = 11 + }, +/obj/item/storage/belt/utility{ + pixel_x = -3 + }, +/obj/item/storage/belt/utility{ + pixel_x = -3 }, +/turf/open/floor/iron/textured, +/area/station/command/eva) +"iJn" = ( /obj/effect/turf_decal/siding/blue{ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"iJs" = ( -/obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage{ - pixel_x = 5; - pixel_y = 9 +/obj/structure/railing{ + dir = 4 }, -/obj/structure/table, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/obj/structure/cable, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "iJu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -30369,8 +32428,8 @@ /area/station/hallway/primary/port) "iJC" = ( /obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/rnd/production/techfab/department/cargo, -/obj/structure/extinguisher_cabinet/directional/south, +/obj/item/radio/intercom/directional/south, +/obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron, /area/station/cargo/storage) "iJH" = ( @@ -30380,41 +32439,52 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/iron, /area/station/maintenance/starboard/central) -"iJN" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 +"iJX" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 }, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"iKf" = ( -/obj/effect/turf_decal/trimline/white/line{ - dir = 8; - pixel_x = 8 +/obj/effect/turf_decal/trimline/red/corner, +/obj/machinery/airalarm/directional/west, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"iJY" = ( +/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2, +/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4, +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 2 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) -"iKj" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/structure/railing{ - dir = 4 +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) +"iKa" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/obj/structure/railing{ - dir = 8 +/obj/machinery/camera/autoname/directional/west{ + network = list("ss13","medbay"); + c_tag = "Medbay - Lower Central Hallway" }, -/turf/open/openspace, -/area/station/engineering/lobby) +/obj/machinery/firealarm/directional/west{ + pixel_x = -20 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "iKm" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/effect/turf_decal/box, /turf/open/floor/iron/dark/textured_corner, /area/station/science/ordnance/storage) +"iKw" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/table, +/obj/item/geiger_counter{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/binoculars, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) "iKx" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -30436,20 +32506,41 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"iKF" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light_switch/directional/north, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "iKH" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 4 +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/machinery/iv_drip, -/turf/open/floor/iron/white/textured_large, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/white/filled/warning, +/turf/open/floor/iron/dark, /area/station/medical/medbay/central) -"iKT" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ +"iKI" = ( +/obj/effect/turf_decal/siding{ dir = 4 }, +/obj/structure/hoop{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) +"iKT" = ( /obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/effect/turf_decal/trimline/brown/arrow_ccw{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) "iLe" = ( @@ -30463,14 +32554,14 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "iLn" = ( -/obj/machinery/camera/autoname/directional/west, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/turf/open/floor/iron/dark, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/wood/large, /area/station/hallway/primary/central) "iLy" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -30497,20 +32588,7 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"iLC" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "iLD" = ( -/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/effect/turf_decal/trimline/red/filled/line{ dir = 1 }, @@ -30553,13 +32631,6 @@ }, /turf/open/misc/asteroid, /area/station/science/robotics) -"iLH" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 4 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) "iLL" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/transit_tube/horizontal, @@ -30569,39 +32640,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/space/openspace, /area/space/nearstation) -"iLP" = ( -/obj/effect/turf_decal/trimline/white/corner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) -"iMf" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) "iMo" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/east, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"iMp" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/closed/wall, -/area/station/maintenance/starboard/aft) -"iMq" = ( -/obj/item/clothing/head/soft/orange, -/obj/structure/closet/secure_closet/engineering_chief, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "iMr" = ( /obj/structure/railing/corner{ dir = 8 @@ -30617,16 +32660,6 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"iMu" = ( -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 6 - }, -/turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai_upload) "iMD" = ( /obj/effect/landmark/firealarm_sanity, /turf/open/openspace, @@ -30639,17 +32672,11 @@ /obj/structure/sign/departments/botany/alt2/directional/west, /turf/open/floor/iron/stairs/medium, /area/station/hallway/primary/central) -"iML" = ( -/obj/machinery/shower/directional/west, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"iMP" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +"iMO" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/structure/dresser, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "iMQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30661,15 +32688,20 @@ /turf/open/floor/iron/dark/textured_large, /area/station/science/zoo) "iMT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron/textured, /area/station/cargo/storage) -"iMV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) +"iMX" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "iNk" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -30677,6 +32709,11 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port) +"iNn" = ( +/obj/structure/lattice/catwalk, +/obj/effect/spawner/random/maintenance, +/turf/open/openspace, +/area/station/maintenance/starboard/central/upper) "iNy" = ( /obj/effect/turf_decal/siding/purple{ dir = 8 @@ -30687,60 +32724,35 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/lab) +"iND" = ( +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "SM_shutters"; + name = "Supermatter Radiation Shutters"; + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/supermatter) "iNI" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/plating/airless, /area/station/maintenance/space_hut) -"iNK" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/disposalpipe/trunk/multiz, -/turf/open/floor/wood, -/area/station/commons/dorms) "iNP" = ( /obj/machinery/light/directional/west, /turf/open/openspace, /area/station/service/chapel) -"iNX" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/effect/landmark/start/depsec/engineering, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/engineering) -"iOc" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"iOk" = ( -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) -"iOp" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 8 - }, -/obj/structure/table, -/obj/structure/railing{ - dir = 8 - }, -/obj/item/camera{ - pixel_y = 4 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "iOB" = ( /obj/structure/sink/directional/east, /obj/structure/mirror/directional/west, /turf/open/floor/iron/freezer, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "iOE" = ( /obj/machinery/ore_silo, /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "iOF" = ( /obj/machinery/door/airlock/security{ name = "Customs Desk" @@ -30787,12 +32799,22 @@ }, /turf/open/floor/engine, /area/station/science/auxlab/firing_range) -"iPt" = ( -/obj/item/binoculars, -/obj/item/toy/basketball, -/obj/structure/closet, +"iPv" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard) +"iPx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/duct, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "iPz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30802,14 +32824,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"iPL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "iPQ" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -30836,11 +32850,33 @@ }, /turf/open/openspace, /area/station/hallway/secondary/construction) -"iQe" = ( -/obj/machinery/field/generator, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/engine, -/area/station/engineering/break_room) +"iQd" = ( +/obj/structure/rack, +/obj/item/clothing/suit/hazardvest{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest{ + pixel_x = 3 + }, +/obj/item/clothing/suit/hazardvest{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/clothing/gloves/color/black{ + pixel_y = 3 + }, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black{ + pixel_y = -3 + }, +/obj/item/clothing/mask/gas, +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "iQi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -30849,6 +32885,13 @@ /obj/effect/decal/cleanable/wrapping, /turf/open/floor/iron, /area/station/construction/storage_wing) +"iQj" = ( +/obj/machinery/door/airlock/external{ + name = "Common Mining Dock" + }, +/obj/effect/landmark/navigate_destination/dockaux, +/turf/open/floor/plating, +/area/station/hallway/secondary/construction) "iQw" = ( /obj/structure/railing{ dir = 6 @@ -30871,16 +32914,40 @@ /area/station/service/library) "iQA" = ( /obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"iQD" = ( +/obj/item/clothing/accessory/armband/cargo{ + pixel_x = 8; + pixel_y = 10 + }, +/obj/structure/sign/poster/contraband/rebels_unite/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{ +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) +"iQE" = ( +/obj/structure/table/reinforced, +/obj/item/toy/crayon/spraycan, +/obj/item/toy/crayon/spraycan{ + pixel_x = 1; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ dir = 4 }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "iQI" = ( /obj/structure/chair{ dir = 8 @@ -30896,39 +32963,45 @@ dir = 8 }, /area/station/service/chapel) -"iQR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/commons/dorms) +"iQM" = ( +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "iQX" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/genetics) -"iRa" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall, -/area/station/maintenance/starboard/lesser) "iRf" = ( -/turf/open/floor/carpet, -/area/station/command/meeting_room/council) -"iRx" = ( -/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/dark_blue/opposingcorners, /turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) +/area/station/command/bridge) "iRA" = ( /turf/open/floor/iron/white/smooth_large, /area/station/hallway/secondary/entry) -"iRF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall, -/area/station/commons/dorms) +"iRC" = ( +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_y = 8 + }, +/obj/structure/sign/directions/security{ + dir = 8; + pixel_y = -11 + }, +/obj/structure/sign/directions/dorms/directional/south{ + dir = 4; + pixel_y = -5 + }, +/obj/structure/sign/directions/engineering/directional/south{ + dir = 4; + pixel_y = 2 + }, +/turf/closed/wall/r_wall, +/area/station/maintenance/central) "iRH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30937,36 +33010,28 @@ /obj/effect/mapping_helpers/airlock/access/all/service/general, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"iRV" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner, +"iRR" = ( +/obj/structure/reagent_dispensers/foamtank, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) +"iRW" = ( /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/medical_doctor, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/openspace, -/area/station/medical/storage) -"iRX" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/station/engineering/lobby) -"iSh" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Engineering Maintenance" +/obj/machinery/door/airlock/engineering{ + name = "Engine 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/access/any/engineering/general, -/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, -/turf/open/floor/plating, -/area/station/engineering/lobby) +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmosuppersm" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "iSv" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line, /obj/effect/turf_decal/tile/dark_red{ @@ -31045,8 +33110,9 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/openspace, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "iTf" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 1 @@ -31054,28 +33120,28 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/digital_clock/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"iTx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ +"iTh" = ( +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"iTw" = ( +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ dir = 4 }, -/obj/machinery/meter, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) -"iTB" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 +/obj/item/kirbyplants/random, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) +"iTF" = ( +/obj/structure/table, +/obj/structure/bedsheetbin/empty{ + pixel_y = 6 }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/engineering/lobby) -"iTE" = ( -/obj/effect/spawner/random/food_or_drink/snack, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "iTH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -31093,6 +33159,26 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) +"iTR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/wood/tile, +/area/station/security/detectives_office/private_investigators_office) +"iTU" = ( +/obj/structure/sign/poster/random/directional/north, +/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 = 5 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 6 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "iTW" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/structure/table, @@ -31103,14 +33189,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"iUj" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) "iUl" = ( /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/science/genetics, @@ -31124,15 +33202,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/security/interrogation) -"iUo" = ( -/obj/machinery/atmospherics/components/tank/air{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "iUs" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -31149,6 +33218,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) +"iUz" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "iUD" = ( /turf/closed/wall, /area/station/maintenance/solars/starboard/fore) @@ -31159,52 +33234,34 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/service/chapel) -"iUJ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/main) "iUM" = ( -/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/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/landmark/start/depsec/supply, +/obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) +"iUX" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/item/radio/intercom/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/engineering/storage_shared) "iVc" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/structure/sign/warning/vacuum/external/directional/east, /turf/open/floor/plating, /area/station/engineering/storage_shared) -"iVi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/textured_large, -/area/station/medical/abandoned) -"iVk" = ( -/obj/structure/lattice/catwalk, -/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, -/turf/open/openspace, -/area/station/medical/storage) -"iVp" = ( -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"iVr" = ( +/obj/structure/sign/warning/directional/south, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "iVA" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -31212,12 +33269,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_edge, /area/station/commons/lounge) -"iVT" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/access/any/engineering/external, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "iVW" = ( /turf/open/floor/plating/elevatorshaft, /area/station/security/prison/rec) @@ -31237,16 +33288,20 @@ /obj/structure/closet/secure_closet/medical1, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) -"iWb" = ( -/obj/structure/urinal/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"iWh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"iWa" = ( +/obj/effect/turf_decal/weather/snow/corner{ dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) +/obj/structure/cable, +/obj/effect/turf_decal/weather/snow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor{ + color = "#66ccff" + }, +/obj/item/wrench/medical, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/medical/coldroom) "iWk" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, @@ -31272,17 +33327,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "iWu" = ( /turf/closed/wall, /area/space/nearstation) -"iWA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/smes/engineering, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "iWD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31292,10 +33342,13 @@ }, /turf/open/floor/wood, /area/station/service/library) -"iWM" = ( -/obj/structure/broken_flooring/side/directional/west, +"iWF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink/directional/west, +/obj/structure/mirror/broken/directional/east, +/obj/structure/cable, /turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) +/area/station/maintenance/starboard/upper) "iXd" = ( /obj/structure/lattice/catwalk, /obj/effect/decal/remains/human, @@ -31313,10 +33366,8 @@ /turf/open/floor/iron, /area/station/hallway/primary/aft) "iXw" = ( -/obj/structure/bed/dogbed/renault, -/mob/living/basic/pet/fox/renault, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/carpet, +/obj/structure/cable, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "iXz" = ( /obj/machinery/door/airlock/maintenance{ @@ -31342,12 +33393,6 @@ /obj/structure/chair, /turf/open/floor/iron/airless, /area/station/maintenance/starboard/aft) -"iXH" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) "iXJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall, @@ -31358,6 +33403,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"iYa" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "iYb" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -31369,16 +33420,48 @@ }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"iYe" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/openspace, +/area/station/medical/abandoned) "iYm" = ( /turf/open/misc/asteroid/airless, /area/space/nearstation) "iYq" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 +/obj/structure/disposalpipe/segment{ + dir = 8 }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/bot/left, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + location = "Cargo Storage-2" + }, +/mob/living/simple_animal/bot/mulebot{ + name = "Parcel Pete" + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/recharge_floor, +/area/station/cargo/sorting) +"iYr" = ( +/obj/effect/turf_decal/siding{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/white/line, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "iYJ" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/large, @@ -31390,27 +33473,10 @@ /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"iYM" = ( -/obj/structure/lattice/catwalk, -/obj/effect/spawner/random/maintenance, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) -"iYZ" = ( -/mob/living/basic/turtle{ - name = "John Arbuckle" - }, -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/mapping_helpers/mob_buckler, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/aft) -"iZe" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/railing/corner/end, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +"iZk" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "iZr" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -31418,6 +33484,15 @@ /obj/machinery/computer/security, /turf/open/floor/iron/dark, /area/station/security/office) +"iZt" = ( +/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/cyan/visible/layer5{ + dir = 9 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "iZu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31430,12 +33505,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"iZx" = ( -/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, -/area/station/maintenance/starboard/fore) "iZI" = ( /obj/machinery/computer/bank_machine, /obj/machinery/light_switch/directional/west{ @@ -31444,13 +33513,7 @@ /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/station/ai_monitored/command/nuke_storage) -"iZK" = ( -/obj/machinery/light_switch/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/station/service/chapel) +/area/station/command/vault) "jac" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -31460,7 +33523,7 @@ dir = 4 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "jad" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -31483,90 +33546,80 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, /area/station/hallway/secondary/construction) -"jam" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/siding/yellow{ - dir = 1 - }, -/obj/structure/table, -/obj/item/stack/cable_coil{ - pixel_x = -12 - }, -/obj/item/stack/cable_coil{ - pixel_x = -7; - pixel_y = 4 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 7 - }, -/obj/item/stack/ducts/fifty{ - pixel_y = -3 - }, -/obj/item/stack/ducts/fifty{ - pixel_y = -3 - }, -/obj/item/stack/ducts/fifty{ - pixel_y = -3 - }, -/obj/item/stack/ducts/fifty{ - pixel_y = -3 - }, -/obj/item/stack/ducts/fifty{ - pixel_y = -3 - }, -/obj/item/stack/ducts/fifty{ - pixel_y = -3 - }, -/obj/item/stack/ducts/fifty{ - pixel_y = -3 - }, -/obj/item/stack/ducts/fifty{ - pixel_y = -3 - }, -/obj/item/reagent_containers/dropper, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/chemistry) "jap" = ( /turf/open/floor/engine/hull/air, /area/station/commons/dorms) +"jau" = ( +/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 + }, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "jaG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/maintenance/starboard/central) +"jaI" = ( +/turf/open/openspace, +/area/station/engineering/storage/tech) "jaN" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/maintenance/two, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, /area/station/maintenance/starboard/central) +"jaT" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/starboard) +"jaY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/north, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron, +/area/station/commons/locker) +"jba" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "jbc" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/construction/storage_wing) -"jbh" = ( -/obj/machinery/light/floor/broken, -/turf/open/openspace, -/area/station/maintenance/hallway/abandoned_recreation) "jbn" = ( /obj/structure/stairs/west, /obj/structure/railing, /obj/structure/sign/poster/official/help_others/directional/north, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"jbD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/engineering/atmos/project) +/area/station/ai/satellite/interior) +"jbr" = ( +/obj/machinery/atmospherics/components/unary/airlock_pump/unbolt_only, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) +"jbL" = ( +/obj/item/kirbyplants/fern{ + pixel_x = -3; + pixel_y = 18 + }, +/obj/structure/sign/flag/nanotrasen/directional/north, +/obj/structure/fluff/paper/stack, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "jbO" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -31577,7 +33630,7 @@ /obj/structure/closet/secure_closet/armory2, /obj/effect/spawner/random/armory/rubbershot, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "jbS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/full, @@ -31593,11 +33646,13 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"jcj" = ( -/obj/machinery/airalarm/directional/east, -/mob/living/basic/bot/cleanbot/medbay, -/turf/open/floor/wood, -/area/station/medical/medbay/central) +"jbZ" = ( +/obj/machinery/portable_atmospherics/canister/plasma, +/obj/effect/turf_decal/delivery/white{ + color = "#ff6600" + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "jcn" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/end, /obj/structure/flora/bush/lavendergrass, @@ -31613,56 +33668,71 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/science/genetics) +"jcw" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 2; + name = "O2 to Mix" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "jcy" = ( -/obj/structure/ladder, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) -"jcz" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/obj/structure/table, +/obj/item/flashlight/lamp, +/obj/item/folder/white{ + pixel_x = -6 + }, +/obj/machinery/light_switch/directional/west{ + pixel_x = -22 + }, +/obj/machinery/requests_console/auto_name/directional/south, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/white, +/area/station/medical/office) "jcE" = ( /obj/structure/chair{ dir = 1 }, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/bomb) -"jcP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"jcH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=21-Central"; + location = "20-Genetics" }, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) -"jcQ" = ( /obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/aft) -"jda" = ( -/obj/item/spear, -/obj/effect/decal/cleanable/blood/old, -/obj/item/clothing/gloves/color/rainbow, -/obj/item/clothing/shoes/sneakers/rainbow, -/obj/item/clothing/under/color/rainbow, -/obj/item/clothing/head/soft/rainbow, -/obj/effect/decal/remains/human, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/turf/open/floor/catwalk_floor/iron, +/area/station/hallway/primary/central) +"jcM" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/engineering/atmos/upper) +"jcN" = ( +/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/lobby) "jdf" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/spawner/random/structure/grille, /turf/open/floor/engine/hull, /area/space/nearstation) "jdg" = ( -/obj/machinery/holopad, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet, -/area/station/command/bridge) +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "jdi" = ( /obj/effect/turf_decal/siding/purple{ dir = 8 @@ -31678,12 +33748,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/textured_large, /area/station/science/genetics) -"jdr" = ( -/obj/machinery/airalarm/directional/north, -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/openspace, -/area/station/engineering/atmos/project) "jdB" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/mix_input{ dir = 1 @@ -31693,6 +33757,25 @@ }, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) +"jdH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/landmark/start/paramedic, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/office) +"jdM" = ( +/obj/structure/table, +/obj/machinery/microwave/engineering/cell_included, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "jdZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -31701,17 +33784,7 @@ name = "AI Core Access" }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) -"jec" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - 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/openspace, -/area/station/medical/virology) +/area/station/ai/satellite/interior) "jee" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -31720,27 +33793,49 @@ /turf/closed/wall, /area/station/security/evidence) "jeh" = ( -/obj/structure/railing{ - dir = 8 +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron/edge{ + dir = 4 }, -/obj/effect/turf_decal/siding/wood{ +/area/station/hallway/primary/central) +"jei" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/machinery/vending/cigarette{ - pixel_x = 5 +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/turf/open/floor/iron, +/area/station/maintenance/starboard) +"jem" = ( +/obj/structure/rack, +/obj/item/circuitboard/machine/oven{ + pixel_y = 3 }, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) +/obj/item/circuitboard/machine/oven, +/obj/item/circuitboard/machine/oven{ + pixel_y = -3 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "jeq" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/machinery/cryo_cell, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) +/obj/machinery/computer/records/medical{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/south, +/obj/structure/fireaxecabinet/jawsofrecovery/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/office) "jes" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/science) @@ -31757,19 +33852,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"jeD" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay 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/any/medical/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port) "jeU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -31782,42 +33864,30 @@ /turf/open/floor/iron/dark/textured_large, /area/station/security/prison/safe) "jeW" = ( -/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/station/cargo/storage) -"jeX" = ( -/obj/item/kirbyplants/random/dead{ - name = "dead plant" - }, -/obj/machinery/button/door/directional/east{ - id = "Cabin2"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/commons/dorms) "jfd" = ( -/obj/machinery/light/directional/east, -/obj/machinery/computer/cargo{ - dir = 8 - }, /obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/machinery/status_display/supply{ - pixel_x = 32 + dir = 5 }, /turf/open/floor/iron, /area/station/cargo/storage) "jfi" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/door/window/left/directional/east{ + name = "Cyborg Upload Console Window"; + req_access = list("ai_upload") + }, +/obj/machinery/computer/upload/borg{ dir = 4 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/turf/open/floor/circuit/green, +/area/station/ai/upload/chamber) "jfj" = ( /obj/effect/decal/cleanable/dirt, /obj/item/camera_film, @@ -31830,11 +33900,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"jfp" = ( -/obj/structure/lattice/catwalk, -/obj/item/kirbyplants/random, -/turf/open/openspace, -/area/station/engineering/break_room) "jfA" = ( /turf/open/openspace, /area/station/security/brig) @@ -31867,9 +33932,6 @@ /turf/open/floor/iron/dark, /area/station/security/interrogation) "jgd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, /obj/effect/turf_decal/trimline/brown/warning{ dir = 9 }, @@ -31903,13 +33965,6 @@ "jgy" = ( /turf/open/floor/carpet, /area/station/maintenance/starboard/aft) -"jgB" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "jgC" = ( /obj/structure/transit_tube/curved/flipped{ dir = 4 @@ -31917,6 +33972,12 @@ /obj/structure/lattice, /turf/open/space/openspace, /area/space/nearstation) +"jgD" = ( +/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/aft/upper) "jgJ" = ( /obj/machinery/door/airlock/command{ name = "Research Division Server Room" @@ -31941,19 +34002,20 @@ /turf/open/floor/iron/textured_large, /area/station/medical/virology) "jhg" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/camera/autoname/directional/east, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/obj/structure/chair/office, +/obj/structure/fluff/paper/stack{ + dir = 5 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "jhj" = ( /obj/structure/cable/layer3, /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_half, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "jhm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31965,7 +34027,7 @@ codes_txt = "patrol;next_patrol=19-Captain"; location = "18-Bathroom" }, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "jhu" = ( /obj/structure/disposalpipe/segment{ @@ -31973,6 +34035,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"jhz" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "jhM" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/bottle/holywater{ @@ -31991,22 +34062,25 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/medical) -"jhU" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/spawner/random/engineering/tank, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "jhW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/greenglow, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"jia" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/maintenance, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/obj/effect/turf_decal/siding/dark_blue{ + dir = 10 + }, +/obj/effect/landmark/event_spawn, +/obj/item/kirbyplants/random, +/turf/open/floor/carpet/blue, +/area/station/medical/break_room) +"jia" = ( +/obj/machinery/door/airlock/external{ + name = "Mining Dock Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "jic" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/textured_large, @@ -32016,92 +34090,52 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"jip" = ( -/obj/structure/lattice/catwalk, -/obj/effect/spawner/random/maintenance, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) -"jiv" = ( -/obj/effect/turf_decal/siding/brown{ +"jix" = ( +/obj/machinery/light/warm/dim/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/obj/effect/turf_decal/siding/brown, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/chair/comfy/beige{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "jiD" = ( /obj/machinery/telecomms/server/presets/common, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"jiE" = ( -/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 = 5 - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=20-Genetics"; - location = "19-Captain" - }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "jiG" = ( /obj/machinery/newscaster/directional/west, /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/station/security/medical) "jiL" = ( -/obj/structure/table/glass, /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 + dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 1 +/obj/machinery/defibrillator_mount/mobile{ + anchored = 1 }, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ dir = 4 }, -/obj/item/stack/medical/bone_gel{ - pixel_x = 6; - pixel_y = 12 - }, -/obj/item/stack/sticky_tape/surgical{ - pixel_x = -4; - pixel_y = 5 - }, -/obj/machinery/light/directional/east, /turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) -"jjc" = ( -/obj/structure/cable, -/obj/effect/spawner/random/trash/grille_or_waste, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"jjd" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/pumproom) -"jjh" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 4 +/area/station/medical/medbay/central) +"jjc" = ( +/obj/structure/cable, +/obj/effect/spawner/random/trash/grille_or_waste, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jji" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 8 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) -"jjj" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos/upper) -"jjn" = ( -/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/commons/fitness/recreation) +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "jjo" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 10 @@ -32111,9 +34145,17 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"jjp" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/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/plating, +/area/station/engineering/gravity_generator) "jjr" = ( -/obj/effect/decal/cleanable/dirt, /obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) "jjv" = ( @@ -32170,20 +34212,54 @@ }, /turf/open/floor/grass, /area/station/science/genetics) +"jjZ" = ( +/obj/structure/table, +/obj/item/electronics/apc, +/obj/item/electronics/airlock, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"jkb" = ( +/obj/structure/cable, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "jkd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine/hull/air, /area/station/maintenance/port) +"jke" = ( +/obj/effect/landmark/start/station_engineer, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/main) "jkh" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/iv_drip, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/port) +"jkk" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/stack{ + desc = "A stack of various papers, absolutely unreadable due to scorch marks and aging."; + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "jkn" = ( /obj/structure/table/wood/poker, -/turf/open/floor/wood, +/obj/item/flashlight/lamp/green{ + pixel_y = 5 + }, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) "jkq" = ( /turf/open/floor/iron/stairs/right{ @@ -32193,29 +34269,23 @@ "jkr" = ( /turf/closed/wall, /area/station/science/lab) -"jkz" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) +"jkD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/obj/machinery/light/directional/north, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "jkG" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Security Post - Cargo" - }, +/obj/effect/spawner/structure/window/reinforced, /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/security/general, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, +/turf/open/floor/plating, /area/station/security/checkpoint/supply) -"jkI" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/hallway) +"jkJ" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/trimline/dark/arrow_cw{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "jkL" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -32224,12 +34294,10 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark/textured, /area/station/construction/mining/aux_base) -"jkR" = ( -/obj/machinery/computer/holodeck, -/obj/machinery/camera/autoname/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +"jkM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "jkW" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -32252,29 +34320,23 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/hallway/secondary/construction) -"jlf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/blobstart, -/turf/open/floor/engine, -/area/station/maintenance/starboard/lesser) -"jlh" = ( -/obj/structure/lattice/catwalk, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/aft) -"jlo" = ( -/obj/structure/rack, -/obj/item/encryptionkey/headset_com{ - pixel_x = -4; - pixel_y = 3 +"jli" = ( +/obj/effect/turf_decal/trimline/purple/arrow_cw{ + dir = 8 }, -/obj/item/encryptionkey/headset_sec{ - pixel_x = 4 +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 }, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 +/obj/structure/chair{ + dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"jln" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "jlB" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -32312,12 +34374,20 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/dark, /area/station/security/detectives_office) -"jmh" = ( -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/lesser) +"jlX" = ( +/obj/structure/sign/poster/official/get_your_legs/directional/west, +/obj/machinery/light/directional/west, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/black, +/area/station/service/library/private) "jmo" = ( /obj/structure/cable, /obj/effect/spawner/random/trash/garbage, +/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/east, /turf/open/floor/plating, /area/station/maintenance/port/aft) "jmv" = ( @@ -32327,23 +34397,41 @@ /obj/machinery/light/directional/west, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"jmD" = ( -/obj/effect/turf_decal/stripes/line{ +"jmG" = ( +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L3" + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) +"jmK" = ( +/obj/machinery/power/emitter{ dir = 4 }, -/obj/structure/broken_flooring/side/directional/north, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) +"jmL" = ( +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/white/line, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "jmQ" = ( /obj/effect/spawner/random/trash/grime, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"jmT" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "jmY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32351,7 +34439,11 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/dark/textured_large, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/holopad, +/turf/open/floor/iron/white, /area/station/medical/medbay/central) "jmZ" = ( /obj/machinery/light/directional/south, @@ -32362,16 +34454,11 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "jni" = ( -/obj/structure/cable, /obj/item/crowbar, /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/autoname/directional/south, /turf/open/floor/plating, /area/station/maintenance/central) -"jnk" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "jno" = ( /obj/structure/table, /obj/machinery/button/door{ @@ -32400,16 +34487,11 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/rd) -"jnq" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/openspace, -/area/station/engineering/break_room) "jnC" = ( -/turf/open/floor/carpet, +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) "jnK" = ( /obj/effect/turf_decal/trimline/green/filled/line, @@ -32422,24 +34504,44 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green/telecomms/mainframe, /area/station/tcommsat/server) -"jnQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +"jnR" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) +"jnU" = ( +/obj/structure/lattice/catwalk, +/obj/effect/spawner/random/maintenance/two, +/obj/structure/rack, +/turf/open/openspace, +/area/station/maintenance/starboard/aft/upper) "jof" = ( /obj/structure/closet/crate/coffin, /obj/effect/decal/cleanable/dirt, /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"joA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/lattice/catwalk, +/obj/item/trash/tray, +/obj/structure/railing, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/starboard/fore) "joC" = ( +/obj/item/wheelchair{ + pixel_y = -3 + }, +/obj/item/wheelchair, +/obj/item/wheelchair{ + pixel_y = 3 + }, +/obj/structure/rack, /obj/structure/railing{ dir = 8 }, -/obj/structure/chair/office/light, -/obj/effect/landmark/start/paramedic, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/medbay/central) "joE" = ( @@ -32451,15 +34553,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/lounge) -"joI" = ( -/obj/machinery/power/emitter{ - dir = 4 - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/engineering/break_room) "jpa" = ( /obj/machinery/vatgrower{ dir = 4 @@ -32468,12 +34561,7 @@ /area/station/science/cytology) "jph" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/nuke_storage) -"jpj" = ( -/obj/item/statuebust, -/obj/machinery/light/cold/no_nightlight/directional/east, -/turf/open/floor/iron/vaporwave, -/area/station/maintenance/starboard/lesser) +/area/station/command/vault) "jpp" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32484,11 +34572,23 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"jpq" = ( +/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/station/maintenance/starboard) "jps" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/bridge) +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 1 + }, +/obj/item/cigarette/cigar{ + pixel_x = 3; + pixel_y = 6 + }, +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room/council) "jpt" = ( /obj/structure/railing{ dir = 1 @@ -32496,13 +34596,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/command/corporate_showroom) -"jpw" = ( -/obj/machinery/door/poddoor{ - id = "securestoragecw"; - name = "Secure Storage" - }, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/break_room) "jpx" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -32536,7 +34629,11 @@ /obj/structure/table/reinforced, /obj/item/mmi, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"jpZ" = ( +/obj/structure/lattice, +/turf/open/openspace, +/area/station/maintenance/aft/upper) "jqd" = ( /obj/machinery/door/airlock/public/glass{ name = "Prison Community Center" @@ -32544,13 +34641,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) -"jqo" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 9 - }, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) "jqp" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -32559,37 +34649,54 @@ /obj/effect/spawner/random/maintenance, /turf/open/openspace, /area/station/construction/storage_wing) -"jqv" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction/flip{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "jqw" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ dir = 10 }, /turf/open/space/openspace, /area/space/nearstation) +"jqz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/weldingtool, +/obj/item/wrench, +/obj/item/clothing/head/utility/welding, +/obj/structure/table/reinforced, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "jqB" = ( /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) -"jqG" = ( -/obj/effect/turf_decal/siding{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "jqO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/vatgrower, /turf/open/floor/engine, /area/station/service/hydroponics) +"jqP" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"jqQ" = ( +/obj/structure/lattice, +/obj/item/toy/figure/ninja{ + name = "Space Ninja"; + desc = "How did he get there??"; + pixel_x = -8; + pixel_y = 7 + }, +/turf/open/space/openspace, +/area/space/nearstation) "jqR" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -32608,47 +34715,13 @@ }, /turf/open/floor/iron/textured, /area/station/security/brig) -"jrb" = ( -/obj/structure/table, -/obj/item/pen/blue, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"jrf" = ( -/obj/structure/table, -/obj/item/clothing/glasses/hud/health{ - pixel_x = -3 - }, -/obj/item/clothing/glasses/hud/health{ - pixel_x = 4; - pixel_y = 8 - }, -/obj/item/clothing/glasses/hud/health{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/clothing/glasses/hud/health{ - pixel_x = 3; - pixel_y = 2 +"jrc" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 }, -/obj/effect/turf_decal/tile/blue/full, -/obj/machinery/airalarm/directional/south, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) -"jrp" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/table, -/obj/item/stack/cable_coil/five, -/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/iron/dark, -/area/station/commons/dorms) -"jrq" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/atmos/upper) +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/engineering/lobby) "jrt" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/trimline/purple/filled/line, @@ -32659,25 +34732,33 @@ /turf/open/floor/iron/dark, /area/station/science/xenobiology) "jrv" = ( -/obj/structure/closet/crate/freezer, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/obj/item/food/pizza/mothic_garlic, /obj/machinery/light/cold/dim/directional/west, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) -"jrx" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 +/obj/structure/showcase/machinery/oldpod{ + desc = "An old NT branded sleeper, decommissioned after the lead acetate incident. None of the functional machinery remains inside."; + dir = 4; + name = "decommissioned sleeper" }, -/turf/open/floor/iron, -/area/station/engineering/lobby) +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "jrz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/large, +/obj/machinery/light/directional/south, +/obj/structure/lattice/catwalk, +/turf/open/openspace, /area/station/hallway/primary/central) +"jrC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/boritos, +/turf/open/floor/iron, +/area/station/maintenance/starboard) +"jrD" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/light/directional/east, +/turf/open/openspace, +/area/station/hallway/primary/aft) "jrK" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -32685,6 +34766,18 @@ }, /turf/open/floor/iron, /area/station/construction/storage_wing) +"jrS" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 10 + }, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/siding/red{ + dir = 5 + }, +/turf/open/floor/iron/textured_corner{ + dir = 8 + }, +/area/station/command/gateway) "jrT" = ( /obj/structure/railing/corner/end{ dir = 8 @@ -32694,35 +34787,40 @@ dir = 4 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"jrV" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) +/area/station/ai/satellite/interior) +"jrY" = ( +/obj/machinery/meter{ + name = "Plasma meter" + }, +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "Plasma Multideck Adapter"; + dir = 2 + }, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/effect/turf_decal/box/white, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "jsh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"jsy" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 }, -/turf/open/floor/carpet, -/area/station/command/meeting_room/council) -"jsj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/ai/upload/chamber) +"jsG" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/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/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/light/small/directional/north, /turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"jsD" = ( -/obj/structure/lattice/catwalk, -/obj/structure/table, -/obj/item/stack/rods{ - pixel_y = 3 - }, -/obj/structure/sign/poster/contraband/lizard/directional/south, -/turf/open/openspace, -/area/station/maintenance/starboard/fore) +/area/station/engineering/storage_shared) "jsK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32737,16 +34835,21 @@ /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) "jtm" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical{ - name = "Abandoned Room" + name = "Medical Break Room" }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) +/turf/open/floor/iron/textured_large, +/area/station/medical/break_room) +"jty" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "jtE" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -32776,32 +34879,20 @@ pixel_x = -6; pixel_y = 5 }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"jua" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/warning{ +/obj/effect/turf_decal/stripes{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, +/turf/open/floor/iron/textured, +/area/station/command/eva) +"jua" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark/textured, /area/station/cargo/sorting) -"juc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) -"juh" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +"jug" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "jui" = ( /obj/structure/table, /obj/item/kitchen/rollingpin{ @@ -32831,19 +34922,6 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"juo" = ( -/obj/effect/turf_decal/siding{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) "jup" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -32867,15 +34945,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/tcommsat/server) -"juz" = ( -/obj/machinery/mecha_part_fabricator/maint{ - name = "forgotten exosuit fabricator"; - drop_direction = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/oil, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "juE" = ( /obj/effect/spawner/random/clothing/funny_hats, /obj/effect/spawner/random/clothing/wardrobe_closet, @@ -32883,11 +34952,9 @@ /area/station/maintenance/port) "juH" = ( /obj/effect/turf_decal/plaque{ - icon_state = "L13" - }, -/obj/effect/turf_decal/siding/green{ - dir = 1 + icon_state = "L14" }, +/obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "juP" = ( @@ -32921,16 +34988,6 @@ }, /turf/open/space/openspace, /area/space/nearstation) -"jvf" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/structure/frame/computer{ - anchored = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) "jvl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32945,42 +35002,15 @@ /area/station/hallway/secondary/construction) "jvB" = ( /turf/open/floor/iron/dark, -/area/station/command/bridge) -"jvL" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Ordnance Gas Storage Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, +/area/station/command/meeting_room/council) +"jvK" = ( +/obj/structure/table/reinforced, /turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"jvM" = ( -/obj/structure/chair{ - dir = 1; - pixel_y = -2 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/glass, -/area/station/commons/fitness/recreation) +/area/station/maintenance/starboard/upper) "jvU" = ( /obj/machinery/flasher/portable, /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) -"jvX" = ( -/obj/effect/turf_decal/siding{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) -"jvZ" = ( -/obj/structure/ladder, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/iron/smooth, -/area/station/engineering/main) "jwa" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/central) @@ -33008,13 +35038,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) -"jwu" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) "jwB" = ( /obj/machinery/airlock_sensor/incinerator_ordmix{ pixel_x = -24 @@ -33030,29 +35053,47 @@ }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) +"jwC" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "jwI" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/siding/blue, -/obj/effect/turf_decal/siding/blue{ - dir = 1 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/arrows{ +/obj/machinery/requests_console/auto_name/directional/north, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/mapping_helpers/requests_console/information, +/turf/open/floor/carpet/royalblue, +/area/station/command/heads_quarters/captain/private) +"jwO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/color_adapter, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "jxa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/engine/hull/air, -/area/station/medical/chemistry) +/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/carpet/cyan, +/area/station/command/heads_quarters/cmo) "jxc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/obj/machinery/conveyor{ + dir = 4; + id = "cargounload" + }, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/storage) "jxg" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -33060,44 +35101,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"jxj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "jxk" = ( -/obj/structure/cable, -/obj/machinery/computer/security/telescreen/normal/directional/north{ - name = "Security Cameras Monitor" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/station/command/bridge) -"jxl" = ( -/obj/item/kirbyplants/random/dead{ - name = "dead plant" - }, -/obj/item/cigbutt, -/obj/machinery/button/door/directional/west{ - id = "Cabin7"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 24; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) -"jxo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +/obj/structure/chair/comfy/black{ dir = 8 }, -/turf/open/floor/iron/white, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room/council) "jxt" = ( /obj/structure/ladder, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -33105,16 +35114,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"jxx" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 4 - }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) "jxB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, @@ -33139,6 +35138,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"jxQ" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/engine, +/area/station/engineering/atmos) "jxU" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -33154,25 +35157,18 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) -"jxW" = ( -/obj/machinery/computer/mech_bay_power_console, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/cigbutt{ - pixel_x = -12; - pixel_y = 2 +"jya" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/engineering/atmos/upper) "jyd" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) +/obj/machinery/status_display/ai/directional/south, +/turf/open/openspace, +/area/station/command/heads_quarters/hop) "jyl" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/railing, @@ -33205,24 +35201,17 @@ /turf/open/floor/iron/dark/textured_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "jyA" = ( /obj/structure/table, /obj/effect/spawner/random/maintenance, /turf/open/floor/carpet, /area/station/maintenance/starboard/aft) -"jyD" = ( -/obj/structure/table, -/obj/item/tape{ - pixel_x = -4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "jyI" = ( /obj/structure/chair/sofa/corp, /obj/machinery/light_switch/directional/north, /turf/open/floor/carpet/executive, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "jyK" = ( /obj/structure/railing, /obj/effect/turf_decal/siding/brown, @@ -33235,42 +35224,38 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"jyL" = ( -/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/starboard/aft) "jyM" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/light/warm/dim/directional/north, -/obj/structure/cable, -/turf/open/openspace, -/area/station/hallway/primary/central) +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/structure/chair/office/light{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "jyP" = ( -/obj/structure/lattice/catwalk, -/obj/item/stack/cable_coil/thirty, -/turf/open/space/basic, -/area/space/nearstation) -"jyW" = ( -/obj/structure/table, -/obj/item/shard{ - pixel_x = 9 +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 }, -/obj/item/clothing/glasses/regular{ - pixel_x = -10; - pixel_y = 6 +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"jzk" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/computer/telecomms/server{ + dir = 8; + network = "tcommsat" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"jzo" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 }, -/obj/structure/sign/poster/official/corporate_perks_vacation/directional/south, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/fore) -"jyX" = ( /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/commons/dorms) +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "jzx" = ( /obj/machinery/vending/wardrobe/law_wardrobe, /obj/machinery/firealarm/directional/east, @@ -33285,12 +35270,17 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"jzD" = ( +/obj/structure/closet/emcloset, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "jzH" = ( -/obj/machinery/door/poddoor/massdriver_trash, /obj/machinery/atmos_shield_gen/active{ dir = 1 }, /obj/machinery/atmos_shield_gen/active, +/obj/machinery/door/poddoor/massdriver_trash, /turf/open/floor/plating, /area/station/maintenance/disposal) "jzM" = ( @@ -33317,37 +35307,22 @@ /obj/structure/railing, /turf/open/openspace, /area/station/maintenance/port/aft) -"jzY" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/door/airlock/medical/glass{ - name = "Break Room" - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - 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/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white, -/area/station/medical/break_room) "jAc" = ( /obj/structure/lattice/catwalk, /turf/open/floor/engine/hull/air, /area/station/construction/storage_wing) -"jAd" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ +"jAg" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 }, -/turf/open/openspace, -/area/station/engineering/break_room) +/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/textured_large, +/area/station/medical/virology) "jAh" = ( /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /obj/machinery/door/airlock{ @@ -33365,6 +35340,15 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) +"jAx" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/aft) "jAy" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -33386,13 +35370,13 @@ /turf/open/floor/iron/dark/textured_half, /area/station/science/ordnance) "jAO" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 +/obj/machinery/brm, +/obj/structure/railing{ + dir = 10 }, -/obj/structure/chair/sofa/right/brown, -/obj/item/clothing/head/soft{ - pixel_x = 2; - pixel_y = -2 +/obj/machinery/conveyor{ + dir = 4; + id = "mining" }, /turf/open/floor/iron/textured, /area/station/cargo/storage) @@ -33409,23 +35393,25 @@ }, /turf/open/floor/iron/edge, /area/station/hallway/primary/fore) -"jBb" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "jBd" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"jBh" = ( -/obj/structure/sign/poster/random/directional/west, -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +"jBf" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "jBk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33435,54 +35421,64 @@ "jBn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/holopad, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"jBs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/effect/turf_decal/siding/blue{ - dir = 4 +"jBr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/stack{ + dir = 8 }, -/obj/machinery/light/small/directional/north, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/science/server) +/obj/structure/filingcabinet, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/floor/wood, +/area/station/maintenance/aft) "jBt" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/engine/hull/air, -/area/station/command/meeting_room/council) -"jBx" = ( -/obj/structure/table/glass, -/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, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, /turf/open/floor/iron/dark, -/area/station/commons/vacant_room/office) -"jBB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/area/station/command/bridge) "jBI" = ( /obj/structure/cable, /obj/structure/table, /obj/item/clothing/mask/gas, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"jBK" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/railing/corner, -/obj/structure/disposalpipe/segment{ - dir = 5 +"jBJ" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/structure/closet/emcloset, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/bot, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) +"jBS" = ( +/obj/structure/chair/office{ + dir = 8 }, -/obj/structure/flora/tree/jungle, -/turf/open/floor/grass, -/area/station/hallway/primary/starboard) +/obj/effect/landmark/start/hangover, +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "jBU" = ( /obj/item/reagent_containers/cup/glass/mug/tea, /obj/structure/table/wood, /turf/open/floor/carpet/orange, /area/station/commons/lounge) +"jBV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/storage/tech) "jBW" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -33490,9 +35486,28 @@ /area/station/maintenance/solars/port/aft) "jBX" = ( /obj/effect/turf_decal/trimline/brown/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/firealarm/directional/west, +/obj/structure/table, +/obj/item/clothing/head/soft{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/item/hand_labeler{ + pixel_y = 11 + }, +/obj/item/folder/yellow{ + pixel_x = 3; + pixel_y = 1 + }, +/obj/item/stamp/granted, +/obj/item/stamp/denied{ + pixel_x = 7; + pixel_y = 8 + }, +/obj/item/hand_labeler_refill{ + pixel_x = -8; + pixel_y = 3 + }, /turf/open/floor/iron, /area/station/cargo/storage) "jBY" = ( @@ -33502,34 +35517,13 @@ }, /turf/open/openspace, /area/station/command/gateway) -"jCk" = ( -/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/engineering/storage/tech) "jCt" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 8 }, -/turf/open/floor/wood, +/turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) -"jCv" = ( -/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/engineering/general, -/obj/machinery/door/airlock/engineering{ - name = "Engine Room" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "jCz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33557,14 +35551,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/port) -"jCJ" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/external, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "jCK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -33583,17 +35569,34 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"jCP" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "jCQ" = ( -/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."; - dir = 8; - name = "decommissioned sleeper" +/obj/structure/chair/sofa/corp/right, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/carpet/blue, +/area/station/medical/break_room) +"jCS" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 }, -/obj/effect/decal/cleanable/greenglow, -/obj/item/surgicaldrill, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/smooth_large, +/area/station/engineering/storage/tech) +"jCV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/reagent_containers/cup/beaker, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard) "jCW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33622,17 +35625,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) -"jDi" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "jDj" = ( /obj/effect/turf_decal/trimline/yellow/corner{ dir = 8 @@ -33646,13 +35638,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/robotics/lab) -"jDl" = ( -/obj/item/radio/intercom/directional/north, -/obj/structure/closet/radiation, -/obj/item/clothing/glasses/meson, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark/smooth_corner, -/area/station/engineering/main) +"jDm" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos) "jDn" = ( /obj/structure/chair/stool/bar/directional/north, /obj/effect/turf_decal/siding/wood, @@ -33662,33 +35652,23 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood/large, /area/station/commons/lounge) -"jDq" = ( -/obj/structure/lattice/catwalk, -/obj/structure/disposalpipe/trunk/multiz/down{ +"jDx" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/station/medical/morgue) +"jDB" = ( +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/glass/reinforced, +/area/station/command/bridge) +"jDD" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) -"jDr" = ( -/obj/item/radio/intercom/directional/north, -/obj/effect/spawner/random/clothing/wardrobe_closet_colored, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) -"jDx" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +/obj/structure/chair/sofa/bench/solo{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"jDy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) -"jDD" = ( -/obj/structure/curtain, -/obj/machinery/shower/directional/south, -/turf/open/floor/iron/dark/textured_large, +/turf/open/floor/iron/dark, /area/station/medical/medbay/central) "jDL" = ( /obj/effect/turf_decal/siding/dark{ @@ -33699,7 +35679,7 @@ /turf/open/floor/iron/dark/textured_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "jDO" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -33728,28 +35708,42 @@ /obj/structure/sign/poster/contraband/tools/directional/north, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"jDY" = ( -/obj/effect/turf_decal/tile/dark_green/opposingcorners, -/obj/effect/turf_decal/tile/green/opposingcorners{ - dir = 1 - }, -/obj/item/stack/sheet/cotton{ - pixel_x = -5; - pixel_y = 15 - }, -/obj/effect/decal/cleanable/generic, -/obj/structure/closet/firecloset, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) "jEc" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"jEd" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper{ + dir = 4 + }, +/obj/structure/fluff/paper/stack{ + dir = 5 + }, +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/item/camera_film, +/turf/open/floor/wood, +/area/station/maintenance/aft) +"jEg" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 10 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "jEm" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) +"jEo" = ( +/obj/machinery/computer/atmos_alert/station_only{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/circuit, +/area/station/command/bridge) "jEr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33769,41 +35763,24 @@ /obj/effect/turf_decal/tile/dark/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) -"jEx" = ( -/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, -/area/station/engineering/supermatter/room) -"jEz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4; - external_pressure_bound = 140; - name = "killroom vent"; - pressure_checks = 0 - }, -/turf/open/floor/circuit/telecomms, -/area/station/science/xenobiology) "jEG" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/machinery/holopad, /obj/machinery/navbeacon{ codes_txt = "delivery;dir=2"; location = "Medical" }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"jEV" = ( -/obj/structure/table, -/obj/item/folder/yellow{ - pixel_x = 4 +/obj/structure/disposalpipe/segment{ + dir = 6 }, -/obj/item/pen, -/obj/item/airlock_painter, /turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/area/station/medical/medbay/lobby) +"jEM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "jFj" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 4 @@ -33827,28 +35804,34 @@ /area/station/security/courtroom) "jFp" = ( /obj/structure/table/wood, -/obj/item/stamp/head/captain{ - pixel_x = 7; - pixel_y = 14 - }, -/obj/item/storage/briefcase/secure{ - pixel_x = -2; - pixel_y = 4 - }, /obj/item/storage/lockbox/medal{ pixel_y = 2 }, -/turf/open/floor/carpet, +/obj/item/pen/fountain/captain{ + pixel_y = 6 + }, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) +"jFr" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 2; + name = "Plasma to Mix" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "jFG" = ( -/obj/structure/closet/crate/freezer/blood, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/obj/item/reagent_containers/blood/random, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/structure/showcase/machinery/oldpod{ + desc = "An old NT branded sleeper, decommissioned after the lead acetate incident. None of the functional machinery remains inside."; + dir = 4; + name = "decommissioned sleeper" + }, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "jFH" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, @@ -33869,33 +35852,33 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) "jFV" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/trimline/yellow/warning, +/obj/effect/turf_decal/trimline/yellow/warning{ dir = 1 }, -/obj/machinery/door/poddoor/shutters{ +/obj/machinery/door/poddoor/shutters/window{ + dir = 1; id = "evashutter"; name = "E.V.A. Storage Shutter" }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "jGh" = ( -/obj/machinery/computer/records/security, -/obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, +/obj/structure/table/reinforced, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) "jGl" = ( /obj/effect/spawner/random/structure/table_or_rack, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"jGm" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/atmos/upper) +"jGn" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/aft) "jGq" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -33908,7 +35891,7 @@ /obj/effect/spawner/random/structure/crate, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "jGw" = ( /obj/structure/railing{ dir = 9 @@ -33931,6 +35914,9 @@ }, /turf/open/floor/carpet, /area/station/security/courtroom) +"jGG" = ( +/turf/closed/wall/r_wall, +/area/station/maintenance/starboard/fore/upper) "jGK" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 4 @@ -33941,18 +35927,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"jGQ" = ( -/obj/effect/turf_decal/siding/brown/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/brown/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/brown/corner{ - dir = 1 - }, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) "jGT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -33963,12 +35937,34 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) +"jHb" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft) +"jHc" = ( +/obj/effect/spawner/random/maintenance/two, +/obj/structure/rack{ + pixel_y = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "jHj" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 8 }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"jHk" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "jHq" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/closet_maintenance, @@ -33988,43 +35984,44 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) -"jHD" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/item/pen{ - pixel_x = -17; +"jHH" = ( +/obj/structure/table, +/obj/item/rcl/pre_loaded{ pixel_y = 7 }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) -"jHL" = ( -/obj/machinery/vatgrower, -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) +/obj/item/stack/pipe_cleaner_coil/random, +/obj/item/stack/pipe_cleaner_coil/random, +/obj/item/stack/pipe_cleaner_coil/random, +/obj/item/stack/pipe_cleaner_coil/random, +/obj/item/stack/pipe_cleaner_coil/random, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/green/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/commons/storage/art) "jHV" = ( /turf/open/floor/iron/stairs/medium{ dir = 1 }, /area/station/service/chapel) "jIf" = ( -/obj/effect/spawner/structure/window/reinforced, +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay-office"; + name = "Medbay Shutters"; + dir = 4 + }, /turf/open/floor/plating, /area/station/medical/cryo) -"jIj" = ( -/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/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) -"jIs" = ( -/obj/structure/table/glass, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +"jIl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "jIx" = ( /obj/machinery/door/airlock/hatch{ name = "MiniSat Antechamber" @@ -34034,16 +36031,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"jIF" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/area/station/ai/satellite/foyer) "jII" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -34054,12 +36042,13 @@ /turf/open/floor/plating, /area/station/command/heads_quarters/hos) "jIJ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/openspace, -/area/station/medical/storage) +/obj/structure/sign/clock/directional/south, +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/item/toy/plush/horse, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/glass, +/area/station/medical/patients_rooms/room_a) "jIX" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -34069,11 +36058,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"jIZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/toy/basketball, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "jJd" = ( /obj/effect/spawner/random/structure/chair_maintenance, /turf/open/floor/plating, @@ -34085,13 +36069,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"jJm" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) "jJC" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -34109,14 +36086,15 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) +"jJE" = ( +/obj/structure/lattice/catwalk, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/port/fore) "jJH" = ( -/obj/structure/chair/comfy/carp{ - dir = 1; - name = "Captain's Chair" - }, /obj/machinery/light/floor, -/turf/open/floor/carpet, -/area/station/command/bridge) +/obj/structure/chair/comfy/black, +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room/council) "jJP" = ( /obj/machinery/vending/coffee, /obj/item/radio/intercom/directional/east, @@ -34129,6 +36107,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"jJU" = ( +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "jJX" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -34138,7 +36119,7 @@ dir = 8 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "jJZ" = ( /obj/effect/decal/cleanable/glitter{ color = "ff8080" @@ -34151,58 +36132,35 @@ /turf/open/floor/engine/hull/air, /area/station/maintenance/port) "jKo" = ( -/obj/structure/table/wood, -/obj/item/lighter{ - pixel_x = 7; - pixel_y = -11 - }, -/obj/item/cigarette/cigar{ - pixel_x = 3; - pixel_y = 6 - }, -/obj/item/reagent_containers/cup/glass/coffee{ - pixel_x = -8; - pixel_y = -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/carpet, -/area/station/command/meeting_room/council) +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "jKp" = ( -/turf/open/openspace, -/area/station/medical/storage) +/turf/closed/wall, +/area/station/medical/patients_rooms/room_a) "jKF" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, /obj/machinery/door/poddoor/shutters{ id = "gateshutter"; name = "Gateway Access Shutter" }, -/turf/open/floor/iron, +/turf/open/floor/iron/dark/smooth_large, /area/station/command/gateway) -"jKT" = ( -/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/lattice/catwalk, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/light/directional/east, -/obj/machinery/door/window/right/directional/west{ - name = "First Aid Supplies"; - req_access = list("medical") - }, -/turf/open/openspace, -/area/station/medical/storage) +"jKL" = ( +/obj/machinery/requests_console/directional/west, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/structure/chair/office, +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "jKX" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/cmo) @@ -34232,7 +36190,7 @@ dir = 4 }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "jLl" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/purple/filled/corner{ @@ -34255,22 +36213,15 @@ /obj/item/radio/intercom/directional/south, /turf/open/openspace, /area/station/security/checkpoint/science) -"jLt" = ( -/obj/structure/sign/poster/official/random/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/computer/security/telescreen/engine/directional/south{ - name = "Engine Camera Monitor" - }, -/obj/effect/turf_decal/trimline/red/filled/line, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/engineering) "jLu" = ( /obj/machinery/telecomms/processor/preset_three, /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"jLv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/upper) "jLw" = ( /obj/structure/reagent_dispensers/cooking_oil, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, @@ -34284,25 +36235,26 @@ }, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) -"jLH" = ( -/obj/machinery/button/door/directional/south{ - id = "ceprivacy"; - name = "Privacy Shutters Control"; - pixel_y = 8 - }, -/obj/machinery/button/door/directional/west{ - id = "transitlockdown"; - name = "Transit Tube Lockdown"; - pixel_x = 0; - pixel_y = -8 +"jLD" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/office) +"jLE" = ( +/obj/machinery/door/airlock/atmos/glass{ + name = "Atmospherics Testing Room" }, -/obj/machinery/button/door{ - id = "securestoragecw"; - name = "Secure Storage" +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plating, +/area/station/engineering/atmos/upper) +"jLS" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 }, -/obj/structure/table/reinforced, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "jLY" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -34311,20 +36263,49 @@ /area/station/service/kitchen) "jMi" = ( /obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge, /area/station/hallway/primary/central) "jMo" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/carpet, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "jMr" = ( /turf/closed/wall, /area/station/hallway/secondary/exit/departure_lounge) +"jMu" = ( +/obj/structure/sign/directions/evac/directional/east{ + dir = 1; + pixel_y = 5; + pixel_x = 0 + }, +/obj/structure/sign/directions/engineering/directional/east{ + pixel_y = -1; + pixel_x = 0 + }, +/obj/structure/sign/directions/supply/directional/east{ + pixel_y = -7; + pixel_x = 0 + }, +/turf/closed/wall, +/area/station/commons/toilet/restrooms) "jMy" = ( /obj/structure/lattice/catwalk, /obj/effect/landmark/start/hangover, /turf/open/openspace, /area/station/commons/vacant_room/office) +"jMC" = ( +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance, +/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/starboard/fore/upper) "jML" = ( /obj/effect/decal/cleanable/confetti, /turf/open/floor/plating, @@ -34334,7 +36315,6 @@ /obj/structure/table/reinforced, /obj/item/radio, /obj/machinery/camera/autoname/directional/north, -/obj/machinery/light_switch/directional/north, /turf/open/openspace, /area/station/security/checkpoint/customs) "jMU" = ( @@ -34342,6 +36322,29 @@ /obj/structure/cable, /turf/open/space/openspace, /area/space/nearstation) +"jNe" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/port) +"jNg" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/structure/table, +/obj/structure/microscope, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) +"jNh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "jNk" = ( /obj/structure/rack, /obj/item/storage/box/flashes{ @@ -34358,6 +36361,14 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"jNu" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/landmark/firealarm_sanity, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/toilet/restrooms) "jNC" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -34367,6 +36378,13 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/security/mechbay) +"jNG" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 9 + }, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "jNL" = ( /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/trimline/dark/arrow_ccw{ @@ -34379,14 +36397,20 @@ dir = 4 }, /area/station/hallway/secondary/exit/departure_lounge) -"jNT" = ( -/obj/structure/rack, -/obj/item/circuitboard/machine/oven{ - pixel_y = -3 +"jNW" = ( +/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/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "jOe" = ( /obj/structure/railing{ dir = 4 @@ -34401,40 +36425,72 @@ /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) "jOi" = ( -/obj/structure/sign/directions/engineering/directional/south{ - dir = 4; - pixel_y = -22 +/obj/structure/sign/directions/evac/directional/north{ + dir = 8; + pixel_y = 0 }, -/obj/structure/sign/directions/dorms/directional/south{ - dir = 4; - pixel_y = -28 +/obj/structure/sign/directions/medical/directional/north{ + dir = 8; + pixel_y = 10 }, -/obj/structure/sign/directions/security{ +/obj/structure/sign/directions/command{ dir = 8; - pixel_y = -40 + pixel_y = -10 }, -/obj/structure/sign/directions/supply{ - dir = 4; - pixel_y = -34 +/turf/closed/wall, +/area/station/commons/storage/primary) +"jOm" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/turf_decal/siding/yellow{ + dir = 5 }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) +/turf/open/floor/iron, +/area/station/engineering/atmos/upper) "jOE" = ( /turf/closed/wall, /area/station/service/lawoffice) +"jOG" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/spawner/random/clothing/backpack, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "jOH" = ( /turf/open/floor/iron/dark, /area/station/security/brig) -"jOT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/junction/flip, -/turf/open/floor/wood, +"jOJ" = ( +/obj/structure/curtain, +/obj/machinery/duct, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/fluff/shower_drain, +/turf/open/floor/iron/freezer, /area/station/commons/dorms) +"jOO" = ( +/turf/closed/wall/r_wall, +/area/station/commons/fitness/recreation) +"jOZ" = ( +/obj/machinery/light_switch/directional/north, +/obj/structure/closet/wardrobe/white, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "jPa" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/hallway/primary/starboard) +"jPe" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/obj/structure/closet/masks, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "jPh" = ( /obj/structure/broken_flooring/pile/directional/south, /turf/open/floor/plating, @@ -34456,6 +36512,14 @@ /obj/effect/spawner/random/maintenance/no_decals, /turf/open/space/basic, /area/space/nearstation) +"jPz" = ( +/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/starboard/upper) "jPC" = ( /obj/effect/turf_decal/siding/dark{ dir = 5 @@ -34473,6 +36537,18 @@ /obj/structure/chair/office, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) +"jPV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "jPW" = ( /obj/structure/flora/bush/ferny/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -34496,19 +36572,10 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/security/courtroom) -"jQu" = ( -/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/cafeteria, -/area/station/commons/locker) "jQw" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 4 - }, +/obj/structure/sign/poster/official/random/directional/east, /turf/open/openspace, -/area/station/hallway/primary/central) +/area/station/command/eva) "jQA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -34516,18 +36583,20 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/evidence) -"jQL" = ( -/obj/structure/railing/corner/end{ - dir = 8 +"jQH" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 5 }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"jQL" = ( /obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom/directional/east{ frequency = 1447; name = "ai intercom" }, -/obj/machinery/holopad/secure, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "jQO" = ( /turf/closed/wall, /area/station/science/ordnance/bomb) @@ -34535,16 +36604,19 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"jQQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "jRb" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/engine/co2, /area/station/engineering/atmos/upper) +"jRe" = ( +/obj/structure/sign/poster/random/directional/north, +/obj/machinery/conveyor{ + dir = 4; + id = "packageSort2" + }, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/sorting) "jRg" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 10 @@ -34554,23 +36626,17 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) -"jRB" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/transit_tube/station/dispenser/flipped{ - dir = 1 - }, +"jRq" = ( +/obj/machinery/duct, /obj/structure/cable, -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "jRH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/gateway) "jRL" = ( /obj/machinery/ai_slipper{ uses = 10 @@ -34579,12 +36645,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) -"jRZ" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/bureaucracy/paper, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) +/area/station/ai/satellite/chamber) +"jRQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/gravity_generator) "jSf" = ( /turf/closed/wall/r_wall, /area/station/engineering/main) @@ -34597,6 +36663,8 @@ /obj/machinery/mass_driver/trash{ dir = 4 }, +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/stripes/red/box, /turf/open/floor/plating, /area/station/maintenance/disposal) "jSA" = ( @@ -34615,6 +36683,13 @@ /obj/structure/window/reinforced/plasma/spawner/directional/north, /turf/open/space/basic, /area/space/nearstation) +"jSK" = ( +/obj/effect/turf_decal/siding/wood, +/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/tile, +/area/station/security/detectives_office/private_investigators_office) "jSO" = ( /obj/effect/turf_decal/arrows/white{ color = "#00AAFF"; @@ -34624,25 +36699,16 @@ /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) "jSV" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -4; - pixel_y = 17 - }, -/obj/item/folder/blue{ - pixel_x = -3; - pixel_y = -3 - }, -/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/meeting_room/council) -"jSW" = ( -/obj/machinery/vending/cigarette, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/station/maintenance/starboard/lesser) +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Command Desk"; + req_access = list("command") + }, +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "jSY" = ( /obj/effect/landmark/transport/transport_id{ specific_transport_id = "catwalk_sec" @@ -34668,24 +36734,19 @@ dir = 4 }, /area/station/service/chapel) -"jTt" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) -"jTx" = ( +"jTp" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) +"jTG" = ( +/obj/structure/lattice/catwalk, +/obj/structure/chair{ + dir = 1 }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) +/turf/open/openspace, +/area/station/maintenance/aft/upper) "jTO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -34720,12 +36781,6 @@ "jUe" = ( /turf/open/floor/engine/hull/air, /area/station/hallway/secondary/exit/departure_lounge) -"jUp" = ( -/obj/structure/table, -/obj/machinery/status_display/ai/directional/north, -/obj/item/analyzer, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "jUt" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/light/directional/south, @@ -34742,19 +36797,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/construction/storage_wing) -"jUI" = ( -/obj/item/clothing/head/cone{ - pixel_x = 8; - pixel_y = -6 - }, -/obj/effect/decal/cleanable/dirt, +"jUW" = ( +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"jUS" = ( -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/ferny/style_random, -/turf/open/floor/grass, -/area/station/maintenance/starboard/fore) +/area/station/maintenance/starboard/central/upper) "jUX" = ( /obj/effect/turf_decal/trimline/red/warning{ dir = 6 @@ -34778,17 +36824,11 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/openspace, /area/station/maintenance/hallway/abandoned_recreation) -"jVp" = ( -/obj/structure/table/wood/poker, -/obj/item/reagent_containers/cup/soda_cans/cola{ - pixel_x = -4; - pixel_y = 9 - }, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "jVs" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/very_dim/directional/north, +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/disposal) "jVu" = ( @@ -34801,6 +36841,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"jVv" = ( +/obj/machinery/vatgrower, +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) "jVB" = ( /turf/closed/wall/r_wall, /area/station/engineering/gravity_generator) @@ -34811,6 +36857,21 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/lounge) +"jVN" = ( +/obj/machinery/door/airlock/atmos/glass{ + name = "Atmospherics" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmosuppersm" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/office) "jVP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -34821,6 +36882,9 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) +"jVX" = ( +/turf/open/floor/engine/hull/air, +/area/station/maintenance/department/crew_quarters/dorms) "jVY" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large, @@ -34881,34 +36945,20 @@ /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) "jWF" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/item/circular_saw, -/obj/item/circular_saw{ - pixel_y = 4 - }, -/obj/item/scalpel{ - pixel_y = 16 - }, -/obj/item/scalpel{ - pixel_y = 12 +/obj/effect/landmark/start/medical_doctor, +/obj/effect/turf_decal/trimline/blue/warning{ + dir = 1 }, -/turf/open/floor/iron/white/textured_large, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/surgery) -"jWJ" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) "jWP" = ( -/obj/machinery/light/floor, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) +/obj/machinery/computer/records/security{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "jWT" = ( /obj/structure/railing/corner{ dir = 8 @@ -34916,7 +36966,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/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "jXe" = ( /obj/structure/table/wood, @@ -34944,11 +36994,9 @@ /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) "jXm" = ( -/obj/structure/ladder, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/delivery, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/qm) +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/station/cargo/storage) "jXC" = ( /obj/structure/table, /obj/item/instrument/eguitar{ @@ -34958,6 +37006,20 @@ /obj/machinery/light/directional/south, /turf/open/floor/wood/large, /area/station/service/theater_dressing) +"jXR" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"jXS" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/holopad, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "jXX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -34974,6 +37036,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/light_switch/directional/north, /turf/open/floor/iron/textured, /area/station/cargo/warehouse) "jYb" = ( @@ -35012,61 +37075,59 @@ /area/station/hallway/secondary/construction) "jYs" = ( /obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/photocopier/prebuilt, -/turf/open/floor/iron, -/area/station/cargo/storage) -"jYE" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/obj/item/storage/toolbox/fishing, -/obj/item/storage/box/lights/mixed{ - pixel_x = -8; - pixel_y = 1 +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 6; + pixel_y = 9 }, -/obj/structure/lattice/catwalk, -/turf/open/water, -/area/station/maintenance/port/fore) -"jYG" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Access" +/obj/item/paper_bin{ + pixel_x = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/any/command/minisat, -/obj/effect/mapping_helpers/airlock/access/any/command/general, -/obj/effect/mapping_helpers/airlock/access/any/command/general, -/obj/effect/landmark/navigate_destination/minisat_access_ai, -/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/engineering/transit_tube) +/obj/item/pen, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron, +/area/station/cargo/storage) "jYI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/full, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/medical/pharmacy, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - name = "Chemistry" +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/pharmacy) +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/station/command/gateway) "jYJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ +/obj/effect/turf_decal/siding/blue{ dir = 1 }, -/turf/open/floor/iron/white/textured, -/area/station/medical/surgery) +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "jYM" = ( /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_large, /area/station/maintenance/department/medical) +"jYR" = ( +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "N2 Multideck Adapter"; + dir = 2 + }, +/obj/machinery/meter{ + name = "N2 meter" + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/turf_decal/box/white, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "jYS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -35081,20 +37142,20 @@ /turf/open/floor/plating, /area/station/science/robotics) "jZl" = ( -/obj/machinery/suit_storage_unit/mining/eva, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/qm) +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "jZs" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"jZL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/dorms) +"jZQ" = ( +/obj/item/cigbutt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "jZR" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -35113,6 +37174,10 @@ }, /turf/open/openspace, /area/station/hallway/primary/starboard) +"kaj" = ( +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "kak" = ( /obj/effect/turf_decal/siding/purple/corner{ dir = 4 @@ -35122,24 +37187,62 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) +"kaq" = ( +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/commons/dorms) +"kas" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/turf/open/openspace, +/area/station/maintenance/department/crew_quarters/dorms) +"kau" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "kax" = ( /turf/open/floor/iron/white/smooth_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"kaM" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"kaN" = ( +/area/station/ai/satellite/foyer) +"kay" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/engine, +/area/station/engineering/atmos) +"kaF" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/disposalpipe/junction{ + dir = 2 + }, +/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/crayon{ - icon_state = "nay"; - pixel_y = 32 +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) +"kaI" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/floor/wood, +/area/station/maintenance/aft) +"kaW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1 }, +/obj/effect/mapping_helpers/mail_sorting/science/genetics, +/obj/effect/mapping_helpers/mail_sorting/science/rd_office, +/obj/effect/mapping_helpers/mail_sorting/science/xenobiology, +/obj/effect/mapping_helpers/mail_sorting/science/research, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard) "kbe" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner, @@ -35147,11 +37250,18 @@ /turf/open/openspace, /area/station/maintenance/port/aft) "kbf" = ( -/obj/effect/spawner/random/maintenance, /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/cargo/storage) +"kbh" = ( +/obj/structure/lattice/catwalk, +/obj/structure/sign/warning/radiation/rad_area/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "kbj" = ( /obj/structure/closet/emcloset, /obj/effect/decal/cleanable/dirt, @@ -35162,6 +37272,12 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, /area/station/tcommsat/server) +"kbo" = ( +/obj/item/binoculars, +/obj/item/toy/basketball, +/obj/structure/closet, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "kbr" = ( /obj/structure/table/reinforced, /obj/item/clothing/glasses/science, @@ -35177,40 +37293,35 @@ }, /turf/open/floor/iron/dark, /area/station/science/lobby) +"kbu" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/engineering/atmos/upper) "kbz" = ( /obj/machinery/airalarm/directional/west, /obj/structure/rack, /obj/effect/spawner/random/armory/shotgun, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "kbB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/full, /obj/effect/turf_decal/tile/dark/full, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/floor/broken, -/obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"kbQ" = ( -/obj/machinery/light/directional/east, -/obj/item/kirbyplants/random/fullysynthetic, -/obj/effect/turf_decal/stripes/line{ +"kbH" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 5 }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"kbR" = ( -/obj/machinery/newscaster/directional/south, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) -"kbS" = ( -/obj/structure/cable, -/obj/structure/closet/secure_closet/engineering_personal{ - anchored = 1 - }, /turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/area/station/engineering/atmos/upper) +"kbY" = ( +/obj/structure/table, +/obj/effect/spawner/random/trash/soap, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/aft/upper) "kci" = ( /obj/effect/turf_decal/siding/purple, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -35223,6 +37334,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"kct" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/green/visible, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "kcx" = ( /obj/structure/lattice/catwalk, /obj/structure/table, @@ -35232,11 +37347,15 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) -"kcA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/beerkeg, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) +"kcC" = ( +/obj/structure/railing/corner/end/flip, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) +"kcL" = ( +/obj/structure/bookcase/random, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "kcM" = ( /obj/structure/disposalpipe/trunk/multiz{ dir = 4 @@ -35247,12 +37366,30 @@ /obj/machinery/door/airlock/maintenance, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"kcY" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/machinery/power/energy_accumulator/grounding_rod/anchored, +/obj/machinery/atmospherics/pipe/smart/manifold/orange/visible{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter) +"kdk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/cryo) "kdl" = ( /turf/open/floor/wood, /area/station/service/chapel) @@ -35261,12 +37398,12 @@ /turf/open/floor/plating, /area/station/security/brig) "kdp" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, /obj/effect/turf_decal/tile/red/opposingcorners{ 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/security/checkpoint/supply) "kdq" = ( @@ -35286,26 +37423,12 @@ /turf/open/floor/iron/freezer, /area/station/commons/toilet/auxiliary) "kdt" = ( -/obj/structure/table, -/obj/item/clipboard{ - pixel_x = 1; - pixel_y = -2 - }, -/obj/machinery/camera/motion/directional/south{ - c_tag = "AI Upload Chamber - Lower"; - network = list("aiupload") - }, -/obj/machinery/airalarm/directional/south, -/obj/item/phone{ - pixel_x = 9; - pixel_y = 9 - }, -/obj/item/ai_module/toy_ai{ - pixel_x = -13; - pixel_y = 9 +/obj/machinery/porta_turret/ai{ + dir = 4 }, -/turf/open/floor/carpet, -/area/station/ai_monitored/turret_protected/ai_upload) +/obj/machinery/camera/autoname/motion/directional/south, +/turf/open/floor/circuit/red, +/area/station/ai/upload/chamber) "kdv" = ( /obj/structure/railing{ dir = 1 @@ -35318,22 +37441,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "kdC" = ( /obj/structure/fake_stairs/directional/east{ name = "stairs" }, /turf/open/floor/iron/dark, /area/station/science/cytology) -"kdE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sink/directional/west, -/obj/structure/mirror/broken/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"kdG" = ( -/turf/open/floor/wood, -/area/station/commons/dorms) "kdN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -35342,10 +37456,13 @@ /turf/open/floor/plating, /area/station/construction/storage_wing) "kdQ" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/landmark/start/quartermaster, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/qm) +/obj/effect/turf_decal/caution/stand_clear/red{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/station/cargo/storage) "kdR" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -35353,17 +37470,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/openspace, /area/station/hallway/primary/starboard) -"kdZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/obj/item/radio/intercom/directional/north, -/obj/machinery/light_switch/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/closet/firecloset, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) "keh" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark/textured_large, @@ -35387,9 +37493,19 @@ /obj/item/cigbutt, /turf/open/floor/iron/dark/textured_half, /area/station/cargo/bitrunning/den) +"kep" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/stripes/box, +/obj/structure/ladder, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "keq" = ( -/obj/effect/turf_decal/siding/white/corner, -/turf/open/floor/iron/dark/smooth_large, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) "kew" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, @@ -35408,19 +37524,6 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"keE" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/table, -/obj/item/reagent_containers/cup/soda_cans/random{ - pixel_x = -5; - pixel_y = -18 - }, -/obj/item/reagent_containers/cup/soda_cans/random{ - pixel_x = 5; - pixel_y = -16 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "keM" = ( /obj/structure/lattice/catwalk, /obj/item/wirecutters{ @@ -35433,11 +37536,6 @@ /obj/machinery/holopad, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"keY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) "keZ" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 8 @@ -35461,8 +37559,18 @@ pixel_y = 2 }, /obj/item/pen/fourcolor, -/turf/open/floor/wood, +/turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) +"kfo" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/spawner/random/clothing/backpack, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "kfs" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "chapel_shutters_space"; @@ -35479,6 +37587,12 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) +"kfI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos) "kfO" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/box/corners{ @@ -35491,73 +37605,77 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) -"kgf" = ( -/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/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "kgg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"kgi" = ( +"kgr" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/disposalpipe/segment{ - dir = 10 +/obj/machinery/door/airlock/public/glass{ + name = "Abandoned Hallway" }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) -"kgo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction) "kgE" = ( /obj/structure/ladder, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) +"kgM" = ( +/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/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron, +/area/station/commons/dorms) "khi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/carpet, /area/station/command/corporate_showroom) +"khk" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/sign/warning/directional/east, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "khm" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/glass, /area/station/maintenance/port) -"khn" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "kho" = ( /obj/structure/ladder, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) "khC" = ( -/obj/machinery/plumbing/receiver{ +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 }, -/obj/machinery/light/directional/east, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/wood, -/area/station/medical/medbay/central) +/obj/machinery/door/window/right/directional/north{ + name = "Anti Assistant Protection Door"; + req_access = list("medical") + }, +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/obj/machinery/camera/autoname/directional/south, +/obj/effect/turf_decal/tile/dark_green/diagonal_centre, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/cryo) "khE" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "khF" = ( /obj/machinery/door/firedoor, /turf/open/floor/engine/hull/air, @@ -35629,24 +37747,19 @@ }, /turf/open/floor/plating/airless, /area/station/maintenance/starboard/aft) -"kiA" = ( -/obj/structure/musician/piano, -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) -"kiE" = ( -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "kiS" = ( /obj/structure/lattice, /turf/open/openspace, /area/station/hallway/primary/aft) -"kiT" = ( -/obj/structure/cable, -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +"kiY" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/effect/spawner/random/entertainment/coin, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "kje" = ( /obj/structure/flora/bush/pale/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -35655,6 +37768,10 @@ /obj/structure/cable, /turf/open/floor/grass, /area/station/hallway/secondary/entry) +"kjg" = ( +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/gravity_generator) "kjh" = ( /obj/structure/table, /obj/item/restraints/handcuffs{ @@ -35663,6 +37780,27 @@ /obj/structure/sign/poster/ripped/directional/north, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"kjn" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/item/kirbyplants/photosynthetic{ + pixel_y = 5; + pixel_x = -7 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"kjq" = ( +/obj/structure/cable, +/obj/effect/turf_decal/weather/snow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/clothing/glasses/cold, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/medical/coldroom) +"kjr" = ( +/obj/structure/cable, +/turf/closed/wall, +/area/station/maintenance/starboard) "kjF" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/junction/yjunction{ @@ -35677,31 +37815,37 @@ dir = 4 }, /area/station/science/ordnance/storage) -"kjN" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "kka" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 8 +/obj/effect/turf_decal/tile/dark_green{ + dir = 1 }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) "kkd" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 }, -/obj/effect/turf_decal/tile/yellow{ +/obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) -"kkn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/urinal/directional/north, +"kki" = ( +/obj/item/pushbroom, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/upper) +"kkw" = ( +/obj/machinery/door/airlock/external, +/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/access/any/science/maintenance, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/aft) "kkC" = ( /obj/effect/turf_decal/trimline/red/corner{ dir = 4 @@ -35734,19 +37878,15 @@ /obj/machinery/computer/security/telescreen/rd/directional/east, /turf/open/floor/wood, /area/station/command/heads_quarters/rd) -"kkM" = ( -/obj/effect/turf_decal/siding, -/obj/effect/turf_decal/trimline/white/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, +"kkQ" = ( +/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 + dir = 9 }, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "kkT" = ( /obj/structure/railing/corner/end/flip{ dir = 4 @@ -35760,15 +37900,12 @@ /turf/closed/wall, /area/station/security/eva) "klc" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/trimline/blue/filled/shrink_cw, +/obj/effect/turf_decal/trimline/blue/filled/shrink_ccw{ + dir = 1 }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "kld" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -35797,6 +37934,12 @@ }, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"klh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "kll" = ( /obj/effect/turf_decal/siding/wood/end{ dir = 4 @@ -35806,19 +37949,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/large, /area/station/service/library) -"klp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"klx" = ( -/obj/structure/table, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/spawner/random/techstorage/rnd_secure_all, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "kly" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -35829,6 +37959,30 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/dark/textured, /area/station/construction/mining/aux_base) +"klA" = ( +/obj/machinery/button/door/directional/south{ + id = "ceprivacy"; + name = "Privacy Shutters Control"; + pixel_y = -2; + pixel_x = -7 + }, +/obj/machinery/button/door/directional/west{ + id = "transitlockdown"; + name = "Transit Tube Lockdown"; + pixel_x = 7; + pixel_y = -2 + }, +/obj/machinery/button/door{ + id = "securestoragecw"; + name = "Secure Storage"; + pixel_y = 8 + }, +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/siding/yellow/end{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "klB" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -35844,19 +37998,17 @@ /turf/open/floor/catwalk_floor, /area/station/engineering/engine_smes) "klI" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/paper_bin{ - pixel_x = -6; - pixel_y = 7 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/window/right/directional/west{ - name = "Medical Desk"; - req_access = list("medical") +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Staff Entrance" }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) "klJ" = ( @@ -35866,6 +38018,17 @@ }, /turf/open/floor/wood/large, /area/station/hallway/primary/central) +"klQ" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"klU" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/structure/closet/secure_closet/miner, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "kmh" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner/end/flip{ @@ -35873,11 +38036,25 @@ }, /turf/open/space/openspace, /area/space/nearstation) -"kmm" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/vending/coffee, -/turf/open/floor/iron, -/area/station/engineering/lobby) +"kml" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/effect/spawner/random/bedsheet{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/commons/dorms) +"kmv" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) +"kmz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) "kmD" = ( /obj/machinery/light_switch/directional/north, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -35904,7 +38081,7 @@ preset_destination_names = list("2"="AI Maintenance","3"="AI Stowed") }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "kmH" = ( /obj/effect/landmark/firealarm_sanity, /turf/open/openspace, @@ -35914,27 +38091,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/science/explab) -"kmL" = ( -/obj/item/clothing/head/soft/grey{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/plunger{ - pixel_x = 6; - pixel_y = 2 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"kmQ" = ( -/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/starboard/aft) "kmS" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 8 @@ -35945,15 +38101,29 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, /area/station/security/brig) -"kmY" = ( -/obj/structure/lattice/catwalk, -/obj/effect/spawner/random/maintenance, -/turf/open/space/basic, -/area/space/nearstation) +"kmT" = ( +/obj/effect/turf_decal/trimline/dark, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port to Incinerator"; + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "kmZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"knf" = ( +/obj/machinery/light/floor{ + color = "#66ccff" + }, +/obj/structure/tank_holder/extinguisher, +/obj/structure/cable, +/obj/machinery/light_switch/directional/west{ + pixel_x = -22 + }, +/turf/open/floor/iron/dark, +/area/station/medical/cryo) "knj" = ( /obj/structure/table/glass, /obj/item/stack/package_wrap{ @@ -35964,6 +38134,13 @@ }, /turf/open/floor/iron/dark, /area/station/science/lobby) +"knp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/lattice/catwalk, +/obj/machinery/duct, +/obj/structure/sign/departments/maint/directional/east, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/starboard/fore) "knq" = ( /obj/effect/turf_decal/tile/dark/half/contrasted{ dir = 1 @@ -35981,7 +38158,7 @@ dir = 4 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "kns" = ( /obj/effect/spawner/random/maintenance/two, /obj/structure/rack, @@ -36016,8 +38193,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/camera/autoname/directional/east, +/obj/machinery/light/directional/east, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) "knI" = ( @@ -36031,9 +38207,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"knN" = ( -/turf/open/floor/iron/dark, -/area/station/engineering/lobby) +"knT" = ( +/obj/machinery/light/directional/north, +/turf/open/openspace, +/area/station/service/kitchen) +"knW" = ( +/obj/structure/sign/warning/vacuum/external/directional/south, +/turf/open/floor/plating, +/area/station/engineering/transit_tube) "knY" = ( /obj/structure/flora/tree/jungle/small, /obj/structure/flora/bush/sparsegrass/style_random, @@ -36059,12 +38240,6 @@ /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"kou" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/science/explab) "kow" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -36075,22 +38250,28 @@ }, /turf/open/openspace, /area/station/commons/fitness/recreation) -"koC" = ( -/obj/structure/table, -/obj/item/flashlight/lamp{ - pixel_y = 10 +"kox" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 }, -/obj/item/folder/yellow{ - pixel_x = 4 +/obj/effect/turf_decal/siding/yellow{ + dir = 6 }, /turf/open/floor/iron, -/area/station/engineering/lobby) +/area/station/engineering/atmos/upper) "koE" = ( /obj/structure/railing/corner{ dir = 1 }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) +"koH" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/landmark/start/hangover, +/obj/machinery/duct, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "koM" = ( /obj/structure/table/wood/poker, /obj/machinery/light/directional/south, @@ -36120,17 +38301,10 @@ dir = 4 }, /area/station/cargo/bitrunning/den) -"koY" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/medical/storage) -"kpc" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, +"kpl" = ( +/obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, -/area/station/engineering/atmos/project) +/area/station/maintenance/starboard) "kpz" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -36151,11 +38325,21 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden/abandoned) -"kpJ" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/power/tracker, -/turf/open/space/basic, -/area/station/solars/port/aft) +"kpF" = ( +/obj/structure/railing, +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -12; + pixel_y = 7 + }, +/obj/item/camera_film{ + pixel_x = 3; + pixel_y = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/station/service/library/private) "kpS" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -36195,85 +38379,61 @@ /obj/effect/decal/cleanable/confetti, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"kqk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 +"kqh" = ( +/obj/structure/closet/boxinggloves, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 }, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) "kqm" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/openspace, -/area/station/medical/cryo) -"kqt" = ( -/obj/effect/turf_decal/siding/brown{ +/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{ dir = 1 }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/cmo) +"kqs" = ( /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/starboard/fore) +"kqu" = ( +/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, /turf/open/floor/iron, /area/station/commons/dorms) "kqv" = ( /turf/closed/wall/r_wall, /area/station/maintenance/port/aft) -"kqF" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) -"kqH" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 2 - }, -/obj/structure/railing, -/obj/structure/railing{ - dir = 5 - }, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "kqI" = ( /obj/machinery/photocopier, /turf/open/floor/glass, /area/station/security/brig) "kra" = ( -/obj/structure/lattice/catwalk, -/obj/structure/closet/l3closet, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, /obj/machinery/status_display/ai/directional/west, +/obj/structure/railing, /turf/open/openspace, -/area/station/medical/storage) -"krk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +/area/station/medical/medbay/central) +"krs" = ( +/obj/machinery/newscaster/directional/east, /obj/effect/turf_decal/stripes/line{ - dir = 8; - pixel_x = -2 - }, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/engineering/break_room) -"krK" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ dir = 4 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "krL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36283,6 +38443,11 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/brig) +"krM" = ( +/obj/effect/spawner/random/trash/mopbucket, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "krQ" = ( /obj/structure/table/wood, /obj/item/storage/fancy/candle_box{ @@ -36305,7 +38470,7 @@ }, /obj/structure/cable/multilayer/connected, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ksa" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36341,8 +38506,26 @@ "kso" = ( /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/cargo/storage) +"ksr" = ( +/obj/structure/railing/corner, +/obj/structure/table/wood, +/obj/item/camera{ + pixel_x = -3; + pixel_y = 8 + }, +/obj/item/tape, +/obj/item/pen/fourcolor{ + pixel_x = 8; + pixel_y = 7 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/station/service/library/private) "kst" = ( /obj/structure/railing, /obj/effect/turf_decal/siding/wood, @@ -36361,11 +38544,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/science/cytology) +"ksJ" = ( +/turf/closed/wall, +/area/station/maintenance/starboard/central/upper) "ksM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/disposal) "ksO" = ( @@ -36385,18 +38569,15 @@ /turf/open/space/openspace, /area/space/nearstation) "ksX" = ( -/obj/machinery/chem_mass_spec, /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 + dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 1 + dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ +/obj/structure/chair/office/light{ dir = 8 }, -/obj/machinery/digital_clock/directional/west, -/obj/machinery/light/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "ktd" = ( @@ -36413,15 +38594,6 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron, /area/station/science/breakroom) -"kth" = ( -/obj/structure/sign/warning/hot_temp/directional/east, -/obj/machinery/camera/directional/east, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 6 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/engineering/lobby) "kto" = ( /obj/machinery/door/airlock/security{ name = "Armory" @@ -36434,7 +38606,7 @@ name = "Armory" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "ktp" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -36450,29 +38622,20 @@ /obj/structure/marker_beacon/burgundy, /turf/open/space/basic, /area/space/nearstation) -"ktt" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/cable/multilayer/multiz, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "ktu" = ( /obj/item/restraints/legcuffs/beartrap/prearmed, /turf/open/floor/plating, /area/station/maintenance/department/medical) -"ktz" = ( -/obj/structure/table, -/obj/item/lipstick/purple{ - pixel_x = -2; - pixel_y = -2 +"ktD" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 5 }, -/obj/item/clothing/mask/animal/horsehead{ - pixel_x = 4; - pixel_y = 15 +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 }, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/aft) +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "ktF" = ( /obj/structure/lattice/catwalk, /obj/structure/ladder, @@ -36560,6 +38723,39 @@ }, /turf/open/floor/grass, /area/station/science/genetics) +"kuw" = ( +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"kux" = ( +/obj/machinery/duct, +/obj/structure/lattice/catwalk, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/starboard/fore) +"kuB" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/iron, +/area/station/maintenance/starboard) +"kuL" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/table, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) "kuS" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -36568,37 +38764,25 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/central) "kuT" = ( -/obj/structure/sign/directions/engineering/directional/east{ - pixel_y = -1 - }, -/obj/structure/sign/directions/supply/directional/east{ - pixel_y = -7 - }, -/obj/structure/sign/directions/evac/directional/east{ - dir = 1; - pixel_y = 5 +/obj/structure/sign/directions/command/directional/north{ + dir = 4; + pixel_y = 0 }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) +/turf/closed/wall, +/area/station/hallway/primary/port) +"kuV" = ( +/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/dark/textured_large, +/area/station/maintenance/port) "kuX" = ( /obj/structure/chair{ dir = 1 }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/interrogation) -"kvb" = ( -/obj/structure/railing/corner, -/obj/structure/railing, -/obj/structure/lattice/catwalk, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"kvl" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced/plasma, -/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/main) "kvm" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -36608,12 +38792,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"kvo" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/machinery/light/directional/north, -/turf/open/openspace, -/area/station/commons/dorms) "kvq" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -36657,6 +38835,7 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "kvN" = ( @@ -36667,6 +38846,20 @@ }, /turf/open/floor/plating/airless, /area/station/hallway/secondary/entry) +"kvV" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft) +"kwb" = ( +/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ + name = "Fuel Pump" + }, +/obj/effect/turf_decal/trimline/neutral, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "kwe" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -36677,12 +38870,17 @@ /turf/open/floor/iron/dark, /area/station/science/ordnance) "kwh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/turf_decal/trimline/blue/warning, +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue/opposingcorners{ +/obj/effect/turf_decal/trimline/blue/line{ dir = 1 }, -/turf/open/floor/iron/dark, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/smooth_half{ + dir = 4 + }, /area/station/medical/cryo) "kwm" = ( /obj/structure/stairs/north, @@ -36719,10 +38917,15 @@ /obj/machinery/rnd/production/circuit_imprinter/department/science, /turf/open/floor/iron/dark, /area/station/science/lobby) -"kwG" = ( -/obj/machinery/igniter/incinerator_atmos, -/turf/open/floor/engine/airless, -/area/station/maintenance/disposal/incinerator) +"kwE" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/firealarm/directional/east, +/obj/structure/table, +/obj/item/folder, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "kwO" = ( /obj/structure/sign/departments/aisat/directional/east, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -36740,12 +38943,33 @@ /turf/open/floor/iron/dark, /area/station/science/ordnance) "kwR" = ( -/obj/machinery/computer/crew{ - dir = 8 +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = -3 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/obj/item/storage/medkit/brute{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/brute, +/obj/item/storage/medkit/brute{ + pixel_x = -4; + pixel_y = -3 + }, +/obj/machinery/door/window/right/directional/west{ + name = "First Aid Supplies"; + req_access = list("medical") + }, +/obj/structure/table/reinforced/rglass, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) +"kwV" = ( +/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/plating, +/area/station/maintenance/starboard/fore/upper) "kwW" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ dir = 4 @@ -36761,7 +38985,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "kxc" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/cup/glass/coffee{ @@ -36777,6 +39001,14 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) +"kxd" = ( +/obj/item/biopsy_tool{ + pixel_x = -9; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine, +/area/station/maintenance/starboard) "kxf" = ( /obj/machinery/door/poddoor/shutters{ id = "qm_warehouse"; @@ -36806,12 +39038,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/lab) -"kxA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +"kxx" = ( +/obj/machinery/computer/cargo/request{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "kxE" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, @@ -36819,39 +39052,38 @@ "kxG" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) "kxL" = ( -/obj/item/emergency_bed, -/obj/item/emergency_bed{ - pixel_y = 3 - }, -/obj/item/emergency_bed{ - pixel_y = 3 +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" }, -/obj/item/emergency_bed{ - pixel_y = 6 +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/cryo) +"kxW" = ( +/obj/structure/lattice/catwalk, +/obj/structure/table/reinforced, +/obj/item/pai_card{ + pixel_x = 6; + pixel_y = 12 }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +/obj/effect/spawner/random/food_or_drink/donkpockets{ + pixel_y = -3; + pixel_x = -5 }, -/obj/structure/rack, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) +/turf/open/openspace, +/area/station/cargo/storage) "kxY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/west, +/obj/effect/spawner/random/trash/graffiti, /turf/open/floor/iron/sepia, /area/station/hallway/secondary/construction) -"kyg" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "kyi" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating/airless, @@ -36863,6 +39095,15 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/construction/mining/aux_base) +"kyp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6/directional/south, +/obj/machinery/duct, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "kyq" = ( /obj/structure/ladder, /obj/machinery/airalarm/directional/west, @@ -36879,8 +39120,26 @@ /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/effect/decal/cleanable/dirt, +/obj/item/cigbutt/cigarbutt, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) +"kyG" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/preopen{ + id = "cmoprivacy"; + name = "Privacy Shutter" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) +"kyH" = ( +/obj/structure/railing, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/station/medical/medbay/central) "kyJ" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -36901,12 +39160,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) -"kyZ" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/sign/warning/vacuum/external/directional/south, -/obj/structure/closet/emcloset, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) "kza" = ( /obj/machinery/vending/wardrobe/coroner_wardrobe, /obj/structure/extinguisher_cabinet/directional/north, @@ -36920,17 +39173,17 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "kzd" = ( /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/plating, /area/station/maintenance/port/greater) "kzf" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L6" +/obj/effect/turf_decal/siding/blue{ + dir = 1 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) +/turf/open/openspace, +/area/station/command/meeting_room/council) "kzg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, @@ -36943,6 +39196,16 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/science/lobby) +"kzy" = ( +/obj/item/trash/can{ + pixel_x = -8 + }, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/upper) +"kzB" = ( +/obj/structure/lattice, +/turf/open/openspace, +/area/station/hallway/primary/fore) "kzC" = ( /obj/structure/chair{ dir = 4; @@ -36954,12 +39217,6 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"kzG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/lattice/catwalk, -/obj/effect/spawner/random/structure/grille, -/turf/open/space/basic, -/area/space/nearstation) "kzL" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -36968,11 +39225,40 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/science/research) +"kzW" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/crayon{ + icon_state = "body"; + name = "body"; + pixel_x = 12; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "revolution"; + name = "graffiti"; + paint_colour = "#FF0000"; + pixel_y = 32 + }, +/obj/item/ammo_casing/spent{ + pixel_x = 8; + pixel_y = 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/catwalk_floor, +/area/station/maintenance/starboard/central/upper) "kzX" = ( /obj/effect/spawner/random/contraband/prison, /obj/structure/rack, /turf/open/floor/plating, /area/station/maintenance/department/medical) +"kAc" = ( +/obj/effect/spawner/random/structure/tank_holder, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "kAh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -36986,39 +39272,21 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"kAq" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"kAr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +"kAn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/office) "kAu" = ( /obj/structure/lattice/catwalk, /obj/structure/chair/comfy, /turf/open/openspace, /area/station/maintenance/port/aft) -"kAx" = ( -/obj/machinery/door/airlock/engineering{ - name = "Telecomms Storage" - }, -/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/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, -/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "kAy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37030,10 +39298,13 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/openspace, /area/station/commons/vacant_room/office) -"kAV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet, -/area/station/maintenance/starboard/lesser) +"kAQ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "kAX" = ( /obj/structure/railing{ dir = 4 @@ -37083,30 +39354,19 @@ dir = 4 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"kBo" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/area/station/ai/satellite/interior) "kBq" = ( /obj/structure/railing/corner, -/obj/item/wrench/medical, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "kBs" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) -"kBx" = ( -/obj/structure/table/wood/poker, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "kBA" = ( /obj/structure/mirror/directional/north{ pixel_y = 31 @@ -37121,22 +39381,56 @@ specialfunctions = 4 }, /obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain/private) +"kBB" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Chapel Office Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "kBF" = ( /turf/open/floor/engine/hull/air, /area/station/hallway/primary/aft) -"kBG" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 +"kCa" = ( +/obj/machinery/field/generator, +/obj/effect/turf_decal/bot_white, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) +"kCh" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos/upper) +"kCk" = ( +/obj/machinery/space_heater, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"kCp" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 }, -/obj/item/radio/intercom/directional/west, +/obj/structure/closet/secure_closet/chemical, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/sign/warning/explosives/directional/west, /turf/open/floor/iron/dark, -/area/station/engineering/hallway) -"kCp" = ( -/obj/structure/lattice, -/turf/open/openspace, /area/station/medical/chemistry) +"kCz" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "kCE" = ( /obj/structure/table, /obj/item/stock_parts/subspace/treatment, @@ -37175,19 +39469,12 @@ dir = 8 }, /area/station/hallway/primary/fore) -"kDa" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/railing/corner/end{ - dir = 4 - }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) "kDc" = ( -/obj/structure/statue/sandstone/venus{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) +/obj/machinery/wall_healer/directional/north, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "kDe" = ( /obj/structure/altar/of_gods, /obj/structure/noticeboard/directional/north, @@ -37195,6 +39482,16 @@ dir = 4 }, /area/station/service/chapel) +"kDx" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/departments/aisat/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "kDC" = ( /obj/structure/railing/corner/end{ dir = 1 @@ -37205,7 +39502,9 @@ /obj/effect/turf_decal/trimline/green/filled/mid_joiner{ dir = 4 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) "kDF" = ( /obj/structure/table/reinforced, @@ -37219,31 +39518,43 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) -"kDO" = ( -/turf/closed/wall/r_wall, -/area/station/medical/morgue) "kDP" = ( -/obj/structure/sink/directional/west, -/obj/effect/turf_decal/tile/blue/opposingcorners{ +/obj/effect/turf_decal/trimline/blue/warning{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/blue/corner{ dir = 1 }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 9 +/turf/open/floor/iron/dark/smooth_corner{ + dir = 1 }, -/turf/open/floor/iron/dark, /area/station/medical/cryo) "kDQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/barricade/sandbags, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"kEf" = ( +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer2{ + dir = 1 + }, +/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/station/engineering/atmos/upper) "kEg" = ( /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/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "kEh" = ( /obj/structure/lattice, /obj/structure/disposalpipe/segment{ @@ -37281,14 +39592,6 @@ dir = 8 }, /area/station/hallway/primary/central) -"kEq" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "kEw" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -37299,32 +39602,44 @@ name = "Holodeck Projector Floor" }, /area/station/holodeck/rec_center) -"kEy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 6 +"kEB" = ( +/obj/structure/railing{ + dir = 1 }, -/obj/machinery/button/door/directional/north{ - id = "abandoned_kitchen" +/obj/machinery/door/firedoor/border_only{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"kES" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/chair{ - dir = 1; + dir = 4; pixel_y = -2 }, -/obj/structure/disposalpipe/segment{ - dir = 6 +/obj/effect/landmark/start/paramedic, +/turf/open/floor/glass, +/area/station/medical/medbay/central) +"kEC" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"kFa" = ( +/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/lobby) +"kEG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/openspace, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/central/upper) +"kEY" = ( +/obj/machinery/door/airlock/public/glass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured, +/area/station/commons/locker) "kFc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37336,7 +39651,7 @@ dir = 4 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "kFt" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -37356,27 +39671,21 @@ /obj/structure/curtain, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"kFP" = ( -/obj/structure/closet/toolcloset, -/obj/effect/landmark/start/hangover/closet, +"kFN" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/hangover, /turf/open/floor/wood, -/area/station/commons/storage/tools) -"kFQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood/old, +/area/station/maintenance/starboard) +"kGg" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight{ + pixel_y = 14 + }, +/obj/item/storage/toolbox/mechanical, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"kFS" = ( -/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/engineering, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor, -/area/station/engineering/lobby) +/area/station/maintenance/starboard/central/upper) "kGD" = ( /obj/machinery/air_sensor/nitrogen_tank, /obj/structure/window/reinforced/plasma/spawner/directional/south, @@ -37410,12 +39719,24 @@ }, /turf/open/openspace, /area/station/maintenance/port) -"kHj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +"kGQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_machine, +/obj/machinery/vending/tool, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron/dark, +/area/station/engineering/storage_shared) +"kGV" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/obj/machinery/air_sensor/plasma_tank, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos/upper) +"kHe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard) "kHv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37429,35 +39750,49 @@ name = "MiniSat Airlock Access" }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "kHy" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, -/obj/structure/table, -/obj/item/storage/box/lights/mixed{ - pixel_x = 4; - pixel_y = 11 - }, -/obj/item/multitool{ - pixel_x = -8; - pixel_y = 3 - }, -/obj/item/hand_labeler_refill{ - pixel_x = 7; - pixel_y = -2 +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 2 }, -/obj/machinery/status_display/evac/directional/north, +/obj/structure/sign/poster/random/directional/north, /turf/open/floor/iron, /area/station/cargo/storage) +"kHD" = ( +/obj/effect/turf_decal/tile/dark_green/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 4; + name = "Ports To Space" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"kHF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"kHH" = ( +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/white/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "kHU" = ( /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"kHY" = ( -/obj/machinery/door/poddoor/incinerator_atmos_aux, -/turf/open/floor/engine/airless, -/area/station/maintenance/disposal/incinerator) "kHZ" = ( /obj/effect/spawner/random/medical/supplies, /obj/structure/table, @@ -37468,21 +39803,28 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/hallway/primary/aft) +"kIr" = ( +/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/structure/sign/poster/random/directional/south, +/turf/open/floor/iron, +/area/station/commons/dorms) "kIt" = ( -/obj/effect/turf_decal/siding/blue/corner, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/white/textured_large, +/obj/machinery/holopad, +/turf/open/floor/iron/dark, /area/station/medical/medbay/central) "kIw" = ( -/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/mail_sorting/supply/cargo_bay, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1 +/obj/effect/turf_decal/trimline/brown/filled, +/obj/structure/chair/office/light{ + dir = 8 }, /turf/open/floor/iron, /area/station/cargo/storage) @@ -37500,6 +39842,21 @@ }, /turf/open/floor/carpet, /area/station/security/detectives_office) +"kID" = ( +/obj/structure/lattice/catwalk, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/starboard/fore) +"kIE" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"kIL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/ladder, +/obj/structure/sign/poster/official/pda_ad/directional/west, +/turf/open/openspace, +/area/station/maintenance/department/crew_quarters/dorms) "kIW" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -37511,6 +39868,13 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"kJk" = ( +/obj/structure/chair/stool/directional/north, +/turf/open/floor/wood, +/area/station/maintenance/starboard) +"kJl" = ( +/turf/open/floor/carpet, +/area/station/maintenance/starboard) "kJw" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -37519,6 +39883,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/security/prison) +"kJz" = ( +/obj/machinery/newscaster/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "kJF" = ( /obj/structure/table, /obj/item/stock_parts/subspace/ansible, @@ -37532,6 +39901,16 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tcomms) +"kJG" = ( +/obj/structure/sink/kitchen/directional/east{ + name = "sink" + }, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) +"kJI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/upper) "kJO" = ( /obj/structure/railing, /obj/effect/turf_decal/siding/wood, @@ -37560,6 +39939,18 @@ /obj/structure/mannequin/wood, /turf/open/floor/wood, /area/station/service/library/printer) +"kKe" = ( +/obj/structure/rack, +/obj/item/circuitboard/computer/apc_control{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/stock_parts/power_store/cell{ + pixel_x = -3; + pixel_y = -2 + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "kKj" = ( /obj/structure/chair/sofa/corner/brown{ dir = 4 @@ -37570,18 +39961,43 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron, /area/station/science/breakroom) +"kKn" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/airlock_sensor/incinerator_atmos{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/upper) "kKw" = ( /obj/structure/lattice/catwalk, /turf/open/floor/engine/hull/air, /area/station/hallway/secondary/construction) -"kKy" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/lattice/catwalk, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/water, -/area/station/maintenance/starboard/fore) +"kKB" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/toilet/restrooms) +"kKG" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) "kKH" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) @@ -37598,6 +40014,16 @@ }, /turf/open/openspace, /area/station/construction/storage_wing) +"kKU" = ( +/obj/item/book/granter/action/spell/smoke/lesser{ + name = "mysterious old book of cloud-chasing" + }, +/obj/structure/table/wood, +/obj/structure/light_construct/directional/east{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "kLe" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -37630,6 +40056,15 @@ /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"kLI" = ( +/obj/effect/mapping_helpers/airlock/access/all/medical/pharmacy, +/obj/effect/turf_decal/tile/yellow/full, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Chemical Storage" + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/chem_storage) "kLL" = ( /obj/structure/cable, /turf/closed/wall, @@ -37640,16 +40075,28 @@ }, /turf/open/floor/wood, /area/station/command/corporate_showroom) -"kLV" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/duct, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) +"kMd" = ( +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/cable_coil, +/obj/structure/closet/crate/engineering/electrical, +/turf/open/floor/glass/reinforced, +/area/station/solars/starboard/fore) "kMj" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) @@ -37665,6 +40112,35 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/tcommsat/server) +"kMl" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/camera/autoname/directional/east, +/obj/item/toy/plush/lizard_plushie/green{ + name = "Endures-The-Blast"; + pixel_y = 10; + pixel_x = -8 + }, +/obj/structure/sign/warning/explosives/directional/east, +/obj/structure/closet/crate/robust{ + name = "Risk Management Supply Crate"; + anchored = 1 + }, +/obj/item/clothing/suit/utility/bomb_suit/white{ + pixel_x = 5; + pixel_y = 5; + name = "Personal Liability Mitigation Suit" + }, +/obj/item/clothing/head/utility/bomb_hood/white{ + pixel_x = -7; + pixel_y = -2; + name = "Cranial Hazard Guard" + }, +/obj/item/clothing/mask/gas{ + pixel_x = 5; + name = "Controlled Atmosphere Mask" + }, +/turf/open/floor/engine, +/area/station/medical/chemistry) "kMq" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -37683,6 +40159,13 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/station/maintenance/port) +"kMF" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "kMI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/fax{ @@ -37706,9 +40189,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"kNc" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/engineering/lobby) "kNf" = ( /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"kNj" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/storage) "kNl" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37723,6 +40220,20 @@ }, /turf/open/floor/iron/textured, /area/station/security/brig) +"kNE" = ( +/obj/effect/turf_decal/siding/brown{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "kNI" = ( /obj/structure/lattice/catwalk, /obj/effect/decal/cleanable/glass, @@ -37743,6 +40254,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) +"kOi" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/closet/emcloset, +/turf/open/floor/plating/airless, +/area/station/maintenance/starboard/aft) +"kOj" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 9 + }, +/obj/effect/turf_decal/tile/dark/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "kOk" = ( /turf/closed/wall/r_wall, /area/station/engineering/lobby) @@ -37756,6 +40281,14 @@ /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/plating, /area/station/science/research) +"kOo" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) "kOv" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, @@ -37769,10 +40302,13 @@ /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{ +/obj/structure/disposalpipe/sorting/mail{ dir = 2 }, -/obj/effect/mapping_helpers/mail_sorting/science/robotics, +/obj/effect/mapping_helpers/mail_sorting/medbay/virology, +/obj/effect/mapping_helpers/mail_sorting/medbay/general, +/obj/effect/mapping_helpers/mail_sorting/medbay/chemistry, +/obj/effect/mapping_helpers/mail_sorting/medbay/cmo_office, /turf/open/floor/iron, /area/station/hallway/primary/aft) "kOI" = ( @@ -37780,6 +40316,10 @@ /obj/effect/decal/cleanable/plasma, /turf/open/floor/iron, /area/station/construction/storage_wing) +"kOK" = ( +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/floor/plating/airless, +/area/station/maintenance/aft) "kOO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -37819,6 +40359,13 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) +"kPe" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/ferny/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/machinery/duct, +/turf/open/floor/grass, +/area/station/commons/dorms) "kPg" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -37834,53 +40381,48 @@ /obj/machinery/light/small/red/dim/directional/west, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) -"kPF" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 +"kPC" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"kPD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/item/mop, +/obj/item/grenade/chem_grenade/cleaner, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"kPF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/stripes{ + dir = 10 + }, +/turf/open/floor/iron/textured, +/area/station/command/eva) "kPH" = ( /obj/machinery/firealarm/directional/west, /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/wood/large, /area/station/medical/psychology) "kPI" = ( -/obj/structure/table/wood, -/obj/item/storage/briefcase/secure{ - pixel_x = 5; - pixel_y = 9 - }, -/obj/item/storage/medkit/regular{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/clothing/head/soft/blue{ - pixel_x = 10; - pixel_y = 1 - }, -/obj/item/clothing/neck/stethoscope{ - pixel_x = 2; - pixel_y = 4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) -"kPL" = ( -/obj/effect/landmark/transport/transport_id{ - specific_transport_id = "catwalk_engi" - }, -/obj/structure/transport/linear{ - radial_travel = 0 +/obj/machinery/vending/wardrobe/medi_wardrobe, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" }, -/turf/open/openspace, -/area/station/engineering/break_room) +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "kPN" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/checkpoint/customs) +"kPO" = ( +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "kPQ" = ( /obj/structure/lattice/catwalk, /obj/structure/table, @@ -37908,6 +40450,16 @@ }, /turf/open/openspace, /area/station/command/gateway) +"kPR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/sign/warning/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"kPX" = ( +/turf/open/floor/eighties, +/area/station/maintenance/department/crew_quarters/dorms) "kPZ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -37930,42 +40482,7 @@ /obj/structure/toilet, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/freezer, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"kQf" = ( -/obj/effect/turf_decal/siding/brown, -/obj/structure/rack, -/obj/item/clothing/ears/earmuffs, -/obj/item/clothing/under/color/red, -/obj/item/clothing/neck/tie/red{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/head/soft/red, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"kQh" = ( -/obj/structure/table, -/obj/item/storage/box/gloves{ - pixel_x = -6; - pixel_y = 9 - }, -/obj/item/storage/box/masks{ - pixel_x = -6; - pixel_y = 3 - }, -/obj/item/storage/box/bodybags{ - pixel_x = -6; - pixel_y = -5 - }, -/obj/effect/turf_decal/tile/blue/full, -/obj/item/clothing/neck/stethoscope, -/obj/machinery/firealarm/directional/west, -/obj/machinery/camera/autoname/directional/west{ - network = list("ss13","medbay"); - c_tag = "Medbay - Central West" - }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/area/station/ai/satellite/foyer) "kQn" = ( /obj/structure/sign/picture_frame/portrait{ pixel_y = 33 @@ -37976,17 +40493,6 @@ /obj/structure/table, /turf/open/floor/iron/dark/smooth_edge, /area/station/service/library) -"kQy" = ( -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "kQC" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line, /obj/effect/turf_decal/tile/dark_blue{ @@ -37995,26 +40501,17 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/cytology) -"kQD" = ( -/obj/effect/spawner/structure/window, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"kQV" = ( -/obj/structure/girder, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/structure/electrified_grille, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"kRd" = ( -/obj/machinery/door/airlock/maintenance, +"kQE" = ( +/obj/item/flashlight/lamp/green{ + pixel_y = 5 + }, +/obj/structure/table/wood, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 +/obj/effect/spawner/random/food_or_drink/booze{ + pixel_x = -7 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/carpet/cyan, +/area/station/command/heads_quarters/cmo) "kRf" = ( /obj/structure/cable/layer3, /obj/structure/cable, @@ -38024,7 +40521,7 @@ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "kRk" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -38037,6 +40534,10 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) +"kRv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "kRD" = ( /obj/effect/spawner/random/vending/snackvend, /obj/structure/disposalpipe/segment{ @@ -38058,20 +40559,33 @@ }, /turf/open/floor/iron/stairs/left, /area/station/hallway/secondary/construction) +"kRN" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/closed/wall, +/area/station/maintenance/port) "kRR" = ( /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_large, /area/station/security/prison) -"kSc" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/engine/hull/air, -/area/station/medical/medbay/central) +"kRX" = ( +/turf/open/floor/iron/stairs{ + dir = 4 + }, +/area/station/maintenance/aft) "kSg" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/iron/stairs/medium, /area/station/science/cytology) +"kSk" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/lobby) "kSo" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -38087,13 +40601,15 @@ /turf/open/floor/iron, /area/station/hallway/primary/port) "kSB" = ( -/obj/machinery/status_display/ai/directional/north, -/obj/item/kirbyplants/organic/plant19{ - pixel_x = -6; - pixel_y = 2 +/obj/machinery/porta_turret/ai{ + dir = 4 }, -/turf/open/floor/carpet, -/area/station/ai_monitored/turret_protected/ai_upload) +/obj/structure/sign/plaques/kiddie{ + pixel_y = 32; + dir = 1 + }, +/turf/open/floor/circuit/red, +/area/station/ai/upload/chamber) "kSD" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/end{ dir = 1 @@ -38102,35 +40618,31 @@ /obj/structure/flora/bush/jungle/b/style_2, /turf/open/floor/grass/fairy, /area/station/maintenance/hallway/abandoned_recreation) -"kSL" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/structure/railing{ - 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/openspace, -/area/station/engineering/lobby) -"kSN" = ( -/obj/structure/railing{ - dir = 6 +"kSI" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 3; + height = 5; + name = "SS13: Common Mining Dock"; + roundstart_template = /datum/map_template/shuttle/mining_common/meta; + shuttle_id = "commonmining_home"; + width = 7 }, -/turf/open/floor/grass, -/area/station/hallway/primary/starboard) +/turf/open/floor/plating, +/area/station/hallway/secondary/construction) "kSP" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"kSS" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ - dir = 8 +"kSR" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 }, -/turf/open/openspace, -/area/station/engineering/break_room) +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "kSY" = ( /obj/structure/table, /obj/item/blood_filter{ @@ -38145,22 +40657,23 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/wood/large, /area/station/hallway/primary/central) +"kTe" = ( +/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/access/any/engineering/general, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/machinery/door/airlock/maintenance, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/station/engineering/lobby) "kTi" = ( /turf/open/floor/engine/vacuum, /area/station/science/ordnance/bomb) -"kTq" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/commons/toilet/restrooms) +"kTm" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "kTw" = ( /turf/closed/wall/r_wall, /area/station/security/brig) @@ -38194,25 +40707,24 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"kTN" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/item/storage/medkit/toxin, -/obj/structure/table, -/turf/open/floor/iron/smooth, -/area/station/engineering/main) +"kTQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/maintenance/starboard) "kTW" = ( /obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 1 + }, /area/station/hallway/primary/central) -"kUf" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 9 +"kUk" = ( +/obj/effect/turf_decal/siding{ + dir = 1 }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "kUq" = ( /turf/closed/wall/r_wall, /area/station/maintenance/port) @@ -38235,14 +40747,14 @@ "kUO" = ( /turf/open/openspace, /area/station/security/courtroom) -"kUW" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ - dir = 1; - initialize_directions = 1 +"kVf" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 2 }, -/turf/open/floor/iron/freezer, -/area/station/engineering/atmos/pumproom) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/dorms) "kVj" = ( /obj/effect/turf_decal/bot_white, /turf/open/floor/iron/dark/textured_large, @@ -38251,24 +40763,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"kVu" = ( -/obj/structure/table, -/obj/item/stack/medical/mesh{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/item/stack/medical/gauze{ - pixel_x = 4 - }, -/obj/item/stack/medical/suture{ - pixel_x = -1; - pixel_y = -12 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "kVE" = ( /obj/machinery/power/solar_control, /obj/structure/cable, @@ -38310,10 +40804,10 @@ name = "Medbay Maintenance" }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/medical/abandoned) "kVV" = ( @@ -38322,6 +40816,16 @@ }, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) +"kVZ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 8 + }, +/turf/open/floor/holofloor/dark, +/area/station/command/heads_quarters/cmo) "kWe" = ( /obj/structure/table, /obj/item/hfr_box/corner{ @@ -38348,18 +40852,14 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/cargo/storage) -"kWo" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/disposalpipe/segment{ - dir = 4 +"kWp" = ( +/obj/effect/turf_decal/siding/blue, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/carpet, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "kWr" = ( /obj/effect/turf_decal/siding/purple, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -38367,31 +40867,34 @@ }, /turf/open/floor/iron, /area/station/science/explab) +"kWs" = ( +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "kWv" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 6 - }, +/obj/structure/cable, /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/textured_large, -/area/station/medical/medbay/central) -"kWx" = ( -/obj/structure/table/reinforced, -/obj/item/wirecutters, -/obj/item/screwdriver, -/obj/item/stack/cable_coil, -/obj/item/crowbar, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/obj/structure/sign/warning/radiation/rad_area/directional/south, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "kWF" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/firealarm/directional/east, -/turf/open/openspace, -/area/station/medical/storage) +/obj/machinery/airalarm/directional/east, +/obj/machinery/iv_drip, +/obj/machinery/light/floor{ + color = "#66ccff" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_a) +"kWL" = ( +/obj/item/cigbutt{ + pixel_x = 7; + pixel_y = 14 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "kWO" = ( /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, @@ -38405,27 +40908,7 @@ }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/checker, -/area/station/ai_monitored/turret_protected/aisat_interior) -"kXa" = ( -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics Testing Room" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/machinery/door/firedoor/heavy, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) -"kXt" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) -"kXy" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/medical_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) +/area/station/ai/satellite/interior) "kXB" = ( /obj/effect/turf_decal/delivery, /obj/structure/table, @@ -38443,9 +40926,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood/large, /area/station/hallway/secondary/service) -"kXI" = ( -/turf/closed/wall/r_wall, -/area/station/medical/cryo) "kXQ" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -38454,14 +40934,16 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron, /area/station/science/lab) -"kXT" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room" +"kXW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/mail_sorting/engineering/ce_office, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/engine, -/area/station/engineering/storage_shared) +/obj/structure/cable, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "kYd" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -38469,16 +40951,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/robotics) -"kYe" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/newscaster/directional/north, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/commons/toilet/restrooms) "kYf" = ( /turf/open/floor/engine/o2, /area/station/engineering/atmos/upper) @@ -38486,35 +40958,27 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured_large, /area/station/science/robotics/lab) +"kYk" = ( +/obj/structure/girder, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) +"kYz" = ( +/obj/structure/sign/warning/yes_smoking/circle/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "kYK" = ( -/obj/structure/closet/crate/science, -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/siding/yellow{ - dir = 8 - }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/reagent_containers/cup/bottle/epinephrine{ - pixel_x = 6; - pixel_y = -6 - }, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = -2; - pixel_y = -7 - }, -/obj/item/reagent_containers/dropper{ - pixel_x = 2; - pixel_y = -11 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, +/obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/chemistry) +"kYM" = ( +/obj/structure/table/reinforced, +/obj/item/toy/redbutton{ + pixel_y = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "kYN" = ( /obj/effect/spawner/random/vending/colavend, /turf/open/floor/wood, @@ -38544,17 +41008,41 @@ /obj/structure/flora/rock/pile/jungle/style_5, /obj/structure/flora/grass/jungle/b/style_5, /turf/open/floor/grass, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "kZo" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) +"kZq" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck{ + pixel_y = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/maintenance/starboard) +"kZs" = ( +/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, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "kZv" = ( /obj/structure/broken_flooring/pile/directional/south, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) +"kZw" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "kZV" = ( /obj/machinery/door/airlock/security/glass{ name = "Courtroom Access" @@ -38587,39 +41075,6 @@ /obj/structure/broken_flooring/side/always_floorplane/directional/north, /turf/open/floor/carpet/blue, /area/station/maintenance/port/aft) -"lai" = ( -/obj/effect/mine/explosive, -/obj/effect/decal/cleanable/wrapping{ - pixel_y = 3 - }, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/item/stack/package_wrap{ - pixel_y = -5 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"laj" = ( -/obj/item/book/granter/action/spell/smoke/lesser{ - name = "mysterious old book of cloud-chasing" - }, -/obj/structure/table/wood, -/obj/structure/light_construct/directional/east{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) -"lan" = ( -/obj/machinery/door/airlock/engineering/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/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark, -/area/station/engineering/hallway) "lav" = ( /obj/machinery/power/shieldwallgen/xenobiologyaccess, /obj/structure/window/reinforced/spawner/directional/south, @@ -38633,10 +41088,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"laz" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/structure/frame/computer{ + anchored = 1; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) "laB" = ( /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"laC" = ( +/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) "laD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38646,38 +41119,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"laK" = ( -/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/commons/dorms) -"laQ" = ( -/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/commons/fitness/recreation) -"lbe" = ( -/obj/effect/turf_decal/siding/purple/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple/corner, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, +"laO" = ( +/obj/structure/lattice/catwalk, /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/lab) +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/space/openspace, +/area/space/nearstation) "lbh" = ( /obj/structure/chair{ dir = 8 @@ -38691,6 +41138,21 @@ }, /turf/open/floor/iron/chapel, /area/station/service/chapel) +"lbk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard) +"lbp" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/meter, +/obj/effect/turf_decal/box/red, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) "lbw" = ( /obj/structure/closet/lasertag, /obj/effect/decal/cleanable/dirt, @@ -38717,78 +41179,61 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/textured_large, /area/station/security/prison) -"lbN" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/chair{ - dir = 1 - }, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) +"lbJ" = ( +/obj/structure/stairs/north, +/turf/open/floor/plating, +/area/station/maintenance/aft) "lbT" = ( -/obj/effect/turf_decal/siding/green, /obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark/smooth_large, +/obj/effect/turf_decal/tile/dark_green{ + dir = 8 + }, +/turf/open/floor/iron/dark, /area/station/hallway/primary/central) -"lbW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sink/directional/south, -/turf/open/floor/iron/freezer, -/area/station/commons/dorms) "lca" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/access/all/medical/virology, /obj/machinery/door/airlock/virology/glass{ name = "Entrance to Malpractice Tower" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/textured_large, /area/station/medical/virology) +"lcb" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 1 + }, +/obj/machinery/meter{ + name = "Mixed Air Tank In" + }, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos) "lce" = ( /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/firedoor, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"lcs" = ( -/obj/item/storage/box/aquarium_props{ - pixel_x = -6; - pixel_y = -2 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"lcy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair{ - dir = 8; - pixel_y = -2 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"lcE" = ( -/obj/structure/lattice/catwalk, -/obj/structure/closet/emcloset, -/obj/effect/spawner/random/maintenance, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) -"lcN" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, /turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/area/station/hallway/primary/aft) +"lcs" = ( +/obj/item/storage/box/aquarium_props{ + pixel_x = -6; + pixel_y = -2 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "lcO" = ( /obj/structure/table, /obj/item/clothing/suit/hazardvest, /turf/open/floor/wood, /area/station/commons/storage/tools) +"lcS" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) "lcU" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /obj/machinery/meter, @@ -38809,29 +41254,49 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) +"ldp" = ( +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/obj/effect/turf_decal/box/red, +/turf/open/floor/iron/dark/textured_large, +/area/station/cargo/sorting) +"ldr" = ( +/obj/structure/lattice, +/obj/effect/spawner/random/structure/grille, +/obj/structure/grille/broken, +/turf/open/space/openspace, +/area/space/nearstation) "ldv" = ( /obj/machinery/status_display/ai/directional/south, /obj/structure/closet/emcloset, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ldL" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output{ - dir = 1 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - n2o Cell"; - name = "atmospherics camera" - }, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos/upper) +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/virology) "ldN" = ( /obj/structure/lattice/catwalk, /obj/machinery/oven/range, /turf/open/openspace, /area/station/service/kitchen) +"ldV" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/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/dark, +/area/station/engineering/supermatter/room/upper) "ldX" = ( /obj/machinery/door/airlock{ - id_tag = "commissarydoor"; + id_tag = "officecommissarydoor"; name = "Vacant Office" }, /obj/effect/turf_decal/tile/green/fourcorners, @@ -38855,11 +41320,10 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) "leu" = ( -/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/meeting_room/council) +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "ley" = ( /obj/effect/turf_decal/tile/green/opposingcorners{ dir = 1 @@ -38898,20 +41362,30 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/tcommsat/server) -"leJ" = ( -/obj/machinery/camera/autoname/directional/east{ - network = list("ss13","medbay"); - c_tag = "Medbay - Upper Storage East Hallway" +"leK" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/turf/open/openspace, -/area/station/medical/chemistry) +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "leL" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/rd) -"leR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"leN" = ( +/obj/machinery/door/airlock/external{ + name = "MiniSat Space Access Airlock" }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "AI-Transit-Tube-Access" + }, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, +/obj/machinery/door/poddoor/preopen{ + id = "transitlockdown" + }, +/turf/open/floor/plating, +/area/station/engineering/transit_tube) +"leR" = ( /turf/open/floor/wood, /area/station/maintenance/starboard/central) "leS" = ( @@ -38920,87 +41394,70 @@ /area/station/science/breakroom) "leT" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, -/obj/structure/closet/wardrobe/miner, -/obj/machinery/light_switch/directional/west{ - pixel_y = 6 + dir = 8 }, +/obj/machinery/vending/wardrobe/cargo_wardrobe, /turf/open/floor/iron, -/area/station/cargo/miningoffice) -"lff" = ( -/obj/machinery/power/terminal{ - dir = 1; - cable_layer = 1 - }, -/obj/structure/cable/multilayer/layer1, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/engine_smes) +/area/station/cargo/storage) "lfi" = ( /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) -"lfx" = ( -/obj/effect/landmark/event_spawn, +/area/station/security/armory) +"lfl" = ( +/obj/machinery/camera/autoname/directional/west, +/obj/structure/lattice/catwalk, /turf/open/openspace, -/area/station/service/chapel) +/area/station/medical/medbay/central) "lfD" = ( /obj/structure/cable, /obj/machinery/power/smes/full, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) -"lfG" = ( -/obj/structure/stairs/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/stairs/medium, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/chamber) "lfK" = ( /obj/structure/ladder, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) -"lfT" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/filingcabinet, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/effect/spawner/random/bureaucracy/paper, -/turf/open/floor/iron/dark/textured_large, -/area/station/maintenance/starboard/aft) +"lfX" = ( +/obj/machinery/light/directional/south, +/obj/structure/lattice/catwalk, +/obj/machinery/airalarm/directional/south, +/turf/open/openspace, +/area/station/security/checkpoint/supply) "lgb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/commons/storage/primary) -"lge" = ( -/turf/open/floor/wood, -/area/station/engineering/lobby) +"lgg" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "abandoned_kitchen"; + name = "Kitchen Shudders"; + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard) "lgi" = ( /obj/structure/chair/office, /turf/open/floor/carpet/stellar, /area/station/service/library) "lgo" = ( -/obj/item/storage/box/silver_ids{ - pixel_x = -4; - pixel_y = 21 - }, -/obj/item/storage/box/ids{ - pixel_x = -14; - pixel_y = 15 - }, -/obj/item/storage/box/pdas{ - pixel_x = 8; - pixel_y = 17 - }, /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/carpet, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) +"lgt" = ( +/obj/structure/ladder, +/turf/open/floor/plating, +/area/station/solars/starboard/fore) "lgv" = ( /obj/item/hfr_box/corner{ pixel_x = -10; @@ -39008,19 +41465,27 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) +"lgx" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/structure/sign/poster/contraband/random/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "lgA" = ( /obj/structure/lattice, /obj/structure/grille/broken, /turf/open/space/openspace, /area/space/nearstation) -"lgF" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/engineering/gravity_generator) -"lgN" = ( -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) +"lgC" = ( +/obj/machinery/light/small/directional/west, +/turf/open/openspace, +/area/station/engineering/storage/tech) +"lgK" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/office) "lgV" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -39034,13 +41499,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/construction/storage_wing) -"lgZ" = ( -/obj/item/pickaxe{ - pixel_x = 4; - pixel_y = 12 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "lhg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39051,23 +41509,31 @@ /obj/effect/turf_decal/siding/blue{ dir = 1 }, -/obj/machinery/computer/cargo/request{ - dir = 8 +/obj/machinery/light/directional/east, +/obj/structure/bookcase/random/reference, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 5 }, -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/tile/green/opposingcorners{ +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ dir = 1 }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 9; + pixel_y = 12 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) +"lhq" = ( +/obj/structure/chair/stool/directional/west, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "lhw" = ( /turf/open/floor/glass/reinforced, /area/station/science/ordnance) "lhy" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/event_spawn, @@ -39082,22 +41548,28 @@ }, /turf/open/floor/wood/large, /area/station/hallway/primary/central) -"lhX" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ +"lhJ" = ( +/obj/effect/landmark/start/depsec/engineering, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/turf/open/floor/iron/smooth, +/turf/open/floor/iron/dark/smooth_large, +/area/station/security/checkpoint/engineering) +"lhP" = ( +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/turf/closed/wall/r_wall, /area/station/engineering/atmos/upper) -"lhY" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/conveyor{ - dir = 8; - id = "mining" - }, -/obj/structure/railing{ +"lhR" = ( +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/siding/wood{ dir = 1 }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) +"lhY" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, /turf/open/floor/iron, /area/station/cargo/miningoffice) "lia" = ( @@ -39114,16 +41586,17 @@ /obj/effect/landmark/start/cyborg, /turf/open/floor/iron/dark/textured_large, /area/station/science/robotics/lab) +"lik" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/commons/locker) "lim" = ( /obj/effect/spawner/random/trash/grime, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"lio" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "liy" = ( /obj/item/kirbyplants/random, /obj/item/radio/intercom/directional/south, @@ -39135,6 +41608,10 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"liE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/mix_output, +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos/upper) "liH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/graffiti, @@ -39146,14 +41623,32 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"liY" = ( -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics Testing Room" +"liN" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/closet/firecloset, +/obj/structure/sign/warning/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"liP" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Virology Maintenance" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/machinery/door/firedoor/heavy, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, -/area/station/engineering/atmos/project) +/area/station/maintenance/port) +"lja" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/textured_large, +/area/station/medical/virology) "ljc" = ( /turf/open/openspace, /area/station/hallway/secondary/exit/departure_lounge) @@ -39162,13 +41657,25 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/openspace, /area/station/hallway/secondary/entry) -"ljh" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/openspace, -/area/station/engineering/lobby) "lji" = ( /turf/closed/wall/r_wall, /area/station/security/evidence) +"ljq" = ( +/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/medical/pharmacy, +/obj/machinery/door/airlock/medical/glass{ + name = "Pharmacy" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/yellow/full, +/obj/effect/mapping_helpers/airlock_note_placer{ + note_info = "Looking for your chem factory area? Go upstairs and you will find it above the Pharmacy. You also have a new Controlled Hazard Chamber"; + note_name = "Projects" + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "ljt" = ( /obj/structure/chair/office{ dir = 8 @@ -39192,15 +41699,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/office) -"ljW" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "cargocatwalkmaint" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/access/all/engineering/external, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "ljY" = ( /obj/structure/lattice/catwalk, /obj/item/clothing/mask/gas/clown_hat{ @@ -39218,11 +41716,21 @@ /obj/structure/closet/crate/cardboard, /turf/open/openspace, /area/station/maintenance/port/aft) +"lkf" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "lkj" = ( -/obj/structure/lattice/catwalk, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "hop"; + name = "Privacy Shutters" + }, /obj/structure/cable, -/turf/open/water, -/area/station/maintenance/port/fore) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/command/heads_quarters/hop) "lkt" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -39241,7 +41749,7 @@ /area/station/security/prison/mess) "lkC" = ( /obj/machinery/light/directional/south, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge, /area/station/hallway/primary/central) "lkP" = ( /obj/effect/turf_decal/bot/right, @@ -39253,31 +41761,31 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"llg" = ( -/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/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/engineering/atmos/project) -"llh" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4 +"lle" = ( +/obj/structure/curtain/cloth, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/medical/patients_rooms/room_a) +"llf" = ( +/obj/structure/table/reinforced, +/obj/machinery/airalarm/directional/east, +/obj/item/paper_bin{ + pixel_x = 2; + pixel_y = 7 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/item/hand_labeler, +/obj/effect/turf_decal/tile/yellow, +/obj/item/stack/package_wrap, /turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/area/station/commons/storage/primary) "lll" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "capshut" + }, +/obj/structure/cable, /turf/open/floor/plating, /area/station/command/heads_quarters/captain/private) -"llv" = ( -/obj/structure/lattice/catwalk, -/turf/open/water, -/area/station/maintenance/port/fore) "llA" = ( /obj/machinery/door/airlock/external{ name = "Arrival Airlock"; @@ -39288,6 +41796,16 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"llC" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/item/analyzer, +/obj/machinery/light/small/directional/north, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "llD" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -39298,21 +41816,51 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"llG" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/meter{ + name = "N2O meter" + }, +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "N2O Multideck Adapter"; + dir = 2 + }, +/obj/effect/turf_decal/box/white, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "llK" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /turf/open/floor/iron/freezer, /area/station/engineering/atmos/pumproom) +"llM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"llO" = ( +/obj/structure/transport/linear{ + radial_travel = 0 + }, +/obj/machinery/elevator_control_panel/directional/south{ + linked_elevator_id = "catwalk_engi"; + preset_destination_names = list("2"="Lower Engine","3"="Upper Engine.") + }, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "llP" = ( -/obj/effect/turf_decal/caution/stand_clear{ - dir = 4 +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 }, -/obj/docking_port/stationary/mining_home{ +/obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 }, -/turf/open/floor/engine/hull, -/area/space/nearstation) +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "llY" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green{ @@ -39328,27 +41876,22 @@ }, /turf/open/floor/iron, /area/station/science/lab) -"lmt" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 +"lml" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 }, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/wrapping_paper, -/obj/item/stack/wrapping_paper, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"lmv" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"lmn" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/status_display/ai/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/storage) "lmz" = ( /obj/machinery/conveyor{ dir = 4; @@ -39358,22 +41901,18 @@ id = "Disposal Exit"; name = "Disposal Exit Vent" }, +/obj/effect/turf_decal/stripes/red/box, /turf/open/floor/plating, /area/station/maintenance/disposal) "lmA" = ( -/obj/structure/table/wood, -/obj/item/melee/chainofcommand, -/obj/machinery/recharger{ - pixel_y = 4 - }, /obj/structure/disposalpipe/segment, -/turf/open/floor/carpet, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "lmB" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/maintenance/port) "lmH" = ( @@ -39387,6 +41926,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"lmR" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 9 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "lmT" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/glass/reinforced, @@ -39398,28 +41943,21 @@ /area/station/security/detectives_office/private_investigators_office) "lnd" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/directions/science/directional/west{ - pixel_y = -6 - }, -/obj/structure/sign/directions/supply/directional/west{ - dir = 1 - }, -/obj/structure/sign/directions/engineering/directional/west{ - dir = 1; - pixel_y = 6 - }, /obj/effect/landmark/start/hangover, /obj/effect/spawner/random/trash/grime, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"lnf" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) "lng" = ( /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/service/chapel) +"lnm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/structure/closet/firecloset, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "lnv" = ( /obj/machinery/status_display/supply, /turf/closed/wall, @@ -39428,6 +41966,11 @@ /obj/machinery/light/cold/directional/west, /turf/open/floor/iron/white/smooth_large, /area/station/security/prison) +"lnB" = ( +/obj/structure/sign/warning/docking/directional/south, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "lnC" = ( /obj/machinery/light/directional, /obj/structure/railing{ @@ -39435,6 +41978,20 @@ }, /turf/open/floor/iron/dark, /area/station/security/range) +"lnE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=17-Dorms"; + location = "16-Laundry" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/station/commons/dorms) "lnH" = ( /obj/structure/railing{ dir = 1 @@ -39443,16 +42000,11 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, /turf/open/floor/iron/textured, /area/station/cargo/storage) -"lnO" = ( -/obj/machinery/door/airlock/maintenance, -/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/engineering/general, -/turf/open/floor/iron, -/area/station/engineering/main) "lnV" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/layer3, @@ -39461,9 +42013,15 @@ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) +"lnZ" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/bot, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "loc" = ( -/obj/machinery/photocopier/prebuilt, /obj/machinery/light_switch/directional/south{ pixel_x = 3; pixel_y = -27 @@ -39472,27 +42030,32 @@ /obj/machinery/firealarm/directional/south{ pixel_x = -6 }, -/turf/open/floor/carpet, +/obj/structure/table/wood, +/obj/item/storage/box/ids{ + pixel_x = -14; + pixel_y = 8 + }, +/obj/item/storage/box/silver_ids{ + pixel_x = -4; + pixel_y = 12 + }, +/obj/item/storage/box/pdas{ + pixel_x = 8; + pixel_y = 10 + }, +/turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) "lof" = ( /obj/structure/chair/office, /obj/effect/landmark/start/librarian, /turf/open/floor/wood, /area/station/service/library/printer) -"loh" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) "lon" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ - dir = 4 +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/turf/open/openspace, -/area/station/medical/cryo) +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/cmo) "low" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -39500,6 +42063,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/openspace, /area/station/science/research) +"loz" = ( +/obj/structure/cable, +/turf/open/floor/carpet, +/area/station/maintenance/starboard) "loI" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -39509,6 +42076,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"loJ" = ( +/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/engine, +/area/station/engineering/supermatter/room) "loN" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/multilayer/multiz, @@ -39516,12 +42089,22 @@ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "loO" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"loR" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/sign/poster/official/safety_internals/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "loT" = ( /obj/structure/disposalpipe/trunk/multiz, /turf/open/floor/plating, @@ -39542,14 +42125,29 @@ /obj/structure/fake_stairs/directional/west, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"lps" = ( +/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/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "lpw" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Plasma to Port" - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) +/obj/structure/sign/poster/contraband/power/directional/north, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/maintenance/starboard) +"lpA" = ( +/obj/structure/lattice, +/obj/effect/spawner/random/maintenance, +/turf/open/openspace, +/area/station/maintenance/starboard/aft/upper) +"lpE" = ( +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/main) "lpG" = ( /obj/machinery/door/poddoor/massdriver_chapel, /obj/machinery/atmos_shield_gen/active{ @@ -39560,6 +42158,23 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"lpW" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/status_display/evac/directional/east, +/turf/open/openspace, +/area/station/medical/virology) +"lpX" = ( +/obj/machinery/duct, +/obj/structure/sign/departments/maint/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) +"lqa" = ( +/obj/machinery/rnd/production/protolathe/department/engineering, +/turf/open/floor/iron/dark/smooth_large, +/area/station/engineering/storage) "lqd" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -39574,6 +42189,12 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) +"lqf" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/o2{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "lqg" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -39585,14 +42206,6 @@ }, /turf/open/floor/wood, /area/station/security/courtroom) -"lqp" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/obj/machinery/chem_heater/withbuffer, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_corner, -/area/station/medical/pharmacy) "lqr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -39602,26 +42215,34 @@ /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"lqv" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/pipedispenser/disposal, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +"lqw" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/duct, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "lqA" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 }, /obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/engineering/main) "lqB" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/effect/landmark/firealarm_sanity, -/turf/open/openspace, -/area/station/hallway/primary/central) +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/computer/accounting{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/station/command/heads_quarters/hop) "lqD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39666,44 +42287,18 @@ /turf/open/floor/engine, /area/station/science/xenobiology) "lqS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/north, -/obj/structure/table, -/obj/item/storage/box/lights/mixed{ - pixel_x = 4; - pixel_y = 11 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) -"lqZ" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 9 +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/machinery/iv_drip, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/ai/directional/south, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) -"lrb" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"lrl" = ( -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "O2 Multideck Adapter"; +/obj/effect/turf_decal/trimline/brown/arrow_cw{ dir = 8 }, -/obj/machinery/meter{ - name = "O2 meter" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"lqZ" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/medical/office) "lrp" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -39722,35 +42317,29 @@ /obj/structure/cable, /turf/open/floor/engine/hull, /area/space/nearstation) -"lrT" = ( -/turf/open/floor/glass, -/area/station/maintenance/starboard/lesser) -"lrW" = ( -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/stack/sheet/glass/fifty, -/obj/structure/closet/crate/engineering/electrical, -/turf/open/floor/glass/reinforced, -/area/station/solars/starboard/fore) -"lse" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, +"lrQ" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"lrX" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, /turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/area/station/engineering/supermatter/room/upper) +"lrZ" = ( +/obj/machinery/holopad, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"lsa" = ( +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/structure/lattice/catwalk, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/starboard/fore) "lsg" = ( /obj/machinery/door/window/brigdoor/security/cell/left/directional/east{ id = "Cell 2"; @@ -39762,10 +42351,51 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) +"lsl" = ( +/obj/machinery/mecha_part_fabricator/maint{ + name = "forgotten exosuit fabricator"; + drop_direction = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/oil, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "lsp" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/glass/reinforced/airless, /area/station/solars/starboard/aft) +"lst" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/computer/station_alert, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/engineering/atmos/upper) +"lsu" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"lsv" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/main) +"lsy" = ( +/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/white/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "lsA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, @@ -39774,17 +42404,6 @@ "lsQ" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) -"lsV" = ( -/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/east, -/obj/machinery/light_switch/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/main) "lsW" = ( /obj/structure/table, /obj/effect/spawner/random/maintenance, @@ -39801,17 +42420,21 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "ltE" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"ltG" = ( -/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/openspace, -/area/station/engineering/atmos/project) +/turf/open/floor/wood/large, +/area/station/medical/break_room) +"ltF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/trunk/multiz{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard) "ltQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39833,6 +42456,11 @@ "lul" = ( /turf/closed/wall/r_wall, /area/space/nearstation) +"lum" = ( +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) "luw" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -39865,20 +42493,24 @@ "luY" = ( /turf/closed/wall, /area/station/commons/storage/art) +"lva" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "space-outpost" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "lvj" = ( /obj/machinery/status_display/ai/directional/north, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/engine/hull/air, -/area/station/command/meeting_room/council) -"lvv" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) +/obj/machinery/computer/rdconsole/unlocked, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "lvE" = ( -/obj/machinery/roulette, +/obj/machinery/modular_computer/preset/id{ + dir = 4 + }, /turf/open/floor/carpet/royalblack, /area/station/command/heads_quarters/hos) "lvR" = ( @@ -39887,6 +42519,12 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/space/basic, /area/station/solars/starboard/aft) +"lwd" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "lwf" = ( /turf/open/floor/glass, /area/station/security/brig) @@ -39897,11 +42535,14 @@ /turf/open/floor/iron/smooth_edge{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "lwu" = ( /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"lwA" = ( +/turf/open/openspace, +/area/station/maintenance/starboard/upper) "lwB" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -39916,21 +42557,32 @@ /turf/open/floor/iron/white/smooth_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "lwJ" = ( -/obj/structure/railing, -/obj/effect/turf_decal/siding/red, -/obj/effect/turf_decal/tile/red/opposingcorners{ +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) +"lxa" = ( +/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/yellow/opposingcorners{ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"lwT" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input{ +/area/station/engineering/storage/tech) +"lxb" = ( +/obj/machinery/modular_computer/preset/id{ dir = 1 }, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos/upper) +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "lxh" = ( /obj/machinery/newscaster/directional/north, /obj/machinery/deepfryer, @@ -39952,6 +42604,12 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"lxq" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "lxs" = ( /obj/effect/turf_decal/trimline/yellow/corner, /obj/item/storage/toolbox/electrical{ @@ -39973,6 +42631,15 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) +"lxy" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/service_all, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "lxz" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/machinery/power/smes{ @@ -39980,16 +42647,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"lxJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"lxN" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/foyer) "lxQ" = ( /obj/machinery/smartfridge/extract/preloaded, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -40007,18 +42665,24 @@ /obj/machinery/light/small/blacklight/directional/north, /turf/open/floor/carpet/stellar, /area/station/maintenance/hallway/abandoned_recreation) +"lxV" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "lxW" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/shaft_miner, +/obj/machinery/light/directional/west, /obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 + dir = 8 }, -/obj/structure/closet/secure_closet/miner, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"lxX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) "lxY" = ( /obj/effect/turf_decal/bot_white, /obj/effect/decal/cleanable/dirt, @@ -40027,37 +42691,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) -"lyd" = ( -/obj/structure/broken_flooring/corner/directional/east, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "lys" = ( /obj/machinery/camera/autoname/directional/west, /turf/open/floor/engine, /area/station/service/hydroponics) -"lyw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/table, -/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/folder/yellow{ - pixel_x = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) +"lyv" = ( +/turf/open/floor/plating/elevatorshaft, +/area/station/engineering/atmos) "lyx" = ( /obj/machinery/door/window/brigdoor/security/cell/left/directional/east{ id = "Cell 3"; @@ -40069,24 +42709,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) -"lyz" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 5 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) "lyA" = ( /obj/structure/table, -/obj/machinery/status_display/ai/directional/north, -/obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/ai_upload"; - name = "AI Upload Turret Control"; - pixel_x = 25; - req_access = list("minisat") - }, /obj/item/book/manual/wiki/security_space_law{ pixel_x = -4; pixel_y = 2 @@ -40100,11 +42724,25 @@ pixel_y = 7 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/camera/autoname/directional/north{ - network = list("aiupload") - }, +/obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) +"lyM" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Engineering Project Room" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/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/cable, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"lyO" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "lyP" = ( /obj/structure/railing/corner, /obj/structure/cable, @@ -40130,28 +42768,60 @@ }, /obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"lzg" = ( +/obj/structure/table, +/obj/item/stamp/denied{ + pixel_x = 8; + pixel_y = 1 + }, +/obj/item/stamp/granted{ + pixel_x = 9; + pixel_y = 8 + }, +/obj/item/paper_bin{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/item/pen{ + pixel_y = 5 + }, +/turf/open/floor/wood/large, +/area/station/engineering/lobby) "lzk" = ( /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/carpet, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "lzp" = ( -/obj/machinery/photocopier/prebuilt, -/obj/item/storage/toolbox/electrical, +/obj/machinery/light_switch/directional/east, +/obj/machinery/flasher/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) -"lzG" = ( -/obj/effect/turf_decal/trimline/white/line{ - dir = 8 +/area/station/ai/upload/chamber) +"lzy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/assistant, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"lzH" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/station/maintenance/aft) "lzO" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 @@ -40161,34 +42831,46 @@ }, /turf/open/floor/iron, /area/station/science/research) -"lzP" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) "lzR" = ( /obj/structure/closet/crate/trashcart/filled, /obj/machinery/light/very_dim/directional/north, /turf/open/floor/plating, /area/station/maintenance/disposal) -"lzZ" = ( -/obj/item/statuebust{ - pixel_y = 12 +"lzW" = ( +/obj/structure/table/glass, +/obj/item/clothing/gloves/latex/nitrile, +/obj/item/stack/sticky_tape/surgical{ + pixel_x = -4; + pixel_y = 5 }, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/fore) +/turf/open/floor/iron/dark/textured_half, +/area/station/medical/surgery) "lAf" = ( /turf/open/floor/iron/sepia, /area/station/hallway/secondary/construction) "lAg" = ( /obj/effect/mapping_helpers/broken_floor, +/obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/station/maintenance/starboard/central) "lAl" = ( /turf/closed/wall, /area/station/science/robotics/lab) +"lAn" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"lAo" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "lAs" = ( /obj/machinery/camera/autoname/directional/east, /turf/open/openspace, @@ -40201,11 +42883,6 @@ /obj/item/circuitboard/aicore, /turf/open/floor/wood, /area/station/command/heads_quarters/rd) -"lAE" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "lAF" = ( /obj/machinery/light/warm/dim/directional/south, /obj/effect/turf_decal/tile/dark_green{ @@ -40242,10 +42919,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) -"lAJ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "lAN" = ( /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) @@ -40271,8 +42944,9 @@ id = "CargowatchShutter"; name = "Outside Shutter" }, +/obj/structure/cable, /turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/area/station/command/heads_quarters/qm) "lAS" = ( /obj/structure/transit_tube/horizontal, /obj/structure/lattice/catwalk, @@ -40328,28 +43002,12 @@ }, /turf/open/floor/iron, /area/station/science/lobby) -"lBo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/pen/blue{ - pixel_x = -9; - pixel_y = 9 - }, -/obj/structure/fluff/paper/stack{ - desc = "A stack of various papers, absolutely unreadable due to scorch marks and aging."; - dir = 1 +"lBy" = ( +/obj/structure/railing/corner/end/flip{ + dir = 8 }, -/obj/structure/fluff/paper/corner, -/obj/effect/spawner/random/maintenance, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"lBw" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/landmark/blobstart, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/aft) +/turf/open/floor/eighties, +/area/station/maintenance/department/crew_quarters/dorms) "lBA" = ( /obj/structure/table/reinforced/rglass, /obj/item/mod/module/plasma_stabilizer{ @@ -40366,33 +43024,10 @@ }, /turf/open/floor/glass, /area/station/security/brig) -"lBF" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/emergency, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"lBQ" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/fax{ - fax_name = "Engineering Lobby"; - name = "Engineering Lobby Fax Machine" - }, -/turf/open/floor/wood, -/area/station/engineering/lobby) -"lBS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/cigbutt{ - pixel_x = 8; - pixel_y = -2 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"lBD" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/gravity_generator) "lBX" = ( /obj/machinery/quantum_server, /obj/effect/decal/cleanable/dirt/dust, @@ -40407,15 +43042,6 @@ /obj/item/paperplane/syndicate, /turf/open/floor/iron/dark, /area/station/maintenance/port) -"lCf" = ( -/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 = 2 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "lCl" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/west, @@ -40423,28 +43049,6 @@ /obj/structure/closet/crate/trashcart/filled, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"lCw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"lCO" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/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) "lCX" = ( /obj/structure/railing{ dir = 1 @@ -40455,6 +43059,27 @@ /obj/effect/turf_decal/tile/dark_red, /turf/open/floor/iron/dark, /area/station/science/cytology) +"lCY" = ( +/obj/structure/table, +/obj/item/paper{ + pixel_y = 4 + }, +/obj/item/phone{ + pixel_x = -5; + pixel_y = 11 + }, +/obj/item/pen/blue{ + pixel_x = -5; + pixel_y = -1 + }, +/obj/item/stamp/granted{ + pixel_x = 13; + pixel_y = 12 + }, +/obj/machinery/computer/security/telescreen/aiupload/directional/north, +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/station/ai/upload/foyer) "lDc" = ( /turf/closed/wall, /area/station/security/prison) @@ -40477,16 +43102,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, -/area/station/ai_monitored/turret_protected/ai) -"lDh" = ( -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "Plasma Multideck Adapter" - }, -/obj/machinery/meter{ - name = "Plasma meter" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/area/station/ai/satellite/chamber) "lDj" = ( /obj/structure/chair/office{ dir = 1 @@ -40514,35 +43130,41 @@ dir = 1 }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lDE" = ( /turf/closed/wall, /area/station/commons/vacant_room/commissary) -"lEe" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood, -/area/station/medical/medbay/central) -"lEf" = ( -/obj/structure/railing{ +"lDH" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) +"lDI" = ( +/obj/structure/disposalpipe/segment{ dir = 5 }, -/obj/structure/reagent_dispensers/water_cooler, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"lEi" = ( -/obj/structure/disposalpipe/trunk/multiz/down{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"lEj" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 8 +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/engineering/lobby) +"lEd" = ( +/obj/machinery/camera/autoname/directional/east, +/turf/open/openspace, +/area/station/commons/toilet/restrooms) +"lEe" = ( +/obj/structure/bed/medical/emergency, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) +"lEl" = ( +/obj/machinery/holopad, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"lEm" = ( +/obj/machinery/roulette, +/obj/effect/turf_decal/delivery/white{ + color = "#ff6600" }, -/obj/effect/landmark/start/atmospheric_technician, -/obj/machinery/light/directional/south, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "lEo" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/trimline/yellow/arrow_ccw{ @@ -40556,18 +43178,9 @@ dir = 4 }, /area/station/hallway/primary/fore) -"lEy" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, -/obj/structure/railing{ - dir = 5 - }, -/turf/open/openspace, -/area/station/engineering/atmos/project) "lEB" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/service/library) "lEC" = ( @@ -40594,24 +43207,11 @@ }, /turf/open/floor/wood/large, /area/station/service/library) -"lEJ" = ( -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "SM_shutters"; - name = "Supermatter Radiation Shutters" - }, -/obj/structure/cable/layer1, -/turf/open/floor/plating, -/area/station/engineering/supermatter) -"lEO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/trunk/multiz/down{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/textured_large, -/area/station/maintenance/port) +"lEH" = ( +/obj/structure/closet/secure_closet/engineering_welding, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "lEP" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/directions/lavaland/directional/south, @@ -40668,7 +43268,10 @@ }, /obj/structure/sign/poster/official/nanotrasen_logo/directional/north, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"lFF" = ( +/turf/open/floor/wood, +/area/station/maintenance/starboard) "lFH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40684,13 +43287,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/library/printer) -"lFW" = ( -/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/engine, -/area/station/engineering/supermatter/room) "lFZ" = ( /obj/machinery/power/terminal{ dir = 1 @@ -40701,7 +43297,7 @@ name = "AI Chamber Requests Console" }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lGy" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -40716,18 +43312,39 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 9 }, -/obj/structure/table/reinforced, -/obj/item/pai_card{ - pixel_x = 6; - pixel_y = 12 - }, /obj/machinery/light/directional/west, -/obj/effect/spawner/random/food_or_drink/donkpockets{ - pixel_y = -3; - pixel_x = -5 +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 }, /turf/open/floor/iron/textured, /area/station/cargo/storage) +"lGC" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Engineering - Showers" + }, +/obj/structure/closet/radiation, +/obj/item/clothing/glasses/meson, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 8 + }, +/area/station/engineering/main) +"lGE" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) +"lGO" = ( +/obj/machinery/meter{ + name = "Mixed Air Tank In" + }, +/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos) "lGT" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -40738,6 +43355,15 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) +"lGV" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "lHa" = ( /obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, @@ -40746,11 +43372,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/medical) -"lHi" = ( -/obj/structure/cable, -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "lHp" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -40765,10 +43386,28 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) +"lHz" = ( +/obj/effect/mapping_helpers/broken_floor, +/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/dark, +/area/station/engineering/atmos/office) "lHE" = ( /obj/machinery/holopad, /turf/open/floor/glass, /area/station/service/kitchen) +"lHI" = ( +/obj/structure/chair/office, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/obj/structure/cable, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "lHK" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -40781,19 +43420,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/lobby) -"lHT" = ( -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"lHY" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 4 - }, -/obj/effect/turf_decal/siding/brown/corner{ - dir = 8 - }, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) "lIi" = ( /obj/item/cigbutt{ pixel_x = -12; @@ -40801,55 +43427,25 @@ }, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"lIk" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"lIm" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/computer/atmos_control/air_tank, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) -"lIp" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/green/filled/mid_joiner, -/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/textured_large, -/area/station/medical/virology) "lIr" = ( /turf/closed/wall, /area/station/maintenance/port/aft) -"lIw" = ( -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "Plasma Multideck Adapter"; - dir = 8 - }, -/obj/machinery/meter{ - name = "Plasma meter" - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "lIA" = ( /obj/effect/decal/cleanable/blood/oil/slippery, /turf/open/floor/plating, /area/station/engineering/storage_shared) -"lIC" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"lIF" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/stack{ + dir = 9 }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/obj/effect/spawner/random/bureaucracy/paper, +/obj/structure/fluff/paper{ + dir = 1 + }, +/obj/structure/sign/flag/nanotrasen/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/aft) "lIM" = ( /obj/machinery/door/airlock/public/glass{ name = "Courtroom" @@ -40860,21 +43456,20 @@ }, /turf/open/floor/wood, /area/station/security/courtroom) +"lIP" = ( +/obj/machinery/camera/autoname/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) "lIS" = ( -/obj/effect/landmark/navigate_destination/chemfactory, -/turf/open/floor/engine/hull/air, -/area/station/medical/chemistry) -"lIT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +/obj/machinery/door/poddoor/preopen{ + id = "cmoprivacy"; + name = "Privacy Shutter" }, /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) "lJe" = ( /obj/effect/turf_decal/siding/thinplating_new/light/corner, /obj/effect/turf_decal/trimline/purple/corner, @@ -40931,6 +43526,13 @@ }, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) +"lJK" = ( +/obj/item/radio/intercom/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/dorms) "lJM" = ( /obj/structure/chair/stool/bar/directional/east, /obj/effect/landmark/start/hangover, @@ -40952,49 +43554,32 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/turf/open/floor/carpet, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) -"lKm" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"lKl" = ( +/obj/machinery/atmospherics/components/binary/pump/on/pink/visible/layer2{ + dir = 4; + name = "Incinerator Output" }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +/obj/effect/turf_decal/trimline/purple, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"lKG" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/structure/disposalpipe/trunk/multiz, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "lKK" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/engine, /area/station/science/xenobiology) -"lKV" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"lKZ" = ( -/obj/structure/rack, -/obj/item/circuitboard/machine/oven{ - pixel_y = 3 - }, -/obj/item/circuitboard/machine/oven, -/obj/item/circuitboard/machine/oven{ - pixel_y = -3 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"lLa" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) "lLe" = ( -/obj/machinery/button/door/directional/west{ - id = "Disposal Exit"; - name = "Disposal Vent Control" +/obj/machinery/conveyor{ + dir = 8; + id = "garbage" }, +/obj/effect/turf_decal/stripes/white/box, /turf/open/floor/plating, /area/station/maintenance/disposal) "lLh" = ( @@ -41030,7 +43615,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lLF" = ( /obj/structure/filingcabinet/security, /obj/effect/spawner/random/food_or_drink/booze{ @@ -41040,11 +43625,37 @@ /obj/item/clothing/mask/animal/frog, /turf/open/floor/iron/grimy, /area/station/security/detectives_office/private_investigators_office) +"lLG" = ( +/obj/effect/spawner/structure/window, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "lLI" = ( /obj/effect/turf_decal/siding/wood/corner, /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"lLN" = ( +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"lLR" = ( +/obj/machinery/firealarm/directional/north, +/obj/structure/sign/poster/official/safety_internals/directional/east, +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/engine, +/area/station/medical/chemistry) +"lLT" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "Waste Release"; + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "lLY" = ( /obj/effect/turf_decal/siding/thinplating_new, /obj/effect/turf_decal/loading_area{ @@ -41065,6 +43676,11 @@ /obj/effect/mapping_helpers/mail_sorting/service/bar, /turf/open/floor/wood, /area/station/hallway/secondary/service) +"lMj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "lMt" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/oil, @@ -41072,19 +43688,13 @@ /turf/open/floor/iron, /area/station/construction/storage_wing) "lMx" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ - dir = 1 - }, -/turf/open/openspace, -/area/station/medical/cryo) +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/turf/open/floor/holofloor/dark, +/area/station/command/heads_quarters/cmo) "lMy" = ( -/obj/structure/bed/dogbed/ian, /mob/living/basic/pet/dog/corgi/ian, -/turf/open/floor/wood, +/obj/structure/bed/dogbed/ian, +/turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) "lMD" = ( /obj/structure/bed, @@ -41101,7 +43711,7 @@ /turf/open/floor/iron/dark/textured_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "lMJ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -41113,28 +43723,30 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/security/prison) -"lMS" = ( -/obj/effect/turf_decal/siding/wood{ +"lMT" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Cargo Lockdown Shutters"; + id = "cargolockdown"; dir = 8 }, +/obj/machinery/door/window/brigdoor/left/directional/east{ + name = "Cargo Desk"; + req_access = list("cargo") + }, /obj/structure/table/reinforced, -/obj/item/binoculars, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) -"lMT" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 +/obj/machinery/door/firedoor, +/obj/structure/desk_bell{ + pixel_x = -10; + pixel_y = 9 }, -/obj/machinery/disposal/bin/tagger, -/obj/effect/turf_decal/delivery, -/obj/structure/disposalpipe/trunk{ - dir = 4 +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/item/folder/yellow{ + pixel_x = 3; + pixel_y = 1 }, +/obj/item/pen, /turf/open/floor/iron, /area/station/cargo/storage) -"lMU" = ( -/turf/open/floor/iron/vaporwave, -/area/station/maintenance/starboard/lesser) "lNc" = ( /obj/item/toy/plush/moth{ name = "Spanner 2, her sibling"; @@ -41178,21 +43790,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "lNp" = ( /obj/structure/lattice, /obj/effect/spawner/random/maintenance, /turf/open/openspace, /area/station/maintenance/port/aft) -"lNs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate, -/obj/item/toy/foamfinger, -/obj/item/toy/foamfinger, -/obj/item/toy/foamfinger, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "lNx" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -41260,17 +43863,20 @@ pixel_x = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"lOf" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing/corner, +/obj/machinery/duct, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "lOg" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"lOh" = ( -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "lOy" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -41284,21 +43890,33 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/port) +"lOD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/engineering/atmospherics_portable, +/turf/open/floor/plating, +/area/station/maintenance/hallway/abandoned_recreation) "lPc" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_y = 4; + pixel_x = 5 }, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ - dir = 1 +/obj/item/reagent_containers/dropper{ + pixel_y = -4 }, -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8; + pixel_y = 7 }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) +"lPi" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "lPm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -41308,8 +43926,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 }, -/obj/machinery/light_switch/directional/north, -/obj/machinery/light/directional/north, /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, @@ -41317,7 +43933,7 @@ "lPo" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "lPt" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -41328,13 +43944,58 @@ /turf/open/floor/iron/dark, /area/station/science/ordnance) "lPw" = ( -/obj/structure/flora/bush/fullgrass/style_random, -/turf/open/floor/grass, -/area/station/hallway/primary/central) +/obj/structure/sign/directions/engineering{ + dir = 4 + }, +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_y = -10 + }, +/turf/closed/wall/r_wall, +/area/station/science/lab) +"lPI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock{ + id_tag = "Cabin8"; + name = "Cabin 8" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/commons/dorms) +"lPP" = ( +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/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/atmos/glass{ + name = "Atmospherics" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmosengimainttriangle" + }, +/obj/effect/landmark/navigate_destination/atmos, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"lPR" = ( +/obj/machinery/suit_storage_unit/atmos, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/glass/plasma, +/area/station/engineering/atmos/upper) "lPS" = ( /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/security/warden) +"lQc" = ( +/obj/structure/table/optable, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/morgue) "lQd" = ( /obj/structure/table/wood, /obj/machinery/recharger{ @@ -41370,21 +44031,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"lQE" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/structure/statue/bronze/marx{ - pixel_x = 5; - pixel_y = 16 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "lQV" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 6 +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/obj/machinery/holopad, -/turf/open/floor/iron/white/textured_large, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, /area/station/medical/medbay/central) "lRd" = ( /obj/structure/railing, @@ -41407,6 +44061,7 @@ pixel_x = 5 }, /obj/structure/railing, +/obj/machinery/door/firedoor/border_only, /turf/open/floor/iron, /area/station/cargo/storage) "lRj" = ( @@ -41440,32 +44095,21 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"lRr" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 6 +"lRs" = ( +/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/suit_storage_unit/engine, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) -"lRz" = ( -/obj/structure/safe/floor, -/obj/item/stack/spacecash/c1000, -/obj/item/stack/spacecash/c500, -/obj/item/stack/spacecash/c100, -/obj/item/stack/spacecash/c100, -/obj/item/stack/spacecash/c100, -/obj/item/stack/spacecash/c100, -/obj/item/stack/spacecash/c20, -/obj/item/stack/spacecash/c20, -/obj/item/stack/spacecash/c20, -/obj/item/stack/spacecash/c20, -/obj/item/stack/spacecash/c1, -/obj/item/stack/spacecash/c1, -/obj/item/stack/spacecash/c1, -/obj/item/stack/spacecash/c1, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"lRD" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/maintenance/starboard/fore/upper) "lRP" = ( /obj/effect/turf_decal/trimline/yellow/arrow_cw{ dir = 8 @@ -41478,6 +44122,36 @@ dir = 8 }, /area/station/hallway/primary/fore) +"lRQ" = ( +/obj/item/reagent_containers/cup/coffeepot, +/obj/machinery/coffeemaker, +/obj/structure/sign/poster/official/soft_cap_pop_art/directional/west, +/obj/item/storage/box/coffeepack, +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_y = 14; + pixel_x = 8 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_y = 14 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_y = 14; + pixel_x = -8 + }, +/turf/open/floor/wood/large, +/area/station/medical/break_room) +"lRX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/turf/closed/wall/r_wall, +/area/station/maintenance/aft/upper) +"lRY" = ( +/obj/effect/spawner/structure/window, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/security/courtroom) "lSe" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -41507,16 +44181,31 @@ /turf/open/floor/carpet/royalblack, /area/station/command/heads_quarters/hos) "lSJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/directional/east, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/black, +/area/station/ai/upload/chamber) "lSL" = ( -/obj/structure/railing/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) +"lSM" = ( +/obj/structure/chair/pew{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/hangover, +/turf/open/floor/carpet, +/area/station/maintenance/starboard) "lSP" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/wood, @@ -41531,6 +44220,14 @@ }, /turf/open/floor/iron/large, /area/station/hallway/primary/central) +"lTd" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/machinery/atmospherics/components/binary/pump/on/cyan/visible/layer5, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "lTw" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/dark_blue{ @@ -41561,19 +44258,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/wood/large, /area/station/service/theater_dressing) -"lTA" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 4 - }, -/obj/machinery/disposal/bin/tagger, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "lTD" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron/dark/textured_large, @@ -41582,13 +44266,15 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/security/courtroom) -"lTX" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 9 +"lUg" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/obj/effect/turf_decal/trimline/green/filled/corner, +/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/medical/virology) "lUk" = ( /obj/structure/railing, /obj/structure/cable, @@ -41598,60 +44284,48 @@ dir = 1 }, /turf/open/floor/catwalk_floor/iron_white, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "lUn" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 10 }, /turf/open/floor/iron/textured_large, /area/station/medical/virology) -"lUp" = ( -/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/starboard/lesser) "lUC" = ( /obj/machinery/camera/autoname/directional/south, /turf/open/openspace, /area/station/engineering/lobby) +"lUD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/floor/broken, +/turf/open/floor/eighties, +/area/station/maintenance/hallway/abandoned_recreation) "lUI" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 8 +/obj/machinery/shower/directional/east, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/digital_clock/directional/west, +/obj/effect/turf_decal/siding/blue/end{ + dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/item/hemostat{ - pixel_x = 4 +/turf/open/floor/iron/showroomfloor, +/area/station/medical/surgery) +"lUJ" = ( +/obj/structure/railing{ + dir = 1 }, -/obj/item/hemostat, -/obj/item/clothing/gloves/latex{ - pixel_y = 6 +/obj/machinery/door/firedoor/border_only{ + dir = 1 }, -/obj/item/clothing/gloves/latex, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) -"lUM" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/table, +/obj/item/toy/figure/paramedic{ + pixel_x = null }, -/turf/closed/wall/r_wall, -/area/station/engineering/lobby) -"lUO" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/machinery/meter/monitored/distro_loop, -/turf/open/floor/iron/freezer, -/area/station/engineering/atmos/pumproom) +/turf/open/floor/glass, +/area/station/medical/medbay/central) "lUV" = ( /obj/machinery/camera/directional/east{ c_tag = "Prison Isolation Cell"; @@ -41664,11 +44338,13 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "lVc" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, /obj/machinery/pdapainter/supply, -/obj/structure/light_construct/directional/north, -/turf/open/floor/iron, -/area/station/maintenance/starboard/central) +/obj/machinery/keycard_auth/wall_mounted/directional/north, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "lVn" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, @@ -41684,11 +44360,18 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) "lVs" = ( -/obj/structure/disposalpipe/trunk/multiz{ - dir = 8 +/obj/structure/table/reinforced, +/obj/item/storage/box/bodybags{ + pixel_x = 4; + pixel_y = 14 }, -/turf/closed/wall, -/area/station/maintenance/port) +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -1; + pixel_y = 7 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/morgue) "lVt" = ( /obj/effect/turf_decal/tile/dark{ dir = 8 @@ -41704,16 +44387,6 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/wood/large, /area/station/medical/psychology) -"lVA" = ( -/obj/machinery/meter, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/door/window/brigdoor/left/directional/east{ - name = "Air Pump Room"; - req_access = list("atmospherics") - }, -/turf/open/floor/iron/freezer, -/area/station/engineering/atmos/pumproom) "lVD" = ( /obj/machinery/door/airlock/engineering/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41722,16 +44395,18 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) -"lVH" = ( -/obj/machinery/computer/records/security{ - dir = 1 - }, -/obj/machinery/computer/security/telescreen/minisat/directional/south{ - name = "AI Ministat Camera Monitor" +"lVF" = ( +/obj/structure/closet/l3closet/scientist, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"lVG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/effect/turf_decal/trimline/red/filled/line, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/engineering) +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "lVK" = ( /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2, /obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4, @@ -41746,6 +44421,16 @@ "lVM" = ( /turf/open/floor/plating, /area/station/construction/mining/aux_base) +"lVR" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/blood/oil, +/obj/item/cigbutt{ + pixel_x = 8; + pixel_y = -2 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "lWc" = ( /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark/smooth_large, @@ -41753,27 +44438,19 @@ "lWf" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/effect/spawner/random/maintenance, -/obj/item/radio/intercom/directional/south, /turf/open/floor/iron/textured, /area/station/cargo/warehouse) -"lWg" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 4; - external_pressure_bound = 120; - name = "killroom vent" - }, -/turf/open/floor/circuit/telecomms, -/area/station/science/xenobiology) "lWn" = ( /obj/structure/chair{ dir = 1 }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"lWs" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos) "lWw" = ( /obj/structure/lattice/catwalk, /obj/structure/table, @@ -41786,17 +44463,23 @@ }, /turf/open/openspace, /area/station/maintenance/port/fore) +"lWD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 2 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "lWK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/glass, /area/station/security/brig) -"lWQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/oil, +"lWS" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/fore/upper) "lWZ" = ( /obj/structure/railing{ dir = 1 @@ -41825,50 +44508,57 @@ /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"lXl" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/engineering/gravity_generator) "lXz" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"lXC" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/lesser) "lXD" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ +/obj/machinery/holopad, +/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/siding/wood{ dir = 1 }, -/turf/open/openspace, -/area/station/medical/cryo) +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/cmo) "lXG" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/freezer/blood, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) -"lXK" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 4 +/obj/item/clothing/gloves/color/blue{ + desc = "An old pair of nitrile gloves, with no sterile properties."; + name = "old nitrile gloves" }, -/turf/open/floor/wood, -/area/station/engineering/lobby) +/obj/structure/rack, +/obj/item/wrench/medical, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "lXM" = ( -/obj/effect/turf_decal/siding/blue/corner{ - dir = 1 +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/trimline/blue/arrow_cw{ + dir = 6 }, -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 1 }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "lXQ" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, @@ -41877,18 +44567,11 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "lXX" = ( -/obj/machinery/stasis, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 4 - }, -/obj/machinery/defibrillator_mount/directional/east, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/obj/machinery/airalarm/directional/north, +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/white/box, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/office) "lYe" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -41928,16 +44611,20 @@ /obj/structure/closet/firecloset, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"lYw" = ( -/obj/structure/chair/stool/directional/west, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/foyer) "lYy" = ( -/obj/machinery/airalarm/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/obj/machinery/fax{ + fax_name = "Medical"; + name = "Medical Fax Machine" + }, +/obj/structure/table, +/obj/structure/cable, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "lYB" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 4 @@ -41949,19 +44636,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "lYC" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/satellite) -"lYT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/terminal{ - dir = 4 +/area/station/ai/satellite/maintenance/storage) +"lYH" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/effect/spawner/random/clothing/backpack, +/obj/effect/turf_decal/tile/dark_green/half/contrasted, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) +/turf/open/floor/iron/dark, +/area/station/commons/locker) "lYW" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -41970,6 +44659,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"lYY" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/firealarm/directional/east, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "lZj" = ( /obj/structure/lattice/catwalk, /obj/structure/sign/poster/contraband/clown/directional/south, @@ -41982,19 +44676,39 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) +"lZm" = ( +/obj/machinery/status_display/ai/directional/east, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/end, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/obj/item/kirbyplants/photosynthetic, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "lZn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/secure_safe/directional/north{ - pixel_x = -23; - pixel_y = 0 +/obj/machinery/light_switch/directional/west, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/obj/item/mod/module/longfall{ - pixel_x = 8; - pixel_y = 20 +/obj/item/storage/photo_album{ + pixel_x = -6; + pixel_y = 2 }, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/carpet, +/obj/item/camera{ + pixel_y = 4; + pixel_x = 6 + }, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) +"lZt" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet, +/area/station/service/chapel) "lZM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/stairs/south, @@ -42004,23 +44718,38 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/fore) "lZV" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "cargoload" + }, /obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/cigbutt{ - pixel_x = 6; - pixel_y = 17 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/item/lighter{ - pixel_x = -7; - pixel_y = 5 +/obj/effect/turf_decal/stripes/line, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/station/cargo/storage) +"lZW" = ( +/obj/effect/spawner/random/food_or_drink/refreshing_beverage{ + pixel_x = 5; + pixel_y = 9 }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/central) +/obj/structure/table, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "mae" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, /area/station/security/office) +"mam" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "mas" = ( /obj/machinery/door/airlock/maintenance{ name = "Security Maintenance" @@ -42058,31 +44787,28 @@ /turf/open/misc/asteroid, /area/station/science/xenobiology/hallway) "maO" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 +/obj/effect/turf_decal/stripes{ + dir = 9 }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"maS" = ( -/obj/machinery/camera/autoname/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/button/door/directional/north{ + id = "evashutter"; + name = "E.V.A. Storage Shutter Control"; + req_access = list("command") }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/turf/open/floor/iron/textured, +/area/station/command/eva) +"mbj" = ( +/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/starboard) "mbk" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/department/science/central) -"mbv" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/lesser) "mbz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42097,14 +44823,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/openspace, /area/station/hallway/secondary/entry) -"mbC" = ( -/obj/structure/chair{ - dir = 1; - pixel_y = -2 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/glass, -/area/station/commons/fitness/recreation) "mbK" = ( /obj/machinery/door/airlock/maintenance{ name = "Virology Maintenance" @@ -42134,6 +44852,7 @@ pixel_x = -4; pixel_y = 5 }, +/obj/effect/turf_decal/siding/green, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "mcb" = ( @@ -42144,6 +44863,12 @@ /obj/item/wrench, /turf/open/openspace, /area/station/construction/storage_wing) +"mch" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/station/maintenance/starboard/fore/upper) "mcj" = ( /obj/structure/railing/corner{ dir = 4 @@ -42177,32 +44902,18 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "mcC" = ( -/obj/structure/lattice/catwalk, -/obj/structure/table/glass, -/obj/item/wrench/medical{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/item/reagent_containers/cup/beaker/cryoxadone{ - pixel_x = 6; - pixel_y = 12 - }, -/obj/item/reagent_containers/cup/beaker/cryoxadone{ - pixel_x = 10; - pixel_y = 6 +/obj/item/radio/intercom/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/obj/item/reagent_containers/cup/beaker/cryoxadone{ - pixel_x = -7; - pixel_y = 4 +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 }, -/turf/open/openspace, -/area/station/medical/cryo) -"mcR" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/cmo) "mcT" = ( /obj/structure/lattice, /obj/effect/spawner/structure/window/reinforced/plasma, @@ -42215,14 +44926,9 @@ pixel_y = 10 }, /obj/item/pen, +/obj/effect/turf_decal/siding/green, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"mcY" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/obj/machinery/shower/directional/east, -/obj/item/mail/junkmail, -/turf/open/floor/iron/freezer, -/area/station/commons/dorms) "mdf" = ( /obj/machinery/computer/mech_bay_power_console{ dir = 8 @@ -42291,6 +44997,18 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"mdW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine/hull/air, +/area/station/commons/fitness/recreation) +"mej" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/computer/security/telescreen/ce/directional/west, +/obj/machinery/light/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "mek" = ( /obj/effect/turf_decal/tile/green/full, /obj/machinery/biogenerator, @@ -42314,20 +45032,6 @@ }, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"men" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/wood, -/obj/item/folder/yellow{ - pixel_x = 3; - pixel_y = 6 - }, -/obj/item/stack/package_wrap{ - pixel_x = 4; - pixel_y = 2 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "meo" = ( /obj/item/kirbyplants/photosynthetic, /obj/effect/turf_decal/trimline/dark_blue/filled/line{ @@ -42346,30 +45050,20 @@ dir = 4 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"meE" = ( -/obj/machinery/camera/autoname/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/layer1, -/obj/machinery/button/door/directional/east{ - id = "SM_shutters"; - name = "Radiation Shutters"; - req_access = list("engineering") - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/area/station/ai/satellite/interior) "meK" = ( /obj/machinery/suit_storage_unit/standard_unit, -/obj/machinery/status_display/evac/directional/west, /obj/machinery/light/directional/west, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "meU" = ( /obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/any/engineering/atmos, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) "meW" = ( @@ -42381,7 +45075,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured_edge, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "meX" = ( /obj/effect/mapping_helpers/airlock/access/all/service/general, /obj/structure/disposalpipe/segment{ @@ -42392,10 +45086,31 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"meY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard) "mff" = ( /obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, +/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/line, +/turf/open/floor/iron/dark/smooth_large, /area/station/command/gateway) +"mfh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/upper) "mfi" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -42403,7 +45118,7 @@ name = "AI Core Shutters" }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "mfn" = ( /obj/structure/table, /obj/item/stack/sheet/plasteel/fifty, @@ -42417,14 +45132,11 @@ /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) "mfs" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white/textured_corner{ - dir = 8 +/obj/effect/turf_decal/siding/dark_blue/inner_corner{ + dir = 1 }, -/area/station/medical/surgery) +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "mfw" = ( /obj/structure/cannon{ dir = 8 @@ -42442,18 +45154,55 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) +"mfF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/railing, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "mfO" = ( -/obj/structure/chair/comfy/brown{ +/obj/structure/table/reinforced/rglass, +/obj/machinery/button/door/directional/south{ + id = "bridge blast"; + name = "Bridge Window Blast Doors"; + req_access = list("command"); + pixel_y = 5 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/turf/open/floor/carpet, -/area/station/command/meeting_room/council) +/obj/machinery/button/door/directional/south{ + id = "bridge blast-2"; + name = "Bridge Access Blast Doors"; + req_access = list("command"); + pixel_y = -5 + }, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"mfR" = ( +/obj/machinery/door/firedoor/border_only, +/obj/structure/railing, +/turf/open/floor/engine/hull/air, +/area/station/medical/medbay/central) "mfS" = ( -/obj/structure/chair/comfy/brown{ +/obj/structure/table/reinforced/rglass, +/obj/structure/secure_safe/caps_spare, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/turf/open/floor/carpet, -/area/station/command/meeting_room/council) +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"mfT" = ( +/obj/structure/sign/warning/radiation/rad_area/directional/east, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/main) "mga" = ( /obj/structure/cable, /obj/machinery/requests_console/directional/east{ @@ -42463,19 +45212,19 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/catwalk_floor/iron_dark, /area/station/cargo/bitrunning/den) -"mgh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction) "mgu" = ( /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) +"mgA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "mgJ" = ( /obj/structure/ladder, /obj/structure/lattice/catwalk, @@ -42489,11 +45238,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/security/execution/education) -"mgM" = ( -/obj/item/radio/headset, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +"mgN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/stack{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/maintenance/aft) +"mgR" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - co2 Cell"; + name = "atmospherics camera" + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/engine/co2, +/area/station/engineering/atmos/upper) "mgS" = ( /obj/structure/table, /obj/item/analyzer{ @@ -42506,12 +45266,20 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"mgT" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/wood, +/area/station/commons/dorms) "mgU" = ( /obj/machinery/door/airlock/silver{ name = "Bathroom" }, /turf/open/floor/iron/freezer, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "mgY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -42531,6 +45299,14 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/glass/reinforced, /area/station/construction/storage_wing) +"mht" = ( +/obj/machinery/computer/atmos_control/mix_tank{ + dir = 2 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "mhI" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -42542,19 +45318,19 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) +"mhO" = ( +/obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/station/cargo/miningoffice) "mhP" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 - }, -/obj/structure/table, -/obj/item/storage/belt/utility{ - pixel_y = 6 +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/pod/old/mass_driver_controller/trash{ + pixel_x = 25 }, -/obj/item/storage/toolbox/mechanical, -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/cargo/storage) +/obj/structure/chair/stool/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "mhQ" = ( /obj/machinery/telecomms/server/presets/science, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -42581,15 +45357,19 @@ /turf/open/floor/engine/hull, /area/space/nearstation) "mie" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/structure/chair/office{ +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Cargo Lockdown Shutters"; + id = "cargolockdown"; dir = 8 }, -/obj/effect/landmark/start/cargo_technician, -/turf/open/floor/iron, +/turf/open/floor/plating, /area/station/cargo/storage) +"mig" = ( +/obj/structure/closet/secure_closet/atmospherics, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/glass/plasma, +/area/station/engineering/atmos/upper) "mik" = ( /obj/structure/closet/radiation, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -42597,34 +45377,15 @@ }, /turf/open/floor/iron, /area/station/science/explab) -"mil" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) -"mip" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/machinery/airalarm/directional/north, -/obj/effect/landmark/start/assistant, -/obj/machinery/camera/autoname/directional/north, -/turf/open/openspace, -/area/station/commons/dorms) "miB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) -"miE" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/item/clothing/shoes/magboots{ - pixel_x = 7; - pixel_y = 16 +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) +/obj/item/radio/intercom/directional/north, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "miL" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/power/apc/auto_name/directional/east, @@ -42656,29 +45417,29 @@ /obj/structure/ladder, /turf/open/space/basic, /area/station/solars/starboard/fore) -"miZ" = ( -/obj/structure/table/wood, -/obj/item/storage/briefcase/secure{ - pixel_x = 3 +"miY" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 9 }, -/obj/effect/turf_decal/siding/wood{ - dir = 10 +/obj/effect/turf_decal/tile/red{ + dir = 4 }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"miZ" = ( /obj/machinery/firealarm/directional/south, -/turf/open/floor/wood, +/obj/item/assembly/flash/handheld{ + pixel_x = -11; + pixel_y = 5 + }, +/obj/structure/table/wood, +/obj/machinery/recharger, +/turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) "mjc" = ( /turf/open/openspace, /area/station/service/library/private) -"mjh" = ( -/obj/structure/broken_flooring/corner/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"mjm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "mju" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -42687,28 +45448,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"mjy" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Gas to Mix" - }, -/obj/effect/turf_decal/trimline/yellow, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"mjB" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"mjN" = ( -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/maintenance/starboard/fore) -"mjV" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating/airless, -/area/station/maintenance/port/aft) "mkd" = ( /obj/effect/decal/cleanable/dirt, /obj/item/banner/red{ @@ -42722,22 +45461,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/space_hut) -"mkq" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/glass, -/area/station/commons/fitness/recreation) -"mkv" = ( -/obj/structure/table, -/obj/structure/bedsheetbin/empty{ - pixel_y = 6 +"mkt" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) -"mkI" = ( /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/firedoor, /turf/open/floor/iron, /area/station/commons/dorms) "mkK" = ( @@ -42753,33 +45482,40 @@ dir = 4 }, /turf/open/floor/iron/freezer, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "mkR" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 +/obj/structure/sign/poster/random/directional/north, +/obj/structure/railing{ + dir = 4 }, -/obj/structure/table/wood/fancy/orange, -/obj/item/reagent_containers/cup/glass/bottle/whiskey{ - pixel_x = -5; - pixel_y = 18 +/obj/effect/turf_decal/stripes/end{ + dir = 1 }, -/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ - pixel_x = -4; - pixel_y = 4 +/turf/open/floor/iron/textured, +/area/station/cargo/storage) +"mlc" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"mlj" = ( +/obj/structure/table, +/obj/item/aicard, +/obj/item/ai_module/reset, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 }, -/obj/item/food/fortunecookie{ - pixel_x = 10; - pixel_y = 4 +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"mlx" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 }, +/obj/machinery/newscaster/directional/north, +/obj/machinery/light/warm/directional/north, /turf/open/floor/iron, -/area/station/command/heads_quarters/qm) -"mkV" = ( -/obj/machinery/light_switch/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/dark, -/area/station/engineering/break_room) +/area/station/engineering/lobby) "mlL" = ( /obj/structure/kitchenspike, /obj/machinery/power/apc/auto_name/directional/west, @@ -42790,12 +45526,11 @@ /obj/structure/lattice, /turf/open/openspace, /area/station/commons/vacant_room/office) -"mmb" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 +"mma" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/obj/machinery/vending/cigarette, -/turf/open/floor/wood, +/turf/open/floor/iron, /area/station/commons/fitness/recreation) "mmi" = ( /obj/machinery/camera/directional/north{ @@ -42815,23 +45550,55 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/rd) -"mmt" = ( +"mmM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet, +/area/station/maintenance/starboard) +"mmO" = ( /obj/structure/lattice/catwalk, -/obj/machinery/firealarm/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/openspace, -/area/station/engineering/atmos/project) -"mmM" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/broken_flooring/side/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) +/obj/machinery/duct, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) +"mmP" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/storage/briefcase/secure{ + pixel_x = 3 + }, +/obj/machinery/camera/autoname/directional/south, +/obj/item/folder/blue{ + pixel_x = 4; + pixel_y = -6 + }, +/obj/item/toy/figure/hop{ + pixel_x = -1; + pixel_y = 7 + }, +/obj/item/toy/figure/ian{ + pixel_x = -8; + pixel_y = 4 + }, +/turf/open/floor/wood/tile, +/area/station/command/heads_quarters/hop) "mmS" = ( -/obj/machinery/light/small/broken, -/turf/closed/wall/r_wall, -/area/station/maintenance/central) +/obj/effect/turf_decal/trimline/yellow/warning, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters{ + dir = 1; + id = "evashutter"; + name = "E.V.A. Storage Shutter" + }, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "mmU" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42839,6 +45606,17 @@ /obj/structure/sign/painting/large/library, /turf/open/openspace, /area/station/maintenance/port/fore) +"mmW" = ( +/obj/machinery/door/poddoor/massdriver_ordnance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmos_shield_gen/active, +/obj/machinery/atmos_shield_gen/active{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft) "mmX" = ( /obj/effect/turf_decal/tile/dark_red{ dir = 1 @@ -42860,6 +45638,13 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"mnf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/engineering/atmos/upper) "mnn" = ( /obj/effect/mapping_helpers/airlock/locked, /obj/effect/mapping_helpers/airlock/welded, @@ -42895,6 +45680,10 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/wood/tile, /area/station/security/detectives_office/private_investigators_office) +"mnK" = ( +/obj/structure/sign/departments/restroom/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "mnQ" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -42919,17 +45708,9 @@ /turf/open/floor/iron/dark/textured_large, /area/station/science/zoo) "moq" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/obj/machinery/brm, -/obj/machinery/conveyor{ - dir = 8; - id = "mining" - }, -/obj/structure/railing{ - dir = 1 - }, +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/structure/closet/secure_closet/miner, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/cargo/miningoffice) "mox" = ( @@ -42955,7 +45736,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) +"moO" = ( +/obj/structure/sign/poster/contraband/random/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction) "mpd" = ( /obj/machinery/vatgrower{ dir = 4 @@ -42975,18 +45760,33 @@ /obj/effect/turf_decal/siding/blue{ dir = 9 }, -/obj/machinery/computer/rdconsole, /obj/structure/railing{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/bridge) +/obj/effect/turf_decal/trimline/dark_blue/filled/end{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "mpm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/security/interrogation) +"mpp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/textured_large, +/area/station/medical/abandoned) "mpt" = ( /obj/structure/table, /obj/item/multitool{ @@ -43011,16 +45811,21 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/iron/dark, /area/station/command/gateway) +"mpK" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "mpT" = ( /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/maintenance/port) -"mpX" = ( -/obj/structure/table/reinforced, -/obj/item/binoculars, -/obj/item/binoculars, +"mpW" = ( +/obj/item/trash/can, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/port) "mqa" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -43044,11 +45849,6 @@ /obj/item/storage/fancy/donut_box, /turf/open/floor/iron/dark, /area/station/security/warden) -"mqb" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) "mqc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43060,18 +45860,31 @@ /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) "mqm" = ( -/obj/item/kirbyplants/random, -/obj/machinery/airalarm/directional/west, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/turf/open/floor/carpet, +/obj/machinery/light_switch/directional/west{ + pixel_x = -24 + }, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) "mqt" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/structure/sign/poster/official/obey/directional/north, /turf/open/floor/iron/dark, /area/station/maintenance/port) +"mqu" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 1 + }, +/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/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "mqv" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/structure/railing/corner, @@ -43094,14 +45907,23 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/carpet, /area/station/security/courtroom) +"mqN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "mqQ" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/effect/landmark/navigate_destination/med, -/mob/living/basic/bot/medbot, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "mqT" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/shuttle/mining/common{ @@ -43153,12 +45975,6 @@ }, /turf/open/floor/plating/elevatorshaft, /area/station/service/kitchen) -"mrq" = ( -/obj/structure/chair/sofa/corner/brown{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) "mrs" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/north, @@ -43166,15 +45982,21 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/space_hut) +"mrA" = ( +/obj/effect/turf_decal/siding{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/white/line, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "mrC" = ( /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark/textured_half, /area/station/science/ordnance/storage) -"mrE" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/command/heads_quarters/cmo) "mrM" = ( /obj/machinery/light/directional/south, /obj/structure/disposalpipe/segment{ @@ -43193,7 +46015,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/eva, /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "mrS" = ( /obj/structure/ladder, /obj/effect/decal/cleanable/dirt, @@ -43210,11 +46032,23 @@ dir = 1 }, /area/station/science/robotics/lab) -"msm" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +"msd" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/yellow/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/mid_joiner{ + dir = 4 + }, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) +"msq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "msr" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/girder, @@ -43239,22 +46073,48 @@ }, /turf/open/floor/iron/dark, /area/station/science/lobby) +"msC" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Loop to Freezer" + }, +/obj/effect/turf_decal/trimline/yellow, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "msF" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 4 +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white/textured_large, +/turf/open/floor/iron/dark, /area/station/medical/medbay/central) "msK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"mtg" = ( -/obj/structure/sign/poster/official/soft_cap_pop_art/directional/west, -/turf/open/openspace, -/area/station/maintenance/starboard/fore) +"msQ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/cigbutt{ + pixel_x = 8; + pixel_y = -2 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) +"mtd" = ( +/obj/effect/turf_decal/trimline/white/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "mth" = ( /obj/machinery/holopad, /turf/open/floor/wood, @@ -43301,12 +46161,13 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) -"mtw" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +"mtv" = ( +/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/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/central) "mtz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43327,11 +46188,16 @@ pixel_y = 2 }, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "mtC" = ( /obj/structure/closet/crate/goldcrate, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) +"mtM" = ( +/obj/effect/landmark/start/atmospheric_technician, +/obj/machinery/holopad, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) "mtP" = ( /obj/item/knife/kitchen{ pixel_x = 10; @@ -43371,9 +46237,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/kitchen, /area/station/maintenance/port/aft) -"mur" = ( -/turf/open/floor/iron/dark, -/area/station/engineering/storage) "mus" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -43422,18 +46285,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden/abandoned) -"muE" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) -"muF" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/lesser) "muG" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 8; @@ -43448,6 +46299,16 @@ }, /turf/open/floor/iron/dark, /area/station/security/medical) +"muK" = ( +/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/engineering{ + name = "Tech Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "muN" = ( /obj/machinery/computer/mecha{ dir = 1 @@ -43465,27 +46326,25 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/hallway/secondary/entry) -"muW" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2{ - dir = 8 +"mva" = ( +/obj/structure/sign/warning/directional/west, +/turf/open/space/basic, +/area/space/nearstation) +"mvd" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) "mvf" = ( /obj/machinery/door/window/right/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/greater) "mvq" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/machinery/cell_charger, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/turf/open/floor/carpet/black, +/area/station/ai/upload/chamber) "mvu" = ( /obj/effect/turf_decal/trimline/dark, /obj/machinery/airalarm/directional/west, @@ -43508,29 +46367,30 @@ /obj/machinery/holopad, /turf/open/floor/wood/large, /area/station/service/library) +"mvT" = ( +/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/catwalk_floor, +/area/station/maintenance/starboard/fore) +"mvU" = ( +/obj/structure/cable, +/turf/closed/wall/r_wall, +/area/station/engineering/supermatter/room/upper) "mwd" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/machinery/door/airlock/medical{ - name = "Medbay Storage" + name = "Patient Room" }, +/obj/effect/mapping_helpers/airlock/access/any/medical/general, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/full, /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/access/all/medical/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/storage) -"mwh" = ( -/obj/structure/lattice, -/obj/structure/disposalpipe/segment, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) -"mwj" = ( -/obj/structure/chair/stool/directional/north, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_a) "mwm" = ( /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/plating, @@ -43558,6 +46418,12 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/service/lawoffice) +"mwK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/starboard/central/upper) "mwL" = ( /obj/effect/turf_decal/bot_white/left, /turf/open/floor/iron/dark/textured_large, @@ -43575,20 +46441,10 @@ /turf/open/floor/wood, /area/station/maintenance/port/aft) "mwS" = ( -/obj/machinery/door/airlock/mining{ - name = "Cargo Bay" - }, -/obj/machinery/door/firedoor, -/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/general, +/obj/machinery/computer/cargo/request, /obj/effect/turf_decal/tile/brown/fourcorners, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, /turf/open/floor/iron, -/area/station/cargo/storage) +/area/station/hallway/primary/starboard) "mwY" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/effect/turf_decal/siding/red/corner{ @@ -43596,6 +46452,27 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) +"mxj" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/medical/chemistry) +"mxl" = ( +/obj/item/food/sandwich/cheese, +/obj/structure/table/wood, +/obj/machinery/computer/records/medical/laptop, +/turf/open/floor/carpet/cyan, +/area/station/command/heads_quarters/cmo) +"mxp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "mxF" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -43619,19 +46496,23 @@ }, /obj/effect/spawner/random/clothing, /turf/open/floor/iron/checker, -/area/station/ai_monitored/turret_protected/aisat_interior) -"mxM" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 +/area/station/ai/satellite/interior) +"mxJ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper{ + dir = 9 }, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/floor/plating, +/area/station/maintenance/aft) +"mxM" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/storage/medkit/regular, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "mxO" = ( /obj/machinery/door/airlock/hatch{ name = "Telecomms Server Room" @@ -43653,19 +46534,13 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "myh" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/turf/open/floor/iron/white/textured_large, +/turf/open/floor/iron/dark, /area/station/medical/medbay/central) "mym" = ( /obj/effect/turf_decal/siding/dark, @@ -43674,19 +46549,27 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"myt" = ( -/obj/structure/lattice/catwalk, -/obj/structure/grille, -/turf/open/space/basic, -/area/space/nearstation) +/area/station/ai/satellite/chamber) "myx" = ( /turf/closed/wall, /area/station/service/library/private) "myD" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) +/obj/structure/table/wood, +/obj/item/pen{ + pixel_x = -5; + pixel_y = -1 + }, +/obj/item/toy/cards/deck/wizoff{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/effect/turf_decal/siding/dark_blue, +/obj/item/flashlight/lamp{ + pixel_y = 5; + pixel_x = -2 + }, +/turf/open/floor/carpet/blue, +/area/station/medical/break_room) "myJ" = ( /obj/structure/railing{ dir = 8 @@ -43703,38 +46586,47 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) +"myP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) "myR" = ( -/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."; - dir = 1; - name = "decommissioned sleeper" - }, -/obj/effect/decal/cleanable/greenglow, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) +/obj/structure/table/wood, +/obj/machinery/status_display/evac/directional/south, +/obj/item/pai_card, +/turf/open/floor/wood/large, +/area/station/medical/break_room) +"mze" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "mzh" = ( -/obj/structure/disposaloutlet{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, +/obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/maintenance/disposal) +"mzm" = ( +/obj/structure/table, +/obj/machinery/coffeemaker, +/obj/item/reagent_containers/cup/coffeepot, +/obj/item/storage/box/coffeepack, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "mzA" = ( /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/smooth_large, /area/station/science/xenobiology) -"mzN" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 +"mzH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/structure/reagent_dispensers/watertank/high, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "mzT" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -43743,6 +46635,13 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/port) +"mAa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/meter/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "mAe" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/stairs/south, @@ -43765,11 +46664,9 @@ /area/station/security/brig) "mAr" = ( /obj/effect/turf_decal/plaque{ - icon_state = "L1" - }, -/obj/effect/turf_decal/siding/green{ - dir = 1 + icon_state = "L2" }, +/obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "mAt" = ( @@ -43803,13 +46700,40 @@ /obj/structure/railing, /turf/open/floor/glass, /area/station/science/zoo) +"mAC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"mAH" = ( +/obj/machinery/door/airlock/maintenance{ + name = "CE's Maintenance Access" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/turf/open/floor/plating, +/area/station/engineering/lobby) "mAO" = ( /obj/item/clothing/head/costume/shrine_wig, /turf/open/floor/plating/airless, /area/space/nearstation) +"mAR" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/urinal/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard/upper) +"mAY" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "mBb" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/large, +/turf/open/floor/iron/corner, /area/station/hallway/primary/central) "mBd" = ( /obj/effect/decal/cleanable/dirt, @@ -43854,6 +46778,17 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/maintenance/port/aft) +"mBZ" = ( +/obj/structure/table/reinforced, +/obj/item/radio/headset, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) +"mCa" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "mCb" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 @@ -43875,6 +46810,15 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) +"mCi" = ( +/obj/effect/landmark/start/hangover, +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 + }, +/obj/structure/chair/stool/directional/east, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "mCj" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -43891,6 +46835,18 @@ }, /turf/open/floor/wood/large, /area/station/commons/lounge) +"mCG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "mCM" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -43898,12 +46854,31 @@ /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ dir = 8 }, -/obj/machinery/shower/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) +"mCN" = ( +/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/machinery/door/airlock/engineering{ + name = "Engine Room" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/main) +"mCO" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"mCR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/closed/wall/r_wall, +/area/station/medical/virology) "mDd" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/structure/rack, @@ -43912,50 +46887,21 @@ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/command/storage/satellite) -"mDk" = ( -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"mDo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"mDv" = ( -/obj/machinery/vending/coffee{ - pixel_x = -3 - }, -/obj/machinery/newscaster/directional/south, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) -"mDz" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/siding/yellow{ - dir = 1 - }, -/obj/structure/rack, -/obj/item/book/manual/wiki/chemistry{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/book/manual/wiki/grenades{ - pixel_y = 1 - }, -/obj/item/book/manual/wiki/plumbing{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ +/area/station/ai/satellite/maintenance/storage) +"mDr" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/medical/chemistry) +/area/station/medical/medbay/lobby) +"mDs" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/machinery/meter, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"mDv" = ( +/turf/open/floor/glass/reinforced, +/area/station/command/bridge) "mDD" = ( /obj/machinery/atmospherics/pipe/multiz/orange/visible{ dir = 4 @@ -43963,6 +46909,10 @@ /obj/machinery/meter, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"mDE" = ( +/obj/structure/sign/warning/vacuum, +/turf/closed/wall, +/area/station/maintenance/starboard/central/upper) "mDF" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -43976,33 +46926,25 @@ /area/space/nearstation) "mDS" = ( /obj/effect/turf_decal/trimline/brown/filled/line, -/obj/item/kirbyplants/random, +/obj/machinery/modular_computer/preset/cargochat/cargo{ + dir = 1 + }, +/obj/structure/sign/poster/random/directional/south, /turf/open/floor/iron, /area/station/cargo/storage) -"mDV" = ( -/obj/structure/closet/firecloset, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) "mDX" = ( -/obj/machinery/door/airlock/virology{ - autoclose = 0; - frequency = 1449; - id_tag = "virology_airlock_exterior"; - name = "Malpractice Tower Exterior Airlock" +/obj/structure/bed/pod{ + desc = "An old medical bed, just waiting for replacement with something up to date."; + name = "medical bed"; + dir = 1 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "viro-passthrough" +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/medical/virology, -/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/defibrillator_mount/directional/west, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/machinery/door/firedoor, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) "mDZ" = ( @@ -44019,11 +46961,20 @@ dir = 4 }, /obj/structure/cable, -/obj/structure/disposalpipe/junction/flip{ - dir = 4 +/obj/structure/disposalpipe/junction{ + dir = 8 }, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) +"mEo" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/button/elevator/directional/east{ + id = "catwalk_atmos"; + name = "Elevator Button" + }, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/engine, +/area/station/engineering/atmos) "mEv" = ( /obj/structure/lattice/catwalk, /obj/effect/landmark/firealarm_sanity, @@ -44034,32 +46985,37 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron/dark, /area/station/service/chapel) -"mEG" = ( -/obj/effect/turf_decal/siding{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/white/line{ - dir = 8; - pixel_x = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) "mEO" = ( /obj/machinery/computer/monitor, /obj/effect/turf_decal/tile/dark_blue/opposingcorners{ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) +"mFv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/structure/sign/warning/electric_shock/directional/south, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "mFA" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/dim/directional/south, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) +"mFE" = ( +/obj/machinery/door/airlock{ + id_tag = "Cabin5"; + name = "Cabin 3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/turf/open/floor/iron/dark/textured_large, +/area/station/commons/dorms) "mFR" = ( /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 @@ -44068,8 +47024,17 @@ dir = 8 }, /obj/effect/landmark/start/depsec/medical, +/obj/structure/chair/office{ + dir = 4 + }, +/obj/machinery/computer/security/telescreen/med_sec/directional/north, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) +"mFU" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/duct, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/fore) "mGb" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -44094,12 +47059,24 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"mGx" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/engine/hull, -/area/station/maintenance/starboard/lesser) +"mGi" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing, +/obj/machinery/camera/autoname/directional/east, +/turf/open/openspace, +/area/station/medical/medbay/central) +"mGj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "mGO" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 @@ -44113,11 +47090,6 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/security/checkpoint/science) -"mGV" = ( -/obj/structure/marker_beacon/indigo, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) "mHd" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/effect/turf_decal/trimline/purple/filled, @@ -44126,41 +47098,39 @@ "mHf" = ( /turf/closed/wall, /area/station/security/checkpoint/supply) -"mHi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/smooth, -/area/station/science/robotics) "mHt" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"mHv" = ( /obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 1 + }, /turf/open/openspace, -/area/station/medical/chemistry) -"mHx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/commons/dorms) "mHC" = ( /obj/structure/table, /obj/item/camera, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) -"mHD" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/cleanable/blood/footprints{ - dir = 8 +"mHF" = ( +/obj/effect/turf_decal/arrows, +/obj/structure/disposalpipe/trunk{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"mHH" = ( -/obj/item/stack/sheet/cotton{ - pixel_x = -6; - pixel_y = 10 +/obj/structure/window/spawner/directional/west, +/obj/structure/window/spawner/directional/north, +/obj/effect/turf_decal/delivery, +/obj/structure/disposaloutlet{ + name = "Outside Cargo" }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) +/obj/structure/plasticflaps, +/turf/open/floor/iron/textured_large, +/area/station/cargo/sorting) "mHJ" = ( /obj/structure/table, /obj/item/paint_palette{ @@ -44196,32 +47166,15 @@ }, /obj/structure/cable/layer3, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"mHZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/area/station/ai/satellite/interior) +"mHX" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/engine/hull/air, +/area/station/medical/medbay/central) "mIa" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"mId" = ( -/turf/open/floor/iron/freezer, -/area/station/engineering/atmos/pumproom) -"mIg" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/obj/item/radio/intercom/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/engineering/storage_shared) "mIi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -44236,34 +47189,45 @@ /turf/open/space/openspace, /area/space/nearstation) "mIp" = ( -/obj/structure/railing{ +/obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 1 }, -/obj/effect/turf_decal/trimline/brown/filled/line{ +/obj/machinery/door/firedoor/border_only{ dir = 1 }, -/obj/machinery/vending/games, /turf/open/floor/iron/textured, /area/station/cargo/storage) "mIq" = ( -/obj/machinery/requests_console/directional/east{ - 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, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/carpet, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/requests_console/auto_name/directional/east, +/obj/structure/bed/dogbed/renault, +/mob/living/basic/pet/fox/renault, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) +"mIx" = ( +/obj/machinery/light/directional/west, +/obj/structure/closet/radiation, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "mID" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Mining Maintenance Access" - }, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, /obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/machinery/door/airlock/maintenance, /turf/open/floor/plating, -/area/station/cargo/miningoffice) +/area/station/cargo/storage) +"mIE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "mIJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/full, @@ -44287,14 +47251,7 @@ "mIO" = ( /obj/structure/ladder, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/command/nuke_storage) -"mIR" = ( -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) +/area/station/command/vault) "mIX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/frame/computer{ @@ -44305,45 +47262,21 @@ "mJa" = ( /turf/open/floor/iron/dark, /area/station/tcommsat/server) -"mJb" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/obj/structure/fluff/paper{ - dir = 9 - }, -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/spawner/random/bureaucracy/paper, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "mJd" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/wood/corner, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"mJe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/reagent_containers/cup/glass/bottle/vermouth{ - pixel_x = -4; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/glass/bottle/ale, -/obj/item/reagent_containers/cup/glass/bottle/beer{ - pixel_x = 6 - }, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) "mJg" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/obj/machinery/camera/autoname/directional/west{ - c_tag = "Medbay - Lower South Hallway" +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "chemshutters"; + name = "Pharmacy Shutters" }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/turf/open/floor/plating, +/area/station/medical/pharmacy) "mJl" = ( /obj/machinery/door/firedoor, /turf/open/floor/engine/hull/air, @@ -44369,10 +47302,50 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"mJI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) "mJL" = ( /obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/station/maintenance/port/aft) +"mJO" = ( +/obj/item/clothing/head/soft/grey{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/plunger{ + pixel_x = 6; + pixel_y = 2 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"mJP" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"mJT" = ( +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/obj/item/encryptionkey/headset_service{ + pixel_y = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) +"mJY" = ( +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"mKb" = ( +/obj/machinery/door/airlock{ + name = "Abandoned Chapel" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "mKk" = ( /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating, @@ -44392,29 +47365,44 @@ /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) "mKs" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 8 - }, -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - name = "medical bed" +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 1 }, -/obj/machinery/defibrillator_mount/directional/south, -/turf/open/floor/iron/white/textured_large, +/obj/effect/turf_decal/trimline/white/filled/warning, +/turf/open/floor/iron/dark, /area/station/medical/medbay/central) "mKv" = ( -/obj/effect/landmark/firealarm_sanity, -/turf/open/floor/engine/hull/air, -/area/station/medical/chemistry) +/obj/structure/closet/secure_closet/chief_medical, +/obj/item/screwdriver, +/obj/machinery/firealarm/directional/west, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/carpet/cyan, +/area/station/command/heads_quarters/cmo) +"mKz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 8; + pixel_y = -2 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1 + }, +/obj/effect/mapping_helpers/mail_sorting/science/ordnance, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "mKF" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"mKH" = ( +/obj/structure/lattice/catwalk, +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "mKN" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44430,15 +47418,26 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"mKV" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall, -/area/station/maintenance/starboard/lesser) +"mKQ" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/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/upper) "mKZ" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"mLd" = ( +/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/duct, +/turf/open/floor/iron/dark/smooth_large, +/area/station/engineering/main) "mLg" = ( /obj/machinery/mass_driver/chapelgun{ dir = 1 @@ -44452,12 +47451,6 @@ /obj/effect/turf_decal/stripes/end, /turf/open/floor/iron/dark, /area/station/service/chapel) -"mLk" = ( -/obj/machinery/computer/atmos_alert{ - dir = 1 - }, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) "mLl" = ( /obj/machinery/vending/cigarette, /turf/open/floor/carpet, @@ -44465,15 +47458,15 @@ "mLm" = ( /turf/closed/wall, /area/station/hallway/secondary/construction) -"mLH" = ( -/obj/effect/turf_decal/siding/brown, -/obj/structure/table/reinforced, -/obj/item/training_toolbox{ - pixel_y = 6 - }, -/obj/item/training_toolbox, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +"mLp" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/glass, +/area/station/maintenance/aft/upper) +"mLv" = ( +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) "mLN" = ( /obj/item/chair, /obj/effect/decal/cleanable/blood/old, @@ -44487,25 +47480,26 @@ /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"mLS" = ( -/turf/open/openspace, -/area/station/engineering/break_room) +"mLP" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/commons/toilet/restrooms) "mMb" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ dir = 4 }, /turf/open/openspace, -/area/station/command/bridge) -"mMx" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/station/commons/dorms) +/area/station/command/meeting_room/council) +"mMs" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) "mMA" = ( /obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 8 + }, /area/station/hallway/primary/central) "mMC" = ( /obj/effect/turf_decal/siding/wood{ @@ -44531,17 +47525,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"mMX" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 +"mMZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 }, -/obj/effect/decal/cleanable/blood/oil, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"mNj" = ( -/obj/structure/sign/warning/vacuum/external/directional/south, +/area/station/maintenance/starboard/central) +"mNi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/central) "mNn" = ( /obj/structure/chair/stool/directional/south{ dir = 8 @@ -44558,11 +47557,20 @@ /obj/structure/ladder, /turf/open/space/basic, /area/space/nearstation) -"mNC" = ( +"mNt" = ( /obj/structure/lattice/catwalk, -/obj/structure/sign/warning/radiation/rad_area/directional/south, +/obj/structure/railing, +/obj/item/reagent_containers/blood/ethereal{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/cigbutt{ + pixel_x = 9; + pixel_y = 14 + }, +/obj/structure/sign/poster/official/anniversary_vintage_reprint/directional/west, /turf/open/openspace, -/area/station/engineering/break_room) +/area/station/maintenance/department/crew_quarters/dorms) "mND" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -44570,13 +47578,21 @@ }, /turf/open/openspace, /area/station/hallway/secondary/exit/departure_lounge) +"mNK" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/machinery/door/airlock/engineering/glass{ + name = "Shared Engineering Storage" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/storage) "mNN" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -44587,45 +47603,44 @@ name = "Gateway Shutter Control"; pixel_x = 24; pixel_y = 0; - req_access = list("command") + req_access = list("command"); + dir = 4 }, /obj/machinery/door/firedoor, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) -"mOg" = ( -/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/stripes/corner, +/turf/open/floor/iron/edge{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/area/station/hallway/primary/central) +"mOc" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/effect/spawner/random/techstorage/custom_shuttle, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"mOk" = ( /turf/open/floor/plating, -/area/station/maintenance/starboard/central) -"mOo" = ( -/obj/effect/turf_decal/trimline/yellow/filled, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 +/area/station/maintenance/starboard/aft/upper) +"mOz" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/closet/secure_closet/personal/cabinet, +/turf/open/floor/wood/large, +/area/station/commons/dorms) +"mOB" = ( +/obj/structure/transport/linear{ + radial_travel = 0 }, -/obj/item/kirbyplants/random/fullysynthetic, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) -"mOx" = ( -/obj/structure/bed/dogbed/runtime, -/obj/item/toy/figure/cmo{ - pixel_x = -7; - pixel_y = -4 +/obj/machinery/elevator_control_panel/directional/south{ + linked_elevator_id = "catwalk_atmos"; + preset_destination_names = list("2"="Lower Atmos","3"="Upper Atmos") }, -/mob/living/basic/pet/cat/runtime, -/obj/structure/cable, -/obj/machinery/firealarm/directional/west, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/machinery/camera/autoname/directional/south{ - c_tag = "Medbay - Upper Chief Medical Office South"; - network = list("ss13","medbay") +/obj/effect/landmark/transport/transport_id{ + specific_transport_id = "catwalk_atmos" }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/turf/open/openspace, +/area/station/engineering/atmos/upper) "mOE" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/structure/railing, @@ -44659,7 +47674,22 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"mOO" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/closet/radiation, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"mOU" = ( +/obj/structure/table/reinforced, +/obj/item/radio/intercom, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "mOW" = ( /obj/structure/rack, /obj/item/book/manual/wiki/engineering_construction, @@ -44683,16 +47713,44 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/service/chapel) -"mPn" = ( -/obj/effect/landmark/start/hangover, +"mPa" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/chair/office/light{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"mPf" = ( +/obj/effect/spawner/random/maintenance/two, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/table/wood, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/central) +"mPt" = ( +/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/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/duct, +/turf/open/floor/iron/dark/smooth_large, +/area/station/engineering/main) "mPw" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"mPx" = ( +/obj/machinery/electrolyzer, +/obj/machinery/light/directional/south, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "mPB" = ( /obj/machinery/camera/directional/south{ c_tag = "Holodeck - Aft"; @@ -44702,11 +47760,35 @@ name = "Holodeck Projector Floor" }, /area/station/holodeck/rec_center) +"mPK" = ( +/obj/structure/cable, +/obj/item/cigbutt{ + pixel_x = -12; + pixel_y = 13 + }, +/obj/item/cigbutt{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) +"mPO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "mPP" = ( -/obj/structure/table/wood, -/obj/item/radio/intercom, -/turf/open/floor/carpet, -/area/station/command/meeting_room/council) +/obj/machinery/light/floor, +/obj/structure/table/reinforced/rglass, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/item/food/chocolatebar{ + pixel_x = 6; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "mPQ" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/siding/dark, @@ -44714,77 +47796,84 @@ network = list("minisat") }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"mPV" = ( -/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/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/security/detectives_office/private_investigators_office) +/area/station/ai/satellite/interior) "mQh" = ( /obj/machinery/door/firedoor, /turf/open/floor/engine/hull/air, /area/station/hallway/secondary/construction) -"mQS" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +"mQA" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/structure/rack, +/obj/item/encryptionkey/headset_sci{ + pixel_x = -6; + pixel_y = 1 + }, +/obj/item/encryptionkey/headset_med, +/obj/item/encryptionkey/headset_eng{ + pixel_x = 6; + pixel_y = -1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"mQT" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"mQH" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/engineering/lobby) -"mQX" = ( -/obj/machinery/mineral/ore_redemption{ - dir = 4; - input_dir = 4; - output_dir = 8 + dir = 4 }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/obj/machinery/status_display/supply{ - pixel_y = -32 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"mRf" = ( +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) +"mQK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/space/basic, -/area/space/nearstation) +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/white/filled/warning, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"mQX" = ( +/obj/effect/turf_decal/trimline/brown/arrow_ccw, +/obj/effect/turf_decal/trimline/brown/arrow_cw{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "mRg" = ( /obj/structure/lattice/catwalk, /obj/effect/landmark/firealarm_sanity, /turf/open/openspace, /area/station/hallway/secondary/entry) +"mRj" = ( +/obj/machinery/computer/prisoner/management{ + dir = 4 + }, +/obj/machinery/light/warm/dim/directional/west, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "mRn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/cigbutt/cigarbutt, -/obj/effect/spawner/random/trash/mess, /obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"mRq" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Laundromat" +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) +/turf/open/floor/wood/large, +/area/station/medical/break_room) +"mRs" = ( +/obj/machinery/light/directional/south, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "mRt" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/landmark/blobstart, @@ -44807,72 +47896,58 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/research) -"mRI" = ( -/obj/structure/cable, -/turf/closed/wall, -/area/station/maintenance/starboard/lesser) "mRJ" = ( /obj/structure/cable, /turf/open/floor/carpet/royalblack, /area/station/command/heads_quarters/hos) +"mRO" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Ordnance Gas Storage Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/ordnance_storage, +/turf/open/floor/plating, +/area/station/maintenance/aft) "mRQ" = ( /obj/machinery/airalarm/directional/north, /obj/item/radio/intercom/directional/east, /turf/open/floor/catwalk_floor/iron_smooth, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) +"mRU" = ( +/obj/structure/flora/grass/jungle, +/obj/structure/railing/corner, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/flora/tree/jungle, +/obj/effect/turf_decal/siding/thinplating/corner, +/turf/open/floor/grass, +/area/station/hallway/primary/starboard) "mSa" = ( /obj/structure/railing{ dir = 4 }, /obj/structure/closet/secure_closet/hop, /obj/item/bedsheet/ian, -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, /obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/wood, +/turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) "mSd" = ( /turf/closed/wall, /area/station/commons/lounge) -"mSq" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, +"mSe" = ( +/obj/effect/decal/cleanable/vomit/old, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/upper) "mSt" = ( /obj/effect/landmark/start/mime, /turf/open/floor/carpet/black, /area/station/service/theater) "mSA" = ( -/obj/structure/bed, -/obj/item/bedsheet/qm, -/obj/item/stack/spacecash/c10{ - pixel_x = -5 - }, -/obj/item/stack/spacecash/c10{ - pixel_x = -5 - }, -/obj/item/stack/spacecash/c10{ - pixel_x = -5 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Cargo Bay - Quartermaster's Room" - }, -/obj/effect/landmark/start/quartermaster, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/qm) -"mSE" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 1 - }, -/obj/machinery/meter{ - name = "Mixed Air Tank In" +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/upper) +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "mSF" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44882,38 +47957,69 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/openspace, /area/station/hallway/primary/fore) +"mSG" = ( +/obj/structure/chair/pew/right{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/maintenance/starboard) +"mSL" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/candle_box{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/station/maintenance/starboard) +"mSN" = ( +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/obj/structure/statue/bronze/marx{ + pixel_x = 5; + pixel_y = 16 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) +"mSQ" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/commons/locker) +"mSU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction) "mTi" = ( /obj/item/banhammer, /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) -"mTp" = ( -/obj/structure/table, -/obj/machinery/status_display/evac/directional/north, -/obj/item/paper{ - pixel_y = 4 - }, -/obj/item/phone{ - pixel_x = -5; - pixel_y = 11 - }, -/obj/item/pen/blue{ - pixel_x = -5; - pixel_y = -1 - }, -/obj/item/stamp{ - pixel_x = 13; - pixel_y = 12 +"mTo" = ( +/obj/item/cigbutt{ + pixel_x = -11; + pixel_y = 14 }, -/obj/machinery/computer/security/telescreen/aiupload/directional/west, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "mTq" = ( /obj/structure/chair{ dir = 1 }, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"mTv" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/commons/locker) "mTx" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -44923,46 +48029,41 @@ }, /turf/open/floor/wood/large, /area/station/service/kitchen) -"mTz" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/station/engineering/atmos/upper) -"mTH" = ( -/obj/structure/sign/warning/secure_area/directional/south, -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/lesser) -"mTL" = ( -/obj/effect/decal/cleanable/crayon{ - icon_state = "body"; - name = "body" +"mTJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"mUi" = ( -/obj/structure/closet/emcloset, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/sepia, -/area/station/hallway/secondary/construction) +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"mTP" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace, +/area/station/medical/medbay/central) +"mTT" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/commons/dorms) "mUm" = ( -/obj/machinery/chem_heater/withbuffer, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, -/obj/machinery/airalarm/directional/south, +/obj/machinery/camera/autoname/directional/south, +/obj/structure/table, +/obj/item/stack/sheet/mineral/plasma{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/clothing/glasses/science, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"mUv" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/openspace, -/area/station/medical/storage) +"mUt" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/commons/dorms) "mUC" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -44971,30 +48072,15 @@ /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) "mUD" = ( -/obj/structure/chair/office{ - name = "CMO's Chair" - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"mUN" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 6 +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "mUR" = ( /turf/closed/wall, /area/station/service/bar/backroom) -"mUS" = ( -/obj/machinery/light_switch/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/hallway) "mUY" = ( /obj/structure/railing{ dir = 1 @@ -45007,11 +48093,12 @@ /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "mVm" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /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/command/maintenance, +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/maintenance/central) "mVp" = ( @@ -45026,17 +48113,11 @@ }, /turf/open/openspace, /area/station/command/gateway) -"mVu" = ( -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) -"mVw" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/modular_computer/preset/engineering{ - dir = 8 - }, +"mVv" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/landmark/start/chemist, /turf/open/floor/iron/dark, -/area/station/engineering/hallway) +/area/station/medical/chemistry) "mVC" = ( /obj/structure/lattice, /obj/effect/spawner/random/maintenance, @@ -45047,10 +48128,35 @@ /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output, /turf/open/floor/engine/air, /area/station/engineering/atmos/upper) -"mWu" = ( -/obj/effect/spawner/random/maintenance, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) +"mWg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/hangover, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron, +/area/station/commons/dorms) +"mWB" = ( +/obj/structure/table, +/obj/item/storage/box/metalfoam{ + pixel_y = 2; + pixel_x = 2 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = 3; + pixel_y = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"mWC" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/booze, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/aft/upper) "mWF" = ( /obj/structure/railing/corner{ dir = 4 @@ -45073,17 +48179,7 @@ dir = 1 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"mWI" = ( -/obj/structure/table, -/obj/item/toy/gun{ - pixel_x = 1; - pixel_y = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) +/area/station/ai/satellite/interior) "mWQ" = ( /obj/structure/table/wood/poker, /obj/effect/spawner/random/entertainment/gambling{ @@ -45117,13 +48213,13 @@ dir = 8 }, /area/station/science/cytology) -"mWX" = ( -/obj/effect/decal/cleanable/dirt, +"mXa" = ( +/obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/ripped/directional/south, /obj/structure/cable, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/department/medical) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/openspace, +/area/station/medical/medbay/central) "mXl" = ( /obj/structure/broken_flooring/singular/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45131,6 +48227,14 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/storage_shared) +"mXq" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "mXs" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -45140,6 +48244,15 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"mXI" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "mXL" = ( /obj/effect/turf_decal/weather/snow, /turf/open/floor/plating, @@ -45193,80 +48306,31 @@ "mYf" = ( /obj/structure/chair/comfy/brown, /obj/structure/plaque/static_plaque/golden/captain{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, -/obj/structure/cable, /obj/effect/landmark/start/captain, -/turf/open/floor/wood, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) -"mYh" = ( -/obj/structure/lattice/catwalk, -/obj/structure/table/glass, -/obj/item/phone{ - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/openspace, -/area/station/engineering/break_room) -"mYm" = ( -/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/trimline/yellow/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) "mYo" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/space/nearstation) -"mYy" = ( -/obj/structure/sign/poster/contraband/power/directional/north, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) -"mYK" = ( -/obj/machinery/door/airlock{ - name = "Emergency Storage" - }, -/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/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"mYN" = ( -/obj/structure/closet/firecloset, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "mYV" = ( /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, /area/station/science/cytology) "mYZ" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/reagent_containers/syringe/epinephrine{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/item/reagent_containers/cup/bottle/morphine{ - pixel_x = -1; - pixel_y = 4 +/obj/machinery/chem_heater/withbuffer, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 }, -/obj/item/reagent_containers/cup/bottle/toxin{ - pixel_x = 5; - pixel_y = 3 +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 }, -/obj/effect/turf_decal/tile/yellow/full, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "chemshutters"; - name = "Chemistry Shutters" +/obj/structure/disposalpipe/segment{ + dir = 5 }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) @@ -45277,24 +48341,9 @@ }, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"mZf" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"mZo" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) "mZq" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) @@ -45322,53 +48371,42 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/openspace, /area/station/hallway/primary/central) -"naa" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "nah" = ( /obj/structure/cable, /turf/closed/wall/r_wall, /area/station/maintenance/port/aft) -"nak" = ( -/obj/structure/table/reinforced, -/obj/item/pen, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/right/directional/east{ - name = "Cargo Desk"; - req_access = list("cargo") +"nai" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 }, -/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/vending/assist, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"nak" = ( /obj/effect/landmark/navigate_destination/cargo, /turf/open/floor/iron, -/area/station/cargo/storage) -"naq" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 1 +/area/station/hallway/primary/starboard) +"nar" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 6 }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ dir = 4 }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"nar" = ( -/obj/structure/railing/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) +"nax" = ( +/obj/structure/toilet{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"nav" = ( -/obj/structure/cable, -/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/dark, -/area/station/engineering/break_room) +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/auxiliary) "naC" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "hydropony_shutters"; @@ -45377,10 +48415,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/service/kitchen) -"naR" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) "naS" = ( /turf/open/openspace, /area/station/science/xenobiology) @@ -45402,20 +48436,21 @@ }, /turf/open/floor/wood, /area/station/security/detectives_office) -"nbb" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight/lamp{ - pixel_y = 7 - }, -/obj/item/stamp/head/qm{ - pixel_x = -5 +"nba" = ( +/obj/structure/sign/clock/directional/east, +/obj/machinery/rnd/production/techfab/department/cargo, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 }, -/obj/item/stamp/denied{ - pixel_x = 6 +/turf/open/floor/iron, +/area/station/cargo/storage) +"nbb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/qm) +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "nbj" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, @@ -45432,19 +48467,35 @@ }, /turf/open/floor/wood/large, /area/station/commons/lounge) -"nbY" = ( -/obj/structure/table, -/obj/effect/turf_decal/siding/wood{ - dir = 5 +"nbE" = ( +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/machinery/door/airlock/medical/glass{ + name = "Cryogenics Room" }, -/obj/effect/turf_decal/siding/wood{ +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/full, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/cryo) +"nbQ" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) +"nbU" = ( +/obj/structure/disposalpipe/segment{ dir = 5 }, -/obj/item/modular_computer/laptop/preset/civilian{ - pixel_y = 3 +/turf/open/floor/iron/edge{ + dir = 1 }, -/turf/open/floor/wood, -/area/station/engineering/lobby) +/area/station/hallway/primary/central) "nct" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -45456,30 +48507,25 @@ /obj/item/storage/box/lights/mixed, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"ncF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) -"ncI" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +"ncC" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/edge{ dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/hallway/primary/central) "ncO" = ( /turf/open/floor/glass/reinforced, /area/station/hallway/secondary/entry) -"ncT" = ( -/obj/machinery/electrolyzer, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +"ncS" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "ncV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -45490,9 +48536,25 @@ dir = 4 }, /area/station/engineering/main) -"nde" = ( +"nda" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/fluff/paper/stack{ + desc = "A stack of various papers, absolutely unreadable due to scorch marks and aging." + }, +/obj/structure/fluff/paper{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, /turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/area/station/maintenance/aft) +"nde" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "ndl" = ( /obj/item/radio/intercom/directional/north, /obj/machinery/module_duplicator, @@ -45512,7 +48574,11 @@ "ndK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "ndQ" = ( /obj/machinery/door/airlock{ @@ -45539,6 +48605,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"neh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/commons/dorms) "nej" = ( /obj/machinery/nuclearbomb/beer{ pixel_x = -2; @@ -45546,23 +48619,23 @@ }, /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron/dark, /area/station/command/corporate_showroom) -"nem" = ( +"nev" = ( /obj/structure/lattice/catwalk, -/obj/machinery/power/tracker, -/turf/open/space/basic, -/area/station/solars/starboard/fore) -"nen" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance" +/obj/effect/turf_decal/stripes/corner{ + dir = 8 }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/railing{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port) +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) +"new" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "ney" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ dir = 1 @@ -45577,7 +48650,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron/dark/textured_edge, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"neA" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "neB" = ( /obj/structure/railing{ dir = 4 @@ -45596,12 +48677,6 @@ pixel_y = 26; preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") }, -/obj/structure/sign/directions/upload/directional/north{ - desc = "It stands for Up Le Dable"; - dir = 2; - name = "Button Indicator"; - pixel_y = 40 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -45617,57 +48692,55 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"neN" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/west{ + id = "Cabin10"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/effect/landmark/start/hangover, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/wood, +/area/station/commons/dorms) "nfa" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"nfd" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/commons/dorms) "nfe" = ( /obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nfg" = ( -/obj/structure/railing{ - dir = 8 - }, /obj/effect/turf_decal/siding/blue{ dir = 8 }, -/obj/structure/chair/office{ - dir = 4; - name = "HoP's Chair" - }, -/obj/effect/turf_decal/tile/green/opposingcorners{ - dir = 1 - }, -/obj/structure/railing/corner/end{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"nfB" = ( -/obj/structure/lattice/catwalk, -/obj/structure/disposalpipe/segment, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) -"nfE" = ( /obj/structure/railing{ dir = 8 }, -/obj/structure/railing/corner/end, -/obj/structure/railing/corner/end{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 8 }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron/stairs/left, -/area/station/maintenance/disposal/incinerator) +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "nfG" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -45675,10 +48748,10 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/dark, /area/station/science/lobby) -"nfM" = ( -/obj/structure/cable, -/turf/open/floor/iron/freezer, -/area/station/engineering/atmos/pumproom) +"nfO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/station/maintenance/aft/upper) "nfR" = ( /turf/closed/wall, /area/station/medical/break_room) @@ -45712,7 +48785,7 @@ /turf/open/floor/iron/white/textured_corner{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ngp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45732,37 +48805,33 @@ /turf/open/floor/iron/dark/smooth_half{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ngF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/confetti, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"ngH" = ( -/turf/closed/wall/r_wall, -/area/station/engineering/break_room) -"ngQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "ngZ" = ( /obj/effect/turf_decal/delivery, /obj/structure/table, /obj/effect/spawner/random/entertainment/cigarette_pack, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) +"nhc" = ( +/obj/machinery/door/airlock{ + id_tag = "Cabin6"; + name = "Cabin 2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/turf/open/floor/iron/dark/textured_large, +/area/station/commons/dorms) "nhg" = ( /turf/open/floor/iron/smooth_edge{ dir = 4 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"nhh" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/space/openspace, -/area/station/solars/starboard/fore) +/area/station/ai/satellite/foyer) "nhj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45771,33 +48840,51 @@ dir = 2 }, /obj/effect/mapping_helpers/mail_sorting/service/law_office, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) -"nhE" = ( -/obj/structure/sign/poster/contraband/communist_state/directional/north, -/obj/effect/decal/cleanable/crayon{ - icon_state = "body"; - name = "body"; - pixel_x = 12; - pixel_y = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"nhG" = ( -/obj/effect/turf_decal/siding/wood{ +"nht" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 }, -/obj/structure/railing{ +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) +"nhv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, -/obj/item/kirbyplants/random, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) +"nhG" = ( /obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"nhP" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) +/obj/effect/turf_decal/stripes/end, +/obj/structure/table, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = 6; + pixel_y = 8 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = 2; + pixel_y = 7 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = -6; + pixel_y = 5 + }, +/turf/open/floor/iron/textured, +/area/station/command/eva) "nhQ" = ( /obj/effect/turf_decal/siding/purple/corner{ dir = 8 @@ -45815,22 +48902,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"nhU" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/openspace, -/area/station/engineering/atmos/project) -"nhY" = ( -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) "nia" = ( /obj/machinery/light/floor, /obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ @@ -45843,7 +48914,7 @@ dir = 9 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nir" = ( /obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron/dark, @@ -45852,19 +48923,19 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"niv" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/openspace, -/area/station/medical/storage) "niy" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /obj/structure/rack, -/obj/item/plunger, -/turf/open/floor/wood, -/area/station/medical/medbay/central) +/obj/item/wheelchair{ + pixel_y = 3 + }, +/obj/item/emergency_bed{ + pixel_y = 3 + }, +/turf/open/floor/iron/dark, +/area/station/medical/cryo) "niN" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -45880,30 +48951,48 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) +"njc" = ( +/obj/structure/table, +/obj/item/clothing/head/cone{ + pixel_x = -10; + pixel_y = -11 + }, +/obj/item/clothing/head/cone{ + pixel_x = -10; + pixel_y = -11 + }, +/obj/item/clothing/head/cone{ + pixel_x = -10; + pixel_y = -11 + }, +/obj/item/clothing/head/cone{ + pixel_x = -10; + pixel_y = -11 + }, +/obj/item/clothing/head/cone{ + pixel_x = -10; + pixel_y = -11 + }, +/obj/item/airlock_painter/decal{ + pixel_y = 12 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"njf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/station/commons/dorms) "njh" = ( /obj/machinery/door/airlock{ id_tag = "AuxToilet1"; name = "Unit 1" }, /turf/open/floor/iron/freezer, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "njk" = ( /turf/closed/wall, /area/station/engineering/main) -"njA" = ( -/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/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "njH" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/medical) @@ -45911,13 +49000,9 @@ /obj/structure/chair{ dir = 1 }, +/obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"njY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "nkh" = ( /obj/machinery/holopad, /turf/open/floor/iron/dark/smooth_large, @@ -45929,7 +49014,7 @@ }, /obj/machinery/light/directional/west, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nky" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ dir = 8 @@ -45943,7 +49028,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "nkD" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, @@ -45955,17 +49040,21 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"nkE" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "nkF" = ( /obj/machinery/light/directional/east, -/turf/open/floor/iron/large, +/turf/open/floor/iron/corner{ + dir = 8 + }, /area/station/hallway/primary/central) +"nkW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/crate, +/obj/item/toy/foamfinger, +/obj/item/toy/foamfinger, +/obj/item/toy/foamfinger, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "nkZ" = ( /obj/effect/decal/cleanable/glitter{ color = "ff8080" @@ -45980,32 +49069,26 @@ }, /turf/open/space/basic, /area/space/nearstation) -"nli" = ( -/obj/structure/railing/corner, -/obj/structure/table/wood, -/obj/item/camera{ - pixel_x = -3; - pixel_y = 8 - }, -/obj/item/tape, -/obj/item/pen/fourcolor{ - pixel_x = 8; - pixel_y = 7 - }, +"nlk" = ( /obj/structure/cable, -/turf/open/floor/wood/large, -/area/station/service/library/private) +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "nlm" = ( /turf/open/space/openspace, /area/space) -"nlo" = ( -/obj/machinery/photocopier/prebuilt, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "nlt" = ( /turf/open/floor/iron/dark/textured, /area/station/engineering/supermatter/room) +"nlw" = ( +/obj/machinery/firealarm/directional/south, +/obj/machinery/camera/directional/south, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/engineering/lobby) "nlD" = ( /turf/closed/wall/r_wall, /area/station/medical/abandoned) @@ -46016,7 +49099,7 @@ network = list("aicore") }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "nlO" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -46028,41 +49111,22 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) -"nlP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "nmf" = ( /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) -"nmk" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/camera/autoname/directional/east, -/turf/open/openspace, -/area/station/engineering/atmos/project) "nml" = ( /obj/machinery/button/door/directional/east{ id = "qm_cargobay"; - name = "Cargo Bay Door Control" + name = "Cargo Bay Inner Shutters" }, /obj/machinery/camera/directional/east{ c_tag = "Cargo Bay - Reception" }, -/obj/machinery/fax{ - fax_name = "Cargo Office"; - name = "Cargo Office Fax Machine" - }, -/obj/structure/table, /obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron, /area/station/cargo/storage) "nmn" = ( @@ -46074,40 +49138,18 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) -"nmx" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/turf/open/floor/plating, -/area/station/engineering/atmos/upper) "nmB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/confetti, /obj/effect/spawner/random/vending/colavend, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) -"nmF" = ( -/obj/structure/cable, -/obj/structure/rack, -/obj/item/circuitboard/computer/apc_control{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/stock_parts/power_store/cell{ - pixel_x = -3; - pixel_y = -2 - }, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) -"nmH" = ( -/obj/item/pushbroom, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) -"nmO" = ( -/obj/effect/spawner/random/entertainment/arcade{ +"nmE" = ( +/obj/structure/chair{ dir = 1 }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) +/turf/open/floor/plating, +/area/station/maintenance/starboard) "nmQ" = ( /obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 1 @@ -46123,37 +49165,39 @@ }, /turf/open/floor/wood/large, /area/station/service/library) +"nmW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/camera/autoname/directional/west, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"nnf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/security/courtroom) "nng" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/obj/effect/landmark/start/depsec/medical, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console"; - pixel_x = -30; - pixel_y = 0 - }, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/mapping_helpers/requests_console/supplies, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) -"nns" = ( -/obj/effect/spawner/random/trash/grille_or_waste, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "nny" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/station/hallway/primary/central) -"nnB" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) +"nnD" = ( +/obj/machinery/firealarm/directional/south, +/turf/open/floor/carpet/black, +/area/station/service/library/private) "nnH" = ( /turf/closed/wall, /area/station/commons/storage/primary) @@ -46190,50 +49234,26 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/science/genetics) +"nnQ" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "nnS" = ( /obj/structure/table/reinforced, /turf/open/floor/engine/hull, /area/space/nearstation) "nnW" = ( -/obj/structure/table/wood, -/obj/item/folder/yellow{ - pixel_x = 6; - pixel_y = 2 - }, -/obj/item/folder/yellow{ - pixel_x = -5; - pixel_y = 2 - }, -/obj/item/stamp{ - pixel_x = -4; - pixel_y = 6 - }, -/obj/item/stamp/denied{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/meeting_room/council) -"nog" = ( -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/table/glass, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/item/folder/yellow{ - pixel_x = 2; - pixel_y = -12 +/obj/machinery/computer/security/telescreen/normal/directional/west, +/obj/structure/chair/comfy/carp{ + name = "Captain's Chair" }, -/turf/open/openspace, -/area/station/engineering/break_room) +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"nnX" = ( +/obj/machinery/duct, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "noi" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/effect/spawner/random/structure/table_or_rack, @@ -46243,14 +49263,12 @@ /turf/open/floor/iron, /area/station/service/kitchen/abandoned) "nol" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/machinery/button/door/directional/north{ - id = "evashutter"; - name = "E.V.A. Storage Shutter Control"; - req_access = list("command") +/obj/effect/turf_decal/siding/dark{ + dir = 5 }, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "nom" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46258,6 +49276,19 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"now" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) +"nox" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/vending/engivend, +/obj/structure/sign/poster/official/moth_delam/directional/north, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "noz" = ( /obj/structure/chair/office/light{ dir = 8 @@ -46266,14 +49297,6 @@ /obj/effect/landmark/start/research_director, /turf/open/floor/wood, /area/station/command/heads_quarters/rd) -"noC" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 2; - pixel_y = 7 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) "noF" = ( /obj/effect/turf_decal/stripes/asteroid/corner{ dir = 1 @@ -46342,17 +49365,38 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "npf" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/eva) -"npj" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/light_switch/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/engineering/storage_shared) +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/chair/office/light{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"npo" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) +"nps" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/science/lobby) +"npt" = ( +/obj/machinery/shower/directional/west, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"npw" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/aft) "npx" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -46369,19 +49413,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/wood, /area/station/command/teleporter) -"npG" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/textured_large, -/area/station/medical/virology) "npH" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -46403,8 +49434,10 @@ /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) "npR" = ( -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/black, +/area/station/ai/upload/chamber) "npS" = ( /obj/item/stack/sheet/mineral/wood{ pixel_x = -12; @@ -46420,6 +49453,11 @@ }, /turf/open/floor/iron/dark, /area/station/security/evidence) +"nqf" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "nqg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46435,29 +49473,17 @@ }, /turf/open/floor/iron/dark, /area/station/science/server) -"nqm" = ( -/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/maintenance/disposal/incinerator) +"nqo" = ( +/obj/structure/closet/secure_closet/engineering_personal{ + anchored = 1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "nqt" = ( /turf/open/floor/plating/elevatorshaft, /area/station/engineering/supermatter/room) -"nqu" = ( -/obj/structure/light_construct/directional/east{ - dir = 1 - }, -/obj/structure/closet/secure_closet/bar/all_access{ - pixel_x = -3; - pixel_y = -1 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) -"nqy" = ( -/obj/effect/landmark/event_spawn, -/turf/open/openspace, -/area/station/medical/medbay/central) "nqC" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -46516,28 +49542,31 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/breakroom) +"nqW" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/camera/autoname/directional/west{ + c_tag = "Medbay - Upper Plumbing Area West" + }, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "nrg" = ( /obj/machinery/holopad, /turf/open/floor/carpet, /area/station/command/corporate_showroom) "nrw" = ( /obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/arrows{ - dir = 1 + dir = 5 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +/turf/open/floor/iron/dark/smooth_corner{ dir = 8 }, -/turf/open/floor/iron/dark, /area/station/command/gateway) -"nrO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/oven, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) "nrP" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -46548,8 +49577,33 @@ /obj/structure/railing{ dir = 8 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 8 + }, /area/station/hallway/primary/central) +"nrT" = ( +/obj/structure/rack, +/obj/item/storage/crayons{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/storage/box/lights/bulbs{ + pixel_x = 5 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -4; + pixel_y = -7 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) +"nrZ" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"nsn" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/aft) "nsp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /obj/machinery/meter, @@ -46557,14 +49611,27 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"nsx" = ( +"nsr" = ( /obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/landmark/start/hangover, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 6 + }, +/turf/open/floor/iron/corner{ dir = 1 }, +/area/station/hallway/secondary/exit/departure_lounge) +"nsD" = ( +/obj/machinery/power/tracker, /obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/engineering/atmos/project) +/turf/open/space/basic, +/area/station/solars/starboard/fore) "nsI" = ( /obj/structure/disposalpipe/trunk/multiz{ dir = 8 @@ -46577,7 +49644,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "nsM" = ( /obj/structure/chair{ dir = 1 @@ -46585,14 +49652,6 @@ /obj/effect/landmark/start/prisoner, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) -"nsN" = ( -/obj/structure/cable, -/obj/structure/tank_dispenser{ - pixel_x = -1 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "nsO" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/green/opposingcorners{ @@ -46636,40 +49695,22 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/wood/tile, /area/station/science/robotics) -"nts" = ( -/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/fitness/recreation) -"ntw" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Dormitories - Lower Entrance" - }, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) "ntx" = ( /obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron, /area/station/cargo/storage) -"ntA" = ( -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"ntE" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/space_heater, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +"ntz" = ( +/obj/structure/ladder, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/starboard/central/upper) "ntJ" = ( /obj/structure/railing, /obj/machinery/camera/autoname/directional/north{ network = list("aicore") }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ntN" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) @@ -46680,14 +49721,23 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/explab) -"ntW" = ( -/obj/structure/cable, -/obj/effect/spawner/random/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"ntV" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"nuh" = ( +/obj/machinery/light/floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/fore) +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "nuw" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -46700,22 +49750,32 @@ /turf/open/floor/engine/hull/air, /area/station/hallway/secondary/construction) "nuz" = ( -/obj/effect/turf_decal/siding/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/stripes, +/turf/open/floor/iron/textured, +/area/station/command/eva) "nuG" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"nuP" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Abandoned Bar" +"nuJ" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) +"nuR" = ( +/obj/structure/cable, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/floor, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "nuT" = ( /obj/machinery/status_display/evac/directional/east, /obj/machinery/light/directional/east, @@ -46730,11 +49790,23 @@ }, /area/station/hallway/primary/fore) "nuU" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/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/window/reinforced/spawner/directional/south, +/obj/machinery/door/window/right/directional/west{ + name = "First Aid Supplies"; + req_access = list("medical") + }, +/obj/structure/table/reinforced/rglass, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "nuZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -46757,17 +49829,19 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "nvn" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/openspace, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, /area/station/medical/chemistry) "nvp" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "nvt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -46792,12 +49866,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"nvA" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/science/server) "nvB" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/power/terminal{ @@ -46808,12 +49876,9 @@ /area/station/solars/starboard/aft) "nvG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/security/courtroom) -"nvM" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/station/maintenance/starboard/lesser) "nvO" = ( /obj/structure/barricade/wooden, /obj/effect/spawner/random/maintenance/two, @@ -46850,55 +49915,43 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/plating, /area/station/maintenance/central) -"nwd" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/iron/white/textured_half, -/area/station/science/robotics) -"nwe" = ( -/obj/machinery/vatgrower, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) "nwo" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, /turf/open/floor/wood, /area/station/commons/storage/tools) -"nws" = ( -/obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/fore) -"nwC" = ( +"nwG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"nwG" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) +"nwH" = ( +/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) +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) "nwJ" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"nwK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) "nwQ" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 +/obj/machinery/conveyor{ + dir = 6; + id = "mining" }, -/obj/structure/chair/sofa/corner/brown, -/obj/effect/spawner/random/maintenance, /turf/open/floor/iron/textured, /area/station/cargo/storage) "nwT" = ( @@ -46938,35 +49991,18 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"nxi" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 +"nxq" = ( +/obj/machinery/power/turbine/turbine_outlet{ + dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/external, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/turf/open/floor/engine, +/area/station/engineering/atmos/upper) "nxr" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"nxs" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/service_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"nxv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/clothing/head/wig/random, -/obj/item/bodypart/head/lizard, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/space/nearstation) "nxG" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner/end{ @@ -46982,14 +50018,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/armory, /turf/open/floor/plating, /area/station/security/execution/education) -"nxN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/holopad, -/obj/effect/landmark/start/depsec/engineering, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/engineering) "nxR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47012,27 +50040,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nyb" = ( /obj/structure/closet, /obj/effect/spawner/random/clothing/funny_hats, /turf/open/floor/plating, /area/station/maintenance/port) -"nym" = ( -/obj/structure/table, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/item/pen, -/obj/structure/sign/poster/contraband/missing_gloves/directional/west, -/turf/open/floor/wood, -/area/station/commons/dorms) -"nyq" = ( -/turf/open/floor/iron/dark/smooth_half, -/area/station/service/library) -"nyz" = ( -/obj/structure/ladder, -/obj/effect/turf_decal/stripes/box, +"nye" = ( +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, /turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/area/station/engineering/atmos) +"nyh" = ( +/obj/item/stack/rods{ + amount = 7 + }, +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) "nyA" = ( /obj/machinery/camera/motion{ c_tag = "Vault - Lower"; @@ -47045,11 +50074,17 @@ /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "nyB" = ( /obj/structure/chair/stool/bar/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/lounge) +"nyF" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "nyG" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -47085,32 +50120,46 @@ /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) "nzd" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 }, /obj/machinery/light/directional/east, -/obj/structure/sign/directions/medical/directional/east{ - dir = 2 - }, /obj/effect/turf_decal/trimline/green/filled/mid_joiner{ dir = 4 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) "nzj" = ( -/obj/machinery/chem_master, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ dir = 4 }, -/obj/machinery/firealarm/directional/east, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/folder/white{ + pixel_x = -1; + pixel_y = 3 + }, +/obj/item/pen{ + pixel_x = -3; + pixel_y = 9 + }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) +"nzx" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "nzy" = ( /obj/structure/closet/crate/trashcart/filled, /obj/structure/sign/poster/contraband/random/directional/west, @@ -47127,16 +50176,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/security/lockers) -"nzG" = ( -/obj/structure/transport/linear{ - radial_travel = 0 - }, -/turf/open/openspace, -/area/station/engineering/break_room) -"nzZ" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "nAc" = ( /obj/structure/fans/tiny/invisible, /obj/effect/turf_decal/stripes/line{ @@ -47150,8 +50189,8 @@ /obj/machinery/door/airlock/grunge{ name = "Under The Stairs" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) "nAf" = ( @@ -47172,14 +50211,19 @@ /obj/structure/closet/crate/trashcart/filled, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"nAA" = ( -/obj/structure/sign/poster/random/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/decal/cleanable/dirt, +"nAv" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/locker) +"nAx" = ( +/obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/area/station/maintenance/starboard/fore/upper) "nAB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -47188,23 +50232,13 @@ }, /turf/open/floor/plating, /area/station/science/cytology) -"nAN" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/machinery/atmospherics/components/binary/valve/digital{ - name = "Waste Release"; - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) -"nAS" = ( -/obj/item/cigbutt{ - pixel_x = 7; - pixel_y = 14 +"nAM" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "nAY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -47212,51 +50246,18 @@ }, /turf/open/floor/iron, /area/station/construction/storage_wing) -"nBg" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "nBi" = ( /obj/structure/barricade/sandbags, /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"nBq" = ( -/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 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) -"nBr" = ( -/obj/structure/frame/computer{ - anchored = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 +"nBm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) -"nBs" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/area/station/engineering/supermatter/room/upper) "nBu" = ( /obj/structure/closet/crate/trashcart/laundry, /turf/open/floor/plating, @@ -47271,7 +50272,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "nBE" = ( /obj/effect/spawner/random/trash/graffiti{ pixel_y = 32 @@ -47288,6 +50289,20 @@ }, /turf/open/floor/iron/white/smooth_corner, /area/station/hallway/secondary/entry) +"nBR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/starboard/fore) +"nBS" = ( +/obj/structure/closet, +/obj/effect/landmark/start/hangover, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction) "nCc" = ( /obj/effect/decal/cleanable/blood/drip, /turf/open/floor/plating, @@ -47307,10 +50322,20 @@ /turf/open/floor/iron, /area/station/science/lab) "nCg" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/structure/chair/sofa/left/brown{ + dir = 1 + }, +/obj/effect/landmark/start/shaft_miner, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/cargo/storage) +"nCh" = ( +/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, +/area/station/engineering/supermatter/room) "nCo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/dark_blue{ @@ -47319,6 +50344,11 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) +"nCp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/aft) "nCt" = ( /obj/machinery/modular_computer/preset/civilian{ dir = 1 @@ -47336,38 +50366,12 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "nCw" = ( +/obj/effect/decal/cleanable/generic, /obj/structure/railing{ - dir = 1 - }, -/obj/structure/rack, -/obj/effect/spawner/random/aimodule/harmless{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/effect/spawner/random/aimodule/harmless{ - pixel_x = -3; - pixel_y = -2 + dir = 5 }, -/obj/effect/decal/cleanable/generic, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) -"nCx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1 - }, -/obj/effect/mapping_helpers/mail_sorting/science/genetics, -/obj/effect/mapping_helpers/mail_sorting/science/rd_office, -/obj/effect/mapping_helpers/mail_sorting/science/xenobiology, -/obj/effect/mapping_helpers/mail_sorting/science/research, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"nCC" = ( -/obj/machinery/light/directional/north, -/obj/machinery/light_switch/directional/north, -/obj/structure/closet/wardrobe/white, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) +/area/station/ai/upload/chamber) "nCI" = ( /obj/machinery/component_printer, /obj/effect/turf_decal/bot_white, @@ -47377,14 +50381,16 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/port) -"nCO" = ( -/obj/machinery/airalarm/directional/south, -/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/line, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +"nCT" = ( +/obj/structure/table/wood, +/obj/item/radio/intercom{ + broadcasting = 1; + dir = 8; + listening = 0; + name = "Station Intercom (Court)" + }, +/turf/open/floor/carpet, +/area/station/security/courtroom) "nDe" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47410,41 +50416,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/security/courtroom) -"nDB" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/table, -/obj/item/pai_card, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) -"nDK" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/vending/wardrobe/medi_wardrobe, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/camera/autoname/directional/north{ - c_tag = "Medbay - Upper Medical Storage North" - }, -/obj/machinery/light_switch/directional/north, -/turf/open/openspace, -/area/station/medical/storage) -"nDM" = ( -/obj/item/reagent_containers/cup/glass/bottle/wine_voltaic{ - pixel_y = 5; - pixel_x = 7 - }, -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/shaker{ - pixel_y = 6; - pixel_x = -6 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "nDS" = ( /obj/effect/turf_decal/siding/blue, /obj/effect/turf_decal/siding/blue{ @@ -47453,6 +50424,10 @@ /obj/effect/turf_decal/arrows{ dir = 4 }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + location = "Head of Personnel" + }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "nDX" = ( @@ -47469,15 +50444,27 @@ /obj/effect/landmark/start/hangover, /turf/open/openspace, /area/station/hallway/primary/fore) -"nEq" = ( -/obj/structure/table/wood, -/obj/item/food/grown/harebell, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) -"nEA" = ( +"nEn" = ( +/obj/structure/railing, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) +"nEr" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) +"nEt" = ( +/obj/structure/girder, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/structure/electrified_grille, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "nEM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47487,64 +50474,64 @@ /area/station/maintenance/starboard/central) "nEO" = ( /obj/machinery/piratepad/civilian, -/obj/effect/turf_decal/tile/brown/fourcorners, /obj/machinery/camera/autoname/directional/west, /obj/machinery/status_display/ai/directional/west, +/obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/starboard) "nEQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"nES" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/area/station/ai/satellite/interior) +"nEW" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/plating, -/area/station/maintenance/starboard/central) -"nFx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/layer1, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/area/station/maintenance/starboard) +"nEX" = ( +/obj/structure/table, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/item/pen, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/large, +/area/station/commons/dorms) +"nFp" = ( +/obj/effect/landmark/firealarm_sanity, +/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) +"nFz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "nFA" = ( -/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/light/directional/north, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/carpet, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "nFB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/machinery/button/door/incinerator_vent_ordmix{ + pixel_y = 8; + pixel_x = -8 + }, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) -"nFD" = ( -/obj/machinery/holopad, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) -"nFE" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - dir = 8 - }, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) "nFI" = ( /obj/effect/spawner/random/maintenance, /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/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "nFL" = ( /turf/closed/wall/r_wall, /area/station/security/execution/transfer) @@ -47582,13 +50569,10 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) -"nGp" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) +"nGq" = ( +/obj/structure/sign/poster/ripped/directional/south, +/turf/closed/wall, +/area/station/maintenance/department/medical) "nGr" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -47597,8 +50581,9 @@ /obj/structure/railing/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/openspace, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "nGs" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47624,32 +50609,27 @@ /obj/effect/spawner/random/trash/grime, /turf/open/floor/iron/sepia, /area/station/hallway/secondary/construction) -"nGB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/engineering/main) +"nGA" = ( +/turf/open/floor/glass/plasma, +/area/station/engineering/atmos/upper) "nGH" = ( -/obj/effect/turf_decal/siding/red{ - dir = 6 - }, -/obj/structure/filingcabinet{ - pixel_x = 4 - }, /obj/structure/railing{ dir = 6 }, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/turf/open/floor/iron/dark, +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/wood/large, /area/station/hallway/primary/central) -"nGI" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +"nGP" = ( +/obj/machinery/button/door/directional/west{ + id = "Disposal Exit"; + name = "Disposal Vent Control"; + pixel_x = -10 + }, +/turf/closed/wall, +/area/station/maintenance/disposal) "nGR" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -47657,6 +50637,21 @@ }, /turf/open/openspace, /area/station/command/gateway) +"nGV" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/newscaster/directional/west, +/obj/structure/table/reinforced/rglass, +/obj/item/storage/toolbox/emergency{ + pixel_x = -2 + }, +/obj/item/storage/toolbox/emergency{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "nGW" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -47708,6 +50703,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"nHG" = ( +/obj/item/training_toolbox{ + pixel_y = 6 + }, +/obj/item/training_toolbox, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/obj/structure/rack, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "nHL" = ( /mob/living/basic/slime, /turf/open/floor/engine, @@ -47716,6 +50723,11 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) +"nIa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "nIo" = ( /obj/machinery/door/airlock/command{ name = "Captain's Quarters" @@ -47726,14 +50738,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/carpet, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) -"nIq" = ( -/obj/effect/turf_decal/siding/brown/end{ - dir = 8 - }, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) "nIu" = ( /obj/structure/table, /obj/item/reagent_containers/cup/beaker/large{ @@ -47751,20 +50759,16 @@ /obj/item/folder/red, /turf/open/floor/iron/dark/smooth_large, /area/station/security/courtroom) -"nID" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) -"nIH" = ( -/obj/structure/weightmachine, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +"nIC" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/turf/open/floor/plating/airless, +/area/station/maintenance/starboard/aft/upper) "nIL" = ( /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -47784,6 +50788,13 @@ }, /turf/open/floor/iron/textured_large, /area/station/medical/virology) +"nIX" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "nIY" = ( /obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/turf_decal/box/red, @@ -47822,7 +50833,7 @@ pixel_y = 2 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nJS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/disposal/bin, @@ -47832,9 +50843,12 @@ /turf/open/floor/iron/freezer, /area/station/commons/toilet/auxiliary) "nJU" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Bay" }, +/obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron, /area/station/cargo/storage) "nJV" = ( @@ -47842,43 +50856,90 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) +"nJW" = ( +/obj/structure/sign/warning/no_smoking/directional/west, +/obj/machinery/chem_dispenser, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/station/medical/chemistry) +"nKe" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/turf/open/openspace, +/area/station/engineering/lobby) +"nKf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "nKj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/barricade/sandbags, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) +"nKk" = ( +/obj/effect/decal/cleanable/blood/old, +/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, +/area/station/maintenance/starboard/central/upper) "nKn" = ( /obj/structure/stairs/south, /turf/open/floor/iron/textured_large, /area/station/medical/virology) +"nKp" = ( +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/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/manifold4w/cyan/visible, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "nKr" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 5 }, -/obj/structure/rack, /obj/machinery/firealarm/directional/east, +/obj/structure/rack, +/obj/item/pushbroom, /turf/open/floor/iron, /area/station/cargo/storage) -"nKz" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"nKB" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/table/glass, -/obj/item/storage/box/bodybags{ - pixel_x = 5; - pixel_y = 10 +"nKs" = ( +/obj/machinery/digital_clock/directional/south, +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/red/box, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Chem Factory"; + req_access = list("plumbing") }, -/obj/item/pen, -/turf/open/floor/wood, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) +"nKB" = ( +/obj/machinery/shower/directional/south, +/obj/effect/turf_decal/tile/blue/full, +/obj/effect/turf_decal/siding/blue/end, +/turf/open/floor/iron/showroomfloor, /area/station/medical/medbay/central) -"nKD" = ( -/obj/effect/landmark/start/station_engineer, -/obj/structure/cable/layer1, -/turf/open/floor/catwalk_floor, -/area/station/engineering/main) +"nKE" = ( +/obj/machinery/door/airlock{ + id_tag = "Cabin2"; + name = "Decomissioned Cabin" + }, +/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/textured_large, +/area/station/commons/dorms) "nKJ" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 @@ -47887,7 +50948,7 @@ /turf/open/floor/iron/dark/textured_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nKP" = ( /obj/structure/sign/departments/restroom/directional/east, /obj/effect/turf_decal/trimline/dark_blue/warning, @@ -47897,7 +50958,11 @@ /turf/open/floor/iron/white/smooth_corner{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) +"nKW" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "nLl" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, @@ -47916,6 +50981,10 @@ "nLp" = ( /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"nLt" = ( +/obj/structure/lattice/catwalk, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/department/crew_quarters/dorms) "nLC" = ( /obj/effect/turf_decal/siding/brown, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -47942,32 +51011,29 @@ }, /area/station/science/robotics/lab) "nLU" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white/textured_corner{ - dir = 4 +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rear_surgery"; + name = "Surgery Shutters"; + dir = 1 }, +/turf/open/floor/plating, /area/station/medical/surgery) -"nMp" = ( -/obj/effect/turf_decal/siding/brown, -/obj/structure/chair/sofa/corp/left{ - dir = 1 +"nLZ" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"nMu" = ( -/obj/machinery/holopad, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"nMr" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/carpet/black, +/area/station/service/library/private) "nMC" = ( -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/oil/slippery, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "nML" = ( @@ -47975,13 +51041,6 @@ /obj/structure/closet/l3closet/scientist, /turf/open/openspace, /area/station/command/gateway) -"nMV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/engineering/atmos/project) "nNd" = ( /obj/structure/railing/corner{ dir = 8 @@ -48001,10 +51060,35 @@ /obj/machinery/light/floor, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) +"nNg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"nNi" = ( +/obj/machinery/door/airlock/maintenance, +/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/engineering/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmosengimainttriangle" + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "nNj" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Bridge Escape" + }, +/obj/machinery/door/firedoor, /obj/structure/cable, -/turf/closed/wall, -/area/station/maintenance/central) +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "nNt" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/mecha_wreckage/ripley{ @@ -48014,15 +51098,21 @@ /turf/open/floor/iron, /area/station/maintenance/starboard/central) "nNu" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/stripes{ + dir = 4 }, -/obj/structure/railing{ +/obj/effect/turf_decal/stripes{ dir = 8 }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/turf/open/floor/iron/textured, +/area/station/command/eva) +"nNA" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/aft) "nNC" = ( /obj/machinery/power/smes, /obj/structure/cable, @@ -48058,27 +51148,33 @@ /turf/open/floor/iron/smooth_edge{ dir = 4 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "nNY" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 }, /turf/open/floor/iron/smooth, /area/station/engineering/main) -"nNZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white/textured_corner{ - dir = 1 - }, -/area/station/medical/surgery) "nOe" = ( -/obj/structure/statue/sandstone/venus, +/obj/machinery/requests_console/auto_name/directional/north, +/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/dark_blue/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"nOm" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/east{ + id = "Cabin9"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/wood, -/area/station/command/meeting_room/council) +/area/station/commons/dorms) "nOo" = ( /obj/structure/closet/crate/coffin, /obj/effect/decal/cleanable/dirt, @@ -48104,32 +51200,50 @@ /obj/machinery/airalarm/directional/south, /obj/machinery/washing_machine, /turf/open/floor/iron/white/textured_half, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nOF" = ( -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "HoPsToy"; - name = "Loading Conveyor"; - pixel_x = -13; - pixel_y = 8 - }, -/obj/structure/chair/comfy/brown{ +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, -/obj/effect/landmark/start/head_of_personnel, -/turf/open/floor/carpet, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) +"nOK" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) +"nOT" = ( +/obj/item/statuebust, +/obj/machinery/light/cold/no_nightlight/directional/east, +/turf/open/floor/iron/vaporwave, +/area/station/maintenance/starboard/aft/upper) +"nOV" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port) "nPb" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/watertank, /obj/structure/sign/poster/contraband/space_cola/directional/north, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) "nPe" = ( /obj/structure/railing{ dir = 4 }, -/turf/open/floor/carpet, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) "nPf" = ( /obj/effect/decal/cleanable/dirt, @@ -48149,61 +51263,16 @@ /obj/machinery/suit_storage_unit/security, /turf/open/floor/iron/dark/smooth_large, /area/station/security/eva) -"nPA" = ( -/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 = -4; - pixel_y = -3 - }, -/obj/structure/table/reinforced, -/obj/structure/lattice/catwalk, -/obj/machinery/door/window/right/directional/west{ - name = "First Aid Supplies"; - req_access = list("medical") - }, -/turf/open/openspace, -/area/station/medical/storage) -"nPB" = ( -/obj/effect/spawner/random/structure/girder, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "nPN" = ( /turf/open/floor/wood/large, /area/station/hallway/secondary/service) -"nPP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable/layer1, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"nPS" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/machinery/atmospherics/components/binary/pump/on/layer5{ - name = "N2 to Airmix" - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "nPW" = ( /obj/structure/disposalpipe/segment{ dir = 5 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 8 + }, /area/station/hallway/primary/central) "nPY" = ( /obj/effect/decal/cleanable/dirt, @@ -48232,15 +51301,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"nQs" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ +"nQu" = ( +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "nQw" = ( /obj/structure/railing/corner/end{ dir = 4 @@ -48256,6 +51323,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/construction/storage_wing) +"nQE" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark/corner, +/obj/effect/turf_decal/trimline/dark/corner, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "nQG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48279,13 +51355,6 @@ }, /turf/open/floor/grass, /area/station/science/genetics) -"nRk" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "nRm" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/tile, @@ -48301,12 +51370,10 @@ /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs) "nRz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/qm) +/obj/effect/turf_decal/stripes/line, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "nRE" = ( /turf/open/openspace, /area/station/medical/medbay/central) @@ -48318,6 +51385,12 @@ /obj/effect/landmark/start/depsec/science, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) +"nRN" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "nRP" = ( /obj/machinery/power/solar_control{ dir = 1; @@ -48327,25 +51400,6 @@ /obj/structure/cable, /turf/open/floor/glass/reinforced, /area/station/solars/starboard/fore) -"nRS" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/machinery/computer/security/telescreen/minisat/directional/west, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"nSk" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 9 - }, -/obj/machinery/vending/drugs, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/medbay/central) -"nSp" = ( -/obj/structure/closet/radiation, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "nSs" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48363,16 +51417,10 @@ /turf/open/floor/iron, /area/station/hallway/primary/port) "nSu" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/bodybags{ - pixel_x = 4; - pixel_y = 14 - }, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -1; - pixel_y = 7 +/obj/structure/bodycontainer/morgue{ + dir = 1 }, -/obj/machinery/status_display/ai/directional/south, +/obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) "nSx" = ( @@ -48380,20 +51428,29 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet, /area/station/service/abandoned_gambling_den) -"nSS" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/firealarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 +"nSK" = ( +/obj/structure/table/reinforced, +/obj/item/trash/candle{ + pixel_x = 11; + pixel_y = 11 }, -/obj/machinery/conveyor{ - dir = 8; - id = "mining" +/obj/item/trash/candle{ + pixel_x = 7; + pixel_y = 3 }, -/obj/machinery/bouldertech/refinery, -/obj/structure/railing{ - dir = 1 +/obj/item/trash/candle{ + pixel_x = -9; + pixel_y = 9 + }, +/turf/open/floor/wood, +/area/station/maintenance/starboard) +"nSS" = ( +/obj/item/radio/intercom/directional/south, +/obj/structure/closet/secure_closet/miner, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 }, +/obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron, /area/station/cargo/miningoffice) "nSX" = ( @@ -48410,6 +51467,23 @@ }, /turf/open/floor/iron, /area/station/science/explab) +"nTf" = ( +/obj/machinery/computer/atmos_control/nitrous_tank, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"nTg" = ( +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/plating, +/area/station/engineering/storage_shared) "nTj" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/siding/dark{ @@ -48422,7 +51496,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "nTl" = ( /obj/structure/table, /obj/item/clothing/head/soft/grey{ @@ -48439,16 +51513,6 @@ }, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"nTp" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/turf_decal/stripes/corner, -/obj/structure/tank_dispenser, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "nTv" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -48464,6 +51528,9 @@ }, /turf/open/floor/glass/reinforced, /area/station/service/library) +"nTy" = ( +/turf/open/floor/engine/hull/air, +/area/station/commons/fitness/recreation) "nTA" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, @@ -48481,49 +51548,41 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/science/lab) -"nTM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron/white, -/area/station/maintenance/starboard/lesser) +"nTU" = ( +/obj/item/ammo_casing/spent{ + pixel_x = 8; + pixel_y = 6 + }, +/obj/item/ammo_casing/spent{ + pixel_x = -6; + pixel_y = -5 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "nTX" = ( /obj/structure/lattice/catwalk, /obj/machinery/airalarm/directional/south, /turf/open/floor/engine/hull/air, /area/station/construction/storage_wing) "nUd" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/decal/cleanable/wrapping, -/obj/effect/turf_decal/tile/brown/fourcorners, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/railing/corner/end{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"nUj" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/openspace, -/area/station/engineering/break_room) -"nUk" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/railing{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/blood/oil/slippery, +/obj/structure/closet/crate, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/wrapping_paper, +/obj/item/stack/wrapping_paper, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/toilet/restrooms) +/turf/open/floor/iron/dark/textured, +/area/station/cargo/sorting) +"nUi" = ( +/turf/open/floor/iron/vaporwave, +/area/station/maintenance/starboard/aft/upper) "nUo" = ( /obj/structure/lattice/catwalk, /obj/effect/spawner/random/maintenance, @@ -48532,7 +51591,18 @@ "nUq" = ( /obj/structure/ladder, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) +"nUr" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/fluff/shower_drain, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "nUw" = ( /mob/living/carbon/human/species/monkey, /obj/effect/turf_decal/weather/dirt{ @@ -48551,15 +51621,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/science/lobby) -"nUB" = ( -/obj/structure/lattice/catwalk, -/obj/item/kirbyplants/random/dead{ - desc = "You guys had ONE job."; - name = "the community's plant" - }, -/obj/structure/railing, -/turf/open/openspace, -/area/station/commons/dorms) "nUC" = ( /obj/machinery/newscaster/directional/east{ pixel_y = 2 @@ -48580,6 +51641,13 @@ }, /turf/open/floor/iron/dark/smooth_edge, /area/station/commons/lounge) +"nUF" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "nUV" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -48591,11 +51659,12 @@ /turf/open/floor/iron/dark, /area/station/science/xenobiology) "nVc" = ( -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, /obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, +/obj/structure/chair/plastic, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, /area/station/hallway/primary/central) "nVg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, @@ -48617,9 +51686,21 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/security/prison) +"nVz" = ( +/obj/structure/railing/corner, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "nVE" = ( /turf/closed/wall/r_wall, /area/station/service/abandoned_gambling_den) +"nVV" = ( +/obj/item/banner/command/mundane, +/turf/open/floor/plating, +/area/station/maintenance/port) +"nVY" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/recharge_floor, +/area/station/maintenance/starboard/aft/upper) "nWe" = ( /obj/structure/cable, /obj/machinery/power/emitter/welded{ @@ -48638,14 +51719,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/science/robotics) -"nWs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/cigbutt{ - pixel_x = -12; - pixel_y = 11 +"nWu" = ( +/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ + dir = 4 }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) +/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ + dir = 4 + }, +/obj/structure/sign/warning/directional/west, +/turf/open/floor/plating, +/area/station/engineering/atmos/office) "nWD" = ( /obj/structure/railing{ dir = 8 @@ -48664,7 +51747,7 @@ pixel_y = 8 }, /turf/open/floor/catwalk_floor/iron_smooth, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "nWI" = ( /obj/effect/spawner/random/contraband/permabrig_weapon, /obj/effect/spawner/random/structure/crate_loot, @@ -48680,8 +51763,11 @@ /turf/open/floor/wood/large, /area/station/commons/lounge) "nWO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, +/obj/machinery/light/directional/east, +/obj/effect/landmark/start/captain, +/obj/structure/bed/double, +/obj/item/bedsheet/captain/double, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "nWS" = ( /obj/effect/turf_decal/stripes/line{ @@ -48700,16 +51786,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/smooth, /area/station/science/robotics) -"nWV" = ( -/obj/item/radio/intercom/directional/south, -/obj/structure/lattice/catwalk, -/obj/machinery/camera/directional/south{ - c_tag = "Cargo Bay - Security Post (High)"; - pixel_x = 14 - }, -/obj/effect/landmark/event_spawn, -/turf/open/openspace, -/area/station/security/checkpoint/supply) +"nWX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "nWY" = ( /obj/structure/disposalpipe/trunk/multiz/down{ dir = 2 @@ -48726,6 +51808,14 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) +"nXh" = ( +/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/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "nXi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48742,18 +51832,31 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat_interior) -"nXp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"nXr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 +/area/station/ai/satellite/interior) +"nXq" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos) +"nXw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/freezer, -/area/station/engineering/atmos/pumproom) +/turf/open/floor/plating, +/area/station/medical/medbay/central) +"nXB" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood, +/area/station/commons/toilet/restrooms) "nXQ" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 @@ -48768,7 +51871,15 @@ name = "AI Core Access" }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"nXR" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/showcase/horrific_experiment, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) "nXY" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 @@ -48779,7 +51890,7 @@ /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/turret_protected/ai) +/area/station/ai/satellite/chamber) "nYc" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance/no_decals/six, @@ -48818,7 +51929,17 @@ network = list("minisat") }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"nYA" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "nYD" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "SM_shutters"; @@ -48828,47 +51949,31 @@ /area/station/engineering/supermatter) "nYQ" = ( /turf/open/floor/iron/smooth_half, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"nYR" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/ai/satellite/foyer) "nYT" = ( +/obj/structure/ladder, /obj/structure/railing{ dir = 4 }, -/obj/structure/ladder, -/obj/effect/turf_decal/siding/wood{ +/obj/effect/turf_decal/stripes{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/ai_monitored/command/storage/eva) -"nYZ" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L4" - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) -"nZa" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ +/turf/open/floor/iron/textured, +/area/station/command/eva) +"nYV" = ( +/obj/machinery/atmospherics/components/unary/passive_vent, +/obj/machinery/camera/autoname/directional/west, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"nZb" = ( -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/jungle{ - pixel_y = -7 - }, -/obj/structure/flora/bush/pale/style_random, -/turf/open/floor/grass, -/area/station/maintenance/starboard/fore) +/obj/structure/sign/warning/hot_temp/directional/west, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"nYZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/royalblue, +/area/station/command/heads_quarters/captain/private) "nZd" = ( /obj/machinery/mass_driver/ordnance{ dir = 4; @@ -48878,6 +51983,14 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"nZq" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/duct, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "nZt" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -48971,36 +52084,47 @@ "oaj" = ( /turf/closed/wall, /area/station/security/medical) -"oaA" = ( -/obj/machinery/camera/autoname/directional/north, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) +"oam" = ( +/turf/open/floor/engine/hull/air, +/area/station/medical/medbay/central) +"oan" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "oaF" = ( -/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/structure/window/reinforced/spawner/directional/west, /obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/qm) +/obj/effect/turf_decal/trimline/brown/filled/warning{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "oaQ" = ( /obj/structure/disposalpipe/segment{ dir = 10 }, /turf/closed/wall/r_wall, /area/station/science/xenobiology) +"oaX" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/start/chief_engineer, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "obn" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/central) -"obp" = ( -/obj/machinery/fax{ - fax_name = "Chief Engineer's Office"; - name = "Chief Engineer's Fax Machine" - }, -/obj/structure/table/reinforced, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "obu" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /obj/effect/turf_decal/trimline/yellow, @@ -49011,7 +52135,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "obv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/holopad, @@ -49024,22 +52148,36 @@ /obj/structure/flora/rock/style_4, /obj/structure/flora/bush/flowers_br/style_3, /turf/open/floor/grass, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "obJ" = ( +/obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, /obj/machinery/door/airlock/external{ name = "Mining Dock Airlock" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "miningshuttleexit" - }, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"obM" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage{ + pixel_x = 5; + pixel_y = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "obQ" = ( +/obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, -/obj/structure/disposalpipe/segment, +/obj/machinery/light_switch/directional/north, +/obj/structure/bed/medical/emergency{ + dir = 4 + }, /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, @@ -49051,10 +52189,6 @@ /obj/effect/landmark/start/research_director, /turf/open/floor/glass/reinforced, /area/station/command/heads_quarters/rd) -"oce" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "ocj" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -49066,11 +52200,17 @@ /turf/open/floor/wood, /area/station/commons/storage/tools) "ocq" = ( -/obj/machinery/plumbing/receiver{ +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 }, -/turf/open/floor/wood, -/area/station/medical/medbay/central) +/obj/machinery/door/window/left/directional/north{ + name = "Anti Assistant Protection Door"; + req_access = list("medical") + }, +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/obj/effect/turf_decal/tile/dark_green/diagonal_centre, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/cryo) "ocy" = ( /obj/machinery/door/airlock/silver{ name = "Freezer" @@ -49084,14 +52224,6 @@ }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"ocF" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 10 - }, -/obj/structure/cable, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/smooth, -/area/station/engineering/main) "ocG" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -49104,16 +52236,13 @@ /turf/open/floor/iron/grimy, /area/station/security/detectives_office/private_investigators_office) "ocL" = ( -/obj/structure/table/wood, -/obj/machinery/computer/security/wooden_tv{ - pixel_x = 1; - pixel_y = 6 - }, -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/meeting_room/council) +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "ocN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49141,11 +52270,24 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden/abandoned) +"ocW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock{ + id_tag = "Cabin9"; + name = "Cabin 9" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/commons/dorms) "odd" = ( /obj/structure/railing{ dir = 1 }, /obj/structure/ladder, +/obj/effect/turf_decal/stripes/white/box, /turf/open/floor/engine/hull/air, /area/station/maintenance/port) "odg" = ( @@ -49162,17 +52304,13 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/service/chapel/office) -"odB" = ( -/obj/item/cigbutt{ - pixel_x = 8; - pixel_y = -2 - }, +"odo" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"odE" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) +/area/station/maintenance/starboard/upper) "odM" = ( /obj/item/bodypart/head/lizard, /obj/effect/decal/cleanable/blood/old, @@ -49184,7 +52322,7 @@ }, /obj/machinery/light/directional/south, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "odZ" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/dark_blue{ @@ -49193,6 +52331,15 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) +"oef" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) "oey" = ( /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, @@ -49214,34 +52361,22 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood/tile, /area/station/science/robotics) -"oeF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/lattice/catwalk, +"oeH" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) +"oeQ" = ( +/obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) -"oeR" = ( -/obj/structure/table, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) -"oeV" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "O2 Multideck Adapter"; - dir = 8 - }, -/obj/machinery/meter{ - name = "O2 meter" +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/carpet, +/area/station/maintenance/starboard) "ofc" = ( /obj/machinery/digital_clock/directional/west, /obj/structure/disposalpipe/trunk{ @@ -49268,27 +52403,16 @@ }, /area/station/hallway/primary/fore) "ofr" = ( -/obj/structure/closet, -/obj/item/clothing/gloves/radio, -/obj/item/clothing/suit/jacket/straight_jacket, -/obj/item/clothing/glasses/eyepatch, -/obj/item/clothing/glasses/blindfold, -/obj/item/clothing/glasses/blindfold, -/obj/item/clothing/ears/earmuffs{ - pixel_y = 3 - }, -/obj/item/clothing/ears/earmuffs{ - pixel_y = 3 - }, -/obj/item/storage/box/rxglasses, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/item/reagent_containers/cup/beaker/cryoxadone, +/obj/machinery/firealarm/directional/east, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, /turf/open/floor/iron/dark, /area/station/medical/cryo) +"ofs" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/blood/drip, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "ofE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49297,6 +52421,13 @@ /obj/machinery/door/firedoor, /turf/open/floor/wood/large, /area/station/service/bar) +"ofK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "ofL" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -49313,6 +52444,15 @@ dir = 4 }, /area/station/science/robotics) +"ofY" = ( +/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/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "ogc" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -49331,31 +52471,22 @@ /obj/structure/sign/warning/yes_smoking/circle/directional/west, /turf/open/floor/iron, /area/station/science/research) -"ogn" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/station/maintenance/starboard/lesser) -"ogB" = ( -/obj/machinery/power/turbine/core_rotor{ - dir = 8; - mapping_id = "main_turbine" - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) "ogF" = ( /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/hallway/primary/central) -"ogG" = ( -/obj/structure/table, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/item/newspaper, -/turf/open/floor/wood, -/area/station/commons/dorms) +"ogR" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/computer/atmos_control/plasma_tank, +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "ohb" = ( /obj/machinery/airalarm/directional/south, /obj/item/toy/crayon/white{ @@ -49372,9 +52503,20 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) +"ohd" = ( +/obj/machinery/shieldgen, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "ohh" = ( /turf/open/floor/grass, /area/station/science/cytology) +"ohi" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/item/kirbyplants/random, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "ohp" = ( /obj/effect/spawner/random/trash/graffiti{ pixel_y = 32 @@ -49393,13 +52535,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"ohw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "ohy" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49408,13 +52543,20 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/openspace, /area/station/hallway/primary/port) -"ohJ" = ( -/obj/structure/disposalpipe/trunk/multiz/down{ +"ohG" = ( +/turf/closed/wall, +/area/station/maintenance/aft) +"ohH" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ dir = 4 }, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/maintenance/starboard/fore) +/obj/structure/cable, +/obj/machinery/light_switch/directional/west{ + pixel_y = -6 + }, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "ohP" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -49439,18 +52581,38 @@ /obj/structure/sign/departments/virology/directional/east, /turf/open/floor/plating, /area/station/medical/virology) +"oim" = ( +/obj/item/cigbutt{ + pixel_x = -12; + pixel_y = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "oio" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/light/warm/directional/south, /obj/structure/flora/grass/jungle/a/style_2, /obj/structure/flora/bush/flowers_br/style_2, /turf/open/floor/grass, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "oip" = ( /obj/structure/railing, /obj/effect/turf_decal/trimline/brown/filled/line, /turf/open/floor/iron, /area/station/cargo/storage) +"oit" = ( +/obj/structure/rack, +/obj/item/clothing/gloves/color/fyellow, +/obj/effect/spawner/random/maintenance, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) +"oiw" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "oiz" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -49462,13 +52624,19 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) "oiH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +/obj/structure/closet/secure_closet/personal/patient, +/obj/machinery/light/floor{ + color = "#66ccff" + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/warning{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 4 }, -/obj/structure/cable, -/turf/open/floor/iron/dark, /area/station/medical/cryo) "oiM" = ( /obj/structure/table, @@ -49479,11 +52647,6 @@ /obj/item/electronics/apc, /turf/open/floor/wood, /area/station/commons/storage/tools) -"oiQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) "oiR" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -49493,6 +52656,13 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) +"oiV" = ( +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "oiW" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -49510,19 +52680,13 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "ojj" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L2" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/siding/white/corner{ - dir = 8 +/turf/open/floor/iron/edge{ + dir = 1 }, -/turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"ojr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "ojx" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/dark/smooth_large, @@ -49552,23 +52716,36 @@ /turf/open/floor/wood/tile, /area/station/science/robotics) "ojU" = ( -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/wood, /area/station/service/library) +"ojV" = ( +/obj/structure/lattice/catwalk, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/wrench, +/obj/item/crowbar/red, +/obj/structure/table, +/obj/machinery/newscaster/directional/south, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "ojW" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/closed/wall, /area/station/service/chapel/office) -"ojZ" = ( -/obj/structure/bed, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/dorms) "okc" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced/spawner/directional/south, @@ -49590,17 +52767,13 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/engine/hull/air, /area/station/hallway/secondary/exit/departure_lounge) -"okm" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/north, -/obj/machinery/power/energy_accumulator/tesla_coil/anchored{ - cable_layer = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 5 +"okt" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + dir = 8 }, -/obj/structure/cable/layer1, -/turf/open/floor/engine, -/area/station/engineering/supermatter) +/turf/open/openspace, +/area/station/maintenance/aft/upper) "oky" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -49612,14 +52785,14 @@ /turf/open/floor/wood/large, /area/station/hallway/secondary/service) "okC" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/machinery/flasher/directional/east{ - id = "hopflash" +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + dir = 1; + id = "Lcommissaryshutter"; + name = "Vacant Commissary Shutter" }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/office) "okE" = ( /obj/structure/railing{ dir = 9 @@ -49634,6 +52807,21 @@ }, /turf/open/floor/engine/hull/air, /area/station/maintenance/port) +"okG" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"okJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "okM" = ( /obj/structure/closet/crate{ name = "Spare Chairs" @@ -49650,22 +52838,17 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/wood, /area/station/service/library/printer) -"okO" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"okP" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/camera/autoname/directional/east, -/turf/open/openspace, -/area/station/engineering/lobby) "olm" = ( /obj/structure/stairs/west, /obj/structure/railing, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"oln" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "olv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49673,48 +52856,49 @@ /obj/effect/landmark/navigate_destination/court, /turf/open/floor/carpet, /area/station/security/courtroom) -"olL" = ( -/obj/effect/turf_decal/trimline/white/corner, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/obj/structure/disposalpipe/segment{ - dir = 4 +"olB" = ( +/obj/structure/table, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/item/paper/pamphlet/gateway{ + pixel_x = -13; + pixel_y = 4 }, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) -"olM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/storage/toolbox/emergency, +/obj/structure/sign/poster/contraband/missing_gloves/directional/south, +/turf/open/floor/wood/large, +/area/station/commons/dorms) +"olG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, /turf/open/floor/iron, -/area/station/science/breakroom) -"olU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/area/station/commons/fitness/recreation) +"olH" = ( +/obj/machinery/duct, /obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/commons/dorms) -"omc" = ( -/obj/effect/turf_decal/trimline/yellow/filled, -/obj/item/kirbyplants/random/fullysynthetic, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "omu" = ( -/obj/structure/chair/stool/directional/south, -/obj/machinery/mineral/stacking_unit_console{ - pixel_x = 32 - }, +/obj/item/storage/bag/trash/filled, /turf/open/floor/plating, /area/station/maintenance/disposal) -"omx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/vending/colavend, -/obj/effect/mapping_helpers/broken_machine, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) +"omw" = ( +/obj/machinery/door/window/brigdoor/left/directional/north{ + req_access = list("command"); + name = "Conference Room" + }, +/turf/open/floor/iron/stairs/medium{ + dir = 1 + }, +/area/station/hallway/secondary/command) +"omF" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/storage/tech) "omG" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/siding/purple/corner{ @@ -49725,6 +52909,10 @@ }, /turf/open/floor/iron, /area/station/science/lab) +"omU" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "omX" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -49733,13 +52921,6 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"onh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/hallway) "onj" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/machinery/newscaster/directional/north, @@ -49748,24 +52929,11 @@ }, /turf/open/floor/wood/large, /area/station/medical/psychology) -"onm" = ( -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/decal/cleanable/dirt, -/obj/structure/barricade/wooden/crude, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/machinery/door/airlock/command{ - name = "Abandoned Lab" - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "onn" = ( /obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 8 }, -/obj/effect/decal/cleanable/generic, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) "onv" = ( @@ -49776,16 +52944,11 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/cargo/storage) -"onG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, +"onB" = ( +/obj/structure/sign/poster/contraband/donk_co/directional/east, +/obj/structure/disposalpipe/segment, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/port) "onV" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49793,11 +52956,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) -"oob" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/layer1, -/turf/open/floor/catwalk_floor, -/area/station/engineering/main) +"onW" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "ood" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, @@ -49812,35 +52979,14 @@ /obj/structure/frame/machine, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) +"oov" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "oox" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/carpet, /area/station/security/courtroom) -"ooy" = ( -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"ooF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"ooK" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/item/multitool{ - pixel_x = 7; - pixel_y = -4 - }, -/obj/structure/disposalpipe/trunk/multiz, -/obj/item/stamp/head/qm{ - pixel_x = -6; - pixel_y = 6 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "ooS" = ( /obj/effect/turf_decal/siding/dark/corner{ dir = 1 @@ -49848,7 +52994,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured_edge, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ooY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/closet_maintenance, @@ -49866,19 +53012,18 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) "opj" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/carpet, +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) -"ops" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/emergency, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "opu" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/plating/airless, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "opA" = ( /obj/effect/turf_decal/siding/wood/corner{ @@ -49901,35 +53046,25 @@ /area/station/maintenance/port/fore) "opJ" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/freezer/blood, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/obj/item/reagent_containers/blood/random, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) -"opL" = ( -/obj/machinery/door/airlock/mining{ - name = "Deliveries" - }, -/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/supply/shipping, -/obj/effect/turf_decal/tile/brown/fourcorners, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 +/obj/structure/showcase/machinery/oldpod{ + desc = "An old NT branded sleeper, decommissioned after the lead acetate incident. None of the functional machinery remains inside."; + dir = 1; + name = "decommissioned sleeper" }, -/turf/open/floor/iron, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) +"opL" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/station/cargo/sorting) "opO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/obj/effect/decal/cleanable/greenglow, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) +/obj/structure/reagent_dispensers/water_cooler, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood/large, +/area/station/medical/break_room) "opU" = ( /obj/structure/table, /obj/item/camera{ @@ -49942,6 +53077,16 @@ }, /turf/open/floor/glass, /area/station/science/zoo) +"opV" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood, +/area/station/commons/toilet/restrooms) "opW" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -49963,10 +53108,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_large, /area/station/medical/virology) -"oqd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "oqi" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "hydropony_shutters"; @@ -49975,6 +53116,17 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/service/hydroponics) +"oql" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Gravity Generator Room" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "oqq" = ( /obj/structure/table, /obj/item/folder/red, @@ -49988,18 +53140,9 @@ /turf/open/floor/plating, /area/station/construction/storage_wing) "oqA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/fake_stairs/directional/east, /turf/open/floor/iron, /area/station/cargo/storage) -"oqW" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) "ora" = ( /obj/structure/railing/corner/end, /obj/effect/turf_decal/stripes/corner{ @@ -50014,31 +53157,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/robotics/lab) -"orb" = ( -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"orm" = ( +"ork" = ( /obj/structure/cable, -/obj/structure/sign/poster/random/directional/north, -/obj/effect/mapping_helpers/burnt_floor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/firealarm_sanity, -/turf/open/floor/iron, -/area/station/engineering/main) -"orn" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/table/reinforced, -/obj/item/storage/briefcase/secure{ - pixel_x = -1; - pixel_y = 4 +/obj/structure/disposalpipe/segment{ + dir = 2 }, -/obj/item/paper/monitorkey, -/obj/item/clipboard, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +/turf/open/floor/catwalk_floor/iron, +/area/station/commons/dorms) "orr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/graffiti, @@ -50076,6 +53201,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/research) +"orR" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/iron, +/area/station/engineering/atmos/upper) +"osf" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/edge{ + dir = 1 + }, +/area/station/hallway/primary/central) "osp" = ( /obj/machinery/door/airlock/public/glass{ name = "Departure Balcony" @@ -50083,21 +53225,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine/hull/air, /area/station/hallway/primary/fore) -"osu" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/lobby) "osx" = ( -/obj/machinery/door/poddoor/shutters{ - id = "qm_cargobay"; - name = "Cargo Bay Shutters" +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/window/right/directional/south{ + req_access = list("maint_tunnels"); + name = "Danger: Conveyor Access" }, -/obj/effect/spawner/random/maintenance, -/obj/machinery/door/firedoor, /turf/open/floor/plating, -/area/station/cargo/storage) +/area/station/maintenance/disposal) "osC" = ( /obj/structure/table, /obj/item/clipboard{ @@ -50121,6 +53256,10 @@ /obj/machinery/light/directional/east, /turf/open/floor/carpet/royalblack, /area/station/command/heads_quarters/hos) +"osD" = ( +/obj/structure/lattice, +/turf/open/openspace, +/area/station/maintenance/department/crew_quarters/dorms) "osO" = ( /turf/open/floor/engine{ name = "Holodeck Projector Floor" @@ -50145,25 +53284,29 @@ /turf/open/space/openspace, /area/space/nearstation) "osZ" = ( -/obj/machinery/suit_storage_unit/cmo, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) -"otb" = ( -/obj/structure/sign/directions/command/directional/west{ - dir = 2; - pixel_y = 5 +/obj/item/clothing/gloves/radio, +/obj/item/clothing/suit/jacket/straight_jacket, +/obj/item/clothing/glasses/eyepatch, +/obj/item/clothing/glasses/blindfold, +/obj/item/clothing/glasses/blindfold, +/obj/item/clothing/ears/earmuffs{ + pixel_y = 3 }, -/obj/structure/sign/directions/evac/directional/west{ - dir = 2; - pixel_y = -3 +/obj/structure/closet, +/obj/item/clothing/ears/earmuffs{ + pixel_y = 3 }, -/turf/open/floor/iron, -/area/station/commons/dorms) -"otf" = ( -/obj/structure/cable, -/turf/closed/wall/r_wall, -/area/station/medical/cryo) +/obj/item/storage/box/rxglasses, +/obj/item/reagent_containers/cup/beaker/cryoxadone, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/obj/item/radio/intercom/directional/west, +/obj/item/storage/box/syringes{ + pixel_y = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "oti" = ( /obj/machinery/door/airlock/virology{ name = "Genetics Lab" @@ -50189,14 +53332,27 @@ dir = 8 }, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"otW" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"oui" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/mop_bucket, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "ouo" = ( -/obj/machinery/holopad, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "ouq" = ( /obj/structure/lattice/catwalk, /obj/machinery/vending/cigarette, @@ -50208,6 +53364,10 @@ }, /turf/open/openspace, /area/station/hallway/secondary/construction) +"ouC" = ( +/obj/structure/sign/departments/medbay/alt/directional/south, +/turf/open/openspace, +/area/station/medical/medbay/central) "ouE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -50222,15 +53382,11 @@ }, /turf/open/floor/iron/kitchen, /area/station/hallway/secondary/service) -"ouH" = ( +"ouJ" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/trunk/multiz{ - dir = 4 - }, +/obj/effect/decal/cleanable/blood/footprints, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard) "ouK" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -50240,13 +53396,26 @@ /area/station/hallway/secondary/service) "ouW" = ( /obj/structure/sign/plaques/kiddie/library{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /obj/structure/railing{ dir = 4 }, /turf/open/floor/iron/stairs/right, /area/station/service/library) +"ovh" = ( +/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/opposingcorners{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "ovq" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/carbon_output, /turf/open/floor/engine/co2, @@ -50273,16 +53442,26 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/greater) -"ovN" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/sign/warning/electric_shock/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/engine_smes) +"ovJ" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "ovQ" = ( /obj/effect/spawner/random/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"ovV" = ( +/obj/machinery/shower/directional/west, +/obj/structure/fluff/shower_drain, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 1 + }, +/area/station/engineering/main) "owf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/stairs/north, @@ -50295,6 +53474,10 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/engine, /area/station/service/hydroponics) +"owk" = ( +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "own" = ( /turf/closed/wall, /area/station/hallway/secondary/service) @@ -50303,14 +53486,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/hallway/primary/starboard) -"ows" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/turf/open/floor/plating, -/area/station/medical/cryo) "owv" = ( /obj/machinery/status_display/door_timer{ id = "brig3"; @@ -50327,10 +53502,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) -"owz" = ( -/obj/item/radio/intercom/directional/north, -/turf/open/floor/glass, -/area/station/commons/fitness/recreation) "owK" = ( /obj/structure/mineral_door/wood, /turf/open/floor/plating, @@ -50354,11 +53525,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"oxe" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/glass, -/area/station/maintenance/starboard/aft) +"oxc" = ( +/obj/machinery/holopad, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron/large, +/area/station/engineering/lobby) "oxg" = ( /obj/machinery/photocopier/prebuilt, /obj/structure/railing{ @@ -50366,48 +53537,31 @@ }, /turf/open/floor/wood/large, /area/station/service/library/private) -"oxi" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/table/wood, -/obj/item/paper/crumpled{ - pixel_x = 2; - pixel_y = 7 +"oxo" = ( +/obj/item/cigbutt{ + pixel_x = 8; + pixel_y = -2 }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) -"oxn" = ( -/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/plating, +/area/station/maintenance/starboard/aft/upper) +"oxy" = ( /obj/structure/cable, -/obj/machinery/door/airlock/engineering{ - name = "Engine Room" +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 10 }, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/landmark/navigate_destination/atmos, -/turf/open/floor/iron/freezer, -/area/station/engineering/main) -"oxp" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance" +/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/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) +"oxC" = ( /obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/maintenance/port) -"oxu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/area/station/maintenance/starboard) "oxG" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 @@ -50421,21 +53575,21 @@ name = "Teleporter Shutters" }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) +"oxH" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/ammo_casing/spent{ + pixel_x = -6; + pixel_y = 6 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "oxJ" = ( /obj/structure/table/reinforced, /obj/item/wrench, /obj/item/crowbar, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) -"oxM" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/stack, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) +/area/station/ai/satellite/chamber) "oxS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/shower/directional/east, @@ -50449,20 +53603,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"oyi" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/medical/chemistry) -"oys" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 +"oym" = ( +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 5; + pixel_y = -3 }, -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"oyp" = ( +/obj/structure/lattice, +/turf/open/openspace, +/area/station/maintenance/starboard/central/upper) "oyy" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/box/white, @@ -50470,6 +53622,22 @@ dir = 4 }, /area/station/science/ordnance/storage) +"oyz" = ( +/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/lobby) +"oyA" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/office) "oyB" = ( /obj/structure/lattice/catwalk, /obj/structure/sign/warning/explosives/alt/directional/west, @@ -50481,17 +53649,27 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"oyG" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" +"oyJ" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Chapel Office Maintenance" }, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/mask/breath, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/maintenance/starboard) +"oyS" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/upper) +"oyU" = ( +/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/holopad, +/turf/open/floor/iron/dark/smooth_large, +/area/station/engineering/storage) "ozh" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -50519,9 +53697,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/gateway, /turf/open/floor/wood, /area/station/command/gateway) -"ozp" = ( -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) "ozt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -50532,30 +53707,14 @@ /obj/effect/mapping_helpers/mail_sorting/science/research, /turf/open/floor/iron, /area/station/science/research) -"ozw" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"ozE" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/fore) "ozK" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 }, /obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 8 + }, /area/station/hallway/primary/central) "ozL" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -50583,11 +53742,29 @@ }, /turf/open/space/openspace, /area/space/nearstation) +"ozS" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/north, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "oAa" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, /turf/open/space/basic, /area/station/solars/starboard/aft) +"oAf" = ( +/obj/structure/light_construct/directional/east{ + dir = 1 + }, +/obj/structure/closet/secure_closet/bar/all_access{ + pixel_x = -3; + pixel_y = -1 + }, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "oAo" = ( /obj/effect/decal/cleanable/dirt, /obj/item/kirbyplants/photosynthetic, @@ -50598,14 +53775,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) -"oAJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2o{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/area/station/ai/upload/foyer) "oAL" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ @@ -50637,14 +53807,10 @@ dir = 1 }, /area/station/science/robotics/lab) -"oBa" = ( -/obj/structure/sign/poster/random/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +"oBl" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/starboard/central/upper) "oBo" = ( /obj/machinery/door/airlock/grunge{ name = "Cell 1" @@ -50659,6 +53825,13 @@ /obj/structure/window/reinforced/plasma/spawner/directional/south, /turf/open/floor/engine/co2, /area/station/engineering/atmos/upper) +"oBr" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/spawner/random/medical/memeorgans, +/turf/open/floor/iron/white, +/area/station/maintenance/starboard) "oBy" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 @@ -50683,10 +53856,15 @@ /obj/machinery/light/directional/south, /turf/open/floor/wood/large, /area/station/service/library) -"oBM" = ( -/obj/machinery/portable_atmospherics/canister, +"oBO" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, /turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) +/area/station/engineering/supermatter/room/upper) "oBT" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -50723,30 +53901,11 @@ }, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"oCr" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) -"oCs" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/trunk/multiz/down{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) -"oCA" = ( -/obj/effect/decal/cleanable/dirt, +"oCp" = ( +/obj/effect/turf_decal/stripes/line, /obj/structure/cable, -/obj/effect/decal/cleanable/blood/footprints{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "oCE" = ( /obj/machinery/door/airlock/maintenance{ name = "Delinquent Confiscation Storage" @@ -50758,17 +53917,16 @@ /obj/structure/girder, /turf/open/space/basic, /area/space/nearstation) +"oCN" = ( +/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/lobby) "oCO" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"oCS" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 4; - initialize_directions = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) "oCT" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -50776,17 +53934,6 @@ /obj/item/clothing/head/cone, /turf/open/floor/engine/hull, /area/space/nearstation) -"oCU" = ( -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "oCX" = ( /obj/structure/railing{ dir = 1 @@ -50812,13 +53959,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) -"oDg" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/coffeepot, -/obj/item/storage/box/coffeepack, -/obj/machinery/coffeemaker, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "oDj" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /obj/structure/cable, @@ -50828,14 +53968,62 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical) +"oDp" = ( +/obj/item/book/manual/wiki/atmospherics, +/obj/structure/table, +/obj/item/book/manual/wiki/atmospherics{ + pixel_y = 4; + pixel_x = 3 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"oDq" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/machinery/recharger{ + pixel_y = 5 + }, +/obj/item/screwdriver{ + pixel_x = 1; + pixel_y = -2 + }, +/obj/item/radio/off{ + pixel_x = 10 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) "oDs" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/command/heads_quarters/ce) +"oDu" = ( +/obj/item/stack/sheet/mineral/wood{ + pixel_x = -5; + pixel_y = -6 }, -/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/starboard/central) +/area/station/security/detectives_office/private_investigators_office) +"oDx" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/clothing/gloves/color/rainbow, +/obj/item/clothing/shoes/sneakers/rainbow, +/obj/item/clothing/under/color/rainbow, +/obj/item/clothing/head/soft/rainbow, +/obj/effect/decal/remains/human, +/turf/open/floor/engine/hull, +/area/space/nearstation) +"oDB" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/commons/dorms) "oDC" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -50867,7 +54055,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "oDN" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/bed{ @@ -50877,6 +54065,20 @@ /obj/machinery/light/floor, /turf/open/floor/iron/textured, /area/station/security/brig) +"oDZ" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) +"oEh" = ( +/obj/structure/table/glass, +/obj/item/flashlight/flare/candle{ + pixel_x = 9; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "oEi" = ( /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured_large, @@ -50899,17 +54101,15 @@ /obj/effect/spawner/random/maintenance, /turf/open/openspace, /area/station/maintenance/port/aft) -"oEN" = ( -/obj/machinery/light_switch/directional/east, -/obj/structure/lattice/catwalk, -/turf/open/floor/engine/hull/air, -/area/station/engineering/break_room) "oET" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 +/obj/structure/chair/plastic{ + dir = 4 }, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood/large, /area/station/hallway/primary/central) "oEU" = ( /obj/structure/lattice/catwalk, @@ -50919,19 +54119,28 @@ /obj/machinery/vending/games, /turf/open/openspace, /area/station/construction/storage_wing) +"oFa" = ( +/obj/effect/landmark/start/assistant, +/obj/machinery/duct, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "oFg" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, /obj/machinery/light_switch/directional/east, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron/textured_large, /area/station/medical/virology) "oFh" = ( -/obj/structure/rack, -/obj/item/tattoo_kit, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "oFj" = ( /obj/machinery/door/airlock/mining/glass{ name = "Bitrunning Den" @@ -50960,6 +54169,11 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"oFo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/storage/tech) "oFw" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -50971,24 +54185,29 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"oFI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "oFQ" = ( /turf/closed/wall/r_wall, /area/station/security/prison/rec) -"oFU" = ( -/obj/structure/rack, -/obj/item/pai_card, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"oGj" = ( -/obj/effect/turf_decal/tile/red/opposingcorners{ +"oGb" = ( +/obj/effect/turf_decal/tile/purple/half{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "Plasma Multideck Adapter"; dir = 4 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/machinery/meter{ + name = "Plasma meter" + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "oGu" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -51021,42 +54240,40 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "oGH" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 }, /obj/effect/turf_decal/trimline/green/filled/mid_joiner{ dir = 4 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) -"oGO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"oGW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +"oGX" = ( +/obj/item/kirbyplants/random/dead{ + name = "dead plant" + }, +/obj/machinery/button/door/directional/east{ + id = "Cabin2"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "oHf" = ( /obj/effect/turf_decal/trimline/red/warning{ dir = 10 }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) -"oHs" = ( -/obj/structure/closet/wardrobe/grey, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "oHu" = ( /obj/structure/sign/departments/restroom/directional/east, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) "oHw" = ( /obj/effect/decal/cleanable/dirt, @@ -51069,10 +54286,14 @@ /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) "oHE" = ( -/obj/machinery/holopad/secure, /obj/structure/disposalpipe/segment, -/turf/open/floor/carpet, +/obj/machinery/holopad/secure, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) +"oHF" = ( +/turf/open/floor/plating, +/area/station/maintenance/aft) "oHH" = ( /turf/open/openspace, /area/station/maintenance/port) @@ -51083,6 +54304,18 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"oHY" = ( +/obj/structure/table/wood, +/obj/item/book/bible{ + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/station/maintenance/starboard) +"oIe" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "oIi" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 5 @@ -51092,10 +54325,6 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) -"oIk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "oIv" = ( /obj/structure/table, /obj/item/flashlight/lamp{ @@ -51103,12 +54332,49 @@ }, /turf/open/floor/wood/large, /area/station/medical/psychology) -"oII" = ( +"oIA" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/obj/structure/table, +/obj/item/bodybag{ + pixel_y = 8; + pixel_x = -1 + }, +/obj/item/bodybag{ + pixel_y = 6; + pixel_x = 3 + }, +/obj/item/storage/medkit/emergency{ + pixel_z = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) +"oIB" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"oID" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate, -/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"oII" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/arrows/red{ + dir = 8 + }, +/obj/effect/turf_decal/box/red, /turf/open/floor/iron/dark/textured, -/area/station/cargo/warehouse) +/area/station/cargo/sorting) "oIR" = ( /obj/machinery/camera/autoname/directional/west, /turf/open/openspace, @@ -51119,7 +54385,7 @@ /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "oIU" = ( /obj/item/canvas/twentythree_nineteen, /obj/item/canvas/nineteen_nineteen, @@ -51131,31 +54397,24 @@ }, /obj/structure/closet/crate, /obj/structure/sign/painting/library{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/glass/reinforced, /area/station/service/library) "oJd" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/warm/dim/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/keycard_auth/wall_mounted/directional/east, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) +/obj/effect/spawner/random/maintenance, +/turf/open/floor/engine/hull/air, +/area/station/cargo/storage) "oJe" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 9 +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay-office"; + name = "Medbay Shutters"; + dir = 1 }, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/turf/open/floor/plating, +/area/station/medical/office) "oJh" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 @@ -51168,7 +54427,10 @@ }, /obj/structure/cable, /obj/machinery/keycard_auth/wall_mounted/directional/south, -/turf/open/floor/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) "oJj" = ( /obj/structure/table/reinforced, @@ -51181,18 +54443,7 @@ pixel_y = 11 }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/command/nuke_storage) -"oJr" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/openspace, -/area/station/medical/storage) +/area/station/command/vault) "oJs" = ( /obj/structure/table/reinforced, /obj/structure/displaycase/forsale{ @@ -51210,24 +54461,28 @@ }, /turf/open/floor/iron/dark, /area/station/science/lobby) +"oJt" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Dormitories - Lower Entrance" + }, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "oJv" = ( -/obj/effect/turf_decal/siding/blue/corner, /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/textured_large, -/area/station/medical/medbay/central) -"oJx" = ( -/obj/structure/table, -/obj/item/stock_parts/subspace/analyzer, -/obj/item/stock_parts/subspace/analyzer, -/obj/item/stock_parts/subspace/analyzer, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ +/obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/machinery/light/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) +/area/station/medical/medbay/central) "oJy" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 4 @@ -51236,7 +54491,7 @@ dir = 4 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "oJz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/vacuum/directional/west, @@ -51245,18 +54500,42 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"oJK" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/wood, -/area/station/commons/dorms) "oJX" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"oKe" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) "oKg" = ( /turf/closed/wall, /area/station/engineering/storage/tcomms) +"oKk" = ( +/obj/machinery/button/elevator{ + id = "catwalk_engi"; + pixel_y = -24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"oKr" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/obj/machinery/power/energy_accumulator/tesla_coil/anchored, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 6 + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "oKt" = ( /obj/structure/falsewall, /obj/effect/decal/cleanable/blood/tracks{ @@ -51270,10 +54549,10 @@ /obj/effect/landmark/start/hangover, /turf/open/openspace, /area/station/hallway/primary/central) -"oKx" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +"oKy" = ( +/obj/effect/landmark/start/hangover, +/turf/open/floor/carpet, +/area/station/maintenance/starboard) "oKA" = ( /obj/effect/turf_decal/siding/dark/corner{ dir = 8 @@ -51283,7 +54562,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "oKD" = ( /obj/structure/filingcabinet/chestdrawer, /obj/structure/disposalpipe/segment{ @@ -51291,18 +54570,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/explab) -"oKI" = ( -/obj/effect/turf_decal/tile/neutral/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/dark, -/area/station/medical/chemistry) -"oKN" = ( -/obj/structure/broken_flooring/singular/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "oLa" = ( /obj/structure/table/wood, /obj/item/book/bible{ @@ -51324,8 +54591,24 @@ /turf/open/floor/iron/freezer, /area/station/security/prison/shower) "oLi" = ( -/obj/effect/spawner/structure/window/reinforced, -/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/effect/mapping_helpers/airlock/access/all/command/general, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast-2"; + name = "Bridge Blast Door" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge Access"; + id_tag = "innerbridge" + }, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/turf/open/floor/iron/dark, /area/station/command/bridge) "oLj" = ( /obj/effect/turf_decal/trimline/yellow/warning, @@ -51350,7 +54633,7 @@ }, /obj/effect/turf_decal/siding/dark, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "oLv" = ( /obj/machinery/door/airlock/public/glass{ name = "Arrivals Lounge" @@ -51364,18 +54647,11 @@ /obj/effect/landmark/navigate_destination/dockarrival, /turf/open/floor/iron/white/side, /area/station/hallway/primary/aft) -"oLx" = ( -/obj/structure/broken_flooring/side/directional/east, -/turf/open/floor/plating, -/area/station/engineering/storage_shared) "oLA" = ( /obj/structure/closet/firecloset, /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"oLE" = ( -/turf/open/floor/carpet, -/area/station/maintenance/starboard/lesser) "oLH" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -51383,7 +54659,7 @@ }, /obj/structure/railing, /turf/open/openspace, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "oLJ" = ( /obj/effect/turf_decal/siding/purple/corner{ dir = 4 @@ -51411,7 +54687,9 @@ /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 8 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 8 + }, /area/station/hallway/primary/central) "oLW" = ( /obj/structure/railing/corner{ @@ -51419,18 +54697,17 @@ }, /turf/open/floor/engine/hull/air, /area/station/maintenance/port) -"oLX" = ( -/obj/structure/cable/layer1, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"oMd" = ( -/obj/effect/spawner/random/maintenance/two, -/obj/item/grown/bananapeel{ - name = "stealthy banana peel" +"oMr" = ( +/obj/structure/plasticflaps/kitchen, +/obj/machinery/door/airlock/medical{ + name = "Medical Cold Room" }, +/obj/effect/mapping_helpers/airlock/access/all/medical/surgery, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/medical/coldroom) "oMI" = ( /obj/machinery/door/airlock/command{ name = "Teleport Access" @@ -51469,20 +54746,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/stellar, /area/station/maintenance/hallway/abandoned_recreation) -"oNb" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ - dir = 8 - }, -/obj/machinery/airalarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/textured_large, -/area/station/medical/virology) "oNc" = ( /obj/structure/closet/lasertag/red, /obj/effect/decal/cleanable/dirt, @@ -51497,10 +54760,6 @@ /obj/structure/window/reinforced/tinted/frosted/spawner/directional/east, /turf/open/floor/glass/reinforced, /area/station/service/library) -"oNp" = ( -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "oNs" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -51510,7 +54769,20 @@ "oNu" = ( /obj/effect/turf_decal/siding/dark, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"oNy" = ( +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "O2 Multideck Adapter"; + dir = 8 + }, +/obj/machinery/meter{ + name = "O2 meter" + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "oNA" = ( /obj/item/clothing/head/cone{ pixel_x = -6; @@ -51518,40 +54790,31 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"oNM" = ( -/obj/effect/turf_decal/siding/white{ - dir = 10 +"oNB" = ( +/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/cable, -/obj/structure/disposalpipe/segment{ +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ dir = 4 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) -"oNP" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/machinery/photocopier/prebuilt, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) +"oNH" = ( +/obj/item/kirbyplants/photosynthetic, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/eighties, +/area/station/maintenance/department/crew_quarters/dorms) +"oNM" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "oOc" = ( /obj/machinery/light/floor, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) -"oOd" = ( -/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/dirt, -/turf/open/floor/iron/white, -/area/station/maintenance/starboard/lesser) -"oOm" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) "oOs" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -51567,28 +54830,21 @@ /obj/structure/chair, /obj/effect/landmark/start/hangover, /obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"oOz" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "holodeck" - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "oOB" = ( /obj/machinery/power/shieldwallgen, /obj/effect/turf_decal/stripes/line, /turf/open/floor/wood, /area/station/command/teleporter) +"oOE" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/item/storage/medkit/toxin, +/obj/structure/rack, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "oON" = ( /obj/effect/turf_decal/box/white{ color = "#52B4E9" @@ -51602,10 +54858,8 @@ dir = 1 }, /obj/structure/cable, -/obj/machinery/camera/autoname/directional/west{ - network = list("ss13","medbay"); - c_tag = "Medbay - Lower Central Hallway" - }, +/obj/effect/mapping_helpers/mail_sorting/medbay/general, +/obj/structure/disposalpipe/sorting/mail/flip, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "oOY" = ( @@ -51626,11 +54880,17 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/security/brig) -"oPd" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/atmos/upper) +"oPf" = ( +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmosmaintedge" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "oPh" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/dark_blue{ @@ -51639,11 +54899,21 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"oPu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/freezer, -/area/station/engineering/atmos/pumproom) +"oPm" = ( +/obj/machinery/computer/security/telescreen/engine/directional/south{ + name = "Engine Camera Monitor" + }, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/light/directional/south, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) +"oPH" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/openspace, +/area/station/maintenance/starboard/upper) "oPM" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -51655,7 +54925,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/openspace, -/area/station/command/bridge) +/area/station/command/meeting_room/council) +"oPO" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "oPP" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 6 @@ -51663,12 +54942,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"oPW" = ( -/obj/effect/mob_spawn/corpse/human/assistant, -/obj/structure/closet/crate/trashcart, -/obj/effect/mob_spawn/corpse/human/monkey, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "oPY" = ( /obj/structure/table, /obj/item/hand_labeler{ @@ -51681,10 +54954,6 @@ /obj/item/hand_tele, /turf/open/floor/wood, /area/station/command/teleporter) -"oQk" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "oQn" = ( /obj/effect/landmark/firealarm_sanity, /turf/open/openspace, @@ -51703,9 +54972,18 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"oRp" = ( -/turf/open/floor/iron/textured_large, -/area/space/nearstation) +"oRi" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk/multiz{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "oRs" = ( /obj/structure/chair/plastic{ dir = 1 @@ -51713,6 +54991,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/service/cafeteria) +"oRA" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"oRD" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/turf_decal/siding/green/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/hallway/primary/central) "oRG" = ( /obj/structure/railing, /obj/structure/rack, @@ -51726,8 +55015,17 @@ /obj/item/circuitboard/machine/exoscanner{ pixel_y = -3 }, +/obj/machinery/door/firedoor/border_only, /turf/open/floor/iron, /area/station/cargo/storage) +"oRH" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "oRI" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/dark_blue/opposingcorners{ @@ -51742,7 +55040,7 @@ pixel_y = 16 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "oRM" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -51751,36 +55049,16 @@ /obj/machinery/airalarm/directional/east, /turf/open/openspace, /area/station/command/gateway) -"oRU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "oSb" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, /obj/machinery/keycard_auth/wall_mounted/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/obj/effect/landmark/start/captain, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"oSo" = ( -/obj/machinery/door/airlock/command{ - name = "Auxiliary E.V.A. Storage" +/obj/machinery/computer/communications{ + dir = 8 }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/captain/private) "oSq" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /obj/structure/cable, @@ -51798,42 +55076,25 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/station/maintenance/department/medical) -"oSE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "oSI" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/station/hallway/primary/central) "oST" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/arrows{ - dir = 1 - }, /obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/dark, -/area/station/command/gateway) -"oSU" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/machinery/computer/station_alert{ - dir = 8 +/obj/effect/turf_decal/stripes/red/end, +/obj/effect/turf_decal/siding/red/end, +/turf/open/floor/iron/textured_corner{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"oSX" = ( -/obj/structure/urinal/directional/north, +/area/station/command/gateway) +"oSV" = ( +/obj/structure/closet/emcloset, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/contraband/narcotics, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"oSZ" = ( -/obj/structure/chair/stool/directional/east, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/fore/upper) "oTd" = ( /obj/structure/lattice, /turf/open/openspace, @@ -51844,81 +55105,111 @@ }, /turf/open/floor/glass, /area/station/science/zoo) +"oTg" = ( +/obj/structure/lattice, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/turf/open/space/basic, +/area/space/nearstation) +"oTi" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "oTn" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/medbay/central) -"oTp" = ( -/obj/structure/sign/warning/yes_smoking/circle/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"oTq" = ( -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer2{ +/obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/simple/supply{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"oTr" = ( -/obj/structure/railing/corner{ +/obj/structure/chair/office/light{ dir = 8 }, -/obj/machinery/duct, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) +/obj/effect/landmark/start/paramedic, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"oTq" = ( +/obj/structure/sink/directional/east, +/obj/machinery/iv_drip, +/obj/structure/mirror/directional/west, +/turf/open/floor/iron/dark/textured_corner, +/area/station/medical/surgery) "oTu" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/pale/style_random, /obj/machinery/camera/autoname/directional/south, /turf/open/floor/grass, /area/station/hallway/secondary/entry) -"oTE" = ( -/obj/structure/broken_flooring/singular/directional/north, -/obj/item/stack/sheet/cotton{ - pixel_x = 8; - pixel_y = 10 +"oTF" = ( +/obj/structure/sign/directions/engineering/directional/north{ + dir = 8; + pixel_y = 0 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"oTJ" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/turf/closed/wall, +/area/station/maintenance/starboard/aft) "oTK" = ( -/obj/machinery/button/door/directional/north{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/button/door/directional/east{ id = "gateshutter"; name = "Gateway Shutter Control"; - pixel_x = 24; - pixel_y = 0; req_access = list("command") }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, +/turf/open/floor/carpet/purple, /area/station/command/gateway) "oTO" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ dir = 4 }, -/obj/effect/landmark/start/chemist, +/obj/machinery/chem_mass_spec, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "oTQ" = ( -/obj/machinery/chem_master, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 7 + }, +/obj/item/stack/ducts/fifty{ + pixel_y = -3 + }, +/obj/item/stack/ducts/fifty{ + pixel_y = -3 + }, +/obj/item/stack/ducts/fifty{ + pixel_y = -3 + }, +/obj/item/stack/ducts/fifty{ + pixel_y = -3 + }, +/obj/item/stack/ducts/fifty{ + pixel_y = -3 + }, +/obj/item/stack/ducts/fifty{ + pixel_y = -3 + }, +/obj/item/stack/ducts/fifty{ + pixel_y = -3 + }, +/obj/item/stack/ducts/fifty{ + pixel_y = -3 + }, +/obj/item/reagent_containers/dropper, +/obj/item/stack/cable_coil{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/stack/cable_coil{ + pixel_x = -12 + }, +/obj/item/multitool, /turf/open/floor/iron/dark, /area/station/medical/chemistry) "oTR" = ( @@ -51932,6 +55223,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"oTS" = ( +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/machinery/airalarm/directional/west, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 8 + }, +/obj/item/stack/medical/mesh, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "oTZ" = ( /obj/structure/table, /obj/structure/railing{ @@ -51973,17 +55280,14 @@ /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"oUo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/power/terminal{ - dir = 1; - cable_layer = 1 +"oUr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/structure/cable/multilayer/layer1, -/turf/open/floor/catwalk_floor, -/area/station/engineering/engine_smes) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "oUC" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -52013,25 +55317,35 @@ /obj/structure/table/wood/fancy, /turf/open/openspace, /area/station/maintenance/port/fore) -"oUO" = ( -/obj/machinery/door/firedoor, -/obj/structure/sign/directions/evac/directional/north{ - dir = 8; - pixel_y = 28 - }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) +"oUL" = ( +/obj/machinery/bookbinder, +/turf/open/floor/wood, +/area/station/service/library/printer) "oUQ" = ( /obj/machinery/telecomms/processor/preset_two, /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"oVg" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ +"oUS" = ( +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/plating/airless, +/area/station/maintenance/starboard/aft) +"oVe" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/closed/wall/r_wall, -/area/station/maintenance/starboard/aft) +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"oVh" = ( +/obj/machinery/computer/security/mining{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "oVn" = ( /obj/machinery/dna_scannernew, /obj/machinery/firealarm/directional/south, @@ -52049,13 +55363,6 @@ /obj/structure/cable, /turf/open/floor/iron/sepia, /area/station/hallway/secondary/construction) -"oVF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "oVK" = ( /obj/structure/chair/office{ dir = 4 @@ -52066,30 +55373,43 @@ /obj/structure/displaycase/trophy, /turf/open/floor/wood/large, /area/station/service/library) -"oVY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/table, -/obj/item/reagent_containers/cup/soda_cans/thirteenloko{ - pixel_x = 14; +"oVQ" = ( +/obj/machinery/photocopier/prebuilt, +/obj/machinery/firealarm/directional/east{ pixel_y = 3 }, -/obj/item/book/manual/wiki/engineering_construction, -/turf/open/floor/iron, -/area/station/engineering/lobby) +/obj/machinery/light_switch/directional/east{ + pixel_y = -8 + }, +/obj/effect/turf_decal/siding/yellow, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) +"oWt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "oWy" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/engine/hull/reinforced/air, /area/station/maintenance/port) +"oWD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) +"oWJ" = ( +/obj/structure/rack, +/obj/item/pai_card, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "oWL" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"oWN" = ( -/obj/machinery/camera/autoname/directional/west, -/turf/open/openspace, -/area/station/engineering/lobby) "oWO" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -52109,7 +55429,7 @@ dir = 10 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "oWU" = ( /obj/item/wrench, /turf/open/floor/plating, @@ -52124,10 +55444,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) -"oXh" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) "oXn" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/railing/corner{ @@ -52135,11 +55451,37 @@ }, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"oXp" = ( +/mob/living/basic/turtle{ + name = "John Arbuckle" + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/aft/upper) +"oXv" = ( +/obj/effect/decal/cleanable/blood/oil/slippery, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"oXB" = ( +/obj/structure/ladder, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "oXE" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "oXJ" = ( @@ -52147,20 +55489,11 @@ dir = 1 }, /obj/machinery/camera/autoname/directional/south{ - dir = 5; - network = list("aicore") + network = list("aicore"); + pixel_x = 24 }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) -"oXO" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) +/area/station/ai/satellite/chamber) "oXQ" = ( /obj/structure/lattice/catwalk, /obj/structure/table, @@ -52170,20 +55503,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/openspace, /area/station/maintenance/port/aft) -"oXS" = ( -/obj/structure/cable, -/obj/machinery/light_switch/directional/east, -/obj/item/crowbar, -/obj/item/pipe_dispenser{ - pixel_y = 8 - }, -/obj/item/wrench, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/rack, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "oXT" = ( /obj/effect/turf_decal/stripes/asteroid/corner{ dir = 8 @@ -52195,18 +55514,6 @@ /obj/effect/spawner/random/entertainment/money_large, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"oXX" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/structure/closet/secure_closet/engineering_personal, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"oXZ" = ( -/obj/effect/spawner/random/maintenance/two, -/obj/structure/rack{ - pixel_y = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "oYd" = ( /obj/structure/disposalpipe/trunk{ dir = 2 @@ -52216,12 +55523,10 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"oYn" = ( -/obj/effect/landmark/start/hangover, -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +"oYm" = ( +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) "oYp" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/railing/corner/end/flip{ @@ -52234,28 +55539,28 @@ dir = 10 }, /obj/structure/table, -/obj/effect/decal/cleanable/dirt, /obj/item/phone{ pixel_x = -3; pixel_y = 2 }, -/obj/item/pen{ - pixel_x = 6; - pixel_y = 9 +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/ai/upload/chamber) +"oYu" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 8 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "oYy" = ( -/obj/machinery/chem_heater/withbuffer, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/smooth_large, -/area/station/medical/pharmacy) +/obj/machinery/light/floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "oYE" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/green/opposingcorners{ @@ -52273,34 +55578,28 @@ }, /turf/open/floor/glass/reinforced, /area/station/service/library) +"oZe" = ( +/obj/machinery/newscaster/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "oZh" = ( /obj/structure/rack, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "oZn" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) -"oZt" = ( -/obj/vehicle/ridden/wheelchair, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"oZA" = ( -/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/effect/mapping_helpers/airlock/unres{ - dir = 4 +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rear_surgery"; + name = "Surgery Shutters" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/medical/surgery) "oZC" = ( /obj/effect/landmark/firealarm_sanity, /turf/open/openspace, @@ -52320,8 +55619,10 @@ }, /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/dark/smooth_large, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "oZG" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/table, @@ -52333,16 +55634,16 @@ "oZJ" = ( /turf/open/floor/glass/reinforced, /area/station/service/library) -"oZN" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +"oZK" = ( +/obj/structure/table, +/obj/item/petri_dish{ + pixel_x = 4; + pixel_y = 7 }, -/turf/open/openspace, -/area/station/medical/storage) +/obj/item/petri_dish, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) "oZO" = ( /obj/structure/railing/corner/end{ dir = 8 @@ -52350,14 +55651,9 @@ /obj/effect/spawner/random/trash/botanical_waste, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"oZV" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/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/iron/smooth, -/area/station/engineering/main) +"oZS" = ( +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "oZX" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/carpet/black, @@ -52382,18 +55678,10 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/glass, /area/station/service/kitchen) -"paq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/cigarette, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"paI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/commons/dorms) +"paE" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos/upper) "paM" = ( /obj/structure/curtain/bounty/start_closed, /turf/open/floor/plating, @@ -52402,17 +55690,32 @@ /obj/structure/window/reinforced/tinted/spawner/directional/north, /turf/open/openspace, /area/station/medical/virology) +"paZ" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "pbc" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 +/obj/machinery/firealarm/directional/north, +/obj/structure/railing, +/obj/structure/railing{ + dir = 8 }, -/obj/machinery/camera/autoname/directional/north, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) +"pbe" = ( +/obj/item/radio/intercom/directional/east, +/obj/structure/lattice/catwalk, +/turf/open/floor/engine/hull/air, +/area/station/engineering/supermatter/room/upper) "pbk" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -52423,36 +55726,29 @@ /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "pbp" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance" - }, -/obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/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/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 }, +/obj/machinery/door/airlock/medical, /turf/open/floor/plating, -/area/station/medical/abandoned) +/area/station/medical/break_room) "pbq" = ( /obj/structure/railing, /obj/effect/turf_decal/trimline/yellow/warning, /obj/structure/table/reinforced, /turf/open/floor/engine/hull, /area/space/nearstation) -"pbt" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"pbE" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"pbB" = ( -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) +/turf/open/floor/wood, +/area/station/commons/dorms) "pbG" = ( /obj/structure/rack, /obj/item/book/manual/wiki/engineering_construction{ @@ -52482,18 +55778,12 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) -"pbU" = ( +"pbY" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"pbZ" = ( -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood/oil, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "pca" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52513,10 +55803,14 @@ /turf/open/floor/iron, /area/station/science/research) "pce" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +/obj/effect/landmark/start/cargo_technician, +/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 = 5 }, -/turf/open/floor/iron, +/turf/open/floor/catwalk_floor, /area/station/cargo/storage) "pcf" = ( /obj/effect/turf_decal/siding/green{ @@ -52524,13 +55818,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"pcg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 10 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) "pch" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/bush/flowers_pp/style_random, @@ -52573,20 +55860,35 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) -"pcL" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/obj/structure/sign/warning/vacuum/directional/north, +"pcD" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/structure/closet/emcloset, /turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"pcQ" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 +/area/station/maintenance/starboard/fore) +"pcE" = ( +/obj/structure/cable, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) +/obj/structure/table/reinforced, +/obj/item/radio{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/radio, +/obj/item/radio{ + pixel_x = -5; + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"pcM" = ( +/obj/machinery/atmospherics/components/tank/air/layer4, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "pcR" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -52594,20 +55896,35 @@ /turf/open/floor/iron, /area/station/hallway/secondary/construction) "pdf" = ( +/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/line{ - dir = 8 - }, -/obj/effect/turf_decal/arrows{ - dir = 1 + dir = 10 }, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/dark/smooth_large, /area/station/command/gateway) +"pdg" = ( +/obj/effect/decal/cleanable/glitter, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "pdr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 +/obj/effect/turf_decal/stripes{ + dir = 1 }, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/structure/sign/poster/official/safety_internals/directional/north, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -3; + pixel_y = 8 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/iron/textured, +/area/station/command/eva) "pdy" = ( /obj/structure/bed, /obj/effect/decal/cleanable/dirt, @@ -52647,18 +55964,17 @@ /obj/structure/cable, /turf/closed/wall, /area/station/engineering/main) -"pdM" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "pdO" = ( /turf/closed/wall, /area/station/medical/pharmacy) +"pdY" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/main) "pec" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -52675,11 +55991,18 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"pee" = ( -/obj/structure/disposalpipe/segment, +"ped" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, /obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/structure/disposalpipe/sorting/mail{ + dir = 2 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "pef" = ( /obj/structure/transport/linear/public, /obj/structure/table, @@ -52696,63 +56019,43 @@ pixel_y = -3 }, /obj/machinery/barsign{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/plating/elevatorshaft, /area/station/service/kitchen) -"pem" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Cryogenics Room" - }, -/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/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) "pen" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, +/turf/open/floor/iron/dark, /area/station/command/gateway) -"peo" = ( -/obj/machinery/computer/atmos_control/mix_tank{ - dir = 4 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "pev" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/maintenance/port/fore) -"pey" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "space-outpost" +"peI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"peF" = ( -/obj/effect/spawner/structure/window, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/security/courtroom) +/area/station/maintenance/starboard) +"peL" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 2; + name = "Air to Mix" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "peQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/structure/railing, /turf/open/floor/iron/textured, /area/station/cargo/storage) "peS" = ( @@ -52763,6 +56066,9 @@ /obj/machinery/door/firedoor/border_only{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) "peX" = ( @@ -52791,8 +56097,7 @@ /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) "pfp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/south, +/obj/machinery/light/directional/south, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) "pfu" = ( @@ -52801,41 +56106,65 @@ /obj/effect/turf_decal/trimline/yellow/arrow_cw, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"pfx" = ( -/obj/effect/spawner/random/maintenance, -/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/starboard/fore) -"pfK" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 +"pfM" = ( +/obj/structure/sign/directions/supply/directional/east{ + dir = 2; + pixel_x = 0 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/turf/closed/wall, +/area/station/maintenance/starboard/central) "pfN" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/wood/tile, /area/station/maintenance/port/aft) -"pgh" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 +"pfO" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"pfQ" = ( +/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/engineering/atmos/hfr_room) +"pfR" = ( +/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 = 2 }, -/obj/machinery/firealarm/directional/east, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=22-Mech-Bay"; + location = "21-Central" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/catwalk_floor/iron, +/area/station/hallway/primary/central) +"pfS" = ( +/obj/effect/decal/cleanable/dirt, +/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 = "Abandoned Hallway" + }, +/obj/machinery/door/firedoor, /turf/open/floor/iron, -/area/station/engineering/lobby) +/area/station/hallway/secondary/construction) +"pfY" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/reagent_containers/cup/soda_cans/pwr_game, +/obj/item/radio/intercom/directional/north, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "pgo" = ( /obj/structure/flora/bush/flowers_br/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -52852,11 +56181,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) -"pgu" = ( -/obj/structure/cable, -/obj/effect/spawner/random/trash/cigbutt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "pgw" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 5 @@ -52864,36 +56188,29 @@ /turf/open/floor/engine/hull, /area/space/nearstation) "pgx" = ( +/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/dust, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 5 }, /turf/open/floor/iron, /area/station/cargo/storage) -"pgA" = ( -/turf/open/floor/iron/stairs{ - dir = 4 - }, -/area/station/maintenance/starboard/aft) "pgI" = ( /obj/effect/decal/cleanable/dirt, /obj/item/clothing/suit/apron/surgical, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) "pgJ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, -/obj/machinery/atmospherics/components/binary/valve, -/obj/machinery/light_switch/directional/east, -/obj/machinery/camera/autoname/directional/east{ - network = list("ss13","medbay"); - c_tag = "Medbay - Upper Cryo" +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 4 }, -/turf/open/openspace, -/area/station/medical/cryo) +/turf/open/floor/holofloor/dark, +/area/station/command/heads_quarters/cmo) "pgM" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -52902,25 +56219,16 @@ /turf/open/floor/iron/dark, /area/station/science/ordnance) "pgN" = ( -/obj/machinery/chem_dispenser, -/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/dark/smooth_large, /area/station/medical/pharmacy) -"pgQ" = ( -/obj/structure/table, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/item/paper/pamphlet/gateway{ - pixel_x = -13; - pixel_y = 4 +"pgT" = ( +/obj/machinery/vatgrower, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 }, -/obj/item/storage/toolbox/emergency, -/turf/open/floor/wood, -/area/station/commons/dorms) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) "phc" = ( /obj/item/radio/intercom/directional/west, /obj/machinery/light/small/directional/west, @@ -52933,70 +56241,91 @@ /obj/item/gun/energy/e_gun, /obj/item/gun/energy/e_gun, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "phd" = ( -/obj/structure/chair/office{ - name = "CE's Chair" - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"phf" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hazardvest{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest{ - pixel_x = 3 - }, -/obj/item/clothing/suit/hazardvest{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/clothing/gloves/color/black{ - pixel_y = 3 - }, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black{ - pixel_y = -3 - }, -/obj/item/clothing/mask/gas, -/obj/structure/railing{ - dir = 6 +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "phh" = ( -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/status_display/evac/directional/north, +/turf/open/openspace, +/area/station/medical/medbay/central) +"phn" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/structure/sign/poster/contraband/grey_tide/directional/west, +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/turf/open/floor/engine/hull/air, -/area/station/medical/chemistry) +/obj/structure/table/reinforced, +/obj/item/storage/box/shipping{ + pixel_y = 5; + pixel_x = -2 + }, +/obj/item/storage/box/lights/mixed{ + pixel_y = 2; + pixel_x = 1 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "phu" = ( /obj/structure/transit_tube, /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/light/floor, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) +"phw" = ( +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Reception" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/floor/iron/white, +/area/station/medical/office) "phy" = ( /obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 4 - }, /obj/effect/turf_decal/siding/blue/corner{ 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/openspace, /area/station/medical/medbay/central) +"phz" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp{ + pixel_y = 10 + }, +/obj/item/toy/figure/ce{ + pixel_y = 4 + }, +/obj/item/clothing/glasses/meson, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) "phE" = ( /obj/structure/lattice/catwalk, /obj/structure/table, /obj/effect/spawner/random/maintenance, /turf/open/floor/engine/hull/air, /area/station/construction/storage_wing) +"phI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "phL" = ( /obj/structure/railing{ dir = 8 @@ -53017,6 +56346,12 @@ /obj/structure/filingcabinet/chestdrawer{ pixel_y = 2 }, +/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/customs) "phT" = ( @@ -53027,7 +56362,7 @@ dir = 1 }, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "pim" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/full, @@ -53035,6 +56370,33 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) +"pio" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/structure/cable, +/turf/open/openspace, +/area/station/command/meeting_room/council) +"piC" = ( +/obj/structure/ladder, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"piF" = ( +/obj/machinery/computer/cargo, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/storage) +"piN" = ( +/obj/effect/turf_decal/siding/brown, +/obj/structure/railing, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/dorms) "piR" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -53044,6 +56406,10 @@ /obj/machinery/light/small/blacklight/directional/north, /turf/open/floor/eighties/red, /area/station/maintenance/hallway/abandoned_recreation) +"piW" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/commons/dorms) "pjd" = ( /obj/machinery/camera/directional/west{ c_tag = "Kitchen" @@ -53061,6 +56427,57 @@ /obj/structure/closet/firecloset, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"pji" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/structure/sign/poster/official/state_laws/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"pjj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark/arrow_ccw{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark/arrow_ccw{ + dir = 4 + }, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"pjk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/suit_storage_unit/medical, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) +"pjn" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"pjp" = ( +/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/dark_green/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "pjt" = ( /obj/machinery/disposal/bin, /obj/effect/decal/cleanable/dirt, @@ -53069,6 +56486,13 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/port) +"pjB" = ( +/obj/effect/landmark/start/depsec/engineering, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/security/checkpoint/engineering) "pjC" = ( /obj/structure/table/wood/poker, /obj/effect/spawner/random/entertainment/cigar, @@ -53078,11 +56502,37 @@ "pjN" = ( /turf/open/floor/iron/kitchen, /area/station/maintenance/port/aft) -"pkc" = ( -/obj/structure/sink/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/virology) +"pka" = ( +/obj/docking_port/stationary/mining_home{ + dir = 4 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/turf/open/floor/engine/hull, +/area/space/nearstation) +"pkh" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"pkn" = ( +/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/opposingcorners{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "pko" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/vending/coffee, @@ -53108,10 +56558,20 @@ }, /turf/open/floor/glass, /area/station/security/brig) -"pkx" = ( +"pkw" = ( /obj/structure/lattice/catwalk, -/obj/machinery/camera/autoname/directional/north, -/turf/open/openspace, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/port/fore) +"pkx" = ( +/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/edge{ + dir = 8 + }, /area/station/hallway/primary/central) "pkz" = ( /obj/machinery/dna_infuser, @@ -53119,15 +56579,31 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark, /area/station/science/cytology) +"pkI" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos) "pkK" = ( /obj/structure/rack, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) -"pkO" = ( -/obj/structure/lattice, -/obj/structure/barricade/wooden, -/turf/open/space/basic, -/area/space/nearstation) +"pkS" = ( +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/glass/reinforced, +/area/station/medical/chemistry) +"pkW" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/pumproom) +"plk" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/engine_smes) "plq" = ( /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/plating, @@ -53137,6 +56613,18 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/space/basic, /area/space/nearstation) +"plQ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"plW" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/station/medical/medbay/central) "pma" = ( /obj/structure/chair, /obj/item/cigbutt, @@ -53149,11 +56637,19 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"pmd" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "pmf" = ( /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/textured_large, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/white, /area/station/medical/medbay/central) "pmg" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -53161,11 +56657,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"pmn" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/obj/machinery/shower/directional/east, -/turf/open/floor/iron/freezer, -/area/station/commons/dorms) "pms" = ( /obj/machinery/door/airlock/grunge, /obj/effect/turf_decal/siding/dark{ @@ -53178,7 +56669,7 @@ /turf/open/floor/iron/dark/textured_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "pmw" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -53189,35 +56680,24 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"pmx" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 - }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) "pmD" = ( /obj/structure/railing{ dir = 8 }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "pmI" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/port) "pmL" = ( -/obj/machinery/chem_dispenser, /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 1 + dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ dir = 4 }, -/obj/machinery/light/directional/north, +/obj/structure/tank_holder/extinguisher, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "pmN" = ( @@ -53255,18 +56735,10 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "pmX" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/bookcase/random/reference, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) +/obj/machinery/modular_computer/preset/civilian, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "pna" = ( /obj/item/sticker/star, /obj/structure/closet/crate/wooden, @@ -53276,11 +56748,10 @@ /obj/item/sticker/smile, /obj/item/sticker/smile, /obj/item/sticker/heart, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/station/maintenance/port/aft) "pnc" = ( /obj/machinery/door/firedoor, -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/security/general, @@ -53290,26 +56761,21 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/checkpoint/engineering) -"pnd" = ( -/turf/open/floor/wood, -/area/station/commons/toilet/restrooms) "pno" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/commons/storage/tools) "pnq" = ( -/obj/structure/sign/poster/random/directional/north, -/obj/machinery/door/airlock/maintenance, +/obj/effect/decal/cleanable/blood/oil/slippery, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 5 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/turf/open/floor/iron/dark/textured, +/area/station/cargo/sorting) "pnu" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 4 @@ -53319,6 +56785,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) +"pny" = ( +/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/east, +/obj/machinery/light_switch/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/main) +"pnF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/mecha_wreckage/ripley/deathripley, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "pnG" = ( /obj/machinery/requests_console/directional/north{ department = "Robotics"; @@ -53349,18 +56831,9 @@ /area/station/science/ordnance) "pog" = ( /obj/machinery/gateway/centerstation, -/turf/open/floor/iron/dark, +/obj/structure/cable, +/turf/open/floor/iron/textured_large, /area/station/command/gateway) -"pom" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/engine, -/area/station/engineering/main) "por" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/glass, @@ -53379,27 +56852,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"pov" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/fore) -"poZ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/lattice/catwalk, -/turf/open/water, -/area/station/maintenance/starboard/fore) -"ppa" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) +"ppe" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "ppp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/dark_blue, @@ -53409,18 +56866,40 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"ppL" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/atmos/upper) -"ppX" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 +"ppu" = ( +/obj/structure/railing, +/obj/structure/flora/bush/fullgrass/style_random, +/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/west, +/obj/effect/turf_decal/siding/thinplating, +/turf/open/floor/grass, +/area/station/hallway/primary/starboard) +"ppY" = ( +/obj/effect/turf_decal/siding{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"pqc" = ( +/obj/effect/turf_decal/trimline/yellow/corner, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) +"pqd" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 }, +/obj/structure/sign/poster/official/work_for_a_future/directional/west, +/obj/machinery/camera/autoname/directional/west, /obj/structure/cable, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/engineering/lobby) +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet/black, +/area/station/service/library/private) "pqj" = ( /turf/closed/wall/r_wall, /area/station/security/interrogation) @@ -53431,41 +56910,22 @@ }, /turf/open/floor/carpet, /area/station/service/chapel/office) -"pqQ" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port) -"pqW" = ( -/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/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"prn" = ( -/obj/effect/decal/cleanable/blood/old, +"pqo" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/vatgrower, -/turf/open/floor/engine, -/area/station/maintenance/starboard/lesser) +/obj/effect/spawner/random/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) "prr" = ( -/obj/structure/table/wood, -/obj/machinery/recharger, -/obj/item/assembly/flash/handheld{ - pixel_x = -11; - pixel_y = 5 +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/obj/effect/turf_decal/siding/wood, /obj/machinery/status_display/evac/directional/south, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/wood, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) "prB" = ( /obj/effect/turf_decal/box/white{ @@ -53475,7 +56935,7 @@ uses = 10 }, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "prC" = ( /obj/effect/turf_decal/siding/wideplating_new{ dir = 1 @@ -53500,46 +56960,67 @@ dir = 8 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"prO" = ( +/obj/structure/chair/comfy{ + dir = 1 + }, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/upper) "prV" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 9 +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/medical/medbay/lobby) +"prX" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 }, -/obj/machinery/stasis, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 1 +/obj/machinery/light/directional/north, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"prZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ +/obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, -/obj/machinery/defibrillator_mount/directional/east, -/obj/machinery/light/directional/east, /obj/effect/landmark/start/hangover, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/turf/open/floor/iron/dark, +/area/station/commons/locker) "psi" = ( -/obj/structure/table/wood/poker, -/obj/item/toy/cards/deck{ - pixel_y = 4 - }, -/turf/open/floor/engine/hull, -/area/space/nearstation) +/obj/effect/landmark/event_spawn, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/cargo/storage) "psj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/evidence) "psk" = ( -/turf/closed/wall, -/area/station/command/gateway) +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/textured, +/area/station/command/eva) "psn" = ( /obj/effect/turf_decal/tile/red/fourcorners, /obj/machinery/light/directional/north, /turf/open/floor/iron/dark, /area/station/security/brig) +"psp" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "pss" = ( /obj/structure/chair/sofa/right/brown{ dir = 4 @@ -53565,7 +57046,7 @@ /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "psK" = ( /obj/machinery/status_display/ai/directional/east, /obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ @@ -53576,7 +57057,7 @@ }, /obj/structure/table/reinforced, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "psO" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -53584,33 +57065,13 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"psQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/camera/autoname/directional/south{ - network = list("ss13","medbay"); - c_tag = "Medbay - Lower Virology Entrance" - }, -/obj/structure/disposalpipe/segment{ +"psU" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/components/binary/crystallizer{ dir = 4 }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/virology) -"ptk" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/siding/yellow{ - dir = 1 - }, -/obj/machinery/vending/wardrobe/chem_wardrobe, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/chemistry) +/turf/open/floor/iron, +/area/station/engineering/atmos/upper) "ptt" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -53622,21 +57083,31 @@ /obj/machinery/light/dim/directional/north, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) -"ptC" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/openspace, -/area/station/medical/storage) "ptI" = ( /obj/structure/railing/corner{ dir = 8 }, /obj/effect/decal/cleanable/dirt, /obj/structure/lattice/catwalk, -/turf/open/openspace/coldroom, -/area/station/medical/coldroom) +/turf/open/openspace, +/area/station/maintenance/department/medical) +"ptM" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"ptS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "ptT" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -53650,24 +57121,38 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"pub" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "puf" = ( /obj/structure/cable/layer3, /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/smooth_half, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "puh" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/chapel) +"pul" = ( +/obj/structure/ladder, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) +"puv" = ( +/obj/effect/turf_decal/stripes, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) +"pux" = ( +/obj/item/stack/sticky_tape{ + pixel_x = 8; + pixel_y = 14 + }, +/obj/structure/table, +/obj/item/stack/sticky_tape{ + pixel_x = -4; + pixel_y = 11 + }, +/obj/item/screwdriver, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "puC" = ( /obj/structure/lattice/catwalk, /obj/machinery/camera/autoname/directional/west, @@ -53696,75 +57181,70 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) +"pva" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "pvg" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) -"pvp" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/station/engineering/main) "pvC" = ( -/obj/structure/table/glass, /obj/effect/turf_decal/siding/blue{ dir = 9 }, -/obj/item/paper_bin{ - pixel_x = -1; - pixel_y = 11 - }, +/obj/structure/bookcase/random/reference, /obj/structure/railing{ dir = 8 }, -/obj/item/stamp{ - pixel_x = -3; - pixel_y = 1 - }, -/obj/item/stamp/denied{ - pixel_x = 6 +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 9 }, -/obj/item/pen{ - pixel_x = -1; - pixel_y = 13 +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 }, -/obj/effect/turf_decal/tile/green/opposingcorners{ +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/item/book/manual/wiki/engineering_construction{ + pixel_y = 9 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "pvF" = ( /obj/effect/turf_decal/tile/red/fourcorners, /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark, /area/station/security/brig) -"pvQ" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/engine, -/area/station/engineering/break_room) -"pvS" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/break_room) +"pvN" = ( +/obj/effect/turf_decal/trimline/white/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "pvT" = ( /obj/structure/railing{ dir = 8 }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai_upload) -"pvU" = ( -/obj/structure/cable/layer1, -/obj/structure/sign/warning/radiation/rad_area/directional/east, -/turf/open/floor/catwalk_floor, -/area/station/engineering/main) -"pwb" = ( -/obj/machinery/meter{ - name = "Mixed Air Tank In" +/area/station/ai/upload/chamber) +"pwj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock{ + id_tag = "Cabin10"; + name = "Cabin 10" }, -/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/upper) +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/commons/dorms) "pwy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -53776,7 +57256,9 @@ dir = 1 }, /obj/machinery/door/firedoor, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 8 + }, /area/station/hallway/primary/central) "pwB" = ( /obj/structure/table, @@ -53793,7 +57275,7 @@ dir = 1 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "pwO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -53826,31 +57308,52 @@ dir = 8 }, /area/station/hallway/primary/fore) +"pwW" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/upper) +"pwY" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner/end, +/obj/structure/railing/corner/end{ + pixel_y = 2 + }, +/obj/structure/cable/multilayer/multiz, +/turf/open/openspace, +/area/station/maintenance/aft/upper) +"pxe" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/ladder, +/obj/structure/fluff/paper/corner, +/turf/open/floor/wood, +/area/station/maintenance/aft) "pxv" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/wood, /area/station/commons/storage/tools) -"pxw" = ( -/obj/machinery/holopad, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) -"pxN" = ( -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "N2 Multideck Adapter"; - dir = 8 - }, -/obj/machinery/meter{ - name = "N2 meter" - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) +"pxz" = ( +/obj/structure/ladder, +/turf/open/floor/plating, +/area/station/maintenance/aft) +"pxK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/turf_decal/siding/green/corner, +/turf/open/floor/plating, +/area/station/hallway/primary/central) "pxS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/security/prison/mess) +"pxX" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/computer/cargo{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "pxZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -53873,11 +57376,14 @@ /turf/open/floor/plating, /area/station/hallway/secondary/entry) "pyf" = ( -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 4 +/obj/machinery/smartfridge/organ, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rear_surgery"; + name = "Surgery Shutters"; + dir = 1 }, -/obj/structure/cable, -/turf/open/floor/iron/white/textured, +/turf/open/floor/plating, /area/station/medical/surgery) "pyh" = ( /obj/machinery/computer/records/security{ @@ -53894,10 +57400,36 @@ /obj/effect/spawner/random/maintenance/no_decals, /turf/open/space/basic, /area/space/nearstation) +"pyA" = ( +/obj/structure/rack, +/obj/item/cardboard_cutout{ + pixel_x = 8 + }, +/obj/item/cardboard_cutout, +/obj/item/cardboard_cutout{ + pixel_x = -5 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) "pyB" = ( -/obj/machinery/light_switch/directional/east, -/turf/open/floor/carpet, +/obj/structure/secure_safe/directional/east, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) +"pyN" = ( +/obj/effect/turf_decal/trimline/white/line{ + dir = 8; + pixel_x = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "pyY" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -53950,6 +57482,11 @@ /obj/structure/table/wood/fancy, /turf/open/openspace, /area/station/maintenance/port/fore) +"pzr" = ( +/obj/structure/sign/poster/official/random/directional/east, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/commons/toilet/restrooms) "pzy" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53957,13 +57494,13 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "pzQ" = ( /obj/structure/lattice/catwalk, -/obj/structure/railing{ - 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/openspace, /area/station/medical/medbay/central) "pzU" = ( @@ -53974,14 +57511,10 @@ /obj/item/reagent_containers/cup/glass/waterbottle/large, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"pzZ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/structure/sign/poster/contraband/missing_gloves/directional/north, -/obj/machinery/rnd/production/circuit_imprinter, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) +"pAd" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard) "pAf" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/corner{ dir = 1 @@ -53993,44 +57526,88 @@ }, /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "pAn" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/wood, -/area/station/medical/medbay/central) -"pAz" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) +"pAp" = ( +/obj/item/chair/plastic, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine/hull/air, /area/station/commons/fitness/recreation) -"pAH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, -/turf/closed/wall/r_wall, -/area/station/maintenance/starboard/aft) "pAJ" = ( /obj/item/radio/intercom/directional/east, /turf/open/floor/wood, /area/station/service/chapel) "pAU" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) +/area/station/medical/medbay/central) +"pAX" = ( +/obj/machinery/camera/preset/ordnance{ + c_tag = "Glass Floor"; + dir = 8 + }, +/turf/open/floor/glass/airless, +/area/station/maintenance/aft) "pBa" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 }, /turf/open/floor/iron, /area/station/cargo/storage) +"pBe" = ( +/obj/structure/ladder, +/obj/structure/sign/warning/directional/east, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/fore) +"pBf" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/plating, +/area/station/maintenance/aft) +"pBh" = ( +/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/engineering/general, +/obj/machinery/door/airlock/engineering{ + name = "Engine Room" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/duct, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/main) +"pBm" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/station/maintenance/aft/upper) +"pBv" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/maintenance/aft) +"pBw" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/obj/machinery/light/small/directional/north, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood, +/area/station/commons/dorms) "pBz" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -54038,7 +57615,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -54055,10 +57632,6 @@ /obj/structure/sign/poster/contraband/grey_tide/directional/south, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"pBG" = ( -/obj/machinery/vending/autodrobe, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "pBH" = ( /obj/item/key/janitor, /obj/vehicle/ridden/janicart, @@ -54077,24 +57650,6 @@ }, /turf/open/floor/wood/large, /area/station/service/library) -"pBJ" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Cargo Bay - Unloading (Low)" - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/structure/railing/corner/end, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/storage) -"pBL" = ( -/obj/structure/table/reinforced, -/obj/item/hand_labeler, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "pBP" = ( /turf/open/floor/engine/air, /area/station/engineering/atmos/upper) @@ -54128,40 +57683,43 @@ }, /turf/open/floor/glass, /area/station/security/brig) -"pDa" = ( +"pCB" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/door/airlock/maintenance, -/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/engineering/storage_shared) -"pDf" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 3; - height = 5; - name = "SS13: Common Mining Dock"; - roundstart_template = /datum/map_template/shuttle/mining_common/meta; - shuttle_id = "commonmining_home"; - width = 7 +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 8 }, /turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/maintenance/starboard/fore/upper) +"pCX" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"pCZ" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/structure/ladder, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"pDi" = ( +/obj/structure/lattice, +/turf/open/openspace, +/area/station/commons/fitness/recreation) "pDp" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/wood, /area/station/command/heads_quarters/rd) -"pDt" = ( -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/siding/brown/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "pDO" = ( /obj/structure/railing{ dir = 1 @@ -54177,6 +57735,15 @@ }, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"pDQ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "pDR" = ( /obj/effect/landmark/firealarm_sanity, /obj/structure/lattice/catwalk, @@ -54201,6 +57768,16 @@ }, /turf/open/floor/iron/dark, /area/station/security/warden) +"pEm" = ( +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "pEx" = ( /obj/structure/railing{ dir = 1 @@ -54217,11 +57794,7 @@ dir = 1 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"pED" = ( -/obj/structure/cable, -/turf/closed/wall, -/area/station/medical/medbay/central) +/area/station/ai/satellite/interior) "pEG" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 4 @@ -54231,16 +57804,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) -"pEI" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "pEK" = ( /turf/open/floor/engine, /area/station/service/hydroponics) @@ -54252,7 +57815,7 @@ /obj/structure/disposalpipe/segment{ dir = 2 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/wood, /area/station/service/chapel) "pEW" = ( @@ -54287,27 +57850,12 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/science/robotics/lab) -"pFb" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) "pFp" = ( /obj/machinery/sparker/directional/west{ id = "Xenobio" }, /turf/open/openspace, /area/station/science/xenobiology) -"pFJ" = ( -/obj/machinery/atmospherics/components/trinary/mixer/flipped, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "pFR" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/dark_green{ @@ -54315,6 +57863,17 @@ }, /turf/open/floor/iron/checker, /area/station/service/bar) +"pFS" = ( +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 + }, +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port) "pFX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -54322,62 +57881,47 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/carpet, /area/station/security/courtroom) +"pFY" = ( +/obj/structure/railing/corner/end, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "pGe" = ( /obj/structure/table, /obj/effect/spawner/random/engineering/toolbox, /obj/machinery/light/directional/north, /turf/open/floor/catwalk_floor/iron_smooth, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "pGf" = ( -/obj/structure/railing, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"pGk" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 8 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"pGl" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/engine/hull/air, -/area/station/engineering/atmos/project) +/obj/effect/turf_decal/trimline/dark_blue/filled/corner, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "pGn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, /turf/open/floor/wood/large, /area/station/medical/psychology) -"pGr" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/yellow{ - pixel_y = 6 - }, -/obj/item/storage/toolbox/electrical{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/storage/toolbox/electrical{ - pixel_x = 1; - pixel_y = -1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "pGs" = ( -/obj/structure/table/reinforced, -/obj/item/folder/red{ - pixel_y = 11 - }, -/obj/item/pen{ - pixel_y = 8 - }, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, +/obj/machinery/camera/directional/south, +/obj/structure/cable, +/obj/structure/table/reinforced, +/obj/machinery/recharger{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 7 + }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) "pGt" = ( @@ -54387,12 +57931,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"pGv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/hangover, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/interior) "pGD" = ( /obj/machinery/camera/directional/west{ c_tag = "Science - Xenobiology South"; @@ -54419,14 +57958,23 @@ dir = 1 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"pGL" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"pGP" = ( +/obj/structure/grille, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/upper) "pGV" = ( /obj/effect/turf_decal/plaque{ - icon_state = "L5" - }, -/obj/effect/turf_decal/siding/green{ - dir = 1 + icon_state = "L6" }, +/obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "pHc" = ( @@ -54444,17 +57992,6 @@ }, /turf/open/floor/iron, /area/station/science/lab) -"pHd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/textured_large, -/area/station/medical/virology) "pHf" = ( /turf/open/floor/carpet, /area/station/commons/storage/tools) @@ -54472,42 +58009,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/station/maintenance/hallway/abandoned_recreation) -"pHq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +"pHJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ - dir = 2 - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/maintenance/port) -"pHx" = ( -/obj/machinery/door/airlock{ - name = "Emergency Storage" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"pHC" = ( -/obj/effect/turf_decal/trimline/green/filled/corner, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/virology) -"pHQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) -"pIf" = ( -/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/table, -/obj/item/stack/sheet/iron, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) +/obj/structure/sign/flag/ssc/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "pIm" = ( /obj/structure/chair/comfy/black{ dir = 1 @@ -54516,19 +58026,6 @@ /obj/machinery/air_sensor, /turf/open/floor/carpet/royalblack, /area/station/command/heads_quarters/hos) -"pIn" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/engineering/main) -"pIr" = ( -/obj/structure/chair, -/turf/open/floor/wood, -/area/station/commons/dorms) "pIt" = ( /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/security/general, @@ -54538,10 +58035,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port) -"pID" = ( -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "pIP" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/dark_blue{ @@ -54551,17 +58044,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"pIV" = ( -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) -"pJf" = ( -/obj/machinery/portable_atmospherics/pump, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "pJi" = ( /obj/machinery/rnd/experimentor, /turf/open/floor/engine, @@ -54576,7 +58058,9 @@ /obj/structure/railing/corner/end/flip{ dir = 1 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 8 + }, /area/station/hallway/primary/central) "pJp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54594,11 +58078,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/explab) -"pJC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/mecha_wreckage/ripley/deathripley, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"pJt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "pJD" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -54612,7 +58096,7 @@ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "pJG" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -54635,17 +58119,15 @@ }, /obj/structure/cable/layer3, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "pJK" = ( -/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/effect/decal/cleanable/greenglow, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/structure/table/wood, +/obj/item/clothing/head/soft/blue, +/obj/item/clothing/head/soft/blue, +/turf/open/floor/wood/large, +/area/station/medical/break_room) "pJM" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 @@ -54656,6 +58138,14 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) +"pJP" = ( +/obj/machinery/light/red/directional/north, +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/medical/chemistry) "pJR" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/curtain/bounty, @@ -54669,6 +58159,11 @@ "pJS" = ( /turf/open/floor/iron, /area/station/hallway/primary/aft) +"pJW" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/directional/west, +/turf/open/space/basic, +/area/space/nearstation) "pKb" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -54676,13 +58171,9 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) -"pKc" = ( -/obj/machinery/light/directional/west, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "pKd" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, /turf/open/floor/plating, /area/station/command/gateway) "pKk" = ( @@ -54693,12 +58184,19 @@ }, /turf/open/floor/iron, /area/station/science/lobby) -"pKp" = ( -/obj/item/trash/can{ - pixel_x = -8 +"pKm" = ( +/obj/structure/railing{ + dir = 1 }, -/turf/open/floor/wood, -/area/station/commons/dorms) +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/structure/chair{ + dir = 8; + pixel_y = -2 + }, +/turf/open/floor/glass, +/area/station/medical/medbay/central) "pKA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54719,29 +58217,35 @@ /turf/open/floor/wood/tile, /area/station/science/robotics) "pKC" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 }, -/obj/effect/landmark/start/shaft_miner, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"pKJ" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Gravity Generator Area" +/turf/open/floor/engine/hull, +/area/space/nearstation) +"pKI" = ( +/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ + dir = 4 }, -/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/construction, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/gravity_generator) -"pKT" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/button/door/directional/south{ - id = "evashutter"; - name = "E.V.A. Storage Shutter Control"; - req_access = list("command") +/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/plating, +/area/station/engineering/atmos/office) +"pKP" = ( +/obj/effect/turf_decal/siding, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/obj/structure/disposalpipe/segment{ + dir = 4 }, /turf/open/floor/iron/large, +/area/station/maintenance/starboard) +"pKT" = ( +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/floor/iron/edge, /area/station/hallway/primary/central) "pKU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54749,14 +58253,19 @@ /obj/structure/cable, /turf/open/floor/glass, /area/station/security/brig) +"pLa" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "pLd" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, -/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/photocopier/prebuilt, +/obj/item/radio/intercom/directional/west, /turf/open/floor/iron, /area/station/cargo/storage) "pLg" = ( @@ -54774,15 +58283,22 @@ }, /turf/open/openspace, /area/station/construction/storage_wing) +"pLq" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "pLv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/door/airlock/mining/glass{ - name = "Quartermaster's Storage" +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/supply/qm, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "pLx" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -54800,13 +58316,15 @@ /turf/open/floor/iron, /area/station/science/research) "pLG" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -4; - pixel_y = 6 +/obj/machinery/porta_turret/ai{ + dir = 4 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/turf/open/floor/circuit/red, +/area/station/ai/upload/chamber) +"pLL" = ( +/obj/structure/sign/departments/medbay/alt/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "pLN" = ( /obj/structure/falsewall, /turf/open/floor/plating, @@ -54816,49 +58334,23 @@ /obj/structure/noticeboard/directional/north, /turf/open/floor/wood/large, /area/station/service/library/private) -"pLP" = ( -/obj/machinery/power/terminal{ - dir = 1; - cable_layer = 1 - }, -/obj/structure/cable/multilayer/layer1, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/catwalk_floor, -/area/station/engineering/engine_smes) -"pLQ" = ( -/obj/effect/spawner/random/maintenance, -/turf/open/floor/engine/hull, -/area/space/nearstation) +"pLS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "pLT" = ( /obj/structure/closet/secure_closet/hydroponics, /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) "pLV" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/right/directional/west{ - name = "Pharmacy Desk"; - req_access = list("pharmacy") - }, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/item/pen{ - pixel_x = -3; - pixel_y = 9 - }, -/obj/effect/turf_decal/tile/yellow/full, +/obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ dir = 4; id = "chemshutters"; - name = "Chemistry Shutters" + name = "Pharmacy Shutters" }, -/turf/open/floor/iron/dark/smooth_large, +/turf/open/floor/plating, /area/station/medical/pharmacy) "pMd" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -54874,9 +58366,12 @@ /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/obj/structure/railing/corner, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "pMk" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/spawner/random/engineering/tracking_beacon, @@ -54886,7 +58381,7 @@ /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/machinery/light/directional/west, +/obj/item/radio/intercom/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "pMn" = ( @@ -54896,6 +58391,13 @@ /obj/effect/mapping_helpers/broken_machine, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) +"pMu" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/carpet, +/area/station/security/courtroom) "pMy" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 4 @@ -54905,39 +58407,31 @@ }, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) +"pMC" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "pME" = ( /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/smooth_large, /area/station/service/hydroponics) -"pMH" = ( -/obj/effect/decal/cleanable/crayon{ - icon_state = "!"; - pixel_x = 9; - pixel_y = -1 - }, -/turf/closed/wall, -/area/station/maintenance/starboard/lesser) "pML" = ( -/obj/structure/table/wood, -/obj/item/folder/blue{ - pixel_x = 4; - pixel_y = -6 - }, -/obj/item/toy/figure/hop{ - pixel_x = -1; - pixel_y = 7 - }, -/obj/item/toy/figure/ian{ - pixel_x = -8; - pixel_y = 4 +/obj/structure/chair/comfy/brown{ + dir = 8 }, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/landmark/start/head_of_personnel, +/obj/effect/turf_decal/siding/wood/end{ dir = 8 }, -/turf/open/floor/carpet, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) "pMS" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -54972,23 +58466,32 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) "pNg" = ( +/obj/structure/railing/corner{ + dir = 1 + }, /obj/structure/railing{ dir = 1 }, -/obj/structure/rack, +/obj/structure/table/wood/fancy/green, /obj/effect/spawner/random/aimodule/harmless{ pixel_x = 2; - pixel_y = 3 + pixel_y = 8 + }, +/obj/effect/spawner/random/aimodule/harmless{ + pixel_x = -3; + pixel_y = -2 }, -/obj/item/ai_module/supplied/quarantine, -/obj/item/screwdriver, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "pNh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall, /area/station/service/abandoned_gambling_den) +"pNj" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "pNk" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, @@ -54997,10 +58500,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "pNl" = ( @@ -55010,12 +58513,10 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/station/security/brig) -"pNA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/kitchen/rollingpin, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) +"pNr" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "pNF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55036,6 +58537,12 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) +"pNV" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "pOh" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55047,19 +58554,18 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) +"pOu" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/duct, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "pOD" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/structure/closet/l3closet, /turf/open/floor/iron/textured_large, /area/station/medical/virology) -"pOF" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/effect/spawner/random/clothing/backpack, -/turf/open/floor/iron, -/area/station/commons/dorms) "pOM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55078,12 +58584,19 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/science/central) -"pOQ" = ( +"pOP" = ( +/obj/structure/window/reinforced/spawner/directional/east, /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 = 5 +/obj/structure/transit_tube/horizontal, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"pOQ" = ( +/obj/effect/turf_decal/trimline/brown/arrow_cw, +/obj/effect/turf_decal/trimline/brown/arrow_ccw{ + dir = 1 }, /turf/open/floor/iron, /area/station/cargo/storage) @@ -55091,11 +58604,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/engine, /area/station/science/auxlab/firing_range) -"pOW" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "pPb" = ( /obj/effect/turf_decal/trimline/dark/arrow_cw{ dir = 8 @@ -55113,13 +58621,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"pPg" = ( -/obj/machinery/camera/preset/ordnance{ - c_tag = "Glass Floor"; - dir = 10 - }, -/turf/open/floor/glass/airless, -/area/station/maintenance/starboard/lesser) "pPk" = ( /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron, @@ -55132,38 +58633,34 @@ }, /turf/open/floor/iron/freezer, /area/station/maintenance/port) +"pPm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/textured_large, +/area/station/medical/virology) "pPn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron/dark/smooth_large, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "pPt" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "hop"; - name = "Privacy Shutters" - }, -/obj/item/paper_bin{ - pixel_x = -5; - pixel_y = 4 - }, -/obj/item/pen, /obj/item/pen, /obj/item/pen, -/obj/machinery/door/window/left/directional/west, -/obj/machinery/door/window/brigdoor/right/directional/east{ - name = "Head of Personnel's Desk"; - req_access = list("hop") +/obj/effect/landmark/start/head_of_personnel, +/obj/structure/chair/office{ + dir = 8 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/siding/wood/end{ + dir = 8 + }, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) -"pPu" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "pPA" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -55181,21 +58678,18 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) -"pPG" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "pPO" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance" }, /obj/structure/cable, -/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/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/port) "pPS" = ( @@ -55208,29 +58702,18 @@ /obj/structure/railing{ dir = 4 }, -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/structure/table, -/obj/item/storage/toolbox/electrical{ - pixel_x = -3; - pixel_y = 11 - }, -/obj/item/storage/belt/utility{ - pixel_x = -3 - }, -/obj/item/storage/belt/utility{ - pixel_x = -3 - }, -/obj/machinery/camera/autoname/directional/south, /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ dir = 8 }, /obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ dir = 8 }, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/machinery/status_display/ai/directional/south, +/obj/effect/turf_decal/stripes{ + dir = 6 + }, +/turf/open/floor/iron/textured, +/area/station/command/eva) "pQa" = ( /obj/machinery/door/firedoor, /turf/open/floor/engine/hull/air, @@ -55262,24 +58745,24 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/service/hydroponics/garden/abandoned) +"pQp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "pQq" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/item/paper_bin/carbon{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/item/pen/fountain{ - pixel_x = 9; - pixel_y = 4 +/obj/effect/turf_decal/stripes/corner{ + dir = 4 }, -/obj/machinery/light_switch/directional/west{ - pixel_y = 6 +/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/stripes/line{ + dir = 10 }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "pQt" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -55303,29 +58786,17 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"pQG" = ( -/obj/structure/cable, -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/plating, -/area/station/maintenance/port) "pQK" = ( /obj/structure/railing/corner, -/obj/machinery/door/airlock/medical{ - name = "Medbay Storage" - }, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/machinery/door/firedoor, -/turf/open/floor/iron/dark/textured_large, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/floor/iron/white, /area/station/medical/medbay/central) "pQQ" = ( -/obj/machinery/door/airlock/maintenance, +/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/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "pQS" = ( @@ -55343,17 +58814,6 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"pQV" = ( -/obj/machinery/smartfridge/chemistry/preloaded, -/turf/open/floor/plating, -/area/station/medical/pharmacy) -"pRm" = ( -/obj/structure/lattice/catwalk, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) "pRt" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -55372,16 +58832,13 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) -"pRx" = ( -/obj/structure/sign/poster/contraband/random/directional/west, -/obj/machinery/power/port_gen/pacman/pre_loaded, -/obj/effect/turf_decal/bot, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"pRA" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +"pRB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "pRG" = ( /obj/effect/turf_decal/tile/purple/half{ dir = 8 @@ -55421,24 +58878,43 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/construction/storage_wing) -"pRW" = ( -/obj/effect/turf_decal/stripes/line{ +"pSd" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/structure/lattice/catwalk, +/obj/machinery/light/directional/west, +/obj/item/kirbyplants/random, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"pSi" = ( +/obj/item/cigbutt{ + pixel_x = -11; + pixel_y = -5 + }, /obj/structure/cable, -/turf/open/openspace, -/area/station/engineering/atmos/project) +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "pSj" = ( /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2, /obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4, /turf/open/floor/plating, /area/station/security/interrogation) -"pSx" = ( +"pSk" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/holopad, -/turf/open/floor/iron/textured_large, -/area/station/medical/abandoned) +/obj/structure/curtain, +/obj/machinery/duct, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/fluff/shower_drain, +/turf/open/floor/iron/freezer, +/area/station/commons/dorms) +"pSv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/dorms) "pSz" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -55456,17 +58932,6 @@ /obj/effect/landmark/start/hangover, /turf/open/openspace, /area/station/hallway/primary/aft) -"pSF" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/broken_flooring/singular/directional/west, -/obj/structure/broken_flooring/singular/always_floorplane/directional, -/obj/structure/broken_flooring/singular, -/obj/item/assembly/mousetrap, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) "pSI" = ( /obj/machinery/firealarm/directional/south, /obj/structure/cable, @@ -55504,6 +58969,13 @@ }, /turf/open/floor/wood/large, /area/station/medical/psychology) +"pTp" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "pTu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55530,10 +59002,6 @@ }, /turf/open/floor/grass, /area/station/science/genetics) -"pTz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "pTB" = ( /obj/structure/table, /obj/item/taperecorder{ @@ -55549,29 +59017,23 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"pTS" = ( -/obj/machinery/power/emitter/prototype{ - desc = "Hell yeah."; - dir = 4; - name = "Betsy" - }, -/turf/open/floor/engine, -/area/station/engineering/break_room) "pTT" = ( /obj/effect/turf_decal/trimline/red/filled/warning, /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) -"pTX" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) -"pUb" = ( -/obj/effect/landmark/start/chief_medical_officer, +"pTV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "pUe" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 10 @@ -55585,11 +59047,25 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"pUr" = ( +"pUp" = ( +/obj/effect/turf_decal/trimline/brown/filled/end, /obj/structure/closet/emcloset, -/obj/effect/landmark/start/hangover/closet, /turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) +/area/station/cargo/miningoffice) +"pUx" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/obj/machinery/atmospherics/components/binary/pump/on/layer5{ + name = "N2 to Airmix" + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "pUE" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -55607,6 +59083,12 @@ }, /turf/open/floor/carpet/black, /area/station/commons/lounge) +"pUU" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "pUV" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line, /obj/machinery/light/cold/directional/south, @@ -55614,6 +59096,16 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, /area/station/science/cytology) +"pUY" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/table, +/obj/machinery/recharger{ + pixel_x = 7; + pixel_y = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) "pUZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -55630,7 +59122,12 @@ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"pVr" = ( +/obj/structure/cable, +/obj/structure/sign/poster/contraband/fake_bombable/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "pVw" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/mirror/directional/north, @@ -55642,26 +59139,53 @@ /area/station/maintenance/hallway/abandoned_recreation) "pVy" = ( /obj/effect/landmark/start/assistant, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 1 + }, /area/station/hallway/primary/central) -"pVA" = ( -/obj/effect/turf_decal/stripes/line{ +"pVM" = ( +/obj/structure/disposalpipe/sorting/mail{ dir = 4 }, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"pWh" = ( -/obj/machinery/button/door/directional/west{ - id = "Cabin6"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 24; - specialfunctions = 4 +/obj/effect/mapping_helpers/mail_sorting/engineering/general, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 }, -/obj/item/kirbyplants/random, -/turf/open/floor/wood, -/area/station/commons/dorms) +/turf/open/floor/iron, +/area/station/engineering/lobby) +"pVO" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/closet/secure_closet/security/engine, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) +"pWi" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos) +"pWk" = ( +/obj/structure/chair{ + dir = 4; + pixel_y = -2 + }, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"pWl" = ( +/obj/effect/turf_decal/siding, +/obj/effect/turf_decal/trimline/white/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "pWn" = ( /turf/open/floor/iron/stairs/medium{ dir = 8 @@ -55699,12 +59223,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) +"pWQ" = ( +/obj/effect/landmark/blobstart, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/aft) "pWR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) +/obj/structure/sign/clock/directional/north, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/turf/open/floor/carpet/blue, +/area/station/medical/break_room) "pWZ" = ( /obj/machinery/door/airlock{ name = "Toilet" @@ -55739,10 +59271,36 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark/diagonal, /area/station/service/theater) -"pXM" = ( -/obj/structure/railing/corner, +"pXF" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/warehouse) +"pXL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, /turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/area/station/engineering/storage/tech) +"pYg" = ( +/obj/structure/table/wood, +/obj/item/radio{ + pixel_y = 4; + pixel_x = -4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/wood/large, +/area/station/commons/dorms) +"pYi" = ( +/obj/item/kirbyplants/random, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/textured_large, +/area/station/medical/abandoned) "pYI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55753,42 +59311,59 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /obj/effect/landmark/navigate_destination/aiupload, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) -"pZQ" = ( -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ +/area/station/ai/upload/foyer) +"pZd" = ( +/obj/item/radio/intercom/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 +/turf/open/floor/wood, +/area/station/commons/dorms) +"pZv" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ +/obj/effect/turf_decal/tile/brown{ dir = 1 }, -/turf/open/floor/iron/white/textured_large, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central) +"pZJ" = ( +/turf/closed/wall/r_wall, +/area/station/engineering/atmos) +"pZQ" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/chair/sofa/bench/solo{ + dir = 4 + }, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/iron/dark, /area/station/medical/medbay/central) "pZT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, +/obj/structure/chair/sofa/right/brown, +/obj/item/clothing/head/soft{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, /area/station/cargo/storage) -"pZX" = ( -/turf/closed/wall, -/area/station/ai_monitored/command/storage/eva) -"qac" = ( -/obj/effect/turf_decal/siding/brown{ +"pZW" = ( +/obj/structure/chair/greyscale{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/aft/upper) +"pZX" = ( +/turf/closed/wall, +/area/station/command/eva) +"pZZ" = ( +/obj/effect/spawner/random/engineering/tank, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "qae" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, @@ -55798,7 +59373,6 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) "qaf" = ( @@ -55819,6 +59393,13 @@ }, /turf/open/floor/wood, /area/station/security/detectives_office) +"qaq" = ( +/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/layer5{ + dir = 8; + name = "air mixer" + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "qat" = ( /obj/effect/decal/cleanable/dirt, /obj/item/wirecutters{ @@ -55833,16 +59414,27 @@ /obj/machinery/wall_healer/directional/south, /turf/open/floor/iron, /area/station/science/research) +"qaw" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/structure/railing, +/turf/open/floor/plating, +/area/station/maintenance/aft) "qaA" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 }, /turf/open/floor/wood/large, /area/station/hallway/primary/central) +"qaH" = ( +/obj/structure/dresser, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/wood, +/area/station/commons/dorms) "qaI" = ( /obj/structure/table/reinforced, /obj/item/flashlight/lamp, /obj/structure/lattice/catwalk, +/obj/structure/cable, /turf/open/openspace, /area/station/security/checkpoint/supply) "qaK" = ( @@ -55869,10 +59461,14 @@ }, /turf/open/floor/wood, /area/station/service/lawoffice) -"qbm" = ( -/obj/structure/closet/secure_closet/engineering_welding, -/turf/open/floor/iron/smooth, -/area/station/engineering/main) +"qbq" = ( +/obj/machinery/computer/records/security{ + dir = 4 + }, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/red/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "qbw" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 8 @@ -55885,6 +59481,22 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/storage_shared) +"qbI" = ( +/obj/machinery/washing_machine, +/obj/machinery/airalarm/directional/north, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) +"qbM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "qbT" = ( /turf/closed/wall/r_wall, /area/station/security/prison/mess) @@ -55895,23 +59507,23 @@ /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) -"qbZ" = ( -/obj/structure/transport/linear{ - radial_travel = 0 - }, -/obj/machinery/elevator_control_panel/directional/south{ - linked_elevator_id = "catwalk_engi"; - preset_destination_names = list("2"="Lower Engine","3"="Upper Atmos.") +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 }, -/turf/open/openspace, -/area/station/engineering/break_room) +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "qcb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, /area/station/science/xenobiology) +"qcc" = ( +/obj/structure/transport/linear{ + radial_travel = 0 + }, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "qcx" = ( /obj/structure/stairs/south, /turf/open/floor/iron/stairs/medium{ @@ -55937,36 +59549,32 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/central) -"qcT" = ( -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/engineering/break_room) -"qcX" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 9 - }, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +"qcQ" = ( +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"qcW" = ( +/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) "qdd" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/item/retractor, -/obj/item/retractor{ - pixel_x = -1; - pixel_y = 7 - }, -/obj/item/bonesetter{ - pixel_x = -4 +/obj/machinery/power/apc/auto_name/directional/east, +/obj/item/tank/internals/anesthetic, +/obj/item/clothing/mask/breath/medical{ + pixel_y = -3 }, -/obj/item/bonesetter{ - pixel_x = 2; - pixel_y = 3 +/obj/structure/cable, +/obj/structure/closet/secure_closet/medical2, +/obj/effect/turf_decal/trimline/blue/warning{ + dir = 1 }, -/turf/open/floor/iron/white/textured_large, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/surgery) "qdi" = ( /obj/effect/decal/cleanable/dirt, @@ -55999,6 +59607,13 @@ }, /turf/open/floor/iron/airless, /area/station/maintenance/starboard/aft) +"qdP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "qdR" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/decal/cleanable/dirt, @@ -56036,32 +59651,12 @@ /obj/machinery/light/directional/west, /turf/open/openspace, /area/station/hallway/primary/fore) -"qei" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/maintenance/starboard/lesser) -"qek" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "qel" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"qep" = ( -/obj/structure/sink/directional/west, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/effect/landmark/start/paramedic, -/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) "qeq" = ( /obj/effect/mapping_helpers/trapdoor_placer, /obj/machinery/camera/autoname/directional/south, @@ -56083,6 +59678,12 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"qeN" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2o{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "qeP" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/glass/fifty{ @@ -56101,22 +59702,24 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/robotics/lab) -"qeQ" = ( -/turf/open/floor/engine/vacuum, -/area/station/maintenance/disposal/incinerator) +"qeV" = ( +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4; + name = "Waste Release" + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "qeX" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "qeZ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/large, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/edge, /area/station/hallway/primary/central) "qfh" = ( /obj/effect/turf_decal/tile/red/half/contrasted, -/obj/structure/cable, +/obj/effect/mapping_helpers/dead_body_placer, /turf/open/floor/iron/dark/textured_edge{ dir = 1 }, @@ -56136,6 +59739,28 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"qfz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/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 = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) +"qfB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/fore) +"qfF" = ( +/obj/structure/sign/warning/directional/west, +/turf/open/space/openspace, +/area/space/nearstation) "qfS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56144,15 +59769,6 @@ }, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"qfT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) "qgc" = ( /obj/item/radio{ pixel_x = 6; @@ -56169,24 +59785,12 @@ /obj/structure/table/reinforced/rglass, /turf/open/floor/glass, /area/station/security/brig) -"qgd" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/yellow{ +"qge" = ( +/obj/structure/railing{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - 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/station/medical/chemistry) +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "qgj" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -56208,40 +59812,21 @@ /turf/open/floor/iron, /area/station/science/lab) "qgr" = ( -/obj/structure/table, -/obj/item/dest_tagger{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/dest_tagger{ - pixel_x = -6; - pixel_y = 8 - }, -/obj/item/clothing/head/soft{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/effect/turf_decal/trimline/brown/filled, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"qgD" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/light/warm/dim/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port) +/obj/item/kirbyplants/random, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "qgI" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Cargo Lockdown Shutters"; + id = "cargolockdown"; 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, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/station/cargo/storage) "qgV" = ( /obj/structure/reagent_dispensers/watertank, @@ -56253,12 +59838,6 @@ /obj/structure/railing/corner/end, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"qhl" = ( -/obj/machinery/pipedispenser/disposal, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/main) "qhq" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -56286,6 +59865,12 @@ /obj/effect/turf_decal/box, /turf/open/floor/iron/dark/textured_half, /area/station/science/ordnance/storage) +"qhz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/corner, +/area/station/hallway/primary/central) "qhB" = ( /obj/structure/closet/firecloset, /turf/open/floor/plating, @@ -56328,25 +59913,6 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"qhP" = ( -/obj/machinery/door/airlock/maintenance, -/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/engineering/general, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"qhW" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/landmark/start/depsec/engineering, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/engineering) "qid" = ( /obj/machinery/door/airlock/research{ name = "Research Division Backdoor" @@ -56360,6 +59926,14 @@ /obj/effect/mapping_helpers/airlock/access/any/science/xenobio, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) +"qie" = ( +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "SM_shutters"; + name = "Supermatter Radiation Shutters"; + dir = 1 + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter) "qih" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/griddle, @@ -56367,21 +59941,20 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/mess) -"qij" = ( +"qim" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/rack, /turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/area/station/maintenance/starboard/central) "qip" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/cigbutt{ - pixel_x = 6; - pixel_y = 12 - }, -/obj/machinery/modular_computer/preset/id{ +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "qir" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -56450,12 +60023,6 @@ /obj/structure/sign/poster/official/moth_hardhat/directional/west, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"qjt" = ( -/obj/structure/lattice/catwalk, -/obj/effect/spawner/random/maintenance/two, -/obj/structure/rack, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) "qjy" = ( /obj/machinery/computer/slot_machine{ pixel_y = 2 @@ -56487,14 +60054,10 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) -"qjU" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/landmark/start/medical_doctor, +"qjT" = ( +/obj/machinery/status_display/ai/directional/south, /turf/open/openspace, -/area/station/medical/storage) +/area/station/ai/upload/chamber) "qjV" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, @@ -56532,10 +60095,19 @@ /turf/open/floor/glass, /area/station/security/brig) "qkm" = ( -/obj/machinery/light/directional/west, -/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"qkn" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/atmospherics/pipe/multiz/green/visible{ + dir = 2; + name = "mix to space multi-deck adaper" + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "qkv" = ( /obj/structure/railing{ dir = 4 @@ -56551,12 +60123,6 @@ /obj/effect/turf_decal/trimline/green/filled/line, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) -"qkM" = ( -/obj/structure/sign/warning/radiation/rad_area{ - dir = 1 - }, -/turf/closed/wall, -/area/station/engineering/gravity_generator) "qkU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56580,48 +60146,31 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/science/central) -"qlf" = ( -/obj/machinery/computer/station_alert, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/engineering/lobby) "qlg" = ( /obj/machinery/mech_bay_recharge_port, /turf/open/floor/iron/smooth, /area/station/science/robotics) -"qlk" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/openspace, -/area/station/medical/storage) -"qlx" = ( -/obj/structure/closet/crate/engineering{ - name = "Basic Materials" - }, -/obj/item/stock_parts/power_store/cell/high, -/obj/item/stock_parts/power_store/cell/high, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/effect/turf_decal/delivery/white{ - color = "#52B4E9" - }, -/obj/item/stack/rods{ - amount = 50 +"qlj" = ( +/obj/structure/table/wood, +/obj/machinery/computer/arcade/orion_trail{ + desc = "For gamers only. Casuals need not apply."; + icon_screen = "library"; + icon_state = "oldcomp"; + name = "Gamer Computer" }, -/obj/item/stack/sheet/glass{ - amount = 50 +/obj/structure/sign/calendar/directional/north, +/turf/open/floor/wood/large, +/area/station/commons/dorms) +"qlu" = ( +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer2{ + dir = 1 }, -/obj/item/stack/sheet/iron{ - amount = 50 +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_atmos{ + dir = 4 }, /turf/open/floor/engine, -/area/station/engineering/break_room) +/area/station/engineering/atmos/upper) "qly" = ( /obj/machinery/camera/autoname/directional/north, /turf/open/floor/engine/hull/air, @@ -56668,46 +60217,42 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"qmc" = ( -/obj/effect/turf_decal/siding, -/obj/effect/turf_decal/trimline/white/corner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) -"qmd" = ( -/obj/structure/lattice/catwalk, -/obj/structure/ladder, -/obj/structure/sign/poster/official/pda_ad/directional/west, -/turf/open/openspace, -/area/station/maintenance/starboard/fore) "qmh" = ( /obj/effect/spawner/random/trash/box, /turf/open/floor/plating, /area/station/maintenance/port) +"qms" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/mid_joiner{ + dir = 1 + }, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) +"qmy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "qmB" = ( /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qmD" = ( /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/obj/structure/closet/crate/freezer, -/obj/item/food/chocolatebar, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) -"qmI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/food/pizzaslice/moldy/bacteria, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) +"qmT" = ( /obj/structure/cable, -/obj/effect/spawner/random/trash/garbage, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "qmY" = ( /obj/effect/turf_decal/siding/blue{ dir = 6 @@ -56724,38 +60269,37 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"qnh" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "qnt" = ( -/obj/structure/table/wood, -/obj/item/storage/photo_album{ - pixel_x = 2; - pixel_y = 2 +/obj/structure/chair/comfy/black{ + dir = 1 }, -/obj/item/paper_bin{ - pixel_x = -5; - pixel_y = 6 +/obj/effect/landmark/start/captain, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/floor/carpet, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) +"qnB" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/obj/machinery/meter/monitored/distro_loop, +/obj/effect/turf_decal/box/red, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) "qnC" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/department/science/central) -"qnM" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction) -"qnN" = ( -/obj/effect/turf_decal/siding/brown, -/obj/structure/rack, -/obj/item/clothing/ears/earmuffs, -/obj/item/clothing/under/color/blue, -/obj/item/clothing/neck/tie/blue{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/clothing/head/soft/blue, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/station/maintenance/department/science/central) +"qnM" = ( +/obj/machinery/vending/coffee, /turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/area/station/hallway/secondary/construction) "qnR" = ( /obj/structure/lattice/catwalk, /obj/structure/sign/poster/contraband/clown/directional/south, @@ -56770,12 +60314,14 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) -"qnS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating, -/area/station/maintenance/port) +"qnU" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - Nitrogen Cell"; + name = "atmospherics camera" + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/engine/n2, +/area/station/engineering/atmos/upper) "qnW" = ( /obj/effect/turf_decal/tile/dark_blue/anticorner{ dir = 8 @@ -56786,6 +60332,28 @@ dir = 4 }, /area/station/science/robotics) +"qod" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/stack{ + dir = 1 + }, +/obj/structure/fluff/paper/corner{ + dir = 8 + }, +/obj/item/paper/crumpled{ + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft) +"qol" = ( +/obj/machinery/camera/directional/west, +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "qom" = ( /obj/machinery/teleport/hub, /obj/effect/turf_decal/tile/green/opposingcorners{ @@ -56810,11 +60378,18 @@ /obj/machinery/suit_storage_unit/hos, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) -"qoD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) +"qoB" = ( +/obj/structure/barricade/sandbags, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/aft/upper) +"qoL" = ( +/obj/machinery/atmospherics/components/tank/air/layer4{ + dir = 4 + }, +/obj/structure/sign/warning/vacuum/external/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "qoN" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 @@ -56845,7 +60420,6 @@ input_dir = 2; output_dir = 1 }, -/obj/structure/window/reinforced/spawner/directional/south, /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/plating, /area/station/maintenance/disposal) @@ -56857,15 +60431,21 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"qpc" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/plating, -/area/station/engineering/main) +"qpn" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "qpt" = ( -/obj/structure/closet/secure_closet/captains, -/turf/open/floor/wood, +/obj/machinery/camera/autoname/directional/east, +/obj/structure/displaycase/captain{ + pixel_y = 5 + }, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) "qpu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56874,39 +60454,31 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/plating, /area/station/maintenance/port) -"qpw" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 6 - }, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) -"qpD" = ( -/obj/machinery/power/apc/auto_name/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/dark, -/area/station/engineering/transit_tube) "qpG" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/spawner/random/vending/snackvend, -/obj/machinery/door/firedoor/border_only{ - dir = 4 +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/edge, +/area/station/hallway/primary/central) +"qpH" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/disposalpipe/segment{ + dir = 5 }, /turf/open/floor/wood, -/area/station/command/meeting_room/council) +/area/station/maintenance/aft) "qpI" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) +"qpJ" = ( +/obj/structure/sign/poster/official/no_erp/directional/north, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "qpL" = ( /turf/open/floor/engine/co2, /area/station/engineering/atmos/upper) @@ -56914,12 +60486,6 @@ /obj/effect/turf_decal/siding/wood/corner, /turf/open/floor/wood, /area/station/hallway/primary/central) -"qpY" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "qqd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/electric_shock/directional/east, @@ -56929,10 +60495,10 @@ /area/station/construction/storage_wing) "qqi" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/greater) "qqj" = ( @@ -56943,6 +60509,13 @@ /obj/machinery/light/blacklight/directional/south, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"qqs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "qqv" = ( /obj/machinery/door/window/brigdoor/left/directional/east{ name = "Creature Pen"; @@ -56959,7 +60532,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/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) "qqC" = ( @@ -56967,7 +60540,7 @@ dir = 1 }, /turf/open/floor/iron/white/textured_corner, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "qqD" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -56975,8 +60548,9 @@ /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ dir = 8 }, -/obj/machinery/shower/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/holopad{ + pixel_y = 6 + }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "qqJ" = ( @@ -56986,16 +60560,24 @@ /obj/effect/landmark/start/lawyer, /turf/open/floor/carpet, /area/station/service/lawoffice) -"qqY" = ( -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 1 +"qqV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 }, -/obj/structure/cable, -/turf/open/floor/engine/hull, -/area/space/nearstation) +/turf/open/floor/wood/large, +/area/station/engineering/lobby) "qrd" = ( /turf/open/openspace, /area/station/medical/abandoned) +"qrq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "qrz" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -57023,6 +60605,14 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"qrK" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/medical_all, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "qrN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/green, @@ -57037,12 +60627,16 @@ dir = 4 }, /area/station/hallway/primary/port) -"qrS" = ( -/obj/structure/railing/corner/end/flip{ - dir = 8 +"qrY" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 }, -/turf/open/floor/eighties, -/area/station/maintenance/starboard/fore) +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "qrZ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -57055,7 +60649,9 @@ "qsb" = ( /obj/machinery/camera/autoname/directional/east, /obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) "qsd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57072,15 +60668,12 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "qsi" = ( -/obj/structure/chair/office, -/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/conveyor{ + id = "cargounload"; dir = 4 }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) +/turf/open/floor/iron/dark/textured, +/area/station/cargo/storage) "qsm" = ( /obj/machinery/door/airlock/security/glass{ name = "Security E.V.A. Storage" @@ -57091,35 +60684,32 @@ /obj/effect/turf_decal/tile/red/fourcorners, /obj/effect/mapping_helpers/airlock/access/all/security/armory, /obj/structure/cable, +/obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron/dark, /area/station/security/eva) -"qsv" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating/airless, -/area/station/maintenance/port/aft) -"qsC" = ( -/obj/structure/ladder, +"qsr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"qsx" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input, +/turf/open/floor/engine/airless, +/area/station/engineering/atmos/upper) "qsD" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance" }, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, -/area/station/medical/coldroom) -"qsM" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/sign/directions/command/directional/north{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) +/area/station/maintenance/department/medical) "qsO" = ( /obj/effect/turf_decal/delivery, /obj/structure/closet/firecloset, @@ -57150,14 +60740,25 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) -"qtC" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Port to Engine" +"qtl" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/trimline/brown, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) +"qtv" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "qtM" = ( /obj/machinery/libraryscanner, /obj/machinery/camera/autoname/directional/north, @@ -57175,15 +60776,17 @@ /obj/effect/turf_decal/siding/blue{ dir = 1 }, -/obj/effect/turf_decal/arrows{ - dir = 8 - }, +/obj/machinery/newscaster/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "qtW" = ( /obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge, /area/station/hallway/primary/central) +"quk" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "quB" = ( /obj/structure/chair/comfy/brown{ color = "#596479"; @@ -57221,17 +60824,6 @@ }, /turf/open/floor/engine/hull/air, /area/station/maintenance/port) -"qve" = ( -/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/structure/disposalpipe/segment, -/obj/machinery/computer/security/telescreen/ce/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "qvg" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty{ @@ -57256,41 +60848,18 @@ /obj/item/crowbar{ pixel_y = 5 }, -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/light_switch/directional/east{ - pixel_y = -5 - }, /obj/machinery/firealarm/directional/east{ pixel_y = 5 }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/stripes{ + dir = 5 + }, +/turf/open/floor/iron/textured, +/area/station/command/eva) "qvo" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/zoo) -"qvr" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/structure/sign/warning/radiation/rad_area/directional/south, -/turf/open/floor/engine, -/area/station/engineering/supermatter) -"qvu" = ( -/obj/machinery/light/directional/south, -/obj/structure/lattice/catwalk, -/obj/machinery/firealarm/directional/south, -/turf/open/openspace, -/area/station/security/checkpoint/supply) -"qvw" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/firealarm/directional/west, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "qvL" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/light/directional/south, @@ -57306,15 +60875,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"qvU" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "qvW" = ( /obj/item/toy/plush/moth{ name = "Moff #1"; @@ -57329,12 +60889,33 @@ /area/station/maintenance/starboard/aft) "qwa" = ( /obj/machinery/camera/autoname/directional/south, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 8 + }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"qwb" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/structure/fluff/paper/corner, +/obj/structure/fluff/paper/stack{ + dir = 9 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "qwn" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/open/space/openspace, /area/space/nearstation) +"qww" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/obj/structure/closet/radiation, +/obj/machinery/light/small/directional/south, +/obj/structure/sign/poster/official/safety_eye_protection/directional/west, +/turf/open/floor/iron, +/area/station/engineering/lobby) "qwy" = ( /obj/machinery/space_heater, /turf/open/floor/plating, @@ -57354,6 +60935,14 @@ }, /turf/open/floor/glass, /area/station/service/kitchen) +"qwG" = ( +/obj/item/cigbutt{ + pixel_x = 7; + pixel_y = 14 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "qwJ" = ( /obj/machinery/door/firedoor, /obj/structure/table/reinforced, @@ -57368,29 +60957,44 @@ /turf/open/space/openspace, /area/station/solars/starboard/aft) "qxr" = ( -/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/brown/filled/line{ - dir = 6 +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, +/turf/open/floor/iron/dark/textured, /area/station/cargo/sorting) +"qxw" = ( +/obj/structure/urinal/directional/west, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "qxA" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 8 }, +/obj/effect/decal/cleanable/generic, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/storage) -"qxE" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/lesser) "qxI" = ( /obj/machinery/camera/autoname/directional/west, /turf/open/floor/engine, /area/station/science/xenobiology) +"qxL" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/petri_dish/random{ + pixel_x = -14; + pixel_y = 7 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) "qxM" = ( /obj/structure/closet/secure_closet/hydroponics, /obj/effect/turf_decal/tile/green/full, @@ -57402,6 +61006,12 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_recreation) +"qxQ" = ( +/obj/machinery/light/warm/dim/directional/west, +/obj/effect/turf_decal/bot_white, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/iron/dark/textured_large, +/area/station/cargo/storage) "qxR" = ( /obj/item/radio/intercom/directional/west{ freerange = 1; @@ -57410,52 +61020,60 @@ }, /obj/structure/lattice/catwalk, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"qxV" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/stack, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) +"qxW" = ( +/obj/item/storage/box/lights/mixed, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard) +"qya" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "qye" = ( /obj/machinery/suit_storage_unit/standard_unit, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/item/radio/intercom/directional/north, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "qyf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/railing/corner/end/flip, /turf/open/floor/plating, /area/station/maintenance/port/aft) "qyg" = ( -/obj/structure/table/glass, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 11 +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 8 }, -/obj/item/multitool{ - pixel_x = 6; - pixel_y = 2 +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 }, -/obj/structure/fireaxecabinet/directional/south, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"qyu" = ( -/obj/structure/lattice/catwalk, -/obj/structure/table/glass, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 1; - pixel_y = 2 +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 4 }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 1; - pixel_y = 2 +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 4 }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 1; - pixel_y = 2 +/obj/machinery/vending/cigarette{ + pixel_x = 5 }, -/obj/item/wrench, -/obj/item/crowbar/red, -/turf/open/openspace, -/area/station/engineering/break_room) +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "qyy" = ( /obj/effect/turf_decal/siding/blue, /obj/effect/turf_decal/siding/blue{ @@ -57480,12 +61098,14 @@ /obj/item/stack/sheet/plasteel/twenty, /turf/open/floor/iron/dark/textured_corner, /area/station/science/robotics/lab) -"qyU" = ( -/obj/structure/chair{ - dir = 1 +"qyT" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 }, /turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/maintenance/starboard/upper) "qyW" = ( /obj/machinery/firealarm/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -57493,31 +61113,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/ordnance/storage) -"qzb" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"qze" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/department/medical) -"qzf" = ( -/obj/machinery/door/airlock{ - name = "Kitchen" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) "qzo" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 1 @@ -57535,16 +61130,10 @@ dir = 8 }, /area/station/science/ordnance/storage) -"qzB" = ( -/obj/structure/rack, -/obj/item/clothing/gloves/color/fyellow, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "qzF" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) "qzN" = ( @@ -57552,19 +61141,21 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/circuit, /area/station/maintenance/hallway/abandoned_recreation) -"qzQ" = ( -/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/turf_decal/stripes/white/line{ - dir = 1 +"qzP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/stairs/west, +/obj/structure/sign/departments/medbay/alt/directional/west, +/turf/open/floor/iron/stairs/medium{ + dir = 4 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/engineering/main) +/area/station/medical/abandoned) "qzY" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/machinery/firealarm/directional/south, +/obj/machinery/button/door/directional/south{ + name = "Privacy Shutters Control"; + id = "hosprivacy" + }, /turf/open/floor/iron/dark, /area/station/security/brig) "qzZ" = ( @@ -57574,18 +61165,6 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) -"qAd" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "qAj" = ( /obj/item/assembly/signaler{ pixel_y = 8 @@ -57605,57 +61184,36 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"qAw" = ( +"qAk" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"qAq" = ( +/obj/structure/reagent_dispensers/watertank, /obj/effect/decal/cleanable/dirt, -/obj/structure/chair/office, -/obj/structure/fluff/paper/stack{ - dir = 5 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) +/turf/open/floor/iron, +/area/station/maintenance/starboard) "qAx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "qAC" = ( -/obj/structure/closet{ - name = "Coldroom Wearcloset" - }, /obj/structure/railing{ dir = 10 }, -/obj/item/clothing/suit/hooded/wintercoat/medical/cmo{ - pixel_x = -5; - pixel_y = 9 - }, -/obj/item/clothing/suit/hooded/wintercoat/medical/viro{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/item/clothing/suit/hooded/wintercoat/medical/chemistry{ - pixel_x = 1; - pixel_y = 3 - }, -/obj/item/clothing/suit/hooded/wintercoat/medical{ - pixel_x = 5 - }, /obj/effect/decal/cleanable/dirt, /obj/structure/lattice/catwalk, -/turf/open/openspace/coldroom, -/area/station/medical/coldroom) +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/turf/open/openspace, +/area/station/maintenance/department/medical) "qAI" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/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{ +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "qAJ" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -57691,22 +61249,6 @@ /obj/structure/cable, /turf/open/floor/wood/large, /area/station/hallway/secondary/service) -"qBj" = ( -/obj/structure/lattice/catwalk, -/obj/item/storage/box/syringes{ - pixel_x = -10; - pixel_y = 4 - }, -/obj/item/storage/box/syringes{ - pixel_x = -10; - pixel_y = -3 - }, -/obj/machinery/airalarm/directional/south, -/obj/machinery/camera/autoname/directional/south{ - c_tag = "Medbay - Upper Medical Storage South" - }, -/turf/open/openspace, -/area/station/medical/storage) "qBm" = ( /obj/structure/disposalpipe/junction/flip, /obj/effect/turf_decal/tile/dark_blue{ @@ -57715,6 +61257,10 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) +"qBr" = ( +/obj/structure/stairs/north, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "qBx" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -57733,6 +61279,12 @@ /obj/structure/table/wood/fancy, /turf/open/openspace, /area/station/maintenance/port/fore) +"qBy" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/power/tracker, +/obj/structure/cable, +/turf/open/space/basic, +/area/station/solars/port/aft) "qBF" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -57742,23 +61294,34 @@ /obj/item/tank/internals/anesthetic, /turf/open/floor/iron/white, /area/station/maintenance/hallway/abandoned_recreation) +"qCc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "space-outpost" + }, +/obj/machinery/door/airlock/external, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "qCe" = ( /obj/structure/chair/comfy/brown{ dir = 4 }, /obj/machinery/firealarm/directional/west, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"qCj" = ( /obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) +/obj/machinery/airalarm/directional/south, +/turf/open/floor/carpet/royalblue, +/area/station/command/heads_quarters/captain/private) +"qCr" = ( +/obj/effect/turf_decal/trimline/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "qCx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -57801,7 +61364,7 @@ }, /obj/effect/landmark/start/cyborg, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "qDe" = ( /obj/structure/disposalpipe/segment{ dir = 2 @@ -57809,35 +61372,16 @@ /turf/open/floor/iron, /area/station/hallway/primary/starboard) "qDh" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 8 +/obj/machinery/camera/autoname/directional/north{ + network = list("ss13","medbay"); + c_tag = "Medbay - Lower North Treatment Center" }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ +/obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/iron/white/textured_large, +/obj/machinery/medical_kiosk, +/turf/open/floor/iron/dark, /area/station/medical/medbay/central) -"qDi" = ( -/obj/effect/landmark/firealarm_sanity, -/turf/open/openspace, -/area/station/commons/dorms) -"qDn" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) "qDM" = ( /obj/structure/chair, /obj/machinery/light/directional/west, @@ -57859,12 +61403,17 @@ /turf/open/floor/iron/dark/textured_large, /area/station/security/prison/safe) "qEj" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) +"qEC" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - Oxygen Supply"; + name = "atmospherics camera" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/medical/chemistry) +/obj/machinery/light/small/directional/north, +/turf/open/floor/engine/o2, +/area/station/engineering/atmos/upper) "qEE" = ( /obj/structure/chair{ dir = 8 @@ -57894,6 +61443,11 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron, /area/station/science/zoo) +"qEN" = ( +/obj/item/radio/intercom/directional/south, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/security/checkpoint/supply) "qEQ" = ( /obj/structure/rack, /obj/item/clothing/suit/jacket/straight_jacket, @@ -57911,29 +61465,40 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"qEZ" = ( -/obj/structure/railing/corner{ - dir = 8 +"qFa" = ( +/obj/machinery/airalarm/directional/south, +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = 6; + pixel_y = 6 }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = 6; + pixel_y = 10 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) -"qFa" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = -6; + pixel_y = 6 }, -/obj/machinery/modular_computer/preset/cargochat/medical, -/turf/open/floor/wood, -/area/station/medical/medbay/central) -"qFj" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = -6; + pixel_y = 10 }, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/wood, -/area/station/medical/medbay/central) +/obj/item/wrench/medical{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/medical/cryo) +"qFk" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/upper) "qFr" = ( /obj/machinery/door/airlock/command{ name = "Teleport Access" @@ -57970,28 +61535,62 @@ "qFO" = ( /turf/open/floor/circuit/green/telecomms/mainframe, /area/station/tcommsat/server) -"qGa" = ( +"qFS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/gravity_generator) +"qFV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /obj/structure/lattice/catwalk, -/obj/structure/sign/warning/radiation/rad_area/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/openspace, -/area/station/hallway/primary/starboard) +/area/station/maintenance/starboard/central/upper) +"qGe" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "qGi" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/carpet/black, /area/station/maintenance/hallway/abandoned_recreation) -"qGv" = ( -/obj/structure/chair/sofa/right/brown{ - dir = 1 +"qGm" = ( +/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/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"qGn" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/table, +/obj/item/chisel{ + pixel_x = 7; + pixel_y = 4 }, /turf/open/floor/wood, -/area/station/commons/dorms) -"qGx" = ( -/obj/structure/chair/pew/left{ - dir = 4 +/area/station/service/library) +"qGr" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/maintenance/starboard/lesser) +/obj/structure/closet/toolcloset, +/turf/open/floor/iron/dark, +/area/station/engineering/storage) +"qGC" = ( +/obj/effect/spawner/random/structure/crate, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "qGF" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -58004,7 +61603,7 @@ "qGG" = ( /obj/structure/cable, /turf/open/floor/iron/smooth_half, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "qGW" = ( /obj/machinery/door/airlock/command{ name = "E.V.A. Storage" @@ -58014,19 +61613,27 @@ /obj/effect/mapping_helpers/airlock/access/all/command/eva, /obj/machinery/door/firedoor, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "qGZ" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ dir = 9 }, /turf/open/space/openspace, /area/space/nearstation) -"qHf" = ( -/turf/closed/wall, -/area/station/maintenance/disposal/incinerator) "qHg" = ( /turf/open/floor/iron/stairs, /area/station/service/library) +"qHk" = ( +/obj/structure/table, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"qHz" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "qHB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58034,23 +61641,11 @@ /obj/effect/baseturf_helper/reinforced_plating/ceiling, /turf/open/floor/plating, /area/station/maintenance/central) -"qHC" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight/lamp{ - pixel_y = 10 - }, -/obj/item/toy/figure/ce{ - pixel_y = 4 - }, -/obj/item/clothing/glasses/meson, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "qHH" = ( -/obj/structure/table/wood, -/obj/item/camera{ - pixel_y = 4 - }, -/turf/open/floor/wood, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/structure/closet/secure_closet/captains, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) "qHJ" = ( /obj/structure/railing{ @@ -58063,48 +61658,90 @@ /obj/effect/turf_decal/tile/brown/full, /turf/open/floor/iron/large, /area/station/maintenance/starboard/central) -"qHN" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"qHP" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight, +/obj/item/storage/toolbox/mechanical, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/item/analyzer, +/obj/item/analyzer, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "qHQ" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 +/obj/machinery/light/directional/east, +/obj/machinery/status_display/supply{ + pixel_x = 32 }, -/obj/machinery/conveyor_switch/oneway{ - id = "cargoload"; - name = "Loading Conveyor"; - pixel_x = -13; - pixel_y = -5 +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/conveyor{ + dir = 1; + id = "cargoload" }, +/obj/effect/turf_decal/stripes/end, /turf/open/floor/iron, /area/station/cargo/storage) -"qHT" = ( +"qHW" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"qHX" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"qHZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"qHZ" = ( -/turf/open/openspace, -/area/station/medical/cryo) -"qIa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair{ - dir = 8; - pixel_y = -2 +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/office/light{ + dir = 4 }, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1 +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/obj/effect/mapping_helpers/mail_sorting/science/ordnance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/cmo) +"qIc" = ( +/obj/structure/table/glass, +/obj/item/book/manual/wiki/surgery{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/clothing/gloves/latex/nitrile, +/obj/item/stack/medical/bone_gel{ + pixel_x = 6; + pixel_y = 12 + }, +/turf/open/floor/iron/dark/textured_half, +/area/station/medical/surgery) +"qIo" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "qIp" = ( -/obj/machinery/porta_turret/ai{ - dir = 4 +/obj/item/kirbyplants/organic/plant9{ + pixel_x = 4 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/turf/open/floor/carpet/black, +/area/station/ai/upload/chamber) "qIz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, @@ -58116,35 +61753,63 @@ /turf/open/openspace, /area/station/maintenance/port/aft) "qII" = ( -/obj/structure/railing/corner{ +/obj/machinery/modular_computer/preset/id{ dir = 4 }, -/obj/structure/lattice/catwalk, -/obj/structure/railing{ +/obj/effect/turf_decal/tile/green/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"qIL" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/broken_flooring/singular/directional/west, +/obj/structure/broken_flooring/singular/always_floorplane/directional, +/obj/structure/broken_flooring/singular, +/obj/item/assembly/mousetrap, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/openspace, -/area/station/hallway/primary/central) -"qJb" = ( -/obj/machinery/disposal/bin, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port) +"qIQ" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 }, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ +/obj/effect/turf_decal/trimline/green/filled/mid_joiner, +/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ + dir = 4 + }, +/turf/open/floor/iron/textured_large, +/area/station/medical/virology) +"qIZ" = ( +/obj/structure/reagent_dispensers/plumbed{ dir = 1 }, -/turf/open/floor/iron, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"qJb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/textured, /area/station/cargo/sorting) "qJf" = ( /turf/open/floor/wood, /area/station/service/lawoffice) -"qJn" = ( -/obj/structure/mirror/directional/north, -/obj/structure/sink/directional/south, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) +"qJk" = ( +/mob/living/basic/axolotl{ + name = "The Lost Axolotl" + }, +/obj/structure/sink/directional/west, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/mirror/broken/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard/upper) "qJo" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 8 @@ -58152,11 +61817,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"qJu" = ( -/obj/machinery/portable_atmospherics/canister, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "qJB" = ( /obj/effect/turf_decal/bot_white/right, /turf/open/floor/iron/dark/textured_large, @@ -58200,16 +61860,20 @@ dir = 9 }, /turf/open/floor/engine/hull/reinforced/air, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qKq" = ( /turf/open/openspace, /area/station/science/zoo) -"qKs" = ( -/obj/machinery/vending/assist, -/obj/machinery/light_switch/directional/east, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) +"qKy" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + 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/floor, +/turf/open/floor/iron/white, +/area/station/medical/office) "qKA" = ( /obj/structure/railing{ dir = 6 @@ -58220,12 +61884,17 @@ /turf/open/floor/engine/hull/air, /area/station/maintenance/port) "qKB" = ( -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "qKC" = ( -/obj/structure/sign/clock/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/obj/structure/lattice/catwalk, +/obj/structure/table/reinforced, +/obj/item/storage/photo_album/qm, +/turf/open/openspace, +/area/station/cargo/storage) "qKG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58243,6 +61912,37 @@ "qKO" = ( /turf/closed/wall, /area/station/maintenance/starboard/central) +"qKP" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/button/door/directional/north{ + id = "MedbayExit"; + name = "Exit Door"; + req_access = list("medical"); + pixel_y = 39; + pixel_x = -6; + normaldoorcontrol = 1 + }, +/obj/machinery/button/door/directional/north{ + id = "MedbayFoyer"; + name = "Entrance Door"; + req_access = list("medical"); + pixel_y = 39; + normaldoorcontrol = 1; + pixel_x = 6 + }, +/obj/machinery/button/door/directional/north{ + id = "medbay-office"; + name = "Medbay Lockdown"; + req_access = list("medical"); + pixel_y = 30 + }, +/turf/open/floor/iron/white, +/area/station/medical/office) "qKR" = ( /obj/structure/flora/bush/ferny/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -58253,7 +61953,7 @@ /area/station/hallway/secondary/entry) "qKS" = ( /obj/structure/dresser, -/turf/open/floor/wood, +/turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) "qKV" = ( /obj/effect/spawner/structure/window/reinforced, @@ -58263,9 +61963,20 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/commons/vacant_room/office) +"qKY" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/west{ + id = "Cabin8"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/wood, +/area/station/commons/dorms) "qLg" = ( /obj/machinery/door/airlock{ - id_tag = "commissarydoor"; + id_tag = "officecommissarydoor"; name = "Vacant Office" }, /obj/effect/turf_decal/tile/green/fourcorners, @@ -58274,16 +61985,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"qLm" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "qLy" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -58310,10 +62011,12 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/wood/large, /area/station/service/theater_dressing) -"qLZ" = ( -/obj/structure/grille, -/turf/open/openspace, -/area/station/maintenance/starboard/fore) +"qLQ" = ( +/obj/item/stack/rods{ + amount = 7 + }, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/aft/upper) "qMe" = ( /obj/effect/decal/cleanable/glitter{ color = "ff8080" @@ -58350,14 +62053,27 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, /area/station/medical/morgue) -"qMC" = ( -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"qMF" = ( +/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/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 5 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "qMI" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -58397,77 +62113,62 @@ }, /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "qNd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "qNe" = ( -/turf/open/floor/carpet, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) "qNf" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) -"qNg" = ( -/obj/structure/stairs/south, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/area/station/ai/satellite/chamber) "qNi" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters{ - id = "qm_cargobay"; - name = "Cargo Bay Shutters" +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/oil/slippery, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/sorting) +"qNo" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 }, +/obj/effect/decal/cleanable/blood/oil, /turf/open/floor/plating, -/area/station/cargo/storage) -"qNn" = ( -/obj/structure/table, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/item/radio{ - desc = "An old handheld radio. You could use it, if you really wanted to."; - icon_state = "radio"; - name = "old radio" +/area/station/maintenance/starboard/upper) +"qNp" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 }, -/obj/structure/sign/poster/contraband/kss13/directional/west, -/turf/open/floor/wood, -/area/station/commons/dorms) -"qNq" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/stack, -/obj/structure/fluff/paper/stack{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "qNw" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 }, /turf/open/floor/wood, /area/station/hallway/primary/central) -"qNy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +"qNG" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/commons/dorms) "qNK" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/canister/air, /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"qNM" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "qNN" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -58476,32 +62177,28 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark, /area/station/security/brig) +"qNP" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "qNV" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/effect/turf_decal/siding/dark{ - dir = 6 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) -"qNW" = ( -/obj/item/trash/ready_donk, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"qNX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"qOv" = ( -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) +"qOj" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "qOw" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -58509,12 +62206,37 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) +"qOC" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/stairs/medium, +/area/station/maintenance/starboard) +"qOE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/aft) +"qOG" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "qOS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, /area/station/hallway/secondary/service) +"qPf" = ( +/obj/item/grapple_gun{ + pixel_x = 2; + pixel_y = 3 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) "qPj" = ( /turf/closed/wall, /area/station/cargo/sorting) @@ -58532,10 +62254,21 @@ /obj/item/stack/sheet/cloth/five, /turf/open/floor/iron, /area/station/maintenance/starboard/central) -"qPw" = ( -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +"qPv" = ( +/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/engineering{ + name = "Tech Storage" + }, +/obj/effect/landmark/navigate_destination/techstorage, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "qPy" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -58548,6 +62281,10 @@ /area/station/service/hydroponics/garden/abandoned) "qPB" = ( /obj/structure/mannequin/skeleton, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/light_switch/directional/east, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) "qPD" = ( @@ -58589,7 +62326,7 @@ /obj/machinery/light/directional/south, /obj/machinery/washing_machine, /turf/open/floor/iron/white/textured_half, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "qQb" = ( /obj/structure/table/wood, /obj/item/newspaper{ @@ -58603,31 +62340,30 @@ "qQd" = ( /turf/closed/wall/r_wall, /area/station/maintenance/central) +"qQe" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "qQf" = ( /obj/effect/turf_decal/siding/blue{ dir = 5 }, -/obj/machinery/computer/station_alert, /obj/structure/railing{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/bridge) -"qQj" = ( -/obj/item/radio/intercom/directional/south, -/obj/structure/closet/crate/trashcart/laundry, -/obj/effect/spawner/random/clothing/costume, -/obj/effect/spawner/random/clothing/backpack, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) -"qQv" = ( -/obj/effect/decal/cleanable/plasma, -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ +/obj/effect/turf_decal/trimline/dark_blue/filled/end{ dir = 4 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "qQx" = ( /obj/structure/reagent_dispensers/wall/peppertank/directional/north, /obj/effect/turf_decal/stripes/end, @@ -58685,16 +62421,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"qRb" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ +"qRg" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible/layer2{ dir = 4 }, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron, -/area/station/engineering/lobby) -"qRp" = ( -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/pumproom) +"qRq" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "qRs" = ( /obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58713,53 +62454,31 @@ }, /turf/open/floor/wood/large, /area/station/service/library) -"qRL" = ( -/obj/effect/turf_decal/siding, -/obj/effect/turf_decal/trimline/white/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) "qSd" = ( /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, /area/station/hallway/secondary/entry) "qSf" = ( /turf/closed/wall, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"qSj" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 5 + }, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "qSk" = ( /turf/closed/wall, /area/station/maintenance/department/science/central) -"qSs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/trunk/multiz/down{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/commons/dorms) "qSv" = ( /obj/structure/table/wood/poker, -/obj/item/flashlight/lamp/green{ - pixel_x = -8; - pixel_y = 14 - }, /obj/item/clothing/head/fedora/white, -/turf/open/floor/wood, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) "qSy" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -58776,13 +62495,6 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"qSD" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) "qSG" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/machinery/atmospherics/components/trinary/mixer/flipped{ @@ -58791,11 +62503,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark/textured_edge, /area/station/science/ordnance/storage) -"qSP" = ( -/obj/machinery/vending/coffee, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "qST" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -58805,6 +62512,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"qTa" = ( +/obj/machinery/rnd/production/circuit_imprinter, +/turf/open/floor/iron/dark/smooth_large, +/area/station/engineering/storage) "qTb" = ( /obj/effect/turf_decal/tile/purple/opposingcorners{ dir = 1 @@ -58816,10 +62527,6 @@ /obj/structure/stairs/north, /turf/open/floor/iron/stairs/medium, /area/station/medical/virology) -"qTk" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/iron/dark, -/area/station/engineering/lobby) "qTl" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -58827,21 +62534,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/dark, /area/station/science/lobby) -"qTm" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/lesser) -"qTt" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/camera/autoname/directional/south, -/obj/structure/closet/secure_closet/security/engine, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/engineering) "qTy" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -58849,9 +62541,14 @@ "qTG" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/ferny/style_random, -/obj/effect/landmark/start/hangover, /turf/open/floor/grass, /area/station/hallway/primary/central) +"qTT" = ( +/obj/machinery/door/airlock/public/glass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured, +/area/station/commons/locker) "qTX" = ( /obj/structure/lattice/catwalk, /obj/machinery/computer/security{ @@ -58859,6 +62556,12 @@ }, /turf/open/openspace, /area/station/security/checkpoint/customs) +"qTZ" = ( +/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/station/maintenance/starboard) "qUa" = ( /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /obj/effect/decal/cleanable/dirt, @@ -58868,11 +62571,11 @@ /obj/structure/plasticflaps/kitchen, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"qUq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/mop_bucket, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) +"qUo" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/obj/effect/spawner/random/engineering/toolbox, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "qUt" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/chair/office, @@ -58900,26 +62603,39 @@ }, /turf/open/floor/grass, /area/station/science/genetics) +"qUD" = ( +/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 = 2 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/edge{ + dir = 1 + }, +/area/station/hallway/primary/central) "qUG" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/central) +"qUQ" = ( +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/iron/textured_large, +/area/station/medical/abandoned) "qUW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, /obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"qVd" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/commons/dorms) +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "qVj" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/machinery/power/apc/auto_name/directional/south, @@ -58952,6 +62668,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/tile, /area/station/security/detectives_office/private_investigators_office) +"qVv" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "qVz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58973,6 +62693,11 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/engineering/storage_shared) +"qVE" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "qVJ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -58985,8 +62710,24 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "qVO" = ( -/turf/closed/wall, +/turf/closed/wall/r_wall, /area/station/command/bridge) +"qVU" = ( +/obj/machinery/camera/autoname/directional/west, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos) +"qVY" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "qWb" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /obj/machinery/camera/autoname/directional/west, @@ -59027,34 +62768,20 @@ }, /obj/machinery/status_display/evac/directional/north, /turf/open/openspace, -/area/station/command/bridge) -"qWv" = ( -/obj/structure/table/wood/poker, -/obj/item/toy/cards/deck{ - pixel_y = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +/area/station/command/meeting_room/council) +"qWr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "qWy" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white/textured, -/area/station/medical/surgery) -"qWF" = ( -/obj/structure/chair/stool/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 1 }, -/obj/effect/landmark/start/hangover, -/obj/effect/landmark/navigate_destination/tools, -/turf/open/floor/iron, -/area/station/commons/storage/primary) +/obj/machinery/iv_drip, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "qWV" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line{ @@ -59071,27 +62798,38 @@ /obj/structure/cable, /turf/open/floor/wood/large, /area/station/medical/psychology) -"qXj" = ( +"qXc" = ( +/obj/machinery/medical_kiosk, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/medbay/lobby) +"qXh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/obj/machinery/duct, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/iron, +/area/station/commons/dorms) "qXl" = ( /obj/effect/turf_decal/siding/blue{ dir = 1 }, -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/camera/autoname/directional/north, +/obj/machinery/status_display/ai/directional/north, /turf/open/openspace, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "qXo" = ( /obj/machinery/status_display/ai/directional/north, /obj/structure/chair/sofa/corp/left, /turf/open/floor/carpet/executive, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "qXr" = ( /obj/structure/sign/departments/telecomms/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -59100,22 +62838,7 @@ /turf/open/floor/iron/smooth_edge{ dir = 4 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"qXx" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Mix to Gas" - }, -/obj/effect/turf_decal/trimline/yellow, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"qXH" = ( -/obj/structure/cable, -/obj/effect/landmark/start/depsec/engineering, -/obj/structure/chair/office{ - dir = 3 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/engineering) +/area/station/ai/satellite/foyer) "qXI" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -59141,6 +62864,12 @@ dir = 8 }, /area/station/service/chapel) +"qYb" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "qYi" = ( /obj/machinery/portable_atmospherics/scrubber/huge, /obj/effect/turf_decal/bot, @@ -59155,6 +62884,7 @@ /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/south, +/obj/item/wrench, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) "qYk" = ( @@ -59163,7 +62893,7 @@ /obj/effect/mapping_helpers/burnt_floor, /obj/item/radio/intercom/directional/east, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "qYn" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -59177,18 +62907,23 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/security/brig) -"qYs" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, +"qYr" = ( +/obj/effect/spawner/random/trash/bin, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/engineering/storage_shared) "qYB" = ( /obj/structure/chair/greyscale{ dir = 1 }, /turf/open/floor/glass/reinforced, /area/station/hallway/secondary/construction) +"qYK" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/stack{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "qYM" = ( /obj/item/kirbyplants/random, /obj/machinery/light/directional/east, @@ -59202,8 +62937,24 @@ /obj/item/sticker/googly, /obj/item/sticker/clown, /obj/item/sticker/pslime, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/station/maintenance/port/aft) +"qYP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/engineering{ + name = "Engine Room" + }, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmosengimainttriangle" + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/main) "qYU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59225,27 +62976,19 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/station/science/genetics) -"qYY" = ( -/obj/machinery/airalarm/directional/south, -/obj/structure/reagent_dispensers/fueltank/large, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"qZv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"qZB" = ( -/obj/machinery/door/airlock{ - name = "Commentator Stand Access" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 +"qZx" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 8 }, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/department/crew_quarters/dorms) +"qZy" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "qZH" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -59263,14 +63006,7 @@ "qZQ" = ( /obj/machinery/flasher/directional/north, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai_upload) -"qZW" = ( -/obj/item/clothing/head/cone{ - pixel_x = -5; - pixel_y = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/ai/upload/chamber) "qZX" = ( /obj/machinery/door/airlock/security{ name = "Armory" @@ -59280,7 +63016,18 @@ /obj/effect/turf_decal/tile/red/fourcorners, /obj/effect/mapping_helpers/airlock/access/all/security/armory, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) +"qZY" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/security_all, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "qZZ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -59291,18 +63038,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"raa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) -"rad" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/mix_output{ - dir = 4 - }, -/turf/open/floor/engine/vacuum, -/area/station/maintenance/disposal/incinerator) "rah" = ( /obj/structure/rack, /obj/item/reagent_containers/cup/bottle/iron{ @@ -59320,7 +63055,13 @@ c_tag = "Medbay - Lower Chemistry Storage" }, /turf/open/floor/iron/dark/smooth_large, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) +"rai" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/duct, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "ran" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -59344,13 +63085,21 @@ }, /turf/open/floor/glass, /area/station/security/brig) +"raE" = ( +/obj/structure/tank_dispenser{ + pixel_x = -1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "raF" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 +/obj/effect/turf_decal/trimline/brown/arrow_ccw{ + dir = 1 }, -/obj/machinery/computer/order_console/mining, +/obj/effect/turf_decal/trimline/brown/arrow_cw, /turf/open/floor/iron, -/area/station/cargo/miningoffice) +/area/station/cargo/storage) "raN" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59391,13 +63140,42 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/engine, /area/station/service/hydroponics) +"raU" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) "rba" = ( /obj/structure/spider/stickyweb, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"rbl" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/upper) +"rbt" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/textured, +/area/station/command/eva) "rbx" = ( /obj/machinery/newscaster/directional/west, -/turf/open/floor/iron/dark/textured_large, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/blue, +/turf/open/floor/iron/white, /area/station/medical/medbay/central) "rbE" = ( /obj/effect/decal/cleanable/dirt, @@ -59408,27 +63186,9 @@ /turf/open/floor/iron, /area/station/security/prison/mess) "rbF" = ( -/obj/effect/turf_decal/siding/yellow{ - dir = 9 - }, -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty{ - pixel_x = 5 - }, -/obj/item/stack/rods{ - amount = 25; - pixel_x = 2 - }, -/obj/item/stack/rods{ - amount = 25; - pixel_y = 4 - }, -/obj/structure/railing{ - dir = 9 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, /turf/open/floor/iron/dark, /area/station/medical/chemistry) @@ -59447,27 +63207,39 @@ }, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"rce" = ( -/obj/item/clothing/head/cone{ - pixel_x = 6; - pixel_y = -9 - }, +"rcc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/tank_holder, +/obj/machinery/airalarm/directional/east, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/fore/upper) +"rci" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/atmos_control/nocontrol/incinerator, +/obj/machinery/light/directional/north, +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "rcl" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/station/engineering/storage_shared) -"rcs" = ( -/obj/structure/table, -/obj/effect/spawner/random/maintenance/two, -/obj/structure/sign/poster/contraband/space_up/directional/east, -/obj/structure/sign/poster/contraband/ambrosia_vulgaris/directional/south, -/turf/open/floor/eighties, -/area/station/maintenance/starboard/fore) "rct" = ( /turf/closed/wall, /area/station/engineering/storage) +"rcA" = ( +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 2; + name = "Chamber to Mix" + }, +/obj/effect/turf_decal/trimline/purple, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "rcF" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -59479,21 +63251,7 @@ /area/station/cargo/storage) "rcG" = ( /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) -"rcM" = ( -/obj/machinery/door/airlock/command{ - name = "Chief Medical Officer's Office" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/medical/cmo, -/obj/machinery/door/firedoor, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/area/station/ai/satellite/chamber) "rdb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59504,6 +63262,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/medbay/central) +"rdh" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "rdk" = ( /obj/structure/table, /obj/item/food/chocolatebar{ @@ -59518,10 +63283,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"rdl" = ( -/obj/effect/spawner/random/trash/grille_or_waste, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "rdm" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -59550,32 +63311,22 @@ /area/station/hallway/primary/central) "rdx" = ( /obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) -"rdN" = ( -/obj/machinery/door/airlock{ - name = "Emergency Storage" +/turf/open/floor/iron/edge{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/area/station/hallway/primary/central) +"rdz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"rdV" = ( -/obj/machinery/door/airlock/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"rea" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Virology Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/all/medical/virology, -/turf/open/floor/plating, -/area/station/maintenance/port) +/area/station/maintenance/aft) +"rdW" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/dorms) "rec" = ( /obj/machinery/light/small/directional/west, /obj/structure/chair/comfy/beige{ @@ -59584,6 +63335,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/station/service/cafeteria) +"reg" = ( +/obj/structure/sign/departments/chemistry/pharmacy/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "reh" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -59598,17 +63353,24 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"req" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "rey" = ( /obj/structure/lattice/catwalk, /obj/machinery/camera/autoname/directional/north, /turf/open/openspace, /area/station/hallway/secondary/construction) +"reI" = ( +/obj/structure/table, +/obj/item/wirecutters, +/obj/item/screwdriver{ + pixel_y = 12 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/item/stack/cable_coil, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "reN" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59616,6 +63378,16 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"reW" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/effect/turf_decal/tile/dark_green/half/contrasted, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "rfc" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/dark{ @@ -59635,7 +63407,15 @@ dir = 1 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"rfk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "rfr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/west, @@ -59652,32 +63432,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"rfE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/lattice/catwalk, -/turf/open/water, -/area/station/maintenance/starboard/fore) "rfI" = ( /obj/item/tank/internals/oxygen/yellow, /turf/open/floor/engine/hull, /area/space/nearstation) +"rfL" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/siding/blue/end{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/floor/iron/showroomfloor, +/area/station/medical/medbay/central) "rfU" = ( /obj/machinery/light/directional/west, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 8 + }, /area/station/hallway/primary/central) -"rfZ" = ( -/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_large, -/area/station/medical/medbay/central) -"rga" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "rgb" = ( /obj/machinery/vending/cigarette/beach, /turf/open/floor/iron/dark/smooth_large, @@ -59695,34 +63470,39 @@ /turf/open/floor/iron/dark, /area/station/security/interrogation) "rgj" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 16 - }, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = 1; - pixel_y = 6 +/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 = 9 }, -/turf/open/floor/carpet, -/area/station/command/meeting_room/council) +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"rgq" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"rgL" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "rhx" = ( -/obj/effect/turf_decal/tile/blue/half/contrasted, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ +/obj/effect/turf_decal/siding/dark_blue{ dir = 1 }, -/turf/open/floor/iron/white/textured, -/area/station/medical/surgery) +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, +/obj/machinery/light/floor, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "rhz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/plasma, /obj/effect/spawner/random/maintenance, /turf/open/floor/iron, /area/station/construction/storage_wing) -"rhD" = ( -/obj/machinery/holopad, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "rhE" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -59751,29 +63531,28 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"rhM" = ( -/obj/effect/turf_decal/trimline/white/corner{ +"rhP" = ( +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"rhT" = ( +/obj/effect/spawner/random/structure/crate, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/aft) "rih" = ( /turf/open/floor/plating, /area/station/maintenance/central) -"riv" = ( -/obj/item/trash/shok_roks/berry, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) +"riB" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/siding/yellow, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "riD" = ( /turf/closed/wall, /area/station/maintenance/port) @@ -59787,11 +63566,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/large, /area/station/service/library) -"riI" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/light/directional/north, -/turf/open/openspace, -/area/station/engineering/break_room) +"riN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Cargo Bay Shutters"; + id = "qm_cargobay"; + dir = 8; + pixel_y = 1 + }, +/turf/open/floor/plating, +/area/station/cargo/storage) "riR" = ( /obj/structure/railing{ dir = 6 @@ -59813,11 +63597,8 @@ /obj/effect/mapping_helpers/airlock/access/any/science/ordnance, /obj/machinery/button/ignition/incinerator/ordmix{ pixel_x = 24; - pixel_y = -6 - }, -/obj/machinery/button/door/incinerator_vent_ordmix{ - pixel_x = 24; - pixel_y = 8 + pixel_y = -6; + dir = 4 }, /obj/machinery/airlock_controller/incinerator_ordmix{ pixel_x = -22 @@ -59845,6 +63626,14 @@ }, /turf/open/floor/carpet, /area/station/command/corporate_showroom) +"rjc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/turf/open/floor/iron, +/area/station/commons/dorms) "rjd" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/tile/red/opposingcorners, @@ -59861,6 +63650,15 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"rjI" = ( +/obj/machinery/button/door/directional/south{ + id = "cmoprivacy"; + name = "CMO Privacy Shutters"; + req_access = list("cmo"); + pixel_y = -7 + }, +/turf/closed/wall, +/area/station/command/heads_quarters/cmo) "rjJ" = ( /obj/effect/turf_decal/siding/dark{ dir = 1 @@ -59868,7 +63666,14 @@ /obj/effect/turf_decal/siding/dark, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"rjM" = ( +/obj/structure/reagent_dispensers/fueltank/large, +/obj/effect/turf_decal/bot, +/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/upper) "rjO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/full, @@ -59884,12 +63689,6 @@ /obj/structure/table, /turf/open/floor/wood, /area/station/service/library) -"rkf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/south, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "rki" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/engine, @@ -59900,6 +63699,18 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/cafeteria, /area/station/maintenance/port) +"rky" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"rkA" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vatgrower, +/turf/open/floor/engine, +/area/station/maintenance/starboard) "rkB" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -59910,6 +63721,19 @@ /obj/structure/chair/stool/bar/directional/east, /turf/open/floor/carpet/orange, /area/station/commons/lounge) +"rkE" = ( +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/white/line, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "rkF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/item/radio/intercom/directional/west, @@ -59972,7 +63796,8 @@ /area/station/maintenance/port/greater) "rla" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/plating, /area/station/maintenance/central) "rlq" = ( @@ -59981,6 +63806,23 @@ /obj/structure/cable, /turf/open/floor/grass, /area/station/hallway/secondary/entry) +"rls" = ( +/obj/effect/turf_decal/siding/brown{ + dir = 4 + }, +/obj/machinery/disposal/bin/tagger, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_green/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "rlu" = ( /obj/machinery/chem_master, /turf/open/floor/iron/dark/textured, @@ -59992,10 +63834,25 @@ /obj/effect/landmark/start/librarian, /turf/open/floor/carpet/black, /area/station/service/library/private) +"rlB" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/stairs/medium{ + dir = 4 + }, +/area/station/medical/abandoned) "rlE" = ( /obj/structure/hedge, /turf/open/floor/glass/reinforced, /area/station/service/library) +"rlF" = ( +/obj/machinery/power/turbine/inlet_compressor{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/upper) "rlR" = ( /obj/item/storage/box/snappops{ pixel_x = 6; @@ -60032,9 +63889,21 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) +"rmb" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "rmg" = ( /obj/structure/stairs/north, -/obj/machinery/airalarm/directional/east, /obj/machinery/light/directional/east, /turf/open/floor/iron/stairs/medium, /area/station/command/heads_quarters/hop) @@ -60043,23 +63912,14 @@ /turf/open/floor/iron/smooth, /area/station/science/robotics) "rms" = ( -/obj/machinery/computer/crew{ - dir = 1 - }, -/obj/machinery/requests_console/directional/east{ - department = "Bridge"; - name = "Bridge Requests Console"; - pixel_x = -32 - }, -/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/opposingcorners{ - dir = 1 - }, /obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "rmw" = ( /obj/machinery/door/airlock/public/glass{ name = "Public Zoo" @@ -60072,7 +63932,7 @@ /obj/structure/lattice/catwalk, /obj/machinery/status_display/evac/directional/east, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "rmB" = ( /obj/machinery/power/shieldwallgen, /obj/effect/turf_decal/stripes/line{ @@ -60082,21 +63942,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/wood, /area/station/command/teleporter) -"rmC" = ( -/obj/item/melee/flyswatter{ - pixel_x = -2 - }, -/obj/item/toy/plush/lizard_plushie/green{ - name = "Steals-The-Cheese"; - pixel_x = 8; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/dark_green/opposingcorners, -/obj/effect/turf_decal/tile/green/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/fore) "rmM" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -60108,6 +63953,13 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) +"rmN" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "rmO" = ( /obj/effect/turf_decal/siding/dark/corner, /obj/effect/turf_decal/trimline/dark_blue/filled/line{ @@ -60124,7 +63976,7 @@ }, /obj/effect/landmark/start/cyborg, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "rmS" = ( /obj/structure/railing{ dir = 8 @@ -60138,58 +63990,67 @@ }, /turf/open/floor/iron, /area/station/science/research) -"rmV" = ( -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/structure/urinal/directional/west, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) "rnd" = ( /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/large, +/turf/open/floor/iron/edge, /area/station/hallway/primary/central) -"rnh" = ( -/obj/machinery/power/smes{ - charge = 5e+006 +"rnB" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2{ + dir = 8 }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"rnK" = ( /obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"rnp" = ( -/obj/structure/sign/directions/dorms{ - dir = 1; - pixel_y = 4 +/obj/effect/landmark/start/hangover, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 }, -/turf/closed/wall, -/area/station/maintenance/starboard/fore) -"rnC" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/effect/landmark/start/hangover/closet, /turf/open/floor/iron, -/area/station/hallway/primary/starboard) +/area/station/commons/fitness/recreation) +"rnN" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/vending/wardrobe/engi_wardrobe, +/obj/machinery/light/directional/north, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "rnP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/clothing/gloves/color/blue{ - desc = "An old pair of nitrile gloves, with no sterile properties."; - name = "old nitrile gloves" +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 4 }, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) +/obj/item/pen/blue{ + pixel_x = -1; + pixel_y = 5 + }, +/obj/item/pen/red{ + pixel_x = -6 + }, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/wood/large, +/area/station/medical/break_room) "rnQ" = ( /obj/structure/ladder, /obj/structure/railing, /obj/effect/decal/cleanable/dirt, /obj/structure/lattice/catwalk, -/turf/open/openspace/coldroom, -/area/station/medical/coldroom) -"rnR" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/turf/open/openspace, +/area/station/maintenance/department/medical) +"rnV" = ( +/obj/effect/landmark/start/hangover, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "rnX" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -60200,16 +64061,32 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/dark, /area/station/engineering/storage) -"roj" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "roq" = ( /obj/effect/spawner/random/medical/patient_stretcher, /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"ror" = ( +/obj/structure/table, +/obj/item/paper_bin/carbon{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/item/book/manual/wiki/tcomms{ + pixel_x = 14; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/computer/security/telescreen/tcomms/directional/south{ + name = "Telecomms Camera Monitor" + }, +/obj/item/pen, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "rot" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -60227,16 +64104,10 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "roy" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"roB" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/firealarm/directional/east, -/turf/open/openspace, -/area/station/engineering/break_room) +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "roG" = ( /obj/machinery/mech_bay_recharge_port{ dir = 2 @@ -60256,6 +64127,16 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) +"roM" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/yellow/mid_joiner, +/obj/effect/turf_decal/trimline/yellow/mid_joiner{ + dir = 4 + }, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "roP" = ( /obj/structure/stairs/north, /obj/structure/railing{ @@ -60264,22 +64145,28 @@ /turf/open/floor/iron, /area/station/science/breakroom) "roY" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/directions/engineering/directional/north{ - dir = 4; - pixel_y = 38 - }, -/obj/structure/sign/directions/engineering/directional/north{ - dir = 4 +/obj/effect/turf_decal/trimline/brown/filled/warning, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/iron, +/area/station/cargo/storage) +"rpd" = ( +/obj/structure/cable, +/obj/structure/sign/poster/contraband/soviet_propaganda/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) +"rpj" = ( +/obj/item/toy/plush/lizard_plushie/green{ + name = "Swats-The-Moths"; + pixel_y = -10 }, -/obj/structure/sign/directions/engineering/directional/north{ - dir = 4; - pixel_y = 26 +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/dark_green/opposingcorners, +/obj/effect/turf_decal/tile/green/opposingcorners{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/fore) "rpn" = ( /obj/structure/railing{ dir = 8 @@ -60293,11 +64180,20 @@ }, /turf/open/floor/iron, /area/station/science/research) -"rps" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) +"rpq" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"rpz" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) "rpB" = ( /turf/closed/wall/r_wall, /area/station/command/corporate_showroom) @@ -60307,7 +64203,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "rpI" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 @@ -60317,14 +64213,7 @@ }, /obj/machinery/washing_machine, /turf/open/floor/iron/white/textured_half, -/area/station/ai_monitored/turret_protected/aisat_interior) -"rpL" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 1 - }, -/obj/effect/turf_decal/siding/brown/corner, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) +/area/station/ai/satellite/interior) "rpU" = ( /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) @@ -60347,12 +64236,6 @@ /obj/machinery/light/very_dim/directional/north, /turf/open/floor/plating, /area/station/maintenance/disposal) -"rqm" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) "rqn" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -60362,15 +64245,17 @@ }, /turf/open/floor/iron, /area/station/science/lobby) -"rqo" = ( -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/project) "rqq" = ( /obj/structure/table/wood, /obj/item/storage/photo_album/chapel, /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/chapel, /area/station/service/chapel) +"rqs" = ( +/obj/effect/turf_decal/trimline/yellow/warning, +/obj/effect/turf_decal/trimline/yellow/mid_joiner, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "rqM" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -60424,11 +64309,6 @@ }, /turf/open/floor/wood, /area/station/security/courtroom) -"rro" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/turf/open/openspace, -/area/station/hallway/primary/central) "rrp" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -60449,30 +64329,25 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"rrz" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/item/kirbyplants/random/fullysynthetic, -/turf/open/floor/iron/smooth, -/area/station/engineering/main) +"rrE" = ( +/obj/structure/lattice/catwalk, +/obj/effect/landmark/firealarm_sanity, +/turf/open/openspace, +/area/station/cargo/storage) "rrF" = ( /obj/structure/table, /obj/item/stack/cable_coil, /obj/item/stack/cable_coil, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) -"rrY" = ( +"rrI" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/effect/decal/cleanable/dirt, -/obj/structure/chair{ - dir = 1; - pixel_y = -2 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "rsb" = ( /obj/structure/disposalpipe/segment{ dir = 2 @@ -60483,12 +64358,19 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/wood, /area/station/command/corporate_showroom) -"rsn" = ( -/obj/machinery/vatgrower, -/obj/effect/turf_decal/trimline/green/filled/line, +"rsm" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) +/obj/structure/closet/crate, +/obj/item/reagent_containers/cup/glass/bottle/vermouth{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/glass/bottle/ale, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + pixel_x = 6 + }, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard) "rsH" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/disposal/bin, @@ -60497,26 +64379,28 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/central) -"rsU" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/medical_kiosk, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +"rsJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/effect/turf_decal/siding/blue{ + dir = 8 }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"rtb" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/conveyor{ - dir = 8; - id = "mining" +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/catwalk_floor{ + initial_gas_mix = "n2=100;TEMP=80" }, -/obj/structure/railing{ - dir = 1 +/area/station/science/server) +"rsU" = ( +/obj/machinery/wall_healer/directional/north, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/medbay/lobby) +"rtb" = ( /obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/brown/filled/line, /turf/open/floor/iron, -/area/station/cargo/miningoffice) +/area/station/cargo/storage) "rtd" = ( /obj/effect/turf_decal/tile/blue/full, /obj/structure/table/reinforced, @@ -60543,14 +64427,44 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"rtm" = ( +/obj/item/banner/cargo/mundane{ + pixel_y = 27 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "body"; + name = "body"; + pixel_y = 10 + }, +/obj/item/ammo_casing/spent{ + pixel_x = -8; + pixel_y = -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, +/area/station/maintenance/starboard/central/upper) "rto" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/item/toy/figure/cmo{ - pixel_y = 10; - pixel_x = -1 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) +"rtr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/obj/structure/railing/corner/end{ + dir = 1 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"rtv" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "rtx" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -60562,6 +64476,11 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) +"rtz" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "rtD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60573,6 +64492,11 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/hallway/secondary/entry) +"rtL" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/gravity_generator) "rtO" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -60581,12 +64505,35 @@ /turf/open/openspace, /area/station/medical/virology) "ruc" = ( -/obj/effect/turf_decal/siding/green/corner{ +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/siding/green{ dir = 8 }, -/obj/machinery/vending/coffee, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) +"rue" = ( +/obj/item/statuebust, +/obj/machinery/light/cold/no_nightlight/directional/west, +/turf/open/floor/iron/vaporwave, +/area/station/maintenance/starboard/aft/upper) +"ruf" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/yellow/filled/warning/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"rul" = ( +/obj/machinery/light/floor, +/turf/open/floor/engine/hull/air, +/area/station/engineering/supermatter/room/upper) +"rum" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos) "ruq" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 @@ -60598,41 +64545,75 @@ }, /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) +"ruA" = ( +/obj/machinery/light/small/dim/directional/north, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/port/fore) "ruD" = ( -/obj/item/kirbyplants, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, +/obj/structure/reagent_dispensers/plumbed/storage, /turf/open/floor/iron/dark, /area/station/medical/chemistry) "ruE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/cigbutt, -/turf/open/floor/iron, -/area/station/maintenance/starboard/central) +/obj/structure/table/wood/fancy/orange, +/obj/item/reagent_containers/cup/glass/bottle/whiskey{ + pixel_x = -5; + pixel_y = 18 + }, +/obj/item/food/fortunecookie{ + pixel_x = 10; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/qm) +"ruF" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "ruJ" = ( /obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/departments/medbay/alt/directional/east, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) "ruK" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Abandoned Hallway" - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ +/obj/machinery/light/directional/east, +/turf/open/floor/iron/edge{ dir = 4 }, -/obj/machinery/door/firedoor, +/area/station/hallway/primary/central) +"ruR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /turf/open/floor/iron, -/area/station/hallway/secondary/construction) +/area/station/hallway/primary/port) "ruS" = ( /obj/effect/mob_spawn/corpse/human/skeleton, /obj/item/mod/module/springlock, /obj/effect/decal/cleanable/blood, /turf/open/floor/iron/checker, /area/station/maintenance/hallway/abandoned_recreation) +"ruZ" = ( +/obj/effect/spawner/random/structure/crate_loot, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) "rvk" = ( /obj/structure/table/wood, /obj/item/book/bible, @@ -60648,6 +64629,23 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) +"rvo" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/item/folder/yellow{ + pixel_x = 4 + }, +/obj/item/paper/guides/jobs/engi/gravity_gen, +/obj/item/phone{ + pixel_y = -9; + pixel_x = -3 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "rvs" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/wood{ @@ -60664,7 +64662,6 @@ }, /obj/item/cigbutt, /obj/effect/mapping_helpers/broken_floor, -/obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/station/maintenance/starboard/central) "rvu" = ( @@ -60677,6 +64674,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) +"rvv" = ( +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) +"rvz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/cigbutt{ + pixel_x = -12; + pixel_y = 11 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/aft/upper) "rvB" = ( /obj/machinery/computer/pod/old/mass_driver_controller/chapelgun{ pixel_x = -24 @@ -60688,23 +64697,23 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) -"rvH" = ( +"rvT" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"rvX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"rvR" = ( -/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/yellow/filled/line{ - dir = 6 +/obj/effect/turf_decal/stripes{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "rvY" = ( /obj/structure/table/reinforced, /obj/item/storage/box/gloves{ @@ -60715,42 +64724,43 @@ /turf/open/floor/iron/dark, /area/station/service/chapel/office) "rwd" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "packageSort2" - }, -/obj/effect/turf_decal/trimline/brown/filled, -/obj/structure/railing/corner/end{ +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) +"rwf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/sorting) +/obj/structure/cable, +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "rwh" = ( /turf/closed/wall/r_wall, /area/station/security/medical) -"rwG" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Dock" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "miningshuttleexit" +"rwn" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"rwJ" = ( -/obj/structure/railing/corner/end/flip{ +/obj/effect/turf_decal/stripes/red/line{ dir = 8 }, -/obj/structure/railing/corner/end{ - dir = 4 +/obj/structure/sign/warning/radiation/rad_area/directional/north, +/obj/machinery/light/small/directional/west, +/turf/open/floor/engine, +/area/station/engineering/supermatter) +"rwJ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "rwO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -60764,7 +64774,7 @@ dir = 10 }, /obj/effect/baseturf_helper/reinforced_plating/ceiling, -/turf/open/floor/carpet, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "rwU" = ( /obj/effect/mapping_helpers/airlock/access/all/service/general, @@ -60774,25 +64784,42 @@ /obj/machinery/door/airlock/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"rwV" = ( +/obj/machinery/computer/atmos_control/carbon_tank, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "rwW" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/grass, /area/station/hallway/primary/starboard) "rxc" = ( -/obj/structure/table, -/obj/machinery/fax{ - fax_name = "Quartermaster's Office"; - name = "Quartermaster's Fax Machine" - }, +/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/command/heads_quarters/qm) +/area/station/cargo/storage) "rxd" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "rxk" = ( -/obj/machinery/holopad, -/turf/open/floor/iron, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/trimline/dark_red/filled/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_red/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, /area/station/cargo/storage) "rxo" = ( /obj/structure/lattice/catwalk, @@ -60803,17 +64830,43 @@ /turf/open/openspace, /area/station/commons/fitness/recreation) "rxx" = ( -/obj/structure/table, /obj/effect/turf_decal/trimline/blue/filled/line, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/item/folder/white{ - pixel_x = -1; - pixel_y = 3 - }, /obj/machinery/light/directional/south, -/obj/structure/extinguisher_cabinet/directional/south, +/obj/structure/table, +/obj/item/screwdriver{ + pixel_x = 1; + pixel_y = -2 + }, +/obj/item/grenade/chem_grenade{ + pixel_y = 11 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = 3; + pixel_y = 11 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = 8; + pixel_y = 11 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = 11; + pixel_y = 11 + }, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/obj/item/clothing/glasses/science{ + pixel_x = -2; + pixel_y = 7 + }, +/obj/machinery/newscaster/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) +"rxy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/dresser, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "rxH" = ( /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -60825,22 +64878,22 @@ }, /turf/open/floor/iron/kitchen, /area/station/hallway/secondary/service) -"rxM" = ( +"rxS" = ( /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" - }, -/obj/structure/mirror/directional/west, -/obj/effect/decal/cleanable/cobweb, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) +"rxW" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard) "rya" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/aft) "ryb" = ( @@ -60875,11 +64928,22 @@ name = "Garbage Closet" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) +"rzf" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 4; + initialize_directions = 4 + }, +/obj/effect/turf_decal/bot_red, +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/airalarm/directional/west, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "rzm" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 @@ -60905,6 +64969,17 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/medical/virology) +"rzu" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/station/maintenance/aft/upper) +"rzH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "rzK" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/ferny/style_random, @@ -60931,7 +65006,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "rAc" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable, @@ -60957,27 +65032,22 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) -"rAH" = ( -/obj/structure/lattice/catwalk, -/obj/effect/landmark/start/hangover, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) "rAK" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/flora/rock/pile/jungle/style_3, /turf/open/floor/grass, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "rAL" = ( -/obj/structure/table/glass, -/turf/open/floor/carpet, -/area/station/command/bridge) -"rAT" = ( -/obj/structure/lattice/catwalk, -/obj/structure/grille, -/turf/open/space/openspace, -/area/space/nearstation) +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L1" + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "rAV" = ( /obj/machinery/holopad, /obj/machinery/status_display/evac/directional/north, @@ -60986,21 +65056,9 @@ /turf/open/floor/carpet, /area/station/hallway/secondary/exit/departure_lounge) "rBd" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/openspace, -/area/station/medical/storage) -"rBh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine/hull/air, +/area/station/medical/medbay/central) "rBm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61013,75 +65071,27 @@ }, /turf/open/floor/wood/large, /area/station/service/library) -"rBo" = ( -/obj/item/trash/can{ - pixel_x = -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/plating, -/area/station/maintenance/starboard/fore) "rBs" = ( /obj/structure/table, /obj/structure/closet/mini_fridge/grimy, /obj/structure/window/spawner/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"rBB" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/space_heater, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "rBE" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 1 - }, -/obj/machinery/status_display/ai/directional/north, -/turf/open/openspace, -/area/station/command/bridge) -"rBF" = ( -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 +/obj/machinery/door/poddoor/preopen{ + id = "hop"; + name = "Privacy Shutters" }, -/obj/machinery/door/airlock/engineering, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/engineering/break_room) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/command/heads_quarters/hop) "rBI" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/decal/cleanable/confetti, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/carpet/black, /area/station/maintenance/hallway/abandoned_recreation) -"rBO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) -"rBP" = ( -/obj/item/bikehorn/rubberducky, -/obj/machinery/duct, -/obj/structure/cable, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) "rBQ" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/vacuum, @@ -61116,6 +65126,16 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) +"rCh" = ( +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "rCp" = ( /obj/structure/table, /obj/item/food/cheese/firm_cheese_slice{ @@ -61139,43 +65159,33 @@ /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) "rCF" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/disposal/bin, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/bot, /obj/machinery/camera/autoname/directional/south, -/obj/structure/disposalpipe/trunk{ - dir = 8 +/obj/machinery/conveyor{ + dir = 8; + id = "mining" }, +/obj/machinery/bouldertech/refinery/smelter, /turf/open/floor/iron/textured, /area/station/cargo/storage) -"rCO" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "rCP" = ( /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "rCQ" = ( -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/structure/rack, -/obj/effect/spawner/round_default_module, -/obj/effect/spawner/random/aimodule/neutral{ - pixel_x = 3; - pixel_y = 3 +/obj/structure/table/wood/fancy/red, +/obj/effect/spawner/random/aimodule/harmful{ + pixel_y = 10 + }, +/obj/item/ai_module/reset/purge, +/obj/machinery/door/window/brigdoor/left/directional/north{ + req_access = list("ai_upload"); + name = "AI Modules" }, +/obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "rDc" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/iron/white/textured_large, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/surgery) "rDd" = ( /obj/structure/chair/office{ @@ -61187,14 +65197,15 @@ }, /turf/open/floor/eighties, /area/station/construction/storage_wing) -"rDm" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron/stairs/right, -/area/station/maintenance/disposal/incinerator) "rDr" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"rDs" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) "rDv" = ( /turf/closed/wall, /area/station/construction/storage_wing) @@ -61208,6 +65219,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) +"rDz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron/white, +/area/station/maintenance/starboard) "rDC" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/food_or_drink/snack{ @@ -61220,23 +65236,41 @@ /turf/open/floor/iron/dark/textured_large, /area/station/cargo/bitrunning/den) "rDD" = ( +/obj/item/emergency_bed, +/obj/item/emergency_bed{ + pixel_y = 3 + }, +/obj/item/emergency_bed{ + pixel_y = 3 + }, +/obj/structure/rack, /obj/structure/railing{ dir = 8 }, -/obj/machinery/computer/crew{ - dir = 1 +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" }, -/obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron/dark/textured_large, /area/station/medical/medbay/central) +"rDG" = ( +/obj/effect/turf_decal/tile/red, +/turf/closed/wall/r_wall, +/area/station/engineering/lobby) "rDN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, /obj/structure/disposalpipe/segment{ - dir = 5 + dir = 4 }, -/turf/open/floor/iron/white/textured, -/area/station/medical/surgery) +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "rEd" = ( /obj/structure/ladder, /obj/effect/decal/cleanable/dirt, @@ -61249,41 +65283,33 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/security/prison) -"rEt" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/grunge{ - name = "Morgue" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, -/turf/open/floor/iron/dark/small, -/area/station/medical/morgue) -"rEv" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/stairs/medium, -/area/station/maintenance/starboard/lesser) "rED" = ( /turf/closed/wall, /area/station/security/prison/shower) -"rEG" = ( -/obj/structure/mirror/directional/north, -/obj/item/cigbutt, -/obj/structure/sink/directional/south, -/turf/open/floor/iron/freezer, -/area/station/commons/dorms) "rEL" = ( -/obj/effect/turf_decal/siding/blue{ +/obj/machinery/requests_console/directional/north{ + department = "Medbay"; + name = "Medbay Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/structure/disposalpipe/trunk{ dir = 8 }, +/obj/machinery/disposal/bin, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) -"rFi" = ( -/obj/structure/chair{ - dir = 4; - pixel_y = -2 +"rET" = ( +/obj/machinery/door/airlock/command{ + name = "Chief Engineer's Quarters" }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/effect/mapping_helpers/airlock/access/all/engineering/ce, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) +"rFg" = ( +/turf/open/floor/engine/hull/air, +/area/station/engineering/supermatter/room/upper) "rFj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -61296,42 +65322,20 @@ /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer, -/obj/machinery/camera/autoname/directional/north{ - network = list("ss13","medbay"); - c_tag = "Medbay - Lower Cryo" +/obj/machinery/computer/crew{ + dir = 1 }, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/office) "rFm" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/disposalpipe/trunk, /obj/machinery/disposal/bin, /turf/open/floor/wood, /area/station/hallway/secondary/service) -"rFq" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/machinery/duct, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) -"rFr" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/stack{ - dir = 1 - }, -/obj/structure/fluff/paper/stack{ - dir = 4 - }, -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "rFx" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -61371,6 +65375,11 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) +"rFM" = ( +/obj/structure/stairs/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/stairs/medium, +/area/station/maintenance/starboard) "rGb" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 @@ -61381,6 +65390,11 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"rGg" = ( +/obj/structure/table/reinforced, +/obj/item/cigbutt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "rGp" = ( /obj/structure/railing{ dir = 8 @@ -61390,19 +65404,40 @@ }, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) -"rGw" = ( +"rGq" = ( +/obj/machinery/light/small/directional/east, /obj/structure/cable, -/obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/glass/reinforced, +/area/station/solars/starboard/fore) +"rGK" = ( +/obj/structure/fake_stairs/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"rGY" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"rGK" = ( -/obj/structure/fake_stairs/directional/east, +"rHf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/pen/blue{ + pixel_x = -9; + pixel_y = 9 + }, +/obj/structure/fluff/paper/stack{ + desc = "A stack of various papers, absolutely unreadable due to scorch marks and aging."; + dir = 1 + }, +/obj/structure/fluff/paper/corner, +/obj/effect/spawner/random/maintenance, +/obj/structure/disposalpipe/segment, /turf/open/floor/plating, -/area/station/maintenance/port/aft) +/area/station/maintenance/aft) "rHk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -61417,7 +65452,9 @@ dir = 4 }, /obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 8 + }, /area/station/hallway/primary/central) "rHq" = ( /obj/effect/landmark/event_spawn, @@ -61429,12 +65466,14 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) "rHB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "rHD" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -61458,11 +65497,7 @@ }, /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"rHN" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/ai/satellite/interior) "rHS" = ( /obj/structure/lattice/catwalk, /obj/machinery/door/window/left/directional/west{ @@ -61470,21 +65505,18 @@ }, /turf/open/openspace, /area/station/command/gateway) -"rHU" = ( -/obj/structure/reflector/double{ - dir = 6 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) -"rHZ" = ( -/obj/structure/closet/firecloset, -/obj/item/radio/intercom/directional/south, +"rHT" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 6 + dir = 5 }, -/turf/open/floor/iron, -/area/station/engineering/lobby) +/obj/machinery/vending/tool, +/turf/open/floor/iron/dark, +/area/station/engineering/storage) +"rHX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/holopad, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "rIi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61500,6 +65532,15 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"rIm" = ( +/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "rIq" = ( /obj/structure/chair/pew/right{ dir = 8 @@ -61507,10 +65548,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/service/chapel) -"rIw" = ( -/obj/machinery/vending/tool, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "rIA" = ( /obj/effect/turf_decal/tile/red/fourcorners, /obj/structure/window/reinforced/spawner/directional/south, @@ -61528,7 +65565,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/directional/east, -/turf/open/floor/wood, +/turf/open/floor/iron/dark, /area/station/command/gateway) "rIU" = ( /obj/structure/disposalpipe/segment{ @@ -61552,17 +65589,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/cytology) -"rIZ" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/textured_large, -/area/station/medical/virology) "rJa" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -61575,12 +65601,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"rJe" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 10 - }, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) "rJi" = ( /obj/machinery/door/airlock{ id_tag = "restroom_3"; @@ -61608,21 +65628,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/service/cafeteria) -"rJB" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/petri_dish/random{ - pixel_x = -14; - pixel_y = 7 - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) "rJF" = ( /obj/structure/lattice, /obj/structure/rack, @@ -61640,16 +65645,26 @@ /obj/effect/spawner/random/clothing/costume, /obj/effect/spawner/random/clothing/funny_hats, /turf/open/floor/iron/checker, -/area/station/ai_monitored/turret_protected/aisat_interior) -"rJJ" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/area/station/ai/satellite/interior) +"rJL" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/arrow_ccw{ dir = 4 }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"rKf" = ( +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"rKj" = ( +/obj/effect/turf_decal/stripes/corner, /obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "rKn" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -61659,33 +65674,11 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, /area/station/service/chapel) -"rKq" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/medical/cryo) -"rKz" = ( -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "N20 Multideck Adapter"; - dir = 8 - }, -/obj/machinery/meter{ - name = "N20 meter" - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) -"rKA" = ( -/turf/closed/wall, -/area/station/maintenance/starboard/lesser) "rKJ" = ( /obj/structure/cable, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"rKL" = ( -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) "rKN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -61693,13 +65686,6 @@ /obj/structure/fireaxecabinet/mechremoval/directional/east, /turf/open/floor/iron, /area/station/science/robotics) -"rKO" = ( -/obj/machinery/computer/station_alert{ - dir = 1 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "rKQ" = ( /obj/structure/sign/poster/official/walk, /turf/closed/wall, @@ -61746,15 +65732,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/breakroom) -"rLz" = ( -/obj/structure/railing{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/openspace, -/area/station/engineering/lobby) "rLA" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /obj/structure/railing{ @@ -61767,13 +65744,6 @@ /obj/item/clothing/glasses/science, /turf/open/floor/iron, /area/station/science/research) -"rLK" = ( -/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/filled/line, -/turf/open/floor/iron, -/area/station/engineering/lobby) "rMc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61782,20 +65752,22 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) -"rMe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/wall_healer/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction) -"rMj" = ( -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) +"rMr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/engineering/storage) "rMv" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "chemshutters"; + name = "Pharmacy Shutters" + }, +/obj/effect/spawner/structure/window, /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "rMS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61805,7 +65777,7 @@ }, /obj/effect/mapping_helpers/mail_sorting/security/general, /obj/effect/mapping_helpers/mail_sorting/security/hos_office, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "rMW" = ( /obj/effect/turf_decal/stripes/line{ @@ -61820,6 +65792,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"rNa" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/effect/turf_decal/tile/dark_green/half/contrasted, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "rNc" = ( /obj/structure/lattice/catwalk, /obj/item/stack/cable_coil{ @@ -61830,40 +65813,20 @@ "rNe" = ( /turf/open/openspace, /area/station/commons/fitness/recreation) -"rNx" = ( -/obj/structure/table, -/obj/item/stamp/denied{ - pixel_x = 8; - pixel_y = 1 - }, -/obj/item/stamp/granted{ - pixel_x = 9; - pixel_y = 8 - }, -/obj/item/paper_bin{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/item/pen{ - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/station/engineering/lobby) "rNA" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"rND" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 9 +"rNI" = ( +/obj/effect/turf_decal/trimline/brown/filled/warning{ + dir = 8 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/storage) "rNT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -61872,14 +65835,19 @@ }, /turf/open/floor/iron/airless, /area/station/maintenance/starboard/aft) +"rNU" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/morgue) "rOb" = ( /obj/machinery/newscaster/directional/east, /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 4 }, -/obj/machinery/modular_computer/preset/cargochat/cargo{ - dir = 8 - }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/cargo/storage) "rOc" = ( @@ -61912,6 +65880,17 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) +"rOl" = ( +/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/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "rOn" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -61928,29 +65907,49 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) +"rOy" = ( +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "rOA" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/science/central) -"rOB" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/engineering/main) "rOC" = ( /obj/machinery/light/directional/north, /obj/machinery/computer/cargo/request, /turf/open/floor/iron/white/textured_half, -/area/station/ai_monitored/turret_protected/aisat_interior) -"rOG" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/mix_input{ - dir = 4 +/area/station/ai/satellite/interior) +"rOE" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/item/pen{ + pixel_x = -17; + pixel_y = 7 }, -/turf/open/floor/engine/vacuum, -/area/station/maintenance/disposal/incinerator) +/turf/open/floor/wood, +/area/station/maintenance/aft) "rOQ" = ( /obj/machinery/skill_station, /turf/open/floor/engine/hull/air, /area/station/maintenance/port/aft) +"rOW" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "SM_Outside_shutters"; + name = "Outside Shutters"; + dir = 4 + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"rOX" = ( +/obj/machinery/vending/tool, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "rPd" = ( /obj/effect/turf_decal/siding/purple{ dir = 8 @@ -61960,19 +65959,15 @@ }, /turf/open/floor/iron, /area/station/science/lab) +"rPg" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "rPh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/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/catwalk_floor, -/area/station/engineering/atmos/upper) +/obj/structure/lattice/catwalk, +/obj/structure/sign/flag/nanotrasen/directional/north, +/turf/open/openspace, +/area/station/maintenance/aft/upper) "rPn" = ( /obj/structure/table, /obj/item/assembly/flash/handheld{ @@ -61984,11 +65979,6 @@ }, /turf/open/floor/iron/grimy, /area/station/security/interrogation) -"rPs" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/station/commons/dorms) "rPw" = ( /obj/item/cigbutt{ pixel_x = -12; @@ -62008,18 +65998,15 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/station/maintenance/port) -"rPK" = ( -/obj/structure/table, -/obj/item/paper/guides/jobs/engi/gravity_gen, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "rPQ" = ( /obj/structure/chair/comfy/brown{ dir = 4 }, -/obj/item/radio/intercom/directional/west, /obj/machinery/light/directional/west, -/turf/open/floor/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "rPS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62031,26 +66018,6 @@ /obj/effect/mapping_helpers/mail_sorting/service/chapel, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"rPU" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/plating, -/area/station/maintenance/port) -"rPV" = ( -/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/dirt, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"rQb" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general/visible, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "rQg" = ( /obj/structure/tank_holder/extinguisher, /obj/machinery/light/directional/east, @@ -62082,6 +66049,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) +"rQG" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/machinery/modular_computer/preset/engineering{ + dir = 8 + }, +/obj/effect/turf_decal/bot/right, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"rQN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/office) "rQQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62091,11 +66077,41 @@ }, /turf/open/floor/iron/dark, /area/station/security/medical) +"rQR" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/table/reinforced/rglass, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/clothing/neck/stethoscope{ + pixel_y = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "rQU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/item/stack/medical/gauze{ + pixel_x = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 4 }, -/obj/machinery/firealarm/directional/west, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) "rRd" = ( @@ -62104,23 +66120,13 @@ /turf/open/floor/iron/dark, /area/station/science/xenobiology) "rRg" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 - }, -/obj/machinery/firealarm/directional/south, -/obj/machinery/light/warm/dim/directional/west, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) -"rRh" = ( -/obj/machinery/light/directional/east, -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/effect/turf_decal/bot_white, +/obj/effect/spawner/random/structure/crate, +/obj/machinery/status_display/supply{ + pixel_x = -32 }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/turf/open/floor/iron/dark/textured_large, +/area/station/cargo/storage) "rRn" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -62128,17 +66134,8 @@ /area/station/engineering/supermatter/room) "rRy" = ( /obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 1 - }, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) -"rRJ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/engineering/lobby) "rRM" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -62166,70 +66163,78 @@ /turf/open/floor/iron, /area/station/cargo/storage) "rRN" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/south{ - name = "Cargo Desk"; - req_access = list("mining") +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/turf_decal/trimline/brown/arrow_cw{ + dir = 1 }, -/obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron, -/area/station/cargo/miningoffice) -"rRW" = ( -/obj/item/ammo_casing/spent{ - pixel_x = 7; - pixel_y = 9 - }, -/obj/item/ammo_casing/spent{ - pixel_x = 2; - pixel_y = -9 +/area/station/hallway/primary/starboard) +"rRP" = ( +/obj/machinery/vatgrower, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) +"rRT" = ( +/obj/structure/chair/office, +/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/dark, +/area/station/engineering/supermatter/room/upper) "rSb" = ( /obj/machinery/light_switch/directional/south, -/obj/structure/disposaloutlet{ +/obj/structure/table, +/obj/item/stack/package_wrap, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/obj/structure/railing{ - dir = 9 +/obj/item/storage/box/shipping{ + pixel_x = 4; + pixel_y = 10 }, -/turf/open/floor/iron, +/obj/item/clothing/head/costume/mailman, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark/textured, /area/station/cargo/sorting) -"rSi" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "rSj" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/smooth_edge{ +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) +"rSD" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, -/area/station/medical/pharmacy) -"rSu" = ( -/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"rSG" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/duct, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) +"rSP" = ( /obj/structure/cable, -/obj/machinery/camera/autoname/directional/north, -/obj/machinery/washing_machine, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) +/obj/machinery/power/smes/engineering, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "rSX" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"rTa" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 +/obj/effect/turf_decal/trimline/green/filled/corner, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"rTe" = ( +/obj/machinery/door/airlock/grunge{ + name = "Morgue" }, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, +/turf/open/floor/iron/dark/small, +/area/station/medical/morgue) "rTk" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -62244,34 +66249,20 @@ /turf/open/floor/iron/dark, /area/station/security/office) "rTp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/iron/white/textured_corner, -/area/station/medical/surgery) +/obj/machinery/iv_drip, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "rTz" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/security/brig) -"rTD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/cut_AI_wire, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) "rTF" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, /obj/machinery/computer/exoscanner_control, -/obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/cargo/storage) "rTH" = ( @@ -62285,10 +66276,6 @@ dir = 8 }, /area/station/hallway/primary/fore) -"rTQ" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/upper) "rTR" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, @@ -62300,15 +66287,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) -"rUf" = ( -/obj/machinery/door/airlock/virology/glass{ - name = "Malpractice Tower" - }, -/obj/effect/turf_decal/tile/green/full, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/medical/virology, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/virology) "rUj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62336,6 +66314,11 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) +"rUq" = ( +/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/security/detectives_office/private_investigators_office) "rUr" = ( /obj/structure/railing{ dir = 4 @@ -62347,18 +66330,6 @@ /obj/machinery/disposal/bin, /turf/open/openspace, /area/station/science/xenobiology) -"rUC" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/table, -/obj/effect/landmark/event_spawn, -/obj/item/chisel{ - pixel_x = 7; - pixel_y = 4 - }, -/turf/open/floor/wood, -/area/station/service/library) "rUE" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -62372,6 +66343,22 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) +"rUR" = ( +/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/starboard/aft/upper) +"rVb" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 10 + }, +/obj/effect/turf_decal/siding/yellow, +/turf/open/floor/iron, +/area/station/engineering/atmos/upper) "rVc" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -62382,22 +66369,62 @@ /turf/open/floor/iron/dark/textured_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"rVd" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/table/reinforced, +/obj/item/storage/briefcase/secure{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/item/paper/monitorkey, +/obj/item/clipboard, +/obj/machinery/camera/autoname/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) "rVf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"rVo" = ( +/obj/structure/frame/computer{ + anchored = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) "rVs" = ( /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"rVx" = ( -/obj/structure/closet/crate/coffin, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"rVt" = ( +/obj/machinery/atmospherics/components/binary/valve/digital/layer2{ + dir = 8; + name = "Incinerator to Waste" + }, +/obj/effect/turf_decal/trimline/purple, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"rVA" = ( +/obj/item/kirbyplants/random, +/obj/machinery/button/door/directional/east{ + id = "Cabin4"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "rVE" = ( /obj/structure/table/reinforced, /obj/item/food/burger/catburger{ @@ -62405,8 +66432,14 @@ pixel_x = -4; pixel_y = 8 }, +/obj/effect/turf_decal/siding/green, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) +"rVG" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment, +/turf/open/openspace, +/area/station/maintenance/starboard/upper) "rVJ" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -62415,26 +66448,36 @@ }, /turf/open/floor/eighties/red, /area/station/maintenance/hallway/abandoned_recreation) +"rVL" = ( +/obj/item/banner/cargo/mundane, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "rVM" = ( /obj/structure/lattice/catwalk, /obj/structure/table/reinforced, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, +/obj/machinery/light_switch/directional/west, /turf/open/openspace, /area/station/security/checkpoint/customs) -"rVT" = ( -/obj/effect/turf_decal/siding/brown{ - 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/mapping_helpers/mail_sorting/service/dormitories, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 8 +"rVS" = ( +/obj/structure/table, +/obj/item/tape{ + pixel_x = -4 }, -/turf/open/floor/iron, -/area/station/commons/dorms) +/turf/open/floor/plating, +/area/station/maintenance/starboard) "rVX" = ( /obj/machinery/door/airlock/grunge{ name = "Cell 2" @@ -62444,14 +66487,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison/safe) -"rWf" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +"rWg" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/engine/hull, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"rWn" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "rWp" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -62459,11 +66507,6 @@ /obj/structure/sign/calendar/directional/north, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) -"rWs" = ( -/obj/machinery/light/directional/west, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "rWx" = ( /obj/effect/turf_decal/stripes/corner, /turf/open/floor/engine/hull, @@ -62485,12 +66528,6 @@ dir = 8 }, /area/station/hallway/primary/starboard) -"rWH" = ( -/obj/item/cigbutt, -/obj/effect/landmark/start/hangover, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/glass, -/area/station/commons/fitness/recreation) "rWJ" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -62506,37 +66543,79 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) -"rWT" = ( +"rWN" = ( +/obj/structure/reagent_dispensers/plumbed{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"rWZ" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/arrow_ccw{ + dir = 4 + }, +/obj/structure/chair{ + dir = 4; + pixel_y = -2 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"rXj" = ( +/obj/item/stock_parts/water_recycler{ + pixel_y = 2; + pixel_x = -5 + }, +/obj/structure/frame/machine/secured, +/turf/open/floor/iron/freezer, +/area/station/commons/dorms) +"rXt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"rXq" = ( -/obj/effect/turf_decal/trimline/white/corner{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=20-Genetics"; + location = "19-Captain" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/catwalk_floor/iron, +/area/station/hallway/primary/central) "rXD" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/station/security/interrogation) -"rXI" = ( -/obj/structure/chair/pew/left{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) "rXL" = ( /turf/open/openspace, /area/station/science/robotics/lab) +"rXM" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Laundromat" + }, +/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, +/obj/machinery/duct, +/turf/open/floor/iron/textured, +/area/station/commons/dorms/laundry) "rXS" = ( /turf/open/floor/plating, /area/station/maintenance/department/medical) +"rXX" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/turf_decal/weather/snow, +/obj/machinery/light_switch/directional/west, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/medical/coldroom) "rXY" = ( /obj/effect/turf_decal/siding/purple/corner, /obj/structure/cable, @@ -62551,72 +66630,70 @@ /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "rYf" = ( /obj/structure/grille, /obj/structure/lattice, /turf/open/space/openspace, /area/space/nearstation) +"rYh" = ( +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "rYu" = ( /obj/machinery/suit_storage_unit/standard_unit, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) -"rYB" = ( -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 4 +/obj/effect/turf_decal/siding/dark{ + dir = 8 }, -/turf/open/floor/engine/hull/reinforced, -/area/space/nearstation) -"rYF" = ( -/obj/structure/cable, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) +"rYw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) -"rYH" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/disposalpipe/segment{ - dir = 5 +/obj/structure/cable, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=18-Bathroom"; + location = "17-Dorms" }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) -"rYJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/structure/sign/poster/contraband/random/directional/north, /obj/structure/disposalpipe/segment{ - dir = 6 + dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) -"rYP" = ( +/obj/machinery/duct, +/turf/open/floor/iron, +/area/station/commons/dorms) +"rYF" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table/reinforced, -/obj/item/stamp/denied{ - pixel_x = 13 - }, -/obj/item/stamp/head/ce{ - pixel_y = 3 +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) +"rYQ" = ( +/obj/machinery/conveyor{ + id = "garbage" }, -/obj/item/paper_bin{ - pixel_x = 3; - pixel_y = 10 +/obj/structure/window/spawner/directional/east, +/obj/effect/turf_decal/stripes/red/box, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"rYR" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/turf_decal/siding/wood{ + dir = 4 }, -/obj/item/pen{ - pixel_x = 17 +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) -"rYQ" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, -/area/station/maintenance/disposal) +/area/station/maintenance/aft) +"rYU" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/upper) "rYV" = ( /obj/effect/mapping_helpers/airlock/access/any/service/theatre, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62627,10 +66704,15 @@ }, /turf/open/floor/plating, /area/station/service/theater) -"rZl" = ( -/obj/structure/railing, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/turf/open/floor/catwalk_floor, +"rZi" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/medical/abandoned) +"rZp" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, /area/station/engineering/atmos/upper) "rZs" = ( /obj/structure/chair, @@ -62640,22 +66722,46 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/security/courtroom) -"rZv" = ( +"rZH" = ( +/obj/structure/table, +/obj/item/hand_labeler{ + pixel_y = 7 + }, +/obj/item/camera_film{ + pixel_y = 3 + }, +/obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) +/obj/effect/turf_decal/tile/green/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/commons/storage/art) "rZP" = ( -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/iron/white/textured_corner, -/area/station/medical/surgery) +/obj/effect/turf_decal/siding/dark_blue/inner_corner{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "rZU" = ( /turf/open/floor/engine/hull/reinforced, /area/station/maintenance/port/aft) "sag" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) +"sai" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Abandoned Bar" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "saq" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/effect/landmark/start/hangover, @@ -62667,6 +66773,13 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"sau" = ( +/obj/structure/table, +/obj/effect/spawner/random/maintenance/two, +/obj/structure/sign/poster/contraband/space_up/directional/east, +/obj/structure/sign/poster/contraband/ambrosia_vulgaris/directional/south, +/turf/open/floor/eighties, +/area/station/maintenance/department/crew_quarters/dorms) "saE" = ( /obj/structure/window/spawner/directional/north, /obj/machinery/door/firedoor/border_only{ @@ -62691,6 +66804,16 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) +"saT" = ( +/turf/closed/wall/r_wall, +/area/station/maintenance/starboard/aft/upper) +"saX" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/remains/human, +/obj/structure/frame/machine, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "sbb" = ( /obj/effect/turf_decal/siding/dark{ dir = 10 @@ -62702,7 +66825,7 @@ /turf/open/floor/iron/dark/textured_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "sbd" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/siding/wood, @@ -62719,12 +66842,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/lounge) -"sbn" = ( -/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/station/maintenance/starboard/lesser) "sbp" = ( /turf/open/floor/engine/plasma, /area/station/engineering/atmos/upper) @@ -62777,69 +66894,6 @@ }, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) -"sbF" = ( -/obj/item/radio/intercom/directional/east, -/obj/structure/rack, -/obj/item/radio/off{ - pixel_x = -5; - pixel_y = 2 - }, -/obj/item/wrench, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/engineering) -"sbI" = ( -/obj/item/toy/plush/lizard_plushie/green{ - name = "Swats-The-Moths"; - pixel_y = -10 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/tile/dark_green/opposingcorners, -/obj/effect/turf_decal/tile/green/opposingcorners{ - dir = 1 - }, -/obj/effect/spawner/random/maintenance, -/obj/structure/sign/poster/contraband/lizard/directional/north, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/fore) -"sbP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"sbT" = ( -/obj/structure/flora/bush/large/style_random, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/turf/open/floor/grass, -/area/station/medical/medbay/central) -"scc" = ( -/obj/effect/turf_decal/siding{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/white/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) -"sce" = ( -/obj/effect/decal/cleanable/crayon{ - icon_state = "nay"; - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "scf" = ( /obj/structure/table, /obj/item/grenade/chem_grenade/teargas/moustache{ @@ -62868,7 +66922,8 @@ pixel_y = 11 }, /obj/structure/sign/painting/library{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/glass/reinforced, /area/station/service/library) @@ -62876,13 +66931,6 @@ /obj/effect/spawner/random/structure/chair_maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"scy" = ( -/obj/machinery/duct, -/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/freezer, -/area/station/commons/toilet/restrooms) "scE" = ( /obj/machinery/light/directional/south, /obj/machinery/light_switch/directional/south, @@ -62901,11 +66949,14 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "scJ" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/siding/green{ dir = 1 }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/plaque{ + icon_state = "L9" + }, +/turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "scK" = ( /obj/effect/turf_decal/bot/right, @@ -62917,6 +66968,19 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) +"scO" = ( +/obj/structure/cable, +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 9 + }, +/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/layer5{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "scQ" = ( /obj/structure/table, /obj/structure/window/spawner/directional/north, @@ -62939,14 +67003,6 @@ "sdf" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/security/interrogation) -"sdm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/chair, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) "sds" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/remains/human, @@ -62970,12 +67026,16 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) -"sdI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"sdP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/turf/closed/wall/r_wall, -/area/station/command/heads_quarters/ce) +/obj/machinery/computer/atmos_control, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/engineering/atmos/upper) "sdV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63032,6 +67092,12 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/grass, /area/station/engineering/lobby) +"seD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/security/courtroom) "seF" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -63052,39 +67118,32 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/small, /area/station/security/mechbay) -"seW" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 9 - }, +"sfc" = ( +/obj/structure/lattice, /turf/open/openspace, -/area/station/engineering/break_room) +/area/station/maintenance/starboard/upper) "sfh" = ( /turf/closed/wall, /area/station/maintenance/disposal) "sfj" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 1 - }, -/obj/structure/sink/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayExit"; + name = "Medbay Exit" }, -/obj/machinery/camera/autoname/directional/north{ - network = list("ss13","medbay"); - c_tag = "Medbay - Lower North Treatment Center" +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/full, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 }, -/turf/open/floor/iron/white/textured_large, +/turf/open/floor/iron/dark, /area/station/medical/medbay/central) "sfn" = ( -/turf/open/floor/carpet, -/area/station/command/bridge) +/obj/structure/chair/comfy/beige{ + dir = 8 + }, +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room/council) "sfp" = ( /obj/structure/table/reinforced, /obj/item/camera{ @@ -63094,14 +67153,11 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/security/courtroom) -"sfq" = ( -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/ferny/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/grass, -/area/station/commons/dorms) +"sfv" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "sfz" = ( /obj/machinery/door/airlock/security/glass{ name = "Security Post - Cargo" @@ -63109,13 +67165,9 @@ /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/security/general, /obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) -"sfJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/footprints, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "sfL" = ( /obj/machinery/atmospherics/components/binary/valve, /turf/open/floor/iron/dark, @@ -63127,6 +67179,24 @@ /obj/structure/displaycase/noalert, /turf/open/floor/iron/dark, /area/station/science/lobby) +"sfR" = ( +/obj/machinery/computer/crew, +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/camera/autoname/directional/east, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"sfS" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/modular_computer/preset/engineering{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage) "sgf" = ( /obj/structure/ladder, /obj/structure/cable, @@ -63160,23 +67230,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"sgG" = ( -/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/starboard/fore) -"sgM" = ( -/obj/structure/table/reinforced, -/obj/item/radio/intercom, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"sgN" = ( +/obj/structure/bed/medical/emergency, +/obj/effect/landmark/start/paramedic, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "sgQ" = ( /obj/structure/table/wood/poker, /obj/effect/spawner/random/entertainment/gambling, @@ -63184,36 +67249,28 @@ icon_state = "carpet-137" }, /area/station/service/abandoned_gambling_den) -"sgU" = ( -/obj/structure/table, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 +"sgT" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/obj/machinery/cell_charger{ - pixel_y = 9 +/obj/machinery/camera/autoname/directional/west, +/obj/structure/chair{ + dir = 4; + pixel_y = -2 }, -/obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) +/area/station/medical/medbay/lobby) "sgV" = ( /obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/landmark/navigate_destination/disposals, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/disposal) -"sgX" = ( -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/break_room) "shb" = ( /obj/effect/turf_decal/siding/red{ dir = 8 @@ -63223,6 +67280,11 @@ "shi" = ( /turf/closed/wall/r_wall, /area/station/engineering/storage_shared) +"shl" = ( +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "shs" = ( /turf/closed/wall, /area/station/commons/vacant_room/office) @@ -63243,9 +67305,6 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"shx" = ( -/turf/closed/wall/r_wall, -/area/station/maintenance/disposal/incinerator) "shG" = ( /obj/structure/railing{ dir = 8 @@ -63263,6 +67322,9 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/mechbay) +"shQ" = ( +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/office) "shR" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/blacklight/directional/west, @@ -63281,20 +67343,31 @@ /area/station/hallway/secondary/construction) "sik" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /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/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"siz" = ( -/obj/machinery/light/directional/south, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/engineering/break_room) +"siA" = ( +/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/hallway/primary/aft) +"siD" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 10 + }, +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/floor/grass, +/area/station/engineering/lobby) "siG" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/spawner/random/maintenance, @@ -63305,26 +67378,19 @@ /obj/effect/landmark/start/depsec/science, /turf/open/openspace, /area/station/security/checkpoint/science) -"siM" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/structure/fluff/paper/stack{ - dir = 8 - }, -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/spawner/random/bureaucracy/paper, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) -"siN" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "siP" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/commons/lounge) +"siR" = ( +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "siX" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -63344,19 +67410,33 @@ }, /turf/open/floor/wood/large, /area/station/commons/lounge) -"sjq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 8 +"sjr" = ( +/obj/machinery/door/airlock/maintenance{ + name = "CE's Maintenance Access" }, -/obj/effect/turf_decal/trimline/yellow/arrow_ccw, -/obj/effect/turf_decal/trimline/yellow/arrow_ccw, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/turf/open/floor/plating, +/area/station/engineering/storage_shared) "sjx" = ( /turf/closed/wall, /area/station/hallway/primary/port) +"sjy" = ( +/obj/machinery/camera/autoname/directional/west, +/obj/structure/sign/warning/directional/south, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"sjz" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/vending/cigarette, +/obj/structure/sign/warning/yes_smoking/circle/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/commons/toilet/restrooms) "sjC" = ( /obj/structure/stairs/south, /turf/open/floor/iron/stairs/medium{ @@ -63376,58 +67456,16 @@ }, /turf/open/floor/iron, /area/station/science/robotics) -"sjO" = ( -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) -"sjQ" = ( -/obj/structure/railing, -/obj/structure/table/wood, -/obj/item/folder/yellow{ - pixel_x = 4; - pixel_y = 6 - }, -/obj/item/folder/blue{ - pixel_x = -9; - pixel_y = 1 - }, -/obj/item/folder/red{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/folder{ - pixel_x = 2 - }, -/obj/item/taperecorder{ - pixel_x = -13; - pixel_y = 5 - }, -/obj/structure/cable, -/turf/open/floor/wood/large, -/area/station/service/library/private) "sjT" = ( /obj/structure/cable, /turf/closed/wall/r_wall, /area/station/security/office) -"ska" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "skm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/spawner/random/structure/shipping_container, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"sko" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "skq" = ( /obj/machinery/power/solar{ id = "starboardsolar"; @@ -63446,12 +67484,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"skC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "skR" = ( /obj/structure/table/wood, /obj/item/vending_refill/cigarette{ @@ -63510,6 +67542,10 @@ }, /turf/open/openspace, /area/station/hallway/secondary/construction) +"slo" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/engineering/storage_shared) "slt" = ( /obj/structure/railing{ dir = 8 @@ -63523,6 +67559,41 @@ /obj/effect/spawner/random/maintenance/no_decals, /turf/open/floor/plating/airless, /area/space/nearstation) +"slI" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/medical/medbay/central) +"slK" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/yellow/full, +/obj/item/reagent_containers/cup/bottle/morphine{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/bottle/toxin{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/reagent_containers/syringe/epinephrine{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/right/directional/east{ + name = "Pharmacy Desk"; + req_access = list("pharmacy") + }, +/obj/machinery/door/window/right/directional/west{ + name = 4; + req_access = list("medical") + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "chemshutters"; + name = "Pharmacy Shutters" + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "slL" = ( /obj/effect/spawner/random/structure/grille, /turf/open/space/openspace, @@ -63536,12 +67607,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"slP" = ( -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "slS" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -63550,8 +67615,9 @@ /obj/structure/railing/corner/end/flip{ dir = 8 }, +/obj/structure/cable, /turf/open/openspace, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "smc" = ( /obj/machinery/button/door/directional/west{ name = "Kitchen Counter Shutters Control"; @@ -63565,12 +67631,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"smk" = ( -/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/lobby) +"sml" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/structure/frame/computer{ + anchored = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) "smz" = ( /obj/machinery/hydroponics/soil, /obj/effect/decal/cleanable/dirt, @@ -63578,14 +67648,6 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/security/prison) -"smD" = ( -/obj/structure/closet/secure_closet/atmospherics, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) -"smV" = ( -/obj/machinery/holopad, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/morgue) "snd" = ( /obj/machinery/mecha_part_fabricator{ drop_direction = 4 @@ -63603,22 +67665,21 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) +"sny" = ( +/turf/closed/wall, +/area/station/medical/chem_storage) "snE" = ( -/obj/structure/disposalpipe/trunk/multiz{ +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/turf/closed/wall, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) -"snF" = ( -/obj/structure/ladder, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"snQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "snR" = ( /obj/structure/railing/corner{ dir = 1 @@ -63677,54 +67738,30 @@ }, /turf/open/floor/wood/large, /area/station/service/library) -"soH" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/structure/sign/poster/official/random/directional/north, -/obj/effect/landmark/start/hangover, -/turf/open/openspace, -/area/station/commons/dorms) +"soR" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "soU" = ( /turf/closed/wall, /area/station/science/research) -"spb" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/engine/hull/air, -/area/station/engineering/storage_shared) "spl" = ( -/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/textured_large, /area/station/medical/abandoned) -"spr" = ( -/obj/structure/table, -/obj/item/hand_labeler{ - pixel_y = 11 - }, -/obj/item/hand_labeler_refill{ - pixel_x = -8; - pixel_y = 3 - }, -/obj/item/folder/yellow{ - pixel_x = 3; - pixel_y = 1 - }, -/obj/machinery/power/apc/auto_name/directional/east, +"spn" = ( +/obj/structure/chair/office, +/obj/machinery/duct, +/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/brown/filled/line{ - dir = 5 - }, /turf/open/floor/iron, +/area/station/engineering/lobby) +"spr" = ( +/obj/structure/cable, +/turf/open/floor/iron/dark/textured, /area/station/cargo/sorting) -"spw" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/shutters{ - id = "abandoned_kitchen"; - name = "Kitchen Shudders" - }, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) "spC" = ( /obj/machinery/teleport/station, /obj/effect/turf_decal/tile/green/opposingcorners{ @@ -63744,36 +67781,43 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"spK" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/access/all/engineering/external, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "spO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /turf/open/floor/wood/large, /area/station/service/library) -"sql" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"sqo" = ( -/obj/structure/chair/greyscale{ - dir = 1 +"sqj" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/obj/machinery/power/energy_accumulator/tesla_coil/anchored, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 10 }, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "sqp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/dark/smooth_edge, +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_y = 4; + pixel_x = 5 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8; + pixel_y = 7 + }, +/obj/item/reagent_containers/dropper{ + pixel_y = -4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "sqq" = ( /obj/effect/turf_decal/trimline/green/filled/line{ @@ -63787,47 +67831,52 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) -"sqz" = ( -/obj/structure/cable, -/obj/item/cigbutt{ - pixel_x = -12; - pixel_y = 13 - }, -/obj/item/cigbutt{ - pixel_x = 1; - pixel_y = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"sqy" = ( +/obj/machinery/light/directional/north, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "sqQ" = ( -/obj/effect/turf_decal/siding/wood/corner, -/obj/structure/railing/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron/textured, +/area/station/command/eva) "sqR" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/remains/human, /obj/structure/window/spawner/directional/south, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"src" = ( -/obj/structure/table, -/obj/machinery/microwave/engineering/cell_included, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"srx" = ( -/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/landmark/event_spawn, +"srh" = ( +/obj/effect/spawner/random/structure/grille, +/obj/structure/cable, /turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) +"sri" = ( +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/item/storage/box/lights/mixed, +/turf/open/floor/iron/dark/smooth_large, /area/station/commons/dorms) -"sry" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) +"sru" = ( +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"srA" = ( +/obj/structure/table, +/obj/item/lipstick/purple{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/clothing/mask/animal/horsehead{ + pixel_x = 4; + pixel_y = 15 + }, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/aft/upper) "srB" = ( /obj/machinery/camera/directional/west, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -63861,9 +67910,7 @@ /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/supply/general, /obj/effect/turf_decal/tile/brown/fourcorners, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/storage) "ssc" = ( @@ -63877,16 +67924,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"ssm" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "sso" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/engineering/atmospherics_portable, @@ -63922,14 +67959,6 @@ }, /turf/open/misc/asteroid, /area/station/science/xenobiology/hallway) -"ssO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/textured_large, -/area/station/medical/virology) "ssT" = ( /obj/structure/table/wood, /obj/structure/desk_bell{ @@ -63950,6 +67979,29 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/service/cafeteria) +"ssX" = ( +/obj/structure/sink/directional/east, +/turf/open/floor/iron/freezer, +/area/station/commons/dorms) +"sta" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/door/airlock/mining{ + name = "Deliveries" + }, +/obj/machinery/door/firedoor, +/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) +"sti" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/railing, +/turf/open/openspace, +/area/station/engineering/lobby) "stk" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -63970,7 +68022,7 @@ /area/station/security/range) "stm" = ( /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "stq" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -63988,6 +68040,12 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/security/checkpoint/science) +"stt" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/structure/tank_dispenser, +/obj/structure/sign/poster/official/moth_hardhat/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) "stv" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -63997,33 +68055,31 @@ dir = 4 }, /turf/open/openspace, -/area/station/command/bridge) -"stR" = ( -/obj/effect/turf_decal/siding{ - dir = 5 +/area/station/command/meeting_room/council) +"stC" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 10 }, -/obj/effect/turf_decal/trimline/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "stW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/autoname/directional/east{ - network = list("ss13","medbay"); - c_tag = "Medbay - Upper Plumbing Area East" - }, -/turf/open/floor/engine/hull/air, +/obj/item/radio/intercom/directional/north, +/obj/machinery/light/directional/east, +/turf/open/floor/glass/reinforced, /area/station/medical/chemistry) -"stY" = ( -/obj/item/storage/box/lights/mixed, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/lesser) "sus" = ( /turf/open/floor/plating, /area/station/engineering/storage_shared) +"sux" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "suy" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -64039,24 +68095,50 @@ }, /turf/open/floor/iron/dark, /area/station/science/lobby) +"suI" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/components/trinary/mixer{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/upper) "suJ" = ( /obj/structure/sign/poster/official/moth_meth/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"suP" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 +"suK" = ( +/obj/effect/turf_decal/trimline/white/corner{ + dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/requests_console/directional/north{ - department = "Medbay"; - name = "Medbay Requests Console" +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) +"suM" = ( +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"suQ" = ( +/obj/machinery/computer/mecha, +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/camera/autoname/directional/west, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"suV" = ( +/obj/machinery/meter{ + name = "C02 meter" }, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "CO2 Multideck Adapter"; + dir = 2 + }, +/obj/effect/turf_decal/tile/dark/fourcorners, +/obj/effect/turf_decal/box/white, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "svh" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/access/all/engineering/external, @@ -64070,15 +68152,11 @@ /turf/open/floor/plating, /area/station/solars/starboard/aft) "svp" = ( -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"svt" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/openspace, -/area/station/engineering/atmos/project) +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/turf/open/floor/iron/textured, +/area/station/command/eva) "svw" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 @@ -64087,38 +68165,36 @@ /obj/structure/railing/corner, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"svB" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/firealarm/directional/south, -/obj/machinery/light/directional/south, -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/engineering/lobby) -"svL" = ( -/obj/machinery/door/poddoor/massdriver_ordnance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"svC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/morgue) +"svH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/machinery/atmos_shield_gen/active, -/obj/machinery/atmos_shield_gen/active{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) -"svM" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ +/turf/open/floor/iron, +/area/station/commons/dorms) +"svT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ dir = 5 }, -/obj/machinery/light/directional/east, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/iron, -/area/station/engineering/lobby) +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "svW" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 }, /turf/open/floor/wood, /area/station/service/library) +"swa" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "swd" = ( /obj/effect/decal/cleanable/blood/gibs, /turf/open/floor/engine/hull, @@ -64127,11 +68203,6 @@ /obj/structure/disposalpipe/segment, /turf/open/openspace, /area/station/hallway/secondary/construction) -"swp" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) "swH" = ( /obj/item/gun/ballistic/shotgun/doublebarrel, /obj/structure/table/wood, @@ -64159,7 +68230,30 @@ /turf/open/floor/iron/dark/textured_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"swS" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 9 + }, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) +"swU" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"swX" = ( +/obj/machinery/camera/autoname/directional/west{ + network = list("ss13","medbay"); + c_tag = "Medbay - Upper Secure Morgue" + }, +/obj/structure/bodycontainer/morgue/beeper_off, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/morgue) "swZ" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/decal/cleanable/dirt, @@ -64216,25 +68310,51 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) -"sxx" = ( -/obj/structure/cable/multilayer/multiz, -/turf/open/floor/glass/reinforced, -/area/station/solars/starboard/fore) -"sxT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 +"sxO" = ( +/obj/machinery/vending/coffee, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"sxP" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/structure/closet/secure_closet/engineering_personal, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"sxR" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "sxY" = ( /obj/structure/reflector/double/anchored{ dir = 10 }, /turf/open/floor/iron/dark/textured, /area/station/engineering/supermatter/room) +"sxZ" = ( +/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/assistance, +/obj/effect/mapping_helpers/requests_console/information, +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 1 + }, +/obj/machinery/fax{ + fax_name = "Chief Medical Officer's Office"; + name = "Chief Medical Officer's Fax Machine" + }, +/turf/open/floor/holofloor/dark, +/area/station/command/heads_quarters/cmo) "syi" = ( /obj/machinery/light/directional/south, /turf/open/floor/engine, @@ -64243,6 +68363,11 @@ /obj/structure/transit_tube/diagonal, /turf/open/space/openspace, /area/space/nearstation) +"sym" = ( +/obj/machinery/light/warm/dim/directional/west, +/obj/structure/lattice, +/turf/open/openspace, +/area/station/hallway/primary/central) "syw" = ( /obj/structure/flora/bush/pale/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -64250,22 +68375,40 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/grass, /area/station/hallway/secondary/entry) +"syD" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/openspace, +/area/station/medical/medbay/central) +"syK" = ( +/obj/structure/closet/firecloset, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) +"syN" = ( +/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/dirt, +/turf/open/floor/iron/white, +/area/station/maintenance/starboard) "syR" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) -"syU" = ( -/obj/item/ammo_casing/spent{ - pixel_x = 8; - pixel_y = 6 - }, -/obj/item/ammo_casing/spent{ - pixel_x = -6; - pixel_y = -5 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +"syT" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/station/maintenance/starboard) "syZ" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/structure/railing/corner{ @@ -64274,6 +68417,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"szf" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "szi" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -64291,17 +68442,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"szn" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/structure/table, -/obj/structure/microscope, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) "szp" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -64325,14 +68465,41 @@ }, /obj/item/radio/intercom/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, +/turf/open/floor/carpet/purple, /area/station/command/gateway) +"szA" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/cup/soda_cans/monkey_energy, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/upper) +"szG" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) "szK" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt/dust, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"szL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/wrench, +/obj/item/crowbar, +/obj/item/pipe_dispenser, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "sAa" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/wood, @@ -64343,14 +68510,19 @@ /turf/open/openspace, /area/station/hallway/primary/central) "sAm" = ( -/obj/machinery/holopad, /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 = 5 }, -/turf/open/floor/carpet, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "sAn" = ( /obj/structure/table, @@ -64365,21 +68537,6 @@ /obj/effect/mapping_helpers/broken_machine, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"sAu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) -"sAB" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) "sAE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/full, @@ -64388,19 +68545,16 @@ /obj/structure/sign/poster/contraband/missing_gloves/directional/south, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"sAG" = ( -/obj/effect/spawner/random/contraband/narcotics, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, +"sAI" = ( +/obj/item/food/grown/sunflower, +/turf/open/floor/iron/vaporwave, +/area/station/maintenance/starboard/aft/upper) +"sAR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/south, +/obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, -/area/station/maintenance/port) -"sAM" = ( -/obj/machinery/keycard_auth/wall_mounted/directional/west{ - pixel_x = 26 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +/area/station/maintenance/starboard/central) "sAT" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -64431,6 +68585,13 @@ /obj/structure/cable, /turf/open/floor/engine/hull/air, /area/station/hallway/primary/fore) +"sBv" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "sBz" = ( /obj/structure/rack, /obj/item/storage/toolbox/emergency, @@ -64445,38 +68606,31 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) -"sBP" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input{ - dir = 1 - }, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos/upper) "sCx" = ( /turf/open/openspace, /area/station/command/meeting_room/council) "sCA" = ( -/obj/machinery/computer/operating{ +/obj/machinery/stasis{ dir = 4 }, +/obj/machinery/defibrillator_mount/directional/west, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ dir = 8 }, -/obj/machinery/light/directional/west, -/obj/machinery/camera/autoname/directional/west{ - network = list("ss13","medbay"); - c_tag = "Medbay - Lower Operating Room" - }, -/obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) +/area/station/medical/medbay/central) "sCD" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/junction, /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"sCI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "sCP" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/emergency, @@ -64488,7 +68642,7 @@ /area/station/maintenance/port/aft) "sDo" = ( /turf/open/floor/iron/freezer, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "sDu" = ( /obj/effect/landmark/navigate_destination/library, /obj/machinery/door/firedoor, @@ -64497,10 +68651,20 @@ }, /turf/open/floor/wood, /area/station/service/library) +"sDD" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 8 + }, +/obj/structure/flora/bush/grassy/style_random, +/obj/machinery/camera/autoname/directional/north, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/machinery/light/small/directional/north, +/turf/open/floor/grass, +/area/station/engineering/lobby) "sDX" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -64513,6 +68677,11 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/science/lab) +"sEc" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "sEn" = ( /obj/structure/disposalpipe/trunk/multiz{ dir = 4 @@ -64527,15 +68696,6 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"sEt" = ( -/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 = 2 - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/maintenance/port) "sEI" = ( /obj/structure/tank_holder/extinguisher, /obj/machinery/camera/directional/north{ @@ -64576,6 +68736,10 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) +"sEV" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "sFa" = ( /obj/machinery/modular_computer/preset/id{ dir = 1 @@ -64609,9 +68773,6 @@ /turf/open/floor/iron, /area/station/science/lobby) "sFz" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/structure/railing/corner, /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -64619,7 +68780,9 @@ /obj/effect/turf_decal/trimline/green/filled/mid_joiner{ dir = 4 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) "sFB" = ( /obj/structure/chair/office/light{ @@ -64647,28 +68810,25 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/zoo) +"sFL" = ( +/obj/machinery/computer/station_alert{ + dir = 8 + }, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "sFQ" = ( /obj/machinery/light/floor, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) "sFS" = ( -/obj/effect/turf_decal/siding/yellow{ - dir = 8 - }, -/obj/structure/table, -/obj/item/stack/sheet/mineral/plasma{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/structure/railing{ - dir = 8 - }, -/obj/item/clothing/glasses/science, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 +/obj/machinery/camera/autoname/directional/south{ + network = list("ss13","medbay"); + c_tag = "Medbay - Upper Chemistry South" }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/red/box, /turf/open/floor/iron/dark, /area/station/medical/chemistry) "sFU" = ( @@ -64678,59 +68838,44 @@ /obj/machinery/light/directional/east, /turf/open/floor/plating, /area/station/security/execution/education) -"sFV" = ( -/obj/structure/table/reinforced, -/obj/item/gun/ballistic/shotgun/toy/crossbow, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "sFW" = ( /obj/effect/turf_decal/trimline/dark_blue/corner{ dir = 1 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"sFZ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/table, -/obj/item/clothing/head/soft/grey{ - pixel_x = -2; - pixel_y = 3 - }, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) +/area/station/ai/satellite/interior) "sGb" = ( /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/greater) "sGj" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/stripes{ + dir = 2 + }, +/turf/open/floor/iron/textured, +/area/station/command/eva) "sGy" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, /obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) +"sGD" = ( +/obj/machinery/button/door/directional/east{ + id = "chem_lockdown"; + name = "chemistry lockdown control"; + req_access = list("pharmacy") + }, +/turf/open/floor/glass/reinforced, +/area/station/medical/chemistry) "sGQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/full, /obj/effect/turf_decal/tile/dark/full, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"sGR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "sGS" = ( /obj/structure/railing{ dir = 1 @@ -64739,14 +68884,37 @@ /obj/structure/cable, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"sGT" = ( +/obj/structure/chair/pew/left{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "sGV" = ( /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/plating, /area/station/maintenance/starboard/central) +"sHh" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/turf/open/floor/wood, +/area/station/maintenance/starboard) +"sHi" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 1 + }, +/turf/open/openspace, +/area/station/maintenance/starboard/upper) +"sHr" = ( +/obj/item/assembly/mousetrap/armed, +/turf/open/floor/plating, +/area/station/maintenance/port) "sHu" = ( /obj/structure/ladder, /turf/open/floor/glass/reinforced/airless, @@ -64778,6 +68946,16 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) +"sIb" = ( +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/station/medical/break_room) "sIf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -64803,13 +68981,6 @@ /obj/machinery/light/floor/broken, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"sIn" = ( -/obj/item/stack/rods{ - amount = 7 - }, -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "sIp" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/detective{ @@ -64822,10 +68993,6 @@ }, /turf/open/floor/iron/grimy, /area/station/security/detectives_office/private_investigators_office) -"sIq" = ( -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "sIr" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/window/spawner/directional/south, @@ -64842,14 +69009,10 @@ /obj/structure/closet/secure_closet/security/sec, /turf/open/floor/iron/dark/smooth_large, /area/station/security/lockers) -"sIB" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/obj/structure/closet/toolcloset, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) +"sII" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/large, +/area/station/engineering/lobby) "sIO" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 1 @@ -64870,21 +69033,8 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/structure/sign/directions/engineering/directional/west{ - dir = 2 - }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"sIW" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/openspace, -/area/station/engineering/lobby) "sJc" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "MiniSat Maintenance" @@ -64900,7 +69050,11 @@ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) +"sJt" = ( +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/glass, +/area/station/medical/medbay/central) "sJv" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -64926,17 +69080,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/service/lawoffice) -"sJK" = ( -/obj/structure/mop_bucket{ - pixel_y = 9 - }, -/obj/item/reagent_containers/cup/bucket{ - pixel_x = 6; - pixel_y = -4 - }, -/obj/item/mop, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "sJQ" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -64944,7 +69087,9 @@ /obj/effect/turf_decal/trimline/red/filled/mid_joiner{ dir = 8 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 8 + }, /area/station/hallway/primary/central) "sJR" = ( /turf/closed/wall, @@ -64961,19 +69106,24 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) -"sKC" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/bed/medical/emergency{ - dir = 4 - }, -/obj/machinery/iv_drip, +"sKn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"sKs" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/machinery/light/directional/east, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"sKx" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/morgue) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/command/heads_quarters/ce) "sKD" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/fluff/paper/stack{ @@ -64982,22 +69132,9 @@ /turf/open/floor/carpet/black, /area/station/maintenance/hallway/abandoned_recreation) "sKF" = ( -/obj/machinery/computer/upload/ai{ - dir = 4 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/carpet/purple, -/area/station/ai_monitored/turret_protected/ai_upload) -"sKH" = ( -/obj/structure/table, -/obj/machinery/computer/arcade/orion_trail{ - desc = "For gamers only. Casuals need not apply."; - icon_screen = "library"; - icon_state = "oldcomp"; - name = "Gamer Computer" - }, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/carpet/black, +/area/station/ai/upload/chamber) "sKL" = ( /obj/structure/chair/stool/bar/directional/south, /obj/effect/landmark/start/hangover, @@ -65014,26 +69151,13 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/storage/primary) -"sKO" = ( -/obj/machinery/duct, -/obj/structure/rack, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"sKR" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/chair/office{ +"sLa" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/chair/office/light{ dir = 1 }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) -"sKT" = ( -/obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark, -/area/station/commons/dorms) +/area/station/command/bridge) "sLd" = ( /obj/effect/landmark/firealarm_sanity, /turf/open/openspace, @@ -65044,12 +69168,11 @@ }, /turf/open/floor/iron/dark, /area/station/science/cytology) -"sLx" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +"sLt" = ( +/obj/structure/closet/toolcloset, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood, +/area/station/commons/storage/tools) "sLB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -65064,10 +69187,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden/abandoned) -"sLC" = ( -/obj/structure/lattice/catwalk, -/turf/open/floor/engine/hull/air, -/area/station/hallway/primary/aft) "sLG" = ( /obj/structure/railing{ dir = 8 @@ -65076,40 +69195,49 @@ /turf/open/openspace, /area/station/hallway/primary/central) "sLK" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/item/kirbyplants/random, -/obj/machinery/status_display/supply{ - pixel_y = -32 - }, -/turf/open/floor/iron/textured, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/rubble, +/turf/open/floor/iron/dark/smooth_large, /area/station/cargo/storage) -"sLS" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -6; - pixel_y = 7 +"sLO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/obj/machinery/recharger{ - pixel_x = 7; - pixel_y = 6 +/turf/open/openspace, +/area/station/maintenance/starboard/central/upper) +"sLQ" = ( +/obj/machinery/suit_storage_unit/ce, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/obj/structure/cable, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) +"sLS" = ( /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/reagent_dispensers/wall/peppertank/directional/west, +/obj/structure/cable, +/obj/structure/table/reinforced, +/obj/item/folder/red{ + pixel_y = 11 + }, +/obj/item/pen{ + pixel_y = 8 + }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) "sLY" = ( -/turf/open/floor/engine/hull/air, -/area/station/command/meeting_room/council) -"sMa" = ( -/obj/effect/mapping_helpers/burnt_floor, -/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, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, /turf/open/floor/iron/dark, -/area/station/engineering/hallway) +/area/station/command/bridge) "sMp" = ( /obj/item/paint/violet{ pixel_x = -7; @@ -65121,6 +69249,13 @@ }, /turf/open/floor/glass/reinforced, /area/station/service/library) +"sMr" = ( +/obj/machinery/mineral/stacking_unit_console{ + pixel_x = 32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "sMt" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65129,16 +69264,34 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison) -"sMw" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Gravity Generator Room" +"sMv" = ( +/obj/structure/cable, +/obj/machinery/power/smes, +/turf/open/floor/glass/reinforced, +/area/station/maintenance/solars/port/aft) +"sMy" = ( +/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/item/clothing/gloves/color/black, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 5 + }, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 5 + }, +/obj/item/clothing/gloves/color/black, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/structure/table/reinforced, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"sMK" = ( /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "sMQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -65162,7 +69315,20 @@ /turf/open/floor/iron/dark/textured_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) +"sNj" = ( +/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, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"sNz" = ( +/obj/structure/sign/flag/nanotrasen/directional/east, +/turf/open/floor/iron, +/area/station/commons/dorms) "sNC" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -65171,6 +69337,13 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"sNF" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "sNG" = ( /obj/machinery/conveyor{ dir = 4; @@ -65180,6 +69353,7 @@ dir = 8 }, /obj/effect/decal/cleanable/blood/oil, +/obj/effect/turf_decal/stripes/red/box, /turf/open/floor/plating, /area/station/maintenance/disposal) "sNN" = ( @@ -65189,27 +69363,30 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"sNW" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"sNT" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/machinery/airalarm/directional/south, +/obj/machinery/computer/records/security{ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) +/area/station/security/checkpoint/engineering) "sOa" = ( /obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 4 - }, /obj/effect/turf_decal/siding/blue/corner{ dir = 8 }, -/turf/open/floor/engine/hull/air, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace, /area/station/medical/medbay/central) -"sOl" = ( -/obj/effect/spawner/random/trash/mess, -/obj/item/stack/rods/two, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +"sOm" = ( +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/aft/upper) "sOn" = ( /turf/open/floor/engine, /area/station/science/auxlab/firing_range) @@ -65219,14 +69396,11 @@ }, /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat_interior) -"sOw" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/structure/closet/crate/trashcart/laundry, -/obj/effect/spawner/random/clothing/backpack, -/obj/effect/spawner/random/clothing/backpack, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) +/area/station/ai/satellite/interior) +"sOy" = ( +/obj/item/kirbyplants/photosynthetic, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "sOz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65250,6 +69424,40 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/service/cafeteria) +"sOU" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) +"sOV" = ( +/obj/structure/reflector/double{ + dir = 6 + }, +/obj/machinery/light/directional/north, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"sPc" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical{ + pixel_y = 2 + }, +/obj/item/storage/belt/medical{ + pixel_y = 4 + }, +/obj/item/storage/belt/medical{ + pixel_y = 6 + }, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "sPg" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 @@ -65264,20 +69472,27 @@ /obj/machinery/rnd/production/protolathe/department/science, /turf/open/floor/iron/dark, /area/station/science/lobby) -"sPk" = ( -/obj/structure/ladder, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) -"sPp" = ( +"sPl" = ( +/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/blood/oil, -/obj/item/cigbutt{ - pixel_x = -12; - pixel_y = 11 +/obj/effect/landmark/start/hangover, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/machinery/duct, +/turf/open/floor/catwalk_floor/iron, +/area/station/commons/dorms) +"sPr" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/openspace, +/area/station/maintenance/aft/upper) "sPt" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/preopen, @@ -65317,10 +69532,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) -"sPC" = ( -/obj/machinery/holopad, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "sPT" = ( /obj/structure/rack, /obj/effect/spawner/random/food_or_drink, @@ -65340,7 +69551,7 @@ "sQg" = ( /obj/effect/turf_decal/siding/dark, /turf/open/floor/iron/white/textured_half, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "sQi" = ( /obj/machinery/photocopier/prebuilt, /obj/machinery/requests_console/directional/north{ @@ -65350,6 +69561,23 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/wood, /area/station/service/lawoffice) +"sQp" = ( +/obj/structure/broken_flooring/singular/directional/east, +/turf/open/floor/plating, +/area/station/engineering/storage_shared) +"sQs" = ( +/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/effect/mapping_helpers/airlock/access/all/medical/morgue, +/obj/machinery/door/airlock/maintenance{ + name = "Morgue Maintenance" + }, +/turf/open/floor/plating, +/area/station/medical/morgue) "sQu" = ( /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) @@ -65396,6 +69624,37 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"sQK" = ( +/obj/effect/turf_decal/trimline/red, +/obj/effect/turf_decal/trimline/red/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/mid_joiner, +/obj/effect/turf_decal/trimline/red/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/mid_joiner{ + dir = 4 + }, +/obj/item/cigbutt{ + pixel_x = 7; + pixel_y = 14 + }, +/obj/item/cigbutt{ + pixel_x = 1; + pixel_y = 1 + }, +/obj/item/cigbutt{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/item/cigbutt{ + pixel_x = -9; + pixel_y = -2 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "sQW" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/frame/computer{ @@ -65411,17 +69670,6 @@ }, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"sQZ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/sign/warning/radiation/rad_area/directional/north, -/turf/open/openspace, -/area/station/hallway/primary/starboard) -"sRd" = ( -/obj/machinery/power/turbine/turbine_outlet{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) "sRg" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -65440,13 +69688,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port) -"sRj" = ( -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/openspace, -/area/station/engineering/break_room) "sRn" = ( /obj/structure/table/reinforced, /obj/item/multitool{ @@ -65478,6 +69719,15 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/security/courtroom) +"sRD" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/port) "sRE" = ( /turf/closed/wall, /area/station/command/heads_quarters/ce) @@ -65494,22 +69744,17 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"sRP" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/openspace, -/area/station/engineering/atmos/project) "sRY" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/port/greater) "sSc" = ( -/obj/structure/railing, /obj/effect/landmark/event_spawn, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/machinery/light/floor, +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "sSs" = ( /obj/structure/chair/office/light, /obj/effect/landmark/start/research_director, @@ -65527,6 +69772,20 @@ "sSw" = ( /turf/closed/wall, /area/station/security/detectives_office) +"sSx" = ( +/obj/machinery/computer/atmos_control/nitrogen_tank, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"sSy" = ( +/obj/structure/lattice/catwalk, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/openspace, +/area/station/maintenance/aft/upper) "sSz" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -65537,10 +69796,8 @@ /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 2 - }, -/obj/effect/mapping_helpers/mail_sorting/medbay/cmo_office, +/obj/machinery/camera/autoname/directional/east, +/obj/item/radio/intercom/directional/east, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "sSG" = ( @@ -65559,11 +69816,6 @@ /obj/effect/spawner/random/trash/cigbutt, /turf/open/floor/carpet, /area/station/maintenance/starboard/aft) -"sSR" = ( -/obj/machinery/vending/coffee, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "sSW" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -65578,7 +69830,7 @@ /obj/item/storage/dice{ pixel_y = 8 }, -/turf/open/floor/wood, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) "sTa" = ( /obj/structure/table/wood/fancy/red, @@ -65603,26 +69855,17 @@ /obj/structure/lattice, /turf/open/openspace, /area/station/maintenance/port/aft) +"sTp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/structure/rack, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "sTv" = ( /turf/closed/wall, /area/station/security/courtroom) -"sTS" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "sTT" = ( -/obj/structure/railing/corner/end/flip{ - dir = 4 - }, /obj/structure/broken_flooring/pile/directional/east, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 4 - }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, /turf/open/floor/plating, /area/station/maintenance/port/aft) "sUa" = ( @@ -65631,17 +69874,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/aisat/exterior) -"sUi" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/duct, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) +/area/station/ai/satellite/exterior) "sUm" = ( /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark/textured_corner{ @@ -65669,6 +69902,13 @@ }, /turf/open/floor/iron/dark, /area/station/security/warden) +"sUw" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "sUx" = ( /turf/open/openspace, /area/station/service/chapel) @@ -65690,6 +69930,26 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) +"sUH" = ( +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 + }, +/obj/machinery/newscaster/directional/west, +/obj/structure/closet/firecloset, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"sUK" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/structure/cable, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "sUM" = ( /obj/effect/turf_decal/box/white{ color = "#EFB341" @@ -65701,10 +69961,6 @@ /obj/effect/mapping_helpers/turn_off_lights_with_lightswitch, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"sUV" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "sUW" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -65713,13 +69969,26 @@ }, /turf/open/openspace, /area/station/engineering/lobby) -"sVb" = ( -/obj/item/wrench, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/commons/dorms) +"sUY" = ( +/obj/machinery/atmospherics/pipe/multiz/cyan/visible{ + dir = 2; + name = "Air Mix Multideck Adapter" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/meter{ + name = "Mix Meter" + }, +/obj/effect/turf_decal/box/white, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"sVc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/openspace, +/area/station/maintenance/starboard/upper) "sVj" = ( -/obj/structure/cable, /obj/machinery/vending/sustenance{ req_access = list("command") }, @@ -65727,6 +69996,19 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/maintenance/central) +"sVo" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/glass{ + amount = 12 + }, +/obj/item/stack/cable_coil{ + pixel_x = -1; + pixel_y = -3 + }, +/obj/item/extinguisher/mini, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "sVq" = ( /obj/machinery/door/airlock{ id_tag = "restroom_2"; @@ -65735,10 +70017,6 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) -"sVA" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "sVG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -65755,23 +70033,45 @@ /obj/effect/spawner/random/contraband/permabrig_weapon, /turf/open/floor/iron/dark, /area/station/security/evidence) +"sVO" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/effect/turf_decal/trimline/brown/arrow_cw{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "sWg" = ( /obj/effect/turf_decal/box/corners{ dir = 8 }, /turf/open/floor/engine/hull, /area/space/nearstation) +"sWl" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "sWr" = ( /obj/machinery/door/airlock/mining{ name = "Inner Maintenance" }, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/iron/dark, /area/station/construction/storage_wing) +"sWH" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/commons/locker) "sWI" = ( /obj/machinery/camera/autoname/directional/south, /obj/structure/disposalpipe/segment{ @@ -65786,6 +70086,14 @@ /obj/effect/spawner/structure/window/hollow/middle, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"sWM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "sWN" = ( /obj/structure/closet/crate/bin, /obj/effect/spawner/random/maintenance, @@ -65801,9 +70109,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) +"sWX" = ( +/obj/structure/sign/warning/electric_shock/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "sWY" = ( /obj/structure/cable, +/obj/effect/spawner/random/trash/mess, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/disposal) "sXd" = ( @@ -65816,25 +70130,41 @@ }, /turf/open/floor/wood/large, /area/station/medical/psychology) +"sXf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/lobby) "sXj" = ( /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/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "sXk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, /obj/effect/turf_decal/tile/red/opposingcorners{ 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/dark, /area/station/security/checkpoint/supply) "sXq" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) +"sXu" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "packageSort2"; + name = "Belt Conveyor" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/sorting) "sXI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/public/glass{ @@ -65852,6 +70182,7 @@ "sXU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/smartfridge/organ, +/obj/structure/sign/departments/medbay/alt/directional/north, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/port) "sYc" = ( @@ -65862,17 +70193,14 @@ /obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/openspace, -/area/station/command/bridge) -"sYg" = ( -/obj/machinery/modular_computer/preset/civilian{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) +/area/station/command/meeting_room/council) +"sYh" = ( +/obj/machinery/firealarm/directional/north, +/obj/structure/filingcabinet/medical, +/turf/open/floor/engine/hull/air, +/area/station/medical/medbay/central) "sYo" = ( /obj/item/radio/intercom/directional/west, /obj/machinery/light/directional/west, @@ -65896,34 +70224,36 @@ /obj/effect/spawner/random/engineering/tool, /turf/open/floor/plating, /area/station/construction/storage_wing) -"sZh" = ( -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) +"sZi" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "sZj" = ( /turf/open/floor/iron/stairs/medium{ dir = 1 }, /area/station/science/xenobiology) -"sZn" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/structure/table/glass, -/obj/machinery/light/directional/south, -/obj/machinery/camera/autoname/directional/south{ - network = list("ss13","medbay"); - c_tag = "Medbay - Lower South Treatment Center" +"sZk" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 }, -/obj/item/wrench/medical{ - pixel_x = -1; - pixel_y = 2 +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 1 }, -/obj/item/assembly/timer{ - pixel_x = 3; - pixel_y = 3 +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"sZn" = ( +/obj/structure/chair/office/light{ + dir = 1 }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/iron/white, +/area/station/medical/office) "sZr" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line{ @@ -65943,17 +70273,17 @@ /obj/effect/turf_decal/trimline/purple/filled/mid_joiner, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) -"sZu" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 1 - }, -/obj/machinery/meter, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/upper) "sZy" = ( /obj/structure/table, /turf/open/floor/glass, /area/station/science/zoo) +"sZA" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) "sZL" = ( /obj/structure/marker_beacon/yellow, /obj/effect/decal/cleanable/dirt/dust, @@ -65979,36 +70309,58 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) -"tah" = ( -/obj/effect/spawner/random/trash/mess, -/obj/item/toy/crayon/spraycan{ - pixel_x = 12; - pixel_y = 13 - }, +"taf" = ( +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/effect/spawner/random/structure/crate, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "tai" = ( -/obj/structure/rack, -/obj/item/ai_module/reset{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/item/ai_module/supplied/freeform{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/item/multitool{ - pixel_x = -4; - pixel_y = -2 - }, /obj/structure/railing/corner{ dir = 8 }, +/obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) +"tan" = ( +/obj/effect/turf_decal/tile/blue/half, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"tao" = ( +/obj/item/clothing/head/wig/random, +/obj/item/bodypart/head/lizard, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "tas" = ( /turf/closed/wall, /area/station/command/heads_quarters/qm) +"tau" = ( +/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, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=9-Bridge"; + location = "8-Kitchen" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/catwalk_floor/iron, +/area/station/hallway/primary/central) +"taB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/flag/mothic/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "taF" = ( /obj/structure/railing{ dir = 4 @@ -66022,11 +70374,10 @@ /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "taG" = ( -/obj/structure/chair/sofa/corp/left, -/obj/item/pai_card, -/obj/machinery/light/directional/north, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) +/obj/structure/table/optable, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/floor/iron/showroomfloor, +/area/station/medical/surgery) "taJ" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -66037,11 +70388,11 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) "taS" = ( -/obj/structure/chair/office/light, -/obj/effect/landmark/start/chemist, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 1 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 }, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "taX" = ( /obj/item/vending_refill/boozeomat{ @@ -66071,11 +70422,10 @@ /obj/machinery/atmospherics/components/binary/pump/off/orange/visible, /turf/open/floor/plating, /area/station/engineering/supermatter) -"tbf" = ( -/obj/structure/chair/stool/directional/north, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +"tbg" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/department/crew_quarters/dorms) "tbh" = ( /obj/effect/turf_decal/siding/dark, /obj/effect/turf_decal/siding/dark{ @@ -66083,17 +70433,27 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "tbu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay Entrance" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/full, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 }, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/medbay/central) +"tbv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "tbw" = ( /obj/effect/landmark/start/hangover, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66107,11 +70467,25 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/eighties/red, /area/station/maintenance/hallway/abandoned_recreation) -"tbI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"tbE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"tbO" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/turf_decal/weather/snow, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/medical/coldroom) +"tbU" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/upper) "tbY" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -66160,12 +70534,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/chapel/office) +"tck" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/radio/off{ + pixel_x = 6 + }, +/obj/item/phone{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/floor/wood/large, +/area/station/engineering/lobby) "tcr" = ( -/obj/structure/stairs/south, -/obj/structure/railing{ - dir = 8 +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 }, -/obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/cargo/storage) "tcs" = ( @@ -66182,11 +70569,17 @@ /obj/structure/light_construct/directional/east, /turf/open/openspace, /area/station/maintenance/port/aft) -"tcz" = ( -/obj/effect/spawner/random/decoration/showcase, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) +"tcB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 1; + pixel_y = -2 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "tcG" = ( /obj/effect/spawner/random/structure/shipping_container, /turf/open/floor/plating, @@ -66196,18 +70589,24 @@ /obj/item/pen/blue, /obj/item/pen/charcoal, /obj/structure/closet, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/station/maintenance/port/aft) -"tdt" = ( -/obj/structure/chair/sofa/right/brown, -/obj/item/pillow, -/obj/item/toy/plush/moth{ - name = "Mender Moff" +"tde" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 }, -/obj/structure/sign/poster/official/get_your_legs/directional/north, -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet/black, -/area/station/medical/psychology) +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"tdl" = ( +/obj/structure/lattice/catwalk, +/obj/structure/filingcabinet, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/openspace, +/area/station/maintenance/aft/upper) "tdx" = ( /obj/structure/cable, /obj/machinery/power/emitter/welded, @@ -66217,16 +70616,14 @@ /obj/structure/broken_flooring/corner/directional/west, /turf/open/floor/plating, /area/station/engineering/storage_shared) -"tdN" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"tdT" = ( +"tdH" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/maintenance/department/crew_quarters/dorms) "tdV" = ( /obj/docking_port/stationary{ dir = 4; @@ -66264,39 +70661,28 @@ /obj/structure/railing{ dir = 8 }, +/obj/structure/cable, /turf/open/openspace, -/area/station/command/bridge) -"tep" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/arrow_cw{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"ter" = ( -/obj/effect/spawner/structure/window, -/obj/structure/disposalpipe/segment{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/command/meeting_room/council) "tev" = ( /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/wood, /area/station/service/library) "tey" = ( +/obj/structure/sign/poster/contraband/communist_state/directional/north, +/obj/effect/decal/cleanable/crayon{ + icon_state = "body"; + name = "body"; + pixel_x = 12; + pixel_y = 1 + }, /obj/structure/cable, -/turf/closed/wall/r_wall, -/area/station/command/heads_quarters/cmo) +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) "teA" = ( /obj/structure/railing, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "teC" = ( /obj/structure/chair/sofa/left/brown{ dir = 1 @@ -66309,11 +70695,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"teV" = ( -/obj/effect/turf_decal/bot_white, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/gravity_generator) "teY" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -66325,21 +70706,22 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"teZ" = ( -/obj/structure/cable, -/turf/closed/wall, -/area/station/security/courtroom) +"tfo" = ( +/obj/structure/cable/multilayer/multiz, +/turf/open/floor/plating, +/area/station/engineering/atmos/office) "tfp" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"tfr" = ( -/obj/structure/railing{ - dir = 10 +"tfq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/showcase/machinery/cloning_pod{ + desc = "An old prototype cloning pod, permanently decommissioned following the incident."; + name = "decommissioned cloner" }, -/obj/machinery/light/small/dim/directional/north, -/turf/open/water, -/area/station/maintenance/port/fore) +/turf/open/floor/iron/white, +/area/station/maintenance/starboard) "tfv" = ( /obj/machinery/door/airlock/silver{ aiControlDisabled = 1; @@ -66353,13 +70735,6 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/command/gateway) -"tfy" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light_switch/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) "tfK" = ( /turf/open/floor/glass, /area/station/service/kitchen) @@ -66379,33 +70754,17 @@ icon_state = "carpet-38" }, /area/station/service/abandoned_gambling_den) -"tgp" = ( -/obj/effect/spawner/random/entertainment/arcade{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "tgz" = ( /obj/effect/landmark/firealarm_sanity, /turf/open/openspace, /area/station/service/chapel) -"tgE" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 2 - }, -/obj/effect/mapping_helpers/mail_sorting/medbay/general, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "tgT" = ( /obj/machinery/holopad, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"tgV" = ( -/turf/open/floor/carpet, -/area/station/service/chapel) +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/turf/open/floor/iron/textured, +/area/station/command/eva) "thb" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 4 @@ -66422,7 +70781,7 @@ id = "teleportshutters" }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "thf" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -66432,12 +70791,6 @@ }, /turf/open/floor/iron, /area/station/science/lab) -"thk" = ( -/obj/item/trash/can{ - pixel_x = -8 - }, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/fore) "tho" = ( /obj/structure/flora/bush/ferny/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -66463,6 +70816,12 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"thY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/engineering/storage) "tia" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock{ @@ -66481,6 +70840,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/space/openspace, /area/space/nearstation) +"tie" = ( +/obj/machinery/duct, +/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/freezer, +/area/station/commons/toilet/restrooms) +"tio" = ( +/obj/structure/urinal/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"tip" = ( +/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/starboard/aft/upper) "tis" = ( /turf/open/floor/iron, /area/station/maintenance/port/greater) @@ -66494,19 +70872,57 @@ /obj/machinery/door/airlock/grunge{ name = "Under The Stairs" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"tiG" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line, +/obj/effect/landmark/start/hangover, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "tiK" = ( -/obj/effect/spawner/structure/window/reinforced/tinted, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/disposal/delivery_chute{ + dir = 8; + name = "Disposal Chute" + }, +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/east, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/plasticflaps, +/turf/open/floor/iron/textured_large, +/area/station/cargo/sorting) +"tiN" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "tja" = ( /obj/machinery/light/cold/directional/north, /turf/open/floor/engine, /area/station/science/xenobiology) +"tje" = ( +/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/spawner/random/engineering/tracking_beacon, +/obj/machinery/duct, +/obj/effect/landmark/event_spawn, +/turf/open/floor/catwalk_floor/iron, +/area/station/commons/dorms) "tjg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -66516,28 +70932,21 @@ /obj/structure/closet/secure_closet/personal, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) -"tji" = ( -/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/junction, -/turf/open/floor/iron/dark/textured_large, -/area/station/maintenance/port) "tjn" = ( /turf/open/openspace, /area/station/hallway/secondary/entry) -"tjt" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/north, -/obj/machinery/power/energy_accumulator/tesla_coil/anchored{ - cable_layer = 1 +"tjx" = ( +/obj/effect/turf_decal/siding{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 9 +/obj/effect/turf_decal/trimline/white/line{ + dir = 1 }, -/obj/structure/cable/layer1, -/turf/open/floor/engine, -/area/station/engineering/supermatter) +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "tjA" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66546,6 +70955,14 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"tjB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/pai_card{ + pixel_y = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "tjM" = ( /obj/machinery/door/airlock/maintenance{ name = "Research Maintenance" @@ -66564,10 +70981,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"tkh" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) "tkk" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -66582,6 +70995,9 @@ "tkm" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/spawner/random/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "tkn" = ( @@ -66598,15 +71014,14 @@ name = "Custom Channel" }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) -"tkz" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/structure/railing/corner{ - dir = 8 +/area/station/ai/satellite/chamber) +"tks" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "tkK" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment{ @@ -66626,18 +71041,13 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/security/prison/mess) -"tkV" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "tkX" = ( -/obj/structure/bodycontainer/morgue{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/morgue) +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/openspace, +/area/station/hallway/primary/starboard) "tkY" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -66646,6 +71056,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"tla" = ( +/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/supermatter/room/upper) "tlb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66666,41 +71081,12 @@ dir = 8 }, /area/station/tcommsat/server) -"tlf" = ( -/obj/machinery/portable_atmospherics/scrubber/huge/movable, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"tlh" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Primary Tool Storage" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"tls" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/west, -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/turf/open/space/openspace, -/area/space/nearstation) "tlL" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/closet/l3closet/security, /turf/open/floor/iron/dark, /area/station/security/office) -"tlQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port) "tma" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/ferny/style_random, @@ -66716,42 +71102,38 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/carpet, /area/station/maintenance/starboard/aft) -"tmq" = ( -/obj/structure/lattice/catwalk, -/obj/item/clothing/under/costume/seifuku{ - pixel_y = -1 +"tmG" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 }, -/obj/structure/table, -/obj/structure/sign/poster/official/pda_ad/directional/south, -/turf/open/openspace, -/area/station/maintenance/starboard/fore) -"tms" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) -"tmM" = ( -/obj/machinery/conveyor{ +/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/engineering/lobby) +"tmK" = ( +/obj/effect/turf_decal/trimline/white/line{ dir = 8; - id = "cargounload" + pixel_x = 8 }, -/obj/structure/cable, -/obj/structure/railing/corner/end/flip{ - dir = 4 +/obj/effect/turf_decal/trimline/white/line{ + dir = 1 }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) +"tmM" = ( +/obj/structure/cable, /obj/structure/railing/corner/end{ dir = 4 }, /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/cargo/storage) -"tmO" = ( -/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/starboard/fore) "tmS" = ( /obj/machinery/newscaster/directional/north, /obj/structure/table, @@ -66770,6 +71152,32 @@ /obj/machinery/camera/directional/north, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) +"tmT" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood, +/area/station/commons/dorms) +"tmZ" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/engine_access, +/obj/effect/mapping_helpers/airalarm/link{ + chamber_id = "engine" + }, +/obj/effect/mapping_helpers/airalarm/tlv_no_checks, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "tna" = ( /obj/structure/fermenting_barrel/gunpowder, /obj/effect/decal/cleanable/greenglow, @@ -66783,22 +71191,35 @@ /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "tnf" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, +/obj/machinery/computer/robotics, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"tnh" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) +"tni" = ( /obj/structure/railing{ dir = 8 }, -/obj/structure/bookcase/random/reference, +/obj/item/kirbyplants/random, /obj/machinery/door/firedoor/border_only{ dir = 8 }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, /turf/open/floor/wood, -/area/station/command/meeting_room/council) -"tnh" = ( -/obj/structure/table/reinforced, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/commons/toilet/restrooms) +"tns" = ( +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "tnt" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, @@ -66816,6 +71237,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/service/chapel) +"tnJ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/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/engineering/supermatter/room/upper) "tnM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66828,29 +71256,10 @@ /area/station/hallway/secondary/service) "tnS" = ( /obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"tnX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/mapping_helpers/burnt_floor, -/obj/machinery/holopad, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) -"tnY" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Engineering Project Room" + dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/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/cable, -/turf/open/floor/engine, -/area/station/engineering/storage_shared) +/turf/open/floor/plating/airless, +/area/space/nearstation) "toh" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -66863,21 +71272,15 @@ /obj/structure/disposalpipe/segment{ dir = 2 }, +/obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/medical/virology) "toj" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, -/obj/item/radio/intercom/directional/west, /obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ - dir = 1 - }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "tom" = ( /obj/machinery/computer/camera_advanced/xenobio{ dir = 4 @@ -66917,8 +71320,32 @@ dir = 4 }, /obj/machinery/door/firedoor, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) +"toT" = ( +/obj/machinery/mineral/ore_redemption{ + dir = 4; + input_dir = 4; + output_dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Cargo Lockdown Shutters"; + id = "cargolockdown"; + dir = 8 + }, +/obj/structure/railing{ + dir = 8; + color = "#36373a" + }, +/obj/structure/railing{ + dir = 4; + color = "#36373a" + }, +/obj/effect/turf_decal/bot_red, +/obj/machinery/camera/directional/north, +/turf/open/floor/iron/textured_large, +/area/station/cargo/sorting) "tpe" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -66945,7 +71372,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 1 }, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "tpj" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/sign/poster/contraband/grey_tide/directional/west, @@ -66961,10 +71388,29 @@ /obj/effect/turf_decal/stripes/end, /turf/open/floor/plating/elevatorshaft, /area/station/security/prison) -"tpA" = ( +"tpB" = ( +/obj/machinery/door/airlock{ + name = "Kitchen" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/turf/open/floor/wood, +/area/station/maintenance/starboard) +"tpI" = ( +/obj/machinery/meter{ + name = "Mix Meter" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"tpJ" = ( +/obj/structure/lattice/catwalk, /obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/turf/open/openspace, +/area/station/security/checkpoint/supply) "tpO" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/structure/table, @@ -66974,6 +71420,15 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) +"tpR" = ( +/obj/effect/landmark/blobstart, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "tpU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, @@ -66984,18 +71439,48 @@ }, /turf/open/floor/wood, /area/station/hallway/primary/central) -"tqQ" = ( -/turf/open/floor/iron/dark, -/area/station/commons/dorms) -"tqU" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/atmospherics, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) -"trH" = ( -/obj/effect/landmark/event_spawn, -/turf/open/openspace, -/area/station/hallway/secondary/service) +"tqg" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/end{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/binoculars{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/item/clothing/glasses/hud/health{ + pixel_x = 3; + pixel_y = -1 + }, +/turf/open/floor/holofloor/dark, +/area/station/command/heads_quarters/cmo) +"tqq" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/computer/crew, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"tqv" = ( +/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 = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/fore) +"trv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "trK" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on, /obj/item/reagent_containers/cup/glass/shaker{ @@ -67012,10 +71497,19 @@ }, /turf/open/floor/iron, /area/station/science/lobby) -"trR" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +"trZ" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/end, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 + }, +/obj/item/kirbyplants/photosynthetic, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "tsd" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -67026,22 +71520,38 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/large, /area/station/service/library) -"tse" = ( -/obj/effect/turf_decal/siding/dark{ - dir = 1 - }, -/turf/closed/wall/r_wall, -/area/station/engineering/transit_tube) "tsl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/random/directional/north, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/obj/machinery/modular_computer/preset/id, +/obj/machinery/requests_console/auto_name/directional/north, +/obj/effect/mapping_helpers/requests_console/ore_update, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/information, +/obj/machinery/light/warm/dim/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "tso" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"tsp" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"tsA" = ( +/obj/structure/chair/sofa/corner/brown, +/obj/item/instrument/eguitar, +/obj/structure/sign/poster/contraband/space_cube/directional/north, +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/eighties, +/area/station/maintenance/department/crew_quarters/dorms) "tsI" = ( /obj/machinery/light_switch/directional/south, /obj/machinery/disposal/bin, @@ -67061,34 +71571,71 @@ /obj/effect/turf_decal/tile/dark_blue/fourcorners, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"tsR" = ( -/obj/structure/closet/crate/trashcart/filled, -/obj/effect/spawner/random/maintenance/no_decals/five, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +"tsV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/sign/poster/contraband/rebels_unite/directional/west, +/obj/item/ammo_casing/spent{ + pixel_x = 8; + pixel_y = 6 + }, +/obj/item/ammo_casing/spent{ + pixel_x = -11; + pixel_y = -5 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) "ttj" = ( /turf/open/floor/iron, /area/station/hallway/primary/port) +"ttk" = ( +/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, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "ttm" = ( /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/textured_large, /area/station/security/prison) +"ttn" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "ttr" = ( +/obj/machinery/airalarm/directional/west, /obj/structure/table/reinforced, -/obj/item/reagent_containers/dropper{ - pixel_y = -4 +/obj/item/storage/box/beakers{ + pixel_y = 7; + pixel_x = -5 }, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/trimline/yellow/filled/line{ +/obj/item/storage/box/gloves{ + pixel_x = 10; + pixel_y = 9 + }, +/obj/item/assembly/igniter{ + pixel_y = -3 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ dir = 1 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) +"ttw" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "ttA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -67096,13 +71643,6 @@ /turf/open/floor/carpet, /area/station/security/detectives_office) "ttC" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/beakers{ - pixel_y = 7 - }, -/obj/item/assembly/igniter{ - pixel_y = -3 - }, /obj/machinery/firealarm/directional/north, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -67110,8 +71650,16 @@ /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ dir = 1 }, +/obj/structure/rack, +/obj/item/reagent_containers/cup/bottle/iodine{ + pixel_x = 1 + }, +/obj/item/reagent_containers/cup/bottle/fluorine{ + pixel_x = 7; + pixel_y = 3 + }, /turf/open/floor/iron/dark/smooth_large, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "ttK" = ( /obj/machinery/conveyor/auto{ dir = 4; @@ -67122,20 +71670,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"tub" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/item/ammo_casing/spent{ - pixel_x = -6; - pixel_y = 6 - }, +"tua" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/camera/autoname/directional/east, /turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"tuj" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/fore/upper) "tuk" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -67149,21 +71688,6 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) -"tul" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/landmark/start/station_engineer, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/engineering/lobby) -"tuw" = ( -/obj/structure/sign/departments/restroom/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "tuA" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/contraband/prison{ @@ -67178,36 +71702,28 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) -"tuD" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 10 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) "tuF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair, -/obj/item/trash/can{ - pixel_x = -10; - pixel_y = -14 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) -"tuJ" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "tuV" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets/donkpocketberry{ - pixel_y = 6 +/obj/machinery/camera/autoname/directional/south, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "tuY" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -67218,22 +71734,12 @@ /turf/open/floor/iron, /area/station/science/research) "tvN" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/table/glass, -/obj/item/aicard{ - pixel_x = 3 - }, -/obj/item/assembly/timer{ - pixel_y = -11 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "tvU" = ( /obj/machinery/newscaster/directional/east, /obj/effect/turf_decal/tile/dark_blue{ @@ -67243,30 +71749,17 @@ /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) "twp" = ( -/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/dark, -/area/station/ai_monitored/command/storage/eva) -"twv" = ( -/obj/structure/closet, -/obj/effect/landmark/start/hangover/closet, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/stripes{ + dir = 8 }, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction) +/turf/open/floor/iron/textured, +/area/station/command/eva) "twz" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/station/solars/port/aft) -"twC" = ( -/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) "twD" = ( /obj/effect/spawner/random/trash/graffiti{ pixel_x = -32 @@ -67278,22 +71771,28 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) -"twX" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ +"twO" = ( +/obj/effect/turf_decal/trimline/white/corner, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/obj/structure/disposalpipe/segment{ dir = 4 }, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) +"twX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, /turf/open/floor/iron, /area/station/cargo/storage) -"twY" = ( -/obj/structure/cable, -/turf/closed/wall/r_wall, -/area/station/engineering/transit_tube) "txe" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/west, @@ -67305,49 +71804,63 @@ pixel_y = -2 }, /turf/open/floor/grass, -/area/station/ai_monitored/turret_protected/aisat_interior) -"txs" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/structure/railing/corner, -/obj/structure/railing/corner{ +/area/station/ai/satellite/interior) +"txm" = ( +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/decal/cleanable/dirt, +/obj/structure/barricade/wooden/crude, +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/openspace, -/area/station/engineering/lobby) -"txu" = ( -/obj/structure/railing{ - dir = 8 +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/door/airlock/command{ + name = "Abandoned Lab" }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"txp" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 }, -/obj/structure/table, -/obj/item/cigbutt{ - pixel_y = 2 +/obj/structure/frame/computer{ + anchored = 1 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) +"txu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "txv" = ( /turf/open/floor/engine/hull/air, /area/station/maintenance/port/aft) "txz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/graffiti, -/obj/structure/sign/poster/contraband/random/directional/west, +/obj/structure/chair/sofa/corner/brown{ + dir = 8 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/cargo/storage) +"txF" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 6 + }, +/obj/machinery/meter, /turf/open/floor/iron, -/area/station/hallway/secondary/construction) +/area/station/engineering/atmos/upper) "txH" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "txJ" = ( /obj/structure/railing, @@ -67363,12 +71876,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"txT" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/ladder, -/obj/structure/fluff/paper/corner, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "typ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -67383,6 +71890,11 @@ /obj/effect/landmark/start/clown, /turf/open/floor/wood/large, /area/station/service/theater_dressing) +"tyv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction) "tyw" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -67400,41 +71912,31 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron/checker, /area/station/maintenance/hallway/abandoned_recreation) -"tyY" = ( -/obj/machinery/camera/autoname/directional/north, -/obj/structure/cable, -/obj/structure/sign/warning/radiation/rad_area/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"tza" = ( -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/dinner, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) "tzi" = ( /obj/effect/spawner/random/trash/grime, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/station/maintenance/port) "tzv" = ( -/obj/structure/chair{ - dir = 8 +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -5; + pixel_y = 0 }, /turf/open/floor/engine/hull, /area/space/nearstation) -"tzO" = ( -/obj/structure/chair/office/light, -/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) +"tzK" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/emergency, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "tzS" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "tzU" = ( /obj/item/transfer_valve{ @@ -67473,27 +71975,37 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, /area/station/maintenance/port) -"tAr" = ( -/obj/structure/toilet{ - dir = 4 +"tAe" = ( +/obj/effect/turf_decal/siding{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/white/line{ + dir = 1 }, -/obj/machinery/light/small/directional/west, -/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/freezer, -/area/station/commons/dorms) +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "tAs" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) +"tAv" = ( +/obj/structure/lattice/catwalk, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/engine/hull/air, +/area/station/engineering/supermatter/room/upper) "tAF" = ( /obj/structure/broken_flooring/singular/directional/west, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -67539,18 +72051,19 @@ }, /turf/open/floor/iron/dark, /area/station/security/evidence) -"tAV" = ( -/obj/effect/spawner/random/engineering/tank, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"tBa" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, +"tAX" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/obj/machinery/power/energy_accumulator/grounding_rod/anchored, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter) +"tBb" = ( +/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/security/detectives_office/private_investigators_office) +/area/station/maintenance/starboard/fore/upper) "tBc" = ( /obj/machinery/door/poddoor/shutters{ id = "qm_warehouse"; @@ -67563,12 +72076,6 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) -"tBh" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) "tBn" = ( /obj/structure/chair/office{ dir = 8 @@ -67579,6 +72086,7 @@ /obj/effect/turf_decal/siding/green{ dir = 4 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "tBr" = ( @@ -67588,13 +72096,35 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/security/prison) +"tBs" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/commons/dorms) "tBt" = ( /obj/machinery/light/directional/east, /obj/structure/sign/painting/library{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/glass/reinforced, /area/station/service/library) +"tBB" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/obj/machinery/air_sensor/mix_tank, +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos/upper) +"tBE" = ( +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/storage/box{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/structure/table, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "tBJ" = ( /obj/effect/decal/cleanable/dirt, /obj/item/kirbyplants/photosynthetic, @@ -67635,12 +72165,6 @@ dir = 1 }, /area/station/cargo/bitrunning/den) -"tCd" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/hallway) "tCf" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -67649,6 +72173,27 @@ }, /turf/open/floor/plating, /area/station/command/heads_quarters/rd) +"tCh" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/openspace, +/area/station/maintenance/aft/upper) +"tCl" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"tCm" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "tCs" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -67662,6 +72207,12 @@ /obj/effect/decal/cleanable/greenglow, /turf/open/floor/iron/white, /area/station/maintenance/hallway/abandoned_recreation) +"tCt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/hangover, +/obj/structure/sign/calendar/directional/east, +/turf/open/floor/iron, +/area/station/commons/dorms) "tCz" = ( /obj/item/radio/intercom/directional/west, /obj/structure/table, @@ -67693,52 +72244,39 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"tCI" = ( -/obj/machinery/computer/atmos_control{ +"tCN" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ dir = 1 }, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "tCO" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/machinery/door/airlock/medical{ - name = "Medbay Emergency Pod Hallway" - }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Hallway & Break Room" + }, /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/iron/textured_large, -/area/station/medical/break_room) -"tCX" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/atmos/upper) +/area/station/medical/medbay/central) "tCY" = ( -/obj/machinery/computer/security{ - dir = 4 +/obj/machinery/camera/autoname/directional/west, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 8 }, -/obj/structure/railing, -/obj/machinery/keycard_auth/wall_mounted/directional/north{ - pixel_x = -26; - pixel_y = 0 +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 }, -/obj/effect/turf_decal/tile/red/opposingcorners, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"tDc" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/openspace, -/area/station/medical/abandoned) +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "tDf" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -67747,12 +72285,26 @@ /obj/structure/railing{ dir = 4 }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/openspace, -/area/station/command/bridge) -"tDn" = ( -/obj/machinery/light/dim/directional/north, -/turf/open/openspace, -/area/station/cargo/storage) +/area/station/command/meeting_room/council) +"tDh" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/duct, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) +"tDq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/warning/radiation/rad_area/directional/north, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "tDv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/purple/line{ @@ -67766,65 +72318,41 @@ id = "justiceflash"; name = "Justice Flash Control"; pixel_x = -30; - pixel_y = -11 + pixel_y = -11; + dir = 8 }, /turf/open/floor/plating, /area/station/security/execution/education) "tDy" = ( /turf/open/floor/plating, /area/station/maintenance/port/greater) -"tDB" = ( -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/stripes/corner{ +"tDJ" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/engineering/break_room) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) "tDK" = ( /obj/effect/decal/cleanable/plasma, /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"tDP" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 2; - pixel_y = 11 - }, -/obj/item/toy/figure/lawyer{ - pixel_x = 6; - pixel_y = 6 - }, -/turf/open/floor/iron/checker, -/area/station/maintenance/port/aft) "tDY" = ( /turf/closed/wall, /area/station/science/lobby) -"tEc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/closed/wall/r_wall, -/area/station/medical/virology) +"tEi" = ( +/obj/machinery/igniter/incinerator_atmos, +/turf/open/floor/engine/airless, +/area/station/engineering/atmos/upper) "tEl" = ( /obj/structure/lattice/catwalk, /turf/open/floor/engine/hull/air, /area/station/cargo/storage) -"tEt" = ( -/obj/structure/flora/bush/fullgrass/style_random, -/turf/open/floor/grass, -/area/station/maintenance/starboard/fore) "tEv" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/station/maintenance/port) -"tEy" = ( -/obj/structure/girder, -/obj/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "tEA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, @@ -67842,11 +72370,19 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/openspace, /area/station/hallway/primary/starboard) -"tEH" = ( +"tEN" = ( +/obj/structure/sign/warning/vacuum/external/directional/south, /obj/structure/cable, -/obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/aft/upper) +"tEQ" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 8 + }, +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/station/engineering/lobby) "tER" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 5 @@ -67863,13 +72399,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/lounge) -"tES" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "tEU" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -67878,17 +72407,41 @@ /obj/structure/cable, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"tEY" = ( -/obj/item/trash/can{ - pixel_x = -8 - }, -/obj/structure/window/spawner/directional/west, +"tEW" = ( +/obj/structure/sign/poster/random/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/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/maintenance/starboard/central) +"tFa" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/stack{ + dir = 1 + }, +/obj/structure/fluff/paper/stack{ + dir = 4 + }, +/obj/structure/fluff/paper/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "tFd" = ( /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, /area/station/hallway/primary/starboard) +"tFj" = ( +/obj/effect/turf_decal/siding/brown, +/obj/structure/railing, +/obj/effect/landmark/start/hangover, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/station/commons/dorms) "tFl" = ( /obj/effect/turf_decal/trimline/dark_blue/end{ dir = 1 @@ -67909,7 +72462,7 @@ dir = 1 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tFv" = ( /obj/structure/chair{ dir = 1 @@ -67921,21 +72474,46 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"tFy" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/toilet{ +"tFB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/obj/effect/turf_decal/stripes/white/line{ dir = 4 }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/freezer, -/area/station/commons/dorms) -"tFC" = ( -/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/filled/line, -/turf/open/floor/iron/smooth, -/area/station/engineering/main) +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"tFD" = ( +/obj/machinery/button/door/directional/east{ + id = "cargounload"; + name = "Loading Doors"; + pixel_y = 6 + }, +/obj/machinery/button/door/directional/east{ + id = "cargoload"; + name = "Loading Doors"; + pixel_y = -6 + }, +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/computer/cargo{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark/warning{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/station/cargo/storage) +"tFO" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft) "tFU" = ( /obj/item/clothing/suit/costume/chickensuit{ pixel_x = 4; @@ -67953,30 +72531,39 @@ /obj/item/skillchip/matrix_taunt, /turf/open/floor/iron/kitchen, /area/station/maintenance/port/aft) -"tFY" = ( -/obj/effect/turf_decal/siding{ +"tGb" = ( +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/obj/effect/turf_decal/trimline/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) -"tGb" = ( -/obj/structure/chair/office{ +/obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "HoPsToy"; - name = "Loading Conveyor"; - pixel_x = -13; - pixel_y = 8 - }, -/obj/effect/landmark/start/head_of_personnel, -/turf/open/floor/carpet, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) +"tGg" = ( +/obj/machinery/door/airlock, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) +"tGm" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"tGo" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/fore) "tGs" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 @@ -67987,7 +72574,7 @@ /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "tGu" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -67996,6 +72583,12 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark, /area/station/security/range) +"tGv" = ( +/obj/structure/lattice/catwalk, +/obj/structure/table/reinforced, +/obj/machinery/microwave/engineering, +/turf/open/openspace, +/area/station/cargo/storage) "tGz" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -68015,15 +72608,28 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"tGM" = ( -/obj/structure/lattice/catwalk, -/obj/structure/table, -/obj/item/binoculars, -/turf/open/openspace, -/area/station/hallway/secondary/exit/departure_lounge) "tGN" = ( /turf/closed/wall, /area/station/science/zoo) +"tGO" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/east{ + id = "Cabin7"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/wood, +/area/station/commons/dorms) +"tGP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/warning/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "tHd" = ( /obj/effect/turf_decal/bot/left, /turf/open/floor/engine, @@ -68043,7 +72649,7 @@ "tHn" = ( /obj/machinery/computer/security, /turf/open/floor/iron/white/textured_half, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tHo" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, @@ -68055,11 +72661,10 @@ network = list("prison") }, /obj/machinery/light_switch/directional/east, -/obj/machinery/button/door/directional/north{ - id = "detective_shutters"; +/obj/machinery/button/door/directional/east{ + pixel_y = -10; name = "detective's office shutters control"; - pixel_x = 26; - pixel_y = -10 + id = "detective_shutters" }, /turf/open/floor/wood, /area/station/security/detectives_office) @@ -68069,27 +72674,40 @@ }, /turf/open/floor/carpet, /area/station/command/corporate_showroom) +"tHu" = ( +/obj/structure/closet/crate/trashcart/laundry, +/obj/effect/spawner/random/clothing/backpack, +/obj/effect/spawner/random/clothing/backpack, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) +"tHv" = ( +/obj/machinery/door/poddoor{ + id = "securestoragecw"; + name = "Secure Storage" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine/hull/reinforced/air, +/area/station/engineering/supermatter/room/upper) "tHw" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ dir = 1 }, /obj/effect/turf_decal/trimline/dark_blue/warning, /turf/open/floor/iron/dark/textured_edge, -/area/station/ai_monitored/turret_protected/ai) -"tHE" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/airlock_sensor/incinerator_atmos{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_atmos{ +/area/station/ai/satellite/chamber) +"tIa" = ( +/obj/effect/turf_decal/siding/thinplating{ dir = 4 }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"tHR" = ( -/obj/structure/sign/warning/radiation/rad_area/directional/east, -/turf/open/floor/iron/smooth, -/area/station/engineering/main) +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/station/engineering/lobby) "tIi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68106,13 +72724,18 @@ /turf/open/floor/iron/smooth, /area/station/engineering/main) "tIm" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/light/directional/east, -/obj/machinery/status_display/supply{ - pixel_x = 32 +/obj/item/clothing/head/cone{ + pixel_x = -5; + pixel_y = 0 }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/qm) +/turf/open/floor/engine/hull, +/area/space/nearstation) +"tIo" = ( +/obj/structure/transport/linear{ + radial_travel = 0 + }, +/turf/open/openspace, +/area/station/engineering/atmos/upper) "tIq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68125,40 +72748,23 @@ dir = 8 }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) -"tII" = ( -/obj/structure/table, -/obj/effect/spawner/random/trash/soap, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/aft) +/area/station/ai/satellite/chamber) +"tIE" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/turf/open/floor/iron, +/area/station/engineering/lobby) "tIO" = ( /obj/machinery/light/directional/south, /obj/machinery/vending/clothing, /turf/open/floor/wood/large, /area/station/service/theater_dressing) -"tIT" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron{ - amount = 30 - }, -/obj/item/stack/sheet/glass{ - amount = 30 - }, -/obj/item/stack/rods{ - amount = 25 - }, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/machinery/camera/autoname/directional/north, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"tIW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "tJk" = ( /obj/structure/chair{ dir = 1 @@ -68179,21 +72785,20 @@ }, /turf/open/floor/wood, /area/station/service/chapel) -"tJq" = ( -/obj/machinery/ai_slipper{ - uses = 8 +"tJn" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) +"tJq" = ( /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/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) -"tJt" = ( -/obj/item/food/grown/sunflower, -/turf/open/floor/iron/vaporwave, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/carpet/black, +/area/station/ai/upload/chamber) "tJv" = ( -/obj/structure/table, /obj/item/construction/plumbing{ pixel_x = -7; pixel_y = 6 @@ -68203,6 +72808,7 @@ dir = 1 }, /obj/machinery/light/directional/south, +/obj/structure/table, /turf/open/floor/iron/dark, /area/station/medical/chemistry) "tJD" = ( @@ -68223,6 +72829,11 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) +"tJH" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "tKa" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -68237,11 +72848,23 @@ /obj/structure/railing, /turf/open/floor/iron/smooth, /area/station/engineering/main) +"tKp" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "tKq" = ( /obj/machinery/computer/crew, /obj/structure/sign/poster/official/science/directional/north, /turf/open/floor/iron/white/textured_half, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tKw" = ( /obj/structure/frame/computer{ anchored = 1 @@ -68280,8 +72903,13 @@ dir = 1 }, /obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/light/floor, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) +"tKH" = ( +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "tKK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68290,17 +72918,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) -"tLb" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"tLl" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/chapel{ - dir = 8 - }, -/area/station/service/chapel) "tLo" = ( /obj/structure/lattice/catwalk, /obj/machinery/camera/autoname/directional/west, @@ -68312,26 +72929,30 @@ /turf/open/floor/wood/large, /area/station/commons/lounge) "tLq" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "packageSort2" - }, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/trimline/brown/filled, -/obj/machinery/conveyor_switch/oneway{ - id = "packageSort2"; - name = "Trash Conveyor"; - pixel_x = -13; - pixel_y = -5 - }, -/turf/open/floor/iron, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, /area/station/cargo/sorting) -"tLs" = ( +"tLA" = ( +/turf/open/floor/iron/corner{ + dir = 4 + }, +/area/station/hallway/primary/central) +"tLD" = ( +/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/power/apc/auto_name/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) +"tLE" = ( /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/break_room) +/obj/structure/sign/poster/contraband/communist_state/directional/east, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) "tLK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, @@ -68340,32 +72961,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, /area/station/maintenance/hallway/abandoned_recreation) -"tLQ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 +"tLP" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/obj/structure/sign/warning/electric_shock/directional/south, +/turf/open/floor/engine/hull, +/area/station/solars/starboard/fore) "tLU" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 8 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 }, -/turf/open/floor/iron/white/textured_large, +/turf/open/floor/iron/dark, /area/station/medical/medbay/central) "tLV" = ( /obj/machinery/teleport/station, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/teleporter) -"tMg" = ( -/turf/open/floor/wood, -/area/station/medical/medbay/central) -"tMj" = ( -/obj/item/statuebust, -/turf/open/floor/iron/vaporwave, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/teleporter) "tMm" = ( /obj/machinery/door/airlock/grunge, /obj/structure/cable, @@ -68373,27 +72988,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tMo" = ( /obj/machinery/holopad, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) -"tMu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/structure/window/reinforced/tinted, -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/lesser) -"tMw" = ( -/obj/machinery/camera/autoname/directional/south, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) +"tMr" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/structure/sign/poster/official/anniversary_vintage_reprint/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "tMD" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 5 @@ -68411,23 +73015,34 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/storage_shared) -"tMS" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red/opposingcorners{ +"tMN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"tMT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table/wood, +/obj/structure/fluff/paper/corner{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) +/obj/item/paper/crumpled{ + pixel_x = 7 + }, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "tMY" = ( /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/range) -"tMZ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "tNb" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 @@ -68435,18 +73050,24 @@ /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/smooth, /area/station/engineering/main) "tNd" = ( -/obj/effect/decal/cleanable/dirt, /obj/machinery/camera/autoname/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) "tNr" = ( /obj/structure/disposalpipe/segment{ dir = 2 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) "tNu" = ( /obj/machinery/power/apc/auto_name/directional/south, @@ -68466,9 +73087,19 @@ }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"tNG" = ( -/turf/open/floor/iron/stairs/medium, -/area/station/commons/toilet/restrooms) +"tND" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/button/door/directional/east{ + id = "SM_shutters"; + name = "Radiation Shutters"; + req_access = list("engineering") + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "tNP" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -68499,15 +73130,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, /turf/open/floor/iron/dark/textured_half, /area/station/science/ordnance/storage) -"tOi" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engine Room" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) "tOj" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 @@ -68528,6 +73150,11 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"tOs" = ( +/obj/structure/closet/firecloset, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "tOw" = ( /obj/structure/railing, /turf/open/floor/iron/stairs/medium{ @@ -68544,18 +73171,17 @@ }, /turf/open/floor/wood/tile, /area/station/security/detectives_office/private_investigators_office) -"tOE" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor/mix_tank, -/turf/open/floor/engine/vacuum, -/area/station/maintenance/disposal/incinerator) -"tOO" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, +"tOG" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/vending/assist, /turf/open/floor/iron, -/area/station/engineering/lobby) +/area/station/commons/storage/primary) +"tON" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/morgue) "tOW" = ( /obj/effect/spawner/random/trash/graffiti, /obj/structure/disposalpipe/segment{ @@ -68563,9 +73189,28 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) +"tPb" = ( +/obj/machinery/atmospherics/pipe/multiz/cyan/visible{ + dir = 8; + name = "Air Mix Multideck Adapter" + }, +/obj/machinery/meter{ + name = "Mix Meter" + }, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "tPe" = ( /turf/open/floor/glass/reinforced/plasma, /area/station/engineering/supermatter) +"tPl" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/structure/cable, +/obj/structure/sign/warning/radiation/directional/south, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "tPr" = ( /obj/structure/table_frame/wood, /turf/open/floor/iron/grimy, @@ -68579,7 +73224,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 1 }, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "tPz" = ( /obj/structure/rack, /obj/item/restraints/handcuffs{ @@ -68599,9 +73244,9 @@ /turf/closed/wall, /area/station/science/research) "tPC" = ( -/obj/structure/chair/office, -/turf/open/floor/carpet, -/area/station/ai_monitored/turret_protected/ai_upload) +/obj/structure/cable, +/turf/open/floor/carpet/black, +/area/station/ai/upload/chamber) "tPF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/generic, @@ -68620,42 +73265,104 @@ /turf/open/floor/wood/large, /area/station/hallway/primary/central) "tPI" = ( -/obj/structure/table/glass, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/item/stack/rods{ - amount = 25; - pixel_y = 3 +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 6 }, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/green{ +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "tPU" = ( /turf/closed/wall, /area/station/commons/toilet/restrooms) +"tPY" = ( +/obj/item/radio/intercom/directional/south, +/turf/open/floor/plating, +/area/station/engineering/storage_shared) +"tPZ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/carpet/cyan, +/area/station/command/heads_quarters/cmo) "tQf" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, /turf/open/floor/iron/dark/textured_large, /area/station/science/genetics) -"tQt" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/reagent_dispensers/plumbed, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) +"tQk" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/closet/radiation, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"tQl" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"tQq" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) +"tQB" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/openspace, +/area/station/maintenance/starboard/upper) "tQI" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/floor/iron/dark, /area/station/command/gateway) +"tQR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) +"tQY" = ( +/obj/machinery/keycard_auth/wall_mounted/directional/north{ + pixel_y = 28; + pixel_x = null + }, +/obj/structure/table/wood, +/obj/item/folder/white{ + pixel_y = 10; + pixel_x = 8 + }, +/obj/item/folder/blue{ + pixel_x = -8; + pixel_y = 10 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 1 + }, +/turf/open/floor/holofloor/dark, +/area/station/command/heads_quarters/cmo) +"tQZ" = ( +/obj/effect/mapping_helpers/airlock/access/all/medical/cmo, +/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/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Chief Medical Officer's Quarters" + }, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/cmo) "tRc" = ( /obj/item/reagent_containers/cup/glass/bottle/beer/almost_empty{ pixel_x = -5; @@ -68672,44 +73379,39 @@ "tRd" = ( /obj/structure/cable/layer3, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "tRi" = ( /obj/structure/lattice, /obj/structure/grille/broken, /turf/open/space/basic, /area/space/nearstation) "tRt" = ( -/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/door/window/left/directional/west{ + name = "Captain's Desk"; + req_access = list("captain") + }, /obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/flask/gold{ - pixel_y = 10 +/obj/machinery/recharger{ + pixel_y = 4; + pixel_x = 5 }, -/obj/item/cigarette/cigar{ - pixel_x = -17; - pixel_y = 7 +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/captain/private) +"tRN" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 5 }, -/obj/item/cigarette/cigar{ - pixel_x = -13; - pixel_y = 4 +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"tRG" = ( -/obj/machinery/washing_machine, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"tRJ" = ( -/obj/effect/spawner/random/trash, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/port) +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "tRR" = ( /obj/structure/railing{ dir = 9 }, /obj/structure/table, -/obj/effect/decal/cleanable/dirt, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -68722,8 +73424,13 @@ pixel_x = -6; pixel_y = -5 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/obj/structure/lattice/catwalk, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 9 + }, +/turf/open/openspace, +/area/station/ai/upload/chamber) "tRV" = ( /obj/structure/railing{ dir = 8 @@ -68733,46 +73440,22 @@ pixel_x = -5; pixel_y = -15 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/obj/item/ai_module/toy_ai{ + pixel_x = -8; + pixel_y = 9 + }, +/obj/structure/lattice/catwalk, +/obj/item/clipboard{ + pixel_x = 1; + pixel_y = -2 + }, +/turf/open/openspace, +/area/station/ai/upload/chamber) "tRY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 8 - }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) -"tSa" = ( -/obj/structure/bed, -/obj/structure/sign/poster/official/no_erp/directional/east, -/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/wood, -/area/station/commons/dorms) -"tSl" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/structure/frame/computer{ - anchored = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) -"tSo" = ( -/obj/structure/closet/crate/freezer/surplus_limbs, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) "tSp" = ( /obj/machinery/computer/piratepad_control/civilian{ dir = 4 @@ -68794,28 +73477,18 @@ /obj/structure/cable, /turf/open/space/openspace, /area/station/solars/starboard/fore) -"tSE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/moisture_trap, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"tST" = ( -/obj/effect/spawner/random/trash/graffiti{ - pixel_y = 32 +"tSB" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 4 }, /turf/open/floor/iron/smooth, -/area/station/engineering/main) +/area/station/engineering/atmos) "tSW" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Mining Maintenance Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "miningshuttleexit" +/obj/machinery/computer/order_console/mining, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 5 }, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, -/turf/open/floor/plating, +/turf/open/floor/iron, /area/station/cargo/miningoffice) "tSY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68830,7 +73503,9 @@ dir = 4 }, /obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/large, +/turf/open/floor/iron/corner{ + dir = 1 + }, /area/station/hallway/primary/central) "tTg" = ( /obj/effect/decal/cleanable/ash, @@ -68842,31 +73517,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/science/cytology) -"tTz" = ( -/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/access/any/engineering/general, -/obj/machinery/door/airlock/engineering/glass{ - name = "Shared Engineering Storage" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) +"tTx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/aft/upper) "tTD" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, /obj/effect/turf_decal/siding/dark, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"tTG" = ( -/obj/structure/ladder, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 +/area/station/ai/satellite/interior) +"tTL" = ( +/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/disposalpipe/segment{ + dir = 10 }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) +/turf/open/floor/iron/dark/textured_large, +/area/station/maintenance/port) "tTO" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, @@ -68884,28 +73556,32 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/storage_shared) -"tUd" = ( -/obj/structure/railing{ - dir = 8 +"tUg" = ( +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/machinery/door/airlock/security/glass{ + name = "Security Post - Cargo" }, -/obj/item/kirbyplants/random, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 }, -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/station/commons/toilet/restrooms) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) +"tUn" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/station/maintenance/starboard/aft/upper) "tUs" = ( /turf/open/floor/wood, /area/station/command/heads_quarters/hos) -"tUt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet, -/area/station/ai_monitored/command/storage/eva) "tUu" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tUw" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -68925,6 +73601,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) +"tUE" = ( +/obj/structure/reagent_dispensers/fueltank/large, +/obj/effect/turf_decal/delivery/white{ + color = "#ff6600" + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) +"tUG" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "tUH" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -68946,24 +73638,49 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"tVe" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing/corner, +/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/openspace, +/area/station/engineering/lobby) "tVl" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/two, +/obj/machinery/newscaster/directional/west, /turf/open/floor/plating, /area/station/maintenance/port) "tVo" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 +/obj/machinery/door/airlock/public/glass{ + name = "Abandoned Hallway" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 }, -/obj/effect/landmark/start/hangover, -/obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"tVI" = ( -/obj/structure/cable, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +"tVs" = ( +/obj/structure/railing, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace, +/area/station/medical/medbay/central) +"tVz" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "tVR" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -68979,27 +73696,32 @@ }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) +"tVT" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/reagent_dispensers/plumbed, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "tWc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) -"tWd" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/engine, -/area/station/engineering/break_room) +"tWe" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible/layer2{ + dir = 2 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "tWl" = ( /obj/machinery/light/warm/dim/directional/north, /turf/open/openspace, /area/station/hallway/primary/central) -"tWn" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/station/engineering/supermatter/room) "tWt" = ( /obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge, /area/station/hallway/primary/central) "tWx" = ( /obj/machinery/door/airlock/maintenance, @@ -69022,15 +73744,11 @@ /obj/machinery/light/small/dim/directional/south, /turf/open/floor/iron/dark, /area/station/service/chapel) -"tWI" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) "tWK" = ( /obj/structure/girder, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "tWP" = ( @@ -69125,6 +73843,16 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) +"tXw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "tXx" = ( /obj/effect/turf_decal/trimline/dark_blue/warning{ dir = 1 @@ -69133,14 +73861,26 @@ /turf/open/floor/iron/white/smooth_corner{ dir = 4 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) +"tXE" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/obj/machinery/atmospherics/components/binary/pump/on/layer5{ + name = "O2 to Airmix" + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "tXJ" = ( /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/security/lockers) "tXN" = ( /obj/effect/turf_decal/trimline/green/filled/corner, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) "tXS" = ( /obj/effect/turf_decal/trimline/blue/filled/line, @@ -69160,9 +73900,6 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 5 }, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69172,9 +73909,6 @@ pixel_x = 28; pixel_y = 6 }, -/obj/machinery/firealarm/directional/east{ - pixel_y = -3 - }, /turf/open/floor/iron, /area/station/cargo/storage) "tYa" = ( @@ -69184,12 +73918,6 @@ /obj/item/stack/spacecash/c100, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"tYb" = ( -/obj/effect/turf_decal/siding/brown, -/obj/structure/closet/masks, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "tYh" = ( /turf/open/floor/plating/airless, /area/station/maintenance/space_hut) @@ -69200,7 +73928,7 @@ network = list("vault") }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "tYt" = ( /obj/item/cardboard_cutout{ pixel_x = 14; @@ -69220,46 +73948,50 @@ /obj/structure/cable, /turf/open/floor/wood/large, /area/station/service/theater_dressing) -"tYz" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/siding/brown{ +"tYC" = ( +/obj/structure/disposalpipe/trunk{ dir = 8 }, -/turf/open/floor/iron, -/area/station/commons/dorms) -"tYC" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 +/obj/machinery/firealarm/directional/east{ + pixel_x = 20 }, -/turf/open/floor/iron/white/textured_large, +/obj/machinery/disposal/bin, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/surgery) "tYE" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "chemshutters"; - name = "Chemistry Shutters" +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ + dir = 1 + }, +/obj/structure/table, +/obj/item/assembly/igniter{ + pixel_x = 3; + pixel_y = -1 + }, +/obj/item/assembly/timer{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/radio/headset/headset_med{ + pixel_x = 15; + pixel_y = 4 }, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "tYF" = ( /obj/machinery/light/directional/west, /turf/open/openspace, /area/station/command/gateway) "tYN" = ( -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay" - }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/machinery/door/firedoor, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "tYS" = ( @@ -69274,12 +74006,6 @@ /obj/machinery/light/red/dim/directional/south, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"tYZ" = ( -/obj/machinery/atmospherics/components/unary/passive_vent, -/obj/structure/lattice, -/obj/machinery/camera/autoname/directional/west, -/turf/open/space/basic, -/area/space/nearstation) "tZb" = ( /obj/structure/sign/departments/restroom/directional/south, /obj/item/cigbutt{ @@ -69288,6 +74014,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) +"tZf" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "tZj" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -69295,6 +74026,10 @@ /obj/structure/sign/departments/restroom/directional/north, /turf/open/floor/iron/textured_large, /area/station/medical/virology) +"tZx" = ( +/obj/item/airlock_painter/decal, +/turf/open/floor/plating, +/area/station/maintenance/port) "tZz" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -69308,12 +74043,10 @@ /obj/structure/window/spawner/directional/north, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"tZV" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/openspace, -/area/station/commons/dorms) +"tZW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos/upper) "tZY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -69321,10 +74054,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/zoo) -"uac" = ( -/obj/structure/bookcase/random/religion, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "uaf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -69335,7 +74064,7 @@ "uah" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/iron/textured_large, -/area/space/nearstation) +/area/station/medical/abandoned) "uaw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69349,6 +74078,26 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) +"uaB" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"uaH" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 8 + }, +/obj/item/cigbutt{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/structure/sign/poster/contraband/kudzu/directional/east, +/turf/open/floor/eighties, +/area/station/maintenance/department/crew_quarters/dorms) +"uaI" = ( +/turf/open/water/no_planet_atmos, +/area/station/maintenance/starboard/fore) "uaO" = ( /obj/structure/disposalpipe/trunk/multiz/down, /obj/structure/railing{ @@ -69356,6 +74105,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"uaP" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/engineering/main) "uaR" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 5 @@ -69370,7 +74123,25 @@ /obj/machinery/light_switch/directional/east, /obj/structure/closet/crate/bin, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"uaU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) +"ubk" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/south, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "ubo" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -69378,27 +74149,6 @@ "ubs" = ( /turf/open/openspace, /area/station/hallway/secondary/construction) -"ubv" = ( -/obj/machinery/button/elevator{ - id = "catwalk_engi"; - pixel_y = -24 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8; - pixel_x = -2 - }, -/turf/open/floor/engine, -/area/station/engineering/break_room) -"ubU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/maintenance/starboard/lesser) "ubZ" = ( /obj/item/trash/flare, /turf/open/floor/plating, @@ -69409,32 +74159,29 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/breakroom) +"ucc" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Virology Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/virology, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) "ucd" = ( /obj/structure/railing, /turf/open/floor/engine/hull/air, /area/station/maintenance/port) "ucf" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/structure/chair/sofa/middle/brown{ - dir = 1 - }, /obj/machinery/light/directional/south, -/obj/machinery/light_switch/directional/south, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, /turf/open/floor/iron/textured, /area/station/cargo/storage) -"ucj" = ( -/obj/effect/landmark/event_spawn, -/turf/open/openspace, -/area/station/hallway/secondary/exit/departure_lounge) -"ucl" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/auxiliary) "ucp" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -69442,6 +74189,11 @@ dir = 8 }, /area/station/command/corporate_showroom) +"ucy" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "ucC" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -69480,22 +74232,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/machinery/door/firedoor, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) -"ucQ" = ( -/obj/structure/sign/poster/random/directional/north, -/obj/structure/cable, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron, -/area/station/engineering/main) +"ucR" = ( +/obj/effect/spawner/random/decoration/showcase, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/starboard/aft/upper) "ucX" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/obj/structure/chair/sofa/corner/brown{ - dir = 8 - }, /obj/item/radio/intercom/directional/south, +/obj/machinery/conveyor{ + dir = 10; + id = "mining" + }, +/obj/machinery/bouldertech/refinery, /turf/open/floor/iron/textured, /area/station/cargo/storage) "ucZ" = ( @@ -69503,15 +74253,6 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"udb" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) "udl" = ( /turf/closed/wall, /area/station/engineering/storage/tech) @@ -69521,6 +74262,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"udu" = ( +/obj/structure/chair, +/obj/effect/landmark/start/hangover, +/obj/structure/sign/calendar/directional/north, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "udE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69532,56 +74279,28 @@ /obj/machinery/door/firedoor, /turf/open/floor/wood/large, /area/station/service/theater_dressing) -"udF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/obj/structure/disposalpipe/segment{ - dir = 4 +"udN" = ( +/obj/structure/marker_beacon/yellow, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) +"udS" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 }, +/obj/machinery/newscaster/directional/east, +/obj/machinery/firealarm/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/storage) +"udV" = ( +/obj/machinery/duct, +/obj/machinery/door/airlock/maintenance, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/fore/upper) "udW" = ( /obj/structure/chair/sofa/middle/brown, /turf/open/floor/carpet, /area/station/maintenance/starboard/aft) -"udY" = ( -/obj/structure/table, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/item/radio/off{ - pixel_x = 6 - }, -/obj/item/phone{ - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/wood, -/area/station/engineering/lobby) -"uec" = ( -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay" - }, -/obj/effect/mapping_helpers/airlock/unres, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"uen" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "uex" = ( /obj/machinery/atmospherics/components/binary/pump/on{ name = "Gas to Cold Loop" @@ -69609,8 +74328,18 @@ /obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 8 }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1 + }, +/obj/effect/mapping_helpers/mail_sorting/supply/cargo_bay, /turf/open/floor/iron, /area/station/cargo/storage) +"ufc" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/light_switch/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/storage) "ufi" = ( /obj/machinery/door/airlock/command{ name = "Research Director's Office" @@ -69625,16 +74354,17 @@ /area/station/command/heads_quarters/rd) "ufn" = ( /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat_interior"; + control_area = "/area/station/ai/satellite/interior"; name = "Antechamber Turret Control"; pixel_x = 30; - req_access = list("minisat") + req_access = list("minisat"); + dir = 4 }, /obj/structure/sign/warning/secure_area/directional/north, /obj/machinery/light/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "ufo" = ( /obj/structure/rack, /obj/item/storage/briefcase/secure{ @@ -69654,10 +74384,6 @@ /obj/structure/chair{ dir = 1 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/station/maintenance/starboard/central) "ufA" = ( @@ -69670,7 +74396,37 @@ /obj/machinery/recharge_station, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/freezer, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) +"ufI" = ( +/obj/effect/turf_decal/siding/dark/corner, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"ufK" = ( +/obj/structure/table, +/obj/item/paper_bin/carbon{ + pixel_x = 16; + pixel_y = 6 + }, +/obj/item/pen/fountain{ + pixel_x = 15; + pixel_y = 4 + }, +/obj/item/stamp/granted{ + pixel_x = 6; + pixel_y = 8 + }, +/obj/item/stamp/denied{ + pixel_x = 6 + }, +/obj/item/stamp/head/qm{ + pixel_x = -5 + }, +/obj/item/clipboard{ + pixel_y = 8; + pixel_x = -6 + }, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "uga" = ( /obj/machinery/door/airlock/security/glass{ name = "Bailiff Access" @@ -69681,22 +74437,30 @@ /area/station/security/courtroom) "ugj" = ( /obj/effect/turf_decal/tile/red/fourcorners, -/obj/effect/mapping_helpers/dead_body_placer, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/medical/morgue) +"ugm" = ( +/obj/structure/tank_dispenser, +/turf/open/floor/glass/plasma, +/area/station/engineering/atmos/upper) "ugn" = ( /obj/structure/table/wood/poker, /turf/open/floor/carpet/stellar, /area/station/service/library) -"ugo" = ( -/obj/machinery/power/port_gen/pacman, -/obj/effect/turf_decal/delivery/white{ - color = "#52B4E9" +"ugp" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 }, -/turf/open/floor/engine, -/area/station/engineering/break_room) +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/tcomms_all, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "ugq" = ( -/obj/structure/table, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 }, @@ -69704,108 +74468,73 @@ dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/machinery/light_switch/directional/west, -/obj/item/stack/sheet/mineral/plasma{ - pixel_y = 5 - }, -/obj/item/stack/sheet/mineral/plasma{ - pixel_x = 2 - }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 8; - pixel_y = 7 - }, -/obj/item/reagent_containers/dropper, +/obj/structure/rack, +/obj/item/plunger, +/obj/machinery/light/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) +"ugr" = ( +/obj/structure/closet/lasertag/red, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) +"ugw" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/condiment, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/aft/upper) +"ugA" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"ugC" = ( +/obj/effect/turf_decal/siding/brown, +/obj/structure/railing, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/dorms) "ugE" = ( /obj/effect/turf_decal/siding/dark, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white/textured_corner{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ugL" = ( /obj/structure/cable, /turf/open/floor/iron, /area/station/science/zoo) -"ugM" = ( -/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/commons/dorms) "ugN" = ( -/obj/machinery/modular_computer/preset/id, -/obj/machinery/button/door/directional/west{ - id = "hop"; - name = "Lockdown Blast Doors"; - pixel_y = 6; - req_access = list("hop") - }, -/obj/machinery/button/flasher{ - id = "hopflash"; - pixel_x = -24; - pixel_y = -4 - }, -/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/assistance, -/obj/effect/mapping_helpers/requests_console/information, -/turf/open/floor/carpet, +/obj/machinery/computer/records/security, +/turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) "ugU" = ( /turf/open/openspace, /area/station/security/detectives_office) -"ugX" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "uhd" = ( /obj/effect/turf_decal/siding/dark/corner{ dir = 8 }, /turf/open/openspace, /area/station/service/kitchen) -"uhg" = ( -/obj/structure/table, -/obj/item/hfr_box/body/moderator_input{ - pixel_x = -8; - pixel_y = 8 - }, -/obj/item/hfr_box/body/waste_output{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/hfr_box/body/interface, -/obj/item/hfr_box/body/waste_output{ - pixel_x = -15 +"uhz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/effect/turf_decal/siding/blue{ + dir = 4 }, -/turf/open/floor/engine, -/area/station/engineering/atmos/hfr_room) -"uhl" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 +/turf/open/floor/catwalk_floor{ + initial_gas_mix = "n2=100;TEMP=80" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/machinery/meter, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) -"uhx" = ( -/obj/structure/table/reinforced, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"uhJ" = ( -/obj/structure/sign/poster/official/fruit_bowl, -/turf/closed/wall, -/area/station/maintenance/starboard/lesser) +/area/station/science/server) "uhO" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -69825,12 +74554,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"uib" = ( -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/cargo/storage) "uii" = ( /obj/machinery/door/airlock/public/glass{ name = "Community Center" @@ -69877,6 +74600,14 @@ }, /turf/open/floor/plating, /area/station/security/execution/education) +"uiU" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/closet/radiation, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "ujb" = ( /turf/open/floor/iron, /area/station/maintenance/port/fore) @@ -69892,19 +74623,34 @@ dir = 8 }, /area/station/hallway/primary/fore) -"ujD" = ( -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay" +"ujx" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/camera/autoname/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"ujD" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/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/medical/medbay/lobby) +"ujG" = ( +/obj/item/clothing/head/utility/hardhat/red{ + pixel_x = -3; + pixel_y = 11 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "ujI" = ( /turf/open/openspace, /area/station/science/explab) @@ -69919,35 +74665,15 @@ /obj/item/gun/energy/ionrifle, /obj/item/clothing/suit/hooded/ablative, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "ujP" = ( /obj/item/radio/intercom/directional/south, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"ujS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair{ - dir = 1; - pixel_y = -2 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"ujX" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "ceprivacy"; - name = "Chief Engineers Privacy Shutters" - }, -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/station/command/heads_quarters/ce) "uka" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "uki" = ( /obj/structure/chair/stool/bar/directional/east, /obj/effect/landmark/start/hangover, @@ -69972,6 +74698,7 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, +/obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "ukt" = ( @@ -69991,7 +74718,7 @@ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "ukF" = ( /obj/machinery/ai_slipper{ uses = 10 @@ -70000,17 +74727,12 @@ network = list("aicore") }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ukI" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/hacking_guide/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"ukM" = ( -/obj/effect/landmark/start/hangover, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "ukO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70029,22 +74751,13 @@ }, /turf/open/openspace, /area/station/hallway/primary/central) -"ukZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 +"ule" = ( +/obj/machinery/atmospherics/components/unary/passive_vent, +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) -"ulh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/navigate_destination/minisat_access_tcomms, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) +/turf/open/floor/plating/airless, +/area/space/nearstation) "uli" = ( /obj/effect/spawner/random/entertainment/arcade, /obj/effect/decal/cleanable/dirt, @@ -70068,29 +74781,33 @@ /area/station/engineering/lobby) "uln" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"ulq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"ulo" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/table, +/obj/item/reagent_containers/cup/soda_cans/random{ + pixel_x = -5; + pixel_y = -18 + }, +/obj/item/reagent_containers/cup/soda_cans/random{ + pixel_x = 5; + pixel_y = -16 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"ulw" = ( /obj/structure/cable, -/obj/effect/turf_decal/trimline/yellow/filled/line{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/stripes/white/line{ dir = 1 }, /turf/open/floor/iron, -/area/station/engineering/lobby) -"ulu" = ( -/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4, -/obj/structure/disposalpipe/trunk/multiz/down{ - dir = 2 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/commons/fitness/recreation) "ulx" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 8 @@ -70099,6 +74816,9 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/wood, /area/station/service/library) +"ulD" = ( +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "ulM" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -70121,26 +74841,23 @@ /obj/machinery/vending/wardrobe/gene_wardrobe, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) -"ulQ" = ( -/obj/machinery/door/airlock/command{ - name = "Chief Engineer's Office" - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/engineering/ce, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +"ulT" = ( +/turf/open/openspace, +/area/station/maintenance/department/crew_quarters/dorms) "ulU" = ( /obj/machinery/door/airlock/grunge, /obj/effect/mapping_helpers/airlock/access/any/command/general, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"ulV" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/cable/multilayer/multiz, +/turf/open/floor/plating, +/area/station/maintenance/aft) "ulX" = ( /obj/structure/table, /obj/item/folder/yellow{ @@ -70174,7 +74891,9 @@ /area/station/security/medical) "ulZ" = ( /obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) "umq" = ( /obj/machinery/light/directional/east, @@ -70190,21 +74909,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "umw" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/item/storage/toolbox/emergency{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/item/storage/toolbox/emergency{ - pixel_x = -2 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, /area/station/command/bridge) "umy" = ( @@ -70226,21 +74934,13 @@ /turf/open/floor/iron/textured_large, /area/station/medical/virology) "umE" = ( -/obj/effect/decal/cleanable/dirt, /obj/machinery/light/dim/directional/north, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) "umH" = ( /turf/closed/wall, /area/station/medical/psychology) -"unc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "ung" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -70263,42 +74963,49 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/station/maintenance/port) +"unL" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/item/wirecutters, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "unM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"unU" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/openspace, +/area/station/engineering/lobby) "uof" = ( /obj/effect/turf_decal/caution{ dir = 4 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) -"uok" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/structure/sign/poster/contraband/pwr_game/directional/west, -/turf/open/floor/wood, -/area/station/commons/dorms) +/area/station/security/armory) "uom" = ( /turf/open/floor/glass/reinforced, /area/station/hallway/primary/port) -"uon" = ( -/obj/structure/railing{ - dir = 8 - }, +"uop" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/oil, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard/aft/upper) "uow" = ( -/obj/structure/table/wood, -/obj/item/coin/antagtoken{ - pixel_x = -11; - pixel_y = 6 - }, -/obj/item/assembly/timer, -/turf/open/floor/carpet, -/area/station/command/meeting_room/council) +/obj/machinery/light/floor, +/obj/structure/table/reinforced/rglass, +/obj/machinery/recharger, +/obj/item/restraints/handcuffs, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "uox" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/wood{ @@ -70313,21 +75020,25 @@ }, /area/station/service/chapel) "uoz" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ dir = 5 }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "uoA" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/rnd/production/techfab/department/medical, -/obj/machinery/newscaster/directional/west, -/turf/open/openspace, -/area/station/medical/storage) +/obj/machinery/camera/autoname/directional/west{ + network = list("ss13","medbay"); + c_tag = "Medbay - Lower Operating Room" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine/hull/air, +/area/station/medical/medbay/central) "uoF" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "capshut" }, /turf/open/floor/plating, /area/station/command/heads_quarters/captain/private) @@ -70363,9 +75074,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/service/lawoffice) -"upl" = ( -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/eighties, +"upk" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/fore) "upm" = ( /obj/structure/chair/office{ @@ -70373,6 +75088,10 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) +"upp" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/maintenance/port) "upr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -70385,11 +75104,36 @@ dir = 1 }, /area/station/hallway/secondary/construction) -"upL" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +"upz" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "abandoned_kitchen"; + name = "Kitchen Shudders"; + dir = 8 + }, +/obj/item/rag, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard) +"upE" = ( +/obj/structure/sign/warning/secure_area/directional/west, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/hallway/primary/central) +"upI" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/indigo, +/turf/open/space/openspace, +/area/space/nearstation) +"upM" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 9 + }, +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, /turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/area/station/engineering/atmos) "upR" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/photocopier/prebuilt, @@ -70414,24 +75158,13 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) +"upX" = ( +/turf/closed/wall, +/area/station/maintenance/aft/upper) "uqb" = ( /obj/item/kirbyplants/photosynthetic, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"uqc" = ( -/obj/machinery/vending/tool, -/obj/effect/turf_decal/trimline/yellow/filled/end{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) -"uqf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/filingcabinet/chestdrawer, -/mob/living/basic/parrot/poly, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +/area/station/ai/satellite/interior) "uqi" = ( /obj/effect/turf_decal/siding/green{ dir = 4 @@ -70453,12 +75186,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/hallway/primary/aft) -"uqw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "uqy" = ( /obj/structure/table, /obj/item/flashlight/lamp/green{ @@ -70485,6 +75212,12 @@ /obj/effect/landmark/start/depsec/supply, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) +"uqN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/engine_smes) "uqR" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/confetti, @@ -70509,23 +75242,19 @@ /turf/open/floor/circuit/green/telecomms/mainframe, /area/station/tcommsat/server) "urk" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/item/blood_filter{ - pixel_x = 4 +/obj/effect/turf_decal/trimline/blue/warning{ + dir = 1 }, -/obj/item/blood_filter{ - pixel_x = -2; - pixel_y = 5 +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/turf/open/floor/iron/white/textured_large, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/surgery) "uro" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/item/kirbyplants/random, -/obj/item/radio/intercom/directional/south, -/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, /turf/open/floor/iron, /area/station/cargo/storage) "urq" = ( @@ -70563,6 +75292,10 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/science/explab) +"urL" = ( +/obj/structure/cable/multilayer/multiz, +/turf/open/floor/plating, +/area/station/solars/starboard/fore) "urV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70579,8 +75312,21 @@ }, /obj/effect/turf_decal/trimline/brown/arrow_ccw, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"ush" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 10 + }, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) +"usk" = ( +/obj/structure/lattice/catwalk, +/obj/item/stack/rods, +/turf/open/openspace, +/area/station/maintenance/starboard/aft/upper) "usl" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine/hull/air, @@ -70595,32 +75341,13 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/small, /area/station/security/mechbay) -"uss" = ( -/obj/structure/table, -/obj/item/folder, -/obj/item/pen, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"ust" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/fore) "usD" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction{ +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) "usK" = ( @@ -70635,7 +75362,7 @@ /obj/structure/table, /obj/item/stack/rods/ten, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "usM" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -70648,7 +75375,7 @@ /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "usP" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -70657,10 +75384,25 @@ }, /turf/open/floor/plating, /area/station/security/detectives_office) -"uta" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/station/maintenance/starboard/lesser) +"usZ" = ( +/obj/machinery/door/airlock/external{ + name = "Welcome." + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "space-outpost" + }, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) +"ute" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/computer/atmos_alert/station_only{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "uth" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -70694,6 +75436,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/server) +"utv" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/starboard/fore/upper) "utx" = ( /obj/structure/rack, /obj/item/storage/box/handcuffs, @@ -70759,12 +75508,12 @@ }, /turf/open/openspace, /area/station/construction/storage_wing) -"uua" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 +"utS" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "uuj" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/green/filled/mid_joiner, @@ -70779,8 +75528,9 @@ "uuk" = ( /obj/effect/decal/cleanable/blood/oil, /obj/structure/extinguisher_cabinet/directional/north, +/obj/structure/sign/poster/official/state_laws/directional/east, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "uum" = ( /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 1 @@ -70791,18 +75541,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"uuo" = ( -/obj/machinery/airalarm/directional/south, -/obj/structure/broken_flooring/side/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) -"uus" = ( -/obj/structure/sign/poster/official/random/directional/west, -/obj/effect/turf_decal/siding/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "uuA" = ( /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, @@ -70812,19 +75550,24 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"uuE" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/corner{ +"uuD" = ( +/obj/item/encryptionkey/headset_com{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/encryptionkey/headset_sec{ + pixel_x = 4 + }, +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/tile/red/opposingcorners{ dir = 4 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) -"uuF" = ( -/obj/structure/ladder, -/obj/effect/turf_decal/stripes/box, /turf/open/floor/iron/dark, -/area/station/engineering/hallway) +/area/station/engineering/storage/tech) +"uuH" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "uuP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/east, @@ -70841,21 +75584,43 @@ /turf/open/openspace, /area/station/security/checkpoint/supply) "uva" = ( -/obj/structure/railing{ - dir = 8 - }, /obj/effect/turf_decal/siding/blue{ dir = 9 }, +/obj/structure/railing{ + dir = 8 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/end{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "uve" = ( +/obj/effect/spawner/random/structure/crate, /obj/structure/disposalpipe/segment{ - dir = 9 + dir = 5 }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"uvf" = ( +/obj/item/radio/intercom/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/engine_smes) "uvh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -70867,22 +75632,31 @@ /area/station/medical/medbay/central) "uvo" = ( /turf/open/floor/glass, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "uvq" = ( /obj/structure/table/wood, /turf/open/floor/iron/dark/smooth_large, /area/station/security/courtroom) -"uvu" = ( -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/white/textured, -/area/station/medical/surgery) "uvv" = ( /obj/structure/flora/bush/pale/style_random, /obj/structure/flora/bush/fullgrass/style_random, /obj/effect/landmark/start/hangover, /turf/open/floor/grass, /area/station/hallway/secondary/entry) +"uvw" = ( +/obj/item/clothing/head/costume/foilhat, +/obj/structure/sign/poster/contraband/kss13/directional/east, +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/double, +/turf/open/floor/wood/large, +/area/station/commons/dorms) +"uvx" = ( +/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, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "uvF" = ( /obj/structure/railing/corner{ dir = 4 @@ -70914,6 +75688,11 @@ }, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/bomb) +"uvT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/keycard_auth/wall_mounted/directional/east, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "uwg" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/light/directional/south, @@ -70949,11 +75728,27 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) -"uwn" = ( +"uwk" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) +"uwl" = ( +/obj/item/clothing/head/cone{ + pixel_x = 6; + pixel_y = -9 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"uwr" = ( +/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/structure/railing/corner, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "uwu" = ( /obj/machinery/shower/directional/east, /obj/effect/decal/cleanable/dirt/dust, @@ -70967,11 +75762,12 @@ /turf/open/floor/iron/freezer, /area/station/maintenance/port) "uwA" = ( -/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) +/obj/machinery/light/floor, +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/obj/effect/landmark/navigate_destination/bridge, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "uwD" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -71002,7 +75798,7 @@ }, /obj/structure/sign/poster/official/science/directional/north, /turf/open/floor/iron/white/textured_half, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "uwN" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ dir = 1 @@ -71011,7 +75807,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured_edge, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "uwS" = ( /obj/structure/railing/corner/end{ dir = 8 @@ -71061,38 +75857,28 @@ /turf/closed/wall, /area/station/cargo/warehouse) "uxq" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/table/glass, /obj/effect/turf_decal/siding/blue{ dir = 5 }, -/obj/machinery/recharger{ - pixel_y = 3 +/obj/structure/railing{ + dir = 4 }, -/obj/item/restraints/handcuffs{ - pixel_y = 3 +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 5 }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"uxt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction) -"uxz" = ( -/obj/item/kirbyplants/random, -/obj/machinery/button/door/directional/east{ - id = "Cabin3"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 1 }, -/turf/open/floor/wood, -/area/station/commons/dorms) +/obj/structure/bookcase/random/reference, +/obj/item/book/manual/wiki/research_and_development{ + pixel_x = 12; + pixel_y = 10 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "uxA" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, @@ -71111,21 +75897,8 @@ dir = 1 }, /obj/machinery/newscaster/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/camera/directional/north{ - c_tag = "Cargo Bay - Mining Departure" - }, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"uxI" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) "uxK" = ( /obj/structure/flora/bush/pale/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -71137,31 +75910,32 @@ /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/three, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "uxW" = ( -/obj/effect/spawner/structure/window, +/obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters{ - id = "commissaryshutter"; + dir = 1; + id = "Lcommissaryshutter"; name = "Vacant Commissary Shutter" }, -/obj/effect/turf_decal/tile/dark_green/fourcorners, /turf/open/floor/plating, /area/station/commons/vacant_room/office) -"uxY" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"uxZ" = ( +/obj/structure/table, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"uya" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"uyb" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/blood/ethereal, -/obj/item/reagent_containers/cup/soda_cans/monkey_energy, -/obj/item/reagent_containers/cup/soda_cans/monkey_energy, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "uyc" = ( /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/science/robotics, @@ -71174,9 +75948,9 @@ /turf/open/floor/iron, /area/station/science/robotics) "uyn" = ( -/obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/central) "uyq" = ( @@ -71187,21 +75961,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/lounge) -"uyr" = ( -/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/catwalk_floor, -/area/station/engineering/main) -"uyu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/meter, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "uyw" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -71211,15 +75970,15 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/eighties/red, /area/station/maintenance/hallway/abandoned_recreation) -"uyD" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 10 - }, -/obj/effect/turf_decal/siding/brown/corner{ - dir = 4 - }, -/turf/open/floor/glass, -/area/station/maintenance/starboard/fore) +"uyA" = ( +/obj/structure/stairs/south, +/turf/open/floor/plating, +/area/station/maintenance/aft) +"uyG" = ( +/obj/structure/ladder, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/aft/upper) "uyN" = ( /obj/structure/disposalpipe/segment{ dir = 8 @@ -71235,6 +75994,17 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) +"uyR" = ( +/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/service/dormitories, +/obj/machinery/duct, +/turf/open/floor/catwalk_floor/iron, +/area/station/commons/dorms) "uyT" = ( /obj/effect/turf_decal/caution/stand_clear{ dir = 8 @@ -71255,35 +76025,32 @@ /turf/open/openspace, /area/station/maintenance/port/aft) "uzg" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/poddoor/preopen{ + id = "capshut" }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) -"uzh" = ( -/obj/structure/lattice/catwalk, /obj/structure/cable, -/obj/structure/holosign/barrier/engineering, +/turf/open/floor/plating, +/area/station/command/heads_quarters/captain/private) +"uzi" = ( +/obj/structure/lattice/catwalk, +/obj/effect/spawner/random/maintenance, /turf/open/openspace, -/area/station/engineering/atmos/project) +/area/station/maintenance/starboard/upper) "uzj" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"uzs" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"uzu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/gravity_generator) +"uzB" = ( +/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/cafeteria, +/area/station/commons/dorms/laundry) "uzI" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -71300,34 +76067,40 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"uzN" = ( +"uzV" = ( +/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"uAi" = ( +/obj/effect/turf_decal/trimline/purple/arrow_cw{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 4 }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) -"uAl" = ( -/turf/closed/wall, -/area/station/engineering/lobby) -"uAm" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 4 }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"uAn" = ( +/obj/structure/lattice/catwalk, /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, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=17-Dorms"; - location = "16-Laundry" +/obj/machinery/camera/autoname/directional/north{ + dir = 2 }, -/turf/open/floor/iron, -/area/station/commons/dorms) -"uAn" = ( -/obj/machinery/light/dim/directional/south, /turf/open/openspace, -/area/station/cargo/storage) +/area/station/hallway/primary/central) +"uAp" = ( +/turf/closed/wall, +/area/station/maintenance/starboard) "uAB" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -71359,16 +76132,12 @@ /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) "uAP" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/machinery/computer/cargo{ - dir = 8 - }, -/obj/machinery/camera/autoname/directional/east, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, +/obj/structure/railing, +/turf/open/openspace, /area/station/cargo/storage) +"uAX" = ( +/turf/open/floor/wood/large, +/area/station/commons/dorms) "uAZ" = ( /obj/machinery/netpod, /obj/effect/decal/cleanable/dirt, @@ -71377,21 +76146,18 @@ /obj/machinery/digital_clock/directional/north, /turf/open/floor/catwalk_floor/iron_dark, /area/station/cargo/bitrunning/den) -"uBh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "uBj" = ( /obj/structure/cable, /turf/closed/wall/r_wall, /area/station/hallway/primary/aft) +"uBo" = ( +/mob/living/basic/parrot/poly, +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/siding/yellow{ + dir = 6 + }, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "uBp" = ( /obj/machinery/holopad, /turf/open/floor/iron/smooth, @@ -71411,11 +76177,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron, /area/station/science/breakroom) -"uBv" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "uBy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71434,11 +76195,34 @@ /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/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"uBU" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine, +/area/station/maintenance/starboard) +"uBY" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/dark_green/fourcorners, +/obj/machinery/door/poddoor/shutters{ + dir = 1; + id = "Rcommissaryshutter"; + name = "Vacant Commissary Shutter" + }, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/office) +"uCa" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "uCb" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -71459,28 +76243,22 @@ /obj/machinery/light/directional/south, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) -"uCA" = ( -/obj/machinery/power/apc/auto_name/directional/north, +"uCs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction, /obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/main) "uCD" = ( +/obj/machinery/light/very_dim/directional/south, +/obj/effect/turf_decal/stripes/red/box, /obj/machinery/conveyor{ dir = 4; id = "garbage" }, -/obj/machinery/light/very_dim/directional/south, /turf/open/floor/plating, /area/station/maintenance/disposal) -"uCE" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/railing/corner/end{ - dir = 4 - }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) "uCF" = ( /turf/open/floor/plating, /area/station/maintenance/port/fore) @@ -71491,15 +76269,32 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) +"uCI" = ( +/obj/structure/table/reinforced, +/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/oxygen, +/obj/item/clothing/mask/breath, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) +"uCO" = ( +/turf/open/openspace, +/area/station/maintenance/starboard/fore/upper) "uCP" = ( /obj/machinery/door/airlock/external{ name = "Medical Escape Pod" }, /obj/effect/landmark/navigate_destination/dockescpod1, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, /turf/open/floor/iron/textured_half{ dir = 8 }, -/area/space/nearstation) +/area/station/medical/abandoned) "uCR" = ( /obj/effect/landmark/carpspawn, /turf/open/space/basic, @@ -71512,8 +76307,18 @@ /obj/structure/railing/corner{ dir = 1 }, +/mob/living/basic/pet/cat/space{ + name = "Tomas" + }, /turf/open/openspace, /area/station/commons/fitness/recreation) +"uDa" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "uDd" = ( /obj/structure/railing{ dir = 8 @@ -71523,22 +76328,37 @@ /turf/open/floor/iron/large, /area/station/maintenance/starboard/central) "uDl" = ( -/obj/effect/landmark/firealarm_sanity, -/turf/open/openspace, -/area/station/command/meeting_room/council) -"uDv" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"uDD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/trimline/brown/filled/line{ +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"uDp" = ( +/obj/structure/railing{ dir = 1 }, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/mess, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) +"uDx" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/openspace, +/area/station/engineering/lobby) +"uDD" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/iron, +/turf/open/floor/iron/dark/textured, /area/station/cargo/sorting) "uDE" = ( /obj/effect/turf_decal/trimline/yellow/corner{ @@ -71568,6 +76388,7 @@ /obj/structure/railing/corner/end{ dir = 4 }, +/obj/machinery/door/firedoor/border_only, /turf/open/floor/iron, /area/station/cargo/storage) "uDX" = ( @@ -71580,6 +76401,13 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison/safe) +"uEi" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/checker, +/area/station/engineering/atmos/upper) "uEk" = ( /obj/structure/showcase/cyborg/old{ dir = 4; @@ -71590,7 +76418,11 @@ network = list("minisat") }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"uEl" = ( +/obj/effect/spawner/random/contraband/narcotics, +/turf/open/floor/plating, +/area/station/maintenance/port) "uEn" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -71599,10 +76431,6 @@ /obj/item/stack/rods, /turf/open/openspace, /area/station/maintenance/port/aft) -"uEs" = ( -/obj/effect/spawner/random/structure/crate_loot, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "uEz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -71610,23 +76438,35 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) "uEG" = ( -/obj/structure/reagent_dispensers/plumbed/storage, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, -/obj/item/radio/intercom/directional/east, +/obj/item/reagent_containers/cup/bottle/epinephrine{ + pixel_x = 6; + pixel_y = -6 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = -2; + pixel_y = -7 + }, +/obj/item/reagent_containers/dropper{ + pixel_x = 2; + pixel_y = -11 + }, +/obj/structure/closet/crate/science, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/structure/sign/poster/official/safety_eye_protection/directional/east, /turf/open/floor/iron/dark, /area/station/medical/chemistry) "uEL" = ( -/obj/effect/turf_decal/caution/stand_clear, -/turf/open/floor/iron/dark, +/obj/structure/railing, +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/iron, /area/station/cargo/storage) -"uEM" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/access/all/engineering/external, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "uEP" = ( /obj/structure/table/wood, /obj/item/radio/intercom, @@ -71636,12 +76476,28 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/carbon_input, /turf/open/floor/engine/co2, /area/station/engineering/atmos/upper) +"uEU" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) "uEZ" = ( -/obj/structure/ladder, /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, +/obj/machinery/chem_heater/withbuffer, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) +"uFe" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "uFj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71649,22 +76505,40 @@ /obj/effect/turf_decal/trimline/red/warning, /turf/open/floor/iron/dark, /area/station/security/brig) +"uFl" = ( +/obj/effect/spawner/structure/window, +/obj/structure/curtain/cloth{ + color = "#666666" + }, +/turf/open/floor/plating, +/area/station/medical/break_room) "uFo" = ( -/obj/effect/turf_decal/siding/white, -/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/dark_blue/opposingcorners, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 9 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"uFv" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "uFH" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner, /obj/effect/spawner/random/maintenance, /turf/open/space/openspace, /area/space/nearstation) +"uFL" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/space_heater, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos) "uFM" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -71702,6 +76576,14 @@ /obj/effect/landmark/start/hangover, /turf/open/openspace, /area/station/hallway/primary/starboard) +"uGm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/cigbutt{ + pixel_x = 8; + pixel_y = -2 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "uGo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71712,16 +76594,18 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "uGt" = ( -/obj/structure/tank_holder/extinguisher, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/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/medical/cryo) "uGx" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/obj/effect/turf_decal/tile/green{ - dir = 1 +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) @@ -71733,7 +76617,7 @@ /obj/effect/turf_decal/stripes/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "uGH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/wood{ @@ -71742,14 +76626,14 @@ /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) "uGJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/structure/railing{ - dir = 8 +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/item/storage/belt/utility{ + pixel_y = 6 }, -/obj/effect/decal/cleanable/rubble, -/turf/open/floor/iron/dark/smooth_large, -/area/station/cargo/miningoffice) +/turf/open/floor/iron, +/area/station/cargo/storage) "uGP" = ( /obj/effect/turf_decal/siding/purple/corner, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -71758,32 +76642,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/lab) -"uGT" = ( -/obj/structure/railing, -/obj/machinery/door/firedoor/border_only, -/obj/structure/closet/crate/medical, -/obj/item/paper_bin{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/stamp{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/stamp/denied{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/effect/spawner/random/maintenance, -/obj/item/pen/red{ - pixel_y = 10 - }, -/obj/structure/curtain/cloth/fancy/mechanical{ - name = "Psychologist's Office Curtains"; - id = "psychpriv" - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "uGV" = ( /obj/effect/turf_decal/box/corners{ dir = 1 @@ -71791,21 +76649,16 @@ /obj/machinery/flasher/portable, /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) -"uHe" = ( +"uHd" = ( /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/miningoffice) -"uHg" = ( -/obj/structure/table/wood, -/obj/machinery/computer/arcade/orion_trail{ - desc = "For gamers only. Casuals need not apply."; - icon_screen = "library"; - icon_state = "oldcomp"; - name = "Gamer Computer" +/obj/effect/mapping_helpers/mail_sorting/medbay/cmo_office, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4 }, -/turf/open/floor/wood, -/area/station/commons/dorms) +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "uHh" = ( /obj/machinery/computer/teleporter{ dir = 1 @@ -71815,14 +76668,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"uHk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "uHo" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -71848,15 +76693,18 @@ codes_txt = "patrol;next_patrol=16-Laundry"; location = "15-EVA" }, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "uHD" = ( -/obj/structure/chair{ +/obj/effect/landmark/start/cargo_technician, +/obj/structure/railing{ dir = 4 }, -/obj/effect/turf_decal/box/corners, -/turf/open/floor/engine/hull, -/area/space/nearstation) +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "uHH" = ( /obj/machinery/washing_machine, /turf/open/floor/iron/dark/textured_large, @@ -71868,13 +76716,12 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"uHO" = ( -/obj/item/cigbutt{ - pixel_x = -9; - pixel_y = -2 +"uHT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 }, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/maintenance/disposal) "uHV" = ( /obj/structure/chair/stool/bar/directional/west, /obj/effect/turf_decal/siding/wood{ @@ -71886,17 +76733,36 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood/large, /area/station/commons/lounge) -"uHY" = ( -/obj/machinery/recharge_station, +"uHW" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, /turf/open/floor/iron/dark, -/area/station/commons/dorms) -"uId" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/structure/sign/poster/official/no_erp/directional/north, -/obj/machinery/light/directional/north, -/turf/open/openspace, -/area/station/commons/dorms) +/area/station/medical/chemistry) +"uIf" = ( +/obj/structure/disposalpipe/segment, +/obj/item/paper_bin{ + pixel_y = 6; + pixel_x = -4 + }, +/obj/item/stamp/head/ce{ + pixel_x = 7 + }, +/obj/item/stamp/denied{ + pixel_x = 7; + pixel_y = 10 + }, +/obj/item/pen, +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/siding/yellow, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "uIi" = ( /obj/machinery/telecomms/bus/preset_two, /obj/effect/turf_decal/tile/brown/fourcorners, @@ -71914,10 +76780,6 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) -"uIx" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "uIA" = ( /obj/structure/railing{ dir = 4 @@ -71948,22 +76810,12 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"uJy" = ( -/obj/structure/table, -/obj/item/rcl/pre_loaded{ - pixel_y = 7 - }, -/obj/item/stack/pipe_cleaner_coil/random, -/obj/item/stack/pipe_cleaner_coil/random, -/obj/item/stack/pipe_cleaner_coil/random, -/obj/item/stack/pipe_cleaner_coil/random, -/obj/item/stack/pipe_cleaner_coil/random, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/green/opposingcorners{ - dir = 1 +"uJF" = ( +/obj/item/statuebust{ + pixel_y = 12 }, -/turf/open/floor/iron/dark, -/area/station/commons/storage/art) +/turf/open/floor/engine/hull/air, +/area/station/maintenance/department/crew_quarters/dorms) "uJI" = ( /obj/structure/table, /obj/item/food/grown/banana{ @@ -71977,17 +76829,6 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/iron, /area/station/construction/storage_wing) -"uJR" = ( -/obj/item/ammo_casing/spent{ - pixel_x = -11; - pixel_y = -5 - }, -/obj/item/ammo_casing/spent{ - pixel_x = -6; - pixel_y = 2 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "uJX" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -71999,13 +76840,15 @@ "uKa" = ( /turf/closed/wall, /area/station/security/warden) -"uKf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma{ - dir = 4 +"uKb" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/surgery, +/obj/effect/turf_decal/trimline/blue/warning{ + dir = 1 }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/surgery) "uKh" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -72013,11 +76856,6 @@ }, /turf/open/openspace, /area/station/construction/storage_wing) -"uKm" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "uKn" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 1 @@ -72039,6 +76877,17 @@ dir = 8 }, /area/station/commons/lounge) +"uKr" = ( +/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/structure/railing, +/turf/open/floor/catwalk_floor/iron, +/area/station/commons/dorms) "uKt" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -72049,12 +76898,33 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) +"uKy" = ( +/obj/item/storage/toolbox/mechanical/old, +/obj/item/clothing/mask/gas, +/obj/item/toy/balloon/arrest, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) +"uKL" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/welded, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plating, +/area/station/maintenance/port) "uKM" = ( -/obj/effect/spawner/structure/window/reinforced, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/right/directional/east{ + name = "Pharmacy Desk" + }, +/obj/effect/turf_decal/tile/yellow/full, +/obj/machinery/door/window/right/directional/west{ + name = "Pharmacy Desk"; + req_access = list("pharmacy") + }, /obj/machinery/door/poddoor/shutters/preopen{ dir = 4; id = "chemshutters"; - name = "Chemistry Shutters" + name = "Pharmacy Shutters" }, /turf/open/floor/plating, /area/station/medical/pharmacy) @@ -72071,6 +76941,11 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) +"uKO" = ( +/obj/structure/lattice, +/obj/effect/landmark/firealarm_sanity, +/turf/open/openspace, +/area/station/commons/dorms) "uKP" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -72086,7 +76961,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"uLa" = ( +/obj/effect/turf_decal/trimline/white/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "uLb" = ( /obj/structure/closet/crate/secure/trashcart, /obj/item/sord, @@ -72101,6 +76985,11 @@ /obj/structure/lattice, /turf/open/openspace, /area/station/maintenance/port/aft) +"uLe" = ( +/obj/structure/table/wood/poker, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "uLf" = ( /obj/structure/chair/comfy/brown{ dir = 4 @@ -72126,26 +77015,19 @@ "uLj" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/corner, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "uLo" = ( -/obj/machinery/computer/operating{ - dir = 4 - }, /obj/effect/turf_decal/tile/red/half/contrasted, -/obj/machinery/airalarm/directional/west, -/obj/structure/cable, -/obj/machinery/camera/autoname/directional/west{ - c_tag = "Medbay - Lower Morgue" - }, +/obj/effect/landmark/start/coroner, /turf/open/floor/iron/dark/textured_edge{ dir = 1 }, /area/station/medical/morgue) "uLt" = ( +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/dark/half/contrasted{ dir = 8 }, -/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) "uLw" = ( @@ -72157,6 +77039,22 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/ordnance/storage) +"uLD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/lattice/catwalk, +/obj/structure/sign/poster/contraband/singletank_bomb/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/openspace, +/area/station/maintenance/starboard/central/upper) +"uLI" = ( +/obj/effect/mob_spawn/corpse/human/assistant, +/obj/structure/closet/crate/trashcart, +/obj/effect/mob_spawn/corpse/human/monkey, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "uLL" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -72183,21 +77081,9 @@ }, /turf/open/floor/iron/dark/textured_corner, /area/station/science/ordnance) -"uMy" = ( -/obj/machinery/shower/directional/east, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/virology) -"uMD" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/obj/machinery/power/energy_accumulator/tesla_coil/anchored{ - cable_layer = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 10 - }, -/obj/structure/cable/layer1, -/turf/open/floor/engine, -/area/station/engineering/supermatter) +"uMt" = ( +/turf/open/openspace, +/area/station/maintenance/starboard/aft/upper) "uME" = ( /obj/structure/stairs/south, /obj/structure/railing{ @@ -72207,107 +77093,105 @@ dir = 1 }, /area/station/service/library/printer) -"uMT" = ( -/obj/effect/turf_decal/siding/wood{ +"uMG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) +"uMJ" = ( +/obj/effect/turf_decal/siding{ dir = 1 }, -/obj/structure/chair{ - dir = 1 +/obj/effect/turf_decal/trimline/white/line{ + dir = 8; + pixel_x = 8 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"uNn" = ( -/obj/structure/table, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/spawner/random/techstorage/command_all, -/obj/effect/turf_decal/tile/red/opposingcorners{ +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) +"uNu" = ( +/obj/effect/turf_decal/trimline/green/filled/corner, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"uNo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"uNG" = ( -/obj/machinery/washing_machine, -/obj/machinery/airalarm/directional/north, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/virology) "uNJ" = ( /obj/item/radio/intercom/prison/directional/north, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) -"uNV" = ( -/obj/structure/chair{ - dir = 8 - }, +"uNT" = ( +/obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/effect/landmark/start/assistant, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "uNY" = ( -/obj/structure/bed{ +/obj/machinery/light_switch/directional/west, +/obj/machinery/rnd/production/techfab/department/medical, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) +"uOx" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 4 }, -/obj/item/bedsheet/cmo{ - dir = 1 +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 4 }, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) -"uOh" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 8 }, -/obj/effect/turf_decal/trimline/red/line, -/obj/effect/landmark/start/hangover/closet, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"uOo" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers{ - dir = 10 +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 }, -/turf/closed/wall/r_wall, -/area/station/maintenance/disposal/incinerator) -"uOx" = ( -/obj/structure/table/glass, -/obj/machinery/wall_healer/directional/west, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +/obj/machinery/vending/coffee{ + pixel_x = -3 }, -/obj/item/storage/medkit/regular, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "uOC" = ( /obj/machinery/vending/wardrobe/hydro_wardrobe, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"uOF" = ( -/turf/open/floor/iron/dark, -/area/station/engineering/hallway) "uOH" = ( /obj/structure/chair, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/station/security/interrogation) +"uOL" = ( +/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, +/obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/effect/turf_decal/trimline/white/filled/warning{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"uOO" = ( +/obj/structure/chair/office, +/obj/effect/landmark/start/chaplain, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet, +/area/station/service/chapel/office) "uOR" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, /turf/open/floor/wood/large, /area/station/hallway/secondary/service) -"uOS" = ( -/obj/structure/table/glass, -/obj/item/storage/fancy/candle_box, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "uOW" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -72318,16 +77202,14 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) -"uPn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"uPj" = ( +/obj/machinery/newscaster/directional/east, +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/obj/effect/landmark/start/paramedic, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "uPq" = ( /obj/structure/railing/corner{ dir = 1 @@ -72344,22 +77226,16 @@ "uPu" = ( /turf/open/floor/wood, /area/station/service/library) -"uPy" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 5 - }, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) -"uPB" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/obj/machinery/power/energy_accumulator/grounding_rod/anchored{ - cable_layer = 1 +"uPz" = ( +/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, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 }, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible, -/obj/structure/cable/layer1, -/turf/open/floor/engine, -/area/station/engineering/supermatter) +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "uPL" = ( /obj/item/controller, /obj/item/compact_remote, @@ -72374,26 +77250,69 @@ /obj/item/multitool/circuit, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) +"uPQ" = ( +/obj/structure/sign/warning/vacuum/external/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) +"uPY" = ( +/obj/machinery/door/airlock{ + name = "Emergency Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft) +"uPZ" = ( +/obj/structure/closet/lasertag/blue, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "uQh" = ( /turf/open/floor/iron/dark, /area/station/security/medical) +"uQi" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/fluff/paper/stack{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) +"uQl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/sign/poster/official/random/directional/east, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron, +/area/station/commons/dorms) "uQv" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 2 }, -/turf/open/floor/iron/white/textured_corner{ - dir = 8 +/obj/item/clothing/glasses/hud/health{ + pixel_y = 10 }, -/area/station/medical/surgery) +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "uQy" = ( /obj/structure/closet/crate/bin, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/satellite) -"uQH" = ( -/obj/structure/girder, -/obj/structure/grille, +/area/station/ai/satellite/maintenance/storage) +"uQX" = ( +/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/starboard/aft) +/area/station/maintenance/starboard) "uRd" = ( /turf/open/openspace, /area/station/maintenance/port/fore) @@ -72402,19 +77321,6 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron, /area/station/construction/storage_wing) -"uRp" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/railing/corner/end, -/obj/effect/turf_decal/siding/dark/corner{ - dir = 4 - }, -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) "uRs" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -72428,25 +77334,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/openspace, /area/station/hallway/secondary/exit/departure_lounge) -"uRu" = ( -/obj/structure/table, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/stock_parts/power_store/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/stock_parts/power_store/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"uRx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/trash/boritos, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) "uRy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72464,30 +77351,30 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/sepia, /area/station/hallway/secondary/construction) -"uRB" = ( -/obj/machinery/atmospherics/pipe/smart/simple/supply{ - dir = 4 +"uRA" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 }, -/turf/closed/wall/r_wall, -/area/station/maintenance/disposal/incinerator) -"uRK" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/black, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_x = 5 +/obj/structure/table, +/obj/item/flashlight{ + pixel_y = -2 }, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_x = 5 +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 }, -/obj/item/clothing/gloves/color/black, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"uRD" = ( +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "SM_shutters"; + name = "Supermatter Radiation Shutters"; dir = 1 }, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/obj/machinery/atmospherics/components/binary/pump/off/cyan/visible, +/obj/effect/turf_decal/trimline/blue, +/turf/open/floor/plating, +/area/station/engineering/supermatter) "uRM" = ( /obj/structure/table, /obj/effect/spawner/random/trash/janitor_supplies{ @@ -72537,21 +77424,45 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"uSa" = ( +/obj/structure/sign/departments/medbay/alt/directional/south, +/turf/open/openspace, +/area/station/medical/abandoned) "uSg" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/freezer, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"uSh" = ( +/obj/effect/turf_decal/trimline/white/line{ + dir = 8; + pixel_x = 8 + }, +/obj/effect/turf_decal/trimline/white/line, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "uSl" = ( /turf/open/floor/wood/tile, /area/station/maintenance/port/aft) +"uSn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/textured_large, +/area/station/medical/virology) "uSq" = ( /obj/machinery/camera/autoname/directional/north, /turf/open/openspace, /area/station/hallway/primary/port) -"uSs" = ( -/turf/open/floor/plating/airless, -/area/station/maintenance/port/aft) "uSw" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/structure/closet/secure_closet, @@ -72561,19 +77472,51 @@ /obj/item/poster/random_contraband, /turf/open/floor/iron/dark, /area/station/maintenance/port) -"uSE" = ( -/obj/effect/turf_decal/trimline/white/corner{ - dir = 4 +"uSz" = ( +/obj/machinery/holopad, +/turf/open/floor/iron/dark/smooth_large, +/area/station/security/checkpoint/engineering) +"uSI" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/yellow/mid_joiner{ + dir = 8 }, +/obj/effect/turf_decal/trimline/yellow/mid_joiner{ + dir = 1 + }, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) +"uSK" = ( +/obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) +/obj/structure/fluff/paper/stack{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/filingcabinet/chestdrawer, +/obj/item/folder/yellow, +/obj/item/hand_labeler_refill{ + pixel_x = -1 + }, +/obj/structure/fluff/paper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft) "uSL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) +"uSP" = ( +/obj/structure/sink/directional/west, +/obj/machinery/iv_drip, +/obj/structure/mirror/directional/east, +/turf/open/floor/iron/dark/textured_corner{ + dir = 8 + }, +/area/station/medical/surgery) "uSV" = ( /mob/living/basic/lizard/wags_his_tail, /obj/structure/bed, @@ -72628,6 +77571,14 @@ }, /turf/open/space/basic, /area/space) +"uTj" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/machinery/camera/autoname/directional/west, +/turf/open/space/basic, +/area/space/nearstation) "uTy" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair, @@ -72636,40 +77587,41 @@ /obj/effect/turf_decal/tile/dark/full, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"uTI" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/upper) "uTJ" = ( -/obj/machinery/light/directional/west, -/turf/open/openspace, -/area/station/cargo/storage) -"uTK" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 +/obj/structure/sign/directions/evac/directional/north{ + pixel_y = 4 }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) +/obj/structure/sign/directions/vault/directional/north{ + pixel_y = -2 + }, +/turf/closed/wall, +/area/station/maintenance/port/fore) "uTP" = ( /obj/effect/turf_decal/siding/dark, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"uTU" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/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/engineering/atmos/project) +/area/station/ai/satellite/interior) "uTY" = ( /obj/structure/fake_stairs/directional/north, /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/science/robotics) +"uUg" = ( +/obj/structure/lattice/catwalk, +/obj/effect/landmark/start/hangover, +/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/electric_shock/directional/west, +/turf/open/openspace, +/area/station/hallway/primary/starboard) +"uUx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/can{ + pixel_x = -8 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "uUC" = ( /obj/structure/bed, /obj/structure/toilet/greyscale{ @@ -72695,24 +77647,10 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) -"uUH" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"uUK" = ( -/obj/machinery/light/directional/south, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/item/kirbyplants/random, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) "uUL" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/miningoffice) "uUO" = ( @@ -72729,6 +77667,16 @@ /obj/effect/landmark/start/cyborg, /turf/open/floor/iron/smooth, /area/station/science/robotics) +"uUS" = ( +/obj/item/cigbutt, +/obj/structure/curtain, +/obj/machinery/duct, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/fluff/shower_drain, +/turf/open/floor/iron/freezer, +/area/station/commons/dorms) "uUT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72737,16 +77685,20 @@ /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/station/ai_monitored/command/nuke_storage) -"uUX" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/command/vault) "uUY" = ( /obj/structure/chair/plastic, /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/black, /area/station/maintenance/hallway/abandoned_recreation) +"uVb" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "uVf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/west, @@ -72757,17 +77709,37 @@ /turf/closed/wall, /area/station/commons/toilet/auxiliary) "uVn" = ( -/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/stripes/line, +/obj/structure/sign/poster/random/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) +"uVD" = ( +/obj/structure/mop_bucket{ + pixel_y = 9 + }, +/obj/item/reagent_containers/cup/bucket{ + pixel_x = 6; + pixel_y = -4 + }, +/obj/item/mop, /turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/area/station/maintenance/starboard) "uVL" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/icecream_vat, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/structure/showcase/machinery/cloning_pod{ + desc = "An old decommissioned scanner, permanently scuttled."; + icon_state = "scanner"; + name = "decommissioned cloning scanner" + }, +/obj/effect/decal/cleanable/greenglow, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "uVN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -72784,45 +77756,32 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood/tile, /area/station/science/robotics) -"uVX" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/openspace, -/area/station/medical/storage) -"uVY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/assistant, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "uWi" = ( /turf/open/openspace, -/area/station/ai_monitored/command/storage/eva) -"uWu" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister/air, +/area/station/command/eva) +"uWp" = ( +/obj/machinery/duct, /turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/maintenance/starboard/central) "uWE" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/obj/item/storage/box/shipping{ - pixel_x = 4; - pixel_y = 10 +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/obj/item/clothing/head/costume/mailman, -/turf/open/floor/iron, +/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, /area/station/cargo/sorting) +"uWI" = ( +/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{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/cmo) "uWO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -72846,10 +77805,19 @@ /turf/open/floor/iron/dark, /area/station/science/cytology) "uXj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/carpet/blue, +/area/station/medical/break_room) +"uXm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"uXx" = ( +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/carpet/black, +/area/station/ai/upload/chamber) "uXz" = ( /obj/structure/bed{ dir = 4 @@ -72867,12 +77835,12 @@ /turf/open/floor/iron/dark/textured, /area/station/medical/virology) "uXE" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, /turf/open/floor/iron, /area/station/cargo/storage) "uXI" = ( @@ -72885,14 +77853,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"uXR" = ( -/obj/structure/table/wood/fancy/cyan, -/obj/item/book/manual/wiki/atmospherics{ - pixel_y = 8 - }, -/obj/machinery/light/directional/east, +"uXL" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small/directional/east, +/obj/structure/sign/warning/directional/east, /turf/open/floor/engine, -/area/station/engineering/break_room) +/area/station/engineering/supermatter/room) +"uXN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard) "uXU" = ( /obj/effect/spawner/random/structure/chair_flipped, /obj/effect/decal/cleanable/dirt, @@ -72917,6 +77890,19 @@ /obj/effect/spawner/random/medical/surgery_tool, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) +"uYg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) +"uYs" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/glass/plasma, +/area/station/engineering/atmos/upper) "uYu" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -72930,16 +77916,9 @@ dir = 8 }, /obj/machinery/vending/coffee, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"uYL" = ( -/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/starboard/lesser) "uYP" = ( /obj/effect/spawner/random/trash/box, /obj/item/clothing/gloves/color/fyellow/old, @@ -72949,31 +77928,27 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"uYX" = ( -/obj/structure/cable, -/turf/closed/wall/r_wall, -/area/station/engineering/lobby) -"uZg" = ( -/obj/effect/turf_decal/stripes/line{ +"uYT" = ( +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"uYY" = ( +/obj/effect/turf_decal/trimline/dark/arrow_ccw{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 +/obj/effect/turf_decal/trimline/dark/arrow_ccw{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/hfr_room) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/edge{ + dir = 4 + }, +/area/station/hallway/primary/fore) "uZn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/light/cold/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/server) -"uZs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/flashlight/lamp, -/turf/open/floor/iron, -/area/station/maintenance/starboard/central) "uZu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72986,15 +77961,16 @@ /area/station/service/library) "uZQ" = ( /obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/turf_decal/siding/blue, -/turf/open/floor/engine/hull/air, +/turf/open/openspace, /area/station/medical/medbay/central) +"uZR" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/aft) "uZS" = ( /obj/effect/turf_decal/siding/purple, /obj/effect/turf_decal/siding/purple{ @@ -73030,31 +78006,19 @@ dir = 8 }, /area/station/hallway/primary/starboard) +"vaj" = ( +/obj/item/radio/intercom/directional/south, +/turf/open/floor/glass/reinforced, +/area/station/medical/chemistry) +"vap" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "vav" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/stairs/medium, /area/station/medical/virology) -"vax" = ( -/obj/effect/turf_decal/trimline/white/line{ - dir = 8; - pixel_x = 8 - }, -/obj/effect/turf_decal/trimline/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) -"vaD" = ( -/obj/machinery/door/airlock/external{ - name = "Common Mining Dock" - }, -/obj/effect/landmark/navigate_destination/dockaux, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "vaF" = ( /obj/structure/railing{ dir = 8 @@ -73072,11 +78036,16 @@ /obj/machinery/vending/boozeomat, /turf/open/floor/iron/checker, /area/station/service/bar) +"vaR" = ( +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) "vbe" = ( /obj/structure/railing, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/painting/library_private{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/item/cigbutt{ pixel_x = -12; @@ -73099,23 +78068,28 @@ }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"vbB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"vbx" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/corner{ dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) -"vbV" = ( -/obj/machinery/status_display/ai/directional/north, -/turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai_upload) +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/maintenance/aft) "vbX" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/flora/rock/pile/jungle/style_2, /obj/structure/flora/grass/jungle/a/style_5, /turf/open/floor/grass, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"vbZ" = ( +/obj/machinery/newscaster/directional/south, +/turf/open/openspace, +/area/station/maintenance/aft/upper) +"vca" = ( +/turf/open/openspace, +/area/station/maintenance/aft/upper) "vcf" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -73125,34 +78099,35 @@ c_tag = "Medbay - Upper Hallway"; network = list("ss13","medbay") }, -/turf/open/floor/iron/dark/textured_large, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/white, /area/station/medical/medbay/central) "vcm" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/airless, /area/station/maintenance/starboard/aft) -"vcn" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/cigbutt{ - pixel_x = 8; - pixel_y = -2 +"vcp" = ( +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 2; + name = "Mix to Port" }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"vcF" = ( -/obj/structure/sign/warning/hot_temp, -/turf/closed/wall/r_wall, -/area/station/maintenance/disposal/incinerator) +/obj/effect/turf_decal/trimline/dark_green, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "vcH" = ( /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/machinery/navbeacon{ codes_txt = "patrol;next_patrol=5-Litterbox"; location = "4-RnD" }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2 + }, +/obj/effect/mapping_helpers/mail_sorting/science/robotics, /turf/open/floor/iron, /area/station/hallway/primary/aft) "vcI" = ( @@ -73165,35 +78140,32 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) -"vcT" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, +"vcX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"vdg" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/north, -/obj/machinery/power/energy_accumulator/grounding_rod/anchored{ - cable_layer = 1 +/area/station/engineering/atmos) +"vcY" = ( +/obj/machinery/flasher/directional/west, +/obj/structure/table/wood/fancy/black, +/obj/item/ai_module/supplied/freeform{ + pixel_x = -2; + pixel_y = -2 }, -/obj/machinery/atmospherics/pipe/smart/manifold/orange/visible{ - dir = 1 +/obj/item/ai_module/reset{ + pixel_x = 2; + pixel_y = 8 }, -/obj/structure/cable/layer1, -/turf/open/floor/engine, -/area/station/engineering/supermatter) +/turf/open/floor/iron/dark/smooth_large, +/area/station/ai/upload/chamber) "vdh" = ( -/obj/structure/secure_safe/directional/north{ - name = "armory safe A"; - pixel_x = -22; - pixel_y = 0 - }, /obj/structure/rack, /obj/effect/spawner/random/armory/laser_gun, +/obj/structure/secure_safe/directional/west{ + name = "Armory safe A" + }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "vdi" = ( /obj/effect/landmark/start/ai/secondary, /obj/effect/turf_decal/delivery, @@ -73214,7 +78186,13 @@ name = "Private Channel" }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"vdk" = ( +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/edge{ + dir = 1 + }, +/area/station/hallway/primary/central) "vdl" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -73222,24 +78200,12 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"vdm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "vdq" = ( /obj/structure/broken_flooring/side/always_floorplane/directional/north, /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/aft) -"vdr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) "vdI" = ( /obj/structure/table, /obj/item/folder/red{ @@ -73254,21 +78220,14 @@ }, /turf/open/floor/carpet, /area/station/service/lawoffice) -"vdN" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/railing/corner/end{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "vdP" = ( /obj/structure/stairs/north, /turf/open/floor/iron/stairs/medium, /area/station/medical/medbay/central) +"vdZ" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) "vef" = ( /obj/machinery/door/airlock{ name = "Coffin Storage" @@ -73283,15 +78242,31 @@ /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_smooth, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"vel" = ( -/turf/open/floor/catwalk_floor, -/area/station/engineering/lobby) +/area/station/ai/satellite/foyer) +"veh" = ( +/turf/open/openspace, +/area/station/engineering/atmos/upper) +"vek" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/gravity_generator) "vem" = ( /obj/structure/lattice, /obj/machinery/camera/autoname/directional/south, /turf/open/openspace, /area/station/security/courtroom) +"vep" = ( +/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/item/stack/rods{ + amount = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "ver" = ( /obj/effect/spawner/random/maintenance, /obj/item/storage/fancy/candle_box, @@ -73309,10 +78284,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"vet" = ( -/obj/effect/decal/cleanable/insectguts, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "veu" = ( /turf/closed/indestructible/riveted{ desc = "A wall impregnated with Fixium, able to withstand massive explosions with ease"; @@ -73330,49 +78301,21 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron, /area/station/science/lab) -"veS" = ( -/obj/structure/table, -/obj/item/storage/toolbox/artistic{ - pixel_x = -1; - pixel_y = 12 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/paper_bin{ - pixel_x = -6; - pixel_y = -7 - }, -/obj/item/stamp{ - pixel_x = 7; - pixel_y = -1 - }, -/obj/item/stamp/denied{ - pixel_x = 8; - pixel_y = -7 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/wood, -/area/station/service/library/printer) "veT" = ( /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) -"vfb" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/mapping_helpers/broken_machine, -/obj/machinery/vending/tool, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "vfe" = ( /turf/open/floor/iron, /area/station/commons/dorms) +"vfj" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "vfp" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -73393,11 +78336,31 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/white/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) +"vfQ" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "vfV" = ( /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"vfX" = ( +/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/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "vfZ" = ( /obj/structure/broken_flooring/side/directional/north, /turf/open/floor/plating, @@ -73408,6 +78371,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/service/chapel) +"vgf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment, +/turf/open/openspace, +/area/station/maintenance/starboard/central/upper) "vgh" = ( /obj/structure/lattice/catwalk, /obj/machinery/griddle, @@ -73432,9 +78402,6 @@ /obj/structure/railing{ dir = 4 }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, /obj/structure/table, /obj/item/radio/off{ pixel_y = 9 @@ -73448,47 +78415,54 @@ pixel_y = 4 }, /obj/item/radio/off, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/stripes{ + dir = 5 + }, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/textured, +/area/station/command/eva) "vgB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/sign/poster/contraband/grey_tide/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"vgD" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "vgF" = ( /obj/structure/closet/firecloset, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"vgJ" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "vgN" = ( -/obj/machinery/newscaster/directional/north, -/obj/machinery/conveyor{ - dir = 4; - id = "packageSort2" +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/obj/machinery/camera/directional/north{ - c_tag = "Cargo Bay - Deliveries" +/obj/machinery/computer/security/qm{ + dir = 4 }, -/obj/effect/turf_decal/trimline/brown/filled, -/obj/structure/railing/corner/end/flip{ - dir = 8 +/obj/machinery/button/door/directional/west{ + pixel_y = 6; + name = "Cargo Lockdown"; + id = "cargolockdown"; + req_access = list("cargo") }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/cargo/sorting) +/obj/machinery/button/door/directional/west{ + id = "CargowatchShutter"; + name = "Window Shutters"; + pixel_y = -6 + }, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) +"vgV" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/maintenance/starboard) +"vgX" = ( +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "vhe" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, @@ -73515,21 +78489,6 @@ }, /turf/open/floor/iron/checker, /area/station/service/bar/backroom) -"vht" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/corner{ - dir = 4 - }, -/obj/structure/fluff/paper/stack{ - dir = 4 - }, -/obj/structure/filingcabinet, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/item/folder/yellow{ - pixel_y = -6 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "vhv" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -73541,6 +78500,13 @@ /obj/structure/closet/bombcloset/security, /turf/open/floor/iron/dark, /area/station/security/office) +"vhE" = ( +/obj/structure/table, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/aft) "vhJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -73571,19 +78537,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"viy" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/fluff/paper/stack{ - desc = "A stack of various papers, absolutely unreadable due to scorch marks and aging." - }, -/obj/structure/fluff/paper{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "viD" = ( /obj/effect/turf_decal/siding/purple, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -73595,6 +78548,14 @@ /obj/structure/sign/departments/rndserver/directional/north, /turf/open/floor/iron, /area/station/science/lab) +"viF" = ( +/obj/structure/bed, +/obj/machinery/light/small/directional/east, +/obj/effect/spawner/random/bedsheet, +/obj/effect/landmark/start/hangover, +/obj/structure/sign/clock/directional/east, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "viI" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ dir = 4 @@ -73608,14 +78569,7 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, -/area/station/ai_monitored/turret_protected/ai) -"viN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/chamber) "viS" = ( /obj/structure/chair/office{ dir = 8 @@ -73634,62 +78588,57 @@ /turf/open/floor/iron/freezer, /area/station/commons/toilet/auxiliary) "viV" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "main_surgery" +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/effect/turf_decal/trimline/white/filled/warning{ + dir = 1 }, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/medical/surgery) +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "vjc" = ( /obj/structure/closet/firecloset, -/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"vjC" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/item/radio/intercom/directional/north, -/turf/open/openspace, -/area/station/engineering/atmos/project) "vjS" = ( /obj/structure/transit_tube, /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/light/floor, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "vjZ" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/openspace, /area/station/security/detectives_office) "vka" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +/obj/machinery/cryo_cell, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/dark/textured, /area/station/medical/cryo) "vkd" = ( /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "vki" = ( /turf/open/openspace, /area/station/engineering/storage_shared) -"vkl" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/corner, -/obj/structure/fluff/paper/stack, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/structure/fluff/paper/stack{ - desc = "A stack of various papers, absolutely unreadable due to scorch marks and aging."; +"vkk" = ( +/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/opposingcorners{ dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) +"vky" = ( +/obj/machinery/vending/drugs, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "vkA" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 5 @@ -73717,6 +78666,21 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/wood, /area/station/security/courtroom) +"vkD" = ( +/obj/item/banner/cargo/mundane, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "vkO" = ( /obj/structure/railing, /obj/effect/turf_decal/trimline/brown/filled/line, @@ -73725,24 +78689,15 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/machinery/door/firedoor/border_only, /turf/open/floor/iron, /area/station/cargo/storage) "vkQ" = ( -/obj/structure/table/wood, -/obj/item/storage/briefcase/secure{ - pixel_y = 3 - }, -/turf/open/floor/carpet, -/area/station/command/meeting_room/council) -"vkU" = ( -/obj/item/clothing/head/cone{ - pixel_x = 5; - pixel_y = 10 +/obj/effect/turf_decal/siding/dark{ + dir = 4 }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "vkY" = ( /obj/structure/railing{ dir = 8 @@ -73766,6 +78721,15 @@ dir = 8 }, /area/station/science/ordnance) +"vla" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "vlc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -73813,21 +78777,32 @@ }, /area/station/hallway/primary/port) "vlE" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, +/obj/structure/window/spawner/directional/south, /turf/open/floor/plating, /area/station/maintenance/disposal) "vlH" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/space/openspace, /area/space/nearstation) -"vlK" = ( -/obj/effect/turf_decal/siding/white, +"vlI" = ( +/obj/machinery/door/airlock/maintenance{ + name = "CE's Maintenance Access" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, /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/smooth_large, -/area/station/hallway/primary/central) +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) +"vlK" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/item/kirbyplants/photosynthetic{ + pixel_y = 5; + pixel_x = 7 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "vma" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -73835,11 +78810,14 @@ }, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"vmd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +"vme" = ( +/obj/machinery/light/warm/directional/north, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "vmh" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment{ @@ -73847,6 +78825,11 @@ }, /turf/open/openspace, /area/station/hallway/secondary/construction) +"vmk" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/openspace, +/area/station/maintenance/starboard/upper) "vmt" = ( /obj/structure/disposalpipe/segment{ dir = 2 @@ -73871,9 +78854,31 @@ /obj/structure/disposalpipe/sorting/mail{ dir = 4 }, -/obj/effect/mapping_helpers/mail_sorting/medbay/chemistry, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) +"vmO" = ( +/obj/structure/rack, +/obj/item/clothing/ears/earmuffs, +/obj/item/clothing/under/color/blue, +/obj/item/clothing/neck/tie/blue{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/head/soft/blue, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) +"vmR" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "vmZ" = ( /obj/structure/table/reinforced, /obj/item/circuitboard/machine/vendor, @@ -73909,6 +78914,12 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) +"vnh" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable, +/obj/machinery/holopad, +/turf/open/floor/carpet/royalblue, +/area/station/command/heads_quarters/captain/private) "vnp" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/graffiti, @@ -73918,25 +78929,38 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/security/prison) +"vny" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "vnz" = ( /obj/effect/turf_decal/plaque{ - icon_state = "L7" - }, -/obj/effect/turf_decal/siding/green{ - dir = 1 + icon_state = "L8" }, -/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) +"vnC" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/structure/table/reinforced, +/obj/item/stock_parts/power_store/cell/high{ + charge = 100; + maxcharge = 15000 + }, +/obj/machinery/cell_charger, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "vnR" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) "vnV" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L12" +/obj/effect/turf_decal/trimline/dark/arrow_ccw{ + dir = 4 }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "voa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/wood, @@ -73958,17 +78982,6 @@ /obj/effect/landmark/carpspawn, /turf/open/space/openspace, /area/space) -"voi" = ( -/obj/structure/lattice/catwalk, -/turf/open/water, -/area/station/maintenance/starboard/fore) -"vok" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) "von" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/disposalpipe/segment{ @@ -73992,6 +79005,10 @@ }, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) +"voz" = ( +/obj/structure/disposalpipe/trunk/multiz, +/turf/closed/wall, +/area/station/medical/morgue) "voF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -74003,6 +79020,12 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) +"voO" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "voP" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -74014,12 +79037,14 @@ /turf/open/floor/iron, /area/station/science/lobby) "voU" = ( -/turf/open/openspace, -/area/station/medical/chemistry) -"voV" = ( +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "cmoprivacy"; + name = "Privacy Shutter" + }, /obj/effect/spawner/structure/window, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/command/heads_quarters/cmo) "voX" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /obj/structure/railing, @@ -74049,9 +79074,6 @@ }, /turf/open/openspace, /area/station/commons/fitness/recreation) -"vpi" = ( -/turf/open/floor/eighties, -/area/station/engineering/lobby) "vpo" = ( /obj/machinery/power/terminal{ dir = 1 @@ -74059,12 +79081,20 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"vpt" = ( -/obj/structure/chair/pew/right{ - dir = 4 +"vpw" = ( +/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_large, +/area/station/maintenance/port) +"vpy" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 }, -/turf/open/floor/carpet, -/area/station/maintenance/starboard/lesser) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "vpz" = ( /obj/structure/transport/linear, /turf/open/openspace, @@ -74083,6 +79113,12 @@ /obj/item/wirecutters, /turf/open/floor/iron/dark, /area/station/security/office) +"vpX" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "vqc" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -74092,14 +79128,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) -"vqi" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 8 - }, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/turf/open/floor/grass, -/area/station/engineering/lobby) "vql" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/warning{ @@ -74108,51 +79136,28 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/port) -"vqn" = ( -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics Testing Room" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/machinery/door/firedoor/heavy, -/obj/structure/cable, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) -"vqq" = ( -/obj/structure/table, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/spawner/random/techstorage/ai_all, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "vqs" = ( -/obj/machinery/door/airlock/mining{ - name = "Mining Office" +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 6; + pixel_y = 9 }, -/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/supply/mining, +/obj/item/pen, /obj/effect/turf_decal/tile/brown/fourcorners, -/obj/structure/disposalpipe/segment, /turf/open/floor/iron, -/area/station/cargo/miningoffice) +/area/station/hallway/primary/starboard) "vqu" = ( -/obj/structure/closet/crate/freezer, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) -"vqv" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/obj/structure/showcase/machinery/cloning_pod{ + desc = "An old prototype cloning pod, permanently decommissioned following the incident."; + name = "decommissioned cloner" }, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) +"vqv" = ( /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ dir = 4 }, @@ -74162,40 +79167,25 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) -"vqE" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/cleanable/crayon{ - icon_state = "body"; - name = "body"; - pixel_x = 12; - pixel_y = 1 - }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "revolution"; - name = "graffiti"; - paint_colour = "#FF0000"; - pixel_y = 32 - }, -/obj/item/ammo_casing/spent{ - pixel_x = 8; - pixel_y = 6 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"vqH" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) -"vqM" = ( -/obj/effect/turf_decal/siding/wood{ +/obj/effect/turf_decal/siding/blue{ dir = 1 }, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"vqx" = ( +/obj/machinery/shower/directional/south, +/obj/structure/sink/directional/east, +/obj/structure/mirror/directional/west, +/obj/item/razor{ + pixel_z = 7; + pixel_w = -7 + }, +/turf/open/floor/iron/freezer, +/area/station/commons/dorms) "vqP" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/newscaster/directional/south, @@ -74210,15 +79200,27 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"vqZ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/recharge_floor, -/area/station/maintenance/starboard/lesser) -"vrx" = ( -/obj/machinery/shower/directional/west, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) +"vra" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "holodeck" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/commons/fitness/recreation) +"vre" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/station/command/meeting_room/council) "vrA" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ @@ -74230,13 +79232,18 @@ /obj/machinery/light/directional/east, /turf/open/openspace, /area/station/science/xenobiology) -"vrO" = ( -/obj/structure/lattice/catwalk, -/obj/structure/disposalpipe/segment{ - dir = 10 +"vrR" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 }, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) +/obj/structure/table, +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "vsf" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -74252,30 +79259,6 @@ }, /turf/open/floor/carpet/stellar, /area/station/service/library) -"vsm" = ( -/obj/effect/spawner/random/entertainment/arcade{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"vsq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"vss" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) "vsv" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/chapel{ @@ -74292,6 +79275,12 @@ /obj/machinery/photocopier/prebuilt, /turf/open/floor/iron, /area/station/science/research) +"vsD" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/line, +/obj/structure/closet/radiation, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "vsK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74308,21 +79297,15 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 5 +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4 }, +/obj/effect/mapping_helpers/mail_sorting/medbay/virology, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"vsM" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/red/line, -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "vsO" = ( /obj/effect/turf_decal/trimline/dark_blue/line{ dir = 8 @@ -74337,7 +79320,7 @@ dir = 4 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "vsP" = ( /obj/structure/sign/poster/contraband/gorlex_recruitment, /turf/closed/wall/r_wall, @@ -74355,13 +79338,12 @@ /obj/machinery/holopad, /turf/open/floor/glass/reinforced, /area/station/science/ordnance) -"vsY" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/machinery/computer/security/telescreen/cmo/directional/east, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +"vsW" = ( +/obj/machinery/flasher/directional/west, +/obj/structure/table/wood/fancy/cyan, +/obj/effect/spawner/round_default_module, +/turf/open/floor/iron/dark/smooth_large, +/area/station/ai/upload/chamber) "vtc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock/virology{ @@ -74370,17 +79352,27 @@ /obj/effect/mapping_helpers/airlock/access/all/science/genetics, /turf/open/floor/iron/dark/textured_large, /area/station/science/genetics) -"vti" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 +"vth" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"vtm" = ( -/obj/machinery/camera/autoname/directional/north{ - c_tag = "Medbay - Upper Storage North Hallway" +/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/layer5{ + dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) +"vtm" = ( /obj/effect/turf_decal/siding/blue/corner, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/status_display/ai/directional/north, /turf/open/openspace, /area/station/medical/medbay/central) "vtu" = ( @@ -74401,31 +79393,28 @@ }, /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat_interior) -"vtF" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/interior) +"vtP" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "vtT" = ( /turf/open/floor/glass, /area/station/science/zoo) -"vua" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "vuc" = ( /obj/item/banner/cargo/mundane, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"vuh" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "vuo" = ( /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -74441,13 +79430,15 @@ /obj/machinery/light/small/red/dim/directional/west, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) -"vuy" = ( -/obj/effect/landmark/start/station_engineer, -/obj/structure/chair/office{ - dir = 1 +"vuC" = ( +/obj/structure/railing{ + dir = 8 }, -/turf/open/floor/iron, -/area/station/engineering/lobby) +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/dorms) "vuN" = ( /obj/machinery/telecomms/message_server/preset, /turf/open/floor/iron/dark/telecomms, @@ -74462,26 +79453,17 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/wood, /area/station/security/detectives_office) -"vuV" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/turf_decal/siding/dark{ - dir = 4 +"vuR" = ( +/obj/structure/table/reinforced, +/obj/item/rcl/pre_loaded{ + pixel_y = 5 }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/departments/aisat/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"vvb" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/book/manual/wiki/atmospherics, -/obj/structure/closet/secure_closet/atmospherics, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/disposal/incinerator) +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) "vvc" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -74522,15 +79504,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/explab) -"vvE" = ( -/obj/machinery/plumbing/input, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) -"vvL" = ( -/obj/item/cigbutt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "vvT" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/fake_stairs/directional/west, @@ -74538,14 +79511,6 @@ /obj/structure/stairs/west, /turf/open/floor/iron, /area/station/science/zoo) -"vvY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/obj/structure/light_construct/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/starboard/central) "vwa" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, @@ -74572,6 +79537,9 @@ /obj/structure/lattice/catwalk, /turf/open/space/openspace, /area/station/solars/starboard/aft) +"vwg" = ( +/turf/closed/wall/r_wall, +/area/station/hallway/primary/starboard) "vwh" = ( /obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -74586,18 +79554,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"vwp" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "vwr" = ( /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"vwx" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 9 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/no_smoking/circle/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "vwB" = ( /obj/machinery/camera/directional/east{ c_tag = "Arrivals - Aft Arm" @@ -74608,6 +79576,11 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) +"vwI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/vacuum/external/directional/south, +/turf/open/floor/plating, +/area/station/cargo/miningoffice) "vwK" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -74619,20 +79592,17 @@ /obj/machinery/air_sensor, /turf/open/floor/iron, /area/station/security/prison/mess) -"vwQ" = ( -/obj/structure/reagent_dispensers/fueltank/large, -/obj/effect/turf_decal/delivery/white{ - color = "#ff6600" - }, -/turf/open/floor/engine, -/area/station/engineering/break_room) -"vwR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"vwL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/structure/cable, -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard/upper) +"vxa" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/wood, +/area/station/maintenance/aft) "vxc" = ( /obj/machinery/door/airlock/security{ name = "Courtroom Cell" @@ -74640,6 +79610,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/security/courtroom) "vxe" = ( @@ -74657,13 +79628,19 @@ }, /turf/open/floor/iron/dark/smooth_half, /area/station/service/library) -"vxk" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/computer/atmos_control/plasma_tank{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +"vxi" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/wood, +/area/station/maintenance/starboard) +"vxr" = ( +/turf/closed/wall, +/area/station/maintenance/starboard/fore/upper) +"vxz" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "vxJ" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ @@ -74671,22 +79648,21 @@ }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"vyp" = ( -/obj/item/radio/intercom/directional/west, -/obj/machinery/modular_computer/preset/engineering{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 +"vxS" = ( +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) +"vyu" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/binary/pump/on/layer4{ + dir = 1; + name = "Airlock Pump"; + target_pressure = 300; + hide = 1 }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/engine_smes) -"vyt" = ( /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/plating, -/area/station/maintenance/starboard/aft) +/area/station/maintenance/starboard/fore/upper) "vyA" = ( /obj/structure/table/reinforced, /obj/item/camera, @@ -74702,35 +79678,49 @@ /obj/effect/spawner/random/trash/grime, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"vyG" = ( +/obj/machinery/computer/atmos_control/air_tank, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "vyH" = ( /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/aft) "vyV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/ai_monitored/turret_protected/ai_upload) -"vzf" = ( -/obj/structure/railing{ - dir = 1 +/obj/machinery/ai_slipper{ + uses = 8 }, -/obj/effect/turf_decal/siding/yellow{ +/turf/open/floor/iron/dark/textured_corner{ dir = 1 }, -/obj/item/plunger{ - pixel_x = -10; - pixel_y = 11 - }, -/obj/item/plunger{ - pixel_x = -14; - pixel_y = 6 +/area/station/ai/upload/chamber) +"vze" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner/end{ + dir = 8 }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) +"vzf" = ( +/obj/structure/easel, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/light/warm/directional/west, /turf/open/floor/iron/dark, -/area/station/medical/chemistry) +/area/station/commons/dorms) +"vzk" = ( +/obj/effect/decal/cleanable/blood/oil/slippery, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "vzq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/door/airlock/command/glass{ @@ -74741,36 +79731,39 @@ /turf/open/floor/iron/dark, /area/station/science/server) "vzr" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Cargo Lockdown Shutters"; + id = "cargolockdown"; dir = 8 }, -/obj/machinery/computer/cargo{ - dir = 1 +/obj/structure/table/reinforced, +/obj/structure/desk_bell{ + pixel_x = -10 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/brigdoor/right/directional/east{ + req_access = list("cargo"); + name = "Cargo Desk" }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/item/folder/yellow{ + pixel_x = 3; + pixel_y = 1 + }, +/obj/item/pen, /turf/open/floor/iron, /area/station/cargo/storage) -"vzx" = ( -/turf/open/floor/carpet, -/area/station/ai_monitored/command/storage/eva) "vzB" = ( /turf/closed/wall, /area/station/command/heads_quarters/hop) -"vzM" = ( -/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, -/area/station/hallway/primary/port) "vzN" = ( /obj/effect/turf_decal/tile/red/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/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "vzO" = ( /obj/effect/landmark/start/assistant, /turf/open/floor/iron, @@ -74797,16 +79790,13 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) -"vAa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "space-outpost" +"vzZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/door/airlock/external, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/external, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/carpet, +/area/station/maintenance/starboard) "vAd" = ( /obj/structure/grille, /obj/structure/lattice, @@ -74823,19 +79813,8 @@ /turf/open/floor/iron, /area/station/service/cafeteria) "vAh" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "cargoload" - }, -/obj/structure/plasticflaps, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, +/turf/open/floor/engine/hull/air, /area/station/cargo/storage) -"vAl" = ( -/obj/structure/ladder, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) "vAn" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -74852,40 +79831,6 @@ "vAs" = ( /turf/closed/wall, /area/station/command/corporate_showroom) -"vAv" = ( -/obj/structure/closet/l3closet/scientist, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"vAx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8; - pixel_x = -2 - }, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"vAy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/landmark/start/medical_doctor, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) -"vAF" = ( -/obj/structure/cable, -/obj/effect/spawner/random/trash/ghetto_containers, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "vAL" = ( /obj/machinery/atmospherics/components/trinary/filter{ dir = 4 @@ -74904,17 +79849,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/cytology) -"vBg" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "vBi" = ( /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/machinery/door/firedoor, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "vBj" = ( /obj/machinery/porta_turret/ai{ @@ -74924,7 +79865,7 @@ dir = 6 }, /turf/open/floor/engine/hull/reinforced/air, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "vBq" = ( /obj/machinery/power/terminal{ dir = 1 @@ -74932,7 +79873,7 @@ /obj/structure/cable/multilayer/connected, /obj/machinery/power/port_gen/pacman, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "vBt" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/tile/purple, @@ -74962,13 +79903,17 @@ /turf/open/floor/plating, /area/station/commons/storage/tools) "vBN" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "chemshutters"; - name = "Chemistry Shutters" +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "vBS" = ( /obj/effect/turf_decal/siding/purple{ @@ -74979,6 +79924,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) +"vBT" = ( +/obj/structure/table, +/obj/item/folder/yellow{ + pixel_x = 4 + }, +/obj/item/pen, +/obj/item/airlock_painter, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "vBU" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 @@ -74988,14 +79943,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"vBX" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) "vBY" = ( /obj/item/raw_anomaly_core/random{ pixel_x = -5; @@ -75028,25 +79975,23 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) "vCk" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ +/obj/structure/railing{ dir = 4 }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) -"vCr" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "vCB" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/status_display/ai/directional/south, @@ -75054,7 +79999,29 @@ /area/station/science/lobby) "vCE" = ( /turf/closed/wall, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) +"vCF" = ( +/obj/item/kirbyplants/synthetic/plant26{ + pixel_x = 10; + pixel_y = 18 + }, +/obj/item/kirbyplants/synthetic/plant27{ + pixel_x = 13; + pixel_y = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/morgue) +"vCG" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "vCN" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/public/glass{ @@ -75078,18 +80045,16 @@ }, /area/station/hallway/secondary/entry) "vCT" = ( -/obj/structure/bookcase/random/reference, -/obj/machinery/camera/autoname/directional/south, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/meeting_room/council) +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/glass/reinforced, +/area/station/command/bridge) "vCW" = ( /obj/structure/table/wood/poker, /obj/item/toy/cards/deck{ pixel_x = -10; pixel_y = -3 }, -/turf/open/floor/wood, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) "vDa" = ( /obj/machinery/camera/directional/west{ @@ -75110,37 +80075,31 @@ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "vDi" = ( /turf/open/floor/iron/smooth_edge{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"vDF" = ( -/obj/structure/lattice, -/turf/open/openspace, -/area/station/maintenance/starboard/fore) -"vDL" = ( +/area/station/ai/satellite/foyer) +"vDu" = ( +/obj/structure/reagent_dispensers/plumbed, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) +"vDv" = ( +/obj/effect/spawner/random/engineering/tank, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/plasma, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/main) -"vDT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/lattice/catwalk, -/obj/structure/disposalpipe/segment, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) -"vDV" = ( -/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/extinguisher_cabinet/directional/east, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) +"vDM" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/soda_cans/thirteenloko{ + pixel_x = 14; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/engineering_construction, +/obj/machinery/duct, +/turf/open/floor/iron/large, +/area/station/engineering/lobby) "vEi" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -75148,6 +80107,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) +"vEp" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 2; + name = "CO2 to Mix" + }, +/obj/effect/turf_decal/tile/dark/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"vEv" = ( +/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/engineering/main) "vEF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75161,30 +80134,41 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"vEU" = ( -/obj/machinery/skill_station, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +"vEH" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson{ + pixel_y = 8 + }, +/obj/item/clothing/glasses/meson{ + pixel_y = 8 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"vEW" = ( +/obj/item/clothing/head/cone{ + pixel_x = -5; + pixel_y = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "vEX" = ( /obj/structure/cable, /turf/open/floor/glass/reinforced, /area/station/solars/starboard/fore) +"vFf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "vFk" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plating, /area/station/construction/storage_wing) -"vFr" = ( -/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/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "vFA" = ( /turf/closed/wall, /area/station/science/xenobiology) @@ -75197,40 +80181,19 @@ }, /turf/open/floor/engine/hull/air, /area/station/science/research) -"vFG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/lattice/catwalk, -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/water, -/area/station/maintenance/starboard/fore) -"vFP" = ( -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/stripes/line, -/obj/structure/railing{ - dir = 1 +"vFE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, -/turf/open/openspace, -/area/station/engineering/break_room) +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/textured_large, +/area/station/medical/virology) "vFR" = ( /turf/closed/mineral/random/stationside/asteroid/porus, /area/station/science/ordnance/bomb) -"vFU" = ( -/obj/structure/table/reinforced, -/obj/item/trash/candle{ - pixel_x = 11; - pixel_y = 11 - }, -/obj/item/trash/candle{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/trash/candle{ - pixel_x = -9; - pixel_y = 9 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) "vFV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood, @@ -75243,9 +80206,14 @@ /turf/open/floor/iron, /area/station/security/prison/mess) "vFZ" = ( -/obj/effect/turf_decal/siding/green, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/carpet/royalblue, +/area/station/command/heads_quarters/captain/private) "vGi" = ( /obj/structure/table, /obj/item/training_toolbox{ @@ -75258,16 +80226,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"vGl" = ( -/obj/structure/fluff/paper/stack{ - dir = 10 - }, -/obj/structure/sign/flag/nanotrasen/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "vGr" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/green/filled/mid_joiner, @@ -75283,6 +80241,19 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) +"vGu" = ( +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/item/cigbutt, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) +"vGB" = ( +/obj/structure/sign/poster/official/soft_cap_pop_art/directional/west, +/turf/open/openspace, +/area/station/maintenance/department/crew_quarters/dorms) "vGC" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -75292,37 +80263,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"vGE" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/engine/hull/reinforced, -/area/station/engineering/atmos/hfr_room) -"vGQ" = ( -/obj/structure/table, -/obj/item/clothing/under/costume/seifuku/tan{ - pixel_x = -14; - pixel_y = -2 - }, -/obj/item/trash/boritos{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/clothing/glasses/sunglasses/gar/orange{ - pixel_x = 4 - }, -/obj/structure/sign/poster/contraband/energy_swords/directional/north, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/fore) -"vGX" = ( -/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/smooth_large, -/area/station/maintenance/department/medical) -"vHa" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input, -/turf/open/floor/engine/airless, -/area/station/maintenance/disposal/incinerator) "vHe" = ( /obj/structure/closet/crate/trashcart/laundry, /obj/item/clothing/under/rank/prisoner, @@ -75334,27 +80274,30 @@ /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) "vHo" = ( -/turf/closed/wall, +/turf/closed/wall/r_wall, /area/station/hallway/secondary/command) "vHp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/cigbutt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "vHz" = ( /obj/structure/table, /obj/machinery/air_sensor, /turf/open/floor/iron/grimy, /area/station/security/interrogation) -"vHO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 +"vHC" = ( +/obj/structure/stairs/east, +/obj/machinery/status_display/supply{ + pixel_x = 32 }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/turf/open/floor/iron/stairs/medium{ + dir = 8 + }, +/area/station/cargo/storage) "vHV" = ( /obj/structure/lattice/catwalk, /obj/structure/table, @@ -75364,10 +80307,27 @@ /obj/effect/spawner/random/bureaucracy/pen, /turf/open/openspace, /area/station/maintenance/port/aft) +"vIb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "vIc" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"vId" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "vIg" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -75381,6 +80341,11 @@ /obj/item/clothing/glasses/welding, /turf/open/floor/iron/dark/smooth_large, /area/station/security/mechbay) +"vIr" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/textured_large, +/area/station/medical/abandoned) "vIs" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/siding/dark{ @@ -75390,19 +80355,11 @@ dir = 8 }, /turf/open/floor/iron/white/textured_half, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "vIw" = ( /obj/structure/railing, /turf/open/openspace, /area/station/hallway/primary/central) -"vIy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "vIz" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -75410,24 +80367,44 @@ }, /turf/open/floor/iron, /area/station/science/research) -"vIX" = ( -/obj/machinery/camera/autoname/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/hallway) +"vIE" = ( +/obj/structure/sink/directional/east, +/obj/structure/mirror/directional/west, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"vIG" = ( +/obj/structure/fluff/paper/stack, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) "vJe" = ( /obj/structure/chair, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) +"vJf" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/camera/autoname/directional/east, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "vJz" = ( /obj/structure/railing{ dir = 4 }, -/turf/open/floor/wood, +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "HoPsToy"; + name = "Loading Conveyor"; + pixel_y = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) "vJB" = ( /obj/effect/turf_decal/trimline/red/filled/line{ @@ -75436,13 +80413,27 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/port) +"vJD" = ( +/obj/structure/lattice, +/obj/effect/landmark/firealarm_sanity, +/turf/open/openspace, +/area/station/commons/fitness/recreation) "vJF" = ( /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, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) +"vJI" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "vJP" = ( /obj/structure/table, /obj/item/storage/box/hug/plushes{ @@ -75459,14 +80450,6 @@ }, /turf/open/floor/eighties, /area/station/construction/storage_wing) -"vJV" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/external, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "vKc" = ( /obj/effect/decal/cleanable/glitter{ color = "ff8080" @@ -75482,74 +80465,42 @@ /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) "vKi" = ( -/obj/structure/table/wood, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/maintenance/starboard/central) +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark/textured_large, +/area/station/cargo/storage) "vKq" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/vending/assist, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) "vKt" = ( /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"vKw" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/bottle/vodka{ - pixel_y = 15; - pixel_x = 6 - }, -/obj/item/reagent_containers/cup/glass/bottle/juice/orangejuice{ - pixel_x = -5; - pixel_y = 15 - }, -/obj/item/reagent_containers/cup/glass/flask{ - pixel_x = -6 +"vKA" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/obj/item/reagent_containers/cup/glass/flask{ - pixel_x = 11 +/obj/effect/turf_decal/siding/blue{ + dir = 10 }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "vKL" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/table, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 6; - pixel_y = 8 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 2; - pixel_y = 7 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = -6; - pixel_y = 5 - }, -/obj/machinery/airalarm/directional/south, -/obj/machinery/camera/autoname/directional/south, /obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ dir = 8 }, /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"vKW" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/commons/locker) +/obj/effect/turf_decal/stripes{ + dir = 6 + }, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/iron/textured, +/area/station/command/eva) "vKZ" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -75568,15 +80519,6 @@ /obj/structure/sink/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"vLb" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/openspace, -/area/station/engineering/lobby) "vLe" = ( /obj/structure/table, /obj/item/taperecorder{ @@ -75591,21 +80533,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/security/execution/education) -"vLj" = ( -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "vLx" = ( /obj/machinery/conveyor{ dir = 4; id = "garbage" }, +/obj/effect/turf_decal/stripes/red/box, /turf/open/floor/plating, /area/station/maintenance/disposal) "vLC" = ( @@ -75626,94 +80559,41 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron, /area/station/science/research) -"vLU" = ( -/obj/item/kirbyplants/random/fullysynthetic, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) -"vLZ" = ( -/obj/structure/rack, -/obj/item/circuitboard/machine/telecomms/broadcaster{ - pixel_y = 2 - }, -/obj/item/circuitboard/machine/telecomms/bus{ - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"vMn" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) -"vMs" = ( -/obj/machinery/door/airlock/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 +"vMm" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Freezer Bypass" }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/obj/effect/turf_decal/trimline/blue, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "vMt" = ( /obj/structure/cable, /turf/closed/wall/r_wall, /area/station/security/checkpoint/science) "vMv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, /obj/machinery/door/firedoor, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"vMG" = ( -/obj/item/kirbyplants/random, -/obj/machinery/button/door/directional/west{ - id = "Cabin4"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 24; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) -"vMH" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/item/reagent_containers/blood/ethereal{ - pixel_x = -6; - pixel_y = 6 +"vMN" = ( +/obj/effect/turf_decal/arrows{ + dir = 1 }, -/obj/item/cigbutt{ - pixel_x = 9; - pixel_y = 14 +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 }, -/obj/structure/sign/poster/official/anniversary_vintage_reprint/directional/west, -/turf/open/openspace, -/area/station/maintenance/starboard/fore) -"vMO" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 8 +/obj/effect/turf_decal/siding/red{ + dir = 4 }, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/grass, -/area/station/engineering/lobby) -"vMP" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +/turf/open/floor/iron/textured_edge{ dir = 4 }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/area/station/command/gateway) +"vMP" = ( +/obj/structure/cable, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "vMR" = ( /obj/machinery/modular_computer/preset/civilian{ dir = 4 @@ -75727,8 +80607,15 @@ dir = 4 }, /obj/structure/cable, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) +"vNb" = ( +/obj/machinery/atmospherics/components/unary/passive_vent, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "vNc" = ( /obj/structure/railing{ dir = 10 @@ -75745,18 +80632,14 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) -"vNg" = ( -/obj/structure/lattice/catwalk, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/north, -/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, -/turf/open/openspace, -/area/station/medical/storage) +"vNl" = ( +/obj/effect/landmark/start/hangover, +/obj/machinery/light/floor, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "vNm" = ( /obj/item/bodypart/chest/lizard, /obj/effect/mapping_helpers/broken_floor, @@ -75795,17 +80678,18 @@ }, /turf/open/floor/plating, /area/station/science/zoo) +"vNE" = ( +/obj/structure/stairs/south, +/turf/open/floor/iron/stairs{ + dir = 1 + }, +/area/station/maintenance/starboard) "vNJ" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/window/reinforced/tinted/spawner/directional/west, /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"vNM" = ( -/obj/structure/sign/warning/vacuum/external/directional/south, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "vOg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75817,43 +80701,56 @@ /obj/structure/disposalpipe/segment{ dir = 2 }, -/obj/structure/sign/directions/medical/directional/east{ - dir = 2; - pixel_y = 9 - }, -/obj/structure/sign/directions/science/directional/east{ - dir = 2; - pixel_y = 3 - }, -/obj/structure/sign/directions/security/directional/east{ - dir = 2; - pixel_y = -3 +/turf/open/floor/iron/edge{ + dir = 4 }, -/turf/open/floor/iron/large, /area/station/hallway/primary/central) "vOy" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, -/obj/machinery/status_display/ai/directional/north, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ dir = 1 }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) "vOE" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/sepia, /area/station/hallway/secondary/construction) -"vPa" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 +"vON" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) +/obj/structure/table/wood, +/obj/item/folder/yellow{ + pixel_x = 6; + pixel_y = 8 + }, +/obj/item/folder/yellow{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/stamp/denied{ + pixel_x = 6 + }, +/obj/item/stamp/granted{ + pixel_x = -4 + }, +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room/council) +"vPk" = ( +/obj/structure/lattice/catwalk, +/obj/structure/filingcabinet, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/effect/decal/cleanable/cobweb, +/turf/open/openspace, +/area/station/maintenance/aft/upper) "vPp" = ( /obj/machinery/microwave, /turf/open/floor/plating, @@ -75866,17 +80763,26 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"vPK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"vPE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 4 }, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port to Engine"; - dir = 8 +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"vPF" = ( +/obj/machinery/atmospherics/pipe/multiz/green/visible{ + dir = 8; + name = "mix to space multi-deck adaper" }, -/obj/effect/turf_decal/trimline/brown, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) +/obj/effect/turf_decal/tile/dark_green/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/box/white, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "vPN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75886,10 +80792,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"vPU" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/maintenance/starboard/lesser) "vPX" = ( /obj/effect/turf_decal/tile/dark_blue, /obj/structure/cable, @@ -75902,15 +80804,36 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, -/obj/effect/landmark/start/shaft_miner, +/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/miningoffice) -"vQf" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ +/area/station/cargo/storage) +"vQe" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"vQj" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/medical/chemistry) +"vQm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/button/door/directional/north{ + id = "abandoned_kitchen" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "vQo" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line, @@ -75973,6 +80896,7 @@ }, /obj/machinery/light/directional/south, /obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/trimline/green/filled/corner, /turf/open/floor/iron, /area/station/hallway/primary/starboard) "vQP" = ( @@ -75983,12 +80907,15 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/wood, /area/station/security/courtroom) +"vQQ" = ( +/turf/open/floor/plating, +/area/station/hallway/secondary/construction) "vQR" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/computer/gateway_control{ dir = 4 }, -/turf/open/floor/carpet, +/turf/open/floor/carpet/purple, /area/station/command/gateway) "vRb" = ( /obj/structure/sign/poster/official/tactical_game_cards/directional/west, @@ -75997,15 +80924,6 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark/textured_large, /area/station/cargo/bitrunning/den) -"vRc" = ( -/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/siding/thinplating/dark{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "vRd" = ( /obj/effect/decal/cleanable/dirt, /obj/item/circuitboard/computer/operating, @@ -76018,32 +80936,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/storage_shared) -"vRi" = ( -/obj/machinery/door/airlock/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "vRp" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/item/clothing/mask/bandana/skull/black, /obj/structure/sign/poster/contraband/lizard/directional/west, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"vRz" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/engineering/main) +"vRy" = ( +/obj/structure/cable, +/obj/effect/spawner/random/trash/cigbutt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "vRD" = ( /obj/structure/table, /obj/item/toy/cards/deck/wizoff{ @@ -76052,12 +80955,6 @@ }, /turf/open/floor/iron, /area/station/science/breakroom) -"vRE" = ( -/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4, -/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "vRF" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/railing{ @@ -76154,6 +81051,10 @@ }, /turf/open/floor/iron, /area/station/science/robotics) +"vSA" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "vSC" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ name = "euthanization chamber freezer" @@ -76187,17 +81088,26 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) +"vSJ" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/machinery/iv_drip, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/morgue) +"vSO" = ( +/turf/open/floor/glass/reinforced, +/area/station/medical/chemistry) "vSS" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"vSU" = ( -/obj/effect/decal/cleanable/glitter, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "vSW" = ( -/turf/open/floor/carpet, -/area/station/ai_monitored/turret_protected/ai_upload) +/obj/machinery/holopad/secure, +/turf/open/floor/iron/dark/textured_corner{ + dir = 8 + }, +/area/station/ai/upload/chamber) "vSX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -76207,6 +81117,10 @@ /obj/structure/railing/corner, /turf/open/floor/iron, /area/station/science/robotics) +"vTh" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "vTm" = ( /obj/structure/disposalpipe/segment{ dir = 2 @@ -76217,15 +81131,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"vTq" = ( -/obj/effect/turf_decal/siding{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) "vTu" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -76233,25 +81138,24 @@ /obj/effect/turf_decal/siding/thinplating_new/dark, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/lounge) -"vTv" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 +"vTB" = ( +/obj/effect/turf_decal/siding/green{ + dir = 1 }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 +/obj/effect/turf_decal/plaque{ + icon_state = "L13" }, -/obj/structure/sign/warning/radiation/rad_area/directional/north, -/turf/open/floor/engine, -/area/station/engineering/supermatter) +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "vTE" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"vTH" = ( -/obj/structure/mirror/directional/north, -/obj/structure/sink/directional/south, -/turf/open/floor/iron/freezer, -/area/station/commons/dorms) +/obj/machinery/door/airlock/mining{ + name = "Deliveries" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/shipping, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/sorting) "vTI" = ( /obj/structure/railing{ dir = 1 @@ -76260,23 +81164,15 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/station/science/research) -"vTV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark/corner, -/obj/effect/turf_decal/trimline/dark/corner, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"vUb" = ( -/obj/machinery/door/airlock/command{ - name = "Chief Engineer's Quarters" +"vTQ" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/machinery/power/energy_accumulator/tesla_coil/anchored, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 9 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/ce, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "vUd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -76287,6 +81183,11 @@ }, /turf/open/floor/wood, /area/station/service/library) +"vUf" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/carpet, +/area/station/maintenance/starboard) "vUi" = ( /obj/structure/chair/pew/left{ dir = 8 @@ -76294,11 +81195,19 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/service/chapel) -"vUm" = ( -/obj/machinery/power/smes/engineering, +"vUx" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"vUN" = ( /obj/structure/cable, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/engine_smes) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "vUQ" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/table/wood, @@ -76322,35 +81231,33 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/lobby) -"vVb" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"vVi" = ( +/obj/machinery/door/airlock/maintenance, /obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"vVp" = ( -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) -"vVv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall/r_wall, -/area/station/maintenance/disposal/incinerator) -"vVD" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 }, -/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"vVp" = ( +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/textured_large, -/area/station/medical/virology) +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) +"vVt" = ( +/obj/structure/chair/sofa/right/brown, +/obj/effect/spawner/random/maintenance, +/obj/structure/sign/poster/contraband/pwr_game/directional/north, +/turf/open/floor/eighties, +/area/station/maintenance/department/crew_quarters/dorms) +"vVH" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/docking/directional/south, +/turf/open/space/basic, +/area/space/nearstation) "vVR" = ( /obj/structure/broken_flooring/pile/directional/north, /turf/open/floor/plating, @@ -76394,31 +81301,50 @@ /area/station/science/lab) "vWI" = ( /obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/fluorine{ +/obj/item/reagent_containers/cup/bottle/formaldehyde{ + pixel_x = 1 + }, +/obj/item/reagent_containers/cup/bottle/acidic_buffer{ pixel_x = 7; pixel_y = 3 }, -/obj/item/reagent_containers/cup/bottle/iodine{ - pixel_x = 1 +/obj/item/reagent_containers/cup/bottle/basic_buffer{ + pixel_x = -5; + pixel_y = 3 }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ dir = 1 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "vXh" = ( /obj/item/radio/intercom/directional/west, /turf/open/floor/carpet/black, /area/station/service/library/private) -"vXt" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"vXi" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/large, +/obj/structure/sign/warning/secure_area/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"vXt" = ( +/turf/open/floor/iron/edge, /area/station/hallway/primary/central) +"vXv" = ( +/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/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/science/breakroom) "vXz" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 5 @@ -76428,6 +81354,16 @@ /obj/machinery/mining_weather_monitor/directional/north, /turf/open/floor/iron/dark/textured, /area/station/construction/mining/aux_base) +"vXB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/textured_large, +/area/station/medical/abandoned) +"vXC" = ( +/obj/machinery/newscaster/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "vXQ" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -76437,21 +81373,12 @@ }, /turf/open/floor/iron, /area/station/science/lab) -"vXU" = ( -/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) "vYe" = ( /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/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "vYm" = ( /obj/effect/turf_decal/stripes/corner{ @@ -76459,12 +81386,16 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"vYq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "vYs" = ( -/obj/structure/table/optable, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, -/obj/machinery/light/directional/west, /turf/open/floor/iron/dark/textured_edge, /area/station/medical/morgue) "vYt" = ( @@ -76482,10 +81413,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"vYI" = ( -/obj/structure/reagent_dispensers/plumbed, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +"vYN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood, +/area/station/commons/dorms) +"vYQ" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/machinery/duct, +/turf/open/floor/iron/large, +/area/station/engineering/lobby) "vYS" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -76504,43 +81443,19 @@ }, /turf/open/floor/iron, /area/station/science/breakroom) -"vYV" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/aft) "vYX" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) -"vZc" = ( -/obj/item/trash/can{ - pixel_x = -8 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = -13 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = -13 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = -13 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = -13 +"vZa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = -13 +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 5 }, -/obj/structure/sign/poster/contraband/grey_tide/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/primary) +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "vZd" = ( /obj/effect/turf_decal/tile/dark_green/fourcorners, /obj/structure/railing/corner/end/flip{ @@ -76550,8 +81465,13 @@ /turf/open/floor/iron/dark, /area/station/science/cytology) "vZG" = ( -/turf/open/openspace/coldroom, -/area/station/medical/coldroom) +/turf/open/openspace, +/area/station/maintenance/department/medical) +"vZH" = ( +/obj/item/radio/headset, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "vZI" = ( /obj/effect/turf_decal/tile/dark_green{ dir = 4 @@ -76585,18 +81505,24 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron, /area/station/science/lab) -"wag" = ( -/obj/item/cigbutt{ - pixel_x = -11; - pixel_y = 14 +"wap" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/arrows/red{ + dir = 8 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"waq" = ( -/obj/machinery/newscaster/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/storage) +"war" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "was" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/effect/turf_decal/trimline/red/warning{ @@ -76610,12 +81536,12 @@ "wau" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "waz" = ( /turf/closed/wall, /area/station/security/interrogation) "waA" = ( -/obj/machinery/computer/rdconsole, +/obj/machinery/computer/rdconsole/unlocked, /turf/open/floor/iron/dark, /area/station/science/lobby) "waH" = ( @@ -76629,13 +81555,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "waU" = ( /obj/effect/landmark/firealarm_sanity, /turf/open/floor/engine{ name = "Holodeck Projector Floor" }, /area/station/holodeck/rec_center) +"waY" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/openspace, +/area/station/solars/starboard/fore) "wbc" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/sink/directional/west, @@ -76659,24 +81589,39 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/turf_decal/arrows{ - dir = 1 - }, /obj/machinery/button/door/directional/south{ id = "gateshutter"; name = "Gateway Shutter Control"; pixel_x = -24; pixel_y = 0; - req_access = list("command") + req_access = list("command"); + dir = 8 }, /obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 8 + }, /area/station/command/gateway) +"wbJ" = ( +/obj/effect/turf_decal/siding/dark_blue/corner, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "wbK" = ( /obj/item/poster/random_contraband, /obj/structure/cursed_money, /turf/open/floor/plating, /area/station/maintenance/port) +"wbM" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/yellow/filled/warning/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "wbR" = ( /obj/structure/disposalpipe/trunk/multiz{ dir = 8 @@ -76716,20 +81661,6 @@ }, /turf/open/floor/wood/large, /area/station/hallway/primary/central) -"wcJ" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ - dir = 4; - name = "Atmos to Engine" - }, -/obj/effect/turf_decal/trimline/brown, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"wcL" = ( -/obj/effect/turf_decal/siding/brown, -/obj/structure/closet/athletic_mixed, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "wcN" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -76738,15 +81669,6 @@ /obj/machinery/holopad, /turf/open/floor/wood, /area/station/hallway/primary/central) -"wcT" = ( -/obj/machinery/vending/cigarette, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) -"wcV" = ( -/obj/structure/lattice, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) "wcY" = ( /obj/structure/railing{ dir = 8 @@ -76762,8 +81684,8 @@ /area/station/science/research) "wdb" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/wood/tile, /area/station/maintenance/port/aft) "wdd" = ( @@ -76794,11 +81716,14 @@ /obj/effect/spawner/random/trash/botanical_waste, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"wdu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) +"wdt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/hallway/primary/central) "wdw" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, @@ -76818,14 +81743,22 @@ /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, -/area/station/ai_monitored/turret_protected/ai) -"wdD" = ( +/area/station/ai/satellite/chamber) +"wdB" = ( +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/contraband/communist_state/directional/east, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/landmark/start/depsec/engineering, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) +"wdF" = ( +/obj/machinery/shower/directional/west, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "wdQ" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/chair{ @@ -76837,7 +81770,10 @@ /obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 4 }, -/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/station/cargo/storage) "weg" = ( @@ -76867,6 +81803,12 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) +"wel" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/turf/open/floor/engine/hull, +/area/station/maintenance/starboard/aft/upper) "weo" = ( /obj/effect/spawner/random/trash/garbage, /obj/item/clothing/head/cone{ @@ -76894,11 +81836,20 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/yellow/fourcorners, /obj/effect/mapping_helpers/airlock/access/all/engineering/aux_base, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/iron/dark, /area/station/construction/mining/aux_base) +"weC" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/lattice/catwalk, +/obj/machinery/light/small/directional/west, +/turf/open/openspace, +/area/station/engineering/lobby) "weF" = ( /obj/structure/disposalpipe/segment{ dir = 2 @@ -76917,20 +81868,13 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark, /area/station/security/warden) -"weJ" = ( +"weM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/structure/window/reinforced/tinted, /obj/structure/cable, /turf/open/floor/plating/airless, -/area/station/maintenance/starboard/aft) -"weK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/maintenance/aft/upper) "weO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/trimline/purple/filled/corner{ @@ -76944,7 +81888,10 @@ dir = 8; id = "cargounload" }, -/obj/structure/plasticflaps, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating, /area/station/cargo/storage) "weX" = ( @@ -76957,23 +81904,6 @@ /obj/item/tank/internals/oxygen/yellow, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"wfk" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/item/cigbutt, -/obj/structure/bed/maint, -/obj/effect/spawner/random/bedsheet, -/turf/open/floor/wood, -/area/station/commons/dorms) -"wfp" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/machinery/atmospherics/components/binary/pump/on/layer5{ - name = "O2 to Airmix" - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "wfq" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/bot, @@ -76983,17 +81913,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"wfz" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail{ - dir = 4 - }, -/obj/effect/mapping_helpers/mail_sorting/engineering/general, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) "wfF" = ( /obj/structure/disposalpipe/junction/yjunction{ dir = 4 @@ -77012,10 +81931,16 @@ }, /area/station/tcommsat/server) "wfN" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) +"wfO" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment, +/turf/open/openspace, +/area/station/maintenance/starboard/upper) "wfV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -77061,20 +81986,14 @@ }, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) +"wgq" = ( +/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/aft/upper) "wgx" = ( -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/acidic_buffer{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/basic_buffer{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/formaldehyde{ - pixel_x = 1 - }, -/obj/structure/sign/warning/chem_diamond/directional/north, /obj/machinery/light_switch/directional/east, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -77083,12 +82002,23 @@ dir = 1 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/medical/medbay/central) -"wgD" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/machinery/holopad, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/area/station/medical/chem_storage) +"wgE" = ( +/obj/structure/sign/directions/engineering/directional/west{ + dir = 1; + pixel_y = 6; + pixel_x = 0 + }, +/obj/structure/sign/directions/supply/directional/west{ + dir = 1; + pixel_x = 0 + }, +/obj/structure/sign/directions/science/directional/west{ + pixel_y = -6; + pixel_x = 0 + }, +/turf/closed/wall/r_wall, +/area/station/science/xenobiology) "wgM" = ( /obj/structure/statue/sandstone/venus{ dir = 1 @@ -77112,6 +82042,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"wgZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/office) "wha" = ( /obj/structure/cable, /obj/machinery/fax{ @@ -77133,19 +82074,25 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"whs" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Morgue Maintenance" +"whn" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"whs" = ( /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/effect/mapping_helpers/airlock/access/all/medical/morgue, -/turf/open/floor/plating, -/area/station/maintenance/port) +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/morgue) "whu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/east, @@ -77154,7 +82101,18 @@ "whw" = ( /obj/machinery/teleport/hub, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) +"whG" = ( +/obj/effect/spawner/random/structure/tank_holder, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) +"whH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/photocopier/prebuilt, +/turf/open/floor/wood/large, +/area/station/engineering/lobby) "whJ" = ( /obj/structure/sign/departments/science/alt/directional/south, /obj/effect/turf_decal/tile/green/full, @@ -77199,10 +82157,6 @@ /obj/structure/sign/departments/genetics/directional/east, /turf/open/floor/iron/stairs/medium, /area/station/science/cytology) -"wid" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "wie" = ( /obj/structure/chair{ dir = 4 @@ -77210,6 +82164,10 @@ /obj/structure/reagent_dispensers/wall/peppertank/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/security/courtroom) +"wij" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "wik" = ( /obj/machinery/camera/autoname/directional/west, /obj/effect/turf_decal/siding/thinplating_new/dark/end{ @@ -77217,13 +82175,41 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/lounge) +"wim" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"win" = ( +/obj/machinery/plumbing/input, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/starboard) "wiq" = ( /obj/structure/railing, /obj/effect/decal/cleanable/dirt, /obj/structure/lattice/catwalk, /obj/machinery/airalarm/directional/north, -/turf/open/openspace/coldroom, -/area/station/medical/coldroom) +/turf/open/openspace, +/area/station/maintenance/department/medical) +"wir" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"wit" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "wiv" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/box, @@ -77243,11 +82229,6 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/virology, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) -"wiA" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "wiF" = ( /obj/effect/spawner/random/structure/crate_abandoned, /obj/effect/spawner/random/maintenance, @@ -77257,67 +82238,49 @@ "wiK" = ( /turf/open/floor/carpet/black, /area/station/service/library/private) -"wiO" = ( -/obj/machinery/door/airlock/maintenance{ - name = "CE's Maintenance Access" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/plating, -/area/station/engineering/lobby) -"wiZ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/effect/landmark/start/hangover, -/turf/open/openspace, -/area/station/commons/dorms) "wji" = ( /obj/structure/chair/stool/bar/directional/west, /obj/effect/landmark/start/assistant, /turf/open/floor/carpet/orange, /area/station/commons/lounge) -"wju" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/item/mop, -/obj/item/grenade/chem_grenade/cleaner, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "wjv" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, /area/station/maintenance/port/greater) "wjw" = ( -/obj/effect/spawner/structure/window, +/obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"wjz" = ( -/obj/structure/ladder, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) +"wjx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/flag/terragov/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"wjG" = ( +/obj/machinery/vending/wardrobe/atmos_wardrobe, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/glass/plasma, +/area/station/engineering/atmos/upper) "wjH" = ( /obj/structure/stairs/west, /obj/structure/railing{ dir = 1 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"wjO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/stack{ - dir = 8 - }, -/obj/structure/filingcabinet, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/effect/spawner/random/bureaucracy/paper, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) +/area/station/ai/satellite/interior) +"wjP" = ( +/obj/structure/lattice/catwalk, +/obj/item/stack/cable_coil, +/turf/open/space/basic, +/area/station/solars/starboard/fore) "wjV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/closet_maintenance, @@ -77343,6 +82306,30 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) +"wkb" = ( +/obj/structure/cable, +/turf/closed/wall/r_wall, +/area/station/command/bridge) +"wkf" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/table, +/obj/item/mod/module/thermal_regulator, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) +"wkh" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/shieldgen, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) +"wkn" = ( +/obj/structure/railing, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "wko" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -77355,9 +82342,6 @@ "wkt" = ( /obj/machinery/shower/directional/east, /obj/structure/curtain, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, /obj/item/soap, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain/private) @@ -77366,24 +82350,39 @@ /obj/effect/spawner/random/engineering/canister, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) +"wkF" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "wkH" = ( /obj/machinery/door/airlock/maintenance, /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/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"wkP" = ( -/obj/effect/turf_decal/siding{ - dir = 1 - }, +"wkW" = ( /obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard) +"wkX" = ( +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 1; + name = "Mix to Chamber" + }, +/obj/effect/turf_decal/trimline/purple, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "wlc" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 8 @@ -77396,26 +82395,32 @@ /obj/structure/cable, /turf/open/floor/wood/tile, /area/station/security/detectives_office/private_investigators_office) -"wlg" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/item/storage/toolbox/emergency, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) "wlq" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "chemshutters"; - name = "Chemistry Shutters" +/obj/structure/sign/warning/chem_diamond/directional/north, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 }, -/turf/open/floor/plating, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) -"wlF" = ( +"wlx" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/item/storage/toolbox/fishing, +/obj/item/storage/box/lights/mixed{ + pixel_x = -8; + pixel_y = 1 + }, /obj/structure/lattice/catwalk, -/obj/effect/spawner/random/maintenance/two, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) +/obj/structure/railing{ + dir = 4 + }, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/port/fore) +"wlI" = ( +/obj/structure/lattice/catwalk, +/obj/effect/spawner/random/engineering/tank, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/port/fore) "wlL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -77425,24 +82430,20 @@ /turf/open/floor/plating, /area/station/service/lawoffice) "wlM" = ( +/obj/machinery/status_display/ai/directional/south, /obj/structure/bodycontainer/morgue{ dir = 1 }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) -"wlV" = ( -/obj/machinery/newscaster/directional/east, -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "wlY" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, /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/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/iron/textured, +/area/station/command/eva) "wma" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -77452,6 +82453,13 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tcomms) +"wmg" = ( +/obj/effect/turf_decal/trimline/brown/arrow_cw{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/arrow_ccw, +/turf/open/floor/iron, +/area/station/cargo/sorting) "wmm" = ( /obj/structure/railing{ dir = 4 @@ -77462,50 +82470,38 @@ /obj/effect/turf_decal/trimline/green/filled/mid_joiner{ dir = 4 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) -"wmn" = ( -/obj/effect/turf_decal/siding/brown, -/obj/structure/chair/sofa/corp/right{ +"wmt" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/stripes, +/obj/effect/turf_decal/stripes{ dir = 1 }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"wmr" = ( -/obj/structure/chair/office, -/obj/effect/landmark/start/chief_engineer, -/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/wood, -/area/station/command/heads_quarters/ce) -"wmt" = ( -/obj/structure/closet/secure_closet/quartermaster, -/obj/item/clothing/head/fedora/white, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/qm) +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "wmw" = ( /obj/structure/bookcase/random/reference, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/science/zoo) -"wmx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/cafeteria, -/area/station/maintenance/starboard/lesser) "wmy" = ( /obj/machinery/pdapainter{ pixel_y = 2 }, /obj/structure/railing, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/wood, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/wood/tile, /area/station/command/heads_quarters/hop) +"wmC" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction) "wmK" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4, @@ -77514,13 +82510,24 @@ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "wmR" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/iron/dark, /area/station/science/lobby) +"wmS" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"wmX" = ( +/obj/structure/lattice/catwalk, +/obj/structure/ladder, +/turf/open/openspace, +/area/station/maintenance/aft/upper) "wmZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/tank_holder, @@ -77539,13 +82546,13 @@ }, /turf/open/floor/plating, /area/station/construction/mining/aux_base) -"wnn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 +"wnm" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 }, +/obj/machinery/suit_storage_unit/engine, /turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) +/area/station/engineering/engine_smes) "wny" = ( /obj/effect/turf_decal/siding/wood/corner, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -77557,7 +82564,7 @@ /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "wnD" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/three, @@ -77581,12 +82588,14 @@ /turf/open/floor/wood/large, /area/station/medical/psychology) "wnY" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/openspace, -/area/station/medical/storage) +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_a) "woe" = ( /obj/effect/spawner/random/trash/garbage, /obj/effect/decal/cleanable/greenglow, @@ -77600,19 +82609,13 @@ }, /turf/open/floor/wood/large, /area/station/hallway/primary/central) -"woh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/sign/poster/official/work_for_a_future/directional/west, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "wom" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/internals, /obj/effect/spawner/random/maintenance, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) "wot" = ( @@ -77627,6 +82630,12 @@ /obj/structure/sign/poster/contraband/free_drone/directional/north, /turf/open/openspace, /area/station/maintenance/port/fore) +"woy" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 5 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "woA" = ( /obj/structure/ladder, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -77634,32 +82643,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) -"woG" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/item/storage/box/lights/mixed{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock{ - pixel_x = -6; - pixel_y = -4 - }, -/obj/item/stock_parts/power_store/cell/emproof{ - pixel_x = -4; - pixel_y = 6 - }, -/obj/item/stock_parts/power_store/cell/emproof{ - pixel_x = -4; - pixel_y = 6 +"woN" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 1 }, -/obj/item/stock_parts/power_store/cell/emproof{ - pixel_x = -4; - pixel_y = 6 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/structure/table/reinforced, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/obj/structure/sign/warning/gas_mask/directional/west, +/turf/open/floor/plating/airless, +/area/space/nearstation) "woT" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/item/kirbyplants/random, @@ -77673,15 +82666,23 @@ /turf/open/floor/plating, /area/station/service/kitchen/abandoned) "woX" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) -"wpd" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/closet/firecloset/full, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/obj/machinery/conveyor{ + dir = 4; + id = "packageSort2" + }, +/obj/machinery/door/window/left/directional/south{ + req_access = list("shipping"); + name = "Chute Access" + }, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/sorting) +"wpg" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "wps" = ( /turf/open/floor/engine, /area/station/science/xenobiology) @@ -77698,22 +82699,39 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/brig) +"wpK" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) +"wpL" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/station/maintenance/starboard) +"wpM" = ( +/obj/machinery/computer/station_alert{ + dir = 1 + }, +/obj/effect/turf_decal/siding/yellow{ + dir = 5 + }, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "wpW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/red/dim/directional/north, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"wqb" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/station/maintenance/starboard/lesser) -"wqg" = ( -/obj/structure/chair/sofa/right/brown, -/obj/machinery/newscaster/directional/north, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/storage/primary) +"wqe" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/station/maintenance/starboard) "wqi" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 @@ -77728,19 +82746,22 @@ /obj/effect/turf_decal/trimline/green/filled/mid_joiner, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"wqk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/medical/cryo) +"wqq" = ( +/obj/machinery/stasis, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) "wqB" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/sign/directions/command/directional/north{ - dir = 2 - }, -/obj/structure/sign/directions/security/directional/north{ +/obj/structure/sign/directions/medical/directional/east{ dir = 2; - pixel_y = 38 + pixel_x = 0 }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +/turf/closed/wall, +/area/station/commons/vacant_room/office) "wqI" = ( /obj/item/cigarette/cigar{ pixel_x = 4 @@ -77751,26 +82772,38 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/commons/lounge) "wqN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor{ + dir = 4; + id = "cargoload" }, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/cargo/storage) +"wqU" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "wqZ" = ( /obj/machinery/door/airlock{ name = "Prison Showers" }, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) -"wre" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ +"wrb" = ( +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) +"wrd" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, -/turf/open/openspace, -/area/station/engineering/break_room) +/turf/open/floor/iron/dark, +/area/station/engineering/storage) "wrf" = ( /obj/machinery/atmospherics/pipe/multiz/yellow/visible{ dir = 8 @@ -77780,32 +82813,35 @@ dir = 1 }, /area/station/science/ordnance/storage) +"wrn" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/structure/closet/secure_closet/medical3, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "wrE" = ( /turf/open/floor/glass, /area/station/hallway/secondary/entry) "wrI" = ( /obj/machinery/light/directional/north, -/obj/structure/sign/directions/vault/directional/north{ - pixel_y = 30 - }, -/obj/structure/sign/directions/evac/directional/north{ - pixel_y = 36 +/turf/open/floor/iron/edge{ + dir = 1 }, -/turf/open/floor/iron/large, /area/station/hallway/primary/central) "wrQ" = ( /turf/open/floor/iron/smooth, /area/station/engineering/main) -"wsc" = ( -/obj/effect/spawner/random/trash/garbage, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +"wrT" = ( +/turf/closed/wall, +/area/station/maintenance/starboard/upper) "wsm" = ( /obj/structure/lattice/catwalk, /obj/machinery/light/directional/east, /obj/item/wrench, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "wsn" = ( /obj/structure/lattice/catwalk, /obj/structure/sign/poster/contraband/random/directional/west, @@ -77828,11 +82864,17 @@ }, /turf/open/floor/iron, /area/station/service/cafeteria) -"wsR" = ( -/obj/structure/table, -/obj/item/wrench, -/turf/open/floor/wood, -/area/station/commons/dorms) +"wsP" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/duct, +/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/lobby) "wsU" = ( /obj/structure/railing{ dir = 10 @@ -77843,10 +82885,6 @@ /obj/structure/table/reinforced, /turf/open/floor/engine/hull, /area/space/nearstation) -"wtd" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron/stairs/medium, -/area/station/maintenance/disposal/incinerator) "wti" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/window/spawner/directional/north, @@ -77867,14 +82905,7 @@ dir = 8 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"wtn" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/interior) "wts" = ( /obj/structure/railing/corner{ dir = 4 @@ -77887,8 +82918,9 @@ /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) "wtz" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "wtB" = ( /obj/structure/window/reinforced/spawner/directional/south, @@ -77900,6 +82932,16 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/solars/starboard/aft) +"wtD" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) "wtI" = ( /obj/structure/table, /obj/item/pipe_dispenser, @@ -77925,6 +82967,13 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"wtN" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "wtO" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -77933,22 +82982,16 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/space/openspace, /area/space/nearstation) -"wul" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/structure/steam_vent, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "wuo" = ( -/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."; - dir = 4; - name = "decommissioned sleeper" +/obj/structure/table/wood, +/obj/machinery/light_switch/directional/north, +/obj/machinery/light/small/directional/west, +/obj/effect/spawner/random/food_or_drink/donkpockets{ + pixel_y = 4; + pixel_x = 4 }, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) +/turf/open/floor/wood/large, +/area/station/medical/break_room) "wuq" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -77978,15 +83021,16 @@ /turf/open/floor/glass/reinforced, /area/station/solars/starboard/fore) "wuz" = ( -/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/effect/turf_decal/trimline/brown/filled/warning{ dir = 8 }, -/obj/effect/turf_decal/trimline/brown/filled/line{ +/obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/machinery/door/firedoor/border_only{ 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/cargo/storage) "wuG" = ( @@ -78008,27 +83052,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) -"wuZ" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"wuV" = ( +/obj/machinery/vending/cigarette, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/station/maintenance/starboard) "wvc" = ( /obj/structure/table/wood/poker, /obj/item/storage/dice, /turf/open/floor/carpet/stellar, /area/station/service/library) -"wve" = ( -/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/engineering/hallway) "wvi" = ( /obj/effect/turf_decal/tile/dark_green{ dir = 4 @@ -78055,21 +83088,12 @@ /turf/open/floor/iron/checker, /area/station/service/bar) "wvw" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "cargounload" - }, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing{ - dir = 1 +/obj/effect/turf_decal/siding/wood{ + dir = 4 }, -/obj/structure/railing, -/turf/open/floor/iron, -/area/station/cargo/storage) +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "wvx" = ( /obj/structure/cable, /turf/open/floor/iron/stairs, @@ -78103,21 +83127,50 @@ }, /turf/open/openspace, /area/station/commons/fitness/recreation) +"wvM" = ( +/obj/machinery/holopad, +/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, +/turf/open/floor/wood, +/area/station/service/library/printer) +"wvR" = ( +/obj/machinery/power/turbine/core_rotor{ + dir = 8; + mapping_id = "main_turbine" + }, +/obj/structure/cable, +/obj/machinery/light/small/directional/north, +/turf/open/floor/engine, +/area/station/engineering/atmos/upper) +"wwd" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 6 + }, +/turf/open/floor/grass, +/area/station/hallway/primary/starboard) "wwf" = ( -/obj/machinery/computer/communications, /obj/effect/turf_decal/siding/blue{ dir = 1 }, /obj/structure/railing{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/bridge) -"wwj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/virology) +/obj/machinery/holopad, +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "wwl" = ( /obj/structure/railing/corner{ dir = 8 @@ -78137,16 +83190,33 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/wood, /area/station/security/detectives_office) -"www" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) +"wwn" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/stack{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/wood, +/area/station/maintenance/aft) +"wwt" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "wwx" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "wwz" = ( /obj/effect/turf_decal/siding/purple{ dir = 8 @@ -78178,7 +83248,7 @@ }, /obj/structure/table/reinforced, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "wwG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/optable, @@ -78204,10 +83274,13 @@ /turf/open/floor/wood, /area/station/security/courtroom) "wxb" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/firealarm/directional/west, -/turf/open/openspace, -/area/station/medical/cryo) +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/trimline/dark_blue/filled/end{ + dir = 4 + }, +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/holofloor/dark, +/area/station/command/heads_quarters/cmo) "wxk" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -78215,16 +83288,37 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) -"wxq" = ( -/obj/effect/landmark/event_spawn, -/turf/closed/wall/r_wall, -/area/station/command/heads_quarters/hop) +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "wxx" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/vacant_room/office) +"wxy" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/item/book/manual/wiki/engineering_construction{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/engineering_guide{ + pixel_x = -2 + }, +/obj/structure/rack, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"wxE" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/textured_half, +/area/station/medical/surgery) "wxH" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -78240,33 +83334,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/security/brig) -"wxU" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/power_store/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/clothing/glasses/meson{ - pixel_y = 8 - }, -/obj/item/clothing/glasses/meson{ - pixel_y = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"wyc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/obj/structure/holosign/barrier/engineering, -/turf/open/openspace, -/area/station/engineering/atmos/project) "wyj" = ( /obj/item/cigbutt, /turf/open/floor/engine/hull, /area/space/nearstation) +"wyl" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/filingcabinet, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/floor/iron/dark/textured_large, +/area/station/maintenance/aft/upper) "wyq" = ( /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, @@ -78279,23 +83356,53 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"wyv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "wyx" = ( -/obj/effect/turf_decal/siding/yellow{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, -/obj/structure/railing/corner/end{ - dir = 8 +/obj/item/radio/intercom/directional/east, +/obj/structure/rack, +/obj/item/book/manual/wiki/chemistry{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/book/manual/wiki/grenades{ + pixel_y = 1 + }, +/obj/item/book/manual/wiki/plumbing{ + pixel_x = 4; + pixel_y = -2 }, -/obj/machinery/light/directional/east, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"wyF" = ( -/obj/structure/flora/tree/palm/style_random, -/turf/open/floor/iron/vaporwave, -/area/station/maintenance/starboard/lesser) +"wyA" = ( +/obj/structure/table, +/obj/item/flashlight/lamp{ + pixel_y = 10 + }, +/obj/item/folder/yellow{ + pixel_x = 4 + }, +/obj/machinery/duct, +/turf/open/floor/iron/large, +/area/station/engineering/lobby) +"wyV" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/gravity_generator) +"wzi" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "wzj" = ( /turf/closed/wall/r_wall, /area/station/tcommsat/server) @@ -78305,18 +83412,9 @@ /turf/open/floor/plating, /area/station/security/execution/education) "wzp" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, /obj/effect/landmark/start/chemist, -/turf/open/floor/iron/dark, +/turf/open/floor/glass/reinforced, /area/station/medical/chemistry) -"wzr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "wzs" = ( /obj/structure/rack, /obj/item/storage/box/lights/mixed, @@ -78331,14 +83429,6 @@ dir = 1 }, /area/station/hallway/secondary/entry) -"wzB" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/iron, -/area/station/engineering/main) -"wzM" = ( -/obj/machinery/recharge_station, -/turf/open/floor/wood, -/area/station/commons/toilet/restrooms) "wzO" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -78348,11 +83438,13 @@ /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) "wzS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet, -/area/station/command/meeting_room/council) +/obj/structure/table/reinforced/rglass, +/obj/machinery/keycard_auth{ + pixel_y = 3 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "wzT" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -78384,7 +83476,7 @@ /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "wAx" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -78399,15 +83491,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"wAO" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/item/storage/toolbox/mechanical/old, -/obj/item/sticker/syndicate{ - pixel_x = 10; - pixel_y = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) "wAQ" = ( /obj/machinery/door/airlock/public/glass{ name = "Circle Center" @@ -78434,11 +83517,10 @@ /obj/effect/turf_decal/siding/red/corner, /turf/open/floor/engine, /area/station/engineering/supermatter) -"wAW" = ( -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/condiment, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) +"wAV" = ( +/obj/effect/spawner/random/trash/moisture_trap, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "wAZ" = ( /obj/machinery/light/directional/west, /obj/structure/cable, @@ -78448,6 +83530,11 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"wBd" = ( +/obj/structure/lattice, +/obj/machinery/camera/autoname/directional/west, +/turf/open/openspace, +/area/station/commons/dorms) "wBu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -78457,18 +83544,14 @@ /obj/structure/railing{ dir = 4 }, -/obj/effect/turf_decal/siding/red{ - dir = 4 - }, -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -1; - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/red/opposingcorners{ +/obj/structure/chair/plastic{ dir = 1 }, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood/large, /area/station/hallway/primary/central) "wBJ" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -78476,11 +83559,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/medical) -"wBK" = ( -/obj/machinery/duct, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/station/maintenance/starboard/lesser) "wBO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -78502,6 +83580,24 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"wBT" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 2; + pixel_y = 7 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/large, +/area/station/commons/dorms) +"wBY" = ( +/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/siding/wood{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) "wCa" = ( /obj/effect/turf_decal/arrows/white{ color = "#F7F707"; @@ -78512,47 +83608,6 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) -"wCj" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/corner{ - dir = 4 - }, -/obj/structure/fluff/paper/stack, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"wCm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"wCn" = ( -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/table/glass, -/obj/item/storage/box{ - pixel_x = 2; - pixel_y = 4 - }, -/turf/open/openspace, -/area/station/engineering/break_room) -"wCr" = ( -/obj/machinery/door/airlock/engineering{ - name = "Tech Storage" - }, -/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, -/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, -/obj/effect/landmark/navigate_destination/techstorage, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "wCv" = ( /obj/structure/table, /obj/item/storage/box{ @@ -78569,39 +83624,34 @@ /turf/open/openspace, /area/station/hallway/secondary/exit/departure_lounge) "wCP" = ( -/obj/effect/turf_decal/siding/white{ - dir = 6 +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/machinery/flasher/directional/east{ + id = "hopflash" + }, +/obj/effect/turf_decal/arrows{ + 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/dark/smooth_large, /area/station/hallway/primary/central) "wCZ" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/south, /turf/open/floor/carpet/executive, -/area/station/ai_monitored/turret_protected/aisat_interior) -"wDf" = ( -/obj/effect/landmark/start/hangover, -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/station/commons/fitness/recreation) +/area/station/ai/satellite/interior) +"wDp" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater{ + dir = 8 + }, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "wDs" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/structure/rack, /obj/item/clothing/gloves/latex, /turf/open/floor/iron/dark, -/area/station/science/lobby) -"wDt" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 1 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/area/station/science/lobby) "wDu" = ( /obj/machinery/light/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -78615,12 +83665,27 @@ }, /turf/open/floor/wood/large, /area/station/medical/psychology) -"wDQ" = ( -/obj/structure/chair/office{ - dir = 8 +"wDz" = ( +/obj/effect/spawner/random/maintenance, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/aft/upper) +"wDK" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/wood, -/area/station/commons/dorms) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"wDX" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/station/maintenance/starboard) "wDY" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /obj/machinery/door/airlock/public/glass{ @@ -78643,13 +83708,19 @@ /obj/machinery/telecomms/processor/preset_four, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"wEn" = ( -/obj/machinery/door/airlock{ - id_tag = "Cabin2"; - name = "Decomissioned Cabin" +"wEg" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/paper/corner, +/obj/structure/fluff/paper/stack, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/structure/fluff/paper/stack{ + desc = "A stack of various papers, absolutely unreadable due to scorch marks and aging."; + dir = 1 }, /turf/open/floor/plating, -/area/station/commons/dorms) +/area/station/maintenance/aft) "wEt" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate_loot, @@ -78663,20 +83734,54 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/security/checkpoint/science) +"wEK" = ( +/obj/machinery/duct, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "wEN" = ( /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) "wER" = ( -/obj/machinery/vending/cigarette, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/wood/parquet, -/area/station/medical/break_room) +/obj/machinery/button/door/directional/east{ + id = "rear_surgery"; + name = "Rear Shutters Control"; + req_access = list("surgery") + }, +/obj/machinery/computer/operating{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_corner{ + dir = 1 + }, +/area/station/medical/surgery) +"wES" = ( +/obj/effect/spawner/random/decoration/showcase, +/turf/open/floor/plating, +/area/station/maintenance/port) +"wEU" = ( +/obj/machinery/computer/holodeck{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "wEX" = ( /obj/structure/sign/poster/contraband/hacking_guide/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"wFc" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "wFf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -78688,12 +83793,19 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) -"wFj" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/reagent_containers/cup/soda_cans/pwr_game, -/obj/item/radio/intercom/directional/north, +"wFi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/item/pen/red{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/wood, -/area/station/commons/dorms) +/area/station/maintenance/aft) "wFk" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -78711,6 +83823,9 @@ "wFl" = ( /turf/open/floor/engine/n2, /area/station/engineering/atmos/upper) +"wFm" = ( +/turf/closed/wall, +/area/station/solars/starboard/fore) "wFt" = ( /obj/structure/showcase/mecha/marauder, /turf/open/floor/iron/dark, @@ -78751,21 +83866,10 @@ }, /obj/machinery/door/firedoor, /obj/effect/landmark/navigate_destination/court, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/security/courtroom) -"wGi" = ( -/obj/effect/decal/cleanable/crayon{ - icon_state = "body"; - name = "body"; - pixel_x = 9; - pixel_y = 3 - }, -/obj/item/ammo_casing/spent{ - pixel_x = -6; - pixel_y = 6 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "wGD" = ( /obj/effect/turf_decal/trimline/purple/arrow_cw{ dir = 8 @@ -78780,7 +83884,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "wGN" = ( /obj/machinery/light/warm/dim/directional/south, /obj/item/kirbyplants/potty, @@ -78790,6 +83894,10 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/lounge) +"wGP" = ( +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "wGS" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -78810,12 +83918,37 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/construction/mining/aux_base) +"wHd" = ( +/obj/machinery/chem_heater/withbuffer, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/medical/chemistry) "wHp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"wHw" = ( +/obj/machinery/door/airlock/mining{ + name = "Deliveries" + }, +/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/brown/fourcorners, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/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) "wHx" = ( /obj/machinery/camera/directional/east, /turf/open/openspace, @@ -78826,6 +83959,23 @@ }, /turf/open/floor/iron/dark/textured, /area/station/construction/mining/aux_base) +"wHz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/lattice/catwalk, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/port/fore) +"wHB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 1 + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/engine_smes) "wHE" = ( /obj/effect/turf_decal/siding/dark{ dir = 10 @@ -78834,7 +83984,7 @@ dir = 4 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "wHK" = ( /turf/open/floor/engine/hull/reinforced/air, /area/station/maintenance/port) @@ -78856,26 +84006,32 @@ "wIf" = ( /obj/machinery/button/door/directional/east{ id = "qm_cargobay"; - name = "Cargo Bay Door Control"; - pixel_x = -24 + name = "Cargo Bay Inner Shutters"; + pixel_x = -24; + dir = 8 }, /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 }, -/obj/machinery/light/directional/west, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) -"wIg" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 +"wIi" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 1 }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) -"wIl" = ( -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"wIo" = ( +/obj/machinery/door/airlock{ + id_tag = "Cabin4"; + name = "Cabin 5" + }, +/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/textured_large, +/area/station/commons/dorms) "wIw" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, @@ -78884,19 +84040,10 @@ }, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"wIK" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/turf/open/floor/wood, -/area/station/commons/dorms) -"wIS" = ( -/obj/structure/cable, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"wIW" = ( -/obj/structure/ladder, +"wIN" = ( +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/area/station/maintenance/department/crew_quarters/dorms) "wJn" = ( /obj/machinery/door/airlock/command{ name = "E.V.A. Storage" @@ -78904,8 +84051,9 @@ /obj/effect/mapping_helpers/airlock/access/all/command/eva, /obj/effect/landmark/navigate_destination/eva, /obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "wJs" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -78920,12 +84068,6 @@ /obj/machinery/holopad, /turf/open/floor/wood, /area/station/service/chapel) -"wJF" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/light/directional/south, -/obj/structure/tank_dispenser, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) "wJI" = ( /obj/effect/turf_decal/siding/dark, /obj/effect/turf_decal/siding/dark{ @@ -78936,19 +84078,31 @@ network = list("aicore") }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"wJJ" = ( -/obj/structure/grille, -/turf/closed/wall/r_wall, -/area/station/maintenance/disposal/incinerator) -"wJU" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/engine, -/area/station/engineering/atmos/hfr_room) +/area/station/ai/satellite/chamber) +"wJV" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "wKb" = ( /turf/closed/wall, /area/station/maintenance/starboard/aft) +"wKe" = ( +/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 = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "wKg" = ( /obj/structure/railing/corner{ dir = 8 @@ -78958,13 +84112,42 @@ "wKi" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "wKl" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, /area/station/maintenance/starboard/aft) +"wKr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/clothing/gloves/color/blue{ + desc = "An old pair of nitrile gloves, with no sterile properties."; + name = "old nitrile gloves" + }, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) +"wKx" = ( +/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/catwalk_floor, +/area/station/maintenance/starboard/fore) +"wKC" = ( +/obj/structure/reagent_dispensers/plumbed, +/turf/open/floor/iron, +/area/station/maintenance/starboard/central) "wKD" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -78976,53 +84159,28 @@ }, /turf/open/floor/iron/dark, /area/station/security/range) -"wKI" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "wKR" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/carpet, /area/station/service/chapel) -"wKV" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) +"wKS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "wLc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/corporate_showroom) -"wLe" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/yellow/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk/multiz/down{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/medical/chemistry) -"wLf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/storage/box/lights/mixed{ - pixel_y = 8 - }, -/obj/item/storage/toolbox/emergency, -/obj/structure/table/reinforced, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"wLg" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/engine_smes) +"wLi" = ( +/obj/machinery/holopad, +/turf/open/floor/iron/textured_large, +/area/station/medical/abandoned) +"wLm" = ( +/obj/machinery/firealarm/directional/west, +/turf/open/floor/glass/reinforced, +/area/station/command/bridge) "wLv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -79061,20 +84219,21 @@ /turf/open/floor/engine/hull, /area/space/nearstation) "wLV" = ( -/obj/machinery/button/door/directional/west{ - id = "hosprivacy"; - name = "Privacy Shutters Control"; - pixel_x = 8; - pixel_y = 25 - }, /obj/machinery/holopad/secure, /obj/machinery/keycard_auth/wall_mounted/directional/north{ pixel_x = -6 }, +/obj/machinery/button/door/directional/north{ + pixel_x = 7; + name = "Privacy Shutters Control"; + id = "hosprivacy" + }, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) "wMc" = ( /obj/effect/turf_decal/trimline/red/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/hallway/primary/port) "wMn" = ( @@ -79092,11 +84251,11 @@ }, /turf/open/floor/iron/large, /area/station/hallway/primary/central) -"wMu" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/atmos/upper) +"wMy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "wMD" = ( /obj/structure/lattice/catwalk, /obj/structure/sign/poster/contraband/clown/directional/south, @@ -79116,22 +84275,37 @@ /obj/machinery/vending/snack/blue, /turf/open/floor/iron, /area/station/construction/storage_wing) +"wMO" = ( +/obj/effect/turf_decal/tile/dark/half{ + dir = 1 + }, +/obj/machinery/meter{ + name = "C02 meter" + }, +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "CO2 Multideck Adapter"; + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "wMS" = ( /obj/item/kirbyplants/random, /obj/machinery/firealarm/directional/east, /obj/machinery/airalarm/directional/north, /turf/open/floor/wood, /area/station/security/courtroom) -"wMZ" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Chapel Office" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +"wMX" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/end{ dir = 1 }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +/obj/structure/table/wood, +/obj/effect/spawner/random/medical/medkit, +/obj/item/clothing/neck/stethoscope{ + pixel_x = 2; + pixel_y = 4 + }, +/turf/open/floor/holofloor/dark, +/area/station/command/heads_quarters/cmo) "wNi" = ( /obj/effect/spawner/random/vending/colavend, /obj/structure/disposalpipe/segment{ @@ -79146,6 +84320,10 @@ /obj/structure/cable, /turf/open/floor/iron/sepia, /area/station/hallway/secondary/construction) +"wNp" = ( +/obj/item/binoculars, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/aft/upper) "wNq" = ( /obj/structure/cable, /obj/machinery/computer/records/security{ @@ -79166,27 +84344,47 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/maintenance/port) "wNw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/obj/machinery/camera/autoname/directional/south, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/closet/secure_closet/quartermaster, +/obj/item/gun/energy/recharge/kinetic_accelerator{ + name = "the QM's Accelerator"; + pixel_y = 6 + }, +/obj/item/clothing/head/fedora/white, +/obj/effect/turf_decal/siding/dark/end, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/qm) "wNC" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/item/radio/intercom/directional/east, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark, /area/station/science/server) +"wNJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/plating, +/area/station/engineering/storage_shared) "wNL" = ( /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/commons/storage/tools) +"wNN" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/engineering/atmos) "wNO" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured_half, /area/station/science/ordnance) +"wNR" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "wOb" = ( /obj/structure/table/wood/fancy, /obj/effect/spawner/random/decoration/statue{ @@ -79217,18 +84415,12 @@ }, /obj/machinery/light/floor, /turf/open/floor/iron/dark, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "wOx" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, /area/station/maintenance/starboard/aft) -"wOG" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "wOK" = ( -/obj/machinery/light/small/directional/east, /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/textured_large, @@ -79245,33 +84437,42 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/lab) -"wOR" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/status_display/evac/directional/north, -/obj/structure/rack, -/obj/item/encryptionkey/headset_sci{ - pixel_x = -6; - pixel_y = 1 - }, -/obj/item/encryptionkey/headset_med, -/obj/item/encryptionkey/headset_eng{ - pixel_x = 6; - pixel_y = -1 +"wPf" = ( +/obj/effect/turf_decal/trimline/blue/filled/end, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 8 }, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"wPf" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/white/textured, -/area/station/medical/surgery) +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"wPj" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/firealarm/directional/south, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/iron, +/area/station/engineering/lobby) "wPl" = ( /obj/effect/decal/cleanable/blood/oil/slippery, /turf/open/floor/iron/dark/smooth_large, /area/station/maintenance/port) +"wPp" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/item/kirbyplants/random, +/obj/machinery/light/small/directional/north, +/obj/structure/sign/warning/radiation/rad_area/directional/north, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"wPt" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room/upper) "wPG" = ( /turf/open/floor/carpet/black, /area/station/service/theater) @@ -79279,17 +84480,9 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/textured_large, /area/station/security/prison) -"wPP" = ( -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "wPV" = ( /turf/closed/wall, /area/station/security/detectives_office/private_investigators_office) -"wPX" = ( -/obj/structure/cable, -/turf/closed/wall, -/area/station/maintenance/port) "wQc" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -79299,7 +84492,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{ + dir = 4 + }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "wQh" = ( @@ -79320,6 +84515,20 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"wQt" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"wQu" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/lobby) "wQw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, @@ -79344,6 +84553,11 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden/abandoned) +"wQA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard) "wQD" = ( /obj/machinery/light/small/directional/east, /obj/item/solar_assembly, @@ -79368,10 +84582,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/solars/starboard/aft) -"wQH" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/command/heads_quarters/cmo) "wQS" = ( /obj/structure/railing, /obj/effect/turf_decal/siding/thinplating, @@ -79391,14 +84601,11 @@ }, /turf/open/floor/iron/smooth, /area/station/science/robotics) -"wRi" = ( +"wRb" = ( /obj/effect/turf_decal/siding/wood, -/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/wood/tile, -/area/station/security/detectives_office/private_investigators_office) +/obj/machinery/holopad, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "wRj" = ( /obj/item/storage/fancy/cigarettes/cigpack_shadyjims, /obj/structure/rack, @@ -79442,6 +84649,31 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/security/interrogation) +"wRL" = ( +/obj/structure/table/reinforced, +/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/trash/can{ + pixel_x = -8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"wRQ" = ( +/obj/effect/spawner/random/engineering/atmospherics_portable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) +"wRT" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "wSa" = ( /obj/effect/turf_decal/siding/dark{ dir = 1 @@ -79449,12 +84681,25 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/iron/dark/textured_half, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "wSj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/carpet, /area/station/service/abandoned_gambling_den) +"wSn" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Crew Quarters Access" + }, +/obj/effect/landmark/navigate_destination/dorms, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/dorms) "wSs" = ( /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/iron/smooth, @@ -79473,6 +84718,14 @@ }, /turf/open/floor/iron, /area/station/science/research) +"wSD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/chair, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "wSP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/autoname/directional/north, @@ -79481,10 +84734,6 @@ }, /turf/open/floor/iron/smooth, /area/station/science/robotics) -"wSW" = ( -/obj/structure/bonfire/prelit, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "wSZ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -79499,31 +84748,12 @@ /turf/open/floor/plating, /area/station/maintenance/port) "wTn" = ( -/obj/machinery/door/airlock/mining{ - name = "Cargo Bay" +/obj/machinery/computer/cargo/request{ + dir = 1 }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, /obj/effect/turf_decal/tile/brown/fourcorners, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, /turf/open/floor/iron, -/area/station/cargo/storage) -"wTr" = ( -/obj/structure/railing, -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -12; - pixel_y = 7 - }, -/obj/item/camera_film{ - pixel_x = 3; - pixel_y = 8 - }, -/obj/structure/cable, -/turf/open/floor/wood/large, -/area/station/service/library/private) +/area/station/hallway/primary/starboard) "wTx" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -79531,13 +84761,39 @@ /obj/structure/disposalpipe/junction/flip{ dir = 8 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 4 + }, /area/station/hallway/primary/central) +"wTE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/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/effect/landmark/start/depsec/medical, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) "wTJ" = ( /obj/structure/railing, /obj/structure/lattice, /turf/open/openspace, /area/station/maintenance/port/aft) +"wTP" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/obj/structure/closet/secure_closet/medical3, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) "wTR" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -79551,8 +84807,14 @@ /area/station/security/office) "wTU" = ( /obj/structure/chair/comfy/brown, -/obj/structure/cable, -/turf/open/floor/wood, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/north{ + pixel_x = -5 + }, +/turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "wUb" = ( /obj/effect/turf_decal/trimline/green/filled/line{ @@ -79561,29 +84823,25 @@ /obj/effect/turf_decal/trimline/green/filled/mid_joiner{ dir = 1 }, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge{ + dir = 1 + }, /area/station/hallway/primary/central) +"wUh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating/airless, +/area/station/maintenance/starboard/aft) "wUk" = ( /obj/structure/ladder, /turf/open/floor/engine/hull, /area/space/nearstation) -"wUm" = ( -/obj/effect/spawner/random/structure/chair_flipped{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/security/detectives_office/private_investigators_office) "wUu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/structure/grille/broken, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"wUI" = ( -/obj/machinery/door/poddoor/incinerator_atmos_main, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) "wVd" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, @@ -79591,6 +84849,19 @@ "wVf" = ( /turf/closed/wall, /area/station/security/prison/rec) +"wVh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/gravity_generator) +"wVu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "wVx" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -79636,13 +84907,41 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"wVX" = ( -/obj/structure/railing{ +"wVP" = ( +/obj/machinery/door/airlock/atmos/glass{ + name = "Atmospherics Testing Room" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"wVY" = ( +/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/airless, +/area/station/maintenance/aft) +"wWg" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/blood/ethereal, +/obj/item/reagent_containers/cup/soda_cans/monkey_energy, +/obj/item/reagent_containers/cup/soda_cans/monkey_energy, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/dorms) +"wWi" = ( +/obj/effect/turf_decal/stripes/red/end, +/obj/effect/turf_decal/siding/red/end, +/turf/open/floor/iron/textured_corner{ dir = 1 }, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/engineering/break_room) +/area/station/command/gateway) +"wWk" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "wWm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, @@ -79657,6 +84956,9 @@ /area/station/service/cafeteria) "wWy" = ( /obj/machinery/camera/autoname/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron, /area/station/hallway/primary/aft) "wWA" = ( @@ -79672,6 +84974,14 @@ }, /turf/open/floor/carpet, /area/station/service/lawoffice) +"wWM" = ( +/obj/effect/spawner/random/techstorage/command_all, +/obj/structure/rack, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "wWO" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input, /turf/open/floor/engine/n2, @@ -79684,14 +84994,14 @@ /turf/open/floor/iron/white/smooth_large, /area/station/hallway/secondary/entry) "wWV" = ( -/obj/effect/turf_decal/siding/blue/corner{ - dir = 1 - }, -/obj/effect/turf_decal/arrows{ - dir = 8 +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "hop"; + name = "Privacy Shutters" }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) +/turf/open/floor/plating, +/area/station/command/heads_quarters/hop) "wWX" = ( /obj/structure/railing/corner{ dir = 1 @@ -79731,6 +85041,14 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"wXj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "wXk" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/smooth_large, @@ -79777,35 +85095,42 @@ /area/station/maintenance/hallway/abandoned_recreation) "wXL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_corner{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ dir = 4 }, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) "wXM" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 + dir = 1 }, -/obj/effect/spawner/random/maintenance, /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/brown/filled/warning{ + dir = 4 + }, /turf/open/floor/iron, /area/station/cargo/storage) -"wXU" = ( -/obj/item/bedsheet/captain, -/obj/structure/bed, -/obj/effect/landmark/start/captain, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"wXW" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 5 +"wXQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible, +/obj/machinery/meter{ + name = "Mix Meter" }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/turf/open/floor/iron/smooth, +/turf/open/floor/iron/dark, /area/station/engineering/atmos/upper) +"wXU" = ( +/obj/machinery/newscaster/directional/south, +/obj/machinery/suit_storage_unit/captain, +/obj/item/mod/module/longfall{ + pixel_x = 8 + }, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/captain/private) +"wYb" = ( +/obj/structure/table, +/obj/item/wrench, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "wYk" = ( /obj/effect/turf_decal/siding/dark/end{ dir = 8 @@ -79826,6 +85151,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"wYy" = ( +/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/access/all/medical/cmo, +/obj/machinery/door/airlock/command{ + name = "Chief Medical Officer's Office" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/cmo) "wYz" = ( /obj/machinery/camera/autoname/directional/west, /turf/open/floor/engine/hull/air, @@ -79846,17 +85182,18 @@ /turf/open/openspace, /area/station/maintenance/port/aft) "wYH" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 +/obj/effect/turf_decal/trimline/blue/filled/end{ + dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 1 + dir = 4 }, -/obj/structure/disposalpipe/segment{ - dir = 10 +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "wYJ" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/wood, @@ -79870,10 +85207,9 @@ /area/station/commons/lounge) "wYS" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/area/station/cargo/storage) "wYU" = ( /obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/siding/thinplating_new/dark, @@ -79882,15 +85218,14 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/lounge) -"wZb" = ( -/obj/effect/turf_decal/stripes/line{ +"wYX" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "wZg" = ( /obj/structure/toilet{ dir = 8; @@ -79916,23 +85251,24 @@ /obj/machinery/light/directional/north, /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/freezer, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) +"wZk" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/dorms) +"wZn" = ( +/obj/machinery/light/directional/east, +/turf/open/openspace, +/area/station/ai/upload/chamber) "wZy" = ( /obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) -"wZA" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 2 +/turf/open/floor/iron/edge{ + dir = 8 }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) +/area/station/hallway/primary/central) "wZE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -79955,11 +85291,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/freezer, /area/station/commons/toilet/auxiliary) -"xah" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced/tinted, -/turf/open/floor/plating/airless, -/area/station/maintenance/starboard/aft) +"xae" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/indigo, +/turf/open/space/basic, +/area/space/nearstation) "xaj" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -79977,7 +85313,10 @@ /area/station/commons/toilet/restrooms) "xar" = ( /obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/dark/textured_large, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/white, /area/station/medical/medbay/central) "xat" = ( /obj/effect/turf_decal/trimline/blue/filled/line, @@ -79995,47 +85334,38 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) +"xau" = ( +/obj/machinery/light/warm/dim/directional/east, +/obj/structure/table, +/obj/item/clothing/gloves/cargo_gauntlet, +/obj/item/clothing/gloves/cargo_gauntlet{ + pixel_y = 3 + }, +/obj/item/clothing/gloves/cargo_gauntlet{ + pixel_y = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/sign/poster/random/directional/south, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "xaz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/iron, /area/station/hallway/secondary/construction) "xaH" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/turf/open/floor/wood, +/obj/structure/bed/medical/emergency, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) -"xaP" = ( -/obj/item/paper_bin{ - pixel_x = 5; - pixel_y = 4 - }, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/table, -/obj/item/pen{ - pixel_x = 5; - pixel_y = 6 - }, -/obj/item/stamp{ - pixel_x = -7; - pixel_y = 2 - }, -/turf/open/floor/wood/large, -/area/station/service/library/private) "xaQ" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/maintenance, /turf/open/floor/carpet/stellar, /area/station/maintenance/hallway/abandoned_recreation) -"xaT" = ( -/obj/structure/lattice, -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "xaU" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/glass/reinforced, @@ -80048,18 +85378,16 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/security/prison/mess) +"xba" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/virology) "xbm" = ( /obj/machinery/door/firedoor, /obj/structure/cable, /turf/open/floor/engine/hull/air, /area/station/hallway/secondary/construction) -"xbz" = ( -/obj/structure/chair/sofa/left/brown{ - dir = 4 - }, -/obj/item/cigbutt, -/turf/open/floor/wood, -/area/station/commons/dorms) "xbF" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment{ @@ -80067,21 +85395,9 @@ }, /turf/open/space/basic, /area/space/nearstation) -"xbI" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - Oxygen Supply"; - name = "atmospherics camera" - }, -/turf/open/floor/engine/o2, -/area/station/engineering/atmos/upper) "xbL" = ( /turf/open/floor/iron/dark, /area/station/service/chapel) -"xbP" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/openspace, -/area/station/engineering/atmos/project) "xbR" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -80093,16 +85409,20 @@ /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"xbZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/ladder, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"xce" = ( -/obj/machinery/light/warm/dim/directional/west, -/turf/open/openspace, -/area/station/hallway/primary/central) +"xca" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/arrow_ccw{ + dir = 4 + }, +/obj/structure/chair{ + dir = 4; + pixel_y = -2 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "xci" = ( /obj/machinery/camera/autoname/directional/south, /turf/open/openspace, @@ -80116,17 +85436,15 @@ /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) +"xcq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/smooth, +/area/station/science/robotics) "xcx" = ( /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/security/interrogation) -"xcR" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/computer/atmos_control/nitrogen_tank, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "xcT" = ( /obj/machinery/status_display/ai/directional/east, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -80135,19 +85453,12 @@ /obj/structure/closet/secure_closet/evidence, /turf/open/floor/iron/dark, /area/station/security/evidence) -"xcV" = ( -/obj/effect/turf_decal/siding{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) +"xcZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible, +/obj/machinery/light/directional/south, +/obj/structure/sign/warning/radiation/rad_area/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "xda" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -80185,13 +85496,16 @@ /area/station/service/hydroponics) "xdG" = ( /obj/structure/cable, -/obj/effect/turf_decal/tile/green/opposingcorners{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "xdK" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 @@ -80199,6 +85513,20 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron/dark/textured, /area/station/construction/mining/aux_base) +"xdS" = ( +/obj/machinery/door/airlock/atmos/glass{ + name = "Atmospherics" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/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/stripes/line, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "atmoslowersm" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/office) "xdT" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/vending/coffee, @@ -80206,30 +85534,20 @@ /turf/open/floor/iron, /area/station/science/lab) "xdU" = ( -/obj/structure/railing/corner, -/obj/structure/table/glass, -/obj/item/assembly/flash/handheld{ - pixel_x = 7; - pixel_y = 2 - }, -/obj/item/cigarette/cigar{ - pixel_x = -6; - pixel_y = 5 +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 10 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "xdV" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/lounge) -"xdZ" = ( -/obj/structure/bed, -/obj/item/bedsheet/ce, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "xeb" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -80244,14 +85562,38 @@ /obj/item/pai_card{ pixel_y = 5 }, +/obj/effect/turf_decal/siding/green, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) +"xej" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "xes" = ( /obj/structure/lattice/catwalk, -/obj/machinery/recharge_station, /obj/machinery/light/directional/west, /turf/open/openspace, -/area/station/medical/storage) +/area/station/medical/medbay/central) +"xex" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/openspace, +/area/station/maintenance/starboard/aft/upper) +"xeD" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/bed/dogbed/runtime, +/obj/item/toy/cattoy, +/mob/living/basic/pet/cat/runtime, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/carpet/cyan, +/area/station/command/heads_quarters/cmo) "xeM" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 @@ -80259,20 +85601,13 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/central) "xeN" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/button/door/directional/east{ - id = "cargounload"; - name = "Loading Doors"; - pixel_y = 6 +/obj/machinery/conveyor{ + dir = 5; + id = "cargoload" }, -/obj/machinery/button/door/directional/east{ - id = "cargoload"; - name = "Loading Doors"; - pixel_y = -6 +/obj/effect/turf_decal/stripes/end{ + dir = 8 }, -/obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/cargo/storage) "xeQ" = ( @@ -80298,26 +85633,21 @@ /obj/structure/chair/office, /turf/open/floor/iron/dark/smooth_large, /area/station/tcommsat/server) -"xfa" = ( -/obj/effect/turf_decal/trimline/white/line{ - dir = 8; - pixel_x = 8 - }, -/obj/effect/turf_decal/trimline/white/line{ - dir = 1 - }, +"xeY" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) -"xfj" = ( -/obj/structure/railing{ - dir = 4 +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 }, -/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/cafeteria, +/area/station/maintenance/starboard) +"xfi" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/openspace, -/area/station/engineering/lobby) +/area/station/maintenance/starboard/aft/upper) "xfn" = ( /obj/effect/decal/cleanable/glitter{ color = "ff8080" @@ -80328,30 +85658,38 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"xfq" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"xfr" = ( -/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/dirt, -/obj/structure/light_construct/directional/east{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "xfs" = ( /obj/structure/disposalpipe/segment{ dir = 5 }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"xfy" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/engineering/lobby) +"xfQ" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "body"; + name = "body"; + pixel_x = 9; + pixel_y = 3 + }, +/obj/item/ammo_casing/spent{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) "xfV" = ( /obj/structure/railing/corner{ dir = 8 @@ -80364,19 +85702,9 @@ dir = 1 }, /obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/light/floor, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"xfX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/lobby) -"xgb" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/cup/soda_cans/monkey_energy, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) "xgC" = ( /obj/machinery/light_switch{ pixel_x = -9; @@ -80390,7 +85718,41 @@ name = "Unit 2" }, /turf/open/floor/iron/freezer, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) +"xgK" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/iron/textured, +/area/station/commons/dorms) +"xgP" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/button/elevator/directional/east{ + id = "catwalk_atmos"; + name = "Elevator Button" + }, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/engine, +/area/station/engineering/atmos/upper) +"xgR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/engineering/lobby) +"xgT" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "xgV" = ( /obj/effect/turf_decal/tile/blue/full, /obj/effect/turf_decal/tile/dark/full, @@ -80409,11 +85771,12 @@ /obj/effect/landmark/start/depsec/science, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"xhr" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/carpet, -/area/station/maintenance/starboard/lesser) +"xhv" = ( +/obj/structure/lattice/catwalk, +/obj/structure/closet/emcloset, +/obj/effect/spawner/random/maintenance, +/turf/open/openspace, +/area/station/maintenance/starboard/aft/upper) "xhF" = ( /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark/textured_corner{ @@ -80442,35 +85805,61 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"xhV" = ( +/obj/item/melee/flyswatter{ + pixel_x = -2 + }, +/obj/item/toy/plush/lizard_plushie/green{ + name = "Steals-The-Cheese"; + pixel_x = 8; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/dark_green/opposingcorners, +/obj/effect/turf_decal/tile/green/opposingcorners{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/lizard/directional/west, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/fore) "xhX" = ( /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/service/abandoned_gambling_den) -"xib" = ( -/obj/structure/lattice/catwalk, -/obj/item/toy/plush/lizard_plushie/green{ - name = "Hides-In-Rafters" +"xif" = ( +/turf/open/floor/iron/textured_large, +/area/station/medical/abandoned) +"xig" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) +/turf/open/floor/iron/dark, +/area/station/medical/cryo) "xit" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, /obj/structure/sign/departments/telecomms/directional/south, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "xiy" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Cargo Lockdown Shutters"; + id = "cargolockdown"; + dir = 8 }, -/turf/open/floor/iron, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/station/cargo/sorting) "xiQ" = ( -/obj/effect/turf_decal/tile/red/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "xiR" = ( /obj/structure/chair/stool/bar/directional/east, /turf/open/floor/plating, @@ -80496,10 +85885,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/circuit/red, /area/station/maintenance/hallway/abandoned_recreation) -"xjc" = ( -/obj/effect/landmark/event_spawn, -/turf/open/openspace, -/area/station/science/explab) "xjm" = ( /obj/item/vending_refill/donksnackvendor{ pixel_y = 15 @@ -80518,44 +85903,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"xjq" = ( -/obj/structure/table/reinforced, -/obj/item/rcl/pre_loaded{ - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "xjr" = ( -/obj/machinery/modular_computer/preset/id{ - dir = 8 - }, -/obj/structure/railing, -/obj/structure/secure_safe/caps_spare{ - pixel_x = 35 +/obj/machinery/camera/autoname/directional/east, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 4 }, -/obj/effect/turf_decal/tile/green/opposingcorners{ - dir = 1 +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "xjz" = ( /turf/open/floor/plating/elevatorshaft, /area/station/science/robotics) -"xjK" = ( -/obj/structure/lattice/catwalk, -/obj/structure/filingcabinet, -/obj/effect/spawner/random/bureaucracy/paper, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) -"xjL" = ( -/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 = 2 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) "xjR" = ( /obj/structure/railing/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -80583,15 +85943,39 @@ }, /turf/open/floor/iron/dark, /area/station/science/cytology) +"xkc" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/station/engineering/atmos/office) "xkn" = ( /obj/structure/railing/corner, /obj/structure/cable, /turf/open/floor/engine/hull/air, /area/station/maintenance/port) "xky" = ( -/obj/structure/chair, -/turf/open/floor/engine/hull, -/area/space/nearstation) +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/station/cargo/storage) +"xkG" = ( +/obj/structure/table, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/item/radio{ + desc = "An old handheld radio. You could use it, if you really wanted to."; + icon_state = "radio"; + name = "old radio" + }, +/obj/structure/sign/calendar/directional/north, +/turf/open/floor/wood/large, +/area/station/commons/dorms) +"xkJ" = ( +/obj/effect/turf_decal/stripes/full, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/storage) "xkL" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -80609,15 +85993,10 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) "xkV" = ( -/obj/machinery/camera/motion{ - c_tag = "Armory - Internal"; - dir = 8 - }, -/obj/effect/turf_decal/caution{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/command/heads_quarters/rd) "xkZ" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -80643,6 +86022,12 @@ }, /turf/open/openspace, /area/station/hallway/primary/central) +"xlt" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/turf/open/floor/iron, +/area/station/maintenance/starboard) "xlw" = ( /obj/structure/bed/dogbed{ name = "spider bed" @@ -80651,13 +86036,6 @@ /obj/structure/flora/bush/flowers_br, /turf/open/floor/grass, /area/station/command/heads_quarters/hos) -"xlH" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/obj/machinery/shower/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/freezer, -/area/station/commons/dorms) "xlL" = ( /obj/effect/turf_decal/delivery, /obj/machinery/vending/coffee, @@ -80669,15 +86047,6 @@ /obj/structure/broken_flooring/corner/always_floorplane/directional/south, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"xmd" = ( -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "SM_shutters"; - name = "Supermatter Radiation Shutters" - }, -/obj/machinery/atmospherics/components/binary/pump/off/cyan/visible, -/obj/effect/turf_decal/trimline/blue, -/turf/open/floor/plating, -/area/station/engineering/supermatter) "xme" = ( /obj/structure/flora/bush/large/style_2, /obj/structure/flora/rock/pile/style_2, @@ -80704,10 +86073,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/brig) -"xmq" = ( -/obj/effect/turf_decal/trimline/yellow/warning, -/turf/open/floor/engine/hull/reinforced, -/area/space/nearstation) "xms" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -80721,15 +86086,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) -"xmx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "xmA" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/camera/autoname/directional/south, @@ -80745,12 +86101,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"xmQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "xne" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -80789,6 +86139,14 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"xnL" = ( +/obj/structure/cable, +/obj/machinery/light/floor, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "xnP" = ( /obj/effect/turf_decal/siding/wood/end{ dir = 8 @@ -80819,12 +86177,6 @@ dir = 4 }, /area/station/service/chapel) -"xoh" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/shieldgen, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/engine, -/area/station/engineering/break_room) "xol" = ( /obj/effect/turf_decal/delivery, /obj/machinery/airalarm/directional/north, @@ -80854,28 +86206,23 @@ /obj/effect/turf_decal/trimline/purple/filled/mid_joiner, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) -"xoH" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/camera/autoname/directional/north, -/obj/machinery/light_switch/directional/north, -/turf/open/openspace, -/area/station/engineering/break_room) "xoT" = ( /obj/structure/barricade/wooden, +/obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"xoZ" = ( -/obj/effect/turf_decal/siding{ +"xpd" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 6 + }, +/obj/effect/turf_decal/siding/dark{ dir = 1 }, -/obj/effect/turf_decal/trimline/white/corner{ - dir = 8 +/obj/structure/railing{ + dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/full, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/station/maintenance/starboard/lesser) +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "xpj" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -80889,42 +86236,20 @@ /obj/structure/closet/secure_closet/security/sec, /turf/open/floor/iron/dark/smooth_large, /area/station/security/lockers) +"xpo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/hangover, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "xpq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) -"xpr" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) -"xpv" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "xpw" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/engine/hull/air, /area/station/hallway/secondary/entry) -"xpF" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "xpV" = ( /obj/effect/landmark/start/bartender, /obj/effect/turf_decal/tile/dark_green{ @@ -80964,20 +86289,10 @@ dir = 8 }, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 6 }, /turf/open/floor/iron/dark, /area/station/science/lobby) -"xqm" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 6 - }, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/openspace, -/area/station/engineering/lobby) "xqo" = ( /obj/effect/decal/cleanable/ash{ beauty = 50; @@ -80993,32 +86308,13 @@ "xqs" = ( /turf/closed/wall/r_wall, /area/station/engineering/engine_smes) -"xqy" = ( -/obj/structure/stairs/north, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"xqE" = ( -/obj/machinery/camera/autoname/directional/south, +"xqD" = ( /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 1 }, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"xqG" = ( -/obj/structure/sign/poster/contraband/communist_state/directional/south, -/obj/item/ammo_casing/spent{ - pixel_x = -8; - pixel_y = -4 - }, -/obj/item/ammo_casing/spent{ - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/medical/chemistry) "xqK" = ( /obj/structure/table, /obj/item/instrument/harmonica, @@ -81030,28 +86326,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) -"xqL" = ( -/obj/effect/turf_decal/siding/blue/corner, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ +"xqR" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/plumbing/receiver{ dir = 1 }, -/obj/structure/table/glass, -/obj/item/reagent_containers/chem_pack{ - pixel_x = 5; - pixel_y = 4 - }, -/obj/item/reagent_containers/syringe{ - pixel_x = 6; - pixel_y = -2 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/pharmacy) "xqU" = ( /obj/machinery/smartfridge/petri/preloaded, /obj/effect/turf_decal/tile/dark_blue{ @@ -81097,6 +86383,18 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/station/hallway/primary/central) +"xrw" = ( +/obj/item/stack/sheet/iron{ + amount = 34 + }, +/obj/item/stack/rods{ + amount = 23 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) "xrx" = ( /obj/structure/lattice/catwalk, /turf/open/space/openspace, @@ -81135,23 +86433,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"xrJ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) -"xrM" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/red/corner, -/obj/machinery/airalarm/directional/west, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron, -/area/station/hallway/primary/port) +"xrI" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/engine_smes) "xrP" = ( /obj/structure/lattice/catwalk, /obj/structure/table/reinforced, @@ -81160,13 +86447,19 @@ }, /turf/open/openspace, /area/station/security/checkpoint/customs) +"xrU" = ( +/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, +/area/station/maintenance/starboard/central/upper) "xrX" = ( /obj/machinery/light/directional/west, -/obj/machinery/camera/autoname/directional/west{ - network = list("ss13","medbay"); - c_tag = "Medbay - Lower Hallway North" +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 }, -/turf/open/floor/iron/white/textured_large, +/obj/effect/turf_decal/siding/blue, +/turf/open/floor/iron/white, /area/station/medical/medbay/central) "xsh" = ( /obj/effect/turf_decal/siding/blue{ @@ -81183,6 +86476,23 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/cytology) +"xsq" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "holodeck" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured_large, +/area/station/commons/fitness/recreation) +"xst" = ( +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos/upper) "xsv" = ( /obj/machinery/light/cold/directional/south, /turf/open/floor/engine, @@ -81193,22 +86503,29 @@ /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) "xsD" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Primary Surgical Theatre" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, /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/medical/surgery, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/blue/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"xsF" = ( +/obj/effect/landmark/transport/transport_id{ + specific_transport_id = "catwalk_engi" + }, +/obj/structure/transport/linear{ + radial_travel = 0 + }, +/turf/open/openspace, +/area/station/engineering/supermatter/room/upper) "xsJ" = ( /obj/effect/turf_decal/siding/purple{ dir = 8 @@ -81223,40 +86540,69 @@ }, /turf/open/floor/iron, /area/station/science/explab) +"xsK" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 2; + name = "N2O to Mix" + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "xsS" = ( /turf/closed/wall/r_wall, /area/station/engineering/transit_tube) "xsU" = ( -/obj/structure/railing{ - dir = 9 +/obj/machinery/conveyor{ + dir = 4; + id = "cargoload" }, -/turf/open/openspace, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, /area/station/cargo/storage) "xta" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/department/medical) -"xtf" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/obj/structure/sign/directions/engineering/directional/east{ - dir = 1 +"xts" = ( +/obj/structure/closet/crate/bin, +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/button/door/directional/east{ + id = "Cabin5"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/dorms) +"xtA" = ( +/obj/structure/table/glass, +/obj/item/storage/fancy/candle_box, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "xtC" = ( -/obj/structure/chair{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 +/obj/machinery/light/floor, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"xtE" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 }, +/obj/effect/landmark/start/depsec/engineering, /turf/open/floor/iron/dark, -/area/station/hallway/primary/central) +/area/station/security/checkpoint/engineering) "xtG" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -81269,45 +86615,57 @@ }, /turf/open/floor/iron/dark/textured, /area/station/engineering/supermatter/room) +"xtS" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/space/basic, +/area/station/maintenance/solars/port/aft) +"xtW" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/directional/east, +/turf/open/space/openspace, +/area/space/nearstation) "xut" = ( /turf/closed/wall, /area/station/service/abandoned_gambling_den) -"xuu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/lesser) -"xuy" = ( -/obj/effect/spawner/random/trash/hobo_squat, +"xuz" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "chemshutters"; + name = "Pharmacy Shutters" + }, +/obj/effect/spawner/structure/window, /turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"xuB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +/area/station/medical/pharmacy) "xuF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/textured, /area/station/construction/mining/aux_base) +"xuM" = ( +/obj/structure/cable, +/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, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "xuP" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"xuQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/holopad, -/turf/open/floor/wood/large, -/area/station/medical/psychology) -"xuU" = ( -/obj/machinery/door/airlock{ - name = "Abandoned Chapel" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) "xuV" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -81341,18 +86699,33 @@ dir = 4 }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) -"xvv" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/chamber) "xvw" = ( -/obj/machinery/door/window/right/directional/east{ - name = "Captain's Desk"; - req_access = list("captain") +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/turf/open/floor/wood, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -5; + pixel_y = 9 + }, +/obj/item/folder/blue{ + pixel_x = 6; + pixel_y = -3 + }, +/obj/item/melee/chainofcommand{ + pixel_y = -12 + }, +/obj/item/stamp/denied{ + pixel_x = 8; + pixel_y = 10 + }, +/obj/item/stamp/head/captain{ + pixel_x = 7; + pixel_y = 14 + }, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) "xvy" = ( /obj/structure/table, @@ -81364,43 +86737,41 @@ /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "xvA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +/obj/effect/turf_decal/siding/blue/end{ + dir = 8 }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/shower/directional/west, +/turf/open/floor/iron/showroomfloor, /area/station/medical/medbay/central) -"xvD" = ( -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "xvN" = ( /obj/item/radio/intercom/directional/west, -/turf/open/floor/carpet, -/area/station/ai_monitored/command/storage/eva) -"xvQ" = ( -/obj/structure/chair/office, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/textured, +/area/station/command/eva) "xwg" = ( /obj/structure/railing/corner/end, /obj/machinery/light/cold/directional/north, /turf/open/floor/iron/dark/textured_large, /area/station/science/genetics) +"xwk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "xwn" = ( /obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/engine/hull, /area/space/nearstation) -"xwu" = ( -/obj/structure/cable/multilayer/multiz, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) "xwB" = ( /obj/structure/fake_stairs/directional/east, /obj/structure/railing, @@ -81411,15 +86782,6 @@ }, /turf/open/floor/iron/smooth, /area/station/science/robotics) -"xwC" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) "xwF" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/glass/reinforced, @@ -81442,22 +86804,56 @@ /obj/effect/landmark/start/hangover, /turf/open/openspace, /area/station/hallway/primary/fore) -"xxd" = ( -/obj/effect/turf_decal/tile/dark_green{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) "xxe" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, /turf/open/openspace, /area/station/hallway/primary/fore) +"xxh" = ( +/obj/effect/turf_decal/tile/dark_green/half/contrasted, +/obj/structure/chair/stool/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"xxr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) +"xxs" = ( +/obj/structure/cable, +/obj/effect/spawner/random/structure/steam_vent, +/obj/structure/lattice/catwalk, +/turf/open/openspace, +/area/station/maintenance/starboard/central/upper) "xxz" = ( -/turf/open/floor/engine/hull/air, +/obj/structure/sign/warning/gas_mask/directional/west, +/obj/structure/table/reinforced/plasmarglass, +/obj/machinery/reagentgrinder{ + pixel_x = -8; + pixel_y = 8 + }, +/obj/item/paper_bin{ + pixel_x = 6; + pixel_y = 12 + }, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 12 + }, +/obj/item/folder/white{ + pixel_x = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, /area/station/medical/chemistry) +"xxE" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "xxF" = ( /obj/effect/decal/cleanable/blood/footprints{ dir = 4 @@ -81483,20 +86879,51 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"xyz" = ( -/turf/open/openspace, -/area/station/medical/virology) -"xyC" = ( -/obj/structure/railing/corner{ +"xym" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/machinery/door/airlock/medical{ - name = "Medbay Storage" +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"xyn" = ( +/obj/machinery/turretid{ + control_area = "/area/station/ai/upload/chamber"; + name = "AI Upload Turret Control" }, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/storage) +/turf/closed/wall/r_wall, +/area/station/ai/upload/foyer) +"xyt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/spawner/random/engineering/vending_restock/common, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) +"xyz" = ( +/turf/open/openspace, +/area/station/medical/virology) +"xyA" = ( +/obj/effect/spawner/random/food_or_drink/snack, +/obj/structure/table, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/glass, +/area/station/medical/patients_rooms/room_a) +"xyD" = ( +/obj/structure/cable, +/obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/main) "xyF" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) @@ -81507,28 +86934,27 @@ }, /turf/open/space/basic, /area/space/nearstation) -"xyX" = ( -/obj/structure/table, -/obj/item/electronics/apc, -/obj/item/electronics/airlock, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"xzm" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/table, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"xzo" = ( -/obj/machinery/door/airlock/maintenance, +"xzl" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/spawner/random/structure/crate, +/obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard) +"xzn" = ( +/obj/machinery/light/red/directional/south, +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/medical/chemistry) +"xzr" = ( +/obj/structure/table/wood, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "xzy" = ( /turf/closed/wall, /area/station/science/genetics) @@ -81562,13 +86988,37 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/hallway/secondary/service) +"xAm" = ( +/obj/structure/rack, +/obj/item/storage/belt/utility, +/obj/item/airlock_painter, +/obj/item/storage/belt/utility, +/obj/item/clothing/gloves/color/fyellow, +/obj/item/clothing/gloves/color/fyellow, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "xAn" = ( /obj/machinery/shower/directional/west, /obj/effect/turf_decal/trimline/blue/end{ dir = 8 }, /turf/open/floor/iron/freezer, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) +"xAr" = ( +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 4; + name = "Mix to Recycle" + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "xAs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/machinery/door/window/brigdoor/left/directional/north{ @@ -81587,12 +87037,16 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/hallway/secondary/service) -"xAu" = ( -/turf/closed/wall, -/area/station/medical/chemistry) -"xAI" = ( -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +"xAC" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 10 + }, +/obj/effect/turf_decal/siding/yellow/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/upper) "xAN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/full, @@ -81641,7 +87095,7 @@ dir = 8 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "xBr" = ( /obj/structure/closet/crate/coffin, /obj/item/toy/plush/lizard_plushie/green{ @@ -81649,36 +87103,28 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"xBt" = ( -/obj/machinery/camera/autoname/directional/west, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +"xBC" = ( +/obj/structure/safe, +/obj/item/storage/fancy/pickles_jar, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "xBE" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter) -"xBO" = ( -/obj/structure/chair/office, -/obj/effect/landmark/start/chaplain, -/obj/structure/disposalpipe/segment{ - dir = 4 +"xBP" = ( +/obj/item/trash/can{ + pixel_x = -8 }, -/turf/open/floor/carpet, -/area/station/service/chapel/office) -"xBQ" = ( +/turf/open/floor/engine/hull/air, +/area/station/commons/dorms) +"xBU" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ - dir = 9 + dir = 1 }, -/obj/structure/cable/multilayer/multiz, +/obj/effect/turf_decal/stripes/corner, /turf/open/openspace, -/area/station/engineering/atmos/project) -"xBR" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/area/station/engineering/supermatter/room/upper) "xBZ" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 @@ -81687,7 +87133,7 @@ dir = 4 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "xCe" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -81695,6 +87141,17 @@ /obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron, /area/station/cargo/storage) +"xCj" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "xCq" = ( /obj/effect/turf_decal/trimline/yellow/arrow_ccw{ dir = 4 @@ -81706,12 +87163,10 @@ dir = 4 }, /area/station/hallway/secondary/exit/departure_lounge) -"xCt" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, +"xCs" = ( +/obj/structure/table/glass, /turf/open/floor/wood, -/area/station/commons/fitness/recreation) +/area/station/maintenance/starboard) "xCu" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -81730,55 +87185,38 @@ /turf/open/floor/plating, /area/station/maintenance/port) "xCz" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 +/obj/structure/bed/pod{ + desc = "An old medical bed, just waiting for replacement with something up to date."; + name = "medical bed" }, -/obj/machinery/holopad, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/surgery) -"xCI" = ( -/obj/structure/railing, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/siding/dark_blue/corner{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"xCJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/engineering{ - name = "Engine Room" - }, -/obj/structure/disposalpipe/segment{ - dir = 2 +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) +"xCI" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/corner, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor, -/area/station/engineering/main) +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "xCK" = ( /turf/open/openspace, /area/station/security/interrogation) "xCO" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/east{ - name = "Cargo Desk"; - req_access = list("cargo") +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 }, -/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/trimline/brown/arrow_ccw, /turf/open/floor/iron, -/area/station/cargo/storage) +/area/station/hallway/primary/starboard) "xCQ" = ( /obj/structure/lattice/catwalk, /obj/structure/ladder, /obj/item/radio/intercom/directional/east, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "xCS" = ( /obj/item/clothing/suit/jacket/straight_jacket, /obj/structure/closet, @@ -81802,29 +87240,54 @@ /turf/open/floor/iron/dark/textured_half{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"xCV" = ( +/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) "xCW" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/machinery/light/directional/east, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/arrow_cw{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"xDp" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"xDe" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Waste to Filter"; + dir = 4 + }, +/obj/effect/turf_decal/trimline/red, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) +"xDq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/obj/machinery/meter/monitored/waste_loop, +/obj/effect/turf_decal/box/red, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) +"xDw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) -"xDs" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central/upper) "xDB" = ( /obj/machinery/computer/dna_console{ dir = 1 @@ -81835,15 +87298,11 @@ /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"xDR" = ( -/obj/machinery/wall_healer/directional/south, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "xDW" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -81876,12 +87335,13 @@ /obj/effect/landmark/start/bitrunner, /turf/open/floor/iron/dark/textured_half, /area/station/cargo/bitrunning/den) -"xEl" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners{ +"xEh" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/engineering/lobby) "xEm" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -81892,15 +87352,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"xEo" = ( -/obj/structure/railing/corner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) "xEr" = ( /obj/item/radio/intercom/directional/north, /turf/open/floor/plating, /area/station/maintenance/disposal) +"xEt" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "xEB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -81908,6 +87368,21 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"xED" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/toilet{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/station/commons/dorms) +"xEF" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos/upper) +"xEJ" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "xEL" = ( /obj/structure/rack, /obj/item/melee/skateboard{ @@ -81926,6 +87401,15 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/station/maintenance/port) +"xEM" = ( +/obj/machinery/door/poddoor/preopen{ + id = "ceprivacy"; + name = "Chief Engineers Privacy Shutters" + }, +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room/upper) "xEO" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 6 @@ -81939,8 +87423,35 @@ /area/station/maintenance/port/greater) "xEU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/obj/structure/cable, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/binoculars{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) +"xEW" = ( +/obj/structure/rack, +/obj/item/analyzer, +/obj/item/wrench, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) +"xFg" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"xFh" = ( +/obj/structure/cable, +/turf/closed/wall, +/area/station/medical/surgery) "xFj" = ( /obj/effect/turf_decal/tile/blue/full, /obj/effect/turf_decal/tile/dark/full, @@ -81970,21 +87481,6 @@ }, /turf/open/openspace, /area/station/construction/storage_wing) -"xFw" = ( -/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/plating, -/area/station/maintenance/starboard/aft) -"xFA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/athletic_mixed, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "xFH" = ( /obj/machinery/light/directional/east, /obj/structure/cable, @@ -82016,21 +87512,21 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"xFS" = ( -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/machinery/door/airlock/command{ - name = "Abandoned Lab" - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/lesser) +"xFN" = ( +/obj/machinery/door/poddoor/incinerator_atmos_main, +/turf/open/floor/engine, +/area/station/engineering/atmos/upper) "xFT" = ( /turf/open/floor/iron/stairs, /area/station/maintenance/starboard/aft) +"xGb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/water/no_planet_atmos, +/area/station/maintenance/starboard/fore) "xGe" = ( /obj/structure/railing/corner, /turf/open/openspace, @@ -82048,12 +87544,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) -"xGG" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/medbay/central) "xGL" = ( /obj/effect/turf_decal/siding/purple{ dir = 4 @@ -82066,6 +87556,17 @@ }, /turf/open/floor/iron, /area/station/science/explab) +"xGN" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/station/maintenance/aft) +"xGS" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "xGU" = ( /obj/structure/table/reinforced, /obj/item/tank/internals/oxygen, @@ -82075,6 +87576,19 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"xGV" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 10 + }, +/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/structure/cable, +/turf/open/openspace, +/area/station/engineering/lobby) "xHi" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, @@ -82089,29 +87603,78 @@ /obj/item/storage/medkit/brute, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"xHP" = ( -/obj/structure/chair{ - dir = 1; - pixel_y = -2 +"xHC" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 }, -/turf/open/floor/glass, -/area/station/commons/fitness/recreation) +/turf/open/floor/engine/hull/air, +/area/station/maintenance/aft/upper) +"xHE" = ( +/obj/structure/sign/directions/command/directional/west{ + dir = 2; + pixel_y = 5; + pixel_x = 0 + }, +/obj/structure/sign/directions/evac/directional/west{ + dir = 2; + pixel_y = -3; + pixel_x = 0 + }, +/turf/closed/wall, +/area/station/commons/locker) +"xHS" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/sign/clock/directional/east, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "xHV" = ( -/obj/effect/turf_decal/siding/blue, -/obj/effect/turf_decal/siding/blue{ +/obj/effect/landmark/navigate_destination/hop, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/blue/corner{ dir = 1 }, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - location = "Head of Personnel" +/obj/effect/turf_decal/siding/blue/corner{ + dir = 8 }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) +"xId" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/wood, +/area/station/maintenance/starboard) "xIe" = ( /obj/structure/lattice, /obj/effect/spawner/random/structure/grille, /turf/open/space/openspace, /area/space/nearstation) +"xIh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/clock/directional/east, +/obj/structure/chair/plastic{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) +"xIk" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/bot_red, +/obj/structure/rack, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "xIl" = ( /obj/effect/turf_decal/siding/purple{ dir = 4 @@ -82132,46 +87695,54 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"xIJ" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 +"xIs" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/obj/structure/chair/office, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "xIN" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, /turf/open/openspace, /area/station/maintenance/port/fore) -"xIV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"xIT" = ( +/obj/machinery/door/airlock/maintenance, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/contraband/rebels_unite/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, /turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/maintenance/department/crew_quarters/dorms) +"xIW" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/turf/open/floor/engine/hull, +/area/station/solars/starboard/fore) "xJo" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/station/maintenance/port) "xJq" = ( -/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."; - dir = 1; - name = "decommissioned sleeper" - }, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"xJt" = ( -/obj/structure/lattice/catwalk, -/obj/item/clothing/accessory/armband/cargo{ - pixel_x = 8; - pixel_y = 10 +/obj/machinery/vending/cigarette, +/turf/open/floor/wood/large, +/area/station/medical/break_room) +"xJs" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/machinery/light/warm/directional/north, +/obj/effect/turf_decal/tile/dark_green/half/contrasted{ + dir = 1 }, -/obj/structure/sign/poster/contraband/rebels_unite/directional/north, -/turf/open/openspace, -/area/station/maintenance/starboard/aft) +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "xJH" = ( /obj/machinery/status_display/ai/directional/east, /obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ @@ -82187,20 +87758,32 @@ pixel_y = 5 }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"xJI" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 +/area/station/ai/satellite/interior) +"xJJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/flag/tizira/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"xJL" = ( +/obj/item/clothing/head/cone{ + pixel_x = 5; + pixel_y = 10 }, /turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/area/station/maintenance/starboard) "xJV" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"xJZ" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/eighties, +/area/station/maintenance/department/crew_quarters/dorms) "xKb" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -82209,27 +87792,41 @@ /turf/open/floor/iron/dark/textured, /area/station/construction/mining/aux_base) "xKc" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 +/obj/machinery/light/directional/east, +/obj/machinery/status_display/supply{ + pixel_x = 32 }, +/obj/structure/railing, /obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, /obj/structure/disposalpipe/trunk{ dir = 8 }, +/obj/effect/turf_decal/bot, +/obj/machinery/door/firedoor/border_only, /turf/open/floor/iron, /area/station/cargo/storage) "xKg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue/opposingcorners{ +/obj/effect/turf_decal/trimline/blue/warning, +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/line{ dir = 1 }, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/dark/smooth_half{ + dir = 4 + }, /area/station/medical/cryo) "xKj" = ( /obj/structure/railing/corner/end, /turf/open/openspace, /area/station/maintenance/port/aft) +"xKo" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 10 + }, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "xKr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/warm/dim/directional/east, @@ -82238,26 +87835,41 @@ }, /turf/open/floor/glass, /area/station/science/zoo) +"xKs" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 5 + }, +/obj/item/pen{ + pixel_y = 5 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/engineering) "xKx" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, /turf/open/floor/iron, /area/station/engineering/lobby) -"xKz" = ( -/obj/structure/rack, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/spawner/random/techstorage/engineering_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "xKB" = ( /obj/structure/rack, /obj/item/toy/basketball, +/obj/item/poster/random_official, /turf/open/floor/plating, /area/station/maintenance/port) "xKG" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, /area/station/medical/virology) +"xKJ" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/directional/north, +/turf/open/openspace, +/area/station/commons/fitness/recreation) "xKQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -82266,6 +87878,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) +"xKS" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/glass/plasma, +/area/station/engineering/atmos/upper) "xLf" = ( /obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, /obj/structure/chair/sofa/middle/brown{ @@ -82273,17 +87889,11 @@ }, /turf/open/floor/glass/reinforced, /area/station/service/library) -"xLj" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Telecomms - Storage" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) +"xLl" = ( +/obj/structure/lattice/catwalk, +/obj/effect/landmark/firealarm_sanity, +/turf/open/openspace, +/area/station/commons/dorms) "xLy" = ( /obj/structure/cable, /obj/effect/landmark/secequipment, @@ -82300,13 +87910,6 @@ /obj/structure/sign/poster/abductor/ayy_cops, /turf/closed/wall, /area/station/maintenance/port) -"xLF" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) "xLQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -82328,31 +87931,46 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/plating, /area/station/security/execution/education) +"xMf" = ( +/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/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"xMn" = ( +/obj/structure/table, +/obj/machinery/computer/arcade/orion_trail{ + desc = "For gamers only. Casuals need not apply."; + icon_screen = "library"; + icon_state = "oldcomp"; + name = "Gamer Computer" + }, +/turf/open/floor/engine/hull/air, +/area/station/maintenance/starboard/upper) "xMq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/food/pizzaslice/moldy/bacteria, -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"xMv" = ( -/obj/structure/lattice, -/obj/structure/disposalpipe/segment{ - dir = 10 +/obj/structure/chair/sofa/corp/left{ + dir = 8 }, -/turf/open/openspace, -/area/station/maintenance/starboard/lesser) +/obj/effect/landmark/start/medical_doctor, +/obj/effect/turf_decal/siding/dark_blue, +/obj/structure/sign/poster/official/moth_epi/directional/east, +/turf/open/floor/carpet/blue, +/area/station/medical/break_room) +"xMu" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "xMz" = ( -/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, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, /obj/structure/cable, -/obj/effect/landmark/start/depsec/medical, -/obj/machinery/firealarm/directional/west{ - pixel_y = -28 - }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) "xME" = ( @@ -82364,29 +87982,44 @@ }, /turf/open/floor/iron/textured_large, /area/station/medical/virology) +"xMJ" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) "xML" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light/directional/west, /turf/open/floor/wood, /area/station/hallway/primary/central) -"xMS" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ +"xMT" = ( +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/textured_large, +/area/station/medical/virology) "xMV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/yellow/full, /obj/effect/mapping_helpers/airlock/access/all/medical/pharmacy, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - name = "Chemistry Storage" +/obj/machinery/door/airlock/medical{ + name = "Chemical Storage" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock_note_placer{ + note_info = "Looking for your chem factory area? Go upstairs and you will find it above the Pharmacy. You also have a new Controlled Hazard Chamber"; + note_name = "Projects" }, /turf/open/floor/iron/dark/smooth_large, -/area/station/medical/medbay/central) +/area/station/medical/chem_storage) "xMY" = ( /obj/machinery/holopad, /obj/machinery/navbeacon{ @@ -82404,15 +88037,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/smooth_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"xNe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/area/station/ai/satellite/foyer) +"xNk" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 1 + }, /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "xNn" = ( /obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ dir = 4 @@ -82437,16 +88075,21 @@ /turf/open/floor/wood, /area/station/security/courtroom) "xNB" = ( -/obj/structure/table/wood, /obj/structure/sign/painting/library{ persistence_id = "captain"; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, -/obj/machinery/fax{ - fax_name = "Captain's Office"; - name = "Captain's Fax Machine" +/obj/structure/table/wood, +/obj/item/storage/briefcase/secure{ + pixel_x = 4; + pixel_y = 8 }, -/turf/open/floor/wood, +/obj/item/paper_bin{ + pixel_x = -5; + pixel_y = 6 + }, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) "xNF" = ( /obj/structure/lattice/catwalk, @@ -82483,13 +88126,17 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_white, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xOh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron, -/area/station/maintenance/starboard/central) +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "CargowatchShutter"; + name = "Outside Shutter"; + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/command/heads_quarters/qm) "xOl" = ( /obj/item/restraints/handcuffs/fake, /obj/structure/table/wood, @@ -82542,24 +88189,32 @@ }, /turf/open/space/openspace, /area/space/nearstation) +"xOG" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"xOU" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/briefcase, +/obj/effect/spawner/random/bureaucracy/folder, +/turf/open/floor/wood/large, +/area/station/commons/dorms) "xOW" = ( /turf/open/floor/plating, /area/station/security/interrogation) -"xPg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"xPj" = ( -/obj/machinery/duct, -/obj/machinery/door/airlock/maintenance, +"xPy" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/sign/warning/electric_shock/directional/north, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/commons/toilet/restrooms) +/obj/machinery/light/small/red/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/engine_smes) "xPU" = ( /obj/structure/sign/poster/contraband/space_cube/directional/east, /turf/open/floor/plating, @@ -82570,13 +88225,16 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"xQB" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - co2 Cell"; - name = "atmospherics camera" - }, -/turf/open/floor/engine/co2, -/area/station/engineering/atmos/upper) +"xQg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/wood/large, +/area/station/commons/dorms) +"xQr" = ( +/obj/structure/lattice/catwalk, +/obj/effect/spawner/random/maintenance/two, +/turf/open/openspace, +/area/station/maintenance/aft/upper) "xQC" = ( /obj/machinery/camera/autoname/directional/north, /obj/structure/closet/crate/trashcart/filled, @@ -82591,8 +88249,18 @@ /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) +"xQJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/generic, +/obj/item/radio/intercom/directional/north, +/obj/structure/cable/multilayer/multiz, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/engineering/atmos/office) "xQK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -82613,32 +88281,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) -"xQU" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/modular_computer/preset/cargochat/engineering{ - dir = 1 - }, -/obj/machinery/requests_console/directional/west{ - name = "Engineering Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/wood, -/area/station/engineering/lobby) -"xQV" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/photocopier/prebuilt, -/turf/open/floor/wood, -/area/station/engineering/lobby) "xQW" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, /obj/machinery/light/directional/south, /obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/large, +/turf/open/floor/iron/edge, /area/station/hallway/primary/central) "xRg" = ( /obj/effect/decal/cleanable/dirt, @@ -82665,11 +88311,30 @@ /obj/item/storage/bag/plants, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden/abandoned) -"xRI" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "cargounload" +"xRp" = ( +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Access" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/command/general, +/obj/effect/mapping_helpers/airlock/access/any/command/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "transitlockdown" }, +/obj/effect/landmark/navigate_destination/minisat_access_tcomms_ai, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"xRD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"xRI" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 1 }, @@ -82679,23 +88344,17 @@ dir = 1 }, /obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/storage) -"xRJ" = ( -/obj/item/banner/cargo/mundane{ - pixel_y = 27 +/obj/structure/railing{ + dir = 8 }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "body"; - name = "body"; - pixel_y = 10 +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 }, -/obj/item/ammo_casing/spent{ - pixel_x = -8; - pixel_y = -4 +/obj/machinery/door/firedoor/border_only{ + dir = 8 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/turf/open/floor/iron, +/area/station/cargo/storage) "xRK" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line{ @@ -82712,20 +88371,27 @@ /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) "xRZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/greenglow, /obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"xSb" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 }, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/iron/white/textured_corner{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/station/medical/break_room) +"xSb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/surgery) +"xSc" = ( +/obj/machinery/door/poddoor/incinerator_atmos_aux, +/turf/open/floor/engine/airless, +/area/station/engineering/atmos/upper) "xSj" = ( /obj/structure/railing, /turf/open/floor/iron/stairs/medium{ @@ -82738,8 +88404,22 @@ dir = 8 }, /obj/effect/baseturf_helper/reinforced_plating/ceiling, -/turf/open/floor/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) +"xSq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/openspace, +/area/station/command/meeting_room/council) "xSv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -82752,10 +88432,27 @@ /obj/machinery/door/firedoor, /turf/open/floor/engine/hull/air, /area/station/hallway/primary/starboard) +"xSA" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/atmospherics/pipe/multiz/purple/visible{ + dir = 2; + name = "mix to recycle multi-deck adapter" + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) +"xSB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/cigarette, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "xSD" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron, /area/station/science/breakroom) +"xSL" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "xSO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -82778,7 +88475,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "xSS" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -82814,23 +88511,39 @@ /obj/effect/spawner/random/trash/crushed_can, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) +"xTq" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/blood/oil, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) +"xTs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "xTt" = ( -/obj/structure/table/wood, /obj/item/radio/intercom/directional/west{ freerange = 1; name = "Captain's Intercom"; pixel_x = 0; pixel_y = 25 }, -/obj/item/pinpointer/nuke{ - pixel_x = -7; +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; pixel_y = 5 }, +/obj/item/pen/fourcolor{ + pixel_x = -15; + pixel_y = 1 + }, /obj/item/hand_tele{ pixel_x = 13; - pixel_y = 15 + pixel_y = 5 }, -/turf/open/floor/wood, +/turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) "xTD" = ( /obj/structure/disposalpipe/segment{ @@ -82841,6 +88554,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"xTJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) "xTT" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/disposal/bin, @@ -82857,19 +88577,18 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/engine/hull, /area/space/nearstation) -"xTY" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "xUa" = ( /obj/effect/mapping_helpers/iannewyear, -/turf/open/floor/carpet, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) +"xUf" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central) "xUj" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -82911,7 +88630,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xUy" = ( /obj/machinery/light/directional/west, /obj/machinery/light_switch/directional/west, @@ -82937,7 +88656,7 @@ pixel_y = 2 }, /obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/wood, +/turf/open/floor/iron/dark, /area/station/command/gateway) "xUE" = ( /obj/effect/turf_decal/stripes/line{ @@ -82952,18 +88671,37 @@ "xUJ" = ( /turf/closed/wall, /area/station/medical/storage) -"xUV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/light/directional/east, +"xUR" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/west{ + network = list("ss13","medbay"); + c_tag = "Medbay - Lower Operating Room" + }, +/obj/structure/table/reinforced/rglass, +/obj/item/storage/box/masks{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/storage/box/bodybags{ + pixel_x = 6; + pixel_y = 2 + }, +/obj/item/storage/box/gloves{ + pixel_y = 10 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 8 + }, +/turf/open/floor/iron/white/textured_large, +/area/station/medical/medbay/central) +"xUT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, /turf/open/floor/iron, -/area/station/commons/dorms) -"xUW" = ( -/obj/structure/cable, -/obj/structure/sign/poster/contraband/fake_bombable/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/maintenance/starboard) "xVq" = ( /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, @@ -82987,7 +88725,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/aux_base, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -83009,13 +88747,12 @@ /obj/structure/sign/poster/official/obey/directional/north, /turf/open/floor/iron/dark, /area/station/maintenance/port) -"xVF" = ( -/obj/structure/lattice/catwalk, -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/openspace, -/area/station/engineering/break_room) +"xVG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/autoname/directional/north, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "xVJ" = ( /obj/machinery/firealarm/directional/south, /obj/structure/chair/stool/bar/directional/east, @@ -83024,21 +88761,17 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/lounge) -"xVL" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/white/textured_large, -/area/station/medical/medbay/central) "xVM" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"xVZ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/turf/open/openspace, -/area/station/maintenance/starboard/fore) +"xVP" = ( +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, +/obj/machinery/power/port_gen/pacman, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) "xWw" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -83058,12 +88791,16 @@ }, /turf/open/openspace, /area/station/maintenance/port/fore) -"xWy" = ( +"xWz" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/engineering/atmos) "xWK" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -83073,13 +88810,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"xWM" = ( -/obj/item/grapple_gun{ - pixel_x = 2; - pixel_y = 3 +"xWN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/cable, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "xWS" = ( /obj/effect/turf_decal/trimline/dark_blue/corner{ dir = 4 @@ -83087,7 +88828,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xWT" = ( /obj/structure/railing{ dir = 1 @@ -83112,6 +88853,28 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron/dark/smooth_half, /area/station/service/library) +"xXj" = ( +/obj/structure/cable, +/obj/machinery/door/window/brigdoor/left/directional/east{ + name = "Air Pump Room"; + req_access = list("atmospherics") + }, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) +"xXm" = ( +/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{ + dir = 4 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=7-Gateway"; + location = "6-Courtroom" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/catwalk_floor/iron, +/area/station/hallway/primary/central) "xXr" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/cobweb, @@ -83133,12 +88896,6 @@ dir = 8 }, /area/station/maintenance/hallway/abandoned_recreation) -"xXx" = ( -/obj/structure/railing{ - dir = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "xXy" = ( /obj/structure/railing{ dir = 1 @@ -83149,6 +88906,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"xXC" = ( +/obj/item/pickaxe{ + pixel_x = 4; + pixel_y = 12 + }, +/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, +/area/station/maintenance/starboard/central/upper) "xXH" = ( /obj/effect/turf_decal/siding/blue{ dir = 5 @@ -83165,6 +88932,18 @@ /obj/structure/broken_flooring/singular/always_floorplane/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"xXQ" = ( +/obj/structure/closet/secure_closet/atmospherics, +/turf/open/floor/glass/plasma, +/area/station/engineering/atmos/upper) +"xXR" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/upper) "xXU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -83180,7 +88959,7 @@ codes_txt = "patrol;next_patrol=10-Vault"; location = "9-Bridge" }, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "xXV" = ( /obj/structure/reflector/double{ @@ -83197,24 +88976,13 @@ /obj/item/kirbyplants/random, /turf/open/floor/wood, /area/station/security/detectives_office) -"xYa" = ( -/obj/structure/frame, -/obj/structure/sign/poster/contraband/shamblers_juice/directional/east, -/turf/open/floor/eighties, -/area/station/maintenance/starboard/fore) -"xYb" = ( -/obj/structure/cable/layer1, -/turf/open/floor/catwalk_floor, -/area/station/engineering/main) -"xYf" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/soda_cans/cola{ - pixel_x = -4; - pixel_y = 9 - }, -/obj/effect/spawner/random/entertainment/coin, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) +"xYc" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/engineering/atmos/upper) "xYh" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -83223,37 +88991,26 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/security/prison) -"xYi" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) "xYk" = ( -/obj/machinery/computer/monitor{ +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/dark_blue{ dir = 1 }, -/obj/machinery/airalarm/directional/south, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/command/bridge) +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/meeting_room/council) "xYm" = ( /obj/structure/railing/corner, /obj/effect/turf_decal/siding/thinplating/corner, /turf/open/floor/iron/dark/smooth_half, /area/station/service/library) "xYn" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -5; - pixel_y = 4 - }, -/obj/item/stamp/head/hop{ - pixel_x = 8; - pixel_y = 4 - }, /obj/structure/cable, -/turf/open/floor/carpet, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/carpet/green, /area/station/command/heads_quarters/hop) "xYy" = ( /obj/machinery/nuclearbomb/selfdestruct, @@ -83261,12 +89018,13 @@ /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/station/ai_monitored/command/nuke_storage) -"xYL" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/command/vault) +"xYC" = ( +/obj/machinery/shower/directional/south, +/obj/structure/sink/directional/east, +/obj/structure/mirror/directional/west, +/turf/open/floor/iron/freezer, +/area/station/commons/dorms) "xYS" = ( /obj/machinery/computer/operating{ dir = 1 @@ -83274,17 +89032,26 @@ /obj/effect/turf_decal/tile/purple/half, /turf/open/floor/iron/white/textured_half, /area/station/science/robotics) -"xZd" = ( -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "xZn" = ( /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/aft) "xZp" = ( -/obj/machinery/modular_computer/preset/research, -/turf/open/floor/carpet, -/area/station/command/bridge) +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 1 + }, +/obj/item/lighter{ + pixel_x = 7; + pixel_y = -5 + }, +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room/council) +"xZu" = ( +/obj/machinery/photocopier/prebuilt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/aft) "xZG" = ( /obj/structure/table/wood, /obj/item/pen/fourcolor{ @@ -83296,6 +89063,12 @@ }, /turf/open/floor/carpet, /area/station/service/chapel/office) +"xZM" = ( +/obj/effect/spawner/random/structure/chair_maintenance{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "xZP" = ( /obj/structure/table, /obj/item/wrench{ @@ -83311,12 +89084,12 @@ dir = 2 }, /obj/effect/mapping_helpers/mail_sorting/security/detectives_office, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) -"yav" = ( -/obj/structure/lattice/catwalk, -/turf/open/floor/engine/hull/air, -/area/station/maintenance/starboard/fore) +"yau" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/plating, +/area/station/engineering/atmos/upper) "yaw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -83329,11 +89102,19 @@ }, /turf/open/floor/wood/large, /area/station/hallway/secondary/service) +"yay" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/machinery/holopad, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "yaE" = ( /obj/effect/decal/cleanable/dirt, /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) +"yaI" = ( +/turf/closed/wall, +/area/station/hallway/primary/fore) "yaM" = ( /obj/machinery/vending/wardrobe/gene_wardrobe, /obj/structure/extinguisher_cabinet/directional/north, @@ -83358,27 +89139,6 @@ }, /turf/open/floor/plating, /area/station/security/execution/education) -"yaU" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/vending/medical, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/item/radio/intercom/directional/north, -/turf/open/openspace, -/area/station/medical/storage) -"ybh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/wood, -/obj/item/stamp/granted{ - pixel_x = -5; - pixel_y = 11 - }, -/obj/item/stamp/denied{ - pixel_x = 7 - }, -/turf/open/floor/wood, -/area/station/maintenance/starboard/aft) "ybF" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/trimline/green/filled/corner{ @@ -83399,6 +89159,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/space_hut) +"ybM" = ( +/obj/machinery/computer/atmos_control/oxygen_tank, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "ybO" = ( /obj/structure/rack, /obj/structure/window/reinforced/spawner/directional/north{ @@ -83413,8 +89180,12 @@ pixel_x = -4; pixel_y = 1 }, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/obj/machinery/door/window/right/directional/east{ + name = "Jetpack Storage"; + req_access = list("eva") + }, +/turf/open/floor/iron/dark/small, +/area/station/command/eva) "ybR" = ( /turf/open/floor/glass/reinforced, /area/station/construction/storage_wing) @@ -83436,6 +89207,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"yca" = ( +/obj/effect/turf_decal/trimline/blue/arrow_ccw{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/arrow_cw, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/lobby) "ycf" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -83465,23 +89243,34 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "ycm" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood/corner{ dir = 1 }, -/obj/machinery/portable_atmospherics/canister/anesthetic_mix, -/turf/open/openspace, -/area/station/medical/cryo) -"yco" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ +/obj/effect/turf_decal/siding/wood/corner{ dir = 4 }, -/obj/machinery/power/apc/auto_name/directional/east, -/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/command/heads_quarters/qm) +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/cmo) +"yco" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1; + pixel_y = -7 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/textured, +/area/station/cargo/storage) "yct" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83492,27 +89281,38 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"ycC" = ( -/obj/structure/table, -/obj/item/radio/intercom/directional/south{ - broadcasting = 1; - frequency = 1447; - name = "Private Channel" +"ycy" = ( +/obj/structure/closet/crate/secure/engineering{ + name = "Advanced Materials" }, -/obj/item/folder/blue{ - pixel_x = -13; - pixel_y = 5 +/obj/item/stack/sheet/plasteel, +/obj/item/stack/sheet/mineral/plasma{ + amount = 30 }, -/obj/item/folder/white{ - pixel_x = -6; - pixel_y = 2 +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" }, -/obj/item/pen/blue{ - pixel_x = -21; - pixel_y = 2 +/turf/open/floor/engine, +/area/station/engineering/supermatter/room/upper) +"ycC" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/item/kirbyplants/organic/plant19{ + pixel_x = -3; + pixel_y = 12 }, -/turf/open/floor/carpet, -/area/station/ai_monitored/turret_protected/ai_upload) +/turf/open/floor/iron/dark/smooth_large, +/area/station/ai/upload/chamber) +"ycK" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/textured_large, +/area/station/medical/virology) "ycM" = ( /obj/structure/lattice, /turf/open/floor/plating/airless, @@ -83525,10 +89325,6 @@ /obj/effect/landmark/firealarm_sanity, /turf/open/openspace, /area/station/hallway/primary/central) -"ydi" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/station/engineering/hallway) "ydo" = ( /obj/structure/railing/corner/end{ dir = 8 @@ -83540,21 +89336,6 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/station/maintenance/port) -"ydy" = ( -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 6 - }, -/turf/open/floor/engine/hull/reinforced, -/area/space/nearstation) -"ydH" = ( -/obj/effect/landmark/firealarm_sanity, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/fore) -"ydI" = ( -/obj/structure/fake_stairs/directional/south, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "ydN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/wood{ @@ -83573,6 +89354,11 @@ }, /turf/open/openspace, /area/station/construction/storage_wing) +"ydV" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/engine, +/area/station/engineering/atmos) "ydX" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -83584,43 +89370,53 @@ dir = 1 }, /turf/open/floor/iron/checker, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "yeg" = ( -/obj/structure/chair/office/light{ - dir = 1; - name = "RD's Chair"; - pixel_y = 3 +/obj/structure/table/wood, +/obj/item/radio/intercom, +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room/council) +"yel" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/obj/effect/decal/cleanable/blood/oil, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft/upper) +"yeo" = ( +/obj/structure/fireaxecabinet/directional/east, +/obj/machinery/airalarm/directional/north, +/obj/structure/table/reinforced/rglass, +/obj/item/radio/off{ + pixel_x = 3; + pixel_y = 5 }, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination/bridge, -/turf/open/floor/carpet, +/obj/item/assembly/signaler{ + pixel_x = -9; + pixel_y = 4 + }, +/turf/open/floor/iron/dark, /area/station/command/bridge) -"yem" = ( -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "yer" = ( /turf/open/openspace, /area/station/science/genetics) "yes" = ( -/obj/machinery/door/window/left/directional/east{ - name = "Captain's Desk"; - req_access = list("captain") - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"yeu" = ( -/obj/structure/table, -/obj/structure/bedsheetbin{ - pixel_y = 6 +/obj/machinery/door/window/right/directional/west{ + req_access = list("captain"); + name = "Captain's Desk" }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) +/obj/machinery/airalarm/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/station/command/heads_quarters/captain/private) "yeA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83638,21 +89434,15 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 5 }, -/obj/structure/table, -/obj/item/wrench, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, +/obj/structure/table/reinforced, +/obj/machinery/button/door/directional/west{ + id = "Rcommissaryshutter"; + name = "Right Shutter Control"; + pixel_x = 0 + }, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"yeH" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/item/clothing/glasses/welding{ - pixel_x = 6; - pixel_y = 7 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "yeJ" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -83673,12 +89463,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat_interior) -"yeT" = ( -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/water, -/area/station/maintenance/starboard/fore) +/area/station/ai/satellite/interior) "yfj" = ( /obj/structure/ladder, /turf/open/floor/plating, @@ -83686,23 +89471,57 @@ "yfm" = ( /turf/closed/wall, /area/station/science/explab) -"yfs" = ( -/obj/effect/spawner/random/maintenance, -/obj/effect/decal/cleanable/blood/oil, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +"yfq" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room/upper) "yfv" = ( -/obj/structure/table/wood, -/obj/item/binoculars{ - pixel_x = -5; - pixel_y = 6 +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/clothing/gloves/latex/nitrile, +/obj/item/wrench/medical, +/obj/structure/table/reinforced/rglass, +/obj/item/gun/syringe{ + desc = "The Holy Syringe Gun. Identical to the regular syringe gun. You have a feeling that you shouldn't touch this."; + name = "Holy Syringe Gun"; + pixel_x = -3; + pixel_y = 3 }, -/obj/item/clothing/glasses/hud/health{ - pixel_x = 3; - pixel_y = -1 +/obj/machinery/door/window/right/directional/west{ + name = "First Aid Supplies"; + req_access = list("medical") }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/cmo) +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/storage) +"yfx" = ( +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 1; + name = "Ports To Mix" + }, +/obj/effect/turf_decal/trimline/dark_green, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/upper) +"yfH" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/rnd_all, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"yfJ" = ( +/obj/machinery/firealarm/directional/south, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/iron, +/area/station/commons/dorms) "yfK" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -83710,28 +89529,46 @@ /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron, /area/station/science/lab) -"yfM" = ( +"yfS" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/south, /obj/structure/table, -/obj/item/gavelhammer{ - pixel_y = 3 +/obj/item/storage/toolbox/electrical{ + pixel_x = 1; + pixel_y = -1 }, -/obj/structure/cable, -/obj/machinery/light/small/directional/north, -/turf/open/floor/wood, -/area/station/security/courtroom) +/obj/item/storage/toolbox/electrical{ + pixel_y = 2 + }, +/obj/item/clothing/gloves/color/yellow{ + pixel_y = 6 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "yge" = ( /obj/effect/spawner/random/maintenance, /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) "ygn" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 +/obj/machinery/door/airlock/medical{ + name = "Primary Surgical Theatre" }, +/obj/effect/mapping_helpers/airlock/access/all/medical/surgery, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/full, +/obj/structure/disposalpipe/segment, /obj/structure/cable, -/turf/open/floor/iron/white/textured, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/textured_large, /area/station/medical/surgery) +"ygq" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/engine/hull/reinforced, +/area/station/ai/upload/chamber) "ygr" = ( /obj/structure/lattice/catwalk, /obj/structure/table, @@ -83755,6 +89592,12 @@ "ygD" = ( /turf/closed/wall, /area/station/medical/coldroom) +"ygK" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos) "ygM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -83762,7 +89605,7 @@ /obj/structure/disposalpipe/junction/flip{ dir = 1 }, -/turf/open/floor/iron/large, +/turf/open/floor/catwalk_floor/iron, /area/station/hallway/primary/central) "ygN" = ( /obj/structure/table, @@ -83771,18 +89614,21 @@ }, /turf/open/floor/iron, /area/station/science/breakroom) +"ygT" = ( +/obj/machinery/smartfridge/chemistry/preloaded, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "chemshutters"; + name = "Chemistry Shutters" + }, +/turf/open/floor/plating, +/area/station/medical/pharmacy) "ygW" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/two, /turf/open/floor/iron/checker, /area/station/maintenance/hallway/abandoned_recreation) -"yhf" = ( -/obj/structure/cable/layer1, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "yhq" = ( /obj/effect/turf_decal/caution, /obj/effect/turf_decal/stripes/line, @@ -83794,18 +89640,27 @@ /turf/open/floor/iron, /area/station/hallway/primary/port) "yhu" = ( -/obj/machinery/button/door/directional/south{ - id = "CargowatchShutter"; - name = "Outside Shutter Control" +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/space_heater, -/turf/open/floor/iron, -/area/station/maintenance/starboard/central) +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/qm) "yhx" = ( /obj/structure/musician/piano/unanchored, /turf/open/floor/plating, /area/station/maintenance/department/science/central) +"yhD" = ( +/obj/effect/turf_decal/trimline/white/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/station/maintenance/starboard) "yhJ" = ( /obj/structure/grille, /turf/open/space/basic, @@ -83815,11 +89670,6 @@ dir = 1 }, /area/station/service/library/private) -"yhN" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable/layer1, -/turf/open/floor/catwalk_floor, -/area/station/engineering/engine_smes) "yhO" = ( /obj/machinery/door/airlock/atmos/glass{ name = "Atmospherics Testing Room" @@ -83828,6 +89678,20 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) +"yhP" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/obj/effect/turf_decal/weather/snow, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/tlv_cold_room, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/sign/warning/cold_temp/directional/east, +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/medical/coldroom) "yhW" = ( /obj/structure/table/reinforced, /obj/item/screwdriver{ @@ -83836,6 +89700,24 @@ /obj/item/clothing/mask/gas, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"yhY" = ( +/obj/structure/table, +/obj/item/hfr_box/body/moderator_input{ + pixel_x = -8; + pixel_y = 8 + }, +/obj/item/hfr_box/body/waste_output{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/hfr_box/body/interface{ + pixel_x = 5 + }, +/obj/item/hfr_box/body/fuel_input{ + pixel_x = -10 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "yib" = ( /obj/effect/turf_decal/siding/dark{ dir = 1 @@ -83843,32 +89725,39 @@ /obj/structure/cable/layer3, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "yin" = ( /obj/structure/chair, /turf/open/floor/iron/dark/smooth_large, /area/station/security/interrogation) -"yiy" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"yiL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/showcase/machinery/cloning_pod{ - desc = "An old prototype cloning pod, permanently decommissioned following the incident."; - name = "decommissioned cloner" +"yiw" = ( +/obj/structure/chair/pew/left{ + dir = 4 }, -/turf/open/floor/iron/white, -/area/station/maintenance/starboard/lesser) +/obj/effect/landmark/start/hangover, +/turf/open/floor/carpet, +/area/station/maintenance/starboard) +"yiB" = ( +/obj/effect/spawner/random/trash/grille_or_waste, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) +"yiF" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Engineering Lobby"; + name = "Engineering Lobby Fax Machine" + }, +/turf/open/floor/wood/large, +/area/station/engineering/lobby) "yiP" = ( /obj/machinery/washing_machine, /turf/open/floor/iron/white/textured_half, -/area/station/ai_monitored/turret_protected/aisat_interior) -"yiW" = ( -/obj/structure/cable/multilayer/multiz, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) +/area/station/ai/satellite/interior) "yiY" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/item/wrench{ @@ -83887,30 +89776,34 @@ /turf/open/floor/iron/dark/textured_large, /area/station/security/prison/safe) "yjD" = ( -/obj/machinery/atmospherics/pipe/multiz/general/visible, +/obj/structure/table, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, -/obj/machinery/light/directional/east, -/obj/item/storage/box/beakers{ - pixel_x = -12; - pixel_y = 15 +/obj/item/paper_bin{ + pixel_y = 3; + pixel_x = 6 }, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) -"yjM" = ( -/obj/structure/sign/directions/supply{ - dir = 4; - pixel_x = 32; - pixel_y = 37 +/obj/item/pen{ + pixel_y = 8; + pixel_x = -6 }, -/obj/structure/sign/directions/engineering{ - dir = 4; - pixel_x = 32; - pixel_y = 27 +/obj/item/toy/figure/paramedic{ + pixel_x = -5; + pixel_y = -3 }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/office) +"yjM" = ( +/obj/structure/sign/directions/upload/directional/north{ + desc = "It stands for Up Le Dable"; + dir = 2; + name = "Button Indicator"; + pixel_y = 10 + }, +/turf/closed/wall, +/area/station/service/kitchen) "yjT" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ dir = 8 @@ -83919,12 +89812,19 @@ dir = 8 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "yjV" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/effect/landmark/event_spawn, /turf/open/floor/grass, /area/station/science/cytology) +"ykc" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "ykf" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -83953,15 +89853,32 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/art) +"ykx" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 2 + }, +/turf/closed/wall, +/area/station/maintenance/port) "ykz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/obj/machinery/holopad, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/arrows{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, /area/station/command/gateway) "ykG" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"ykK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/poster/contraband/rebels_unite/directional/west, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central/upper) "yla" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -83978,23 +89895,7 @@ name = "Minisat Monitor" }, /turf/open/floor/iron/white/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) -"yli" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"ylo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/gravity_generator) +/area/station/ai/satellite/interior) "ylu" = ( /obj/structure/closet/crate, /obj/effect/spawner/random/contraband/prison, @@ -84009,19 +89910,25 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/textured_large, /area/station/security/prison) -"yly" = ( -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/medbay/central) -"ylO" = ( -/turf/open/floor/glass, -/area/station/commons/fitness/recreation) -"yma" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +"ylN" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/conveyor{ + dir = 4; + id = "packageSort2" }, -/obj/structure/cable/layer1, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/obj/machinery/door/window/right/directional/south{ + req_access = list("shipping"); + name = "Chute Access" + }, +/obj/machinery/camera/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/sorting) +"yme" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore/upper) (1,1,1) = {" dcE @@ -101148,7 +107055,7 @@ bWY dcE dcE dcE -kpJ +qBy dcE dcE dcE @@ -101918,9 +107825,9 @@ bWY azt azt azt -azt -azt -azt +twz +twz +twz azt vNz azt @@ -102176,7 +108083,7 @@ azt vNz dcE dcE -azt +rNc dcE bWY bWY @@ -102433,7 +108340,7 @@ azt vNz dcE dcE -azt +twz dcE heR dcE @@ -102685,14 +108592,14 @@ bWY bWY xbF bWY -bWY +twz azt +twz bWY bWY -bWY -rNc -bWY -bWY +azt +twz +twz vNz azt dcE @@ -102945,7 +108852,7 @@ dcE vNz azt vNz -iFM +fVD nTA nxa crs @@ -103159,7 +109066,7 @@ tDx bHr xLX hRx -edN +kRR uHH wVf wVf @@ -103445,7 +109352,7 @@ bWY dcE dcE dcE -jJm +bWY dcE dcE dcE @@ -103456,10 +109363,10 @@ bWY bWY xbF bWY -bWY +twz azt -bWY -fVD +twz +xtS nTA jgu okc @@ -103702,7 +109609,7 @@ iWu iWu fWI iWu -kzG +bYT fWI iWu heR @@ -103959,7 +109866,7 @@ dLq dLq jPs heR -eYH +bWY dcE heR bYT @@ -104216,7 +110123,7 @@ dLq heR dcE dcE -eYH +bWY dcE dcE heR @@ -104473,7 +110380,7 @@ dcE dcE dcE dcE -eYH +bWY dcE dcE heR @@ -104730,7 +110637,7 @@ dLq heR dcE dcE -eYH +bWY dcE dcE iWu @@ -104987,7 +110894,7 @@ riD riD riD heR -eYH +bWY dcE dcE iWu @@ -105244,7 +111151,7 @@ jgR aEO riD riD -nXp +dLq dcE dcE gmt @@ -105501,7 +111408,7 @@ gjW wTk eoI riD -bHM +kxE dLq dcE dcE @@ -105753,12 +111660,12 @@ nJk rjd riD riD -alx +fYa riD riD riD riD -bDm +uKL oaa oaa dcE @@ -106009,14 +111916,14 @@ rjd ydo xJo riD -cJb -unK -awv -rPU -uJi -uJi -qnS -tlQ +mpW +tEv +sHr +nOV +wTk +wTk +tEv +wTk oaa oaa dcE @@ -106266,14 +112173,14 @@ mqt fyx riD riD -uJi +wTk wTk riD riD tEv twD wTk -tlQ +wTk tEv oaa heR @@ -106522,15 +112429,15 @@ oCE xJo riD riD -uJi -unK +wTk +tEv sPT riD wRj wTk wTk tEv -tlQ +wTk wTk oaa heR @@ -106779,7 +112686,7 @@ nFL riD riD gir -pQG +upp wTk cbx riD @@ -106787,7 +112694,7 @@ riD nCM fES juE -tlQ +wTk oaa oaa heR @@ -107036,7 +112943,7 @@ kUq aJV riD tOW -uJi +wTk wTk wTk qTy @@ -107044,7 +112951,7 @@ riD riD riD riD -bDm +uKL oaa heR heR @@ -107293,7 +113200,7 @@ eYP bsy riD mXW -uJi +wTk ifC tEv tEv @@ -107301,7 +113208,7 @@ pmI wbK riD kxE -crE +dLq heR dcE dcE @@ -107549,8 +113456,8 @@ dNR gAl uIG riD -riv -uJi +iBW +wTk wTk wTk wTk @@ -107558,7 +113465,7 @@ riD riD riD dLq -mRf +heR dcE dcE dcE @@ -107575,12 +113482,12 @@ mIJ pim jbS qpI -ygD -ygD +uIO +uIO eeH -ygD -ygD -lIr +uIO +uIO +uIO uYP bPC ecL @@ -107806,7 +113713,7 @@ kTw wNv riD riD -dEu +mXW wTk tEv okf @@ -107815,7 +113722,7 @@ riD nPY riD riD -nxv +tao heR heR slD @@ -107831,14 +113738,14 @@ rCa fcw gUh uIO -ygD -ygD +uIO +uIO gTW -rYd +pTp jrv jFG -ygD -lIr +uIO +uIO xXW iDq lIr @@ -108062,8 +113969,8 @@ iTI kTw wNv wPl -mpT -dEu +wNv +mXW tzi flg riD @@ -108072,7 +113979,7 @@ uwu cOm deC ckM -tEc +mCR ckM ckM ckM @@ -108086,16 +113993,16 @@ cdw uIO pUj jVY -hGu +pim dfK -rTD +cVe kBq -kyx -kyx +xej +nEr kyx qbY uVL -ygD +uIO bPC fqK lIr @@ -108278,7 +114185,7 @@ oLN vwl ilE chu -wNu +lUD sQY aHS pMT @@ -108320,7 +114227,7 @@ kTw riD riD flg -dEu +mXW uCG riD riD @@ -108344,12 +114251,12 @@ uIO uTy uYd kbB -ygD +uIO ceQ eKW gLQ -rYd -cVe +pTp +wKr xQI cVe qsD @@ -108585,7 +114492,7 @@ mRt pPl kUq kUq -ssO +uSn hyi cIE oid @@ -108600,16 +114507,16 @@ oSt uIO uIO jVY -mWX -ygD +nDe +uIO coI eKW -oGj +pTp bkD veT -xQI +uDp vqu -ygD +uIO fqK bPC lIr @@ -108842,8 +114749,8 @@ eTY cOm dHm dFG -hyi -lIp +lUg +qIQ ckM ckM ckM @@ -108857,16 +114764,16 @@ bfj bVW eTr jVY -qze -ygD -dOr -eKW +nDe +uIO +uVL +arG lXG -rYd -are +nuJ +cVe rYd opJ -ygD +uIO wuN bPC lIr @@ -109085,7 +114992,7 @@ riD riD riD riD -wPX +riD riD riD riD @@ -109114,16 +115021,16 @@ hfF kHZ uIO vhP -hGu -ygD -ygD +pim +nGq +uIO fNw fxS fxS wxk qmD -ygD -ygD +uIO +uIO rGK rGK lIr @@ -109342,7 +115249,7 @@ bmI wVL mTq sTv -arN +bOt qMr sTv hNC @@ -109360,8 +115267,8 @@ jHr ckM iVX ijh -wwj -wwj +xba +xba bZo ckM ckM @@ -109371,15 +115278,15 @@ wAT uIO uIO gHC -vGX +jYM gjB -ygD -ygD +uIO +uIO hhH izg vzN -ygD -ygD +uIO +uIO mwO rPw sZL @@ -109582,12 +115489,12 @@ fWY bNt aHO bNt -bNt -wqB +awD +wAx sRY xDM uKn -vzM +ruR tZz riD uJi @@ -109599,7 +115506,7 @@ lqn ykm bAL sTv -yfM +avj ojE sTv hTI @@ -109607,7 +115514,7 @@ riD mOW dEu wTk -wTk +jJd flg flg flg @@ -109617,11 +115524,11 @@ rzp cDs dAR lAN -fxc +ldL lAN -goI -rUf -oNb +fYH +etQ +lja ybF njH njH @@ -109631,11 +115538,11 @@ fZG epk sGQ qpI -ygD -ygD -ygD +uIO +uIO +uIO dWi -ygD +uIO oQV hCk lIi @@ -109844,7 +115751,7 @@ ssg ubo bNt gBF -dMR +vId pTT lmB uJi @@ -109856,17 +115763,17 @@ sTv ait sTv sTv -teZ +sTv dNA sTv uga riD gZY dEu -uJi -uJi -uJi -uJi +wTk +wTk +wTk +wTk ayF kUq iKx @@ -109874,11 +115781,11 @@ rzp ckM tKx oiR -iea -pHC +xba +uNu dos ckM -npG +aWE cMq uZV nKn @@ -110101,7 +116008,7 @@ gfc bNt bNt fhO -dMR +vId xmA riD riD @@ -110113,17 +116020,17 @@ sTv qAJ aZC kzi -ers +pMu izl ahD wie riD riD -qgD +ihn riD osU flg -uJi +wTk nBu kUq fJx @@ -110135,7 +116042,7 @@ lqd jDe ygB ygB -vVD +jAg jgW qaL nKn @@ -110356,9 +116263,9 @@ nuw ssg teC bNt -xrM +iJX bOC -dMR +vId jUt sTv aVb @@ -110370,17 +116277,17 @@ sTv qdk ksO aPq -cLP +nCT jFo nLC lQd riD fLX -pSF +qIL tVl srD flg -uJi +wTk xKB kUq gga @@ -110392,7 +116299,7 @@ wix cDs ygB aWo -rIZ +ycK pOD kUq kUq @@ -110584,9 +116491,9 @@ rqR pvg anm sES -cCA +oUL crW -veS +bFx ayR gPW acl @@ -110613,9 +116520,9 @@ wEX gBE icO bNt -uOh +tiG jUu -dMR +vId hDT nDA aLJ @@ -110634,10 +116541,10 @@ fZc jKZ xCv bFe -okf +pyA srD flg -uJi +tZx riD kUq kUq @@ -110646,10 +116553,10 @@ kPZ nIW toh als -hET -hET -fAB -pHd +cjW +cjW +eeE +vFE kUq kUq xNK @@ -110875,7 +116782,7 @@ gfo dMR wMc wFX -aLJ +nnf aIb ryJ uVN @@ -110889,12 +116796,12 @@ dFZ uvq xor riD -jJd +rPE bFe -pqQ -qDn -uJi -uJi +wQt +cxs +wTk +nVV riD cTJ kUq @@ -110902,18 +116809,18 @@ kUq xwK lUn oFg -bBy +hIE cPq -bBy +xMT pOD kUq kUq nyb wTk wTk -riD -ycg +hqz ycg +qzP ycg lIr dfL @@ -111089,7 +116996,7 @@ gIw eCD qPX tci -xBO +uOO xZG qPX lrp @@ -111099,7 +117006,7 @@ rqR xxZ lFK lFK -bRv +wvM bxT wIa gPW @@ -111145,32 +117052,32 @@ kpC dFZ nIA akE -riD -aDh -bFe -rPE -srD +fbC +fbC +sQs +fbC +voz jDx -ddx ovx -tRJ -dWj +ovx +eNb +wES +kUq kUq kUq -aDY kUq vsP kUq -rea +ucc kUq kUq wTk wTk -wTk +eAH nCc -riD -ieD -ieD +hqz +rlB +csW ieD lIr lIr @@ -111402,32 +117309,32 @@ rrj mDF mDF mDF -riD +fbC fik -bFe +iEL hHs -riD +lQc bvH riD riD -wTk -mXW -gom -uMy -ciS -aZP -uJi -dXD -uJi +uEl uJi uJi uJi uJi uJi uJi -riD -bit -spl +for +wir +jNe +onB +jNe +jNe +jNe +jNe +pFS +vXB +mpp spl dmV biZ @@ -111621,7 +117528,7 @@ gPW egU gPW gPW -hRX +yjM neF lAW pbk @@ -111659,35 +117566,35 @@ dkO iFR iFR sfp -riD -riD +fbC +dmM whs -riD -riD +rNU +vSJ lVs riD cSy eNb -sAG +uJi +riD +riD +riD +riD +riD +riD +riD riD -pkc -psQ riD riD riD riD riD -oxp riD -fbK -eAH -lzP -lCO ibJ hSu tNd lIr -bPC +oRi sTT rtf biG @@ -111697,12 +117604,12 @@ ekQ jii mHQ mHQ -jii -jii -fHg -jii -jii -jii +hgW +hgW +dri +hgW +hgW +hgW hgW lIr lVM @@ -111925,26 +117832,26 @@ hoP riD riD riD -nen -riD +bzd riD +oTS mDX -ccN -ccN +aKG +xUR ghR sCA fFm ctE lUI -riD -riD +uKb +oTq bEU -riD +ccN ruJ -iVi -pWF +hSu +pYi lIr -bPC +bDz iBK idd voX @@ -111952,7 +117859,7 @@ kWO eqV wPV wPV -tBa +gzJ wPV lmV eOG @@ -112177,16 +118084,16 @@ fbC cRL hnH aDm -ceV +vYs nSu fbC vdP -mYe -lIC +fIS +ptM xrX rQU eRT -ccN +wbJ fRd pAU rTp @@ -112194,25 +118101,25 @@ iGH nLU rDc jWF -riD -riD -riD -nfR +wxE +amW +ccN +pEO tCO -nfR +pEO lIr abE lIr lIr lIr -pcQ +wYX lIr wPV nFO wld -hlJ -itV -fUd +iTR +oDu +tQR qVs qQb wPV @@ -112411,7 +118318,7 @@ dBm dBm dBm cHI -kFP +sLt iGB kBi dkz @@ -112427,23 +118334,23 @@ bJJ iyv iyv kpC -iyv +seD iyv aYR fbC jVQ -sKC +hnH qfh -eeA +vYs gFt fbC vdP mYe -uCE -kDa -xVL +ptM +fGU +vKA afg -viV +iFy bPH rZP fch @@ -112451,12 +118358,12 @@ buk pyf cDB urk -nfR +lzW gZj oZn -hQa +xeM gDs -nfR +sny ttr aYm oZD @@ -112469,7 +118376,7 @@ wPV aIP tPr ebj -euN +bXl kUr mnG aPQ @@ -112680,40 +118587,40 @@ jOE jOE aUn fYS -gjU -lIM +lRY lIM -peF lIM +nDA +hiA lIM -hWw +nDA fbC nWD frB cHZ -eeA +vYs wlM fbC -pEO -pEO +tqq +vJI dUw -dUw -lIC -afg +xeM +kWp +acS cxD -bPH +fPt wPf rhx jYJ ygn aeq ajU -nfR -btJ -gWp -uPn -duq -nfR +qIc +gZj +oZn +xeM +fYF +sny ttC hAM dBy @@ -112726,11 +118633,11 @@ wPV eug uXU sIp -wUm -dcv -wRi -mPV -mHQ +eWS +rUq +jSK +wtD +jii fdl dXA lVM @@ -112916,61 +118823,61 @@ gtZ mBb nPW akU -fLr -fLr +itA +itA rfU -fLr +itA dNV nrP pJn ozK -fLr -fLr +itA +itA oLS sJQ aSD sJQ pwz -fLr -ckZ +itA +itA rfU -fLr +itA rHo -cuY -cuY -fLr -fLr -rnd -fLr -fLr -lkC -fbC +wdt +wdt +itA +itA +itA +pkx +itA +tLA +rTe lPn qMz ugj eBQ -wlM -fbC -sbT -pEO -pEO -pEO -lIC -afg +tON +gpT +xeM +xeM +hrX +xeM +kWp +hTy aMK wYH mfs qWy rDN -uvu +nLU xSb hSz -nfR +wxE taG -rZv -nFD +oZn +xeM tuV -nfR +sny vWI pPn rah @@ -113150,7 +119057,7 @@ wRp vwb pES gzs -oLO +lOD gPW ndl vxh @@ -113170,8 +119077,8 @@ qpP qNw qNw mDZ -jrz -fyz +idO +tau bmD fUb fUb @@ -113199,42 +119106,42 @@ vYe fcn fcn sXj -cXw +xXm qeZ -rEt +jDx obQ hDd aoz -dGm fbC fbC -hRa -kQh -jrf +fbC +fkD +fkD pEO -lIC +leK +kWp asY -ccN +wqq cqe xCz uQv cCt -nNZ +ctE tYC qdd -nfR +uSP wER -juc -vAy -qpw -nfR +oZn +xeM +fYF +kLI wgx hzG hhb kqv kqv clb -kqv +clb kqv fcK fcK @@ -113410,92 +119317,92 @@ iUx gPW gPW utq -nyq +cTk wQS svW mHJ -rUC +qGn fFe uPu fEc byY lNg byY -byY +fkp byY oSI hGP fzV xrl -fLr +dlx pzy -gxP -fLr -fLr -fLr -fLr -fLr -fLr +qhz +qNe +qNe +qNe +qNe +qNe +qNe cuY -fLr +qNe fom -fLr -fLr -fLr +qNe +qNe +qNe iwu -aZs +fpw mNY -fLr -fLr -fLr +keq +keq +iBM ulZ -fLr -fLr +qNe +qNe qNe fHW -pVy -fLr -aKc +jeh +qNe +aVN iLm -fLr -fbC -tkX -tkX -tkX -fbC -fbC +fDd +hSk +hSk +hSk +hSk +hSk +pSd jDD pZQ gie mKs -pEO -lIC -afg -ccN -ccN +xeM +kWp +rQR +jiL +oNB jiL emn vqv -ppa -tSo +xFh ccN -nfR -nfR -jzY -gEc -nfR -nfR -pEO +ccN +ccN +ccN +ccN +ibM +gFn +sny +sny xMV -pEO +sny kqv dcE dcE dcE dcE dcE -dcE sWJ +ahx cSN fwF hbi @@ -113684,9 +119591,9 @@ aEG kEn gnA dJV -fLr +idO pzy -fLr +vXt jGw bpl oGG @@ -113700,11 +119607,11 @@ eLU pKd pKd eLU -sle +eLU eLU jKF jKF -eLU +sle eLU vAs qiH @@ -113712,48 +119619,48 @@ tHs gUQ qiH qiH -fLr +idO iLm -fDd -hSk -hSk -hSk -hSk +vXt +qKV +oDq +wTE +gvR hSk qDh tLU kIt msF iKH -fkD -hNj +xeM +gNp iQA -fNa -ccN -ccN -viV +vJI +vJI +vJI +pkh xsD viV -ccN -ccN +iKa +uNT pMm -jIF -aXH xeM xeM +xeM +siR mJg gpx gPu -xeM +xqR fQp fQp fQp +dsx +dsx fQp fQp fQp -dcE -sWJ -tDP +cSN wiv bYn bYn @@ -113941,26 +119848,26 @@ lDE lDE lDE lDE -fLr +idO pzy -fLr +vXt fOe -lPw +saq qyy qTG cVs -wxq +vuO aZE eIm qae eLU -pdf -pdf +hVC +iiO oST bRW wbH -pdf -pdf +jRH +jRH pdf eLU ucp @@ -113969,9 +119876,9 @@ dnH khi chO qiH -fLr +idO iLm -fLr +vXt qKV cpG nng @@ -113979,36 +119886,36 @@ xMz eJb myh oJv -kWv -qUW -qUW -uec -eZE -eZE -qUW -qUW -bHj -qUW -eZE -qUW +pkn +pkn +mQK +ene +eFk +ene +gPC +gPC +gPC +gPC +ped +uOL oOS -qUW -qUW +aJR +pTV eZE +gPC +gPC +ovh +ljq +vkk qUW -qUW -qUW -qUW -qUW -qUW -xeM +izk fQp -qIp +vcY sKF hNb qIp -fQp -fQp +uXx +vsW fQp kqv kqv @@ -114173,9 +120080,9 @@ xvg ixF vsv qXQ -tgV +lZt glz -tLl +lum ixF gPW xKQ @@ -114186,7 +120093,7 @@ wvx fPb vRM haB -uPu +inD hgL gNr gNr @@ -114200,8 +120107,8 @@ pRw lDE cKg vMU -fLr -jwI +vXt +fOe dwf nDS saq @@ -114213,7 +120120,7 @@ ecw eLU dzx pog -dzx +cUl hqf aoQ bvv @@ -114226,42 +120133,42 @@ nrg wLc pJG tdW -fLr +idO iLm -fLr +vXt qKV jGh mFR bIZ qKV -xqL +msF lQV -qNy -oXE -oXE +msF +eBD +mKs tYN sSF cyM xvA -oXE -oXE -oXE -tgE -dZd +kZs +rfL +esR +xeM +viV oXE vsL -xeM -fYF -nSk +wJV pdO pdO -wlq -wlq -jYI +ygT +slK pdO +wlq +eXz +nKs fQp -aIU -ccr +pLG +mvq ccr jfi mvq @@ -114457,23 +120364,23 @@ iTM eEV gSG mEk -fLr -fOe -qTG +vXt +dWp +wCP xHV -dwf +cnL ehZ vuO kyJ eaj xat eLU -hwR -hwR -hwR +jrS +vMN +wWi nrw -hwR -hwR +dHq +jYI chQ hwR eLU @@ -114485,31 +120392,31 @@ bcH vAs dQP iLm -fLr +agu hSk qKV iCd hSk hSk sfj -xeM +gci tbu -xeM +fMx lqZ -irh +phw +fMx irh uFM -pem +nbE uFM irh irh -suP -cmY +irh rEL usD gWO -jTt -pdO +mJg +fEQ snE ksX mCM @@ -114518,9 +120425,9 @@ wQc ugq fQp bZC -vSW -vSW -vyV +mvq +mvq +mvq tPC ycC fQp @@ -114683,9 +120590,9 @@ dcE dcE dcE dcE -heR +vVH ixF -iZK +avJ myb xbL jHV @@ -114704,27 +120611,27 @@ fvk kHv aUU gNr -eAT -llv +wlI +jJE lDE uKN -lio +wyv vcR qkF eVl hZD iLm -fLr -dWp -okC +vXt +vuO +vuO ams -uzg +wWV wWV vuO kRk kWR hnF -psk +eLU fSl xUD vQR @@ -114742,40 +120649,40 @@ vAs tNV crk fDc -crk -pEO -rsU -xeM +fNB +bHV +oIA +mDr fHf -rde -fYF +sgT +qOG pMi -tbu +yca oJe gND -irh +qKP jcy -tBh +irh oiH gXT gZT -irh +knf qFa -qFj -hXT +irh +vky uvh hXT -xsC +xuz bRm eMd -lqp -tRY +nFz +nFz tRY wXL uEZ fQp kSB -vSW +mvq vSW vyV tPC @@ -114961,8 +120868,8 @@ bfw kHv uPu ojU -llv -llv +jJE +jJE lDE tjg pJD @@ -114971,12 +120878,12 @@ oHw eVl wUb vMU -fLr -vuO +jMi vuO +bBZ pPt -hRd -vuO +hKy +inh vuO vOy kZo @@ -114999,26 +120906,26 @@ mrj ddz ckZ iLm -fLr -pEO -aVL +vXt +bHV +rsU sGy -xeM +dMh ujD -fYF -xeM +uya +gzi klc bxa sZn -irh +qKy jeq -lyz +irh vka kwh uGt -uFM +kdk niy -iyL +uFM xaH dJE ioq @@ -115206,7 +121113,7 @@ jMr nJl pPf gqp -nmO +fWy gPW dIW rYV @@ -115218,18 +121125,18 @@ bfw tbw scE gNr -edl -llv +aqP +jJE lDE hdX hni uIt cfp lDE -req +osf vMU -jMi -vuO +vXt +rBE ugN tGb xYn @@ -115240,10 +121147,10 @@ kWR iWk vHo vHo -iis -iis -iis -iis +aWV +aWV +aWV +aWV aWV heR heR @@ -115253,33 +121160,33 @@ qeX qeX cqj qeX -cmp -cnL +vNo +idO iLm -fLr -bES -fYF +vXt +prV +qXc jEG mqQ -rde -fYF +eyP +sWl rHB -ivM -hXT -xsC -irh +yca +eoj +biO +fwv rFk eKh eME xKg kxL -uFM +wqk bWI glH lEe -uvh -hXT +uHd xsC +mJg vBN pgN rRy @@ -115292,7 +121199,7 @@ idq hDg hDg ewA -hDg +xyn hDg fQp aWH @@ -115475,8 +121382,8 @@ bfw kHv woT gNr -jYE -llv +wlx +agq lDE lDE hAm @@ -115485,8 +121392,8 @@ lDE lDE kTW vMU -fLr -hRd +vXt +rBE bUO aqo fVx @@ -115495,51 +121402,51 @@ inT whZ bqR ecw -fwP +omw sjC -iis +aWV dNc rPQ qCe aWV dcE gmE -gmE +pxK bTU tBo tBo tBo -tBo +ipi deJ -vNo -gHa -mBb -jDi -iyn -oXE -oXE -tYN +nbU +iLm +vXt +prV +djc +mAY +qOG +kaF iyn dGy lXM -hXT +oJe fdb +ggR +jdH irh -jeq -bLK elP hrm gob -uFM +xig ocq -tMg -lEe +uFM +sgN vmJ rYF -rMv +eVr tYE -oYy -cfi +rSj +rSj rSj tzS taS @@ -115547,7 +121454,7 @@ rxx fQp fqn hDg -mTp +lCY oAz toj hDg @@ -115720,7 +121627,7 @@ rpU rpU pfu gqp -pUr +jzD gPW nvR aXe @@ -115732,17 +121639,17 @@ bfw kHv izF gNr -tfr -llv -llv -llv -ayD -lkj -lkj -caF -ckZ +ruA +pkw +jJE +jJE +wHz +jJE +jJE +fQL +idO vMU -fLr +vXt hRd jCt xSk @@ -115754,7 +121661,7 @@ ojx ecw fwP sjC -iis +aWV mYf qSv sSY @@ -115762,39 +121669,39 @@ lll dcE gmE rVE -eRs tbZ -uLt cZE +uLt bnl +rAL mAr ojj -oNM -fLr -fkD -uNV -kVu +iLm +vXt +bHV +bHV +prV cRb -rde +cav prV -dwP bHV -jxx +bHV +fMx lXX -irh +lgK yjD -qep +irh afl kDP ofr -irh +htj khC -jcj +irh nKB ccH fDk -xDs pdO +azo pmL oTO nzj @@ -115996,10 +121903,10 @@ weF qqz bOk bOk -bOk +uTJ wrI -fjt -xDR +vMU +vXt vuO ilg wmy @@ -116009,63 +121916,63 @@ vzB gDG lWc ecw -lll -lll -iis +uoF +uoF +aWV wTU vCW jkn -lll +gwk heR gmE mcX -eRs iHB eQA eLc jzP +jmG hXc -nYZ -uFo +ojj +iLm lkC fBQ -fkD -fkD -fkD -pEO -pEO -rde -rde -rde -pEO -irh +rJL +xca +dwh +hgN +rWZ +atZ +fXP +fMx +aZG +fMx +aZG irh jIf jIf -jIf irh irh -pEO -pEO -rde +irh +irh +ioo klI ioo -pEO pdO -pQV +pdO +pLV pLV pdO -uKM +iia uKM pdO -pdO -fDg +fXP +fQp hDg hDg pYI hDg hDg -nZF +eOh aWH xsh nZF @@ -116254,73 +122161,73 @@ kCP ofi rHD hAi -fLr -fjt +idO +vMU tWt qQd qQd -mmS +qQd qQd qQd qQd jFU bRx ecw -lll +uoF eYe mqm duE ibO ibO -lll +uzg dcE gmE mbY -eRs dmL +xUf uGx -jyd lVt +eRs pGV -kzf -uFo -gxP +ojj +iLm +byR gTL pJS -pJS -vgD +eDq +hOG qkm pJS pJS -pJS -pJS +ghu +pLL pJS ghu -uxY pJS +uDa pJS pJS ghu -czJ +pJS vMv +pLL pJS +siA pJS -hOG -iev hCs ghu -vgD pJS pJS +reg pJS pJS wWy xZn pJS bMo -ghu +ctm iev -xZn +jkJ eMi nZF aWH @@ -116511,14 +122418,14 @@ qWj qST qST ipt -bsH +qUD xXU rnd mVm dtx iqC qHB -dtx +bdW nvX sJy rHq @@ -116527,9 +122434,9 @@ eLl lzk lzk sAm -wtz +vnh iXw -lll +uzg heR gmE czp @@ -116540,8 +122447,8 @@ bBK eRd vnz hJA -hnb -vYe +pfR +bic wAQ iFU iFU @@ -116746,7 +122653,7 @@ izW iXP iXP iXP -vTV +nQE xCq jNL eia @@ -116764,14 +122671,14 @@ fJz bxK fJz fWt -fJz -iIi -aFP +uYY +kuw +pjj jAT -fLr +idO fjt -jOi -qQd +vXt +iRC qQd qQd qQd @@ -116781,7 +122688,7 @@ fDb eIm tXS uoF -fkp +eYe lKk cSO jMo @@ -116796,25 +122703,25 @@ kkd egp scJ gNL -dXh -vlK +idO +aZs fLr gTL pJS pJS -bkv pJS +hOG pJS pJS bLu +xgT pJS pJS pJS pJS -vhv -pJS pJS pJS +xgT pJS bSD pJS @@ -116832,9 +122739,9 @@ pJS pJS pJS bMo -pJS -pJS -pJS +vnV +vnV +vnV eMi eGc nZF @@ -117000,14 +122907,14 @@ iFB iFB vyA jZs -cpQ +iXP iXP rpU -sjq +iMX mIa jMr -dCm -dCm +fMH +fMH vCE uka uka @@ -117020,14 +122927,14 @@ luY gIE ykn luY -dCm -dCm -voV -dCm -dCm -jrV +dTL +qTT +dTL +sWH +dTL +wrI fjt -fLr +vXt drX qye rYu @@ -117037,9 +122944,9 @@ pZX gDG lkt tXS -lll -lll -iis +uoF +uoF +aWV yes xvw tRt @@ -117047,21 +122954,21 @@ lll heR gmE xef -vFZ knq kCN +pZv hoq cER edz -vnV -vlK +idO +aZs lkC fXP iXg +jli wGD -tep -wGD -wGD +uAi +jli jVu fXP xEm @@ -117089,7 +122996,7 @@ pHl pHl wgS uqo -yjM +pJS pJS pJS uqo @@ -117260,10 +123167,10 @@ nvv rsb rsb rsb -gnV +hOJ rpU pPk -dCm +fMH dcE dcE dcE @@ -117277,41 +123184,41 @@ dKv xWY iAu bGJ -dCm -eOB -nIq -jUS -voV -fLr +dTL +prZ +rCh +cMj +sWH +idO fjt pKT drX nol -qKB -qKB +oNM +vkQ wKi pZX qhq eIm wFP -fwP +omw sjC -iis -aNb +aWV +jwI gzt jFp lll dcE gmE eqa -vFZ jEw siZ siZ jEw +vTB juH -ibo -wCP +idO +aZs jMi tDY tDY @@ -117345,10 +123252,10 @@ cPY tNP tNP fAl -jkr -ruK -szy -djL +bCD +pJS +pJS +pJS pQc pQU nZF @@ -117517,10 +123424,10 @@ xCq cGa nUC cGa -eds +nsr rpU gOR -dCm +fMH dcE dcE jph @@ -117530,19 +123437,19 @@ jph jph dcE luY -uJy -aYk +jHH +cVQ cBB -bNu -dCm -emL -jGQ -rJe -voV -fLr +rZH +dTL +jaY +ini +eBo +sWH +idO fjt -qtW -jFV +drg +drX maO wlY twp @@ -117553,28 +123460,28 @@ eZA tXS fwP sjC -iis +aWV nFA oSb gBG aWV dcE gmE -gmE +oRD ruc pcf pcf pcf -pcf enE vNo +idO aZs -fLr +vXt tDY kVK eXe xqk -eXe +nps lHK cYT jJX @@ -117602,10 +123509,10 @@ pHc thf thf vXQ -fAl -tUH -nLp -nLp +lPw +pJS +pJS +pJS eap fxY qBm @@ -117774,10 +123681,10 @@ iol eet jMr ibK -jqv +sBv oFC -nhP -dCm +sxO +fMH heR heR jph @@ -117791,15 +123698,15 @@ luY luY luY luY -dCm -cbS -rpL -hmY -dCm -rdx +dTL +itm +eBo +rNa +dTL +vdk fjt qtW -jFV +mmS svp sqQ bMd @@ -117823,15 +123730,15 @@ qeX qeX qeX qeX -keq +vNo idO aZs -fLr +vXt vUS wDZ quJ egX -ghV +aOE quJ wDs jJX @@ -117861,8 +123768,8 @@ ntN nTK fAl tVo -nLp -nLp +szy +djL eap eap qhH @@ -118025,17 +123932,17 @@ dcE dcE iFB iFB -dCm -dCm -dCm -dCm -dCm -dCm -pfK -dCm -dCm -dCm -dCm +fMH +fMH +fMH +fMH +fMH +fMH +xIT +fMH +fMH +fMH +fMH dcE jph frY @@ -118043,24 +123950,24 @@ uUT nyA jph dcE +bbn +iqX +kJG +fDV +kiY dTL -oHs -xYf -fpM -gTH -dCm -jqo -eaw -tEt -voV -fLr +kfo +azj +reW +sWH +idO uHy qtW jFV tgT sGj -qKB -ckd +nRN +goK pZX gyq wXk @@ -118068,7 +123975,7 @@ rTR aWV bCC lZn -aNb +vFZ opj wXU aWV @@ -118081,9 +123988,9 @@ oOx bpx oht kfA -fLr +idO aZs -fLr +vXt vUS afL quJ @@ -118099,7 +124006,7 @@ xhn sns jZc wSs -mHi +xcq mZA fTt kTJ @@ -118120,13 +124027,13 @@ fAl jYq nLp hFi -mUi -wKb -wKb -rdN -wKb -wKb -wKb +dVx +ohG +ohG +uPY +ohG +ohG +ohG jWB odZ nCo @@ -118281,18 +124188,18 @@ dcE dcE dcE dcE -dcE -dCm -akS -wag -gaj -uHO -dXy -tmO -xNe -wIW -tAV -dCm +lnB +fMH +nrT +mTo +sQK +ixG +hMJ +sZA +hSe +hoe +crP +fMH heR jph oIT @@ -118300,20 +124207,20 @@ xYy iOE jph heR +gVQ +aOI +oFa +eJS +tHu dTL -jDr -oNp -sPC -sOw -dCm -rpL -lHY -uyD -voV -fLr +nAv +mTv +lYH +sWH +idO fjt qtW -jFV +mmS svp hEE qKB @@ -118340,7 +124247,7 @@ dBm hsR crk ucO -crk +fNB tDY dqj oJs @@ -118378,12 +124285,12 @@ vdl hFi sQJ gzh -wKb -uUX -eEv -eEv -uWu -wKb +ohG +npw +oHF +oHF +hwQ +ohG fTM odZ nCo @@ -118538,18 +124445,18 @@ dcE dcE dcE dcE -dcE -dCm -nit -eOn -uHO -dCm -dCm -dCm -rvH -dCm -dCm -dCm +heR +fMH +qGC +pSi +ixG +fMH +jnR +fMH +cQv +fMH +fMH +fMH dcE jph jph @@ -118557,27 +124464,27 @@ jph jph jph dcE +bbn +jOZ +koH +wzi +eQZ dTL -nCC -sjO -skC -qQj -dCm -dCE -bLf -jiv -dCm -wKV +jOG +eBo +rNa +dTL +rdx fjt -qtW -jFV -svp +ewt +drX +psk sGj qKB cbC pZX cfx -bic +eaj fDs aWV xTt @@ -118595,9 +124502,9 @@ nVc hQU drn cRa -fLr +idO aZs -fLr +vXt gNZ sfM guk @@ -118620,7 +124527,7 @@ gBg kYd vSX neB -nwd +ijJ hsx xYS tNP @@ -118632,15 +124539,15 @@ lei lmc fAl lGy -ajB -uxt -uxt -pHx -ltC -ltC -byJ -wLf -wKb +mSU +tyv +tyv +dvt +qOE +qOE +aAM +idf +ohG wCv qEE nxh @@ -118795,18 +124702,18 @@ dcE dcE dcE dcE -dcE -dCm -yiy -nAS -nit -nAS -dXy -hqg -rvH -ecP -nPB -dCm +heR +fMH +jln +kWL +hMJ +qwG +hMJ +ofs +cQv +qEj +cYn +fMH dcE dcE heR @@ -118814,23 +124721,23 @@ dcE heR dcE dcE +bbn +cXF +nZq +pJt +iTF dTL -rSu -uzN -oqd -mkv -dCm -nZb -ayn -bXg -voV +ipv +lik +eBo +sWH pVy fjt xQW drX jtU fry -qKB +cuL ckd pZX xms @@ -118839,7 +124746,7 @@ tXS aWV bzS eAg -ndK +nYZ ndK cif gZn @@ -118848,13 +124755,13 @@ aPV aWV hxd gnf -drn -drn -drn -cRa -fLr +dEN +dEN +dEN +lwJ +idO aZs -fLr +vXt aTx afL quJ @@ -118888,30 +124795,30 @@ rPd rPd omG fAl -pcR -uxt +wmC +cOE jbW qnM -wKb -wKb -hGD -wKb -wKb -wKb -wKb -wKb -wKb -wKb -ozw -wKb -wKb -wKb -wKb -wKb -ssm -wKb -wKb -wKb +ohG +ohG +rYR +ohG +ohG +ohG +ohG +ohG +ohG +ohG +cBs +ohG +ohG +ohG +ohG +ohG +tFO +ohG +ohG +ohG eap hxg eap @@ -119052,38 +124959,38 @@ dcE dcE dcE dcE -dcE -dCm -dCm -dCm -dCm -dCm -hmM -dCm -vRi -dCm -dCm -dCm -ega -dCm -dCm -dCm -dCm -dCm -dCm +heR +fMH +fMH +fMH +fMH +fMH +fMH +fMH +qtl +fMH +fMH +fMH +pRO +oDB +pRO +pRO +pRO +oDB +pRO +bbn +qbI +uzB +cmW +fvb dTL -uNG -jQu -oqd -yeu -dCm -emL -bXg -nZb -voV -fLr +fnH +mSQ +bKI +sWH +idO fjt -fLr +qpG drX qvg iEI @@ -119104,14 +125011,14 @@ kBA hAl aWV efC -hzY -drn -xtC -drn +gnf +dEN +dEN +dEN lwJ -fLr +idO aZs -fLr +vXt tDY qTl ghV @@ -119146,29 +125053,29 @@ rkW lmc fAl bCx -uxt +cOE sQJ -wKb -wKb -yfj -lAJ -ukZ -uMT -qyU -lKV -rHN -wKb -vht -oxM -ftK -wKb -mJb -cJU -wCj -mjB -lAJ -rFr -wKb +ohG +ohG +pxz +pBv +trv +jHb +gDe +fmq +pBf +ohG +fXF +qxV +gcb +ohG +mxJ +bpf +hSq +uZR +pBv +tFa +ohG eIO eIO eIO @@ -119308,52 +125215,52 @@ dcE dcE dcE bPW +ixf bPW bPW -bPW -mYN -fNv -sFV -dCm -dCm -dCm -kqk -ydI -qNg -dCm -dCm +bIf +dOE +sUH +mCi +dlK +wEU +cpl +ohH +gwN +eRc pRO -aSd -tFy -xbz -fha -mrq -pRO -dTL -mRq -vKW +iTw +eLV +vzf +iQE +iGe +kSR +bbn +bbn +rXM +aas +bbn +xHE +kEY dTL -dCm -dCm -dCm -voV -rnp -oUO -toM +sWH +fYo crk +toM +fNB drX drX wJn -npf +drX drX drX cfx -bic +eaj fDs aWV aWV aWV -eFq +aWV aWV aWV aWV @@ -119366,9 +125273,9 @@ hCy bCv wBv nGH -fLr +idO aZs -fLr +vXt suy nfG quJ @@ -119402,30 +125309,30 @@ ntN gPd qyA fAl -pcR -ajB +tUH +frP nLp -wKb -mWI -lAJ -rps -lAJ -uMT -qyU -qyU -eEv -aRg -qNq -eCO -htb -gnU -uuE -hHP -pTX -pOW -aAk -fGM -apE +ohG +fxL +pBv +nCp +pBv +jHb +gDe +gDe +oHF +xGN +dPq +wwn +mgN +aBz +vbx +aMl +vxa +gXH +bZI +lzH +nNA eIO ncO eIO @@ -119564,65 +125471,65 @@ dcE dcE dcE heR -bPW -dYl -oYn -fVa +ixf +xxh +rnV +lwu vwr vwr +new +qAk vwr -ukM -qOv -lwu -uen -lIk -lIk -dgR -bqA -pRO -rEG -hXE -pKp -dKa -qGv -pRO -wcT -kqt +vwr +mma +xEt +vtP +hrE +xgK +kaq +vfe +vfe +mUt +kaq +vfe +xgK +hxA +eDI vfe ofd -otb vfe -gpU -fLr -fLr -fLr +svH +vfe +vfe +fwq +dlx fjt gxP -fLr -fLr -fLr -fLr -fLr -fLr -fLr -fLr -pzy -fLr -fLr +bVS +itA +itA +upE +itA +itA +itA +itA +iyI +itA +itA wZy -fLr -fLr -fLr +itA +itA +itA mMA -fLr +gpU obn dFt hHd itA -fLr -fLr -fLr -fLr +itA +itA +itA +itA aKc aZs fLr @@ -119631,12 +125538,12 @@ afL kzm kFt voP -cKR +egH qez gRB anp tIq -olM +vXv tIq gde fXN @@ -119659,30 +125566,30 @@ vWv vWv lmc tNP -mgh -uxt +xIp +cOE cOe -wKb -cpD -rps -lAJ -eEv -pEI -qyU -qyU -yfj -wKb -txT -siM -fdI -wKb -wjO -weK -dZs -fGM -eyg -vkl -wKb +ohG +vhE +nCp +pBv +oHF +hWJ +gDe +gDe +pxz +ohG +pxe +ejB +jEd +ohG +jBr +rdz +uQi +lzH +gBe +wEg +ohG eIO eIO eIO @@ -119816,44 +125723,44 @@ dcE dcE dcE dcE -eHF +fRO dcE dcE -eHF +fRO heR -bPW -nIH -vwr -vwr -vwr -ibr -qek -qek -qek -qek -tWR -tWR +ixf +xxh +aQq +fMS +fMS +lAo +olG +olG +olG +tFB +olG +vPE tWR -bIS -ebC -pRO -rPs -kdG -gqh -jOT -iQR -etf -xWy -uAm -jyX -jyX -lCf -lCf -chU -cib -cib -cib -gki +fjo +xgK +vfe +uQl +tCt +bFl +pSv +laC +fdN +laC +lnE +rdW +afQ +ork +rjc +kVf +kVf +wSn +ncC +ber cib cib cib @@ -119867,7 +125774,7 @@ ygM cib cib cib -jiE +rXt aZs aZs aZs @@ -119881,7 +125788,7 @@ aZs aZs aZs aZs -bTZ +jcH vXt gNZ bXO @@ -119911,35 +125818,35 @@ jFH uGP kxo iCa -lbe +fdz xIl idj uix tNP pcR -izU +wNo dxN -cWU -cWU -cWU -cWU -cWU -cWU -cWU -cWU -cWU -cWU -cWU -cWU -cWU -cWU -cWU -dvu -dNu -nlo -wKb -wKb -wKb +gNx +gNx +gNx +gNx +gNx +gNx +gNx +gNx +gNx +gNx +gNx +gNx +gNx +gNx +gNx +wFi +dXE +xZu +ohG +ohG +ohG eap hxg eap @@ -120073,65 +125980,65 @@ dcE dcE dcE dcE -eHF -heR +gMc heR -eHF heR -bPW +gMc +oTg +jOO ixf ixf ixf -oOz +vra ixf ixf -dtu +iqe ixf ixf ixf -bPW -fyw -bIS -nMp +jOO +hWN +mTJ pRO -wIK -wfk -bDQ -lvv -jxl pRO -sKT -qAd -ezL -vfe +pRO +pRO +pRO +pRO +pRO +pRO +cyD +kqu vfe +kaq vfe -gpU -fLr +piW +sNz +mTT fwq nkF -jRH -fLr -fLr -fLr -fLr +qNe +qNe +qNe +qNe +qNe qsb -nkF +ruK cwq oHu -fLr -fLr -fLr -kuT -fLr +qNe +qNe +qNe +qNe +qNe wTx tNr vOs tNr -nPW -fLr +ghA +qNe fom -fLr +qNe tXN nzd oGH @@ -120158,8 +126065,8 @@ qSk qSk qSk rOA -aRb -nvA +rsJ +grc hZe uZn tsJ @@ -120174,7 +126081,7 @@ oof exo tNP pcR -uxt +cOE xaz bQe qYi @@ -120190,11 +126097,11 @@ jSD hJE ebL xhF -cWU -fwz -aMa -ybh -wKb +gNx +jbL +qYK +fZh +ohG heR dcE dcE @@ -120330,10 +126237,10 @@ dcE dcE dcE heR -eHF +fRO heR -eHF -eHF +gMc +fRO heR ixf osO @@ -120347,25 +126254,25 @@ osO osO osO ixf -jcz -bIS -gcm -pRO -pRO -pRO +ulw +xJJ pRO +vqx +fQG pRO +aKJ +bOf +hsU pRO -pRO -uCA -rVT -hQV -lTA +xJs +uyR +eCA +rls +dCm dCm dCm dCm dCm -oKg oKg cLQ cLQ @@ -120376,21 +126283,21 @@ oKg tPU tPU tPU -uzs -tPU +ayi tPU tPU +jMu rWE vai rWE -shs +dtP lSU fbv wMr bFb -hKy +wMr wvI -shs +wqB nAB nAB abT @@ -120415,8 +126322,8 @@ qhB bjq qnC rOA -jBs -aah +fRo +uhz vzq uts uir @@ -120431,7 +126338,7 @@ nCI ifV fAl lGy -ajB +frP xaz bQe iLy @@ -120447,11 +126354,11 @@ tWZ eoH mrC mrC -cWU -cer -qAw -jHD -heC +gNx +jkk +jhg +rOE +nsn dcE dcE dcE @@ -120584,12 +126491,12 @@ dcE dcE dcE dcE +fRO +gMc +gMc +gMc dcE -dcE -eHF -eHF -dcE -eHF +fRO cOu cOu ixf @@ -120604,40 +126511,40 @@ kEx osO osO ixf -jcz -bIS -wmn +ykc +oUr pRO -pmn -tFy -pIr -noC -gPA pRO -kqF -qAd -lMe +uUS +pRO +hGy +aHB +ttw +pRO +szf +dnJ +piN rzK dCm -xbZ -rfE -ugX -oKg -oJx +kID +kID +rCP +dCm +ghI bZx kJF kCE ftk -pqW +vfX oKg -tQt +tVT xan -tNG +vWe vWe baw -dAW +vIE tPU -tuw +gqv vPN vQM shs @@ -120646,7 +126553,7 @@ shs ldX qLg shs -shs +eaM shs kdC vZd @@ -120704,11 +126611,11 @@ uLw fEs sUm qRy -cWU -pGk -iAr -oxi -heC +gNx +kvV +cvq +ibE +nsn dcE dcE dcE @@ -120841,12 +126748,12 @@ dcE dcE dcE dcE -dcE +gMc heR -eHF +fRO cOu cOu -eHF +gMc heR heR ixf @@ -120861,43 +126768,43 @@ osO osO osO ixf -lOh -bIS -mLH +nuR +wjx pRO -rPs -kdG -iNK -jOT -iQR -fVj -xWy -aQj -dhL -sfq -mYK -bNY -bNY +tZf +czG +gij +gbw +sux +wBY +iFK +pjp +sPl +tFj +kPe +hlD +bXk +bXk sCP +dCm +uzV +tCN +swU +gzc +cWF +ugp oKg -xLj -nGp -nGp -xEl -xEl -xfq -oKg -oTr -bfc -sUi -gmc -scy -aVP -gug -qoD +hqV +dBE +hAy +fBT +bPS +tie +nUr +brb vPN -aCa -abs +caF +okC bgW iDe dkd @@ -120961,11 +126868,11 @@ cpA gLs gvI tOg -cWU -vGl -dNu -aYq -wKb +gNx +bWR +dXE +qwb +ohG dcE dcE dcE @@ -121096,14 +127003,14 @@ dcE dcE dcE dcE -dcE -eHF -eHF heR -eHF -dcE -dcE -dcE +heR +fRO +heR +miW +cOu +fRO +fRO heR dcE ixf @@ -121118,31 +127025,31 @@ osO osO osO ixf -jcz -bIS -wcL +ykc +oUr pRO -wIK -ekB -bDQ -lvv -pWh +pYg +gAh +cpF +vGu +iMO +gBu pRO -err -qac +qpJ +kqu lMe -rzK +asl dCm -voi -bNY +kID +bXk xGU -oKg -wOR -wnn +dCm +mQA +kwE wma -dPu -dIB -enh +lAn +jzk +ror oKg tPU rJi @@ -121151,10 +127058,10 @@ sVq tPU wOq tPU -aCa +mnK vPN -aCa -abs +caF +dXh skr npb npb @@ -121182,9 +127089,9 @@ mJp wps wps arT -lWg +inZ bwM -jEz +inZ arT wps wps @@ -121218,11 +127125,11 @@ vSw adU iKm qSG -cWU -hqZ -dNu -aaS -wKb +gNx +tMT +dXE +qod +ohG dcE dcE dcE @@ -121352,18 +127259,18 @@ dcE dcE dcE dcE -aWc -cOu -cOu +nsD +qir cOu cOu cOu -miW +qir +wjP cOu cOu cOu cOu -bPW +jOO mmi osO osO @@ -121374,10 +127281,9 @@ osO osO osO mPB -bPW -jkR -bIS -ibc +jOO +sUK +pHJ pRO pRO pRO @@ -121385,21 +127291,22 @@ pRO pRO pRO pRO -gmh -qAd -lMe -epE +pRO +eJp +dnJ +ugC +bfl dCm lKb -bNY -rCP +mFU +wqU +dCm +oKg +oKg +hda +oKg +oKg oKg -vLZ -aWT -wma -bqS -gii -uss oKg tPU wZg @@ -121410,8 +127317,8 @@ aTw tPU vfV vPN -aCa -abs +caF +dXh rvu qOw osS @@ -121475,11 +127382,11 @@ bdc aqe qhv ffC -cWU -viy -rYH -men -heC +gNx +nda +qpH +hLW +nsn dcE dcE dcE @@ -121610,14 +127517,14 @@ dcE dcE dcE dcE -dcE -eHF -eHF heR -eHF -dcE -dcE -dcE +heR +fRO +heR +bhQ +cOu +fRO +fRO heR dcE ixf @@ -121632,28 +127539,32 @@ osO osO osO ixf -lOh -uVY -dFT +dSu +lzy pRO -mcY -tFy -qNn -nym -clF +xYC +fQG pRO -ntw -qAd +udu +wBT +iGO +pRO +oJt +dnJ emE -iOp +kNE dCm wzs -bNY -hTt -udl -udl +kux +lgx +dCm +hwL +reI +pXL +mOc +cal +qrK udl -kAx udl udl udl @@ -121661,14 +127572,10 @@ nnH nnH nnH nnH -nnH -nnH -nnH -nnH xzX vPN -aCa -dHq +caF +uxW uxW pRt gyN @@ -121732,11 +127639,11 @@ fdg sJX dag wrf -cWU -isv -gjM -jRZ -heC +gNx +lIF +vIG +kaI +nsn dcE dcE dcE @@ -121869,12 +127776,12 @@ dcE dcE dcE dcE -dcE +gMc heR -eHF +fRO cOu cOu -eHF +gMc heR heR ixf @@ -121889,47 +127796,47 @@ osO osO osO ixf -jcz -bIS -dpT +xnL +azG +pRO +pRO +jOJ pRO -vTH -hXE -ogG -wDQ -pgQ +uAX +sEV +uAX pRO -sKT -qAd +oiV +dnJ vfe -beb +ugr dCm -bNY -vFG -khn +qfB +knp +tQl +dCm +llC +jhz +tde +brf +cdJ +brf +sxR +iwg +yfS udl -hiS -hpB -iRx -jNT -xKz -kXy -nnH -rIw -ijH -gbd -vZc -hlG -bTl +cjQ +aoi +bGv nnH -iaE +wFc vPN -aCa +rky vjc -abs -skr +shs +pRt txS -jBx +cQd jYm swZ shs @@ -121975,25 +127882,25 @@ arT gnR qfr vSq -evO -evO -evO -evO -evO -svL -cWU -cWU -cWU -cWU -cWU -cWU -jvL -cWU -cWU -clh -kgi -lBo -iMp +gNx +gNx +gNx +gNx +gNx +mmW +gNx +gNx +gNx +gNx +gNx +gNx +mRO +gNx +gNx +uSK +bfC +rHf +bIX dcE dcE dcE @@ -122126,12 +128033,12 @@ dcE dcE dcE dcE +fRO +gMc +gMc +gMc dcE -dcE -eHF -eHF -dcE -eHF +fRO cOu cOu ixf @@ -122146,47 +128053,47 @@ osO osO osO ixf -jcz -bIS -kQf +ykc +oUr pRO -rPs -kdG -iNK -jOT -iQR -hPL -xWy -qAd +mOz +czG +gij +iPx +sux +wBY +nhc +pjp +tje vfe -hpo +uPZ dCm -crG -idM -idM -idM -uRu -bDZ -iRx -iRx -iRx -eOD -nnH -gWA -jmT -jmT +lqw +dCm +dCm +dCm +brf +fmS +pXL +yfH +qZY +lxy +qNp +xIs +uRA +udl +xAm eQF -vzO -ePm +tns sKM xtG vPN -aCa -rnC -abs +rSX +hDF +shs dyS fgd -jBx +fVE uJs lkY shs @@ -122232,25 +128139,25 @@ arT hFi qfr sQJ -xYL -gtd -gGl -bgm -rKA -fUu -wKb -bQz -xqy -eEv -wKb -eEv -eEv -eEv -wKb -wKb -kmQ -wKb -cIB +jGn +oHF +chv +uyA +ohG +wVY +ohG +qaw +lbJ +oHF +ohG +oHF +oHF +oHF +ohG +ohG +jAx +ohG +bxv dcE dcE dcE @@ -122386,10 +128293,10 @@ dcE dcE dcE heR -eHF +fRO heR -eHF -eHF +gMc +fRO heR ixf osO @@ -122403,44 +128310,44 @@ osO osO osO ixf -lOh -bIS -qnN +rnK +taB pRO -fZq -ekB -bDQ -lvv -aHe +xOU +gAh +xHS +lhR +iMO +but pRO -tqQ -ccZ +cyD +rYw qMN -pOF +aSP dCm -tMZ -idM -qsC -cTX -bDZ -bDZ -nMu -cqp -gwg -eRR -nnH -wqg -jVp -kBx -kaM -eQF -aKj +qfB +dTs +rWN +dCm +efg +oPO +brf +brf +lxa +nQu +wpg +ruF +nai +udl +aHb +vzO +uaB sKM xtG vPN -aCa -dHq -dHq +caF +abs +abs pRt dyl nSX @@ -122489,25 +128396,25 @@ arT lim efJ rvs -rKA -rKA -rKA -rKA -rKA -fUu -xah -ktt -xXx -pgA -wKb -eEv -eEv -eEv -eEv -eEv -eEv -eEv -cIB +ohG +ohG +ohG +ohG +ohG +wVY +gSH +ulV +aXY +kRX +ohG +vQQ +vQQ +vQQ +vQQ +vQQ +vQQ +vQQ +bxv heR dcE dcE @@ -122643,26 +128550,25 @@ dcE dcE dcE dcE -eHF -heR +gMc heR -eHF heR -bPW +gMc +oTg +jOO ixf ixf ixf -oOz +vra ixf ixf -dtu +xsq ixf ixf ixf -bPW -hCB -bIS -tYb +jOO +ejc +oUr pRO pRO pRO @@ -122670,33 +128576,34 @@ pRO pRO pRO pRO -gnw -qAd +pRO +vme +kgM vfe -fWc +vmO dCm -cNO -idM -idM -idM -jUp -bDZ -bDZ -klp -jCk -nxs -nnH -dEg -hCe -cOf -qWF -eQF +nBR +dCm +dCm +dCm +mlj +jjZ +udl +udl +qPv +udl +udl +udl +udl +udl +oZe +nrZ eQF -bHa +dGQ fLb btE -aCa -abs +caF +uBY cRX sIO igx @@ -122751,19 +128658,19 @@ ofc wWx gbH ewD -fUu -wKb -pcL -fRe -eEv -ooy -eEv -eEv -eEv -eEv -eEv -eEv -eEv +wVY +ohG +cNf +dSq +oHF +bPT +vQQ +vQQ +vQQ +vQQ +vQQ +vQQ +vQQ cIB heR heR @@ -122900,60 +128807,60 @@ dcE dcE dcE dcE -eHF +fRO dcE dcE -eHF +fRO heR -bPW -vEU -uDv -vwr -vwr -vwr -vwr -vwr -vwr -vwr -vwr -jcz -jcz -bIS -pDt -tYz -uus -qVd -cVN -bXH -aQM -cVN -cVN -dux -ezT -pOF +ixf +xxh +vNl +utS +utS +jLS +eeO +eeO +eeO +nuh +eeO +lsy +bPq +oYy +pRO +eel +fQG +pRO +xkG +nEX +flU +pRO +oiV +uKr +csr +dCm +dCm +joA +uaI +uaI dCm -ade -rdl -oMd udl -cew -xyX -dVM -bDZ -jCk -fmx +udl +udl +vXi +ofY +euH nnH -cmR -evj -evj -gaL -jnk -rCO +phn +pcE +hsj +lwd +eQF +mJY sKM xtG vPN -aCa -abs +caF +uBY hBM npb npb @@ -123008,19 +128915,19 @@ kKJ gkn dJb ewD -fUu -wKb -wKb -wKb -wKb -wKb -eEv -eEv -eEv -eEv -eEv -eEv -eEv +wVY +ohG +ohG +ohG +ohG +ohG +vQQ +vQQ +vQQ +vQQ +vQQ +vQQ +vQQ cIB wKb heC @@ -123162,54 +129069,54 @@ dcE dcE dcE heR -bPW -aug -vwr -pAz +ixf +xxh +soR +jwC iSE -kjN -fsf -fsf -vHO -vDV -laQ -laQ -jjn -hfx -jjn -mkI -cxQ -cxQ -xUV -olU -olU -olU -olU -laK -ffR -pOF -dCm -cNO +vwr +xRD +vwr +whn +psp +vtP +cBF +vtP +akk +pRO +pRO +jOJ +pRO +iyV +jBS +olB +pRO +oiV +qXh dCm dCm +kID +xGb +hnI dCm dCm +taf +dXy dCm -udl -iwp -jCk -pGr +hAb +ofY +euH nnH -tIT +tOG eQF lgb -nwC -eQF -aim +pUU +auf +pCZ sKM xtG vPN -aCa +caF abs yeG knB @@ -123265,19 +129172,19 @@ sOT bJj dsV ewD -fUu -cCI -jyL -jyL -siG -wKb -eEv -eEv -eEv -eEv -eEv -eEv -eEv +wVY +kkw +aGx +aGx +rhT +ohG +vQQ +vQQ +vQQ +vQQ +vQQ +vQQ +vQQ bVs lJQ alT @@ -123423,57 +129330,57 @@ dCm dCm dCm dCm -pBG -fUE -nts -aiv -aqG +kqh +nHG +qya +fOF +xCj bPW -tgp -lOh -qSP -wPP -eQg -dCm -dCm -dCm -dCm -oZA -dCm -dCm -dCm -dCm -dCm -dCm +gbo +byW +jPe +aYF +pRO +mOz +czG +gij +iPx +sux +wBY +mFE +tXw +kIr dCm -tMZ +kID +isp +isp +isp +isp +upk +isp +isp dCm -fIg -pfx -kKy -fIg -udl -qKs -jCk -sgU +iHO +enk +vrR nnH -bxl -eTZ -cJE +rOX +bWm +dPv eQl -iyI -pBL +wRL +llf nnH xtG vPN qwa shs -shs +bOb shs ldX ldX -eaM shs +bOb shs abT abT @@ -123512,7 +129419,7 @@ arT arT arT arT -arT +wgE arT nLp lDo @@ -123520,21 +129427,21 @@ vyF ewD rJv eUD -evO -evO -mTH -cWU -cWU -jyL -jyL -wKb -eEv -eEv -eEv -pDf -eEv -eEv -eEv +gNx +gNx +kOK +gNx +gNx +aGx +aGx +ohG +vQQ +vQQ +vQQ +kSI +vQQ +vQQ +vQQ wKb koi wKb @@ -123675,53 +129582,53 @@ dcE dcE dcE dcE -dcE dCm -rmC +dCm +xhV ybW dCm dCm dCm -vFr +rSD dCm dCm dCm dCm -qvU +dMG dCm dCm dCm dCm -cqh -ntW -cNO -cqh -ozE -poZ -cCv -poZ -iqy -bsa -iqy -fIg -cNH -fIg +uvw +xHS +sri +iMO +xts +dCm +dCm +jNW +dCm +kID +isp +kID +lsa +xZM dCm dCm uBD +dCm udl -udl -wCr +muK udl nnH sKM nnH sKM -tlh +hQh sKM nnH -nnH -bCD +jOi +xtG vPN glC oCe @@ -123732,9 +129639,9 @@ cLL mYd iYK shs -nCg -nEO tSp +nEO +vqs abT tGN rmw @@ -123774,30 +129681,30 @@ pps hFi tXs lEP -rKA -rKA -evO -evO -pPg -aLd -aLd -cWU -cWU -cCI -wKb -wKb -heC -heC -vaD -heC -heC -wKb +ohG +ohG +gNx +gNx +pAX +dPl +dPl +gNx +gNx +kkw +ohG +mLm +bSt +bSt +iQj +bSt +bSt +mLm wKb mNN wKb wKb wKb -roY +koi heC dcE dcE @@ -123857,29 +129764,28 @@ dcE dcE dcE dcE -"} -(156,1,1) = {" -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE +"} +(156,1,1) = {" +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE dcE dcE dcE @@ -123934,43 +129840,44 @@ dcE dcE dcE dCm -sbI +xBr +rpj gbJ +nHi +gRv +dXy +adv +mCO dCm -jhU +pcD +qjf +tGo +dXy +ily nit -isp -xBr dCm -wIW -qjf -isp -isp -ust -isp -isp +dCm +dCm +dCm +dCm +dCm +dCm +eMf +aAg +cqh +cqh cqh -hkm -hkm -hkm -hkm -hkm -hkm -hkm -hkm -voi -yeT dCm dCm dCm dCm tFd tCF -gex -itP -imq -wHp -arw +ppu +nmW +qGm +nQi +nQi nQi nQi nQi @@ -124001,18 +129908,18 @@ aCa upr qMi aCa -djL -uzj -txz +aCa +aCa +kgr tjR kxY -nLp +moO dOk hFi lim qVm hFi -nLp +uzj uVf lqr lAf @@ -124024,7 +129931,7 @@ hFi hFi hFi hFi -rMe +hFi gnT hFi hFi @@ -124033,13 +129940,13 @@ qfr hFi bnO bse -evO -aLd -aLd -aLd -aLd -aLd -cWU +gNx +dPl +dPl +dPl +dPl +dPl +gNx wNo oJz eyb @@ -124187,50 +130094,50 @@ dcE dcE dcE dcE -dcE -dcE +mXN dcE dCm dCm -nHi +dCm +dCm dCm adv adv +hXp +cOz +cOz +kqs isp -isp -isp -isp -isp -iZx -oTJ -nPB -dyG -pov -aMD -hkm -heR -heR -heR -heR -heR -heR -hkm -voi -yeT +tqv +eBi +eBi +mvT +eBi +ijL +eBi +lps +eBi +ijL +eBi +eBi +wKx +kID +kID +pBe dCm -ooK +lKG nvO owr rwW -jBK -kSN -ffj +mRU +wwd +fyo vTm qDe qDe rHk qDe -mIR +qDe iPT qDe qDe @@ -124258,9 +130165,9 @@ qMi qMi qMi fok -byE -aXa -epi +fok +fok +pfS aXa tjA aXa @@ -124290,13 +130197,13 @@ tXs qhd vRF mAe -evO -aLd -aLd -aLd -aLd -aLd -cWU +gNx +dPl +dPl +dPl +dPl +dPl +gNx owf kRI oYp @@ -124310,8 +130217,8 @@ unM wBO vij hri -wKb -acx +oTF +koi heC dcE dcE @@ -124444,44 +130351,44 @@ dcE dcE dcE dcE -dcE -dcE -dcE +mXN +heR dCm -jDY -inp -mHH -hQQ -lZQ -nws +syK +ddI +oPf +glF +adv +dXy +dXy itt -nws -ydH +fVp +dXy isp -pov +lZQ xqs xqs xqs xqs xqs xqs -dqJ -dqJ xqs xqs -dqJ -dqJ -jSf -jSf -qpc +xqs +xqs +xqs +xqs +hkm +rGY +hkm kOk kOk kOk kOk hdi -cHC -wZA -fct +iuN +gMB +iah frE iEk qrZ @@ -124490,40 +130397,40 @@ mGb spJ eJX qrZ -xtf +qrZ qrZ qrZ dko oDH oDH -gti -oDH -iYq -caE -dUe -oDH -bEJ -iKT -oDH -oDH -bZJ +jty oDH oDH oDH oDH oDH oDH +iKT +bZJ +bZJ +bZJ +dej +aCa +sVO +lqS +lqS +lqS xCW oDH dGi -oVz -nLp +aCa +kgr gZh hFi ajB nLp wLK -vOE +oVz nLp hFi jbW @@ -124547,13 +130454,13 @@ xEB hFi upt lZM -evO -aLd -aLd -aLd -aLd -aLd -cWU +gNx +dPl +dPl +dPl +dPl +dPl +gNx cMb lue vnp @@ -124701,39 +130608,39 @@ dcE dcE dcE dcE -dcE -dcE +mXN dcE dCm -xxd -mjh +awk +vdZ +hkm bTW -foJ +qRg bTW bTW -jjd +pkW +bTW bTW -jSf isp -pov +dZS xqs -vUm -pLP -vyp +xrI +bjH +uvf dqJ -vBX -mzN -hbO -eKF +cME +gpb +wkf +eZU gmd -iAH +guh dyt -jSf -bKC -vDL +hkm +hKr +oDZ kOk -aGG -aGG +tmG +tIa aGG hdi hdi @@ -124746,71 +130653,71 @@ jwa qKO qKO qKO -oDs -qKO +uln +cwA uDd bgT edJ qHJ vBZ -qKO -uln -qKO -qKO -qPj +pfM +iys +ldp +mHF eao +eao +wmg qPj -qPj -cjh -cjh +vkD +aqi mwS xCO nak -uKP +rRN wTn mQX -cjh -mHf -mHf +rVL mHf +tUg mHf +bQC mHf -rKA -cLq -nuP -awK -rKA -rKA -rKA -dHh -rKA -rKA -rKA -rKA -kRd -rKA -rKA -rKA -sVA -awK -xuU -rKA -cLq -rKA -awK +uAp +qVv +sai +bab +uAp +uAp +uAp +cZD +uAp +uAp +uAp +uAp +vVi +uAp +uAp +uAp +klQ +bab +mKb +uAp +qVv +uAp +bab oAN aXa -twv -rKA -rKA -rKA -evO -evO -aLd -aLd -aLd -cWU -cWU +nBS +uAp +uAp +uAp +gNx +gNx +dPl +dPl +dPl +gNx +gNx aSW aSW pQh @@ -124958,50 +130865,50 @@ dcE dcE dcE dcE -dcE -dcE +heR dcE dCm -iBG -oKN -bTW -oPu +fGQ +cWu +hkm +kmz +xDq mvu llK -fYt -nXr +hfL +cDF +bTW +nNi jSf -lnO -cNt -tkO -ovN -oUo +xqs +xPy +wHB klH lVD -uTK +szG fsw -ahT +ggX jHt jHt jHt -wJF -jSf -ucQ -wzB +stt +hkm +aDd +rtv kOk hPP qlF vaF +giG oOs -iKA lNZ ksm -qlf -tul -lge -xQU +duf +bAS +dzw +cnT jwa -qKO +hCL eYw eYw qKO @@ -125011,62 +130918,62 @@ gZW uqm qKO qKO -hbK -eYw -qKO -qgr +qPj +toT +hIS +xiy xiy -lmt +sta qPj -caQ -gNy +cjh +nJU qgI lMT mie vzr +mie nJU -nJU -mhP +cjh mHf gFB sLS pGs mHf -swp -gKL -mHx -mwj -qWv -rKA -bpB -gtd -lHT -rKA -dsR -djE -tpA -iCN -rKA -gZD -agO -agO -kAV -oLE -agO -agO -rKA -rKA -yli -iRa -rKA -bZq -tRG -bZq -evO -evO -mTH -cWU -cWU +tJH +hpr +pLS +kJk +kZq +uAp +iCV +lLN +iTh +uAp +qNP +iai +wRT +hew +uAp +kcL +lFF +lFF +mmM +kJl +lFF +lFF +uAp +uAp +kuB +wqe +uAp +iwY +fWB +iwY +gNx +gNx +kOK +gNx +gNx msr aSW xNN @@ -125213,52 +131120,52 @@ dcE dcE dcE dcE -xXv +iWu mXN -dcE -dcE -dcE +mXN +heR dCm +pZZ lNm -oTE -bTW -iqs -mId -nfM +hkm +xEW +xDe +mtM +aVZ bCb -mId -jSf -pIn -qhl -xqs -vUm -lff -wLg +gKT +bTW +xyD +ahl +tkO +plk +wHB +uqN dqJ tMD pDT -xwC +mQH hKn hKn hyo -lRr -jSf -bBu -vRz +wnm +hkm +dxU +kAc kOk hun cZN kAX -fjy -osu -xfX +eAl +gNg +sII ezE -udY -xQV -lge -rNx +tck +whH +dzw +lzg jwa -qKO +whG hbK qKO qKO @@ -125269,59 +131176,59 @@ qKO qKO qKO bPw -eYw -qKO +oII +iYq fGL uDD qxr opL pLd -eOa -eOa +raF +piF kIw -eOa -eOa -eOa +geK +kIw +cTo pOQ jBX jkG ggH -hXm +uqB bKs mHf -pGv -agO -vdr -tbf -cCr -rKA -ops -qHN -gtd -rKA -lBF -gtd -cIX -iCN -rKA -agO -agO -oLE -kAV -oLE -gtd -agO -rKA -vok -viN -eJZ -rKA -rPV -qZv -nTM -yiL -rKA -jmh +xpo +lFF +lMj +qQe +uLe +uAp +xMu +qGe +lLN +uAp +tzK +lLN +agL +hew +uAp +lFF +lFF +kJl +mmM +kJl +lLN +lFF +uAp +pqo +qqs +cXO +uAp +dGX +okJ +rDz +tfq +wKb +dlt qdA wOx vcm @@ -125399,34 +131306,36 @@ dcE dcE dcE dcE -"} -(162,1,1) = {" -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE +"} +(162,1,1) = {" +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE dcE dcE dcE @@ -125468,52 +131377,50 @@ dcE dcE dcE dcE +mXN dcE dcE -mXN -heR -heR -heR -heR -unl -kQy -unl -unl -lUO -kUW -lVA -gBY -kUW -jSf -orm +dZJ +pZJ +pZJ +gtm +pZJ +nbQ +qnB +ing +xXj +lbp +aEA +bTW +aaq cil xqs xqs -yhN +uXm xqs xqs -dqJ +rgq wDY -dqJ -dqJ +rgq +rgq vzW -dqJ +rgq xqs jSf -aqy -fZR +pdY +jSf kOk -vMO -vqi +sDD +tEQ seA -cuT -gFk -fBX -hpe -nbY -bKb -lXK -lBQ +siD +dmk +bAW +cwe +cbn +xgR +qqV +yiF jTQ jwa gtA @@ -125522,63 +131429,63 @@ tkm lAg xoT aVm -hKw +eYw hfX qKO woX -hbK -qKO -vgN +fNW +eJa +cJK cJK rSb qPj kHy -hHA +blm ghZ -geK +aSU pce -rxk -ntx +gSn +gSn gSn mDS -iju +mHf sXk kdp lfK mHf -nqu -xuB -tbI -gKL -oSZ -uKm -gtd -gtd -sUV -rKA -dFo -qHN -oCA -rVx -rKA -gtd -agO -cEf -afP -rXI -gtd -agO -rKA -gvk -mRI -iRa -rKA -oOd -qHN -qHN -eAP -rKA -jmh +oAf +xId +llM +hpr +bNe +hgi +lLN +lLN +kpl +uAp +rxW +qGe +lbk +ihJ +uAp +lLN +lFF +cgG +lSM +sGT +lLN +lFF +uAp +pbY +kjr +wqe +uAp +syN +qGe +qGe +dhf +wKb +dlt dlt wKl rNT @@ -125722,7 +131629,7 @@ dcE dcE dcE dcE -dcE +heR dcE dcE dcE @@ -125731,64 +131638,64 @@ mXN dcE dcE heR -unl -unl -eGE -hVk -hBw -fgx -kqH -vLj -hYg -fGD -eQO -lsV -xCJ +pZJ +gBr +oZS +fOs +vfQ +rtr +jwO +qMF +nKp +dvr +lPP +pny +qYP tNb lqA -xYb -rrz +vEv +sOU hKE nNY tIl xkL -kTN -nNY +sOU nNY +oOE tKa nNY -ocF -jSf -jSf +nzx jSf jSf -jSf -kOk -dGS -bAW -idm +njk +njk +njk +njk +hFp +cMR +ezt oOs -wfz +pVM gsL -iDS +wQu aKR jwa eYw qKO -eYw +mzH qKO qKO hlF ctT leR qKO -qKO -eYw -qKO +ylN +gNS +qNi tLq jua nUd -qPj +opL ivz hHA nml @@ -125796,46 +131703,46 @@ ebO web ebO rOb -gSn +dUe jYs -mHf +jkG iUM -uqB +kdp puR mHf -gim -gtd -agO -gKL -gtd -rKA -lxN -gtd -aFm -rKA -oPW -sfJ -mHD -gtd -rKA -agO -agO -oLE -kAV -agO -agO -agO -rKA -gAM -viN -vsq -rKA -xfr -nvM -qHN -qHN -rKA -jmh +vgV +lLN +lFF +hpr +lLN +uAp +oRA +lLN +wpL +uAp +uLI +ouJ +cZz +lLN +uAp +lFF +lFF +kJl +mmM +lFF +lFF +lFF +uAp +qcW +qqs +vIb +uAp +fiZ +iiN +qGe +qGe +wKb +dlt qdA wOx tVR @@ -125849,8 +131756,8 @@ uVg uVg pWZ uVg -uVg gLU +bDq foj koi wKb @@ -125978,121 +131885,121 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE -dcE +dZJ +iWu mXN -dcE -dcE -gOE -nmx -nAN -uhl -rZl -gXQ -kXt -aTV -kUf -unl -unl -unl -unl -jSf +mXN +mXN +mXN +iWu +heR +bWY +ule +tMN +lLT +ePI +shl +qBr +dkb +dkb +jBf +pZJ +pZJ +pZJ +pZJ +pZJ hmX wrQ -xYb -hns -jvZ +vEv +wrQ wrQ -uvN wrQ +uvN wrQ wrQ wrQ +hns xgZ -iUJ -rOB +wrQ +lkf jSf -jDl +bau ncV hsI -dtj +fOY pdB -bRC -bAW -rIU -bAW -loh -bAW -rIU -kmm +mlx +xRj +wjX +qtj +doK +gUr +oyz +ipo jwa eYw qKO ggQ -hbK +uoz qKO ceh rvt ufx -jia -qjV -hKw qjV -rwd +jRe +sXu +eJa +deg deg qJb qPj -qNi +cjh ssa cjh -osx csb +aIR csb cjh glU -qNi +cjh mHf fEA -uqB +akv dKD mHf -vCr -bMq -xvv -lYw -mPn -rKA -rKA -daz -rKA -rKA -sJK -gtd -dOq -gtd -fhA -agO -agO -vpt -afP -qGx -agO -gtd -rKA -rKA -mRI -nlP -rKA -qHN -qHN -fUh -ogn -rKA -jmh +iPv +kFN +qOj +lhq +fCM +uAp +uAp +afI +uAp +uAp +uVD +lLN +iEe +lLN +cMJ +lFF +lFF +mSG +lSM +yiw +lFF +lLN +uAp +uAp +kjr +peI +uAp +qGe +qGe +fjO +wDX +wKb +dlt rOn iXD kiu @@ -126104,7 +132011,7 @@ xRn aSW jjG uVg -ucl +nax uVg hRW bDq @@ -126236,120 +132143,120 @@ dcE dcE dcE dcE +mXN dcE dcE -dcE -dcE +heR dcE mXN heR -heR -heR -mTz -naa -mUN -rZl -nyz -fgx -vLU -oKx -tCX -jGm -oPd -oPd -jSf -fvu +bWY +vNb +tMN +sZk +cPr +shl +qBr +dkb +dkb +jBf +qVU +aIZ +kay +kfI +pZJ +rnN lpj -oob -fVd -fVd -fVd -uyr -uyr -uyr -uyr -uyr -nGB -ien -aat -oxn +aaN +lsv +lsv +lsv +aaN +aaN +aaN +aaN +aaN +uCs +iti +iti +mCN itX ngp -qzQ -hYa -jCv -mYm -xRj -wjX -qtj -doK -smk -gTe -eSW -iSh -nES +mPt +mLd +pBh +wsP +spn +wyA +vDM +vYQ +fnF +lRs +bFm +kTe +mtv qKO qKO -eYw +mzH qKO vuc xmf -aVm -vKi +leR +qKO tiK eSK csS cHS spr uWE -qPj +wHw bfN kbf wIf onn ueR -ueR +rNI ezW pgx iJC mHf +jkG +bwv +jkG mHf -iju -mHf -mHf -rKA -etu -spw -spw -qzf -rKA -aNT -gtd -rKA -pbU -cac -dOq -stY -fUg -rKA -agO -gtd -oLE -kAV -oLE -agO -agO -tuj -qHN -mRI -nlP -rdV -iBI -sbn -qei -ggp -rKA -bHO +uAp +upz +lgg +lgg +tpB +uAp +awX +lLN +uAp +wKS +wQA +iEe +qxW +kCk +uAp +lFF +lLN +kJl +mmM +kJl +lFF +lFF +xlt +qGe +kjr +peI +adg +qTZ +jpq +kTQ +oBr +wKb +oUS qdA xZP aKk @@ -126493,75 +132400,75 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE -unl -unl -unl -unl -unl -fgx -fgx -rZl -bmO -fgx -vdm -kXt -ppL -jrq -jrq -jrq -fOM +mXN +heR +heR +pGP +pGP +pGP +pGP +pGP +heR +pZJ +jkD +bTp +shl +fNx +uuH +uuH +vth +aYU +ydV +lyv +lyv +jxQ noI wrQ -nKD -dYy +jke wrQ wrQ +dYy wrQ -tST +bnh uBp wrQ wrQ wrQ -dfI -tFC -fTF -dnb +lpE +tPl +jSf +lGC gym inI -gkW +ovV njk -iRX -gef -koC -oVY -oCr -bAW +xEh +gAb +dOC +fPn +hKs +oxc rIU -svB +wPj jwa -nES +mtv qKO -eYw +agF ovQ qKO eZd gNf -eYw +mPf jaN -qKO +aLq pnq -qKO -qPj qPj qPj +vTE +vTE qPj ipR -hHA +rxc jeW jgd qxA @@ -126569,44 +132476,44 @@ hHr bhN gbE uro -hIA +abI leT vQd fPX -hIA -rxM -afr -afr -qHN -afr -rKA -sVA -gtd -rKA -dOq -rKA -ddw -rKA -rKA -rKA -agO -xuB -gKO -afP -gEE -agO -agO -rKA -qHN -mRI -vsq -rKA -oZt -jxo -nvM -rKA -rKA -jmh +cjh +gSF +pAd +pAd +qGe +pAd +uAp +klQ +lLN +uAp +iEe +uAp +kBB +uAp +uAp +uAp +lFF +xId +cJZ +lSM +cvM +lFF +lFF +uAp +qGe +kjr +vIb +uAp +bNl +hmp +iiN +uAp +wKb +dlt wKb wKb wKb @@ -126750,58 +132657,58 @@ dcE dcE dcE dcE +mXN dcE dcE -dcE -dcE -dcE -unl +pGP wFl wFl wWO -sZu -muW -xBR -qEZ -esk -vMn -rND -cMW -ppL -cep -wMu -wMu -jSf -anB +rbl +clX +hMp +rnB +hpw +aqp +rmb +lxV +lxq +gJv +aYU +mEo +lyv +lyv +pZJ +nox wrQ -pvU -xYb +mfT +lpE mwx wrQ dje -qbm +lEH dje wrQ mwx -wrQ -tHR -oZV -pCb -wSZ -wSZ -rct -rct -uAl -aLX -gAb -gEZ -lyw -vuy +dGY +mfT +bkk +jSf +uaP +uaP +njk +njk +njk +iAa +sXf +tBn +tBn bAW -tOO -pJM +bAW +rIU +cjY jwa -nAA +tEW qKO tWK qKO @@ -126810,12 +132717,12 @@ qKO qKO qKO qKO -qKO +fjz gVv qKO ifn -oII -hhw +vYX +vYX kxf dbw dLM @@ -126825,45 +132732,45 @@ szK usf kso cRO -aiP -rRN -pKC -bMi +geK +geK +geK +cfS uGJ -hIA -kEy -dWM -wmx -nrO -xPg -ncI -iCS -nBg -rKA -tpA -rKA -agO -gtd -gtW -tEy -agO -agO -gtd -oLE -oLE -agO -agO -rKA -tkh -viN -onG -rKA -jSW -qHN -gGl -erj -rKA -jmh +cjh +vQm +jCV +kHe +eBX +nNg +iHi +cHx +asZ +uAp +wRT +uAp +lFF +lLN +oHY +hLi +lFF +lFF +lLN +kJl +kJl +lFF +lFF +uAp +jaT +qqs +mqN +uAp +wuV +qGe +bHC +vNE +wKb +dlt wKb bAw xFT @@ -126941,32 +132848,8 @@ dcE dcE dcE dcE -"} -(168,1,1) = {" -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE +"} +(168,1,1) = {" dcE dcE dcE @@ -127012,115 +132895,139 @@ dcE dcE dcE dcE -unl -wFl +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +heR +iWu +dcE +dcE +pGP +qnU ftG kGD pQS -aKq -xcR -jBb -mOo -nBs -dDV -rPh -unl -unl -unl -unl -jSf -pvp -pvp -jSf -iyb -jSf -pvp -pvp -jSf -pvp -pvp -jSf -pom -jSf -kvl -pCb -gTm +heR +wNN +aim +sSx +fQT +bLP +vla +aEg +xuM +pZJ +pZJ +pZJ +pZJ +eaV +cOR +cOR +eaV +fTw +eaV +cOR +cOR +eaV +cOR +cOR +eaV +qIo +eaV +cOR +eaV +gUc rnX -sYg -bIP -hdi -afS +sfS +gUE +cWb +ckF +oCN bAW -tBn -vss xKx -fMu -rHZ -jwa +vvB +tIE +wxy +pJM jwa -nES -nES -nES +mtv +mtv +dXu rfu -nES -nES +nEM +nEM pQQ rfu -nES -nES +nEM +kkQ imz qKO nPb hfM vYX kxf -dbw +xCe iPz -wvw +oip oqA oqA aGb -gNS +dbw mbz -hIS -vqs -qAI +eOa +eOa +eOa guV rtb mID -dzt -bFc -pHQ -pNA -afr -rKA -sVA -cYx -rKA -tpA -oQk -ihE -agO -nBq -rKA -agO -agO -oLE -oLE -oLE -agO -agO -rKA -rKA -hMI -iRa -rKA -rKA -rKA -rKA -rKA -rKA -jmh +uXN +xeY +aSL +iAx +pAd +uAp +klQ +vFf +uAp +wRT +vTh +bBL +lFF +jau +uAp +lFF +lFF +kJl +kJl +kJl +lFF +lFF +uAp +uAp +hBs +wqe +uAp +uAp +uAp +uAp +uAp +wKb +dlt wKb wKb wKb @@ -127148,7 +133055,7 @@ cOu qir cOu qir -fUi +cOu qir cOu qir @@ -127264,32 +133171,32 @@ dcE dcE dcE dcE +mXN dcE dcE -dcE -dcE -dcE -unl -gPj +pGP +wFl wFl iqj -uTI -nPS -wXW -acU -rBB -cTL -juh -unc -uTI -ldL -bxx -bxx -jSf -dHC +kJI +mJI +pWi +pUx +ktD +woy +pDQ +dkb +aEg +gJv +jDm +hxf +gqH +hxf +eaV +qHP lqH lqH -aGp +bdX lqH lqH lqH @@ -127299,25 +133206,25 @@ lqH lqH lqH lqH -buu -pCb -pzZ -pbB -aMw -hYj -uAl -svM -fjy -aVD -aUD +inQ +eaV +kNj +rMr +thY +ufc +rct +rct +bmK +frN hWk fJL +gJY +lcS fJL -fJL -fJL -fJL +jwa +jwa qKO -eYw +now eYw qKO qKO @@ -127329,55 +133236,55 @@ imz qKO hzq vvw -vvw +pXF tBc tXY twX abM goD -goD +vHC eru jfd -pBJ +pBa tcr -hIA +nba htm -uHe +dep dAV -hIA -bZQ -qHN -afr -qHN -afr -rKA -lmv -vgJ -rKA -tEH -oQk -laj -bJB -agO -wMZ -pRA -agO -idQ -xhr -dsg -agO -gtd -rKA -mjm -fTZ -vsq -gAM -gvk -ouH -tkh -dEX -rKA -cBu +cjh +ezh +qGe +pAd +qGe +pAd +uAp +oln +tCm +uAp +jkb +vTh +kKU +nmE +lFF +epn +vxi +lFF +gQj +vUf +syT +lFF +lLN +uAp +oWt +gsd +vIb +qcW +pbY +ego +jaT +xTs +wKb +clq wKb unh hZf @@ -127521,120 +133428,120 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE -unl -unl -unl -unl -unl -aKq -eJw -krK -ntE -xZd -aFQ -fii -pQS -isX -gZO -jjj -fOM -dzg +mXN +heR +heR +pGP +pGP +pGP +pGP +pGP +heR +pZJ +ozS +exr +tSB +dkb +dkb +aEg +gJv +nXq +lWs +lWs +lWs +rki +sMy rxH mDD -goU -oLX -yhf -meE -nFx -ich -eXf -gro -goU +wGP +rKj +ptS +tND +cZr +tmZ +qrY +bqd +wGP rxH -lFW -pCb -aGX -mur -sok -wSZ -uAl -uAl -afS -bAW -xfX -hWk -eSA -hXA -iNX -cbB -fJL -qKO -qKO -eYw +hXW +cOR +wrd +blI +oyU +efM +eHZ +kEC +oCN +oCN +eWD +gJY +cET +nht +xKs +hKt +jwa +jxB +uWp +hbK qKO gdf cOg jBI jqR qKO -mOg +rOl qKO wom -vvw +pXF diP uxp -tas +cjh abm -tas -tas -tas -tas -tas -tas -tas +rxk +jXm +cjh +cjh +ceC +ibZ +cjh +hIA +hIA +hvL hIA -dej -uHe -cSf hIA -blh -afr -mJe -kcA -hIZ -rKA -cYx -ifA -rKA -dOq -rKA -gRQ -cpE -agO -rKA -agO -agO -dsg -vPU -nEq -agO -agO -rKA -oGO -snQ -lIT -hUU -snQ -iaR -fTZ -jsj -tMu -fKS +ltF +pAd +rsm +eQC +meY +uAp +vFf +wAV +uAp +iEe +uAp +sHh +mSL +lFF +uAp +lFF +lFF +syT +oKy +fUc +lFF +lFF +uAp +grm +nEW +jei +msq +nEW +qbM +gsd +hxU +vlc +wUh vlc mgY mgY @@ -127665,7 +133572,7 @@ dcE cOu cOu dcE -cOu +fUi cOu dcE qir @@ -127778,61 +133685,61 @@ dcE dcE dcE dcE +mXN dcE dcE -dcE -dcE -dcE -unl +pGP kYf kYf fbu -aNf -gOL -frJ -krK -ntE -xZd -dDV -oAJ -mSE -lwT -bxx -bxx -jSf -uRK +rbl +clX +rum +lqf +cNr +tSB +dkb +dkb +aEg +gJv +bav +fBI +fBI +fBI +eaV +jqz rxH umy -goU -tdN +bfY +vsD xBE xBE oUa xBE xBE -dfG -goU +mOO +bfY rxH -lFW -pCb -gKs -iWh -bvI -wSZ -rRJ -oOs -nID -jrx -xfX -hWk -eSA -iep -qXH -lVH -fJL -wAO -qKO -kcN +vEH +cOR +wrd +lqa +qTa +sok +mNK +afS +bAW +bAW +jcN +gJY +dRx +lhJ +eYN +gco +jwa +wKC +now +eYw qKO daW agF @@ -127850,48 +133757,48 @@ vCk pQq fRE rRg -tas +qxQ mSA hcj -jZl -hIA +cjh +cpQ lxW jBn nSS hIA -rKA -uKm -rKA -rKA -rKA -rKA -cfQ -rKA -rKA -dOq -rKA -rKA -rKA -rKA -rKA -agO -gtd -oLE -oLE -agO -agO -agO -rKA -tkh -jvX -juo -hAd -hLu -bUr -tkh -qHN -rKA -cBu +uAp +hgi +uAp +uAp +uAp +uAp +gDo +uAp +uAp +iEe +uAp +uAp +uAp +uAp +uAp +lFF +lLN +kJl +kJl +lFF +lFF +lFF +uAp +jaT +mrA +jmL +ayU +tjx +ppY +jaT +qGe +wKb +clq wKb yfj nuZ @@ -128034,62 +133941,62 @@ dcE dcE dcE dcE +heR +iWu dcE dcE -dcE -dcE -dcE -dcE -unl -kYf +pGP +qEC sFb kil pQS -aKq -bHC -krK -dWg -xZd -dDV -ska -unl -unl -unl -unl -jSf -gJT -iCq -umy -aej -rRh +heR +wNN +aim +ybM +tSB +lEl +dkb +xSA +scO +pZJ +pZJ +pZJ +pZJ +eaV +oan +fnY +hXi +rKj +tQk xBE -vTv +rwn pEG -qvr +hhJ xBE -kbQ -yma -iCq -lFW -pCb -iUj -glJ -rvR -tTz -ulq -smk -smk -smk -smk -rLK +uiU +bqd +rxH +jEM +eaV +lmn +aMw +hKe +udS +rct +rct +gmq +cMR +jcN pnc -gAC -nxN -jLt -fJL -eYw +wdB +pjB +uSz +oPm +jwa qKO -hbK +qKO +fki qKO aTc mdT @@ -128104,51 +134011,51 @@ lWf uxp fyY qsi -rxc +yco emR ijF -tas +vKi nbb ezm -jXm -hIA -lxW -uHe +cjh +bfQ +cSf +jIl lhY -hIA -cme -gtd -gtd -gtd -qHN -sIq -cYx -rKA -gtd -tpA -kyg -rKA -qNM -lxN -rKA -uOS -jIs -agO -oLE -oLE -jIs -bKh -rKA -qHN -wkP -rhM -lzG -iLP -kkM -tkh -ibt -rKA -jmh +mhO +lLN +lLN +lLN +lLN +qGe +kPO +vFf +uAp +dDg +qtv +gTu +uAp +xxE +oRA +uAp +xtA +xCs +lFF +kJl +kJl +xCs +oEh +uAp +qGe +kUk +cPD +pvN +suK +ggK +jaT +bop +wKb +dlt wKb oZh nuZ @@ -128292,32 +134199,32 @@ dcE dcE dcE dcE +mXN dcE dcE -dcE -dcE -dcE -unl -xbI +pGP +kYf kYf fPA -uTI -wfp -wXW -evv -dqo -lDh -juh -unc -uTI -cgE -sbp -sbp -jSf -kWx +kJI +mJI +pWi +tXE +tRN +qaq +dmj +dkb +aEg +ibC +jDm +bge +bhy +bge +eaV +wXj rxH -wcJ -bdh +fmw +oCp xBE xBE hDq @@ -128325,28 +134232,28 @@ oWZ hDq xBE xBE -edu -fJN -nCO -pCb -sIB -rBO -wSZ -wSZ -rqm -fjy +pjn +rxH +uip +eaV +rHT +qGr +rct +rct +rct +afS bAW -fBX bAW hWk -eSA -sbF -qhW -qTt -fJL -qKO +gJY +eqR +xtE +ffg +sNT +jwa +uKy qKO -hbK +kcN qKO qKO pNk @@ -128360,52 +134267,52 @@ czY mdf uxp pbc -oJd +jxc yco hYo gLD gQa fZg nRz -wmt -hIA -raF +cjh +bhM +bMi amJ moq hIA -cme -gtd -rKA -keE -aHo -rKA -qYs -iCS -iCS -mKV -xpv -tLb -pee -jgB -rKA -rKA -rKA -rKA -eRg -rKA -rKA -rKA -rKA -tkh -xoZ -cTv -lzG -lzG -qmc -tkh -kES -mKV -muF +wij +lLN +uAp +ulo +xBC +uAp +nyF +enY +nIX +uAp +sNF +oIe +enY +gmu +uAp +uAp +uAp +uAp +oyJ +uAp +uAp +uAp +uAp +jaT +kHH +mtd +pvN +pvN +pWl +jaT +eOH +qdx +fAD qdx sPx bOi @@ -128549,60 +134456,60 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE -unl -unl -unl -unl -unl -daE -oeV -qLm -mOo -nBs -vxk -alk -pQS -gmm -hMt -cDI -fOM -edY -iMP -fmw -bdh -lEJ -ewm +mXN +heR +heR +pGP +pGP +pGP +pGP +pGP +heR +pZJ +prX +oNy +ion +bLP +vla +aEg +ibC +nXq +uFL +uFL +uFL +rki +bly +kwb +igb +oCp +iND +oKr wAU kDN aZY -okm -lEJ -nPP -fJN -uip -pCb +iyh +bdM +fFF +rxH +swa +eaV +eaV +wSZ pCb -uqc -cIH cxh gyV kwO -vvB -fMu +jrc fMu -kth -fJL -fJL -fJL -fJL +nlw fJL +alA +pVO +iKw +pUY +jwa +qKO qKO -qPs hbK jxB hbK @@ -128615,54 +134522,54 @@ qKO qKO qKO qKO -qKO -qKO -qKO -qKO +cjh +qAI +jxc +gJm bRQ -qKO -qKO -qKO -qKO -qKO -hIA -hIA -rwG -hIA +gLD +vKi +aHH +rwd +cjh +hXm +rKf +mPO +klU hIA -rKA -lUp -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -vkU -rKA -mSq -tpA -oXZ -rKA -mDV -agO -jyD -rKA -tkh -tkh -qHN -vTq -olL -fXT -jIZ -iET -qHN -ujS -rKA -jmh +uAp +uQX +uAp +uAp +uAp +uAp +uAp +uAp +uAp +uAp +uAp +xJL +uAp +pLa +nnQ +jHc +uAp +tOs +lFF +rVS +uAp +jaT +jaT +qGe +iQM +twO +eaN +chV +pKP +qGe +iyL +wKb +dlt wKb byv mKF @@ -128806,120 +134713,120 @@ dcE dcE dcE dcE +mXN dcE dcE -dcE -dcE -dcE -unl +pGP pBP pBP bFn -pwb -xrJ -lhX -drW -fzP -xZd -dDV -uKf -mSE -sBP -sbp -sbp -jSf -pbt -rQb -igb +jLv +rDs +lGO +rdh +uCa +lmR +lGV +dkb +aEg +ibC +nXq +pkI +pkI +pkI +eaV +szL +rxH +fmw uip -nYD -uPB +qie +tAX eLK dNX noU -vdg +kcY nYD cKc -fJN +rxH uAB -hFq +ffE eaV -wSZ +heR kOk hdi -kOk +hdi kOk kOk hdi hdi -kOk -kOk -dcE -heR -dcE -heR +fJL +fJL +eSA +eSA +fJL +jwa qKO nxr hbK -hbK -hZi +qPs +fWe sgr jxB qKO ryb sGV -qKO -agF nMC -uoz -wYS -eYw -jxc -eYw eYw hbK -qKC -vVp -hbK eYw +wYS +jCP +jxc +gJm +caQ +bEJ +gQa +vVp +eTm +cjh tSW bXt -buA +sCI hOw hIA -pPG -gtd -rKA -lfG -rEv -tuJ -kLV -gQi -rKA -awK -rce -mTL -qZW -qYs -tLb -pee -wuZ -aqj -wIg -agO -mtw -tkh -rKA -waq -mEG -vax -iKf -xfa -bqv -tkh -bZQ -rKA -jmh +quk +lLN +uAp +rFM +qOC +blW +duG +pgT +uAp +bab +uwl +aWA +vEW +idV +oIe +enY +gDZ +atJ +tks +lFF +vpX +jaT +uAp +kJz +uMJ +uSh +pyN +tmK +eSG +jaT +ezh +wKb +dlt wKb wKb wKb @@ -129062,121 +134969,121 @@ dcE dcE dcE dcE +heR +iWu dcE dcE -dcE -dcE -dcE -dcE -unl -pBP +pGP +dtv gIn aUW pQS -aKq -lIm -xZd -xMS -xZd -dDV -alk -unl -unl -unl -unl -jSf -pbt -rQb +heR +wNN +aim +vyG +dkb +dkb +dkb +aEg +xWz +shQ +shQ +shQ +shQ +eaV +hch +kwb lQA nwJ -xmd -uMD +uRD +sqj aVG shb mwY -tjt +vTQ tbd szp -rWT rxH -iIL +rxH +liN eaV -oAL -mrg +heR +bWY +bWY bWY oAL plB mrg bWY -oAL +uTj plB mrg bWY bWY -dTJ heR qKO -rYJ -qNd +xyt qNd -qNd -diE +clk +clk +mMZ hbK qKO iPk kvJ hKw uve -qKO +gAz chz -qKO +cjh uVn -qKO -qKO -qKO +jxc +mGj +gNy pLv -qKO +bgx oFh -qKO -qKO +cjh +cjh hIA uxG -abI +bMi dvK hIA -rKA -uYL -rKA -lfG -rEv -qHN -gWm -rsn -rKA -djE -gtd -qZW -awK -rKA -gtd -cme -rKA -qMC -lKm -gKL -rKA -qHN -tkh -tkh -vTq -rhM -lzG -rXq -iET -tkh -ujS -rKA -jmh +uAp +mbj +uAp +rFM +qOC +qGe +rSG +avw +uAp +iai +lLN +vEW +bab +uAp +hUb +wij +uAp +fCQ +dZI +hpr +uAp +qGe +jaT +jaT +iQM +cPD +pvN +yhD +pKP +jaT +iyL +wKb +dlt wKb eCM tnh @@ -129202,19 +135109,19 @@ qir qir qir qir +fUi cOu cOu -fUi qir qir cOu qir cOu cOu -cOu -cOu -cOu -nem +qir +qir +qir +fPs cbc dcE dcE @@ -129320,30 +135227,30 @@ dcE dcE dcE dcE +mXN dcE dcE -dcE -dcE -dcE -unl -hng +pGP +pBP pBP mVM -rTQ -faw -muE -wid -qcX -xZd -dDV -alk -unl -xLF -ibq -oCS -cGS -cKc -iCq +jLv +rDs +dnK +lTd +ihj +ttn +ttn +ttn +iaC +iZt +shQ +pKI +cCp +rzf +eaV +cAG +rxH okh uip xBE @@ -129354,12 +135261,13 @@ aAt xBE xBE jjo -uyu +rvT mmZ uex sCD -nld -jyv +syR +plB +mrg oAL vYt plB @@ -129370,12 +135278,11 @@ plB vYt plB mrg -dTJ -heR +bWY qKO rsH hbK -hbK +mNi hbK bvz cVi @@ -129383,57 +135290,57 @@ qKO sfh sgV sfh -sfh +mpK sfh mzh -qKO -qKO -qKO +cjh +wmt +xkJ etp qip -hbK -qKO -qKO -qKO -hRj -bCh +cnU +krs +xau +cjh +wUk +hIA bZs uUL dpv -bCh +hIA hRj hRj -rKA -eCu -ifF -wBK -wBK -jHL -rKA -sce -rKA -lHT -sVA -rKA -rKA -rKA -rKA -rKA -kWo -rKA -rKA -rKA -rKA -qHN -cUo -udF -fXT -fXT -qRL -tkh -rrY -rKA -jmh +uAp +iwl +igR +fNY +fNY +jVv +uAp +aZa +uAp +iTh +klQ +uAp +uAp +uAp +uAp +uAp +oeQ +uAp +uAp +uAp +uAp +qGe +apv +wkW +eaN +eaN +glw +jaT +tcB +wKb +dlt wKb eCM ghO @@ -129574,33 +135481,33 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE uCR dcE dcE -unl -unl -unl -unl -unl -hVH -frJ -xZd -rSi -xZd -vRE -fcT -chc -tuD -qQv -oiQ -tOi -ebD -qXx +mXN +heR +heR +pGP +pGP +pGP +pGP +pGP +heR +pZJ +mam +tPb +dkb +dkb +dkb +aEg +aFe +xdS +gWI +bax +qfz +erV +fno +cZg igb uAB jmv @@ -129611,10 +135518,11 @@ aOn oFn jmv vYm -rWT +rxH fYq yhq tHo +heR bWY jyv bve @@ -129627,77 +135535,76 @@ plB vYt mrg jyv -dTJ heR -qKO +pTP jxB hbK -cVi -jDy +qim +sTp hbK -jxB +brh qKO bhJ hvc -nUV -nUV +sfh +gdt rYQ vLx -qKO -xOh -lZV +cjh +etp qAx -hbK -cVi -qKO -hRj -hRj +qAx +qip +puv +cjh +cjh +cjh hRj -bCh +hIA bCh obJ -bCh -bCh +vwI +hIA hRj hRj -rKA -vtF -nEA -nEA -nEA -qHN -rKA -gtd -rKA -rKA -rKA -rKA -iEp -eND -rKA -erI -ubU -oLE -agO -uac -rKA -tkh -tFY -olL -fXT -uSE -kkM -tkh -rrY -rKA -jmh +uAp +dHx +kmv +kmv +kmv +qGe +uAp +lLN +uAp +uAp +uAp +uAp +eIQ +fMr +uAp +hYE +vzZ +kJl +lFF +bVq +uAp +jaT +ciN +twO +eaN +uLa +ggK +jaT +tcB +wKb +dlt wKb dGu gdG sUF -jcQ -jcQ -jcQ +gdG +gdG +gdG gdG gdG eEv @@ -129834,44 +135741,45 @@ dcE dcE dcE dcE +mXN dcE dcE -dcE -dcE -dcE -unl -xQB +pGP +qpL qpL uEQ -mSE -vqH -apA -xZd -rSi -xZd -upL -fcT -unl -uua -wjz -iTx -ydi -maS -rxH -chR -rxH +rbl +clX +lcb +gBZ +wMO +dkb +dkb +dkb +dLS +kWv +shQ +ofK +dNx +rQN +tHo +mgA +plQ +vMm rxH +iCq uip rxH brm rxH cKc -rxH +iCq khI -fPT +rtz uoU xTf sCD +syR plB bOO plB @@ -129884,77 +135792,76 @@ plB bOO nld jyv -dTJ -heR -qKO -bMh -hbK -hbK +bWY +pTP hbK hbK +fWe +fWe hbK +sAR qKO chb ksM -hCm -hCm -nUV +sMr +jZl +osx uCD -qKO +cjh hBh dmn -hbK -hbK -hbK -lAR -hRj -hRj +baY +rvX +eWc +cjh hRj hRj hRj +bCh +bEH llP +pUp +bCh hRj hRj -hRj -hRj -rKA -tSl -nEA -wqb -uta -uta -rKA -sce -rKA -paq -qHN -fvM -sbP -xPg -mKV -mYy -mZf -bcW -bcW -vFU -rKA -qHN -stR -xcV -hgC -jqG -scc -qHN -uHk -rKA -jmh +uAp +txp +kmv +uBU +dcO +dcO +uAp +aZa +uAp +xSB +qGe +uUx +tbv +nNg +hdK +lpw +ewg +loz +loz +nSK +uAp +qGe +iYr +rkE +iKI +cFN +tAe +qGe +xzl +wKb +dlt wKb tKw eEv gdG -jcQ -lBw -jcQ +gdG +pWQ +gdG gdG eEv qwy @@ -130090,45 +135997,46 @@ dcE dcE dcE dcE +heR +iWu dcE dcE -dcE -dcE -dcE -dcE -unl -qpL +pGP +mgR jRb oBp pQS -aKq -eed -xZd -jjh -xZd -wOG -sxT -kgo -wve -iFf -pcg -gFp -qXj -mjy +heR +wNN +aim +rwV +dkb +dmj +dkb +hRV +mAC +gvi +nhv +bZw +oxy +alM +vuh +msC xNn +lcU tXl +kAQ tXl -nwJ -lcU -vsM -rxH -cKc +xOG +tXl +vZa rxH -cfP -kgf -igK -oXS +vUx +gQH +gQH +kPR eaV +heR bWY bve plB @@ -130141,77 +136049,76 @@ bWY bve plB nld -dTJ heR qKO iJH hbK cVi -jxB +cVi hbK hbK qKO jVs -sWY -sfh +ksM sfh -bQC +caO +vlE sNG -qKO -lqS -hbK -hbK -hbK -hbK -lAR -hRj -hRj -hRj -hRj -hRj +tas +tas +tas +tas +cBU +tas +tas hRj hRj hRj +bCh +bCh +jia +bCh +bCh hRj hRj -rKA -jvf -nEA -jlf -prn -uta -rKA -gtd -rKA -bij -tkh -qHN -bZQ -keY -rKA -fXO -gKL -oLE -bcW -erI -rKA -tkh -tkh -bZQ -tkh -tkh -jTx -tkh -aoK -rKA -jmh +uAp +sml +kmv +bZf +rkA +dcO +uAp +lLN +uAp +qmy +jaT +qGe +ezh +vap +uAp +qHk +hpr +kJl +loz +hYE +uAp +jaT +jaT +ezh +jaT +jaT +aIJ +jaT +bdf +wKb +dlt wKb cjb eEv gdG -jcQ -jcQ -jcQ +gdG +gdG +gdG gdG eEv wKb @@ -130348,48 +136255,46 @@ dcE dcE dcE dcE +mXN dcE dcE -dcE -dcE -dcE -unl +pGP qpL qpL ovq -uTI -iLC -eaX -jBb -omc -nQs -dDV -alk -unl -kdZ -bZR -fuU -gjb -oBa -pub -pub -iqf -iqf -naq -wDt +kJI +mJI +pWi +tGm +kOj +fQT +bLP +cwy +aEg +oZS +shQ +xQJ +lnm +iRR +eaV +iTU +mqu +mqu +xNk +wDK +bOa +otW fhg wzV -oRU -lCw -hUM +bOa +war +euu eaV iUs eaV eaV -bWY -heR +gKw dcE -heR dcE heR dcE @@ -130399,7 +136304,9 @@ dcE dcE heR dcE -heR +dcE +dcE +epv qKO nNt oHX @@ -130414,54 +136321,54 @@ htF lLe vlE vLx -qKO +tas tsl -hbK -hbK +vgN +eXT tuF -hbK +qgr lAR hRj hRj hRj hRj hRj +pka hRj hRj hRj hRj -hRj -rKA -tSl -nEA -uta -uta -bGs -drA -gtd -rKA -qHN -uRx -qHN -jTx -bRD -rKA -rKA -rKA -rKA -kRd -rKA -rKA -qHN -tkh -jTx -tkh -sbP -nCx -lxJ -xFA -rKA -glN +uAp +txp +kmv +dcO +dcO +kxd +aKo +lLN +uAp +qGe +jrC +qGe +aIJ +tjB +uAp +uAp +uAp +uAp +pMC +uAp +uAp +qGe +jaT +aIJ +jaT +tbv +kaW +rzH +eER +wKb +aIh wKb kDF bxL @@ -130605,78 +136512,78 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE -unl -unl -unl -unl -unl -aKq -dXY -mil -bEK -mil -mUN -ska -unl -gjb -gjb -gjb -gjb -cyN -vAx -cfs +mXN +heR +heR +pGP +pGP +pGP +pGP +pGP +heR +pZJ +vmR +nye +dkb +lGV +dkb +aEg +oov +shQ +shQ +xkc +shQ eaV -pVA +dVq +mCG +oKk +eaV +xwk qpa rki rki rki -kAr -xqE +qpa +jXR maB eaV ioU eaV heR heR -dcE -dcE +heR +heR heR dcE dcE +heR dcE dcE heR heR -dcE -dcE +heR heR heR qKO -uZs +hUh fwB kuS -hbK -vvY -gHH +beT +imH +ajw qKO jSn hCP bRT -vLx +lLe qoX vLx -qKO +tas lVc -hbK -cVi -hbK -hbK +cHt +ufK +rwf +wRb lAR hRj hRj @@ -130688,37 +136595,37 @@ hRj hRj hRj hRj -rKA -sAB -qHN -nEA -nEA -els -rKA -gtd -mtw -gtd -gtd -gtd -atj -pee -pee -pee -pee -pee -pee -iCS -mKV -lNs -lcy -qIa -gAt -sdm -tkh -qHN -rKA -rKA -jmh +uAp +kKG +qGe +kmv +kmv +fdV +uAp +lLN +vpX +lLN +lLN +lLN +sNF +enY +ncS +enY +enY +enY +enY +cHx +hdK +nkW +cDd +mKz +fZb +wSD +jaT +qGe +wKb +wKb +dlt wKb wKb kNU @@ -130746,7 +136653,7 @@ dcE cOu dcE dcE -bWY +fUi dcE dcE cOu @@ -130862,58 +136769,58 @@ dcE dcE dcE dcE +mXN dcE dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -unl -gCa -rnR -fPi -fPi -fPi -egC -lTX -unl -dcE -dcE -tYZ +pGP +sbp +sbp +xEF +rbl +clX +lcb +cOj +oGb +dkb +dkb +dkb +aEg +gdW +vcX +woN +vwp +nYV gpk -gav +kMF nqt nqt eaV -enK -jEx -iry -fJN -fJN -xDp -fnY +loJ +nCh +vpy +jXS +dlv +wGP +dey eaV eaV eOr eaV -oaA +dcE heR dcE dcE heR dcE dcE +heR dcE dcE -dcE -heR heR dcE +dcE heR -kmY +bWY qKO qKO pTP @@ -130923,16 +136830,16 @@ pTP qKO qKO dvs -hCm +uHT omu -vLx -hCm -vLx -qKO +lLe +osx +dno +tas miB -hbK -hbK -hbK +caE +buA +jzo vHp lAR hRj @@ -130945,38 +136852,38 @@ hRj hRj hRj hRj -rKA -cHK -vvE -wBK -wBK -jHL -rKA -sce -rKA -rKA -nZa -rKA -xzo -rKA -rKA -fEO -rKA -rKA -fEO -rKA -rKA -rKA -rKA -oQk -oQk -oQk -rKA -rKA -rKA -dMp -jmh -dnO +uAp +laz +win +fNY +fNY +jVv +uAp +aZa +uAp +uAp +acd +uAp +hPq +uAp +uAp +iug +uAp +uAp +iug +uAp +uAp +uAp +uAp +vTh +vTh +vTh +uAp +uAp +wKb +kOi +dlt +imf wKb wKb wKb @@ -131118,9 +137025,157 @@ dcE dcE dcE dcE +heR +iWu +dcE +dcE +pGP +eux +hMt +kGV +pQS +heR +wNN +aim +ogR +dkb +lEl +dkb +aEg +qeV +wNN +bWY +bWY +bWY +mcT +uXL +nqt +nqt +eaV +fav +sNC +nlt +xtQ +ezq +sNC +xXV +eaV +bWY +bWY +bWY +heR +heR +heR +heR +ktq +heR +heR +heR +heR +heR +ktq +heR +heR +bWY +mNp +qKO +fSb +hRj +hRj +hRj +hRj +wUk +qKO +lzR +iHF +nUV +nUV +lYr +lmz +tas +eZF +wvw +sWM +hhw +yhu +tas +hRj +hRj +hRj +hRj +hRj +hRj +hRj +hRj +hRj +hRj +uAp +rFM +qOC +kmv +fNY +avw +uAp +uAp +uAp +jaT +qGe +uAp +nEW +qGe +uAp +ujG +sfv +uAp +qGe +xUT +uAp +heR +heR dcE +heR +heR +mNp +oyB +bWY +heR dcE +heR +bWY +bWY +bWY +heR +heR dcE +heR +heR +wKb +qvW +gdu +rCp +wKb +vZM +cxU +cxU +wyq +heC +heR +heR +cOu +qir +qir +qir +qir +qir +qir +cOu +qir +qir +qir +qir +cOu +bWY +heR dcE dcE dcE @@ -131128,193 +137183,6 @@ dcE dcE dcE dcE -unl -unl -unl -mTz -mTz -mTz -unl -unl -unl -dcE -dcE -heR -mcT -hQZ -nqt -nqt -eaV -fav -sNC -nlt -xtQ -ezq -sNC -xXV -eaV -tWn -tWn -dcE -dcE -heR -dcE -dcE -mGV -dcE -dcE -dcE -dcE -dcE -dcE -heR -heR -bWY -mNp -qKO -fSb -hRj -hRj -hRj -hRj -wUk -qKO -lzR -iHF -sfh -caO -lYr -lmz -qKO -eZF -hbK -hbK -hbK -yhu -qKO -hRj -hRj -hRj -hRj -hRj -hRj -hRj -hRj -hRj -hRj -rKA -lfG -rEv -nEA -wBK -rsn -rKA -rKA -rKA -tkh -qHN -rKA -snQ -qHN -rKA -fBn -nnB -rKA -qHN -uNo -rKA -heR -heR -dcE -heR -heR -mNp -oyB -bWY -heR -dcE -heR -bWY -bWY -bWY -heR -heR -dcE -heR -heR -wKb -qvW -gdu -rCp -wKb -vZM -cxU -cxU -wyq -heC -heR -heR -cOu -qir -qir -qir -qir -qir -qir -cOu -qir -qir -qir -qir -cOu -bWY -heR -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -"} -(185,1,1) = {" -dcE -dcE -dcE dcE dcE dcE @@ -131349,6 +137217,9 @@ dcE dcE dcE dcE +"} +(185,1,1) = {" +dcE dcE dcE dcE @@ -131393,25 +137264,61 @@ dcE dcE dcE dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +dcE +mXN +dcE +dcE +pGP +sbp +sbp +aRc +kJI +mJI +pWi +tGm +upM +dkb +dkb +dkb +aEg +aim +wNN +dcE heR -heR -heR -heR +dcE eaV eaV eaV eaV eaV -rHU +sOV sNC nlt nlt nlt sNC -xYi +mRs eaV -tWn dcE +heR dcE dcE heR @@ -131437,19 +137344,19 @@ hRj hRj qKO rql -vTE -nUV hCm +mhP +awV lYr jSz -qKO +tas dft ruE -hbK -hbK +eNH +acc wNw -qKO -wUk +tas +hRj hRj hRj hRj @@ -131459,27 +137366,27 @@ hRj hRj hRj hRj -rKA -lfG -rEv -qSD -rFq -nwe -rKA -kmL -rKA -fkh -qHN -rKA -wju -qUq -rKA -eUh -bRl -rKA -cHq -sql -rKA +uAp +rFM +qOC +dns +imI +rRP +uAp +mJO +uAp +piC +qGe +uAp +kPD +oui +uAp +oym +fva +uAp +hLl +qAq +uAp heR dcE dcE @@ -131633,29 +137540,29 @@ dcE dcE dcE dcE +mXN +heR +heR +pGP +pGP +pGP +pGP +pGP +heR +pZJ +arc +fsy +dkb +gZi +dkb +aEg +inm +pZJ dcE +heR dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -mXN -mXN -mXN -mXN -xXv -kOx +mva +heR dcE dcE eaV @@ -131668,7 +137575,7 @@ sNC rRn eaV dcE -dcE +heR dcE dcE heR @@ -131683,7 +137590,7 @@ dcE dcE dcE dcE -dcE +kOx kOx qKO sON @@ -131695,48 +137602,48 @@ sON qKO lYr lYr -lYr -lYr -lYr +sfh +nGP +sfh jzH -qKO -qKO -pTP -pTP -pTP -qKO -qKO +tas +tas +xOh +xOh +xOh +tas +tas sON sON oCT sON sON -sON +oCT sON sON oCT sON -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -fyD -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA +uAp +uAp +uAp +uAp +uAp +uAp +uAp +uAp +uAp +uAp +uAp +uAp +oxC +uAp +uAp +uAp +uAp +uAp +uAp +uAp +uAp dcE dcE dcE @@ -131890,32 +137797,32 @@ dcE dcE dcE dcE +mXN dcE dcE +pGP +bxx +bxx +paE +rbl +clX +lcb +qeN +bZu +fQT +bLP +cwy +aEg +aim +wNN dcE +heR dcE dcE +heR dcE dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -kOx -dcE -dcE -aHc +gIQ sNC kLD nlt @@ -131925,7 +137832,7 @@ kLD sNC ipc dcE -dcE +heR dcE dcE heR @@ -131939,7 +137846,6 @@ dcE dcE dcE dcE -dcE kOx kOx dcE @@ -131949,6 +137855,7 @@ dcE dcE dcE dcE +dcE heR dcE dcE @@ -132081,29 +137988,8 @@ dcE dcE dcE dcE -"} -(188,1,1) = {" -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE +"} +(188,1,1) = {" dcE dcE dcE @@ -132167,12 +138053,33 @@ dcE dcE dcE dcE +heR +iWu dcE dcE +pGP +fuV +gZO +bhn +pQS +heR +wNN +aim +nTf +dkb +pDQ +dkb +qkn +kct +pZJ +heR +mXN +xXv +kOx kOx dcE dcE -ipc +gIQ sNC kLD fsQ @@ -132182,7 +138089,7 @@ kLD nWe ipc dcE -dcE +heR dcE dcE heR @@ -132195,9 +138102,9 @@ dcE dcE dcE dcE +mqw +mqw dcE -kOx -kOx dcE dcE dcE @@ -132287,7 +138194,7 @@ bWY bWY bWY bWY -jyP +bWY bWY bWY bWY @@ -132404,32 +138311,32 @@ dcE dcE dcE dcE +mXN dcE dcE +pGP +bxx +bxx +tZW +kJI +mJI +pWi +tGm +miY +ygK +ygK +ygK +geJ +aim +wNN dcE +heR dcE dcE +heR dcE dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -kOx -dcE -dcE -ipc +ggA tdx qWl nlt @@ -132439,7 +138346,7 @@ kLD nWe ipc dcE -dcE +heR dcE dcE heR @@ -132451,9 +138358,9 @@ dcE dcE dcE dcE +kOx +kOx dcE -mqw -mqw dcE dcE dcE @@ -132661,40 +138568,40 @@ dcE dcE dcE dcE +mXN +heR +heR +pGP +pGP +pGP +pGP +pGP +heR +pZJ +jEg +dra +sKs +mDs +dra +feM +cUj +wNN dcE +heR dcE dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -kOx -dcE -dcE -ipc -ipc -ipc -ipc -ipc -ipc -ipc -ipc -ipc +heR +heR +heR +eaV +gTP +rOW +rOW +rOW +rOW +rOW +rOW +eaV heR heR heR @@ -132707,9 +138614,9 @@ dcE dcE dcE dcE +mqw +kOx dcE -pkO -pkO dcE dcE dcE @@ -132918,40 +138825,40 @@ dcE dcE dcE dcE +mXN dcE dcE +heR dcE dcE dcE +heR dcE +pZJ +wNN +pZJ +pZJ +wNN +pZJ +pZJ +wNN +pZJ dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -kOx +heR dcE dcE heR dcE dcE +pJW +dcE dcE dcE dcE dcE dcE dcE +pJW dcE heR dcE @@ -132963,9 +138870,9 @@ heR dcE dcE dcE -dcE +xXv mqw -pkO +dcE dcE dcE dcE @@ -133174,30 +139081,30 @@ dcE dcE dcE dcE +dZJ +iWu +mXN +mXN +mXN +mXN +iWu +kOx +mXN +heR +fkd +heR dcE dcE +heR dcE dcE +heR +fkd +heR +heR dcE dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -kOx +heR dcE dcE heR @@ -133208,7 +139115,7 @@ dcE dcE dcE dcE -dcE +heR dcE heR dcE @@ -133219,9 +139126,9 @@ dcE heR dcE dcE -dcE xXv -mqw +xXv +dcE dcE dcE dcE @@ -133432,28 +139339,28 @@ dcE dcE dcE dcE +heR dcE dcE dcE dcE +heR dcE +mXN dcE +heR dcE dcE dcE +heR dcE dcE dcE +heR dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE +mXN +mXN +mXN kOx kOx kOx @@ -133462,11 +139369,11 @@ kOx kOx kOx kOx -dcE -dcE -dcE -dcE -dcE +kOx +kOx +kOx +kOx +iWu heR dcE dcE @@ -133474,8 +139381,7 @@ heR dcE dcE heR -dcE -dcE +iWu xXv xXv dcE @@ -133489,6 +139395,7 @@ dcE dcE dcE dcE +dcE uCR dcE dcE @@ -133696,13 +139603,19 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE -uCR -dcE +heR +heR +mXN +mXN +mXN +cXm +heR +heR +mXN +mXN +mXN +heR +heR dcE dcE dcE @@ -133718,12 +139631,6 @@ dcE dcE dcE dcE -kOx -kOx -kOx -kOx -kOx -iWu heR heR heR @@ -133731,9 +139638,9 @@ heR heR heR heR -iWu -xXv -xXv +dcE +dcE +dcE dcE dcE dcE @@ -133957,11 +139864,11 @@ dcE dcE dcE dcE +heR dcE dcE dcE -dcE -dcE +heR dcE dcE dcE @@ -134214,6 +140121,11 @@ dcE dcE dcE dcE +heR +mXN +mXN +mXN +heR dcE dcE dcE @@ -134234,15 +140146,10 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE -mGV -dcE heR dcE +xae +dcE heR dcE dcE @@ -136553,8 +142460,8 @@ dcE dcE dcE hcx -tLV whw +tLV gVs hcx dcE @@ -166390,8 +172297,8 @@ nlm nlm osV nlm -dcE -dcE +nlm +nlm mae mae jfB @@ -166649,7 +172556,7 @@ gRG gRG gRG gRG -gCn +jqQ sjT sdA lSe @@ -167158,8 +173065,8 @@ nlm gRG gRG uof -xkV -awD +uof +stm uof uof psI @@ -168224,7 +174131,7 @@ nlm nlm nlm qCR -qwn +qCR qwn qwn qwn @@ -168480,11 +174387,11 @@ nlm nlm nlm nlm -hxa -eMh -guF -dSG -nmF +xrx +cgK +jBW +vzk +kKe wua nlm nlm @@ -168737,10 +174644,10 @@ nlm nlm nlm nlm -dod +xrx cgK kfT -xvQ +cSH lAP xAQ nlm @@ -168994,11 +174901,11 @@ nlm nlm nlm nlm -dod -cgK -jBW +fir +sMv +hPZ cHv -wlg +buc xAQ dDL nlm @@ -169251,8 +175158,8 @@ nlm nlm nlm nlm -dod -jMU +xrx +laO qhs qhs qhs @@ -169996,7 +175903,7 @@ nlO iGy ohb rwh -eas +bxg sFc aCE pIt @@ -171027,8 +176934,8 @@ lji cOS jQA sVJ -kUq aVy +oHH sRh cUf oaa @@ -173106,11 +179013,11 @@ nlm iWu lrM hRj -iWu -mYo +hqz +rZi uCP -mYo -iWu +rZi +hqz hRj hRj lIr @@ -173363,11 +179270,11 @@ nlm iWu lrM hRj -iWu +hqz uah -oRp +xif boP -iWu +hqz hRj hRj lIr @@ -173579,8 +179486,8 @@ aad uCF sjx sjx -sjx -qsM +kuT +fhO bLN onV waz @@ -173625,11 +179532,11 @@ xiU inz xiU hqz -ygD -ygD -ygD -ygD -ygD +uIO +uIO +uIO +uIO +uIO txv txv wAk @@ -173814,7 +179721,7 @@ adC adC adC adC -jbh +adC fgT hdN cVm @@ -173882,11 +179789,11 @@ eXp dBp hmw kPq -ygD +uIO rnQ vZG vZG -ygD +uIO txv txv wAk @@ -174135,11 +180042,11 @@ nlD bsE hqz otz -pWF -pSx +xif +xif pWF kVP -ygD +uIO wiq vZG vZG @@ -174392,15 +180299,15 @@ nlD qsW hqz hmZ -pWF -pWF -pWF +xif +wLi +xif jjr fFl ptI qAC vZG -ygD +uIO txv txv wAk @@ -174650,14 +180557,14 @@ qsW hqz hqz umE -pWF -pWF +xif +gjA hqz -ygD -ygD -ygD -ygD -ygD +uIO +uIO +uIO +uIO +uIO txv txv wAk @@ -174906,8 +180813,8 @@ nlD qsW qsW kVU -iwS -pWF +vIr +xif pWF azn txv @@ -175101,7 +181008,7 @@ thW mMC lQe gPW -trH +gjH gjH uwj wMn @@ -175164,14 +181071,14 @@ nlD nlD nlD qzF +xif pWF -pWF -hqz -hqz -hqz -hqz -txv -txv +nfR +nfR +nfR +nfR +nfR +nfR txv txv wAk @@ -175420,15 +181327,15 @@ paY xyz dSS lca -iwS -pWF -pWF -hqz +vIr +fgK +qUQ +nfR wuo fHp -hqz -hqz -hqz +lRQ +cps +nfR wAk tce tce @@ -175675,17 +181582,17 @@ xyz xyz paY xyz -dSS +pPm gch iwS iwS iwS jtm -ltE -ltE +fIf +aBc mRn pJK -hqz +nfR wAk tce owU @@ -175934,15 +181841,15 @@ kUq kUq kUq kUq -pWF -pWF +fXW +xif pfp -hqz +nfR pWR jhW ltE bpU -hqz +gEc wAk wjw wdn @@ -176121,11 +182028,11 @@ uRd bOk aBl vXh +iGT +jlX +pqd +nMr wiK -inG -woh -eqp -oIk gqj nPN qBh @@ -176191,15 +182098,15 @@ kUq pjt pTE fjS +xif +xif pWF -pWF -pWF -hqz +uFl jCQ uXj -ltE +sIb myR -hqz +nfR mCc wjw eAX @@ -176378,11 +182285,11 @@ pev bOk qtM nbo -nli +ksr crj -xaP +bgs oxg -oIk +wiK bOk bOk iRH @@ -176414,7 +182321,7 @@ usP khG ugU ugU -dyg +ugU ugU usP gTp @@ -176431,17 +182338,17 @@ jkd jkd gXk gXk -hbc +sRD aJE kUq kUq xyz xyz rtO -jec -ggJ -jec -jec +dBz +lpW +dBz +dBz kUq kUq iSB @@ -176451,12 +182358,12 @@ riD qrd qrd qrd -hqz -bpU +uFl +bTq myD xRZ xJq -hqz +gEc wAk wjw pSK @@ -176635,11 +182542,11 @@ uRd bOk pLO rly -wTr +kpF mjc mjc yhK -ibw +nnD bOk bTF jBk @@ -176682,12 +182589,12 @@ lTH lTH vem riD -aJE -aJE -aJE -ucd -oHH -oHH +riD +riD +riD +ykx +kRN +riD hbc aJE aJE @@ -176695,10 +182602,10 @@ kUq kUq kUq kUq -mbK +liP kUq kUq -mbK +liP kUq sXU jkh @@ -176708,12 +182615,12 @@ riD qrd qrd qrd -hqz -pJK +uFl +eHa xMq -ltE +atE rnP -hqz +nfR wAk tce woV @@ -176892,11 +182799,11 @@ uRd bOk gyc ssT -sjQ +eEf mjc mjc jkq -rkf +gPz bOk uLb jBk @@ -176939,11 +182846,11 @@ gwK gwK gwK fbC +qEI +swX +qEI fbC -fbC -fbC -fbC -pEO +nXw pEO hbc jkd @@ -176951,26 +182858,26 @@ jkd mzT khm khm +khm +cOP +cOP vOg vOg -riD -vXU -xjL -aHD -pHq -sEt -tji +mbK +kuV +vpw +tTL vWj riD qrd qrd -qrd -hqz -hqz -hqz -ltE +uSa +nfR +nfR +nfR +icW opO -hqz +nfR jeA tce ftA @@ -177150,14 +183057,14 @@ bOk thB oZX iym -cxL -cxL -cxL -oIk +gpd +gpd +gpd +wiK bOk uJI jBk -hRX +yjM hBY taF tfK @@ -177184,34 +183091,34 @@ cba lgV xXY gNi -gNi +adq oVK nct sSw -gTp -gTp +kUO +kUO gTp lTH gTp -gTp -gTp +kUO +kUO eHu -qEI fYu -qEI +fYu +svC fbC -gtG +xda pEO odd -aJE -aJE -riD -bxZ +gdS +ygD +ygD bxZ -bmQ +ygD +ygD riD riD -jeD +cWc riD riD riD @@ -177223,11 +183130,11 @@ qrd qrd qrd lIr -goB -hqz +aOL +nfR pbp -hqz -hqz +nfR +nfR vyH vyH vyH @@ -177445,51 +183352,51 @@ pwB ghe uqy usP -gTp -gTp +kUO +kUO gTp lTH gTp -gTp -gTp +kUO +kUO eHu wOK hlt xpq fbC -xda +eUQ pEO riD riD -riD -riD -riD -riD -riD -xUJ +ygD +rXX +kjq +gKX +ygD +nRE kra -mUv +slI xes uoA dou -riD -riD -lEO +kUq +kUq +tTL pPO -tDc -tDc +iYe +fMd dnM ePT -vyH +wKe jmo -vyH +eXq vyH vyH vyH lIr lIr mCj -bPC +goB vyH lIr lIr @@ -177672,7 +183579,7 @@ opB fEW laD hRX -imo +knT cFa sGS hRX @@ -177702,13 +183609,13 @@ gNi kIz ttA usP -gTp -gTp +kUO +kUO gTp xmG gTp -gTp -gTp +kUO +kUO fbC fbC fbC @@ -177717,31 +183624,31 @@ fbC oTn rbx nRE -nRE -pEO -nRE +ouC +ygD +tbO +iWa +yhP +ygD nRE nRE -xUJ -yaU -iRV -iVk -uVX -rBd -oJr +plW +kyH +oam +ahf bfh -riD -riD -riD -hqz +kUq +kUq +kUq +ahf axN -hqz -lIr -lIr -lIr -lIr +ahf +kqv +kqv +kqv +kqv lIr -pcQ +wYX lIr lIr ejh @@ -177910,7 +183817,7 @@ hRj ixF sUx sUx -lfx +sUx sUx sUx bOk @@ -177934,7 +183841,7 @@ aqg nHt hRX jFI -cqj +qeX qeX qeX qeX @@ -177959,44 +183866,44 @@ tHr eBx ufo uwD -gTp -gTp +kUO +kUO gTp lTH gTp -gTp -gTp +kUO +kUO fbC ikc goR egF fbC vcf -xGG -nRE -nRE -pEO +hWt nRE -nqy nRE -xUJ -nDK -dsw -jKp -jKp -jKp -qlk +ygD +ygD +oMr +ygD +ygD +mTP +mTP +mTP +tVs +boz +ahf fFE -xUJ -kCp -kCp +amY +jqP +nqW cwO -nvn -dak -cDq +bCr +ahf +nJW cDq xxz -lIr +kqv uUD caU rqY @@ -178228,32 +184135,32 @@ peS fps xQR eHu -yly +xeM iby joC rDD pEO vtm eAO -nRE -omX -niv -dsw -jKp -jKp -jKp -qjU -eKH -omX -kCp -kCp -kCp -kCp -xxz -xxz -cDq -xxz -lIr +lfl +slI +slI +slI +slI +slI +pLq +qVY +icz +ntV +hmz +hmz +vSO +gLE +ahf +wHd +bdn +mxj +kqv vHV jYb wAk @@ -178481,36 +184388,36 @@ dUb dUb dfn fbC -fkP -smV +vCF +gjj xQR ccY een jmY -rfZ +tYN pmf dFd uZQ dKu feE -mwd -wnY -dsw jKp jKp +cAh jKp -koY -icz -omX -kCp -kCp -kCp -kCp -xxz -xxz -cDq -xxz -lIr +jKp +oam +ahf +pCX +hmz +hmz +hmz +vSO +vaj +ahf +pJP +vQj +xzn +kqv ygr vvt wAk @@ -178742,36 +184649,36 @@ kza xck qPB eHu -yly +xeM gTs dyA xar pQK sOa phy -pzQ -xyC -kWF -oZN -jIJ -jIJ -jIJ -ptC -qBj -xUJ -kCp -kCp -kCp -kCp -xxz -xxz -cDq -xxz -kqv -kqv -kqv +mXa +mwd +wnY +dsw +xyA +jKp +rBd +ahf +ujx +qRq +hmz +hmz +vSO +vSO +ahf +lLR +xqD +kMl kqv kqv +clb +clb +clb kqv kqv kqv @@ -178787,7 +184694,7 @@ lIr lIr lIr iIu -iIu +vAe lIr lIr drI @@ -178957,8 +184864,8 @@ spO hvX uii dYi -vua -dEN +nwK +fbq sbd pzb vNc @@ -178994,43 +184901,43 @@ dfn dfn dfn dfn -kDO -kDO -kDO -kDO -kDO +fbC +fbC +fbC +fbC +fbC eta -gTs +iaY pEO pEO pEO phh -voU -voU -xUJ -xUJ -jKT -avY -vNg -dXx -nPA -xUJ -xUJ -xxz -xxz -xxz -xxz -xxz -xxz -cDq -xxz +syD +slI +cAh +kWF +atf +jIJ +jKp +rBd +ahf +hAz +hmz +hmz +hmz +vSO +vSO +ahf +ahf +dAY +ahf kqv nlm nlm nlm nlm nlm -nlm +rZU kqv nvf uxA @@ -179047,13 +184954,13 @@ mCc mCc mCc lIr -uSs +bPC lIr mJL -uSs -uSs -uSs -mjV +bPC +bPC +bPC +xmK lIr hRj hRj @@ -179248,46 +185155,46 @@ qiH qiH qiH vAs -tWl +dqP dUb -dfn -jKX +dUb +xUJ osZ aWk uNY -jKX +sPc dxA pAn -pEO -kCp -voU -phh -voU -voU -voU -xUJ -xUJ -omX -omX -omX +wTP xUJ -xUJ -kCp -kCp -kCp -kCp -kCp -kCp -kCp +mfR +nRE +syD +geU +jKp +jKp +lle +jKp +jKp +fKA +ahf +hmz +hmz +hmz +hmz +gaa +exn +lrQ +loR nvn kCp kqv -rZU -rZU -rZU -rZU -rZU -nlm +fQp +ygq +ygq +ygq +ygq +fQp kqv ata lxl @@ -179304,12 +185211,12 @@ mCc mCc mCc lIr -uSs +bPC opu -uSs -uSs -uSs -uSs +bPC +bPC +bPC +bPC btc lIr hRj @@ -179482,7 +185389,7 @@ dUb fDE vuO hrD -hrD +hzY hrD hrD qQd @@ -179505,46 +185412,46 @@ dmp sAa wFt qiH +dfn dUb dUb -dfn -mrE +omX eTD vMP rto -jKX -wQH -rcM -jKX -jKX -gsq -phh -voU -voU -voU -voU -kCp -kCp -kCp -mHt -mHt -kCp -kCp -kCp -kCp -kCp -kCp -kCp -kCp -nvn -kCp -fQp -fQp -dsx -dsx -dsx -fQp +eWU +djn +pAn +fEf +xUJ +mfR +nRE +syD +pzQ +slI +slI +slI +slI +slI +pLq +qVY +suM +dQM +wWk +gaa +kYK +iDE +lml +hmz +hmz +cOr fQp +vkd +vkd +vkd +vkd +vkd +vkd fQp nah kqv @@ -179561,12 +185468,12 @@ mCc mCc mCc lIr -uSs +bPC lIr tda ith -uSs -qsv +bPC +uYR apM lIr hRj @@ -179748,7 +185655,7 @@ rih aXN qQd aiI -iaG +aiI aiI aiI kPQ @@ -179762,46 +185669,46 @@ wYJ sAa tel qiH +dfn dUb dUb -dfn -mrE +omX kPI -pUb +vMP xEU lYy -axn -cUi -mOx -jKX -voU -phh -leJ +pjk +pAn +hVx +xUJ +oam +aSg voU +wYy voU voU -kCp -kCp -mHt -mHt -kCp -kCp -kCp -kCp -kCp +pEO +plW +mGi +mHX +ahf +tMr +fRU +fRU +tan aBN -kYK -gRn -fGp -qgd +mVv +lml +hmz +hmz sFS fQp -iMu vkd vkd vkd vkd -fyE +vkd +vkd fQp rVM aXW @@ -179818,7 +185725,7 @@ lIr lIr lIr lIr -cfn +edf lIr lIr lIr @@ -179995,10 +185902,10 @@ dUb dUb fDE fOb +hqL hrD -hrD -hrD -hrD +hqL +hqL qQd qQd ndQ @@ -180019,46 +185926,46 @@ rsi vUQ nYn qiH +dfn dUb dUb -dfn -mrE -cik -vsY -gZq +omX +nde +nde +nde nde wwx ouo -uUK -jKX +wrn +xUJ +oam +aSg +tqg +uWI +wMX +cTU +aSg +aSg +aSg jKX -kXI -irh -jIf -jIf -irh -irh -xxz -xxz -xxz -buh -mHt -mHt +ahf +bun +fRX mHt rbF -wLe -hmz -hmz +kYK +iDE +lml +hYK hmz -oKI tJv fQp -fXB -vkd -vkd -vkd +cWL +jsy vkd vkd +jsy +cWL fQp fNS fIl @@ -180250,25 +186157,25 @@ quB sXd dUb dUb -fDE +uAn vuO -hqL -hrD -hqL -hqL +gNh +iis +lqB +mmP vzB mMb stv aFX -qVO -psk +cvP +eLU mpB -psk -psk +eLU +eLU rHS bot -psk -psk +eLU +eLU eLU rpB rpB @@ -180279,7 +186186,7 @@ rpB mJl mJl mJl -tey +xUJ aBy gAZ yfv @@ -180287,35 +186194,35 @@ nuU kwR gGJ geL -jKX +xUJ dIT -kXI +aSg gJp kqm lon wxb -ows -buh +aSg +xeD mKv -xxz -xxz -mHt -mHt -mHt -jam +jKX +pkS +vSO +vSO +hmz hmz +rhP +uHW +uFv hmz hmz -oyi -oKI ivL fQp -vbV -vkd +fXB vkd vkd vkd vkd +qjT fQp jMO dfi @@ -180499,7 +186406,7 @@ vsh vsh umH onj -vRc +hYd tsI umH oIv @@ -180514,57 +186421,57 @@ cbV pML miZ vzB -dGv -inh +kzf +sCx oLH fro tCY xiQ xdU -qVO -qVO -psk -psk -sLY -sLY -sCx -sCx -sCx -sCx -sCx cvP -dfn +cvP +eLU +eLU +nGV +dtL +qbq +mRj +oRH +jDB +wLm +dkm +dUb dUb dfn -djf +rde vCP vCP vCP -kSc vCP vCP vCP vCP -nRE -rKq -qHZ +kEB +dIT +aSg +gSd qHZ eGM mcC -jIf -buh -xxz +aSg +tPZ +mxl lIS -xxz -mHt -mHt -mHt -ptk +vSO +vSO +vSO hmz hmz -wzp +vSO +vSO +vSO +vSO hmz -qEj ruD fQp eDj @@ -180572,7 +186479,7 @@ tRR tRV oYs vkd -vkd +wZn fQp kPN kPN @@ -180742,12 +186649,12 @@ klB iEQ wVJ uRt -tGM +wCC bOk cQP sJR dZH -ggN +imN qeq sJR hyS @@ -180761,67 +186668,67 @@ ulM umH wDu pGn -uGT -sRG +fjl +dUb dUb fDE -fOb +lkj eRC cAW nOF prr vzB -rBE -inh +qWm +sCx oLH uxq izh iGI xCI uOx +trZ qVO -qVO -sLY -sLY +suQ sLY -sCx -sCx +nlk +bAo +ebK uDl -sCx -sCx -cvP -dfn -dfn +mDv +mDv +dkm +dUb +dUb dfn -djf +rde nRE nRE nRE -kSc nRE nRE nRE -nqy nRE -rKq -qHZ -qHZ +lUJ +sJt +aSg +sxZ +kVZ cBT lXD -irh +tQZ jxa buh -xxz -xxz -mHt -mHt -mHt -mDz +bwB +vSO +vSO +vSO hmz hmz -hYK +vSO +wzp +vSO +vSO hmz -qEj mUm fQp pvT @@ -180999,7 +186906,7 @@ ljc ljc ljc xqd -cHp +wCC bOk cQP sJR @@ -181012,17 +186919,17 @@ lgi ugn tfR umH -tdt +bsC dgD hcD wZN flY -xuQ +rHX dEo dUb dUb fDE -fOb +hRd qKS fIh xUa @@ -181031,60 +186938,60 @@ hZG tDf tDf dXp -inh -inh -hub +sCx +sCx +tKp sSc mUD rms qVO lvj -sLY -sLY -sCx -sCx -sCx -sCx -sCx -cvP -pkx +mPa +wVu +aVQ +pfO +uFo +mDv +ibo +wkb +sRG dUb dfn -djf +rde nRE unv nRE -kSc -nRE nRE -unv nRE nRE -rKq -qHZ -qHZ +unv +pKm +dIT +aSg +tQY +cjZ lMx ycm -jIf +rjI gSX -buh -xxz -buh -mHt -mHt -mHt -vzf +gHs +lIS +vSO +vSO +vSO hmz hmz +vSO +vSO +vSO +vSO hmz -gOC -hKP gyh fQp qZQ nCw bjK -lxX +aIU fWW fQp nHg @@ -181279,17 +187186,17 @@ umH dUb dUb fDE -fOb +hRd kfm dJF nPe mSa vzB -dGv -inh -oLH -inh -inh +kzf +sCx +xSq +sCx +sCx hub rwJ roy @@ -181298,40 +187205,40 @@ qVO tnf gNU txu -gNU -gNU -gNU -gNU -jeh -cvP -dfn +nAM +iRf +npf +gOp +mDv +dkm dUb dUb -pED -nRE -nRE -nRE -kSc -nRE -nRE -nRE -nRE -nRE -otf +dfn +pEO +pEO +rde +rde +rde +pEO +rde +pEO +sYh +bas +aSg gbb pgJ bZD -ycm -irh -gSX -buh -xxz +gdx +aSg +cXd +kQE +jKX stW -mHt -mHt -mHt +vSO +sGD +cxi wyx -hmz +eZT uEG bPr gih @@ -181536,14 +187443,14 @@ umH dUb dUb fDE -fOb +hRd lMy jnC hrD -hrD +jyd vzB qXl -inh +sCx alh uva giE @@ -181551,49 +187458,49 @@ hNZ nar tvN exS -qVO +iES nOe -jWP -hAC -hAC -hAC -hAC -jWP +iAw +xtC +umw +ejz +kxx +oVh mDv -cvP -dfn +dkm dUb dUb -dOG -dOG -djf -djf -djf -dOG -djf -djf -djf -dOG -otf -irh -irh -irh -irh -irh -xAu -xAu -xAu -xAu -xAu -xAu -xAu -xAu +jrz +fXP +afR +afR +afR +afR +afR +afR +pEO +pEO +pEO +aSg +aSg +btV +btV +btV +aSg +kyG +kyG +jKX +ahf +cwf +ahf cwf -xAu -xAu -xAu +ahf cwf -xAu +ahf +cwf +ahf +cwf +ahf fQp fQp fQp @@ -181788,7 +187695,7 @@ psC psC fhj gPE -psC +kzB dCY dUb dUb @@ -181800,25 +187707,25 @@ vzB vzB vzB dGv -inh +sCx mpl itw gcf cpy -sfn +gcf nwG hAt oLi -iRf -ivr +sNj +clZ rgj -mfO +kjn mfO mPP ivr -vCT +mDv dkm -htH +dUb dUb dfn wga @@ -181827,8 +187734,8 @@ afR afR afR afR -kIf -kIf +afR +wdd kIf kIf kIf @@ -182020,7 +187927,7 @@ nlm jMr ljc ljc -ucj +ljc ljc ljc ljc @@ -182056,8 +187963,8 @@ vzB vzB jvB wOr -dGv -inh +kzf +sCx wwf jJH xZp @@ -182065,7 +187972,7 @@ yeg jps jdg uwA -byR +dkm leu wzS ocL @@ -182073,11 +187980,11 @@ jSV jKo nnW aia -bVS -cvP -jyM -lqB -htH +mDv +dkm +dUb +iPl +dfn wga afR afR @@ -182085,7 +187992,7 @@ afR afR afR afR -kIf +wdd afR afR afR @@ -182313,11 +188220,11 @@ ybO pZX pZX pZX -dGv -inh +kzf +sCx qQf -dRk -rAL +vON +sfn jxk sfn gyw @@ -182325,14 +188232,14 @@ azx bcg jsh iRf -vkQ -mfS +erp +vlK mfS uow -jsh -ivD -cvP -dfn +jEo +mDv +dkm +dUb dUb dfn wga @@ -182342,7 +188249,7 @@ afR afR afR afR -kIf +wdd afR afR afR @@ -182542,64 +188449,64 @@ ljc ljc hFG ivh -dCm -dCm -dCm -trR -trR -trR -trR -trR -dCm -dCm -dCm -tdT -dCm -dCm -dCm -dCm -dCm -dCm -dCm +yaI +yaI +yaI +gpS +gpS +gpS +gpS +gpS +yaI +yaI +yaI +yaI +yaI +yaI +yaI +hJx +yaI +yaI +yaI dUb dUb dUb drX bvY -vzx +rbt xvN iJc pZX qWm -inh +sCx nGr afn iJn hiK lSL fLs -umw +azx qVO kDc -jWP -hAC -hAC -hAC +gKE +jNh +umw hAC +qII jWP -clZ -cvP -dfn +mDv +dkm dUb dUb +jrz uBj +jrD kIf kIf kIf -kIf -kIf +mEv ahO -sLC +wdd kIf afR afR @@ -182625,10 +188532,10 @@ wcN wcN wcN kVQ -mQh -mQh -mQh -wKb +kiS +kIf +kIf +upX nHg tjn tjn @@ -182799,7 +188706,7 @@ ljc ljc mND wCC -dCm +fMH nlm nlm nlm @@ -182808,30 +188715,30 @@ mDG cSg nlm nlm -dCm -dzI -mjN -dzI -dzI -thk -sPk -dqF -hVi -dCm +pRO +afu +afu +afu +tBs +xBP +tBs +afu +afu +pRO dUb dUb dUb drX pdr gOK -vzx +wwt aZo pZX -dGv -inh +kzf +sCx sYc -inh -inh +sCx +sCx asz gnt wfN @@ -182839,14 +188746,14 @@ cHP qVO pmX mxM -mxM -mxM -mxM -mxM -mxM -qpG -cvP -dfn +erp +eFq +iRf +jyM +gPP +mDv +dkm +dUb dUb gWM iHy @@ -182882,10 +188789,10 @@ bBV bBV kVQ kVQ -ubs -ubs -uKt -wKb +afR +afR +kIf +upX fHG tjn tjn @@ -183056,7 +188963,7 @@ ljc ljc mND wCC -dCm +fMH nlm nlm jph @@ -183065,47 +188972,47 @@ jph jph jph nlm -dCm -dzI -mjN -dzI -dzI -ffr -ozp -ozp -jWJ -dCm +pRO +afu +afu +afu +tBs +jap +tBs +tBs +tBs +pRO dUb dUb dUb drX doO -ebS -tUt +cuL +rfk nuz qGW irn oPM iTa -inh -inh +sCx +sCx asz sSc phd xYk qVO ixS -sLY -sLY -sCx -sCx -sCx -sCx -sCx -cvP -dfn +sLa +erp +erp +erp +erp +mDv +ibo +wkb dUb dUb +dfn jzM dyN dyN @@ -183139,10 +189046,10 @@ ujI ujI xnW kVQ -ubs -oQn -uKt -wKb +afR +afR +kIf +upX nHg nHg tjn @@ -183313,8 +189220,8 @@ dxf dxf asx wCC -dCm -pLQ +fMH +oDx dDL jph gYu @@ -183322,16 +189229,16 @@ cbm mIO jph dDL -dCm -ffr -ffr -ffr -ffr -ffr -ozp -ozp -naR -dCm +pRO +jap +jap +jap +jap +jap +tBs +afu +afu +pRO dUb dUb dUb @@ -183341,28 +189248,28 @@ aUO nYT pPX pZX -rBE -inh -oLH +qXl +sCx +pio pvC nfg czF pGf qyg +lZm qVO -qVO -sLY +sfR jBt -sLY -sCx -sCx -uDl -sCx -sCx -cvP -dfn +iRf +cmp +aBu +erp +mDv +mDv +dkm dUb dUb +dfn jzM dyN dyN @@ -183392,14 +189299,14 @@ fTs ujI ujI ujI -xjc +ujI ujI ujI kVQ -ubs -ubs -uKt -wKb +mQh +mQh +mQh +upX xpw nHg nHg @@ -183560,18 +189467,18 @@ nlm nlm nlm jMr -dCm -dCm -dCm -dCm -dCm -dCm -msm -dCm -dCm -dCm -dCm -dCm +fMH +fMH +fMH +fMH +fMH +fMH +tdH +fMH +fMH +fMH +fMH +fMH nlm jph oJj @@ -183579,16 +189486,16 @@ gQc tYl jph nlm -dCm -mjN -dzI -dzI -dzI -ffr -ozp -ozp -ozp -dCm +pRO +ifU +afu +afu +tBs +jap +tBs +afu +afu +pRO dUb dUb dUb @@ -183598,28 +189505,28 @@ uWi uWi uWi pZX -dGv -inh -oLH +kzf +sCx +pio lhn xjr xdG tPI -qVO -qVO -aVN -aVN -sLY -sLY -sCx -iFS -sCx -sCx -sCx cvP -dfn +cvP +tNW +tNW +yeo +ute +sFL +iFS +erp +vCT +ivD +dkm dUb dUb +dfn jzM dyN dyN @@ -183654,15 +189561,15 @@ ujI ujI kVQ uKt -ubs +oQn uKt -wKb -wKb -wKb -wKb -wKb -wKb -wKb +upX +upX +upX +upX +upX +upX +upX aGf nHg nHg @@ -183817,18 +189724,18 @@ nlm nlm nlm nlm -dCm -fYH -vMH -dzI -dzI -mtg -mjN -dzI -dzI -qmd -tmq -dCm +fMH +cmt +mNt +ulT +ulT +vGB +efc +ulT +ulT +kIL +hWF +fMH dDL jph etm @@ -183836,16 +189743,16 @@ ghb mtC jph dDL -dCm -gJi -dzI -dzI -dzI -ffr -ozp -ozp -giT -dCm +pRO +afu +afu +afu +tBs +jap +tBs +afu +afu +pRO sRG dUb dUb @@ -183855,25 +189762,25 @@ uWi uWi uWi pZX -tem +vre tem slS -aVN -aVN +tNW +tNW oMI -aVN -aVN +tNW +tNW oPY cEH -aVN -aVN tNW -cvP -cvP -cvP -cvP -cvP -cvP +tNW +qVO +qVO +qVO +gkB +wkb +wkb +wkb mJl mJl mJl @@ -183913,13 +189820,13 @@ kVQ uKt uKt uKt -wKb -tII -ktz -cTS -wKb -kiE -qSy +upX +kbY +srA +eUT +upX +vaR +kOo aGf nHg nHg @@ -184074,18 +189981,18 @@ nlm nlm nlm nlm -dCm -vGQ -xVZ -dzI -dzI -lzZ -yav -ffr -vDF -ffr -jyW -dCm +fMH +dwY +kas +ulT +ulT +uJF +nLt +tbg +osD +jVX +his +fMH nlm jph jph @@ -184093,16 +190000,16 @@ jph jph jph nlm -dCm -mjN -dzI -dzI -dzI -ffr -ozp -ozp -ozp -dCm +pRO +tBs +tBs +tBs +tBs +jap +tBs +afu +afu +pRO dUb dUb dUb @@ -184115,7 +190022,7 @@ dHL dHL rla dHL -dHL +qQd oOB oYE bQg @@ -184125,12 +190032,12 @@ ung gQR qom tNW -dsW -dsW +qVO +qol erp -dsW -dsW -rro +gts +qVO +dUb dfn dUb dUb @@ -184170,13 +190077,13 @@ kVQ uKt ubs uKt -wKb -grx -hRD -hRD -qSy -eEv -wKb +upX +brz +fTu +fTu +kOo +epH +upX aGf aGf aGf @@ -184331,18 +190238,18 @@ nlm nlm nlm nlm -dCm -dNw -xVZ -dzI -dzI -dzI -mjN -dzI -dzI -egr -jsD -dCm +fMH +bch +kas +ulT +ulT +ulT +efc +ulT +ulT +gmF +eoN +fMH nlm nlm dDL @@ -184350,16 +190257,16 @@ nlm dDL nlm nlm -dCm -mjN -mjN -mjN -mjN -ffr -ozp -ozp -ozp -dCm +pRO +afu +afu +afu +tBs +jap +tBs +tBs +tBs +pRO tWl dUb dUb @@ -184372,7 +190279,7 @@ dHL dXm qUG wnD -dHL +qQd jUb oYE ley @@ -184382,12 +190289,12 @@ aXZ uLN spC tNW -dsW -dUb -dUb -dUb +qVO +ivo +erp +jix +qVO dUb -rro dfn dUb dfn @@ -184427,31 +190334,31 @@ kVQ uKt ubs ubs -wKb -vYV -hRD -hRD -wKb -wKb -wKb -wKb -dkQ -wKb -wKb -dkQ -wKb -wKb -wKb -wKb -wKb -wKb -wKb -wKb -wKb -wKb -wKb -wKb -wKb +upX +xHC +fTu +fTu +upX +upX +upX +upX +nLZ +upX +upX +nLZ +upX +upX +upX +upX +upX +upX +upX +upX +upX +upX +upX +upX +upX nlm nlm nlm @@ -184588,48 +190495,48 @@ nlm nlm nlm nlm -dCm -dBe -qrS -ikZ -dXy -dXy -nzZ -dXy -aqQ -dCm -dCm -dCm -dCm -dCm -dCm -dCm -dCm -dCm -dCm -dCm -mjN -dzI -dzI -dzI -ffr -ozp -ozp -mWu -dCm +fMH +sOy +lBy +kPX +jJU +pva +wIN +jJU +oNH +fMH +fMH +fMH +pRO +pRO +pRO +pRO +pRO +pRO +pRO +pRO +afu +afu +afu +tBs +jap +tBs +afu +afu +pRO dUb dUb dUb drX uWi +jQw uWi uWi -uWi -nNj +dHL sVj uyn jni -nNj +qQd bNH rmB fpC @@ -184639,15 +190546,15 @@ npE jCO uHh tNW -dsW -dUb -dUb -dUb +qVO +qVO +nNj +qVO +qVO dUb -rro -dfn -dfn -dfn +htH +htH +htH iHy kpz dNP @@ -184658,7 +190565,7 @@ sFa jzM cwP cwP -gll +cwP cwP cwP vTI @@ -184684,25 +190591,25 @@ kVQ uKt ubs ubs -wKb -jlh -fCe -sZh -aFg -aFg -lbN -fpz -sZh -wKb -hlh -sZh -xjK -lfT -sZh -aFg -aFg -xjK -wKb +upX +ezz +uyG +ewu +vca +vca +sPr +jTG +ewu +upX +vPk +ewu +tdl +djM +ewu +vca +vca +tdl +upX rBU nnS bYZ @@ -184845,35 +190752,35 @@ nlm nlm hRj hRj -dCm -hEN -dGM -ikZ -ikZ -yem -dXy -ikZ -vsm -dCm -rNe -vqM -odE +fMH +vVt +xJZ +kPX +kPX +pNr +pva +kPX +pva +npo +nTy +mdW +pRO +jap +imi +imi +jap +imi +jap +pRO +pRO +pRO +pRO +qNG +pRO +pRO +pRO +pRO pRO -xlH -hmT -uHg -uok -aBV -dCm -vdN -dCm -dCm -dCm -dCm -tdT -dCm -dCm -dCm mJl mJl mJl @@ -184882,7 +190789,7 @@ drX drX drX drX -fNB +qQd qQd qQd qQd @@ -184896,15 +190803,15 @@ tNW tNW tNW tNW -qII -jQw -jQw -jQw -jQw -ghA -dfn dUb dfn +htH +htH +htH +htH +htH +dUb +htH jzM cjE oca @@ -184912,7 +190819,7 @@ ctb ctb sSs muN -jzM +xkV cwP cwP cwP @@ -184941,25 +190848,25 @@ kVQ rey ubs ubs -wKb -sZh -aFg -aFg -aFg -aFg -lbN -fpz -sZh -wKb -xjK -sZh -sZh -ccy -sZh -sZh -sZh -sZh -wKb +upX +ewu +vca +vca +vca +vca +sPr +jTG +ewu +upX +tdl +ewu +ewu +nfO +ewu +ewu +ewu +ewu +upX cgg hRj lkP @@ -185102,44 +191009,44 @@ nlm nlm hRj hRj -dCm -iyx -upl -nzZ -dXy -ikZ -dXy -tah -uyb -dCm -nDB -xCt -tms -pRO -hJL -mMx -cWG -kdG -hfz -pRO -nUB +fMH +frc +edm +ppe +jJU +kPX +jJU +gNR +wWg +fMH +pDi +rNe +sxh +dhZ +dhZ +dhZ +dhZ +dhZ +dhZ +sxh +eeg afu afu -ech +dVd +wBd afu +dhZ jap sxh -jap -afu dUb dUb dUb fkM dUb -xce +sym +dUb dUb dUb -htH dUb fkM dUb @@ -185153,13 +191060,13 @@ dfn dfn dfn dUb -ukT dUb -dfn -dfn +dUb oKw dfn -dfn +dUb +dUb +dUb dUb dUb jzM @@ -185198,25 +191105,25 @@ kVQ uKt ubs uKt -wKb -gdP -aFg -aFg -aFg -aFg -lbN -fpz -aQa -wKb -aQa -sZh -daw -ilB -sZh -aFg -sZh -aFg -wKb +upX +sSy +vca +vca +vca +vca +sPr +jTG +wmX +upX +wmX +ewu +ipY +wyl +ewu +vca +ewu +vca +upX lgv rfI htn @@ -185359,44 +191266,44 @@ nlm nlm hRj hRj -dCm -aNg -ebA -hcL -nzZ -oTp -xYa -eHz -rcs -dCm -oeR -cRk -wDf -pRO -rPs -jZL -oCs -aLW -kdG -hik -fmN -afu -qDi -afu -afu -jap +fMH +tsA +uaH +izP +wIN +kYz +cka +boF +sau +fMH +vJD +pDi sxh +tBs +tBs +tBs +xLl +tBs +tBs +sxh +eeg +uKO +dhZ +dVd +tBs +tBs +tBs jap -afu +sxh dUb dUb dUb dUb dUb +dsW dUb dUb dUb -htH dUb dUb dUb @@ -185434,7 +191341,7 @@ avZ xOy gaM ozt -fEU +cSD cSu soU soU @@ -185455,25 +191362,25 @@ vvD gsm gsm gsm -cWU -cWU -cWU -cWU -cWU -cWU -cWU -cWU -cWU -pAH -pAH -pAH -pAH -cWU -cWU -aFg -sZh -aFg -wKb +gUI +gUI +gUI +gUI +gUI +gUI +gUI +gUI +gUI +lRX +lRX +lRX +lRX +gUI +gUI +vca +ewu +vca +upX gep jAo lbD @@ -185614,46 +191521,46 @@ nlm nlm nlm nlm -dCm -dCm -dCm -dCm -dCm -dCm -hSv -dCm -dCm -dCm -dCm -dCm -sFZ -jwu -eaT +fMH +fMH +fMH +fMH +fMH +fMH +qZx +fMH +fMH +fMH +fMH +fMH +pDi +rNe pRO -wFj -ojZ -auA -fUJ -uxz pRO -tZV -afu +pRO +pRO +pRO +pRO +pRO +pRO +eeg afu afu +dVd +dhZ afu +dhZ jap sxh -jap -afu dUb dUb dUb dUb dUb +dsW dUb dUb dUb -htH dUb dUb dUb @@ -185721,16 +191628,16 @@ fHc kwQ mHd wfY -pAH +lRX aut gqz -pAH -mqb -cWU -dfO -sZh -sZh -wKb +lRX +dDx +gUI +rPh +ewu +ewu +upX jtE eCy hRj @@ -185883,38 +191790,38 @@ rNe rNe rNe bPW -chI -ylO -mkq +xKJ +rNe pRO +xYC +fQG pRO -iRF +qlj +dch +cVq pRO +vYq +afu +afu +dVd pRO pRO pRO -wiZ -afu -afu -afu -dCm -dCm -dCm -dCm -dCm -sSR -gVi -ivI -gVi -tEY -aTH -dCm -kYe -nUk -kTq -bvZ +pRO +pRO +pRO +pRO +tmT +vuC +tmT +pRO bvZ -tUd +opV +kKB +huv +gSh +nXB +tni tPU xSz xSz @@ -185961,7 +191868,7 @@ iDR kWr hkD kmJ -kou +eiu hMs nTe ljx @@ -185981,13 +191888,13 @@ lJo kMj geC geC -cWU -ncF -cWU -sZh -aFg -sZh -heC +gUI +tTx +gUI +ewu +vca +ewu +mMs jtE eCy hRj @@ -186140,38 +192047,38 @@ kow jCE rNe ixf -mkq -ylO -ylO +pDi +rNe pRO -uHY -jrp -iem -wZb -pIf pRO -kvo -afu +jOJ +pRO +xzr +sEV +aJA +pRO +eeg afu afu -dCm -wIW -dXy -dXy -dCm -fxp -dXy -dXy -dXy -dXy -heq -dCm -pnd -hxJ -fLC -dyQ -eOh -wzM +dVd +pRO +qaH +lJK +pRO +pbE +gyi +pRO +bEV +nFp +mgT +tGg +aSH +pzr +lEd +sjz +jNu +mLP +hwe tPU jPa paf @@ -186238,13 +192145,13 @@ jwB etN atm wgp -cWU -ncF -cWU -dlk -aFg -sZh -heC +gUI +tTx +gUI +jpZ +vca +ewu +mMs jtE eCy hRj @@ -186397,37 +192304,37 @@ rNe gxO rNe ixf -mkq -xHP -jvM +pDi +pDi +axj pRO -qJn -ihF -kdG -kdG -wsR +pOu +czG +iPx +sux +ekw +hua +tDh +cKK +cKK +mHv pRO -soH -afu -afu -afu -dCm -dCm -dCm -dXy -dCm -tAV -dXy -dCm -dCm -dCm -dCm -dCm -dCm -dCm -tPU +pBw +vYN +pRO +fDH +nfd +pRO +hsg +mkt +vxr +vxr +vxr +vxr +vxr +vxr tPU -bSe +dsN tPU tPU jPa @@ -186495,13 +192402,13 @@ ahC cFb iEf bhU -cWU -ncF -cWU -dfO -aFg -sZh -wKb +gUI +tTx +gUI +rPh +vca +ewu +upX jtE eCy hRj @@ -186636,10 +192543,10 @@ nlm nlm nlm gMO -vEX +lgt wux nNC -wua +xBd nlm dDL ixf @@ -186654,38 +192561,38 @@ rNe gxO rNe ixf -ylO -mbC -jvM +pDi +rNe +eBF pRO -rPs -jZL -oCs -aLW -kdG -ios -fmN -afu -afu -afu -dCm -lKb -nzZ -dXy -dCm -dXy -dXy -rga -roj -tVI -roj -ewY -roj -fso -xPj -rBP -bam -sKO +pfY +viF +uPj +iMO +dPM +pRO +lOf +eNg +eNg +eCF +pRO +tGO +neh +pRO +neh +nOm +pRO +vfe +laC +vxr +krM +nAx +rPg +nnX +udV +hLe +cCb +fUy tPU jPa paf @@ -186752,13 +192659,13 @@ mdO nTB jdB wgp -cWU -ncF -cWU -sZh -aFg -sZh -heC +gUI +tTx +gUI +ewu +vca +ewu +mMs jtE eCy hRj @@ -186893,12 +192800,12 @@ nlm nlm nlm gMO -sxx -dDO +kMd +vEX nRP xBd tSA -nhh +tSA bPW rNe rNe @@ -186911,38 +192818,38 @@ kow wvK rNe bPW -owz -jvM -jvM +pDi +rNe pRO -oJK -ojZ -auA -fUJ -vMG pRO -fmN -afu +pRO +pRO +pRO +pRO +pRO +pRO +aLG afu afu -dCm -nGI -dXy -dXy -rga -dXy -nzZ -dCm -roj -dCm -dCm -dCm -vYI -gFW -tPU -iML +dVd +pRO +pRO +cKa +pRO +ocW +pRO +pRO +xgK +fdN +vxr +wEK +lpX +wEK +nnX +vxr +wdF iOK -vrx +npt tPU itK paf @@ -187009,13 +192916,13 @@ gnK kMj geC geC -cWU -xib -cWU -fGT -aFg -sZh -heC +gUI +aTB +gUI +enA +vca +ewu +mMs jtE dDL nlm @@ -187150,10 +193057,10 @@ nlm nlm nlm gMO -dSy -fLD -lrW -wua +urL +rGq +wFm +waY nlm tSA ixf @@ -187168,39 +193075,39 @@ rNe gxO rNe ixf -ylO -jvM -mbC -pRO -pRO -iRF -pRO +pDi +rNe pRO +rXj +bvJ pRO +hgb +bkr +afA pRO -mip -afu +aLG afu afu -dCm -rCP -dXy -hmM -dCm -dCm -dCm -dCm -lHi -dCm -tsR -jVB -jVB -jVB -jVB -jVB -jVB -jVB -jVB +dVd +xgK +foi +laC +kaq +laC +vfe +hVd +bmw +mWg +vxr +rai +vxr +vxr +vDu +vxr +vxr +vxr +vxr +vxr jPa paf paf @@ -187261,18 +193168,18 @@ tpe kwe mIK pMY -cWU -xWM -cWU +gUI +qPf +gUI jqw qGZ -cWU -nFE -cWU -dfO -aFg -dlk -wKb +gUI +okt +gUI +rPh +vca +jpZ +upX jtE dDL nlm @@ -187409,7 +193316,7 @@ nlm nlm vlH vlH -vlH +qCR nlm nlm tSA @@ -187425,39 +193332,39 @@ rNe gxO rNe ixf -ylO -jvM -xHP +pDi +rNe pRO -gCQ -tAr -ekk -bJs -bJs pRO -fmN -afu +jOJ +pRO +uAX +sEV +wYb +pRO +aLG afu afu -idM -idM -idM -idM -idM -dll -wSW -dCm -roj -dCm -lRz -jVB -qJB -teV -mwL -aii -uzu -eZC -jVB +dVd +xgK +vfe +laC +laC +bEA +bEA +xCV +bmw +yfJ +vxr +nnX +sWX +vxr +vxr +vxr +bTl +oSV +wRQ +vxr jPa paf paf @@ -187511,25 +193418,25 @@ arT gsm gsm gsm -cWU -cWU -cWU -cWU -oVg -fKJ -cWU -cWU -wKb -cWU -cWU -cWU -cWU -cWU -cWU -fvG -wKb -wKb -wKb +gUI +gUI +gUI +gUI +asU +rzu +gUI +gUI +upX +gUI +gUI +gUI +gUI +gUI +gUI +dzn +upX +upX +upX jtE dDL nlm @@ -187682,40 +193589,40 @@ kow vpd rNe ixf -mkq -ylO -ylO -pRO -lbW -srx -bJs -sVb -bJs +pDi +pDi +eBF pRO -uId +pOu +czG +iPx +sux +ekw +wIo +aLG afu afu -afu -idM -uNn -tMS -jlo -idM -qNW -orb -dCm -roj -dCm -aMz -jVB -dul -kVj -tSw -eZC -gZu -imd -jVB -sQZ +dVd +pRO +pRO +lPI +pRO +pwj +pRO +vxr +jMC +vxr +vxr +olH +tQq +srh +hJc +srh +tQq +rPg +dyu +vxr +jPa paf paf shs @@ -187768,25 +193675,25 @@ arT gsm ubs uKt -wKb -aFg -aFg -aFg -vyt -oxe -gTX -heo -aFg -aFg -wKb -sZh -sZh -sZh -izp -hRD -hRD -iYZ -wKb +upX +vca +vca +vca +jgD +mLp +dqZ +tCh +vca +vca +upX +ewu +ewu +ewu +qLQ +fTu +fTu +oXp +upX jtE dDL nlm @@ -187939,39 +193846,39 @@ rNe rNe rNe bPW -rWH -ylO -ylO +xKJ +rNe +pAp pRO -eIR -ugM -qSs -paI -bJs -wEn -fmN -afu +ovJ +viF +uPj +iMO +rVA +pRO +aLG afu afu +dVd +pRO +qKY +gMW +pRO +gMW +neN +vxr +egg +olH +vxz +jRq +wNR idM -klx -xvD -tTG idM -iTE -doH -mQS -roj -dCm -dJR -jVB -mwL -kVj -qJB -eZC -ylo -eZC -jVB +idM +vxr +uVb +vxr +vxr jPa paf paf @@ -188025,25 +193932,25 @@ arT gsm ubs ubs -wKb -wKb -wKb -wKb -vyt -wKb -wKb -cbq -hLp -hLp -wKb -sZh -aFg -aFg -aFg -aFg -aFg -aFg -wKb +upX +upX +upX +upX +wgq +upX +upX +pwY +pBm +pBm +upX +ewu +vca +vca +vca +vca +vca +vca +upX jtE dDL nlm @@ -188184,51 +194091,51 @@ nlm nlm nlm tSA -gGB -dCm -dCm -dCm -dCm -dCm -hwU -dCm -dCm -dCm -dCm -dCm -mmb -qCj -lMS +cZI +vxr +vxr +vxr +vxr +vxr +eOf +vxr +vxr +vxr +vxr +vxr +nTy +mdW pRO -dHS -tSa -eRm -bJs -jeX pRO -eza -afu -afu -afu +pRO +pRO +pRO +pRO +pRO +pRO +fOc +dhZ +dhZ +dVd +pRO +kml +vYN +pRO +fDH +ipr +vxr +mIE idM -vqq -giB -iJN idM -xuy -qNW -dCm -roj -dCm -dJR -jVB -lgF -lgF -jVB -lgF -pKJ -jVB -jVB +idM +idM +idM +uuD +idM +idM +hEu +fNP +biI jPa paf paf @@ -188286,21 +194193,21 @@ ewD wsv eTG ewD -xFw -baF -wKb -sZh -sZh -sZh -wKb -sZh -aFg -aFg -aFg -aFg -aFg -aFg -wKb +aOo +qIZ +upX +ewu +ewu +ewu +upX +ewu +vca +vca +vca +vca +vca +vca +upX jtE dDL nlm @@ -188419,73 +194326,73 @@ nlm nlm nlm nlm -heR -dbT -pmx -dbT -pmx -dbT -pmx -heR -heR -dcE -heR -heR -heR -heR -heR -heR -dDL +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm nlm nlm nlm nlm tSA -qqY -hRj -dCm -jda -dCm -qzB -dXy -ecP -ecP -cNl -tAV -dCm -dCm -vMs -dCm -dCm -dCm -doL -dCm -dCm -dCm -dCm -afu -afu +tLP +vxr +gfd +wrb +vxr +qoL +rPg +qUo +bAf +dEr +qZy +vxr +vxr +gOv +vxr +ssX +xED +pRO +ekk +aLA +fpf +pRO +aLG afu afu +dVd +pRO +qaH +pZd +pRO +wZk +gyi +vxr +mFv idM +jaI +lgC +sjy idM +qsr +wWM idM -idM -idM -dCm -dCm -dCm -rGw -dCm -dJR -qkM -nSp -nSp -xmQ -mDk -twC -gpJ -cdi +hEu +bSg +elH jPa paf eqt @@ -188543,21 +194450,21 @@ ewD iFx ssV iPX -xFw -xzm -wKb -wKb -wKb -wKb -wKb -sZh -aFg -aFg -aFg -aFg -aFg -kbR -wKb +aOo +kuL +upX +upX +upX +upX +upX +ewu +vca +vca +vca +vca +vca +vbZ +upX ekn itl itl @@ -188676,74 +194583,74 @@ nlm nlm nlm nlm -dbT -mZo -mZo -mZo -mZo -mZo -mZo -pmx -heR -dcE -heR -wJJ -wJJ -wJJ -wJJ -wJJ -dDL nlm nlm nlm nlm -xrx -qqY -hRj -dCm -dCm -dCm -dXy -dXy -nYR -dXy -wsc -qPw -ecP -ecP -hqi -ecP -dCm -nit -eKc -dCm -pRx -lAE -dCm -afu -afu -afu -afu -dCm -ecP -lai -fNG -dCm -sgG -sgG -sgG -sgG -dVe -sgG -sMw -lYT -twC -twC -twC -tzO -rPK -cdi -sQZ +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +tSA +ixj +lWS +lRD +tQq +aqE +mAa +vgX +tpR +rPg +xTJ +nAx +vxr +vDv +rPg +vxr +vxr +pSk +pRO +xQg +dmC +uvx +nKE +mmO +jba +hgJ +vze +vxr +vxr +vxr +vxr +vxr +vxr +vxr +mIE +oFo +jaI +jaI +nIa +eWn +nIa +hMS +idM +hEu +fWL +biI +jPa paf jPa shs @@ -188800,21 +194707,21 @@ ewD fTA eUV ewD -eEv -eEv -eEv -eEv -eEv -eEv -eEv -sZh -aFg -aFg -aFg -aFg -aFg -aFg -wKb +epH +epH +epH +epH +epH +epH +epH +ewu +vca +vca +vca +vca +vca +vca +upX hRj hRj hRj @@ -188933,73 +194840,73 @@ nlm nlm nlm nlm -aDp -mZo -mZo -mZo -mZo -mZo -mZo -mZo -mrg -dcE -heR -wJJ -qeQ -qeQ -qeQ -wJJ -heR -heR -dDL -dDL -dDL -xrx -qqY -lrM -spK -roj -nxi -roj -hAh -ikK -tSE -dDq -cDA -roj -roj -hye -roj -iDw -dDq -dDq -jxj -sgG -sgG -dCm -dCm -dCm -dCm -dCm -dCm -gYY -dCm -dCm -dCm -sgG -dXy -dXy -oce -dXy -fIg -qkM -rnh -miE -wIl -ewf -wiA -jrb -cdi +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +waY +xIW +gVf +jbr +dTa +paZ +vfj +vyu +vUN +vUN +vUN +kwV +caK +vUN +yme +tBb +vxr +qHz +njf +njf +hop +kyp +vxr +vxr +emb +vxr +vxr +vxr +caB +nXh +caB +caB +nXh +mIE +egg +idM +bbX +jCS +pEm +idM +xym +bYt +idM +hEu +tua +biI jPa jPa jPa @@ -189056,22 +194963,22 @@ ubs ewD xCu vAg -cWU -cWU -cWU -cWU -cWU -sIn -eEv -siG -sZh -aFg -aFg -aFg -aFg -wlF -fMe -wKb +gUI +gUI +gUI +gUI +gUI +nyh +epH +eIq +ewu +vca +vca +vca +vca +xQr +qoB +upX hRj hRj hRj @@ -189190,73 +195097,73 @@ nlm nlm nlm nlm -heR -tWI -tWI -tWI -tWI -tWI -tWI -tWI -jyv -dcE -heR -wJJ -qeQ -qeQ -qeQ -wJJ -shx -pPu -pPu -pPu -pPu -shx -hRj -hRj -dCm -dCm -dCm -dCm -dCm -dCm -dXy -bNY -hMc -ojr -ojr -dDq -ojr -kHj -rCP -nGI -ecP -ecP -sgG -wul -sgG -sgG -sgG -sgG -sgG -sgG -sgG -sgG -xmx -exM -fqz -sOl -slP -fqz -rBo -cdi -cdi -cdi -cdi -cdi -cdi -cdi -cdi +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +xrx +jGG +jGG +jGG +jGG +jGG +jGG +unL +nOK +oit +rcc +wRQ +kYk +bSg +xSL +kwV +vxr +aDk +eKL +hFW +rxy +oGX +vxr +vUN +uwr +hkO +vep +gcT +caB +rPg +iGu +vxr +pCB +vxr +jGG +idM +omF +jBV +idM +idM +idM +idM +idM +vxr +vxr +vxr paf iFC paf @@ -189306,30 +195213,30 @@ uKt kKw uKt uKt -uKt +mQh gsm ubs ubs -wKb -weJ -cWU -cWU +upX +weM +gUI +gUI eeb mbP qYB -cWU -cWU -xJI -wKb -wKb -wKb -wKb -wKb -wKb -uQH -hBS -wKb -wKb +gUI +gUI +tsp +upX +upX +upX +upX +upX +upX +eot +eFE +upX +upX hRj hRj hRj @@ -189447,70 +195354,70 @@ nlm nlm nlm nlm -heR -tWI -aDp -uUH -aDp -uUH -aDp -uUH -jyv -dcE -heR -wJJ -rad -tOE -rOG -wJJ -shx -tlf -wCm -lqv -ejA -shx -hRj -hRj -hRj -hRj -hRj -hRj -hRj -dCm -eEN -wIW -hkm -hkm -hkm -qhP -hkm -hkm -dCm -dCm -dCm -dCm -dCm -dCm -dCm -dCm -dCm -dCm -gGB -dCm -dCm -dCm -dCm -paf -paf -paf -paf -paf +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +xrx +kbu +txF +jya +eSI +hnO +jGG +jGG +jGG +jGG +jGG +jGG +jGG +rPg +xSL +kwV +vxr +vxr +vxr +vxr +vxr +vxr +vxr +kwV +mfF +uCO +uCO +flK +vxr +vxr +vxr +vxr +tkX kdR -uGj -jPa -jPa -jPa -qGa +kdR +kdR +tkX +tkX +uUg +tkX +tkX +tkX +tkX tLo paf paf @@ -189563,7 +195470,7 @@ ubs ubs ubs ubs -uKt +mQh gsm gsm gsm @@ -189704,70 +195611,70 @@ nlm nlm nlm nlm -heR -aDp -syR -syR -syR -syR -mrg -bWY -jyv -shx -shx -wJJ -eBf -pPu -eBf -wJJ -shx -pJf -jBB -yeH -evH -shx -hRj -hRj -hRj -hRj -hRj -hRj -hRj -hkm -hkm -hkm -kOk -dUH -fHk -vpi -fHk -kOk -hRj -hRj -dDL -dDL -heR -heR -heR -heR -heR -dCm -qLZ -ffr -ohJ -dzI -dCm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +xrx +kbu +psU +dyM +rVb +iub +unl +eZC +lBD +kjg +rtL +qFS +jGG +rPg +rPg +vUN +vUN +vUN +vUN +vUN +vUN +vUN +vUN +kwV +wkn +uCO +uCO +oXB +vxr +utv +uCO +vxr paf paf paf paf paf -kdR +jPa paf paf paf paf -jPa +tkX paf paf paf @@ -189820,7 +195727,7 @@ ubs ubs ubs ubs -uKt +mQh ubs ubs ubs @@ -189961,76 +195868,76 @@ nlm nlm nlm nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +slL +slL +slL dDL -dDL -dDL -dDL -dDL -shx -pPu -shx -xaT -shx -pKc -aMs -aMs -peo -mmM -qJu -shx -ncT -ewx -jBB -iUo -shx -kOk -kOk -kOk -hdi -hdi -hdi -hdi -kOk -kOk -qTk -dBG -knN -knN -knN -knN -kOk -hdi -hdi -hdi -hdi -hdi -hdi -hdi -hdi -hdi -kOk -uYX -kOk -lUM -kOk -kOk -kOk +xtW +xrx +kbu +orR +dyM +edC +mPx +unl +eZC +qJB +kVj +mwL +hYl +jGG +jGG +jGG +jGG +jGG +jGG +jGG +jGG +jGG +jGG +jGG +jGG +hUg +jGG +jGG +jGG +jGG +mch +jGG +jGG +vwg paf paf eaf paf -kdR -paf +jPa paf paf paf -jPa -jPa -jPa -jPa -jPa -jPa -jPa +tkX +tkX +cnw +cnw +cnw +cnw +cnw +cnw jPa paf paf @@ -190077,7 +195984,7 @@ ubs ubs ubs uKt -uKt +mQh uKt ubs ubs @@ -190218,76 +196125,76 @@ nlm nlm nlm nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm slL -dcE -heR -qHf -qHf -shx -fVM -sTS -fVM -nfE -lyd -chG -chG -chG -chG -wdu -qvw -iPL -sGR -sGR -hig -shx -dJn -oOs -oOs -oOs -oOs -oOs -oOs -iTB -mQT -oOs -oOs -oOs -oOs -oOs -oOs -oOs -oOs -oOs -oOs -anJ -oOs -oOs -oOs -oOs +slL +dDL +dDL +dDL +nlm +nlm +unl +unl +unl +xAC +suI +bBq +iub +unl +eZC +kVj +kVj +tSw +hYl +iHr +uFe +rvo +cbA +jVB +wPp oOs -hUw -ppX -mGO -rLz -xfj -dtC -fzS +aoY +qww kOk +jBJ +lnZ +fTa +aQO kOk +mze +ohi +uDx +weC +lDI kOk kOk -fnD +rDG kOk -cWU -wKb -wKb -qzb -wKb -wKb -wKb -wKb -wKb -dkQ +kOk +mAH +kOk +fTV +ksJ +fYG +ksJ +ksJ +ksJ +ksJ +ksJ +ksJ +dgl euG euG pJR @@ -190298,11 +196205,11 @@ cjh cjh cjh mus -dJC -mus +cXX mus -dJC mus +cXX +riN mus cXX mus @@ -190311,53 +196218,53 @@ gpO mHf mHf mHf -rKA -rJJ -rKA -rKA -rKA -rKA -rKA -rKA -rKA -daz -rKA -rKA -rKA -rKA -rKA -rKA -eij -hKh -cLq -cLq -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -evO -evO +wrT +vCG +wrT +wrT +wrT +wrT +wrT +wrT +wrT +hHi +wrT +wrT +wrT +wrT +wrT +wrT +aSk +omU +gKq +gKq +wrT +wrT +wrT +wrT +wrT +wrT +wrT +wrT +wrT +hdV +hdV rkB lmT uBq -evO -evO -rKA -rKA -rKA -rKA -rKA -rKA -rKA -qxE -qxE -rKA -rKA +saT +saT +blF +blF +blF +blF +blF +blF +blF +inv +inv +blF +blF hRj hRj hRj @@ -190475,76 +196382,76 @@ nlm nlm nlm nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm slL -dcE -heR -iVT -duQ -jCJ -fVM -fVM -uBv -wtd -aMs -wdu -iWM -aMs -aMq -iOk -aMs -aMs -ccV -hja -uuo -shx -eSh -vel -vel -vel -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -gSY -iov -iov -kFS -iov -hWk +nlm +nlm +nlm +dDL +nlm +nlm +kbu +pcM +uMG +jOm +dCs +kox +iub +unl +eZC +mwL +kVj +qJB +jRQ +jjp +xMf +pRB +ifk +lXl +kSk +bAW +hHj +aAn +oOs +oOs +iKA +oOs +oOs +ipL +oOs +mGO cCM cCM -iak -fzS -ljh +eAh +kNc cCM cCM -oWN -kSL cCM cCM -aFg -cWU -tub -wKb -lKZ -ebM -mgM -wKb -rRW +sUW +cCM +cCM +fTV +nwH +oxH +ksJ +jem +duw +vZH +ksJ +hrC euG uAZ xDY @@ -190554,67 +196461,67 @@ euG sby jkW lRd -oTd -nUo -oTd -oTd +vAh +oJd avc -oTd -oTd avc -oTd -iju +avc +avc +avc +vAh +vAh +jkG qaI qiY bHb mHf -wcV -kFa -pIV -rKL -rKL -rKA -wcV -wcV -wcV -rMj -wcV -wcV -jip -wcV -rKA -rKL -pRm -rKL -rKL -rKL -wcV -rKL -rKA -www -dTi -rMj -rMj -ehO -pIV -xgb -evO -evO -mbv -evO -evO -wAW -rMj -pIV -wcV -wcV -wcV -pIV -rMj -wcV -wcV -fgg -rKA +sfc +vmk +avI +sfc +sfc +wrT +sfc +sfc +sfc +bJo +sfc +sfc +uzi +sfc +wrT +lwA +cCo +lwA +lwA +lwA +sfc +lwA +wrT +oyS +djX +bJo +bJo +kzy +avI +szA +hdV +saT +tUn +saT +saT +ugw +sOm +fGg +duC +duC +duC +fGg +sOm +duC +duC +lpA +blF hRj hRj hRj @@ -190732,76 +196639,76 @@ nlm nlm nlm nlm -slL -dcE +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm dDL -qHf -qHf -shx -buP -fVM -fVM -rDm -wKI -iWA -gqb -wdu -wdu -iOk -aMq -aMs -aMq -raa -bWC -shx -rqm -fMu -fMu -fMu -auP -fMu -qRb -fMu -oXO -fMu -fMu -fMu -fMu -fMu -fMu -bCP -fMu -fMu -fMu -fMu -pgh -fMu -auP +nlm +uSI +aDw +aDw +aDw +aDw +kbu +aNP +bLx +rvv +rvv +rvv +rvv +unl +eZC +wyV +eZC +vek +wVh +jVB +fop +fKl +uPz +oql +dBo +exk +exk +dmI +cdo +exk +dmI +xFg fMu -cfT -bMD +hdi fMu agz cCM cCM -iak -fzS -ljh +eAh +kNc +cCM cCM dVv uhO ulj -csN +xGV cCM -aFg -cWU -xJt -wKb -gOd -wYw -wYw -wKb -nhE +fTV +iQD +oBl +ksJ +hLr +lDH +lDH +ksJ +tey euG ceR cZh @@ -190815,63 +196722,63 @@ avc avc avc avc +rrE avc avc avc avc -avc -iju +jkG igc lDj -nWV +qEN mHf -rKL -kFa -rKL -rKL -rKL -rKA -wcV -wcV -wcV -nmH -wcV -wcV -pIV -wcV -rKA -rKL -pRm -rKL -rKL -rKL -pIV -rKL -rKA -www -rMj -pIV -rMj -rMj -pIV -rMj -rKA -lxN -gtd -rKA -tza -sqo -rMj -pIV -gBf -pIV -pIV -pIV -rMj -wcV -wcV -wcV -rKA +lwA +vmk +lwA +lwA +lwA +wrT +sfc +sfc +sfc +kki +sfc +sfc +avI +sfc +wrT +lwA +cCo +lwA +lwA +lwA +avI +lwA +wrT +oyS +bJo +avI +bJo +bJo +avI +bJo +wrT +oeH +mOk +blF +gYU +pZW +sOm +fGg +usk +fGg +fGg +fGg +sOm +duC +duC +duC +blF nGm hRj hRj @@ -190935,50 +196842,62 @@ nlm nlm nlm nlm -"} -(162,1,2) = {" -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm +"} +(162,1,2) = {" +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm nlm nlm nlm @@ -190990,75 +196909,63 @@ nlm nlm nlm slL -nlm -dDL dDL -dDL -shx -hVc -fVM -iZe -abi -nTp -vcF -gng -tls -uBh -uqw -jmD -tnX -aMq -vIy -tMw -shx -rqo -pGl -pGl -rqo -eLh -pGl -rqo -pGl -pGl -pGl -rqo -ngH -hYV -hYV -hYV -ngH -ngH -hYV -hYV -ngH -ngH -hYV -rBF -hYV -ngH -ngH -cbT +nlm +qms +mDG +mDG +mDG +mDG +kbu +rSP +uMG +czx +lrZ +gfi +qVE +unl +unl +unl +unl +unl +unl +gmD +gmD +wPt +gmD +gmD +gmD +dwQ +dwQ +gmD +gmD +dwQ +aod +dwQ +gmD +gmD +gmD cbT +oDs cbT +sKx cbT -sdI cbT -ljh cCM bKj cCM cCM -sUW +eTP cCM -cCM -kOk -wGi -wKb -oFU -wYw -wYw -wKb -cea +fTV +xfQ +oBl +ksJ +oWJ +lDH +lDH +ksJ +iyZ euG fSW kek @@ -191067,68 +196974,68 @@ bzN aPG rTF geK -oip +uEL pSB avc -tDn pSB -avc +kxW +acx +tGv pSB -uAn avc pSB -iju +jkG cDZ -lDj +bqO ueN mHf -rKL -kFa -rKL -rKL -rKL -rKA -wcV -wcV -wcV -rMj -wcV -wcV -pIV -wcV -rKA -pIV -pRm -pIV -pIV -pIV -pIV -pIV -rKA -rMj -rMj -rMj -rMj -pIV -sKH -ceB -rKA -pPG -gtd -rKA -dTb -rMj -iCx -pIV -wcV -wcV -wcV -pIV -rMj -wcV -wcV -wcV -rKA +lwA +vmk +lwA +lwA +lwA +wrT +sfc +sfc +sfc +bJo +sfc +sfc +avI +sfc +wrT +avI +cCo +avI +avI +avI +avI +avI +wrT +bJo +bJo +bJo +bJo +avI +xMn +prO +wrT +isY +mOk +blF +mWC +sOm +bvE +fGg +duC +duC +duC +fGg +sOm +duC +duC +duC +blF hRj hRj hRj @@ -191246,76 +197153,76 @@ nlm nlm nlm nlm -slL -slL -slL nlm nlm -shx -vvb -foH -jhg -fVM -fVM -pPu -wUI -siN -oxu -qij -eOM -nKz -cot -chZ -lcN -shx -rqo -nhU -svt -mmt -nhU -ijs -uwn -ijs -xpr -ijs -ggW -ngH -wxU -jEV -fzl -rWs -aRW -xAI -oDg -aFk -xBt -btj -tLs -tLs -mkV -hsd -ujX -eYS -aQL -qve -gph +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +hMq +iWu +dDL +dDL +qms +iVr +unl +unl +xFN +unl +rci +bLx +bkC +kcC +dWe +hOo +bKw +uwk +phI +kau +oDp +mWB +gmD +cca +vBT +njc +kep +jKL +lZW +uxZ +yfq +eeh +mzm +tla +kWs +gjR +wpK +dwU +riB +bNO +mej +kXW +tLD uAO uhO -uhO jgt cCM cCM -fyH -sIW -sIW -dLO -eEv -wKb -kAq -wYw -wYw -iyk -eEv +tVe +dxQ +vlI +bEP +oBl +ksJ +aLB +lDH +lDH +fPo +mLv euG tCb koU @@ -191327,65 +197234,65 @@ pBa oRG pSB avc -pSB -pSB -avc -pSB -pSB +oTd +byE +psi +qKC +oTd avc pSB -iju +jkG gnx uuV -qvu +lfX mHf -pIV -kFa -pIV -wcV -pIV -uKm -pIV -pIV -pIV -rMj -pIV -pIV -pIV -pIV -rKA -rKL -dsY -rKL -rKL -rKL -pIV -rKL -rKA -pIV -pIV -rMj -rMj -rMj -rKA -rKA -rKA -rKA -lrT -rKA -rKA -rKA -rKA -uKm -rKA -wtn -uon -rKA -rMj -rMj -rMj -rMj -rKA +avI +vmk +avI +sfc +avI +ano +avI +avI +avI +bJo +avI +avI +avI +avI +wrT +lwA +dQk +lwA +lwA +lwA +avI +lwA +wrT +avI +avI +bJo +bJo +bJo +wrT +wrT +wrT +blF +fXr +blF +blF +blF +blF +nqf +blF +dSY +qge +blF +sOm +sOm +sOm +sOm +blF odg hRj hRj @@ -191505,74 +197412,74 @@ nlm nlm nlm nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm slL -dDL -dDL -shx -shx -aPr -hNJ -fVM -fVM -shx -sRd -shx -gfs -ngQ -ngQ -cay -cay -nqm -oGW -vqn -wyc -ltG -ijs -xBQ -sRP -bWQ -eZV -bGR -sAu -fKD -sAu -oCU -njY -ntA -eVy -xAI -snF -xAI -vKw -xAI -xAI -src -xAI -ggU -wzr -tkV -ujX -obp -tIW -uqf -mVu -gGb -ljh +nlm +nlm +qms +mDG +mDG +unl +nxq +unl +bIm +jTp +gfi +aWM +veh +veh +xpd +xYc +cNK +cNK +cNK +cNK +fUr +fVR +tnJ +bOK +tla +rRT +egA +obM +ldV +tla +egA +tla +bLm +bLm +nBm +dwU +uBo +xxr +gqc +isr +eXJ +oDs cCM -bXp +nKe cCM cCM sUW -cCM lUC -kOk -cdP -wKb -iee -wYw -wYw -wKb -gTX +fTV +eMN +oBl +ksJ +mBZ +lDH +lDH +ksJ +mLv tWx mga hoJ @@ -191592,57 +197499,57 @@ tEl tEl tEl sfz -uRs +tpJ uRs djG mHf -rKL -kFa -rKL -rKL -rKL -rKA -rMj -rMj -rMj -rMj -wcV -pIV -wcV -wcV -rKA -rKL -pRm -rKL -rKL -rKL -pIV -rKL -rKA -rKA -vcT -rKA -rKA -rKA -rKA -iPt -cme -rKA -lrT -mtw -gtd -feR -gtd -gtd -gqM -gtd -gtd -mGx -rMj -rMj -wcV -rMj -rKA +lwA +vmk +lwA +lwA +lwA +wrT +bJo +bJo +bJo +bJo +sfc +avI +sfc +sfc +wrT +lwA +cCo +lwA +lwA +lwA +avI +lwA +wrT +wrT +jji +wrT +wrT +wrT +wrT +kbo +xEJ +blF +fXr +sZi +mOk +aZy +mOk +mOk +eZk +mOk +mOk +wel +sOm +sOm +duC +sOm +blF ilu hRj wyj @@ -191762,144 +197669,144 @@ nlm nlm nlm nlm -slL nlm nlm -uIx -fPl -ooF -cBY -xpF -fVM -shx -ogB -mDo -fQR -kBo -fAb -qij -qij -kxA -tES -isn -gvK -ijs -rhD -dwq -nhU -bmc -ijs -qfT -qRp -qRp -tCI -ngH -tyY -xAI -iux -xAI -xAI -xAI -iJs -xAI -xAI -nDM -xAI -xAI -tLs -dgm -ulQ -pxw -wmr -rYP -sKR -gRI -ljh +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +xIe +nlm +nlm +qms +mDG +ezY +unl +wvR +xWN +wkF +qmT +izV +ufI +veh +veh +qHX +nWX +gfi +qFk +mfh +mfh +gmD +wmS +bGe +nUF +nKf +ruf +qpn +qpn +wbM +kWs +jdM +nKf +hBj +bGe +dqI +hjH +ctL +lHI +uIf +oaX +lxb +oDs cCM -bXp +nKe cCM cCM sUW cCM -cCM -kOk -xRJ -wKb -iee -wYw -wYw -wKb -kiT +fTV +rtm +oBl +ksJ +mBZ +lDH +lDH +ksJ +xxs euG euG euG kMr umq euG -cIN +cEj igJ -oip +uEL oTd avc oTd -oTd avc -oTd +avc +nCg oTd nUo dOQ mHf -iju -iju +jkG +jkG mHf mHf -rMj -lLa -rMj -rMj -rMj -rKA -wcV -wcV -rMj -wcV -wcV -pIV -wcV -pIV -uKm -pIV -vrO -nfB -mwh -nfB -nfB -nfB -lrb -iCS -mcR -gtd -gtd -gtd -vvL -gtd -gtd -qZB -lrT -rKA -aFm -sUV -rKA -gtd -rKA -rKA -rKA -rKA -cIp -rMj -rMj -dTi -rKA +bJo +rYU +bJo +bJo +bJo +wrT +sfc +sfc +bJo +sfc +sfc +avI +sfc +avI +eIN +avI +sVc +rVG +wfO +rVG +rVG +rVG +odo +iZk +qnh +rYh +rYh +rYh +jZQ +rYh +rYh +gUV +fXr +blF +fNr +kTm +blF +mOk +blF +blF +blF +blF +wNp +sOm +sOm +wDz +blF dXi hRj hRj @@ -192019,145 +197926,145 @@ nlm nlm nlm nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm slL nlm nlm -uIx -hcf -hbS -hbS -nkE -wpd -shx -ewK -shx -hMF -uRB -shx -qij -qij -kxA -qij -kXa -uzh -ijs -ijs -lEy -nhU -vPa -ijs -vPK -tqU -qRp -mLk -ngH -kbS -tLQ -rSX -vQf -tLQ -eVu -sLx -nRk -eVu -vQf -qpY -guy -cIM -nav -apI -hLS -sko -jLH -mVu -rKO -ljh +qms +mDG +mDG +unl +rlF +unl +dZn +dhy +unl +pFY +ffs +xIk +eJx +nWX +gfi +ehu +fJY +tIo +gmD +nqo +eyC +rWn +dPC +kWs +kWs +kWs +kWs +kWs +kWs +dPC +dht +eyC +nKf +xEM +ush +hzk +klA +vny +wpM +oDs cCM -bXp +nKe cCM cCM sUW cCM -cCM -kOk -xqG -wKb -lQE -dHb -jUI -wKb -hmG -fAV -uUX +fTV +apy +bHL +ksJ +mSN +mJT +gVj +ksJ +rpd +kCz +gvM euG euG euG euG rRM igJ -oip -pSB -pSB -pSB -pSB -uTJ -pSB -pSB +uEL pSB +avc +oTd +pZT +hmb +aiP +oTd +avc pSB lGA cAH emh -cjh -gtd -rKL -kFa -rKL -rKL -rKL -rKA -wcV -wcV -rMj -wcV -rMj -rMj -rMj -rMj -rKA -rKL -pIV -rKL -rKL -rKL -pIV -rKL -rKA -mpX -fZP -sgM -rFi -uhx -rKA -rKA -rKA -rKA -lrT -rKA -rKA -rKA -rKA -pIV -pIV -pIV -yfs -rKA -rKA -rKA -rKA -rKA -rKA -rKA +qcQ +svT +lwA +vmk +lwA +lwA +lwA +wrT +sfc +sfc +bJo +sfc +bJo +bJo +bJo +bJo +wrT +lwA +avI +lwA +lwA +lwA +avI +lwA +wrT +gxb +pWk +mOU +aur +jvK +wrT +wrT +wrT +blF +fXr +blF +blF +blF +blF +fGg +fGg +fGg +gJw +blF +blF +blF +blF +blF +blF +blF hRj hRj hRj @@ -192276,145 +198183,145 @@ nlm nlm nlm nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm slL nlm nlm -uIx -crn -llh -kEq -shx -shx -shx -vHa -aZQ -hHE -oTq -iGC -goM -qij -kxA -qij -rqo -jdr -ijs -pID -ijs -ijs -ijs -ijs -jcP -qRp -qRp -eGp -ngH -kbS -sLx -pdM -sLx -eVu -eVu -sLx -xTY -eVu -sLx -sLx -xAI -sLx -jnQ -ujX -oNP -sAM -mVu -wlV +qms +mDG +mDG +yau +qsx +fsW +kEf +qlu +cgI +kZw +tWe +jQH +tiN +nWX +fht +xgP +tIo +mOB +gmD +amd +tVz +alb +jyP +tVz +lPi +kPC +pGL +lPi +jyP +lrX +oiw +jyP +nKf +dwU +oVQ +uvT +hzk +vXC +ixW cbT -ljh cCM -bXp +nKe cCM cCM sUW cCM -cCM -kOk -vqE -wKb -wKb -wKb -wKb -wKb -gTX -syU -uJR -cea -nns -uEs -wKb +fTV +kzW +ulD +ksJ +ksJ +ksJ +ksJ +ksJ +mLv +nTU +gAS +inL +yiB +ruZ +ksJ wVx igJ -oip -pSB -pSB -pSB -pSB +roY +avc +avc +avc +fNn fPf -pSB -pSB -pSB -pSB +txz +avc +avc +avc mIp iMT sLK -cjh -tpA -kFa -kFa -wcV -pIV -wcV -rKA -wcV -wcV -rMj -pIV -rMj -rMj -rMj -dTi -rKA -rKL -pIV -rKL -rKL -rKL -pIV -rKL -rKA -dto -eNY -iqo -gYS -uhx -rKA -rKL -rKL -gtd -lrT -gtd -rKL -rKL -rKA -lcE -rKA -rKA -qHT -fqj -bCa -pIV -gtd -uEM -gtd -vJV +wrT +oVe +oPH +oPH +sfc +avI +sfc +wrT +sfc +sfc +bJo +avI +bJo +bJo +bJo +djX +wrT +lwA +avI +lwA +lwA +lwA +avI +lwA +wrT +dal +ayI +kYM +rGg +jvK +wrT +lwA +lwA +mOk +fXr +mOk +uMt +uMt +blF +xhv +blF +blF +sEc +lVR +xfi +fGg +mOk +pNV +mOk +neA hRj hRj pma @@ -192477,25 +198384,34 @@ nlm nlm nlm nlm -"} -(168,1,2) = {" -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm +"} +(168,1,2) = {" +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm nlm nlm nlm @@ -192526,152 +198442,143 @@ nlm nlm nlm nlm +dDL nlm nlm +dDL nlm nlm nlm nlm +xIe nlm -slL -dcE nlm -shx -dMJ -pFJ -vwx -shx -bbO -shx -kwG -fJc -shx -tHE -shx -pTz -qNX -mHZ -bpZ -rqo -vjC -ijs -ijs -ijs -csf -ijs -ijs -jcP -gtw -gtw -jIj -ngH -wIS -xAI -iux -fXp -xAI -xAI -xAI -fXp -xAI -xAI -xAI -fXp -xAI -xAI -hql -cbT +qms +mDG +mDG +yau +tEi +aSc +unl +kKn +unl +lKl +rVt +aKj +tiN +nWX +xMJ +unl +kbu +kbu +gmD +raE +kPC +oBO +sUw +lPi +lPi +kPC +okG +lPi +kPC +kPC +gcx +kPC +bor +fPN +gmD sRE -vUb +rET sRE cbT +cbT cCM +xfy +unU +ddu +sti cCM -eAd -iKj -txs -xqm -cCM -itq -kOk -lgZ -cea -vwR -xIV -kFQ -mgY -cPW -wdD -vDT -cVH -wKb -wKb -wKb +fTV +bEP +xXC +nKk +oWD +ykK +esD +myP +uYg +tLE +vgf +sLO +ksJ +ksJ +ksJ pec igJ -oip -pSB -pSB -pSB -pSB -pSB +uEL pSB +avc pSB +xky +xky +xky pSB +avc pSB lnH peQ hXr -pZT -wqN -rKL -pIV -rKL -rKL -rKL -rKA -wcV -wcV -rMj -wcV -rMj -rMj -rMj -rMj -rKA -wcV -pIV -pIV -pIV -pIV -pIV -pIV -rKA -rKA -ter -hKh -hKh -rKA -rKA -rKA -rKA -rKA -lrT -rKA -rKA -rKA -rKA -rKA -exV -sPp -qHT -rKA -kQV -awK -rKA -rKA -rKA -rKA +wrT +rWg +lwA +tQB +lwA +lwA +lwA +wrT +sfc +sfc +bJo +sfc +bJo +bJo +bJo +bJo +wrT +sfc +avI +avI +avI +avI +avI +avI +wrT +wrT +lLG +omU +omU +wrT +wrT +wrT +wrT +blF +fXr +blF +blF +blF +blF +blF +fTC +dtT +sEc +blF +nEt +bjr +blF +blF +blF +blF hRj hRj hRj @@ -192790,144 +198697,144 @@ nlm nlm nlm nlm +nlm +hMq +iWu slL -heR +slL +iWu +slL +slL +slL +slL +iWu dDL -shx -shx -shx -shx -shx -shx -shx -kHY -kHY -shx -uOo -vVv -vVv -shx -shx -shx -rqo -eEW -bDn -ijs -ijs -rKz -ijs -ijs -jcP -qRp -oys -iLH -ngH -nsN -xAI -qtC -pXM -oXX -woG -oSU -wgD -fZB -hKS -oXX -okO -xAI -xAI -jBh -cbT -eKL -mVu -orn +dDL +qms +iVr +unl +unl +xSc +xSc +unl +agB +unl +gPk +oYu +kmT +eRO +nWX +sdP +nGA +nGA +ugm +gmD +kaj +kWs +eKq +nVz +sxP +hPj +htN +yay +rQG +vnC +sxP +hMz +kWs +nKf +qYb +gmD +sLQ +oef +rVd cbT -cCM -cCM -cCM -okP -vLb -cCM -cCM -itq -kOk -jzz -jzz -pDa -jzz -jzz -wKb -njA -wKb -wKb -cth -icj -dXN -bNC +shi +shi +slo +shi +sjr +slo +shi +fTV +ksJ +ksJ +ksJ +mXI +ksJ +ksJ +ksJ +xDw +ksJ +ksJ +irj +tsV +xrU +uaU fqZ xGq vkO pSB +avc pSB -xsU -uib pSB pSB pSB pSB +avc pSB gLT -gYP +peQ rCF -cjh -ohw -rKL -pIV -rKL -rKL -rKL -rKA -wcV -wcV -rMj -wcV -rMj -dTi -rMj -rMj -rKA -rKL -wcV -rKL -rKL -rKL -wcV -rKL -rKA -wcV -xMv -bwd -bwd -bwd -jDq -rKL -wcV -rKA -lrT -rKA -yiW -fwd -rKA -tcz -exV -rKA -qHT -rKA -fnW -afB -dSX -dUG -rKA +wrT +rWg +lwA +tQB +lwA +lwA +lwA +wrT +sfc +sfc +bJo +sfc +bJo +djX +bJo +bJo +wrT +lwA +sfc +lwA +lwA +lwA +sfc +lwA +wrT +sfc +chg +dUK +dUK +dUK +sHi +lwA +sfc +blF +fXr +blF +hYW +rIm +blF +ucR +fTC +blF +sEc +blF +xrw +dDG +yel +aGe +blF hRj hRj hRj @@ -193048,83 +198955,83 @@ nlm nlm nlm nlm -dcE nlm -dcE -dcE -heR -myt -dcE -dcE -dcE -dcE -dcE -dcE -dcE -myt -gaf +slL +nlm +nlm +dDL +nlm +nlm +nlm +nlm +dDL +nlm +nlm +qms mDG +nKW mDG mDG -efZ -xbP -pxN -ijs -ijs -ijs -ijs -ijs -jcP -lnf -fVU -fVU -ngH -lse -xAI -dxv -phf -mLS -mLS -mLS -ado -mLS -mLS -mLS -lEf -okO -xAI -qYY -cbT -iMq -mVu -xjq +mDG +kbu +qWr +jYR +gPS +hrN +tpI +lWD +nWX +dPj +emd +nGA +lPR +gmD +kWs +kWs +gql +iQd +vxS +vxS +vxS +vxS +vxS +vxS +vxS +bkv +hMz +kWs +rjM +gmD +hSa +eDP +eej cbT -kOk -kOk -kOk -kOk -wiO -kOk -kOk -kOk -kOk +eCa +mlc +iwq +oXv +iwq +uYT +pQp +uYT +iwq mKk qVD lia -arL -jzz -xwu -oeF -sZh -cWU -cWU -cWU -cWU -cWU +gQY +ksJ +fms +qFV +oBl +fTV +fTV +fTV +fTV +fTV kWj dNZ wtJ -wuz +bZK wuz xRI gQI @@ -193136,55 +199043,55 @@ dKL lhy peQ cCN -cjh -rBh -lEi -pIV -rKL -rKL -rKL -rKA -wcV -wcV -rMj -pIV -rMj -rMj -rMj -oXh -rKA -rKL -pIV -rKL -rKL -rKL -pIV -rKL -rKA -wcV -rKL -rKL -rKL -rKL -rKL -rKL -rKL -rKA -lrT -rKA -sqz -qHT -qHT -vcn -pbZ -rKA -fNZ -rKA -fHi -oSE -qHN -juz -rKA +wrT +bex +iGo +tQB +lwA +lwA +lwA +wrT +sfc +sfc +bJo +avI +bJo +bJo +bJo +pwW +wrT +lwA +avI +lwA +lwA +lwA +avI +lwA +wrT +sfc +lwA +lwA +lwA +lwA +lwA +lwA +lwA +blF +fXr +blF +mPK +iYa +hOV +msQ +xTq +blF +dQz +blF +gFF +oFI +rgL +lsl +blF hRj hRj hRj @@ -193305,143 +199212,143 @@ nlm nlm nlm nlm -dcE +nlm slL -dcE nlm -dDL -rAT nlm +dDL nlm nlm nlm nlm +dDL nlm nlm -rAT -gaf +qms mDG +nKW mDG mDG -efZ -xbP -ijs -ijs -ijs -ijs -ijs -ijs -jcP -qRp -hOZ -lEj -ngH -hFA -hFA -kvb -mLS -mLS -aSB -aSB -aSB -aSB -aSB -mLS -mLS -wVX -qcT -mNC -cbT -qHC -xdZ -cbT +mDG +unl +xVG +rZp +rZp +onW +wDp +xAr +nWX +lst +nGA +nGA +wjG +gmD +cet +cet +eSk +vxS +vxS +rFg +rFg +rFg +rFg +rFg +vxS +vxS +fYR +cet +kbh +gmD +phz +fbe +vuR cbT -omx +kGQ iwq vVR -fVn -iOc -ddM +pmd +fBs +vRf vRf -cfI -tfy +vRf +jHk wZE dJt ksa oOZ -jzz -fCe -aud -aUF -cWU -eku -oyG -cYq -cWU +ksJ +ntz +kEG +hyw +fTV +fFN +uCI +kGg +fTV rcF geK sRH +uHD +iju +inK +dbw +geK ntx geK -inK -aiP -uEL -xCe -hxW -kdQ +geK aPg jAO bEr ucf -cjh -mHx -wcV -pIV -pIV -wcV -pIV -rKA -wcV -rMj -rMj -wcV -dTi -rMj -oXh -xuu -rKA -pIV -pIV -wcV -rAH -pIV -pIV -pIV -rKA -rKL -rKL -rKL -rKL -rKL -rKL -rKL -rKL -rKA -lrT -rKA -gCv -odB -rKA -rKA -tpA -rKA -rKA -rKA -vqZ -lWQ -nWs -pJC -rKA +wrT +wrT +wrT +eSY +kIE +kIE +kIE +wrT +sfc +bJo +bJo +sfc +djX +bJo +pwW +bMx +wrT +avI +avI +sfc +cVW +avI +avI +avI +wrT +lwA +lwA +lwA +lwA +lwA +lwA +lwA +lwA +blF +fXr +blF +pul +oxo +blF +blF +vSA +blF +blF +blF +nVY +uop +rvz +pnF +blF hRj wyj hRj @@ -193562,10 +199469,10 @@ nlm nlm nlm nlm -dcE -slL -dcE -nlm +dDL +iWu +dDL +hMq bxd bxd ydS @@ -193578,43 +199485,43 @@ ydS bxd bxd mDG +udN mDG -mDG -efZ -xbP -ijs -ijs -ijs -lpw -ijs -ijs -jcP -gtw -gtw -bQt -ngH -hFA -hFA -dOl -mLS -mLS -aSB -sgX -pvS -sgX -aSB -mLS -mLS -wre -qcT -agh -shi +unl +gbN +gfi +sru +iUz +hPW +frT +nWX +gDk +uEi +jcM +fYy +gmD +cet +cet +mCa +vxS +vxS +rFg +tPe +tPe +tPe +rFg +vxS +vxS +qdP +cet +ubk +gmD shi shi shi shi shi -oLx +gCu fmO gPv iwq @@ -193625,18 +199532,18 @@ sus vfZ hsz bHG -arL -jzz -ulu -dHK -aUF -cWU -wYw -wYw -bgA -cWU +lsu +ksJ +iJY +uLD +hyw +fTV +lDH +lDH +bIq +fTV nKr -pBa +pxX xKc uAP dOH @@ -193645,60 +199552,60 @@ wXM xeN qHQ cud -tIm +cud cgX nwQ dKT ucX -cjh -mHx -rKA -onm -rKA -rKA -daz -rKA -rKA -rKA -daz -rKA -rKA -rKA -rKA -rKA -rKA -pIV -pIV -rKL -rKL -rKL -pIV -rKL -rKA -rKL -rKL -rKL -rKL -rKL -rKL -rKL -rKL -rKA -lrT -rKA -huR -rKA -rKA -aKB -qmI -tpA -tpA -rKA -jxW -iwN -lBS -igm -rKA +wrT +rYh +wrT +txm +wrT +wrT +wim +wrT +wrT +wrT +hHi +wrT +wrT +wrT +wrT +wrT +wrT +avI +avI +lwA +lwA +lwA +avI +lwA +wrT +lwA +lwA +lwA +lwA +lwA +lwA +lwA +lwA +blF +fXr +blF +bHJ +blF +blF +oim +sMK +vSA +vSA +blF +dTX +xIh +uGm +sVo +blF hRj hRj hRj @@ -193819,16 +199726,16 @@ nlm nlm nlm nlm -dcE +nlm slL -heR -dDL +nlm +nlm bxd -eFm +mIx bNX bNX bNX -fWz +dKM bNX bNX bNX @@ -193837,40 +199744,40 @@ bxd mDG mDG mDG -rqo -xbP -aEr -ijs -ijs -lIw -ijs -ijs -jcP -qRp -qRp -smD -ngH -hFA -qcT -dOl -mLS -aSB -aSB -sgX -sgX -sgX -aSB -aSB -mLS -wre -qcT -qcT -kXT -udb -vVb -aIt +kbu +qWr +gfi +lrZ +iUz +gfi +gfi +nWX +gDk +nGA +nGA +mig +gmD +cet +ciT +mCa +vxS +rFg +rul +tPe +tPe +tPe +rul +rFg +vxS +qdP +ciT +vQe +tUG +rrI +ecz +eWZ tMJ -tnY +lyM tTS urx qbw @@ -193879,83 +199786,83 @@ uaw bzL fmO sus -cck -jzz -jzz -jzz -jzz -wKb -wKb -wKb -cWU -oVF -cWU -cWU -cWU +sQp +ksJ +ksJ +ksJ +ksJ +ksJ +ksJ +ksJ +fTV +mxp +fTV +fTV +fTV cjh uKP -uKP cjh +gYP +kdQ +tFD +kdQ +wqN cjh -wwE -csK -cjh -kLe -kPd -cjh +uKP +uKP cjh uKP uKP uKP -cjh -cmO -cmO -qHN -vAv -rKA -ayr -kdE -hlm -sry -gtd -gtd -iWb -rmV -qHN -rKA -rKA -daz -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKL -rKL -rKL -rKL -rKL -rKL -rKL -rKA -lrT -rKA -rKA -rKA -pIV -pIV -rKA -rKA -tpA -rKA -rKA -rKA -rKA -rKA -rKA +wrT +rYh +wrT +icg +lVF +wrT +esr +iWF +qJk +vwL +hXV +hXV +qxw +mAR +wMy +wrT +wrT +qyT +wrT +wrT +wrT +wrT +wrT +wrT +wrT +wrT +lwA +lwA +lwA +lwA +lwA +lwA +lwA +blF +fXr +blF +blF +blF +fGg +fGg +blF +blF +vSA +blF +blF +blF +blF +blF +blF hRj hRj hRj @@ -194076,9 +199983,9 @@ nlm nlm nlm nlm -dcE +nlm slL -dcE +nlm nlm ydS bNX @@ -194086,7 +199993,7 @@ bNX bNX bNX bNX -kVm +bNX bNX bNX pSI @@ -194094,41 +200001,41 @@ bxd mDG mDG mDG -rqo -xbP -lrl -ijs -ijs -ijs -ijs -ijs -dFY -qRp -qRp -smD -ngH -riI -qcT -dOl -mLS -aSB +kbu +qWr +gBC +jcw +jkM +gfi +gfi +nWX +gDk +emd +nGA +ged +gmD +dXq +ciT +mCa +vxS +rFg tPe tPe tPe tPe tPe -aSB -mLS -jnq -sRj -siz -shi -npj +rFg +vxS +xBU +cHL +fRy +gmD +jsG cEd vki -dPQ -spb -spb +vki +slo +qYr sus fmO aDN @@ -194137,82 +200044,82 @@ yiY sus oLL sus -wKb -sZh -sZh -sZh -sZh -sZh -sZh -oSo -wYw -cWU -hRj -hRj +ksJ +oBl +oBl +oBl +oBl +oBl +oBl +dJH +lDH +fTV hRj hRj hRj hRj uKP weW +dJC +cjh cly -lnv -cGp -vAh +xsU uKP hRj hRj hRj hRj hRj -rKA -cmO -xFS -rKA -rKA -rKA -rKA -rKA -daz -rKA -rKA -rKA -iGc -gtd -rKA -fus -gtd -vet -wcV -rKL -wcV -qMC -vSU -blq -rKA -pIV -rKL -rKL -rKL -rKL -rKL -pIV -rKA -lrT -qTm -gtd -gtd -gqM -pIV -qjt -rKA -kaN -vAF -kFa -kFa -kFa -xUW -rKA +hRj +wrT +wrT +wrT +hvy +wrT +wrT +wrT +wrT +wrT +qyT +wrT +wrT +wrT +ekH +hXV +wrT +wtN +rYh +tKH +sfc +lwA +sfc +dfy +pdg +cBl +wrT +avI +lwA +lwA +lwA +lwA +lwA +avI +blF +fXr +nIC +mOk +mOk +eZk +fGg +jnU +blF +bup +hkr +xex +xex +xex +pVr +blF hRj hRj hRj @@ -194276,40 +200183,41 @@ nlm nlm nlm nlm -"} -(175,1,2) = {" -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm +"} +(175,1,2) = {" +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm nlm nlm nlm @@ -194333,9 +200241,8 @@ nlm nlm nlm nlm -dcE slL -dcE +nlm nlm ydS mfn @@ -194348,44 +200255,44 @@ cZP bNX hTs bxd -vGE +eTi bxd -vGE -rqo -xbP -ijs -ijs -ijs -pID -ijs -ijs -iuu -gix -cAI -smD -ngH -qcT -qcT -dOl -mLS -aSB +eTi +unl +tDq +gfi +gfi +iUz +gfi +nWX +nWX +gDk +xKS +uYs +xXQ +gmD +ciT +ciT +mCa +vxS +rFg tPe tPe tPe tPe tPe -aSB -mLS -vFP -itm -itm -shi -mIg -vuV -uRp -uxI -jkz -spb +rFg +vxS +eKA +ciT +ciT +gmD +iUX +kDx +xsS +xsS +xsS +xsS sus sus sus @@ -194394,82 +200301,82 @@ sus gzm sus rcl -wKb -sZh -dlk -dlk -iYM -dlk -dlk -wKb -wYw -heC -hRj -hRj +ksJ +oBl +oyp +oyp +iNn +oyp +oyp +ksJ +lDH +jUW hRj hRj hRj hRj -uKP +cjh wwE -utG +csK cjh -utG +kLe kPd -uKP +cjh hRj hRj hRj hRj hRj -rKA -szn -nhY -iMf -rKL -rKL -rKL -rKL -rTa -rKA -kiA -rKA -rKA -gtd -fhA -gtd -gtd -gtd -wcV -rKL -rKL -gtd -gtd -gtd -fhA -pIV -pIV -pIV -pIV -pIV -pIV -pIV -lXC -lrT -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -gKk -xUW -oQk +hRj +hRj +wrT +jNg +raU +tDJ +lwA +lwA +lwA +lwA +edR +wrT +cZn +wrT +wrT +hXV +oIB +hXV +hXV +rYh +sfc +lwA +lwA +rYh +rYh +rYh +gpD +avI +avI +avI +avI +avI +avI +avI +dJp +fXr +blF +blF +blF +blF +blF +blF +blF +blF +blF +blF +blF +pux +vSA +fsX hRj hRj hRj @@ -194590,9 +200497,9 @@ nlm nlm nlm nlm -dcE +nlm slL -dcE +nlm nlm ydS mBr @@ -194608,68 +200515,70 @@ yhO hvS saS hvS -liY -pRW -ijs -pID -ijs -ijs -cpN -rqo -gjb -gjb -gjb -gjb -ngH -xoH -qcT -dOl -mLS -aSB +jLE +qWr +gfi +sru +iUz +gfi +cRZ +shQ +shQ +shQ +shQ +gmD +gmD +iKF +ciT +mCa +vxS +rFg tPe tPe tPe tPe tPe -aSB -mLS -vFP -itm -itm +rFg +vxS +eKA +ciT +ciT +gmD +xRp xsS -jYG xsS -tse -iXH -vfb -spb -sus +pji +dTQ +xsS +wNJ sus fmO fmO tdF tTg sus -sus -wKb -dlk -dlk -dlk -sZh -dlk -dlk -wKb -dxh -heC -hRj +tPY +ksJ +oyp +oyp +oyp +oBl +oyp +oyp +ksJ +mwK +jUW hRj hRj hRj hRj -hBz -hRj -hRj +uKP +hML +wap +lnv emj +lZV +uKP hRj hRj hRj @@ -194677,56 +200586,54 @@ hRj hRj hRj hRj -hRj -sWg -rKA -rJB -oOm -xEo -rKL -rKL -rKL -rKL -rTa -rKA -lgN -emS -rKA -lgN -rKA -gRT -gtd -iVp -rKL -rKL -wcV -gtd -gtd -vSU -rKA -pIV -rKL -rKL -rKL -rKL -rKL -pIV -rKA -lrT -rKA -wyF -ffI -tJt -ffI -tJt -ffI -tJt -ffI -wyF -rKA -pMH -hIn -oQk +wrT +qxL +oKe +efQ +lwA +lwA +lwA +lwA +edR +wrT +ggD +tbU +wrT +ggD +wrT +cOJ +gIR +mSe +lwA +lwA +sfc +rYh +rYh +hGh +wrT +avI +lwA +lwA +lwA +lwA +lwA +avI +blF +fXr +blF +cPB +rue +sAI +rue +sAI +rue +sAI +rue +cPB +blF +asV +eVY +fsX hRj hRj hRj @@ -194847,9 +200754,9 @@ nlm nlm nlm nlm -dcE +nlm slL -dcE +nlm nlm bxd mZK @@ -194859,131 +200766,131 @@ cMY ewI gct jSO -bNX +kVm hJS oSq vbf +pfQ vbf -ePX -eWq -nsx -ijs -ijs -fBh -fBh -ijs -kpc -mUS -jkI -kBG -ydi -vti -qcT -qcT -dOl -mLS -aSB -aSB -aSB -aSB -aSB -aSB -aSB -mLS -tDB -nog -wCn -xsS +mKQ +iro +iro +iro +qrq +qCr +ttk +shQ +cXk +nWu +bWe +gmD +kWs +ciT +ciT +mCa +vxS +rFg +rFg +rFg +rul +rFg +rFg +rFg +vxS +nev +hJp +tBE +gmD apX -eMo +lIP +bPO +bqU +rpz xsS -oqW -jkz -spb sus gzm sus fmO -cEn +fmO sus sus fsj -wKb -sZh -dlk -dlk -sZh -dlk -dlk -wKb -wYw -heC -hRj -hRj -hRj -hRj -hRj -hRj -hRj -hRj -hRj -hRj +ksJ +oBl +oyp +oyp +oBl +oyp +oyp +ksJ +lDH +jUW hRj hRj hRj hRj +uKP +wwE +utG +cjh +utG +kPd +uKP +tIm hRj +wUk hRj +tIm hRj hRj -oQk -nBr -oOm -ddW -rKL -rKL -rKL -rKL -rTa -rKA -oSX -lgN -qHN -gtd -rKA -rKA -rKA -rKA -gtd -gtd -gtd -rKA -daz -rKA -rKA -rKL -rKL -rKL -rKL -rKL -rKL -rKL -rKA -lrT -rKA -tJt -lMU -lMU -lMU -lMU -lMU -lMU -lMU -tJt -rKA -gCv -tpA -oQk +mJP +rVo +oKe +ilO +lwA +lwA +lwA +lwA +edR +wrT +tio +ggD +oID +rYh +wrT +wrT +wrT +wrT +rYh +rYh +rYh +wrT +qyT +wrT +wrT +lwA +lwA +lwA +lwA +lwA +lwA +lwA +blF +fXr +blF +sAI +nUi +nUi +nUi +nUi +nUi +nUi +nUi +sAI +blF +pul +vSA +fsX hRj hRj hRj @@ -195104,12 +201011,12 @@ nlm nlm nlm nlm -dcE +nlm slL -dcE +nlm nlm ydS -uhg +yhY bNX eIz tHd @@ -195120,43 +201027,43 @@ bNX fmV bra eOY -uZg -byA -gMP -eTt -gkP -ijs -oBM -oBM -alG -kpc -akK -onh -tCd -lan -htc -qcT -qcT -dOl -mLS -mLS -mLS -mLS -mLS -mLS -mLS -mLS -mLS -wre -xVF -mYh -xsS -qpD -nRS +nYA +eOY +wVP +hPR +sUY +peL +jkM +kHF +aJs +cQi +wgZ +lHz +hqj +iRW +tla +ciT +ciT +mCa +vxS +vxS +vxS +vxS +vxS +vxS +vxS +vxS +vxS +qdP +mKH +cWr +gmD +sKn +dKH +dKH +dKH +oYm xsS -shi -shi -shi sus sus sus @@ -195165,82 +201072,82 @@ sus rcl fmO xRg -wKb -sZh -dlk -dlk -sZh -dlk -dlk -wKb -wYw -wKb -hRj -hRj -hRj -hRj +ksJ +oBl +oyp +oyp +oBl +oyp +oyp +ksJ +lDH +ksJ hRj hRj hRj +hBz hRj hRj +cGp hRj +pKC hRj hRj hRj hRj hRj hRj +sWg hRj hRj -oQk -asA -oOm -ePM -rKL -rKL -rKL -rKL -rTa -rKA -bUp -rKA -rKA -rKA -rKA -rMj -dTi -rKA -xIJ -gtd -vet -rKA -rMj -rMj -rKL -rKL -rKL -rKL -rKL -rKL -rKL -rKL -rKA -lrT -rKA -tMj -lMU -rKL -rKL -rKL -rKL -rKL -lMU -tMj -rKA -rKA -pgu -rKA +mJP +mvd +oKe +nEn +lwA +lwA +lwA +lwA +edR +wrT +eyQ +wrT +wrT +wrT +wrT +bJo +djX +wrT +rpq +rYh +tKH +wrT +bJo +bJo +lwA +lwA +lwA +lwA +lwA +lwA +lwA +lwA +blF +fXr +blF +gIz +nUi +uMt +uMt +uMt +uMt +uMt +nUi +gIz +blF +blF +vRy +blF xwn hRj hRj @@ -195361,9 +201268,9 @@ nlm nlm nlm nlm -dcE +nlm slL -dcE +nlm nlm ydS riV @@ -195376,64 +201283,65 @@ tVS bNX syi bxd -vGE +eTi bxd -vGE -rqo -nhU -cwo -jQQ -ijs -vbB -ddh -hYu -sMa -uOF -uuF -gjb -eSO -qcT -qcT -kSS -foZ -mLS -mLS -mLS -mLS -mLS -mLS -mLS -seW -jAd -qcT -qyu -twY -ulh -sNW -hnh -gwx -fbk -shi -sus +eTi +unl +fGn +suV +vEp +jkM +kRv +bFW +jVN +oyA +boY +jLD +gmD +tGP +ciT +ciT +wit +stC +vxS +vxS +vxS +vxS +vxS +vxS +vxS +jNG +ivP +ciT +ojV +mvU +ePz +tCl +hhG +xsS +leN +xsS sus +fmO lIA sus sus sus fmO bEp -wKb -sZh -dlk -dlk -sZh -dlk -dlk -wKb -wYw -wKb +ksJ +oBl +oyp +oyp +oBl +oyp +oyp +mDE +lDH +ksJ dyE hRj +tIm hRj hRj hRj @@ -195449,55 +201357,54 @@ hRj hRj hRj hRj -hRj -oQk -cAv -oOm -ePM -rKL -rKL -rKL -rKL -rTa -rKA -kkn -rKA -dTi -rMj -rMj -rMj -rMj -rKA -mMX -gtd -gtd -uKm -rMj -rMj -rKL -rKL -rKL -rKL -rKL -rKL -rKL -rKL -rKA -gtd -rKA -dNL -lMU -rKL -uhJ -rKL -rKL -rKL -lMU -tJt -rKA -rKA -fnp -rKA +mJP +ijv +oKe +nEn +lwA +lwA +lwA +lwA +edR +wrT +fef +wrT +djX +bJo +bJo +bJo +bJo +wrT +qNo +rYh +rYh +eIN +bJo +bJo +lwA +lwA +lwA +lwA +lwA +lwA +lwA +lwA +blF +mOk +blF +btU +nUi +uMt +aJn +uMt +uMt +uMt +nUi +sAI +blF +blF +bLp +blF hRj hRj hRj @@ -195618,9 +201525,9 @@ nlm nlm nlm nlm -dcE +nlm slL -dcE +nlm nlm ydS kWe @@ -195636,59 +201543,59 @@ bxd mDG mDG mDG -rqo -nmk -jbD -jbD -llg -nMV -aor -uTU -mVw -vIX -ggX -ydi -xAI -qcT -qcT -qcT -kSS -nUj -nUj -nUj -nUj -nUj -nUj -nUj -jAd -qcT -qcT -jfp -xsS -jRB -eUl -kyZ -xsS +kbu +gfi +gfi +gfi +klh +vcp +awR +cQi +iuQ +gnm +kAn +dwQ +eyC +ciT +ciT +ciT +wit +bEi +bEi +bEi +bEi +bEi +bEi +bEi +ivP +ciT +ciT +hPQ +gmD +pOP +uEU +cny +hSJ fbk -shi -sus +xsS sus sus sus +fmO gzm sus lIA -sus -wKb -sZh -sZh -sZh -sZh -sZh -sZh -ljW -dtP -ljW +nTg +ksJ +oBl +oBl +oBl +oBl +oBl +oBl +bci +lDH +bci eYm hRj hRj @@ -195707,55 +201614,55 @@ hRj hRj hRj hRj -rKA -asA -hMU -ePM -rKL -rKL -rKL -rKL -rTa -rKA -gtd -rKA -rMj -rMj -rMj -rMj -rMj -rKA -rKA -daz -rKA -rKA -rMj -rMj -rKL -rKL -rKL -rKL -rKL -rKL -rKL -rKL -rKA -gtd -rKA -tMj -lMU -rKL -rKL -rKL -rKL -rKL -lMU -tMj -rKA -rKA -tpA -rKA -rKA +wrT +mvd +doM +nEn +lwA +lwA +lwA +lwA +edR +wrT +rYh +wrT +bJo +bJo +bJo +bJo +bJo +wrT +wrT +qyT +wrT +wrT +bJo +bJo +lwA +lwA +lwA +lwA +lwA +lwA +lwA +lwA +blF +mOk +blF +gIz +nUi +uMt +uMt +uMt +uMt +uMt +nUi +gIz +blF +blF +vSA +blF +blF hRj hRj hRj @@ -195875,16 +201782,16 @@ nlm nlm nlm nlm -dcE +nlm slL -dcE +nlm nlm bxd dzH bNX bNX bNX -wJU +lGE bNX lmH lmH @@ -195893,59 +201800,59 @@ bxd mDG mDG mDG -rqo -rqo -efZ -efZ -rqo -efZ -efZ -rqo -gjb -gjb -gjb -gjb -vBg -qcT -qcT -qcT -eGq -roB -qcT -qcT -qcT -qcT -qcT -qcT -eGq -oEN -boh -ngH -xsS +kbu +gfi +gfi +lrZ +iUz +ucy +hSg +shQ +aIY +tfo +iyS +gmD +aWU +ciT +ciT +ciT +vJf +lYY +ciT +ciT +ciT +ciT +ciT +ciT +vJf +tAv +pbe +gmD +gmD iLL cYB cYB +hSJ +knW xsS -gwx -shi gzm sus sus sus -shi -shi +jzz +jzz ekY jzz -wKb -sZh -dlk -dlk -dlk -dlk -dlk -wKb -kQD -wKb +ksJ +oBl +oyp +oyp +oyp +oyp +oyp +ksJ +cSs +ksJ wLU hRj hRj @@ -195964,55 +201871,55 @@ hRj hRj hRj hRj -rKA -pFb -qHN -ePM -rKL -rKL -rKL -rKL -rTa -uKm -lgN -rKA -rMj -rMj -rMj -rMj -rMj -rMj -rMj -rMj -rMj -rKA -rWf -rKA -wcV -rKL -rKL -rKL -rKL -rKL -rKL -wcV -rKA -lUp -rKA -wyF -lMU -lMU -lMU -lMU -lMU -lMU -lMU -tJt -hPH -gtd -tpA -gtd -pey +wrT +dHD +oID +nEn +lwA +lwA +lwA +lwA +edR +eIN +ggD +wrT +bJo +bJo +bJo +bJo +bJo +bJo +bJo +bJo +bJo +wrT +cXf +wrT +sfc +lwA +lwA +lwA +lwA +lwA +lwA +sfc +blF +rUR +blF +cPB +nUi +nUi +nUi +nUi +nUi +nUi +nUi +sAI +usZ +mOk +vSA +mOk +lva hRj hRj hRj @@ -196132,10 +202039,10 @@ nlm nlm nlm nlm -dcE -slL -heR dDL +iWu +dDL +hMq bxd bxd ydS @@ -196147,62 +202054,62 @@ ydS ydS bxd bxd -rYB -rYB -rYB -mDG -mDG -mDG -mDG -mDG -mDG mDG +udN mDG -mDG -rYB -rYB -ngH -ngH -gBV -krk -ubv -ngH -ngH -gQW -hCg -hCg -hCg -pvQ -ngH -ngH -ngH -ngH -ngH -dDL +unl +sqy +gfi +gfi +iUz +ucy +xcZ +shQ +shQ +cQi +shQ +gmD +gmD +mXq +jPV +aDb +gmD +gmD +rmN +lVG +lVG +lVG +tJn +gmD +gmD +gmD +gmD +gmD +xrx lAS -dDL -dDL xrx xrx +xsS +leN +xsS shi +slo +slo shi -shi -shi -shi -shi +jzz iVc sus eqm -wKb -iYM -dlk -dlk -dlk -dlk -dlk -wKb -vmd -wKb +ksJ +iNn +oyp +oyp +oyp +oyp +oyp +ksJ +jug +ksJ hRj hRj hRj @@ -196221,55 +202128,55 @@ hRj hRj hRj hRj -oQk -cFc -oOm -oOm -rKL -rKL -rKL -rKL -uPy -rKA -qHN -rKA -wcV -wcV -rKL -rKL -rKL -rKL -rKL -rKL -rKL -wcV -pIV -rKA -wcV -wcV -rKL -rKL -rKL -rKL -wcV -wcV -rKA -mNj -rKA -wyF -jpj -tJt -jpj -tJt -jpj -tJt -jpj -lMU -rKA -pPG -vNM -rKA -rKA +mJP +nXR +oKe +oKe +lwA +lwA +lwA +lwA +hxM +wrT +oID +wrT +sfc +sfc +lwA +lwA +lwA +lwA +lwA +lwA +lwA +sfc +avI +wrT +sfc +sfc +lwA +lwA +lwA +lwA +sfc +sfc +blF +uPQ +blF +cPB +nOT +sAI +nOT +sAI +nOT +sAI +nOT +nUi +blF +isY +tEN +blF +blF hRj hRj hRj @@ -196389,13 +202296,8 @@ nlm nlm nlm nlm -dcE -slL -dcE -nlm -dDL -nlm nlm +slL nlm nlm dDL @@ -196406,66 +202308,71 @@ nlm dDL nlm nlm -slL -gaf -mDG +qms mDG +nKW mDG mDG mDG -mDG -mDG -xmq -nlm -nlm -qCR -hYV -aBv -nzG -kPL -ngH -ngH -ngH -jpw -jpw -jpw -ngH -ngH -heR -hRj -hRj -hRj -nlm +unl +lyO +jrY +jFr +jkM +dsZ +wXQ +kbu +pqc +gtC +gtC +gtC +dwQ +pNj +qcc +xsF +gmD +gmD +gmD +tHv +tHv +tHv +gmD +gmD +gtC +gtC +gtC +hwu +xrx lAS -nlm +xrx +xrx +xrx +xrx +xrx +dDL +dDL dDL -nlm -nlm -nlm -nlm -nlm -nlm dDL jzz jzz qXI jzz -wKb -wKb -heC -heC -heC -heC -wKb -wKb -wKb -wKb +ksJ +ksJ +jUW +jUW +jUW +jUW +ksJ +ksJ +ksJ +ksJ +hRj hRj hRj hRj hRj hRj -vot hRj hRj hRj @@ -196477,55 +202384,55 @@ hRj hRj hRj hRj -uHD -oQk -aXn -iMV -ePM -rKL -rKL -rKL -rKL -rKL -rKA -gtd -uKm -rMj -rMj -rMj -rMj -rMj -rMj -rMj -rMj -rMj -rMj -rMj -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -uYL -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -vAa -rKA +hRj +mJP +aNE +rxS +nEn +lwA +lwA +lwA +lwA +lwA +wrT +rYh +eIN +bJo +bJo +bJo +bJo +bJo +bJo +bJo +bJo +bJo +bJo +bJo +wrT +wrT +wrT +wrT +wrT +wrT +wrT +wrT +wrT +blF +tip +blF +blF +blF +blF +blF +blF +blF +blF +blF +blF +blF +blF +qCc +blF hRj hRj hRj @@ -196646,79 +202553,80 @@ nlm nlm nlm nlm -dcE -slL -dcE -nlm -dDL -nlm -nlm -dcE -dcE -heR -dcE -dcE -dcE -dcE -dDL -nlm -nlm -slL -hDS -rYB -rYB -rYB -rYB -rYB -rYB -rYB -ydy -nlm -nlm -qCR -hYV -aBv -nzG -qbZ -ngH -ngH -fhd -fhd -hCg -hCg -joI -ngH -heR -nlm -nlm nlm +slL nlm -lAS nlm dDL nlm nlm nlm nlm +dDL nlm nlm +qms +mDG +nKW +mDG +mDG +mDG +kbu +gfi +gfi +gfi +iUz +ucy +hSg +kbu +rqs +nlm +nlm +nlm +dwQ +khk +qcc +llO +gmD +gmD +ohd +ohd +bdq +rOy +jmK +gmD dDL -xrx -xrx -xrx -oOw nlm +dDL +nlm +nlm +lAS +nlm +nlm +dDL nlm nlm nlm nlm nlm +dDL +xrx +xrx +xrx +oOw +xrx +xrx +xrx +dDL +dDL +xrx oOw cTR hRj hRj hRj hRj +tIm hRj hRj hRj @@ -196733,32 +202641,31 @@ hRj hRj hRj hRj -xky -psi -oQk -iBj -oOm -tkz -rKL -rKL -rKL -rKL -rKL -rKA -lUp -rKA -pIV -rKL -rMj -wcV -wcV -rMj -rKL -wcV -rMj -rKL -wcV -rKA +hRj +mJP +saX +oKe +xXR +lwA +lwA +lwA +lwA +lwA +wrT +jPz +wrT +avI +lwA +bJo +sfc +sfc +bJo +lwA +sfc +bJo +lwA +sfc +wrT nlm dDL dDL @@ -196903,57 +202810,57 @@ nlm nlm nlm nlm -dcE -mXN -mXN -mXN -mXN -mXN -mXN -mXN -mXN -mXN -mXN -mXN -mXN -mXN -mXN -mXN -mXN -mXN -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm +hMq +iWu slL slL -ngH -ngH -ngH -ngH -ngH -ngH -xoh -fhd -hCg -hCg -joI -ngH -heR -nlm +iWu +slL +slL +slL +slL +iWu +dDL +dDL +pGP +pGP +pGP +pGP +gjd +fPv +mnf +fHb +wIi +wkX +lWD +ucy +gji +unl +rqs +dDL +dDL +dDL +gmD +gmD +gmD +gmD +gmD +gmD +wkh +ohd +bdq +rOy +bMR +gmD +dDL nlm +dDL nlm nlm lAS nlm -dDL nlm +dDL nlm nlm nlm @@ -196964,7 +202871,7 @@ dDL xrx xrx xrx -nlm +dDL nlm nlm nlm @@ -196977,6 +202884,7 @@ hRj hRj hRj hRj +vot hRj hRj hRj @@ -196985,37 +202893,36 @@ hRj hRj hRj hRj -wUk hRj hRj hRj +hxW hRj hRj -tzv -rKA -hnU -bLG -qHN -rKL -rKL -rKL -rKL -rKL -rKA -mNj -rKA -vAl -wcV -rMj -wcV -rKL -rMj -rKL -wcV -dTi -wcV -wcV -rKA +wrT +gyr +oZK +oID +lwA +lwA +lwA +lwA +lwA +wrT +hUP +wrT +eHF +sfc +bJo +sfc +lwA +bJo +lwA +sfc +djX +sfc +sfc +wrT nlm nlm dDL @@ -197160,67 +203067,67 @@ nlm nlm nlm nlm -dcE -dcE -dcE -dcE -dcE -dcE -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm nlm +dDL nlm nlm +dDL nlm nlm nlm nlm +xIe nlm nlm +pGP +xst +iqF +lhP +swS +kbu +ugA +voO +gfi +gfi +klh +yfx +hSg +kbu +rqs nlm +dDL nlm -slL -slL -xIe +qfF +dDL nlm -dcE -heR -ngH -iQe -iQe -tWd -hCg -joI -ngH -heR nlm +dDL +gmD +kCa +cyO +aNI +rOy +fCx +gmD +dDL nlm +dDL nlm nlm lAS nlm -dDL nlm +dDL nlm nlm nlm nlm vof nlm -dDL +nlm nlm dDL -xrx +xIe dDL dDL dDL @@ -197240,39 +203147,39 @@ oCT sON sON sON -sON +tzv sON sON sON oCT sON sON -sON +tzv gSK -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -uYL -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA -rKA +wrT +wrT +wrT +wrT +wrT +wrT +wrT +wrT +wrT +wrT +bfH +wrT +wrT +wrT +wrT +wrT +wrT +wrT +wrT +wrT +wrT +wrT +wrT +wrT nlm nlm dDL @@ -197426,55 +203333,54 @@ nlm nlm nlm nlm +dDL nlm nlm +pGP +asM +tBB +kCh +mDG +kbu +mht +gfi +llG +xsK +lWD +gfi +kHD +kbu +rqs nlm +dDL nlm nlm +dDL nlm nlm +dDL +gmD +cyO +cyO +bdq +rOy +jmK +gmD +dDL nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -xIe -nlm -dcE -heR -ngH -iQe -iQe -hCg -hCg -joI -ngH -heR -nlm -nlm +dDL nlm nlm lAS nlm -dDL nlm +dDL nlm nlm nlm nlm nlm nlm -qCR nlm xIe xIe @@ -197514,6 +203420,7 @@ nlm nlm nlm nlm +nlm dDL dDL vwe @@ -197683,57 +203590,57 @@ nlm nlm nlm nlm +xIe nlm nlm +pGP +xst +liE +lhP +qSj +kbu +qHW +kbH +gfi +gfi +iUz +gfi +vPF +unl +rqs nlm +dDL nlm nlm +dDL nlm nlm +dDL +gmD +tUE +xVP +bdq +fGI +jbZ +gmD +dDL nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -xIe -nlm -dcE -heR -ngH -vwQ -hCg -ugo -qlx -gRx -ngH -heR -nlm -nlm +dDL nlm nlm lAS nlm -dDL nlm +dDL nlm nlm nlm nlm nlm nlm +dDL +dDL nlm -xIe -xIe nlm nlm nlm @@ -197874,57 +203781,35 @@ nlm nlm nlm nlm -"} -(189,1,2) = {" -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm +"} +(189,1,2) = {" +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm +nlm nlm nlm nlm @@ -197963,33 +203848,55 @@ nlm nlm nlm xIe +dDL +dDL +pGP +pGP +pGP +pGP +xKo +mnf +mnf +tbE +wIi +rcA +xGS +gfi +gfi +kbu +rqs nlm -dcE -heR -ngH -btb -pTS -uXR -geE -gRx -ngH -heR +dDL nlm nlm +dDL nlm nlm -lAS +dDL +gmD +lEm +cBv +aFn +ycy +jbZ +gmD +dDL nlm dDL nlm nlm +lAS +nlm +nlm +dDL nlm nlm nlm nlm nlm -qCR dDL +dDL +nlm nlm nlm nlm @@ -198197,55 +204104,55 @@ nlm nlm nlm nlm +dDL nlm nlm +msd +gtC +gtC +gtC +gtC +fHO +kbu +bYd +bYd +eaU +oTi +owk +owk +kbu +rqs nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -xIe -nlm -dcE -heR -ngH -ngH -ngH -ngH -ngH -ngH -ngH -heR +dDL +dDL +dDL +dDL +dDL +dDL +dDL +gmD +gmD +gmD +gmD +gmD +gmD +gmD dDL dDL eRz dDL -lAS dDL +lAS dDL dDL dDL -iWu nlm nlm nlm -qCR -qCR +nlm +dDL +dDL +nlm nlm nlm nlm @@ -198454,58 +204361,58 @@ nlm nlm nlm nlm +xIe nlm nlm nlm +dDL nlm +dDL nlm +msd +unl +kbu +kbu +unl +unl +kbu +kbu +unl +roM nlm +dDL nlm nlm +dDL nlm nlm +dDL +agX +dDL +dDL +dDL +dDL +dDL +agX +dDL nlm +eRz nlm nlm +lAS nlm nlm -nlm -nlm -nlm -nlm +dDL nlm nlm nlm xIe -nlm -dcE -heR -heR -heR -heR -heR -heR -heR -heR -heR -nlm -nlm -eRz -nlm -lAS -nlm dDL nlm nlm nlm nlm nlm -qCR -qCR -nlm -nlm -nlm -nlm nlm nlm nlm @@ -198710,30 +204617,30 @@ nlm nlm nlm nlm +hMq +iWu +xIe +xIe +xIe +xIe +dDL +ldr +lgA +dDL +agX +dDL +dDL +dDL +dDL +dDL +dDL +agX +dDL +dDL +dDL nlm nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -xIe +dDL nlm nlm dDL @@ -198746,18 +204653,18 @@ nlm nlm nlm nlm -nlm eRz nlm -lAS nlm -dDL +lAS nlm nlm +dDL nlm nlm xIe -dDL +xIe +nlm nlm nlm nlm @@ -198968,50 +204875,49 @@ nlm nlm nlm nlm +dDL nlm nlm nlm nlm nlm nlm +xIe nlm +dDL nlm nlm nlm -nlm -nlm -nlm -nlm +dDL nlm nlm nlm nlm vof -nlm -nlm -nlm xIe xIe xIe xIe xIe xIe +iWu xIe xIe -nlm -nlm -nlm -nlm -nlm -nlm +xIe +xIe +xIe +xIe +xIe +xIe +iWu dDL nlm -lAS -nlm -dDL nlm +lAS nlm nlm +dDL +iWu xIe xIe nlm @@ -199056,6 +204962,7 @@ nlm nlm nlm nlm +nlm coh dDL vwe @@ -199232,6 +205139,19 @@ nlm nlm nlm nlm +dDL +dDL +xIe +xIe +xIe +dDL +dDL +dDL +xIe +xIe +xIe +dDL +dDL nlm nlm nlm @@ -199247,19 +205167,6 @@ nlm nlm nlm nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -xIe -xIe -xIe -xIe -xIe -iWu dDL dDL dDL @@ -199267,9 +205174,9 @@ lAS dDL dDL dDL -iWu -xIe -xIe +nlm +nlm +nlm nlm nlm nlm @@ -199493,11 +205400,11 @@ nlm nlm nlm nlm +dDL nlm nlm nlm -nlm -nlm +dDL nlm nlm nlm @@ -199750,11 +205657,11 @@ nlm nlm nlm nlm -nlm -nlm -nlm -nlm -nlm +dDL +xIe +xIe +xIe +dDL nlm nlm nlm @@ -200290,9 +206197,9 @@ nlm nlm eRz dDL -dDL +upI tid -dDL +upI dDL eRz nlm diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index f164f22799d5..7faa02b18445 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -24,14 +24,14 @@ /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "aaQ" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/east, /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) +/area/station/ai/satellite/exterior) "aaR" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/north, /obj/item/kirbyplants/random, @@ -63,14 +63,12 @@ /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) "aaY" = ( -/obj/effect/landmark/start/hangover/closet, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/effect/landmark/start/hangover, /obj/machinery/status_display/evac/directional/west, /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) "abi" = ( @@ -106,7 +104,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "aby" = ( /turf/open/floor/wood, /area/station/command/heads_quarters/captain) @@ -124,7 +122,7 @@ /area/station/medical/medbay) "abJ" = ( /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "abL" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -820,11 +818,9 @@ "akg" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/structure/disposalpipe/trunk, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/command/heads_quarters/cmo) "ako" = ( @@ -849,10 +845,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/maintenance/department/eva/abandoned) -"akM" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/station/maintenance/department/science/xenobiology) "akS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -880,7 +872,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/spawner/random/armory/dragnet, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "alG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -904,7 +896,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/floor, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "alM" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -1087,10 +1079,6 @@ /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, -/area/station/engineering/supermatter/room) "anC" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/hatch{ @@ -1113,7 +1101,7 @@ /obj/structure/cable/layer3, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "anF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1140,7 +1128,7 @@ /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) "anV" = ( -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/closet/firecloset, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -1165,10 +1153,8 @@ /turf/open/floor/iron/white, /area/station/medical/medbay) "anZ" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/structure/lattice, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/space/basic, /area/space/nearstation) "aoc" = ( @@ -1179,7 +1165,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/structure/disposalpipe/segment, @@ -1325,7 +1311,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "apV" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -1454,7 +1440,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "arc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1592,7 +1578,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "asc" = ( /obj/effect/landmark/start/hangover, /obj/structure/chair{ @@ -1648,11 +1634,9 @@ /area/station/medical/surgery/theatre) "asO" = ( /obj/machinery/porta_turret/ai, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "asS" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp, @@ -1866,7 +1850,7 @@ /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) +/area/station/security/armory) "auZ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -1910,7 +1894,7 @@ name = "Maintenance Hatch" }, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/abandoned, @@ -2133,6 +2117,7 @@ dir = 8 }, /obj/machinery/light/directional/west, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/iron, /area/station/engineering/main) "azm" = ( @@ -2156,7 +2141,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/iron, @@ -2166,6 +2151,15 @@ dir = 9 }, /obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, /turf/open/floor/iron/white, /area/station/medical/medbay) "azy" = ( @@ -2214,7 +2208,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/meter/layer4, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "aAj" = ( /turf/closed/wall, /area/station/science/breakroom) @@ -2328,7 +2322,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "aBV" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -2460,7 +2454,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "aEz" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -2523,7 +2517,7 @@ /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) "aEV" = ( -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/spawner/random/structure/closet_private, /obj/item/clothing/suit/toggle/lawyer/black, /obj/item/clothing/under/rank/civilian/lawyer/black, @@ -2549,10 +2543,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"aFE" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/r_wall, -/area/station/command/teleporter) "aGm" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line, @@ -2701,7 +2691,7 @@ /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "aHv" = ( /obj/structure/rack, /obj/item/holosign_creator/robot_seat/restaurant{ @@ -2725,7 +2715,7 @@ "aHG" = ( /obj/structure/table, /obj/item/folder, -/obj/item/stamp, +/obj/item/stamp/granted, /obj/item/stamp/denied{ pixel_x = 3; pixel_y = 3 @@ -2762,10 +2752,6 @@ }, /obj/effect/turf_decal/bot, /obj/machinery/disposal/bin, -/obj/structure/sign/directions/arrival{ - dir = 1; - pixel_y = -22 - }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/primary/central/fore) @@ -3036,7 +3022,7 @@ /obj/item/flashlight/lamp, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "aMc" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -3188,7 +3174,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "aNM" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -3214,7 +3200,7 @@ /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "aNP" = ( /obj/structure/sign/warning/hot_temp/directional/west, /turf/open/floor/plating, @@ -3467,11 +3453,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/item/kirbyplants/random, /obj/machinery/light/directional/east, +/obj/structure/sign/warning/radiation/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) +/area/station/ai/upload/chamber) "aRz" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -3531,7 +3518,7 @@ /obj/machinery/ore_silo, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "aSt" = ( /obj/effect/turf_decal/siding/thinplating/dark, /obj/effect/turf_decal/trimline/dark_blue/filled/line, @@ -3551,12 +3538,10 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/command) "aSJ" = ( @@ -3591,7 +3576,8 @@ id = "Cell 3"; name = "Prisoner Flash"; pixel_x = 25; - pixel_y = 7 + pixel_y = 7; + dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4300,12 +4286,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/science/research) -"bbP" = ( -/obj/structure/plaque/static_plaque/golden/commission/delta, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "bbQ" = ( /obj/machinery/vending/wardrobe/hydro_wardrobe, /obj/effect/turf_decal/bot, @@ -4733,7 +4713,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bhw" = ( /turf/closed/wall, /area/station/maintenance/department/medical/morgue) @@ -4849,7 +4829,7 @@ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/turf_decal/stripes/line{ @@ -5090,7 +5070,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/command/maintenance, /turf/open/floor/iron, /area/station/maintenance/department/eva/abandoned) @@ -5124,7 +5104,7 @@ /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) +/area/station/ai/satellite/chamber) "bmq" = ( /obj/structure/filingcabinet/chestdrawer, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -5137,7 +5117,6 @@ /area/station/command/gateway) "bmw" = ( /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -5153,6 +5132,7 @@ /obj/machinery/door/airlock/medical{ name = "Paramedic Dispatch" }, +/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic, /turf/open/floor/iron, /area/station/medical/paramedic) "bmC" = ( @@ -5356,7 +5336,7 @@ /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) +/area/station/ai/upload/chamber) "bpV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -5490,14 +5470,12 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos) "bsd" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/machinery/airalarm/directional/south, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/spawner/random/structure/closet_private, /obj/item/clothing/suit/jacket/letterman_nanotrasen, /obj/item/clothing/under/pants/track, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/wood, /area/station/commons/dorms) "bsj" = ( @@ -5604,7 +5582,7 @@ /area/station/service/chapel) "btH" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "btT" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -5790,7 +5768,7 @@ /obj/structure/cable, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "bwr" = ( /obj/structure/table/wood, /obj/effect/spawner/random/bureaucracy/paper, @@ -6090,8 +6068,11 @@ pixel_y = 10 }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/flasher/directional/south{ + id = "AI" + }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "bAM" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/rnd_all, @@ -6109,7 +6090,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bAO" = ( /obj/structure/chair/pew/right, /turf/open/floor/iron/chapel{ @@ -6169,10 +6150,6 @@ /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 }, @@ -6240,23 +6217,24 @@ /obj/item/bedsheet/medical{ dir = 4 }, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 }, /obj/structure/cable, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/white, /area/station/medical/virology) "bBK" = ( -/obj/machinery/flasher/directional/south{ - id = "brigflashdoor"; - pixel_x = 26 +/obj/structure/sign/directions/dorms{ + dir = 4; + pixel_y = 8 }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) +/obj/structure/sign/directions/medical, +/obj/structure/sign/directions/evac{ + pixel_y = -8 + }, +/turf/closed/wall, +/area/station/commons/vacant_room/commissary) "bCc" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -6296,7 +6274,7 @@ "bCu" = ( /obj/structure/cable, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "bCC" = ( /obj/machinery/door/poddoor{ id = "justiceblast"; @@ -6442,14 +6420,14 @@ name = "Private Channel" }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "bEl" = ( /obj/machinery/ai_slipper{ uses = 10 }, /obj/structure/cable, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "bEm" = ( /obj/effect/landmark/start/ai/secondary, /obj/item/radio/intercom/directional/north{ @@ -6469,7 +6447,7 @@ name = "Private Channel" }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "bEH" = ( /obj/structure/rack, /obj/item/book/manual/wiki/engineering_guide, @@ -6531,7 +6509,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral/full, -/turf/open/floor/iron/large, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/paramedic) "bFe" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -6595,7 +6573,6 @@ /turf/open/floor/iron/white, /area/station/medical/treatment_center) "bFT" = ( -/obj/effect/landmark/start/ai, /obj/item/radio/intercom/directional/west{ freerange = 1; listening = 0; @@ -6626,8 +6603,9 @@ pixel_x = 24; req_access = list("ai_upload") }, +/obj/effect/landmark/start/ai, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "bFV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6642,7 +6620,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bGa" = ( /obj/structure/table/wood/fancy, /obj/structure/sign/painting/large/library{ @@ -6753,7 +6731,7 @@ /area/station/engineering/atmos/project) "bGN" = ( /obj/structure/closet/secure_closet/personal, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/item/storage/wallet, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -6804,7 +6782,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/iron, @@ -6829,7 +6807,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -6902,7 +6880,7 @@ dir = 1 }, /turf/open/floor/iron/large, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bID" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -6941,7 +6919,6 @@ /area/station/maintenance/solars/port/aft) "bIW" = ( /obj/machinery/turretid{ - icon_state = "control_stun"; name = "AI Chamber turret control"; pixel_x = 3; pixel_y = -23 @@ -6954,7 +6931,7 @@ /obj/machinery/power/apc/auto_name/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "bJf" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -7090,7 +7067,7 @@ /turf/open/floor/wood, /area/station/service/theater) "bKo" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 1 }, /obj/machinery/firealarm/directional/south, @@ -7167,7 +7144,7 @@ /area/station/medical/medbay/lobby) "bLs" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "bLu" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/stripes/line{ @@ -7177,7 +7154,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bLx" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -7316,7 +7293,7 @@ /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "bMV" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -7408,10 +7385,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/fore) "bOF" = ( @@ -7452,7 +7429,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "bOU" = ( /obj/effect/landmark/start/hangover, /obj/structure/chair/sofa/bench{ @@ -7485,10 +7462,10 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "bPC" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bPD" = ( /obj/item/clothing/mask/gas, /obj/item/wrench, @@ -7517,7 +7494,7 @@ "bPH" = ( /obj/structure/sign/plaques/kiddie, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bPI" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine, @@ -7610,7 +7587,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bRz" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/structure/cable, @@ -7620,11 +7597,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, /obj/machinery/airalarm/directional/north, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) -"bRD" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bRE" = ( /obj/structure/cable, /obj/machinery/chem_master/condimaster{ @@ -7657,14 +7630,14 @@ }, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bRM" = ( /obj/machinery/computer/teleporter, /obj/effect/turf_decal/stripes/line{ dir = 6 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bRP" = ( /obj/structure/sign/warning/vacuum, /turf/closed/wall, @@ -7844,7 +7817,7 @@ "bTq" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bTs" = ( /obj/machinery/camera/directional/east{ c_tag = "AI Satellite - Maintenance"; @@ -7855,11 +7828,11 @@ /obj/effect/turf_decal/stripes/line, /obj/structure/cable/layer3, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bTu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bTy" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/vending/clothing, @@ -7868,7 +7841,8 @@ name = "curtain control"; pixel_x = -24; pixel_y = -8; - req_access = list("theatre") + req_access = list("theatre"); + dir = 8 }, /turf/open/floor/iron/dark, /area/station/service/theater) @@ -8060,10 +8034,6 @@ /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, @@ -8202,22 +8172,24 @@ /turf/open/floor/iron, /area/station/medical/abandoned) "bYc" = ( -/obj/structure/filingcabinet/chestdrawer, /obj/machinery/status_display/ai/directional/east, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/computer/crew{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/medical/paramedic) "bYe" = ( /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bYf" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bYh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8271,7 +8243,7 @@ /obj/item/gps, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bYK" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ dir = 5 @@ -8367,7 +8339,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "cac" = ( /obj/machinery/recharge_station, /obj/machinery/status_display/evac/directional/south, @@ -8375,7 +8347,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "cad" = ( /obj/item/storage/toolbox/mechanical{ pixel_x = -3; @@ -8387,12 +8359,8 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "cak" = ( -/obj/machinery/flasher/directional/south{ - id = "AI"; - pixel_x = -26 - }, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 }, @@ -8462,7 +8430,7 @@ /obj/effect/spawner/random/food_or_drink/donkpockets, /obj/effect/spawner/random/food_or_drink/condiment, /obj/effect/turf_decal/bot_white, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/maintenance/port) "cbh" = ( @@ -8519,7 +8487,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -8652,10 +8620,10 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "cdt" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "cdB" = ( /obj/structure/chair/sofa/bench/right{ dir = 1 @@ -8759,9 +8727,10 @@ /turf/closed/wall, /area/station/science/genetics) "ceV" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall, -/area/station/engineering/main) +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/radiation/directional/west, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "cfb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/generic, @@ -8771,10 +8740,10 @@ /area/station/maintenance/department/science/xenobiology) "cfu" = ( /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "cfx" = ( /obj/structure/cable, -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 4 }, /obj/effect/turf_decal/bot, @@ -8890,7 +8859,8 @@ desc = "A sign that shows there are doors here. There are doors everywhere!"; icon_state = "doors"; name = "WARNING: PRESSURIZED DOORS"; - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -8909,7 +8879,7 @@ }, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "chn" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/effect/decal/cleanable/dirt, @@ -8941,23 +8911,15 @@ /turf/open/floor/iron, /area/station/engineering/gravity_generator) "chF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/directions/dorms{ - dir = 4; - pixel_x = 32; +/obj/structure/sign/directions/security{ pixel_y = 8 }, -/obj/structure/sign/directions/medical{ - pixel_x = 32 - }, -/obj/structure/sign/directions/evac{ - pixel_x = 32; +/obj/structure/sign/directions/dorms, +/obj/structure/sign/directions/vault{ pixel_y = -8 }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) +/turf/closed/wall, +/area/station/hallway/primary/central/fore) "chT" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line, @@ -8975,7 +8937,7 @@ /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) +/area/station/ai/satellite/exterior) "chY" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "engsm"; @@ -8996,10 +8958,8 @@ /turf/open/floor/iron, /area/station/engineering/atmos/hfr_room) "ciz" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, /obj/effect/turf_decal/tile/neutral, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "ciB" = ( @@ -9124,15 +9084,16 @@ /turf/open/floor/iron, /area/station/maintenance/port/fore) "ckd" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 8 - }, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 }, +/obj/machinery/light/small/directional/south, +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, /obj/effect/turf_decal/box/corners, /obj/effect/turf_decal/box/corners{ - dir = 8 + dir = 4 }, /turf/open/floor/iron/white, /area/station/medical/medbay) @@ -9319,7 +9280,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/structure/disposalpipe/segment{ @@ -9835,7 +9796,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "crZ" = ( /obj/machinery/door/airlock/external{ name = "External Docking Port" @@ -9866,7 +9827,7 @@ "csk" = ( /obj/structure/cable, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "csw" = ( /turf/closed/wall, /area/station/service/hydroponics) @@ -9978,7 +9939,7 @@ }, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ctU" = ( /obj/structure/chair/office{ dir = 1 @@ -10079,7 +10040,7 @@ dir = 8 }, /obj/machinery/light/small/directional/west, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "cvu" = ( /obj/structure/disposalpipe/segment, @@ -10129,6 +10090,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) +"cvX" = ( +/obj/machinery/door/airlock/medical{ + name = "Medbay Desk" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/turf/open/floor/iron, +/area/station/medical/paramedic) "cwe" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -10230,7 +10204,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "cxp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/effect/decal/cleanable/dirt, @@ -10832,7 +10806,7 @@ /obj/machinery/holopad, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "cEK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11102,7 +11076,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "cHU" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -11162,7 +11136,7 @@ /turf/open/floor/iron, /area/station/engineering/hallway) "cIE" = ( -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/closet/firecloset, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -11189,7 +11163,7 @@ /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) +/area/station/ai/upload/chamber) "cJw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11249,7 +11223,7 @@ /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) +/area/station/ai/satellite/chamber) "cKI" = ( /obj/structure/closet/secure_closet/medical3, /obj/effect/turf_decal/bot, @@ -11519,7 +11493,7 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/service/theater/abandoned) @@ -11551,7 +11525,7 @@ /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) +/area/station/ai/satellite/interior) "cOR" = ( /obj/effect/spawner/random/maintenance/two, /obj/structure/closet, @@ -11641,7 +11615,7 @@ /obj/machinery/porta_turret/ai, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "cQj" = ( /obj/machinery/light/small/dim/directional/south, /turf/open/floor/plating, @@ -11678,7 +11652,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "cQy" = ( /obj/machinery/camera/directional/south{ c_tag = "Bridge - Command Chair"; @@ -11758,7 +11732,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11787,6 +11761,17 @@ dir = 8 }, /obj/machinery/light/small/directional/south, +/obj/structure/table/glass, +/obj/item/emergency_bed, +/obj/item/emergency_bed{ + pixel_y = 3 + }, +/obj/item/emergency_bed{ + pixel_y = 3 + }, +/obj/item/wheelchair{ + pixel_y = 15 + }, /turf/open/floor/iron/white, /area/station/medical/paramedic) "cSi" = ( @@ -12053,7 +12038,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "cVy" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -12727,7 +12712,7 @@ /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) +/area/station/ai/satellite/chamber) "deY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12955,10 +12940,6 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/construction, /turf/open/floor/iron, /area/station/engineering/storage_shared) -"djf" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/project) "djn" = ( /obj/structure/table/wood, /obj/item/toy/talking/codex_gigas, @@ -13455,7 +13436,7 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "dql" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -13706,6 +13687,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/port) "dsz" = ( @@ -14045,7 +14027,7 @@ /obj/machinery/door/window/right/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "dwv" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -14119,7 +14101,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "dwV" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -14260,9 +14242,6 @@ /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 }, @@ -14307,7 +14286,7 @@ name = "Maintenance Hatch" }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/machinery/duct, @@ -14416,7 +14395,7 @@ "dBO" = ( /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "dBR" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14765,7 +14744,6 @@ /obj/machinery/status_display/ai/directional/south, /obj/machinery/camera/directional/south{ c_tag = "Service - Cafeteria Aft"; - dir = 5; name = "service camera" }, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -14776,7 +14754,7 @@ /obj/structure/closet, /obj/effect/spawner/random/entertainment/wallet_storage, /obj/effect/turf_decal/bot_white, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/maintenance/port) "dGS" = ( @@ -14893,7 +14871,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer5, @@ -15095,7 +15073,7 @@ /obj/machinery/status_display/evac/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dKR" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -15140,8 +15118,9 @@ /obj/machinery/porta_turret/ai, /obj/machinery/status_display/ai/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dLu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/delivery, @@ -15219,7 +15198,6 @@ "dMh" = ( /obj/machinery/camera/directional/south{ c_tag = "Atmospherics - Project Room Fore"; - dir = 5; name = "atmospherics camera" }, /obj/machinery/status_display/evac/directional/south, @@ -15272,6 +15250,7 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, +/obj/structure/sign/warning/vacuum/external/directional/east, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "dMM" = ( @@ -15362,7 +15341,7 @@ /obj/structure/cable/layer3, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dNm" = ( /obj/item/radio/intercom/directional/north, /obj/structure/disposalpipe/segment{ @@ -15396,7 +15375,7 @@ /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, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron, /area/station/science/research) "dNr" = ( @@ -15441,7 +15420,7 @@ /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) +/area/station/ai/satellite/exterior) "dNU" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 4 @@ -15463,7 +15442,7 @@ /area/station/cargo/storage) "dNX" = ( /obj/structure/closet/boxinggloves, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 @@ -15509,7 +15488,7 @@ /obj/effect/turf_decal/bot, /obj/structure/mirror/directional/north, /obj/machinery/light/small/directional/north, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/cryo) @@ -15675,7 +15654,7 @@ /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) +/area/station/security/armory) "dQN" = ( /obj/structure/table/wood, /obj/effect/spawner/random/food_or_drink/donkpockets, @@ -15860,9 +15839,7 @@ /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "dTS" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/space/basic, /area/space/nearstation) "dUb" = ( @@ -15906,7 +15883,7 @@ /turf/open/floor/iron/white, /area/station/medical/medbay) "dUH" = ( -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/spawner/random/clothing/wardrobe_closet_colored, /obj/structure/sign/poster/random/directional/north, /turf/open/floor/iron/dark, @@ -16000,7 +15977,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "dWd" = ( /obj/structure/cable, @@ -16100,8 +16077,9 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/department/crew_quarters/bar) "dXr" = ( @@ -16112,10 +16090,6 @@ /turf/open/floor/iron, /area/station/maintenance/port) "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, @@ -16229,7 +16203,7 @@ /obj/structure/cable/layer3, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dYQ" = ( /obj/structure/table, /obj/machinery/computer/records/medical/laptop{ @@ -16307,7 +16281,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/iron, @@ -16328,7 +16302,7 @@ dir = 9 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "eae" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -16336,14 +16310,14 @@ /obj/item/pen, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "eaA" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/transit_tube/curved, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "eaC" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" @@ -16352,7 +16326,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, @@ -16461,7 +16435,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, @@ -16702,6 +16676,24 @@ "efg" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/button/door{ + id = "brigprison"; + name = "Prison Lockdown"; + req_access = list("brig"); + pixel_y = 9 + }, +/obj/machinery/button/door{ + id = "brigfront"; + name = "Brig Access Control"; + req_access = list("security"); + pixel_x = 7 + }, +/obj/machinery/button/door{ + id = "brigwindows"; + name = "Cell Window Control"; + req_access = list("security"); + pixel_x = -7 + }, /turf/open/floor/iron, /area/station/security/warden) "efh" = ( @@ -17035,7 +17027,7 @@ /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/spawner/random/maintenance, /turf/open/floor/iron, /area/station/cargo/warehouse) @@ -17124,6 +17116,7 @@ /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/small/directional/south, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) "emB" = ( @@ -17166,8 +17159,11 @@ pixel_y = 10 }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/flasher/directional/south{ + id = "AI" + }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "enw" = ( /obj/item/storage/toolbox/electrical, /obj/effect/decal/cleanable/dirt, @@ -17459,7 +17455,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, @@ -17622,7 +17618,7 @@ }, /obj/machinery/light/directional/east, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "esQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18162,7 +18158,7 @@ /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) +/area/station/ai/satellite/exterior) "eAi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -18237,7 +18233,7 @@ /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) +/area/station/command/eva) "eBb" = ( /obj/structure/filingcabinet/security, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -18354,7 +18350,7 @@ /obj/machinery/porta_turret/ai, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "eCn" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -18838,9 +18834,6 @@ /obj/machinery/computer/robotics{ dir = 8 }, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, /obj/machinery/keycard_auth/wall_mounted/directional/south, /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/neutral/opposingcorners{ @@ -19066,6 +19059,7 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 1 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/security/checkpoint/escape) "eKV" = ( @@ -19085,7 +19079,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/camera/directional/south{ c_tag = "Library - Aft Starboard"; - dir = 5; name = "library camera" }, /turf/open/floor/iron/grimy, @@ -19108,7 +19101,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "eLY" = ( /obj/machinery/door/window/right/directional/west{ name = "Bar Delivery"; @@ -19271,14 +19264,15 @@ /area/station/hallway/primary/central/fore) "eNP" = ( /obj/structure/sign/painting/library{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /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) +/area/station/ai/satellite/exterior) "eOe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19422,7 +19416,7 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron, /area/station/maintenance/department/science) "ePK" = ( @@ -19467,7 +19461,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "eQd" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 8; @@ -19491,7 +19485,7 @@ /area/station/security/checkpoint/customs/aft) "eQr" = ( /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "eQs" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -19557,7 +19551,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "eQK" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 1 @@ -19802,16 +19796,12 @@ /turf/open/floor/carpet, /area/station/command/bridge) "eUq" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/ai_slipper{ uses = 10 }, -/obj/machinery/flasher/directional/south{ - id = "AI"; - pixel_x = 26 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "eUu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20394,25 +20384,16 @@ /turf/open/floor/iron, /area/station/service/kitchen/abandoned) "fcP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/directions/lavaland{ - dir = 1; - pixel_x = 1; - pixel_y = 38 - }, /obj/structure/sign/directions/arrival{ - dir = 8; - pixel_x = 1; - pixel_y = 28 + dir = 1; + pixel_y = -4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/structure/sign/directions/lavaland{ + dir = 4; + pixel_y = 10 }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/turf/closed/wall, +/area/station/service/janitor) "fcR" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -20428,7 +20409,7 @@ /turf/open/floor/iron, /area/station/engineering/atmos/project) "fdn" = ( -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/closet/crate, /obj/effect/turf_decal/bot, /obj/item/airlock_painter/decal, @@ -20546,7 +20527,8 @@ name = "curtain control"; pixel_x = 24; pixel_y = -8; - req_access = list("theatre") + req_access = list("theatre"); + dir = 4 }, /obj/machinery/light/small/directional/east, /turf/open/floor/wood, @@ -21018,7 +21000,7 @@ /obj/structure/cable/layer3, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "fkS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21073,10 +21055,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/iron, /area/station/maintenance/department/crew_quarters/bar) "flB" = ( @@ -21199,7 +21181,7 @@ dir = 1 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "fmB" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/south, @@ -21240,7 +21222,7 @@ "fmO" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/delivery, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) @@ -21283,7 +21265,7 @@ /obj/machinery/door/window/left/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "fnx" = ( /obj/effect/landmark/secequipment, /obj/effect/turf_decal/bot, @@ -21349,7 +21331,7 @@ /area/station/security/holding_cell) "fot" = ( /turf/closed/wall, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "foI" = ( /obj/docking_port/stationary{ dwidth = 2; @@ -21716,10 +21698,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/fore) "ftw" = ( @@ -21745,9 +21727,6 @@ /turf/open/floor/iron, /area/station/maintenance/department/crew_quarters/bar) "ftG" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, /obj/structure/table, /obj/machinery/cell_charger, /obj/item/gps, @@ -21755,6 +21734,7 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron/white, /area/station/science/lobby) "ftO" = ( @@ -21776,11 +21756,6 @@ }, /obj/machinery/status_display/evac/directional/south, /obj/effect/turf_decal/bot, -/obj/structure/sign/directions/arrival{ - dir = 1; - pixel_x = 32; - pixel_y = -4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, @@ -21872,7 +21847,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, @@ -21888,7 +21863,7 @@ "fvZ" = ( /obj/structure/sign/warning/no_smoking, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "fwa" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21979,7 +21954,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "fxc" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -22076,7 +22051,7 @@ /turf/open/floor/iron/white/smooth_large, /area/station/medical/virology) "fyt" = ( -/obj/machinery/light/built/directional/west, +/obj/machinery/light/empty/directional/west, /turf/open/floor/plating, /area/station/maintenance/port/aft) "fyv" = ( @@ -22127,12 +22102,10 @@ /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, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "fza" = ( @@ -22280,7 +22253,7 @@ /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) +/area/station/command/vault) "fAE" = ( /obj/effect/turf_decal/siding/green{ dir = 1 @@ -22412,6 +22385,7 @@ /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/small/directional/south, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) "fCd" = ( @@ -22423,7 +22397,7 @@ req_access = list("ai_upload") }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "fCf" = ( /obj/machinery/door/poddoor/preopen{ id = "atmoslock"; @@ -22536,7 +22510,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "fDS" = ( /obj/machinery/shieldgen, /obj/effect/turf_decal/bot, @@ -22697,7 +22671,6 @@ "fFp" = ( /obj/machinery/camera/directional/east{ c_tag = "Departures Lounge - Fore Starboard"; - dir = 6; name = "departures camera" }, /obj/effect/turf_decal/tile/neutral, @@ -23077,7 +23050,7 @@ /obj/item/ai_module/supplied/freeform, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "fKP" = ( /obj/effect/turf_decal/trimline/white/warning, /obj/effect/mapping_helpers/burnt_floor, @@ -23212,7 +23185,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "fMo" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -23624,7 +23597,7 @@ /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) +/area/station/ai/satellite/exterior) "fRb" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -23661,7 +23634,7 @@ /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "fRK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -23840,7 +23813,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -24073,7 +24046,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, @@ -24124,7 +24097,8 @@ id = "Cell 1"; name = "Prisoner Flash"; pixel_x = 25; - pixel_y = 7 + pixel_y = 7; + dir = 4 }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery, @@ -24153,7 +24127,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "fXQ" = ( /obj/effect/spawner/random/structure/tank_holder, /obj/effect/turf_decal/trimline/green/filled/corner{ @@ -24347,7 +24321,7 @@ /turf/open/floor/wood/large, /area/station/service/library/lounge) "fZV" = ( -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/closet/firecloset, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -24532,7 +24506,6 @@ /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, @@ -24551,7 +24524,7 @@ /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) +/area/station/ai/satellite/interior) "gcu" = ( /obj/machinery/door/poddoor/preopen{ id = "transitlock"; @@ -24595,7 +24568,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "gcP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -24774,7 +24747,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/command/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -24864,10 +24837,8 @@ /area/station/security/checkpoint/arrivals) "gfp" = ( /obj/structure/table/wood, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/wood, /area/station/commons/dorms) "gfq" = ( @@ -24952,7 +24923,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "ggs" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -25133,7 +25104,8 @@ id = "Cell 4"; name = "Prisoner Flash"; pixel_x = 25; - pixel_y = 7 + pixel_y = 7; + dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25191,7 +25163,7 @@ /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) +/area/station/ai/upload/chamber) "gjB" = ( /obj/structure/cable, /obj/structure/closet/emcloset, @@ -25208,7 +25180,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "gjI" = ( /obj/structure/window/reinforced/spawner/directional/west, @@ -25403,7 +25375,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25576,7 +25548,7 @@ /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) +/area/station/ai/satellite/exterior) "gnW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/start/hangover, @@ -25620,7 +25592,8 @@ /area/station/command/bridge) "goj" = ( /obj/structure/sign/painting/library{ - pixel_y = 33 + pixel_y = 33; + dir = 1 }, /turf/open/floor/carpet/green, /area/station/commons/dorms) @@ -25806,10 +25779,10 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/commons/vacant_room/office) "gqF" = ( @@ -25888,6 +25861,7 @@ /obj/item/tank/internals/emergency_oxygen/engi, /obj/item/clothing/glasses/meson, /obj/item/clothing/glasses/meson, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron, /area/station/engineering/main) "grm" = ( @@ -26113,10 +26087,10 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/aft) "gtJ" = ( @@ -26155,7 +26129,6 @@ /obj/machinery/light/small/directional/north, /obj/machinery/camera/directional/north{ c_tag = "Service - Janitorial Closet"; - dir = 9; name = "service camera" }, /mob/living/basic/lizard/eats_the_roaches, @@ -26259,7 +26232,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, @@ -26398,7 +26371,8 @@ desc = "A sign that shows there are doors here. There are doors everywhere!"; icon_state = "doors"; name = "WARNING: EXTERNAL AIRLOCK"; - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -26427,7 +26401,7 @@ req_access = list("command") }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "gwx" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -26688,7 +26662,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "gAu" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -27072,9 +27046,12 @@ /turf/closed/wall, /area/station/service/library/lounge) "gDW" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/r_wall, -/area/station/maintenance/port/aft) +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/nanotrasen/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "gDY" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 @@ -27194,7 +27171,7 @@ dir = 1 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "gFM" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -27267,7 +27244,7 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "gHh" = ( /obj/effect/turf_decal/bot, /obj/machinery/camera/directional/east{ @@ -27844,10 +27821,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/iron, /area/station/maintenance/fore) "gPh" = ( @@ -27858,7 +27835,7 @@ /obj/effect/spawner/random/contraband/armory, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "gPj" = ( /obj/machinery/hydroponics/soil, /obj/effect/decal/cleanable/dirt, @@ -28179,12 +28156,14 @@ "gSB" = ( /obj/structure/cable, /obj/machinery/button/door/incinerator_vent_atmos_main{ + pixel_y = 36; pixel_x = -8; - pixel_y = 36 + dir = 1 }, /obj/machinery/button/door/incinerator_vent_atmos_aux{ pixel_x = -8; - pixel_y = 24 + pixel_y = 24; + dir = 1 }, /obj/effect/decal/cleanable/dirt, /obj/structure/chair/stool/directional/south, @@ -28518,9 +28497,11 @@ /area/station/hallway/secondary/exit) "gXm" = ( /obj/item/kirbyplants/random, -/obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, +/obj/structure/fireaxecabinet/jawsofrecovery/directional/south{ + pixel_y = -26 + }, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "gXn" = ( /obj/structure/table, @@ -28586,7 +28567,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -28623,7 +28604,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "gYz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28855,7 +28836,7 @@ /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hct" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, @@ -29118,7 +29099,7 @@ /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hfB" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/delivery, @@ -29218,7 +29199,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "hgX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29454,7 +29435,7 @@ "hkC" = ( /obj/structure/cable/layer3, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "hkG" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 @@ -29627,7 +29608,7 @@ "hmU" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "hmY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/binary/pump/on{ @@ -29666,9 +29647,6 @@ /area/station/hallway/secondary/command) "hnx" = ( /obj/structure/table, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, /obj/machinery/computer/records/security/laptop{ dir = 8; pixel_y = 6 @@ -29737,7 +29715,7 @@ req_access = list("medical"); specialfunctions = 4 }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/medical/cryo) @@ -29889,6 +29867,10 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, +/obj/machinery/flasher/directional/south{ + id = "AI"; + pixel_x = 6 + }, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) "hrs" = ( @@ -30077,10 +30059,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/fore) "htQ" = ( @@ -30177,7 +30159,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hvf" = ( /obj/machinery/duct, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -30213,7 +30195,7 @@ /turf/open/floor/iron, /area/station/maintenance/fore) "hvq" = ( -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/closet/firecloset, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -30224,12 +30206,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/large, /area/station/science/auxlab/firing_range) "hvv" = ( @@ -30264,7 +30244,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hwe" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/yellow{ @@ -30319,8 +30299,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/iron, @@ -30530,7 +30509,7 @@ /obj/structure/cable/layer3, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "hzK" = ( /obj/machinery/computer/holodeck{ dir = 4 @@ -30949,7 +30928,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "hGG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/green/filled/line, @@ -31074,6 +31053,7 @@ "hIh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, /obj/machinery/light/small/directional/south, +/obj/structure/sign/warning/radiation/directional/south, /turf/open/floor/iron, /area/station/engineering/supermatter/room) "hIs" = ( @@ -31565,7 +31545,7 @@ dir = 1 }, /turf/open/floor/iron/large, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "hPh" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -31588,7 +31568,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "hPu" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -31739,7 +31719,7 @@ /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) +/area/station/ai/satellite/exterior) "hRs" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate_loot, @@ -31763,7 +31743,7 @@ dir = 8 }, /obj/machinery/airalarm/directional/east, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/dark_blue/fourcorners, /turf/open/floor/iron, /area/station/commons/dorms/laundry) @@ -31923,7 +31903,7 @@ }, /mob/living/simple_animal/bot/secbot/beepsky/armsky, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "hTv" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -32040,7 +32020,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hVx" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -32060,7 +32040,7 @@ /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hVE" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32232,7 +32212,7 @@ /obj/machinery/firealarm/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "hYa" = ( /obj/structure/chair/office, /obj/machinery/newscaster/directional/north, @@ -32461,7 +32441,7 @@ /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) +/area/station/security/armory) "iaY" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 4 @@ -32618,7 +32598,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/holopad/secure, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "icD" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -32755,9 +32735,6 @@ /turf/open/floor/plating, /area/station/maintenance/department/electrical) "idD" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 4 @@ -32767,6 +32744,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/purple/fourcorners, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "idF" = ( @@ -33028,7 +33006,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -33259,7 +33237,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ikV" = ( /obj/effect/turf_decal/siding/yellow{ dir = 1 @@ -33534,7 +33512,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "inR" = ( /obj/machinery/door/airlock/research{ name = "Research and Development Lab" @@ -33629,7 +33607,7 @@ /turf/open/floor/iron, /area/station/security/prison/garden) "ipr" = ( -/obj/machinery/computer/rdconsole{ +/obj/machinery/computer/rdconsole/unlocked{ dir = 8 }, /obj/machinery/camera/directional/east{ @@ -34081,7 +34059,7 @@ req_access = list("captain") }, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "iuI" = ( /obj/item/book/manual/hydroponics_pod_people, /obj/item/paper/guides/jobs/hydroponics, @@ -34166,7 +34144,7 @@ id = "paramed_dispatch"; name = "Privacy Shutters"; pixel_x = 6; - req_access = list("medical") + req_access = list("paramedic") }, /obj/machinery/light_switch/directional/north{ pixel_x = -8 @@ -34175,7 +34153,9 @@ dir = 4 }, /obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white, +/obj/item/toy/figure/paramedic, +/obj/item/surgicaldrill, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "ivz" = ( /obj/structure/window/reinforced/spawner/directional/south, @@ -34237,7 +34217,7 @@ pixel_y = -32 }, /obj/effect/spawner/random/structure/closet_private, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/item/clothing/suit/toggle/lawyer, /obj/item/clothing/under/rank/civilian/lawyer/beige, /obj/item/clothing/under/rank/civilian/lawyer/beige/skirt, @@ -34279,7 +34259,7 @@ /obj/structure/cable/multilayer/connected, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ixG" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -35047,7 +35027,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "iGL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -35174,7 +35154,7 @@ /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) +/area/station/ai/satellite/exterior) "iIn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35438,6 +35418,7 @@ dir = 4; pixel_y = 8 }, +/obj/structure/sign/directions/medical, /turf/closed/wall, /area/station/security/courtroom) "iLD" = ( @@ -35494,12 +35475,10 @@ /area/station/science/ordnance/burnchamber) "iMO" = ( /obj/structure/closet/secure_closet/personal, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, /obj/item/storage/wallet, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron/dark, /area/station/commons/locker) "iMS" = ( @@ -35526,7 +35505,7 @@ /turf/open/floor/iron, /area/station/service/kitchen/abandoned) "iNg" = ( -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -35724,7 +35703,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "iQf" = ( /obj/effect/turf_decal/siding/wood/corner, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -35795,7 +35774,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "iRk" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/generic_maintenance_landmark, @@ -36229,14 +36208,19 @@ /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) "iWH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/directions/medical{ - pixel_x = 32 +/obj/structure/sign/directions/supply{ + dir = 1; + pixel_y = 8 }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) +/obj/structure/sign/directions/vault{ + dir = 1 + }, +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = -8 + }, +/turf/closed/wall, +/area/station/security/courtroom) "iWR" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 @@ -36374,7 +36358,7 @@ /obj/machinery/nuclearbomb/selfdestruct, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "iYq" = ( /obj/machinery/computer/prisoner/management{ dir = 4 @@ -36406,10 +36390,8 @@ "iYJ" = ( /obj/structure/table/wood, /obj/item/camera, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, /obj/item/hand_labeler, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/wood, /area/station/commons/vacant_room/office) "iZc" = ( @@ -36455,6 +36437,7 @@ pixel_y = 8; req_access = list("atmospherics") }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron, /area/station/engineering/lobby) "iZG" = ( @@ -36536,7 +36519,7 @@ /obj/structure/cable/layer3, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "jaz" = ( /obj/effect/spawner/random/structure/steam_vent, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -36550,6 +36533,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/plating, /area/station/maintenance/port) "jaV" = ( @@ -36944,13 +36928,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/bridge) -"jeI" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = -32; - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain) "jeM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, @@ -37006,7 +36983,7 @@ /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) +/area/station/command/vault) "jfn" = ( /obj/machinery/vending/wardrobe/bar_wardrobe, /obj/structure/sign/poster/random/directional/east, @@ -37050,11 +37027,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"jfL" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/secure_area/directional/west, -/turf/open/floor/plating, -/area/station/engineering/atmos/mix) "jfP" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37238,7 +37210,6 @@ /area/station/security/lockers) "jhs" = ( /obj/structure/cable, -/obj/effect/landmark/start/paramedic, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, @@ -37727,7 +37698,7 @@ /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "jnG" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37799,19 +37770,14 @@ /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "jom" = ( -/obj/structure/sign/directions/evac{ - pixel_x = -32; - pixel_y = -8 - }, /obj/structure/sign/directions/science{ - dir = 8; - pixel_x = -32 + dir = 8 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/structure/sign/directions/evac{ + pixel_y = -8 }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) +/turf/closed/wall/r_wall, +/area/station/command/gateway) "jop" = ( /obj/structure/falsewall, /turf/open/floor/iron/dark, @@ -37988,7 +37954,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/service/chapel_office, @@ -38102,6 +38068,7 @@ name = "Head of Security's Fax Machine" }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) "jsL" = ( @@ -38193,18 +38160,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"jtz" = ( -/obj/structure/chair/sofa/bench{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay) +/area/station/ai/satellite/exterior) "jtB" = ( /obj/structure/table/wood, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -38233,7 +38189,8 @@ desc = "A sign that shows there are doors here. There are doors everywhere!"; icon_state = "doors"; name = "WARNING: BLAST DOORS"; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -38738,7 +38695,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/fore) "jAY" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 4 }, /obj/effect/turf_decal/bot/left, @@ -38824,7 +38781,8 @@ name = "Flash Control"; pixel_x = 26; pixel_y = 7; - req_access = list("security") + req_access = list("security"); + dir = 4 }, /obj/machinery/button/door/directional/east{ id = "brigfront"; @@ -39203,13 +39161,11 @@ dir = 4 }, /obj/item/bedsheet/medical, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, /obj/effect/turf_decal/trimline/green/filled/line{ dir = 5 }, /obj/structure/cable, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron/white, /area/station/medical/virology) "jFP" = ( @@ -39358,7 +39314,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, @@ -39632,6 +39588,7 @@ /obj/effect/mapping_helpers/airlock/access/all/security/armory, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron, /area/station/security/evidence) "jLo" = ( @@ -39780,7 +39737,6 @@ /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{ @@ -39858,7 +39814,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "jOr" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 @@ -39903,7 +39859,7 @@ /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) +/area/station/ai/satellite/exterior) "jPd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39920,7 +39876,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "jPf" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -40441,11 +40397,13 @@ }, /obj/structure/sign/picture_frame/showroom/three{ pixel_x = -20; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/structure/sign/picture_frame/showroom/four{ pixel_x = 2; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/wood/large, /area/station/command/corporate_showroom) @@ -40639,7 +40597,7 @@ /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "jYs" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -40676,7 +40634,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "jYM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40706,7 +40664,7 @@ /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "jZf" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -40747,18 +40705,6 @@ /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 }, @@ -40830,7 +40776,7 @@ /obj/machinery/firealarm/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "kax" = ( /obj/structure/chair/office/light{ dir = 4 @@ -40849,11 +40795,9 @@ /area/station/service/abandoned_gambling_den) "kaG" = ( /obj/structure/closet/secure_closet/personal, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/dark, /area/station/commons/locker) "kaL" = ( @@ -40924,15 +40868,13 @@ /area/station/service/hydroponics) "kbg" = ( /obj/machinery/pdapainter/research, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/effect/turf_decal/bot_red, /obj/effect/turf_decal/tile/purple{ dir = 8 }, /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/structure/extinguisher_cabinet/directional/south, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) "kbn" = ( @@ -40995,9 +40937,7 @@ }, /obj/effect/spawner/random/structure/crate, /obj/structure/sign/warning/secure_area/directional/west, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/maintenance/department/engine/atmos) "kca" = ( @@ -41143,13 +41083,14 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "kdX" = ( /obj/machinery/piratepad/civilian, /obj/effect/turf_decal/trimline/yellow, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 8 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron, /area/station/cargo/lobby) "kdY" = ( @@ -41200,7 +41141,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "keE" = ( /obj/structure/table/reinforced, /obj/item/plant_analyzer, @@ -41210,18 +41151,9 @@ /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) "keH" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 8 - }, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 5 }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, /turf/open/floor/iron/white, /area/station/medical/medbay) "keO" = ( @@ -41386,7 +41318,7 @@ /obj/effect/turf_decal/siding/dark_blue{ dir = 8 }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/dark_blue/fourcorners, /obj/machinery/light/cold/directional/east, /turf/open/floor/iron, @@ -41713,7 +41645,7 @@ /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) +/area/station/ai/upload/chamber) "kke" = ( /turf/open/floor/plating, /area/station/cargo/drone_bay) @@ -41727,7 +41659,7 @@ "kkh" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "kkm" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -41853,7 +41785,7 @@ }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -41931,7 +41863,7 @@ /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/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "knd" = ( /obj/effect/turf_decal/siding/blue{ dir = 8 @@ -42086,7 +42018,7 @@ /obj/item/wrench, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "kpn" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -42177,11 +42109,9 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/purple/fourcorners, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "kqQ" = ( @@ -42250,7 +42180,7 @@ /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) +/area/station/ai/satellite/interior) "ksd" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/decal/cleanable/dirt, @@ -42367,7 +42297,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable/layer3, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "kun" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -42456,7 +42386,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "kvq" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -42544,7 +42474,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron, /area/station/science/research) "kvK" = ( @@ -42676,7 +42606,7 @@ /obj/machinery/status_display/ai/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "kxA" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/tile/purple{ @@ -42756,7 +42686,7 @@ /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/large, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "kzm" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 4; @@ -43082,6 +43012,9 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/scanner_gate/preset_guns, +/obj/machinery/flasher/directional/south{ + id = "brigflashdoor" + }, /turf/open/floor/iron/dark, /area/station/security/brig) "kEw" = ( @@ -43103,7 +43036,7 @@ dir = 6 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "kEJ" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -43244,7 +43177,7 @@ /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "kGK" = ( -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -43520,22 +43453,18 @@ /area/station/medical/storage) "kKz" = ( /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/ai_upload"; - icon_state = "control_stun"; + control_area = "/area/station/ai/upload/chamber"; name = "AI Upload Turret Control"; pixel_y = -32 }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "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 }, @@ -43585,27 +43514,19 @@ /turf/open/floor/iron/white, /area/station/medical/virology) "kLz" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Departures Lounge" +/obj/structure/sign/directions/command{ + dir = 1; + pixel_y = 8 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/sign/directions/vault{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/directions/science{ +/obj/structure/sign/directions/engineering{ dir = 8; - pixel_x = -32 - }, -/obj/structure/sign/directions/command{ - dir = 1; - pixel_x = -32; - pixel_y = 8 + pixel_y = -8 }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) +/turf/closed/wall, +/area/station/commons/storage/primary) "kLA" = ( /obj/structure/chair{ dir = 4 @@ -43879,7 +43800,7 @@ /obj/machinery/door/window/left/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "kPc" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 9 @@ -44069,7 +43990,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -44196,10 +44117,6 @@ }, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hos) -"kTV" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/station/engineering/gravity_generator) "kUn" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/brown{ @@ -44223,6 +44140,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/sign/warning/radiation/directional/south, /turf/open/floor/iron, /area/station/engineering/hallway) "kUC" = ( @@ -44453,7 +44371,7 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "kXH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44465,16 +44383,16 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/fore) "kXJ" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "kXO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -44505,17 +44423,15 @@ /turf/open/space/basic, /area/space/nearstation) "kYb" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, /obj/machinery/camera/directional/west{ c_tag = "Departures Hallway - Access"; name = "hallway camera" }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) "kYn" = ( @@ -44686,10 +44602,8 @@ /turf/open/floor/plating, /area/station/science/research/abandoned) "laJ" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, /obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron, /area/station/security/courtroom) "laK" = ( @@ -44922,7 +44836,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ldn" = ( /obj/effect/landmark/start/hangover, /obj/effect/decal/cleanable/dirt, @@ -44971,7 +44885,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "len" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -45017,13 +44931,11 @@ /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, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "lfz" = ( @@ -45096,7 +45008,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "lgG" = ( /obj/machinery/modular_computer/preset/engineering, /obj/structure/cable, @@ -45214,7 +45126,7 @@ /area/station/maintenance/port) "lhY" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "lhZ" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45642,7 +45554,7 @@ }, /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "lmm" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, @@ -45717,7 +45629,7 @@ }, /obj/machinery/light/directional/south, /obj/effect/turf_decal/bot, -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 1 }, /turf/open/floor/iron/dark/textured_large, @@ -45757,6 +45669,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/command/heads_quarters/captain/private) "lnp" = ( @@ -45884,8 +45797,7 @@ /turf/open/floor/iron/white, /area/station/medical/chemistry) "lpy" = ( -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -45895,6 +45807,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/aft) "lpz" = ( @@ -45946,6 +45859,7 @@ /obj/structure/table/reinforced, /obj/machinery/light_switch/directional/east, /obj/effect/spawner/random/engineering/toolbox, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/plating, /area/station/maintenance/department/eva/abandoned) "lqa" = ( @@ -46123,7 +46037,7 @@ /area/station/hallway/secondary/entry) "lte" = ( /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -46156,8 +46070,8 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" }, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/fore) "ltt" = ( @@ -46229,13 +46143,13 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /obj/machinery/duct, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, /turf/open/floor/iron, /area/station/medical/cryo) "ltV" = ( @@ -46252,7 +46166,7 @@ dir = 4 }, /obj/effect/spawner/random/structure/barricade, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -46568,15 +46482,12 @@ /obj/machinery/flasher{ id = "justiceflash"; pixel_x = 26; - req_access = list("security") + req_access = list("security"); + dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/machinery/flasher/directional/east{ - id = "justiceflash"; - req_access = list("security") - }, /obj/effect/turf_decal/tile/red{ dir = 4 }, @@ -46589,7 +46500,7 @@ /obj/machinery/newscaster/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lyh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -46748,6 +46659,17 @@ /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 }, +/obj/structure/reagent_dispensers/water_cooler, +/obj/machinery/button/door/directional/east{ + pixel_y = -4; + id = "paramed_dispatch_desk"; + name = "Desk Shutter Control" + }, +/obj/machinery/button/door/directional/east{ + pixel_y = 6; + name = "Medbay Doors Control"; + id = "MedbayFoyer" + }, /turf/open/floor/iron/white, /area/station/medical/paramedic) "lAs" = ( @@ -46781,7 +46703,6 @@ "lAV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/duct, -/obj/effect/landmark/start/paramedic, /turf/open/floor/iron, /area/station/medical/cryo) "lAW" = ( @@ -46891,9 +46812,14 @@ /turf/open/floor/iron, /area/station/medical/virology) "lBR" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/eva) +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/nanotrasen/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "lBV" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/decal/cleanable/dirt, @@ -46948,7 +46874,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -47034,10 +46960,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/library/printer) -"lDV" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall, -/area/station/engineering/main) "lDY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47055,10 +46977,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) "lEe" = ( @@ -47336,7 +47258,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "lGW" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47352,7 +47274,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "lHd" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47479,15 +47401,13 @@ /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, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "lID" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, @@ -47752,7 +47672,7 @@ /obj/structure/cable/layer3, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "lKK" = ( /obj/structure/cable, /obj/effect/landmark/event_spawn, @@ -47839,7 +47759,7 @@ /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) +/area/station/ai/satellite/chamber) "lMz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, @@ -47856,7 +47776,7 @@ /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) +/area/station/ai/satellite/chamber) "lMF" = ( /obj/machinery/vending/autodrobe, /obj/effect/turf_decal/siding/dark_blue{ @@ -48213,6 +48133,7 @@ "lRx" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/bot, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron, /area/station/maintenance/port) "lSh" = ( @@ -48248,12 +48169,12 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, -/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/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/fore) "lSo" = ( @@ -48267,7 +48188,7 @@ /area/station/medical/treatment_center) "lSw" = ( /obj/structure/closet/secure_closet/personal, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -48309,9 +48230,7 @@ /turf/open/floor/iron/white, /area/station/command/heads_quarters/captain/private) "lTC" = ( -/obj/structure/sign/plaques/kiddie/library, /obj/effect/spawner/structure/window, -/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/service/library/artgallery) "lTG" = ( @@ -48419,7 +48338,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "lUF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -48653,7 +48572,7 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/iron, @@ -48844,7 +48763,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "mck" = ( /obj/structure/chair/office, /obj/effect/landmark/start/depsec/medical, @@ -48939,7 +48858,7 @@ /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) +/area/station/ai/satellite/chamber) "mdg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48952,9 +48871,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron, /area/station/science/auxlab/firing_range) "mdm" = ( @@ -49146,13 +49063,6 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/west, /turf/open/floor/iron, /area/station/cargo/office) -"mfO" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) "mfP" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ @@ -49427,7 +49337,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "miD" = ( /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/plating, @@ -49560,7 +49470,7 @@ dir = 5 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "mly" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -49584,17 +49494,15 @@ /area/station/maintenance/department/electrical) "mlE" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "mlW" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/structure/railing{ dir = 1 }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "mmq" = ( @@ -49750,7 +49658,7 @@ /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) +/area/station/command/eva) "mph" = ( /obj/effect/landmark/start/hangover, /obj/structure/table/wood, @@ -50114,6 +50022,7 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners{ dir = 1 }, +/obj/structure/sign/warning/secure_area/directional/northwest, /turf/open/floor/iron/dark/corner{ dir = 1 }, @@ -50249,11 +50158,12 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "muA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/iron, /area/station/engineering/main) "muK" = ( @@ -50326,7 +50236,8 @@ /obj/machinery/button/flasher{ id = "visitorflash"; pixel_x = -6; - pixel_y = 24 + pixel_y = 24; + dir = 1 }, /obj/machinery/button/door/directional/north{ id = "visitation"; @@ -50433,12 +50344,12 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, /obj/machinery/door/airlock/medical/glass{ name = "Medbay" }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, /turf/open/floor/iron, /area/station/medical/medbay) "mwS" = ( @@ -51192,6 +51103,7 @@ /obj/effect/turf_decal/box/corners{ dir = 1 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron, /area/station/engineering/supermatter/room) "mFH" = ( @@ -51572,11 +51484,12 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "mJi" = ( /obj/structure/sign/departments/science{ name = "ROBOTICS"; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -51672,9 +51585,7 @@ /area/station/engineering/atmos/pumproom) "mJS" = ( /obj/structure/dresser, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/wood, /area/station/commons/dorms) "mJW" = ( @@ -51796,7 +51707,7 @@ /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_upload) +/area/station/ai/upload/chamber) "mMr" = ( /obj/effect/turf_decal/stripes/end{ dir = 1 @@ -51840,7 +51751,7 @@ /obj/structure/tank_dispenser/oxygen, /obj/effect/turf_decal/bot, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "mNC" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -52273,10 +52184,10 @@ /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/airlock/unres, /obj/machinery/door/airlock/medical/glass{ name = "Medbay Treatment Center" }, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/iron, /area/station/medical/treatment_center) "mTc" = ( @@ -52368,6 +52279,7 @@ /obj/machinery/light/small/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/warning/radiation/directional/east, /turf/open/floor/iron, /area/station/engineering/atmos/project) "mUZ" = ( @@ -52382,7 +52294,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/iron, @@ -52397,22 +52309,6 @@ /turf/open/floor/iron/grimy, /area/station/service/abandoned_gambling_den) "mVr" = ( -/obj/machinery/computer/crew{ - dir = 4 - }, -/obj/machinery/button/door/directional/west{ - id = "MedbayFoyer"; - name = "Medbay Doors Control"; - normaldoorcontrol = 1; - pixel_y = 6; - req_access = list("medical") - }, -/obj/machinery/button/door/directional/west{ - id = "paramed_dispatch_desk"; - name = "Desk Shutter Control"; - pixel_y = -4; - req_access = list("medical") - }, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 }, @@ -52592,7 +52488,7 @@ /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) +/area/station/ai/satellite/exterior) "mYk" = ( /obj/effect/turf_decal/loading_area{ dir = 8 @@ -52680,7 +52576,7 @@ dir = 4 }, /obj/effect/spawner/random/structure/barricade, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -52937,7 +52833,7 @@ }, /obj/structure/cable/layer3, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ndc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53093,7 +52989,7 @@ /obj/machinery/recharger, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "ngb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/railing/corner{ @@ -53369,10 +53265,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"njz" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall, -/area/station/maintenance/starboard/aft) "njA" = ( /obj/machinery/airalarm/directional/east, /obj/effect/decal/cleanable/dirt, @@ -53406,7 +53298,7 @@ /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "nkd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/effect/turf_decal/stripes/line{ @@ -53622,15 +53514,9 @@ dir = 1 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nmU" = ( /obj/structure/cable, -/obj/machinery/firealarm/directional/south{ - pixel_x = -32 - }, -/obj/machinery/light_switch/directional/south{ - pixel_x = -24 - }, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 8 }, @@ -53770,7 +53656,7 @@ /area/station/commons/storage/primary) "nph" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/siding/wood, /obj/structure/closet/secure_closet/personal/cabinet{ name = "mime's closet" @@ -54128,11 +54014,13 @@ }, /obj/structure/sign/picture_frame/showroom/one{ pixel_x = -2; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/structure/sign/picture_frame/showroom/four{ pixel_x = 19; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/wood/large, /area/station/command/corporate_showroom) @@ -54177,7 +54065,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54316,9 +54204,6 @@ /turf/open/floor/iron/dark, /area/station/science/xenobiology) "nwW" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/machinery/status_display/ai/directional/north, /obj/structure/table/wood/fancy/red, /obj/machinery/door/window/brigdoor/left/directional/east{ @@ -54331,8 +54216,9 @@ /obj/item/ai_module/reset/purge{ pixel_y = 11 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "nwY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54373,7 +54259,7 @@ }, /obj/structure/cable, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "nxs" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/lattice, @@ -54547,10 +54433,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/fore) "nyZ" = ( @@ -54598,6 +54484,7 @@ name = "engineering camera"; network = list("ss13","engine") }, +/obj/structure/sign/warning/radiation/directional/south, /turf/open/floor/iron, /area/station/engineering/supermatter/room) "nzt" = ( @@ -54753,10 +54640,10 @@ /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) +/area/station/ai/satellite/exterior) "nBF" = ( /obj/structure/cable, -/obj/machinery/computer/rdconsole, +/obj/machinery/computer/rdconsole/unlocked, /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 }, @@ -54883,7 +54770,7 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/construction, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "nDx" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -55025,6 +54912,7 @@ dir = 1 }, /obj/machinery/light/directional/north, +/obj/structure/sign/warning/radiation/directional/north, /turf/open/floor/iron, /area/station/engineering/main) "nFv" = ( @@ -55162,7 +55050,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -55321,7 +55209,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "nIW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55437,7 +55325,7 @@ dir = 10 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "nJP" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -55668,7 +55556,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "nNK" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -56020,9 +55908,12 @@ /turf/open/floor/iron/white, /area/station/medical/virology) "nSv" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/r_wall, -/area/station/command/heads_quarters/captain/private) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/sign/nanotrasen/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "nSA" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -56102,7 +55993,7 @@ /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "nTQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/cigbutt, @@ -56136,7 +56027,7 @@ /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) "nUo" = ( -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/personal, /obj/effect/spawner/random/food_or_drink/cups, @@ -56628,7 +56519,8 @@ id = "Cell 5"; name = "Prisoner Flash"; pixel_x = 25; - pixel_y = 7 + pixel_y = 7; + dir = 4 }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56734,7 +56626,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -56766,15 +56658,15 @@ /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, +/obj/machinery/suit_storage_unit/medical, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "odd" = ( /obj/docking_port/stationary/random{ @@ -56789,7 +56681,7 @@ /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "odl" = ( /obj/item/radio{ pixel_x = -5; @@ -56815,7 +56707,7 @@ /obj/machinery/newscaster/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "odD" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -56942,14 +56834,12 @@ dir = 4; name = "Mix Outlet Pump" }, -/obj/structure/sign/warning/secure_area/directional/west{ - pixel_y = -32 - }, /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 8 }, +/obj/structure/sign/warning/secure_area/directional/southwest, /turf/open/floor/iron, /area/station/engineering/atmos/mix) "ofN" = ( @@ -57143,7 +57033,7 @@ /turf/open/floor/iron/dark, /area/station/security/detectives_office) "oiO" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 8 }, /obj/effect/turf_decal/bot, @@ -57257,9 +57147,14 @@ }, /area/station/hallway/primary/fore) "okb" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall, -/area/station/maintenance/department/crew_quarters/bar) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/sign/nanotrasen/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "oke" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -57270,7 +57165,7 @@ "okj" = ( /obj/effect/spawner/random/structure/crate_loot, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /turf/open/floor/plating, /area/station/medical/abandoned) "okk" = ( @@ -57416,7 +57311,7 @@ /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) +/area/station/ai/satellite/interior) "olI" = ( /obj/machinery/computer/shuttle/mining{ dir = 8 @@ -57474,7 +57369,7 @@ /obj/machinery/door/window/right/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "omj" = ( /obj/structure/chair{ dir = 4 @@ -58020,7 +57915,7 @@ /obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "ouc" = ( /obj/structure/sign/warning/electric_shock{ pixel_y = -30 @@ -58076,12 +57971,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron/large, /area/station/science/auxlab/firing_range) "ovb" = ( @@ -58737,7 +58630,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "oDz" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -58996,15 +58889,13 @@ /turf/closed/wall, /area/station/service/chapel) "oGM" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, /obj/structure/closet/secure_closet/armory2, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/spawner/random/armory/rubbershot, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "oHe" = ( /obj/effect/turf_decal/bot, /obj/effect/landmark/start/hangover, @@ -59420,6 +59311,7 @@ /area/station/maintenance/department/eva/abandoned) "oMh" = ( /obj/effect/turf_decal/tile/blue, +/obj/structure/sign/warning/radiation/directional/south, /turf/open/floor/iron, /area/station/engineering/hallway) "oMo" = ( @@ -59504,7 +59396,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "oNb" = ( /obj/structure/rack, /obj/item/circuitboard/machine/teleporter_hub{ @@ -59536,7 +59428,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/floor, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "oNF" = ( /obj/effect/turf_decal/siding/blue, /obj/effect/turf_decal/tile/blue/opposingcorners, @@ -59871,10 +59763,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/fore) "oSd" = ( @@ -60094,7 +59986,7 @@ }, /obj/effect/landmark/start/paramedic, /obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "oUM" = ( /obj/effect/decal/cleanable/blood/oil, @@ -60143,6 +60035,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/department/science) +"oVq" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/structure/plaque/static_plaque/golden/commission/delta, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "oVt" = ( /obj/structure/chair/pew, /turf/open/floor/iron/chapel{ @@ -60177,7 +60075,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -60539,7 +60437,7 @@ }, /obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "pbP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60567,7 +60465,7 @@ /turf/open/floor/iron/white, /area/station/science/research) "pca" = ( -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -60925,10 +60823,6 @@ }, /turf/open/floor/glass, /area/station/maintenance/space_hut/observatory) -"pgA" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall, -/area/station/engineering/main) "pgE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61495,6 +61389,21 @@ /obj/machinery/duct, /turf/open/floor/iron/diagonal, /area/station/medical/break_room) +"pnc" = ( +/obj/machinery/light/small/directional/north, +/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; + dir = 1 + }, +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "png" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -61699,7 +61608,7 @@ /turf/open/floor/iron, /area/station/commons/lounge) "prl" = ( -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/closet/crate, /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, @@ -61854,7 +61763,7 @@ /obj/structure/sign/warning/electric_shock/directional/south, /obj/structure/cable, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "ptC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61869,6 +61778,9 @@ /area/station/maintenance/department/crew_quarters/bar) "ptI" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/painting/large/library_private{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/station/service/library/printer) "ptM" = ( @@ -61889,7 +61801,7 @@ /obj/effect/turf_decal/stripes/line, /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "puh" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional{ dir = 8 @@ -61937,7 +61849,7 @@ /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "puK" = ( /obj/structure/table, /obj/item/storage/crayons, @@ -62032,7 +61944,6 @@ /obj/effect/turf_decal/bot, /obj/machinery/camera/directional/west{ c_tag = "Service - Hydroponics Back"; - dir = 10; name = "hallway camera" }, /obj/effect/turf_decal/tile/blue{ @@ -62101,7 +62012,7 @@ /area/station/service/kitchen) "pwC" = ( /obj/item/radio/intercom/directional/north, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/spawner/random/structure/closet_private, /obj/item/clothing/under/rank/civilian/curator, /obj/item/clothing/under/rank/civilian/curator/skirt, @@ -62221,7 +62132,7 @@ /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) +/area/station/ai/satellite/exterior) "pxz" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/turf_decal/bot, @@ -62695,7 +62606,7 @@ /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "pDx" = ( /obj/effect/turf_decal/siding/purple{ dir = 4 @@ -62824,7 +62735,8 @@ desc = "A sign that shows there are doors here. There are doors everywhere!"; icon_state = "doors"; name = "WARNING: BLAST DOORS"; - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /turf/open/floor/iron/dark/textured_large, /area/station/security/execution/transfer) @@ -62903,7 +62815,7 @@ /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/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "pFq" = ( /obj/structure/sign/warning/no_smoking/directional/west, /obj/effect/turf_decal/stripes/line{ @@ -62947,7 +62859,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "pFF" = ( /obj/item/kirbyplants/random, /obj/machinery/camera/directional/north{ @@ -63073,7 +62985,7 @@ /obj/item/aicard, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "pGR" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/herringbone, @@ -63117,10 +63029,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"pHy" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall, -/area/station/service/chapel) "pHz" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -63134,7 +63042,7 @@ pixel_x = -7; pixel_y = 9 }, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = -7; pixel_y = 1 }, @@ -63214,7 +63122,7 @@ "pIX" = ( /obj/effect/turf_decal/trimline/dark_red/filled/warning, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "pJf" = ( /obj/structure/chair/office, /obj/effect/turf_decal/siding/yellow, @@ -63317,7 +63225,7 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "pKb" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -63380,7 +63288,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "pKG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63603,7 +63511,7 @@ /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "pNq" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -63714,12 +63622,14 @@ /turf/open/floor/iron, /area/station/commons/dorms) "pOQ" = ( -/obj/structure/lattice, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 +/obj/machinery/door/poddoor/preopen{ + id = "bridgedoors"; + name = "Bridge Access Blast Door" }, -/turf/open/space/basic, -/area/space/nearstation) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "pOT" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -63992,7 +63902,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "pSg" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -64211,7 +64121,8 @@ desc = "A sign that shows there are doors here. There are doors everywhere!"; icon_state = "doors"; name = "WARNING: EXTERNAL AIRLOCK"; - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -64330,7 +64241,7 @@ /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) +/area/station/ai/satellite/chamber) "pUG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64383,7 +64294,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "pUU" = ( /obj/effect/landmark/start/hangover, /obj/structure/chair/sofa/bench/left{ @@ -64408,7 +64319,7 @@ /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) +/area/station/security/armory) "pVb" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/bot, @@ -64440,7 +64351,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron, /area/station/maintenance/port) "pVR" = ( @@ -64674,7 +64585,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -64864,12 +64775,9 @@ /obj/machinery/status_display/ai/directional/south, /obj/machinery/camera/directional/south{ c_tag = "Service - Bar Aft"; - dir = 5; name = "service camera" }, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, +/obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/commons/lounge) @@ -64983,7 +64891,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, @@ -65123,7 +65031,7 @@ /obj/structure/cable/layer3, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "qdP" = ( /obj/item/kirbyplants/random, /obj/structure/extinguisher_cabinet/directional/east, @@ -65131,23 +65039,12 @@ /turf/open/floor/iron, /area/station/engineering/supermatter/room) "qdT" = ( -/obj/structure/table/wood, -/obj/item/storage/medkit/emergency, -/obj/item/toy/figure/paramedic, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 }, -/turf/open/floor/iron/white, -/area/station/medical/paramedic) -"qdV" = ( -/obj/machinery/flasher/directional/south{ - id = "AI"; - pixel_x = -26 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/closet/secure_closet/paramedic, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/medical/paramedic) "qdW" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -65177,7 +65074,7 @@ /obj/item/folder/documents, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "qeg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65703,6 +65600,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos/project) "qlA" = ( @@ -65711,12 +65609,12 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" }, /obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/fore) "qlD" = ( @@ -65917,6 +65815,7 @@ "qoo" = ( /obj/structure/table/wood, /obj/item/pai_card, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/wood, /area/station/command/meeting_room/council) "qoA" = ( @@ -66392,9 +66291,15 @@ /turf/open/floor/iron, /area/station/maintenance/port/aft) "qvn" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall, -/area/station/maintenance/port/fore) +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/mid_joiner{ + dir = 4 + }, +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "qvo" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" @@ -66405,10 +66310,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/fore) "qvq" = ( @@ -66453,6 +66358,7 @@ /obj/item/paper_bin, /obj/item/pen, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/dark, /area/station/security/courtroom) "qvG" = ( @@ -66567,7 +66473,7 @@ /obj/structure/sign/departments/aiupload/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "qxi" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -66673,6 +66579,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/sign/warning/radiation/directional/east, /turf/open/floor/iron, /area/station/engineering/atmos/project) "qyy" = ( @@ -66760,7 +66667,7 @@ normaldoorcontrol = 1; specialfunctions = 4 }, -/obj/item/food/sandwich/cheese/grilled, +/obj/item/food/sandwich/grilled_cheese, /turf/open/floor/iron/cafeteria, /area/station/medical/break_room) "qzT" = ( @@ -66934,7 +66841,7 @@ /obj/item/restraints/handcuffs, /obj/item/assembly/flash/handheld, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "qBF" = ( /obj/machinery/status_display/ai/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66984,7 +66891,7 @@ /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, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/iron, @@ -67127,7 +67034,7 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/vault, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "qDT" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -67323,7 +67230,7 @@ /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) +/area/station/ai/upload/chamber) "qGw" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -67637,7 +67544,7 @@ "qKc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "qKg" = ( /obj/machinery/duct, /obj/effect/landmark/event_spawn, @@ -67654,7 +67561,7 @@ /obj/structure/cable/layer3, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "qKk" = ( /obj/structure/table/wood, /obj/item/radio/intercom, @@ -67797,6 +67704,7 @@ /obj/structure/chair{ dir = 8 }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/plating, /area/station/security/execution/transfer) "qLG" = ( @@ -67805,10 +67713,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"qLJ" = ( -/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, @@ -67854,7 +67758,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/service/library, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -67896,10 +67800,10 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "qMS" = ( -/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/kirbyplants/random, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) "qNb" = ( @@ -68014,7 +67918,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -68176,7 +68080,7 @@ name = "Security Transferring Center" }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/structure/disposalpipe/segment, @@ -68371,7 +68275,7 @@ /obj/machinery/porta_turret/ai, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "qTK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68383,19 +68287,17 @@ /area/station/security/courtroom) "qTR" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/dark, /area/station/service/chapel) "qUi" = ( -/obj/structure/disposalpipe/sorting/mail{ - name = "Engineering Junction" - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/mail_sorting/engineering/general, +/obj/structure/disposalpipe/junction, /turf/open/floor/iron, /area/station/engineering/main) "qUu" = ( @@ -68441,10 +68343,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, /turf/open/floor/iron, /area/station/cargo/storage) -"qUM" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/r_wall, -/area/station/tcommsat/server) "qUP" = ( /obj/machinery/hydroponics/soil, /obj/item/shovel/spade, @@ -68666,10 +68564,6 @@ dir = 1 }, /area/station/medical/morgue) -"qZb" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall, -/area/station/maintenance/port) "qZn" = ( /obj/machinery/status_display/ai/directional/south, /obj/effect/turf_decal/trimline/yellow/filled/line, @@ -68988,7 +68882,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69101,7 +68995,7 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "rgj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69168,7 +69062,7 @@ }, /obj/machinery/light/small/directional/north, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "rgK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69180,7 +69074,7 @@ "rgL" = ( /obj/structure/cable, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "rgN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/start/depsec/engineering, @@ -69205,7 +69099,7 @@ /obj/effect/turf_decal/stripes/line, /obj/structure/cable/multilayer/connected, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "rhf" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/bot, @@ -69264,7 +69158,7 @@ /obj/machinery/status_display/ai/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "rhK" = ( /obj/structure/flora/bush/stalky/style_random, /obj/structure/flora/bush/lavendergrass/style_random, @@ -69293,7 +69187,7 @@ /turf/open/floor/iron, /area/station/maintenance/department/crew_quarters/bar) "riv" = ( -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/closet/emcloset, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -69339,16 +69233,13 @@ /obj/structure/cable/layer3, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "rjt" = ( /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 }, @@ -69358,6 +69249,7 @@ /obj/item/wrench, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron/dark, /area/station/security/execution/education) "rjz" = ( @@ -69470,7 +69362,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/camera/directional/south{ c_tag = "Library - Aft Port"; - dir = 5; name = "library camera" }, /turf/open/floor/iron/grimy, @@ -69535,7 +69426,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/iron, @@ -69689,9 +69580,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron, /area/station/science/auxlab/firing_range) "rmo" = ( @@ -69755,6 +69644,10 @@ "rnf" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/small/directional/east, +/obj/machinery/flasher/directional/east{ + id = "justiceflash"; + req_access = list("security") + }, /turf/open/floor/iron/dark, /area/station/security/execution/education) "rni" = ( @@ -70238,8 +70131,9 @@ /obj/machinery/porta_turret/ai, /obj/machinery/status_display/ai/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "ruU" = ( /obj/item/instrument/violin, /obj/structure/table/wood, @@ -70577,7 +70471,7 @@ }, /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ryE" = ( /obj/structure/closet/crate, /obj/item/stack/sheet/iron/fifty, @@ -70722,7 +70616,7 @@ /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) +/area/station/ai/satellite/exterior) "rAG" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/iron{ @@ -71139,6 +71033,7 @@ dir = 4 }, /obj/machinery/light/small/directional/north, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/hallway) "rGU" = ( @@ -71262,7 +71157,7 @@ dir = 4 }, /obj/effect/spawner/random/structure/barricade, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -71270,9 +71165,7 @@ /area/station/service/kitchen/abandoned) "rIl" = ( /obj/machinery/mass_driver/chapelgun, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -71364,7 +71257,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/spawner/random/structure/barricade, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -71468,7 +71361,7 @@ /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "rKE" = ( /obj/effect/turf_decal/trimline/yellow/line, /obj/machinery/light/directional/south, @@ -71479,7 +71372,7 @@ dir = 10 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "rKG" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, @@ -71776,11 +71669,11 @@ /turf/open/floor/iron, /area/station/science/robotics/lab) "rOa" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = -14 - }, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/storage/gas) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port) "rOc" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/large, @@ -71828,7 +71721,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, @@ -71866,7 +71759,7 @@ dir = 10 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "rOV" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -71907,7 +71800,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "rPf" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -71968,6 +71861,10 @@ /obj/structure/sign/directions/science{ pixel_y = 2 }, +/obj/structure/sign/directions/arrival{ + dir = 1; + pixel_y = 10 + }, /turf/closed/wall, /area/station/commons/vacant_room/office) "rPJ" = ( @@ -72055,7 +71952,7 @@ dir = 4 }, /obj/effect/spawner/random/trash/grille_or_waste, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, @@ -72375,10 +72272,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/fore) "rTW" = ( @@ -72444,11 +72341,9 @@ /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, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/wood, /area/station/commons/dorms) "rVc" = ( @@ -72462,7 +72357,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/iron, /area/station/service/library/abandoned) @@ -72816,7 +72711,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "rZF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -73076,12 +72971,10 @@ dir = 4 }, /obj/effect/turf_decal/bot/left, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/machinery/modular_computer/preset/cargochat/science{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron, /area/station/science/research) "scs" = ( @@ -73121,8 +73014,11 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/small/directional/south, +/obj/machinery/flasher/directional/south{ + id = "AI" + }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "sde" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, @@ -73183,7 +73079,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "sdO" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 1 @@ -73268,15 +73164,13 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "sfc" = ( @@ -73292,6 +73186,7 @@ /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, +/obj/effect/landmark/firealarm_sanity, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) "sfs" = ( @@ -73313,7 +73208,8 @@ desc = "A sign that shows there are doors here. There are doors everywhere!"; icon_state = "doors"; name = "WARNING: EXTERNAL AIRLOCK"; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/smooth_large, @@ -73571,7 +73467,7 @@ /obj/structure/cable/layer3, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "siV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/opposingcorners{ @@ -73701,13 +73597,6 @@ /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 @@ -73717,6 +73606,13 @@ name = "science camera"; network = list("ss13","rd") }, +/obj/machinery/button/door/directional/north{ + pixel_x = 7; + pixel_y = 26; + id = "rdordnance"; + name = "Ordnance Containment Contro"; + req_access = list("science") + }, /turf/open/floor/iron/white, /area/station/science/ordnance/office) "skC" = ( @@ -73727,7 +73623,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "skI" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -73938,7 +73834,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/spawner/random/armory/disablers, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "sob" = ( /obj/structure/disposalpipe/segment, /obj/item/kirbyplants/random, @@ -73998,6 +73894,7 @@ pixel_y = 4 }, /obj/item/radio/intercom/directional/south, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron, /area/station/engineering/main) "soU" = ( @@ -74259,27 +74156,6 @@ /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) "ssr" = ( -/obj/machinery/button/door{ - id = "brigwindows"; - name = "Cell Window Control"; - pixel_x = -32; - pixel_y = -26; - req_access = list("security") - }, -/obj/machinery/button/door{ - id = "brigfront"; - name = "Brig Access Control"; - pixel_x = -26; - pixel_y = -36; - req_access = list("security") - }, -/obj/machinery/button/door{ - id = "brigprison"; - name = "Prison Lockdown"; - pixel_x = -38; - pixel_y = -36; - req_access = list("brig") - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74469,7 +74345,7 @@ req_access = list("captain") }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "suZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74630,6 +74506,7 @@ fax_name = "Captain's Office"; name = "Captain's Fax Machine" }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) "swn" = ( @@ -74695,7 +74572,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, @@ -74772,7 +74649,6 @@ /area/station/science/ordnance/office) "sxG" = ( /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -74782,7 +74658,8 @@ /obj/machinery/door/airlock/medical{ name = "Medbay Desk" }, -/turf/open/floor/iron, +/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "sxK" = ( /obj/effect/turf_decal/siding/wood, @@ -74929,7 +74806,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "szs" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -75042,7 +74919,7 @@ /turf/open/floor/iron, /area/station/service/hydroponics) "sAY" = ( -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/closet/firecloset, /obj/effect/turf_decal/delivery, /obj/machinery/firealarm/directional/west, @@ -75286,7 +75163,8 @@ desc = "A sign that shows there are doors here. There are doors everywhere!"; icon_state = "doors"; name = "WARNING: PRESSURIZED DOORS"; - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /turf/open/floor/plating, /area/station/maintenance/port/fore) @@ -75315,7 +75193,7 @@ /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, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/iron, @@ -75345,7 +75223,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/iron, @@ -75454,7 +75332,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "sGi" = ( /obj/structure/cable, /obj/effect/landmark/start/hangover, @@ -75476,17 +75354,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "sGx" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"sGz" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall, -/area/station/command/heads_quarters/hop) "sGB" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/disposal/bin, @@ -75511,7 +75385,7 @@ req_access = list("ai_upload") }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "sGQ" = ( /obj/structure/chair/office{ dir = 4 @@ -75694,26 +75568,15 @@ /turf/open/floor/plating, /area/station/maintenance/department/security) "sIZ" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sign/directions/engineering{ +/obj/structure/sign/directions/arrival{ dir = 8; - pixel_x = -32; - pixel_y = -8 - }, -/obj/structure/sign/directions/command{ - dir = 1; - pixel_x = -32; pixel_y = 8 }, -/obj/structure/sign/directions/vault{ - dir = 1; - pixel_x = -32 +/obj/structure/sign/directions/medical, +/obj/structure/sign/directions/evac{ + pixel_y = -8 }, -/turf/open/floor/iron, +/turf/closed/wall, /area/station/hallway/primary/central/fore) "sJb" = ( /obj/effect/spawner/random/trash/mess, @@ -75759,7 +75622,7 @@ "sJr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "sJF" = ( /obj/machinery/button/ignition/incinerator/atmos, /turf/closed/wall/r_wall, @@ -75843,7 +75706,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -75899,7 +75762,7 @@ "sKP" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "sKQ" = ( /obj/machinery/computer/pandemic, /obj/effect/turf_decal/bot, @@ -76059,13 +75922,11 @@ /turf/open/floor/iron, /area/station/engineering/supermatter/room) "sMx" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "sMG" = ( @@ -76460,7 +76321,7 @@ "sSb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "sSe" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -76547,7 +76408,8 @@ id = "Cell 2"; name = "Prisoner Flash"; pixel_x = 25; - pixel_y = 7 + pixel_y = 7; + dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -76593,24 +76455,15 @@ /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, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sign/directions/dorms{ - pixel_x = 32; - pixel_y = -8 +/obj/structure/sign/directions/science{ + dir = 8 }, -/obj/structure/sign/directions/supply{ +/obj/structure/sign/directions/command{ dir = 1; - pixel_x = 32; pixel_y = 8 }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) +/turf/closed/wall, +/area/station/medical/psychology) "sTV" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/virology/glass{ @@ -76754,7 +76607,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "sVW" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -76888,14 +76741,6 @@ /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) -"sXE" = ( -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/obj/structure/lattice/catwalk, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, -/turf/open/space/basic, -/area/space/nearstation) "sXI" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -77157,12 +77002,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/table, /obj/machinery/light/directional/west, -/obj/item/stack/conveyor/thirty, -/obj/item/boulder_beacon{ - pixel_x = -5 +/obj/item/food/ready_donk/donkrange_chicken, +/obj/item/food/ready_donk/donkhiladas{ + pixel_y = 5 }, -/obj/item/conveyor_switch_construct{ - pixel_x = 10 +/obj/item/food/ready_donk/country_chicken{ + pixel_y = 10 + }, +/obj/structure/closet/mini_fridge{ + name = "mini-fridge" }, /turf/open/floor/iron, /area/station/cargo/miningoffice) @@ -77176,7 +77024,7 @@ }, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, /turf/open/floor/iron, /area/station/maintenance/department/medical/morgue) @@ -77341,7 +77189,7 @@ /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/command/nuke_storage) +/area/station/command/vault) "tcH" = ( /obj/structure/table/glass, /obj/item/folder/yellow, @@ -77446,7 +77294,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "teA" = ( /obj/structure/displaycase/captain, /turf/open/floor/iron/grimy, @@ -77477,7 +77325,7 @@ /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "tfi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock{ @@ -77499,7 +77347,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tfq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -77589,6 +77437,7 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) "tgT" = ( @@ -77700,6 +77549,7 @@ dir = 5 }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/departments/vault/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/atmos) "tiP" = ( @@ -77794,7 +77644,7 @@ /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) +/area/station/ai/satellite/exterior) "tkB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -77963,7 +77813,7 @@ /obj/structure/cable/layer3, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tnJ" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, @@ -78126,10 +77976,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den/gaming) -"tpJ" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall, -/area/station/security/courtroom) "tpP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -78300,7 +78146,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "trW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/directional/north{ @@ -78428,7 +78274,7 @@ /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tti" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -78477,7 +78323,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -78592,7 +78438,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/iron, @@ -78990,15 +78836,13 @@ /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) "tAL" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/structure/railing{ dir = 1 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "tAM" = ( @@ -79267,7 +79111,7 @@ /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) +/area/station/ai/upload/chamber) "tDD" = ( /obj/machinery/computer/shuttle/mining{ dir = 1 @@ -79331,13 +79175,10 @@ /turf/open/floor/iron, /area/station/service/kitchen/abandoned) "tEd" = ( -/obj/machinery/flasher/directional/south{ - id = "AI"; - pixel_x = 26 - }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/departments/vault/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/command/vault) "tEh" = ( /obj/structure/sign/directions/evac{ pixel_y = -8 @@ -79673,27 +79514,13 @@ /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "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, @@ -79703,7 +79530,7 @@ /obj/machinery/light_switch/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tIe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/maintenance_hatch{ @@ -79716,7 +79543,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, @@ -79798,26 +79625,17 @@ /turf/open/floor/carpet, /area/station/commons/vacant_room/office) "tJT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sign/directions/vault{ - pixel_x = 32; - pixel_y = -8 - }, -/obj/structure/sign/directions/dorms{ - pixel_x = 32 +/obj/structure/sign/directions/arrival{ + dir = 8; + pixel_x = 1 }, -/obj/structure/sign/directions/security{ - pixel_x = 32; - pixel_y = 8 +/obj/structure/sign/directions/lavaland{ + dir = 1; + pixel_x = 1; + pixel_y = 10 }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) +/turf/closed/wall, +/area/station/hallway/secondary/entry) "tJU" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 1 @@ -79864,7 +79682,7 @@ "tKq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "tKw" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -79920,10 +79738,6 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/half, /area/station/security/range) -"tLC" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/station/engineering/supermatter/room) "tLW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/red/fourcorners, @@ -80123,11 +79937,11 @@ }, /obj/effect/turf_decal/stripes/line, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/unres, /obj/machinery/door/airlock/medical/glass{ id_tag = "MedbayFoyer"; name = "Medbay Foyer" }, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/iron, /area/station/medical/medbay/lobby) "tOm" = ( @@ -80146,7 +79960,7 @@ /area/station/security/range) "tOs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/siding/wood, /obj/structure/closet/secure_closet/personal/cabinet{ name = "clown's closet" @@ -80468,7 +80282,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "tSq" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/structure/table/reinforced, @@ -80683,10 +80497,10 @@ /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) +/area/station/security/armory) "tVC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/closet/secure_closet/personal/cabinet{ name = "clown's closet" }, @@ -80704,7 +80518,6 @@ /obj/machinery/holopad, /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/paramedic, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay) @@ -80756,12 +80569,11 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tWx" = ( /obj/effect/turf_decal/tile/red/diagonal_centre, /obj/effect/turf_decal/tile/blue/diagonal_edge, /obj/machinery/duct, -/obj/effect/landmark/start/paramedic, /turf/open/floor/iron/diagonal, /area/station/medical/break_room) "tWD" = ( @@ -80971,6 +80783,13 @@ /obj/structure/sign/directions/command{ dir = 1 }, +/obj/structure/sign/directions/dorms{ + pixel_y = -8 + }, +/obj/structure/sign/directions/supply{ + dir = 1; + pixel_y = 8 + }, /turf/closed/wall, /area/station/commons/storage/tools) "tYz" = ( @@ -81186,7 +81005,7 @@ }, /area/station/science/research) "uaY" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{ dir = 4 @@ -81205,10 +81024,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/fore) "ubz" = ( @@ -81390,7 +81209,7 @@ /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 }, -/obj/structure/sign/warning/no_smoking/directional/north, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, /area/station/medical/medbay) "udf" = ( @@ -81445,13 +81264,13 @@ }, /obj/effect/turf_decal/stripes/line, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/medical/abandoned) "udG" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, /obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{ dir = 4 }, @@ -81560,7 +81379,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ueC" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/east, @@ -81668,10 +81487,6 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"ugP" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/station/maintenance/port) "uhb" = ( /turf/closed/wall/r_wall, /area/station/science/xenobiology) @@ -81701,7 +81516,7 @@ /obj/machinery/status_display/ai/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "uhH" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -81720,7 +81535,7 @@ /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) +/area/station/ai/satellite/chamber) "uhS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -81877,7 +81692,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ujL" = ( /obj/structure/table/reinforced, /obj/item/clipboard, @@ -81960,7 +81775,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ukR" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -82097,7 +81912,7 @@ dir = 5 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "umA" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/siding/blue{ @@ -82125,7 +81940,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, @@ -82140,7 +81955,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "umN" = ( /turf/closed/wall, @@ -82150,7 +81965,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "umT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -82237,7 +82052,7 @@ /turf/open/floor/iron, /area/station/engineering/supermatter/room) "unO" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, /obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{ dir = 4 }, @@ -82275,9 +82090,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark, @@ -82296,7 +82108,7 @@ /obj/structure/table/wood/fancy/green, /obj/effect/spawner/random/aimodule/harmless, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "uoS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -82351,10 +82163,11 @@ "upp" = ( /obj/item/kirbyplants/random, /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat_interior"; + control_area = "/area/station/ai/satellite/interior"; name = "Antechamber Turret Control"; pixel_x = -32; - req_access = list("minisat") + req_access = list("minisat"); + dir = 8 }, /obj/machinery/camera/directional/west{ c_tag = "AI Satellite - Teleporter"; @@ -82364,13 +82177,13 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "upB" = ( /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/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "upM" = ( /obj/structure/table, /obj/item/storage/photo_album/prison, @@ -82394,7 +82207,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "uqk" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral, @@ -82470,7 +82283,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "urq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -82496,7 +82309,7 @@ /obj/machinery/firealarm/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "urC" = ( /obj/structure/cable, /obj/structure/table/reinforced, @@ -82551,7 +82364,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -82785,7 +82598,7 @@ cycle_id = "sci-toxins-passthrough" }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron, /area/station/maintenance/department/science) "uuP" = ( @@ -82857,7 +82670,7 @@ /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) +/area/station/command/vault) "uvR" = ( /obj/machinery/camera/directional/south{ c_tag = "Security Hallway - Center"; @@ -83109,7 +82922,7 @@ /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) +/area/station/ai/satellite/exterior) "uyB" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -83259,12 +83072,9 @@ /turf/open/floor/wood/large, /area/station/service/library) "uzZ" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) "uAc" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -83308,9 +83118,6 @@ /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; @@ -83322,6 +83129,7 @@ }, /obj/effect/turf_decal/tile/red/fourcorners, /obj/machinery/light/small/directional/south, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron/dark, /area/station/security/lockers) "uAV" = ( @@ -83440,7 +83248,8 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/iron/white, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "uCp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -83518,18 +83327,14 @@ /turf/open/floor/iron, /area/station/engineering/lobby) "uDj" = ( -/obj/structure/cable, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 +/obj/machinery/door/poddoor/preopen{ + id = "bridgedoors"; + name = "Bridge Access Blast Door" }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, -/area/station/command/corporate_showroom) +/area/station/command/bridge) "uDk" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -83547,7 +83352,7 @@ }, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "uDp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -83577,10 +83382,6 @@ /obj/structure/chair/stool/bar/directional/north, /turf/open/floor/carpet/green, /area/station/commons/lounge) -"uDI" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall, -/area/station/service/chapel/funeral) "uDJ" = ( /obj/structure/sign/poster/contraband/random/directional/west, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ @@ -83659,9 +83460,6 @@ /turf/open/floor/iron/white/side, /area/station/science/research) "uFa" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, /obj/machinery/camera/directional/south{ c_tag = "Security - Brig Desk" }, @@ -83671,6 +83469,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/red/half/contrasted, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron, /area/station/security/holding_cell) "uFs" = ( @@ -84035,7 +83834,7 @@ "uJH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "uJN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -84384,7 +84183,7 @@ /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "uNt" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/turf_decal/bot_white, @@ -84442,8 +84241,9 @@ /turf/open/floor/iron, /area/station/maintenance/port) "uNU" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/r_wall, +/obj/item/kirbyplants/random, +/obj/structure/sign/nanotrasen/directional/west, +/turf/open/floor/wood, /area/station/command/heads_quarters/hop) "uNY" = ( /turf/closed/wall, @@ -84494,9 +84294,7 @@ /area/station/service/abandoned_gambling_den) "uOC" = ( /obj/structure/lattice, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/space/basic, /area/space/nearstation) "uOE" = ( @@ -84590,7 +84388,7 @@ /turf/open/floor/iron, /area/station/commons/storage/tools) "uPj" = ( -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/delivery, /obj/structure/closet/emcloset, /turf/open/floor/iron, @@ -84658,9 +84456,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/space/basic, /area/space/nearstation) "uPS" = ( @@ -84720,32 +84516,19 @@ }, /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, +/obj/structure/table/reinforced, +/obj/item/toy/figure/md{ + pixel_y = 4 + }, +/obj/item/reagent_containers/hypospray/medipen{ + pixel_y = -4 + }, /turf/open/floor/iron/textured, /area/station/medical/storage) "uQN" = ( @@ -84768,7 +84551,7 @@ /obj/structure/cable/layer3, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "uRe" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ dir = 10 @@ -84887,6 +84670,17 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) +"uSo" = ( +/obj/structure/sign/directions/upload{ + dir = 8; + pixel_y = 8 + }, +/obj/structure/sign/directions/science, +/obj/structure/sign/directions/medical{ + pixel_y = -8 + }, +/turf/closed/wall, +/area/station/service/barber) "uSL" = ( /obj/effect/turf_decal/box/white{ color = "#9FED58" @@ -84952,7 +84746,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "uTM" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -85026,7 +84820,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/fore) @@ -85070,7 +84864,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "uVZ" = ( /obj/structure/cable, /obj/machinery/duct, @@ -85192,7 +84986,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "uYp" = ( /obj/machinery/computer/records/medical{ dir = 8 @@ -85498,7 +85292,7 @@ /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/delivery, /obj/machinery/airalarm/directional/west, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) @@ -85585,7 +85379,7 @@ }, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "vdH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -85739,18 +85533,11 @@ /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 }, +/obj/structure/filingcabinet/chestdrawer, /turf/open/floor/iron/white, /area/station/medical/paramedic) "vfN" = ( @@ -85799,7 +85586,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "vgm" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible, @@ -85873,9 +85660,7 @@ /area/station/service/bar/backroom) "vhW" = ( /obj/item/kirbyplants/random, -/obj/structure/sign/warning/pods/directional/south{ - dir = 8 - }, +/obj/structure/sign/warning/pods/directional/south, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 }, @@ -86110,11 +85895,9 @@ "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, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/primary/central/fore) "vlA" = ( @@ -86331,6 +86114,7 @@ /obj/effect/turf_decal/trimline/yellow/mid_joiner{ dir = 8 }, +/obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/plating, /area/station/engineering/supermatter/room) "voi" = ( @@ -86452,10 +86236,8 @@ /turf/open/floor/iron, /area/station/engineering/storage_shared) "vqg" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/effect/landmark/start/hangover, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/wood, /area/station/commons/dorms) "vqt" = ( @@ -86612,7 +86394,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/iron, @@ -86883,6 +86665,7 @@ dir = 1 }, /obj/machinery/light/small/directional/south, +/obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/iron/half, /area/station/engineering/main) "vvy" = ( @@ -86941,7 +86724,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "vvO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -87087,7 +86870,7 @@ /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) +/area/station/ai/satellite/chamber) "vxQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -87139,7 +86922,7 @@ /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) +/area/station/security/armory) "vyl" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -87214,7 +86997,7 @@ /obj/item/storage/belt/utility, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "vze" = ( /obj/structure/bookcase/random, /obj/item/radio/intercom/directional/south{ @@ -87315,13 +87098,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"vAl" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32; - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/station/command/meeting_room/council) "vAs" = ( /obj/structure/cable, /obj/machinery/holopad/secure, @@ -87484,10 +87260,6 @@ icon_state = "foam_plating" }, /area/station/maintenance/department/science/xenobiology) -"vBX" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall, -/area/station/engineering/storage/tech) "vBY" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -87506,7 +87278,8 @@ /area/station/hallway/primary/fore) "vCk" = ( /obj/structure/sign/departments/medbay/alt{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -87727,7 +87500,6 @@ /obj/structure/cable, /obj/machinery/camera/directional/east{ c_tag = "Dormitories - Hall"; - dir = 6; name = "dormitories camera" }, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -87769,7 +87541,7 @@ pixel_y = -16 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "vFC" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 5 @@ -87838,7 +87610,7 @@ /obj/structure/secure_safe/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "vGP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/railing{ @@ -88022,6 +87794,7 @@ }, /obj/structure/closet/radiation, /obj/machinery/firealarm/directional/north, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron, /area/station/engineering/main) "vJh" = ( @@ -88098,7 +87871,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "vKl" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -88142,6 +87915,7 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) "vLg" = ( @@ -88301,17 +88075,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"vOe" = ( -/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, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "vOh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -88386,7 +88149,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "vPe" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -88596,10 +88359,6 @@ "vRU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/directions/lavaland{ - dir = 4; - pixel_y = -26 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -88620,7 +88379,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "vSk" = ( /obj/structure/table/wood, /obj/item/folder/red, @@ -88962,7 +88721,7 @@ /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "vWV" = ( /obj/effect/turf_decal/bot, /obj/machinery/requests_console/directional/north{ @@ -89055,7 +88814,7 @@ /area/station/service/abandoned_gambling_den/gaming) "vXT" = ( /obj/structure/closet/wardrobe/pjs, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -89183,7 +88942,7 @@ "vZE" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "vZX" = ( /obj/machinery/status_display/ai/directional/north, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -89213,7 +88972,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -89270,11 +89029,11 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/aft) "wbe" = ( @@ -89576,7 +89335,7 @@ dir = 4 }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, @@ -89693,7 +89452,7 @@ /area/station/commons/dorms) "wgF" = ( /obj/structure/cable, -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 1 }, /obj/machinery/status_display/ai/directional/south, @@ -89707,7 +89466,7 @@ /obj/structure/cable/layer3, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "wgL" = ( /turf/open/floor/wood, /area/station/service/library/abandoned) @@ -90103,15 +89862,18 @@ /obj/structure/cable, /obj/machinery/button/door/incinerator_vent_atmos_aux{ pixel_x = -8; - pixel_y = 24 + pixel_y = 24; + dir = 1 }, /obj/machinery/button/door/incinerator_vent_atmos_main{ pixel_x = -8; - pixel_y = 36 + pixel_y = 36; + dir = 1 }, /obj/machinery/button/ignition/incinerator/atmos{ pixel_x = 8; - pixel_y = 36 + pixel_y = 36; + dir = 1 }, /obj/structure/closet/radiation, /obj/item/analyzer, @@ -90489,25 +90251,14 @@ /turf/open/floor/stone, /area/station/command/corporate_showroom) "wpu" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sign/directions/evac{ - pixel_x = -32; - pixel_y = -8 - }, -/obj/structure/sign/directions/medical{ - pixel_x = -32 - }, -/obj/structure/sign/directions/arrival{ - dir = 8; - pixel_x = -32; - pixel_y = 8 +/obj/machinery/door/poddoor/preopen{ + id = "brigwindows"; + name = "Brig Front Blast Door" }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/security/holding_cell) "wpx" = ( /obj/machinery/airalarm/directional/north, /obj/structure/table, @@ -90678,7 +90429,8 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /obj/structure/sign/warning/no_smoking{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -90824,7 +90576,7 @@ /obj/effect/turf_decal/trimline/dark_red/filled/line, /obj/structure/chair/office, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "wtS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -90837,6 +90589,10 @@ /area/station/science/research) "wtU" = ( /obj/structure/cable, +/obj/structure/sign/plaques/kiddie/library{ + dir = 1; + pixel_y = 32 + }, /turf/open/floor/wood/tile, /area/station/service/library/artgallery) "wtV" = ( @@ -91161,9 +90917,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "wxX" = ( @@ -91296,7 +91050,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "wAt" = ( /obj/machinery/hydroponics/soil, @@ -91484,7 +91238,8 @@ "wCr" = ( /obj/machinery/button/crematorium{ id = "crematoriumChapel"; - pixel_x = 25 + pixel_x = 25; + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -91916,7 +91671,7 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "wHW" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/wood, @@ -92019,7 +91774,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/floor, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "wJs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -92072,7 +91827,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "wJY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, @@ -92091,14 +91846,12 @@ /turf/open/floor/iron/chapel, /area/station/service/chapel) "wKm" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) "wKo" = ( @@ -92239,7 +91992,7 @@ /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/aisat_interior) +/area/station/ai/satellite/interior) "wLZ" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/yellow{ @@ -92465,7 +92218,7 @@ /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) +/area/station/command/vault) "wQo" = ( /obj/structure/table/wood, /obj/machinery/recharger{ @@ -92549,7 +92302,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "wRz" = ( /obj/structure/table/wood, /obj/item/storage/briefcase/secure{ @@ -92736,7 +92489,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "wTF" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -92833,7 +92586,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "wVQ" = ( /obj/structure/table, /obj/effect/spawner/random/food_or_drink/snack, @@ -93148,8 +92901,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/commons/vacant_room/office) "xbp" = ( @@ -93444,7 +93197,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -93655,7 +93408,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, @@ -93711,7 +93464,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -93753,6 +93506,7 @@ "xil" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, /obj/machinery/light/directional/south, +/obj/structure/sign/warning/radiation/directional/south, /turf/open/floor/iron, /area/station/engineering/supermatter/room) "xin" = ( @@ -93838,7 +93592,7 @@ /obj/structure/cable, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "xjo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -94147,7 +93901,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "xnw" = ( /obj/structure/table/wood, /obj/machinery/computer/security/wooden_tv, @@ -94234,7 +93988,7 @@ /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_upload) +/area/station/ai/upload/chamber) "xpy" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -94257,6 +94011,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron/dark/corner{ dir = 1 }, @@ -94366,7 +94121,7 @@ /obj/machinery/power/apc/auto_name/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "xrg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -94633,7 +94388,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Drone Maintenance" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -94735,7 +94490,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/iron, @@ -94959,7 +94714,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/floor, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "xxN" = ( /obj/structure/table/wood, /obj/machinery/computer/security/telescreen/entertainment/directional/north, @@ -94971,9 +94726,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/effect/landmark/start/medical_doctor, /obj/effect/turf_decal/tile/neutral/full, -/turf/open/floor/iron/large, +/turf/open/floor/iron/dark/smooth_large, /area/station/medical/paramedic) "xxX" = ( /obj/effect/decal/cleanable/dirt, @@ -95039,9 +94793,11 @@ /turf/open/floor/iron, /area/station/hallway/primary/fore) "xyu" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/r_wall, -/area/station/maintenance/department/medical/morgue) +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai/satellite/interior) "xyC" = ( /obj/effect/decal/cleanable/blood/oil, /obj/structure/reflector/single, @@ -95389,13 +95145,11 @@ /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) "xCf" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "xCC" = ( @@ -95526,10 +95280,6 @@ /turf/open/floor/iron, /area/station/science/xenobiology) "xEg" = ( -/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, @@ -96200,7 +95950,7 @@ /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) +/area/station/ai/satellite/chamber) "xMI" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/computer/atmos_control/nitrogen_tank{ @@ -96251,7 +96001,7 @@ /obj/structure/cable/layer3, /mob/living/simple_animal/bot/secbot/pingsky, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xMX" = ( /obj/structure/chair/office{ dir = 4 @@ -96261,7 +96011,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "xNe" = ( /obj/structure/lattice, /obj/structure/grille/broken, @@ -96326,12 +96076,14 @@ /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 = 8 - }, /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 }, +/obj/effect/mapping_helpers/mail_sorting/engineering/general, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + name = "Engineering Junction" + }, /turf/open/floor/iron, /area/station/engineering/lobby) "xNU" = ( @@ -96390,7 +96142,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /obj/machinery/camera/directional/west{ c_tag = "Service - Kitchen Coldroom"; - dir = 10; name = "service camera" }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, @@ -96501,7 +96252,7 @@ /area/station/medical/storage) "xQZ" = ( /obj/machinery/airalarm/directional/north, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/spawner/random/structure/closet_private, /obj/item/clothing/head/costume/kitty, /obj/item/clothing/under/costume/maid, @@ -96523,7 +96274,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xRv" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/stripes/line, @@ -96540,7 +96291,7 @@ /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) +/area/station/ai/satellite/exterior) "xRF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -96750,6 +96501,7 @@ network = list("ss13","engine") }, /obj/item/kirbyplants/random, +/obj/structure/sign/warning/radiation/directional/east, /turf/open/floor/iron, /area/station/engineering/supermatter/room) "xUq" = ( @@ -96904,7 +96656,7 @@ /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/aisat/exterior) +/area/station/ai/satellite/exterior) "xWw" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/maintenance_hatch{ @@ -96958,7 +96710,7 @@ /obj/item/multitool, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "xWQ" = ( /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt, @@ -97125,7 +96877,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/structure/cable, @@ -97182,7 +96934,7 @@ /obj/machinery/computer/bank_machine, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "yaj" = ( /obj/effect/turf_decal/siding/white/corner, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -97247,7 +96999,7 @@ /area/station/commons/dorms) "yaW" = ( /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "yba" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -97599,7 +97351,7 @@ /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) +/area/station/ai/satellite/chamber) "ygc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -97636,7 +97388,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/structure/disposalpipe/segment{ @@ -97685,13 +97437,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/floor, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "ygY" = ( /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_x = -32 + pixel_x = -32; + dir = 8 }, /obj/effect/turf_decal/tile/red{ dir = 4 @@ -97765,7 +97518,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "yhJ" = ( /turf/open/floor/plating/airless, /area/space/nearstation) @@ -97981,15 +97734,12 @@ /turf/open/floor/plating, /area/station/engineering/supermatter/room) "ykl" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/departments/vault/directional/east{ - pixel_y = -32 +/obj/structure/sign/plaques/kiddie/library{ + dir = 1; + pixel_y = 32 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/turf/open/floor/wood/tile, +/area/station/service/library/artgallery) "ykm" = ( /obj/structure/table/wood, /obj/item/clipboard, @@ -98028,7 +97778,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/obj/machinery/computer/rdconsole{ +/obj/machinery/computer/rdconsole/unlocked{ dir = 4 }, /turf/open/floor/iron, @@ -105442,7 +105192,7 @@ jPe kXJ cQh bPC -bRD +bPC bPC tnG bPC @@ -105704,7 +105454,7 @@ ikT uQY ikT qTF -bRD +bPC ruN aRr csk @@ -105967,7 +105717,7 @@ hmU sdK xpt sdK -qdV +sdK qGs cdt idU @@ -106995,7 +106745,7 @@ hmU sdK tDB hmU -tEd +hmU cJh cdt idU @@ -107498,7 +107248,7 @@ xMX kXJ cQh bPC -bRD +bPC bPC dNg bPC @@ -107755,7 +107505,7 @@ lyf lMA btH bPC -uNh +xyu upp hzJ rKC @@ -116227,7 +115977,7 @@ efQ qYo wes gnH -sXE +gnH gnH wFJ wFJ @@ -117018,7 +116768,7 @@ qYo aaa vVc gAw -uzZ +qYo qYo ksq vVc @@ -117802,7 +117552,7 @@ ike cbs wry hIh -akM +nCi jyt hKV dXH @@ -118286,7 +118036,7 @@ xUy xqR qzc kUx -kTV +nUp chv dQl oIE @@ -119073,8 +118823,8 @@ ntd hWY heZ bpr -bpr -anB +qvn +gAw ilG cwI sHT @@ -119314,7 +119064,7 @@ xUy xqR vTc oMh -kTV +nUp oow qzT nAF @@ -119344,9 +119094,9 @@ jcL vUV ugr xil -tLC +gAw epC -qZb +pTC jaI kwX pTC @@ -119588,7 +119338,7 @@ ntd bzY cMA vog -anB +gAw aVW lbl sHT @@ -119858,10 +119608,10 @@ sHT qqQ sLe nzs -tLC +gAw eYG -qZb -uKY +pTC +rOa gcr pTC kWi @@ -120074,7 +119824,7 @@ unO jxJ avX tiC -jfL +hhM mtm guU nNz @@ -120629,7 +120379,7 @@ qJI nCl gAw dtX -ugP +pTC pTC pTC uKY @@ -120886,7 +120636,7 @@ xEt nlS cCY jxQ -nlS +ceV lDk pTC wle @@ -121896,18 +121646,18 @@ rex ttE gAw mwW -anB +gAw cCY cCY cCY gAw gAw gAw -tLC +gAw cCY rAd cCY -tLC +gAw gAw gAw gAw @@ -122931,11 +122681,11 @@ jkK fbn gTr rRD -pgA +rRD aYU pzA aYU -pgA +rRD rRD dOr mKv @@ -124193,7 +123943,7 @@ gvj rNf xLZ xLZ -rOa +xLZ xLZ iVV cZY @@ -124203,11 +123953,11 @@ eSk wif pEY vvp -lDV +tqo tUg gmP qeP -ceV +tqo nFr bfX gRE @@ -124473,11 +124223,11 @@ vvH hcQ dsj rRD -pgA +rRD hOa aGo auD -pgA +rRD fii pUf bID @@ -125700,9 +125450,9 @@ hwM hwM hwM hwM -djf +hwM bGC -djf +hwM hwM oXU vjF @@ -125743,7 +125493,7 @@ bjl lNk nSJ bDX -qLJ +wGA wGA wGA rAH @@ -126214,9 +125964,9 @@ oYs oYs azA nmw -qvn +nmw pKG -qvn +nmw nmw nmw nmw @@ -127030,7 +126780,7 @@ dGS dGS dGS dGS -vBX +dGS dsy nps nps @@ -127301,7 +127051,7 @@ lhZ rQi pTC pTC -qZb +pTC guQ pTC pTC @@ -128918,7 +128668,7 @@ msu deV kpa ydW -pOQ +anZ efQ qYo efQ @@ -129938,7 +129688,7 @@ qQM qQM uBt lVQ -gDW +kzc lpY tsJ wbP @@ -131913,11 +131663,11 @@ ilJ iyq iyq fHI -fHI +kLz mvA rtO rtO -qAQ +uSo sAh sAh qAQ @@ -132170,7 +131920,7 @@ sYU sYU sYU giC -sIZ +cpr hAc ctw lSl @@ -132366,7 +132116,7 @@ aaa aaa qld lYd -bbP +oVq kJd xcm lSh @@ -132698,14 +132448,14 @@ eMc wXU uiR piG -clH +nSv unK erS nXY plO nXY nXY -nXY +okb sxD nXY kHu @@ -132955,14 +132705,14 @@ pRS pRS pRS pRS -uNU +pRS jaV tPc mlE mlE mlE mlE -lBR +mlE mlE mlE mlE @@ -133150,7 +132900,7 @@ sjt dyi iWA vRU -tCs +fcP tCs tCs bJf @@ -133189,7 +132939,7 @@ xms xms xms diL -uQD +pnc drj bog xEg @@ -133446,10 +133196,10 @@ aaa qYo aaa diL -nBJ +uDj eVb jYX -nBJ +pOQ awc fIn rgW @@ -133725,7 +133475,7 @@ tns lZx lZx dQf -sGz +lZx pRS mcv qLS @@ -133800,7 +133550,7 @@ xPc sTV xPc tgT -pOQ +anZ aaa aaa qYo @@ -133982,7 +133732,7 @@ mqr uNy cIb asq -qnQ +uNU pRS tMj kxs @@ -135251,7 +135001,7 @@ yil obc sQA qoo -vAl +mGw mGw qHx awc @@ -136026,8 +135776,8 @@ kZu cjl yfN yiC -qUM -jDi +xkw +uzZ eDK dfb hup @@ -137548,7 +137298,7 @@ qAV ttF qAV qAV -okb +qAV rKN pXg jkf @@ -138102,7 +137852,7 @@ duA fqN mzL sFu -uDj +sFu duA tAL nEk @@ -138275,8 +138025,8 @@ sjt qld qld sjt -sjt -fcP +tJT +qso sde nSF koM @@ -138416,7 +138166,7 @@ tHV tHV tHV tHV -xyu +tHV eKU imN exJ @@ -138849,7 +138599,7 @@ bog jlZ gOU swj -jeI +aby aby igb gOU @@ -139403,7 +139153,7 @@ fNm qeB uNY keH -jtz +yfM ckd veM hJn @@ -139660,7 +139410,7 @@ rmo lnz uNY eQC -gQl +cvX eQC gQl ltz @@ -140140,7 +139890,7 @@ aby wRz aGZ teA -nSv +ivA lnm tLa nDn @@ -140642,7 +140392,7 @@ aaa qYo aaa diL -nBJ +uDj eVb jYX nBJ @@ -140899,10 +140649,10 @@ xms xms xms diL -uQD +pnc drj bog -vOe +xEg gOU prt wUw @@ -141151,7 +140901,7 @@ vRO eUH dvy lSl -kOj +sIZ kGK kNw anV @@ -141179,7 +140929,7 @@ vIQ twE vIQ vIQ -aFE +vIQ jaV tPc ksK @@ -141190,7 +140940,7 @@ ksK ksK ksK ksK -ksK +jom kxg hJs vlY @@ -141202,7 +140952,7 @@ xuI uNY uNY gQl -gpq +gQl gQl gQl gQl @@ -141223,7 +140973,7 @@ dki jzN ram pvF -dki +sTR pAK aZO hXm @@ -141408,7 +141158,7 @@ xhW upX aGG lSl -wpu +cpr lSl lSl lSl @@ -141417,7 +141167,7 @@ pNq kHp skX pNq -lSl +gDW jol lSl lSl @@ -141436,7 +141186,7 @@ ltY lSl lSl dbU -qSd +lBR rRB nOP sqd @@ -141447,7 +141197,7 @@ uKZ sqd sqd rbb -jom +sqd aLv qAW gnz @@ -141480,7 +141230,7 @@ cUY fdX dju dju -kLz +qRA ocC xgH vZl @@ -141922,7 +141672,7 @@ hXg seX mEv vPp -tJT +oAW qzY qzY edB @@ -141936,11 +141686,11 @@ vPp qzY qzY jfK -sTR +oAW eFr ohP lZt -iWH +lZt wXU lZt lZt @@ -141956,7 +141706,7 @@ tHW juZ dHb clH -chF +clH clH clH clH @@ -142179,7 +141929,7 @@ hXg lDY tpZ kOj -kOj +chF nHQ nHQ xPt @@ -142209,11 +141959,11 @@ iVq iVq iVq iVq -iVq +iWH kuO orL orL -hgJ +bBK gFi ssp ssp @@ -142439,7 +142189,7 @@ aaa qYo aaa teY -ykl +tcG teY aaa qYo @@ -142783,7 +142533,7 @@ oWo oWo oGK oGK -pHy +oGK aaa qYo qYo @@ -142954,7 +142704,7 @@ lhY vZE ldU tcG -vZE +tEd vZE lhY qYo @@ -143749,7 +143499,7 @@ aSi aSi aSi aSi -tpJ +iVq wmM iVq oKL @@ -144032,7 +143782,7 @@ nHY gnh aBz lTC -pPl +ykl pPl pPl vPf @@ -145867,7 +145617,7 @@ vNn vNn oGK oGK -pHy +oGK aaa qYo aaa @@ -147403,7 +147153,7 @@ kgf cVh uuP brb -uDI +brb aaa aaa aaa @@ -147851,8 +147601,8 @@ lim uLf grp mJq -bBK -vMj +mJq +wpu jCb kHZ myc @@ -150978,7 +150728,7 @@ qOK nXH nXH nXH -njz +nXH mOH nXH nXH @@ -151679,7 +151429,7 @@ sgh lTJ gJk qIH -pOQ +anZ qYo hQq fNW @@ -153243,10 +152993,10 @@ efQ aaa aaa aaa -mfO +qYo pYW aaa -mfO +qYo aaa aaa aaa @@ -156048,7 +155798,7 @@ cBD hms qLF gJk -pOQ +qYo qYo efQ efQ @@ -157135,7 +156885,7 @@ fIQ uKw mfC uKw -pOQ +anZ efQ aaa aaa diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 8c28835a05b8..70abb1613d39 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -23,6 +23,9 @@ /obj/item/taperecorder, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"aax" = ( +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "aaI" = ( /obj/structure/closet/wardrobe/white, /obj/item/clothing/shoes/jackboots, @@ -67,6 +70,12 @@ /obj/item/clothing/head/helmet/skull, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"abC" = ( +/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/science/server) "abJ" = ( /obj/machinery/camera{ c_tag = "Service - Botany"; @@ -99,14 +108,6 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) -"abQ" = ( -/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) "abT" = ( /obj/structure/table, /obj/item/folder/white, @@ -123,7 +124,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, @@ -170,7 +171,7 @@ /area/station/tcommsat/computer) "adq" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -251,7 +252,7 @@ }, /obj/effect/turf_decal/tile/green, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "aey" = ( /obj/machinery/camera/directional/east{ c_tag = "Xenobiology Pens - Starboard Fore"; @@ -359,7 +360,7 @@ }, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "agI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -478,7 +479,7 @@ /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/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ajr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -683,7 +684,7 @@ }, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "alM" = ( /turf/closed/wall, /area/station/maintenance/aft/lesser) @@ -741,6 +742,15 @@ /obj/structure/flora/bush/style_random, /turf/open/floor/grass, /area/station/service/hydroponics) +"amD" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + location = "Bridge" + }, +/obj/structure/plasticflaps/opaque, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/maintenance/central/greater) "amE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -767,6 +777,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"amS" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "amW" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -779,7 +793,7 @@ /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/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -983,20 +997,6 @@ }, /turf/open/floor/iron, /area/station/service/bar) -"aoP" = ( -/obj/machinery/door/airlock/external{ - dir = 8; - name = "Lower Medical External Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "chem-morgue-airlock" - }, -/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/any/engineering/external, -/turf/open/floor/plating, -/area/station/medical/morgue) "aoW" = ( /obj/machinery/door/poddoor/preopen{ dir = 4; @@ -1048,7 +1048,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "apo" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -1090,14 +1090,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/maintenance/department/electrical) -"apI" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/gateway) "apS" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -1105,7 +1097,7 @@ dir = 4 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "apT" = ( /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ @@ -1416,6 +1408,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"atr" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/structure/closet/secure_closet/paramedic, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/paramedic) "atv" = ( /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, @@ -1490,24 +1488,6 @@ }, /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 - }, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "auw" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 8; @@ -1594,6 +1574,10 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"avw" = ( +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron, +/area/station/service/janitor) "avC" = ( /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/white/corner{ @@ -1624,7 +1608,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "awe" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -1969,7 +1953,7 @@ dir = 4 }, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "aAl" = ( /obj/machinery/computer/mech_bay_power_console{ dir = 1 @@ -2011,6 +1995,19 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) +"aBE" = ( +/obj/machinery/door/airlock{ + name = "Custodial Closet" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/event_spawn, +/obj/effect/landmark/navigate_destination, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/service/janitor, +/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) "aBK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, @@ -2057,13 +2054,6 @@ }, /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) "aCo" = ( /obj/structure/chair/wood{ dir = 8 @@ -2085,12 +2075,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"aCA" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "aCC" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -2259,7 +2243,7 @@ }, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "aFn" = ( /obj/effect/decal/cleanable/blood/oil, /obj/effect/decal/cleanable/dirt, @@ -2281,12 +2265,13 @@ /obj/machinery/dna_scannernew, /turf/open/floor/iron/dark, /area/station/science/genetics) -"aFz" = ( -/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, -/turf/open/floor/iron/dark, -/area/station/cargo/miningdock) +"aFy" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/smooth_half, +/area/station/security/brig/upper) "aFG" = ( /obj/structure/railing/corner{ dir = 1 @@ -2314,6 +2299,12 @@ /obj/item/flashlight/lantern/on, /turf/open/misc/hay/icemoon, /area/icemoon/underground/explored) +"aGl" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white/side{ + dir = 10 + }, +/area/station/science/research) "aGr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/directional/east{ @@ -2482,14 +2473,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) -"aID" = ( -/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/science/robotics/mechbay) "aIE" = ( /obj/structure/closet/toolcloset, /turf/open/floor/plating, @@ -2514,6 +2497,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"aIW" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Mining Station Maintenance" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/supply/mining_station, +/obj/structure/cable, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, +/area/station/maintenance/department/cargo) "aJa" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -2653,6 +2647,17 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"aLf" = ( +/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, +/obj/structure/cable, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "aLz" = ( /obj/machinery/conveyor{ id = "garbage" @@ -2687,8 +2692,9 @@ "aLX" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "aMa" = ( @@ -2700,7 +2706,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/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -2726,7 +2732,7 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "aMr" = ( @@ -2814,9 +2820,7 @@ /turf/open/floor/plating, /area/mine/eva/lower) "aNE" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/central) "aOb" = ( @@ -2847,7 +2851,8 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/vending/clothing, /obj/structure/noticeboard/staff{ - pixel_y = 36 + pixel_y = 36; + dir = 1 }, /turf/open/floor/iron, /area/station/commons/locker) @@ -2869,11 +2874,6 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"aOS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white/textured, -/area/station/security/medical) "aOU" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/trunk/multiz/down, @@ -2969,7 +2969,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "aPZ" = ( /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2, /obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4, @@ -3018,6 +3018,13 @@ /obj/structure/cable, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) +"aQS" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/ordnance/office) "aQW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3104,7 +3111,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "aRR" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -3151,18 +3158,11 @@ /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) +/area/station/security/armory/upper) "aSI" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -3231,17 +3231,27 @@ }, /turf/open/floor/plating/icemoon, /area/station/science/ordnance/bomb/planet) +"aTA" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/warning/cold_temp/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "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{ +/obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 }, -/area/station/medical/chem_storage) +/obj/machinery/button/door/directional/east{ + pixel_y = 0; + id = "paramedic_shutters"; + name = "Shutters button"; + pixel_x = 23; + req_access = list("paramedic") + }, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "aTH" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -3486,7 +3496,7 @@ req_access = list("armory") }, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "aWo" = ( /obj/machinery/hydroponics/constructable, /obj/effect/decal/cleanable/dirt, @@ -3678,12 +3688,10 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "aZw" = ( -/obj/structure/sign/warning/secure_area{ - desc = "A warning sign which reads 'BOMB RANGE"; - name = "BOMB RANGE" - }, -/turf/closed/wall, -/area/station/science/ordnance/bomb/planet) +/obj/structure/flora/rock/pile/icy/style_random, +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "aZx" = ( /obj/machinery/camera/directional/east{ c_tag = "Telecomms Monitoring"; @@ -3877,13 +3885,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"bbB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "bbM" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -3892,22 +3893,13 @@ /turf/open/floor/iron, /area/station/hallway/primary/starboard) "bbO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/trimline/yellow/filled/end{ +/obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, -/turf/open/floor/iron/textured, -/area/station/medical/chem_storage) -"bbQ" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, +/obj/machinery/computer/records/medical, +/obj/machinery/light/directional/north, /turf/open/floor/iron/dark, -/area/station/security/courtroom) +/area/station/medical/paramedic) "bbU" = ( /obj/structure/closet/toolcloset, /obj/machinery/status_display/evac/directional/south, @@ -4043,7 +4035,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "bdQ" = ( /obj/structure/table, /obj/item/assembly/signaler{ @@ -4083,7 +4075,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bep" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron, @@ -4180,12 +4172,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"bgt" = ( -/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/mine/eva) "bgx" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/aft) @@ -4208,15 +4194,7 @@ name = "Private Channel" }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"bgF" = ( -/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/large, -/area/station/command/gateway) +/area/station/ai/satellite/chamber) "bgK" = ( /obj/structure/table, /obj/item/toner, @@ -4300,15 +4278,6 @@ }, /turf/open/floor/plating, /area/mine/production) -"bij" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/dark/textured, -/area/station/medical/treatment_center) "bin" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 4 @@ -4428,7 +4397,7 @@ /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{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -4486,7 +4455,7 @@ "bkr" = ( /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "bkC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4497,6 +4466,14 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/security/brig/upper) +"bkI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white/side{ + dir = 9 + }, +/area/station/science/research) "bkQ" = ( /obj/structure/tank_holder/extinguisher, /obj/structure/sign/warning/biohazard/directional/north, @@ -4742,7 +4719,7 @@ /obj/machinery/nuclearbomb/selfdestruct, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "bnL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/maintenance_hatch, @@ -4853,7 +4830,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bpq" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 1 @@ -4878,8 +4855,8 @@ /area/station/engineering/atmos/mix) "bpK" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/greater) "bpQ" = ( @@ -4957,7 +4934,7 @@ "bqt" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "bqx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5026,7 +5003,7 @@ /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/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "brp" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue{ @@ -5286,12 +5263,6 @@ "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, @@ -5555,6 +5526,19 @@ "bxe" = ( /turf/closed/wall/r_wall, /area/station/maintenance/solars/starboard/fore) +"bxp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/ordnance/office) "bxJ" = ( /obj/structure/closet/crate, /turf/open/floor/plating, @@ -5673,6 +5657,10 @@ /obj/structure/girder, /turf/open/floor/plating, /area/station/maintenance/fore) +"byT" = ( +/mob/living/basic/lizard/wags_his_tail, +/turf/open/floor/iron, +/area/station/service/janitor) "bza" = ( /obj/structure/fence/end{ dir = 8 @@ -5717,7 +5705,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/green, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "bzD" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "mining-aux-mechbay-external" @@ -5748,6 +5736,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"bzT" = ( +/obj/machinery/computer/station_alert{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/computer/security/telescreen/ce/directional/west, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "bzW" = ( /turf/open/floor/engine/plasma, /area/station/engineering/atmos) @@ -5758,19 +5754,6 @@ /obj/structure/chair/stool/directional/north, /turf/open/floor/carpet, /area/station/command/heads_quarters/qm) -"bAj" = ( -/obj/machinery/door/firedoor{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) "bAk" = ( /obj/machinery/firealarm/directional/west, /turf/open/floor/carpet, @@ -5981,7 +5964,8 @@ /area/station/engineering/lobby) "bDB" = ( /obj/structure/plaque/static_plaque/golden/commission/icebox{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) @@ -6090,7 +6074,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bEC" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -6116,7 +6100,7 @@ "bEN" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/maintenance/department/chapel) "bEX" = ( @@ -6192,6 +6176,11 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/command/bridge) +"bGl" = ( +/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/robotics/mechbay) "bGm" = ( /obj/machinery/firealarm/directional/south, /obj/structure/filingcabinet/white, @@ -6331,7 +6320,7 @@ /turf/open/floor/iron/dark/smooth_edge{ dir = 4 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bIl" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -6433,7 +6422,7 @@ "bJj" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "bJp" = ( /obj/machinery/camera/directional/east{ c_tag = "Security - Permabrig Workout"; @@ -6476,10 +6465,17 @@ name = "Firefighting Equipment" }, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"bKz" = ( +/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/white, +/area/station/science/explab) "bKA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6561,17 +6557,13 @@ /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, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "bLA" = ( /obj/structure/closet, /turf/open/floor/plating, @@ -6663,9 +6655,16 @@ /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"bMV" = ( +/obj/structure/railing/corner/end{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "bMY" = ( /turf/open/floor/glass/reinforced, /area/station/hallway/primary/starboard) @@ -6713,12 +6712,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage/gas) -"bNH" = ( -/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/cryo) "bOg" = ( /obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6736,8 +6729,8 @@ "bOj" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "bOk" = ( @@ -6809,7 +6802,7 @@ "bPc" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "bPl" = ( /obj/structure/table/wood, /obj/item/folder/blue, @@ -7150,7 +7143,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bTM" = ( /obj/structure/closet/crate, /obj/machinery/light/small/directional/south, @@ -7266,25 +7259,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/textured, /area/station/maintenance/fore) -"bVI" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness) -"bVJ" = ( -/obj/structure/cable, -/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/cargo/miningdock) "bVL" = ( /obj/machinery/space_heater, /obj/structure/sign/poster/official/random/directional/east, @@ -7336,7 +7310,7 @@ /area/station/maintenance/port/fore) "bWn" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bWp" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/iron/dark, @@ -7400,6 +7374,12 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/service/chapel) +"bXa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/command/gateway) "bXf" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -7419,18 +7399,9 @@ /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) +/area/station/security/armory/upper) "bXD" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -7458,22 +7429,13 @@ }, /obj/effect/spawner/random/armory/laser_gun, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "bYi" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/yellow/half/contrasted, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"bYm" = ( -/obj/structure/chair/pew{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/chapel{ - dir = 8 - }, -/area/station/service/chapel) "bYu" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -7563,7 +7525,7 @@ }, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) @@ -7674,7 +7636,8 @@ }, /obj/effect/turf_decal/bot_white, /obj/structure/sign/picture_frame/portrait/bar{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/wood/large, /area/station/service/bar/atrium) @@ -7726,6 +7689,15 @@ dir = 1 }, /area/mine/living_quarters) +"cbf" = ( +/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/aft/greater) "cbk" = ( /turf/open/floor/iron, /area/mine/mechbay) @@ -7749,7 +7721,7 @@ "cbz" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "cbC" = ( /obj/machinery/meter, /obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ @@ -7801,7 +7773,8 @@ /area/station/hallway/primary/central) "cct" = ( /obj/structure/noticeboard/captain{ - pixel_y = 36 + pixel_y = 36; + dir = 1 }, /turf/open/floor/wood, /area/station/command/meeting_room) @@ -7820,7 +7793,7 @@ "ccw" = ( /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "ccx" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -7999,7 +7972,8 @@ "ceO" = ( /obj/machinery/button/crematorium{ id = "crematoriumChapel"; - pixel_x = 25 + pixel_x = 25; + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -8043,7 +8017,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "cfh" = ( /obj/structure/railing{ dir = 1 @@ -8225,13 +8199,11 @@ /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 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) "chQ" = ( @@ -8243,6 +8215,11 @@ }, /turf/open/floor/iron/white/side, /area/mine/living_quarters) +"chZ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "cie" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/purple, @@ -8522,13 +8499,6 @@ /obj/structure/closet/crate/trashcart, /turf/open/floor/iron/dark, /area/station/maintenance/disposal) -"cmV" = ( -/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, @@ -8599,7 +8569,7 @@ "cnz" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -8616,6 +8586,12 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"cnQ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/storage/mining) "cod" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 @@ -8643,6 +8619,16 @@ /obj/effect/decal/cleanable/rubble, /turf/open/floor/iron, /area/mine/production) +"coZ" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Locker Room West" + }, +/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/station/commons/locker) "cpe" = ( /obj/machinery/atmospherics/components/tank/air{ dir = 8 @@ -8754,7 +8740,7 @@ /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/library, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -8816,7 +8802,15 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) +"cqY" = ( +/obj/item/stack/ore/silver, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/cargo/miningdock) "crf" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red{ @@ -8931,7 +8925,7 @@ "ctl" = ( /obj/structure/grille, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "ctm" = ( /obj/structure/railing{ dir = 5 @@ -9024,6 +9018,12 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/wood, /area/station/commons/vacant_room/office) +"cuu" = ( +/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/science/robotics/mechbay) "cuJ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -9034,10 +9034,6 @@ /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) "cvg" = ( /obj/effect/mapping_helpers/trapdoor_placer, /obj/effect/turf_decal/delivery, @@ -9064,7 +9060,7 @@ pixel_y = -8 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "cvj" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -9223,7 +9219,7 @@ "cxl" = ( /obj/machinery/status_display/evac/directional/west, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "cxp" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/personal{ @@ -9257,7 +9253,7 @@ /area/station/medical/medbay/central) "cxO" = ( /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "cxP" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 4 @@ -9308,7 +9304,7 @@ /area/station/medical/surgery/fore) "cyA" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -9330,10 +9326,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"cyL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/science/explab) "cyU" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency, @@ -9354,13 +9346,7 @@ /obj/item/radio/intercom/directional/south, /obj/machinery/light/small/directional/south, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) -"czj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/medical/morgue) +/area/station/ai/satellite/interior) "czl" = ( /obj/effect/turf_decal/tile/brown/fourcorners, /obj/machinery/modular_computer/preset/cargochat/engineering, @@ -9498,7 +9484,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "cAM" = ( /obj/structure/table, /obj/item/folder/white{ @@ -9583,11 +9569,8 @@ dir = 4 }, /obj/machinery/light/directional/east, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "cBY" = ( /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/unexplored/rivers/deep/shoreline) @@ -9595,6 +9578,11 @@ /obj/structure/flora/tree/pine/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"cCq" = ( +/obj/machinery/computer/station_alert, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/station/command/bridge) "cCu" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -9672,7 +9660,7 @@ name = "Maintenance" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "cDz" = ( @@ -9800,6 +9788,11 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/smooth_edge, /area/station/security/lockers) +"cFp" = ( +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/storage/mining) "cFr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/structure/window/reinforced/tinted, @@ -9813,7 +9806,7 @@ /obj/machinery/light/small/directional/north, /obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "cFZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9849,7 +9842,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "cGu" = ( /obj/structure/closet/crate, /turf/open/floor/plating, @@ -9871,12 +9864,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/garden) -"cGS" = ( -/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) "cGZ" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/stairs/medium{ @@ -9931,7 +9918,7 @@ }, /obj/effect/turf_decal/tile/green, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "cHQ" = ( /obj/machinery/vending/wardrobe/robo_wardrobe, /obj/machinery/button/door/directional/east{ @@ -10006,6 +9993,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/armory, /obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron/smooth, /area/station/security/brig/upper) "cJb" = ( @@ -10027,9 +10015,9 @@ /turf/open/floor/iron, /area/station/hallway/primary/fore) "cJi" = ( -/obj/structure/sign/warning, -/turf/closed/wall/r_wall, -/area/station/security/warden) +/obj/structure/sign/warning/directional/south, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "cJk" = ( /obj/machinery/chem_mass_spec, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ @@ -10045,6 +10033,12 @@ "cJt" = ( /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"cJu" = ( +/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) "cJw" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -10406,13 +10400,6 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) -"cOa" = ( -/obj/structure/sign/warning/secure_area{ - desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM" - }, -/turf/closed/wall, -/area/station/tcommsat/computer) "cOi" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/mix_output{ dir = 8 @@ -10549,6 +10536,12 @@ /obj/machinery/wall_healer/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/port) +"cQr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "cQw" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown{ @@ -10566,6 +10559,17 @@ /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, /turf/open/floor/plating, /area/station/maintenance/fore) +"cQy" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Chemistry Lab Exit" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "chem-airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/medical/chemistry) "cQA" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 8 @@ -10580,14 +10584,14 @@ /turf/open/floor/iron/dark/smooth_edge{ dir = 8 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "cQL" = ( /obj/machinery/porta_turret/ai{ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "cQV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/siding/dark_blue, @@ -10728,7 +10732,7 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/barricade/wooden, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -10757,7 +10761,7 @@ /obj/machinery/door/airlock/maintenance{ name = "Locker Room Maintenance" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/structure/cable, /turf/open/floor/plating, @@ -10817,6 +10821,16 @@ dir = 8 }, /area/station/security/brig) +"cWn" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Medbay Stasis Center North"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "cWq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/green/half/contrasted{ @@ -11014,7 +11028,7 @@ /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11090,10 +11104,19 @@ "cZv" = ( /obj/machinery/holopad/secure, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "cZD" = ( /turf/open/floor/iron/checker, /area/station/maintenance/port/fore) +"cZG" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/iron/cafeteria{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "cZJ" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11330,6 +11353,18 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"dcz" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Research Division Break Room"; + network = list("ss13","rd") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/entertainment/arcade{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/breakroom) "dcC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11424,10 +11459,6 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/fore) -"ddk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/circuit, -/area/station/science/robotics/mechbay) "ddm" = ( /mob/living/basic/pet/penguin/emperor{ name = "Club" @@ -11449,7 +11480,7 @@ /obj/machinery/airalarm/directional/north, /obj/structure/closet/secure_closet/personal/cabinet, /obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/commons/dorms) "ddu" = ( @@ -11513,7 +11544,7 @@ "deg" = ( /obj/structure/cable/layer3, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "dei" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/vending/cigarette, @@ -11722,7 +11753,7 @@ dir = 9 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "dhR" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/bookcase/random, @@ -11813,14 +11844,14 @@ }, /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/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) +/area/station/security/armory/upper) "diI" = ( /obj/machinery/mech_bay_recharge_port, /obj/item/radio/intercom/directional/south, @@ -11973,6 +12004,10 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/science/robotics/lab) +"dkt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "dku" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11983,17 +12018,9 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "dky" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"dkK" = ( -/obj/structure/railing/corner, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) +/obj/structure/sign/nanotrasen/directional/east, +/turf/open/openspace/icemoon/keep_below, +/area/icemoon/underground/explored) "dkT" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 1 @@ -12021,6 +12048,15 @@ /obj/effect/landmark/start/cook, /turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) +"dlq" = ( +/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) "dlt" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 8 @@ -12097,12 +12133,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/department/electrical) -"dmU" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "dmV" = ( /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ @@ -12251,7 +12281,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "doM" = ( /obj/structure/table, /obj/item/paper{ @@ -12284,6 +12314,7 @@ /obj/machinery/light/directional/south, /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) "dpq" = ( @@ -12367,7 +12398,7 @@ /turf/open/floor/plating, /area/station/security/checkpoint/medical) "dqR" = ( -/obj/machinery/computer/rdconsole, +/obj/machinery/computer/rdconsole/unlocked, /obj/structure/cable, /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 8 @@ -12752,13 +12783,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/less_spawns) -"dwb" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "dwj" = ( /obj/machinery/atmospherics/components/binary/pump/off, /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ @@ -12892,6 +12916,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/port/lesser) +"dxF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "dxI" = ( /obj/structure/chair/stool/directional/west, /obj/effect/turf_decal/tile/yellow{ @@ -12953,7 +12986,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "dzl" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -13053,16 +13086,6 @@ dir = 5 }, /area/station/command/heads_quarters/rd) -"dAP" = ( -/obj/structure/cable, -/obj/structure/chair{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "dAQ" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -13143,7 +13166,7 @@ network = list("aicore") }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "dBX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -13346,18 +13369,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore) -"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, @@ -13736,19 +13747,17 @@ }, /area/station/security/processing) "dKW" = ( -/obj/structure/sign/directions/security{ - dir = 1; - pixel_x = 32; - pixel_y = 36 - }, /obj/structure/sign/directions/evac{ dir = 4; - pixel_x = 32; - pixel_y = 28 + pixel_y = -10 }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +/obj/structure/sign/directions/medical{ + dir = 4; + pixel_y = 10 + }, +/obj/structure/sign/directions/engineering, +/turf/closed/wall, +/area/station/commons/storage/mining) "dLe" = ( /obj/structure/chair/stool/directional/west, /turf/open/floor/wood/large, @@ -13784,7 +13793,7 @@ "dLL" = ( /obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "dLN" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -13842,9 +13851,7 @@ /turf/open/floor/iron/dark, /area/station/medical/morgue) "dMn" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/unexplored/rivers/deep/shoreline) "dMo" = ( @@ -13941,14 +13948,6 @@ /obj/item/wallframe/camera, /turf/open/floor/plating, /area/station/construction) -"dOa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/girder, -/obj/effect/spawner/structure/electrified_grille, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "dOp" = ( /obj/structure/table/wood, /obj/item/instrument/saxophone, @@ -14037,22 +14036,12 @@ /area/mine/mechbay) "dPT" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"dQd" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Mining Station Maintenance" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining_station, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/maintenance/department/cargo) "dQl" = ( /obj/structure/closet/emcloset, /obj/structure/sign/warning/cold_temp/directional/north, @@ -14122,6 +14111,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/mine/laborcamp) +"dRx" = ( +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/corner, +/area/mine/eva) "dRz" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14216,6 +14210,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/service/bar) +"dTh" = ( +/obj/machinery/airalarm/directional/west, +/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) "dTm" = ( /obj/effect/decal/cleanable/blood/splatter, /obj/effect/mob_spawn/corpse/human/skeleton, @@ -14272,10 +14274,9 @@ /area/icemoon/surface/outdoors/less_spawns) "dTW" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - 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/white, /area/station/medical/treatment_center) "dUe" = ( @@ -14408,27 +14409,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/engineering/lobby) -"dVS" = ( -/obj/machinery/door/firedoor{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) "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, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) "dWn" = ( @@ -14484,7 +14470,7 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "dXh" = ( -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = -3; pixel_y = 3 }, @@ -14566,7 +14552,6 @@ /area/station/engineering/atmos/hfr_room) "dXU" = ( /obj/effect/decal/cleanable/generic, -/obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "dYj" = ( @@ -14693,7 +14678,7 @@ "dZX" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "eaa" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14752,6 +14737,15 @@ /obj/structure/sign/departments/vault/directional/north, /turf/open/openspace/icemoon/keep_below, /area/icemoon/surface/outdoors/nospawn) +"eaO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "eaQ" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/small/directional/north, @@ -14765,7 +14759,8 @@ name = "Biohazard Containment Door" }, /obj/structure/noticeboard/rd{ - pixel_y = 36 + pixel_y = 36; + dir = 1 }, /obj/effect/turf_decal/tile/purple/fourcorners, /obj/effect/turf_decal/delivery, @@ -14804,7 +14799,7 @@ /obj/machinery/newscaster/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "ebO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -14873,8 +14868,9 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "sci-med-passthrough" }, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "ede" = ( @@ -14899,7 +14895,7 @@ /obj/machinery/ore_silo, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "edq" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -14935,6 +14931,13 @@ /obj/structure/sign/warning/docking/directional/north, /turf/open/floor/engine, /area/station/science/xenobiology) +"eee" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/railing, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "eei" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -14949,7 +14952,7 @@ "eeD" = ( /obj/machinery/light/directional/west, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "eeF" = ( /obj/item/cigbutt/cigarbutt, /obj/effect/decal/cleanable/blood/old, @@ -15049,6 +15052,13 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) +"efQ" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Custodial Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/janitor, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "efR" = ( /obj/structure/ladder, /obj/structure/railing{ @@ -15077,7 +15087,7 @@ /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) +/area/station/security/armory) "egm" = ( /obj/structure/table, /obj/item/restraints/handcuffs, @@ -15101,13 +15111,7 @@ /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"egL" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/vault) "egS" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15148,13 +15152,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"ehd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "ehh" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -15163,6 +15160,13 @@ /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"ehn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/effect/landmark/start/hangover, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness) "ehp" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -15172,6 +15176,15 @@ /obj/structure/noticeboard/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central) +"ehB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "ehJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -15231,6 +15244,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/security/prison/rec) +"eia" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/statue/goliath{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/mine/living_quarters) "eic" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15296,6 +15317,14 @@ /obj/item/clothing/suit/hooded/wintercoat/engineering, /turf/open/floor/iron/dark, /area/station/engineering/storage_shared) +"eiR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "ejb" = ( /obj/structure/cable, /obj/machinery/door/airlock/security/glass{ @@ -15380,6 +15409,11 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"eki" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark/textured, +/area/station/security/range) "ekj" = ( /obj/structure/closet, /obj/effect/spawner/random/clothing/costume, @@ -15422,6 +15456,18 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) +"ekM" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness) "ekW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15541,6 +15587,12 @@ /obj/effect/turf_decal/stripes/box, /turf/open/floor/plating, /area/station/engineering/lobby) +"eny" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "enH" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -15555,7 +15607,7 @@ name = "Tool Storage Maintenance" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -15602,7 +15654,7 @@ /obj/machinery/firealarm/directional/east, /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "eoL" = ( /obj/structure/table, /obj/item/taperecorder, @@ -15789,7 +15841,7 @@ "erk" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -15867,13 +15919,6 @@ }, /turf/open/floor/iron/textured, /area/station/security/brig) -"erN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/cargo/storage) "erO" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 1 @@ -15887,12 +15932,6 @@ }, /turf/open/floor/plating/icemoon, /area/station/science/ordnance/bomb/planet) -"erV" = ( -/obj/structure/railing/corner/end/flip{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "erY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15928,10 +15967,14 @@ /turf/open/floor/iron, /area/station/service/hydroponics/garden) "esC" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) +/obj/effect/turf_decal/trimline/yellow/filled/end{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/textured, +/area/station/medical/chem_storage) "esE" = ( /turf/open/floor/engine, /area/station/engineering/supermatter) @@ -16052,7 +16095,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "eud" = ( /obj/item/food/chococoin, /obj/structure/closet/secure_closet/freezer/fridge, @@ -16098,6 +16141,13 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron, /area/station/science/xenobiology) +"euO" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "euZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16180,6 +16230,10 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/station/security/brig/upper) +"ewP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/royalblue, +/area/station/command/heads_quarters/captain) "ewT" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16246,14 +16300,6 @@ /obj/effect/decal/cleanable/generic, /turf/open/floor/iron/smooth, /area/station/maintenance/port/fore) -"exN" = ( -/obj/effect/spawner/random/trash, -/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, -/turf/open/floor/iron, -/area/station/security/prison/work) "exQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -16292,15 +16338,6 @@ }, /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 - }, -/area/station/hallway/secondary/entry) "eyk" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/status_display/evac/directional/south, @@ -16346,7 +16383,7 @@ /area/mine/eva/lower) "ezq" = ( /obj/structure/table, -/obj/item/stamp, +/obj/item/stamp/granted, /obj/item/poster/random_official, /turf/open/floor/plating, /area/station/maintenance/port/fore) @@ -16434,7 +16471,7 @@ "eAx" = ( /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "eAQ" = ( /obj/structure/rack, /obj/item/storage/box/lights/mixed{ @@ -16495,6 +16532,10 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"eBL" = ( +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/commons/fitness) "eBV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/closed/wall/r_wall, @@ -16557,7 +16598,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "eCR" = ( -/obj/structure/no_effect_signpost{ +/obj/structure/signpost{ desc = "Now, where to go from here? That's a timeless question." }, /turf/open/misc/asteroid/snow/icemoon, @@ -16574,11 +16615,11 @@ "eDc" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/machinery/vending/wardrobe/medi_wardrobe, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/machinery/suit_storage_unit/medical, /turf/open/floor/iron/dark, /area/station/medical/storage) "eDg" = ( @@ -16597,7 +16638,7 @@ name = "MiniSat Teleport Access" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "eDj" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -16663,6 +16704,16 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/glass/reinforced, /area/station/engineering/storage/tech) +"eEs" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Mining Station Maintenance" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/all/supply/mining_station, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, +/area/station/maintenance/department/cargo) "eEO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16696,13 +16747,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) -"eFn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "eFt" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -16931,13 +16975,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/entry) -"eHZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "eId" = ( /obj/structure/railing/corner{ dir = 8 @@ -16948,7 +16985,7 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 1 }, -/obj/structure/sign/poster/official/here_for_your_safety/directional/north, +/obj/structure/sign/poster/official/here_for_your_safety/directional/west, /turf/open/floor/iron, /area/station/security/prison/visit) "eIk" = ( @@ -16959,9 +16996,7 @@ /turf/open/floor/wood, /area/station/service/library) "eIv" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) "eIC" = ( @@ -17040,6 +17075,15 @@ /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) +"eJO" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/mine/production) "eJU" = ( /obj/machinery/door/airlock/security{ name = "Permanent Cell 2" @@ -17224,11 +17268,11 @@ /obj/effect/turf_decal/stripes/line, /obj/item/radio/intercom/directional/west, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "eMT" = ( /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) @@ -17422,6 +17466,13 @@ /obj/structure/sign/warning/pods/directional/north, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/entry) +"eQt" = ( +/obj/structure/chair/pew{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron/chapel, +/area/station/service/chapel) "eQz" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -17466,7 +17517,7 @@ "eRh" = ( /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "eRk" = ( /obj/effect/landmark/start/hangover, /obj/machinery/duct, @@ -17494,8 +17545,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock/maintenance/glass, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "eRE" = ( @@ -17509,21 +17560,13 @@ dir = 4 }, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "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) "eSn" = ( /obj/structure/chair/office, /obj/effect/landmark/start/assistant, @@ -17544,12 +17587,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/mine/laborcamp/security) -"eSA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/dark, -/area/mine/eva) "eSC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -17744,9 +17781,12 @@ /turf/open/floor/iron/dark, /area/station/security/execution/education) "eUI" = ( -/obj/machinery/space_heater, +/obj/structure/table/reinforced, +/obj/machinery/reagentgrinder{ + pixel_y = 8 + }, /turf/open/floor/plating, -/area/station/maintenance/department/medical/central) +/area/station/medical/chem_storage) "eUK" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty{ @@ -17949,7 +17989,7 @@ c_tag = "Fitness Room North" }, /obj/structure/closet/masks, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, @@ -18033,7 +18073,7 @@ /obj/machinery/power/smes/super/full, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "eYK" = ( /obj/structure/rack, /obj/item/clothing/suit/hooded/wintercoat{ @@ -18127,6 +18167,13 @@ }, /turf/open/floor/engine/xenobio, /area/station/science/xenobiology) +"eZF" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/eva) "eZK" = ( /obj/machinery/recycler{ dir = 8 @@ -18319,7 +18366,7 @@ /obj/structure/chair, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "fcA" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -18438,6 +18485,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"fdK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet/royalblue, +/area/station/command/heads_quarters/captain) "fdN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -18475,7 +18529,7 @@ /turf/open/floor/plating, /area/station/maintenance/aft/greater) "fep" = ( -/obj/structure/no_effect_signpost, +/obj/structure/signpost, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) "fez" = ( @@ -18498,7 +18552,7 @@ /area/station/maintenance/department/medical/morgue) "feJ" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "feQ" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -18518,6 +18572,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"ffd" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/locker) "ffe" = ( /turf/closed/wall/r_wall, /area/station/maintenance/aft/lesser) @@ -18593,13 +18654,13 @@ /turf/open/floor/iron/dark/smooth_half{ dir = 1 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "fgU" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "fgV" = ( /obj/structure/railing/wooden_fence{ dir = 8 @@ -18638,6 +18699,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/fore) +"fhF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron, +/area/station/security/prison/mess) "fhL" = ( /obj/structure/sign/warning/directional/north, /turf/open/openspace/icemoon/keep_below, @@ -18937,6 +19006,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) +"fly" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/large, +/area/station/commons/storage/mining) "flD" = ( /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/plating, @@ -18955,7 +19029,7 @@ "flW" = ( /obj/machinery/atmospherics/components/tank/air, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "flZ" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -19000,7 +19074,7 @@ /obj/item/stack/rods/fifty, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "fmq" = ( /obj/docking_port/stationary{ dir = 4; @@ -19067,12 +19141,6 @@ /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, @@ -19122,7 +19190,7 @@ /area/station/maintenance/starboard/aft) "fpa" = ( /obj/structure/closet/wardrobe/pjs, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /turf/open/floor/iron, /area/station/commons/dorms) @@ -19156,6 +19224,15 @@ /obj/machinery/suit_storage_unit/atmos, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) +"fqd" = ( +/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/cargo/office) "fqv" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19181,11 +19258,6 @@ /obj/structure/sign/departments/security/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"fqH" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/red/half, -/turf/open/floor/iron/smooth_half, -/area/station/security/brig/upper) "fqJ" = ( /obj/effect/turf_decal/trimline/white/filled/warning, /turf/open/genturf, @@ -19211,29 +19283,19 @@ /obj/machinery/camera/directional/north{ c_tag = "Starboard Primary Hallway West" }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) "fqW" = ( -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/carbon{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/ethanol{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/chlorine{ - pixel_x = 1 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark/textured_edge{ +/obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, -/area/station/medical/chem_storage) +/obj/structure/chair/sofa/left/maroon{ + dir = 4 + }, +/obj/effect/landmark/start/paramedic, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "frc" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/decal/cleanable/dirt, @@ -19277,7 +19339,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "frt" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 4 @@ -19389,7 +19451,7 @@ /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{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -19443,10 +19505,8 @@ /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "ftY" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/structure/flora/grass/both/style_random, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) "fuc" = ( @@ -19523,13 +19583,6 @@ "fvk" = ( /turf/open/floor/glass/reinforced, /area/station/science/xenobiology) -"fvx" = ( -/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) "fvA" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/north, /obj/effect/turf_decal/siding/yellow/corner{ @@ -19543,6 +19596,15 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/lobby) +"fvJ" = ( +/obj/structure/chair/pew{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) "fvK" = ( /obj/structure/rack, /obj/item/storage/box/petridish, @@ -19708,7 +19770,7 @@ "fyc" = ( /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "fyr" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command/glass{ @@ -19723,7 +19785,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "fyw" = ( /obj/machinery/telecomms/server/presets/service, /turf/open/floor/iron/dark/telecomms, @@ -19826,7 +19888,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19950,12 +20012,6 @@ dir = 8 }, /area/station/service/chapel) -"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, @@ -20011,7 +20067,7 @@ /turf/open/floor/wood/parquet, /area/station/service/bar/atrium) "fDl" = ( -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) "fDn" = ( @@ -20061,6 +20117,14 @@ }, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) +"fEi" = ( +/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/commons/fitness) "fEA" = ( /obj/structure/cable, /obj/machinery/door/airlock/maintenance{ @@ -20232,7 +20296,7 @@ }, /obj/effect/turf_decal/tile/green, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "fHq" = ( /obj/effect/decal/cleanable/blood/oil, /obj/effect/decal/cleanable/dirt, @@ -20244,10 +20308,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/port/aft) -"fHK" = ( -/obj/machinery/holopad, -/turf/open/floor/carpet, -/area/station/command/meeting_room) "fHO" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle, /obj/machinery/door/poddoor/shutters/preopen{ @@ -20524,14 +20584,6 @@ /obj/structure/closet/toolcloset, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"fLl" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white/side{ - dir = 9 - }, -/area/station/science/research) "fLq" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -20542,7 +20594,7 @@ "fLs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "fLu" = ( /obj/effect/turf_decal/tile/green/opposingcorners{ dir = 1 @@ -20720,11 +20772,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen) -"fOl" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/science/explab) "fOq" = ( /obj/structure/sign/warning/cold_temp/directional/north, /turf/open/floor/plating, @@ -20851,7 +20898,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "fQc" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 1 @@ -20879,7 +20926,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "fQz" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/carpet, @@ -20898,7 +20945,7 @@ "fRb" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20940,9 +20987,7 @@ dir = 1 }, /obj/effect/mapping_helpers/burnt_floor, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/plating, /area/station/maintenance/port/lesser) "fSm" = ( @@ -20986,7 +21031,7 @@ /obj/item/clothing/head/utility/welding, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "fTb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21029,13 +21074,6 @@ /obj/item/radio/intercom/prison/directional/north, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"fTq" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "fTx" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -21103,7 +21141,7 @@ /obj/machinery/door/airlock/maintenance{ name = "Firefighting Equipment" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, @@ -21170,7 +21208,7 @@ name = "Chemical Storage" }, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -21196,7 +21234,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -21272,6 +21310,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"fWF" = ( +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "fWL" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -21656,7 +21698,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "gbK" = ( /obj/structure/rack, /obj/item/clothing/suit/utility/beekeeper_suit, @@ -21792,12 +21834,6 @@ /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, -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "gec" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -21866,12 +21902,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/station/engineering/lobby) -"geW" = ( -/obj/structure/cable, -/obj/structure/closet, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "gfb" = ( /turf/closed/wall/r_wall, /area/station/maintenance/central/greater) @@ -21898,6 +21928,11 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/iron, /area/station/engineering/storage) +"gfu" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "gfw" = ( /obj/machinery/light/small/directional/west, /obj/structure/table, @@ -21933,7 +21968,7 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -21978,7 +22013,7 @@ dir = 8 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ggV" = ( /obj/machinery/conveyor{ id = "gulag" @@ -21992,6 +22027,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/starboard) "ghl" = ( @@ -22002,9 +22038,6 @@ /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) @@ -22034,7 +22067,7 @@ /area/station/maintenance/port/fore) "ghY" = ( /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "gib" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22069,11 +22102,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/maintenance/aft/greater) -"giN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/yellow/line, -/turf/open/floor/iron/dark/side, -/area/station/security/prison/workout) "giO" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/random/trash/grille_or_waste, @@ -22138,6 +22166,11 @@ "gjq" = ( /turf/open/openspace/icemoon/keep_below, /area/icemoon/underground/explored) +"gjt" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/medical/morgue) "gjI" = ( /obj/effect/spawner/random/structure/tank_holder, /obj/effect/turf_decal/tile/yellow, @@ -22199,6 +22232,13 @@ "gka" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) +"gkk" = ( +/obj/structure/railing, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "gko" = ( /obj/machinery/conveyor{ dir = 8; @@ -22350,7 +22390,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "glS" = ( /obj/machinery/camera/directional/south{ c_tag = "MiniSat Pod Access"; @@ -22362,7 +22402,7 @@ dir = 8 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "glX" = ( /obj/structure/closet/firecloset, /turf/open/floor/plating, @@ -22484,9 +22524,7 @@ /obj/effect/decal/cleanable/blood/tracks{ dir = 4 }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) "goa" = ( @@ -22528,21 +22566,6 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/iron, /area/station/service/janitor) -"goy" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/ordnance/office) "goB" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -22627,7 +22650,7 @@ "gpB" = ( /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "gpM" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -22755,6 +22778,18 @@ }, /turf/open/floor/plating, /area/station/commons/dorms/laundry) +"gro" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/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, +/turf/open/floor/iron, +/area/station/cargo/office) "grp" = ( /turf/open/misc/asteroid/snow/coldroom, /area/icemoon/underground/explored) @@ -22958,6 +22993,14 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen) +"guM" = ( +/obj/machinery/door/airlock/mining/glass{ + id_tag = "innercargo"; + name = "Cargo Bay" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/turf/open/floor/iron, +/area/station/cargo/storage) "guO" = ( /obj/item/stack/sheet/mineral/wood, /obj/effect/decal/cleanable/generic, @@ -23263,7 +23306,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "gzH" = ( /obj/machinery/door/firedoor/heavy, /obj/machinery/door/airlock/research{ @@ -23276,17 +23319,6 @@ dir = 8 }, /area/station/science/ordnance/office) -"gzI" = ( -/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/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness) "gzJ" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/box, @@ -23458,16 +23490,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/commons/storage/mining) -"gCl" = ( -/obj/structure/railing/corner/end/flip{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/storage/mining) "gCn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23641,11 +23663,6 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) -"gEn" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/science/server) "gEq" = ( /obj/structure/chair/office{ dir = 4 @@ -23719,28 +23736,6 @@ "gFX" = ( /turf/closed/wall, /area/icemoon/underground/explored) -"gGf" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"gGj" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ - dir = 9 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage) "gGs" = ( /obj/structure/closet/secure_closet/engineering_welding, /obj/machinery/newscaster/directional/west, @@ -23789,12 +23784,22 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) +"gGN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/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) "gGZ" = ( /obj/machinery/computer/bank_machine, /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "gHe" = ( /obj/machinery/firealarm/directional/east, /obj/effect/turf_decal/tile/blue, @@ -23905,10 +23910,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/security/holding_cell) -"gIJ" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/medical/morgue) "gIL" = ( /obj/machinery/door/airlock/security/glass{ name = "Secure Walkway" @@ -23921,18 +23922,13 @@ }, /turf/open/floor/iron, /area/station/security/brig/upper) -"gIN" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/effect/turf_decal/tile/neutral/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/station/commons/fitness) "gIY" = ( /turf/closed/wall, /area/station/medical/medbay/central) +"gJa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "gJs" = ( /obj/machinery/portable_atmospherics/canister, /obj/structure/disposalpipe/segment, @@ -23960,7 +23956,7 @@ /mob/living/simple_animal/bot/secbot/beepsky/armsky, /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "gJK" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -24188,13 +24184,6 @@ dir = 4 }, /area/station/command/gateway) -"gNH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison/workout) "gNL" = ( /obj/machinery/status_display/evac/directional/south, /obj/machinery/light/directional/south, @@ -24238,7 +24227,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "gOi" = ( /obj/structure/rack, /obj/item/clothing/glasses/sunglasses/big{ @@ -24313,7 +24302,7 @@ /obj/structure/cable, /obj/machinery/door/firedoor, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "gPC" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -24469,17 +24458,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"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/machinery/newscaster/directional/south, -/turf/open/floor/iron, -/area/station/security/prison/visit) "gSd" = ( /obj/structure/fence/door{ dir = 4 @@ -24508,7 +24486,6 @@ "gSq" = ( /obj/machinery/rnd/production/circuit_imprinter/department/science, /obj/machinery/button/door/directional/north{ - dir = 2; id = "rnd"; name = "Shutters Control Button"; req_access = list("research") @@ -24619,6 +24596,18 @@ "gTK" = ( /turf/closed/wall, /area/station/engineering/engine_smes) +"gTQ" = ( +/obj/machinery/computer/station_alert{ + dir = 8 + }, +/obj/machinery/button/door/directional/south{ + id = "atmos" + }, +/obj/machinery/light_switch/directional/south{ + pixel_x = -10 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/storage/gas) "gTW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -24905,6 +24894,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/mine/laborcamp) +"gXD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/mine/eva) "gXJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25019,6 +25013,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"gYM" = ( +/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/mining_center, +/turf/open/floor/iron, +/area/mine/eva/lower) "gYT" = ( /obj/machinery/light/cold/directional/east, /obj/machinery/status_display/ai/directional/east, @@ -25394,7 +25396,7 @@ pixel_y = -24 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "hfA" = ( /obj/structure/window/reinforced/spawner/directional/north{ pixel_y = 2 @@ -25428,7 +25430,7 @@ /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -25443,12 +25445,10 @@ /area/station/security/brig/entrance) "hho" = ( /obj/machinery/vending/cigarette, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/effect/turf_decal/siding/wood{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/captain) "hhr" = ( @@ -25507,16 +25507,12 @@ }, /area/station/science/lab) "hhT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 +/obj/structure/chair/office/light{ + dir = 1 }, -/obj/effect/landmark/start/chemist, -/turf/open/floor/iron/textured, -/area/station/medical/chem_storage) +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "hig" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25816,6 +25812,18 @@ dir = 8 }, /area/station/commons/storage/mining) +"hmA" = ( +/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/machinery/newscaster/directional/south, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/prison/visit) "hmE" = ( /obj/structure/chair, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -25912,6 +25920,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"hot" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/research) "hoz" = ( /obj/structure/fence/corner{ dir = 6 @@ -25974,7 +25988,6 @@ "hpl" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/north, -/obj/structure/sign/warning/directional/north, /turf/open/floor/iron, /area/mine/laborcamp) "hpm" = ( @@ -26077,7 +26090,7 @@ name = "Genetics Requests Console" }, /obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/science/genetics) "hqi" = ( @@ -26101,17 +26114,6 @@ dir = 1 }, /area/station/commons/storage/art) -"hqv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/cigarette{ - pixel_x = 6; - pixel_y = 12 - }, -/turf/open/floor/iron, -/area/mine/eva) "hqx" = ( /obj/effect/landmark/start/assistant, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26191,7 +26193,7 @@ "hsh" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "hsn" = ( /obj/effect/landmark/start/medical_doctor, /obj/machinery/holopad, @@ -26228,6 +26230,17 @@ "hsB" = ( /turf/open/floor/iron/freezer, /area/station/commons/toilet) +"hsG" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Holding Area" + }, +/obj/machinery/door/firedoor, +/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/iron, +/area/station/hallway/secondary/exit/departure_lounge) "hsN" = ( /obj/structure/table, /obj/item/storage/box/firingpins, @@ -26236,7 +26249,7 @@ /obj/machinery/light/directional/east, /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "hsQ" = ( /obj/structure/tank_holder/oxygen, /turf/open/floor/plating, @@ -26510,7 +26523,7 @@ name = "Utilities Room" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "hxs" = ( @@ -26565,6 +26578,14 @@ }, /turf/open/floor/iron/dark, /area/station/service/bar) +"hyg" = ( +/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) "hyj" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 1 @@ -26669,7 +26690,7 @@ }, /obj/machinery/firealarm/directional/west, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "hzJ" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -26870,13 +26891,6 @@ /obj/item/paper/fluff/jobs/engineering/frequencies, /turf/open/floor/carpet, /area/station/command/meeting_room) -"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 @@ -27113,12 +27127,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/work) -"hFJ" = ( -/obj/machinery/computer/station_alert/station_only, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/computer/security/telescreen/engine/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) "hFL" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -27160,7 +27168,7 @@ /area/station/security/lockers) "hHb" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "hHg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -27279,7 +27287,7 @@ /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/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) @@ -27361,6 +27369,16 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"hJA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/mine/eva) "hJD" = ( /obj/structure/ladder, /turf/open/floor/wood, @@ -27463,12 +27481,6 @@ }, /turf/open/floor/iron/white/corner, /area/station/engineering/atmos) -"hLW" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/commons/fitness) "hLX" = ( /obj/structure/girder, /obj/structure/grille, @@ -27476,12 +27488,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"hLY" = ( -/obj/structure/cable, -/obj/structure/chair, -/obj/effect/landmark/start/shaft_miner, -/turf/open/floor/iron, -/area/station/cargo/storage) "hLZ" = ( /obj/machinery/telecomms/bus/preset_three, /turf/open/floor/circuit/telecomms/mainframe, @@ -27489,7 +27495,7 @@ "hMc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "hMg" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -27543,14 +27549,14 @@ }, /area/station/science/lab) "hMH" = ( +/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/filled/end{ +/obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 4 }, -/obj/structure/cable, -/turf/open/floor/iron/textured, -/area/station/medical/chem_storage) +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "hMJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -27719,16 +27725,11 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"hOY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/circuit, -/area/station/science/robotics/mechbay) "hPe" = ( /obj/structure/cable/multilayer/connected, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "hPf" = ( /obj/structure/safe/vault, /obj/item/clothing/head/costume/bearpelt, @@ -27740,7 +27741,7 @@ /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) +/area/station/command/vault) "hPk" = ( /obj/machinery/door/airlock/security{ name = "Permabrig Chapel" @@ -27760,6 +27761,15 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) +"hPx" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/dark/textured, +/area/station/medical/treatment_center) "hPz" = ( /obj/structure/chair{ dir = 8 @@ -27796,13 +27806,6 @@ /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"hPQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/large, -/area/station/commons/storage/mining) "hPT" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -27967,22 +27970,6 @@ /obj/structure/railing/corner, /turf/open/floor/iron, /area/mine/eva) -"hSl" = ( -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 9 - }, -/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, -/turf/open/floor/iron/dark/smooth_corner, -/area/station/ai_monitored/command/storage/eva) "hSm" = ( /obj/structure/table, /obj/item/paper/crumpled{ @@ -28216,19 +28203,6 @@ /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 @@ -28280,7 +28254,7 @@ "hWi" = ( /obj/machinery/teleport/hub, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "hWl" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -28353,6 +28327,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"hXE" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/suit_storage_unit/medical, +/obj/machinery/light/small/directional/south, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/paramedic) "hXU" = ( /obj/machinery/newscaster/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -28363,7 +28344,7 @@ name = "Disposal Access" }, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28403,9 +28384,25 @@ }, /turf/open/floor/plating, /area/station/cargo/sorting) +"hYH" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 9 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "hYL" = ( /obj/structure/closet/lasertag/blue, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, @@ -28462,6 +28459,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"hZk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/paramedic) "hZo" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -28473,9 +28478,7 @@ /turf/open/floor/plating, /area/station/maintenance/port/greater) "hZu" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/less_spawns) @@ -28557,6 +28560,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"iaC" = ( +/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/secondary/entry) "iaF" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -28637,7 +28646,7 @@ /turf/open/floor/iron/dark/smooth_edge{ dir = 1 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ibm" = ( /obj/structure/cable, /obj/machinery/newscaster/directional/north, @@ -28695,7 +28704,7 @@ /obj/effect/turf_decal/tile/dark_green, /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "ich" = ( /obj/structure/sign/warning/electric_shock/directional/north, /turf/open/openspace/icemoon/keep_below, @@ -28710,21 +28719,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"icu" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/dark/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/mine/living_quarters) "icA" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/brigdoor/left/directional/east{ @@ -28799,7 +28793,7 @@ name = "Garden Maintenance" }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -28918,7 +28912,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "ifX" = ( /obj/machinery/vending/wardrobe/cargo_wardrobe, /turf/open/floor/iron, @@ -28964,7 +28958,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/sign/plaques/kiddie/library{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) @@ -29048,10 +29043,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/machinery/light/cold/directional/north, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark/textured, /area/station/engineering/storage/tech) "ihu" = ( @@ -29065,7 +29058,7 @@ /obj/effect/mapping_helpers/airlock/access/all/security/armory, /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "ihB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29204,7 +29197,7 @@ "ijT" = ( /obj/structure/transit_tube/horizontal, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ijU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29218,6 +29211,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/mine/eva/lower) +"ijW" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "ijY" = ( /obj/structure/flora/rock/icy/style_random, /turf/open/misc/asteroid/snow/icemoon, @@ -29367,7 +29369,7 @@ /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "ilN" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 1 @@ -29391,6 +29393,12 @@ /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"imo" = ( +/obj/machinery/holopad, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) "imH" = ( /obj/structure/rack, /obj/effect/spawner/random/clothing/gloves, @@ -29490,7 +29498,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ior" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29636,7 +29644,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "iqC" = ( /obj/structure/table, /obj/item/flashlight/lamp, @@ -29818,7 +29826,7 @@ "itl" = ( /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "itt" = ( /obj/machinery/door/window/brigdoor/right/directional/south{ name = "Research Director Observation"; @@ -29919,7 +29927,7 @@ "iuS" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "ivi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow, @@ -29997,6 +30005,18 @@ }, /turf/open/floor/wood, /area/station/service/library) +"ivN" = ( +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/white/side{ + dir = 6 + }, +/area/mine/living_quarters) "iwa" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -30068,7 +30088,8 @@ /area/station/commons/vacant_room/office) "ixl" = ( /obj/structure/sign/plaques/kiddie/devils_tooth{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) @@ -30104,6 +30125,14 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) +"ixK" = ( +/obj/machinery/door/firedoor/heavy, +/obj/machinery/door/airlock/research{ + name = "Ordnance Lab" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/ordnance, +/turf/open/floor/iron/white, +/area/station/science/ordnance/office) "ixZ" = ( /obj/machinery/door/airlock/command/glass{ name = "Chief Engineer" @@ -30212,11 +30241,11 @@ "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/effect/mapping_helpers/airlock/unres/delayed, /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/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/greater) "izJ" = ( @@ -30250,7 +30279,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "iAu" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -30303,14 +30332,6 @@ }, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) -"iBl" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/smooth_large, -/area/station/science/breakroom) "iBo" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -30420,7 +30441,7 @@ "iDp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "iDq" = ( /turf/closed/wall/r_wall, /area/station/security/warden) @@ -30452,6 +30473,13 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"iEt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) "iEA" = ( /obj/structure/table/glass, /obj/item/storage/box/gloves{ @@ -30605,7 +30633,7 @@ /area/station/science/ordnance/office) "iHp" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "iHP" = ( /obj/machinery/holopad, /obj/effect/spawner/random/engineering/tracking_beacon, @@ -30700,14 +30728,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"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 @@ -30724,7 +30744,7 @@ }, /obj/effect/spawner/random/armory/rubbershot, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "iJK" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -30754,7 +30774,7 @@ /area/station/hallway/primary/central) "iJO" = ( /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "iJV" = ( /obj/structure/railing/corner/end{ dir = 8 @@ -30827,7 +30847,7 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -30944,7 +30964,7 @@ "iMp" = ( /obj/machinery/status_display/ai/directional/east, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "iMu" = ( /obj/machinery/camera/directional/east{ c_tag = "Arrivals Escape Pod 1" @@ -30952,13 +30972,23 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"iMv" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/beakers{ + pixel_y = 7 + }, +/obj/item/assembly/igniter{ + pixel_y = -3 + }, +/turf/open/floor/plating, +/area/station/medical/chem_storage) "iMw" = ( /obj/structure/reagent_dispensers/fueltank, /obj/structure/cable, /obj/effect/turf_decal/bot_red, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "iMA" = ( /obj/effect/turf_decal/loading_area{ dir = 1 @@ -31041,6 +31071,12 @@ }, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) +"iNL" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "iNQ" = ( /turf/open/floor/carpet, /area/station/maintenance/space_hut/cabin) @@ -31064,12 +31100,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/less_spawns) -"iOs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) "iOv" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -31121,6 +31151,21 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"iPr" = ( +/obj/machinery/door/airlock/external{ + dir = 8; + name = "Lower Medical External Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "chem-morgue-airlock" + }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/any/engineering/external, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/medical/morgue) "iPz" = ( /obj/effect/landmark/start/medical_doctor, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -31196,18 +31241,6 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron, /area/station/cargo/miningdock) -"iQx" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white/side, -/area/mine/living_quarters) "iQF" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/machinery/airalarm/directional/south, @@ -31234,6 +31267,11 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/science/xenobiology) +"iQN" = ( +/obj/machinery/firealarm/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) "iQQ" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -31324,14 +31362,6 @@ /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 - }, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/station/science/research) "iRV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31390,19 +31420,24 @@ name = "Unisex Showers" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) "iST" = ( /obj/structure/chair/office, /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "iSX" = ( /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/fore) +"iTb" = ( +/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) "iTr" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -31426,11 +31461,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"iTC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/warning/docking/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "iTP" = ( /obj/item/reagent_containers/cup/bucket, /obj/effect/turf_decal/trimline/green/filled/line, @@ -31438,6 +31468,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"iTR" = ( +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) "iTY" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/engine/plasma, @@ -31518,7 +31551,7 @@ /turf/open/floor/iron/dark/smooth_half{ dir = 1 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "iUT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -31543,18 +31576,6 @@ }, /turf/open/floor/iron, /area/station/commons/storage/primary) -"iVv" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, -/turf/open/floor/iron/cafeteria{ - dir = 8 - }, -/area/station/hallway/secondary/entry) "iVA" = ( /obj/effect/landmark/start/shaft_miner, /turf/open/floor/iron, @@ -31673,13 +31694,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/engineering/atmos) -"iXu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "iXC" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -31764,6 +31778,14 @@ /obj/structure/sink/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"iYt" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/floor/plating, +/area/station/ai/satellite/maintenance) "iYy" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -31811,11 +31833,6 @@ /obj/effect/turf_decal/trimline/yellow/line, /turf/open/floor/iron/dark/side, /area/station/security/prison/workout) -"iZq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "iZr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/electrolyzer, @@ -31860,6 +31877,7 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 1 }, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron/white, /area/station/medical/break_room) "iZW" = ( @@ -31886,7 +31904,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "jai" = ( /obj/structure/fence/post{ dir = 8 @@ -31922,6 +31940,24 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"jaF" = ( +/obj/structure/rack, +/obj/item/reagent_containers/cup/bottle/fluorine{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/epinephrine{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/iodine{ + pixel_x = 1 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark/textured_edge{ + dir = 8 + }, +/area/station/medical/chem_storage) "jaO" = ( /obj/machinery/door/airlock/atmos/glass{ name = "Turbine Access" @@ -32106,7 +32142,8 @@ dir = 1 }, /obj/structure/noticeboard/hos{ - pixel_y = 36 + pixel_y = 36; + dir = 1 }, /turf/open/floor/iron, /area/station/security/brig/upper) @@ -32147,12 +32184,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/mess) -"jdm" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/cryo) "jdA" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -32324,15 +32355,6 @@ /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) "jgC" = ( /obj/structure/minecart_rail{ dir = 10 @@ -32432,6 +32454,13 @@ /obj/structure/table, /turf/open/floor/iron/grimy, /area/station/security/prison/work) +"jhL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "jhQ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -32470,7 +32499,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "jjt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32583,6 +32612,19 @@ }, /turf/open/floor/iron/smooth, /area/mine/mechbay) +"jld" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/item/radio/intercom/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/machinery/camera/directional/south{ + c_tag = "Mining B-1 Hallway North"; + network = list("ss13", "mine") + }, +/turf/open/floor/iron/dark/side, +/area/mine/eva) "jle" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -32669,14 +32711,6 @@ }, /turf/open/floor/iron/cafeteria, /area/mine/laborcamp) -"jmh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/white/side{ - dir = 10 - }, -/area/station/science/research) "jms" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, @@ -32739,7 +32773,8 @@ }, /obj/machinery/light/directional/north, /obj/structure/noticeboard/qm{ - pixel_y = 36 + pixel_y = 36; + dir = 1 }, /turf/open/floor/iron, /area/station/cargo/storage) @@ -32813,7 +32848,7 @@ /obj/item/clothing/mask/gas, /obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron/textured, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "jol" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -33024,11 +33059,6 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) -"jsp" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/turf/open/floor/iron, -/area/station/security/prison/work) "jsq" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -33040,7 +33070,7 @@ req_one_access = list("teleporter","minisat") }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "jss" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -33081,10 +33111,10 @@ installation = /obj/item/gun/energy/e_gun }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "jtn" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) @@ -33203,10 +33233,6 @@ /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) "juq" = ( /obj/structure/closet/secure_closet/personal{ anchored = 1 @@ -33281,6 +33307,19 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/mine/production) +"jvJ" = ( +/obj/structure/sign/directions/engineering{ + pixel_y = -10 + }, +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = 10 + }, +/obj/structure/sign/directions/security{ + dir = 4 + }, +/turf/closed/wall, +/area/station/commons/storage/tools) "jvL" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/hollow/reinforced/middle{ @@ -33359,11 +33398,16 @@ /area/station/security/brig/upper) "jwz" = ( /obj/structure/flora/rock/icy/style_random, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"jwC" = ( +/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 + }, +/area/station/science/research) "jwF" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/iron, @@ -33409,12 +33453,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) -"jxv" = ( -/obj/effect/landmark/start/paramedic, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/storage) +/area/station/command/vault) "jxw" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/icemoon, @@ -33536,7 +33575,7 @@ /obj/machinery/firealarm/directional/east, /obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "jzH" = ( /obj/machinery/modular_computer/preset/research{ dir = 4 @@ -33546,6 +33585,19 @@ }, /turf/open/floor/iron/smooth_corner, /area/station/command/heads_quarters/rd) +"jzI" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage) "jzL" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/mining/glass{ @@ -33667,14 +33719,6 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"jBr" = ( -/obj/machinery/computer/security{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/computer/security/telescreen/prison/directional/north, -/turf/open/floor/iron/showroomfloor, -/area/station/security/warden) "jBB" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/junction, /obj/effect/spawner/structure/window, @@ -33751,12 +33795,30 @@ dir = 4 }, /area/mine/production) +"jCW" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/random/structure/steam_vent, +/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/aft/greater) "jDc" = ( /obj/effect/spawner/random/vending/snackvend, /obj/structure/sign/departments/restroom/directional/south, /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron/white, /area/station/medical/break_room) +"jDf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "jDl" = ( /obj/structure/sign/warning/cold_temp/directional/north, /turf/open/floor/plating, @@ -33829,7 +33891,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "jDX" = ( /obj/structure/training_machine, /obj/item/target, @@ -33900,6 +33962,14 @@ }, /turf/open/floor/plating/icemoon, /area/station/science/ordnance/bomb/planet) +"jEW" = ( +/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/cargo/miningdock) "jFf" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 @@ -33976,12 +34046,6 @@ /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/dark/smooth_large, /area/station/security/checkpoint/medical) -"jHb" = ( -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/less_spawns) "jHe" = ( /obj/structure/table/wood, /turf/open/floor/wood/parquet, @@ -34125,16 +34189,17 @@ }, /obj/structure/cable/multilayer/connected, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"jJd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/area/station/ai/satellite/chamber) +"jJa" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Public Mining Storage" + }, /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) +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/textured, +/area/station/commons/storage/mining) "jJe" = ( /obj/machinery/conveyor{ dir = 4; @@ -34269,7 +34334,7 @@ /turf/open/floor/iron/freezer, /area/station/science/xenobiology) "jKJ" = ( -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -34284,9 +34349,8 @@ /obj/effect/landmark/event_spawn, /obj/structure/cable, /obj/effect/turf_decal/tile/green, -/obj/structure/sign/plaques/kiddie, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "jKN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34304,7 +34368,8 @@ /area/station/maintenance/port/greater) "jKQ" = ( /obj/structure/sign/warning/fire{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/less_spawns) @@ -34446,7 +34511,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "jMn" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/maintenance{ @@ -34583,7 +34648,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/line, -/obj/effect/landmark/start/paramedic, /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) @@ -34698,12 +34762,6 @@ /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) "jPL" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -34732,10 +34790,24 @@ /obj/structure/sign/warning/directional/north, /turf/open/floor/engine, /area/station/engineering/supermatter) +"jQf" = ( +/obj/machinery/computer/crew, +/obj/effect/turf_decal/tile/blue/full, +/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/medical/treatment_center) "jQi" = ( /obj/machinery/space_heater, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"jQv" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/fitness) "jQy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -34809,11 +34881,8 @@ /obj/item/ai_module/supplied/freeform, /obj/effect/turf_decal/tile/dark_green, /obj/machinery/light/directional/west, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "jRi" = ( /obj/structure/fence{ dir = 8 @@ -34842,10 +34911,6 @@ "jRA" = ( /turf/open/openspace, /area/station/service/bar/atrium) -"jRC" = ( -/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, @@ -34938,15 +35003,6 @@ }, /turf/open/floor/plastic, /area/station/commons/dorms/laundry) -"jST" = ( -/obj/machinery/door/window/right/directional/north{ - name = "Bridge Delivery"; - req_access = list("command") - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/maintenance/central/greater) "jTf" = ( /obj/structure/fence{ dir = 1 @@ -34967,12 +35023,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lab) -"jTr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/explab) "jTw" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/plating, @@ -35066,7 +35116,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "jUY" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/personal{ @@ -35141,6 +35191,11 @@ }, /turf/open/floor/wood/parquet, /area/station/service/bar/atrium) +"jWn" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/security/prison/work) "jWq" = ( /obj/structure/fence{ dir = 4 @@ -35297,7 +35352,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "jZe" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -35551,6 +35606,14 @@ }, /turf/open/floor/plating, /area/station/security/prison/visit) +"kcQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron/textured, +/area/station/medical/chem_storage) "kcT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -35646,6 +35709,15 @@ }, /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) +"kea" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "kei" = ( /obj/docking_port/stationary/escape_pod, /turf/open/floor/plating/snowed/icemoon, @@ -35667,13 +35739,6 @@ dir = 4 }, /area/station/security/brig/entrance) -"kex" = ( -/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/white, -/area/station/science/explab) "keA" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 8 @@ -35775,7 +35840,7 @@ pixel_x = -10 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "kfS" = ( /obj/machinery/atmospherics/components/tank/air/layer4{ initialize_directions = 2 @@ -35891,11 +35956,11 @@ /obj/item/crowbar/red, /obj/machinery/airalarm/directional/north, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "khR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "khW" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/spawner/random/structure/crate, @@ -35998,7 +36063,7 @@ /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) +/area/station/security/armory) "kjd" = ( /obj/structure/plasticflaps{ dir = 4 @@ -36024,7 +36089,7 @@ /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{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -36109,13 +36174,13 @@ /obj/effect/turf_decal/bot_red, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "kke" = ( /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/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -36141,11 +36206,6 @@ /obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"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{ @@ -36285,15 +36345,6 @@ }, /turf/open/floor/iron/white, /area/mine/laborcamp) -"kmC" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Public Mining Storage" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured, -/area/station/commons/storage/mining) "kmG" = ( /obj/machinery/defibrillator_mount/directional/north, /obj/effect/turf_decal/tile/blue/full, @@ -36321,7 +36372,7 @@ /obj/machinery/door/airlock/engineering{ name = "Utilities Room" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, @@ -36578,21 +36629,17 @@ /turf/open/floor/plating, /area/mine/eva/lower) "krv" = ( -/obj/structure/sign/directions/engineering{ - pixel_x = -32; - pixel_y = -40 +/obj/structure/sign/directions/command{ + pixel_y = 10 }, -/obj/structure/sign/directions/medical{ - dir = 4; - pixel_x = -32; - pixel_y = -24 +/obj/structure/sign/directions/vault{ + dir = 8; + pixel_y = -10 }, -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_x = -32; - pixel_y = -32 +/obj/structure/sign/directions/supply{ + dir = 8 }, -/turf/open/floor/iron, +/turf/closed/wall, /area/station/hallway/primary/central) "kry" = ( /obj/structure/cable, @@ -36703,6 +36750,20 @@ "ksC" = ( /turf/open/floor/iron, /area/station/security/brig/upper) +"ksP" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/entry) "kta" = ( /turf/closed/wall, /area/station/commons/storage/mining) @@ -36731,6 +36792,15 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"kth" = ( +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/storage/mining) "ktl" = ( /obj/machinery/holopad, /obj/structure/cable, @@ -36855,6 +36925,12 @@ }, /turf/open/floor/plating, /area/station/service/hydroponics) +"kvc" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "kvf" = ( /obj/effect/turf_decal/caution{ dir = 4 @@ -37039,11 +37115,6 @@ dir = 5 }, /area/station/hallway/secondary/entry) -"kyi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/command/gateway) "kyp" = ( /obj/effect/turf_decal/box/corners, /obj/effect/turf_decal/box/corners{ @@ -37113,6 +37184,21 @@ /obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/storage) +"kzh" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/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/cargo/storage) "kzv" = ( /obj/structure/bed, /obj/effect/spawner/random/bedsheet/any, @@ -37272,16 +37358,20 @@ /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"kBl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/circuit, -/area/station/science/robotics/mechbay) +"kBy" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "kBL" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -37321,7 +37411,8 @@ /obj/machinery/firealarm/directional/west, /obj/machinery/light/small/directional/west, /obj/structure/sign/painting/library{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/wood, /area/station/service/library) @@ -37401,7 +37492,7 @@ /area/station/construction) "kCV" = ( /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "kDa" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/structure/table, @@ -37471,6 +37562,14 @@ }, /turf/open/floor/plating/icemoon, /area/station/science/ordnance/bomb/planet) +"kEa" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/effect/turf_decal/siding/thinplating, +/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) "kEj" = ( /obj/machinery/computer/libraryconsole/bookmanagement, /obj/structure/table, @@ -37570,9 +37669,7 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) "kGc" = ( @@ -37687,13 +37784,6 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/stone, /area/mine/eva/lower) -"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, @@ -37753,7 +37843,7 @@ dir = 8 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "kIh" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -37837,6 +37927,13 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) +"kJd" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/command/heads_quarters/hop) "kJe" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance" @@ -38041,6 +38138,12 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"kMX" = ( +/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/hallway/secondary/entry) "kMY" = ( /obj/effect/turf_decal/siding/yellow{ dir = 6 @@ -38234,7 +38337,7 @@ }, /obj/effect/turf_decal/tile/dark_green, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "kPg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38345,7 +38448,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "kQE" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -38390,6 +38493,11 @@ /obj/structure/bookcase, /turf/open/floor/iron, /area/mine/laborcamp) +"kRp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "kRw" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/atmos_control/nocontrol/incinerator{ @@ -38412,16 +38520,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"kRH" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Chemistry Lab Exit" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "chem-airlock" - }, -/obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, -/turf/open/floor/plating, -/area/station/medical/chemistry) "kRJ" = ( /obj/machinery/camera/directional/north{ c_tag = "Atmospherics Distribution Loop" @@ -38465,9 +38563,9 @@ /turf/open/floor/iron, /area/mine/laborcamp/security) "kSw" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall, -/area/icemoon/underground/explored) +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "kSA" = ( /obj/machinery/mining_weather_monitor/directional/east, /turf/open/floor/iron/grimy, @@ -38498,6 +38596,17 @@ }, /turf/open/floor/plating, /area/station/engineering/supermatter) +"kSR" = ( +/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, +/obj/structure/cable, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "kSU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -38509,6 +38618,13 @@ dir = 1 }, /area/station/service/chapel/office) +"kTy" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/railing, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "kTz" = ( /turf/open/floor/iron/smooth_half, /area/station/security/brig/upper) @@ -38546,7 +38662,7 @@ "kUn" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -38599,7 +38715,7 @@ /area/station/cargo/storage) "kUJ" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /obj/structure/mirror/directional/west, /obj/structure/sign/poster/contraband/random/directional/south, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -38649,14 +38765,13 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"kVA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/mining_weather_monitor/directional/north, -/turf/open/floor/iron/large, -/area/station/hallway/secondary/entry) +"kVD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/storage) "kVF" = ( /obj/structure/closet/secure_closet/courtroom, /obj/item/gavelhammer, @@ -38699,6 +38814,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"kVY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/cargo/miningdock) "kWh" = ( /obj/machinery/holopad/secure, /turf/open/floor/iron/dark/smooth_large, @@ -38804,6 +38924,13 @@ /obj/structure/sign/warning/electric_shock/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"kXm" = ( +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/effect/landmark/mining_center, +/turf/open/floor/iron, +/area/station/cargo/storage) "kXq" = ( /obj/machinery/air_sensor/plasma_tank, /turf/open/floor/engine/plasma, @@ -38922,7 +39049,6 @@ /turf/open/floor/iron, /area/mine/laborcamp) "kYF" = ( -/obj/structure/light_construct/directional/west, /mob/living/basic/goose/vomit, /turf/open/floor/wood, /area/station/maintenance/port/aft) @@ -38948,15 +39074,6 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/mining) -"kYS" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Public Mining Storage" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/navigate_destination, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured, -/area/station/commons/storage/mining) "kZa" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39009,12 +39126,6 @@ "kZu" = ( /turf/closed/wall, /area/mine/production) -"kZC" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/command/storage/eva) "kZI" = ( /obj/structure/rack, /obj/effect/spawner/random/contraband/permabrig_weapon, @@ -39035,18 +39146,7 @@ req_access = list("armory") }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) -"laf" = ( -/obj/structure/cable, -/obj/structure/chair{ - dir = 1 - }, -/obj/item/storage/fancy/cigarettes, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) +/area/station/security/armory) "lah" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -39152,6 +39252,12 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) +"lbj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/secondary/entry) "lbk" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -39204,6 +39310,9 @@ "lcu" = ( /turf/open/floor/iron/white, /area/station/science/explab) +"lcA" = ( +/turf/closed/wall/r_wall, +/area/station/medical/chem_storage) "lcB" = ( /obj/machinery/light/small/directional/west, /obj/structure/table/wood, @@ -39237,9 +39346,9 @@ /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/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/greater) "ldz" = ( @@ -39271,13 +39380,6 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"ldV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "lec" = ( /obj/structure/railing{ dir = 4 @@ -39340,6 +39442,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/storage) +"lfd" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "lfo" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -39412,15 +39521,12 @@ /turf/open/floor/iron, /area/station/command/heads_quarters/qm) "lfL" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/white, /area/station/medical/storage) "lfU" = ( /obj/effect/spawner/random/structure/grille, @@ -39732,12 +39838,6 @@ dir = 1 }, /area/station/security/office) -"lke" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/service/janitor) "lkj" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39769,8 +39869,6 @@ }, /obj/item/storage/box/rxglasses, /obj/item/hand_labeler, -/obj/item/gun/syringe, -/obj/item/gun/syringe, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, @@ -39789,6 +39887,9 @@ "lli" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"llm" = ( +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/eva) "lln" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 4 @@ -39798,11 +39899,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"llw" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "llD" = ( /obj/structure/table/wood, /obj/item/paper_bin/carbon, @@ -39990,12 +40086,19 @@ dir = 1 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "lom" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/stone, /area/station/commons/lounge) +"lon" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/eva) "loy" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted, /obj/machinery/button/door/directional/east{ @@ -40019,6 +40122,20 @@ /obj/structure/statue/snow/snowman, /turf/open/misc/asteroid/snow/standard_air, /area/station/science/cytology) +"loP" = ( +/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/workout) +"loQ" = ( +/obj/structure/table, +/obj/item/papercutter{ + pixel_x = 8; + pixel_y = 6 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/command/heads_quarters/hop) "loT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40139,18 +40256,10 @@ /obj/item/rcl/pre_loaded, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"lqj" = ( -/obj/structure/chair/pew/right{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "lqz" = ( /obj/structure/cable, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lqA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -40256,6 +40365,13 @@ /obj/effect/decal/cleanable/blood/drip, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/work) +"lrO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/science/explab) "lrY" = ( /obj/machinery/space_heater, /obj/machinery/light/small/directional/east, @@ -40291,6 +40407,13 @@ "lso" = ( /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"lst" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/medical/morgue) "lsA" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -40322,7 +40445,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "ltk" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -40332,13 +40455,14 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "ltE" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) +/obj/effect/turf_decal/trimline/yellow/filled/end{ + 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/textured, +/area/station/medical/chem_storage) "ltH" = ( /obj/structure/sign/warning/electric_shock/directional/north, /turf/open/floor/plating/snowed/smoothed/icemoon, @@ -40355,15 +40479,6 @@ /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) "ltY" = ( /obj/machinery/camera/directional/north{ c_tag = "Central Hallway North-East" @@ -40379,12 +40494,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) -"lup" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "lux" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -40443,10 +40552,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"lva" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/science/xenobiology) "lvb" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 @@ -40629,16 +40734,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/textured, /area/mine/mechbay) -"lxb" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "lxc" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -40650,6 +40745,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/storage/tools) +"lxj" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/computer/station_alert{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai/satellite/interior) "lxu" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 @@ -40661,16 +40764,6 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) -"lxT" = ( -/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) "lxU" = ( /obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ dir = 8 @@ -40691,7 +40784,7 @@ /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "lyg" = ( /turf/closed/wall/r_wall, /area/station/security/brig) @@ -40716,14 +40809,12 @@ /obj/machinery/computer/gateway_control, /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, /area/station/command/gateway) "lyG" = ( /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "lyH" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible/layer2, @@ -41039,18 +41130,16 @@ /area/station/engineering/lobby) "lCI" = ( /obj/effect/spawner/random/vending/snackvend, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, /obj/effect/turf_decal/siding/wood{ dir = 8 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron/dark, /area/station/command/meeting_room) "lCV" = ( /obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -41078,22 +41167,19 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "lDo" = ( -/obj/structure/sign/directions/medical{ +/obj/structure/sign/directions/evac{ dir = 4; - pixel_x = 32; - pixel_y = -24 + pixel_y = -10 }, -/obj/structure/sign/directions/science{ +/obj/structure/sign/directions/medical{ dir = 4; - pixel_x = 32; - pixel_y = -32 + pixel_y = 10 }, -/obj/structure/sign/directions/engineering{ - pixel_x = 32; - pixel_y = -40 +/obj/structure/sign/directions/security{ + dir = 1 }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +/turf/closed/wall, +/area/station/maintenance/fore) "lDq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -41159,7 +41245,7 @@ req_access = list("ai_upload") }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lEj" = ( /turf/open/floor/iron/dark/textured, /area/station/security/processing) @@ -41179,7 +41265,7 @@ /obj/machinery/door/airlock/research{ name = "Ordnance Launch Room" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/science/ordnance/testlab) @@ -41268,16 +41354,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"lFA" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal) "lFG" = ( /obj/machinery/door/airlock/engineering{ name = "Starboard Bow Solar Access" @@ -41332,6 +41408,9 @@ dir = 4 }, /obj/machinery/light/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "lGp" = ( @@ -41387,23 +41466,11 @@ /obj/machinery/button/door{ id = "Interrogation"; name = "Interrogation Shutters"; - pixel_x = -22 + pixel_x = -22; + dir = 8 }, /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) "lGN" = ( /obj/effect/landmark/start/botanist, /obj/structure/chair/office/light, @@ -41522,7 +41589,7 @@ /area/mine/eva/lower) "lIW" = ( /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "lJc" = ( /obj/machinery/hydroponics/soil/rich, /turf/open/floor/grass, @@ -41571,7 +41638,7 @@ "lKs" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, @@ -41620,13 +41687,20 @@ }, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lLm" = ( /turf/open/floor/iron/cafeteria, /area/station/maintenance/port/aft) +"lLr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/command/meeting_room) "lLA" = ( /obj/structure/sign/warning/fire{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/openspace/icemoon, /area/icemoon/underground/explored) @@ -41649,6 +41723,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/recharge_floor, /area/mine/mechbay) +"lLZ" = ( +/obj/machinery/light_switch/directional/west, +/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) "lMa" = ( /obj/item/trash/pistachios, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -41701,7 +41783,7 @@ }, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lNi" = ( /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/plating, @@ -41736,7 +41818,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lNG" = ( /obj/machinery/door/airlock/security/glass{ name = "Security Office" @@ -41763,6 +41845,12 @@ /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/fore) +"lNO" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/textured_edge{ + dir = 4 + }, +/area/station/medical/chem_storage) "lNP" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -41786,6 +41874,10 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) +"lOp" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "lOr" = ( /obj/structure/railing, /obj/structure/stairs/east, @@ -41871,7 +41963,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "lPh" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -41934,7 +42026,7 @@ /turf/open/floor/iron/dark/smooth_edge{ dir = 1 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "lPK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42065,12 +42157,6 @@ /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) "lRj" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -42093,7 +42179,7 @@ "lRx" = ( /obj/effect/turf_decal/tile/dark_green, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "lRy" = ( /obj/structure/showcase/cyborg/old{ dir = 8; @@ -42106,7 +42192,7 @@ }, /obj/machinery/newscaster/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lRD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -42171,7 +42257,7 @@ /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "lRZ" = ( @@ -42232,13 +42318,13 @@ id_tag = "MedbayFoyer"; name = "Medbay" }, -/obj/effect/mapping_helpers/airlock/unres, /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/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/turf_decal/tile/blue/full, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/iron/large, /area/station/medical/medbay/lobby) "lUf" = ( @@ -42285,7 +42371,7 @@ dir = 1 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "lVk" = ( /obj/effect/spawner/structure/window/hollow/reinforced/end{ dir = 1 @@ -42312,6 +42398,12 @@ "lVt" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/light/floor, +/obj/machinery/button/door/directional/west{ + pixel_x = -22; + id = "xenobia10"; + name = "Xenobio Pen 10 Blast DOors"; + req_access = list("xenobiology") + }, /turf/open/floor/iron/white, /area/station/science/xenobiology) "lVu" = ( @@ -42670,7 +42762,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -42713,7 +42805,7 @@ name = "Fitness Maintenance" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, @@ -42801,12 +42893,6 @@ /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, -/obj/effect/landmark/start/prisoner, -/turf/open/floor/iron, -/area/station/security/prison/work) "mdy" = ( /obj/machinery/camera/directional/south{ c_tag = "Morgue Hallway" @@ -42844,7 +42930,7 @@ /obj/item/clothing/gloves/color/grey/protects_cold, /obj/item/clothing/mask/gas, /turf/open/floor/iron/textured, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "mdX" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -42880,7 +42966,7 @@ /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "meH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42935,7 +43021,7 @@ /area/mine/eva/lower) "mfD" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "mfH" = ( /turf/closed/wall/r_wall, /area/station/security/brig/upper) @@ -43048,13 +43134,13 @@ dir = 8 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "mhb" = ( /obj/effect/turf_decal/trimline/dark/warning{ dir = 8 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "mhx" = ( /obj/effect/turf_decal/bot, /obj/effect/landmark/secequipment, @@ -43125,6 +43211,14 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) +"mjA" = ( +/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, +/area/station/hallway/secondary/entry) "mjH" = ( /obj/structure/table/optable, /obj/machinery/newscaster/directional/east, @@ -43172,12 +43266,6 @@ /obj/item/clothing/head/costume/fancy, /turf/open/floor/iron/dark/textured, /area/station/security/prison) -"mkn" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/storage/mining) "mku" = ( /obj/effect/spawner/random/structure/grille, /obj/effect/decal/cleanable/glass, @@ -43226,7 +43314,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "mly" = ( /obj/structure/sign/warning/electric_shock/directional/north, /turf/open/floor/iron/recharge_floor, @@ -43393,13 +43481,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"mnC" = ( -/obj/structure/grille, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) "mnF" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -43495,6 +43576,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/mess) +"mpx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white/side{ + dir = 10 + }, +/area/station/science/research) "mpH" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -43508,9 +43597,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/port/greater) "mqd" = ( @@ -43619,6 +43705,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"mrW" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/cargo/office) "msb" = ( /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, @@ -43683,13 +43775,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) -"msP" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/storage/mining) "msT" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/machinery/atmospherics/components/binary/valve/digital/on{ @@ -43802,19 +43887,6 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/disposal) -"mue" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage) "muv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/stool/directional/west, @@ -43865,7 +43937,7 @@ /obj/structure/cable, /obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "mvG" = ( /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ dir = 8 @@ -43899,7 +43971,7 @@ dir = 5 }, /turf/open/floor/plating/snowed/icemoon, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "mwp" = ( /obj/structure/disposalpipe/trunk/multiz{ dir = 4 @@ -43921,6 +43993,12 @@ }, /turf/open/floor/plating, /area/station/medical/pharmacy) +"mwP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/command/gateway) "mwQ" = ( /obj/structure/tank_holder/extinguisher, /turf/open/floor/plating, @@ -43941,11 +44019,6 @@ /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) "mxF" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/white/line{ @@ -43965,17 +44038,6 @@ /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 }, @@ -44017,7 +44079,7 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /obj/effect/mapping_helpers/airlock/access/any/supply/mining, /turf/open/floor/plating, @@ -44051,7 +44113,7 @@ "myP" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, @@ -44064,11 +44126,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/security/prison/safe) -"myR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/department/cargo) "myW" = ( /obj/structure/ore_box, /turf/open/floor/plating/snowed/smoothed/icemoon, @@ -44178,19 +44235,10 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "mzZ" = ( -/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/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat/hallway"; - name = "Chamber Hallway Turret Control"; - pixel_x = 32; - pixel_y = -24; - req_access = list("minisat") - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/light_construct/directional/north, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) "mAc" = ( /obj/machinery/door/airlock/maintenance{ name = "Mining Maintenance" @@ -44204,6 +44252,16 @@ "mAe" = ( /turf/open/floor/glass/reinforced, /area/station/security/lockers) +"mAh" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/half/contrasted{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/white/side, +/area/mine/living_quarters) "mAn" = ( /obj/effect/spawner/random/trash, /obj/structure/grille/broken, @@ -44365,7 +44423,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "mCx" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/south, @@ -44424,6 +44482,17 @@ /obj/item/stamp/head/ce, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) +"mDS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness) "mDX" = ( /turf/open/floor/engine/n2, /area/station/engineering/atmos) @@ -44442,7 +44511,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "mEv" = ( /obj/structure/rack, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -44470,7 +44539,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "mEz" = ( /obj/structure/sign/poster/contraband/random/directional/east, /obj/effect/decal/cleanable/dirt, @@ -44481,12 +44550,6 @@ /obj/structure/cable, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) -"mEI" = ( -/obj/structure/railing/corner/end{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "mEJ" = ( /turf/closed/wall/r_wall, /area/station/science/genetics) @@ -44622,26 +44685,20 @@ /area/icemoon/surface/outdoors/nospawn) "mGg" = ( /obj/structure/cable, +/turf/closed/wall, +/area/station/science/xenobiology) +"mGs" = ( +/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic, +/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/machinery/firealarm/directional/south{ - pixel_x = -30 +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/door/airlock/medical/glass{ + name = "Paramedic Dispatch Room" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) -"mGs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/research{ - name = "Chemical Storage" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/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/chem_storage) +/area/station/medical/paramedic) "mGu" = ( /obj/machinery/rnd/server, /obj/structure/lattice/catwalk, @@ -44658,11 +44715,6 @@ /obj/structure/stairs/north, /turf/open/floor/iron/stairs/medium, /area/station/cargo/storage) -"mGJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/mine/eva) "mGO" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -44696,6 +44748,13 @@ /obj/machinery/brm, /turf/open/floor/iron, /area/mine/production) +"mHn" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/command/gateway) "mHq" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -44783,18 +44842,12 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"mIH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/iron, -/area/station/commons/storage/mining) "mII" = ( /obj/machinery/door/airlock/maintenance{ name = "Research Delivery Access" }, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, @@ -45065,7 +45118,7 @@ }, /obj/effect/turf_decal/tile/green, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "mNP" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, @@ -45105,6 +45158,17 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"mOF" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/mail_sorting/service/janitor_closet, +/obj/effect/turf_decal/tile/purple/half/contrasted, +/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) "mOL" = ( /obj/machinery/airalarm/directional/south, /obj/structure/disposalpipe/segment{ @@ -45271,7 +45335,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "mRU" = ( /obj/effect/decal/cleanable/insectguts, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -45311,16 +45375,12 @@ /turf/open/floor/plating, /area/station/cargo/storage) "mSQ" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/ice, -/area/icemoon/surface/outdoors/nospawn) -"mSX" = ( -/obj/effect/landmark/start/hangover, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/warning/cold_temp/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) +/obj/structure/fence{ + dir = 2 + }, +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "mSY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/sign/warning/secure_area/directional/north, @@ -45378,6 +45438,11 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"mUR" = ( +/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) "mVi" = ( /obj/structure/railing{ dir = 4 @@ -45392,7 +45457,7 @@ "mVp" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "mVw" = ( /obj/machinery/requests_console/directional/west{ department = "Captain's Desk"; @@ -45414,7 +45479,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, @@ -45438,12 +45503,12 @@ }, /obj/structure/cable, /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /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/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "mWf" = ( @@ -45484,8 +45549,14 @@ /obj/structure/sign/warning/secure_area/directional/east, /obj/effect/turf_decal/tile/blue, /obj/machinery/light/small/directional/east, +/obj/machinery/turretid{ + control_area = "/area/station/ai/satellite/hallway"; + name = "Chamber Hallway Turret Control"; + pixel_y = -24; + req_access = list("minisat") + }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "mWz" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/plating, @@ -45537,6 +45608,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"mWW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/cryo) "mWY" = ( /obj/structure/chair/office, /obj/effect/turf_decal/tile/red/half/contrasted, @@ -45569,7 +45644,7 @@ /obj/structure/cable/layer3, /mob/living/simple_animal/bot/secbot/pingsky, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "mXl" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/directional/east{ @@ -45605,7 +45680,7 @@ /area/station/hallway/secondary/entry) "mYh" = ( /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "mYi" = ( /obj/machinery/door/airlock/medical/glass{ name = "Infirmary" @@ -45664,15 +45739,14 @@ "mYA" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/item/kirbyplants/random, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) "mYG" = ( /obj/effect/turf_decal/bot, /obj/structure/noticeboard/hop{ - pixel_y = 36 + pixel_y = 36; + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/primary/central) @@ -45714,7 +45788,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/light/built/directional/east, +/obj/machinery/light/empty/directional/east, /turf/open/floor/iron/white, /area/station/maintenance/port/fore) "mZG" = ( @@ -45748,12 +45822,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/mine/laborcamp) -"mZK" = ( -/obj/machinery/holopad, -/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) "mZT" = ( /obj/structure/table/wood, /obj/item/cigarette/cigar{ @@ -45770,17 +45838,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"naq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/mine/eva) "nav" = ( /obj/machinery/firealarm/directional/north, /obj/structure/cable, @@ -45879,9 +45936,7 @@ "nbz" = ( /obj/structure/chair/wood, /obj/effect/mapping_helpers/no_atoms_ontop, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) "nbB" = ( @@ -45962,6 +46017,14 @@ /obj/structure/sign/warning/fire/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/less_spawns) +"ncf" = ( +/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, +/turf/open/floor/iron/textured, +/area/station/medical/chem_storage) "nch" = ( /obj/effect/turf_decal/trimline/neutral/mid_joiner{ dir = 4 @@ -45977,11 +46040,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/sign/poster/official/safety_internals/directional/north, /turf/open/floor/iron/dark/smooth_edge{ dir = 4 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "nci" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46070,13 +46132,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"ndl" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/maintenance/disposal) "ndv" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/machinery/light/warm/directional/north, @@ -46358,7 +46413,6 @@ /obj/structure/disposalpipe/trunk/multiz/down{ dir = 4 }, -/obj/structure/tank_holder/extinguisher, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) @@ -46375,6 +46429,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/grimy, /area/station/maintenance/aft/greater) +"nhS" = ( +/obj/machinery/door/window/right/directional/north{ + name = "Bridge Delivery"; + req_access = list("command") + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/maintenance/central/greater) "nhT" = ( /obj/machinery/door/airlock/external{ glass = 1; @@ -46555,6 +46617,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/vault, /area/station/security/prison/rec) +"nli" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/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) "nlp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46664,6 +46738,13 @@ /obj/effect/spawner/random/contraband/cannabis, /turf/open/floor/grass, /area/station/security/prison/garden) +"nmw" = ( +/obj/structure/chair/pew/left{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "nmx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46718,6 +46799,13 @@ /obj/effect/landmark/navigate_destination/library, /turf/open/floor/wood, /area/station/service/library) +"nmX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark/smooth_large, +/area/station/science/breakroom) "nnj" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood{ @@ -46824,11 +46912,6 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron, /area/station/engineering/storage_shared) -"noR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage) "noT" = ( /obj/effect/spawner/random/trash/bin, /obj/effect/decal/cleanable/dirt, @@ -46837,13 +46920,6 @@ }, /turf/open/floor/plating, /area/station/commons/storage/mining) -"noW" = ( -/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/warning, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "noX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, @@ -46912,7 +46988,7 @@ }, /obj/item/clothing/mask/breath, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "npx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -46920,14 +46996,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/white, /area/station/maintenance/port/fore) -"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 @@ -47003,14 +47071,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/storage/mining) -"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) "nqP" = ( /obj/machinery/camera/directional/north{ c_tag = "Research Division West"; @@ -47245,11 +47305,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"nup" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison/visit) "nuD" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -47266,9 +47321,6 @@ /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/west{ - pixel_y = 30 - }, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 8 }, @@ -47291,12 +47343,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) -"nvs" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/hop) "nvx" = ( /obj/machinery/airalarm/directional/east, /obj/effect/landmark/event_spawn, @@ -47345,14 +47391,6 @@ }, /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{ @@ -47404,9 +47442,7 @@ /turf/open/floor/iron/dark, /area/station/service/hydroponics) "nwD" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/less_spawns) "nwF" = ( @@ -47441,6 +47477,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/plating, /area/station/commons/storage/mining) "nxm" = ( @@ -47628,13 +47665,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"nzs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/computer/crew, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/large, -/area/station/medical/treatment_center) "nzy" = ( /obj/machinery/computer/atmos_control/mix_tank{ dir = 8 @@ -47656,7 +47686,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "nzG" = ( /obj/structure/railing{ dir = 10 @@ -47726,7 +47756,8 @@ }, /obj/machinery/light/directional/north, /obj/structure/noticeboard/ce{ - pixel_y = 36 + pixel_y = 36; + dir = 1 }, /turf/open/floor/iron, /area/station/engineering/main) @@ -47813,7 +47844,7 @@ name = "Common Channel" }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "nBt" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -48125,7 +48156,7 @@ /obj/structure/cable/layer3, /obj/effect/landmark/event_spawn, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nFn" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -48261,7 +48292,7 @@ }, /obj/effect/spawner/random/armory/barrier_grenades, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "nGU" = ( /obj/structure/closet/secure_closet/security/sec, /obj/machinery/airalarm/directional/north, @@ -48317,6 +48348,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"nHY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/space_heater, +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "nIb" = ( /obj/structure/chair{ dir = 1 @@ -48537,9 +48576,7 @@ /turf/open/openspace, /area/station/science/research) "nLB" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) "nLD" = ( @@ -48626,11 +48663,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"nMA" = ( -/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) "nME" = ( /obj/item/clothing/head/utility/hardhat, /obj/effect/turf_decal/weather/snow/corner{ @@ -48646,12 +48678,15 @@ /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) "nMN" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Chemistry Access Maintenance" +/obj/effect/mapping_helpers/airlock/access/all/medical/pharmacy, +/obj/machinery/door/airlock/research{ + name = "Chemical Storage" }, -/obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor, /turf/open/floor/plating, -/area/station/maintenance/department/medical/central) +/area/station/medical/chem_storage) "nMP" = ( /obj/structure/chair/pew{ dir = 1 @@ -48666,7 +48701,8 @@ "nMT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/sign/painting/library{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/wood, /area/station/service/library) @@ -48734,6 +48770,18 @@ /obj/structure/railing/corner, /turf/open/floor/iron, /area/station/cargo/storage) +"nNA" = ( +/obj/structure/cable, +/obj/structure/chair{ + dir = 1 + }, +/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/aft/greater) "nNB" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -48744,7 +48792,7 @@ "nNM" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -48778,22 +48826,11 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) -"nOh" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) "nOj" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/noticeboard/staff{ - pixel_y = 36 + pixel_y = 36; + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) @@ -49159,7 +49196,7 @@ /obj/machinery/status_display/evac/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nSH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49248,9 +49285,7 @@ /area/station/security/checkpoint/medical) "nTX" = ( /obj/structure/flora/grass/both/style_random, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/less_spawns) "nUg" = ( @@ -49276,7 +49311,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_half, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "nUJ" = ( /obj/machinery/flasher/directional/east{ id = "brigentry" @@ -49334,7 +49369,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "nVC" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, @@ -49352,6 +49387,18 @@ /obj/structure/plasticflaps/kitchen, /turf/open/floor/plating, /area/station/service/kitchen/coldroom) +"nVM" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/deck{ + pixel_x = -2; + pixel_y = 15 + }, +/obj/effect/spawner/random/food_or_drink/snack{ + pixel_x = 5; + pixel_y = 6 + }, +/turf/open/floor/carpet/blue, +/area/station/hallway/secondary/entry) "nVR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria{ @@ -49366,6 +49413,13 @@ /obj/item/plate, /turf/open/floor/iron/checker, /area/station/maintenance/port/fore) +"nWj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/iron/dark/smooth_large, +/area/station/science/breakroom) "nWn" = ( /obj/structure/tank_holder/extinguisher, /obj/effect/mapping_helpers/burnt_floor, @@ -49400,14 +49454,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"nWM" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/mining_weather_monitor/directional/north, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/secondary/entry) "nXb" = ( /turf/closed/wall, /area/icemoon/surface/outdoors/nospawn) @@ -49526,6 +49572,12 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"nZw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "nZC" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -49549,14 +49601,14 @@ }, /obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "nZU" = ( /obj/machinery/door/airlock/maintenance{ name = "Firefighting Equipment" }, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49852,10 +49904,6 @@ /obj/structure/railing, /turf/open/openspace, /area/station/service/kitchen/coldroom) -"odN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "odR" = ( /turf/open/floor/iron/white/corner{ dir = 4 @@ -49885,6 +49933,18 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) +"oev" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/textured, +/area/station/medical/chem_storage) "oex" = ( /turf/open/openspace/icemoon/keep_below, /area/station/maintenance/department/medical/morgue) @@ -50012,12 +50072,12 @@ /obj/effect/mapping_helpers/airlock/access/all/command/eva, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ogF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ogL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50039,8 +50099,14 @@ /turf/open/floor/plating, /area/station/maintenance/department/cargo) "ohp" = ( -/turf/open/floor/glass, -/area/station/maintenance/department/medical/central) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/end, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/iron/textured, +/area/station/medical/chem_storage) "oht" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50099,9 +50165,10 @@ /turf/open/floor/iron, /area/mine/laborcamp) "oif" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall, -/area/icemoon/underground/explored) +/obj/effect/gibspawner/human/bodypartless, +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "oih" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -50129,7 +50196,7 @@ /area/station/medical/treatment_center) "oiy" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "oiz" = ( /obj/structure/urinal/directional/north, /turf/open/floor/iron/freezer, @@ -50279,7 +50346,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "okb" = ( /obj/machinery/newscaster/directional/north, /turf/open/floor/iron, @@ -50349,6 +50416,11 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"okM" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "okU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -50386,12 +50458,10 @@ /turf/open/floor/wood, /area/station/maintenance/aft/greater) "olQ" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/machinery/light/dim/directional/north, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "olR" = ( /obj/structure/rack, /obj/item/wrench, @@ -50418,6 +50488,7 @@ /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/red_alert_access, /turf/open/floor/iron/smooth, /area/station/security/processing) "omg" = ( @@ -50442,11 +50513,6 @@ "omk" = ( /turf/open/floor/glass/reinforced, /area/station/security/office) -"omo" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/cryo) "omG" = ( /obj/structure/table, /obj/item/flashlight/lamp, @@ -50470,6 +50536,12 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/vault, /area/station/security/prison/rec) +"omL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/department/cargo) "omP" = ( /obj/machinery/door/airlock{ name = "Cleaning Closet" @@ -50666,7 +50738,7 @@ /area/station/maintenance/starboard/upper) "opt" = ( /obj/structure/closet/athletic_mixed, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, @@ -50750,7 +50822,7 @@ /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "oqc" = ( /obj/effect/turf_decal/trimline/dark_green/arrow_ccw{ dir = 4 @@ -50771,7 +50843,7 @@ }, /obj/effect/turf_decal/tile/dark_green, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "oqC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50853,15 +50925,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/entry) -"orv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "orE" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/cup/beaker/large{ @@ -50875,9 +50938,6 @@ }, /area/station/medical/chem_storage) "orG" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/structure/table, /obj/item/assembly/igniter{ pixel_y = 4; @@ -50891,11 +50951,12 @@ /obj/effect/turf_decal/siding/dark_blue/corner{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) "orK" = ( /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "orS" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 10 @@ -50911,7 +50972,7 @@ "orV" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/stripes/line, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "osd" = ( @@ -50934,7 +50995,7 @@ "osm" = ( /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "osn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -50956,7 +51017,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "osI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, @@ -50979,7 +51040,7 @@ }, /obj/structure/sign/warning/cold_temp/directional/south, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "otf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -51077,6 +51138,7 @@ /obj/effect/turf_decal/box/white{ color = "#52B4E9" }, +/obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/treatment_center) "ouq" = ( @@ -51098,7 +51160,7 @@ /obj/effect/mapping_helpers/airlock/access/all/security/armory, /obj/effect/mapping_helpers/airlock/abandoned, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -51219,12 +51281,6 @@ /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, -/mob/living/basic/lizard/wags_his_tail, -/turf/open/floor/iron, -/area/station/service/janitor) "owC" = ( /turf/closed/wall/r_wall, /area/station/science/server) @@ -51261,7 +51317,7 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -51394,7 +51450,7 @@ /area/icemoon/underground/explored) "oyW" = ( /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "oyX" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ @@ -51417,7 +51473,7 @@ /obj/item/folder/white, /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ozk" = ( /obj/machinery/door/airlock{ name = "Unisex Showers" @@ -51608,7 +51664,7 @@ /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) +/area/station/security/armory) "oBg" = ( /obj/structure/table/wood, /obj/item/book/bible, @@ -51876,8 +51932,8 @@ "oDV" = ( /obj/structure/closet, /obj/item/radio/intercom/directional/east, -/obj/effect/landmark/start/hangover/closet, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, @@ -51902,7 +51958,7 @@ /obj/structure/cable/layer3, /obj/machinery/requests_console/auto_name/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "oEt" = ( /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, @@ -51999,7 +52055,7 @@ /obj/machinery/airalarm/directional/south, /obj/machinery/holopad/secure, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "oFG" = ( /obj/machinery/door/airlock/mining/glass{ name = "Drone Bay" @@ -52367,7 +52423,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "oJT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/window/reinforced/spawner/directional/south, @@ -52508,7 +52564,7 @@ /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "oLK" = ( /obj/machinery/air_sensor/mix_tank, /turf/open/floor/engine/vacuum, @@ -52531,14 +52587,6 @@ }, /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, @@ -52563,7 +52611,7 @@ /obj/effect/turf_decal/delivery/red, /obj/machinery/suit_storage_unit/standard_unit, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "oMT" = ( /turf/open/floor/iron, /area/station/command/heads_quarters/rd) @@ -52674,14 +52722,27 @@ dir = 8 }, /area/station/hallway/secondary/entry) -"oOQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"oOR" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white/side{ + dir = 6 + }, +/area/station/science/research) +"oPb" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron/dark/side, -/area/mine/eva) +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/half/contrasted{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/white/side, +/area/mine/living_quarters) "oPl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52703,6 +52764,12 @@ /obj/item/soap/nanotrasen, /turf/open/floor/iron/dark, /area/station/security/execution/education) +"oPr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/side, +/area/mine/eva) "oPt" = ( /obj/structure/stairs/east, /turf/open/floor/iron/stairs/medium{ @@ -52725,7 +52792,7 @@ /area/station/maintenance/starboard/lesser) "oPI" = ( /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "oPO" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -52783,6 +52850,14 @@ "oQY" = ( /turf/open/floor/iron/white, /area/station/medical/virology) +"oRf" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "oRk" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -52848,7 +52923,7 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "oSa" = ( /obj/machinery/door/airlock/public/glass{ id_tag = "gulag3"; @@ -52923,16 +52998,6 @@ /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"; @@ -53049,6 +53114,10 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/freezer, /area/station/commons/toilet) +"oUY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/entry) "oVt" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -53080,7 +53149,7 @@ dir = 4 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "oVG" = ( /obj/machinery/door/airlock/public/glass{ name = "Art Storage" @@ -53188,7 +53257,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "oXm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/burnt_floor, @@ -53295,14 +53364,9 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "oYD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/machinery/button/door/directional/east{ - id = "xenobio11"; - name = "Xenobio Pen 11 Blast DOors"; - req_access = list("xenobiology") - }, /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/xenobiology) @@ -53315,6 +53379,15 @@ /obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/iron, /area/station/command/teleporter) +"oYZ" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + name = "Office Shutters"; + id = "paramedic_shutters" + }, +/turf/open/floor/plating, +/area/station/medical/paramedic) "oZd" = ( /obj/structure/fence/corner{ dir = 9 @@ -53375,9 +53448,13 @@ }, /area/station/security/prison) "pao" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) +/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_edge{ + dir = 4 + }, +/area/station/medical/chem_storage) "par" = ( /obj/structure/toilet/greyscale, /obj/machinery/airalarm/directional/east, @@ -53438,7 +53515,7 @@ /area/station/engineering/atmos/hfr_room) "pbs" = ( /turf/closed/wall, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "pby" = ( /obj/effect/gibspawner/human, /turf/open/misc/asteroid/snow/icemoon, @@ -53550,14 +53627,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) -"pcB" = ( -/obj/structure/chair/pew{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron/chapel, -/area/station/service/chapel) "pcI" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/light/directional/south, @@ -53650,7 +53719,7 @@ "pdK" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "pdO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/engine, @@ -53825,17 +53894,6 @@ dir = 8 }, /area/station/hallway/secondary/entry) -"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, @@ -53855,7 +53913,7 @@ dir = 8 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "pgN" = ( /obj/item/organ/tail/monkey, /obj/effect/decal/cleanable/blood/splatter, @@ -53891,6 +53949,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/port/aft) +"phn" = ( +/obj/structure/window/spawner/directional/south, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/structure/railing/corner, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "phr" = ( /obj/machinery/door/airlock/hydroponics/glass{ name = "Hydroponics" @@ -53950,6 +54016,13 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"phM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "phS" = ( /obj/structure/table/reinforced, /obj/item/hfr_box/body/fuel_input, @@ -53968,14 +54041,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"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) +/area/station/command/vault) "pii" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -54034,11 +54100,6 @@ dir = 1 }, /area/station/security/brig) -"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) "piT" = ( /obj/machinery/status_display/ai/directional/east, /obj/structure/chair/sofa/left/brown, @@ -54109,6 +54170,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, +/obj/structure/tank_holder/extinguisher, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "pjN" = ( @@ -54149,7 +54211,6 @@ /obj/machinery/iv_drip, /obj/machinery/light/small/directional/west, /obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/status_display/ai/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "pkg" = ( @@ -54185,10 +54246,18 @@ /turf/open/floor/iron/dark, /area/station/medical/virology) "pkN" = ( -/obj/structure/railing, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/effect/landmark/start/chemist, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/textured, +/area/station/medical/chem_storage) "pkP" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/machinery/light/directional/south, @@ -54309,7 +54378,7 @@ /area/station/maintenance/department/medical/morgue) "pnj" = ( /obj/structure/closet/firecloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/stripes/corner, /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, @@ -54372,7 +54441,7 @@ /area/station/science/explab) "pnR" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "pnU" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/plating, @@ -54403,7 +54472,7 @@ }, /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "pou" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, @@ -54470,19 +54539,6 @@ dir = 4 }, /area/station/security/brig/entrance) -"ppo" = ( -/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/cargo/storage) -"ppp" = ( -/obj/structure/railing, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "ppq" = ( /obj/structure/closet/wardrobe/grey{ anchored = 1 @@ -54497,7 +54553,7 @@ /turf/open/floor/iron, /area/station/cargo/drone_bay) "ppz" = ( -/obj/machinery/computer/rdconsole{ +/obj/machinery/computer/rdconsole/unlocked{ dir = 1 }, /turf/open/floor/iron/white/corner{ @@ -54590,15 +54646,6 @@ "prg" = ( /turf/open/floor/wood, /area/station/service/library) -"prh" = ( -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/mail_sorting/service/janitor_closet, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "prs" = ( /obj/docking_port/stationary{ dir = 8; @@ -54754,13 +54801,14 @@ /area/station/maintenance/aft/greater) "ptS" = ( /obj/structure/sign/painting/library{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/wood, /area/station/service/library) "ptY" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "pua" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron, @@ -54843,6 +54891,13 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"puQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/smooth_large, +/area/station/science/breakroom) "puX" = ( /obj/structure/table, /obj/item/stock_parts/scanning_module{ @@ -54942,11 +54997,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"pvB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "pvE" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -55126,7 +55176,7 @@ pixel_y = -13 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "pyn" = ( /obj/item/storage/photo_album/chapel, /obj/structure/noticeboard/directional/west, @@ -55177,7 +55227,7 @@ }, /obj/effect/spawner/random/armory/e_gun, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "pyI" = ( /obj/machinery/door/airlock/engineering{ name = "Port Quarter Solar Access" @@ -55217,7 +55267,7 @@ "pza" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "pzb" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, @@ -55332,14 +55382,6 @@ /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, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/mine/production) "pAX" = ( /obj/structure/chair/plastic{ dir = 8 @@ -55425,7 +55467,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/button/flasher{ id = "visitorflash"; - pixel_y = -26 + pixel_y = -26; + pixel_x = -7 + }, +/obj/machinery/button/door/directional/south{ + pixel_x = 7; + pixel_y = -26; + name = "Visitation Shutters Control"; + id = "visitation"; + req_access = list("brig") }, /turf/open/floor/iron, /area/station/security/prison/visit) @@ -55700,7 +55750,7 @@ /obj/effect/turf_decal/siding/white{ dir = 1 }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) "pGG" = ( @@ -55775,13 +55825,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/mine/living_quarters) -"pHR" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "pHW" = ( /obj/machinery/atmospherics/components/tank, /obj/effect/turf_decal/stripes/line{ @@ -55880,6 +55923,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"pJE" = ( +/obj/structure/cable, +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "pJQ" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/preopen{ @@ -56012,13 +56062,6 @@ dir = 8 }, /area/station/hallway/secondary/entry) -"pLr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/dark/smooth_large, -/area/station/science/breakroom) "pLt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -56179,6 +56222,14 @@ }, /turf/open/floor/iron/large, /area/station/commons/storage/tools) +"pNN" = ( +/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/science/xenobiology) "pNO" = ( /obj/machinery/duct, /obj/structure/disposalpipe/segment, @@ -56195,7 +56246,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/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, @@ -56207,7 +56258,7 @@ "pOo" = ( /obj/machinery/airalarm/directional/north, /obj/structure/closet/secure_closet/personal/cabinet, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/carpet, /area/station/commons/dorms) "pOq" = ( @@ -56251,19 +56302,6 @@ dir = 4 }, /area/station/service/hydroponics) -"pPh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"pPl" = ( -/obj/item/stack/ore/silver, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/cargo/miningdock) "pPy" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 4 @@ -56288,7 +56326,7 @@ "pPK" = ( /obj/structure/stairs/east, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "pPN" = ( /obj/machinery/porta_turret/ai{ dir = 8 @@ -56297,13 +56335,14 @@ dir = 10 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "pPO" = ( /obj/effect/turf_decal/trimline/blue/filled/warning, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, /obj/structure/disposalpipe/segment, +/obj/item/radio/intercom/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) "pPR" = ( @@ -56313,6 +56352,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/iron, /area/station/tcommsat/computer) "pPT" = ( @@ -56463,7 +56503,7 @@ /turf/open/floor/iron/dark/smooth_half{ dir = 1 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "pSy" = ( /obj/machinery/modular_computer/preset/curator{ dir = 8 @@ -56487,6 +56527,10 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron, /area/station/security/prison/garden) +"pSE" = ( +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/security/prison/visit) "pSF" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -56657,7 +56701,7 @@ /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -56670,6 +56714,12 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, /area/station/command/bridge) +"pVr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "pVv" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -56855,10 +56905,6 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/less_spawns) -"pXZ" = ( -/obj/structure/chair/stool/directional/north, -/turf/open/floor/iron, -/area/station/security/prison/visit) "pYa" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -56889,16 +56935,6 @@ dir = 4 }, /area/station/service/chapel) -"pYB" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "pYK" = ( /obj/machinery/door/airlock/external{ glass = 1; @@ -56969,14 +57005,12 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/engineering/storage) -"pZN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 +"pZM" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 1 }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet/royalblue, -/area/station/command/heads_quarters/captain) +/turf/open/floor/iron/smooth_half, +/area/station/security/brig/upper) "pZS" = ( /obj/structure/railing{ dir = 4 @@ -57210,6 +57244,12 @@ "qck" = ( /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"qct" = ( +/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) "qcu" = ( /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, @@ -57282,7 +57322,7 @@ c_tag = "EVA Secure Storage" }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "qdF" = ( /obj/machinery/vending/wardrobe/sec_wardrobe, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57366,6 +57406,15 @@ dir = 4 }, /area/station/hallway/secondary/entry) +"qeK" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "qeL" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -57388,16 +57437,6 @@ }, /turf/open/openspace, /area/station/science/xenobiology) -"qeR" = ( -/obj/structure/chair/pew{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/chapel{ - dir = 8 - }, -/area/station/service/chapel) "qeW" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 @@ -57550,17 +57589,18 @@ }, /mob/living/basic/bot/cleanbot, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "qhi" = ( /obj/machinery/light/small/directional/east, /obj/effect/spawner/random/trash/mopbucket, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"qhL" = ( +"qhy" = ( +/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) +/area/station/science/research) "qhN" = ( /turf/open/floor/iron/white, /area/station/medical/medbay/aft) @@ -57773,12 +57813,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/virology) -"qkH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/station/science/explab) "qkI" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/railing/corner/end{ @@ -57920,13 +57954,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"qmN" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, -/obj/structure/flora/grass/both/style_random, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/less_spawns) "qmU" = ( /obj/machinery/duct, /obj/structure/cable, @@ -57994,7 +58021,7 @@ dir = 8 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "qnV" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/emergency{ @@ -58165,12 +58192,10 @@ /turf/open/floor/wood, /area/station/command/meeting_room) "qpU" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron, /area/station/commons/storage/mining) "qpZ" = ( @@ -58323,13 +58348,6 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/large, /area/station/medical/treatment_center) -"qtd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/railing, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "qtj" = ( /turf/closed/wall, /area/station/engineering/storage) @@ -58353,6 +58371,10 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/security/prison/garden) +"qtx" = ( +/mob/living/basic/sloth/paperwork, +/turf/open/floor/iron, +/area/station/cargo/storage) "qtD" = ( /obj/structure/sign/warning/directional/south, /turf/open/misc/asteroid/snow/icemoon, @@ -58484,6 +58506,11 @@ /obj/structure/closet/secure_closet/atmospherics, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"qvS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/dark, +/area/mine/eva) "qvW" = ( /obj/structure/table, /obj/item/storage/belt/utility, @@ -58539,7 +58566,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "qwo" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty, @@ -58691,13 +58718,6 @@ /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) @@ -58837,6 +58857,19 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"qCb" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/dark/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/mine/living_quarters) "qCl" = ( /obj/effect/spawner/random/trash/mess, /obj/structure/disposalpipe/segment{ @@ -58888,11 +58921,11 @@ dir = 5 }, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "qCU" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "qDm" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -58962,7 +58995,7 @@ "qEa" = ( /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qEj" = ( /obj/structure/table/glass, /obj/item/assembly/igniter, @@ -59078,7 +59111,7 @@ }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron/white, /area/station/science/research) "qFn" = ( @@ -59109,14 +59142,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/explab) -"qFu" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/computer/station_alert/station_only{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) "qFA" = ( /obj/machinery/door/airlock/hatch, /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, @@ -59154,23 +59179,12 @@ /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"qFX" = ( -/obj/machinery/door/airlock{ - name = "Custodial Closet" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/event_spawn, -/obj/effect/landmark/navigate_destination, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/service/janitor, -/turf/open/floor/iron, -/area/station/service/janitor) "qGg" = ( /obj/structure/rack, /obj/item/pickaxe, @@ -59180,12 +59194,6 @@ /obj/item/gps/mining, /turf/open/floor/iron/smooth, /area/mine/eva) -"qGt" = ( -/obj/structure/sign/warning{ - pixel_y = 32 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) "qGC" = ( /obj/machinery/atmospherics/components/unary/thermomachine/heater/on, /obj/machinery/airalarm/directional/east, @@ -59252,19 +59260,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"qHn" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Research Division Break Room"; - network = list("ss13","rd") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/entertainment/arcade{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/science/breakroom) "qHt" = ( /obj/structure/chair{ dir = 1 @@ -59360,7 +59355,7 @@ dir = 1 }, /turf/open/floor/iron/textured_half, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "qIC" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ @@ -59438,21 +59433,6 @@ /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) "qJV" = ( -/obj/structure/sign/directions/security{ - dir = 1; - pixel_x = 32; - pixel_y = 40 - }, -/obj/structure/sign/directions/medical{ - dir = 4; - pixel_x = 32; - pixel_y = 32 - }, -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_x = 32; - pixel_y = 24 - }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -59469,6 +59449,15 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/plating, /area/station/security/prison/safe) +"qKa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "qKn" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -59498,9 +59487,7 @@ /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) "qKs" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/openspace/icemoon/keep_below, /area/icemoon/underground/explored) "qKt" = ( @@ -59650,7 +59637,7 @@ "qMH" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "qML" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/brown, @@ -59708,6 +59695,7 @@ codes_txt = "delivery;dir=4"; location = "Atmospherics" }, +/obj/effect/landmark/firealarm_sanity, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) "qNn" = ( @@ -59811,7 +59799,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "qOD" = ( /obj/effect/turf_decal/caution/stand_clear, /obj/effect/turf_decal/siding/dark_blue, @@ -59823,7 +59811,7 @@ name = "EVA Shutters" }, /turf/open/floor/iron/textured_half, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "qOG" = ( /obj/structure/table/wood, /obj/item/plate, @@ -59835,6 +59823,12 @@ /obj/structure/lattice/catwalk, /turf/open/openspace/icemoon, /area/station/science/server) +"qOM" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/server) "qOP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59942,11 +59936,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) -"qPJ" = ( -/obj/structure/cable, -/mob/living/basic/sloth/paperwork, -/turf/open/floor/iron, -/area/station/cargo/storage) "qPL" = ( /turf/closed/wall/r_wall, /area/station/hallway/secondary/exit/departure_lounge) @@ -60050,16 +60039,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"qRs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/meeting_room) "qRv" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = 10 }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/less_spawns) +/obj/structure/sign/directions/security{ + dir = 1 + }, +/turf/closed/wall, +/area/station/hallway/primary/starboard) "qRE" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -60319,6 +60308,9 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/commons/locker) +"qVj" = ( +/turf/closed/wall, +/area/station/medical/paramedic) "qVk" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/item/kirbyplants/random, @@ -60353,7 +60345,7 @@ }, /obj/item/hand_labeler, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "qVD" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -60416,6 +60408,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/science/breakroom) +"qWv" = ( +/obj/machinery/door/firedoor{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/medical/cryo) "qWy" = ( /obj/machinery/shower/directional/west, /obj/effect/turf_decal/stripes/red/end{ @@ -60494,21 +60500,10 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) -"qXF" = ( -/obj/machinery/computer/station_alert/station_only, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/command/bridge) "qXO" = ( /obj/structure/flora/bush/jungle/c/style_random, /turf/open/floor/grass, /area/station/medical/virology) -"qXU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/station/service/janitor) "qYb" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ @@ -60547,7 +60542,8 @@ pixel_y = -14 }, /obj/structure/noticeboard/cmo{ - pixel_y = 36 + pixel_y = 36; + dir = 1 }, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/central) @@ -60820,6 +60816,13 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"rbB" = ( +/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) "rbC" = ( /turf/closed/wall, /area/station/command/heads_quarters/qm) @@ -60930,12 +60933,9 @@ /turf/open/floor/iron/dark, /area/station/command/heads_quarters/captain) "rdg" = ( -/obj/structure/fence/corner{ - dir = 5 - }, -/obj/structure/sign/warning/secure_area, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/less_spawns) "rdn" = ( /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, @@ -61086,7 +61086,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "rfo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61190,6 +61190,12 @@ }, /turf/open/floor/plating, /area/station/command/heads_quarters/hos) +"rhg" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "rhv" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -61338,6 +61344,11 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"rjV" = ( +/obj/structure/table, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "rkc" = ( /obj/effect/turf_decal/siding/yellow, /obj/effect/turf_decal/siding/yellow{ @@ -61368,9 +61379,7 @@ /obj/machinery/camera/directional/north{ c_tag = "Arrivals Emergency EVA" }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/entry) "rkl" = ( @@ -61463,13 +61472,6 @@ /obj/structure/railing, /turf/open/openspace/icemoon, /area/icemoon/underground/explored) -"rlt" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/railing, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "rlu" = ( /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron/dark, @@ -61500,7 +61502,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "rlV" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -61553,7 +61555,7 @@ name = "Observatory Access" }, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -61592,6 +61594,23 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron/dark/side, /area/mine/eva/lower) +"rnI" = ( +/obj/structure/rack, +/obj/item/reagent_containers/cup/bottle/carbon{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/bottle/ethanol{ + pixel_x = -5; + 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/chem_storage) "rnQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -61711,13 +61730,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/textured, /area/station/engineering/engine_smes) -"rpK" = ( -/obj/structure/chair/pew/left{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "rpM" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, @@ -61959,15 +61971,13 @@ pixel_x = -11; pixel_y = -2 }, -/obj/structure/sign/warning/secure_area{ - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) "rsL" = ( /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "rsM" = ( /obj/structure/bed/maint, /obj/item/toy/plush/rouny{ @@ -62119,6 +62129,15 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"ruK" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue, +/obj/structure/railing/corner/end/flip, +/obj/effect/turf_decal/siding/thinplating/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/commons/locker) "ruO" = ( /obj/machinery/firealarm/directional/west, /obj/structure/disposalpipe/segment{ @@ -62133,11 +62152,16 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"ruP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron/white/textured, +/area/station/security/medical) "ruZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "rvj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/eighties/red, @@ -62286,7 +62310,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ryh" = ( /obj/item/clothing/glasses/meson, /obj/item/storage/bag/ore, @@ -62402,14 +62426,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"rzL" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "rzO" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 10 @@ -62483,7 +62499,7 @@ "rAZ" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "rBo" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer1{ @@ -62537,6 +62553,17 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"rBU" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/janitor) "rBV" = ( /turf/closed/wall, /area/station/tcommsat/computer) @@ -62550,12 +62577,6 @@ "rCf" = ( /turf/open/floor/iron, /area/station/maintenance/starboard/fore) -"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) "rCs" = ( /obj/structure/table, /obj/item/food/deadmouse{ @@ -62875,7 +62896,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "rGl" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/brown{ @@ -62983,11 +63004,6 @@ /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, -/turf/open/floor/iron/white, -/area/station/medical/cryo) "rIz" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/mapping_helpers/burnt_floor, @@ -63094,16 +63110,14 @@ /obj/effect/turf_decal/tile/blue, /mob/living/basic/bot/repairbot, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "rLc" = ( /obj/effect/spawner/random/trash/cigbutt, /obj/effect/spawner/random/trash/cigbutt, /turf/open/floor/plating, /area/station/maintenance/port/aft) "rLl" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central) "rLo" = ( @@ -63121,6 +63135,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/office) +"rLC" = ( +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "rLL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63149,6 +63170,12 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/range) +"rMd" = ( +/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/medical/paramedic) "rMr" = ( /obj/structure/chair{ dir = 8 @@ -63235,9 +63262,7 @@ /area/mine/living_quarters) "rNn" = ( /obj/structure/flora/grass/brown/style_random, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) "rNz" = ( @@ -63355,7 +63380,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "rOF" = ( /obj/structure/rack, /obj/item/storage/toolbox/mechanical, @@ -63461,7 +63486,7 @@ }, /obj/effect/mapping_helpers/requests_console/ore_update, /obj/effect/mapping_helpers/requests_console/supplies, -/obj/machinery/computer/rdconsole{ +/obj/machinery/computer/rdconsole/unlocked{ dir = 4 }, /turf/open/floor/iron/checker, @@ -63501,7 +63526,7 @@ /obj/structure/rack, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "rRk" = ( /obj/structure/table, /obj/item/storage/belt/utility, @@ -63615,7 +63640,7 @@ dir = 5 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "rSP" = ( /obj/structure/closet/secure_closet/engineering_chief, /obj/machinery/power/apc/auto_name/directional/east, @@ -63627,14 +63652,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"rTt" = ( -/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 = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/office) "rTz" = ( /turf/open/floor/plating/icemoon, /area/station/science/ordnance/bomb/planet) @@ -63653,6 +63670,7 @@ /area/station/commons/vacant_room/commissary) "rTV" = ( /obj/structure/gulag_beacon, +/obj/structure/sign/warning/directional/north, /turf/open/floor/iron, /area/mine/laborcamp) "rTX" = ( @@ -63698,7 +63716,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "rUo" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/green{ @@ -63731,17 +63749,16 @@ /turf/open/floor/iron/white, /area/station/medical/chemistry) "rUQ" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/beakers{ - pixel_y = 7 - }, -/obj/item/assembly/igniter{ - pixel_y = -3 +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 }, -/turf/open/floor/iron/dark/textured_edge{ - dir = 4 +/obj/machinery/computer/crew, +/obj/machinery/camera/directional/north{ + c_tag = "Medbay Pharmacy"; + network = list("ss13","medbay") }, -/area/station/medical/chem_storage) +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "rUR" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -63777,19 +63794,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"rVe" = ( -/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/cyclelink_helper_multi{ - cycle_id = "miner-passthrough" - }, -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Dock" - }, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "rVi" = ( /obj/effect/spawner/random/structure/steam_vent, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63804,16 +63808,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"rVA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/airlock/research{ - name = "Ordnance Lab" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/ordnance, -/turf/open/floor/iron/white, -/area/station/science/ordnance/office) "rVB" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -63954,9 +63948,12 @@ /turf/open/floor/iron/smooth, /area/station/security/execution/transfer) "rWW" = ( -/obj/machinery/vending/wardrobe/medi_wardrobe, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/end{ + dir = 4 }, /turf/open/floor/iron/dark, /area/station/medical/storage) @@ -64018,7 +64015,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -64039,19 +64036,12 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) -"rXY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/storage/mining) "rYq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "rYt" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -64117,6 +64107,14 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"rZg" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/duct, +/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) "rZm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64201,7 +64199,8 @@ /obj/machinery/button/flasher{ id = "executionflash"; pixel_x = -24; - pixel_y = 5 + pixel_y = 5; + dir = 8 }, /turf/open/floor/plating/icemoon, /area/station/security/execution/education) @@ -64239,17 +64238,9 @@ /turf/open/floor/iron, /area/station/command/heads_quarters/hop) "sby" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/prison) +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/less_spawns) "sbD" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -64264,13 +64255,6 @@ }, /turf/open/floor/iron/large, /area/station/engineering/storage_shared) -"sbN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron/smooth_half, -/area/station/security/brig/upper) "sbP" = ( /obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, /turf/open/floor/engine/xenobio, @@ -64305,6 +64289,13 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/toilet) +"scj" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/command/gateway) "scl" = ( /obj/structure/bookcase/random, /turf/open/floor/carpet/red, @@ -64332,6 +64323,13 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron, /area/station/service/hydroponics/garden) +"sct" = ( +/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/service/janitor) "scu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -64456,7 +64454,7 @@ /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "sen" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -64491,11 +64489,9 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark/smooth_edge, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "seR" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -64520,23 +64516,16 @@ /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) "sfd" = ( -/obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/fluorine{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/epinephrine{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/iodine{ - pixel_x = 1 - }, -/obj/structure/sign/warning/chem_diamond/directional/west, -/turf/open/floor/iron/dark/textured_edge{ +/obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, -/area/station/medical/chem_storage) +/obj/structure/chair/sofa/right/maroon{ + dir = 4 + }, +/obj/effect/landmark/start/paramedic, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "sfr" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -64794,7 +64783,8 @@ /obj/effect/spawner/random/trash/cigbutt, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/plaques/kiddie/perfect_drone{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /turf/open/floor/iron/checker, /area/station/maintenance/port/fore) @@ -64870,7 +64860,7 @@ "skW" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, @@ -64886,7 +64876,7 @@ /obj/effect/turf_decal/stripes/line, /obj/item/radio/intercom/directional/east, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "skZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -64951,6 +64941,12 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) +"slR" = ( +/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/secondary/entry) "sma" = ( /obj/effect/spawner/random/trash/mopbucket, /obj/effect/decal/cleanable/dirt/dust, @@ -65039,27 +65035,38 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) -"sni" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "snj" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) -"snt" = ( +"snk" = ( +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/cargo) +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 8 + }, +/area/station/command/eva) "snw" = ( /obj/structure/table, /obj/machinery/microwave, @@ -65083,12 +65090,12 @@ /turf/open/floor/iron, /area/station/hallway/primary/starboard) "snJ" = ( -/obj/structure/fence/corner{ +/obj/structure/fence{ dir = 2 }, -/obj/structure/sign/warning/secure_area, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/unexplored/rivers/deep/shoreline) +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "snL" = ( /obj/item/pickaxe{ desc = "Someone left their pickaxe out here, must not have known about the boulder processing machines inside."; @@ -65238,7 +65245,7 @@ /obj/structure/sign/warning/secure_area/directional/north, /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "soR" = ( /obj/machinery/icecream_vat, /obj/structure/sign/clock/directional/north, @@ -65485,7 +65492,7 @@ /turf/open/floor/iron/dark/smooth_half{ dir = 1 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ssH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65662,6 +65669,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"suV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/girder, +/obj/effect/spawner/structure/electrified_grille, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "sve" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/bot, @@ -65786,15 +65800,7 @@ /area/station/maintenance/disposal/incinerator) "swF" = ( /turf/closed/wall, -/area/station/ai_monitored/turret_protected/aisat_interior) -"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) +/area/station/ai/satellite/interior) "swO" = ( /obj/effect/spawner/random/maintenance/four, /obj/structure/closet/crate, @@ -65849,6 +65855,14 @@ /obj/structure/sign/warning/electric_shock/directional/west, /turf/open/floor/plating, /area/station/maintenance/solars/port/fore) +"sxL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron/dark/side, +/area/mine/eva) "sxO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/closet/secure_closet/personal{ @@ -65960,15 +65974,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen) -"syL" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white/corner{ - dir = 8 - }, -/area/station/hallway/secondary/entry) "syN" = ( /obj/item/storage/medkit/regular{ pixel_x = 3; @@ -66112,7 +66117,7 @@ dir = 1 }, /turf/open/floor/iron/dark/smooth_edge, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "sBw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66264,6 +66269,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/cytology) +"sDJ" = ( +/obj/machinery/computer/station_alert, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/computer/security/telescreen/engine/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) "sDQ" = ( /obj/item/radio/intercom/prison/directional/north, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -66284,7 +66295,7 @@ /area/station/maintenance/department/medical/central) "sDV" = ( /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/ai_upload"; + control_area = "/area/station/ai/upload/chamber"; name = "AI Upload Turret Control"; pixel_y = -25 }, @@ -66469,7 +66480,12 @@ /turf/open/floor/iron/dark/smooth_edge{ dir = 1 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) +"sFY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/mining_center, +/turf/open/floor/iron, +/area/station/commons/storage/mining) "sGk" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/structure/sign/poster/random/directional/south, @@ -66585,7 +66601,7 @@ name = "Utilities Room" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) @@ -66861,7 +66877,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "sMy" = ( /obj/structure/flora/tree/pine/style_random, /obj/structure/flora/grass/both/style_random, @@ -66871,7 +66887,7 @@ /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) +/area/station/ai/satellite/hallway) "sMY" = ( /obj/structure/table, /obj/item/radio/off, @@ -66934,10 +66950,8 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "sNA" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, /obj/structure/marker_beacon/burgundy, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/less_spawns) "sNF" = ( @@ -66989,7 +67003,7 @@ /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "sOE" = ( /turf/open/floor/iron, /area/station/command/heads_quarters/ce) @@ -66999,16 +67013,6 @@ /obj/structure/sign/poster/random/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"sOJ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/office) "sOO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -67117,21 +67121,9 @@ dir = 1 }, /area/station/engineering/atmos/hfr_room) -"sQa" = ( -/obj/machinery/door/airlock/mining/glass{ - id_tag = "innercargo"; - name = "Cargo Bay" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, -/turf/open/floor/iron, -/area/station/cargo/storage) "sQc" = ( /obj/structure/table, -/obj/item/food/sandwich/cheese/grilled{ +/obj/item/food/sandwich/grilled_cheese{ name = "idiot sandwich"; pixel_y = 8 }, @@ -67359,7 +67351,7 @@ "sTx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "sTA" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -67551,11 +67543,9 @@ /turf/open/floor/iron/textured_half, /area/mine/production) "sWD" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/structure/marker_beacon/jade, /obj/effect/mapping_helpers/no_atoms_ontop, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) "sWN" = ( @@ -67584,7 +67574,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/structure/disposalpipe/segment{ @@ -67659,19 +67649,15 @@ }, /turf/open/floor/engine/cult, /area/station/service/library) -"sYz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/item/radio/intercom/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/obj/machinery/camera/directional/south{ - c_tag = "Mining B-1 Hallway North"; - network = list("ss13", "mine") +"sYm" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/iron/dark/side, -/area/mine/eva) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "sYA" = ( /obj/structure/fluff/tram_rail{ pixel_y = 17 @@ -67871,7 +67857,7 @@ /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{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -67893,12 +67879,10 @@ pixel_y = 1; pixel_x = 3 }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/effect/turf_decal/siding/dark_blue/corner{ dir = 1 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) "tcD" = ( @@ -68044,7 +68028,7 @@ }, /obj/effect/spawner/random/armory/dragnet, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "teE" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters{ @@ -68061,6 +68045,12 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"teH" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/station/science/explab) "teM" = ( /obj/structure/ore_box, /obj/effect/decal/cleanable/dirt, @@ -68173,7 +68163,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "tgq" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -68310,7 +68300,7 @@ /obj/structure/window/reinforced/fulltile, /obj/structure/transit_tube/horizontal, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tix" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -68379,6 +68369,11 @@ }, /turf/open/floor/iron, /area/station/engineering/storage_shared) +"tjn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/security/prison/work) "tjo" = ( /turf/open/genturf, /area/icemoon/underground/unexplored/rivers) @@ -68543,12 +68538,6 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/engine/o2, /area/station/engineering/atmos) -"tlo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/command/storage/eva) "tlt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68760,12 +68749,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/fore) -"tnY" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) "toi" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/east, /obj/machinery/status_display/evac/directional/south, @@ -68806,6 +68789,10 @@ }, /turf/open/floor/stone, /area/station/service/bar/atrium) +"toU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/security/prison/visit) "toW" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -68853,9 +68840,6 @@ /turf/closed/wall, /area/station/security/execution/education) "tpN" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, /obj/effect/turf_decal/siding/wood{ dir = 8 }, @@ -68866,6 +68850,7 @@ /obj/item/camera{ pixel_x = -4 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/captain) "tpO" = ( @@ -69017,7 +69002,7 @@ /turf/open/floor/iron/dark/smooth_corner{ dir = 4 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "tsH" = ( /obj/machinery/door/airlock/security/glass{ name = "Interrogation" @@ -69067,19 +69052,9 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/station/commons/dorms) -"ttT" = ( -/obj/machinery/door/airlock/mining/glass{ - id_tag = "innercargo"; - name = "Cargo Bay" - }, -/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/general, -/turf/open/floor/iron, -/area/station/cargo/storage) "tuc" = ( /turf/closed/wall, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "tue" = ( /turf/closed/wall, /area/station/security/checkpoint/supply) @@ -69126,23 +69101,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/explab) -"tuz" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/item/trapdoor_remote/preloaded{ - pixel_x = -5; - pixel_y = 2 - }, -/obj/machinery/recharger{ - 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) "tuD" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/white/line{ @@ -69187,6 +69145,20 @@ }, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos) +"tvf" = ( +/obj/machinery/door/airlock/mining/glass{ + id_tag = "innercargo"; + name = "Cargo Bay" + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/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) "tvk" = ( /obj/structure/sign/warning/docking/directional/north, /turf/open/lava/plasma/ice_moon, @@ -69300,7 +69272,7 @@ dir = 9 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "twU" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron/freezer, @@ -69583,8 +69555,10 @@ /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) "tCj" = ( -/obj/structure/sign/warning, -/turf/closed/wall/r_wall, +/obj/structure/marker_beacon/burgundy, +/obj/effect/mapping_helpers/no_atoms_ontop, +/obj/structure/sign/warning/directional/east, +/turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/nospawn) "tCk" = ( /obj/structure/disposalpipe/segment{ @@ -69613,6 +69587,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"tCz" = ( +/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 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/disposal) "tCB" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine/air, @@ -69663,6 +69648,13 @@ }, /turf/open/floor/glass/reinforced/icemoon, /area/icemoon/surface/outdoors/nospawn) +"tDi" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "tDj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69697,7 +69689,7 @@ dir = 8 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "tDN" = ( /obj/structure/chair{ name = "Defense" @@ -69720,13 +69712,6 @@ /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) "tEe" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, @@ -69787,7 +69772,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "tFe" = ( /obj/effect/turf_decal/tile/neutral/diagonal_edge, /obj/effect/landmark/start/cook, @@ -69827,7 +69812,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/any/security/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/machinery/duct, @@ -69879,13 +69864,6 @@ "tGr" = ( /turf/closed/mineral/random/snow, /area/icemoon/surface/outdoors/nospawn) -"tGs" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/security/prison/work) "tGx" = ( /obj/machinery/camera/directional/east{ c_tag = "Departure Lounge East" @@ -69970,17 +69948,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/laborcamp) -"tHa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/wall_healer/directional/east, -/turf/open/floor/iron/white/textured, -/area/station/security/medical) "tHb" = ( /obj/effect/spawner/random/structure/musician/piano/random_piano, /obj/machinery/button/curtain{ id = "cantena_curtains"; - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /turf/open/floor/wood, /area/station/commons/lounge) @@ -70239,7 +70212,7 @@ /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, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/commons/storage/mining) @@ -70417,11 +70390,18 @@ /turf/open/floor/engine, /area/station/engineering/supermatter) "tMa" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 +/obj/structure/sign/directions/engineering{ + pixel_y = 10 }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) +/obj/structure/sign/directions/science{ + dir = 4; + pixel_y = -10 + }, +/obj/structure/sign/directions/medical{ + dir = 4 + }, +/turf/closed/wall, +/area/station/medical/pharmacy) "tMc" = ( /obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/plating/snowed/smoothed/icemoon, @@ -70499,14 +70479,6 @@ /obj/effect/turf_decal/tile/dark/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/virology) -"tNw" = ( -/obj/effect/decal/cleanable/dirt, -/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/medical/morgue) "tNx" = ( /obj/structure/cable, /obj/machinery/light/floor, @@ -70591,12 +70563,6 @@ /obj/item/trash/energybar, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"tPz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/station/science/research) "tPC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70670,11 +70636,26 @@ /obj/effect/turf_decal/box/white, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/storage/tech) +"tQx" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 4 + }, +/area/station/command/eva) "tQM" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "tQS" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/landmark/start/assistant, @@ -70740,6 +70721,21 @@ /obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, /turf/open/floor/plating, /area/station/service/hydroponics) +"tRW" = ( +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron/dark/smooth_corner, +/area/station/command/eva) "tRX" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -70774,10 +70770,6 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"tSx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison/workout) "tSF" = ( /obj/machinery/door/window/left/directional/west{ name = "Deliveries"; @@ -70879,7 +70871,8 @@ /obj/machinery/photobooth/security, /obj/machinery/button/flasher{ id = "transferflash"; - pixel_y = 34 + pixel_y = 34; + dir = 1 }, /turf/open/floor/iron/smooth, /area/station/security/execution/transfer) @@ -70927,13 +70920,13 @@ "tVf" = ( /turf/closed/wall, /area/station/security/prison) -"tVn" = ( -/obj/structure/cable, +"tVk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/server) +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "tVu" = ( /obj/machinery/door/airlock/security/glass{ id_tag = "innerbrig"; @@ -71009,7 +71002,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tWy" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -71021,7 +71014,7 @@ /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tWz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71049,6 +71042,11 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/security/prison/work) +"tWT" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/medical/morgue) "tXb" = ( /obj/structure/table, /obj/effect/spawner/random/maintenance, @@ -71056,7 +71054,6 @@ /area/station/maintenance/port/aft) "tXc" = ( /obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/landmark/start/paramedic, /obj/structure/cable, /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/white, @@ -71167,7 +71164,7 @@ /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, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -71231,6 +71228,11 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) +"tZG" = ( +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "tZM" = ( /obj/effect/spawner/random/trash/bin, /turf/open/floor/plating, @@ -71253,7 +71255,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /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) +/area/station/ai/upload/chamber) "uag" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -71266,15 +71268,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) -"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, @@ -71304,6 +71297,7 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "uau" = ( +/obj/item/radio/intercom/directional/south, /turf/open/openspace, /area/station/medical/medbay/lobby) "uaz" = ( @@ -71349,16 +71343,6 @@ /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 @@ -71378,18 +71362,6 @@ }, /turf/open/floor/iron/stairs/medium, /area/mine/eva/lower) -"ubH" = ( -/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) -"ubY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/stool/directional/south, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/station/science/breakroom) "ucl" = ( /obj/machinery/door/window/right/directional/west{ name = "Containment Pen 4"; @@ -71432,14 +71404,6 @@ /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, /area/station/engineering/supermatter) -"udj" = ( -/obj/effect/turf_decal/stripes/asteroid/line, -/obj/structure/cable, -/obj/effect/turf_decal/tile/dark/half/contrasted, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/mine/living_quarters) "udo" = ( /obj/structure/closet{ name = "evidence closet 4" @@ -71455,7 +71419,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "udA" = ( @@ -71489,13 +71453,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/maintenance/glass, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"uee" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "uei" = ( /obj/machinery/power/solar{ id = "auxsolareast"; @@ -71567,7 +71527,7 @@ /turf/open/floor/iron/dark/smooth_edge{ dir = 8 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ueV" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -71758,7 +71718,7 @@ name = "Chemistry Lab Utilities" }, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, @@ -71837,7 +71797,7 @@ "ujs" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ujB" = ( /obj/structure/chair{ dir = 8 @@ -71868,14 +71828,6 @@ /obj/effect/decal/cleanable/plastic, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"uko" = ( -/obj/structure/chair/pew/left{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "ukz" = ( /obj/machinery/duct, /obj/structure/disposalpipe/segment{ @@ -71919,11 +71871,8 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /turf/open/floor/iron/dark/smooth_edge, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ukN" = ( /obj/structure/table, /obj/machinery/door/poddoor/shutters{ @@ -72122,6 +72071,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/blue, /area/station/security/prison/work) +"unh" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "uno" = ( /obj/structure/closet/secure_closet/freezer/gulag_fridge, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -72156,14 +72112,6 @@ /obj/machinery/gulag_teleporter, /turf/open/floor/iron/showroomfloor, /area/station/security/processing) -"unG" = ( -/obj/machinery/computer/station_alert/station_only{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/computer/security/telescreen/ce/directional/west, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "unH" = ( /obj/structure/table, /obj/item/analyzer{ @@ -72282,6 +72230,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/atmos) +"uoJ" = ( +/obj/machinery/door/firedoor{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark/textured, +/area/station/medical/cryo) "uoV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72473,20 +72436,10 @@ }, /turf/open/floor/glass/reinforced, /area/station/hallway/primary/starboard) -"urx" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "urG" = ( /obj/effect/turf_decal/weather/snow/corner, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) -"urJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "urK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72508,6 +72461,11 @@ /obj/item/hand_labeler, /turf/open/floor/iron, /area/station/service/hydroponics) +"urS" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/circuit, +/area/station/ai/satellite/hallway) "usm" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/plating, @@ -72659,14 +72617,6 @@ "uvt" = ( /turf/closed/wall, /area/station/science/robotics/mechbay) -"uvu" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/sign/warning/secure_area/directional/north, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) "uvv" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/stripes/corner{ @@ -72706,7 +72656,7 @@ /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "uwd" = ( /obj/item/chair/wood, /turf/open/floor/wood, @@ -72750,15 +72700,6 @@ }, /turf/open/floor/iron/dark, /area/mine/mechbay) -"uwO" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Custodial Maintenance" - }, -/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/service/janitor, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) "uwR" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -72822,16 +72763,17 @@ /area/station/science/research) "uxG" = ( /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat/service"; + control_area = "/area/station/ai/satellite/service"; name = "Service Bay Turret Control"; pixel_x = 27; - req_access = list("minisat") + req_access = list("minisat"); + dir = 4 }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "uxK" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/engine/vacuum, @@ -72902,17 +72844,18 @@ start_active = 1 }, /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat/atmos"; + control_area = "/area/station/ai/satellite/atmos"; name = "Atmospherics Turret Control"; pixel_x = -27; - req_access = list("minisat") + req_access = list("minisat"); + dir = 8 }, /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) +/area/station/ai/satellite/interior) "uzd" = ( /obj/structure/rack, /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp{ @@ -72991,8 +72934,8 @@ dir = 8 }, /obj/machinery/plumbing/receiver, -/obj/item/radio/intercom/directional/west, /obj/structure/extinguisher_cabinet/directional/south, +/obj/structure/sign/warning/chem_diamond/directional/west, /turf/open/floor/plating, /area/station/medical/treatment_center) "uzM" = ( @@ -73060,7 +73003,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "uBy" = ( /obj/structure/flora/grass/brown/style_random, /obj/structure/railing{ @@ -73074,6 +73017,11 @@ "uBA" = ( /turf/closed/wall, /area/station/engineering/atmos/project) +"uBJ" = ( +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/hallway/secondary/entry) "uBP" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/plating, @@ -73116,7 +73064,7 @@ /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "uCk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -73149,7 +73097,14 @@ dir = 4 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) +"uCC" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/cafeteria, +/area/station/hallway/secondary/exit/departure_lounge) "uCJ" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -73569,10 +73524,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/chemistry) -"uIM" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) "uIQ" = ( /obj/structure/table, /obj/item/stack/sheet/glass, @@ -73665,6 +73616,11 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored/graveyard) +"uKf" = ( +/obj/structure/chair, +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/iron, +/area/station/cargo/storage) "uKj" = ( /obj/machinery/portable_atmospherics/canister/anesthetic_mix, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -73802,16 +73758,6 @@ 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) @@ -73832,7 +73778,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "uNN" = ( /obj/effect/spawner/random/trash/bin, /obj/effect/spawner/random/maintenance, @@ -73999,7 +73945,7 @@ /turf/open/floor/iron/dark/smooth_edge{ dir = 8 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "uPS" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -74210,7 +74156,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -74232,7 +74178,7 @@ /area/station/hallway/secondary/entry) "uTK" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, @@ -74297,15 +74243,18 @@ }, /obj/effect/mapping_helpers/airalarm/tlv_no_checks, /obj/machinery/airlock_controller/incinerator_ordmix{ - pixel_y = 27 + pixel_y = 27; + dir = 1 }, /obj/machinery/button/ignition/incinerator/ordmix{ pixel_x = -6; - pixel_y = 39 + pixel_y = 39; + dir = 1 }, /obj/machinery/button/door/incinerator_vent_ordmix{ pixel_x = 5; - pixel_y = 39 + pixel_y = 39; + dir = 1 }, /turf/open/floor/iron/dark, /area/station/science/ordnance) @@ -74323,7 +74272,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "uVr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -74519,7 +74468,7 @@ /obj/machinery/recharge_station, /obj/machinery/airalarm/directional/north, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "uZT" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -74535,15 +74484,10 @@ dir = 1 }, /area/station/hallway/secondary/entry) -"vaa" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, +"uZW" = ( /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/office) +/turf/open/floor/iron/white/textured, +/area/station/security/medical) "vad" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -74562,14 +74506,20 @@ /obj/structure/barricade/wooden, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"vaj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/warning/docking/directional/north, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "vap" = ( /obj/structure/fence{ dir = 8 @@ -74616,11 +74566,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen) -"vaM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron/dark/side, -/area/mine/eva) "vaW" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/portable_atmospherics/canister, @@ -74803,12 +74748,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/brig/upper) -"vdi" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/command/meeting_room) "vdr" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -74832,7 +74771,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "vdW" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/decal/cleanable/dirt, @@ -74841,6 +74780,15 @@ }, /turf/open/floor/iron/grimy, /area/station/security/prison/work) +"veh" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "vei" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/stripes/line{ @@ -74882,11 +74830,11 @@ /area/station/commons/storage/primary) "veU" = ( /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/yellow/filled/line{ +/obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 }, -/obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "vfe" = ( @@ -75087,9 +75035,7 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 8 }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/command/bridge) "viH" = ( @@ -75205,12 +75151,6 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron/smooth, /area/station/maintenance/fore/lesser) -"vkD" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "vkF" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -75252,13 +75192,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"vlE" = ( -/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/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/fitness) "vlF" = ( /obj/structure/railing{ dir = 4 @@ -75276,10 +75209,6 @@ /obj/machinery/computer/cargo/request, /turf/open/floor/iron, /area/station/cargo/lobby) -"vlN" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/storage) "vlS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ @@ -75311,12 +75240,6 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"vmn" = ( -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "vmr" = ( /obj/structure/musician/piano, /turf/open/floor/wood, @@ -75355,7 +75278,7 @@ "vmx" = ( /obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -75370,16 +75293,12 @@ /obj/structure/fluff/tram_rail, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"vmC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"vmJ" = ( +/obj/structure/disposalpipe/segment{ 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) +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "vmK" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4 @@ -75452,18 +75371,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) -"vnt" = ( -/obj/machinery/computer/station_alert/station_only{ - dir = 8 - }, -/obj/machinery/button/door/directional/south{ - id = "atmos" - }, -/obj/machinery/light_switch/directional/south{ - pixel_x = -10 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/storage/gas) "vnw" = ( /obj/machinery/camera/directional/south{ c_tag = "Fitness Room South" @@ -75495,16 +75402,13 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white/textured_half, /area/station/service/kitchen) -"vnN" = ( +"vnE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/yellow/filled/line{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/side{ dir = 8 }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/textured, -/area/station/medical/chem_storage) +/area/station/science/explab) "vnW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ @@ -75554,6 +75458,16 @@ "voK" = ( /turf/closed/wall/r_wall, /area/station/tcommsat/computer) +"voL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/mine/laborcamp/security) +"voO" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "voW" = ( /obj/structure/disposalpipe/junction{ dir = 2 @@ -75570,7 +75484,7 @@ dir = 8 }, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "vpc" = ( /obj/structure/closet, /obj/machinery/light/small/directional/south, @@ -75706,7 +75620,7 @@ }, /obj/effect/landmark/firealarm_sanity, /turf/open/openspace, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "vrc" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron, @@ -75899,6 +75813,13 @@ /obj/structure/detectiveboard/directional/west, /turf/open/floor/carpet, /area/station/security/detectives_office) +"vtT" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/cryo) "vuf" = ( /obj/machinery/shower/directional/west, /obj/effect/turf_decal/stripes/red/line{ @@ -75983,7 +75904,7 @@ /turf/open/floor/iron/dark/smooth_edge{ dir = 1 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "vvE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -76140,7 +76061,7 @@ /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -76267,7 +76188,7 @@ /area/station/medical/virology) "vyt" = ( /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "vyw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -76302,16 +76223,6 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/less_spawns) -"vyW" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Medbay Stasis Center North"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "vzb" = ( /obj/structure/rack, /obj/effect/spawner/random/clothing/costume, @@ -76391,7 +76302,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "vzU" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron, @@ -76412,7 +76323,7 @@ /obj/structure/table, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "vAq" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, @@ -76447,7 +76358,7 @@ /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "vAH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -76485,7 +76396,7 @@ dir = 8 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "vAY" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -76615,26 +76526,12 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/less_spawns) -"vDu" = ( -/obj/structure/table/glass, -/obj/item/biopsy_tool{ - pixel_x = -10; - pixel_y = 3 - }, -/obj/structure/microscope{ - pixel_x = -1; - pixel_y = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/window/reinforced/spawner/directional/north, -/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) +/area/station/security/armory) "vDy" = ( /obj/structure/sign/poster/official/safety_report/directional/west, /obj/effect/decal/cleanable/dirt, @@ -76744,7 +76641,7 @@ /obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -76768,7 +76665,7 @@ /obj/structure/transit_tube/station/reverse, /obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "vGy" = ( /obj/machinery/camera/directional/east{ c_tag = "Xenobiology Pens Observation - Starboard Aft"; @@ -76788,7 +76685,7 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/vault, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "vGJ" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -76809,6 +76706,21 @@ /obj/effect/landmark/start/depsec/medical, /turf/open/floor/iron/dark/smooth_large, /area/station/security/checkpoint/medical) +"vHi" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 1 + }, +/area/station/command/eva) "vHm" = ( /obj/structure/rack, /turf/open/floor/plating, @@ -76919,6 +76831,11 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) +"vIl" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "vIm" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -77065,6 +76982,12 @@ }, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/entry) +"vKO" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/office) "vKR" = ( /obj/structure/railing{ dir = 4 @@ -77093,6 +77016,16 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"vLd" = ( +/obj/machinery/computer/security{ + dir = 4 + }, +/obj/machinery/computer/security/telescreen/prison/directional/north, +/turf/open/floor/iron/showroomfloor, +/area/station/security/warden) +"vLe" = ( +/turf/open/floor/circuit, +/area/station/science/robotics/mechbay) "vLj" = ( /obj/machinery/suit_storage_unit/rd, /obj/effect/turf_decal/stripes/line{ @@ -77101,6 +77034,14 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/smooth_half, /area/station/command/heads_quarters/rd) +"vLl" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Public Mining Storage" + }, +/obj/effect/landmark/navigate_destination, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/textured, +/area/station/commons/storage/mining) "vLY" = ( /obj/structure/railing{ dir = 8 @@ -77114,6 +77055,10 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/plating, /area/station/maintenance/department/cargo) +"vMk" = ( +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/medical/cryo) "vMl" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -77131,7 +77076,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "vMY" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -77142,17 +77087,6 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"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/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, @@ -77164,12 +77098,25 @@ dir = 1 }, /obj/effect/turf_decal/trimline/yellow/filled/warning, +/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/treatment_center) "vNI" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/closed/wall/r_wall, /area/station/engineering/atmos/mix) +"vNP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/mining_weather_monitor/directional/north, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "vNU" = ( /obj/structure/table/wood, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -77193,7 +77140,7 @@ }, /obj/effect/turf_decal/tile/green, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "vOG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -77203,6 +77150,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"vOL" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "vPc" = ( /obj/machinery/camera/directional/east{ c_tag = "Security Post - Engineering" @@ -77263,11 +77214,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) -"vPM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron, -/area/station/command/gateway) "vQj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -77289,7 +77235,7 @@ /area/mine/production) "vQz" = ( /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat_interior"; + control_area = "/area/station/ai/satellite/interior"; name = "Antechamber Turret Control"; pixel_y = -24; req_access = list("minisat") @@ -77300,7 +77246,7 @@ network = list("minisat") }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "vQO" = ( /obj/machinery/camera/directional/east{ c_tag = "Locker Room Toilets" @@ -77319,6 +77265,19 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/cargo/lobby) +"vQW" = ( +/turf/open/floor/iron, +/area/mine/eva) +"vQY" = ( +/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) "vRn" = ( /turf/open/floor/iron/stairs/medium, /area/station/cargo/storage) @@ -77556,6 +77515,13 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/sepia, /area/station/security/prison/rec) +"vUy" = ( +/obj/structure/chair/pew/right{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "vUI" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green{ @@ -77563,6 +77529,19 @@ }, /turf/open/floor/iron/grimy, /area/station/hallway/secondary/entry) +"vUS" = ( +/obj/structure/cable, +/obj/structure/chair{ + dir = 1 + }, +/obj/item/storage/fancy/cigarettes, +/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/aft/greater) "vUW" = ( /obj/item/stack/cable_coil{ amount = 7; @@ -77577,6 +77556,12 @@ }, /turf/open/floor/iron, /area/station/science/ordnance) +"vVf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "vVj" = ( /obj/effect/turf_decal/bot_white/left, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -77630,10 +77615,10 @@ /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/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "vWm" = ( @@ -77702,7 +77687,7 @@ name = "Firefighting Equipment" }, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) @@ -77744,12 +77729,6 @@ "vXy" = ( /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"vXC" = ( -/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/mine/living_quarters) "vXH" = ( /obj/structure/cable, /turf/open/floor/iron/white, @@ -77775,6 +77754,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/textured, /area/station/commons/storage/primary) +"vYd" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/command/meeting_room) "vYg" = ( /obj/machinery/camera/directional/west{ c_tag = "Chapel West" @@ -77820,6 +77804,7 @@ "vYw" = ( /obj/machinery/light/small/directional/south, /obj/structure/sign/warning/cold_temp/directional/north, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) "vYz" = ( @@ -77909,12 +77894,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) -"wab" = ( -/obj/structure/cable, -/obj/machinery/holopad, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "wam" = ( /turf/open/openspace, /area/station/cargo/storage) @@ -78101,22 +78080,6 @@ /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 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 1 - }, -/area/station/ai_monitored/command/storage/eva) "wdL" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, @@ -78201,7 +78164,7 @@ "wfc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "wfm" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer1{ dir = 10 @@ -78239,15 +78202,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"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, @@ -78426,7 +78380,7 @@ /obj/item/stack/sheet/iron/fifty, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "whU" = ( /obj/machinery/door/window/left/directional/north{ name = "Pharmacy Desk"; @@ -78542,7 +78496,7 @@ }, /obj/effect/spawner/random/armory/shotgun, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "wkl" = ( /obj/machinery/camera/directional/west{ c_tag = "Telecomms Server Room"; @@ -78558,11 +78512,17 @@ /turf/open/floor/plating, /area/station/engineering/engine_smes) "wkB" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"wkJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/event_spawn, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/storage) "wkO" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -78646,13 +78606,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating/icemoon, /area/icemoon/underground/explored) -"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/commons/locker) "wmG" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -78864,21 +78817,20 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /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) +/obj/effect/turf_decal/tile/blue/full, +/obj/structure/fireaxecabinet/jawsofrecovery/directional/south, +/obj/structure/table/glass, +/obj/item/surgicaldrill, +/obj/item/toy/figure/paramedic, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/paramedic) "wqn" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 8 @@ -79118,6 +79070,13 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) +"wux" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/command/eva) "wuA" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -79138,10 +79097,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/prison) -"wve" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "wvk" = ( /obj/structure/chair/stool/directional/south, /obj/effect/decal/cleanable/blood/oil/slippery, @@ -79160,7 +79115,7 @@ /obj/machinery/door/airlock/research{ name = "Ordnance Launch Room" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, @@ -79172,6 +79127,15 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"wvx" = ( +/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/cable, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "wvz" = ( /obj/structure/table, /obj/item/assembly/timer{ @@ -79363,15 +79327,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"wyo" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Holding Area" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/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 @@ -79558,7 +79513,7 @@ "wAZ" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -79578,7 +79533,7 @@ /obj/item/clothing/gloves/color/grey/protects_cold, /obj/item/clothing/mask/gas, /turf/open/floor/iron/textured, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "wBb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -79637,6 +79592,26 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"wBD" = ( +/obj/structure/table/glass, +/obj/item/biopsy_tool{ + pixel_x = -10; + pixel_y = 3 + }, +/obj/structure/microscope{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron, +/area/station/science/xenobiology) +"wBE" = ( +/obj/effect/spawner/random/trash, +/obj/machinery/light/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/work) "wCo" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 1 @@ -79664,13 +79639,6 @@ /obj/structure/sign/poster/official/wtf_is_co2/directional/north, /turf/open/floor/iron, /area/station/engineering/atmos/storage) -"wCV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/station/science/explab) "wDb" = ( /obj/machinery/requests_console/auto_name/directional/east, /obj/machinery/duct, @@ -79688,7 +79656,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/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -79754,6 +79722,15 @@ /obj/structure/sign/warning/directional/south, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"wEC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "wEG" = ( /obj/structure/extinguisher_cabinet/directional/south{ pixel_x = 4 @@ -79812,7 +79789,7 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, @@ -79887,7 +79864,7 @@ /turf/open/floor/plating, /area/station/science/robotics/lab) "wGG" = ( -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -79947,7 +79924,7 @@ "wHe" = ( /obj/structure/cable, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "wHg" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -79967,13 +79944,15 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) -"wHH" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/red{ - dir = 8 +"wHT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) +/obj/machinery/camera/directional/west{ + c_tag = "Arrivals Hallway North" + }, +/turf/open/floor/iron/large, +/area/station/hallway/secondary/entry) "wHX" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -80042,11 +80021,6 @@ /obj/effect/mapping_helpers/no_atoms_ontop, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"wJG" = ( -/obj/machinery/holopad, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison/visit) "wJM" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance/two, @@ -80234,15 +80208,6 @@ "wMj" = ( /turf/open/floor/plating, /area/station/maintenance/department/chapel) -"wMm" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/white/side{ - dir = 9 - }, -/area/station/science/research) "wMt" = ( /turf/closed/wall, /area/station/hallway/primary/central/fore) @@ -80387,13 +80352,6 @@ /obj/structure/rack, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"wOO" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "wOR" = ( /obj/item/stack/rods/ten, /turf/open/misc/asteroid/snow/icemoon, @@ -80500,6 +80458,15 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/white, /area/station/medical/storage) +"wQd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "wQh" = ( /obj/structure/railing{ dir = 4 @@ -80594,13 +80561,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"wRx" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/office) "wRG" = ( /obj/machinery/computer/operating, /obj/effect/turf_decal/tile/blue/full, @@ -80611,11 +80571,11 @@ "wRI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "wRJ" = ( /obj/machinery/recharge_station, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "wRK" = ( /obj/machinery/conveyor{ dir = 8; @@ -80692,7 +80652,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "wSz" = ( /obj/structure/chair/stool/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -80753,22 +80713,6 @@ "wTg" = ( /turf/closed/wall, /area/station/engineering/main) -"wTw" = ( -/obj/effect/turf_decal/trimline/neutral/warning{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 4 - }, -/area/station/ai_monitored/command/storage/eva) "wTA" = ( /obj/machinery/telecomms/bus/preset_one, /turf/open/floor/iron/dark/telecomms, @@ -80824,8 +80768,8 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/item/kirbyplants/random, /obj/structure/sign/poster/official/random/directional/north, +/obj/item/kirbyplants/random, /turf/open/floor/iron/cafeteria{ dir = 8 }, @@ -80940,16 +80884,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"wUX" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - location = "Bridge" - }, -/obj/structure/plasticflaps/opaque, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/maintenance/central/greater) "wVd" = ( /obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -80988,13 +80922,10 @@ /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, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/white, /area/station/medical/treatment_center) "wVD" = ( /obj/machinery/newscaster/directional/south, @@ -81026,6 +80957,19 @@ /obj/machinery/light/directional/west, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"wWf" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/ordnance/office) "wWo" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -81051,13 +80995,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/storage_shared) -"wWS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "wWU" = ( /obj/structure/cable, /turf/open/floor/iron/showroomfloor, @@ -81096,6 +81033,16 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/science/xenobiology) +"wYb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/mining_weather_monitor/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/secondary/entry) "wYq" = ( /obj/machinery/door/airlock{ name = "Perma Overlook Closet" @@ -81108,6 +81055,11 @@ }, /turf/open/floor/vault, /area/station/security/prison/rec) +"wYt" = ( +/obj/structure/cable, +/obj/effect/landmark/start/prisoner, +/turf/open/floor/iron, +/area/station/security/prison/work) "wYw" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 8 @@ -81184,7 +81136,6 @@ /obj/effect/turf_decal/trimline/blue/filled/end{ dir = 1 }, -/obj/item/radio/intercom/directional/west, /obj/structure/disposalpipe/segment, /obj/structure/window/spawner/directional/north, /turf/open/floor/iron, @@ -81197,6 +81148,18 @@ /obj/structure/cable, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) +"wZT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "miner-passthrough" + }, +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Dock" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "wZV" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/portable_atmospherics/canister/oxygen, @@ -81234,14 +81197,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/range) -"xaf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "xal" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -81323,7 +81278,7 @@ /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "xaI" = ( /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) @@ -81495,7 +81450,7 @@ /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xdb" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -81551,6 +81506,13 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/prison/rec) +"xee" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/storage/mining) "xeg" = ( /obj/effect/turf_decal/weather/snow/corner, /turf/open/misc/asteroid/snow/icemoon, @@ -81654,7 +81616,7 @@ /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, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron/white, /area/station/science/research) "xfg" = ( @@ -81670,7 +81632,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xfn" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -81700,10 +81662,6 @@ dir = 4 }, /area/station/science/explab) -"xft" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) "xfv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/yellow/filled/corner, @@ -81745,7 +81703,7 @@ "xgc" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/security/armory/upper) +/area/station/security/armory/upper) "xgg" = ( /obj/structure/rack, /obj/item/clothing/suit/hooded/wintercoat/eva{ @@ -81760,7 +81718,7 @@ /obj/item/clothing/mask/gas, /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/textured, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "xgi" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -81768,22 +81726,9 @@ /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) "xgm" = ( -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_x = -31; - pixel_y = -32 - }, -/obj/structure/sign/directions/engineering{ - pixel_x = -31; - pixel_y = -40 - }, -/obj/structure/sign/directions/security{ - dir = 4; - pixel_x = -31; - pixel_y = -24 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/nospawn) "xgy" = ( /turf/open/openspace, /area/station/service/hydroponics) @@ -81833,13 +81778,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"xgI" = ( -/obj/item/radio/intercom/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white/side{ - dir = 10 - }, -/area/station/science/research) "xgK" = ( /obj/structure/table, /obj/item/transfer_valve{ @@ -81880,19 +81818,6 @@ }, /turf/open/floor/iron/smooth_large, /area/station/cargo/drone_bay) -"xgX" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/entertainment/deck{ - pixel_x = -2; - pixel_y = 15 - }, -/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) "xhk" = ( /turf/open/floor/iron/dark, /area/station/commons/storage/primary) @@ -81938,15 +81863,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/less_spawns) -"xhD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/statue/goliath{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/mine/living_quarters) "xhK" = ( /turf/closed/wall/r_wall, /area/station/security/prison/safe) @@ -81994,6 +81910,16 @@ /obj/effect/spawner/random/food_or_drink/snack, /turf/open/floor/iron/dark, /area/station/science/breakroom) +"xiF" = ( +/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/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/entry) "xiI" = ( /obj/docking_port/stationary/random/icemoon{ name = "lavaland"; @@ -82019,7 +81945,7 @@ "xiU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "xiW" = ( /turf/open/floor/iron, /area/station/maintenance/port/fore) @@ -82028,16 +81954,14 @@ id_tag = "MedbayFoyer"; name = "Medbay" }, -/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, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/iron/large, /area/station/medical/medbay/lobby) "xjB" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) "xjC" = ( @@ -82098,6 +82022,24 @@ }, /turf/open/floor/iron/smooth, /area/station/commons/storage/mining) +"xkw" = ( +/obj/structure/sign/poster/official/twelve_gauge/directional/north, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/mine/laborcamp/security) +"xkA" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "xkI" = ( /obj/machinery/door/airlock/command{ name = "Conference Room" @@ -82123,7 +82065,7 @@ /obj/machinery/teleport/station, /obj/machinery/light/small/directional/east, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xlh" = ( /obj/machinery/door/window/left/directional/north{ name = "Medbay Delivery"; @@ -82337,12 +82279,6 @@ /obj/structure/sign/warning/gas_mask/directional/north, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"xnM" = ( -/obj/structure/cable, -/turf/open/floor/iron/white/side{ - dir = 9 - }, -/area/station/science/research) "xnS" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/dirt, @@ -82369,7 +82305,7 @@ /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "xpc" = ( /obj/effect/turf_decal/siding/yellow/corner, /obj/machinery/status_display/evac/directional/south, @@ -82383,6 +82319,13 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) +"xpm" = ( +/obj/structure/chair/comfy/beige{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/blue, +/area/station/hallway/secondary/entry) "xpw" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -82433,7 +82376,7 @@ "xpP" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "xpT" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, @@ -82533,10 +82476,6 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"xqY" = ( -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/medical/chemistry) "xrb" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -82706,7 +82645,7 @@ "xuA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "xuB" = ( /obj/effect/turf_decal/stripes/asteroid/line, /obj/effect/turf_decal/tile/dark/half/contrasted, @@ -82892,13 +82831,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"xwp" = ( -/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/cargo/storage) +/area/station/ai/upload/chamber) "xwr" = ( /obj/structure/rack, /obj/item/clothing/suit/hooded/wintercoat/eva{ @@ -82913,7 +82846,7 @@ /obj/item/clothing/mask/gas, /obj/machinery/light/directional/west, /turf/open/floor/iron/textured, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "xws" = ( /obj/structure/table, /obj/machinery/light/small/directional/north, @@ -82927,7 +82860,7 @@ /obj/item/pen, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xwx" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -82995,11 +82928,6 @@ }, /turf/open/floor/iron/white, /area/station/maintenance/starboard/aft) -"xxz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "xxB" = ( /obj/machinery/power/solar{ id = "portsolar"; @@ -83056,6 +82984,11 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/structure/cable, +/obj/machinery/button/door/directional/east{ + id = "xenobio11"; + name = "Xenobio Pen 11 Blast DOors"; + req_access = list("xenobiology") + }, /turf/open/floor/iron, /area/station/science/xenobiology) "xyr" = ( @@ -83073,14 +83006,6 @@ }, /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 @@ -83218,14 +83143,7 @@ dir = 6 }, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) -"xAk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/large, -/area/station/hallway/secondary/entry) +/area/station/ai/upload/chamber) "xAn" = ( /turf/open/floor/iron/dark, /area/station/engineering/lobby) @@ -83239,6 +83157,12 @@ }, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"xAO" = ( +/obj/machinery/shower/directional/east, +/obj/structure/fluff/shower_drain, +/obj/effect/spawner/random/trash/soap, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "xAQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -83350,7 +83274,7 @@ }, /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xCl" = ( /turf/open/floor/iron, /area/station/science/robotics/lab) @@ -83418,6 +83342,18 @@ /obj/item/storage/pill_bottle/mannitol, /turf/open/floor/iron/white, /area/station/medical/cryo) +"xCW" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "xDa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/structure/sign/warning/secure_area/directional/north, @@ -83434,14 +83370,6 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"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) "xDj" = ( /obj/effect/turf_decal/trimline/yellow/end{ dir = 1 @@ -83492,6 +83420,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"xDB" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/structure/tank_holder/extinguisher, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "xDG" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ @@ -83759,6 +83696,22 @@ /obj/machinery/recharge_station, /turf/open/floor/plating, /area/mine/eva/lower) +"xHF" = ( +/obj/structure/table, +/obj/item/trapdoor_remote/preloaded{ + pixel_x = -5; + pixel_y = 2 + }, +/obj/machinery/recharger{ + 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) "xHO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/plastic{ @@ -83779,7 +83732,7 @@ /obj/item/clothing/gloves/color/grey/protects_cold, /obj/item/clothing/mask/gas, /turf/open/floor/iron/textured, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "xIk" = ( /obj/structure/chair/comfy{ dir = 4 @@ -83795,29 +83748,6 @@ /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 - }, -/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/neutral/warning{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 8 - }, -/area/station/ai_monitored/command/storage/eva) "xIF" = ( /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, @@ -83945,7 +83875,8 @@ /area/station/cargo/storage) "xKk" = ( /obj/structure/sign/plaques/kiddie/gameoflife{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) @@ -84013,6 +83944,14 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark/textured_half, /area/station/security/office) +"xLa" = ( +/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 = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "xLq" = ( /turf/open/floor/glass/reinforced, /area/station/science/ordnance/office) @@ -84078,6 +84017,8 @@ /obj/item/mod/module/thermal_regulator, /obj/effect/turf_decal/tile/blue/full, /obj/item/mod/module/signlang_radio, +/obj/item/gun/syringe, +/obj/item/gun/syringe, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/storage) "xMh" = ( @@ -84126,7 +84067,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/dark/smooth_half, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "xNh" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/line{ @@ -84180,6 +84121,11 @@ /obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/station/science/cytology) +"xNY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/prison/workout) "xOb" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -84222,13 +84168,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"xPF" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/structure/sign/nanotrasen, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/surface/outdoors/nospawn) "xPI" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -84359,30 +84298,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) -"xRo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/janitor) -"xRv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"xQX" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Arrivals Hallway South" }, -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only{ - dir = 8 +/turf/open/floor/iron/white/corner{ + dir = 1 }, -/turf/open/floor/iron/white, -/area/station/science/ordnance/office) +/area/station/hallway/secondary/entry) "xRw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -84391,12 +84318,6 @@ }, /turf/open/floor/iron, /area/station/command/bridge) -"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, @@ -84432,7 +84353,7 @@ /area/station/security/brig) "xSv" = ( /obj/structure/closet/firecloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/engineering/lobby) "xSx" = ( @@ -84471,6 +84392,11 @@ /obj/machinery/hydroponics/soil/rich, /turf/open/floor/grass, /area/station/service/hydroponics/garden) +"xTi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/mine/living_quarters) "xTp" = ( /obj/machinery/camera/directional/south{ c_tag = "Solar Maintenance - North East" @@ -84492,6 +84418,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) +"xTL" = ( +/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/structure/cable, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/hallway/secondary/entry) "xTN" = ( /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 4 @@ -84513,6 +84449,15 @@ /obj/structure/sign/poster/contraband/lizard/directional/south, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"xTO" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/dark/textured, +/area/station/medical/cryo) "xTQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -84524,7 +84469,7 @@ /area/station/maintenance/aft/greater) "xTU" = ( /obj/structure/closet/wardrobe/pjs, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/half/contrasted, /obj/machinery/light/directional/south, /turf/open/floor/iron, @@ -84638,6 +84583,11 @@ }, /turf/open/floor/wood, /area/station/maintenance/aft/greater) +"xUX" = ( +/obj/structure/chair, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/cafeteria, +/area/station/hallway/secondary/exit/departure_lounge) "xVc" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -84646,10 +84596,6 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron, /area/station/command/bridge) -"xVf" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/cargo) "xVo" = ( /obj/structure/table, /obj/item/reagent_containers/cup/bowl{ @@ -84776,7 +84722,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "xWO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -84833,6 +84779,13 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"xXH" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/storage/mining) "xXK" = ( /obj/machinery/atmospherics/components/binary/pressure_valve/on{ name = "Waste Release" @@ -84864,6 +84817,12 @@ /obj/structure/flora/bush/leavy/style_random, /turf/open/floor/grass, /area/station/maintenance/starboard/aft) +"xYy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair/stool/directional/south, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/science/breakroom) "xYA" = ( /obj/machinery/holopad, /obj/effect/decal/cleanable/dirt, @@ -84889,9 +84848,6 @@ /obj/machinery/door/firedoor/border_only{ dir = 8 }, -/obj/item/radio/intercom/directional/south{ - pixel_x = -28 - }, /obj/effect/turf_decal/tile/dark/half/contrasted{ dir = 8 }, @@ -84958,7 +84914,7 @@ name = "Dormitories Maintenance" }, /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -85018,7 +84974,7 @@ "yaE" = ( /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "yaF" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -85040,6 +84996,12 @@ "yaL" = ( /turf/closed/wall/r_wall, /area/station/engineering/engine_smes) +"yaN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/newscaster/directional/west, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "yaT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output{ dir = 1 @@ -85088,11 +85050,8 @@ /area/station/maintenance/port/aft) "ybv" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "yby" = ( -/obj/structure/railing{ - dir = 1 - }, /obj/structure/bed/dogbed, /obj/effect/decal/cleanable/insectguts, /turf/open/floor/plating, @@ -85119,6 +85078,16 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"ybF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/cigarette{ + pixel_x = 6; + pixel_y = 12 + }, +/turf/open/floor/iron, +/area/mine/eva) "ybI" = ( /obj/structure/bed/dogbed/ian, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -85147,24 +85116,13 @@ /area/station/maintenance/department/medical/central) "ybQ" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "ybY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/cigbutt, /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"yca" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Mining Station Maintenance" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining_station, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/maintenance/department/cargo) "ych" = ( /obj/item/chair/wood/wings, /obj/effect/turf_decal/bot_red, @@ -85192,7 +85150,7 @@ "ycO" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -85245,15 +85203,9 @@ "ydk" = ( /obj/machinery/computer/security/mining, /obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/command/bridge) -"ydt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/prison/mess) "ydu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/decal/cleanable/dirt, @@ -85338,11 +85290,6 @@ "yfa" = ( /obj/structure/sink/directional/west, /obj/structure/cable, -/obj/machinery/button/door/directional/east{ - id = "xenobio10"; - name = "Xenobio Pen 10 Blast DOors"; - req_access = list("xenobiology") - }, /turf/open/floor/iron/white, /area/station/science/xenobiology) "yfg" = ( @@ -85392,7 +85339,8 @@ name = "Forbidden Knowledge" }, /obj/structure/sign/painting/library_private{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /turf/open/floor/engine/cult, /area/station/service/library) @@ -85479,7 +85427,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "yhU" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/iron, @@ -85526,7 +85474,7 @@ /area/station/medical/chem_storage) "yiL" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "yiR" = ( /obj/structure/sign/warning/cold_temp/directional/west, /turf/open/floor/plating, @@ -85616,7 +85564,7 @@ dir = 1 }, /turf/open/floor/iron/dark/smooth_edge, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ylA" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark/textured, @@ -105620,7 +105568,7 @@ qmt pVg ubG xlA -eVa +gYM gSO uPt qmt @@ -113506,7 +113454,7 @@ nXj xRP nId myQ -sby +fQG fHg aEY oad @@ -114290,7 +114238,7 @@ xUG mpn bfg bfg -ydt +vrG sOT vkJ ots @@ -114547,7 +114495,7 @@ mXK ueP bZK gOS -iJr +fhF vSK kse dbH @@ -115051,7 +114999,7 @@ cfh wBp knq cBG -tSx +loP nAD cYv cmD @@ -115307,7 +115255,7 @@ nks cfh nLW hhr -giN +iZo ajG gSy rLX @@ -115564,7 +115512,7 @@ cPQ cfh wBp gvj -gNH +xNY xtG xtG vyw @@ -116853,7 +116801,7 @@ thA thA uPk gHF -uAE +eki jlX xad scw @@ -119912,10 +119860,10 @@ usx qUw qUw vjh -aCj +xkw cqz tmB -uMM +dlq nTO lRE tmB @@ -120172,7 +120120,7 @@ vjh fEX cqz ccx -wHH +voL fcY pdc lMC @@ -163192,7 +163140,7 @@ iDt bOz gpU oaG -hVq +ivN xuB igm scw @@ -163448,9 +163396,9 @@ scw scw bOz rja -iQx -vXH -udj +oPb +veK +xuB sJH riL riL @@ -163705,11 +163653,11 @@ gjq gjq bOz xar -chQ -veK +mAh +vXH vHS rNc -icu +qCb rOB dKk ksi @@ -163966,7 +163914,7 @@ gps veK tUC fjQ -vXC +xTi xuB jkn jkn @@ -164223,7 +164171,7 @@ gwJ tHQ bwT veK -xhD +eia xuB jKA jkn @@ -165518,8 +165466,8 @@ eJf eJf eJf eJf -oif -ebd +gFX +aZw iDt iDt thA @@ -165996,7 +165944,7 @@ thA thA thA thA -lGf +thA thA thA gjq @@ -169061,9 +169009,9 @@ thA ivF ivF xUF -uah +lLZ icU -jgx +dTh iLh bPs bPs @@ -169316,12 +169264,12 @@ iDt iDt iDt snd -kkA +yaN erw -abQ -cGS +qKa +jhL uhb -aSC +phn cQi boS ivF @@ -169573,11 +169521,11 @@ iDt iDt scw snd -ndl -lFA +hJp +eaO ivF ivF -dER +tCz fFD bYz trc @@ -170124,8 +170072,8 @@ jzy pve xjZ bGP -hqv -sYz +ybF +jld vSi kZu uOf @@ -170357,7 +170305,7 @@ wYz jIr lZe xXd -ltW +wQd nlO wEM nlO @@ -170381,8 +170329,8 @@ ilz pve hEm ksn -bgt -vaM +gXD +oPr tQW uQx uQl @@ -170900,7 +170848,7 @@ nyR pve vSi kZu -pAT +eJO lYd jCV kZu @@ -171157,7 +171105,7 @@ kUD kUD kUD nWH -dQd +aIW nWH nWH nWH @@ -171414,7 +171362,7 @@ kUD kUD kUD nWH -myR +omL cZO vMa nWH @@ -171672,8 +171620,8 @@ itf nWH nWH oha -xVf -snt +xjC +rUz rUz uTr bAX @@ -171930,7 +171878,7 @@ nWH ruD cZO nWH -yca +eEs nWH nWH nWH @@ -172187,7 +172135,7 @@ nWH nWH nWH nWH -eSA +qvS jRd sbU nWH @@ -172358,7 +172306,7 @@ iDt oqL wmP vTq -jsp +jWn wSz nFU jNf @@ -172444,7 +172392,7 @@ wpx gLF gee kVN -naq +gGN mzu gLF gLF @@ -172616,8 +172564,8 @@ oqL iFe iFe cQf -mdo -exN +wYt +wBE jNf qIo tau @@ -172873,7 +172821,7 @@ ktt tmy lvU fAV -tGs +tjn obv jNf tYE @@ -172950,9 +172898,9 @@ cUs ljz tlA kNW -ksn -mGJ -jum +hJA +vQW +dRx kDI mDq lzq @@ -173207,9 +173155,9 @@ rRn clz mml kNW -lxT -bgt -oOQ +nli +iOw +sxL vSi vSi pCM @@ -174917,8 +174865,8 @@ thA thA iDt iDt -kSw -iDt +fIt +nbB iDt iDt oqL @@ -175196,8 +175144,8 @@ eIg rIH ukN nCs -bZk -gRZ +lWb +hmA dAZ vOw eGW @@ -175452,7 +175400,7 @@ vVH ivw nKL hpF -pXZ +uHv bZk gAu sUb @@ -175710,7 +175658,7 @@ vlH lWb eDq tDY -wJG +pSE izY eND qpB @@ -175728,7 +175676,7 @@ qzV gKQ gVS bqF -bbQ +veh otw pvz oKJ @@ -175945,8 +175893,8 @@ thA thA iDt iDt -kSw -iDt +fIt +nbB iDt iDt oqL @@ -175966,8 +175914,8 @@ nXV icQ brJ ukN -pXZ -bZk +uHv +lWb kEn dAZ dKy @@ -175986,7 +175934,7 @@ gKQ awM cBT dyf -iOs +phM gKQ xAY qQN @@ -176224,7 +176172,7 @@ dSJ nKL hpF uHv -nup +toU pCp dAZ eRp @@ -178857,7 +178805,7 @@ iiX jIC twr wzY -jQy +sFY jQy nqx pls @@ -179361,7 +179309,7 @@ gjq jqT scw jqT -gjq +dky gjq gjq gjq @@ -179619,7 +179567,7 @@ jqT kBb jqT jqT -qKs +gjq gjq gjq gjq @@ -180405,7 +180353,7 @@ iDt ppY aQm iDt -tnY +iDt iDt iDt iDt @@ -183198,7 +183146,7 @@ thA thA iDt kLd -qGt +mrk scw bqq uvA @@ -186817,11 +186765,11 @@ iDt ioK jDz bja -czj -jvw -gIJ -kRH -xqY +lst +gjt +tWT +cQy +iQN nzK sLD klo @@ -187074,7 +187022,7 @@ scw btU btU btU -aoP +iPr ako hjM hjM @@ -187331,7 +187279,7 @@ btU btU vfZ btU -mSX +aTA dYr nxM dTm @@ -187588,7 +187536,7 @@ btU gCV gcU svx -tNw +wEC mdy nxM nxM @@ -193477,11 +193425,11 @@ iDt scw iDt iDt -rdg -pJm -nvB -pJm +tfX snJ +nvB +mSQ +yba thA thA thA @@ -194811,19 +194759,19 @@ xti qLY hEW jAF -fma +mGg vdr roA -fma +mGg vdr iDG -fma +mGg maO xhv -fma +mGg maO rJe -fma +mGg ffe nPI ipw @@ -195326,16 +195274,16 @@ bKI cyh wXX bKI -cyh +mGg dQZ bKI -cyh +mGg izA bKI -cyh +mGg lBZ bKI -cyh +mGg odd iER ffe @@ -195854,7 +195802,7 @@ abe lfs pjr nPI -nPI +tRd alM thA thA @@ -196110,8 +196058,8 @@ eea abe abe pjr -iTC -iWM +vaj +oxO alM thA thA @@ -196367,8 +196315,8 @@ abe abe wnB pjr -tRd -iWM +kRp +oxO alM thA thA @@ -196624,8 +196572,8 @@ ffe ffe ffe ffe -tRd -iWM +kRp +oxO alM thA thA @@ -196821,8 +196769,8 @@ qEJ qEJ kyf wBA -oTA -rpK +bWZ +epB oTA epB uFt @@ -196881,8 +196829,8 @@ oxO oxO dcd oxO -tRd -dmU +kRp +rjV alM thA thA @@ -197079,7 +197027,7 @@ mPJ puF exn hDf -qeR +fvJ bAF nJy rkz @@ -197139,7 +197087,7 @@ nPI nPI nPI nPI -geW +gfu alM thA thA @@ -197338,8 +197286,8 @@ oTA sab qYh sab -pcB -qtd +eQt +eee uJt uJt efy @@ -197595,8 +197543,8 @@ oTA oTA syh oTA -lqj -erV +vUy +rLC uJt uJt iJV @@ -197852,8 +197800,8 @@ iLt uJt uJt uJt -sHh uJt +sHh uJt uJt uJt @@ -198366,8 +198314,8 @@ iLt uJt uJt uJt -wvl uJt +wvl uJt uJt uJt @@ -198623,8 +198571,8 @@ oTA oTA epB oTA -uko -mEI +nmw +bMV uJt uJt tWJ @@ -198880,8 +198828,8 @@ oTA bAF irQ bAF -bYm -rlt +nJy +kTy uJt uJt bap @@ -225623,7 +225571,7 @@ uhx uhx uhx uhx -tMa +xgm lSu bln bln @@ -226363,8 +226311,8 @@ utC vJV fUR eYK -xAk -xaf +dxF +lfd fUR uRx jdY @@ -226620,8 +226568,8 @@ utC vJV mVE ryM -uee -dJY +cJu +kMX qlP nDJ sfr @@ -226877,8 +226825,8 @@ utC vJV fUR fUR -kVA -wWS +vNP +vVf mVE nDJ fYW @@ -227391,8 +227339,8 @@ utC vJV ydI ydI -nWM -kHl +wYb +nZw mVE nDJ wOy @@ -227648,8 +227596,8 @@ iOh kDs mVE azN -xft -lRg +iaC +slR iaU nDJ hAG @@ -227905,8 +227853,8 @@ hEI biY biY rkk -bLs -xRI +lbj +voO ydI ior wOy @@ -227936,7 +227884,7 @@ uhx uhx uhx uhx -tMa +xgm lSu lSu lSu @@ -229192,13 +229140,13 @@ lJO fjF qhO lJO -iVv +cZG qpt -fBQ -syL -vmC -syL -dwb +uBJ +oRf +wHT +oRf +jXm fsv cuc hgr @@ -229206,17 +229154,17 @@ fbF hgr xFs fsv -cmV -bXx -aui -bXx -btW -jJd -eyj -lGL -bXx -oMq -tEc +jdY +iGd +pVr +iGd +tZG +mjA +iGd +xQX +iGd +tVk +jdY iGd mKJ vKD @@ -229450,11 +229398,11 @@ hjI xmo vmx eTe -nvI -nvI -oTc -nvI -nvI +wvx +wvx +aLf +wvx +wvx fwM fsv cuc @@ -229464,15 +229412,15 @@ hgr xFs fsv dpU -swK -swK -ubx -swK -swK -swK -wfF -swK -nqD +thX +thX +kSR +thX +thX +thX +xTL +thX +ehB thX peM ddd @@ -229725,7 +229673,7 @@ fUR fUR fUR ort -ort +ksP fUR fUR fUR @@ -229982,7 +229930,7 @@ buF fUR xxI juu -juu +oUY lnp gel fUR @@ -229996,7 +229944,7 @@ tKI bCQ tKI tKI -qRv +sby tkU utC utC @@ -230496,7 +230444,7 @@ qHO fUR nyT kBU -xgX +nVM juu gNL fUR @@ -230749,11 +230697,11 @@ nAH mVE xFs jLM -fnC -vNe -piP -npy -npy +okM +xiF +dkt +xpm +xpm rFb hrh fUR @@ -230803,11 +230751,11 @@ tkU fri utC bvb -tMa +xgm bln bln bvb -qRv +sby fri tkU tkU @@ -231281,7 +231229,7 @@ tKI bCQ tKI tKI -qRv +sby vfr wNO utC @@ -231731,7 +231679,7 @@ utC fri utC bvb -tMa +xgm uei tmR uei @@ -233013,7 +232961,7 @@ txl utC tkU yfW -tMa +xgm cnx tmR tmR @@ -233110,7 +233058,7 @@ vOy utC utC bvb -tMa +xgm tmR tmR tmR @@ -233126,7 +233074,7 @@ tmR tmR bln bvb -qRv +sby utC txl txl @@ -234091,8 +234039,8 @@ qnj hul ykG gwp -hCa -pig +wpC +ffd wpc xBn jjO @@ -234301,7 +234249,7 @@ tkU tkU utC yfW -tMa +xgm uei tmR uei @@ -234348,8 +234296,8 @@ qnj aOx ykG ykG -rCj -xDh +ykG +coZ tOw tOw tOw @@ -234605,8 +234553,8 @@ qnj mxu awx koH -ubH -wml +awx +ruK bvg bJa btG @@ -234863,7 +234811,7 @@ vKq vKq vKq eTC -neq +kEa muy muy gRp @@ -236936,7 +236884,7 @@ ajw mmi wiz mmi -vmn +kXm wam wam wam @@ -236948,7 +236896,7 @@ maT qjQ eGw ewI -pPl +cqY xCL qjQ utC @@ -237187,9 +237135,9 @@ tKI tKI tKI leW -vlN -qPJ -vlN +ajw +qtx +ajw ajw wiz ajw @@ -237205,7 +237153,7 @@ bln qjQ qyT qcE -aFz +kVY hoD qjQ utC @@ -237446,7 +237394,7 @@ ikO bji ajw ajw -vlN +ajw ajw wiz ajw @@ -237701,8 +237649,8 @@ xal wLO lfG oSS -erN -xwp +wkJ +kVD baf wiz tnK @@ -237719,7 +237667,7 @@ uYc pBE pBE ojk -bVJ +jEW dSO qjQ utC @@ -237959,8 +237907,8 @@ lbg ikO ikd jhy -ppo -lxb +ajw +kzh eWV kXr xaF @@ -237976,13 +237924,13 @@ szU eVn pBE ePB -hxE +mUR xtr qjQ utC utC pRj -csE +mzZ kSD csE uwd @@ -238216,8 +238164,8 @@ ndk rbC kXr qDn -ttT -sQa +guM +tvf qDn kXr kXr @@ -238233,7 +238181,7 @@ jFJ lLE pBE qjQ -rVe +wZT qjQ qjQ utC @@ -238473,8 +238421,8 @@ tKI tKI kaw vkF -rTt -sOJ +vKO +gro cnB bvr mAN @@ -238490,7 +238438,7 @@ byn wBy pBE qdC -jBf +xLa dhY qjQ xXk @@ -238730,8 +238678,8 @@ pdf tKI iUM ssc -cXl -wRx +mrW +fqd sdW kXA kXA @@ -238739,7 +238687,7 @@ oDt kRU lMd kXr -hLY +uKf ceo pBE fNc @@ -238747,7 +238695,7 @@ gSf cYK pBE cZa -hxE +mUR xUS unP utC @@ -239004,7 +238952,7 @@ uYc pBE pBE iVA -hxE +mUR aCh unP utC @@ -239259,9 +239207,9 @@ yeh hxE hxE vQj -fvx -hxE -hxE +qct +mUR +mUR xFb unP utC @@ -239735,7 +239683,7 @@ mQh xKb djF xMW -apI +scj tOi kkO fNK @@ -239992,8 +239940,8 @@ vVj dRD jFf uOj -bgF -vPM +mHn +mwP esI cVz ons @@ -240211,8 +240159,8 @@ bln bln bln bln -nMR -mSQ +oif +umh tGr tGr lSu @@ -240250,7 +240198,7 @@ vwQ wMc ygv toW -kyi +bXa aNq jsF ons @@ -240726,8 +240674,8 @@ bln ntK bln bln -xPF -bln +jSf +xgm bln bln lSu @@ -241026,7 +240974,7 @@ biY ede iKj bPp -bXm +jvJ lnc lnc lnc @@ -241240,15 +241188,15 @@ tGr tGr tGr tGr -mSQ -bln +umh +kSw bln bln rwt lBD ntK -bln -tCj +cJi +xAs xAs xAs xAs @@ -241282,7 +241230,7 @@ vBi lJO dnq iuv -xgm +dnq dnq dnq dnq @@ -241813,7 +241761,7 @@ srw jOy ljp gHe -sni +bmv bep qrJ uLC @@ -241884,7 +241832,7 @@ utC tkU utC liV -jHb +xEn vOy utC utC @@ -242019,7 +241967,7 @@ ooL tDg tDg oFI -oEB +tCj sgW akQ lSu @@ -242070,7 +242018,7 @@ dxK gfb gfb gfb -pYB +qeK gfb gfb vtg @@ -242276,7 +242224,7 @@ feJ feJ kyy kyy -cJi +iDq abb oFI oEB @@ -242323,11 +242271,11 @@ xax oyp phf sEl -qRs -jST -wUX -odN -iZq +wzk +nhS +amD +aax +hll dpH gfb mYG @@ -242557,13 +242505,13 @@ skZ bWn nch xMX -xIz +snk bIc bIc bIc -wdI -yaE -yaE +vHi +llm +llm mvw aTH eJe @@ -242580,7 +242528,7 @@ wzk wzk wzk wzk -pgw +vQY iYb iYb msb @@ -242599,7 +242547,7 @@ cRF dnq pRj pRj -dOa +suV pRj pRj pRj @@ -242813,14 +242761,14 @@ krQ gYp bWn iUO -egL +lon ssF pSu fgQ pSu pSu -tlo -kZC +wux +eZF tgn igQ euZ @@ -242837,7 +242785,7 @@ xVq lnk pNs pNs -oyb +ktU mqD iYb dkb @@ -242912,7 +242860,7 @@ utC fri tkU liV -qRv +sby tkU utC utC @@ -243071,11 +243019,11 @@ thI bWn tsz xMX -hSl +tRW ueS ueS ueS -wTw +tQx yaE rAZ qOD @@ -243094,7 +243042,7 @@ fbw hue hBZ eYT -vdi +lLr oMP iYb txI @@ -243103,7 +243051,7 @@ iYb sbi jWP ool -jRC +iTR cgC jaq vvT @@ -243324,7 +243272,7 @@ bZx bZx gYm krQ -dky +gYp bWn ylz xMX @@ -243351,7 +243299,7 @@ cct hue xit wfK -fHK +vYd qpS iYb iYb @@ -243360,8 +243308,8 @@ iYb kFW ybI nnR -tuz -eRZ +xHF +loQ qpZ rAA cpm @@ -243608,7 +243556,7 @@ dhj kiL tOF tOF -ktU +oyb wzk wzk sKz @@ -243617,8 +243565,8 @@ jfc vYm qBt xMQ -jRC -nvs +iTR +kJd hPz shc cpm @@ -243647,7 +243595,7 @@ rHQ wFX rBV kJV -cOa +rBV omG tvW scx @@ -243941,7 +243889,7 @@ gka gka aao liV -qRv +sby utC utC txl @@ -244076,7 +244024,7 @@ feJ uGr uGr iDq -jBr +vLd lAL ejc iDq @@ -244399,9 +244347,9 @@ dnq nlv uMN uMN -msP -hPQ -cEr +cnQ +fly +cFp aQO fFv kta @@ -244656,9 +244604,9 @@ nBl kta aHR cPi -gCl +kth jpH -mkn +xXH qnw sEn kta @@ -244882,7 +244830,7 @@ ljx nxW utR tmQ -qXF +cCq dMX gER nOH @@ -244913,9 +244861,9 @@ dnq kta ihh ryh -rXY +cnQ wzY -mIH +xee bqi aQO kta @@ -244969,7 +244917,7 @@ rQf gka tkU liV -jHb +xEn utC utC txl @@ -245132,7 +245080,7 @@ wEb sIZ pfe pfe -jII +krv mxM qLt uom @@ -245167,12 +245115,12 @@ hcL isx iuv dnq +dKW kta kta -kta -kYS +vLl nlv -kmC +jJa kta kta kta @@ -245196,7 +245144,7 @@ xtQ hIH kCn mNY -hFJ +sDJ tMD ehJ fMt @@ -245423,13 +245371,13 @@ fwf hcL isx nlT -krv +dnq hyc fdy fdy -pPh cLN -xxz +cLN +eny fdy pvg nQW @@ -245622,8 +245570,8 @@ fwh ijU bqG lbk -fqH -sbN +aFy +pZM lbk oAh oAh @@ -246160,7 +246108,7 @@ skl skl skl skl -skl +lDo pDt tsk wLX @@ -246226,7 +246174,7 @@ vkz aom pcg deD -unG +bzT qnC isX eBI @@ -246901,7 +246849,7 @@ xmO ubE bUx iQj -aOS +uZW rud cAC mWM @@ -247158,7 +247106,7 @@ xmO deY bUx kdT -tHa +ruP syN cAC mWM @@ -247479,9 +247427,9 @@ fZg mhQ pzb iuv -prh -qFX -lke +mOF +aBE +sct laM lIQ cvS @@ -247539,7 +247487,7 @@ gka gka aao liV -qRv +sby utC utC txl @@ -247738,10 +247686,10 @@ dnq iuv iFm xVK -xRo -owv -qXU -uwO +rBU +byT +avw +efQ rSx kRP kRP @@ -247976,7 +247924,7 @@ lpM ejT iEV iEV -cPV +ewP hCV jeC jeC @@ -248233,7 +248181,7 @@ lpM djh sgZ sgZ -pZN +fdK kwu uKS uPB @@ -248262,7 +248210,7 @@ kRP fiT kQf hDh -vnt +gTQ keP qTa ctr @@ -248566,7 +248514,7 @@ gMp gMp yhY liV -qmN +nTX utC utC utC @@ -249527,8 +249475,8 @@ hHu tZZ mfW mfW +mfW oyY -aVw gxq aVw vBh @@ -249586,7 +249534,7 @@ tkU utC enX liV -jHb +xEn utC utC tkU @@ -249784,8 +249732,8 @@ iuv iuv iuv iuv -uJN iuv +uJN iuv iuv iuv @@ -250010,7 +249958,7 @@ lvY mmA whk uja -aJi +xAO aJi eCT uja @@ -250030,9 +249978,9 @@ oTu oTu srw kfr -dKW +bep ylU -lDo +dnq dnq iuu dnq @@ -250041,8 +249989,8 @@ dnq apb dnq bep -srw dnq +srw dnq ivo ikC @@ -250108,7 +250056,7 @@ fri utC utC liV -qRv +sby utC utC utC @@ -250286,20 +250234,20 @@ exw hmb hmb exw -tLF +qRv lFb qRE lFb -azw +tMa azw mao azw azw -vTc -vTc -vTc -vTc -vTc +qVj +oYZ +oYZ +oYZ +qVj cvS cvS cvS @@ -250310,7 +250258,7 @@ cvS cvS cvS abU -kRP +cvS uiI qzF gDp @@ -250552,24 +250500,24 @@ jqE kZb cJk azw -xxi +xDB fqW sfd -nCb -kWL +xkA +atr cvS pjF nhw -cvS +uhH aMh kNA mOo jPh ljD azf -kRP -kRP -kRP +cGA +cGA +cvS gDp boQ lgW @@ -250778,8 +250726,8 @@ xqh bdp nmH tiI -hLW -bVI +rZg +ekM uja uja uja @@ -250811,22 +250759,22 @@ blU azw bbO hhT -vnN -pQp +hZk +rMd wpZ cvS ril eHe -uhH -mnC -cvS -caZ -caZ -uIM -cGA +vTc +vTc +vTc +vTc +vTc +vTc +vTc yby vnY -kRP +cvS sqN kRP rKv @@ -251034,10 +250982,10 @@ eFG ffZ vfW vfW -mZK -lvk -gzI -gIN +eBL +vfW +mDS +jQv kKL mBr kKL @@ -251067,23 +251015,23 @@ fTC qEj azw rUQ -orE +tDi aTE hMH -yiK +hXE cvS dDC gXm +vTc +xxi +rnI +jaF +nCb +kWL +vTc +hnd +cQr cvS -cvS -cvS -ohp -ohp -ohp -ohp -gGf -pNq -kRP udL kRP bIa @@ -251293,8 +251241,8 @@ qFE cGB cGB gsI -tLL -vlE +fEi +ehn kKL kKL kKL @@ -251327,20 +251275,20 @@ azw azw azw mGs -vTc +qVj cvS kSn vEN -cvS +vTc ltE pkN +oev +pQp ohp -ohp -ohp -ohp +vTc pNq dXU -kRP +pNq gDp kRP qjb @@ -251393,7 +251341,7 @@ utC utC utC liV -jHb +xEn tkU utC utC @@ -251588,16 +251536,16 @@ pkf kRP kRP rWH -kRP +lcA pao -cGA -ohp -ohp -ohp -ohp +orE +lNO +kcQ +yiK +vTc ghz ktB -kRP +nHY gDp kRP qGC @@ -251845,13 +251793,13 @@ fKi tHr rRA soK -kRP +lcA nMN -kRP -kRP -kwX -lBS -kRP +lcA +lcA +ncf +iMv +lcA kRP kRP kRP @@ -251899,7 +251847,7 @@ nFO utC enX liV -jHb +xEn utC utC utC @@ -252105,10 +252053,10 @@ uNq dTW vND uzJ -kRP +lcA esC eUI -kRP +lcA qyR qyR kRP @@ -252362,10 +252310,10 @@ pQL nCV lGh txo -kRP -kRP -kRP -kRP +lcA +lcA +lcA +lcA wCI qyR kRP @@ -252404,7 +252352,7 @@ tkU utC utC reh -jHb +xEn tkU utC fri @@ -252875,7 +252823,7 @@ sEK eHg ahL wVw -xyy +hyg whU bYK vmZ @@ -252935,7 +252883,7 @@ uAL uAL hHG liV -qRv +sby sMy tkU utC @@ -253129,9 +253077,9 @@ sFG lwQ kmG cyo -lup -lup -aCA +juw +nji +tHv jDn nbC qZv @@ -253388,8 +253336,8 @@ efK juw nji tkf -ikz -vyW +rpM +cWn tHr pBA pBA @@ -253432,7 +253380,7 @@ utC tkU utC reh -jHb +xEn utC tkU utC @@ -253640,14 +253588,14 @@ hgh kBL xPT cxA -bij -vkD +hPx +rhg cey lux -eHZ -lux +unh +ijW fUL -qyO +rbB evp evp owr @@ -253902,7 +253850,7 @@ nMu wDe hxs uEr -nzs +jQf iuD qAf gHq @@ -253974,7 +253922,7 @@ ghY ccw cQL pbs -uvu +iYt bPc ptY ptY @@ -254478,7 +254426,7 @@ tWy dZX swF swF -qFu +lxj gzz uCg mfD @@ -254956,8 +254904,8 @@ npD npD npD npD -gGj -mue +hYH +jzI sGH bPt fij @@ -255010,7 +254958,7 @@ pza sML sML sML -pza +urS iHp lNc euc @@ -255214,7 +255162,7 @@ vng lme tiZ uuI -noR +wDg wDg rqD wDg @@ -255257,7 +255205,7 @@ frq rlS cfe mXi -mzZ +rlS mRI bLz bLz @@ -255267,7 +255215,7 @@ mEg bLz jUW bLz -mGg +bLz mCw ryf ryf @@ -255459,7 +255407,7 @@ rZm sOO lRD gbP -jxv +xdl wPX cvS cvS @@ -256217,8 +256165,8 @@ sZD lnC klc lDM -dVS -bAj +qWv +uoJ lDM klc rWR @@ -256474,8 +256422,8 @@ sZD vgx lDM dxO -omo -jdm +mWW +vtT xWT klc uiF @@ -256659,7 +256607,7 @@ txl txl txl sAd -tMa +xgm uei tmR uei @@ -256728,11 +256676,11 @@ aKa wor qxG vFW -noW -nOh -bNH -bNH -rIc +amS +xTO +oXq +mWW +vMk gpR klc ooy @@ -258821,8 +258769,8 @@ jgL sKf sKf jgL -wRr -wEV +sYm +sKf sZF tkU utC @@ -259078,8 +259026,8 @@ npD npD sZF sZF -pHR -wEV +oLn +sKf vjZ utC utC @@ -259229,7 +259177,7 @@ txl txl utC sAd -tMa +xgm uei tmR uei @@ -259287,9 +259235,9 @@ cYE hZT idi cZU -kBl -kBl -hOY +bGl +bGl +cuu dbx uvt awK @@ -259335,8 +259283,8 @@ ily lqU bln vjZ -pHR -wEV +cbf +sKf vjZ utC tkU @@ -259543,10 +259491,10 @@ hUx rNQ hZT idi -aID +iEt gky vvP -mxD +imo cgZ uvt jeB @@ -259592,8 +259540,8 @@ ily lqU tmR vjZ -pHR -wEV +oLn +sKf vjZ utC utC @@ -259800,9 +259748,9 @@ ebb cYE hZT idi -aID -ddk -ddk +iEt +vLe +vLe dry edq uvt @@ -259849,8 +259797,8 @@ tgx qLY xSE sZF -rzL -gea +jCW +fWF sZF tkU utC @@ -260070,7 +260018,7 @@ mtI uRL xmf owC -tVn +qOM tYe xIF wHc @@ -260106,8 +260054,8 @@ jCE adY tmR sZF -pHR -wEV +oLn +sKf sZF tkU fri @@ -260327,7 +260275,7 @@ mtI nqP vzo rzz -gEn +abC pBV dsl wHc @@ -260363,8 +260311,8 @@ vTJ apT sEB vjZ -laf -wEV +vUS +sKf vjZ tkU utC @@ -260597,31 +260545,31 @@ jbU jbU bkQ drr -qhL -qhL -qhL -qhL +drr +vHq +hvm +hvm tCx -wPd -wPd -wPd -wPd -wPd -fTq -wab -wOO -wPd -wPd -wPd -wPd +chZ +chZ +chZ +chZ +chZ +pNN +pJE +kBy +chZ +chZ +chZ +chZ wPd ega bcE qLY sEB vjZ -dAP -wEV +nNA +sKf vjZ utC utC @@ -260853,32 +260801,32 @@ mde gSN jbU wnX -drr -hvm -pvB -ehd -ehd -ehd -ehd -bbB -bbB -bbB -vDu -lva -lva -iXu -drr -pvB -ehd -orv +pMF +pMF +kvc +aCb +aCb +aCb +aCb +aCb +aCb +aCb +wBD +xJj +xJj +vmJ +pMF +vOL +aCb +kea aCb aCb vfq apT sEB vjZ -pHR -wEV +cbf +sKf vjZ utC fri @@ -261111,8 +261059,8 @@ vpW jbU lec fmU -qhL -wve +pMF +iNL hfc hfc hfc @@ -261134,8 +261082,8 @@ hfc adY eAw sZF -pHR -wEV +oLn +sKf sZF utC tkU @@ -261368,8 +261316,8 @@ qlO jbU hzb hdH -qhL -dkK +pMF +euO vVP vVP vVP @@ -261391,8 +261339,8 @@ vVP qLY xSE sZF -pHR -wEV +cbf +sKf sZF tkU tkU @@ -261625,8 +261573,8 @@ xGK jbU lhu hdH -urJ -ppp +lOp +gkk ily ily ily @@ -261649,7 +261597,7 @@ jBh tmR vjZ wRr -wEV +sKf vjZ utC fri @@ -261882,8 +261830,8 @@ wlW jbU kHN kra -qhL -ppp +pMF +gkk ily ily ily @@ -262139,8 +262087,8 @@ ppz jbU uQR iZQ -llw -aus +niy +xCW lKq lKq lKq @@ -262656,8 +262604,8 @@ eLr hAm via via -tPz -iRN +via +oOR odR leo qFt @@ -262903,24 +262851,24 @@ urK urK urK iRx +hot +hot +qhy +qhy +qhy +qhy pJV pJV -nMA -nMA -nMA -nMA -pJV pJV pJV pJV pJV -aYJ cTR leo wOX efk -jTr -kex +bKz +bKz aIr elk mdE @@ -263159,25 +263107,25 @@ dFj dFj dFj dFj -xnM -xnM -xnM -fLl -wMm -xnM +dFj +dFj +dFj +jwC +bkI +dFj qDQ dFj dFj dFj dFj -xgI -jmh +aGl +mpx avC leo qFt bYu -qkH -wCV +vnE +teH rqa bgx bgx @@ -263433,8 +263381,8 @@ nsZ nsZ hjE xSg -fOl -cyL +lrO +yeC jAI bgx hWI @@ -265470,8 +265418,8 @@ mEJ kCz vJS bUa -ubY -qHn +xYy +dcz nsZ awa awa @@ -265727,7 +265675,7 @@ sca xiC ciS bUa -jPx +puQ jxb dqI oEE @@ -265736,11 +265684,11 @@ mXe bEJ qbb miK -xRv -xRv -xRv -xRv -goy +bxp +hWD +hWD +hWD +wWf hWD oiI nsZ @@ -265983,8 +265931,8 @@ bsN sca gpj oQn -iBl -pLr +nWj +nmX mKO sPq xLq @@ -265997,7 +265945,7 @@ cRq qVZ ybf ybf -vaa +aQS xLq xLq nsZ @@ -266254,7 +266202,7 @@ iHc qVZ nQj auK -vaa +aQS xLq xLq nsZ @@ -266511,7 +266459,7 @@ xTV rGY nzA auK -vaa +aQS xLq xLq nsZ @@ -266768,7 +266716,7 @@ bgx bgx bgx bgx -rVA +ixK bgx bgx bgx @@ -266812,7 +266760,7 @@ tmR cnx bln sFJ -qRv +sby utC txl txl @@ -266984,11 +266932,11 @@ tpd mbn qLF vCD -wyo -myJ -myJ -gEV -gjW +hsG +qRr +qRr +uCC +xUX bAY mhT jdK @@ -267243,11 +267191,11 @@ tPY ljo tpd vXy -vXy -urx -cuP -eFn -ldV +gJa +vIl +iTb +eiR +jDf uFH hpr vXy @@ -268351,7 +268299,7 @@ tmR sUN bln sFJ -qRv +sby utC utC utC @@ -268529,7 +268477,7 @@ tsP jZM vYw dFt -qRv +utC utC utC dFt @@ -268537,7 +268485,7 @@ tsP jZM vYw dFt -qRv +utC utC utC utC @@ -274983,13 +274931,13 @@ utC utC utC utC -utC -aZw +rdg +rkW jxw erR jxw -aZw -utC +rkW +xEn utC txl txl @@ -276525,13 +276473,13 @@ txl txl txl utC -utC -aZw +rdg +rkW jxw lZt jxw -aZw -utC +rkW +xEn utC txl txl diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 6dd768409452..567b6badb806 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -5,6 +5,15 @@ "aag" = ( /turf/closed/wall, /area/station/commons/fitness) +"aah" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/camera/directional/east{ + c_tag = "Science Maintenance Corridor"; + network = list("ss13","rd") + }, +/obj/structure/sign/warning/secure_area/directional/east, +/turf/open/floor/iron/white, +/area/station/science/research) "aal" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -82,7 +91,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "abX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -210,7 +219,7 @@ /area/station/engineering/atmos/pumproom) "aeq" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "aer" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -293,7 +302,7 @@ /obj/effect/turf_decal/bot, /mob/living/simple_animal/bot/secbot/beepsky/armsky, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "agi" = ( /obj/effect/spawner/random/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -450,20 +459,6 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) -"aiy" = ( -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/obj/machinery/computer/records/security{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/supply) "aja" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -583,7 +578,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "akF" = ( /obj/machinery/flasher/directional/north{ id = "AI" @@ -596,7 +591,7 @@ }, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "akZ" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -640,6 +635,8 @@ name = "Quartermaster Junction" }, /obj/effect/mapping_helpers/mail_sorting/supply/qm_office, +/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) "alE" = ( @@ -669,7 +666,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "alX" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -755,7 +752,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "anv" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/east, /obj/machinery/skill_station, @@ -848,12 +845,12 @@ "apJ" = ( /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "apM" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "apO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/blue{ @@ -907,10 +904,27 @@ /area/space/nearstation) "aqu" = ( /obj/structure/closet/wardrobe/green, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/locker) +"aqv" = ( +/obj/item/folder/red, +/obj/item/pen, +/obj/structure/table/glass, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/item/folder/white{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/security/execution/transfer) "aqS" = ( /obj/effect/turf_decal/siding/purple/corner{ dir = 4 @@ -972,7 +986,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "asB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1073,19 +1087,19 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "avb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 }, /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 1 - }, +/obj/structure/cable, /turf/open/floor/iron/white/smooth_half, /area/station/medical/cryo) "avc" = ( @@ -1271,7 +1285,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "azz" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -1518,12 +1532,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/security/prison) -"aCW" = ( +"aCZ" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 4 + }, /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/cryo) "aDa" = ( /turf/open/floor/plating, /area/station/construction/mining/aux_base) @@ -1556,6 +1574,12 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"aDs" = ( +/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/starboard/aft) "aDA" = ( /obj/machinery/light/small/directional/south, /obj/item/folder, @@ -1683,7 +1707,7 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -1764,7 +1788,7 @@ }, /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "aHH" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/effect/turf_decal/siding/purple{ @@ -1801,14 +1825,6 @@ /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, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "aIm" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=7.5-Starboard-Aft-Corner"; @@ -1934,7 +1950,7 @@ /area/station/science/xenobiology) "aJS" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "aJX" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -1993,7 +2009,7 @@ name = "Service Hall" }, /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/duct, @@ -2184,11 +2200,11 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "aOc" = ( /obj/machinery/holopad/secure, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "aOf" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -2216,6 +2232,11 @@ /obj/effect/turf_decal/trimline/brown/warning, /turf/open/floor/iron/white, /area/station/science/lobby) +"aOs" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/sign/nanotrasen/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port) "aOu" = ( /obj/structure/table, /obj/item/paper/fluff/holodeck/disclaimer, @@ -2283,14 +2304,14 @@ "aPv" = ( /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "aPw" = ( /obj/machinery/ai_slipper{ uses = 8 }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "aPx" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/structure/closet_empty/crate, @@ -2330,7 +2351,7 @@ }, /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "aQR" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -2484,7 +2505,7 @@ /area/station/construction/storage_wing) "aTV" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "aUm" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -2502,14 +2523,14 @@ /area/station/medical/medbay/central) "aUx" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "aUK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, /obj/structure/cable, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "aUP" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/junction, /obj/effect/spawner/structure/window/reinforced/plasma, @@ -2533,7 +2554,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "aVn" = ( /obj/structure/showcase/cyborg/old{ pixel_y = 20 @@ -2543,13 +2564,13 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "aVr" = ( /obj/machinery/porta_turret/ai{ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "aVv" = ( /obj/machinery/suit_storage_unit/atmos, /obj/effect/turf_decal/stripes/line{ @@ -2640,13 +2661,13 @@ /area/space/nearstation) "aWN" = ( /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "aWO" = ( /obj/machinery/ai_slipper{ uses = 10 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "aWS" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/engineering_hacking{ @@ -2778,12 +2799,9 @@ name = "AI Core Shutters" }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "aYJ" = ( /obj/machinery/disposal/bin, -/obj/machinery/firealarm/directional/south{ - pixel_x = 26 - }, /obj/structure/disposalpipe/trunk{ dir = 8 }, @@ -2909,14 +2927,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"bax" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/office) "baE" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/two, @@ -2939,7 +2949,8 @@ dir = 4 }, /obj/structure/sign/map/meta/left{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) @@ -2985,10 +2996,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"bcb" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall, -/area/station/science/research) "bcf" = ( /obj/machinery/portable_atmospherics/canister, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -3071,7 +3078,7 @@ /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/broken_floor, @@ -3088,10 +3095,6 @@ /obj/machinery/air_sensor/oxygen_tank, /turf/open/floor/engine/o2, /area/station/engineering/atmos) -"beq" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall/r_wall, -/area/space/nearstation) "beO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/green{ @@ -3124,7 +3127,7 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "beZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3237,10 +3240,10 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ +/obj/machinery/disposal/bin/tagger, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 1 }, -/obj/machinery/disposal/bin/tagger, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "bgV" = ( @@ -3267,13 +3270,13 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bhf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "bhl" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/maintenance/three, @@ -3329,7 +3332,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "biq" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -3345,11 +3348,6 @@ /obj/machinery/component_printer, /turf/open/floor/iron/white, /area/station/science/explab) -"biA" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "biF" = ( /obj/structure/window/spawner/directional/north, /turf/open/floor/iron/dark, @@ -3456,10 +3454,10 @@ /area/station/science/research) "bjP" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "bjQ" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bkl" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -3540,8 +3538,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/machinery/flasher/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "blG" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -3597,25 +3596,25 @@ /turf/open/space/basic, /area/space/nearstation) "bnr" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/chair/sofa/corp/right{ - dir = 1 - }, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/office) +/obj/structure/fireaxecabinet/jawsofrecovery/directional/east, +/obj/structure/table/glass, +/obj/item/surgicaldrill, +/obj/item/toy/figure/paramedic, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/paramedic) "bnx" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "bny" = ( /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat_interior"; + control_area = "/area/station/ai/satellite/interior"; name = "Antechamber Turret Control"; pixel_x = 30; - req_access = list("minisat") + req_access = list("minisat"); + dir = 4 }, /obj/machinery/ai_slipper{ uses = 10 @@ -3624,7 +3623,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "bnA" = ( /obj/structure/plasticflaps, /obj/machinery/conveyor{ @@ -3640,14 +3639,14 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bnD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/blue{ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bnE" = ( /obj/structure/closet/crate/hydroponics, /obj/item/shovel/spade, @@ -3673,7 +3672,7 @@ name = "Private Channel" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "bnM" = ( /obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, @@ -3770,7 +3769,7 @@ /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "bpA" = ( /obj/machinery/rnd/production/circuit_imprinter/department/science, /turf/open/floor/iron/dark, @@ -3892,17 +3891,17 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "bsb" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bsd" = ( /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bse" = ( /obj/effect/turf_decal/siding/purple{ dir = 4 @@ -3958,6 +3957,25 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"bto" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/cell_charger, +/obj/item/stock_parts/power_store/cell/high, +/obj/machinery/firealarm/directional/west, +/obj/machinery/camera/directional/north{ + c_tag = "Science Mechbay"; + network = list("ss13","rd") + }, +/obj/machinery/button/door/directional/north{ + id = "mechbay"; + name = "Mech Bay Shutters Control"; + req_access = list("robotics") + }, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) "btx" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -4195,7 +4213,7 @@ "bwN" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bxf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4359,22 +4377,6 @@ }, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) -"bzV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - id_tag = "innerbrig"; - name = "Brig" - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "brig-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/all/security/entrance, -/turf/open/floor/iron, -/area/station/security/brig) "bAp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4516,6 +4518,7 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "bCO" = ( @@ -4532,7 +4535,7 @@ "bCZ" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "bDm" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/siding{ @@ -4797,6 +4800,18 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"bHU" = ( +/obj/machinery/door/poddoor/preopen{ + id = "Prison Gate"; + name = "Security Blast Door" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/structure/sign/warning/secure_area/directional/east, +/turf/open/floor/iron, +/area/station/security/brig) "bIi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4937,6 +4952,12 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"bKl" = ( +/obj/structure/table/glass, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "bKv" = ( /obj/item/pen, /obj/structure/table/reinforced, @@ -5017,6 +5038,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/green, /area/station/maintenance/port/aft) +"bLq" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/firealarm/directional/west, +/obj/machinery/light/small/directional/north, +/obj/structure/rack, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/iron/white, +/area/station/science/explab) "bLQ" = ( /turf/closed/wall, /area/station/medical/coldroom) @@ -5098,7 +5127,7 @@ /area/station/medical/surgery/theatre) "bMY" = ( /turf/closed/wall, -/area/station/medical/office) +/area/station/medical/paramedic) "bNa" = ( /obj/machinery/shower/directional/west, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -5282,6 +5311,14 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/engine, /area/station/science/explab) +"bRn" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/main) "bRp" = ( /obj/effect/spawner/random/decoration/microwave{ dir = 1; @@ -5406,19 +5443,11 @@ /turf/open/floor/iron, /area/station/commons/lounge) "bTm" = ( -/obj/structure/table/reinforced, -/obj/item/wheelchair{ - pixel_y = -3 - }, -/obj/item/wheelchair, -/obj/item/wheelchair{ - pixel_y = 3 +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 }, -/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) +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "bTq" = ( /obj/machinery/camera/motion/directional/south{ c_tag = "AI Upload Chamber - Port"; @@ -5428,10 +5457,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "bTv" = ( /obj/structure/closet/lasertag/blue, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/dark, @@ -5595,7 +5624,7 @@ }, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "bWV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5669,15 +5698,14 @@ /turf/open/floor/wood, /area/station/service/library) "bXX" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "bYm" = ( @@ -5722,10 +5750,47 @@ /obj/machinery/airalarm/directional/east, /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "bYz" = ( /turf/open/floor/circuit, /area/station/maintenance/port/aft) +"bYQ" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/bot, +/obj/item/bodypart/arm/right/robot{ + pixel_x = 3 + }, +/obj/item/bodypart/arm/left/robot{ + pixel_x = -3 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/firealarm/directional/west, +/obj/item/assembly/flash/handheld{ + pixel_x = 6; + pixel_y = 13 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = 6; + pixel_y = 13 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = 6; + pixel_y = 13 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = 6; + pixel_y = 13 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = 6; + pixel_y = 13 + }, +/obj/machinery/ecto_sniffer{ + pixel_x = -6; + pixel_y = 6 + }, +/turf/open/floor/iron, +/area/station/science/robotics/lab) "bZb" = ( /obj/structure/table, /obj/machinery/button/door{ @@ -5851,6 +5916,15 @@ "cbz" = ( /turf/closed/wall, /area/station/cargo/storage) +"cbV" = ( +/obj/effect/turf_decal/siding/blue/inner_corner{ + dir = 4 + }, +/obj/machinery/suit_storage_unit/medical, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/structure/sign/clock/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/paramedic) "ccc" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -5911,6 +5985,15 @@ "cdX" = ( /turf/closed/wall, /area/station/engineering/storage/tech) +"cej" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/light/floor, +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/white, +/area/station/medical/cryo) "cem" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -6127,6 +6210,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"cjb" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Staff Entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "cji" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -6219,7 +6312,7 @@ }, /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "ckW" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 8 @@ -6363,13 +6456,6 @@ "cnK" = ( /turf/closed/wall, /area/station/engineering/main) -"coc" = ( -/obj/structure/chair, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/station/science/ordnance/bomb) "coe" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -6386,7 +6472,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "com" = ( /obj/structure/cable, /obj/machinery/netpod, @@ -6409,7 +6495,7 @@ /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "cpj" = ( /obj/machinery/button/door/directional/east{ id = "bridge blast"; @@ -6460,6 +6546,7 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, +/obj/machinery/computer/records/medical/laptop, /turf/open/floor/iron/dark, /area/station/medical/break_room) "cpU" = ( @@ -6478,28 +6565,6 @@ }, /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, @@ -6718,23 +6783,6 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/station/maintenance/port/fore) -"cui" = ( -/obj/item/folder/red, -/obj/item/pen, -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/item/folder/white{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/security/execution/transfer) "cuk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -6785,7 +6833,6 @@ /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) @@ -6948,7 +6995,7 @@ /area/station/commons/toilet/restrooms) "cwK" = ( /obj/structure/closet/wardrobe/grey, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, @@ -7052,12 +7099,12 @@ /turf/open/floor/iron, /area/station/security/brig) "cxt" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/item/kirbyplants/random, +/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/structure/cable, /turf/open/floor/iron/white, -/area/station/medical/office) +/area/station/medical/medbay/central) "cxw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/showcase/machinery/cloning_pod{ @@ -7071,11 +7118,6 @@ "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, @@ -7115,11 +7157,6 @@ dir = 4 }, /area/station/science/lobby) -"cyM" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "cyS" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7165,7 +7202,7 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "czG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7201,9 +7238,6 @@ /turf/open/floor/iron/white/smooth_large, /area/station/medical/surgery/aft) "cAf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/spawner/random/structure/crate, /obj/structure/disposalpipe/segment{ dir = 4 @@ -7232,6 +7266,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/closed/wall/r_wall, /area/station/engineering/supermatter) +"cAr" = ( +/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, +/obj/structure/sign/warning/radiation/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) "cAG" = ( /obj/effect/turf_decal/tile/green/opposingcorners{ dir = 1 @@ -7270,18 +7314,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/locker) -"cBH" = ( -/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) "cBV" = ( /obj/machinery/mech_bay_recharge_port{ dir = 8 @@ -7329,7 +7361,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "cCR" = ( /obj/item/radio/intercom/directional/east, /obj/structure/kitchenspike, @@ -7473,11 +7505,7 @@ }, /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) +/area/station/ai/upload/chamber) "cGj" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -7499,6 +7527,7 @@ "cGv" = ( /obj/machinery/light/small/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer4, +/obj/structure/sign/warning/vacuum/external/directional/west, /turf/open/floor/iron, /area/station/cargo/miningoffice) "cGG" = ( @@ -7536,7 +7565,7 @@ "cHf" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, @@ -7961,14 +7990,6 @@ /obj/item/pai_card, /turf/open/floor/iron, /area/station/commons/locker) -"cOP" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "cOQ" = ( /turf/open/floor/iron/white, /area/station/science/research) @@ -8048,7 +8069,7 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "cRq" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -8056,15 +8077,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"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/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "cRU" = ( /obj/structure/bed, /obj/item/bedsheet/captain, @@ -8172,7 +8184,7 @@ /obj/effect/spawner/random/armory/bulletproof_armor, /obj/structure/rack, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "cTC" = ( /obj/structure/chair, /obj/effect/landmark/start/assistant, @@ -8193,6 +8205,15 @@ }, /turf/open/floor/wood, /area/station/security/office) +"cUq" = ( +/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) "cUt" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt/dust, @@ -8222,8 +8243,9 @@ network = list("minisat") }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/warning/vacuum/external/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "cUP" = ( /obj/effect/spawner/random/structure/closet_private, /obj/item/clothing/under/misc/assistantformal, @@ -8384,12 +8406,14 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "cXz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 + dir = 6 }, -/turf/open/floor/iron/white, -/area/station/medical/office) +/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/medical/paramedic) "cXH" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -8500,7 +8524,7 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "cZm" = ( /obj/effect/turf_decal/tile/green/opposingcorners{ dir = 1 @@ -8629,8 +8653,12 @@ /turf/open/floor/plating, /area/station/maintenance/aft/greater) "dca" = ( -/turf/open/floor/iron/white, -/area/station/medical/office) +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/paramedic) "dct" = ( /obj/machinery/computer/atmos_control/mix_tank{ dir = 1 @@ -8670,7 +8698,7 @@ "ddc" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "ddl" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -8742,10 +8770,10 @@ /turf/open/floor/iron/dark, /area/station/command/bridge) "deD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/burnt_floor, /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/starboard/aft) "deG" = ( @@ -8837,7 +8865,7 @@ /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "dfp" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, @@ -9009,7 +9037,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "dhC" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/brown/filled/line, @@ -9105,6 +9133,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"diI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/warning/secure_area/directional/northeast, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "diJ" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted, /obj/machinery/light/floor, @@ -9119,6 +9155,20 @@ /obj/structure/sign/warning/electric_shock/directional/south, /turf/open/space/basic, /area/space/nearstation) +"djk" = ( +/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, +/obj/structure/sign/warning/secure_area/directional/east, +/turf/open/floor/iron, +/area/station/engineering/main) "djn" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -9202,6 +9252,16 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/break_room) +"dlf" = ( +/obj/structure/cable, +/obj/structure/bed/dogbed/mcgriff, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/trimline/dark_red/filled/line{ + dir = 9 + }, +/mob/living/basic/pet/dog/pug/mcgriff, +/turf/open/floor/iron, +/area/station/security/warden) "dlr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, @@ -9329,15 +9389,7 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"doM" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/small/directional/north, -/obj/structure/rack, -/obj/item/storage/toolbox/electrical, -/turf/open/floor/iron/white, -/area/station/science/explab) +/area/station/ai/satellite/exterior) "dpg" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -9433,7 +9485,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/firealarm_sanity, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "dqo" = ( /obj/machinery/conveyor{ dir = 1; @@ -9470,7 +9522,7 @@ /obj/machinery/computer/security/telescreen/minisat/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dqE" = ( /obj/structure/closet/toolcloset, /obj/effect/turf_decal/bot, @@ -9652,6 +9704,14 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"dtE" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "dtY" = ( /obj/machinery/meter/monitored/waste_loop, /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ @@ -9743,7 +9803,6 @@ /turf/open/floor/iron, /area/station/security/checkpoint/customs) "dve" = ( -/obj/structure/cable, /obj/effect/spawner/random/maintenance, /obj/machinery/recharge_station, /turf/open/floor/plating, @@ -10363,7 +10422,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/sign/map/meta/left{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) @@ -10446,9 +10506,11 @@ /turf/open/floor/iron/dark, /area/station/command/bridge) "dKl" = ( -/obj/structure/sign/warning/pods, -/turf/closed/wall/r_wall, -/area/station/maintenance/department/engine) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/warning/pods/directional/east, +/turf/open/floor/iron, +/area/station/security/brig) "dKm" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, @@ -10469,7 +10531,7 @@ }, /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "dKY" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -10547,7 +10609,7 @@ dir = 10 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "dLJ" = ( /obj/machinery/requests_console/directional/south{ department = "Mining"; @@ -10624,7 +10686,6 @@ /turf/open/floor/iron/dark, /area/station/security/prison/safe) "dMN" = ( -/obj/effect/landmark/start/paramedic, /obj/effect/turf_decal/loading_area/white{ color = "#52B4E9"; dir = 4 @@ -10677,13 +10738,9 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/departments/vault/directional/north{ - pixel_x = 32 - }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/firealarm_sanity, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "dOs" = ( /obj/structure/sign/warning/no_smoking, /turf/closed/wall/r_wall, @@ -10707,16 +10764,21 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "dOz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 + dir = 1 }, -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/cable, +/turf/open/floor/iron/white/smooth_half, /area/station/medical/cryo) "dOA" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, @@ -10780,7 +10842,7 @@ "dPV" = ( /obj/machinery/porta_turret/ai, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "dPY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10958,7 +11020,7 @@ /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) +/area/station/security/armory) "dRY" = ( /obj/structure/chair/office, /obj/effect/landmark/start/hangover, @@ -11046,12 +11108,12 @@ /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dTr" = ( /obj/structure/cable, /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "dTv" = ( /obj/structure/closet/secure_closet/personal, /obj/item/clothing/under/misc/assistantformal, @@ -11059,7 +11121,8 @@ /obj/item/clothing/shoes/winterboots, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/sign/map/meta/right{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron/dark, /area/station/commons/locker) @@ -11119,6 +11182,8 @@ /area/station/service/bar) "dVb" = ( /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "dVc" = ( @@ -11213,7 +11278,7 @@ /obj/structure/table/wood/fancy/green, /obj/effect/spawner/random/aimodule/harmless, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "dWg" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -11264,7 +11329,7 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -11301,7 +11366,7 @@ name = "armory safe A" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "dXH" = ( /obj/structure/chair, /obj/effect/landmark/start/assistant, @@ -11337,7 +11402,7 @@ /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) +/area/station/command/eva) "dYg" = ( /obj/machinery/status_display/evac/directional/west, /obj/machinery/camera/directional/west{ @@ -11448,11 +11513,11 @@ /obj/item/radio/intercom/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "eax" = ( -/obj/structure/sign/poster/official/random/directional/south, /obj/machinery/light/small/directional/west, /obj/machinery/duct, +/obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/plating, /area/station/commons/toilet/auxiliary) "eaA" = ( @@ -11495,11 +11560,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"eaQ" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "ebd" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 8 @@ -11642,15 +11702,6 @@ /obj/docking_port/stationary/escape_pod, /turf/open/space/basic, /area/space) -"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; @@ -11725,29 +11776,6 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) -"eey" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/rack, -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/storage/briefcase/secure{ - pixel_x = 2; - pixel_y = -2 - }, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) -"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, @@ -11918,12 +11946,14 @@ /turf/open/floor/plating, /area/station/security/execution/education) "ehE" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 }, /obj/machinery/photocopier/prebuilt, +/obj/machinery/camera/directional/north, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, -/area/station/medical/office) +/area/station/medical/medbay/central) "ehG" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/effect/decal/cleanable/blood/old, @@ -12211,13 +12241,13 @@ /turf/open/floor/iron, /area/station/hallway/primary/fore) "elm" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /obj/structure/sign/warning/electric_shock, /obj/machinery/door/poddoor/preopen{ id = "xenobio8"; name = "Xenobio Pen 8 Blast Door" }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/station/science/xenobiology) "eln" = ( @@ -12601,7 +12631,7 @@ /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "erS" = ( /obj/structure/table/wood, /obj/item/camera_film{ @@ -12615,7 +12645,6 @@ /turf/open/floor/wood, /area/station/service/library) "erU" = ( -/obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 8 }, @@ -12623,6 +12652,7 @@ dir = 1 }, /obj/effect/landmark/start/assistant, +/obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/cargo/lobby) "esd" = ( @@ -12771,7 +12801,7 @@ /obj/machinery/light_switch/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "euo" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -12801,25 +12831,6 @@ "eut" = ( /turf/closed/wall, /area/station/science/robotics/lab) -"euw" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/item/stock_parts/power_store/cell/high, -/obj/machinery/firealarm/directional/west, -/obj/machinery/camera/directional/north{ - c_tag = "Science Mechbay"; - network = list("ss13","rd") - }, -/obj/machinery/button/door/directional/north{ - id = "mechbay"; - name = "Mech Bay Shutters Control"; - req_access = list("robotics") - }, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) "euQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12831,16 +12842,19 @@ /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) +/obj/structure/secure_safe/hos, +/turf/closed/wall/r_wall, +/area/station/command/heads_quarters/hos) "euX" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/security/medical) +"eve" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) "evf" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -12881,12 +12895,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) -"evI" = ( -/obj/machinery/computer/teleporter, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) "evY" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -12950,7 +12958,7 @@ "ewC" = ( /obj/machinery/camera{ c_tag = "Warden's Office"; - dir = 10 + dir = 8 }, /obj/structure/table, /obj/machinery/button/door{ @@ -13091,7 +13099,7 @@ name = "Research Division Access" }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "sci-entrance" }, @@ -13114,7 +13122,7 @@ /area/station/service/bar) "eAq" = ( /obj/structure/closet/wardrobe/white, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark, @@ -13153,18 +13161,15 @@ /obj/item/flashlight/lamp, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) -"eBU" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +"eBW" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 }, -/obj/effect/turf_decal/stripes/line, /obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/ordnance/storage) +/turf/open/floor/iron/dark, +/area/station/ai/satellite/chamber) "eBY" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/neutral{ @@ -13324,7 +13329,7 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/command/maintenance, @@ -13378,7 +13383,7 @@ }, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "eGd" = ( /obj/machinery/door/window/left/directional/north{ name = "MiniSat Walkway Access" @@ -13388,7 +13393,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "eGg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line{ @@ -13586,7 +13591,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -13688,7 +13693,7 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "eLv" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -13839,7 +13844,7 @@ "eNh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "eNk" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance" @@ -13855,7 +13860,7 @@ /area/station/medical/morgue) "eNR" = ( /turf/closed/wall, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "eNV" = ( /obj/effect/turf_decal/delivery, /obj/effect/spawner/random/structure/crate, @@ -13972,9 +13977,6 @@ id_tag = "MedbayFoyer"; name = "Medbay" }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -13982,6 +13984,9 @@ }, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "eQe" = ( @@ -13996,7 +14001,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "eQr" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -14044,11 +14049,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/engineering/break_room) -"eRc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/white, -/area/station/medical/cryo) "eRd" = ( /obj/machinery/light/directional/north, /obj/structure/disposalpipe/trunk, @@ -14076,11 +14076,6 @@ /obj/item/multitool, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"eRX" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/cable, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/office) "eSa" = ( /obj/item/wrench, /obj/structure/cable, @@ -14104,7 +14099,7 @@ /turf/open/floor/engine, /area/station/science/xenobiology) "eSy" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 4 }, /obj/structure/cable, @@ -14265,14 +14260,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"eVX" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) "eWn" = ( /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, @@ -14344,8 +14331,22 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"eXh" = ( +/obj/structure/rack, +/obj/machinery/firealarm/directional/west, +/obj/item/clothing/gloves/color/fyellow, +/obj/item/clothing/suit/hazardvest, +/obj/item/multitool, +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/storage/tools) "eXj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14669,23 +14670,6 @@ "fcq" = ( /turf/closed/wall, /area/station/maintenance/port/greater) -"fcA" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/structure/sign/warning/secure_area/directional/west{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "fcJ" = ( /obj/structure/lattice, /obj/item/shard, @@ -14719,7 +14703,7 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer5, /turf/open/floor/plating, @@ -14737,7 +14721,7 @@ name = "Security Requests Console" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "fdX" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -14881,10 +14865,6 @@ /obj/effect/turf_decal/delivery, /obj/structure/cable, /obj/effect/landmark/start/hangover, -/obj/machinery/flasher/directional/east{ - id = "hopflash"; - pixel_y = -26 - }, /turf/open/floor/iron, /area/station/hallway/secondary/command) "fgY" = ( @@ -15012,6 +14992,14 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) +"fiu" = ( +/obj/structure/chair, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/sign/warning/directional/northwest, +/turf/open/floor/plating/airless, +/area/station/science/ordnance/bomb) "fix" = ( /obj/structure/chair{ dir = 1 @@ -15427,7 +15415,7 @@ }, /obj/effect/spawner/random/armory/e_gun, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "fnT" = ( /obj/structure/table, /obj/item/crowbar/red, @@ -15486,7 +15474,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "fpi" = ( /obj/machinery/door/window/right/directional/south{ name = "First Aid Supplies"; @@ -15627,7 +15615,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "frw" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -15723,10 +15711,6 @@ /obj/machinery/vending/autodrobe, /turf/open/floor/plating, /area/station/maintenance/port) -"ftM" = ( -/obj/structure/sign/warning/pods, -/turf/closed/wall, -/area/station/commons/locker) "fuc" = ( /obj/structure/frame/machine{ anchored = 1 @@ -15869,6 +15853,12 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) +"fyA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/port) "fyJ" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -15919,7 +15909,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "fzl" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, @@ -16018,7 +16008,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/window/spawner/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "fBz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16057,6 +16047,13 @@ /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central) +"fDb" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "fDc" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -16080,9 +16077,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/east{ - pixel_y = -26 - }, /turf/open/floor/iron, /area/station/security/brig) "fDC" = ( @@ -16114,7 +16108,7 @@ }, /obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/structure/cable, @@ -16148,7 +16142,7 @@ "fEO" = ( /obj/structure/cable, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "fEW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16177,12 +16171,18 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "fFi" = ( -/obj/machinery/computer/crew{ +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/iron/dark/smooth_edge{ dir = 4 }, -/obj/effect/turf_decal/siding/white, -/turf/open/floor/iron/dark, -/area/station/medical/office) +/area/station/medical/paramedic) "fFo" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -16202,7 +16202,7 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port) @@ -16227,6 +16227,11 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) +"fFV" = ( +/obj/effect/turf_decal/siding/blue/inner_corner, +/obj/structure/closet/secure_closet/paramedic, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/paramedic) "fGp" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -16413,7 +16418,7 @@ }, /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "fJy" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/engine) @@ -16595,17 +16600,6 @@ /obj/effect/landmark/start/depsec/supply, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) -"fMN" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "fMT" = ( /obj/structure/table, /obj/item/radio/intercom/directional/south, @@ -16616,7 +16610,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "fNa" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -16629,17 +16623,6 @@ /obj/item/clothing/mask/whistle, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"fNh" = ( -/obj/machinery/door/poddoor/preopen{ - id = "Prison Gate"; - name = "Security Blast Door" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, -/turf/open/floor/iron, -/area/station/security/brig) "fNz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate, @@ -16715,7 +16698,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ @@ -16797,6 +16780,12 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) +"fRt" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance/three, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/port) "fRu" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -16937,11 +16926,12 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "fVt" = ( -/obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "fVA" = ( @@ -17104,17 +17094,17 @@ /turf/open/floor/iron, /area/station/security/office) "fYc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/airlock/maintenance{ - name = "Medical Freezer Maintenance" - }, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) +/turf/open/floor/iron/white, +/area/station/medical/cryo) "fYg" = ( /obj/machinery/computer/mechpad{ dir = 8 @@ -17218,7 +17208,7 @@ }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/library, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -17260,6 +17250,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"gaO" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "gaU" = ( /obj/machinery/button/door/directional/west{ id = "hop"; @@ -17353,7 +17351,7 @@ cycle_id = "sci-maint-passthrough" }, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/science/research) "gcA" = ( @@ -17396,26 +17394,14 @@ /turf/open/floor/grass, /area/station/science/research) "gda" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, -/turf/open/space/basic, -/area/space/nearstation) +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/effect/landmark/firealarm_sanity, +/turf/open/floor/plating, +/area/station/command/vault) "gdb" = ( /turf/closed/wall/r_wall, /area/station/security/range) -"gdp" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/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, @@ -17457,7 +17443,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "geA" = ( /obj/item/folder/white{ pixel_x = 4; @@ -17514,7 +17500,7 @@ /area/station/command/heads_quarters/hos) "gfU" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "gfZ" = ( /obj/effect/turf_decal/trimline/purple/corner{ dir = 8 @@ -17536,14 +17522,6 @@ "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) "ggH" = ( /obj/effect/spawner/random/structure/chair_maintenance, /turf/open/floor/iron/checker, @@ -17584,11 +17562,11 @@ /turf/open/floor/plating, /area/station/maintenance/disposal) "ghc" = ( -/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/cable, /turf/open/floor/iron/white, -/area/station/medical/office) +/area/station/medical/medbay/central) "ghk" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -17786,7 +17764,7 @@ "glV" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer5, /turf/open/floor/plating, @@ -17811,7 +17789,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -17828,10 +17806,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"gmH" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall, -/area/station/command/bridge) "gmI" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/structure/disposalpipe/segment{ @@ -17993,7 +17967,7 @@ }, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "goF" = ( /obj/machinery/atmospherics/pipe/layer_manifold/cyan/hidden{ dir = 8 @@ -18088,7 +18062,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "gqI" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -18142,25 +18116,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/central) -"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 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating/airless, -/area/station/science/ordnance/bomb) "grZ" = ( /obj/structure/chair, /obj/machinery/camera/directional/north{ @@ -18241,19 +18196,20 @@ /turf/open/floor/iron/white, /area/station/medical/pharmacy) "gtd" = ( -/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/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" }, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ dir = 1 }, -/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, /turf/open/floor/iron/white/smooth_half, /area/station/medical/cryo) "gtm" = ( @@ -18367,7 +18323,8 @@ /obj/machinery/button/flasher{ id = "visitorflash"; pixel_x = -6; - pixel_y = 24 + pixel_y = 24; + dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/button/door/directional/north{ @@ -18430,7 +18387,7 @@ /area/station/security/medical) "gvG" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) @@ -18456,6 +18413,11 @@ "gwf" = ( /turf/open/floor/glass/reinforced, /area/station/science/research) +"gwG" = ( +/obj/machinery/teleport/station, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/plating, +/area/station/command/teleporter) "gwK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18611,6 +18573,14 @@ "gyQ" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance) +"gyW" = ( +/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) "gzi" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -18628,12 +18598,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"gzO" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) "gzW" = ( /obj/structure/chair/office{ dir = 8 @@ -18763,7 +18727,7 @@ /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "gCA" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/iron/dark, @@ -18806,6 +18770,14 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/wood, /area/station/commons/vacant_room/office) +"gDe" = ( +/obj/structure/chair, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/sign/warning/directional/northeast, +/turf/open/floor/plating/airless, +/area/station/science/ordnance/bomb) "gDh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18813,8 +18785,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 + dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "gDq" = ( @@ -18903,7 +18876,7 @@ /obj/structure/cable/multilayer/connected, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "gEx" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -18912,7 +18885,7 @@ "gEG" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19100,7 +19073,20 @@ /obj/effect/spawner/random/armory/shotgun, /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) +"gHD" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/rack, +/obj/item/storage/briefcase{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/storage/briefcase/secure{ + pixel_x = 2; + pixel_y = -2 + }, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "gHE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19215,6 +19201,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"gJh" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "gJi" = ( /obj/machinery/door/poddoor/shutters/preopen{ dir = 4; @@ -19306,17 +19300,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"gKD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology Lab - Central East"; - network = list("ss13","rd","xeno") - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "gKH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19444,7 +19427,7 @@ /obj/machinery/camera/directional/north{ c_tag = "Engineering - Power Monitoring" }, -/obj/machinery/computer/station_alert/station_only, +/obj/machinery/computer/station_alert, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/main) @@ -19524,7 +19507,7 @@ }, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "gNR" = ( /obj/structure/girder, /obj/effect/spawner/random/structure/grille, @@ -19574,7 +19557,7 @@ /obj/machinery/holopad, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "gOy" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, @@ -19720,6 +19703,16 @@ /obj/machinery/wall_healer/directional/west, /turf/open/floor/iron, /area/station/command/gateway) +"gSt" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port) "gSu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -19729,12 +19722,6 @@ /obj/machinery/rnd/server/master, /turf/open/floor/circuit/telecomms/server, /area/station/science/server) -"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, @@ -19873,11 +19860,13 @@ /turf/open/floor/iron, /area/station/science/robotics/mechbay) "gVn" = ( -/obj/effect/turf_decal/siding/white{ - dir = 6 +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 }, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, -/area/station/medical/office) +/area/station/medical/paramedic) "gVx" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -20028,7 +20017,7 @@ /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, @@ -20276,6 +20265,16 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/engineering/main) +"hcg" = ( +/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) "hcl" = ( /obj/item/target, /obj/effect/turf_decal/stripes/line{ @@ -20386,13 +20385,13 @@ /turf/closed/wall, /area/station/engineering/atmos/pumproom) "hdy" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ id = "Xenolab"; name = "Test Chamber Blast Door" }, /obj/structure/cable, /obj/structure/sign/warning/electric_shock, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/station/science/xenobiology) "hdI" = ( @@ -20427,7 +20426,7 @@ /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "heE" = ( /obj/structure/table/wood, /obj/effect/spawner/random/decoration/ornament, @@ -20473,14 +20472,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"hfi" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "hft" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -20589,6 +20580,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/storage/tech) +"hhE" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "hhN" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -20822,7 +20823,8 @@ /area/station/hallway/secondary/exit/departure_lounge) "hlu" = ( /obj/structure/sign/painting/library{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/wood, /area/station/service/library) @@ -20851,7 +20853,7 @@ }, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "hlD" = ( /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) @@ -20891,7 +20893,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable/multilayer/connected, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hmo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -20990,7 +20992,8 @@ dir = 1 }, /obj/structure/sign/map/meta/left{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/primary/central) @@ -21295,10 +21298,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"hux" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall, -/area/station/command/teleporter) "huy" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -21488,7 +21487,8 @@ /obj/item/clothing/shoes/winterboots, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/sign/map/meta/left{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron/dark, /area/station/commons/locker) @@ -21519,15 +21519,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/structure/sign/warning/pods/directional/east, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) -"hxV" = ( -/obj/structure/chair, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating/airless, -/area/station/science/ordnance/bomb) "hxW" = ( /obj/machinery/door/window/right/directional/north{ name = "Gas Ports" @@ -21592,10 +21586,6 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/port) -"hyN" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/eva) "hyT" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/bot, @@ -21615,10 +21605,6 @@ /turf/open/floor/iron, /area/station/service/bar) "hyZ" = ( -/obj/machinery/flasher/directional/east{ - id = "AI"; - pixel_y = 26 - }, /obj/machinery/holopad/secure, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/door/window/brigdoor/right/directional/east{ @@ -21627,7 +21613,7 @@ pixel_x = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "hza" = ( /obj/vehicle/sealed/mecha/ripley/paddy/preset, /turf/open/floor/iron/recharge_floor, @@ -21647,7 +21633,7 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hzw" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -21693,7 +21679,7 @@ }, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hAL" = ( /obj/machinery/door/poddoor/shutters{ dir = 4; @@ -21715,7 +21701,7 @@ /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hBo" = ( /mob/living/simple_animal/bot/mulebot, /obj/structure/cable, @@ -21747,7 +21733,7 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "hBB" = ( -/obj/machinery/computer/rdconsole{ +/obj/machinery/computer/rdconsole/unlocked{ dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -21943,21 +21929,11 @@ dir = 4 }, /obj/structure/sign/map/meta/right{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"hEV" = ( -/obj/effect/decal/cleanable/garbage, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"hEX" = ( -/obj/structure/closet/secure_closet/atmospherics, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) "hFz" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -22206,7 +22182,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hLB" = ( /obj/structure/rack, /obj/item/crowbar/red, @@ -22227,6 +22203,7 @@ /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 8 }, +/obj/machinery/newscaster/directional/south, /turf/open/floor/iron/white, /area/station/science/cytology) "hLZ" = ( @@ -22257,7 +22234,7 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/construction, @@ -22320,7 +22297,7 @@ /obj/effect/mapping_helpers/airlock/access/any/command/eva, /obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "hNn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/floor, @@ -22631,7 +22608,7 @@ /area/station/command/heads_quarters/ce) "hSG" = ( /obj/structure/closet/lasertag/red, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) @@ -22700,12 +22677,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"hUd" = ( -/obj/structure/closet/l3closet/scientist, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "hUn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -22787,6 +22758,11 @@ /obj/effect/landmark/navigate_destination, /turf/open/floor/iron/white, /area/station/medical/virology) +"hVQ" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/courtroom) "hVY" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22996,6 +22972,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"hYH" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/firealarm/directional/west, +/obj/machinery/light_switch/directional/west{ + pixel_x = -38 + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/main) "hZg" = ( /obj/structure/closet/crate, /obj/machinery/power/apc/auto_name/directional/west, @@ -23074,11 +23061,11 @@ /turf/open/floor/iron/white, /area/station/medical/virology) "iar" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/port) "ias" = ( @@ -23241,9 +23228,9 @@ /turf/open/floor/plating, /area/station/commons/fitness/recreation) "idA" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /obj/structure/sign/warning/electric_shock, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/station/science/xenobiology) "idL" = ( @@ -23640,7 +23627,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "ikO" = ( /obj/machinery/newscaster/directional/north, /obj/structure/table/glass, @@ -23729,7 +23716,7 @@ /area/station/command/teleporter) "ilx" = ( /obj/structure/closet/emcloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) @@ -23740,6 +23727,13 @@ }, /turf/open/floor/wood, /area/station/service/library) +"ilF" = ( +/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/plating, +/area/station/maintenance/port/fore) "ilJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -23986,7 +23980,7 @@ /obj/machinery/recharge_station, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "iqc" = ( /obj/structure/reflector/single/anchored{ dir = 9 @@ -24087,10 +24081,6 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"irL" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/white, -/area/station/medical/office) "irQ" = ( /obj/structure/mop_bucket, /obj/item/mop, @@ -24138,7 +24128,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "isr" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /obj/machinery/door/poddoor/shutters/radiation/preopen{ @@ -24147,7 +24137,6 @@ /turf/open/floor/plating, /area/station/engineering/atmospherics_engine) "isu" = ( -/obj/effect/landmark/start/paramedic, /obj/machinery/duct, /obj/structure/disposalpipe/segment, /obj/effect/spawner/random/engineering/tracking_beacon, @@ -24289,6 +24278,18 @@ }, /turf/open/floor/iron, /area/station/command/gateway) +"ivm" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Medbay Security Post" + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) "ivu" = ( /obj/structure/table/reinforced, /obj/machinery/camera/directional/west{ @@ -24414,7 +24415,7 @@ }, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "ixA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24443,7 +24444,7 @@ /obj/structure/closet/crate/silvercrate, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "ixY" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -24498,7 +24499,7 @@ /obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/commons/fitness/recreation) @@ -24759,7 +24760,7 @@ /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) +/area/station/security/armory) "iCx" = ( /obj/machinery/atmospherics/components/tank/air/layer4{ dir = 1 @@ -24776,7 +24777,7 @@ "iCV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "iDe" = ( /obj/structure/table, /obj/item/reagent_containers/cup/glass/drinkingglass, @@ -24884,6 +24885,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"iFl" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "iFz" = ( /turf/open/floor/iron, /area/station/security/prison) @@ -24986,14 +24995,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"iHu" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/main) "iHv" = ( /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/plating, @@ -25044,10 +25045,11 @@ /area/station/service/chapel) "iIE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/junction/flip{ dir = 4 }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/fore) "iIP" = ( @@ -25063,7 +25065,7 @@ "iIQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "iIW" = ( /obj/structure/bookcase/random, /turf/open/floor/plating/airless, @@ -25367,6 +25369,11 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/wood/parquet, /area/station/medical/psychology) +"iNy" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/security/brig) "iNB" = ( /obj/machinery/firealarm/directional/east, /obj/structure/table/glass, @@ -25511,10 +25518,10 @@ /area/station/maintenance/disposal) "iPM" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 + dir = 9 }, /turf/open/floor/iron/white, -/area/station/medical/office) +/area/station/medical/medbay/central) "iPT" = ( /obj/machinery/light/floor, /turf/open/floor/wood, @@ -25586,14 +25593,12 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "iQy" = ( -/obj/structure/sign/warning/pods{ - pixel_x = 30 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral, +/obj/structure/sign/warning/pods/directional/east, /turf/open/floor/iron, /area/station/commons/dorms) "iQF" = ( @@ -25686,7 +25691,7 @@ /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "iSd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, @@ -25704,7 +25709,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/sign/map/meta/right{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/primary/port) @@ -25795,7 +25801,7 @@ /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_foyer) +/area/station/ai/upload/foyer) "iUm" = ( /turf/closed/wall, /area/station/hallway/secondary/exit/departure_lounge) @@ -25858,7 +25864,7 @@ /area/station/commons/dorms) "iVO" = ( /obj/structure/closet/masks, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) @@ -25906,12 +25912,14 @@ /turf/open/floor/engine/cult, /area/station/service/library) "iWD" = ( +/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/blue/filled/line{ - dir = 9 + dir = 10 }, -/turf/open/floor/iron/white, -/area/station/medical/office) +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "iWJ" = ( /obj/effect/turf_decal/stripes/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25992,7 +26000,7 @@ name = "Commissary" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -26020,15 +26028,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"iYD" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/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{ @@ -26112,8 +26111,9 @@ pixel_y = 4 }, /obj/item/storage/box/syringes, -/obj/item/gun/syringe, /obj/structure/window/spawner/directional/west, +/obj/item/gun/syringe, +/obj/item/gun/syringe, /turf/open/floor/iron/dark, /area/station/medical/storage) "iZC" = ( @@ -26256,8 +26256,9 @@ }, /obj/machinery/camera{ c_tag = "Xenobiology Lab - Central South"; - dir = 9; - network = list("ss13","rd","xeno") + dir = 1; + network = list("ss13","rd","xeno"); + pixel_x = 20 }, /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/white, @@ -26285,7 +26286,7 @@ }, /obj/effect/spawner/random/armory/laser_gun, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "jcw" = ( /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark, @@ -26318,11 +26319,6 @@ /obj/machinery/duct, /turf/open/floor/iron/dark, /area/station/engineering/break_room) -"jcR" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/courtroom) "jdg" = ( /obj/structure/flora/bush/ferny/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -26350,6 +26346,7 @@ "jdQ" = ( /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/starboard/aft) "jdR" = ( @@ -26459,21 +26456,14 @@ name = "Primary Treatment Centre" }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, /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" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/mapping_helpers/airlock/unres{ dir = 8 }, /turf/open/floor/iron/white, -/area/station/medical/office) +/area/station/medical/treatment_center) "jfB" = ( /obj/machinery/door/airlock/external{ name = "Mining Dock Airlock" @@ -26510,13 +26500,13 @@ /turf/open/floor/iron/white/smooth_large, /area/station/medical/treatment_center) "jfS" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /obj/structure/sign/warning/electric_shock, /obj/machinery/door/poddoor/preopen{ id = "xenobio1"; name = "Xenobio Pen 1 Blast Door" }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/station/science/xenobiology) "jfU" = ( @@ -26583,15 +26573,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"jhc" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/table, -/obj/item/folder, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/locker) "jhd" = ( /obj/structure/cable, /turf/open/floor/plating/airless, @@ -26711,7 +26692,7 @@ "jjy" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "jjC" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/item/food/grown/banana, @@ -26780,7 +26761,7 @@ }, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "jkT" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -26836,7 +26817,7 @@ "jln" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "jlJ" = ( /obj/effect/spawner/random/entertainment/arcade, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -27087,6 +27068,17 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"jpS" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "jpU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, @@ -27325,16 +27317,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"juH" = ( -/obj/machinery/firealarm/directional/west{ - pixel_y = -9 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/obj/machinery/vending/cytopro, -/turf/open/floor/iron/white, -/area/station/science/cytology) "juJ" = ( /obj/structure/chair/office{ dir = 8 @@ -27431,7 +27413,7 @@ /obj/structure/cable/layer3, /mob/living/simple_animal/bot/secbot/pingsky, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "jvQ" = ( /obj/machinery/door/window/left/directional/north{ name = "Petting Zoo" @@ -27680,6 +27662,14 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/carpet, /area/station/security/detectives_office) +"jyZ" = ( +/obj/machinery/firealarm/directional/west, +/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) "jzp" = ( /turf/closed/wall, /area/station/commons/vacant_room/office) @@ -27713,7 +27703,7 @@ "jAd" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/broken_floor, @@ -27955,10 +27945,6 @@ /area/station/maintenance/fore) "jEr" = ( /obj/machinery/holopad/secure, -/obj/machinery/flasher/directional/west{ - id = "AI"; - pixel_y = -26 - }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/door/window/brigdoor/left/directional/west{ name = "Secondary AI Core Access"; @@ -27966,7 +27952,15 @@ pixel_x = -4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"jED" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) "jEI" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -28030,7 +28024,7 @@ /area/station/security/prison) "jFO" = ( /obj/structure/closet/firecloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) "jFZ" = ( @@ -28042,15 +28036,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"jGa" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "jGb" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28122,8 +28107,34 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/port) +"jGH" = ( +/obj/structure/table, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable, +/obj/item/pen/blue{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/pen/fountain{ + pixel_x = 10 + }, +/obj/item/pen/red{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/stamp/denied{ + pixel_y = -1 + }, +/obj/item/stamp/granted{ + pixel_x = -9; + pixel_y = -1 + }, +/turf/open/floor/catwalk_floor/iron, +/area/station/cargo/storage) "jGN" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 1 }, /obj/machinery/light/directional/south, @@ -28131,7 +28142,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "jGO" = ( /obj/machinery/hydroponics/soil, /obj/item/cultivator, @@ -28139,6 +28150,12 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/grass, /area/station/security/prison/garden) +"jGZ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "jHg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28158,6 +28175,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel, /area/station/service/chapel) +"jHy" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/sign/warning/directional/southwest, +/turf/open/floor/plating/airless, +/area/station/science/ordnance/bomb) "jHA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28171,7 +28198,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "jHM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -28207,7 +28234,7 @@ /obj/item/radio/off, /obj/item/multitool, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "jIk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28278,7 +28305,8 @@ /obj/machinery/button/flasher{ id = "IsolationFlash"; pixel_x = -23; - pixel_y = 8 + pixel_y = 8; + dir = 8 }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28438,6 +28466,11 @@ }, /turf/open/floor/iron/diagonal, /area/station/cargo/storage) +"jMg" = ( +/obj/structure/cable, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "jMo" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/iron, @@ -28601,10 +28634,6 @@ /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 }, @@ -28636,7 +28665,8 @@ dir = 1 }, /obj/structure/sign/map/meta/left{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/primary/port) @@ -28678,10 +28708,10 @@ "jQr" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/greater) "jQz" = ( @@ -28810,6 +28840,29 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/grass, /area/station/security/prison/garden) +"jTk" = ( +/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, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/security/holding_cell) "jTl" = ( /obj/structure/disposaloutlet{ dir = 4 @@ -28939,21 +28992,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, /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, @@ -28998,7 +29036,7 @@ /obj/machinery/button/door/directional/north{ id = "rdordnance"; name = "Ordnance Containment Control"; - req_access = list("rd") + req_access = list("science") }, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) @@ -29071,7 +29109,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -29132,6 +29170,18 @@ /obj/effect/mapping_helpers/airalarm/surgery, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) +"jYa" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/ordnance/storage) "jYr" = ( /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -29212,6 +29262,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"jZU" = ( +/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/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "jZW" = ( /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, @@ -29236,17 +29295,13 @@ }, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos/storage/gas) -"kat" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall, -/area/station/cargo/miningoffice) "kaC" = ( /obj/machinery/light_switch/directional/east, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "kaF" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -29449,13 +29504,13 @@ /area/station/commons/toilet/restrooms) "ken" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /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/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) "keK" = ( @@ -29643,6 +29698,18 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/checkpoint/engineering) +"khC" = ( +/obj/structure/cable, +/obj/machinery/camera/motion/directional/south{ + c_tag = "Vault"; + network = list("vault") + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/departments/vault/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/vault) "khD" = ( /obj/machinery/door/airlock/maintenance{ name = "Crematorium Maintenance" @@ -29955,6 +30022,12 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"klN" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "klS" = ( /obj/machinery/griddle, /turf/open/floor/iron/cafeteria, @@ -29975,10 +30048,6 @@ "kmN" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"kmZ" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall, -/area/station/command/gateway) "kna" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -30448,7 +30517,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "kwQ" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/neutral{ @@ -30617,6 +30686,7 @@ }, /obj/structure/sign/departments/aisat/directional/south, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/structure/sign/warning/pods/directional/east, /turf/open/floor/iron, /area/station/engineering/break_room) "kzg" = ( @@ -30670,7 +30740,7 @@ /obj/effect/mapping_helpers/airlock/access/any/command/eva, /obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "kzQ" = ( /obj/effect/turf_decal/siding/purple, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30706,6 +30776,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"kAw" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Arrivals - Station Entrance" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer5, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "kAF" = ( /obj/machinery/duct, /turf/open/floor/iron/freezer, @@ -30808,14 +30892,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/command/teleporter) -"kCq" = ( -/obj/machinery/firealarm/directional/west, -/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) "kCt" = ( /obj/machinery/status_display/door_timer{ id = "Cell 2"; @@ -31009,10 +31085,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/structure/sign/warning/pods/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "kGc" = ( -/obj/machinery/computer/rdconsole, +/obj/machinery/computer/rdconsole/unlocked, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 4 }, @@ -31034,7 +31111,7 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -31054,6 +31131,13 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/white, /area/station/science/lab) +"kGP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "kGR" = ( /obj/machinery/button/ignition{ id = "Xenobio"; @@ -31106,8 +31190,9 @@ "kHt" = ( /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #2"; - dir = 9; - network = list("ss13","rd","xeno") + dir = 1; + network = list("ss13","rd","xeno"); + pixel_x = 16 }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -31139,6 +31224,9 @@ /obj/structure/disposalpipe/junction{ dir = 4 }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/fore) "kIY" = ( @@ -31149,6 +31237,16 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"kJf" = ( +/obj/machinery/firealarm/directional/west, +/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 = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "kJi" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, @@ -31185,15 +31283,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"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, @@ -31313,7 +31402,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "kLh" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -31491,18 +31580,6 @@ /obj/machinery/telecomms/broadcaster/preset_right, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) -"kOh" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Medbay Security Post" - }, -/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/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) "kOu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31609,7 +31686,6 @@ "kPZ" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance/two, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "kQe" = ( @@ -31692,8 +31768,8 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "kRA" = ( -/obj/effect/spawner/random/engineering/atmospherics_portable, /obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/port) "kRV" = ( @@ -31820,7 +31896,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "kUo" = ( /obj/structure/closet/crate/engineering/electrical, /obj/item/solar_assembly, @@ -31840,14 +31916,24 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer5, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"kUA" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "kUG" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/loading_area{ @@ -31895,7 +31981,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "kVZ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -31934,7 +32020,7 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "kWE" = ( /obj/machinery/smartfridge/organ, /obj/effect/turf_decal/tile/dark_blue/full, @@ -32009,7 +32095,7 @@ /area/station/commons/toilet/auxiliary) "kXp" = ( /obj/machinery/camera/autoname{ - dir = 5 + pixel_x = 20 }, /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -32161,6 +32247,14 @@ /obj/structure/chair/stool/directional/north, /turf/open/floor/wood, /area/station/commons/lounge) +"kZo" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/obj/machinery/vending/cytopro, +/turf/open/floor/iron/white, +/area/station/science/cytology) "kZq" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -32212,7 +32306,6 @@ /area/station/service/chapel) "lah" = ( /obj/structure/rack, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/trash/janitor_supplies, /turf/open/floor/plating, /area/station/maintenance/aft/greater) @@ -32251,6 +32344,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 1 }, +/obj/structure/sign/departments/cargo/directional/west, /turf/open/floor/iron, /area/station/construction/storage_wing) "laE" = ( @@ -32318,6 +32412,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer4, /turf/open/floor/plating/airless, /area/station/engineering/atmos) +"lch" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "lct" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -32369,7 +32474,8 @@ dir = 1 }, /obj/structure/sign/map/meta/right{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/primary/central) @@ -32388,7 +32494,7 @@ /area/station/maintenance/starboard/fore) "ldP" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "ldQ" = ( /obj/structure/cable, /turf/open/floor/iron/dark, @@ -32544,6 +32650,12 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/security/prison) +"lhI" = ( +/obj/machinery/computer/teleporter, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai/satellite/foyer) "lhT" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -32701,6 +32813,24 @@ /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"lkE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 6 + }, +/obj/effect/turf_decal/siding/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/sign/warning/secure_area/directional/northeast, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "lkW" = ( /obj/machinery/light/small/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -32816,7 +32946,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "lmL" = ( /obj/structure/cable, /obj/effect/mapping_helpers/airlock/abandoned, @@ -32867,7 +32997,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "loh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32906,7 +33036,7 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -32919,7 +33049,17 @@ /obj/machinery/light/small/directional/west, /obj/effect/spawner/random/armory/dragnet, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) +"lpk" = ( +/obj/structure/cable, +/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/white/smooth_large, +/area/station/medical/medbay/central) "lpo" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 4 @@ -32939,6 +33079,21 @@ /obj/machinery/biogenerator, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"lpL" = ( +/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/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/sign/warning/secure_area/directional/southwest, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "lpR" = ( /obj/structure/table, /obj/effect/turf_decal/siding{ @@ -32970,7 +33125,7 @@ /obj/effect/turf_decal/siding{ dir = 1 }, -/obj/machinery/computer/rdconsole, +/obj/machinery/computer/rdconsole/unlocked, /turf/open/floor/iron/dark, /area/station/science/lab) "lqQ" = ( @@ -33011,8 +33166,9 @@ pixel_y = 2 }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/flasher/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lrp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -33197,17 +33353,13 @@ /obj/machinery/ai_slipper{ uses = 10 }, -/obj/machinery/flasher/directional/south{ - id = "AI"; - pixel_x = 26 - }, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lus" = ( /obj/structure/closet/athletic_mixed, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -33251,8 +33403,9 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "lvu" = ( @@ -33265,6 +33418,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/security/medical) +"lvU" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central) "lvZ" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -33320,6 +33477,18 @@ /obj/item/pillow/random, /turf/open/floor/wood, /area/station/commons/dorms) +"lxj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + name = "Medical Freezer Maintenance" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/turf/open/floor/plating, +/area/station/medical/cryo) "lxm" = ( /obj/machinery/atmospherics/components/trinary/mixer/airmix{ dir = 4 @@ -33349,8 +33518,8 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port) "lyf" = ( @@ -33358,6 +33527,16 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, /area/station/security/holding_cell) +"lyh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical/glass{ + name = "Cryogenics Bay" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "lyu" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -33506,7 +33685,7 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/vault, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "lBm" = ( /obj/machinery/conveyor{ dir = 4; @@ -33562,7 +33741,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "lDo" = ( /obj/item/radio/off, /obj/effect/turf_decal/stripes/line{ @@ -33578,7 +33757,7 @@ /area/station/maintenance/aft/lesser) "lDA" = ( /obj/structure/closet/wardrobe/black, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/locker) @@ -33988,7 +34167,7 @@ }, /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -34172,7 +34351,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/window/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "lPy" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -34319,7 +34498,7 @@ /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) +/area/station/ai/upload/chamber) "lSz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34393,7 +34572,7 @@ /obj/structure/extinguisher_cabinet/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "lTR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34605,11 +34784,21 @@ /obj/structure/sign/warning/vacuum/directional/east, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"lXm" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum/external, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) +"lWX" = ( +/obj/structure/table/reinforced, +/obj/item/defibrillator/loaded{ + pixel_y = 6 + }, +/obj/item/defibrillator/loaded{ + pixel_y = 3 + }, +/obj/item/defibrillator/loaded, +/obj/item/defibrillator/loaded{ + pixel_y = -4 + }, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "lXr" = ( /obj/effect/turf_decal/tile/green{ dir = 4 @@ -34878,7 +35067,7 @@ "mbS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "mbV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -34976,17 +35165,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"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, @@ -35030,9 +35208,9 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "mez" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /obj/structure/sign/warning/electric_shock, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/station/science/cytology) "meJ" = ( @@ -35086,7 +35264,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "mgh" = ( /obj/machinery/camera/directional/east{ c_tag = "Atmospherics Tank - O2" @@ -35096,13 +35274,9 @@ "mgj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/flasher/directional/north{ - id = "AI"; - pixel_x = -22 - }, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "mgo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -35208,7 +35382,7 @@ name = "Research Division Access" }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "sci-entrance" }, @@ -35234,6 +35408,12 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"mio" = ( +/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) "mix" = ( /obj/structure/frame/machine, /obj/item/circuitboard/machine/chem_master, @@ -35304,7 +35484,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "mkr" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -35452,14 +35632,13 @@ /turf/open/floor/iron/dark, /area/station/security/courtroom) "mna" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/effect/turf_decal/siding/white{ - dir = 4 +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/medical/office) +/area/station/medical/paramedic) "mnj" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/effect/turf_decal/trimline/brown/warning{ @@ -35538,6 +35717,26 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/security/brig) +"mop" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/east{ + name = "Outer Window" + }, +/obj/machinery/door/window/brigdoor/left/directional/west{ + name = "Brig Control Desk"; + req_access = list("armory") + }, +/obj/item/folder/red, +/obj/item/folder/red, +/obj/item/poster/random_official, +/obj/structure/cable, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/showroomfloor, +/area/station/security/warden) "moF" = ( /obj/effect/turf_decal/siding/purple{ dir = 5 @@ -35577,7 +35776,7 @@ "mph" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "mpk" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -35833,10 +36032,12 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "mtj" = ( -/obj/machinery/medical_kiosk, /obj/effect/turf_decal/siding/white, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/computer/crew{ + dir = 1 + }, /turf/open/floor/iron/white/side{ dir = 1 }, @@ -35860,9 +36061,14 @@ /turf/open/floor/iron, /area/station/security/brig) "mtL" = ( -/obj/structure/sign/warning/pods, -/turf/closed/wall, -/area/station/hallway/secondary/entry) +/obj/machinery/door/poddoor/preopen{ + id = "Xenolab"; + name = "Test Chamber Blast Door" + }, +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/engine, +/area/station/science/xenobiology) "mtO" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron, @@ -35901,7 +36107,7 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -35985,12 +36191,11 @@ /turf/closed/wall/r_wall, /area/station/science/lab) "mvY" = ( -/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/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, /turf/open/floor/iron/white, -/area/station/medical/office) +/area/station/medical/medbay/central) "mvZ" = ( /obj/machinery/light/directional/south, /obj/structure/rack, @@ -36341,8 +36546,8 @@ "mCj" = ( /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #7"; - dir = 5; - network = list("ss13","rd","xeno") + network = list("ss13","rd","xeno"); + pixel_x = 16 }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -36380,7 +36585,7 @@ "mCL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "mCM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36635,6 +36840,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/command/gateway) +"mGl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/floor/iron, +/area/station/command/eva) "mGy" = ( /obj/structure/sign/warning/vacuum/directional/west, /obj/effect/turf_decal/delivery, @@ -36804,7 +37016,11 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/dorms) -"mJN" = ( +"mJO" = ( +/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, /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -36865,6 +37081,20 @@ }, /turf/open/floor/iron/white, /area/station/science/cytology) +"mKQ" = ( +/obj/machinery/door/airlock/security/glass{ + id_tag = "innerbrig"; + name = "Brig" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "brig-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/entrance, +/turf/open/floor/iron, +/area/station/security/brig) "mKR" = ( /obj/structure/sign/warning/test_chamber, /turf/closed/wall, @@ -36979,9 +37209,7 @@ 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" = ( @@ -37010,6 +37238,22 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"mMH" = ( +/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, +/obj/structure/sign/warning/secure_area/directional/east, +/turf/open/floor/iron, +/area/station/engineering/main) "mMK" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -37018,25 +37262,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"mMM" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/east{ - name = "Outer Window" - }, -/obj/machinery/door/window/brigdoor/left/directional/west{ - name = "Brig Control Desk"; - req_access = list("armory") - }, -/obj/item/folder/red, -/obj/item/folder/red, -/obj/item/poster/random_official, -/obj/structure/cable, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -3; - pixel_y = 5 - }, -/turf/open/floor/iron/showroomfloor, -/area/station/security/warden) "mMX" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/office) @@ -37048,7 +37273,8 @@ /obj/machinery/button/door{ id = "ordnancebridge"; pixel_x = -24; - req_one_access = list("maint_tunnels","science") + req_one_access = list("maint_tunnels","science"); + dir = 8 }, /obj/effect/turf_decal/caution/stand_clear{ dir = 1 @@ -37077,7 +37303,7 @@ /area/station/maintenance/port/aft) "mOl" = ( /obj/structure/closet/boxinggloves, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, @@ -37158,13 +37384,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"mPH" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "mPK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37377,8 +37596,7 @@ /area/station/maintenance/starboard/fore) "mSI" = ( /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/ai_upload"; - icon_state = "control_stun"; + control_area = "/area/station/ai/upload/chamber"; name = "AI Upload Turret Control"; pixel_y = 28 }, @@ -37398,7 +37616,7 @@ /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_foyer) +/area/station/ai/upload/foyer) "mSM" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -37610,9 +37828,9 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "mXj" = ( -/obj/machinery/computer/station_alert/station_only, +/obj/machinery/computer/station_alert, /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 }, @@ -37766,7 +37984,7 @@ /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) +/area/station/command/eva) "mZB" = ( /obj/structure/urinal/directional/north, /obj/effect/landmark/start/hangover, @@ -37808,7 +38026,7 @@ /obj/effect/turf_decal/tile/blue, /mob/living/basic/bot/cleanbot, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nad" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -37825,16 +38043,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, /turf/open/floor/iron/white, /area/station/science/cytology) -"naf" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "nao" = ( /obj/structure/easel, /obj/machinery/light/small/dim/directional/west, @@ -37994,7 +38202,8 @@ /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/delivery, /obj/structure/sign/map/meta/left{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) @@ -38077,7 +38286,7 @@ }, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "neL" = ( /obj/machinery/door/airlock/maintenance{ name = "Storage Room" @@ -38085,7 +38294,7 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -38195,7 +38404,7 @@ /area/station/command/heads_quarters/rd) "nhP" = ( /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "nhS" = ( /obj/machinery/vending/cigarette, /obj/structure/sign/poster/official/random/directional/east, @@ -38207,7 +38416,7 @@ /obj/machinery/computer/security/telescreen/research/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nie" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -38348,6 +38557,11 @@ /obj/effect/turf_decal/loading_area, /turf/open/floor/plating/reinforced, /area/station/cargo/storage) +"nku" = ( +/obj/effect/spawner/random/structure/crate, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/port) "nkG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/machinery/meter, @@ -38653,7 +38867,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/iron/dark, @@ -38757,12 +38971,10 @@ /area/station/maintenance/starboard/fore) "nqV" = ( /obj/structure/closet/emcloset, -/obj/structure/sign/warning/pods{ - pixel_y = 30 - }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/small/directional/west, +/obj/structure/sign/warning/pods/directional/north, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) "nra" = ( @@ -38840,7 +39052,8 @@ /obj/effect/landmark/start/depsec/medical, /obj/machinery/button/door/directional/east{ id = "medsecprivacy"; - name = "Privacy Shutters Control" + name = "Privacy Shutters Control"; + pixel_x = 22 }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -38982,12 +39195,12 @@ /obj/machinery/door/airlock/maintenance{ name = "Disposal Access" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, @@ -39091,14 +39304,6 @@ }, /turf/open/floor/plating, /area/station/cargo/sorting) -"nur" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/medical/office) "nuB" = ( /obj/structure/secure_safe/directional/south, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -39163,7 +39368,7 @@ /area/station/hallway/primary/central) "nwa" = ( /obj/structure/closet/wardrobe/pjs, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/sign/poster/official/random/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -39210,7 +39415,7 @@ /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "nwT" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 8 @@ -39645,15 +39850,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"nDT" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "nDW" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -39744,7 +39940,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "nFn" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -39756,7 +39952,7 @@ }, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "nGo" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/stool/directional/east, @@ -39767,18 +39963,6 @@ /obj/effect/spawner/random/entertainment/dice, /turf/open/floor/iron, /area/station/commons/locker) -"nGq" = ( -/obj/structure/railing/corner, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) "nGr" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -39955,11 +40139,13 @@ }, /obj/machinery/button/ignition/incinerator/ordmix{ pixel_x = 24; - pixel_y = -6 + pixel_y = -6; + dir = 4 }, /obj/machinery/button/door/incinerator_vent_ordmix{ pixel_x = 24; - pixel_y = 8 + pixel_y = 8; + dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/engine, @@ -40223,6 +40409,17 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"nOA" = ( +/obj/machinery/firealarm/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) "nOC" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -40379,11 +40576,6 @@ "nSe" = ( /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"nSn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) "nSs" = ( /obj/structure/showcase/cyborg/old{ pixel_y = 20 @@ -40398,7 +40590,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nSB" = ( /obj/item/toy/figure/roboticist, /obj/structure/disposalpipe/segment, @@ -40432,6 +40624,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"nTD" = ( +/obj/machinery/airalarm/directional/west{ + pixel_y = -5 + }, +/obj/structure/disposaloutlet{ + dir = 4; + name = "Cargo Deliveries" + }, +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/trimline/brown/warning, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) "nTH" = ( /obj/structure/cable, /obj/machinery/computer/crew{ @@ -40599,7 +40807,7 @@ /obj/machinery/ore_silo, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "nYy" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/closet/secure_closet/freezer/kitchen/maintenance, @@ -40699,6 +40907,9 @@ /obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/iron, /area/station/cargo/sorting) +"nZX" = ( +/turf/closed/wall, +/area/station/medical/cryo) "oac" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -40948,15 +41159,12 @@ /turf/open/floor/iron/white, /area/station/security/prison) "odu" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Cryogenics Bay" - }, +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/office) +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "odI" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -41191,7 +41399,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, @@ -41207,17 +41415,6 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/iron, /area/station/cargo/warehouse) -"okj" = ( -/obj/structure/cable, -/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) "okP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41321,7 +41518,7 @@ /obj/item/stock_parts/power_store/cell/high, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "omm" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41342,7 +41539,7 @@ /obj/machinery/status_display/evac/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "omK" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -41402,7 +41599,8 @@ dir = 4 }, /obj/structure/sign/map/meta/right{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, @@ -41420,11 +41618,11 @@ /turf/open/floor/engine, /area/station/engineering/atmospherics_engine) "ool" = ( -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "oor" = ( @@ -41534,14 +41732,7 @@ }, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"oqi" = ( -/obj/effect/landmark/start/paramedic, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/area/station/ai/satellite/exterior) "oqk" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41611,7 +41802,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "osc" = ( /obj/structure/cable, /obj/effect/spawner/random/decoration/showcase, @@ -41644,16 +41835,8 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) -"osw" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall, -/area/station/security/brig) +/area/station/ai/upload/foyer) "osH" = ( -/obj/structure/secure_safe/hos{ - pixel_x = 36; - pixel_y = 28 - }, /obj/machinery/status_display/evac/directional/north, /obj/structure/cable, /turf/open/floor/carpet, @@ -41719,6 +41902,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"ott" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/computer/records/security{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "otu" = ( /turf/closed/wall, /area/station/service/chapel) @@ -41818,9 +42015,10 @@ dir = 4 }, /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) "ouX" = ( @@ -41868,15 +42066,6 @@ /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) -"owf" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay Staff Entrance" - }, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/office) "owi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/holopad, @@ -42142,6 +42331,30 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"oBE" = ( +/obj/effect/decal/cleanable/garbage, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/sign/warning/secure_area/directional/east, +/turf/open/floor/iron/white, +/area/station/science/research) +"oBK" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "oBM" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -42206,15 +42419,18 @@ pixel_y = 2 }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/flasher/directional/east{ + pixel_y = -5 + }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "oDl" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "oDs" = ( @@ -42250,10 +42466,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"oDJ" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall, -/area/station/cargo/storage) "oDW" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, /obj/machinery/firealarm/directional/south, @@ -42419,7 +42631,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "north-maint-viewingdeck" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, @@ -42464,7 +42676,7 @@ name = "Fuel Closet" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -42857,9 +43069,17 @@ /turf/open/floor/iron/white/smooth_large, /area/station/medical/chemistry) "oNP" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/medical/office) +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/machinery/camera/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "oNR" = ( /obj/effect/turf_decal/bot_white, /obj/effect/spawner/random/maintenance, @@ -42871,7 +43091,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "oOy" = ( /obj/effect/landmark/start/botanist, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43218,6 +43438,13 @@ /obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"oUJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/sign/nanotrasen/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "oUK" = ( /obj/structure/table, /obj/item/electronics/apc, @@ -43264,10 +43491,6 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) -"oWc" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall/r_wall, -/area/station/maintenance/starboard/aft) "oWk" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/aft) @@ -43282,7 +43505,7 @@ "oWF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "oWH" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -43347,7 +43570,7 @@ /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) +/area/station/command/vault) "oXL" = ( /obj/machinery/disposal/bin, /obj/structure/cable, @@ -43377,15 +43600,14 @@ /turf/open/floor/plating, /area/station/maintenance/fore) "oYp" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 8 + }, +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/office) +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "oYr" = ( /obj/structure/railing{ dir = 1 @@ -43444,7 +43666,8 @@ dir = 4 }, /obj/structure/sign/map/meta/right{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) @@ -43491,7 +43714,7 @@ "pan" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "pav" = ( /obj/structure/chair/stool/directional/west, /obj/machinery/camera/directional/north{ @@ -43522,7 +43745,7 @@ /area/station/cargo/bitrunning/den) "paU" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, @@ -43765,7 +43988,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "pfs" = ( /obj/structure/closet/secure_closet{ name = "contraband locker"; @@ -43777,7 +44000,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "pfP" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/light_switch/directional/south, @@ -43795,7 +44018,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -43812,7 +44035,7 @@ name = "Chapel Maintenance" }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -43851,6 +44074,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/command/gateway) +"phi" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/cryo) "phn" = ( /obj/structure/reflector/single/anchored{ dir = 10 @@ -43890,7 +44123,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "phR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43946,7 +44179,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "piz" = ( /obj/structure/cable, /obj/effect/landmark/start/hangover, @@ -43958,14 +44191,6 @@ /obj/item/clothing/under/misc/assistantformal, /turf/open/floor/wood, /area/station/commons/dorms) -"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/dark, -/area/station/medical/storage) "piM" = ( /obj/structure/rack, /obj/item/clothing/under/color/red, @@ -44038,6 +44263,14 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron, /area/station/security/checkpoint/science) +"pkn" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/camera/directional/south{ + c_tag = "Central Primary Hallway - Aft-Port Corner" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "pkx" = ( /obj/machinery/modular_computer/preset/research{ dir = 8 @@ -44321,7 +44554,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "service-passthrough" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -44433,7 +44666,7 @@ "pqH" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "pqI" = ( /obj/structure/lattice/catwalk, /obj/item/reagent_containers/cup/fish_feed, @@ -44526,7 +44759,8 @@ dir = 1 }, /obj/structure/sign/map/meta/left{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/primary/central) @@ -44564,7 +44798,7 @@ /obj/machinery/power/apc/auto_name/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "psw" = ( /obj/machinery/computer/security/hos{ dir = 4 @@ -44627,6 +44861,8 @@ "pti" = ( /obj/structure/closet/secure_closet/security/sec, /obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/lockers) "pts" = ( @@ -44901,7 +45137,7 @@ "pyP" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "pyR" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/machinery/light_switch/directional/south, @@ -44999,7 +45235,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "pAV" = ( /obj/structure/table/reinforced, /obj/machinery/microwave/engineering/cell_included, @@ -45059,16 +45295,12 @@ /turf/open/floor/iron, /area/station/security/office) "pBN" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/structure/chair/sofa/corp/left{ +/obj/machinery/computer/records/medical{ dir = 1 }, -/obj/machinery/airalarm/directional/south, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/office) +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/paramedic) "pCh" = ( /obj/machinery/camera/directional/east{ c_tag = "Prison Laundry"; @@ -45176,6 +45408,12 @@ /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central) +"pEl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/vault) "pEs" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -45359,7 +45597,8 @@ /obj/effect/turf_decal/bot, /obj/machinery/camera{ c_tag = "Engineering - Foyer - Starboard"; - dir = 9 + dir = 1; + pixel_x = 25 }, /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -45446,7 +45685,7 @@ }, /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "pIF" = ( /obj/effect/turf_decal/stripes/white/line, /obj/machinery/research/anomaly_refinery, @@ -45526,6 +45765,13 @@ "pJR" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/hop) +"pJU" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "pJV" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -45625,17 +45871,8 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/engine/n2, /area/station/engineering/atmos) -"pMy" = ( -/obj/machinery/computer/prisoner/management{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/warden) "pMH" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 4 }, /obj/structure/plaque/static_plaque/atmos{ @@ -45675,7 +45912,7 @@ /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "pNb" = ( /obj/effect/spawner/random/maintenance, /obj/structure/cable, @@ -45898,7 +46135,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "pQy" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -45922,7 +46159,7 @@ dir = 4 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "pQK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46012,6 +46249,13 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"pSR" = ( +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/directional/south, +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "pSS" = ( /obj/structure/lattice/catwalk, /obj/structure/transit_tube/junction/flipped{ @@ -46151,15 +46395,14 @@ /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) "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, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical/glass{ + name = "Paramedic Dispatch Room" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic, /turf/open/floor/iron/dark, -/area/station/medical/office) +/area/station/medical/paramedic) "pUS" = ( /obj/item/paper_bin{ pixel_x = -3; @@ -46282,7 +46525,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "pWT" = ( /obj/machinery/atmospherics/components/tank/air{ dir = 8 @@ -46353,11 +46596,12 @@ /turf/open/floor/iron, /area/station/hallway/primary/port) "pYw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 +/obj/effect/spawner/structure/window, +/obj/structure/curtain/cloth{ + color = "#52B4E9" }, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/office) +/turf/open/floor/plating, +/area/station/medical/paramedic) "pYE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -46412,13 +46656,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"pZW" = ( -/obj/structure/lattice, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, -/turf/open/space/basic, -/area/space/nearstation) "qaf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/large, @@ -46522,10 +46759,10 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "qcd" = ( @@ -46590,22 +46827,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer5, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) -"qdI" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 5 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "qdT" = ( /obj/effect/turf_decal/siding/red, /obj/effect/landmark/start/depsec/science, @@ -46651,7 +46872,6 @@ /area/station/hallway/primary/central) "qeQ" = ( /obj/machinery/turretid{ - icon_state = "control_stun"; name = "AI Chamber turret control"; pixel_x = 3; pixel_y = -23 @@ -46664,7 +46884,7 @@ req_access = list("ai_upload") }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qfp" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -46687,6 +46907,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"qfK" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) "qfL" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/plating, @@ -46694,8 +46922,9 @@ "qfM" = ( /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #4"; - dir = 6; - network = list("ss13","rd","xeno") + dir = 4; + network = list("ss13","rd","xeno"); + pixel_y = -16 }, /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/engine, @@ -46947,7 +47176,7 @@ }, /mob/living/basic/bot/repairbot, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "qiY" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -46966,7 +47195,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "qjl" = ( /obj/machinery/vending/tool, /obj/effect/turf_decal/delivery, @@ -46989,7 +47218,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "viro-passthrough" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, @@ -47009,7 +47238,7 @@ /obj/effect/mapping_helpers/airlock/access/any/command/general, /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /turf/open/floor/plating, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "qjH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47110,7 +47339,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "qlL" = ( /obj/structure/closet/secure_closet/hydroponics, /obj/effect/turf_decal/stripes/line, @@ -47180,8 +47409,9 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "qnj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47278,16 +47508,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"qoR" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "qoY" = ( /obj/effect/spawner/random/maintenance, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -47313,10 +47533,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"qpD" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall, -/area/station/ai_monitored/command/nuke_storage) "qpM" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/wood, @@ -47372,7 +47588,7 @@ /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "qri" = ( /turf/open/floor/iron/chapel{ dir = 1 @@ -47509,7 +47725,7 @@ name = "Private Channel" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qsW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47930,13 +48146,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron, /area/station/science/xenobiology) -"qCm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "qCv" = ( /obj/machinery/telecomms/processor/preset_two, /turf/open/floor/circuit/telecomms/mainframe, @@ -48008,7 +48217,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, @@ -48025,7 +48234,7 @@ "qDi" = ( /obj/machinery/status_display/ai/directional/east, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qDy" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -48100,6 +48309,14 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"qEP" = ( +/obj/machinery/computer/crew{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/camera/directional/south, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/paramedic) "qFo" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -48157,6 +48374,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/dorms) +"qGw" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "qGK" = ( /obj/machinery/door/poddoor/preopen{ id = "Engineering"; @@ -48235,7 +48462,7 @@ }, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "qIl" = ( /turf/closed/wall, /area/station/hallway/secondary/command) @@ -48295,7 +48522,7 @@ }, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "qIR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48330,7 +48557,7 @@ /area/station/security/detectives_office) "qJd" = ( /obj/machinery/status_display/ai/directional/north, -/obj/machinery/computer/station_alert/station_only, +/obj/machinery/computer/station_alert, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) @@ -48356,7 +48583,8 @@ dir = 1 }, /obj/structure/sign/map/meta/right{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/primary/central) @@ -48577,13 +48805,16 @@ /turf/open/floor/iron/dark, /area/station/hallway/primary/fore) "qNi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 }, /obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/obj/machinery/light_switch/directional/east{ + pixel_x = 21 + }, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/station/medical/cryo) "qNk" = ( @@ -48969,10 +49200,6 @@ "qSh" = ( /turf/closed/wall/r_wall, /area/station/maintenance/solars/starboard/fore) -"qSk" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, -/turf/closed/wall, -/area/station/maintenance/port) "qSp" = ( /obj/structure/rack, /obj/item/flashlight, @@ -49102,7 +49329,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Cargo Bay Bridge Access" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, @@ -49122,7 +49349,7 @@ "qTS" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "qTU" = ( /obj/item/retractor, /obj/item/hemostat{ @@ -49381,7 +49608,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "qZa" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -49403,7 +49630,7 @@ /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{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -49451,7 +49678,7 @@ }, /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "rac" = ( /turf/closed/wall, /area/station/commons/lounge) @@ -49605,10 +49832,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"rcR" = ( -/obj/structure/sign/departments/cargo, -/turf/closed/wall, -/area/station/cargo/lobby) "rcW" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -49784,6 +50007,17 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"rgH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Xenobiology Lab - Central East"; + network = list("ss13","rd","xeno") + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "rgS" = ( /obj/machinery/modular_computer/preset/civilian{ dir = 1 @@ -49874,7 +50108,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "viro-passthrough" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/duct, @@ -49908,6 +50142,7 @@ /obj/machinery/atmospherics/components/unary/airlock_pump{ dir = 4 }, +/obj/structure/sign/warning/vacuum/external/directional/south, /turf/open/floor/plating, /area/station/cargo/storage) "riW" = ( @@ -49926,7 +50161,7 @@ req_access = list("armory") }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "riZ" = ( /obj/effect/landmark/start/assistant, /turf/open/floor/wood, @@ -50081,17 +50316,17 @@ /turf/open/floor/iron, /area/station/engineering/main) "rlw" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 4 + }, /turf/open/floor/iron/white, -/area/station/medical/office) +/area/station/medical/medbay/central) "rlU" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "rmj" = ( /obj/structure/table, /turf/open/floor/iron/cafeteria, @@ -50157,17 +50392,13 @@ /turf/open/floor/iron/dark, /area/station/security/lockers) "rne" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - name = "Paramedic Dispatch Room" +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/airalarm/directional/west, +/obj/machinery/door/firedoor, /turf/open/floor/iron/white, -/area/station/medical/office) +/area/station/medical/medbay/central) "rnf" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/effect/turf_decal/stripes/line{ @@ -50217,7 +50448,7 @@ /obj/machinery/firealarm/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "rod" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/brown/arrow_cw{ @@ -50480,7 +50711,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "rtj" = ( /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, @@ -50633,17 +50864,6 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/station/engineering/break_room) -"rux" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/firealarm/directional/west, -/obj/machinery/light_switch/directional/west{ - pixel_x = -38 - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "ruz" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/wood, @@ -50657,7 +50877,7 @@ name = "Cleaning Closet" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "rvb" = ( @@ -50672,12 +50892,13 @@ /turf/open/floor/plating, /area/station/maintenance/port) "rvq" = ( -/obj/machinery/computer/records/medical{ - dir = 4 +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 }, -/obj/machinery/newscaster/directional/west, +/obj/machinery/firealarm/directional/north, +/obj/machinery/light/directional/north, /turf/open/floor/iron/dark, -/area/station/medical/office) +/area/station/medical/paramedic) "rvx" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/engine/n2o, @@ -50844,7 +51065,7 @@ "rxx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "rxA" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -50908,7 +51129,7 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "ryL" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -51194,13 +51415,22 @@ /turf/open/floor/iron, /area/station/commons/storage/tools) "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, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"rEu" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/paramedic) "rEz" = ( /obj/machinery/light/directional/east, /obj/machinery/firealarm/directional/east, @@ -51300,7 +51530,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "rGB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -51342,26 +51572,6 @@ "rHn" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter) -"rHq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/structure/sign/warning/secure_area/directional/east{ - pixel_y = 32 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/effect/turf_decal/siding/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "rHz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -51417,7 +51627,7 @@ pixel_y = 2 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "rIP" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -51546,11 +51756,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"rKJ" = ( -/obj/machinery/teleport/station, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/plating, -/area/station/command/teleporter) "rKN" = ( /obj/effect/turf_decal/siding/white{ dir = 10 @@ -51721,7 +51926,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "rNv" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -51741,7 +51946,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/duct, @@ -52040,8 +52245,9 @@ "rTi" = ( /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #3"; - dir = 6; - network = list("ss13","rd","xeno") + dir = 4; + network = list("ss13","rd","xeno"); + pixel_y = -16 }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -52111,7 +52317,6 @@ /area/station/security/execution/transfer) "rUL" = ( /obj/structure/sign/poster/official/soft_cap_pop_art/directional/north, -/obj/effect/landmark/start/paramedic, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, @@ -52297,6 +52502,7 @@ "rYy" = ( /obj/machinery/power/smes, /obj/structure/cable, +/obj/structure/sign/warning/electric_shock/directional/north, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) "rYA" = ( @@ -52306,7 +52512,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "rYH" = ( /obj/structure/rack, /obj/item/clothing/suit/hazardvest, @@ -52361,7 +52567,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "rZz" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -52370,7 +52576,8 @@ /area/station/service/hydroponics/garden) "rZA" = ( /obj/structure/sign/map/meta/left{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) @@ -52563,7 +52770,7 @@ /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "sbK" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -52759,10 +52966,15 @@ /turf/open/floor/carpet, /area/station/medical/psychology) "sfF" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/blue/filled/end, -/obj/structure/cable, /obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/cryo) "sfK" = ( @@ -53192,7 +53404,7 @@ "soi" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/command/maintenance, /turf/open/floor/plating, /area/station/maintenance/central) @@ -53250,7 +53462,7 @@ /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "sph" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53288,6 +53500,15 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"sqB" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/table, +/obj/item/folder, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/locker) "sqE" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/ce) @@ -53474,7 +53695,6 @@ /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) @@ -53499,9 +53719,6 @@ /area/station/maintenance/disposal/incinerator) "svQ" = ( /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, /obj/structure/cable, /obj/machinery/door/airlock/medical/glass{ id_tag = "MedbayFoyer"; @@ -53509,6 +53726,9 @@ }, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "svS" = ( @@ -53604,11 +53824,6 @@ /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, -/turf/open/floor/plating, -/area/station/security/brig) "syh" = ( /obj/machinery/door/poddoor/shutters{ id = "maintwarehouse" @@ -53852,10 +54067,6 @@ /obj/item/storage/crayons, /turf/open/space/basic, /area/space/nearstation) -"sCp" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/station/engineering/atmospherics_engine) "sCs" = ( /obj/structure/flora/bush/flowers_pp/style_3, /turf/open/floor/grass, @@ -54105,7 +54316,8 @@ "sFo" = ( /obj/machinery/button/crematorium{ id = "crematoriumChapel"; - pixel_x = -26 + pixel_x = -26; + dir = 8 }, /turf/open/floor/iron/dark, /area/station/service/chapel/office) @@ -54162,10 +54374,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "sGC" = ( @@ -54209,6 +54421,10 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"sHd" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, +/turf/closed/wall, +/area/station/medical/cryo) "sHg" = ( /obj/item/radio/intercom/directional/south, /obj/machinery/camera/directional/south{ @@ -54332,7 +54548,7 @@ name = "Storage Room" }, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, @@ -54393,7 +54609,7 @@ pixel_x = 8 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "sLU" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 @@ -54542,13 +54758,13 @@ name = "Primary Treatment Centre" }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "sOi" = ( @@ -54607,7 +54823,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "sOZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -54638,7 +54854,7 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -54666,12 +54882,10 @@ /turf/open/floor/iron/white, /area/station/science/explab) "sPO" = ( -/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 = 9 }, +/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) "sPV" = ( @@ -54723,7 +54937,7 @@ /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/library, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/maintenance/port) "sQy" = ( @@ -54760,6 +54974,17 @@ }, /turf/open/floor/iron, /area/station/engineering/gravity_generator) +"sQQ" = ( +/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) "sQY" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -54850,16 +55075,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"sSn" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "sSo" = ( /obj/effect/landmark/start/station_engineer, /turf/open/floor/iron, @@ -54867,17 +55082,6 @@ "sSp" = ( /turf/closed/wall, /area/station/medical/treatment_center) -"sSs" = ( -/obj/machinery/firealarm/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) "sSx" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -54899,7 +55103,7 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, @@ -55062,7 +55266,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "sVz" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/modular_computer/preset/command, @@ -55179,12 +55383,10 @@ "sXe" = ( /obj/effect/landmark/start/station_engineer, /obj/machinery/light/directional/west, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -31 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/structure/sign/warning/electric_shock/directional/west, /turf/open/floor/iron, /area/station/engineering/main) "sXm" = ( @@ -55356,7 +55558,7 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, @@ -55416,10 +55618,6 @@ /obj/structure/plasticflaps/kitchen, /turf/open/floor/iron/dark, /area/station/science/server) -"tbI" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "tbK" = ( /obj/structure/bookcase/random/nonfiction, /turf/open/floor/wood, @@ -55587,7 +55785,7 @@ "tfz" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "tfD" = ( /obj/structure/table/wood/poker, /obj/effect/decal/cleanable/dirt, @@ -55599,7 +55797,7 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -55921,9 +56119,6 @@ "tml" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, -/obj/machinery/newscaster/directional/south{ - pixel_x = -28 - }, /obj/machinery/atmospherics/components/binary/pump{ dir = 4 }, @@ -55971,10 +56166,10 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "tmQ" = ( @@ -56119,7 +56314,7 @@ }, /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "tpn" = ( /obj/machinery/light/small/directional/west, /obj/machinery/camera/directional/west{ @@ -56128,7 +56323,7 @@ }, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "tpA" = ( /obj/machinery/cell_charger{ pixel_y = 4 @@ -56247,14 +56442,14 @@ /obj/machinery/teleport/hub, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "trx" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/light/directional/north, /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "try" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -56276,17 +56471,7 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"trG" = ( -/obj/structure/table, -/obj/item/stack/cable_coil, -/obj/machinery/firealarm/directional/west, -/obj/item/stack/cable_coil{ - pixel_x = -1; - pixel_y = -3 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) +/area/station/ai/satellite/exterior) "tsb" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -56348,13 +56533,6 @@ /obj/item/knife/kitchen, /turf/open/floor/iron/white, /area/station/science/cytology) -"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, @@ -56419,6 +56597,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"ttV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "ttW" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer4, @@ -56587,7 +56775,7 @@ /obj/structure/cable/layer3, /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "txk" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=14.5-Recreation"; @@ -56686,17 +56874,13 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/central) "tzI" = ( -/obj/structure/table/reinforced, -/obj/item/emergency_bed, -/obj/item/emergency_bed{ - pixel_y = 3 - }, -/obj/item/emergency_bed{ - pixel_y = 6 +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 }, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/office) +/obj/structure/table/glass, +/obj/machinery/fax, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "tzJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56855,6 +57039,18 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) +"tBO" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/firealarm/directional/west, +/obj/structure/table/wood, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) "tBV" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -57009,6 +57205,12 @@ }, /turf/open/floor/plating, /area/station/cargo/sorting) +"tGy" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/effect/turf_decal/tile/green/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "tGA" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -57085,7 +57287,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "tHZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -57098,7 +57300,7 @@ "tIa" = ( /obj/structure/cable/multilayer/connected, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "tIb" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/watertank, @@ -57114,14 +57316,6 @@ /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{ - c_tag = "Science Maintenance Corridor"; - network = list("ss13","rd") - }, -/turf/open/floor/iron/white, -/area/station/science/research) "tIe" = ( /obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron/white, @@ -57200,7 +57394,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -57245,7 +57439,7 @@ "tJE" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "tJF" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -57313,16 +57507,6 @@ /obj/machinery/wall_healer/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"tKu" = ( -/obj/machinery/firealarm/directional/west, -/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 = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "tKE" = ( /turf/closed/wall, /area/station/security/checkpoint/engineering) @@ -57549,7 +57733,7 @@ /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -57587,7 +57771,7 @@ /area/station/science/xenobiology/hallway) "tOh" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "tOm" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -57634,13 +57818,6 @@ }, /turf/open/floor/circuit/green/off, /area/station/science/research) -"tPb" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/office) "tPd" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -57786,7 +57963,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tSY" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -57801,7 +57978,7 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/plating/airless, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "tTF" = ( /obj/effect/spawner/random/engineering/vending_restock, /turf/open/floor/plating, @@ -57822,17 +57999,15 @@ }, /obj/effect/spawner/random/armory/barrier_grenades, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "tTT" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, /obj/machinery/camera/directional/north{ c_tag = "Locker Room Starboard" }, -/obj/structure/sign/warning/pods{ - pixel_y = 30 - }, /obj/effect/turf_decal/delivery, +/obj/structure/sign/warning/pods/directional/north, /turf/open/floor/iron, /area/station/commons/locker) "tUc" = ( @@ -57933,8 +58108,11 @@ }, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/flasher/directional/south{ + id = "AI" + }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "tUH" = ( /obj/item/clothing/mask/gas, /turf/open/floor/plating, @@ -58004,7 +58182,7 @@ }, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "tVG" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/firealarm/directional/north, @@ -58094,7 +58272,7 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "tXD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -58151,19 +58329,6 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) -"tYQ" = ( -/obj/structure/cable, -/obj/structure/bed/dogbed/mcgriff, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/firealarm/directional/west{ - pixel_y = 26 - }, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 9 - }, -/mob/living/basic/pet/dog/pug/mcgriff, -/turf/open/floor/iron, -/area/station/security/warden) "tYS" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Two"; @@ -58250,7 +58415,7 @@ }, /obj/structure/cable, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "uag" = ( /obj/item/radio/intercom/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58312,12 +58477,6 @@ /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 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) "uaR" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, @@ -58356,7 +58515,7 @@ }, /obj/structure/sign/directions/evac, /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ubj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58396,19 +58555,7 @@ /obj/machinery/light/small/directional/east, /obj/machinery/newscaster/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"ubD" = ( -/obj/structure/rack, -/obj/machinery/firealarm/directional/west, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/clothing/suit/hazardvest, -/obj/item/multitool, -/obj/effect/spawner/random/maintenance, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/storage/tools) +/area/station/ai/satellite/chamber) "ubF" = ( /obj/structure/table, /obj/item/reagent_containers/cup/beaker{ @@ -58610,7 +58757,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/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer5, @@ -58743,7 +58890,7 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) @@ -58825,7 +58972,7 @@ "ukk" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ukm" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -59061,7 +59208,7 @@ }, /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "uoM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/brig{ @@ -59136,7 +59283,7 @@ name = "Research Division Access" }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -59312,6 +59459,7 @@ /obj/machinery/atmospherics/components/unary/airlock_pump{ dir = 4 }, +/obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/station/hallway/secondary/entry) "usC" = ( @@ -59455,7 +59603,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "uuO" = ( /obj/machinery/mech_bay_recharge_port{ dir = 8 @@ -59567,7 +59715,7 @@ /obj/structure/cable, /obj/machinery/duct, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -59749,32 +59897,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"uzK" = ( -/obj/structure/table, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable, -/obj/item/pen/blue{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/pen/fountain{ - pixel_x = 10 - }, -/obj/item/pen/red{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/stamp/denied{ - pixel_y = -1 - }, -/obj/item/stamp{ - pixel_x = -9; - pixel_y = -1 - }, -/turf/open/floor/catwalk_floor/iron, -/area/station/cargo/storage) "uAg" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, @@ -60013,7 +60135,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "uEz" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -60050,15 +60172,15 @@ /turf/open/floor/iron, /area/station/cargo/storage) "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, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "uEW" = ( @@ -60108,7 +60230,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "uFy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -60408,7 +60530,7 @@ "uKj" = ( /obj/structure/chair, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "uKx" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -60490,7 +60612,7 @@ name = "AI Chamber Requests Console" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "uLz" = ( /obj/machinery/light/small/directional/east, /obj/machinery/camera/directional/east{ @@ -60499,7 +60621,7 @@ }, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "uLE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -60682,16 +60804,14 @@ /turf/open/floor/iron, /area/station/hallway/primary/starboard) "uPi" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/light/floor, -/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/cryo) "uPp" = ( @@ -60966,7 +61086,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "uVd" = ( /obj/structure/chair{ dir = 8 @@ -61051,15 +61171,11 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) -"uWk" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall, -/area/station/science/xenobiology/hallway) "uWn" = ( /obj/machinery/nuclearbomb/selfdestruct, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "uWo" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /turf/open/floor/iron, @@ -61082,7 +61198,8 @@ }, /obj/machinery/light/directional/east, /obj/structure/sign/painting/library_secure{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/effect/spawner/random/decoration/statue{ spawn_loot_chance = 50 @@ -61098,7 +61215,7 @@ name = "Theater Backstage" }, /obj/effect/mapping_helpers/airlock/access/all/service/theatre, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/door/firedoor, /turf/open/floor/wood, /area/station/service/theater) @@ -61187,10 +61304,7 @@ /turf/closed/wall, /area/station/medical/break_room) "uYD" = ( -/obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port) "uYE" = ( @@ -61347,19 +61461,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, /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) "vaY" = ( /obj/item/storage/bag/trash, /obj/machinery/airalarm/directional/west, @@ -61418,7 +61519,7 @@ /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "vbL" = ( /obj/machinery/door/airlock/research{ name = "Ordnance Lab" @@ -61620,7 +61721,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "vgZ" = ( /obj/structure/table/glass, /obj/structure/cable, @@ -61712,7 +61813,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/item/poster/traitor, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "viF" = ( /obj/machinery/computer/upload/borg, /obj/machinery/door/window/left/directional/south{ @@ -61723,7 +61824,7 @@ /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "viH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/structure/window/reinforced, @@ -61901,7 +62002,7 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -61959,7 +62060,7 @@ "vly" = ( /obj/item/target/alien/anchored, /obj/machinery/camera/preset/ordnance{ - dir = 5 + pixel_x = 10 }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless{ @@ -62009,7 +62110,7 @@ "vmk" = ( /obj/machinery/status_display/ai/directional/west, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "vmp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62031,17 +62132,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) -"vmX" = ( -/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, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "vnk" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -62067,7 +62157,7 @@ network = list("aicore") }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "vnp" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -62310,7 +62400,7 @@ dir = 8 }, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "vrP" = ( /obj/structure/cable, /obj/structure/table/reinforced, @@ -62633,11 +62723,11 @@ "vwN" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/greater) "vwP" = ( @@ -62725,17 +62815,6 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron, /area/station/science/research) -"vxW" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/anesthetic_mix, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) "vye" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -62745,10 +62824,6 @@ /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) "vyv" = ( /obj/structure/table, /obj/machinery/status_display/ai/directional/west, @@ -62761,7 +62836,7 @@ }, /obj/item/ai_module/supplied/freeform, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "vyy" = ( /obj/machinery/washing_machine, /obj/effect/decal/cleanable/dirt, @@ -62776,7 +62851,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "vyZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -63017,11 +63092,13 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "vDz" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 +/obj/structure/chair/office/light, +/obj/effect/turf_decal/siding/blue{ + dir = 1 }, -/turf/open/floor/iron/white, -/area/station/medical/office) +/obj/effect/landmark/start/paramedic, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/paramedic) "vDV" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -63278,6 +63355,15 @@ }, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos/storage/gas) +"vGI" = ( +/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/warning{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "vGN" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -63327,13 +63413,17 @@ /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/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical/glass{ + name = "Paramedic Dispatch Room" }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/white, -/area/station/medical/office) +/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/medical/paramedic, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "vIz" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 8 @@ -63462,7 +63552,8 @@ "vKt" = ( /obj/structure/table/wood/fancy/royalblue, /obj/structure/sign/painting/library_secure{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/effect/spawner/random/decoration/statue{ spawn_loot_chance = 50 @@ -63496,7 +63587,6 @@ /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 4 }, -/obj/effect/landmark/start/paramedic, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "vLi" = ( @@ -63565,6 +63655,21 @@ /obj/machinery/portable_atmospherics/canister/water_vapor, /turf/open/floor/iron, /area/station/service/janitor) +"vMj" = ( +/obj/machinery/door/airlock/security/glass{ + id_tag = "innerbrig"; + name = "Brig" + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "brig-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/entrance, +/turf/open/floor/iron, +/area/station/security/brig) "vMw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63648,7 +63753,7 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/command/maintenance, @@ -63787,9 +63892,14 @@ /turf/open/floor/wood, /area/station/service/theater) "vQI" = ( -/obj/structure/sign/warning/pods, -/turf/closed/wall/r_wall, -/area/station/security/brig) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/sign/warning/pods/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "vQO" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -63986,7 +64096,7 @@ /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/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, @@ -64113,19 +64223,13 @@ /obj/item/multitool, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"vVI" = ( -/obj/structure/table/glass, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) +/area/station/ai/satellite/maintenance/storage) "vVM" = ( /obj/effect/turf_decal/bot_white/right, /obj/structure/closet/crate/goldcrate, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "vVV" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -64305,21 +64409,6 @@ /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) -"vYF" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - id_tag = "innerbrig"; - name = "Brig" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "brig-entrance" - }, -/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, @@ -64347,6 +64436,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"vYP" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/atmos) "vZb" = ( /obj/machinery/disposal/bin{ desc = "A pneumatic waste disposal unit. This one leads to the morgue."; @@ -64471,6 +64572,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/service/hydroponics) +"wau" = ( +/obj/structure/table, +/obj/item/stack/cable_coil, +/obj/machinery/firealarm/directional/west, +/obj/item/stack/cable_coil{ + pixel_x = -1; + pixel_y = -3 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) "waB" = ( /obj/machinery/door/airlock/external/glass{ name = "Supply Door Airlock" @@ -64492,20 +64603,16 @@ /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, +/obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron, /area/station/hallway/primary/central) "waH" = ( @@ -64688,13 +64795,6 @@ /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"; - name = "BOMB RANGE" - }, -/turf/closed/wall, -/area/station/science/ordnance/bomb) "wev" = ( /obj/structure/rack, /obj/item/storage/box, @@ -64715,7 +64815,7 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/central) @@ -64853,12 +64953,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) -"wgw" = ( -/obj/structure/sign/warning/secure_area{ - name = "\improper STAY CLEAR HEAVY MACHINERY" - }, -/turf/closed/wall, -/area/station/maintenance/port/fore) "wgP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64982,7 +65076,7 @@ "wiF" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/delivery, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "wiS" = ( @@ -65022,7 +65116,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "wjT" = ( /obj/structure/cable, /obj/machinery/power/terminal{ @@ -65033,13 +65127,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) -"wkh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/brig) "wki" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/wood, @@ -65118,6 +65205,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/storage/tools) +"wlQ" = ( +/obj/structure/closet/secure_closet/atmospherics, +/obj/structure/sign/warning/radiation/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) "wlZ" = ( /obj/machinery/status_display/evac/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer4, @@ -65215,7 +65307,7 @@ }, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "wnW" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -65261,6 +65353,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) +"woU" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/delivery, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "woV" = ( /obj/machinery/door/window/left/directional/north, /turf/open/floor/iron/grimy, @@ -65322,7 +65420,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "wpK" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral{ @@ -65429,7 +65527,7 @@ /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/ai_monitored/security/armory) +/area/station/security/armory) "wss" = ( /obj/machinery/status_display/evac/directional/north, /obj/item/folder/yellow{ @@ -65461,12 +65559,12 @@ /obj/machinery/door/airlock/medical/glass{ name = "Cryogenics Bay" }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "wsx" = ( @@ -65554,7 +65652,7 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer5, @@ -65606,7 +65704,7 @@ "wtB" = ( /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "wtD" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/wall_healer/directional/east, @@ -65647,7 +65745,7 @@ "wuM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "wvd" = ( /obj/machinery/door/airlock{ id_tag = "Cabin5"; @@ -65953,7 +66051,7 @@ "wzH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "wzK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65996,6 +66094,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"wAI" = ( +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/floor/carpet, +/area/station/command/bridge) "wBe" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -66142,6 +66244,18 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) +"wCR" = ( +/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/structure/sign/warning/secure_area/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "wCS" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -66297,6 +66411,14 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron, /area/station/service/hydroponics) +"wFP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/landmark/firealarm_sanity, +/turf/open/floor/iron, +/area/station/security/brig) "wGa" = ( /obj/machinery/camera/directional/west{ c_tag = "Central Primary Hallway - Starboard - Art Storage" @@ -66380,6 +66502,13 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"wHr" = ( +/obj/machinery/flasher/directional/east{ + id = "hopflash"; + pixel_x = 0 + }, +/turf/closed/wall/r_wall, +/area/station/hallway/secondary/command) "wHu" = ( /turf/closed/wall, /area/station/science/lobby) @@ -66394,20 +66523,6 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) -"wHK" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Arrivals - Station Entrance" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer5, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "wHL" = ( /obj/machinery/vending/wardrobe/bar_wardrobe, /obj/item/radio/intercom/directional/east, @@ -66426,7 +66541,7 @@ /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "wIa" = ( /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, @@ -66532,7 +66647,7 @@ /area/station/maintenance/department/engine) "wLx" = ( /obj/structure/closet/wardrobe/mixed, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/locker) @@ -66593,7 +66708,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "wNp" = ( /obj/structure/bed, /obj/effect/decal/cleanable/cobweb, @@ -66655,12 +66770,6 @@ /obj/item/mop, /turf/open/floor/iron, /area/station/service/janitor) -"wOz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/office) "wOB" = ( /obj/machinery/vending/wardrobe/engi_wardrobe, /obj/effect/turf_decal/delivery, @@ -66740,7 +66849,7 @@ req_access = list("ai_upload") }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "wPB" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine/air, @@ -66833,6 +66942,16 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"wQE" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/sign/warning/directional/southeast, +/turf/open/floor/plating/airless, +/area/station/science/ordnance/bomb) "wQI" = ( /obj/machinery/door/poddoor/shutters/preopen{ dir = 8; @@ -66874,18 +66993,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"wRB" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/firealarm/directional/west, -/obj/structure/table/wood, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) "wRD" = ( /obj/effect/decal/cleanable/dirt, /obj/item/mmi, @@ -66974,7 +67081,7 @@ /obj/item/pen, /obj/item/papercutter, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "wTs" = ( /obj/item/radio/intercom/directional/south, /obj/machinery/camera/directional/south{ @@ -66983,6 +67090,15 @@ /obj/structure/reagent_dispensers/fueltank/large, /turf/open/floor/iron, /area/station/engineering/atmos) +"wTM" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/machinery/computer/records/medical{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "wTO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -67021,13 +67137,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"wUG" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/trimline/blue/filled/warning, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "wUH" = ( /obj/machinery/camera/directional/west{ c_tag = "Medbay Break Room"; @@ -67182,7 +67291,7 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -67211,6 +67320,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron, /area/station/hallway/primary/central) "wYl" = ( @@ -67443,7 +67553,7 @@ }, /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "xdF" = ( /obj/structure/girder, /turf/open/floor/plating, @@ -67477,7 +67587,7 @@ /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) +/area/station/ai/satellite/exterior) "xeN" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -67593,43 +67703,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron, /area/station/cargo/storage) -"xgi" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/bot, -/obj/item/bodypart/arm/right/robot{ - pixel_x = 3 - }, -/obj/item/bodypart/arm/left/robot{ - pixel_x = -3 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/firealarm/directional/west, -/obj/item/assembly/flash/handheld{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/machinery/ecto_sniffer{ - pixel_x = -6; - pixel_y = 6 - }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) "xgn" = ( /obj/structure/table/glass, /obj/effect/turf_decal/siding/white{ @@ -67677,7 +67750,7 @@ /obj/structure/cable/multilayer/connected, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "xgG" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/rack, @@ -67711,7 +67784,7 @@ /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "xhb" = ( /obj/machinery/meter, /obj/effect/decal/cleanable/dirt, @@ -67818,7 +67891,7 @@ pixel_x = -8 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "xje" = ( /obj/machinery/duct, /turf/open/floor/plating, @@ -67921,7 +67994,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "xkE" = ( /obj/machinery/recharge_station, /obj/effect/landmark/start/hangover, @@ -67993,7 +68066,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "xlW" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -68419,7 +68492,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "north-maint-viewingdeck" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, @@ -68517,7 +68590,7 @@ "xvd" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "xvf" = ( @@ -68617,6 +68690,11 @@ "xww" = ( /turf/closed/wall/r_wall, /area/station/engineering/storage/tech) +"xwC" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/wood, +/area/station/service/library) "xwD" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, /turf/open/floor/iron/white, @@ -68664,6 +68742,7 @@ "xxk" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) "xxF" = ( @@ -68714,7 +68793,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "xyq" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -68922,7 +69001,7 @@ dir = 6 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "xCf" = ( /obj/item/clothing/suit/jacket/straight_jacket, /obj/item/electropack, @@ -68960,7 +69039,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "xCx" = ( /obj/item/stack/package_wrap, /obj/item/stack/package_wrap, @@ -69119,7 +69198,8 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/delivery, /obj/structure/sign/map/meta/right{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) @@ -69185,7 +69265,8 @@ /area/station/medical/medbay/lobby) "xFx" = ( /obj/structure/sign/map/meta/right{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) @@ -69227,7 +69308,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "xGT" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, @@ -69384,11 +69465,11 @@ /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) "xKd" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 +/obj/structure/sign/directions/engineering{ + dir = 4 }, -/turf/open/space/basic, -/area/space/nearstation) +/turf/closed/wall/r_wall, +/area/station/engineering/storage/tcomms) "xKh" = ( /obj/structure/railing{ dir = 10 @@ -69565,7 +69646,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "service-passthrough" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) @@ -69593,6 +69674,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"xOB" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/nanotrasen/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "xOF" = ( /obj/docking_port/stationary/laborcamp_home{ dir = 8 @@ -69715,7 +69805,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "xQO" = ( /obj/structure/table/glass, /obj/item/reagent_containers/cup/bottle/morphine{ @@ -69842,6 +69932,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/item/radio/intercom/directional/west, /obj/machinery/light/directional/west, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "xTg" = ( @@ -69868,19 +69961,9 @@ }, /turf/open/floor/iron/dark, /area/station/medical/break_room) -"xUb" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "xUh" = ( /obj/structure/closet/wardrobe/pjs, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/dorms) @@ -70122,7 +70205,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "xXM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/chair, @@ -70130,7 +70213,8 @@ dir = 1 }, /obj/structure/sign/map/meta/left{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) @@ -70657,7 +70741,7 @@ /area/station/engineering/atmos) "yfL" = ( /turf/closed/wall, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "yfT" = ( /obj/structure/table/wood, /obj/item/pen/red, @@ -70731,19 +70815,6 @@ /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{ - dir = 4; - name = "Cargo Deliveries" - }, -/obj/effect/turf_decal/siding/white, -/obj/effect/turf_decal/trimline/brown/warning, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/medical/medbay/lobby) "yhu" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -70801,21 +70872,23 @@ }, /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") +"yiB" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"yiH" = ( +/obj/machinery/computer/prisoner/management{ + dir = 8 }, -/obj/machinery/fax{ - fax_name = "Medical"; - name = "Medical Fax Machine" +/obj/effect/turf_decal/trimline/dark_red/filled/line{ + dir = 4 }, -/obj/structure/noticeboard/directional/north, -/obj/structure/sign/clock/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/office) +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/security/warden) "yiJ" = ( /obj/structure/chair/sofa/right/brown, /obj/item/toy/plush/moth{ @@ -70911,23 +70984,16 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "ylf" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/west{ - name = "First Aid Supplies"; - req_access = list("medical") - }, -/obj/item/clothing/glasses/blindfold{ - pixel_y = 3 +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 }, +/obj/structure/table/glass, +/obj/item/clothing/glasses/blindfold, /obj/item/clothing/glasses/blindfold, -/obj/item/clothing/ears/earmuffs{ - pixel_y = 3 - }, /obj/item/clothing/ears/earmuffs, -/obj/item/clothing/glasses/eyepatch, -/obj/item/clothing/suit/jacket/straight_jacket, -/turf/open/floor/iron/dark, -/area/station/medical/office) +/obj/item/clothing/ears/earmuffs, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "ylt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70972,10 +71038,6 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"yme" = ( -/obj/structure/sign/warning/pods, -/turf/closed/wall, -/area/station/security/checkpoint/customs) (1,1,1) = {" aaa @@ -80338,7 +80400,7 @@ aaa aaa wdr vvW -mtL +wdr kFT nDP qEt @@ -83185,7 +83247,7 @@ eIa vNM wdr lMJ -lXm +qEt jrY qEt lMJ @@ -83456,7 +83518,7 @@ pOa aox aox aox -euT +aox aox aaa aaa @@ -83970,7 +84032,7 @@ iCx pOa dlL qgf -gDZ +aOs jUb jUb nBy @@ -84462,7 +84524,7 @@ lCD fSJ lCD lCD -wHK +kAw wwI lCD vAe @@ -84973,7 +85035,7 @@ fcq xjh qhW xjh -yme +xjh fxI tep dHc @@ -85275,7 +85337,7 @@ aaa aaa lMJ aox -pZW +lMJ aaa aaa xjH @@ -85789,7 +85851,7 @@ jUb jUb jUb oDs -aCW +oUJ nBy aaa xjH @@ -87519,7 +87581,7 @@ com hKg hKg xXR -kat +hKg hKg pnI hKg @@ -87529,7 +87591,7 @@ aaa hxo bnA riU -oDJ +cbz lAa fyz hxo @@ -88281,7 +88343,7 @@ dwI iPE vfv wXv -qCm +diI tXO jXu iGB @@ -88537,7 +88599,7 @@ ggZ isO gYE uEC -wgw +jXu twr fpn jXu @@ -88634,7 +88696,7 @@ gAf tSw tSw aaa -gda +lAu aaa aaa sGL @@ -89147,7 +89209,7 @@ tSw aBQ qEf qEf -aIl +xOB gXF atk bhS @@ -89823,7 +89885,7 @@ dwH fUr fUr fUr -fUr +ilF bkJ iIE cAf @@ -89847,7 +89909,7 @@ dfk rQD nsh vWD -uzK +jGH liU nrB smB @@ -89881,7 +89943,7 @@ pOa pOa pOa aDl -pOa +ayH kRA jUb xYq @@ -90128,7 +90190,7 @@ wki jIY mjr bXQ -cxC +xwC saN tPe sVY @@ -90141,8 +90203,8 @@ uOH ubp tTF jUb -dqN -qKs +iBf +mWW jUb jUb mqz @@ -90396,10 +90458,10 @@ bCr pOa bAA pOa -vZE +pOa +jUb +jUb jUb -iBf -mWW jUb kpB dIK @@ -90596,8 +90658,8 @@ ieD gnR ggW jXu -fpn -knQ +siY +sHu bPM sHu mkz @@ -90651,14 +90713,14 @@ kJx lIa xjC pOa -uOH -pOa -pOa -jUb -jUb -jUb -jUb -hfi +jED +fyA +gSt +jGZ +lYG +uiM +nVq +dIK jUb jUb sSp @@ -90692,7 +90754,7 @@ oxj sbs tSw lah -mPH +vUM fje jgW tSw @@ -90910,13 +90972,13 @@ nZq pOa iar uYD -sSn -nDT -lYG -uiM -nVq -dIK -jUb +nZX +nZX +nZX +lxj +nZX +nZX +sSp kpi stZ tuC @@ -90924,7 +90986,7 @@ rDJ guC fTE hBY -vVI +bKl gmN vun iRy @@ -91166,14 +91228,14 @@ utt wLu pOa uAM -vZE -pOa -jUb -jUb +nku +nZX +mpV +izs fYc -jUb -jUb -jUb +gvd +aCZ +sSp ina drE vfa @@ -91423,13 +91485,13 @@ pEH pEH pOa shl -cIW -pOa -mpV -izs +fRt +nZX +xYM +jFF dOz -gvd -grm +aSe +jeL sSp wvP wUQ @@ -91681,12 +91743,12 @@ knK sQx kir vXH -pOa -xYM -jFF +sHd +pBs +lgC gtd -aSe -jeL +cej +phi jxc tuC iMv @@ -91888,9 +91950,9 @@ rlU qrg cpi cpi -nSn -qpD -qYC +pEl +rlU +gda pNC uqX loR @@ -91938,9 +92000,9 @@ sVY pOa sQY nPt -qSk -pBs -lgC +nZX +hCy +jkT avb uPi sfF @@ -91979,7 +92041,7 @@ tSw wZA vpP tSw -wRB +tBO iix cvy xvf @@ -92170,7 +92232,7 @@ rBB kJk xJj gZq -aiy +ott oor mnP tEr @@ -92195,11 +92257,11 @@ sVY vXH sQY tWq -pOa -hCy -jkT -gdp -eRc +nZX +ubP +jqQ +mbV +hEA qNi jxc gNT @@ -92402,7 +92464,7 @@ rlU vbF wHW wHW -okj +khC rlU qYC pNC @@ -92416,7 +92478,7 @@ kQP kQP kQP kQP -rcR +lVp sZP pxK tAV @@ -92452,12 +92514,12 @@ sVY clp etn ayH -pOa -ubP -jqQ -mbV -hEA -vxW +bMY +bMY +pYw +lyh +pYw +bMY sSp jFB bHE @@ -92473,7 +92535,7 @@ wIF wWs fOu fBJ -piJ +wTM rvb nsD tFr @@ -92669,7 +92731,7 @@ hTM aHt aHt aHt -eaQ +jMg aHt qlW jfg @@ -92709,12 +92771,12 @@ sVY pOa qZn pOa -pOa bMY -oNP +cbV +fFV odu -oNP -bMY +rEu +qEP sSp sAv pSl @@ -92734,7 +92796,7 @@ opD vun gQG tFr -oqi +nMf sDJ uYp pCl @@ -92965,8 +93027,8 @@ sVY sVY xxk ahr +lvU bMY -yim rvq fFi iWD @@ -92984,7 +93046,7 @@ mpk pyU vun eFG -cBH +lWX hwe iZn rar @@ -93206,7 +93268,7 @@ guR lsf usA vLi -vmX +mJO usA keR xuS @@ -93218,11 +93280,11 @@ usA vLi usA jWg -tKu +kJf bBA txz wYe -bMY +dYa pUM mna gVn @@ -93479,22 +93541,22 @@ gUt dvZ qQm waF +pkn bMY bMY -nur -jfr +pYw vIn pYw -irL -oNP +bMY +fEK rEt xST -pLz +dpI dpI ttE ttE sZH -wUG +yiB eGJ rpw gQG @@ -93506,7 +93568,7 @@ pLz lgT hDp sOn -xUb +qGw ePg eMI jfN @@ -93737,11 +93799,11 @@ vVV htd tAG gDv -oNP +cjb iPM -eRX +mvY oYp -wOz +mvY mvY rne bXX @@ -93992,12 +94054,12 @@ tOh tOh nNY hPM -xAb -dYa -owf -iPM -tPb -bax +ttV +pJU +duu +vGI +xxU +lpk ghc cxt oNP @@ -94251,13 +94313,13 @@ iun htd xAb nvI -oNP +fEK ehE rlw bTm ylf tzI -bMY +fEK uET iZF qyr @@ -94510,7 +94572,7 @@ aum qPJ qPJ qPJ -kOh +ivm qPJ qPJ qPJ @@ -94752,8 +94814,8 @@ lxp qRI urA nIR -hyN -uaN +tOh +mGl jIg dTr rIL @@ -94948,7 +95010,7 @@ cFc tdW xQO tnb -cui +aqv aBL rUG cWI @@ -95531,8 +95593,8 @@ yfL yfL yfL yfL -hyN -qoR +tOh +jpS kON eLv qPJ @@ -95784,7 +95846,7 @@ gBD twl bcx rhK -rKJ +gwG wFe rjz fHd @@ -95794,7 +95856,7 @@ htd ebM uRA mTk -yhm +nTD rbs jHA lln @@ -96034,7 +96096,7 @@ htG bIq pJR mQq -ndS +wHr urA pFG gBD @@ -96239,7 +96301,7 @@ kNY btR btR swe -fNh +bHU wUc mtG uyd @@ -96252,7 +96314,7 @@ jyJ jyJ jyJ jyJ -cJj +dKl klp pHb wsX @@ -96496,7 +96558,7 @@ ndj cWI gCE lAM -osw +lAM lAM rJB ggj @@ -96509,7 +96571,7 @@ xqI gWc oAN iKj -vQI +lAM mCJ lsP ekP @@ -96550,8 +96612,8 @@ bOk tNg vpg ebx -aks -hux +gaO +gBD bbT ilq kAp @@ -97330,8 +97392,8 @@ sYh dVw nBs eLa -vyi -nNY +jzN +hhE htd tHR sTz @@ -97384,9 +97446,9 @@ bxX iUm aAS kJB -biA +woU iUm -xKd +lAu lMJ aaa aaa @@ -97576,8 +97638,8 @@ duI lwt ddm vKL -gmH -lSz +dho +wCR aks qzz qRV @@ -97795,7 +97857,7 @@ aeq dFW fYJ ycM -tYQ +dlf dsk ewC iAN @@ -98123,7 +98185,7 @@ iEK jyt vWn joq -naf +kUA hvs wWk aCE @@ -98134,11 +98196,11 @@ qQY njX njX njX -gSW +mio oAu bxf njX -cRw +jZU uGE njX vNv @@ -98567,7 +98629,7 @@ vDh ewj bkl wZU -pMy +yiH oGH orx eeq @@ -98823,8 +98885,8 @@ aeq jpj ewj ycM -mMM -bkl +mop +ycM ycM bkl bkl @@ -99082,7 +99144,7 @@ ayV gFR khm uok -bzV +vMj ezg uVv pdI @@ -99093,7 +99155,7 @@ olw pxT xEt wXT -jcR +hVQ fky vWI txH @@ -99117,8 +99179,8 @@ duI duI wtX ppB -nEC -gmH +wAI +dho ebx vQe kHn @@ -99140,7 +99202,7 @@ rgZ suW hJF cZK -euw +bto cXg nyy gVl @@ -99150,7 +99212,7 @@ ebV dZb ebV fma -xgi +bYQ sck iwA puP @@ -99339,8 +99401,8 @@ nZk sVi tjv pHb -syc -wkh +iNy +wFP dGW hhp bJq @@ -99386,8 +99448,8 @@ aAI gzi krL cqm -vyi -wpx +jzN +kGP htd tHR udN @@ -99596,7 +99658,7 @@ duF cJj erx lsP -vYF +mKQ eaP fDm bAV @@ -100113,7 +100175,7 @@ pHb qwh mrL fnN -cqd +jTk ieV qhz juj @@ -100148,8 +100210,8 @@ eoD eoD bcT xPN -vQe -kmZ +klN +tvE buL pha sdp @@ -100659,7 +100721,7 @@ syo sYp wBs apw -eVX +qfK syo nue vQe @@ -100704,7 +100766,7 @@ pJl rYI gHw nDw -eBU +jYa aYX vzx gyQ @@ -101653,7 +101715,7 @@ pBG sOZ uWo jMy -eey +gHD aHr mhA xNo @@ -102213,8 +102275,8 @@ tvE tvE aan tvE -kmZ -tsT +tvE +gJh htd dhU dkW @@ -102698,8 +102760,8 @@ iIf pJE uUl cBf -ftM -wEG +cBf +vQI htd vET syo @@ -102963,7 +103025,7 @@ sqM kwQ jZR sqM -cOP +dtE nOj wGa kwQ @@ -102971,7 +103033,7 @@ mmS vLb jmT jZR -mJN +fDb cwP sqM hBr @@ -102982,7 +103044,7 @@ diE dYg hwF diE -ggq +gyW nnR wah wpx @@ -103206,7 +103268,7 @@ rUO gmk qCP mPw -jhc +sqB iPp eVz pJE @@ -103247,8 +103309,8 @@ cfe ddO sLE cEv -cyM -eeT +tGy +hcg tUn hKV fWK @@ -103766,7 +103828,7 @@ qOM tUn ftj wXF -doM +bLq tZo bXg oFT @@ -103987,7 +104049,7 @@ xNv mqK qXB eFR -ubD +eXh usK dZm vFB @@ -104029,7 +104091,7 @@ rCx nBj gYe vQb -mdu +sQQ xPm ohZ sac @@ -104204,7 +104266,7 @@ aaa aaa aaa aaa -mxn +euT yeV hUB qmf @@ -104227,7 +104289,7 @@ fRW qnS uxb hAk -gzO +eve eqn jSb kAF @@ -105643,13 +105705,13 @@ lMJ dxK lMJ lMJ -weq +cxz kJi pgU qRS pnk kJi -weq +cxz aaa aaa aaa @@ -105804,7 +105866,7 @@ sFB mal wIf pmZ -qdI +oBK ttF sRY wDh @@ -105901,11 +105963,11 @@ aaa lMJ kJi kJi -hxV +fiu xhh xhh cmH -grw +jHy kJi kJi aaa @@ -106007,7 +106069,7 @@ cfy oAa peF peF -sSs +nOA gkM plL uKL @@ -106415,11 +106477,11 @@ aaa lMJ kJi kJi -coc +gDe bQk xhh xhh -iYD +wQE kJi kJi aaa @@ -106671,13 +106733,13 @@ lMJ dxK lMJ lMJ -weq +cxz kJi vpl cDb xOI kJi -weq +cxz aaa aaa aaa @@ -107046,7 +107108,7 @@ ewk dtg wcr mMx -edq +cUq wcr mMx qTz @@ -107066,9 +107128,9 @@ dEr ckW aly qXB -edC -psZ -wzK +eYj +wrn +iFl tCS xww hht @@ -107323,7 +107385,7 @@ dkh vcb bjD qXB -kbo +gnk tbd fVt tCS @@ -107377,9 +107439,9 @@ wXF mOD fAI tUn -tId +aah okQ -hEV +oBE bLd uGX xuD @@ -107634,9 +107696,9 @@ wXF wXF wXF wXF -bcb +gFQ gMQ -bcb +gFQ oWk clj xuD @@ -108413,7 +108475,7 @@ nPJ gLi xuD xuD -xuD +aDs jdQ uSM bLd @@ -108670,7 +108732,7 @@ mEL sCM clj uGX -tbI +fPD deD xuD xuD @@ -108678,7 +108740,7 @@ xuD xuD imU mEL -oWc +oWk rYy rUT uIi @@ -109881,7 +109943,7 @@ tCS aeu kSB gon -rux +hYH yaD uXd sVc @@ -109889,7 +109951,7 @@ tfg ssI ssI uXd -kCq +jyZ sXe gLo ofk @@ -109898,7 +109960,7 @@ fDL hSt qhw naN -fMN +lch icR sqE nGA @@ -110418,7 +110480,7 @@ sqE mEO gnS jPf -esk +xKd esk esk vgd @@ -110680,7 +110742,7 @@ mbJ ncd gYO flE -fcA +lpL cVj uKz fnT @@ -111186,7 +111248,7 @@ oWm cuc adz tUw -rHq +lkE peX kRi klw @@ -111425,7 +111487,7 @@ loA tlh loA erh -iHu +bRn xAW lia aXK @@ -112196,13 +112258,13 @@ wbF qaA bMA rao -vaI +djk yaF qaA fTL qaA wgf -jUT +mMH rao qaA haR @@ -112268,8 +112330,8 @@ aaa wmL cvO fjO -hUd -uWk +pSR +wmL aaa aaa aaa @@ -112453,13 +112515,13 @@ kYG sGC vuJ sGC -cFu +kYG kYG sGC wBM sGC dOs -cFu +kYG sGC pqb sNt @@ -113039,7 +113101,7 @@ eYu agN bXs bvg -juH +kZo pJA hLJ oMA @@ -114785,7 +114847,7 @@ fJy fJy fJy pnJ -dKl +fJy fJy byR iFh @@ -115830,7 +115892,7 @@ vRS gyJ qLU fFA -nGq +vYP kRf uQe pul @@ -117148,7 +117210,7 @@ nEb jCO caf tgm -gKD +rgH fdZ fdZ fdZ @@ -117367,7 +117429,7 @@ aaa vhv vhv vhv -sCp +vhv mUL isr eDc @@ -117623,8 +117685,8 @@ aaa aaa vhv sZI -trG -hEX +wau +wlQ vTX vTX gSu @@ -119173,8 +119235,8 @@ nqR oog vTX jTS -sCp -kJO +vhv +cAr cyW jvj pul @@ -119204,7 +119266,7 @@ rDf eUe eSb nnc -nnc +mtL nnc rvK nnc @@ -122748,10 +122810,10 @@ aaa aaa aaa lMJ -beq +ghL qmR cUI -beq +ghL blx qZX hml @@ -124294,7 +124356,7 @@ gfU gfU gfU gfU -evI +lhI abR pfe cok @@ -125062,7 +125124,7 @@ jEr lro aWN aVl -jGa +eBW uLv bjQ bjQ diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 8789106bd6ad..276d55ba7dba 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -20,7 +20,6 @@ /turf/closed/mineral/random/high_chance/volcanic, /area/lavaland/surface/outdoors) "ae" = ( -/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{ @@ -82,12 +81,6 @@ /obj/item/clothing/glasses/meson, /turf/open/floor/iron/dark, /area/mine/storage/public) -"as" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) "av" = ( /obj/machinery/computer/arcade/orion_trail{ dir = 4 @@ -100,15 +93,10 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "aF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet/red, -/area/mine/lobby/raptor) -"aH" = ( -/obj/structure/railing{ - dir = 10 - }, -/turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) "aM" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "lavaland_living_east_maint" @@ -118,7 +106,7 @@ /obj/machinery/door/airlock/external{ name = "Mining External Airlock" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/effect/decal/cleanable/dirt, @@ -153,20 +141,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/mine/maintenance/service) -"aX" = ( -/obj/effect/turf_decal/sand/plating/volcanic, -/obj/structure/railing{ - dir = 9 - }, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) -"ba" = ( -/obj/structure/chair/sofa/middle{ - dir = 1; - color = "#AA4A44" - }, -/turf/open/floor/carpet/red, -/area/mine/lobby/raptor) "bb" = ( /obj/structure/closet/crate/internals, /obj/item/tank/internals/emergency_oxygen, @@ -185,12 +159,19 @@ }, /area/mine/laborcamp/production) "be" = ( -/obj/machinery/door/airlock/external/glass{ - name = "Raptor Ranch External Airlock" +/obj/structure/railing{ + dir = 6 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating/lavaland_atmos, -/area/mine/lobby/raptor) +/obj/structure/table/wood, +/obj/item/raptor_dex, +/obj/item/raptor_dex{ + pixel_y = 7 + }, +/obj/item/raptor_dex{ + pixel_y = 13 + }, +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "bf" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large, @@ -234,10 +215,6 @@ }, /turf/open/floor/plating, /area/mine/maintenance/production) -"bE" = ( -/obj/structure/table/wood, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) "bH" = ( /obj/structure/table, /obj/item/book/manual/chef_recipes{ @@ -398,8 +375,6 @@ /area/mine/maintenance/production) "cy" = ( /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, /turf/open/floor/iron/white/smooth_corner{ dir = 8 @@ -630,18 +605,22 @@ /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) "dF" = ( -/obj/structure/table/wood, -/obj/item/food/meat/slab, -/obj/item/food/meat/slab{ - pixel_x = 6; - pixel_y = 5 +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_y = 12; + pixel_x = 10 + }, +/obj/structure/chair/plastic{ + dir = 4 }, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "dI" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating/lavaland_atmos, -/area/mine/lobby/raptor) +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/flora/ash/fireblossom, +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "dJ" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -699,10 +678,17 @@ /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_edge{ dir = 8 }, /area/mine/laborcamp/production) +"ep" = ( +/obj/structure/sign/directions/evac/directional/south{ + pixel_y = 0 + }, +/turf/closed/wall, +/area/mine/production) "et" = ( /obj/structure/stone_tile/block/cracked{ dir = 4 @@ -782,11 +768,12 @@ }, /area/mine/cafeteria) "eL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/carpet/red, -/area/mine/lobby/raptor) +/obj/structure/railing{ + dir = 9 + }, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) "eN" = ( /obj/structure/chair/wood{ dir = 1 @@ -834,9 +821,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/mine/laborcamp/security/maintenance) -"fa" = ( -/turf/open/floor/carpet/red, -/area/mine/lobby/raptor) "fb" = ( /obj/structure/railing/corner{ dir = 4 @@ -847,6 +831,7 @@ "fe" = ( /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_large, /area/mine/laborcamp/production) "ff" = ( @@ -875,6 +860,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/mine/laborcamp) "fo" = ( @@ -1239,7 +1225,6 @@ /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, /obj/item/radio/intercom/directional/south, @@ -1289,8 +1274,10 @@ /turf/open/floor/iron/freezer, /area/mine/living_quarters) "hl" = ( -/obj/structure/tank_holder/extinguisher, -/turf/open/misc/asteroid/basalt/lava_land_surface, +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/turf/open/misc/hay/lavaland, /area/lavaland/surface/outdoors) "hn" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -1410,13 +1397,6 @@ /obj/structure/stone_tile, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"hM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) "hR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1456,6 +1436,7 @@ name = "Infirmary" }, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/side{ dir = 1 }, @@ -1516,10 +1497,6 @@ /obj/item/clothing/glasses/meson, /turf/open/floor/iron/dark, /area/mine/storage/public) -"il" = ( -/obj/item/flashlight/lantern/on, -/turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) "io" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1676,6 +1653,13 @@ }, /turf/open/floor/iron/freezer, /area/mine/laborcamp) +"jn" = ( +/obj/structure/ore_vent/starter_resources{ + icon_state = "ore_vent_active" + }, +/obj/effect/landmark/mining_center, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "jq" = ( /obj/structure/table, /obj/item/paper_bin, @@ -1707,9 +1691,22 @@ /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) "jt" = ( -/obj/structure/fireplace, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) +/obj/effect/turf_decal/trimline/yellow/filled/arrow_cw{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/arrow_cw{ + 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/dark/textured_corner{ + dir = 1 + }, +/area/mine/production) "jw" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -1754,11 +1751,6 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) -"jJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) "jL" = ( /obj/structure/stone_tile/surrounding_tile, /obj/structure/stone_tile/surrounding_tile{ @@ -1809,12 +1801,23 @@ }, /area/mine/production) "jX" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 +/obj/effect/turf_decal/trimline/yellow/filled/arrow_cw{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/arrow_cw{ + 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/structure/tank_holder/extinguisher, +/turf/open/floor/iron/dark/textured_corner{ + dir = 8 }, -/turf/open/floor/wood/large, -/area/mine/lobby/raptor) +/area/mine/production) "ka" = ( /obj/structure/table, /obj/machinery/newscaster/directional/north, @@ -1826,18 +1829,16 @@ /turf/open/floor/iron/checker, /area/mine/cafeteria) "kf" = ( -/obj/structure/railing{ - dir = 9 +/obj/effect/turf_decal/sand/plating/volcanic, +/obj/structure/marker_beacon/purple, +/obj/structure/railing/corner/end/flip{ + dir = 8 }, -/turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) "kg" = ( /turf/closed/wall/r_wall, /area/mine/laborcamp) -"ki" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating/lavaland_atmos, -/area/mine/lobby/raptor) "kk" = ( /obj/structure/stone_tile/block{ dir = 8 @@ -2186,12 +2187,15 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/door/airlock/external/glass{ name = "Mining Shuttle Airlock" }, /obj/effect/mapping_helpers/airlock/access/any/supply/mining, -/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark/textured_large, /area/mine/production) "lN" = ( @@ -2321,17 +2325,6 @@ }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"mk" = ( -/obj/structure/table/wood, -/obj/item/raptor_dex{ - pixel_y = 13 - }, -/obj/item/raptor_dex{ - pixel_y = 7 - }, -/obj/item/raptor_dex, -/turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) "ml" = ( /obj/structure/stone_tile/block/cracked{ dir = 8 @@ -2412,7 +2405,7 @@ /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -2745,12 +2738,6 @@ /obj/effect/spawner/random/trash/food_packaging, /turf/open/floor/iron/checker, /area/mine/laborcamp) -"nO" = ( -/obj/structure/railing{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) "nP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/scrubber, @@ -2851,7 +2838,6 @@ /turf/open/floor/iron/dark, /area/mine/production) "oq" = ( -/obj/structure/cable, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large, /area/mine/laborcamp/production) @@ -2929,14 +2915,9 @@ /turf/open/floor/iron/dark, /area/mine/laborcamp) "oO" = ( -/obj/machinery/door/airlock/external/glass{ - name = "Mining External Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating/lavaland_atmos, -/area/mine/lobby/raptor) +/obj/structure/railing, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "oS" = ( /obj/machinery/door/airlock/external/glass{ name = "Mining External Airlock" @@ -3008,7 +2989,6 @@ "pp" = ( /obj/effect/spawner/random/trash/graffiti, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/mine/laborcamp/production) "pq" = ( @@ -3083,12 +3063,6 @@ }, /turf/open/floor/plating, /area/mine/laborcamp) -"pF" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/carpet/red, -/area/mine/lobby/raptor) "pH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3115,9 +3089,20 @@ /turf/open/floor/iron/freezer, /area/mine/laborcamp/quarters) "pM" = ( -/obj/structure/bookcase/random/reference, -/turf/open/floor/wood, -/area/mine/lobby/raptor) +/obj/effect/turf_decal/trimline/yellow/filled/arrow_ccw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/arrow_ccw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/mid_joiner{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_corner, +/area/mine/production) "pO" = ( /obj/machinery/shower/directional/south, /obj/machinery/door/window/left/directional/south, @@ -3127,7 +3112,6 @@ "pP" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/mine/laborcamp/production) "pQ" = ( @@ -3277,11 +3261,6 @@ }, /turf/open/floor/iron/dark, /area/mine/laborcamp/security) -"qB" = ( -/obj/machinery/smartfridge/drying/rack, -/obj/item/food/cheese/firm_cheese, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) "qH" = ( /obj/machinery/door/airlock{ id_tag = "miningbathroomprivate"; @@ -3341,35 +3320,12 @@ }, /turf/open/floor/plating/lavaland_atmos, /area/lavaland/surface/outdoors) -"rf" = ( -/obj/machinery/airalarm/directional/north, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) "rj" = ( -/obj/item/food/grown/grass/fairy{ - name = "weird hay"; - desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"; - pixel_y = -1; - pixel_x = 5 - }, -/obj/item/food/grown/grass/fairy{ - name = "weird hay"; - desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"; - pixel_y = 9; - pixel_x = 8 - }, -/obj/item/food/grown/grass/fairy{ - name = "weird hay"; - desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"; - pixel_y = 9; - pixel_x = 2 - }, -/obj/item/food/grown/grass/fairy{ - name = "weird hay"; - desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?" - }, +/obj/structure/railing, +/obj/structure/table/wood, +/obj/item/flashlight/lantern/on, /turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) +/area/lavaland/surface/outdoors) "rm" = ( /obj/structure/sign/warning/gas_mask/directional/west, /obj/effect/decal/cleanable/dirt, @@ -3412,12 +3368,13 @@ /turf/open/floor/plating, /area/mine/maintenance/service) "rB" = ( -/obj/structure/chair/sofa/corner{ - dir = 1; - color = "#AA4A44" +/obj/effect/turf_decal/sand/plating/volcanic, +/obj/structure/railing/corner/end/flip{ + dir = 4 }, -/turf/open/floor/carpet/red, -/area/mine/lobby/raptor) +/obj/structure/marker_beacon/purple, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) "rF" = ( /turf/closed/wall/r_wall, /area/mine/maintenance/labor) @@ -3488,11 +3445,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/maintenance/service) -"sa" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lantern/on, -/turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) "se" = ( /turf/open/floor/iron/dark/textured_large, /area/mine/eva) @@ -3589,10 +3541,6 @@ "sO" = ( /turf/open/floor/plating, /area/mine/maintenance/service) -"sQ" = ( -/obj/structure/ore_container/food_trough/raptor_trough, -/turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) "sR" = ( /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, @@ -3666,12 +3614,11 @@ }, /area/mine/cafeteria) "tf" = ( -/obj/structure/chair/sofa/corner{ - dir = 8; - color = "#AA4A44" +/obj/structure/railing{ + dir = 8 }, -/turf/open/floor/carpet/red, -/area/mine/lobby/raptor) +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "tg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/maintenance{ @@ -3735,8 +3682,6 @@ "tB" = ( /obj/structure/bed, /obj/item/bedsheet, -/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{ dir = 6 }, @@ -3861,10 +3806,6 @@ }, /turf/open/floor/iron/white/smooth_edge, /area/mine/cafeteria) -"uw" = ( -/obj/effect/spawner/random/lavaland_mob/raptor, -/turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) "ux" = ( /obj/machinery/door/airlock{ id_tag = "miningdorm1"; @@ -3880,6 +3821,7 @@ /obj/effect/turf_decal/siding/wideplating_new{ dir = 9 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/checker, /area/mine/laborcamp) "uD" = ( @@ -3937,8 +3879,8 @@ /turf/open/floor/iron/dark/smooth_edge, /area/mine/laborcamp/security) "vb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_corner, /area/mine/medical) "vc" = ( @@ -4028,14 +3970,24 @@ /turf/open/floor/plating, /area/mine/hydroponics) "vr" = ( -/obj/structure/railing{ - dir = 1 +/obj/effect/turf_decal/trimline/yellow/filled/arrow_ccw{ + dir = 8 }, -/turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) +/obj/effect/turf_decal/trimline/red/filled/arrow_ccw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/mid_joiner{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_edge{ + dir = 8 + }, +/area/mine/production) "vu" = ( /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, /area/mine/medical) @@ -4094,6 +4046,7 @@ /area/mine/living_quarters) "vJ" = ( /obj/item/cigbutt, +/obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/mine/laborcamp/production) "vL" = ( @@ -4101,14 +4054,6 @@ /obj/item/cigbutt, /turf/open/floor/iron/smooth, /area/mine/laborcamp) -"vM" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/mine/lobby/raptor) "vN" = ( /obj/machinery/computer/records/security, /obj/structure/cable, @@ -4161,11 +4106,12 @@ /turf/open/floor/iron/checker, /area/mine/laborcamp) "wa" = ( -/obj/machinery/camera/autoname/directional/north{ - network = list("mine") +/obj/structure/railing{ + dir = 4 }, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) +/obj/structure/ore_container/food_trough/raptor_trough, +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "wb" = ( /obj/structure/chair{ dir = 8 @@ -4648,7 +4594,11 @@ /turf/open/floor/plating, /area/mine/maintenance/service) "ze" = ( -/turf/open/misc/ashplanet/rocky, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/ore_container/food_trough/raptor_trough, +/turf/open/misc/hay/lavaland, /area/lavaland/surface/outdoors) "zf" = ( /obj/machinery/door/airlock{ @@ -4804,12 +4754,9 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "zX" = ( -/obj/structure/chair/wood{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) +/obj/structure/railing/corner, +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "Ae" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4826,12 +4773,12 @@ /turf/open/floor/plating, /area/mine/laborcamp/production) "Ah" = ( -/obj/machinery/microwave{ - pixel_y = 6 +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 1 }, -/obj/structure/table/wood, -/turf/open/floor/carpet/red, -/area/mine/lobby/raptor) +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) "Ai" = ( /obj/structure/stone_tile/cracked{ dir = 1 @@ -4868,10 +4815,10 @@ /turf/open/floor/iron/dark/textured_large, /area/mine/production) "Av" = ( -/obj/structure/railing{ - dir = 9 +/obj/structure/railing/corner{ + dir = 8 }, -/turf/open/misc/asteroid/basalt/lava_land_surface, +/turf/open/misc/hay/lavaland, /area/lavaland/surface/outdoors) "Ax" = ( /obj/item/pickaxe, @@ -4896,11 +4843,10 @@ /turf/open/floor/iron/smooth, /area/mine/laborcamp) "AF" = ( -/obj/structure/lattice/catwalk/mining, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/lava/smooth/lava_land_surface, +/obj/structure/railing{ + dir = 10 + }, +/turf/open/misc/hay/lavaland, /area/lavaland/surface/outdoors) "AI" = ( /obj/structure/cable, @@ -4979,7 +4925,6 @@ /turf/open/floor/iron/smooth, /area/mine/laborcamp) "BA" = ( -/obj/structure/cable, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_edge{ dir = 8 @@ -5034,7 +4979,7 @@ /obj/machinery/door/airlock/external{ name = "Mining External Airlock" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, @@ -5079,30 +5024,9 @@ }, /turf/open/floor/iron/checker, /area/mine/cafeteria) -"Cn" = ( -/obj/structure/table/wood, -/obj/item/plate{ - pixel_x = 6; - pixel_y = 7 - }, -/obj/item/plate{ - pixel_x = -6; - pixel_y = -6 - }, -/obj/item/reagent_containers/cup/glass/mug/tea{ - pixel_x = 8; - pixel_y = -3 - }, -/obj/effect/turf_decal/siding/wood/end{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/mine/lobby/raptor) "Cv" = ( -/obj/effect/turf_decal/sand/plating/volcanic, -/obj/structure/marker_beacon/purple, -/obj/effect/turf_decal/sand/plating/volcanic, -/turf/open/floor/plating/lavaland_atmos, +/obj/effect/spawner/random/lavaland_mob/raptor/young, +/turf/open/misc/hay/lavaland, /area/lavaland/surface/outdoors) "Cz" = ( /obj/machinery/door/airlock/medical/glass{ @@ -5156,21 +5080,27 @@ /turf/open/floor/iron/dark, /area/mine/mechbay) "CI" = ( -/obj/structure/sign/directions/supply/directional/east{ - pixel_x = null; - pixel_y = -24 +/obj/structure/railing{ + dir = 5 }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) +"CM" = ( +/obj/effect/turf_decal/trimline/yellow/filled/arrow_ccw{ + dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/edge{ - dir = 1 +/obj/effect/turf_decal/trimline/red/filled/arrow_ccw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/mid_joiner{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_corner{ + dir = 4 }, -/area/mine/living_quarters) -"CM" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/dark/textured_large, /area/mine/production) "CO" = ( /turf/open/floor/iron/textured_large, @@ -5187,7 +5117,6 @@ /obj/machinery/door/airlock/maintenance{ name = "Mining Station Maintenance" }, -/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/any/engineering/maintenance, @@ -5202,9 +5131,6 @@ /obj/structure/curtain, /turf/open/floor/iron/freezer, /area/mine/living_quarters) -"CV" = ( -/turf/closed/wall/mineral/iron, -/area/mine/lobby/raptor) "CX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5409,6 +5335,7 @@ "Ez" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/mine/laborcamp/production) "EB" = ( @@ -5469,12 +5396,6 @@ dir = 1 }, /area/mine/production) -"EP" = ( -/obj/structure/railing{ - dir = 4 - }, -/turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) "EQ" = ( /turf/open/floor/iron/smooth_edge{ dir = 8 @@ -5529,12 +5450,6 @@ }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"Fo" = ( -/obj/effect/turf_decal/siding/wood/end{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/mine/lobby/raptor) "Fp" = ( /obj/structure/table, /obj/machinery/recharger, @@ -5544,11 +5459,17 @@ /turf/open/floor/iron/dark, /area/mine/laborcamp/security) "Fr" = ( -/obj/machinery/door/airlock/external/glass{ - name = "Mining Shuttle Airlock" +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_edge{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/any/supply/mining, -/turf/open/floor/iron/dark/textured_large, /area/mine/production) "Fs" = ( /obj/effect/turf_decal/sand/plating/volcanic, @@ -5593,10 +5514,6 @@ "FH" = ( /turf/closed/wall, /area/lavaland/surface/outdoors) -"FI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) "FL" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light/small/directional/west, @@ -5682,6 +5599,10 @@ /obj/effect/turf_decal/trimline/green/filled/line, /turf/open/floor/iron/dark, /area/mine/laborcamp) +"Gw" = ( +/obj/structure/sign/directions/supply/directional/east, +/turf/closed/wall, +/area/mine/living_quarters) "Gx" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -5724,9 +5645,6 @@ dir = 8 }, /area/mine/production) -"GG" = ( -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) "GH" = ( /obj/machinery/door/airlock/glass{ name = "Arrival Lounge" @@ -5736,12 +5654,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron, /area/mine/lounge) -"GI" = ( -/obj/structure/rack, -/obj/item/stack/sheet/mineral/wood/fifty, -/obj/item/lighter, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) "GL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5790,7 +5702,6 @@ /turf/open/floor/plating, /area/mine/maintenance/labor) "Hd" = ( -/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, @@ -6137,9 +6048,10 @@ /area/mine/laborcamp) "Jg" = ( /obj/effect/turf_decal/sand/plating/volcanic, -/obj/structure/railing{ - dir = 10 +/obj/structure/railing/corner/end{ + dir = 4 }, +/obj/structure/marker_beacon/purple, /turf/open/floor/plating/lavaland_atmos, /area/lavaland/surface/outdoors) "Jh" = ( @@ -6194,7 +6106,6 @@ /turf/open/floor/iron, /area/mine/lounge) "Ju" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, /area/mine/mechbay) @@ -6215,10 +6126,6 @@ /area/lavaland/surface/outdoors) "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") }, @@ -6400,40 +6307,11 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "Km" = ( -/obj/structure/rack, -/obj/item/food/grown/grass/fairy{ - name = "weird hay"; - desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?" - }, -/obj/item/food/grown/grass/fairy{ - name = "weird hay"; - desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"; - pixel_y = 9 - }, -/obj/item/food/grown/grass/fairy{ - name = "weird hay"; - desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"; - pixel_y = 9; - pixel_x = 2 - }, -/obj/item/food/grown/grass/fairy{ - name = "weird hay"; - desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"; - pixel_y = 6 - }, -/obj/item/food/grown/grass/fairy{ - name = "weird hay"; - desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"; - pixel_y = 6; - pixel_x = 9 - }, -/obj/item/crowbar/large, -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 +/obj/structure/railing/corner/end{ + dir = 8 }, -/turf/open/floor/wood/large, -/area/mine/lobby/raptor) +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "Kn" = ( /obj/machinery/telecomms/relay/preset/mining, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6453,11 +6331,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark, /area/mine/storage/public) -"Kp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_edge, -/area/mine/laborcamp) "Kq" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -6527,12 +6400,6 @@ }, /turf/open/floor/iron/checker, /area/mine/cafeteria) -"KO" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) "KV" = ( /obj/structure/table, /obj/machinery/light/directional/east, @@ -6573,6 +6440,7 @@ dir = 1 }, /obj/effect/spawner/random/trash/mess, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/checker, /area/mine/laborcamp) "Lg" = ( @@ -6654,15 +6522,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/storage) -"Lv" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/large, -/area/mine/lobby/raptor) "Lw" = ( /obj/effect/turf_decal/sand/plating/volcanic, /obj/effect/turf_decal/stripes/line{ @@ -6681,7 +6540,7 @@ /area/mine/storage) "LE" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 + dir = 8 }, /obj/effect/turf_decal/siding/yellow{ dir = 1 @@ -6754,7 +6613,6 @@ /area/mine/laborcamp/production) "LR" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/iron/smooth_edge{ dir = 4 @@ -6779,7 +6637,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_edge, /area/mine/laborcamp) @@ -6820,10 +6677,6 @@ dir = 8 }, /area/mine/lounge) -"Mf" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) "Mr" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -6902,28 +6755,19 @@ /turf/open/floor/iron/checker, /area/mine/cafeteria) "MQ" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/structure/sign/directions/security/directional/west{ - pixel_x = 32; - pixel_y = -8 + pixel_y = -7; + pixel_x = 0 }, -/obj/structure/sign/directions/lavaland/directional/north{ - pixel_x = 32; - pixel_y = 8 - }, -/obj/effect/turf_decal/sand/plating/volcanic, -/turf/open/floor/plating/lavaland_atmos, +/turf/closed/wall, /area/lavaland/surface/outdoors) "MS" = ( /turf/open/floor/carpet/executive, /area/mine/lounge) "MW" = ( -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/spawner/random/trash/mess, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth_edge{ dir = 4 }, @@ -6932,6 +6776,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_large, /area/mine/laborcamp/production) "Nc" = ( @@ -7004,6 +6849,7 @@ /obj/structure/ore_box, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/mine/laborcamp/production) "Ns" = ( @@ -7039,7 +6885,6 @@ "Nz" = ( /obj/effect/turf_decal/bot, /obj/structure/ore_box, -/obj/structure/cable, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large, /area/mine/laborcamp/production) @@ -7066,9 +6911,6 @@ /obj/machinery/computer/order_console/mining, /turf/open/floor/iron/dark, /area/mine/production) -"NK" = ( -/turf/open/misc/ashplanet/ash, -/area/lavaland/surface/outdoors) "NL" = ( /obj/structure/railing, /obj/structure/lattice/catwalk/mining, @@ -7079,12 +6921,12 @@ /turf/open/floor/plating, /area/mine/laborcamp/security/maintenance) "NP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating/lavaland_atmos, -/area/mine/lobby/raptor) +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/spawner/random/lavaland_mob/raptor/baby, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "NR" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -7094,9 +6936,6 @@ dir = 1 }, /area/mine/laborcamp/production) -"NS" = ( -/turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) "NT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7191,13 +7030,6 @@ }, /turf/open/floor/iron, /area/mine/lounge) -"Oo" = ( -/obj/structure/railing{ - dir = 5 - }, -/obj/item/reagent_containers/cup/bucket/wooden, -/turf/open/misc/hay/lavaland, -/area/lavaland/surface/outdoors) "Op" = ( /obj/structure/stone_tile/slab, /turf/open/misc/asteroid/basalt/lava_land_surface, @@ -7219,16 +7051,6 @@ dir = 4 }, /area/mine/laborcamp/security) -"OE" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/chair/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/mine/lobby/raptor) "OH" = ( /obj/item/storage/fancy/cigarettes/cigpack_robust{ pixel_x = -8; @@ -7275,17 +7097,6 @@ /obj/structure/cable, /turf/open/floor/iron/white/textured_large, /area/mine/cafeteria) -"OW" = ( -/obj/structure/table/wood, -/obj/item/soap/deluxe{ - pixel_y = 11 - }, -/obj/item/soap/deluxe{ - pixel_y = 6 - }, -/obj/item/soap/deluxe, -/turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) "OZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7309,13 +7120,6 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating/lavaland_atmos, /area/lavaland/surface/outdoors) -"Pe" = ( -/obj/structure/lattice/catwalk/mining, -/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/lavaland_atmos, -/area/lavaland/surface/outdoors) "Pi" = ( /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/trimline/red/filled/line, @@ -7355,10 +7159,10 @@ /turf/open/floor/plating, /area/mine/cafeteria) "Pn" = ( -/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/lavaland_atmos, +/obj/structure/railing{ + dir = 6 + }, +/turf/open/misc/hay/lavaland, /area/lavaland/surface/outdoors) "Po" = ( /obj/structure/table, @@ -7520,12 +7324,6 @@ }, /turf/open/floor/iron/dark, /area/mine/mechbay) -"Qq" = ( -/obj/structure/ore_vent/starter_resources{ - icon_state = "ore_vent_active" - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) "Qw" = ( /obj/structure/stone_tile/cracked, /obj/structure/stone_tile{ @@ -7672,23 +7470,6 @@ /obj/structure/easel, /turf/open/misc/hay/lavaland, /area/lavaland/surface/outdoors) -"Rj" = ( -/obj/machinery/suit_storage_unit/mining, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 8 - }, -/area/mine/eva) -"Rm" = ( -/obj/structure/bed, -/obj/effect/spawner/random/bedsheet, -/turf/open/floor/carpet/red, -/area/mine/lobby/raptor) "Ro" = ( /obj/effect/turf_decal/loading_area, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -7745,26 +7526,16 @@ /turf/closed/wall, /area/mine/maintenance/labor) "RF" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/structure/sign/directions/security/directional/west{ - pixel_x = 0; - pixel_y = 24 - }, /obj/structure/sign/directions/lavaland/directional/west{ - pixel_x = 0; - pixel_y = 32 + pixel_x = 0 }, -/obj/effect/turf_decal/sand/plating/volcanic, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) +/turf/closed/wall, +/area/mine/cafeteria) "RG" = ( /obj/machinery/door/airlock/public/glass{ id_tag = "cellblock1"; name = "Labor Camp Operations" }, -/obj/structure/cable, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/mine/laborcamp) @@ -7774,12 +7545,12 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "RO" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/plating, -/area/mine/eva) +/obj/effect/turf_decal/sand/plating/volcanic, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) "RV" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -7790,7 +7561,7 @@ /area/mine/laborcamp/quarters) "RW" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, @@ -7841,11 +7612,6 @@ }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"Sj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet/red, -/area/mine/lobby/raptor) "Sm" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/siding/yellow, @@ -7860,15 +7626,16 @@ /turf/open/floor/iron/dark, /area/mine/hydroponics) "Sp" = ( -/obj/structure/easel, -/obj/item/canvas/fortyfive_twentyseven, -/obj/item/canvas/thirtysix_twentyfour, -/obj/item/canvas/twentythree_nineteen, -/obj/item/paint_palette, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing/corner, +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "Sq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /obj/structure/cable, /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -8048,23 +7815,24 @@ dir = 4 }, /area/mine/production) -"Tt" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/siding/wood/end{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/mine/lobby/raptor) "Tu" = ( /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/mine/laborcamp) -"Tw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) +"Tv" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Mining External Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "lavaland_living_west" + }, +/obj/structure/sign/directions/security/directional/west{ + pixel_y = -8 + }, +/turf/open/floor/iron/textured_large, +/area/mine/cafeteria) "Tx" = ( /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt, @@ -8078,7 +7846,6 @@ /turf/open/floor/iron/dark/smooth_edge, /area/mine/production) "TF" = ( -/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/corner{ @@ -8224,9 +7991,7 @@ /turf/open/floor/iron/dark/textured_large, /area/mine/production) "Ut" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/smooth_edge, /area/mine/laborcamp) "Uu" = ( @@ -8245,9 +8010,12 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "Uz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet/red, -/area/mine/lobby/raptor) +/obj/structure/railing{ + dir = 1 + }, +/obj/item/flashlight/lantern/on, +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "UD" = ( /obj/structure/toilet{ dir = 8 @@ -8336,9 +8104,9 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "Vd" = ( -/obj/structure/railing, -/turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) +/obj/structure/flora/ash/tall_shroom, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "Ve" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured_large, @@ -8461,14 +8229,18 @@ /turf/open/floor/iron/checker, /area/mine/laborcamp) "VI" = ( -/obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/effect/spawner/random/food_or_drink/donkpockets{ - pixel_x = 6; - pixel_y = 5 +/obj/machinery/door/airlock/external/glass{ + name = "Mining Shuttle Airlock" }, -/obj/structure/table/wood, -/turf/open/floor/carpet/red, -/area/mine/lobby/raptor) +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/mine/production) "VJ" = ( /obj/structure/closet/crate, /obj/item/food/mint, @@ -8491,12 +8263,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/maintenance/labor) -"VP" = ( -/obj/effect/turf_decal/siding/wood/end{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/mine/lobby/raptor) "VS" = ( /obj/machinery/hydroponics/constructable, /obj/effect/decal/cleanable/dirt, @@ -8507,10 +8273,8 @@ /turf/open/floor/iron/dark, /area/mine/laborcamp) "VU" = ( -/obj/structure/railing/corner/end{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, +/obj/structure/railing, +/turf/open/misc/hay/lavaland, /area/lavaland/surface/outdoors) "VX" = ( /obj/effect/decal/cleanable/dirt, @@ -8545,15 +8309,22 @@ /area/mine/lounge) "Wh" = ( /obj/structure/railing{ - dir = 8 + dir = 10 }, -/turf/open/misc/asteroid/basalt/lava_land_surface, +/obj/structure/table/wood, +/obj/item/soap/deluxe, +/obj/item/soap/deluxe{ + pixel_y = 6 + }, +/obj/item/soap/deluxe{ + pixel_y = 11 + }, +/turf/open/misc/hay/lavaland, /area/lavaland/surface/outdoors) "Wk" = ( -/obj/structure/railing{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, +/obj/structure/railing, +/obj/effect/spawner/random/lavaland_mob/raptor/young, +/turf/open/misc/hay/lavaland, /area/lavaland/surface/outdoors) "Wl" = ( /obj/machinery/door/airlock/external/glass{ @@ -8575,11 +8346,9 @@ }, /area/mine/laborcamp/security) "Wq" = ( -/obj/structure/railing{ - dir = 5 - }, -/turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) +/obj/structure/flora/ash/leaf_shroom, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "Wt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/disposalpipe/segment, @@ -8745,10 +8514,6 @@ dir = 4 }, /area/mine/production) -"Xk" = ( -/obj/effect/spawner/random/lavaland_mob/raptor, -/turf/open/misc/hay/lavaland, -/area/lavaland/surface/outdoors) "Xp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8789,6 +8554,7 @@ /obj/effect/turf_decal/siding/wideplating_new{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/checker, /area/mine/laborcamp) "XA" = ( @@ -8838,13 +8604,6 @@ /obj/item/seeds/apple, /turf/open/floor/iron/dark, /area/mine/laborcamp) -"XM" = ( -/obj/structure/sign/directions/evac/directional/south{ - pixel_x = -32; - pixel_y = 0 - }, -/turf/open/floor/iron/dark/textured_large, -/area/mine/production) "XP" = ( /obj/structure/stone_tile/cracked, /obj/structure/stone_tile/block{ @@ -8935,8 +8694,6 @@ /area/mine/lounge) "Yg" = ( /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_large, /area/mine/eva) "Yk" = ( @@ -9023,13 +8780,13 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "YP" = ( -/obj/structure/bookcase/random/reference, -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 +/obj/effect/turf_decal/sand/plating/volcanic, +/obj/structure/railing/corner/end{ + dir = 8 }, -/turf/open/floor/wood/large, -/area/mine/lobby/raptor) +/obj/structure/marker_beacon/purple, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) "YR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9065,6 +8822,11 @@ }, /turf/open/floor/iron, /area/mine/lounge) +"Zg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/directions/evac/directional/east, +/turf/open/floor/plating, +/area/mine/lounge) "Zh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9113,10 +8875,6 @@ }, /turf/open/floor/iron/smooth, /area/mine/laborcamp/production) -"Zs" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) "Zt" = ( /turf/closed/wall, /area/mine/laborcamp) @@ -9136,12 +8894,10 @@ /area/mine/living_quarters) "Zx" = ( /obj/structure/sign/directions/dorms/directional/west{ - pixel_x = 0; - pixel_y = 24 + pixel_x = 0 }, -/obj/effect/turf_decal/sand/plating/volcanic, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) +/turf/closed/wall, +/area/mine/maintenance/production) "Zz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9156,18 +8912,25 @@ dir = 8 }, /area/mine/lounge) -"ZB" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 +"ZC" = ( +/obj/structure/railing/corner{ + dir = 4 }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/large, -/area/mine/lobby/raptor) -"ZF" = ( -/obj/effect/turf_decal/sand/plating/volcanic, /obj/effect/turf_decal/sand/plating/volcanic, +/obj/structure/sign/directions/lavaland/directional/north{ + pixel_y = 40 + }, /turf/open/floor/plating/lavaland_atmos, /area/lavaland/surface/outdoors) +"ZF" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "ZH" = ( /obj/structure/closet/secure_closet/labor_camp_security, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -9177,12 +8940,11 @@ /turf/open/floor/iron/dark, /area/mine/laborcamp/security) "ZL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/wood, -/obj/structure/cable, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "ZM" = ( /obj/structure/railing{ dir = 8 @@ -9215,16 +8977,9 @@ /turf/open/floor/plating, /area/mine/maintenance/public/north) "ZU" = ( -/obj/structure/railing{ - dir = 6 - }, -/turf/open/misc/hay/lavaland, -/area/mine/lobby/raptor) -"ZX" = ( -/obj/structure/table/wood, -/obj/item/knife, -/turf/open/floor/wood/parquet, -/area/mine/lobby/raptor) +/obj/effect/spawner/random/lavaland_mob/raptor/young, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "ZY" = ( /turf/closed/mineral/random/volcanic, /area/lavaland/surface/outdoors/unexplored) @@ -26416,7 +26171,7 @@ Zt rX Zt Ub -Tu +fg MW HS Dn @@ -26930,7 +26685,7 @@ Zt rX Zt rS -Kp +zQ Xy hW PY @@ -35416,7 +35171,7 @@ VK VK VK Nf -MQ +rG BP ol pU @@ -35673,8 +35428,8 @@ aj aj aj aj -FH -rG +MQ +ZC ol aj aj @@ -37472,8 +37227,8 @@ zH kY kY Tc -kY RF +vd NL aj aj @@ -37729,7 +37484,7 @@ te dz px DI -oS +Tv BP ol aj @@ -42352,7 +42107,7 @@ iu iu iN ix -iu +Gw Zw UD iu @@ -42608,7 +42363,7 @@ Nt pI zf Up -CI +ix iu iu iu @@ -42623,7 +42378,7 @@ mn QP MS MS -QP +PR LE os JQ @@ -42632,8 +42387,8 @@ Hj pU BP pU -NK -ze +ai +ai pU pU aj @@ -42888,9 +42643,9 @@ EL EL pU pU -ze +ai BP -ze +ai pU pU aj @@ -43145,8 +42900,8 @@ pU pU pU pU -ze -ze +ai +ai pU pU aj @@ -43388,7 +43143,7 @@ pU tF tF pU -SP +Zg ti DZ FD @@ -44945,8 +44700,8 @@ aj aj aj aj -NK -NK +ad +ad pU aj aj @@ -45176,8 +44931,8 @@ FX FX nm iY -nm Zx +BP Yq aj aj @@ -45203,7 +44958,7 @@ aj aj pU pU -ze +ad pU aj aj @@ -45460,7 +45215,7 @@ aj aj pU BP -ze +ai pU pU aj @@ -45716,7 +45471,7 @@ aj aj aj pU -NK +ai pU pU pU @@ -46962,7 +46717,7 @@ aj aj aj Ep -Qq +jn fx aj oA @@ -47493,11 +47248,11 @@ WB wt jw fA -Le -Le NU Le +ep Le +NU BP BP BP @@ -47515,9 +47270,9 @@ aj aj pU pU -NK +ai BP -ze +ad pU pU aj @@ -47751,8 +47506,8 @@ Jl rv TJ RW -cc -XM +pM +vr CM lM Ec @@ -47771,10 +47526,10 @@ aj aj aj pU -ze -ze -ze -ze +ai +ad +ad +ai aj aj aj @@ -48008,9 +47763,9 @@ GF lb Yl Le -Le +jX Fr -Le +jt Le BP BP @@ -48029,8 +47784,8 @@ aj aj pU BP -ze -NK +ad +ad pU aj aj @@ -48265,10 +48020,10 @@ Ra oh pK NU -BP -BP -BP -JD +Le +VI +Le +NU BP BP BP @@ -48285,8 +48040,8 @@ pU aj aj pU -NK -NK +ai +ai pU pU aj @@ -48523,7 +48278,7 @@ mT pK pU BP -ZF +BP BP JD BP @@ -48779,9 +48534,9 @@ Yg li dK pU -Cv BP -Cv +rB +BP zk mc mc @@ -49036,8 +48791,8 @@ Yg TQ dK pU -aX -BP +pU +RO Jg pU pU @@ -49289,14 +49044,14 @@ YD pK Ob IL -Rj +IL KV pK aj +aj yV -BP fK -pU +aj pU pU pU @@ -49546,12 +49301,12 @@ NU pK pK dK -RO +dK pK pK aj +aj yV -tF NL aj aj @@ -49803,12 +49558,12 @@ NU ai pU pU -Pn pU +pU +aj aj aj yV -tF NL aj aj @@ -50060,12 +49815,12 @@ pU pU pU pU -AF +aj aj aj pU +aj yV -tF NL aj aj @@ -50317,12 +50072,12 @@ pU aj aj aj -AF +aj aj pU aj +aj yV -tF NL aj pU @@ -50339,9 +50094,9 @@ pU pU pU pU -ze -ze -ze +ai +ad +ad pU pU pU @@ -50574,13 +50329,13 @@ aj aj aj aj -AF aj aj aj -zs -tF -de +aj +aj +Ah +aF aj aj aj @@ -50595,9 +50350,9 @@ aj pU pU pU -ze -NK -ze +ai +ad +ad BP pU pU @@ -50831,13 +50586,13 @@ aj aj aj aj -AF aj aj aj -ct -BP -ct +aj +aj +RO +kf pU aj aj @@ -50851,10 +50606,10 @@ aj pU pU pU -ze +ai BP -NK -ze +ai +ai pU pU pU @@ -51088,12 +50843,12 @@ ai ai pU pU -AF -aj +pU +pU aj aj -BP -BP +pU +YP BP pU pU @@ -51107,10 +50862,10 @@ aj pU pU pU -ze -ze -NK -ze +ai +ad +ai +ai lP pU pU @@ -51345,11 +51100,11 @@ ai ai ai ai -Pn -AF -AF -AF -Pe +pU +pU +pU +pU +pU BP BP BP @@ -51365,10 +51120,10 @@ lt Ri eN pU -ze -ze -ze -ze +ai +ai +ai +ai pU pU aj @@ -51606,10 +51361,8 @@ ai pU pU pU -AF -BP -BP -BP +pU +pU BP ct pU @@ -51617,6 +51370,8 @@ pU pU pU pU +pU +BP lt Ns lt @@ -51624,7 +51379,7 @@ pU pU pU pU -ze +ai pU pU aj @@ -51860,21 +51615,21 @@ aj aj ai ai -CV -CV -ki -NP -ki -CV -CV -CV -lt pU pU pU pU pU pU +pU +pU +pU +pU +pU +pU +pU +BP +BP lt pU lP @@ -52116,19 +51871,11 @@ aj aj aj aj -CV -CV -Km -qB -eL -Ah -VI -ZX -ki -Ns +aj +pU +pU lt pU -BP pU pU pU @@ -52137,6 +51884,14 @@ pU pU pU pU +Wq +pU +pU +pU +pU +pU +pU +pU pU pU aj @@ -52373,25 +52128,25 @@ aj aj aj aj -CV -GG -jX -Tw -eL -aF -pF -dF -ki -lt -lt +aj +aj +pU +Ns lt pU +BP +pU +pU pU pU BP -NK -NK -ze +pU +lt +Ns +lt +UI +pU +pU pU pU pU @@ -52627,28 +52382,28 @@ pU ai ai ai -pU +ai aj aj -CV -Sp -OE -as -ZL -Cn -zX -CV -CV +aj +aj +pU pU lt +lt pU pU pU pU +BP +eL ze -NK +AF +tf ze -BP +Sp +FH +pU pU pU pU @@ -52886,27 +52641,24 @@ ai ai ai ai +ai +aj +aj pU -CV -GG -Tt -fa -eL -ZB -GG -CV pU +lt pU pU -lP pU -BP pU -ze -NK pU -UI +BP +NP pU +oO +lP +lt +VU pU pU pU @@ -52918,6 +52670,9 @@ aj aj aj aj +aj +aj +aj "} (171,1,1) = {" aa @@ -53144,34 +52899,34 @@ aj ai ai ai -CV -wa -rB -fa -eL -Lv -CV -CV -CV -ct -pU +ai pU pU pU pU -ze +lP pU +BP pU -lt -lt -lt UI +ct +dI +Az +oO pU -aj +pU +VU pU pU aj +aj +aj +aj +aj +aj +aj pU +aj pU aj aj @@ -53399,29 +53154,25 @@ aj aj aj aj -pU ai -CV -jt -ba -fa -jJ -ZB -be -dI -oO -BP +ai +ai +pU +UI +ct +pU pU -BP pU pU pU -ct -BP lt lt -Ns +up +UI +oO +ZU lt +VU lt pU pU @@ -53429,7 +53180,11 @@ pU pU pU pU -pU +aj +aj +aj +aj +aj aj aj "} @@ -53658,37 +53413,37 @@ aj aj aj aj -CV -GG -tf -fa -Sj -ZB -CV -CV -CV -ct pU pU pU +BP +pU pU pU -BP +pU +lt +lt +lt +Km +pU +ZL +lt +lt Av Wh -Wh -CV -ki -ki -CV -CV -ki -ki -CV -CV +lt +pU +pU +pU +pU +pU +aj +aj pU pU aj +aj +aj "} (174,1,1) = {" aa @@ -53915,36 +53670,36 @@ aj aj aj aj -CV -rf -VP -fa -Sj -ZB -Mf -CV -hl +aj +aj +pU +pU +pU +BP +pU pU lt +Ns +lt lt pU pU lt lt -up +lt +rj lt pU -vr -sQ -NS -Vd -NS -NS -sQ -NS -CV pU +aj +aj pU +pU +aj +aj +aj +aj +aj aj "} (175,1,1) = {" @@ -54172,37 +53927,37 @@ aj aj aj aj -CV -GI -vM -FI -jJ -Fo -hM -CV -CV -Ns -lt +aj +aj +pU +pU +pU +pU +pU +pU pU pU lt +hl lt +xW +pU lt -up +zX +be pU pU -vr -il -NS -Vd -NS -NS -il -NS -ki pU aj aj +aj +aj +aj +aj +aj +aj +aj +aj "} (176,1,1) = {" aa @@ -54429,37 +54184,37 @@ aj aj aj aj -CV -pM -YP -GG -Uz -Uz -Uz -Zs -ki -lt -lt +aj +pU +pU +pU +pU +pU pU pU pU -lt pU +lt +Uz +lt +VU +lt +lt Wk -UI -ct -vr -NS -NS -Vd -NS -NS -NS -NS -ki +lt +pU +pU pU pU aj +aj +aj +aj +aj +aj +aj +aj +aj "} (177,1,1) = {" aa @@ -54684,39 +54439,39 @@ pU pU pU pU -aj -aj -CV -CV -YP -GG -fa -fa -Rm -bE -ki -lt pU pU pU pU pU pU -Wk pU +pU +pU +pU +ct lt -Wq -EP -NS -ZU -NS -NS -EP -EP -CV -CV +dF +up +Cv +VU +lt +lt +VU +lt +pU +pU +pU +pU +aj +aj +aj +aj +aj pU aj +aj +aj "} (178,1,1) = {" aa @@ -54942,36 +54697,36 @@ pU pU pU pU -aj -aj -CV -CV -ki -ki -ki -CV -CV -CV -lt pU pU -lt pU pU pU -VU -Xk +pU +pU +pU +pU +pU lt -NS -NS -NS -NS -NS -uw -NS -NS -NS -ki +Pb +up +lt +VU +Ns +Az +VU +pU +pU +pU +pU +pU +aj +aj +aj +aj +aj +aj +aj pU aj "} @@ -55200,9 +54955,6 @@ pU pU pU pU -aj -aj -aj pU pU pU @@ -55213,24 +54965,27 @@ pU pU pU Ns -Az +lt +CI +wa +Pn +ej +wa +ZF +FH +pU +pU +pU +pU +aj +aj +pU pU pU -lt -lt -lt -NS -mk -sa -NS -NS -NS -OW -sa -NS -ki aj aj +pU +aj "} (180,1,1) = {" aa @@ -55467,26 +55222,26 @@ pU pU pU pU -pU -pU -lt lt pU -xW lt lt lt -NS -NS -uw -NS -NS -NS -NS -NS -NS -ki +Vd +pU +pU +pU +pU +pU +aj +aj +pU +pU pU +pU +pU +aj +aj aj "} (181,1,1) = {" @@ -55727,22 +55482,22 @@ pU pU pU pU -lt pU pU -Wk -lt -lt -kf -KO -NS -aH -NS -NS -KO -KO -CV -CV +pU +pU +pU +pU +pU +pU +aj +aj +aj +pU +pU +pU +aj +aj pU aj "} @@ -55979,6 +55734,9 @@ pU pU pU pU +UI +pU +pU pU pU pU @@ -55987,21 +55745,18 @@ pU pU pU pU -Wk pU -ct -vr -NS -rj -Vd -NS -NS -NS -NS -ki pU aj aj +pU +pU +pU +pU +pU +aj +aj +aj "} (183,1,1) = {" aa @@ -56242,23 +55997,23 @@ pU pU pU pU -lt -lt -Wk pU pU -vr -il -NS -Vd -NS -NS -il -NS -ki pU pU pU +pU +pU +pU +pU +pU +pU +aj +aj +aj +aj +aj +pU "} (184,1,1) = {" aa @@ -56498,23 +56253,23 @@ pU pU pU pU -lt -Ns -lt -up -Pb pU -vr -sQ -NS -Vd -NS -NS -sQ -NS -CV pU pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +aj +aj +pU +pU +aj aj "} (185,1,1) = {" @@ -56755,24 +56510,24 @@ pU pU pU pU -lt -lt -BP -Oo -ej -nO -CV -ki -ki -CV -CV -ki -ki -CV -CV +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +aj pU aj aj +aj +aj "} (186,1,1) = {" aa @@ -57014,12 +56769,6 @@ pU pU pU pU -ct -BP -pU -pU -pU -lt pU pU pU @@ -57030,6 +56779,12 @@ pU pU pU aj +aj +aj +aj +aj +aj +aj "} (187,1,1) = {" aa @@ -57272,13 +57027,8 @@ pU pU pU pU -lt pU pU -lt -Ns -lt -lt pU pU pU @@ -57287,6 +57037,11 @@ pU pU aj aj +aj +aj +aj +aj +aj "} (188,1,1) = {" aa @@ -57528,17 +57283,17 @@ pU pU pU pU -lt -lt -lt pU -lt -lt -lt -lt -lt pU pU +pU +pU +pU +pU +pU +pU +aj +aj aj aj aj @@ -57786,15 +57541,15 @@ pU pU pU pU -Ns pU pU -UI -lt -lt -Ns -lt pU +pU +pU +pU +pU +pU +aj aj aj aj @@ -58048,8 +57803,8 @@ pU pU pU pU -lt -lt +pU +pU pU aj aj diff --git a/_maps/map_files/NebulaStation/NebulaStation.dmm b/_maps/map_files/NebulaStation/NebulaStation.dmm index b8c71b869f76..7ac250c073f8 100644 --- a/_maps/map_files/NebulaStation/NebulaStation.dmm +++ b/_maps/map_files/NebulaStation/NebulaStation.dmm @@ -335,7 +335,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/door/airlock/security/glass{ @@ -403,7 +403,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "adj" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/machinery/light/small/directional/north, @@ -604,6 +604,7 @@ /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "aeG" = ( @@ -700,7 +701,6 @@ pixel_x = 7; pixel_y = 18 }, -/obj/machinery/firealarm/directional/west, /turf/open/floor/wood/parquet, /area/station/medical/psychology) "aft" = ( @@ -981,7 +981,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 4 }, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "agX" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ @@ -1746,7 +1746,7 @@ "amU" = ( /obj/machinery/porta_turret/ai, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "anh" = ( /obj/effect/turf_decal/siding, /obj/structure/chair/sofa/bench/right{ @@ -1973,7 +1973,7 @@ /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/equipment) +/area/station/ai/satellite/equipment) "aoQ" = ( /obj/structure/table/glass, /obj/effect/spawner/random/entertainment/cigarette_pack, @@ -2060,7 +2060,7 @@ network = list("minisat") }, /turf/open/floor/iron/dark/textured_corner, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "apz" = ( /obj/machinery/holopad/secure, /obj/effect/turf_decal/box/white{ @@ -2131,7 +2131,7 @@ }, /obj/structure/closet/emcloset, /obj/machinery/camera/autoname/directional/west, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/hallway/primary/port) "apU" = ( @@ -2289,17 +2289,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/sign/directions/medical/directional/east{ - pixel_y = 8; - dir = 1 - }, -/obj/structure/sign/directions/science/directional/east{ - dir = 1 - }, -/obj/structure/sign/directions/supply/directional/east{ - pixel_y = -8; - dir = 1 - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2563,7 +2552,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/equipment) +/area/station/ai/satellite/equipment) "atR" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -2808,7 +2797,7 @@ /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "auK" = ( /turf/open/floor/glass/reinforced, /area/station/security/prison) @@ -3427,7 +3416,7 @@ /obj/machinery/vending/coffee, /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "aAC" = ( /obj/machinery/shower/directional/north, /obj/effect/turf_decal/trimline/blue/end{ @@ -3582,7 +3571,7 @@ "aBG" = ( /obj/effect/turf_decal/delivery, /obj/structure/closet/firecloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/sign/warning/vacuum/directional/west, /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark, @@ -3733,7 +3722,7 @@ /obj/effect/turf_decal/trimline/dark/corner, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "aCJ" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, @@ -3976,9 +3965,7 @@ /turf/open/floor/plating, /area/station/maintenance/aft/greater) "aEz" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/glass/reinforced/airless, /area/space/nearstation) "aEC" = ( @@ -4072,6 +4059,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"aFi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "aFm" = ( /obj/structure/table/reinforced, /obj/item/folder/red, @@ -4459,7 +4451,7 @@ }, /obj/item/gun/grenadelauncher, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "aID" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/carpet, @@ -4660,7 +4652,7 @@ dir = 1 }, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "aKm" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/south, @@ -4678,7 +4670,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "aKr" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 1 @@ -5289,7 +5281,7 @@ }, /obj/effect/decal/cleanable/rubble, /turf/open/floor/holofloor/wood, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "aOZ" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/south, @@ -5886,7 +5878,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "aUf" = ( /obj/effect/turf_decal/tile/dark/opposingcorners, /obj/effect/landmark/event_spawn, @@ -6381,7 +6373,7 @@ /obj/item/pen, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/equipment) +/area/station/ai/satellite/equipment) "aXu" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/south, @@ -6581,7 +6573,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "aYC" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -6724,7 +6716,7 @@ "aZM" = ( /obj/effect/turf_decal/trimline/dark_blue, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "aZQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6791,11 +6783,9 @@ /area/station/maintenance/aft/lesser) "bat" = ( /obj/structure/hedge, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "baD" = ( /obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ dir = 1 @@ -7018,7 +7008,7 @@ "bcd" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark/small, /area/station/hallway/primary/port) "bcf" = ( @@ -7353,7 +7343,7 @@ }, /obj/machinery/light/small/directional/south, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "beF" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 @@ -7405,10 +7395,11 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) "bfk" = ( @@ -8139,7 +8130,7 @@ /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "bmn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/machinery/meter, @@ -8335,7 +8326,7 @@ /obj/item/kirbyplants/random, /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "bnD" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2, /turf/open/floor/iron/dark/airless, @@ -8537,7 +8528,7 @@ /obj/item/clothing/shoes/magboots, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bpj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8763,7 +8754,7 @@ }, /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "brl" = ( /obj/structure/broken_flooring/singular/always_floorplane/directional/north, /obj/structure/chair/stool/bar/directional/west, @@ -8781,7 +8772,7 @@ dir = 9 }, /turf/open/floor/bamboo, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "brC" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 9 @@ -9006,7 +8997,7 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "btQ" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -9045,7 +9036,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "bum" = ( /obj/effect/turf_decal/siding/yellow, /obj/effect/turf_decal/trimline/yellow/filled/line, @@ -9086,7 +9077,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "buC" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/simple/orange/visible/layer1{ @@ -9416,16 +9407,20 @@ /turf/open/floor/iron/white, /area/station/medical/treatment_center) "bxv" = ( -/obj/structure/hedge, -/obj/effect/turf_decal/siding/wood{ - dir = 1 +/obj/structure/sign/directions/upload/directional/south{ + pixel_y = -10; + dir = 9 }, -/obj/structure/sign/plaques/kiddie/library{ - pixel_y = 32 +/obj/structure/sign/directions/command/directional/south{ + dir = 9; + pixel_y = 0 }, -/obj/structure/railing, -/turf/open/floor/wood/large, -/area/station/service/library/upper) +/obj/structure/sign/directions/vault/directional/south{ + pixel_y = 10; + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/station/hallway/secondary/command) "bxw" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 8 @@ -9456,7 +9451,7 @@ dir = 8 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "bxA" = ( /obj/machinery/digital_clock/directional/north, /obj/structure/railing/corner{ @@ -9543,10 +9538,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "bxV" = ( @@ -9705,6 +9700,7 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "byI" = ( @@ -10004,7 +10000,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bAz" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 1 @@ -10035,20 +10031,20 @@ /turf/open/floor/grass, /area/station/command/heads_quarters/hos) "bAD" = ( -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - name = "medical bed" - }, -/obj/item/bedsheet/medical, -/obj/effect/turf_decal/siding{ - dir = 6 - }, /obj/machinery/camera/directional/east{ c_tag = "Padded Cell"; network = list("ss13","medbay") }, -/turf/open/floor/iron/white/small, -/area/station/medical/patients_rooms) +/obj/structure/chair/sofa/corp/left{ + dir = 8 + }, +/obj/item/radio/intercom/directional/east, +/obj/effect/landmark/start/paramedic, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "bAI" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -10136,7 +10132,7 @@ dir = 8 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "bBh" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -10147,6 +10143,9 @@ dir = 2 }, /obj/effect/landmark/start/psychologist, +/obj/machinery/door/airlock/medical{ + name = "Psychology Lobby" + }, /turf/open/floor/wood/parquet, /area/station/medical/psychology) "bBl" = ( @@ -10476,7 +10475,7 @@ }, /obj/effect/turf_decal/stripes/line, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10838,7 +10837,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -11370,12 +11369,10 @@ /obj/effect/turf_decal/siding/thinplating/dark{ dir = 10 }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/structure/railing{ dir = 1 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "bJR" = ( @@ -11460,6 +11457,15 @@ "bKj" = ( /turf/closed/wall, /area/station/commons/fitness/recreation) +"bKl" = ( +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/structure/bed/medical, +/obj/machinery/iv_drip, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/central) "bKq" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/spawner/random/trash/janitor_supplies, @@ -11751,7 +11757,8 @@ pixel_x = 24; pixel_y = 6; id = "radioroom"; - name = "Curtains" + name = "Curtains"; + dir = 4 }, /obj/machinery/button/door/directional/east{ pixel_y = -6; @@ -11922,10 +11929,10 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "bNG" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "bNI" = ( /obj/structure/chair/office/light{ dir = 1 @@ -12293,19 +12300,8 @@ /area/space/nearstation) "bQa" = ( /obj/structure/table/glass, -/obj/item/clothing/glasses/hud/health{ - pixel_y = 8 - }, -/obj/item/clothing/glasses/hud/health{ - pixel_y = 3 - }, -/obj/item/clothing/glasses/hud/health{ - pixel_y = -2 - }, -/obj/item/clothing/glasses/hud/health{ - pixel_y = 13 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/defibrillator/loaded, /turf/open/floor/iron/dark, /area/station/medical/storage) "bQd" = ( @@ -12318,6 +12314,23 @@ }, /turf/open/space/openspace, /area/station/solars/port/aft) +"bQm" = ( +/obj/structure/sign/directions/medical/directional/west{ + pixel_y = 8; + dir = 1; + pixel_x = 0 + }, +/obj/structure/sign/directions/science/directional/west{ + dir = 1; + pixel_x = 0 + }, +/obj/structure/sign/directions/supply/directional/west{ + pixel_y = -8; + dir = 1; + pixel_x = 0 + }, +/turf/closed/wall, +/area/station/security/checkpoint/customs) "bQp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12345,6 +12358,21 @@ }, /turf/open/floor/iron/dark, /area/station/command) +"bQy" = ( +/obj/structure/sign/directions/dorms/directional/west{ + pixel_y = 8; + pixel_x = 0 + }, +/obj/structure/sign/directions/evac/directional/west{ + pixel_x = 0 + }, +/obj/structure/sign/directions/engineering/directional/west{ + pixel_y = -8; + dir = 2; + pixel_x = 0 + }, +/turf/closed/wall, +/area/station/commons/vacant_room/office) "bQT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12519,7 +12547,7 @@ /obj/item/stack/spacecash/c1000, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "bRZ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -13050,6 +13078,7 @@ /obj/effect/turf_decal/trimline/dark/corner{ dir = 8 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron/dark/side{ dir = 6 }, @@ -13126,6 +13155,21 @@ /obj/effect/turf_decal/delivery/white, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) +"bXc" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/folder/white{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/item/flashlight/lamp{ + pixel_y = -1; + pixel_x = -9 + }, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "bXe" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 9 @@ -13144,7 +13188,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "bXi" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /obj/structure/cable, @@ -13203,12 +13247,14 @@ /turf/open/floor/iron/dark/small, /area/station/engineering/main) "bXP" = ( -/obj/machinery/door/airlock/medical{ - name = "Padded Cell"; - id_tag = "padded" +/obj/effect/turf_decal/siding/blue{ + dir = 8 }, -/turf/open/floor/iron/white/herringbone, -/area/station/medical/patients_rooms) +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/station/medical/paramedic) "bXQ" = ( /obj/effect/mapping_helpers/broken_floor, /obj/item/clothing/suit/caution{ @@ -13339,14 +13385,12 @@ /area/station/commons/fitness/recreation/lasertag) "bYK" = ( /obj/structure/hedge, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ dir = 1 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "bYO" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -13684,7 +13728,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "caT" = ( /obj/effect/spawner/structure/window, /obj/structure/curtain/cloth{ @@ -13844,7 +13888,7 @@ /obj/item/toy/figure/borg, /obj/item/radio/intercom/directional/north, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/equipment) +/area/station/ai/satellite/equipment) "ccj" = ( /obj/structure/flora/grass/brown/style_random, /obj/structure/flora/bush/snow/style_2, @@ -13881,7 +13925,7 @@ /area/station/science/xenobiology) "ccC" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "ccE" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 @@ -14352,7 +14396,7 @@ /obj/machinery/digital_clock/directional/west, /obj/machinery/light/small/directional/west, /turf/open/floor/plating, -/area/station/medical/patients_rooms) +/area/station/maintenance/department/cargo) "chn" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/effect/turf_decal/tile/neutral, @@ -14790,7 +14834,7 @@ /obj/machinery/status_display/ai/directional/north, /obj/machinery/firealarm/directional/east, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/equipment) +/area/station/ai/satellite/equipment) "ckK" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -14906,7 +14950,7 @@ pixel_y = -2 }, /turf/open/floor/grass, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "cmj" = ( /obj/structure/table/reinforced/rglass, /obj/item/storage/box/donkpockets/donkpocketpizza{ @@ -15242,7 +15286,7 @@ }, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "coT" = ( /obj/machinery/door/airlock/medical/glass{ name = "Infirmary" @@ -15474,12 +15518,12 @@ /obj/structure/bookcase{ name = "Forbidden Knowledge" }, -/obj/structure/sign/painting/large/library_private{ - dir = 1 - }, /obj/item/poster/random_contraband{ pixel_y = 18 }, +/obj/structure/sign/painting/large/library_private{ + dir = 1 + }, /turf/open/floor/wood/large, /area/station/service/library/printer) "cqG" = ( @@ -15855,7 +15899,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "cti" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15980,7 +16024,6 @@ /obj/structure/railing/corner{ dir = 1 }, -/obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall/rust, /area/space/nearstation) "cuf" = ( @@ -16236,7 +16279,8 @@ id = "SecElevator" }, /obj/structure/noticeboard/hos{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/machinery/lift_indicator/directional/west{ pixel_x = -33; @@ -16814,25 +16858,20 @@ /turf/open/floor/wood/large, /area/station/service/chapel/office) "czJ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/sign/directions/medical/directional/west{ - pixel_y = 8; - dir = 1 +/obj/structure/sign/directions/upload/directional/south{ + pixel_y = -10; + dir = 4 }, -/obj/structure/sign/directions/science/directional/west{ - dir = 1 +/obj/structure/sign/directions/command/directional/south{ + dir = 4; + pixel_y = 10 }, -/obj/structure/sign/directions/supply/directional/west{ - pixel_y = -8; - dir = 1 +/obj/structure/sign/directions/security/directional/south{ + pixel_y = 0; + dir = 4 }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +/turf/closed/wall, +/area/station/service/barber) "czK" = ( /obj/machinery/atmospherics/components/binary/crystallizer{ dir = 4 @@ -16867,7 +16906,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "czS" = ( /obj/structure/closet/secure_closet/freezer/empty, /obj/item/reagent_containers/condiment/soymilk, @@ -16955,10 +16994,6 @@ /obj/structure/chair/sofa/corp/left{ dir = 1 }, -/obj/structure/sign/painting/large/library{ - pixel_y = -64; - dir = 1 - }, /turf/open/floor/stone, /area/station/commons/dorms) "cAp" = ( @@ -16976,9 +17011,7 @@ "cAu" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/radiation, -/obj/machinery/camera/autoname/directional/north{ - dir = 9 - }, +/obj/machinery/camera/autoname/directional/north, /obj/machinery/duct, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos/project) @@ -17107,7 +17140,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "cBK" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -17451,7 +17484,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "cEV" = ( /obj/effect/turf_decal/trimline/dark/corner, /obj/structure/chair/office{ @@ -17559,6 +17592,7 @@ "cFQ" = ( /obj/structure/sign/warning/biohazard, /obj/effect/spawner/random/structure/grille, +/obj/effect/spawner/structure/window/reinforced, /turf/open/space/openspace, /area/space/nearstation) "cFT" = ( @@ -17651,7 +17685,7 @@ }, /obj/item/radio/intercom/directional/south, /obj/machinery/camera/autoname/directional/south, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/white/textured_large, /area/station/commons/fitness) "cGz" = ( @@ -18471,15 +18505,13 @@ /turf/open/floor/iron, /area/station/cargo/storage) "cMm" = ( -/obj/structure/noticeboard/directional/east{ - dir = 8 - }, /obj/structure/cable, /obj/effect/turf_decal/siding/wood{ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/noticeboard/directional/east, /turf/open/floor/wood/tile, /area/station/service/minibar) "cMz" = ( @@ -18899,7 +18931,7 @@ /obj/structure/marker_beacon/lime, /obj/structure/flora/bush/lavendergrass/style_random, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "cPZ" = ( /turf/closed/wall/r_wall, /area/station/medical/morgue) @@ -19057,11 +19089,12 @@ /obj/machinery/door/airlock/maintenance{ name = "UndergroundCasino" }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/central) "cRu" = ( @@ -19242,14 +19275,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/structure/sign/directions/evac/directional/west, -/obj/structure/sign/directions/dorms/directional/west{ - pixel_y = 8 - }, -/obj/structure/sign/directions/engineering/directional/west{ - pixel_y = -8; - dir = 2 - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19274,7 +19299,7 @@ }, /obj/structure/cable/layer3, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "cSL" = ( /obj/structure/marker_beacon/bronze, /obj/structure/lattice/catwalk, @@ -19332,7 +19357,7 @@ dir = 5 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "cTe" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 4 @@ -19435,15 +19460,6 @@ dir = 4 }, /area/station/security/brig/lower) -"cTV" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "cTY" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 1 @@ -19826,7 +19842,7 @@ }, /obj/item/toy/seashell, /turf/open/floor/bamboo, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "cXw" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 9 @@ -20305,6 +20321,7 @@ /obj/effect/turf_decal/trimline/dark/corner{ dir = 4 }, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/iron/dark, /area/station/command) "dbh" = ( @@ -20424,18 +20441,16 @@ name = "AI Chamber Entrance Shutters Control"; req_access = list("ai_upload") }, -/obj/machinery/turretid{ - icon_state = "control_stun"; - name = "AI Chamber turret control"; - pixel_x = -29; - pixel_y = -6 - }, /obj/effect/landmark/start/ai, /obj/machinery/camera/autoname/directional/north{ network = list("minisat") }, +/obj/machinery/flasher/directional/east{ + pixel_y = -5; + id = "AI" + }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "dbO" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/south, @@ -20759,7 +20774,7 @@ dir = 5 }, /obj/structure/closet/firecloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark, /area/station/hallway/primary/port) @@ -20796,9 +20811,8 @@ /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, +/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/medical/psychology) "deI" = ( @@ -20916,7 +20930,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "dfe" = ( /obj/item/kirbyplants/random, /obj/structure/plaque/static_plaque/golden{ @@ -21332,7 +21346,20 @@ id = "AIgarden2" }, /turf/open/floor/engine/hull/reinforced, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) +"div" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "diw" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/ce) @@ -21705,7 +21732,7 @@ /obj/structure/flora/bush/flowers_br/style_random, /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "dkY" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 @@ -21794,7 +21821,7 @@ /obj/effect/turf_decal/bot, /obj/machinery/computer/security/telescreen/minisat/directional/west, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dlT" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 6 @@ -21808,7 +21835,7 @@ name = "Library Maintenance" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -21993,7 +22020,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -22169,6 +22196,21 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) +"dov" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay"; + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/warning, +/obj/effect/turf_decal/trimline/blue/warning{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured, +/area/station/medical/medbay/lobby) "doy" = ( /turf/closed/wall, /area/station/security/prison/workout) @@ -22227,7 +22269,7 @@ "doN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "doQ" = ( /obj/structure/water_source/puddle, /turf/open/floor/grass, @@ -22247,11 +22289,9 @@ dir = 8 }, /obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, /obj/effect/turf_decal/box/red, /obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron/dark, /area/station/security/execution/education) "dpj" = ( @@ -22711,7 +22751,7 @@ /turf/open/floor/iron/stairs{ color = "#3d3e42" }, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "dsE" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/siding/dark{ @@ -22802,7 +22842,7 @@ /turf/open/floor/iron/white, /area/station/science/lower) "dsQ" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 1 }, /obj/effect/turf_decal/bot, @@ -22897,7 +22937,8 @@ /obj/effect/turf_decal/siding/wood/corner, /obj/item/kirbyplants/random, /obj/structure/sign/painting/library{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/machinery/airalarm/directional/west, /obj/machinery/light/small/directional/north, @@ -23989,9 +24030,7 @@ name = "Teleporter Shutters"; req_access = list("teleporter") }, -/obj/machinery/camera/autoname/directional/south{ - dir = 5 - }, +/obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark, /area/station/hallway/secondary/command) "dBT" = ( @@ -24097,7 +24136,7 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "dCz" = ( /obj/structure/flora/rock/pile/jungle/style_random, /obj/effect/decal/cleanable/dirt, @@ -24260,7 +24299,7 @@ color = "#4874A2" }, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "dEt" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, @@ -24292,9 +24331,6 @@ /area/station/engineering/atmos/project) "dEG" = ( /obj/effect/turf_decal/siding/dark, -/obj/structure/noticeboard/directional/north{ - dir = 2 - }, /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, /obj/machinery/disposal/bin, @@ -24304,6 +24340,7 @@ /obj/machinery/camera/autoname/directional/north{ network = list("ss13","medbay") }, +/obj/structure/noticeboard/directional/north, /turf/open/floor/iron/dark/smooth_edge{ dir = 1 }, @@ -24421,7 +24458,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "dFq" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -24448,7 +24485,7 @@ }, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "dFw" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 5 @@ -24749,7 +24786,7 @@ "dIf" = ( /obj/structure/transit_tube, /obj/effect/turf_decal/trimline/dark_blue, -/obj/structure/window/reinforced/fulltile, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/command) "dIj" = ( @@ -24957,7 +24994,7 @@ }, /obj/structure/marker_beacon/lime, /turf/open/floor/grass, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "dKA" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -25506,7 +25543,7 @@ /obj/structure/marker_beacon/lime, /obj/machinery/light/small/directional/south, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "dOT" = ( /obj/effect/turf_decal/trimline/yellow/corner, /obj/effect/turf_decal/siding/thinplating_new/dark/corner, @@ -26067,7 +26104,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "dTf" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -26171,10 +26208,10 @@ }, /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/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/small, /area/station/medical/medbay/lobby) "dTY" = ( @@ -26228,7 +26265,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable/layer3, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "dUk" = ( /obj/effect/turf_decal/trimline/yellow, /obj/machinery/light/floor, @@ -26436,7 +26473,7 @@ dir = 6 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "dVD" = ( /obj/effect/turf_decal/siding/dark/end{ dir = 8 @@ -26617,7 +26654,7 @@ dir = 8 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "dWL" = ( /obj/structure/table/wood, /obj/structure/desk_bell{ @@ -26757,7 +26794,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "dXQ" = ( /obj/structure/table/reinforced, /obj/structure/reagent_dispensers/servingdish, @@ -27158,7 +27195,7 @@ /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/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron/dark, /area/station/service/janitor) "eaq" = ( @@ -27180,7 +27217,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "eav" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/grassy/style_random, @@ -27249,6 +27286,7 @@ }, /obj/effect/turf_decal/stripes/white/corner, /obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "eaQ" = ( @@ -27320,7 +27358,7 @@ name = "Dormitory Maintenance" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/machinery/duct, @@ -27454,7 +27492,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ecL" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 4 @@ -27684,7 +27722,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 4 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "eel" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/explosives/alt/directional/south, @@ -27877,12 +27915,8 @@ /obj/effect/turf_decal/trimline/white/warning{ dir = 8 }, -/obj/machinery/flasher/directional/east{ - id = "AI"; - pixel_y = 26 - }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "efL" = ( /obj/machinery/door/airlock/public/glass{ name = "Starboard Primary Hallway" @@ -27902,7 +27936,7 @@ /obj/effect/turf_decal/bot_white, /obj/machinery/light/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "efX" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark/small, @@ -27940,7 +27974,7 @@ pixel_y = -2 }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "egg" = ( /obj/effect/turf_decal/siding/dark/corner, /obj/effect/turf_decal/siding/dark{ @@ -27977,7 +28011,7 @@ network = list("aiupload") }, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "egn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28836,7 +28870,7 @@ /area/station/science/breakroom) "emU" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "emW" = ( /obj/effect/turf_decal/stripes/white/corner, /obj/effect/turf_decal/siding/thinplating/dark/corner, @@ -28955,6 +28989,7 @@ "enK" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, +/obj/structure/sign/warning/radiation/directional/south, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "enS" = ( @@ -29141,7 +29176,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "epf" = ( /obj/structure/chair/sofa/bench/left, /turf/open/floor/glass/reinforced, @@ -29237,7 +29272,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "eqb" = ( /turf/open/floor/iron/stairs/medium{ color = "#3d3e42" @@ -29532,7 +29567,7 @@ /obj/effect/turf_decal/bot/left, /obj/structure/rack, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "esg" = ( /obj/structure/cable, /turf/open/floor/iron/dark, @@ -29768,10 +29803,6 @@ /obj/structure/bed, /obj/item/bedsheet, /obj/effect/landmark/start/hangover, -/obj/machinery/flasher/directional/east{ - pixel_y = 24; - id = "Cell 1" - }, /turf/open/floor/iron/dark, /area/station/security/brig) "etT" = ( @@ -30024,7 +30055,7 @@ }, /obj/structure/hedge, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "ewF" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 10 @@ -30233,7 +30264,7 @@ dir = 1 }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "exV" = ( /obj/effect/landmark/start/cyborg, /obj/machinery/holopad/secure, @@ -30255,7 +30286,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "exW" = ( /obj/effect/turf_decal/stripes/white/corner{ dir = 4 @@ -30466,11 +30497,6 @@ /obj/structure/railing/corner/end/flip{ dir = 4 }, -/obj/structure/sign/directions/evac/directional/north{ - pixel_x = 0; - pixel_y = 26; - dir = 10 - }, /turf/open/floor/iron/dark, /area/station/hallway/primary/port) "eAc" = ( @@ -30480,7 +30506,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "eAi" = ( /turf/closed/wall, /area/station/medical/coldroom) @@ -30781,10 +30807,6 @@ req_access = list("medical"); pixel_x = -27 }, -/obj/item/toy/figure/paramedic{ - pixel_y = 16; - pixel_x = -1 - }, /obj/machinery/light_switch/directional/west{ pixel_y = -6 }, @@ -30879,7 +30901,7 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "eCK" = ( /obj/machinery/drone_dispenser, /turf/open/floor/plating, @@ -31141,16 +31163,13 @@ dir = 1 }, /obj/item/kirbyplants/random, -/obj/structure/sign/directions/evac/directional/north{ - dir = 8 - }, /turf/open/floor/iron/dark/herringbone, /area/station/commons/dorms) "eEA" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/trimline/dark/warning, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "eEB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/dark/corner{ @@ -31191,7 +31210,7 @@ /area/station/commons/fitness) "eFd" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "eFf" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 1 @@ -31321,7 +31340,7 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "eGu" = ( /obj/structure/cable, /obj/structure/broken_flooring/pile/directional/east, @@ -31442,13 +31461,13 @@ /obj/effect/turf_decal/caution/stand_clear{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/box, /obj/machinery/door/poddoor/shutters{ dir = 8; id = "qm_warehouse"; name = "Warehouse Shutters" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/box, /turf/open/floor/iron/dark/textured_half{ dir = 1 }, @@ -31642,7 +31661,7 @@ /area/station/maintenance/starboard/central) "eIE" = ( /turf/open/floor/bamboo, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "eIH" = ( /obj/structure/table/reinforced/rglass, /obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ @@ -31677,7 +31696,7 @@ name = "Private Channel" }, /turf/open/floor/carpet/neon/simple/lime, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "eIS" = ( /obj/effect/turf_decal/siding/dark, /obj/structure/sign/poster/official/random/directional/north, @@ -31716,7 +31735,7 @@ dir = 1 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "eJe" = ( /obj/effect/turf_decal/siding/wood, /obj/effect/turf_decal/siding/wood{ @@ -31767,7 +31786,7 @@ color = "#4874A2" }, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "eJT" = ( /obj/structure/table/wood/fancy, /obj/structure/sign/painting/library_secure{ @@ -32196,9 +32215,7 @@ dir = 8 }, /obj/item/kirbyplants/random, -/obj/machinery/camera/autoname/directional/south{ - dir = 5 - }, +/obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark/herringbone, /area/station/commons/dorms) "eMS" = ( @@ -32630,7 +32647,7 @@ /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/iron/white, @@ -32787,7 +32804,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "eSb" = ( /obj/effect/turf_decal/stripes/corner, /obj/structure/sign/poster/random/directional/north, @@ -32904,7 +32921,7 @@ dir = 8 }, /turf/open/floor/iron/dark/textured_corner, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "eTe" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning, /obj/structure/railing, @@ -33025,7 +33042,7 @@ pixel_y = 2 }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "eTX" = ( /obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible{ dir = 8 @@ -33149,7 +33166,7 @@ /obj/item/gun/energy/e_gun, /obj/item/gun/energy/e_gun, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "eUS" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 10 @@ -33770,7 +33787,7 @@ req_access = list("eva") }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "eZk" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/flora/rock/pile/jungle/style_2, @@ -34756,7 +34773,7 @@ uses = 10 }, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "fgG" = ( /obj/structure/fluff/paper/stack{ dir = 4 @@ -34793,7 +34810,7 @@ /obj/machinery/door/airlock/research/glass{ name = "Research Division Access" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/door/poddoor/shutters/preopen{ id = "rdrnd"; name = "Research and Development Shutters" @@ -34966,7 +34983,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "fic" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 4 @@ -35065,12 +35082,22 @@ /obj/structure/flora/rock/pile/jungle/style_random, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"fiB" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/chair/sofa/corp/right{ + dir = 8 + }, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "fiD" = ( /obj/machinery/door/airlock/maintenance{ name = "Library Maintenance" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -35146,7 +35173,7 @@ /area/station/security/courtroom) "fjo" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "fjp" = ( /obj/structure/rack, /obj/item/clothing/gloves/color/fyellow, @@ -35165,15 +35192,14 @@ /turf/open/floor/iron/dark, /area/station/commons/storage/primary) "fjq" = ( -/obj/effect/turf_decal/siding{ - dir = 5 +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 }, -/obj/structure/toilet{ - pixel_y = 8 +/obj/structure/chair/sofa/corp{ + dir = 8 }, -/obj/machinery/digital_clock/directional/north, -/turf/open/floor/iron/white/small, -/area/station/medical/patients_rooms) +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "fjv" = ( /obj/effect/turf_decal/siding, /obj/effect/turf_decal/trimline/blue/filled/warning, @@ -35188,7 +35214,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/landmark/navigate_destination, /turf/open/floor/plating, /area/station/maintenance/disposal) @@ -35389,6 +35415,7 @@ }, /obj/structure/flora/bush/lavendergrass/style_random, /obj/effect/decal/cleanable/dirt, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/misc/asteroid/airless, /area/space/nearstation) "flv" = ( @@ -36026,7 +36053,7 @@ "fqA" = ( /obj/structure/cable, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "fqC" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /obj/structure/sign/warning/electric_shock/directional/north, @@ -36304,7 +36331,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "fsY" = ( /obj/structure/sign/clock/directional/east, /obj/effect/turf_decal/siding/wideplating/dark{ @@ -36334,7 +36361,7 @@ dir = 6 }, /turf/open/water/beach, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "ftw" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -36419,10 +36446,6 @@ }, /obj/structure/bed, /obj/item/bedsheet, -/obj/machinery/flasher/directional/east{ - pixel_y = 24; - id = "Cell 2" - }, /turf/open/floor/iron/dark, /area/station/security/brig) "fut" = ( @@ -36503,6 +36526,7 @@ /turf/open/floor/plating, /area/station/maintenance/port/central) "fuU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/carpet, /area/station/medical/psychology) "fuV" = ( @@ -36511,7 +36535,7 @@ network = list("minisat") }, /turf/open/misc/asteroid/airless, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "fuW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37097,7 +37121,7 @@ /obj/structure/sign/warning/electric_shock/directional/south, /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "fyL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -37203,6 +37227,19 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/white, /area/station/science/lobby) +"fzH" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/flora/grass/jungle/a/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/curtain/cloth{ + color = "#52B4E9" + }, +/turf/open/floor/grass, +/area/station/medical/paramedic) "fzL" = ( /obj/structure/lattice/catwalk, /turf/open/space/openspace, @@ -37327,7 +37364,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "fAT" = ( /obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, @@ -37418,8 +37455,10 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos) "fBx" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/r_wall/rust, +/obj/structure/lattice/catwalk, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "fBL" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ @@ -37585,7 +37624,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 4 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "fDa" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -37615,6 +37654,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"fDh" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark/corner{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "fDk" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -37639,7 +37688,7 @@ /obj/machinery/door/airlock/research/glass{ name = "Research Division Access" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/door/poddoor/shutters/preopen{ id = "rdrnd"; name = "Research and Development Shutters" @@ -37886,7 +37935,7 @@ /obj/machinery/door/airlock/maintenance{ name = "Chapel Maintenance" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -38904,7 +38953,7 @@ dir = 9 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "fNd" = ( /obj/structure/cable, /obj/effect/spawner/random/trash, @@ -39803,7 +39852,7 @@ dir = 4 }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "fTH" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/south, @@ -40107,13 +40156,6 @@ /obj/machinery/suit_storage_unit/engine, /turf/open/floor/iron/dark/textured, /area/station/engineering/engine_smes) -"fVk" = ( -/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/item/radio/intercom/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "fVl" = ( /obj/structure/chair/sofa/bench/left{ dir = 1 @@ -40442,7 +40484,7 @@ /turf/open/floor/iron/stairs{ color = "#3d3e42" }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "fXQ" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 4 @@ -40574,13 +40616,13 @@ color = "#4874A2" }, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "fZk" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/end, /obj/machinery/holopad/secure, /obj/structure/cable, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "fZl" = ( /obj/structure/rack, /obj/item/reagent_containers/cup/bottle/acidic_buffer{ @@ -40774,7 +40816,7 @@ /obj/structure/broken_flooring/side/directional/north, /obj/structure/disposalpipe/segment, /turf/open/floor/plating, -/area/station/medical/patients_rooms) +/area/station/maintenance/department/cargo) "gaL" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -40842,6 +40884,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"gbi" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/sign/nanotrasen/directional/west, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "gbm" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ @@ -40925,17 +40977,13 @@ /turf/open/floor/iron/dark/textured, /area/station/security/brig/lower) "gbV" = ( -/obj/machinery/power/apc/auto_name/directional/west, /obj/structure/table/glass, /obj/machinery/computer/records/medical/laptop, /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 + dir = 4 }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/patients_rooms) +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "gbW" = ( /obj/structure/bookcase/random/fiction, /turf/open/floor/wood/large, @@ -41218,7 +41266,7 @@ /turf/open/floor/iron/stairs{ color = "#3d3e42" }, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "gej" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner, /obj/effect/spawner/random/vending/colavend, @@ -41409,7 +41457,7 @@ id = "AIgarden" }, /turf/open/floor/plating, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "gfH" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/chair/stool/directional/south, @@ -41516,7 +41564,7 @@ pixel_y = -10 }, /turf/open/misc/beach/sand, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "ggl" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Education Chamber Maintenance" @@ -41556,7 +41604,7 @@ name = "Library Maintenance" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -41762,6 +41810,7 @@ /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 1 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "gih" = ( @@ -41979,7 +42028,8 @@ id = "holdingflash"; name = "Holding Cell Flasher"; req_access = list("security"); - pixel_x = 24 + pixel_x = 24; + dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42387,7 +42437,7 @@ desc = "A very fashionable pair of flip flops."; name = "flip-flops" }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white/small, /area/station/commons/toilet/shower) @@ -42421,17 +42471,16 @@ /turf/open/floor/iron/dark, /area/station/science/ordnance) "gmk" = ( -/obj/effect/turf_decal/siding{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/blue{ dir = 8 }, -/obj/effect/turf_decal/siding/corner, -/obj/effect/turf_decal/siding/corner{ +/obj/effect/turf_decal/siding/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/herringbone, -/area/station/medical/patients_rooms) +/obj/structure/cable, +/turf/open/floor/iron/dark/herringbone, +/area/station/medical/paramedic) "gml" = ( /obj/structure/table/reinforced/rglass, /obj/item/pai_card{ @@ -42698,7 +42747,7 @@ /obj/effect/turf_decal/box/red, /obj/structure/cable, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "goa" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 4 @@ -42792,6 +42841,8 @@ 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/wood/parquet, /area/station/medical/psychology) "goM" = ( @@ -42801,7 +42852,7 @@ "goO" = ( /obj/structure/grille, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "goU" = ( /obj/structure/railing/corner{ dir = 1 @@ -42931,7 +42982,7 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "gpL" = ( /obj/structure/table/wood/fancy/blue, /obj/effect/spawner/random/aimodule/neutral, @@ -42946,7 +42997,7 @@ req_access = list("captain") }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "gqf" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 6 @@ -43102,7 +43153,7 @@ /obj/structure/cable, /obj/structure/disposalpipe/segment, /turf/open/floor/plating, -/area/station/medical/patients_rooms) +/area/station/maintenance/department/cargo) "gro" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -43126,7 +43177,7 @@ }, /obj/machinery/light/directional/north, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "grL" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 9 @@ -43173,6 +43224,7 @@ /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "gsi" = ( @@ -43353,7 +43405,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "guo" = ( /obj/structure/stairs/south, /obj/structure/railing{ @@ -43418,7 +43470,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "guG" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /obj/machinery/pipedispenser/disposal, @@ -43633,7 +43685,7 @@ /area/station/engineering/atmos) "gwv" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "gwz" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -44074,7 +44126,7 @@ /obj/effect/turf_decal/bot/right, /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "gzE" = ( /turf/open/floor/glass/reinforced, /area/station/maintenance/department/cargo) @@ -44171,7 +44223,7 @@ /obj/machinery/light/small/directional/west, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/carpet/neon/simple/lime, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "gAD" = ( /obj/effect/turf_decal/siding/wideplating_new/dark, /obj/structure/railing, @@ -44232,7 +44284,7 @@ /obj/structure/sign/poster/official/state_laws/directional/east, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "gBe" = ( /obj/effect/turf_decal/trimline/white/line, /obj/effect/turf_decal/trimline/white/line{ @@ -44322,7 +44374,7 @@ dir = 5 }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "gBD" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner, /obj/structure/table/reinforced, @@ -44472,7 +44524,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "gCg" = ( /obj/item/clothing/shoes/workboots/mining, /turf/open/misc/asteroid/airless{ @@ -44506,7 +44558,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "gCB" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 8 @@ -44516,8 +44568,7 @@ }, /obj/structure/tank_holder/extinguisher, /obj/machinery/camera/autoname/directional/south{ - network = list("ss13","medbay"); - dir = 5 + network = list("ss13","medbay") }, /turf/open/floor/iron/white, /area/station/medical/lower) @@ -45190,7 +45241,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/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -45498,7 +45549,7 @@ /obj/item/pillow, /obj/machinery/light/small/directional/south, /turf/open/floor/bamboo, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "gKD" = ( /obj/effect/turf_decal/stripes/white/box, /obj/machinery/computer/camera_advanced/xenobio{ @@ -45996,7 +46047,7 @@ color = "#3d3e42"; dir = 1 }, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "gNF" = ( /obj/structure/hedge, /obj/structure/railing{ @@ -46179,17 +46230,20 @@ /turf/open/floor/iron/dark, /area/station/science/xenobiology) "gPo" = ( -/obj/effect/turf_decal/siding{ - dir = 4 - }, -/obj/effect/turf_decal/siding{ +/obj/effect/turf_decal/siding/blue{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 +/obj/effect/turf_decal/siding/blue{ + dir = 4 }, -/turf/open/floor/iron/white/herringbone, -/area/station/medical/patients_rooms) +/obj/structure/cable, +/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/herringbone, +/area/station/medical/paramedic) "gPr" = ( /obj/machinery/holopad{ pixel_x = 1 @@ -46339,7 +46393,7 @@ /obj/structure/hedge, /obj/machinery/status_display/ai/directional/south, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "gQv" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -46428,7 +46482,7 @@ /obj/structure/extinguisher_cabinet/directional/west, /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "gRg" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -46515,15 +46569,13 @@ /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /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/multilayer/connected, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "gRR" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/trimline/dark/corner{ @@ -47000,6 +47052,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_edge, /area/station/medical/pharmacy) +"gVK" = ( +/obj/machinery/door/poddoor/preopen{ + id = "medprivacy"; + name = "Privacy Shutter" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/medical/treatment_center) "gVR" = ( /obj/effect/turf_decal/trimline/red/line, /obj/structure/closet/lasertag/red, @@ -47049,7 +47109,7 @@ /turf/open/floor/iron/white, /area/station/medical/abandoned) "gWm" = ( -/obj/machinery/computer/rdconsole, +/obj/machinery/computer/rdconsole/unlocked, /obj/machinery/button/door/directional/north{ id = "rdrnd"; name = "Research and Development Containment Control"; @@ -47101,7 +47161,7 @@ /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "gWz" = ( /obj/effect/turf_decal/siding/dark{ dir = 9 @@ -47168,7 +47228,7 @@ /obj/effect/turf_decal/bot, /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "gXd" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -47952,7 +48012,7 @@ dir = 4 }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "hcA" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 1 @@ -48070,7 +48130,7 @@ /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/bush/ferny/style_random, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hdF" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /obj/effect/mapping_helpers/broken_floor, @@ -48182,7 +48242,6 @@ /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/grassy/style_random, -/obj/machinery/light/small/directional/west, /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 }, @@ -48286,7 +48345,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 4 }, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "hfr" = ( /obj/structure/lattice, /obj/structure/railing{ @@ -48728,7 +48787,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -48736,8 +48795,6 @@ "hiq" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/effect/landmark/navigate_destination/med, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white/small, /area/station/medical/medbay/lobby) @@ -48805,8 +48862,13 @@ /obj/effect/turf_decal/trimline/white/warning{ dir = 8 }, +/obj/machinery/flasher/directional/east{ + id = "Cell 2"; + pixel_y = -5; + pixel_x = 24 + }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "hiF" = ( /obj/structure/broken_flooring/singular/always_floorplane/directional/east, /obj/structure/railing/corner/end/flip{ @@ -48964,18 +49026,17 @@ /turf/open/floor/iron/white/small, /area/station/commons/toilet/shower) "hjE" = ( -/obj/effect/turf_decal/siding{ - dir = 1 - }, -/obj/effect/turf_decal/siding, /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 = 9 }, -/turf/open/floor/iron/white/herringbone, -/area/station/medical/patients_rooms) +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "hjG" = ( /obj/machinery/door/airlock/research/glass/incinerator/ordmix_exterior{ name = "Burn Chamber Exterior Airlock" @@ -49119,7 +49180,7 @@ /obj/effect/turf_decal/bot, /obj/effect/spawner/random/armory/barrier_grenades, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "hkX" = ( /obj/effect/turf_decal/siding/wood/end{ dir = 1 @@ -49474,7 +49535,7 @@ }, /obj/structure/cable, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hox" = ( /obj/effect/turf_decal/siding/dark, /obj/structure/cable, @@ -49508,7 +49569,7 @@ /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/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -49698,7 +49759,7 @@ /obj/effect/turf_decal/trimline/dark_red/mid_joiner{ dir = 8 }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/machinery/digital_clock/directional/south, /turf/open/floor/iron/white/textured_large, /area/station/commons/fitness) @@ -49762,7 +49823,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 4 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hqL" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/cable, @@ -49846,9 +49907,7 @@ "hrj" = ( /obj/structure/railing/corner, /obj/effect/turf_decal/siding/wideplating_new/dark/corner, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "hrm" = ( @@ -50038,7 +50097,7 @@ /obj/machinery/airalarm/directional/north, /obj/machinery/light/directional/north, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "hsI" = ( /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 8 @@ -50058,7 +50117,7 @@ /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/tree/jungle/style_6, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hsL" = ( /obj/effect/turf_decal/bot, /obj/machinery/meter, @@ -50164,7 +50223,7 @@ /obj/effect/turf_decal/bot, /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "htu" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 4 @@ -50338,6 +50397,21 @@ }, /turf/open/floor/iron/dark/small, /area/station/command) +"huN" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/south{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/corporate_suite) "huQ" = ( /obj/machinery/door/airlock/maintenance{ name = "Security Maintenance" @@ -50652,7 +50726,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "hxj" = ( /obj/structure/chair/office/light{ dir = 8 @@ -50761,7 +50835,7 @@ network = list("minisat") }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "hyb" = ( /obj/effect/turf_decal/trimline/dark/corner{ dir = 1 @@ -50773,7 +50847,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hyc" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/line{ @@ -51080,7 +51154,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "hAK" = ( /obj/effect/turf_decal/siding{ dir = 10 @@ -51245,6 +51319,12 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"hCG" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark, +/obj/structure/railing, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "hCH" = ( /obj/structure/flora/grass/green/style_3, /obj/structure/flora/bush/flowers_br/style_random, @@ -51341,7 +51421,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "hDo" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 @@ -51611,7 +51691,7 @@ /obj/machinery/light_switch/directional/east, /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hFE" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 4 @@ -51655,7 +51735,7 @@ dir = 4 }, /obj/structure/closet/firecloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central) "hFV" = ( @@ -51715,7 +51795,7 @@ uses = 10 }, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "hGO" = ( /obj/effect/turf_decal/tile/dark/diagonal_centre, /obj/structure/table/glass, @@ -51912,10 +51992,8 @@ /obj/item/clothing/under/misc/assistantformal, /obj/item/clothing/suit/hooded/wintercoat, /obj/item/clothing/shoes/winterboots, -/obj/machinery/camera/autoname/directional/south{ - dir = 5 - }, -/obj/effect/landmark/start/hangover/closet, +/obj/machinery/camera/autoname/directional/south, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark/herringbone, /area/station/commons/locker) "hIe" = ( @@ -51976,7 +52054,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hIC" = ( /obj/structure/flora/rock/pile/style_random, /obj/structure/flora/grass/jungle/b/style_random, @@ -52302,7 +52380,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "hLu" = ( /obj/effect/turf_decal/trimline/dark/line{ dir = 6 @@ -52399,8 +52477,7 @@ /obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/filingcabinet/white, /turf/open/floor/wood/parquet, /area/station/medical/psychology) "hMf" = ( @@ -52588,7 +52665,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "hNu" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/effect/turf_decal/trimline/dark/line, @@ -52612,16 +52689,6 @@ dir = 8 }, /obj/structure/hedge, -/obj/structure/sign/directions/engineering/directional/south{ - pixel_y = -40 - }, -/obj/structure/sign/directions/dorms/directional/south{ - pixel_y = -24; - dir = 8 - }, -/obj/structure/sign/directions/evac/directional/south{ - dir = 8 - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52868,6 +52935,9 @@ dir = 10 }, /obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/warning/secure_area/directional/south{ + pixel_x = -32 + }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) "hOZ" = ( @@ -53126,7 +53196,7 @@ /obj/machinery/door/airlock/research/glass{ name = "Research Division Access" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/machinery/door/poddoor/shutters/preopen{ @@ -53273,7 +53343,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "hRv" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 9 @@ -53368,7 +53438,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hSt" = ( /obj/effect/turf_decal/trimline/blue/corner, /obj/effect/turf_decal/trimline/blue/corner{ @@ -53560,13 +53630,13 @@ }, /obj/effect/turf_decal/siding/dark, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "hTz" = ( /obj/structure/rack, /obj/item/emergency_bed, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, -/area/station/medical/patients_rooms) +/area/station/maintenance/department/cargo) "hTB" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -53775,7 +53845,7 @@ /obj/effect/turf_decal/tile/dark_blue/half/contrasted, /obj/structure/closet/crate/goldcrate, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "hVw" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -53939,7 +54009,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hWL" = ( /obj/structure/railing/corner{ dir = 8 @@ -53967,7 +54037,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hWT" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 5 @@ -53978,7 +54048,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/cable/layer3, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/equipment) +/area/station/ai/satellite/equipment) "hXa" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -54073,6 +54143,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/general, /obj/structure/cable, +/obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron/dark, /area/station/security/breakroom) "hXH" = ( @@ -54296,7 +54367,7 @@ /area/station/security/prison) "hZu" = ( /obj/effect/turf_decal/bot, -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 8 }, /turf/open/floor/iron/dark/textured_large, @@ -54539,13 +54610,11 @@ /obj/effect/turf_decal/siding/thinplating/dark{ dir = 6 }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/structure/railing{ dir = 1 }, /obj/structure/flora/rock/pile/jungle/style_random, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "ibp" = ( @@ -54658,7 +54727,7 @@ /area/station/maintenance/port/aft) "icj" = ( /turf/closed/wall, -/area/station/medical/office) +/area/station/medical/paramedic) "icp" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -54691,7 +54760,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "icu" = ( /obj/effect/turf_decal/siding/dark/corner{ dir = 1 @@ -55211,9 +55280,6 @@ /turf/open/misc/asteroid/airless, /area/space/nearstation) "igS" = ( -/obj/structure/sign/departments/vault/directional/north{ - pixel_x = 32 - }, /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 1 }, @@ -55400,7 +55466,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "iik" = ( /obj/effect/turf_decal/siding/dark_blue{ dir = 9 @@ -55524,7 +55590,7 @@ /obj/structure/reagent_dispensers/watertank/high, /obj/item/reagent_containers/cup/watering_can, /obj/machinery/camera/autoname/directional/south{ - dir = 5 + pixel_x = 20 }, /turf/open/floor/iron/dark/herringbone, /area/station/service/hydroponics) @@ -55906,7 +55972,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -55954,7 +56020,7 @@ /obj/structure/flora/rock/pile/jungle/style_random, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "imM" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 4 @@ -56174,7 +56240,7 @@ /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/carpet/blue, -/area/station/ai_monitored/turret_protected/aisat/equipment) +/area/station/ai/satellite/equipment) "ioq" = ( /obj/structure/broken_flooring/singular/directional/east, /obj/machinery/light/small/directional/west, @@ -56558,7 +56624,7 @@ name = "Tactical Gear Locker" }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "iqV" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -56604,6 +56670,8 @@ dir = 4 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/small, /area/station/medical/medbay/lobby) "irw" = ( @@ -56613,7 +56681,7 @@ /area/station/engineering/atmos/storage/gas) "irx" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "irB" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -56726,10 +56794,8 @@ /obj/effect/turf_decal/trimline/brown/line{ dir = 1 }, -/obj/structure/noticeboard/directional/north{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/noticeboard/directional/north, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) "isG" = ( @@ -57243,10 +57309,10 @@ /turf/open/floor/wood/large, /area/station/hallway/primary/port) "iwD" = ( -/obj/effect/turf_decal/siding/brown{ +/obj/effect/turf_decal/siding/brown/corner{ dir = 4 }, -/obj/effect/turf_decal/trimline/brown/filled/line{ +/obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 4 }, /turf/open/floor/iron, @@ -57343,7 +57409,7 @@ }, /obj/structure/cable/layer3, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/equipment) +/area/station/ai/satellite/equipment) "ixf" = ( /obj/structure/cable, /obj/structure/railing/corner{ @@ -57378,7 +57444,7 @@ dir = 10 }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "ixm" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/vending/cigarette, @@ -57846,7 +57912,7 @@ }, /obj/machinery/light/floor, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "iBn" = ( /obj/structure/mop_bucket, /obj/item/mop, @@ -58119,7 +58185,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable/multilayer/connected, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "iDe" = ( /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) @@ -58142,9 +58208,7 @@ pixel_x = 9; pixel_y = 11 }, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "iDu" = ( @@ -58823,10 +58887,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/smooth_edge, /area/station/service/hydroponics) -"iHK" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall, -/area/station/ai_monitored/command/nuke_storage) "iHR" = ( /obj/structure/broken_flooring/singular/directional/north, /obj/structure/curtain/cloth{ @@ -58971,7 +59031,7 @@ /area/station/science/xenobiology) "iJc" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "iJd" = ( /obj/effect/turf_decal/siding/purple, /obj/structure/table/reinforced/rglass, @@ -59100,13 +59160,14 @@ /turf/open/floor/plating, /area/station/maintenance/port) "iKq" = ( -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/door/airlock/maintenance{ name = "UndergroundCasino" }, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "iKr" = ( @@ -59322,7 +59383,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -59559,7 +59620,7 @@ /area/station/science/ordnance/testlab) "iNm" = ( /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "iNo" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 4 @@ -59766,7 +59827,7 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "iPp" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 8 }, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -59794,7 +59855,7 @@ /obj/structure/table/reinforced, /obj/machinery/microwave, /turf/open/floor/iron/dark/textured_corner, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "iPF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59809,7 +59870,7 @@ /obj/machinery/door/firedoor, /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "iPG" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 10 @@ -60189,6 +60250,23 @@ dir = 1 }, /area/station/hallway/primary/starboard) +"iSX" = ( +/obj/structure/sign/directions/medical/directional/east{ + pixel_y = 8; + dir = 1; + pixel_x = 0 + }, +/obj/structure/sign/directions/science/directional/east{ + dir = 1; + pixel_x = 0 + }, +/obj/structure/sign/directions/supply/directional/east{ + pixel_y = -8; + dir = 1; + pixel_x = 0 + }, +/turf/closed/wall, +/area/station/commons/storage/primary) "iSZ" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -60227,7 +60305,7 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "iTm" = ( /obj/effect/turf_decal/trimline/purple/filled/warning, /obj/effect/turf_decal/stripes/corner{ @@ -60262,7 +60340,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "iTt" = ( /obj/effect/turf_decal/siding/dark{ dir = 1 @@ -60504,6 +60582,7 @@ dir = 1 }, /obj/structure/flora/rock/pile/jungle/style_random, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "iVR" = ( @@ -60550,7 +60629,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable/layer3, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "iWl" = ( /obj/structure/railing{ dir = 4 @@ -60691,6 +60770,7 @@ /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/effect/turf_decal/tile/red/half/contrasted, /obj/machinery/camera/autoname/directional/north, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, /area/station/security/checkpoint/escape) "iWP" = ( @@ -60831,7 +60911,7 @@ name = "Auxiliry Dock Storage Room" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60922,7 +61002,7 @@ pixel_x = -6; pixel_y = 8 }, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = -6 }, /turf/open/floor/iron/dark, @@ -61134,7 +61214,7 @@ uses = 10 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "jbw" = ( /obj/structure/railing, /obj/structure/railing{ @@ -61146,7 +61226,7 @@ color = "#3d3e42"; dir = 4 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "jbD" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -61619,12 +61699,12 @@ /turf/closed/wall/r_wall, /area/station/maintenance/aft/greater) "jeA" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ id = "cargosecprivacy"; name = "Privacy Shutter" }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/checkpoint/supply) "jeI" = ( @@ -61719,7 +61799,7 @@ /obj/structure/hedge, /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/dark/textured_corner, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "jfw" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 4 @@ -61959,7 +62039,7 @@ }, /obj/structure/cable, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "jhE" = ( /obj/effect/turf_decal/tile/dark_blue{ dir = 8 @@ -62152,7 +62232,8 @@ dir = 1 }, /obj/structure/sign/gym/right{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 9 @@ -62343,7 +62424,7 @@ req_access = list("ai_upload") }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "jkh" = ( /obj/effect/turf_decal/stripes/box, /obj/machinery/computer/gateway_control, @@ -62406,6 +62487,11 @@ }, /turf/open/floor/iron/dark/smooth_edge, /area/station/science/genetics) +"jkQ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "jkW" = ( /obj/structure/flora/rock/pile/jungle/style_random, /turf/open/floor/engine/hull/reinforced, @@ -62543,7 +62629,7 @@ /obj/machinery/power/port_gen/pacman, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "jmZ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -62678,7 +62764,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "joJ" = ( /obj/structure/hedge, /obj/structure/railing{ @@ -62700,7 +62786,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "joT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -62968,14 +63054,14 @@ /obj/item/crowbar/red, /obj/item/wrench, /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat/service"; + control_area = "/area/station/ai/satellite/service"; name = "Service Bay Turret Control"; req_access = list("minisat"); pixel_y = -27 }, /obj/machinery/digital_clock/directional/east, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/equipment) +/area/station/ai/satellite/equipment) "jqT" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -63433,7 +63519,7 @@ /obj/structure/flora/bush/flowers_pp/style_random, /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "juB" = ( /obj/machinery/computer/order_console/mining, /turf/open/floor/iron/dark/textured_large, @@ -63528,10 +63614,10 @@ /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/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/central) "jvd" = ( @@ -63750,7 +63836,7 @@ "jwy" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/machinery/light/directional/south, /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark/small, @@ -63797,6 +63883,7 @@ dir = 1 }, /obj/structure/hedge, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron/white, /area/station/hallway/primary/fore) "jxc" = ( @@ -63807,7 +63894,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/command/teleporter, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -63880,7 +63967,7 @@ /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/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -64105,6 +64192,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/hallway/primary/port) +"jzp" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic, +/turf/open/floor/plating, +/area/station/maintenance/department/cargo) "jzs" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/structure/cable, @@ -64263,7 +64359,7 @@ /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "jAf" = ( /obj/machinery/airalarm/directional/north, /obj/structure/cable, @@ -64317,8 +64413,7 @@ dir = 4 }, /obj/machinery/camera/autoname/directional/south{ - network = list("ss13","medbay"); - dir = 5 + network = list("ss13","medbay") }, /turf/open/floor/iron/dark/small, /area/station/medical/cryo) @@ -64344,7 +64439,7 @@ dir = 8 }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "jAu" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -64366,7 +64461,7 @@ /obj/item/radio/intercom/directional/north, /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "jAD" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -64590,7 +64685,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "jBA" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -64695,10 +64790,6 @@ /obj/machinery/computer/security/telescreen/rd/directional/north, /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/rd) -"jCi" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/station/engineering/supermatter) "jCl" = ( /obj/machinery/door/airlock/security/glass{ name = "Security Desk" @@ -64720,9 +64811,7 @@ dir = 5 }, /obj/item/kirbyplants/random, -/obj/machinery/camera/autoname/directional/south{ - dir = 5 - }, +/obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark/corner{ dir = 8 }, @@ -64891,6 +64980,13 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) +"jDr" = ( +/obj/structure/sign/directions/evac/directional/north{ + dir = 8; + pixel_y = 0 + }, +/turf/closed/wall, +/area/station/commons/dorms) "jDu" = ( /obj/structure/hedge, /obj/structure/railing{ @@ -64936,6 +65032,8 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/psychology, /obj/structure/cable, /obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/psychology) "jEa" = ( @@ -65170,7 +65268,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "jFD" = ( /obj/effect/turf_decal/siding/dark{ dir = 1 @@ -65731,7 +65829,7 @@ /obj/structure/sign/warning/vacuum/external/directional/south, /obj/structure/closet/emcloset, /obj/effect/turf_decal/bot_white, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/maintenance/central) "jKq" = ( @@ -65783,7 +65881,7 @@ /obj/machinery/teleport/station, /obj/item/radio/intercom/directional/north, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "jKS" = ( /obj/effect/turf_decal/siding{ dir = 1 @@ -66018,11 +66116,12 @@ }, /obj/effect/turf_decal/siding/wood/corner, /obj/structure/sign/painting/library{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/structure/closet/secure_closet/personal/cabinet, /obj/structure/sign/poster/random/directional/west, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/wood/large, /area/station/commons/dorms) "jMG" = ( @@ -66429,7 +66528,7 @@ /obj/structure/cable, /obj/machinery/status_display/ai/directional/north, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "jPK" = ( /obj/structure/railing/corner{ dir = 8 @@ -66460,7 +66559,7 @@ }, /obj/structure/cable, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "jQc" = ( /obj/effect/turf_decal/siding/brown{ dir = 1 @@ -66614,14 +66713,15 @@ }, /area/station/security/lockers) "jQI" = ( -/obj/effect/turf_decal/siding, -/obj/effect/turf_decal/siding{ - dir = 1 +/obj/effect/turf_decal/trimline/blue/filled/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/herringbone, -/area/station/medical/patients_rooms) +/obj/structure/fireaxecabinet/jawsofrecovery/directional/east, +/obj/effect/turf_decal/trimline/blue/tram{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "jQK" = ( /obj/effect/turf_decal/siding/brown{ dir = 4 @@ -66715,7 +66815,7 @@ "jRq" = ( /obj/structure/cable/multilayer/connected, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "jRr" = ( /obj/structure/table/reinforced/rglass, /obj/item/flashlight/lamp/green{ @@ -66881,7 +66981,7 @@ /obj/structure/hedge, /obj/effect/landmark/event_spawn, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "jTn" = ( /obj/effect/spawner/random/trash/graffiti{ random_icon = 0 @@ -67038,7 +67138,7 @@ /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, /turf/open/floor/carpet/blue, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "jUR" = ( /obj/structure/transit_tube/station/dispenser/reverse{ dir = 4 @@ -67053,7 +67153,8 @@ /obj/effect/turf_decal/siding/thinplating_new/light, /obj/effect/turf_decal/trimline/dark_red/line, /obj/structure/sign/gym/right{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/trimline/dark_red/mid_joiner, /obj/machinery/light/directional/north, @@ -67088,7 +67189,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "jUZ" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 @@ -67247,13 +67348,13 @@ /area/station/science/cytology) "jWh" = ( /obj/structure/table/reinforced/rglass, -/obj/machinery/fax{ - fax_name = "Research Director's Office"; - name = "Research Director's Fax Machine" - }, /obj/item/folder/blue, /obj/item/clothing/neck/stethoscope, /obj/item/clothing/glasses/hud/health, +/obj/machinery/fax{ + fax_name = "Chief Medical Officer's Office"; + name = "Chief Medical Officer's Fax Machine" + }, /turf/open/floor/carpet/blue, /area/station/command/heads_quarters/cmo) "jWj" = ( @@ -67329,7 +67430,7 @@ /obj/effect/turf_decal/siding/wideplating_new/dark/corner, /obj/structure/flora/bush/lavendergrass/style_random, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "jWT" = ( /obj/structure/sign/poster/contraband/wildcat/directional/east, /obj/structure/hedge, @@ -67436,7 +67537,7 @@ /obj/structure/closet/wardrobe/white, /obj/effect/turf_decal/trimline/white, /obj/item/clothing/gloves/color/white, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark/herringbone, /area/station/commons/locker) "jYb" = ( @@ -67882,14 +67983,12 @@ /obj/structure/cable, /obj/effect/turf_decal/bot_white, /obj/structure/chair, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/aft/lesser) "kbw" = ( @@ -69089,7 +69188,8 @@ /obj/structure/sign/map/left{ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/bot, /obj/machinery/light/directional/north, @@ -69110,7 +69210,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable/layer3, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "kjT" = ( /obj/effect/turf_decal/siding/dark{ dir = 1 @@ -69264,8 +69364,12 @@ /obj/effect/turf_decal/trimline/white/warning{ dir = 4 }, +/obj/machinery/flasher/directional/west{ + id = "AI"; + pixel_y = -5 + }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "kkZ" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/cardboard, @@ -69650,9 +69754,7 @@ /obj/machinery/light_switch/directional/south{ pixel_x = -6 }, -/obj/machinery/camera/autoname/directional/south{ - dir = 5 - }, +/obj/machinery/camera/autoname/directional/south, /turf/open/floor/carpet, /area/station/command/meeting_room) "knt" = ( @@ -69744,7 +69846,7 @@ name = "Wine Storage" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -69799,7 +69901,7 @@ /obj/effect/turf_decal/delivery, /obj/structure/closet/emcloset/anchored, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "koi" = ( /obj/effect/turf_decal/tile/dark/diagonal_centre, /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -69958,7 +70060,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "kpj" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -69981,12 +70083,12 @@ dir = 8 }, /obj/machinery/camera/autoname/directional/north{ - dir = 9; - network = list("aiupload") + network = list("aiupload"); + pixel_x = 22 }, /obj/effect/landmark/start/cyborg, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "kpo" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -70334,7 +70436,7 @@ dir = 4 }, /turf/open/floor/carpet/neon/simple/lime, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "krt" = ( /obj/effect/spawner/structure/window, /obj/structure/curtain/cloth{ @@ -70417,7 +70519,7 @@ "krS" = ( /obj/machinery/porta_turret/ai, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "krX" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -70604,7 +70706,7 @@ dir = 1 }, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "ktO" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 4 @@ -70785,7 +70887,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -71176,7 +71278,7 @@ /area/station/security/checkpoint/science) "kxn" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "kxp" = ( /obj/item/radio/intercom/directional/south, /obj/structure/table/reinforced, @@ -71255,17 +71357,6 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 1 }, -/obj/structure/sign/directions/vault/directional/south{ - pixel_y = -24; - dir = 9 - }, -/obj/structure/sign/directions/command/directional/south{ - dir = 9 - }, -/obj/structure/sign/directions/upload/directional/south{ - pixel_y = -40; - dir = 9 - }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/command) "kxV" = ( @@ -71289,12 +71380,18 @@ /area/station/engineering/atmos/project) "kyd" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 + dir = 8 }, -/obj/item/kirbyplants/random, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/patients_rooms) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/obj/structure/sign/clock/directional/east, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "kye" = ( /obj/structure/flora/rock/pile/jungle/large/style_random, /obj/effect/decal/cleanable/dirt, @@ -71468,7 +71565,7 @@ dir = 8 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "kzh" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 6 @@ -71527,7 +71624,7 @@ "kzJ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "kzM" = ( /obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71536,7 +71633,7 @@ }, /obj/machinery/newscaster/directional/south, /turf/open/floor/carpet/blue, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "kzQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -71798,7 +71895,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "kCd" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -71846,18 +71943,9 @@ /obj/item/stack/medical/suture, /obj/item/stack/medical/suture, /obj/machinery/airalarm/directional/west, -/obj/machinery/camera/autoname/directional/north{ - network = list("ss13","medbay") - }, +/obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"kCp" = ( -/obj/structure/sign/warning/secure_area{ - desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM" - }, -/turf/closed/wall/r_wall, -/area/station/science/server) "kCq" = ( /obj/structure/grille, /obj/structure/lattice, @@ -72043,7 +72131,7 @@ }, /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "kDy" = ( /obj/structure/fireplace{ pixel_x = -32 @@ -72202,7 +72290,7 @@ uses = 10 }, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "kEj" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -72329,7 +72417,7 @@ /obj/machinery/light/floor, /obj/structure/cable, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "kEP" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 4 @@ -72836,6 +72924,22 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/hallway/secondary/command) +"kIp" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "kIv" = ( /obj/structure/hedge, /turf/open/floor/plating, @@ -72853,7 +72957,7 @@ network = list("minisat") }, /turf/open/floor/engine/hull/reinforced, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "kII" = ( /obj/machinery/research/anomaly_refinery, /obj/effect/turf_decal/siding/purple, @@ -73032,17 +73136,9 @@ /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) "kJX" = ( -/obj/structure/sink/directional/east, -/obj/structure/mirror/directional/west, -/obj/effect/turf_decal/siding{ - dir = 10 - }, -/mob/living/basic/mouse/brown{ - dir = 4; - name = "Jerry" - }, -/turf/open/floor/iron/white/small, -/area/station/medical/patients_rooms) +/obj/effect/turf_decal/siding/blue/end, +/turf/open/floor/iron/dark/herringbone, +/area/station/medical/paramedic) "kKb" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -73170,7 +73266,7 @@ /area/station/maintenance/department/medical) "kLs" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "kLw" = ( /turf/open/floor/wood/large, /area/station/command/heads_quarters/cmo) @@ -73191,7 +73287,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "kLD" = ( /obj/effect/turf_decal/tile/purple/half/contrasted, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -73262,7 +73358,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "kMe" = ( /obj/effect/turf_decal/bot_white/right, /obj/effect/turf_decal/stripes/line, @@ -73280,7 +73376,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "kMn" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -73359,6 +73455,13 @@ color = "#3d3e42" }, /area/station/security/prison) +"kMY" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "kMZ" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 @@ -73385,13 +73488,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/small, /area/station/security/execution/transfer) -"kNp" = ( -/obj/structure/sign/warning/secure_area{ - desc = "A warning sign which reads 'BOMB RANGE"; - name = "BOMB RANGE" - }, -/turf/closed/wall, -/area/station/science/ordnance/bomb) "kNt" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/trimline/brown, @@ -73694,7 +73790,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "kQf" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -73824,12 +73920,12 @@ /obj/effect/landmark/event_spawn, /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "kQP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "kQZ" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/structure/chair/wood{ @@ -74007,7 +74103,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "kSE" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74151,7 +74247,7 @@ /obj/effect/turf_decal/delivery, /obj/structure/closet/emcloset, /obj/structure/sign/poster/random/directional/north, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) "kTG" = ( @@ -74541,7 +74637,7 @@ }, /obj/machinery/light/directional/south, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "kXm" = ( /obj/structure/sign/poster/random/directional/north, /obj/effect/spawner/random/maintenance, @@ -74798,7 +74894,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/digital_clock/directional/north, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "laa" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -75376,7 +75472,7 @@ /obj/structure/flora/bush/fullgrass/style_random, /obj/machinery/light/small/directional/south, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "lfD" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -75674,7 +75770,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron/dark, /area/station/maintenance/aft/greater) "lid" = ( @@ -75735,7 +75831,7 @@ pixel_y = 0 }, /turf/open/water, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "liG" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ @@ -76083,7 +76179,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "lkQ" = ( /obj/structure/sign/warning/secure_area/directional/south, /obj/effect/decal/cleanable/vomit/nebula, @@ -76337,7 +76433,7 @@ name = "Civil Rad Shelter" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -76746,7 +76842,7 @@ /obj/effect/turf_decal/bot/right, /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "lpK" = ( /obj/effect/turf_decal/tile/brown/opposingcorners{ dir = 1 @@ -76959,7 +77055,7 @@ /turf/open/floor/iron/dark/herringbone, /area/station/commons/dorms) "lrn" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 1 }, /obj/effect/turf_decal/bot, @@ -77240,12 +77336,15 @@ /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 9 }, -/obj/item/canvas/twentythree_nineteen, +/obj/item/canvas/twentythree_nineteen{ + dir = 1 + }, /obj/structure/easel, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/cobweb, /obj/structure/sign/painting/library{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/wood/tile, /area/station/maintenance/port) @@ -77827,6 +77926,11 @@ /obj/machinery/vending/security, /turf/open/floor/glass/reinforced, /area/station/security/lockers) +"lyI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/nanotrasen/directional/east, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "lyM" = ( /obj/structure/reagent_dispensers/watertank, /obj/structure/sign/warning/no_smoking/directional/north, @@ -78043,12 +78147,10 @@ /obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ dir = 4 }, -/obj/machinery/button/door/directional/south{ +/obj/machinery/button/door/directional/east{ id = "gateshutter"; name = "Gateway Shutter Control"; - req_access = list("gateway"); - pixel_y = 0; - pixel_x = 24 + req_access = list("gatweay") }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/command) @@ -78256,7 +78358,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "lBk" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 5 @@ -78304,7 +78406,8 @@ /area/space/nearstation) "lBt" = ( /obj/structure/sign/painting/library{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/siding/wood/corner{ dir = 1 @@ -78341,9 +78444,6 @@ /turf/open/floor/iron/dark, /area/station/command/bridge) "lBR" = ( -/obj/machinery/door/airlock/medical{ - name = "Psychology Lobby" - }, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/door/firedoor, /obj/structure/cable, @@ -78352,8 +78452,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic, +/obj/machinery/door/airlock/medical/glass{ + name = "Paramedic Dispatch Room" + }, /turf/open/floor/iron/white, -/area/station/medical/patients_rooms) +/area/station/medical/paramedic) "lBS" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -78659,9 +78763,9 @@ "lEI" = ( /obj/structure/transit_tube, /obj/effect/turf_decal/trimline/dark_blue, -/obj/structure/window/reinforced/fulltile, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "lEP" = ( /obj/effect/turf_decal/siding/dark/end{ dir = 4 @@ -79066,7 +79170,7 @@ }, /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "lII" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/glass, @@ -79123,7 +79227,7 @@ dir = 9 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "lJf" = ( /obj/structure/sign/poster/random/directional/north, /obj/structure/table/wood, @@ -79246,7 +79350,7 @@ /obj/structure/sign/warning/vacuum/external/directional/north, /obj/machinery/light/small/directional/north, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "lKl" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -79468,7 +79572,7 @@ }, /obj/structure/hedge, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "lMe" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 10 @@ -79558,7 +79662,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable/layer3, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lMG" = ( /obj/effect/turf_decal/trimline/brown/filled/corner, /obj/effect/turf_decal/trimline/brown/filled/warning{ @@ -79649,7 +79753,7 @@ pixel_x = 7; pixel_y = 14 }, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = 7; pixel_y = 7 }, @@ -79742,7 +79846,7 @@ dir = 1 }, /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat_interior"; + control_area = "/area/station/ai/satellite/interior"; name = "Antechamber Turret Control"; req_access = list("minisat"); pixel_y = -30 @@ -79754,7 +79858,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "lND" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 @@ -79947,7 +80051,7 @@ }, /obj/structure/cable/layer3, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lPA" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -79965,7 +80069,7 @@ }, /obj/structure/cable, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lPG" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -80155,7 +80259,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "lRC" = ( /obj/effect/decal/cleanable/dirt, /turf/open/misc/asteroid/airless, @@ -80684,7 +80788,7 @@ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/command/teleporter, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/door/airlock/external{ @@ -80725,7 +80829,7 @@ color = "#4874A2" }, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "lWJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -80801,7 +80905,7 @@ /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /turf/open/floor/iron/dark/textured_corner, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "lXF" = ( /obj/structure/closet/emcloset, /obj/effect/decal/cleanable/dirt, @@ -80957,7 +81061,6 @@ dir = 8 }, /obj/effect/landmark/start/hangover, -/obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "lYN" = ( @@ -81091,7 +81194,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "lZu" = ( /obj/structure/hedge, /obj/machinery/newscaster/directional/south, @@ -81306,7 +81409,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "mbl" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted, /obj/structure/sink/directional/west, @@ -81465,7 +81568,6 @@ dir = 1 }, /obj/machinery/duct, -/obj/effect/landmark/start/paramedic, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/smooth_large, /area/station/medical/treatment_center) @@ -82010,6 +82112,7 @@ dir = 6 }, /obj/structure/sign/gym{ + dir = 1; pixel_y = 32 }, /obj/machinery/status_display/evac/directional/west, @@ -82093,7 +82196,7 @@ /obj/effect/turf_decal/bot, /obj/structure/safe/vault, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "mhQ" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/maintenance, @@ -82127,7 +82230,7 @@ /obj/machinery/door/firedoor, /obj/structure/cable, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "mij" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -82435,7 +82538,7 @@ /turf/open/floor/iron/dark/textured, /area/station/command) "mkJ" = ( -/obj/machinery/computer/station_alert/station_only, +/obj/machinery/computer/station_alert, /obj/machinery/button/door/directional/north{ pixel_x = 6; id = "atmoslock"; @@ -83148,7 +83251,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/maintenance/port/aft) "mqG" = ( @@ -83207,7 +83310,7 @@ /turf/open/floor/iron/dark/textured, /area/station/security/checkpoint/medical) "mqY" = ( -/obj/structure/no_effect_signpost, +/obj/structure/signpost, /turf/open/misc/asteroid/airless, /area/space/nearstation) "mqZ" = ( @@ -83291,7 +83394,7 @@ }, /obj/structure/flora/rock/pile/style_random, /turf/open/water, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "mrU" = ( /obj/structure/sign/departments/security/directional/south, /obj/effect/turf_decal/trimline/red/filled/corner{ @@ -83377,7 +83480,7 @@ }, /obj/structure/flora/rock/pile/style_random, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "msl" = ( /obj/machinery/defibrillator_mount/directional/south, /obj/structure/table/glass, @@ -83481,7 +83584,7 @@ pixel_x = 8 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "msS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83490,7 +83593,7 @@ color = "#3d3e42"; dir = 1 }, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "msT" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/bot_white, @@ -83541,8 +83644,8 @@ /area/station/maintenance/port) "mtj" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) "mty" = ( @@ -83608,7 +83711,7 @@ /obj/structure/rack, /obj/machinery/camera/autoname/motion/directional/east, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "muq" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -83813,9 +83916,7 @@ dir = 8 }, /obj/item/kirbyplants/random, -/obj/machinery/camera/autoname/directional/south{ - dir = 5 - }, +/obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark/side{ dir = 8 }, @@ -84480,7 +84581,8 @@ /obj/machinery/button/flasher{ id = "visitorflash"; pixel_x = -24; - pixel_y = -6 + pixel_y = -6; + dir = 8 }, /turf/open/floor/iron/dark/side{ dir = 9 @@ -84531,7 +84633,7 @@ color = "#3d3e42"; dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "mBg" = ( /obj/structure/chair/comfy/brown{ buildstackamount = 0; @@ -84551,7 +84653,6 @@ /obj/structure/fence{ dir = 4 }, -/obj/structure/sign/warning/secure_area, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "mBl" = ( @@ -84579,7 +84680,7 @@ dir = 8 }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "mBn" = ( /obj/structure/flora/bush/grassy/style_3, /obj/effect/turf_decal/siding/wood, @@ -84702,17 +84803,9 @@ /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos/project) "mCn" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/line{ - dir = 4 - }, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/dark, +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/station/command/corporate_suite) "mCr" = ( /obj/effect/spawner/random/structure/crate, @@ -84832,16 +84925,14 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 10 }, -/obj/machinery/button/door/directional/south{ - id = "gateshutter"; - name = "Gateway Shutter Control"; - req_access = list("gateway"); - pixel_y = 0; - pixel_x = -24 - }, /obj/effect/turf_decal/trimline/dark_blue/corner{ dir = 4 }, +/obj/machinery/button/door/directional/west{ + id = "gateshutter"; + name = "Gatway Shutter Control"; + req_access = list("gateway") + }, /turf/open/floor/iron/dark, /area/station/command/gateway) "mDe" = ( @@ -84993,7 +85084,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "mFk" = ( /obj/effect/turf_decal/siding/dark{ dir = 1 @@ -85119,8 +85210,11 @@ /turf/open/floor/iron/white/textured, /area/station/commons/fitness/recreation/pool) "mGv" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall, +/obj/structure/railing, +/obj/structure/marker_beacon/burgundy, +/obj/structure/lattice/catwalk, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/misc/asteroid/airless, /area/space/nearstation) "mGG" = ( /obj/effect/turf_decal/siding/wood{ @@ -85258,6 +85352,13 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"mHR" = ( +/obj/effect/spawner/structure/window, +/obj/structure/curtain/cloth{ + color = "#52B4E9" + }, +/turf/open/floor/plating, +/area/station/medical/paramedic) "mHT" = ( /turf/closed/wall/r_wall, /area/station/security/prison/safe) @@ -85345,7 +85446,7 @@ dir = 8 }, /obj/structure/closet/emcloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central) "mIB" = ( @@ -85685,7 +85786,7 @@ /obj/machinery/newscaster/directional/north, /obj/machinery/camera/autoname/motion/directional/north, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "mKS" = ( /obj/machinery/door/airlock/mining{ name = "Drone Bay" @@ -85905,7 +86006,7 @@ color = "#4874A2" }, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "mNi" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible/layer1{ dir = 4 @@ -86735,7 +86836,7 @@ dir = 8 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "mSl" = ( /obj/machinery/door/airlock/external{ name = "Arrival Airlock"; @@ -86877,6 +86978,7 @@ page_link = "Psychologist"; name = "Brain System" }, +/obj/machinery/firealarm/directional/west, /turf/open/floor/wood/parquet, /area/station/medical/psychology) "mTg" = ( @@ -86944,6 +87046,16 @@ }, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos/storage/gas) +"mTU" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "mTY" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, /obj/machinery/door/firedoor/heavy, @@ -87094,23 +87206,6 @@ "mUP" = ( /turf/closed/wall, /area/station/service/minibar) -"mUT" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "medbay"; - dir = 1 - }, -/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 = 1 - }, -/obj/effect/turf_decal/trimline/blue/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/warning, -/turf/open/floor/iron/dark/textured, -/area/station/medical/medbay/lobby) "mUW" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -87128,9 +87223,7 @@ /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{ - dir = 5 - }, +/obj/machinery/camera/autoname/directional/south, /turf/open/floor/carpet/red, /area/station/service/library) "mVd" = ( @@ -87563,7 +87656,7 @@ /obj/structure/flora/bush/grassy/style_random, /obj/structure/flora/bush/style_random, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "mZd" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 10 @@ -88095,6 +88188,7 @@ /obj/structure/flora/rock/pile/jungle/style_random, /obj/structure/bed/dogbed, /obj/structure/marker_beacon/lime, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/grass, /area/station/maintenance/aft/greater) "ndj" = ( @@ -88128,7 +88222,7 @@ dir = 9 }, /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ndD" = ( /obj/structure/railing/corner{ dir = 8 @@ -88462,7 +88556,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "nho" = ( /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -88476,11 +88570,9 @@ /area/station/service/bar) "nhu" = ( /obj/structure/hedge, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "nhw" = ( /obj/effect/turf_decal/siding/dark/corner{ dir = 1 @@ -88524,6 +88616,7 @@ /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 1 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "nhR" = ( @@ -88635,7 +88728,7 @@ /obj/machinery/door/airlock/medical/glass{ name = "Primary Treatment Centre" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -88672,7 +88765,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "njl" = ( /turf/open/floor/plating, /area/station/construction/mining/aux_base) @@ -88846,10 +88939,10 @@ /obj/machinery/door/airlock/maintenance{ name = "Abandoned Project Room" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "nkU" = ( @@ -89195,8 +89288,17 @@ /turf/open/floor/iron/dark, /area/station/cargo/miningoffice) "nnZ" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/rust, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "noc" = ( /obj/effect/turf_decal/siding/wideplating_new/dark/corner{ @@ -89205,9 +89307,7 @@ /obj/structure/railing/corner{ dir = 1 }, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "noe" = ( @@ -89389,11 +89489,11 @@ /obj/machinery/door/airlock/maintenance, /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/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/central) "npk" = ( @@ -89512,7 +89612,7 @@ }, /obj/effect/turf_decal/trimline/red/corner, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "npI" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 4 @@ -90443,13 +90543,13 @@ }, /obj/machinery/light/small/directional/east, /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/aisat/exterior"; + control_area = "/area/station/ai/satellite/exterior"; name = "Zen Garden Turret Control"; req_access = list("minisat"); pixel_y = 27 }, /turf/open/floor/engine/hull/reinforced, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "nwC" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -90506,11 +90606,11 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) "nxa" = ( @@ -90624,7 +90724,7 @@ /area/station/science/xenobiology) "nxR" = ( /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "nym" = ( /obj/structure/table/wood, /obj/structure/cable, @@ -90878,7 +90978,7 @@ dir = 10 }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "nAd" = ( /obj/effect/turf_decal/siding/wideplating_new/dark/corner{ dir = 1 @@ -91009,7 +91109,7 @@ /obj/structure/sign/departments/medbay/alt/directional/north, /obj/structure/closet/emcloset, /obj/effect/turf_decal/siding/thinplating_new/light/corner, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/white, /area/station/hallway/primary/fore) "nAX" = ( @@ -91103,7 +91203,7 @@ /obj/structure/sign/warning/vacuum/external/directional/south, /obj/structure/closet/firecloset, /obj/effect/turf_decal/bot_white, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/maintenance/central) "nBv" = ( @@ -91350,7 +91450,7 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nDR" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, @@ -91449,9 +91549,7 @@ /obj/effect/turf_decal/trimline/dark/line{ dir = 1 }, -/obj/machinery/camera/autoname/directional/south{ - dir = 5 - }, +/obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron, /area/station/cargo/storage) "nEz" = ( @@ -91704,7 +91802,8 @@ pixel_y = -6; pixel_x = -24; id = "ldorm1"; - name = "Curtains" + name = "Curtains"; + dir = 8 }, /turf/open/floor/wood/large, /area/station/commons/dorms) @@ -91779,7 +91878,8 @@ }, /obj/machinery/button/crematorium{ id = "crematoriumchapel"; - pixel_x = -25 + pixel_x = -25; + dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -91816,6 +91916,9 @@ dir = 6 }, /obj/effect/decal/cleanable/glass, +/obj/structure/sign/warning/secure_area/directional/south{ + pixel_x = 32 + }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) "nHv" = ( @@ -92257,7 +92360,7 @@ "nKQ" = ( /obj/machinery/nuclearbomb/selfdestruct, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "nKS" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -92393,7 +92496,7 @@ /area/space/nearstation) "nMh" = ( /obj/structure/bonfire/prelit, -/obj/item/food/kebab, +/obj/item/food/kebab/monkey, /turf/open/misc/asteroid/airless, /area/space/nearstation) "nMm" = ( @@ -92444,6 +92547,9 @@ /obj/effect/turf_decal/trimline/dark_red/filled/warning{ dir = 5 }, +/obj/structure/sign/warning/secure_area/directional/north{ + pixel_x = 32 + }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) "nMM" = ( @@ -92499,7 +92605,7 @@ /turf/open/floor/iron/dark, /area/station/service/hydroponics) "nNh" = ( -/obj/machinery/computer/station_alert/station_only, +/obj/machinery/computer/station_alert, /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 5 }, @@ -92582,7 +92688,7 @@ }, /obj/structure/closet/secure_closet/personal/cabinet, /obj/structure/sign/poster/random/directional/west, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/machinery/firealarm/directional/south, /turf/open/floor/wood/large, /area/station/commons/dorms) @@ -92807,9 +92913,13 @@ /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 }, -/obj/structure/chair/sofa/corp/left, -/turf/open/floor/iron/white, -/area/station/medical/patients_rooms) +/obj/machinery/suit_storage_unit/medical, +/obj/effect/turf_decal/box/white/corners{ + dir = 1; + color = "#52B4E9" + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/paramedic) "nPA" = ( /obj/structure/frame/computer{ dir = 4 @@ -92835,6 +92945,7 @@ /obj/effect/turf_decal/siding/thinplating/dark{ dir = 9 }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "nPK" = ( @@ -92942,7 +93053,7 @@ /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/landmark/start/hangover, /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark/herringbone, /area/station/commons/locker) @@ -93051,11 +93162,10 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/rubble, /turf/open/floor/stone, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "nQT" = ( /obj/structure/closet/secure_closet/medical3, /obj/effect/turf_decal/box, -/obj/item/defibrillator/loaded, /obj/item/clothing/gloves/latex/nitrile, /obj/item/clothing/gloves/latex/nitrile, /obj/effect/turf_decal/siding/dark{ @@ -93066,6 +93176,9 @@ }, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 3 + }, /turf/open/floor/iron/dark/small, /area/station/medical/storage) "nRd" = ( @@ -93096,7 +93209,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/small, -/area/station/medical/patients_rooms) +/area/station/maintenance/department/cargo) "nRp" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -93340,14 +93453,14 @@ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/command/eva, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/door/airlock/external{ name = "EVA Airlock" }, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "nSV" = ( /obj/structure/railing, /obj/item/shell/bot, @@ -93898,7 +94011,7 @@ /area/station/maintenance/port) "nXA" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/equipment) +/area/station/ai/satellite/equipment) "nXE" = ( /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 4 @@ -93953,7 +94066,6 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/parquet, /area/station/medical/psychology) "nXY" = ( @@ -94012,10 +94124,11 @@ /obj/structure/hedge, /obj/machinery/status_display/ai/directional/south, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "nYG" = ( /obj/structure/sign/gym{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/structure/hedge, /obj/structure/railing{ @@ -94406,7 +94519,7 @@ dir = 4 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "obe" = ( /obj/structure/cable, /obj/effect/spawner/random/maintenance, @@ -94644,7 +94757,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "ocH" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 6 @@ -94958,7 +95071,7 @@ /obj/effect/turf_decal/trimline/dark, /obj/item/clothing/shoes/jackboots, /obj/item/clothing/gloves/color/black, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark/herringbone, /area/station/commons/locker) @@ -95469,11 +95582,11 @@ /area/station/security/checkpoint/customs) "oil" = ( /obj/structure/rack, -/obj/effect/spawner/random/armory/laser_gun, +/obj/effect/spawner/random/armory/pick_laser_loadout, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "oit" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/trimline/dark/corner{ @@ -96254,7 +96367,7 @@ /obj/machinery/digital_clock/directional/north, /obj/effect/landmark/firealarm_sanity, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "onN" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 10 @@ -96398,7 +96511,7 @@ }, /obj/machinery/newscaster/directional/south, /turf/open/floor/carpet/blue, -/area/station/ai_monitored/turret_protected/aisat/equipment) +/area/station/ai/satellite/equipment) "ooA" = ( /obj/structure/cable, /obj/structure/broken_flooring/singular/directional/north, @@ -96727,7 +96840,7 @@ /turf/open/floor/iron/dark, /area/station/maintenance/starboard/central) "ork" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 1 }, /obj/effect/turf_decal/bot{ @@ -97387,7 +97500,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "owE" = ( /obj/structure/flora/bush/grassy/style_random, /obj/structure/flora/bush/lavendergrass/style_random, @@ -97470,7 +97583,7 @@ }, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "oxd" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/structure/chem_separator{ @@ -97617,17 +97730,16 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "oyb" = ( -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/trimline/blue/filled/line, /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 }, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/patients_rooms) +/obj/effect/turf_decal/trimline/blue/filled/corner, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "oye" = ( /obj/structure/flora/grass/jungle/b/style_random, /obj/structure/flora/bush/sparsegrass/style_random, @@ -97651,14 +97763,12 @@ /obj/structure/cable, /obj/effect/turf_decal/bot_white, /obj/structure/chair, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/aft/lesser) "oyl" = ( @@ -97721,7 +97831,7 @@ dir = 4 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "oyQ" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Two"; @@ -98244,7 +98354,7 @@ }, /obj/structure/flora/grass/jungle/b/style_5, /turf/open/water, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "oDe" = ( /obj/effect/turf_decal/siding/dark{ dir = 1 @@ -98328,9 +98438,7 @@ /obj/structure/railing/corner{ dir = 4 }, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "oDZ" = ( @@ -98411,7 +98519,7 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/equipment) +/area/station/ai/satellite/equipment) "oEB" = ( /obj/effect/turf_decal/siding{ dir = 10 @@ -98635,7 +98743,7 @@ /obj/effect/turf_decal/delivery, /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "oGA" = ( /obj/effect/turf_decal/trimline/dark_green/warning{ dir = 4 @@ -98689,6 +98797,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"oGQ" = ( +/obj/effect/turf_decal/trimline/blue, +/obj/machinery/hydroponics/constructable, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "oGW" = ( /obj/structure/plasticflaps/opaque, /obj/machinery/navbeacon{ @@ -98732,9 +98846,7 @@ }, /obj/effect/turf_decal/trimline/yellow/corner, /obj/item/radio/intercom/directional/west, -/obj/machinery/camera/autoname/directional/west{ - dir = 10 - }, +/obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, @@ -98839,7 +98951,7 @@ /obj/machinery/computer/monitor, /obj/structure/cable, /turf/open/floor/iron/dark/textured_corner, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "oIK" = ( /obj/structure/table/reinforced, /obj/effect/spawner/surgery_tray/full, @@ -98879,7 +98991,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "oIU" = ( /obj/structure/stairs/west, /obj/structure/railing, @@ -99407,7 +99519,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "oMi" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 4 @@ -99465,7 +99577,7 @@ /obj/structure/cable, /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "oMO" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 1 @@ -99631,7 +99743,8 @@ /area/station/science/lab) "oOa" = ( /obj/structure/sign/departments/botany/botany/alt3{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/trimline/green/corner{ dir = 8 @@ -99842,7 +99955,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "oOZ" = ( /obj/structure/flora/rock/pile/style_random, /obj/effect/spawner/random/trash, @@ -100008,7 +100121,8 @@ pixel_y = -6; pixel_x = -24; id = "ldorm2"; - name = "Curtains" + name = "Curtains"; + dir = 8 }, /obj/structure/railing{ color = "#36373a"; @@ -100049,6 +100163,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/effect/mapping_helpers/airlock/access/all/science/rd, /obj/structure/plasticflaps/kitchen, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/iron/dark, /area/station/science/server) "oQc" = ( @@ -100077,7 +100192,7 @@ /obj/structure/cable, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "oQi" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 4 @@ -100471,7 +100586,7 @@ /turf/open/floor/iron/dark/textured, /area/station/service/library/lounge) "oSD" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 1 }, /obj/structure/sign/poster/official/random/directional/south, @@ -100505,7 +100620,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/rubble, /turf/open/floor/stone, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "oSQ" = ( /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 1 @@ -100601,7 +100716,7 @@ /obj/structure/sign/warning/vacuum/directional/north, /obj/structure/closet/emcloset, /obj/effect/turf_decal/bot_white, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/maintenance/central) "oTH" = ( @@ -100850,13 +100965,6 @@ /obj/effect/turf_decal/trimline/dark/filled/line{ dir = 1 }, -/obj/machinery/button/door/directional/west{ - id = "main_surgery"; - name = "Privacy Shutters Control"; - req_access = list("surgery"); - pixel_x = -56; - pixel_y = 6 - }, /turf/open/floor/iron/showroomfloor, /area/station/medical/surgery/theatre) "oVD" = ( @@ -101290,7 +101398,7 @@ /obj/machinery/door/firedoor, /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/equipment) +/area/station/ai/satellite/equipment) "oYY" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -101309,7 +101417,7 @@ /obj/effect/turf_decal/bot_white, /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "oZj" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 @@ -101384,7 +101492,7 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "oZy" = ( @@ -101512,7 +101620,7 @@ /obj/machinery/door/airlock/maintenance{ name = "Dormitory Maintenance" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -101630,7 +101738,7 @@ /obj/machinery/holopad/secure, /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "pbd" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 @@ -101648,8 +101756,8 @@ /obj/structure/chair/office/light{ dir = 4 }, -/obj/effect/landmark/start/paramedic, /obj/structure/cable, +/obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/white/herringbone, /area/station/medical/office) "pbo" = ( @@ -101972,6 +102080,24 @@ /obj/structure/sign/poster/official/plasma_effects/directional/north, /turf/open/floor/iron/smooth, /area/station/maintenance/department/bridge) +"pdx" = ( +/obj/machinery/button/door/directional/east{ + id = "qm_warehouse"; + name = "Warehouse Door Control"; + req_access = list("cargo"); + pixel_y = -8 + }, +/obj/effect/turf_decal/siding/brown{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/cargo/storage) "pdz" = ( /obj/structure/chair/wood/wings, /obj/structure/fluff/paper/stack{ @@ -101988,11 +102114,12 @@ "pdE" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/central) "pdF" = ( @@ -102074,7 +102201,7 @@ id = "AIgarden2" }, /turf/open/floor/engine/hull/reinforced, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "pdW" = ( /obj/machinery/portable_atmospherics/canister, /obj/effect/turf_decal/bot{ @@ -102114,6 +102241,8 @@ location = "F5-Medbay-Lobby"; codes_txt = "patrol;next_patrol=F6-Medbay" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/small, /area/station/medical/medbay/lobby) "pem" = ( @@ -102139,7 +102268,7 @@ dir = 9 }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "peB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/effect/turf_decal/stripes/line{ @@ -103089,7 +103218,7 @@ /obj/machinery/status_display/ai/directional/east, /obj/machinery/light/directional/east, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "plp" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/table/glass, @@ -103295,7 +103424,6 @@ /obj/effect/turf_decal/trimline/blue/corner{ dir = 1 }, -/obj/effect/landmark/start/paramedic, /turf/open/floor/iron/dark, /area/station/medical/lower) "pnu" = ( @@ -103633,7 +103761,7 @@ }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/service/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/structure/cable, @@ -103731,7 +103859,7 @@ dir = 1 }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "pqv" = ( /obj/machinery/door/airlock/maintenance{ name = "Courtroom Maintenance" @@ -103840,7 +103968,7 @@ /obj/machinery/holopad/secure, /obj/structure/cable, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "prn" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 10 @@ -105088,6 +105216,13 @@ /obj/machinery/duct, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) +"pzo" = ( +/obj/structure/sign/directions/engineering/directional/east{ + dir = 2; + pixel_x = 0 + }, +/turf/closed/wall, +/area/station/maintenance/port/aft) "pzp" = ( /obj/effect/turf_decal/tile/red/fourcorners, /obj/effect/turf_decal/bot, @@ -105173,7 +105308,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "pzR" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, @@ -105202,7 +105337,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/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron/dark, /area/station/maintenance/aft/greater) "pAa" = ( @@ -105227,7 +105362,7 @@ }, /obj/effect/turf_decal/trimline/red, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "pAe" = ( /obj/machinery/status_display/ai, /turf/closed/wall/r_wall, @@ -105374,7 +105509,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -105528,7 +105663,7 @@ /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "pCn" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 6 @@ -106084,7 +106219,7 @@ }, /obj/structure/marker_beacon/yellow, /turf/open/floor/bamboo, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "pHa" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/iron/fifty, @@ -106158,6 +106293,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "pHv" = ( @@ -106723,7 +106859,7 @@ }, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "pLG" = ( /obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, /turf/open/floor/circuit/green, @@ -106958,7 +107094,7 @@ /obj/item/gun/ballistic/shotgun/riot, /obj/item/gun/ballistic/shotgun/riot, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "pNP" = ( /turf/closed/wall, /area/station/service/lawoffice) @@ -107169,7 +107305,7 @@ /obj/item/storage/lockbox/loyalty, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "pPe" = ( /obj/structure/chair/comfy/black{ dir = 1 @@ -107182,10 +107318,11 @@ /area/station/science/breakroom) "pPh" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/central) "pPi" = ( @@ -107568,13 +107705,26 @@ dir = 8 }, /obj/machinery/camera/autoname/directional/south{ - dir = 5; network = list("interrogation") }, /turf/open/floor/iron/dark/textured_corner{ dir = 4 }, /area/station/security/interrogation) +"pRL" = ( +/obj/structure/sign/directions/evac/directional/south{ + dir = 8; + pixel_y = 10 + }, +/obj/structure/sign/directions/dorms/directional/south{ + pixel_y = -10; + dir = 8 + }, +/obj/structure/sign/directions/engineering/directional/south{ + pixel_y = 0 + }, +/turf/closed/wall, +/area/station/service/boutique) "pRP" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 6 @@ -107792,7 +107942,7 @@ dir = 8 }, /obj/structure/closet/secure_closet/personal/cabinet, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/wood/large, /area/station/commons/dorms) "pTC" = ( @@ -107805,7 +107955,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "pTD" = ( /obj/effect/turf_decal/siding/brown{ dir = 1 @@ -107824,7 +107974,6 @@ /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/small, /area/station/medical/medbay/lobby) @@ -107885,7 +108034,7 @@ }, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "pUf" = ( /turf/closed/wall, /area/station/medical/break_room) @@ -107979,7 +108128,7 @@ }, /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "pUZ" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 6 @@ -108175,7 +108324,7 @@ req_access = list("captain") }, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "pWS" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -108194,7 +108343,7 @@ name = "Chapel Maintenance" }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/plating, @@ -108358,7 +108507,7 @@ color = "#4874A2" }, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "pYq" = ( /obj/structure/chair, /obj/effect/turf_decal/bot_white, @@ -108406,7 +108555,7 @@ /turf/open/floor/iron/dark, /area/station/medical/storage) "pYN" = ( -/obj/machinery/computer/rdconsole, +/obj/machinery/computer/rdconsole/unlocked, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -108511,7 +108660,7 @@ dir = 4 }, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "pZs" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -108646,7 +108795,7 @@ dir = 9 }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qaB" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -109036,6 +109185,7 @@ dir = 1 }, /obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "qeJ" = ( @@ -109181,7 +109331,7 @@ /obj/effect/turf_decal/bot_white, /obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "qfB" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/end{ dir = 1 @@ -109203,7 +109353,7 @@ name = "Private Channel" }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qfC" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /obj/structure/cable, @@ -109540,7 +109690,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable/layer3, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qih" = ( /obj/effect/turf_decal/tile/blue/full, /obj/machinery/defibrillator_mount/mobile{ @@ -109957,9 +110107,7 @@ /obj/effect/turf_decal/siding/wideplating_new/dark/corner{ dir = 8 }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "qlW" = ( @@ -110556,7 +110704,7 @@ /obj/structure/cable, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "qqk" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/carpet/neon/simple/red/nodots, @@ -111301,7 +111449,7 @@ /obj/item/restraints/handcuffs, /obj/item/assembly/flash/handheld, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "qwT" = ( /obj/machinery/light/floor, /obj/effect/turf_decal/trimline/green, @@ -111412,17 +111560,6 @@ dir = 4 }, /obj/structure/hedge, -/obj/structure/sign/directions/security/directional/north{ - pixel_y = 40; - dir = 4 - }, -/obj/structure/sign/directions/command/directional/north{ - dir = 4 - }, -/obj/structure/sign/directions/evac/directional/north{ - pixel_y = 24; - dir = 8 - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -111532,7 +111669,7 @@ /obj/effect/turf_decal/bot, /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "qyy" = ( /turf/open/floor/glass/reinforced, /area/station/commons/fitness) @@ -111612,9 +111749,7 @@ }, /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, -/obj/machinery/camera/autoname/directional/east{ - dir = 6 - }, +/obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark/smooth_edge{ dir = 8 }, @@ -111766,7 +111901,7 @@ pixel_x = -8 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qAi" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -111777,14 +111912,12 @@ /area/station/medical/coldroom) "qAl" = ( /obj/structure/hedge, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, /obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ dir = 8 }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "qAt" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -111814,10 +111947,11 @@ /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/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) "qAG" = ( @@ -111841,7 +111975,7 @@ /obj/effect/spawner/random/armory/riot_helmet, /obj/effect/spawner/random/armory/riot_shield, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "qBb" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /obj/structure/cable, @@ -112369,7 +112503,7 @@ }, /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/equipment) +/area/station/ai/satellite/equipment) "qEO" = ( /obj/machinery/holopad, /obj/effect/turf_decal/box/white{ @@ -112599,7 +112733,7 @@ /obj/effect/turf_decal/bot/right, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "qGL" = ( /obj/item/reagent_containers/cup/beaker/cryoxadone{ pixel_x = -6; @@ -113282,7 +113416,7 @@ "qKN" = ( /mob/living/simple_animal/bot/secbot/beepsky/armsky, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "qKS" = ( /obj/effect/turf_decal/trimline/yellow, /obj/machinery/light/floor, @@ -113295,7 +113429,8 @@ dir = 1 }, /obj/structure/sign/painting/library_private{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/item/kirbyplants/organic/plant10, /turf/open/floor/carpet/green, @@ -113631,7 +113766,7 @@ pixel_x = 3 }, /turf/open/misc/beach/sand, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "qNb" = ( /turf/closed/wall, /area/station/medical/pharmacy) @@ -113680,7 +113815,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "qNs" = ( /obj/effect/turf_decal/trimline/yellow, /obj/machinery/light/floor, @@ -113757,7 +113892,7 @@ dir = 5 }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qOs" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 9 @@ -113862,7 +113997,7 @@ /obj/effect/turf_decal/siding/thinplating_new/dark/corner, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "qPS" = ( /obj/effect/spawner/random/maintenance, /obj/structure/cable, @@ -113903,7 +114038,7 @@ }, /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "qQa" = ( /obj/structure/closet/crate/coffin, /obj/effect/turf_decal/tile/dark/diagonal_centre, @@ -113958,13 +114093,17 @@ /turf/open/floor/iron/dark/small, /area/station/engineering/atmos) "qQq" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/flora/grass/jungle/a/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/curtain/cloth{ + color = "#52B4E9" }, -/obj/item/kirbyplants/random, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/turf/open/floor/grass, +/area/station/medical/paramedic) "qQu" = ( /obj/structure/flora/grass/jungle/b/style_random, /obj/structure/flora/bush/flowers_br/style_random, @@ -113974,7 +114113,7 @@ pixel_y = -32 }, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "qQC" = ( /obj/structure/flora/bush/fullgrass, /obj/structure/flora/bush/grassy/style_random, @@ -114141,6 +114280,9 @@ /obj/structure/broken_flooring/singular{ dir = 4 }, +/obj/structure/sign/warning/secure_area/directional/north{ + pixel_x = -32 + }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) "qSi" = ( @@ -114318,12 +114460,10 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/structure/noticeboard/directional/west{ - 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/noticeboard/directional/west, /turf/open/floor/wood/tile, /area/station/service/cafeteria) "qTF" = ( @@ -114431,7 +114571,7 @@ }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/service/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/structure/disposalpipe/segment{ @@ -114507,11 +114647,11 @@ /obj/effect/turf_decal/trimline/dark/corner{ dir = 8 }, -/obj/machinery/computer/station_alert/station_only, +/obj/machinery/computer/station_alert, /turf/open/floor/iron/dark/textured_corner{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "qVC" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 1 @@ -114600,7 +114740,7 @@ }, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/white/small, /area/station/commons/toilet/shower) "qWF" = ( @@ -114785,7 +114925,7 @@ dir = 10 }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qYk" = ( /obj/structure/rack, /obj/item/clothing/suit/hazardvest, @@ -114913,7 +115053,7 @@ network = list("minisat") }, /turf/open/misc/asteroid/airless, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "qZc" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/east, @@ -115246,7 +115386,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/iron/dark, @@ -115272,7 +115412,7 @@ /obj/structure/cable, /obj/machinery/holopad/secure, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "rbJ" = ( /obj/structure/rack, /obj/item/clothing/gloves/color/fyellow, @@ -115688,12 +115828,8 @@ /obj/effect/turf_decal/trimline/white/warning{ dir = 4 }, -/obj/machinery/flasher/directional/west{ - id = "AI"; - pixel_y = 26 - }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "rfe" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -115883,10 +116019,6 @@ /area/station/engineering/atmos) "rgm" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "medbay"; - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -115894,6 +116026,12 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/warning, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "medbay"; + dir = 1 + }, +/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/medical/medbay/lobby) "rgp" = ( @@ -116918,7 +117056,7 @@ req_access = list("ai_upload") }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "rot" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 4 @@ -117108,7 +117246,7 @@ /obj/structure/table/reinforced, /obj/machinery/recharger, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "rpr" = ( /obj/effect/turf_decal/tile/brown/fourcorners, /obj/machinery/mineral/ore_redemption{ @@ -117489,7 +117627,7 @@ network = list("minisat") }, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "rrD" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/sparsegrass/style_random, @@ -117827,6 +117965,18 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) +"rub" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/sign/plaques/kiddie/library{ + pixel_y = 32; + dir = 1 + }, +/obj/structure/railing, +/turf/open/floor/wood/large, +/area/station/service/library/upper) "ruh" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -117950,6 +118100,17 @@ /obj/machinery/hydroponics/soil/rich, /turf/open/floor/grass, /area/station/service/hydroponics/garden) +"rvq" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/marker_beacon/burgundy, +/obj/structure/sign/nanotrasen/directional/east, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "rvu" = ( /obj/item/kirbyplants/organic/plant10, /obj/effect/decal/cleanable/dirt/dust, @@ -117964,6 +118125,15 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"rvC" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/computer/crew{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "rvD" = ( /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ color = "#ff0000"; @@ -118006,10 +118176,10 @@ /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/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "rwe" = ( @@ -118195,7 +118365,7 @@ /obj/machinery/teleport/hub, /obj/machinery/status_display/ai/directional/north, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "rxz" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -118488,10 +118658,11 @@ /obj/machinery/door/airlock/maintenance/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/any/supply/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/cargo) "rAw" = ( @@ -118678,7 +118849,7 @@ "rBm" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "rBC" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -118749,7 +118920,7 @@ "rCf" = ( /obj/effect/turf_decal/trimline/dark/corner, /turf/open/floor/iron/dark/textured_corner, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "rCi" = ( /obj/effect/turf_decal/bot, /obj/machinery/digital_clock/directional/south, @@ -119190,10 +119361,10 @@ /area/station/command/heads_quarters/qm) "rEV" = ( /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/ai_upload"; - icon_state = "control_stun"; + control_area = "/area/station/ai/upload/chamber"; name = "AI Upload Turret Control"; - pixel_y = 28 + pixel_y = 28; + dir = 1 }, /obj/effect/turf_decal/siding/dark{ dir = 6 @@ -119208,7 +119379,7 @@ }, /obj/effect/landmark/start/cyborg, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "rEX" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -119600,7 +119771,7 @@ name = "Research Division Access" }, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/machinery/door/poddoor/shutters/preopen{ @@ -119903,7 +120074,7 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "rKH" = ( /obj/structure/railing/corner, /obj/effect/turf_decal/siding/purple, @@ -119945,9 +120116,7 @@ /obj/effect/turf_decal/trimline/red/corner{ dir = 8 }, -/obj/machinery/camera/autoname/directional/east{ - dir = 6 - }, +/obj/machinery/camera/autoname/directional/east, /obj/machinery/firealarm/directional/east{ pixel_x = 26; pixel_y = 6 @@ -120086,7 +120255,7 @@ }, /obj/machinery/light/small/directional/south, /turf/open/floor/holofloor/wood, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "rLH" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 10 @@ -120832,7 +121001,7 @@ /obj/item/kirbyplants/random, /obj/machinery/airalarm/directional/west, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "rRE" = ( /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron/white, @@ -120865,14 +121034,14 @@ pixel_y = 11 }, /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat/atmos"; + control_area = "/area/station/ai/satellite/atmos"; name = "Atmospherics Turret Control"; req_access = list("minisat"); pixel_y = -27 }, /obj/machinery/digital_clock/directional/west, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "rSd" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -121407,9 +121576,6 @@ /turf/open/floor/iron/smooth, /area/station/maintenance/port/central) "rWS" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /turf/open/space/basic, /area/space/nearstation) "rWW" = ( @@ -121513,6 +121679,13 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood/large, /area/station/service/kitchen/diner) +"rXp" = ( +/obj/machinery/turretid{ + pixel_y = -5; + name = "AI Chamber turret control" + }, +/turf/closed/wall/r_wall, +/area/station/ai/satellite/chamber) "rXs" = ( /obj/structure/closet/radiation, /obj/effect/turf_decal/stripes/line{ @@ -121701,7 +121874,7 @@ /area/station/science/lower) "rYP" = ( /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "rYR" = ( /turf/closed/wall/r_wall, /area/station/tcommsat/server) @@ -121799,6 +121972,13 @@ pixel_x = -26; pixel_y = -6 }, +/obj/machinery/button/door/directional/west{ + id = "main_surgery"; + name = "Privacy Shutters Control"; + req_access = list("surgery"); + pixel_x = -26; + pixel_y = 6 + }, /turf/open/floor/iron/showroomfloor, /area/station/medical/surgery/theatre) "rZu" = ( @@ -121853,6 +122033,8 @@ }, /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/corner{ dir = 8 }, @@ -122056,24 +122238,13 @@ /obj/structure/chair/office/light{ dir = 1 }, -/obj/machinery/button/door/directional/west{ - name = "Padded Cell Bolts Control"; - id = "padded"; - normaldoorcontrol = 1; - specialfunctions = 4; - pixel_x = -24; - pixel_y = 6 - }, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 }, -/obj/machinery/newscaster/directional/south, -/obj/machinery/light_switch/directional/west{ - pixel_x = -26; - pixel_y = -6 - }, -/turf/open/floor/iron/white, -/area/station/medical/patients_rooms) +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "saR" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 @@ -122203,7 +122374,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "sbL" = ( /obj/effect/turf_decal/weather/snow, /obj/structure/cable, @@ -122248,7 +122419,7 @@ name = "E.V.A. Storage Shutter" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "scx" = ( /obj/effect/turf_decal/tile/dark/diagonal_centre, /obj/machinery/oven/range, @@ -122838,6 +123009,15 @@ /obj/structure/flora/grass/jungle/b/style_4, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) +"sgP" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/marker_beacon/burgundy, +/obj/structure/lattice/catwalk, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/misc/asteroid/airless, +/area/space/nearstation) "sgS" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ @@ -122878,7 +123058,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "shg" = ( /obj/structure/frame/machine, /turf/open/floor/iron/smooth_large, @@ -123122,7 +123302,7 @@ pixel_y = -24 }, /turf/open/floor/stone, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "sjI" = ( /obj/structure/cable, /obj/machinery/light/small/red/directional/west, @@ -123130,16 +123310,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/central) -"sjK" = ( -/obj/effect/turf_decal/siding{ - dir = 8 - }, -/obj/effect/turf_decal/siding/corner{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/white/small, -/area/station/medical/patients_rooms) "sjU" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/thinplating_new/dark, @@ -123248,7 +123418,7 @@ dir = 4 }, /obj/structure/closet/emcloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central) "skV" = ( @@ -123594,7 +123764,7 @@ /obj/effect/turf_decal/trimline/dark_red, /obj/machinery/light/small/directional/east, /obj/effect/spawner/random/clothing/gloves, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark/herringbone, /area/station/commons/locker) "soc" = ( @@ -123923,6 +124093,19 @@ dir = 6 }, /area/station/maintenance/department/security) +"sqU" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "srd" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/lavendergrass/style_random, @@ -124096,7 +124279,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ssw" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 5 @@ -124720,7 +124903,8 @@ /area/station/security/brig) "sxx" = ( /obj/structure/sign/departments/botany/botany/alt3{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/trimline/green/corner, /obj/effect/turf_decal/siding/dark{ @@ -125006,7 +125190,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/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -125312,7 +125496,7 @@ dir = 8 }, /turf/open/floor/carpet/neon/simple/lime, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "sCy" = ( /obj/structure/railing{ dir = 4 @@ -125544,7 +125728,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/engine/hull/reinforced, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "sEh" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -125599,8 +125783,17 @@ /turf/open/floor/wood/tile, /area/station/service/minibar) "sEF" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/r_wall, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "sEG" = ( /obj/machinery/oven/range, @@ -126049,7 +126242,7 @@ }, /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "sHT" = ( /obj/effect/turf_decal/trimline/blue, /obj/machinery/light/floor, @@ -126227,9 +126420,7 @@ /area/station/maintenance/fore/lesser) "sJY" = ( /obj/effect/turf_decal/tile/green/anticorner/contrasted, -/obj/structure/noticeboard/directional/south{ - dir = 1 - }, +/obj/structure/noticeboard/directional/south, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) "sJZ" = ( @@ -126247,7 +126438,7 @@ /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/iron/white, @@ -126353,7 +126544,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "sKF" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -126658,6 +126849,20 @@ "sMC" = ( /turf/closed/wall/r_wall, /area/station/science/lower) +"sMP" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "sMS" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/effect/turf_decal/trimline/yellow/warning, @@ -127203,7 +127408,7 @@ /obj/structure/sign/warning/vacuum/directional/north, /obj/structure/closet/firecloset, /obj/effect/turf_decal/bot_white, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/maintenance/central) "sRX" = ( @@ -127222,7 +127427,7 @@ }, /obj/structure/marker_beacon/lime, /turf/open/floor/grass, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "sSe" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -127672,7 +127877,8 @@ /obj/effect/turf_decal/siding/purple, /obj/structure/cable, /obj/structure/noticeboard/rd{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron/white, /area/station/science/lower) @@ -127689,6 +127895,7 @@ dir = 9 }, /obj/item/kirbyplants/random, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "sVB" = ( @@ -127739,7 +127946,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "sVU" = ( /obj/machinery/door/airlock/grunge{ name = "Cell 1"; @@ -127847,6 +128054,9 @@ /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, /obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/painting/large/library{ + dir = 1 + }, /turf/open/floor/plating, /area/station/maintenance/radshelter/civil) "sWO" = ( @@ -128280,7 +128490,8 @@ dir = 1 }, /obj/structure/noticeboard/cmo{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/siding/blue{ dir = 1 @@ -128309,7 +128520,7 @@ /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "sZP" = ( /obj/structure/chair/office{ dir = 4 @@ -128375,6 +128586,7 @@ /obj/effect/turf_decal/trimline/dark/corner{ dir = 1 }, +/obj/structure/sign/departments/vault/directional/north, /turf/open/floor/iron/dark, /area/station/command) "tao" = ( @@ -128646,6 +128858,22 @@ }, /turf/open/floor/iron/dark/small, /area/station/engineering/gravity_generator) +"tcG" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "tcI" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ @@ -128743,7 +128971,7 @@ /obj/machinery/light/small/directional/south, /obj/structure/cable, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "tdd" = ( /obj/machinery/holopad, /turf/open/floor/iron/dark/textured, @@ -128849,13 +129077,18 @@ /turf/open/floor/plating, /area/station/maintenance/port/central) "tet" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/flora/grass/jungle/a/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/curtain/cloth{ + color = "#52B4E9" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/turf/open/floor/grass, +/area/station/medical/paramedic) "tez" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -129115,7 +129348,7 @@ }, /obj/structure/hedge, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "tgm" = ( /obj/machinery/atmospherics/components/trinary/mixer/flipped{ dir = 8 @@ -129161,7 +129394,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "tgF" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -129337,7 +129570,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "thP" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 10 @@ -129440,7 +129673,7 @@ /area/station/maintenance/port/fore) "tip" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "tiq" = ( /obj/effect/turf_decal/trimline/blue/line{ dir = 1 @@ -129550,7 +129783,7 @@ /obj/machinery/firealarm/directional/west, /obj/machinery/status_display/ai/directional/north, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "tjx" = ( /obj/effect/turf_decal/trimline/blue, /obj/effect/turf_decal/trimline/blue/mid_joiner{ @@ -129564,7 +129797,6 @@ dir = 1 }, /obj/structure/cable, -/obj/effect/landmark/start/paramedic, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, /area/station/medical/treatment_center) @@ -130060,13 +130292,15 @@ "tnz" = ( /obj/structure/closet/secure_closet/medical3, /obj/effect/turf_decal/box, -/obj/item/defibrillator/loaded, /obj/item/clothing/gloves/latex/nitrile, /obj/item/clothing/gloves/latex/nitrile, /obj/machinery/requests_console/auto_name/directional/north{ name = "Medbay Requests Console" }, /obj/effect/mapping_helpers/requests_console/assistance, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 3 + }, /turf/open/floor/iron/dark/small, /area/station/medical/storage) "tnR" = ( @@ -130256,7 +130490,7 @@ /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 4 }, -/obj/machinery/computer/rdconsole{ +/obj/machinery/computer/rdconsole/unlocked{ dir = 8 }, /obj/effect/turf_decal/trimline/purple/line{ @@ -130319,6 +130553,19 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"tpN" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "tpQ" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 10 @@ -130333,14 +130580,12 @@ /area/space/nearstation) "tpS" = ( /obj/structure/hedge, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "tpZ" = ( /obj/machinery/power/smes{ charge = 5e+006 @@ -130383,7 +130628,7 @@ /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/ferny/style_random, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "tqo" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -130451,16 +130696,15 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos) "tqL" = ( -/obj/structure/sign/departments/psychology/directional/east, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 + dir = 8 }, -/obj/machinery/holopad, -/turf/open/floor/iron/white, -/area/station/medical/patients_rooms) +/obj/structure/closet/secure_closet/paramedic, +/obj/effect/turf_decal/box/white/corners{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/paramedic) "tqT" = ( /obj/effect/turf_decal/trimline/dark/warning{ dir = 4 @@ -130841,11 +131085,11 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/command/eva, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ttz" = ( /obj/machinery/light_switch/directional/west, /obj/effect/turf_decal/siding/blue{ @@ -130899,7 +131143,7 @@ /obj/machinery/light/small/directional/east, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/carpet/neon/simple/lime, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ttO" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -131075,7 +131319,7 @@ "tvt" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/carpet/neon/simple/lime, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "tvw" = ( /obj/machinery/door/airlock/maintenance{ name = "Security Maintenance" @@ -131436,6 +131680,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"txY" = ( +/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/primary/fore) "tye" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -131853,12 +132104,6 @@ /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 }, -/obj/effect/turf_decal/siding/brown/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, /obj/effect/turf_decal/trimline/dark/corner{ dir = 8 }, @@ -132264,6 +132509,9 @@ /obj/effect/turf_decal/trimline/blue/line{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron/white/small, /area/station/medical/medbay/lobby) "tDh" = ( @@ -132298,7 +132546,7 @@ /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/cobweb, /turf/open/floor/iron/small, -/area/station/medical/patients_rooms) +/area/station/maintenance/department/cargo) "tDu" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 @@ -132324,7 +132572,7 @@ /area/station/security/prison) "tDF" = ( /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "tDJ" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -132374,7 +132622,7 @@ dir = 4 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "tDR" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/grass/jungle/b/style_random, @@ -132732,7 +132980,7 @@ /area/station/service/chapel) "tGr" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "tGx" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -132915,7 +133163,7 @@ }, /obj/effect/turf_decal/caution/red, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "tHw" = ( /obj/structure/railing{ dir = 6 @@ -133166,10 +133414,9 @@ /area/station/engineering/storage/tech) "tJb" = ( /obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/suit_storage_unit/medical, -/obj/effect/turf_decal/delivery, /obj/structure/railing, /obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/closet/l3closet, /turf/open/floor/iron/dark, /area/station/medical/storage) "tJp" = ( @@ -133487,7 +133734,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured_half, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "tLz" = ( /obj/structure/bookcase/random, /obj/effect/turf_decal/siding/wood{ @@ -133990,7 +134237,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/rubble, /turf/open/floor/stone, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "tPc" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -134404,7 +134651,7 @@ network = list("vault") }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "tSs" = ( /obj/structure/cable, /turf/open/floor/iron/dark/small, @@ -134598,7 +134845,6 @@ /obj/machinery/airalarm/directional/south, /obj/effect/mapping_helpers/airalarm/engine_access, /obj/machinery/camera/autoname/directional/south{ - dir = 5; network = list("ss13","engine") }, /obj/effect/mapping_helpers/airalarm/link{ @@ -134630,14 +134876,14 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "tTV" = ( /obj/structure/sign/warning/vacuum/directional/north, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /obj/structure/closet/firecloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central) "tUa" = ( @@ -134836,7 +135082,6 @@ "tVO" = ( /obj/structure/closet/secure_closet/medical3, /obj/effect/turf_decal/box, -/obj/item/defibrillator/loaded, /obj/item/clothing/gloves/latex/nitrile, /obj/item/clothing/gloves/latex/nitrile, /obj/effect/turf_decal/siding/dark{ @@ -134850,6 +135095,9 @@ network = list("ss13","medbay"); dir = 9 }, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 3 + }, /turf/open/floor/iron/dark/small, /area/station/medical/storage) "tVT" = ( @@ -134893,7 +135141,7 @@ /obj/machinery/digital_clock/directional/north, /obj/effect/landmark/firealarm_sanity, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "tWk" = ( /obj/effect/spawner/structure/window/reinforced, /obj/effect/landmark/atmospheric_sanity/ignore_area, @@ -134990,7 +135238,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "tXg" = ( /obj/effect/spawner/structure/window, /obj/structure/curtain/cloth/fancy/mechanical{ @@ -135336,7 +135584,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "tZm" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 10 @@ -135769,7 +136017,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "udz" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -136112,7 +136360,7 @@ /obj/item/kirbyplants/random, /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "ugO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/machinery/meter, @@ -136255,11 +136503,21 @@ /turf/open/floor/iron/dark/side, /area/station/maintenance/aft/greater) "uhK" = ( -/turf/closed/wall, -/area/station/medical/patients_rooms) +/obj/machinery/newscaster/directional/south, +/obj/structure/table/glass, +/obj/item/toy/figure/paramedic, +/obj/item/surgicaldrill{ + pixel_y = 3; + pixel_x = 5 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "uhM" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "uhP" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -136328,9 +136586,7 @@ dir = 4 }, /obj/structure/table/reinforced/rglass, -/obj/machinery/camera/autoname/directional/east{ - dir = 6 - }, +/obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark, /area/station/command/bridge) "uiG" = ( @@ -136390,7 +136646,7 @@ /obj/machinery/newscaster/directional/north, /obj/structure/window/spawner/directional/west, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "uiL" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -136421,7 +136677,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "uiZ" = ( /turf/open/floor/glass, /area/station/commons/lounge) @@ -136462,9 +136718,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "ujm" = ( -/obj/structure/filingcabinet/white, /obj/effect/turf_decal/siding/wood{ dir = 9 }, @@ -136638,7 +136893,7 @@ /obj/machinery/suit_storage_unit/standard_unit, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ula" = ( /obj/structure/cable, /obj/effect/spawner/random/trash/caution_sign, @@ -136693,7 +136948,7 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ulJ" = ( /obj/structure/cable, /obj/structure/curtain/cloth{ @@ -137227,7 +137482,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -137809,7 +138064,7 @@ /obj/machinery/portable_atmospherics/canister/air, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "uuG" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -138001,16 +138256,12 @@ name = "Primary AI Core Access"; req_access = list("ai_upload") }, -/obj/machinery/flasher/directional/north{ - pixel_x = 26; - id = "AI" - }, /obj/machinery/power/apc/auto_name/directional/west, /obj/effect/mapping_helpers/apc/cell_5k, /obj/machinery/light_switch/directional/east, /obj/structure/cable, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "uwF" = ( /obj/structure/table/glass, /obj/item/reagent_containers/cup/glass/coffee, @@ -138547,6 +138798,11 @@ }, /turf/open/floor/iron/dark/small, /area/station/engineering/main) +"uAz" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/engine, +/area/station/science/xenobiology) "uAA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -138738,7 +138994,7 @@ "uCd" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/delivery, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/dark/small, /area/station/hallway/secondary/command) @@ -138842,7 +139098,7 @@ /area/station/maintenance/port/central) "uCV" = ( /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "uCW" = ( /obj/structure/hedge, /obj/structure/window/reinforced/spawner/directional/west, @@ -138860,7 +139116,8 @@ dir = 1 }, /obj/structure/sign/painting/library_private{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/item/kirbyplants/random, /obj/machinery/camera/autoname/directional/north, @@ -138902,6 +139159,7 @@ /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 8 }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "uDB" = ( @@ -138945,7 +139203,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "uEd" = ( /obj/effect/spawner/random/entertainment/money_small, /obj/structure/table, @@ -139129,7 +139387,8 @@ }, /obj/machinery/button/flasher{ id = "IsolationFlash"; - pixel_x = -24 + pixel_x = -24; + dir = 8 }, /turf/open/floor/iron/dark/textured, /area/station/security/execution/education) @@ -139333,7 +139592,7 @@ /area/station/hallway/primary/port) "uHw" = ( /obj/structure/closet, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/tile/dark_blue/opposingcorners{ dir = 1 @@ -139627,7 +139886,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "uKz" = ( /obj/effect/turf_decal/siding/dark/corner{ dir = 8 @@ -139668,13 +139927,13 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "uKL" = ( /obj/machinery/porta_turret/ai, /obj/effect/turf_decal/bot, /obj/machinery/computer/security/telescreen/minisat/directional/east, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "uKZ" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -140060,7 +140319,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "uNI" = ( /obj/structure/railing{ dir = 9 @@ -140349,9 +140608,11 @@ /turf/open/floor/grass, /area/station/hallway/secondary/entry) "uPS" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall, -/area/station/security/checkpoint/escape) +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/bronze, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/space/openspace, +/area/space/nearstation) "uPX" = ( /obj/machinery/door/poddoor/preopen{ id = "bridge blast"; @@ -140565,15 +140826,14 @@ /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "uRZ" = ( -/obj/effect/turf_decal/siding{ - dir = 5 - }, -/obj/effect/turf_decal/siding/corner{ - dir = 8 +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/blue/end{ + dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/white/herringbone, -/area/station/medical/patients_rooms) +/turf/open/floor/iron/dark/herringbone, +/area/station/medical/paramedic) "uSc" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/south, @@ -140588,6 +140848,7 @@ pixel_y = -4 }, /obj/structure/sign/warning/yes_smoking/circle/directional/south, +/obj/machinery/barsign/directional/south, /turf/open/floor/grass, /area/station/service/bar) "uSf" = ( @@ -140619,7 +140880,7 @@ network = list("minisat") }, /turf/open/misc/asteroid/airless, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "uSn" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -140773,9 +141034,7 @@ /area/station/commons/lounge) "uTL" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "uTM" = ( @@ -140811,7 +141070,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/stone, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "uTS" = ( /obj/structure/chair/sofa/corp{ dir = 1 @@ -140861,7 +141120,7 @@ dir = 1 }, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "uUi" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 6 @@ -140936,7 +141195,7 @@ }, /obj/machinery/light/floor, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "uUI" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 9 @@ -141098,7 +141357,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "uVH" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /obj/machinery/door/firedoor, @@ -141344,7 +141603,7 @@ }, /obj/structure/marker_beacon/lime, /turf/open/floor/grass, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "uXm" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -141407,7 +141666,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "uXN" = ( /obj/structure/table/reinforced/rglass, /obj/item/storage/box/monkeycubes{ @@ -141557,7 +141816,7 @@ dir = 4 }, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "uZi" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -141593,7 +141852,7 @@ /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/sunny/style_random, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "uZr" = ( /obj/structure/chair/office{ dir = 8 @@ -141612,6 +141871,8 @@ /obj/effect/turf_decal/tile/blue/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/white/small, /area/station/medical/medbay/lobby) "uZE" = ( @@ -141631,7 +141892,7 @@ /obj/structure/marker_beacon/lime, /obj/structure/cable, /turf/open/floor/grass, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "uZJ" = ( /obj/structure/disposaloutlet{ dir = 4 @@ -141767,7 +142028,7 @@ }, /obj/machinery/firealarm/directional/west, /turf/open/floor/carpet/neon/simple/lime, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "vaz" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 10 @@ -141787,9 +142048,9 @@ /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance" }, -/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic, /turf/open/floor/plating, -/area/station/medical/patients_rooms) +/area/station/medical/paramedic) "vaG" = ( /obj/structure/railing{ dir = 8 @@ -141985,7 +142246,7 @@ dir = 8 }, /turf/open/misc/dirt/dark/station, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "vbG" = ( /obj/machinery/door/airlock/public/glass{ name = "Library" @@ -142027,7 +142288,7 @@ /obj/machinery/door/airlock/security/glass{ name = "Permabrig Visitation" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/turf_decal/stripes/line{ @@ -142129,17 +142390,6 @@ "vcy" = ( /obj/effect/turf_decal/tile/neutral, /obj/structure/hedge, -/obj/structure/sign/directions/security/directional/south{ - pixel_y = -24; - dir = 4 - }, -/obj/structure/sign/directions/command/directional/south{ - dir = 4 - }, -/obj/structure/sign/directions/upload/directional/south{ - pixel_y = -40; - dir = 4 - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -142318,7 +142568,7 @@ /obj/structure/cable, /obj/machinery/computer/security/telescreen/aiupload/directional/north, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "vdA" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -142559,7 +142809,7 @@ req_access = list("armory") }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "veT" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped{ dir = 4 @@ -142730,7 +142980,7 @@ /area/station/science/ordnance/storage) "vgI" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 4 }, /obj/effect/turf_decal/bot, @@ -142918,7 +143168,7 @@ dir = 6 }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "vhR" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 1 @@ -143193,8 +143443,6 @@ /turf/open/floor/iron/dark/small, /area/station/engineering/supermatter/room) "vjr" = ( -/obj/machinery/digital_clock/directional/north, -/obj/structure/chair/sofa/corp/right, /obj/effect/turf_decal/trimline/blue/filled/line, /obj/effect/turf_decal/trimline/blue/corner{ dir = 1 @@ -143203,8 +143451,10 @@ /obj/machinery/camera/autoname/directional/north{ network = list("ss13","medbay") }, -/turf/open/floor/iron/white, -/area/station/medical/patients_rooms) +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "vjs" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -143418,10 +143668,8 @@ /turf/open/misc/asteroid/airless, /area/space/nearstation) "vkH" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/structure/flora/rock/pile/jungle/style_random, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/glass/reinforced/airless, /area/space/nearstation) "vkK" = ( @@ -143564,9 +143812,22 @@ /turf/open/floor/wood/large, /area/station/command/heads_quarters/cmo) "vlt" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall, -/area/station/hallway/secondary/exit/departure_lounge) +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "vlu" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 1 @@ -143623,7 +143884,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "vlP" = ( /obj/structure/hedge, /obj/structure/railing{ @@ -143684,18 +143945,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/iron, /area/station/maintenance/fore/lesser) -"vmp" = ( -/obj/machinery/door/airlock/medical{ - name = "Psychology" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/mapping_helpers/airlock/access/all/medical/psychology, -/obj/effect/landmark/navigate_destination, -/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/psychology) "vmt" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 10 @@ -144169,7 +144418,7 @@ }, /obj/structure/flora/bush/grassy/style_random, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "vqa" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/rock/pile/jungle/style_random, @@ -144318,7 +144567,7 @@ pixel_x = -32 }, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "vrO" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/railing{ @@ -144907,7 +145156,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "vvQ" = ( /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 8 @@ -145245,7 +145494,7 @@ }, /obj/structure/flora/rock/pile/jungle/style_random, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "vyb" = ( /obj/machinery/duct, /obj/structure/cable, @@ -145485,7 +145734,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/iron/white, @@ -145650,22 +145899,10 @@ /turf/open/floor/iron/dark, /area/station/maintenance/starboard/fore) "vBA" = ( -/obj/machinery/button/door/directional/east{ - id = "qm_warehouse"; - name = "Warehouse Door Control"; - req_access = list("cargo"); - pixel_y = 24 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/turf_decal/siding/brown{ - dir = 1 - }, /turf/open/floor/iron/dark/side{ dir = 4 }, @@ -145919,7 +146156,7 @@ color = "#4874A2" }, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "vDE" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 @@ -146121,6 +146358,7 @@ dir = 4 }, /obj/machinery/camera/autoname/directional/south, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron/dark/side{ dir = 2 }, @@ -146534,10 +146772,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port) "vIJ" = ( @@ -146710,6 +146948,13 @@ /obj/effect/turf_decal/trimline/red/corner, /turf/open/floor/iron/dark, /area/station/command/bridge) +"vJQ" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark, +/obj/structure/railing, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "vKc" = ( /obj/effect/turf_decal/siding/wood/corner, /obj/item/kirbyplants/organic/plant22, @@ -146768,9 +147013,6 @@ }, /obj/item/kirbyplants/random, /obj/machinery/camera/autoname/directional/north, -/obj/structure/sign/directions/evac/directional/north{ - dir = 8 - }, /turf/open/floor/iron/dark/herringbone, /area/station/commons/dorms) "vKB" = ( @@ -146936,7 +147178,7 @@ /obj/effect/turf_decal/siding/thinplating_new/light/corner{ dir = 8 }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/white, /area/station/hallway/primary/fore) "vMd" = ( @@ -147083,6 +147325,7 @@ }, /obj/effect/turf_decal/trimline/dark/corner, /obj/machinery/digital_clock/directional/south, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/dark/side{ dir = 10 }, @@ -147237,7 +147480,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "vPe" = ( /obj/machinery/computer/mechpad, /obj/structure/cable, @@ -147266,7 +147509,7 @@ /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "vPm" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -147320,7 +147563,7 @@ "vPH" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "vPU" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -147675,7 +147918,7 @@ dir = 8 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "vSy" = ( /obj/effect/turf_decal/trimline/dark_green, /obj/structure/disposalpipe/segment, @@ -147726,7 +147969,8 @@ /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 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, @@ -148139,7 +148383,7 @@ dir = 6 }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "vWs" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -148264,9 +148508,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/machinery/camera/autoname/directional/north{ - dir = 9 - }, +/obj/machinery/camera/autoname/directional/north, /obj/structure/railing/corner{ dir = 4 }, @@ -148310,11 +148552,9 @@ /obj/item/kirbyplants/organic/plant10, /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/trimline/dark/corner, -/obj/machinery/camera/autoname/directional/south{ - dir = 5 - }, +/obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "vXL" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -148833,7 +149073,8 @@ /area/station/science/lower) "wbI" = ( /obj/structure/sign/painting/library{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -148913,7 +149154,7 @@ dir = 8 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "wcg" = ( /obj/machinery/airalarm/directional/south, /obj/structure/chair/sofa/bench/right{ @@ -148934,7 +149175,7 @@ /obj/machinery/holopad, /obj/structure/flora/bush/sparsegrass/style_3, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "wcq" = ( /obj/structure/chair/sofa/corp, /obj/machinery/incident_display/delam/directional/north, @@ -149364,15 +149605,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/primary/port) -"wfW" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/department/cargo) "wgg" = ( /obj/effect/turf_decal/trimline/dark_red/warning{ dir = 6 @@ -149452,7 +149684,6 @@ dir = 8 }, /obj/machinery/camera/autoname/directional/south{ - dir = 5; network = list("prison") }, /obj/machinery/processor, @@ -149786,6 +150017,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/station/solars/port/aft) +"wjl" = ( +/obj/structure/window/reinforced/plasma/fulltile, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) "wjr" = ( /obj/machinery/destructive_scanner, /obj/effect/turf_decal/delivery, @@ -149887,7 +150122,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -150221,7 +150456,7 @@ dir = 8 }, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "wmO" = ( /turf/open/floor/iron, /area/station/maintenance/fore/lesser) @@ -150367,7 +150602,7 @@ network = list("minisat") }, /turf/open/floor/engine/hull/reinforced, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "wnQ" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -150471,7 +150706,7 @@ }, /obj/machinery/porta_turret/ai, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "woH" = ( /obj/machinery/holopad, /obj/effect/turf_decal/box/white{ @@ -150826,7 +151061,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "wsY" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -150923,7 +151158,7 @@ dir = 6 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "wtR" = ( /obj/structure/curtain/cloth{ color = "#666666" @@ -150988,7 +151223,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "wup" = ( /obj/effect/turf_decal/tile/dark_blue/half/contrasted, /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ @@ -151097,7 +151332,7 @@ /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, /turf/open/floor/wood/parquet, /area/station/medical/psychology) "wvm" = ( @@ -151235,7 +151470,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "wvS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -151378,13 +151613,13 @@ /turf/open/floor/wood, /area/station/maintenance/port/fore) "wwX" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/directions/engineering/directional/east{ - dir = 2 +/obj/structure/sign/directions/evac/directional/north{ + pixel_x = 0; + pixel_y = -5; + dir = 10 }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) +/turf/closed/wall, +/area/station/service/kitchen/diner) "wwY" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/chair/sofa/bench/right{ @@ -151560,7 +151795,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 4 }, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "wyn" = ( /obj/machinery/door/window/brigdoor/left/directional/west{ req_access = list("security"); @@ -151767,6 +152002,22 @@ dir = 5 }, /area/station/commons/dorms) +"wzw" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "wzI" = ( /obj/effect/turf_decal/trimline/dark/corner{ dir = 1 @@ -151777,7 +152028,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 1 }, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "wzL" = ( /obj/structure/railing{ dir = 1 @@ -152154,7 +152405,7 @@ dir = 8 }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "wCr" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/components/unary/portables_connector/visible, @@ -152799,7 +153050,7 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "wHS" = ( /obj/structure/chair/wood/wings{ dir = 1 @@ -153149,7 +153400,7 @@ dir = 4 }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "wKM" = ( /obj/effect/turf_decal/siding/brown, /obj/effect/turf_decal/trimline/brown/filled/corner, @@ -153186,7 +153437,7 @@ "wLa" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/delivery, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark/small, /area/station/hallway/primary/port) "wLd" = ( @@ -153294,7 +153545,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "wLX" = ( /obj/machinery/dna_scannernew, /turf/open/floor/iron/dark/textured, @@ -153504,7 +153755,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 4 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "wNP" = ( /obj/effect/spawner/random/structure/table_or_rack, /obj/item/clothing/mask/gas, @@ -153874,7 +154125,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "wQQ" = ( /obj/structure/railing/corner{ dir = 1 @@ -154241,6 +154492,7 @@ /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 8 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "wUK" = ( @@ -154588,16 +154840,14 @@ /obj/effect/turf_decal/siding/dark{ dir = 1 }, +/obj/machinery/camera/autoname/directional/south, /obj/machinery/barsign/directional/south, -/obj/machinery/camera/autoname/directional/south{ - dir = 5 - }, /turf/open/floor/iron/dark/herringbone, /area/station/service/bar) "wXm" = ( /obj/structure/cable, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "wXo" = ( /obj/structure/table, /obj/item/reagent_containers/spray/pestspray{ @@ -154615,6 +154865,19 @@ /obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) +"wXs" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "wXu" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 10 @@ -155130,6 +155393,9 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"xbK" = ( +/turf/closed/wall, +/area/station/medical/office) "xbM" = ( /obj/effect/turf_decal/trimline/yellow/corner{ dir = 1 @@ -155660,6 +155926,21 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"xgM" = ( +/obj/structure/sign/directions/evac/directional/north{ + pixel_y = 10; + dir = 8 + }, +/obj/structure/sign/directions/command/directional/north{ + dir = 4; + pixel_y = -10 + }, +/obj/structure/sign/directions/security/directional/north{ + pixel_y = 0; + dir = 4 + }, +/turf/closed/wall, +/area/station/service/cafeteria) "xgP" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -155936,7 +156217,7 @@ }, /obj/structure/cable/layer3, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "xji" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -156214,7 +156495,7 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/turret_protected/aisat/service) +/area/station/ai/satellite/service) "xla" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -156231,7 +156512,7 @@ /turf/open/floor/iron/dark/textured_corner{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "xlf" = ( /obj/machinery/door/airlock{ name = "Unisex Showers" @@ -156419,7 +156700,7 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "xmv" = ( /obj/effect/turf_decal/delivery, /obj/structure/rack, @@ -156831,7 +157112,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "xpq" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -157253,7 +157534,7 @@ }, /obj/structure/flora/grass/jungle/b/style_2, /turf/open/water, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "xsP" = ( /obj/effect/turf_decal/trimline/brown, /obj/machinery/light/floor, @@ -157651,7 +157932,7 @@ }, /obj/structure/marker_beacon/jade, /turf/open/floor/holofloor/wood, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "xvH" = ( /obj/item/kirbyplants/organic/plant22{ pixel_y = 9 @@ -157709,6 +157990,7 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/machinery/duct, /obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "xwg" = ( @@ -157796,7 +158078,7 @@ /obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "xwW" = ( /obj/machinery/door/poddoor/preopen{ id = "Prison Gate"; @@ -158092,7 +158374,7 @@ dir = 6 }, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "xzH" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -158546,7 +158828,7 @@ "xDe" = ( /obj/machinery/porta_turret/ai, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "xDi" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -158891,12 +159173,10 @@ /area/station/maintenance/port/fore) "xGg" = ( /obj/structure/hedge, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, /obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "xGh" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -159476,6 +159756,8 @@ dir = 1 }, /obj/machinery/firealarm/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/medical/psychology) "xKc" = ( @@ -159606,7 +159888,7 @@ /obj/machinery/firealarm/directional/west, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "xLb" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -159725,7 +160007,7 @@ dir = 8 }, /turf/open/floor/iron/dark/textured, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "xLX" = ( /turf/open/floor/carpet/red, /area/station/security/detectives_office) @@ -159899,7 +160181,7 @@ dir = 5 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "xMI" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -160058,7 +160340,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured_half, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "xNP" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/tcomms_all, @@ -160137,11 +160419,19 @@ }, /turf/open/floor/carpet/orange, /area/station/command/heads_quarters/ce) +"xON" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/marker_beacon/burgundy, +/obj/structure/lattice/catwalk, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/engine/hull/reinforced, +/area/space/nearstation) "xOP" = ( /obj/structure/railing/corner{ dir = 4 }, -/obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, /area/space/nearstation) "xOV" = ( @@ -160230,7 +160520,7 @@ /obj/machinery/door/airlock/medical/glass{ name = "Primary Treatment Centre" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -160553,7 +160843,7 @@ /obj/machinery/status_display/ai/directional/west, /obj/machinery/light/directional/west, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/atmos) +/area/station/ai/satellite/atmos) "xRE" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -160957,10 +161247,11 @@ network = list("minisat") }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xVs" = ( /obj/structure/noticeboard/qm{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 4 @@ -161243,7 +161534,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "xXR" = ( /obj/structure/table/wood, /obj/structure/cable, @@ -161280,6 +161571,12 @@ }, /turf/open/floor/iron/dark, /area/station/science/explab) +"xYm" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "xYr" = ( /obj/structure/flora/bush/fullgrass, /obj/structure/flora/grass/jungle/a/style_random, @@ -161615,7 +161912,7 @@ }, /obj/structure/chair/sofa/bench/solo, /turf/open/floor/iron/dark/herringbone, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "yaR" = ( /obj/machinery/light/floor, /obj/effect/turf_decal/trimline/brown, @@ -162394,7 +162691,7 @@ /obj/effect/turf_decal/delivery, /obj/structure/window/spawner/directional/west, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ygY" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -162577,7 +162874,7 @@ }, /obj/structure/flora/bush/grassy/style_random, /turf/open/floor/grass, -/area/station/ai_monitored/aisat/exterior) +/area/station/ai/satellite/exterior) "yiu" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -162938,12 +163235,12 @@ /obj/effect/turf_decal/caution/stand_clear{ dir = 8 }, +/obj/effect/turf_decal/box, /obj/machinery/door/poddoor/shutters{ dir = 8; id = "qm_warehouse"; name = "Warehouse Shutters" }, -/obj/effect/turf_decal/box, /turf/open/floor/iron/dark/textured_half{ dir = 1 }, @@ -163191,7 +163488,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark/small, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ylW" = ( /obj/structure/table/reinforced/rglass, /obj/item/paper_bin{ @@ -178290,7 +178587,7 @@ qgY wvm uYI vFA -vlt +fdz cZB qSw cZB @@ -181878,7 +182175,7 @@ chn ptU fem ejn -uPS +bZT iWM kwY ldl @@ -182917,7 +183214,7 @@ fNC eMP ejn ejn -ejn +jDr eEx gOa tcM @@ -184459,7 +184756,7 @@ eRi tda ejn ejn -ejn +jDr vKu gOa oCL @@ -192198,7 +192495,7 @@ ukX lxu lcj enK -jCi +bdQ bdQ iHt rAE @@ -194770,7 +195067,7 @@ tOw ild tOw ukX -tOw +wjl vky ukX vky @@ -198527,7 +198824,7 @@ gym kFj kFj kFj -jsi +pif ciG sho ciG @@ -199315,7 +199612,7 @@ hFb cWB hrq wRM -kCp +pzy oQa pzy pzy @@ -199862,7 +200159,7 @@ kqn puv xrx cii -ird +uAz ird dPx dPx @@ -209632,10 +209929,10 @@ vjj rye hBv wYE -tiv +mCn +huN eDF eDF -mCn sWH wBq pem @@ -212711,7 +213008,7 @@ eJN mMZ pZo lMc -iHK +gwv dbg mfR mxG @@ -212775,7 +213072,7 @@ wKB uCV qig uhM -uhM +rXp uhM eJb jRq @@ -216784,11 +217081,11 @@ gym gym gym gJT -kNp +eoO hJX faj hJX -kNp +eoO gJT gym gym @@ -218326,11 +218623,11 @@ gym gym gym gym -kNp +eoO hJX kvJ hJX -kNp +eoO gym gym gym @@ -242010,7 +242307,7 @@ qvg kiX vLs joK -vLs +oGQ bLu bLu lng @@ -242771,8 +243068,8 @@ txW kaB pCa pCa -nnZ -uty +lAM +aEz hzt uty dya @@ -245079,8 +245376,8 @@ txW kaB pCa pCa -mGv -gxe +ewt +tpN pIn uty uty @@ -246360,7 +246657,7 @@ txW txW txW txW -mGv +ewt grZ jyx pSJ @@ -249444,7 +249741,7 @@ txW txW txW txW -mGv +ewt ghV oOw vLi @@ -249733,7 +250030,7 @@ rXt bbr dhB tLT -dMW +wwX eAb mrW byU @@ -250479,9 +250776,9 @@ kaB txW txW txW +lAM nnZ kLH -kLH akB dtb dtb @@ -252786,7 +253083,7 @@ pCa pCa rVd rVd -rVd +gVK rVd rVd pCa @@ -252808,7 +253105,7 @@ ugP jyh kGK hCZ -bxv +rub xbv cho kpP @@ -254556,7 +254853,7 @@ txW lAM aqt aqt -mGv +ewt aec aec lAM @@ -254813,7 +255110,7 @@ itE gxe aNh jjf -sLa +gbi sLa dtn xKy @@ -255064,8 +255361,8 @@ txW txW ewt keO -vIx -nnZ +wXs +lAM gxe dtb pIn @@ -255378,7 +255675,7 @@ hCZ htH tTl bwC -bxv +rub sbp cho lNb @@ -255409,7 +255706,7 @@ opa vCS jWv oth -wwX +qLk sSt irB naa @@ -255666,7 +255963,7 @@ naa jck naa jJw -naa +pzo naa veW ygk @@ -256472,7 +256769,7 @@ txW nzu txW nPJ -fBx +nuy tod txW nzu @@ -256604,8 +256901,8 @@ txW kaB pCa pCa -nnZ -sJF +lAM +fDh wPS wPS wPS @@ -257152,13 +257449,13 @@ mAA aan iPk uVa -icj -icj +xbK +xbK jLx -icj +xbK daE -icj -icj +xbK +xbK uVa gsx aan @@ -257238,7 +257535,7 @@ gKy dtb dtb txW -sEF +aXd iVN vSW gAD @@ -257248,7 +257545,7 @@ cXz uJk okv uDx -sEF +aXd txW txW txW @@ -257409,7 +257706,7 @@ sGo rOK oBt nCQ -icj +xbK eCd sWo hlR @@ -257666,7 +257963,7 @@ sOB jed oBt tvH -icj +xbK mzf ygg axM @@ -257886,8 +258183,8 @@ txW txW txW txW -mGv -tGj +ewt +tcG tGj vcY dtb @@ -257922,8 +258219,8 @@ rUX cxH hzk oBt -nCQ -icj +bKl +xbK hhs pbi seg @@ -258180,13 +258477,13 @@ qan aan fPb uVd -icj -icj +xbK +xbK oBu yjt wOe -icj -icj +xbK +xbK uVd nch aan @@ -258216,11 +258513,11 @@ fDJ fDJ xzR fDJ -fDJ +bQm aTh oJr tKp -fYi +bQy fYi aAN fYi @@ -258435,8 +258732,8 @@ cUI iMx bon nox -fVk -uVd +wkG +dov kCn rbi jgD @@ -258473,7 +258770,7 @@ iVK yck duV xIs -czJ +bna bna fub eAL @@ -258694,8 +258991,8 @@ iqC rgy lXX rgm -cTV -eIq +gbr +pKh uZv pef irs @@ -258914,8 +259211,8 @@ txW txW txW txW -nnZ -sFS +lAM +vlt sFS xpG ukF @@ -258942,17 +259239,17 @@ kLa tDq chl hTz -uhK -uhK +icj +mHR lBR -uhK -uhK -uVa +mHR +icj +fzH qQq tet -mUT -gbr -pKh +uVd +kMY +eIq pTK hiq dTX @@ -259195,7 +259492,7 @@ jVh kLa bIz kyi -wfW +jzp grk gaK nRn @@ -259204,8 +259501,8 @@ oyb hjE gbV saO -uhK -uhK +bXc +rvC uhK uVd lYL @@ -259294,7 +259591,7 @@ gKy dtb dtb txW -fBx +nuy aeD eUh ukb @@ -259304,7 +259601,7 @@ cXz xYz eUh qeC -sEF +aXd txW txW txW @@ -259456,14 +259753,14 @@ kLa sdm sdm sdm -uhK +icj vjr uRZ gmk gPo bXP -sjK kJX +xYm uVd efm hAd @@ -259713,12 +260010,12 @@ kLa iCL kwm axI -uhK +icj nPx tqL jQI kyd -uhK +fiB fjq bAD hkc @@ -259973,11 +260270,11 @@ kIT bxI bxI bxI -vmp bxI bxI bxI bxI +icj hkc nAQ dXX @@ -260075,8 +260372,8 @@ eVR aqt aqt aqt -aqt sEF +aXd txW txW txW @@ -260578,8 +260875,8 @@ txW txW txW txW -sEF -aqt +aXd +div gxe dtb smB @@ -260708,8 +261005,8 @@ txW txW txW txW -opN -mGv +uPS +ewt pCa pCa gJT @@ -261109,7 +261406,7 @@ dtb dtb rfP oWn -oWn +kIp xOP txW txW @@ -261519,7 +261816,7 @@ bxI bxI uZQ iCr -bxI +hkc rrV fEu vxQ @@ -261569,7 +261866,7 @@ jRA rdQ bUw hNz -uBc +pRL mgT tvU wwY @@ -262028,7 +262325,7 @@ ujf rNp mEs toZ -mEs +txY fut rEg tYn @@ -262377,8 +262674,8 @@ cAe txW txW txW -fBx -kLH +nuy +nnZ uPq dtb lje @@ -262577,7 +262874,7 @@ sQm pHi dCI muG -gOV +xgM qxw mZk vSF @@ -262597,7 +262894,7 @@ lro iKL mkx vcy -nVN +czJ kwd dre mlp @@ -262651,7 +262948,7 @@ kLH kLH oOw uxn -uxn +wzw cud txW txW @@ -262902,8 +263199,8 @@ ukF ukF iWP kLH -kLH -sEF +sqU +aXd txW txW txW @@ -263278,8 +263575,8 @@ txW txW txW txW -opN -mGv +uPS +ewt pCa pCa gJT @@ -263662,8 +263959,8 @@ txW txW txW txW -sEF -aqt +aXd +div gxe dtb smB @@ -264184,8 +264481,8 @@ eiF uty hzt uty -nrR -fBx +sgP +nuy pCa hFK uty @@ -264578,7 +264875,7 @@ aGm aGm eIs aGm -qze +pdx vBA pAj wvp @@ -265926,7 +266223,7 @@ uIV uIV nix uIV -uIV +iSX vQP vGu cNH @@ -266240,8 +266537,8 @@ dBE mKY hzt uty -cff -sEF +xON +aXd pCa hFK uty @@ -267401,8 +267698,8 @@ txW txW txW txW -nnZ -pIn +lAM +hCG uty mKY hzt @@ -267410,8 +267707,8 @@ mKY hzt mKY uty -dya -nnZ +mTU +lAM txW txW txW @@ -268690,8 +268987,8 @@ ewt kLH kLH kLH -kLH -nnZ +sqU +lAM kLH kLH kLH @@ -269221,7 +269518,7 @@ vwR aqt aqt mzt -nnZ +lAM pCa pCa pCa @@ -271799,8 +272096,8 @@ ewt kLH kLH kLH -kLH -nnZ +sqU +lAM pCa pCa txW @@ -272559,7 +272856,7 @@ fEZ jyK sJF wPS -vwd +rvq wPS ndj pIn @@ -272816,7 +273113,7 @@ kHR fev uXh bSB -nnZ +lAM kLH kLH odY @@ -273614,12 +273911,12 @@ txW txW txW txW -sEF +aXd nhJ sLa feq flp -fBx +nuy rJW rJW lMp @@ -275156,12 +275453,12 @@ txW txW txW txW -fBx +nuy pHn gFv wPS eaO -sEF +aXd dtb rJW xKy @@ -275989,7 +276286,7 @@ dRZ txW lHF aqt -fBx +nuy wBM mpS txW @@ -276246,7 +276543,7 @@ aXd aqt cyB ukF -ukF +uTL ukF oKZ aqt @@ -276510,8 +276807,8 @@ dtb vwK dtb erl -aqt -fBx +sEF +nuy aqt uzU txW @@ -276995,8 +277292,8 @@ qvg pdG aqt oFa -aqt -fBx +sEF +nuy kaB pCa pCa @@ -277010,8 +277307,8 @@ pCa pCa pCa dRZ -fBx -pIn +nuy +hCG uty dUu vvn @@ -277287,8 +277584,8 @@ omF igQ xKy pdG -aqt -fBx +sEF +nuy dRZ txW txW @@ -278016,7 +278313,7 @@ aoX sXi ghk kxQ -vSH +bxv vSH vSH vSH @@ -278498,13 +278795,13 @@ txW txW txW txW -fBx -eiF +nuy +mGv uty hzt mKY -cff -sEF +xON +aXd jHP uty uty @@ -278574,8 +278871,8 @@ xDe cPU gfC omF -ukF -sEF +aFi +aXd dRZ txW txW @@ -279857,8 +280154,8 @@ omF dtb dtb sAF -fic -fBx +sMP +nuy dRZ txW txW @@ -280079,8 +280376,8 @@ qpJ ecL kLH nHW -kLH -sEF +sqU +aXd kaB pCa pCa @@ -280094,8 +280391,8 @@ pCa pCa pCa dRZ -sEF -bwF +aXd +vJQ uty gvK vBu @@ -280622,8 +280919,8 @@ ukF cWI ukF iLt -kLH -sEF +sqU +aXd kLH nMg txW @@ -280872,7 +281169,7 @@ nuy kLH qnv ukF -ukF +lyI ukF iWP fic @@ -281072,15 +281369,15 @@ txW txW txW txW -sEF -omF +aXd +jkQ eiF uty hzt uty cff -eLm fBx +nuy qvg iJc eZi @@ -281129,7 +281426,7 @@ dRZ txW thP kLH -sEF +aXd kLH nMg txW diff --git a/_maps/map_files/Vampire/runtimetown.dmm b/_maps/map_files/Vampire/runtimetown.dmm index e9911ba22843..1ec70ff7bd07 100644 --- a/_maps/map_files/Vampire/runtimetown.dmm +++ b/_maps/map_files/Vampire/runtimetown.dmm @@ -1,10 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ap" = ( -/obj/item/vamp/phone/street{ - pixel_z = 24 - }, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) "av" = ( /obj/structure/table, /obj/item/ammo_box/magazine/darkpack45acp, @@ -13,24 +7,25 @@ /obj/item/gun/ballistic/automatic/pistol/darkpack/m1911, /turf/open/floor/plating/rough, /area/vtm/interior/anarch) +"ax" = ( +/obj/structure/toiletbong, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) +"aM" = ( +/obj/effect/spawner/random/trash/rat, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "aN" = ( /obj/effect/landmark/npcbeacon/directed{ dir = 1 }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) -"aO" = ( -/obj/machinery/fax/admin/camarilla, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) -"aW" = ( -/obj/structure/roofstuff/vent_end, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) "ba" = ( /obj/structure/retail/clothing_store, /obj/structure/table, -/turf/closed/wall/vampwall/brick/low, +/obj/structure/platform/lowwall/brick, +/turf/open/floor/plating/rough, /area/vtm/interior/shop) "bh" = ( /obj/structure/chair/greyscale{ @@ -38,26 +33,25 @@ }, /turf/open/floor/plating/rough/cave, /area/vtm/outside/pacificheights) +"bj" = ( +/obj/structure/closet/secure_closet/freezer, +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) "bo" = ( -/obj/structure/table/wood, /obj/item/paper_bin, /obj/item/pen, -/turf/closed/wall/vampwall/painted/low, +/obj/structure/table/countertop/red, +/turf/open/floor/plating/concrete, /area/vtm/interior/shop) "bp" = ( /obj/effect/turf_decal/bordur, /obj/structure/roadsign/crosswalk, /turf/open/floor/plating/sidewalk/poor, /area/vtm/outside/pacificheights) -"bs" = ( -/obj/structure/table/wood, -/obj/item/vtm_artifact/fae_charm, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) -"by" = ( -/obj/item/clothing/head/collectable/pirate, -/turf/open/floor/plating/woodrough, -/area/vtm/outside/pacificheights) +"bB" = ( +/obj/structure/chair/wood/darkpack/red, +/turf/open/floor/plating/rough, +/area/vtm/interior/techshop) "bC" = ( /obj/item/reagent_containers/cup/bottle/morphine, /obj/item/reagent_containers/cup/bottle/morphine, @@ -69,17 +63,11 @@ /obj/structure/closet/secure_closet/medical2, /turf/open/floor/plating/rough, /area/vtm/interior/clinic) -"bD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/misc/dirt/vamp, -/area/vtm/outside/supply) -"bE" = ( +"bK" = ( +/obj/machinery/fax/admin/camarilla, /obj/structure/table/wood, -/obj/item/vtm_artifact/mummywrap_fetish, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "bL" = ( /obj/item/gas_can{ anchored = 1; @@ -103,25 +91,42 @@ /obj/item/defibrillator/compact, /turf/open/floor/plating/rough, /area/vtm/interior/clinic) +"ca" = ( +/turf/closed/wall/vampwall/old, +/area/vtm/outside/ghetto) "cf" = ( /turf/open/floor/plating/sidewalk/rich, /area/vtm/outside/pacificheights) -"ch" = ( -/obj/structure/table/wood, -/obj/item/vtm_artifact/galdjum, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) +"cg" = ( +/obj/structure/roofstuff/vent_end{ + dir = 8 + }, +/turf/open/misc/grass, +/area/vtm/outside/pacificheights) "ci" = ( -/obj/structure/table/bacotell, /obj/underplate/stuff{ pixel_y = 8 }, +/obj/structure/table/countertop/bacotell, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) "cj" = ( /obj/effect/turf_decal/bordur, /turf/open/floor/plating/sidewalk/poor, /area/vtm/outside/pacificheights) +"co" = ( +/obj/machinery/door/airlock/elevator/multi_tile{ + transport_linked_id = "DebugElevator" + }, +/turf/open/floor/iron/smooth_large, +/area/vtm/outside/pacificheights) +"cw" = ( +/obj/machinery/sprinkler, +/obj/structure/chair/comfy/darkpack{ + dir = 1 + }, +/turf/open/floor/plating/rough, +/area/vtm/interior/techshop) "cQ" = ( /obj/structure/table, /obj/item/storage/medkit/darkpack/ifak, @@ -144,30 +149,54 @@ }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) +"dc" = ( +/obj/structure/railing, +/obj/structure/lattice/grate, +/turf/open/openspace, +/area/vtm/outside/pacificheights) +"di" = ( +/obj/structure/lattice/grate, +/turf/open/openspace, +/area/vtm/outside/pacificheights) "dA" = ( /obj/structure/table, /obj/item/storage/medkit/darkpack/doctor, /obj/machinery/light/directional/north, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) -"ee" = ( -/turf/open/floor/plating/toilet, -/area/vtm/interior/shop) -"eg" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = 32 +"dL" = ( +/obj/structure/table/wood, +/obj/machinery/light/directional/south, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) +"dN" = ( +/obj/item/clothing/head/cone, +/turf/open/misc/dirt, +/area/vtm/outside/supply) +"dP" = ( +/obj/structure/table/wood, +/obj/machinery/radio_tranceiver/anarch, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) +"dU" = ( +/obj/structure/railing/corner, +/turf/open/floor/plating/canal, +/area/vtm/outside/pacificheights) +"ef" = ( +/obj/structure/roofstuff/vent_end{ + dir = 4 }, -/turf/open/floor/plating/rough, -/area/vtm/interior/techshop) +/turf/open/misc/grass, +/area/vtm/outside/pacificheights) +"eg" = ( +/obj/structure/sign/city/order/directional/north, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "el" = ( -/obj/structure/table/bubway, +/obj/structure/table/countertop/bubway, /obj/structure/retail/bubway_menu, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) -"em" = ( -/obj/machinery/fax/aasimites, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) "en" = ( /obj/item/vamp/keys/camarilla, /turf/open/floor/plating/asphalt, @@ -186,7 +215,17 @@ /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) "eR" = ( -/turf/closed/wall/vampwall/rich/old/low/window, +/obj/structure/platform/lowwall/rich/old/window, +/turf/open/floor/plating/rough, +/area/vtm/outside/pacificheights) +"eU" = ( +/mob/living/carbon/human/npc/shop, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"fc" = ( +/obj/machinery/fax/glasswalker, +/obj/structure/table/wood, +/turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) "fd" = ( /obj/effect/turf_decal/bordur{ @@ -195,27 +234,32 @@ /obj/item/vamp/keys/clinic, /turf/open/floor/plating/sidewalk/poor, /area/vtm/outside/pacificheights) -"ff" = ( -/obj/cargocrate, -/turf/open/misc/dirt/vamp/rails, -/area/vtm/outside/supply) "fh" = ( /obj/structure/chair/stool/bar/directional/west, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) -"fi" = ( -/obj/effect/decal/pallet, -/turf/open/misc/dirt/vamp, -/area/vtm/outside/supply) "fn" = ( /obj/effect/decal/cleanable/cardboard, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) -"fS" = ( -/obj/structure/ladder/manhole/down, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating/vampcanal, -/area/vtm/outside/pacificheights) +"fo" = ( +/obj/structure/vampdoor/simple/anarch{ + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"fI" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"fV" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/outside/ghetto) +"fZ" = ( +/obj/structure/fire_barrel, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/outside/ghetto) "gb" = ( /obj/effect/decal/cleanable/cardboard, /obj/structure/closet/cardboard, @@ -228,9 +272,10 @@ }, /turf/open/floor/plating/sidewalk/rich, /area/vtm/outside/pacificheights) -"gn" = ( -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) +"gl" = ( +/obj/machinery/hydroponics/soil, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) "gs" = ( /obj/effect/turf_decal/bordur{ dir = 1 @@ -240,13 +285,17 @@ }, /turf/open/floor/plating/sidewalk/rich, /area/vtm/outside/pacificheights) +"gA" = ( +/obj/machinery/fax/admin/aasimites, +/obj/structure/table/wood, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "gF" = ( /turf/open/floor/plating/rough, /area/vtm/interior/shop) -"gI" = ( -/obj/structure/vampdoor/supply, -/turf/open/floor/plating/sidewalk, -/area/vtm/interior/supply) +"gN" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) "gS" = ( /obj/effect/turf_decal/bordur{ dir = 8 @@ -258,30 +307,61 @@ /obj/effect/turf_decal/asphaltline, /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) -"ht" = ( -/obj/effect/decal/cleanable/trash{ - icon_state = "trash5" +"hk" = ( +/obj/machinery/button/elevator/directional/north{ + id = "DebugElevator4"; + pixel_x = 9; + pixel_y = 35 }, -/turf/open/misc/beach/vamp, +/obj/machinery/lift_indicator/directional/north{ + pixel_x = -5; + pixel_y = 20; + linked_elevator_id = "DebugElevator4" + }, +/turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) +"ho" = ( +/obj/machinery/sprinkler/area_managed, +/turf/open/floor/plating/rough, +/area/vtm/interior/techshop) "hu" = ( /obj/effect/decal/pallet, -/obj/item/ammo_box/vampire/arrows, -/obj/item/ammo_box/vampire/c12g, -/obj/item/ammo_box/vampire/c12g/buck, -/obj/item/ammo_box/vampire/c44, -/obj/item/ammo_box/vampire/c44/silver, +/obj/item/ammo_box/darkpack/arrows, +/obj/item/ammo_box/darkpack/c12g, +/obj/item/ammo_box/darkpack/c12g/buck, +/obj/item/ammo_box/darkpack/c44, +/obj/item/ammo_box/darkpack/c44/silver, /turf/open/floor/plating/rough, /area/vtm/interior/anarch) "hz" = ( -/obj/structure/table, /obj/lombard/blackmarket, -/turf/closed/wall/vampwall/brick/low, -/area/vtm/interior/shop) -"hA" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/plating/parquetry/old, +/obj/structure/table/countertop/beige, +/turf/open/floor/plating/rough, /area/vtm/interior/shop) +"hH" = ( +/obj/effect/decal/cleanable/trash{ + icon_state = "trash5" + }, +/obj/effect/spawner/random/occult/artifact, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) +"hK" = ( +/obj/structure/cargo_take, +/turf/open/misc/dirt, +/area/vtm/outside/supply) +"hT" = ( +/obj/structure/transport/linear/public, +/obj/structure/table, +/obj/item/gun/ballistic/rocketlauncher/unrestricted{ + pixel_y = 5; + pixel_x = -5 + }, +/obj/machinery/elevator_control_panel/directional/north{ + linked_elevator_id = "DebugElevator2"; + preset_destination_names = list("2" = "Lower", "3" = "Upper") + }, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/outside/pacificheights) "id" = ( /obj/effect/decal/graffiti, /turf/open/floor/plating/rough, @@ -290,10 +370,10 @@ /obj/structure/closet/cardboard, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) -"ig" = ( -/obj/item/kirbyplants/random, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) +"ih" = ( +/obj/structure/chair/darkpack/green, +/turf/open/floor/plating/rough, +/area/vtm/interior/techshop) "ik" = ( /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) @@ -310,16 +390,26 @@ "iH" = ( /turf/open/floor/plating/rough/cave, /area/vtm/outside/pacificheights) +"iJ" = ( +/obj/effect/spawner/random/occult/artifact, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) +"iK" = ( +/obj/structure/roofstuff/vent/autotiling, +/turf/open/misc/grass, +/area/vtm/outside/pacificheights) "iM" = ( /obj/effect/turf_decal/bordur/corner{ dir = 1 }, /turf/open/floor/plating/sidewalk/rich, /area/vtm/outside/pacificheights) -"iQ" = ( -/obj/structure/roofstuff/vent/autotiling, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) +"iR" = ( +/obj/structure/chair/comfy/darkpack/red{ + dir = 1 + }, +/turf/open/floor/plating/rough, +/area/vtm/interior/techshop) "iV" = ( /obj/darkpack_car/track{ access = "supply"; @@ -327,37 +417,83 @@ }, /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) +"iZ" = ( +/obj/machinery/hydroponics/simple/plastic, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) +"jd" = ( +/obj/structure/table/wood, +/obj/machinery/radio_tranceiver/police, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "je" = ( -/obj/machinery/button/door{ - id = "debughouse"; - pixel_y = 30 - }, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, +/obj/machinery/button/door/directional/north{ + id = "debughouse" + }, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) +"jj" = ( +/obj/structure/table, +/obj/item/liquid_flamethrower, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) +"jp" = ( +/obj/structure/platform/lowwall/brick, +/turf/open/floor/plating/rough, +/area/vtm/interior/supply) +"jw" = ( +/obj/effect/decal/cleanable/trash{ + icon_state = "trash7" + }, +/obj/effect/spawner/random/stray_animal, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) -"jf" = ( +"jD" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/structure/transport/linear/public, +/obj/structure/chair/sofa/bench/solo{ + dir = 8 + }, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/outside/pacificheights) +"jK" = ( /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 5 }, -/turf/open/misc/dirt/vamp, +/turf/open/misc/dirt, /area/vtm/outside/supply) -"jp" = ( -/turf/closed/wall/vampwall/brick/low, -/area/vtm/interior/supply) -"jt" = ( -/obj/effect/decal/cleanable/litter, -/obj/effect/spawner/random/occult/artifact, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) +"jR" = ( +/obj/machinery/button/elevator/directional/north{ + id = "DebugElevator2"; + pixel_x = 9; + pixel_y = 35 + }, +/obj/machinery/lift_indicator/directional/north{ + pixel_x = -5; + pixel_y = 20; + linked_elevator_id = "DebugElevator2" + }, +/turf/open/misc/grass, +/area/vtm/outside/pacificheights) "jW" = ( /obj/effect/decal/wallpaper/paper/stripe, /turf/closed/wall/vampwall/market, /area/vtm/interior/shop) +"kb" = ( +/obj/effect/landmark/start{ + jobspawn_override = 1; + delete_after_roundstart = 0 + }, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "kc" = ( /obj/structure/roadblock{ dir = 8 @@ -365,9 +501,6 @@ /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) "ki" = ( -/obj/structure/sign/city/order{ - pixel_y = 32 - }, /obj/structure/fluff/tv/order/three{ pixel_x = -10; pixel_y = 12 @@ -378,6 +511,10 @@ }, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) +"kj" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/misc/dirt, +/area/vtm/outside/supply) "kn" = ( /obj/structure/table, /obj/item/molotov, @@ -385,12 +522,6 @@ /obj/item/molotov, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) -"kM" = ( -/obj/structure/roofstuff/vent_end{ - dir = 4 - }, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) "kS" = ( /turf/closed/wall/vampwall/market, /area/vtm/interior/shop) @@ -406,41 +537,49 @@ }, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) -"lN" = ( -/turf/open/floor/plating/sidewalk/poor, -/area/vtm/outside/supply) -"lP" = ( -/obj/effect/decal/cleanable/trash{ - icon_state = "trash5" +"ln" = ( +/obj/item/kirbyplants/darkpack/random{ + pixel_x = -7; + pixel_y = 8 }, -/obj/effect/spawner/random/occult/artifact, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) -"lU" = ( -/obj/effect/decal/pallet, -/obj/machinery/light/directional/west, -/turf/open/misc/dirt/vamp, -/area/vtm/outside/supply) -"mb" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +/obj/item/kirbyplants/darkpack/random{ + pixel_x = -8; + pixel_y = -1 }, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) -"md" = ( -/turf/closed/wall/vampwall/old, -/area/vtm/outside/pacificheights) -"mj" = ( -/obj/structure/vampdoor/anarch{ - dir = 4 +"lM" = ( +/obj/effect/decal/cleanable/trash, +/obj/effect/spawner/random/occult/artifact, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) +"lN" = ( +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/outside/supply) +"lU" = ( +/obj/structure/table/wood, +/obj/item/vtm_artifact/key_of_alamut, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) +"lX" = ( +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/outside/ghetto) +"lY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/turf/open/floor/plating/concrete, -/area/vtm/interior/shop) +/turf/open/misc/dirt, +/area/vtm/outside/supply) "mm" = ( /obj/structure/table/reinforced, /obj/machinery/computer/order_console/mining/restricted/police, -/turf/closed/wall/vampwall/brick/low, +/obj/structure/platform/lowwall/brick, +/turf/open/floor/plating/rough, /area/vtm/interior/shop) +"mn" = ( +/obj/structure/barrels/rand, +/turf/open/misc/dirt, +/area/vtm/outside/supply) "mw" = ( /obj/structure/ladder/manhole/up, /turf/open/misc/beach/vamp, @@ -454,17 +593,54 @@ /obj/machinery/light/directional/north, /turf/open/floor/plating/rough, /area/vtm/interior/clinic) -"nh" = ( -/obj/weapon_showcase, -/turf/open/floor/plating/parquetry/old, -/area/vtm/interior/shop) +"mZ" = ( +/obj/machinery/fax/police, +/obj/structure/table/wood, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) +"nk" = ( +/obj/structure/table/wood, +/obj/structure/retail/hardware_store, +/obj/item/kirbyplants/darkpack/random{ + pixel_x = 10; + pixel_y = 17 + }, +/obj/item/kirbyplants/darkpack/random{ + pixel_x = -11; + pixel_y = -21 + }, +/obj/item/kirbyplants/darkpack/random{ + pixel_x = 4; + pixel_y = -14 + }, +/obj/item/kirbyplants/darkpack/random{ + pixel_y = 18 + }, +/obj/item/kirbyplants/darkpack/random{ + pixel_x = 12; + pixel_y = 9 + }, +/obj/item/kirbyplants/darkpack/random{ + pixel_x = 10; + pixel_y = -16 + }, +/obj/item/kirbyplants/darkpack/random{ + pixel_x = -5; + pixel_y = -13 + }, +/obj/item/kirbyplants/darkpack/random{ + pixel_x = -9; + pixel_y = 16 + }, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "nm" = ( /obj/effect/decal/pallet, -/obj/item/ammo_box/vampire/c9mm/silver, -/obj/item/ammo_box/vampire/c9mm/moonclip, -/obj/item/ammo_box/vampire/c9mm, -/obj/item/ammo_box/vampire/c45acp/silver, -/obj/item/ammo_box/vampire/c45acp, +/obj/item/ammo_box/darkpack/c9mm/silver, +/obj/item/ammo_box/darkpack/c9mm/moonclip, +/obj/item/ammo_box/darkpack/c9mm, +/obj/item/ammo_box/darkpack/c45acp/silver, +/obj/item/ammo_box/darkpack/c45acp, /turf/open/floor/plating/rough, /area/vtm/interior/anarch) "nq" = ( @@ -473,6 +649,12 @@ }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) +"nw" = ( +/obj/structure/table, +/obj/lombard, +/obj/structure/platform/lowwall/rich/old, +/turf/open/floor/plating/rough, +/area/vtm/outside/pacificheights) "nA" = ( /obj/effect/decal/cleanable/garbage, /obj/effect/decal/cleanable/cardboard, @@ -487,11 +669,9 @@ pixel_y = 12; pixel_x = 6 }, +/obj/structure/sign/city/store/bacotell/directional/north, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) -"nY" = ( -/turf/open/floor/plating/vampcanal, -/area/vtm/outside/pacificheights) "of" = ( /obj/item/storage/medkit/darkpack/standard, /obj/item/storage/medkit/darkpack/standard, @@ -499,31 +679,41 @@ /obj/structure/table, /turf/open/floor/plating/rough, /area/vtm/interior/clinic) +"oi" = ( +/obj/structure/closet/crate/wooden/communitygardens/seeds, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) "ok" = ( /obj/effect/decal/cleanable/litter, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) +"op" = ( +/obj/machinery/door/poddoor/shutters{ + elevator_mode = 1; + transport_linked_id = "DebugElevator3" + }, +/turf/open/floor/iron/smooth_large, +/area/vtm/outside/pacificheights) "ov" = ( /obj/effect/turf_decal/crosswalk{ dir = 8 }, /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) -"oJ" = ( -/turf/open/floor/plating/sidewalk/poor, +"oD" = ( +/turf/open/misc/grass, /area/vtm/outside/pacificheights) -"oK" = ( -/turf/open/misc/beach/vamp, -/area/shuttle/arrival) +"oF" = ( +/obj/structure/chair/wood/darkpack, +/turf/open/floor/plating/rough, +/area/vtm/interior/techshop) "oM" = ( /turf/open/floor/plating/sidewalk, /area/vtm/interior/supply) -"oU" = ( +"oV" = ( /obj/weapon_showcase, -/obj/structure/sign/flag/usa{ - pixel_y = 32 - }, -/turf/open/floor/plating/parquetry/old, +/obj/structure/sign/flag/usa/directional/north, +/turf/open/floor/wood/smooth/old, /area/vtm/interior/shop) "oW" = ( /turf/open/floor/plating/concrete, @@ -534,16 +724,14 @@ }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) -"pf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 +"pg" = ( +/obj/structure/vampfence/rich{ + dir = 4; + pixel_y = 15 }, -/turf/open/misc/dirt/vamp, -/area/vtm/outside/supply) -"pt" = ( -/mob/living/carbon/human/npc/shop, -/turf/open/floor/plating/toilet, -/area/vtm/interior/shop) +/obj/structure/platform/lowwall/brick_old, +/turf/open/floor/plating/rough, +/area/vtm/outside/pacificheights) "pz" = ( /obj/darkpack_car/rand{ locked = 0; @@ -551,6 +739,11 @@ }, /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) +"pD" = ( +/obj/machinery/light/directional/north, +/obj/structure/lattice/grate, +/turf/open/openspace, +/area/vtm/outside/pacificheights) "pG" = ( /obj/effect/landmark/npcbeacon, /obj/effect/turf_decal/bordur/corner{ @@ -558,38 +751,59 @@ }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) -"pH" = ( -/obj/effect/decal/cleanable/trash{ - icon_state = "trash7" - }, -/obj/effect/spawner/random/occult/artifact, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) "pN" = ( /turf/open/floor/plating/rough, /area/vtm/interior/clinic) +"pU" = ( +/obj/effect/landmark/npc_spawn_point, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/outside/ghetto) +"pV" = ( +/obj/effect/turf_decal/bordur, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/outside/ghetto) +"qc" = ( +/turf/open/floor/iron/smooth_large, +/area/vtm/outside/pacificheights) "qn" = ( /obj/effect/turf_decal/bordur{ dir = 8 }, /turf/open/floor/plating/sidewalk/rich, /area/vtm/outside/pacificheights) -"qr" = ( -/obj/structure/sign/city/police_department{ - dir = 8 - }, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) "qt" = ( /obj/machinery/computer/cargo/express{ dir = 4 }, /turf/open/floor/plating/sidewalk/poor, /area/vtm/outside/supply) +"qv" = ( +/obj/structure/vampdoor/simple/camarilla{ + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) "qz" = ( /obj/structure/lamppost/one, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) +"qC" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + transport_linked_id = "DebugElevator3"; + elevator_mode = 1 + }, +/turf/open/floor/iron/smooth_large, +/area/vtm/outside/pacificheights) +"qE" = ( +/obj/structure/transport/linear/public, +/obj/effect/landmark/transport/transport_id{ + specific_transport_id = "DebugElevator2" + }, +/obj/effect/abstract/elevator_music_zone{ + linked_elevator_id = "DebugElevator2" + }, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/outside/pacificheights) "qN" = ( /obj/structure/chair/comfy/shuttle, /turf/open/floor/plating/rough, @@ -599,16 +813,27 @@ /obj/machinery/light/directional/west, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) -"qT" = ( -/turf/open/misc/dirt/vamp, -/area/vtm/outside/supply) "qV" = ( /turf/closed/wall/vampwall/brick, /area/vtm/outside/pacificheights) -"ri" = ( +"qY" = ( /obj/structure/table/wood, -/turf/closed/wall/vampwall/painted/low, +/obj/item/vtm_artifact/bloodstar, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) +"ri" = ( +/obj/structure/table/countertop/purple, +/turf/open/floor/plating/concrete, /area/vtm/interior/shop) +"rs" = ( +/obj/machinery/fax/camarilla, +/obj/structure/table/wood, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) +"ru" = ( +/obj/effect/landmark/observer_start, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "rB" = ( /turf/closed/indestructible/the_matrix, /area/vtm) @@ -618,11 +843,6 @@ }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) -"rI" = ( -/obj/structure/table/wood, -/obj/item/vtm_artifact/saulocept, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) "rK" = ( /obj/item/storage/pill_bottle/ephedrine, /obj/item/storage/pill_bottle/ephedrine, @@ -643,24 +863,45 @@ }, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) +"rM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/misc/dirt, +/area/vtm/outside/supply) "rN" = ( /obj/structure/stairs/north, /turf/open/floor/plating/rough, /area/vtm/interior/techshop) +"rO" = ( +/obj/structure/table/wood, +/obj/item/seeds/cannabis, +/obj/item/seeds/cannabis, +/obj/item/seeds/cannabis, +/obj/item/seeds/cannabis, +/obj/item/seeds/cannabis, +/obj/item/seeds/cannabis, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) "rW" = ( /obj/effect/turf_decal/crosswalk, /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) -"sb" = ( -/turf/closed/wall/vampwall, -/area/vtm/outside/pacificheights) -"se" = ( -/turf/closed/wall/vampwall, -/area/vtm) "sg" = ( -/obj/structure/table/reinforced, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) +/obj/item/kirbyplants/darkpack/random{ + pixel_x = -9; + pixel_y = 3 + }, +/obj/item/kirbyplants/random{ + pixel_x = 7; + pixel_y = 13 + }, +/obj/effect/decal/carpet{ + pixel_x = -17; + pixel_y = -5 + }, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "sk" = ( /obj/effect/landmark/npcbeacon, /obj/effect/turf_decal/bordur/corner{ @@ -685,12 +926,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/plating/rough, /area/vtm/interior/techshop) -"sx" = ( -/obj/structure/table/wood, -/obj/item/vtm_artifact/tarulfang, -/mob/living/basic/pet/cat/darkpack/cain, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) "sy" = ( /mob/living/carbon/human/npc/shop, /obj/effect/decal/cleanable/trash{ @@ -698,12 +933,37 @@ }, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) -"sX" = ( -/obj/structure/sign/city/store/bubway{ - pixel_y = 40 +"sQ" = ( +/obj/machinery/hydroponics/simple/wooden, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) +"sR" = ( +/obj/effect/decal/pallet, +/turf/open/misc/dirt, +/area/vtm/outside/supply) +"sU" = ( +/obj/item/kirbyplants/darkpack/random{ + pixel_x = -7; + pixel_y = 19 + }, +/obj/item/kirbyplants/darkpack/random{ + pixel_x = 4; + pixel_y = 21 + }, +/obj/item/kirbyplants/darkpack/random{ + pixel_x = 13; + pixel_y = 18 }, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) +"sY" = ( +/obj/structure/table/countertop/black, +/turf/open/floor/plating/rough, +/area/vtm/interior/shop) +"sZ" = ( +/obj/structure/sink/directional/east, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) "tb" = ( /obj/effect/landmark/npcbeacon, /obj/effect/turf_decal/bordur, @@ -716,21 +976,9 @@ /obj/structure/lamppost/four, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) -"tj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/misc/dirt/vamp, -/area/vtm/outside/supply) "tr" = ( -/obj/structure/sign/city/police_department{ - dir = 1 - }, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) -"ts" = ( -/obj/machinery/fax/endron, -/turf/open/misc/beach/vamp, +/obj/structure/sign/flag/pride/lesbian/directional/north, +/turf/open/floor/plating/rough/cave, /area/vtm/outside/pacificheights) "tu" = ( /obj/darkpack_car/track/volkswagen{ @@ -750,13 +998,38 @@ /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) "tO" = ( -/obj/structure/sign/city/police_department, +/obj/effect/gibspawner/human, +/obj/structure/sign/city/store/gummaguts/directional/north, +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) +"tP" = ( +/mob/living/carbon/human/npc/shop, +/obj/effect/decal/carpet{ + pixel_x = 5; + pixel_y = -14 + }, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) "tW" = ( /obj/darkpack_car/police/ranger, /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) +"tY" = ( +/turf/open/floor/plating/canal, +/area/vtm/outside/pacificheights) +"ug" = ( +/obj/machinery/door/airlock/elevator/right{ + elevator_mode = 1; + transport_linked_id = "DebugElevator2" + }, +/turf/open/floor/iron/smooth_large, +/area/vtm/outside/pacificheights) +"ut" = ( +/obj/structure/chair/comfy/darkpack/green{ + dir = 1 + }, +/turf/open/floor/plating/rough, +/area/vtm/interior/techshop) "uC" = ( /obj/structure/table, /obj/item/ammo_box/magazine/glock45acp, @@ -766,11 +1039,11 @@ /obj/machinery/light/directional/west, /turf/open/floor/plating/rough, /area/vtm/interior/anarch) +"uD" = ( +/obj/fusebox/transformer, +/turf/open/floor/plating/rough, +/area/vtm/interior/clinic) "uJ" = ( -/obj/machinery/button/door{ - id = "debughouse"; - pixel_y = 30 - }, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, @@ -787,12 +1060,25 @@ /turf/open/floor/plating/sidewalk/rich, /area/vtm/outside/pacificheights) "uL" = ( -/obj/structure/table/bubway, +/obj/structure/table/countertop/bubway, /obj/underplate/stuff{ pixel_y = 8 }, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) +"uP" = ( +/obj/structure/sign/flag/pride/trans/directional/north, +/turf/open/floor/plating/rough/cave, +/area/vtm/outside/pacificheights) +"uX" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/plating/rough, +/area/vtm/interior/clinic) +"va" = ( +/obj/structure/table/wood, +/obj/item/vtm_artifact/fae_charm, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) "vl" = ( /obj/effect/turf_decal/bordur{ dir = 8 @@ -802,30 +1088,24 @@ }, /turf/open/floor/plating/sidewalk/rich, /area/vtm/outside/pacificheights) -"vm" = ( -/obj/structure/sign/city/store/bacotell{ - pixel_x = 1; - pixel_y = 40 - }, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) -"vn" = ( -/turf/open/floor/plating/woodrough, -/area/vtm/outside/pacificheights) "vs" = ( /obj/effect/landmark/npcbeacon, /obj/effect/turf_decal/bordur/corner, /turf/open/floor/plating/sidewalk/rich, /area/vtm/outside/pacificheights) -"vz" = ( -/obj/structure/vampdoor{ - dir = 4 - }, -/turf/open/floor/plating/vampcanal, -/area/vtm/outside/pacificheights) -"vJ" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/plating/vampcanal, +"vD" = ( +/mob/living/carbon/human/npc/shop, +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) +"vW" = ( +/obj/structure/table/wood, +/obj/item/soil_sack, +/obj/item/soil_sack/coir, +/obj/item/soil_sack/gel, +/obj/item/soil_sack/rich, +/obj/item/soil_sack/vermaculite, +/obj/item/soil_sack/worm, +/turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) "wb" = ( /obj/structure/table, @@ -834,31 +1114,44 @@ /obj/item/storage/medkit/darkpack/brute, /turf/open/floor/plating/rough, /area/vtm/interior/clinic) -"wm" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/plating/parquetry/old, -/area/vtm/interior/shop) -"wD" = ( -/obj/effect/landmark/start{ - jobspawn_override = 1; - delete_after_roundstart = 0 +"wj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/misc/beach/vamp, -/area/shuttle/arrival) +/turf/open/misc/dirt/rails, +/area/vtm/outside/supply) +"wr" = ( +/obj/structure/table/wood, +/obj/item/vtm_artifact/odious_chalice, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) "wO" = ( /obj/effect/decal/cleanable/trash, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) -"wW" = ( -/obj/effect/landmark/observer_start, -/turf/open/misc/beach/vamp, -/area/shuttle/arrival) +"xc" = ( +/obj/weapon_showcase, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) "xh" = ( /obj/effect/turf_decal/bordur{ dir = 1 }, /turf/closed/wall/vampwall/junk/alt, /area/vtm/outside/pacificheights) +"xj" = ( +/obj/machinery/button/elevator/directional/north{ + id = "DebugElevator2"; + pixel_x = 9; + pixel_y = 35 + }, +/obj/machinery/lift_indicator/directional/north{ + pixel_x = -5; + pixel_y = 20; + linked_elevator_id = "DebugElevator2" + }, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) "xC" = ( /obj/effect/decal/cleanable/litter, /turf/open/floor/plating/concrete, @@ -870,9 +1163,9 @@ /turf/open/floor/plating/rough, /area/vtm/interior/clinic) "xH" = ( -/obj/structure/table, /obj/lombard, -/turf/closed/wall/vampwall/brick/low, +/obj/structure/table/countertop/beige, +/turf/open/floor/plating/rough, /area/vtm/interior/shop) "xU" = ( /obj/structure/table, @@ -886,10 +1179,6 @@ /obj/machinery/light/floor, /turf/open/floor/plating/rough, /area/vtm/interior/techshop) -"yc" = ( -/obj/structure/roofstuff/vent/south, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) "yi" = ( /obj/machinery/light/directional/west, /turf/open/floor/plating/sidewalk, @@ -903,9 +1192,10 @@ /obj/item/storage/medkit/darkpack/doctor, /turf/open/floor/plating/rough, /area/vtm/interior/clinic) -"yt" = ( -/turf/open/floor/plating/parquetry/old, -/area/vtm/interior/shop) +"yw" = ( +/obj/machinery/sprinkler, +/turf/open/floor/plating/rough, +/area/vtm/interior/techshop) "yD" = ( /obj/structure/table, /obj/item/storage/medkit/darkpack/burn, @@ -913,19 +1203,30 @@ /obj/item/storage/medkit/darkpack/burn, /turf/open/floor/plating/rough, /area/vtm/interior/clinic) -"yE" = ( -/obj/effect/gibspawner/human, -/obj/machinery/light/directional/west, -/turf/open/floor/plating/toilet, -/area/vtm/interior/shop) "yK" = ( /obj/structure/vampdoor, /turf/open/floor/plating/rough/cave, /area/vtm/outside/pacificheights) -"zc" = ( -/obj/structure/vampdoor, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) +"yW" = ( +/obj/machinery/button/elevator/directional/north{ + id = "DebugElevator4"; + pixel_x = 9; + pixel_y = 35 + }, +/obj/machinery/lift_indicator/directional/north{ + pixel_x = -5; + pixel_y = 20; + linked_elevator_id = "DebugElevator4" + }, +/turf/open/misc/grass, +/area/vtm/outside/pacificheights) +"zd" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) +"ze" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/misc/dirt, +/area/vtm/outside/supply) "zk" = ( /obj/darkpack_car/track/ambulance{ dir = 4; @@ -939,45 +1240,50 @@ /turf/open/floor/plating/concrete, /area/vtm/interior/shop) "zx" = ( -/turf/closed/wall/vampwall/market/low/window, -/area/vtm/interior/shop) -"zT" = ( -/obj/structure/chair/greyscale, +/obj/structure/platform/lowwall/market/window, /turf/open/floor/plating/rough, -/area/vtm/interior/techshop) +/area/vtm/interior/shop) +"zA" = ( +/obj/effect/decal/cleanable/trash{ + icon_state = "trash5" + }, +/obj/effect/spawner/random/stray_animal, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) +"zF" = ( +/obj/structure/table/wood, +/obj/item/vtm_artifact/weekapaug_thistle, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) +"zM" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) "zX" = ( /obj/effect/decal/wallpaper/red, /turf/closed/wall/vampwall/market, /area/vtm/interior/shop) "Af" = ( -/obj/structure/table, /obj/structure/retail/junkfood_menu, -/turf/closed/wall/vampwall/brick/low, +/obj/structure/table/countertop/teal, +/turf/open/floor/plating/concrete, /area/vtm/interior/shop) +"Ag" = ( +/obj/effect/decal/cleanable/litter, +/obj/effect/spawner/random/stray_animal, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "Ak" = ( /obj/effect/turf_decal/crosswalk{ dir = 1 }, /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) -"Ao" = ( -/obj/structure/vampdoor{ - dir = 8 - }, -/turf/open/floor/plating/rough, -/area/vtm/interior/techshop) -"AC" = ( -/obj/machinery/fax/admin/glasswalker, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) "AE" = ( /obj/structure/bookcase/random/adult, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) -"AT" = ( -/obj/machinery/fax/admin/anarch, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) "AU" = ( /obj/effect/turf_decal/bordur{ dir = 4 @@ -987,12 +1293,10 @@ }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) -"AX" = ( -/obj/structure/table/wood, -/obj/item/vtm_artifact/weekapaug_thistle, -/obj/machinery/light/directional/north, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) +"Be" = ( +/obj/structure/vampdoor/simple/supply, +/turf/open/floor/plating/sidewalk, +/area/vtm/interior/supply) "Bf" = ( /obj/effect/decal/cleanable/garbage, /obj/effect/decal/cleanable/trash{ @@ -1000,20 +1304,38 @@ }, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) +"Bp" = ( +/obj/structure/vampdoor, +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) "Bq" = ( /obj/effect/turf_decal/bordur, /obj/structure/lamppost/one, /turf/open/floor/plating/sidewalk/poor, /area/vtm/outside/pacificheights) +"Bs" = ( +/obj/structure/transport/linear/public, +/obj/effect/landmark/transport/transport_id{ + specific_transport_id = "DebugElevator" + }, +/obj/effect/abstract/elevator_music_zone{ + linked_elevator_id = "DebugElevator" + }, +/obj/machinery/light/floor, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/outside/pacificheights) "Bt" = ( /obj/structure/barrels/rand, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) -"BH" = ( -/obj/structure/table/wood, -/obj/item/vtm_artifact/key_of_alamut, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) +"Bw" = ( +/obj/structure/transport/linear/public, +/obj/machinery/elevator_control_panel/directional/north{ + linked_elevator_id = "DebugElevator3"; + preset_destination_names = list("2" = "Lower", "3" = "Upper") + }, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/outside/pacificheights) "BL" = ( /mob/living/carbon/human/npc/shop, /turf/open/floor/plating/concrete, @@ -1024,26 +1346,32 @@ /area/vtm/interior/techshop) "BX" = ( /obj/structure/table, -/turf/closed/wall/vampwall/market/low, +/obj/structure/platform/lowwall/market, +/turf/open/floor/plating/rough, /area/vtm/interior/shop) +"BZ" = ( +/obj/structure/railing, +/turf/open/floor/plating/canal, +/area/vtm/outside/pacificheights) "Ca" = ( /obj/structure/table, /obj/item/gun/ballistic/automatic/darkpack/sniper, /turf/open/floor/plating/rough, /area/vtm/interior/anarch) -"Cd" = ( -/mob/living/carbon/human/npc/shop, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) "Cg" = ( -/obj/structure/table/wood, /obj/structure/retail/library, -/turf/closed/wall/vampwall/painted/low, -/area/vtm/interior/shop) -"Cr" = ( -/obj/structure/vampdoor/glass/police_chief, -/turf/open/floor/plating/toilet, +/obj/structure/table/countertop/red, +/turf/open/floor/plating/concrete, /area/vtm/interior/shop) +"Cj" = ( +/obj/structure/railing, +/obj/structure/ladder/manhole/up{ + connect_down = 1; + connect_up = 0 + }, +/obj/structure/lattice/grate, +/turf/open/openspace, +/area/vtm/outside/pacificheights) "Ct" = ( /obj/structure/lamppost/one{ dir = 1 @@ -1059,10 +1387,10 @@ }, /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) -"Db" = ( -/obj/machinery/light/directional/west, -/turf/open/misc/dirt/vamp, -/area/vtm/outside/supply) +"CB" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/plating/rough, +/area/vtm/interior/techshop) "Df" = ( /obj/structure/closet/crate/freezer/blood{ name = "vampire blood freezer" @@ -1096,44 +1424,67 @@ }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) +"Ds" = ( +/obj/machinery/fax/anarch, +/obj/structure/table/wood, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "Dw" = ( /obj/machinery/stove, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) -"DF" = ( -/obj/structure/sign/city/store/gummaguts{ - pixel_x = 16; - pixel_y = 38 +"Dx" = ( +/obj/machinery/button/elevator/directional/north{ + id = "DebugElevator3"; + pixel_y = 35; + pixel_x = 9 }, -/obj/structure/closet/secure_closet/freezer, -/turf/open/floor/plating/toilet, -/area/vtm/interior/shop) +/obj/machinery/lift_indicator/directional/north{ + pixel_x = -5; + pixel_y = 20; + linked_elevator_id = "DebugElevator3" + }, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) "DG" = ( /obj/structure/retail/gas_station, -/obj/structure/table, -/turf/closed/wall/vampwall/brick/low, +/obj/structure/table/countertop/yellow, +/turf/open/floor/plating/concrete, /area/vtm/interior/shop) "DJ" = ( /obj/item/vamp/keys/anarch, /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) -"DM" = ( -/turf/open/misc/dirt/vamp/rails, -/area/vtm/outside/supply) "DN" = ( /obj/structure/rack/clothing/rand{ dir = 8 }, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) +"DT" = ( +/obj/machinery/fax/endron, +/obj/structure/table/wood, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "DV" = ( /obj/structure/closet/secure_closet/freezer/meat, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) +"DW" = ( +/obj/structure/roofstuff/vent/south, +/turf/open/misc/grass, +/area/vtm/outside/pacificheights) "DY" = ( /obj/structure/lamppost/one, /turf/open/floor/plating/sidewalk/rich, /area/vtm/outside/pacificheights) +"Ef" = ( +/turf/closed/wall/vampwall/rich/old, +/area/vtm/interior/sewer) +"Em" = ( +/obj/structure/cargo_put, +/turf/open/misc/dirt, +/area/vtm/outside/supply) "Et" = ( /obj/structure/table/optable, /obj/machinery/defibrillator_mount/loaded{ @@ -1147,33 +1498,24 @@ }, /turf/open/floor/plating/rough, /area/vtm/interior/techshop) -"EF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 +"Ew" = ( +/obj/structure/vampdoor{ + dir = 4 }, -/turf/open/misc/dirt/vamp, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"EE" = ( +/obj/machinery/light/directional/west, +/turf/open/misc/dirt, /area/vtm/outside/supply) "EL" = ( -/turf/closed/wall/vampwall/rich/old/low/window, +/obj/structure/platform/lowwall/rich/old/window, +/turf/open/floor/plating/rough, /area/vtm/interior/clinic) "EN" = ( /obj/effect/landmark/error, /turf/open/floor/plating/rough/cave, /area/vtm/outside/pacificheights) -"ES" = ( -/obj/structure/roofstuff/vent, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) -"ET" = ( -/obj/structure/vampdoor/camarilla{ - dir = 4 - }, -/turf/open/floor/plating/concrete, -/area/vtm/interior/shop) -"EX" = ( -/obj/machinery/fax/glasswalker, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) "EY" = ( /turf/closed/wall/vampwall/rich, /area/vtm/outside/pacificheights) @@ -1203,10 +1545,6 @@ /obj/machinery/vending/boozeomat, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) -"FD" = ( -/obj/machinery/fax/admin/police, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) "FG" = ( /obj/effect/decal/cleanable/cardboard, /obj/effect/decal/graffiti/large, @@ -1220,10 +1558,22 @@ }, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) +"FM" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/plating/rough, +/area/vtm/interior/anarch) "FO" = ( /obj/structure/table, /turf/open/floor/plating/sidewalk/poor, /area/vtm/outside/supply) +"FT" = ( +/obj/cargocrate, +/turf/open/misc/dirt/rails, +/area/vtm/outside/supply) +"Gj" = ( +/obj/effect/gibspawner/human, +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) "Gm" = ( /obj/structure/vampdoor/prison, /turf/open/floor/plating/rough, @@ -1236,31 +1586,20 @@ /turf/open/floor/plating/rough, /area/vtm/interior/clinic) "Gu" = ( -/turf/closed/wall/vampwall/brick/low/window, +/obj/structure/platform/lowwall/brick/window, +/turf/open/floor/plating/rough, /area/vtm/interior/shop) "Gw" = ( /obj/machinery/light/directional/west, /turf/open/floor/plating/rough/cave, /area/vtm/outside/pacificheights) -"Gz" = ( -/mob/living/carbon/human/npc/shop, -/turf/open/floor/plating/parquetry/old, -/area/vtm/interior/shop) -"GB" = ( -/obj/structure/barrels/rand, -/turf/open/misc/dirt/vamp, -/area/vtm/outside/supply) -"GE" = ( -/obj/structure/retail/flower_shop, -/obj/structure/table/wood, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) "GF" = ( /turf/cordon, /area/misc/cordon) "GH" = ( /obj/structure/table/reinforced, -/turf/closed/wall/vampwall/brick/low, +/obj/structure/platform/lowwall/brick, +/turf/open/floor/plating/rough, /area/vtm/interior/shop) "GJ" = ( /turf/cordon, @@ -1282,6 +1621,9 @@ }, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) +"GN" = ( +/turf/closed/wall/vampwall/rich/old, +/area/vtm/outside/ghetto) "GO" = ( /obj/structure/table, /obj/machinery/button/door{ @@ -1290,10 +1632,6 @@ }, /turf/open/floor/plating/rough, /area/vtm/interior/techshop) -"GS" = ( -/obj/structure/vampdoor/police, -/turf/open/floor/plating/concrete, -/area/vtm/interior/shop) "GX" = ( /obj/structure/barrels/rand, /obj/machinery/light/directional/north, @@ -1305,6 +1643,13 @@ }, /turf/open/floor/plating/sidewalk/rich, /area/vtm/outside/pacificheights) +"Hc" = ( +/obj/item/kirbyplants/darkpack/random{ + pixel_x = 3; + pixel_y = 16 + }, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "Hd" = ( /obj/effect/landmark/npcwall, /turf/open/floor/plating/sidewalk, @@ -1321,6 +1666,13 @@ }, /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) +"Hj" = ( +/obj/structure/railing/corner/end{ + dir = 4 + }, +/obj/structure/transport/linear/public, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/outside/pacificheights) "Hn" = ( /obj/effect/turf_decal/bordur{ dir = 4 @@ -1341,6 +1693,10 @@ }, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) +"HE" = ( +/obj/structure/city_map, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "HJ" = ( /obj/effect/turf_decal/stock, /turf/open/floor/plating/asphalt, @@ -1352,6 +1708,10 @@ }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) +"HQ" = ( +/obj/effect/landmark/npcbeacon, +/turf/open/floor/plating/asphalt, +/area/vtm/outside/pacificheights) "Id" = ( /turf/open/floor/plating/rough, /area/vtm/interior/techshop) @@ -1367,19 +1727,17 @@ /turf/open/floor/plating/sidewalk/poor, /area/vtm/outside/pacificheights) "Ip" = ( -/obj/structure/table, /obj/structure/retail/black_market, -/turf/closed/wall/vampwall/brick/low, +/obj/structure/table/countertop/black, +/turf/open/floor/plating/rough, /area/vtm/interior/shop) -"Is" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/supplypod_beacon{ - anchored = 1 +"IA" = ( +/obj/structure/railing{ + dir = 10 }, -/turf/open/misc/dirt/vamp/rails, -/area/vtm/outside/supply) +/obj/structure/transport/linear/public, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/outside/pacificheights) "ID" = ( /turf/closed/wall/vampwall/market, /area/vtm/outside/pacificheights) @@ -1387,16 +1745,31 @@ /obj/structure/ladder/manhole/up, /turf/open/floor/plating/rough, /area/vtm/interior/techshop) -"IO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"IZ" = ( +/obj/machinery/fax/aasimites, +/obj/structure/table/wood, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) +"Jf" = ( +/obj/machinery/door/airlock/elevator/left{ + dir = 8; + pixel_y = 15; + transport_linked_id = "DebugElevator4" }, -/turf/open/misc/dirt/vamp/rails, -/area/vtm/outside/supply) -"IX" = ( -/obj/machinery/fax/admin/aasimites, +/turf/open/floor/iron/smooth_large, +/area/vtm/outside/pacificheights) +"Jh" = ( +/obj/structure/extinguisher_cabinet/directional/west, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) +"Jk" = ( +/obj/structure/vampfence/rich{ + dir = 4; + pixel_y = 15 + }, +/obj/structure/platform/lowwall/rich/old, +/turf/open/floor/plating/rough, +/area/vtm/outside/pacificheights) "Jo" = ( /obj/structure/closet/crate/freezer/blood, /obj/item/reagent_containers/blood, @@ -1407,14 +1780,19 @@ /obj/item/reagent_containers/blood, /turf/open/floor/plating/rough, /area/vtm/interior/clinic) -"Jv" = ( -/obj/effect/spawner/random/occult/artifact, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) -"JE" = ( -/obj/machinery/fax/tremere, -/turf/open/misc/beach/vamp, +"Jq" = ( +/obj/structure/sign/flag/pride/directional/north, +/turf/open/floor/plating/rough/cave, /area/vtm/outside/pacificheights) +"Ju" = ( +/obj/effect/gibspawner/human, +/obj/machinery/light/directional/west, +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) +"JB" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) "JG" = ( /obj/structure/table, /obj/item/ammo_box/magazine/glock9mm, @@ -1430,16 +1808,24 @@ /obj/structure/vampdoor, /turf/open/floor/plating/rough, /area/vtm/interior/anarch) -"JK" = ( -/obj/structure/vampdoor{ - dir = 8 - }, -/turf/open/floor/plating/rough, -/area/vtm/interior/clinic) "JP" = ( /obj/effect/decal/cleanable/garbage, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) +"JR" = ( +/obj/effect/decal/cleanable/cardboard, +/obj/effect/spawner/random/trash/rat, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) +"JZ" = ( +/obj/item/clothing/head/collectable/pirate, +/turf/open/floor/wood/rough, +/area/vtm/outside/pacificheights) +"Kc" = ( +/obj/effect/turf_decal/bordur, +/obj/effect/landmark/npc_spawn_point, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) "Kg" = ( /obj/effect/turf_decal/bordur, /obj/effect/turf_decal/bordur{ @@ -1447,46 +1833,81 @@ }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) -"Kj" = ( -/obj/structure/sign/city/police_department{ - dir = 4 - }, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) +"Kk" = ( +/turf/closed/wall/vampwall/brick_old, +/area/vtm/outside/ghetto) "Ko" = ( /obj/effect/landmark/npcbeacon/directed{ dir = 8 }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) +"Kr" = ( +/obj/structure/table, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/outside/supply) "Kt" = ( -/obj/structure/table/wood, /obj/structure/retail/pharmacy, -/turf/closed/wall/vampwall/painted/low, +/obj/structure/table/countertop/purple, +/turf/open/floor/plating/concrete, /area/vtm/interior/shop) +"Kz" = ( +/obj/structure/table/wood, +/obj/item/vtm_artifact/heart_of_eliza, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) "KB" = ( /obj/structure/table, /obj/item/ammo_box/magazine/darkpack545, /obj/item/ammo_box/magazine/darkpack545, /obj/item/ammo_box/magazine/darkpack545, /obj/item/gun/ballistic/automatic/darkpack/ak74, +/obj/fusebox, /turf/open/floor/plating/rough, /area/vtm/interior/anarch) +"KF" = ( +/mob/living/carbon/human/npc/shop, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) +"KR" = ( +/obj/structure/transport/linear/public, +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/outside/pacificheights) "KU" = ( /obj/effect/turf_decal/bordur{ dir = 1 }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) -"Lk" = ( -/obj/effect/decal/cleanable/trash{ - icon_state = "trash7" - }, -/turf/open/misc/beach/vamp, -/area/vtm/outside/pacificheights) -"Ln" = ( -/turf/open/floor/light, +"KW" = ( +/obj/structure/table/countertop/yellow, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"La" = ( +/obj/structure/chair/darkpack/blue, +/turf/open/floor/plating/rough, +/area/vtm/interior/techshop) +"Lb" = ( +/turf/open/misc/dirt/rails, +/area/vtm/outside/supply) +"Le" = ( +/obj/structure/transport/linear/public, +/obj/structure/closet/crate/freezer/food, +/obj/item/storage/cans/sixbeer, +/turf/open/floor/plating/elevatorshaft, /area/vtm/outside/pacificheights) +"Lj" = ( +/obj/structure/roadblock{ + dir = 4 + }, +/turf/open/misc/dirt, +/area/vtm/outside/supply) "Lw" = ( /obj/structure/table, /obj/item/gas_can, @@ -1504,10 +1925,19 @@ }, /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) -"LR" = ( -/obj/structure/cargo_put, -/turf/open/misc/dirt/vamp, -/area/vtm/outside/supply) +"LG" = ( +/obj/structure/table/wood, +/obj/item/vtm_artifact/daimonori, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) +"LP" = ( +/obj/structure/vampdoor/simple/police, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"LU" = ( +/obj/structure/platform/lowwall/rich/old/window, +/turf/open/floor/plating/rough, +/area/vtm/outside/ghetto) "LW" = ( /obj/structure/table, /obj/item/restraints/handcuffs, @@ -1520,11 +1950,35 @@ }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) -"Mv" = ( -/obj/structure/table/wood, -/obj/item/vtm_artifact/heart_of_eliza, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) +"LY" = ( +/obj/machinery/fax/admin/glasswalker, +/obj/structure/table/wood, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) +"Mf" = ( +/obj/structure/vampdoor{ + dir = 4 + }, +/turf/open/floor/plating/rough, +/area/vtm/interior/techshop) +"Mg" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/bordur{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/outside/ghetto) +"Mm" = ( +/obj/structure/ladder/manhole/down, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating/canal, +/area/vtm/outside/pacificheights) +"Mn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/misc/dirt, +/area/vtm/outside/supply) "My" = ( /obj/structure/retail/costume_store{ pixel_x = 2; @@ -1534,14 +1988,24 @@ /obj/structure/retail/hot_ishu{ pixel_y = 10 }, -/turf/closed/wall/vampwall/brick/low, +/obj/structure/platform/lowwall/brick, +/turf/open/floor/plating/rough, /area/vtm/interior/shop) -"MH" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/bordur{ - dir = 4 +"Mz" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/rollingpapers{ + pixel_x = -6 }, -/turf/open/floor/plating/sidewalk/poor, +/obj/item/storage/box/matches{ + pixel_x = 6; + pixel_y = 10 + }, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) +"MF" = ( +/obj/structure/table/wood, +/obj/machinery/radio_tranceiver/camarilla, +/turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) "MJ" = ( /obj/structure/table, @@ -1551,29 +2015,60 @@ "MS" = ( /turf/closed/wall/vampwall/rich/old, /area/vtm/outside/pacificheights) +"Nb" = ( +/obj/structure/table/wood, +/obj/item/vtm_artifact/tarulfang, +/mob/living/basic/pet/cat/darkpack/cain, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) "Nd" = ( /obj/structure/table/wood, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) -"Nu" = ( -/obj/structure/roofstuff/vent_end{ - dir = 8 +"Ne" = ( +/obj/structure/railing{ + dir = 9 }, -/turf/open/misc/beach/vamp, +/obj/structure/transport/linear/public, +/obj/item/kirbyplants/random, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/outside/pacificheights) +"Nm" = ( +/obj/machinery/button/elevator/directional/north{ + id = "DebugElevator"; + pixel_y = 35; + pixel_x = 9 + }, +/obj/machinery/lift_indicator/directional/north{ + pixel_x = -5; + pixel_y = 20; + linked_elevator_id = "DebugElevator" + }, +/turf/open/misc/grass, /area/vtm/outside/pacificheights) "Nw" = ( /obj/machinery/light/directional/north, /turf/open/floor/plating/rough, /area/vtm/interior/shop) -"Nx" = ( -/obj/structure/railing, -/turf/open/floor/plating/vampcanal, -/area/vtm/outside/pacificheights) +"Ny" = ( +/turf/closed/wall/vampwall/brick_old, +/area/vtm) +"Nz" = ( +/obj/structure/chair/darkpack/red, +/turf/open/floor/plating/rough, +/area/vtm/interior/techshop) "NI" = ( -/obj/structure/table/bacotell, /obj/structure/retail/bacotell_menu, +/obj/structure/table/countertop/bacotell, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) +"NK" = ( +/obj/machinery/smartfridge/drying/rack, +/obj/item/food/grown/cannabis, +/obj/item/food/grown/cannabis, +/obj/item/food/grown/cannabis, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) "NO" = ( /obj/structure/table/wood/fancy/red, /obj/item/storage/bag/books, @@ -1583,9 +2078,24 @@ /obj/structure/table, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) +"NQ" = ( +/obj/structure/vampdoor{ + dir = 4 + }, +/turf/open/floor/plating/rough, +/area/vtm/interior/clinic) "NR" = ( /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) +"NX" = ( +/obj/effect/decal/pallet, +/obj/machinery/light/directional/west, +/turf/open/misc/dirt, +/area/vtm/outside/supply) +"Ob" = ( +/obj/structure/chair/darkpack, +/turf/open/floor/plating/rough, +/area/vtm/interior/techshop) "Od" = ( /obj/structure/closet/crate/freezer/blood{ name = "blue blood freezer" @@ -1598,15 +2108,17 @@ /obj/item/reagent_containers/blood/vitae, /turf/open/floor/plating/rough, /area/vtm/interior/clinic) -"Of" = ( -/obj/structure/table, -/obj/item/gun/ballistic/shotgun/toy/crossbow/vampire, -/turf/open/floor/plating/rough, -/area/vtm/interior/anarch) +"Oi" = ( +/turf/open/misc/grass/random, +/area/vtm/outside/pacificheights) "On" = ( /mob/living/carbon/human/npc/shop, /turf/open/floor/plating/rough, /area/vtm/interior/shop) +"Oq" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "OB" = ( /obj/darkpack_car/police{ locked = 0 @@ -1643,6 +2155,14 @@ }, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) +"OP" = ( +/obj/structure/vampdoor, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) +"OQ" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/plating/canal, +/area/vtm/outside/pacificheights) "OU" = ( /obj/effect/spawner/random/trash/grime{ spawn_loot_count = 20; @@ -1650,9 +2170,23 @@ }, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) -"OX" = ( -/obj/machinery/fax/admin/endron, -/turf/open/misc/beach/vamp, +"OV" = ( +/obj/structure/table/wood, +/obj/item/food/grown/cannabis, +/obj/item/food/grown/cannabis, +/obj/item/food/grown/cannabis, +/obj/item/food/grown/cannabis, +/obj/item/food/grown/cannabis, +/obj/item/food/grown/cannabis, +/obj/item/bong{ + pixel_y = 10; + pixel_x = 10 + }, +/obj/item/bong{ + pixel_y = 2; + pixel_x = 10 + }, +/turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) "OZ" = ( /obj/structure/table, @@ -1662,20 +2196,20 @@ /obj/item/gun/ballistic/automatic/darkpack/aug, /turf/open/floor/plating/rough, /area/vtm/interior/anarch) +"Pa" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) "Pg" = ( /obj/structure/retail/gun_store, /obj/structure/table, -/turf/closed/wall/vampwall/market/low, +/obj/structure/platform/lowwall/market, +/turf/open/floor/plating/rough, /area/vtm/interior/shop) -"Po" = ( -/obj/item/paper_bin, -/obj/item/pen/fourcolor, -/turf/open/misc/beach/vamp, +"Pr" = ( +/obj/structure/roofstuff/vent_end, +/turf/open/misc/grass, /area/vtm/outside/pacificheights) -"Ps" = ( -/obj/structure/table/wood, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) "Pu" = ( /obj/machinery/computer/operating, /turf/open/floor/plating/rough, @@ -1684,27 +2218,73 @@ /obj/machinery/light/directional/east, /turf/open/floor/plating/rough/cave, /area/vtm/outside/pacificheights) +"Pz" = ( +/obj/structure/transport/linear/public, +/obj/machinery/elevator_control_panel/directional/north{ + linked_elevator_id = "DebugElevator4"; + preset_destination_names = list("2" = "Lower", "3" = "Upper") + }, +/obj/effect/landmark/transport/transport_id{ + specific_transport_id = "DebugElevator4" + }, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/outside/pacificheights) +"PC" = ( +/obj/structure/roofstuff/vent, +/turf/open/misc/grass, +/area/vtm/outside/pacificheights) +"PL" = ( +/obj/effect/landmark/latejoin, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "PO" = ( /turf/open/floor/plating/rough, /area/vtm/interior/anarch) +"PP" = ( +/obj/structure/table, +/obj/lombard/blackmarket, +/obj/structure/platform/lowwall/rich/old, +/turf/open/floor/plating/rough, +/area/vtm/outside/pacificheights) +"PR" = ( +/obj/structure/vampdoor{ + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) "PW" = ( /obj/effect/turf_decal/bordur/corner, /turf/open/floor/plating/sidewalk/rich, /area/vtm/outside/pacificheights) -"PX" = ( -/obj/structure/table/reinforced, -/obj/item/arcane_tome, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) +"Qe" = ( +/obj/effect/spawner/random/stray_animal, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "Qi" = ( /obj/effect/turf_decal/asphaltline/alt, /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) +"Ql" = ( +/obj/item/kirbyplants/darkpack/random{ + pixel_x = -6; + pixel_y = 9 + }, +/obj/item/kirbyplants/darkpack/random{ + pixel_x = -2; + pixel_y = -6 + }, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "Qv" = ( /obj/structure/retail/smoke_menu, -/obj/structure/table, -/turf/closed/wall/vampwall/brick/low, +/obj/structure/table/countertop/teal, +/turf/open/floor/plating/concrete, /area/vtm/interior/shop) +"QD" = ( +/obj/machinery/light/directional/north, +/obj/effect/decal/cleanable/trash, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) "QK" = ( /obj/effect/turf_decal/bordur, /obj/effect/turf_decal/bordur{ @@ -1712,11 +2292,21 @@ }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) -"QM" = ( -/obj/effect/turf_decal/bordur{ - dir = 4 +"QN" = ( +/obj/effect/decal/cleanable/litter, +/obj/effect/spawner/random/occult/artifact, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) +"QR" = ( +/obj/machinery/elevator_control_panel/directional/north{ + linked_elevator_id = "DebugElevator"; + preset_destination_names = list("2" = "Lower", "3" = "Upper") + }, +/obj/structure/railing/corner/end{ + dir = 8 }, -/turf/open/floor/plating/sidewalk/poor, +/obj/structure/transport/linear/public, +/turf/open/floor/plating/elevatorshaft, /area/vtm/outside/pacificheights) "QS" = ( /obj/effect/turf_decal/bordur{ @@ -1729,14 +2319,20 @@ /obj/effect/spawner/random/vending/snackvend, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) -"Rb" = ( -/obj/machinery/fax/police, +"QZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/supplypod_beacon{ + anchored = 1 + }, +/turf/open/misc/dirt/rails, +/area/vtm/outside/supply) +"Rg" = ( +/obj/structure/table/wood, +/obj/structure/retail/flower_shop, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) -"Re" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/misc/dirt/vamp, -/area/vtm/outside/supply) "Ri" = ( /obj/structure/table, /obj/item/surgery_tray/full, @@ -1745,10 +2341,16 @@ "Rj" = ( /turf/open/genturf, /area/vtm/planetgeneration) +"Rn" = ( +/obj/structure/table/wood, +/obj/machinery/radio_tranceiver/clinic, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "Ro" = ( /obj/structure/table, /obj/structure/retail/gummaguts_menu, -/turf/closed/wall/vampwall/market/low, +/obj/structure/platform/lowwall/market, +/turf/open/floor/plating/rough, /area/vtm/interior/shop) "Rx" = ( /obj/effect/landmark/npcbeacon, @@ -1757,12 +2359,17 @@ }, /turf/open/floor/plating/sidewalk/rich, /area/vtm/outside/pacificheights) -"Sg" = ( -/obj/structure/chair/office{ - dir = 8 +"RP" = ( +/obj/effect/decal/cleanable/trash{ + icon_state = "trash7" }, -/turf/open/floor/plating/rough, -/area/vtm/interior/techshop) +/obj/effect/spawner/random/occult/artifact, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) +"Sj" = ( +/obj/effect/landmark/latejoin_masquerade, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "Sp" = ( /obj/structure/table, /obj/item/stack/medical/bone_gel, @@ -1774,23 +2381,39 @@ /obj/structure/barrels/rand, /turf/open/floor/plating/sidewalk/poor, /area/vtm/outside/pacificheights) -"Sw" = ( -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/trash, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) -"SF" = ( -/obj/structure/table/wood, -/obj/item/vtm_artifact/bloodstar, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) "SG" = ( /obj/effect/decal/cleanable/blood/splatter, /turf/open/floor/plating/rough, /area/vtm/interior/clinic) +"SJ" = ( +/obj/effect/turf_decal/bordur{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/outside/ghetto) "SK" = ( /turf/closed/wall/vampwall/rich/old, /area/vtm/interior/clinic) +"SL" = ( +/turf/open/floor/wood/rough, +/area/vtm/outside/pacificheights) +"SM" = ( +/obj/structure/vampdoor{ + dir = 4 + }, +/turf/open/floor/plating/canal, +/area/vtm/outside/pacificheights) +"SP" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/city_map, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) +"SW" = ( +/obj/machinery/telecomms/allinone/public, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "SY" = ( /obj/structure/table, /obj/vampire_computer/prince, @@ -1800,17 +2423,34 @@ /obj/machinery/iv_drip, /turf/open/floor/plating/rough, /area/vtm/interior/clinic) +"Ti" = ( +/obj/structure/transport/linear/public, +/obj/effect/landmark/transport/transport_id{ + specific_transport_id = "DebugElevator3" + }, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/outside/pacificheights) +"Tk" = ( +/obj/structure/table/wood, +/obj/machinery/radio_tranceiver/endron, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) +"Tm" = ( +/obj/structure/chair/comfy/darkpack/blue{ + dir = 1 + }, +/turf/open/floor/plating/rough, +/area/vtm/interior/techshop) "Tp" = ( /obj/effect/landmark/npcbeacon, /obj/effect/turf_decal/bordur/corner, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) -"Tq" = ( -/obj/effect/gibspawner/human, -/turf/open/floor/plating/toilet, -/area/vtm/interior/shop) -"Tw" = ( -/obj/machinery/fax/anarch, +"Ty" = ( +/obj/item/kirbyplants/darkpack/random{ + pixel_x = -3; + pixel_y = 9 + }, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) "TL" = ( @@ -1821,10 +2461,11 @@ /obj/item/gun/ballistic/automatic/pistol/darkpack/deagle, /turf/open/floor/plating/rough, /area/vtm/interior/anarch) -"TO" = ( -/obj/machinery/recycler/deathtrap, -/turf/open/floor/plating/toilet, -/area/vtm/interior/shop) +"TU" = ( +/obj/machinery/smartfridge/drying/rack, +/obj/machinery/light/directional/north, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) "TY" = ( /obj/structure/rack/food{ dir = 4; @@ -1832,14 +2473,17 @@ }, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) -"Uc" = ( +"Uq" = ( +/obj/machinery/fax/admin/anarch, /obj/structure/table/wood, -/obj/item/vtm_artifact/daimonori, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) -"Ul" = ( -/turf/closed/wall/vampwall/rich/old, -/area/vtm/sewer) +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) +"Ut" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/misc/dirt, +/area/vtm/outside/supply) "Uu" = ( /obj/structure/table, /obj/item/ammo_box/magazine/darkpack9mp5, @@ -1848,57 +2492,39 @@ /obj/item/gun/ballistic/automatic/darkpack/mp5, /turf/open/floor/plating/rough, /area/vtm/interior/anarch) -"Uw" = ( -/obj/structure/table, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/obj/item/stack/dollar/hundred, -/turf/open/floor/plating/sidewalk/poor, -/area/vtm/outside/supply) -"UG" = ( +"UC" = ( +/obj/item/paper_bin, +/obj/item/pen/fourcolor, /obj/structure/table/wood, -/obj/structure/retail/hardware_store, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) +"UH" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/transport/linear/public, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/outside/pacificheights) "UJ" = ( /obj/structure/closet/crate/dumpster, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) -"UK" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/plating/parquetry/old, -/area/vtm/interior/shop) -"UQ" = ( -/obj/structure/vampdoor/wood/old/salubri{ +"UL" = ( +/obj/structure/railing/corner/end/flip{ dir = 4 }, -/turf/open/floor/plating/parquetry/old, -/area/vtm/interior/shop) +/obj/structure/transport/linear/public, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/outside/pacificheights) +"UN" = ( +/obj/structure/closet/crate/wooden/communitygardens/tools, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) "Va" = ( /obj/machinery/computer/order_console/mining/restricted/hospital, /obj/structure/table/reinforced, -/turf/closed/wall/vampwall/brick/low, +/obj/structure/platform/lowwall/brick, +/turf/open/floor/plating/rough, /area/vtm/interior/shop) "Vg" = ( /obj/structure/table, @@ -1913,12 +2539,18 @@ }, /turf/open/floor/plating/sidewalk/rich, /area/vtm/outside/pacificheights) +"Vr" = ( +/obj/machinery/fax/tremere, +/obj/structure/table/wood, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) "Vu" = ( /obj/structure/closet/cardboard, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) "Vv" = ( /obj/machinery/griddle, +/obj/structure/sign/city/store/bubway/directional/north, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) "VD" = ( @@ -1928,6 +2560,11 @@ /obj/item/vamp/keys/nps, /turf/open/floor/plating/sidewalk/poor, /area/vtm/outside/pacificheights) +"VH" = ( +/obj/structure/table/wood, +/obj/item/vtm_artifact/galdjum, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) "VJ" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ @@ -1937,10 +2574,19 @@ }, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) -"VK" = ( -/obj/structure/cargo_take, -/turf/open/misc/dirt/vamp, -/area/vtm/outside/supply) +"VL" = ( +/obj/machinery/button/elevator/directional/north{ + id = "DebugElevator"; + pixel_y = 35; + pixel_x = 9 + }, +/obj/machinery/lift_indicator/directional/north{ + pixel_x = -5; + pixel_y = 20; + linked_elevator_id = "DebugElevator" + }, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) "VP" = ( /obj/machinery/light/directional/north, /turf/open/floor/plating/concrete, @@ -1951,6 +2597,9 @@ }, /turf/open/floor/plating/asphalt, /area/vtm/outside/pacificheights) +"Wa" = ( +/turf/open/misc/dirt, +/area/vtm/outside/supply) "We" = ( /obj/effect/turf_decal/bordur{ dir = 4 @@ -1966,26 +2615,33 @@ /obj/machinery/light/directional/west, /turf/open/floor/plating/rough, /area/vtm/interior/anarch) -"Wn" = ( -/obj/structure/roadblock{ - dir = 4 - }, -/turf/open/misc/dirt/vamp, -/area/vtm/outside/supply) "Ws" = ( /obj/structure/table, /obj/vampire_computer, /turf/open/floor/plating/rough, /area/vtm/interior/techshop) "Wy" = ( -/obj/structure/table, /obj/structure/retail/grocery_store, -/turf/closed/wall/vampwall/brick/low, +/obj/structure/table/countertop/green, +/turf/open/floor/plating/concrete, /area/vtm/interior/shop) "Wz" = ( /obj/structure/sink/directional/east, /turf/open/floor/plating/rough, /area/vtm/interior/clinic) +"WB" = ( +/obj/structure/table/wood, +/obj/item/vtm_artifact/mummywrap_fetish, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) +"WD" = ( +/obj/structure/table/reinforced, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) +"WJ" = ( +/obj/structure/transport/linear/public, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/outside/pacificheights) "WR" = ( /obj/structure/lamppost/one, /turf/open/misc/beach/vamp, @@ -1996,6 +2652,19 @@ }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) +"Xc" = ( +/obj/machinery/button/elevator/directional/north{ + id = "DebugElevator3"; + pixel_y = 35; + pixel_x = 9 + }, +/obj/machinery/lift_indicator/directional/north{ + pixel_x = -5; + pixel_y = 20; + linked_elevator_id = "DebugElevator3" + }, +/turf/open/misc/grass/random/grass, +/area/vtm/outside/pacificheights) "Xf" = ( /obj/structure/table, /obj/item/ammo_box/magazine/m50, @@ -2008,14 +2677,26 @@ /obj/machinery/bookbinder, /turf/open/floor/plating/concrete, /area/vtm/interior/shop) +"Xw" = ( +/obj/machinery/recycler/deathtrap, +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) "Xz" = ( /obj/effect/decal/pallet, -/obj/item/ammo_box/vampire/c556/silver, -/obj/item/ammo_box/vampire/c556/incendiary, -/obj/item/ammo_box/vampire/c556, -/obj/item/ammo_box/vampire/c545, +/obj/item/ammo_box/darkpack/c556/silver, +/obj/item/ammo_box/darkpack/c556/incendiary, +/obj/item/ammo_box/darkpack/c556, +/obj/item/ammo_box/darkpack/c545, /turf/open/floor/plating/rough, /area/vtm/interior/anarch) +"XD" = ( +/obj/machinery/door/airlock/elevator/right{ + dir = 4; + pixel_y = 22; + transport_linked_id = "DebugElevator4" + }, +/turf/open/floor/iron/smooth_large, +/area/vtm/outside/pacificheights) "XE" = ( /obj/structure/fence/door, /turf/open/misc/beach/vamp, @@ -2027,13 +2708,10 @@ "XM" = ( /turf/closed/wall/vampwall/junk/alt, /area/vtm/outside/pacificheights) -"XU" = ( -/obj/structure/railing, -/obj/structure/ladder/manhole/up{ - connect_down = 1; - connect_up = 0 - }, -/turf/open/floor/plating/vampcanal, +"XP" = ( +/obj/machinery/fax/admin/police, +/obj/structure/table/wood, +/turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) "XW" = ( /obj/effect/turf_decal/bordur, @@ -2049,11 +2727,11 @@ /mob/living/carbon/human/npc/incel, /turf/open/misc/beach/vamp, /area/vtm/outside/pacificheights) -"Yr" = ( -/obj/effect/decal/cleanable/trash, -/obj/effect/spawner/random/occult/artifact, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) +"Yh" = ( +/obj/structure/table/wood, +/obj/machinery/light/directional/north, +/turf/open/floor/plating/sidewalk, +/area/vtm/outside/pacificheights) "Ys" = ( /turf/open/openspace, /area/vtm/outside/pacificheights) @@ -2063,13 +2741,17 @@ }, /turf/open/floor/plating/sidewalk/poor, /area/vtm/outside/supply) -"YF" = ( -/obj/item/clothing/head/cone, -/turf/open/misc/dirt/vamp, -/area/vtm/outside/supply) +"YB" = ( +/obj/machinery/fax/admin/endron, +/obj/structure/table/wood, +/turf/open/misc/beach/vamp, +/area/vtm/outside/pacificheights) +"YH" = ( +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) "YJ" = ( -/obj/structure/table, -/turf/closed/wall/vampwall/brick/low, +/obj/structure/table/countertop/green, +/turf/open/floor/plating/concrete, /area/vtm/interior/shop) "YL" = ( /obj/effect/turf_decal/bordur{ @@ -2078,33 +2760,41 @@ /obj/structure/roadsign/speedlimit, /turf/open/floor/plating/sidewalk/poor, /area/vtm/outside/pacificheights) -"YW" = ( -/obj/structure/table/wood, -/obj/item/vtm_artifact/odious_chalice, -/turf/open/floor/plating/parquetry/old, -/area/vtm/sewer) +"YY" = ( +/obj/structure/table/reinforced, +/obj/item/ritual_tome/arcane, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/sewer) "Zc" = ( /obj/effect/turf_decal/bordur{ dir = 8 }, /turf/open/floor/plating/sidewalk, /area/vtm/outside/pacificheights) -"Zf" = ( -/obj/machinery/fax/camarilla, -/turf/open/misc/beach/vamp, +"Zs" = ( +/turf/closed/wall/vampwall/brick_old, +/area/vtm/outside/pacificheights) +"Zz" = ( +/turf/open/misc/grass/random/grass, /area/vtm/outside/pacificheights) -"Zw" = ( +"ZS" = ( /obj/structure/table, -/obj/item/vampire_flamethrower, -/turf/open/floor/plating/sidewalk, -/area/vtm/outside/pacificheights) -"ZT" = ( -/obj/structure/vampdoor/graveyard{ - dir = 4; - locked = 0 +/obj/item/gun/ballistic/shotgun/toy/crossbow/vampire{ + pixel_y = 16 }, -/turf/open/floor/plating/concrete, -/area/vtm/interior/shop) +/obj/item/molotov{ + pixel_y = 4; + pixel_x = -5 + }, +/obj/item/molotov{ + pixel_x = -9 + }, +/obj/item/molotov, +/obj/item/lighter/skull{ + pixel_x = 8 + }, +/turf/open/floor/plating/rough, +/area/vtm/interior/anarch) "ZU" = ( /turf/closed/wall/vampwall/rich/old, /area/vtm/interior/techshop) @@ -2179,38 +2869,38 @@ GF "} (2,1,1) = {" GF -Ul -Ul -Ul -Ul -Ul -Ul -se -se -se -se -se -se -se -se -se -se -se -se -GF -se +Ef +Ef +Ef +Ef +Ef +Ef +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +GF +Ny rB rB rB -se +Ny GF -se -se -se -se -se -se -se +Ny +Ny +Ny +Ny +Ny +Ny +Ny Rj Rj Rj @@ -2247,35 +2937,35 @@ GF "} (3,1,1) = {" GF -Ul -SF -Uc -bs -Ps -Ul +Ef +qY +LG +va +zM +Ef mw ok NR NR Ff NR -fn +JR ok rL Vu Vu -se -se -se +Ny +Ny +Ny rB rB rB -se -se -se -NR -NR +Ny +Ny +Ny NR +Vr +dP NR NR NR @@ -2315,14 +3005,14 @@ GF "} (4,1,1) = {" GF -Ul -Sw -Jv -Yr -ch -Ul +Ef +QD +iJ +lM +VH +Ef FG -NR +aM wO NR NR @@ -2340,10 +3030,10 @@ VQ ik Fs NR +gA NR -NR -NR -NR +IZ +MF NR NR NR @@ -2383,13 +3073,13 @@ GF "} (5,1,1) = {" GF -Ul -YW -jt -lP -Mv -Ul -NR +Ef +wr +QN +hH +Kz +Ef +Sj ok gb Bf @@ -2408,10 +3098,10 @@ VQ ik sm NR +Uq NR -NR -NR -NR +Ds +Rn NR NR NR @@ -2451,12 +3141,12 @@ GF "} (6,1,1) = {" GF -Ul -rI -pH -Jv -BH -Ul +Ef +zM +RP +iJ +lU +Ef JH JH JH @@ -2476,10 +3166,10 @@ VQ ik Fs NR +bK NR -NR -NR -NR +rs +Tk NR NR NR @@ -2519,12 +3209,12 @@ GF "} (7,1,1) = {" GF -Ul -sx -Jv -jt -bE -Ul +Ef +Nb +iJ +QN +WB +Ef KB Wl OZ @@ -2544,10 +3234,10 @@ VQ ik Fs NR +YB NR -NR -NR -NR +DT +jd NR NR NR @@ -2587,12 +3277,12 @@ GF "} (8,1,1) = {" GF -Ul -AX -Jv -Jv -gn -zc +Ef +zF +iJ +iJ +zd +OP PO PO PO @@ -2612,10 +3302,10 @@ VQ zk Fs NR +LY NR -NR -NR -NR +fc +SW NR NR NR @@ -2655,12 +3345,12 @@ GF "} (9,1,1) = {" GF -Ul -sg -PX -gn -gn -zc +Ef +WD +YY +zd +zd +OP PO PO PO @@ -2670,7 +3360,7 @@ PO PO nm JH -NR +HE NR NR NR @@ -2680,9 +3370,9 @@ VQ ik fd NR +XP NR -NR -NR +mZ NR NR NR @@ -2723,22 +3413,22 @@ GF "} (10,1,1) = {" GF -Ul -Ul -Ul -Ul -Ul -Ul +Ef +Ef +Ef +Ef +Ef +Ef Uu Ca xU OD -Of +ZS hu -PO +FM Xz JH -mb +SP NR NR NR @@ -2748,7 +3438,7 @@ VQ ik Fs NR -NR +UC NR NR NR @@ -2865,18 +3555,18 @@ pN pN Jo EL +oF +ho Id Id Id Id -Id -Id -Id +yw Id Ev lk -oK -wD +NR +NR NR bp ik @@ -2933,7 +3623,7 @@ Tb pN Od EL -Id +bB Id Id Id @@ -2943,8 +3633,8 @@ Id Id Ev lk -oK -wD +NR +NR NR cj rW @@ -2952,9 +3642,9 @@ rW rW Fs NR -IX NR -em +NR +NR NR NR NR @@ -3001,7 +3691,7 @@ pN pN Df SK -eg +CB Id Id Id @@ -3011,8 +3701,8 @@ Id Id ZU je -oK -wD +NR +kb NR Bq tF @@ -3020,9 +3710,9 @@ VQ ik Fs NR -AT NR -Tw +NR +NR NR NR NR @@ -3064,11 +3754,11 @@ GF (15,1,1) = {" GF SK +uD pN pN pN -pN -pN +uX Id Id Id @@ -3079,8 +3769,8 @@ Id Id Ev lk -oK -wD +NR +PL NR cj ik @@ -3088,9 +3778,9 @@ VQ ik Fs NR -aO NR -Zf +NR +NR NR NR NR @@ -3147,8 +3837,8 @@ Id Id Ev lk -wW -wD +ru +kb NR cj ik @@ -3156,9 +3846,9 @@ VQ ik YL NR -OX -Ln -ts +NR +NR +NR NR NR NR @@ -3215,8 +3905,8 @@ Id Id Ev lk -oK -wD +NR +PL NR cj ik @@ -3224,9 +3914,9 @@ VQ ik Fs NR -AC NR -EX +NR +NR NR NR NR @@ -3283,8 +3973,8 @@ Id Id ZU je -oK -wD +NR +kb NR cj ik @@ -3292,9 +3982,9 @@ VQ tW VD NR -FD NR -Rb +NR +NR NR NR NR @@ -3345,14 +4035,14 @@ Id Id Id Id -Id -Id -Id +Ob +MJ +cw Id Ev lk -oK -wD +NR +NR NR cj ik @@ -3360,9 +4050,9 @@ VQ ik Fs NR -Po NR -JE +NR +NR NR NR NR @@ -3410,17 +4100,17 @@ pN pN pN Id +ho Id Id -Id -Id -Id -Id +La +GO +Tm Id Ev lk -oK -wD +NR +NR NR cj ik @@ -3481,9 +4171,9 @@ Id sw Id Id -Id -MJ -GO +ih +Ws +ut Id Ev lk @@ -3549,9 +4239,9 @@ ZU ZU rN Id -zT -Ws -Sg +Nz +SY +iR Id ZU uJ @@ -3617,8 +4307,8 @@ Id ZU rN Id -zT -SY +Id +Id sw BQ ZU @@ -3679,12 +4369,12 @@ SK SK SK SK -JK +NQ SK ZU ZU ZU -Ao +Mf ZU ZU ZU @@ -3745,7 +4435,7 @@ GF GF MS Bt -Lk +jw XE NR NR @@ -3816,9 +4506,9 @@ UJ fn iD iD -mj +fo iD -ET +qv iD iD NR @@ -3829,7 +4519,7 @@ Fg Fg Fg Fg -ap +NR cj ik VQ @@ -3881,7 +4571,7 @@ GF GF MS iA -ok +Ag iD AE oW @@ -3897,7 +4587,7 @@ gF id gF Fg -ap +NR cj ik VQ @@ -3965,7 +4655,7 @@ gF On gF Fg -ap +NR OH OB VQ @@ -4016,7 +4706,7 @@ GF (29,1,1) = {" GF MS -ht +zA NR iD bo @@ -4027,13 +4717,13 @@ Kt iD NR Fg -YJ +sY Ip Fg xH hz Fg -ap +NR cj ik VQ @@ -4085,7 +4775,7 @@ GF GF MS JP -NR +Qe XE NR NR @@ -4094,7 +4784,7 @@ NR NR NR NR -NR +Jh NR NR NR @@ -4152,10 +4842,10 @@ GF (31,1,1) = {" GF kS -ZT +PR kS kS -vm +NR NR NR NR @@ -4229,7 +4919,7 @@ NR NR NR NR -NR +Oq NR NR NR @@ -4304,7 +4994,7 @@ Fg mm GH Fg -tO +NR NR cj ik @@ -4319,7 +5009,7 @@ yk yk yk yk -qT +Wa Rj Rj Rj @@ -4371,7 +5061,7 @@ oW Fg zv oW -GS +LP NR NR cT @@ -4386,8 +5076,8 @@ yi oM oM oM -gI -qT +Be +Wa Rj Rj Rj @@ -4427,7 +5117,7 @@ Fg ON oW Fg -NR +eg NR NR Wy @@ -4440,14 +5130,14 @@ oW oW LW Fg -tr +NR NR cj ik VQ ik Fs -gI +Be oM oM oM @@ -4455,7 +5145,7 @@ oM oM oM yk -qT +Wa Rj Rj Rj @@ -4508,7 +5198,7 @@ kS kS kS Fg -Kj +NR NR Dh en @@ -4523,7 +5213,7 @@ jp yk yk yk -qT +Wa Rj Rj Rj @@ -4571,27 +5261,27 @@ sy eJ DN kS -DF -yE -Tq -ee +bj +Ju +Gj +YH Fg -qr +NR NR cj ik VQ ik Fs -LR -LR -lU -DM -qT -Db -DM -qT -qT +Em +Em +NX +Lb +Wa +EE +Lb +Wa +Wa Rj Rj Rj @@ -4631,19 +5321,19 @@ Hp GM DV Fg -sX NR NR -YJ +NR +KW bL BL DN kS -Tq -pt -TO -ee -Cr +tO +vD +Xw +YH +Bp NR NR cj @@ -4651,15 +5341,15 @@ ik VQ ik Fs -qT -qT -qT -DM -fi -qT -DM -GB -qT +ze +Wa +Wa +Lb +sR +Wa +Lb +mn +Wa Rj Rj Rj @@ -4719,15 +5409,15 @@ FB VQ ik Fs -VK -VK -qT -DM -GB -qT -ff -fi -qT +hK +hK +Wa +Lb +mn +Wa +FT +sR +Wa Rj Rj Rj @@ -4764,8 +5454,8 @@ GF (40,1,1) = {" GF jW -oU -wm +oV +fI zx NR NR @@ -4789,13 +5479,13 @@ ik Fs qt FO -qT -ff -qT -qT -DM -fi -qT +Wa +FT +Wa +Wa +Lb +sR +Wa Rj Rj Rj @@ -4832,8 +5522,8 @@ GF (41,1,1) = {" GF jW -nh -Gz +xc +eU Pg NR NR @@ -4856,14 +5546,14 @@ VQ ik Fs Yz -Uw -qT -DM -GB -qT -DM -GB -qT +Kr +Wa +Lb +mn +Wa +Lb +mn +Wa Rj Rj Rj @@ -4900,8 +5590,8 @@ GF (42,1,1) = {" GF jW -oU -yt +oV +gN zx NR NR @@ -4924,14 +5614,14 @@ VQ ik Fs lN -Uw -qT -DM -GB -qT -DM -fi -qT +Kr +Wa +Lb +mn +Wa +Lb +sR +Wa Rj Rj Rj @@ -4968,8 +5658,8 @@ GF (43,1,1) = {" GF jW -yt -yt +gN +gN kS zx zx @@ -4993,14 +5683,14 @@ ik Fs lN lN -qT -DM -qT -qT -ff -qT -qT -qT +Wa +Lb +Wa +Wa +FT +Wa +Wa +Wa Rj Rj Rj @@ -5036,11 +5726,11 @@ GF (44,1,1) = {" GF jW -yt -yt -yt -nh -nh +gN +gN +gN +xc +xc kS NR OO @@ -5048,10 +5738,10 @@ VJ Nd FH Nd -ig -UG -GE -ig +NR +nk +Rg +sU NR NR cj @@ -5059,16 +5749,16 @@ ik VQ ik Fs -qT -qT -qT -DM -qT -qT -DM -qT -qT -qT +Wa +Wa +Wa +Lb +Wa +Wa +Lb +Wa +Wa +Wa Rj Rj Rj @@ -5104,11 +5794,11 @@ GF (45,1,1) = {" GF jW -hA -yt -yt -UK -yt +Pa +gN +gN +JB +gN kS NR Nd @@ -5116,10 +5806,10 @@ NR NR NR NR -ig -ig -Cd -ig +NR +ln +tP +Hc NR NR cj @@ -5127,16 +5817,16 @@ ik VQ ik Fs -qT -qT -qT -DM -qT -qT -DM -qT -qT -qT +Wa +Wa +Wa +Lb +Wa +Wa +Lb +Wa +Wa +Wa Rj Rj Rj @@ -5173,7 +5863,7 @@ GF GF kS kS -UQ +Ew kS kS kS @@ -5184,10 +5874,10 @@ NR NR NR GL -ig -ig -ig -ig +NR +sg +Ql +Ty NR NR cj @@ -5195,16 +5885,16 @@ ik VQ ik Fs -qT -YF -Wn -DM -Wn -qT -DM -qT -qT -qT +Wa +dN +Lj +Lb +Lj +Wa +Lb +Wa +Wa +Wa Rj Rj Rj @@ -5239,13 +5929,13 @@ GF "} (47,1,1) = {" GF -sb -NR -NR -iQ -NR -ES -kM +Zs +Oi +Oi +iK +Oi +PC +ef NR FC NR @@ -5263,16 +5953,16 @@ ik VQ ik Fs -qT -qT -EF -Is -bD -qT -ff -GB -qT -qT +Wa +Wa +Ut +QZ +lY +Wa +FT +mn +Wa +Wa Rj Rj Rj @@ -5307,13 +5997,13 @@ GF "} (48,1,1) = {" GF -sb -NR -NR -iQ -iQ -iQ -NR +Zs +Oi +Oi +iK +iK +iK +Oi NR NR NR @@ -5331,16 +6021,16 @@ ik VQ HJ Fs -qT -qT -jf -DM -Re -qT -DM -qT -qT -qT +Wa +Wa +Mn +Lb +kj +Wa +Lb +Wa +Wa +Wa Rj Rj Rj @@ -5375,14 +6065,14 @@ GF "} (49,1,1) = {" GF -sb -NR -NR -Nu -NR -Nu -NR -NR +Zs +Oi +Oi +cg +Oi +cg +Oi +Oi NR NR NR @@ -5399,16 +6089,16 @@ ik VQ ik Fs -qT -qT -jf -DM -Re -qT -DM -GB -qT -qT +Wa +Wa +Mn +Lb +kj +Wa +Lb +mn +Wa +Wa Rj Rj Rj @@ -5443,14 +6133,14 @@ GF "} (50,1,1) = {" GF -sb -NR -NR -NR -NR -NR -NR -NR +Zs +Oi +Oi +Oi +Oi +Oi +Oi +Oi NR NR NR @@ -5467,17 +6157,17 @@ ik VQ ik Fs -qT -qT -jf -DM -Re -qT -DM -qT -qT -qT -qT +Wa +Wa +Mn +Lb +kj +Wa +Lb +Wa +Wa +Wa +Wa Rj Rj Rj @@ -5511,15 +6201,15 @@ GF "} (51,1,1) = {" GF -sb -NR -aW -NR -NR -NR -NR -NR -NR +Zs +Oi +Pr +Oi +Oi +Oi +Oi +Oi +Oi NR NR NR @@ -5535,17 +6225,17 @@ ik VQ ik Fs -qT -qT -jf -DM -Re -qT -DM -fi -qT -qT -qT +Wa +Wa +Mn +Lb +kj +Wa +Lb +sR +Wa +Wa +Wa Rj Rj Rj @@ -5579,15 +6269,15 @@ GF "} (52,1,1) = {" GF -sb -yc -iQ -NR -NR -NR -NR -NR -NR +Zs +DW +iK +Oi +Oi +Oi +Oi +Oi +Oi NR NR NR @@ -5603,17 +6293,17 @@ ik VQ ik Fs -qT -qT -tj -IO -pf -qT -DM -qT -qT -qT -qT +Wa +Wa +jK +wj +rM +Wa +Lb +Wa +Wa +Wa +Wa Rj Rj Rj @@ -5647,16 +6337,16 @@ GF "} (53,1,1) = {" GF -sb -NR -kM -NR -NR -NR -NR -NR -NR -NR +Zs +Oi +ef +Oi +Oi +Oi +Oi +Oi +Oi +Oi NR NR NR @@ -5671,17 +6361,17 @@ ik VQ ik Fs -qT -YF -qT -DM -qT -qT -DM -qT -qT -qT -qT +Wa +dN +Wa +Lb +Wa +Wa +Lb +Wa +Wa +Wa +Wa Rj Rj Rj @@ -5715,18 +6405,18 @@ GF "} (54,1,1) = {" GF -sb -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR +Zs +Oi +Oi +Oi +Oi +Oi +Oi +Oi +Oi +Oi +Oi +Oi NR NR NR @@ -5739,17 +6429,17 @@ rW rW rW Fs -qT -qT -qT -DM -qT -qT -DM -qT -qT -qT -qT +Wa +Wa +Wa +Lb +Wa +Wa +Lb +Wa +Wa +Wa +Wa Rj Rj Rj @@ -5783,19 +6473,19 @@ GF "} (55,1,1) = {" GF -sb -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR +Zs +pg +pg +pg +Zs +Xc +Zz +oD +Zz +Zz +oD +oD +oD NR NR NR @@ -5807,17 +6497,17 @@ ik VQ ik Fs -qT -qT -qT -DM -qT -fi -DM -qT -qT -qT -qT +Wa +Wa +Wa +Lb +Wa +sR +Lb +Wa +Wa +Wa +Wa Rj Rj Rj @@ -5851,19 +6541,19 @@ GF "} (56,1,1) = {" GF -sb -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR +Zs +Bw +Ti +WJ +qC +oD +oD +Zz +oD +oD +Zz +Zz +Zz NR NR NR @@ -5875,17 +6565,17 @@ ik VQ ik Fs -qT -qT -qT -DM -qT -fi -DM -qT -qT -qT -qT +Wa +Wa +Wa +Lb +Wa +sR +Lb +Wa +Wa +Wa +Wa Rj Rj Rj @@ -5919,19 +6609,19 @@ GF "} (57,1,1) = {" GF -sb -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR +Zs +Le +WJ +WJ +qC +oD +oD +Oi +Zz +oD +Oi +Oi +Oi NR NR NR @@ -5943,17 +6633,17 @@ FB VQ ik Fs -qT -qT -qT -DM -qT -qT -ff -qT -qT -qT -qT +Wa +Wa +Wa +Lb +Wa +Wa +FT +Wa +Wa +Wa +Wa Rj Rj Rj @@ -5987,20 +6677,20 @@ GF "} (58,1,1) = {" GF -sb -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR +Zs +Zs +Zs +Zs +Zs +oD +Zz +Oi +oD +oD +Oi +Oi +Oi +Oi NR NR NR @@ -6011,16 +6701,16 @@ ik VQ ik Fs -qT -qT -qT -DM -qT -qT -DM -qT -qT -qT +Wa +Wa +Wa +Lb +Wa +Wa +Lb +Wa +Wa +Wa Rj Rj Rj @@ -6055,23 +6745,23 @@ GF "} (59,1,1) = {" GF -sb -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR +Zs +Ne +WJ +IA +Zs +Nm +Zz +Oi +oD +oD +Oi +Oi +Oi +Oi +Oi +Oi +Oi NR NR Bq @@ -6079,17 +6769,16 @@ ik VQ ik Fs -qT -qT -qT -DM -qT -qT -DM -fi -qT -qT -Rj +Wa +Wa +Wa +Lb +Wa +Wa +Lb +sR +Wa +Wa Rj Rj Rj @@ -6119,44 +6808,45 @@ Rj Rj Rj Rj -GF -"} -(60,1,1) = {" -GF -sb -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR +Rj +GF +"} +(60,1,1) = {" +GF +Zs +QR +Bs +KR +co +oD +oD +Oi +oD +oD +Oi +Oi +Oi +Oi +Oi +Oi +Oi +Oi +Oi cj ik VQ ik Fs -qT -qT -qT -DM -qT -qT -DM -GB -qT -qT +Wa +Wa +Wa +Lb +Wa +Wa +Lb +mn +Wa +Wa Rj Rj Rj @@ -6191,40 +6881,40 @@ GF "} (61,1,1) = {" GF -sb -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR +Zs +UL +WJ +Hj +qc +oD +oD +Oi +oD +Zz +Oi +Oi +Oi +Oi +Oi +Oi +Oi +Oi +Oi Ig ik VQ ik Fs -qT -qT -qT -DM -qT -qT -ff -GB -qT -qT +Wa +Wa +Wa +Lb +Wa +Wa +FT +mn +Wa +Wa Rj Rj Rj @@ -6259,40 +6949,40 @@ GF "} (62,1,1) = {" GF -sb -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR +Zs +jD +WJ +UH +Zs +Zz +oD +Zs +yW +oD +Oi +Oi +Oi +Oi +Oi +Oi +Oi +Oi +Oi cj kc Cz kc sm -qT -qT -qT -DM -qT -qT -DM -GB -qT -qT +Wa +Wa +Wa +Lb +Wa +Wa +Lb +mn +Wa +Wa Rj Rj Rj @@ -6327,40 +7017,40 @@ GF "} (63,1,1) = {" GF -sb -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR +Zs +Zs +Zs +Zs +Zs +jR +oD +Zs +XD +Jf +Zs +Oi +Oi +Oi +Oi +Oi +Oi +Oi +Oi cj ik VQ ik Fs -qT -qT -qT -DM -qT -qT -DM -qT -qT -qT +Wa +Wa +Wa +Lb +Wa +Wa +Lb +Wa +Wa +Wa Rj Rj Rj @@ -6395,40 +7085,40 @@ GF "} (64,1,1) = {" GF -sb -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -NR -se -se -se +Zs +hT +qE +WJ +ug +oD +oD +Zs +Pz +WJ +Zs +Oi +Oi +Oi +Oi +Oi +Oi +Ny +Ny +Ny rB rB rB -se -se -se -qT -DM -qT -qT -DM -qT -qT -qT +Ny +Ny +Ny +Wa +Lb +Wa +Wa +Lb +Wa +Wa +Wa Rj Rj Rj @@ -6463,40 +7153,40 @@ GF "} (65,1,1) = {" GF -se -se -se -se -se -se -se -se -se -se -se -se -se -se -se -se -se -se -GF -se +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +Ny +GF +Ny rB rB rB -se +Ny GF -se +Ny rB rB rB -se -se -se -qT -qT +Ny +Ny +Ny +Wa +Wa Rj Rj Rj @@ -6682,24 +7372,24 @@ MS MS MS MS -MS -sb -sb -sb -sb -sb -sb -sb -sb -sb +GN +Kk +Kk +Kk +Kk +Kk +Kk +Kk +Zs +Zs qV qV qV qV qV -sb -sb -sb +Zs +Zs +Zs Ys Ys Ys @@ -6737,12 +7427,12 @@ GJ (3,1,2) = {" GJ MS -iH +tr Gw iH iH MS -fS +Mm Ys Ys Ys @@ -6750,14 +7440,14 @@ Ys Ys Ys Ys -MS -oJ -oJ -oJ -oJ -oJ -oJ -sb +GN +lX +lX +lX +lX +lX +lX +Kk qz XJ FB @@ -6767,7 +7457,7 @@ ik HJ KU Ct -sb +Zs Ys Ys Ys @@ -6805,12 +7495,12 @@ GJ (4,1,2) = {" GJ MS -iH +uP EN Hg iH MS -nY +tY Ys Ys Ys @@ -6818,14 +7508,14 @@ Ys Ys Ys Ys -MS -oJ -oJ -oJ -oJ -oJ -oJ -sb +GN +lX +lX +lX +lX +lX +lX +Kk rF XW ik @@ -6835,7 +7525,7 @@ ik ik KU rF -sb +Zs Ys Ys Ys @@ -6873,12 +7563,12 @@ GJ (5,1,2) = {" GJ MS -iH +Jq Py bh iH yK -nY +tY Ys Ys Ys @@ -6886,14 +7576,14 @@ Ys Ys Ys Ys -MS -oJ -oJ -oJ -oJ -oJ -oJ -sb +GN +lX +lX +lX +lX +lX +lX +Kk eQ XJ ik @@ -6903,7 +7593,7 @@ ik ik KU eQ -sb +Zs Ys Ys Ys @@ -6946,8 +7636,7 @@ MS MS MS MS -vz -MS +SM MS MS MS @@ -6955,13 +7644,14 @@ MS MS MS MS -oJ -oJ -oJ -oJ -oJ -oJ -sb +GN +lX +lX +lX +lX +lX +lX +Kk eQ XJ ik @@ -6971,7 +7661,7 @@ ik ik KU eQ -sb +Zs Ys Ys Ys @@ -7014,22 +7704,22 @@ eQ eQ eQ MS -nY -Nx +tY +BZ Ys Ys Ys Ys Ys -Ys -MS -oJ -oJ -oJ -oJ -oJ -oJ -sb +di +GN +lX +lX +lX +lX +lX +lX +Kk eQ XJ ik @@ -7039,7 +7729,7 @@ ik ik KU eQ -sb +Zs Ys Ys Ys @@ -7082,22 +7772,22 @@ eQ eQ eQ MS -nY -Nx +di +dc Ys Ys Ys Ys Ys -Ys -MS -oJ -oJ -oJ -oJ -oJ -oJ -sb +di +GN +lX +lX +lX +lX +lX +lX +Kk eQ XJ ik @@ -7107,7 +7797,7 @@ ik ik KU eQ -sb +Zs Ys Ys Ys @@ -7150,22 +7840,22 @@ eQ eQ eQ MS -vJ -Nx +pD +dc Ys Ys Ys Ys Ys -Ys -MS -oJ -oJ -oJ -sb -oJ -oJ -sb +di +GN +lX +lX +lX +Kk +lX +lX +Kk eQ tb rW @@ -7217,23 +7907,23 @@ eQ eQ eQ eQ -MS -nY -Nx -Ys +eQ +di +dc Ys Ys Ys Ys Ys -MS -oJ -oJ -oJ -sb -oJ -oJ -sb +di +GN +lX +lX +lX +Kk +lX +lX +Kk qz XJ ik @@ -7281,27 +7971,27 @@ GJ (11,1,2) = {" GJ MS -eQ -eQ -eQ -eQ MS -nY -Nx -Ys +MS +MS +MS +MS +di +dc Ys Ys Ys Ys Ys -MS -oJ -oJ -oJ -sb -oJ -oJ -sb +di +GN +lX +lX +lX +Kk +lX +lX +Kk eQ XJ ik @@ -7349,27 +8039,27 @@ GJ (12,1,2) = {" GJ MS -eQ -eQ -eQ -eQ +ax +sZ +sZ +vW MS -nY -Nx +di +dc Ys Ys Ys Ys Ys -Ys -MS -oJ -oJ -oJ -sb -sb -sb -sb +di +GN +lX +lX +lX +Kk +Kk +Kk +Kk eQ XJ ik @@ -7417,27 +8107,27 @@ GJ (13,1,2) = {" GJ MS +sQ eQ eQ -eQ -eQ +gl MS -nY -Nx +tY +BZ Ys Ys Ys Ys Ys -Ys -MS -oJ -oJ -oJ -oJ -oJ -oJ -cj +di +GN +lX +lX +lX +lX +lX +lX +pV eQ tb rW @@ -7485,27 +8175,27 @@ GJ (14,1,2) = {" GJ MS +sQ eQ eQ -eQ -eQ +gl MS -nY -Nx -Ys -Ys -Ys +tY +dU +SL +JZ Ys Ys Ys -eR -oJ -oJ -oJ -oJ -oJ -oJ -cj +di +LU +lX +lX +lX +lX +lX +lX +pV aN XJ ik @@ -7553,27 +8243,27 @@ GJ (15,1,2) = {" GJ MS +Yh eQ eQ -eQ -eQ +dL MS -vJ -nY -vn -by +OQ +BZ Ys Ys Ys Ys -eR -oJ -oJ -oJ -oJ -oJ -oJ -cj +Ys +di +LU +lX +lX +lX +lX +lX +lX +pV eQ XJ ik @@ -7621,27 +8311,27 @@ GJ (16,1,2) = {" GJ MS +sQ eQ eQ -eQ -eQ +iZ MS -nY -Nx -Ys +di +dc Ys Ys Ys Ys Ys -MS -oJ -oJ -oJ -md -md -md -md +di +GN +lX +lX +lX +ca +ca +ca +ca eQ XJ ik @@ -7689,27 +8379,27 @@ GJ (17,1,2) = {" GJ MS +sQ eQ eQ -eQ -eQ +iZ MS -nY -Nx -Ys +di +dc Ys Ys Ys Ys Ys -MS -oJ -oJ -oJ -md -oJ -oJ -md +di +GN +lX +lX +lX +ca +pU +fV +ca qz XJ ik @@ -7757,27 +8447,27 @@ GJ (18,1,2) = {" GJ MS +rO eQ eQ -eQ -eQ +oi MS -nY -XU -Ys +di +Cj Ys Ys Ys Ys Ys -MS -oJ -oJ -oJ -oJ -oJ -oJ -md +di +GN +lX +lX +lX +lX +lX +lX +ca eQ XJ ik @@ -7825,27 +8515,27 @@ GJ (19,1,2) = {" GJ MS +rO eQ eQ -eQ -eQ +oi MS -nY -Nx -Ys +di +dc Ys Ys Ys Ys Ys -MS -oJ -oJ -oJ -oJ -oJ -oJ -md +di +GN +lX +lX +lX +lX +fZ +lX +ca eQ XJ FB @@ -7893,27 +8583,27 @@ GJ (20,1,2) = {" GJ MS +NK eQ eQ -eQ -eQ +UN MS -nY -Nx -Ys +di +dc Ys Ys Ys Ys Ys -eR -oJ -oJ -oJ -oJ -oJ -oJ -md +di +LU +lX +lX +lX +lX +lX +lX +ca eQ XJ ik @@ -7961,29 +8651,29 @@ GJ (21,1,2) = {" GJ MS +TU eQ eQ -eQ -eQ +UN MS -vJ -Nx -Ys +OQ +BZ Ys Ys Ys Ys Ys -eR -oJ -oJ -oJ -md -oJ -oJ -md +di +LU +lX +lX +lX +ca +fV +pU +ca eQ -XJ +Kc ik ik VQ @@ -8029,27 +8719,27 @@ GJ (22,1,2) = {" GJ MS +OV eQ eQ eQ eQ -eQ -nY -nY -Ys +tY +tY Ys Ys Ys Ys Ys -MS -oJ -oJ -oJ -md -md -md -md +di +GN +lX +lX +lX +ca +ca +ca +ca eQ XJ ik @@ -8097,25 +8787,25 @@ GJ (23,1,2) = {" GJ MS +Mz eQ eQ eQ eQ -eQ -nY -nY +tY +tY Ys Ys Ys Ys Ys -Ys -MS -oJ -oJ -oJ -md -md +di +GN +lX +lX +lX +ca +ca eQ eQ eQ @@ -8165,25 +8855,25 @@ GJ (24,1,2) = {" GJ MS +nw +PP MS MS MS +SM +SM MS MS -vz -vz -MS -MS -sb -sb -sb -sb -sb -MH -QM -QM -md -md +Zs +Zs +Zs +Zs +Kk +Mg +SJ +SJ +ca +ca eQ eQ XY @@ -8233,15 +8923,15 @@ GJ (25,1,2) = {" GJ MS -eQ -eQ +KF +NP NP Lw Vg eQ eQ kn -Zw +jj eQ oX QS @@ -8720,7 +9410,7 @@ ik ik ik ik -ik +HQ ik gs eR @@ -10273,11 +10963,11 @@ GJ (55,1,2) = {" GJ MS -eQ -eQ -eQ -eQ -eQ +Jk +Jk +Jk +MS +Dx eQ eQ eQ @@ -10341,10 +11031,10 @@ GJ (56,1,2) = {" GJ MS -eQ -eQ -eQ -eQ +Ys +Ys +Ys +op eQ eQ eQ @@ -10409,10 +11099,10 @@ GJ (57,1,2) = {" GJ MS -eQ -eQ -eQ -eQ +Ys +Ys +Ys +op eQ eQ eQ @@ -10477,10 +11167,10 @@ GJ (58,1,2) = {" GJ MS -eQ -eQ -eQ -eQ +MS +MS +MS +MS eQ eQ eQ @@ -10545,11 +11235,11 @@ GJ (59,1,2) = {" GJ MS -eQ -eQ -eQ -eQ -eQ +Ys +Ys +Ys +MS +VL eQ eQ eQ @@ -10613,10 +11303,10 @@ GJ (60,1,2) = {" GJ MS -eQ -eQ -eQ -eQ +Ys +Ys +Ys +co eQ eQ eQ @@ -10681,10 +11371,10 @@ GJ (61,1,2) = {" GJ MS -eQ -eQ -eQ -eQ +Ys +Ys +Ys +qc eQ eQ eQ @@ -10749,15 +11439,15 @@ GJ (62,1,2) = {" GJ MS +Ys +Ys +Ys +MS eQ eQ +MS +hk eQ -eQ -eQ -eQ -eQ -eQ -Hd Hd XJ ik @@ -10817,16 +11507,16 @@ GJ (63,1,2) = {" GJ MS +MS +MS +MS +MS +xj eQ -eQ -eQ -eQ -eQ -eQ -eQ -eQ -Hd -Hd +MS +XD +Jf +MS LX Zc Zc @@ -10885,16 +11575,16 @@ GJ (64,1,2) = {" GJ MS +Ys +Ys +Ys +ug eQ eQ -eQ -eQ -eQ -eQ -eQ -eQ -Hd -Hd +MS +Ys +Ys +MS eQ WZ eQ @@ -10962,20 +11652,20 @@ MS MS MS MS -sb -sb -sb -sb -sb -sb -sb -sb -sb -sb -sb -sb -sb -sb +Zs +Zs +Zs +Zs +Zs +Zs +Zs +Zs +Zs +Zs +Zs +Zs +Zs +Zs qV qV qV diff --git a/_maps/map_files/Vampire/update_guide.md b/_maps/map_files/Vampire/update_guide.md new file mode 100644 index 000000000000..8298f8be7115 --- /dev/null +++ b/_maps/map_files/Vampire/update_guide.md @@ -0,0 +1,16 @@ +# Hello Downstream Mapper! +Are you updating an old map to darkpack? +Here is a little checklist of things to do. + +See `tools/UpdatePaths/readme.md` for how to run the updates paths. This will ensure all types are updated to TG. +It also tries its best to fix a few old mapping sins like layer edits, some of which are now linted against in TG. + +After you have ran the updates paths, You may find some stuff is still broken. Part of this is the cost for ensuring our updates path is non-volatile +Stuff like chairs, some floor decals, light fixtures, may need to be hand updated due to limitations + +There is also a whole host of new things you get to add to maps or changes to how you map. +* Navigate landmarks `/obj/effect/landmark/navigate_destination` to allow people to create paths to areas. +* Telecomms from https://github.com/DarkPack13/SecondCity/pull/432. Either use an `/obj/machinery/telecomms/allinone/public` or hand map telecomms where relevent +* Sprinklers from https://github.com/DarkPack13/SecondCity/pull/78. Areas are now only fire suppresed if you hand place sprinkers `/obj/machinery/sprinkler` +* Doors now have there varibles controlled via helpers, much more visable and reusable from https://github.com/DarkPack13/SecondCity/pull/318 `/obj/effect/mapping_helpers/door` +* A much more robust set of tools for generating random flora or forest. `/area/vtm/planetgeneration` is an area type that randomly generates forest like terrain but you can also use `/turf/open/misc/grass/random` or subtypesof `/obj/effect/spawner/random/flora` for finer control or places you want a specific area type. diff --git a/_maps/map_files/Vampire/westfield_mall.dmm b/_maps/map_files/Vampire/westfield_mall.dmm new file mode 100644 index 000000000000..0f43afdbd0a9 --- /dev/null +++ b/_maps/map_files/Vampire/westfield_mall.dmm @@ -0,0 +1,132401 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aaa" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aab" = ( +/obj/structure/table/countertop/yellow, +/obj/structure/desk_bell{ + pixel_x = -8; + pixel_y = 9 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aac" = ( +/mob/living/carbon/human/npc/shop, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aad" = ( +/obj/structure/bed/dogbed, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"aae" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"aaf" = ( +/obj/structure/closet/crate/large, +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping6" + }, +/obj/effect/spawner/random/engineering/flashlight, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aag" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aah" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/endron_logging) +"aai" = ( +/obj/effect/decal/kopatich, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aaj" = ( +/obj/effect/decal/cleanable/garbage, +/obj/effect/decal/graffiti/large, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/endron_logging) +"aak" = ( +/obj/machinery/atm{ + dir = 4; + pixel_x = -8 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/foodcourt) +"aal" = ( +/obj/effect/decal/carpet{ + icon_state = "greencarpet"; + pixel_y = 15; + pixel_x = 16 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aam" = ( +/obj/structure/closet, +/obj/item/clothing/under/vampire/bouncer, +/obj/item/clothing/under/vampire/bouncer, +/obj/item/clothing/glasses/vampire/sun, +/obj/item/clothing/suit/vampire/jacket, +/obj/item/clothing/suit/vampire/jacket, +/obj/machinery/light/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/anarch) +"aan" = ( +/obj/item/bong, +/turf/open/floor/plating/rough/cave, +/area/vtm/westfield_mall/interior/cave) +"aao" = ( +/obj/structure/punching_bag, +/obj/effect/decal/rugs, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aap" = ( +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/parking_lot) +"aaq" = ( +/obj/structure/chair/wood/darkpack, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aar" = ( +/obj/structure/table/wood, +/obj/item/pet_carrier{ + pixel_x = -2; + pixel_y = 7 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"aas" = ( +/turf/open/misc/grass/random/bushes, +/area/vtm/westfield_mall/forest) +"aat" = ( +/turf/open/misc/dirt, +/area/vtm/westfield_mall) +"aau" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp{ + pixel_x = 3 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/clinic) +"aav" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"aaw" = ( +/obj/structure/rack/clothing/rand{ + dir = 8 + }, +/obj/effect/decal/wallpaper/papers/random{ + pixel_x = 1; + pixel_y = 26 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"aax" = ( +/obj/structure/table/reinforced, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/interior/shop) +"aay" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 10 + }, +/turf/open/floor/city/bacotell, +/area/vtm/interior/bianchiBank) +"aaz" = ( +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"aaA" = ( +/obj/structure/vampipe{ + pixel_y = 32 + }, +/turf/open/openspace, +/area/vtm/westfield_mall/interior/maintenance) +"aaB" = ( +/obj/structure/city_map, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aaC" = ( +/obj/structure/closet/cabinet, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aaD" = ( +/obj/structure/rack/clothing/rand, +/obj/fake_platform/dred/easyclimb, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/clothing_store) +"aaE" = ( +/obj/structure/table/reinforced, +/obj/structure/fluff/tv{ + icon_state = "tv_nature"; + pixel_y = 13 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aaF" = ( +/obj/structure/chair/sofa/corp/left, +/obj/machinery/light/directional/north, +/obj/effect/landmark/start/darkpack/anarch/sweeper, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"aaG" = ( +/obj/structure/table/countertop, +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/interior/supply) +"aaH" = ( +/obj/fusebox, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"aaI" = ( +/obj/effect/decal/wallpaper/blue/low, +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/interior/police) +"aaJ" = ( +/obj/structure/closet/crate/bin, +/obj/effect/decal/wallpaper/grey{ + pixel_y = 32 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 9 + }, +/obj/structure/sign/poster/city/blade/directional/north{ + pixel_x = -5; + pixel_y = 31 + }, +/obj/structure/sign/poster/city/bloodrayne/directional/north{ + pixel_x = 8; + pixel_y = 34 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"aaK" = ( +/obj/machinery/jukebox/no_access, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aaL" = ( +/obj/structure/bookcase/random/nonfiction, +/obj/machinery/light/prince/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aaM" = ( +/obj/structure/weightmachine, +/obj/effect/decal/rugs, +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"aaN" = ( +/obj/lombard, +/obj/structure/vampfence/rich, +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/interior/shop) +"aaO" = ( +/obj/structure/table/wood, +/obj/structure/coclock, +/obj/machinery/fax/anarch, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/westfield_mall/interior/anarch) +"aaP" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/interior/clinic) +"aaQ" = ( +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"aaR" = ( +/obj/structure/vampdoor/simple, +/obj/effect/turf_decal/bordur, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aaS" = ( +/obj/structure/fire_barrel, +/turf/open/misc/dirt, +/area/vtm/interior/sewer) +"aaT" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aaU" = ( +/obj/effect/turf_decal/bordur{ + dir = 5 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aaV" = ( +/turf/open/misc/dirt/rails, +/area/vtm/westfield_mall/interior/supply) +"aaW" = ( +/obj/structure/lamppost/four{ + pixel_y = 8 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/parking_lot) +"aaX" = ( +/obj/structure/table/wood, +/obj/item/melee/vamp/tire, +/obj/item/melee/vamp/tire{ + pixel_x = -5; + pixel_y = 7 + }, +/turf/open/misc/dirt, +/area/vtm/interior/sewer) +"aaY" = ( +/obj/structure/stairs/wood{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aaZ" = ( +/obj/item/reagent_containers/blood/empty{ + pixel_x = -11; + pixel_y = 2 + }, +/obj/machinery/computer/security/wooden_tv{ + pixel_x = 4; + pixel_y = 12 + }, +/obj/structure/table, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aba" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/machinery/sprinkler, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"abb" = ( +/obj/structure/bed, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"abc" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 1 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"abd" = ( +/obj/structure/platform/lowwall/brick_old, +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer) +"abe" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 4 + }, +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/marker_beacon/burgundy, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"abf" = ( +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/foodcourt) +"abg" = ( +/obj/effect/spawner/random/trash/grime, +/turf/open/floor/plating/concrete, +/area/vtm/interior/sewer) +"abh" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/interior/mansion) +"abi" = ( +/obj/effect/decal/cleanable/trash, +/turf/open/floor/plating/stone, +/area/vtm/interior/sewer/nosferatu_town) +"abj" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"abk" = ( +/obj/structure/coclock, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"abl" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 4 + }, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall) +"abm" = ( +/obj/structure/vampstatue, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"abn" = ( +/obj/structure/closet/cabinet, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"abo" = ( +/obj/effect/mapping_helpers/door/lock, +/obj/structure/vampdoor/woodglass, +/obj/effect/mapping_helpers/door/access/camarilla, +/turf/open/floor/wood/ornate, +/area/vtm/westfield_mall/interior/camarilla) +"abp" = ( +/obj/structure/bookcase/random/religion, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"abq" = ( +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"abr" = ( +/obj/structure/sign/poster/city/gravitykills/directional/north{ + pixel_x = -9; + pixel_y = 34 + }, +/obj/structure/sign/poster/city/lacunacoil/directional/north{ + pixel_x = 6 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/skatepark) +"abs" = ( +/obj/structure/chair/sofa/corp{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"abt" = ( +/mob/living/carbon/human/npc/shop, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/clothing_store) +"abu" = ( +/obj/structure/roofstuff, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"abv" = ( +/obj/item/reagent_containers/spray/pepper, +/obj/item/reagent_containers/spray/pepper, +/obj/item/reagent_containers/spray/pepper, +/obj/item/shield/riot, +/obj/item/shield/riot, +/obj/item/shield/riot, +/obj/item/storage/box/teargas, +/obj/item/storage/box/flashbangs, +/obj/item/megaphone, +/obj/item/megaphone, +/obj/structure/closet/crate, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"abw" = ( +/obj/item/kirbyplants/darkpack/random, +/obj/structure/table/modern, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"abx" = ( +/turf/open/floor/city/industrial/large, +/area/vtm/interior/shop) +"aby" = ( +/obj/structure/table, +/obj/item/storage/box/handcuffs{ + pixel_y = 15 + }, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"abz" = ( +/obj/effect/decal/wallpaper/red, +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/shop) +"abA" = ( +/obj/machinery/sprinkler, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"abB" = ( +/obj/structure/steps/directional/north, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"abC" = ( +/obj/structure/railing, +/obj/structure/chair/comfy/darkpack/green{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"abD" = ( +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"abE" = ( +/obj/structure/chair/sofa/corp/right, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"abF" = ( +/obj/effect/decal/cleanable/trash, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer/nosferatu_town) +"abH" = ( +/obj/structure/vampdoor/prison, +/obj/effect/mapping_helpers/door/access/police, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/eight, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"abI" = ( +/obj/structure/fence/door, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/endron_logging) +"abJ" = ( +/obj/effect/turf_decal/bordur{ + dir = 5 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"abK" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"abL" = ( +/obj/machinery/photocopier/prebuilt, +/turf/open/floor/plating/granite/black, +/area/vtm/westfield_mall/interior/camarilla) +"abM" = ( +/obj/structure/closet/cardboard, +/obj/item/storage/box/fireworks, +/obj/item/storage/box/fireworks, +/obj/item/storage/box/fireworks, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"abN" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"abO" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/westfield_mall/interior/chantry) +"abP" = ( +/obj/structure/table/wood/fancy/royalblack, +/obj/effect/turf_decal/siding/wood/light{ + dir = 8 + }, +/turf/open/floor/plating/granite/black, +/area/vtm/westfield_mall/interior/camarilla) +"abQ" = ( +/obj/structure/vampdoor/old{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/arcade) +"abR" = ( +/obj/structure/platform/lowwall/brick_old, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/skatepark) +"abS" = ( +/turf/closed/wall/vampwall/rock, +/area/vtm/westfield_mall/interior/endron_logging) +"abT" = ( +/obj/structure/rack/clothing/rand, +/obj/machinery/light/blacklight/directional/south, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/smokeshop) +"abU" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/hot_ishu) +"abV" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"abW" = ( +/mob/living/carbon/human/npc/bacotell, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/city/bacotell, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"abX" = ( +/obj/structure/rack/food{ + dir = 4; + pixel_x = -8; + pixel_y = 5 + }, +/obj/effect/spawner/random/entertainment/toy_figure{ + pixel_x = -10 + }, +/obj/effect/spawner/random/entertainment/toy_figure{ + pixel_x = 2; + pixel_y = 9 + }, +/obj/effect/spawner/random/entertainment/toy_figure{ + pixel_x = -8; + pixel_y = 18 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"abY" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"abZ" = ( +/obj/structure/vampdoor/wood/npc{ + dir = 8 + }, +/turf/open/floor/wood/old, +/area/vtm/interior) +"aca" = ( +/obj/effect/spawner/random/structure/billboard, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall) +"acb" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer) +"acc" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"acd" = ( +/obj/structure/chair/wood/darkpack{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack/greengold, +/area/vtm/westfield_mall/interior/games_store) +"ace" = ( +/obj/structure/table, +/obj/item/gun/ballistic/shotgun/vampire{ + pixel_y = 12; + pixel_x = -4 + }, +/obj/item/ammo_box/darkpack/c12g{ + pixel_y = 1; + pixel_x = 10 + }, +/obj/item/molotov{ + pixel_x = -9; + pixel_y = 1 + }, +/turf/open/floor/carpet/darkpack/blackgold, +/area/vtm/westfield_mall/interior/techshop) +"acg" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, +/obj/machinery/light/blacklight/directional/south, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"ach" = ( +/obj/machinery/light_switch/directional/north, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"aci" = ( +/obj/structure/table/wood, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"acj" = ( +/obj/structure/chair/wood/darkpack/red{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"ack" = ( +/obj/structure/stairs/east, +/obj/structure/railing, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"acl" = ( +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"acm" = ( +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/vet_clinic) +"acn" = ( +/obj/machinery/light/warm/directional/south, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer/nosferatu_town) +"aco" = ( +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"acp" = ( +/obj/structure/bookcase/random, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"acq" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"acr" = ( +/obj/structure/sign/poster/city/pixies/directional/north{ + pixel_x = 2 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"acs" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/dark, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/interior/clinic) +"act" = ( +/obj/darkpack_car/retro/rand, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"acu" = ( +/obj/structure/vampdoor/old{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/npc, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"acw" = ( +/obj/structure/table, +/obj/item/gun/ballistic/automatic/pistol/darkpack/glock21, +/obj/item/gun/ballistic/automatic/pistol/darkpack/glock21, +/obj/item/ammo_box/magazine/glock45acp, +/obj/item/ammo_box/magazine/glock45acp, +/obj/item/ammo_box/magazine/glock45acp, +/obj/item/ammo_box/magazine/glock45acp, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/anarch) +"acy" = ( +/obj/structure/closet/secure_closet/freezer/fridge/all_access, +/obj/item/reagent_containers/cup/glass/coffee/vampire{ + volume = 25; + list_reagents = list(/datum/reagent/consumable/coffee = 15) + }, +/obj/item/food/fries, +/obj/item/food/burger, +/obj/item/reagent_containers/cup/soda_cans/pwr_game, +/obj/item/reagent_containers/cup/soda_cans/pwr_game, +/obj/item/reagent_containers/cup/soda_cans/pwr_game, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"acz" = ( +/turf/closed/wall/vampwall/rock, +/area/vtm/interior/supply) +"acA" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/theatre) +"acB" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/green, +/area/vtm/westfield_mall/interior/anarch) +"acC" = ( +/obj/structure/transport/linear, +/obj/effect/landmark/transport/transport_id{ + specific_transport_id = "mall_elevator_1" + }, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/interior/elevator) +"acD" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/janitor) +"acE" = ( +/obj/structure/rack/clothing/rand, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/clothing_store) +"acF" = ( +/obj/structure/fence{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/endron_logging) +"acG" = ( +/obj/structure/table/countertop/red, +/obj/structure/sink/basin/directional/north{ + pixel_y = -8 + }, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"acH" = ( +/obj/effect/decal/pallet, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"acI" = ( +/obj/item/melee/skateboard/holyboard{ + desc = "He shredded for our sins." + }, +/obj/effect/decal/wallpaper/stone, +/turf/closed/wall/vampwall/brick_old, +/area/vtm/westfield_mall/interior/skatepark) +"acK" = ( +/obj/structure/fluff/tram_rail{ + dir = 4; + pixel_x = -8; + pixel_y = -8 + }, +/obj/effect/turf_decal/bordur/end{ + dir = 1 + }, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/skatepark) +"acL" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 1 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"acM" = ( +/obj/structure/reagent_dispensers/water_cooler{ + pixel_y = 23; + density = 0; + pixel_x = -1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"acN" = ( +/obj/structure/table/wood, +/obj/machinery/microwave, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"acO" = ( +/obj/structure/table/wood, +/turf/open/misc/dirt, +/area/vtm/interior/sewer) +"acP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/pallet, +/obj/item/grown/log/tree, +/obj/item/grown/log/tree, +/obj/item/grown/log/tree, +/obj/item/grown/log, +/obj/item/grown/log, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"acQ" = ( +/obj/structure/railing, +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"acR" = ( +/obj/structure/transport/linear, +/obj/machinery/elevator_control_panel/directional/north{ + linked_elevator_id = "mall_elevator_1"; + preset_destination_names = list("2" = "Lower", "3" = "Upper") + }, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/interior/elevator) +"acS" = ( +/mob/living/basic/corvid/crow, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"acT" = ( +/obj/effect/turf_decal/siding/grey/corner{ + dir = 1 + }, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/supply) +"acV" = ( +/obj/structure/vampdoor/glass{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/underground_parking) +"acW" = ( +/obj/structure/rack/food/rand, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"acX" = ( +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"acY" = ( +/turf/closed/wall/vampwall/market, +/area/vtm/westfield_mall/interior/maintenance) +"acZ" = ( +/obj/machinery/light/dim/directional/east, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"ada" = ( +/obj/item/plate, +/obj/structure/table/reinforced, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"add" = ( +/obj/structure/fence, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/endron_logging) +"ade" = ( +/obj/structure/rack, +/obj/item/assembly/signaler{ + pixel_x = 7; + pixel_y = 11 + }, +/obj/item/assembly/signaler{ + pixel_x = -2; + pixel_y = 10 + }, +/obj/item/assembly/signaler{ + pixel_x = -2; + pixel_y = 7 + }, +/obj/item/assembly/signaler/low_range{ + pixel_x = 8; + pixel_y = 2 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"adf" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/eighties, +/area/vtm/westfield_mall/interior/arcade) +"adg" = ( +/turf/open/misc/grass/random/grass, +/area/vtm/westfield_mall) +"adh" = ( +/obj/effect/landmark/npcactivity, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"adi" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"adj" = ( +/turf/closed/wall/vampwall/rock, +/area/vtm/westfield_mall/interior/cave) +"adk" = ( +/obj/machinery/light/directional/south, +/obj/structure/chair/darkpack/blue{ + dir = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"adl" = ( +/obj/effect/turf_decal/bordur/corner/inverse{ + dir = 8 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"adm" = ( +/obj/effect/decal/wallpaper/grey/low{ + color = "#585858" + }, +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/interior/shop) +"adn" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping9" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"ado" = ( +/obj/effect/decal/cleanable/trash, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"adp" = ( +/obj/structure/chair/sofa/corner/brown, +/obj/structure/sign/poster/city/dmc/directional/north, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"adq" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping43" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"adr" = ( +/obj/structure/table/wood, +/obj/item/gun/ballistic/revolver/darkpack/snub{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/ballistic/revolver/darkpack/snub{ + pixel_x = 11; + pixel_y = 2 + }, +/turf/open/misc/dirt, +/area/vtm/interior/sewer) +"ads" = ( +/obj/machinery/light/dim/directional/north, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"adu" = ( +/obj/structure/flora/rock/darkpack, +/turf/open/floor/plating/rough/cave, +/area/vtm/westfield_mall/interior) +"adv" = ( +/obj/structure/platform/lowwall/brick, +/turf/open/floor/plating/rough, +/area/vtm/interior/supply) +"adw" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/computer/libraryconsole/bookmanagement, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"adx" = ( +/obj/effect/decal/support, +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior) +"ady" = ( +/obj/structure/mirror/directional/north, +/obj/structure/sink/directional/south, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/techshop) +"adz" = ( +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/skatepark) +"adA" = ( +/obj/structure/table/wood, +/obj/structure/sign/poster/city/bloodrayne/directional/north{ + pixel_x = 7; + pixel_y = 33 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"adB" = ( +/obj/structure/stairs/ramp/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/skatepark) +"adC" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/suit/costume/pirate, +/obj/item/clothing/shoes/pirate, +/obj/item/clothing/head/costume/pirate, +/obj/item/clothing/under/costume/pirate, +/obj/item/clothing/head/costume/pirate/captain, +/obj/item/clothing/suit/costume/dracula, +/obj/item/clothing/under/costume/draculass, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"adD" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/watering_can/metal, +/obj/effect/decal/pallet, +/obj/machinery/light/directional/south, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"adE" = ( +/obj/structure/table/countertop/black, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/shop) +"adF" = ( +/obj/effect/turf_decal/siding/dark/corner{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"adG" = ( +/obj/structure/table/wood, +/obj/item/kirbyplants/darkpack/plant5{ + pixel_x = -9; + pixel_y = 18 + }, +/turf/open/floor/wood/herring, +/area/vtm/interior/littleitaly) +"adH" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"adI" = ( +/obj/structure/rack/food/rand, +/obj/machinery/light/directional/north, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"adJ" = ( +/obj/structure/closet/secure_closet/freezer/empty/open, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"adK" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/figure/secofficer{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/toy/figure/warden{ + pixel_x = 2 + }, +/obj/item/toy/figure/hos{ + pixel_x = 7; + pixel_y = 9 + }, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"adL" = ( +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/interior/supply) +"adM" = ( +/obj/structure/railing, +/obj/item/kirbyplants/random/dead{ + desc = "It doesn't look very healthy..."; + name = "dead plant"; + pixel_y = 7 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"adN" = ( +/obj/structure/closet/crate, +/obj/item/clothing/suit/vampire/vest/police, +/obj/item/clothing/suit/vampire/vest/police, +/obj/item/clothing/suit/vampire/vest/police, +/obj/item/clothing/suit/vampire/vest/police, +/obj/item/clothing/head/vampire/helmet, +/obj/item/clothing/head/vampire/helmet, +/obj/item/clothing/head/vampire/helmet, +/obj/item/clothing/head/vampire/helmet, +/obj/item/clothing/gloves/tackler/combat/insulated, +/obj/item/clothing/gloves/tackler/combat/insulated, +/obj/item/clothing/gloves/tackler/combat/insulated, +/obj/item/clothing/gloves/tackler/combat/insulated, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"adO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"adP" = ( +/obj/structure/rack/food{ + dir = 8; + pixel_x = -13; + pixel_y = 11 + }, +/obj/item/food/popcorn{ + pixel_x = 1; + pixel_y = 10 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"adQ" = ( +/obj/structure/chair/comfy/darkpack/dark, +/obj/effect/landmark/start/darkpack/voivode/voivode, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"adR" = ( +/obj/effect/decal/wallpaper, +/obj/effect/decal/wallpaper/papers/three, +/turf/closed/wall/vampwall/junk/alt, +/area/vtm/interior/sewer/nosferatu_town) +"adS" = ( +/obj/structure/table/wood, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/clothing_store) +"adT" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"adU" = ( +/obj/effect/spawner/random/stray_animal, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"adV" = ( +/turf/open/water/vamp_sewer, +/area/vtm/interior/sewer) +"adW" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 8 + }, +/turf/open/floor/carpet/darkpack/bluesilver, +/area/vtm/westfield_mall/interior/theatre) +"adX" = ( +/obj/structure/chair/plastic, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"adY" = ( +/turf/closed/indestructible/the_matrix, +/area/vtm/interior/sewer) +"adZ" = ( +/obj/structure/table/modern, +/obj/machinery/light/blacklight/directional/north, +/obj/item/seeds/cannabis{ + pixel_x = 6; + pixel_y = 9; + anchored = 1 + }, +/obj/item/seeds/cannabis{ + pixel_x = -7; + pixel_y = 9; + anchored = 1 + }, +/obj/item/cigarette/rollie/cannabis{ + pixel_x = 7; + pixel_y = 1 + }, +/obj/item/cigarette/rollie/cannabis{ + pixel_x = 6; + pixel_y = -3 + }, +/obj/item/cigarette/rollie/cannabis{ + pixel_x = -2; + pixel_y = -3 + }, +/obj/item/cigarette/rollie/cannabis{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/effect/spawner/random/entertainment/lighter{ + pixel_x = -8; + pixel_y = -1 + }, +/obj/effect/decal/wallpaper/grey{ + pixel_y = 32 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"aea" = ( +/obj/structure/chair/plastic/darkpack, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt) +"aeb" = ( +/obj/structure/table/wood, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aec" = ( +/obj/machinery/hydroponics/simple/plastic, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"aed" = ( +/obj/structure/table/countertop/red, +/obj/item/food/popcorn, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"aee" = ( +/obj/structure/closet/crate/trashcart/laundry, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/shop) +"aef" = ( +/obj/effect/turf_decal/siding/white/inner_corner{ + dir = 8 + }, +/turf/open/floor/city/circled, +/area/vtm/interior/shop) +"aeg" = ( +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/janitor) +"aeh" = ( +/obj/structure/vampfence/corner/rich{ + dir = 4; + icon_state = "fence_end" + }, +/obj/effect/turf_decal/bordur/corner{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"aei" = ( +/obj/structure/chair/office/darkpack/blue{ + dir = 8 + }, +/obj/effect/landmark/start/darkpack/camarilla/towerwork, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/maintenance) +"aej" = ( +/obj/machinery/computer/operating{ + dir = 1 + }, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"aek" = ( +/obj/structure/platform/lowwall/brick_old/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/skatepark) +"ael" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aem" = ( +/obj/effect/landmark/npcability, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aen" = ( +/obj/structure/closet/secure_closet/freezer/fridge/all_access, +/obj/item/reagent_containers/blood/vitae, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/church) +"aeo" = ( +/obj/structure/table, +/obj/item/seeds/cannabis{ + pixel_y = 11 + }, +/obj/item/seeds/cannabis{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/seeds/cannabis{ + pixel_x = 3; + pixel_y = 7 + }, +/obj/item/seeds/cannabis{ + pixel_x = -2; + pixel_y = 7 + }, +/obj/item/seeds/cannabis{ + pixel_y = 3 + }, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"aep" = ( +/obj/effect/decal/wallpaper/paper/stripe, +/turf/closed/wall/vampwall/junk, +/area/vtm/interior/sewer) +"aeq" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating/roofwalk/cobblestones, +/area/vtm/westfield_mall) +"aer" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/interior/bianchiBank) +"aes" = ( +/obj/darkpack_car/retro/rand{ + dir = 4 + }, +/obj/effect/turf_decal/bordur/inverse, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"aet" = ( +/obj/structure/table/reinforced, +/obj/item/gun/energy/taser/darkpack, +/obj/item/gun/energy/taser/darkpack, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aeu" = ( +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/endron_logging) +"aev" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping12" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aew" = ( +/obj/structure/table/countertop/black, +/obj/structure/sink/basin/directional/north{ + pixel_y = -5 + }, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aex" = ( +/obj/structure/platform/lowwall/painted/window/reinforced, +/turf/open/floor/plating/rough, +/area/vtm/interior/bianchiBank) +"aey" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/city/bacotell, +/area/vtm/interior/littleitaly) +"aez" = ( +/obj/structure/stairs/east, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aeA" = ( +/mob/living/carbon/human/npc/hobo, +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer) +"aeB" = ( +/obj/effect/decal/remains/human{ + name = "king" + }, +/turf/open/misc/grass/random/grass, +/area/vtm/westfield_mall/forest) +"aeC" = ( +/obj/effect/decal/pallet, +/obj/structure/closet/crate/large, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aeD" = ( +/obj/structure/chair/sofa/corp{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aeE" = ( +/obj/structure/vampdoor, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"aeF" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aeG" = ( +/obj/structure/vampdoor/simple{ + dir = 4 + }, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"aeH" = ( +/turf/closed/wall/vampwall/rock, +/area/vtm/westfield_mall/interior) +"aeI" = ( +/obj/structure/vampdoor/reinf, +/obj/effect/mapping_helpers/door/access/police, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"aeJ" = ( +/obj/effect/decal/pallet, +/obj/structure/closet/crate/cardboard, +/obj/machinery/light/directional/north, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/janitor) +"aeK" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer/nosferatu_town) +"aeM" = ( +/obj/effect/turf_decal/siding/wood/light{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aeN" = ( +/obj/structure/table, +/obj/underplate, +/obj/vampire_computer/prince, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"aeO" = ( +/obj/machinery/light/cold/directional/south, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aeP" = ( +/obj/structure/barrels/rand, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aeQ" = ( +/obj/structure/chair/wood/darkpack/red, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aeR" = ( +/obj/machinery/camera/autoname/directional/west, +/turf/open/misc/grass/random/grass, +/area/vtm/westfield_mall) +"aeS" = ( +/obj/effect/turf_decal/asphalt, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"aeT" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aeU" = ( +/obj/structure/table/wood/poker, +/obj/item/paper_bin, +/obj/effect/spawner/random/bureaucracy/pen, +/obj/effect/spawner/random/bureaucracy/pen, +/obj/effect/spawner/random/bureaucracy/pen, +/obj/effect/spawner/random/bureaucracy/pen, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aeV" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aeW" = ( +/turf/closed/wall/vampwall/rock, +/area/vtm/interior/sewer) +"aeX" = ( +/obj/structure/flora/rock/darkpack, +/turf/open/misc/grass/random, +/area/vtm/westfield_mall/forest) +"aeY" = ( +/obj/structure/filingcabinet/white{ + pixel_x = -12 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/theatre) +"aeZ" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"afa" = ( +/obj/item/chair/wood/darkpack, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"afb" = ( +/obj/structure/hedge, +/obj/effect/spawner/random/flora/flowers, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall) +"afc" = ( +/obj/structure/chair/comfy/darkpack/red{ + dir = 4 + }, +/obj/item/trash/popcorn, +/turf/open/floor/carpet/darkpack/bluesilver, +/area/vtm/westfield_mall/interior/theatre) +"afd" = ( +/obj/effect/decal/coastline{ + dir = 5 + }, +/turf/open/misc/beach/vamp, +/area/vtm/westfield_mall/forest) +"afe" = ( +/obj/structure/bed, +/obj/structure/bed{ + pixel_y = 11 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"aff" = ( +/obj/structure/table/wood, +/obj/structure/desk_bell, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"afg" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/janitor) +"afh" = ( +/obj/item/storage/belt/sheath/vamp/sword, +/obj/structure/table/wood/fancy/black, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"afi" = ( +/obj/effect/decal/pallet, +/obj/structure/table/wood, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"afj" = ( +/obj/effect/decal/cleanable/trash, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"afk" = ( +/obj/machinery/light/floor, +/turf/open/misc/grass, +/area/vtm/westfield_mall/interior) +"afl" = ( +/obj/structure/rack/food, +/obj/effect/spawner/random/entertainment/plushie{ + pixel_y = 9 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"afm" = ( +/obj/structure/flora/tree/vamp/pine, +/turf/open/misc/grass/random/bushes, +/area/vtm/westfield_mall/forest) +"afn" = ( +/obj/structure/chair/office/darkpack/red{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"afo" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior) +"afp" = ( +/obj/structure/sink/basin/directional/west, +/obj/structure/table/countertop/black, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"afq" = ( +/obj/structure/rack/clothing/rand{ + dir = 8 + }, +/obj/machinery/light/blacklight/directional/north, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"afr" = ( +/obj/structure/table/countertop/red, +/obj/machinery/processor, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"afs" = ( +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/roof) +"aft" = ( +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/anarch) +"afv" = ( +/obj/structure/closet/secure_closet/freezer/empty, +/obj/item/storage/box/coffeepack, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/milk, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"afw" = ( +/obj/effect/spawner/random/trash/mess, +/obj/machinery/light/small/directional/north, +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) +"afx" = ( +/obj/machinery/light/directional/north{ + pixel_x = -16 + }, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"afy" = ( +/obj/effect/decal/wallpaper, +/turf/closed/wall/vampwall/junk/alt, +/area/vtm/interior/sewer/nosferatu_town) +"afz" = ( +/obj/structure/closet/cardboard, +/mob/living/basic/pet/cat/darkpack{ + name = "Drimbus" + }, +/mob/living/basic/pet/cat/darkpack{ + name = "Glimbus" + }, +/mob/living/basic/pet/cat/darkpack{ + name = "Mr Chef" + }, +/mob/living/basic/pet/cat/darkpack{ + name = "Roginald" + }, +/mob/living/basic/pet/cat/darkpack{ + name = "Spoingus"; + desc = "A stray cat thats taken up residence on the clinic's roof. Likes to be fed bits of cereal." + }, +/mob/living/basic/pet/cat/darkpack{ + name = "Thorgax" + }, +/mob/living/basic/pet/cat/darkpack{ + name = "Zloopus" + }, +/turf/open/floor/carpet, +/area/awaymission/errorroom) +"afA" = ( +/obj/structure/table/wood/fancy/blue, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/camarilla) +"afB" = ( +/obj/structure/safe, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/sheet/mineral/gold/fifty, +/obj/item/clothing/accessory/medal/gold/heroism, +/turf/open/floor/city/plating, +/area/vtm/interior/bianchiBank) +"afC" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack, +/area/vtm/interior/clinic) +"afD" = ( +/obj/structure/sink/directional/south, +/obj/structure/mirror/directional/north, +/obj/effect/decal/wallpaper/grey{ + pixel_y = 32 + }, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/hot_ishu) +"afE" = ( +/turf/open/floor/city/plating_stone, +/area/vtm/interior/bianchiBank) +"afF" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/theatre) +"afG" = ( +/obj/effect/decal/rugs, +/turf/open/floor/plating/rough{ + icon_state = "carpet_black" + }, +/area/vtm/interior/sewer/nosferatu_town) +"afH" = ( +/obj/structure/table/wood/fancy/purple, +/obj/effect/spawner/random/entertainment/toy, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"afI" = ( +/obj/effect/turf_decal/bordur/inverse, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall) +"afJ" = ( +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"afK" = ( +/obj/effect/decal/coastline/corner{ + dir = 4 + }, +/turf/open/misc/beach/vamp, +/area/vtm/westfield_mall/forest) +"afL" = ( +/obj/machinery/stove, +/turf/open/floor/city/bacotell, +/area/vtm/interior/littleitaly) +"afM" = ( +/obj/item/stack/dollar/five, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"afN" = ( +/obj/effect/decal/rugs, +/obj/structure/closet/mini_fridge, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/turf/open/floor/plating/rough{ + icon_state = "carpet_black" + }, +/area/vtm/interior/sewer/nosferatu_town) +"afO" = ( +/obj/machinery/door/poddoor/shutters{ + dir = 8; + elevator_mode = 1; + transport_linked_id = "mall_elevator_1" + }, +/turf/open/floor/city/plating, +/area/vtm/interior/elevator) +"afP" = ( +/obj/structure/vampdoor/glass/pentex, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"afQ" = ( +/obj/structure/closet/secure_closet/freezer/meat/all_access, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"afR" = ( +/obj/structure/vampdoor, +/obj/effect/mapping_helpers/door/access/wolftech, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/techshop) +"afS" = ( +/obj/structure/filingcabinet/white, +/turf/open/floor/carpet/darkpack/cyan, +/area/vtm/westfield_mall/interior/vet_clinic) +"afT" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"afU" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 10 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"afV" = ( +/obj/structure/table/wood, +/obj/item/clothing/neck/petcollar{ + pixel_x = 1; + pixel_y = 4 + }, +/obj/item/clothing/neck/petcollar{ + pixel_x = 6; + pixel_y = 10 + }, +/obj/item/clothing/neck/petcollar{ + pixel_x = -7; + pixel_y = 9 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"afW" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 5 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"afX" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"afY" = ( +/obj/structure/chair/sofa/city_bench/metal/left/black{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"afZ" = ( +/obj/structure/railing/wooden_fence, +/obj/structure/table/countertop, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"aga" = ( +/turf/open/floor/eighties, +/area/vtm/westfield_mall/interior/arcade) +"agb" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"agc" = ( +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/maintenance/basement) +"agd" = ( +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/parking_lot) +"age" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"agf" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping5" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"agg" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/coffee_condi_display{ + pixel_x = -3; + pixel_y = 10 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"agh" = ( +/obj/structure/vampdoor/simple, +/obj/effect/mapping_helpers/door/access/npc, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"agi" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 9 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"agj" = ( +/obj/effect/decal/pallet, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"agk" = ( +/obj/effect/decal/support, +/obj/structure/flora/rock/darkpack, +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior) +"agl" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior/endron_logging) +"agm" = ( +/obj/effect/decal/pallet, +/obj/structure/closet/crate/wooden/communitygardens/tools, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"agn" = ( +/obj/effect/turf_decal/bordur{ + dir = 10 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"ago" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"agp" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"agq" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/bathroom) +"agr" = ( +/obj/effect/turf_decal/siding/white/corner{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"ags" = ( +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall) +"agt" = ( +/obj/structure/sign/poster/city/dmc/directional/north, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"agu" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"agv" = ( +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/maintenance/basement) +"agw" = ( +/turf/open/openspace, +/area/vtm/interior/shop) +"agx" = ( +/obj/structure/flatpack_cart, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"agy" = ( +/obj/structure/vampfence/rich, +/turf/open/water/vamp_sewer, +/area/vtm/interior/sewer) +"agz" = ( +/obj/structure/table/wood, +/obj/machinery/light/prince/broken/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"agA" = ( +/obj/structure/table/wood, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/shop) +"agB" = ( +/obj/item/kirbyplants/darkpack/random, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"agC" = ( +/obj/structure/rack, +/obj/item/flashlight, +/obj/machinery/light/prince/broken/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"agD" = ( +/obj/structure/coclock/grandpa, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"agE" = ( +/obj/structure/table, +/obj/vampire_computer, +/obj/machinery/light/blacklight/directional/east, +/obj/underplate, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"agF" = ( +/obj/machinery/light/cold/directional/north, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"agG" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/techshop) +"agH" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 5 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"agI" = ( +/obj/effect/decal/rugs, +/obj/effect/decal/rugs, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/start/darkpack/primogen/nosferatu, +/turf/open/floor/plating/rough{ + icon_state = "carpet_black" + }, +/area/vtm/interior/sewer/nosferatu_town) +"agJ" = ( +/obj/effect/spawner/random/trash/grime, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"agK" = ( +/obj/structure/vampdoor/woodglass, +/turf/open/floor/carpet/darkpack/hotel, +/area/vtm/interior/shop) +"agL" = ( +/obj/structure/filingcabinet/medical{ + pixel_x = 5 + }, +/obj/structure/filingcabinet{ + pixel_x = -7 + }, +/turf/open/floor/carpet/darkpack, +/area/vtm/interior/clinic) +"agM" = ( +/obj/effect/decal/cleanable/trash, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"agN" = ( +/obj/structure/platform/lowwall/market/window, +/turf/open/floor/plating/rough, +/area/vtm/interior/shop) +"agO" = ( +/obj/effect/decal/wallpaper/blue, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/janitor) +"agP" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/item/flashlight/lamp{ + pixel_x = -2; + pixel_y = 10 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/underground_parking) +"agQ" = ( +/obj/structure/closet, +/obj/item/gun/ballistic/automatic/darkpack/ar15, +/obj/item/gun/ballistic/automatic/darkpack/ar15, +/obj/item/ammo_box/magazine/darkpack556, +/obj/item/ammo_box/magazine/darkpack556, +/obj/item/ammo_box/magazine/darkpack556, +/obj/item/ammo_box/magazine/darkpack556, +/obj/item/ammo_box/darkpack/c556, +/obj/item/ammo_box/darkpack/c556, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"agR" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/clinic) +"agS" = ( +/obj/effect/decal/pallet, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"agT" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/obj/structure/lamppost/sidewalk, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"agU" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/light/directional/south, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"agV" = ( +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/theatre) +"agW" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"agX" = ( +/obj/machinery/sprinkler, +/turf/open/floor/city/plating_stone, +/area/vtm/interior/bianchiBank) +"agY" = ( +/obj/structure/chair/sofa/corp{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/camarilla/harpy, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/camarilla) +"agZ" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aha" = ( +/obj/item/fish/darkpack/catfish, +/turf/open/water/acid, +/area/vtm/westfield_mall/forest) +"ahb" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"ahc" = ( +/obj/structure/ladder/manhole/up, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"ahd" = ( +/obj/structure/bed/maint, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/cockroach/sewer, +/turf/open/floor/wood/old, +/area/vtm/interior) +"ahe" = ( +/obj/structure/table/countertop, +/obj/item/ammo_box/darkpack/c556, +/obj/item/ammo_box/darkpack/c556{ + pixel_x = 9 + }, +/obj/item/ammo_box/darkpack/c556{ + pixel_x = -9 + }, +/obj/item/ammo_box/magazine/darkpack556/hunt{ + pixel_x = 1; + pixel_y = 10 + }, +/obj/item/ammo_box/magazine/darkpack556/hunt{ + pixel_x = -2; + pixel_y = 10 + }, +/obj/item/ammo_box/magazine/darkpack556/hunt{ + pixel_x = -8; + pixel_y = 10 + }, +/obj/item/ammo_box/magazine/darkpackthompson{ + pixel_x = 17; + pixel_y = 11 + }, +/obj/item/ammo_box/magazine/darkpackthompson{ + pixel_x = 12; + pixel_y = 11 + }, +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/interior/supply) +"ahf" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/chantry/archivist, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/westfield_mall/interior/chantry) +"ahg" = ( +/obj/structure/table/wood, +/obj/item/chair/wood/darkpack, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"ahh" = ( +/obj/structure/table/wood, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"ahi" = ( +/obj/effect/decal/wallpaper/low, +/turf/closed/wall/vampwall/junk, +/area/vtm/interior/sewer/nosferatu_town) +"ahj" = ( +/obj/structure/rack/food, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"ahk" = ( +/obj/structure/table, +/obj/item/surgery_tray/full, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"ahl" = ( +/obj/effect/decal/shadow, +/obj/structure/flora/rock/darkpack, +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior) +"ahm" = ( +/obj/effect/decal/pallet, +/obj/effect/spawner/random/engineering/tool_advanced, +/obj/effect/spawner/random/engineering/tool_advanced, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"ahn" = ( +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/janitor) +"aho" = ( +/obj/effect/turf_decal/asphaltline/alt{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"ahp" = ( +/obj/effect/decal/rugs, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"ahq" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"ahr" = ( +/obj/structure/rack/food, +/obj/effect/spawner/random/engineering/vending_restock, +/obj/effect/spawner/random/engineering/vending_restock, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"ahs" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/turf/open/floor/plating/rough{ + icon_state = "carpet_black" + }, +/area/vtm/interior/sewer/nosferatu_town) +"aht" = ( +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"ahu" = ( +/obj/item/clothing/suit/caution, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"ahv" = ( +/obj/structure/toilet{ + dir = 4; + pixel_y = 4 + }, +/obj/effect/spawner/random/trash/mess, +/obj/machinery/light/small/directional/west, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"ahw" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"ahx" = ( +/obj/effect/turf_decal/bordur/corner, +/obj/effect/landmark/npcability, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"ahy" = ( +/obj/structure/sign/warning/docking{ + pixel_y = 18; + name = "\improper WARNING: UNDERWATER CAVE sign"; + desc = "STOP. PREVENT YOUR DEATH! THERE'S NOTHING IN THIS CAVE WORTH DYING FOR!"; + sign_change_name = "Warning - Underwater Cave" + }, +/obj/structure/fence{ + pixel_y = 7; + name = "post" + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"ahz" = ( +/obj/effect/decal/wallpaper/red, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/hot_ishu) +"ahA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/pallet, +/obj/item/grown/log/tree, +/obj/item/grown/log, +/obj/item/grown/log, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"ahB" = ( +/obj/structure/closet, +/obj/item/clothing/under/vampire/police, +/obj/item/clothing/under/vampire/police/long, +/obj/item/clothing/under/vampire/police/pants, +/obj/item/clothing/under/vampire/police/turtleneck, +/obj/item/clothing/under/vampire/police/utility, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"ahC" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 9 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"ahD" = ( +/obj/effect/turf_decal/asphaltline/alt{ + dir = 4 + }, +/obj/effect/turf_decal/asphaltline/alt, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"ahE" = ( +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior) +"ahF" = ( +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"ahG" = ( +/obj/effect/decal/wallpaper/paper/darkred, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/clothing_store) +"ahH" = ( +/obj/machinery/light/prince/directional/east, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"ahI" = ( +/obj/machinery/light/dim/directional/west, +/obj/structure/chair/comfy/brown{ + color = "#50C878"; + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/sewer/nosferatu_town) +"ahK" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/structure/roadsign{ + icon_state = "wrongway"; + pixel_y = 10 + }, +/obj/effect/decal/cleanable/garbage{ + pixel_x = -6; + pixel_y = -6 + }, +/obj/effect/decal/cleanable/cardboard, +/obj/effect/decal/cleanable/trash, +/obj/machinery/light/small/red/directional/east, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"ahL" = ( +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"ahM" = ( +/obj/structure/table/modern, +/obj/underplate, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"ahN" = ( +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/underground_parking) +"ahO" = ( +/obj/structure/closet/cardboard, +/obj/item/stack/sheet/mineral/wood/fifty, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"ahP" = ( +/obj/structure/table/reinforced, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"ahQ" = ( +/obj/structure/vampfence/rich{ + dir = 4 + }, +/obj/structure/platform/lowwall/junk, +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer) +"ahR" = ( +/mob/living/carbon/human/npc/police, +/obj/structure/chair/office/darkpack/blue{ + dir = 4 + }, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"ahS" = ( +/obj/effect/turf_decal/siding/wood/light{ + dir = 1 + }, +/obj/structure/hedge, +/obj/effect/spawner/random/flora/flowers, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"ahT" = ( +/obj/effect/turf_decal/bordur{ + dir = 5 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"ahU" = ( +/obj/effect/turf_decal/bordur/corner, +/obj/effect/turf_decal/bordur{ + dir = 8 + }, +/turf/open/water, +/area/vtm/westfield_mall/forest) +"ahV" = ( +/obj/structure/table, +/obj/item/restraints/handcuffs, +/obj/item/restraints/handcuffs, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"ahW" = ( +/obj/structure/vampipe{ + pixel_y = 32 + }, +/obj/effect/turf_decal/asphalt, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"ahX" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = 4; + pixel_y = 11 + }, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_y = 16 + }, +/obj/item/storage/fancy/cigarettes/cigars/havana, +/obj/effect/spawner/random/special_lighter{ + pixel_x = -6; + pixel_y = 6 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"ahY" = ( +/turf/open/openspace, +/area/vtm/westfield_mall) +"ahZ" = ( +/obj/structure/platform/lowwall/market/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/chantry) +"aia" = ( +/obj/item/toy/basketball{ + pixel_x = 9; + pixel_y = 27 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"aib" = ( +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"aic" = ( +/obj/structure/mop_bucket/janitorialcart, +/obj/item/mop, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aid" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/suit/vampire/trench, +/obj/item/clothing/under/suit/black_really, +/obj/item/clothing/under/suit/charcoal, +/obj/item/clothing/under/suit/black_really/skirt, +/obj/item/clothing/under/suit/black, +/obj/item/clothing/under/suit/black/skirt, +/obj/item/clothing/suit/vampire/orthodox, +/obj/item/clothing/suit/vampire/noddist, +/obj/item/clothing/suit/vampire/imam, +/obj/item/clothing/head/chaplain/nun_hood, +/obj/item/clothing/head/vampire/taqiyah, +/obj/item/clothing/suit/chaplainsuit/nun, +/obj/item/clothing/head/vampire/noddist_mask, +/obj/item/clothing/head/vampire/hijab, +/obj/item/clothing/head/vampire/prayer_veil, +/obj/item/clothing/suit/hooded/robes/black, +/obj/item/clothing/mask/vampire/balaclava, +/obj/item/clothing/head/vampire/kalimavkion, +/obj/item/clothing/under/vampire/suit, +/obj/item/clothing/under/vampire/suit/female, +/obj/item/clothing/under/vampire/graveyard, +/obj/item/vamp/keys/lasombra, +/obj/item/vamp/keys/lasombra, +/obj/item/vamp/keys/lasombra, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"aie" = ( +/obj/structure/chair/comfy/darkpack/blue, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/interior/police) +"aif" = ( +/obj/structure/chair/office, +/obj/effect/landmark/start/darkpack/chantry/archivist, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aig" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/city/bacotell, +/area/vtm/interior/shop) +"aih" = ( +/obj/effect/decal/cleanable/cardboard, +/obj/vehicle/ridden/atv, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/endron_logging) +"aii" = ( +/obj/structure/vampdoor/old{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/clerk, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aij" = ( +/obj/effect/decal/pallet, +/obj/structure/table, +/obj/item/ammo_box/magazine/darkpack545{ + pixel_x = 2 + }, +/obj/item/ammo_box/magazine/darkpack545{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/ammo_box/magazine/darkpack9mm{ + pixel_x = 2; + pixel_y = 7 + }, +/obj/item/ammo_box/magazine/darkpack9mm{ + pixel_x = 1; + pixel_y = 7 + }, +/obj/item/ammo_box/magazine/darkpack9mm{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/ammo_box/magazine/darkpack9mm{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/ammo_box/magazine/darkpack9mm{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/ammo_box/magazine/darkpack9mm{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/ammo_box/magazine/darkpack9mm{ + pixel_x = 1; + pixel_y = 7 + }, +/obj/item/ammo_box/magazine/darkpack9mm{ + pixel_x = 1; + pixel_y = 7 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/anarch) +"aik" = ( +/mob/living/basic/corvid/raven, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"ail" = ( +/obj/structure/closet/secure_closet/freezer/fridge/all_access, +/obj/item/storage/box/ingredients/american, +/obj/item/storage/box/ingredients/carnivore, +/obj/item/storage/box/ingredients/fruity, +/obj/item/storage/box/ingredients/grains, +/obj/item/storage/box/ingredients/vegetarian, +/obj/item/reagent_containers/condiment/milk, +/turf/open/floor/city/bacotell, +/area/vtm/interior/sewer) +"aim" = ( +/obj/structure/chair/darkpack{ + dir = 8 + }, +/obj/effect/landmark/start/darkpack/supply/tech, +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/westfield_mall/interior/supply) +"ain" = ( +/obj/effect/decal/pallet, +/obj/item/lighter, +/obj/structure/coclock, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aio" = ( +/obj/effect/decal/cleanable/greenglow, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"aip" = ( +/obj/structure/closet, +/obj/item/gun/ballistic/automatic/darkpack/mp5, +/obj/item/gun/ballistic/automatic/darkpack/mp5, +/obj/item/ammo_box/magazine/darkpack9mp5, +/obj/item/ammo_box/magazine/darkpack9mp5, +/obj/item/ammo_box/magazine/darkpack9mp5, +/obj/item/ammo_box/magazine/darkpack9mp5, +/obj/item/ammo_box/darkpack/c9mm, +/obj/item/ammo_box/darkpack/c9mm, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"aiq" = ( +/obj/effect/decal/pallet, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"air" = ( +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"ait" = ( +/obj/machinery/camera/autoname/directional/north{ + pixel_x = 1; + pixel_y = 19 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aiu" = ( +/obj/machinery/griddle, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"aiv" = ( +/obj/transfer_point_vamp{ + id = "forestL1" + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"aiw" = ( +/obj/structure/vampdoor/glass, +/obj/effect/mapping_helpers/door/access/npc, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aix" = ( +/obj/machinery/light/prince/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aiy" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 4 + }, +/obj/effect/landmark/npcability, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aiz" = ( +/obj/structure/table/wood, +/obj/item/trash/can/food/beans, +/obj/effect/spawner/random/trash/crushed_can, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/janitor) +"aiA" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"aiB" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/candle_box{ + pixel_x = -10; + pixel_y = 5 + }, +/obj/item/flashlight/flare/candle{ + pixel_x = 9; + pixel_y = 5 + }, +/obj/item/flashlight/flare/candle{ + pixel_x = 12; + pixel_y = 8 + }, +/obj/item/vampirebook/quran{ + pixel_x = 1; + pixel_y = 10 + }, +/obj/item/vampirebook/lilith{ + pixel_x = -5; + pixel_y = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aiC" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aiD" = ( +/obj/machinery/light/dim/directional/north, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aiE" = ( +/obj/structure/rack/clothing/rand, +/obj/machinery/light/directional/south, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/shop) +"aiF" = ( +/obj/structure/table/wood, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"aiG" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/garbage, +/obj/effect/spawner/random/trash/deluxe_garbage, +/turf/open/floor/city/plating_stone, +/area/vtm/interior/bianchiBank) +"aiH" = ( +/obj/machinery/light/directional/north, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/games_store) +"aiI" = ( +/obj/structure/table/wood, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aiJ" = ( +/obj/effect/turf_decal/siding/wood/light/corner{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aiK" = ( +/obj/effect/decal/wallpaper/red, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/games_store) +"aiL" = ( +/obj/machinery/defibrillator_mount/mobile, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"aiM" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/cigarette, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aiN" = ( +/obj/structure/vampipe{ + pixel_y = 32 + }, +/turf/open/water/vamp_sewer/border, +/area/vtm/interior/sewer) +"aiO" = ( +/obj/machinery/light/small/directional/north{ + light_color = "#cc8899" + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/sewer) +"aiP" = ( +/obj/structure/table, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aiQ" = ( +/obj/structure/bricks, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aiR" = ( +/obj/structure/toilet{ + dir = 4; + pixel_y = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"aiS" = ( +/obj/machinery/atm, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"aiT" = ( +/obj/structure/table/wood/poker, +/obj/item/dice/d4{ + pixel_x = 7; + pixel_y = 9 + }, +/obj/item/storage/dice{ + pixel_x = -4; + pixel_y = 2 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aiU" = ( +/obj/structure/chair/wood/darkpack/red{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aiV" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/littleitaly) +"aiW" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"aiX" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aiY" = ( +/obj/structure/table/wood, +/obj/vampire_computer, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/janitor) +"aiZ" = ( +/obj/structure/punching_bag, +/obj/effect/decal/rugs, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/dojo) +"aja" = ( +/obj/structure/sign/poster/city/kish/directional/north{ + pixel_x = -6 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"ajb" = ( +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"ajc" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/maintenance/basement) +"ajd" = ( +/obj/structure/table/wood, +/obj/vampire_computer/box{ + dir = 8 + }, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"aje" = ( +/obj/darkpack_car/endrontruck{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"ajf" = ( +/obj/machinery/light/dim/directional/west, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"ajg" = ( +/obj/structure/table/wood, +/obj/effect/decal/wallpaper/papers/random{ + pixel_y = 25 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"ajh" = ( +/obj/structure/chair/plastic/darkpack{ + dir = 1 + }, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt) +"aji" = ( +/obj/machinery/light/blacklight/directional/north, +/obj/effect/decal/wallpaper/grey{ + pixel_y = 32 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"ajj" = ( +/obj/structure/table/wood, +/obj/vampire_computer{ + pixel_y = 5 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"ajk" = ( +/obj/machinery/light/directional/north, +/turf/open/openspace, +/area/vtm/westfield_mall/parking_lot) +"ajl" = ( +/obj/structure/mirror, +/obj/effect/decal/wallpaper/low, +/turf/closed/wall/vampwall/junk, +/area/vtm/interior/sewer/nosferatu_town) +"ajm" = ( +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"ajn" = ( +/obj/structure/flora/rock/darkpack, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"ajo" = ( +/obj/effect/turf_decal/siding/wood/light{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"ajp" = ( +/obj/structure/table/wood, +/obj/item/stack/rods, +/obj/item/stack/rods, +/obj/item/stack/rods, +/obj/item/stack/rods, +/obj/item/stack/rods, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"ajq" = ( +/obj/structure/flora/rock/darkpack_big, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"ajr" = ( +/obj/structure/chair/sofa/right/brown, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"ajt" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"aju" = ( +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/underground_parking) +"ajv" = ( +/obj/structure/table, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"ajw" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/westfield_mall/interior/theatre) +"ajx" = ( +/obj/effect/turf_decal/darkpack/grass/corner{ + dir = 8 + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall) +"ajy" = ( +/obj/machinery/light/prince/directional/west, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"ajz" = ( +/obj/effect/decal/wallpaper/red, +/obj/item/food/chocolatebar{ + pixel_x = 5; + pixel_y = -10 + }, +/obj/item/food/chocolatebar{ + pixel_x = 12; + pixel_y = -10 + }, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/theatre) +"ajA" = ( +/obj/structure/stairs/north, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"ajB" = ( +/obj/effect/landmark/start/darkpack/chantry/archivist, +/obj/structure/chair/wood/darkpack/red, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"ajC" = ( +/obj/effect/decal/wallpaper/paper/stripe, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/games_store) +"ajD" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"ajE" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/turf/open/floor/city/bacotell, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"ajF" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/foodcourt) +"ajG" = ( +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"ajI" = ( +/obj/structure/chair/comfy/darkpack/green{ + dir = 1 + }, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"ajK" = ( +/obj/structure/glowshroom/glowcap, +/turf/open/misc/grass, +/area/vtm/westfield_mall/forest) +"ajL" = ( +/obj/structure/rack/food/rand, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"ajM" = ( +/obj/effect/landmark/start/darkpack/law_enforcement/officer, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"ajN" = ( +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"ajO" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/coffee_condi_display{ + pixel_y = 11; + pixel_x = -7 + }, +/obj/item/reagent_containers/cup/bottle/syrup_bottle/caramel{ + pixel_y = 6 + }, +/turf/open/floor/city/bacotell, +/area/vtm/interior/bianchiBank) +"ajP" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 8 + }, +/obj/machinery/light/warm/directional/east, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"ajQ" = ( +/obj/structure/table, +/obj/effect/decal/rugs, +/obj/item/liquid_flamethrower, +/obj/item/gas_can/full, +/turf/open/floor/plating/rough{ + icon_state = "carpet_black" + }, +/area/vtm/interior/sewer/nosferatu_town) +"ajR" = ( +/mob/living/carbon/human/npc/gummaguts, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"ajS" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"ajT" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"ajU" = ( +/turf/open/floor/carpet/green, +/area/vtm/westfield_mall/interior/anarch) +"ajV" = ( +/obj/structure/rack/food{ + dir = 8; + pixel_x = 10; + pixel_y = 1 + }, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"ajW" = ( +/obj/structure/chair/wood/darkpack, +/obj/effect/landmark/start/darkpack/anarch/bruiser, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/anarch) +"ajX" = ( +/obj/structure/table/countertop/red, +/obj/machinery/microwave{ + pixel_y = 7 + }, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"ajY" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"ajZ" = ( +/obj/structure/table/countertop/bubway, +/obj/item/plate, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"aka" = ( +/obj/effect/turf_decal/bordur/corner/inverse{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"akb" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"akc" = ( +/turf/open/openspace, +/area/vtm/interior/police) +"akd" = ( +/obj/structure/chair/sofa/corp, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/theatre) +"ake" = ( +/obj/structure/chair/sofa/left/brown{ + desc = "It's sticky. Why is it sticky?" + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"akf" = ( +/obj/structure/table, +/obj/item/storage/box/lights/bulbs{ + pixel_x = 6; + pixel_y = 14 + }, +/obj/item/circuitboard/computer/security, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"akg" = ( +/obj/structure/vampstatue, +/obj/effect/turf_decal/bordur{ + dir = 6 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"akh" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/mob/living/carbon/human/npc/hobo, +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer) +"aki" = ( +/turf/open/floor/plating/stone, +/area/vtm/interior/sewer/nosferatu_town) +"akj" = ( +/turf/closed/wall/vampwall/metal/reinforced, +/area/vtm/westfield_mall/interior/endron_logging) +"akk" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/garbage, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"akl" = ( +/obj/structure/retail/pharmacy, +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/vet_clinic) +"akm" = ( +/obj/effect/turf_decal/bordur/inverse, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"akn" = ( +/obj/structure/chair/comfy/beige{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior/techshop) +"ako" = ( +/obj/structure/rack/food/rand, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"akp" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"akq" = ( +/obj/structure/table/countertop/red, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"akr" = ( +/obj/structure/chair/stool/bar/directional/west, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"aks" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/occult/artifact{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/effect/spawner/random/occult/artifact{ + pixel_x = 3; + pixel_y = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"akt" = ( +/obj/item/trash/semki, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/old, +/area/vtm/interior) +"aku" = ( +/obj/effect/gibspawner/human, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"akv" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/city/bacotell, +/area/vtm/interior/littleitaly) +"akw" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/supply) +"akx" = ( +/obj/effect/decal/wallpaper/grey, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/camarilla) +"aky" = ( +/obj/item/kirbyplants/darkpack/random, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"akz" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/city/plating, +/area/vtm/interior/bianchiBank) +"akA" = ( +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/hot_ishu) +"akB" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"akC" = ( +/obj/structure/mirror, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/games_store) +"akD" = ( +/obj/machinery/shower/directional/west, +/obj/structure/curtain, +/obj/structure/fluff/shower_drain, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/games_store) +"akE" = ( +/obj/structure/fake_stairs/wood/directional/east, +/turf/open/floor/iron/stairs/left{ + dir = 8 + }, +/area/vtm/westfield_mall/interior/games_store) +"akF" = ( +/obj/structure/closet/crate/large, +/obj/item/chainsaw/vamp, +/obj/effect/spawner/random/engineering/tool, +/obj/effect/spawner/random/engineering/tool, +/obj/effect/spawner/random/engineering/tool, +/obj/item/shovel/vamp, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"akG" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/plating/concrete, +/area/vtm/interior/sewer) +"akH" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/item/food/grown/moonflower, +/turf/open/misc/grass, +/area/vtm/westfield_mall/forest) +"akI" = ( +/obj/effect/decal/pallet, +/obj/structure/table, +/obj/item/gun/ballistic/automatic/darkpack/uzi, +/obj/item/gun/ballistic/automatic/darkpack/uzi, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/anarch) +"akJ" = ( +/obj/machinery/oven/range, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"akK" = ( +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"akL" = ( +/turf/closed/wall/vampwall/brick_old, +/area/vtm/westfield_mall/interior/maintenance/basement) +"akM" = ( +/obj/structure/vampdoor/old{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/camarilla, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/camarilla) +"akN" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"akO" = ( +/obj/structure/table/wood, +/obj/item/flashlight/flare/candle/infinite, +/obj/item/flashlight/lamp{ + pixel_x = -7; + pixel_y = 13 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"akP" = ( +/obj/effect/turf_decal/siding/white/inner_corner{ + dir = 1 + }, +/turf/open/water, +/area/vtm/interior/bianchiBank) +"akQ" = ( +/obj/structure/chair/darkpack/green{ + dir = 8 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"akR" = ( +/obj/structure/table/wood, +/obj/vampire_computer{ + pixel_y = 7; + pixel_x = 4 + }, +/obj/item/kirbyplants/darkpack/plant4{ + pixel_y = 16; + pixel_x = -9 + }, +/obj/item/kirbyplants/darkpack/plant2{ + pixel_y = 6; + pixel_x = -11 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"akS" = ( +/obj/structure/closet/athletic_mixed, +/obj/machinery/light/directional/north, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior) +"akT" = ( +/obj/darkpack_car/rand{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"akU" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 4 + }, +/obj/structure/lamppost/sidewalk, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"akV" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"akW" = ( +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"akX" = ( +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer/nosferatu_town) +"akZ" = ( +/obj/structure/roofstuff/alt1, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"ala" = ( +/obj/machinery/door/poddoor/shutters{ + dir = 8; + elevator_mode = 1; + transport_linked_id = "mall_elevator_1" + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/elevator) +"alb" = ( +/obj/structure/chair/plastic/darkpack{ + dir = 8 + }, +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/interior/supply) +"alc" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/plant_produce, +/turf/open/floor/city/circled, +/area/vtm/interior/shop) +"ald" = ( +/obj/structure/filingcabinet/white{ + pixel_x = 7 + }, +/obj/structure/filingcabinet/white{ + pixel_x = -7 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"ale" = ( +/obj/effect/turf_decal/bordur/corner, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"alf" = ( +/obj/machinery/light/prince/directional/north, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"alg" = ( +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"alh" = ( +/obj/effect/turf_decal/bordur/corner/inverse{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"ali" = ( +/obj/effect/turf_decal/asphalt, +/obj/effect/landmark/npcability, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"alj" = ( +/obj/structure/closet/crate/bin{ + pixel_x = 7; + pixel_y = -1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"alk" = ( +/obj/structure/closet/secure_closet/freezer/empty, +/obj/item/storage/box/coffeepack/robusta, +/obj/item/storage/box/coffeepack/robusta, +/obj/item/storage/box/coffeepack/robusta, +/obj/item/storage/box/coffeepack, +/obj/item/storage/box/coffeepack, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"all" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"alm" = ( +/obj/effect/turf_decal/bordur/corner, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"aln" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/eighties, +/area/vtm/westfield_mall/interior/arcade) +"alo" = ( +/obj/structure/rack/clothing_hanger/rand{ + pixel_x = 7 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/janitor) +"alp" = ( +/obj/structure/secure_safe/directional/north, +/obj/structure/table, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand{ + pixel_y = 5; + pixel_x = 8 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 5; + pixel_x = 8 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 13; + pixel_x = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 13; + pixel_x = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/interior/bianchiBank) +"alq" = ( +/obj/structure/closet/cabinet, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"alr" = ( +/obj/machinery/light/directional/north, +/obj/structure/table/countertop/black, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/shop) +"als" = ( +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"alt" = ( +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/maintenance/atrium) +"alu" = ( +/obj/structure/bed, +/obj/machinery/light/prince/broken/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"alv" = ( +/obj/fake_platform/stone/double, +/turf/open/misc/grass, +/area/vtm/westfield_mall/interior) +"alw" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"alx" = ( +/obj/structure/rack/food, +/obj/effect/spawner/random/engineering/vending_restock, +/obj/effect/spawner/random/engineering/vending_restock, +/obj/effect/spawner/random/engineering/vending_restock, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aly" = ( +/obj/structure/guncase, +/obj/item/gun/ballistic/shotgun/vampire, +/obj/item/gun/ballistic/shotgun/vampire, +/obj/item/gun/ballistic/automatic/darkpack/ar15, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"alz" = ( +/obj/structure/railing/wooden_fence, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior) +"alA" = ( +/obj/machinery/computer/cargo/express{ + dir = 8 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"alB" = ( +/obj/effect/turf_decal/asphaltline{ + dir = 8 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"alC" = ( +/obj/darkpack_car/police, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"alD" = ( +/obj/structure/railing/wooden_fence{ + dir = 4 + }, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior) +"alE" = ( +/obj/structure/chair/sofa/corp/left, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"alF" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"alG" = ( +/obj/machinery/sprinkler, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"alH" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/janitor) +"alI" = ( +/obj/structure/hedge, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"alJ" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/dojo) +"alK" = ( +/obj/effect/turf_decal/asphaltline/alt{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"alL" = ( +/obj/effect/decal/cleanable/trash, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"alM" = ( +/obj/structure/table, +/obj/machinery/light/small/directional/west, +/obj/structure/sink/directional/east{ + icon_state = "basin" + }, +/turf/open/floor/city/bacotell, +/area/vtm/interior/sewer) +"alN" = ( +/obj/structure/coclock, +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 8 + }, +/obj/item/pen{ + pixel_y = 10; + pixel_x = -4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"alO" = ( +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"alP" = ( +/obj/structure/vampdoor/old, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/clerk, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"alQ" = ( +/obj/fake_platform/stone/easyclimb, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"alR" = ( +/obj/structure/vampdoor, +/obj/effect/mapping_helpers/door/access/toreador, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"alS" = ( +/obj/structure/curtain/bounty, +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer) +"alT" = ( +/obj/structure/table, +/obj/machinery/microwave{ + desc = "Cooks and boils stuff, somehow."; + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"alU" = ( +/obj/structure/chair/plastic/darkpack{ + dir = 8 + }, +/obj/effect/landmark/start/darkpack/anarch/bruiser, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/anarch) +"alV" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 8 + }, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"alW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"alX" = ( +/obj/machinery/atm, +/obj/machinery/light/directional/north, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"alY" = ( +/obj/effect/landmark/npcability, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"alZ" = ( +/obj/structure/vampdoor/wood{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/lasombra, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"ama" = ( +/turf/open/floor/city/bacotell, +/area/vtm/interior/littleitaly) +"amb" = ( +/obj/item/kirbyplants/darkpack/random, +/obj/machinery/light/directional/south, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"amc" = ( +/obj/structure/chair/sofa/corp/left, +/obj/fake_platform/grey/easyclimb, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"amd" = ( +/obj/machinery/light/directional/east, +/turf/open/openspace, +/area/vtm/westfield_mall/interior/anarch) +"ame" = ( +/obj/effect/decal/cleanable/litter, +/obj/machinery/light/directional/south, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"amf" = ( +/turf/open/floor/carpet/darkpack, +/area/vtm/interior/clinic) +"amg" = ( +/mob/living/carbon/human/npc/shop, +/turf/open/floor/city/bacotell, +/area/vtm/interior/shop) +"amh" = ( +/obj/structure/chair/sofa/city_bench/metal/right/puce{ + dir = 8 + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/sewer) +"ami" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/cups{ + pixel_x = -8; + pixel_y = 13 + }, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"amj" = ( +/obj/structure/stairs/east, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"amk" = ( +/obj/machinery/shower/directional/south, +/obj/effect/turf_decal/stock{ + dir = 1 + }, +/obj/structure/window/spawner/directional/east, +/obj/effect/spawner/random/trash/soap, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"aml" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"amm" = ( +/obj/structure/vampfence/corner/rich{ + dir = 8 + }, +/obj/effect/turf_decal/bordur/corner, +/turf/open/floor/plating/sidewalkalt, +/area/vtm/westfield_mall/forest) +"amn" = ( +/obj/effect/decal/wallpaper/red, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"amo" = ( +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/maintenance) +"amp" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/endron_logging) +"amq" = ( +/obj/machinery/oven/range, +/turf/open/floor/city/bacotell, +/area/vtm/interior/sewer) +"amr" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 6 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"ams" = ( +/obj/structure/closet/crate/coffin, +/obj/structure/sign/painting{ + pixel_y = 32; + dir = 1 + }, +/turf/open/floor/carpet/darkpack/blacksilver, +/area/vtm/westfield_mall/interior/theatre) +"amt" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"amu" = ( +/obj/structure/table/countertop/red, +/obj/machinery/light/directional/north, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"amv" = ( +/obj/structure/hedge, +/obj/machinery/light/directional/west, +/turf/open/floor/city/plating_stone, +/area/vtm/interior/bianchiBank) +"amw" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"amx" = ( +/turf/open/floor/plating/stone, +/area/vtm/interior/sewer) +"amy" = ( +/turf/closed/wall/vampwall/brick_old, +/area/vtm/westfield_mall/interior/skatepark) +"amz" = ( +/obj/structure/vampdoor/old{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/access/clerk, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"amA" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/skatepark) +"amB" = ( +/obj/vampire_computer, +/obj/structure/table, +/obj/underplate, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"amC" = ( +/obj/effect/decal/cleanable/trash, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/flowers_yw/style_random{ + pixel_y = 2 + }, +/obj/structure/railing, +/turf/open/misc/dirt, +/area/vtm/interior/sewer/nosferatu_town) +"amD" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping21" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"amE" = ( +/obj/machinery/camera/autoname/directional/north{ + pixel_x = 5; + pixel_y = 20 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"amF" = ( +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/westfield_mall/interior/theatre) +"amG" = ( +/obj/structure/glowshroom, +/turf/open/floor/plating/rough/cave, +/area/vtm/westfield_mall/interior/cave) +"amH" = ( +/obj/structure/stairs/west, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"amI" = ( +/obj/machinery/vending/games, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"amJ" = ( +/obj/effect/landmark/start/darkpack/citizen/janitor, +/obj/structure/chair/wood/darkpack{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/janitor) +"amK" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 8 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"amL" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/condiment/protein{ + pixel_x = -9; + pixel_y = 11 + }, +/obj/item/reagent_containers/condiment/protein{ + pixel_x = 3; + pixel_y = 6 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"amM" = ( +/obj/structure/table/wood, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/anarch) +"amN" = ( +/obj/effect/mapping_helpers/door/access/bar, +/obj/structure/vampdoor/simple, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/anarch) +"amO" = ( +/obj/vampire_computer, +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"amP" = ( +/obj/structure/hedge/opaque, +/obj/effect/turf_decal/siding/wood/dark/end{ + dir = 4 + }, +/turf/open/floor/plating/granite/black, +/area/vtm/interior/shop) +"amQ" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/janitor) +"amR" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"amS" = ( +/turf/open/floor/iron/stairs/left, +/area/vtm/interior/mansion) +"amT" = ( +/obj/structure/vampdoor/wood{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/old_clan_tzimisce, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"amU" = ( +/obj/structure/rack/food, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/reagent_containers/cup/jerrycan/space_cleaner, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/janitor) +"amV" = ( +/obj/item/clothing/under/vampire/malkavian{ + pixel_x = 8; + pixel_y = -8 + }, +/mob/living/basic/cockroach{ + name = "Mike" + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/maintenance) +"amW" = ( +/obj/structure/vampdoor/old{ + dir = 1 + }, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/clerk, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"amX" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"amY" = ( +/obj/effect/spawner/random/trash/grime, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"amZ" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"ana" = ( +/obj/item/seeds/cannabis, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/cave) +"anb" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"anc" = ( +/obj/structure/reagent_dispensers/water_cooler{ + density = 0; + pixel_x = 9 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"and" = ( +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/techshop) +"ane" = ( +/obj/structure/table, +/obj/item/storage/box/gloves{ + pixel_x = -8; + pixel_y = 14 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"anf" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/plating/granite/black, +/area/vtm/interior/shop) +"ang" = ( +/obj/structure/chair/comfy/teal{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/clinic) +"anh" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/westfield_mall/interior/theatre) +"ani" = ( +/obj/structure/glowshroom/glowcap, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/cave) +"anj" = ( +/obj/item/kirbyplants/random/dead{ + desc = "It doesn't look very healthy..."; + name = "dead plant" + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"ank" = ( +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"anl" = ( +/obj/effect/landmark/npcactivity, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"anm" = ( +/obj/effect/turf_decal/siding/grey/end{ + dir = 1 + }, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall/interior) +"ann" = ( +/obj/structure/chair/comfy/darkpack/red{ + dir = 4 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/carpet/darkpack/bluesilver, +/area/vtm/westfield_mall/interior/theatre) +"ano" = ( +/obj/machinery/light/small/red/dim/directional/east, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"anp" = ( +/obj/machinery/light/prince/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"anq" = ( +/obj/structure/table/wood, +/obj/item/sord{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/toy/gun{ + pixel_x = 10 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"anr" = ( +/obj/effect/decal/remains/human, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/cave) +"ans" = ( +/obj/structure/transport/linear, +/turf/open/floor/plating/elevatorshaft, +/area/vtm/interior/elevator) +"ant" = ( +/obj/structure/vampdoor/simple{ + dir = 4 + }, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"anu" = ( +/obj/structure/fluff/tram_rail{ + dir = 4; + pixel_x = -8; + pixel_y = 8 + }, +/obj/effect/turf_decal/bordur/end, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/skatepark) +"anv" = ( +/obj/structure/rack/clothing/rand, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"anw" = ( +/obj/machinery/light/prince/directional/east, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"anx" = ( +/obj/structure/barrels/rand, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"any" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"anz" = ( +/obj/effect/turf_decal/bordur{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"anA" = ( +/obj/structure/vampdoor, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/smokeshop) +"anB" = ( +/obj/structure/chair/sofa/city_bench/metal{ + dir = 1 + }, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior) +"anC" = ( +/obj/machinery/fax/aasimites{ + fax_name = "Matrak Self-Defence" + }, +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"anD" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/machinery/light/directional/north, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"anE" = ( +/obj/effect/turf_decal/asphaltline/alt{ + dir = 4 + }, +/obj/effect/turf_decal/bordur/inverse{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"anF" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping41" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"anG" = ( +/obj/structure/railing/wooden_fence{ + dir = 4 + }, +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/interior/supply) +"anH" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"anI" = ( +/obj/structure/flora/tree/jungle/small/style_random, +/turf/open/misc/grass, +/area/vtm/westfield_mall/interior) +"anJ" = ( +/turf/open/openspace, +/area/vtm/westfield_mall/interior/maintenance/atrium) +"anK" = ( +/obj/structure/chair/office/darkpack/red{ + dir = 8 + }, +/obj/effect/landmark/start/darkpack/primogen/malkavian, +/turf/open/floor/carpet/darkpack, +/area/vtm/interior/clinic) +"anL" = ( +/obj/structure/table/wood, +/obj/item/kirbyplants/random, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"anM" = ( +/obj/item/assembly/mousetrap/armed, +/obj/item/assembly/mousetrap/armed, +/obj/item/assembly/mousetrap/armed{ + pixel_x = 11; + pixel_y = -13 + }, +/obj/item/assembly/mousetrap/armed{ + pixel_x = -10; + pixel_y = 8 + }, +/obj/item/assembly/mousetrap/armed{ + pixel_x = 10; + pixel_y = 5 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"anN" = ( +/obj/structure/sink/directional/south, +/obj/structure/mirror/directional/north, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"anO" = ( +/obj/effect/turf_decal/siding/white, +/turf/open/floor/city/circled, +/area/vtm/interior/shop) +"anP" = ( +/obj/item/book/bible{ + pixel_x = -7 + }, +/obj/structure/table/wood/fancy/black, +/obj/item/knife/vamp{ + pixel_x = 6; + pixel_y = -2 + }, +/obj/item/storage/fancy/candle_box, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"anQ" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/westfield_mall/interior/chantry) +"anR" = ( +/obj/effect/decal/wallpaper/light, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/vet_clinic) +"anT" = ( +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior) +"anU" = ( +/obj/effect/turf_decal/asphaltline/alt, +/obj/effect/turf_decal/bordur/inverse, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"anV" = ( +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"anW" = ( +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"anX" = ( +/obj/structure/bed/dogbed, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"anY" = ( +/obj/structure/railing/wooden_fence, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"anZ" = ( +/obj/effect/turf_decal/bordur{ + dir = 8 + }, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"aoa" = ( +/obj/structure/table, +/obj/item/chainsaw/vamp, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"aob" = ( +/obj/structure/closet/secure_closet/freezer/fridge/all_access, +/obj/item/food/spaghetti/raw, +/obj/item/food/spaghetti/raw, +/turf/open/floor/city/bacotell, +/area/vtm/interior/littleitaly) +"aoc" = ( +/obj/structure/flora/rock/pile/darkpack, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"aod" = ( +/obj/effect/decal/cleanable/trash, +/obj/effect/landmark/npcability, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"aoe" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"aof" = ( +/obj/structure/table/modern, +/obj/item/toy/plush/shark{ + pixel_x = 4; + pixel_y = 3 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"aog" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/oven/range, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"aoh" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light/small/dim/directional/east, +/obj/effect/decal/wallpaper/grey{ + pixel_y = 32 + }, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/smokeshop) +"aoi" = ( +/obj/effect/decal/wallpaper/paper/darkgreen/low, +/turf/closed/wall/vampwall/junk, +/area/vtm/interior/sewer/nosferatu_town) +"aok" = ( +/obj/effect/decal/rugs, +/obj/machinery/telecomms/allinone/public, +/turf/open/floor/plating/rough{ + icon_state = "carpet_black" + }, +/area/vtm/interior/sewer/nosferatu_town) +"aol" = ( +/obj/structure/chair/comfy/darkpack/dark{ + dir = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aom" = ( +/obj/effect/turf_decal/siding/grey/corner, +/obj/effect/turf_decal/siding/grey/inner_corner{ + dir = 1 + }, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall/interior) +"aon" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 8 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aoo" = ( +/obj/effect/turf_decal/bordur/corner, +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/marker_beacon/burgundy, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"aop" = ( +/obj/machinery/camera/autoname/directional/north{ + pixel_y = 21 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"aoq" = ( +/obj/effect/turf_decal/siding/white, +/turf/open/water, +/area/vtm/interior/bianchiBank) +"aor" = ( +/obj/item/clothing/suit/hooded/heisenberg, +/turf/open/floor/plating/concrete, +/area/vtm/interior/sewer) +"aos" = ( +/obj/effect/spawner/random/entertainment/plushie{ + pixel_x = -7; + pixel_y = -4 + }, +/obj/effect/spawner/random/entertainment/musical_instrument{ + pixel_x = 5; + pixel_y = -5 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aot" = ( +/turf/open/openspace, +/area/vtm/westfield_mall/interior/anarch) +"aou" = ( +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/camarilla) +"aov" = ( +/obj/effect/spawner/random/trash/bucket, +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer) +"aow" = ( +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/skatepark) +"aox" = ( +/obj/structure/table/wood, +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/south, +/obj/effect/turf_decal/siding/wood/light{ + dir = 4 + }, +/obj/item/food/muffin{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/item/food/muffin{ + pixel_x = -10; + pixel_y = 2 + }, +/obj/item/food/muffin{ + pixel_x = 1; + pixel_y = 13 + }, +/obj/item/food/muffin/berry{ + pixel_x = -8; + pixel_y = 13 + }, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"aoy" = ( +/obj/effect/turf_decal/bordur/corner/inverse, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall) +"aoz" = ( +/obj/structure/table, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aoA" = ( +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aoB" = ( +/obj/effect/turf_decal/bordur/corner/inverse{ + dir = 1 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aoD" = ( +/obj/structure/vampdoor/wood{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/supply, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aoE" = ( +/obj/effect/decal/wallpaper/blue, +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/police) +"aoF" = ( +/obj/structure/sign/poster/city/pixies/directional/north{ + pixel_x = -6 + }, +/obj/structure/sign/poster/city/tiamat/directional/north{ + pixel_x = 7; + pixel_y = 31 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"aoG" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/plant_produce, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/city/circled, +/area/vtm/interior/shop) +"aoH" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 4 + }, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior) +"aoI" = ( +/obj/structure/chair/sofa/corp/left, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aoJ" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/maintenance) +"aoK" = ( +/obj/structure/table, +/obj/structure/sink/basin/directional/south{ + pixel_y = 4 + }, +/obj/structure/mirror/directional/north, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"aoL" = ( +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"aoN" = ( +/obj/structure/railing/wooden_fence{ + dir = 4 + }, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/interior/supply) +"aoO" = ( +/obj/effect/turf_decal/bordur{ + dir = 10 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aoP" = ( +/obj/item/knife/kitchen{ + pixel_y = 5; + pixel_x = 5 + }, +/obj/item/kitchen/fork, +/obj/item/kitchen/fork, +/obj/item/kitchen/fork, +/obj/structure/closet, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/rice, +/obj/item/reagent_containers/condiment/sugar, +/obj/item/plate, +/obj/item/kitchen/spoon, +/obj/item/kitchen/spoon, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aoQ" = ( +/obj/effect/decal/cleanable/litter, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/endron_logging) +"aoR" = ( +/obj/effect/turf_decal/bordur, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"aoS" = ( +/obj/structure/rack/food, +/obj/effect/spawner/random/trash/janitor_supplies, +/obj/effect/spawner/random/trash/janitor_supplies, +/obj/effect/spawner/random/trash/bucket, +/obj/effect/spawner/random/trash/bucket, +/obj/effect/spawner/random/trash/bucket, +/obj/effect/spawner/random/decoration/paint, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/janitor) +"aoT" = ( +/obj/structure/vampdoor/glass, +/obj/effect/mapping_helpers/door/access/police_chief, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"aoU" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 10 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"aoV" = ( +/obj/structure/table/countertop/red, +/obj/structure/retail/gummaguts_menu{ + pixel_y = 6 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aoW" = ( +/obj/structure/chair/sofa/corp{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack/blackgold, +/area/vtm/westfield_mall/interior/techshop) +"aoX" = ( +/obj/structure/table, +/obj/effect/decal/pallet, +/obj/item/fireaxe/vamp{ + pixel_x = 5; + pixel_y = 12 + }, +/obj/item/melee/baseball_bat/vamp{ + pixel_x = -3; + pixel_y = 9 + }, +/obj/item/melee/baseball_bat/vamp{ + pixel_y = 5 + }, +/obj/item/melee/baseball_bat/vamp{ + pixel_x = 2; + pixel_y = 1 + }, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"aoY" = ( +/obj/effect/decal/coastline{ + dir = 9 + }, +/turf/open/misc/beach/vamp, +/area/vtm/westfield_mall/forest) +"aoZ" = ( +/obj/structure/closet/crate/bin{ + pixel_y = 16; + pixel_x = -8 + }, +/obj/structure/coclock, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"apa" = ( +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt) +"apb" = ( +/obj/darkpack_car/limousine/giovanni, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"apc" = ( +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"apd" = ( +/obj/effect/spawner/random/engineering/tank, +/turf/open/floor/city/industrial/large, +/area/vtm/interior/shop) +"ape" = ( +/obj/structure/vampdoor/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/bar, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/anarch) +"apf" = ( +/obj/structure/vampipe{ + pixel_y = 32 + }, +/turf/open/floor/plating/canal, +/area/vtm/interior/sewer) +"apg" = ( +/obj/effect/turf_decal/siding/grey/end, +/turf/open/misc/grass/random/bushes, +/area/vtm/westfield_mall/interior) +"aph" = ( +/obj/structure/railing/wooden_fence{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/dark, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior) +"api" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/head/collectable/tophat, +/obj/item/scythe/vamp, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"apj" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/underground_parking) +"apk" = ( +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/interior/church) +"apl" = ( +/obj/machinery/griddle, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/city/bacotell, +/area/vtm/interior/littleitaly) +"apm" = ( +/obj/structure/chair/wood/darkpack{ + dir = 1 + }, +/obj/effect/landmark/start/darkpack/anarch/bruiser, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/anarch) +"apn" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/suit/apron/surgical, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"apo" = ( +/obj/structure/fence/corner, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"app" = ( +/obj/structure/closet, +/obj/item/clothing/suit/vampire/eod, +/obj/item/clothing/head/vampire/eod, +/obj/item/wirecutters, +/obj/item/screwdriver, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"apq" = ( +/obj/structure/vampdoor/old{ + dir = 1 + }, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/eight, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"apr" = ( +/obj/structure/table/wood, +/obj/machinery/light/directional/east, +/obj/item/flashlight{ + pixel_x = -6; + pixel_y = 5 + }, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"aps" = ( +/obj/effect/turf_decal/crosswalk{ + dir = 4 + }, +/obj/effect/turf_decal/asphalt, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"apt" = ( +/turf/closed/wall/vampwall/wood, +/area/vtm/westfield_mall/skatepark) +"apu" = ( +/obj/machinery/light/directional/south, +/obj/structure/closet/crate/large, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"apv" = ( +/obj/effect/decal/support, +/turf/open/floor/plating/rough/cave, +/area/vtm/westfield_mall/interior) +"apw" = ( +/obj/structure/stairs/east, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"apx" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"apy" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"apz" = ( +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/maintenance) +"apA" = ( +/obj/structure/table, +/obj/item/screwdriver/power{ + pixel_x = 2; + pixel_y = 15 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = -5; + pixel_y = 2 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"apB" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/pen, +/obj/item/paper_bin, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"apC" = ( +/obj/structure/chair/sofa/corp{ + dir = 4 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"apD" = ( +/obj/structure/vampdoor/wood{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/old_clan_tzimisce, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"apE" = ( +/obj/structure/chair/office/darkpack/red{ + dir = 8 + }, +/obj/effect/landmark/start/darkpack/hecata/famiglia, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"apF" = ( +/obj/effect/decal/wallpaper/grey{ + pixel_y = 32 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 5 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"apG" = ( +/obj/structure/hedge, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"apH" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"apI" = ( +/obj/structure/sign/gym/right{ + pixel_y = 32; + dir = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"apJ" = ( +/turf/open/floor/iron/stairs{ + dir = 4 + }, +/area/vtm/westfield_mall/interior/theatre) +"apK" = ( +/obj/structure/chair/sofa/city_bench/metal/right/black{ + dir = 8 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"apL" = ( +/obj/machinery/hydroponics/simple/plastic, +/turf/open/floor/plating/rough/cave, +/area/vtm/westfield_mall/interior/cave) +"apN" = ( +/obj/structure/table, +/obj/structure/sink/basin/directional/south{ + pixel_y = 2 + }, +/obj/structure/mirror/directional/north, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"apO" = ( +/obj/structure/chair/wood/darkpack/red{ + dir = 1 + }, +/turf/open/floor/wood/herring, +/area/vtm/interior/littleitaly) +"apP" = ( +/obj/effect/landmark/latejoin_masquerade, +/turf/open/floor/plating/canal, +/area/vtm/interior/sewer) +"apQ" = ( +/obj/effect/decal/wallpaper/grey, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/theatre) +"apR" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/theatre) +"apS" = ( +/obj/structure/table/wood, +/obj/machinery/microwave, +/turf/open/floor/city/bacotell, +/area/vtm/interior/littleitaly) +"apT" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"apU" = ( +/obj/structure/table/wood, +/obj/item/book/random{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/book/random{ + pixel_x = -10; + pixel_y = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"apV" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/taperecorder{ + pixel_x = 9; + pixel_y = 6 + }, +/obj/item/pen/fountain, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"apW" = ( +/obj/structure/table, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 5; + pixel_x = 8 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 13; + pixel_x = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 13; + pixel_x = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/reagent_containers/cup/glass/trophy/gold_cup{ + pixel_y = 13 + }, +/turf/open/floor/city/plating, +/area/vtm/interior/bianchiBank) +"apX" = ( +/obj/structure/cargo_take, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"apY" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"apZ" = ( +/obj/structure/closet/crate/dumpster, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aqb" = ( +/obj/machinery/light/prince/directional/west, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aqc" = ( +/turf/closed/wall/vampwall/wood, +/area/vtm/westfield_mall/interior/games_store) +"aqd" = ( +/obj/structure/table, +/obj/item/melee/baseball_bat/vamp{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/melee/baseball_bat/vamp{ + pixel_x = 3; + pixel_y = 12 + }, +/obj/item/melee/vamp/tire{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/carpet/darkpack/blackgold, +/area/vtm/westfield_mall/interior/techshop) +"aqe" = ( +/obj/effect/turf_decal/bordur{ + dir = 9 + }, +/obj/effect/landmark/npcactivity, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"aqf" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 1 + }, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall) +"aqg" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/machinery/sprinkler, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aqi" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/iv_drip, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aqj" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aqk" = ( +/obj/structure/sign/gym{ + pixel_y = 32; + dir = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aql" = ( +/obj/effect/decal/pallet, +/obj/structure/closet/crate/wooden, +/obj/effect/spawner/random/engineering/toolbox, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aqm" = ( +/obj/structure/reagent_dispensers/water_cooler/fallen, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aqn" = ( +/obj/effect/decal/pallet, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aqo" = ( +/turf/closed/wall/vampwall/junk/alt, +/area/vtm/interior/sewer) +"aqp" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"aqq" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack/blackgold, +/area/vtm/westfield_mall/interior/techshop) +"aqs" = ( +/obj/structure/rack/food{ + dir = 8; + pixel_x = 10 + }, +/obj/item/camera_film{ + pixel_x = 3; + pixel_y = 9 + }, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"aqt" = ( +/obj/transfer_point_vamp{ + id = "forestR1" + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"aqu" = ( +/obj/structure/chair/sofa/corner/brown{ + dir = 4 + }, +/obj/item/toy/plush/shark, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer/nosferatu_town) +"aqw" = ( +/obj/effect/turf_decal/bordur/corner/inverse{ + dir = 1 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"aqx" = ( +/obj/effect/decal/pallet, +/obj/structure/closet/crate/cardboard, +/obj/item/reagent_containers/cooler_jug/water, +/obj/item/reagent_containers/cooler_jug/water, +/obj/item/reagent_containers/cooler_jug, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aqy" = ( +/turf/open/misc/grass/random/bushes, +/area/vtm/westfield_mall/interior) +"aqz" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/sewer) +"aqA" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/city_map, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aqB" = ( +/obj/effect/turf_decal/bordur{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"aqC" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aqD" = ( +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/foodcourt) +"aqE" = ( +/obj/structure/closet/secure_closet/freezer/fridge/all_access, +/obj/item/storage/box/ingredients/american, +/obj/item/storage/box/ingredients/carnivore, +/obj/item/storage/box/ingredients/fruity, +/obj/item/storage/box/ingredients/grains, +/obj/item/storage/box/ingredients/vegetarian, +/obj/item/reagent_containers/condiment/milk, +/obj/machinery/light/small/directional/north, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"aqF" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aqG" = ( +/obj/structure/table/wood, +/obj/machinery/coffeemaker/impressa, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"aqH" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/white{ + dir = 5 + }, +/obj/structure/desk_bell, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior/techshop) +"aqI" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/grimy, +/area/vtm/westfield_mall/interior/art_store) +"aqJ" = ( +/obj/structure/reagent_dispensers/water_cooler/jugless, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aqK" = ( +/obj/structure/dresser, +/obj/effect/decal/cleanable/trash, +/obj/item/flashlight/lamp/green{ + pixel_x = 2; + pixel_y = 9 + }, +/obj/item/toy/plush/moth{ + pixel_z = 10; + pixel_y = -3; + pixel_x = -4 + }, +/obj/structure/noticeboard/directional/north, +/turf/open/floor/carpet/darkpack/greengold, +/area/vtm/interior/sewer/nosferatu_town) +"aqL" = ( +/obj/structure/table/wood, +/obj/item/shovel/vamp, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aqM" = ( +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"aqN" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aqO" = ( +/obj/structure/chair/sofa/bench{ + dir = 4 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aqP" = ( +/obj/structure/sink/directional/east, +/turf/open/floor/city/bacotell, +/area/vtm/interior/littleitaly) +"aqQ" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood/dark, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aqR" = ( +/obj/structure/vampipe{ + icon_state = "piping31" + }, +/obj/structure/vampipe{ + icon_state = "piping31" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aqS" = ( +/obj/effect/turf_decal/bordur{ + dir = 6 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"aqT" = ( +/obj/structure/railing/corner, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aqU" = ( +/obj/structure/closet/crate/freezer/blood, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"aqV" = ( +/obj/structure/filingcabinet{ + pixel_x = -7 + }, +/obj/structure/filingcabinet{ + pixel_x = 7 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"aqW" = ( +/obj/structure/sink/directional/south, +/obj/structure/mirror/broken/directional/north, +/turf/open/floor/plating/rough/cave, +/area/vtm/westfield_mall/interior/cave) +"aqX" = ( +/turf/closed/wall/vampwall/brick_old, +/area/vtm/westfield_mall/skatepark) +"aqY" = ( +/obj/machinery/light/cold/directional/east, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aqZ" = ( +/obj/effect/turf_decal/siding/grey/end{ + dir = 4 + }, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall/interior) +"ara" = ( +/obj/structure/stairs/south, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/anarch) +"arb" = ( +/obj/structure/vampdoor/woodglass{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack/hotel, +/area/vtm/interior/shop) +"arc" = ( +/obj/structure/table, +/obj/structure/retail/flower_shop, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"ard" = ( +/obj/structure/chair/plastic/darkpack, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"are" = ( +/obj/structure/hedge, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"arf" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping43" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"arg" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks{ + dir = 1; + pixel_y = 5 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/camarilla) +"arh" = ( +/obj/structure/table/countertop/red, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"ari" = ( +/obj/item/kirbyplants/darkpack/random, +/turf/open/floor/wood/ornate, +/area/vtm/westfield_mall/interior/camarilla) +"arj" = ( +/obj/structure/vampdoor/wood, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/obj/effect/mapping_helpers/door/access/bank, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"ark" = ( +/obj/structure/chair/stool/bar/darkpack/red, +/turf/open/floor/plating/granite/black, +/area/vtm/interior/shop) +"arm" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/effect/turf_decal/siding/wood/light{ + dir = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"arn" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating/canal, +/area/vtm/interior/sewer) +"aro" = ( +/obj/structure/hedge, +/turf/open/floor/wood/herring, +/area/vtm/interior/littleitaly) +"arp" = ( +/obj/effect/turf_decal/darkpack/grass{ + dir = 1 + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall) +"arq" = ( +/obj/structure/curtain/cloth/fancy, +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/theatre) +"ars" = ( +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"art" = ( +/obj/structure/chair/sofa/city_bench/metal/middle/black{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aru" = ( +/obj/item/flashlight/flare/candle/infinite, +/obj/structure/table/wood, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"arw" = ( +/obj/structure/toilet{ + dir = 8; + pixel_y = 6 + }, +/obj/structure/sink/directional/south, +/turf/open/floor/plating/concrete, +/area/vtm/interior/sewer/nosferatu_town) +"arx" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"ary" = ( +/obj/structure/vampdoor{ + dir = 4 + }, +/turf/open/floor/city/bacotell, +/area/vtm/interior/shop) +"arz" = ( +/obj/structure/rack/food, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"arA" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood/light, +/obj/machinery/reagentgrinder, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"arB" = ( +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"arC" = ( +/turf/open/floor/plating/rough{ + icon_state = "carpet_black" + }, +/area/vtm/interior/sewer/nosferatu_town) +"arD" = ( +/obj/structure/vampdoor{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/clinic, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"arE" = ( +/obj/effect/turf_decal/siding/grey{ + dir = 8 + }, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/supply) +"arF" = ( +/turf/open/floor/carpet/darkpack/greengold, +/area/vtm/interior/sewer/nosferatu_town) +"arG" = ( +/obj/effect/spawner/random/flora/grass, +/turf/open/misc/dirt, +/area/vtm/westfield_mall) +"arH" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"arI" = ( +/turf/closed/wall/vampwall/rock, +/area/vtm/westfield_mall/forest) +"arJ" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/dark/corner{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"arK" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 6 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"arL" = ( +/obj/structure/cargo_put{ + pixel_y = 10 + }, +/obj/structure/platform/lowwall/brick_old, +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer) +"arM" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/janitor) +"arN" = ( +/obj/machinery/light/warm/directional/west, +/turf/open/floor/plating/concrete, +/area/vtm/interior/sewer/nosferatu_town) +"arO" = ( +/obj/structure/table, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"arP" = ( +/obj/structure/table/wood, +/obj/structure/retail/skate_shop, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/skatepark) +"arQ" = ( +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/janitor) +"arR" = ( +/obj/effect/decal/shadow, +/obj/item/flashlight/lantern{ + light_on = 1; + start_on = 14 + }, +/turf/open/floor/plating/rough/cave, +/area/vtm/westfield_mall/interior) +"arS" = ( +/obj/machinery/light/directional/south, +/turf/open/openspace, +/area/vtm/westfield_mall/interior/maintenance) +"arT" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/hot_ishu) +"arU" = ( +/obj/structure/sink/directional/south, +/obj/structure/mirror/directional/north, +/obj/effect/decal/wallpaper/grey{ + pixel_y = 32 + }, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/smokeshop) +"arV" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"arW" = ( +/obj/machinery/griddle, +/turf/open/floor/city/bacotell, +/area/vtm/interior/littleitaly) +"arX" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/figure/syndie{ + pixel_x = 4; + pixel_y = 5 + }, +/obj/item/toy/figure/cargotech{ + pixel_x = -4; + pixel_y = 7 + }, +/obj/item/toy/figure/janitor{ + pixel_x = 1; + pixel_y = -8 + }, +/obj/item/toy/figure/prisoner{ + pixel_x = 5; + pixel_y = 18 + }, +/obj/effect/spawner/random/entertainment/toy_figure{ + pixel_x = -10; + pixel_y = -10 + }, +/obj/effect/spawner/random/entertainment/toy_figure{ + pixel_x = 10; + pixel_y = -6 + }, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"arY" = ( +/obj/machinery/deepfryer{ + pixel_x = 2 + }, +/obj/structure/table/countertop/red, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"arZ" = ( +/obj/machinery/sprinkler, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"asa" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"asb" = ( +/turf/closed/wall/vampwall/market, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"asc" = ( +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer/nosferatu_town) +"asd" = ( +/obj/structure/vampdoor/old{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/access/clerk, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"ase" = ( +/obj/structure/table, +/obj/item/tattoo_kit{ + pixel_x = -12; + pixel_y = 9 + }, +/obj/effect/spawner/random/trash/cigbutt, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"asf" = ( +/obj/structure/table/wood, +/obj/machinery/processor, +/obj/structure/sign/flag/italy/directional/north{ + pixel_y = 30 + }, +/turf/open/floor/city/bacotell, +/area/vtm/interior/littleitaly) +"asg" = ( +/obj/structure/table/wood, +/obj/item/paperwork/ancient, +/obj/effect/spawner/random/bureaucracy/folder{ + pixel_x = -9; + pixel_y = 9 + }, +/obj/effect/spawner/random/bureaucracy/folder{ + pixel_x = 8; + pixel_y = 10 + }, +/obj/item/paperwork/ancient, +/obj/effect/spawner/random/bureaucracy/paper{ + pixel_x = 8; + pixel_y = 10 + }, +/obj/effect/spawner/random/bureaucracy/paper{ + pixel_x = -2; + pixel_y = 10 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"ash" = ( +/obj/structure/table/wood, +/obj/item/taperecorder, +/obj/item/tape, +/obj/item/storage/pill_bottle/psicodine{ + pixel_y = 4; + pixel_x = 10 + }, +/obj/item/paper, +/turf/open/floor/carpet/darkpack, +/area/vtm/interior/clinic) +"asi" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"asj" = ( +/obj/structure/secure_safe/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"ask" = ( +/obj/machinery/computer/operating{ + dir = 1 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"asl" = ( +/obj/structure/vampdoor/wood{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"asm" = ( +/turf/open/floor/plating/granite/black, +/area/vtm/westfield_mall/interior/camarilla) +"asn" = ( +/turf/open/openspace, +/area/vtm/westfield_mall/interior/maintenance/roof) +"aso" = ( +/obj/item/kirbyplants/darkpack/random, +/obj/structure/sign/flag/italy/directional/north{ + pixel_y = 30 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"asp" = ( +/obj/structure/rack/food/rand, +/obj/machinery/light/directional/south, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/shop) +"asq" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"asr" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/toy_xeno{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/toy/toy_xeno{ + pixel_x = -2; + pixel_y = -9 + }, +/obj/item/toy/toy_xeno{ + pixel_x = 8; + pixel_y = 6 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"ass" = ( +/turf/closed/wall/vampwall/brick_old, +/area/vtm/interior/sewer/nosferatu_town) +"ast" = ( +/obj/structure/aquarium/prefilled, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"asu" = ( +/obj/structure/table, +/obj/item/battering_ram, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"asv" = ( +/obj/effect/turf_decal/bordur/corner, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"asw" = ( +/obj/structure/table, +/obj/machinery/radio_tranceiver/camarilla{ + pixel_x = -4; + pixel_y = 13 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"asx" = ( +/obj/structure/vampfence/rich, +/turf/open/water/vamp_sewer/border, +/area/vtm/interior/sewer) +"asy" = ( +/obj/structure/vampdoor/old{ + dir = 1 + }, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/clerk, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/maintenance) +"asz" = ( +/obj/structure/vampipe{ + pixel_y = 32 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"asA" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/dark, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"asB" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating/stone, +/area/vtm/interior/sewer/nosferatu_town) +"asC" = ( +/obj/effect/decal/coastline{ + dir = 6 + }, +/turf/open/misc/beach/vamp, +/area/vtm/westfield_mall/forest) +"asE" = ( +/obj/structure/chair/sofa/corner/brown{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"asF" = ( +/obj/structure/toilet{ + dir = 4; + pixel_y = 8 + }, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/skatepark) +"asG" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"asH" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior/techshop) +"asI" = ( +/obj/effect/turf_decal/bordur{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"asJ" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"asK" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"asL" = ( +/turf/open/openspace, +/area/vtm/interior/elevator) +"asM" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall) +"asN" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/siding/wood/dark/corner{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"asO" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"asP" = ( +/obj/structure/sign/poster/city/bloodrayne/directional/north, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"asQ" = ( +/obj/structure/toilet{ + dir = 4; + pixel_y = 4 + }, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"asR" = ( +/obj/structure/table, +/obj/item/modular_computer/laptop/preset/civilian, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer/nosferatu_town) +"asS" = ( +/obj/effect/spawner/random/engineering/tank, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"asT" = ( +/turf/open/floor/plating/canal, +/area/vtm/interior/sewer) +"asU" = ( +/obj/machinery/light/prince/directional/south, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"asV" = ( +/obj/structure/vampipe{ + icon_state = "piping7"; + pixel_y = 32 + }, +/turf/open/floor/plating/canal, +/area/vtm/interior/sewer) +"asW" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/obj/effect/decal/cleanable/trash, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"asX" = ( +/obj/structure/table/countertop/bubway, +/obj/machinery/griddle, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"asY" = ( +/obj/structure/roadblock{ + dir = 4 + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/interior/supply) +"asZ" = ( +/obj/effect/decal/graffiti, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"ata" = ( +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/smokeshop) +"atb" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/item/toner/large{ + pixel_y = 7 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"atc" = ( +/obj/machinery/light/cold/directional/east, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"ate" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/cockroach/sewer, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"atf" = ( +/obj/effect/turf_decal/crosswalk{ + dir = 8 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"atg" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/machinery/recharger{ + pixel_y = 16; + pixel_x = 6 + }, +/obj/machinery/recharger{ + pixel_y = 16; + pixel_x = -6 + }, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"ath" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/anarch/sweeper, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"ati" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"atj" = ( +/obj/effect/turf_decal/siding/grey/inner_corner, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/supply) +"atk" = ( +/obj/effect/decal/rugs, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/smokeshop) +"atl" = ( +/obj/structure/secure_safe/directional/north, +/obj/structure/table, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 5; + pixel_x = 8 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 5; + pixel_x = 8 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 5; + pixel_x = 8 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 5; + pixel_x = 8 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 13; + pixel_x = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 13; + pixel_x = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 13; + pixel_x = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/interior/bianchiBank) +"atm" = ( +/obj/effect/turf_decal/siding/wood/light{ + dir = 1 + }, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"atn" = ( +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/interior/clinic) +"ato" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/westfield_mall/interior/anarch) +"atp" = ( +/obj/effect/turf_decal/siding/grey, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"atq" = ( +/obj/effect/turf_decal/bordur{ + dir = 8 + }, +/obj/effect/turf_decal/bordur{ + dir = 4 + }, +/obj/structure/vampdoor/wood, +/obj/effect/mapping_helpers/door/access/old_clan_tzimisce, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"atr" = ( +/obj/structure/chair/pew/left{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"ats" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 1 + }, +/obj/darkpack_car/retro/rand, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"att" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"atu" = ( +/obj/structure/sign/flag/california/rare{ + pixel_y = 28; + dir = 1 + }, +/turf/open/floor/carpet, +/area/awaymission/errorroom) +"atv" = ( +/obj/structure/chair/pew/right{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"atw" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/city/bacotell, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"atx" = ( +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"aty" = ( +/obj/structure/fence/corner{ + dir = 8 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"atz" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"atA" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/water, +/area/vtm/interior/bianchiBank) +"atB" = ( +/obj/effect/landmark/error, +/turf/open/floor/carpet, +/area/awaymission/errorroom) +"atC" = ( +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/westfield_mall/interior/supply) +"atD" = ( +/obj/effect/decal/pallet, +/obj/structure/closet/crate/cardboard, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"atE" = ( +/obj/item/vampirebook/quran, +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"atF" = ( +/obj/structure/vampdoor/old{ + dir = 4 + }, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"atG" = ( +/obj/structure/table, +/obj/structure/fluff/tv{ + pixel_y = 12 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/carpet/darkpack/blackgold, +/area/vtm/westfield_mall/interior/techshop) +"atH" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 6 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"atI" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/structure/table/wood, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"atJ" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/church) +"atK" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet/any, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"atL" = ( +/obj/structure/table, +/obj/item/shovel/vamp, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/anarch) +"atM" = ( +/turf/open/misc/dirt, +/area/vtm/westfield_mall/interior/cave) +"atN" = ( +/obj/effect/decal/wallpaper/red, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/janitor) +"atO" = ( +/obj/structure/chair/wood/darkpack/red, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 9 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"atP" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/coffee_condi_display{ + pixel_x = 8; + pixel_y = 7 + }, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"atQ" = ( +/obj/structure/vampdoor/old, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"atR" = ( +/obj/structure/rack, +/obj/item/screwdriver, +/obj/item/screwdriver, +/obj/item/screwdriver, +/obj/item/wirecutters, +/obj/item/wirecutters, +/obj/item/wirecutters, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"atS" = ( +/turf/open/openspace, +/area/vtm/westfield_mall/interior/games_store) +"atT" = ( +/obj/structure/table/modern, +/obj/item/clothing/under/vampire/punk{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/clothing/under/vampire/punk{ + pixel_x = -6; + pixel_y = 3 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"atU" = ( +/obj/effect/turf_decal/siding/wood/dark, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/interior/clinic) +"atV" = ( +/mob/living/carbon/human/npc/bandit, +/turf/open/misc/dirt, +/area/vtm/interior/sewer) +"atW" = ( +/obj/structure/rack/food/rand, +/obj/machinery/light/directional/north, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/shop) +"atX" = ( +/obj/structure/hedge/opaque, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"atY" = ( +/obj/structure/flora/rock/darkpack_big, +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior) +"atZ" = ( +/obj/effect/decal/wallpaper/grey{ + pixel_y = 32 + }, +/obj/structure/toilet{ + dir = 4; + pixel_y = 4 + }, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/hot_ishu) +"aua" = ( +/obj/machinery/light/prince/directional/south, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"aub" = ( +/obj/transfer_point_vamp{ + id = "forestR2" + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"auc" = ( +/obj/effect/decal/wallpaper/papers/six, +/obj/effect/decal/wallpaper/paper/darkgreen, +/turf/closed/wall/vampwall/junk, +/area/vtm/interior/sewer/nosferatu_town) +"aud" = ( +/obj/machinery/light/prince/broken/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aue" = ( +/obj/structure/table, +/obj/item/screwdriver{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stock_parts/power_store/cell{ + pixel_x = 6; + pixel_y = 1 + }, +/obj/item/stock_parts/power_store/cell{ + pixel_x = 8; + pixel_y = 1 + }, +/obj/item/stock_parts/power_store/cell{ + pixel_x = 10; + pixel_y = 1 + }, +/obj/item/defibrillator/loaded{ + pixel_x = 1; + pixel_y = 20 + }, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"auf" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/decal/wallpaper/grey{ + pixel_y = 32 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"aug" = ( +/obj/effect/decal/cleanable/blood/splatter/oil, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior/endron_logging) +"auh" = ( +/obj/effect/turf_decal/siding/wood/light{ + dir = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aui" = ( +/obj/structure/vampdoor/wood, +/obj/effect/mapping_helpers/door/access/supply, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"auj" = ( +/obj/structure/glowshroom, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/cave) +"auk" = ( +/obj/structure/railing/wooden_fence{ + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"aul" = ( +/obj/structure/vampdoor/wood, +/turf/open/misc/dirt, +/area/vtm/interior) +"aum" = ( +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/maintenance) +"aun" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"auo" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/plating/stone, +/area/vtm/interior/sewer/nosferatu_town) +"aup" = ( +/obj/effect/turf_decal/darkpack/grass{ + dir = 8 + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall) +"auq" = ( +/obj/structure/vampdoor/simple{ + dir = 4 + }, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"aur" = ( +/obj/structure/closet/crate/freezer/blood, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"aus" = ( +/obj/structure/vampdoor{ + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"aut" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/supply) +"auu" = ( +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/westfield_mall/interior/camarilla) +"auv" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/smokeshop) +"auw" = ( +/turf/closed/wall/vampwall/junk, +/area/vtm/interior/sewer/nosferatu_town) +"aux" = ( +/obj/structure/table/reinforced, +/obj/item/melee/baton/vamp, +/obj/item/melee/baton/vamp, +/obj/item/melee/baton/vamp, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"auy" = ( +/obj/item/cigbutt, +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall) +"auz" = ( +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/skatepark) +"auA" = ( +/obj/structure/hedge, +/obj/machinery/light/prince/directional/east, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"auB" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"auC" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"auD" = ( +/obj/structure/table/modern, +/obj/item/flashlight/lamp/green, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"auE" = ( +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"auF" = ( +/obj/structure/table/wood, +/obj/machinery/microwave, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"auG" = ( +/obj/effect/landmark/start, +/obj/structure/chair/plastic/darkpack{ + dir = 1 + }, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt) +"auH" = ( +/obj/effect/decal/coastline{ + dir = 4 + }, +/turf/open/misc/beach/vamp, +/area/vtm/westfield_mall/forest) +"auI" = ( +/obj/darkpack_car/limousine/camarilla, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"auJ" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping25" + }, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"auK" = ( +/turf/open/misc/dirt/rails, +/area/vtm/interior/sewer) +"auL" = ( +/mob/living/basic/mouse/vampire{ + name = "Scully" + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/maintenance) +"auM" = ( +/turf/open/misc/grass/random, +/area/vtm/westfield_mall/forest) +"auN" = ( +/obj/effect/turf_decal/siding/wood/light{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/clothing_store) +"auO" = ( +/obj/effect/spawner/random/structure/crate_loot, +/obj/effect/decal/pallet, +/obj/machinery/light/small/directional/east, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"auP" = ( +/obj/structure/vampdoor/old{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/npc, +/turf/open/floor/city/bacotell, +/area/vtm/interior/littleitaly) +"auQ" = ( +/turf/open/openspace, +/area/vtm/westfield_mall/interior/maintenance) +"auS" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"auT" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping4" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"auU" = ( +/obj/structure/chair/plastic/darkpack{ + dir = 8 + }, +/obj/effect/landmark/start/darkpack/voivode/bogatyr, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"auV" = ( +/obj/effect/turf_decal/bordur{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"auW" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/fish_feed{ + pixel_x = -6; + pixel_y = 17 + }, +/obj/item/storage/box/aquarium_props{ + pixel_x = 9; + pixel_y = 17 + }, +/obj/item/aquarium_kit{ + pixel_x = 2 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"auX" = ( +/obj/structure/chair/office/darkpack/green, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"auY" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/supply) +"auZ" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/clinic) +"ava" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 8 + }, +/obj/transfer_point_vamp{ + id = "garage4" + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"avb" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp{ + pixel_x = -8; + pixel_y = 13 + }, +/obj/effect/spawner/random/bureaucracy/folder{ + pixel_x = 5; + pixel_y = 2 + }, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/effect/spawner/random/bureaucracy/pen, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"avc" = ( +/obj/structure/vampdoor/old{ + dir = 1 + }, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/camarilla, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/roof) +"avd" = ( +/obj/structure/bookcase/random/nonfiction, +/obj/machinery/light/prince/directional/west, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"ave" = ( +/obj/structure/vampdoor/old, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/five, +/obj/effect/mapping_helpers/door/access/clerk, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"avf" = ( +/obj/structure/flora/rock/stalagmite, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"avg" = ( +/obj/structure/chair/comfy/darkpack/dark, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"avh" = ( +/obj/structure/curtain/cloth/fancy/mechanical/luxurious{ + pixel_y = 16 + }, +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/games_store) +"avi" = ( +/obj/structure/rack/food/rand, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/shop) +"avj" = ( +/obj/structure/closet/boxinggloves, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior) +"avk" = ( +/obj/structure/vampipe, +/turf/closed/wall/vampwall/metal/reinforced, +/area/vtm/westfield_mall/interior/endron_logging) +"avl" = ( +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/clothing_store) +"avm" = ( +/obj/structure/vampdoor/old{ + dir = 1 + }, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/camarilla, +/obj/effect/mapping_helpers/door/lock_difficulty/eight, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/camarilla) +"avn" = ( +/obj/structure/stairs/ramp/south, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/skatepark) +"avo" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/decoration/ornament{ + pixel_x = 6; + pixel_y = 11 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"avp" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 8 + }, +/obj/effect/turf_decal/asphalt, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"avq" = ( +/obj/structure/vampdoor/old{ + dir = 1 + }, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/hot_ishu) +"avr" = ( +/obj/effect/decal/wallpaper/stone, +/turf/closed/wall/vampwall/market, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"avs" = ( +/obj/machinery/lift_indicator/directional/north{ + pixel_x = -5; + pixel_y = 20; + linked_elevator_id = "mall_elevator_1" + }, +/obj/machinery/button/elevator/directional/north{ + id = "mall_elevator_1"; + pixel_y = 35; + pixel_x = 9 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"avt" = ( +/obj/structure/vampdoor/old{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/clerk, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"avu" = ( +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/maintenance) +"avv" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 8 + }, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall) +"avw" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"avx" = ( +/obj/machinery/light/prince/ghost/directional/north, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"avy" = ( +/obj/structure/curtain/bounty/start_closed, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"avz" = ( +/obj/effect/turf_decal/siding/grey/corner, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/supply) +"avA" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood/dark, +/turf/open/floor/city/bacotell, +/area/vtm/interior/bianchiBank) +"avB" = ( +/obj/structure/table, +/obj/vampire_computer{ + pixel_y = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"avC" = ( +/obj/structure/table/modern, +/obj/structure/retail/smoke_menu, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"avD" = ( +/obj/structure/table/modern, +/obj/structure/retail/smoke_menu, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"avE" = ( +/obj/effect/decal/pallet, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"avF" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/shop) +"avG" = ( +/obj/structure/flora/rock/darkpack, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"avH" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"avI" = ( +/obj/effect/spawner/random/trash/mopbucket, +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping5" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"avJ" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"avK" = ( +/obj/structure/chair/sofa/city_bench/metal/left{ + dir = 4 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"avL" = ( +/obj/structure/closet/crate/cardboard, +/obj/effect/decal/pallet, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"avM" = ( +/obj/structure/table/countertop/black, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"avN" = ( +/obj/effect/turf_decal/siding/wood/light, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/clothing_store) +"avO" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"avP" = ( +/turf/open/floor/wood/herring, +/area/vtm/interior/littleitaly) +"avQ" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_y = 6 + }, +/obj/item/pen{ + pixel_y = 7 + }, +/obj/structure/detectiveboard/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"avR" = ( +/turf/open/space/basic, +/area/space) +"avS" = ( +/obj/structure/sign/warning/yes_smoking/circle/directional/north, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"avT" = ( +/obj/structure/vampfence/rich, +/obj/structure/retail/black_market, +/obj/structure/platform/lowwall/brick_old, +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer) +"avU" = ( +/obj/machinery/vending/donksofttoyvendor, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"avV" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"avW" = ( +/obj/effect/decal/wallpaper/blue, +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/shop) +"avX" = ( +/obj/structure/closet, +/obj/item/gun/energy/taser/darkpack, +/obj/item/gun/energy/taser/darkpack, +/obj/item/melee/baton/vamp, +/obj/item/melee/baton/vamp, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"avY" = ( +/obj/structure/chair/sofa/corp/right, +/obj/machinery/light/blacklight/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"avZ" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/obj/effect/landmark/npcability, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"awa" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/interior/police) +"awb" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/structure/sign/warning/secure_area, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/endron_logging) +"awc" = ( +/obj/machinery/light/directional/north, +/obj/structure/chair/sofa/corp, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/theatre) +"awd" = ( +/obj/effect/turf_decal/siding/wood/dark/corner{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"awe" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"awf" = ( +/obj/effect/decal/wallpaper/red, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/supply) +"awg" = ( +/obj/structure/table/wood, +/obj/item/fish_tank{ + pixel_y = 6 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"awh" = ( +/obj/effect/turf_decal/bordur{ + dir = 6 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"awi" = ( +/obj/effect/turf_decal/bordur{ + dir = 10 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"awj" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/grey{ + dir = 1 + }, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"awk" = ( +/obj/structure/table, +/obj/item/assembly/timer{ + pixel_x = 3; + pixel_y = 12 + }, +/obj/item/assembly/timer{ + pixel_x = 3; + pixel_y = 7 + }, +/obj/item/assembly/timer{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/assembly/signaler{ + pixel_x = 12; + pixel_y = 16 + }, +/obj/item/assembly/signaler{ + pixel_x = 12; + pixel_y = 7 + }, +/obj/item/assembly/voice{ + pixel_x = -9; + pixel_y = 14 + }, +/obj/item/assembly/voice{ + pixel_x = -10; + pixel_y = 10 + }, +/obj/item/assembly/infra{ + pixel_x = -10; + pixel_y = 2 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"awm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/south, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"awn" = ( +/obj/structure/chair/sofa/city_bench/metal/right/yellow{ + dir = 4 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"awo" = ( +/obj/structure/chair/sofa/city_bench/metal/left/black, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"awp" = ( +/obj/structure/table, +/obj/item/fireaxe/vamp, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"awq" = ( +/obj/structure/chair/sofa/city_bench/metal/left{ + dir = 1 + }, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior) +"awr" = ( +/obj/structure/vampdoor/old, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/npc, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"aws" = ( +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"awt" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/style_random, +/obj/structure/railing, +/obj/machinery/light/blacklight/directional/west, +/turf/open/misc/dirt, +/area/vtm/interior/sewer/nosferatu_town) +"awu" = ( +/obj/structure/railing/wooden_fence{ + dir = 8 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"awv" = ( +/obj/structure/chair/office/darkpack/blue, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aww" = ( +/obj/structure/chair/plastic/darkpack, +/turf/open/misc/beach/vamp, +/area/vtm/westfield_mall/forest) +"awx" = ( +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/games_store) +"awy" = ( +/obj/structure/chair/sofa/middle/brown, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"awz" = ( +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"awA" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/mess, +/obj/effect/spawner/random/trash/garbage, +/obj/effect/spawner/random/trash/garbage, +/obj/machinery/light/small/directional/east, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"awB" = ( +/turf/open/openspace, +/area/vtm/westfield_mall/interior) +"awC" = ( +/obj/structure/chair/office/darkpack/blue{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/hospital/doctor, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"awD" = ( +/obj/structure/glowshroom/shadowshroom, +/turf/open/misc/grass, +/area/vtm/westfield_mall/forest) +"awE" = ( +/obj/structure/guncase, +/obj/item/gun/ballistic/automatic/darkpack/huntrifle, +/obj/item/gun/ballistic/automatic/darkpack/huntrifle, +/obj/item/gun/ballistic/automatic/darkpack/huntrifle, +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/interior/supply) +"awF" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/turf/open/floor/city/industrial/large, +/area/vtm/interior/shop) +"awH" = ( +/obj/structure/sink/basin/directional/west, +/obj/structure/table/countertop/black, +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) +"awI" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/structure/reagent_dispensers/water_cooler{ + density = 0; + pixel_x = 9 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"awJ" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"awK" = ( +/obj/structure/roofstuff/alt2, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"awL" = ( +/obj/effect/decal/wallpaper/paper/darkgreen, +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/shop) +"awM" = ( +/obj/structure/rack, +/obj/item/storage/medkit/darkpack/advanced, +/obj/item/storage/medkit/darkpack, +/obj/item/storage/medkit/darkpack, +/obj/item/storage/medkit/darkpack/burn, +/obj/item/storage/medkit/darkpack/brute, +/obj/item/defibrillator/loaded, +/obj/item/clothing/mask/breath/medical, +/obj/item/clothing/mask/breath/medical, +/obj/item/tank/internals/anesthetic, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"awN" = ( +/obj/effect/spawner/random/trash/rat, +/turf/open/water/vamp_sewer, +/area/vtm/interior/sewer) +"awO" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/skatepark) +"awP" = ( +/obj/structure/stairs/east, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"awQ" = ( +/obj/effect/turf_decal/siding/grey, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/supply) +"awR" = ( +/obj/effect/turf_decal/bordur, +/obj/effect/decal/rugs, +/obj/structure/vampdoor/old, +/obj/effect/mapping_helpers/door/access/nosferatu, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/plating/rough{ + icon_state = "carpet_black" + }, +/area/vtm/interior/sewer/nosferatu_town) +"awS" = ( +/obj/structure/lattice/grate, +/turf/open/openspace, +/area/vtm/westfield_mall/skatepark) +"awT" = ( +/obj/structure/vampdoor/old, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/clerk, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"awU" = ( +/obj/vampire_computer, +/obj/structure/table/countertop/bubway, +/turf/open/floor/carpet/darkpack/greengold, +/area/vtm/westfield_mall/interior/games_store) +"awV" = ( +/obj/structure/hedge, +/obj/effect/spawner/random/flora/flowers, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"awW" = ( +/obj/structure/coclock/grandpa, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"awX" = ( +/obj/item/kirbyplants/darkpack/random, +/turf/open/floor/plating/granite/black, +/area/vtm/interior/shop) +"awY" = ( +/obj/structure/chair/office/darkpack/red{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"awZ" = ( +/obj/effect/decal/cleanable/litter, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/anarch) +"axa" = ( +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"axb" = ( +/obj/structure/stairs/east, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/maintenance) +"axc" = ( +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/smokeshop) +"axd" = ( +/obj/structure/rack/clothing/rand, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"axe" = ( +/obj/structure/table/countertop/teal, +/obj/structure/retail/deli, +/turf/open/floor/city/bacotell, +/area/vtm/interior/shop) +"axf" = ( +/obj/structure/vampdoor/wood, +/obj/effect/mapping_helpers/door/access/clinic, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/clinic) +"axg" = ( +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/westfield_mall/interior/anarch) +"axh" = ( +/obj/structure/chair/sofa/corp/corner, +/obj/structure/sign/painting{ + pixel_y = 32; + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/theatre) +"axi" = ( +/obj/effect/turf_decal/bordur{ + dir = 9 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"axj" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"axk" = ( +/obj/structure/table/wood, +/obj/structure/retail/hot_ishu, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/hot_ishu) +"axl" = ( +/obj/effect/turf_decal/siding/dark/inner_corner{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"axm" = ( +/obj/structure/vampfence/rich, +/obj/effect/turf_decal/bordur{ + dir = 8 + }, +/turf/open/floor/plating/sidewalkalt, +/area/vtm/westfield_mall/forest) +"axn" = ( +/obj/structure/fluff/sat_dish, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"axo" = ( +/obj/effect/decal/wallpaper/paper/darkred, +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/littleitaly) +"axp" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/decal/cleanable/molten_object/large, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/endron_logging) +"axq" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"axs" = ( +/obj/structure/chair/sofa/city_bench/metal/right/yellow, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"axt" = ( +/turf/open/floor/iron/stairs/right{ + dir = 8 + }, +/area/vtm/westfield_mall/interior/theatre) +"axu" = ( +/obj/structure/dresser, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"axv" = ( +/obj/structure/railing/corner, +/obj/machinery/sprinkler, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"axw" = ( +/obj/effect/decal/wallpaper, +/obj/effect/decal/wallpaper/papers/eight{ + pixel_y = -4 + }, +/turf/closed/wall/vampwall/junk/alt, +/area/vtm/interior/sewer/nosferatu_town) +"axx" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/siding/wood/light, +/turf/open/floor/plating/granite/black, +/area/vtm/westfield_mall/interior/camarilla) +"axy" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"axz" = ( +/obj/structure/table/wood, +/obj/machinery/microwave, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/maintenance) +"axA" = ( +/obj/item/food/popcorn{ + pixel_x = 20; + pixel_y = 10 + }, +/obj/item/food/popcorn{ + pixel_x = 7; + pixel_y = 10 + }, +/obj/item/food/popcorn{ + pixel_x = 20; + pixel_y = 10 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"axB" = ( +/obj/structure/closet, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"axC" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior) +"axD" = ( +/obj/structure/closet/cabinet, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"axE" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/turf_decal/siding/grey/inner_corner{ + dir = 4 + }, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"axF" = ( +/obj/structure/table/wood/fancy/purple, +/obj/effect/spawner/random/entertainment/dice, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"axG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/maintenance/basement) +"axH" = ( +/obj/structure/sign/poster/city/car/directional/north{ + pixel_x = 7; + pixel_y = 31 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"axI" = ( +/obj/structure/railing, +/obj/effect/turf_decal/siding/grey, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"axJ" = ( +/obj/structure/table, +/obj/item/clothing/mask/gas/explorer{ + name = "endron gasmask" + }, +/obj/item/clothing/mask/gas/explorer{ + name = "endron gasmask" + }, +/obj/item/clothing/mask/gas/explorer{ + name = "endron gasmask" + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"axK" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/clinic) +"axL" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/maintenance) +"axM" = ( +/obj/structure/chair/plastic/darkpack, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"axN" = ( +/obj/structure/reagent_dispensers/cooking_oil, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"axO" = ( +/obj/machinery/light/directional/south, +/turf/open/openspace, +/area/vtm/westfield_mall/interior) +"axP" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/cockroach/sewer, +/turf/open/floor/wood/old, +/area/vtm/interior) +"axQ" = ( +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer) +"axR" = ( +/obj/structure/stairs/west, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"axS" = ( +/obj/machinery/oven, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"axT" = ( +/obj/structure/table/wood, +/obj/machinery/coffeemaker/impressa{ + pixel_x = -4; + pixel_y = 7 + }, +/obj/item/storage/box/coffeepack{ + pixel_y = 6 + }, +/obj/item/storage/box/coffeepack/robusta{ + pixel_y = 5 + }, +/obj/item/storage/box/coffeepack/robusta{ + pixel_x = -1; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/bottle/syrup_bottle/caramel{ + pixel_x = 10; + pixel_y = 19 + }, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"axU" = ( +/obj/effect/turf_decal/bordur{ + dir = 6 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"axV" = ( +/obj/structure/table, +/obj/item/vamp/keys/salubri{ + pixel_x = -3; + pixel_y = 12 + }, +/obj/item/vamp/keys/salubri{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/item/vamp/keys/salubri{ + pixel_x = -11; + pixel_y = 12 + }, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"axW" = ( +/obj/structure/hedge, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/interior/police) +"axX" = ( +/obj/structure/chair/sofa/right/brown, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"axY" = ( +/obj/structure/chair/office/darkpack/blue{ + dir = 4 + }, +/turf/open/floor/wood/ornate, +/area/vtm/westfield_mall/interior/camarilla) +"axZ" = ( +/obj/machinery/vending/assist, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aya" = ( +/obj/structure/rack/clothing{ + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"ayb" = ( +/obj/structure/chair/office/darkpack/blue{ + dir = 1 + }, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer/nosferatu_town) +"ayc" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/herring, +/area/vtm/interior/littleitaly) +"ayd" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/water/acid, +/area/vtm/westfield_mall/forest) +"aye" = ( +/obj/fusebox, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"ayf" = ( +/obj/item/knife/kitchen{ + pixel_y = 5; + pixel_x = 5 + }, +/obj/item/kitchen/fork, +/obj/item/kitchen/fork, +/obj/item/kitchen/fork, +/obj/structure/closet, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/rice, +/obj/item/reagent_containers/condiment/sugar, +/obj/item/plate, +/obj/item/kitchen/spoon, +/obj/item/kitchen/spoon, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"ayg" = ( +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) +"ayh" = ( +/obj/effect/decal/coastline{ + dir = 1 + }, +/turf/open/misc/beach/vamp, +/area/vtm/westfield_mall/forest) +"ayi" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/candle_box{ + pixel_x = -7; + pixel_y = 10 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"ayj" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes/dromedaryco{ + pixel_x = -6; + pixel_y = 1 + }, +/obj/item/flashlight/lantern{ + light_on = 1; + pixel_y = 15; + pixel_x = 11; + desc = "A cheap plastic lantern with eye-melting LEDs."; + name = "camping lantern"; + light_color = "#AFFFF4"; + start_on = 14 + }, +/obj/item/fishing_rod{ + pixel_y = -18 + }, +/obj/item/food/burger/plain{ + name = "stale burger"; + pixel_y = 11; + pixel_x = -8 + }, +/obj/item/food/burger/plain{ + name = "stale burger"; + pixel_x = 6; + pixel_y = 10 + }, +/obj/underplate, +/obj/item/reagent_containers/cup/glass/baggie/meth/cocaine{ + pixel_y = 13; + pixel_x = -1 + }, +/turf/open/misc/beach/vamp, +/area/vtm/westfield_mall/forest) +"ayk" = ( +/obj/structure/table, +/obj/structure/sink/directional/east{ + icon_state = "basin" + }, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"aym" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood/light{ + dir = 6 + }, +/obj/item/flashlight/lamp, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"ayn" = ( +/obj/structure/chair/sofa/city_bench/metal/left/puce{ + dir = 8 + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/sewer) +"ayo" = ( +/mob/living/carbon/human/npc/bandit, +/obj/structure/chair/plastic/darkpack{ + dir = 1 + }, +/turf/open/misc/dirt, +/area/vtm/interior/sewer) +"ayp" = ( +/obj/effect/landmark/start/darkpack/chantry/archivist, +/obj/structure/chair/office/darkpack/red{ + dir = 8 + }, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"ayq" = ( +/turf/open/floor/plating/rough/cave, +/area/vtm/westfield_mall/interior) +"ayr" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"ays" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"ayt" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"ayu" = ( +/obj/effect/turf_decal/bordur/corner/inverse, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"ayv" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/underground_parking) +"ayw" = ( +/turf/closed/wall/vampwall/junk, +/area/vtm/westfield_mall) +"ayx" = ( +/obj/structure/rack/food, +/obj/effect/spawner/random/trash/janitor_supplies, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"ayy" = ( +/obj/structure/curtain/bounty, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"ayA" = ( +/obj/effect/turf_decal/siding/grey/inner_corner{ + dir = 1 + }, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/supply) +"ayB" = ( +/obj/structure/table/countertop/red, +/obj/vampire_computer/box{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"ayC" = ( +/turf/open/floor/carpet/darkpack, +/area/vtm/interior/littleitaly) +"ayD" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 8 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"ayE" = ( +/obj/effect/mapping_helpers/door/access/camarilla, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/eight, +/obj/structure/vampdoor/reinf{ + dir = 8 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/camarilla) +"ayF" = ( +/obj/machinery/light/dim/directional/south, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"ayG" = ( +/obj/structure/table, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"ayH" = ( +/obj/structure/closet/secure_closet/medical1, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"ayJ" = ( +/obj/structure/steps{ + dir = 4; + pixel_y = -1 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"ayK" = ( +/obj/effect/decal/rugs, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/dojo) +"ayL" = ( +/obj/effect/decal/pallet, +/obj/structure/table/wood, +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"ayM" = ( +/obj/structure/roofstuff/vent_end{ + dir = 8 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"ayN" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/structure/railing, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"ayO" = ( +/obj/structure/sink/directional/south, +/obj/structure/mirror/broken/directional/north, +/obj/machinery/light/small/blacklight/directional/east, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/skatepark) +"ayP" = ( +/turf/open/floor/carpet, +/area/awaymission/errorroom) +"ayQ" = ( +/obj/structure/table/wood, +/obj/item/storage/box/drinkingglasses, +/obj/machinery/light/cold/directional/north, +/obj/item/reagent_containers/cup/glass/shaker, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"ayR" = ( +/obj/structure/filingcabinet/white, +/turf/open/floor/wood/ornate, +/area/vtm/westfield_mall/interior/camarilla) +"ayS" = ( +/obj/fake_platform/stone/noclimb, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"ayT" = ( +/turf/open/floor/iron/stairs/right, +/area/vtm/interior/mansion) +"ayU" = ( +/obj/structure/table/wood, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"ayV" = ( +/obj/structure/vampipe{ + icon_state = "piping3"; + pixel_y = 32 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"ayW" = ( +/obj/structure/vampdoor/wood{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/lasombra, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"ayX" = ( +/obj/effect/spawner/random/structure/tank_holder, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"ayY" = ( +/obj/structure/coclock, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"ayZ" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/camarilla) +"aza" = ( +/obj/effect/turf_decal/bordur{ + dir = 8 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"azb" = ( +/obj/machinery/light/dim/directional/south, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"azc" = ( +/obj/structure/closet/secure_closet/freezer/empty, +/obj/item/storage/box/coffeepack, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/milk, +/obj/machinery/light/directional/north, +/turf/open/floor/city/bacotell, +/area/vtm/interior/bianchiBank) +"azd" = ( +/obj/effect/turf_decal/bordur{ + dir = 8 + }, +/turf/open/floor/plating/sidewalkalt, +/area/vtm/westfield_mall/forest) +"aze" = ( +/obj/structure/coclock/grandpa{ + pixel_y = 12 + }, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/interior/clinic) +"azf" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood/light{ + dir = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"azg" = ( +/obj/structure/chair/plastic/darkpack{ + dir = 8 + }, +/turf/open/misc/beach/vamp, +/area/vtm/westfield_mall/forest) +"azh" = ( +/obj/effect/decal/wallpaper/stone, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior) +"azi" = ( +/obj/structure/table/wood, +/obj/machinery/coffeemaker/impressa{ + pixel_y = 8 + }, +/obj/structure/coclock, +/turf/open/floor/city/bacotell, +/area/vtm/interior/bianchiBank) +"azj" = ( +/obj/structure/table/wood/fancy/royalblack, +/obj/item/blood_hunt, +/obj/effect/turf_decal/siding/wood/light{ + dir = 8 + }, +/turf/open/floor/plating/granite/black, +/area/vtm/westfield_mall/interior/camarilla) +"azk" = ( +/obj/structure/closet/jcloset, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/janitor) +"azl" = ( +/obj/effect/landmark/start/darkpack/chantry/gargoyle, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"azm" = ( +/obj/effect/turf_decal/siding/wood/dark/corner{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"azn" = ( +/obj/structure/roadblock{ + dir = 4 + }, +/turf/open/misc/dirt, +/area/vtm/interior/sewer) +"azo" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"azp" = ( +/obj/effect/turf_decal/bordur/corner/inverse{ + dir = 1 + }, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall) +"azq" = ( +/obj/structure/rack/food{ + dir = 4; + pixel_x = 8; + pixel_y = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"azr" = ( +/obj/structure/table/countertop/teal, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/games_store) +"azs" = ( +/obj/structure/table/optable, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"azt" = ( +/obj/structure/mannequin/plastic/fancy{ + anchored = 1 + }, +/obj/effect/turf_decal/siding/wood/light/end, +/turf/open/floor/wood/ornate, +/area/vtm/westfield_mall/interior/clothing_store) +"azu" = ( +/obj/structure/chair/darkpack, +/obj/effect/landmark/start/darkpack/supply/tech, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"azv" = ( +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/interior/shop) +"azw" = ( +/obj/structure/filingcabinet{ + pixel_x = -7 + }, +/obj/structure/filingcabinet{ + pixel_x = 7 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"azx" = ( +/obj/structure/table, +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/interior/police) +"azy" = ( +/obj/structure/toilet, +/turf/open/misc/dirt, +/area/vtm/interior) +"azz" = ( +/turf/closed/wall/vampwall/brick_old, +/area/vtm/interior/sewer) +"azA" = ( +/obj/structure/flora/tree/dead, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"azB" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"azD" = ( +/obj/machinery/light/directional/east{ + pixel_y = 10 + }, +/turf/open/openspace, +/area/vtm/westfield_mall/interior) +"azE" = ( +/turf/closed/wall/vampwall/rustbad, +/area/vtm/interior/sewer) +"azF" = ( +/obj/structure/vampfence/rich, +/obj/structure/platform/lowwall/brick_old, +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer) +"azG" = ( +/obj/machinery/light/directional/north, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall) +"azH" = ( +/obj/structure/table, +/obj/item/tattoo_kit{ + pixel_x = 8; + pixel_y = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"azI" = ( +/obj/structure/chair/sofa/city_bench/metal/right/black{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"azJ" = ( +/obj/structure/closet/crate/cardboard, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"azK" = ( +/obj/structure/chair/sofa/city_bench/metal/left/yellow, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"azL" = ( +/obj/effect/decal/wallpaper/paper/rich, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/chantry) +"azM" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"azN" = ( +/obj/structure/vampdoor{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/toreador, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/theatre) +"azO" = ( +/obj/structure/vampdoor, +/turf/open/floor/plating/canal, +/area/vtm/interior/sewer) +"azP" = ( +/obj/structure/stairs/south, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"azQ" = ( +/obj/structure/vampdoor/old{ + dir = 1 + }, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/camarilla, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"azR" = ( +/obj/structure/table, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"azS" = ( +/obj/structure/filingcabinet{ + pixel_x = -7 + }, +/obj/structure/filingcabinet/security{ + pixel_x = 7 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"azT" = ( +/obj/effect/turf_decal/darkpack/grass{ + dir = 5 + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall) +"azU" = ( +/mob/living/carbon/human/npc/illegal, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"azV" = ( +/turf/open/floor/city/circled, +/area/vtm/interior/shop) +"azW" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"azX" = ( +/obj/structure/table/wood, +/obj/vampire_computer{ + pixel_y = 2 + }, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"azY" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"aAa" = ( +/obj/structure/table, +/obj/effect/decal/pallet, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"aAc" = ( +/obj/structure/rack/clothing/rand{ + dir = 4 + }, +/obj/structure/coclock, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"aAd" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"aAe" = ( +/obj/structure/table, +/obj/item/smartphone/emergency, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"aAf" = ( +/obj/structure/table/modern, +/obj/machinery/light/blacklight/directional/west, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aAg" = ( +/obj/structure/table, +/obj/structure/mirror/directional/north, +/obj/structure/sink/basin/directional/south{ + pixel_y = 2 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"aAh" = ( +/obj/effect/turf_decal/asphaltline/alt{ + dir = 4 + }, +/obj/effect/turf_decal/bordur{ + dir = 8 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aAi" = ( +/obj/effect/decal/wallpaper/papers/two, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/anarch) +"aAj" = ( +/obj/structure/table/wood, +/obj/structure/window/spawner/directional/east, +/obj/effect/turf_decal/siding/wood/light{ + dir = 4 + }, +/obj/item/food/poppypretzel{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/food/poppypretzel{ + pixel_x = 3; + pixel_y = 11 + }, +/obj/item/food/poppypretzel{ + pixel_x = -11; + pixel_y = 10 + }, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"aAk" = ( +/obj/effect/turf_decal/bordur/inverse, +/obj/darkpack_car/retro/rand{ + dir = 4; + pixel_y = -42 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aAl" = ( +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aAm" = ( +/turf/open/floor/city/bacotell, +/area/vtm/interior/shop) +"aAn" = ( +/obj/effect/turf_decal/stripes/white/line, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"aAo" = ( +/obj/item/card/hunter{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/flashlight/lamp/green{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/structure/table/wood/fancy/black, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"aAp" = ( +/obj/structure/chair/darkpack/blue{ + dir = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aAq" = ( +/obj/machinery/light/small/directional/west, +/obj/structure/toilet{ + dir = 4; + pixel_y = 17 + }, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"aAr" = ( +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/hot_ishu) +"aAs" = ( +/obj/structure/railing, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"aAt" = ( +/obj/effect/decal/rugs, +/obj/structure/vampdoor/wood{ + dir = 4 + }, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"aAu" = ( +/obj/structure/chair/sofa/corp/right, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aAv" = ( +/obj/effect/landmark/start/darkpack/citizen/citizen, +/obj/structure/chair/plastic/darkpack{ + dir = 1 + }, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt) +"aAw" = ( +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior) +"aAx" = ( +/obj/effect/decal/wallpaper/red, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/theatre) +"aAz" = ( +/obj/structure/fence, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"aAB" = ( +/obj/structure/vampdoor/old{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/smokeshop) +"aAC" = ( +/obj/structure/vampdoor/reinf{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/eight, +/obj/effect/mapping_helpers/door/access/npc, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aAD" = ( +/obj/structure/rack, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aAE" = ( +/obj/structure/vampdoor/woodglass, +/obj/effect/mapping_helpers/door/access/chantry, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aAF" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/chantry) +"aAG" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/garbage, +/obj/machinery/light/directional/west, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aAH" = ( +/obj/structure/vampdoor/simple, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aAI" = ( +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"aAJ" = ( +/obj/effect/turf_decal/siding/grey/corner{ + dir = 4 + }, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/supply) +"aAK" = ( +/obj/structure/railing, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall) +"aAL" = ( +/mob/living/carbon/human/npc/shop{ + resistant_to_disciplines = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"aAM" = ( +/obj/machinery/light/directional/west{ + pixel_y = 10 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/foodcourt) +"aAN" = ( +/obj/effect/decal/wallpaper/padded, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior) +"aAO" = ( +/obj/machinery/atm{ + dir = 4; + pixel_x = -7; + pixel_y = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aAP" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/gambling, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aAQ" = ( +/obj/structure/chair/darkpack{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/supply/tech, +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/westfield_mall/interior/supply) +"aAR" = ( +/obj/structure/table/modern, +/obj/item/clothing/under/vampire/gothic{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/under/vampire/gothic{ + pixel_x = -5; + pixel_y = 3 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"aAS" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 1 + }, +/obj/effect/landmark/npcability, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aAT" = ( +/turf/open/floor/glass/reinforced, +/area/vtm/westfield_mall) +"aAU" = ( +/obj/structure/flora/rock/darkpack, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aAV" = ( +/turf/open/floor/carpet/darkpack/hotel, +/area/vtm/interior/shop) +"aAW" = ( +/obj/effect/turf_decal/bordur/corner/inverse, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aAX" = ( +/obj/structure/vampdoor/glass, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aAY" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/folder, +/obj/effect/spawner/random/bureaucracy/folder, +/obj/effect/spawner/random/bureaucracy/folder, +/obj/structure/sign/poster/city/vesuvius/directional/north{ + pixel_x = -6 + }, +/obj/structure/sign/poster/city/tiamat/directional/north{ + pixel_x = 8; + pixel_y = 33 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aAZ" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/skatepark) +"aBa" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/effect/turf_decal/bordur{ + dir = 9 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"aBb" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping25" + }, +/turf/open/floor/plating/canal, +/area/vtm/interior/sewer) +"aBc" = ( +/obj/structure/table/wood, +/obj/vampire_computer, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aBd" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aBe" = ( +/obj/structure/closet/crate/large{ + pixel_x = -16; + pixel_y = 10 + }, +/obj/machinery/light/directional/north{ + pixel_x = -16 + }, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aBf" = ( +/obj/structure/rack/food, +/turf/open/floor/city/industrial/large, +/area/vtm/interior/shop) +"aBg" = ( +/obj/structure/chair/plastic/darkpack{ + dir = 4 + }, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"aBh" = ( +/obj/effect/decal/garou_glyph/wyrm, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"aBi" = ( +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/wood/ornate, +/area/vtm/westfield_mall/interior/camarilla) +"aBj" = ( +/obj/structure/vampfence/rich, +/obj/structure/vampipe{ + pixel_y = 32 + }, +/turf/open/floor/plating/canal, +/area/vtm/interior/sewer) +"aBk" = ( +/obj/structure/chair/sofa/city_bench/metal/middle/black, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aBl" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aBm" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/spawner/random/trash/cigbutt, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"aBn" = ( +/obj/structure/chair/plastic/darkpack{ + dir = 1 + }, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer/nosferatu_town) +"aBo" = ( +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/games_store) +"aBp" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/vet_clinic) +"aBq" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"aBr" = ( +/obj/effect/turf_decal/asphaltline/alt, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"aBs" = ( +/obj/effect/decal/cleanable/blood/splatter/oil, +/obj/effect/turf_decal/caution/red, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"aBt" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/figure/cmo{ + pixel_y = 14; + pixel_x = -4 + }, +/obj/item/toy/figure/hop{ + pixel_x = 5; + pixel_y = 8 + }, +/obj/item/toy/figure/ian{ + pixel_x = 8 + }, +/obj/item/toy/figure/captain{ + pixel_x = -4 + }, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"aBu" = ( +/turf/open/misc/grass, +/area/vtm/westfield_mall/forest) +"aBv" = ( +/obj/machinery/sprinkler, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"aBw" = ( +/obj/structure/chair/sofa/city_bench/metal/right/black, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aBx" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 10 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aBz" = ( +/obj/darkpack_car/rand{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aBA" = ( +/obj/effect/spawner/random/bureaucracy/pen, +/obj/item/paper_bin, +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/vet_clinic) +"aBB" = ( +/obj/item/reagent_containers/cup/watering_can/metal, +/turf/open/floor/plating/rough/cave, +/area/vtm/westfield_mall/interior/cave) +"aBC" = ( +/obj/structure/closet, +/obj/item/clothing/under/vampire/police, +/obj/item/clothing/under/vampire/police/long, +/obj/item/clothing/under/vampire/police/pants, +/obj/item/clothing/under/vampire/police/turtleneck, +/obj/item/clothing/under/vampire/police/utility, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"aBD" = ( +/obj/structure/vampdoor, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"aBE" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"aBF" = ( +/obj/effect/turf_decal/bordur{ + dir = 5 + }, +/obj/effect/landmark/npcactivity, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"aBG" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/directional/south, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aBH" = ( +/obj/structure/chair/wood/darkpack, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/anarch) +"aBI" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/old, +/area/vtm/interior) +"aBJ" = ( +/obj/structure/vampipe{ + pixel_y = 32 + }, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"aBK" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aBL" = ( +/obj/structure/curtain/cloth/fancy, +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/dojo) +"aBM" = ( +/obj/effect/decal/wallpaper/red, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior) +"aBN" = ( +/obj/effect/decal/rugs, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"aBO" = ( +/obj/transfer_point_vamp{ + id = "garage2" + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aBP" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aBQ" = ( +/obj/machinery/light/red/directional/west, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"aBR" = ( +/obj/structure/vampdoor/old, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"aBS" = ( +/obj/darkpack_car/track, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aBT" = ( +/obj/structure/table/countertop/bacotell, +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/turf/open/floor/city/bacotell, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aBU" = ( +/obj/structure/table/wood/fancy/red, +/obj/item/storage/bag/books, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aBV" = ( +/obj/structure/chair/sofa/city_bench/metal/left/black{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aBW" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/handcuffs, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aBX" = ( +/obj/structure/railing/wooden_fence{ + dir = 6 + }, +/obj/structure/table/countertop, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"aBY" = ( +/obj/structure/bookcase/random/fiction, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aBZ" = ( +/obj/effect/turf_decal/siding/white/inner_corner{ + dir = 8 + }, +/turf/open/water, +/area/vtm/interior/bianchiBank) +"aCa" = ( +/turf/closed/wall/vampwall/brick_old, +/area/awaymission/errorroom) +"aCb" = ( +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/supply) +"aCc" = ( +/obj/machinery/light/small/directional/north, +/turf/open/openspace, +/area/vtm/westfield_mall/interior/maintenance/roof) +"aCd" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/machinery/sprinkler, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aCe" = ( +/obj/fake_platform/grey/double, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aCf" = ( +/obj/structure/chair/comfy/brown, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aCg" = ( +/obj/effect/spawner/random/entertainment/arcade, +/turf/open/floor/eighties, +/area/vtm/westfield_mall/interior/arcade) +"aCh" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 1 + }, +/obj/effect/turf_decal/asphalt, +/obj/effect/turf_decal/bordur/inverse{ + dir = 1 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"aCi" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 4 + }, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"aCj" = ( +/obj/structure/table/wood, +/obj/item/clothing/under/vampire/turtleneck_black, +/obj/item/clothing/under/vampire/turtleneck_black, +/obj/item/clothing/under/vampire/turtleneck_black, +/obj/item/clothing/under/vampire/turtleneck_black, +/obj/item/clothing/under/vampire/turtleneck_navy, +/obj/item/clothing/under/vampire/turtleneck_navy, +/obj/item/clothing/under/vampire/turtleneck_navy, +/obj/item/clothing/under/vampire/turtleneck_navy, +/obj/item/clothing/under/vampire/turtleneck_red, +/obj/item/clothing/under/vampire/turtleneck_red, +/obj/item/clothing/under/vampire/turtleneck_red, +/obj/item/clothing/under/vampire/turtleneck_red, +/obj/item/clothing/under/vampire/turtleneck_white, +/obj/item/clothing/under/vampire/turtleneck_white, +/obj/item/clothing/under/vampire/turtleneck_white, +/obj/item/clothing/under/vampire/turtleneck_white, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"aCk" = ( +/obj/effect/decal/wallpaper/gold/alt, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/camarilla) +"aCl" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 5; + pixel_y = 7 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aCm" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/plating/granite/black, +/area/vtm/interior/shop) +"aCn" = ( +/obj/structure/table/wood/fancy/red, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aCo" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/westfield_mall/interior/theatre) +"aCp" = ( +/obj/structure/chair/wood/darkpack{ + dir = 1 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/anarch) +"aCq" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/city/circled, +/area/vtm/interior/shop) +"aCr" = ( +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/hot_ishu) +"aCs" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aCt" = ( +/obj/item/cardboard_cutout, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/janitor) +"aCu" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/engineering/toolbox, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aCv" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/westfield_mall/interior/theatre) +"aCw" = ( +/obj/effect/turf_decal/siding/wood/dark, +/obj/effect/landmark/start/darkpack/hecata/famiglia, +/turf/open/floor/city/bacotell, +/area/vtm/interior/bianchiBank) +"aCx" = ( +/obj/structure/chair/wood/darkpack/red{ + dir = 1 + }, +/obj/effect/landmark/start/darkpack/primogen/banu, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"aCy" = ( +/obj/effect/decal/shadow, +/obj/structure/flora/rock/darkpack, +/turf/open/floor/plating/rough/cave, +/area/vtm/westfield_mall/interior) +"aCz" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/maintenance) +"aCA" = ( +/obj/machinery/light/prince/directional/east, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"aCB" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping12" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aCC" = ( +/obj/structure/table/wood, +/obj/item/fish_tank{ + pixel_y = 5 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"aCD" = ( +/obj/machinery/vending/boozeomat/private, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/camarilla) +"aCE" = ( +/obj/structure/vampdoor{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/supply, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aCF" = ( +/obj/structure/curtain/bounty{ + pixel_y = -27 + }, +/obj/machinery/light/prince/directional/north, +/obj/structure/chair/wood/darkpack/red{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"aCG" = ( +/obj/effect/decal/support, +/obj/effect/decal/shadow, +/turf/open/water/vamp_sewer/border, +/area/vtm/interior/sewer) +"aCH" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"aCI" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 8 + }, +/turf/open/openspace, +/area/vtm/westfield_mall/interior/theatre) +"aCJ" = ( +/obj/structure/rack/food, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/city/industrial/large, +/area/vtm/interior/shop) +"aCK" = ( +/obj/structure/table/wood, +/obj/item/book/random{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/book/random{ + pixel_x = 10; + pixel_y = 3 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aCL" = ( +/obj/effect/spawner/random/trash/graffiti, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"aCM" = ( +/obj/structure/guncase, +/obj/item/gun/ballistic/automatic/darkpack/ak74, +/obj/machinery/light/directional/south, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/anarch) +"aCN" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/trash/janitor_supplies{ + pixel_x = 8; + pixel_y = 12 + }, +/obj/effect/spawner/random/trash/janitor_supplies{ + pixel_x = -7; + pixel_y = 12 + }, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/janitor) +"aCO" = ( +/obj/structure/rack/clothing/rand{ + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"aCP" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping27" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aCQ" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"aCR" = ( +/obj/structure/table/wood, +/obj/item/stack/dollar/hundred, +/obj/item/stack/dollar/hundred, +/obj/item/stack/dollar/hundred, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aCS" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aCT" = ( +/obj/structure/table/modern, +/obj/machinery/chem_dispenser/drinks, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aCU" = ( +/obj/structure/vampdoor/simple{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/turf_decal/siding/grey{ + dir = 4 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aCV" = ( +/obj/effect/turf_decal/asphaltline/alt, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aCX" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aCY" = ( +/obj/effect/turf_decal/siding/grey/corner{ + dir = 8 + }, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/supply) +"aCZ" = ( +/obj/structure/railing, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aDa" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/maintenance/no_decals/two, +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) +"aDb" = ( +/obj/structure/rack/food, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aDc" = ( +/obj/structure/hedge, +/obj/machinery/light/directional/north{ + pixel_x = -16 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"aDd" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 1 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"aDe" = ( +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aDf" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/obj/structure/vampdoor/wood{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/obj/effect/mapping_helpers/door/access/bank, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"aDg" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping25" + }, +/obj/effect/turf_decal/asphalt, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aDh" = ( +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"aDi" = ( +/obj/machinery/light/prince/directional/east, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"aDj" = ( +/obj/item/kirbyplants/darkpack/random{ + pixel_x = 10; + pixel_y = 14 + }, +/obj/item/kirbyplants/darkpack/random{ + pixel_x = 11; + pixel_y = 2 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aDk" = ( +/obj/structure/lattice/grate{ + dir = 4 + }, +/turf/open/water/vamp_sewer, +/area/vtm/interior/sewer) +"aDl" = ( +/obj/item/storage/toolbox/mechanical, +/obj/structure/table/reinforced, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aDm" = ( +/obj/structure/table/wood, +/obj/item/clothing/suit/hooded/robes/tremere{ + pixel_x = 8; + pixel_y = 7 + }, +/obj/item/clothing/suit/hooded/robes/tremere{ + pixel_x = 8; + pixel_y = 5 + }, +/obj/item/clothing/suit/hooded/robes/tremere{ + pixel_x = 11; + pixel_y = 5 + }, +/obj/item/clothing/suit/hooded/robes/tremere{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/clothing/suit/hooded/robes/tremere{ + pixel_x = 11; + pixel_y = 3 + }, +/obj/item/clothing/suit/hooded/robes/tremere{ + pixel_x = 8; + pixel_y = 7 + }, +/obj/item/clothing/suit/hooded/robes/magister{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/clothing/suit/hooded/robes/magister{ + pixel_x = -7; + pixel_y = 5 + }, +/obj/item/clothing/suit/hooded/robes/magister{ + pixel_x = -4; + pixel_y = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"aDn" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aDo" = ( +/obj/effect/turf_decal/siding/grey/inner_corner{ + dir = 8 + }, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/supply) +"aDp" = ( +/obj/structure/table/countertop/yellow, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior) +"aDq" = ( +/obj/effect/landmark/latejoin, +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"aDr" = ( +/obj/structure/table, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"aDs" = ( +/obj/structure/roofstuff/vent_end, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"aDt" = ( +/obj/structure/fire_barrel, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"aDu" = ( +/obj/effect/decal/wallpaper/red, +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/clinic) +"aDv" = ( +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"aDw" = ( +/obj/structure/table/wood, +/obj/structure/spirit_board, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aDx" = ( +/obj/structure/closet/cabinet, +/obj/item/reagent_containers/blood/random, +/obj/item/masquerade_contract, +/turf/open/floor/plating/granite/black, +/area/vtm/westfield_mall/interior/camarilla) +"aDy" = ( +/obj/machinery/sprinkler, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"aDz" = ( +/obj/effect/decal/wallpaper/grey{ + color = "#6d6d6d" + }, +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/shop) +"aDA" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior) +"aDB" = ( +/obj/item/food/raw_meatball, +/obj/item/food/raw_meatball, +/obj/item/food/raw_meatball, +/obj/item/food/raw_meatball, +/obj/item/food/raw_meatball, +/obj/item/food/cheese/wedge, +/obj/item/food/cheese/wedge, +/obj/item/food/cheese/wedge, +/obj/item/food/cheese/wedge, +/obj/item/food/cheese/wedge, +/obj/item/food/grown/tomato, +/obj/item/food/grown/tomato, +/obj/item/food/grown/tomato, +/obj/item/food/grown/tomato, +/obj/item/food/grown/tomato, +/obj/item/food/cannoli, +/obj/item/food/cannoli, +/obj/item/food/cannoli, +/obj/item/food/cannoli, +/obj/structure/closet/secure_closet/freezer/kitchen/all_access, +/turf/open/floor/city/bacotell, +/area/vtm/interior/littleitaly) +"aDC" = ( +/obj/machinery/light/prince/directional/south, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aDD" = ( +/obj/effect/turf_decal/bordur{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aDE" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/clothing_store) +"aDF" = ( +/obj/structure/vampdoor/wood, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/wood/herring, +/area/vtm/interior/littleitaly) +"aDG" = ( +/turf/closed/indestructible/the_matrix, +/area/vtm/westfield_mall) +"aDH" = ( +/obj/effect/decal/graffiti, +/obj/effect/decal/pallet, +/obj/structure/fluff/tv{ + icon_state = "tv_nature"; + pixel_y = 12 + }, +/obj/effect/decal/cleanable/trash, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"aDI" = ( +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"aDJ" = ( +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"aDK" = ( +/obj/structure/chair/plastic{ + dir = 4; + pixel_y = 7 + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"aDL" = ( +/obj/effect/decal/wallpaper/grey{ + pixel_y = 32 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"aDM" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/camarilla/harpy, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/camarilla) +"aDN" = ( +/obj/effect/decal/wallpaper/blue, +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/clinic) +"aDO" = ( +/obj/machinery/light/prince/directional/north, +/obj/item/kirbyplants/darkpack/random, +/turf/open/floor/plating/granite/black, +/area/vtm/westfield_mall/interior/camarilla) +"aDP" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aDQ" = ( +/obj/effect/landmark/start/darkpack/citizen/citizen, +/obj/structure/chair/plastic/darkpack, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt) +"aDR" = ( +/obj/effect/decal/cleanable/blood/oil/slippery, +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior/endron_logging) +"aDS" = ( +/obj/structure/filingcabinet/security{ + pixel_x = 7 + }, +/obj/structure/filingcabinet{ + pixel_x = -7 + }, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/interior/police) +"aDT" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/camarilla/harpy, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/camarilla) +"aDU" = ( +/obj/structure/rack/food{ + dir = 8; + pixel_x = 10 + }, +/obj/item/camera_film{ + pixel_x = 2; + pixel_y = -1 + }, +/obj/item/camera_film{ + pixel_x = 15; + pixel_y = 9 + }, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"aDV" = ( +/obj/structure/curtain/bounty, +/obj/structure/platform/lowwall/wood/window, +/turf/open/floor/plating/rough, +/area/vtm/interior) +"aDW" = ( +/obj/structure/table, +/obj/underplate, +/obj/vampire_computer/prince, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer/nosferatu_town) +"aDX" = ( +/obj/structure/chair/sofa/city_bench/metal/right{ + dir = 4 + }, +/turf/open/floor/city/plating_stone, +/area/vtm/interior/bianchiBank) +"aDY" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"aDZ" = ( +/obj/structure/table/reinforced, +/obj/item/food/donut/choco{ + pixel_x = -4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/underground_parking) +"aEa" = ( +/obj/structure/chair/wood/darkpack, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aEb" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/siding/grey{ + dir = 4 + }, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"aEc" = ( +/obj/effect/turf_decal/bordur{ + dir = 6 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"aEd" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/briefcase, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aEe" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aEf" = ( +/obj/effect/spawner/random/structure/crate_loot, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aEg" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"aEh" = ( +/obj/structure/coclock, +/obj/structure/table/reinforced, +/obj/item/table_clock, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"aEi" = ( +/obj/machinery/lift_indicator/directional/north{ + pixel_x = -5; + pixel_y = 20; + linked_elevator_id = "mall_elevator_1" + }, +/obj/machinery/button/elevator/directional/north{ + id = "mall_elevator_1"; + pixel_y = 35; + pixel_x = 9 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aEj" = ( +/obj/structure/closet/crate/wooden, +/obj/item/vamp/keys/banuhaqim, +/obj/item/vamp/keys/banuhaqim, +/obj/item/vamp/keys/banuhaqim, +/obj/item/knife/vamp, +/obj/item/knife/vamp, +/obj/item/knife/vamp, +/obj/item/masquerade_contract, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"aEk" = ( +/obj/structure/platform/lowwall/painted/window/reinforced, +/turf/open/floor/plating/rough, +/area/vtm/interior/police) +"aEm" = ( +/obj/structure/stairs/west, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/foodcourt) +"aEn" = ( +/obj/structure/lattice/grate{ + dir = 4 + }, +/turf/open/openspace, +/area/vtm/westfield_mall) +"aEo" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/decal/cleanable/trash, +/obj/structure/sign/warning/directional/north, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"aEp" = ( +/obj/effect/decal/cleanable/trash, +/obj/effect/landmark/npcactivity, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"aEq" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/effect/turf_decal/siding/grey/inner_corner{ + dir = 8 + }, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"aEr" = ( +/obj/effect/landmark/start/darkpack/camarilla/sheriff, +/obj/structure/chair/office/darkpack/blue{ + dir = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aEs" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping22" + }, +/obj/structure/vampipe{ + pixel_y = 24; + icon_state = "piping29" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aEt" = ( +/obj/structure/closet/crate/bin{ + pixel_x = -8; + pixel_y = 1 + }, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aEu" = ( +/obj/structure/coclock, +/obj/structure/chair/sofa/right/brown, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"aEv" = ( +/obj/item/plate, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/old, +/area/vtm/interior) +"aEw" = ( +/mob/living/carbon/human/npc/shop, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aEx" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/structure/sign/warning/gas_mask, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"aEy" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/figure/wizard{ + pixel_x = -8; + pixel_y = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aEz" = ( +/obj/structure/table, +/obj/item/storage/fancy/cigarettes/cigpack_midori{ + pixel_x = 6; + pixel_y = 13 + }, +/obj/item/storage/fancy/cigarettes/cigpack_midori{ + pixel_x = -6; + pixel_y = 13 + }, +/obj/item/storage/fancy/cigarettes/cigpack_midori{ + pixel_x = 8; + pixel_y = 6 + }, +/obj/item/storage/fancy/cigarettes/cigpack_midori{ + pixel_x = -3; + pixel_y = 6 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/smokeshop) +"aEA" = ( +/obj/structure/table/countertop/bubway, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"aEB" = ( +/obj/effect/turf_decal/siding/wood/dark/corner{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"aEC" = ( +/obj/structure/vampipe{ + pixel_y = 32 + }, +/obj/structure/vampipe{ + icon_state = "piping40"; + pixel_x = 27; + pixel_y = 33 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aED" = ( +/obj/structure/table/countertop/black, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aEE" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior) +"aEF" = ( +/obj/structure/punching_bag, +/obj/effect/decal/rugs, +/obj/effect/decal/rugs, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/dojo) +"aEG" = ( +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aEH" = ( +/obj/effect/spawner/random/occult/artifact, +/obj/structure/table/wood, +/obj/item/stack/cable_coil/cut, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aEI" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/vampire/helmet{ + pixel_x = 4; + pixel_y = 9 + }, +/obj/item/clothing/head/vampire/helmet{ + pixel_x = -3; + pixel_y = 9 + }, +/obj/item/clothing/suit/vampire/vest{ + pixel_x = 4 + }, +/obj/item/clothing/suit/vampire/vest{ + pixel_x = -3 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aEJ" = ( +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aEK" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"aEL" = ( +/obj/structure/stairs/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aEM" = ( +/obj/effect/decal/wallpaper/grey, +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/elevator) +"aEN" = ( +/obj/machinery/light/blacklight/directional/south, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/hot_ishu) +"aEO" = ( +/obj/structure/railing/wooden_fence{ + dir = 6 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 4 + }, +/obj/structure/lattice/grate, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/turf/open/openspace, +/area/vtm/westfield_mall/interior/games_store) +"aEP" = ( +/obj/structure/table, +/turf/open/floor/city/industrial/large, +/area/vtm/interior/shop) +"aEQ" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/bianchiBank) +"aER" = ( +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/dojo) +"aES" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) +"aET" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/old, +/area/vtm/interior) +"aEU" = ( +/obj/structure/vampdoor/old{ + dir = 8; + lock_id = "nosferatu"; + locked = 1; + lockpick_difficulty = 20 + }, +/obj/effect/mapping_helpers/door/access/nosferatu, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"aEV" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/interior/shop) +"aEW" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/figure/dsquad, +/obj/item/toy/figure/dsquad, +/obj/item/toy/figure/dsquad{ + pixel_x = 7; + pixel_y = 20 + }, +/obj/item/toy/figure/dsquad{ + pixel_x = -9; + pixel_y = 11 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aEX" = ( +/obj/effect/decal/wallpaper/blue/low, +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/police) +"aEY" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aEZ" = ( +/obj/structure/bed, +/obj/structure/coclock, +/obj/item/bedsheet/yellow, +/turf/open/floor/carpet/darkpack/greengold, +/area/vtm/interior/sewer/nosferatu_town) +"aFa" = ( +/obj/fake_platform/stone/easyclimb, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aFb" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/decal/rugs, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"aFc" = ( +/turf/cordon, +/area/misc/cordon) +"aFd" = ( +/obj/structure/vampdoor/wood, +/obj/effect/mapping_helpers/door/access/clinic, +/turf/open/floor/plating/concrete, +/area/vtm/interior/clinic) +"aFe" = ( +/obj/machinery/chem_master, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aFf" = ( +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aFg" = ( +/obj/machinery/light/directional/west, +/obj/structure/table/wood, +/obj/effect/spawner/random/trash/cigbutt, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/anarch) +"aFh" = ( +/obj/structure/table/modern, +/obj/item/toy/figure/chef{ + pixel_x = -9; + pixel_y = 13; + anchored = 1 + }, +/obj/item/toy/figure/paramedic{ + pixel_y = 11; + anchored = 1 + }, +/obj/item/toy/figure/miner{ + pixel_x = -5; + pixel_y = 4; + anchored = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"aFi" = ( +/obj/effect/decal/rugs, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/interior/shop) +"aFj" = ( +/obj/structure/lattice/grate, +/turf/open/water/vamp_sewer/border, +/area/vtm/interior/sewer) +"aFk" = ( +/obj/machinery/light/cold/directional/south, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"aFl" = ( +/obj/structure/railing/wooden_fence{ + dir = 1; + pixel_y = 8 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aFm" = ( +/obj/structure/table/countertop/teal, +/obj/structure/retail/grocery_store, +/turf/open/floor/city/bacotell, +/area/vtm/interior/shop) +"aFn" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aFo" = ( +/obj/structure/chair/office/darkpack/red{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/hecata/capo, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"aFp" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aFq" = ( +/turf/closed/wall/vampwall/brick, +/area/vtm/westfield_mall/interior/supply) +"aFr" = ( +/obj/effect/spawner/random/trash/mopbucket, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aFs" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 10 + }, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall) +"aFt" = ( +/obj/structure/noticeboard/directional/north, +/obj/item/gun/ballistic/automatic/darkpack/huntrifle{ + anchored = 1; + pixel_y = 29 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aFu" = ( +/obj/structure/railing/wooden_fence{ + dir = 8 + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"aFv" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aFw" = ( +/mob/living/carbon/human/npc/shop, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aFx" = ( +/obj/structure/rack/clothing/rand{ + dir = 8 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"aFy" = ( +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"aFz" = ( +/obj/structure/chair/office/darkpack/blue{ + dir = 4 + }, +/mob/living/carbon/human/npc/shop, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aFA" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/under/syndicate/tacticool/skirt, +/obj/item/clothing/under/syndicate/tacticool/skirt, +/obj/item/clothing/under/syndicate/tacticool, +/obj/item/clothing/under/syndicate/tacticool, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aFB" = ( +/obj/structure/closet/secure_closet/chemical/heisenberg, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aFC" = ( +/obj/machinery/smartfridge/chemistry/preloaded, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aFD" = ( +/obj/item/melee/skateboard{ + pixel_y = -3; + anchored = 1 + }, +/obj/effect/decal/wallpaper/stone, +/turf/closed/wall/vampwall/brick_old, +/area/vtm/westfield_mall/interior/skatepark) +"aFE" = ( +/obj/structure/table/wood, +/obj/machinery/light/prince/broken/directional/east, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aFF" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/eighties, +/area/vtm/westfield_mall/interior/arcade) +"aFG" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/shop) +"aFH" = ( +/obj/effect/decal/cleanable/trash, +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/sewer/nosferatu_town) +"aFI" = ( +/obj/structure/bookcase/random/fiction, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aFK" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/jerrycan/opaque/yellow{ + pixel_x = 5; + pixel_y = 12 + }, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/janitor) +"aFL" = ( +/obj/structure/frame/machine/secured, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"aFM" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aFN" = ( +/obj/effect/turf_decal/siding/white/corner{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aFO" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/fake_platform/grey/double, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aFP" = ( +/obj/structure/vampstatue, +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/turf/open/water, +/area/vtm/westfield_mall/forest) +"aFQ" = ( +/obj/machinery/sprinkler, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/foodcourt) +"aFR" = ( +/turf/open/floor/carpet/lone, +/area/vtm/westfield_mall/interior/theatre) +"aFS" = ( +/turf/open/openspace, +/area/vtm/westfield_mall/parking_lot) +"aFT" = ( +/obj/darkpack_car/endroncar{ + dir = 6 + }, +/turf/open/floor/city/light, +/area/vtm/westfield_mall/interior) +"aFU" = ( +/obj/structure/sink/directional/south, +/obj/structure/mirror/directional/north, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"aFV" = ( +/obj/effect/turf_decal/bordur{ + dir = 4 + }, +/obj/effect/decal/cleanable/trash, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"aFW" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/westfield_mall/interior/chantry) +"aFX" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/hot_ishu) +"aFZ" = ( +/obj/structure/rack/food{ + dir = 8; + pixel_x = 10 + }, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"aGa" = ( +/obj/machinery/light/directional/west, +/obj/effect/decal/cleanable/trash, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"aGb" = ( +/mob/living/carbon/human/npc/shop, +/obj/structure/chair/darkpack, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aGc" = ( +/obj/effect/turf_decal/bordur, +/turf/open/water, +/area/vtm/westfield_mall/forest) +"aGd" = ( +/obj/structure/filingcabinet{ + pixel_x = -7 + }, +/obj/structure/filingcabinet{ + pixel_x = 7 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aGe" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/camarilla) +"aGf" = ( +/obj/effect/turf_decal/caution/stand_clear/red{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/north, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"aGg" = ( +/obj/effect/turf_decal/bordur, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aGh" = ( +/obj/structure/table/wood, +/obj/item/vamp/keys/clerk{ + pixel_x = 6; + pixel_y = 10 + }, +/obj/item/vamp/keys/cleaning{ + pixel_x = -1; + pixel_y = 11 + }, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/janitor) +"aGi" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping25" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aGj" = ( +/obj/effect/turf_decal/asphalt, +/obj/effect/landmark/npcactivity, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"aGk" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aGl" = ( +/obj/structure/table/modern, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"aGm" = ( +/obj/effect/spawner/random/structure/billboard, +/turf/open/misc/grass/random/grass, +/area/vtm/westfield_mall) +"aGn" = ( +/obj/structure/rack/food{ + dir = 8; + pixel_x = -8; + pixel_y = 2 + }, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"aGo" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/clinic) +"aGp" = ( +/turf/open/water/beach/vamp, +/area/vtm/westfield_mall/forest) +"aGr" = ( +/obj/effect/landmark/start/darkpack/camarilla/hound, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aGs" = ( +/obj/darkpack_car/retro/debug{ + dir = 2 + }, +/turf/open/floor/carpet, +/area/awaymission/errorroom) +"aGt" = ( +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aGu" = ( +/obj/structure/vampdoor/wood{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/access/supply, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/supply) +"aGv" = ( +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/supply) +"aGw" = ( +/obj/structure/mannequin/skeleton, +/obj/vehicle/ridden/scooter/skateboard, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"aGx" = ( +/obj/effect/turf_decal/siding/wood/dark, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"aGy" = ( +/obj/structure/chair/sofa/city_bench/metal/middle/black{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aGz" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aGA" = ( +/obj/structure/hedge, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"aGB" = ( +/obj/structure/weightmachine/weightlifter, +/obj/effect/decal/rugs, +/obj/structure/railing, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"aGC" = ( +/obj/structure/closet/secure_closet/freezer/fridge/all_access, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aGD" = ( +/obj/effect/spawner/random/trash/mopbucket, +/obj/structure/vampipe{ + pixel_y = 32 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aGE" = ( +/obj/structure/table/wood/fancy/purple, +/obj/effect/spawner/random/bureaucracy/crayon, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"aGF" = ( +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"aGG" = ( +/obj/effect/turf_decal/bordur/corner, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aGH" = ( +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"aGI" = ( +/obj/machinery/deepfryer{ + pixel_x = -1 + }, +/obj/structure/table/countertop/red, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aGJ" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aGK" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"aGL" = ( +/obj/machinery/sprinkler, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"aGM" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/mob/living/basic/pet/dog/bullterrier, +/turf/open/floor/carpet, +/area/awaymission/errorroom) +"aGN" = ( +/obj/structure/chair/office/darkpack/blue{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/law_enforcement/dispatcher, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"aGO" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/structure/closet/crate/dumpster, +/obj/effect/decal/cleanable/garbage{ + pixel_x = -6; + pixel_y = -6 + }, +/obj/effect/decal/cleanable/cardboard, +/obj/effect/decal/cleanable/trash, +/obj/machinery/light/small/red/directional/west, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"aGP" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/elevator) +"aGQ" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 1 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aGR" = ( +/obj/structure/closet/secure_closet/evidence, +/obj/item/storage/box/evidence, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"aGS" = ( +/obj/structure/chair/office/darkpack/blue, +/obj/effect/landmark/start/darkpack/law_enforcement/officer, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"aGT" = ( +/obj/structure/table, +/obj/item/knife/vamp{ + pixel_x = 7; + pixel_y = -1 + }, +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"aGU" = ( +/turf/open/floor/carpet/darkpack/cyan, +/area/vtm/westfield_mall/interior/vet_clinic) +"aGV" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 9 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"aGW" = ( +/obj/effect/turf_decal/darkpack/grass/corner{ + dir = 1 + }, +/obj/effect/spawner/random/flora/grass, +/turf/open/misc/dirt, +/area/vtm/westfield_mall) +"aGX" = ( +/obj/structure/glowshroom, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/interior/cave) +"aGY" = ( +/turf/closed/wall/vampwall/green, +/area/vtm/westfield_mall/forest) +"aGZ" = ( +/obj/effect/turf_decal/bordur/corner/inverse{ + dir = 8 + }, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall) +"aHa" = ( +/obj/effect/turf_decal/siding/grey{ + dir = 4 + }, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/supply) +"aHb" = ( +/obj/machinery/light/floor, +/turf/open/misc/grass/random/bushes, +/area/vtm/westfield_mall/interior) +"aHc" = ( +/obj/effect/turf_decal/asphaltline/alt{ + dir = 4 + }, +/obj/darkpack_car/rand{ + dir = 9 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aHd" = ( +/obj/machinery/camera/autoname/directional/east, +/turf/open/openspace, +/area/vtm/westfield_mall/interior/chantry) +"aHe" = ( +/obj/effect/turf_decal/asphalt, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"aHf" = ( +/turf/open/floor/carpet/darkpack/blackgold, +/area/vtm/westfield_mall/interior/techshop) +"aHg" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/plating/stone, +/area/vtm/interior/sewer/nosferatu_town) +"aHh" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 8 + }, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"aHi" = ( +/obj/effect/decal/wallpaper/grey{ + pixel_y = 32 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/obj/structure/sign/poster/city/vesuvius/directional/north{ + pixel_x = 9; + pixel_y = 33 + }, +/obj/structure/sign/poster/city/tiamat/directional/north{ + pixel_x = -7; + pixel_y = 31 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"aHj" = ( +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior/endron_logging) +"aHk" = ( +/obj/structure/secure_safe/directional/north, +/obj/structure/table, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand{ + pixel_y = 5; + pixel_x = 8 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 5; + pixel_x = 8 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 5; + pixel_x = 8 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 13; + pixel_x = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/interior/bianchiBank) +"aHl" = ( +/obj/structure/lamppost/four{ + pixel_y = 8 + }, +/obj/structure/platform/lowwall/brick_old, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/parking_lot) +"aHm" = ( +/obj/structure/table/wood, +/obj/structure/retail/library, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aHn" = ( +/turf/open/misc/beach/vamp, +/area/vtm/westfield_mall/forest) +"aHo" = ( +/obj/effect/turf_decal/darkpack/grass/corner{ + dir = 1 + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall) +"aHp" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 10 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"aHq" = ( +/obj/effect/turf_decal/darkpack/grass{ + dir = 9 + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall) +"aHr" = ( +/obj/structure/fire_barrel, +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer) +"aHs" = ( +/obj/structure/toilet{ + dir = 4; + pixel_y = 4 + }, +/obj/effect/spawner/random/trash/mess, +/obj/machinery/light/small/directional/west, +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) +"aHt" = ( +/obj/structure/bed/dogbed, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aHu" = ( +/obj/structure/chair/comfy/darkpack/red{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/anarch/baron, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/westfield_mall/interior/anarch) +"aHv" = ( +/obj/effect/turf_decal/bordur{ + dir = 9 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aHw" = ( +/obj/structure/table/countertop/teal, +/turf/open/floor/city/bacotell, +/area/vtm/interior/shop) +"aHx" = ( +/obj/effect/turf_decal/bordur{ + dir = 9 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aHy" = ( +/obj/structure/stairs/east, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aHz" = ( +/obj/structure/table/wood/fancy/royalblack, +/obj/effect/spawner/random/occult/artifact, +/obj/effect/turf_decal/siding/wood/light{ + dir = 10 + }, +/turf/open/floor/plating/granite/black, +/area/vtm/westfield_mall/interior/camarilla) +"aHA" = ( +/obj/structure/weightmachine/weightlifter, +/obj/effect/decal/rugs, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"aHB" = ( +/obj/structure/statue/sandstone/venus{ + pixel_y = 10 + }, +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/interior/bianchiBank) +"aHC" = ( +/obj/effect/landmark/npcactivity, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aHD" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/dark/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/dark/corner{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack/greengold, +/area/vtm/westfield_mall/interior/games_store) +"aHE" = ( +/obj/machinery/atm, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aHF" = ( +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/anarch) +"aHG" = ( +/obj/machinery/light/cold/directional/north, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aHH" = ( +/obj/machinery/hydroponics/simple/plastic, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/anarch) +"aHI" = ( +/obj/structure/railing, +/obj/structure/chair/comfy/darkpack/green{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aHJ" = ( +/obj/structure/fence, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"aHK" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/obj/effect/decal/carpet{ + pixel_x = -14; + pixel_y = -7 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aHL" = ( +/obj/structure/railing{ + dir = 9 + }, +/obj/effect/turf_decal/siding/grey/inner_corner{ + dir = 1 + }, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"aHM" = ( +/obj/effect/turf_decal/darkpack/grass{ + dir = 10 + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall) +"aHN" = ( +/obj/effect/decal/pallet, +/obj/structure/closet/crate/cardboard, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aHO" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aHP" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aHQ" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aHR" = ( +/obj/structure/rack/food, +/obj/item/reagent_containers/cooler_jug/water, +/obj/item/reagent_containers/cooler_jug/water, +/obj/item/reagent_containers/cooler_jug/punch, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aHS" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aHT" = ( +/obj/structure/table/wood, +/obj/item/toy/katana{ + pixel_y = 7 + }, +/obj/item/toy/eldritch_book{ + pixel_x = 5 + }, +/obj/effect/spawner/random/peel_or_nana{ + pixel_x = -4; + pixel_y = 14 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aHU" = ( +/obj/machinery/light/warm/directional/south, +/turf/open/floor/plating/rough{ + icon_state = "carpet_black" + }, +/area/vtm/interior/sewer/nosferatu_town) +"aHV" = ( +/obj/structure/sink/directional/west, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aHW" = ( +/obj/structure/curtain/bounty/start_closed, +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/chantry) +"aHX" = ( +/obj/structure/closet/crate/bin{ + pixel_x = -8; + pixel_y = 1 + }, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"aHY" = ( +/obj/structure/table/wood, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/skatepark) +"aHZ" = ( +/obj/structure/stairs/west, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/maintenance/atrium) +"aIa" = ( +/obj/effect/decal/wallpaper/papers/three, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/anarch) +"aIb" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/eighties, +/area/vtm/westfield_mall/interior/arcade) +"aIc" = ( +/obj/effect/turf_decal/bordur{ + dir = 9 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"aId" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/style_random, +/obj/structure/railing, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/misc/dirt, +/area/vtm/interior/sewer/nosferatu_town) +"aIe" = ( +/obj/structure/rack/food/rand, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aIf" = ( +/obj/effect/decal/wallpaper/paper/darkgreen, +/turf/closed/wall/vampwall/junk, +/area/vtm/interior/sewer/nosferatu_town) +"aIg" = ( +/obj/effect/turf_decal/loading_area, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/interior/supply) +"aIh" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aIi" = ( +/turf/open/floor/plating/concrete, +/area/vtm/interior/sewer/nosferatu_town) +"aIj" = ( +/obj/structure/chair/plastic/darkpack{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"aIk" = ( +/obj/structure/table/wood, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aIl" = ( +/obj/structure/city_map, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aIm" = ( +/obj/structure/projector{ + dir = 4 + }, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"aIn" = ( +/obj/structure/table/countertop/bubway, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aIo" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aIp" = ( +/obj/structure/safe, +/obj/item/stack/dollar/hundred, +/obj/item/stack/dollar/hundred{ + pixel_y = -8; + pixel_x = 4 + }, +/obj/item/stack/dollar/hundred{ + pixel_x = -6; + pixel_y = -7 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/theatre) +"aIq" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/machinery/light/dim/directional/east, +/turf/open/water, +/area/vtm/interior/bianchiBank) +"aIr" = ( +/obj/structure/table, +/obj/machinery/microwave{ + desc = "Cooks and boils stuff, somehow."; + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/city/bacotell, +/area/vtm/interior/sewer) +"aIs" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"aIt" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/interior/shop) +"aIu" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 4 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aIv" = ( +/obj/effect/spawner/random/structure/twelve_percent_spirit_board, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"aIw" = ( +/obj/machinery/light/small/directional/south, +/turf/open/openspace, +/area/vtm/westfield_mall/interior/maintenance/atrium) +"aIx" = ( +/obj/effect/turf_decal/bordur{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aIy" = ( +/obj/effect/landmark/npcability, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aIz" = ( +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior) +"aIA" = ( +/obj/effect/decal/rugs, +/obj/structure/vampdoor/old, +/obj/effect/mapping_helpers/door/access/nosferatu, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer/nosferatu_town) +"aIB" = ( +/obj/effect/decal/cleanable/litter, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"aIC" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 8 + }, +/obj/structure/lamppost/sidewalk, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aID" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/structure/sign/poster/city/dmc/directional/north, +/turf/open/floor/eighties, +/area/vtm/westfield_mall/interior/arcade) +"aIE" = ( +/obj/structure/vampdoor, +/obj/effect/turf_decal/siding/wood/dark, +/obj/effect/mapping_helpers/door/access/all, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/two, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"aIF" = ( +/obj/transfer_point_vamp{ + id = "forestL2" + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"aIG" = ( +/obj/machinery/computer/operating, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aIH" = ( +/obj/structure/flora/rock/darkpack_big, +/obj/structure/flora/rock/darkpack, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"aII" = ( +/obj/structure/table/wood, +/turf/open/floor/city/plating_stone, +/area/vtm/interior/bianchiBank) +"aIJ" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"aIK" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aIL" = ( +/turf/open/openspace, +/area/vtm/westfield_mall/interior/theatre) +"aIM" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/trimline/red/warning{ + dir = 1 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aIN" = ( +/obj/structure/chair/sofa/city_bench/metal/left/yellow{ + dir = 8 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aIO" = ( +/obj/structure/rack, +/obj/item/clothing/under/vampire/mechanic, +/obj/item/clothing/under/vampire/mechanic, +/obj/item/clothing/under/vampire/mechanic, +/obj/item/clothing/shoes/vampire/jackboots/work{ + pixel_y = 7; + pixel_x = -6 + }, +/obj/item/clothing/shoes/vampire/jackboots/work{ + pixel_y = 5; + pixel_x = 6 + }, +/obj/item/clothing/shoes/vampire/jackboots/work, +/turf/open/floor/city/industrial/large, +/area/vtm/interior/shop) +"aIP" = ( +/obj/structure/filingcabinet/employment, +/turf/open/floor/plating/granite/black, +/area/vtm/westfield_mall/interior/camarilla) +"aIQ" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/clothing_store) +"aIR" = ( +/obj/structure/sign/city/skateshop/directional/north, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"aIS" = ( +/obj/effect/spawner/random/trash/rat, +/turf/open/floor/plating/concrete, +/area/vtm/interior/sewer) +"aIT" = ( +/turf/open/misc/grass, +/area/vtm/westfield_mall/interior) +"aIU" = ( +/obj/item/clothing/head/cone, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aIV" = ( +/obj/structure/fake_stairs/wood/directional/south, +/obj/structure/railing/wooden_fence{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aIW" = ( +/obj/effect/decal/carpet{ + pixel_x = -14; + pixel_y = -13 + }, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"aIX" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/mouse/vampire, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aIY" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/pen, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 8 + }, +/obj/machinery/light/prince/directional/south, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aJa" = ( +/obj/structure/vampipe{ + icon_state = "piping9"; + pixel_y = 32 + }, +/turf/open/floor/plating/canal, +/area/vtm/interior/sewer) +"aJb" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aJc" = ( +/obj/structure/fireplace, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aJd" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/cockroach/sewer, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aJe" = ( +/obj/structure/railing/wooden_fence{ + dir = 10 + }, +/obj/structure/lattice/grate, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aJf" = ( +/mob/living/basic/pet/penguin/emperor/shamebrero, +/turf/open/floor/carpet, +/area/awaymission/errorroom) +"aJg" = ( +/obj/structure/sign/departments/restroom/directional/north, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aJh" = ( +/turf/open/openspace, +/area/vtm/interior/supply) +"aJi" = ( +/obj/structure/dresser, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aJj" = ( +/obj/structure/fluff/tram_rail{ + dir = 4; + pixel_x = -8 + }, +/obj/effect/turf_decal/bordur{ + dir = 4 + }, +/obj/effect/turf_decal/bordur{ + dir = 8 + }, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/skatepark) +"aJk" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/sprinkler, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aJl" = ( +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aJm" = ( +/obj/structure/vampdoor/simple, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"aJn" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood/light{ + dir = 4 + }, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"aJo" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 4 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aJp" = ( +/obj/structure/chair/sofa/left/brown, +/obj/structure/sign/painting{ + pixel_y = 32; + dir = 1 + }, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer/nosferatu_town) +"aJq" = ( +/obj/effect/decal/pallet, +/obj/effect/spawner/random/maintenance, +/obj/structure/vampipe{ + pixel_y = 32 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aJr" = ( +/obj/structure/table/countertop, +/obj/structure/fish_mount/supply/directional/north, +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/interior/supply) +"aJs" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aJu" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping26" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aJw" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/skatepark) +"aJx" = ( +/obj/structure/aquarium/prefilled, +/obj/machinery/light/directional/north, +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/westfield_mall/interior/supply) +"aJy" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aJA" = ( +/obj/effect/turf_decal/siding/grey/end{ + dir = 8 + }, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall/interior) +"aJB" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"aJC" = ( +/obj/structure/table/wood, +/obj/item/surgery_tray/full, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aJD" = ( +/obj/structure/table, +/obj/item/bong{ + pixel_x = -7; + pixel_y = 13 + }, +/obj/item/bong{ + pixel_x = -8; + color = "#293E7C" + }, +/obj/item/bong{ + pixel_x = 4; + pixel_y = 7; + color = "#47FF93" + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/smokeshop) +"aJE" = ( +/obj/effect/decal/wallpaper/red, +/turf/closed/wall/vampwall/market, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aJF" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping25" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aJG" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/theatre) +"aJH" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior) +"aJI" = ( +/obj/machinery/light/cold/directional/east, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aJJ" = ( +/obj/structure/toilet{ + dir = 4; + pixel_y = 4 + }, +/obj/machinery/light/directional/north, +/obj/effect/landmark/start/darkpack/law_enforcement/officer, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"aJK" = ( +/obj/structure/table/countertop/black, +/obj/structure/sink/basin/directional/east, +/obj/item/storage/box/gloves{ + pixel_x = 6; + pixel_y = 1 + }, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aJL" = ( +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/maintenance) +"aJM" = ( +/obj/structure/table/countertop/yellow, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aJN" = ( +/obj/structure/table/wood/fancy/purple, +/obj/item/paper_bin{ + pixel_x = 9; + pixel_y = 13 + }, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"aJO" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/light/small/directional/east, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"aJP" = ( +/obj/effect/turf_decal/bordur{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aJR" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/item/flashlight/lamp{ + pixel_x = 6; + pixel_y = 12 + }, +/obj/item/toy/plush/goatplushie{ + pixel_y = 6; + pixel_x = 2 + }, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior/techshop) +"aJS" = ( +/obj/structure/railing/wooden_fence{ + dir = 10 + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"aJT" = ( +/obj/machinery/oven, +/turf/open/floor/city/bacotell, +/area/vtm/interior/littleitaly) +"aJU" = ( +/obj/structure/rack/food, +/obj/effect/spawner/random/engineering/material_cheap, +/obj/effect/spawner/random/engineering/material_cheap, +/obj/effect/spawner/random/engineering/material_cheap, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aJV" = ( +/obj/structure/table/wood, +/obj/machinery/coffeemaker/impressa, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"aJW" = ( +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aJX" = ( +/obj/structure/fountain{ + pixel_y = 4 + }, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall) +"aJY" = ( +/obj/structure/noticeboard/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"aJZ" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aKa" = ( +/obj/structure/chair/office/darkpack/red{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aKb" = ( +/obj/effect/decal/pallet, +/obj/structure/guncase, +/obj/item/gun/ballistic/automatic/darkpack/uzi, +/obj/item/gun/ballistic/automatic/darkpack/uzi, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/anarch) +"aKc" = ( +/mob/living/basic/zombie/darkpack, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aKd" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"aKe" = ( +/obj/structure/table/countertop/red, +/obj/machinery/light/directional/east, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"aKf" = ( +/obj/item/stack/package_wrap/small, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aKg" = ( +/obj/structure/mop_bucket/janitorialcart, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/janitor) +"aKh" = ( +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/chantry) +"aKi" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aKj" = ( +/obj/effect/turf_decal/siding/grey{ + dir = 1 + }, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/supply) +"aKk" = ( +/obj/structure/vampipe{ + pixel_y = 32 + }, +/obj/machinery/light/small/directional/north, +/turf/open/water/vamp_sewer/border, +/area/vtm/interior/sewer) +"aKl" = ( +/obj/structure/vampdoor/wood{ + lock_id = "banuhaqim" + }, +/obj/effect/mapping_helpers/door/access/clinic, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aKm" = ( +/obj/structure/railing/corner, +/obj/machinery/light/directional/south, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aKo" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/games_store) +"aKp" = ( +/turf/closed/wall/vampwall/dirtywood, +/area/vtm/interior) +"aKq" = ( +/mob/living/carbon/human/npc/bubway, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aKr" = ( +/obj/structure/chair/plastic/darkpack, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"aKs" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/turf_decal/siding/grey/inner_corner, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"aKt" = ( +/obj/structure/safe, +/obj/item/ammo_box/magazine/darkpack545, +/obj/item/ammo_box/magazine/darkpack545, +/obj/item/ammo_box/magazine/darkpack545, +/obj/item/ammo_box/darkpack/c545, +/obj/item/ammo_box/darkpack/c545, +/obj/item/ammo_box/magazine/darkpack556/hunt, +/obj/item/ammo_box/magazine/darkpack556/hunt, +/obj/item/ammo_box/darkpack/c556, +/obj/item/ammo_box/darkpack/c556/incendiary, +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/interior/shop) +"aKu" = ( +/obj/effect/decal/graffiti, +/turf/open/floor/plating/sidewalkalt, +/area/vtm/westfield_mall/forest) +"aKv" = ( +/obj/effect/decal/wallpaper/grey{ + pixel_y = 32 + }, +/obj/effect/spawner/random/vending/colavend, +/obj/structure/gargoyle, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/smokeshop) +"aKw" = ( +/obj/structure/table/wood, +/obj/item/kirbyplants/darkpack/plant2{ + pixel_y = 18; + pixel_x = 7 + }, +/turf/open/floor/wood/herring, +/area/vtm/interior/littleitaly) +"aKx" = ( +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"aKy" = ( +/obj/structure/cat_house, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"aKz" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 8 + }, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/interior/clinic) +"aKA" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"aKB" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/misc/grass, +/area/vtm/westfield_mall/forest) +"aKC" = ( +/obj/structure/hedge, +/obj/machinery/light/prince/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aKE" = ( +/obj/structure/chair/comfy/darkpack/green{ + dir = 1 + }, +/obj/effect/landmark/start/darkpack/primogen/toreador, +/turf/open/floor/carpet/darkpack/blacksilver, +/area/vtm/westfield_mall/interior/theatre) +"aKF" = ( +/obj/structure/bricks, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aKG" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 6 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aKH" = ( +/obj/effect/turf_decal/asphaltline/alt{ + dir = 4 + }, +/obj/effect/turf_decal/bordur/inverse{ + dir = 8 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aKI" = ( +/obj/structure/noticeboard/directional/north, +/obj/item/gun/ballistic/automatic/darkpack/huntrifle{ + pixel_y = 29 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aKK" = ( +/turf/open/openspace, +/area/vtm/westfield_mall/interior/chantry) +"aKL" = ( +/obj/structure/vampdoor/old{ + dir = 1 + }, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/camarilla, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/maintenance) +"aKM" = ( +/obj/effect/landmark/start/darkpack/camarilla/hound, +/obj/structure/chair/office/darkpack/blue{ + dir = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aKN" = ( +/obj/structure/closet/crate/dumpster, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aKO" = ( +/obj/structure/filingcabinet/security, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aKP" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/bottle/wine{ + pixel_x = -10; + pixel_y = 18 + }, +/obj/item/reagent_containers/cup/glass/bottle/wine/blood{ + pixel_x = -11; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/wine_glass{ + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/wine_glass{ + pixel_x = 9; + pixel_y = 6 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"aKQ" = ( +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aKR" = ( +/obj/structure/destructible/cult/item_dispenser/archives/library, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aKS" = ( +/obj/machinery/vending/cola, +/turf/open/floor/city/plating_stone, +/area/vtm/interior/bianchiBank) +"aKT" = ( +/obj/structure/chair/wood/darkpack{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aKU" = ( +/obj/structure/table/wood, +/obj/item/storage/bag/books{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/storage/bag/books{ + pixel_y = 7; + pixel_x = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aKV" = ( +/obj/structure/bookcase/random/reference, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aKW" = ( +/obj/lombard/blackmarket, +/obj/structure/vampfence/rich, +/obj/structure/platform/lowwall/brick_old, +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer) +"aKX" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/obj/structure/rack/clothing_hanger{ + pixel_x = -10; + density = 0 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/plating/rough{ + icon_state = "carpet_black" + }, +/area/vtm/interior/sewer/nosferatu_town) +"aKY" = ( +/mob/living/carbon/human/npc/bandit, +/obj/structure/chair/plastic/darkpack, +/turf/open/misc/dirt, +/area/vtm/interior/sewer) +"aKZ" = ( +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"aLa" = ( +/obj/structure/sign/poster/city/tiamat/directional/north, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"aLb" = ( +/obj/structure/curtain/cloth{ + name = "war-game room curtain" + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aLc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/cockroach/sewer, +/turf/open/floor/wood/old, +/area/vtm/interior) +"aLd" = ( +/obj/effect/spawner/random/entertainment/gambling, +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/interior/shop) +"aLe" = ( +/obj/item/trash/chips, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aLf" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"aLg" = ( +/turf/closed/wall/vampwall/market, +/area/vtm/interior/shop) +"aLh" = ( +/obj/structure/table, +/obj/item/assembly/prox_sensor{ + pixel_y = 13 + }, +/obj/item/assembly/prox_sensor{ + pixel_y = 9 + }, +/obj/item/assembly/prox_sensor{ + pixel_y = 4 + }, +/obj/item/assembly/flash{ + pixel_x = -8; + pixel_y = 17 + }, +/obj/item/assembly/flash{ + pixel_x = -11; + pixel_y = 15 + }, +/obj/item/assembly/flash{ + pixel_x = -10; + pixel_y = 14 + }, +/obj/item/assembly/igniter{ + pixel_x = -13; + pixel_y = 9 + }, +/obj/item/assembly/igniter{ + pixel_x = -10; + pixel_y = 3 + }, +/obj/item/assembly/mousetrap{ + pixel_x = 10; + pixel_y = 10 + }, +/obj/item/assembly/mousetrap{ + pixel_x = 10; + pixel_y = 8 + }, +/obj/item/stock_parts/power_store/cell/high{ + pixel_x = 8; + pixel_y = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"aLi" = ( +/obj/effect/decal/wallpaper/grey, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/dojo) +"aLj" = ( +/obj/effect/decal/carpet{ + pixel_x = 16; + pixel_y = 18 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"aLk" = ( +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/westfield_mall/interior/theatre) +"aLl" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aLm" = ( +/obj/effect/decal/coastline/corner{ + dir = 8 + }, +/turf/open/misc/beach/vamp, +/area/vtm/westfield_mall/forest) +"aLn" = ( +/obj/structure/hedge, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"aLo" = ( +/obj/machinery/vending/coffee/private, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"aLq" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aLs" = ( +/turf/closed/wall/vampwall/old, +/area/vtm/westfield_mall/interior) +"aLt" = ( +/obj/effect/turf_decal/siding/grey/inner_corner{ + dir = 4 + }, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/supply) +"aLu" = ( +/obj/effect/landmark/start/darkpack/hospital/doctor, +/obj/structure/chair/office/darkpack/blue{ + dir = 8 + }, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aLv" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/camarilla) +"aLw" = ( +/obj/effect/decal/wallpaper/stone, +/turf/closed/wall/vampwall/brick_old, +/area/vtm/westfield_mall/interior/skatepark) +"aLx" = ( +/turf/open/floor/carpet/darkpack/old, +/area/vtm/interior/shop) +"aLy" = ( +/obj/structure/closet/crate/large, +/obj/effect/decal/pallet, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aLz" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"aLA" = ( +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"aLB" = ( +/obj/structure/retail/pharmacy{ + pixel_y = 10 + }, +/obj/structure/retail/gas_station, +/obj/structure/table/countertop/black, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aLC" = ( +/obj/structure/table/wood, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt) +"aLD" = ( +/turf/open/genturf, +/area/vtm/planetgeneration) +"aLE" = ( +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/parking_lot) +"aLF" = ( +/obj/effect/turf_decal/siding/wood/dark/corner{ + dir = 4 + }, +/obj/machinery/sprinkler, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"aLG" = ( +/obj/effect/turf_decal/siding/grey/end, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall/interior) +"aLH" = ( +/obj/effect/decal/pallet, +/obj/structure/closet/crate/cardboard, +/obj/structure/vampipe{ + pixel_y = 32 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aLI" = ( +/turf/open/floor/city/plating_mono, +/area/vtm/interior/shop) +"aLK" = ( +/obj/effect/decal/cleanable/litter, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer/nosferatu_town) +"aLL" = ( +/obj/structure/rack/food, +/obj/effect/spawner/random/entertainment/plushie{ + pixel_x = 3; + pixel_y = 2 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aLM" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior) +"aLN" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/obj/effect/turf_decal/asphalt, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"aLO" = ( +/obj/structure/table/countertop, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aLP" = ( +/obj/structure/rack, +/obj/item/surgery_tray/full, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aLQ" = ( +/obj/machinery/light_switch/directional/north{ + pixel_x = -9 + }, +/turf/open/floor/carpet/darkpack/cyan, +/area/vtm/westfield_mall/interior/vet_clinic) +"aLR" = ( +/obj/structure/table/wood, +/obj/vampire_computer, +/turf/open/floor/carpet/darkpack, +/area/vtm/interior/clinic) +"aLS" = ( +/obj/effect/decal/support, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"aLT" = ( +/obj/structure/table/modern, +/obj/item/clothing/under/vampire/brujah{ + pixel_x = -7; + pixel_y = 10 + }, +/obj/item/clothing/under/vampire/brujah{ + pixel_x = 2; + pixel_y = 12 + }, +/obj/item/clothing/under/vampire/brujah/female{ + pixel_x = 11; + pixel_y = 10 + }, +/obj/item/clothing/under/vampire/gangrel{ + pixel_x = 1 + }, +/obj/item/clothing/under/vampire/gangrel{ + pixel_x = 12; + pixel_y = -1 + }, +/obj/item/clothing/under/vampire/gangrel/female{ + pixel_x = -8 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"aLU" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/foodcourt) +"aLV" = ( +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer/nosferatu_town) +"aLW" = ( +/obj/machinery/sprinkler, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior) +"aLX" = ( +/obj/structure/chair/plastic, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aLY" = ( +/obj/structure/table/wood, +/obj/item/knife, +/obj/item/kitchen/rollingpin, +/turf/open/floor/city/bacotell, +/area/vtm/interior/littleitaly) +"aLZ" = ( +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aMa" = ( +/turf/closed/wall/vampwall/wood, +/area/vtm/interior) +"aMb" = ( +/obj/structure/chair/sofa/corp/left, +/obj/effect/landmark/start/darkpack/camarilla/harpy, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/camarilla) +"aMc" = ( +/obj/structure/table/wood, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"aMd" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"aMe" = ( +/obj/effect/decal/pallet, +/obj/effect/spawner/random/trash/janitor_supplies, +/obj/effect/spawner/random/trash/janitor_supplies, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aMf" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/anarch) +"aMg" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aMh" = ( +/turf/closed/wall/vampwall/rich/old, +/area/vtm/interior/mansion) +"aMi" = ( +/obj/structure/sign/departments/restroom/directional/north, +/obj/effect/landmark/npc_spawn_point, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aMj" = ( +/obj/machinery/microwave{ + pixel_y = 9 + }, +/obj/structure/table/wood, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"aMk" = ( +/obj/effect/mapping_helpers/door/access/clinic, +/obj/effect/mapping_helpers/door/lock, +/obj/structure/vampdoor/glass{ + dir = 4 + }, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aMl" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall) +"aMm" = ( +/obj/structure/table, +/obj/item/stack/sheet/mineral/wood/fifty, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"aMn" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/obj/structure/sign/city/store/gummaguts/directional/north{ + pixel_x = -16; + pixel_y = 35 + }, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aMo" = ( +/obj/structure/railing/wooden_fence, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 4 + }, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior) +"aMp" = ( +/obj/structure/chair/sofa/city_bench/metal/left/black{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aMq" = ( +/obj/structure/railing/wooden_fence{ + dir = 9 + }, +/obj/structure/lattice/grate, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aMr" = ( +/obj/effect/decal/rugs, +/obj/structure/vampdoor/old{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/access/nosferatu, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aMs" = ( +/obj/structure/table/wood, +/obj/vampire_computer{ + pixel_y = 4 + }, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/interior/police) +"aMt" = ( +/obj/structure/stairs/north, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aMu" = ( +/turf/closed/indestructible/the_matrix, +/area/vtm/westfield_mall/interior/supply) +"aMv" = ( +/obj/effect/turf_decal/bordur/corner/inverse{ + dir = 4 + }, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall) +"aMw" = ( +/obj/structure/table/wood/fancy/purple, +/obj/effect/spawner/random/entertainment/dice{ + pixel_x = 11; + pixel_y = -3 + }, +/obj/item/flashlight/lamp{ + pixel_x = -11; + pixel_y = -15 + }, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"aMx" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 4 + }, +/obj/structure/closet/cabinet, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aMy" = ( +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/techshop) +"aMz" = ( +/obj/structure/vampdoor/simple{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/salubri, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"aMA" = ( +/obj/effect/decal/pallet, +/obj/effect/spawner/random/maintenance/four, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aMB" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/carpet, +/area/awaymission/errorroom) +"aMC" = ( +/obj/effect/landmark/npcwall, +/turf/open/misc/grass, +/area/vtm/westfield_mall/interior) +"aMD" = ( +/obj/structure/table/wood/poker, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aME" = ( +/obj/effect/decal/pallet, +/obj/structure/closet/crate/wooden, +/obj/item/toner, +/obj/item/toner, +/obj/item/toner, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"aMF" = ( +/obj/structure/closet/crate/large, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aMG" = ( +/turf/open/floor/plating/concrete, +/area/vtm/interior/sewer) +"aMH" = ( +/obj/structure/stairs/south, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"aMI" = ( +/obj/structure/chair/comfy/brown, +/mob/living/basic/zombie/darkpack, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aMJ" = ( +/obj/structure/hedge/opaque, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aMK" = ( +/obj/structure/noticeboard/directional/north, +/obj/item/gun/ballistic/shotgun/toy/crossbow/vampire{ + anchored = 1; + pixel_y = 30 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aML" = ( +/obj/structure/vampstatue, +/obj/effect/turf_decal/bordur{ + dir = 5 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aMM" = ( +/obj/darkpack_car/retro/rand, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"aMN" = ( +/obj/structure/table/wood, +/obj/vampire_computer, +/obj/machinery/light/directional/west, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aMO" = ( +/obj/effect/turf_decal/asphaltline/alt{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"aMP" = ( +/obj/machinery/light/cold/directional/west, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"aMQ" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/westfield_mall/interior/theatre) +"aMR" = ( +/obj/structure/chair/sofa/city_bench/metal/left/yellow{ + dir = 4 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aMS" = ( +/obj/structure/rack/clothing_hanger, +/obj/item/clothing/head/vampire/beanie{ + pixel_x = -1; + pixel_y = 12 + }, +/obj/item/clothing/suit/vampire/coat/winter{ + pixel_x = -1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aMT" = ( +/obj/effect/decal/pallet, +/obj/effect/spawner/random/maintenance/no_decals/three, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aMU" = ( +/obj/structure/table/wood, +/obj/machinery/light/blacklight/directional/south, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/hot_ishu) +"aMV" = ( +/obj/structure/table/countertop/bacotell, +/obj/structure/retail/bacotell_menu{ + pixel_y = 6 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/turf/open/floor/city/bacotell, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aMX" = ( +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/dojo) +"aMY" = ( +/obj/structure/rack/food/rand{ + dir = 4; + pixel_x = 8; + pixel_y = 16; + density = 0 + }, +/obj/effect/decal/wallpaper/grey{ + pixel_y = 32 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"aMZ" = ( +/obj/structure/table/countertop, +/obj/item/storage/toolbox/fishing{ + pixel_x = 5; + pixel_y = 10 + }, +/obj/item/ammo_box/darkpack/c45acp{ + pixel_x = -7 + }, +/obj/item/ammo_box/darkpack/c45acp{ + pixel_x = -13 + }, +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/interior/supply) +"aNa" = ( +/obj/effect/decal/rugs, +/obj/structure/vampdoor/old, +/obj/effect/mapping_helpers/door/access/nosferatu, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer/nosferatu_town) +"aNb" = ( +/obj/structure/table, +/turf/open/floor/wood/ornate, +/area/vtm/westfield_mall/interior/camarilla) +"aNc" = ( +/obj/vampire_computer, +/obj/item/toy/cards/deck/tarot{ + pixel_x = -11; + pixel_y = 16 + }, +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/vet_clinic) +"aNd" = ( +/obj/structure/chair/sofa/middle/brown{ + dir = 4 + }, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"aNe" = ( +/obj/structure/sign/city/order/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/foodcourt) +"aNf" = ( +/obj/structure/lattice/grate{ + dir = 4 + }, +/turf/open/water/vamp_sewer/border, +/area/vtm/interior/sewer) +"aNg" = ( +/obj/effect/turf_decal/bordur/inverse, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"aNh" = ( +/obj/vehicle/ridden/janicart, +/obj/item/key/janitor, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/janitor) +"aNi" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping41" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aNj" = ( +/obj/effect/landmark/start, +/obj/structure/chair/plastic/darkpack, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt) +"aNk" = ( +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"aNl" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/city_map, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aNm" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aNn" = ( +/obj/structure/chair/plastic{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aNo" = ( +/obj/structure/rack/food/rand{ + dir = 4; + pixel_y = 16; + pixel_x = -8 + }, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aNp" = ( +/obj/structure/bookcase/random/reference, +/turf/open/floor/carpet/darkpack, +/area/vtm/interior/clinic) +"aNq" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/clothing_store) +"aNr" = ( +/obj/effect/turf_decal/siding/wood/light{ + dir = 1 + }, +/obj/structure/chair/stool/bar/darkpack/red, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aNs" = ( +/obj/machinery/light/directional/west{ + pixel_y = 10 + }, +/turf/open/openspace, +/area/vtm/westfield_mall/interior) +"aNt" = ( +/obj/effect/turf_decal/bordur/inverse, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aNu" = ( +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aNv" = ( +/turf/closed/wall/vampwall/junk, +/area/vtm/interior/sewer) +"aNw" = ( +/obj/structure/closet/crate/large, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aNx" = ( +/obj/effect/turf_decal/bordur{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"aNy" = ( +/obj/structure/chair/office/darkpack/blue{ + dir = 8 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aNz" = ( +/obj/structure/vampdoor/simple{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/eight, +/obj/effect/mapping_helpers/door/access/wolftech, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aNA" = ( +/obj/structure/table/countertop/bubway, +/obj/structure/sink/directional/west{ + icon_state = "basin" + }, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"aNB" = ( +/obj/effect/turf_decal/caution, +/obj/effect/decal/cleanable/blood/oil/slippery, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/endron_logging) +"aNC" = ( +/obj/structure/table, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer/nosferatu_town) +"aND" = ( +/obj/effect/landmark/start/darkpack/camarilla/prince, +/obj/structure/chair/comfy/darkpack/dark{ + dir = 8 + }, +/turf/open/floor/plating/granite/black, +/area/vtm/westfield_mall/interior/camarilla) +"aNE" = ( +/obj/structure/flora/rock/darkpack_big, +/turf/open/misc/grass, +/area/vtm/westfield_mall/forest) +"aNF" = ( +/obj/structure/rack/clothing/rand, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/shop) +"aNG" = ( +/obj/structure/table/reinforced, +/obj/item/kirbyplants/darkpack/random, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aNH" = ( +/obj/effect/turf_decal/bordur{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"aNI" = ( +/obj/structure/closet/secure_closet/freezer/fridge/all_access, +/obj/effect/turf_decal/siding/wood/light{ + dir = 1 + }, +/obj/item/reagent_containers/cup/glass/bottle/wine, +/obj/item/reagent_containers/blood/random, +/obj/effect/spawner/random/food_or_drink/plant_produce, +/obj/item/reagent_containers/cup/glass/bottle/wine/blood, +/obj/item/reagent_containers/cup/glass/bottle/wine/blood, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"aNJ" = ( +/obj/structure/rack/food, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aNK" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/city/circled, +/area/vtm/interior/shop) +"aNL" = ( +/obj/structure/table/wood, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aNM" = ( +/obj/effect/decal/wallpaper/blue, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/theatre) +"aNN" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"aNO" = ( +/obj/structure/table, +/obj/effect/decal/rugs, +/turf/open/floor/plating/rough{ + icon_state = "carpet_black" + }, +/area/vtm/interior/sewer/nosferatu_town) +"aNP" = ( +/obj/structure/chair/comfy/darkpack/dark, +/obj/effect/landmark/start/darkpack/voivode/zadruga, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"aNQ" = ( +/obj/structure/table/countertop/black, +/obj/machinery/light/directional/west, +/obj/item/storage/medkit/darkpack/doctor{ + pixel_x = -6; + pixel_y = 8 + }, +/obj/item/clothing/neck/stethoscope, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aNR" = ( +/obj/structure/table/countertop/bubway, +/obj/machinery/microwave{ + desc = "Cooks and boils stuff, somehow."; + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"aNS" = ( +/obj/structure/vampipe{ + pixel_y = 32 + }, +/obj/structure/table/optable, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aNT" = ( +/obj/structure/rack/food/rand{ + dir = 4; + pixel_x = 23; + pixel_y = 16; + density = 0 + }, +/obj/effect/decal/wallpaper/grey{ + pixel_y = 32 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"aNU" = ( +/obj/structure/chair/sofa/city_bench/metal/right/black{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aNV" = ( +/obj/structure/safe, +/obj/item/gun/ballistic/automatic/darkpack/ak74, +/obj/structure/coclock, +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/interior/shop) +"aNW" = ( +/obj/structure/vampipe{ + pixel_y = 32 + }, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aNX" = ( +/obj/structure/ladder, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"aNY" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior/techshop) +"aNZ" = ( +/obj/structure/table/wood, +/obj/machinery/microwave{ + pixel_y = 9 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/church) +"aOa" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aOb" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/figure/wizard, +/obj/item/toy/figure/clown{ + pixel_x = 7 + }, +/obj/item/toy/figure/assistant{ + pixel_x = -7; + pixel_y = 5 + }, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"aOc" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/techshop) +"aOe" = ( +/turf/closed/wall/vampwall/brick_old, +/area/vtm/westfield_mall/interior/supply) +"aOf" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_y = 6 + }, +/obj/item/pen{ + pixel_y = 7 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"aOg" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping24" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aOi" = ( +/obj/machinery/vending/snack, +/turf/open/floor/city/plating_stone, +/area/vtm/interior/bianchiBank) +"aOj" = ( +/turf/open/floor/carpet/darkpack/greengold, +/area/vtm/westfield_mall/interior/games_store) +"aOk" = ( +/obj/structure/vampdoor/woodglass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/banu, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"aOl" = ( +/obj/effect/mapping_helpers/door/access/clinic, +/obj/effect/mapping_helpers/door/lock, +/obj/structure/vampdoor, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aOm" = ( +/obj/machinery/camera/autoname/directional/south, +/turf/open/openspace, +/area/vtm/westfield_mall/interior) +"aOn" = ( +/obj/structure/destructible/cult/item_dispenser/archives/library, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"aOo" = ( +/obj/machinery/light/directional/west, +/obj/structure/chair/sofa/city_bench/metal/right{ + dir = 4 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aOp" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 8 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"aOq" = ( +/obj/effect/turf_decal/siding/wood/dark/corner{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aOr" = ( +/obj/structure/flora/rock/darkpack_big, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aOs" = ( +/obj/machinery/light/prince/directional/south, +/turf/open/floor/wood/ornate, +/area/vtm/westfield_mall/interior/camarilla) +"aOt" = ( +/obj/darkpack_car/retro/rand{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aOu" = ( +/obj/effect/landmark/start/darkpack/primogen/lasombra, +/obj/structure/chair/wood/darkpack/red, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"aOv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior/endron_logging) +"aOw" = ( +/obj/machinery/light/directional/west, +/obj/structure/table/countertop, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"aOx" = ( +/obj/structure/flora/tree/stump, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"aOy" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/trash/cigpack, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/anarch) +"aOz" = ( +/obj/machinery/vending/boozeomat/private, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aOA" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/obj/effect/landmark/npcability, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aOB" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/structure/vampdoor/reinf{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/police_secure, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/ten, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"aOC" = ( +/obj/structure/fence/door, +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior/endron_logging) +"aOD" = ( +/obj/fusebox, +/obj/item/kirbyplants/random, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/skatepark) +"aOE" = ( +/obj/structure/table/wood/fancy/purple, +/obj/effect/spawner/random/bureaucracy/pen, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"aOF" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 8 + }, +/obj/structure/railing{ + dir = 9 + }, +/obj/structure/marker_beacon/burgundy, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"aOG" = ( +/obj/structure/vampdoor/wood, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/chantry, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aOH" = ( +/obj/effect/turf_decal/siding/wood/dark, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aOI" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 4 + }, +/obj/effect/decal/cleanable/trash, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"aOJ" = ( +/obj/item/flashlight/lantern{ + light_color = "#013220"; + pixel_y = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aOK" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/city/plating_stone, +/area/vtm/interior/bianchiBank) +"aOL" = ( +/obj/structure/rack/clothing/rand, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"aOM" = ( +/obj/item/trash/popcorn, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"aON" = ( +/obj/item/kirbyplants/darkpack/random, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aOO" = ( +/obj/structure/chair/sofa/city_bench/metal/right{ + dir = 1 + }, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior) +"aOP" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/siding/grey{ + dir = 8 + }, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"aOQ" = ( +/obj/structure/table/wood, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"aOR" = ( +/obj/structure/table, +/obj/item/clothing/neck/stethoscope{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/storage/box/gloves{ + pixel_x = 7 + }, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"aOS" = ( +/obj/item/table_clock, +/obj/structure/table/wood, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aOT" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"aOU" = ( +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"aOV" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aOW" = ( +/turf/open/floor/iron/stairs{ + dir = 8 + }, +/area/vtm/interior/sewer) +"aOX" = ( +/obj/structure/coclock, +/obj/machinery/photocopier/prebuilt, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"aOY" = ( +/obj/transfer_point_vamp{ + id = "pentex_evil_inc" + }, +/turf/open/misc/grass/random/bushes, +/area/vtm/westfield_mall/forest) +"aOZ" = ( +/obj/structure/rack/food{ + dir = 8; + pixel_x = 10; + pixel_y = 4 + }, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"aPa" = ( +/obj/structure/hedge/opaque, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aPb" = ( +/obj/vampire_computer/prince, +/obj/structure/table/wood/fancy/royalblack, +/obj/effect/turf_decal/siding/wood/light{ + dir = 8 + }, +/turf/open/floor/plating/granite/black, +/area/vtm/westfield_mall/interior/camarilla) +"aPc" = ( +/obj/structure/table, +/obj/structure/retail/hardware_store, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aPd" = ( +/obj/structure/table/optable, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aPe" = ( +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/smokeshop) +"aPf" = ( +/obj/structure/table/wood, +/obj/item/kirbyplants/darkpack/plant2{ + pixel_y = 13; + pixel_x = 7 + }, +/obj/underplate, +/obj/item/clothing/mask/gas/vampire, +/turf/open/floor/plating/concrete, +/area/vtm/interior/sewer/nosferatu_town) +"aPg" = ( +/obj/structure/table/countertop/teal, +/obj/structure/sink/basin/directional/west, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/games_store) +"aPh" = ( +/obj/effect/turf_decal/siding/dark, +/obj/structure/vaultdoor/pincode/bank, +/turf/open/floor/city/plating, +/area/vtm/interior/bianchiBank) +"aPi" = ( +/obj/structure/coclock, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aPk" = ( +/obj/structure/platform/lowwall/painted/window/reinforced, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior) +"aPl" = ( +/obj/effect/turf_decal/bordur, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aPm" = ( +/obj/structure/table/countertop/black, +/obj/structure/sink/basin/directional/west, +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) +"aPn" = ( +/obj/structure/vampdoor/wood{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/supply, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"aPo" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/griddle, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aPp" = ( +/obj/effect/turf_decal/bordur{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"aPq" = ( +/obj/effect/spawner/random/trash/mopbucket, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/janitor) +"aPs" = ( +/obj/transfer_point_vamp/backrooms, +/turf/open/floor/carpet, +/area/awaymission/errorroom) +"aPt" = ( +/obj/effect/turf_decal/bordur, +/obj/effect/decal/cleanable/trash, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"aPu" = ( +/obj/structure/barricade/wooden/crude, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aPv" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/obj/structure/sign/city/store/bacotell/directional/north{ + pixel_x = -15; + pixel_y = 36 + }, +/turf/open/floor/city/bacotell, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aPw" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aPx" = ( +/obj/structure/chair/sofa/corp/left, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aPy" = ( +/obj/structure/rack/clothing/rand{ + dir = 4 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/shop) +"aPz" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aPA" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aPB" = ( +/obj/structure/vampdoor/wood/pentex{ + name = "Endron Tree Planting Outpost" + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"aPC" = ( +/obj/structure/vampdoor/reinf, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/eight, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"aPD" = ( +/obj/structure/vampfence/corner/rich{ + dir = 8 + }, +/obj/effect/turf_decal/bordur/corner{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"aPE" = ( +/obj/structure/cat_house, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"aPF" = ( +/turf/open/misc/grass/random/rocks, +/area/vtm/westfield_mall/forest) +"aPG" = ( +/obj/structure/railing, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aPH" = ( +/obj/structure/table/wood, +/obj/item/flashlight/flare/candle{ + pixel_x = -10; + pixel_y = 3 + }, +/turf/open/floor/carpet/darkpack/blackgold, +/area/vtm/interior/church) +"aPI" = ( +/obj/effect/landmark/npcability, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"aPJ" = ( +/obj/structure/rack/food{ + dir = 8; + pixel_x = 9; + pixel_y = 5 + }, +/obj/effect/spawner/random/entertainment/toy{ + pixel_x = 1; + pixel_y = -2 + }, +/obj/effect/spawner/random/entertainment/toy{ + pixel_x = 2; + pixel_y = 19 + }, +/obj/effect/spawner/random/entertainment/toy{ + pixel_x = 10; + pixel_y = -1 + }, +/obj/effect/spawner/random/entertainment/toy{ + pixel_x = -6; + pixel_y = 8 + }, +/obj/effect/spawner/random/entertainment/toy{ + pixel_x = 12; + pixel_y = 10 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"aPK" = ( +/obj/structure/vampfence/corner/rich{ + dir = 4 + }, +/obj/effect/turf_decal/bordur/corner{ + dir = 4 + }, +/turf/open/floor/plating/sidewalkalt, +/area/vtm/westfield_mall/forest) +"aPL" = ( +/obj/structure/table/wood, +/obj/item/toy/cards/deck, +/obj/effect/spawner/random/trash/cigbutt{ + pixel_x = 12; + pixel_y = 8 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/anarch) +"aPM" = ( +/obj/machinery/sprinkler, +/obj/effect/landmark/npcactivity, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aPN" = ( +/obj/machinery/stove, +/obj/structure/table/countertop/red, +/obj/machinery/light/directional/north, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aPO" = ( +/obj/darkpack_car/police{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aPP" = ( +/turf/open/water/vamp_sewer/border, +/area/vtm/interior/sewer) +"aPQ" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/plushie_delux, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"aPR" = ( +/obj/structure/vampdoor/old, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/five, +/obj/effect/mapping_helpers/door/access/clerk, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/underground_parking) +"aPS" = ( +/obj/effect/decal/cleanable/cardboard, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"aPT" = ( +/obj/structure/vampdoor/old{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aPU" = ( +/obj/item/storage/box/syringes/variety{ + pixel_y = 8; + pixel_x = -5 + }, +/obj/structure/table/wood, +/obj/item/clothing/suit/apron/surgical{ + pixel_y = 11; + pixel_x = 7 + }, +/obj/item/clothing/mask/surgical{ + pixel_x = 6; + pixel_y = 2 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aPV" = ( +/turf/open/floor/wood/ornate, +/area/vtm/westfield_mall/interior/camarilla) +"aPW" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/flowers_yw/style_random{ + pixel_y = 2 + }, +/obj/structure/railing, +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/decal/graffiti, +/turf/open/misc/dirt, +/area/vtm/interior/sewer/nosferatu_town) +"aPX" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aPY" = ( +/obj/structure/chair/sofa/corp/corner, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aPZ" = ( +/obj/structure/vampdoor/old{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/access/npc, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"aQa" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aQb" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aQc" = ( +/obj/structure/sink/oil_well, +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior/endron_logging) +"aQd" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/interior/shop) +"aQe" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/landmark/start/darkpack/chantry/archivist, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/westfield_mall/interior/chantry) +"aQf" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 1 + }, +/obj/structure/railing{ + dir = 5 + }, +/obj/structure/marker_beacon/burgundy, +/turf/open/floor/plating/roofwalk/cobblestones, +/area/vtm/westfield_mall) +"aQg" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aQh" = ( +/obj/structure/bed/dogbed, +/obj/item/toy/plush/beeplushie, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"aQi" = ( +/obj/machinery/iv_drip, +/obj/machinery/light/directional/west, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"aQj" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/machinery/light/directional/east, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/interior/shop) +"aQk" = ( +/obj/structure/vampdoor/wood{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/nosferatu, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"aQl" = ( +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aQm" = ( +/obj/item/flashlight/lamp/bananalamp, +/obj/structure/table/countertop/bubway, +/turf/open/floor/carpet/darkpack/greengold, +/area/vtm/westfield_mall/interior/games_store) +"aQn" = ( +/obj/structure/vampdoor/simple{ + dir = 4 + }, +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) +"aQo" = ( +/obj/structure/table/wood, +/obj/item/kirbyplants/darkpack/plant4{ + pixel_x = 9; + pixel_y = 16 + }, +/obj/effect/spawner/random/food_or_drink/three_course_meal, +/obj/item/flashlight/lamp/green{ + pixel_y = 13; + pixel_x = -10 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aQp" = ( +/obj/effect/spawner/random/trash/deluxe_garbage, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"aQq" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall) +"aQr" = ( +/obj/structure/stairs/east, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aQs" = ( +/obj/effect/decal/wallpaper/red, +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/bianchiBank) +"aQt" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aQu" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aQv" = ( +/obj/structure/filingcabinet{ + pixel_x = 7 + }, +/obj/structure/filingcabinet{ + pixel_x = -7 + }, +/turf/open/floor/carpet/darkpack/greengold, +/area/vtm/westfield_mall/interior/games_store) +"aQw" = ( +/obj/effect/landmark/npc_spawn_point, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"aQx" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/carpet/darkpack, +/area/vtm/interior/littleitaly) +"aQy" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/anarch) +"aQz" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/structure/closet/crate/dumpster, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"aQA" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack/blackgold, +/area/vtm/westfield_mall/interior/techshop) +"aQC" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"aQD" = ( +/obj/structure/roadblock{ + dir = 8 + }, +/turf/open/misc/dirt, +/area/vtm/interior/sewer) +"aQE" = ( +/obj/structure/chair/plastic/darkpack{ + dir = 1 + }, +/turf/open/misc/dirt, +/area/vtm/interior/sewer) +"aQF" = ( +/obj/structure/hedge/opaque, +/obj/effect/turf_decal/siding/wood/dark/end{ + dir = 8 + }, +/turf/open/floor/plating/granite/black, +/area/vtm/interior/shop) +"aQG" = ( +/obj/structure/vampipe{ + icon_state = "piping35"; + pixel_y = 32 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aQH" = ( +/obj/effect/turf_decal/bordur{ + dir = 8 + }, +/obj/effect/turf_decal/bordur{ + dir = 4 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aQI" = ( +/obj/structure/table, +/obj/vampire_computer, +/obj/effect/turf_decal/siding/white{ + dir = 9 + }, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior/techshop) +"aQJ" = ( +/obj/effect/landmark/npcactivity, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/parking_lot) +"aQK" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 8 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aQL" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/carpet/darkpack, +/area/vtm/interior/littleitaly) +"aQM" = ( +/obj/machinery/food_cart, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"aQN" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/maintenance/roof) +"aQO" = ( +/obj/structure/table/countertop/black, +/obj/machinery/light/small/directional/east, +/obj/structure/sink/basin/directional/west, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"aQP" = ( +/obj/structure/vampdoor/old{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/clothing_store) +"aQQ" = ( +/turf/open/genturf/blue, +/area/vtm/planetgeneration/woodland) +"aQR" = ( +/obj/structure/mannequin/plastic/fancy{ + anchored = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"aQS" = ( +/obj/effect/turf_decal/bordur, +/obj/structure/railing, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aQT" = ( +/obj/structure/stairs/east, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"aQU" = ( +/obj/structure/closet/secure_closet/freezer/empty, +/obj/item/food/pizzaslice/square, +/obj/item/food/pizzaslice/square, +/obj/item/food/pizzaslice/moldy, +/obj/item/food/pizzaslice/moldy, +/obj/item/reagent_containers/cup/soda_cans/pwr_game, +/obj/item/reagent_containers/cup/soda_cans/pwr_game, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"aQV" = ( +/obj/structure/table/wood, +/obj/item/pet_carrier/small/mouse{ + pixel_x = -8; + pixel_y = 6 + }, +/obj/item/pet_carrier/small/mouse{ + pixel_x = 8; + pixel_y = 6 + }, +/obj/item/pet_carrier/small/mouse{ + pixel_y = 14 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/vet_clinic) +"aQW" = ( +/obj/effect/decal/wallpaper/stone, +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/bianchiBank) +"aQX" = ( +/obj/structure/table/wood, +/obj/structure/closet/mini_fridge, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/maintenance) +"aQY" = ( +/obj/structure/chair/sofa/corp/right, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/theatre) +"aQZ" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aRa" = ( +/obj/effect/turf_decal/asphaltline/alt{ + dir = 4 + }, +/obj/effect/turf_decal/bordur/inverse{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aRb" = ( +/obj/structure/chair/wood/darkpack{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aRc" = ( +/obj/structure/vampdoor/wood, +/obj/effect/mapping_helpers/door/access/coggie, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aRd" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 4 + }, +/obj/transfer_point_vamp{ + id = "garage1" + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aRe" = ( +/obj/structure/table/wood, +/obj/item/screwdriver{ + pixel_y = -2; + anchored = 1 + }, +/obj/item/storage/toolbox{ + pixel_y = 8 + }, +/obj/item/scooter_frame{ + pixel_x = 5; + pixel_y = -8; + anchored = 1 + }, +/obj/structure/sign/poster/city/genitorturers/directional/north{ + pixel_x = 6; + pixel_y = 34 + }, +/obj/structure/sign/poster/city/tiamat/directional/north{ + pixel_x = -9; + pixel_y = 30 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/skatepark) +"aRf" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"aRg" = ( +/obj/structure/fireplace, +/turf/open/floor/wood/old, +/area/vtm/interior) +"aRh" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/obj/effect/landmark/npcactivity, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aRi" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/theatre) +"aRj" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/carpet/darkpack/blackgold, +/area/vtm/interior/church) +"aRk" = ( +/obj/structure/railing/wooden_fence{ + dir = 10 + }, +/obj/structure/table/countertop, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"aRl" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aRm" = ( +/obj/structure/vampdoor/old{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"aRn" = ( +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/interior/littleitaly) +"aRo" = ( +/obj/structure/chair/wood/darkpack{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aRp" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 1 + }, +/turf/open/floor/eighties, +/area/vtm/westfield_mall/interior/arcade) +"aRq" = ( +/obj/structure/bookcase/random/nonfiction, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aRr" = ( +/obj/structure/table/wood, +/obj/item/book/random{ + pixel_x = 16; + pixel_y = 11 + }, +/obj/item/book/random{ + pixel_x = 4; + pixel_y = 11 + }, +/obj/item/book/random{ + pixel_x = -8; + pixel_y = 11 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aRs" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 5 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"aRt" = ( +/obj/item/kirbyplants/darkpack/plant4{ + pixel_y = 16; + pixel_x = 11 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"aRu" = ( +/obj/effect/decal/shadow, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"aRv" = ( +/obj/structure/sign/poster/city/blade/directional/north, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"aRw" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/maintenance) +"aRx" = ( +/obj/darkpack_car/rand, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aRy" = ( +/obj/structure/vampdoor/simple, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/games_store) +"aRz" = ( +/obj/item/stack/sheet/cardboard/fifty, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"aRA" = ( +/obj/structure/chair/sofa/corp{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/anarch/sweeper, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/anarch) +"aRB" = ( +/obj/structure/vampipe{ + pixel_y = 32 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aRC" = ( +/obj/structure/secure_safe/directional/north, +/obj/structure/table, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand{ + pixel_y = 5; + pixel_x = 8 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 5; + pixel_x = 8 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 5; + pixel_x = 8 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 13; + pixel_x = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 13; + pixel_x = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 13; + pixel_x = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/interior/bianchiBank) +"aRF" = ( +/obj/effect/spawner/random/trash/rat, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"aRG" = ( +/obj/structure/table/countertop/yellow, +/obj/vampire_computer, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aRH" = ( +/obj/structure/filingcabinet/chestdrawer/wheeled, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aRI" = ( +/obj/item/mop, +/obj/effect/spawner/random/trash/janitor_supplies, +/obj/structure/mop_bucket/janitorialcart{ + dir = 4 + }, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"aRJ" = ( +/obj/item/table_clock, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aRK" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt) +"aRL" = ( +/obj/structure/vampfence/rich, +/obj/effect/turf_decal/bordur{ + dir = 4 + }, +/turf/open/floor/plating/sidewalkalt, +/area/vtm/westfield_mall/forest) +"aRM" = ( +/obj/structure/table, +/obj/structure/frame/machine/secured, +/turf/open/floor/city/industrial/large, +/area/vtm/interior/shop) +"aRN" = ( +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"aRO" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aRP" = ( +/obj/structure/rack/clothing/rand, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/smokeshop) +"aRQ" = ( +/obj/structure/vampfence/rich{ + dir = 4 + }, +/obj/effect/turf_decal/bordur{ + dir = 10 + }, +/turf/open/floor/plating/sidewalkalt, +/area/vtm/westfield_mall/forest) +"aRR" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aRS" = ( +/obj/machinery/sprinkler, +/obj/effect/landmark/npcability, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aRT" = ( +/obj/machinery/light/prince/directional/north, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/westfield_mall/interior/camarilla) +"aRU" = ( +/obj/structure/railing/wooden_fence{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aRV" = ( +/obj/effect/turf_decal/bordur{ + dir = 5 + }, +/obj/effect/turf_decal/bordur{ + dir = 5 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aRW" = ( +/obj/structure/vampstatue, +/obj/effect/turf_decal/bordur{ + dir = 10 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aRX" = ( +/obj/effect/decal/wallpaper/light, +/turf/closed/wall/vampwall/market, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aRZ" = ( +/obj/structure/closet/crate/dumpster, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/endron_logging) +"aSa" = ( +/obj/structure/table/optable, +/turf/open/floor/carpet/green, +/area/vtm/westfield_mall/interior/anarch) +"aSb" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/anarch/sweeper, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/anarch) +"aSc" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/arcade) +"aSe" = ( +/obj/effect/spawner/random/engineering/tank, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"aSg" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 1 + }, +/turf/open/water, +/area/vtm/westfield_mall/forest) +"aSh" = ( +/obj/structure/table, +/obj/effect/decal/rugs, +/obj/machinery/light/blacklight/directional/west, +/obj/item/vamp/keys/nosferatu, +/obj/item/vamp/keys/nosferatu, +/obj/item/vamp/keys/nosferatu, +/turf/open/floor/plating/rough{ + icon_state = "carpet_black" + }, +/area/vtm/interior/sewer/nosferatu_town) +"aSi" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aSj" = ( +/obj/structure/chair/comfy/darkpack/red{ + dir = 4 + }, +/turf/open/floor/carpet/darkpack/bluesilver, +/area/vtm/westfield_mall/interior/theatre) +"aSk" = ( +/obj/machinery/lift_indicator/directional/north{ + pixel_x = -5; + pixel_y = 20; + linked_elevator_id = "mall_elevator_1" + }, +/obj/machinery/button/elevator/directional/north{ + id = "mall_elevator_1"; + pixel_y = 35; + pixel_x = 9 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aSl" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/storage/fancy/cigarettes/cigars{ + pixel_x = 2; + pixel_y = 7 + }, +/turf/open/floor/carpet/lone, +/area/vtm/westfield_mall/interior/theatre) +"aSm" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/east, +/obj/item/reagent_containers/cup/glass/coffee/vampire{ + pixel_x = -6; + pixel_y = 11 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aSn" = ( +/obj/structure/table/countertop/red, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aSo" = ( +/obj/item/clothing/head/vampire/skull, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aSp" = ( +/obj/structure/bonfire/prelit/alt, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/forest) +"aSq" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 8 + }, +/obj/item/pen{ + pixel_y = 10; + pixel_x = -4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"aSr" = ( +/obj/machinery/vending/coffee/private, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aSs" = ( +/obj/structure/chair/plastic, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aSt" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/techshop) +"aSu" = ( +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aSv" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aSw" = ( +/obj/effect/spawner/random/flora/all, +/turf/open/misc/grass/nosmooth, +/area/vtm/westfield_mall) +"aSx" = ( +/turf/open/misc/grass/random/grass, +/area/vtm/westfield_mall/forest) +"aSy" = ( +/obj/structure/chair/wood/darkpack{ + dir = 8 + }, +/obj/effect/landmark/start/darkpack/anarch/emissary, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/westfield_mall/interior/anarch) +"aSz" = ( +/obj/structure/chair/darkpack/blue{ + dir = 8 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aSA" = ( +/obj/structure/vampdoor/wood, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/obj/effect/mapping_helpers/door/access/chantry, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"aSB" = ( +/obj/machinery/sprinkler, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/clothing_store) +"aSD" = ( +/turf/open/floor/city/bacotell, +/area/vtm/interior/sewer) +"aSE" = ( +/obj/structure/flora/tree/vamp/pine, +/turf/open/misc/grass, +/area/vtm/westfield_mall/forest) +"aSF" = ( +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/carpet/darkpack/greengold, +/area/vtm/westfield_mall/interior/games_store) +"aSG" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 4 + }, +/turf/open/water, +/area/vtm/westfield_mall/forest) +"aSH" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aSI" = ( +/obj/effect/spawner/random/maintenance/five, +/turf/open/floor/plating/concrete, +/area/vtm/interior/sewer) +"aSJ" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/item/flashlight/lamp{ + pixel_x = 2; + pixel_y = 8 + }, +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/interior/supply) +"aSK" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aSL" = ( +/turf/open/water/acid, +/area/vtm/westfield_mall/forest) +"aSM" = ( +/obj/structure/table/countertop, +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/westfield_mall/interior/supply) +"aSN" = ( +/turf/open/floor/mineral/titanium/white, +/area/vtm/westfield_mall) +"aSO" = ( +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"aSP" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aSQ" = ( +/obj/effect/turf_decal/bordur/corner/inverse{ + dir = 8 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"aSR" = ( +/mob/living/carbon/human/npc/shop, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/hot_ishu) +"aSS" = ( +/obj/machinery/light/cold/directional/west, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aST" = ( +/obj/structure/closet/crate/bin{ + pixel_x = -8; + pixel_y = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aSU" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt) +"aSV" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aSW" = ( +/obj/structure/stairs/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aSX" = ( +/obj/effect/decal/pallet, +/obj/structure/closet/crate/large, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aSY" = ( +/obj/structure/table/modern, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"aSZ" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/obj/effect/landmark/npcactivity, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"aTa" = ( +/obj/effect/decal/carpet, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aTb" = ( +/obj/machinery/sprinkler, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aTc" = ( +/obj/effect/decal/shadow, +/obj/effect/decal/shadow, +/turf/open/water/vamp_sewer/border, +/area/vtm/interior/sewer) +"aTd" = ( +/obj/structure/flora/rock/darkpack, +/obj/effect/decal/support, +/obj/effect/decal/shadow, +/turf/open/water/vamp_sewer/border, +/area/vtm/interior/sewer) +"aTe" = ( +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/cave) +"aTg" = ( +/obj/structure/platform/lowwall/brick_old, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall) +"aTh" = ( +/obj/structure/hedge, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"aTi" = ( +/obj/structure/hedge/opaque, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 5 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aTj" = ( +/turf/closed/wall/vampwall/rock, +/area/vtm/interior/sewer/nosferatu_town) +"aTk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior/endron_logging) +"aTl" = ( +/turf/closed/wall/vampwall/bar, +/area/vtm/westfield_mall/interior/techshop) +"aTm" = ( +/obj/structure/fake_stairs/wood/directional/west, +/obj/structure/fake_stairs/wood/directional/west, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aTn" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/interior/shop) +"aTo" = ( +/obj/structure/table/modern, +/obj/structure/desk_bell, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"aTp" = ( +/obj/structure/railing, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aTq" = ( +/obj/item/kirbyplants/darkpack/random, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"aTr" = ( +/obj/effect/decal/wallpaper, +/turf/closed/wall/vampwall/junk, +/area/vtm/interior/sewer/nosferatu_town) +"aTs" = ( +/obj/darkpack_car/track, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aTt" = ( +/obj/structure/table/reinforced, +/obj/item/masquerade_contract, +/obj/item/masquerade_contract, +/obj/item/masquerade_contract, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aTu" = ( +/obj/structure/chair/wood/darkpack/red{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aTv" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aTw" = ( +/obj/structure/platform/lowwall/market/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/arcade) +"aTx" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = -9; + pixel_y = 12 + }, +/turf/open/floor/wood/herring, +/area/vtm/interior/littleitaly) +"aTy" = ( +/mob/living/carbon/human/npc/shop, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"aTz" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aTA" = ( +/obj/machinery/autolathe, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"aTB" = ( +/turf/open/openspace, +/area/vtm/westfield_mall/interior/supply) +"aTC" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_y = 6 + }, +/obj/item/pen{ + pixel_y = 7 + }, +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/interior/police) +"aTD" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 1 + }, +/obj/structure/lamppost/sidewalk, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aTE" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 5 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aTF" = ( +/obj/effect/decal/cleanable/trash, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"aTG" = ( +/obj/machinery/light/blacklight/directional/north, +/obj/structure/chair/plastic/darkpack{ + dir = 4 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"aTH" = ( +/obj/structure/table/countertop/black, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aTI" = ( +/obj/structure/vampdoor/old{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/access/lasombra, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"aTJ" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack, +/area/vtm/interior/clinic) +"aTK" = ( +/obj/darkpack_car/track/volkswagen, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"aTL" = ( +/obj/structure/noticeboard/directional/north, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/westfield_mall/interior/anarch) +"aTM" = ( +/obj/structure/vampfence/rich{ + dir = 4; + pixel_y = 8; + name = "bars" + }, +/obj/effect/decal/wallpaper/blue/low, +/obj/structure/platform/lowwall/painted/window/reinforced, +/turf/open/floor/plating/rough, +/area/vtm/interior/police) +"aTO" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks{ + pixel_y = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aTP" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/foodcourt) +"aTR" = ( +/obj/machinery/light/directional/north, +/turf/open/openspace, +/area/vtm/westfield_mall/interior) +"aTS" = ( +/obj/structure/vampstatue, +/obj/effect/turf_decal/bordur{ + dir = 9 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aTT" = ( +/obj/structure/sink/directional/south, +/obj/structure/mirror/directional/north, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/supply) +"aTU" = ( +/obj/effect/decal/shadow, +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior) +"aTV" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping2" + }, +/turf/open/openspace, +/area/vtm/westfield_mall/interior/maintenance) +"aTW" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aTX" = ( +/obj/structure/sign/flag/usa/directional/north{ + pixel_y = 29 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"aTY" = ( +/obj/machinery/light/prince/directional/north, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aTZ" = ( +/obj/effect/decal/cleanable/blood/splatter/oil, +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior/endron_logging) +"aUb" = ( +/obj/effect/landmark/start, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aUc" = ( +/obj/structure/vampdoor/simple/anarch, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/skatepark) +"aUd" = ( +/obj/structure/reagent_dispensers/cooking_oil, +/turf/open/floor/plating/stone, +/area/vtm/westfield_mall/interior/endron_logging) +"aUe" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"aUf" = ( +/obj/machinery/libraryscanner, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aUg" = ( +/obj/item/plate, +/obj/structure/table/reinforced, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aUh" = ( +/obj/structure/rack/food, +/obj/item/stack/sheet/cardboard/fifty, +/turf/open/floor/plating/concrete, +/area/vtm/interior/shop) +"aUi" = ( +/obj/structure/closet/crate, +/obj/item/melee/vamp/brick{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/melee/vamp/brick{ + pixel_x = 3; + pixel_y = 1 + }, +/obj/item/melee/baseball_bat/vamp{ + pixel_y = -4 + }, +/obj/item/chainsaw/vamp, +/obj/item/wirecutters, +/obj/item/storage/box/bodybags{ + pixel_y = 6 + }, +/obj/item/vamp/keys/old_clan_tzimisce, +/obj/item/vamp/keys/old_clan_tzimisce, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aUj" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aUk" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aUl" = ( +/obj/machinery/light/prince/directional/east, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/westfield_mall/interior/chantry) +"aUm" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aUn" = ( +/turf/open/floor/iron/stairs/black{ + dir = 4 + }, +/area/vtm/interior/police) +"aUp" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/police) +"aUq" = ( +/obj/structure/ladder, +/obj/structure/lattice, +/obj/structure/railing{ + dir = 9 + }, +/obj/structure/railing, +/turf/open/openspace, +/area/vtm/westfield_mall) +"aUr" = ( +/obj/structure/table/countertop/bubway, +/obj/structure/retail/bubway_menu{ + pixel_y = 6 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aUs" = ( +/obj/darkpack_car/retro/rand/camarilla, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aUt" = ( +/obj/structure/chair/plastic/darkpack, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"aUu" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"aUv" = ( +/obj/transfer_point_vamp/backrooms/map, +/turf/open/openspace, +/area/vtm/westfield_mall) +"aUw" = ( +/obj/item/instrument/eguitar/vamp{ + pixel_y = -10; + anchored = 1 + }, +/obj/item/instrument/eguitar/vamp{ + pixel_y = 1; + anchored = 1 + }, +/obj/effect/decal/wallpaper/stone, +/turf/closed/wall/vampwall/brick_old, +/area/vtm/westfield_mall/interior/skatepark) +"aUx" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aUy" = ( +/obj/effect/landmark/start/darkpack/chantry/regent, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aUz" = ( +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/interior/police) +"aUA" = ( +/obj/structure/table/wood/fancy/royalblack, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/obj/effect/turf_decal/siding/wood/light, +/turf/open/floor/plating/granite/black, +/area/vtm/westfield_mall/interior/camarilla) +"aUB" = ( +/obj/effect/decal/wallpaper/paper/darkgreen/low, +/obj/structure/table/wood, +/obj/structure/bookcase/random/fiction{ + pixel_y = 23; + density = 0 + }, +/obj/underplate, +/obj/item/kirbyplants/darkpack/plant3{ + pixel_y = 15; + pixel_x = 11 + }, +/obj/item/toy/figure/ian, +/obj/structure/platform/lowwall/junk, +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer/nosferatu_town) +"aUC" = ( +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt) +"aUD" = ( +/obj/effect/turf_decal/siding/white/inner_corner, +/turf/open/floor/city/circled, +/area/vtm/interior/shop) +"aUE" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/roof) +"aUF" = ( +/obj/structure/vampdoor/old, +/obj/effect/mapping_helpers/door/access/clerk, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aUG" = ( +/turf/closed/wall/vampwall/bar, +/area/vtm/westfield_mall/interior/anarch) +"aUH" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/accessory/medal/gold, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aUI" = ( +/obj/structure/table, +/obj/machinery/fax/camarilla, +/turf/open/floor/wood/ornate, +/area/vtm/westfield_mall/interior/camarilla) +"aUJ" = ( +/obj/machinery/shower/directional/west, +/obj/structure/bath, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"aUK" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall) +"aUL" = ( +/obj/effect/turf_decal/caution/red, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"aUM" = ( +/obj/machinery/light/directional/east{ + pixel_y = 9 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/foodcourt) +"aUN" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/roof) +"aUO" = ( +/obj/effect/decal/kopatich{ + pixel_x = -13; + pixel_y = 14 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aUP" = ( +/obj/item/supplypod_beacon{ + anchored = 1 + }, +/turf/open/misc/dirt/rails, +/area/vtm/westfield_mall/interior/supply) +"aUQ" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"aUR" = ( +/obj/structure/table, +/obj/item/tank/internals/anesthetic, +/obj/item/clothing/mask/breath/medical, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"aUS" = ( +/obj/structure/curtain/bounty/start_closed{ + pixel_y = 16 + }, +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/interior/shop) +"aUT" = ( +/obj/structure/bed/double, +/obj/effect/spawner/random/bedsheet/any/double, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aUU" = ( +/obj/structure/platform/lowwall/painted/window/reinforced, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/camarilla) +"aUV" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aUW" = ( +/obj/structure/chair/plastic/darkpack, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"aUX" = ( +/obj/effect/turf_decal/bordur/corner, +/obj/structure/lamppost/sidewalk, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"aUY" = ( +/obj/structure/chair/office/darkpack/blue{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/camarilla/towerwork, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/maintenance) +"aUZ" = ( +/obj/structure/chair/comfy/beige{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aVa" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aVb" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 8 + }, +/obj/effect/landmark/npcability, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aVc" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/obj/structure/sign/city/store/bubway/directional/north{ + pixel_x = -14; + pixel_y = 37 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aVd" = ( +/obj/effect/turf_decal/bordur{ + dir = 10 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aVe" = ( +/obj/structure/table/countertop/red, +/obj/machinery/griddle, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aVf" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/light, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/clothing_store) +"aVg" = ( +/obj/structure/ladder/manhole/down, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"aVh" = ( +/obj/effect/turf_decal/siding/wood/light/end{ + dir = 1 + }, +/obj/structure/mannequin/plastic/fancy{ + anchored = 1 + }, +/turf/open/floor/wood/ornate, +/area/vtm/westfield_mall/interior/clothing_store) +"aVi" = ( +/obj/structure/chair/office/darkpack/blue{ + dir = 1 + }, +/obj/effect/landmark/start/darkpack/hospital/doctor, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"aVj" = ( +/obj/structure/vampfence/rich{ + dir = 4 + }, +/obj/effect/turf_decal/bordur, +/turf/open/floor/plating/sidewalkalt, +/area/vtm/westfield_mall/forest) +"aVk" = ( +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"aVl" = ( +/obj/machinery/light/dim/directional/north, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"aVm" = ( +/obj/structure/chair/comfy/darkpack/dark{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/supply/dealer, +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/interior/supply) +"aVn" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/fake_platform/grey/double, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aVo" = ( +/turf/open/floor/plating/sidewalkalt, +/area/vtm/westfield_mall/forest) +"aVp" = ( +/obj/structure/vampdoor, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/skatepark) +"aVq" = ( +/obj/machinery/camera/motion/directional/west, +/turf/open/floor/city/plating, +/area/vtm/interior/bianchiBank) +"aVr" = ( +/obj/structure/chair/sofa/city_bench/metal/left{ + dir = 4 + }, +/turf/open/floor/city/plating_stone, +/area/vtm/interior/bianchiBank) +"aVs" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aVt" = ( +/obj/structure/table/wood, +/obj/item/seeds/cannabis, +/obj/item/seeds/cannabis, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aVu" = ( +/obj/structure/table/countertop/bubway, +/obj/item/food/fudgedice{ + pixel_y = 7 + }, +/turf/open/floor/carpet/darkpack/greengold, +/area/vtm/westfield_mall/interior/games_store) +"aVv" = ( +/turf/open/misc/dirt, +/area/vtm/interior/sewer) +"aVw" = ( +/obj/structure/flora/rock/darkpack_big, +/turf/open/misc/grass/random/bushes, +/area/vtm/westfield_mall/forest) +"aVx" = ( +/obj/effect/landmark/latejoin_masquerade, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"aVy" = ( +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/interior/shop) +"aVz" = ( +/obj/structure/rack/food, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aVA" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"aVB" = ( +/obj/structure/chair/plastic/darkpack{ + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aVC" = ( +/obj/structure/closet/crate/large, +/obj/effect/spawner/random/engineering/tool, +/obj/effect/spawner/random/engineering/tool, +/obj/effect/spawner/random/engineering/tool, +/obj/effect/spawner/random/engineering/tool, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aVD" = ( +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall) +"aVE" = ( +/obj/structure/table/wood, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aVF" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating/stone, +/area/vtm/interior/sewer) +"aVG" = ( +/turf/closed/wall/vampwall/market, +/area/vtm/westfield_mall/interior/foodcourt) +"aVI" = ( +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/westfield_mall/interior/chantry) +"aVJ" = ( +/obj/structure/chair/sofa/city_bench/metal/left/black{ + dir = 8 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"aVK" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"aVL" = ( +/obj/structure/chair/wood/darkpack/red, +/turf/open/floor/wood/herring, +/area/vtm/interior/littleitaly) +"aVM" = ( +/obj/structure/table/reinforced, +/obj/item/ammo_box/darkpack/c12g{ + pixel_x = 4 + }, +/obj/item/ammo_box/magazine/darkpack556, +/obj/item/ammo_box/magazine/darkpack556, +/obj/machinery/light/directional/south, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/camarilla) +"aVN" = ( +/obj/structure/table/wood, +/obj/vampire_computer{ + pixel_y = 4 + }, +/obj/item/kirbyplants/darkpack/plant2{ + pixel_y = 19; + pixel_x = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"aVO" = ( +/obj/structure/chair/sofa/corp/right, +/obj/effect/landmark/start/darkpack/chantry/archivist, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aVP" = ( +/obj/structure/table/countertop, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"aVQ" = ( +/obj/effect/turf_decal/bordur, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/forest) +"aVR" = ( +/obj/structure/table, +/obj/effect/spawner/random/engineering/material, +/obj/effect/spawner/random/engineering/material, +/obj/effect/spawner/random/engineering/material, +/obj/effect/spawner/random/engineering/material, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"aVS" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/turf/open/floor/city/industrial/large, +/area/vtm/interior/shop) +"aVT" = ( +/turf/closed/wall/vampwall/rock, +/area/vtm/westfield_mall/interior/supply) +"aVU" = ( +/obj/structure/bookcase, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"aVV" = ( +/obj/machinery/light/directional/south, +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aVW" = ( +/obj/structure/table/modern, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 1 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aVX" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"aVY" = ( +/obj/machinery/recycler/lumbermill, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"aVZ" = ( +/obj/structure/table/modern, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aWa" = ( +/obj/structure/table/countertop/teal, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/games_store) +"aWb" = ( +/obj/structure/bed, +/obj/structure/bed{ + pixel_y = 11 + }, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"aWc" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/chantry) +"aWd" = ( +/turf/open/floor/plating/rough/cave, +/area/vtm/westfield_mall/interior/cave) +"aWe" = ( +/obj/effect/decal/cleanable/trash, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/machinery/camera/directional/west, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer/nosferatu_town) +"aWf" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"aWg" = ( +/obj/structure/reagent_dispensers/fueltank/large{ + anchored = 1 + }, +/turf/open/floor/city/industrial/large, +/area/vtm/interior/shop) +"aWh" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/glass/trophy/gold_cup{ + pixel_y = 9; + anchored = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aWi" = ( +/obj/structure/platform/lowwall/junk/alt/window, +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer/nosferatu_town) +"aWj" = ( +/obj/effect/turf_decal/bordur, +/obj/structure/railing, +/obj/machinery/iv_drip, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aWk" = ( +/obj/machinery/camera/directional/east, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"aWl" = ( +/obj/effect/landmark/start/darkpack/chantry/archivist, +/obj/structure/chair/wood/darkpack/red{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aWm" = ( +/obj/structure/chair/sofa/corp/right, +/obj/fake_platform/grey/easyclimb, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aWn" = ( +/obj/effect/decal/pallet, +/obj/effect/spawner/random/maintenance/no_decals, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aWo" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/decal/wallpaper/papers/random{ + pixel_y = 25 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"aWp" = ( +/obj/structure/table/wood, +/obj/machinery/light/prince/directional/north, +/obj/machinery/computer/libraryconsole, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"aWq" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aWr" = ( +/obj/darkpack_car/retro/rand{ + dir = 1 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"aWs" = ( +/obj/structure/table, +/obj/machinery/coffeemaker{ + pixel_y = 12 + }, +/obj/item/coffee_cartridge{ + pixel_y = 1 + }, +/obj/item/coffee_cartridge/decaf{ + pixel_x = -6 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"aWt" = ( +/obj/structure/chair/wood/darkpack/red, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aWu" = ( +/obj/structure/hedge, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aWv" = ( +/obj/effect/turf_decal/asphalt, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"aWw" = ( +/obj/structure/guncase, +/obj/item/gun/ballistic/automatic/darkpack/thompson, +/obj/item/gun/ballistic/automatic/darkpack/thompson, +/turf/open/floor/carpet/darkpack/orangesilver, +/area/vtm/interior/supply) +"aWx" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping24" + }, +/turf/open/floor/plating/canal, +/area/vtm/interior/sewer) +"aWy" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aWz" = ( +/obj/item/chair/plastic, +/obj/item/chair/plastic{ + pixel_y = 2 + }, +/obj/item/chair/plastic{ + pixel_y = 4 + }, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"aWA" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"aWB" = ( +/obj/effect/turf_decal/siding/white/corner{ + dir = 8 + }, +/turf/open/floor/city/circled, +/area/vtm/interior/shop) +"aWC" = ( +/obj/structure/table/wood, +/obj/item/clothing/gloves/boxing, +/obj/item/clothing/gloves/boxing, +/obj/item/clothing/gloves/boxing, +/obj/item/clothing/gloves/boxing, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"aWD" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/pen/fourcolor{ + pixel_x = 7; + pixel_y = 11 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = 6; + pixel_y = 7 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = 5; + pixel_y = 2 + }, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"aWE" = ( +/obj/structure/closet/crate/cardboard, +/obj/effect/decal/pallet, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aWF" = ( +/obj/effect/mapping_helpers/door/lock, +/obj/structure/vampdoor/reinf{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/lock_difficulty/nine, +/obj/effect/mapping_helpers/door/access/wolftech, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"aWG" = ( +/obj/structure/table, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/maintenance) +"aWH" = ( +/obj/structure/vampfence/rich, +/obj/structure/platform/lowwall/painted, +/turf/open/floor/plating/rough, +/area/vtm/interior/shop) +"aWI" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/underground_parking) +"aWJ" = ( +/obj/effect/turf_decal/bordur{ + dir = 5 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"aWK" = ( +/obj/fake_platform/lightpadded, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aWL" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/supply) +"aWM" = ( +/obj/machinery/door/poddoor/shutters{ + dir = 8; + elevator_mode = 1; + transport_linked_id = "mall_elevator_1" + }, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/elevator) +"aWN" = ( +/obj/effect/turf_decal/siding/wood/light, +/turf/open/floor/plating/granite/black, +/area/vtm/westfield_mall/interior/camarilla) +"aWO" = ( +/obj/structure/table/modern, +/obj/structure/mannequin/plastic/punk{ + anchored = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"aWQ" = ( +/obj/vampire_computer{ + pixel_y = 3; + pixel_x = 4 + }, +/obj/effect/decal/pallet, +/obj/structure/table/wood, +/obj/underplate, +/obj/item/flashlight/lamp{ + pixel_y = 13; + pixel_x = -11 + }, +/turf/open/floor/city/industrial, +/area/vtm/interior/sewer/nosferatu_town) +"aWS" = ( +/obj/effect/turf_decal/crosswalk{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"aWT" = ( +/obj/effect/turf_decal/asphaltline/alt{ + dir = 4 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/skatepark) +"aWU" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/carpet, +/area/awaymission/errorroom) +"aWV" = ( +/obj/effect/turf_decal/asphalt, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aWW" = ( +/obj/structure/table, +/obj/item/stack/dollar/thousand{ + pixel_y = 5; + pixel_x = 8 + }, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 13; + pixel_x = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_y = 13; + pixel_x = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/stack/dollar/thousand{ + pixel_x = -9; + pixel_y = 1 + }, +/turf/open/floor/city/plating, +/area/vtm/interior/bianchiBank) +"aWX" = ( +/obj/effect/turf_decal/siding/grey{ + dir = 1 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/church) +"aWY" = ( +/obj/structure/curtain/cloth/fancy/mechanical/luxurious{ + pixel_y = 16 + }, +/turf/open/floor/carpet/darkpack/blacksilver, +/area/vtm/westfield_mall/interior/theatre) +"aWZ" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/westfield_mall/interior/anarch) +"aXa" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/snack{ + pixel_x = -6; + pixel_y = 9 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/wine_glass{ + pixel_x = -9 + }, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"aXb" = ( +/turf/closed/wall/vampwall/brick, +/area/vtm/interior/supply) +"aXc" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"aXd" = ( +/obj/structure/vampdoor, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/hot_ishu) +"aXe" = ( +/turf/open/floor/plating/granite/black, +/area/vtm/interior/shop) +"aXf" = ( +/obj/effect/spawner/random/structure/shipping_container/blank, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"aXg" = ( +/obj/machinery/light/directional/north, +/obj/structure/rack/food/rand, +/turf/open/floor/city/plating_mono, +/area/vtm/interior/shop) +"aXh" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/maintenance) +"aXi" = ( +/obj/structure/chair/wood/darkpack{ + dir = 8 + }, +/obj/effect/landmark/start/darkpack/forest_wolves/wyrmfoe, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aXj" = ( +/obj/effect/turf_decal/bordur, +/obj/structure/railing, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"aXk" = ( +/obj/machinery/light/directional/east{ + pixel_y = 9 + }, +/turf/open/openspace, +/area/vtm/westfield_mall/interior) +"aXl" = ( +/obj/structure/chair/sofa/city_bench/metal/right/black{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aXm" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/carpet/darkpack/cyan, +/area/vtm/westfield_mall/interior/vet_clinic) +"aXn" = ( +/obj/structure/coclock/grandpa, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aXo" = ( +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall) +"aXp" = ( +/obj/structure/sign/poster/city/dmc/directional/north{ + pixel_x = -8; + pixel_y = 33 + }, +/obj/structure/sign/poster/city/blade/directional/north{ + pixel_x = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aXq" = ( +/obj/structure/railing/wooden_fence{ + dir = 1; + pixel_y = 8 + }, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"aXr" = ( +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aXs" = ( +/obj/structure/flora/rock/darkpack, +/obj/structure/flora/rock/darkpack, +/obj/item/clothing/mask/animal/frog, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer) +"aXt" = ( +/turf/closed/wall/vampwall/junk/alt, +/area/vtm/interior/sewer/nosferatu_town) +"aXu" = ( +/obj/structure/table/countertop/red, +/obj/structure/sink/basin/directional/east{ + pixel_x = -10 + }, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aXv" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer/nosferatu_town) +"aXw" = ( +/obj/structure/table/reinforced, +/obj/item/gun/ballistic/automatic/darkpack/huntrifle, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aXx" = ( +/obj/effect/decal/wallpaper/gold, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/camarilla) +"aXy" = ( +/obj/structure/table/wood, +/obj/structure/sign/poster/city/genitorturers/directional/north{ + pixel_x = 8; + pixel_y = 31 + }, +/obj/structure/sign/poster/city/darlingvioletta/directional/north{ + pixel_x = -7 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/hot_ishu) +"aXz" = ( +/obj/structure/chair/sofa/left/brown, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aXA" = ( +/obj/structure/vampdoor/simple, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/turf_decal/siding/grey, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aXB" = ( +/mob/living/carbon/human/npc/shop, +/obj/structure/chair/office, +/obj/effect/mapping_helpers/mob_buckler, +/obj/machinery/light/directional/north, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aXC" = ( +/turf/open/floor/carpet/darkpack/blacksilver, +/area/vtm/westfield_mall/interior/theatre) +"aXD" = ( +/obj/item/clothing/head/cone, +/turf/open/misc/dirt, +/area/vtm/westfield_mall/interior/supply) +"aXE" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping23" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aXF" = ( +/obj/structure/table/wood, +/obj/machinery/fax/tremere, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aXG" = ( +/obj/structure/table/wood, +/obj/machinery/radio_tranceiver/police{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"aXH" = ( +/obj/effect/turf_decal/darkpack/grass{ + dir = 6 + }, +/turf/open/misc/dirt, +/area/vtm/westfield_mall) +"aXI" = ( +/turf/open/water/beach/vamp/deep, +/area/vtm/westfield_mall/forest) +"aXJ" = ( +/obj/effect/turf_decal/bordur/corner, +/turf/open/water, +/area/vtm/westfield_mall/forest) +"aXK" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 5 + }, +/turf/open/floor/city/industrial/large, +/area/vtm/interior/shop) +"aXL" = ( +/obj/effect/turf_decal/bordur{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"aXM" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aXN" = ( +/obj/darkpack_car/retro/rand, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"aXO" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aXP" = ( +/obj/structure/vampfence/rich, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer) +"aXQ" = ( +/obj/structure/table/optable, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"aXR" = ( +/obj/structure/railing/wooden_fence, +/obj/structure/closet/cabinet, +/obj/item/clothing/suit/wizrobe/fake, +/obj/item/clothing/head/wizard, +/obj/item/clothing/head/costume/knight, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aXS" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/trimline/red/warning{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aXT" = ( +/turf/open/openspace, +/area/vtm/westfield_mall/interior/techshop) +"aXU" = ( +/obj/effect/decal/cleanable/trash, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/sewer/nosferatu_town) +"aXV" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/maintenance/atrium) +"aXW" = ( +/obj/structure/vampdoor/simple, +/obj/effect/turf_decal/siding/white, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/salubri, +/turf/open/floor/city/circled, +/area/vtm/westfield_mall/interior/vet_clinic) +"aXX" = ( +/turf/open/water/beach/vamp, +/area/vtm/westfield_mall/interior/cave) +"aXY" = ( +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aXZ" = ( +/obj/effect/landmark/latejoin, +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"aYa" = ( +/mob/living/carbon/human/npc/shop, +/obj/effect/decal/carpet, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"aYb" = ( +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"aYc" = ( +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/skatepark) +"aYd" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/reagent_containers/cup/glass/bottle/whiskey{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/whiskey_shot{ + pixel_x = -7; + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/whiskey_shot{ + pixel_x = -8 + }, +/turf/open/floor/carpet/lone, +/area/vtm/westfield_mall/interior/theatre) +"aYe" = ( +/obj/effect/turf_decal/siding/wood/dark, +/obj/structure/table/wood, +/obj/item/clipboard{ + pixel_x = -7; + pixel_y = 7 + }, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/interior/clinic) +"aYf" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/obj/structure/chair/plastic/darkpack, +/turf/open/floor/carpet/darkpack, +/area/vtm/interior/clinic) +"aYg" = ( +/mob/living/basic/bat{ + name = "Tim"; + gender = "female" + }, +/turf/open/floor/plating/stone, +/area/vtm/interior/sewer) +"aYh" = ( +/obj/structure/sign/flag/usa/directional/north{ + pixel_y = 29 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aYi" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/seclite, +/obj/item/flashlight/seclite{ + pixel_y = 5 + }, +/obj/item/flashlight/seclite, +/obj/item/flashlight/seclite{ + pixel_y = 5 + }, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"aYj" = ( +/obj/structure/table/countertop/black, +/obj/structure/sink/basin/directional/west, +/obj/machinery/light/small/directional/east, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"aYk" = ( +/obj/machinery/light/prince/directional/north, +/turf/open/floor/carpet/darkpack/blackgold, +/area/vtm/interior/church) +"aYl" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior) +"aYm" = ( +/obj/structure/table/wood, +/obj/structure/retail/coffee_shop, +/obj/effect/turf_decal/siding/wood/light{ + dir = 4 + }, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"aYn" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"aYo" = ( +/obj/structure/fake_stairs/wood/directional/north, +/obj/structure/railing/wooden_fence{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aYp" = ( +/obj/effect/decal/coastline/corner, +/turf/open/misc/beach/vamp, +/area/vtm/westfield_mall/forest) +"aYq" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/dojo) +"aYr" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_y = 6 + }, +/obj/item/pen{ + pixel_y = 7 + }, +/obj/item/kirbyplants/darkpack/plant4{ + pixel_y = 7; + pixel_x = 11 + }, +/obj/item/kirbyplants/darkpack/plant1{ + pixel_y = 17; + pixel_x = -12 + }, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/interior/police) +"aYs" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aYt" = ( +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aYu" = ( +/obj/machinery/photocopier/prebuilt, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aYv" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/arcade) +"aYw" = ( +/obj/effect/turf_decal/siding/wood/dark, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior) +"aYx" = ( +/obj/structure/table/countertop/teal, +/obj/effect/turf_decal/siding/white/corner, +/turf/open/floor/city/bacotell, +/area/vtm/interior/shop) +"aYy" = ( +/obj/structure/table/countertop/bubway, +/turf/open/floor/carpet/darkpack/greengold, +/area/vtm/westfield_mall/interior/games_store) +"aYz" = ( +/obj/item/kirbyplants/darkpack/random, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer/nosferatu_town) +"aYA" = ( +/obj/structure/table/wood, +/obj/vampire_computer, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aYB" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 8 + }, +/turf/open/water, +/area/vtm/westfield_mall/forest) +"aYC" = ( +/obj/vehicle/ridden/atv, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/endron_logging) +"aYD" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aYE" = ( +/obj/item/melee/skateboard/pro{ + pixel_y = -3; + anchored = 1 + }, +/obj/effect/decal/wallpaper/stone, +/turf/closed/wall/vampwall/brick_old, +/area/vtm/westfield_mall/interior/skatepark) +"aYF" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"aYG" = ( +/turf/open/floor/plating/sidewalk, +/area/vtm/westfield_mall) +"aYH" = ( +/obj/structure/vampipe{ + icon_state = "piping3"; + pixel_y = 32 + }, +/turf/open/water/vamp_sewer/border, +/area/vtm/interior/sewer) +"aYI" = ( +/obj/machinery/sprinkler, +/turf/open/floor/eighties, +/area/vtm/westfield_mall/interior/arcade) +"aYJ" = ( +/obj/structure/rack/food, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aYK" = ( +/turf/open/floor/city/plating, +/area/vtm/interior/bianchiBank) +"aYL" = ( +/obj/structure/safe, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/dollar/thousand, +/obj/item/stack/sheet/mineral/gold/fifty, +/obj/item/stack/sheet/mineral/diamond, +/turf/open/floor/city/plating, +/area/vtm/interior/bianchiBank) +"aYM" = ( +/obj/structure/hedge, +/turf/open/floor/city/plating_stone, +/area/vtm/interior/bianchiBank) +"aYN" = ( +/obj/structure/rack/clothing_hanger, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"aYO" = ( +/obj/effect/decal/wallpaper/red, +/turf/closed/wall/vampwall/painted, +/area/vtm/interior/elevator) +"aYP" = ( +/mob/living/carbon/human/npc/shop, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"aYQ" = ( +/obj/structure/chair/stool/bar/darkpack/red, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"aYR" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/smokeshop) +"aYS" = ( +/obj/structure/roofstuff/vent/autotiling, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall) +"aYT" = ( +/obj/effect/turf_decal/caution/stand_clear/red{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/endron_logging) +"aYU" = ( +/obj/structure/vampfence/rich{ + dir = 4; + name = "window bars" + }, +/obj/structure/platform/lowwall/junk/window, +/turf/open/floor/plating/rough, +/area/vtm/interior/sewer/nosferatu_town) +"aYV" = ( +/mob/living/carbon/human/npc/shop{ + resistant_to_disciplines = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aYW" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping2" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance) +"aYX" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping25" + }, +/obj/machinery/microwave, +/obj/machinery/light/small/directional/north{ + pixel_x = 2 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aYY" = ( +/obj/structure/rack/clothing_hanger/rand, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"aYZ" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/city/toilet, +/area/vtm/interior/shop) +"aZa" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/city/toilet/large, +/area/vtm/westfield_mall/interior/smokeshop) +"aZb" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/city/gummaguts, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aZc" = ( +/obj/structure/chair/sofa/city_bench/metal/right/yellow{ + dir = 8 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aZd" = ( +/obj/structure/flora/tree/vamp/pine, +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/misc/grass, +/area/vtm/westfield_mall/forest) +"aZe" = ( +/mob/living/carbon/human/npc/shop, +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/carpet/darkpack/cyan, +/area/vtm/westfield_mall/interior/vet_clinic) +"aZf" = ( +/turf/open/misc/dirt, +/area/vtm/westfield_mall/interior/supply) +"aZg" = ( +/obj/machinery/light/floor, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"aZh" = ( +/obj/machinery/light/warm/directional/east, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aZi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/mouse/vampire, +/turf/open/floor/wood/old, +/area/vtm/interior) +"aZj" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/hot_ishu) +"aZk" = ( +/obj/structure/coclock, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"aZl" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aZm" = ( +/obj/structure/table/wood, +/obj/item/toy/cards/deck, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/anarch) +"aZn" = ( +/obj/machinery/light/directional/south, +/obj/structure/chair/office/darkpack/blue{ + dir = 1 + }, +/obj/effect/landmark/start/darkpack/law_enforcement/chief, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/interior/police) +"aZo" = ( +/obj/structure/railing/wooden_fence{ + dir = 8 + }, +/obj/structure/table/countertop, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"aZp" = ( +/obj/structure/bookcase/manuals/engineering, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aZq" = ( +/obj/structure/rack/food/rand{ + dir = 4; + pixel_y = 16; + pixel_x = -24 + }, +/turf/open/floor/city/circled/large, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"aZr" = ( +/obj/structure/toilet{ + dir = 4; + pixel_y = 8 + }, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/games_store) +"aZs" = ( +/obj/structure/vampdoor/old{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/access/nosferatu, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/plating/canalplating, +/area/vtm/interior/sewer/nosferatu_town) +"aZt" = ( +/obj/structure/closet, +/obj/item/clothing/under/vampire/police, +/obj/item/clothing/under/vampire/police/long, +/obj/item/clothing/under/vampire/police/pants, +/obj/item/clothing/under/vampire/police/turtleneck, +/obj/item/clothing/under/vampire/police/utility, +/obj/item/storage/fancy/cigarettes/cigpack_robust, +/obj/item/lighter/greyscale, +/turf/open/floor/city/plating, +/area/vtm/interior/police) +"aZu" = ( +/obj/structure/table/wood, +/obj/structure/retail/clothing_store, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/clothing_store) +"aZv" = ( +/mob/living/carbon/human/npc/shop, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aZw" = ( +/obj/structure/sign/poster/contraband/dream/directional/north{ + pixel_x = -1; + pixel_y = 31 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aZx" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 8; + pixel_x = -3 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 1; + pixel_x = 1 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"aZy" = ( +/turf/open/floor/carpet/darkpack/blackgold, +/area/vtm/interior/church) +"aZz" = ( +/obj/structure/chair/sofa/city_bench/metal/middle/black{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/rich, +/area/vtm/westfield_mall) +"aZA" = ( +/obj/structure/bookcase, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aZB" = ( +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/interior/bianchiBank) +"aZC" = ( +/obj/machinery/vending/cigarette, +/obj/effect/decal/wallpaper/grey{ + pixel_y = 32 + }, +/obj/structure/sign/warning/yes_smoking/circle/directional/north, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/smokeshop) +"aZD" = ( +/obj/structure/table/countertop, +/obj/structure/mannequin/plastic, +/turf/open/floor/plating/concrete, +/area/vtm/interior/supply) +"aZE" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aZF" = ( +/obj/structure/weightmachine, +/obj/effect/decal/rugs, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/city/plating_stone, +/area/vtm/westfield_mall/interior) +"aZG" = ( +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping13" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/maintenance/basement) +"aZH" = ( +/obj/structure/table, +/obj/effect/decal/rugs, +/obj/machinery/computer/security/wooden_tv{ + pixel_x = 4; + pixel_y = 12 + }, +/turf/open/floor/plating/rough{ + icon_state = "carpet_black" + }, +/area/vtm/interior/sewer/nosferatu_town) +"aZI" = ( +/obj/machinery/vending/games, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"aZJ" = ( +/obj/structure/table/reinforced, +/obj/structure/fluff/tv{ + pixel_y = 14; + pixel_x = 16 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aZK" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"aZL" = ( +/obj/effect/turf_decal/siding/wood/dark, +/obj/structure/vampdoor/wood, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/obj/effect/mapping_helpers/door/access/bank, +/obj/effect/mapping_helpers/door/lock, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"aZM" = ( +/obj/structure/table/wood, +/obj/item/flashlight/flare/candle{ + pixel_x = 12; + pixel_y = 2 + }, +/turf/open/floor/carpet/darkpack/blackgold, +/area/vtm/interior/church) +"aZN" = ( +/obj/effect/decal/painting{ + pixel_y = 32 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aZO" = ( +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior) +"aZP" = ( +/obj/item/flashlight/flare/candle/infinite, +/obj/structure/table/wood, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior) +"aZQ" = ( +/mob/living/carbon/human/npc/shop, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"aZR" = ( +/obj/machinery/bookbinder, +/obj/structure/coclock, +/obj/machinery/light_switch/directional/north{ + pixel_x = -10; + pixel_y = 31 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"aZS" = ( +/obj/structure/dresser, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"aZT" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/coffee/vampire/robust{ + pixel_x = -7 + }, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"aZU" = ( +/obj/structure/glowshroom, +/turf/open/misc/grass, +/area/vtm/westfield_mall/forest) +"aZV" = ( +/obj/effect/landmark/npcability, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/parking_lot) +"aZW" = ( +/obj/machinery/light/prince/broken/directional/south, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/mansion) +"aZX" = ( +/obj/effect/decal/wallpaper/red, +/obj/item/food/chocolatebar{ + pixel_x = -12; + pixel_y = -10 + }, +/obj/item/food/chocolatebar{ + pixel_x = -1; + pixel_y = -10 + }, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/theatre) +"aZY" = ( +/turf/closed/wall/vampwall/wood, +/area/vtm/westfield_mall/forest) +"aZZ" = ( +/turf/open/floor/iron/stairs/left{ + dir = 8 + }, +/area/vtm/westfield_mall/interior/theatre) +"baf" = ( +/obj/structure/rack/food, +/obj/effect/spawner/random/bureaucracy/crayon{ + pixel_x = -6; + pixel_y = 9 + }, +/obj/effect/spawner/random/bureaucracy/crayon{ + pixel_y = 9 + }, +/obj/effect/spawner/random/bureaucracy/crayon{ + pixel_x = 6; + pixel_y = 9 + }, +/obj/effect/spawner/random/bureaucracy/crayon{ + pixel_x = 9; + pixel_y = 9 + }, +/turf/open/floor/iron/grimy, +/area/vtm/westfield_mall/interior/art_store) +"bfr" = ( +/obj/structure/desk_bell{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/food/cake/berry_chocolate_cake{ + pixel_y = 27 + }, +/obj/structure/table/countertop/green, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"bkw" = ( +/obj/effect/decal/rugs, +/turf/open/floor/iron/dark, +/area/vtm/westfield_mall/interior/art_store) +"brv" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"buD" = ( +/obj/structure/vampstatue/cloaked, +/turf/open/floor/iron/grimy, +/area/vtm/westfield_mall/interior/art_store) +"bvD" = ( +/obj/effect/mapping_helpers/door/access/ventrue, +/obj/structure/vampdoor{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"bzR" = ( +/obj/machinery/sprinkler, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"bAt" = ( +/obj/effect/landmark/observer_start, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall) +"bOf" = ( +/obj/vehicle/ridden/scooter{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"bPq" = ( +/obj/structure/rack/food{ + dir = 8; + pixel_x = -10 + }, +/obj/machinery/light/directional/north, +/obj/effect/spawner/random/entertainment/dice{ + pixel_x = -7 + }, +/obj/effect/spawner/random/entertainment/dice{ + pixel_x = 6; + pixel_y = -1 + }, +/obj/effect/spawner/random/entertainment/deck{ + pixel_x = -8; + pixel_y = 18 + }, +/obj/effect/spawner/random/entertainment/deck{ + pixel_x = 5; + pixel_y = 18 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"bPr" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/structure/coclock, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"bPH" = ( +/obj/structure/filingcabinet{ + pixel_x = 8 + }, +/obj/structure/filingcabinet{ + pixel_x = -6 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"bSD" = ( +/obj/structure/table/wood, +/obj/item/taperecorder{ + pixel_x = 6; + pixel_y = 8 + }, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"bSP" = ( +/obj/item/kirbyplants/darkpack/random{ + pixel_x = 6; + pixel_y = 11 + }, +/obj/structure/table/modern, +/obj/item/phone_book{ + pixel_x = -3 + }, +/turf/open/floor/carpet/green, +/area/vtm/westfield_mall/interior/law_office) +"bVB" = ( +/obj/structure/table/wood, +/obj/item/key/golfcart, +/obj/item/clothing/head/vampire/hardhat{ + pixel_x = 7 + }, +/obj/item/clothing/head/vampire/hardhat{ + pixel_x = -8 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"bXd" = ( +/obj/structure/chair/sofa/corp/right, +/turf/open/floor/carpet/darkpack/blacksilver, +/area/vtm/westfield_mall/interior/skatepark) +"bZg" = ( +/obj/structure/rack/food{ + dir = 8; + pixel_x = -23; + pixel_y = 2 + }, +/obj/item/food/candy_corn{ + pixel_x = -23; + pixel_y = 5 + }, +/obj/item/food/candy_corn{ + pixel_x = -11; + pixel_y = 5 + }, +/obj/item/food/candyheart{ + pixel_y = 15; + pixel_x = -19 + }, +/obj/item/food/candyheart{ + pixel_y = 15; + pixel_x = -9 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"cbl" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"cdr" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/pet/cat/darkpack{ + gender = "male"; + name = "Abel"; + desc = "Because he's 'Abel' to catch so many mice!" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"ciB" = ( +/obj/transfer_point_vamp{ + id = "forestR2" + }, +/turf/open/misc/dirt, +/area/vtm/interior/caves) +"ckt" = ( +/obj/machinery/sprinkler, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"clH" = ( +/obj/machinery/light/dim/directional/east, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"clL" = ( +/obj/structure/chair/sofa/corner/maroon, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/law_office) +"cnl" = ( +/obj/structure/table/wood/fancy, +/obj/machinery/light/prince/directional/north, +/obj/effect/spawner/random/decoration/flower, +/turf/open/floor/carpet/green, +/area/vtm/westfield_mall/interior/law_office) +"ctM" = ( +/obj/effect/mapping_helpers/door/access/supply, +/obj/structure/vampdoor/woodglass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"cuV" = ( +/obj/structure/chair/sofa/middle/brown{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"cER" = ( +/obj/structure/closet/crate/bin{ + pixel_x = 8 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"cHl" = ( +/obj/item/kirbyplants/darkpack/random, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"cID" = ( +/obj/effect/landmark/start/darkpack/hecata/squadra, +/turf/open/floor/city/plating_stone, +/area/vtm/interior/bianchiBank) +"cLl" = ( +/turf/closed/wall/vampwall/market, +/area/vtm/westfield_mall/interior/bathroom) +"cLU" = ( +/turf/open/floor/plating/rough/cave, +/area/vtm/interior/caves) +"dan" = ( +/obj/structure/chair/office/darkpack/blue{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/camarilla/clerk, +/turf/open/floor/wood/ornate, +/area/vtm/westfield_mall/interior/camarilla) +"dll" = ( +/obj/structure/railing/wooden_fence{ + dir = 1; + pixel_y = 8 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/supply) +"drk" = ( +/obj/structure/rack/food, +/obj/item/paint_palette, +/obj/item/paint_palette{ + pixel_y = 11 + }, +/turf/open/floor/iron/grimy, +/area/vtm/westfield_mall/interior/art_store) +"dsE" = ( +/obj/item/storage/fancy/donut_box{ + pixel_y = 19 + }, +/obj/structure/table/countertop/green, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"duz" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior) +"dvM" = ( +/obj/structure/bed/double, +/obj/structure/railing/wooden_fence{ + dir = 4 + }, +/obj/item/bedsheet/rd/double, +/turf/open/floor/carpet/green, +/area/vtm/westfield_mall/interior/law_office) +"dwx" = ( +/obj/item/camera_film{ + pixel_x = -18; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/trash, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"dwM" = ( +/obj/structure/closet/secure_closet/freezer/fridge/all_access, +/obj/item/storage/box/ingredients/american, +/obj/item/storage/box/ingredients/carnivore, +/obj/item/storage/box/ingredients/fruity, +/obj/item/storage/box/ingredients/grains, +/obj/item/storage/box/ingredients/vegetarian, +/obj/item/reagent_containers/condiment/milk, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"dFh" = ( +/obj/effect/mapping_helpers/door/access/ventrue, +/obj/structure/vampdoor{ + dir = 4 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"dGP" = ( +/obj/structure/vampdoor/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/chantry, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"dJS" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/trash, +/obj/effect/decal/cleanable/blood/splatter/oil, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"dMM" = ( +/obj/structure/vampdoor/woodglass, +/obj/effect/mapping_helpers/door/access/lasombra, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/carpet/darkpack/blackgold, +/area/vtm/interior/church) +"dQG" = ( +/obj/structure/vampdoor/wood/apartment, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"dTh" = ( +/obj/structure/chair/office/darkpack/red, +/obj/effect/landmark/start/darkpack/law_enforcement/fbi, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/art_store) +"dYz" = ( +/obj/structure/vampdoor/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/wolftech, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/techshop) +"ebf" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"eel" = ( +/obj/machinery/light/floor, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior) +"eeN" = ( +/mob/living/carbon/human/npc/shop, +/obj/structure/chair/darkpack/blue, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior) +"efX" = ( +/obj/machinery/light/directional/east, +/obj/item/paint/paint_remover{ + pixel_x = 6; + pixel_y = -9 + }, +/obj/item/paint/yellow{ + pixel_x = -5; + pixel_y = -10 + }, +/obj/item/paint/red, +/obj/item/paint/white{ + pixel_x = 9 + }, +/obj/item/paint/violet{ + pixel_x = -9 + }, +/turf/open/floor/iron/grimy, +/area/vtm/westfield_mall/interior/art_store) +"emu" = ( +/obj/machinery/light/directional/east, +/turf/open/openspace, +/area/vtm/westfield_mall/interior) +"enr" = ( +/obj/structure/rack/food{ + dir = 8; + pixel_x = -13; + pixel_y = 2 + }, +/obj/item/food/donut/jelly/choco{ + pixel_y = 11; + pixel_x = -11 + }, +/obj/item/food/chocoorange{ + pixel_x = 4; + pixel_y = 21 + }, +/obj/item/food/chocoorange{ + pixel_x = -6; + pixel_y = 21 + }, +/obj/item/food/chocoorange{ + pixel_x = -14; + pixel_y = 21 + }, +/obj/item/food/donut/jelly/choco{ + pixel_x = 2; + pixel_y = 10 + }, +/obj/item/food/donut/jelly/caramel{ + pixel_y = -2; + pixel_x = -11 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"esn" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/obj/structure/vampdoor/wood/apartment, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"ewS" = ( +/obj/machinery/photocopier/prebuilt, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"eyv" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/item/flashlight/lamp{ + pixel_x = -9; + pixel_y = 11 + }, +/obj/effect/spawner/random/bureaucracy/folder{ + pixel_x = -9; + pixel_y = -2 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"eBu" = ( +/turf/open/floor/carpet/green, +/area/vtm/westfield_mall/interior/law_office) +"eBB" = ( +/obj/machinery/sprinkler, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"eJa" = ( +/obj/structure/rack/food{ + dir = 8; + pixel_x = -34; + pixel_y = 2 + }, +/obj/item/food/chocoorange{ + pixel_x = 4; + pixel_y = 21 + }, +/obj/item/food/chocoorange{ + pixel_x = 10; + pixel_y = 21 + }, +/obj/item/food/donut/jelly/choco{ + pixel_y = 11; + pixel_x = 7 + }, +/obj/item/food/donut/jelly/caramel{ + pixel_y = -2; + pixel_x = 35 + }, +/obj/item/food/donut/jelly/caramel{ + pixel_y = -2; + pixel_x = 7 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"eKL" = ( +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/law_office) +"eNH" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"eRr" = ( +/turf/open/floor/iron/dark, +/area/vtm/westfield_mall/interior/art_store) +"eXm" = ( +/obj/structure/vampdoor/old{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/toreador, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/theatre) +"eYT" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 4 + }, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"feh" = ( +/obj/structure/table/wood, +/obj/item/carpenter_hammer{ + pixel_x = -10; + pixel_y = 3 + }, +/obj/item/assembly/mousetrap{ + pixel_x = 11; + pixel_y = 11 + }, +/obj/item/assembly/mousetrap{ + pixel_x = 6; + pixel_y = 6 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"fgJ" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 8 + }, +/obj/item/soil_sack{ + pixel_x = -6 + }, +/obj/item/soil_sack{ + pixel_x = 10 + }, +/obj/item/soil_sack{ + pixel_x = 2 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"fjk" = ( +/turf/open/floor/carpet/darkpack/blacksilver, +/area/vtm/westfield_mall/interior/skatepark) +"fmw" = ( +/obj/structure/table/glass, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"foj" = ( +/obj/structure/table/wood, +/obj/item/crowbar{ + pixel_x = 11; + pixel_y = 4 + }, +/obj/item/wirecutters{ + pixel_x = -7 + }, +/obj/item/wirecutters{ + pixel_x = -1; + pixel_y = 9 + }, +/obj/item/hatchet/wooden{ + pixel_x = -13; + pixel_y = 7 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"fqc" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/skatepark) +"fwG" = ( +/obj/effect/decal/wallpaper/grey, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"fxg" = ( +/obj/effect/turf_decal/caution/red{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior) +"fxB" = ( +/obj/machinery/sprinkler, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/westfield_mall/interior/theatre) +"fGB" = ( +/obj/effect/decal/wallpaper/papers/seven, +/obj/effect/decal/wallpaper/light, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/games_store) +"fJW" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 1 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"fLp" = ( +/obj/effect/decal/wallpaper/papers/random{ + pixel_x = 1; + pixel_y = 26 + }, +/turf/open/openspace, +/area/vtm/westfield_mall/interior/games_store) +"fLs" = ( +/obj/structure/platform/lowwall/market/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/law_office) +"fMu" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/seclite{ + pixel_y = 5 + }, +/obj/item/flashlight/seclite, +/turf/open/floor/iron/dark, +/area/vtm/westfield_mall/interior/art_store) +"fSa" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/item/flashlight/lamp{ + pixel_x = -2; + pixel_y = 10 + }, +/turf/open/floor/iron/dark, +/area/vtm/westfield_mall/interior/art_store) +"fVR" = ( +/obj/structure/vampdoor/woodglass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"gcK" = ( +/obj/structure/table/countertop/red, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"gfm" = ( +/obj/structure/table/wood, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "these_are_here_for_show_do_not_assign_me_a_button"; + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior) +"gfJ" = ( +/obj/structure/stairs/south, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior) +"ggn" = ( +/obj/structure/table/wood, +/obj/vampire_computer{ + pixel_y = 4 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"giN" = ( +/obj/effect/turf_decal/siding/white/corner, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"gjo" = ( +/obj/structure/vampdoor/glass, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/foodcourt/restaurant) +"glA" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/candy_store) +"gqS" = ( +/obj/effect/decal/wallpaper/red, +/obj/effect/decal/wallpaper/paper/darkred, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/law_office) +"gqY" = ( +/obj/structure/table/modern, +/obj/structure/retail/gun_store, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior) +"gsP" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/item/food/vampire/icecream/chocolate, +/obj/item/food/vampire/icecream/chocolate{ + pixel_y = 1; + pixel_x = -4 + }, +/obj/item/food/vampire/icecream/chocolate{ + pixel_y = -7 + }, +/obj/item/food/vampire/icecream/berry{ + pixel_x = -4 + }, +/obj/item/food/vampire/icecream/berry, +/obj/item/food/vampire/icecream/berry{ + pixel_x = 5 + }, +/obj/item/food/vampire/icecream/berry{ + pixel_y = -8 + }, +/obj/item/food/vampire/icecream/chocolate{ + pixel_y = -7 + }, +/obj/item/food/vampire/icecream/chocolate{ + pixel_y = -8; + pixel_x = -4 + }, +/obj/item/food/icecreamsandwich{ + pixel_x = 1; + pixel_y = 8 + }, +/obj/item/food/icecreamsandwich{ + pixel_x = 1; + pixel_y = 4 + }, +/obj/structure/sign/poster/contraband/jumbo_bar/directional/north, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"gwV" = ( +/obj/structure/sign/city/skateshop/four/directional/north, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"gyy" = ( +/obj/structure/rack/food, +/obj/item/paint/anycolor{ + pixel_x = 8 + }, +/obj/item/paint/green, +/obj/item/paint/black{ + pixel_x = -6 + }, +/obj/item/paint/blue{ + pixel_y = 12 + }, +/turf/open/floor/iron/grimy, +/area/vtm/westfield_mall/interior/art_store) +"gKJ" = ( +/obj/structure/vampdoor/simple{ + dir = 4 + }, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"gPI" = ( +/obj/structure/closet/crate/bin{ + pixel_x = 8 + }, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"gPN" = ( +/obj/effect/landmark/start/darkpack/law_enforcement/sergeant, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/interior/police) +"gTj" = ( +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = 5 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = -6 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = -1 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = -10; + pixel_y = -13 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = -10; + pixel_y = -13 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = 5; + pixel_y = -13 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = -3; + pixel_y = -13 + }, +/turf/open/floor/iron/grimy, +/area/vtm/westfield_mall/interior/art_store) +"gWV" = ( +/obj/item/smartphone/payphone{ + pixel_y = 20 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/parking_lot) +"gXS" = ( +/obj/machinery/hydroponics/simple/wooden, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"haB" = ( +/obj/machinery/sprinkler, +/turf/open/floor/wood/old, +/area/vtm/westfield_mall/interior/chantry) +"hdo" = ( +/obj/effect/decal/wallpaper/padded, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/theatre) +"hjz" = ( +/obj/effect/decal/wallpaper/red/low, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "these_are_here_for_show_do_not_assign_me_a_button" + }, +/obj/structure/platform/lowwall/painted/window/reinforced, +/turf/open/floor/plating/rough, +/area/vtm/interior/bianchiBank) +"hkP" = ( +/obj/structure/chair/sofa/corp/corner, +/turf/open/floor/carpet/darkpack/blacksilver, +/area/vtm/westfield_mall/interior/skatepark) +"hmf" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/law_office) +"hnO" = ( +/obj/structure/filingcabinet{ + pixel_x = -7 + }, +/obj/structure/filingcabinet{ + pixel_x = 7 + }, +/turf/open/floor/iron/dark, +/area/vtm/westfield_mall/interior/art_store) +"hnS" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 8 + }, +/obj/structure/roadblock{ + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"hyM" = ( +/obj/machinery/icecream_vat, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"hzk" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 4 + }, +/obj/item/clothing/shoes/vampire/jackboots/work{ + pixel_x = -4; + pixel_y = 10 + }, +/obj/item/clothing/shoes/vampire/jackboots/work{ + pixel_x = 9; + pixel_y = 10 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"hBm" = ( +/obj/weapon_showcase, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"hFN" = ( +/obj/structure/easel, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/law_office) +"hIc" = ( +/obj/structure/table/wood, +/obj/item/shovel/spade{ + pixel_x = 14; + pixel_y = 5 + }, +/obj/item/cultivator{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping12" + }, +/obj/effect/spawner/random/engineering/toolbox{ + pixel_x = -7 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"hOS" = ( +/obj/effect/turf_decal/bordur{ + dir = 6 + }, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"hRX" = ( +/obj/structure/noticeboard/directional/north, +/obj/item/gun/ballistic/automatic/darkpack/ar15{ + pixel_y = 29 + }, +/obj/structure/table/reinforced, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"hSR" = ( +/obj/machinery/shower/directional/south, +/obj/structure/curtain, +/obj/structure/fluff/shower_drain, +/obj/effect/turf_decal/siding/white/end, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior) +"hSW" = ( +/obj/structure/chair/comfy/darkpack/dark{ + dir = 8 + }, +/obj/effect/landmark/start/darkpack/primogen/ventrue, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"hTf" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "these_are_here_for_show_do_not_assign_me_a_button" + }, +/obj/structure/vampdoor/woodglass, +/obj/effect/mapping_helpers/door/lock_difficulty/five, +/obj/effect/mapping_helpers/door/access/bank, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/carpet/darkpack/redsilver, +/area/vtm/interior/bianchiBank) +"hTH" = ( +/obj/structure/table, +/obj/item/restraints/handcuffs{ + pixel_x = -3 + }, +/obj/item/toner/large{ + pixel_y = 11 + }, +/turf/open/floor/iron/dark, +/area/vtm/westfield_mall/interior/art_store) +"hUx" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/item/phone{ + pixel_y = 7 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/theatre) +"hXh" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 1 + }, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"hXE" = ( +/obj/structure/table/modern, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"iaz" = ( +/obj/structure/sign/painting{ + pixel_y = 32; + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"ifk" = ( +/turf/open/floor/iron/grimy, +/area/vtm/westfield_mall/interior/art_store) +"ikv" = ( +/obj/effect/decal/wallpaper/papers/two, +/obj/effect/decal/wallpaper/light, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/games_store) +"ilt" = ( +/obj/structure/sign/poster/city/vesuvius{ + pixel_x = 4 + }, +/obj/effect/decal/wallpaper/grey, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/theatre) +"itd" = ( +/obj/structure/table, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior) +"iyu" = ( +/obj/transfer_point_vamp{ + id = "forestL1" + }, +/turf/open/misc/dirt, +/area/vtm/interior/caves) +"izc" = ( +/obj/structure/noticeboard/directional/north, +/obj/item/gun/ballistic/automatic/darkpack/huntrifle{ + pixel_y = 29 + }, +/obj/structure/table/reinforced, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"iAN" = ( +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"iHZ" = ( +/obj/structure/table, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"iKw" = ( +/obj/effect/landmark/start/darkpack/hecata/famiglia, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"iRP" = ( +/obj/structure/vampdoor/woodglass, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/carpet/darkpack, +/area/vtm/interior/littleitaly) +"iUQ" = ( +/obj/structure/noticeboard/directional/north, +/obj/item/claymore/machete{ + pixel_x = 9; + pixel_y = 29 + }, +/obj/structure/table/reinforced, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"iWj" = ( +/obj/effect/decal/pallet, +/turf/open/water/vamp_sewer, +/area/vtm/interior/sewer) +"jdP" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/obj/structure/vampdoor/reinf{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/police, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/art_store) +"jfA" = ( +/obj/structure/table/wood, +/obj/machinery/light/directional/south, +/obj/item/storage/fancy/donut_box{ + pixel_y = 9 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 11; + pixel_y = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"jjQ" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"jnN" = ( +/obj/structure/closet/crate/bin{ + pixel_x = 8 + }, +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"jtP" = ( +/obj/item/toy/crayon/spraycan{ + pixel_x = 7; + pixel_y = -6 + }, +/obj/item/toy/crayon/spraycan{ + pixel_x = 1; + pixel_y = -6 + }, +/obj/item/toy/crayon/spraycan{ + pixel_x = -6; + pixel_y = -6 + }, +/turf/open/floor/iron/grimy, +/area/vtm/westfield_mall/interior/art_store) +"jxp" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"jzn" = ( +/obj/structure/table/wood, +/obj/item/table_clock{ + pixel_x = -5; + pixel_y = 16 + }, +/obj/effect/spawner/random/bureaucracy/briefcase{ + pixel_x = 6; + pixel_y = -3 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"jCI" = ( +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"jFz" = ( +/obj/transfer_point_vamp{ + id = "garage4" + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"jFU" = ( +/obj/weapon_showcase, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior) +"jJP" = ( +/obj/structure/closet/crate/large{ + pixel_x = 1; + pixel_y = -2 + }, +/turf/open/floor/iron/dark, +/area/vtm/westfield_mall/interior/art_store) +"jQE" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron/stairs/black{ + dir = 4 + }, +/area/vtm/westfield_mall/interior/art_store) +"jQW" = ( +/obj/machinery/sprinkler, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"jVB" = ( +/obj/effect/decal/wallpaper/light, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/art_store) +"jWP" = ( +/obj/structure/sink/directional/south, +/obj/effect/decal/cleanable/trash, +/obj/structure/mirror/directional/north, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"kcy" = ( +/mob/living/carbon/human/npc/shop, +/obj/structure/chair/darkpack/blue, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/skatepark) +"kis" = ( +/obj/machinery/shower/directional/west, +/obj/structure/curtain, +/obj/effect/turf_decal/siding/white/inner_corner{ + dir = 8 + }, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"kmc" = ( +/obj/structure/sink/directional/south, +/obj/structure/mirror/directional/north, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"kno" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/item/flashlight/lamp{ + pixel_x = -9; + pixel_y = 11 + }, +/obj/effect/spawner/random/bureaucracy/folder{ + pixel_x = -9; + pixel_y = -2 + }, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"kpL" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/art_store) +"kpP" = ( +/obj/structure/table/countertop/bubway, +/obj/structure/desk_bell{ + pixel_x = -6; + pixel_y = 8 + }, +/turf/open/floor/carpet/darkpack/greengold, +/area/vtm/westfield_mall/interior/games_store) +"ktE" = ( +/obj/structure/table/wood, +/obj/item/ritual_tome/arcane, +/obj/item/ritual_tome/arcane, +/obj/item/ritual_tome/arcane, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/chantry) +"kzc" = ( +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior) +"kPZ" = ( +/obj/structure/table, +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"lav" = ( +/obj/structure/vampdoor{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/director, +/turf/open/floor/iron/grimy, +/area/vtm/westfield_mall/interior/art_store) +"lra" = ( +/obj/effect/turf_decal/bordur, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"lyX" = ( +/obj/structure/table/modern, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior) +"lzq" = ( +/obj/structure/vampdoor/glass, +/obj/effect/turf_decal/siding/wood/dark, +/obj/effect/mapping_helpers/door/access/police, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"lAO" = ( +/obj/effect/spawner/random/engineering/tank, +/obj/structure/coclock, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"lBO" = ( +/obj/machinery/photocopier/prebuilt, +/turf/open/floor/iron/dark, +/area/vtm/westfield_mall/interior/art_store) +"lBR" = ( +/obj/structure/easel, +/obj/item/canvas/nineteen_nineteen, +/turf/open/floor/iron/grimy, +/area/vtm/westfield_mall/interior/art_store) +"lCz" = ( +/obj/effect/decal/wallpaper/paper/green, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/maintenance/atrium) +"lDl" = ( +/obj/effect/decal/wallpaper/light, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/games_store) +"lDD" = ( +/obj/structure/vampdoor/woodglass, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/shop) +"lEt" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = 12; + pixel_y = 7 + }, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = -8; + pixel_y = 7 + }, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = 2; + pixel_y = 7 + }, +/obj/effect/spawner/random/entertainment/lighter{ + pixel_x = 8; + pixel_y = -4 + }, +/obj/effect/spawner/random/entertainment/lighter{ + pixel_x = -5; + pixel_y = -4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"lWC" = ( +/obj/structure/vampdoor/old{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/access/cleaning, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/janitor) +"lXz" = ( +/obj/effect/landmark/start/darkpack/hecata/squadra, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"mbi" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 8 + }, +/obj/structure/vampdoor/glass, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/interior) +"mcL" = ( +/obj/machinery/light/warm/directional/north, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"mfI" = ( +/obj/machinery/sprinkler, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"mjJ" = ( +/obj/item/kirbyplants/darkpack/random, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"mlg" = ( +/obj/structure/table, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"mpc" = ( +/obj/structure/vampdoor/woodglass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/banu, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/dojo) +"mqH" = ( +/obj/structure/table/wood, +/obj/vampire_computer, +/obj/item/phone_book{ + pixel_x = 8; + pixel_y = 9 + }, +/turf/open/floor/carpet/darkpack/blacksilver, +/area/vtm/westfield_mall/interior/theatre) +"mrg" = ( +/obj/structure/chair/wood/darkpack{ + dir = 4 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"mtZ" = ( +/obj/structure/rack/clothing_hanger, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/law_office) +"mws" = ( +/obj/structure/filingcabinet/white{ + pixel_x = -6 + }, +/obj/structure/filingcabinet/white{ + pixel_x = 8 + }, +/obj/effect/decal/wallpaper/papers/random{ + pixel_x = 1; + pixel_y = 26 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/art_store) +"mwU" = ( +/obj/structure/vampdoor/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/autoname, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/access/clerk, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"mys" = ( +/obj/structure/vampdoor/simple, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"mEC" = ( +/obj/structure/vampdoor/glass, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"mFb" = ( +/obj/machinery/door/poddoor/shutters{ + id = "keepershutters" + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"mFc" = ( +/obj/item/smartphone/payphone{ + pixel_y = 20 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"mGq" = ( +/obj/machinery/sprinkler, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/anarch) +"mGY" = ( +/obj/structure/railing{ + dir = 8 + }, +/mob/living/carbon/human/npc/shop, +/obj/structure/chair/office/darkpack/red{ + dir = 8 + }, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/carpet/darkpack/bluegold, +/area/vtm/westfield_mall/interior/theatre) +"mPi" = ( +/obj/structure/safe, +/obj/item/stack/dollar/hundred{ + pixel_y = -8; + pixel_x = 4 + }, +/turf/open/floor/carpet/green, +/area/vtm/westfield_mall/interior/law_office) +"nbK" = ( +/obj/structure/table, +/obj/machinery/light/cold/directional/west{ + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior) +"ncK" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/under/rank/civilian/lawyer/black, +/obj/item/clothing/under/rank/civilian/lawyer/black/skirt, +/obj/item/storage/belt/sheath/vamp/rapier, +/obj/item/reagent_containers/cup/glass/bottle/wine/blood, +/obj/item/vamp/keys/ventrue, +/obj/item/vamp/keys/ventrue, +/obj/item/vamp/keys/ventrue, +/turf/open/floor/carpet/green, +/area/vtm/westfield_mall/interior/law_office) +"ngU" = ( +/obj/structure/chair/plastic{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"nph" = ( +/obj/structure/table/wood, +/obj/machinery/coffeemaker{ + pixel_x = 5; + pixel_y = 7 + }, +/obj/item/storage/fancy/coffee_cart_rack{ + pixel_x = -11; + pixel_y = 1 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = -10; + pixel_y = 13 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/police) +"nqd" = ( +/obj/effect/spawner/random/entertainment/dice{ + pixel_x = 12 + }, +/obj/effect/spawner/random/entertainment/deck{ + pixel_x = 9; + pixel_y = 18 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"nAq" = ( +/obj/structure/noticeboard/directional/north, +/obj/item/gun/ballistic/shotgun/vampire{ + pixel_y = 29 + }, +/obj/structure/table/reinforced, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"nEn" = ( +/obj/effect/landmark/start/darkpack/voivode/zadruga, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"nEH" = ( +/obj/item/flashlight/lamp/green{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/structure/table/glass, +/obj/item/phone{ + pixel_x = 7 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"nFJ" = ( +/obj/effect/turf_decal/bordur, +/obj/structure/railing, +/obj/effect/landmark/start/darkpack/voivode/bogatyr, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"nHO" = ( +/obj/effect/mapping_helpers/door/access/ventrue, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/seven, +/obj/structure/vampdoor{ + dir = 4 + }, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/law_office) +"nML" = ( +/obj/structure/chair/sofa/corp{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/carpet/darkpack/blacksilver, +/area/vtm/westfield_mall/interior/skatepark) +"nRx" = ( +/obj/structure/vampdoor/simple, +/obj/effect/mapping_helpers/door/access/cleaning, +/obj/effect/mapping_helpers/door/lock, +/obj/effect/mapping_helpers/door/lock_difficulty/two, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"nRM" = ( +/obj/effect/turf_decal/asphaltline/alt{ + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior) +"nUH" = ( +/obj/structure/table, +/obj/machinery/chem_heater/withbuffer, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"nZe" = ( +/obj/structure/platform/lowwall/market/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/candy_store) +"ofr" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "these_are_here_for_show_do_not_assign_me_a_button" + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"ofB" = ( +/obj/effect/decal/wallpaper/light, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/law_office) +"okz" = ( +/obj/structure/sign/city/skateshop/three/directional/north, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"okM" = ( +/obj/effect/decal/rugs, +/obj/structure/detectiveboard/directional/north, +/turf/open/floor/iron/dark, +/area/vtm/westfield_mall/interior/art_store) +"olG" = ( +/obj/transfer_point_vamp{ + id = "forestR1" + }, +/turf/open/misc/dirt, +/area/vtm/interior/caves) +"ooV" = ( +/obj/transfer_point_vamp{ + id = "forestL2" + }, +/turf/open/misc/dirt, +/area/vtm/interior/caves) +"oqv" = ( +/obj/structure/coclock, +/obj/machinery/light_switch/directional/north{ + pixel_x = -12 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/art_store) +"oqU" = ( +/obj/machinery/coffeemaker/impressa{ + pixel_y = 8; + pixel_x = -2 + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 13 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 13; + pixel_y = 10 + }, +/obj/item/storage/box/coffeepack{ + pixel_x = 13; + pixel_y = 17 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"osE" = ( +/obj/structure/vampdoor/woodglass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/autoname, +/obj/effect/mapping_helpers/door/access/npc, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"otF" = ( +/obj/structure/vampdoor/woodglass, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/plating/granite/black, +/area/vtm/interior/shop) +"oux" = ( +/obj/structure/vampdoor/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/hot_ishu) +"oGX" = ( +/obj/effect/spawner/random/trash/box, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"oQx" = ( +/obj/structure/table/countertop/beige, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/vampire_computer/box{ + dir = 4 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/art_store) +"oUI" = ( +/obj/structure/chair/office/darkpack/red{ + dir = 1 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"oWC" = ( +/obj/structure/fluff/tv{ + pixel_y = 14; + pixel_x = 16 + }, +/obj/structure/table/reinforced, +/obj/structure/sign/poster/ripped/directional/north, +/obj/item/kirbyplants/darkpack/random{ + pixel_x = -3; + pixel_y = 8 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"paE" = ( +/obj/structure/table/wood, +/obj/item/cultivator/rake{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/extinguisher{ + pixel_x = -6; + pixel_y = 18 + }, +/obj/item/flashlight{ + pixel_x = 8 + }, +/obj/item/vamp/keys/cleaning{ + pixel_x = -10 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"pcJ" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/parking_lot) +"pmd" = ( +/obj/structure/table/countertop/beige, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/obj/item/paper_bin, +/obj/structure/fluff/paper/stack{ + pixel_x = -4 + }, +/turf/open/floor/iron/grimy, +/area/vtm/westfield_mall/interior/art_store) +"pnj" = ( +/obj/machinery/light/small/dim/directional/north, +/obj/structure/closet/cabinet, +/obj/item/gun/ballistic/automatic/pistol/darkpack/beretta/toreador, +/obj/item/clothing/under/dress/tango, +/obj/item/clothing/under/suit/tuxedo, +/obj/item/ammo_box/magazine/semi9mm/toreador, +/obj/item/ammo_box/magazine/semi9mm/toreador, +/obj/item/bouquet/rose, +/obj/item/vamp/keys/toreador, +/obj/item/vamp/keys/toreador, +/obj/item/vamp/keys/toreador, +/turf/open/floor/carpet/darkpack/blacksilver, +/area/vtm/westfield_mall/interior/theatre) +"pxk" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/obj/structure/vampdoor/glass, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/interior) +"pxB" = ( +/obj/effect/landmark/start/darkpack/hospital/doctor, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"pAp" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/parking_lot) +"pAs" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"pHD" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 1 + }, +/obj/structure/vampdoor/glass, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/plating/sidewalk/old, +/area/vtm/westfield_mall/interior) +"pPg" = ( +/obj/structure/table/modern, +/turf/open/floor/carpet/darkpack/blacksilver, +/area/vtm/westfield_mall/interior/skatepark) +"pPB" = ( +/obj/machinery/sprinkler, +/turf/open/floor/wood/herring, +/area/vtm/interior/littleitaly) +"qae" = ( +/obj/effect/decal/wallpaper/light, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/theatre) +"qbw" = ( +/obj/effect/decal/wallpaper/papers/one, +/obj/effect/decal/wallpaper/light, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/games_store) +"qbP" = ( +/obj/structure/chair/sofa/corner/maroon{ + dir = 4 + }, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/law_office) +"qgO" = ( +/obj/effect/decal/cleanable/trash, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"qhs" = ( +/obj/structure/chair/office, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/skatepark) +"qtc" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/art_store) +"qNv" = ( +/obj/effect/turf_decal/siding/wood/dark{ + dir = 8 + }, +/obj/structure/curtain/bounty{ + pixel_y = 16 + }, +/turf/open/floor/iron/stairs{ + dir = 8 + }, +/area/vtm/westfield_mall/interior/law_office) +"qNS" = ( +/obj/structure/vampdoor/simple, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior) +"qOC" = ( +/obj/transfer_point_vamp{ + id = "garage1" + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"qUY" = ( +/obj/transfer_point_vamp{ + id = "garage3" + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"qVZ" = ( +/obj/structure/vampdoor/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/arcade) +"rfA" = ( +/obj/effect/decal/carpet{ + pixel_x = 10; + pixel_y = -3 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"rne" = ( +/obj/effect/decal/rugs, +/obj/effect/decal/rugs, +/turf/open/floor/iron/dark, +/area/vtm/westfield_mall/interior/art_store) +"rus" = ( +/obj/machinery/sprinkler, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"rvt" = ( +/obj/structure/chair/plastic/darkpack{ + dir = 4 + }, +/obj/effect/landmark/start/darkpack/citizen/janitor, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"rvI" = ( +/obj/structure/vampdoor/glass, +/obj/effect/turf_decal/bordur, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/skatepark) +"rAl" = ( +/obj/machinery/light/dim/directional/east, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"rDj" = ( +/obj/item/kirbyplants/darkpack/random, +/obj/effect/landmark/start/darkpack/hecata/squadra, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/bianchiBank) +"rGI" = ( +/obj/structure/chair/office/darkpack/blue{ + dir = 8 + }, +/obj/effect/landmark/start/darkpack/law_enforcement/fbi, +/turf/open/floor/iron/dark, +/area/vtm/westfield_mall/interior/art_store) +"rHM" = ( +/obj/effect/decal/pallet, +/obj/item/kirbyplants/darkpack/random, +/turf/open/water/vamp_sewer, +/area/vtm/interior/sewer) +"rIb" = ( +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"rMN" = ( +/obj/effect/turf_decal/bordur{ + dir = 9 + }, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"rSN" = ( +/obj/effect/turf_decal/bordur{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"rZM" = ( +/obj/structure/chair/sofa/left/maroon{ + dir = 8 + }, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/law_office) +"seO" = ( +/obj/machinery/sprinkler, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/techshop) +"sjB" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"soC" = ( +/obj/structure/chair/plastic/darkpack{ + dir = 1 + }, +/obj/effect/landmark/start/darkpack/citizen/janitor, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"spN" = ( +/obj/item/gavelblock, +/obj/item/gavelhammer, +/obj/structure/table/glass, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"sqE" = ( +/obj/structure/toilet{ + pixel_y = 16 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/city/toilet, +/area/vtm/westfield_mall/interior/bathroom) +"stb" = ( +/obj/effect/landmark/start/darkpack/voivode/bogatyr, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"stw" = ( +/obj/effect/decal/rugs, +/obj/effect/decal/rugs, +/obj/structure/closet, +/obj/item/clothing/suit/vampire/jacket/fbi, +/obj/item/storage/belt/holster/detective/darkpack/fbi, +/obj/item/clothing/glasses/vampire/sun, +/obj/item/clothing/under/rank/civilian/lawyer/bluesuit, +/obj/item/clothing/under/rank/civilian/lawyer/bluesuit/skirt, +/obj/item/clothing/under/suit/waiter, +/obj/item/clothing/shoes/vampire/jackboots/work{ + pixel_x = 9; + pixel_y = 10 + }, +/obj/item/clothing/head/beret, +/turf/open/floor/iron/dark, +/area/vtm/westfield_mall/interior/art_store) +"sQh" = ( +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"sWK" = ( +/obj/structure/sign/city/skateshop/two/directional/north, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/westfield_mall/skatepark) +"taO" = ( +/obj/machinery/button{ + id = "keepershutters" + }, +/obj/effect/decal/wallpaper/grey, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"tef" = ( +/obj/machinery/sprinkler, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/anarch) +"tey" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"tiu" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp{ + pixel_x = -9; + pixel_y = 11 + }, +/obj/item/paper_bin{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/structure/fluff/paper/stack, +/obj/effect/decal/cleanable/litter, +/turf/open/floor/city/factory, +/area/vtm/westfield_mall/interior/theatre) +"tna" = ( +/obj/structure/noticeboard/directional/north, +/obj/item/gun/ballistic/automatic/darkpack/ak74{ + pixel_y = 29 + }, +/obj/structure/table/reinforced, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"toJ" = ( +/obj/structure/chair/sofa/right/maroon{ + dir = 4 + }, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/law_office) +"toY" = ( +/obj/transfer_point_vamp, +/obj/transfer_point_vamp{ + id = "garage3" + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/parking_lot) +"tpN" = ( +/obj/effect/turf_decal/siding/white/corner{ + dir = 8 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"tzb" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 4 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"tAm" = ( +/obj/effect/decal/cleanable/blood/oil, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"tBz" = ( +/obj/structure/lattice/grate, +/obj/effect/decal/pallet, +/turf/open/water/vamp_sewer/border, +/area/vtm/interior/sewer) +"tFK" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 8 + }, +/turf/open/floor/carpet/darkpack/blacksilver, +/area/vtm/westfield_mall/interior/skatepark) +"tJK" = ( +/obj/effect/landmark/start/darkpack/pentex/employee, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"tJW" = ( +/obj/machinery/light/directional/south, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior) +"tMt" = ( +/obj/fake_platform/stone/double, +/turf/open/misc/dirt, +/area/vtm/westfield_mall) +"tPa" = ( +/obj/structure/chair/wood/darkpack/red{ + dir = 8 + }, +/obj/structure/sign/poster/contraband/donut_corp/directional/north, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"tRn" = ( +/obj/structure/closet/crate/bin, +/obj/item/stack/dollar/five, +/obj/item/paper/crumpled, +/obj/item/paper/crumpled, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"tRQ" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/watering_can/metal{ + pixel_y = 7; + pixel_x = 8 + }, +/obj/item/wrench{ + pixel_x = -5; + pixel_y = 2 + }, +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping2" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"tSb" = ( +/obj/structure/table, +/obj/vampire_computer/box{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/vtm/westfield_mall/interior/art_store) +"tTU" = ( +/obj/structure/chair/darkpack/blue{ + dir = 1 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/skatepark) +"tUy" = ( +/obj/structure/vampdoor/woodglass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/lock_difficulty/eight, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"tUH" = ( +/obj/structure/chair/sofa/middle/maroon, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/law_office) +"uas" = ( +/obj/effect/spawner/random/structure/table_fancy, +/obj/effect/turf_decal/siding/wood/dark{ + dir = 1 + }, +/obj/item/toy/plush/shark, +/turf/open/floor/carpet/darkpack, +/area/vtm/westfield_mall/interior/games_store) +"udy" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + pixel_x = 5; + pixel_y = 15 + }, +/obj/item/reagent_containers/cup/soda_cans/beer{ + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + pixel_x = -8; + pixel_y = 15 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"ued" = ( +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/law_office) +"ueY" = ( +/obj/structure/vampdoor/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"uhk" = ( +/obj/structure/toilet{ + dir = 4; + pixel_y = 17 + }, +/obj/machinery/light/small/directional/west, +/obj/effect/decal/cleanable/cardboard, +/turf/open/floor/city/toilet, +/area/vtm/interior/sewer) +"ukE" = ( +/obj/effect/decal/wallpaper/red, +/obj/effect/decal/wallpaper/paper/darkred, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/theatre) +"urj" = ( +/obj/machinery/light/prince/directional/south, +/turf/open/floor/wood/smooth/old, +/area/vtm/interior/church) +"uuB" = ( +/turf/closed/wall/vampwall/rock, +/area/vtm/interior/caves) +"uwo" = ( +/obj/effect/turf_decal/bordur, +/obj/structure/vampdoor/wood/apartment, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"uwH" = ( +/obj/effect/decal/wallpaper/red, +/obj/effect/decal/wallpaper/paper/darkred, +/obj/effect/decal/wallpaper/light, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/law_office) +"uBf" = ( +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/dark, +/area/vtm/westfield_mall/interior/art_store) +"uCH" = ( +/obj/structure/vampdoor/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/old_clan_tzimisce, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"uGu" = ( +/obj/structure/table/countertop/beige, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/desk_bell{ + pixel_x = -7; + pixel_y = 6 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/art_store) +"uGN" = ( +/obj/structure/easel, +/obj/item/canvas/twentyfour_twentyfour, +/turf/open/floor/iron/grimy, +/area/vtm/westfield_mall/interior/art_store) +"uGY" = ( +/obj/structure/curtain/bounty{ + pixel_y = 16 + }, +/obj/structure/platform/lowwall/market/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/art_store) +"uHj" = ( +/obj/effect/landmark/start/darkpack/citizen/janitor, +/turf/open/floor/carpet/darkpack/old, +/area/vtm/westfield_mall/interior/janitor) +"uLP" = ( +/obj/machinery/sprinkler, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior) +"uMr" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/effect/turf_decal/bordur{ + dir = 1 + }, +/turf/open/floor/plating/sidewalk/poor, +/area/vtm/interior/sewer) +"uPd" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/carpet/darkpack/blacksilver, +/area/vtm/westfield_mall/interior/skatepark) +"uQN" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/skatepark) +"uTV" = ( +/obj/structure/sign/painting{ + pixel_y = 32; + dir = 1 + }, +/turf/open/floor/carpet/green, +/area/vtm/westfield_mall/interior/law_office) +"uVj" = ( +/obj/effect/decal/wallpaper/paper/green, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/candy_store) +"uZK" = ( +/obj/transfer_point_vamp{ + id = "garage2" + }, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/underground_parking) +"veF" = ( +/obj/effect/decal/carpet{ + pixel_y = -5 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior) +"vix" = ( +/obj/effect/turf_decal/bordur{ + dir = 4 + }, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"viX" = ( +/obj/item/food/candy_corn{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/food/candyheart{ + pixel_y = 15; + pixel_x = -4 + }, +/obj/item/food/candyheart{ + pixel_y = 15; + pixel_x = 4 + }, +/obj/item/food/lollipop{ + pixel_y = -6; + pixel_x = 25 + }, +/obj/item/food/lollipop{ + pixel_y = -6; + pixel_x = 17 + }, +/obj/item/food/lollipop{ + pixel_y = -6; + pixel_x = 9 + }, +/obj/item/food/lollipop{ + pixel_y = -6; + pixel_x = 17 + }, +/obj/item/food/lollipop{ + pixel_y = -6; + pixel_x = -2 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"vjV" = ( +/obj/structure/closet/crate/cardboard, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/maintenance/basement) +"vsC" = ( +/obj/machinery/light/directional/west, +/obj/item/kirbyplants/random, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"vsO" = ( +/obj/structure/lattice/grate, +/turf/open/water/vamp_sewer, +/area/vtm/interior/sewer) +"vxJ" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/flashlight/lamp{ + pixel_x = 8; + pixel_y = 11 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = -16; + pixel_y = 9 + }, +/obj/effect/spawner/random/bureaucracy/folder{ + pixel_x = 9; + pixel_y = -2 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"vzM" = ( +/obj/structure/table, +/obj/item/smartphone/emergency{ + pixel_y = 8; + pixel_x = -4 + }, +/obj/item/phone_book{ + pixel_x = 8; + pixel_y = 9 + }, +/turf/open/floor/iron/dark, +/area/vtm/westfield_mall/interior/art_store) +"vAL" = ( +/turf/open/floor/plating/rough/cave, +/area/vtm/westfield_mall) +"vHC" = ( +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"vPZ" = ( +/obj/structure/table/wood, +/obj/vampire_computer{ + pixel_y = 4 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = -16; + pixel_y = 9 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"vSo" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"wbJ" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"wdK" = ( +/obj/machinery/sprinkler, +/turf/open/floor/wood/smooth, +/area/vtm/interior/shop) +"wfK" = ( +/obj/item/target, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior) +"whm" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 6 + }, +/obj/effect/decal/cleanable/rubble, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"whz" = ( +/obj/structure/chair/sofa/middle/maroon, +/obj/effect/decal/wallpaper/paper/darkred, +/obj/machinery/light/prince/directional/north, +/turf/open/floor/wood/herring, +/area/vtm/westfield_mall/interior/law_office) +"wlm" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/structure/filingcabinet/chestdrawer{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/kirbyplants/darkpack/random{ + pixel_x = 11; + pixel_y = 17 + }, +/obj/item/ammo_casing/rebar/paperball{ + pixel_x = -19; + pixel_y = -13 + }, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"wnk" = ( +/obj/vehicle/ridden/golfcart/loaded{ + pixel_x = 17; + pixel_y = -9 + }, +/obj/effect/decal/cleanable/blood/oil, +/turf/open/floor/plating/asphalt, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"wqy" = ( +/obj/item/storage/fancy/cigarettes/cigpack_candy{ + pixel_x = -13; + pixel_y = 21 + }, +/obj/item/storage/fancy/cigarettes/cigpack_candy{ + pixel_x = -4; + pixel_y = 21 + }, +/obj/item/storage/fancy/cigarettes/cigpack_candy{ + pixel_x = 6; + pixel_y = 21 + }, +/obj/item/food/fudgedice{ + pixel_y = 7; + pixel_x = -16 + }, +/obj/item/food/fudgedice{ + pixel_y = 7; + pixel_x = -2 + }, +/obj/item/food/fudgedice{ + pixel_y = 7; + pixel_x = 13 + }, +/obj/item/food/chocolatebar{ + pixel_x = -14; + pixel_y = -7 + }, +/obj/item/food/chocolatebar{ + pixel_x = 14; + pixel_y = -7 + }, +/obj/item/food/chocolatebar{ + pixel_x = 7; + pixel_y = -7 + }, +/obj/item/food/chocolatebar{ + pixel_y = -7 + }, +/obj/item/food/chocolatebar{ + pixel_x = -7; + pixel_y = -7 + }, +/obj/item/food/chocolatebar{ + pixel_x = -22; + pixel_y = -7 + }, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/candy_store) +"wsj" = ( +/obj/machinery/light/warm/directional/south, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"wwh" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"wCv" = ( +/obj/structure/vampdoor/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/bar, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior/anarch) +"wEs" = ( +/obj/structure/chair/sofa/corp, +/turf/open/floor/carpet/darkpack/blacksilver, +/area/vtm/westfield_mall/interior/skatepark) +"wFu" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/city/plating, +/area/vtm/interior/shop) +"wGE" = ( +/obj/machinery/sprinkler, +/turf/open/floor/wood/ornate, +/area/vtm/westfield_mall/interior/camarilla) +"wHz" = ( +/obj/structure/table/wood, +/obj/item/shovel/vamp, +/obj/item/shovel/vamp{ + pixel_y = 9 + }, +/obj/structure/vampipe{ + pixel_y = 32; + icon_state = "piping25" + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"wJt" = ( +/obj/structure/vampdoor/glass{ + dir = 8 + }, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"wKQ" = ( +/obj/structure/vampdoor/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/salubri, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/vet_clinic) +"wKZ" = ( +/obj/structure/sign/poster/city/redlady{ + pixel_x = -13 + }, +/obj/effect/decal/wallpaper/grey, +/turf/closed/wall/vampwall/painted, +/area/vtm/westfield_mall/interior/theatre) +"wMx" = ( +/obj/structure/curtain/cloth/fancy/mechanical/luxurious{ + pixel_y = 16 + }, +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/law_office) +"wNa" = ( +/obj/structure/vampdoor/old{ + dir = 8 + }, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/games_store) +"wWP" = ( +/obj/structure/table, +/obj/effect/decal/pallet, +/obj/machinery/radio_tranceiver/anarch{ + pixel_x = -4; + pixel_y = 13 + }, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/anarch) +"xjy" = ( +/obj/effect/landmark/start/darkpack/hospital/clinic_director, +/turf/open/floor/wood/smooth, +/area/vtm/interior/clinic) +"xmh" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron/grimy, +/area/vtm/westfield_mall/interior/art_store) +"xpz" = ( +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) +"xrs" = ( +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/art_store) +"xrY" = ( +/obj/structure/vampdoor/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/door/access/npc, +/obj/effect/mapping_helpers/door/autoname, +/turf/open/floor/city/plating, +/area/vtm/westfield_mall/interior/smokeshop) +"xzM" = ( +/obj/machinery/sprinkler, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/camarilla) +"xBq" = ( +/obj/machinery/light/directional/east, +/obj/weapon_showcase, +/turf/open/floor/city/plating_mono, +/area/vtm/westfield_mall/interior) +"xBD" = ( +/obj/effect/turf_decal/bordur/corner, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"xEn" = ( +/obj/effect/turf_decal/bordur/corner{ + dir = 8 + }, +/turf/open/floor/plating/roofwalk, +/area/vtm/westfield_mall) +"xIe" = ( +/obj/structure/platform/lowwall/painted/window, +/turf/open/floor/plating/rough, +/area/vtm/westfield_mall/interior/arcade) +"xQL" = ( +/obj/effect/spawner/random/entertainment/deck{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/structure/table/modern, +/turf/open/floor/carpet/green, +/area/vtm/westfield_mall/interior/law_office) +"xRE" = ( +/obj/structure/sign/painting{ + pixel_y = 32; + dir = 1 + }, +/turf/open/floor/iron/grimy, +/area/vtm/westfield_mall/interior/art_store) +"yfx" = ( +/obj/structure/table/countertop/beige, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/smooth, +/area/vtm/westfield_mall/interior/art_store) +"yfF" = ( +/obj/effect/spawner/random/entertainment/plushie{ + pixel_x = 3; + pixel_y = -12 + }, +/obj/effect/spawner/random/entertainment/plushie{ + pixel_x = 3; + pixel_y = -12 + }, +/turf/open/floor/wood/smooth/old, +/area/vtm/westfield_mall/interior/games_store) +"yiH" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/carpet/darkpack/purplegold, +/area/vtm/westfield_mall/interior/law_office) +"ykT" = ( +/obj/effect/turf_decal/bordur/inverse{ + dir = 4 + }, +/turf/open/floor/plating/concrete, +/area/vtm/westfield_mall/interior/groundskeeper_garage) + +(1,1,1) = {" +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +"} +(2,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aNv +aNv +aNv +aNv +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +adY +adY +adY +azz +aeW +aeW +aeW +aeW +aeW +azz +adY +adY +adY +adY +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(3,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aNv +cHl +tzb +asE +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aiN +aVx +apP +azz +aeW +aeW +aeW +aeW +aeW +azz +apf +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(4,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +azz +azz +azz +azz +aNv +oWC +rfA +cuV +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aiN +aco +asT +azz +aeW +aeW +aeW +aeW +aeW +azz +apf +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(5,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +asT +asT +asT +aNv +aQZ +axa +brv +aSs +ada +aNn +axa +aNv +anN +aAq +aHX +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aKk +aco +asT +azz +aeW +aeW +aeW +aeW +aeW +azz +aBj +aXP +asx +agy +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(6,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aco +aco +aNv +aBP +axa +axa +axa +axa +axa +axa +aAH +aGH +aGH +aUJ +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aiN +aco +asT +azz +aeW +aeW +aeW +aeW +aeW +azz +apf +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(7,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +aNv +axa +giN +aMg +aMg +aMg +aMg +aFN +aNv +aNv +aNv +aNv +aNv +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aYH +aco +asT +azz +azz +azz +azz +azz +azz +azz +aBb +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(8,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +aNv +axa +gPI +aGH +aEA +ajZ +asX +apY +aNv +apx +aNn +axa +axa +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aiN +aco +asT +azz +aco +aco +aco +aco +aco +azz +asT +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(9,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +aNv +rSN +aNv +aGH +aGH +aGH +aGH +apY +aaR +axa +axa +axa +axa +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aKk +aco +asT +azO +asT +asT +asT +asT +asT +azO +asT +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(10,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aFj +vsO +esn +axa +aNv +dwM +aNR +aog +aNA +ayf +aNv +alq +axa +aHK +aZS +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aiN +aco +asT +azz +azz +azz +azz +azz +azz +azz +asT +aco +aPP +adV +azz +azz +azz +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(11,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +rHM +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +azz +azz +azz +azz +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +adV +adV +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(12,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +aNv +jWP +uhk +aNv +alT +ayk +aoP +aNG +aaE +aep +aiI +aiI +anL +aNv +aTd +avG +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +azz +azz +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(13,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +aNv +kis +aGH +aNv +aiu +aGH +apY +axa +axa +aep +aiI +axa +axa +ahQ +aTc +aIH +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(14,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +aNv +aNv +gKJ +aNv +aqE +aGH +apY +axa +aUZ +aep +axD +axa +axa +ahQ +aCG +aXs +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +azz +azz +azz +asT +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aFc +"} +(15,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +eNH +aNv +qgO +tpN +aEt +amR +agr +axa +axa +aaR +axa +axa +axa +ahQ +aTc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aPP +adV +adV +adV +aDk +adV +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aFc +"} +(16,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aFj +vsO +eNH +dQG +axa +axa +axa +axa +aLX +aUg +aNn +aep +axa +aUT +aZS +aNv +aTd +adV +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +azz +azz +azz +aWx +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(17,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +jnN +aNv +dJS +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +apf +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(18,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +eNH +aNv +aNv +aNv +aIr +alM +ail +apY +aST +aep +alq +aaT +aZS +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +apf +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(19,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +iWj +eNH +cHl +aNv +mjJ +amq +aSD +aSD +apY +axa +aaR +axa +axa +axa +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asV +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(20,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +tBz +vsO +eNH +axa +uwo +tpN +amR +amR +amR +agr +axa +aep +aBP +axa +aNv +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asV +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(21,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +eNH +ngU +aNv +axa +axa +aSi +ajr +aal +aZJ +aep +axa +axa +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +apf +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(22,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +kPZ +mlg +aNv +aNv +ant +aNv +ake +aSi +aQZ +aep +anL +aiI +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aJa +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +azz +azz +azz +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(23,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +uMr +cER +aNv +jWP +aPS +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aGF +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aBb +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +asT +aco +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(24,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +aNv +aNv +aNv +kis +aQC +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +asT +aco +aPP +adV +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +arn +ahc +aco +azz +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(25,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +aNv +aeW +aNv +aNv +aNv +aNv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +aco +aPP +adV +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +aco +azz +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(26,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +asT +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aRF +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aRF +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aNf +aDk +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +azz +azz +azz +azz +azz +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(27,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +aDk +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +aDk +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +aVv +aVv +aVv +aLD +aLD +aLD +aLD +aFc +"} +(28,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +aDk +adV +adV +adV +adV +adV +adV +adV +adV +awN +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +awN +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +aDk +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +aVv +aVv +aVv +aVv +aVv +aLD +aLD +aLD +aLD +aFc +"} +(29,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +aco +aDh +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +aco +asT +aco +aPP +adV +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +aXt +aXt +aXt +aXt +aXt +aXt +ass +ass +ass +ass +ass +ass +ass +ass +ass +ass +ass +ass +ass +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +aco +aPP +adV +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(30,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +asT +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +afy +ajQ +aSh +aok +arC +aXt +aTj +aTj +aLV +akX +akX +abF +asB +abi +aki +aki +akX +aeK +aTj +aTj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +abj +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +azn +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(31,1,1) = {" +aFc +aeW +aeW +aeW +aeW +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +asT +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +amx +aGF +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +amx +aeW +aeW +aeW +aeW +aeW +aeW +aeW +afy +aZH +agI +afG +aHU +aXt +aTj +aki +akX +akX +aki +aki +akX +akX +akX +aki +aki +akX +akX +aTj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(32,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +amx +aGF +amx +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +amx +aGF +aeW +aeW +aeW +aeW +aeW +aeW +afy +aNO +afN +afG +arC +aXt +aId +akX +akX +aLK +akX +aTj +auw +auw +auw +auw +aTj +aki +akX +aTj +aTj +aeW +aeW +aeW +aeW +aeW +azz +azz +azz +azz +azz +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(33,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aYg +aGF +aGF +avf +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +avf +amx +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aXt +aXt +aXt +afy +aQk +aXt +aWi +aZs +aXt +aTj +aTj +aTj +ahi +amk +arN +auw +aTj +aLV +akX +akX +aTj +aeW +aeW +aeW +aeW +azz +azz +acb +aeA +axQ +azE +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(34,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +amx +aGF +amx +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +amx +avf +aeW +aeW +aeW +aeW +aeW +adR +aqu +aNd +aCi +aaz +asc +asc +asc +aXt +aTj +aTj +aTj +ajl +arw +aIi +auw +aTj +aTj +akX +akX +aTj +aeW +aeW +aeW +aeW +azz +aeA +axQ +axQ +axQ +azE +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(35,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +avf +aGF +aGF +aGF +amx +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +afy +aJp +asR +aDr +asc +aaz +asc +acn +aXt +aTj +auw +auw +auw +ahi +aAt +auw +auw +auw +aki +akX +aTj +aeW +aeW +aeW +aeW +azz +axQ +axQ +aHr +axQ +alS +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(36,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +amx +amx +amx +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +afy +aOX +aaz +aaz +aaz +aaz +aaz +aDr +aXt +aTj +aoi +aDH +ahI +aaz +aaz +aKX +arC +auw +aHg +akX +aTj +aeW +aeW +aeW +aeW +azz +acb +axQ +axQ +axQ +alS +aco +aPP +adV +azz +aeW +azE +aeW +azz +azz +azz +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(37,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +azz +azz +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +amx +amx +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +axw +amB +ayb +aeN +ayb +aaz +aaz +aNC +aXt +aTj +aoi +aEu +aPf +aaz +aIi +ahs +arC +awR +aki +akX +aTj +aeW +aeW +aeW +aeW +azz +aeA +axQ +axQ +axQ +azE +aco +aPP +adV +azz +aeW +azE +aGF +ajf +aGF +azz +aGF +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(38,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +aBJ +aco +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +amx +amx +amx +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aGF +aGF +aGF +afy +aDW +aBn +agE +aBn +asc +asc +aYz +aXt +aTj +aoi +adp +aHh +aIW +aIi +auw +auw +auw +aki +akX +aTj +aeW +aeW +aeW +aeW +azz +azz +aov +akh +axQ +azE +aco +aPP +adV +azz +aeW +azE +aGF +aGF +aGF +aPC +aGF +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(39,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +aBJ +aco +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +azz +aeW +aeW +amx +aGF +aeW +aeW +aGF +amx +amx +aXt +aWi +aWi +aXt +aXt +aXt +aXt +aXt +aXt +aTj +auw +aTr +aUB +aaz +aaz +auw +awt +aWe +akX +akX +aTj +aeW +aeW +aeW +aeW +aeW +azz +azz +azz +azz +azz +aco +aPP +adV +azz +aeW +aeW +aGF +azU +azz +azz +aGF +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(40,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +auJ +aco +abd +aPP +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +azz +aeW +aeW +amx +aGF +aeW +amx +aGF +aGF +amx +amx +amx +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aIf +aEZ +arF +aaz +aWQ +aYU +amC +aXU +akX +aTj +aTj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aco +aPP +adV +azz +azz +azz +azF +aKW +azz +aGF +aDt +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(41,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +atQ +aco +aco +abd +aPP +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +azz +aeW +aeW +amx +aeW +aeW +amx +amx +aGF +aGF +aGF +avf +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +auc +aqK +arF +aaz +aFH +auw +aPW +aXv +akX +aTj +aeW +aqM +aGF +amx +aVF +amx +aGF +aeW +aeW +aeW +azz +aco +aPP +adV +aBR +aGF +aGF +aGF +aGF +aGF +aGF +aGF +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(42,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +aco +aco +abd +aPP +adV +adV +azz +aPP +adV +adV +azz +aPP +adV +adV +azz +aPP +adV +adV +azz +aPP +adV +adV +azz +aPP +adV +adV +azz +aeW +aeW +amx +aGF +aeW +aeW +amx +amx +amx +amx +aGF +aGF +aeW +aGF +aGF +aGF +aeW +aeW +aeW +auw +auw +auw +auw +auw +auw +auo +akX +aLV +aTj +aqM +aGF +aGF +aGF +amx +aGF +amx +aGF +aeW +aeW +azz +aco +aPP +adV +azz +aVl +aGF +aGF +aGF +aGF +aGF +aGF +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(43,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +aco +aco +abd +aPP +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +azz +aeW +aeW +aGF +aGF +aeW +aeW +amx +amx +amx +amx +amx +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aTj +aki +akX +aTj +aTj +aGF +amx +amx +amx +aGF +aGF +aGF +amx +amx +aeW +azz +aco +aPP +adV +azz +azz +azz +avT +azF +azz +aGF +aGF +aVv +auK +aVv +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(44,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +aco +aco +abd +aPP +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +azz +aeW +aeW +aeW +amx +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aTj +aki +akX +aTj +aqo +aqo +aEU +aqo +aqo +aeW +amx +amx +amx +amx +aeW +azz +aco +aPP +adV +azz +abd +aGF +aGF +azU +azz +azz +aGF +aVv +auK +aVv +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(45,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +asT +aco +aPP +adV +azz +aco +aco +abd +aPP +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +azz +aeW +aeW +aeW +amx +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +amx +amx +aGF +aeW +aeW +aeW +aqo +aTj +akX +akX +aTj +aqo +aGO +aco +aTF +aqo +aeW +aeW +amx +aGF +amx +aeW +azz +aco +aPP +adV +azz +abd +aGF +aGF +aGF +aGF +azz +aGF +aVv +auK +aVv +aGF +ajV +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(46,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +azz +azz +azz +azz +azz +aco +aco +abd +aPP +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +azz +aeW +aeW +aeW +amx +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +amx +aGF +avf +aeW +aeW +aqo +aTj +akX +akX +akX +aqo +aEo +aco +aco +aqo +aeW +aeW +aGF +amx +amx +abq +aco +aco +aPP +adV +azz +aeW +azE +acZ +aGF +aGF +azz +aGF +aVv +auK +aVv +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(47,1,1) = {" +aFc +aeW +aOe +aMu +aMu +aMu +aOe +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aco +aco +abd +aPP +adV +adV +azz +aPP +adV +adV +azz +aPP +adV +adV +azz +aPP +adV +adV +azz +aPP +adV +adV +azz +aPP +adV +adV +azz +aeW +aeW +aeW +aGF +amx +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aGF +aNa +akX +aki +aki +akX +aIA +aFb +aco +aco +aqo +aeW +aeW +aeW +aGF +amx +abq +aco +aco +aPP +adV +azz +aeW +aeW +azE +azE +aGF +aPC +aGF +aVv +auK +aVv +aGF +arL +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(48,1,1) = {" +aFc +aOe +aOe +aMu +aMu +aMu +aOe +aOe +aOe +aOe +aOe +aOe +aOe +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aco +aco +abd +aPP +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +azz +aeW +aeW +aeW +aGF +amx +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aqo +aTj +aTj +aki +akX +aqo +aQz +aco +apy +aqo +aeW +aeW +aeW +aeW +amx +abq +aco +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aGF +abd +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(49,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +ars +agx +ars +aNJ +ars +aNJ +aOe +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aco +aco +abd +aPP +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +adV +azz +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aqo +aeW +aeW +aeW +aeW +aqo +ahK +aWk +aTF +aqo +aeW +aeW +aeW +aeW +aeW +aeW +azz +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aGF +arL +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(50,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +ars +ars +ars +ars +ars +ars +aOe +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aRm +azz +azz +aOW +azz +azz +azz +azz +azz +azz +azz +azz +azz +akL +akL +akL +akL +akL +akL +azz +azz +azz +aOW +azz +azz +azz +azz +aeW +aeW +aeW +aeW +aGF +amx +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aqo +aqo +aqo +aqo +aqo +aeW +aeW +aeW +aeW +aeW +aeW +azz +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aGF +aOZ +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(51,1,1) = {" +aFc +aOe +aeP +aZf +aaV +aZf +ars +ars +ars +aNJ +ars +aNJ +aOe +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aco +aco +aco +aco +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +ajc +asz +aht +aht +aht +ajc +aSI +aMG +aqz +akG +aqz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +amx +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aVv +auK +aVv +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(52,1,1) = {" +aFc +aOe +aeP +aZf +aaV +aZf +aWn +aOe +aOe +aOe +aCE +aOe +aOe +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +azz +azz +azz +azz +azz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +ajc +asz +aht +aht +aht +ajc +aor +abg +aqz +aMG +aqz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +amx +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aAF +aAF +aAF +aAF +aAF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aco +aPP +adV +azz +aeW +aeW +aeW +aeW +aeW +anx +aGF +aVv +auK +aVv +aGF +aGn +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(53,1,1) = {" +aFc +aOe +aeP +aZf +aaV +aZf +aeP +aOe +aeW +aVT +ars +aVT +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +ajc +asz +aht +aht +aht +ajc +aiO +aIS +aqz +aMG +aqz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +amx +amx +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aAF +azl +ajy +aWc +aAF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +azz +aco +aPP +adV +azz +azz +aeW +aeW +aeW +aeW +aGF +aGF +aVv +auK +aVv +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(54,1,1) = {" +aFc +aOe +aMT +aZf +aaV +aZf +aeP +aOe +aeW +aVT +ars +aVT +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +ajc +adn +aht +aht +aht +ajc +aMG +abg +aIS +aMG +aqz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +amx +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aAF +aaQ +aaQ +aaQ +aAF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aGw +aco +aFj +aco +aco +azz +aeW +aeW +aeW +aeW +aGF +aGF +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(55,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aSX +aOe +aeW +aVT +ars +aVT +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +ajc +aNW +aht +aht +aht +amW +aMG +aIS +abg +aMG +aqz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +amx +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aAF +aAF +aaQ +aaQ +azl +aAF +aAF +aAF +aAF +aAF +aAF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +apy +aPP +adV +adV +aco +azz +aeW +aeW +aeW +aeW +aGF +aGF +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(56,1,1) = {" +aFc +aOe +aXf +aZf +aaV +aZf +aSX +aOe +aeW +aVT +ars +aVT +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +ajc +asz +aht +aht +aht +ajc +aMG +aMG +ayn +amh +aqz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +amx +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aAF +ayi +aaQ +aaQ +aaQ +aaQ +aaQ +aSA +aaQ +aaQ +aAF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aco +aPP +adV +adV +apy +azz +aeW +aeW +aeW +aeW +aGF +aGF +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(57,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aiq +aOe +aeW +aVT +ars +aVT +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +ajc +asz +aht +aht +aqm +ajc +aqz +aqz +aqz +aqz +aqz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aAF +aks +azl +aaQ +aaQ +aaQ +aaQ +aSA +aaQ +aaQ +aAF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aco +aPP +adV +adV +apy +azz +aeW +aeW +aeW +aeW +aGF +aGF +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(58,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aMF +aOe +aeW +aVT +ars +aVT +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +ajc +aJF +aht +aht +aKQ +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aAF +aqU +aaQ +aaQ +aaQ +aaQ +aOn +aAF +aaQ +aaQ +aAF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +apy +aPP +adV +adV +apy +azz +aeW +aeW +aeW +aeW +aeW +aGF +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(59,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +ars +aOe +aeW +auY +aCE +auY +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aii +aii +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aMr +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aAF +aAF +aaQ +aaQ +azl +aaQ +aOQ +aAF +anp +aaQ +aAF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +aco +aco +ano +aco +aco +azz +aeW +aeW +aeW +aeW +aeW +aGF +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(60,1,1) = {" +aFc +aOe +aiq +aZf +aaV +aZf +ars +aOe +aeW +ajc +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aEG +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aAF +aDI +aaQ +aaQ +aaQ +aDm +aAF +aaQ +aaQ +aAF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azz +azz +azz +azz +azz +azz +azz +aeW +aeW +aeW +aeW +aeW +aGF +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(61,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +ars +aOe +aeW +ajc +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +adq +aQG +aQG +aQG +aQG +aQG +aQG +aQG +aNi +aht +aht +aht +adq +aQG +aQG +aQG +aQG +aQG +aQG +aQG +aNi +aht +aAF +azl +aDi +aaQ +aaQ +aCj +aAF +awP +awP +aAF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(62,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +ars +aOe +aeW +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aht +aht +ajc +aht +amj +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aht +aht +ahu +aic +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +asz +aht +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aQD +auK +aQD +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(63,1,1) = {" +aFc +aOe +aiq +aZf +aaV +aZf +ars +aOe +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aYl +aYl +aYl +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aiX +aht +aht +aKQ +ajc +aeH +aeH +aeH +aeH +aeH +aeH +ajc +asz +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(64,1,1) = {" +aFc +aOe +aWn +aZf +aaV +aZf +ars +aOe +aeW +aeW +aeW +aFq +aFq +aFq +aFq +aFq +aFq +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aTl +aTl +aTl +aTl +aTl +aTl +aTl +aht +aht +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aEC +aQG +aQG +aQG +aQG +aQG +aQG +aQG +aQG +aNi +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aLD +aFc +"} +(65,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aeP +aOe +aeW +aeW +aeW +aFq +axR +ars +ars +aJZ +aFq +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aTl +amH +amH +aWs +ayG +aQU +aTl +anM +aht +amj +amj +ajc +aeH +aeH +aeH +aeH +aeH +aeH +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +avt +ajc +asz +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(66,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aeP +aOe +aeW +aeW +aeW +aFq +ars +ars +ars +aJZ +aFq +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aTl +aTl +aTl +aKZ +aKZ +aKZ +aKZ +aKZ +aTl +aWF +aTl +aTl +ajc +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +asz +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aLD +aFc +"} +(67,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aiq +aOe +aeW +aeW +aeW +aFq +aLq +ars +ars +aJZ +aFq +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aTl +asj +aKZ +aKZ +aKZ +aKZ +aKZ +aKZ +aKZ +aKZ +aZx +aTl +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +asz +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(68,1,1) = {" +aFc +aOe +aeP +aZf +aaV +aZf +ars +aOe +aeW +aeW +aeW +aFq +ars +ars +ars +aDl +aFq +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aTl +aqd +aHf +aHf +aQA +aKZ +seO +aKZ +aKZ +aKZ +apA +aTl +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +asz +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(69,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aWy +aOe +aFq +aFq +aFq +aFq +ahw +ars +aFq +aFq +aFq +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aTl +atG +aHf +aHf +aoW +aKZ +aVR +aTA +aKZ +aKZ +aLh +aTl +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aiX +aht +ajc +ayV +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aLD +aFc +"} +(70,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +ars +ars +ars +ars +ars +ars +ars +ars +aJZ +aFq +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aTl +ace +aHf +aHf +aqq +aKZ +akf +aFL +aKZ +aKZ +awk +aTl +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aJF +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +adY +adY +adY +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aLD +aFc +"} +(71,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +ars +ars +ars +ars +ars +ars +ars +ars +aBG +aFq +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aKQ +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aTl +aTl +aTl +aTl +aTl +aTl +aTl +aTl +aTl +aTl +aTl +aTl +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +amj +amj +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(72,1,1) = {" +aFc +aOe +aIU +asY +aaV +asY +aWy +aOe +aFq +aFq +aFq +aFq +aJZ +alA +ahP +aFq +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +ajc +ajc +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(73,1,1) = {" +aFc +aOe +ars +aZf +aUP +aZf +ars +aOe +aeW +aeW +aeW +aFq +aFq +aFq +aFq +aFq +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(74,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +ars +aOe +aOe +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(75,1,1) = {" +aFc +aOe +ars +aZf +aaV +aIg +ars +apX +aOe +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aNS +aht +aJU +aht +ahr +aht +alx +aVC +aNw +aNw +agp +agS +agj +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(76,1,1) = {" +aFc +aOe +ars +aZf +aaV +aIg +ars +apX +aOe +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +asz +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(77,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +ars +aOe +aOe +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aaf +aht +aYJ +aht +aYJ +aht +aYJ +avL +avL +aht +aht +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(78,1,1) = {" +aFc +aOe +ars +aXD +aaV +aZf +aiq +aOe +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aYX +aWq +aht +aht +aHR +aht +aYJ +agS +agj +agS +aht +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(79,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aqn +aOe +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aVB +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(80,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aqn +aOe +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aiX +aht +ajc +afi +ayL +aql +aht +aYJ +aht +aYJ +ajc +avH +aht +aht +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(81,1,1) = {" +aFc +aOe +aiq +aZf +aaV +aZf +aeP +aOe +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aht +aht +aVE +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(82,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aeP +aOe +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +atI +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(83,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aeP +aOe +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aht +aht +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aht +aht +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(84,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +ars +aOe +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(85,1,1) = {" +aFc +aOe +aeP +aZf +aaV +aZf +ars +aOe +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +aht +aht +aiC +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aiC +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(86,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +ars +aOe +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(87,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aiq +aOe +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(88,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +ars +aOe +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aZl +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(89,1,1) = {" +aFc +aOe +aqn +aZf +aaV +aZf +aiQ +aOe +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aLs +aLs +aLs +aLs +aLs +aLs +aCy +ayq +ayq +ayq +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(90,1,1) = {" +aFc +aOe +aqn +aZf +aaV +aZf +aeP +aOe +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aLs +stb +akW +akW +akW +nFJ +adx +aIz +aIz +ayq +ayq +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(91,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +ars +aOe +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aLs +aLs +aLs +aLs +aTY +aJC +akW +ask +aQS +ahl +aIz +aIz +aIz +ayq +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(92,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aiQ +aOe +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aUG +aUG +aUG +aUG +aUG +aUG +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aLs +aMt +aQH +atq +akW +akW +nEn +aPd +aQS +apv +ayq +ayq +aIz +aIz +aeH +aeH +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +avt +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(93,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aiQ +aOe +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aUG +ath +aRA +aSb +aHF +aUG +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aLs +aLs +aLs +aLs +aTY +akW +akW +akW +aWj +arR +aIz +aIz +aIz +aIz +aeH +aeH +ajc +aGD +aht +aXM +aht +aht +aht +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(94,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aiQ +aOe +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aUG +aaF +amM +amM +aHF +aUG +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aLs +aUi +aPU +auU +aHV +nFJ +agk +aIz +aIz +ayq +ayq +aeH +aeH +ajc +avI +aht +aht +aht +aht +aht +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(95,1,1) = {" +aFc +aOe +ars +aZf +aaV +aZf +aiQ +aOe +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aUG +atx +aft +aft +atx +aUG +aUG +aUG +aUG +aUG +aUG +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aLs +aLs +aLs +aLs +aLs +aLs +aTU +atY +ayq +ayq +aeH +aeH +aeH +ajc +aJq +atD +aht +aMA +agj +ahj +aht +ayx +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(96,1,1) = {" +aFc +aOe +aOe +aMu +aMu +aMu +aOe +aOe +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aUG +aHF +aft +aft +atx +acy +aIs +aGT +atx +atx +aUG +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +adu +aIz +aeH +aeH +aeH +aeH +ajc +aLH +ayX +aht +aeC +agj +aVz +aht +aVz +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(97,1,1) = {" +aFc +aeW +aOe +aMu +aMu +aMu +aOe +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aUG +atx +aft +aft +aHF +atx +aHF +alU +atx +ame +aUG +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aJF +aht +aht +aht +aht +aht +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +asO +aeW +asO +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(98,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aUG +atx +aft +aft +aft +aft +aft +aft +aft +agm +aUG +aUG +aUG +aUG +aUG +aUG +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aYJ +agj +atD +aht +aht +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(99,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aUG +atx +aft +aft +aft +aft +aft +aft +aft +aeo +aUG +axg +axg +axg +axg +aUG +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aYJ +acH +aqm +aht +aLy +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(100,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aUG +aME +aft +aft +aHF +mGq +aIB +aft +aft +aAa +aUG +axg +aHu +axg +ato +aUG +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +ajm +aht +aht +aht +aht +ajc +avt +ajc +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(101,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aUG +aam +aft +aft +ara +aUG +aec +aft +aft +avE +aUG +aaO +aWZ +aWZ +axg +aUG +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aVz +aht +aYJ +asS +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +adY +adY +adY +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(102,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aUG +axB +aft +aft +ara +aUG +aec +aft +aft +atL +aUG +aTL +aSy +axg +axg +aUG +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(103,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +ajc +ajc +ajc +aeH +aUG +aUG +aUG +aUG +aUG +aUG +azR +aft +aft +adD +aUG +axg +axg +axg +axg +aUG +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(104,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +aEG +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aUG +aec +aft +aft +aft +amN +aft +aft +aft +atx +aUG +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(105,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +adq +aNi +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aUG +aHH +awZ +atx +atx +aUG +ahV +aft +aft +akI +aUG +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aGF +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(106,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +asz +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aUG +aUG +aUG +aUG +aUG +aUG +acw +aft +aft +aij +aUG +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aGF +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(107,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +asz +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aUG +wWP +aft +aft +aCM +aUG +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +amW +aGF +aGF +aGF +aGF +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aGF +aGF +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(108,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aZG +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aUG +aoX +aft +aft +aKb +aUG +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aGF +aGF +aGF +aGF +aGF +aGF +aGF +aGF +aGF +aGF +aGF +aGF +aVv +auK +aVv +aGF +aGF +aGF +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(109,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +asz +aZl +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aUG +aUG +aUG +aUG +aUG +aUG +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aGF +aGF +aGF +aGF +aGF +aVv +auK +aVv +aGF +aGF +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(110,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +asz +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aGF +aGF +aVv +auK +aVv +aGF +aGF +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(111,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +asz +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aiX +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aGF +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(112,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +asz +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azE +azE +aeW +aVv +auK +aVv +aGF +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(113,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aev +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aKY +aVv +ayo +aVv +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(114,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +asz +aht +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aht +aht +aht +aht +aht +aht +aht +agp +aht +aht +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azE +aVv +aVv +aVv +aVv +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(115,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +asz +aht +ajc +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azE +aVv +aVv +aaS +azE +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(116,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +amj +amj +ajc +asz +aht +ave +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +apj +apj +apj +apj +apj +apj +apj +apj +apj +apj +apj +ajc +aii +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +adr +aVv +aVv +azE +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(117,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +ajc +ajc +ajc +auT +aht +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +aop +aVk +alK +aVk +alK +aVk +alK +aVk +alK +aVk +aVk +aVk +alK +aVk +alK +aVk +alK +aVk +aVk +aVk +aVk +aZK +aVk +aVk +apj +aVk +aJB +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +acO +aQE +aVv +aVv +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(118,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aEs +aht +aXM +aht +aht +aht +ave +aht +aht +aht +aht +aht +aht +aht +ave +aVk +auI +alK +aXN +alK +apb +alK +aVk +alK +aVk +aVk +aVk +alK +aVk +alK +aVk +alK +aVk +aVk +aVk +aVk +aZK +aVk +aVk +aVk +aVk +aMH +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aaX +atV +aVv +aVv +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(119,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +amD +aht +aht +aht +aht +aht +ajc +aht +aht +aht +aht +aht +aht +aht +ajc +agF +aVk +alK +aVk +alK +aVk +alK +aVk +alK +aFk +apj +agF +alK +aVk +alK +aVk +alK +aVk +aVk +aVk +aFk +apj +agF +aVk +aVk +aVk +aMH +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +azE +azE +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(120,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +amD +aht +agS +atD +aMe +aMA +ajc +aht +aht +ajc +ajc +ajc +ajc +ajc +ajc +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +apj +aNH +aNH +apj +apj +apj +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(121,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +amD +aht +aqx +vjV +aFr +aht +ajc +ajc +ajc +ajc +agv +agv +agv +agv +ofr +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aMP +qOC +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(122,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +amD +aht +aht +aht +aht +aht +ajc +aeH +aeH +ajc +agv +agv +agv +agv +ofr +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +uZK +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(123,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +amD +aht +aqJ +aht +agS +agj +ajc +aeH +aeH +ajc +agv +agv +agv +agv +ofr +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +qUY +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(124,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +amD +aht +aeC +agj +acH +aLZ +ajc +aeH +aeH +ajc +aHG +agv +agv +amK +apj +agF +aVk +alK +aVk +alK +aVk +alK +aVk +alK +aFk +apj +agF +alK +aVk +alK +aVk +alK +aVk +aVk +aVk +aVk +aVk +aVk +aVk +atc +jFz +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(125,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +amD +aht +aht +aht +aht +aht +ajc +aeH +aeH +ajc +agv +agv +agv +agW +apj +aVk +aVk +alK +aVk +alK +aVk +alK +aVk +alK +aVk +aVk +aVk +alK +aVk +alK +akT +alK +aVk +aVk +aVk +aVk +apj +ahN +ahN +apj +apj +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(126,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aCP +aht +ajc +ajc +ajc +ajc +ajc +aeH +aeH +ajc +agv +agv +agv +agW +apj +aVk +aVk +alK +aVk +alK +aVk +alK +aVk +alK +aVk +aVk +aVk +alK +aVk +alK +aVk +alK +aVk +aVk +aVk +aVk +ahN +ayv +aDZ +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(127,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aUs +agv +agv +agW +apj +apj +apj +aGP +aGP +aGP +aGP +aGP +apj +apj +apj +apj +apj +apj +apj +apj +apj +apj +aVk +aVk +aVk +aVk +ahN +aju +aWI +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(128,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +ajc +agv +agv +agv +agW +aht +aht +apZ +aGP +acR +acC +ans +aGP +agv +agv +apj +aVk +aVk +alK +aVk +alK +aVk +alK +aVk +aVk +aVk +aVk +apj +aju +agP +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(129,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aYl +wfK +nRM +wfK +nRM +wfK +nRM +wfK +aYl +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +ajc +agv +agv +agv +agW +aht +aht +apZ +aGP +ans +ans +ans +aGP +aBS +agv +apj +aVk +aVk +alK +aVk +alK +aVk +alK +aVk +aVk +aVk +aFk +apj +acV +ahN +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(130,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aYl +eel +nRM +eel +nRM +eel +nRM +eel +aYl +aeH +aeH +aeH +ajc +aht +aZl +ajc +aeH +aeH +aeH +aeH +aeH +aeH +ajc +agv +agv +agv +agW +ajc +aSk +aKN +aGP +ala +ala +ala +aGP +agv +agv +apj +agF +aVk +alK +aVk +alK +aVk +alK +aVk +aVk +aVk +aVk +aVk +aVk +aVk +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(131,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aYl +aAw +nRM +aAw +nRM +aAw +nRM +aAw +aYl +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +ajc +aHG +agv +agv +acL +aon +aon +aon +aon +aht +aht +aht +aEY +agv +aeO +apj +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(132,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aYl +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aYl +aAw +nRM +aAw +nRM +aAw +nRM +aAw +aYl +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +ajc +agv +agv +agv +agv +agv +agv +agv +agv +axG +axG +axG +agv +agv +agv +apj +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(133,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aYl +aYl +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aYl +aAw +nRM +aAw +nRM +aAw +nRM +aAw +aYl +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +ajc +agv +agv +agv +agv +agv +agv +agv +agv +agv +agv +agv +agv +agv +agv +apj +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(134,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aYl +gfm +aYl +gfm +aYl +gfm +aYl +gfm +aYl +aeH +aeH +aeH +ajc +aht +aht +ajc +aeH +aeH +aeH +aeH +aeH +aeH +ajc +agv +agc +agv +agv +agv +agv +agv +agv +agv +agv +agv +agv +aKF +aKF +apj +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +aVk +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(135,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aYl +fxg +aYl +fxg +aYl +fxg +aYl +fxg +aYl +aYl +aYl +aYl +ajc +aht +aht +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +apj +agF +aVk +alK +aVk +alK +aVk +alK +aVk +alK +aVk +alK +aVk +alK +aFk +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(136,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aYl +aAw +aAw +aAw +aAw +aAw +aAw +aAw +aAw +qNS +aAw +gfJ +ajc +aht +aht +aht +aht +aht +aht +aht +aSS +aht +aht +aht +aht +aht +aht +aht +aSS +aht +aht +aht +aht +aht +aht +aht +aht +aPR +aVk +aVk +alK +aVk +alK +akT +alK +aVk +alK +aVk +alK +akT +alK +aVk +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(137,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aYl +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aYl +aAw +aAw +aAw +aAw +aAw +aAw +aAw +aAw +qNS +kzc +gfJ +ajc +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +aht +apj +aVk +aVk +alK +aVk +alK +aVk +alK +aVk +alK +aVk +alK +aVk +alK +aVk +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(138,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aYl +aYl +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aeH +aYl +itd +nbK +itd +nbK +itd +nbK +itd +aAw +aYl +aYl +aYl +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +ajc +apj +apj +apj +apj +apj +apj +apj +apj +apj +apj +apj +apj +apj +apj +apj +apj +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(139,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aqz +aqz +aqz +aqz +aqz +aqz +aqz +aqz +aqz +aqz +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(140,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(141,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(142,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(143,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(144,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(145,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(146,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(147,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aVv +auK +aVv +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(148,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +adY +adY +adY +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(149,1,1) = {" +aFc +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +adY +adY +adY +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aeW +aFc +"} +(150,1,1) = {" +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +"} + +(1,1,2) = {" +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +"} +(2,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ayw +ayw +ayw +ayw +aDG +aDG +aDG +aDG +aDG +aDG +aDG +ayw +aDG +aDG +aDG +aDG +aDG +aDG +aDG +ayw +ayw +ayw +ayw +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(3,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aSw +aDq +aXZ +aXZ +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(4,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ags +avJ +aQw +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aQw +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(5,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +adg +adg +adg +adg +uuB +uuB +uuB +uuB +uuB +uuB +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aca +ags +aSZ +anl +anl +aNg +aXo +aeS +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +anl +anl +anl +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(6,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +iyu +adg +adg +adg +adg +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ags +aSw +avZ +aPI +aPI +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aPI +aPI +aPI +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(7,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +ooV +adg +adg +adg +adg +adg +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ags +ags +avJ +aHe +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(8,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ags +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aeS +aMO +aeS +aXo +aXo +alB +aXo +aXo +aDd +afj +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(9,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +olG +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aSw +avJ +afj +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(10,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +ciB +uuB +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ags +avJ +aYG +afj +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +afj +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(11,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +adg +adg +adg +adg +adg +aLD +adg +adg +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ags +avJ +aYG +aHe +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(12,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +adg +aLD +adg +aLD +aLD +aLD +adg +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aSw +asW +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(13,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ags +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aHe +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(14,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aat +aat +aat +aat +aat +aat +aat +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aSw +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aeS +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ahY +aFc +"} +(15,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aat +aat +aat +aat +aat +adg +adg +adg +aat +aat +aat +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aSw +aLN +aYG +afj +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ahY +aFc +"} +(16,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aat +aat +aat +aat +aat +aat +adg +adg +aat +adg +adg +adg +aat +aat +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ags +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aHe +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(17,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +adg +adg +aat +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aSw +avJ +afj +aYG +aNg +aeS +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(18,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +adg +aat +aat +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ags +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(19,1,2) = {" +aFc +uuB +uuB +uuB +uuB +uuB +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aat +aat +aat +aat +aat +adg +adg +adg +adg +adg +adg +adg +aat +aat +aat +aat +aat +adg +adg +aat +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aca +aSw +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aeS +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +afj +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(20,1,2) = {" +aFc +uuB +uuB +uuB +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +aLD +aLD +aLD +aLD +adg +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +aLD +aLD +aLD +aat +aat +aat +aat +aat +aat +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aat +aat +aat +aat +aat +adg +aat +aat +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ags +ags +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(21,1,2) = {" +aFc +uuB +uuB +uuB +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aLD +aLD +adg +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +aat +aat +aat +aat +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aat +aat +aat +adg +adg +aat +aat +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ags +aSw +avJ +aHe +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(22,1,2) = {" +aFc +uuB +uuB +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aat +adg +adg +adg +adg +aat +aat +aat +aat +aat +aat +adg +adg +adg +adg +adg +aat +aat +aat +aat +adg +adg +aat +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ags +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aHe +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(23,1,2) = {" +aFc +uuB +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aat +aat +aat +aat +aat +aat +aat +aat +aat +adg +adg +adg +adg +aat +aat +aat +aat +adg +aat +aat +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ags +asW +aYG +aYG +aNg +aXo +aXo +alB +aXo +aeS +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(24,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aat +aat +aat +aat +aat +aat +adg +adg +adg +adg +adg +adg +aat +aat +aat +adg +adg +adg +aat +aat +aat +adg +adg +aat +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ags +avJ +aYG +aHe +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aVg +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(25,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aat +aat +aat +adg +adg +aat +aat +aat +aat +aat +aat +aat +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aLD +aLD +aLD +aLD +aLD +aLD +aSw +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(26,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aat +aat +aat +adg +adg +aat +aat +aat +aat +aat +aat +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aLD +aLD +aLD +ags +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(27,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aLD +aLD +aSw +avJ +aYG +aEn +aGV +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aHp +aEn +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(28,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aat +aat +aat +aat +adg +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aLD +aSw +avJ +aYG +aEn +aRs +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aeS +arK +aEn +aYG +aHe +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(29,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +aat +aat +aat +adg +adg +adg +adg +aat +aat +aat +aat +aat +aat +aat +aat +aat +adg +aat +aat +aat +aat +aat +arG +aat +aat +aat +adg +adg +adg +adg +ags +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(30,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +aat +adg +aat +aat +aat +aat +arG +aat +aat +aat +aat +aat +aat +aat +arG +aat +adg +adg +adg +ags +avJ +aYG +afj +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +afj +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(31,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aat +aat +aat +aat +adg +adg +aat +aat +aat +aat +adg +adg +adg +adg +adg +adg +adg +aat +aat +aat +aat +adg +aSw +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(32,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aqX +aqX +aqX +aqX +aqX +aqX +aHq +aat +aat +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aat +aHo +arG +aHM +aSw +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(33,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aqX +ahL +ahL +ahL +ahL +aoR +arp +arG +aat +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +azT +aHo +ajx +aup +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(34,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aqX +ahL +agM +ahL +ahL +aoR +azT +aXH +adg +adg +adg +aSw +aSw +ags +aSw +ags +ags +aSw +ags +ags +aSw +azT +aGW +aat +avJ +aYG +aHe +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aeS +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(35,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +aqX +aqX +aqX +aqX +ahL +ahL +ahL +agM +aqX +aqX +aqX +aqX +aqX +aqX +aqX +anz +anz +anz +anz +anz +anz +anz +anz +anz +alm +azT +aHo +avJ +afj +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aHe +afj +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(36,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +aqX +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +axq +ahL +ahL +agM +ahL +ahL +ahL +ahL +ahL +ahL +aoR +ags +azT +aLN +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(37,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +aqX +ahL +ahL +amy +amy +amy +amy +amy +amy +amy +amy +amy +amy +amy +amy +aIR +aSQ +anE +axy +anE +axy +anE +ayu +ahL +aoR +aSw +ags +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(38,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +aqX +agM +ahL +aLw +adz +aAZ +aJw +aJw +aUc +aow +uQN +aow +aow +fqc +amy +sWK +aes +aWT +aMM +aWT +ajN +aWT +abc +ahL +aPt +ags +aSw +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +afj +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(39,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +aqX +ahL +ahL +aLw +qhs +awO +tTU +aJw +aFD +aow +aow +aow +aow +aow +amy +okz +akm +aWT +ajN +aWT +ajN +aWT +abc +ahL +aoR +ags +aSw +avJ +aYG +aHe +aNg +aeS +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aHe +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(40,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +aqX +ahL +adU +aLw +aJw +awO +aJw +aJw +aYE +aow +aow +aHY +aow +aow +amy +gwV +akm +ajN +ajN +ajN +ajN +ajN +abc +ahL +aoR +aSw +ags +avZ +aPI +aod +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(41,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aqX +ahL +ahL +aLw +aJw +aJw +aJw +aJw +acI +aow +kcy +arP +aow +aow +rvI +ahL +akm +ajN +ajN +ado +aWv +ajN +abc +ahL +agn +anz +anz +aqe +anl +anl +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aPI +aPI +aPI +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(42,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aqX +ahL +agM +amy +amy +amy +amy +amy +aLw +aRe +aHY +aHY +aow +aow +amy +avS +anU +aBr +aBr +ajN +ajN +ajN +abc +ahL +ahL +ahL +ahL +aPI +aPI +aPI +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +anl +anl +anl +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(43,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aqX +ahL +ahL +aLw +aOD +aow +aow +aow +aow +aow +aow +aow +aow +aow +aek +ahL +akm +aWr +ajN +ajN +ajN +ajN +aoU +axy +axy +axy +axy +aOI +aps +aLz +aGV +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aod +aPI +ali +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(44,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aqX +ahL +adU +aLw +amA +aow +aow +aow +aow +aow +aow +aow +aow +aow +aek +ahL +anU +aBr +aBr +aWv +ajN +ado +atH +avp +aOp +aOp +aOp +ayD +aWS +ayD +aRs +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(45,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aqX +ahL +ahL +amy +amy +aUw +aow +aow +aow +bXd +pPg +pPg +fjk +amy +amy +ahL +aqw +aOp +aOp +aOp +aOp +aOp +aka +ahL +ahL +ahL +ahL +aPI +aPI +aPI +aNg +aXo +aXo +alB +aXo +aeS +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(46,1,2) = {" +aFc +aLD +aLD +aLD +aLD +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aqX +ahL +amy +aLw +asF +aLw +abr +aow +aow +wEs +pPg +pPg +fjk +amy +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +aEc +aFV +aqB +aqB +aBF +aEp +anl +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aCh +aYG +aYG +afj +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(47,1,2) = {" +aFc +aLD +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aqX +ahL +aLw +ayO +auz +aVp +aow +aow +aow +hkP +nML +tFK +uPd +amy +mFc +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +aoR +ags +aSw +ags +avZ +aPI +aPI +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(48,1,2) = {" +aFc +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aqX +ahL +amy +amy +amy +amy +amy +amy +amy +amy +amy +amy +amy +amy +ahL +ahL +agM +ahL +ahL +ahL +agM +ahL +ahL +aoR +aSw +adg +ags +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(49,1,2) = {" +aFc +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +aqX +ahL +cbl +ahL +ahL +bOf +bOf +bOf +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +agM +ahL +ahL +ahL +ahL +aoR +ags +adg +aSw +avJ +aHe +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(50,1,2) = {" +aFc +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aqX +ahL +ahL +ahL +agM +ahL +ahL +ahL +agM +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +aoR +aSw +adg +ags +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(51,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aqX +ahL +ahL +ahL +ahL +agM +ahL +ahL +ahL +acK +aJj +aJj +aJj +anu +ayS +ahL +ahL +ahL +ahL +agM +ahL +ahL +agM +aoR +ags +adg +aSw +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +afj +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(52,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aqX +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +agM +ahL +agM +ahL +ahL +ahL +ahL +ahL +aoR +aSw +adg +ags +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aHe +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(53,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +abR +ahL +ahL +ahL +ahL +ahL +agM +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +ahL +aoR +aSw +adg +ags +avJ +aYG +aYG +aNg +aeS +aXo +alB +aXo +aeS +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(54,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +abR +ahL +ahL +agM +aEc +aqB +aqB +aqB +aWJ +agM +ahL +ahL +ahL +ahL +ahL +ahL +ahL +agM +ahL +ahL +aNX +ahL +ahL +aoR +aSw +adg +aSw +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aeS +aDd +afj +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(55,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +abR +ahL +ahL +aEc +aYF +alQ +ajN +ajN +aUQ +aWJ +ahL +ahL +ahL +agM +ahL +apt +adB +aYc +aYc +avn +apt +ahL +ahL +aoR +ags +adg +aSw +aLN +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(56,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +abR +ahL +ahL +aoR +alQ +ajN +ajN +ajN +ado +aWA +ahL +ahL +ahL +ahL +ahL +apt +adB +aYc +aYc +avn +apt +ahL +ahL +aoR +ags +adg +ags +avJ +aYG +aHe +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aHe +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(57,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +abR +ahL +ahL +aoR +alQ +ado +awS +ajN +ajN +aWA +ahL +agM +ahL +ahL +ahL +apt +adB +aYc +aYc +avn +apt +ahL +ahL +aoR +aSw +adg +aSw +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aeS +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(58,1,2) = {" +aFc +adg +adg +adg +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +abR +ahL +agM +aoR +alQ +ajN +ajN +ajN +ajN +aWA +ahL +ahL +ahL +ahL +ahL +apt +adB +aYc +aYc +avn +apt +ahL +agM +aoR +aSw +adg +aSw +avJ +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(59,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +auY +aZj +aZj +aZj +aZj +aZj +aZj +aZj +aZj +aZj +aRw +aBp +aBp +aBp +aBp +aBp +aBp +aBp +aBp +aBp +agG +agG +agG +agG +agG +agG +agG +agG +agG +agG +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +abR +ahL +ahL +agn +alm +alQ +ado +ajN +aVA +axi +ahL +ahL +ahL +agM +ahL +apt +adB +aYc +aYc +avn +apt +ahL +ahL +aoR +ags +adg +aSw +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(60,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +auY +atC +atC +atC +atC +atC +aFq +aKI +aQu +azu +aLO +ars +ars +ars +ars +ars +ars +aQu +ars +ars +ars +ars +ars +ars +ars +auY +atZ +aFX +ahz +aWo +aoe +ahz +aTG +aiF +aZj +auQ +anR +ayH +agu +alO +alO +alO +aQi +aej +aBp +aeU +aMD +aEy +aWz +asr +aiT +aEW +agG +ady +and +azL +alI +aFI +aFI +aFI +aFI +alI +aJs +asa +aqb +asa +asa +asa +aOG +asa +asa +ayN +aKK +aKK +aAF +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +abR +agM +ahL +ahL +agn +anz +anz +anz +axi +ahL +agM +ahL +ahL +ahL +ahL +apt +adB +aYc +aYc +avn +apt +ahL +ahL +aPt +aSw +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aeS +aXo +aDd +aYG +aYG +afj +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(61,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +auY +atC +aAQ +aAQ +atC +atC +aFq +aFt +ars +ars +aLO +ars +ars +ars +ars +ars +ars +ars +ars +ars +ars +ars +ars +ars +ars +auY +afD +aCr +aXd +abD +abD +aeE +abD +abD +aZj +auQ +anR +axV +alO +alO +alO +alO +alO +aXQ +aBp +aPi +aEJ +aEJ +aEJ +aEJ +aEJ +aEJ +afR +and +and +azL +asa +asa +asa +asa +asa +asa +aJs +asa +aqN +asa +asa +asa +azL +aZR +asa +aCZ +aKK +aKK +aAF +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +abR +ahL +ahL +ahL +ahL +ahL +agM +ahL +ahL +ahL +ahL +cbl +agM +ahL +ahL +apt +adB +aYc +aYc +avn +apt +agM +ahL +aoR +ags +adg +aSw +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aHe +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(62,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +auY +aJx +aSM +aSM +atC +atC +aFq +aMK +ars +aGb +aLO +ars +ars +axd +axd +axd +axd +ars +ars +ayA +arE +aDo +aFa +ars +ars +auY +aZj +aZj +ahz +aoF +abD +aZj +aZj +aZj +aZj +auQ +anR +aoK +alO +aBv +aur +aOR +ahk +aUR +aBp +aEJ +aEJ +aEJ +aEJ +aEJ +aEJ +aEJ +agG +aOc +aSt +azL +asa +asa +asa +asa +asa +asa +aJs +asa +aBc +afn +asa +aYu +azL +aUf +asa +aYt +asa +asa +aAF +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +abR +ahL +agM +ahL +ahL +ahL +ahL +ahL +ahL +agM +ahL +ahL +ahL +ahL +ahL +apt +adB +aYc +aYc +avn +apt +ahL +ahL +aoR +aSw +adg +ags +anb +aoA +aoA +aNg +aeS +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(63,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +auY +atC +aim +aim +atC +atC +aFq +aoD +aFq +aFq +aFq +aLq +ars +axd +axd +axd +axd +ars +ayA +acT +aVT +aCY +aDo +aFa +aWy +awf +ajg +abD +abD +abD +abD +arT +aAr +aAr +aZj +aJl +anR +aiL +alO +alO +aBp +aBp +aBp +aBp +aBp +aNz +aNz +agG +aLb +agG +agG +agG +agG +agG +agG +azL +aKC +aFI +aFI +aFI +aFI +alI +aJs +asa +aqN +jQW +asa +arH +azL +aXF +asa +asa +asa +aDC +aAF +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +abR +abR +abR +abR +abR +abR +abR +abR +abR +abR +abR +abR +abR +abR +abR +abR +abR +abR +abR +abR +abR +abR +abR +abR +aSw +adg +aSw +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(64,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +auY +ars +ars +ars +ars +ars +ars +ars +ars +aFq +ars +ars +ars +ars +ars +ars +ars +ars +aKj +aVT +aVT +aVT +awQ +aFa +ars +awf +aXy +abD +abD +abD +abD +axk +aSR +aAr +aZj +aJl +anR +aue +arx +alO +aXW +aGU +aGU +afS +aBp +aEJ +aEJ +agG +aEJ +aEJ +aEJ +aEJ +agG +auQ +auQ +azL +alI +aKV +aKV +aKV +aKV +alI +aJs +asa +aBc +asa +asa +aGd +azL +adw +afn +asa +asa +asa +aAF +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aSw +anb +aoA +aoA +aNg +aXo +aeS +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +afj +aYG +aHe +aTg +tMt +aLD +aLD +aLD +aLD +ahY +ahY +ahY +ahY +aFc +"} +(65,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +auY +aQr +aQr +aTB +dll +ars +ars +akV +ars +aui +ars +ars +ars +ars +ars +ars +ars +ars +aLt +aAJ +aVT +avz +atj +aFa +ars +awf +afq +abD +anv +anv +anv +arT +aAr +aAr +avq +aJl +aBp +aBp +aBp +aMz +aBp +aLQ +aZe +aXm +aBp +aXT +aXT +agG +axH +aEJ +aQI +aNY +agG +auQ +auQ +azL +amE +asa +asa +asa +asa +asa +aJs +asa +aqN +aZv +asa +atb +azL +aBU +aCn +aKR +aHy +aHy +aAF +adg +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aSw +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(66,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +auY +auY +auY +aTB +dll +auY +auY +auY +auY +auY +aGu +auY +auY +auY +ahw +ars +ars +ars +ars +aLt +aHa +atj +aFa +ars +ars +awf +aaw +abD +anv +anv +anv +arT +aMU +aZj +aZj +aJl +aBp +afV +aLA +aLA +aBp +aNc +akl +aBA +aBp +aXT +aXT +agG +agt +aEJ +asH +akn +agG +aJl +aJl +azL +asa +asa +asa +asa +asa +asa +aJs +asa +aff +aHm +aCl +aIY +aAF +aAF +aAF +aAF +aAF +aAF +aAF +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aeS +aMO +aXo +aXo +aXo +alB +aXo +aeS +aDd +aYG +afj +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +ahY +ahY +ahY +aFc +"} +(67,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aLI +auY +auY +auY +auY +aLI +aLI +auY +aTT +aGv +akw +auY +aEL +ars +ars +ars +ars +ars +ars +ars +ars +ars +ars +ars +awf +adA +abD +abD +abD +abD +aAr +aAr +aZj +aJl +aJl +aBp +aMc +aLA +aLA +aLA +aLA +aLA +aGK +aBp +agG +agG +agG +aEJ +aEJ +aqH +aJR +agG +aWV +aJl +azL +alI +aKV +aKV +aKV +aCK +agi +azm +asa +asa +asa +asa +asa +asa +asa +asa +aAF +aTV +auQ +aRw +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aeS +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(68,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aLI +aLI +aLI +aLI +aLI +aLI +aLI +auY +aut +aGv +aGv +auY +aEL +ars +ars +ars +ars +ars +aLO +aLO +ars +aLO +aLO +ars +awf +ajg +abD +abD +abD +abD +aAr +aAr +aZj +asG +aJl +aBp +aad +aLA +aLA +aGL +aLA +aLA +aLA +aBp +aoz +aoz +axZ +aEJ +aEJ +aEJ +aqC +agG +aJl +aJl +azL +alI +aqN +aqN +aqN +apU +agH +aOq +asa +asa +asa +asa +asa +asa +asa +asa +aAF +aaA +auQ +aRw +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +aGm +aSw +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aHe +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(69,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aLI +aLI +aLI +avF +adE +adE +adE +auY +auY +auY +auY +auY +auY +aLq +ars +ars +ars +ars +aLO +aEw +ars +aLO +aEw +aWy +awf +ajg +abD +aAR +atT +aLT +aAr +aAr +aZj +aJl +aJl +aBp +aQh +aLA +aLA +ast +ast +aLA +aLA +aBp +aoz +aoz +axZ +aEJ +aEJ +aEJ +aEJ +agG +aJl +aWV +azL +aix +asa +asa +asa +asa +asa +aJs +asa +asa +asa +asa +aRr +aKU +asa +asa +aAF +aaA +auQ +aRw +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +ahY +ahY +aFc +"} +(70,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aLI +aLI +aLI +adE +aws +aws +aws +aws +aws +aws +aws +aws +auY +ars +ars +ars +ars +ars +aLO +ars +ars +aLO +ars +ars +awf +afq +abD +aWO +aWO +aWO +aAr +aEN +aZj +aJl +aJl +aBp +aKy +aLA +aLA +aCC +auW +aLA +aLA +aBp +aiD +aEJ +aEJ +aEJ +aEJ +aEJ +aHS +agG +aJl +aJl +azL +abk +asa +asa +asa +asa +asa +aJs +asa +asa +asa +jQW +aqN +aRr +asa +asa +aAF +aaA +auQ +aRw +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aHe +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +ahY +aFc +"} +(71,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aLI +aLI +aLI +adE +aws +aws +aws +aws +aws +aws +aws +aws +auY +ars +ars +ars +ars +ars +ars +ars +ars +ars +ars +ars +awf +aFx +abD +aAr +aAr +aAr +aAr +aAr +aZj +aJl +aJl +aBp +aPE +aLA +aLA +aCC +aar +aLA +aGK +aBp +aEJ +aEJ +aEJ +aEJ +aEJ +aEJ +aEJ +agG +aJl +aJl +azL +asa +asa +asa +asa +asa +asa +azL +aSW +asa +asa +asa +avo +aqN +asa +asa +aAF +aaA +arS +aRw +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +aSw +aOA +aem +aem +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aPI +aPI +aPI +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(72,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +alr +adE +adE +adE +aws +aws +aws +aws +aws +avi +avi +asp +auY +ars +ars +aCs +ars +ars +ars +ars +ars +ars +ars +ars +awf +aFx +abD +aAr +abU +aAr +aAr +aAr +aZj +asd +asd +aBp +aKy +aLA +aiA +awg +aQV +akQ +akQ +aBp +atR +ade +aAD +all +aAD +aAD +aAD +agG +asd +asd +azL +alI +aKV +aKV +aKV +aKV +alI +azL +aSW +ahH +abY +asa +asa +asa +asa +asa +aAF +aRB +aJl +aRw +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aGm +ags +aRh +adh +adh +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +anl +anl +aEp +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(73,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aXg +avi +avi +avi +aws +aws +aws +aws +aws +avi +avi +asp +auY +auY +auY +ctM +ctM +auY +aCb +aCb +aCb +aCb +aCb +auY +auY +akA +akA +akA +oux +akA +akA +akA +aZj +akW +akW +aBp +acm +acm +wKQ +acm +acm +acm +acm +aBp +aMy +aMy +aMy +dYz +aMy +aMy +aMy +agG +akW +akW +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +dGP +dGP +ahZ +ahZ +ahZ +ahZ +aAF +aRB +aJl +aRw +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +ags +aOA +aem +aem +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aPI +aPI +aPI +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(74,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +akW +akW +akW +akW +aUk +akW +akW +akW +akW +akW +akW +aUk +akW +akW +akW +akW +akW +akW +akW +aUk +akW +akW +aUk +akW +akW +akW +akW +akW +akW +akW +aUk +akW +akW +akW +akW +akW +akW +akW +aUk +akW +akW +aUk +akW +akW +akW +akW +akW +akW +akW +aUk +akW +akW +akW +akW +akW +akW +akW +aYl +aCB +aJl +aRw +aRw +aRw +aRw +aRw +aRw +aRw +aRw +aRw +aRw +aRw +aRw +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(75,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aJW +aPM +aIy +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aUb +aXr +aXr +aTb +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aIy +aHC +aIy +aXr +aUb +aXr +aXr +aXr +aXr +aXr +aTb +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aIy +aHC +aIy +aXr +aIy +aPM +akW +aYl +aRB +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aRw +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aSw +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(76,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +avi +avi +asp +avF +akW +aIy +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aIy +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aIy +aXr +aXr +aXr +aIy +aXO +aYl +aRB +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aRw +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aGm +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +afj +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(77,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +ary +avF +apw +apw +avF +aKA +aws +aws +aws +avi +avi +asp +avF +aky +aXr +aXr +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aaB +auC +akW +auC +aaB +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aXr +aXr +agZ +aIl +aXr +aXr +akW +aDE +aDE +aDE +aDE +aDE +aDE +aDE +aDE +aDE +aQP +aDE +aDE +aJl +aJl +aRw +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aHe +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(78,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aAm +avF +avF +avF +avF +aKA +aws +aws +aws +aws +aws +aws +avF +avg +aXr +aXr +aMC +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aIy +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aIy +aXr +agZ +aXr +aIy +akW +avN +avl +aNq +avl +avl +avl +avl +aIQ +aNq +avl +avl +aDE +aJl +aJl +aRw +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(79,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aAm +aAm +aHw +azV +aWB +aCq +aef +aws +aws +aws +aws +aws +avF +avg +aXr +aXr +aMC +aXr +aHC +aRS +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aTb +aXr +aXr +aUb +aXr +aXr +aXr +aXr +aXr +aIy +aHC +aIy +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aTb +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aIy +aPM +aIy +aXr +aIy +aHC +akW +aVf +avl +avl +avl +avl +avl +avl +aIQ +avl +avl +avl +aDE +asG +aJl +aRw +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aeS +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(80,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aAm +aAm +aHw +azV +azV +alc +aoG +aws +aws +avi +avi +asp +avF +avg +aXr +aXr +aMC +aXr +aIy +akW +akW +akk +aXr +akW +aOV +akW +akW +akW +akW +akW +akW +akW +aOV +akW +akW +aOV +akW +akW +akW +akW +akW +akW +akW +aOV +akW +akW +akW +akW +akW +akW +akW +aOV +akW +akW +aOV +akW +akW +akW +akW +akW +akW +akW +aOV +akW +aXr +aXr +aXr +aXr +aIy +akW +aVf +avl +avl +acE +acE +acE +acE +aIQ +abt +avl +avl +aDE +aJl +aJl +aRw +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +afj +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(81,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aig +amg +aFm +azV +azV +alc +aoG +aws +aws +avi +avi +asp +avF +avg +aXr +aXr +aMC +aXr +aXr +akW +aYl +aeF +aXr +akW +auv +aPe +aPe +aPe +xrY +aPe +aPe +aPe +auv +aBd +akW +aSc +aTw +xIe +xIe +qVZ +xIe +xIe +xIe +aSc +agN +azv +azv +mwU +azv +azv +azv +avF +akW +akW +avF +azv +azv +azv +uCH +azv +azv +azv +avF +akW +aXr +aXr +aXr +aXr +aXr +akW +aVf +avl +avl +aVh +azt +aaD +acE +aIQ +aZu +aIQ +avl +aDE +aJl +aJl +aRw +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aeS +alB +aXo +aXo +aDd +aYG +aHe +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(82,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aAm +aAm +aHw +azV +azV +azV +anO +aws +aws +aws +aws +aws +avF +avg +aXr +aXr +aMC +aXr +aXr +aXO +aYl +ank +aXr +akW +auv +aZC +axc +axc +atk +axc +aJD +aEz +auv +asd +asd +aSc +aID +adf +aYv +aBq +arV +arV +arV +aSc +oGX +oGX +oGX +aws +aws +aws +aws +avF +asd +asd +avF +awW +aCX +aqQ +aoL +aKa +awY +aCX +avF +akW +aXr +aXr +aXr +aXr +aXr +akW +aVf +avl +avl +avl +avl +aSB +avl +avl +avl +avl +avl +aDE +asd +asd +aRw +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(83,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aAm +aAm +aHw +azV +azV +azV +anO +aws +aws +aws +aws +aws +avF +aky +aXr +aXr +aMC +aXr +aXr +akW +aYl +ank +aXr +akW +auv +aKv +axc +axc +axc +axc +axc +axc +auv +aOg +aJl +aSc +aln +adf +axl +aVX +aVX +akK +azb +aSc +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +avF +awW +aUV +aqQ +aoL +awv +auX +aCX +avF +akW +aXr +aXr +aXr +aXr +aXr +akW +ahG +avl +avl +avl +avl +avl +avl +avl +avl +avl +avl +aDE +aXr +aXr +aYl +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(84,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aig +amg +axe +azV +azV +alc +aoG +aws +aws +avi +avi +asp +avF +aPA +aXr +aXr +aMC +aXr +aXr +akW +aYl +aaB +aXr +akW +auv +aaJ +auE +auE +afU +axc +axc +axc +auv +aRB +aJl +aSc +aIb +adf +aga +adf +aRp +aYv +arV +aSc +aws +aws +aws +oGX +oGX +aws +aws +avF +aWV +aJl +avF +aOS +aCX +aOH +aoL +aSV +abn +aaC +avF +akW +aXr +aXr +aXr +aXr +aXr +akW +ahG +aIQ +adS +avl +avl +avl +avl +avl +avl +aIQ +aIQ +aDE +aRO +aXr +aYl +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(85,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aAm +aAm +aHw +azV +azV +alc +aoG +aws +aws +avi +avi +asp +avF +akW +aXr +aXr +aMC +aXr +aXr +akW +aYl +aHE +aXr +akW +auv +adZ +ahM +aGl +aGx +axc +aRP +abT +auv +aRB +aWV +aSc +aCg +adf +aga +adf +aRp +aYv +arV +aSc +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +avF +aRJ +aGk +aKG +aoL +afW +aGk +aMx +avF +akW +aXr +aXr +aXr +aXr +aXr +akW +aDE +aDE +aDE +auN +auN +auN +auN +auN +auN +aDE +aDE +aDE +aUx +aXr +aYl +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +afj +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(86,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aAm +aAm +aYx +aNK +aNK +aNK +aUD +aws +aws +aws +aws +aws +azv +aeF +aXr +aXr +aMC +aXr +aXr +akW +aYl +akW +aXr +akW +auv +aMY +ahb +aGl +aGx +axc +axc +axc +auv +aRB +aJl +aSc +aFF +aga +aYI +aga +aga +aYv +arV +aSc +aws +aws +aws +aws +oGX +oGX +aws +avF +aJl +aJl +avF +aoL +aoL +aoL +wdK +aoL +aoL +aoL +avF +akW +aXr +aXr +aXr +aXr +aXr +akW +ael +aqO +avw +akW +akW +akW +akW +akW +akW +aFv +aqO +azW +akW +akW +aYl +adg +adg +adg +adg +adg +adg +adg +adg +adg +ags +ags +ags +ags +ags +adg +adg +adg +adg +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(87,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +avF +avF +avF +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +azv +aeF +aXr +aXr +aMC +aXr +aXr +akW +aYl +akW +aXr +akW +auv +aNT +aYa +avC +aGx +axc +aRP +aRP +auv +ahW +aJl +aSc +aCg +adf +aga +adf +aRp +aYv +arV +aSc +oGX +oGX +aws +aws +oGX +oGX +aws +avF +aJl +aJl +avF +aVy +aVy +aVy +aoL +atO +aBl +aBl +avF +akW +aHC +aIy +aXr +aIy +aHC +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +ahE +adg +adg +adg +adg +adg +adg +adg +ags +ags +ags +awJ +aIx +aGG +ags +ags +ags +adg +adg +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aHe +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(88,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +azv +ank +aXr +aXr +aMC +aXr +aXr +akW +aYl +akW +aXr +akW +auv +aDL +ahb +aGl +aGx +axc +axc +axc +auv +aRB +aJl +aSc +aIb +adf +aga +adf +aRp +aYv +arV +aSc +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +avF +aQb +adQ +aVy +aoL +aeQ +aCX +aaq +avF +akW +aIy +aXr +aXr +aXr +aIy +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +ahE +adg +adg +adg +adg +adg +ags +ags +ags +aIC +aIx +aHx +aoA +aoO +aIx +aUX +afb +afb +afb +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(89,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +azv +ank +aXr +aXr +aMC +aXr +aXr +akW +aYl +akW +aXr +akW +auv +aji +aof +aFh +aGx +axc +aRP +abT +auv +aRB +aCS +aSc +aIb +adf +aga +adf +aRp +aYv +arV +aSc +aws +aws +aws +aws +aws +aws +aws +avF +asG +aWV +avF +aCX +aCX +aVy +aoL +aTu +aCX +aKT +avF +akW +aIy +aXr +aXr +aXr +aIy +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +ahE +adg +adg +adg +adg +ags +ags +awJ +aIx +aHx +aoA +aoA +aoA +aoA +aoA +aoO +aIx +aGG +afb +afb +adg +adg +adg +ags +anb +alL +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aeS +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(90,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +azv +akW +aXr +aXr +aMC +aXr +aXr +akW +aYl +akW +aXr +akW +auv +aHi +ahb +ahb +aEB +aYR +aYR +afU +auv +aYW +aJl +aSc +aYn +ajt +ajt +ajt +ajt +adF +arV +aSc +oGX +oGX +oGX +oGX +aws +aws +aws +avF +aJl +aJl +avF +aCX +aCX +aVy +aoL +aSV +aCX +aCX +avF +akW +aHC +aIy +aXr +aIy +aHC +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aIy +aHC +aXr +aXr +aXr +ahE +adg +adg +adg +adg +ags +awJ +aTS +aoA +aoA +aoA +aeT +auV +ale +aoA +aoA +aoA +aRW +aGG +afb +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(91,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +avM +avM +aws +avM +avM +aws +avM +avM +aws +aws +azv +akW +aXr +aXr +aMC +aXr +aXr +akW +aYl +akW +aXr +akW +auv +apF +asi +asi +aLF +ahb +ahb +aGx +auv +aRB +aJl +aSc +ayU +aMd +aMd +aMd +arV +arV +azb +aSc +aws +aws +aws +aws +aws +oGX +oGX +avF +aJl +aJl +avF +amT +avF +avF +apD +avF +avF +avF +avF +akW +aXr +aXr +aXr +aXr +aXr +akW +aYb +akW +akW +akW +akW +aXr +aXr +aXr +aXr +aXr +aIy +aXr +aXr +aXr +ahE +adg +adg +adg +ags +ags +anb +aoA +aoA +aVb +auV +aHv +aXY +aVd +auV +ahx +aoA +aoA +aPl +afb +afb +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +afj +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(92,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +avM +aZQ +aws +avM +aZQ +aws +avM +aZQ +aws +aws +azv +akW +aTb +aXr +aMC +aXr +aXr +eBB +aYl +aYl +aYl +akW +auv +auv +auv +auv +auf +ahb +ahb +aGx +auv +aRB +adi +aSc +aPJ +arV +aTy +aMd +arV +arV +akr +aSc +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +avF +aws +aws +aws +aws +aws +agw +agw +avF +alX +aXr +aXr +aXr +aXr +aXr +aXO +aYl +aJM +aJM +aYl +aPA +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +ahE +adg +adg +adg +ags +aIC +aHx +aoA +aeT +aHv +aXY +aXY +aXY +aXY +aXY +aVd +ale +aoA +aoO +aUX +afb +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aeS +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aHe +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(93,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +avM +aws +aws +avM +aws +aws +avM +aws +aws +aws +azv +akW +aXr +aXr +aMC +aXr +aXr +akW +aXr +azP +aYl +akW +auv +arU +ata +anA +alF +ahb +ahb +aGx +auv +aRB +aJl +aSc +aia +arV +arV +arV +arV +arV +aMd +aSc +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +avF +aws +aws +aws +aws +aws +ahh +ahh +avF +akW +aXr +aXr +aXr +aXr +aXr +akW +aJM +aXr +aXr +aJM +akW +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aSv +aYl +azG +ags +ags +ags +anb +aoA +aoA +aEe +aXY +aXY +aBV +art +aXl +aXY +aXY +aGg +aoA +aoA +aPl +afb +afb +afb +afb +agT +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(94,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +avM +avM +aws +avM +avM +aws +avM +avM +aws +aws +azv +akW +aXr +aXr +aMC +aXr +aXr +akW +aXr +azP +aYl +akW +auv +aoh +aZa +auv +apF +asi +asi +aGx +auv +aRB +aJl +aSc +abX +arV +amI +avU +arV +arV +akr +aSc +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +avF +ahh +aVU +aVU +aav +aws +aNP +ahh +avF +akW +aXr +aXr +aXr +aXr +aXr +akW +aRG +aXr +aac +aJM +akW +aXr +aIl +aWu +aWu +aIl +aXr +aXr +aXr +aXr +mbi +aIx +aIx +aIx +aIx +aHx +aoA +aeT +aHv +aXY +aNU +aGZ +abl +aoy +awo +aXY +aVd +ale +aoA +aoO +aIx +aIx +aIx +aIx +aHx +aoA +aoA +aNg +aXo +aXo +alB +aXo +aeS +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +afj +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(95,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aKA +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aDY +avF +aPA +aXr +aXr +aMC +aXr +aXr +aXO +aYl +aRw +aRw +asd +auv +auv +auv +auv +auv +auv +auv +aAB +auv +aXE +aWV +aSc +aSc +abQ +aSc +aSc +aSc +aSc +aSc +aSc +avF +avF +avF +avF +avF +avF +avF +avF +aJl +aJl +avF +avF +avF +avF +avF +avF +avF +avF +avF +akW +aXr +aXr +aXr +aXr +aXr +akW +aJM +aTb +aXr +aab +avV +aXr +aTv +aWu +aWu +aTv +aXr +aXr +aXr +aXr +pxk +aoA +aoA +aoA +aoA +bAt +aoA +aIo +aXY +alY +aZz +afI +aJX +aqf +aBk +alY +aXY +aGg +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(96,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +mEC +akW +aXr +aXr +aMC +aXr +aXr +akW +aYl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aWV +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aRw +akW +aXr +aXr +aXr +aXr +aXr +akW +aRG +aXr +aac +aJM +akW +aXr +aIl +aWu +aWu +aIl +aXr +aXr +aXr +aXr +pHD +aDD +aDD +aDD +aDD +aaU +aoA +aPz +ahT +aXY +aMp +azp +avv +aMv +aBw +aXY +axU +amt +aoA +awh +aDD +aDD +aDD +aDD +aRV +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aHe +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(97,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +mEC +akW +aXr +aXr +aMC +aXr +aXr +akW +aYl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aWV +aJl +aJl +aSP +aAl +aJl +aJl +aJl +aJl +aJl +aSP +aJl +aWV +aJl +aJl +aJl +aJl +aJl +aSP +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aSP +aWV +aJl +aJl +aJl +aUF +akW +aXr +aXr +aXr +aXr +aXr +akW +aXr +aXr +aXr +aJM +akW +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aSv +aYl +azG +ags +ags +ags +anb +aoA +aoA +aEe +aXY +aXY +azI +aGy +afY +aXY +aXY +aGg +aoA +aoA +aPl +afb +afb +afb +afb +agT +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +afj +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(98,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +akW +aXr +aXr +aMC +aXr +aXr +akW +aEQ +aEQ +aEQ +aEQ +aEQ +aEQ +aEQ +aEQ +aEQ +aEQ +aEQ +aEQ +aEQ +amz +aRw +aRw +aRw +aRw +aRw +aJl +aJl +aQy +aQy +aQy +aQy +aQy +aQy +aQy +aQy +aQy +aQy +aRw +aRw +aRw +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +alX +aXr +aXr +aXr +aXr +aXr +aXO +aYl +aDp +aJM +aYl +aPA +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +ahE +ags +adg +adg +ags +aTD +aaU +aoA +aPz +ahT +aXY +aXY +aXY +aXY +aXY +axU +amt +aoA +awh +akU +afb +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(99,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +avF +avF +avF +avF +avF +avF +ayg +avF +avF +avF +avF +akW +aXr +aXr +aIl +aXr +aXr +akW +hjz +amv +aDX +aVr +aII +aDX +aVr +amv +aOi +aKS +afE +aiG +aEQ +aJl +aqj +aum +aWG +aWG +aRw +aez +aez +aQy +aft +aft +ajW +aZm +amM +aFg +aCp +aft +aQy +amV +avu +auL +aYl +akW +aUk +tJK +aci +akW +aUk +tJK +aci +akW +aIy +aXr +aXr +aXr +aIy +akW +aNu +akW +akW +akW +akW +aXr +aXr +aXr +aXr +aXr +aIy +aXr +aXr +aXr +ahE +ags +adg +adg +ags +ags +anb +aoA +aoA +aAS +aJP +ahT +aXY +axU +aJP +aiy +aoA +aoA +aPl +afb +afb +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(100,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +avF +aHs +avF +aHs +avF +ayg +ayg +avF +aQR +aws +azv +akW +aXr +aXr +agZ +aXr +aXr +akW +hjz +aYM +afE +afE +agX +afE +afE +aYM +afE +afE +afE +aOK +aEQ +aJu +aJl +amo +aei +amo +aQy +aQy +aQy +aQy +aft +aft +aBH +aOy +amM +aPL +apm +aft +aQy +aYl +aYl +aYl +aYl +aDA +aDA +aJH +aJH +aDA +aDA +aJH +aJH +akW +aHC +aIy +aXr +aIy +aHC +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aIy +aHC +aXr +aXr +aXr +ahE +ags +adg +adg +adg +ags +aSK +aML +aoA +aoA +aoA +aPz +aJP +amt +aoA +aoA +aoA +akg +akN +afb +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(101,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +avF +aQn +avF +aQn +avF +ayg +avF +avF +aws +aQR +azv +akW +aXr +aXr +aXr +aXr +aXr +akW +hTf +aer +aZB +aZB +aZB +aZB +aZB +aZB +aZB +aZB +aZB +afE +aEQ +agf +aJl +amo +aUY +amo +aQy +aot +aot +aot +aft +aft +aft +aft +aft +aft +aft +aft +aQy +aci +aJH +aom +aLG +aLM +aLM +anm +aLG +aLM +aLM +anm +aLG +akW +aIy +aXr +aXr +aXr +aIy +aXr +aXr +aXr +aTz +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +ahE +ags +adg +adg +adg +ags +ags +aSK +aDD +aaU +aoA +aoA +aoA +aoA +aoA +awh +aDD +akN +afb +afb +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +afj +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(102,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +avF +aws +aws +avF +ayg +ayg +ayg +aES +ayg +ayg +avF +aws +aws +azv +akW +aXr +aXr +agZ +aXr +aXr +akW +hTf +aZB +aZB +aZB +aZB +aZB +aZB +aZB +aZB +aZB +aZB +afE +aEQ +aRB +aJl +aWG +aWG +aum +aQy +aot +aot +amd +aft +aft +aft +aft +aft +aMf +aft +aft +aQy +tJK +aJH +aqZ +aZO +aZO +aZO +aZO +aZO +aZO +aZO +aZO +aYw +akW +aXr +aXr +aXr +aXr +aXr +akW +aXr +agZ +aYl +ajA +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +ahE +ags +adg +adg +adg +adg +ags +ags +ags +aTD +aDD +aaU +aoA +awh +aDD +akU +afb +afb +afb +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aHe +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(103,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +avF +aws +aws +avF +afw +ayg +ayg +ayg +ayg +aYZ +avF +aws +aQR +azv +akW +aXr +aXr +aIl +aXr +aXr +akW +hjz +aYM +cID +afE +afE +afE +afE +akP +atA +aBZ +aZB +aOK +aEQ +aDg +aJl +amo +amo +amo +aQy +aQy +aQy +aQy +aQy +ape +ape +aQy +aQy +aQy +ape +aQy +aQy +aPA +aDA +afo +aZO +aZO +alD +alD +alD +alD +alD +alD +aph +akW +aXr +aXr +aXr +aXr +aXr +akW +aXr +agZ +aYl +ajA +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +ahE +ags +adg +adg +adg +adg +adg +adg +ags +ags +ags +anb +aoA +aPl +ags +ags +ags +adg +adg +adg +adg +adg +adg +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +afj +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(104,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +avF +aws +aws +avF +aPm +awH +awH +awH +aDa +ayg +avF +aQR +aws +azv +akW +aXr +aXr +aMC +aXr +aXr +akW +hjz +aYM +afE +afE +afE +afE +afE +aIq +aHB +aoq +aZB +cID +aEQ +afX +aJl +amo +amo +axL +aQy +apN +aSa +acB +ajU +afJ +afJ +aSY +afJ +aiW +afJ +afJ +aQy +akW +aDA +afo +aZO +alz +anI +aqy +aqy +anI +aqy +aqy +aqy +aFl +aXr +aXr +aXr +aXr +aXr +akW +aXr +aXr +aYl +ajA +aXr +aXr +aXr +aXr +aXr +aTz +aXr +aXr +aXr +aXr +aYl +ags +ags +ags +ags +ags +ags +ags +ags +ags +ags +anb +aoA +aPl +ags +ags +ags +ags +ags +ags +ags +ags +ags +ags +anb +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(105,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +avF +aus +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +aus +avF +aPA +aXr +aXr +aMC +aXr +aXr +aXO +aEQ +aex +aVK +aex +aex +aVK +aex +aEQ +aEQ +aQs +aDf +aEQ +aEQ +aJl +aJl +aCz +axz +aQX +aIa +azH +ajU +ajU +ajU +afJ +afJ +aSY +afJ +aAL +afJ +afJ +aQy +aci +aJH +aJA +aZO +alz +aqy +afk +aqy +aqy +aqy +afk +aqy +aFl +aXr +aXr +aXr +aXr +aXr +aXO +aYl +aYl +aUp +aUp +aUp +aUp +aUp +aUp +aUp +aUp +aXr +aXr +aXr +aWu +aYl +aIx +aIx +aIx +aIx +aIx +aIx +aIx +aIx +aIx +aIx +aHx +aoA +aoO +aIx +aIx +aIx +aIx +aIx +aIx +aIx +aIx +aIx +aIx +aHx +aoA +aoA +aNg +aXo +aeS +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(106,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +avF +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +avF +akW +aXr +aXr +aMC +aXr +aXr +akW +aQs +aqV +apE +aae +aae +apE +aSq +aQs +rDj +aae +aae +aGA +aEQ +aJl +aJl +aum +aWG +aWG +aQy +aAg +aSa +ajU +ajU +afJ +afJ +auD +aTo +avD +aSY +aSY +aQy +tJK +aJH +aqZ +aZO +alz +aqy +aqy +aHL +aOP +aEq +alv +aqy +aFl +aXr +aXr +aXr +aXr +aXr +akW +aXr +aXr +aUp +aJJ +acX +aoE +azS +avB +aAe +aEk +aXr +aXr +aXr +aVV +aYl +agd +agd +agd +agd +agd +agd +agd +agd +agd +agd +agd +aaW +agd +agd +agd +agd +agd +agd +agd +agd +agd +agd +agd +aaW +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +afj +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(107,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +avF +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +avF +akW +aXr +aXr +aMC +aXr +aXr +akW +aQs +alN +aae +aae +aae +aae +aae +arj +aae +aae +aae +apG +aEQ +aJl +aWV +amo +aei +amo +aAi +ane +ajU +ajU +ajU +afJ +tef +afJ +afJ +afJ +afJ +afJ +aQy +aPA +aDA +afo +aZO +alz +aqy +aqy +awj +aFT +axI +alv +aqy +aFl +aXr +aXr +aXr +aXr +aXr +akW +awn +aMR +aUp +aFU +acX +aIE +azo +azo +aGS +azx +aXr +aXr +aXr +awz +aYl +gWV +agd +adl +aAh +aza +aAh +aza +aAh +aza +aAh +aza +aAh +aza +aAh +aza +aAh +aza +aAh +aza +aAh +aza +aAh +aAW +agd +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aeS +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(108,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +avF +aib +aib +aib +aib +aib +avF +avF +avF +avF +avF +avF +avF +avF +akW +aXr +aXr +aMC +aXr +aXr +akW +aQs +ajj +aae +att +azw +aTq +aGA +aQs +aJY +aae +iKw +aGA +aEQ +aJl +aJl +amo +aUY +amo +aQy +apN +aSa +ajU +ajU +afJ +afJ +afJ +afJ +afJ +afJ +afJ +aQy +akW +aXr +afo +aZO +alz +aqy +anI +axE +aEb +aKs +alv +aqy +aFl +aXr +aXr +aXr +aXr +aXr +akW +aNL +aNL +aUp +aUp +aUp +aoE +adH +azo +azo +aTC +aXr +aXr +aXr +aAp +aYl +agd +agd +aAk +aho +aGt +aHc +aGt +aho +alC +aho +act +aho +aRx +aho +aOt +aho +aGt +aho +act +aho +aGt +aho +ats +aZV +aem +aem +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(109,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +avF +aib +aib +aib +aib +aib +avF +aib +aib +aib +aib +aib +aib +avF +akW +aXr +aXr +aMC +aXr +aXr +akW +aEQ +aEQ +aEQ +aEQ +aEQ +aEQ +aEQ +aQs +acM +aae +akR +aOf +aEQ +aJl +aJl +aWG +aWG +aum +aQy +ase +ajU +ajU +ajU +aBE +abN +aVJ +apK +aBm +aVJ +apK +aQy +akW +aDA +aJA +aZO +alz +aqy +aHb +aqy +aqy +aqy +afk +aqy +aFl +aXr +aXr +aXr +aXr +aXr +akW +aIN +aZc +aoE +are +azo +azo +azo +azo +azo +aEk +aXr +aXr +aXr +aNL +aYl +agd +agd +aNt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGQ +aQJ +adh +adh +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(110,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +avF +aib +aib +aib +aib +aib +avF +aib +aib +aib +aib +aib +aib +avF +akW +aXr +aXr +aMC +aXr +aXr +akW +aQW +alp +apW +aYK +aVq +aQs +aso +lXz +aDy +aae +aae +apE +aEQ +amz +aRw +aRw +aYl +aYl +aQy +aQy +aDv +aDv +aDv +aQy +wCv +aQy +aDv +aDv +aDv +aQy +aQy +akW +aDA +aqZ +aoH +aMo +anI +aqy +aIT +anI +apg +aqy +aqy +aFl +aXr +aXr +aXr +aXr +aXr +akW +aXr +awz +aoE +aDc +ack +azo +azo +arZ +aXc +lzq +aXr +aXr +aXr +adk +aYl +agd +agd +aNt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGQ +aZV +aem +aem +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aPI +aPI +aod +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(111,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +avF +aib +aib +aib +aib +aib +avF +aib +aib +aib +aib +aib +aib +avF +akW +aXr +aXr +aMC +aXr +aXr +akW +aQW +aRC +aYK +aYK +aYK +aPh +aae +aae +aDy +aae +aae +any +aEQ +aJl +aJl +aJl +aYl +akW +akW +akW +akW +akW +akW +aUk +akW +akW +akW +akW +akW +akW +akW +akW +akW +akW +akW +akW +awu +awu +awu +awu +awu +awu +awu +akW +aIy +aXr +aXr +aXr +aIy +akW +aXr +awz +aUp +aUp +aUp +aUp +aoE +asq +asq +aUp +aWu +aSz +aSz +aWu +aYl +agd +agd +aNt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aBx +aml +atf +aLz +aGV +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aGj +anl +anl +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(112,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +avF +aib +aib +aib +aib +aib +avF +aib +aib +aib +aib +aib +aib +avF +akW +aXr +aMC +aMC +aMC +aXr +akW +aQW +atl +aYK +aYK +akz +aQs +azc +aay +aae +aae +aFo +aae +aZL +aJl +aJl +aDb +aYl +akW +aPM +aIy +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aIy +aHC +aIy +aXr +aIy +aHC +akW +aXr +agU +aoE +adN +aYi +abv +aoE +aUn +aUn +aUp +aUp +aUp +aUp +aUp +aUp +agd +agd +aNt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +atf +aXo +aXo +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aPI +aPI +aPI +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(113,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +avF +aib +aib +aib +aLg +aLg +aLg +aLg +aLg +aLg +aLg +aLg +aLg +aLg +aPA +aXr +aMC +aMC +aMC +aXr +aXO +aQW +aHk +aWW +aYL +afB +aQs +azi +aCw +lXz +azw +ajj +aOf +aEQ +aJl +aJl +aJl +aYl +akW +aIy +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aIy +aXr +agZ +aXr +aIy +akW +aXr +aUx +aoE +ajM +acX +acX +aeI +acX +acX +aTM +ago +acX +acX +amY +aUp +agd +agd +aNt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +amr +aQK +atf +ayD +aRs +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(114,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aRw +aJl +aJl +aJl +acY +aJl +ako +aJl +ako +aJl +ako +aJl +ako +acY +akW +aIy +aMC +aMC +aMC +aIy +akW +aEQ +aEQ +aEQ +aEQ +aEQ +aQs +ajO +avA +aGA +aEQ +aEQ +aEQ +aEQ +aJl +aJl +aDb +aYl +akW +aXr +aXr +aMC +aMC +aaB +auC +akW +auC +aaB +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aXr +aXr +agZ +aIl +aXr +aXr +akW +awn +aMR +aoE +afx +acX +ajM +aoE +aUe +ajM +abH +acX +acX +ago +awm +aUp +agd +agd +aNt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aGt +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGQ +aZV +aem +aem +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(115,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aRw +aJl +aJl +aJl +awT +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +asy +akW +aHC +aIy +aXr +aIy +aHC +akW +aak +ajF +aEm +aEm +aEm +aEQ +aEQ +aEQ +aEQ +aEQ +auQ +auQ +aRw +aJl +aJl +aJl +aYl +akW +aXr +aXr +aMC +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aIy +aXr +aXr +aXr +aIy +akW +aNL +aNL +aoE +aZt +aBC +ahB +aoE +aby +arO +aTM +afe +aCL +aWb +ajb +aUp +agd +agd +aNt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aGt +aGt +aho +aBz +aho +aBz +aho +aPO +aho +aGt +aho +aGQ +aQJ +adh +adh +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(116,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aRw +aJl +aJl +aJl +acY +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +acY +abf +abf +abf +abf +abf +abf +aFQ +abf +aqD +abf +abf +abf +aAM +abf +abf +abf +aRw +auQ +auQ +aRw +aJl +aJl +aDb +aYl +akW +aXr +aXr +aMC +aXr +aHC +aRS +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aHC +aIy +aXr +aIy +aHC +akW +aIN +aZc +aUp +aUp +aUp +aUp +aUp +aUp +aUp +aUp +aUp +aUp +aUp +aUp +aUp +agd +agd +aNt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aGt +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGQ +aZV +aem +aem +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aHe +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(117,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aRw +aJl +aJl +aJl +acY +acY +cLl +cLl +cLl +cLl +cLl +cLl +cLl +aVG +aLU +aLU +abf +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +abf +aRw +aJl +aJl +aJl +aJl +aJl +aJl +aYl +akW +aXr +aXr +aMC +aXr +aIy +akW +akW +akW +akW +akW +akW +akW +aSH +akW +aXr +akW +aOV +akW +akW +akW +aOV +akW +akW +akW +akW +aOV +akW +akW +akW +akW +akW +akW +aXr +aXr +aYl +agd +agd +agd +agd +agd +agd +agd +agd +agd +agd +agd +aap +agd +agd +aNt +ahD +aCV +ahD +aCV +ahD +aCV +ahD +aGt +aHl +aGt +ahD +aCV +ahD +aCV +ahD +aCV +ahD +aCV +ahD +aGQ +aaW +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aeS +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +afj +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(118,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +awT +aJl +aJl +aJl +aJl +aJl +cLl +sqE +aJm +anV +pAs +sjB +cLl +apa +aLU +aLU +abf +apa +apa +aDQ +aLC +aLC +auG +apa +apa +aea +aLC +aLC +aAv +abf +aUF +aJl +aJl +aWV +aJl +aJl +aJl +aYl +aPA +aXr +aXr +aMC +aXr +aXr +akW +agq +agq +agq +agq +agq +agq +agq +aJg +aXr +akW +aYl +aYl +aYl +aRi +aAx +aLk +aLk +aLk +aLk +aRi +aRi +uGY +uGY +jVB +lav +kpL +kpL +kpL +kpL +ajk +aFS +agd +agd +adl +aRa +aml +aRa +aml +aRa +aml +aRa +aml +aRa +ahC +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aGt +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGQ +agd +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(119,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +awT +aJl +aJl +aJl +aJl +aJl +cLl +cLl +cLl +kmc +anV +anV +cLl +apa +aLU +aLU +abf +apa +apa +aea +aLC +aLC +auG +apa +apa +aDQ +aLC +aLC +ajh +abf +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +akW +aXr +aXr +aMC +aXr +aXr +akW +agq +ahv +agq +aiR +agq +anV +mys +aXr +aXr +akW +aKL +aJL +aJL +aAx +aCv +aLk +anh +aLk +aLk +ajw +qae +xRE +lBR +uGN +aqI +ifk +xmh +ifk +kpL +ajk +aFS +agd +agd +aNt +aho +aBz +aho +aRx +aho +aGt +aho +aRx +aho +aGt +aho +aTs +aho +aTs +aho +act +aho +aGt +aGt +aGt +aho +act +aho +aGt +aho +aRx +aho +aGt +aho +aGQ +agd +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(120,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aRw +aJl +aJl +aJl +aJl +aJl +cLl +sqE +aJm +anV +ebf +anV +mys +apa +aLU +aLU +abf +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +abf +akW +akW +akW +akW +akW +akW +aUk +akW +akW +aIy +aXr +aMC +aXr +aXr +akW +agq +auq +agq +auq +agq +anV +agq +akW +aXr +akW +aYl +aJL +aJL +aAx +amF +aLk +aLk +aLk +aLk +ajw +qae +xRE +ifk +ifk +ifk +ifk +ifk +ifk +kpL +aLE +aLE +aLE +aLE +aNt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aGt +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGQ +agd +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(121,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aRw +aJl +aJl +aJl +aJl +aJl +cLl +cLl +cLl +cLl +cLl +cLl +cLl +apa +aLU +aLU +abf +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +abf +aHC +aIy +aXr +aXr +aTb +aXr +aXr +aXr +aIy +aHC +aXr +aMC +aXr +aXr +akW +agq +anV +akp +anV +anV +anV +agq +akW +aXr +akW +aYl +aoJ +axb +aAx +aCo +aLk +aLk +aLk +fxB +aLk +qae +xRE +ifk +ifk +ifk +jtP +drk +ifk +kpL +aRd +aml +aml +aml +ahC +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGQ +agd +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aHe +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(122,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aRw +aJl +aJl +aJl +aJl +aJl +cLl +sqE +aJm +anV +pAs +anV +mys +apa +aLU +aLU +abf +apa +apa +aDQ +aLC +aLC +ajh +apa +apa +aDQ +aLC +aLC +aAv +abf +aIy +aMC +aMC +aMC +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aMC +aXr +aXr +akW +agq +anV +anV +anV +akp +anV +agq +aPA +aXr +akW +aYl +aJL +aRw +aAx +amu +aed +arh +aLk +aLk +aMQ +qae +pmd +oQx +uGu +ifk +gTj +baf +ifk +kpL +aBO +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGQ +agd +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(123,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aRw +aJl +aJl +aJl +aJl +aJl +cLl +cLl +cLl +kmc +anV +anV +cLl +aVG +aTP +aLU +abf +apa +apa +aea +aLC +aLC +ajh +apa +apa +aea +aLC +aLC +ajh +abf +aXr +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aMC +aXr +aXr +akW +agq +aYj +afp +afp +afp +aJO +agq +akW +aXr +akW +aYl +aJL +aXh +aAx +aQM +aAI +arh +aLk +aLk +aLk +qae +oqv +dTh +yfx +ifk +ifk +ifk +ifk +kpL +toY +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGQ +agd +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(124,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aRw +aJl +aJl +aJl +aJl +aJl +cLl +sqE +aJm +anV +ebf +sjB +cLl +aUC +aLU +aLU +abf +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +abf +aIy +aMC +aMC +aMC +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aIy +akW +agq +agq +agq +agq +agq +agq +agq +aMi +aXr +akW +aRi +aRi +aRi +aAx +aMj +aAI +ayB +aLk +aLk +aLk +qae +mws +xrs +qtc +ifk +ifk +ifk +ifk +kpL +ava +aQK +aQK +aQK +aTE +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGQ +agd +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(125,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aRw +acl +aJl +aJl +aJl +aJl +cLl +cLl +cLl +cLl +cLl +cLl +cLl +aRK +aLU +aLU +abf +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +abf +aHC +aIy +aXr +aXr +aTb +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aIy +aHC +akW +agq +asQ +agq +asQ +agq +anV +mys +aXr +aXr +akW +apQ +azB +aDJ +alR +aAI +aAI +arh +aLk +aLk +aLk +aRi +jVB +jdP +jVB +buD +efX +gyy +ifk +kpL +aLE +aLE +aLE +aLE +aNt +aGt +aGt +aGt +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aGt +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGQ +agd +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +afj +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(126,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aRw +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aVG +aSU +aLU +aLU +abf +apa +apa +aDQ +aLC +aLC +ajh +ajF +ajF +aNj +aLC +aLC +aAv +abf +akW +akW +akW +akW +akW +akW +aOV +akW +akW +akW +akW +akW +aOV +akW +akW +agq +auq +agq +aeG +agq +anV +agq +avs +aXr +akW +apQ +aQT +aOM +ajz +axA +aAI +atp +aLk +aLk +aLk +hdo +stw +jQE +kpL +kpL +kpL +kpL +kpL +kpL +agd +agd +adl +aml +ahC +aGt +aGt +aGt +aGt +aho +aGt +aho +aBz +aho +aGt +aho +aBz +aho +aBz +aho +aGt +aho +aGt +aGt +aGt +aho +aGt +aho +aRx +aho +aje +aho +aGt +aho +aGQ +agd +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(127,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aRw +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aVG +aUC +aLU +aLU +abf +apa +apa +aDQ +aLC +aLC +aAv +ajF +ajF +aNj +aLC +aLC +ajh +abf +aYl +aYl +aYl +aYl +aYl +wJt +aYl +wJt +aYl +aYl +aYl +aYl +lDl +wNa +wNa +agq +anV +anV +anV +anV +anV +aGP +aWM +aWM +aWM +aGP +apQ +aRI +aZX +adP +aAI +aKe +aLk +aLk +mGY +hdo +okM +rne +bkw +lBO +hTH +tSb +vzM +kpL +gWV +agd +aNt +aGt +aGt +aGt +aGt +aGt +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aGt +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGQ +agd +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(128,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aRw +aJl +aJl +aJl +asb +asb +asb +asb +asb +asb +asb +aJl +aVG +aRK +aLU +aLU +abf +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +abf +aYl +hRX +vsC +hXE +akW +akW +aUk +akW +akW +akW +aUk +vSo +lDl +aiH +aBo +agq +akp +anV +anV +anV +anV +aGP +asL +asL +asL +aGP +aRi +aRi +aRi +aRi +aRi +aRi +aAx +eXm +aRi +hdo +hnO +eRr +eRr +eRr +eRr +rGI +jJP +kpL +agd +agd +aNt +aGt +aGt +aGt +aGt +aHl +aGt +ahD +aCV +ahD +aCV +ahD +aCV +ahD +aCV +ahD +aCV +ahD +aCV +ahD +aGt +aHl +aGt +ahD +aCV +ahD +aCV +ahD +aCV +ahD +aCV +ahD +aGQ +aaW +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(129,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aRw +aJl +aJl +aJl +aJE +aSn +ajX +aXu +aSu +aIe +asb +asb +asb +asb +aNe +aLU +abf +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +abf +aYl +nAq +aDA +lyX +aDA +aDA +aDA +aDA +aDA +aDA +aDA +akW +ikv +aBo +aBo +agq +aQO +afp +afp +afp +awA +aGP +asL +asL +asL +aYO +afc +aSj +aSj +aSj +aSj +aSj +aAx +aRv +aAI +hdo +fMu +eRr +uBf +eRr +eRr +eRr +fSa +kpL +gWV +agd +aNt +aGt +aGt +aGt +aGt +aGt +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aGt +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGQ +aZV +aem +aem +aNg +aXo +aeS +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aHe +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(130,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aRw +aJl +aJl +aJl +aJE +axS +aSu +aSu +aSu +apT +avr +aZb +ajR +aoV +aLU +aLU +abf +apa +apa +aNj +aLC +aLC +aAv +apa +apa +aea +aLC +aLC +aAv +abf +aYl +tna +eeN +gqY +veF +uLP +aDA +aDA +uLP +aDA +aDA +hBm +qbw +akE +akE +agq +agq +agq +agq +agq +agq +aGP +aGP +aGP +aGP +aYO +alf +aAI +aAI +aAI +aAI +aua +aAx +aZZ +axt +aRi +jjQ +jjQ +jjQ +jjQ +jjQ +jjQ +jjQ +jjQ +agd +agd +aNt +aGt +aGt +aGt +aGt +aGt +aGt +aho +act +aho +aGt +aho +aRx +aho +aRx +aho +aGt +aho +aGt +aho +aGt +aGt +aGt +aho +aTK +aho +aGt +aho +aGt +aho +aGt +aho +aGQ +aQJ +adh +adh +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(131,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aRw +aJl +aJl +aJl +aJE +aPN +aSu +aTH +aSu +afQ +avr +aMn +awe +akq +aLU +aLU +abf +apa +apa +aNj +aLC +aLC +aAv +apa +apa +aea +aLC +aLC +aAv +abf +aYl +izc +aDA +lyX +aDA +aDA +jFU +jFU +aDA +aDA +aDA +hBm +fGB +aag +aag +asN +yfF +aLL +aos +afl +aAG +aZI +aMq +aIV +aJe +aiK +ann +ann +ann +apJ +ann +ann +aAx +asP +aAI +apQ +hIc +soC +rvt +udy +whm +fgJ +hnS +jjQ +pcJ +pcJ +aNt +aGt +aGt +aGt +aGt +aGt +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aGt +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGQ +aZV +aem +aem +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(132,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aRw +axN +aJl +aJl +aJE +aVe +aSu +aTH +aSu +afQ +aRX +aQa +aKq +aUr +aLU +aLU +abf +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +abf +aYl +iUQ +aDA +lyX +aDA +aDA +jFU +jFU +aDA +aDA +aDA +hBm +lDl +iaz +aIK +aIK +aIK +aIK +aIK +aIK +aIK +aIK +aTm +aqc +aaY +aiK +aAI +aAI +aAI +bzR +aAI +aAI +aAx +alf +aAI +apQ +tRQ +xpz +xpz +lEt +fJW +wnk +vHC +mFb +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aBx +aml +atf +aLz +aGV +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aeS +aXo +aDd +aHe +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(133,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aRw +aFM +asb +atF +aJE +aoZ +aSu +aTH +aSu +aew +aRX +aVc +aPw +aIn +aLU +aLU +abf +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +abf +aYl +iAN +aDA +aDA +aDA +aDA +jFU +jFU +aDA +aDA +aDA +hBm +lDl +nqd +aIK +ajG +ajG +ajG +ajG +aIK +aIK +aIK +aIK +aRU +aRU +aiK +ann +ann +ann +apJ +ann +ann +aAx +aLa +aAI +apQ +wHz +xpz +xpz +xpz +fJW +vHC +tAm +mFb +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +atf +aXo +aXo +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aeS +aXo +alB +aXo +aXo +aDd +aYG +aYG +afj +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(134,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +amn +aSu +aSu +aSu +aSu +aSu +aSu +aSu +aew +aJE +ajE +abW +aMV +aLU +aLU +abf +apa +apa +aDQ +aLC +aLC +auG +apa +apa +aea +aLC +aLC +ajh +abf +aYl +iAN +duz +aDA +aDA +aDA +jFU +jFU +aDA +aDA +aDA +hBm +lDl +bPq +aIK +aOb +arX +adK +aBt +rus +aIK +aIK +aIK +aIK +aUj +aiK +alf +aAI +aAI +bzR +aAI +aua +aAx +aAI +aAI +apQ +foj +cdr +xpz +taO +bVB +hzk +ykT +jjQ +pAp +pAp +aNt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aho +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +amr +aQK +atf +ayD +aRs +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +afj +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(135,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +amn +aZq +aSu +aSu +aSu +aSu +aSu +aSu +aSu +aJE +aPv +atw +aBT +aLU +aLU +abf +apa +apa +aea +aLC +aLC +auG +apa +apa +aea +aLC +aLC +aAv +abf +aYl +aYl +aYl +aYl +aDA +uLP +aDA +aDA +uLP +aDA +aDA +hBm +lDl +aBY +aIK +ajG +ajG +ajG +ajG +aIK +aQm +aYy +aVu +aHD +aYy +aiK +ann +ann +ann +apJ +ann +ann +aAx +aja +aAI +ilt +feh +xpz +xpz +fwG +paE +xpz +tey +jjQ +agd +agd +aNt +aho +aBz +aho +aGt +aho +aGt +aho +aBz +aho +aGt +aho +aGt +aho +aPO +aho +aBz +aho +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGt +aGQ +agd +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(136,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +amn +aBe +aSu +acG +arY +aSu +aSu +aSu +aSu +aAX +avO +anH +asb +aLU +aLU +abf +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +apa +abf +aYl +awB +awB +aDA +aDA +aDA +aDA +aDA +aDA +aDA +aDA +hBm +lDl +abK +aIK +aIK +aIK +aIK +aIK +aIK +kpP +aOj +aOj +aOj +aSF +aiK +ajS +aAI +aAI +aAI +aAI +aAI +aAI +aAI +aAI +wKZ +wwh +xpz +xpz +tey +xpz +tey +xpz +nRx +agd +agd +aoB +aKH +aQK +aKH +aQK +aKH +aQK +aKH +aQK +aKH +aQK +aKH +aQK +aKH +aQK +aKH +aQK +aKH +aQK +aQK +aQK +aQK +aQK +aQK +aQK +aQK +aQK +aQK +aQK +aQK +aQK +aQK +alh +agd +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +afj +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(137,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +amn +aNo +aSu +afr +aGI +aSu +atz +atz +apu +asb +aNm +akb +gjo +abf +abf +abf +abf +abf +abf +abf +abf +aUM +abf +abf +abf +abf +abf +abf +abf +aYl +awB +emu +akW +akW +akW +aOV +akW +akW +hBm +xBq +hBm +lDl +aHQ +aIK +aBY +aBY +aJb +aBY +aBY +awU +acd +aOj +aOj +aQv +aiK +adW +adW +adW +adW +adW +adW +aAI +aCA +aEg +apQ +lAO +xpz +xpz +wbJ +xpz +xpz +gXS +jjQ +agd +agd +agd +agd +agd +agd +aaW +agd +agd +agd +agd +agd +agd +agd +agd +agd +agd +agd +agd +agd +agd +agd +agd +aaW +agd +agd +agd +agd +agd +agd +agd +agd +agd +agd +agd +aaW +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +afj +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(138,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aFM +aFM +aFM +aFM +aFM +aFM +aFM +aFM +aFM +aFM +aFM +aFM +aFM +aYl +aPk +aPk +aPk +aPk +aPk +aPk +aYl +aYl +aPk +aPk +aPk +aPk +aPk +aPk +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aKo +aKo +aKo +aKo +aKo +aKo +aKo +aKo +aKo +aKo +aKo +aKo +aKo +aKo +aRi +aRi +aRi +aRi +aRi +aRi +aRi +aRi +aRi +aRi +jjQ +jjQ +jjQ +jjQ +jjQ +jjQ +jjQ +jjQ +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aoA +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(139,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aeR +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aeR +aFs +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +abl +aoy +aYG +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(140,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aGm +aqf +aHe +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +afj +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(141,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +aqf +aYG +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +afj +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(142,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +aqf +aYG +aYG +aYG +aNg +aXo +aXo +alB +aXo +aXo +aeS +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(143,1,2) = {" +aFc +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aqf +aYG +aHe +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(144,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aGm +aqf +aYG +aYG +aHe +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(145,1,2) = {" +aFc +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aqf +aPI +aPI +aPI +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aPI +aPI +aPI +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(146,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aqf +anl +anl +anl +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +anl +anl +anl +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(147,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aqf +aYG +aQw +aYG +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +aYG +aQw +afj +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(148,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +aQQ +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +aqf +aXZ +aXZ +aXZ +aNg +aXo +aXo +alB +aXo +aXo +aXo +aMO +aXo +aXo +aXo +alB +aXo +aXo +aDd +afj +aYG +aYG +aTg +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(149,1,2) = {" +aFc +aQQ +aQQ +aQQ +aQQ +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +adg +ayw +ayw +ayw +ayw +aDG +aDG +aDG +aDG +aDG +aDG +aDG +ayw +aDG +aDG +aDG +aDG +aDG +aDG +aDG +ayw +ayw +ayw +ayw +tMt +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aFc +"} +(150,1,2) = {" +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +"} + +(1,1,3) = {" +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +"} +(2,1,3) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(3,1,3) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +cLU +cLU +cLU +cLU +cLU +cLU +uuB +uuB +uuB +uuB +uuB +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(4,1,3) = {" +aFc +uuB +uuB +cLU +uuB +uuB +cLU +cLU +cLU +cLU +cLU +cLU +vAL +vAL +vAL +vAL +uuB +vAL +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(5,1,3) = {" +aFc +uuB +uuB +cLU +cLU +cLU +cLU +cLU +cLU +vAL +vAL +ahY +ahY +ahY +ahY +vAL +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(6,1,3) = {" +aFc +uuB +cLU +cLU +cLU +cLU +cLU +cLU +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(7,1,3) = {" +aFc +uuB +cLU +uuB +cLU +cLU +cLU +cLU +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(8,1,3) = {" +aFc +uuB +cLU +uuB +uuB +cLU +cLU +cLU +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(9,1,3) = {" +aFc +uuB +uuB +uuB +uuB +uuB +cLU +cLU +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(10,1,3) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +cLU +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(11,1,3) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(12,1,3) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(13,1,3) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(14,1,3) = {" +aFc +uuB +uuB +uuB +uuB +uuB +vAL +vAL +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(15,1,3) = {" +aFc +uuB +uuB +uuB +uuB +vAL +vAL +vAL +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(16,1,3) = {" +aFc +uuB +uuB +uuB +vAL +vAL +vAL +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(17,1,3) = {" +aFc +uuB +uuB +vAL +vAL +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(18,1,3) = {" +aFc +uuB +uuB +vAL +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(19,1,3) = {" +aFc +uuB +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(20,1,3) = {" +aFc +uuB +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(21,1,3) = {" +aFc +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(22,1,3) = {" +aFc +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(23,1,3) = {" +aFc +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(24,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(25,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(26,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(27,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(28,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(29,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(30,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(31,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(32,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(33,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(34,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(35,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(36,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(37,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +xEn +anZ +anZ +anZ +anZ +anZ +anZ +anZ +anZ +anZ +anZ +xBD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(38,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +rIb +arB +arB +arB +arB +arB +arB +arB +arB +arB +arB +lra +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(39,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +rIb +arB +arB +arB +arB +arB +arB +arB +arB +arB +arB +lra +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(40,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +rIb +arB +arB +arB +arB +arB +arB +arB +arB +arB +arB +lra +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(41,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +rIb +arB +arB +arB +arB +arB +arB +arB +arB +arB +arB +lra +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(42,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +rIb +arB +arB +arB +arB +arB +arB +arB +arB +arB +arB +lra +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(43,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +rIb +arB +arB +arB +arB +arB +arB +arB +arB +arB +arB +lra +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(44,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +rIb +arB +arB +arB +arB +arB +arB +arB +arB +arB +arB +lra +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(45,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +rIb +arB +arB +arB +arB +arB +arB +arB +arB +arB +hOS +eYT +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(46,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +xEn +rMN +arB +arB +arB +arB +arB +arB +arB +arB +arB +lra +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(47,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +rIb +arB +arB +arB +arB +arB +arB +arB +arB +arB +arB +lra +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(48,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +hXh +vix +vix +vix +vix +vix +vix +vix +vix +vix +vix +eYT +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(49,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(50,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(51,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(52,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(53,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(54,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aUq +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(55,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +asM +ahY +ahY +ahY +ahY +aAK +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(56,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aMl +ahY +ahY +ahY +ahY +aAK +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(57,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aMl +ahY +ahY +ahY +ahY +aAK +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(58,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aMl +ahY +ahY +ahY +ahY +aAK +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(59,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aMl +ahY +ahY +ahY +ahY +aAK +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(60,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +aSJ +aVm +adL +adL +awE +aXb +aVP +aOw +aVP +adv +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aWL +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aAF +aRq +asa +asa +avd +asa +asa +aKh +asa +asa +asa +asa +aOG +asa +asa +aNI +aXa +ami +axT +aAF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aMl +ahY +ahY +ahY +ahY +aAK +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(61,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +aJr +aaG +adL +adL +aWw +aXb +anW +anW +anW +adv +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aWL +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aAF +aRq +asa +asa +aRq +asa +asa +aAE +asa +asa +asa +asa +azL +aix +asa +atm +aKx +ayp +asU +aAF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aMl +ahY +ahY +ahY +ahY +aAK +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(62,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +adL +alb +adL +adL +ahe +aXb +anW +anW +anW +adv +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aWL +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aAF +aRq +asa +asa +aRq +asa +asa +aKh +aVI +aFW +ahf +aVI +azL +asa +asa +atm +aKx +aKx +aKx +aAF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aUK +ahY +ahY +ahY +ahY +aQq +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(63,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +aoN +anG +adL +adL +aMZ +aXb +anW +anW +anW +adv +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +acz +aJh +aJh +aJh +aJh +aJh +aWL +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aws +aws +oGX +oGX +oGX +oGX +oGX +aws +aws +aws +aAF +aaL +asa +asa +aRq +asa +asa +aKh +aVI +abO +abO +aVI +azL +asa +asa +aAF +aAF +aAF +aAF +aAF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(64,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +aJh +aJh +aXq +anW +aXb +aXb +anW +anW +anW +adv +aFu +aZo +aZo +aRk +aJh +aJh +aJh +aJh +acz +acz +acz +aJh +aJh +aJh +aWL +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aAF +alI +asa +asa +alI +asa +asa +aKh +aVI +abO +abO +aVI +azL +asa +asa +ktE +azL +aKK +aKK +aAF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(65,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +aJh +aJh +aXq +anW +aXb +anW +anW +anW +anW +anW +anW +aYQ +aYQ +afZ +aJh +aJh +aJh +aJh +acz +aJh +acz +aJh +aJh +aJh +aWL +oGX +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +arz +aws +arz +aws +arz +aws +arz +avF +arz +aws +arz +aws +aws +aws +aws +aws +aws +aws +aAF +asa +asa +asa +asa +asa +asa +aKh +aUl +aQe +anQ +aVI +azL +asa +aif +aiB +azL +aKK +aKK +aAF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(66,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +anW +anW +anW +anW +aXb +anW +anW +anW +anW +anW +anW +anW +auk +aBX +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aWL +oGX +aws +aws +oGX +oGX +oGX +oGX +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aAF +aeM +aeM +aeM +aeM +aiJ +asa +aAF +aAF +aAF +aAF +aAF +azL +asa +asa +asg +azL +asa +asa +aAF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(67,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +anW +anW +aqp +anW +aXb +anW +anW +anW +anW +anW +anW +anW +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aWL +oGX +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +arz +aws +arz +oGX +arz +aws +arz +avF +arz +aws +arz +oGX +aws +oGX +aws +aws +oGX +aws +aAF +aTh +aTh +aTh +aTh +ajo +asa +aHI +aKK +aKK +aKK +azL +aQo +asa +asa +asa +aZE +asa +asa +aAF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(68,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +aPn +aXb +aXb +aXb +aXb +anW +anW +anW +anW +anW +anW +anW +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aWL +oGX +aws +oGX +aws +oGX +oGX +oGX +oGX +aws +oGX +aws +arz +aws +arz +aws +arz +aws +arz +avF +arz +aws +arz +oGX +aws +aws +aws +aws +aws +oGX +aAF +age +auB +auB +aWD +ajo +asa +acQ +aKK +aKK +aKK +aHW +aVO +asa +asa +aUy +aUy +asa +asa +aAF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(69,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +anW +anW +anW +anW +anW +anW +anW +anW +anW +anW +anW +anW +aFu +aJS +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aWL +oGX +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aws +aws +aws +aws +aws +aws +aws +oGX +aws +aws +aAF +aWp +ajI +aKx +aKx +ajo +asa +acQ +aKK +aKK +aKK +aHW +aPx +asa +ajB +aqN +aqN +aiU +asa +aAF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(70,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +anW +anW +aOL +aOL +aOL +aOL +aZD +anW +anW +aOL +aOL +aOL +aOL +anY +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aWL +oGX +aws +aws +oGX +oGX +iHZ +aws +aws +aws +aws +aws +arz +aws +arz +oGX +arz +aws +arz +avF +arz +aws +arz +oGX +aws +oGX +aws +aws +oGX +aws +aAF +azX +ajI +aKx +haB +ajo +asa +abC +aKK +aKK +aKK +azL +aZA +asa +aWt +aqN +aqN +aWl +asa +aAF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(71,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +anW +anW +aOL +aOL +aOL +aOL +aZD +anW +anW +aOL +aOL +aOL +aOL +anY +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aWL +oGX +aws +oGX +oGX +aws +iHZ +iHZ +iHZ +iHZ +oGX +oGX +aws +aws +aws +aws +oGX +aws +aws +avF +oGX +aws +aws +aws +aws +aws +aws +aws +oGX +oGX +aAF +azX +ajI +aKx +aKx +ajo +asa +aYt +aKK +aKK +aKK +aAF +azL +aix +ajB +aqN +aqN +aiU +aDC +aAF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(72,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +anW +anW +anW +anW +anW +anW +anW +anW +anW +anW +anW +anW +anW +anY +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aJh +aWL +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +oGX +aws +aws +aws +aws +aws +aws +aws +aws +aws +aAF +aTh +aTh +aTh +auA +ajo +asa +asa +aKK +aHd +aKK +aKK +azL +aXn +aWt +aqN +apV +aWl +asa +aAF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(73,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +anW +anW +aqp +anW +anW +anW +anW +aqp +anW +anW +anW +anW +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +azv +azv +azv +mwU +azv +azv +azv +avF +avF +avF +avF +azv +azv +azv +mwU +azv +azv +azv +avF +azv +azv +azv +mwU +azv +azv +azv +avF +avF +avF +aAF +aAF +aAF +aAF +aAF +aAF +dGP +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +aAF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(74,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aWL +aXr +aXr +aXr +amZ +aXr +aDe +aXr +aXr +aXr +aXr +aXr +amZ +aXr +aXr +aXr +aXr +aXr +aXr +aXr +amZ +aXr +aXr +amZ +aXr +aXr +aXr +aXr +aXr +aXr +aXr +amZ +aXr +aXr +aXr +aXr +aXr +aXr +aXr +amZ +aXr +aXr +amZ +aXr +aXr +aXr +aXr +aXr +aXr +aXr +amZ +aXr +aXr +aXr +aXr +aXr +aXr +aXr +amZ +aAO +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(75,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aws +aAs +agw +agw +aVy +aws +aws +aws +aws +aws +aws +aws +avF +aXr +axv +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aLl +aXr +aqT +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aba +aXr +aXr +amb +aDz +aAu +aAf +aIh +aQF +aWm +aAf +aIh +aQF +aWm +aAf +aIh +avF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(76,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aws +aAs +agw +agw +aVy +aws +aws +aws +aws +aws +aws +aws +avF +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aQg +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aol +adm +alE +aVZ +aVs +amP +amc +aVZ +aVs +amP +amc +aVZ +aVs +avF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(77,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aKA +aAs +agw +agw +aVy +aws +aws +aws +avi +avi +avi +asp +avF +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aNl +aTb +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aol +adm +aCX +aXe +aXe +aXe +aXe +aXe +aXe +aXe +aXe +aXe +aXe +avF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(78,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aws +aws +aws +aws +aws +aws +aws +aws +avi +avi +avi +asp +avF +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aol +adm +aCX +aXe +aXe +aXe +aXe +aXe +aXe +aXe +aXe +aXe +aXe +avF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(79,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aXr +aPG +awB +awB +awB +aGz +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aPX +aXr +adT +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aqg +awB +awB +awB +ayr +aXr +aXr +aol +adm +aVZ +aXe +aXe +ark +aVZ +aVZ +aVZ +aVZ +ark +aXe +aXe +avF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(80,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aXr +aPG +awB +awB +awB +ayr +aTb +aXr +aXr +aXr +aXr +aTz +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aTz +aXr +aXr +aTz +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aTz +aXr +aXr +aXr +aXr +aXr +aXr +aTz +aXr +aXr +aTz +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aTz +aXr +aPG +awB +awB +awB +ayr +aXr +aXr +aol +adm +aVZ +aXe +aXe +ark +aVZ +aCX +abA +aVZ +ark +aXe +aXe +avF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(81,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +atW +avi +avi +avi +avi +aws +aws +aws +avi +avi +avi +asp +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +aXr +aXr +alJ +alJ +mpc +alJ +aMX +aMX +aMX +aMX +aMX +alJ +avF +tUy +avF +azv +azv +avF +avF +avF +avF +avF +fVR +azv +azv +azv +azv +azv +avF +avF +aXr +aPG +awB +awB +awB +ayr +aXr +aXr +amb +aDz +abw +aXe +aXe +ark +aVZ +aCX +aCX +aVZ +ark +aXe +aXe +avF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(82,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +atW +avi +avi +avi +avi +aws +aws +aws +avi +avi +avi +asp +avF +ahq +aPG +awB +awB +awB +ayr +aSv +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +asd +asd +aLi +aWC +aAd +aAn +aER +aER +aER +aER +aER +alJ +aCO +aLx +aTn +aLx +aLx +aLx +acp +avW +aZp +aCX +aCX +aBf +aBf +aIO +awF +aRM +aEP +avF +aXr +aPG +awB +awB +awB +ayr +aXr +aXr +aXr +otF +aXe +aXe +aXe +ark +aVZ +aCX +aCX +aaK +awX +aXe +aXe +avF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(83,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +aLi +ajD +abV +aAn +aER +ayK +aER +ayK +aER +alJ +aAc +aLx +aLx +aIt +aax +aLx +agD +avW +aZp +aCX +aCX +abx +abx +abx +aXK +aVS +aVS +avF +aXr +aPG +awB +awB +awB +ayr +aXr +aXr +aXr +otF +aXe +aXe +aXe +ark +aVZ +aCX +aCX +aCX +aXe +aXe +aXe +avF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(84,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +aLi +axM +abV +aAn +aER +aER +aER +aER +aYq +alJ +aiS +aLx +aLx +aQd +aax +aLx +aIv +avW +aYh +aCX +aCX +abx +abx +abx +abx +abx +abx +avF +aXr +aPG +awB +awB +awB +ayr +aXr +awz +aUx +aDz +anf +aXe +aXe +aCm +aCT +aCX +aCX +aVW +aXe +aXe +aXe +avF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(85,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +adI +ajL +ajL +ajL +ajL +aws +aws +aws +avi +avi +avi +asp +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +aLi +abV +abV +aAn +aER +ayK +aER +ayK +aER +alJ +aya +aLx +aLx +aLx +aLx +aLx +aCO +avW +aPc +arc +ajv +abx +abx +abx +abx +abx +abx +avF +aXr +aPG +awB +awB +awB +ayr +aKm +aYl +aYl +aDz +ayy +avy +avy +avF +avF +aDz +asl +aDz +avy +avy +ayy +avF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(86,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +adI +ajL +ajL +ajL +ajL +aws +aws +aws +avi +avi +avi +asp +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +aLi +abV +abV +awI +aER +aER +aER +aER +aER +alJ +aEh +aLx +aLx +aax +aEV +aLx +aCO +avW +aFw +aCX +ajv +abx +abx +abx +abx +abx +abx +avF +aXr +aPG +awB +awB +awB +ayr +aPG +awB +awB +aDz +avY +aVZ +aIh +aDz +aOz +aCX +aCX +aDz +aAu +aVZ +acg +avF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(87,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +aLi +aOk +alJ +aLi +ayK +aEF +ayK +aiZ +ayK +alJ +aPQ +aFi +aFi +aQj +aax +aLx +aCO +avW +aCX +aCX +aJI +abx +aBf +aBf +aCJ +apd +aWg +avF +aXr +aPG +awB +awB +awB +ayr +aPG +awB +awB +aDz +alE +aVZ +aVs +aDz +ayQ +aCX +aCX +aDz +alE +aVZ +aVs +avF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(88,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +asG +aJl +aLi +abV +aYY +alJ +aBL +alJ +alJ +alJ +alJ +alJ +avF +aaN +aWH +avF +avF +aAC +avF +avF +aPT +avF +avF +avF +avF +avF +avF +avF +avF +avF +aXr +aPG +awB +awB +awB +ayr +aPG +awB +awB +avF +aUS +aUS +aUS +aDz +acN +aCX +adJ +avF +aUS +aUS +aUS +avF +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(89,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aFG +aNF +aNF +aNF +aNF +aws +aws +aws +aNF +aNF +aNF +aiE +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +aLi +aZk +abV +aUt +amO +aCx +aKP +alJ +aKt +aCX +ays +aYV +aCX +aXS +aMS +aCX +apq +aJl +aJl +aJl +avb +avF +aAV +aAV +aAV +aAV +aAV +arb +aXr +aPG +awB +awB +awB +ayr +aPG +awB +awB +awB +awB +awB +awB +aYl +aYl +aYl +aYl +aYl +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(90,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aFG +aNF +aNF +aNF +aNF +aws +aws +aws +aNF +aNF +aNF +aiE +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +avF +avF +avF +avF +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +aLi +abV +aLj +aKr +atE +abV +aEj +alJ +aNV +aCX +aCX +aXw +aUH +aCX +aCX +aCX +avF +akF +aJl +aEa +aYA +avF +aAV +aAV +aAV +aAV +aAV +agK +aXr +aPG +awB +awB +awB +ayr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(91,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aXr +aPG +awB +awB +awB +ayr +aXr +aws +aws +aws +aws +avF +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +aLi +abV +abV +abV +apH +abV +anC +alJ +aLd +alj +aCX +aWh +aAP +aCX +aUO +aCX +avF +aIM +aJl +aIk +aCu +avF +aAV +aAV +aCX +aCX +aCX +avF +aXr +aPG +awB +awB +awB +ayr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(92,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aXr +aPG +awB +awB +awB +ayr +aqT +wFu +wFu +aws +aws +avF +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +alJ +alJ +alJ +alJ +alJ +alJ +alJ +alJ +avF +avF +aZN +aCX +aCX +aCX +aCX +aCX +avF +azq +aJl +avF +avF +avF +aAV +aAV +aCX +aCX +aCX +avF +aXr +aPG +awB +awB +awB +ayr +adT +aOa +aOa +aOa +akB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(93,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aFG +aNF +aNF +aNF +aNF +aws +aws +aws +aNF +aNF +aNF +aiE +avF +aXr +aPG +awB +awB +awB +ayr +aPG +agw +agw +aws +aws +avF +aws +aws +aws +aws +aws +aws +aws +avF +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +avF +aZN +ahm +aHN +aAu +aiM +ahX +avF +aJl +aJl +avF +aCX +aCX +aAV +aAV +aCX +aCX +aCX +avF +aXr +aPG +awB +awB +awB +ayr +aXr +aXr +aXr +azK +aJM +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(94,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aFG +aNF +aNF +aNF +aNF +aws +aws +aws +aNF +aNF +aNF +aiE +avF +aXr +aPG +awB +awB +awB +ayr +aPG +agw +agw +aws +aws +avF +aws +aws +aws +aws +aws +aws +aws +avF +acl +aJl +arf +anF +adi +aJl +aJl +aJl +aJl +aJl +aCS +avF +auO +aWE +aEf +aPY +aeD +aHO +avF +aJl +aJl +avF +aCX +aCX +aAV +aAV +aCX +aCX +aCX +avF +aXr +adT +aDP +aqA +aOa +aPX +aXr +aXr +aXr +axs +aJM +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(95,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +ahq +aPG +awB +awB +awB +ayr +tJW +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +asG +aqR +aRw +aGi +aCS +aRw +aRw +aRw +aRw +aJl +aJl +avF +avF +avF +avF +avF +avF +avF +avF +aJl +aJl +avF +avF +avF +avF +avF +avF +avF +avF +avF +ahq +aXr +aXr +aXr +aXr +aXr +aXr +aZg +aXr +aXr +aJM +awB +awB +awB +awB +awB +awB +awB +awB +awB +aOm +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(96,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aXr +aPG +awB +awB +awB +ayr +aXr +aXr +awT +aJl +aJl +aJl +aqj +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +ajT +aJl +aJl +apz +auQ +auQ +aRw +asG +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +awT +aXr +aXr +aqT +aDn +aDn +aDn +aLl +aXr +aXr +aXr +azK +aJM +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(97,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aFG +aNF +aNF +aNF +aNF +aws +aws +aws +aNF +aNF +aNF +aiE +avF +aXr +aPG +awB +awB +awB +ayr +aXr +aXr +awT +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +apz +auQ +auQ +aRw +apn +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aJl +aqY +aJl +aJl +aJl +aJl +aJl +aJl +aJl +awT +aXr +aXr +aPG +awB +awB +awB +ayr +aXr +aXr +aXr +axs +aJM +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(98,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aFG +aNF +aNF +aNF +aNF +aws +aws +aws +aNF +aNF +aNF +aiE +avF +ahq +aPG +awB +awB +awB +ayr +aSv +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +avF +acD +acD +acD +acD +acD +acD +acD +auQ +auQ +auZ +auZ +auZ +arD +auZ +auZ +auZ +auZ +auZ +auZ +auZ +auZ +atJ +atJ +aTI +atJ +atJ +atJ +atJ +atJ +atJ +atJ +ahq +aPG +awB +awB +awB +ayr +aqT +aDn +aDn +aDn +aUm +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(99,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +acD +aFK +alH +azk +aeg +aNh +acD +auQ +auQ +aDN +aLP +pxB +aQl +aOl +aQl +aQl +aQl +aRR +aRH +aFC +auZ +aZy +aZy +afT +atr +afT +atr +afT +atr +afT +atJ +aXr +aPG +awB +awB +awB +ayr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(100,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +acD +aCN +uHj +arM +arQ +amQ +acD +aJl +aJl +aDN +awM +aqi +aFB +aDN +aiP +aVi +aQl +aQl +aQl +aQl +auZ +aYk +aZy +afT +atv +afT +atv +afT +atv +urj +atJ +aXr +aPG +awB +awB +awB +ayr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(101,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +avF +avF +avF +aPZ +avF +aLI +aws +aws +avF +avF +avF +avF +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +acD +aeJ +ahn +arM +arQ +aKg +acD +acD +lWC +acD +auZ +auZ +auZ +aDN +nUH +aFe +awC +aFz +xjy +aQl +auZ +aZy +aPH +aZy +aZy +aZy +aZy +aZy +aZy +aZy +dMM +aXr +aPG +awB +awB +awB +ayr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(102,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +aib +aib +avF +aPy +aws +aws +abz +aBg +ahh +ahh +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +acD +aiz +ahn +arM +arQ +arQ +aCt +aPq +afg +agO +aIG +aNQ +aJK +auZ +auZ +aDN +aED +aLB +aDN +aMk +auZ +aZy +aZM +aZy +aZy +aZy +aZy +aZy +aZy +aRj +dMM +aXr +aPG +awB +awB +awB +ayr +adT +aOa +aOa +aOa +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(103,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +aib +aib +avF +aPy +aws +aws +abz +aws +aws +aws +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +acD +aiY +amJ +arM +arQ +arQ +arQ +arQ +arQ +agO +azs +aQl +aLu +aDN +aQl +aRR +aQl +aQl +aQl +aQl +auZ +aYk +aZy +afT +atr +afT +atr +afT +atr +urj +atJ +aXr +aPG +awB +awB +awB +ayr +aXr +aXr +aXr +aXr +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(104,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +aib +aib +avF +agA +aws +aws +aBD +aws +aws +aYN +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +acD +aGh +alH +alo +arQ +arQ +amU +arQ +aoS +agO +aQl +aQl +aQl +aOl +aQl +aQl +aQl +aQl +aQl +aQl +auZ +aZy +aZy +afT +atv +afT +atv +afT +atv +afT +atJ +aXr +aPG +awB +awB +awB +ayr +aXr +aXr +aXr +aXr +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(105,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +aib +aib +avF +aPy +aws +aws +avF +avF +avF +avF +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +acD +acD +acD +acD +arQ +acD +acD +acD +acD +acD +auZ +auZ +auZ +auZ +aDN +acW +aQl +aQl +aQl +acW +auZ +auZ +atJ +alZ +atJ +atJ +atJ +atJ +atJ +ayW +atJ +aXr +aPG +awB +awB +awB +ayr +aSv +aYl +aYl +aUp +aUp +aUp +aUp +aUp +aUp +aUp +aUp +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(106,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +aib +aib +avF +aPy +aws +aws +abz +aBg +ahh +ahh +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +acD +arQ +atN +aze +aYe +ang +aDu +axK +afC +amf +agL +aDN +acW +aQl +aQl +aQl +acW +acW +auZ +abp +afT +aOu +anP +atJ +aCF +apk +acj +atJ +aXr +aPG +awB +awB +awB +ayr +aXr +aXr +aXr +aUp +aEX +avX +app +aBQ +acX +aGR +aUp +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(107,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +aib +aib +avF +aee +aws +aws +abz +aws +aws +aws +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +acD +lWC +atN +aaP +atU +agR +axf +agR +afC +amf +amf +aKl +aQl +aQl +aQl +aQl +aQl +aQl +auZ +abp +afT +afT +aAo +atJ +alZ +atJ +atJ +atJ +aXr +aPG +awB +awB +awB +ayr +aXr +awn +aMR +aEX +agQ +acX +acX +acX +acX +aGR +aUp +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(108,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +aib +aib +avF +aee +aws +aws +aBD +aws +aws +aYN +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +aEE +aAw +aFd +atn +atU +agR +aDu +agR +aYf +aLR +anK +aDN +aQl +aQl +aQl +aQl +aQl +aQl +auZ +afh +afT +afT +afT +afT +afT +aWX +aen +atJ +aXr +aPG +awB +awB +awB +ayr +aXr +aNL +aNL +aEX +aip +acX +acX +acX +ahR +asu +aUp +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(109,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +aib +aib +avF +avF +avF +avF +avF +avF +avF +avF +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +aws +avF +axC +aAw +aDu +aKz +acs +aau +aDu +aGo +aTJ +ash +aNp +aDN +acW +acq +aJy +aQl +acW +acW +auZ +aid +anw +afT +afT +afT +anw +aWX +aNZ +atJ +ahq +aPG +awB +awB +awB +ayr +aXr +aIN +aZc +aUp +aUp +aEX +aOB +aEX +atg +aUp +aUp +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(110,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +aws +aws +aws +aws +aws +aws +aws +avF +avF +avF +avF +avF +avF +avF +aXr +aXr +auZ +auZ +auZ +auZ +auZ +auZ +auZ +auZ +auZ +auZ +auZ +ueY +auZ +auZ +auZ +auZ +auZ +atJ +atJ +atJ +atJ +atJ +atJ +atJ +atJ +atJ +aXr +aPG +awB +awB +awB +ayr +aXr +aXr +awz +aoE +asA +akc +ajY +azo +azo +are +aEk +awB +awB +awB +awB +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(111,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +avF +ahq +aPG +awB +awB +awB +ayr +aSv +avF +aws +aws +aws +aws +aws +aws +aws +avF +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +amZ +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +amZ +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +amZ +aXr +aXr +aPG +awB +awB +awB +ayr +aXr +aXr +awz +aoE +arJ +axj +awd +aUz +gPN +nph +aUp +aUp +aEk +aEk +aUp +aUp +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(112,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +avF +aXr +aPG +awB +awB +awB +ayr +aXr +avF +avF +avF +avF +avF +avF +avF +avF +avF +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aqT +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aLl +aXr +aqT +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aDn +aCd +awB +awB +awB +ayr +aXr +aXr +agU +aoE +aLn +azo +arZ +aUz +gPN +jfA +aoE +aTX +azo +azo +azo +aUp +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(113,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +aib +avF +aXr +aPG +awB +awB +awB +ayr +aXr +aXr +amZ +aXr +aXr +aXr +aXr +aXr +aXr +amZ +aXr +aXr +gcK +gcK +aXr +gcK +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aUx +aoE +avQ +azo +azo +aUz +aUz +afv +aaI +azo +aie +awa +aUz +aUp +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(114,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +avF +aPZ +aiV +aiV +aiV +aiV +aiV +aiV +aiV +aiV +aiV +aiV +aiV +aXr +adT +aOa +aOa +aOa +aPX +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +gcK +aTb +aXr +gcK +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aNl +aTb +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +awn +aMR +aoE +aVN +aGN +azo +azo +azo +azo +aoT +azo +aie +aMs +aZn +aUp +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(115,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +axo +apl +aey +aqP +axo +ayC +ayC +ayC +ayC +ayC +aiV +aXr +aqT +aDn +aDn +aDn +aDn +aDn +aYl +aYl +awB +awB +awB +aYl +aYl +aDn +aDn +aLl +aXr +gcK +gcK +gcK +gcK +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +aQg +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aNL +aNL +aoE +amX +aXG +azS +anc +aRt +azo +aaI +are +axW +aYr +aDS +aUp +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(116,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +axo +arW +ama +akv +axo +aQx +ayC +ayC +ayC +aQL +iRP +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aXr +aXr +aXr +aXr +adT +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aPX +aXr +adT +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aOa +aJk +aXr +aIN +aZc +aUp +aUp +aUp +aUp +aUp +aUp +aUp +aUp +aUp +aUp +aUp +aUp +aUp +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(117,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +axo +apS +ama +ama +adG +ayC +ayC +aVL +ayc +apO +aRn +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aTz +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aTz +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aTz +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aXr +aYl +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(118,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +axo +aLY +ama +ama +aTx +ayC +ayC +aVL +ayc +apO +aRn +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +aUx +aXr +aXr +aYl +aYl +aYl +aYl +uVj +osE +nZe +glA +ued +ued +bvD +ued +ued +fLs +fLs +ued +ued +ued +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(119,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +axo +asf +ama +ama +ayc +ayC +ayC +avP +pPB +avP +aRn +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aCk +aBi +aBi +ayR +ayR +aUI +aNb +ayZ +aDM +agY +aDT +arm +aMN +aEd +ayZ +aAY +aMN +aeb +ayZ +awz +aXr +aFf +aYl +anJ +anJ +lCz +gsP +aUu +jCI +viX +ofB +jxp +aNN +sQh +kno +sQh +sQh +eyv +sQh +sQh +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(120,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +axo +aJT +ama +ama +aKw +ayC +ayC +avP +avP +avP +aRn +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aXx +aRT +auu +auu +auu +aPV +aOs +ayZ +aMb +aou +afA +azf +aNy +agB +ayZ +agB +aNy +apB +ayZ +ayZ +akM +akM +ayZ +aXV +anJ +lCz +hyM +jCI +mfI +bZg +ofB +wlm +sQh +sQh +vPZ +oUI +sQh +vPZ +oUI +sQh +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(121,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +axo +afL +ama +ama +axo +ayC +ayC +aVL +ayc +apO +aiV +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aXx +auu +auu +auu +auu +aPV +aPV +abo +aou +aou +aou +aTW +air +air +air +air +air +air +ayZ +ait +air +air +ayZ +aHZ +aIw +lCz +mcL +jCI +jCI +wqy +ofB +ewS +sQh +sQh +sQh +ckt +sQh +sQh +sQh +wsj +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(122,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +axo +aDB +ama +akv +axo +aQx +ayC +aVL +ayc +apO +aiV +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aCk +ari +axY +dan +aPV +wGE +aPV +ayZ +aou +xzM +aou +aTW +air +air +alG +air +air +air +avm +air +air +air +azQ +alt +alt +lCz +dsE +bfr +jCI +eJa +ofB +oqU +sQh +sQh +sQh +sQh +sQh +ggn +oUI +sQh +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(123,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +axo +aob +ama +ama +aDF +avP +avP +avP +avP +avP +aiV +ahq +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aSv +aCk +azj +aPb +abP +aHz +aPV +aPV +ayZ +aou +aCD +aLv +auh +air +aSr +aeb +aDj +air +air +avm +air +air +ald +ayZ +alt +alt +lCz +tPa +jCI +clH +enr +ofB +bPr +sQh +sQh +sQh +sQh +sQh +vxJ +sQh +yiH +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(124,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +aiV +aiV +aiV +auP +axo +aro +avP +avP +avP +avP +aiV +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aXx +aIP +aND +asm +aUA +aPV +aPV +ayZ +aou +aou +aLv +aNr +air +ayZ +ayZ +aUU +ayE +ayZ +ayZ +aGJ +air +ahF +ayZ +aXV +aXV +aXV +aRi +aRi +aRi +aRi +aRi +aRi +aRi +ued +ofB +dFh +ued +ued +ued +ued +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(125,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +aib +aib +aib +aRz +aUh +aib +aiV +axo +aro +aVL +ayc +apO +aiV +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +aXk +azD +awB +awB +awB +awB +awB +ayr +aXr +aXr +aXx +aDO +asm +asm +aWN +aPV +aOs +ayZ +aGe +aou +aLv +aNr +air +ayZ +aux +aGr +air +aBW +ayZ +aFn +air +ahF +akx +aIL +aEK +aFZ +aDJ +aqs +aGa +aDU +aDJ +aDJ +qae +tRn +sQh +sQh +sQh +sQh +sQh +yiH +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(126,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +azJ +aib +aib +aib +aib +aib +aib +aiV +axo +aVL +ayc +apO +aiV +aXr +aPG +awB +awB +awB +awB +awB +awB +axO +aYl +aYl +aTR +awB +awB +awB +awB +ayr +aXr +aXr +aCk +aDx +abL +asm +axx +aPV +aPV +ayZ +aou +aou +arg +ahS +awV +ayZ +aet +aGr +aGr +aEI +ayZ +aEi +air +air +akx +aIL +aEK +dwx +aDJ +aDJ +aDJ +aDJ +aDJ +aDJ +qae +bSD +sQh +sQh +mrg +sQh +sQh +wsj +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(127,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +avF +avF +avF +avF +avF +aib +aib +aib +aiV +aiV +aiV +aiV +aiV +aXr +aPG +awB +awB +awB +awB +awB +awB +axO +aLW +aYl +aTR +awB +awB +awB +awB +ayr +aXr +aXr +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +aKO +air +aGr +aVM +aGP +afO +afO +afO +aEM +ads +aDJ +aDJ +aDJ +aDJ +aDJ +aDJ +aDJ +ayF +qae +jzn +sQh +nEH +fmw +spN +sQh +sQh +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(128,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +awL +atP +azY +alk +aLo +avF +avF +aib +aib +aib +aib +aib +aib +avF +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +aNs +aNs +awB +awB +awB +awB +awB +ayr +aXr +aXr +aYl +aON +aJo +apC +aIu +aAN +aHA +aBN +aGB +aWK +akW +ayZ +aaZ +aEr +air +air +air +aly +aGP +asL +asL +asL +aEM +aCQ +aDJ +aDJ +aIm +ajd +apr +tiu +aDJ +aDJ +qae +bPH +sQh +rAl +hSW +sQh +sQh +sQh +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(129,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +awL +aJV +aoL +aoL +aoL +aoL +awr +aib +aib +aib +aib +aib +aib +alP +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aYl +anD +aXr +aXr +aXr +aAN +aLf +als +als +abB +akW +ayZ +asw +aKM +air +aFp +air +aTt +aGP +asL +asL +asL +aGP +aRi +aRi +aAx +agV +aRi +aRi +aRi +aNM +azN +aRi +aRi +aRi +ued +ued +uwH +nHO +ued +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(130,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +awL +aqG +aoL +aoL +aOT +avF +avF +acu +avF +avF +avF +avF +avF +avF +ahq +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aSv +aYl +aUx +aXr +aXr +aXr +aAN +aZF +ahp +aaM +aWK +aXO +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +ayZ +aGP +aGP +aGP +aGP +aYO +aIL +aIL +aIL +aIL +aIL +aIL +aNM +aIp +aJG +acA +hUx +ukE +qbP +toJ +eKL +eKL +mtZ +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(131,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +awL +ach +aoL +aYP +aoL +arA +aMJ +aCX +agb +atX +aAu +agb +aIh +azv +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aYl +aXr +aXr +aXr +aXr +aYl +aBd +akW +akW +akW +akW +aOo +avK +ajC +adC +aIK +anq +aHT +aIK +aXR +atS +atS +aiK +aIL +aIL +aIL +aIL +aIL +aIL +arq +aQY +aFR +aFR +aeY +ukE +whz +xQL +eBu +eBu +hFN +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(132,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +awL +aAj +aox +aYm +aJn +aym +aMJ +aCX +aqF +aTi +aoI +aeZ +aVa +azv +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aiw +aXr +aTa +aXr +aXr +agh +akW +akW +akW +akW +akW +akW +akW +ajC +acr +ajG +ajG +ajG +ajG +aIK +aqc +fLp +aiK +aIL +aIL +aIL +aIL +aIL +aIL +arq +akd +aSl +aFR +aJG +ukE +tUH +bSP +eBu +eBu +eKL +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(133,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +awL +aCX +aCX +aCX +aCX +aCX +aCX +aCX +aCX +aCX +aCX +aCX +aCX +avF +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aYl +aRO +aXr +aXr +aXr +aYl +aYl +aYl +aCU +aBM +aao +aao +aao +ajC +aXp +ard +axF +aJN +aIj +aIK +aYo +aEO +aiK +aIL +aIL +aIL +aIL +aIL +aIL +aNM +awc +aYd +aFR +apR +ukE +clL +rZM +eKL +eKL +hmf +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(134,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +awL +agg +aCX +aCX +aCX +aCX +abA +aCX +aCX +aCX +aCX +aCX +aCX +lDD +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aYl +amL +aNL +aXr +aXr +aXA +anT +anT +anT +aKo +aKo +aKo +aKo +ajC +iaz +ard +aMw +aGE +aIj +aIK +aWf +ajG +aiK +aIL +aIL +aIL +aIL +aIL +aIL +aNM +axh +afF +aJG +aJG +aRi +ued +gqS +qNv +qNv +qNv +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(135,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +awL +aTO +aCX +aCX +aCX +aCX +aCX +aCX +aCX +aCX +aCX +aCX +aCX +avF +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aYl +aXB +aNL +aXr +aXr +azh +avj +anT +aOO +aKo +aZr +aWa +azr +ajC +aZw +ard +afH +aOE +aIj +aIK +aWf +aCH +aiK +aIL +aIL +aIL +aIL +aIL +aIL +aRi +aRi +aNM +aWY +aRi +ukE +mPi +eBu +eBu +eBu +eBu +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(136,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +awL +aPa +abE +aZT +aYD +aPa +abE +aBl +aYD +aPa +abE +aBl +aYD +azv +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aYl +aqk +aNL +aXr +aXr +azh +akS +anT +anB +akC +awx +awx +awx +aRy +aIK +ajG +ajG +ajG +ajG +aIK +uas +abs +aiK +aIL +aIL +aIL +aIL +aIL +aIL +aNM +pnj +aXC +aXC +aXC +ukE +uTV +eBu +eBu +eBu +eBu +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(137,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +awL +aMJ +alE +aSm +aVs +aMJ +alE +aeV +aVs +aMJ +alE +aeV +aVs +azv +aXr +aPG +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +awB +ayr +aXr +aXr +aYl +apI +aXr +aXr +aXr +azh +hSR +anT +awq +aKo +aPg +akD +awx +ajC +ayY +aZh +aIK +aIK +aIK +aIK +ajP +alV +aiK +aCI +aCI +aCI +aCI +aCI +aCI +aNM +ams +aXC +mqH +aKE +ukE +cnl +dvM +eBu +eBu +ncK +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(138,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +avF +avF +avF +avF +azv +azv +azv +avF +azv +azv +azv +avF +avF +avF +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aYl +aKo +aKo +aKo +aKo +aKo +aKo +aKo +avh +avh +avh +avh +aKo +aKo +aKo +aRi +aRi +aRi +aRi +aRi +aRi +aRi +aRi +aRi +aRi +aRi +aRi +ued +ued +wMx +wMx +ued +ued +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(139,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(140,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(141,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(142,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(143,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(144,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(145,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(146,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(147,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(148,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(149,1,3) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(150,1,3) = {" +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +"} + +(1,1,4) = {" +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +"} +(2,1,4) = {" +aFc +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +uuB +vAL +vAL +vAL +vAL +vAL +vAL +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(3,1,4) = {" +aFc +uuB +uuB +uuB +uuB +uuB +vAL +vAL +vAL +vAL +vAL +vAL +vAL +vAL +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(4,1,4) = {" +aFc +uuB +uuB +uuB +vAL +vAL +vAL +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(5,1,4) = {" +aFc +uuB +uuB +uuB +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(6,1,4) = {" +aFc +uuB +uuB +uuB +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(7,1,4) = {" +aFc +uuB +uuB +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(8,1,4) = {" +aFc +uuB +uuB +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(9,1,4) = {" +aFc +uuB +uuB +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(10,1,4) = {" +aFc +uuB +uuB +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(11,1,4) = {" +aFc +uuB +vAL +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(12,1,4) = {" +aFc +uuB +vAL +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(13,1,4) = {" +aFc +uuB +vAL +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(14,1,4) = {" +aFc +vAL +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(15,1,4) = {" +aFc +vAL +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(16,1,4) = {" +aFc +vAL +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(17,1,4) = {" +aFc +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(18,1,4) = {" +aFc +vAL +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(19,1,4) = {" +aFc +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(20,1,4) = {" +aFc +vAL +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(21,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(22,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(23,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(24,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(25,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(26,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(27,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(28,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(29,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(30,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(31,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(32,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(33,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(34,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(35,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(36,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(37,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(38,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(39,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(40,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(41,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(42,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(43,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(44,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(45,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(46,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(47,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(48,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(49,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(50,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(51,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(52,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(53,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(54,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(55,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(56,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(57,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(58,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(59,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(60,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(61,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +akZ +aik +akZ +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +axn +aOU +aOU +axn +aOU +aOU +axn +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(62,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aik +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aDs +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(63,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +akZ +aOU +akZ +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +abu +aOU +abu +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aYS +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +auy +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(64,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aik +aOU +aOU +aOU +aOU +aNk +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +abu +aOU +abu +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aYS +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aDs +aOU +aOU +aOU +aOU +aOU +aUW +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(65,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aNk +aQp +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aYS +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aYS +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(66,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aik +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +abu +aOU +abu +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aYS +aYS +aYS +aYS +aYS +aYS +aYS +aYS +aYS +aYS +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(67,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aQp +aOU +aOU +aNk +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +abu +aOU +abu +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(68,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aDs +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +awK +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(69,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aik +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +abu +aOU +abu +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aYS +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +awK +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(70,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +abu +aOU +abu +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aYS +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +awK +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(71,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aYS +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(72,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +ayM +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(73,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(74,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(75,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +agJ +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(76,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(77,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(78,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(79,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(80,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(81,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +agJ +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(82,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(83,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(84,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(85,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(86,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(87,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(88,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(89,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(90,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +agJ +aQp +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(91,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +axn +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(92,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aQp +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(93,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +agJ +aQp +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +awK +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(94,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aQp +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(95,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aUv +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(96,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(97,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(98,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(99,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(100,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(101,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(102,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(103,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(104,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(105,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(106,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +agJ +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(107,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(108,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(109,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(110,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(111,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(112,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +agJ +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(113,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(114,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +axn +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(115,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(116,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(117,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(118,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aQN +aQN +aQN +aQN +aQN +aQN +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(119,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +ayJ +aOU +aOU +aOU +aOU +aQN +afs +afs +afs +afs +aQN +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(120,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOF +aXL +anZ +aXL +aoo +aLS +aOU +aQN +afs +aUN +afs +afs +aQN +aQN +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(121,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +acS +aOU +aNk +aOU +acS +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aRf +aSN +aSN +aSN +aXj +aRu +aOU +aQN +aCc +asn +aUE +afs +afs +aQN +apc +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(122,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aRf +arB +aSN +arB +aXj +aLS +aOU +aQN +asn +asn +aUE +afs +afs +avc +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(123,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aNk +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aeq +aSN +aSN +aSN +aXj +aRu +aFy +aQN +asn +asn +aUE +afs +afs +aQN +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(124,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aQp +aOU +aOU +aOU +aQp +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aQf +aNx +aNx +aNx +abe +aLS +aOU +aQN +aQN +aQN +aQN +aQN +aQN +aQN +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(125,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +acS +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +axn +aOU +axn +aSe +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(126,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +acS +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(127,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aNk +aOU +aOU +aOU +aQp +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(128,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(129,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +acS +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(130,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +acS +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(131,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(132,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(133,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(134,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(135,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(136,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aAT +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(137,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aOU +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(138,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +aVD +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(139,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(140,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(141,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(142,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(143,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(144,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(145,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(146,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(147,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(148,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(149,1,4) = {" +aFc +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +ahY +aFc +"} +(150,1,4) = {" +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +"} + +(1,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +"} +(2,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +aFc +"} +(3,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +auM +auM +auM +auM +aSE +aeB +auM +aHn +ayh +aGp +aGp +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +arI +aFc +"} +(4,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +arI +arI +arI +aFc +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +arI +arI +arI +arI +aFc +aFc +aFc +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +auM +auM +auM +auM +aBu +auM +aHn +aHn +ayh +aGp +aGp +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +arI +aFc +"} +(5,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +arI +arI +arI +arI +arI +aLD +arI +arI +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +auj +aTe +auj +auj +arI +arI +arI +arI +arI +aFc +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +auM +auM +aSE +auM +auM +auM +aHn +aLm +aoY +aGp +aGp +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +arI +aFc +"} +(6,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +arI +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +arI +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +anr +aTe +aTe +aTe +aTe +aTe +aTe +aTe +aTe +arI +arI +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +auM +auM +aBu +auM +auM +aHn +aHn +ayh +aGp +aGp +aGp +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +arI +aFc +"} +(7,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aXX +aXX +aXX +aXX +aXX +aXX +aXX +aWd +aWd +aTe +auj +auj +arI +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +auM +auM +aSE +auM +auM +auM +aHn +aHn +ayh +aGp +aGp +aGp +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +arI +aFc +"} +(8,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +arI +aFc +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aXX +aXX +aXX +aXX +aXX +aXX +aXX +aXX +aWd +aWd +aWd +auj +ani +arI +arI +aFc +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +auM +auM +aBu +auM +auM +aSE +aHn +aHn +ayh +aGp +aGp +aGp +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +arI +aFc +"} +(9,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aXX +aXX +aXX +aXX +aXX +adj +adj +aXX +aXX +aXX +aWd +aWd +aTe +aXX +arI +arI +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +auM +auM +auM +auM +auM +aBu +aHn +aHn +ayh +aGp +aGp +aGp +aGp +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +arI +aFc +"} +(10,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aXX +aXX +aXX +aXX +aXX +adj +adj +aXX +aXX +aXX +aXX +aXX +aXX +aXX +aTe +arI +arI +aFc +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +auM +auM +auM +aSE +auM +auM +aHn +aHn +afK +afd +aGp +aGp +aGp +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +arI +aFc +"} +(11,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +arI +aFc +aFc +avR +avR +avR +avR +avR +aFc +aFc +arI +aXX +aXX +aXX +aXX +aXX +aXX +adj +adj +adj +aXX +aXX +aXX +aXX +aWd +aTe +auj +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +auM +auM +auM +auM +aBu +auM +auM +aSE +aHn +aHn +afK +afd +aGp +aGp +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +arI +aFc +"} +(12,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +arI +aFc +aFc +aFc +aFc +aFc +aFc +avR +aFc +arI +arI +aXX +aXX +aXX +aXX +aXX +aXX +aWd +adj +adj +aXX +aXX +aTe +aWd +aWd +aTe +arI +arI +aFc +aFc +avR +avR +avR +avR +aFc +aFc +arI +arI +auM +auM +auM +auM +auM +auM +auM +aBu +auM +aHn +aww +ayh +aGp +aGp +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +arI +aFc +"} +(13,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +arI +arI +arI +arI +arI +aFc +aFc +aFc +aFc +arI +arI +aXX +aXX +aXX +aXX +aXX +aWd +aWd +adj +adj +adj +aTe +aTe +aWd +aTe +auj +arI +arI +aFc +avR +avR +avR +aFc +aFc +arI +arI +auM +auM +auM +auM +auM +auM +auM +auM +auM +auM +aHn +ayj +ayh +aGp +aGp +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +arI +aFc +"} +(14,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +arI +aFc +aFc +aFc +aFc +arI +arI +arI +arI +aXX +aTe +aTe +aWd +aWd +aWd +adj +adj +aTe +aWd +aTe +aTe +auj +arI +aFc +aFc +aFc +aFc +aFc +arI +arI +auM +auM +auM +auM +aSE +auM +auM +auM +aRN +aRN +aSx +aHn +aww +ayh +aGp +aGp +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +arI +aFc +"} +(15,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +arI +aFc +aFc +aFc +aFc +aFc +aFc +arI +arI +arI +auj +aTe +aWd +aWd +aWd +adj +adj +aTe +aTe +aTe +aTe +arI +arI +aFc +aFc +arI +arI +arI +auM +auM +aSE +auM +auM +aBu +auM +aRN +aRN +aRN +aSx +aSx +aHn +aLm +aoY +aGp +aGp +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +aXI +arI +aFc +"} +(16,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aRN +aRN +aRN +aRN +aRN +aOx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +arI +arI +aFc +aFc +aFc +aFc +aFc +aFc +aFc +arI +auj +aTe +aTe +aTe +aWd +amG +adj +aTe +aTe +aTe +aTe +aWd +arI +arI +arI +arI +aRN +aRN +auM +auM +aBu +auM +auM +auM +aRN +aRN +aRN +aSx +aSx +aSx +aHn +ayh +aGp +aGp +aGp +aXI +aXI +aXI +aXI +aXI +aXI +aGp +aGp +aGp +arI +aFc +"} +(17,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aOx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +arI +arI +arI +arI +arI +aFc +aFc +aFc +arI +aTe +aTe +aTe +aTe +aWd +aWd +adj +aTe +aTe +aTe +aTe +aTe +aTe +aTe +aTe +auj +aRN +aRN +aRN +auM +auM +auM +auM +aRN +aRN +aRN +aSx +aSx +aSx +aSx +aHn +ayh +aGp +aGp +aGp +aXI +aXI +aXI +aXI +aGp +aGp +aGp +aGp +aGp +arI +aFc +"} +(18,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +atM +atM +atM +atM +arI +arI +arI +arI +arI +atM +aTe +aTe +aTe +aWd +aWd +adj +aTe +aTe +aTe +aTe +aTe +aTe +aTe +aTe +aRN +aRN +aRN +aRN +aRN +aRN +auM +aRN +aRN +aRN +aSx +aSx +aSx +aRN +aSx +aHn +ayh +aGp +aGp +aGp +aGp +aXI +aGp +aGp +aGp +aGp +aGp +aGp +asC +arI +aFc +"} +(19,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aRN +aRN +aRN +aRN +aRN +aOx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aOx +aRN +aRN +aRN +aRN +aRN +atM +atM +atM +atM +atM +atM +atM +atM +atM +atM +atM +atM +aTe +aWd +aWd +amG +adj +aTe +aTe +aTe +aTe +aTe +aTe +aTe +auj +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aSx +aSx +aSx +aSx +aRN +aSx +aHn +ayh +aGp +aGp +aGp +aGp +aGp +aGp +aGp +aGp +aGp +asC +auH +aYp +arI +aFc +"} +(20,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aRN +aRN +aRN +aOx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aOx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +atM +aGX +atM +atM +atM +atM +atM +atM +atM +atM +atM +atM +aWd +aWd +aWd +amG +adj +aTe +aTe +aTe +aTe +aTe +aTe +arI +arI +ahy +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aSx +aSx +aSx +aRN +aRN +aSx +aHn +afK +auH +afd +aGp +aGp +aGp +aGp +aGp +asC +auH +aYp +aHn +aHn +arI +aFc +"} +(21,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aOx +aRN +aRN +aRN +aRN +aRN +atM +atM +atM +aGX +atM +atM +aGX +atM +atM +atM +atM +atM +aWd +aWd +aWd +adj +adj +aTe +aTe +aTe +aTe +arI +arI +arI +aTe +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aSx +aSx +aRN +aRN +aRN +aSx +aHn +aHn +azg +afK +auH +auH +auH +auH +auH +aYp +aHn +aHn +aHn +aHn +arI +aFc +"} +(22,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aLD +aLD +aLD +aLD +aLD +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aOx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +atM +atM +atM +atM +atM +atM +atM +atM +atM +atM +aWd +aWd +aWd +aWd +amG +adj +ani +aTe +arI +arI +arI +arI +aTe +aTe +aTe +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aSx +aSx +aHn +aHn +aHn +aHn +aHn +azg +aHn +azg +aHn +aHn +aHn +aHn +aHn +aHn +arI +aFc +"} +(23,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aLD +aLD +aLD +aLD +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aOx +aRN +aRN +aRN +aRN +aOx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +atM +atM +atM +atM +atM +atM +aGX +atM +atM +aWd +aWd +amG +arI +arI +arI +arI +arI +arI +aTe +aTe +aTe +aTe +aRN +aRN +aSx +aSx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aSx +aSx +aSx +aHn +aHn +aHn +aHn +aHn +aHn +aSx +aSx +aSx +aSx +aSx +aSx +aSx +arI +aFc +"} +(24,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +arI +aBu +aBu +aRN +aRN +aRN +aRN +aOx +aRN +aOx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +auM +auM +atM +atM +atM +atM +atM +atM +aWd +amG +aWd +arI +arI +aTe +aTe +aTe +aTe +aTe +aTe +aWd +aWd +aRN +aRN +aSx +aSx +aSE +aSx +aSx +aRN +aRN +aRN +aRN +aRN +aRN +ajq +aRN +aRN +aSx +aSx +aSx +aSx +aHn +aHn +aSx +aSx +aSx +aSx +aRN +aRN +aSx +aSx +aSx +aSx +arI +aFc +"} +(25,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +abS +abS +abS +abS +abS +abS +abS +abS +arI +aRN +aRN +aRN +aRN +azA +aRN +aRN +aRN +aRN +aRN +aOx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +auM +auM +auM +auM +auM +auM +auM +auM +arI +arI +arI +arI +arI +aTe +aTe +aWd +aWd +aWd +aWd +aWd +aWd +aRN +aRN +aRN +aSx +aSx +aBu +aSx +aSx +aSx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aSx +aSx +aSx +aSx +aSx +aSx +aRN +aRN +aoc +aRN +aRN +aRN +aSx +aSx +aSx +arI +aFc +"} +(26,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +abS +abS +aHj +aDR +aQc +aQc +aQc +aDR +abS +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aRN +aRN +aRN +aRN +aRN +auM +auM +auM +auM +auM +auM +auM +auM +auM +arI +arI +aFc +aFc +aFc +arI +aTe +aWd +aWd +aMa +aMa +aMa +aMa +aMa +aDV +aDV +aDV +aMa +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aRN +aRN +aRN +aRN +aDK +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aoc +aRN +aRN +aSx +aSx +arI +aFc +"} +(27,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +abS +aHj +aHj +aHj +aHj +aHj +aHj +aHj +abS +aRN +aRN +akj +akj +akj +akj +akj +add +add +add +akj +aRN +aRN +aRN +aRN +aRN +aOx +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aRN +aRN +aRN +aRN +auM +auM +auM +auM +auM +auM +auM +auM +auM +auM +arI +aFc +aFc +avR +aFc +arI +aTe +aWd +aWd +aMa +aFA +asJ +aDw +aMa +aPo +asJ +auF +aMa +aMa +aMa +aSx +aSx +aSx +aSE +aSx +aSx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aoc +aRN +aRN +aRN +aRN +aRN +aRN +aSx +aSx +arI +aFc +"} +(28,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +akj +akj +aDR +aHj +aTZ +aDR +aHj +aHj +aHj +abS +aRN +aRN +akj +aoa +aMm +awp +akj +akj +aRZ +aeu +acF +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aLD +aLD +aRN +aRN +aRN +auM +auM +auM +auM +auM +auM +auM +auM +auM +auM +arI +arI +aFc +avR +avR +aFc +arI +aTe +aWd +aWd +aMa +aZP +asJ +akO +aMa +akJ +asJ +asJ +anX +aHt +aMa +aSx +aSx +aSx +aBu +aRN +aRN +aRN +adX +aRN +aSp +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +ajn +aRN +aoc +aRN +aSx +aSx +arI +aFc +"} +(29,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +akj +akj +aHj +aHj +aHj +aHj +aty +aHJ +aHJ +aHJ +abS +aRN +aRN +akj +aIJ +aSO +aSO +aSO +akj +aah +aeu +axp +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aLD +aRN +aRN +aRN +aRN +auM +auM +auM +auM +auM +auM +auM +auM +auM +arI +arI +aFc +aFc +avR +avR +aFc +arI +aWd +aWd +aWd +aMa +axu +asJ +asJ +aMa +aGC +asJ +asJ +asJ +asJ +aDV +aSx +aSx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +ajq +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aSx +aSx +arI +aFc +"} +(30,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +avk +aUd +aHj +aHj +aHj +aHj +aEx +aBs +aSO +axJ +akj +akj +akj +akj +aaH +aSO +aSO +aSO +akj +amp +aoQ +awb +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aLD +aLD +aRN +aRN +aRN +aRN +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +aFc +aFc +avR +avR +avR +aFc +arI +aWd +aWd +aWd +aMa +atK +asJ +asJ +aRc +asJ +asJ +asJ +asJ +asJ +aMa +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +acc +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +ajn +aRN +aRN +aRN +aRN +aRN +aRN +aSx +aSx +arI +aFc +"} +(31,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +avk +aUd +aHj +aHj +aHj +aHj +aOC +aUL +aSO +aSO +aSO +aSO +aSO +afP +aSO +aSO +aSO +aSO +aPB +aNB +aeu +abI +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aLD +aLD +aRN +aRN +aRN +arI +arI +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +avR +avR +avR +avR +aFc +arI +aWd +aWd +aWd +aMa +aMa +aMa +aMa +aMa +ahO +asJ +aai +asJ +asJ +aRc +aRN +aRN +aRN +aRN +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aoc +aRN +ajn +aRN +aRN +aSx +arI +aFc +"} +(32,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +avk +aUd +aHj +aHj +aHj +aHj +aEx +aUL +aSO +aSO +akj +akj +akj +akj +alW +aKd +aKd +aKd +akj +amp +aeu +awb +aRN +aRN +aRN +aOx +aRN +aRN +aLD +aLD +aLD +aLD +aLD +aLD +arI +arI +arI +arI +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +arI +aWd +aWd +aBB +apL +apL +aMa +aJc +asJ +asJ +asJ +asJ +aMa +aRN +aRN +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aSx +aSx +aSx +arI +aFc +"} +(33,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +avk +aHj +aDR +agl +agl +agl +apo +aAz +aAz +aAz +abS +aRN +aRN +avk +acP +ahA +ahA +aKd +akj +aaj +aah +acF +aRN +aRN +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +aFc +aFc +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aZY +aqW +aWd +aan +ana +ana +aMa +ain +asJ +asJ +asJ +asJ +aDV +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aRN +aRN +aRN +aRN +aRN +aRN +aRN +ajn +aRN +aRN +aSx +aSx +aSx +arI +aFc +"} +(34,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +akj +akj +aHj +aOv +aOv +agl +agl +aOv +aug +agl +abS +aRN +aRN +avk +aGf +aYT +aYT +aKd +akj +aih +aeu +acF +aRN +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aZY +aWd +aWd +aWd +aWd +aTe +aMa +aye +asJ +asJ +aQt +asJ +aMa +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aZU +ajK +aZU +aSx +aSx +aRN +aRN +aRN +ajn +aRN +aRN +aRN +aSx +aSx +aSx +aSx +aLD +arI +aFc +"} +(35,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +abS +abS +aOv +aTk +aOv +aOv +aOv +agl +agl +abS +aRN +aRN +avk +aVY +aVY +aVY +akj +akj +aYC +aeu +acF +aRN +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aLD +aLD +arI +arI +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aWd +aWd +aWd +aTe +aTe +aMa +aru +aXi +aOJ +aMa +aMa +aMa +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSE +aSx +awD +aKB +aKB +aKB +aZU +aSx +aSx +aRN +aRN +aRN +aRN +aRN +aRN +aSx +aSx +aSx +aLD +aLD +arI +aFc +"} +(36,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +abS +abS +abS +agl +agl +agl +abS +abS +abS +aRN +aRN +akj +akj +akj +akj +akj +add +add +add +akj +aRN +aOx +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aWd +aWd +aTe +aTe +aMa +aDV +aDV +aDV +aMa +aRN +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aBu +aZU +aKB +aKB +aKB +aKB +aKB +awD +aSx +aRN +aRN +aRN +aRN +aRN +aSx +aSx +aSx +aLD +aLD +aLD +arI +aFc +"} +(37,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +abS +agl +agl +agl +abS +aFc +arI +aRN +aRN +aRN +aGY +ayd +aGY +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +aTe +aTe +aTe +aWd +aWd +aWd +aWd +aTe +aRN +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +ajK +aKB +aKB +akH +aKB +aKB +aZU +aSx +aRN +aRN +aRN +aRN +aSx +aSx +aSx +aLD +aLD +aLD +aLD +arI +aFc +"} +(38,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +abS +agl +agl +agl +abS +aFc +arI +aRN +aRN +aRN +aGY +aSL +aGY +aRN +aBh +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aLD +aLD +arI +arI +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +aTe +aTe +aTe +aTe +aWd +aWd +aWd +aSx +aSx +aSx +aSx +aMa +aMa +aMa +aSx +aSx +aSx +aZU +aKB +aKB +aKB +aKB +aKB +aZU +aSx +aSx +aSx +aRN +aSx +aSx +aSx +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(39,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +abS +agl +agl +agl +abS +aFc +arI +arI +aRN +aRN +aGY +aSL +aGY +aRN +aRN +aBu +aBu +aBu +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +arI +arI +arI +arI +arI +aWd +aSx +aSx +aSx +aSx +aMa +azy +aul +aSx +aSx +aSx +aBu +awD +aKB +aKB +aZd +ajK +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(40,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +abS +abS +abS +abS +abS +aFc +aFc +arI +aRN +aRN +aGY +aSL +aGY +aRN +aBu +aBu +aBu +aBu +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aLD +arI +arI +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +arI +arI +aSx +aSx +aSx +aSx +aMa +aMa +aMa +aSx +aSx +aSx +aSE +aBu +aZU +aZU +aZU +aSx +aSx +aSx +aSx +aSx +aSx +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(41,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +arI +aRN +aRN +aha +aSL +aSL +aRN +aBu +aBu +aBu +aBu +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +aLD +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +aSx +aSx +aSx +aSx +aBu +aSx +aSx +aSx +aSx +aSx +aBu +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(42,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aRN +azA +aSL +aSL +aSL +aRN +aBu +aBu +aBu +aBu +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +arI +arI +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +aSx +aSx +aSx +aSE +aBu +aSx +aLD +aLD +aSx +aLD +aLD +aLD +aLD +aLD +aSx +aSx +aSx +aSx +aas +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(43,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aRN +aio +aSL +aRN +aSL +aRN +aRN +aio +aBu +aBu +aRN +aOx +aRN +aRN +aLD +aLD +aLD +aLD +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aSx +aSx +aSx +aBu +aSx +aSx +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +aas +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(44,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aRN +aSL +aSL +aRN +aha +aSL +azA +aBu +aRN +aNE +aRN +aRN +aRN +aRN +aLD +aLD +aLD +aLD +arI +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +arI +aLD +aSx +aSx +aSE +aSx +aSx +aSx +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +auM +aas +aas +aas +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(45,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aRN +aSL +aRN +aRN +aio +aSL +aRN +aPF +aPF +aPF +aRN +aRN +aRN +aRN +aRN +aRN +aRN +arI +arI +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +arI +arI +arI +aLD +aLD +aSx +aBu +aSx +aSx +aSx +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +auM +aas +aas +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(46,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aSL +aSL +aRN +aRN +aPF +aPF +aPF +aPF +aPF +aPF +aPF +aRN +aRN +aOx +aRN +aRN +arI +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +arI +arI +arI +arI +arI +arI +arI +aLD +aLD +aLD +aLD +aSx +aSx +aSx +aSx +aSx +aSx +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +aas +auM +aas +aas +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(47,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aPF +aPF +aPF +aPF +aPF +aRN +aPF +aPF +aPF +aPF +aPF +aRN +aRN +aRN +aRN +arI +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aSx +aSx +aSx +aSx +aSx +aSx +aSE +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +auM +aas +aas +aLD +aLD +aLD +aLD +arI +aFc +"} +(48,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +arI +arI +arI +arI +arI +aPF +aPF +aPF +aPF +aPF +arI +arI +arI +arI +arI +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aSx +aSx +aSx +aSx +aSE +aSx +aBu +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aas +aLD +aLD +aLD +aLD +arI +aFc +"} +(49,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +arI +arI +arI +arI +arI +arI +arI +aFc +aFc +aFc +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aSx +aSx +aSx +aBu +aSx +aSx +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(50,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +arI +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aSx +aSx +aSE +aSx +aSx +aSx +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(51,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +arI +arI +arI +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aSx +aSE +aSx +aBu +aSx +aSx +aSE +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +aas +aas +auM +aas +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(52,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aSx +aBu +aSx +aSx +aSx +aSx +aBu +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +aas +auM +auM +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(53,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aSx +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(54,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aSx +aKp +aKp +abZ +aKp +aKp +aKp +aSx +aSx +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(55,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aKp +aKp +aKp +aET +aET +aZi +aET +aKp +aKp +aSx +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aSE +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(56,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aKp +asJ +aLe +aKi +aKi +aBI +aEv +aBI +aKp +aKp +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aBu +aas +aLD +aLD +aLD +aLD +arI +aFc +"} +(57,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aKp +aBI +aKi +aEv +aBI +asJ +aBI +aBI +ahd +aKp +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aas +aas +aLD +aLD +aLD +aLD +arI +aFc +"} +(58,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aKp +aBI +adO +aIX +aET +aKi +akt +axP +axP +aKp +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +auM +auM +aas +aas +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(59,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aKp +aBI +aET +aJd +ate +adO +aKi +aLc +aBI +aKp +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(60,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aKp +aRg +aKi +ayt +aJd +aET +aJd +ate +aKi +aKp +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(61,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aKp +adO +adO +aBK +aKi +ate +aJd +aBI +aBI +aKp +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(62,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aKp +aKp +aKp +aKp +aKp +aKp +aKp +aKp +aKp +aKp +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(63,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(64,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(65,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(66,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +auM +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(67,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +aSE +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(68,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aBu +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(69,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(70,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(71,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +auM +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(72,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +auM +auM +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(73,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aLD +aas +aLD +aLD +aas +aas +aLD +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +auM +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(74,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +aLD +aas +aas +aas +aas +aas +aas +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +auM +auM +auM +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(75,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aVw +aas +aas +aas +aas +aas +aas +aas +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +auM +auM +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(76,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aOY +aas +aas +aas +aas +aas +aas +aas +aas +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aSE +auM +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(77,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aVw +afm +aas +aas +aas +aas +aas +aas +aas +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +aBu +auM +auM +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(78,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aLD +aLD +aBu +aas +aas +aas +aas +aas +aas +aas +aas +aas +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +auM +aas +auM +auM +auM +auM +auM +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(79,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aLD +aLD +aas +aas +aas +aas +aas +aas +aas +aas +aas +aas +aas +aas +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +auM +auM +auM +auM +auM +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(80,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +arI +aLD +aLD +aas +aas +aas +aLD +aLD +aas +aas +aas +aLD +aas +aas +aas +aas +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +auM +auM +aSE +auM +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(81,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +aas +aas +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +aas +aBu +auM +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(82,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +aas +aas +afm +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +aas +auM +auM +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(83,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aMh +aMh +aMh +aMh +aMh +aMh +aMh +aMh +aMh +aMh +aMh +aMh +aMh +axm +axm +axm +axm +axm +axm +axm +azd +amm +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +aas +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +auM +auM +aSE +auM +auM +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(84,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aaa +aaa +aaa +aKc +aaa +aMh +abm +adM +aCe +auS +ajp +auS +aMh +aVo +aVo +aVo +aVo +aVo +aVo +aVo +aVo +aVj +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +auM +aas +aBu +auM +auM +auM +auM +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(85,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aud +aaa +aaa +aaa +abM +aMh +aaa +aTp +aCe +aaa +aaa +aaa +aMh +aKu +aVo +aVo +aVo +aVo +aVo +aVo +aVo +aVj +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +aas +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +auM +auM +auM +auM +auM +aRN +auM +aeX +auM +auM +aLD +aLD +aLD +aLD +arI +aFc +"} +(86,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aaa +aaa +aaa +aaa +aKc +aMh +aaa +aTp +aCe +axX +aaa +aaa +aMh +aVo +aVo +aVo +aVo +aYB +ahU +aVo +aVo +aVj +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +aLD +aLD +aLD +aLD +aLD +aLD +aas +auM +aas +auM +auM +auM +auM +auM +aRN +aRN +auM +auM +auM +auM +aLD +aLD +aLD +arI +aFc +"} +(87,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aaa +aaa +aMh +aMh +aMh +aMh +aud +aTp +aCe +awy +aKc +aaa +aMh +aVo +aVo +aVo +aVo +aFP +aGc +aVo +aVo +aVj +aLD +aLD +aLD +aLD +aLD +aas +aas +aas +auM +aas +auM +aLD +aLD +aLD +aLD +aLD +aas +aas +auM +auM +aas +aas +aas +aSE +auM +aRN +aoc +aRN +aRN +auM +auM +auM +auM +auM +arI +aFc +"} +(88,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aaa +aaa +aMh +auS +auS +aMh +aku +aTp +aCe +aXz +aaa +aaa +aMh +aVo +aVo +aVo +aVo +aSg +aSG +aVo +aVo +aVj +aLD +aLD +aLD +aLD +aas +aas +auM +auM +auM +auM +auM +auM +aLD +aLD +aLD +aas +aas +auM +auM +auM +auM +auM +auM +aBu +auM +aRN +aRN +aRN +aRN +ajn +auM +auM +aeX +auM +arI +aFc +"} +(89,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aaa +aaa +aMh +alu +aKc +aPu +aaa +aTp +aFO +aYs +aaa +aaa +aMh +aVo +aVo +aVo +aVo +aVo +aVo +aVo +aVo +aRQ +aLD +aLD +aLD +aas +aas +auM +auM +auM +aSE +aas +auM +aLD +auM +aLD +aLD +auM +auM +auM +auM +auM +aas +auM +auM +auM +auM +aRN +aRN +aRN +ajq +aRN +aRN +aRN +auM +auM +arI +aFc +"} +(90,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aaa +aaa +aMh +aaa +aaa +aMh +aaa +aaa +amS +amS +aaa +aaa +aMh +aPp +asv +aVo +aVo +aVo +aVo +aVo +aVo +aeh +asv +aas +aas +auM +auM +auM +auM +auM +aBu +auM +aas +aLD +auM +aLD +auM +auM +auM +aas +auM +auM +aSE +auM +auM +aRN +aRN +aRN +aRN +aoc +aRN +aRN +aRN +aRN +aRN +aRN +arI +aFc +"} +(91,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aud +aaa +aaa +aaa +aMh +aMh +aud +aaa +ayT +ayT +aaa +aaa +aMh +avx +awi +asv +aVo +aVo +aVo +aVo +ati +aBa +aVQ +aas +auM +auM +aas +auM +auM +auM +auM +auM +aas +aLD +auM +auM +auM +aas +auM +auM +auM +auM +aBu +auM +auM +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aoc +aRN +arI +aFc +"} +(92,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aMh +aaa +aaa +auS +aaa +aAU +aaa +aaa +aTp +aVn +asK +aku +aaa +abh +alg +alg +awi +aPp +aPp +aPp +aPp +aIc +alg +aVQ +aas +auM +aas +auM +auM +auM +auM +auM +auM +aas +auM +auM +aLD +auM +aas +aas +auM +auM +auM +aas +aLD +auM +aRN +aRN +aoc +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aiv +aFc +"} +(93,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aMh +aMh +aMh +aMh +aOr +aaa +aaa +aaa +aTp +aCe +auS +aaa +aaa +aMh +asZ +alg +alg +alg +alg +alg +alg +alg +alg +aVQ +aas +auM +auM +auM +auM +auM +auM +auM +auM +aas +auM +auM +aSE +auM +auM +auM +aSE +auM +aas +aLD +auM +auM +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aoc +aRN +aIF +aFc +"} +(94,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +api +aaa +aaa +aMh +aAU +aAU +aaa +aaa +aTp +aFO +aun +aaa +aaa +abh +alg +alg +aqS +asI +asI +asI +asI +abJ +alg +aVQ +aas +aas +auM +auM +aSE +auM +auM +auM +auM +auM +auM +auM +aBu +auM +aas +aas +aBu +aas +aas +auM +auM +aRN +aRN +aRN +aRN +ajq +aRN +aoc +aRN +aRN +aRN +aRN +aRN +arI +aFc +"} +(95,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aud +aaa +aaa +aaa +aKc +aMh +aMh +aud +aaa +amS +amS +aaa +aaa +aMh +avx +aqS +azM +aVo +aVo +aVo +aVo +amw +abJ +aVQ +aas +aas +auM +aas +aBu +aas +auM +auM +auM +auM +auM +aas +auM +auM +auM +auM +aas +aas +auM +auM +aRN +aoc +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aqt +aFc +"} +(96,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aaa +aaa +aSo +aMh +aaa +aaa +aMh +aaa +aaa +ayT +ayT +aaa +aaa +aMh +asI +azM +aVo +aVo +aVo +aVo +aVo +aVo +aPD +azM +aas +auM +aas +aas +aas +auM +auM +auM +auM +auM +auM +auM +auM +auM +aas +auM +aas +auM +auM +aRN +aRN +ajn +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +auM +aub +aFc +"} +(97,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aJi +aaa +aZW +aMh +aud +aKc +aPu +aaa +aTp +aVn +aHP +aaa +aaa +aMh +aVo +aVo +aVo +aVo +aVo +aVo +aVo +aVo +aVj +aLD +aLD +auM +aas +aas +aas +aas +aLD +aas +auM +auM +auM +aSE +aas +auM +aas +aas +auM +auM +aRN +aRN +aRN +aRN +aRN +aRN +aoc +aRN +aoc +aRN +aoc +aRN +aRN +auM +auM +arI +aFc +"} +(98,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +abb +aaa +aaa +aMh +auS +auS +aMh +aRo +aTp +aCe +aaa +afa +aRo +aMh +aVo +aVo +aVo +aVo +aYB +aXJ +aVo +aVo +aVj +aLD +aLD +auM +auM +aLD +aLD +aLD +aLD +aLD +aas +auM +aas +aBu +aas +aas +aas +auM +auM +aRN +aRN +aRN +aRN +aoc +aRN +aRN +aRN +aRN +aRN +ajn +auM +auM +aeX +auM +aLD +arI +aFc +"} +(99,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aCR +aaa +aaa +aMh +aMh +aMh +aMh +agz +aTp +aCe +aaa +aaa +ahg +aMh +aVo +aVo +aVo +aVo +aFP +aGc +aVo +aVo +aVj +aLD +aLD +aLD +auM +auM +auM +auM +auM +aLD +aLD +aas +aas +aas +aas +aas +auM +auM +aRN +aRN +aRN +aRN +aRN +aRN +aRN +aRN +ajn +auM +auM +auM +auM +aLD +aLD +aLD +aLD +arI +aFc +"} +(100,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aVt +aCf +aRl +aMh +aqL +afM +aMh +aRb +aTp +aCe +aaa +aaa +aaa +aMh +aKu +aVo +aVo +aVo +aSg +aSG +aVo +aVo +aVj +aLD +aLD +aLD +aLD +aLD +auM +aLD +auM +auM +aLD +aLD +aLD +auM +auM +auM +auM +auM +auM +auM +auM +auM +auM +aeX +auM +auM +auM +auM +auM +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(101,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +auS +aFE +auS +aMh +agC +aaa +aaa +aaa +aTp +aCe +aaa +aaa +anj +aMh +aKu +aVo +aVo +aVo +aVo +aVo +aVo +aVo +aVj +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +auM +auM +auM +auM +auM +aLD +aLD +aLD +auM +auM +auM +auM +aeX +auM +auM +auM +auM +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(102,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aMh +aMh +aMh +aMh +aMh +aEH +aKf +aMh +abm +adM +aCe +aMI +auS +alw +aMh +aVo +aVo +aVo +aVo +aVo +aVo +aVo +aVo +aVj +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(103,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aMh +aMh +aMh +aMh +aMh +aMh +aMh +aMh +aMh +aMh +aMh +aRL +aRL +aRL +aRL +aRL +aRL +aRL +aRL +aPK +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(104,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(105,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +aLD +arI +aFc +"} +(106,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +arI +aFc +"} +(107,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +"} +(108,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(109,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(110,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(111,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(112,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(113,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(114,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(115,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(116,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(117,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(118,1,5) = {" +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aCa +aCa +aCa +aCa +aCa +aCa +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(119,1,5) = {" +aFc +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +ayP +ayP +ayP +ayP +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(120,1,5) = {" +aFc +aCa +ayP +ayP +ayP +aWU +aCa +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +aMB +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aWU +aCa +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(121,1,5) = {" +aFc +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +aMB +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(122,1,5) = {" +aFc +aCa +ayP +ayP +ayP +afz +aCa +aMB +ayP +ayP +ayP +ayP +ayP +aCa +aMB +ayP +ayP +aCa +aCa +ayP +ayP +aCa +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(123,1,5) = {" +aFc +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +aCa +aCa +aCa +aCa +aCa +aMB +ayP +ayP +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +ayP +aCa +aCa +aCa +aCa +aMB +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(124,1,5) = {" +aFc +aCa +ayP +ayP +ayP +ayP +ayP +ayP +aWU +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +aCa +aFc +aCa +ayP +ayP +ayP +aCa +aFc +aFc +aFc +aFc +aFc +aFc +aCa +ayP +ayP +ayP +aCa +aFc +aCa +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(125,1,5) = {" +aFc +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +aMB +ayP +ayP +aCa +aMB +ayP +aCa +aFc +aCa +ayP +ayP +aWU +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +ayP +ayP +ayP +aCa +aFc +aCa +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(126,1,5) = {" +aFc +aCa +ayP +atB +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +aMB +ayP +ayP +aCa +aCa +aCa +aCa +aCa +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +aCa +aFc +aCa +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +aFc +aCa +ayP +ayP +ayP +aCa +aFc +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(127,1,5) = {" +aFc +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +aFc +aFc +aFc +aFc +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +aCa +aFc +aCa +aMB +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +aMB +ayP +aWU +aCa +aCa +aCa +aCa +ayP +aCa +aCa +aCa +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(128,1,5) = {" +aFc +aCa +ayP +ayP +ayP +ayP +ayP +ayP +aWU +aCa +ayP +ayP +ayP +aCa +aCa +ayP +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +ayP +ayP +ayP +aCa +aCa +ayP +aCa +aFc +aCa +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(129,1,5) = {" +aFc +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +ayP +aCa +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +aMB +ayP +ayP +aCa +aMB +ayP +aCa +aFc +aCa +ayP +ayP +aWU +aCa +aCa +aCa +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aWU +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(130,1,5) = {" +aFc +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +aMB +ayP +ayP +ayP +ayP +aGs +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +aFc +aCa +ayP +aJf +ayP +aCa +aFc +aFc +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(131,1,5) = {" +aFc +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +aCa +aFc +aCa +aMB +ayP +ayP +aCa +aFc +aFc +aCa +ayP +ayP +ayP +aCa +aCa +aCa +aCa +aCa +aCa +ayP +aCa +aCa +aCa +ayP +aCa +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(132,1,5) = {" +aFc +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +aCa +ayP +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +ayP +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +ayP +aCa +aCa +ayP +ayP +ayP +aCa +aMB +ayP +ayP +aCa +aMB +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(133,1,5) = {" +aFc +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aWU +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(134,1,5) = {" +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aCa +aMB +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aWU +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(135,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(136,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +ayP +ayP +ayP +ayP +ayP +aCa +aMB +ayP +ayP +ayP +ayP +ayP +aWU +aCa +aFc +aFc +aFc +aFc +aFc +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(137,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aCa +aCa +aCa +aCa +aCa +aCa +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(138,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aCa +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(139,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aCa +aMB +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aGM +aWU +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(140,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aCa +ayP +ayP +ayP +ayP +ayP +aCa +aMB +ayP +ayP +aCa +aMB +ayP +ayP +aCa +ayP +ayP +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(141,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aCa +atu +ayP +aWU +aCa +aCa +aCa +aCa +aCa +aCa +aCa +ayP +ayP +ayP +aCa +aCa +aCa +aMB +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(142,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +ayP +ayP +ayP +aCa +aFc +aCa +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(143,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aCa +aMB +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +aFc +aCa +aCa +aPs +aCa +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(144,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aCa +aMB +ayP +ayP +aCa +aFc +aCa +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(145,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +ayP +ayP +ayP +aCa +aCa +aCa +aMB +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(146,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aCa +ayP +ayP +ayP +aCa +ayP +ayP +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(147,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aCa +ayP +ayP +ayP +ayP +ayP +ayP +ayP +ayP +aWU +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(148,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aCa +aMB +ayP +ayP +aCa +ayP +ayP +ayP +ayP +ayP +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(149,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aCa +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} +(150,1,5) = {" +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +aFc +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +avR +"} diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm index a856336cb46f..ba848218d2c4 100644 --- a/_maps/map_files/debug/multiz.dmm +++ b/_maps/map_files/debug/multiz.dmm @@ -1022,8 +1022,8 @@ dir = 8 }, /obj/structure/table, -/obj/item/tank/jetpack/oxygen/captain, -/obj/item/storage/belt/utility/chief/full, +/obj/item/tank/jetpack/captain, +/obj/item/storage/belt/utility/full/powertools, /obj/item/clothing/gloves/color/yellow{ pixel_y = 10 }, diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 1d0269d8cb14..f7bdd8885160 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -159,7 +159,7 @@ /obj/structure/table, /obj/item/weldingtool/experimental, /obj/item/inducer, -/obj/item/storage/belt/utility/chief/full, +/obj/item/storage/belt/utility/full/powertools, /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, /turf/open/floor/iron, @@ -254,7 +254,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "bF" = ( -/obj/machinery/computer/rdconsole, +/obj/machinery/computer/rdconsole/unlocked, /turf/open/floor/iron, /area/station/science) "bI" = ( @@ -905,9 +905,8 @@ /turf/open/floor/iron, /area/station/cargo/storage) "fn" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum/external, -/turf/open/floor/plating, +/obj/structure/sign/warning/vacuum/external/directional/west, +/turf/open/floor/iron, /area/station/hallway/secondary/entry) "fo" = ( /obj/machinery/conveyor_switch/oneway{ @@ -960,21 +959,18 @@ /turf/open/floor/iron, /area/station/cargo/bitrunning/den) "fM" = ( -/obj/structure/sign/directions/supply{ - dir = 4; - pixel_x = 32 - }, /obj/structure/sign/directions/engineering{ dir = 1; - pixel_x = 32; pixel_y = 7 }, +/obj/structure/sign/directions/supply{ + dir = 4 + }, /obj/structure/sign/directions/evac{ - pixel_x = 32; pixel_y = -7 }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/turf/closed/wall/r_wall, +/area/station/commons/storage/primary) "fO" = ( /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) @@ -985,9 +981,7 @@ /area/station/hallway/secondary/exit/departure_lounge) "fQ" = ( /obj/machinery/computer/communications, -/obj/machinery/status_display/evac{ - pixel_y = 32 - }, +/obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "fS" = ( @@ -996,21 +990,18 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "fX" = ( -/obj/structure/sign/directions/supply{ - dir = 4; - pixel_x = -32 - }, /obj/structure/sign/directions/engineering{ dir = 1; - pixel_x = -32; pixel_y = 7 }, +/obj/structure/sign/directions/supply{ + dir = 4 + }, /obj/structure/sign/directions/evac{ - pixel_x = -32; pixel_y = -7 }, -/turf/open/floor/plating, -/area/station/commons/storage/primary) +/turf/closed/wall/r_wall, +/area/station/construction) "fY" = ( /obj/machinery/light/directional/west, /obj/structure/cable, @@ -1035,19 +1026,7 @@ /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) "gg" = ( -/obj/structure/sign/directions/supply{ - dir = 4; - pixel_x = 32 - }, -/obj/structure/sign/directions/engineering{ - dir = 1; - pixel_x = 32; - pixel_y = 7 - }, -/obj/structure/sign/directions/evac{ - pixel_x = 32; - pixel_y = -7 - }, +/obj/machinery/camera/autoname/directional/east, /turf/open/floor/plating, /area/station/commons/storage/primary) "gi" = ( @@ -1817,7 +1796,7 @@ /area/station/command/bridge) "BG" = ( /obj/structure/table, -/obj/item/ammo_box/c10mm, +/obj/item/ammo_box/c9mm, /obj/item/gun/ballistic/automatic/pistol, /turf/open/floor/iron, /area/station/command/bridge) @@ -2154,7 +2133,6 @@ /turf/open/floor/iron, /area/station/commons/storage/primary) "JV" = ( -/obj/machinery/camera/autoname/directional/east, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -5736,7 +5714,7 @@ ax eh dY dY -fn +en fs en dY @@ -5828,7 +5806,7 @@ ax eh eh eV -eh +fn eh eh eV @@ -6007,7 +5985,7 @@ eh eh eF HW -fM +eh eh eh eh @@ -6099,7 +6077,7 @@ cN cN cN cN -cN +fX ef ef cN @@ -7295,7 +7273,7 @@ cS cS cS cS -cS +fM dG dG cS @@ -7387,7 +7365,7 @@ Zz dp dl dl -fX +dl dE dB dl @@ -8583,7 +8561,7 @@ cS cS cS cS -cS +fM Is Jd tz diff --git a/_maps/map_files/debug/runtimestation_minimal.dmm b/_maps/map_files/debug/runtimestation_minimal.dmm new file mode 100644 index 000000000000..d2d961cc8dab --- /dev/null +++ b/_maps/map_files/debug/runtimestation_minimal.dmm @@ -0,0 +1,1229 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"w" = ( +/turf/open/space/basic, +/area/station/commons/storage/primary) + +(1,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(2,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(3,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(4,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(5,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(6,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(7,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(8,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(9,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(10,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(11,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(12,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(13,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(14,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(15,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(16,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(17,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(18,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(19,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(20,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(21,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(22,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(23,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(24,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(25,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(26,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(27,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(28,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(29,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(30,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(31,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(32,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(33,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(34,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 11fb4bc5caae..c63c1c091cef 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -719,7 +719,7 @@ pixel_x = 6; pixel_y = 6 }, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = 3; pixel_y = 3 }, @@ -866,6 +866,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/iron, /area/centcom/central_command_areas/control) "dG" = ( @@ -877,6 +878,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) +"dI" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/courtroom) "dJ" = ( /obj/machinery/button/door/indestructible{ id = "thunderdomehea"; @@ -993,6 +1000,7 @@ /obj/effect/turf_decal/tile/green{ dir = 4 }, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron, /area/centcom/central_command_areas/control) "ev" = ( @@ -1019,6 +1027,7 @@ "eB" = ( /obj/structure/bookcase/random, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) "eD" = ( @@ -1027,7 +1036,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/access/all/admin/captain, +/obj/effect/mapping_helpers/airlock/access/all/admin/officer, /turf/open/floor/iron, /area/centcom/central_command_areas/admin) "eE" = ( @@ -1127,7 +1136,7 @@ id = "tdomeflash"; name = "Thunderdome Flash" }, -/turf/open/floor/circuit/green, +/turf/closed/wall, /area/centcom/tdome/arena) "fc" = ( /obj/effect/turf_decal/delivery, @@ -1249,7 +1258,7 @@ name = "Bathroom" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/mapping_helpers/airlock/access/all/admin/captain, +/obj/effect/mapping_helpers/airlock/access/all/admin/officer, /turf/open/floor/iron/white, /area/centcom/central_command_areas/admin) "fI" = ( @@ -1490,9 +1499,10 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) "gS" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/ferry) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/warning/secure_area/directional/east, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/armory) "gU" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 8 @@ -1673,6 +1683,7 @@ "hP" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) "hT" = ( @@ -1737,8 +1748,11 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/prison) "in" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/iron, /area/centcom/central_command_areas/control) "io" = ( /turf/closed/indestructible/riveted, @@ -1767,6 +1781,7 @@ /obj/item/tank/internals/emergency_oxygen/engi, /obj/item/clothing/mask/gas, /obj/effect/turf_decal/stripes/line, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) "iu" = ( @@ -1816,6 +1831,7 @@ /obj/item/restraints/handcuffs/cable/zipties, /obj/item/assembly/flash/handheld, /obj/effect/turf_decal/stripes/line, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) "iz" = ( @@ -1874,9 +1890,10 @@ }, /area/centcom/central_command_areas/supply) "iH" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/prison) +/obj/effect/turf_decal/tile/green, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) "iK" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -1977,11 +1994,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/courtroom) -"jb" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum/external, -/turf/open/floor/plating, -/area/centcom/central_command_areas/supply) "jc" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -2038,6 +2050,7 @@ dir = 4; id = "XCCQMLoad2" }, +/obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "jm" = ( @@ -2128,13 +2141,15 @@ id = "XCCQMLoaddoor"; name = "Loading Doors"; pixel_x = -27; - pixel_y = -5 + pixel_y = -5; + dir = 8 }, /obj/machinery/button/door/indestructible{ id = "XCCQMLoaddoor2"; name = "Loading Doors"; pixel_x = -27; - pixel_y = 5 + pixel_y = 5; + dir = 8 }, /obj/machinery/computer/cargo{ dir = 4 @@ -2200,6 +2215,7 @@ id = "XCCQMLoad" }, /obj/effect/turf_decal/stripes/line, +/obj/structure/sign/warning/vacuum/external/directional/south, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "jK" = ( @@ -2265,6 +2281,21 @@ /obj/machinery/computer, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) +"ka" = ( +/obj/effect/landmark/thunderdome/one, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/light_emitter/thunderdome, +/obj/machinery/camera/directional/north{ + c_tag = "Green Team"; + network = list("thunder"); + pixel_x = 12; + pixel_y = -10; + resistance_flags = 64 + }, +/turf/open/floor/iron, +/area/centcom/tdome/arena) "kd" = ( /obj/structure/table/reinforced, /obj/machinery/button/showtime{ @@ -2321,6 +2352,13 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) +"ku" = ( +/obj/machinery/button/door/indestructible{ + id = "CCcustoms1"; + name = "CC Emergency Docks Control" + }, +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/evacuation) "kv" = ( /obj/item/kirbyplants/organic/plant21, /obj/effect/turf_decal/tile/red{ @@ -2349,7 +2387,7 @@ pixel_x = 3; pixel_y = 3 }, -/obj/item/stamp, +/obj/item/stamp/granted, /obj/structure/table/wood, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/courtroom) @@ -2394,9 +2432,12 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "kR" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/admin/storage) +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/sign/warning/secure_area/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/prison) "kS" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -3073,6 +3114,21 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) +"ob" = ( +/obj/structure/sign/directions/medical{ + dir = 1; + pixel_y = -2 + }, +/obj/structure/sign/directions/engineering{ + pixel_y = 4; + dir = 1 + }, +/obj/structure/sign/directions/command{ + pixel_y = 10; + dir = 1 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/centcom/central_command_areas/evacuation/ship) "oe" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -3222,6 +3278,7 @@ "oL" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/armory) "oM" = ( @@ -3315,8 +3372,9 @@ /turf/open/floor/iron, /area/centcom/tdome/arena) "pc" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/west, +/turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) "pd" = ( /obj/item/clipboard{ @@ -3327,7 +3385,7 @@ pixel_x = -2; pixel_y = 12 }, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_y = 7 }, /obj/structure/table/reinforced, @@ -3502,6 +3560,7 @@ /obj/item/taperecorder, /obj/structure/table/wood, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) "qd" = ( @@ -3566,7 +3625,7 @@ pixel_x = 3; pixel_y = 3 }, -/obj/item/stamp, +/obj/item/stamp/granted, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -3700,9 +3759,10 @@ /turf/open/floor/iron, /area/centcom/tdome/arena) "qR" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/ferry) +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/iron, +/area/centcom/tdome/observation) "qS" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security" @@ -3908,7 +3968,8 @@ /area/centcom/central_command_areas/courtroom) "rN" = ( /obj/machinery/newscaster{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 @@ -3951,9 +4012,12 @@ /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation) "rY" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/armory) +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/sign/warning/secure_area/directional/east, +/turf/open/floor/iron, +/area/centcom/central_command_areas/prison) "rZ" = ( /obj/machinery/shower/directional/west, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -4413,6 +4477,10 @@ /obj/structure/sign/poster/contraband/syndicate_recruitment/directional/north, /turf/open/indestructible/dark, /area/centcom/central_command_areas/admin) +"ub" = ( +/obj/structure/sign/directions/command, +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/ferry) "uc" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -4540,6 +4608,11 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) +"uB" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/iron, +/area/centcom/tdome/observation) "uE" = ( /obj/effect/light_emitter/thunderdome, /turf/closed/indestructible/fakeglass, @@ -4919,9 +4992,6 @@ /area/centcom/tdome/observation) "wg" = ( /obj/structure/closet/secure_closet/ert_com, -/obj/structure/sign/directions/command{ - pixel_y = 24 - }, /obj/effect/turf_decal/stripes/line, /obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron, @@ -4929,6 +4999,7 @@ "wh" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/green, +/obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) "wj" = ( @@ -4940,6 +5011,14 @@ /obj/structure/flora/bush/pointy/style_random, /turf/open/floor/grass, /area/centcom/tdome/administration) +"wk" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) "wl" = ( /obj/machinery/modular_computer/preset/id/centcom{ dir = 1 @@ -5000,12 +5079,6 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) "ww" = ( -/obj/machinery/button/door/indestructible{ - id = "CCFerry"; - name = "Hanger Bay Shutters"; - pixel_y = 24; - req_access = list("cent_general") - }, /obj/effect/turf_decal/stripes/line{ dir = 5 }, @@ -5319,7 +5392,8 @@ /area/centcom/central_command_areas/control) "xX" = ( /obj/machinery/newscaster{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -5415,21 +5489,6 @@ 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) @@ -5472,9 +5531,8 @@ /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 + dir = 8 }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) @@ -5508,7 +5566,7 @@ pixel_x = 6; pixel_y = 6 }, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = 3; pixel_y = 3 }, @@ -5662,34 +5720,16 @@ /turf/open/floor/iron, /area/centcom/tdome/observation) "zw" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, -/area/centcom/tdome/observation) +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/obj/structure/sign/nanotrasen/directional/east, +/turf/open/floor/iron, +/area/centcom/central_command_areas/prison) "zx" = ( -/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/effect/decal/cleanable/dirt, -/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/sign/directions/medical{ - pixel_x = 32; - pixel_y = -2; - dir = 1 +/obj/machinery/defibrillator_mount/loaded{ + pixel_y = null }, -/turf/open/floor/iron/dark/textured_large, +/turf/closed/wall/mineral/titanium/nodiagonal, /area/centcom/central_command_areas/evacuation/ship) "zz" = ( /obj/structure/table/reinforced, @@ -5778,6 +5818,11 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/two) "zO" = ( +/obj/effect/landmark/thunderdome/two, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/light_emitter/thunderdome, /obj/machinery/camera/directional/north{ c_tag = "Red Team"; network = list("thunder"); @@ -5785,9 +5830,6 @@ 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) "zR" = ( @@ -5879,11 +5921,13 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron, /area/centcom/central_command_areas/control) "Ao" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/green, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron, /area/centcom/central_command_areas/control) "Aq" = ( @@ -6296,9 +6340,10 @@ pixel_x = 3; pixel_y = 3 }, -/obj/item/stamp, +/obj/item/stamp/granted, /obj/structure/table/wood, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) "BW" = ( @@ -6365,6 +6410,23 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/four) +"Cp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) +"Cq" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/item/radio/intercom/syndicate{ + pixel_x = -32; + dir = 8 + }, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/courtroom) "Cx" = ( /obj/structure/table/reinforced, /obj/item/storage/box/handcuffs, @@ -6403,7 +6465,7 @@ pixel_x = 3; pixel_y = 3 }, -/obj/item/stamp, +/obj/item/stamp/granted, /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -6428,6 +6490,7 @@ /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 1 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/centcom/central_command_areas/control) "CJ" = ( @@ -6453,6 +6516,7 @@ /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/centcom/central_command_areas/control) "CO" = ( @@ -6534,8 +6598,10 @@ /turf/closed/indestructible/riveted, /area/centcom/ai_multicam_room) "Dj" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, +/obj/effect/landmark/prisonwarp, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/indestructible/dark, /area/centcom/central_command_areas/prison/cells) "Dk" = ( /obj/structure/cable, @@ -6673,6 +6739,10 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) +"DW" = ( +/obj/machinery/newscaster, +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/armory) "Eb" = ( /obj/item/kirbyplants/organic/plant21, /obj/structure/extinguisher_cabinet/directional/south, @@ -6885,9 +6955,6 @@ /turf/open/floor/iron/white, /area/centcom/tdome/observation) "Ff" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, /turf/open/floor/carpet/red, /area/centcom/central_command_areas/evacuation/ship) "Fg" = ( @@ -6936,9 +7003,12 @@ /turf/open/floor/plating, /area/centcom/central_command_areas/prison) "Fq" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/sign/warning/secure_area/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/prison) "Fs" = ( /obj/machinery/door/poddoor/shutters{ id = "CCsec1"; @@ -7047,6 +7117,12 @@ /obj/effect/light_emitter/thunderdome, /turf/closed/indestructible/fakeglass, /area/centcom/tdome/observation) +"Ge" = ( +/obj/structure/bookcase/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "Gf" = ( /obj/machinery/firealarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump{ @@ -7214,6 +7290,12 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/smooth_edge, /area/centcom/central_command_areas/evacuation/ship) +"He" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/floor, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/indestructible/dark, +/area/centcom/central_command_areas/prison/cells) "Hi" = ( /obj/effect/turf_decal/tile/green, /obj/machinery/light/directional/south, @@ -7224,6 +7306,7 @@ /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/centcom/tdome/observation) "Hl" = ( @@ -7341,34 +7424,53 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/white, /area/centcom/central_command_areas/evacuation/ship) +"HS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/sign/warning/secure_area/directional/east, +/turf/open/floor/iron, +/area/centcom/central_command_areas/prison) "HV" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/closet/secure_closet/quartermaster, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) +"HW" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/courtroom) "HY" = ( /obj/machinery/button/door/indestructible{ id = "CCsec3"; name = "CC Shutter 3 Control"; - pixel_y = 24 + pixel_y = 24; + dir = 1 }, /obj/machinery/button/door/indestructible{ id = "CCcustoms2"; name = "CC Shutter 2 Control"; pixel_x = 9; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/machinery/button/door/indestructible{ id = "CCsec1"; name = "CC Shutter 1 Control"; - pixel_y = 40 + pixel_y = 40; + dir = 1 }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/button/door/indestructible{ id = "CCsec4"; name = "CC Shutter 4 Control"; pixel_x = -9; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/machinery/photocopier/gratis/prebuilt, /turf/open/floor/iron/dark, @@ -7417,7 +7519,8 @@ /area/centcom/central_command_areas/supply) "If" = ( /obj/machinery/newscaster{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -7529,10 +7632,11 @@ /turf/open/floor/iron, /area/centcom/tdome/observation) "Jq" = ( +/obj/effect/light_emitter/thunderdome, /obj/machinery/camera/motion/thunderdome{ pixel_x = 10 }, -/turf/open/floor/circuit/green, +/turf/open/floor/iron, /area/centcom/tdome/arena) "JC" = ( /obj/machinery/modular_computer/preset/command{ @@ -7565,6 +7669,21 @@ /obj/machinery/modular_computer/preset/id/centcom, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) +"JS" = ( +/obj/structure/sign/directions/command{ + pixel_y = 10; + dir = 1 + }, +/obj/structure/sign/directions/engineering{ + pixel_y = 4; + dir = 1 + }, +/obj/structure/sign/directions/medical{ + pixel_y = -2; + dir = 1 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/centcom/central_command_areas/evacuation/ship) "JU" = ( /obj/structure/chair{ dir = 4 @@ -7610,7 +7729,7 @@ dir = 8 }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/admin/captain, +/obj/effect/mapping_helpers/airlock/access/all/admin/officer, /turf/open/floor/iron, /area/centcom/central_command_areas/admin) "Kg" = ( @@ -8005,9 +8124,6 @@ /area/space) "LN" = ( /obj/structure/table/optable, -/obj/machinery/defibrillator_mount/loaded{ - pixel_y = 28 - }, /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/blood, /obj/effect/decal/cleanable/dirt, @@ -8075,6 +8191,7 @@ /obj/structure/bed, /obj/item/bedsheet/black, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) "Mp" = ( @@ -8187,6 +8304,7 @@ "ML" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) "MM" = ( @@ -8226,9 +8344,12 @@ /turf/open/floor/iron/smooth_edge, /area/centcom/central_command_areas/evacuation/ship) "MY" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/briefing) +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) "Ne" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/trophy/gold_cup, @@ -8434,8 +8555,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/admin/captain, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/mapping_helpers/airlock/access/all/admin/officer, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) "Od" = ( @@ -8448,7 +8569,7 @@ pixel_x = 3; pixel_y = 3 }, -/obj/item/stamp, +/obj/item/stamp/granted, /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -8590,6 +8711,11 @@ /obj/item/kirbyplants/organic/plant21, /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) +"OK" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/warning/secure_area/directional/west, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/armory) "OM" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -8831,16 +8957,19 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/fore) "PE" = ( -/obj/machinery/newscaster{ - pixel_x = 32 +/obj/machinery/button/door/indestructible{ + id = "CCFerry"; + name = "Hanger Bay Shutters"; + req_access = list("cent_general") }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/armory) -"PF" = ( -/obj/structure/sign/nanotrasen, /turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/admin) +/area/centcom/central_command_areas/ferry) +"PF" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/obj/structure/sign/nanotrasen/directional/west, +/turf/open/floor/iron, +/area/centcom/central_command_areas/prison) "PG" = ( /obj/effect/turf_decal/tile/dark_blue/fourcorners, /obj/effect/turf_decal/tile/dark_blue/fourcorners, @@ -8990,7 +9119,7 @@ pixel_x = 3; pixel_y = 3 }, -/obj/item/stamp, +/obj/item/stamp/granted, /obj/structure/table/reinforced, /obj/machinery/status_display/ai/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -9164,6 +9293,7 @@ "Rd" = ( /obj/structure/bookcase/random, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "Rf" = ( @@ -9352,18 +9482,11 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) "RQ" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Green Team"; - network = list("thunder"); - pixel_x = 12; - pixel_y = -10; - resistance_flags = 64 +/obj/structure/sign/directions/medical{ + dir = 1 }, -/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) +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/armory) "RR" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -9474,9 +9597,13 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod) "Sx" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/admin/storage) +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green/half/contrasted, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/fore) "Sy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -9500,6 +9627,13 @@ /obj/structure/window/reinforced/survival_pod/spawner/directional/west, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) +"SD" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/west, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/courtroom) "SE" = ( /obj/effect/turf_decal/delivery, /obj/effect/light_emitter/podbay, @@ -9612,6 +9746,7 @@ "Th" = ( /obj/structure/filingcabinet/white, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) "Tj" = ( @@ -9937,6 +10072,7 @@ dir = 1 }, /obj/machinery/firealarm/directional/south, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron, /area/centcom/central_command_areas/admin/storage) "UK" = ( @@ -10035,9 +10171,6 @@ pixel_y = 3 }, /obj/item/gun/energy/e_gun, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -10172,10 +10305,6 @@ /area/centcom/central_command_areas/admin) "VM" = ( /obj/structure/closet/secure_closet/ert_sec, -/obj/structure/sign/directions/security{ - dir = 1; - pixel_y = -24 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -10209,21 +10338,11 @@ /obj/machinery/computer/records/security{ dir = 8 }, -/obj/machinery/button/door/indestructible{ - id = "CCcustoms1"; - name = "CC Emergency Docks Control"; - pixel_x = 24; - pixel_y = 24 - }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation) "VZ" = ( /obj/structure/closet/secure_closet/ert_med, -/obj/structure/sign/directions/medical{ - dir = 1; - pixel_y = -24 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -10235,6 +10354,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"Wb" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) "Wc" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security" @@ -10326,9 +10452,6 @@ /area/centcom/central_command_areas/evacuation) "WG" = ( /obj/structure/closet/secure_closet/ert_engi, -/obj/structure/sign/directions/engineering{ - pixel_y = 24 - }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) @@ -10344,8 +10467,13 @@ /obj/effect/turf_decal/tile/green{ dir = 1 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/centcom/tdome/observation) +"WM" = ( +/obj/structure/sign/directions/engineering, +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/ferry) "WN" = ( /obj/structure/table/wood, /obj/item/storage/box/drinkingglasses, @@ -10394,7 +10522,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/stripes/line, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/admin/captain, +/obj/effect/mapping_helpers/airlock/access/all/admin/officer, /turf/open/floor/iron, /area/centcom/central_command_areas/admin) "WX" = ( @@ -10430,6 +10558,7 @@ "Xc" = ( /obj/structure/noticeboard/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) "Xd" = ( @@ -10557,6 +10686,11 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/courtroom) +"XG" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) "XJ" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/sparsegrass/style_random, @@ -10654,6 +10788,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) +"Yt" = ( +/obj/structure/sign/directions/security{ + dir = 1 + }, +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/armory) "Yx" = ( /turf/open/floor/iron/white/herringbone, /area/centcom/central_command_areas/evacuation/ship) @@ -10754,9 +10894,10 @@ /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) "YX" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/prison/cells) +/obj/machinery/light/small/directional/east, +/obj/structure/sign/warning/secure_area/directional/east, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "YY" = ( /obj/item/storage/medkit/toxin, /obj/item/storage/medkit/o2{ @@ -10771,9 +10912,10 @@ /turf/open/floor/iron/white, /area/centcom/central_command_areas/control) "Za" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) "Ze" = ( /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, @@ -10952,7 +11094,7 @@ pixel_x = 3; pixel_y = 3 }, -/obj/item/stamp, +/obj/item/stamp/granted, /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -38196,7 +38338,7 @@ aL Lt Lt aa -Lt +zx LN OW yX @@ -39241,7 +39383,7 @@ KO LA nb Lp -zx +Lp ZA Lp Lp @@ -39498,7 +39640,7 @@ Lt LP Lt Lt -Lt +JS LP Lt Lt @@ -39508,7 +39650,7 @@ Lt Lt Lt LP -Lt +ob KH aa aa @@ -47914,20 +48056,20 @@ On On On On -PF -mD +On +PE ww Fh wz -qR +mD Rd eF hx TE az eF -Rd -MY +Ge +gO aa aa aa @@ -48432,8 +48574,8 @@ oh mD ss fw -tr -gS +Wb +mD kO WR RH @@ -49200,8 +49342,8 @@ dz Nr Xq Hw -gS -wz +mD +Cp TK xR OQ @@ -49461,7 +49603,7 @@ mD su fw wh -gS +mD Fz MJ TI @@ -49974,14 +50116,14 @@ On mD su fw -ts -qR +iH +mD Mp Pd RH NC RH -Pd +YX dW gO aa @@ -50234,11 +50376,11 @@ fw ne mD Ya -rY +Ya ST VO ST -rY +Ya Ya Ya aa @@ -50457,13 +50599,13 @@ aa aa aa aa -jb +iX jl js iX js jJ -jb +iX aa aa aa @@ -50479,7 +50621,7 @@ EJ QV QV Mo -Sx +YU Gs Ow aD @@ -50489,15 +50631,15 @@ oe su fw ts -mD +WM WG -sE +OK sE bH sE Zv VZ -Ya +RQ aa aa aa @@ -50996,7 +51138,7 @@ On YU YU Rj -kR +YU YU oe oe @@ -51507,7 +51649,7 @@ mi pj nm Th -Sx +YU Nn yi cL @@ -51516,7 +51658,7 @@ vb oe su xk -ts +iH mD Vg bH @@ -51545,11 +51687,11 @@ OO VT BY QC -bR -HK zO HK HK +HK +HK pb Ic Zk @@ -51774,15 +51916,15 @@ oe wB Fh xS -mD +ub wg oL fj RM -PE sE +gS VM -Ya +Yt aa aa aa @@ -52033,11 +52175,11 @@ xh ds mD Ya -rY Ya Ya Ya -rY +DW +Ya Ya Ya Dq @@ -52309,8 +52451,8 @@ bz QC Zj bi -eI -zw +qR +QC Id Bs vW @@ -52806,7 +52948,7 @@ Dp mR zF dC -Fq +io iu io yC @@ -53317,8 +53459,8 @@ wC iu iu iu -in -tL +io +wk tL io iu @@ -53585,7 +53727,7 @@ iu Dt DH iu -in +io Sl RW Sl @@ -53819,11 +53961,11 @@ Ox Ox Ox Ox -qs -Za +Sx Vx -Za -tK +Vx +Vx +in gL io HY @@ -53834,9 +53976,9 @@ hc iu Ab An -in io -in +io +io CI CY wH @@ -54108,8 +54250,8 @@ aB DF BW BW -BW -zw +Za +QC yY Kd yY @@ -54375,10 +54517,10 @@ Ef NY NY fb -Jq +Ji NY NY -Ef +Jq uE mE qk @@ -54619,8 +54761,8 @@ Mu Mu Mu aB -zw -BW +QC +XG BW BW QC @@ -54847,11 +54989,11 @@ Ox Ox Ox Ox -qs -Za +Sx Vx -Za -tN +Vx +Vx +MY gL io SQ @@ -54862,9 +55004,9 @@ Oh iu Ab Ao -in io -in +io +io CL CZ wH @@ -55127,7 +55269,7 @@ iu Xa DI iu -in +io Sl RW Sl @@ -55373,8 +55515,8 @@ wC iu iu iu -in -tL +io +wk tL io iu @@ -55594,19 +55736,19 @@ aa Jb rs am +Jb Dj -rs -am -Dj -rs am +Jb Dj -rs am +Jb Dj -rs am +Jb Dj +He +Jb rs am Jb @@ -55851,7 +55993,7 @@ aa Jb ir IF -YX +Jb ir IF Jb @@ -55863,11 +56005,11 @@ IF Jb ir IF -YX +Jb ir IF Jb -iH +il il Mz GC @@ -56108,7 +56250,7 @@ aa il is lL -iL +kR iT iT SL @@ -56120,11 +56262,11 @@ iT If iT iT -iT +Fq ls lL Ra -kB +PF nD iL iT @@ -56136,7 +56278,7 @@ io io io io -Fq +io UO io io @@ -56362,7 +56504,7 @@ aa aa aa aa -iH +il it lL im @@ -56421,8 +56563,8 @@ bz QC dV cS -cS -zw +uB +QC Ot Ot di @@ -57199,9 +57341,9 @@ ym TV fg QC -dj +ka +Mf Mf -RQ Mf Mf Zi @@ -57904,7 +58046,7 @@ aa aa aa aa -iH +il iy lL ip @@ -58164,7 +58306,7 @@ aa il iz lL -iK +rY iU iU OB @@ -58176,11 +58318,11 @@ iU sI iU iU -iU +HS lt lL Ra -kB +zw rg iK iU @@ -58421,7 +58563,7 @@ aa Jb ir IF -YX +Jb ir IF Jb @@ -58433,11 +58575,11 @@ IF Jb ir IF -YX +Jb ir IF Jb -pc +Hv Hv RI ja @@ -58678,19 +58820,19 @@ aa Jb rs am +Jb Dj -rs -am -Dj -rs am +Jb Dj -rs am +Jb Dj -rs am +Jb Dj +He +Jb rs am Jb @@ -58957,8 +59099,8 @@ rM rM rM rM -zc -pc +HW +Hv cg PL fm @@ -59982,10 +60124,10 @@ Hv Hv Hv Hv -pc +Hv ja ja -pc +Hv Hv qA qy @@ -60232,17 +60374,17 @@ Hv bB ps tQ -pc +Hv hP lR ml mW rN bP +pc ps ps -ps -aU +SD Hv qy qz @@ -61256,7 +61398,7 @@ aa aa aa aa -pc +Hv qc rk kE @@ -61770,8 +61912,8 @@ aa aa aa aa -pc -bC +Hv +dI rk kG ld @@ -62042,7 +62184,7 @@ MV mY rM ML -pc +Hv qz qy cg @@ -62059,7 +62201,7 @@ zm xt vZ AZ -cg +ku fm cg cg @@ -62284,7 +62426,7 @@ aa aa aa aa -pc +Hv BU rk kE @@ -63061,7 +63203,7 @@ rM rM ct ps -lV +Cq lW lW lV @@ -63316,7 +63458,7 @@ Hv Wp xX QX -pc +Hv Xc KD rc diff --git a/_maps/map_files/generic/CentCom_minimal.dmm b/_maps/map_files/generic/CentCom_minimal.dmm new file mode 100644 index 000000000000..053792354325 --- /dev/null +++ b/_maps/map_files/generic/CentCom_minimal.dmm @@ -0,0 +1,572 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) +"g" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) +"h" = ( +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/control) +"x" = ( +/obj/effect/landmark/error, +/obj/effect/landmark/observer_start, +/obj/effect/landmark/latejoin, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) +"A" = ( +/turf/cordon, +/area/space) +"G" = ( +/turf/closed/indestructible/splashscreen, +/area/space) +"W" = ( +/obj/effect/landmark/start/new_player, +/turf/cordon, +/area/space) + +(1,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +G +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +"} +(2,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(3,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(4,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(5,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +g +a +a +a +a +a +a +h +"} +(6,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(7,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(8,1,1) = {" +A +A +A +A +A +A +A +W +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(9,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +g +a +a +a +g +x +a +a +g +a +a +h +"} +(10,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(11,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(12,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(13,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +g +a +a +a +a +a +a +h +"} +(14,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(15,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(16,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(17,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +"} diff --git a/_maps/map_files/tramstation/maintenance_modules/arrivalsecupper_3.dmm b/_maps/map_files/tramstation/maintenance_modules/arrivalsecupper_3.dmm index 085542568ac8..557804df8156 100644 --- a/_maps/map_files/tramstation/maintenance_modules/arrivalsecupper_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/arrivalsecupper_3.dmm @@ -83,7 +83,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Security Maintenance Hatch" }, -/obj/effect/mapping_helpers/airlock/access/any/security/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/security/brig, /turf/open/floor/iron/smooth, /area/station/maintenance/department/eva) "L" = ( @@ -115,7 +115,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Security Maintenance Hatch" }, -/obj/effect/mapping_helpers/airlock/access/any/security/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/security/brig, /turf/open/floor/plating, /area/station/maintenance/department/eva) "Y" = ( diff --git a/_maps/map_files/tramstation/maintenance_modules/atmoscilower_2.dmm b/_maps/map_files/tramstation/maintenance_modules/atmoscilower_2.dmm index 63b01e5ed5ad..05fb51b60ac9 100644 --- a/_maps/map_files/tramstation/maintenance_modules/atmoscilower_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/atmoscilower_2.dmm @@ -204,7 +204,7 @@ pixel_x = -7; pixel_y = -10 }, -/obj/item/food/sandwich/cheese/grilled{ +/obj/item/food/sandwich/grilled_cheese{ pixel_x = -5; pixel_y = -9 }, diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm index 0901318e3014..b19a77c30230 100644 --- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm @@ -191,11 +191,7 @@ /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/secure_area{ - desc = "A warning sign which reads 'MULE CROSSING - LOOK BOTH WAYS"; - name = "MULE CROSSING - LOOK BOTH WAYS"; - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/cargo) "tI" = ( diff --git a/_maps/map_files/tramstation/maintenance_modules/dormenginelower_attachment_b_1.dmm b/_maps/map_files/tramstation/maintenance_modules/dormenginelower_attachment_b_1.dmm index bfe095561311..81bb18c3d899 100644 --- a/_maps/map_files/tramstation/maintenance_modules/dormenginelower_attachment_b_1.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/dormenginelower_attachment_b_1.dmm @@ -307,7 +307,7 @@ T B B B -C +m a a a @@ -324,7 +324,7 @@ L K B B -m +C V D O diff --git a/_maps/map_files/tramstation/maintenance_modules/medsciupper_1.dmm b/_maps/map_files/tramstation/maintenance_modules/medsciupper_1.dmm index bed44b8895c9..45a0e429f0d3 100644 --- a/_maps/map_files/tramstation/maintenance_modules/medsciupper_1.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/medsciupper_1.dmm @@ -324,7 +324,7 @@ /obj/machinery/door/airlock/grunge{ name = "Medical Maintenance Access" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/medical/morgue, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/modular_map_connector, @@ -398,6 +398,9 @@ /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, /area/station/asteroid) +"YV" = ( +/turf/closed/wall, +/area/station/asteroid) "Zs" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -1273,7 +1276,7 @@ XJ fd rJ hs -jx +YV nm nm gV diff --git a/_maps/map_files/tramstation/maintenance_modules/medsciupper_2.dmm b/_maps/map_files/tramstation/maintenance_modules/medsciupper_2.dmm index 9e76b86ee640..f0401a50d7e9 100644 --- a/_maps/map_files/tramstation/maintenance_modules/medsciupper_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/medsciupper_2.dmm @@ -117,7 +117,7 @@ /obj/machinery/door/airlock/grunge{ name = "Medical Maintenance Access" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/medical/morgue, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/modular_map_connector, @@ -292,6 +292,9 @@ "II" = ( /turf/open/floor/plating, /area/station/maintenance/department/science) +"IV" = ( +/turf/closed/wall, +/area/station/asteroid) "Kw" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, @@ -369,7 +372,7 @@ name = "Medical Maintenance Hatch" }, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/catwalk_floor, @@ -1300,7 +1303,7 @@ nm cn vr Vh -tD +IV tD tD Mf diff --git a/_maps/map_files/tramstation/maintenance_modules/medsciupper_3.dmm b/_maps/map_files/tramstation/maintenance_modules/medsciupper_3.dmm index 5e40d0ac4f60..c921b68dbb91 100644 --- a/_maps/map_files/tramstation/maintenance_modules/medsciupper_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/medsciupper_3.dmm @@ -271,7 +271,7 @@ /obj/machinery/door/airlock/grunge{ name = "Medical Maintenance Access" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/medical/morgue, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/modular_map_connector, @@ -468,6 +468,9 @@ /obj/effect/spawner/random/contraband/narcotics, /turf/open/floor/iron/smooth, /area/station/maintenance/department/medical) +"MY" = ( +/turf/closed/wall, +/area/station/asteroid) "Ny" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -1466,7 +1469,7 @@ Pu gZ hQ JY -wP +MY wP LV wP diff --git a/_maps/map_files/tramstation/maintenance_modules/secbarupper_1.dmm b/_maps/map_files/tramstation/maintenance_modules/secbarupper_1.dmm index 6c18e97d1378..127b72c632bb 100644 --- a/_maps/map_files/tramstation/maintenance_modules/secbarupper_1.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/secbarupper_1.dmm @@ -172,7 +172,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Security Maintenance Hatch" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -346,11 +346,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/duct, -/obj/structure/sign/warning/secure_area{ - desc = "A warning sign which reads 'MULE CROSSING - LOOK BOTH WAYS"; - name = "MULE CROSSING - LOOK BOTH WAYS"; - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/security) "Uo" = ( @@ -399,8 +395,8 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/department/security) "XI" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/sand/plating, +/obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/maintenance/department/security) "Yj" = ( @@ -758,7 +754,7 @@ eg (9,1,1) = {" eg Fc -XI +pH eg eg eg @@ -798,7 +794,7 @@ eg (10,1,1) = {" ZA bW -Rh +XI eg eg eg diff --git a/_maps/map_files/tramstation/maintenance_modules/secbarupper_2.dmm b/_maps/map_files/tramstation/maintenance_modules/secbarupper_2.dmm index 6b0093caccd2..d7cba70ef2fd 100644 --- a/_maps/map_files/tramstation/maintenance_modules/secbarupper_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/secbarupper_2.dmm @@ -30,11 +30,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/sign/warning/secure_area{ - desc = "A warning sign which reads 'MULE CROSSING - LOOK BOTH WAYS"; - name = "MULE CROSSING - LOOK BOTH WAYS"; - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/security) @@ -207,7 +203,7 @@ /obj/effect/turf_decal/trimline/yellow/arrow_ccw{ dir = 1 }, -/obj/machinery/light/small/directional/south, +/obj/machinery/light/small/directional/north, /turf/open/floor/iron/smooth, /area/station/maintenance/department/security) "CA" = ( @@ -308,7 +304,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Security Maintenance Hatch" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, diff --git a/_maps/map_files/tramstation/maintenance_modules/secbarupper_3.dmm b/_maps/map_files/tramstation/maintenance_modules/secbarupper_3.dmm index 9291070132b9..be69dfb9e701 100644 --- a/_maps/map_files/tramstation/maintenance_modules/secbarupper_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/secbarupper_3.dmm @@ -221,7 +221,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Security Maintenance Hatch" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -468,8 +468,8 @@ /turf/open/misc/asteroid, /area/station/maintenance/department/security) "VW" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/sand/plating, +/obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/maintenance/department/security) "Wo" = ( @@ -823,7 +823,7 @@ Py (9,1,1) = {" Py Wo -VW +uw Py Py Py @@ -863,7 +863,7 @@ Py (10,1,1) = {" Sc RO -fV +VW Py Py Py diff --git a/_maps/map_files/tramstation/maintenance_modules/secservicelower_1.dmm b/_maps/map_files/tramstation/maintenance_modules/secservicelower_1.dmm index ccd28eb4b312..7a44cf6394ba 100644 --- a/_maps/map_files/tramstation/maintenance_modules/secservicelower_1.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/secservicelower_1.dmm @@ -157,14 +157,9 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/port/central) -"kD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/smooth, -/area/station/maintenance/central/greater) "lS" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -261,7 +256,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/duct, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/structure/cable, @@ -411,6 +406,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, +/obj/machinery/light/small/directional/north, /turf/open/floor/iron/smooth, /area/station/maintenance/central/greater) "Bz" = ( @@ -2627,7 +2623,7 @@ TQ vR Ip VO -kD +PM nk nk nk diff --git a/_maps/map_files/tramstation/maintenance_modules/secservicelower_2.dmm b/_maps/map_files/tramstation/maintenance_modules/secservicelower_2.dmm index 9ba614bb7821..2a805eacb74d 100644 --- a/_maps/map_files/tramstation/maintenance_modules/secservicelower_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/secservicelower_2.dmm @@ -105,7 +105,7 @@ /area/station/maintenance/central/greater) "gc" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -159,7 +159,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/duct, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/structure/cable, diff --git a/_maps/map_files/tramstation/maintenance_modules/secservicelower_3.dmm b/_maps/map_files/tramstation/maintenance_modules/secservicelower_3.dmm index 3695915478ab..7af7a378d141 100644 --- a/_maps/map_files/tramstation/maintenance_modules/secservicelower_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/secservicelower_3.dmm @@ -105,7 +105,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/duct, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/structure/cable, @@ -311,7 +311,7 @@ /area/station/maintenance/port/central) "xH" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index be85fead0ff3..d5153099e4ae 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -41,7 +41,8 @@ "aah" = ( /obj/machinery/power/smes/engineering, /obj/structure/sign/warning/electric_shock{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -546,7 +547,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/escapepodbay) @@ -1107,7 +1108,7 @@ dir = 4 }, /obj/structure/closet/emcloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/escapepodbay) @@ -1497,7 +1498,7 @@ dir = 6 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "aeT" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 10 @@ -1507,7 +1508,7 @@ c_tag = "Secure - Nuclear Storage" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "aeV" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, @@ -1529,7 +1530,7 @@ /obj/effect/turf_decal/stripes/line, /obj/structure/cable, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "aeY" = ( /obj/effect/turf_decal/trimline/white/warning{ dir = 9 @@ -1599,7 +1600,7 @@ "afn" = ( /obj/machinery/nuclearbomb/selfdestruct, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "afo" = ( /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, @@ -1925,9 +1926,7 @@ /turf/open/floor/iron, /area/station/security/checkpoint/supply) "agK" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/misc/asteroid/airless, /area/station/asteroid) "agL" = ( @@ -2000,6 +1999,8 @@ }, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, +/obj/structure/closet/emcloset, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/service) "agW" = ( @@ -2294,7 +2295,8 @@ pixel_y = -9; id = "private_j"; specialfunctions = 4; - normaldoorcontrol = 1 + normaldoorcontrol = 1; + dir = 4 }, /turf/open/floor/wood, /area/station/commons/dorms) @@ -2387,7 +2389,8 @@ pixel_y = -9; id = "private_k"; specialfunctions = 4; - normaldoorcontrol = 1 + normaldoorcontrol = 1; + dir = 4 }, /turf/open/floor/carpet, /area/station/commons/dorms) @@ -2524,13 +2527,11 @@ /area/station/commons/dorms) "alb" = ( /obj/structure/chair/stool/directional/north, -/obj/machinery/button/door/directional/west{ +/obj/machinery/button/door/directional/east{ name = "Privacy Bolts"; - pixel_x = 24; - pixel_y = -9; id = "private_l"; - specialfunctions = 4; - normaldoorcontrol = 1 + normaldoorcontrol = 1; + specialfunctions = 4 }, /turf/open/floor/wood, /area/station/commons/dorms) @@ -2756,7 +2757,7 @@ }, /obj/machinery/light/floor, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "anr" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -2824,9 +2825,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 }, -/obj/structure/sign/warning/secure_area{ - pixel_x = 32 - }, +/obj/structure/sign/warning/secure_area/directional/east, /obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -2869,7 +2868,7 @@ "aoh" = ( /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "aor" = ( /obj/effect/landmark/start/station_engineer, /obj/effect/turf_decal/trimline/yellow/arrow_cw, @@ -3236,7 +3235,7 @@ /obj/machinery/cell_charger, /obj/item/stock_parts/power_store/cell/high, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "asQ" = ( /obj/structure/sign/warning/no_smoking, /turf/closed/wall, @@ -3374,7 +3373,7 @@ "aur" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "auz" = ( /turf/closed/wall, /area/station/commons/vacant_room) @@ -3449,7 +3448,7 @@ dir = 6 }, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "avj" = ( /obj/structure/table, /obj/machinery/syndicatebomb/training, @@ -3620,7 +3619,7 @@ dir = 4 }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/security/brig, @@ -3832,7 +3831,7 @@ "ayI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ayJ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -3855,6 +3854,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"ayP" = ( +/obj/machinery/suit_storage_unit/medical, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/station/medical/paramedic) "ayR" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/eva) @@ -3974,9 +3983,6 @@ /turf/open/floor/glass, /area/station/cargo/sorting) "aBq" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, /obj/effect/turf_decal/stripes/white/full, /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -4360,9 +4366,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, -/obj/structure/sign/departments/cargo{ - pixel_y = 32 - }, +/obj/structure/sign/departments/cargo/directional/north, /obj/effect/turf_decal/trimline/neutral/filled/warning{ dir = 1 }, @@ -4687,10 +4691,6 @@ /obj/effect/turf_decal/trimline/neutral/corner{ dir = 8 }, -/obj/structure/sign/departments/science{ - pixel_x = -32; - pixel_y = -32 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -4715,12 +4715,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"aHA" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "aHD" = ( /obj/structure/table/wood, /obj/item/radio/intercom/directional/north, @@ -4986,7 +4980,7 @@ dir = 1 }, /obj/effect/landmark/event_spawn, -/obj/machinery/computer/rdconsole, +/obj/machinery/computer/rdconsole/unlocked, /turf/open/floor/iron, /area/station/science/lab) "aKA" = ( @@ -5034,7 +5028,6 @@ /obj/machinery/door/airlock/medical/glass{ name = "Treatment Center" }, -/obj/effect/mapping_helpers/airlock/unres, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 }, @@ -5044,6 +5037,7 @@ /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/structure/cable, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "aKU" = ( @@ -5145,12 +5139,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"aLB" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/landmark/start/paramedic, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "aLC" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -5224,7 +5212,6 @@ /turf/open/floor/iron, /area/station/commons/storage/art) "aMt" = ( -/obj/structure/sign/warning/electric_shock, /obj/effect/turf_decal/stripes/end{ dir = 4 }, @@ -5342,7 +5329,7 @@ /area/station/command/bridge) "aNq" = ( /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "aNr" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/power/apc/auto_name/directional/south, @@ -5472,7 +5459,7 @@ "aOH" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "aOJ" = ( /obj/machinery/computer/crew{ dir = 8 @@ -5648,7 +5635,7 @@ dir = 8 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "aQf" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -5909,11 +5896,7 @@ /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 1 }, -/obj/structure/sign/warning/secure_area{ - name = "BOMB RANGE"; - desc = "A warning sign which reads 'BOMB RANGE"; - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -5988,7 +5971,7 @@ /obj/machinery/status_display/ai/directional/north, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "aUC" = ( /obj/machinery/camera/directional/south{ c_tag = "Civilian - Chapel South" @@ -6148,7 +6131,7 @@ dir = 4 }, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "aYA" = ( /turf/open/floor/iron, /area/station/hallway/primary/tram/right) @@ -6281,11 +6264,11 @@ }, /obj/machinery/status_display/ai/directional/east, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "bcI" = ( /obj/item/kirbyplants/photosynthetic, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bcL" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -6302,7 +6285,7 @@ }, /obj/effect/turf_decal/trimline/yellow/corner, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bcV" = ( /obj/effect/turf_decal/trimline/white/filled/corner{ dir = 1 @@ -6330,7 +6313,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bej" = ( /obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/trimline/green/filled/line, @@ -6506,7 +6489,7 @@ /obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, /obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bhG" = ( /obj/machinery/door/airlock/centcom{ name = "Syndicate Secure Airlock System"; @@ -6542,7 +6525,7 @@ }, /obj/item/radio/intercom/directional/west, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bio" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -6895,7 +6878,7 @@ }, /obj/effect/turf_decal/trimline/yellow/filled/warning, /turf/open/floor/iron/dark/side, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bqU" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/iron/dark, @@ -7017,7 +7000,7 @@ /area/station/service/kitchen/coldroom) "btC" = ( /obj/structure/closet/wardrobe/green, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, @@ -7284,7 +7267,7 @@ /area/station/service/janitor) "bya" = ( /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "byh" = ( /obj/structure/table/glass, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -7298,7 +7281,7 @@ dir = 8 }, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "byw" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -7335,7 +7318,7 @@ c_tag = "Secure - AI Antechamber North" }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "byH" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -7367,14 +7350,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/tram/mid) -"byW" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/plastic{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/maintenance/tram/mid) "bzo" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -7405,7 +7380,7 @@ }, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "bzN" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -7429,7 +7404,7 @@ name = "Tram Mechanical Room" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/structure/cable, @@ -7460,7 +7435,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bBl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7591,7 +7566,7 @@ /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) +/area/station/command/vault) "bEM" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -7624,7 +7599,7 @@ pixel_y = 2 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "bFo" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/camera/directional/south{ @@ -7665,7 +7640,7 @@ name = "Theatre Maintenance Hatch" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/structure/cable, @@ -7689,7 +7664,7 @@ /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/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -7805,7 +7780,7 @@ /turf/open/floor/iron, /area/station/cargo/office) "bHP" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -7886,7 +7861,7 @@ dir = 10 }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "bKb" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -7943,7 +7918,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "bKM" = ( /turf/open/floor/iron/dark, /area/station/commons/lounge) @@ -8062,7 +8037,7 @@ "bLO" = ( /obj/machinery/light/directional/north, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bLQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -8111,7 +8086,7 @@ }, /obj/machinery/bluespace_beacon, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "bME" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -8129,10 +8104,9 @@ /area/station/maintenance/central/greater) "bMZ" = ( /obj/effect/turf_decal/siding/thinplating/dark{ - dir = 6 + dir = 5 }, -/obj/structure/closet/emcloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) "bNa" = ( @@ -8151,7 +8125,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron/white, /area/station/science/research) "bNi" = ( @@ -8193,7 +8167,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "bNx" = ( /obj/structure/railing, /obj/machinery/door/firedoor/border_only, @@ -8606,7 +8580,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bVL" = ( /obj/structure/chair{ dir = 8 @@ -8957,7 +8931,7 @@ }, /obj/structure/cable, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "bZI" = ( /obj/machinery/door/window/brigdoor/left/directional/south{ name = "Secure Morgue Trays"; @@ -9004,6 +8978,16 @@ }, /turf/open/floor/engine/cult, /area/station/service/library) +"cas" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "cay" = ( /mob/living/basic/goat/pete, /obj/effect/turf_decal/weather/snow/corner{ @@ -9045,7 +9029,8 @@ dir = 4 }, /obj/structure/sign/departments/psychology{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) @@ -9111,6 +9096,16 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/east, /turf/open/floor/wood/large, /area/station/service/barber) +"cbU" = ( +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction/engineering) "cch" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/lattice/catwalk, @@ -9295,7 +9290,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "cey" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -9362,7 +9357,7 @@ dir = 6 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "cfp" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner, @@ -9422,6 +9417,9 @@ /area/station/science/ordnance/office) "cgd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 1 + }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) "cgl" = ( @@ -9433,7 +9431,7 @@ /turf/open/floor/iron/dark/corner{ dir = 4 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "cgw" = ( /obj/machinery/computer/operating{ dir = 8 @@ -9507,7 +9505,7 @@ /obj/effect/turf_decal/stripes/corner, /obj/machinery/light/floor, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "cht" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -9684,7 +9682,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "cmH" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -9981,18 +9979,14 @@ /turf/open/floor/iron/dark, /area/station/service/bar) "crU" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ +/obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 5 }, -/obj/structure/railing{ - dir = 4 +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 5 }, -/obj/structure/transport/linear/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) +/turf/open/floor/iron, +/area/station/hallway/secondary/construction/engineering) "crV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -10071,7 +10065,7 @@ name = "Maintenance Hatch" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/catwalk_floor, @@ -10456,6 +10450,9 @@ }, /obj/effect/turf_decal/stripes/white/line, /obj/effect/landmark/event_spawn, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/tram/mid) "czB" = ( @@ -10485,13 +10482,6 @@ name = "HoP Arrival Procedure Enforcement Shutters"; id = "papersplease" }, -/obj/machinery/button/door/directional/south{ - name = "Arrival Checkpoint Enforcement Override"; - pixel_x = 24; - pixel_y = 0; - id = "papersplease"; - req_access = list("kitchen") - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -10698,7 +10688,7 @@ dir = 5 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "cEg" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -10947,7 +10937,7 @@ "cHZ" = ( /obj/structure/railing, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "cIm" = ( /obj/structure/closet/radiation, /obj/effect/turf_decal/bot, @@ -11253,7 +11243,7 @@ }, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "cOg" = ( /obj/machinery/door/airlock/command/glass{ name = "EVA Storage" @@ -11265,7 +11255,7 @@ /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "cOl" = ( /obj/machinery/computer/prisoner/management{ dir = 8 @@ -11336,7 +11326,7 @@ dir = 4 }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "cPx" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 5 @@ -11439,6 +11429,7 @@ dir = 1 }, /obj/structure/cable/layer1, +/obj/structure/sign/warning/radiation/directional/south, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "cQD" = ( @@ -11652,7 +11643,7 @@ }, /obj/machinery/status_display/ai/directional/west, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "cUB" = ( /obj/effect/landmark/start/shaft_miner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11682,6 +11673,11 @@ dir = 1 }, /obj/machinery/light/cold/directional/north, +/obj/machinery/button/door/directional/north{ + id = "papersplease"; + name = "Arrival Checkpoint Enforcement Override"; + req_access = list("kitchen") + }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) "cVd" = ( @@ -11723,8 +11719,13 @@ "cVr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, +/obj/machinery/flasher/directional/west{ + id = "AI"; + pixel_y = 5; + pixel_x = -22 + }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "cVs" = ( /obj/effect/turf_decal/weather/snow, /obj/machinery/gibber, @@ -11781,7 +11782,7 @@ /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "cWl" = ( /obj/machinery/computer/shuttle/mining{ dir = 1 @@ -11832,7 +11833,7 @@ }, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "cXy" = ( /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, @@ -11875,7 +11876,7 @@ /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{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/catwalk_floor, @@ -12066,7 +12067,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/item/storage/toolbox/drone, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "dbr" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -12137,7 +12138,6 @@ /turf/open/floor/carpet, /area/station/service/theater) "dcq" = ( -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 }, @@ -12149,6 +12149,7 @@ /obj/effect/turf_decal/trimline/white/warning{ dir = 1 }, +/obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/iron, /area/station/maintenance/tram/mid) "dcz" = ( @@ -12357,7 +12358,7 @@ "dgd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12483,7 +12484,7 @@ /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "diN" = ( /obj/machinery/computer/slot_machine{ pixel_y = 2 @@ -12578,7 +12579,7 @@ }, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dkl" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -12671,7 +12672,7 @@ /area/station/maintenance/tram/left) "dml" = ( /obj/structure/closet/lasertag/red, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/sign/poster/official/random/directional/east, /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/dark/smooth_large, @@ -12733,7 +12734,8 @@ /area/station/science/breakroom) "dmX" = ( /obj/structure/sign/warning/radiation/rad_area{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -12778,7 +12780,7 @@ dir = 10 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "doa" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /obj/effect/spawner/structure/window/reinforced, @@ -12920,7 +12922,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "dqW" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -13012,11 +13014,17 @@ dir = 5 }, /area/station/service/chapel) +"dsm" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/tram/mid) "dst" = ( /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/security/armory) +/area/station/security/armory) "dsw" = ( /obj/machinery/modular_computer/preset/id{ dir = 8 @@ -13078,12 +13086,21 @@ /turf/open/floor/wood, /area/station/command/meeting_room) "dtz" = ( -/obj/machinery/flasher/directional/east{ - pixel_y = 26; - id = "AI" +/obj/structure/sign/directions/upload{ + dir = 4; + pixel_y = -7 }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/obj/structure/sign/directions/engineering{ + pixel_y = 7 + }, +/obj/structure/sign/directions/medical{ + pixel_y = 14 + }, +/obj/structure/sign/directions/evac{ + dir = 4 + }, +/turf/closed/wall, +/area/station/hallway/primary/tram/center) "dtA" = ( /turf/open/openspace, /area/station/security/courtroom/holding) @@ -13357,6 +13374,9 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/chair/plastic{ + dir = 4 + }, /turf/open/floor/iron, /area/station/maintenance/tram/mid) "dzu" = ( @@ -13473,7 +13493,7 @@ /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) +/area/station/command/vault) "dAR" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/bot, @@ -13503,7 +13523,7 @@ "dBj" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "dBM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -13650,7 +13670,7 @@ /area/station/hallway/primary/tram/right) "dEv" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "dEH" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ @@ -13775,7 +13795,7 @@ name = "Tunnel Access Hatch" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14033,10 +14053,10 @@ /obj/effect/landmark/event_spawn, /obj/structure/cable, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "dKV" = ( /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dLp" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 4 @@ -14092,14 +14112,13 @@ "dLS" = ( /obj/machinery/turretid{ name = "AI Chamber turret control"; - icon_state = "control_stun"; pixel_x = 3; pixel_y = -23 }, /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "dMg" = ( /turf/open/openspace, /area/station/maintenance/solars/starboard/fore) @@ -14144,7 +14163,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "dNp" = ( /obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -14202,7 +14221,7 @@ req_access = list("captain") }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "dNY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -14346,7 +14365,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "dQn" = ( /obj/machinery/power/supermatter_crystal/engine, /turf/open/floor/engine, @@ -14384,7 +14403,7 @@ pixel_y = -2 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "dQI" = ( /obj/machinery/disposal/bin, /obj/machinery/airalarm/directional/south, @@ -14698,7 +14717,7 @@ /area/station/cargo/storage) "dVM" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "dWd" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -14850,16 +14869,16 @@ /turf/open/floor/iron/dark, /area/station/cargo/drone_bay) "dYU" = ( -/obj/effect/turf_decal/caution/stand_clear/white{ - dir = 1 +/obj/structure/chair/office/light{ + dir = 4 }, -/obj/effect/turf_decal/stripes/white/line, -/obj/machinery/door/window/elevator/right/directional/south{ - elevator_mode = 1; - transport_linked_id = "tram_lower_center_lift" +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "dZu" = ( /obj/machinery/mecha_part_fabricator, /obj/effect/turf_decal/delivery, @@ -14890,6 +14909,7 @@ }, /obj/effect/turf_decal/trimline/red/filled/line, /obj/item/radio/intercom/directional/south, +/obj/effect/landmark/start/depsec/science, /turf/open/floor/iron, /area/station/security/checkpoint/science) "eaq" = ( @@ -15003,7 +15023,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "ecg" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -15221,7 +15241,7 @@ req_one_access = list("teleporter","minisat") }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "egK" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 @@ -15260,7 +15280,7 @@ /obj/structure/cable, /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ehS" = ( /obj/effect/turf_decal/trimline/white/line{ dir = 1 @@ -15268,7 +15288,7 @@ /obj/effect/turf_decal/trimline/yellow/line, /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "eiy" = ( /obj/structure/table/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, @@ -15406,7 +15426,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "ekh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15451,7 +15471,7 @@ /obj/effect/turf_decal/bot, /obj/structure/rack, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "elM" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue/opposingcorners, @@ -15741,7 +15761,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "esA" = ( /obj/machinery/iv_drip, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -15765,7 +15785,7 @@ /obj/effect/turf_decal/siding/thinplating/dark{ dir = 5 }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/primary/tram/right) @@ -15831,7 +15851,8 @@ name = "AI Upload Turret Control"; pixel_x = 25; req_access = list("minisat"); - control_area = "/area/station/ai_monitored/turret_protected/ai_upload" + control_area = "/area/station/ai/upload/chamber"; + dir = 4 }, /turf/open/floor/iron/dark, /area/station/science/lower) @@ -15986,7 +16007,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "exF" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -16032,7 +16053,8 @@ dir = 10 }, /obj/machinery/firealarm/directional/west{ - pixel_y = 5 + pixel_y = 5; + pixel_x = -22 }, /obj/machinery/light_switch/directional/west{ pixel_x = -22; @@ -16065,7 +16087,8 @@ /obj/structure/sign/warning/docking{ name = "KEEP CLEAR: TRAM DOCKING AREA sign"; desc = "A warning sign which reads 'KEEP CLEAR OF TRAM DOCKING AREA'."; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/siding/thinplating, /obj/structure/disposalpipe/segment{ @@ -16276,7 +16299,7 @@ /obj/machinery/space_heater, /obj/effect/turf_decal/bot, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "eBF" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -16351,7 +16374,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 }, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = -3; pixel_y = 3 }, @@ -16579,6 +16602,9 @@ /obj/structure/sign/poster/official/cleanliness/directional/west, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) +"eHN" = ( +/turf/closed/wall, +/area/station/medical/paramedic) "eHR" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -16649,7 +16675,7 @@ /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) +/area/station/security/armory) "eJI" = ( /obj/structure/closet/secure_closet/miner, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -16793,23 +16819,6 @@ /obj/machinery/computer/pandemic, /turf/open/floor/iron/white, /area/station/medical/virology) -"eNM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, -/obj/machinery/status_display/ai/directional/east{ - pixel_y = -32 - }, -/obj/structure/cable/layer1, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "eNP" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -16965,28 +16974,23 @@ /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/vault{ + dir = 8; + pixel_y = 7 }, -/obj/structure/sign/directions/upload{ - dir = 4; - pixel_y = 22 +/obj/structure/sign/directions/command{ + dir = 8; + pixel_y = -7 }, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 1 +/obj/structure/sign/directions/security{ + dir = 8; + pixel_y = 14 }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ +/obj/structure/sign/directions/supply{ dir = 1 }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) +/turf/closed/wall, +/area/station/hallway/primary/tram/right) "eQN" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/airalarm/directional/west, @@ -17079,7 +17083,7 @@ /obj/item/key/security, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "eSs" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -17105,10 +17109,10 @@ /area/station/hallway/primary/tram/center) "eSH" = ( /obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/tile/green/half/contrasted, /obj/machinery/computer/records/medical{ dir = 1 }, -/obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron, /area/station/command/bridge) "eSI" = ( @@ -17302,7 +17306,7 @@ freerange = 1 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "eVn" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -17749,16 +17753,12 @@ /turf/open/floor/iron, /area/station/commons/fitness/recreation) "ffe" = ( -/obj/machinery/flasher/directional/south{ - pixel_x = 20; - id = "AI" - }, /obj/machinery/door/window/brigdoor/right/directional/north{ name = "Primary AI Core Access"; req_access = list("ai_upload") }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ffh" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -17845,7 +17845,7 @@ dir = 8 }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "fhv" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 6 @@ -17930,7 +17930,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "fhM" = ( /obj/machinery/door/airlock/public/glass{ name = "Library" @@ -17982,7 +17982,7 @@ }, /obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "fiS" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Public Garden Maintenance Hatch" @@ -18295,6 +18295,7 @@ /turf/open/floor/engine, /area/station/engineering/supermatter/room) "fnZ" = ( +/obj/effect/landmark/start/depsec/science, /turf/open/floor/iron, /area/station/security/checkpoint/science) "fof" = ( @@ -18328,7 +18329,7 @@ dir = 8 }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/security/brig, @@ -19026,6 +19027,15 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron, /area/station/commons/storage/tools) +"fDA" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + name = "Office Shutters"; + id = "paramedic_shutters" + }, +/turf/open/floor/plating, +/area/station/medical/medbay/lobby) "fDS" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Laser Room" @@ -19102,7 +19112,7 @@ }, /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "fEZ" = ( /obj/structure/noticeboard/directional/north, /obj/item/fish_tank/lawyer, @@ -19193,7 +19203,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "fFO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/navigate_destination/disposals, @@ -19225,6 +19235,9 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron, /area/station/commons/dorms) +"fGF" = ( +/turf/closed/wall/r_wall, +/area/station/hallway/secondary/construction/engineering) "fGK" = ( /mob/living/carbon/human/species/monkey, /obj/structure/window/reinforced/spawner/directional/west, @@ -19285,7 +19298,7 @@ freerange = 1 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "fHV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -19466,11 +19479,9 @@ anchored = 1 }, /obj/effect/turf_decal/bot, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "fLE" = ( /obj/structure/table, /obj/machinery/camera/directional/north{ @@ -19561,7 +19572,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "fMQ" = ( /obj/machinery/air_sensor/ordnance_burn_chamber, /turf/open/floor/engine/vacuum, @@ -19614,7 +19625,7 @@ /area/station/maintenance/solars/port) "fNR" = ( /obj/structure/closet/lasertag/blue, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/structure/sign/poster/official/random/directional/east, /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/dark/smooth_large, @@ -19977,7 +19988,7 @@ dir = 1 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "fVN" = ( /obj/machinery/door/airlock/hatch{ name = "Emergency Exit" @@ -20047,11 +20058,19 @@ /turf/open/floor/iron/white, /area/station/science/lower) "fWX" = ( -/obj/structure/sign/departments/engineering{ - pixel_x = 32 +/obj/machinery/computer/records/medical{ + dir = 8 }, -/turf/open/openspace, -/area/station/hallway/primary/tram/center) +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/button/door/directional/east{ + pixel_y = 0; + id = "paramedic_shutters"; + name = "Shutters button"; + pixel_x = 23; + req_access = list("paramedic") + }, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "fXb" = ( /obj/machinery/door/airlock{ name = "Barber Maintenance" @@ -20074,10 +20093,7 @@ /turf/open/floor/wood/large, /area/station/service/barber) "fXf" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/vacuum/external/directional/west, /turf/open/floor/plating, /area/station/hallway/secondary/entry) "fXl" = ( @@ -20158,7 +20174,7 @@ }, /obj/machinery/status_display/ai/directional/east, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "fYB" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/catwalk_floor, @@ -20507,7 +20523,7 @@ /obj/effect/spawner/round_default_module, /obj/machinery/camera/motion/directional/east, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "gfX" = ( /obj/structure/fluff/iced_abductor, /turf/open/misc/asteroid/airless, @@ -20544,7 +20560,7 @@ /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) +/area/station/security/armory) "ggH" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -20655,6 +20671,7 @@ /obj/effect/turf_decal/trimline/neutral/corner{ dir = 1 }, +/obj/structure/sign/departments/cargo/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) "giT" = ( @@ -20813,9 +20830,6 @@ /obj/machinery/door/airlock/medical/glass{ name = "Treatment Center" }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, @@ -20824,6 +20838,9 @@ /obj/machinery/duct, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "glc" = ( @@ -20844,30 +20861,9 @@ /turf/open/floor/plating, /area/station/science/xenobiology) "glv" = ( -/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/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) +/obj/structure/sign/warning/electric_shock, +/turf/closed/wall/r_wall, +/area/station/maintenance/tram/right) "glP" = ( /obj/structure/chair/plastic, /turf/open/floor/eighties/red, @@ -20892,11 +20888,11 @@ /turf/open/floor/iron, /area/station/commons/dorms) "gmj" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 10 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/turf/open/floor/iron/dark, /area/station/maintenance/tram/mid) "gmm" = ( /obj/structure/cable, @@ -20998,27 +20994,22 @@ /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/vault{ + dir = 8; + pixel_y = 7 }, -/obj/structure/sign/directions/engineering{ - pixel_y = -40 +/obj/structure/sign/directions/command{ + dir = 8; + pixel_y = 14 }, -/obj/structure/sign/directions/upload{ - dir = 4; - pixel_y = -22 +/obj/structure/sign/directions/security{ + dir = 8; + pixel_y = -7 }, -/obj/structure/disposalpipe/segment{ +/obj/structure/sign/directions/supply{ 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, +/turf/closed/wall, /area/station/hallway/primary/tram/center) "gnL" = ( /obj/effect/turf_decal/trimline/red/filled/line, @@ -21216,7 +21207,7 @@ dir = 5 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "gsu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21273,6 +21264,15 @@ /obj/effect/turf_decal/trimline/red/filled/corner, /turf/open/floor/iron, /area/station/security/courtroom) +"gtC" = ( +/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, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/iron, +/area/station/maintenance/tram/mid) "gtN" = ( /obj/structure/table, /obj/item/storage/bag/tray, @@ -21308,7 +21308,7 @@ c_tag = "Secure - AI Lower Ring Access" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "gul" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -21406,7 +21406,8 @@ /area/station/hallway/primary/tram/left) "gwy" = ( /obj/structure/sign/warning/no_smoking{ - pixel_x = -28 + pixel_x = -28; + dir = 8 }, /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/atmos_control/nocontrol/incinerator{ @@ -21460,7 +21461,7 @@ /obj/machinery/flasher/portable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "gxm" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -21545,9 +21546,6 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/status_display/ai/directional/west{ - pixel_y = 32 - }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "gyN" = ( @@ -21587,7 +21585,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "gzY" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -21601,7 +21599,8 @@ dir = 8 }, /obj/structure/sign/warning/engine_safety{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /turf/open/floor/iron, /area/station/engineering/break_room) @@ -21903,7 +21902,7 @@ /area/station/science/research) "gFf" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "gFk" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -22084,6 +22083,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /obj/machinery/light/directional/east, +/obj/machinery/status_display/evac/directional/east, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "gJs" = ( @@ -22255,7 +22255,7 @@ /area/station/medical/medbay/central) "gNm" = ( /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "gNn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -22366,7 +22366,7 @@ dir = 8 }, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "gOA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -22401,7 +22401,7 @@ /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron/white/side, /area/station/science/research) "gOX" = ( @@ -22710,7 +22710,7 @@ c_tag = "Secure - AI Upper Ring North" }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "gVu" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/table, @@ -22795,7 +22795,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "gWD" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -22939,7 +22939,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "hae" = ( /obj/machinery/duct, /obj/structure/cable, @@ -23023,6 +23023,19 @@ }, /turf/open/floor/iron, /area/station/commons/storage/primary) +"hbv" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/paramedic, +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "hbQ" = ( /obj/machinery/camera/directional/north{ c_tag = "Civilian - Holodeck Controls" @@ -23149,7 +23162,7 @@ /turf/open/floor/iron/dark/side{ dir = 8 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "heS" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -23193,7 +23206,7 @@ c_tag = "Secure - AI Upper Ring West" }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "hft" = ( /obj/structure/bed{ dir = 8 @@ -23240,7 +23253,7 @@ "hgn" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "hgG" = ( /obj/structure/sign/warning/secure_area/directional/north, /obj/structure/disposalpipe/segment{ @@ -23266,7 +23279,7 @@ /obj/machinery/power/smes/super/full, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "hht" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23320,7 +23333,7 @@ dir = 4 }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "hif" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -23581,7 +23594,7 @@ pixel_y = -1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "hlB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -23900,7 +23913,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "htr" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/preopen{ @@ -24075,11 +24088,6 @@ dir = 1 }, /area/station/hallway/secondary/service) -"hxL" = ( -/obj/structure/transport/linear/public, -/obj/effect/turf_decal/caution/stand_clear/red, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) "hyE" = ( /obj/structure/table/glass, /obj/item/book/manual/wiki/security_space_law{ @@ -24119,7 +24127,7 @@ /area/station/command/teleporter) "hzN" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "hzQ" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/stripes/line{ @@ -24149,7 +24157,7 @@ /obj/effect/turf_decal/siding/thinplating/dark{ dir = 9 }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit) @@ -24217,7 +24225,7 @@ c_tag = "Secure - AI Upper Ring South" }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "hBK" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -24466,7 +24474,17 @@ /obj/item/pen, /obj/machinery/firealarm/directional/north, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) +"hGc" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/preopen{ + name = "Bridge Blast Door"; + id = "bunkermodeactivated" + }, +/obj/machinery/door/firedoor, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/iron, +/area/station/command/bridge) "hGd" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -24652,7 +24670,7 @@ /area/station/engineering/main) "hJl" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "hJA" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/machinery/meter, @@ -24766,7 +24784,7 @@ /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/spawner/random/armory/shotgun, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "hMs" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -24806,15 +24824,12 @@ /turf/open/floor/iron, /area/station/engineering/engine_smes) "hMQ" = ( -/obj/structure/sign/warning/secure_area{ - name = "HIGH SECURITY STORAGE"; - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "hNb" = ( /obj/structure/table/wood, /obj/item/papercutter{ @@ -24967,7 +24982,7 @@ /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/security/armory) +/area/station/security/armory) "hPA" = ( /obj/structure/chair/office{ dir = 1 @@ -25008,6 +25023,11 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"hPO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/asteroid) "hPQ" = ( /obj/structure/secure_safe/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -25046,18 +25066,15 @@ /turf/open/floor/iron, /area/station/science/ordnance/storage) "hQK" = ( -/obj/effect/turf_decal/siding/thinplating{ +/obj/effect/turf_decal/trimline/neutral/filled/warning{ dir = 4 }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 6 - }, -/obj/structure/railing{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 }, -/obj/structure/transport/linear/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) +/turf/open/floor/iron, +/area/station/hallway/secondary/construction/engineering) "hQZ" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/right/directional/south{ @@ -25260,7 +25277,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "hUQ" = ( /obj/machinery/teleport/station, /obj/structure/cable, @@ -25349,7 +25366,7 @@ /obj/machinery/status_display/ai/directional/north, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "hXK" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -25535,7 +25552,7 @@ freerange = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "hZL" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -25717,7 +25734,7 @@ dir = 10 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "idg" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -25819,7 +25836,7 @@ name = "Dormatories Maintenance Hatch" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -25924,7 +25941,7 @@ /obj/machinery/status_display/evac/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "ihl" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -26184,7 +26201,7 @@ name = "Recreation Area Maintenance Access" }, /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /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, @@ -26335,7 +26352,7 @@ pixel_y = 20 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "iqZ" = ( /obj/structure/railing, /obj/machinery/door/window/right/directional/north{ @@ -26364,7 +26381,7 @@ pixel_y = -8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "irv" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 9 @@ -26512,7 +26529,7 @@ dir = 10 }, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "iue" = ( /obj/structure/table/glass, /obj/item/radio/intercom, @@ -26667,7 +26684,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "iwV" = ( /obj/effect/turf_decal/trimline/white/filled/line{ dir = 4 @@ -26697,7 +26714,7 @@ /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/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/decal/cleanable/dirt, @@ -26730,7 +26747,7 @@ }, /obj/machinery/status_display/evac/directional/east, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "ixK" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/duct, @@ -27194,7 +27211,7 @@ dir = 6 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "iHI" = ( /obj/machinery/door/airlock/public/glass{ name = "Courtroom" @@ -27255,21 +27272,6 @@ /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/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/tram/filled/line, @@ -27305,7 +27307,7 @@ /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "iKg" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 1 @@ -27547,7 +27549,8 @@ /obj/machinery/button/flasher{ pixel_x = 23; pixel_y = -10; - id = "hopflash" + id = "hopflash"; + dir = 4 }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) @@ -27761,7 +27764,7 @@ }, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "iSt" = ( /obj/structure/table/wood, /obj/item/staff/broom, @@ -27846,7 +27849,7 @@ }, /obj/item/kirbyplants/photosynthetic, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "iTO" = ( /obj/structure/window/spawner/directional/east, /obj/structure/window/spawner/directional/west, @@ -27945,7 +27948,7 @@ /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "iVj" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -28052,12 +28055,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "iWQ" = ( /obj/structure/chair/office{ dir = 4 }, -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) "iXx" = ( @@ -28112,6 +28115,14 @@ }, /turf/open/floor/plating/airless, /area/station/asteroid) +"iYD" = ( +/obj/machinery/flasher/directional/east{ + id = "AI"; + pixel_x = 22; + pixel_y = -5 + }, +/turf/open/floor/circuit, +/area/station/ai/satellite/chamber) "iYO" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -28405,7 +28416,7 @@ name = "Vacant Office A" }, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -28425,7 +28436,7 @@ /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "jdt" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -28522,7 +28533,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "jeS" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 @@ -28562,7 +28573,7 @@ "jfu" = ( /obj/structure/cable, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "jfD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, /turf/open/floor/engine, @@ -28606,7 +28617,7 @@ "jgq" = ( /obj/structure/railing/corner, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "jgs" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -28721,7 +28732,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "jim" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ @@ -28844,7 +28855,7 @@ }, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "jkn" = ( /obj/machinery/door/airlock{ name = "Custodial Closet" @@ -28925,7 +28936,7 @@ /obj/effect/turf_decal/stripes/end, /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "jlo" = ( /obj/machinery/conveyor/inverted{ dir = 9; @@ -28945,7 +28956,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/spawner/random/armory/dragnet, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "jlX" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -29024,7 +29035,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "jnq" = ( /turf/closed/wall, /area/station/maintenance/central/lesser) @@ -29217,7 +29228,7 @@ dir = 8 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "jqv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -29233,6 +29244,13 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"jqH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/tram/mid) "jqK" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -29327,13 +29345,13 @@ }, /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "jrR" = ( /obj/effect/turf_decal/trimline/white/line{ dir = 5 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "jst" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -29468,13 +29486,9 @@ "jus" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/flasher/directional/west{ - pixel_y = -26; - id = "AI" - }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "juw" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -29501,9 +29515,9 @@ /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/cable, -/obj/effect/spawner/random/armory/laser_gun, +/obj/effect/spawner/random/armory/pick_laser_loadout, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "juV" = ( /obj/structure/chair{ dir = 8 @@ -29722,7 +29736,7 @@ name = "Science Maintenance Hatch" }, /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -30012,6 +30026,18 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos) +"jCX" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/bed/dogbed{ + name = "cat bed"; + desc = "A comfy-looking cat bed. You can even strap your pet in, in case the gravity turns off." + }, +/mob/living/basic/pet/cat/jerry, +/turf/open/floor/iron, +/area/station/maintenance/tram/mid) "jDd" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/rnd_secure_all, @@ -30175,10 +30201,10 @@ dir = 1 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "jFR" = ( /turf/open/floor/iron/grimy, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "jGi" = ( /obj/effect/turf_decal/siding/thinplating, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30252,7 +30278,7 @@ "jHc" = ( /obj/structure/rack, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "jHd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -30305,7 +30331,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "jIy" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/rnd_all, @@ -30353,7 +30379,7 @@ /area/station/cargo/sorting) "jJv" = ( /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "jJz" = ( /obj/structure/chair{ dir = 8 @@ -30410,7 +30436,7 @@ /area/station/cargo/storage) "jJX" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/machinery/door/airlock/maintenance_hatch{ @@ -30506,7 +30532,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "jLy" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -30540,14 +30566,12 @@ /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{ network = list("ss13","Security"); c_tag = "Civilian - Security Outpost" }, /obj/machinery/light/directional/south, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron, /area/station/security/checkpoint/arrivals) "jMo" = ( @@ -30902,7 +30926,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "jUW" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ @@ -30928,15 +30952,12 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/central) "jVG" = ( -/obj/structure/sign/warning/secure_area{ - name = "HIGH SECURITY STORAGE"; - pixel_y = 32 - }, +/obj/structure/sign/warning/secure_area/directional/north, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "jVT" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -30968,7 +30989,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "jWg" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/camera/directional/south{ @@ -31005,7 +31026,7 @@ dir = 5 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "jWs" = ( /turf/closed/wall/r_wall, /area/station/security/execution/transfer) @@ -31175,7 +31196,7 @@ /area/station/service/chapel/office) "jYf" = ( /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "jYj" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -31190,7 +31211,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "jYr" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/door/airlock/maintenance_hatch{ @@ -31198,7 +31219,7 @@ }, /obj/machinery/duct, /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/structure/cable, @@ -31397,7 +31418,7 @@ pixel_y = 20 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "kbi" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 4 @@ -31450,22 +31471,14 @@ /turf/open/floor/plating, /area/station/maintenance/tram/left) "kbG" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ +/obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 }, -/obj/structure/railing{ +/obj/effect/turf_decal/trimline/neutral/filled/warning{ dir = 4 }, -/obj/structure/transport/linear/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) +/turf/open/floor/iron, +/area/station/hallway/secondary/construction/engineering) "kbM" = ( /obj/structure/table/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31723,7 +31736,7 @@ "keJ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "keN" = ( /obj/item/radio/intercom/directional/east, /turf/open/floor/iron, @@ -31861,7 +31874,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "kgG" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -31951,6 +31964,9 @@ name = "Secure Medical Storage"; req_access = list("medical") }, +/obj/item/defibrillator/loaded{ + pixel_y = 6 + }, /obj/item/clothing/glasses/blindfold, /obj/item/clothing/glasses/blindfold, /obj/item/clothing/ears/earmuffs, @@ -31960,6 +31976,16 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) +"kiG" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/chair/sofa/corp/right{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "kiN" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -31967,6 +31993,7 @@ }, /obj/machinery/firealarm/directional/west, /obj/machinery/light/cold/directional/north, +/obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "kiT" = ( @@ -32027,7 +32054,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/floor, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "kjH" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/white/full, @@ -32090,7 +32117,8 @@ pixel_y = 9; id = "private_a"; specialfunctions = 4; - normaldoorcontrol = 1 + normaldoorcontrol = 1; + dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32165,7 +32193,7 @@ /obj/machinery/suit_storage_unit/security, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "kli" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -32206,7 +32234,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/center) @@ -32300,6 +32328,11 @@ /obj/machinery/door/firedoor, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"knG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plating, +/area/station/maintenance/tram/mid) "knM" = ( /obj/effect/turf_decal/trimline/neutral/warning, /obj/machinery/smartfridge/organ, @@ -32807,7 +32840,7 @@ "kwe" = ( /obj/structure/ladder, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "kwk" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -32846,7 +32879,7 @@ /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/spawner/random/armory/disablers, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "kwD" = ( /obj/effect/landmark/start/cargo_technician, /turf/open/floor/glass, @@ -32858,15 +32891,11 @@ /turf/open/floor/iron, /area/station/commons/fitness/recreation) "kxC" = ( -/mob/living/basic/pet/cat/jerry, /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 10 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/bed/dogbed{ - name = "cat bed"; - desc = "A comfy-looking cat bed. You can even strap your pet in, in case the gravity turns off." - }, +/obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/iron, /area/station/maintenance/tram/mid) "kxF" = ( @@ -33029,7 +33058,7 @@ /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "kzT" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -33232,7 +33261,7 @@ /turf/open/floor/iron/dark/corner{ dir = 8 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "kDF" = ( /obj/structure/closet/wardrobe/miner, /obj/structure/disposalpipe/segment, @@ -33269,6 +33298,12 @@ }, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"kEM" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "kEN" = ( /obj/structure/stairs/north, /turf/open/floor/iron/stairs/right, @@ -34035,7 +34070,7 @@ /turf/open/floor/iron/dark/side{ dir = 4 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "kPC" = ( /turf/closed/wall/rust, /area/station/security/prison/workout) @@ -34090,7 +34125,7 @@ /obj/machinery/cell_charger, /obj/item/stock_parts/power_store/cell/high, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "kQR" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/item/food/grown/banana/bunch{ @@ -34649,7 +34684,7 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "kZB" = ( /obj/effect/landmark/start/hangover, /obj/structure/cable, @@ -34698,7 +34733,7 @@ c_tag = "Secure - AI Antechamber East" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "kZM" = ( /obj/machinery/holopad, /obj/effect/turf_decal/box/white{ @@ -34905,14 +34940,17 @@ }, /obj/machinery/button/door/incinerator_vent_ordmix{ pixel_x = 24; - pixel_y = 8 + pixel_y = 8; + dir = 4 }, /obj/machinery/button/ignition/incinerator/ordmix{ pixel_x = 24; - pixel_y = -6 + pixel_y = -6; + dir = 4 }, /obj/machinery/airlock_controller/incinerator_ordmix{ - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/engine, @@ -34988,8 +35026,8 @@ "lgP" = ( /obj/effect/turf_decal/stripes/corner, /obj/structure/rack, -/obj/item/tank/jetpack/oxygen, -/obj/item/tank/jetpack/oxygen{ +/obj/item/tank/jetpack, +/obj/item/tank/jetpack{ pixel_x = 3; pixel_y = 3 }, @@ -35049,19 +35087,18 @@ /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) "liB" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 +/obj/effect/spawner/structure/window, +/obj/structure/curtain/cloth{ + color = "#52B4E9" }, -/obj/machinery/computer/crew, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/turf/open/floor/plating, +/area/station/medical/paramedic) "liC" = ( /obj/machinery/porta_turret/ai{ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "liN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, @@ -35074,7 +35111,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "lje" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -35287,18 +35324,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) -"llU" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 1 - }, -/obj/machinery/button/elevator/directional/north{ - id = "tram_lower_center_lift" - }, -/obj/machinery/lift_indicator/directional/north{ - linked_elevator_id = "tram_lower_center_lift" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction/engineering) "llY" = ( /obj/machinery/computer/dna_console{ dir = 4 @@ -35350,6 +35375,16 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/commons/dorms) +"lmF" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "lmG" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -35377,11 +35412,18 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "lns" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/space_heater, /turf/open/floor/iron, -/area/station/maintenance/tram/mid) +/area/station/hallway/secondary/construction/engineering) "lnO" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -35471,7 +35513,7 @@ }, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "loG" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -35592,7 +35634,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "lqS" = ( /obj/structure/table/wood, /obj/item/book/bible, @@ -35663,13 +35705,13 @@ /obj/effect/mapping_helpers/requests_console/assistance, /obj/structure/cable/multilayer/connected, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lry" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "lrA" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -35797,16 +35839,6 @@ "ltw" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain/private) -"ltL" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/item/stack/medical/mesh, -/obj/item/stack/medical/gauze, -/obj/structure/table/glass, -/obj/machinery/digital_clock/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "ltZ" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 5 @@ -35996,7 +36028,7 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lxm" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -36141,7 +36173,7 @@ /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) +/area/station/security/armory) "lyK" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -36249,7 +36281,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "lAO" = ( /obj/machinery/atmospherics/pipe/smart/manifold/violet/visible{ dir = 4 @@ -36513,12 +36545,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"lEL" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "lEU" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 @@ -36628,10 +36654,10 @@ /obj/machinery/turretid{ name = "AI Antechamber turret control"; pixel_y = -25; - control_area = "/area/station/ai_monitored/turret_protected/aisat_interior" + control_area = "/area/station/ai/satellite/interior" }, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "lHp" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/light/small/directional/north, @@ -36763,9 +36789,7 @@ /turf/open/floor/iron, /area/station/cargo/miningdock) "lJu" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, +/obj/structure/sign/warning/vacuum/external/directional/west, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 }, @@ -36811,7 +36835,7 @@ /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) +/area/station/command/vault) "lKE" = ( /obj/structure/table, /obj/item/storage/box/donkpockets, @@ -37171,12 +37195,8 @@ /area/station/cargo/warehouse) "lQH" = ( /obj/effect/turf_decal/caution/stand_clear/white, -/obj/machinery/door/window/elevator/left/directional/north{ - elevator_mode = 1; - transport_linked_id = "tram_lower_center_lift" - }, /turf/open/floor/iron, -/area/station/maintenance/tram/mid) +/area/station/hallway/secondary/construction/engineering) "lQM" = ( /turf/closed/wall/r_wall, /area/station/maintenance/port/central) @@ -37277,7 +37297,7 @@ dir = 1 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lSI" = ( /obj/machinery/newscaster/directional/east, /obj/machinery/conveyor_switch/oneway{ @@ -37310,7 +37330,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, -/obj/effect/landmark/start/paramedic, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "lTh" = ( @@ -37769,7 +37788,8 @@ pixel_x = 9; pixel_y = 27; id = "permafrontdoor"; - req_access = list("brig") + req_access = list("brig"); + dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37911,7 +37931,7 @@ /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/security/armory) +/area/station/security/armory) "mcX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -37944,13 +37964,13 @@ dir = 9 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "mdr" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "mdD" = ( /obj/effect/turf_decal/siding/thinplating, /obj/effect/turf_decal/siding/thinplating{ @@ -37980,7 +38000,7 @@ /area/station/maintenance/tram/left) "mdV" = ( /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "meb" = ( /obj/effect/landmark/carpspawn, /turf/open/space/openspace, @@ -38133,7 +38153,6 @@ listening = 0; freerange = 1 }, -/obj/effect/landmark/start/ai, /obj/machinery/button/door/directional/south{ name = "AI Core Shutters Control"; pixel_x = 24; @@ -38141,8 +38160,9 @@ req_access = list("ai_upload") }, /obj/structure/cable, +/obj/effect/landmark/start/ai, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "mgj" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -38692,7 +38712,7 @@ c_tag = "Secure - AI Upper Ring Access" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "mrS" = ( /obj/structure/chair{ dir = 8 @@ -38895,7 +38915,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "mxf" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -38909,7 +38929,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "mxw" = ( /obj/machinery/door/airlock/research{ name = "Chemical Storage" @@ -38927,11 +38947,10 @@ /turf/open/floor/carpet, /area/station/commons/vacant_room/office) "mxR" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 10 +/obj/effect/turf_decal/siding/thinplating/dark/end{ + dir = 8 }, -/obj/structure/closet/firecloset, -/obj/effect/landmark/start/hangover/closet, +/obj/structure/table, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) "mya" = ( @@ -39273,7 +39292,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "mEd" = ( /obj/structure/railing{ dir = 1 @@ -39376,7 +39395,7 @@ "mGl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "mGo" = ( /obj/structure/railing, /obj/machinery/door/firedoor/border_only, @@ -39436,7 +39455,7 @@ c_tag = "Secure - AI Antechamber West" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "mHc" = ( /turf/open/floor/iron/checker, /area/station/commons/lounge) @@ -39455,7 +39474,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/iron/smooth, @@ -39482,6 +39501,9 @@ }, /obj/effect/turf_decal/stripes/white/line, /obj/structure/lattice/catwalk, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/tram/mid) "mHP" = ( @@ -39618,6 +39640,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/showroomfloor, /area/station/security/lockers) +"mJE" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "mJG" = ( /obj/structure/chair/stool/bar/directional/north, /obj/effect/turf_decal/siding/thinplating{ @@ -39678,7 +39707,7 @@ /obj/vehicle/ridden/secway, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "mKQ" = ( /obj/machinery/dna_infuser, /obj/structure/extinguisher_cabinet/directional/east, @@ -39746,7 +39775,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "mMn" = ( @@ -39877,7 +39906,7 @@ dir = 8 }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/security/brig, @@ -39935,6 +39964,13 @@ }, /turf/open/floor/iron, /area/station/security/courtroom/holding) +"mQH" = ( +/obj/machinery/computer/crew{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "mQS" = ( /obj/structure/chair/comfy/beige, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -40200,7 +40236,7 @@ dir = 4 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "mYw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -40213,7 +40249,7 @@ }, /obj/machinery/newscaster/directional/north, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "mYI" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -40372,7 +40408,7 @@ /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "nbI" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -40453,8 +40489,12 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/cable, +/obj/machinery/flasher/directional/south{ + id = "AI"; + pixel_x = -10 + }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ndz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40664,11 +40704,11 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/unres, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "nhj" = ( @@ -40820,7 +40860,7 @@ /area/station/solars/starboard/fore) "njC" = ( /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "njI" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 1 @@ -40866,7 +40906,8 @@ dir = 4 }, /obj/structure/sign/departments/security{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /obj/machinery/light/directional/west, /turf/open/floor/iron, @@ -40996,7 +41037,7 @@ /turf/open/floor/iron, /area/station/hallway/secondary/service) "nlF" = ( -/obj/machinery/computer/rdconsole{ +/obj/machinery/computer/rdconsole/unlocked{ dir = 8 }, /obj/structure/window/reinforced/spawner/directional/east, @@ -41300,7 +41341,7 @@ req_access = list("captain") }, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "nrh" = ( /obj/structure/table/glass, /obj/item/storage/fancy/coffee_cart_rack{ @@ -41395,7 +41436,7 @@ }, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nsv" = ( /obj/machinery/camera/directional/north{ network = list("test","rd"); @@ -41533,7 +41574,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/floor, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "nwd" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -41890,6 +41931,14 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/center) +"nBg" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 9 + }, +/obj/structure/closet/firecloset, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "nBj" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -41913,7 +41962,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "nBy" = ( @@ -41934,7 +41983,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nCe" = ( /turf/open/floor/iron, /area/station/security/courtroom) @@ -41945,6 +41994,19 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/science/ordnance) +"nCl" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/structure/chair/sofa/corp/left{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/east{ + pixel_x = 26 + }, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "nCy" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -42010,32 +42072,22 @@ /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{ +/obj/structure/sign/directions/vault{ dir = 1; - pixel_y = 34 + pixel_y = 7 }, /obj/structure/sign/directions/command{ dir = 1; - pixel_y = 40 + pixel_y = -7 }, -/obj/structure/sign/directions/vault{ +/obj/structure/sign/directions/security{ dir = 1; - pixel_y = 22 + pixel_y = 14 }, -/obj/structure/disposalpipe/segment{ +/obj/structure/sign/directions/supply{ 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, +/turf/closed/wall, /area/station/hallway/primary/tram/left) "nEB" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ @@ -42296,22 +42348,6 @@ /turf/open/floor/iron, /area/station/hallway/secondary/command) "nKo" = ( -/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 }, @@ -42342,6 +42378,7 @@ dir = 4 }, /obj/machinery/light/directional/east, +/obj/machinery/status_display/ai/directional/east, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "nKU" = ( @@ -42474,7 +42511,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "nNl" = ( /obj/structure/holosign/barrier/atmos/tram, /obj/structure/disposalpipe/segment{ @@ -42534,7 +42571,7 @@ name = "Tram Mechanical Room" }, /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/iron/smooth, @@ -42692,12 +42729,14 @@ }, /area/station/command/gateway) "nRK" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ +/obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 }, -/obj/structure/transport/linear/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction/engineering) "nRO" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -43099,22 +43138,6 @@ /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 }, @@ -43154,7 +43177,7 @@ name = "Recreation Area Maintenance Hatch" }, /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43228,7 +43251,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 }, -/obj/machinery/airalarm/directional/east, /obj/structure/disposalpipe/trunk{ dir = 8 }, @@ -43318,7 +43340,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "obz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/preopen{ @@ -43409,9 +43431,8 @@ "odF" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "odH" = ( -/obj/structure/closet/l3closet, /obj/effect/turf_decal/siding/white{ dir = 1 }, @@ -43600,31 +43621,10 @@ /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 +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/warning, +/obj/structure/sign/departments/science{ + pixel_y = -32 }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) @@ -43998,10 +43998,10 @@ "oqi" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "oqp" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "oqy" = ( /obj/machinery/conveyor{ id = "cargolower" @@ -44207,7 +44207,7 @@ dir = 9 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ouE" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 4 @@ -44235,7 +44235,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "ouQ" = ( /obj/effect/turf_decal/siding/wood/corner, /turf/open/floor/wood, @@ -44502,7 +44502,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "oCe" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -44573,7 +44573,7 @@ dir = 1 }, /obj/machinery/firealarm/directional/east, -/obj/machinery/suit_storage_unit/medical, +/obj/structure/closet/l3closet, /turf/open/floor/iron/dark, /area/station/medical/storage) "oDj" = ( @@ -44883,7 +44883,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "oLn" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/turf_decal/siding/thinplating{ @@ -44928,13 +44928,13 @@ /area/station/science/research) "oMI" = ( /turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "oMK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "oMP" = ( /obj/machinery/firealarm/directional/south{ pixel_x = 3 @@ -44972,7 +44972,7 @@ }, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "oNp" = ( /obj/structure/sink{ pixel_y = 15 @@ -45025,15 +45025,15 @@ /turf/open/floor/iron/freezer, /area/station/science/lower) "oNW" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ +/obj/effect/turf_decal/trimline/neutral/filled/warning{ dir = 9 }, -/obj/structure/railing{ - dir = 8 +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 9 }, -/obj/structure/transport/linear/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) +/obj/structure/closet/firecloset, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction/engineering) "oOb" = ( /obj/structure/railing, /obj/effect/turf_decal/delivery, @@ -45166,7 +45166,7 @@ /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) +/area/station/command/vault) "oQU" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/misc/grass/jungle/station, @@ -45295,7 +45295,7 @@ dir = 9 }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "oTc" = ( /obj/machinery/conveyor{ dir = 6; @@ -45487,7 +45487,7 @@ /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/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "oWZ" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -45517,7 +45517,7 @@ id = "teledoor" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "oXz" = ( /obj/machinery/iv_drip, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -45691,7 +45691,7 @@ /obj/structure/cable, /obj/effect/spawner/random/armory/e_gun, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "pbr" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/stripes/line{ @@ -45741,16 +45741,6 @@ "pcu" = ( /turf/closed/wall/r_wall, /area/station/maintenance/tram/mid) -"pcx" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/maintenance/tram/mid) "pcA" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/herringbone, @@ -46342,7 +46332,7 @@ /obj/item/folder/documents, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "pnD" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -46369,7 +46359,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "pnU" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -46475,12 +46465,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/office) -"pps" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "ppK" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -46513,7 +46497,8 @@ dir = 1 }, /obj/structure/sign/departments/security{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/machinery/light/directional/east, /turf/open/floor/iron, @@ -46657,7 +46642,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "pth" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/structure/sign/warning/secure_area/directional/north, @@ -46745,7 +46730,7 @@ dir = 9 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "puL" = ( /obj/machinery/door/airlock/research/glass/incinerator/ordmix_exterior{ name = "Burn Chamber Exterior Airlock" @@ -46790,7 +46775,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "pvp" = ( /obj/effect/turf_decal/trimline/yellow/filled/end{ dir = 1 @@ -46815,32 +46800,23 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "pvI" = ( -/obj/structure/sign/directions/evac{ +/obj/structure/sign/directions/upload{ dir = 4; - pixel_y = 28 - }, -/obj/structure/sign/directions/medical{ - dir = 8; - pixel_y = 34 + pixel_y = -7 }, /obj/structure/sign/directions/engineering{ - dir = 8; - pixel_y = 40 - }, -/obj/structure/sign/directions/upload{ - pixel_y = 22 + dir = 4; + pixel_y = 7 }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 1 +/obj/structure/sign/directions/medical{ + dir = 4; + pixel_y = 14 }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 1 +/obj/structure/sign/directions/evac{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) +/turf/closed/wall, +/area/station/hallway/primary/tram/left) "pvL" = ( /obj/structure/railing/corner, /obj/effect/turf_decal/trimline/yellow/filled/corner, @@ -46935,7 +46911,8 @@ "pxf" = ( /obj/structure/closet/secure_closet/hos, /obj/structure/secure_safe/hos{ - pixel_x = 35 + pixel_x = 35; + dir = 1 }, /obj/structure/sign/poster/official/space_cops/directional/north, /turf/open/floor/carpet, @@ -47030,6 +47007,18 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"pyq" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "pyz" = ( /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -47049,7 +47038,7 @@ req_access = list("security") }, /turf/open/floor/plating, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "pyG" = ( /obj/machinery/atmospherics/components/binary/tank_compressor{ dir = 8 @@ -47148,7 +47137,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "pAv" = ( /obj/structure/curtain, /obj/machinery/shower/directional/north, @@ -47165,7 +47154,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/navigate_destination/vault, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "pAC" = ( /obj/effect/turf_decal/siding/thinplating/end, /obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4{ @@ -47175,7 +47164,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "pAD" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ dir = 1 @@ -47205,7 +47194,7 @@ dir = 1 }, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron/white, /area/station/science/research) "pAT" = ( @@ -47413,7 +47402,7 @@ /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron/white/side, /area/station/science/research) "pFm" = ( @@ -47421,7 +47410,7 @@ dir = 4 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "pFu" = ( /obj/item/experi_scanner{ pixel_x = 5 @@ -47618,6 +47607,9 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningdock) +"pIc" = ( +/turf/closed/wall, +/area/station/hallway/secondary/construction/engineering) "pIk" = ( /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47636,7 +47628,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "pIt" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -47683,7 +47675,7 @@ "pIQ" = ( /obj/structure/cable, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "pIS" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -47849,7 +47841,7 @@ "pMi" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "pMk" = ( /turf/closed/wall/r_wall, /area/station/science/research) @@ -47881,7 +47873,7 @@ /obj/effect/turf_decal/siding/thinplating/corner, /obj/structure/ladder, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "pMS" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -48087,15 +48079,15 @@ /turf/open/floor/glass, /area/station/commons/fitness/recreation) "pPN" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 10 +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 8 }, -/obj/structure/railing{ +/obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 }, -/obj/structure/transport/linear/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction/engineering) "pPP" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 8 @@ -48164,7 +48156,7 @@ dir = 8 }, /turf/open/floor/plating/airless, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "pRm" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -48277,7 +48269,7 @@ "pUz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "pUC" = ( /obj/machinery/portable_atmospherics/pump{ name = "Lil Pump" @@ -48413,13 +48405,13 @@ /turf/open/floor/iron, /area/station/service/hydroponics/garden) "pWN" = ( -/obj/structure/plaque/static_plaque/golden/commission/tram, /obj/structure/disposalpipe/segment{ dir = 5 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/structure/plaque/static_plaque/golden/commission/tram, /turf/open/floor/iron/dark, /area/station/command/bridge) "pWO" = ( @@ -48467,7 +48459,7 @@ }, /obj/item/kirbyplants/photosynthetic, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "pXq" = ( /mob/living/simple_animal/bot/mulebot, /obj/effect/turf_decal/delivery, @@ -48488,7 +48480,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "pXG" = ( /obj/structure/railing{ dir = 8 @@ -48666,7 +48658,7 @@ /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/ai_monitored/command/nuke_storage) +/area/station/command/vault) "qaN" = ( /obj/structure/cable, /turf/open/floor/carpet, @@ -48740,7 +48732,7 @@ /turf/open/floor/iron, /area/station/security/courtroom) "qcw" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 1 }, /obj/item/radio/intercom/directional/south, @@ -49052,9 +49044,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) "qib" = ( @@ -49073,7 +49063,6 @@ /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/medical/coldroom) "qik" = ( -/obj/structure/sign/warning/radiation, /obj/effect/baseturf_helper/space, /turf/closed/wall/r_wall, /area/station/engineering/supermatter) @@ -49253,7 +49242,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Tunnel Access Hatch" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/iron/smooth, @@ -49328,7 +49317,7 @@ }, /obj/effect/turf_decal/trimline/yellow/filled/corner, /turf/open/floor/iron/dark/corner, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "qnd" = ( /obj/structure/rack, /obj/item/reagent_containers/cup/bottle/iron{ @@ -49425,6 +49414,10 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) +"qpd" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/asteroid) "qpj" = ( /obj/structure/chair/stool/bar/directional/east, /obj/effect/landmark/start/prisoner, @@ -49447,6 +49440,10 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"qpv" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/hallway/secondary/construction/engineering) "qpD" = ( /turf/open/misc/asteroid, /area/station/maintenance/department/eva) @@ -49508,15 +49505,12 @@ /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "qrg" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/obj/machinery/status_display/evac/directional/east{ - pixel_y = 32 - }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "qrl" = ( @@ -49543,6 +49537,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"qrF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/tram/mid) "qrI" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -49575,6 +49580,7 @@ "qsm" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/sign/poster/official/safety_report/directional/south, +/obj/effect/landmark/start/depsec/science, /turf/open/floor/iron, /area/station/security/checkpoint/science) "qsJ" = ( @@ -49640,10 +49646,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 }, -/obj/structure/sign/departments/cargo{ - pixel_x = -32; - pixel_y = 32 - }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) "qtM" = ( @@ -49679,7 +49681,7 @@ /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "qug" = ( /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49967,7 +49969,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Tunnel Access Hatch" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/structure/disposalpipe/segment, @@ -50145,33 +50147,23 @@ /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/sign/directions/vault{ + dir = 8; + pixel_y = 7 }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/sign/directions/command{ + dir = 8; + pixel_y = 14 }, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 1 +/obj/structure/sign/directions/security{ + dir = 8; + pixel_y = -7 }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ +/obj/structure/sign/directions/supply{ dir = 1 }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/left) +/turf/closed/wall, +/area/station/hallway/primary/tram/right) "qCP" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -50257,16 +50249,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/iron/dark/airless, /area/station/science/ordnance/freezerchamber) -"qDQ" = ( -/obj/structure/transport/linear/public, -/obj/effect/landmark/transport/transport_id{ - specific_transport_id = "tram_lower_center_lift" - }, -/obj/effect/abstract/elevator_music_zone{ - linked_elevator_id = "tram_lower_center_lift" - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) "qEb" = ( /obj/structure/easel, /obj/item/canvas/twentythree_twentythree, @@ -50455,6 +50437,7 @@ "qIq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/light/directional/west, +/obj/machinery/status_display/ai/directional/west, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "qIs" = ( @@ -50519,7 +50502,7 @@ dir = 1 }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "qJs" = ( /obj/structure/table/glass, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -50857,7 +50840,7 @@ /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "qPX" = ( /obj/structure/table, /obj/item/analyzer, @@ -50891,7 +50874,8 @@ "qQW" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/structure/sign/flag{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) @@ -51069,6 +51053,18 @@ /obj/effect/turf_decal/tile/neutral/tram, /turf/open/indestructible/tram/plate, /area/station/hallway/primary/tram/center) +"qUr" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/machinery/firealarm/directional/west{ + pixel_y = 5 + }, +/obj/structure/table/glass, +/obj/item/surgicaldrill, +/obj/item/toy/figure/paramedic, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "qUy" = ( /obj/machinery/camera/directional/south{ name = "holodeck camera"; @@ -51351,7 +51347,7 @@ id = "AI" }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qYQ" = ( /obj/machinery/computer/message_monitor{ dir = 1 @@ -51369,9 +51365,7 @@ /obj/machinery/door/airlock/external{ name = "Escape Airlock" }, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) "qYV" = ( @@ -51397,12 +51391,12 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/unres, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "qZj" = ( @@ -51491,7 +51485,8 @@ dir = 8 }, /obj/structure/sign/departments/restroom{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /turf/open/floor/iron, /area/station/commons/dorms) @@ -51549,7 +51544,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "rbM" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/north, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -51725,7 +51720,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /obj/effect/landmark/navigate_destination/aiupload, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "reU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/directional/south{ @@ -51737,9 +51732,7 @@ /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 - }, +/obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "rfi" = ( @@ -52017,7 +52010,7 @@ dir = 4 }, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "rkd" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -52251,6 +52244,12 @@ /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) +"rob" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/asteroid) "roi" = ( /obj/structure/chair/stool/directional/north, /obj/effect/turf_decal/trimline/dark_green/line{ @@ -52380,7 +52379,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Tunnel Access Hatch" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, @@ -52527,7 +52526,8 @@ /area/station/engineering/break_room) "rsH" = ( /obj/structure/sign/warning/radiation/rad_area{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/siding/wideplating{ dir = 10 @@ -52536,11 +52536,11 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "rsZ" = ( /obj/machinery/holopad/secure, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "rti" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -52588,9 +52588,7 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 }, -/obj/structure/sign/warning/secure_area{ - pixel_x = -32 - }, +/obj/structure/sign/warning/secure_area/directional/west, /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/office) @@ -53063,7 +53061,7 @@ }, /obj/effect/turf_decal/trimline/yellow/line, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "rDT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, @@ -53212,12 +53210,12 @@ "rHC" = ( /obj/machinery/teleport/hub, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "rIa" = ( /obj/machinery/porta_turret/ai, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "rIg" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -53631,7 +53629,7 @@ c_tag = "Secure - AI Core South" }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "rOV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -53869,6 +53867,7 @@ /obj/item/mod/module/signlang_radio, /obj/item/mod/module/thermal_regulator, /obj/item/gun/syringe, +/obj/item/gun/syringe, /turf/open/floor/iron/dark, /area/station/medical/storage) "rSb" = ( @@ -53930,11 +53929,11 @@ /turf/open/floor/iron/dark/side{ dir = 4 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "rSB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "rSC" = ( /obj/machinery/modular_computer/preset/civilian, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -53951,9 +53950,7 @@ /turf/open/floor/iron/white, /area/station/commons/vacant_room) "rTm" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, +/obj/structure/sign/warning/vacuum/external/directional/east, /obj/machinery/computer/security/labor, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -54010,7 +54007,7 @@ /area/station/hallway/secondary/exit/departure_lounge) "rUR" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "rUX" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/box, @@ -54248,7 +54245,7 @@ /turf/open/floor/iron/dark/side{ dir = 1 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "rZx" = ( /obj/machinery/atmospherics/components/binary/pump{ name = "Gas to Filter"; @@ -54356,9 +54353,6 @@ /obj/structure/plasticflaps/opaque, /turf/open/floor/plating, /area/station/engineering/atmos) -"saZ" = ( -/turf/open/floor/iron, -/area/station/maintenance/tram/mid) "sbe" = ( /obj/structure/table/wood, /obj/structure/window/reinforced/spawner/directional/west{ @@ -54527,7 +54521,7 @@ c_tag = "Secure - AI Upload" }, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "seR" = ( /turf/open/floor/glass/reinforced/tram, /area/station/hallway/primary/tram/right) @@ -54570,7 +54564,7 @@ /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/ai_monitored/command/nuke_storage) +/area/station/command/vault) "sfX" = ( /obj/structure/table, /obj/item/radio/intercom/prison/directional/west, @@ -54640,7 +54634,7 @@ }, /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "shF" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/binary/pump{ @@ -54867,7 +54861,7 @@ "skT" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, @@ -55023,7 +55017,7 @@ /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/security/armory) +/area/station/security/armory) "snp" = ( /obj/effect/turf_decal/trimline/yellow/arrow_cw, /obj/effect/turf_decal/trimline/yellow/arrow_ccw{ @@ -55139,7 +55133,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/spawner/random/armory/rubbershot, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "sql" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 @@ -55320,7 +55314,7 @@ name = "Maintenance Hatch" }, /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/structure/cable, @@ -55623,7 +55617,7 @@ /obj/effect/turf_decal/siding/thinplating/dark{ dir = 9 }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/primary/tram/right) @@ -55731,7 +55725,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, @@ -55812,7 +55806,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "sAc" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/table, @@ -55949,7 +55943,7 @@ dir = 1 }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "sDZ" = ( /turf/closed/wall, /area/station/maintenance/disposal/incinerator) @@ -55961,7 +55955,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "sEx" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -55981,7 +55975,7 @@ }, /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "sEW" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -56276,7 +56270,7 @@ pixel_y = -32 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "sKC" = ( /obj/structure/chair/office/light, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -56492,31 +56486,23 @@ /turf/open/floor/iron, /area/station/engineering/main) "sOD" = ( -/obj/structure/sign/directions/supply{ +/obj/structure/sign/directions/upload{ dir = 4; - pixel_y = -28 - }, -/obj/structure/sign/directions/security{ - dir = 8; - pixel_y = -34 + pixel_y = 7 }, -/obj/structure/sign/directions/command{ - dir = 8; - pixel_y = -40 +/obj/structure/sign/directions/engineering{ + dir = 4; + pixel_y = 14 }, -/obj/structure/sign/directions/vault{ - dir = 8; - pixel_y = -22 +/obj/structure/sign/directions/medical{ + dir = 4; + pixel_y = -7 }, -/obj/structure/disposalpipe/segment{ +/obj/structure/sign/directions/evac{ 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) +/turf/closed/wall, +/area/station/hallway/primary/tram/left) "sOI" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -56613,7 +56599,7 @@ "sQk" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "sQJ" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -56637,7 +56623,7 @@ c_tag = "Secure - AI Core North" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "sRA" = ( /obj/structure/chair/sofa/corp/left, /turf/open/floor/wood/large, @@ -56653,7 +56639,7 @@ pixel_y = 20 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "sRZ" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/structure/chair{ @@ -56875,7 +56861,7 @@ /obj/machinery/holopad/secure, /obj/structure/cable, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "sVE" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -56944,6 +56930,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron, /area/station/command/bridge) "sWY" = ( @@ -57007,7 +56994,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "sXV" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/machinery/power/apc/auto_name/directional/south, @@ -57622,11 +57609,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, -/obj/machinery/requests_console/directional/south{ - name = "Bridge Requests Console"; - pixel_y = 30; - department = "Bridge" - }, /obj/effect/mapping_helpers/requests_console/announcement, /obj/effect/mapping_helpers/requests_console/information, /obj/effect/mapping_helpers/requests_console/assistance, @@ -57636,6 +57618,10 @@ /obj/structure/disposalpipe/junction{ dir = 4 }, +/obj/machinery/requests_console/directional/north{ + department = "Bridge"; + name = "Bridge Requests Console" + }, /turf/open/floor/iron, /area/station/command/bridge) "tjl" = ( @@ -58050,7 +58036,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "trr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58094,7 +58080,7 @@ /obj/effect/spawner/random/maintenance/three, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "trZ" = ( /obj/effect/turf_decal/trimline/neutral/corner{ dir = 4 @@ -58129,7 +58115,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tsg" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 8 @@ -58414,6 +58400,7 @@ dir = 4 }, /obj/machinery/light/directional/west, +/obj/machinery/status_display/evac/directional/west, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "twS" = ( @@ -58506,7 +58493,7 @@ frequency = 1447 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "tyB" = ( /obj/structure/bed{ dir = 4 @@ -58528,7 +58515,7 @@ dir = 10 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tyV" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock" @@ -58677,7 +58664,7 @@ /obj/structure/reagent_dispensers/wall/peppertank/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "tBa" = ( /obj/structure/table, /obj/item/raw_anomaly_core/random{ @@ -58790,7 +58777,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) "tDn" = ( @@ -58798,7 +58785,7 @@ dir = 8 }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "tDz" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, @@ -59067,7 +59054,7 @@ "tIi" = ( /mob/living/basic/bot/repairbot, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tIk" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -59152,7 +59139,7 @@ "tJp" = ( /obj/machinery/teleport/station, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "tJz" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/structure/table, @@ -59209,7 +59196,7 @@ name = "Suit Storage" }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "tKh" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -59289,7 +59276,8 @@ }, /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/structure/sign/warning/chem_diamond{ - pixel_x = 32 + pixel_x = 32; + dir = 4 }, /obj/structure/chair/office/light, /obj/effect/landmark/start/chemist, @@ -59366,7 +59354,7 @@ }, /obj/structure/cable, /turf/open/floor/engine/hull/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "tNJ" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 4 @@ -59530,7 +59518,7 @@ "tQq" = ( /obj/machinery/recharge_station, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "tQy" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -59933,7 +59921,7 @@ "tXU" = ( /obj/structure/lattice, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "tXW" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/window/left/directional/east{ @@ -60058,7 +60046,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "uba" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -60083,7 +60071,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/floor, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "ubt" = ( /obj/structure/chair/office/light{ dir = 1 @@ -60500,7 +60488,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "uiV" = ( /obj/structure/table, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60684,9 +60672,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "ukE" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 1 }, /obj/structure/window/reinforced/spawner/directional/south, @@ -60709,7 +60697,7 @@ /obj/effect/turf_decal/bot, /obj/machinery/power/port_gen/pacman, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "ulb" = ( /obj/machinery/chem_master, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -60836,22 +60824,22 @@ /turf/open/floor/circuit/telecomms/server, /area/station/science/server) "umx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/sign/directions/upload{ + pixel_y = 7 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/status_display/evac/directional/west{ - pixel_y = -32 +/obj/structure/sign/directions/engineering{ + dir = 8; + pixel_y = 14 }, -/obj/structure/cable/layer1, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 8 +/obj/structure/sign/directions/medical{ + dir = 8; + pixel_y = -7 }, -/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ +/obj/structure/sign/directions/evac{ dir = 4 }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) +/turf/closed/wall, +/area/station/hallway/primary/tram/right) "umC" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -60917,7 +60905,8 @@ dir = 5 }, /obj/structure/sign/warning/rad_shelter{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/machinery/light/directional/east, /turf/open/floor/iron, @@ -60951,11 +60940,11 @@ /turf/closed/wall/r_wall, /area/station/security/processing) "uoD" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 5 +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 6 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/iron/dark, /area/station/maintenance/tram/mid) "uoJ" = ( /obj/structure/closet/secure_closet/security/science, @@ -60986,7 +60975,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "upf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -61111,7 +61100,7 @@ /area/station/hallway/secondary/entry) "uqS" = ( /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "ure" = ( /obj/machinery/portable_atmospherics/pump{ name = "Lil Pump" @@ -61540,7 +61529,7 @@ freerange = 1 }, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "uxM" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -61767,7 +61756,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "uBu" = ( /obj/item/radio/intercom/prison/directional/south, /obj/effect/turf_decal/trimline/red/filled/line, @@ -61808,31 +61797,22 @@ dir = 5 }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "uCl" = ( -/obj/structure/sign/directions/supply{ +/obj/structure/sign/directions/upload{ 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 + pixel_y = 14 }, -/obj/structure/sign/directions/vault{ - dir = 8; - pixel_y = 22 +/obj/structure/sign/directions/engineering{ + pixel_y = 7 }, -/obj/effect/turf_decal/trimline/tram/filled/line{ - dir = 1 +/obj/structure/sign/directions/medical{ + pixel_y = -7 }, -/obj/effect/turf_decal/trimline/tram/filled/warning{ - dir = 1 +/obj/structure/sign/directions/evac{ + dir = 4 }, -/turf/open/floor/iron, +/turf/closed/wall, /area/station/hallway/primary/tram/center) "uCo" = ( /obj/effect/turf_decal/siding/thinplating, @@ -62159,6 +62139,17 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/engine_smes) +"uGB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/tram/mid) "uGL" = ( /obj/structure/bed/medical/emergency, /obj/effect/turf_decal/bot, @@ -62358,7 +62349,7 @@ c_tag = "Secure - AI Upper Ring East" }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "uJf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door_buttons/airlock_controller{ @@ -62377,7 +62368,7 @@ }, /obj/machinery/firealarm/directional/south, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "uJk" = ( /obj/structure/easel, /obj/item/canvas/nineteen_nineteen, @@ -62592,7 +62583,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "uNa" = ( /obj/machinery/computer/security/mining{ dir = 4 @@ -62778,7 +62769,7 @@ /obj/item/storage/lockbox/loyalty, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "uQb" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/machinery/firealarm/directional/south, @@ -62804,13 +62795,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"uRh" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/iron/dark, +/area/station/maintenance/tram/mid) "uRi" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "uRv" = ( /obj/structure/lattice, /turf/open/space/openspace, @@ -62846,7 +62844,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "uTm" = ( /obj/structure/window/reinforced/plasma/spawner/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, @@ -63261,7 +63259,7 @@ dir = 5 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "uZs" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -63451,7 +63449,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Tunnel Access Hatch" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/structure/cable, @@ -63535,7 +63533,7 @@ /obj/effect/turf_decal/siding/thinplating/dark{ dir = 10 }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit) @@ -63731,8 +63729,12 @@ /turf/open/floor/iron/grimy, /area/station/service/library/lounge) "vhF" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/structure/table, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 + }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) "vhG" = ( @@ -63751,19 +63753,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) -"vic" = ( -/obj/machinery/lift_indicator{ - pixel_x = -5; - pixel_y = -3; - linked_elevator_id = "tram_lower_center_lift" - }, -/obj/machinery/button/elevator{ - pixel_x = -7; - pixel_y = -1; - id = "tram_lower_center_lift" - }, -/turf/closed/wall, -/area/station/hallway/primary/tram/center) "viC" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63935,7 +63924,7 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "vkE" = ( -/obj/machinery/computer/rdconsole{ +/obj/machinery/computer/rdconsole/unlocked{ dir = 4 }, /turf/open/floor/glass/reinforced, @@ -63967,7 +63956,7 @@ "vlb" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/machinery/camera{ - dir = 6; + dir = 4; c_tag = "Hallway - Port Tram Platform South-East" }, /obj/machinery/firealarm/directional/east, @@ -64137,9 +64126,6 @@ /turf/open/floor/wood/large, /area/station/service/theater) "vpa" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, /obj/effect/turf_decal/stripes/white/full, /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -64346,13 +64332,6 @@ }, /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) "vrP" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/cable/layer1, @@ -64433,7 +64412,7 @@ "vsM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "vsU" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -64519,7 +64498,7 @@ /area/station/hallway/secondary/construction/engineering) "vvd" = ( /obj/machinery/camera{ - dir = 10; + dir = 8; c_tag = "Hallway - Starboard Tram Platform South-West" }, /obj/machinery/firealarm/directional/west, @@ -65124,6 +65103,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/parquet, /area/station/service/library) +"vFE" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "vFL" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 4 @@ -65272,7 +65259,7 @@ /turf/open/floor/iron/dark/side{ dir = 8 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "vHO" = ( /obj/structure/railing/corner{ dir = 1 @@ -65311,7 +65298,7 @@ "vIv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "vIC" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -65518,7 +65505,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "vNe" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -65609,7 +65596,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "vOE" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -65735,7 +65722,7 @@ /turf/open/floor/iron/dark/corner{ dir = 1 }, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "vRv" = ( /turf/open/floor/iron, /area/station/command/heads_quarters/ce) @@ -65913,7 +65900,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "vTF" = ( /obj/structure/tank_dispenser{ pixel_x = -1 @@ -66012,7 +65999,7 @@ dir = 6 }, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "vWx" = ( /turf/closed/wall/r_wall, /area/station/cargo/miningdock/oresilo) @@ -66060,7 +66047,6 @@ "vXT" = ( /obj/structure/chair/sofa/corp/left, /obj/item/radio/intercom/directional/east, -/obj/effect/landmark/start/paramedic, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 @@ -66114,7 +66100,8 @@ /area/station/command/bridge) "vYy" = ( /obj/structure/sign/warning/radiation/rad_area{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/siding/wideplating{ dir = 6 @@ -66123,7 +66110,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "vYA" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -66178,7 +66165,7 @@ /area/station/hallway/secondary/service) "waj" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "wao" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -66231,7 +66218,7 @@ /obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/bot, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "wbH" = ( /turf/open/floor/iron, /area/station/security/office) @@ -66264,12 +66251,12 @@ }, /obj/machinery/turretid{ name = "AI Hallway turret control"; - icon_state = "control_stun"; pixel_x = 3; - pixel_y = 28 + pixel_y = 28; + dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "wce" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -66326,14 +66313,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) -"wcN" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/white/full, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "wcW" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 @@ -66460,7 +66439,7 @@ }, /obj/structure/cable, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "wfb" = ( /obj/structure/closet/crate/coffin, /turf/open/floor/plating, @@ -66813,7 +66792,7 @@ /obj/structure/table, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "wlo" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" @@ -66965,7 +66944,7 @@ }, /obj/machinery/light/floor, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "wpq" = ( /obj/structure/cable, /obj/machinery/light/floor, @@ -67043,6 +67022,16 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"wqV" = ( +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/structure/closet/firecloset, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction/engineering) "wqY" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -67058,7 +67047,7 @@ dir = 1 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "wri" = ( /obj/structure/closet/wardrobe/mixed, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -67119,6 +67108,9 @@ /obj/item/book/manual/wiki/grenades, /obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter, /turf/open/floor/iron/white, /area/station/medical/pharmacy) "wsb" = ( @@ -67146,7 +67138,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "wsI" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -67269,7 +67261,7 @@ }, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "wvG" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -67572,7 +67564,7 @@ c_tag = "Secure - AI Minisat Chargebay" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "wzJ" = ( /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, @@ -67984,7 +67976,7 @@ dir = 6 }, /obj/structure/closet/toolcloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/machinery/camera/directional/east{ c_tag = "Civilian - Aux Tool Storage" }, @@ -68198,7 +68190,7 @@ "wLe" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "wLl" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -68218,11 +68210,11 @@ /turf/open/floor/iron/checker, /area/station/commons/lounge) "wLx" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "wLP" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -68332,7 +68324,7 @@ /turf/open/floor/iron/white/side, /area/station/science/lobby) "wNY" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 8 }, /obj/machinery/requests_console/directional/east{ @@ -68365,7 +68357,7 @@ /area/station/cargo/miningdock) "wOw" = ( /turf/open/floor/iron/grimy, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "wOx" = ( /obj/structure/kitchenspike, /obj/effect/turf_decal/weather/snow, @@ -68504,7 +68496,7 @@ dir = 6 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "wRR" = ( /obj/structure/dresser, /turf/open/floor/iron/white, @@ -68735,7 +68727,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "wXM" = ( /turf/open/floor/carpet, /area/station/commons/vacant_room/office) @@ -68781,7 +68773,7 @@ /obj/machinery/recharger, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "wYO" = ( /obj/machinery/rnd/production/protolathe/department/engineering, /obj/effect/turf_decal/trimline/yellow/filled/end{ @@ -68803,7 +68795,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "wZl" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/item/bikehorn/rubberducky, @@ -69102,7 +69094,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "xfd" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/effect/turf_decal/trimline/red/filled/corner{ @@ -69213,7 +69205,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xhL" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -69420,7 +69412,7 @@ }, /obj/effect/turf_decal/bot, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "xlT" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -69540,7 +69532,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "xnU" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -69558,7 +69550,6 @@ "xog" = ( /obj/machinery/door/airlock/security/glass{ name = "Isolation Wing"; - unres_sensor = 1; unres_sides = 8 }, /obj/machinery/door/firedoor, @@ -69635,9 +69626,6 @@ /obj/machinery/door/airlock/medical/glass{ name = "Treatment Center" }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, @@ -69649,6 +69637,9 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "xqO" = ( @@ -69771,7 +69762,7 @@ dir = 4 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "xsX" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -69841,7 +69832,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "xuk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, /obj/machinery/meter, @@ -69910,7 +69901,7 @@ /area/station/service/hydroponics/garden) "xvl" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "xvm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/oil/slippery, @@ -69969,7 +69960,7 @@ }, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xwi" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 @@ -70495,7 +70486,7 @@ }, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xIV" = ( /obj/structure/table, /obj/item/stock_parts/micro_laser{ @@ -70548,7 +70539,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xJD" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -70625,6 +70616,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/command/bridge) +"xLl" = ( +/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/medical/paramedic) "xLm" = ( /obj/machinery/vending/coffee, /turf/open/floor/wood, @@ -70667,7 +70664,7 @@ /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) +/area/station/command/eva) "xMl" = ( /obj/machinery/vending/hydronutrients, /obj/structure/noticeboard/directional/south, @@ -70941,7 +70938,7 @@ pixel_y = 2 }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xQM" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 5 @@ -71009,7 +71006,7 @@ }, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "xRI" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 6 @@ -71251,7 +71248,7 @@ dir = 9 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) +/area/station/ai/satellite/hallway) "xWj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/trinary/filter/flipped/layer2{ @@ -71263,7 +71260,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "xWu" = ( /obj/machinery/status_display/shuttle, /turf/closed/wall, @@ -71346,6 +71343,17 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"xYy" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/fireaxecabinet/jawsofrecovery/directional/east, +/obj/machinery/light/cold/directional/east, +/obj/structure/closet/secure_closet/paramedic, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 8 + }, +/area/station/medical/paramedic) "xYZ" = ( /mob/living/basic/bot/cleanbot, /obj/effect/turf_decal/stripes/line{ @@ -71354,7 +71362,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/maint) +/area/station/ai/satellite/maintenance) "xZi" = ( /obj/structure/chair/comfy/beige{ dir = 8 @@ -71380,7 +71388,7 @@ }, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "xZC" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -71505,6 +71513,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, +/obj/effect/landmark/start/depsec/science, /turf/open/floor/iron, /area/station/security/checkpoint/science) "ybZ" = ( @@ -71869,13 +71878,21 @@ /area/station/command/heads_quarters/hop) "yhs" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 + dir = 8 }, -/obj/machinery/computer/records/medical, -/obj/machinery/light/cold/directional/north, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/door/airlock/medical{ + name = "Paramedic Dispatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/medical/paramedic) "yhI" = ( /obj/structure/cable, /obj/structure/cable/layer1, @@ -71943,7 +71960,7 @@ dir = 4 }, /obj/structure/closet/firecloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark, @@ -72001,7 +72018,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "yjr" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/turf_decal/siding/thinplating{ @@ -101379,7 +101396,7 @@ ldf dJM saC cIw -eNM +cIw nKQ cIw dQs @@ -102360,7 +102377,7 @@ kJY ovL ahy vhF -qjU +dsm gmj pnF tqp @@ -102617,10 +102634,10 @@ toh xpb jeS bMZ -qjU +uRh uoD -pnF -kFp +gtC +jqH kFp eYs kFp @@ -103124,7 +103141,7 @@ cWZ cWZ cWZ cWZ -wcN +dJJ mjG lSC dJJ @@ -103136,7 +103153,7 @@ qjU lhI kFp kFp -eYs +qrF kFp kFp qXj @@ -103393,7 +103410,7 @@ qjU lhI kFp kFp -eYs +qrF kFp kFp okG @@ -103650,7 +103667,7 @@ qjU lhI kFp kFp -eYs +qrF kFp kFp mqq @@ -103907,7 +103924,7 @@ qjU fMS kFp kFp -eYs +qrF kFp kFp byM @@ -103949,7 +103966,7 @@ aDm fuj lDy cyN -umx +cyN twR hKM jux @@ -104421,7 +104438,7 @@ qjU ioh kFp kFp -eYs +qrF kFp kFp mqq @@ -104678,7 +104695,7 @@ qjU npX kFp kFp -eYs +qrF kFp kFp mqq @@ -104923,7 +104940,7 @@ ocn uyf ecJ cWZ -pjC +nBg jra lIe qjU @@ -104935,7 +104952,7 @@ qjU npX kFp kFp -eYs +qrF kFp kFp mqq @@ -105180,7 +105197,7 @@ cWZ cWZ cWZ cWZ -wcN +dJJ mjG rxy qjU @@ -105192,20 +105209,20 @@ qjU npX kFp kFp -eYs +qrF kFp kFp mqq qjU -aaa -aaa +rob +hPO fal fal fal fal fal -pcu -llU +fGF +nRK tpm wjB vJA @@ -105455,12 +105472,12 @@ qyr xdJ qjU qjU -aaa -qjU +hPO +pIc oNW -pWP +wqV pPN -ceb +lns lns cgd vIC @@ -105706,19 +105723,19 @@ dyZ rhL kFp kFp -eYs -kFp -kFp +uGB +knG +knG dcq kxC -qjU -aaa -qjU +knG +qpd +qpv nRK -qDQ -hxL +oFd +oFd lQH -saZ +oFd akM wRi oFd @@ -105959,7 +105976,7 @@ rrC bHn lTP qjU -gmj +jCX pnF tqp kFp @@ -105967,15 +105984,15 @@ ycV kFp tqp kGR -byW -qjU -aaa -qjU +lhi +kFp +qpd +qpv crU kbG hQK -ceb -pcx +cbU +vuT vuT vuT nku @@ -106226,8 +106243,8 @@ tqp qjU qjU qjU -aaa -qjU +aaS +pIc hZr hZr hZr @@ -106482,7 +106499,7 @@ mDx pwh fNX nag -qjU +cbc qjU aaa hZr @@ -120097,7 +120114,7 @@ qxm nOo myD myD -myD +glv myD myD myD @@ -145530,7 +145547,7 @@ tPE qnv tld nmY -fXf +nmY nmY pMW pMW @@ -145787,7 +145804,7 @@ tPE rhF jEu mlu -tCT +fXf kHa pMW pMW @@ -147586,7 +147603,7 @@ iyc hfy jEu mlu -tCT +fXf kHa pMW pMW @@ -147843,7 +147860,7 @@ jde kIZ aVT nmY -fXf +nmY nmY pMW pMW @@ -154791,14 +154808,14 @@ aQO aQO rxI nYq -yiM +nEu cFs nVr gbe jGG cFs -yiM nEu +pow rLP mlj yjQ @@ -157349,7 +157366,7 @@ uVo eVC qyZ tfX -htr +hGc aQO aQO aQO @@ -157361,14 +157378,14 @@ aQO aQO qhM nKo -yiM +sOD cFs nVr gbe jGG cFs -yiM -qCJ +pvI +pow vNF prs gtQ @@ -168411,15 +168428,15 @@ izU izU izU tAL -sOD -izU +mYI +gnK kkR nIU ejH euV qvf -izU -uCl +gnK +lej lRC ofT ofT @@ -168678,7 +168695,7 @@ oKm qrl lej iVr -wyd +lDt wyd rks rks @@ -168935,7 +168952,7 @@ bHm ykP lej iVr -lDt +wyd kiN xJA gHh @@ -169719,7 +169736,7 @@ aKq aKP aLe oIU -aLB +aLA whF ecW dXo @@ -170736,12 +170753,12 @@ lej fxs wyd wyd -rks -rks -rks +fDA +fDA +fDA wyd wyd -dyI +mJE gMT uHB jtr @@ -170981,24 +170998,24 @@ izU izU hce aEm -gnK -izU +mpa +uCl kBG nIU ejH euV mjp -izU -eQL +dtz +lej ycx -vrO -fnb -eSz -eSz -eSz -qNI +eHN +ayP +kEM +kEM +cas +qUr liB -lEL +dyI qPd iTt rjs @@ -171248,14 +171265,14 @@ eSz dTx sIM uZb -rOu +eHN dYU -eSz -eSz -eSz -qNI +vFE +hbv +xLl +lmF yhs -jVw +pyq qPd jVw pnU @@ -171505,14 +171522,14 @@ kNT ghs rOu rSo -aHA -fnb +eHN +mQH fWX -eSz -eSz -qNI -ltL -pps +xYy +kiG +nCl +liB +dyI sqT sTF sTF @@ -171762,11 +171779,11 @@ kNT krM keN csl -vic -izU -izU -clT -clT +eHN +eHN +eHN +eHN +eHN clT clT sbO @@ -182032,15 +182049,15 @@ kNf whL esQ rEB -glv -bMb +oPw +eQL brm gay fXl jwH brm -bMb -oiv +qCJ +blg aHq lfQ cnV @@ -184354,7 +184371,7 @@ jwH brm idI xZQ -stt +oiv wpK lfQ ehz @@ -184603,14 +184620,14 @@ bIp evu qtF iIS -bMb +umx brm gay fXl jwH brm -bMb -pvI +umx +xZQ aHs aHt sSr @@ -187259,8 +187276,8 @@ dVM hFY lSG xsW -jJv -dtz +iYD +njC jJv bcx jJv diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index d843bfc405b2..2a07700a6ad2 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -64,7 +64,7 @@ "abi" = ( /obj/machinery/light/floor, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "abm" = ( /obj/structure/railing{ dir = 1 @@ -103,14 +103,14 @@ }, /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "aby" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /obj/structure/cable/layer3, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "abC" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, @@ -174,8 +174,8 @@ /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/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/research) "adc" = ( @@ -190,7 +190,7 @@ dir = 4 }, /obj/structure/table/wood/fancy/orange, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = 7; pixel_y = 9 }, @@ -254,7 +254,7 @@ name = "Solar Maintenance" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/structure/cable, /turf/open/floor/plating, @@ -264,7 +264,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -326,7 +326,6 @@ /area/station/hallway/primary/central) "afp" = ( /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 @@ -719,7 +718,7 @@ /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "alJ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -822,7 +821,7 @@ /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/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "anf" = ( /obj/machinery/light/small/directional/south, /obj/effect/decal/cleanable/dirt, @@ -1042,7 +1041,7 @@ "aqT" = ( /mob/living/basic/bot/cleanbot, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "arl" = ( /obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2, @@ -1090,6 +1089,10 @@ /obj/structure/sign/poster/random/directional/south, /turf/open/floor/iron, /area/station/cargo/warehouse) +"asd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/engineering/atmos/upper) "asl" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/engine, @@ -1138,7 +1141,7 @@ }, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white, -/area/station/medical/paramedic) +/area/station/medical/exam_room) "asZ" = ( /turf/open/floor/glass/airless, /area/space/nearstation) @@ -1206,7 +1209,7 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "auB" = ( /turf/open/floor/engine, /area/station/medical/chemistry) @@ -1326,9 +1329,7 @@ /area/station/science/breakroom) "awd" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/security/prison) "awf" = ( @@ -1360,7 +1361,7 @@ /obj/structure/sign/poster/official/random/directional/north, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "awC" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -1492,7 +1493,7 @@ /obj/effect/turf_decal/bot_white, /obj/item/folder/documents, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "ayC" = ( /obj/machinery/light/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1581,8 +1582,6 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "azQ" = ( @@ -1611,7 +1610,7 @@ /obj/machinery/holopad, /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "aAl" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 @@ -1682,6 +1681,14 @@ }, /turf/open/openspace, /area/station/security/prison/shower) +"aCk" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/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) "aCp" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 @@ -1851,13 +1858,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) -"aEY" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood/tile, -/area/station/service/bar) "aFb" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -1875,14 +1875,6 @@ }, /turf/open/floor/carpet/orange, /area/station/service/theater) -"aFw" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "aFz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -2128,7 +2120,6 @@ }, /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 = 9 }, @@ -2185,11 +2176,6 @@ /obj/machinery/vending/cigarette, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"aKd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood/parquet, -/area/station/cargo/boutique) "aKg" = ( /obj/effect/turf_decal/tile/neutral, /obj/structure/disposalpipe/segment{ @@ -2205,9 +2191,9 @@ /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "aKj" = ( -/obj/machinery/computer/station_alert/station_only{ +/obj/machinery/computer/station_alert{ dir = 1 }, /obj/effect/turf_decal/trimline/yellow/filled/line, @@ -2230,23 +2216,21 @@ /turf/open/floor/plating, /area/station/maintenance/department/cargo) "aKJ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/sign/directions/engineering/directional/east{ - pixel_y = -8 +/obj/structure/sign/directions/command/directional/north{ + dir = 4; + pixel_y = -10 }, -/obj/structure/sign/directions/security/directional/east{ - dir = 1; - pixel_y = 8 +/obj/structure/sign/directions/engineering/directional/north{ + dir = 4; + pixel_y = 10 }, -/obj/structure/sign/directions/supply/directional/east{ - dir = 1 +/obj/structure/sign/directions/science/directional/north{ + dir = 4; + pixel_y = 0 }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +/turf/closed/wall, +/area/station/security/courtroom) "aKP" = ( -/obj/structure/cable, /turf/open/floor/iron/half, /area/station/service/hydroponics/garden) "aKS" = ( @@ -2280,7 +2264,7 @@ pixel_y = 8 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "aLe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -2301,7 +2285,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "aLA" = ( /obj/machinery/door/poddoor/massdriver_chapel, /obj/effect/turf_decal/stripes/full, @@ -2359,7 +2343,7 @@ /obj/item/electronics/apc, /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "aMx" = ( /obj/structure/cable, /obj/machinery/camera/autoname/motion/directional/south{ @@ -2372,7 +2356,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/maintenance/no_decals/three, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "aME" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/line{ @@ -2480,8 +2464,6 @@ /area/station/command/heads_quarters/qm) "aNR" = ( /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/storage) "aNV" = ( @@ -2517,7 +2499,7 @@ /area/station/security/brig/entrance) "aOQ" = ( /turf/closed/wall/r_wall/rust, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "aOY" = ( /obj/structure/chair/stool/bar/directional/north, /obj/effect/turf_decal/siding/wood, @@ -2546,7 +2528,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "aPC" = ( /obj/effect/spawner/structure/window/plasma, /turf/open/floor/engine, @@ -2567,7 +2549,6 @@ pixel_y = -8; req_access = list("xenobiology") }, -/obj/structure/cable, /obj/machinery/shower/directional/south, /obj/effect/turf_decal{ icon = 'icons/obj/mining_zones/survival_pod.dmi'; @@ -2733,7 +2714,7 @@ }, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "aSS" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/dark_green/opposingcorners, @@ -2840,7 +2821,7 @@ /area/station/hallway/primary/central) "aUB" = ( /obj/structure/closet/wardrobe/black, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, @@ -2865,10 +2846,10 @@ /area/station/service/cafeteria) "aVm" = ( /obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/lesser) "aVp" = ( @@ -2938,8 +2919,8 @@ "aXA" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/lesser) "aXD" = ( @@ -3191,6 +3172,7 @@ "bcm" = ( /obj/machinery/camera/autoname/directional/south, /obj/machinery/firealarm/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured, /area/station/engineering/storage/tech) "bco" = ( @@ -3275,6 +3257,8 @@ dir = 8 }, /obj/item/trash/shrimp_chips, +/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) "bej" = ( @@ -3361,7 +3345,6 @@ /area/station/maintenance/department/science) "bfD" = ( /obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron/chapel{ dir = 1 @@ -3460,7 +3443,7 @@ name = "Aft Solar Access" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -3473,6 +3456,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/bridge) +"bhG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/engineering/main) "bhL" = ( /obj/effect/turf_decal/siding/dark, /obj/machinery/door/firedoor/border_only, @@ -3533,7 +3520,7 @@ /area/station/engineering/supermatter/room) "biS" = ( /turf/closed/wall/r_wall/rust, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "bjb" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/item/kirbyplants/random/dead, @@ -3656,9 +3643,11 @@ /turf/open/floor/plating, /area/station/maintenance/department/medical) "bme" = ( -/obj/structure/sign/warning, -/turf/closed/wall/r_wall, -/area/station/ai_monitored/security/armory) +/obj/structure/sign/warning/directional/east, +/turf/closed/mineral/random/stationside/asteroid/porus{ + mineralChance = 20 + }, +/area/station/asteroid) "bmf" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -3890,7 +3879,7 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "bqT" = ( /obj/structure/cable, @@ -3901,17 +3890,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"bqV" = ( -/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, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) "bqX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -3929,7 +3907,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "brx" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -3995,13 +3973,13 @@ /obj/item/electronics/airalarm, /obj/item/electronics/airlock, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "bsZ" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/table/reinforced, /obj/item/pai_card, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "btl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4073,10 +4051,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "buw" = ( /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/freezer, /area/station/commons/toilet/restrooms) @@ -4588,6 +4565,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/armory, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron/dark, /area/station/security/lockers) "bDy" = ( @@ -4623,9 +4601,7 @@ "bDN" = ( /obj/item/stack/tile/iron/white, /obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white/smooth_large, /area/station/medical/chemistry/minisat) "bDX" = ( @@ -4651,7 +4627,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "bEd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -4750,7 +4726,7 @@ /area/station/commons/vacant_room/commissary) "bFS" = ( /turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "bGc" = ( /obj/structure/table, /obj/item/stack/package_wrap, @@ -4777,7 +4753,7 @@ /obj/item/electronics/firelock, /obj/machinery/light/cold/dim/directional/south, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "bGk" = ( /turf/closed/wall/r_wall, /area/station/medical/chemistry) @@ -4790,7 +4766,8 @@ dir = 5 }, /obj/machinery/newscaster/directional/east, -/turf/open/floor/iron/white, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "bGu" = ( /obj/structure/chair/sofa/bench/right{ @@ -4844,7 +4821,6 @@ /turf/open/floor/iron, /area/station/engineering/atmos/upper) "bGW" = ( -/obj/structure/cable, /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/command/bridge) @@ -4874,11 +4850,15 @@ /obj/item/paper, /obj/item/pen, /obj/effect/turf_decal/stripes/box, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Hydroponics Shutters"; + id = "hydroponics_shutters"; + dir = 8 + }, /turf/open/floor/iron, /area/station/service/hydroponics) "bHc" = ( /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/parquet, /area/station/medical/psychology) @@ -4901,7 +4881,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "bHj" = ( /obj/structure/chair/sofa/bench/left{ dir = 1 @@ -4923,7 +4903,7 @@ /area/station/maintenance/department/cargo) "bIe" = ( /obj/structure/table, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = -3; pixel_y = 3 }, @@ -4980,7 +4960,7 @@ /area/station/maintenance/department/medical/central) "bJQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 + dir = 8 }, /obj/structure/cable, /turf/open/floor/iron/chapel{ @@ -5084,7 +5064,7 @@ /obj/effect/turf_decal/bot_white, /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "bNp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5098,7 +5078,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "bNz" = ( /obj/structure/rack, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ @@ -5147,7 +5127,7 @@ pixel_y = 2 }, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "bNL" = ( /turf/closed/wall, /area/station/cargo/bitrunning/den) @@ -5172,7 +5152,7 @@ "bOl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "bOr" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -5189,6 +5169,7 @@ dir = 4 }, /obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/tile, /area/station/command/corporate_showroom) "bOT" = ( @@ -5245,8 +5226,6 @@ /turf/open/floor/iron, /area/station/hallway/primary/fore) "bQc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/stairs/left{ dir = 1 }, @@ -5331,7 +5310,7 @@ }, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "bSH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5420,7 +5399,7 @@ "bTO" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/hallway/secondary/entry) @@ -5490,7 +5469,6 @@ "bUJ" = ( /obj/effect/landmark/start/shaft_miner, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/miningoffice) "bUM" = ( @@ -5533,22 +5511,13 @@ /turf/open/floor/plating, /area/station/maintenance/department/cargo) "bVA" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/sign/directions/evac/directional/east{ - dir = 8 - }, -/obj/structure/sign/directions/science/directional/east{ - dir = 1; - pixel_y = -8 - }, -/obj/structure/sign/directions/medical/directional/east{ - dir = 8; - pixel_y = 8 +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "capshut" }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/command/heads_quarters/captain/private) "bVY" = ( /obj/machinery/holopad{ pixel_x = 1 @@ -5700,8 +5669,8 @@ "bYF" = ( /obj/effect/turf_decal/arrows, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "bYP" = ( @@ -5757,7 +5726,7 @@ "bZH" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 + dir = 8 }, /turf/open/floor/wood, /area/station/service/lawoffice) @@ -5766,7 +5735,7 @@ /mob/living/simple_animal/bot/secbot/beepsky/armsky, /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "caq" = ( /obj/effect/spawner/surgery_tray/full/deployed, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -5779,6 +5748,7 @@ /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, /turf/open/floor/iron, /area/station/hallway/secondary/command) "cax" = ( @@ -5801,9 +5771,7 @@ /turf/open/floor/iron/white, /area/station/science/lobby) "caP" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "caW" = ( @@ -5835,7 +5803,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "cbn" = ( /obj/machinery/conveyor{ dir = 4; @@ -5889,7 +5857,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "cca" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5923,17 +5891,11 @@ }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "ccT" = ( /obj/machinery/light/directional/west, /turf/open/floor/wood/large, /area/station/cargo/boutique) -"ccZ" = ( -/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/service/chapel) "cda" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -6092,11 +6054,11 @@ /obj/machinery/power/smes{ charge = 5e+006 }, -/obj/structure/cable, /obj/machinery/light/directional/north, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "cgj" = ( @@ -6175,7 +6137,6 @@ /area/station/cargo/lobby) "chF" = ( /obj/machinery/newscaster/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /turf/open/floor/wood/large, @@ -6256,7 +6217,7 @@ icon_state = "catwalk-8" }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ciV" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -6277,7 +6238,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/firealarm/directional/east, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "cjp" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, @@ -6360,8 +6321,6 @@ /area/station/medical/surgery) "clG" = ( /obj/machinery/duct, -/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 = "Restrooms" }, @@ -6377,7 +6336,6 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos) "clM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/table, /obj/item/storage/box/hug/medical, /turf/open/floor/iron, @@ -6562,7 +6520,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "cqH" = ( /obj/structure/transit_tube, /obj/structure/lattice, @@ -6600,7 +6558,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "crg" = ( /obj/effect/turf_decal/trimline/blue/corner{ dir = 1 @@ -6749,7 +6707,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "sci-entrance" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/machinery/door/firedoor, @@ -7116,22 +7074,10 @@ "cBb" = ( /turf/closed/wall, /area/station/medical/paramedic) -"cBh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "cBj" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/station/commons/lounge) -"cBr" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "cBt" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -7283,11 +7229,10 @@ /turf/open/floor/plating, /area/station/maintenance/department/cargo) "cEy" = ( -/obj/structure/cable, /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "cEG" = ( /obj/effect/spawner/structure/window/reinforced, @@ -7298,7 +7243,13 @@ /obj/structure/table/reinforced, /obj/item/book/manual/wiki/robotics_cyborgs, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) +"cEU" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/treatment_center) "cEV" = ( /obj/machinery/light_switch/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -7362,7 +7313,6 @@ /obj/effect/turf_decal/stripes{ dir = 8 }, -/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, @@ -7421,7 +7371,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/turf_decal/sand/plating, @@ -7510,7 +7460,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/medical/paramedic) +/area/station/medical/exam_room) "cJx" = ( /obj/structure/closet/crate/preopen, /obj/effect/spawner/random/engineering/flashlight, @@ -7748,7 +7698,6 @@ /area/station/cargo/boutique) "cOb" = ( /obj/item/food/grown/banana, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/grass, /area/station/medical/chemistry) @@ -7845,7 +7794,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "cPQ" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 8 @@ -7979,7 +7928,8 @@ "cRM" = ( /obj/machinery/button/curtain{ id = "chapelc"; - pixel_y = 26 + pixel_y = 26; + dir = 1 }, /turf/open/floor/iron/chapel{ dir = 1 @@ -8040,7 +7990,6 @@ /turf/open/floor/wood, /area/station/service/theater) "cSy" = ( -/obj/structure/cable, /obj/effect/turf_decal/siding/white/corner{ dir = 4 }, @@ -8109,7 +8058,7 @@ network = list("ss13","medbay") }, /obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "cUe" = ( /obj/machinery/rnd/production/protolathe/department/science, @@ -8124,12 +8073,14 @@ /area/station/science/xenobiology) "cUk" = ( /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/science/lobby) "cUm" = ( /obj/effect/turf_decal/stripes/red/corner, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 + dir = 1 }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/morgue) @@ -8272,7 +8223,7 @@ /obj/effect/turf_decal/bot, /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "cWv" = ( /obj/structure/girder, /turf/open/floor/plating, @@ -8329,6 +8280,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark, /area/station/maintenance/department/engine) +"cXn" = ( +/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/service/chapel) "cXo" = ( /obj/structure/barricade/wooden/crude, /obj/structure/holosign/barrier/atmos, @@ -8464,7 +8421,7 @@ /obj/structure/window/spawner/directional/east, /obj/structure/window/spawner/directional/north, /turf/open/misc/grass, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "cZp" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/reinforced/airless, @@ -8494,7 +8451,7 @@ /obj/structure/cable, /obj/machinery/flasher/directional/south, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "daK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -8509,6 +8466,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/lockers) "dbl" = ( @@ -8613,7 +8571,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "dco" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -8668,6 +8626,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"dcI" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "dcO" = ( /obj/machinery/vending/wardrobe/science_wardrobe, /obj/effect/turf_decal/delivery, @@ -8691,10 +8658,10 @@ "dda" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance, -/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/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/commons/vacant_room/commissary) "ddb" = ( @@ -8725,9 +8692,14 @@ "des" = ( /obj/structure/closet/lasertag/blue, /obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"deW" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "deY" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/firealarm/directional/east, @@ -8742,7 +8714,7 @@ "dfd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dfk" = ( /turf/open/floor/engine, /area/station/command/heads_quarters/rd) @@ -8771,7 +8743,9 @@ dir = 8 }, /obj/machinery/light_switch/directional/south{ - pixel_x = 26 + pixel_y = -10; + dir = 4; + pixel_x = 20 }, /turf/open/floor/iron, /area/station/security/brig/entrance) @@ -8903,9 +8877,7 @@ /area/station/maintenance/port/lesser) "dhv" = ( /obj/effect/landmark/start/shaft_miner, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/cargo/miningoffice) "dhN" = ( @@ -8919,6 +8891,7 @@ }, /obj/effect/turf_decal/tile/brown/half/contrasted, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/drone_bay) "dhO" = ( @@ -8931,7 +8904,6 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "dhR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/rack, /obj/item/wrench, /obj/item/knife/kitchen{ @@ -9032,8 +9004,6 @@ "dko" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/lobby) "dkq" = ( @@ -9124,10 +9094,9 @@ /obj/item/storage/toolbox/emergency, /obj/structure/table, /obj/machinery/light_switch/directional/west, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "dla" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/stairs/right{ dir = 1 }, @@ -9194,7 +9163,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "sci-entrance" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/machinery/door/firedoor, @@ -9229,9 +9198,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ 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/white, /area/station/medical/storage) "dni" = ( @@ -9450,7 +9416,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dqK" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w, @@ -9478,6 +9444,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/cargo) +"dra" = ( +/obj/structure/sign/warning/directional/west, +/turf/open/misc/asteroid, +/area/station/asteroid) "drb" = ( /obj/machinery/newscaster/directional/west, /obj/machinery/vending/wardrobe/curator_wardrobe, @@ -9620,8 +9590,6 @@ /area/station/service/janitor) "dsY" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "dtc" = ( @@ -9685,6 +9653,12 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"duf" = ( +/obj/item/stack/tile/iron/white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/station/medical/chemistry/minisat) "dum" = ( /obj/structure/table/wood, /obj/item/clothing/head/helmet/toggleable/justice/escape{ @@ -9740,19 +9714,22 @@ /turf/open/floor/plating, /area/station/maintenance/department/medical) "dvz" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/sign/directions/medical/directional/east{ dir = 8; - pixel_y = 8 + pixel_y = 8; + pixel_x = 0 }, /obj/structure/sign/directions/evac/directional/east{ - pixel_y = -8 + dir = 8; + pixel_x = 0 }, -/obj/structure/sign/directions/engineering/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +/obj/structure/sign/directions/science/directional/east{ + dir = 1; + pixel_y = -8; + pixel_x = 0 + }, +/turf/closed/wall, +/area/station/maintenance/port/lesser) "dvC" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/grille, @@ -9837,7 +9814,7 @@ /area/station/hallway/primary/central) "dyb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 + dir = 4 }, /turf/open/floor/iron/dark/textured, /area/station/science/robotics/lab) @@ -9849,6 +9826,9 @@ /area/station/science/ordnance) "dyv" = ( /obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/lobby) "dyA" = ( @@ -10040,7 +10020,7 @@ }, /obj/structure/closet/secure_closet/personal, /turf/open/floor/iron/white, -/area/station/medical/paramedic) +/area/station/medical/exam_room) "dAu" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -10093,7 +10073,6 @@ /turf/open/floor/plating, /area/station/science/xenobiology) "dBn" = ( -/obj/structure/cable, /obj/effect/turf_decal/tile/dark_blue/half/contrasted, /obj/machinery/incident_display/bridge/directional/south, /turf/open/floor/iron, @@ -10195,7 +10174,7 @@ name = "EVA Requests Console" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "dCv" = ( /obj/structure/railing, /obj/structure/dresser, @@ -10212,7 +10191,7 @@ /obj/structure/disposalpipe/trunk/multiz{ dir = 1 }, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "dCI" = ( /obj/structure/disposalpipe/segment{ @@ -10310,7 +10289,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/structure/disposalpipe/segment, @@ -10343,18 +10322,24 @@ /obj/machinery/door/airlock/engineering{ name = "Floor Electrical Relay" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, -/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/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/catwalk_floor, /area/station/maintenance/central/lesser) "dGh" = ( /obj/structure/cable, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/captain/private) +"dGk" = ( +/obj/structure/sign/warning/directional/south, +/turf/closed/mineral/random/stationside/asteroid/porus{ + mineralChance = 20 + }, +/area/station/asteroid) "dGq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -10441,12 +10426,10 @@ /turf/open/floor/iron/white, /area/station/science/auxlab/firing_range) "dHk" = ( -/obj/structure/cable, -/obj/effect/landmark/start/paramedic, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "dHy" = ( /obj/machinery/light/small/directional/north, @@ -10523,6 +10506,7 @@ /obj/structure/disposalpipe/sorting/mail/flip, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/research) "dIv" = ( @@ -10894,7 +10878,7 @@ /obj/effect/landmark/start/medical_doctor, /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 + dir = 4 }, /turf/open/floor/iron/white/textured_large, /area/station/medical/exam_room) @@ -10947,7 +10931,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "dQr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/textured, @@ -11036,12 +11020,12 @@ "dSl" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, -/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/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/central/greater) "dSn" = ( @@ -11173,7 +11157,7 @@ /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/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "dTR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/siding/white{ @@ -11205,7 +11189,7 @@ "dUl" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "dUA" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ @@ -11246,9 +11230,6 @@ /obj/effect/turf_decal/trimline/blue/filled/corner{ 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/white, /area/station/medical/storage) "dVp" = ( @@ -11268,7 +11249,7 @@ dir = 8 }, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "dVx" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 5 @@ -11303,7 +11284,7 @@ /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "dWl" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/effect/turf_decal/siding/wideplating/dark, @@ -11533,7 +11514,7 @@ /area/station/engineering/atmos) "dZy" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "dZA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11592,7 +11573,8 @@ id = "theater_curtains"; name = "curtain control"; pixel_y = 32; - req_access = list("theatre") + req_access = list("theatre"); + dir = 1 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -11611,17 +11593,11 @@ /obj/effect/mapping_helpers/requests_console/supplies, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"ebo" = ( -/obj/effect/landmark/start/paramedic, -/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/paramedic) "ebs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/event_spawn, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "ebz" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 @@ -11940,6 +11916,9 @@ pixel_y = 3 }, /obj/item/defibrillator/loaded, +/obj/item/defibrillator/loaded{ + pixel_y = -4 + }, /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/white, /area/station/medical/storage) @@ -12004,7 +11983,7 @@ name = "Solar Maintenance" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -12017,7 +11996,7 @@ dir = 4 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "eiJ" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -12144,6 +12123,14 @@ dir = 4 }, /area/station/service/chapel) +"ekF" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/cafeteria, +/area/station/commons/locker) "ekL" = ( /obj/effect/turf_decal/tile/neutral, /obj/structure/disposalpipe/segment{ @@ -12197,11 +12184,11 @@ /area/station/engineering/atmos/upper) "ely" = ( /obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/turf_decal/sand/plating, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/central/greater) "elE" = ( @@ -12259,7 +12246,7 @@ /area/station/service/kitchen) "enz" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 + dir = 1 }, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) @@ -12271,6 +12258,7 @@ /obj/effect/spawner/random/structure/chair_comfy{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/command/bridge) "eoo" = ( @@ -12306,7 +12294,7 @@ name = "Solar Maintenance" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, @@ -12343,7 +12331,6 @@ /obj/machinery/door/airlock/medical{ name = "Medical Breakroom and Paramedic Dispatch" }, -/obj/effect/mapping_helpers/airlock/access/any/medical/general, /obj/structure/cable, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12351,7 +12338,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/white, +/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic, +/turf/open/floor/holofloor/dark, /area/station/medical/exam_room) "epr" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -12436,10 +12424,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"eqQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/textured, -/area/station/science/robotics/lab) "era" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -12482,7 +12466,7 @@ dir = 4 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "esc" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -12657,7 +12641,7 @@ /area/station/maintenance/solars/port/aft) "euF" = ( /obj/structure/closet/wardrobe/white, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, @@ -12881,7 +12865,7 @@ pixel_y = -12 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ezg" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -12923,11 +12907,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/morgue) -"ezP" = ( -/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) "eAg" = ( /obj/effect/turf_decal/siding/wood/corner, /obj/effect/turf_decal/siding/wood{ @@ -12978,7 +12957,7 @@ "eAW" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "eAZ" = ( /obj/structure/railing, /obj/machinery/door/firedoor/border_only, @@ -13046,11 +13025,11 @@ /area/station/science/ordnance/storage) "eBK" = ( /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/dark_blue/half/contrasted{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/bridge) "eBY" = ( @@ -13207,15 +13186,10 @@ /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, -/obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable, /turf/open/floor/iron, /area/station/security) -"eDV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/commons/lounge) "eEa" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -13251,7 +13225,7 @@ /obj/structure/stairs/east, /obj/structure/railing, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "eEC" = ( /obj/machinery/barsign/directional/south, /obj/machinery/vending/cigarette, @@ -13267,7 +13241,7 @@ }, /obj/structure/closet/emcloset, /obj/structure/window/spawner/directional/east, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/fitness/recreation) "eEG" = ( @@ -13387,7 +13361,6 @@ /obj/effect/turf_decal/siding/green, /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/storage/art) "eGM" = ( @@ -13495,6 +13468,9 @@ /area/station/maintenance/department/science) "eIY" = ( /obj/effect/landmark/event_spawn, +/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/white, /area/station/medical/storage) "eJi" = ( @@ -13550,7 +13526,7 @@ /obj/structure/flora/bush/flowers_pp/style_random, /obj/structure/window/spawner/directional/south, /turf/open/misc/grass, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "eJS" = ( /obj/effect/turf_decal/bot, /obj/machinery/portable_atmospherics/canister/air, @@ -13660,7 +13636,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "eMk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/effect/turf_decal/stripes{ @@ -13683,7 +13659,7 @@ /area/station/security) "eMD" = ( /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "eMG" = ( /obj/structure/closet/firecloset, /turf/open/floor/iron/textured, @@ -13724,7 +13700,7 @@ "eOn" = ( /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "eOx" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -13753,6 +13729,10 @@ /area/station/command/heads_quarters/cmo) "eOY" = ( /obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Hydroponics Shutters"; + id = "hydroponics_shutters" + }, /turf/open/floor/plating, /area/station/service/hydroponics) "eOZ" = ( @@ -13819,7 +13799,7 @@ /obj/item/radio/intercom/directional/south, /obj/effect/spawner/random/armory/dragnet, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "eQY" = ( /obj/structure/cable, /turf/open/floor/iron/freezer, @@ -14046,16 +14026,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, -/obj/machinery/button/door/directional/north{ - id = "triage"; - name = "triage button"; - normaldoorcontrol = 1; - pixel_x = -26 - }, -/obj/machinery/button/ticket_machine{ - pixel_x = -26; - pixel_y = 36 - }, /turf/open/floor/iron/white, /area/station/medical/exam_room) "eVA" = ( @@ -14070,7 +14040,7 @@ pixel_y = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "eVG" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/random/trash/hobo_squat, @@ -14084,7 +14054,6 @@ req_access = list("robotics") }, /obj/effect/turf_decal/tile/purple/half/contrasted, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/lobby) "eWB" = ( @@ -14104,7 +14073,7 @@ "eWD" = ( /obj/structure/cable/layer3, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "eWJ" = ( /obj/item/radio/intercom/directional/south, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -14117,7 +14086,7 @@ dir = 4 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "eXb" = ( /obj/machinery/door/airlock{ id_tag = "u2"; @@ -14265,7 +14234,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/warning{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/mannequin/skeleton, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -14381,7 +14349,7 @@ /area/station/medical/pharmacy) "faK" = ( /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "faP" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/holopad, @@ -14401,7 +14369,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 }, -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -14412,8 +14379,6 @@ "fbC" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/command) @@ -14536,9 +14501,6 @@ /area/station/hallway/primary/central) "feN" = ( /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, /turf/open/floor/iron, /area/station/security) "feQ" = ( @@ -14562,7 +14524,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ffk" = ( /obj/structure/chair/stool/directional/west, /turf/open/floor/wood, @@ -14639,7 +14601,7 @@ name = "Port Bow Solar Access" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/structure/cable, @@ -14659,7 +14621,7 @@ }, /obj/structure/table, /obj/machinery/requests_console/auto_name/directional/west, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "fhu" = ( /turf/open/floor/engine/n2, @@ -14672,7 +14634,7 @@ /obj/structure/sign/poster/official/random/directional/north, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "fhH" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /obj/machinery/door/airlock/engineering/glass{ @@ -14694,14 +14656,13 @@ "fhN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/science) "fhP" = ( /obj/structure/railing/corner{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/firealarm_sanity, /turf/open/floor/catwalk_floor/iron_white, /area/station/science/lobby) @@ -14884,7 +14845,7 @@ /area/space/nearstation) "flH" = ( /obj/structure/closet/boxinggloves, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/white/textured_large, /area/station/commons/fitness/recreation) "flN" = ( @@ -14987,7 +14948,7 @@ icon_state = "catwalk-13" }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "fnU" = ( /obj/machinery/door/airlock/virology/glass{ name = "Virology Lab" @@ -15055,13 +15016,13 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/central) "fpm" = ( -/obj/structure/cable, /obj/effect/turf_decal/tile/dark_blue, /obj/effect/turf_decal/tile/dark_blue{ 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/hallway/secondary/command) "fpo" = ( @@ -15132,7 +15093,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "fqs" = ( /obj/structure/cable, /obj/structure/railing{ @@ -15159,11 +15120,6 @@ }, /turf/open/misc/asteroid/airless, /area/station/asteroid) -"fqF" = ( -/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/exam_room) "frd" = ( /obj/machinery/vending/wardrobe/hydro_wardrobe, /obj/effect/turf_decal/stripes/line{ @@ -15209,7 +15165,7 @@ /area/station/medical/morgue) "fry" = ( /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "frG" = ( /obj/structure/railing{ dir = 4 @@ -15363,7 +15319,9 @@ /turf/open/floor/iron/dark, /area/station/security/lockers) "ftR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /obj/effect/turf_decal/tile/dark_blue{ dir = 8 }, @@ -15382,13 +15340,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"fun" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "fuo" = ( /obj/effect/landmark/start/geneticist, /obj/structure/chair/office{ @@ -15397,10 +15348,10 @@ /turf/open/floor/glass/reinforced, /area/station/science/genetics) "fus" = ( +/obj/machinery/holopad, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/holopad, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "fux" = ( @@ -15539,7 +15490,7 @@ /obj/machinery/light/small/dim/directional/north, /obj/effect/turf_decal/stripes, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "fxp" = ( /turf/closed/indestructible/riveted{ desc = "A wall impregnated with Fixium, able to withstand massive explosions with ease"; @@ -15582,7 +15533,7 @@ }, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "fyn" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15592,23 +15543,17 @@ /obj/machinery/door/airlock/medical{ name = "Surgery" }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/any/medical/surgery, /obj/effect/turf_decal/tile/blue/fourcorners, /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/airlock/unres{ + dir = 8 + }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/surgery) -"fyA" = ( -/obj/effect/turf_decal/tile/red/half/contrasted, -/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) "fyC" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -15616,7 +15561,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "fyJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/door/airlock/command/glass{ @@ -15688,7 +15633,7 @@ "fzK" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -15736,7 +15681,7 @@ "fAg" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/decal/cleanable/dirt, @@ -15756,7 +15701,6 @@ /area/station/maintenance/central/greater) "fAR" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, /obj/effect/turf_decal/tile/red, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -15966,6 +15910,8 @@ "fEa" = ( /obj/structure/railing/corner, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/corner, /area/station/command/meeting_room) "fEe" = ( @@ -15975,7 +15921,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "fEm" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 1; @@ -16080,14 +16026,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"fFz" = ( -/obj/effect/turf_decal/bot_white, -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/structure/closet_empty/crate, -/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) "fFE" = ( /obj/effect/decal/cleanable/rubble, /turf/open/misc/asteroid, @@ -16118,7 +16056,7 @@ /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "fGo" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -16207,6 +16145,15 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"fHI" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/purple/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/white, +/area/station/science/lobby) "fHJ" = ( /obj/effect/turf_decal/siding/white{ dir = 6 @@ -16279,6 +16226,8 @@ /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/engineering/gravity_generator) "fIX" = ( @@ -16359,8 +16308,6 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ 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/engineering/gravity_generator) "fLe" = ( @@ -16467,7 +16414,7 @@ "fNk" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "fNn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt/dust, @@ -16697,7 +16644,6 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/item/radio/intercom/command/directional/east, /obj/machinery/suit_storage_unit/captain{ @@ -16821,7 +16767,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "fSk" = ( /obj/structure/chair/office{ dir = 1 @@ -16868,9 +16814,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ 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/white, /area/station/medical/storage) "fSP" = ( @@ -16901,13 +16844,13 @@ name = "Cyborg Entertainment Closet"; req_access = list("something only silicons open") }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/locked, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "fTl" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -16930,6 +16873,8 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/research) "fTX" = ( @@ -17029,7 +16974,7 @@ "fVI" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/decal/cleanable/dirt/dust, @@ -17123,7 +17068,7 @@ /obj/effect/mapping_helpers/airlock/access/any/service/general, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/effect/decal/cleanable/dirt/dust, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/iron/dark, @@ -17152,7 +17097,6 @@ /turf/open/floor/iron/cafeteria, /area/station/commons/locker) "fXU" = ( -/obj/structure/cable, /obj/effect/spawner/xmastree, /turf/open/floor/wood, /area/station/commons/lounge) @@ -17208,7 +17152,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "fZc" = ( /obj/structure/cable, @@ -17285,7 +17229,6 @@ /obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/service/chapel) "gak" = ( @@ -17437,6 +17380,8 @@ /area/station/cargo/storage) "gcV" = ( /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/hallway/secondary/exit/departure_lounge) "gcZ" = ( @@ -17445,7 +17390,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "gdf" = ( @@ -17629,7 +17574,7 @@ /obj/item/food/grown/harebell, /obj/item/food/grown/harebell, /turf/open/floor/iron/chapel{ - dir = 1 + dir = 4 }, /area/station/service/chapel) "ghp" = ( @@ -17657,6 +17602,10 @@ 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/button/door/directional/west{ + name = "Bar shuttters"; + id = "bar_shutters" + }, /turf/open/floor/iron/dark, /area/station/service/bar) "ghU" = ( @@ -17697,7 +17646,9 @@ /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "giv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron/dark, /area/station/command/corporate_showroom) "giy" = ( @@ -17727,13 +17678,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_white, /area/station/science/lab) -"giK" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "gjt" = ( /obj/machinery/pdapainter/medbay, /obj/effect/turf_decal/trimline/dark_blue/filled/line{ @@ -17873,7 +17817,7 @@ uses = 10 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "gls" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -18007,9 +17951,9 @@ }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/any/medical/general, -/obj/effect/mapping_helpers/airlock/unres, /obj/structure/cable, /obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/iron/white, /area/station/medical/exam_room) "gok" = ( @@ -18068,7 +18012,7 @@ "gpR" = ( /obj/machinery/light/dim/directional/south, /obj/structure/closet/emcloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/textured, /area/station/hallway/primary/central) "gpV" = ( @@ -18261,7 +18205,6 @@ "gsn" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/miningoffice) "gsM" = ( @@ -18269,7 +18212,7 @@ dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 + dir = 1 }, /turf/open/floor/iron, /area/station/engineering/lobby) @@ -18301,15 +18244,11 @@ /obj/structure/railing/corner, /obj/structure/cable/layer3, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "gty" = ( /obj/effect/landmark/carpspawn, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"gtB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/lobby) "gtE" = ( /obj/machinery/door/poddoor/shutters/window/preopen{ dir = 8; @@ -18344,9 +18283,8 @@ "gub" = ( /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/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "guk" = ( /obj/machinery/vending/wardrobe/gene_wardrobe, /turf/open/floor/iron/white/textured, @@ -18523,9 +18461,8 @@ /turf/open/floor/plating, /area/station/science/xenobiology) "gwA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/engineering/tracking_beacon, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/storage) "gwE" = ( @@ -18571,7 +18508,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/cable/layer3, /turf/open/floor/iron/dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "gxy" = ( /obj/machinery/light/small/dim/directional/west, /obj/effect/decal/cleanable/blood/tracks, @@ -18647,7 +18584,8 @@ id = "theater_curtains"; name = "curtain control"; pixel_x = 32; - req_access = list("theatre") + req_access = list("theatre"); + dir = 4 }, /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -18840,7 +18778,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "gBy" = ( /obj/structure/sign/warning/electric_shock/directional/south, /turf/open/floor/plating, @@ -18968,8 +18906,6 @@ /obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/trunk/multiz/down{ dir = 1 }, @@ -19107,7 +19043,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/recharge_floor, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "gGm" = ( /obj/effect/spawner/random/engineering/tank, /turf/open/floor/plating, @@ -19221,7 +19157,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "gHS" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -19231,7 +19167,6 @@ /turf/open/floor/iron, /area/station/security/breakroom) "gHX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/captain/private) @@ -19260,7 +19195,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "gIw" = ( /obj/machinery/door/airlock/research/glass{ name = "Robotics Lab" @@ -19322,7 +19257,7 @@ /obj/structure/window/spawner/directional/north, /mob/living/basic/butterfly, /turf/open/misc/grass, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "gJA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19331,10 +19266,10 @@ /turf/open/floor/catwalk_floor/iron_dark, /area/station/cargo/bitrunning/den) "gJC" = ( -/obj/structure/cable, /obj/effect/turf_decal/siding/white{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron/large, /area/station/service/hydroponics/garden) "gJE" = ( @@ -19429,7 +19364,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "gLK" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood{ @@ -19492,7 +19427,7 @@ "gMH" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -19571,7 +19506,7 @@ /area/station/medical/pharmacy) "gNV" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "gNZ" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -19619,14 +19554,6 @@ }, /turf/open/floor/iron/white/textured, /area/station/science/genetics) -"gOG" = ( -/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/tile, -/area/station/service/bar) "gOY" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance) @@ -19654,7 +19581,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "gPZ" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -19682,7 +19609,7 @@ }, /obj/machinery/holopad, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "gQt" = ( /obj/machinery/door/airlock{ id_tag = "Cabin6"; @@ -19701,12 +19628,6 @@ /obj/structure/sign/warning/directional/west, /turf/closed/wall/rust, /area/station/medical/chemistry/minisat) -"gQN" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/lobby) "gRp" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -19720,14 +19641,14 @@ /obj/structure/cable/layer3, /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "gRA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/airalarm/directional/north, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "gRG" = ( /obj/effect/turf_decal/stripes, /turf/open/floor/engine, @@ -19774,8 +19695,8 @@ /turf/open/floor/holofloor/dark, /area/station/command/heads_quarters/cmo) "gSJ" = ( -/obj/effect/decal/cleanable/dirt/dust, /obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/white, /area/station/medical/chemistry/minisat) "gSY" = ( @@ -19827,7 +19748,7 @@ }, /obj/item/radio/intercom/directional/east, /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "gTM" = ( /obj/effect/spawner/structure/window/reinforced, @@ -19903,6 +19824,10 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/button/door/directional/north{ + name = "Hydroponics shutters"; + id = "hydroponics_shutters" + }, /turf/open/floor/iron, /area/station/service/hydroponics) "gUv" = ( @@ -20011,7 +19936,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "gWX" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -20086,7 +20011,6 @@ dir = 8 }, /obj/machinery/airalarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) @@ -20101,7 +20025,7 @@ /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/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/turf_decal/siding/wood, @@ -20137,6 +20061,9 @@ /area/station/engineering/atmos) "gZe" = ( /obj/machinery/holopad, +/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/execution/transfer) "gZk" = ( @@ -20184,7 +20111,6 @@ 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/security/checkpoint/science) "gZF" = ( @@ -20292,7 +20218,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 9 }, @@ -20484,7 +20409,7 @@ "hep" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -20547,7 +20472,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hfn" = ( /obj/structure/chair/office{ dir = 1 @@ -20586,7 +20511,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "hfS" = ( /obj/machinery/door/airlock{ id_tag = "Cabin5"; @@ -20640,7 +20565,7 @@ /obj/machinery/door/airlock/maintenance/external, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/structure/barricade/wooden, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -20748,7 +20673,6 @@ /obj/structure/chair{ 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/service/lawoffice) @@ -20833,7 +20757,7 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/burnt_floor, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20862,7 +20786,6 @@ /area/station/science/lobby) "hlh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -20996,7 +20919,7 @@ "hna" = ( /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "hnh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -21041,6 +20964,11 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "capspace" }, +/obj/machinery/button/door/directional/north{ + id = "cap_ext"; + name = "bolt control"; + specialfunctions = 4 + }, /turf/open/floor/engine, /area/station/command/heads_quarters/captain/private) "hnJ" = ( @@ -21050,7 +20978,7 @@ /obj/effect/mapping_helpers/airlock/access/all/security/armory, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "hnL" = ( /obj/structure/tank_holder/extinguisher, /obj/machinery/light/small/dim/directional/south, @@ -21058,7 +20986,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hnY" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -21125,23 +21053,19 @@ /turf/open/floor/wood/tile, /area/station/service/bar) "hpB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/sign/directions/security/directional/west{ - dir = 1 +/obj/structure/sign/directions/medical/directional/east{ + dir = 8; + pixel_y = 8; + pixel_x = 0 }, -/obj/structure/sign/directions/supply/directional/west{ - dir = 1; - pixel_y = 8 +/obj/structure/sign/directions/engineering/directional/east{ + pixel_x = 0 }, -/obj/structure/sign/directions/science/directional/west{ - dir = 1; - pixel_y = -8 +/obj/structure/sign/directions/evac/directional/east{ + pixel_y = -8; + pixel_x = 0 }, -/turf/open/floor/iron, +/turf/closed/wall, /area/station/hallway/primary/central) "hpT" = ( /obj/machinery/door/airlock/command{ @@ -21409,7 +21333,6 @@ dir = 4 }, /obj/machinery/airalarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/service/chapel) "htN" = ( @@ -21434,7 +21357,7 @@ /obj/structure/closet/masks, /obj/structure/window/spawner/directional/west, /obj/machinery/light/directional/north, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/fitness/recreation) "huj" = ( @@ -21545,7 +21468,7 @@ pixel_y = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hvT" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -21555,7 +21478,7 @@ "hvV" = ( /obj/machinery/nuclearbomb/selfdestruct, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "hwb" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -21697,7 +21620,8 @@ }, /obj/machinery/button/flasher{ id = "executionflash"; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, @@ -21707,7 +21631,7 @@ /area/station/hallway/secondary/exit/departure_lounge) "hAa" = ( /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hAd" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 @@ -21718,7 +21642,7 @@ "hAg" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 + dir = 4 }, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/captain/private) @@ -21740,7 +21664,8 @@ dir = 1 }, /obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/white, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "hAL" = ( /obj/structure/cable, @@ -21760,7 +21685,7 @@ pixel_y = 10 }, /turf/open/floor/iron/chapel{ - dir = 4 + dir = 1 }, /area/station/service/chapel) "hBi" = ( @@ -21771,18 +21696,14 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/commons/storage/tools) -"hBD" = ( -/obj/effect/turf_decal/tile/red/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, -/area/station/security) "hBF" = ( /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"hBQ" = ( +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/lobby) "hBX" = ( /obj/machinery/computer/records/security, /obj/effect/turf_decal/tile/green/anticorner/contrasted{ @@ -21945,7 +21866,7 @@ /area/station/service/theater) "hED" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "hEI" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -22022,11 +21943,13 @@ /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/science/lobby) "hGh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 + dir = 4 }, /turf/open/floor/iron/chapel{ dir = 1 @@ -22080,7 +22003,7 @@ /obj/machinery/light/small/dim/directional/west, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "hHa" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -22146,7 +22069,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/firealarm/directional/west, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "hHS" = ( /obj/machinery/airalarm/directional/north, /obj/structure/cable, @@ -22199,7 +22122,6 @@ name = "Reception" }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/any/medical/general, /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22207,7 +22129,8 @@ /obj/structure/disposalpipe/segment{ dir = 8 }, -/turf/open/floor/iron/white, +/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "hIv" = ( /obj/effect/turf_decal/tile/neutral{ @@ -22314,6 +22237,8 @@ /turf/open/floor/iron/white/textured_large, /area/station/science/xenobiology) "hLG" = ( +/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/command/bridge) @@ -22370,7 +22295,7 @@ icon_state = "catwalk-4" }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "hNG" = ( /obj/effect/turf_decal/siding/green, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -22382,9 +22307,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/airalarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/chemistry) "hNP" = ( @@ -22508,7 +22431,7 @@ }, /obj/machinery/light/cold/dim/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "hPF" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/closet/crate/trashcart, @@ -22567,9 +22490,7 @@ /area/station/cargo/storage) "hQy" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/cargo/storage) "hQA" = ( @@ -22588,7 +22509,7 @@ /obj/structure/cable, /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22725,7 +22646,6 @@ /area/station/hallway/secondary/exit/departure_lounge) "hSi" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 8 }, @@ -22797,6 +22717,8 @@ dir = 4 }, /obj/effect/mapping_helpers/mail_sorting/security/general, +/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) "hTf" = ( @@ -22804,7 +22726,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "hTl" = ( /obj/machinery/computer/records/medical{ dir = 1 @@ -22813,7 +22735,7 @@ dir = 10 }, /obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "hTQ" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ @@ -22850,7 +22772,7 @@ "hUm" = ( /obj/machinery/light/cold/dim/directional/south, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hUo" = ( /obj/machinery/shieldgen, /obj/effect/decal/cleanable/dirt, @@ -22986,7 +22908,7 @@ dir = 8 }, /turf/open/floor/plating/elevatorshaft, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "hWx" = ( /obj/effect/spawner/random/structure/closet_empty/crate/with_loot, /obj/structure/broken_flooring/corner/directional/north, @@ -23136,7 +23058,7 @@ "hZM" = ( /obj/machinery/light/cold/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "hZN" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/item/food/grown/banana, @@ -23198,7 +23120,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "ibl" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -23356,7 +23278,7 @@ "idU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "idV" = ( /obj/docking_port/stationary{ dwidth = 3; @@ -23459,7 +23381,7 @@ /area/space/nearstation) "ifj" = ( /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "ifl" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -23559,6 +23481,7 @@ "igS" = ( /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/bar) "ihd" = ( @@ -23605,6 +23528,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/sign/warning/vacuum/external/directional/west, /turf/open/floor/iron/textured, /area/station/cargo/miningoffice) "iin" = ( @@ -23684,7 +23608,7 @@ /area/station/maintenance/department/science) "ikc" = ( /obj/structure/closet/crate/secure/loot{ - codelen = 2; + code_length = 2; name = "malfunctioning abandoned crate" }, /turf/open/misc/asteroid, @@ -23701,7 +23625,7 @@ pixel_x = 3; pixel_y = 12 }, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = -6; pixel_y = 4 }, @@ -23742,7 +23666,7 @@ /obj/structure/transport/linear/public, /obj/machinery/holopad, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ilx" = ( /obj/machinery/smartfridge/organ, /turf/open/floor/plating, @@ -23805,7 +23729,7 @@ "imZ" = ( /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "ina" = ( /obj/effect/spawner/random/structure/steam_vent, /obj/effect/decal/cleanable/dirt/dust, @@ -23830,7 +23754,7 @@ dir = 1 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "inz" = ( /obj/machinery/door/airlock/research{ glass = 1; @@ -23873,7 +23797,6 @@ /area/station/service/lawoffice) "iom" = ( /obj/effect/mapping_helpers/dead_body_placer, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/medical/morgue) "iov" = ( @@ -23884,7 +23807,6 @@ /turf/open/floor/carpet/purple, /area/station/service/library) "iow" = ( -/obj/structure/cable, /obj/effect/turf_decal/tile/dark_blue, /obj/structure/disposalpipe/junction/flip{ dir = 1 @@ -23922,7 +23844,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "ipq" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/saltshaker{ @@ -23981,7 +23903,7 @@ "ipR" = ( /obj/structure/grille, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "ipT" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 1 @@ -24001,8 +23923,6 @@ "ipZ" = ( /obj/effect/landmark/event_spawn, /obj/machinery/iv_drip, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine, /area/station/medical/chemistry) "iqa" = ( @@ -24035,7 +23955,7 @@ /obj/item/pen, /obj/machinery/door/firedoor, /turf/open/floor/iron, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "iqW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24249,7 +24169,7 @@ /area/station/maintenance/department/medical/central) "iuB" = ( /turf/open/floor/plating/elevatorshaft, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "iuU" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/airalarm/directional/south, @@ -24258,12 +24178,12 @@ /obj/item/storage/toolbox/emergency, /obj/item/stack/cable_coil, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "iuV" = ( /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, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "ivh" = ( /obj/machinery/atmospherics/pipe/smart/manifold/cyan/hidden{ @@ -24298,7 +24218,7 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "ivR" = ( /obj/effect/turf_decal/tile/neutral{ @@ -24356,7 +24276,7 @@ /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/tlv_cold_room, /turf/open/floor/iron/dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ixa" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/yellow, @@ -24366,7 +24286,7 @@ /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, @@ -24440,6 +24360,12 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"iyg" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/greenglow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/chemistry/minisat) "iyw" = ( /obj/machinery/power/smes, /obj/structure/cable, @@ -24494,7 +24420,7 @@ "izd" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 + dir = 1 }, /turf/open/floor/wood/large, /area/station/cargo/boutique) @@ -24535,14 +24461,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/auxlab/firing_range) -"iAw" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/lobby) "iAE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -24558,12 +24476,18 @@ /obj/machinery/computer/security/telescreen/rd/directional/south, /turf/open/floor/glass/reinforced/plasma, /area/station/command/heads_quarters/rd) +"iAQ" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/station/medical/chemistry/minisat) "iBe" = ( /obj/structure/chair/pew/right{ 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/chapel, /area/station/service/chapel) "iBg" = ( @@ -24593,7 +24517,7 @@ dir = 1 }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/iron/white, @@ -24743,8 +24667,6 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/central) "iEK" = ( -/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/chapel{ dir = 1 @@ -24755,8 +24677,6 @@ /area/station/security/prison/mess) "iEQ" = ( /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/dark/smooth_large, /area/station/command/meeting_room) "iFb" = ( @@ -24768,7 +24688,7 @@ }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -24884,9 +24804,7 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "iGK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood, /area/station/commons/lounge) "iHr" = ( @@ -24915,7 +24833,6 @@ /area/station/maintenance/solars/port) "iHG" = ( /obj/effect/turf_decal/tile/red, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/lockers) "iHH" = ( @@ -24976,7 +24893,7 @@ }, /obj/structure/cable/layer3, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "iIq" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -25024,7 +24941,7 @@ /obj/machinery/camera/autoname/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "iIY" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -25043,6 +24960,14 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, +/obj/machinery/button/door/directional/north{ + id = "triage"; + name = "triage button"; + normaldoorcontrol = 1 + }, +/obj/machinery/button/ticket_machine{ + pixel_y = 36 + }, /turf/open/floor/iron/white, /area/station/medical/exam_room) "iJg" = ( @@ -25053,7 +24978,7 @@ }, /obj/item/ai_module/supplied/freeform, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "iJm" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, @@ -25079,7 +25004,7 @@ name = "Psychology Bedroom" }, /obj/effect/mapping_helpers/airlock/access/all/medical/psychology, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25094,7 +25019,7 @@ /area/station/medical/patients_rooms/room_a) "iJG" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 + dir = 4 }, /turf/open/floor/iron/dark, /area/station/security/lockers) @@ -25103,7 +25028,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "iJS" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -25116,7 +25041,6 @@ "iJT" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/small, /area/station/science/cytology) "iJZ" = ( @@ -25150,7 +25074,7 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "iLb" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -25175,7 +25099,7 @@ }, /obj/structure/cable/layer3, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "iLo" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt/dust, @@ -25224,6 +25148,8 @@ "iMD" = ( /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/wood/tile, /area/station/service/bar) "iMK" = ( @@ -25231,9 +25157,13 @@ /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/gravity_generator) +"iMS" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "iMT" = ( /obj/effect/spawner/random/trash/mess, /obj/effect/turf_decal/stripes/corner{ @@ -25395,16 +25325,12 @@ "iPH" = ( /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "iPQ" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) -"iPS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/corporate_showroom) +/area/station/ai/satellite/teleporter) "iQs" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -25433,7 +25359,7 @@ /turf/open/floor/iron/stairs{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "iQJ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -25453,7 +25379,7 @@ /obj/structure/table/reinforced, /obj/item/newspaper, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "iRs" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25461,6 +25387,7 @@ /obj/structure/disposalpipe/junction/flip{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/security) "iRy" = ( @@ -25487,6 +25414,10 @@ /area/station/commons/fitness/recreation) "iRL" = ( /obj/structure/sink/kitchen/directional/east, +/obj/machinery/button/door/directional/west{ + id = "kitchen_counter"; + name = "Kitchen Shutters" + }, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "iRR" = ( @@ -25504,7 +25435,7 @@ /obj/effect/turf_decal/bot_white, /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "iSz" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/random/trash, @@ -25622,7 +25553,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "iUX" = ( /obj/structure/transport/linear/public, /obj/machinery/elevator_control_panel{ @@ -25631,7 +25562,7 @@ preset_destination_names = list("2" = "Telecomms", "3" = "AI Core") }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "iVk" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -25659,7 +25590,7 @@ "iVJ" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -25672,7 +25603,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "iVL" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -25702,7 +25633,6 @@ /area/station/cargo/miningoffice) "iWO" = ( /obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/iron, @@ -25747,7 +25677,7 @@ dir = 8 }, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "iXA" = ( /obj/machinery/door/airlock/research/glass{ name = "Chemistry Minisat" @@ -25846,20 +25776,14 @@ /turf/open/floor/iron/white/smooth_large, /area/station/science/research) "jaa" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/sign/directions/command/directional/north, -/obj/structure/sign/directions/engineering/directional/north{ - dir = 4; - pixel_y = 40 - }, -/obj/structure/sign/directions/security/directional/north{ - dir = 8; - pixel_y = 24 +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/button/door/directional/west{ + id = "maintbridge"; + name = "Shutter Control" }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "jaf" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green, @@ -25958,7 +25882,8 @@ /obj/machinery/light/warm/directional/west, /obj/item/storage/fancy/coffee_condi_display, /obj/structure/table, -/turf/open/floor/iron/white, +/obj/item/surgicaldrill, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "jbV" = ( /obj/structure/plasticflaps, @@ -25976,7 +25901,6 @@ dir = 1 }, /obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/drone_bay) "jco" = ( @@ -26069,12 +25993,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"jea" = ( -/obj/effect/turf_decal/bot_white, -/obj/effect/spawner/random/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/storage) "jer" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/landmark/event_spawn, @@ -26098,7 +26016,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "jeY" = ( /obj/structure/railing/corner{ dir = 1 @@ -26126,7 +26044,6 @@ /obj/effect/turf_decal/stripes{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) @@ -26176,8 +26093,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/execution/transfer) "jge" = ( @@ -26196,7 +26111,7 @@ /area/station/science/xenobiology) "jgB" = ( /obj/structure/closet/emcloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/textured, /area/station/hallway/primary/central) @@ -26281,7 +26196,7 @@ "jir" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/access/all/supply/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/misc/asteroid, @@ -26373,14 +26288,14 @@ /area/station/engineering/supermatter/room) "jjQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 + dir = 1 }, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) "jjS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/rack, /obj/effect/spawner/random/entertainment/cigarette_pack, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/cargo/boutique) "jka" = ( @@ -26389,7 +26304,7 @@ }, /obj/structure/closet/secure_closet/medical1, /turf/open/floor/iron/white, -/area/station/medical/paramedic) +/area/station/medical/exam_room) "jkc" = ( /obj/structure/bed{ dir = 1 @@ -26427,6 +26342,11 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "bar_shutters"; + name = "Bar Shutters" + }, /turf/open/floor/iron/dark, /area/station/service/bar) "jkG" = ( @@ -26558,7 +26478,7 @@ }, /obj/machinery/firealarm/directional/east, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "jlU" = ( /obj/machinery/newscaster/directional/south, /obj/machinery/hydroponics/soil/rich, @@ -26805,7 +26725,6 @@ /obj/structure/railing{ dir = 5 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor/border_only{ dir = 4 }, @@ -26888,7 +26807,7 @@ /obj/machinery/teleport/station, /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "jqG" = ( /obj/machinery/computer/security{ dir = 1 @@ -27031,11 +26950,9 @@ /obj/structure/table/reinforced, /obj/item/analyzer, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "jui" = ( /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/structure/chair/sofa/bench/right{ dir = 8 }, @@ -27077,13 +26994,6 @@ }, /turf/open/floor/carpet/purple, /area/station/service/library) -"jvd" = ( -/obj/structure/cable, -/obj/effect/landmark/start/paramedic, -/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/paramedic) "jvt" = ( /obj/structure/closet/secure_closet/chemical, /obj/effect/turf_decal/stripes/line{ @@ -27106,9 +27016,7 @@ }, /area/station/science/robotics/lab) "jvN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/textured_large, /area/station/engineering/storage/tech) "jvO" = ( @@ -27160,6 +27068,11 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "bar_shutters"; + name = "Bar Shutters" + }, /turf/open/floor/iron/dark, /area/station/service/bar) "jwK" = ( @@ -27226,12 +27139,9 @@ /area/station/command/meeting_room) "jyg" = ( /obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/suit_storage_unit/medical, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, /obj/item/radio/intercom/directional/north, /obj/machinery/light_switch/directional/west, +/obj/structure/closet/l3closet, /turf/open/floor/iron/white, /area/station/medical/storage) "jyu" = ( @@ -27246,8 +27156,8 @@ /area/station/security/checkpoint/supply) "jyx" = ( /obj/structure/chair/office, -/obj/structure/cable, -/turf/open/floor/iron/white, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "jyM" = ( /obj/structure/ladder{ @@ -27303,10 +27213,10 @@ /area/station/engineering/storage/tcomms) "jzC" = ( /obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light_switch/directional/west, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) "jzI" = ( @@ -27362,7 +27272,7 @@ "jAd" = ( /obj/machinery/teleport/hub, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "jAe" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, @@ -27400,7 +27310,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) "jAG" = ( @@ -27429,7 +27338,7 @@ network = list("minisat") }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "jBh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27734,7 +27643,7 @@ "jEY" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "jFc" = ( /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, @@ -27812,10 +27721,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/office) -"jGK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/parquet, -/area/station/cargo/boutique) "jGW" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -27833,13 +27738,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"jGZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/chapel{ - dir = 1 - }, -/area/station/service/chapel) "jHn" = ( /obj/structure/railing{ dir = 8 @@ -27899,7 +27797,7 @@ /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -27934,8 +27832,6 @@ /obj/structure/railing{ dir = 1 }, -/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 = 1 }, @@ -27945,7 +27841,6 @@ /area/station/command/meeting_room) "jIm" = ( /obj/structure/sign/poster/random/directional/south, -/obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/research) "jIn" = ( @@ -28066,7 +27961,7 @@ /area/station/medical/morgue) "jKp" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 + dir = 1 }, /turf/open/floor/iron, /area/station/engineering/storage) @@ -28178,7 +28073,7 @@ }, /obj/machinery/camera/autoname/directional/south, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "jMN" = ( /obj/machinery/camera/autoname/directional/south, /turf/open/misc/asteroid, @@ -28201,7 +28096,7 @@ "jNg" = ( /mob/living/basic/bot/repairbot, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "jNh" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -28376,7 +28271,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "jQf" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -28476,7 +28371,6 @@ /obj/structure/chair/office{ name = "grimy chair" }, -/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/vacant_room/commissary) @@ -28608,11 +28502,13 @@ /obj/machinery/door/airlock/security/glass, /obj/effect/turf_decal/tile/red/fourcorners, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/autoname, /obj/effect/mapping_helpers/airlock/access/all/security/general, /obj/structure/disposalpipe/segment{ dir = 1 }, +/obj/effect/mapping_helpers/airlock/autoname, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/office) "jUU" = ( @@ -28720,14 +28616,14 @@ /area/station/service/chapel) "jWh" = ( /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "jWj" = ( /obj/structure/cable, /obj/structure/cable/layer3, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "jWm" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -28957,11 +28853,6 @@ /obj/machinery/light/small/dim/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"kaz" = ( -/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) "kaJ" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /obj/structure/cable, @@ -28988,15 +28879,16 @@ /area/station/cargo/miningoffice) "kbv" = ( /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat_interior"; + control_area = "/area/station/ai/satellite/interior"; name = "AI Antechamber turret control"; - pixel_x = 27 + pixel_x = 27; + dir = 4 }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "kbD" = ( /obj/machinery/newscaster/directional/south, /obj/effect/turf_decal/siding/purple, @@ -29051,7 +28943,7 @@ dir = 1 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "kco" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 5 @@ -29062,7 +28954,6 @@ /obj/structure/table/optable, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/digital_clock/directional/south, -/obj/structure/cable, /obj/machinery/camera/autoname/directional/west{ network = list("ss13","medbay") }, @@ -29082,6 +28973,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security) "kcB" = ( @@ -29155,7 +29048,7 @@ /area/station/hallway/primary/central) "kdc" = ( /obj/effect/spawner/random/trash/graffiti, -/obj/machinery/light/small/dim/directional/east, +/obj/machinery/light/small/dim/directional/north, /turf/open/floor/plating, /area/station/maintenance/central/greater) "kde" = ( @@ -29170,6 +29063,15 @@ "kdg" = ( /turf/closed/wall, /area/station/science/research) +"kdh" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) "kdo" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -29239,13 +29141,17 @@ network = list("aicore") }, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "kdW" = ( /obj/machinery/smartfridge, /obj/effect/turf_decal/tile/green/opposingcorners{ dir = 1 }, /obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Hydroponics Shutters"; + id = "hydroponics_shutters" + }, /turf/open/floor/iron, /area/station/service/hydroponics) "ked" = ( @@ -29256,7 +29162,7 @@ /obj/structure/cable/layer3, /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "keg" = ( /obj/structure/cable, /obj/machinery/light/small/directional/east, @@ -29309,6 +29215,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/lockers) "kfr" = ( @@ -29384,6 +29291,10 @@ }, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"kgO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/textured_large, +/area/station/engineering/storage/tech) "kgT" = ( /obj/effect/turf_decal/tile/red/fourcorners, /obj/machinery/door/firedoor, @@ -29536,7 +29447,7 @@ "kjp" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 + dir = 4 }, /turf/open/floor/iron, /area/station/engineering/gravity_generator) @@ -29551,12 +29462,12 @@ /area/station/command/bridge) "kju" = ( /obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /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/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/science) "kjx" = ( @@ -29637,12 +29548,12 @@ "kkC" = ( /obj/machinery/light/small/directional/east, /obj/structure/rack, -/obj/effect/spawner/random/armory/laser_gun, +/obj/effect/spawner/random/armory/pick_laser_loadout, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "kkD" = ( /obj/machinery/smartfridge/extract, /obj/structure/sign/poster/official/random/directional/south, @@ -29666,19 +29577,13 @@ req_access = list("command") }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "kkK" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) -"kkT" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/red, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/lockers) +/area/station/command/vault) "kkU" = ( /obj/effect/turf_decal/tile/brown/half/contrasted, /obj/machinery/camera/autoname/directional/south, @@ -29998,6 +29903,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/security) "kpD" = ( @@ -30012,7 +29918,7 @@ pixel_y = 11 }, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "kpG" = ( /obj/effect/turf_decal/stripes/red/corner, /obj/effect/turf_decal/stripes/red/corner{ @@ -30116,7 +30022,7 @@ }, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "kqW" = ( /turf/open/floor/wood, /area/station/service/library) @@ -30525,7 +30431,6 @@ /obj/effect/landmark/start/station_engineer, /obj/effect/landmark/event_spawn, /obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/storage) "kyi" = ( @@ -30543,7 +30448,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "kyA" = ( /obj/effect/turf_decal/tile/brown/half/contrasted, /obj/structure/cable, @@ -30678,7 +30583,7 @@ /obj/structure/cable/multilayer/multiz, /obj/machinery/light/small/dim/directional/west, /turf/open/floor/glass, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "kBo" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 @@ -30722,7 +30627,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "kBM" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -30790,9 +30695,7 @@ dir = 4 }, /obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/item/kirbyplants/random, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "kCD" = ( @@ -30877,7 +30780,7 @@ /obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "kEn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31110,7 +31013,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "kIm" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -31153,12 +31056,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/treatment_center) -"kJl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/chapel{ - dir = 1 - }, -/area/station/service/chapel) "kJp" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ @@ -31180,7 +31077,7 @@ /area/station/maintenance/department/medical/central) "kJN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 + dir = 4 }, /turf/open/floor/wood/parquet, /area/station/cargo/boutique) @@ -31316,7 +31213,6 @@ dir = 1 }, /obj/effect/decal/cleanable/cobweb, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/drone_bay) "kNk" = ( @@ -31369,10 +31265,12 @@ }, /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "kOl" = ( /obj/structure/railing, /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, /area/station/command/meeting_room) "kOn" = ( @@ -31398,7 +31296,8 @@ /area/station/security/courtroom) "kOE" = ( /obj/structure/sign/painting/library{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -31472,6 +31371,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/iron/white, /area/station/science/research) "kQF" = ( @@ -31484,10 +31384,10 @@ }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/any/medical/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/structure/disposalpipe/segment{ dir = 8 }, -/obj/structure/disposalpipe/segment{ +/obj/effect/mapping_helpers/airlock/unres{ dir = 8 }, /turf/open/floor/iron/white, @@ -31719,7 +31619,7 @@ "kTx" = ( /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "kTy" = ( /obj/structure/railing, /turf/open/floor/iron/dark/side, @@ -31832,13 +31732,6 @@ }, /turf/open/floor/iron/large, /area/station/service/hydroponics/garden) -"kUW" = ( -/obj/structure/chair/pew{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/chapel, -/area/station/service/chapel) "kUX" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmospherics_engine) @@ -31864,7 +31757,7 @@ /area/station/cargo/miningoffice) "kWb" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "kWc" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/random/structure/closet_maintenance, @@ -31876,6 +31769,11 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron, /area/station/science/robotics/lab) +"kWC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/engineering/atmos/upper) "kWH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ @@ -31930,10 +31828,10 @@ /area/station/command/bridge) "kXV" = ( /obj/structure/cable, -/obj/structure/plaque/static_plaque/golden/commission/wawa, /obj/structure/disposalpipe/segment{ dir = 8 }, +/obj/structure/plaque/static_plaque/golden/commission/wawa, /turf/open/floor/iron, /area/station/hallway/primary/central) "kYc" = ( @@ -31981,12 +31879,11 @@ /area/station/medical/chemistry/minisat) "kYu" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "kYB" = ( /obj/effect/turf_decal/siding/white{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ dir = 8 @@ -32019,6 +31916,11 @@ }, /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "bar_shutters"; + name = "Bar Shutters" + }, /turf/open/floor/iron/dark, /area/station/service/bar) "kYZ" = ( @@ -32030,12 +31932,6 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central) -"kZg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/turf/open/floor/iron, -/area/station/command/bridge) "kZj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32056,8 +31952,6 @@ dir = 4 }, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/execution/transfer) "kZw" = ( @@ -32087,6 +31981,10 @@ req_access = list("hydroponics") }, /obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Hydroponics Shutters"; + id = "hydroponics_shutters" + }, /turf/open/floor/iron, /area/station/service/hydroponics) "lac" = ( @@ -32131,7 +32029,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "lar" = ( /obj/structure/table/reinforced/rglass, /obj/effect/landmark/start/lawyer, @@ -32190,7 +32088,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "lbw" = ( /obj/structure/closet/l3closet, /obj/effect/decal/cleanable/dirt/dust, @@ -32288,7 +32186,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/iron/white, @@ -32399,10 +32297,7 @@ /turf/open/floor/iron/showroomfloor, /area/station/maintenance/department/engine) "lfx" = ( -/obj/structure/cable, /obj/machinery/light/dim/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/science/research) "lfy" = ( @@ -32547,7 +32442,7 @@ "lib" = ( /obj/machinery/light/directional/west, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "lil" = ( /obj/machinery/atmospherics/components/binary/valve, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32593,7 +32488,6 @@ /obj/effect/decal/cleanable/glass, /obj/item/stack/rods/two, /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/station/commons/vacant_room/commissary) @@ -32720,7 +32614,7 @@ /obj/structure/transport/linear/public, /obj/machinery/porta_turret/ai, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "lmt" = ( /obj/structure/cable, /obj/effect/mapping_helpers/burnt_floor, @@ -32739,7 +32633,6 @@ /obj/effect/turf_decal/bot_white, /obj/effect/spawner/random/maintenance, /obj/effect/spawner/random/structure/closet_empty/crate, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) "lmU" = ( @@ -32749,7 +32642,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, -/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/command) "lno" = ( @@ -32784,7 +32676,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/item/clothing/head/costume/cardborg, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "lnG" = ( /obj/structure/bed, /obj/machinery/airalarm/directional/north, @@ -32804,7 +32696,7 @@ /obj/item/stack/sheet/glass/fifty, /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "loa" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -32813,10 +32705,10 @@ /area/station/service/theater) "log" = ( /obj/effect/decal/cleanable/blood/oil, -/obj/machinery/light/small/directional/west, /obj/structure/disposalpipe/segment{ dir = 9 }, +/obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/station/maintenance/disposal) "loh" = ( @@ -32846,7 +32738,7 @@ /obj/structure/rack, /obj/item/toy/figure/borg, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "loC" = ( /obj/machinery/door/airlock/command{ name = "Head of Personnel's Quarters" @@ -32959,6 +32851,8 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/tile, /area/station/service/bar) "lqy" = ( @@ -32974,17 +32868,20 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) +"lqM" = ( +/obj/structure/chair/pew{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) "lqR" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/drone_bay) -"lrc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/stairs/right{ - dir = 1 - }, -/area/station/command/bridge) "lrk" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -33011,6 +32908,7 @@ /obj/effect/turf_decal/siding/red{ dir = 10 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit, /area/station/science/robotics/lab) "lrV" = ( @@ -33091,7 +32989,7 @@ dir = 4 }, /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "ltF" = ( /obj/structure/cable, @@ -33181,7 +33079,6 @@ /area/station/engineering/atmos/project) "lvg" = ( /obj/effect/turf_decal/tile/brown, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/drone_bay) "lvj" = ( @@ -33246,7 +33143,7 @@ /obj/structure/railing, /obj/structure/cable/layer3, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lwu" = ( /turf/open/floor/carpet/red, /area/station/command/heads_quarters/qm) @@ -33291,11 +33188,11 @@ /obj/machinery/power/terminal{ dir = 8 }, -/obj/structure/cable, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 5 }, /obj/machinery/power/port_gen/pacman, +/obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "lwI" = ( @@ -33366,6 +33263,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured, /area/station/construction/mining/aux_base) +"lxX" = ( +/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/research) "lyr" = ( /obj/structure/table/reinforced/rglass, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -33446,6 +33352,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/lockers) "lzs" = ( @@ -33490,6 +33397,8 @@ /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/engineering/gravity_generator) "lAc" = ( @@ -33549,8 +33458,6 @@ /obj/structure/railing/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/dark/corner{ dir = 4 }, @@ -33659,7 +33566,6 @@ "lCU" = ( /obj/machinery/power/apc/auto_name/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/duct, /turf/open/floor/iron/freezer, @@ -33692,7 +33598,6 @@ }, /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured, /area/station/medical/pharmacy) "lDn" = ( @@ -33743,7 +33648,7 @@ /area/station/hallway/secondary/entry) "lDZ" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_smooth, @@ -33756,7 +33661,7 @@ dir = 8 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "lEu" = ( /obj/structure/railing/corner{ dir = 4 @@ -33788,8 +33693,8 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/tile, /area/station/service/bar) "lES" = ( @@ -33819,7 +33724,6 @@ /obj/structure/disposalpipe/segment{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/central) "lFG" = ( @@ -34050,7 +33954,7 @@ /obj/effect/mapping_helpers/mob_buckler, /obj/machinery/light/small/dim/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "lJw" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -34067,7 +33971,6 @@ "lJT" = ( /obj/machinery/photocopier/prebuilt, /obj/machinery/light_switch/directional/east, -/obj/structure/cable, /obj/machinery/firealarm/directional/south, /turf/open/floor/carpet/black, /area/station/command/heads_quarters/hos) @@ -34105,7 +34008,7 @@ dir = 1 }, /turf/open/floor/plating/elevatorshaft, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "lKN" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/white/line{ @@ -34280,7 +34183,7 @@ /obj/structure/cable, /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "lNJ" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/heat_exchanging/simple, @@ -34345,14 +34248,14 @@ dir = 1 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "lPj" = ( /obj/machinery/firealarm/directional/north, /obj/structure/rack, /obj/item/storage/toolbox/emergency, /obj/effect/turf_decal/stripes, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "lPn" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -34375,7 +34278,9 @@ /turf/open/floor/engine, /area/station/command/corporate_dock) "lPz" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/dark, /area/station/command/bridge) @@ -34400,7 +34305,7 @@ /obj/machinery/cell_charger, /obj/item/stock_parts/power_store/cell/high, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "lQl" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/hollow/reinforced/end{ @@ -34467,14 +34372,14 @@ "lRk" = ( /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/open/floor/iron/dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lRr" = ( /obj/machinery/door/airlock/maintenance/glass, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) "lRJ" = ( @@ -34569,13 +34474,13 @@ /turf/open/floor/iron, /area/station/service/janitor) "lSI" = ( -/obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 6 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/white, /area/station/medical/chemistry/minisat) "lSM" = ( @@ -34677,6 +34582,12 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/dark, /area/station/security/prison/safe) +"lUY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/lobby) "lVj" = ( /obj/effect/turf_decal/loading_area/white{ dir = 4 @@ -34769,7 +34680,7 @@ "lWW" = ( /obj/structure/grille, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "lXb" = ( /obj/machinery/light/warm/directional/east, /obj/effect/turf_decal/siding/wood{ @@ -34784,7 +34695,7 @@ /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/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "lXi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34928,7 +34839,7 @@ /obj/structure/cable, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "lYR" = ( /obj/machinery/flasher/portable, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -35055,7 +34966,7 @@ /area/station/science/xenobiology) "mbL" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "mbM" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -35089,6 +35000,9 @@ "mcw" = ( /obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/tile/neutral, +/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/command/heads_quarters/hop) "mcA" = ( @@ -35157,7 +35071,7 @@ /obj/item/electronics/airlock, /obj/item/electronics/airlock, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "meL" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35170,9 +35084,6 @@ /obj/effect/turf_decal/trimline/blue/filled/corner{ 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/white, /area/station/medical/storage) "meQ" = ( @@ -35258,7 +35169,7 @@ "mgV" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/structure/cable, @@ -35348,8 +35259,14 @@ }, /turf/open/floor/iron/dark, /area/station/security/warden) +"mic" = ( +/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/bar) "mio" = ( -/obj/machinery/computer/station_alert/station_only, +/obj/machinery/computer/station_alert, /turf/open/floor/iron, /area/station/engineering/atmos/upper) "mit" = ( @@ -35418,16 +35335,19 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) +"mjj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/engine, +/area/station/medical/chemistry) "mjq" = ( /obj/structure/cable/layer3, /obj/machinery/camera/autoname/directional/north{ network = list("aicore") }, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "mju" = ( /obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/cargo/boutique) "mjx" = ( @@ -35435,7 +35355,7 @@ name = "Solar Maintenance" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -35465,7 +35385,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -35482,9 +35402,9 @@ /area/station/engineering/atmos) "mkc" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical) "mks" = ( @@ -35513,7 +35433,7 @@ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/all/security/hos, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/carpet/red, @@ -35620,7 +35540,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "mmh" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/engineering) @@ -35833,7 +35753,7 @@ "mpG" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/plating, @@ -35843,7 +35763,6 @@ dir = 1 }, /obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) "mpP" = ( @@ -35884,7 +35803,7 @@ /obj/effect/spawner/random/armory/bulletproof_armor, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "mqE" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 10 @@ -35896,14 +35815,18 @@ /obj/effect/turf_decal/trimline/yellow/filled/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/engineering/gravity_generator) "mra" = ( /obj/machinery/button/door/incinerator_vent_atmos_aux{ - pixel_y = 24 + pixel_y = 24; + dir = 1 }, /obj/machinery/button/door/incinerator_vent_atmos_main{ - pixel_y = 40 + pixel_y = 40; + dir = 1 }, /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -36082,6 +36005,7 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/firealarm/directional/west, +/obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "mua" = ( @@ -36094,6 +36018,8 @@ dir = 4 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel, /area/station/service/chapel) "mut" = ( @@ -36241,7 +36167,6 @@ /area/station/commons/fitness/recreation) "mwc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/firealarm/directional/east, /turf/open/floor/carpet/red, /area/station/command/heads_quarters/qm) @@ -36250,7 +36175,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "mwo" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/herringbone, @@ -36435,8 +36360,6 @@ /area/station/medical/pharmacy) "mAd" = ( /obj/effect/turf_decal/tile/red/half/contrasted, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/office) "mAi" = ( @@ -36480,7 +36403,6 @@ /obj/effect/turf_decal/box/corners{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/south, /obj/machinery/camera/autoname/directional/south, @@ -36551,7 +36473,7 @@ /area/station/engineering/lobby) "mBY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 + dir = 1 }, /turf/open/floor/carpet/red, /area/station/command/heads_quarters/qm) @@ -36584,7 +36506,7 @@ "mCt" = ( /obj/machinery/light/cold/dim/directional/north, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "mCv" = ( /obj/structure/closet/secure_closet/personal, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -36662,7 +36584,7 @@ pixel_y = -29 }, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "mDT" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -36766,7 +36688,8 @@ dir = 1 }, /obj/structure/sign/painting/library{ - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/wood/tile, /area/station/service/bar) @@ -36884,7 +36807,6 @@ "mId" = ( /obj/structure/urinal/directional/north, /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/freezer, /area/station/commons/toilet/restrooms) @@ -36893,7 +36815,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "mIk" = ( /obj/structure/closet/crate/coffin, /obj/effect/decal/cleanable/cobweb, @@ -36909,6 +36831,11 @@ }, /turf/open/floor/wood/large, /area/station/cargo/boutique) +"mIC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/engineering/lobby) "mIH" = ( /obj/structure/lattice, /obj/effect/turf_decal/stripes/asteroid/line{ @@ -36925,9 +36852,6 @@ /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/department/engine) "mJb" = ( -/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/filled/corner, /turf/open/floor/iron, /area/station/engineering/lobby) @@ -36969,8 +36893,6 @@ /obj/structure/disposalpipe/segment{ 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/lobby) "mJL" = ( @@ -37116,7 +37038,7 @@ dir = 5 }, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "mLH" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/delivery, @@ -37161,7 +37083,7 @@ /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) +/area/station/security/armory) "mMC" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37252,7 +37174,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "sci-entrance" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/machinery/door/firedoor, @@ -37271,7 +37193,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "mOI" = ( /obj/machinery/button/door/directional/south{ id = "warehouse" @@ -37354,7 +37276,7 @@ /area/station/service/chapel) "mQE" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "mQM" = ( /obj/structure/cable, /turf/open/floor/iron/dark/textured_half, @@ -37960,7 +37882,7 @@ "naZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "nbf" = ( /obj/structure/cable, @@ -38011,7 +37933,7 @@ /obj/structure/window/spawner/directional/north, /mob/living/basic/butterfly, /turf/open/misc/grass, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "nck" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -38066,6 +37988,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/wood, /area/station/commons/lounge) "ncZ" = ( @@ -38087,7 +38010,7 @@ /obj/structure/window/spawner/directional/west, /obj/structure/window/spawner/directional/south, /turf/open/misc/grass, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "ndr" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -38161,7 +38084,11 @@ dir = 8 }, /obj/machinery/digital_clock/directional/west, -/turf/open/floor/iron/white, +/obj/machinery/suit_storage_unit/medical, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "neb" = ( /obj/structure/table, @@ -38209,7 +38136,7 @@ "nes" = ( /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "net" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -38233,7 +38160,7 @@ }, /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -38358,6 +38285,10 @@ /obj/machinery/atmospherics/components/binary/valve/digital/on{ dir = 4 }, +/obj/effect/mapping_helpers/airalarm/link{ + chamber_id = "engine" + }, +/obj/effect/mapping_helpers/airalarm/tlv_no_checks, /turf/open/floor/engine, /area/station/engineering/supermatter) "ngp" = ( @@ -38429,7 +38360,7 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 + dir = 1 }, /turf/open/floor/wood/tile, /area/station/command/corporate_showroom) @@ -38440,8 +38371,8 @@ /obj/effect/turf_decal/stripes/red/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light_switch/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/morgue) "niQ" = ( @@ -38535,7 +38466,7 @@ /area/station/maintenance/department/science) "nkf" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 + dir = 8 }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/exam_room) @@ -38697,11 +38628,13 @@ /turf/open/floor/iron, /area/station/engineering/atmos/project) "nnF" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 }, -/obj/effect/landmark/start/paramedic, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "nnL" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -38732,7 +38665,7 @@ /obj/structure/cable/multilayer/multiz, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "nod" = ( /obj/machinery/button/elevator/directional/east{ id = "cargo" @@ -38753,11 +38686,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) -"noi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/storage) "nor" = ( /obj/machinery/door/airlock/command{ name = "Head of Security's Office" @@ -38820,8 +38748,9 @@ /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, +/obj/structure/sign/warning/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "npw" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -38830,13 +38759,13 @@ /area/station/medical/treatment_center) "npH" = ( /obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/structure/disposalpipe/segment{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/lesser) "npL" = ( @@ -38855,13 +38784,13 @@ }, /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ 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/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "nqg" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -38985,6 +38914,8 @@ "ntS" = ( /obj/structure/cable, /obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "nun" = ( @@ -39023,6 +38954,12 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"nuH" = ( +/obj/structure/sign/warning/directional/west, +/turf/closed/mineral/random/stationside/asteroid/porus{ + mineralChance = 20 + }, +/area/station/asteroid) "nuM" = ( /obj/machinery/door/airlock/public/glass{ name = "Courtroom" @@ -39234,7 +39171,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "nzi" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 @@ -39248,11 +39185,6 @@ "nzk" = ( /turf/closed/wall/r_wall, /area/station/maintenance/central/greater) -"nzn" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/openspace, -/area/station/science/lobby) "nzw" = ( /obj/machinery/computer/slot_machine, /obj/effect/turf_decal/sand/plating, @@ -39303,7 +39235,7 @@ /obj/structure/cable, /obj/effect/mapping_helpers/apc/cell_5k, /turf/open/floor/circuit/green/telecomms/mainframe, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "nAb" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/station/maintenance/department/cargo) @@ -39314,8 +39246,6 @@ /area/station/maintenance/department/bridge) "nAi" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/rack, /obj/effect/spawner/random/techstorage/custom_shuttle, /turf/open/floor/iron/textured_large, @@ -39349,14 +39279,11 @@ }, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) -"nAx" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "nAG" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/locker) "nAR" = ( @@ -39385,15 +39312,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/directions/evac/directional/south, -/obj/structure/sign/directions/medical/directional/south{ - dir = 8; - pixel_y = -24 - }, -/obj/structure/sign/directions/science/directional/south{ - dir = 4; - pixel_y = -40 - }, /turf/open/floor/iron, /area/station/hallway/primary/central) "nBV" = ( @@ -39428,7 +39346,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "nCm" = ( /turf/open/openspace/xenobio, /area/station/science/xenobiology) @@ -39639,6 +39557,8 @@ /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/wood/tile, /area/station/service/bar) "nHw" = ( @@ -39810,17 +39730,17 @@ /turf/open/floor/iron, /area/station/construction/mining/aux_base) "nKe" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical Breakroom and Paramedic Dispatch" - }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/any/medical/general, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, +/obj/machinery/door/airlock/medical{ + name = "Paramedic Dispatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "nKi" = ( /obj/effect/landmark/start/cargo_technician, @@ -39847,11 +39767,13 @@ /obj/effect/spawner/random/decoration/showcase, /obj/structure/sign/picture_frame/showroom/two{ pixel_x = 8; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/structure/sign/picture_frame/showroom/one{ pixel_x = -8; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -39867,7 +39789,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "nKx" = ( /obj/machinery/light/dim/directional/south, /turf/open/floor/glass, @@ -39900,7 +39822,7 @@ /area/station/science/xenobiology) "nLb" = ( /obj/structure/closet/wardrobe/grey, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, @@ -39918,7 +39840,6 @@ 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/engineering/atmospherics_engine) "nLg" = ( @@ -39939,8 +39860,6 @@ 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, /area/station/engineering/gravity_generator) "nLz" = ( @@ -39961,6 +39880,7 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/lockers) "nLT" = ( @@ -40125,10 +40045,12 @@ /obj/effect/spawner/random/vending/colavend, /obj/machinery/airalarm/directional/east, /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "nOZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron/dark/textured, /area/station/science/robotics/lab) "nPf" = ( @@ -40138,7 +40060,6 @@ /turf/open/floor/engine, /area/station/engineering/atmospherics_engine) "nPm" = ( -/obj/structure/cable, /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron, /area/station/command/bridge) @@ -40158,7 +40079,9 @@ /obj/effect/turf_decal/siding/dark_blue{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/iron/dark, /area/station/command/corporate_showroom) "nPV" = ( @@ -40250,22 +40173,14 @@ /turf/open/floor/iron/large, /area/station/service/hydroponics/garden) "nSn" = ( -/obj/structure/cable, /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/siding/wood, /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/wood/tile, /area/station/service/bar) "nSC" = ( /turf/closed/wall, /area/station/security/prison/shower) -"nSF" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/medical/chemistry/minisat) "nSH" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -40380,8 +40295,6 @@ 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/science/xenobiology) "nVm" = ( @@ -40558,7 +40471,7 @@ dir = 4 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "nZt" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 @@ -40722,7 +40635,7 @@ c_tag = "Security Armory - Lethals" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "ocm" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -40738,10 +40651,10 @@ /turf/open/floor/iron/white/textured_large, /area/station/science/research) "ocB" = ( -/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/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/lobby) "ocF" = ( @@ -40757,10 +40670,7 @@ /turf/open/floor/iron/grimy, /area/station/maintenance/central/greater) "ocV" = ( -/obj/structure/cable, /obj/structure/reagent_dispensers/water_cooler, -/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) "odg" = ( @@ -40846,22 +40756,22 @@ /turf/open/floor/iron, /area/station/cargo/drone_bay) "oez" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/sign/directions/science/directional/north{ - dir = 4 +/obj/structure/sign/directions/supply/directional/west{ + dir = 1; + pixel_y = 8; + pixel_x = 0 }, -/obj/structure/sign/directions/engineering/directional/north{ - dir = 4; - pixel_y = 40 +/obj/structure/sign/directions/security/directional/west{ + dir = 1; + pixel_x = 0 }, -/obj/structure/sign/directions/command/directional/north{ - dir = 4; - pixel_y = 24 +/obj/structure/sign/directions/science/directional/west{ + dir = 1; + pixel_y = -8; + pixel_x = 0 }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +/turf/closed/wall, +/area/station/medical/pharmacy) "oeL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40920,7 +40830,7 @@ "ogb" = ( /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "ogH" = ( /obj/machinery/computer/atmos_alert/station_only, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ @@ -41104,7 +41014,7 @@ /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "okm" = ( /turf/open/floor/engine/hull/reinforced, /area/station/asteroid) @@ -41122,7 +41032,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "okL" = ( /obj/structure/railing{ dir = 8 @@ -41246,7 +41156,7 @@ /obj/structure/transit_tube/station/dispenser/reverse, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "onm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_half{ @@ -41318,6 +41228,8 @@ codes_txt = "patrol;next_patrol=P1-Central-Primary"; location = "P15-Central-Primary" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) "opN" = ( @@ -41343,6 +41255,11 @@ /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "bar_shutters"; + name = "Bar Shutters" + }, /turf/open/floor/iron/dark, /area/station/service/bar) "oqj" = ( @@ -41375,13 +41292,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/service/hydroponics) -"oqt" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/locker) "oqz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41516,12 +41426,12 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 }, -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/lobby) "osK" = ( @@ -41530,7 +41440,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "osX" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -41569,14 +41479,14 @@ id_tag = "r2"; name = "Room B" }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/medical/general, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, /turf/open/floor/iron/white, /area/station/medical/patients_rooms/room_b) "ouk" = ( @@ -41642,7 +41552,8 @@ /obj/machinery/button/curtain{ id = "court"; pixel_x = -24; - pixel_y = -8 + pixel_y = -8; + dir = 8 }, /turf/open/floor/iron/dark, /area/station/security/courtroom) @@ -41717,7 +41628,6 @@ }, /obj/structure/sign/warning/radiation/rad_area/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) "oxe" = ( @@ -41760,12 +41670,14 @@ }, /obj/effect/mapping_helpers/airlock/access/any/command/general, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/autoname, /obj/effect/mapping_helpers/airlock/access/any/admin/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/command/meeting_room) "oxU" = ( @@ -41790,7 +41702,7 @@ /obj/structure/window/spawner/directional/south, /mob/living/basic/butterfly, /turf/open/misc/grass, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "oyP" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -41812,7 +41724,7 @@ dir = 4 }, /turf/open/floor/plating/elevatorshaft, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "ozx" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -41829,6 +41741,7 @@ "ozF" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/cargo/boutique) "ozU" = ( @@ -41928,12 +41841,12 @@ /turf/open/floor/grass, /area/station/science/genetics) "oAY" = ( -/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 = 5 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "oBe" = ( @@ -41994,6 +41907,7 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/lockers) "oBP" = ( @@ -42053,11 +41967,19 @@ /obj/machinery/meter, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"oDw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry/minisat) "oDC" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /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/storage) "oDH" = ( @@ -42100,7 +42022,9 @@ color = "#52B4E9" }, /obj/effect/turf_decal/tile/blue/full, -/obj/effect/landmark/start/paramedic, +/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/smooth_large, /area/station/medical/storage) "oDZ" = ( @@ -42109,7 +42033,7 @@ name = "Solar Maintenance" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -42135,6 +42059,8 @@ /obj/structure/sink/directional/west, /obj/structure/mirror/directional/east, /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/freezer, /area/station/commons/toilet/restrooms) "oEB" = ( @@ -42191,13 +42117,14 @@ /area/station/construction/mining/aux_base) "oFn" = ( /obj/machinery/door/airlock/maintenance_hatch, -/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, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "oFu" = ( @@ -42210,11 +42137,10 @@ name = "Cell 3 locker" }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/flasher/directional/east{ - id = "Cell 3"; - pixel_y = 26 - }, /obj/structure/cable, +/obj/machinery/flasher/directional/north{ + id = "Cell 3" + }, /turf/open/floor/iron, /area/station/security/brig) "oFK" = ( @@ -42228,7 +42154,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "oGk" = ( /obj/effect/turf_decal/siding/purple, /obj/structure/disposalpipe/segment{ @@ -42480,7 +42406,7 @@ pixel_y = 8 }, /turf/open/floor/iron/chapel{ - dir = 1 + dir = 4 }, /area/station/service/chapel) "oJU" = ( @@ -42498,7 +42424,7 @@ pixel_y = 2 }, /turf/open/floor/glass/reinforced/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "oKc" = ( /obj/machinery/door/airlock{ id_tag = "u5"; @@ -42621,6 +42547,7 @@ /area/station/hallway/primary/fore) "oMi" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "oMk" = ( @@ -42680,7 +42607,6 @@ req_access = list("ai_upload") }, /obj/machinery/turretid{ - icon_state = "control_stun"; name = "AI Chamber turret control"; pixel_x = 3; pixel_y = -23 @@ -42695,7 +42621,7 @@ }, /obj/structure/cable, /turf/open/floor/circuit/green/telecomms/mainframe, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "oOb" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -42704,7 +42630,7 @@ /obj/structure/window/spawner/directional/west, /obj/structure/window/spawner/directional/east, /obj/machinery/camera/autoname/directional/north, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/fitness/recreation) "oOe" = ( @@ -42721,7 +42647,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/floor, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "oOF" = ( /obj/item/surgery_tray/deployed, /turf/open/floor/iron, @@ -42761,7 +42687,6 @@ /turf/closed/wall/r_wall, /area/station/security/prison/garden) "oPl" = ( -/obj/structure/cable, /obj/effect/turf_decal/tile/dark_blue{ dir = 1 }, @@ -42918,11 +42843,11 @@ }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/any/medical/general, +/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 }, -/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/exam_room) "oRD" = ( @@ -42974,7 +42899,6 @@ "oSd" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /mob/living/carbon/human/species/monkey/punpun, /turf/open/floor/iron/dark, /area/station/service/bar) @@ -43040,7 +42964,7 @@ /obj/structure/cable, /obj/effect/landmark/firealarm_sanity, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "oTv" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, @@ -43069,8 +42993,6 @@ /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/purple/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/white, /area/station/science/lobby) "oUd" = ( @@ -43186,7 +43108,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "oVS" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/purple, @@ -43201,23 +43123,11 @@ /turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "oVX" = ( -/obj/structure/table, -/obj/structure/window/spawner/directional/east, -/obj/item/clothing/suit/jacket/straight_jacket, -/obj/item/clothing/glasses/blindfold{ - pixel_y = 3 - }, -/obj/item/clothing/glasses/blindfold{ - pixel_y = 3 - }, -/obj/item/clothing/glasses/eyepatch, -/obj/item/clothing/ears/earmuffs{ - pixel_y = 3 - }, -/obj/item/clothing/ears/earmuffs{ - pixel_y = 3 +/obj/structure/closet/secure_closet/paramedic, +/obj/effect/turf_decal/trimline/blue/filled/end{ + dir = 4 }, -/turf/open/floor/iron/white/textured, +/turf/open/floor/holofloor/dark, /area/station/medical/paramedic) "oWd" = ( /obj/structure/cable, @@ -43225,11 +43135,13 @@ /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/wood/tile, /area/station/service/bar) "oWg" = ( /obj/machinery/door/airlock/maintenance/external, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/science/lobby) "oWr" = ( @@ -43255,13 +43167,13 @@ }, /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ 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/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "oWE" = ( /obj/structure/closet/radiation{ anchored = 1 @@ -43331,7 +43243,7 @@ "oXz" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 + dir = 1 }, /turf/open/floor/iron/white, /area/station/science/lobby) @@ -43390,7 +43302,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "oZb" = ( /obj/machinery/light/dim/directional/south, /obj/structure/disposalpipe/segment{ @@ -43413,7 +43325,7 @@ /obj/item/clothing/head/helmet/space/orange, /obj/item/tank/internals/oxygen, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "oZp" = ( /obj/structure/cable/multilayer/connected, /turf/open/floor/iron/dark/telecomms, @@ -43433,7 +43345,7 @@ "oZK" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -43488,6 +43400,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) "pau" = ( @@ -43503,7 +43416,7 @@ }, /obj/item/storage/toolbox/mechanical, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "paS" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -43597,6 +43510,11 @@ /area/station/engineering/main) "pco" = ( /obj/machinery/biogenerator, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Hydroponics Shutters"; + id = "hydroponics_shutters"; + dir = 8 + }, /turf/closed/wall, /area/station/service/hydroponics) "pcN" = ( @@ -43617,14 +43535,14 @@ /area/station/maintenance/department/bridge) "pdg" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 + dir = 1 }, /turf/open/floor/iron/large, /area/station/hallway/secondary/exit/departure_lounge) "pdo" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/glass, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "pdp" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/tile, @@ -43673,6 +43591,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/smooth_edge{ dir = 1 }, @@ -43735,7 +43656,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "pgm" = ( /obj/machinery/button/door/directional/east{ id = "Secure Storage"; @@ -43804,7 +43725,7 @@ }, /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "phi" = ( /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43830,7 +43751,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "phJ" = ( /obj/structure/closet/secure_closet{ name = "contraband locker"; @@ -43842,7 +43763,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "phO" = ( /obj/machinery/vending/wardrobe/chef_wardrobe, /turf/open/floor/iron/kitchen, @@ -44052,7 +43973,7 @@ /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/recharge_floor, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "pld" = ( /obj/effect/turf_decal/siding/purple{ dir = 10 @@ -44125,7 +44046,7 @@ name = "Chemistry Minisat" }, /obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/landmark/navigate_destination/chemfactory, @@ -44161,16 +44082,22 @@ "pnQ" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/disposal) "pnS" = ( /turf/closed/mineral/random/stationside/asteroid, /area/station/asteroid) +"poe" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "pof" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/north, @@ -44178,7 +44105,7 @@ /area/station/science/lobby) "pog" = ( /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "poi" = ( /turf/closed/wall, /area/station/maintenance/department/cargo) @@ -44195,6 +44122,7 @@ dir = 8 }, /obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/tile, /area/station/command/corporate_showroom) "pos" = ( @@ -44316,7 +44244,7 @@ "pqd" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "pql" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, /obj/effect/mapping_helpers/airlock/locked, @@ -44384,14 +44312,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "prz" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "prB" = ( /obj/effect/landmark/firealarm_sanity, /turf/open/openspace, @@ -44452,8 +44380,8 @@ /area/station/science/lobby) "pso" = ( /obj/machinery/door/airlock/maintenance/glass, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) "psy" = ( @@ -44543,7 +44471,6 @@ desc = "A memorial wall for pinning mementos upon."; name = "memorial board" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) "ptX" = ( @@ -44600,7 +44527,7 @@ icon_state = "catwalk-3" }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "puQ" = ( /obj/effect/baseturf_helper/reinforced_plating/ceiling, /turf/open/floor/engine/vacuum, @@ -44807,7 +44734,7 @@ /area/station/maintenance/department/medical/central) "pya" = ( /turf/open/floor/glass/reinforced/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "pyi" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -44878,10 +44805,8 @@ /obj/structure/table/reinforced, /obj/item/circuitboard/machine/cyborgrecharger, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "pyK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/department/engine) "pyO" = ( @@ -44901,7 +44826,7 @@ "pzw" = ( /obj/machinery/door/airlock/maintenance/external, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, /area/station/hallway/secondary/exit/departure_lounge) @@ -45006,7 +44931,7 @@ /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/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/turf_decal/siding/wood{ @@ -45104,7 +45029,6 @@ }, /area/station/hallway/secondary/exit/departure_lounge) "pCK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/smooth_edge{ dir = 4 @@ -45401,7 +45325,7 @@ "pHA" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "pHP" = ( /obj/effect/decal/cleanable/glass, /obj/effect/decal/cleanable/dirt, @@ -45455,7 +45379,7 @@ "pIN" = ( /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "pIV" = ( /turf/open/floor/engine/plasma, /area/station/engineering/atmos) @@ -45472,11 +45396,14 @@ /turf/open/floor/plating, /area/station/cargo/storage) "pJk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable, /turf/open/floor/iron/white/smooth_large, /area/station/medical/storage) +"pJp" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/engineering/atmos) "pJt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45509,7 +45436,7 @@ "pJN" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 + dir = 1 }, /turf/open/floor/iron/white, /area/station/science/lobby) @@ -45623,9 +45550,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/smooth_large, /area/station/medical/chemistry) "pLB" = ( @@ -45691,7 +45616,7 @@ dir = 1 }, /obj/machinery/camera/autoname/directional/south, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "pMG" = ( @@ -45825,11 +45750,17 @@ /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, /area/station/maintenance/department/cargo) +"pOQ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "pPv" = ( /obj/effect/turf_decal/box/corners{ dir = 1 @@ -45955,7 +45886,7 @@ }, /obj/structure/plasticflaps/kitchen, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "pRq" = ( /obj/effect/turf_decal/trimline/yellow/arrow_cw{ dir = 9 @@ -46096,10 +46027,10 @@ /area/station/engineering/atmos/project) "pTC" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 + dir = 8 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "pTJ" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/yellow/filled/line, @@ -46110,8 +46041,8 @@ "pTO" = ( /obj/machinery/atmospherics/pipe/layer_manifold/supply/visible/layer4, /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical) "pTP" = ( @@ -46231,7 +46162,7 @@ /turf/open/misc/asteroid, /area/station/hallway/primary/starboard) "pVC" = ( -/obj/machinery/computer/station_alert/station_only, +/obj/machinery/computer/station_alert, /obj/effect/turf_decal/tile/yellow/half/contrasted, /obj/machinery/light/directional/north, /turf/open/floor/iron/dark, @@ -46300,11 +46231,6 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 8 }, -/obj/machinery/button/door/directional/south{ - id = "brigdesk"; - name = "shutter control"; - pixel_x = -24 - }, /turf/open/floor/iron, /area/station/security/brig/entrance) "pWE" = ( @@ -46409,7 +46335,6 @@ name = "Port To Turbine" }, /obj/effect/turf_decal/delivery, -/obj/machinery/camera/autoname/directional/west, /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) @@ -46447,7 +46372,7 @@ /obj/structure/chair/stool/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "pYE" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -46522,22 +46447,10 @@ /turf/open/openspace, /area/station/science/xenobiology) "qaz" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/sign/directions/science/directional/north{ - dir = 4 - }, -/obj/structure/sign/directions/command/directional/north{ - dir = 8; - pixel_y = 40 - }, -/obj/structure/sign/directions/evac/directional/north{ - dir = 2; - pixel_y = 24 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/security/brig/entrance) "qaE" = ( /obj/effect/landmark/start/janitor, /obj/effect/decal/cleanable/dirt, @@ -46745,7 +46658,7 @@ /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "qeo" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/mapping_helpers/broken_floor, @@ -46818,7 +46731,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/navigate_destination/techstorage, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/machinery/door/firedoor, @@ -46856,7 +46769,7 @@ pixel_x = 4; pixel_y = -2 }, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = 5; pixel_y = 12 }, @@ -46896,10 +46809,8 @@ /area/station/security) "qgY" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/event_spawn, /obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_large, /area/station/engineering/storage/tech) "qhg" = ( @@ -46953,7 +46864,7 @@ "qia" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "qic" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47037,7 +46948,7 @@ name = "Solar Maintenance" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -47053,7 +46964,7 @@ /obj/structure/flora/bush/flowers_yw/style_random, /obj/structure/window/spawner/directional/north, /turf/open/misc/grass, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "qjw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -47076,6 +46987,12 @@ "qka" = ( /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) +"qkc" = ( +/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/medical/paramedic) "qkv" = ( /obj/machinery/door/airlock/public{ name = "Jim Norton's Quebecois Coffee" @@ -47160,7 +47077,7 @@ "qmf" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "qmg" = ( /obj/structure/table/wood, /obj/item/stock_parts/power_store/cell/crap, @@ -47287,15 +47204,16 @@ }, /obj/machinery/light_switch/directional/west, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/drone_bay) "qod" = ( /obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/disposal) "qof" = ( @@ -47333,7 +47251,7 @@ }, /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "qoJ" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -47360,11 +47278,11 @@ /area/station/engineering/atmos) "qpb" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/effect/turf_decal/siding/wood{ dir = 4 }, /obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/wood, /area/station/maintenance/central/lesser) "qpc" = ( @@ -47372,7 +47290,7 @@ network = list("aicore") }, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qpj" = ( /obj/machinery/turretid{ control_area = /area/station/tcommsat/server; @@ -47520,7 +47438,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/cable/layer3, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "qru" = ( /obj/structure/cable, /obj/structure/chair/sofa/bench/right, @@ -47621,7 +47539,7 @@ /obj/item/stack/spacecash/c1000, /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "qug" = ( /obj/machinery/door/airlock/mining{ name = "Mining Office" @@ -47699,8 +47617,11 @@ dir = 8 }, /obj/structure/sign/painting/library{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/tile, /area/station/service/bar) "qvA" = ( @@ -47737,11 +47658,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"qvX" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) "qwu" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -47885,6 +47801,14 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/commons/lounge) +"qyU" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/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) "qzr" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -47916,21 +47840,19 @@ /turf/open/floor/iron/dark, /area/station/maintenance/radshelter/civil) "qAo" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/directions/security/directional/south{ - dir = 8; - pixel_y = -24 +/obj/structure/sign/directions/science/directional/south{ + dir = 4; + pixel_y = 10 }, -/obj/structure/sign/directions/supply/directional/south{ - dir = 8 +/obj/structure/sign/directions/medical/directional/south{ + dir = 8; + pixel_y = -10 }, -/obj/structure/sign/directions/engineering/directional/south{ - pixel_y = -40 +/obj/structure/sign/directions/evac/directional/south{ + pixel_y = 0 }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +/turf/closed/wall, +/area/station/hallway/secondary/exit/departure_lounge) "qAp" = ( /mob/living/basic/mining/goliath/ancient, /turf/open/misc/asteroid/airless, @@ -47975,7 +47897,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "qBu" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/small/broken/directional/east, @@ -48046,6 +47968,9 @@ dir = 1 }, /obj/structure/disposalpipe/trunk/multiz, +/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/white, /area/station/medical/storage) "qCE" = ( @@ -48060,7 +47985,7 @@ }, /area/station/security/execution/transfer) "qCT" = ( -/obj/machinery/computer/rdconsole, +/obj/machinery/computer/rdconsole/unlocked, /obj/structure/cable, /obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron/dark, @@ -48097,7 +48022,7 @@ "qDl" = ( /obj/structure/lattice/catwalk, /turf/open/openspace/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qDH" = ( /obj/structure/chair/sofa/corner/maroon, /obj/item/toy/plush/moth{ @@ -48160,6 +48085,7 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /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/security) "qEm" = ( @@ -48251,7 +48177,7 @@ uses = 10 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "qFS" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/glass/reinforced, @@ -48267,7 +48193,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "qGB" = ( /obj/machinery/ticket_machine/directional/north, /obj/structure/chair/sofa/bench, @@ -48316,7 +48242,7 @@ dir = 1 }, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qHp" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 @@ -48344,7 +48270,7 @@ dir = 4 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "qHE" = ( /obj/effect/decal/cleanable/rubble, /turf/open/misc/asteroid/airless, @@ -48511,12 +48437,6 @@ dir = 1 }, /area/station/engineering/atmos) -"qKm" = ( -/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, -/area/station/science/robotics/lab) "qKH" = ( /turf/open/floor/glass/reinforced, /area/station/science/research) @@ -48581,7 +48501,7 @@ /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/access/all/supply/general, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/iron, /area/station/cargo/sorting) "qMC" = ( @@ -48709,6 +48629,7 @@ dir = 9 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/chapel/funeral) "qPC" = ( @@ -48900,7 +48821,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "qTG" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 4 @@ -48953,7 +48874,7 @@ /area/station/science/xenobiology) "qUz" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -49093,7 +49014,7 @@ /obj/machinery/porta_turret/ai, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "qWG" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -49176,7 +49097,6 @@ "qXK" = ( /obj/effect/turf_decal/tile/red, /obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/lockers) "qXN" = ( @@ -49198,7 +49118,7 @@ /turf/open/floor/iron/stairs{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "qYe" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -49235,12 +49155,12 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "qYW" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49356,6 +49276,8 @@ "raR" = ( /obj/effect/landmark/event_spawn, /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) "raT" = ( @@ -49377,11 +49299,11 @@ /area/station/command/heads_quarters/hop) "raZ" = ( /obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/misc/asteroid, /area/station/science/research) "rbe" = ( @@ -49391,8 +49313,8 @@ /turf/open/floor/plating, /area/station/maintenance/department/engine) "rbg" = ( -/obj/structure/cable, /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/stairs/medium{ dir = 1 @@ -49400,8 +49322,7 @@ /area/station/command/bridge) "rbs" = ( /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/ai_upload"; - icon_state = "control_stun"; + control_area = "/area/station/ai/upload/chamber"; name = "AI Upload Turret Control"; pixel_x = -28 }, @@ -49413,7 +49334,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "rbt" = ( /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49472,6 +49393,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/research) "rcy" = ( @@ -49699,7 +49621,7 @@ "rgp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "rgs" = ( /obj/structure/holosign/barrier/atmos, /turf/open/misc/asteroid, @@ -49798,6 +49720,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/greater) +"rhs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "rhK" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 @@ -49813,7 +49742,7 @@ /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "rhS" = ( /turf/open/floor/iron, /area/station/engineering/main) @@ -49881,7 +49810,7 @@ /area/station/command/heads_quarters/cmo) "riQ" = ( /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "riS" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 @@ -49941,6 +49870,7 @@ /area/station/maintenance/department/science) "rjk" = ( /obj/machinery/holopad, +/obj/structure/cable, /turf/open/floor/iron/large, /area/station/service/hydroponics/garden) "rjn" = ( @@ -49979,7 +49909,7 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 + dir = 4 }, /turf/open/floor/iron, /area/station/security/interrogation) @@ -50027,7 +49957,6 @@ /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/dark, /area/station/science/xenobiology) @@ -50162,9 +50091,8 @@ network = list("minisat") }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "rlw" = ( /turf/closed/wall, /area/station/science/xenobiology/hallway) @@ -50172,10 +50100,11 @@ /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, -/obj/structure/cable, /obj/structure/disposalpipe/segment{ 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/security) "rmi" = ( @@ -50206,7 +50135,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "rmy" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -50266,7 +50195,7 @@ }, /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "rnY" = ( /obj/machinery/seed_extractor, /obj/effect/turf_decal/stripes/line{ @@ -50284,7 +50213,7 @@ "roB" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -50384,7 +50313,6 @@ dir = 1 }, /obj/machinery/camera/autoname/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/drone_bay) "rqh" = ( @@ -50709,7 +50637,7 @@ /obj/item/radio/intercom/directional/north, /obj/item/piggy_bank/vault, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "rwx" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 @@ -50914,11 +50842,8 @@ /turf/open/floor/iron/white/herringbone, /area/station/maintenance/department/medical/central) "rzb" = ( -/obj/structure/cable, /obj/effect/turf_decal/siding/wood, /obj/machinery/camera/autoname/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/tile, /area/station/service/bar) "rzg" = ( @@ -50942,12 +50867,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) -"rzF" = ( -/obj/effect/turf_decal/bot_white, -/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) "rzI" = ( /obj/machinery/camera/autoname/directional/south{ network = list("ss13","rd") @@ -50958,7 +50877,7 @@ "rzJ" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/misc/asteroid, /area/station/hallway/secondary/entry) "rzP" = ( @@ -50994,7 +50913,7 @@ /obj/machinery/light/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "rAu" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/airalarm/directional/east, @@ -51041,6 +50960,10 @@ }, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) +"rBr" = ( +/obj/machinery/air_sensor/engine_chamber, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "rBt" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -51102,13 +51025,14 @@ "rBZ" = ( /obj/structure/cable, /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat_interior"; + control_area = "/area/station/ai/satellite/interior"; name = "AI Antechamber turret control"; - pixel_y = 27 + pixel_y = 27; + dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "rCd" = ( /obj/machinery/door/window/brigdoor/left/directional/east{ name = "Command Desk"; @@ -51128,7 +51052,6 @@ /area/station/engineering/storage/tech) "rCz" = ( /obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "rCL" = ( @@ -51184,6 +51107,9 @@ dir = 1 }, /obj/effect/turf_decal/tile/dark_red/opposingcorners, +/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/science/robotics/lab) "rDs" = ( @@ -51245,12 +51171,16 @@ }, /turf/open/floor/circuit/telecomms/server, /area/station/science/server) +"rEw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "rEK" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/external, @@ -51267,7 +51197,7 @@ "rFd" = ( /obj/structure/cable, /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, @@ -51303,6 +51233,8 @@ dir = 4 }, /obj/effect/landmark/event_spawn, +/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/command/corporate_showroom) "rFZ" = ( @@ -51357,8 +51289,8 @@ /turf/open/space/basic, /area/station/solars/port/fore) "rGQ" = ( -/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, /turf/open/floor/iron/chapel{ dir = 4 }, @@ -51508,7 +51440,6 @@ /turf/open/floor/iron/textured, /area/station/security/processing) "rKb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 4 }, @@ -51532,7 +51463,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/machinery/light/cold/directional/west, /obj/machinery/firealarm/directional/west, @@ -51690,7 +51620,6 @@ /area/station/security/office) "rOL" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/miningoffice) "rPe" = ( @@ -51721,7 +51650,7 @@ /obj/structure/window/spawner/directional/west, /obj/structure/window/spawner/directional/north, /turf/open/misc/grass, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "rPk" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -51976,11 +51905,10 @@ /obj/structure/bed, /obj/item/bedsheet, /obj/effect/decal/cleanable/dirt, -/obj/machinery/flasher/directional/east{ - id = "Cell 4"; - pixel_y = -26 - }, /obj/structure/cable, +/obj/machinery/flasher/directional/south{ + id = "Cell 4" + }, /turf/open/floor/iron, /area/station/security/brig) "rTo" = ( @@ -52101,14 +52029,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) -"rVu" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) "rVv" = ( /obj/machinery/door/airlock/security{ id_tag = "IsolationCell"; @@ -52133,12 +52053,12 @@ /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) "rVD" = ( -/obj/effect/turf_decal/tile/neutral, /obj/structure/sign/directions/supply/directional/east{ - dir = 8 + dir = 8; + pixel_x = 0 }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +/turf/closed/wall/r_wall, +/area/station/command/gateway) "rVL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52274,7 +52194,6 @@ dir = 1 }, /obj/effect/landmark/start/lawyer, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/service/lawoffice) @@ -52363,7 +52282,7 @@ /turf/open/openspace, /area/station/security/prison/garden) "rXS" = ( -/obj/machinery/computer/rdconsole, +/obj/machinery/computer/rdconsole/unlocked, /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, @@ -52480,7 +52399,7 @@ name = "Maintenance Bathroom" }, /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/structure/broken_flooring/side/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/abandoned, @@ -52555,6 +52474,7 @@ dir = 8 }, /obj/machinery/holopad, +/obj/structure/cable, /turf/open/floor/carpet/black, /area/station/command/heads_quarters/hos) "sas" = ( @@ -52663,7 +52583,7 @@ name = "Aft Port Solar Access" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -52688,14 +52608,13 @@ /turf/open/floor/plating, /area/station/maintenance/department/cargo) "sbZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "scg" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "sco" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/effect/turf_decal/siding/wood{ @@ -52756,7 +52675,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, -/obj/structure/cable, /turf/open/floor/iron, /area/station/security/execution/transfer) "sdB" = ( @@ -52780,7 +52698,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/turf/open/floor/iron/white/smooth_large, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "set" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ @@ -52803,7 +52721,7 @@ /obj/effect/landmark/start/hangover, /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 + dir = 4 }, /turf/open/floor/iron/dark, /area/station/service/bar) @@ -52865,6 +52783,7 @@ dir = 9 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit, /area/station/science/robotics/lab) @@ -52876,14 +52795,14 @@ "sfT" = ( /obj/structure/cable/layer3, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "sfY" = ( /obj/structure/stairs/east, /obj/structure/railing{ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "sgc" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber{ dir = 4 @@ -53088,7 +53007,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "sjD" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 4 @@ -53106,7 +53025,9 @@ /area/station/medical/virology) "sjJ" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron, /area/station/cargo/storage) "sjL" = ( @@ -53167,10 +53088,8 @@ /obj/machinery/door/airlock/security/glass, /obj/effect/turf_decal/tile/red/fourcorners, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/autoname, /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, +/obj/effect/mapping_helpers/airlock/autoname, /turf/open/floor/iron, /area/station/security/office) "skw" = ( @@ -53180,7 +53099,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured_large, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "skH" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -53210,6 +53129,7 @@ "skV" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/locker) "slb" = ( @@ -53237,10 +53157,10 @@ "slx" = ( /obj/structure/cable, /obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/central/lesser) "slG" = ( @@ -53269,7 +53189,7 @@ /area/station/medical/treatment_center) "smh" = ( /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/welded, /turf/open/floor/plating, @@ -53417,11 +53337,17 @@ /turf/open/floor/iron/grimy, /area/station/service/chapel/office) "soB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/textured_large, /area/station/engineering/storage/tech) +"soC" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "soG" = ( /obj/structure/sink/directional/south, /obj/structure/mirror/directional/north{ @@ -53473,7 +53399,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/tank_holder/extinguisher, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "spr" = ( /obj/effect/turf_decal/stripes{ dir = 5 @@ -53504,7 +53430,7 @@ "spG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "spS" = ( /obj/item/mop, /obj/effect/spawner/random/trash/bucket, @@ -53597,15 +53523,15 @@ /obj/effect/turf_decal/siding/green/corner{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "srs" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "srv" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/landmark/generic_maintenance_landmark, @@ -53718,7 +53644,7 @@ /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/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "stp" = ( /obj/structure/railing{ dir = 1 @@ -53739,7 +53665,9 @@ /obj/item/wheelchair{ pixel_y = 3 }, -/turf/open/floor/iron/white/textured, +/obj/structure/fireaxecabinet/jawsofrecovery/directional/west, +/obj/structure/window/spawner/directional/north, +/turf/open/floor/holofloor/dark, /area/station/medical/paramedic) "stw" = ( /obj/effect/spawner/structure/window/reinforced, @@ -53764,7 +53692,7 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "stP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /turf/closed/wall/r_wall, @@ -53812,17 +53740,6 @@ /obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/directions/supply/directional/south{ - dir = 8 - }, -/obj/structure/sign/directions/engineering/directional/south{ - dir = 4; - pixel_y = -40 - }, -/obj/structure/sign/directions/security/directional/south{ - dir = 8; - pixel_y = -24 - }, /turf/open/floor/iron, /area/station/hallway/primary/central) "suw" = ( @@ -53927,7 +53844,7 @@ /turf/open/floor/iron/stairs{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "swv" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt/dust, @@ -53952,7 +53869,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "swS" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -54060,11 +53977,11 @@ /area/station/science/server) "szp" = ( /obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /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/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/lesser) "szq" = ( @@ -54121,12 +54038,12 @@ }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/any/medical/general, -/obj/effect/mapping_helpers/airlock/unres{ - 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/airlock/unres{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "sAs" = ( @@ -54239,7 +54156,7 @@ /turf/open/floor/iron/stairs{ dir = 8 }, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "sBG" = ( /obj/machinery/light/warm/directional/north, /obj/effect/turf_decal/siding/wood{ @@ -54289,8 +54206,9 @@ /turf/open/floor/plating, /area/station/science/xenobiology) "sCO" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron/dark, /area/station/security/lockers) "sCT" = ( @@ -54458,7 +54376,7 @@ /area/station/maintenance/port/lesser) "sGj" = ( /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/machinery/door/airlock/maintenance{ @@ -54473,7 +54391,7 @@ "sGk" = ( /obj/effect/turf_decal/siding/white/corner, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 + dir = 4 }, /turf/open/floor/iron/herringbone, /area/station/hallway/primary/central) @@ -54608,18 +54526,13 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"sIm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/supermatter/room) "sIv" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /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/iron/white, +/turf/open/floor/iron/dark, /area/station/medical/paramedic) "sIx" = ( /obj/structure/cable, @@ -54667,7 +54580,7 @@ "sIW" = ( /obj/structure/transport/linear/public, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "sIX" = ( /obj/effect/turf_decal/arrows{ dir = 4; @@ -54742,11 +54655,7 @@ /area/station/hallway/secondary/exit/departure_lounge) "sJT" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) -"sJX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) +/area/station/ai/satellite/uppersouth) "sKs" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -54842,7 +54751,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "sLW" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt, @@ -54907,8 +54816,6 @@ "sNi" = ( /obj/machinery/light/directional/north, /obj/effect/mapping_helpers/broken_floor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/chair/sofa/bench/left{ dir = 4 }, @@ -54974,7 +54881,7 @@ /area/station/science/genetics) "sPi" = ( /obj/structure/closet/firecloset, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/textured, /area/station/hallway/primary/central) "sPv" = ( @@ -54988,6 +54895,7 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner, +/obj/structure/cable, /turf/open/floor/iron/white/smooth_large, /area/station/medical/surgery/theatre) "sPD" = ( @@ -55036,7 +54944,7 @@ "sQd" = ( /obj/structure/cable/multilayer/connected, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "sQe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55127,19 +55035,9 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"sRM" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/stairs/left{ - dir = 1 - }, -/area/station/command/bridge) "sRP" = ( /obj/machinery/photocopier/prebuilt, /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/dark, /area/station/command/heads_quarters/hop) "sRU" = ( @@ -55156,12 +55054,12 @@ /area/station/service/lawoffice) "sSm" = ( /obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /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/service/maintenance, /turf/open/floor/iron, /area/station/commons/locker) "sSL" = ( @@ -55504,7 +55402,7 @@ /area/station/service/bar) "sYu" = ( /obj/structure/closet/crate/wooden/toy, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 @@ -55548,7 +55446,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "sYU" = ( /obj/machinery/atmospherics/components/binary/pump{ name = "Air to Port" @@ -55558,7 +55456,7 @@ "sYZ" = ( /obj/machinery/duct, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 + dir = 4 }, /obj/machinery/light/directional/west, /obj/machinery/firealarm/directional/west, @@ -55573,7 +55471,7 @@ dir = 8 }, /turf/open/floor/iron/white, -/area/station/medical/paramedic) +/area/station/medical/exam_room) "sZs" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/siding/wood, @@ -55602,6 +55500,7 @@ /turf/open/floor/iron/white, /area/station/medical/chemistry) "sZK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/command/bridge) "sZS" = ( @@ -55639,7 +55538,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "tac" = ( /obj/structure/disposalpipe/trunk{ dir = 4 @@ -55893,18 +55792,18 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "tgW" = ( /obj/machinery/door/airlock/medical{ name = "Primary Surgical Theatre" }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/medical/surgery, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/unres{ dir = 8 }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) "tgZ" = ( @@ -55932,6 +55831,22 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) +"thj" = ( +/obj/structure/sign/directions/security/directional/east{ + dir = 1; + pixel_y = 8; + pixel_x = 0 + }, +/obj/structure/sign/directions/supply/directional/east{ + dir = 1; + pixel_x = 0 + }, +/obj/structure/sign/directions/engineering/directional/east{ + pixel_y = -8; + pixel_x = 0 + }, +/turf/closed/wall, +/area/station/maintenance/port/lesser) "tho" = ( /obj/machinery/power/port_gen, /obj/effect/decal/cleanable/dirt/dust, @@ -56064,8 +55979,10 @@ /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, /turf/open/floor/iron/white/smooth_edge, /area/station/medical/pharmacy) +"tjn" = ( +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "tjq" = ( -/obj/structure/cable, /obj/machinery/shower/directional/south, /obj/effect/turf_decal{ icon = 'icons/obj/mining_zones/survival_pod.dmi'; @@ -56110,6 +56027,7 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/drone_bay) "tkh" = ( @@ -56153,6 +56071,10 @@ }, /obj/structure/desk_bell, /obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Hydroponics Shutters"; + id = "hydroponics_shutters" + }, /turf/open/floor/iron, /area/station/service/hydroponics) "tla" = ( @@ -56161,7 +56083,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "tlb" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /turf/open/floor/iron/dark, @@ -56193,7 +56115,7 @@ "tlW" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "tmg" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -56231,6 +56153,11 @@ dir = 1 }, /area/station/medical/pharmacy) +"tmQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/medical/chemistry/minisat) "tmR" = ( /obj/structure/bed/maint, /obj/item/bedsheet/yellow{ @@ -56315,7 +56242,7 @@ }, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "tnD" = ( /obj/item/bodypart/leg/left, /turf/open/floor/plating/airless, @@ -56374,10 +56301,10 @@ "toC" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) "toD" = ( @@ -56393,7 +56320,7 @@ /obj/machinery/newscaster/directional/north, /obj/machinery/light/warm/directional/east, /turf/open/floor/iron/chapel{ - dir = 4 + dir = 1 }, /area/station/service/chapel) "toJ" = ( @@ -56825,7 +56752,7 @@ "tww" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "twx" = ( /turf/open/openspace, /area/station/maintenance/disposal) @@ -56852,7 +56779,7 @@ /obj/effect/spawner/round_default_module, /obj/machinery/flasher/directional/north, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "txx" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, @@ -56863,7 +56790,7 @@ /area/station/maintenance/department/cargo) "txy" = ( /obj/machinery/door/airlock/hatch, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -56960,8 +56887,8 @@ "tzT" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "tzW" = ( @@ -57001,7 +56928,7 @@ /area/station/asteroid) "tAr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 + dir = 1 }, /turf/open/floor/iron/large, /area/station/hallway/secondary/exit/departure_lounge) @@ -57074,7 +57001,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/item/radio/intercom/directional/north, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "tBh" = ( /obj/structure/railing/corner{ dir = 4 @@ -57133,11 +57060,12 @@ /area/space/nearstation) "tBL" = ( /obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/turf_decal/sand/plating, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical) "tCb" = ( @@ -57342,8 +57270,6 @@ dir = 6 }, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) "tFa" = ( @@ -57357,7 +57283,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -57415,7 +57341,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "tGE" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -57440,14 +57366,16 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) "tGR" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ dir = 8 }, @@ -57535,18 +57463,14 @@ "tIH" = ( /turf/open/floor/grass, /area/station/service/hydroponics/garden) -"tIN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/command/corporate_showroom) "tIO" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/decal/cleanable/dirt/dust, /obj/structure/disposalpipe/segment{ dir = 9 }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/dark, /area/station/medical/chemistry/minisat) "tIS" = ( @@ -57559,7 +57483,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "tIT" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57620,7 +57544,7 @@ /obj/machinery/door/airlock/engineering, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/iron, @@ -57636,7 +57560,7 @@ "tKm" = ( /obj/machinery/firealarm/directional/west, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "tKX" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/mechanical{ @@ -57675,8 +57599,8 @@ name = "Departure Lounge" }, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "tLH" = ( @@ -57753,7 +57677,7 @@ /obj/effect/mapping_helpers/requests_console/supplies, /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "tMF" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -57766,13 +57690,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/button/door/directional/east{ - id = "cap_ext"; - name = "bolt control"; - normaldoorcontrol = 1; - pixel_y = 24; - specialfunctions = 4 - }, /turf/open/floor/engine, /area/station/command/heads_quarters/captain/private) "tMO" = ( @@ -57805,7 +57722,7 @@ dir = 1 }, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "tNh" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -57870,14 +57787,14 @@ id_tag = "r1"; name = "Room A" }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/any/medical/general, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, /turf/open/floor/iron/white, /area/station/medical/patients_rooms/room_a) "tNR" = ( @@ -58041,7 +57958,7 @@ "tRb" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58076,17 +57993,11 @@ "tRp" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/disposal/bin, -/obj/structure/cable, /obj/structure/disposalpipe/trunk{ dir = 1 }, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"tRP" = ( -/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/xenobiology) "tRX" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 @@ -58118,7 +58029,7 @@ c_tag = "Security Armory" }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "tSn" = ( /obj/structure/chair/office/light{ dir = 4 @@ -58128,12 +58039,6 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) -"tSH" = ( -/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, -/area/station/hallway/secondary/exit/departure_lounge) "tSX" = ( /obj/item/stack/tile/iron/white/smooth_large, /obj/effect/decal/cleanable/dirt/dust, @@ -58166,7 +58071,7 @@ /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "tTE" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron/showroomfloor, @@ -58279,20 +58184,20 @@ /area/station/security/processing) "tVI" = ( /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/cable, /obj/structure/disposalpipe/sorting/mail/flip{ dir = 1 }, /obj/effect/mapping_helpers/mail_sorting/medbay/general, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/storage) "tVJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "tVP" = ( /obj/item/instrument/musicalmoth, /obj/effect/spawner/random/entertainment/musical_instrument, @@ -58339,6 +58244,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"tWl" = ( +/obj/item/stack/tile/iron/white, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/chemistry/minisat) "tWs" = ( /obj/effect/spawner/random/structure/grille, /obj/structure/cable, @@ -58378,13 +58289,13 @@ /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "tXg" = ( -/obj/structure/sign/warning, -/turf/closed/wall/rock/porous, +/obj/structure/sign/warning/directional/north, +/turf/closed/mineral/random/stationside/asteroid/porus{ + mineralChance = 20 + }, /area/station/asteroid) "tXi" = ( /obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) @@ -58414,7 +58325,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "tXt" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/siding/white{ @@ -58466,7 +58377,7 @@ /obj/item/emergency_bed{ pixel_y = 11 }, -/turf/open/floor/iron/white/textured, +/turf/open/floor/holofloor/dark, /area/station/medical/paramedic) "tYI" = ( /obj/effect/landmark/start/head_of_security, @@ -58478,10 +58389,13 @@ /area/station/command/heads_quarters/hos) "tYQ" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/bridge) "tZt" = ( /obj/machinery/airalarm/directional/north, +/obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/research) "tZv" = ( @@ -58611,7 +58525,7 @@ }, /obj/effect/turf_decal/tile/red, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "uaY" = ( /obj/item/kirbyplants/random/dead, /obj/structure/window/reinforced/spawner/directional/north, @@ -58661,7 +58575,7 @@ /obj/structure/closet/lasertag/red, /obj/structure/window/spawner/directional/east, /obj/effect/turf_decal/tile/red/fourcorners, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/fitness/recreation) "ubV" = ( @@ -58722,7 +58636,7 @@ dir = 5 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "udG" = ( /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, @@ -58979,7 +58893,7 @@ pixel_y = 3 }, /turf/open/floor/iron/chapel{ - dir = 4 + dir = 1 }, /area/station/service/chapel) "uin" = ( @@ -59042,7 +58956,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "uiU" = ( /obj/effect/spawner/random/structure/table, /obj/effect/decal/cleanable/dirt/dust, @@ -59104,7 +59018,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 1 }, /turf/open/floor/plating, @@ -59153,7 +59067,7 @@ /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/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "ukY" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -59260,6 +59174,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"umv" = ( +/obj/machinery/button/door/directional/south{ + id = "brigdesk"; + name = "shutter control"; + pixel_y = 0; + pixel_x = 10 + }, +/turf/closed/wall/r_wall, +/area/station/security/processing) "umA" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/east, @@ -59400,7 +59323,7 @@ /obj/structure/cable/layer3, /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "upy" = ( /obj/effect/turf_decal/tile/yellow/diagonal_centre, /obj/machinery/holopad, @@ -59429,7 +59352,7 @@ }, /obj/machinery/camera/autoname/directional/north, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "upS" = ( /obj/machinery/holopad, /turf/open/floor/iron, @@ -59468,9 +59391,9 @@ /area/station/maintenance/port/greater) "uqy" = ( /obj/machinery/door/airlock/maintenance, -/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/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/commons/vacant_room/commissary) "uqI" = ( @@ -59636,7 +59559,7 @@ pixel_y = -3 }, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "usQ" = ( /obj/effect/turf_decal/tile/yellow, /obj/item/kirbyplants/random, @@ -59664,7 +59587,7 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /turf/open/floor/catwalk_floor/iron_dark, @@ -59676,15 +59599,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/prison/safe) -"utH" = ( -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) "utM" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "utP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59783,9 +59700,7 @@ /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) "uvN" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "uww" = ( @@ -59796,6 +59711,11 @@ /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/effect/spawner/random/entertainment/lighter, /obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "bar_shutters"; + name = "Bar Shutters" + }, /turf/open/floor/iron/dark, /area/station/service/bar) "uwx" = ( @@ -59904,6 +59824,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical) +"uyo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "uyu" = ( /obj/structure/railing/corner{ dir = 8 @@ -59915,6 +59840,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) +"uyx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/command/bridge) "uyA" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/broken/directional/east, @@ -59971,7 +59903,9 @@ dir = 1 }, /obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/iron/white/herringbone, /area/station/science/breakroom) "uzB" = ( @@ -60133,6 +60067,21 @@ }, /turf/open/floor/iron, /area/station/service/theater) +"uCl" = ( +/obj/structure/sign/directions/evac/directional/north{ + dir = 2; + pixel_y = 10 + }, +/obj/structure/sign/directions/command/directional/north{ + dir = 8; + pixel_y = -10 + }, +/obj/structure/sign/directions/science/directional/north{ + dir = 4; + pixel_y = 0 + }, +/turf/closed/wall, +/area/station/science/lobby) "uCo" = ( /obj/machinery/power/shieldwallgen, /obj/effect/decal/cleanable/dirt/dust, @@ -60197,7 +60146,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "uCS" = ( /obj/machinery/telecomms/receiver/preset_right, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -60476,7 +60425,9 @@ /area/station/maintenance/aft/upper) "uIU" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) "uIW" = ( @@ -60559,15 +60510,13 @@ icon_state = "catwalk-14" }, /turf/open/openspace, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "uLh" = ( /obj/structure/cable, /obj/machinery/camera/autoname/directional/north, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "uLi" = ( @@ -60706,6 +60655,7 @@ "uNc" = ( /obj/structure/rack, /obj/effect/spawner/random/engineering/vending_restock, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/cargo/boutique) "uNd" = ( @@ -60758,7 +60708,7 @@ plasmatanks = 0 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "uOb" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -60777,9 +60727,6 @@ name = "Primary Surgical Theatre" }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/effect/mapping_helpers/airlock/access/all/medical/surgery, /obj/structure/cable, @@ -60787,6 +60734,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) "uOo" = ( @@ -60833,10 +60783,6 @@ linked_elevator_id = "medbay1"; pixel_x = -32 }, -/obj/machinery/button/elevator/directional/south{ - id = "medbay1"; - pixel_x = -32 - }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "uPi" = ( @@ -60940,13 +60886,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"uSd" = ( -/obj/structure/disposalpipe/segment{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/lobby) "uSe" = ( /obj/structure/closet/crate, /obj/effect/spawner/random/maintenance, @@ -61044,7 +60983,7 @@ }, /obj/structure/cable/layer3, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "uUk" = ( /obj/structure/rack, /obj/item/storage/briefcase{ @@ -61117,7 +61056,8 @@ /obj/effect/spawner/random/trash/hobo_squat, /obj/machinery/button/curtain{ id = "neverstopgambling"; - pixel_y = 32 + pixel_y = 32; + dir = 1 }, /turf/open/floor/wood, /area/station/maintenance/central/lesser) @@ -61439,7 +61379,6 @@ /turf/open/floor/plating, /area/station/science/xenobiology) "vbY" = ( -/obj/structure/cable, /obj/effect/turf_decal/siding/wood, /obj/structure/sign/painting/large/library{ pixel_y = -35 @@ -61484,7 +61423,7 @@ /obj/machinery/light/cold/directional/north, /obj/structure/closet/wardrobe/white/medical, /turf/open/floor/iron/white, -/area/station/medical/paramedic) +/area/station/medical/exam_room) "vdD" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 @@ -61570,7 +61509,7 @@ dir = 9 }, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "vfy" = ( /obj/machinery/door/airlock/medical/glass{ name = "Pharmacy" @@ -61603,7 +61542,6 @@ }, /obj/structure/cable, /obj/structure/sign/warning/vacuum/external/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -61651,7 +61589,7 @@ }, /obj/structure/cable/layer3, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "vgz" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/firealarm/directional/south, @@ -61661,8 +61599,6 @@ /area/station/hallway/primary/central) "vgI" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted, -/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/execution/transfer) "vgM" = ( @@ -61744,6 +61680,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/command/bridge) +"viM" = ( +/obj/structure/sign/directions/engineering/directional/south{ + pixel_y = 10 + }, +/obj/structure/sign/directions/supply/directional/south{ + dir = 8; + pixel_y = -10 + }, +/obj/structure/sign/directions/security/directional/south{ + dir = 8; + pixel_y = 0 + }, +/turf/closed/wall, +/area/station/hallway/primary/central) "viT" = ( /obj/machinery/camera/autoname/directional/west{ network = list("ss13","rd","xeno") @@ -61759,7 +61709,6 @@ /turf/open/floor/grass, /area/station/science/research) "vja" = ( -/obj/structure/cable, /obj/effect/turf_decal/siding/white/corner{ dir = 1 }, @@ -62095,7 +62044,7 @@ /turf/open/floor/carpet/executive, /area/station/command/meeting_room) "voQ" = ( -/obj/machinery/computer/rdconsole, +/obj/machinery/computer/rdconsole/unlocked, /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/white, /area/station/science/lab) @@ -62162,8 +62111,6 @@ /obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/tile, /area/station/service/bar) "vqq" = ( @@ -62273,6 +62220,21 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/iron/grimy, /area/station/maintenance/central/greater) +"vsJ" = ( +/obj/structure/sign/directions/security/directional/south{ + dir = 8; + pixel_y = -10 + }, +/obj/structure/sign/directions/engineering/directional/south{ + dir = 4; + pixel_y = 10 + }, +/obj/structure/sign/directions/supply/directional/south{ + dir = 8; + pixel_y = 0 + }, +/turf/closed/wall, +/area/station/hallway/secondary/exit/departure_lounge) "vsO" = ( /obj/structure/cable, /obj/structure/disposalpipe/sorting/mail{ @@ -62296,7 +62258,7 @@ /obj/effect/spawner/random/aimodule/harmless, /obj/machinery/camera/autoname/directional/west, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "vtv" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -62386,10 +62348,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/medical) -"vwb" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/storage) "vwd" = ( /obj/machinery/newscaster/directional/south, /turf/open/floor/engine, @@ -62661,10 +62619,10 @@ /area/station/commons/fitness/recreation) "vAs" = ( /obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/misc/asteroid, /area/station/science/research) "vAu" = ( @@ -62675,7 +62633,7 @@ /area/station/security/breakroom) "vAB" = ( /turf/open/openspace/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "vAD" = ( /obj/machinery/door/airlock/multi_tile/public/glass{ name = "Dormitories" @@ -62687,7 +62645,7 @@ /area/station/commons/locker) "vAE" = ( /obj/structure/closet/wardrobe/green, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, @@ -62702,13 +62660,13 @@ "vBp" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "vBs" = ( /obj/machinery/holopad, /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "vBD" = ( /obj/structure/chair/office/light{ dir = 1 @@ -62734,13 +62692,13 @@ /obj/effect/decal/cleanable/blood/oil, /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "vCw" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 }, /obj/structure/closet/boxinggloves, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/fitness/recreation) "vCy" = ( @@ -62758,6 +62716,11 @@ /area/station/command/corporate_showroom) "vCL" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Hydroponics Shutters"; + id = "hydroponics_shutters"; + dir = 8 + }, /turf/open/floor/plating, /area/station/service/hydroponics) "vCQ" = ( @@ -62792,7 +62755,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "vEh" = ( /obj/effect/mapping_helpers/broken_floor, /obj/item/stack/sheet/iron, @@ -62935,7 +62898,7 @@ /obj/machinery/light/small/dim/directional/east, /obj/item/coin/titanium, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "vFD" = ( /obj/machinery/door/window/brigdoor/security/cell/left/directional/west{ id = "Cell 4"; @@ -63103,7 +63066,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "vHI" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -63196,7 +63159,7 @@ /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/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "vKd" = ( /obj/effect/decal/cleanable/blood/oil, /obj/machinery/light/small/directional/west, @@ -63209,7 +63172,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "vKx" = ( /obj/structure/table/wood, /obj/item/storage/box/coffeepack, @@ -63390,7 +63353,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "vNB" = ( /obj/machinery/vending/tool, /obj/effect/decal/cleanable/dirt, @@ -63472,7 +63435,7 @@ }, /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "vOT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -63526,10 +63489,10 @@ 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 = 10 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "vQa" = ( @@ -63559,7 +63522,7 @@ /area/station/command/bridge) "vQn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 + dir = 8 }, /turf/open/floor/engine, /area/station/medical/chemistry) @@ -63576,8 +63539,6 @@ /turf/closed/wall, /area/station/cargo/boutique) "vQT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/sign/poster/official/moth_hardhat/directional/north, /obj/structure/table, /obj/item/storage/toolbox/emergency, @@ -63586,6 +63547,9 @@ "vRi" = ( /mob/living/basic/bot/cleanbot/medbay, /obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/storage) "vRm" = ( @@ -63594,7 +63558,7 @@ /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "vRt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -63829,10 +63793,9 @@ /turf/open/floor/wood/tile, /area/station/commons/dorms) "vVj" = ( -/obj/effect/decal/cleanable/dirt/dust, /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/dust, /turf/open/floor/iron/white, /area/station/medical/chemistry/minisat) "vVk" = ( @@ -63933,7 +63896,7 @@ "vWK" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "vWN" = ( /obj/structure/sign/warning/electric_shock/directional/north, /obj/structure/rack, @@ -63957,6 +63920,12 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron, /area/station/service/cafeteria) +"vXt" = ( +/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/lobby) "vXS" = ( /obj/structure/broken_flooring/side, /obj/effect/decal/cleanable/dirt/dust, @@ -64019,6 +63988,12 @@ }, /turf/open/floor/plating, /area/station/service/theater) +"vZJ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "vZL" = ( /obj/machinery/holopad, /obj/effect/turf_decal/box/white{ @@ -64036,8 +64011,6 @@ /turf/open/floor/iron, /area/station/security/brig/entrance) "vZX" = ( -/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 }, @@ -64112,7 +64085,7 @@ /area/station/security/interrogation) "waS" = ( /obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -64206,7 +64179,7 @@ /obj/item/multitool, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "wcp" = ( /turf/open/floor/carpet, /area/station/command/corporate_showroom) @@ -64221,7 +64194,7 @@ "wdc" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 + dir = 8 }, /turf/open/floor/iron, /area/station/engineering/gravity_generator) @@ -64344,17 +64317,21 @@ "wfl" = ( /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/closed/wall/r_wall, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "wfs" = ( -/obj/structure/cable, -/obj/machinery/button/door/directional/west{ - id = "maintbridge"; - name = "Shutter Control"; - pixel_y = 24 +/obj/structure/sign/directions/security/directional/north{ + dir = 8; + pixel_y = 10 }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) +/obj/structure/sign/directions/engineering/directional/north{ + dir = 4; + pixel_y = 0 + }, +/obj/structure/sign/directions/command/directional/north{ + pixel_y = -10 + }, +/turf/closed/wall/r_wall, +/area/station/engineering/transit_tube) "wfy" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64650,10 +64627,6 @@ /obj/effect/turf_decal/tile/dark_green/opposingcorners, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"wli" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall, -/area/station/cargo/miningoffice) "wlo" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 5 @@ -64808,7 +64781,7 @@ "wow" = ( /obj/effect/turf_decal/tile/red, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "woz" = ( /obj/structure/sign/poster/official/random/directional/east, /obj/structure/cable, @@ -64827,7 +64800,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "woL" = ( /turf/closed/wall/rock, /area/station/maintenance/port/greater) @@ -64855,7 +64828,7 @@ dir = 4 }, /turf/open/floor/glass/reinforced/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "wps" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64869,7 +64842,7 @@ /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "wpG" = ( /obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64950,12 +64923,12 @@ /turf/open/floor/plating, /area/station/engineering/atmos/project) "wqU" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/junction{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/lobby) "wqW" = ( @@ -64965,7 +64938,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green, -/area/station/ai_monitored/command/nuke_storage) +/area/station/command/vault) "wrx" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 @@ -65030,6 +65003,7 @@ "wsi" = ( /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/chapel{ dir = 8 }, @@ -65137,7 +65111,6 @@ "wtW" = ( /obj/structure/window/spawner/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/commons/fitness/recreation) "wtZ" = ( @@ -65179,7 +65152,7 @@ "wun" = ( /obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/layer_manifold/supply/visible/layer4, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating, @@ -65192,9 +65165,9 @@ /turf/open/floor/iron/textured_large, /area/station/medical/treatment_center) "wus" = ( -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/carpet/black, /area/station/command/heads_quarters/hos) "wuS" = ( @@ -65218,8 +65191,6 @@ /obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/sorting/mail/flip{ dir = 1 }, @@ -65243,7 +65214,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "wvs" = ( /obj/structure/chair/sofa/bench, /obj/effect/landmark/start/prisoner, @@ -65328,7 +65299,7 @@ "wwR" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/plating, @@ -65484,7 +65455,7 @@ /obj/structure/cable/layer3, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "wzX" = ( /obj/structure/flora/tree/palm/style_random, /turf/open/floor/grass, @@ -65531,7 +65502,7 @@ dir = 1 }, /turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "wAy" = ( /obj/structure/cable, /turf/open/floor/iron/white/smooth_edge, @@ -65632,12 +65603,10 @@ /obj/structure/window/reinforced/spawner/directional/west, /obj/item/food/grown/banana, /obj/structure/sign/warning/biohazard/directional/south, -/obj/structure/sign/warning{ - pixel_x = 32 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, +/obj/structure/sign/warning/directional/east, /turf/open/misc/grass, /area/station/cargo/boutique) "wCj" = ( @@ -65729,7 +65698,7 @@ dir = 1 }, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/teleporter) +/area/station/ai/satellite/teleporter) "wDb" = ( /obj/structure/chair/office{ dir = 8 @@ -65751,8 +65720,6 @@ "wDo" = ( /obj/structure/cable, /obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/interrogation) "wDr" = ( @@ -65787,6 +65754,9 @@ /obj/effect/turf_decal/siding/red{ dir = 5 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/circuit, /area/station/science/robotics/lab) "wDH" = ( @@ -65860,7 +65830,7 @@ /area/station/science/lobby) "wED" = ( /obj/structure/closet/masks, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron/white/textured_large, /area/station/commons/fitness/recreation) "wEF" = ( @@ -66023,7 +65993,7 @@ /area/station/hallway/secondary/command) "wHJ" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "wIr" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/cable, @@ -66033,12 +66003,8 @@ /area/station/service/bar/backroom) "wIB" = ( /obj/structure/railing, -/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4, +/obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/maintenance/department/engine) @@ -66106,7 +66072,7 @@ /area/station/commons/lounge) "wKE" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/maintenance_hatch, /obj/structure/cable, @@ -66122,7 +66088,7 @@ }, /obj/machinery/firealarm/directional/south, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "wKO" = ( /turf/open/floor/glass, /area/station/maintenance/department/medical) @@ -66167,7 +66133,6 @@ /area/station/maintenance/department/engine) "wLq" = ( /obj/effect/landmark/blobstart, -/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) @@ -66176,6 +66141,8 @@ /obj/structure/disposalpipe/segment{ 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/security/office) "wLu" = ( @@ -66275,14 +66242,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured, /area/station/science/lobby) -"wME" = ( -/obj/machinery/door/firedoor/border_only{ - 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/research) "wMY" = ( /obj/structure/cable, /obj/structure/dresser, @@ -66371,7 +66330,7 @@ /area/station/science/ordnance) "wOo" = ( /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "wOp" = ( /obj/structure/table, /obj/machinery/reagentgrinder{ @@ -66425,7 +66384,7 @@ "wPy" = ( /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "wPE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66452,11 +66411,6 @@ /obj/machinery/light/dim/directional/west, /turf/open/floor/iron/white, /area/station/science/research) -"wQa" = ( -/obj/effect/turf_decal/bot_white, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/storage) "wQe" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, @@ -66715,7 +66669,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "sci-entrance" }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/machinery/door/firedoor, @@ -66778,7 +66732,7 @@ }, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "wWE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66790,6 +66744,8 @@ /obj/machinery/holopad, /obj/effect/turf_decal/bot, /obj/effect/landmark/event_spawn, +/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/miningoffice) "wWJ" = ( @@ -66843,7 +66799,6 @@ /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "wYc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel{ dir = 8 }, @@ -66852,7 +66807,7 @@ /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/aisat/uppersouth) +/area/station/ai/satellite/uppersouth) "wYo" = ( /obj/structure/filingcabinet/chestdrawer, /obj/item/toy/figure/cmo{ @@ -67018,13 +66973,17 @@ req_access = list("medical") }, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/button/elevator/directional/south{ + id = "medbay1" + }, /turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) "xaH" = ( /obj/structure/filingcabinet, /obj/machinery/button/ticket_machine{ pixel_x = 24; - pixel_y = 6 + pixel_y = 6; + dir = 4 }, /obj/machinery/button/door/directional/east{ id = "hopdesk"; @@ -67118,7 +67077,6 @@ "xbB" = ( /obj/machinery/disposal/bin, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/trunk{ dir = 8 }, @@ -67149,7 +67107,6 @@ /area/station/engineering/supermatter/room) "xcb" = ( /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/science/robotics/lab) "xch" = ( @@ -67188,6 +67145,7 @@ /obj/effect/spawner/random/structure/chair_comfy{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/bridge) "xcC" = ( @@ -67261,7 +67219,7 @@ "xeo" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -67317,7 +67275,7 @@ "xfn" = ( /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "xfz" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/yellow, @@ -67469,6 +67427,10 @@ }, /turf/open/floor/iron, /area/station/security/brig/entrance) +"xiw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/engine, +/area/station/medical/chemistry) "xiy" = ( /obj/effect/turf_decal/siding/white{ dir = 10 @@ -67524,7 +67486,7 @@ "xje" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 + dir = 1 }, /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -67562,9 +67524,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/corner, /obj/item/radio/intercom/directional/west, /obj/effect/landmark/start/chemist, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/textured, /area/station/medical/pharmacy) "xjq" = ( @@ -67613,7 +67573,7 @@ /obj/structure/cable/layer3, /mob/living/simple_animal/bot/secbot/pingsky, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "xkI" = ( /obj/effect/decal/cleanable/molten_object, /turf/open/misc/asteroid, @@ -67638,7 +67598,7 @@ /obj/item/ai_module/core/full/dungeon_master, /obj/structure/cable, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "xlm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/frame/machine, @@ -67893,6 +67853,7 @@ /area/station/maintenance/department/science) "xqB" = ( /obj/machinery/light/dim/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured, /area/station/engineering/storage/tech) "xqE" = ( @@ -68042,7 +68003,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/camera/autoname/directional/west{ network = list("ss13","medbay") }, @@ -68079,7 +68039,6 @@ "xtA" = ( /obj/effect/turf_decal/tile/neutral/diagonal_centre, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) "xtB" = ( @@ -68256,8 +68215,6 @@ /turf/open/floor/iron/grimy, /area/station/maintenance/central/lesser) "xwh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "xwm" = ( @@ -68277,7 +68234,7 @@ /obj/machinery/power/smes/full, /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark/telecomms, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "xwA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/maintenance, @@ -68343,7 +68300,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "xxJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ dir = 1 @@ -68368,6 +68325,7 @@ dir = 5 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/chapel/funeral) "xxV" = ( @@ -68442,7 +68400,7 @@ /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/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "xzG" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/white, @@ -68481,7 +68439,7 @@ /obj/machinery/computer/upload/ai, /obj/machinery/airalarm/directional/west, /turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "xAd" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, @@ -68538,7 +68496,7 @@ dir = 8 }, /turf/open/floor/iron/dark/smooth_large, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) "xAV" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -68595,6 +68553,11 @@ "xBS" = ( /turf/closed/wall, /area/station/medical/surgery/theatre) +"xBU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/small, +/area/station/science/cytology) "xBV" = ( /obj/machinery/atmospherics/components/binary/volume_pump, /obj/effect/turf_decal/tile/yellow{ @@ -68759,6 +68722,7 @@ /obj/machinery/door/airlock/multi_tile/public/glass{ name = "Art Storage" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/storage/art) "xEr" = ( @@ -68944,7 +68908,7 @@ /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/ai_monitored/turret_protected/ai_upload_foyer) +/area/station/ai/upload/foyer) "xIm" = ( /obj/structure/broken_flooring/pile, /obj/effect/decal/cleanable/dirt/dust, @@ -68959,7 +68923,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "xIN" = ( /obj/structure/railing, /obj/machinery/door/firedoor/border_only, @@ -69001,7 +68965,7 @@ req_access = list("captain") }, /turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) +/area/station/ai/upload/chamber) "xJK" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/door/poddoor/shutters/window/preopen{ @@ -69047,7 +69011,6 @@ department = "Mining"; name = "Mining Requests Console" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/miningoffice) "xKo" = ( @@ -69159,7 +69122,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/tile, /area/station/command/corporate_showroom) "xMY" = ( @@ -69244,7 +69206,7 @@ /obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "xOg" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/effect/spawner/random/engineering/tracking_beacon, @@ -69272,6 +69234,8 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/tile, /area/station/service/bar) "xOB" = ( @@ -69289,6 +69253,7 @@ /obj/effect/turf_decal/tile/dark_blue/half/contrasted, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/command) "xOF" = ( @@ -69345,10 +69310,17 @@ "xPo" = ( /obj/effect/turf_decal/box/corners, /turf/open/floor/plating/elevatorshaft, -/area/station/ai_monitored/turret_protected/aisat_interior) +/area/station/ai/satellite/interior) +"xPp" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/lobby) "xPH" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) "xPL" = ( @@ -69506,11 +69478,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood/tile, /area/station/service/bar) -"xUf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/storage) "xUx" = ( /obj/structure/flora/rock/style_random, /turf/open/misc/asteroid, @@ -69531,6 +69498,13 @@ }, /turf/open/space/basic, /area/space/nearstation) +"xUJ" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Monkey Pen" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, +/turf/open/floor/grass, +/area/station/medical/chemistry) "xUR" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -69539,14 +69513,12 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "xUT" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 }, /obj/item/radio/intercom/directional/west, -/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/xenobiology) "xUW" = ( @@ -69582,6 +69554,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/dark/textured, /area/station/science/robotics/lab) "xVO" = ( @@ -69657,7 +69631,7 @@ pixel_x = 27 }, /turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "xXh" = ( /obj/machinery/power/shieldwallgen, /obj/effect/decal/cleanable/dirt/dust, @@ -69699,6 +69673,7 @@ /obj/effect/turf_decal/stripes/red/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/morgue) "xXF" = ( @@ -69715,7 +69690,7 @@ "xYa" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/structure/disposalpipe/segment{ @@ -69739,7 +69714,7 @@ /obj/effect/landmark/navigate_destination/minisat_access_ai, /obj/effect/turf_decal/stripes/corner, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69841,7 +69816,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/station/ai_monitored/command/storage/satellite) +/area/station/ai/satellite/maintenance/storage) "yae" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 4 @@ -69870,7 +69845,7 @@ /area/station/science/ordnance/testlab) "yaw" = ( /obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat_interior"; + control_area = "/area/station/ai/satellite/interior"; name = "AI Antechamber turret control"; pixel_y = -27 }, @@ -69878,7 +69853,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/uppernorth) +/area/station/ai/satellite/uppernorth) "yaH" = ( /obj/item/radio/intercom/directional/east, /obj/machinery/portable_atmospherics/canister/oxygen, @@ -69909,7 +69884,7 @@ dir = 8 }, /turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) +/area/station/command/eva) "ybo" = ( /turf/open/floor/iron/white/textured_corner{ dir = 8 @@ -69959,7 +69934,7 @@ /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/mapping_helpers/airlock/unres/delayed{ dir = 8 }, /turf/open/floor/iron/white, @@ -70013,6 +69988,7 @@ "ycI" = ( /mob/living/carbon/human/species/monkey, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/grass, /area/station/medical/chemistry) "ycN" = ( @@ -70023,6 +69999,11 @@ /obj/effect/mapping_helpers/airlock/access/any/command/hop, /turf/open/floor/plating, /area/station/command/heads_quarters/hop) +"ycT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/engine, +/area/station/medical/chemistry) "ycY" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 1 @@ -70125,10 +70106,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "yeS" = ( /obj/structure/closet/crate/grave, -/obj/effect/landmark/start/hangover/closet, +/obj/effect/landmark/start/hangover, /turf/open/misc/asteroid, /area/station/asteroid) "yfl" = ( @@ -70153,6 +70134,10 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"yfL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/textured_large, +/area/station/engineering/storage/tech) "ygb" = ( /obj/structure/table, /obj/machinery/recharger, @@ -70331,7 +70316,7 @@ /obj/structure/window/spawner/directional/south, /obj/structure/window/spawner/directional/east, /turf/open/misc/grass, -/area/station/ai_monitored/turret_protected/aisat/foyer) +/area/station/ai/satellite/foyer) "yin" = ( /turf/open/water/no_planet_atmos/deep, /area/station/service/hydroponics/garden) @@ -70479,6 +70464,16 @@ /obj/machinery/holopad, /turf/open/floor/circuit, /area/station/science/robotics/lab) +"yll" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/opposingcorners, +/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/security) "ylm" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -70544,7 +70539,7 @@ }, /obj/effect/turf_decal/tile/red, /turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) +/area/station/security/armory) "yma" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -70560,7 +70555,7 @@ dir = 4 }, /turf/open/floor/catwalk_floor/iron_dark, -/area/station/ai_monitored/turret_protected/ai) +/area/station/ai/satellite/chamber) "ymi" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -83311,8 +83306,8 @@ wsI uyL umh sjJ -rzF -bGe +umh +uyL lmL hQy icM @@ -83570,8 +83565,8 @@ icM xfN rxX raR -wQa -vwb +icM +ijg xrU fXZ sFd @@ -83589,7 +83584,7 @@ qPN xwO mHG ecy -sme +cEU rCz awj dkj @@ -83824,8 +83819,8 @@ poi ahV uyL hQu -uyL -rzF +bGe +umh nCt umh uyL @@ -84081,11 +84076,11 @@ rPA mBt xnQ hQu -sJX -rzF -noi -jea -ghU +oXc +umh +xnQ +hQu +uSA icM hoX wOU @@ -84339,7 +84334,7 @@ uyL vSt umh uyL -fFz +lmL aex umh uyL @@ -84596,10 +84591,10 @@ lAL heZ uyL uyL -ezP -ezP -ezP -ezP +uyL +uyL +uyL +uyL ijg hoX rXd @@ -84844,7 +84839,7 @@ bdu bWW poi tAL -giK +wBc lvg lBC uDB @@ -85901,7 +85896,7 @@ bfc gok rnk lpF -yfl +kdh aNR oDC meP @@ -85922,9 +85917,9 @@ cBb hAA naZ sep -ebo -ebo -jvd +qkc +qkc +iuV sIv rnk bAr @@ -86416,7 +86411,7 @@ xQN rnk rnk vWI -xUf +aNR taT wJy wJy @@ -86694,7 +86689,7 @@ cqJ pCK lyF rgE -cBb +dgp jka sZl rnk @@ -86868,7 +86863,7 @@ dMF rrF hME lvZ -wUe +heu xPH iEO sWy @@ -86951,7 +86946,7 @@ jSY dPt xdm pzo -cBb +dgp vdb cJh rnk @@ -87125,7 +87120,7 @@ hME hME hME kSm -wUe +heu eFK iEO oCR @@ -87208,7 +87203,7 @@ oBg eAJ vkn pGM -cBb +dgp dAr asP rnk @@ -87975,7 +87970,7 @@ xHY rAa dgp qGB -fqF +eYv ksU tsq dgp @@ -88161,7 +88156,7 @@ jza eWC jza jkv -kkT +iHG dba qLk jza @@ -88232,7 +88227,7 @@ xHY wZI hQg sed -fqF +eYv nkf xzG hQg @@ -88465,7 +88460,7 @@ ksl nJs fXn mDr -jGK +fXn kJN unL rnk @@ -88676,7 +88671,7 @@ fod jza bSI sCO -bqV +keQ bZf jza fLv @@ -88979,7 +88974,7 @@ rWs cQm fXn fXn -aKd +cQm mju wjj rnk @@ -89199,14 +89194,14 @@ dPv mGG mGG xQW -kcA -fyA +yll +qie rRK gHr gHr gHr gHr -gHr +umv gHr ydk ghW @@ -89457,14 +89452,14 @@ sfm ecC mxv hSW -fyA +qie rRK xLR lfp tRX rjL pWC -ubd +qaz ydk xNq mtB @@ -89507,7 +89502,7 @@ qfB ujT ujT qfB -qfB +oez nIG tmn bxC @@ -89764,7 +89759,7 @@ bGD nxG nxG nxG -hpB +ciY nxG nxG tuA @@ -90252,7 +90247,7 @@ kmu dxT tCE xMk -rVD +aQS deY aQS vTx @@ -90281,7 +90276,7 @@ prW prW prW prW -dvz +prW prW tOm hDK @@ -90509,7 +90504,7 @@ kmu dxT tCE bAw -bAw +rVD bAw bAw uLj @@ -90538,7 +90533,7 @@ uZx lsC bvm lsC -uZx +hpB dbN tOm tCE @@ -90740,7 +90735,7 @@ sgW cpO mAd skr -hBD +wrx gpV kaJ obc @@ -91532,8 +91527,8 @@ hbM rjX rjX iXj -rjX -oez +aKJ +kmu tHF hqz bAw @@ -92042,7 +92037,7 @@ wGg pLW bzH bZa -bZa +giy giy ego bZa @@ -92092,8 +92087,8 @@ wdV wdV ltU jtc +jaa wdV -wfs rnk cLf cLf @@ -92300,7 +92295,7 @@ sid mOb wEc xOg -rVu +bLa qER aUo iXj @@ -93107,7 +93102,7 @@ kAg ujv kmu hGE -nxG +kmu afe kmu tOm @@ -93364,7 +93359,7 @@ kAg vNH kmu opH -knX +fBz fBz fBz pUW @@ -93620,7 +93615,7 @@ sWn kAg veW kmu -tOm +dcI tCE tCE tCE @@ -95166,7 +95161,7 @@ iEj wkf hzF xEL -qtP +deW pdg iGC iGC @@ -95353,7 +95348,7 @@ cLf cLf tyd cLf -hrM +bVA aGz ien csW @@ -95424,7 +95419,7 @@ hDK hzF vCy czW -tSH +hUS hUS hUS hUS @@ -95925,7 +95920,7 @@ pDP umo aMR ygj -qrl +ygj ncX eQi tLI @@ -96181,7 +96176,7 @@ aGA rss aGA rss -dbw +aGA aGA aGA eQi @@ -96192,7 +96187,7 @@ kmu rFV tOm sut -hzF +vsJ hzF hjo gEr @@ -96438,7 +96433,7 @@ ruP lOE mRA dlZ -ygj +qrl pQN pQN eQi @@ -96695,7 +96690,7 @@ ruP jEr qrl ffk -ygj +qrl wKo fIX eQi @@ -96898,8 +96893,8 @@ bqX ogH aeJ xcs -tYQ -tYQ +iMS +iMS tYQ fID nlQ @@ -96952,7 +96947,7 @@ ruP qrl vrR rej -ygj +qrl tQt efc xrV @@ -97155,8 +97150,8 @@ eKR pVC yhk lPz -cBh -cBh +jTd +jTd rKb dla kCD @@ -97209,7 +97204,7 @@ ruP pQN qrl aqR -ygj +qrl ffk ffk eQi @@ -97220,7 +97215,7 @@ kmu aly dxT nBA -hzF +qAo hzF eGn sIX @@ -97466,7 +97461,7 @@ ruP mSm qrl gTh -ygj +qrl qrl qrl eQi @@ -97674,13 +97669,13 @@ typ ckb jlw iRB -gkQ +uyx bGW tbH alc jZj -nAx -kaz +dhl +jZj dbJ mMH juE @@ -97723,9 +97718,9 @@ ruP ffk ohh ffk -ygj +qrl fXU -eDV +qrl eQi vxl rjn @@ -97931,7 +97926,7 @@ typ lCK aHs iRB -kZg +uyx gbM mzI cgo @@ -97994,7 +97989,7 @@ ekL hzF qDg dhO -tSH +cSb cSb cSb cSb @@ -98188,7 +98183,7 @@ rCd kNX eKR tKX -kZg +uyx nPm yjH eKR @@ -98440,10 +98435,10 @@ eKR cNQ kjs ftR -fun -fun +mrq +mrq hSi -sRM +bQc kZA gkQ dBn @@ -98957,7 +98952,7 @@ bCr kYU jTd rkz -lrc +dla eHa ktI ita @@ -98965,7 +98960,7 @@ hOb cwq cwq giv -iPS +cwq wcp juw nKt @@ -98975,8 +98970,8 @@ xDh juw pSO xYn -pSO -jaa +wfs +kmu qbA tCE mJR @@ -99479,7 +99474,7 @@ vCI mXY mXY nPQ -tIN +cwq euR juw wUM @@ -99537,7 +99532,7 @@ loU jKy iBe pOv -kUW +gaK aRt sxk azg @@ -99791,9 +99786,9 @@ nWx cRM hGo dPw -jGZ +mQy kpj -kJl +mQy wYc hGh vSn @@ -100023,11 +100018,11 @@ xQH mcA kqD jpn -vOT -oqt -oqt -aFw -oLH +uzH +sgq +sgq +pUj +wWZ wWZ wWZ utY @@ -100047,10 +100042,10 @@ tCE bTm jKy oeL -dPw +cXn rGQ muf -pOv +lqM lCO umO uhD @@ -100281,9 +100276,9 @@ gLp dNh gGs skV -uzH +vOT nAG -pUj +ekF oLH gUs wWZ @@ -100306,9 +100301,9 @@ hAV hGo tki iEK -wsi +peA bfD -wsi +peA bJQ peA srj @@ -100561,8 +100556,8 @@ tCE bTm gho tGZ -ccZ -rGQ +dPw +jKy naO pOv gaK @@ -101815,7 +101810,7 @@ usF ufr kZw uIU -ufr +kZw kZw rhP fQm @@ -102083,7 +102078,7 @@ qdt akl clG tXi -utH +cmB sYZ cmB pWR @@ -102615,8 +102610,8 @@ prW anT prW sOA -bVA -aKJ +prW +prW jqj dxT aQS @@ -102872,8 +102867,8 @@ crU crU crU crU -crU -crU +dvz +thj iEn eZn emy @@ -103344,11 +103339,11 @@ iMk bDy irx gyl -gvF -qaz +uCl +kmu tHF -qAo -uZx +tCE +viM fDa eMG xBz @@ -103598,10 +103593,10 @@ goB txy tGE cUk -cUk +vXt cUk hFY -wEA +fHI nxG sGs nTT @@ -103854,9 +103849,9 @@ eRu eRu vfJ vSv -grl -dko qXy +dko +hBQ mJG oTX tEW @@ -104117,7 +104112,7 @@ iKc rSL jbL lFE -cBr +aQS deY xMk aQS @@ -104374,7 +104369,7 @@ iKc hle gvF rIb -iAw +wEA swi swi swi @@ -104886,9 +104881,9 @@ rvg vuq hPH iKc -gtB -uSd -gQN +iKc +bsw +wxa vks yhV oYu @@ -104900,8 +104895,8 @@ xOU kBt wdz nOZ -xcb -eqQ +tld +tld dyb qdo exQ @@ -105140,9 +105135,9 @@ kju wMB jrd rvg -slL -slL -slL +xPp +xPp +xPp oXz bsw wxa @@ -105413,7 +105408,7 @@ uig xOU kcY prg -qKm +tld rDl ylj esP @@ -105670,7 +105665,7 @@ mwW xOU xOU xOU -qKm +tld wDD vRZ oQe @@ -105927,7 +105922,7 @@ exk faX cya vpq -qKm +tld xVK ryy ryy @@ -105955,7 +105950,7 @@ xAy pEf sbd soB -sbd +yfL bcm lHm dct @@ -106469,7 +106464,7 @@ xAy rdI byj jvN -sbd +kgO xqB lHm nWu @@ -107204,7 +107199,7 @@ pdz tZF wPX mlV -cpw +dfM cpw jIm xOU @@ -107719,7 +107714,7 @@ pBn cPo qii owp -iQZ +lxX ocV thf qlG @@ -107977,7 +107972,7 @@ tNR oUW mnd peo -bWi +dfM thf dmM pld @@ -109045,8 +109040,8 @@ eyg dUi myg dyv -jxd -jxd +clx +clx svf svf pTJ @@ -109062,7 +109057,7 @@ vPT fIW mqH wCv -oMi +vZJ wgk jKu saJ @@ -109300,9 +109295,9 @@ vME gTV eyg wpn -cFc -svf -svf +lUY +jxd +jxd clx mJb fQO @@ -109811,7 +109806,7 @@ dpU bnK wqU ocB -ocB +mIC xot xot xtY @@ -111119,8 +111114,8 @@ btl qmn ryC mnU -lpe -lpe +qOY +qOY jKp wMt ryC @@ -111378,7 +111373,7 @@ kjI vdZ rgI kyh -qOY +lpe vAj ryC cLf @@ -111593,7 +111588,7 @@ nkA com cnS mSN -tnp +pJp fCG krJ oWr @@ -111850,7 +111845,7 @@ qKj jSu cnS rwF -fCG +rEw mBb atv fTX @@ -111873,7 +111868,7 @@ fTX eSm rhS rhS -mVi +bhG rhS rhS rhS @@ -114193,7 +114188,7 @@ neE uXw bhv qaZ -vUh +rBr hoM rGq vUh @@ -117021,7 +117016,7 @@ kEu fsQ aGC vpn -qvX +iXR uvN wQz kiW @@ -117278,9 +117273,9 @@ kEu kEu aQo aQo -sIm -sIm -sIm +aQo +aQo +aQo kEu uFC vaU @@ -121355,12 +121350,12 @@ cCI hbV hbV qRJ -rka +rhs nVj rka xUT -tRP -tRP +hbV +hbV tVV jQS ucG @@ -121612,10 +121607,10 @@ bKQ hBF rYZ xay -xay -hBF -hBF -hBF +kQa +pOQ +pOQ +kQa ulA kQa baP @@ -121872,7 +121867,7 @@ cnt hbV hbV hbV -hbV +uyo kQa pJt uhz @@ -142438,15 +142433,15 @@ hhX urC jrm pJF -bcg -bcg -bcg -bcg -bcg -nSF +qyq +qyq +qyq +qyq +qyq +wUH vVj -mua -wJk +iAQ +oDw wnw fYe fYe @@ -142696,18 +142691,18 @@ urC jrm qyq bDN -sRq -wqq -qyq -wUH -sRq +tWl +iyg +bcg +tmQ +duf lSI gSJ tIO wnw fYe fYe -hhX +cLf hhX hhX hhX @@ -147811,7 +147806,7 @@ pEH pEH vxX iaN -wli +iaN aJP iaN sdc @@ -149642,7 +149637,7 @@ mqc mfw bGk bGk -ncR +xUJ ncR bGk ahq @@ -149907,7 +149902,7 @@ vUo laf kuy bVY -lgA +tqV eXW fnh mhc @@ -150666,7 +150661,7 @@ taj kYT ogL cPZ -rVL +auB rVL bGk qAU @@ -150923,8 +150918,8 @@ wWJ kYT auB waT -rVL -auB +xiw +ycT aPC jql sTj @@ -151181,7 +151176,7 @@ kYT xtb fwJ ipZ -auB +mjj aPC jql sTj @@ -151437,7 +151432,7 @@ wWJ kYT auB auB -rVL +auB vQn aPC eeQ @@ -151460,7 +151455,7 @@ cNG vtv lVD iom -dpj +tjn aRZ iMq vxX @@ -151716,7 +151711,7 @@ apk cNG hce wLq -hce +dpj cUm tve iMq @@ -152205,7 +152200,7 @@ nGv bgY bgY bgY -bgY +dog qoN fnh wnL @@ -152462,7 +152457,7 @@ fnh qoN rNJ koX -bgY +dog qoN fnh igq @@ -153705,7 +153700,7 @@ mIW mIW mIW hED -bme +hED hnJ hED hED @@ -155565,8 +155560,8 @@ vxX vxX vxX vxX -vxX -tXg +dGk +unk hhX hhX hhX @@ -156086,11 +156081,11 @@ hhX hhX hhX hhX +unk tXg vxX vxX vxX -vxX hhX hhX hhX @@ -156853,9 +156848,9 @@ vxX vxX unk unk -tXg +unk vxX -tXg +unk unk unk vxX @@ -157110,13 +157105,13 @@ azk azk azk unk -gMk -vxX -vxX +dra vxX +nuH vxX vxX vxX +bme vxX hhX hhX @@ -157373,7 +157368,7 @@ uet vxX gMk mGM -tXg +unk unk hhX hhX @@ -160430,7 +160425,7 @@ lIr gcN xTZ igS -aEY +pdp jGB nRA tqJ @@ -160686,7 +160681,7 @@ pco lIr mGo vqt -vqt +mic nSn jGB vyL @@ -160703,8 +160698,8 @@ lgp hzF lSM gcV -iGC -tkD +swU +aCk uxt uxt uxt @@ -160943,7 +160938,7 @@ oxG hCs jnm jKD -vqt +mic rzb jGB jGB @@ -160961,7 +160956,7 @@ hzF sNi bOi iGC -tkD +qyU uxt uxt uxt @@ -161218,7 +161213,7 @@ hzF vQT clM caP -tkD +aCk uxt uxt uxt @@ -161455,7 +161450,7 @@ mnP mnP dAS kdW -gOG +gcN ffA wvc gEm @@ -161730,9 +161725,9 @@ mGW iZz hzF kCu -jbq -jbq -jbq +poe +poe +soC jbq vnj jCr @@ -169907,7 +169902,7 @@ oAs gOc gOc gOc -nzn +oAs jqf oWg gMk @@ -172484,7 +172479,7 @@ dpp gKt dVp dRh -fdN +xBU xje ipx vxX @@ -172733,7 +172728,7 @@ vRP bWi bWi iHH -nmj +dfM wPX dfM xtZ @@ -173760,7 +173755,7 @@ raz obA gbR omL -wME +omL acY aqa vRA @@ -176631,8 +176626,8 @@ iZa nUb jaH anN -gjJ -gjJ +ktL +asd uIj qVV gNZ @@ -176888,7 +176883,7 @@ elk lde xtL anN -ktL +kWC gjJ qpT aYG @@ -179457,7 +179452,7 @@ urI rAP rAP rAP -odk +urI kdE xjL grz diff --git a/_maps/minigame/CTF/cruiser.dmm b/_maps/minigame/CTF/cruiser.dmm index 1ed48e3e8d33..897ea48c860e 100644 --- a/_maps/minigame/CTF/cruiser.dmm +++ b/_maps/minigame/CTF/cruiser.dmm @@ -479,7 +479,7 @@ "CA" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional, /turf/template_noop, -/area/template_noop) +/area/centcom/ctf) "CU" = ( /obj/structure/window/reinforced/spawner/directional/east{ resistance_flags = 64 diff --git a/_maps/minigame/deathmatch/OSHA_Violator.dmm b/_maps/minigame/deathmatch/OSHA_Violator.dmm index 114bb695c478..92702187f29e 100644 --- a/_maps/minigame/deathmatch/OSHA_Violator.dmm +++ b/_maps/minigame/deathmatch/OSHA_Violator.dmm @@ -2,11 +2,11 @@ "ac" = ( /obj/structure/closet/crate/medical, /turf/open/space/basic, -/area/template_noop) +/area/space/nearstation) "ae" = ( /obj/effect/mob_spawn/corpse/human/cargo_tech, /turf/open/space/basic, -/area/template_noop) +/area/space/nearstation) "ai" = ( /turf/closed/indestructible/reinforced, /area/deathmatch) @@ -1096,15 +1096,15 @@ "Zr" = ( /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle, /turf/open/space/basic, -/area/template_noop) +/area/space/nearstation) "Zz" = ( /obj/machinery/power/singularity_beacon/syndicate, /turf/open/space/basic, -/area/template_noop) +/area/space/nearstation) "ZD" = ( /obj/item/storage/toolbox/syndicate, /turf/open/space/basic, -/area/template_noop) +/area/space/nearstation) (1,1,1) = {" je diff --git a/_maps/minigame/deathmatch/arena_station.dmm b/_maps/minigame/deathmatch/arena_station.dmm index c3fb3ed39034..0cca2ac3d9d7 100644 --- a/_maps/minigame/deathmatch/arena_station.dmm +++ b/_maps/minigame/deathmatch/arena_station.dmm @@ -22,7 +22,7 @@ "bE" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "bR" = ( /obj/machinery/computer{ dir = 4 @@ -930,7 +930,7 @@ /area/deathmatch) "LY" = ( /obj/structure/closet/secure_closet, -/obj/item/gun/energy/xray, +/obj/item/gun/energy/laser/xray, /turf/open/indestructible/vault, /area/deathmatch) "Mc" = ( @@ -1078,7 +1078,7 @@ /obj/structure/closet, /obj/item/toy/plush/lizard_plushie/green, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "QS" = ( /obj/effect/turf_decal/bot_red, /turf/open/indestructible/plating, diff --git a/_maps/minigame/deathmatch/maint_mania.dmm b/_maps/minigame/deathmatch/maint_mania.dmm index 2433686e673e..984da1f698cf 100644 --- a/_maps/minigame/deathmatch/maint_mania.dmm +++ b/_maps/minigame/deathmatch/maint_mania.dmm @@ -34,7 +34,7 @@ "ga" = ( /obj/structure/lattice, /turf/open/space/basic, -/area/template_noop) +/area/space/nearstation) "gJ" = ( /obj/item/ammo_casing/shotgun/stunslug, /turf/open/indestructible, @@ -170,7 +170,7 @@ "ur" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "vB" = ( /obj/machinery/light/small/directional/east, /turf/open/indestructible, @@ -202,7 +202,7 @@ desc = "An old, blue toolbox, it looks soulful." }, /turf/open/space/basic, -/area/template_noop) +/area/space/nearstation) "Bs" = ( /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, @@ -220,7 +220,7 @@ /obj/structure/lattice/catwalk, /obj/effect/mob_spawn/corpse/human/engineer/mod, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Dt" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/loading_area{ @@ -298,7 +298,7 @@ /obj/structure/lattice/catwalk, /obj/structure/statue/sandstone/assistant, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Ij" = ( /turf/open/space/basic, /area/template_noop) @@ -335,7 +335,7 @@ "MC" = ( /obj/effect/mob_spawn/corpse/human/assistant, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "Na" = ( /obj/structure/rack, /obj/item/reagent_containers/cup/soda_cans/starkist, @@ -396,7 +396,7 @@ "Qr" = ( /obj/structure/closet/wardrobe, /turf/open/floor/plating/airless, -/area/template_noop) +/area/space/nearstation) "QN" = ( /obj/item/razor, /obj/structure/table/reinforced, diff --git a/_maps/minigame/deathmatch/meta_brig.dmm b/_maps/minigame/deathmatch/meta_brig.dmm index 1cdd33982bbc..d076e0fec276 100644 --- a/_maps/minigame/deathmatch/meta_brig.dmm +++ b/_maps/minigame/deathmatch/meta_brig.dmm @@ -20,11 +20,7 @@ /obj/structure/marker_beacon/burgundy, /obj/structure/lattice/catwalk, /turf/template_noop, -/area/template_noop) -"an" = ( -/obj/structure/lattice, -/turf/template_noop, -/area/space) +/area/space/nearstation) "aw" = ( /obj/structure/extinguisher_cabinet/directional/east, /turf/closed/indestructible/reinforced, @@ -1444,7 +1440,7 @@ "vC" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/space/nearstation) "vD" = ( /obj/structure/table, /obj/structure/cable, @@ -2626,10 +2622,8 @@ /turf/open/indestructible, /area/deathmatch) "Mb" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, /obj/machinery/light/small/directional/north, +/obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/indestructible, /area/deathmatch) "Mk" = ( @@ -3307,12 +3301,10 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 8 }, +/obj/structure/sign/warning/vacuum/external/directional/west, /turf/open/indestructible, /area/deathmatch) "WD" = ( @@ -4492,7 +4484,7 @@ IJ IJ "} (32,1,1) = {" -an +vC Fi Fi Fi diff --git a/_maps/minigame/deathmatch/species_warfare.dmm b/_maps/minigame/deathmatch/species_warfare.dmm index d452a28d41d8..af11eaf15c35 100644 --- a/_maps/minigame/deathmatch/species_warfare.dmm +++ b/_maps/minigame/deathmatch/species_warfare.dmm @@ -34,7 +34,7 @@ /area/deathmatch) "cd" = ( /obj/effect/turf_decal/tile/dark_blue/full, -/obj/machinery/light/built/directional/south, +/obj/machinery/light/empty/directional/south, /obj/machinery/computer{ dir = 4 }, @@ -574,7 +574,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 }, -/obj/machinery/light/built/directional/south, +/obj/machinery/light/empty/directional/south, /turf/open/indestructible, /area/deathmatch) "wb" = ( @@ -700,7 +700,7 @@ /area/deathmatch) "zt" = ( /obj/effect/turf_decal/tile/dark_blue/full, -/obj/machinery/light/built/directional/south, +/obj/machinery/light/empty/directional/south, /obj/machinery/computer{ dir = 8 }, @@ -867,7 +867,7 @@ /obj/item/ammo_casing/rebar, /obj/item/ammo_casing/rebar, /obj/item/ammo_casing/rebar, -/obj/machinery/light/built/directional/north, +/obj/machinery/light/empty/directional/north, /turf/open/indestructible, /area/deathmatch) "EC" = ( @@ -963,7 +963,7 @@ /obj/effect/turf_decal/tile/dark_blue/full, /obj/structure/rack, /obj/item/gun/energy/e_gun/mini/practice_phaser, -/obj/machinery/light/built/directional/north, +/obj/machinery/light/empty/directional/north, /turf/open/indestructible/dark/smooth_large, /area/deathmatch) "Iu" = ( @@ -1164,7 +1164,7 @@ /obj/structure/rack, /obj/item/cane, /obj/structure/fireaxecabinet/directional/south, -/obj/machinery/light/built/directional/south, +/obj/machinery/light/empty/directional/south, /turf/open/indestructible/dark/smooth_large, /area/deathmatch) "ON" = ( diff --git a/_maps/multiz_debug.json b/_maps/multiz_debug.json index af3ffa352129..ba9b83d5dc74 100644 --- a/_maps/multiz_debug.json +++ b/_maps/multiz_debug.json @@ -5,8 +5,8 @@ "map_file": "multiz.dmm", "ignored_unit_tests": [ "/datum/unit_test/cargo_dep_order_locations", - "/datum/unit_test/job_roundstart_spawnpoints", - "/datum/unit_test/required_map_items", + "/datum/unit_test/maptest_job_roundstart_spawnpoints", + "/datum/unit_test/maptest_required_map_items", "/datum/unit_test/spy_bounty" ], "traits": [ diff --git a/_maps/runtimestation.json b/_maps/runtimestation.json index 12f854ce425e..715d924d5af8 100644 --- a/_maps/runtimestation.json +++ b/_maps/runtimestation.json @@ -6,8 +6,8 @@ "space_ruin_levels": 1, "ignored_unit_tests": [ "/datum/unit_test/cargo_dep_order_locations", - "/datum/unit_test/job_roundstart_spawnpoints", - "/datum/unit_test/required_map_items", + "/datum/unit_test/maptest_job_roundstart_spawnpoints", + "/datum/unit_test/maptest_required_map_items", "/datum/unit_test/spy_bounty" ], "shuttles": { diff --git a/_maps/runtimestation_minimal.json b/_maps/runtimestation_minimal.json new file mode 100644 index 000000000000..d638519ef912 --- /dev/null +++ b/_maps/runtimestation_minimal.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "map_name": "Minimal Runtime Station", + "map_path": "map_files/debug", + "map_file": "runtimestation_minimal.dmm", + "space_ruin_levels": 1, + "ignored_unit_tests": [ + "/datum/unit_test/cargo_dep_order_locations", + "/datum/unit_test/maptest_job_roundstart_spawnpoints", + "/datum/unit_test/maptest_required_map_items", + "/datum/unit_test/spy_bounty", + "/datum/unit_test/space_dragon_expiration", + "/datum/unit_test/nuke_cinematic", + "/datum/unit_test/atmospherics_sanity", + "/datum/unit_test/maptest_mapload_space_verification", + "/datum/unit_test/modify_fantasy_variable", + "/datum/unit_test/create_and_destroy" + ] +} diff --git a/_maps/runtimetown.json b/_maps/runtimetown.json index 08c6e81a66aa..f93ffe2cf337 100644 --- a/_maps/runtimetown.json +++ b/_maps/runtimetown.json @@ -8,10 +8,10 @@ "planetary": 1, "ignored_unit_tests": [ "/datum/unit_test/cargo_dep_order_locations", - "/datum/unit_test/job_roundstart_spawnpoints", + "/datum/unit_test/maptest_job_roundstart_spawnpoints", "/datum/unit_test/spy_bounty", "/datum/unit_test/space_dragon_expiration", - "/datum/unit_test/mapload_space_verification" + "/datum/unit_test/maptest_mapload_space_verification" ], "traits": [ { @@ -24,5 +24,6 @@ "Baseturf": "/turf/open/openspace", "Linkage": "Cross" } - ] + ], + "max_npcs": 25 } diff --git a/_maps/safehouses/README.md b/_maps/safehouses/README.md index 8d64502343ba..e68470d6d0b8 100644 --- a/_maps/safehouses/README.md +++ b/_maps/safehouses/README.md @@ -3,7 +3,7 @@ ## 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.. +2. Update `safehouse.toml` with your new file 3. Place exit and goal landmarks (obj/effect/landmark/bitrunning/..). Generally, 3 exits and 2 goals are ok. 4. Ideally, leave 3 spaces for gear. This has usually been xy [1x1] [1x2] [1x3] 5. Place the modular map connector at the bottom left tile. diff --git a/_maps/safehouses/maintsafe.dmm b/_maps/safehouses/maintsafe.dmm new file mode 100644 index 000000000000..c3579c43c9cd --- /dev/null +++ b/_maps/safehouses/maintsafe.dmm @@ -0,0 +1,131 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"g" = ( +/obj/structure/broken_flooring/corner/directional/north, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"i" = ( +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"j" = ( +/turf/closed/wall, +/area/virtual_domain/safehouse) +"l" = ( +/obj/effect/landmark/bitrunning/hololadder_spawn, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"q" = ( +/obj/effect/landmark/bitrunning/hololadder_spawn, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"t" = ( +/obj/effect/landmark/bitrunning/cache_goal_turf, +/turf/open/indestructible/bitrunning_transport, +/area/virtual_domain/safehouse) +"v" = ( +/obj/structure/broken_flooring/side/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"y" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"C" = ( +/obj/structure/broken_flooring/singular/directional/north, +/obj/structure/railing/corner/end/flip, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"E" = ( +/obj/machinery/light/red/dim/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"I" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"M" = ( +/obj/effect/landmark/bitrunning/hololadder_spawn, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/virtual_domain/safehouse) +"N" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"O" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) +"Y" = ( +/obj/machinery/light/red/dim/directional/east, +/turf/open/floor/plating, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +j +j +j +j +j +j +"} +(2,1,1) = {" +j +i +E +g +M +j +"} +(3,1,1) = {" +j +y +N +v +l +j +"} +(4,1,1) = {" +I +N +a +C +q +j +"} +(5,1,1) = {" +j +a +y +N +t +j +"} +(6,1,1) = {" +j +O +Y +N +t +j +"} +(7,1,1) = {" +j +j +j +j +j +j +"} diff --git a/_maps/shuttles/arrival_catwalk.dmm b/_maps/shuttles/arrival_catwalk.dmm index e50d54a186a9..0da64ca06a53 100644 --- a/_maps/shuttles/arrival_catwalk.dmm +++ b/_maps/shuttles/arrival_catwalk.dmm @@ -116,9 +116,7 @@ "qf" = ( /obj/item/kirbyplants/organic/plant21, /obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron, /area/shuttle/arrival) "qt" = ( @@ -466,9 +464,7 @@ "Tw" = ( /obj/item/kirbyplants/organic/plant21, /obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron, /area/shuttle/arrival) "TZ" = ( diff --git a/_maps/shuttles/arrival_delta.dmm b/_maps/shuttles/arrival_delta.dmm index 8fab83477251..475208cf59e5 100644 --- a/_maps/shuttles/arrival_delta.dmm +++ b/_maps/shuttles/arrival_delta.dmm @@ -201,10 +201,6 @@ /obj/structure/window/reinforced/shuttle, /turf/open/floor/grass, /area/shuttle/arrival) -"az" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, -/area/shuttle/arrival) "aC" = ( /obj/machinery/computer{ dir = 1; @@ -337,6 +333,7 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron, /area/shuttle/arrival) "DV" = ( @@ -357,6 +354,7 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron, /area/shuttle/arrival) "Nn" = ( @@ -395,7 +393,7 @@ ah ah ah ah -az +ag an ag ag @@ -547,7 +545,7 @@ ah ah ah ah -az +ag an ag ag diff --git a/_maps/shuttles/arrival_kilo.dmm b/_maps/shuttles/arrival_kilo.dmm index 2776589602e4..45cf4d898ef6 100644 --- a/_maps/shuttles/arrival_kilo.dmm +++ b/_maps/shuttles/arrival_kilo.dmm @@ -20,8 +20,12 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/arrival) "ae" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, +/obj/effect/turf_decal/bot, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/mineral/plastitanium, /area/shuttle/arrival) "af" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, @@ -73,6 +77,7 @@ /obj/effect/turf_decal/bot, /obj/structure/chair/comfy/shuttle, /obj/machinery/light/directional/north, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/mineral/plastitanium, /area/shuttle/arrival) "ak" = ( @@ -118,6 +123,7 @@ }, /obj/structure/chair/comfy/shuttle, /obj/machinery/light/small/directional/west, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/mineral/plastitanium, /area/shuttle/arrival) "au" = ( @@ -203,6 +209,7 @@ dir = 1 }, /obj/machinery/light/small/directional/west, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/mineral/plastitanium, /area/shuttle/arrival) "aN" = ( @@ -359,13 +366,13 @@ aY lA "} (5,1,1) = {" -ae +ac aj rV aT aV -aN ae +ac "} (6,1,1) = {" af @@ -423,11 +430,11 @@ ab "} (12,1,1) = {" ac -ae +ac at aW aM -ae +ac ac "} (13,1,1) = {" diff --git a/_maps/shuttles/cargo_mini.dmm b/_maps/shuttles/cargo_mini.dmm new file mode 100644 index 000000000000..64789355b26f --- /dev/null +++ b/_maps/shuttles/cargo_mini.dmm @@ -0,0 +1,122 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/supply) +"d" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + icon_state = "propulsion"; + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"r" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/supply) +"u" = ( +/obj/machinery/door/airlock/titanium{ + name = "Supply Shuttle Airlock" + }, +/obj/docking_port/mobile/supply, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/turf/open/floor/plating, +/area/shuttle/supply) +"v" = ( +/obj/machinery/power/shuttle_engine/heater{ + icon_state = "heater"; + dir = 1 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"x" = ( +/turf/template_noop, +/area/template_noop) +"J" = ( +/obj/machinery/door/airlock/titanium{ + name = "Supply Shuttle Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/turf/open/floor/plating, +/area/shuttle/supply) +"X" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/supply) + +(1,1,1) = {" +x +r +r +r +r +r +r +r +r +"} +(2,1,1) = {" +d +r +a +a +a +a +a +a +r +"} +(3,1,1) = {" +d +v +a +a +a +a +a +a +r +"} +(4,1,1) = {" +d +v +a +a +a +a +a +a +r +"} +(5,1,1) = {" +d +v +a +a +a +a +a +a +r +"} +(6,1,1) = {" +d +r +a +a +X +a +a +a +r +"} +(7,1,1) = {" +x +r +r +J +r +u +r +r +r +"} diff --git a/_maps/shuttles/emergency_birdshot.dmm b/_maps/shuttles/emergency_birdshot.dmm index e6839a408333..fb685d3c804f 100644 --- a/_maps/shuttles/emergency_birdshot.dmm +++ b/_maps/shuttles/emergency_birdshot.dmm @@ -214,7 +214,7 @@ anchored = 1; dir = 8 }, -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /turf/open/floor/plating/airless, /area/shuttle/escape) "kZ" = ( diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency_cere.dmm index 72de7bc50d4a..9369eb115a18 100644 --- a/_maps/shuttles/emergency_cere.dmm +++ b/_maps/shuttles/emergency_cere.dmm @@ -352,10 +352,10 @@ /turf/open/floor/iron, /area/shuttle/escape) "bL" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = -32; - pixel_y = 32 +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron, /area/shuttle/escape) "bM" = ( @@ -1541,7 +1541,7 @@ bn bn ac ad -aZ +bL bc bc ba @@ -1585,7 +1585,7 @@ aZ aZ aZ ME -bL +bc bc bT bW diff --git a/_maps/shuttles/emergency_cruise.dmm b/_maps/shuttles/emergency_cruise.dmm index a5dd675aa0ec..6b9fb38b134f 100644 --- a/_maps/shuttles/emergency_cruise.dmm +++ b/_maps/shuttles/emergency_cruise.dmm @@ -2327,10 +2327,7 @@ /turf/open/floor/iron/dark/herringbone, /area/shuttle/escape/brig) "Fq" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32; - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/carpet/red, /area/shuttle/escape) "FC" = ( @@ -4348,7 +4345,7 @@ bP bj QI hp -Fq +La nk gv Ks @@ -4395,7 +4392,7 @@ jt jt jt uV -La +Fq nk fI uu diff --git a/_maps/shuttles/emergency_delta.dmm b/_maps/shuttles/emergency_delta.dmm index da90701ec5aa..94807e385b65 100644 --- a/_maps/shuttles/emergency_delta.dmm +++ b/_maps/shuttles/emergency_delta.dmm @@ -352,13 +352,10 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) -"aT" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, -/area/shuttle/escape) "aU" = ( /obj/effect/turf_decal/bot, /obj/machinery/light/directional/west, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron, /area/shuttle/escape) "aV" = ( @@ -408,6 +405,7 @@ }, /obj/effect/turf_decal/bot, /obj/machinery/light/small/directional/north, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron, /area/shuttle/escape) "ba" = ( @@ -690,6 +688,7 @@ /obj/structure/table/reinforced, /obj/item/storage/box/zipties, /obj/item/radio/intercom/directional/south, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "bX" = ( @@ -718,6 +717,7 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 1 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/dark, /area/shuttle/escape) "ci" = ( @@ -727,6 +727,7 @@ /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron/dark, /area/shuttle/escape) "cj" = ( @@ -1004,6 +1005,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron, /area/shuttle/escape) "Jl" = ( @@ -1107,7 +1109,7 @@ hB af af aO -aT +af aW af hB @@ -1246,7 +1248,7 @@ bN bU af af -aT +af hB af af @@ -1305,7 +1307,7 @@ af af bt hB -aT +af af WG jU @@ -1457,7 +1459,7 @@ aE dY ah af -aT +af af af bY @@ -1525,7 +1527,7 @@ ae af af af -aT +af hB af af @@ -1634,7 +1636,7 @@ hB hB af af -aT +af af hB hB diff --git a/_maps/shuttles/emergency_fame.dmm b/_maps/shuttles/emergency_fame.dmm index 088944a2a288..32354e739896 100644 --- a/_maps/shuttles/emergency_fame.dmm +++ b/_maps/shuttles/emergency_fame.dmm @@ -115,6 +115,7 @@ "fm" = ( /obj/effect/spawner/random/vending/snackvend, /obj/effect/turf_decal/box, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/dark, /area/shuttle/escape) "fS" = ( @@ -428,8 +429,9 @@ /turf/open/floor/mineral/silver, /area/shuttle/escape) "qM" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium/nodiagonal, +/obj/structure/chair/comfy/shuttle, +/obj/structure/sign/nanotrasen/directional/west, +/turf/open/floor/mineral/titanium, /area/shuttle/escape) "qW" = ( /obj/effect/turf_decal/siding{ @@ -532,6 +534,16 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron/dark, /area/shuttle/escape) +"wX" = ( +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/wood, +/area/shuttle/escape) +"wY" = ( +/obj/structure/closet/emcloset/anchored, +/obj/effect/turf_decal/bot, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "xc" = ( /obj/structure/table, /obj/machinery/microwave, @@ -697,6 +709,7 @@ /area/shuttle/escape) "EF" = ( /obj/item/kirbyplants/organic/plant16, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/wood, /area/shuttle/escape) "Fi" = ( @@ -976,6 +989,10 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plating, /area/shuttle/escape) +"UW" = ( +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) "Vl" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/decal/cleanable/dirt, @@ -1271,7 +1288,7 @@ iN Cz "} (9,1,1) = {" -qM +Oa Oa aX Uu @@ -1293,7 +1310,7 @@ Oa mc Oa Oa -qM +Oa "} (10,1,1) = {" mz @@ -1317,7 +1334,7 @@ cu cu Yp Ty -PP +qM mz "} (11,1,1) = {" @@ -1349,8 +1366,8 @@ mz mz NN eW -RZ -qM +wX +Oa mz mz Ws @@ -1364,14 +1381,14 @@ Oa Ws mz mz -qM -Yp +Oa +UW Yp PP mz "} (13,1,1) = {" -qM +Oa Oa FJ RZ @@ -1392,8 +1409,8 @@ Bj mz Yp Yp -oc -qM +wY +Oa "} (14,1,1) = {" Oa diff --git a/_maps/shuttles/emergency_fish.dmm b/_maps/shuttles/emergency_fish.dmm index 2ed11465b3a3..19395c99589e 100644 --- a/_maps/shuttles/emergency_fish.dmm +++ b/_maps/shuttles/emergency_fish.dmm @@ -45,6 +45,7 @@ dir = 4 }, /obj/machinery/light/small/directional/north, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/mineral/titanium/tiled/white, /area/shuttle/escape) "cZ" = ( @@ -146,6 +147,14 @@ /obj/effect/turf_decal/tile/dark_red/opposingcorners, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) +"hP" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/dark/half/contrasted{ + dir = 4 + }, +/obj/structure/sign/warning/directional/east, +/turf/open/floor/wood/tile, +/area/shuttle/escape) "iA" = ( /obj/structure/chair/pew/right{ dir = 1 @@ -228,10 +237,6 @@ }, /turf/open/floor/wood/tile, /area/shuttle/escape) -"oA" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/escape) "oB" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 1 @@ -780,6 +785,7 @@ dir = 8 }, /obj/machinery/light/small/directional/north, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/mineral/titanium/tiled/white, /area/shuttle/escape) "Tn" = ( @@ -869,8 +875,11 @@ /turf/open/floor/mineral/titanium/tiled/blue, /area/shuttle/escape) "WX" = ( -/obj/structure/sign/warning, -/turf/closed/wall/mineral/titanium/nodiagonal, +/obj/effect/turf_decal/tile/dark/half/contrasted{ + dir = 4 + }, +/obj/structure/sign/warning/directional/east, +/turf/open/floor/wood/tile, /area/shuttle/escape) "Xx" = ( /obj/structure/chair/comfy/shuttle{ @@ -1047,7 +1056,7 @@ Kg "} (5,1,1) = {" Me -oA +jL SS qA aa @@ -1145,9 +1154,9 @@ Ih Ih Ou pQ -BA -bB +hP bB +WX bB BA bB @@ -1163,7 +1172,7 @@ Kg "} (9,1,1) = {" Me -oA +jL cf qA aa @@ -1174,9 +1183,9 @@ qO AV EC jL -WX +jL QN -WX +jL jL aa XZ diff --git a/_maps/shuttles/emergency_kilo.dmm b/_maps/shuttles/emergency_kilo.dmm index 43f92baecdf2..1454cbee007c 100644 --- a/_maps/shuttles/emergency_kilo.dmm +++ b/_maps/shuttles/emergency_kilo.dmm @@ -41,8 +41,8 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "ai" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, +/obj/structure/sign/nanotrasen/directional/north, +/turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) "ao" = ( /obj/effect/turf_decal/delivery, @@ -150,6 +150,7 @@ /obj/machinery/camera/autoname{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "bb" = ( @@ -169,10 +170,6 @@ /obj/machinery/status_display/evac, /turf/closed/wall/mineral/titanium, /area/shuttle/escape) -"bh" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/mineral/titanium, -/area/shuttle/escape) "bi" = ( /obj/effect/turf_decal/bot, /obj/machinery/suit_storage_unit/standard_unit, @@ -217,6 +214,7 @@ pixel_y = 4 }, /obj/item/clothing/mask/breath, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "bp" = ( @@ -288,6 +286,7 @@ /obj/machinery/camera/autoname{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/mineral/titanium/tiled/yellow, /area/shuttle/escape) "bO" = ( @@ -555,6 +554,7 @@ /obj/machinery/camera/autoname{ dir = 8 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/mineral/titanium/tiled/yellow, /area/shuttle/escape) "hE" = ( @@ -1254,6 +1254,7 @@ dir = 4 }, /obj/machinery/light/directional/west, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "VD" = ( @@ -1326,7 +1327,7 @@ ab ac ab ac -ai +ab bb ab bq @@ -1338,7 +1339,7 @@ ab bX ab bX -ai +ab ab as cS @@ -1430,8 +1431,8 @@ cS (5,1,1) = {" ab ac +ab ai -as cw IX Mo @@ -1543,7 +1544,7 @@ bY kh dZ Uc -bh +ab bo Em Wu @@ -1592,9 +1593,9 @@ cT (11,1,1) = {" ab ac +ab ai as -as aO aX bi @@ -1704,7 +1705,7 @@ ab ab ab ac -ai +ab ac ab ac @@ -1716,7 +1717,7 @@ ab ac ab ab -ai +ab ab as cS diff --git a/_maps/shuttles/emergency_lance.dmm b/_maps/shuttles/emergency_lance.dmm index 3b8dbea2cc79..c7690ad3832a 100644 --- a/_maps/shuttles/emergency_lance.dmm +++ b/_maps/shuttles/emergency_lance.dmm @@ -617,9 +617,7 @@ /area/shuttle/escape) "ry" = ( /obj/structure/chair/comfy/shuttle, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 - }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) "sn" = ( @@ -935,7 +933,6 @@ /obj/machinery/turretid{ control_area = "/area/shuttle/escape"; desc = "Used to control the Lance's automated defenses."; - icon_state = "control_kill"; lethal = 1; pixel_y = -26; req_access = list("command") @@ -1340,9 +1337,6 @@ }, /area/shuttle/escape) "Pe" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/machinery/button/door/directional/south{ id = "lance_psych"; name = "Panic Room Bolt Control"; @@ -1350,6 +1344,7 @@ specialfunctions = 4 }, /obj/machinery/light/small/directional/north, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/white/textured_large, /area/shuttle/escape) "Px" = ( diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm index 9ca9ab021dc6..cdb6ce920ccd 100644 --- a/_maps/shuttles/emergency_luxury.dmm +++ b/_maps/shuttles/emergency_luxury.dmm @@ -504,7 +504,7 @@ /turf/open/floor/iron, /area/shuttle/escape) "ul" = ( -/obj/item/food/sandwich/cheese/grilled{ +/obj/item/food/sandwich/grilled_cheese{ pixel_y = 11 }, /obj/structure/table/wood/fancy/black, diff --git a/_maps/shuttles/emergency_monastery.dmm b/_maps/shuttles/emergency_monastery.dmm index e1c8d5a97b57..10ff3ff18011 100644 --- a/_maps/shuttles/emergency_monastery.dmm +++ b/_maps/shuttles/emergency_monastery.dmm @@ -543,8 +543,8 @@ /turf/open/floor/carpet, /area/shuttle/escape) "jk" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum/external, +/obj/machinery/light/small/directional/north, +/obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/shuttle/escape) "jn" = ( @@ -637,9 +637,9 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "kv" = ( -/obj/structure/sign/warning/vacuum/external, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/obj/structure/cable, +/obj/structure/sign/warning/vacuum/external/directional/north, +/turf/open/floor/iron/dark, /area/shuttle/escape) "kw" = ( /obj/structure/chair/wood, @@ -1340,10 +1340,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/camera/directional/west{ - c_tag = "Monastery Archives Access Tunnel"; - network = list("ss13","monastery") - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -3242,6 +3238,10 @@ dir = 1 }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/camera/directional/west{ + c_tag = "Monastery Archives Access Tunnel"; + network = list("ss13","monastery") + }, /turf/open/floor/iron/dark, /area/shuttle/escape) "TJ" = ( @@ -5606,8 +5606,8 @@ JG (24,1,1) = {" zE zE -jk -Am +zE +kv rQ XI Am @@ -6444,7 +6444,7 @@ zE zE Pe jc -kv +zE lc zE jc @@ -6527,7 +6527,7 @@ zE zE zE zE -lE +jk zE jc jc diff --git a/_maps/shuttles/emergency_nebula.dmm b/_maps/shuttles/emergency_nebula.dmm index 4a8fb7ecd978..267454ee5ebf 100644 --- a/_maps/shuttles/emergency_nebula.dmm +++ b/_maps/shuttles/emergency_nebula.dmm @@ -117,8 +117,12 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape) "ej" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/structure/sign/nanotrasen/directional/west, +/turf/open/floor/iron/dark, /area/shuttle/escape) "eU" = ( /obj/structure/chair/comfy/shuttle{ @@ -215,6 +219,15 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) +"ii" = ( +/obj/effect/turf_decal/trimline/dark/corner{ + dir = 8 + }, +/obj/structure/sign/nanotrasen/directional/east, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/shuttle/escape) "is" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/siding/wood, @@ -1594,10 +1607,8 @@ /area/shuttle/escape) "GE" = ( /obj/effect/turf_decal/bot, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/structure/reagent_dispensers/fueltank, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark/small, /area/shuttle/escape) "GM" = ( @@ -1678,9 +1689,7 @@ }, /obj/structure/closet/crate/internals, /obj/effect/turf_decal/bot, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark/small, /area/shuttle/escape) "GW" = ( @@ -1944,6 +1953,11 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) +"Od" = ( +/obj/effect/turf_decal/trimline/dark/corner, +/obj/structure/sign/nanotrasen/directional/west, +/turf/open/floor/iron/dark/corner, +/area/shuttle/escape) "OB" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 5 @@ -2221,9 +2235,7 @@ /area/shuttle/escape) "SH" = ( /obj/structure/hedge, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark/small, /area/shuttle/escape) "Tc" = ( @@ -2283,10 +2295,8 @@ /area/shuttle/escape) "UK" = ( /obj/effect/turf_decal/bot, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/structure/reagent_dispensers/watertank, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/iron/dark/small, /area/shuttle/escape) "UQ" = ( @@ -2322,6 +2332,7 @@ /obj/effect/turf_decal/trimline/neutral/end{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/iron/dark/small, /area/shuttle/escape) "VZ" = ( @@ -2671,13 +2682,13 @@ kZ kZ kZ kZ -ej +kZ kZ kZ UU UU UU -ej +kZ kZ kZ kZ @@ -2700,14 +2711,14 @@ Ra kZ GM rF -wP +ej fD Kv qJ wP fD Kv -Am +Od Jy kZ Bu @@ -3157,7 +3168,7 @@ Gh wP fD Kv -CZ +ii fm kZ mw @@ -3181,13 +3192,13 @@ kZ kZ kZ vk -ej +kZ YB kZ UU UU UU -ej +kZ sU kZ CH diff --git a/_maps/shuttles/emergency_omega.dmm b/_maps/shuttles/emergency_omega.dmm index dcd1f6e46438..fb87813c4a92 100644 --- a/_maps/shuttles/emergency_omega.dmm +++ b/_maps/shuttles/emergency_omega.dmm @@ -7,10 +7,6 @@ /obj/structure/grille, /turf/open/floor/plating, /area/shuttle/escape) -"ac" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, -/area/shuttle/escape) "ae" = ( /obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium/red, @@ -20,6 +16,7 @@ dir = 8 }, /obj/item/radio/intercom/directional/north, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "al" = ( @@ -587,6 +584,7 @@ /area/shuttle/escape) "Am" = ( /obj/machinery/light/directional/south, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "Dh" = ( @@ -608,6 +606,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/directional/south, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/iron/dark, /area/shuttle/escape) "Ge" = ( @@ -682,7 +681,7 @@ aa aa aa qX -ac +aa ay aa sY @@ -690,7 +689,7 @@ sY sY aa aP -ac +aa aP aa aa @@ -783,7 +782,7 @@ bt bv "} (6,1,1) = {" -ac +aa ab IX sY @@ -892,7 +891,7 @@ aa sY sY aa -ac +aa aa sY sY @@ -900,7 +899,7 @@ sY sY sY aa -ac +aa aa aa aa diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm index b0b75da383a5..6cb862f7fb6c 100644 --- a/_maps/shuttles/emergency_pubby.dmm +++ b/_maps/shuttles/emergency_pubby.dmm @@ -458,12 +458,10 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "fa" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted, -/obj/machinery/light/directional/east, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/iron/dark, /area/shuttle/escape) "iy" = ( diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm index 7eb255fc2d42..7b96165e0142 100644 --- a/_maps/shuttles/emergency_raven.dmm +++ b/_maps/shuttles/emergency_raven.dmm @@ -759,8 +759,12 @@ /turf/open/floor/plating, /area/shuttle/escape) "cg" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/warning/vacuum/external/directional/west, +/turf/open/floor/iron/dark, /area/shuttle/escape) "ch" = ( /obj/effect/turf_decal/stripes/white/corner{ @@ -939,8 +943,9 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "cP" = ( -/obj/structure/sign/departments/cargo, -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/departments/cargo/directional/south, +/turf/open/floor/iron/dark, /area/shuttle/escape) "cQ" = ( /obj/effect/turf_decal/delivery/white, @@ -1466,7 +1471,6 @@ "ep" = ( /obj/machinery/turretid{ desc = "Used to the Raven's automated defenses."; - icon_state = "control_kill"; lethal = 1; pixel_x = 5; pixel_y = 32; @@ -1488,6 +1492,13 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/plating/airless, /area/shuttle/escape) +"fB" = ( +/obj/effect/turf_decal/stripes/white/corner, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/warning/vacuum/external/directional/east, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "fD" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/bot, @@ -1528,6 +1539,14 @@ /obj/structure/table/reinforced, /turf/open/floor/plating, /area/shuttle/escape) +"ri" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/warning/vacuum/external/directional/east, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "vw" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/decal/cleanable/dirt, @@ -1545,6 +1564,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/shuttle/escape) +"Cz" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/warning/vacuum/external/directional/west, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "Ds" = ( /obj/machinery/button/door{ id = "escape_cockpit_blast"; @@ -1772,7 +1799,7 @@ bt bC ax ax -cg +ax cd ax ax @@ -1782,7 +1809,7 @@ SA ax ax cd -cg +ax ax ax dH @@ -1806,7 +1833,7 @@ aZ bD br bW -ch +Cz cr cz cF @@ -1816,7 +1843,7 @@ bP cU br dg -cr +cg dv ax dI @@ -1913,11 +1940,11 @@ bP bP bP bP -bP cP ax ax ax +ax dr ax ax @@ -2117,11 +2144,11 @@ bP bP bP bP -bP cP ax ax ax +ax dr ax ax @@ -2214,7 +2241,7 @@ bA bL br ca -cl +fB cs cC cG @@ -2224,7 +2251,7 @@ bP cU br do -cs +ri dy ax dQ @@ -2248,7 +2275,7 @@ bB bM ax ax -cg +ax ct ax ax @@ -2258,7 +2285,7 @@ Pd ax ax cd -cg +ax ax ax dR diff --git a/_maps/shuttles/emergency_supermatter.dmm b/_maps/shuttles/emergency_supermatter.dmm index ca1b7ea0d272..0dca7d46d3ac 100644 --- a/_maps/shuttles/emergency_supermatter.dmm +++ b/_maps/shuttles/emergency_supermatter.dmm @@ -3,8 +3,11 @@ /turf/template_noop, /area/template_noop) "ac" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/mineral/titanium, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/structure/sign/warning/radiation/directional/south, +/turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "ad" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, @@ -111,10 +114,12 @@ pixel_x = 4; pixel_y = -4 }, +/obj/structure/sign/warning/radiation/directional/west, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "aE" = ( /obj/structure/reagent_dispensers/fueltank, +/obj/structure/sign/warning/radiation/directional/east, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "aF" = ( @@ -127,8 +132,11 @@ /turf/open/floor/plating, /area/shuttle/escape) "aI" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/mineral/titanium/nodiagonal, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/structure/sign/warning/radiation/directional/south, +/turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "aL" = ( /obj/machinery/door/airlock/external/ruin{ @@ -265,6 +273,7 @@ }, /obj/item/clothing/glasses/meson/engine, /obj/machinery/light/small/directional/east, +/obj/structure/sign/warning/radiation/directional/north, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "bj" = ( @@ -273,6 +282,7 @@ }, /obj/item/clothing/glasses/meson/engine, /obj/machinery/light/small/directional/west, +/obj/structure/sign/warning/radiation/directional/north, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "bk" = ( @@ -303,6 +313,14 @@ }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) +"yI" = ( +/obj/structure/closet/radiation{ + anchored = 1 + }, +/obj/item/clothing/glasses/meson/engine, +/obj/structure/sign/warning/radiation/directional/west, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) "Bi" = ( /obj/structure/closet/radiation{ anchored = 1 @@ -313,6 +331,14 @@ }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) +"Op" = ( +/obj/structure/closet/radiation{ + anchored = 1 + }, +/obj/item/clothing/glasses/meson/engine, +/obj/structure/sign/warning/radiation/directional/east, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/escape) "UA" = ( /obj/machinery/status_display/evac{ pixel_y = -32 @@ -329,7 +355,7 @@ aa aa aw aA -ac +ae aF aw aa @@ -348,7 +374,7 @@ aa aw ae ad -ac +ae ae ad aw @@ -369,10 +395,10 @@ bc be "} (3,1,1) = {" -ac +ae bj ag -ag +yI Bi ag ag @@ -402,9 +428,9 @@ ar ar ar ar -ar aI aw +aw aa aM aa @@ -498,8 +524,8 @@ av av av av -av -aI +ac +aw aw aa aM @@ -513,10 +539,10 @@ aa aa "} (9,1,1) = {" -ac +ae bi ag -ag +Op pb ag ag @@ -540,7 +566,7 @@ be aw ae ad -ac +ae ae ad aw @@ -569,7 +595,7 @@ aa aa aw aA -ac +ae aA aw aa diff --git a/_maps/shuttles/emergency_tranquility.dmm b/_maps/shuttles/emergency_tranquility.dmm index 8498e51bbf10..7e53a0ebce08 100644 --- a/_maps/shuttles/emergency_tranquility.dmm +++ b/_maps/shuttles/emergency_tranquility.dmm @@ -790,10 +790,8 @@ /obj/effect/turf_decal/siding/wood{ dir = 5 }, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, /obj/machinery/light/directional/south, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/wood, /area/shuttle/escape) "oV" = ( @@ -1127,10 +1125,8 @@ /obj/effect/turf_decal/siding/wood{ dir = 9 }, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, /obj/machinery/light/directional/south, +/obj/structure/sign/nanotrasen/directional/south, /turf/open/floor/wood, /area/shuttle/escape) "wm" = ( @@ -1416,10 +1412,8 @@ dir = 10 }, /obj/machinery/vending/coffee, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/machinery/light/directional/north, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/wood, /area/shuttle/escape) "AQ" = ( @@ -1609,7 +1603,7 @@ /obj/item/pen/fourcolor{ pixel_x = -4 }, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = 8; pixel_y = 5 }, @@ -2460,10 +2454,8 @@ dir = 6 }, /obj/machinery/vending/coffee, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, /obj/machinery/light/directional/north, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/wood, /area/shuttle/escape) "UF" = ( diff --git a/_maps/shuttles/ferry_kilo.dmm b/_maps/shuttles/ferry_kilo.dmm index 6b727bfc81b9..a283c5bd0448 100644 --- a/_maps/shuttles/ferry_kilo.dmm +++ b/_maps/shuttles/ferry_kilo.dmm @@ -27,8 +27,12 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/transport) "g" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, +/obj/effect/turf_decal/bot, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/mineral/plastitanium, /area/shuttle/transport) "h" = ( /obj/machinery/power/shuttle_engine/propulsion/left{ @@ -78,6 +82,7 @@ "n" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, +/obj/structure/sign/nanotrasen/directional/north, /turf/open/floor/mineral/plastitanium, /area/shuttle/transport) "o" = ( @@ -227,8 +232,8 @@ e d o r -w g +d "} (7,1,1) = {" f @@ -238,7 +243,7 @@ m f "} (8,1,1) = {" -g +d n r H diff --git a/_maps/shuttles/ferry_nebula.dmm b/_maps/shuttles/ferry_nebula.dmm index cc15e6ab66d7..baec8ed6e25d 100644 --- a/_maps/shuttles/ferry_nebula.dmm +++ b/_maps/shuttles/ferry_nebula.dmm @@ -171,6 +171,12 @@ }, /turf/open/floor/iron/dark/textured, /area/shuttle/transport) +"I" = ( +/obj/effect/turf_decal/bot, +/obj/structure/chair/comfy/shuttle, +/obj/structure/sign/nanotrasen/directional/north, +/turf/open/floor/iron/dark/small, +/area/shuttle/transport) "J" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/south, @@ -200,8 +206,12 @@ /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/transport) "M" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, +/obj/effect/turf_decal/bot, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/structure/sign/nanotrasen/directional/south, +/turf/open/floor/iron/dark/small, /area/shuttle/transport) "N" = ( /obj/structure/hedge, @@ -318,8 +328,8 @@ j i c a -b M +i "} (6,1,1) = {" q @@ -329,8 +339,8 @@ Z q "} (7,1,1) = {" -M -h +i +I a K i diff --git a/_maps/shuttles/hunter_bounty.dmm b/_maps/shuttles/hunter_bounty.dmm index ba752de932b9..2932196835c0 100644 --- a/_maps/shuttles/hunter_bounty.dmm +++ b/_maps/shuttles/hunter_bounty.dmm @@ -9,6 +9,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/sign/warning/vacuum/external/directional/west, /turf/open/floor/plating, /area/shuttle/hunter) "e" = ( @@ -17,10 +18,6 @@ }, /turf/open/floor/plating/airless, /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 @@ -34,6 +31,7 @@ /area/shuttle/hunter) "j" = ( /obj/effect/turf_decal/stripes/line, +/obj/structure/sign/warning/vacuum/external/directional/west, /turf/open/floor/plating, /area/shuttle/hunter) "k" = ( @@ -345,7 +343,7 @@ b (6,1,1) = {" b b -g +b b T s @@ -353,7 +351,7 @@ s s G b -g +b b b "} diff --git a/_maps/shuttles/infiltrator_advanced.dmm b/_maps/shuttles/infiltrator_advanced.dmm index cc6f55f20ead..296a65fe8bf8 100644 --- a/_maps/shuttles/infiltrator_advanced.dmm +++ b/_maps/shuttles/infiltrator_advanced.dmm @@ -240,10 +240,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/airlock) -"aJ" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall/plastitanium/syndicate, -/area/shuttle/syndicate/airlock) "aK" = ( /obj/structure/chair/comfy/shuttle{ name = "tactical chair" @@ -257,10 +253,6 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/airlock) -"aL" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall/r_wall/plastitanium/syndicate, -/area/shuttle/syndicate/airlock) "aM" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -289,6 +281,7 @@ dir = 9 }, /obj/structure/cable, +/obj/structure/sign/warning/vacuum/external/directional/west, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "aQ" = ( @@ -586,6 +579,7 @@ dir = 10 }, /obj/structure/cable, +/obj/structure/sign/warning/vacuum/external/directional/east, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "by" = ( @@ -919,10 +913,6 @@ /obj/item/storage/medkit/fire, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/medical) -"ck" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall/plastitanium/syndicate, -/area/shuttle/syndicate/hallway) "cl" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -1233,6 +1223,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/south, +/obj/structure/sign/warning/vacuum/external/directional/west, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "dd" = ( @@ -1368,6 +1359,7 @@ dir = 6 }, /obj/machinery/light/small/directional/south, +/obj/structure/sign/warning/vacuum/external/directional/east, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "dr" = ( @@ -1693,6 +1685,7 @@ }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/pod/dark, /area/shuttle/syndicate/hallway) "ed" = ( @@ -1775,6 +1768,7 @@ }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/pod/dark, /area/shuttle/syndicate/hallway) "el" = ( @@ -2075,6 +2069,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "Xl" = ( @@ -2084,6 +2079,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "YW" = ( @@ -2143,7 +2139,7 @@ ad ad aO bp -aL +aO aO bD bD @@ -2210,9 +2206,9 @@ ad ad aB aO -aL +aO bZ -aJ +aO aO bf ep @@ -2312,7 +2308,7 @@ dP dR bQ ec -ck +aF cM cz cD @@ -2404,7 +2400,7 @@ cg dR bQ ek -ck +aF cM cY cJ @@ -2486,9 +2482,9 @@ ad ad aD aO -aL +aO bZ -aJ +aO aO cF tB @@ -2557,7 +2553,7 @@ ad ad aO cW -aL +aO aO bE bE diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index a69cbb71e078..394fb3b91afe 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -586,8 +586,12 @@ /turf/open/floor/catwalk_floor/iron_dark, /area/shuttle/syndicate/medical) "fB" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall/r_wall/plastitanium/syndicate/nodiagonal, +/obj/structure/chair/comfy/shuttle/tactical{ + dir = 8 + }, +/obj/effect/turf_decal/bot_red, +/obj/structure/sign/warning/vacuum/external/directional/east, +/turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/airlock) "gt" = ( /obj/item/storage/box/handcuffs{ @@ -1481,7 +1485,7 @@ aB aQ iE RO -nN +fB nN bn bA @@ -1506,7 +1510,7 @@ bO aB Xy aY -fB +Xy aB bn bB diff --git a/_maps/shuttles/mining_common_kilo.dmm b/_maps/shuttles/mining_common_kilo.dmm index 751974a4ad55..26e16830b804 100644 --- a/_maps/shuttles/mining_common_kilo.dmm +++ b/_maps/shuttles/mining_common_kilo.dmm @@ -46,15 +46,12 @@ }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/mining) -"i" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, -/area/shuttle/mining) "j" = ( /obj/machinery/light/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/mineral/plastitanium, /area/shuttle/mining) "k" = ( @@ -127,7 +124,7 @@ a a b -i +a b a a diff --git a/_maps/shuttles/mining_common_northstar.dmm b/_maps/shuttles/mining_common_northstar.dmm index 5e24739c363d..f746f90c0abb 100644 --- a/_maps/shuttles/mining_common_northstar.dmm +++ b/_maps/shuttles/mining_common_northstar.dmm @@ -9,6 +9,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 8 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/pod/light, /area/shuttle/mining) "e" = ( @@ -82,10 +83,6 @@ /obj/item/storage/toolbox/emergency, /turf/open/floor/pod/light, /area/shuttle/mining) -"E" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium/survival, -/area/shuttle/mining) "G" = ( /obj/structure/ore_box, /obj/effect/turf_decal/trimline/brown, @@ -156,7 +153,7 @@ v v l l -E +v l v a diff --git a/_maps/shuttles/mining_freight.dmm b/_maps/shuttles/mining_freight.dmm index ead08ff80ac3..8282d22d3ede 100644 --- a/_maps/shuttles/mining_freight.dmm +++ b/_maps/shuttles/mining_freight.dmm @@ -43,10 +43,6 @@ }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/mining) -"i" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, -/area/shuttle/mining) "j" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/stripes/line{ @@ -55,6 +51,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/mining) "k" = ( @@ -125,7 +122,7 @@ a a b -i +a b a a diff --git a/_maps/shuttles/mining_kilo.dmm b/_maps/shuttles/mining_kilo.dmm index f52a5c947f3e..a6fdf02c6db7 100644 --- a/_maps/shuttles/mining_kilo.dmm +++ b/_maps/shuttles/mining_kilo.dmm @@ -112,10 +112,7 @@ /area/shuttle/mining/large) "q" = ( /obj/machinery/status_display/evac, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/mining/large) -"r" = ( -/obj/structure/sign/departments/cargo, +/obj/structure/sign/departments/cargo/directional/west, /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/mining/large) "s" = ( @@ -340,7 +337,7 @@ b b f l -r +k t x G diff --git a/_maps/shuttles/mining_northstar.dmm b/_maps/shuttles/mining_northstar.dmm index 48c194b6d458..4a557937d778 100644 --- a/_maps/shuttles/mining_northstar.dmm +++ b/_maps/shuttles/mining_northstar.dmm @@ -198,10 +198,6 @@ /obj/structure/ore_box, /turf/open/floor/pod/dark, /area/shuttle/mining) -"X" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium/survival, -/area/shuttle/mining) "Z" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 @@ -212,6 +208,7 @@ /obj/effect/turf_decal/trimline/purple/line{ dir = 4 }, +/obj/structure/sign/nanotrasen/directional/east, /turf/open/floor/pod/light, /area/shuttle/mining) @@ -264,7 +261,7 @@ I P I R -X +I R I P diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index 432e3e931291..9b6f60d16a76 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -14,11 +14,11 @@ /obj/structure/table, /obj/effect/decal/cleanable/dirt, /obj/machinery/recharger, -/obj/item/gun/energy/laser{ +/obj/item/gun/energy/laser/soul{ pixel_x = -3; pixel_y = 6 }, -/obj/item/gun/energy/laser{ +/obj/item/gun/energy/laser/soul{ pixel_y = 3 }, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -407,7 +407,6 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/turretid{ - icon_state = "control_kill"; lethal = 1; locked = 0; pixel_y = -24; diff --git a/_maps/shuttles/pirate_dutchman.dmm b/_maps/shuttles/pirate_dutchman.dmm index a00fff6e7e9f..0b50a136b414 100644 --- a/_maps/shuttles/pirate_dutchman.dmm +++ b/_maps/shuttles/pirate_dutchman.dmm @@ -931,7 +931,7 @@ /obj/item/restraints/legcuffs/bola, /obj/item/restraints/legcuffs/bola, /obj/item/restraints/legcuffs/bola, -/obj/item/gun/energy/laser, +/obj/item/gun/energy/laser/soul, /obj/item/megaphone, /obj/item/melee/chainofcommand/tailwhip/kitty, /obj/item/claymore/cutlass, diff --git a/_maps/shuttles/pirate_ex_interdyne.dmm b/_maps/shuttles/pirate_ex_interdyne.dmm index 4dd64e4cdbe0..c2bfc4f4d0e3 100644 --- a/_maps/shuttles/pirate_ex_interdyne.dmm +++ b/_maps/shuttles/pirate_ex_interdyne.dmm @@ -12,7 +12,6 @@ dir = 8 }, /obj/machinery/turretid{ - icon_state = "control_kill"; lethal = 1; locked = 0; pixel_y = -24; @@ -803,13 +802,6 @@ /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 @@ -968,7 +960,7 @@ aj aj aa aj -Tr +aO "} (8,1,1) = {" vz @@ -1040,7 +1032,7 @@ aj aj DD aj -Tr +aO "} (12,1,1) = {" af diff --git a/_maps/shuttles/pirate_geode.dmm b/_maps/shuttles/pirate_geode.dmm index 2f6a573aae05..68266a96cffd 100644 --- a/_maps/shuttles/pirate_geode.dmm +++ b/_maps/shuttles/pirate_geode.dmm @@ -258,7 +258,6 @@ dir = 4 }, /obj/machinery/turretid{ - icon_state = "control_kill"; lethal = 1; locked = 0; pixel_y = -24; diff --git a/_maps/shuttles/pirate_irs.dmm b/_maps/shuttles/pirate_irs.dmm index 2bc11decda8c..5ad360f2f48f 100644 --- a/_maps/shuttles/pirate_irs.dmm +++ b/_maps/shuttles/pirate_irs.dmm @@ -1379,7 +1379,6 @@ dir = 4 }, /obj/machinery/turretid{ - icon_state = "control_kill"; lethal = 1; pixel_y = -24; req_access = list("syndicate") @@ -1509,7 +1508,7 @@ /area/shuttle/pirate) "NW" = ( /obj/structure/table/reinforced, -/obj/item/stamp{ +/obj/item/stamp/granted{ pixel_x = 7; pixel_y = 10 }, diff --git a/_maps/shuttles/ruin_pirate_cutter.dmm b/_maps/shuttles/ruin_pirate_cutter.dmm index 422d5bfb2cdd..6422f2159b60 100644 --- a/_maps/shuttles/ruin_pirate_cutter.dmm +++ b/_maps/shuttles/ruin_pirate_cutter.dmm @@ -133,7 +133,6 @@ dir = 4 }, /obj/machinery/turretid{ - icon_state = "control_kill"; lethal = 1; locked = 0; pixel_y = -30; @@ -554,7 +553,7 @@ /obj/machinery/door/window/right/directional/south{ name = "Weapon Storage" }, -/obj/item/gun/energy/laser, +/obj/item/gun/energy/laser/soul, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/ruin/caravan/pirate) diff --git a/_maps/shuttles/ruin_syndicate_dropship.dmm b/_maps/shuttles/ruin_syndicate_dropship.dmm index dc3e7b68a7b2..3bbec2623919 100644 --- a/_maps/shuttles/ruin_syndicate_dropship.dmm +++ b/_maps/shuttles/ruin_syndicate_dropship.dmm @@ -439,7 +439,6 @@ /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_kill"; lethal = 1; name = "Shuttle turret control"; pixel_y = 34; diff --git a/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm b/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm index f91d0260d66f..08a0585dc9de 100644 --- a/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm +++ b/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm @@ -12,7 +12,6 @@ /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_kill"; lethal = 1; name = "Shuttle turret control"; pixel_x = 32; diff --git a/_maps/shuttles/starfury_corvette.dmm b/_maps/shuttles/starfury_corvette.dmm index 877375fa4e78..8e9442894669 100644 --- a/_maps/shuttles/starfury_corvette.dmm +++ b/_maps/shuttles/starfury_corvette.dmm @@ -16,7 +16,6 @@ /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_kill"; lethal = 1; name = "Ship Turret Control"; pixel_x = 32; diff --git a/_maps/shuttles/starfury_fighter1.dmm b/_maps/shuttles/starfury_fighter1.dmm index ae37e35c23b0..68c1aa7d141e 100644 --- a/_maps/shuttles/starfury_fighter1.dmm +++ b/_maps/shuttles/starfury_fighter1.dmm @@ -82,7 +82,6 @@ /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_kill"; lethal = 1; name = "Ship Turret Control"; pixel_x = -32; diff --git a/_maps/shuttles/starfury_fighter2.dmm b/_maps/shuttles/starfury_fighter2.dmm index de55ea6c127c..6613bd1154b5 100644 --- a/_maps/shuttles/starfury_fighter2.dmm +++ b/_maps/shuttles/starfury_fighter2.dmm @@ -50,7 +50,6 @@ /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_kill"; lethal = 1; name = "Ship Turret Control"; pixel_x = -32; diff --git a/_maps/shuttles/starfury_fighter3.dmm b/_maps/shuttles/starfury_fighter3.dmm index e078e7b0bfda..be6d810384f3 100644 --- a/_maps/shuttles/starfury_fighter3.dmm +++ b/_maps/shuttles/starfury_fighter3.dmm @@ -49,7 +49,6 @@ /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_kill"; lethal = 1; name = "Ship Turret Control"; pixel_x = -32; diff --git a/_maps/shuttles/whiteship_birdshot.dmm b/_maps/shuttles/whiteship_birdshot.dmm index 8b2c99d9de1f..8f64e40dbecd 100644 --- a/_maps/shuttles/whiteship_birdshot.dmm +++ b/_maps/shuttles/whiteship_birdshot.dmm @@ -201,12 +201,12 @@ amount = 10 }, /obj/structure/cable, -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) "gv" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/iron/textured, /area/shuttle/abandoned/cargo) @@ -240,7 +240,7 @@ /obj/machinery/atmospherics/components/tank/air{ dir = 1 }, -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/engine) "iB" = ( @@ -286,7 +286,7 @@ "jY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/suit_storage_unit/standard_unit, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /turf/open/floor/iron/smooth, /area/shuttle/abandoned/crew) "ku" = ( @@ -847,7 +847,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/medbay) "Cz" = ( -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -1376,7 +1376,6 @@ "UK" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/turretid{ - icon_state = "control_kill"; lethal = 1; locked = 0; pixel_y = 28; @@ -1425,7 +1424,7 @@ pixel_y = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/built/directional/west, +/obj/machinery/light/empty/directional/west, /turf/open/floor/carpet/green, /area/shuttle/abandoned/bar) "WW" = ( diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm index 81c72c3e8638..b0be5fc47f61 100644 --- a/_maps/shuttles/whiteship_box.dmm +++ b/_maps/shuttles/whiteship_box.dmm @@ -190,7 +190,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -280,7 +280,7 @@ /area/shuttle/abandoned/medbay) "aJ" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/machinery/firealarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -396,7 +396,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/south, /obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "aW" = ( @@ -497,7 +497,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/engine) "bh" = ( -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "bi" = ( @@ -553,7 +553,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/structure/cable, /turf/open/floor/plating, /area/shuttle/abandoned/engine) @@ -656,7 +656,7 @@ /area/shuttle/abandoned/medbay) "bA" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/structure/closet/secure_closet/medical2{ anchored = 1 }, @@ -670,7 +670,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/sleeper, /obj/effect/turf_decal/delivery, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) @@ -705,7 +705,7 @@ /area/shuttle/abandoned/medbay) "bF" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/effect/decal/cleanable/blood/old, /obj/structure/cable, /turf/open/floor/iron/white/side{ @@ -930,7 +930,7 @@ "ce" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/structure/closet/secure_closet/medical3{ anchored = 1 }, @@ -979,7 +979,7 @@ /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 1 }, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /turf/open/floor/iron/white/side{ dir = 6 }, @@ -995,7 +995,7 @@ /area/shuttle/abandoned/medbay) "cl" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, /obj/effect/turf_decal/tile/blue{ @@ -1009,7 +1009,7 @@ /obj/structure/rack, /obj/item/storage/toolbox/emergency, /obj/item/wrench, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /obj/machinery/firealarm/directional/west, /obj/machinery/button/door/directional/south{ id = "whiteship_windows"; @@ -1190,7 +1190,7 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/bed/medical/emergency, /obj/machinery/iv_drip, -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/white/side{ dir = 1 @@ -1245,7 +1245,7 @@ /obj/machinery/shower/directional/south, /obj/item/soap, /obj/structure/curtain, -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /turf/open/floor/iron/freezer, /area/shuttle/abandoned/medbay) "cL" = ( @@ -1372,7 +1372,7 @@ "cX" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/structure/table, /obj/machinery/door/window/left/directional/west{ name = "Medical Equipment Storage" @@ -1554,7 +1554,7 @@ /area/shuttle/abandoned/medbay) "dn" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /turf/open/floor/iron/white/side{ dir = 4 }, @@ -1599,7 +1599,7 @@ "ds" = ( /obj/structure/sign/warning/vacuum/external/directional/east, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /turf/open/floor/plating, /area/shuttle/abandoned/medbay) "dt" = ( @@ -1615,7 +1615,7 @@ /obj/item/storage/box/zipties, /obj/item/assembly/flash/handheld, /obj/item/melee/baton/telescopic, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /obj/machinery/airalarm/directional/west, /obj/effect/mapping_helpers/airalarm/all_access, /obj/machinery/power/apc/auto_name/directional/north, @@ -1680,7 +1680,7 @@ pixel_y = 3 }, /obj/item/storage/box/donkpockets, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/shuttle/abandoned/crew) @@ -1733,7 +1733,7 @@ "Pz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/structure/bed{ dir = 4 }, @@ -1755,7 +1755,7 @@ "Uq" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/structure/bed, /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index a83cd9c28b60..7c99b731c7ac 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -52,7 +52,7 @@ /obj/machinery/shower/directional/south, /obj/item/soap, /obj/structure/curtain, -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/freezer, /area/shuttle/abandoned/crew) @@ -67,7 +67,7 @@ /turf/open/floor/iron/freezer, /area/shuttle/abandoned/crew) "al" = ( -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/effect/decal/cleanable/dirt, /obj/structure/bed{ dir = 4 @@ -97,7 +97,7 @@ /area/shuttle/abandoned/crew) "ao" = ( /obj/structure/sign/warning/vacuum/external/directional/east, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /turf/open/floor/plating, /area/shuttle/abandoned/crew) "ap" = ( @@ -122,7 +122,7 @@ /turf/open/floor/iron, /area/shuttle/abandoned/bar) "at" = ( -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /obj/effect/decal/cleanable/dirt, /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/spider/stickyweb, @@ -296,7 +296,7 @@ /turf/open/floor/iron, /area/shuttle/abandoned/bar) "aL" = ( -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ dir = 5 @@ -371,7 +371,7 @@ /turf/open/floor/iron, /area/shuttle/abandoned/crew) "aV" = ( -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, @@ -399,7 +399,7 @@ /obj/effect/turf_decal/stripes/white/line{ dir = 6 }, -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -424,7 +424,7 @@ /obj/effect/turf_decal/stripes/white/line{ dir = 10 }, -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 @@ -505,7 +505,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/engine) "bl" = ( -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -521,7 +521,7 @@ "bn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /obj/structure/spider/stickyweb, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, @@ -619,7 +619,7 @@ /turf/open/floor/iron, /area/shuttle/abandoned/bar) "bx" = ( -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ dir = 6 @@ -781,7 +781,6 @@ /area/shuttle/abandoned/engine) "bR" = ( /obj/machinery/turretid{ - icon_state = "control_kill"; lethal = 1; locked = 0; pixel_x = -28; @@ -824,14 +823,14 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "bV" = ( -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, @@ -978,7 +977,7 @@ /turf/open/floor/iron, /area/shuttle/abandoned/crew) "ck" = ( -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, @@ -1117,7 +1116,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/east, /obj/structure/spider/stickyweb, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, /obj/effect/turf_decal/tile/blue{ @@ -1241,7 +1240,7 @@ /area/shuttle/abandoned/engine) "cP" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -1296,14 +1295,11 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/iron/dark, /area/shuttle/abandoned/medbay) -"cW" = ( -/obj/structure/sign/departments/cargo, -/turf/closed/wall/mineral/titanium, -/area/shuttle/abandoned/cargo) "cX" = ( -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /obj/effect/decal/cleanable/dirt, /obj/structure/spider/stickyweb, +/obj/structure/sign/departments/cargo/directional/west, /turf/open/floor/iron, /area/shuttle/abandoned/cargo) "db" = ( @@ -1378,7 +1374,7 @@ /turf/open/floor/iron/white, /area/shuttle/abandoned/medbay) "dj" = ( -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/effect/decal/cleanable/dirt, /obj/structure/spider/stickyweb, /obj/machinery/firealarm/directional/north, @@ -1423,7 +1419,7 @@ /obj/effect/turf_decal/stripes/white/line{ dir = 5 }, -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -1565,7 +1561,7 @@ /area/shuttle/abandoned/medbay) "dE" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/all_access, /obj/structure/spider/stickyweb, @@ -1592,14 +1588,14 @@ /turf/open/floor/plating, /area/shuttle/abandoned/medbay) "dJ" = ( -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /obj/effect/decal/cleanable/dirt, /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, /turf/open/floor/iron, /area/shuttle/abandoned/cargo) "dM" = ( -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ dir = 6 @@ -1667,7 +1663,7 @@ /area/shuttle/abandoned/medbay) "dT" = ( /obj/structure/sign/warning/vacuum/external/directional/east, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/shuttle/abandoned/medbay) @@ -2282,7 +2278,7 @@ aa aa cx cy -cW +cx dr cy bv diff --git a/_maps/shuttles/whiteship_kilo.dmm b/_maps/shuttles/whiteship_kilo.dmm index 590c18e7868b..a7a1940b5c22 100644 --- a/_maps/shuttles/whiteship_kilo.dmm +++ b/_maps/shuttles/whiteship_kilo.dmm @@ -539,7 +539,6 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/turretid{ - icon_state = "control_kill"; lethal = 1; locked = 0; name = "NTMS-037 Mining Turret control panel"; diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index 91e83d3e272f..3952fb624646 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -142,7 +142,7 @@ "at" = ( /obj/structure/sign/warning/vacuum/external/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /turf/open/floor/plating, /area/shuttle/abandoned/crew) "ax" = ( @@ -295,7 +295,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/engine) "ba" = ( -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -317,7 +317,7 @@ /turf/open/floor/iron, /area/shuttle/abandoned/crew) "be" = ( -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -454,7 +454,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/engine) "bz" = ( -/obj/machinery/light/built/directional/west, +/obj/machinery/light/empty/directional/west, /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/west, /obj/structure/closet/crate/internals, @@ -480,7 +480,7 @@ /area/shuttle/abandoned/bar) "bF" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /obj/structure/curtain, /obj/machinery/shower/directional/south, /obj/item/soap, @@ -529,7 +529,7 @@ /turf/open/floor/iron/dark, /area/shuttle/abandoned/bar) "bM" = ( -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /obj/effect/decal/cleanable/dirt, /obj/structure/table, /obj/machinery/microwave, @@ -647,7 +647,7 @@ /area/shuttle/abandoned/bar) "cd" = ( /obj/structure/table, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /obj/effect/decal/cleanable/dirt, /obj/item/paper_bin{ pixel_x = -4 @@ -676,7 +676,6 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/turretid{ - icon_state = "control_kill"; lethal = 1; locked = 0; pixel_y = 28; @@ -708,7 +707,7 @@ /area/shuttle/abandoned/engine) "ci" = ( /obj/structure/sign/warning/vacuum/external/directional/north, -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/structure/cable, /turf/open/floor/plating, /area/shuttle/abandoned/engine) @@ -833,7 +832,7 @@ /area/shuttle/abandoned/bar) "cD" = ( /obj/structure/table, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /obj/effect/decal/cleanable/dirt, /obj/machinery/cell_charger, /obj/item/stock_parts/power_store/cell/high, @@ -889,7 +888,7 @@ /turf/open/floor/iron/dark, /area/shuttle/abandoned/engine) "cI" = ( -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -969,7 +968,7 @@ /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) "cS" = ( -/obj/machinery/light/built/directional/east, +/obj/machinery/light/empty/directional/east, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/east, @@ -1072,7 +1071,7 @@ "dk" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/iron/cafeteria, /area/shuttle/abandoned/bar) @@ -1339,7 +1338,7 @@ /area/shuttle/abandoned/bar) "ec" = ( /obj/structure/sign/warning/vacuum/external/directional/west, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /turf/open/floor/plating, /area/shuttle/abandoned/bar) "ed" = ( @@ -1375,12 +1374,12 @@ pixel_x = -3; pixel_y = 6 }, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /turf/open/floor/iron, /area/shuttle/abandoned/bar) "ef" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /obj/machinery/hydroponics/constructable, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/green/half/contrasted{ @@ -1464,7 +1463,7 @@ /turf/open/floor/iron/dark, /area/shuttle/abandoned/bar) "he" = ( -/obj/machinery/light/built/directional/west, +/obj/machinery/light/empty/directional/west, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/west, @@ -1619,7 +1618,7 @@ /turf/open/floor/iron, /area/shuttle/abandoned/bar) "uS" = ( -/obj/machinery/light/built/directional/east, +/obj/machinery/light/empty/directional/east, /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/all_access, @@ -1632,7 +1631,7 @@ }, /obj/machinery/airalarm/directional/south, /obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /obj/effect/decal/cleanable/blood, /turf/open/floor/plating, /area/shuttle/abandoned/engine) @@ -1672,7 +1671,7 @@ /turf/open/floor/iron/dark, /area/shuttle/abandoned/crew) "Aa" = ( -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/effect/decal/cleanable/dirt, /obj/machinery/vending/cigarette, /obj/effect/decal/cleanable/dirt, @@ -1821,7 +1820,7 @@ }, /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/structure/cable, /turf/open/floor/plating, /area/shuttle/abandoned/engine) @@ -1853,7 +1852,7 @@ /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "HJ" = ( -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/effect/decal/cleanable/dirt, /obj/machinery/vending/coffee, /obj/effect/decal/cleanable/dirt, @@ -1986,7 +1985,7 @@ /turf/open/floor/iron/dark, /area/shuttle/abandoned/bar) "RV" = ( -/obj/machinery/light/small/built/directional/south, +/obj/machinery/light/small/empty/directional/south, /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/south, /obj/effect/mapping_helpers/airalarm/all_access, @@ -2019,7 +2018,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/item/bedsheet/brown{ dir = 4 }, diff --git a/_maps/shuttles/whiteship_pubby.dmm b/_maps/shuttles/whiteship_pubby.dmm index 2486da85094b..c351bbdd41b0 100644 --- a/_maps/shuttles/whiteship_pubby.dmm +++ b/_maps/shuttles/whiteship_pubby.dmm @@ -26,7 +26,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/shuttle/abandoned) @@ -207,7 +207,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/structure/table, /obj/effect/spawner/random/food_or_drink/donkpockets{ pixel_y = 5 @@ -303,7 +303,7 @@ /turf/open/floor/iron/dark, /area/shuttle/abandoned) "na" = ( -/obj/machinery/light/small/built/directional/east, +/obj/machinery/light/small/empty/directional/east, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/oil, /obj/structure/cable, @@ -532,7 +532,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /turf/open/floor/iron/dark, /area/shuttle/abandoned) "vB" = ( @@ -850,7 +850,7 @@ "JI" = ( /obj/structure/sign/warning/vacuum/external/directional/west, /obj/machinery/suit_storage_unit/standard_unit, -/obj/machinery/light/small/built/directional/north, +/obj/machinery/light/small/empty/directional/north, /obj/effect/turf_decal/delivery/white, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -991,7 +991,7 @@ /turf/open/floor/iron/dark, /area/shuttle/abandoned) "Pu" = ( -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /obj/effect/turf_decal/siding/purple{ dir = 10 }, @@ -1214,7 +1214,7 @@ pixel_x = -4 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/west, +/obj/machinery/light/small/empty/directional/west, /turf/open/floor/pod/light, /area/shuttle/abandoned) "ZT" = ( diff --git a/_maps/shuttles/whiteship_tram.dmm b/_maps/shuttles/whiteship_tram.dmm index 9e2e244343ed..27391955c3fd 100644 --- a/_maps/shuttles/whiteship_tram.dmm +++ b/_maps/shuttles/whiteship_tram.dmm @@ -207,7 +207,6 @@ /turf/open/floor/pod, /area/shuttle/abandoned/cargo) "aT" = ( -/obj/structure/sign/warning/secure_area, /turf/closed/wall/mineral/titanium/survival/nodiagonal, /area/shuttle/abandoned/cargo) "aU" = ( @@ -226,6 +225,7 @@ "aW" = ( /obj/effect/spawner/random/trash/hobo_squat, /obj/effect/mob_spawn/corpse/human/assistant, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/pod, /area/shuttle/abandoned/cargo) "aX" = ( @@ -802,10 +802,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/shuttle/abandoned/bridge) -"dv" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/abandoned/bridge) "dw" = ( /obj/structure/bed/pod{ dir = 1 @@ -814,6 +810,7 @@ dir = 1 }, /obj/effect/turf_decal/bot_white, +/obj/structure/sign/nanotrasen/directional/west, /turf/open/floor/iron/dark/textured_large, /area/shuttle/abandoned/crew) "dx" = ( @@ -926,9 +923,11 @@ /turf/open/floor/iron/smooth_large, /area/shuttle/abandoned/bridge) "pm" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/abandoned/crew) +/obj/structure/chair/comfy/shuttle, +/obj/effect/turf_decal/bot_white, +/obj/structure/sign/nanotrasen/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/abandoned/bridge) "qd" = ( /obj/machinery/power/shuttle_engine/heater{ dir = 1 @@ -1230,6 +1229,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/crew) +"KQ" = ( +/obj/structure/sign/warning/secure_area/directional/east, +/turf/open/floor/pod, +/area/shuttle/abandoned/cargo) "LM" = ( /obj/structure/cable, /obj/effect/decal/cleanable/blood/tracks{ @@ -1594,7 +1597,7 @@ by cP da dy -dv +dy do ds dy @@ -1623,7 +1626,7 @@ cY cY cY dx -iz +pm dp dt dx @@ -1712,7 +1715,7 @@ de aq dl dq -pm +aq aq aq de @@ -1791,7 +1794,7 @@ cA aS bn cA -cA +KQ cH ez cV diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm index 5dd8929572b4..bb32515c5a1f 100644 --- a/_maps/templates/battlecruiser_starfury.dmm +++ b/_maps/templates/battlecruiser_starfury.dmm @@ -415,8 +415,11 @@ /turf/open/floor/plating, /area/shuttle/sbc_starfury) "by" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/sign/warning/secure_area/directional/east, +/turf/open/floor/iron/dark/smooth_large, /area/shuttle/sbc_starfury) "bB" = ( /obj/effect/turf_decal/tile/red, @@ -474,6 +477,13 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) +"bQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/sign/warning/secure_area/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/shuttle/sbc_starfury) "bR" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/dark_red{ @@ -2663,8 +2673,12 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "ja" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/obj/structure/sign/warning/radiation/directional/east, +/turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "jb" = ( /obj/effect/turf_decal/stripes/line{ @@ -3844,6 +3858,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, +/obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) "rr" = ( @@ -4129,6 +4144,7 @@ dir = 5 }, /obj/machinery/light/directional/east, +/obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/sbc_starfury) "wo" = ( @@ -4774,6 +4790,14 @@ temperature = 80 }, /area/shuttle/sbc_starfury) +"HC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/obj/structure/sign/warning/radiation/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/sbc_starfury) "HF" = ( /obj/machinery/suit_storage_unit/syndicate, /obj/machinery/light/small/directional/west, @@ -4957,7 +4981,6 @@ /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") @@ -5108,6 +5131,13 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) +"Or" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/sign/warning/radiation/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/sbc_starfury) "Ou" = ( /obj/structure/lattice, /turf/template_noop, @@ -5452,6 +5482,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/shuttle/sbc_starfury) +"UG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/sign/warning/radiation/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/sbc_starfury) "UH" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -6626,7 +6663,7 @@ ad ad ad ae -by +ae Sb Yg ae @@ -6694,7 +6731,7 @@ aU bj eJ ev -PF +bQ ay vk ae @@ -6733,12 +6770,12 @@ ay zm iD iQ -iZ +Or kt MR kt kg -kg +ja kt kR lk @@ -6801,11 +6838,11 @@ ae ae ae ae -ja +ae ae wd jv -ja +ae ae kG kU @@ -7345,11 +7382,11 @@ ae xG ae ae -ja +ae ae jN Xg -ja +ae ae xH kU @@ -7374,7 +7411,7 @@ be bt FC eM -NX +by bZ cV ae @@ -7413,11 +7450,11 @@ gO Rv iI kb -jb +UG kH yM Lb -kj +HC kj kH la @@ -7442,7 +7479,7 @@ ad ad ad ae -by +ae po ES ae @@ -7609,12 +7646,12 @@ nD Qw ae ae -by +ae ae ZK hX ae -by +ae ae ae xG diff --git a/_maps/templates/holodeck_fitness.dmm b/_maps/templates/holodeck_fitness.dmm new file mode 100644 index 000000000000..3430be521a4b --- /dev/null +++ b/_maps/templates/holodeck_fitness.dmm @@ -0,0 +1,273 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/obj/structure/weightmachine, +/obj/effect/turf_decal/tile/red/opposingcorners, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"d" = ( +/obj/item/kirbyplants/organic/plant17, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"g" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 2 + }, +/turf/open/floor/holofloor/white, +/area/template_noop) +"j" = ( +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/north, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"k" = ( +/obj/item/clothing/under/color/yellow, +/obj/structure/rack, +/obj/item/clothing/under/color/yellow, +/turf/open/floor/holofloor, +/area/template_noop) +"l" = ( +/obj/structure/punching_bag, +/obj/effect/turf_decal/tile/red/opposingcorners, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"m" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"n" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"p" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"s" = ( +/obj/item/clothing/under/color/blue, +/obj/structure/rack, +/obj/item/clothing/under/color/blue, +/turf/open/floor/holofloor, +/area/template_noop) +"t" = ( +/obj/item/kirbyplants/organic/plant2, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"u" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/holofloor/white, +/area/template_noop) +"v" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/holofloor, +/area/template_noop) +"w" = ( +/obj/item/clothing/under/color/darkgreen, +/obj/structure/rack, +/obj/item/clothing/under/color/darkgreen, +/turf/open/floor/holofloor, +/area/template_noop) +"x" = ( +/obj/item/instrument/piano_synth/headphones{ + pixel_y = 6; + pixel_x = -3 + }, +/obj/structure/table, +/obj/item/instrument/piano_synth/headphones{ + pixel_y = -1; + pixel_x = 3 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"A" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"H" = ( +/obj/structure/curtain, +/obj/machinery/shower/directional/south, +/turf/open/floor/holofloor/white, +/area/template_noop) +"I" = ( +/turf/open/floor/holofloor/dark, +/area/template_noop) +"J" = ( +/obj/item/kirbyplants/organic/plant1, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"K" = ( +/obj/structure/table, +/obj/item/radio/entertainment/speakers/physical, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"N" = ( +/turf/open/floor/holofloor, +/area/template_noop) +"O" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"P" = ( +/obj/item/kirbyplants/organic/plant13, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"R" = ( +/turf/open/floor/holofloor/white, +/area/template_noop) +"S" = ( +/obj/item/clothing/under/color/red, +/obj/structure/rack, +/obj/item/clothing/under/color/red, +/turf/open/floor/holofloor, +/area/template_noop) +"U" = ( +/obj/item/training_toolbox, +/obj/structure/table, +/obj/item/training_toolbox{ + pixel_y = 3; + pixel_x = 2 + }, +/turf/open/floor/holofloor, +/area/template_noop) +"V" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/turf/open/floor/holofloor/dark, +/area/template_noop) +"W" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/holofloor/white, +/area/template_noop) +"Y" = ( +/obj/structure/weightmachine/weightlifter, +/obj/effect/turf_decal/tile/red/opposingcorners, +/turf/open/floor/holofloor/dark, +/area/template_noop) + +(1,1,1) = {" +R +R +O +I +d +P +I +p +N +U +"} +(2,1,1) = {" +R +g +O +Y +V +V +b +p +N +S +"} +(3,1,1) = {" +H +u +j +V +V +V +V +p +N +k +"} +(4,1,1) = {" +R +u +j +Y +V +V +b +p +N +w +"} +(5,1,1) = {" +H +u +j +V +V +V +V +p +N +s +"} +(6,1,1) = {" +R +u +j +Y +V +V +b +p +m +x +"} +(7,1,1) = {" +H +u +j +V +V +V +V +p +v +n +"} +(8,1,1) = {" +R +W +O +l +V +V +l +p +v +n +"} +(9,1,1) = {" +R +R +O +I +J +t +I +p +A +K +"} diff --git a/_maps/templates/lazy_templates/heretic_sacrifice.dmm b/_maps/templates/lazy_templates/heretic_sacrifice.dmm index 7a752a33e738..b938a35278b9 100644 --- a/_maps/templates/lazy_templates/heretic_sacrifice.dmm +++ b/_maps/templates/lazy_templates/heretic_sacrifice.dmm @@ -19,7 +19,7 @@ /turf/open/floor/stone, /area/centcom/heretic_sacrifice/flesh) "cW" = ( -/obj/structure/no_effect_signpost/void, +/obj/structure/signpost/void, /turf/open/misc/asteroid, /area/centcom/heretic_sacrifice/void) "dX" = ( diff --git a/_maps/templates/lazy_templates/ninja_den.dmm b/_maps/templates/lazy_templates/ninja_den.dmm index e357077f8884..30452f41e5cf 100644 --- a/_maps/templates/lazy_templates/ninja_den.dmm +++ b/_maps/templates/lazy_templates/ninja_den.dmm @@ -532,9 +532,9 @@ /area/centcom/central_command_areas/holding) "ni" = ( /obj/structure/rack, -/obj/item/nullrod/claymore/saber/red{ +/obj/item/melee/energy/sword/nullrod/red{ damtype = "stamina"; - force = 30 + active_force = 30 }, /obj/item/nullrod/claymore/katana{ damtype = "stamina"; @@ -898,9 +898,9 @@ /area/centcom/central_command_areas/holding) "vr" = ( /obj/structure/rack, -/obj/item/nullrod/claymore/saber{ +/obj/item/melee/energy/sword/nullrod{ damtype = "stamina"; - force = 30; + active_force = 30; pixel_x = 5; pixel_y = -3 }, diff --git a/_maps/virtual_domains/beach_bar.dmm b/_maps/virtual_domains/beach_bar.dmm index b81ec5224f45..e3e4a09e96b8 100644 --- a/_maps/virtual_domains/beach_bar.dmm +++ b/_maps/virtual_domains/beach_bar.dmm @@ -806,8 +806,9 @@ /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) "Kd" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/mineral/sandstone, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/sign/warning/secure_area/directional/west, +/turf/open/floor/plating, /area/virtual_domain/fullbright) "KH" = ( /obj/structure/mineral_door/wood{ @@ -1609,7 +1610,7 @@ LD LD Fn Fn -Kd +Fn Fn Fn bQ @@ -1652,7 +1653,7 @@ pT LD EC LD -pT +Kd PM wD wD diff --git a/_maps/virtual_domains/fredingtonfastingbear.dmm b/_maps/virtual_domains/fredingtonfastingbear.dmm index 67b3965ba961..e2c7be33fe3d 100644 --- a/_maps/virtual_domains/fredingtonfastingbear.dmm +++ b/_maps/virtual_domains/fredingtonfastingbear.dmm @@ -131,7 +131,7 @@ /obj/effect/decal/cleanable/blood/tracks{ dir = 4 }, -/obj/machinery/light/built/directional/east, +/obj/machinery/light/empty/directional/east, /turf/open/floor/iron/kitchen, /area/virtual_domain) "hq" = ( @@ -187,7 +187,7 @@ /turf/open/floor/iron/kitchen, /area/virtual_domain) "kL" = ( -/obj/machinery/light/built/directional/west, +/obj/machinery/light/empty/directional/west, /obj/item/light/tube/broken, /turf/open/floor/iron/kitchen, /area/virtual_domain) @@ -279,7 +279,7 @@ /turf/open/floor/iron/kitchen, /area/virtual_domain) "pr" = ( -/obj/machinery/light/built/directional/east, +/obj/machinery/light/empty/directional/east, /turf/open/floor/iron/kitchen, /area/virtual_domain) "pK" = ( @@ -481,7 +481,7 @@ /area/virtual_domain) "wM" = ( /obj/item/toy/balloon/heart, -/obj/machinery/light/built/directional/west, +/obj/machinery/light/empty/directional/west, /obj/structure/fake_stairs/wood{ dir = 1 }, @@ -585,7 +585,7 @@ "Ct" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/machinery/light/built/directional/east, +/obj/machinery/light/empty/directional/east, /turf/open/floor/iron/kitchen, /area/virtual_domain) "Dx" = ( @@ -622,7 +622,7 @@ /area/virtual_domain/protected_space/fullbright) "Fy" = ( /obj/effect/decal/cleanable/confetti, -/obj/machinery/light/built/directional/west, +/obj/machinery/light/empty/directional/west, /obj/structure/fake_stairs/wood, /turf/open/floor/iron/kitchen, /area/virtual_domain) @@ -635,7 +635,7 @@ /turf/open/floor/iron/kitchen, /area/virtual_domain) "Gn" = ( -/obj/machinery/light/built/directional/east, +/obj/machinery/light/empty/directional/east, /obj/effect/decal/cleanable/food/tomato_smudge, /obj/effect/landmark/bitrunning/cache_spawn, /turf/open/floor/iron/kitchen/small, @@ -851,13 +851,13 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/item/toy/balloon/heart, -/obj/machinery/light/built/directional/west, +/obj/machinery/light/empty/directional/west, /turf/open/floor/iron/kitchen, /area/virtual_domain) "RB" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/light/built/directional/west, +/obj/machinery/light/empty/directional/west, /obj/effect/decal/cleanable/glass/plastitanium, /turf/open/floor/iron/kitchen, /area/virtual_domain) @@ -874,7 +874,7 @@ "SE" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/light/built/directional/east, +/obj/machinery/light/empty/directional/east, /obj/effect/decal/cleanable/glass/plastitanium, /turf/open/floor/iron/kitchen, /area/virtual_domain) @@ -947,7 +947,7 @@ /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/effect/decal/cleanable/blood/gibs/old, -/obj/machinery/light/built/directional/west, +/obj/machinery/light/empty/directional/west, /turf/open/floor/iron/kitchen, /area/virtual_domain) "VS" = ( diff --git a/_maps/virtual_domains/heretic_hunt.dmm b/_maps/virtual_domains/heretic_hunt.dmm new file mode 100644 index 000000000000..33101a823a79 --- /dev/null +++ b/_maps/virtual_domains/heretic_hunt.dmm @@ -0,0 +1,2373 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"am" = ( +/obj/effect/mapping_helpers/broken_floor, +/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/virtual_domain) +"aR" = ( +/obj/structure/grille/broken, +/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/virtual_domain) +"aY" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/electrical{ + pixel_x = -8; + pixel_y = -2 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"br" = ( +/obj/machinery/light/small/broken/directional/west, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"bC" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"bV" = ( +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/iron, +/area/virtual_domain) +"ck" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/virtual_domain) +"cz" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/closet/secure_closet/contraband/armory, +/obj/effect/spawner/random/exotic/antag_gear_weak, +/obj/effect/spawner/random/exotic/syndie, +/turf/open/floor/iron, +/area/virtual_domain) +"cS" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/mob/living/basic/pet/cat/_proc{ + faction = list("neutral", "vdom_fake_crew") + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"dh" = ( +/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, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"di" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain) +"ey" = ( +/obj/modular_map_root/safehouse{ + key = "maintsafe" + }, +/turf/template_noop, +/area/virtual_domain/safehouse) +"eT" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/virtual_domain) +"eV" = ( +/obj/machinery/stasis{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/turf_decal/siding/blue{ + dir = 6 + }, +/obj/structure/cable, +/turf/open/floor/plastic, +/area/virtual_domain) +"fd" = ( +/obj/structure/frame/computer{ + dir = 1; + anchored = 1 + }, +/obj/effect/turf_decal/tile/dark_red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"fl" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box{ + pixel_y = 10; + pixel_x = 2 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"fn" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/visible_heretic_influence, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"fq" = ( +/obj/machinery/power/rtg, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"fA" = ( +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/shard/titanium, +/obj/item/melee/rune_carver, +/obj/item/melee/rune_carver{ + pixel_y = 4; + pixel_x = -4 + }, +/turf/open/floor/iron, +/area/virtual_domain) +"fL" = ( +/obj/structure/table, +/obj/item/storage/medkit/emergency, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"ge" = ( +/obj/structure/table, +/obj/structure/chem_separator{ + pixel_y = 11 + }, +/obj/item/reagent_containers/applicator/pill/psicodine, +/obj/item/reagent_containers/applicator/pill/stimulant{ + pixel_y = -2; + pixel_x = -3 + }, +/obj/item/reagent_containers/applicator/pill/probital{ + pixel_x = 4; + pixel_y = -2 + }, +/turf/open/floor/plating, +/area/virtual_domain) +"gp" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/iron, +/area/virtual_domain) +"gz" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"hp" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plastic, +/area/virtual_domain) +"hy" = ( +/obj/machinery/light/small/broken/directional/west, +/mob/living/basic/heretic_summon/raw_prophet, +/turf/open/floor/plating, +/area/virtual_domain) +"hK" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/cobweb, +/obj/item/pickaxe/rusted, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"hP" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/cold/directional/north, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/effect/spawner/random/medical/patient_stretcher, +/obj/structure/cable, +/turf/open/floor/plastic, +/area/virtual_domain) +"hS" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/flashlight/flare{ + icon_state = "flare-on"; + light_on = 1 + }, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"hV" = ( +/obj/structure/frame/computer{ + dir = 1; + anchored = 1 + }, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/dark_red/half/contrasted, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"hY" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/dark_red/anticorner/contrasted, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"iu" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain) +"iw" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/sign/warning/electric_shock/directional/north, +/turf/open/floor/iron, +/area/virtual_domain) +"iy" = ( +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/virtual_domain) +"iH" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/plating, +/area/virtual_domain) +"iL" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/glass, +/obj/item/storage/medkit{ + pixel_y = -3 + }, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/virtual_domain) +"iN" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"iQ" = ( +/obj/structure/frame/computer{ + anchored = 1 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"iV" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/multitool{ + pixel_x = 5; + pixel_y = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain) +"jR" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/digital_clock/directional/east, +/turf/open/floor/iron, +/area/virtual_domain) +"ki" = ( +/mob/living/basic/fake_crewman/engi/mod, +/turf/open/floor/iron, +/area/virtual_domain) +"kw" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron, +/area/virtual_domain) +"kQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/structure/electrified_grille, +/turf/open/floor/plating, +/area/virtual_domain) +"lG" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/plastic, +/area/virtual_domain) +"mn" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/reagent_containers/syringe/contraband/bath_salts, +/obj/item/reagent_containers/syringe/contraband/methamphetamine{ + pixel_y = 4; + pixel_x = -3 + }, +/obj/item/reagent_containers/syringe/contraband/morphine{ + pixel_y = -3; + pixel_x = -2 + }, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"mu" = ( +/obj/structure/table/glass, +/obj/item/paper_bin, +/obj/item/folder/red, +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"mW" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain) +"mX" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"nf" = ( +/obj/structure/cable, +/turf/closed/indestructible/reinforced, +/area/virtual_domain) +"nh" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/engineering/flashlight, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"nM" = ( +/obj/effect/visible_heretic_influence, +/turf/open/floor/iron, +/area/virtual_domain) +"nU" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/virtual_domain) +"oa" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/glass, +/obj/item/storage/medkit{ + pixel_y = 10; + pixel_x = 5 + }, +/obj/effect/spawner/random/medical/supplies, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/virtual_domain) +"oc" = ( +/obj/effect/visible_heretic_influence, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"ok" = ( +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/item/storage/belt/unfathomable_curio, +/turf/open/floor/iron, +/area/virtual_domain) +"oD" = ( +/mob/living/basic/fake_crewman/assistant, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/restraints/handcuffs/cable/yellow{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/medical/gauze/improvised{ + pixel_y = -2 + }, +/turf/open/floor/plating, +/area/virtual_domain) +"oL" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"oQ" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/glass, +/obj/item/storage/medkit/regular{ + pixel_y = 7 + }, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/virtual_domain) +"pd" = ( +/obj/structure/girder, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/virtual_domain) +"pe" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"pm" = ( +/obj/effect/spawner/random/clothing/costume, +/obj/structure/rack, +/turf/open/floor/plating, +/area/virtual_domain) +"pv" = ( +/obj/machinery/door/airlock/command/glass, +/turf/open/floor/iron, +/area/virtual_domain) +"pM" = ( +/mob/living/basic/fake_crewman/assistant/alt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/virtual_domain) +"pQ" = ( +/obj/effect/spawner/random/engineering/canister, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/virtual_domain) +"rq" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/suit_storage_unit, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain) +"rt" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/reagent_containers/syringe/epinephrine, +/obj/item/reagent_containers/syringe/epinephrine{ + pixel_x = -5; + pixel_y = -5 + }, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"rC" = ( +/turf/closed/wall/heretic_rust, +/area/virtual_domain) +"rP" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/plasma, +/turf/open/floor/plating, +/area/virtual_domain) +"sb" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"sd" = ( +/obj/item/storage/test_tube_rack, +/obj/structure/table, +/turf/open/floor/plating, +/area/virtual_domain) +"sl" = ( +/obj/structure/steam_vent, +/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/virtual_domain) +"sy" = ( +/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, +/turf/open/floor/plating, +/area/virtual_domain) +"sL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/virtual_domain) +"sT" = ( +/obj/structure/cable, +/turf/open/floor/plastic, +/area/virtual_domain) +"sY" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"ta" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/virtual_domain) +"tg" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/trash/mopbucket, +/turf/open/floor/plating, +/area/virtual_domain) +"ts" = ( +/obj/effect/spawner/random/bureaucracy/briefcase, +/obj/effect/spawner/random/trash/box, +/turf/open/floor/plating, +/area/virtual_domain) +"uh" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"uj" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plastic, +/area/virtual_domain) +"uz" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"uS" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/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/virtual_domain) +"vh" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plastic, +/area/virtual_domain) +"vn" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/virtual_domain) +"vt" = ( +/obj/machinery/medical_kiosk, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plastic, +/area/virtual_domain) +"vG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/virtual_domain) +"vO" = ( +/obj/machinery/defibrillator_mount/directional/west, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/item/stack/medical/gauze/improvised, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/virtual_domain) +"vP" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"vR" = ( +/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/virtual_domain) +"wK" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"wM" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/wall_healer/free/directional/west, +/turf/open/floor/plastic, +/area/virtual_domain) +"wQ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/item/flashlight/flare{ + icon_state = "flare-on"; + light_on = 1 + }, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"xa" = ( +/obj/machinery/stasis{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/turf_decal/siding/blue{ + dir = 5 + }, +/obj/structure/cable, +/turf/open/floor/plastic, +/area/virtual_domain) +"xg" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"xz" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"xA" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/turf/open/floor/plastic, +/area/virtual_domain) +"xC" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"xK" = ( +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"xQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/vending/cigarette, +/turf/open/floor/iron, +/area/virtual_domain) +"yR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"yW" = ( +/obj/machinery/door/airlock/command/glass, +/turf/open/floor/plastic, +/area/virtual_domain) +"zd" = ( +/obj/effect/spawner/random/engineering/atmospherics_portable, +/turf/open/floor/plating, +/area/virtual_domain) +"zp" = ( +/obj/structure/table, +/obj/item/restraints/handcuffs, +/obj/item/restraints/handcuffs{ + pixel_x = -6; + pixel_y = 3 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"zN" = ( +/mob/living/basic/fake_crewman/boss/ce, +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"AA" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"AE" = ( +/obj/structure/closet/emcloset, +/obj/item/storage/medkit/emergency, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"AO" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/item/melee/baton/security/loaded, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"AV" = ( +/turf/open/floor/iron, +/area/virtual_domain) +"Bz" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"BW" = ( +/obj/effect/decal/cleanable/ash/large, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"Cu" = ( +/obj/structure/frame/computer{ + pixel_y = 0; + dir = 4; + anchored = 1 + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"CT" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/virtual_domain) +"Dh" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/dark_red/anticorner/contrasted{ + dir = 1 + }, +/obj/item/storage/belt/security/webbing{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/pen/fountain{ + pixel_x = 15; + pixel_y = 2 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"DC" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/dark_red/half/contrasted, +/obj/item/ammo_box/speedloader/c38/flare, +/obj/item/ammo_box/speedloader/c38, +/obj/item/gun/ballistic/revolver/c38, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"El" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plastic, +/area/virtual_domain) +"EB" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/virtual_domain) +"EI" = ( +/obj/structure/table/glass, +/obj/item/storage/medkit/fire{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron, +/area/virtual_domain) +"EL" = ( +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"EV" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"Fj" = ( +/turf/open/floor/iron/dark, +/area/virtual_domain) +"Fl" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain) +"Fv" = ( +/obj/effect/spawner/random/engineering/tank, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/reagent_containers/cup/beaker/eldritch, +/turf/open/floor/plating, +/area/virtual_domain) +"FH" = ( +/obj/machinery/defibrillator_mount/directional/west, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/mesh{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/machinery/light/cold/directional/north, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/virtual_domain) +"FR" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/iv_drip, +/turf/open/floor/plastic, +/area/virtual_domain) +"Gj" = ( +/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/heretic_rust, +/area/virtual_domain) +"Gt" = ( +/obj/structure/table/glass, +/obj/item/folder/yellow, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"Gv" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron, +/area/virtual_domain) +"GO" = ( +/obj/structure/frame/computer{ + pixel_y = 0; + dir = 4; + anchored = 1 + }, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"GQ" = ( +/obj/effect/spawner/random/trash/bin, +/obj/item/shard/plasma, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/spawner/random/trash/cigpack, +/turf/open/floor/plating, +/area/virtual_domain) +"GZ" = ( +/obj/effect/turf_decal/tile/dark_red/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"Ho" = ( +/obj/structure/sign/warning/electric_shock/directional/east, +/turf/open/floor/plating, +/area/virtual_domain) +"Hy" = ( +/obj/machinery/door/airlock/medical, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plastic, +/area/virtual_domain) +"If" = ( +/mob/living/basic/fake_crewman/boss/cmo, +/obj/structure/chair/office/light{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"Ih" = ( +/obj/structure/closet/firecloset, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"Iu" = ( +/mob/living/basic/fake_crewman/boss/hos, +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"IH" = ( +/obj/item/flashlight/flare/candle/infinite{ + icon_state = "candle2_lit"; + pixel_x = -3; + pixel_y = 4 + }, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"IJ" = ( +/obj/machinery/light/cold/directional/south, +/turf/open/floor/plastic, +/area/virtual_domain) +"IS" = ( +/mob/living/basic/fake_crewman/engi, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"IX" = ( +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/obj/item/clothing/mask/gas, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"Jj" = ( +/obj/effect/heretic_rune/big, +/obj/effect/landmark/bitrunning/loot_signal, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"Jo" = ( +/obj/structure/table/glass, +/obj/item/paper_bin, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"Jp" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/clothing/gloves, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"Jt" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/iron, +/area/virtual_domain) +"JA" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/turf_decal/siding/blue/end, +/obj/item/healthanalyzer, +/turf/open/floor/plastic, +/area/virtual_domain) +"JD" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/closet/secure_closet/contraband/armory, +/obj/item/gun/ballistic/rifle/lionhunter, +/obj/item/ammo_box/speedloader/strilka310/lionhunter, +/turf/open/floor/iron, +/area/virtual_domain) +"JG" = ( +/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/virtual_domain) +"JP" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/clothing/gloves, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"Kd" = ( +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/item/eldritch_potion/wounded, +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/obj/item/eldritch_potion/wounded, +/obj/item/eldritch_potion/wounded, +/turf/open/floor/plastic, +/area/virtual_domain) +"Km" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron, +/area/virtual_domain) +"KR" = ( +/turf/open/floor/plastic, +/area/virtual_domain) +"KS" = ( +/obj/structure/reagent_dispensers, +/turf/open/floor/plating, +/area/virtual_domain) +"KT" = ( +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"La" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/obj/structure/girder, +/obj/structure/grille, +/turf/open/floor/plating, +/area/virtual_domain) +"Lc" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"Lj" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/structure/cable, +/turf/open/floor/plating, +/area/virtual_domain) +"Lp" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/iv_drip, +/turf/open/floor/plastic, +/area/virtual_domain) +"LB" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/obj/structure/barricade/wooden, +/obj/structure/cable, +/turf/open/floor/plating, +/area/virtual_domain) +"LZ" = ( +/obj/effect/visible_heretic_influence, +/turf/open/floor/plastic, +/area/virtual_domain) +"Mg" = ( +/obj/effect/turf_decal/tile/dark_red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"MF" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/virtual_domain) +"MN" = ( +/obj/item/flashlight/flare/candle/infinite{ + icon_state = "candle2_lit"; + pixel_x = 2; + pixel_y = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/virtual_domain) +"Ni" = ( +/obj/item/flashlight/flare/candle/infinite{ + icon_state = "candle2_lit"; + pixel_x = 10; + pixel_y = 14 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/virtual_domain) +"Nm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/sign/warning/electric_shock/directional/north, +/turf/open/floor/iron, +/area/virtual_domain) +"Np" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/virtual_domain) +"Nz" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/virtual_domain) +"NE" = ( +/obj/effect/mapping_helpers/broken_floor, +/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/heretic_rust, +/area/virtual_domain) +"NN" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/glass, +/obj/item/stack/medical/gauze{ + pixel_y = 4 + }, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/turf/open/floor/plastic, +/area/virtual_domain) +"NO" = ( +/mob/living/basic/fake_crewman/md, +/turf/open/floor/plastic, +/area/virtual_domain) +"Ot" = ( +/obj/machinery/light/small/broken/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/plating/heretic_rust, +/area/virtual_domain) +"OX" = ( +/obj/structure/frame/computer{ + anchored = 1 + }, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"Po" = ( +/turf/closed/indestructible/fakedoor/engineering, +/area/virtual_domain) +"Pr" = ( +/turf/closed/indestructible/binary, +/area/virtual_domain) +"PB" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/turf_decal/siding/blue/end{ + dir = 1 + }, +/obj/item/stack/medical/gauze/improvised, +/obj/structure/cable, +/turf/open/floor/plastic, +/area/virtual_domain) +"PJ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/broken_floor, +/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/heretic_rust, +/area/virtual_domain) +"Qj" = ( +/obj/structure/girder, +/obj/structure/grille, +/turf/open/floor/plating, +/area/virtual_domain) +"Qk" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"QP" = ( +/obj/item/flashlight/flare/torch, +/obj/item/flashlight/flare/torch, +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust, +/obj/item/melee/sickly_blade, +/obj/structure/rack, +/turf/template_noop, +/area/virtual_domain/safehouse) +"Rd" = ( +/obj/item/flashlight/flare{ + icon_state = "flare-on"; + light_on = 1 + }, +/turf/open/floor/plating, +/area/virtual_domain) +"Rg" = ( +/obj/item/flashlight/flare/candle/infinite{ + icon_state = "candle2_lit"; + pixel_x = 4; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/ash, +/turf/open/floor/plating, +/area/virtual_domain) +"Rl" = ( +/obj/structure/table/glass, +/obj/item/folder/blue{ + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"Ro" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/turf/open/floor/plastic, +/area/virtual_domain) +"Rx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/virtual_domain) +"RO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/trash/mess, +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/plating, +/area/virtual_domain) +"RQ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable, +/turf/open/floor/plastic, +/area/virtual_domain) +"RY" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"RZ" = ( +/obj/structure/closet/firecloset, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/virtual_domain) +"Sb" = ( +/mob/living/basic/fake_crewman/md, +/obj/structure/cable, +/turf/open/floor/plastic, +/area/virtual_domain) +"Sf" = ( +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/virtual_domain) +"Sn" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"Ss" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable, +/turf/open/floor/plating, +/area/virtual_domain) +"SJ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/sign/warning/electric_shock/directional/west, +/turf/open/floor/iron, +/area/virtual_domain) +"Tv" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"Ua" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron, +/area/virtual_domain) +"Ul" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/virtual_domain) +"Va" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/virtual_domain) +"Vh" = ( +/turf/open/floor/plating, +/area/virtual_domain) +"Vj" = ( +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/virtual_domain) +"Vr" = ( +/turf/closed/indestructible/fakedoor/glass_airlock, +/area/virtual_domain) +"Vs" = ( +/obj/machinery/light/small/broken/directional/east, +/mob/living/basic/heretic_summon/raw_prophet, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"Vx" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/item/reagent_containers/hypospray{ + pixel_x = 6; + pixel_y = 1 + }, +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/turf/open/floor/plastic, +/area/virtual_domain) +"VS" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/red/dim/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/plating/heretic_rust, +/area/virtual_domain) +"VW" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/structure/tank_dispenser, +/obj/structure/fireaxecabinet/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/virtual_domain) +"VX" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/bottle/salglu_solution, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/turf/open/floor/plastic, +/area/virtual_domain) +"Wk" = ( +/obj/effect/turf_decal/tile/red, +/turf/open/floor/iron, +/area/virtual_domain) +"Wo" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/closet/crate/bin, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plastic, +/area/virtual_domain) +"Wv" = ( +/obj/effect/spawner/random/trash/caution_sign, +/obj/structure/grille/broken, +/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/heretic_rust, +/area/virtual_domain) +"WI" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/virtual_domain) +"WL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/closet/secure_closet/contraband/armory, +/obj/effect/spawner/random/clothing/backpack, +/obj/effect/spawner/random/exotic/antag_gear, +/turf/open/floor/iron, +/area/virtual_domain) +"Xl" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plastic, +/area/virtual_domain) +"Xv" = ( +/obj/structure/table/glass, +/obj/item/paper_bin, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"XD" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/plastic, +/turf/open/floor/plating/heretic_rust, +/area/virtual_domain) +"XK" = ( +/obj/effect/spawner/random/structure/tank_holder, +/turf/open/floor/plating, +/area/virtual_domain) +"Yj" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/virtual_domain) +"Yy" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/glass, +/obj/item/storage/medkit/brute{ + pixel_y = -8 + }, +/obj/item/reagent_containers/cup/bottle/salglu_solution{ + pixel_y = 11; + pixel_x = -3 + }, +/obj/item/reagent_containers/cup/bottle{ + pixel_y = 13; + pixel_x = 3 + }, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/turf/open/floor/plastic, +/area/virtual_domain) +"YL" = ( +/mob/living/basic/fake_crewman/sec, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"Zb" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/bowl, +/obj/item/reagent_containers/cup/blastoff_ampoule{ + pixel_x = -3 + }, +/turf/open/floor/plating, +/area/virtual_domain) +"Zj" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain) +"Zt" = ( +/turf/closed/indestructible/reinforced, +/area/virtual_domain) +"Zu" = ( +/turf/closed/wall, +/area/virtual_domain) +"ZM" = ( +/obj/effect/spawner/random/trash/moisture_trap, +/turf/open/floor/plating, +/area/virtual_domain) +"ZN" = ( +/turf/closed/indestructible/fakedoor, +/area/virtual_domain) +"ZT" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/item/reagent_containers/cup/bottle/atropine{ + pixel_y = 3; + pixel_x = -13 + }, +/obj/item/reagent_containers/applicator/patch/synthflesh, +/obj/item/reagent_containers/applicator/patch/synthflesh{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/turf/open/floor/plastic, +/area/virtual_domain) + +(1,1,1) = {" +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +eT +"} +(2,1,1) = {" +Pr +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Pr +"} +(3,1,1) = {" +Pr +Zt +Zt +Zt +Lj +Vr +Vr +Lj +Zu +Zu +rC +rC +rC +Zu +Zt +Zt +Zt +Zt +Zt +Zu +Zu +Zu +Zu +Zu +Zu +Zu +Zu +Zt +Zt +Zt +Pr +"} +(4,1,1) = {" +Pr +Zt +Zt +Zt +vP +yR +yR +Bz +Zu +pQ +BW +nU +GQ +Zu +Zu +rC +rC +Zu +rC +Zu +iN +iN +iN +iN +iN +ey +Zu +Zt +Zt +Zt +Pr +"} +(5,1,1) = {" +Pr +Zt +Zt +Zt +iw +ki +sb +Gv +Zu +pm +wK +KT +tg +rC +hK +hy +nU +br +Vh +Zu +iN +iN +QP +iN +iN +iN +Zu +Zt +Zt +Zt +Pr +"} +(6,1,1) = {" +Pr +Zt +sb +Lj +Va +Vj +fl +Km +Zu +Zu +La +rC +rC +Zu +EB +IH +KT +MN +vn +Qj +iN +iN +QP +iN +iN +iN +Zu +Zt +Zt +Zt +Pr +"} +(7,1,1) = {" +Pr +Zt +sb +Po +sb +aY +Qk +vR +uS +sl +am +dh +Wv +uS +NE +bC +Jj +MF +Sn +Vh +iN +iN +QP +iN +iN +iN +Zu +Zt +Zt +Zt +Pr +"} +(8,1,1) = {" +Pr +Zt +sb +Lj +AA +Vj +uh +iy +Zu +Zu +Zu +LB +Zu +rC +sy +Ni +xC +Rg +Vh +pd +iN +iN +iN +iN +iN +iN +Zu +Zt +Zt +Zt +Pr +"} +(9,1,1) = {" +Pr +Zt +nf +Zt +Nm +AV +IS +iy +rq +Zu +Sf +Ss +Zb +rC +JG +Ot +sy +Vs +Vh +rC +iN +iN +iN +iN +iN +iN +Zu +Zt +Zt +Zt +Pr +"} +(10,1,1) = {" +Pr +Zt +fq +Zt +Np +nM +sb +iy +VW +Zu +JP +wQ +Zu +Zu +rC +Zu +uS +WI +rC +Zu +iN +iN +iN +iN +iN +xz +Zu +Zt +Zt +Zt +Pr +"} +(11,1,1) = {" +Pr +Zt +Zt +Zt +gp +Ih +sb +oL +rq +Zu +ge +Vh +rC +rt +oD +Zu +JG +MF +KS +Zu +Zu +Zu +Zu +Zu +Zu +Zu +Zu +Zt +Zt +Zt +Pr +"} +(12,1,1) = {" +Pr +Zt +Zt +Zt +Zu +vG +pv +vG +Zu +Zu +sd +nh +Yj +XD +mn +rC +NE +RO +IX +Zu +GO +Cu +Tv +Zu +Zu +Zu +Zt +Zt +Zt +Zt +Pr +"} +(13,1,1) = {" +Pr +Zt +Zt +Zt +Zu +mW +iu +Km +iV +Zu +pM +KT +Zu +rC +Zu +Zu +JG +hS +Jp +Zu +pe +If +cS +wM +Kd +Zu +Zt +Zt +Zt +Zt +Pr +"} +(14,1,1) = {" +Pr +Zt +Zt +Zu +Zu +Gt +Jo +AV +EI +Zu +ts +EB +Yj +wK +rP +Zu +Gj +KT +iH +Zu +RY +Xv +Rl +hp +Vx +Zu +Zt +Zt +Zt +Zt +Pr +"} +(15,1,1) = {" +Pr +Zt +Zt +Zu +iQ +Fj +zN +AV +fA +Zu +Zu +Zu +Zu +Nz +Fv +rC +dh +fn +ZM +Zu +Rx +Ro +Ro +hp +ZT +Zu +Zt +Zt +Zt +Zt +Pr +"} +(16,1,1) = {" +Pr +Zt +Zt +Zu +OX +Zj +sY +bV +Zu +Zu +ok +Ua +Zu +Zu +Zu +rC +sy +Ho +zd +Zu +Rx +KR +KR +hp +xA +Zu +Zt +Zt +Zt +Zt +Pr +"} +(17,1,1) = {" +Pr +Zt +Zt +Zu +Zu +Zu +Zu +Zu +Zu +Zu +Fl +Dh +EL +fd +Zu +rC +kQ +rC +Zu +Zu +vG +yW +vG +Zu +Zu +Zu +Zu +Zu +Zu +Zt +Pr +"} +(18,1,1) = {" +Pr +Zt +Zt +Zu +Jt +JD +cz +WL +xg +vG +di +mu +Iu +hV +Zu +AE +JG +Zu +Zu +FH +eV +sT +xa +vO +Zu +iL +oa +oQ +Zu +Zt +Pr +"} +(19,1,1) = {" +Pr +Zt +Zt +Zu +AV +YL +Lc +Lc +xg +pv +AV +xK +Fj +DC +Zu +RZ +dh +Zu +FR +vh +vh +Xl +vh +vh +Zu +vh +vh +vh +Zu +Zt +Pr +"} +(20,1,1) = {" +Pr +Zt +Zt +Zu +AV +mX +AO +uz +xg +vG +kw +GZ +Mg +hY +Zu +Zu +aR +Zu +KR +KR +NO +sT +KR +KR +Hy +KR +LZ +KR +Zu +Zt +Pr +"} +(21,1,1) = {" +Pr +Zt +Zt +Zu +ta +mX +fL +uz +gz +Zu +Zu +vG +Zu +Zu +Zu +Zu +dh +uS +uj +uj +PB +vt +JA +KR +Ul +KR +KR +IJ +Zu +Zt +Pr +"} +(22,1,1) = {" +Pr +Zt +Zt +Zu +AV +mX +zp +uz +xg +sL +SJ +xg +xQ +Zu +ck +Vh +NE +Zu +KR +KR +KR +Sb +KR +KR +Hy +KR +KR +KR +Zu +Zt +Pr +"} +(23,1,1) = {" +Pr +Zt +Zt +Zu +AV +Lc +Lc +YL +sb +sb +sb +oc +vR +uS +JG +PJ +VS +Zu +Lp +hp +hp +RQ +hp +hp +Zu +hp +hp +lG +Zu +Zt +Pr +"} +(24,1,1) = {" +Pr +Zt +Zt +Zu +Wk +jR +CT +Wk +EV +Wk +EV +Wk +EV +Zu +rC +Rd +XK +Zu +Zu +hP +El +El +El +Wo +Zu +VX +Yy +NN +Zu +Zt +Pr +"} +(25,1,1) = {" +Pr +Zt +Zt +Zu +Zu +Zu +Zu +Zu +Lj +ZN +Lj +ZN +Lj +Zu +Zu +rC +rC +Zu +Zu +Lj +ZN +Lj +ZN +Lj +Zu +Zu +Zu +Zu +Zu +Zt +Pr +"} +(26,1,1) = {" +Pr +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Zt +Pr +"} +(27,1,1) = {" +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +Pr +"} diff --git a/_maps/virtual_domains/island_brawl.dmm b/_maps/virtual_domains/island_brawl.dmm index afb11be05edd..07003db1aa57 100644 --- a/_maps/virtual_domains/island_brawl.dmm +++ b/_maps/virtual_domains/island_brawl.dmm @@ -2551,7 +2551,7 @@ /turf/open/floor/wood, /area/virtual_domain) "Gp" = ( -/obj/structure/no_effect_signpost{ +/obj/structure/signpost{ pixel_y = 6; desc = "Northwest: Hotel. South: Seaside Bar. East: Dressing Rooms." }, diff --git a/_maps/virtual_domains/meta_central.dmm b/_maps/virtual_domains/meta_central.dmm index 83bf0966d156..e7f6e003b354 100644 --- a/_maps/virtual_domains/meta_central.dmm +++ b/_maps/virtual_domains/meta_central.dmm @@ -677,6 +677,7 @@ dir = 1 }, /obj/machinery/light/directional/north, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/iron, /area/virtual_domain) "fz" = ( @@ -2377,6 +2378,7 @@ dir = 8 }, /obj/item/trash/can/food/pine_nuts, +/obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/iron, /area/virtual_domain) "tM" = ( @@ -3779,8 +3781,11 @@ /turf/open/floor/iron, /area/virtual_domain) "FF" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall/r_wall, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/floor/iron, /area/virtual_domain) "FG" = ( /obj/effect/turf_decal/trimline/green/filled/corner, @@ -3859,6 +3864,7 @@ /obj/structure/fluff/paper/stack{ dir = 6 }, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/iron, /area/virtual_domain) "Gk" = ( @@ -3928,6 +3934,7 @@ /obj/structure/closet/crate/cardboard/mothic{ pixel_y = 8 }, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/iron, /area/virtual_domain) "GQ" = ( @@ -5165,6 +5172,7 @@ dir = 8 }, /obj/item/trash/energybar, +/obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/iron, /area/virtual_domain) "RB" = ( @@ -5173,6 +5181,7 @@ }, /obj/structure/holosign/barrier, /obj/structure/marker_beacon/burgundy, +/obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/iron, /area/virtual_domain) "RD" = ( @@ -5659,7 +5668,7 @@ /obj/machinery/door/airlock{ name = "Central Emergency Storage" }, -/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/unres/delayed, /turf/open/floor/plating, /area/virtual_domain) "VP" = ( @@ -6683,7 +6692,7 @@ dX XK tq tI -FF +uS mq oA wj @@ -7019,7 +7028,7 @@ JP ul tq Rz -FF +uS iI MM Vr @@ -7171,7 +7180,7 @@ Yo pH pK ep -FF +uS GJ FR Hd @@ -7208,8 +7217,8 @@ ps Nl YG iH +uS FF -dd FK Of qu @@ -7496,7 +7505,7 @@ ps Ht rJ VG -FF +uS RB qL jd @@ -7555,7 +7564,7 @@ oH Mj gE xI -FF +uS Gi Hd aC @@ -8083,7 +8092,7 @@ uS uS oo uS -FF +uS fr DV MN diff --git a/_maps/virtual_domains/syndicate_assault.dmm b/_maps/virtual_domains/syndicate_assault.dmm index e1258edf0418..e20438e1c412 100644 --- a/_maps/virtual_domains/syndicate_assault.dmm +++ b/_maps/virtual_domains/syndicate_assault.dmm @@ -115,6 +115,7 @@ /obj/structure/table/reinforced, /obj/item/gun/ballistic/automatic/l6_saw/unrestricted, /obj/item/ammo_box/magazine/m7mm, +/obj/structure/sign/departments/cargo/directional/north, /turf/open/floor/mineral/plastitanium, /area/virtual_domain/protected_space) "da" = ( @@ -122,8 +123,8 @@ /turf/open/floor/plastic, /area/virtual_domain) "dd" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall/r_wall/plastitanium/syndicate, +/obj/structure/sign/warning/vacuum/external/directional/north, +/turf/open/floor/mineral/plastitanium, /area/virtual_domain) "di" = ( /obj/machinery/power/terminal{ @@ -222,10 +223,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/mineral/plastitanium/red, /area/virtual_domain) -"iL" = ( -/obj/structure/sign/departments/cargo, -/turf/closed/wall/r_wall/plastitanium/syndicate, -/area/virtual_domain/protected_space) "iU" = ( /obj/structure/closet/crate/secure/gear{ req_access = list("syndicate") @@ -318,7 +315,6 @@ /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; @@ -1006,6 +1002,10 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/virtual_domain) +"PQ" = ( +/obj/structure/sign/warning/vacuum/external/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/virtual_domain) "PR" = ( /obj/machinery/door/password/voice/sfc{ password = null @@ -2971,17 +2971,17 @@ qx ru uP uP +ru dd uP uP -uP Ox aw uP uP uP -uP -dd +PQ +ru uP Qg ru @@ -2992,7 +2992,7 @@ qx qx qx qx -iL +zN cZ dp dp diff --git a/_maps/virtual_domains/xeno_nest.dmm b/_maps/virtual_domains/xeno_nest.dmm index 895ba5e84c37..0e6cf4a740f1 100644 --- a/_maps/virtual_domains/xeno_nest.dmm +++ b/_maps/virtual_domains/xeno_nest.dmm @@ -141,7 +141,7 @@ /area/virtual_domain/fullbright) "F" = ( /obj/structure/table/greyscale, -/obj/item/gun/energy/xray, +/obj/item/gun/energy/laser/xray, /obj/item/gun/energy/laser{ pixel_x = 4; pixel_y = -6 diff --git a/_maps/westfieldmall.json b/_maps/westfieldmall.json new file mode 100644 index 000000000000..c6c0f430b34a --- /dev/null +++ b/_maps/westfieldmall.json @@ -0,0 +1,90 @@ +{ + "version": 1, + "map_name": "Westfield Mall", + "map_path": "map_files/Vampire", + "map_file": "westfield_mall.dmm", + "space_ruin_levels": 0, + "space_empty_levels": 0, + "planetary": 1, + "ignored_unit_tests": [ + "/datum/unit_test/cargo_dep_order_locations", + "/datum/unit_test/maptest_job_roundstart_spawnpoints", + "/datum/unit_test/spy_bounty", + "/datum/unit_test/space_dragon_expiration", + "/datum/unit_test/maptest_mapload_space_verification" + ], + "traits": [ + { + "Up": 1, + "Baseturf": "/turf/open/misc/dirt/vamp" + }, + { + "Up": 1, + "Down": -1, + "Baseturf": "/turf/open/misc/dirt/vamp" + }, + { + "Up": 1, + "Down": -1, + "Baseturf": "/turf/open/openspace" + }, + { + "Down": -1, + "Baseturf": "/turf/open/openspace" + }, + { + "Baseturf": "/turf/open/openspace" + } + ], + "job_changes": { + "Graveyard Keeper": { + "spawn_positions": 0, + "total_positions": 0 + }, + "Street Janitor": { + "spawn_positions": 4, + "total_positions": 4 + }, + "Taxi Driver": { + "spawn_positions": 0, + "total_positions": 0 + }, + "Sweeper": { + "spawn_positions": 2, + "total_positions": 2 + }, + "Brusier": { + "spawn_positions": 4, + "total_positions": 4 + }, + "Tapster": { + "spawn_positions": 0, + "total_positions": 0 + }, + "Priest": { + "spawn_positions": 0, + "total_positions": 0 + }, + "Doctor": { + "spawn_positions": 3, + "total_positions": 3 + }, + "La Squadra": { + "spawn_positions": 5, + "total_positions": 5 + }, + "La Famiglia": { + "spawn_positions": 5, + "total_positions": 5 + }, + "Club Worker": { + "spawn_positions": 0, + "total_positions": 0 + }, + "Emergency Dispatcher": { + "spawn_positions": 1, + "total_positions": 1 + } + }, + "max_npcs": 60 +} diff --git a/biome.json b/biome.json index 8f792f2b57b0..1e09e2cc171d 100644 --- a/biome.json +++ b/biome.json @@ -20,7 +20,8 @@ "!**/node_modules", "!tgui/public", "tgui/public/tgui.html", - "!tgui/packages/tgui-setup/helpers.js" + "!tgui/packages/tgui-setup/helpers.js", + "!**/bun.lock" ] }, "formatter": { diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 7a32eef0659c..417aad431b54 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -57,7 +57,7 @@ #define FEATURE_MUTANT_COLOR "mcolor" #define FEATURE_ETHEREAL_COLOR "ethcolor" #define FEATURE_EARS "ears" -#define FEATURE_TAIL "tail_cat" +#define FEATURE_TAIL_CAT "tail_cat" #define FEATURE_TAIL_LIZARD "tail_lizard" #define FEATURE_TAIL_FISH "fish_tail" #define FEATURE_SNOUT "snout" @@ -73,6 +73,7 @@ // Other #define FEATURE_WINGS "wings" +#define FEATURE_WINGS_OPEN "wingsopen" #define FEATURE_TAIL_MONKEY "tail_monkey" #define FEATURE_TAIL_XENO "tail_xeno" #define FEATURE_TAILSPINES "tailspines" // Different from regular spines, these appear on tails @@ -84,14 +85,22 @@ #define COPY_DNA_SPECIES (1<<1) ///flag for the transfer_flag argument from dna/proc/copy_dna(). This one copies the mutations. #define COPY_DNA_MUTATIONS (1<<2) +// DARKPACK EDIT ADD START - Obfuscate Discipline, flag for the transfer_flag argument +//flag for the transfer_flag argument from dna/proc/copy_dna(). This one copies the blood type +#define COPY_DNA_BLOOD_TYPE (1<<4) +// DARKPACK EDIT ADD END //organ slots #define ORGAN_SLOT_ADAMANTINE_RESONATOR "adamantine_resonator" #define ORGAN_SLOT_APPENDIX "appendix" #define ORGAN_SLOT_BRAIN "brain" -#define ORGAN_SLOT_BRAIN_CEREBELLUM "brain_antidrop" -#define ORGAN_SLOT_BRAIN_CNS "brain_antistun" +/// Brain implants that affect the mob's motor control (grabbing, moving, attacking) +#define ORGAN_SLOT_BRAIN_CEREBELLUM "brain_motorcontrol" +/// Brain implants that affect the mob's sensory systems (pain, vision, hearing, etc) +#define ORGAN_SLOT_BRAIN_CNS "brain_cns" +/// Brain implants that affect the mob's memory and cognition (skills, knowledge, etc) +#define ORGAN_SLOT_BRAIN_HIPPOCAMPUS "brain_memory" #define ORGAN_SLOT_BREATHING_TUBE "breathing_tube" #define ORGAN_SLOT_EARS "ears" #define ORGAN_SLOT_EYES "eye_sight" diff --git a/code/__DEFINES/__globals.dm b/code/__DEFINES/__globals.dm index 3639d5592553..9f3ea839e76e 100644 --- a/code/__DEFINES/__globals.dm +++ b/code/__DEFINES/__globals.dm @@ -49,6 +49,12 @@ /// Create a typed list global that is initialized as an empty list #define GLOBAL_LIST_EMPTY_TYPED(X, Typepath) GLOBAL_LIST_INIT_TYPED(X, Typepath, list()) +/// Create an alist global with an initializer expression +#define GLOBAL_ALIST_INIT(X, InitValue) GLOBAL_RAW(/alist/##X); GLOBAL_MANAGED(X, InitValue) + +// Create an alist global that is initialized as an empty list +#define GLOBAL_ALIST_EMPTY(X) GLOBAL_ALIST_INIT(X, alist()) + /// Create a typed global with an initializer expression #define GLOBAL_DATUM_INIT(X, Typepath, InitValue) GLOBAL_RAW(Typepath/##X); GLOBAL_MANAGED(X, InitValue) diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index 04929f16f244..53b1514ed6af 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -37,29 +37,27 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define ALLOW_DARK_PAINTS_1 (1<<8) /// Should this object be unpaintable? #define UNPAINTABLE_1 (1<<9) -/// Is this atom on top of another atom, and as such has click priority? -#define IS_ONTOP_1 (1<<10) /// Is this atom immune to being dusted by the supermatter? -#define SUPERMATTER_IGNORES_1 (1<<11) +#define SUPERMATTER_IGNORES_1 (1<<10) /// If a turf can be made dirty at roundstart. This is also used in areas. -#define CAN_BE_DIRTY_1 (1<<12) +#define CAN_BE_DIRTY_1 (1<<11) /// Should we use the initial icon for display? Mostly used by overlay only objects -#define HTML_USE_INITAL_ICON_1 (1<<13) +#define HTML_USE_INITAL_ICON_1 (1<<12) /// Can players recolor this in-game via vendors (and maybe more if support is added)? -#define IS_PLAYER_COLORABLE_1 (1<<14) +#define IS_PLAYER_COLORABLE_1 (1<<13) /// Whether or not this atom has contextual screentips when hovered OVER -#define HAS_CONTEXTUAL_SCREENTIPS_1 (1<<15) +#define HAS_CONTEXTUAL_SCREENTIPS_1 (1<<14) /// Whether or not this atom is storing contents for a disassociated storage object -#define HAS_DISASSOCIATED_STORAGE_1 (1<<16) +#define HAS_DISASSOCIATED_STORAGE_1 (1<<15) /// If this atom has experienced a decal element "init finished" sourced appearance update /// We use this to ensure stacked decals don't double up appearance updates for no reason /// Flag as an optimization, don't make this a trait without profiling /// Yes I know this is a stupid flag, no you can't take him from me -#define DECAL_INIT_UPDATE_EXPERIENCED_1 (1<<17) +#define DECAL_INIT_UPDATE_EXPERIENCED_1 (1<<16) /// This atom always returns its turf in get_turf_pixel instead of the turf from its offsets -#define IGNORE_TURF_PIXEL_OFFSET_1 (1<<18) +#define IGNORE_TURF_PIXEL_OFFSET_1 (1<<17) /// This atom does not need to generate its own preview icon for GAGS -#define NO_NEW_GAGS_PREVIEW_1 (1<<19) +#define NO_NEW_GAGS_PREVIEW_1 (1<<18) // Update flags for [/atom/proc/update_appearance] /// Update the atom's name @@ -102,52 +100,55 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 /// This atom is a pseudo-floor that blocks map generation's checkPlaceAtom() from placing things like trees ontop of it. #define TURF_BLOCKS_POPULATE_TERRAIN_FLORAFEATURES (1<<8) - ////////////////Area flags\\\\\\\\\\\\\\ /// If it's a valid territory for cult summoning or the CRAB-17 phone to spawn #define VALID_TERRITORY (1<<0) /// If blobs can spawn there and if it counts towards their score. #define BLOBS_ALLOWED (1<<1) -/// If mining tunnel generation is allowed in this area -#define CAVES_ALLOWED (1<<2) -/// If flora are allowed to spawn in this area randomly through tunnel generation -#define FLORA_ALLOWED (1<<3) -/// If mobs can be spawned by natural random generation -#define MOB_SPAWN_ALLOWED (1<<4) -/// If megafauna can be spawned by natural random generation -#define MEGAFAUNA_SPAWN_ALLOWED (1<<5) /// Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter) -#define NOTELEPORT (1<<6) +#define NOTELEPORT (1<<2) /// Hides area from player Teleport function. -#define HIDDEN_AREA (1<<7) -/// If false, loading multiple maps with this area type will create multiple instances. -#define UNIQUE_AREA (1<<8) +#define HIDDEN_AREA (1<<3) /// If people are allowed to suicide in it. Mostly for OOC stuff like minigames -#define BLOCK_SUICIDE (1<<9) +#define BLOCK_SUICIDE (1<<5) /// If set, this area will be innately traversable by Xenobiology camera consoles. -#define XENOBIOLOGY_COMPATIBLE (1<<10) +#define XENOBIOLOGY_COMPATIBLE (1<<6) /// If blood cultists can draw runes or build structures on this AREA. -#define CULT_PERMITTED (1<<11) -/// If engravings are persistent in this area -#define PERSISTENT_ENGRAVINGS (1<<12) +#define CULT_PERMITTED (1<<7) /// Mobs that die in this area don't produce a dead chat message -#define NO_DEATH_MESSAGE (1<<13) +#define NO_DEATH_MESSAGE (1<<8) /// This area should have extra shielding from certain event effects -#define EVENT_PROTECTED (1<<14) +#define EVENT_PROTECTED (1<<9) /// This Area Doesn't have Flood or Bomb Admin Messages, but will still log -#define QUIET_LOGS (1<<15) -/// This area does not allow virtual entities to enter. -#define VIRTUAL_SAFE_AREA (1<<16) +#define QUIET_LOGS (1<<10) /// This area does not allow the Binary channel -#define BINARY_JAMMING (1<<17) +#define BINARY_JAMMING (1<<11) /// This area prevents Bag of Holding rifts from being opened. -#define NO_BOH (1<<18) +#define NO_BOH (1<<12) /// This area prevents fishing from removing unique/limited loot from sources that're also used outside of it. -#define UNLIMITED_FISHING (1<<19) +#define UNLIMITED_FISHING (1<<13) /// This area is prevented from having gravity (ie. space, nearstation, or outside solars) -#define NO_GRAVITY (1<<20) +#define NO_GRAVITY (1<<14) /// This area can be teleported in, but -only- to locations within that same area. -#define LOCAL_TELEPORT (1<<21) +#define LOCAL_TELEPORT (1<<15) + +////////////////Area Mapping Flags\\\\\\\\\\\\\\ +/// If false, loading multiple maps with this area type will create multiple instances. +#define UNIQUE_AREA (1<<0) +/// If mining tunnel generation is allowed in this area +#define CAVES_ALLOWED (1<<1) +/// If flora are allowed to spawn in this area randomly through tunnel generation +#define FLORA_ALLOWED (1<<2) +/// If mobs can be spawned by natural random generation +#define MOB_SPAWN_ALLOWED (1<<3) +/// If megafauna can be spawned by natural random generation +#define MEGAFAUNA_SPAWN_ALLOWED (1<<4) +/// If engravings are persistent in this area +#define PERSISTENT_ENGRAVINGS (1<<5) +/// This is a virtual/bitrunning area +#define VIRTUAL_AREA (1<<6) +/// This area does not allow virtual entities to enter. +#define VIRTUAL_SAFE_AREA (1<<7) /* These defines are used specifically with the atom/pass_flags bitmask @@ -234,12 +235,14 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define ZAP_FUSION_FLAGS ZAP_OBJ_DAMAGE | ZAP_MOB_DAMAGE | ZAP_MOB_STUN #define ZAP_SUPERMATTER_FLAGS ZAP_GENERATES_POWER -///EMP will protect itself. +///Object will protect itself. #define EMP_PROTECT_SELF (1<<0) -///EMP will protect the contents from also being EMPed. +///Object will protect its contents from being EMPed. #define EMP_PROTECT_CONTENTS (1<<1) -///EMP will protect the wires. +///Object will protect its wiring from being EMPed. #define EMP_PROTECT_WIRES (1<<2) +///Don't indicate EMP protection in object examine text. +#define EMP_NO_EXAMINE (1<<3) ///Protects against all EMP types. #define EMP_PROTECT_ALL (EMP_PROTECT_SELF | EMP_PROTECT_CONTENTS | EMP_PROTECT_WIRES) @@ -336,3 +339,23 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define EMOTE_IMPORTANT (1<<2) /// Emote only prints to runechat, not to the chat window #define EMOTE_RUNECHAT (1<<3) + +// Flags for the empath component +/// Can the empath see if a living mob has combat mode on +#define EMPATH_SEE_COMBAT (1<<0) +/// Can the empath see if living mob has over 10 oxyloss +#define EMPATH_SEE_OXY (1<<1) +/// Can the empath see if living mob has over 10 toxloss +#define EMPATH_SEE_TOX (1<<2) +/// Can the empath see if living mob's sanity is at distressed or below +#define EMPATH_SEE_SANITY (1<<3) +/// Can the empath see if living mob is blind +#define EMPATH_SEE_BLIND (1<<4) +/// Can the empath see if living mob is deaf +#define EMPATH_SEE_DEAF (1<<5) +/// Can the empath see if living mob's body temperature is too hot for their species +#define EMPATH_SEE_HOT (1<<6) +/// Can the empath see if living mob's body temperature is too low for their species +#define EMPATH_SEE_COLD (1<<7) +/// Can the empath see if living mob has the fundamentally evil trait +#define EMPATH_SEE_EVIL (1<<8) diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index 558969396993..b139ef6713b2 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -28,6 +28,8 @@ #define ACCESS_ALL_PERSONAL_LOCKERS "all_personal_lockers" /// Access used for Access-Changing Programs, this one will unlock all options that can be ever given via that program. #define ACCESS_CHANGE_IDS "change_ids" +/// Access the PDA shopping app checks for to see if you can only request or place orders immediately +#define ACCESS_BUDGET "department_budget" /// Access used for the Captain's personal quarters in mapping, as well as what allows one to order emergency shuttles. #define ACCESS_CAPTAIN "captain" /// Access used for the Head of Personnel's personal quarters in mapping, as well as the security console and other HoP-related things. @@ -89,6 +91,8 @@ #define ACCESS_PSYCHOLOGY "psychology" /// Access for the Chief Medical Officer's personal quarters in mapping, as well as some other CMO-related things. #define ACCESS_CMO "cmo" +/// Access to the Paramedic dispatch. +#define ACCESS_PARAMEDIC "paramedic" /// General access for Cargo, allows for entry to Cargo Bay and Cargo's Office. #define ACCESS_CARGO "cargo" @@ -182,6 +186,7 @@ #define ACCESS_CENT_TELEPORTER "cent_teleporter" #define ACCESS_CENT_CAPTAIN "cent_captain" #define ACCESS_CENT_BAR "cent_bar" +#define ACCESS_CENT_OFFICER "cent_officer" /// Special Ops. Captain's display case, Marauder and Seraph mechs. #define ACCESS_CENT_SPECOPS "cent_specops" @@ -293,6 +298,7 @@ ACCESS_BIT_DEN, \ ACCESS_BRIG, \ ACCESS_BRIG_ENTRANCE, \ + ACCESS_BUDGET, \ ACCESS_CARGO, \ ACCESS_CHAPEL_OFFICE, \ ACCESS_CONSTRUCTION, \ @@ -325,6 +331,7 @@ ACCESS_NETWORK, \ ACCESS_ORDNANCE, \ ACCESS_ORDNANCE_STORAGE, \ + ACCESS_PARAMEDIC, \ ACCESS_PHARMACY, \ ACCESS_PLUMBING, \ ACCESS_PSYCHOLOGY, \ @@ -335,6 +342,7 @@ ACCESS_SERVICE, \ ACCESS_SHIPPING, \ ACCESS_SURGERY, \ + ACCESS_TECH_STORAGE, \ ACCESS_THEATRE, \ ACCESS_VIROLOGY, \ ACCESS_WEAPONS, \ @@ -346,6 +354,7 @@ ACCESS_AI_UPLOAD, \ ACCESS_ALL_PERSONAL_LOCKERS, \ ACCESS_ARMORY, \ + ACCESS_BUDGET, \ ACCESS_CHANGE_IDS, \ ACCESS_COMMAND, \ ACCESS_EVA, \ @@ -353,7 +362,6 @@ ACCESS_MINISAT, \ ACCESS_RC_ANNOUNCE, \ ACCESS_TCOMMS, \ - ACCESS_TECH_STORAGE, \ ACCESS_TELEPORTER, \ ACCESS_VAULT, \ ) @@ -383,6 +391,7 @@ ACCESS_CENT_STORAGE, \ ACCESS_CENT_TELEPORTER, \ ACCESS_CENT_THUNDER, \ + ACCESS_CENT_OFFICER, \ ) /// Syndicate areas off station. Do not use direct, access via SSid_access.get_flag_access_list(ACCESS_FLAG_SYNDICATE) @@ -425,6 +434,7 @@ /// Used to seed the accesses_by_region list in SSid_access. A list of general service accesses that are overseen by the HoP. #define REGION_ACCESS_GENERAL list( \ ACCESS_BAR, \ + ACCESS_BUDGET, \ ACCESS_CHAPEL_OFFICE, \ ACCESS_CREMATORIUM, \ ACCESS_HYDROPONICS, \ @@ -442,6 +452,7 @@ ACCESS_ARMORY, \ ACCESS_BRIG, \ ACCESS_BRIG_ENTRANCE, \ + ACCESS_BUDGET, \ ACCESS_COURT, \ ACCESS_DETECTIVE, \ ACCESS_HOS, \ @@ -453,11 +464,13 @@ #define REGION_MEDBAY "Medbay" /// Used to seed the accesses_by_region list in SSid_access. A list of all medbay regional accesses that are overseen by the CMO. #define REGION_ACCESS_MEDBAY list( \ + ACCESS_BUDGET, \ ACCESS_CMO, \ ACCESS_MECH_MEDICAL, \ ACCESS_MEDICAL, \ ACCESS_MORGUE, \ ACCESS_MORGUE_SECURE, \ + ACCESS_PARAMEDIC, \ ACCESS_PHARMACY, \ ACCESS_PLUMBING, \ ACCESS_PSYCHOLOGY, \ @@ -469,6 +482,7 @@ /// Used to seed the accesses_by_region list in SSid_access. A list of all research regional accesses that are overseen by the RD. #define REGION_ACCESS_RESEARCH list( \ ACCESS_AI_UPLOAD, \ + ACCESS_BUDGET, \ ACCESS_GENETICS, \ ACCESS_MECH_SCIENCE, \ ACCESS_MINISAT, \ @@ -487,6 +501,7 @@ #define REGION_ACCESS_ENGINEERING list( \ ACCESS_ATMOSPHERICS, \ ACCESS_AUX_BASE, \ + ACCESS_BUDGET, \ ACCESS_CE, \ ACCESS_CONSTRUCTION, \ ACCESS_ENGINEERING, \ @@ -503,6 +518,7 @@ /// 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_BUDGET, \ ACCESS_CARGO, \ ACCESS_MECH_MINING, \ ACCESS_MINERAL_STOREROOM, \ @@ -518,6 +534,7 @@ #define REGION_ACCESS_COMMAND list( \ ACCESS_AI_UPLOAD, \ ACCESS_ALL_PERSONAL_LOCKERS, \ + ACCESS_BUDGET, \ ACCESS_CAPTAIN, \ ACCESS_CHANGE_IDS, \ ACCESS_COMMAND, \ diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index 47ba741764b2..d026e2f795e9 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -14,6 +14,7 @@ //Misc Medal hub IDs #define MEDAL_METEOR "Your Life Before Your Eyes" +#define MEDAL_METEOR_PUNCH "Your Life In Your Hands" #define MEDAL_PULSE "Jackpot" #define MEDAL_TIMEWASTE "Overextended The Joke" #define MEDAL_RODSUPLEX "Feat of Strength" diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 65a1ead24649..c379fb6ffed9 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -7,6 +7,7 @@ #define MUTE_ADMINHELP (1<<3) #define MUTE_DEADCHAT (1<<4) #define MUTE_INTERNET_REQUEST (1<<5) +#define MUTE_LOOC (1<<6) // DARKPACK EDIT ADD - LOOC #define MUTE_ALL ALL //Some constants for DB_Ban diff --git a/code/__DEFINES/ai/ai.dm b/code/__DEFINES/ai/ai.dm index 7266ad449909..aafd3feb203d 100644 --- a/code/__DEFINES/ai/ai.dm +++ b/code/__DEFINES/ai/ai.dm @@ -76,6 +76,8 @@ //Generic subtree defines +/// default search range (tiles, passed to oview) when using find_and_set +#define SEARCH_TACTIC_DEFAULT_RANGE 7 /// probability that the pawn should try resisting out of restraints #define RESIST_SUBTREE_PROB 50 ///macro for whether it's appropriate to resist right now, used by resist subtree diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm index ebcd71345ee7..3e9a65027af5 100644 --- a/code/__DEFINES/ai/ai_blackboard.dm +++ b/code/__DEFINES/ai/ai_blackboard.dm @@ -4,6 +4,8 @@ #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" +///When looking for food, ignore drinks +#define BB_IGNORE_DRINKS "bb_ignore_drinks" ///what we're going to eat next #define BB_FOOD_TARGET "bb_food_target" ///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 @@ -81,6 +83,7 @@ #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_TARGETING_STRATEGY "targeting_strategy" +#define BB_HUNT_TARGETING_STRATEGY "hunt_targeting_strategy" ///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" @@ -173,8 +176,6 @@ #define BB_MOD_TARGET "BB_mod_target" ///The module the AI was created from #define BB_MOD_MODULE "BB_mod_module" -///Range for a MOD AI controller. -#define MOD_AI_RANGE 200 ///Only target mobs with these traits #define BB_TARGET_ONLY_WITH_TRAITS "BB_target_only_with_traits" @@ -236,5 +237,3 @@ // Used to hold state without making bigass lists /// For /datum/ai_behavior/find_potential_targets, what if any field are we using currently #define BB_FIND_TARGETS_FIELD(type) "bb_find_targets_field_[type]" - - diff --git a/code/__DEFINES/ai/monkey.dm b/code/__DEFINES/ai/monkey.dm index 833514e2f0fd..f11ac96fefe2 100644 --- a/code/__DEFINES/ai/monkey.dm +++ b/code/__DEFINES/ai/monkey.dm @@ -15,3 +15,11 @@ #define BB_MONKEY_DISPOSING "BB_monkey_disposing" #define BB_MONKEY_RECRUIT_COOLDOWN "BB_monkey_recruit_cooldown" #define BB_RESISTING "BB_resisting" +/// Monkey is not necessarily a wild animal so it won't resort to fighting over food and such +#define BB_MONKEY_TAMED "BB_monkey_tamed" +/// Chance to give our held item to a nearby mob +#define BB_MONKEY_GIVE_CHANCE "BB_monkey_give_chance" +/// If set, the monkey will prefer this type of object when pressing things +#define BB_MONKEY_PRESS_TYPEPATH "BB_monkey_press_typepath" +/// The item the monkey is currently serving to someone +#define BB_MONKEY_CURRENT_SERVED_ITEM "BB_monkey_current_served_item" diff --git a/code/__DEFINES/announcements.dm b/code/__DEFINES/announcements.dm index b40303514eaa..26df2ba01470 100644 --- a/code/__DEFINES/announcements.dm +++ b/code/__DEFINES/announcements.dm @@ -7,5 +7,5 @@ #define ANNOUNCEMENT_TYPE_SYNDICATE "Syndicate" //Defines for newscaster news stations, the defined thing is what it'll be called in the Newscaster. -#define NEWSCASTER_STATION_ANNOUNCEMENTS "Station Announcements" +#define NEWSCASTER_STATION_ANNOUNCEMENTS NEWSPAPER_COMPANY // DARKPACK EDIT CHANGE #define NEWSCASTER_SPACE_BETTING "SpaceBet" diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 9a2390557d83..60d1212540c6 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -101,15 +101,53 @@ #define HKT_NEXT "next" #define HKT_BAN "ban" #define HKT_DEPTH "depth" +#define HKT_PURCHASED_DEPTH "purchased_depth" #define HKT_ROUTE "route" #define HKT_UI_BGR "ui_bgr" +#define HKT_COST "cost" +#define HKT_CATEGORY "category" +/// Only present for already researched knowledge. +#define HKT_INSTANCE "instance" +/// unique identifier most commonly used for identifying what knowledge is researchable +#define HKT_ID "id" +#define BGR_SIDE "node_side" + +#define MAGIC_RESISTANCE_MOON (MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND) /// 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 #define HERETIC_NO_LIVING_HEART 0 #define HERETIC_HAS_LIVING_HEART 1 +#define HERETIC_DRAFT_TIER_MAX 5 + +/// The default drain speed for heretic rift's, anything below this will be considered a fast drain, and be very noticeable and cause a overlay +#define HERETIC_RIFT_DEFAULT_DRAIN_SPEED 10 SECONDS + +/// Sources of knowledge purchased for heretics, used for positioning in the UI +#define HERETIC_KNOWLEDGE_TREE "tree" +#define HERETIC_KNOWLEDGE_SHOP "shop" +#define HERETIC_KNOWLEDGE_DRAFT "draft" +#define HERETIC_KNOWLEDGE_START "start" + +/// defines for the depths of the heretic knowledge tree nodes +#define HKT_DEPTH_START 2 +#define HKT_DEPTH_TIER_1 3 +#define HKT_DEPTH_DRAFT_1 4 +#define HKT_DEPTH_TIER_2 5 +#define HKT_DEPTH_DRAFT_2 6 +#define HKT_DEPTH_ROBES 7 +#define HKT_DEPTH_TIER_3 8 +#define HKT_DEPTH_DRAFT_3 9 +#define HKT_DEPTH_ARMOR 10 +#define HKT_DEPTH_TIER_4 11 +#define HKT_DEPTH_DRAFT_4 12 +#define HKT_DEPTH_ASCENSION 13 + +#define HERETIC_CAN_ASCEND "can_ascend" + + /// A define used in ritual priority for heretics. #define MAX_KNOWLEDGE_PRIORITY 100 diff --git a/code/__DEFINES/atmospherics/atmos_mob_interaction.dm b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm index 75dcebc72d96..0d1757101164 100644 --- a/code/__DEFINES/atmospherics/atmos_mob_interaction.dm +++ b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm @@ -103,7 +103,7 @@ #define PRESSURE_DAMAGE_COEFFICIENT 2 #define MAX_HIGH_PRESSURE_DAMAGE 2 /// The amount of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). -#define LOW_PRESSURE_DAMAGE 2 +#define LOW_PRESSURE_DAMAGE 4 /// Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this #define COLD_SLOWDOWN_FACTOR 20 diff --git a/code/__DEFINES/atmospherics/atmos_piping.dm b/code/__DEFINES/atmospherics/atmos_piping.dm index 188798f95d20..54d29ffa59d0 100644 --- a/code/__DEFINES/atmospherics/atmos_piping.dm +++ b/code/__DEFINES/atmospherics/atmos_piping.dm @@ -68,9 +68,9 @@ #define TANK_MERGE_OVERPRESSURE "tank_overpressure" // Indices for the reaction_results returned by explosion_information() /// Reactions that have happened in the tank. -#define TANK_RESULTS_REACTION 1 +#define TANK_RESULTS_REACTION "results_reaction" /// Additional information of the tank. -#define TANK_RESULTS_MISC 2 +#define TANK_RESULTS_MISC "results_misc" /// Color used by omni-color pipes #define ATMOS_COLOR_OMNI COLOR_VERY_LIGHT_GRAY diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index d2e22be8e9a0..af3614826e13 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -46,6 +46,10 @@ #define DIAG_CAMERA_HUD "21" /// Steady Hacked APC effect, visible only to Malf AIs #define MALF_APC_HUD "22" +// DARKPACK EDIT START +/// Auspex aura HUD +#define AUSPEX_AURA_HUD "23" +// DARKPACK EDIT END //by default everything in the hud_list of an atom is an image //a value in hud_list with one of these will change that behavior @@ -63,6 +67,7 @@ #define DATA_HUD_AI_DETECT 8 #define DATA_HUD_FAN 9 #define DATA_HUD_MALF_APC 10 +#define DATA_HUD_AUSPEX_AURAS 11 // DARKPACK EDIT ADD /// cooldown for being shown the images for any particular data hud #define ADD_HUD_TO_COOLDOWN 20 @@ -75,6 +80,7 @@ #define SECHUD_SYNDICATE "hudsyndicate" #define SECHUD_SYNDICATE_INTERDYNE "hudsyndicateinterdyne" #define SECHUD_SYNDICATE_INTERDYNE_HEAD "hudsyndicateinterdynehead" +#define SECHUD_CLOWNOPS "hudclownop" #define SECHUD_ASSISTANT "hudassistant" #define SECHUD_ATMOSPHERIC_TECHNICIAN "hudatmospherictechnician" diff --git a/code/__DEFINES/basic_mobs.dm b/code/__DEFINES/basic_mobs.dm index 3daae1d0d8e3..5b1d0283c564 100644 --- a/code/__DEFINES/basic_mobs.dm +++ b/code/__DEFINES/basic_mobs.dm @@ -20,6 +20,8 @@ #define IMMUNE_TO_GETTING_WET (1<<5) /// Disables the function of attacking random body zones #define PRECISE_ATTACK_ZONES (1<<6) +/// People would be sad to see this mob die +#define SENDS_DEATH_MOODLETS (1<<7) /// Temporary trait applied when an attack forecast animation has completed #define TRAIT_BASIC_ATTACK_FORECAST "trait_basic_attack_forecast" @@ -37,40 +39,83 @@ #define MOOK_ATTACK_ACTIVE 2 #define MOOK_ATTACK_STRIKE 3 -///keeps track of how many gutlunches are born +/// Keeps track of how many gutlunches are born GLOBAL_VAR_INIT(gutlunch_count, 0) -///Pet customization settings saved for every client +/// Pet customization settings saved for every client GLOBAL_LIST_EMPTY(customized_pets) -//raptor defines +// Raptor defines +/// Raptor chick, tiny and very frail +#define RAPTOR_BABY "baby" +/// Raptor youngling, cannot be ridden and has reduced stats, but can hunt by itself just fine +#define RAPTOR_YOUNG "young" +/// Fully grown adult raptor +#define RAPTOR_ADULT "adult" -#define RAPTOR_RED "Red" -#define RAPTOR_GREEN "Green" -#define RAPTOR_PURPLE "Purple" -#define RAPTOR_WHITE "White" -#define RAPTOR_YELLOW "Yellow" -#define RAPTOR_BLACK "Black" -#define RAPTOR_BLUE "Blue" +/// Innate raptor offsets +#define RAPTOR_INNATE_SOURCE "raptor_innate" +// Growth values +/// How much does meal complexity affect our growth? +#define RAPTOR_MEAL_COMPLEXITY_GROWTH_FACTOR 5 +/// Base value for raptor growth from meat +#define RAPTOR_GROWTH_BASE_MEAT 10 +/// Base value for raptor growth from ash flora +#define RAPTOR_GROWTH_BASE_PLANT 5 +/// How much growth progress raptors need to accumulate to fully grow into an adult +#define RAPTOR_GROWTH_REQUIRED 100 +/// Minimum random growth value a baby raptor can gain per second +#define RAPTOR_BABY_GROWTH_LOWER 0.5 +/// Maximum random growth value a baby raptor can gain per second +#define RAPTOR_BABY_GROWTH_UPPER 0.8 +/// How long it takes for a raptor egg to grow up, in seconds +#define RAPTOR_EGG_GROWTH_PROGRESS 100 +/// How much happiness percentage affects our growth speed +#define RAPTOR_GROWTH_HAPPINESS_MULTIPLIER 0.005 // Full happiness increases growth rate by 50% + +/// Damage boost per happiness percent +#define RAPTOR_HAPPINESS_DAMAGE_BOOST 0.05 + +// Raptor inheritance stats +/// Maximum amount of traits a raptor can inherit +#define RAPTOR_TRAIT_INHERIT_AMOUNT 2 +/// Minimum modifier to base attack values a raptor can get +#define RAPTOR_INHERIT_MIN_ATTACK -5 +/// Maximum modifier to base attack values a raptor can get #define RAPTOR_INHERIT_MAX_ATTACK 5 +/// Minimum modifier to the base health value a raptor can get +#define RAPTOR_INHERIT_MIN_HEALTH -30 +/// Maximum modifier to the base health value a raptor can get #define RAPTOR_INHERIT_MAX_HEALTH 30 +/// Minimum modifier to base speed values a raptor can get +#define RAPTOR_INHERIT_MIN_SPEED -0.66 +/// Maximum modifier to base speed values a raptor can get +#define RAPTOR_INHERIT_MAX_SPEED 0.66 +/// Minimum modifier a raptor can get to their modifiers, such as ability effect and growth speed +#define RAPTOR_INHERIT_MIN_MODIFIER -0.25 +/// Maximum modifier a raptor can get to their modifiers, such as ability effect and growth speed +#define RAPTOR_INHERIT_MAX_MODIFIER 0.25 +/// Genetic drift for raptors, aka min/max value from the cap that stats can receive when breeding +#define RAPTOR_GENETIC_DRIFT 0.2 -///this mob suffers depression +/// This mob suffers depression #define BB_BASIC_DEPRESSED "basic_depressed" -///this mob will care for its young +/// This mob will care for its young #define BB_RAPTOR_MOTHERLY "raptor_motherly" -///this mob will be playful around their owners +/// This mob will be playful around their owners #define BB_RAPTOR_PLAYFUL "raptor_playful" -///this mob will flee combat when it feels threatened +/// This mob will flee combat when it feels threatened #define BB_RAPTOR_COWARD "raptor_coward" -///our raptor baby target we will take care of +/// Our raptor baby target we will take care of #define BB_RAPTOR_BABY "raptor_baby" -///the raptor we will heal up +/// The raptor we will heal up #define BB_INJURED_RAPTOR "injured_raptor" -///the cooldown for next time we eat +/// The cooldown for next time we eat #define BB_RAPTOR_EAT_COOLDOWN "raptor_eat_cooldown" -///our trough target +/// Our trough target #define BB_RAPTOR_TROUGH_TARGET "raptor_trough_target" +/// HP level at which we'll flee from attackers +#define BB_RAPTOR_FLEE_THRESHOLD "raptor_flee_threshold" #define MAX_RAPTOR_POP 64 diff --git a/code/__DEFINES/bitrunning.dm b/code/__DEFINES/bitrunning.dm index 639ae26c3fc5..900182eb43d7 100644 --- a/code/__DEFINES/bitrunning.dm +++ b/code/__DEFINES/bitrunning.dm @@ -27,13 +27,14 @@ /// Camera network bitrunner bodycams are on #define BITRUNNER_CAMERA_NET "bitrunner" -/** - * Bitrunner Domain External Load Restriction Bitflags - */ /// Domain forbids external sources from loading items onto avatars #define DOMAIN_FORBIDS_ITEMS (1<<0) /// Domain forbids external sources from loading abilities onto avatars #define DOMAIN_FORBIDS_ABILITIES (1<<1) +/// Block nohit bonus from applying +#define DOMAIN_NO_NOHIT_BONUS (1<<2) +/// Test domain, don't let it be loaded normally +#define DOMAIN_TEST_ONLY (1<<3) /// Combination flag for blocking anything from being loaded onto avatars by external sources #define DOMAIN_FORBIDS_ALL ALL diff --git a/code/__DEFINES/bodyparts.dm b/code/__DEFINES/bodyparts.dm index 5c6bb1b49605..2f396cfbabc0 100644 --- a/code/__DEFINES/bodyparts.dm +++ b/code/__DEFINES/bodyparts.dm @@ -66,3 +66,111 @@ #define BODYPART_OVERLAY_CARP_INFUSION 2 #define BODYPART_OVERLAY_CSS_SUICIDE 3 #define BODYPART_OVERLAY_VOIDWALKER_CURSE 4 + +// Bodypart surgery state +/// An incision has been made into the skin +#define SURGERY_SKIN_CUT (1<<0) +/// Skin has been pulled back - 99% of surgeries require this +#define SURGERY_SKIN_OPEN (1<<1) +/// Blood vessels are accessible, cut, and bleeding +#define SURGERY_VESSELS_UNCLAMPED (1<<2) +/// Blood vessels are accessible but clamped +#define SURGERY_VESSELS_CLAMPED (1<<3) +/// Indicates either an incision has been made into the organs present in the limb or organs have been incised from the limb +#define SURGERY_ORGANS_CUT (1<<4) +/// Holes have been drilled in our bones, exclusive with sawed +#define SURGERY_BONE_DRILLED (1<<5) +/// Bones have been sawed apart +#define SURGERY_BONE_SAWED (1<<6) +/// Used in advanced plastic surgery: Has plastic been applied +#define SURGERY_PLASTIC_APPLIED (1<<7) +/// Used in prosthetic surgery: Is the prosthetic unsecured +#define SURGERY_PROSTHETIC_UNSECURED (1<<8) +/// Used for cavity implants +#define SURGERY_CAVITY_WIDENED (1<<9) + +DEFINE_BITFIELD(surgery_state, list( + "SKIN CUT" = SURGERY_SKIN_CUT, + "SKIN OPEN" = SURGERY_SKIN_OPEN, + "VESSELS UNCLAMPED" = SURGERY_VESSELS_UNCLAMPED, + "VESSELS CLAMPED" = SURGERY_VESSELS_CLAMPED, + "ORGANS CUT" = SURGERY_ORGANS_CUT, + "BONE DRILLED" = SURGERY_BONE_DRILLED, + "BONE SAWED" = SURGERY_BONE_SAWED, + "PLASTIC APPLIED" = SURGERY_PLASTIC_APPLIED, + "PROSTHETIC UNSECURED" = SURGERY_PROSTHETIC_UNSECURED, + "CAVITY OPENED" = SURGERY_CAVITY_WIDENED, +)) + +/// For use in translating bitfield to human readable strings. Keep in the correct order! +#define SURGERY_STATE_READABLE list(\ + "Skin is cut" = SURGERY_SKIN_CUT, \ + "Skin is open" = SURGERY_SKIN_OPEN, \ + "Blood vessels are unclamped" = SURGERY_VESSELS_UNCLAMPED, \ + "Blood vessels are clamped" = SURGERY_VESSELS_CLAMPED, \ + "Organs are cut" = SURGERY_ORGANS_CUT, \ + "Bone is drilled" = SURGERY_BONE_DRILLED, \ + "Bone is sawed" = SURGERY_BONE_SAWED, \ + "Plastic is applied" = SURGERY_PLASTIC_APPLIED, \ + "Prosthetic is unsecured" = SURGERY_PROSTHETIC_UNSECURED, \ + "Cavity is opened wide" = SURGERY_CAVITY_WIDENED, \ +) + +/// For use in translating bitfield to steps required for surgery. Keep in the correct order! +#define SURGERY_STATE_GUIDES(must_must_not) list(\ + "the skin [must_must_not] be cut" = SURGERY_SKIN_CUT, \ + "the skin [must_must_not] be open" = SURGERY_SKIN_OPEN, \ + "the blood vessels [must_must_not] be unclamped" = SURGERY_VESSELS_UNCLAMPED, \ + "the blood vessels [must_must_not] be clamped" = SURGERY_VESSELS_CLAMPED, \ + "the organs [must_must_not] be cut" = SURGERY_ORGANS_CUT, \ + "the bone [must_must_not] be drilled" = SURGERY_BONE_DRILLED, \ + "the bone [must_must_not] be sawed" = SURGERY_BONE_SAWED, \ + "plastic [must_must_not] be applied" = SURGERY_PLASTIC_APPLIED, \ + "the prosthetic [must_must_not] be unsecured" = SURGERY_PROSTHETIC_UNSECURED, \ + "the chest cavity [must_must_not] be opened wide" = SURGERY_CAVITY_WIDENED, \ +) + +// Yes these are glorified bitflag manipulation macros, they're meant to make reading surgical operations a bit easier +/// Checks if the input surgery state has all of the bitflags passed +#define HAS_SURGERY_STATE(input_state, check_state) ((input_state & (check_state)) == (check_state)) +/// Checks if the input surgery state has any of the bitflags passed +#define HAS_ANY_SURGERY_STATE(input_state, check_state) ((input_state & (check_state))) +/// Checks if the limb has all of the bitflags passed +#define LIMB_HAS_SURGERY_STATE(limb, check_state) HAS_SURGERY_STATE(limb?.surgery_state, check_state) +/// Checks if the limb has any of the bitflags passed +#define LIMB_HAS_ANY_SURGERY_STATE(limb, check_state) HAS_ANY_SURGERY_STATE(limb?.surgery_state, check_state) + +/// All states that concern itself with the skin +#define ALL_SURGERY_SKIN_STATES (SURGERY_SKIN_CUT|SURGERY_SKIN_OPEN) +/// All states that concern itself with the blood vessels +#define ALL_SURGERY_VESSEL_STATES (SURGERY_VESSELS_UNCLAMPED|SURGERY_VESSELS_CLAMPED) +/// All states that concern itself with the bones +#define ALL_SURGERY_BONE_STATES (SURGERY_BONE_DRILLED|SURGERY_BONE_SAWED) +/// All states that concern itself with internal organs +#define ALL_SURGERY_ORGAN_STATES (SURGERY_ORGANS_CUT) + +/// These states are automatically cleared when the surgery is closed for ease of use +#define ALL_SURGERY_STATES_UNSET_ON_CLOSE (ALL_SURGERY_SKIN_STATES|ALL_SURGERY_VESSEL_STATES|ALL_SURGERY_BONE_STATES|ALL_SURGERY_ORGAN_STATES|SURGERY_CAVITY_WIDENED) +/// Surgery state required for a limb with a certain zone to... be... fished... in... +#define ALL_SURGERY_FISH_STATES(for_zone) (SURGERY_SKIN_OPEN|SURGERY_ORGANS_CUT|(for_zone == BODY_ZONE_CHEST ? SURGERY_BONE_SAWED : NONE)) + +/// Surgery states flipped on automatically if the bodypart lacks a form of skin +#define SKINLESS_SURGERY_STATES (SURGERY_SKIN_OPEN) +// (These are normally mutually exclusive, but as a bonus for lacking bones, you can do drill and saw operations simultaneously!) +/// Surgery states flipped on automatically if the bodypart lacks bones +#define BONELESS_SURGERY_STATES (SURGERY_BONE_DRILLED|SURGERY_BONE_SAWED) +/// Surgery states flipped on automatically if the bodypart lacks vessels +#define VESSELLESS_SURGERY_STATES (SURGERY_VESSELS_CLAMPED|SURGERY_ORGANS_CUT) + +/// Biological state that has some kind of skin that can be cut. +#define BIOSTATE_HAS_SKIN (BIO_FLESH|BIO_METAL|BIO_CHITIN) +/// Checks if a bodypart lacks both flesh and metal, meaning it has no skin to cut. +#define LIMB_HAS_SKIN(limb) (limb?.biological_state & BIOSTATE_HAS_SKIN) +/// Biological state that has some kind of bones that can be sawed. +#define BIOSTATE_HAS_BONES (BIO_BONE|BIO_METAL) +/// Checks if a bodypart lacks both bone and metal, meaning it has no bones to saw. +#define LIMB_HAS_BONES(limb) (limb?.biological_state & BIOSTATE_HAS_BONES) +/// Biological state that has some kind of vessels that can be clamped. +#define BIOSTATE_HAS_VESSELS (BIO_BLOODED|BIO_WIRED) +/// Checks if a bodypart lacks both blood and wires, meaning it has no vessels to manipulate. +#define LIMB_HAS_VESSELS(limb) (limb?.biological_state & BIOSTATE_HAS_VESSELS) diff --git a/code/__DEFINES/botany.dm b/code/__DEFINES/botany.dm index 1ee833c6bf15..8afca99300bd 100644 --- a/code/__DEFINES/botany.dm +++ b/code/__DEFINES/botany.dm @@ -21,6 +21,15 @@ #define CARNIVORY_POTENCY_MIN 30 /// Fungle megabolism plants have a min yield of 1. #define FUNGAL_METAB_YIELD_MIN 1 +/// Semiaquatic plants gets 50% more weeds in soil. +#define SEMIAQUATIC_SOIL_WEED_MALUS 1.5 +/// Soil loving plants get worse yield when grown in a medium that isn't soil. +#define SOIL_LOVER_HYDRO_YIELD_MALUS 0.7 +/// Upper bound of produce size mod for soil lowers grown without soil. +#define SOIL_LOVER_HYDRO_POTENCY_MAX 0.8 +/// Lower bound of produce size mod for soil lowers grown without soil +#define SOIL_LOVER_HYDRO_POTENCY_MIN 0.5 + /// -- Hydroponics tray defines. -- /// Base amount of nutrients a tray can old. @@ -91,3 +100,29 @@ /// Used as a baseline plant rarity for more uncommon plants, usually requiring mutation #define PLANT_MODERATELY_RARE 20 + +/// How much water drain is reduced for trays with the SUPERWATER modifier such as superabsorbent hydrogel beads. +#define SUPER_WATER_MODIFIER 0.5 +// How much faster our mushrooms mature on a good mushroom growing soil such as korta coir. +#define FAST_MUSH_MODIFIER 1.4 +// How many grafts we harvest from one plant if planted in a tray with the MULTI_GRAFT flag. +#define MULTI_GRAFT_MAX_COUNT 3 + +/// TRAY BITFLAGS + +/// For watery trays, capable of growing aquatic plants. +#define HYDROPONIC (1 << 0) +/// For soil type trays that provide structure for soil loving plants. +#define SOIL (1 << 1) +/// Allows you to take up to 3 grafts from the same plant. +#define MULTIGRAFT (1 << 2) +/// Allows you to plant grafts into this tray to propagate them vegetativley. +#define GRAFT_MEDIUM (1 << 3) +/// Musrooms mature faster in this type of tray. +#define FAST_MUSHROOMS (1 << 4) +/// Extra slimy worms can be created by composting greens in this soil. +#define WORM_HABITAT (1 << 5) +/// Water drains at a slower rate from this soil. +#define SUPERWATER (1 << 6) +/// If this tray runs out of nutrients, add a little nitrogen from the breakdown of natural fertilizers or nitrogen fixating bacteria. +#define SLOW_RELEASE (1 << 7) diff --git a/code/__DEFINES/cameranets.dm b/code/__DEFINES/cameranets.dm index 7b00ebe52ebb..75cdb072ea9a 100644 --- a/code/__DEFINES/cameranets.dm +++ b/code/__DEFINES/cameranets.dm @@ -32,6 +32,7 @@ #define OPERATIVE_CAMERA_NET "operative" #define CAMERANET_NETWORK_CURATOR "curator" #define CAMERANET_NETWORK_FILMSTUDIO "filmstudio" +#define CAMERANET_NETWORK_MONASTERY "monastery" // Ruins/Away missiosn/Misc camera nets #define CAMERANET_NETWORK_MOON19_XENO "mo19x" diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm index f17c56482ecb..f81b5d08b940 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -41,6 +41,28 @@ ///Used by coupons to define that they're cursed #define COUPON_OMEN "omen" +// Supply pack flags determining ordering properties +/// Order is literally never visible, presumably it's an abstract type or something +#define ORDER_INVISIBLE (1 << 0) +/// Only orderable on emagged consoles +#define ORDER_EMAG_ONLY (1 << 1) +/// Only orderable on consoles with doctored boards +#define ORDER_CONTRABAND (1 << 2) +/// Can only be ordered privately, can use discount coupons, and arrives in a bag instead of a crate +#define ORDER_GOODY (1 << 3) +/// Can only be ordered via the express order console +#define ORDER_POD_ONLY (1 << 4) +/// Can only be ordered if the following flag is also enabled, for conditionally provided options +#define ORDER_SPECIAL (1 << 5) +/// If present then a special order can be ordered +#define ORDER_SPECIAL_ENABLED (1 << 6) +/// Unavailable to departmental order consoles even if it is in an appropriate category +#define ORDER_NOT_DEPARTMENTAL (1 << 7) +/// This will notify admins when it is purchased +#define ORDER_DANGEROUS (1 << 8) +/// This is set when something is created by an admin to make sure its contents is also marked as such +#define ORDER_ADMIN_SPAWNED (1 << 9) + ///Discount categories for coupons. This one is for anything that isn't discountable. #define SUPPLY_PACK_NOT_DISCOUNTABLE null ///Discount category for the standard stuff, mostly goodies. diff --git a/code/__DEFINES/chat.dm b/code/__DEFINES/chat.dm index 21901a934456..35601ce85257 100644 --- a/code/__DEFINES/chat.dm +++ b/code/__DEFINES/chat.dm @@ -16,6 +16,7 @@ #define MESSAGE_TYPE_WARNING "warning" #define MESSAGE_TYPE_DEADCHAT "deadchat" #define MESSAGE_TYPE_OOC "ooc" +#define MESSAGE_TYPE_LOOC "looc" // DARKPACK EDIT ADD - LOOC #define MESSAGE_TYPE_ADMINPM "adminpm" #define MESSAGE_TYPE_COMBAT "combat" #define MESSAGE_TYPE_ADMINCHAT "adminchat" @@ -31,19 +32,19 @@ //debug printing macros (for development and testing) /// Used for debug messages to the world -#define debug_world(msg) if (GLOB.Debug2) to_chat(world, \ +#define debug_world(msg) if (GLOB.debugging_enabled) to_chat(world, \ type = MESSAGE_TYPE_DEBUG, \ text = "DEBUG: [msg]") /// Used for debug messages to the player -#define debug_usr(msg) if (GLOB.Debug2 && usr) to_chat(usr, \ +#define debug_usr(msg) if (GLOB.debugging_enabled && usr) to_chat(usr, \ type = MESSAGE_TYPE_DEBUG, \ text = "DEBUG: [msg]") /// Used for debug messages to the admins -#define debug_admins(msg) if (GLOB.Debug2) to_chat(GLOB.admins, \ +#define debug_admins(msg) if (GLOB.debugging_enabled) to_chat(GLOB.admins, \ type = MESSAGE_TYPE_DEBUG, \ text = "DEBUG: [msg]") /// Used for debug messages to the server -#define debug_world_log(msg) if (GLOB.Debug2) log_world("DEBUG: [msg]") +#define debug_world_log(msg) if (GLOB.debugging_enabled) log_world("DEBUG: [msg]") /// Adds a generic box around whatever message you're sending in chat. Really makes things stand out. #define boxed_message(str) ("
" + str + "
") /// Adds a box around whatever message you're sending in chat. Can apply color and/or additional classes. Available colors: red, green, blue, purple. Use it like red_box diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 0a105a50ad0c..0eb7232a8af9 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -125,6 +125,7 @@ #define COLOR_MOSTLY_PURE_PINK "#E4005B" #define COLOR_ADMIN_PINK "#D100D1" #define COLOR_TONGUE_PINK "#ff6ea0" +#define COLOR_PUCE "#cc8899" #define COLOR_BLUSH_PINK "#DE5D83" #define COLOR_FADED_PINK "#ff80d5" #define COLOR_MAGENTA "#FF00FF" @@ -500,6 +501,7 @@ GLOBAL_LIST_INIT(heretic_path_to_color, list( #define EYE_COLOR_WEED_PRIORITY 20 #define EYE_COLOR_HUD_PRIORITY 30 #define EYE_COLOR_LUMINESCENT_PRIORITY 40 +#define EYE_COLOR_DISC 45 // DARKPACK EDIT ADD #define EYE_COLOR_CULT_PRIORITY 50 // Client color priorities diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 828aef4df745..9be3f16100fd 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -285,11 +285,6 @@ DEFINE_BITFIELD(ammo_box_multiload, list( #define BODY_ZONE_L_LEG "l_leg" #define BODY_ZONE_R_LEG "r_leg" -GLOBAL_LIST_INIT(all_body_zones, list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) -GLOBAL_LIST_INIT(limb_zones, list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) -GLOBAL_LIST_INIT(arm_zones, list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) -GLOBAL_LIST_INIT(leg_zones, list(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) - #define BODY_ZONE_PRECISE_EYES "eyes" #define BODY_ZONE_PRECISE_MOUTH "mouth" #define BODY_ZONE_PRECISE_GROIN "groin" @@ -298,6 +293,12 @@ GLOBAL_LIST_INIT(leg_zones, list(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) #define BODY_ZONE_PRECISE_L_FOOT "l_foot" #define BODY_ZONE_PRECISE_R_FOOT "r_foot" +GLOBAL_LIST_INIT(all_body_zones, list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) +GLOBAL_LIST_INIT(limb_zones, list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) +GLOBAL_LIST_INIT(arm_zones, list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) +GLOBAL_LIST_INIT(leg_zones, list(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) +GLOBAL_LIST_INIT(all_precise_body_zones, list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_FOOT, BODY_ZONE_PRECISE_R_FOOT)) + //We will round to this value in damage calculations. #define DAMAGE_PRECISION 0.1 diff --git a/code/__DEFINES/construction/material.dm b/code/__DEFINES/construction/material.dm index f01ea621183c..462e69334ae3 100644 --- a/code/__DEFINES/construction/material.dm +++ b/code/__DEFINES/construction/material.dm @@ -68,7 +68,7 @@ */ #define MATERIAL_NO_EDIBILITY (1<<6) -//Special return values of [/datum/component/material_container/insert_item] +//Special return values of [/datum/material_container/insert_item] /// No material was found inside them item #define MATERIAL_INSERT_ITEM_NO_MATS -1 /// The container does not have the space for the item diff --git a/code/__DEFINES/construction/structures.dm b/code/__DEFINES/construction/structures.dm index e48dc078ca4b..874978a8cc9e 100644 --- a/code/__DEFINES/construction/structures.dm +++ b/code/__DEFINES/construction/structures.dm @@ -1,12 +1,12 @@ //Defines for construction states //ai core defines -#define EMPTY_CORE 0 -#define CIRCUIT_CORE 1 -#define SCREWED_CORE 2 -#define CABLED_CORE 3 -#define GLASS_CORE 4 -#define AI_READY_CORE 5 +#define CORE_STATE_EMPTY 0 +#define CORE_STATE_CIRCUIT 1 +#define CORE_STATE_SCREWED 2 +#define CORE_STATE_CABLED 3 +#define CORE_STATE_GLASSED 4 +#define CORE_STATE_FINISHED 5 //girder construction states #define GIRDER_NORMAL 0 diff --git a/code/__DEFINES/crafting.dm b/code/__DEFINES/crafting.dm index 8bf1d73d0b8b..7a2097d14076 100644 --- a/code/__DEFINES/crafting.dm +++ b/code/__DEFINES/crafting.dm @@ -26,16 +26,16 @@ #define CRAFT_ON_SOLID_GROUND (1<<4) /// If the craft checks that there are objects with density in the same turf when being built #define CRAFT_CHECK_DENSITY (1<<5) -/// If the created atom will gain custom mat datums -#define CRAFT_APPLIES_MATS (1<<6) /// Crafting passes reagents of components to the finished product -#define CRAFT_TRANSFERS_REAGENTS (1<<7) +#define CRAFT_TRANSFERS_REAGENTS (1<<6) /// Crafting clears all reagents present in the finished product -#define CRAFT_CLEARS_REAGENTS (1<<8) -/// For the crafting unit test, ensures that the custom materials of an item are the same when crafted and spawned. -#define CRAFT_ENFORCE_MATERIALS_PARITY (1<<9) +#define CRAFT_CLEARS_REAGENTS (1<<7) +/// For the crafting unit test, we don't check if the custom materials of an item are the same when crafted and spawned should its recipe have this flag. +#define CRAFT_SKIP_MATERIALS_PARITY (1<<8) /// Exclusive to the personal_crafting component, skips the time spent crafting the recipe. -#define CRAFT_IGNORE_DO_AFTER (1<<10) +#define CRAFT_IGNORE_DO_AFTER (1<<9) +/// This craft won't change the materials of the resulting item to match that of the combined components +#define CRAFT_NO_MATERIALS (1<<10) //food/drink crafting defines //When adding new defines, please make sure to also add them to the encompassing list @@ -81,4 +81,4 @@ #define CAT_ENTERTAINMENT "Entertainment" #define CAT_TOOLS "Tools" #define CAT_CULT "Blood Cult" -#define CAT_TZIMISCE "Tzimisce" //DARKPACK EDIT ADD +#define CAT_TZIMISCE "Tzimisce" // DARKPACK EDIT ADD diff --git a/code/__DEFINES/dcs/declarations.dm b/code/__DEFINES/dcs/declarations.dm index f5be9fbc6d36..d6517601a355 100644 --- a/code/__DEFINES/dcs/declarations.dm +++ b/code/__DEFINES/dcs/declarations.dm @@ -68,6 +68,7 @@ #define CALTROP_SILENT (1 << 2) #define CALTROP_NOSTUN (1 << 3) #define CALTROP_NOCRAWL (1 << 4) +#define CALTROP_ANTS (1 << 5) //Ingredient type in datum/component/ingredients_holder #define CUSTOM_INGREDIENT_TYPE_EDIBLE 1 diff --git a/code/__DEFINES/dcs/signals/signals_action.dm b/code/__DEFINES/dcs/signals/signals_action.dm index 514a88b2bead..fe57adae363a 100644 --- a/code/__DEFINES/dcs/signals/signals_action.dm +++ b/code/__DEFINES/dcs/signals/signals_action.dm @@ -57,3 +57,6 @@ /// From /datum/action/vehicle/ridden/wheelchair/bell/Trigger(): #define COMSIG_WHEELCHAIR_BELL_RANG "wheelchair_bell_rang" + +/// From /datum/action/cooldown/spell/touch/lay_on_hands/proc/determine_if_this_hurts_instead(), sent to the /mob/living/carbon/hurtguy: (/mob/living/carbon/mendicant) +#define COMSIG_ON_LAY_ON_HANDS "mob_ability_lay_on_hands" 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 bf1f2eff3ab8..16c3fb9eb12f 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm @@ -14,7 +14,7 @@ #define COMPONENT_NO_AFTERATTACK (1<<0) ///from base of atom/attack_hulk(): (/mob/living/carbon/human) #define COMSIG_ATOM_HULK_ATTACK "hulk_attack" -///from base of atom/animal_attack(): (/mob/user) +///from base of atom/animal_attack(): (/mob/user, list/modifiers) #define COMSIG_ATOM_ATTACK_ANIMAL "attack_animal" //from base of atom/attack_basic_mob(): (/mob/user) #define COMSIG_ATOM_ATTACK_BASIC_MOB "attack_basic_mob" @@ -43,16 +43,18 @@ #define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" ///from base of atom/attack_hand(): (mob/user, list/modifiers) #define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" -///from base of atom/attack_paw(): (mob/user) +///from base of atom/attack_paw(): (mob/user, list/modifiers) #define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" ///from base of atom/mech_melee_attack(): (obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) #define COMSIG_ATOM_ATTACK_MECH "atom_attack_mech" -/// from base of atom/attack_robot(): (mob/user) +/// from base of atom/attack_robot(): (mob/user, list/modifiers) #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 base of atom/attack_ai(): (mob/user, params) #define COMSIG_ATOM_ATTACK_AI "atom_attack_ai" +/// from base of atom/attack_larva(): (mob/user, list/modifiers) +#define COMSIG_ATOM_ATTACK_LARVA "atom_attack_larva" ///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) @@ -72,3 +74,10 @@ /// 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" + +/// Called from [/mob/living/proc/send_item_attack_message()]: (obj/item/weapon, /mob/living/victim, mob/living/attacker) +#define COMSIG_SEND_ITEM_ATTACK_MESSAGE_OBJECT "send_item_attack_message_object" +/// Called from [/mob/living/proc/send_item_attack_message()]: (mob/living/victim, obj/item/weapon, mob/living/user) +#define COMSIG_SEND_ITEM_ATTACK_MESSAGE_CARBON "send_item_attack_message_carbon" + /// Return value if the hitby messages are changed. + #define SIGNAL_MESSAGE_MODIFIED (1<<0) 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 522a5b72f559..b6cc94584beb 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -9,6 +9,8 @@ #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/examine(): (/mob, list/examine_text) +#define COMSIG_CARBON_MID_EXAMINE "carbon_mid_examine" ///from base of atom/examine_tags(): (/mob, list/examine_tags) #define COMSIG_ATOM_EXAMINE_TAGS "atom_examine_tags" ///from base of atom/get_examine_name(): (/mob, list/overrides) @@ -76,9 +78,6 @@ #define COMSIG_ATOM_BUMPED "atom_bumped" ///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) -#define COMSIG_ATOM_CANREACH "atom_can_reach" - #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/process_item, list/atom/results) @@ -135,9 +134,6 @@ ///cancel clean #define COMSIG_ATOM_CANCEL_CLEAN (1<<0) -/// From /obj/item/stack/make_item() -#define COMSIG_ATOM_CONSTRUCTED "atom_constructed" - /// From /obj/effect/particle_effect/sparks/proc/sparks_touched(datum/source, atom/movable/singed) #define COMSIG_ATOM_TOUCHED_SPARKS "atom_touched_sparks" #define COMSIG_ATOM_TOUCHED_HAZARDOUS_SPARKS "atom_touched_hazardous_sparks" 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 0b7329127264..33fad5b5309a 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 @@ -14,7 +14,7 @@ #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" -///from base of atom/bullet_act(): (/obj/proj, def_zone, piercing_hit, blocked) +///from base of atom/bullet_act(): (/obj/proj, def_zone, piercing_hit) #define COMSIG_ATOM_PRE_BULLET_ACT "pre_atom_bullet_act" /// All this does is prevent default bullet on_hit from being called, [BULLET_ACT_HIT] being return is implied #define COMPONENT_BULLET_ACTED (1<<0) @@ -24,8 +24,8 @@ #define COMPONENT_BULLET_PIERCED (1<<2) ///from base of atom/bullet_act(): (/obj/proj, def_zone, piercing_hit, blocked) #define COMSIG_ATOM_BULLET_ACT "atom_bullet_act" -///from base of atom/on_craft_completion(): (components, datum/crafting_recipe/current_recipe) -#define COMSIG_ATOM_ON_CRAFT "atom_checkparts" +///from base of atom/on_craft_completion(): (components, datum/crafting_recipe/current_recipe, atom/crafter) +#define COMSIG_ATOM_ON_CRAFT "atom_on_craft_completion" ///from base of atom/used_in_craft(): (atom/result) #define COMSIG_ATOM_USED_IN_CRAFT "atom_used_in_craft" ///from base of atom/blob_act(): (/obj/structure/blob) diff --git a/code/__DEFINES/dcs/signals/signals_bitrunning.dm b/code/__DEFINES/dcs/signals/signals_bitrunning.dm index fcce7ea68d0c..ccf47c226044 100644 --- a/code/__DEFINES/dcs/signals/signals_bitrunning.dm +++ b/code/__DEFINES/dcs/signals/signals_bitrunning.dm @@ -41,7 +41,7 @@ /// from /obj/machienry/quantum_server/station_spawn() #define COMSIG_BITRUNNER_STATION_SPAWN "bitrunner_station_spawn" -/// from /obj/machinery/quantum_server/stock_gear(): (mob/living/carbon/human/avatar, external_load_flags) +/// from /obj/machinery/quantum_server/stock_gear(): (mob/living/carbon/human/avatar, domain_flags) #define COMSIG_BITRUNNER_STOCKING_GEAR "bitrunner_stocking_gear" // Ladder diff --git a/code/__DEFINES/dcs/signals/signals_food.dm b/code/__DEFINES/dcs/signals/signals_food.dm index 1ab582428b7a..9dca9d304d08 100644 --- a/code/__DEFINES/dcs/signals/signals_food.dm +++ b/code/__DEFINES/dcs/signals/signals_food.dm @@ -2,9 +2,14 @@ //Food // Eating stuff +/// From datum/component/edible/proc/TakeBite: (atom/owner) +#define COMSIG_LIVING_EAT_FOOD "food_bit" /// From datum/component/edible/proc/TakeBite: (mob/living/eater, mob/feeder, bitecount, bitesize) #define COMSIG_FOOD_EATEN "food_eaten" #define DESTROY_FOOD (1<<0) +/// From datum/component/edible/proc/AttemptEat: (mob/living/eater, mob/feeder) +#define COMSIG_FOOD_ATTEMPT_EAT "food_attempt_eat" + // #define BLOCK_EAT_ATTEMPT (1<<0) /// From base of datum/component/edible/on_entered: (mob/crosser, bitecount) #define COMSIG_FOOD_CROSSED "food_crossed" /// From base of Component/edible/On_Consume: (mob/living/eater, mob/living/feeder) @@ -72,6 +77,9 @@ ///Sent to the newly spawned object when it's baked in an oven. #define COMSIG_ITEM_BAKED_RESULT "item_baked_result" +/// From /datum/element/basic_eating/finish_eating() : (mob/living/eater, mob/living/feeder) +#define COMSIG_ITEM_EATEN_BY_BASIC_MOB "item_eaten_by_basic_mob" + ///Called on the result spawned during decomposition: (obj/decomposed) #define COMSIG_OBJ_DECOMPOSITION_RESULT "obj_decomposition_result" diff --git a/code/__DEFINES/dcs/signals/signals_heretic.dm b/code/__DEFINES/dcs/signals/signals_heretic.dm index fb76b312316f..14fe7a51e535 100644 --- a/code/__DEFINES/dcs/signals/signals_heretic.dm +++ b/code/__DEFINES/dcs/signals/signals_heretic.dm @@ -16,3 +16,11 @@ /// For [/datum/status_effect/protective_blades] to signal when it is triggered #define COMSIG_BLADE_BARRIER_TRIGGERED "blade_barrier_triggered" + +/// at the end of determine_drafted_knowledge +#define COMSIG_HERETIC_SHOP_SETUP "heretic_shop_finished" + +/// called on the antagonist datum, upgrades the passive to level 2 +#define COMSIG_HERETIC_PASSIVE_UPGRADE_FIRST "heretic_passive_upgrade_first" +/// called on the antagonist datum, upgrades the passive to level 3 +#define COMSIG_HERETIC_PASSIVE_UPGRADE_FINAL "heretic_passive_upgrade_final" diff --git a/code/__DEFINES/dcs/signals/signals_lasertag.dm b/code/__DEFINES/dcs/signals/signals_lasertag.dm new file mode 100644 index 000000000000..ac7fd7c05b52 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_lasertag.dm @@ -0,0 +1,13 @@ +///Sending this signal will return either BLOCK_FIRE bitflag or ALLOW_FIRE bitflag +#define COMSIG_LIVING_FIRING_PIN_CHECK "lasertag_firing_pin_check" + ///blocks the lasertag firing pin from authorizing the shot + #define BLOCK_FIRE (1 << 0) + ///allows the lasertag firing pin to authorize the shot + #define ALLOW_FIRE (1 << 1) + +///Neutral Lasertag team +#define LASERTAG_TEAM_NEUTRAL "neutral" +///Red Lasertag team +#define LASERTAG_TEAM_RED "red" +///Blue Lasertag team +#define LASERTAG_TEAM_BLUE "blue" diff --git a/code/__DEFINES/dcs/signals/signals_lockable_storage.dm b/code/__DEFINES/dcs/signals/signals_lockable_storage.dm new file mode 100644 index 000000000000..1c770ef257f4 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_lockable_storage.dm @@ -0,0 +1,4 @@ +// /datum/component/lockable_storage signals + +///from base of /datum/component/lockable_storage/proc/set_lock_code(new_code): (obj/source, new_code) +#define COMSIG_LOCKABLE_STORAGE_SET_CODE "lockable_storage_set_code" diff --git a/code/__DEFINES/dcs/signals/signals_material_container.dm b/code/__DEFINES/dcs/signals/signals_material_container.dm index 2c77be55c315..f5faf4b9a677 100644 --- a/code/__DEFINES/dcs/signals/signals_material_container.dm +++ b/code/__DEFINES/dcs/signals/signals_material_container.dm @@ -1,14 +1,14 @@ //Material Container Signals -/// Called from datum/component/material_container/proc/can_hold_material() : (mat) +/// Called from datum/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() : (target_item, user) +/// Called from datum/material_container/proc/user_insert() : (target_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() : (item, primary_mat, mats_consumed, material_amount, context) +/// Called from datum/material_container/proc/insert_item() : (item, primary_mat, mats_consumed, material_amount, context) #define COMSIG_MATCONTAINER_ITEM_CONSUMED "matcontainer_item_consumed" -/// Called from datum/component/material_container/proc/retrieve_sheets() : (new_sheets, context) -#define COMSIG_MATCONTAINER_SHEETS_RETRIEVED "matcontainer_sheets_retrieved" +/// Called from datum/material_container/proc/retrieve_stack() : (new_stack, context) +#define COMSIG_MATCONTAINER_STACK_RETRIEVED "matcontainer_stack_retrieved" //mat container signals but from the ore silo's perspective /// Called from /obj/machinery/ore_silo/on_item_consumed() : (container, item_inserted, last_inserted_id, mats_consumed, amount_inserted) diff --git a/code/__DEFINES/dcs/signals/signals_medical.dm b/code/__DEFINES/dcs/signals/signals_medical.dm index 39bcb1d7cdde..de3814adb4a0 100644 --- a/code/__DEFINES/dcs/signals/signals_medical.dm +++ b/code/__DEFINES/dcs/signals/signals_medical.dm @@ -1,11 +1,11 @@ -/// From /datum/surgery/New(): (datum/surgery/surgery, surgery_location (body zone), obj/item/bodypart/targeted_limb) -#define COMSIG_MOB_SURGERY_STARTED "mob_surgery_started" - -/// From /datum/surgery/Destroy(): (surgery_type, surgery_location, obj/item/bodypart/targeted_limb) -#define COMSIG_MOB_SURGERY_FINISHED "mob_surgery_finished" - -/// 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 /datum/surgery_operation/try_perform(): (datum/surgery_operation/operation, atom/movable/operating_on, tool) +#define COMSIG_LIVING_SURGERY_STARTED "mob_surgery_started" +/// From /datum/surgery_operation/try_perform(): (datum/surgery_operation/operation, atom/movable/operating_on, tool) +#define COMSIG_LIVING_SURGERY_FINISHED "mob_surgery_finished" +/// From /datum/surgery_operation/success(): (datum/surgery_operation/operation, atom/movable/operating_on, tool) +#define COMSIG_LIVING_SURGERY_SUCCESS "mob_surgery_step_success" +/// From /datum/surgery_operation/failure(): (datum/surgery_operation/operation, atom/movable/operating_on, tool) +#define COMSIG_LIVING_SURGERY_FAILED "mob_surgery_step_failed" /// 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" @@ -19,7 +19,7 @@ /// From /obj/item/shockpaddles/proc/do_disarm(), sent to the shock-ee in non-revival scenarios: (obj/item/shockpaddles/source) #define COMSIG_HEARTATTACK_DEFIB "heartattack_defib" -/// From /datum/surgery/can_start(): (mob/source, datum/surgery/surgery, mob/living/patient) -#define COMSIG_SURGERY_STARTING "surgery_starting" - #define COMPONENT_CANCEL_SURGERY (1<<0) - #define COMPONENT_FORCE_SURGERY (1<<1) +/// Sent from /mob/living/perform_surgery: (mob/living/patient, list/possible_operations) +#define COMSIG_LIVING_OPERATING_ON "living_operating_on" +/// Sent from /mob/living/perform_surgery: (mob/living/patient, list/possible_operations) +#define COMSIG_LIVING_BEING_OPERATED_ON "living_being_operated_on" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm index 01df92ebcc25..83084005dd51 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm @@ -28,3 +28,8 @@ #define COMSIG_BASICMOB_MUTATED "basicmob_mutated" ///cancel further mutation modifications to the mob such as shiny mutation. #define MUTATED_NO_FURTHER_MUTATIONS (1 << 0) + +/// from /mob/living/basic/raptor/proc/change_growth_stage() : (new_stage, prev_stage) +#define COMSIG_RAPTOR_GROWTH_STAGE_CHANGE "raptor_growth_stage_change" + /// Cancel raptor growth + #define COMPONENT_CANCEL_RAPTOR_GROWTH (1<<0) 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 655968cfa0e7..bcdecbfd1a31 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -19,7 +19,7 @@ #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) +#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, destroying) ///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) @@ -60,8 +60,6 @@ /// Called from bodypart being removed /obj/item/bodypart/proc/drop_limb(mob/living/carbon/old_owner, special, dismembered) #define COMSIG_BODYPART_REMOVED "bodypart_removed" -///from base of mob/living/carbon/soundbang_act(): (list(intensity)) -#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" ///from /item/organ/proc/Insert() (/obj/item/organ/) #define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ" ///from /item/organ/proc/Remove() (/obj/item/organ/) @@ -99,8 +97,8 @@ #define COMSIG_CARBON_MOOD_UPDATE "carbon_mood_update" ///Called when a carbon attempts to eat (eating) #define COMSIG_CARBON_ATTEMPT_EAT "carbon_attempt_eat" - // Prevents the breath - #define COMSIG_CARBON_BLOCK_EAT (1 << 0) + // Prevents eating the food + #define BLOCK_EAT_ATTEMPT (1 << 0) ///Called when a carbon vomits : (distance, force) #define COMSIG_CARBON_VOMITED "carbon_vomited" ///Called from apply_overlay(cache_index, overlay) @@ -182,3 +180,19 @@ //from base of [/obj/effect/particle_effect/fluid/smoke/proc/smoke_mob]: (seconds_per_tick) #define COMSIG_CARBON_EXPOSED_TO_SMOKE "carbon_exposed_to_smoke" + +/// From /mob/living/carbon/human/proc/update_mob_height() : (old_height) +#define COMSIG_HUMAN_HEIGHT_UPDATED "human_height_updated" + +/// From /mob/living/carbon/proc/can_defib() : () +/// Return a defib result flag to override default defib brain check +#define COMSIG_CARBON_DEFIB_BRAIN_CHECK "carbon_defib_brain_check" + +/// From /mob/living/carbon/human/proc/defib_check() : () +/// Return a defib result flag to override default defib heart check +#define COMSIG_CARBON_DEFIB_HEART_CHECK "carbon_defib_heart_check" + +/// From /mob/living/carbon/human/proc/smart_equip_targeted(): (mob/living/carbon/human/user, obj/item/possible_container) +#define COMSIG_HUMAN_NON_STORAGE_HOTKEY "human_storage_hotkey" + /// Return to prevent the storage fail message + #define COMPONENT_STORAGE_HOTKEY_HANDLED (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index 514f95db14af..78d7fe2ffa9c 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -16,10 +16,15 @@ #define COMSIG_ORGAN_SURGICALLY_INSERTED "organ_surgically_inserted" /// Called when an organ finishes inserting into a bodypart (obj/item/bodypart/limb, movement_flags) #define COMSIG_ORGAN_BODYPART_INSERTED "organ_bodypart_inserted" +/// Called when a organ's damage is adjusted apply_organ_damage (damage_amount, maximum, required_organ_flag) +#define COMSIG_ORGAN_ADJUST_DAMAGE "organ_adjust_damage" ///Called when movement intent is toggled. #define COMSIG_MOVE_INTENT_TOGGLED "move_intent_toggled" +/// Called when combat mode is toggled. +#define COMSIG_COMBAT_MODE_TOGGLED "combat_mode_toggled" + ///from base of mob/update_transform() #define COMSIG_LIVING_POST_UPDATE_TRANSFORM "living_post_update_transform" @@ -193,6 +198,9 @@ #define TREAT_TTS_FILTER_ARG 3 #define TREAT_CAPITALIZE_MESSAGE 4 +/// From mob/living/send_speech(): (atom/source, list/listeners) +#define COMSIG_LIVING_SEND_SPEECH "living_send_speech" + ///From obj/item/toy/crayon/spraycan #define COMSIG_LIVING_MOB_PAINTED "living_mob_painted" @@ -210,6 +218,10 @@ #define COMSIG_LIVING_SHAPESHIFTED "living_shapeshifted" /// From /datum/status_effect/shapechange_mob/after_unchange(): (mob/living/caster) #define COMSIG_LIVING_UNSHAPESHIFTED "living_unshapeshifted" +// DARKPACK EDIT ADD START +/// From /datum/status_effect/shapechange_mob/after_unchange(): (mob/living/old_mob) +#define COMSIG_LIVING_RETURNED_FROM_SHAPESHIFT "living_return_from_shapeshift" +// DARKPACK EDIT ADD END ///From /obj/effect/rune/convert/do_sacrifice() : (list/invokers) #define COMSIG_LIVING_CULT_SACRIFICED "living_cult_sacrificed" @@ -314,6 +326,10 @@ /// From /obj/machinery/gibber/startgibbing(): (mob/living/user, /obj/machinery/gibber, list/results) #define COMSIG_LIVING_GIBBER_ACT "living_gibber_act" +/// From /mob/living/get_eye_protection() (list/reflist) +#define COMSIG_LIVING_GET_EAR_PROTECTION "living_get_ear_protection" + #define EAR_PROTECTION_ARG 1 + /// Sent to the mob when their mind is slaved #define COMSIG_MOB_ENSLAVED_TO "mob_enslaved_to" /// From /obj/item/proc/attack_atom: (mob/living/attacker, atom/attacked, list/modifiers) @@ -334,14 +350,6 @@ /// From /obj/item/book/bible/attack() : (mob/living/user, obj/item/book/bible/bible, bless_result) #define COMSIG_LIVING_BLESSED "living_blessed" -/// From /datum/surgery_step/initiate() : (mob/living/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, datum/surgery_step/step, list/modifiers) -#define COMSIG_LIVING_INITIATE_SURGERY_STEP "living_initiate_surgery_step" -#define COMSIG_LIVING_SURGERY_STEP_INITIATED_ON "living_surgery_step_initiated_on" - /// Index in modifiers containing the modifier to failure chance - #define FAIL_PROB_INDEX 1 - /// Index in modifiers containing the modifer to surgery speed - #define SPEED_MOD_INDEX 2 - /// From /datum/status_effect/proc/on_creation() : (datum/status_effect/effect) #define COMSIG_LIVING_STATUS_APPLIED "living_status_applied" @@ -361,3 +369,17 @@ #define COMSIG_LIVING_DROP_LOOT "living_drop_loot" /// Prevent loot from being dropped #define COMPONENT_NO_LOOT_DROP (1<<0) +/// From /datum/element/death_drops/on_death(mob/living/target, gibbed) : (list/loot, gibbed) +#define COMSIG_LIVING_DROPPED_LOOT "living_dropped_loot" + +/// From /mob/living/proc/mob_pickup() : (mob/living/user, obj/item/mob_holder/holder) +#define COMSIG_LIVING_SCOOPED_UP "living_scooped_up" + +/// From /mob/living/proc/update_blood_status(), sent when the return value of /mob/living/proc/can_have_blood() changes : (had_blood, has_blood, old_blood_volume, new_blood_volume) +#define COMSIG_LIVING_UPDATE_BLOOD_STATUS "living_update_blood_status" + +/// From /mob/living/proc/update_nutrition() +#define COMSIG_LIVING_UPDATE_NUTRITION "living_update_nutrition" + +/// Sent to a mob when one of their bodypart's surgery state changes, OR sent from the basic_surgery_state holder when its surgery state changes (old_state, new_state, changed_states) +#define COMSIG_LIVING_UPDATING_SURGERY_STATE "carbon_updating_surgery_state" 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 c9f9b283271d..2db139bceedf 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -1,6 +1,3 @@ -///Called on user, from base of /datum/strippable_item/perform_alternate_action() (atom/target, action_key) -#define COMSIG_TRY_ALT_ACTION "try_alt_action" - #define COMPONENT_CANT_ALT_ACTION (1<<0) ///Called on /basic when updating its speed, from base of /mob/living/basic/update_basic_mob_varspeed(): () #define POST_BASIC_MOB_UPDATE_VARSPEED "post_basic_mob_update_varspeed" ///from base of /mob/Login(): () @@ -15,6 +12,8 @@ #define COMSIG_MOB_REAGENT_TICK "mob_reagent_tick" ///stops the reagent check call #define COMSIG_MOB_STOP_REAGENT_TICK (1<<0) + ///Allows for most on_life calls BUT metabolize() + #define COMSIG_MOB_STOP_REAGENT_METABOLISM (1<<1) ///from base of mob/clickon(): (atom/A, list/modifiers) #define COMSIG_MOB_CLICKON "mob_clickon" ///from base of mob/MiddleClickOn(): (atom/A) @@ -82,6 +81,8 @@ ///signal sent when a mob has their holy role set. Sent to the mob having their role changed. #define COMSIG_MOB_MIND_SET_HOLY_ROLE "mob_mind_set_holy_role" +///signal sent when a mob has their job role set. Sent to the mob having their role changed. +#define COMSIG_MOB_MIND_SET_ROLE "mob_mind_set_role" ///from base of obj/allowed(mob/M): (/obj) returns ACCESS_ALLOWED if mob has id access to the obj #define COMSIG_MOB_TRIED_ACCESS "tried_access" @@ -227,12 +228,12 @@ ///from living/flash_act(), when a mob is successfully flashed. #define COMSIG_MOB_FLASHED "mob_flashed" -/// from /obj/item/assembly/flash/flash_carbon, to the mob being flashed +/// from /obj/item/assembly/flash/flash_mob, to the mob being flashed #define COMSIG_MOB_FLASH_OVERRIDE_CHECK "mob_flash_override_check" /// Has the flash effect been overridden? #define FLASH_OVERRIDDEN (1<<0) /// from /obj/item/assembly/flash/flash_carbon, to the mob flashing another carbon -#define COMSIG_MOB_PRE_FLASHED_CARBON "mob_pre_flashed_carbon" +#define COMSIG_MOB_PRE_FLASHED_MOB "mob_pre_flashed_mob" /// Return to override deviation to be full deviation (fail the flash, usually) #define DEVIATION_OVERRIDE_FULL (1<<0) /// Return to override deviation to be partial deviation @@ -241,9 +242,9 @@ #define DEVIATION_OVERRIDE_NONE (1<<2) /// Return to stop the flash entirely #define STOP_FLASH (1<<3) -/// from /obj/item/assembly/flash/flash_carbon, to the mob flashing another carbon +/// from /obj/item/assembly/flash/flash_mob, to the mob flashing another carbon /// (mob/living/carbon/flashed, obj/item/assembly/flash/flash, deviation (from code/__DEFINES/mobs.dm)) -#define COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON "mob_success_flashed_carbon" +#define COMSIG_MOB_SUCCESSFUL_FLASHED_MOB "mob_success_flashed_mob" /// from mob/get_status_tab_items(): (list/items) #define COMSIG_MOB_GET_STATUS_TAB_ITEMS "mob_get_status_tab_items" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm index 564465dfcf2b..f68b08402059 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm @@ -8,10 +8,6 @@ #define COMSIG_BORG_HUG_HANDLED 1 ///called from /mob/living/silicon/attack_hand proc #define COMSIG_MOB_PAT_BORG "mob_pat_borg" -///called when someone is inquiring about an AI's linked core -#define COMSIG_SILICON_AI_CORE_STATUS "AI_core_status" - #define COMPONENT_CORE_ALL_GOOD (1<<0) - #define COMPONENT_CORE_DISCONNECTED (1<<1) ///called when an AI (malf or perhaps combat upgraded or some other circumstance that has them inhabit ///an APC) enters an APC #define COMSIG_SILICON_AI_OCCUPY_APC "AI_occupy_apc" diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index d09d74c50987..487872df0536 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -17,6 +17,9 @@ #define COMSIG_LIONHUNTER_ON_HIT "lionhunter_on_hit" +/// from /datum/component/subtype_picker/pick_subtype(): (obj/item/old_item, mob/picker) +#define COMSIG_ITEM_SUBTYPE_PICKER_SELECTED "item_subtype_picker_selected" + // /obj/machinery signals ///from /obj/machinery/atom_break(damage_flag): (damage_flag) @@ -145,6 +148,8 @@ #define COMSIG_ITEM_DRIED "item_dried" ///from base of obj/item/dropped(): (mob/user) #define COMSIG_ITEM_DROPPED "item_drop" +///a mob has just dropped an item +#define COMSIG_MOB_DROPPED_ITEM "mob_dropped_item" ///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) @@ -154,6 +159,19 @@ ///from base of datum/storage/handle_exit(): (datum/storage/storage) #define COMSIG_ITEM_UNSTORED "item_unstored" +/** + * From base of datum/strippable_item/get_alternate_actions(): (atom/owner, mob/user, list/alt_actions) + * As a side note, make sure the strippable item datum (the slot) in question doesn't have too many alternate actions already, + * as only up to three are supported at a time (as of september 2025), though, so far only the jumpsuit slot uses all three slots. + * + * Also make sure to code the alt action and add it to the StripMenu.tsx interface + */ +#define COMSIG_ITEM_GET_STRIPPABLE_ALT_ACTIONS "item_get_strippable_alt_actions" + +/// From base of datum/strippable_item/perform_alternate_action(): (atom/owner, mob/user, action_key) +#define COMSIG_ITEM_STRIPPABLE_ALT_ACTION "item_strippable_alt_action" + #define COMPONENT_ALT_ACTION_DONE (1<<0) + ///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) @@ -208,6 +226,8 @@ #define COMSIG_MULTITOOL_REMOVE_BUFFER "multitool_remove_buffer" ///from [/obj/effect/mine/proc/triggermine]: #define COMSIG_MINE_TRIGGERED "minegoboom" +///from [/obj/structure/closet/supplypod/proc/handleReturnAfterDeparting]: +#define COMSIG_SUPPLYPOD_RETURNING "supplypodgohome" ///from [/obj/structure/closet/supplypod/proc/preOpen]: #define COMSIG_SUPPLYPOD_LANDED "supplypodgoboom" @@ -359,7 +379,7 @@ #define COMPONENT_CANCEL_SAWING_OFF (1<<0) #define COMSIG_GUN_SAWN_OFF "gun_sawn_off" -///called in /obj/item/firing_pin/proc/gun_insert(mob/living/user, obj/item/gun/new_gun): (obj/item/firing_pin/pin, mob/living/user) +///called in /obj/item/firing_pin/proc/gun_insert(mob/living/user, obj/item/gun/new_gun, starting): (obj/item/firing_pin/pin, mob/living/user, starting) #define COMSIG_GUN_PIN_INSERTED "gun_pin_inserted" ///called in /obj/item/firing_pin/proc/gun_remove(mob/living/user): (obj/item/firing_pin/pin, mob/living/user) @@ -483,13 +503,17 @@ #define COMSIG_ITEM_ATTACK_SELF_SECONDARY "item_attack_self_secondary" ///from base of obj/item/attack_atom(): (/atom, /mob, list/modifiers) #define COMSIG_ITEM_ATTACK_ATOM "item_attack_atom" -///from base of obj/item/pre_attack(): (atom/target, mob/user, list/modifiers) +///from base of obj/item/pre_attack(): (atom/target, mob/user, list/modifiers, list/attack_modifiers) #define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" +///from base of obj/item/pre_attack(): (obj/item/weapon, atom/target, list/modifiers, list/attack_modifiers) +#define COMSIG_USER_PRE_ITEM_ATTACK "user_pre_item_attack" /// From base of [/obj/item/proc/pre_attack_secondary()]: (atom/target, mob/user, list/modifiers, list/attack_modifiers) #define COMSIG_ITEM_PRE_ATTACK_SECONDARY "item_pre_attack_secondary" #define COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN (1<<0) #define COMPONENT_SECONDARY_CONTINUE_ATTACK_CHAIN (1<<1) #define COMPONENT_SECONDARY_CALL_NORMAL_ATTACK_CHAIN (1<<2) +///from base of obj/item/pre_attack_secondary(): (obj/item/weapon, atom/target, list/modifiers, list/attack_modifiers) +#define COMSIG_USER_PRE_ITEM_ATTACK_SECONDARY "user_pre_item_attack_secondary" /// From base of [/obj/item/proc/attack_secondary()]: (atom/target, mob/user, list/modifiers, list/attack_modifiers) #define COMSIG_ITEM_ATTACK_SECONDARY "item_attack_secondary" ///from base of [obj/item/attack()]: (atom/target, mob/user, proximity_flag, list/modifiers) @@ -518,7 +542,7 @@ #define COMSIG_SPEED_POTION_APPLIED "speed_potion" #define SPEED_POTION_STOP (1<<0) -/// from /obj/item/detective_scanner/scan(): (mob/user, list/extra_data) +/// from /obj/item/detective_scanner/scan(): (mob/user, datum/detective_scanner_log/entry) #define COMSIG_DETECTIVE_SCANNED "det_scanned" /// from /obj/plunger_act when an object is being plungered @@ -615,3 +639,9 @@ /// Sent from /obj/machinert/console/camera_advanced/attack_hand() : (mob/eye/camera/remote/new_camera) #define COMSIG_ADVANCED_CAMERA_EYE_CREATED "advanced_camera_eye_created" + +/// Sent from /obj/item/mob_holder/purple_raptor/proc/toggle_wings() : (mob/living/carbon/human/user) +#define COMSIG_RAPTOR_WINGS_OPENED "raptor_wings_opened" + +/// Sent from /obj/item/mob_holder/purple_raptor/proc/toggle_wings() : (mob/living/carbon/human/user) +#define COMSIG_RAPTOR_WINGS_CLOSED "raptor_wings_closed" diff --git a/code/__DEFINES/dcs/signals/signals_shuttle.dm b/code/__DEFINES/dcs/signals/signals_shuttle.dm index 69aa13c39003..1f4f596fc74d 100644 --- a/code/__DEFINES/dcs/signals/signals_shuttle.dm +++ b/code/__DEFINES/dcs/signals/signals_shuttle.dm @@ -9,3 +9,9 @@ //from base of /proc/expand_shuttle() : (list/turfs) #define COMSIG_SHUTTLE_EXPANDED "shuttle_expanded" + +//from base of /turf/fromShuttleMove() : (turf/new_turf, move_mode) +#define COMSIG_SHUTTLE_TURF_SHOULD_MOVE_SPECIAL "shuttle_turf_should_move_special" + +//from base of /obj/docking_port/mobile/proc/takeoff() : (turf/new_turf, movement_force, movement_direction, /obj/docking_port/stationary/old_dock, /obj/docking_port/mobile/shuttle) +#define COMSIG_SHUTTLE_TURF_ON_MOVE_SPECIAL "shuttle_turf_on_move_special" diff --git a/code/__DEFINES/dcs/signals/signals_status_effect.dm b/code/__DEFINES/dcs/signals/signals_status_effect.dm new file mode 100644 index 000000000000..917f5dffc9af --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_status_effect.dm @@ -0,0 +1,2 @@ +/// From /datum/status_effect/fire_handler/fire_stacks/tick() +#define COMSIG_FIRE_STACKS_UPDATED "fire_stacks_updated" diff --git a/code/__DEFINES/dcs/signals/signals_storage.dm b/code/__DEFINES/dcs/signals/signals_storage.dm index 26459ab4dad3..98fc78018504 100644 --- a/code/__DEFINES/dcs/signals/signals_storage.dm +++ b/code/__DEFINES/dcs/signals/signals_storage.dm @@ -5,6 +5,11 @@ /// Sent after dumping into some other storage object: (atom/dest_object, mob/user) #define COMSIG_STORAGE_DUMP_POST_TRANSFER "storage_dump_into_storage" +/// Sent before storing an item (obj/item/being_stored, mob/user, force, messages) +#define COMSIG_ATOM_PRE_STORED_ITEM "atom_pre_storing_item" + /// Return to block the item from being stored. + #define BLOCK_STORAGE_INSERT (1<<0) + /// Fired off the storage's PARENT when an ITEM is STORED INSIDE. (obj/item, mob, force) #define COMSIG_ATOM_STORED_ITEM "atom_storing_item" diff --git a/code/__DEFINES/dcs/signals/signals_techweb.dm b/code/__DEFINES/dcs/signals/signals_techweb.dm index 7765bfe5a3a6..ce0b5bc3f45f 100644 --- a/code/__DEFINES/dcs/signals/signals_techweb.dm +++ b/code/__DEFINES/dcs/signals/signals_techweb.dm @@ -3,3 +3,6 @@ /// Called when a techweb design is removed (datum/design/removed_design, custom) #define COMSIG_TECHWEB_REMOVE_DESIGN "techweb_remove_design" + +/// Called when an experiment is completed (datum/experiment/completed_experiment,) +#define COMSIG_TECHWEB_EXPERIMENT_COMPLETED "techweb_experiment_completed" diff --git a/code/__DEFINES/dcs/signals/signals_tools.dm b/code/__DEFINES/dcs/signals/signals_tools.dm index 110db1ed89c1..a3cc381b97e5 100644 --- a/code/__DEFINES/dcs/signals/signals_tools.dm +++ b/code/__DEFINES/dcs/signals/signals_tools.dm @@ -5,3 +5,10 @@ #define COMSIG_TOOL_ATOM_ACTED_PRIMARY(tooltype) "tool_atom_acted_[tooltype]" ///Called from /atom/proc/tool_act (atom) #define COMSIG_TOOL_ATOM_ACTED_SECONDARY(tooltype) "tool_atom_acted_[tooltype]" + +//Called when a tool attempts to pry open an airlock. Called from /obj/machinery/door/airlock/try_to_crowbar +#define COMSIG_TOOL_FORCE_OPEN_AIRLOCK "tool_force_open_airlock" + //If this value is returned, prevents the airlock from being forced open. + #define COMPONENT_TOOL_DO_NOT_ALLOW_FORCE_OPEN (1<<0) + //If this value is returned, it means the tool successfully opened the airlock without interruption + #define COMPONENT_TOOL_ALLOW_FORCE_OPEN (1<<1) diff --git a/code/__DEFINES/directional.dm b/code/__DEFINES/directional.dm index 83d8ce01d0a8..37ec9abd49d9 100644 --- a/code/__DEFINES/directional.dm +++ b/code/__DEFINES/directional.dm @@ -45,3 +45,25 @@ dir = WEST; \ pixel_x = -offset; \ } + +/// Create diagonal subtypes for a path to simplify mapping. +#define MAPPING_DIAGONAL_HELPERS(path, offset) ##path/directional/northeast {\ + dir = NORTHEAST; \ + pixel_x = offset; \ + pixel_y = offset; \ +} \ +##path/directional/northwest {\ + dir = NORTHWEST; \ + pixel_x = -offset; \ + pixel_y = offset; \ +} \ +##path/directional/southeast {\ + dir = SOUTHEAST; \ + pixel_x = offset; \ + pixel_y = -offset; \ +} \ +##path/directional/southwest {\ + dir = SOUTHWEST; \ + pixel_x = -offset; \ + pixel_y = -offset; \ +} diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm index a1108ba7fb0f..a44bc26079ec 100644 --- a/code/__DEFINES/economy.dm +++ b/code/__DEFINES/economy.dm @@ -81,3 +81,18 @@ #define MARKET_TREND_STABLE 0 #define MARKET_EVENT_PROBABILITY 8 //Probability of a market event firing, in percent. Fires once per material, every stock market tick. + +// Fair warning that these defines at present are not used in all tgui, static descriptions, or any varible names or comments +/// The symbol for the default type of money used in the code. +#define MONEY_SYMBOL "cr" +/// The name for the default type of money used in the code. +#define MONEY_NAME "credits" +#define MONEY_NAME_SINGULAR "credit" +#define MONEY_NAME_CAPITALIZED "Credits" +// Due to the ways macros work, I cant just directly use credit\s. +// You will need to verify there is no loose use cases of credit\s. +// As of present there is none left floating around. +#define MONEY_NAME_AUTOPURAL(amount) "credit[##amount == 1 ? "" : "s"]" + +#define MONEY_MINING_SYMBOL "mp" +#define MONEY_BITRUNNING_SYMBOL "np" diff --git a/code/__DEFINES/experisci.dm b/code/__DEFINES/experisci.dm index c74290ff5f75..a1ffbc0b4b84 100644 --- a/code/__DEFINES/experisci.dm +++ b/code/__DEFINES/experisci.dm @@ -39,3 +39,5 @@ #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) +/// Experiment handlers with this flag will announce when an experiment is completed even if it isn't compatible with them. +#define EXPERIMENT_CONFIG_ALWAYS_ANNOUNCE (1 << 4) diff --git a/code/__DEFINES/files.dm b/code/__DEFINES/files.dm new file mode 100644 index 000000000000..6f0d36727a38 --- /dev/null +++ b/code/__DEFINES/files.dm @@ -0,0 +1,11 @@ +// None of these should be trusted for the purpose of user input +// They do not check the actual type of the file, a user could just rename it + +/// File types we can sniff the duration from using rustg. +#define IS_SOUND_FILE_SAFE(file) is_file_type_in_list(##file, SSsounds.safe_formats) + +#define IS_SOUND_FILE(file) is_file_type_in_list(##file, SSsounds.byond_sound_formats) + +#define IS_OGG_FILE(file) is_file_type(##file, "ogg") +#define IS_WAV_FILE(file) is_file_type(##file, "wav") +#define IS_MP3_FILE(file) is_file_type(##file, "mp3") diff --git a/code/__DEFINES/fish.dm b/code/__DEFINES/fish.dm index 825315e24b88..e3ab4ba5bd10 100644 --- a/code/__DEFINES/fish.dm +++ b/code/__DEFINES/fish.dm @@ -61,6 +61,8 @@ #define FISHING_LINE_STIFF (1 << 2) ///Skip the biting phase and go straight to the fishing phase. #define FISHING_LINE_AUTOREEL (1 << 3) +///Allow the fishing line to be cast through dense objects and walls +#define FISHING_LINE_PHASE (1 << 4) ///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 << 0) @@ -182,9 +184,9 @@ #define GET_FISH_WEIGHT_RANK(weighty) max(round(1 + log(2, max(weighty/FISH_WEIGHT_FORCE_DIVISOR, 1)), 1), 1) ///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.33 +#define NEW_FISH_BREEDING_TIMEOUT_MULT 0.6 +///The last feeding timestamp of newly instantiated fish is multiplied by this. +#define NEW_FISH_LAST_FEEDING_MULT 0.33 //Their hunger meter starts at 33% ///If get_hunger is above this value, the fish is considered to be starving and will slowly lose health because of it #define FISH_STARVING_THRESHOLD 1 diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index 69f18887193f..0d8c3e09cd53 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -121,7 +121,7 @@ DEFINE_BITFIELD(foodtypes, list( #define FOOD_COMPLEXITY_5 5 /// Labels for food quality -GLOBAL_LIST_INIT(food_quality_description, list( +GLOBAL_ALIST_INIT(food_quality_description, alist( FOOD_QUALITY_NORMAL = "okay", FOOD_QUALITY_NICE = "nice", FOOD_QUALITY_GOOD = "good", @@ -131,19 +131,8 @@ GLOBAL_LIST_INIT(food_quality_description, list( 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, -)) - /// Weighted lists of crafted food buffs randomly given according to crafting_complexity unless the food has a specific buff -GLOBAL_LIST_INIT(food_buffs, list( +GLOBAL_ALIST_INIT(food_buffs, alist( FOOD_COMPLEXITY_1 = list( /datum/status_effect/food/haste = 1, ), @@ -180,7 +169,7 @@ GLOBAL_LIST_INIT(food_buffs, list( // DARKPACK EDIT ADD START - FOOD //Food has state to swap to upon first bite #define FOOD_BITE_SPRITE (1<<4) -// DARKPACK EDIT ADD +// DARKPACK EDIT ADD END DEFINE_BITFIELD(food_flags, list( "FOOD_FINGER_FOOD" = FOOD_FINGER_FOOD, diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm index 366a4d17b1b3..2d55c09ff08d 100644 --- a/code/__DEFINES/footsteps.dm +++ b/code/__DEFINES/footsteps.dm @@ -17,7 +17,7 @@ //misc footstep sounds #define FOOTSTEP_GENERIC_HEAVY "heavy" -// DARKPACK EDIT ADD START +// DARKPACK EDIT ADD START - WALLS #define FOOTSTEP_PARKET "parket" #define FOOTSTEP_ASPHALT "asphalt" #define FOOTSTEP_TRAVA "trava" @@ -107,23 +107,23 @@ GLOBAL_LIST_INIT(footstep, list( 'sound/effects/footstep/catwalk3.ogg', 'sound/effects/footstep/catwalk4.ogg', 'sound/effects/footstep/catwalk5.ogg'), 100, 1), - FOOTSTEP_PARKET = list(list( // DARKPACK EDIT ADD START - 'modular_darkpack/modules/deprecated/sounds/parket1.ogg', - 'modular_darkpack/modules/deprecated/sounds/parket2.ogg', - 'modular_darkpack/modules/deprecated/sounds/parket3.ogg'), 75, 1), + FOOTSTEP_PARKET = list(list( // DARKPACK EDIT ADD START - WALLS + 'modular_darkpack/modules/walls/sounds/parket1.ogg', + 'modular_darkpack/modules/walls/sounds/parket2.ogg', + 'modular_darkpack/modules/walls/sounds/parket3.ogg'), 75, 1), FOOTSTEP_ASPHALT = list(list( - 'modular_darkpack/modules/deprecated/sounds/asphalt1.ogg', - 'modular_darkpack/modules/deprecated/sounds/asphalt2.ogg'), 75, 1), + 'modular_darkpack/modules/walls/sounds/asphalt1.ogg', + 'modular_darkpack/modules/walls/sounds/asphalt2.ogg'), 75, 1), FOOTSTEP_SNOW = list(list( - 'modular_darkpack/modules/deprecated/sounds/snow2.ogg'), 10, 1), + 'modular_darkpack/modules/walls/sounds/snow2.ogg'), 10, 1), FOOTSTEP_TRAVA = list(list( - 'modular_darkpack/modules/deprecated/sounds/trava1.ogg', - 'modular_darkpack/modules/deprecated/sounds/trava2.ogg', - 'modular_darkpack/modules/deprecated/sounds/trava3.ogg'), 75, 1), + 'modular_darkpack/modules/walls/sounds/trava1.ogg', + 'modular_darkpack/modules/walls/sounds/trava2.ogg', + 'modular_darkpack/modules/walls/sounds/trava3.ogg'), 75, 1), FOOTSTEP_SIDEWALK = list(list( - 'modular_darkpack/modules/deprecated/sounds/sidewalk1.ogg', - 'modular_darkpack/modules/deprecated/sounds/sidewalk2.ogg', - 'modular_darkpack/modules/deprecated/sounds/sidewalk3.ogg'), 75, 1), // DARKPACK EDIT ADD END + 'modular_darkpack/modules/walls/sounds/sidewalk1.ogg', + 'modular_darkpack/modules/walls/sounds/sidewalk2.ogg', + 'modular_darkpack/modules/walls/sounds/sidewalk3.ogg'), 75, 1), // DARKPACK EDIT ADD END )) //bare footsteps lists @@ -168,7 +168,7 @@ GLOBAL_LIST_INIT(barefootstep, list( 'sound/effects/footstep/lava3.ogg'), 100, 0), FOOTSTEP_MEAT = list(list( 'sound/effects/meatslap.ogg'), 100, 0), - FOOTSTEP_PARKET = list(list( // DARKPACK EDIT ADD START + FOOTSTEP_PARKET = list(list( // DARKPACK EDIT ADD START - WALLS 'sound/effects/footstep/woodbarefoot1.ogg', 'sound/effects/footstep/woodbarefoot2.ogg', 'sound/effects/footstep/woodbarefoot3.ogg', @@ -181,12 +181,12 @@ GLOBAL_LIST_INIT(barefootstep, list( 'sound/effects/footstep/hardbarefoot4.ogg', 'sound/effects/footstep/hardbarefoot5.ogg'), 75, 1), FOOTSTEP_SNOW = list(list( - 'modular_darkpack/modules/deprecated/sounds/snow1.ogg', - 'modular_darkpack/modules/deprecated/sounds/snow2.ogg'), 75, 1), + 'modular_darkpack/modules/walls/sounds/snow1.ogg', + 'modular_darkpack/modules/walls/sounds/snow2.ogg'), 75, 1), FOOTSTEP_TRAVA = list(list( - 'modular_darkpack/modules/deprecated/sounds/trava1.ogg', - 'modular_darkpack/modules/deprecated/sounds/trava2.ogg', - 'modular_darkpack/modules/deprecated/sounds/trava3.ogg'), 75, 1), + 'modular_darkpack/modules/walls/sounds/trava1.ogg', + 'modular_darkpack/modules/walls/sounds/trava2.ogg', + 'modular_darkpack/modules/walls/sounds/trava3.ogg'), 75, 1), FOOTSTEP_SIDEWALK = list(list( 'sound/effects/footstep/hardbarefoot1.ogg', 'sound/effects/footstep/hardbarefoot2.ogg', diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index c8f0a9b66b5a..5ebb322a6668 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -200,6 +200,9 @@ #define ui_ghost_language_menu "SOUTH: 6, CENTER+4:22" #define ui_ghost_floor_changer "SOUTH: 6, CENTER+4:7" +//Voidwalker +#define ui_voidwalker_left_of_hands "CENTER+-2:16,SOUTH+0:5" + //Blobbernauts #define ui_blobbernaut_overmind_health "EAST-1:28,CENTER+0:19" diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index 7ba6b4a3cef7..e00866c95e20 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -140,12 +140,11 @@ DEFINE_BITFIELD(smoothing_junction, list( #define SMOOTH_GROUP_HIEROPHANT S_TURF(61) ///turf/closed/indestructible/riveted/hierophant #define SMOOTH_GROUP_PLASTINUM_WALLS S_TURF(62) ///turf/closed/indestructible/riveted/plastinum -// DARKPACK EDIT START +// DARKPACK EDIT CHANGE START - WALLS #define SMOOTH_GROUP_CITY_WALL S_TURF(63) ///turf/closed/wall/vampwall -#define SMOOTH_GROUP_CITY_LOW_WALL S_TURF(64) ///turf/closed/wall/vampwall/low -#define MAX_S_TURF 64 //Always match this value with the one above it. -// DARKPACK EDIT END +#define MAX_S_TURF 63 //Always match this value with the one above it. +// DARKPACK EDIT CHANGE END #define S_OBJ(num) ("-" + #num + ",") @@ -192,8 +191,8 @@ DEFINE_BITFIELD(smoothing_junction, list( // DARKPACK EDIT START #define SMOOTH_GROUP_REINFORCED_TABLES S_OBJ(57) ///obj/structure/table/reinforced -#define SMOOTH_GROUP_BACO_TABLES S_OBJ(58) ///obj/structure/table/bacotell -#define SMOOTH_GROUP_BUB_TABLES S_OBJ(59) ///obj/structure/table/bubway +#define SMOOTH_GROUP_BACO_TABLES S_OBJ(58) ///obj/structure/table/countertop/bacotell +#define SMOOTH_GROUP_BUB_TABLES S_OBJ(59) ///obj/structure/table/countertop/bubway // DARKPACK EDIT END #define SMOOTH_GROUP_ALIEN_NEST S_OBJ(60) ///obj/structure/bed/nest @@ -231,10 +230,15 @@ DEFINE_BITFIELD(smoothing_junction, list( #define SMOOTH_GROUP_PLATFORMS_PIZZA S_OBJ(85) ///obj/structure/platform/pizza #define SMOOTH_GROUP_PLATFORMS_PAPER S_OBJ(86) ///obj/structure/platform/paper +#define SMOOTH_GROUP_BOULDER_PLATFORM S_OBJ(87) ///obj/structure/lattice/catwalk/boulder + // DARKPACK EDIT START -#define SMOOTH_GROUP_VENTS S_OBJ(87) ///obj/structure/roofstuff/vent/autotiling -#define SMOOTH_GROUP_SPILL S_OBJ(88) ///obj/effect/decal/cleanable/gasoline +#define SMOOTH_GROUP_VENTS S_OBJ(88) ///obj/structure/roofstuff/vent/autotiling +#define SMOOTH_GROUP_SPILL S_OBJ(89) ///obj/effect/decal/cleanable/gasoline + +#define SMOOTH_GROUP_COLOR_COUNTERTOP S_OBJ(90) ///obj/structure/table/countertop/(color) // DARKPACK EDIT END +#define SMOOTH_GROUP_CITY_LOW_WALL S_TURF(91) ///obj/structure/platform/lowwall // DARKPACK EDIT ADD - WALLS /// Performs the work to set smoothing_groups and canSmoothWith. /// An inlined function used in both turf/Initialize and atom/Initialize. diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 1c7b6a41f846..acb817510127 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -19,8 +19,9 @@ //Inventory depth: limits how many nested storage items you can access directly. //1: stuff in mob, 2: stuff in backpack, 3: stuff in box in backpack, etc -#define INVENTORY_DEPTH 3 -#define STORAGE_VIEW_DEPTH 2 +#define REACH_DEPTH_SELF 1 +/// A storage depth ontop of SELF. REACH_DEPTH_STORAGE(1) would allow an item inside of a backpack you are carrying. +#define REACH_DEPTH_STORAGE(level) (level + REACH_DEPTH_SELF) //ITEM INVENTORY SLOT BITMASKS /// Suit slot (armors, costumes, space suits, etc.) @@ -215,7 +216,7 @@ GLOBAL_LIST_INIT(any_suit_storage, typecacheof(list( /obj/item/radio, /obj/item/storage/bag/books, /obj/item/storage/fancy/cigarettes, - /obj/item/tank/jetpack/oxygen/captain, + /obj/item/tank/jetpack/captain, /obj/item/stack/spacecash, /obj/item/storage/wallet, /obj/item/folder, @@ -288,6 +289,8 @@ GLOBAL_LIST_INIT(chaplain_suit_allowed, list( /obj/item/tank/internals/plasmaman, /obj/item/gun/ballistic/bow/divine, /obj/item/gun/ballistic/revolver/chaplain, + /obj/item/toy/plush/carpplushie/nullrod, + /obj/item/melee/energy/sword/nullrod, )) //Allowed list for all mining suits diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 27e038bc7132..48e9e09cdb0e 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -175,6 +175,8 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list( #define is_simian(A) (isgorilla(A) || ismonkey(A)) +#define isstargazer(A) (istype(A, /mob/living/basic/heretic_summon/star_gazer)) + /// returns whether or not the atom is either a basic mob OR simple animal #define isanimal_or_basicmob(A) (istype(A, /mob/living/simple_animal) || istype(A, /mob/living/basic)) @@ -350,3 +352,4 @@ GLOBAL_LIST_INIT(book_types, typecacheof(list( #define is_multi_tile_object(atom) (atom.bound_width > ICON_SIZE_X || atom.bound_height > ICON_SIZE_Y) #define is_area_nearby_station(checked_area) (istype(checked_area, /area/space) || istype(checked_area, /area/space/nearstation) || istype(checked_area, /area/station/asteroid)) +#define is_area_virtual(checked_area) (GLOB.virtual_areas && GLOB.virtual_areas[(checked_area).type]) diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 4a90ce567fa1..c5c663c130dc 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -9,6 +9,23 @@ /// Checks for character age. #define JOB_UNAVAILABLE_AGE 7 +// DARKPACK EDIT ADD START + +/// Checks for character species. +#define JOB_UNAVAILABLE_SPECIES 8 +/// Checks if the job has available species slots. +#define JOB_UNAVAILABLE_SPECIES_SLOTS 9 +/// Checks for character whitelist. +#define JOB_UNAVAILABLE_WHITELIST 10 +/// Checks for character kindred age. +#define JOB_UNAVAILABLE_KINDRED_AGE 11 +/// Checks for character kindred generation. +#define JOB_UNAVAILABLE_KINDRED_GENERATION 12 +/// Checks for character clan. +#define JOB_UNAVAILABLE_KINDRED_CLAN 13 + +// DARKPACK EDIT ADD END + /// 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." @@ -203,6 +220,7 @@ #define DEPARTMENT_BITFLAG_CAPTAIN (1<<9) #define DEPARTMENT_CAPTAIN "Captain" +/* // DARKPACK EDIT REMOVAL START - JOBS DEFINE_BITFIELD(departments_bitflags, list( "SECURITY" = DEPARTMENT_BITFLAG_SECURITY, "COMMAND" = DEPARTMENT_BITFLAG_COMMAND, @@ -215,6 +233,7 @@ DEFINE_BITFIELD(departments_bitflags, list( "ASSISTANT" = DEPARTMENT_BITFLAG_ASSISTANT, "CAPTAIN" = DEPARTMENT_BITFLAG_CAPTAIN, )) +*/ // DARKPACK EDIT REMOVAL END /* Job datum job_flags */ /// Whether the mob is announced on arrival. @@ -265,7 +284,7 @@ DEFINE_BITFIELD(job_flags, list( )) /// 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 STATION_JOB_FLAGS (JOB_ANNOUNCE_ARRIVAL|JOB_CREW_MANIFEST|JOB_EQUIP_RANK|JOB_CREW_MEMBER|JOB_HIDE_WHEN_EMPTY|JOB_LATEJOIN_ONLY|JOB_CANNOT_OPEN_SLOTS|JOB_REOPEN_ON_ROUNDSTART_LOSS|JOB_ASSIGN_QUIRKS|JOB_CAN_BE_INTERN) // DARKPACK EDIT, ORIGINAL: #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) /// Combination flag for jobs which are considered heads of staff. #define HEAD_OF_STAFF_JOB_FLAGS (JOB_BOLD_SELECT_TEXT|JOB_CANNOT_OPEN_SLOTS|JOB_HEAD_OF_STAFF) /// Combination flag for jobs which are enabled by station traits. @@ -285,3 +304,5 @@ DEFINE_BITFIELD(job_flags, list( /// Mind traits that should be shared by every head of staff. has to be this way cause byond lists lol #define HEAD_OF_STAFF_MIND_TRAITS TRAIT_FAST_TYING, TRAIT_HIGH_VALUE_RANSOM +#define MEDICAL_MIND_TRAITS TRAIT_DESENSITIZED +#define SECURITY_MIND_TRAITS TRAIT_DESENSITIZED diff --git a/code/__DEFINES/jukebox.dm b/code/__DEFINES/jukebox.dm new file mode 100644 index 000000000000..29b4cdea7c9f --- /dev/null +++ b/code/__DEFINES/jukebox.dm @@ -0,0 +1,4 @@ +#define CONFIG_JUKEBOX_SOUNDS "[global.config.directory]/jukebox_music/sounds/" + +#define JUKEBOX_NAME 1 +#define JUKEBOX_BEATS 2 diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index d3679e4ad3c7..cc7c34c1f3a6 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -159,6 +159,9 @@ // NOTICE: we break from the pattern of increasing in steps of like 0.01 here // Because TOPDOWN_LAYER is 10000 and that's enough to floating point our modifications away +/// Used to shift all topdown layer emissives to a the game plane equivalent layers, as otherwise they render above everything else due to being KEEP_APART +#define TOPDOWN_TO_EMISSIVE_LAYER(layer) LERP(FLOOR_EMISSIVE_START_LAYER, FLOOR_EMISSIVE_END_LAYER, (layer - (TOPDOWN_LAYER + 1)) / TOPDOWN_LAYER_COUNT) + // Must be equal to the offset of the highest topdown layer #define TOPDOWN_LAYER_COUNT 18 @@ -223,6 +226,7 @@ #define DOOR_ACCESS_HELPER_LAYER 2.71 //keep this above OPEN_DOOR_LAYER, special layer used for /obj/effect/mapping_helpers/airlock/access #define DOOR_HELPER_LAYER 2.72 //keep this above DOOR_ACCESS_HELPER_LAYER and OPEN_DOOR_LAYER since the others tend to have tiny sprites that tend to be covered up. #define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible +#define PLATFORM_LAYER 2.78 // DARKPACK EDIT ADD - (Allows tables to be placed ontop of platforms (but please dont)) #define TABLE_LAYER 2.8 #define GIB_LAYER 2.85 // sit on top of tables, but below machines #define BELOW_OBJ_LAYER 2.9 @@ -375,4 +379,4 @@ /// We expect at most 3 layers of multiz /// Increment this define if you make a huge map. We unit test for it too just to make it easy for you /// If you modify this, you'll need to modify the tsx file too -#define MAX_EXPECTED_Z_DEPTH 3 +#define MAX_EXPECTED_Z_DEPTH 5 // DARKPACK EDIT CHANGE - Our max is only 4 but I expect downstreams to need extra diff --git a/code/__DEFINES/living.dm b/code/__DEFINES/living.dm index 920b80544452..ac2cb64efaee 100644 --- a/code/__DEFINES/living.dm +++ b/code/__DEFINES/living.dm @@ -12,9 +12,15 @@ #define STOP_OVERLAY_UPDATE_BODY_PARTS (1<<2) /// Nutrition changed last life tick, so we should bulk update this tick #define QUEUE_NUTRITION_UPDATE (1<<3) +/// Blood volume has changed since the last [proc/update_blood_effects] call +#define QUEUE_BLOOD_UPDATE (1<<4) +/// This mob can have blood, cached value of [proc/can_have_blood] +#define LIVING_CAN_HAVE_BLOOD (1<<5) /// Getter for a mob/living's lying angle, otherwise protected #define GET_LYING_ANGLE(mob) (UNLINT(mob.lying_angle)) +/// Checks if the mob can have blood +#define CAN_HAVE_BLOOD(mob) (mob.living_flags & LIVING_CAN_HAVE_BLOOD) // Used in living mob offset list for determining pixel offsets #define PIXEL_W_OFFSET "w" diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 62e7cee425a8..1e83d480488f 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -51,6 +51,7 @@ #define LOG_RADIO_EMOTE (1 << 20) #define LOG_SPEECH_INDICATORS (1 << 21) #define LOG_TRANSPORT (1 << 22) +#define LOG_STATS (1 << 23) // DARKPACK EDIT ADD - logging stats to prevent abuse //Individual logging panel pages #define INDIVIDUAL_GAME_LOG (LOG_GAME) @@ -114,6 +115,7 @@ #define LOG_CATEGORY_TRANSPORT "transport" #define LOG_CATEGORY_VIRUS "virus" #define LOG_CATEGORY_CAVE_GENERATION "cave-generation" +#define LOG_CATEGORY_STATS "stats" // DARKPACK EDIT ADD - logging stats to prevent abuse // Admin categories #define LOG_CATEGORY_ADMIN "admin" diff --git a/code/__DEFINES/magic.dm b/code/__DEFINES/magic.dm index ecc470c04e90..a44f8d9a59fa 100644 --- a/code/__DEFINES/magic.dm +++ b/code/__DEFINES/magic.dm @@ -90,6 +90,8 @@ DEFINE_BITFIELD(spell_requirements, list( /// Holy magic resistance that blocks unholy magic (revenant, vampire, voice of god) #define MAGIC_RESISTANCE_HOLY (1<<2) +#define ALL_MAGIC_RESISTANCE (MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND|MAGIC_RESISTANCE_HOLY) + DEFINE_BITFIELD(antimagic_flags, list( "MAGIC_RESISTANCE" = MAGIC_RESISTANCE, "MAGIC_RESISTANCE_HOLY" = MAGIC_RESISTANCE_HOLY, diff --git a/code/__DEFINES/map_switch.dm b/code/__DEFINES/map_switch.dm index dbb0059786ee..90ac0b78a986 100644 --- a/code/__DEFINES/map_switch.dm +++ b/code/__DEFINES/map_switch.dm @@ -3,6 +3,10 @@ // or if map tools ever agree on a standard, this should switch to use that. #ifdef CBT #define MAP_SWITCH(compile_time, map_time) ##compile_time +#define WHEN_MAP(map_time) // Not mapping, nothing here +#define WHEN_COMPILE(compile_time) ##compile_time #else #define MAP_SWITCH(compile_time, map_time) ##map_time +#define WHEN_MAP(map_time) ##map_time +#define WHEN_COMPILE(compile_time) // Not compiling, nothing here #endif diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 37c3695bf481..6b89c1e6f7d4 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -251,6 +251,7 @@ Always compile, always use that verb, and always make sure that it works for wha #define AWAYSTART_SNOWCABIN "AWAYSTART_SNOWCABIN" #define AWAYSTART_SNOWDIN "AWAYSTART_SNOWDIN" #define AWAYSTART_UNDERGROUND "AWAYSTART_UNDERGROUND" +#define AWAYSTART_HERETIC "AWAYSTART_HERETIC" // Minetypes for maps #define MINETYPE_NONE "none" diff --git a/code/__DEFINES/melee.dm b/code/__DEFINES/melee.dm index c6bfbcddc76a..7762381d0e96 100644 --- a/code/__DEFINES/melee.dm +++ b/code/__DEFINES/melee.dm @@ -4,7 +4,7 @@ #define MARTIALART_CQC "CQC" #define MARTIALART_EVIL_BOXING "evil boxing" #define MARTIALART_HUNTER_BOXING "hunter boxing" -#define MARTIALART_KRAVMAGA "krav maga" +#define MARTIALART_KAZA_RUK "Kaza Ruk" #define MARTIALART_MUSHPUNCH "mushroom punch" #define MARTIALART_PLASMAFIST "plasma fist" #define MARTIALART_PSYCHOBRAWL "psychotic brawling" diff --git a/code/__DEFINES/mob_spawn.dm b/code/__DEFINES/mob_spawn.dm index 6e9fec3bed05..a54ca7993075 100644 --- a/code/__DEFINES/mob_spawn.dm +++ b/code/__DEFINES/mob_spawn.dm @@ -2,3 +2,12 @@ #define CORPSE_INSTANT 1 ///this mob spawn creates the corpse during GAME_STATE_PLAYING #define CORPSE_ROUNDSTART 2 + +// Flags for using your static for a ghost role +/// Ghost role will take on the player's species +#define GHOSTROLE_TAKE_PREFS_SPECIES (1<<0) +/// Ghost role will take on the player's apperance (though exlcuding name) +#define GHOSTROLE_TAKE_PREFS_APPEARANCE (1<<1) + +/// Return from create to stop the spawn process. Falsy value so one can just check !create() +#define CANCEL_SPAWN FALSE diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index eff22d9d6e01..fb6b0f802a9c 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -3,8 +3,8 @@ //Misc mob defines //Ready states at roundstart for mob/dead/new_player -#define PLAYER_NOT_READY 0 -#define PLAYER_READY_TO_PLAY 1 +#define PLAYER_NOT_READY "Not Ready" +#define PLAYER_READY_TO_PLAY "Ready" //movement intent defines for the move_intent var #define MOVE_INTENT_WALK "walk" @@ -125,6 +125,8 @@ #define MOB_MINING (1 << 13) ///The mob is a crustacean. Like crabs. Or lobsters. #define MOB_CRUSTACEAN (1 << 14) +///The mob is all boney +#define MOB_SKELETAL (1 << 15) //Lung respiration type flags #define RESPIRATION_OXYGEN (1 << 0) @@ -161,6 +163,8 @@ #define BODYSHAPE_DIGITIGRADE (1<<2) ///The limb is snouted. #define BODYSHAPE_SNOUTED (1<<3) +/// Golem's wacky rocky limbs +#define BODYSHAPE_GOLEM (1<<4) #define BODYTYPE_BIOSCRAMBLE_INCOMPATIBLE (BODYTYPE_ROBOTIC | BODYTYPE_LARVA_PLACEHOLDER | BODYTYPE_GOLEM | BODYTYPE_PEG) #define BODYTYPE_CAN_BE_BIOSCRAMBLED(bodytype) (!(bodytype & BODYTYPE_BIOSCRAMBLE_INCOMPATIBLE)) @@ -193,7 +197,7 @@ #define SPECIES_SKELETON "skeleton" #define SPECIES_SNAIL "snail" #define SPECIES_VAMPIRE "vampire" -#define SPECIES_ZOMBIE "zombie" +#define SPECIES_ZOMBIE "rotten2" // DARKPACK EDIT -- Original : #define SPECIES_ZOMBIE "zombie" #define SPECIES_ZOMBIE_INFECTIOUS "memezombie" #define SPECIES_ZOMBIE_KROKODIL "krokodil_zombie" #define SPECIES_VOIDWALKER "voidwalker" @@ -480,7 +484,7 @@ #define REM REAGENTS_EFFECT_MULTIPLIER //! Shorthand for the above define for ease of use in equations and the like // Eye protection -// THese values are additive to determine your overall flash protection. +// These values are additive to determine your overall flash protection. #define FLASH_PROTECTION_HYPER_SENSITIVE -2 #define FLASH_PROTECTION_SENSITIVE -1 #define FLASH_PROTECTION_NONE 0 @@ -489,6 +493,29 @@ #define FLASH_PROTECTION_WELDER_SENSITIVE 3 #define FLASH_PROTECTION_WELDER_HYPER_SENSITIVE 4 +/** + * Ear protection + * These values are additive to determine your overall ear/soundbang protection + */ +#define EAR_PROTECTION_NONE 0 +#define EAR_PROTECTION_NORMAL 1 +#define EAR_PROTECTION_HEAVY 2 +#define EAR_PROTECTION_VACUUM 3 +#define EAR_PROTECTION_FULL INFINITY + +/** + * Soundbang defines + * These values are used as argument to determine the strength of the soundbang_act call + */ +///Soundbang strength for most things like flashbangs, honkblasts and harm control modules +#define SOUNDBANG_NORMAL 1 +///Soundbang strength for things like flashbangs in proximity and emagged harm alarm megaphones, cannot be countered by standard ear protection equipment +#define SOUNDBANG_STRONG 2 +///Soundbang strength for things like changeling shrieks, which can affect robots and aliens as well. +#define SOUNDBANG_MASSIVE 3 +///Soundbang strength for anything that cannot be stopped unless you're stacked on multiple effects and equipment to counter it (or are simply deaf) +#define SOUNDBANG_OVERWHELMING 4 + // AI Toggles #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. @@ -554,9 +581,11 @@ #define DEFIB_FAIL_NO_INTELLIGENCE (1<<8) #define DEFIB_FAIL_BLACKLISTED (1<<9) #define DEFIB_NOGRAB_AGHOST (1<<10) +#define DEFIB_FAIL_GOLEM (1<<11) +#define DEFIB_FAIL_STAKED (1<<12) // DARKPACK EDIT ADD // Bit mask of possible return values by can_defib that would result in a revivable patient -#define DEFIB_REVIVABLE_STATES (DEFIB_FAIL_NO_HEART | DEFIB_FAIL_FAILING_HEART | DEFIB_FAIL_HUSK | DEFIB_FAIL_TISSUE_DAMAGE | DEFIB_FAIL_FAILING_BRAIN | DEFIB_POSSIBLE) +#define DEFIB_REVIVABLE_STATES (DEFIB_FAIL_NO_HEART | DEFIB_FAIL_FAILING_HEART | DEFIB_FAIL_HUSK | DEFIB_FAIL_TISSUE_DAMAGE | DEFIB_FAIL_FAILING_BRAIN | DEFIB_FAIL_GOLEM | DEFIB_POSSIBLE) #define SLEEP_CHECK_DEATH(X, A) \ sleep(X); \ @@ -623,7 +652,7 @@ #define AI_EMOTION_UNSURE "Unsure" #define AI_EMOTION_CONFUSED "Confused" #define AI_EMOTION_SAD "Sad" -#define AI_EMOTION_BSOD "BSOD" +#define AI_EMOTION_BSOD "BSOD" //It is used only on EMP pulse displays. #define AI_EMOTION_BLANK "Blank" #define AI_EMOTION_PROBLEMS "Problems?" #define AI_EMOTION_AWESOME "Awesome" @@ -633,6 +662,8 @@ #define AI_EMOTION_DORFY "Dorfy" #define AI_EMOTION_BLUE_GLOW "Blue Glow" #define AI_EMOTION_RED_GLOW "Red Glow" +#define AI_EMOTION_DEAD "Dead" //This one is used when deactivating the AI +#define AI_EMOTION_DOWNLOAD "Download" // Defines for AI holograms #define AI_HOLOGRAM_CATEGORY_ANIMAL "Animal" @@ -668,8 +699,8 @@ #define GET_TARGETS_FROM(who) (who.targets_from ? who.get_targets_from() : who) //defines for grad_color and grad_styles list access keys -#define GRADIENT_HAIR_KEY 1 -#define GRADIENT_FACIAL_HAIR_KEY 2 +#define GRADIENT_HAIR_KEY "1" +#define GRADIENT_FACIAL_HAIR_KEY "2" // /datum/sprite_accessory/gradient defines #define GRADIENT_APPLIES_TO_HAIR (1<<0) @@ -710,9 +741,7 @@ 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 40 // DARKPACK EDIT CHANGE - Shadows -/// Layer for shadow overlays under mobs -#define UNDERSHADOW_LAYER 39 // DARKPACK EDIT ADD - Shadows +#define TOTAL_LAYERS 39 /// Mutations layer - Tk headglows, cold resistance glow, etc #define MUTATIONS_LAYER 38 /// Mutantrace features (tail when looking south) that must appear behind the body parts @@ -1028,7 +1057,7 @@ GLOBAL_LIST_INIT(layers_to_offset, list( #define MINING_MOB_PROJECTILE_VULNERABILITY list(BRUTE) /// Helper macro that determines if the mob is at the threshold to start vomitting due to high toxin levels -#define AT_TOXIN_VOMIT_THRESHOLD(mob) (mob.getToxLoss() > 45 && mob.nutrition > 20) +#define AT_TOXIN_VOMIT_THRESHOLD(mob) (mob.get_tox_loss() > 45 && mob.nutrition > 20) /// The duration of the flip emote animation #define FLIP_EMOTE_DURATION 0.7 SECONDS diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm index 5760dc5a05fd..8f6aa7a268fb 100644 --- a/code/__DEFINES/mod.dm +++ b/code/__DEFINES/mod.dm @@ -59,6 +59,10 @@ #define GAUNTLET_SEAL_MESSAGE "tighten around your fingers and wrists" #define BOOT_UNSEAL_MESSAGE "relax their grip on your legs" #define BOOT_SEAL_MESSAGE "seal around your feet" +#define GLASSES_UNSEAL_MESSAGE "moves away from your eyes" +#define GLASSES_SEAL_MESSAGE "settle onto your eyes" +#define NECKWEAR_UNSEAL_MESSAGE "looses around your neck" +#define NECKWEAR_SEAL_MESSAGE "tightens around your neck" /// Global list of all /datum/mod_theme GLOBAL_LIST_INIT(mod_themes, setup_mod_themes()) diff --git a/code/__DEFINES/monkeys.dm b/code/__DEFINES/monkeys.dm index f487f805d508..a4929bb84dcb 100644 --- a/code/__DEFINES/monkeys.dm +++ b/code/__DEFINES/monkeys.dm @@ -30,6 +30,8 @@ #define MONKEY_HATRED_AMOUNT 4 /// amount of aggro to add to an enemy when a monkey is recruited #define MONKEY_RECRUIT_HATED_AMOUNT 2 +/// amount of aggro to add if someone stole the food we wanted +#define MONKEY_FOOD_HATRED_AMOUNT 2 /// probability of reducing aggro by one when the monkey attacks #define MONKEY_HATRED_REDUCTION_PROB 20 diff --git a/code/__DEFINES/mood.dm b/code/__DEFINES/mood.dm index 60fadb031c11..0dcdc9340d6b 100644 --- a/code/__DEFINES/mood.dm +++ b/code/__DEFINES/mood.dm @@ -51,7 +51,7 @@ #define TERROR_HANDLER_EFFECT "effect" // Default cooldown for terror messages, to not get spammy -#define TERROR_MESSAGE_CD 30 SECONDS +#define TERROR_MESSAGE_CD 15 SECONDS // Values for terror buildup effects /// Initial value for effects that apply the component from spooking you @@ -75,3 +75,40 @@ #define PANIC_ATTACK_TERROR_AMOUNT 50 /// How much terror being hugged reduces, or increases if its done by a nightmare or someone you're afraid of #define HUG_TERROR_AMOUNT 90 + +/// Cooldown for phobia checks, to avoid constantly refreshing views +#define PHOBIA_CHECK_DELAY 5 SECONDS +/// Delay between phobia freakouts, also the time it takes for the buildup effect to fade away +#define PHOBIA_FREAKOUT_DELAY 12 SECONDS +/// Amount of terror granted whenever we hear a word we're afraid of +#define PHOBIA_WORD_TERROR_BUILDUP 40 +/// Amount of terror granted by each phobia trigger +#define PHOBIA_FREAKOUT_TERROR_BUILDUP 120 + +/// Cooldown for fear screams +#define TERROR_STARTLE_COOLDOWN 12 SECONDS +/// Minimum difference in fear per tick for screams to actually trigger, so we don't proc from minor fears +#define TERROR_STARTLE_MINIMUM_DIFFERENCE 40 + +/// Relates to fear or resisting fear +#define MOOD_EVENT_FEAR (1<<0) +/// Relates to art +#define MOOD_EVENT_ART (1<<1) +/// Relates to being a generally silly guy +#define MOOD_EVENT_WHIMSY (1<<2) +/// Playing games and goofing off +#define MOOD_EVENT_GAMING (1<<3) +/// Relates to food +#define MOOD_EVENT_FOOD (1<<4) +/// Relates to being in pain +#define MOOD_EVENT_PAIN (1<<5) +/// Relates to spirituality +#define MOOD_EVENT_SPIRITUAL (1<<6) + +/// Checks if the mob has the given personality typepath +#define HAS_PERSONALITY(mob, personality) (LAZYACCESS(mob.personalities, personality)) + +/// Return from /be_replaced or /be_refreshed to actually go prevent the new mood event from being added +#define BLOCK_NEW_MOOD FALSE +/// Return from /be_replaced or /be_refreshed to actually go through and allow the new mood event to be added +#define ALLOW_NEW_MOOD TRUE diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 27f1fe87adac..ace8491fe6ac 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -1,20 +1,35 @@ // Flags for the obj_flags var on /obj - +/// Object has been affected by a cryptographic sequencer (EMAG) disabling it or causing other malicious effects #define EMAGGED (1<<0) -#define CAN_BE_HIT (1<<1) //can this be bludgeoned by items? -#define DANGEROUS_POSSESSION (1<<2) //Admin possession yes/no -#define UNIQUE_RENAME (1<<3) // can you customize the description/name of the thing? -#define BLOCK_Z_OUT_DOWN (1<<4) // Should this object block z falling from loc? -#define BLOCK_Z_OUT_UP (1<<5) // Should this object block z uprise from loc? -#define BLOCK_Z_IN_DOWN (1<<6) // Should this object block z falling from above? -#define BLOCK_Z_IN_UP (1<<7) // Should this object block z uprise from below? -#define BLOCKS_CONSTRUCTION (1<<8) //! Does this object prevent things from being built on it? -#define BLOCKS_CONSTRUCTION_DIR (1<<9) //! Does this object prevent same-direction things from being built on it? -#define IGNORE_DENSITY (1<<10) //! Can we ignore density when building on this object? (for example, directional windows and grilles) -#define INFINITE_RESKIN (1<<11) // We can reskin this item infinitely -#define CONDUCTS_ELECTRICITY (1<<12) //! Can this object conduct electricity? -#define NO_DEBRIS_AFTER_DECONSTRUCTION (1<<13) //! Atoms don't spawn anything when deconstructed. They just vanish +/// Can this be bludgeoned by items +#define CAN_BE_HIT (1<<1) +/// Admin possession yes/no +#define DANGEROUS_POSSESSION (1<<2) +/// Can you customize the description/name of the thing +#define UNIQUE_RENAME (1<<3) +/// If it can be renamed, is its description excluded +#define RENAME_NO_DESC (1<<4) +/// Should this object block z falling from loc +#define BLOCK_Z_OUT_DOWN (1<<5) +/// Should this object block z uprise from loc +#define BLOCK_Z_OUT_UP (1<<6) +/// Should this object block z falling from above +#define BLOCK_Z_IN_DOWN (1<<7) +/// Should this object block z uprise from below +#define BLOCK_Z_IN_UP (1<<8) +/// Does this object prevent things from being built on it +#define BLOCKS_CONSTRUCTION (1<<9) +/// Does this object prevent same-direction things from being built on it +#define BLOCKS_CONSTRUCTION_DIR (1<<10) +/// Can we ignore density when building on this object (for example, directional windows and grilles) +#define IGNORE_DENSITY (1<<11) +/// Can this object conduct electricity +#define CONDUCTS_ELECTRICITY (1<<12) +/// Atoms don't spawn anything when deconstructed (they just vanish) +#define NO_DEBRIS_AFTER_DECONSTRUCTION (1<<13) +/// Flag which tells an object to hang onto an support atom on late initialize. Usefull only during mapload and supported by some atoms only +#define MOUNT_ON_LATE_INITIALIZE (1<<14) // If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support @@ -95,6 +110,10 @@ #define HEADINTERNALS (1<<16) /// Prevents masks from getting adjusted from enabling internals #define INTERNALS_ADJUST_EXEMPT (1<<17) +/// Indicates that the piece of clothing contributes towards Sleeping Carp's style factor, which determines evasion probabilities. See /datums/martial/sleeping_carp/carp_style_check(). +#define CARP_STYLE_FACTOR (1<<18) +/// Prevents clothing from losing bodyparts coverage when shredded +#define NO_ZONE_DISABLING (1<<19) /// Integrity defines for clothing (not flags but close enough) #define CLOTHING_PRISTINE 0 // We have no damage on the clothing @@ -119,3 +138,7 @@ #define INCLUDE_POCKETS (1<<0) #define INCLUDE_ACCESSORIES (1<<1) #define INCLUDE_HELD (1<<2) +/// Include prosthetic item limbs (which are not flavoured as being equipped items) +#define INCLUDE_PROSTHETICS (1<<3) +/// Include items that are not "real" items, such as hand items +#define INCLUDE_ABSTRACT (1<<4) diff --git a/code/__DEFINES/plumbing.dm b/code/__DEFINES/plumbing.dm index 432f8ca4357c..2168a0a0cfd8 100644 --- a/code/__DEFINES/plumbing.dm +++ b/code/__DEFINES/plumbing.dm @@ -10,3 +10,8 @@ /// Name of omni color #define DUCT_COLOR_OMNI "omni" + +///IV drip operation mode when it sucks blood from the object +#define IV_TAKING 0 +///IV drip operation mode when it injects reagents into the object +#define IV_INJECTING 1 diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 31465051e152..1ae8403c644f 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -156,8 +156,15 @@ #define SPRITE_ACCESSORY_NONE "None" // Loadout -/// Used to make something not recolorable even if it's capable -#define DONT_GREYSCALE -1 +/// When equipped, applies a job specific palette to the item. Only applicable to GAGS items. +#define LOADOUT_FLAG_JOB_GREYSCALING (1<<0) +/// Prevents GAGS items from being player customizable. +#define LOADOUT_FLAG_BLOCK_GREYSCALING (1<<1) +/// Allows the item to be greyscaled by the player, if it's a GAGS item. Automatically set if the item is innately recolorable. +#define LOADOUT_FLAG_GREYSCALING_ALLOWED (1<<2) +/// Allows the item to be renamed by the player. +#define LOADOUT_FLAG_ALLOW_NAMING (1<<3) + // Loadout item info keys // Changing these will break existing loadouts /// Tracks GAGS color information @@ -173,3 +180,21 @@ #define UPPER_LIP "Upper" #define MIDDLE_LIP "Middle" #define LOWER_LIP "Lower" + +// Job greyscale colors for loadout items +#define COLOR_JOB_ASSISTANT /obj/item/clothing/under/color/grey::greyscale_colors +#define COLOR_JOB_BOTANIST "#33cc33" +#define COLOR_JOB_CARGO_GENERIC "#824b32" +#define COLOR_JOB_CE "#d0d0d0" +#define COLOR_JOB_CHEF "#d0d0d0" +#define COLOR_JOB_CHEMIST "#ff6600" +#define COLOR_JOB_CLOWN "#ffbeff" +#define COLOR_JOB_CMO "#009999" +#define COLOR_JOB_DEFAULT "#303030" +#define COLOR_JOB_ENGI_GENERIC "#ff6600" +#define COLOR_JOB_JANITOR /obj/item/clothing/gloves/color/purple::greyscale_colors +#define COLOR_JOB_LAWYER "#003399" +#define COLOR_JOB_SCI_GENERIC "#800080" +#define COLOR_JOB_SEC_GENERIC "#A53228" +#define COLOR_JOB_MED_GENERIC "#5B97BC" +#define COLOR_JOB_COMMAND_GENERIC "#3C5A96" diff --git a/code/__DEFINES/processing.dm b/code/__DEFINES/processing.dm index 905c03830d51..27f0d2126b11 100644 --- a/code/__DEFINES/processing.dm +++ b/code/__DEFINES/processing.dm @@ -1,3 +1,4 @@ #define TOOL_PROCESSING_RESULT "result" #define TOOL_PROCESSING_AMOUNT "amount" #define TOOL_PROCESSING_TIME "time" +#define TOOL_PROCESSING_SOUND "sound" diff --git a/code/__DEFINES/projectiles.dm b/code/__DEFINES/projectiles.dm index 482520098554..25f553ea7403 100644 --- a/code/__DEFINES/projectiles.dm +++ b/code/__DEFINES/projectiles.dm @@ -31,6 +31,8 @@ /// The caliber used by the desert eagle. #define CALIBER_50AE ".50AE" /// The caliber used by the gyrojet pistol. +#define CALIBER_46 "4.6mm" +/// The caliber used by le funni german PDW #define CALIBER_75 ".75" /// The caliber used by [one revolver variant][/obj/item/gun/ballistic/revolver/nagant]. #define CALIBER_N762 "n762" diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index 582e0d9a4a47..c7a37e7290ec 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -68,6 +68,39 @@ #define RADIO_TOKEN_UPLINK ":z" #define RADIO_COLOR_UPLINK "#8f4a4b" +// DARKPACK EDIT ADD START +#define RADIO_CHANNEL_POLICE "Police" +#define RADIO_KEY_POLICE "s" +#define RADIO_TOKEN_POLICE ":s" +#define RADIO_COLOR_POLICE "#1700e9" + +#define RADIO_CHANNEL_CLINIC "Clinic" +#define RADIO_KEY_CLINIC "m" +#define RADIO_TOKEN_CLINIC ":m" +#define RADIO_COLOR_CLINIC "#05ffea" + +#define RADIO_CHANNEL_MILITARY "Military" +#define RADIO_KEY_MILITARY "a" +#define RADIO_TOKEN_MILITARY ":a" +#define RADIO_COLOR_MILITARY "#35962d" + +#define RADIO_CHANNEL_CAMARILLA "Tower" +#define RADIO_KEY_CAMARILLA "t" +#define RADIO_TOKEN_CAMARILLA ":t" +#define RADIO_COLOR_CAMARILLA "#8b00cc" + +#define RADIO_CHANNEL_ANARCH "Bar" +#define RADIO_KEY_ANARCH "b" +#define RADIO_TOKEN_ANARCH ":b" +#define RADIO_COLOR_ANARCH "#d47100" + +#define RADIO_CHANNEL_ENDRON "Endron" +#define RADIO_KEY_ENDRON "d" +#define RADIO_TOKEN_ENDRON ":d" +#define RADIO_COLOR_ENDRON "#ff4800" + +// DARKPACK EDIT ADD END + #define RADIO_CHANNEL_CTF_RED "Red Team" #define RADIO_COLOR_CTF_RED "#ff0000" #define RADIO_CHANNEL_CTF_BLUE "Blue Team" @@ -116,6 +149,15 @@ #define MAX_FREQ 1489 // ------------------------------------------------------ +// DARKPACK EDIT ADD START +#define FREQ_POLICE 1501 // Police comms frequency, dark blue +#define FREQ_CLINIC 1503 // Clinic comms frequency, light blue +#define FREQ_MILITARY 1505 // Military comms frequency, dark green +#define FREQ_CAMARILLA 1507 // Camarilla comms frequency, purple +#define FREQ_ANARCH 1509 // Anarch comms frequency, dark orange +#define FREQ_ENDRON 1511 // Endron comms frequency, orange +// DARKPACK EDIT ADD END + #define MAX_FREE_FREQ 1599 // ------------------------------------------------- // Transmission types. diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 508080183bc1..f0629886ef27 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -205,6 +205,48 @@ #define REACTION_TAG_PLANT (1<<19) /// This reaction is produces a product that affects plants #define REACTION_TAG_COMPETITIVE (1<<20) +/// Reaction produces a reagent that is a common component for other reactions +#define REACTION_TAG_COMPONENT (1<<21) +/// Denotes reactions that will immediately do something on reaction, like an explosion, smoke, etc. +#define REACTION_TAG_ACTIVE (1<<22) + +/// Readable list of reagent reaction tags (in the same order as they are defined!) +#define REACTION_TAG_READABLE list(\ + "BRUTE" = REACTION_TAG_BRUTE,\ + "BURN" = REACTION_TAG_BURN,\ + "TOXIN" = REACTION_TAG_TOXIN,\ + "OXY" = REACTION_TAG_OXY,\ + "HEALING" = REACTION_TAG_HEALING,\ + "DAMAGING" = REACTION_TAG_DAMAGING,\ + "EXPLOSIVE" = REACTION_TAG_EXPLOSIVE,\ + "OTHER" = REACTION_TAG_OTHER,\ + "DANGEROUS" = REACTION_TAG_DANGEROUS,\ + "EASY" = REACTION_TAG_EASY,\ + "MODERATE" = REACTION_TAG_MODERATE,\ + "HARD" = REACTION_TAG_HARD,\ + "ORGAN" = REACTION_TAG_ORGAN,\ + "DRINK" = REACTION_TAG_DRINK,\ + "FOOD" = REACTION_TAG_FOOD,\ + "SLIME" = REACTION_TAG_SLIME,\ + "DRUG" = REACTION_TAG_DRUG,\ + "UNIQUE" = REACTION_TAG_UNIQUE,\ + "CHEMICAL" = REACTION_TAG_CHEMICAL,\ + "PLANT" = REACTION_TAG_PLANT,\ + "COMPETITIVE" = REACTION_TAG_COMPETITIVE,\ + "COMPONENT" = REACTION_TAG_COMPONENT,\ + "ACTIVE" = REACTION_TAG_ACTIVE,\ +) + +/// Reaction tags for basic damgae types +#define DAMAGE_HEALING_REACTION_TAGS (REACTION_TAG_BRUTE | REACTION_TAG_BURN | REACTION_TAG_TOXIN | REACTION_TAG_OXY) +/// Reaction tags for medication +#define MEDICATION_REACTION_TAGS (REACTION_TAG_HEALING | REACTION_TAG_DAMAGING | REACTION_TAG_ORGAN | REACTION_TAG_DRUG) +/// Reaction tags for things the chemist would make +#define CHEMIST_REACTION_TAGS (REACTION_TAG_EXPLOSIVE | REACTION_TAG_CHEMICAL | REACTION_TAG_COMPETITIVE | REACTION_TAG_EXPLOSIVE | REACTION_TAG_COMPONENT) +/// Reaction tags for botanist stuff +#define BOTANIST_REACTION_TAGS (REACTION_TAG_PLANT | REACTION_TAG_COMPONENT) +/// Reaction tags for food and drink mainly +#define KITCHEN_REACTION_TAGS (REACTION_TAG_FOOD | REACTION_TAG_DRINK | REACTION_TAG_COMPONENT) //flags used by holder.dm to locate an reagent ///Direct type diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm index f3b2cf819489..96a2c74ef8b3 100644 --- a/code/__DEFINES/research.dm +++ b/code/__DEFINES/research.dm @@ -74,11 +74,12 @@ //Defines how many percent of vat grown atoms come out as hue shifted color mutants. A flat chance for now, maybe in the future dependant on the cell line. #define CYTO_SHINY_CHANCE 15 -#define SCIPAPER_COOPERATION_INDEX 1 -#define SCIPAPER_FUNDING_INDEX 2 +#define SCIPAPER_COOPERATION_INDEX "cooperation" +#define SCIPAPER_FUNDING_INDEX "funding" #define SCIENTIFIC_COOPERATION_PURCHASE_MULTIPLIER 0.01 /// How much money is one point of gain worth. #define SCIPAPER_GAIN_TO_MONEY 125 +#define SCIPAPER_ALREADY_BOUGHT 2 ///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. diff --git a/code/__DEFINES/research/anomalies.dm b/code/__DEFINES/research/anomalies.dm index f0dabae02509..b2b39d4d08ce 100644 --- a/code/__DEFINES/research/anomalies.dm +++ b/code/__DEFINES/research/anomalies.dm @@ -8,6 +8,7 @@ #define MAX_CORES_BIOSCRAMBLER 8 #define MAX_CORES_DIMENSIONAL 8 #define MAX_CORES_ECTOPLASMIC 8 +#define MAX_CORES_WEATHER 8 ///Defines for the different types of explosion a flux anomaly can have #define FLUX_NO_EMP 0 diff --git a/code/__DEFINES/research/techweb_nodes.dm b/code/__DEFINES/research/techweb_nodes.dm index 8fcd954e1a66..baf220fda688 100644 --- a/code/__DEFINES/research/techweb_nodes.dm +++ b/code/__DEFINES/research/techweb_nodes.dm @@ -83,6 +83,7 @@ #define TECHWEB_NODE_MOD_ENGI_ADV "mod_engi_adv" #define TECHWEB_NODE_MOD_ENTERTAINMENT "mod_entertainment" #define TECHWEB_NODE_MOD_EQUIP "mod_equip" +#define TECHWEB_NODE_MOD_SERVICE "mod_service" #define TECHWEB_NODE_MOD_EXPERIMENTAL "mod_experimental" #define TECHWEB_NODE_MOD_MEDICAL "mod_medical" #define TECHWEB_NODE_MOD_MEDICAL_ADV "mod_medical_adv" diff --git a/code/__DEFINES/reskin.dm b/code/__DEFINES/reskin.dm new file mode 100644 index 000000000000..250b3959fe22 --- /dev/null +++ b/code/__DEFINES/reskin.dm @@ -0,0 +1,18 @@ +/// Global list of available atom skins +GLOBAL_LIST_INIT_TYPED(atom_skins, /datum/atom_skin, init_subtypes_w_path_keys(/datum/atom_skin)) + +/// Sets the atom's varname to newvalue if newvalue is not null, otherwise resets it to its initial value if resetcondition is true +#define APPLY_VAR_OR_RESET_INITIAL(atom, varname, newvalue, resetcondition) \ + if(newvalue) {atom.##varname = (##newvalue) } else if(resetcondition) { atom.##varname = initial(atom.##varname) } + +/// Sets the atom's varname to newvalue if newvalue is not null, otherwise sets it to resetvalue if resetcondition is true +#define APPLY_VAR_OR_RESET_TO(atom, varname, newvalue, resetcondition, resetvalue) \ + if(newvalue) {atom.##varname = (##newvalue) } else if(resetcondition) { atom.##varname = (resetvalue) } + +/// Resets the atom's varname to its initial value if oldvalue is not null +#define RESET_INITIAL_IF_SET(atom, varname, oldvalue) \ + if(oldvalue) { atom.##varname = initial(atom.##varname) } + +/// Sets the atom's varname to resetvalue if oldvalue is not null +#define RESET_TO_IF_SET(atom, varname, oldvalue, resetvalue) \ + if(oldvalue) { atom.##varname = (resetvalue) } diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 124c68f7cf4c..004f990bcdf5 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -41,8 +41,6 @@ #define ROLE_VOIDWALKER "Voidwalker" #define ROLE_SUNWALKER "Sunwalker" -// Latejoin roles -#define ROLE_HERETIC_SMUGGLER "Heretic Smuggler" #define ROLE_PROVOCATEUR "Provocateur" #define ROLE_STOWAWAY_CHANGELING "Stowaway Changeling" #define ROLE_SYNDICATE_INFILTRATOR "Syndicate Infiltrator" diff --git a/code/__DEFINES/rust_g.dm b/code/__DEFINES/rust_g.dm index 048ea0bd0b75..877d06ed19f6 100644 --- a/code/__DEFINES/rust_g.dm +++ b/code/__DEFINES/rust_g.dm @@ -168,6 +168,9 @@ */ #define rustg_dmi_inject_metadata(path, metadata) RUSTG_CALL(RUST_G, "dmi_inject_metadata")(path, metadata) +#define rustg_create_qr_code_png(path, data) RUSTG_CALL(RUST_G, "create_qr_code_png")(path, data) +#define rustg_create_qr_code_svg(data) RUSTG_CALL(RUST_G, "create_qr_code_svg")(data) + #define rustg_file_read(fname) RUSTG_CALL(RUST_G, "file_read")(fname) #define rustg_file_exists(fname) (RUSTG_CALL(RUST_G, "file_exists")(fname) == "true") #define rustg_file_write(text, fname) RUSTG_CALL(RUST_G, "file_write")(text, fname) @@ -280,6 +283,21 @@ #define rustg_iconforge_generate(file_path, spritesheet_name, sprites, hash_icons, generate_dmi, flatten) RUSTG_CALL(RUST_G, "iconforge_generate")(file_path, spritesheet_name, sprites, "[hash_icons]", "[generate_dmi]", "[flatten]") /// Returns a job_id for use with rustg_iconforge_check() #define rustg_iconforge_generate_async(file_path, spritesheet_name, sprites, hash_icons, generate_dmi, flatten) RUSTG_CALL(RUST_G, "iconforge_generate_async")(file_path, spritesheet_name, sprites, "[hash_icons]", "[generate_dmi]", "[flatten]") +/// Creates a single DMI or PNG using 'sprites' as a list of icon states / images. +/// This function is intended for generating icons with only a few states that have little in common with each other, and only one size. +/// For icons with a large number of states, potentially variable sizes, that re-use sets of transforms more than once, or that benefit from caching, use rustg_iconforge_generate. +/// sprites - follows the same format as rustg_iconforge_generate. +/// file_path - the full relative path at which the PNG or DMI will be written. It must be a full filepath such as tmp/my_icon.dmi or my_icon.png +/// flatten - boolean (0 or 1) determines if the DMI output will be flattened to a single frame/dir if unscoped (null/0 dir or frame values). +/// +/// Returns a HeadlessResult, decoded to a BYOND list (always, it's not possible for this to panic unless rustg itself has an issue) containing the following fields: +/// list( +/// "file_path" = "tmp/my_icon.dmi" // [whatever you input returned back to you, null if there was a fatal error] +/// "width" = 32 // the width, which is determined by the first entry of 'sprites', null if there was a fatal error +/// "height" = 32 // the height, which is determined by the first entry of 'sprites', null if there was a fatal error +/// "error" = "[A string, null if there were no errors.]" +/// ) +#define rustg_iconforge_generate_headless(file_path, sprites, flatten) json_decode(RUSTG_CALL(RUST_G, "iconforge_generate_headless")(file_path, sprites, "[flatten]")) /// Returns the status of an async job_id, or its result if it is completed. See RUSTG_JOB DEFINEs. #define rustg_iconforge_check(job_id) RUSTG_CALL(RUST_G, "iconforge_check")("[job_id]") /// Clears all cached DMIs and images, freeing up memory. diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index ecbbb3ec04bb..d1da7ea09760 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -118,6 +118,7 @@ #define MAX_PLAQUE_LEN 144 #define MAX_LABEL_LEN 64 #define MAX_DESC_LEN 280 +#define MAX_AAS_LENGTH 168 // Audio/Visual Flags. Used to determine what sense are required to notice a message. #define MSG_VISUAL (1<<0) diff --git a/code/__DEFINES/security.dm b/code/__DEFINES/security.dm index a385d843398e..eb36b2d70925 100644 --- a/code/__DEFINES/security.dm +++ b/code/__DEFINES/security.dm @@ -1,6 +1,9 @@ // CATEGORY HEADERS +/// New `/datum/detective_scan_category` must be created when adding new `DETSCAN_CATEGORY`. +/// Macros are sorted by `/datum/detective_scan_category::display_order` + /// Fingerpints detected #define DETSCAN_CATEGORY_FINGERS "Prints" /// Displays any bloodprints found and their uefi @@ -8,37 +11,20 @@ /// Clothing and glove fibers #define DETSCAN_CATEGORY_FIBER "Fibers" /// Liquids detected -#define DETSCAN_CATEGORY_DRINK "Reagents" +#define DETSCAN_CATEGORY_REAGENTS "Reagents" /// ID Access #define DETSCAN_CATEGORY_ACCESS "ID Access" // The categories below do not have hard rules on what info is displayed, and are for categorizing info thematically. -/// Generic extra information category -#define DETSCAN_CATEGORY_NOTES "Additional Notes" -/// Attributes that might be illegal, but don't have ties to syndicate/aren't exclusively produced by them -#define DETSCAN_CATEGORY_ILLEGAL "Illegal Tech" -/// The emags and other in-house technology from the syndicate -#define DETSCAN_CATEGORY_SYNDIE "Syndicate Tech" -/// praise be -#define DETSCAN_CATEGORY_HOLY "Holy Data" /// The mode that the items in, what kind of item is dispensed, etc #define DETSCAN_CATEGORY_SETTINGS "Active Settings" - -// If your category is not in this list it WILL NOT BE DISPLAYED -/// defines the order categories are displayed, with the original categories, then custom ones, then finally the extra info. -#define DETSCAN_DEFAULT_ORDER(...) list(\ - DETSCAN_CATEGORY_FINGERS, \ - DETSCAN_CATEGORY_BLOOD, \ - DETSCAN_CATEGORY_FIBER, \ - DETSCAN_CATEGORY_DRINK, \ - DETSCAN_CATEGORY_ACCESS, \ - DETSCAN_CATEGORY_SETTINGS, \ - DETSCAN_CATEGORY_HOLY, \ - DETSCAN_CATEGORY_ILLEGAL, \ - DETSCAN_CATEGORY_SYNDIE, \ - DETSCAN_CATEGORY_NOTES, \ -) +/// praise be +#define DETSCAN_CATEGORY_HOLY "Holy Data" +/// Attributes that might be illegal, can also have ties to syndicate +#define DETSCAN_CATEGORY_ILLEGAL "Illegal Tech" +/// Generic extra information category +#define DETSCAN_CATEGORY_NOTES "Additional Notes" /// the order departments show up in for the id scan (its sorted by red to blue on the color wheel) #define DETSCAN_ACCESS_ORDER(...) list(\ diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index fb7b57e41844..5b48acc82d96 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -81,9 +81,10 @@ #define DOCKING_NULL_SOURCE (1<<4) //Docking turf movements -#define MOVE_TURF 1 -#define MOVE_AREA 2 -#define MOVE_CONTENTS 4 +#define MOVE_TURF (1<<0) +#define MOVE_AREA (1<<1) +#define MOVE_CONTENTS (1<<2) +#define MOVE_SPECIAL (1<<3) //Rotation params #define ROTATE_DIR 1 diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 5f12e8d1a4fd..abc71f451c55 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -12,10 +12,11 @@ #define CHANNEL_ELEVATOR 1014 #define CHANNEL_ESCAPEMENU 1013 #define CHANNEL_WEATHER 1012 -#define CHANNEL_BLOOD 1011 // DARKPACK ADD +#define CHANNEL_BLOOD 1011 // DARKPACK EDIT ADD +#define CHANNEL_MUSIC 1010 // DARKPACK EDIT ADD - AMBIENCE //THIS SHOULD ALWAYS BE THE LOWEST ONE! //KEEP IT UPDATED -#define CHANNEL_HIGHEST_AVAILABLE 1010 // DARKPACK EDIT +#define CHANNEL_HIGHEST_AVAILABLE 1009 // DARKPACK EDIT #define MAX_INSTRUMENT_CHANNELS (128 * 6) @@ -45,7 +46,7 @@ /* Calculates the volume of a sound based on distance * - * https://www.desmos.com/calculator/sqdfl8ipgf + * https://www.desmos.com/calculator/shjpmz3ck7 * * Arguments: * * volume: The initial volume of the sound being played @@ -287,6 +288,40 @@ GLOBAL_LIST_EMPTY(sfx_datum_by_key) #define SFX_CIG_PACK_RUSTLE "cig_pack_rustle" #define SFX_CIG_PACK_THROW_DROP "cig_pack_throw_drop" #define SFX_RORO_WARBLE "roro_warble" +#define SFX_POTTED_PLANT_PICKUP "potted_plant_pickup" +#define SFX_POTTED_PLANT_DROP "potted_plant_drop" +#define SFX_GOGGLES_PICKUP "goggles_pickup" +#define SFX_GOGGLES_DROP "goggles_drop" +#define SFX_GOGGLES_EQUIP "goggles_equip" +#define SFX_GLASSES_PICKUP "glasses_pickup" +#define SFX_GLASSES_DROP "glasses_drop" +#define SFX_GLASSES_EQUIP "glasses_equip" +#define SFX_FOOD_PLATE_PICKUP "food_plate_pickup" +#define SFX_FOOD_PLATE_DROP "food_plate_drop" +#define SFX_TRAY_PICKUP "tray_pickup" +#define SFX_TRAY_DROP "tray_drop" +#define SFX_TRAY_INSERT "tray_insert" +#define SFX_CUTLERY_PICKUP "generic_cutlery_pickup" +#define SFX_CUTLERY_DROP "generic_cutlery_drop" +#define SFX_KNIFE_PICKUP "knife_pickup" +#define SFX_KNIFE_DROP "knife_drop" +#define SFX_KNIFE_SLICE "knife_slice" +#define SFX_POT_PICKUP "pot_pickup" +#define SFX_POT_DROP "pot_drop" +#define SFX_ROLLING_PIN_PICKUP "rolling_pin_pickup" +#define SFX_ROLLING_PIN_DROP "rolling_pin_drop" +#define SFX_ROLLING_PIN_ROLLING "rolling_pin_rolling" +#define SFX_FIRE_MODE_SWITCH "fire_mode_switch" +#define SFX_REMOTE_MODE_SWITCH "remote_mode_switch" +#define SFX_REMOTE_ACTION "remote_action" +#define SFX_GAS_MASK_PICKUP "gas_mask_pickup" +#define SFX_GAS_MASK_DROP "gas_mask_drop" +#define SFX_GAS_MASK_EQUIP "gas_mask_equip" +#define SFX_GENERIC_DEVICE_PICKUP "generic_device_pickup" +#define SFX_GENERIC_DEVICE_DROP "generic_device_drop" +#define SFX_HARD_HAT_PICKUP "hard_hat_pickup" +#define SFX_HARD_HAT_DROP "hard_hat_drop" +#define SFX_HARD_HAT_EQUIP "hard_hat_equip" // Standard is 44.1khz #define MIN_EMOTE_PITCH 40000 diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm index ca15b2616d81..fbbd8f8a90a9 100644 --- a/code/__DEFINES/span.dm +++ b/code/__DEFINES/span.dm @@ -83,6 +83,7 @@ #define span_italics(str) ("" + str + "") #define span_linkify(str) ("" + str + "") #define span_looc(str) ("" + str + "") +#define span_rlooc(str) ("" + str + "") // DARKPACK EDIT ADD #define span_major_announcement_text(str) ("" + str + "") #define span_major_announcement_title(str) ("" + str + "") #define span_medal(str) ("" + str + "") @@ -98,7 +99,7 @@ #define span_narsie(str) ("" + str + "") #define span_narsiesmall(str) ("" + str + "") #define span_nicegreen(str) ("" + str + "") -#define span_userlove(str) ("" + str + "") // DARKPACK ADD +#define span_userlove(str) ("" + str + "") // DARKPACK EDIT ADD #define span_notice(str) ("" + str + "") #define span_noticealien(str) ("" + str + "") #define span_ooc(str) ("" + str + "") diff --git a/code/__DEFINES/species_clothing_paths.dm b/code/__DEFINES/species_clothing_paths.dm index 99fe7baab1dd..828510bf7cb3 100644 --- a/code/__DEFINES/species_clothing_paths.dm +++ b/code/__DEFINES/species_clothing_paths.dm @@ -9,7 +9,3 @@ //DIGITIGRADE PATHS ///The dmi containing digitigrade uniforms #define DIGITIGRADE_UNIFORM_FILE 'icons/mob/human/species/misc/digitigrade.dmi' -///The dmi containing digitigrade shoes -#define DIGITIGRADE_SHOES_FILE 'icons/mob/human/species/misc/digitigrade_shoes.dmi' -///The dmi containing digitigrade oversuits -#define DIGITIGRADE_SUIT_FILE 'icons/mob/human/species/misc/digitigrade_suits.dmi' diff --git a/code/__DEFINES/speech_channels.dm b/code/__DEFINES/speech_channels.dm index 9f1526ebd56a..17bd2fd9cb86 100644 --- a/code/__DEFINES/speech_channels.dm +++ b/code/__DEFINES/speech_channels.dm @@ -4,3 +4,4 @@ #define ME_CHANNEL "Me" #define OOC_CHANNEL "OOC" #define ADMIN_CHANNEL "Admin" +#define LOOC_CHANNEL "LOOC" // DARKPACK EDIT ADD - LOOC diff --git a/code/__DEFINES/stat_tracking.dm b/code/__DEFINES/stat_tracking.dm index 9bd697440406..e71a073daafd 100644 --- a/code/__DEFINES/stat_tracking.dm +++ b/code/__DEFINES/stat_tracking.dm @@ -15,7 +15,8 @@ #define INIT_COST(costs, counting) \ var/list/_costs = costs; \ var/list/_counting = counting; \ - var/_usage = TICK_USAGE; + var/_usage = TICK_USAGE; \ + var/_cost = 0; // STATIC cost tracking macro. Uses static lists instead of the normal global ones // Good for debug stuff, and for running before globals init @@ -33,10 +34,22 @@ } \ _usage = TICK_USAGE; +#define SET_COST_BOUNDS(category) \ + do { \ + _cost = TICK_USAGE; \ + var/_tmp_delta = TICK_DELTA_TO_MS(_cost - _usage);\ + _costs[category] += _tmp_delta;\ + _counting[category] += 1;\ + _costs["[category]_min"] = min(_tmp_delta, _costs["[category]_min"] || INFINITY);\ + _counting["[category]_min"] += 1;\ + _costs["[category]_max"] = max(_tmp_delta, _costs["[category]_max"] || 0);\ + _counting["[category]_max"] += 1;\ + } while(FALSE); \ + _usage = TICK_USAGE; #define SET_COST(category) \ do { \ - var/_cost = TICK_USAGE; \ + _cost = TICK_USAGE; \ _costs[category] += TICK_DELTA_TO_MS(_cost - _usage);\ _counting[category] += 1; \ } while(FALSE); \ diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index ceecdb729da2..4b0767091b93 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -57,7 +57,6 @@ // 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" diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index a002b4bef933..9521983acd8f 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -158,6 +158,7 @@ #define FIRE_PRIORITY_PARALLAX 65 #define FIRE_PRIORITY_INSTRUMENTS 80 #define FIRE_PRIORITY_FLUIDS 80 +#define FIRE_PRIORITY_CAMERAS 85 #define FIRE_PRIORITY_PRIORITY_EFFECTS 90 #define FIRE_PRIORITY_MOBS 100 #define FIRE_PRIORITY_TGUI 110 diff --git a/code/__DEFINES/surgery.dm b/code/__DEFINES/surgery.dm index 9d73f12a980e..dc54c139dba7 100644 --- a/code/__DEFINES/surgery.dm +++ b/code/__DEFINES/surgery.dm @@ -36,6 +36,11 @@ #define ORGAN_GHOST (1<<14) /// This is a mutant organ, having this makes you a -derived mutant to health analyzers. #define ORGAN_MUTANT (1<<15) +/// The organ has been chomped or otherwise rendered unusable. +#define ORGAN_UNUSABLE (1<<16) + +/// Organ flags that correspond to bodytypes +#define ORGAN_TYPE_FLAGS (ORGAN_ORGANIC | ORGAN_ROBOTIC | ORGAN_MINERAL | ORGAN_GHOST) /// Scarring on the right eye #define RIGHT_EYE_SCAR (1<<0) @@ -85,28 +90,83 @@ /// Default for most heads #define HEAD_DEFAULT_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 +/// Checks if the mob is lying down if they can lie down, otherwise always passes +#define IS_LYING_OR_CANNOT_LIE(mob) ((mob.mobility_flags & MOBILITY_LIEDOWN) ? (mob.body_position == LYING_DOWN) : TRUE) + +/// Applies moodlets after the surgical operation is complete +#define OPERATION_AFFECTS_MOOD (1<<0) +/// Notable operations are specially logged and also leave memories +#define OPERATION_NOTABLE (1<<1) +/// Operation will automatically repeat until it can no longer be performed +#define OPERATION_LOOPING (1<<2) +/// Grants a speed bonus if the user is morbid and their tool is morbid +#define OPERATION_MORBID (1<<3) +/// Not innately available to doctors, must be added via COMSIG_MOB_ATTEMPT_SURGERY to show up +#define OPERATION_LOCKED (1<<4) +/// A surgeon can perform this operation on themselves +#define OPERATION_SELF_OPERABLE (1<<5) +/// Operation can be performed on standing patients - note: mobs that cannot lie down are *always* considered lying down for surgery +#define OPERATION_STANDING_ALLOWED (1<<6) +/// Some traits may cause operations to be infalliable - this flag disables that behavior, always allowing it to be failed +#define OPERATION_ALWAYS_FAILABLE (1<<7) +/// If set, the operation will ignore clothing when checking for access to the target body part. +#define OPERATION_IGNORE_CLOTHES (1<<8) +/// This operation should be prioritized as the next step in a surgery sequence. (In the operating computer it will flash red) +#define OPERATION_PRIORITY_NEXT_STEP (1<<9) +/// Operation is a mechanic / robotic surgery +#define OPERATION_MECHANIC (1<<10) +/// Hides the operation from autowiki generation +#define OPERATION_NO_WIKI (1<<11) + +DEFINE_BITFIELD(operation_flags, list( + "AFFECTS MOOD" = OPERATION_AFFECTS_MOOD, + "NOTABLE" = OPERATION_NOTABLE, + "LOOPING" = OPERATION_LOOPING, + "MORBID" = OPERATION_MORBID, + "LOCKED" = OPERATION_LOCKED, + "SELF OPERABLE" = OPERATION_SELF_OPERABLE, + "STANDING ALLOWED" = OPERATION_STANDING_ALLOWED, + "ALWAYS FAILABLE" = OPERATION_ALWAYS_FAILABLE, + "IGNORE CLOTHES" = OPERATION_IGNORE_CLOTHES, + "PRIORITY NEXT STEP" = OPERATION_PRIORITY_NEXT_STEP, + "MECHANIC" = OPERATION_MECHANIC, +)) + +/// All of these equipment slots are ignored when checking for clothing coverage during surgery +#define IGNORED_OPERATION_CLOTHING_SLOTS (ITEM_SLOT_NECK) + +// Surgery related mood defines +#define SURGERY_STATE_STARTED "surgery_started" +#define SURGERY_STATE_FAILURE "surgery_failed" +#define SURGERY_STATE_SUCCESS "surgery_success" +#define SURGERY_MOOD_CATEGORY "surgery" + +/// Dummy "tool" for surgeries which use hands +#define IMPLEMENT_HAND "hands" -// Flags for surgery_flags on surgery datums -///Will allow the surgery to bypass clothes -#define SURGERY_IGNORE_CLOTHES (1<<0) -///Will allow the surgery to be performed by the user on themselves. -#define SURGERY_SELF_OPERABLE (1<<1) -///Will allow the surgery to work on mobs that aren't lying down. -#define SURGERY_REQUIRE_RESTING (1<<2) -///Will allow the surgery to work only if there's a limb. -#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) -/** - * Instead of checking if the tool used is an actual surgery tool to avoid accidentally whacking patients with the wrong tool, - * it'll check if it has a defined tool behaviour instead. Useful for surgeries that use mechanical tools instead of medical ones, - * like hardware manipulation. - */ -#define SURGERY_CHECK_TOOL_BEHAVIOUR (1<<6) +/// Surgery speed modifiers are soft-capped at this value +/// The actual modifier can exceed this but it gets +#define SURGERY_MODIFIER_FAILURE_THRESHOLD 2.5 +/// There is an x percent chance of failure per second beyond 2.5x the base surgery time +#define FAILURE_CHANCE_PER_SECOND 10 +/// Calculates failure chance of an operation based on the base time and the effective speed modifier +/// This may look something like: Base time 1 second and 4x effective multiplier -> 4 seconds - 2.5 seconds = 1.5 seconds * 10 = 15% failure chance +/// Or: Base time 2 seconds and 1x effective multiplier -> 2 seconds - 5 seconds = -3 seconds * 10 = -30% failure chance (clamped to 0%) +#define GET_FAILURE_CHANCE(base_time, speed_mod) (FAILURE_CHANCE_PER_SECOND * (((speed_mod * (base_time)) - (SURGERY_MODIFIER_FAILURE_THRESHOLD * (base_time))) / (1 SECONDS))) -///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)) +// Operation argument indexes +/// Total speed/failure modifier applied to the operation +#define OPERATION_SPEED "speed_modifier" +/// The action being performed, simply "default" for 95% of surgeries +#define OPERATION_ACTION "action" +/// Whether the operation should automatically fail +#define OPERATION_FORCE_FAIL "force_fail" +/// The body zone being targeted by the operation +#define OPERATION_TARGET_ZONE "target_zone" +/// The specific target of the operation, usually a bodypart or organ, generally redundant +#define OPERATION_TARGET "target" +// For tend wounds - only reason these aren't local is we use them in unit testing +#define OPERATION_BRUTE_HEAL "brute_heal" +#define OPERATION_BURN_HEAL "burn_heal" +#define OPERATION_BRUTE_MULTIPLIER "brute_multiplier" +#define OPERATION_BURN_MULTIPLIER "burn_multiplier" diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 879732717b1f..a3f7c0738b4c 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -96,11 +96,15 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_EMOTEMUTE "emotemute" #define TRAIT_DEAF "deaf" #define TRAIT_FAT "fat" +/// If you are fat, you no longer get the slowdown from it +#define TRAIT_FAT_IGNORE_SLOWDOWN "fat_ignore_slowdown" /// Always hungry. They can eat as much as they want without eating slowdown. #define TRAIT_GLUTTON "glutton" #define TRAIT_HUSK "husk" ///Blacklisted from being revived via defibrillator #define TRAIT_DEFIB_BLACKLISTED "defib_blacklisted" +/// This carbon doesn't need a brain to be revived, though some revival methods like defibbing will still check for a functional brain +#define TRAIT_BRAINLESS_CARBON "brainless_carbon" #define TRAIT_BADDNA "baddna" #define TRAIT_CLUMSY "clumsy" /// Trait that means you are capable of holding items in some form @@ -180,6 +184,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NUKEIMMUNE "nuke_immunity" /// Can't be given viruses #define TRAIT_VIRUSIMMUNE "virus_immunity" +/// Stepping on ants wont cause damage +#define TRAIT_SPACE_ANT_IMMUNITY "space_ant_immunity" /// Won't become a husk under any circumstances #define TRAIT_UNHUSKABLE "trait_unhuskable" /// Reduces the chance viruses will spread to this mob, and if the mob has a virus, slows its advancement @@ -216,7 +222,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #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 have blood #define TRAIT_NOBLOOD "noblood" /// This just means that the carbon will always have functional liverless metabolism #define TRAIT_LIVERLESS_METABOLISM "liverless_metabolism" @@ -326,6 +332,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_WOUND_LICKER "wound_licker" /// Mobs with this trait are allowed to use silicon emotes #define TRAIT_SILICON_EMOTES_ALLOWED "silicon_emotes_allowed" +/// Mobs with this trait can tell when other mobs whisper even if their mouth is covered. They still can't tell what was whispered though. +#define TRAIT_SEE_MASK_WHISPER "see_mask_whisper" /// This trait designate that the mob was originally a monkey #define TRAIT_BORN_MONKEY "born_as_a_monkey" @@ -355,6 +363,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NODEATH "nodeath" #define TRAIT_NOHARDCRIT "nohardcrit" #define TRAIT_NOSOFTCRIT "nosoftcrit" +#define TRAIT_NO_OXYLOSS_PASSOUT "nooxylosspassout" /// Makes someone show up as mindshielded on sechuds. Does NOT actually make them unconvertable - See TRAIT_UNCONVERTABLE for that #define TRAIT_MINDSHIELD "mindshield" /// Makes it impossible for someone to be converted by cult/revs/etc. @@ -415,7 +424,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #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" #define TRAIT_STRONG_GRABBER "strong_grabber" #define TRAIT_SOOTHED_THROAT "soothed-throat" #define TRAIT_SOOTHED_HEADACHE "soothed-headache" @@ -433,7 +441,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_UNSTABLE "unstable" #define TRAIT_OIL_FRIED "oil_fried" #define TRAIT_MEDICAL_HUD "med_hud" +#define TRAIT_MEDICAL_HUD_SENSOR_ONLY "med_hud_lesser" #define TRAIT_SECURITY_HUD "sec_hud" +#define TRAIT_SECURITY_HUD_ID_ONLY "sec_hud_lesser" +#define TRAIT_ABDUCTOR_HUD "abductor_hud" +/// Stop the user from seeing the sechud. Only works for trait handled sechuds. +#define TRAIT_BLOCK_SECHUD "block_sechud" /// for something granting you a diagnostic hud #define TRAIT_DIAGNOSTIC_HUD "diag_hud" #define TRAIT_BOT_PATH_HUD "bot_path_hud" @@ -459,6 +472,14 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_HALLUCINATION_IMMUNE "hallucination_immune" /// Increases chance of getting special traumas, makes them harder to cure #define TRAIT_SPECIAL_TRAUMA_BOOST "special_trauma_boost" + +//---- Brain trauma resists +/// Unable to gain any brain trauma whatsoever +#define TRAIT_BRAIN_TRAUMA_IMMUNITY "brain_trauma_immunity" + +/// Prevents death from having too much brain damage +#define TRAIT_BRAIN_DAMAGE_NODEATH "brain_damage_nodeath" + #define TRAIT_SPACEWALK "spacewalk" /// Mobs with this trait still breathe gas in and out but aren't harmed by lacking any particular gas mix. (You can still be hurt by TOO MUCH of a specific gas). #define TRAIT_NO_BREATHLESS_DAMAGE "spacebreathing" @@ -533,6 +554,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_CULT_HALO "cult_halo" /// Their eyes glow an unnatural red colour. Currently used to set special examine text on humans. Does not guarantee the mob's eyes are coloured red, nor that there is any visible glow on their character sprite. #define TRAIT_UNNATURAL_RED_GLOWY_EYES "unnatural_red_glowy_eyes" +/// Their eyes glow in the dark (aka emissive appearance) +#define TRAIT_LUMINESCENT_EYES "luminescent_eyes" +/// Their eyes reflect light, making them shine faintly in dim, shadowy areas. Kinda like nocturnal animals. +#define TRAIT_REFLECTIVE_EYES "reflective_eyes" /// Their eyes are bloodshot. Currently used to set special examine text on humans. Examine text is overridden by TRAIT_UNNATURAL_RED_GLOWY_EYES. #define TRAIT_BLOODSHOT_EYES "bloodshot_eyes" /// This mob should never close UI even if it doesn't have a client @@ -641,6 +666,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NO_GUN_AKIMBO "no_gun_akimbo" /// Mobs with this trait cannot be hit by projectiles, meaning the projectiles will just go through. #define TRAIT_UNHITTABLE_BY_PROJECTILES "unhittable_by_projectiles" +/// Mobs with this trait can never be hit by laser projectiles, meaning the projectiles will just go through. +#define TRAIT_UNHITTABLE_BY_LASERS "unhittable_by_lasers" /// 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" @@ -882,8 +909,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_ROD_ATTRACT_SHINY_LOVERS "rod_attract_shiny_lovers" /// This rod can be used to fish on lava #define TRAIT_ROD_LAVA_USABLE "rod_lava_usable" -/// This rod was infused by a heretic, making it awesome and improving influence gain -#define TRAIT_ROD_MANSUS_INFUSED "rod_infused" /// Stuff that can go inside fish cases and aquariums #define TRAIT_AQUARIUM_CONTENT "aquarium_content" /// If the item can be used as a bit. @@ -932,10 +957,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NO_STRIP "no_strip" /// Disallows this item from being pricetagged with a barcode #define TRAIT_NO_BARCODES "no_barcode" -/// Allows heretics to cast their spells. -#define TRAIT_ALLOW_HERETIC_CASTING "allow_heretic_casting" -/// Designates a heart as a living heart for a heretic. -#define TRAIT_LIVING_HEART "living_heart" /// Prevents the same person from being chosen multiple times for kidnapping objective #define TRAIT_HAS_BEEN_KIDNAPPED "has_been_kidnapped" /// An item still plays its hitsound even if it has 0 force, instead of the tap @@ -954,6 +975,24 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_EXAMINE_SKIP "examine_skip" /// Objects with this trait cannot be repaired with duct tape #define TRAIT_DUCT_TAPE_UNREPAIRABLE "duct_tape_unrepairable" +/// An item is ALWAYS considered baseline reachable and will pipe into CanBeReached(). +#define TRAIT_SKIP_BASIC_REACH_CHECK "skip_basic_reach_check" + +//---- Heretic Traits +/// Hides the heretic overlay that outs them as the heretic +#define TRAIT_HERETIC_AURA_HIDDEN "heretic_aura_hidden" +/// This rod was infused by a heretic, making it awesome and improving influence gain +#define TRAIT_ROD_MANSUS_INFUSED "rod_infused" +/// Allows heretics to cast their spells. +#define TRAIT_ALLOW_HERETIC_CASTING "allow_heretic_casting" +/// Designates a heart as a living heart for a heretic. +#define TRAIT_LIVING_HEART "living_heart" +/// Trait given to all participants in a heretic arena +#define TRAIT_ELDRITCH_ARENA_PARTICIPANT "eldritch_arena_participant" +/// Trait given to heretic summons, making them immune to heretic spells +#define TRAIT_HERETIC_SUMMON "heretic_summon" +/// Lock heretic grasp no longer goes on cooldown when opening things +#define TRAIT_LOCK_GRASP_UPGRADED "lock_grasp_upgraded" //quirk traits #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" @@ -974,7 +1013,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_PHOTOGRAPHER "photographer" #define TRAIT_MUSICIAN "musician" #define TRAIT_LIGHT_DRINKER "light_drinker" -#define TRAIT_EMPATH "empath" #define TRAIT_EVIL "evil" #define TRAIT_FRIENDLY "friendly" #define TRAIT_GRABWEAKNESS "grab_weakness" @@ -1154,6 +1192,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_FISH_SURVIVE_COOKING "fish_survive_cooking" ///This fish is healed by milk and hurt by bone hurting juice #define TRAIT_FISH_MADE_OF_BONE "fish_made_of_bone" +///The traits of this fish have been edited by a fish gene-gun at least once. It'll die the next time the fish genegun is used on them. +#define TRAIT_FISH_GENEGUNNED "fish_genegunned" /** * This fish has been fed teslium without the electrogenesis having trait. * Gives the electrogenesis, but at halved output, and it hurts the fish over time. @@ -1386,9 +1426,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait given to anything linked to, not necessarily allied to, the mansus #define TRAIT_MANSUS_TOUCHED "mansus_touched" -/// Trait given to all participants in a heretic arena -#define TRAIT_ELDRITCH_ARENA_PARTICIPANT "eldritch_arena_participant" - // These traits are used in IS_X() as an OR, and is utilized for pseudoantags (such as deathmatch or domains) so they don't need to actually get antag status. // To specifically and only get the antag datum, GET_X() exists now. #define TRAIT_ACT_AS_CULTIST "act_as_cultist" @@ -1475,8 +1512,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///Trait given to atoms currently affected by projectile dampeners #define TRAIT_GOT_DAMPENED "got_dampened" -/// humans with this trait will have their health visible to AIs without suit -#define HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT "hmsensorsvisiblewithoutsuit" +/// Having this trait allows the basic health hud to show up for this mob +#define TRAIT_BASIC_HEALTH_HUD_VISIBLE "basic_health_hud_visible" /// Apply to movables to say "hey, this movable is technically flat on the floor, so it'd be mopped up by a mop" #define TRAIT_MOPABLE "mopable" @@ -1515,9 +1552,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///A trait given to users as a mutex to prevent repeated unresolved attempts to christen a shuttle #define TRAIT_ATTEMPTING_CHRISTENING "attempting_christening" -///Trait given to heretic summons, making them immune to heretic spells -#define TRAIT_HERETIC_SUMMON "heretic_summon" - ///trait given to mobs that are difficult to tame through mounting #define TRAIT_MOB_DIFFICULT_TO_MOUNT "difficult_to_mount" @@ -1554,8 +1588,13 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///Attached to objects currently on tables and such, allowing them to walk on other objects without the climbing delay #define TRAIT_ON_CLIMBABLE "on_climbable" -/// Trait that allows mobs to perform surgery on themselves +/// Allows a mob to perform any operation on themselves (with a penalty), where normally only specific operations allow self-surgery. #define TRAIT_SELF_SURGERY "self_surgery" +/// This mob's surgical operations ignore ALL speed modifiers (even positive ones!) besides tool quality. +/// The mob can also no longer fail their operations, unless the operation says otherwise +#define TRAIT_IGNORE_SURGERY_MODIFIERS "ignore_surgery_modifiers" +/// Trait applied to mobs or bodyparts which allows for them to be operated on +#define TRAIT_READY_TO_OPERATE "ready_to_operate" /// Trait that makes mobs with it immune to mining gear AOE attacks #define TRAIT_MINING_AOE_IMMUNE "mining_aoe_immune" @@ -1563,7 +1602,23 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait that allows an item to perform holy rites akin to a nullrod #define TRAIT_NULLROD_ITEM "nullrod_item" +/// Mob gets far less severe negative moodlets from seeing death / blood +#define TRAIT_DESENSITIZED "desensitized" + /// Trait specifying that an AI has a remote connection to an integrated circuit #define TRAIT_CONNECTED_TO_CIRCUIT "connected_to_circuit" +/// Applied to an organ that has been operated on - some organs can't be operated on multiple times +#define TRAIT_ORGAN_OPERATED_ON "organ_operated_on" + +/// Mob is artificially spawned rather than being created through more natural means - applied to monkey cubes and such +#define TRAIT_SPAWNED_MOB "spawned_mob" + +/// Turf is one that ai mobs will generally avoid pathing through +/// Doesn't need to be applied to any turfs that override can_cross_safely +#define TRAIT_AI_AVOID_TURF "warning_turf" + +/// Object is dangerous to mobs buckled to it +#define TRAIT_DANGEROUS_BUCKLE "dangerous_buckle" + // END TRAIT DEFINES diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index edea6b634788..f68a242e5657 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -26,8 +26,12 @@ #define JOB_TRAIT "job" /// Any traits granted by quirks. #define QUIRK_TRAIT "quirk_trait" +/// Trait source for personality traits +#define PERSONALITY_TRAIT "personality_trait" /// (B)admins only. #define ADMIN_TRAIT "admin" +/// Traits that were granted via modify_traits in vv or the mass_modify_traits verb +#define TRAIT_ADMIN_GRANTED "adminabuse" /// Any traits given through a smite. #define SMITE_TRAIT "smite" #define CHANGELING_TRAIT "changeling" @@ -57,8 +61,6 @@ #define SHOES_TRAIT "shoes" /// Trait inherited by implants #define IMPLANT_TRAIT "implant" -/// Traits given by the heretic arena spell -#define HERETIC_ARENA_TRAIT "heretic_arena" #define GLASSES_TRAIT "glasses" /// inherited from riding vehicles #define VEHICLE_TRAIT "vehicle" @@ -102,9 +104,16 @@ /// Trait given by being recruited as a nuclear operative #define NUKE_OP_MINION_TRAIT "nuke-op-minion" +//---- Heretic Traits Sources +/// Traits given by the heretic arena spell +#define HERETIC_ARENA_TRAIT "heretic_arena" + /// Trait given to you by shapeshifting #define SHAPESHIFT_TRAIT "shapeshift_trait" +///From the cuffed_item status effect +#define CUFFED_ITEM_TRAIT "cuffed_item_trait" + // unique trait sources, still defines #define EMP_TRAIT "emp_trait" #define STATUE_MUTE "statue" diff --git a/code/__DEFINES/transport.dm b/code/__DEFINES/transport.dm index 09d4f39280a8..0a36c27979da 100644 --- a/code/__DEFINES/transport.dm +++ b/code/__DEFINES/transport.dm @@ -19,6 +19,7 @@ #define HILBERT_LINE_1 "hilb_1" #define BIRDSHOT_LINE_1 "bird_1" #define BIRDSHOT_LINE_2 "bird_2" +#define HERETIC_LINE_1 "heretic_1" // Destinations/platforms #define TRAMSTATION_WEST 1 @@ -32,6 +33,10 @@ #define BIRDSHOT_PRISON_WING 1 #define BIRDSHOT_SECURITY_WING 2 +#define HERETIC_PORT 1 +#define HERETIC_CENTRAL 2 +#define HERETIC_STARBOARD 3 + #define BIRDSHOT_MAINTENANCE_LEFT 1 #define BRIDSHOT_MAINTENANCE_RIGHT 2 diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index 41319ab7b9e2..3f7010c80f20 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -89,6 +89,7 @@ #define RUST_RESISTANCE_REINFORCED 2 #define RUST_RESISTANCE_TITANIUM 3 #define RUST_RESISTANCE_ORGANIC 4 +/// Should not be rustable. EVER. Includes thing like space, lava, chasms, admin walls #define RUST_RESISTANCE_ABSOLUTE 5 /// Turf will be passable if density is 0 diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 6c9d4e2b8509..accfdf2ab224 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -136,6 +136,7 @@ #define VV_HK_VIEW_PLANES "view_planes" #define VV_HK_GIVE_AI "give_ai" #define VV_HK_GIVE_AI_SPEECH "give_ai_speech" +#define VV_HK_GIVE_ACCESS "give_access" // /mob/living #define VV_HK_GIVE_SPEECH_IMPEDIMENT "impede_speech" diff --git a/code/__DEFINES/weather.dm b/code/__DEFINES/weather.dm index 7cc84cc8a4ea..9792ff823ea4 100644 --- a/code/__DEFINES/weather.dm +++ b/code/__DEFINES/weather.dm @@ -26,7 +26,7 @@ GLOBAL_LIST_EMPTY(wizard_rain_reagents) /// 1 / 20,000 chance for a turf to get a thunder strike per tick (rare damage to mobs/equipment in area) #define THUNDER_CHANCE_RARE 0.00005 /// 1 / 50,000 chance for a turf to get a thunder strike per tick (almost no damage to mobs/equipment in area) -#define THUNDER_CHANCE_VERY_RARE 0.00002 +#define THUNDER_CHANCE_VERY_RARE 0.000002 // DARKPACK EDIT CHANGE /// admin verb to control thunder via the run_weather command GLOBAL_LIST_INIT(thunder_chance_options, list( @@ -35,7 +35,7 @@ GLOBAL_LIST_INIT(thunder_chance_options, list( "Regular - Standard Storm Activity" = THUNDER_CHANCE_AVERAGE, "Occasional - A polite amount of thunder" = THUNDER_CHANCE_RARE, "Rare - Like finding a four-leaf clover, but in the sky" = THUNDER_CHANCE_VERY_RARE, - "None - Admin Safe Space (Thunder Disabled)" = NONE, + "None - Admin Safe Space (Thunder Disabled)" = 0, )) //WEATHER FLAGS @@ -53,6 +53,17 @@ GLOBAL_LIST_INIT(thunder_chance_options, list( #define WEATHER_BAROMETER (1<<5) /// If weather temperature ignores clothing insulation when adjusting bodytemperature #define WEATHER_TEMPERATURE_BYPASS_CLOTHING (1<<6) +/// Alerts are only sent to people within affected area rather than on affected z-levels +#define WEATHER_STRICT_ALERT (1<<7) /// Does weather have any type of processing related to mobs, turfs, or thunder? #define FUNCTIONAL_WEATHER (WEATHER_TURFS|WEATHER_MOBS|WEATHER_THUNDER) + +// Indexes for weather_data list to override behaviors +#define WEATHER_FORCED_AREAS "Areas" +#define WEATHER_FORCED_FLAGS "Flags" +#define WEATHER_FORCED_REAGENT "Reagent" +#define WEATHER_FORCED_THUNDER "Thunder Chance" +#define WEATHER_FORCED_TELEGRAPH "Telegraph Duration" +#define WEATHER_FORCED_END "End Duration" +#define WEATHER_FORCED_DURATION "Weather Duration" diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm index 39012e8f0786..b345fda19950 100644 --- a/code/__DEFINES/wounds.dm +++ b/code/__DEFINES/wounds.dm @@ -80,12 +80,16 @@ GLOBAL_LIST_INIT(wound_severities_chronological, list( #define BIO_FLESH (1<<1) /// Has metal - allows the victim to suffer robotic blunt and burn wounds #define BIO_METAL (1<<2) +/// Has wood - should probably be able to catch on fire, or something +#define BIO_WOOD (1<<3) /// Is wired internally - allows the victim to suffer electrical wounds (robotic T1-T3 slash/pierce) -#define BIO_WIRED (1<<3) +#define BIO_WIRED (1<<4) /// Has bloodflow - can suffer bleeding wounds and can bleed -#define BIO_BLOODED (1<<4) +#define BIO_BLOODED (1<<5) /// Is connected by a joint - can suffer T1 bone blunt wounds (dislocation) -#define BIO_JOINTED (1<<5) +#define BIO_JOINTED (1<<6) +/// Skin is covered in thick chitin and is resistant to cutting +#define BIO_CHITIN (1<<7) /// 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 @@ -94,6 +98,8 @@ GLOBAL_LIST_INIT(wound_severities_chronological, list( #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) +/// Xenomorph limbs (xenos are immune to wounds anyhow) +#define BIO_STANDARD_ALIEN (BIO_CHITIN|BIO_BONE|BIO_BLOODED|BIO_JOINTED) // "Where" a specific biostate is within a given limb // Interior is hard shit, the last line, shit like bones @@ -115,6 +121,7 @@ GLOBAL_LIST_INIT(bio_state_anatomy, list( "[BIO_METAL]" = ANATOMY_INTERIOR, "[BIO_FLESH]" = ANATOMY_EXTERIOR, "[BIO_BONE]" = ANATOMY_INTERIOR, + "[BIO_CHITIN]" = ANATOMY_EXTERIOR, )) // Wound series @@ -235,7 +242,7 @@ GLOBAL_LIST_INIT(wounding_types_to_series, list( * 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. + * * wounding_type: Wounding type wounds of which we should be searching for * * 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. @@ -247,12 +254,10 @@ GLOBAL_LIST_INIT(wounding_types_to_series, list( * 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) +/proc/get_corresponding_wound_type(wounding_type, 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 in wounding_types) - wounding_type_list += GLOB.wounding_types_to_series[wounding_type] + var/list/wounding_type_list = GLOB.wounding_types_to_series[wounding_type] if (!length(wounding_type_list)) return null @@ -277,7 +282,7 @@ GLOBAL_LIST_INIT(wounding_types_to_series, list( 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)) + if (pregen_data.can_be_applied_to(part, wounding_type, 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! diff --git a/code/__DEFINES/~darkpack/areas.dm b/code/__DEFINES/~darkpack/areas.dm index e3c5dc74ffb6..d81c585bcf5d 100644 --- a/code/__DEFINES/~darkpack/areas.dm +++ b/code/__DEFINES/~darkpack/areas.dm @@ -2,5 +2,5 @@ #define ZONE_MASQUERADE "masquerade" /// Safe zone where Masquerade breaches can't occur #define ZONE_NO_MASQUERADE "battle" -// TODO: [Rebase] - Someone give this a comment lol +/// Safe zone where no fighting is supposed to happen. #define ZONE_ELYSIUM "elysium" diff --git a/code/__DEFINES/~darkpack/auras.dm b/code/__DEFINES/~darkpack/auras.dm new file mode 100644 index 000000000000..514c44e06e60 --- /dev/null +++ b/code/__DEFINES/~darkpack/auras.dm @@ -0,0 +1,68 @@ +// Base color auras +#define AURA_AFRAID COLOR_ORANGE // Orange +#define AURA_AGGRESSIVE COLOR_PURPLE // Purple +#define AURA_ANGRY COLOR_RED // Red +#define AURA_BITTER COLOR_BROWN // Brown +#define AURA_CALM COLOR_CARP_LIGHT_BLUE // Light Blue +#define AURA_COMPASSIONATE COLOR_PINK // Pink +#define AURA_CONSERVATIVE LIGHT_COLOR_LAVENDER // Lavender +#define AURA_DEPRESSED COLOR_GRAY // Gray +#define AURA_DESIROUS COLOR_DARK_RED // Deep Red +#define AURA_DISTRUSTFUL LIGHT_COLOR_GREEN // Light Green +#define AURA_ENVIOUS COLOR_CARP_DARK_GREEN // Dark Green +#define AURA_EXCITED COLOR_VIOLET // Violet +#define AURA_GENEROUS COLOR_LIGHT_PINK // Rose +#define AURA_HAPPY COLOR_VIVID_RED // Vermillion +#define AURA_HATEFUL COLOR_BLACK // Black +#define AURA_IDEALISTIC COLOR_YELLOW // Yellow +#define AURA_INNOCENT COLOR_WHITE // White +#define AURA_LOVESTRUCK COLOR_BLUE // Blue +#define AURA_OBSESSED COLOR_GREEN // Green +#define AURA_SAD COLOR_SILVER // Silver +#define AURA_SPIRITUAL COLOR_GOLD // Gold +#define AURA_SUSPICIOUS COLOR_STRONG_BLUE // Dark Blue + +// Modifier auras. +#define AURA_ANXIOUS "Anxious" // Auras appear scrambled like static or white noise + +#define AURA_CONFUSED "Confused" // Mottled, shifting colors -- Intermittent pauses in animation +#define AURA_DAYDREAMING "Daydreaming" // Sharp flickering colors -- Slow animation +#define AURA_PSYCHOTIC "Psychotic" // Hypnotic, swirling colors -- Fast animation + +// Untoggleable auras. Left in here as reminders of what is used by outside variables. +#define AURA_DIABLERIST (FALSE) // Black veins in aura +#define AURA_FRENZIED (FALSE) // Rapidly rippling colors +#define AURA_VAMPIRE (FALSE) // Aura colors are pale +#define AURA_GHOUL (FALSE) // Pale blotches in the aura +#define AURA_MAGIC_USE (FALSE) // Myriad sparkles in aura -- Not implemented. Mages. +#define AURA_WEREBEAST (FALSE) // Bright, vibrant aura -- DARKPACK TODO - GAROU +#define AURA_GHOST (FALSE) // Weak, intermittent aura +#define AURA_FAERIE (FALSE) // Rainbow highlights in aura -- Not implemented. Changelings. + +GLOBAL_LIST_INIT(aura_list, sort_list(list( +"Afraid" = AURA_AFRAID, +"Aggressive" = AURA_AGGRESSIVE, +"Angry" = AURA_ANGRY, +"Bitter" = AURA_BITTER, +"Calm" = AURA_CALM, +"Compassionate" = AURA_COMPASSIONATE, +"Conservative" = AURA_CONSERVATIVE, +"Depressed" = AURA_DEPRESSED, +"Desirous" = AURA_DESIROUS, +"Distrustful" = AURA_DISTRUSTFUL, +"Envious" = AURA_ENVIOUS, +"Excited" = AURA_EXCITED, +"Generous" = AURA_GENEROUS, +"Happy" = AURA_HAPPY, +"Hateful" = AURA_HATEFUL, +"Idealistic" = AURA_IDEALISTIC, +"Innocent" = AURA_INNOCENT, +"Lovestruck" = AURA_LOVESTRUCK, +"Obsessed" = AURA_OBSESSED, +"Sad" = AURA_SAD, +"Spiritual" = AURA_SPIRITUAL, +"Suspicious" = AURA_SUSPICIOUS, +"Anxious" = AURA_ANXIOUS, +"Confused" = AURA_CONFUSED, +"Daydreaming" = AURA_DAYDREAMING, +"Psychotic" = AURA_PSYCHOTIC))) diff --git a/code/__DEFINES/~darkpack/banning.dm b/code/__DEFINES/~darkpack/banning.dm new file mode 100644 index 000000000000..6e320960cbe9 --- /dev/null +++ b/code/__DEFINES/~darkpack/banning.dm @@ -0,0 +1 @@ +#define BAN_LOOC "LOOC" diff --git a/code/__DEFINES/~darkpack/beastmaster.dm b/code/__DEFINES/~darkpack/beastmaster.dm new file mode 100644 index 000000000000..f2f06d41424f --- /dev/null +++ b/code/__DEFINES/~darkpack/beastmaster.dm @@ -0,0 +1 @@ +#define BB_BEASTMASTER_ENEMIES_LIST "beastmaster_enemies" diff --git a/code/__DEFINES/~darkpack/branding.dm b/code/__DEFINES/~darkpack/branding.dm index 1a59ebf73488..774626bc4970 100644 --- a/code/__DEFINES/~darkpack/branding.dm +++ b/code/__DEFINES/~darkpack/branding.dm @@ -1,2 +1,221 @@ #define CITY_NAME "San Francisco" -#define CITY_POLICE_DEPARTMENT "San Francisco Police Department" +#define CITY_POLICE_DEPARTMENT CITY_NAME + " Police Department" + +#define NEWSPAPER_COMPANY "Angel Times" + +#define SEPT_NAME "Sept of the Western Eye" + +#define EVIL_COMPANY "Pentex" + +#define MAIN_EVIL_COMPANY EVIL_OIL_COMPANY // Only effects Pentex job slots + +// Treated as subsidary of EVIL_COMPANY +/* MAJOR COMPANIES - Currently or at one time held the Top 21 Company title */ +#define EVIL_TRASH_COMPANY "Ardus Enterprises" +#define EVIL_TOY_COMPANY "Avalon Incorporated." +#define EVIL_CIGARETTE_COMPANY "Circinus Brands" +#define EVIL_INVESTMENT_COMPANY "Consolidex Worldwide" +#define EVIL_OIL_COMPANY "Endron International" +#define EVIL_NUCLEAR_COMPANY "Atlas International" // Subsidiary of Endron +#define EVIL_MINING_COMPANY "Harold and Harold Mining, Incorporated" +#define EVIL_PAPER_COMPANY "Good House International" +#define EVIL_FISHING_COMPANY "Hallahan Fishing Company" +#define EVIL_GROCERY_COMPANY "Herrick's" +#define EVIL_LIQUOR_COMPANY "King Breweries and Distilleries" +#define EVIL_PHARMA_COMPANY "Magadon, Incorporated" +#define EVIL_COSMETICS_COMPANY "Aesop Research Company" // Subsidiary of Magadon +#define EVIL_HOSPITAL_COMPANY "Autumn Health Management Systems" // Subsidiary of Magadon +#define EVIL_AVIATION_COMPANY "Nastrum Enterprises" +#define EVIL_TELEVISION_COMPANY "Omni Television" +#define EVIL_FAST_FOOD_COMPANY "O'Tolley's" +#define EVIL_TTRPG_COMPANY "Black Dog Game Factory" +#define EVIL_PLASTIC_COMPANY "Rainbow Incorporated" +#define EVIL_COMPUTER_COMPANY "Tellus Enterprises" +#define EVIL_COMPUTER_COMPANY_2 "Sunburst Computers" // Subsidiary of Tellus +#define EVIL_PUBLISHING_COMPANY "Vesuvius Incorporated" +#define EVIL_FOOD_COMPANY "Young and Smith, Incorporated" + +/* ENDRON SUBSIDIARIES */ +#define EVIL_ENGINE_COMPANY "Easton Exploratory Energies" +#define EVIL_CAR_COMPANY "Falcon Motors" +#define EVIL_EGYPTIAN_OIL_COMPANY "EGPC" + +/* HAROLD AND HAROLD SUBSIDIARIES */ +#define EVIL_EGYPTIAN_MINING_COMPANY "Kaulet Mining" + +/* KING BREWERIES SUBSIDIARIES */ +#define EVIL_WATERWAY_COMPANY "AquaClear Foundation" +#define EVIL_WINE_COMPANY "Dragon Valley Vineyards" +#define EVIL_BEER_COMPANY "King Breweries" +#define EVIL_LIQUOR_IMPORT_COMPANY "King Import Company" +#define EVIL_DISTILLER_COMPANY "King Spirits" +#define EVIL_VODKA_COMPANY "Ruskaiya Distilleries" +#define EVIL_ALE_COMPANY "Ten Tickle Ales" +#define EVIL_SELTZER_COMPANY "Thaw Beverages" + +/* MAGADON SUBSIDIAIRES */ +#define EVIL_OLD_PEOPLE_COMPANY "Campesi Gerontological Research" +#define EVIL_NUTRITION_COMPANY "General Health and Nutrition" +#define EVIL_DRUG_TESTING_COMPANY "PANACEA Pharmaceuticals" +#define EVIL_EGYPTIAN_DRUG_COMPANY "Hearst Pharmaceuticals" + +/* NASTRUM SUBSIDIARIES */ +#define EVIL_MILITARY_ELECTRONICS_COMPANY "Mars Electronics" + +/* BLACK DOG SUBSIDIARIES */ +#define EVIL_ICELAND_COMPANY "PCP" // This is actually their parent company, but it isn't in the Top 21 +#define EVIL_TTRPG_COMPANY_2 "Death Lord Games" + +/* TELLUS SUBSIDIARIES */ +#define EVIL_FREELANCE_DEV_COMPANY "Fatalistic" +#define EVIL_INDIE_COMPANY "Nightmare Engine Studios" +#define EVIL_JAPANESE_PUBLISHING_COMPANY "Tellus of Japan" // Formerly Tetsumomo Studios +#define EVIL_JAPANESE_STUDIO "Wotan Studios" + +/* VESUVIUS SUBSIDIARIES */ +#define EVIL_COMIC_COMPANY "POW Comics" + +/* DIRECT PENTEX SUBISIDIARES */ +#define EVIL_SCHOOL_COMPANY "Bradford Incorporated." +#define EVIL_CREDIT_COMPANY "Credicorps" +#define EVIL_COSMETICS_COMPANY_2 "Siren Cosmetics" +#define EVIL_COSMETICS_COMPANY_3 "Pangloss Cosmetics" // Subsidiary of Siren Cosmetics +#define EVIL_WEAPON_COMPANY "Full Force Solutions" +#define EVIL_PR_COMPANY "Gaia Research Company" +#define EVIL_HANDGUN_COMPANY "Herculean Firearms Incorporated" +#define EVIL_CONSTRUCTION_COMPANY "Hi-Quality Builders" +#define EVIL_LAW_COMPANY "Meyers, Feinstein and Hargrett" +#define EVIL_TECH_COMPANY "NikNak Computing" +#define EVIL_GAMING_COMPANY "Deep Dive Games" // Subsidiary of NikNak +#define EVIL_NEWS_COMPANY "RED Network" +#define EVIL_CONTSTRUCTION_COMPANY_2 "Safe Haven Construction" +#define EVIL_INTEL_COMPANY "Shade, Inc." +#define EVIL_HORROR_COMPANY "Slaughterhouse Video" +#define EVIL_CONSULTING_COMPANY "Southeastern Tech Management" +#define EVIL_ENERGY_COMPANY "Everlite Gas & Electric" +#define EVIL_COPYRIGHT_COMPANY "Genefex" // Not a subsidiary, but supports EVIL_COMPANY subsidiaries + +// Generic companies - Some are still evil, but not under EVIL_COMPANY +#define BRAND_BAIL_BOND_COMPANY "A & B Kilpatrick's Bail Bonds" +#define BRAND_TTRPG_COMPANY "Apex Amusement Association" +#define BRAND_IMPORTS_COMPANY "Ashukhi Corporation" +#define BRAND_NIGHTCLUB_COMPANY "The Asylum" +#define BRAND_CHILD_CARE_COMPANY "Aunt Charlotte's Child Care" // Weaver tainted company +#define BRAND_ICE_CREAM_COMPANY "Banana Split" +#define BRAND_VIDEO_COMPANY "Block Party Videos" // Front company for the NWO - Owned by the Syndicate +#define BRAND_MECHANIC_COMPANY "Brothers Downtown Garage" +#define BRAND_SCRAPYARD_COMAPNY "Brothers Salvage" // Subsidiary of Brothers Downtown Garage +#define BRAND_COFFEE_COMPANY "C. Moore's Coffee" +#define BRAND_ENERGY_COMPANY "Chemikon" +#define BRAND_RAMEN_COMPANY "Chiki Mei-Mei Ramen" +#define BRAND_TACO_COMPANY "Chubby's Taco Shack" +#define BRAND_NIGHTCLUB_COMPANY_2 "Club Confession" +#define BRAND_PHARMA_COMPANY "Crucible Genetics Amalgamated" +#define BRAND_TTRPG_COMPANY_2 "Cryptograph" +#define BRAND_TTRPG_COMPANY_3 "Death Lord Games" +#define BRAND_PORN_COMPANY "Death Mask Productions" +#define BRAND_GENETICS_COMPANY "Developmental Neogenetics Amalgamated" +#define BRAND_TATTOO_COMPANY "Devil's Brand Tattoo" +#define BRAND_TTRPG_COMPANY_4 "Discordium" +#define BRAND_TECH_COMPANY "DodecaTechnoCo" +#define BRAND_SHIPPING_COMPANY "Ash Shipping" +#define BRAND_CAPITALISM_COMPANY "DotGEO Futures" // Front company for the Camarilla +#define BRAND_TECH_COMPANY_2 "Double Spiral" +#define BRAND_SHIPPING_COMPANY_2 "EEP Shipping" +#define BRAND_SHIPPING_COMPANY_3 "Gary Export Company" // Front company to transport Kindred into Gary Indiana +#define BRAND_LAW_COMPANY "Hernandez and Associates" // Specializes in animal rights, owned by Gangrel Rosa Hernandez +#define BRAND_ECONOMY_COMPANY "Newman-Feng BlueTech" +#define BRAND_ART_COMPANY "Rosemond Society" +#define BRAND_SMUGGLING_COMPANY "Sugar Trust" +#define BRAND_RECORD_COMPANY "Temple of Boom" +#define BRAND_FILM_COMPANY "Elegant Pictures" +#define BRAND_HOTEL_COMPANY "Empire Arms Hotels" +#define BRAND_TOFU_COMPANY "Extreme Tofu" +#define BRAND_SHIPPING_COMPANY_4 "Foxy Boxes" +#define BRAND_NONPROFIT_COMPANY "Fraser Foundation" +#define BRAND_CAPITALISM_COMPANY_2 "Fu Syndicate" +#define BRAND_ART_COMPANY_2 "Gallery Noir" +#define BRAND_PROSTHETICS_COMPANY "Gimble's Prosthetics" +#define BRAND_NIGHTCLUB_COMPANY_3 "Glaze" +#define BRAND_FISH_COMPANY "Golden Oceans Fish Market" +#define BRAND_COFFEE_COMPANY_2 "gosh!coffee" +#define BRAND_ENVRIONMENTAL_COMPANY "Green Weave Enterprises" // Owned and ran by Glasswalkers +#define BRAND_HOTEL_COMPANY_2 "Hallowbrook Hotels" +#define BRAND_BANKING_COMPANY "Huaxia Bank" +#define BRAND_PIZZA_COMPANY "Hungry Veggie's No Meatza" +#define BRAND_WATCH_COMPANY "Huntley Watches" +#define BRAND_INVESTMENT_COMPANY "Insight Investments" +#define BRAND_BABY_FOOD_COMPANY "Insurrection Baby Food Formula Company" +#define BRAND_TECH_COMPANY_3 "JBX Solutions" +#define BRAND_CRYO_COMPANY "JDG Cryogenics" +#define BRAND_COMPUTER_COMPANY "Kamikazi Zen" +#define BRAND_AI_COMPANY "Keen Corporation" +#define BRAND_CAPITALISM_COMPANY_3 "LaCroix Foundation" // Yes, that LaCroix +#define BRAND_PROJECTION_COMPANY "Lazarus Redux" // Founded by members of the Orpheus Group +#define BRAND_MASSAGE_COMPANY "Lotus Blossom" +#define BRAND_TTRPG_COMPANY_5 "LSD, Inc." +#define BRAND_COMPUTER_COMPANY_2 "Macrosoft" +#define BRAND_TTRPG_COMPANY_6 "Magicians of the Bay" +#define BRAND_CHINESE_FOOD_COMPANY "Mao Long Restaurant" +#define BRAND_COMPUTER_COMPANY_6 "Megahurtz Computing" +#define BRAND_GHOST_COMPANY "Monster-X" +#define BRAND_FOOD_COMPANY "Neldner Wellness Group" +#define BRAND_PRIVATE_SECURITY_COMPANY "Neo Albion" +#define BRAND_PROJECTION_COMPANY_2 "NextWorld" +#define BRAND_THEATRE_COMPANY "Nocturne Theatres" +#define BRAND_PROJECTION_COMPANY_3 "Orpheus Group" +#define BRAND_FILM_COMPANY_2 "Parasite Studios" +#define BRAND_GHOST_COMPANY_2 "Phantom Nabbers" +#define BRAND_ARCADE_COMPANY "Playtime Arcades" +#define BRAND_HOUSING_COMPANY "Pleasant Homes" +#define BRAND_TECH_COMPANY_4 "Re:Venge" +#define BRAND_CHINESE_FOOD_COMPANY_2 "Red Dragon" +#define BRAND_FAST_FOOD_COMPANY "S&M: All Deviant Food" +#define BRAND_DEPARTMENT_STORE_COMPANY "Shanghai Zhonglian Department Stores" +#define BRAND_TECH_COMPANY_5 "Shinzui Industries" // Basically Weaver Pentex +#define BRAND_SMOKING_COMPANY "The Smoke Shop" +#define BRAND_FAST_FOOD_COMPANY_2 "Space Burger" +#define BRAND_COFFEE_COMPANY_3 "Spooky Brews" +#define BRAND_TTRPG_COMPANY_7 "Stan Paxton Games" +#define BRAND_DEPARTMENT_STORE_COMPANY_2 "Star-Mart" +#define BRAND_GAS_COMPANY "SunCo Gasoline" +#define BRAND_GAMES_COMPANY "Sweatshop Games" +#define BRAND_DATING_COMPANY "Tender" +#define BRAND_PROJECTION_COMPANY_4 "Terrel & Squib" +#define BRAND_PROJECTION_COMPANY_5 "Tranquility, Inc." +#define BRAND_DRUG_COMPANY "Tseng's Herbal Remedies" +#define BRAND_GAMES_COMPANY_2 "WebWorks" +#define BRAND_CURIO_COMPANY "White Cloud" +#define BRAND_RAMEN_COMPANY_2 "Wu Family Ramen" +#define BRAND_GLASSES_COMPANY "Wuliangcai Glasses" +#define BRAND_TELECOM_COMPANY "XTend Ltd." +#define BRAND_SHIPPING_COMPANY_5 "Zhao's Imports" + +// Invidiual products +#define BRAND_CHOCOLATE_BAR "100 Rando" +#define BRAND_CHOCOLATE_BAR_2 "5th Venue" +#define BRAND_CHOCOLATE_BAR_3 "Big Lunk" +#define BRAND_BUBBLEGUM "Bubble Bum" +#define BRAND_CHOCOLATE_BAR_4 "DayDay" +#define BRAND_CHOCOLATE_BAR_5 "Eat" +#define BRAND_CHOCOLATE_BAR_6 "Fiix" +#define BRAND_CHOCOLATE_BAR_7 "Farefree" +#define BRAND_CHOCOLATE_BAR_8 "Hers His" +#define BRAND_CHOCOLATE_BAR_9 "MilkyMan" +#define BRAND_CHOCOLATE_BAR_10 "Mr. Goo Goo" +#define BRAND_CHOCOLATE_BAR_11 "n&n's" +#define BRAND_CHOCOLATE_BAR_12 "PitPat" +#define BRAND_CHOCOLATE_BAR_13 "Pounds" +#define BRAND_CANDIES "Srittles" +#define BRAND_CHOCOLATE_BAR_14 "STork" +#define BRAND_SODA_COMPANY "Cepsi" +#define BRAND_SODA_COMPANY_2 "Diet Cock" +#define BRAND_TTRPG_SYSTEM "CRUNCH" + +// Other Groups +#define BRAND_BAND "Bronx Cheer" // Kindred mashup band +#define BRAND_BAND_2 "Lilith's Satanic Blood" +#define BRAND_BAND_3 "Phyre" +#define BRAND_BAND_4 "Seventh Son" // Led by the Prince of Denver +#define BRAND_BAND_5 "Ynglinga" +// We should really port shiptest or tgmc's branding examine text stuff diff --git a/code/__DEFINES/~darkpack/colors.dm b/code/__DEFINES/~darkpack/colors.dm new file mode 100644 index 000000000000..ba63b538ad1b --- /dev/null +++ b/code/__DEFINES/~darkpack/colors.dm @@ -0,0 +1 @@ +#define COLOR_ENDRON_GREEN "#015334" diff --git a/code/__DEFINES/~darkpack/combat.dm b/code/__DEFINES/~darkpack/combat.dm new file mode 100644 index 000000000000..629e884fd051 --- /dev/null +++ b/code/__DEFINES/~darkpack/combat.dm @@ -0,0 +1,14 @@ +//normal duration defines +///Duration of one "turn", which is 5 seconds according to us +#define TURNS * 5 SECONDS +///Duration of one "scene", which is 3 minutes according to us +#define SCENES * 3 MINUTES + +// To eyeball damage as its calcuated in the ttrpg +#define TTRPG_DAMAGE * 5 + +// Unused for now +#define BASHING "bashing" +#define LETHAL "lethal" +// exists in code/__DEFINES/~darkpack/aggravated_damage.dm +//#define AGGRAVATED diff --git a/code/__DEFINES/~darkpack/crimes.dm b/code/__DEFINES/~darkpack/crimes.dm new file mode 100644 index 000000000000..8fe9bc535867 --- /dev/null +++ b/code/__DEFINES/~darkpack/crimes.dm @@ -0,0 +1,6 @@ +#define CRIME_GUNSHOTS "Gunshots" +#define CRIME_FIREFIGHT "Firefight" +#define CRIME_MURDER "Murder" +#define CRIME_BURGLARY "Burglary" +#define CRIME_EMERGENCY "Emergency Alarm" +#define CRIME_ATM_TAMPERING "Atm Tampering" diff --git a/code/__DEFINES/~darkpack/darkpack_roles.dm b/code/__DEFINES/~darkpack/darkpack_roles.dm index 5b62248cf520..14956df5d163 100644 --- a/code/__DEFINES/~darkpack/darkpack_roles.dm +++ b/code/__DEFINES/~darkpack/darkpack_roles.dm @@ -1 +1,6 @@ +// Roles for all the different possible darkpack ghost spawns. #define ROLE_GHOUL "Ghoul" +#define ROLE_FIRST_TEAM "First Team" +#define ROLE_SWAT "SWAT" +#define ROLE_SABBAT "Sabbat" +#define ROLE_NATIONAL_GUARD "National Guard" diff --git a/code/__DEFINES/~darkpack/dcs/fire_signals.dm b/code/__DEFINES/~darkpack/dcs/fire_signals.dm new file mode 100644 index 000000000000..75a503dbab1e --- /dev/null +++ b/code/__DEFINES/~darkpack/dcs/fire_signals.dm @@ -0,0 +1,9 @@ +///From /datum/hotspot/perform_exposure() +#define COMSIG_TURF_HOTSPOT_EXPOSE "turf_hotspot_expose" +///From /turf/ignite_turf(): (power, fire_color) +#define COMSIG_TURF_IGNITED "turf_ignited" + ///Prevents hotspots and turf fires + #define SUPPRESS_FIRE (1<<0) +///From /obj/item/open_flame(): (flame_heat) +#define COMSIG_TURF_OPEN_FLAME "open_flame" + #define BLOCK_TURF_IGNITION (1<<0) diff --git a/code/__DEFINES/~darkpack/dcs/signals/signals_global.dm b/code/__DEFINES/~darkpack/dcs/signals/signals_global.dm new file mode 100644 index 000000000000..267c90a8a593 --- /dev/null +++ b/code/__DEFINES/~darkpack/dcs/signals/signals_global.dm @@ -0,0 +1 @@ +#define COMSIG_GLOB_REPORT_CRIME "report_crime" diff --git a/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob.dm b/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob.dm new file mode 100644 index 000000000000..2f34b021ea4e --- /dev/null +++ b/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob.dm @@ -0,0 +1,2 @@ +#define COMSIG_MOB_EMOTION_CHANGED "mob_emotion_changed" +#define COMSIG_MOB_UPDATE_AURA "mob_update_aura" diff --git a/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm b/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm index b759312eac0d..0ea48837babf 100644 --- a/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm @@ -1 +1,9 @@ #define COMSIG_LIVING_JUMP_PREP_TOGGLE "living_jump_prep_toggle" + +//from base of living/set_pull_offset(): (mob/living/pull_target, grab_state) +#define COMSIG_LIVING_SET_PULL_OFFSET "living_set_pull_offset" +//from base of living/reset_pull_offsets(): (mob/living/pull_target, override) +#define COMSIG_LIVING_RESET_PULL_OFFSETS "living_reset_pull_offsets" +//from base of living/CanAllowThrough(): (atom/movable/mover, border_dir) +#define COMSIG_LIVING_CAN_ALLOW_THROUGH "living_can_allow_through" + #define COMPONENT_LIVING_PASSABLE (1<<0) diff --git a/code/__DEFINES/~darkpack/dcs/splat_signals.dm b/code/__DEFINES/~darkpack/dcs/splat_signals.dm new file mode 100644 index 000000000000..a431bb20db54 --- /dev/null +++ b/code/__DEFINES/~darkpack/dcs/splat_signals.dm @@ -0,0 +1,9 @@ +/// From /datum/splat/assign(): (mob/living/source, datum/splat/splat) +#define COMSIG_LIVING_GAINING_SPLAT "living_gaining_splat" + /// Prevent the splat from being gained, cancel assign() + #define SPLAT_PREVENT_GAIN (1<<0) +/// From /datum/splat/assign(): (mob/living/source, datum/splat/splat) +#define COMSIG_LIVING_GAINED_SPLAT "living_gained_splat" + +/// From /datum/splat/unassign(): (mob/living/source, datum/splat/splat) +#define COMSIG_LIVING_LOSE_SPLAT "living_lose_splat" diff --git a/code/__DEFINES/~darkpack/discipline.dm b/code/__DEFINES/~darkpack/discipline.dm index 9a9f8bef28b2..10f85f1b3b4b 100644 --- a/code/__DEFINES/~darkpack/discipline.dm +++ b/code/__DEFINES/~darkpack/discipline.dm @@ -1,9 +1,3 @@ -//normal duration defines -///Duration of one "turn", which is 5 seconds according to us -#define TURNS * 5 SECONDS -///Duration of one "scene", which is 3 minutes according to us -#define SCENES * 3 MINUTES - //targeting bitflags, NONE or 0 if targeting self exclusively ///Allows for self to also be selected in ranged targeting, SET TO 0 IF NOT TARGETED OR RANGED #define TARGET_SELF (1<<0) @@ -45,6 +39,8 @@ #define DISC_CHECK_SPEAK (1<<6) ///Caster must be able to see #define DISC_CHECK_SEE (1<<7) +///Caster must see the target directly (without the usage of auspex for example) +#define DISC_CHECK_DIRECT_SEE (1<<8) //power type defines, will be useful when it's made generic ///Power is a Discipline of the Vampire: The Masquerade game line diff --git a/code/__DEFINES/~darkpack/economy.dm b/code/__DEFINES/~darkpack/economy.dm index 437072c75854..72b804cd9676 100644 --- a/code/__DEFINES/~darkpack/economy.dm +++ b/code/__DEFINES/~darkpack/economy.dm @@ -1,4 +1,5 @@ #define is_creditcard(I) (istype(I, /obj/item/card/credit)) #define MINIMUM_WAGE 8 +// To allow for adjustion of inflation across a setting without too much of a headache. #define COST_OF_EGGS 3.60 diff --git a/code/__DEFINES/~darkpack/flavor_text.dm b/code/__DEFINES/~darkpack/flavor_text.dm new file mode 100644 index 000000000000..6ea5c18d398a --- /dev/null +++ b/code/__DEFINES/~darkpack/flavor_text.dm @@ -0,0 +1,17 @@ +#define MAX_FLAVOR_LEN 4096 //double the maximum message length. + +/// Examine Panel headshot +#define EXAMINE_DNA_HEADSHOT "headshot" +/// Examine Panel flavor text +#define EXAMINE_DNA_FLAVOR_TEXT "flavor_text" +/// Examine Panel flavor text +#define EXAMINE_DNA_NSFW_FLAVOR_TEXT "nsfw_flavor_text" +/// Examine Panel OOC notes +#define EXAMINE_DNA_CHARACTER_NOTES "character_notes" +/// Examine Panel OOC notes +#define EXAMINE_DNA_OOC_NOTES "ooc_notes" + +/// How many characters will be displayed in the flavor text preview before we cut it off? +#define FLAVOR_PREVIEW_LIMIT 110 +/// The default value that will go in any new player's exploitables. +#define EXPLOITABLE_DEFAULT_TEXT "This is where you put flaws that can be exploited in any way. This will be viewable by certain discplines if you modify this string, but only if there's anything at all in this box." diff --git a/code/__DEFINES/~darkpack/generations.dm b/code/__DEFINES/~darkpack/generations.dm new file mode 100644 index 000000000000..d8b48a78e502 --- /dev/null +++ b/code/__DEFINES/~darkpack/generations.dm @@ -0,0 +1,31 @@ +/** + * Generation defines + * Higher = weaker + * Lower = stronger + */ + +/// Limit for highest generation possible, Based off v20 Beckket's Jyhad Diary +#define HIGHEST_GENERATION_LIMIT 16 +/// Limit for lowest generation possible +#define LOWEST_GENERATION_LIMIT 1 +/// Limit for lowest public generation +#define MAX_PUBLIC_GENERATION 10 +/// Limit for lowest trusted player generation +#define MAX_TRUSTED_GENERATION 8 +/// The default generation every kindred begins at +#define DEFAULT_GENERATION 13 +// The generation a ghoul is. This is purely so that ghouls can use disciplines on humans only. +#define GHOUL_GENERATION HIGHEST_GENERATION_LIMIT + 1 +// The generation a human is. +#define HUMAN_GENERATION GHOUL_GENERATION + 1 +// The lowest generation that anyone using Blood of Potency can go down to. +#define BLOOD_POTENCY_GENERATION 4 + +//Rank definitions. + +#define MAX_PUBLIC_RANK 4 +#define MAX_TRUSTED_RANK 5 +#define MINIMUM_LUPUS_ATHRO_AGE 7 +#define MINIMUM_ATHRO_AGE 21 +#define MINIMUM_LUPUS_ELDER_AGE 15 +#define MINIMUM_ELDER_AGE 30 diff --git a/code/__DEFINES/~darkpack/guestbook.dm b/code/__DEFINES/~darkpack/guestbook.dm new file mode 100644 index 000000000000..b27992f4ca12 --- /dev/null +++ b/code/__DEFINES/~darkpack/guestbook.dm @@ -0,0 +1,9 @@ +// ~guestbook_flags variable on datum/job +/// We will know absolutely everyone, no matter the department +#define GUESTBOOK_OMNISCIENT (1 << 0) +/// We will know others of the same job type +#define GUESTBOOK_JOB (1 << 1) +/// We will know others in our departments +#define GUESTBOOK_DEPARTMENT (1 << 2) +/// We will not be known by others, even if they pass checks in any way otherwise +#define GUESTBOOK_FORGETMENOT (1 << 3) diff --git a/code/__DEFINES/~darkpack/is_helpers.dm b/code/__DEFINES/~darkpack/is_helpers.dm new file mode 100644 index 000000000000..bfe45ef9c953 --- /dev/null +++ b/code/__DEFINES/~darkpack/is_helpers.dm @@ -0,0 +1,5 @@ +#define is_vampire_job(job_type) (istype(job_type, /datum/job/vampire)) +#define is_prince_job(job_type) (istype(job_type, /datum/job/vampire/prince)) +#define is_sabbatist(job_type) (istype(job_type, /datum/job/vampire/sabbatpack || /datum/job/vampire/sabbatpriest || /datum/job/vampire/sabbatductus)) +#define is_sabbat_priest(job_type) (istype(job_type, /datum/job/vampire/sabbatpriest)) +#define is_sabbat_ductus(job_type) (istype(job_type, /datum/job/vampire/sabbatductus)) diff --git a/code/__DEFINES/~darkpack/jobs.dm b/code/__DEFINES/~darkpack/jobs.dm new file mode 100644 index 000000000000..bd3c6c1388c8 --- /dev/null +++ b/code/__DEFINES/~darkpack/jobs.dm @@ -0,0 +1,265 @@ +/** + * ======================= + * WARNING WARNING WARNING + * WARNING WARNING WARNING + * WARNING WARNING WARNING + * ======================= + * These names are used as keys in many locations in the database + * you cannot change them trivially without breaking job bans and + * role time tracking, if you do this and get it wrong you will die + * and it will hurt the entire time + */ + +//No department +#define JOB_CITIZEN "Citizen" +#define JOB_ORDINARY_CITIZEN "Ordinary Citizen" +#define JOB_BARISTA "Barista" +#define JOB_GRAVEYARD_KEEPER "Graveyard Keeper" +#define JOB_STREET_JANITOR "Street Janitor" +#define JOB_CLUB_WORKER "Club Worker" +#define JOB_TAXI_DRIVER "Taxi Driver" + +//Camarilla +#define JOB_PRINCE "Prince" +#define JOB_SHERIFF "Sheriff" +#define JOB_HOUND "Hound" +#define JOB_HARPY "Harpy" +#define JOB_SENESCHAL "Seneschal" +#define JOB_TOWERWORK "Tower Employee" + +//Primogens +#define JOB_PRIMOGEN_TOREADOR "Primogen Toreador" +#define JOB_PRIMOGEN_BANU_HAQIM "Primogen Banu Haqim" +#define JOB_PRIMOGEN_LASOMBRA "Primogen Lasombra" +#define JOB_PRIMOGEN_MALKAVIAN "Primogen Malkavian" +#define JOB_PRIMOGEN_NOSFERATU "Primogen Nosferatu" +#define JOB_PRIMOGEN_VENTRUE "Primogen Ventrue" + +//Anarch +#define JOB_BARON "Baron" +#define JOB_TAPSTER "Tapster" +#define JOB_BRUISER "Bruiser" +#define JOB_EMISSARY "Emissary" +#define JOB_SWEEPER "Sweeper" + +//Tremere +#define JOB_CHANTRY_ARCHIVIST "Chantry Archivist" +#define JOB_CHANTRY_REGENT "Chantry Regent" +#define JOB_CHANTRY_GARGOYLE "Chantry Gargoyle" + +//Tzimisce +#define JOB_BOGATYR "Bogatyr" +#define JOB_VOIVODE "Voivode" +#define JOB_ZADRUGA "Zadruga" + +//Police +#define JOB_POLICE_CHIEF "Police Chief" +#define JOB_POLICE_SERGEANT "Police Sergeant" +#define JOB_POLICE_OFFICER "Police Officer" +#define JOB_EMERGENCY_DISPATCHER "Emergency Dispatcher" +#define JOB_FEDERAL_INVESTIGATOR "Federal Investigator" +#define JOB_NATIONAL_GUARD "National Guard Soldier" +#define JOB_POLICE_SWAT "Swat Officer" + +//Clinic +#define JOB_CLINIC_DIRECTOR "Clinic Director" +#define JOB_DOCTOR "Doctor" + +//Church +#define JOB_PRIEST "Priest" + +//Giovanni +#define JOB_CAPO "Capo" +#define JOB_LA_SQUADRA "La Squadra" +#define JOB_LA_FAMIGLIA "La Famiglia" + +//Sabbat +#define JOB_SABBAT_DUCTUS "Sabbat Ductus" +#define JOB_SABBAT_PRIEST "Sabbat Priest" +#define JOB_SABBAT_PACK "Sabbat Pack" +#define JOB_SABBAT_SABBATIST "Sabbatist" + +// Axe Gang +#define JOB_AXE_LEADER "Screentender" +#define JOB_AXE_GANG "Axe Gang" + +// Supply +#define JOB_DEALER "Dealer" +#define JOB_SUPPLY_TECH "Dealer" + +// Forest Wolves +#define JOB_GAROU_COUNCIL "Councillor" // Elder, Athro +#define JOB_GAROU_TRUTHCATCHER "Truthcatcher" // Adren+ +#define JOB_GAROU_WARDER "Warder" // Adren+ +#define JOB_GAROU_WYRMFOE "Wyrmfoe" // Fostern +#define JOB_GAROU_GUARDIAN "Guardian" + +// Pentex +#define JOB_PENTEX_FIRST "First Team" +#define JOB_PENTEX_LEAD "Branch Lead" +#define JOB_PENTEX_EXEC "Executive" +#define JOB_PENTEX_AFFAIRS "Internal Affairs Agent" +#define JOB_PENTEX_SEC_CHIEF "Chief of Security" +#define JOB_PENTEX_SEC "Security Agent" +#define JOB_PENTEX_EMPLOYEE "Employee" + +////////////////////////////////////////////////// + +#define JOB_DISPLAY_ORDER_CITIZEN 1 + +#define JOB_DISPLAY_ORDER_PRINCE 2 +#define JOB_DISPLAY_ORDER_CLERK 3 +#define JOB_DISPLAY_ORDER_SHERIFF 4 +#define JOB_DISPLAY_ORDER_HARPY 5 +#define JOB_DISPLAY_ORDER_HOUND 6 +#define JOB_DISPLAY_ORDER_TOWERWORK 7 +#define JOB_DISPLAY_ORDER_BANU 8 +#define JOB_DISPLAY_ORDER_LASOMBRA 9 +#define JOB_DISPLAY_ORDER_MALKAVIAN 10 +#define JOB_DISPLAY_ORDER_NOSFERATU 11 +#define JOB_DISPLAY_ORDER_TOREADOR 12 +#define JOB_DISPLAY_ORDER_VENTRUE 13 + + +#define JOB_DISPLAY_ORDER_CLINICS_DIRECTOR 14 +#define JOB_DISPLAY_ORDER_DOCTOR 15 + +#define JOB_DISPLAY_ORDER_GRAVEYARD 16 +#define JOB_DISPLAY_ORDER_STREETJAN 17 +#define JOB_DISPLAY_ORDER_STRIP 18 +#define JOB_DISPLAY_ORDER_TAXI 19 +#define JOB_DISPLAY_ORDER_PRIEST 20 + +#define JOB_DISPLAY_ORDER_SUPPLY 21 +#define JOB_DISPLAY_ORDER_DEALER 22 + +#define JOB_DISPLAY_ORDER_BARON 23 +#define JOB_DISPLAY_ORDER_EMISSARY 24 +#define JOB_DISPLAY_ORDER_SWEEPER 25 +#define JOB_DISPLAY_ORDER_BRUISER 26 +#define JOB_DISPLAY_ORDER_LIAISON 27 +#define JOB_DISPLAY_ORDER_TAPSTER 28 + +#define JOB_DISPLAY_ORDER_REGENT 29 +#define JOB_DISPLAY_ORDER_ARCHIVIST 30 +#define JOB_DISPLAY_ORDER_GARGOYLE 31 + +#define JOB_DISPLAY_ORDER_GIOVANNI 32 + +#define JOB_DISPLAY_ORDER_POLICE_CHIEF 33 +#define JOB_DISPLAY_ORDER_POLICE_SERGEANT 34 +#define JOB_DISPLAY_ORDER_POLICE 35 +#define JOB_DISPLAY_ORDER_FBI 36 + +#define JOB_DISPLAY_ORDER_VOIVODE 37 +#define JOB_DISPLAY_ORDER_BOGATYR 38 +#define JOB_DISPLAY_ORDER_ZADRUGA 39 + +#define JOB_DISPLAY_ORDER_SABBATDUCTUS 40 +#define JOB_DISPLAY_ORDER_SABBATPACK 41 +#define JOB_DISPLAY_ORDER_SABBATPRIEST 42 + +#define JOB_DISPLAY_ORDER_COUNCIL 43 +#define JOB_DISPLAY_ORDER_TRUTHCATCHER 44 +#define JOB_DISPLAY_ORDER_WARDER 45 +#define JOB_DISPLAY_ORDER_WYRMFOE 46 +#define JOB_DISPLAY_ORDER_GUARDIAN 47 + +#define JOB_DISPLAY_ORDER_BRANCH_LEAD 48 +#define JOB_DISPLAY_ORDER_EXECUTIVE 49 +#define JOB_DISPLAY_ORDER_AFFAIRS 50 +#define JOB_DISPLAY_ORDER_SECCHIEF 51 +#define JOB_DISPLAY_ORDER_PENTEX_SEC 52 +#define JOB_DISPLAY_ORDER_EMPLOYEE 53 + +////////////////////////////////////////////////// + +#define DEPARTMENT_BITFLAG_CITIZEN (1<<0) +#define DEPARTMENT_CITIZEN "Citizen" +#define DEPARTMENT_BITFLAG_PRINCE (1<<1) +#define DEPARTMENT_PRINCE "Prince" +#define DEPARTMENT_BITFLAG_CAMARILLA (1<<2) +#define DEPARTMENT_CAMARILLA "Camarilla" +#define DEPARTMENT_BITFLAG_CHURCH (1<<3) +#define DEPARTMENT_CHURCH "Church" +#define DEPARTMENT_BITFLAG_CLINIC (1<<4) +#define DEPARTMENT_CLINIC "Clinic" +#define DEPARTMENT_BITFLAG_ANARCH (1<<5) +#define DEPARTMENT_ANARCH "Anarch" +#define DEPARTMENT_BITFLAG_STRIP_CLUB (1<<6) +#define DEPARTMENT_STRIP_CLUB "Strip_Club" +#define DEPARTMENT_BITFLAG_SUPPLY (1<<7) +#define DEPARTMENT_SUPPLY "Warehouse" +#define DEPARTMENT_BITFLAG_GIOVANNI (1<<8) +#define DEPARTMENT_GIOVANNI "Giovanni" +#define DEPARTMENT_BITFLAG_POLICE (1<<9) +#define DEPARTMENT_POLICE "Police" +#define DEPARTMENT_BITFLAG_SABBAT (1<<10) +#define DEPARTMENT_SABBAT "Sabbat" +#define DEPARTMENT_BITFLAG_CHANTRY (1<<11) +#define DEPARTMENT_CHANTRY "Chantry" +#define DEPARTMENT_BITFLAG_MANOR (1<<12) +#define DEPARTMENT_MANOR "Manor" +#define DEPARTMENT_BITFLAG_CITY_SERVICES (1<<13) +#define DEPARTMENT_CITY_SERVICES "City_Services" +#define DEPARTMENT_BITFLAG_PENTEX (1<<14) +#define DEPARTMENT_PENTEX "Pentex" +#define DEPARTMENT_BITFLAG_GAIA (1<<15) +#define DEPARTMENT_GAIA "Garou_Nation" + +DEFINE_BITFIELD(departments_bitflags, list( + "CITIZEN" = DEPARTMENT_BITFLAG_CITIZEN, + "PRINCE" = DEPARTMENT_BITFLAG_PRINCE, + "GAIA" = DEPARTMENT_BITFLAG_GAIA, + "PENTEX" = DEPARTMENT_BITFLAG_PENTEX, + "CAMARILLA" = DEPARTMENT_BITFLAG_CAMARILLA, + "CHURCH" = DEPARTMENT_BITFLAG_CHURCH, + "CLINIC" = DEPARTMENT_BITFLAG_CLINIC, + "ANARCH" = DEPARTMENT_BITFLAG_ANARCH, + "STRIP_CLUB" = DEPARTMENT_BITFLAG_STRIP_CLUB, + "SUPPLY" = DEPARTMENT_BITFLAG_SUPPLY, + "GIOVANNI" = DEPARTMENT_BITFLAG_GIOVANNI, + "POLICE" = DEPARTMENT_BITFLAG_POLICE, + "SABBAT" = DEPARTMENT_BITFLAG_SABBAT, + "CHANTRY" = DEPARTMENT_BITFLAG_CHANTRY, + "MANOR" = DEPARTMENT_BITFLAG_MANOR, + "CITY_SERVICES" = DEPARTMENT_BITFLAG_CITY_SERVICES, +)) + +/// Combination flag for jobs which are considered regular crew members of the station. +#define CITY_JOB_FLAGS (JOB_CREW_MANIFEST|JOB_EQUIP_RANK|JOB_CREW_MEMBER|JOB_NEW_PLAYER_JOINABLE|JOB_REOPEN_ON_ROUNDSTART_LOSS|JOB_ASSIGN_QUIRKS) + +// Variable macros used to declare who is the supervisor for a given job, announced to the player when they join as any given job. +#define SUPERVISOR_TRADITIONS "the Traditions" +#define SUPERVISOR_LITANY "the Litany" +#define SUPERVISOR_PRINCE "the Prince" +#define SUPERVISOR_SHERIFF "the Sheriff" +#define SUPERVISOR_PRIMOGEN_BANU_HAQIM "the Banu Haqim Primogen" +#define SUPERVISOR_BARON "the Baron" +#define SUPERVISOR_CLINIC_DIRECTOR "the Clinic Director" +#define SUPERVISOR_CLUB_DIRECTOR "the Strip Club Owner" +#define SUPERVISOR_POLICE_CHIEF "the Police Chief" +#define SUPERVISOR_POLICE_CHIEF_AND_SERGEANT "the Police Chief and Sergeant" +#define SUPERVISOR_CAMARILLA "the Camarilla" +#define SUPERVISOR_REGENT "the Regent" +#define SUPERVISOR_SENESCHAL_PUBLIC "the COO" +#define SUPERVISOR_BARON_PUBLIC "the Bar's Owner" + +// Playtime tracking system, see jobs_exp.dm +#define EXP_TYPE_KINDRED "Kindred" +#define EXP_TYPE_GAIA "Garou Nation" +#define EXP_TYPE_SPIRAL "Pentex" +#define EXP_TYPE_CAMARILLA "Camarilla Authorities" +#define EXP_TYPE_WAREHOUSE "Supply" +#define EXP_TYPE_CHANTRY "Chantry" +#define EXP_TYPE_ANARCH "Anarchs" +#define EXP_TYPE_SABBAT "Sabbat" +#define EXP_TYPE_COUNCIL "Camarilla Primogen Council" +#define EXP_TYPE_POLICE "Police Force" +#define EXP_TYPE_NATIONAL_SECURITY "National Security" +#define EXP_TYPE_SERVICES "City Services" +#define EXP_TYPE_CLINIC "St. John's Clinic" +#define EXP_TYPE_GIOVANNI "Giovanni Family" +#define EXP_TYPE_MANOR "Tzimisce Manor" +#define EXP_TYPE_CHURCH "Church" +#define EXP_TYPE_CLUB "Strip Club" diff --git a/code/__DEFINES/~darkpack/keybinding.dm b/code/__DEFINES/~darkpack/keybinding.dm index 92b2b83a30cc..67302845b084 100644 --- a/code/__DEFINES/~darkpack/keybinding.dm +++ b/code/__DEFINES/~darkpack/keybinding.dm @@ -1,2 +1,13 @@ -//Human +// Human #define COMSIG_KB_HUMAN_BITE_DOWN "keybinding_human_bite_down" + +// Pixelshifting +#define COMSIG_KB_MOB_PIXEL_SHIFT_DOWN "keybinding_mob_pixel_shift_down" +#define COMSIG_KB_MOB_PIXEL_SHIFT_UP "keybinding_mob_pixel_shift_up" +#define COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_DOWN "keybinding_mob_item_pixelshift_down" +#define COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_UP "keybinding_mob_item_pixelshift_up" +#define COMSIG_KB_MOB_PIXEL_TILT_DOWN "keybinding_mob_pixeltilt_down" +#define COMSIG_KB_MOB_PIXEL_TILT_UP "keybinding_mob_pixeltilt_up" + +// LOOC +#define COMSIG_KB_CLIENT_LOOC_DOWN "keybinding_client_looc_down" diff --git a/code/__DEFINES/~darkpack/library.dm b/code/__DEFINES/~darkpack/library.dm new file mode 100644 index 000000000000..5fc3420fa40d --- /dev/null +++ b/code/__DEFINES/~darkpack/library.dm @@ -0,0 +1,3 @@ +#define BOOK_CATEGORY_KINDRED "Kindred" +#define BOOK_CATEGORY_LUPINE "Lupine" +#define BOOK_CATEGORY_KUEIJIN "Kuei-Jin" diff --git a/code/__DEFINES/~darkpack/lock_access_defines.dm b/code/__DEFINES/~darkpack/lock_access_defines.dm new file mode 100644 index 000000000000..2e3f3abf52cb --- /dev/null +++ b/code/__DEFINES/~darkpack/lock_access_defines.dm @@ -0,0 +1,72 @@ +#define LOCKACCESS_ALL "all" // Any door with this access can be locked and unlocked without keys. For bathroom doors etc. + +#define LOCKACCESS_CAMARILLA "camarilla" +#define LOCKACCESS_PRINCE "prince" +#define LOCKACCESS_PRIMOGEN "primogen" +#define LOCKACCESS_BANU "banuhaqim" +#define LOCKACCESS_STRIP "strip" +#define LOCKACCESS_CHANTRY "chantry" +#define LOCKACCESS_CLERK "clerk" + +#define LOCKACCESS_BANKBOSS "bankboss" +#define LOCKACCESS_BANK "bianchiBank" + +#define LOCKACCESS_THEATRE "theatre" +#define LOCKACCESS_JAZZ_CLUB "milleniumCommon" +#define LOCKACCESS_JAZZ_CLUB_DELIVERY "millenium_delivery" + +#define LOCKACCESS_DIRECTOR "director" +#define LOCKACCESS_CLINIC "clinic" + +#define LOCKACCESS_PRIMOGEN_VENTRUE "primVentrue" +#define LOCKACCESS_VENTRUE "ventrue" + +#define LOCKACCESS_PRIMOGEN_TOREADOR "primToreador" +#define LOCKACCESS_TOREADOR "toreador" + +#define LOCKACCESS_MALK_PRIMOGEN "primMalkav" +#define LOCKACCESS_MALK "malkav" + +#define LOCKACCESS_PRIMOGEN_BRUJAH "primBrujah" +#define LOCKACCESS_BRUJAH "brujah" + +#define LOCKACCESS_PRIMOGEN_NOSFERATU "primNosferatu" +#define LOCKACCESS_NOSFERATU "nosferatu" + +#define LOCKACCESS_GIOVANNI "giovanni" +#define LOCKACCESS_DAUGHTERS "daughters" +#define LOCKACCESS_CAPPADOCIAN "cappadocian" +#define LOCKACCESS_SALUBRI "salubri" +#define LOCKACCESS_OLD_CLAN_TZI "old_clan_tzimisce" +#define LOCKACCESS_BAALI "baali" + +#define LOCKACCESS_PRIMOGEN_LASOMBRA "primLasombra" +#define LOCKACCESS_LASOMBRA "lasombra" + +#define LOCKACCESS_KYASID "kyasid" + +#define LOCKACCESS_SABBAT "sabbat" + +#define LOCKACCESS_ANARCH "anarch" +#define LOCKACCESS_BAR "biker_bar" +#define LOCKACCESS_BAR_DELIVERY "bar_delivery" + +#define LOCKACCESS_SUPPLY "supply" +#define LOCKACCESS_GRAVEYARD "graveyard" +#define LOCKACCESS_CHURCH "church" +#define LOCKACCESS_TAXI "taxi" + +#define LOCKACCESS_TRAID "triad" +#define LOCKACCESS_CLEANING "cleaning" +#define LOCKACCESS_LAUNDROMAT "laundromat" + +#define LOCKACCESS_POLICE "police" +#define LOCKACCESS_DISPATCH "dispatch" +#define LOCKACCESS_POLICE_SECURE "police_secure" +#define LOCKACCESS_POLICE_CHIEF "police_chief" + +#define LOCKACCESS_WOLFTECH "wolftech" +#define LOCKACCESS_PARK_RANGER "nps" +#define LOCKACCESS_COGGIE "coggie" +#define LOCKACCESS_PENTEX "pentex" +#define LOCKACCESS_PENTEX_LEADER "pentexleader" diff --git a/code/__DEFINES/~darkpack/mapswitch.dm b/code/__DEFINES/~darkpack/mapswitch.dm index ed367425d386..6dd9bfac0f50 100644 --- a/code/__DEFINES/~darkpack/mapswitch.dm +++ b/code/__DEFINES/~darkpack/mapswitch.dm @@ -1,13 +1,6 @@ /// Uses the left operator when compiling, uses the right operator when not compiling. // Currently uses the CBT macro, but if http://www.byond.com/forum/post/2831057 is ever added, // or if map tools ever agree on a standard, this should switch to use that. -#ifdef CBT -#define WHEN_MAP(map_time) // Not mapping, nothing here -#define WHEN_COMPILE(compile_time) ##compile_time -#else -#define WHEN_MAP(map_time) ##map_time -#define WHEN_COMPILE(compile_time) // Not compiling, nothing here -#endif #if defined(CBT) || defined(SHOW_INVENTORY_ICONS) #define ONFLOOR_ICON_HELPER(_icon) onflooricon = ##_icon diff --git a/code/__DEFINES/~darkpack/mobs.dm b/code/__DEFINES/~darkpack/mobs.dm index bfbacf0b5b10..f97c6bf1bb12 100644 --- a/code/__DEFINES/~darkpack/mobs.dm +++ b/code/__DEFINES/~darkpack/mobs.dm @@ -1,22 +1,26 @@ // Defines for Species IDs. Used to refer to the name of a species, for things like bodypart names or species preferences. #define SPECIES_KINDRED "kindred" #define SPECIES_GHOUL "ghoul" +#define SPECIES_GAROU "garou" /// Health level where mobs who can Torpor will actually die #define HEALTH_THRESHOLD_TORPOR_DEAD -200 -#define iskindred(A) (is_species(A, /datum/species/human/kindred)) -#define isghoul(A) (is_species(A, /datum/species/human/ghoul)) -#define issupernatural(A) (isgarou(A) || isghoul(A) || iskindred(A)) +#define isavatar(A) (istype(A, /mob/living/basic/avatar)) +#define iszomboid(A) (istype(A, /mob/living/basic/zombie) || (istype(A, /mob/living/basic/beastmaster/giovanni_zombie))) - -// TODO: [Rebase] implement other splats +// DARKPACK TODO - implement other splats #define isgarou(A) (FALSE) +#define iswerewolf(A) (FALSE) +#define iscrinos(A) (FALSE) +#define islupus(A) (FALSE) + +#define iscorax(A) (FALSE) +#define iscorvid(A) (FALSE) +#define iscoraxcrinos(A) (FALSE) #define isnpc(A) (istype(A, /mob/living/carbon/human/npc)) -#define SOUL_PRESENT 1 -#define SOUL_ABSENT 2 -#define SOUL_PROJECTING 3 +#define INCORPOREAL_MOVE_AVATAR 4 // Avatar incorporeal movement diff --git a/code/__DEFINES/~darkpack/npc.dm b/code/__DEFINES/~darkpack/npc.dm deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/code/__DEFINES/~darkpack/phones.dm b/code/__DEFINES/~darkpack/phones.dm new file mode 100644 index 000000000000..ae4540f4924f --- /dev/null +++ b/code/__DEFINES/~darkpack/phones.dm @@ -0,0 +1,31 @@ +#define TIME_TO_RING 10 SECONDS + +#define USABLE_RADIO_FREQUENCY_FOR_PHONE_RANGE 2000 + +#define PHONE_AVAILABLE 0 +#define PHONE_RINGING 1 +#define PHONE_CALLING 2 +#define PHONE_IN_CALL 3 + +#define PHONE_NO_SIM (1<<1) +#define PHONE_OPEN (1<<2) + +DEFINE_BITFIELD(phone_flags, list( + "PHONE_NO_SIM" = PHONE_NO_SIM, + "PHONE_OPEN" = PHONE_OPEN, +)) + +// Icons used for call history logging +#define PHONE_CALL_ACCEPTED "fa-phone-volume" +#define PHONE_CALL_DECLINED "fa-phone-slash" +#define PHONE_CALL_RECEIVED "fa-phone" +#define PHONE_CALL_MISSED "fa-history" +#define PHONE_CALL_SENT "fa-share" +#define PHONE_CALL_ENDED "fa-tty" + +#define PHONE_CALL_ACCEPTED_TOOLTIP "Phone call accepted" +#define PHONE_CALL_DECLINED_TOOLTIP "Phone call declined" +#define PHONE_CALL_RECEIVED_TOOLTIP "Phone call received" +#define PHONE_CALL_MISSED_TOOLTIP "Phone call missed" +#define PHONE_CALL_SENT_TOOLTIP "Phone call sent" +#define PHONE_CALL_ENDED_TOOLTIP "Phone call ended" diff --git a/code/__DEFINES/~darkpack/radio_networks.dm b/code/__DEFINES/~darkpack/radio_networks.dm new file mode 100644 index 000000000000..16e263372bb3 --- /dev/null +++ b/code/__DEFINES/~darkpack/radio_networks.dm @@ -0,0 +1,6 @@ +#define NETWORK_POLICE "Police Network" +#define NETWORK_CLINIC "Clinic Network" +#define NETWORK_MILITARY "Military Network" +#define NETWORK_CAMARILLA "Tower Network" +#define NETWORK_ANARCH "Bar Network" +#define NETWORK_ENDRON "Endron Network" diff --git a/code/__DEFINES/~darkpack/sight.dm b/code/__DEFINES/~darkpack/sight.dm new file mode 100644 index 000000000000..6baa144fa675 --- /dev/null +++ b/code/__DEFINES/~darkpack/sight.dm @@ -0,0 +1,4 @@ +#define OBFUSCATE_INVISIBILITY 61 +#define SEE_OBFUSCATE_INVISIBLITY 61 + +#define OBSERVER_SIGHT 70 diff --git a/code/__DEFINES/~darkpack/sound.dm b/code/__DEFINES/~darkpack/sound.dm index bc4229f27650..3245805f6c6b 100644 --- a/code/__DEFINES/~darkpack/sound.dm +++ b/code/__DEFINES/~darkpack/sound.dm @@ -3,4 +3,14 @@ #define AMBIENCE_NATURE "nature" #define AMBIENCE_SEWER "sewer" #define AMBIENCE_OFFICE "office" -#define AMBIENCE_PRINCE "prince" + +//Alot of these names are pretty placeholder while we develop better lists and vibes. +#define MUSIC_CITY "city" +// Currently used as the track for any werewolf owned space +#define MUSIC_FOREST "forest" +#define MUSIC_CHURCH "church" +#define MUSIC_PRINCE "prince" +#define MUSIC_BAR "bar" +#define MUSIC_HOLLYWOOD "hollywood" +#define MUSIC_SANTAMONICA "santamonica" +#define MUSIC_SAFE "saftey" diff --git a/code/__DEFINES/~darkpack/splats.dm b/code/__DEFINES/~darkpack/splats.dm new file mode 100644 index 000000000000..e59c2678cab3 --- /dev/null +++ b/code/__DEFINES/~darkpack/splats.dm @@ -0,0 +1,2 @@ +#define SPLAT_KINDRED "splat_kindred" +#define SPLAT_GHOUL "splat_ghoul" diff --git a/code/__DEFINES/~darkpack/status_effects_debuffs.dm b/code/__DEFINES/~darkpack/status_effects_debuffs.dm index 6724bc27ceb3..f3e64f12580d 100644 --- a/code/__DEFINES/~darkpack/status_effects_debuffs.dm +++ b/code/__DEFINES/~darkpack/status_effects_debuffs.dm @@ -1,3 +1,4 @@ // This is the new file that should hold all the debuff status effects in wod13 #define STATUS_EFFECT_SILVER_SLOWDOWN /datum/status_effect/silver_slowdown //slows down any mobs with a bane to silver. +#define STATUS_EFFECT_AWE /datum/status_effect/awe diff --git a/code/__DEFINES/~darkpack/storyteller_stats.dm b/code/__DEFINES/~darkpack/storyteller_stats.dm index 426f96ce8886..e6077b527cdc 100644 --- a/code/__DEFINES/~darkpack/storyteller_stats.dm +++ b/code/__DEFINES/~darkpack/storyteller_stats.dm @@ -1,3 +1,11 @@ +// Stat Flags +#define AFFECTS_HEALTH (1<<0) +#define AFFECTS_SPEED (1<<1) +#define AFFECTS_STATS (1<<2) // If the stat affects other stats, like courage or permanent willpower. + + +#define STAT_FREEBIE_POINTS /datum/st_stat/freebie + // Physical #define STAT_STRENGTH /datum/st_stat/attribute/strength #define STAT_DEXTERITY /datum/st_stat/attribute/dexterity @@ -48,5 +56,33 @@ #define STAT_TECHNOLOGY /datum/st_stat/ability/technology // Advantages -#define STAT_BLOOD_POOL /datum/st_stat/pooled/blood_pool -#define STAT_WILLPOWER /datum/st_stat/pooled/willpower +#define STAT_PERMANENT_WILLPOWER /datum/st_stat/pooled/permanent_willpower +#define STAT_TEMPORARY_WILLPOWER /datum/st_stat/pooled/temporary_willpower + +// Virtues +#define STAT_CONSCIENCE /datum/st_stat/virtue/conscience +#define STAT_SELF_CONTROL /datum/st_stat/virtue/self_control +#define STAT_CONVICTION /datum/st_stat/virtue/conviction +#define STAT_INSTINCT /datum/st_stat/virtue/instinct +#define STAT_COURAGE /datum/st_stat/virtue/courage + +// Parent stats, mainly used for point allocation in preferences. + + +#define STAT_ATTRIBUTE "Attributes" +#define STAT_CATEGORY_MENTAL "Mental" +#define STAT_CATEGORY_SOCIAL "Social" +#define STAT_CATEGORY_PHYSICAL "Physical" + +#define STAT_ABILITY "Abilities" +#define STAT_SUBCATEGORY_TALENTS "Talents" +#define STAT_SUBCATEGORY_SKILLS "Skills" +#define STAT_SUBCATEGORY_KNOWLEDGES "Knowledges" + +#define STAT_POOLED "Pooled" +#define STAT_CATEGORY_VIRTUES "Virtues" + +// Defines used for saving of stats. +#define STAT_SCORE "score" +#define STAT_POINTS "points" +#define STAT_FREEBIE_COST_SPENT "freebie_cost_spent" diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index 738f335ba348..15d767958cbc 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -7,6 +7,14 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits. */ +// CITY_TRAITS +#define STATION_TRAIT_RED_STAR "station_trait_red_star" +#define STATION_TRAIT_WILD_MASQUERADE "station_trait_wild_masquerade" +#define STATION_TRAIT_INFESTATION "station_trait_infestation" +#define STATION_TRAIT_PEST_CONTROL "station_trait_pest_control" +#define STATION_TRAIT_STRAY_MIGRATION "station_trait_stray_migration" +#define STATION_TRAIT_COSPLAY_CONVENTION "station_trait_cosplay_convention" + // Mob traits // If the user is unbondable via blood bonds. @@ -15,23 +23,29 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_DEFICIENT_VITAE "deficient_vitae" //If the kindred is obfuscated. #define TRAIT_OBFUSCATED "obfuscated" -#define TRAIT_BLOODY_LOVER "bloody_lover" -#define TRAIT_TOUGH_FLESH "tough_flesh" -#define TRAIT_BLOODY_SUCKER "bloody_sucker" -#define TRAIT_NON_INT "non_intellectual" -#define TRAIT_COFFIN_THERAPY "coffin_therapy" -#define TRAIT_RUBICON "rubicon" -#define TRAIT_HUNGRY "hungry" -#define TRAIT_STAKE_RESISTANT "stake_resistant" -#define TRAIT_LAZY "lazy" -#define TRAIT_HOMOSEXUAL "homosexual" -#define TRAIT_HUNTED "hunted" -#define TRAIT_VIOLATOR "violator" -#define TRAIT_DIABLERIE "diablerie" -#define TRAIT_GULLET "gullet" -#define TRAIT_CHARMER "charmer" +#define TRAIT_BLOODY_LOVER "bloody_lover" +#define TRAIT_TOUGH_FLESH "tough_flesh" +#define TRAIT_BLOODY_SUCKER "bloody_sucker" +#define TRAIT_NON_INT "non_intellectual" +#define TRAIT_COFFIN_THERAPY "coffin_therapy" +#define TRAIT_RUBICON "rubicon" +#define TRAIT_HUNGRY "hungry" +#define TRAIT_STAKE_RESISTANT "stake_resistant" +#define TRAIT_STAKE_IMMUNE "stake_immune" +#define TRAIT_STAKED "staked" +#define TRAIT_LAZY "lazy" +#define TRAIT_HOMOSEXUAL "homosexual" +#define TRAIT_HUNTED "hunted" +#define TRAIT_VIOLATOR "violator" +#define TRAIT_DIABLERIE "diablerie" +#define TRAIT_GULLET "gullet" +#define TRAIT_CHARMER "charmer" +#define TRAIT_COLD_AURA "cold_aura" +#define TRAIT_WARM_AURA "warm_aura" +#define TRAIT_FRENETIC_AURA "frenetic_aura" +#define TRAIT_BLUSH_OF_HEALTH "blush_of_health" /// The mob will automatically breach the Masquerade when seen by others, with no exceptions -#define TRAIT_UNMASQUERADE "unmasquerade" +#define TRAIT_UNMASQUERADE "unmasquerade" /// The mob always dodges melee attacks #define TRAIT_ENHANCED_MELEE_DODGE "enhanced_melee_dodge" /// Can pass through walls so long as it doesn't move the mob into a new area @@ -56,7 +70,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_SENSITIVE_HUMANITY "sensitive_humanity" /// Duration of frenzy is doubled #define TRAIT_LONGER_FRENZY "longer_frenzy" -// TODO: [Rebase] refactor these traits into mutant bodyparts and a component maybe +// DARKPACK TODO - refactor these traits into mutant bodyparts and a component maybe /// If eyes are uncovered, they will be obviously supernatural to everyone nearby #define TRAIT_MASQUERADE_VIOLATING_EYES "masquerade_violating_eyes" /// If face is uncovered, they will be obviously supernatural to everyone nearby @@ -73,5 +87,25 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_BLOOD_DRINKER "blood_drinker" /// Does not biologically age, and so has a disconnected biological and chronological age #define TRAIT_UNAGING "unaging" +// Does the mob know thaumaturgy? +#define TRAIT_THAUMATURGY_KNOWLEDGE "thaumaturgy_knowledge" +// Does the mob have ghostsight? +#define TRAIT_GHOST_VISION "ghost_vision" +#define TRAIT_VICISSITUDE_KNOWLEDGE "vicissitude_knowledge" +#define TRAIT_MYSTICISM_KNOWLEDGE "mysticism_knowledge" +#define TRAIT_NECROMANCY_KNOWLEDGE "necromancy_knowledge" +#define TRAIT_ILLEGAL_IDENTITY "illegal_identity" // GOVERMENT + +// Allows the user to pass through doors +#define TRAIT_PASSDOOR "trait_passdoor" // DARKPACK EDIT ADD - Obtenebration & Mysticism Rework +#define TRAIT_IN_FRENZY "in_frenzy" + +// Is the mob silenced (by Quietus 1 for example) +#define TRAIT_SILENCED "silenced" +// is the vampire weak to Dominate? +#define TRAIT_WEAK_TO_DOMINATE "dominate_weak" + +/// They have warped time at some point in this round +#define TRAIT_TIMEWARPER "timewarper" // END TRAIT DEFINES diff --git a/code/__DEFINES/~darkpack/traits/sources.dm b/code/__DEFINES/~darkpack/traits/sources.dm index 76d5539fd12e..96325349f359 100644 --- a/code/__DEFINES/~darkpack/traits/sources.dm +++ b/code/__DEFINES/~darkpack/traits/sources.dm @@ -2,3 +2,11 @@ /// Trait given by a vampire's Clan #define CLAN_TRAIT "clan" +#define DISCIPLINE_TRAIT "discipline" + +#define STAKE_TRAIT "stake" + +#define NECROMANCY_TRAIT "necromancy" + +// used by the obfuscate ability +#define OBFUSCATE_TRAIT "obfuscate_trait" diff --git a/code/__DEFINES/~darkpack/vampire_clan.dm b/code/__DEFINES/~darkpack/vampire_clan.dm index f8ae1869f635..b66f6b9d28c8 100644 --- a/code/__DEFINES/~darkpack/vampire_clan.dm +++ b/code/__DEFINES/~darkpack/vampire_clan.dm @@ -4,6 +4,7 @@ #define VAMPIRE_CLAN_BRUJAH "brujah" #define VAMPIRE_CLAN_CAITIFF "caitiff" #define VAMPIRE_CLAN_CAPPADOCIAN "cappadocian" +#define VAMPIRE_CLAN_CITY_GANGREL "city_gangrel" #define VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY "daughters_of_cacophony" #define VAMPIRE_CLAN_GANGREL "gangrel" #define VAMPIRE_CLAN_GARGOYLE "gargoyle" @@ -11,12 +12,16 @@ #define VAMPIRE_CLAN_KIASYD "kiasyd" #define VAMPIRE_CLAN_LASOMBRA "lasombra" #define VAMPIRE_CLAN_MALKAVIAN "malkavian" -#define VAMPIRE_CLAN_SETITE "setite" +#define VAMPIRE_CLAN_NAGARAJA "nagaraja" #define VAMPIRE_CLAN_NOSFERATU "nosferatu" #define VAMPIRE_CLAN_OLD_CLAN_TZIMISCE "old_clan_tzimisce" #define VAMPIRE_CLAN_SALUBRI "salubri" +#define VAMPIRE_CLAN_SETITE "setite" #define VAMPIRE_CLAN_TOREADOR "toreador" #define VAMPIRE_CLAN_TREMERE "tremere" #define VAMPIRE_CLAN_TRUE_BRUJAH "true_brujah" #define VAMPIRE_CLAN_TZIMISCE "tzimisce" #define VAMPIRE_CLAN_VENTRUE "ventrue" + +// Does not include VAMPIRE_CLAN_GIOVANNI or VAMPIRE_CLAN_BAALI since they're supposed to be special. +#define VAMPIRE_CLAN_ALL list(VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_CAITIFF, VAMPIRE_CLAN_CAPPADOCIAN, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_NAGARAJA, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_OLD_CLAN_TZIMISCE, VAMPIRE_CLAN_SALUBRI, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_VENTRUE) diff --git a/code/__DEFINES/~darkpack/walls.dm b/code/__DEFINES/~darkpack/walls.dm new file mode 100644 index 000000000000..6600a198b874 --- /dev/null +++ b/code/__DEFINES/~darkpack/walls.dm @@ -0,0 +1,13 @@ +// Put here to allow downstreams to add subtypes. +#define LOW_WALL_HELPER(wall_type, wall_icon) \ + /obj/structure/platform/lowwall/##wall_type { \ + icon = ##wall_icon; \ + } \ + /obj/structure/platform/lowwall/##wall_type/window { \ + window = /obj/structure/window/fulltile; \ + WHEN_MAP(icon = 'modular_darkpack/modules/walls/icons/lowwalls.dmi'); \ + WHEN_MAP(icon_state = "window_spawner"); \ + } \ + /obj/structure/platform/lowwall/##wall_type/window/reinforced { \ + window = /obj/structure/window/reinforced/fulltile; \ + } diff --git a/code/__DEFINES/~darkpack/werewolf_auspice.dm b/code/__DEFINES/~darkpack/werewolf_auspice.dm new file mode 100644 index 000000000000..b3bb9b8fda50 --- /dev/null +++ b/code/__DEFINES/~darkpack/werewolf_auspice.dm @@ -0,0 +1,7 @@ +#define AUSPICE_AHROUN "Ahroun" +#define AUSPICE_GALLIARD "Galliard" +#define AUSPICE_PHILODOX "Philodox" +#define AUSPICE_THEURGE "Theurge" +#define AUSPICE_RAGABASH "Ragabash" + +#define AUSPICE_NONE "Stolen Moon" diff --git a/code/__DEFINES/~darkpack/werewolf_tribe.dm b/code/__DEFINES/~darkpack/werewolf_tribe.dm new file mode 100644 index 000000000000..9a38b204d143 --- /dev/null +++ b/code/__DEFINES/~darkpack/werewolf_tribe.dm @@ -0,0 +1,28 @@ +#define TRIBE_NONE "Ronin" + +#define TRIBE_GALESTALKERS "Galestalkers" +#define TRIBE_CHILDRENOFGAIA "Children of Gaia" +#define TRIBE_GHOSTCOUNCIL "Ghost Council" +#define TRIBE_HARTWARDENS "Hart Wardens" +#define TRIBE_GETOFFENRIS "Get of Fenris" +#define TRIBE_BLACKFURIES "Black Furies" +#define TRIBE_SILVERFANGS "Silver Fangs" +#define TRIBE_SILENTSTRIDERS "Silent Striders" +#define TRIBE_REDTALONS "Red Talons" +#define TRIBE_STARGAZERS "Stargazers" +#define TRIBE_GLASSWALKERS "Glass Walkers" +#define TRIBE_BONEGNAWERS "Bone Gnawers" +#define TRIBE_SHADOWLORDS "Shadow Lords" +#define TRIBE_BLACKSPIRALDANCERS "Black Spiral Dancers" + +#define TRIBE_CORAX "Corax" + +#define TRIBE_ALL list(TRIBE_NONE, TRIBE_GALESTALKERS, TRIBE_CHILDRENOFGAIA, TRIBE_GHOSTCOUNCIL, TRIBE_HARTWARDENS, TRIBE_GETOFFENRIS, TRIBE_BLACKFURIES, TRIBE_SILVERFANGS, TRIBE_SILENTSTRIDERS, TRIBE_REDTALONS, TRIBE_STARGAZERS, TRIBE_GLASSWALKERS, TRIBE_BONEGNAWERS, TRIBE_SHADOWLORDS, TRIBE_BLACKSPIRALDANCERS, TRIBE_CORAX) + +#define TRIBE_GAIA list(TRIBE_GALESTALKERS, TRIBE_CHILDRENOFGAIA, TRIBE_GHOSTCOUNCIL, TRIBE_HARTWARDENS, TRIBE_GETOFFENRIS, TRIBE_BLACKFURIES, TRIBE_SILVERFANGS, TRIBE_SILENTSTRIDERS, TRIBE_REDTALONS, TRIBE_STARGAZERS, TRIBE_GLASSWALKERS, TRIBE_BONEGNAWERS, TRIBE_SHADOWLORDS, TRIBE_CORAX) + +#define TRIBE_WYLD list(TRIBE_GALESTALKERS, TRIBE_CHILDRENOFGAIA, TRIBE_GHOSTCOUNCIL, TRIBE_HARTWARDENS, TRIBE_GETOFFENRIS, TRIBE_BLACKFURIES, TRIBE_SILVERFANGS, TRIBE_SILENTSTRIDERS, TRIBE_REDTALONS, TRIBE_STARGAZERS, TRIBE_SHADOWLORDS, TRIBE_CORAX) + +#define TRIBE_WEAVER list(TRIBE_GLASSWALKERS, TRIBE_BONEGNAWERS) + +#define TRIBE_WYRM list(TRIBE_BLACKSPIRALDANCERS) diff --git a/code/__DEFINES/~darkpack/xp_and_freebie.dm b/code/__DEFINES/~darkpack/xp_and_freebie.dm new file mode 100644 index 000000000000..0fa97af54c15 --- /dev/null +++ b/code/__DEFINES/~darkpack/xp_and_freebie.dm @@ -0,0 +1,12 @@ +/// Freebie points allocated for initial character creation +#define INITIAL_FREEBIE_POINTS 21 +/// How many points that can be gained from taking flaws and merits +#define MAX_MERIT_FREEBIE_POINTS 7 +#define FREEBIE_COST_ATTRIBUTE 5 +#define FREEBIE_COST_ABILITY 2 +#define FREEBIE_COST_BACKGROUND 1 +#define FREEBIE_COST_WILLPOWER 1 +// KINDRED +#define FREEBIE_COST_DISIPLINE 10 +#define FREEBIE_COST_VIRTUE 2 +#define FREEBIE_COST_HUMANITY 2 diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 9c4cc3eafa84..26dee9a5f22f 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -541,6 +541,27 @@ . = pick_weight(list_to_pick) list_to_pick[.]-- +/** +* Picks n items from a list. The same index will not be chosen more than once. +* e.g. pick_n(list_of_stuff, 10) would return a list of 10 items from the list, chosen randomly. +*/ +/proc/pick_n(list/list_to_pick, n) + var/list_to_pick_length + if(islist(list_to_pick)) + list_to_pick_length = length(list_to_pick) + + if(!list_to_pick_length || n <= 0) + return list() + + /// length of our list_to_pick + n = min(n, list_to_pick_length) + + // Shuffle and slice the first n indices + var/list/copy_to_shuffle = list_to_pick.Copy() + shuffle_inplace(copy_to_shuffle) + + return copy_to_shuffle.Copy(1, n + 1) + /** * Given a list, return a copy where values without defined weights are given weight 1. * For example, fill_with_ones(list(A, B=2, C)) = list(A=1, B=2, C=1) @@ -657,7 +678,7 @@ return inserted_list -///same as shuffle, but returns nothing and acts on list in place +///same as shuffle, but acts on list in place, and returns same list /proc/shuffle_inplace(list/inserted_list) if(!inserted_list) return @@ -665,6 +686,8 @@ for(var/i in 1 to inserted_list.len - 1) inserted_list.Swap(i, rand(i, inserted_list.len)) + return inserted_list + ///Return a list with no duplicate entries /proc/unique_list(list/inserted_list) . = list() @@ -894,14 +917,6 @@ used_key_list[input_key] = 1 return input_key -///Flattens a keyed list into a list of its contents -/proc/flatten_list(list/key_list) - if(!islist(key_list)) - return null - . = list() - for(var/key in key_list) - . |= LIST_VALUE_WRAP_LISTS(key_list[key]) - ///Make a normal list an associative one /proc/make_associative(list/flat_list) . = list() @@ -959,6 +974,14 @@ UNTYPED_LIST_ADD(keys, key) return keys +/// Turns an associative list into a flat list of values +/proc/assoc_to_values(list/key_list) + if(!islist(key_list)) + return null + . = list() + for(var/key in key_list) + . |= LIST_VALUE_WRAP_LISTS(key_list[key]) + ///compare two lists, returns TRUE if they are the same /proc/compare_list(list/l,list/d) if(!islist(l) || !islist(d)) diff --git a/code/__HELPERS/abstract_types.dm b/code/__HELPERS/abstract_types.dm new file mode 100644 index 000000000000..5a1f800b5111 --- /dev/null +++ b/code/__HELPERS/abstract_types.dm @@ -0,0 +1,18 @@ +/// Returns a list of all abstract typepaths for all datums +/proc/get_abstract_types() + var/static/list/abstracts + if(abstracts) + return abstracts + abstracts = list() + for(var/datum/sometype as anything in subtypesof(/datum)) + if(sometype == sometype::abstract_type) + abstracts |= sometype::abstract_type + return abstracts + +/// Like subtypesof, but automatically excludes abstract typepaths +/proc/valid_subtypesof(datum/sometype) + return subtypesof(sometype) - get_abstract_types() + +/// Like typesof, but automatically excludes abstract typepaths +/proc/valid_typesof(datum/sometype) + return typesof(sometype) - get_abstract_types() diff --git a/code/__HELPERS/ai.dm b/code/__HELPERS/ai.dm index 7e7179c39891..81595c3f8a72 100644 --- a/code/__HELPERS/ai.dm +++ b/code/__HELPERS/ai.dm @@ -28,15 +28,3 @@ top_force = item.force return top_force_item - -///returns if something can be consumed, drink or food -/proc/IsEdible(obj/item/thing) - if(!istype(thing)) - return FALSE - if(IS_EDIBLE(thing)) - return TRUE - if(istype(thing, /obj/item/reagent_containers/cup/glass/drinkingglass)) - var/obj/item/reagent_containers/cup/glass/drinkingglass/glass = thing - if(glass.reagents.total_volume) // The glass has something in it, time to drink the mystery liquid! - return TRUE - return FALSE diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index 11548f468bdd..ce482645ef76 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -6,7 +6,7 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(list( /area/station/engineering/main, /area/station/engineering/supermatter, /area/station/engineering/atmospherics_engine, - /area/station/ai_monitored/turret_protected/ai, + /area/station/ai/satellite/chamber, /area/ruin/comms_agent //fixes icemoon comms station being affected ))) diff --git a/code/__HELPERS/atmospherics.dm b/code/__HELPERS/atmospherics.dm index 9ebafd5fbb52..6264823b7f2e 100644 --- a/code/__HELPERS/atmospherics.dm +++ b/code/__HELPERS/atmospherics.dm @@ -173,16 +173,20 @@ GLOBAL_LIST_EMPTY(gas_handbook) return null /** - * A simple helped proc that checks if the contents of a list of gases are within acceptable terms. + * A simple helper 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) + * * acceptable_gas_bounds: 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. + * + * Returns TRUE if the list of gases is acceptable, FALSE otherwise. */ -/proc/check_gases(list/gases, list/gases_to_check, extraneous_gas_limit = 0.1) - gases_to_check = gases_to_check.Copy() +/proc/check_gases(list/gases, list/acceptable_gas_bounds, extraneous_gas_limit = 0.1) + SHOULD_BE_PURE(TRUE) + + var/list/gases_to_check = acceptable_gas_bounds.Copy() // thank you spaceman for(var/id in gases) var/gas_moles = gases[id][MOLES] if(!(id in gases_to_check)) diff --git a/code/__HELPERS/atoms.dm b/code/__HELPERS/atoms.dm index dfe731eddfed..bf304813b24d 100644 --- a/code/__HELPERS/atoms.dm +++ b/code/__HELPERS/atoms.dm @@ -370,14 +370,14 @@ rough example of the "cone" made by the 3 dirs checked /// 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) + if (!base_pixel_x && !base_pixel_y && !base_pixel_w && !base_pixel_z) 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 > ICON_SIZE_X && pixel_x != 0 ? (icon_width - ICON_SIZE_X) * 0.5 : 0, - "y" = icon_height > ICON_SIZE_Y && pixel_y != 0 ? (icon_height - ICON_SIZE_Y) * 0.5 : 0, + "x" = icon_width > ICON_SIZE_X && (base_pixel_x || base_pixel_w) ? (icon_width - ICON_SIZE_X) * 0.5 : 0, + "y" = icon_height > ICON_SIZE_Y && (base_pixel_y || base_pixel_z) ? (icon_height - ICON_SIZE_Y) * 0.5 : 0, ) /// Helper for easily adding blood from INSIDE a mob to an atom (NOT blood ON the mob) diff --git a/code/__HELPERS/construction.dm b/code/__HELPERS/construction.dm index b2766952e1cb..49a048c01607 100644 --- a/code/__HELPERS/construction.dm +++ b/code/__HELPERS/construction.dm @@ -1,5 +1,5 @@ /// Makes sure only integer values are used when consuming, removing & checking for mats -#define OPTIMAL_COST(cost)(max(1, round(cost))) +#define OPTIMAL_COST(cost)(max(1, floor(cost))) /// Wrapper for fetching material references. Exists exclusively so that people don't need to wrap everything in a list every time. #define GET_MATERIAL_REF(arguments...) SSmaterials._GetMaterialRef(list(##arguments)) @@ -31,7 +31,7 @@ */ /proc/amount2sheet(amt) if(amt >= SHEET_MATERIAL_AMOUNT) - return round(amt / SHEET_MATERIAL_AMOUNT) + return floor(amt / SHEET_MATERIAL_AMOUNT) return 0 /** diff --git a/code/__HELPERS/dynamic_human_icon_gen.dm b/code/__HELPERS/dynamic_human_icon_gen.dm index d709b38207a5..a7320c951cb6 100644 --- a/code/__HELPERS/dynamic_human_icon_gen.dm +++ b/code/__HELPERS/dynamic_human_icon_gen.dm @@ -2,13 +2,13 @@ GLOBAL_LIST_EMPTY(dynamic_human_appearances) /// Creates a human with the given parameters and returns an appearance of it -/proc/get_dynamic_human_appearance(outfit_path, species_path = /datum/species/human, mob_spawn_path, r_hand, l_hand, bloody_slots = NONE, animated = TRUE) +/proc/get_dynamic_human_appearance(outfit_path, species_path = /datum/species/human, mob_spawn_path, r_hand, l_hand, bloody_slots = NONE, animated = TRUE, combat_mode = TRUE) if(!species_path) return FALSE if(!ispath(species_path)) stack_trace("Attempted to call get_dynamic_human_appearance() with an instantiated species_path. Pass the species datum typepath instead.") return FALSE - var/arg_string = "[outfit_path]_[species_path]_[mob_spawn_path]_[l_hand]_[r_hand]_[bloody_slots]" + var/arg_string = "[outfit_path]_[species_path]_[mob_spawn_path]_[l_hand]_[r_hand]_[bloody_slots]_[combat_mode]" if(GLOB.dynamic_human_appearances[arg_string]) //if already exists in our cache, just return that return GLOB.dynamic_human_appearances[arg_string] var/mob/living/carbon/human/dummy/consistent/dummy = new() @@ -17,6 +17,7 @@ GLOBAL_LIST_EMPTY(dynamic_human_appearances) dummy.underwear = "Nude" dummy.undershirt = "Nude" dummy.socks = "Nude" + dummy.set_combat_mode(combat_mode) if(outfit_path) var/datum/outfit/outfit = new outfit_path() if(r_hand != NO_REPLACE) //we can still override to be null, no replace means just use outfit's diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index 6f28592b7fc8..fc2fca91a2d9 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -136,3 +136,46 @@ GLOBAL_VAR_INIT(fileaccess_timer, 0) if(.) . += delimiter // Add the delimiter before each successive node. . += SANITIZE_FILENAME(node) + +/** + * Verifys wether a string or file ends with a given file type. + * + * this does not at all check the actual type of the file, a user could just rename it + * + * Arguments: + * * file - A string or file. No checks for if this file ACCTALLY exists + * * file_types - A list of strings to check against [e.g. list("ogg" = TRUE, "mp3" = TRUE)] + */ +/proc/is_file_type_in_list(file, file_types = list()) + var/extstart = findlasttext("[file]", ".") + if(!extstart) + return FALSE + var/ext = copytext("[file]", extstart + 1) + if(file_types[ext]) + return TRUE + +/** + * Verifys wether a string or file ends with a given file type + * + * this does not at all check the actual type of the file, a user could just rename it + * + * Arguments: + * * file - A string or file. No checks for if this file ACCTALLY exists + * * file_type - A string to check against [e.g. "ogg"] + */ +/proc/is_file_type(file, file_type) + var/extstart = findlasttext("[file]", ".") + if(!extstart) + return FALSE + var/ext = copytext("[file]", extstart + 1) + if(ext == file_type) + return TRUE + +/proc/strip_filepath_extension(file, file_types) + var/extstart = findlasttext("[file]", ".") + if(!extstart) + return "[file]" + var/ext = copytext("[file]", extstart + 1) + if(ext in file_types) + return copytext("[file]", 1, extstart) + return "[file]" diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index a60a8b2b31cc..0919512f508f 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -2,14 +2,6 @@ /////Initial Building///// ////////////////////////// -/// Inits GLOB.surgeries -/proc/init_surgeries() - var/surgeries = list() - for(var/path in subtypesof(/datum/surgery)) - surgeries += new path() - sort_list(surgeries, GLOBAL_PROC_REF(cmp_typepaths_asc)) - return surgeries - /// Legacy procs that really should be replaced with proper _INIT macros /proc/make_datum_reference_lists() // I tried to eliminate this proc but I couldn't untangle their init-order interdependencies -Dominion/Cyberboss @@ -137,29 +129,21 @@ for(var/atom/req_atom as anything in recipe.structures) atom_list |= req_atom -//creates every subtype of prototype (excluding prototype) and adds it to list L. -//if no list/L is provided, one is created. +/// Creates every subtype of prototype (excluding prototype and abstract types) and adds it to list L. +/// If no list/L is provided, one is created. /proc/init_subtypes(prototype, list/L) if(!istype(L)) L = list() - for(var/path in subtypesof(prototype)) + for(var/path in valid_subtypesof(prototype)) L += new path() return L -//returns a list of paths to every subtype of prototype (excluding prototype) -//if no list/L is provided, one is created. -/proc/init_paths(prototype, list/L) - if(!istype(L)) - L = list() - for(var/path in subtypesof(prototype)) - L+= path - return L - /// Functions like init_subtypes, but uses the subtype's path as a key for easy access +/// If no list/L is provided, one is created. /proc/init_subtypes_w_path_keys(prototype, list/L) if(!istype(L)) L = list() - for(var/path in subtypesof(prototype)) + for(var/path in valid_subtypesof(prototype)) L[path] = new path() return L diff --git a/code/__HELPERS/hallucinations.dm b/code/__HELPERS/hallucinations.dm index 110a94e862d1..006497b4aa58 100644 --- a/code/__HELPERS/hallucinations.dm +++ b/code/__HELPERS/hallucinations.dm @@ -41,8 +41,8 @@ GLOBAL_LIST_EMPTY(all_ongoing_hallucinations) CRASH("cause_hallucination called with no arguments.") var/datum/hallucination/hallucination_type = raw_args[HALLUCINATION_ARG_TYPE] // first arg is the type always - if(!ispath(hallucination_type)) - CRASH("cause_hallucination was given a non-hallucination type.") + if(!ispath(hallucination_type, /datum/hallucination)) + CRASH("cause_hallucination was given a non-hallucination type. (Got: [hallucination_type || "null"])") var/hallucination_source = raw_args[HALLUCINATION_ARG_SOURCE] // and second arg, the source var/datum/hallucination/new_hallucination diff --git a/code/__HELPERS/honkerblast.dm b/code/__HELPERS/honkerblast.dm index ea8eea00e59b..e76d81782284 100644 --- a/code/__HELPERS/honkerblast.dm +++ b/code/__HELPERS/honkerblast.dm @@ -23,8 +23,7 @@ victim.Stun(100) victim.adjust_stutter(30 SECONDS) victim.set_jitter_if_lower(1000 SECONDS) - var/obj/item/organ/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS) - ears?.adjustEarDamage(10, 15) + victim.sound_damage(10, 30 SECONDS) to_chat(victim, "HONK") var/obj/item/clothing/shoes/victim_shoes = victim.get_item_by_slot(ITEM_SLOT_FEET) if(!victim_shoes || victim_shoes.fastening_type == SHOES_SLIPON) @@ -35,13 +34,11 @@ victim.Paralyze(20) victim.Stun(50) victim.set_jitter_if_lower(500 SECONDS) - var/obj/item/organ/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS) - ears?.adjustEarDamage(7, 10) + victim.sound_damage(7, 20 SECONDS) to_chat(victim, "HONK") for(var/mob/living/carbon/victim in lightly_honked) victim.Knockdown(20) victim.set_jitter_if_lower(200 SECONDS) - var/obj/item/organ/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS) - ears?.adjustEarDamage(4, 5) + victim.sound_damage(4, 10 SECONDS) to_chat(victim, "HONK") diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index ba9d701b03ae..ac67848447ad 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -753,7 +753,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) /// # If you already have a human and need to get its flat icon, call `get_flat_existing_human_icon()` instead. /// For creating consistent icons for human looking simple animals. -/proc/get_flat_human_icon(icon_id, datum/job/job, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals, outfit_override = null) +/proc/get_flat_human_icon(icon_id, datum/job/job, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals, outfit_override = null, no_anim = FALSE) var/static/list/humanoid_icon_cache = list() if(icon_id && humanoid_icon_cache[icon_id]) return humanoid_icon_cache[icon_id] @@ -771,7 +771,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) var/icon/out_icon = icon('icons/effects/effects.dmi', "nothing") for(var/direction in showDirs) - var/icon/partial = getFlatIcon(body, defdir = direction) + var/icon/partial = getFlatIcon(body, defdir = direction, no_anim = no_anim) out_icon.Insert(partial, dir = direction) humanoid_icon_cache[icon_id] = out_icon @@ -1370,3 +1370,26 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects) copy.underlays = underlays_to_keep return copy + +/// Returns the (isolated) security HUD icon for the given job. +/proc/get_job_hud_icon(datum/job/job) as /icon + var/static/alist/icon_cache = alist() + if(isnull(job)) + return + + if(!is_job(job)) + if(ispath(job, /datum/job)) + job = SSjob.get_job_type(job) + else if(istext(job)) + job = SSjob.get_job(job) + if(isnull(job)) + return null + + //add it to the cache if it isn't already + var/job_type = job.type + if(!icon_cache[job_type]) + var/icon/sechud_icon = job.get_lobby_icon() + sechud_icon.Crop(1, 17, 8, 24) + icon_cache[job_type] = sechud_icon + + return icon(icon_cache[job_type]) diff --git a/code/__HELPERS/lighting.dm b/code/__HELPERS/lighting.dm index 086b0e99c4a4..4f1b29d436ad 100644 --- a/code/__HELPERS/lighting.dm +++ b/code/__HELPERS/lighting.dm @@ -1,5 +1,3 @@ -#define TOPDOWN_TO_EMISSIVE_LAYER(layer) LERP(FLOOR_EMISSIVE_START_LAYER, FLOOR_EMISSIVE_END_LAYER, (layer - (TOPDOWN_LAYER + 1)) / TOPDOWN_LAYER_COUNT) - /// Produces a mutable appearance glued to the [EMISSIVE_PLANE] dyed to be the [EMISSIVE_COLOR]. /proc/emissive_appearance(icon, icon_state = "", atom/offset_spokesman, layer, alpha = 255, appearance_flags = NONE, offset_const, effect_type = EMISSIVE_BLOOM) if((isnull(layer) || layer == FLOAT_LAYER) && IS_TOPDOWN_PLANE(offset_spokesman.plane)) @@ -99,5 +97,3 @@ var/atom/movable/vis_cast = make_blocker vis_cast.vis_contents += hand_back return hand_back - -#undef TOPDOWN_TO_EMISSIVE_LAYER diff --git a/code/__HELPERS/logging/_logging.dm b/code/__HELPERS/logging/_logging.dm index 8f8f733e6ba8..3a3f887142e3 100644 --- a/code/__HELPERS/logging/_logging.dm +++ b/code/__HELPERS/logging/_logging.dm @@ -144,6 +144,10 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global")) log_shuttle(log_text, data) if(LOG_SPEECH_INDICATORS) log_speech_indicators(log_text, data) + // DARKPACK EDIT ADD START - STORYTELLER_STATS + if(LOG_STATS) + log_stats(log_text, data) + // DARKPACK EDIT ADD END else stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).") log_game(log_text, data) diff --git a/code/__HELPERS/logging/virus.dm b/code/__HELPERS/logging/virus.dm index 050ae9434e47..b2ee4789107b 100644 --- a/code/__HELPERS/logging/virus.dm +++ b/code/__HELPERS/logging/virus.dm @@ -11,4 +11,4 @@ var/list/name_symptoms = list() for(var/datum/symptom/S in symptoms) name_symptoms += S.name - return "[name] - sym: [english_list(name_symptoms)] re:[totalResistance()] st:[totalStealth()] ss:[totalStageSpeed()] tr:[totalTransmittable()]" + return "[name] - sym: [english_list(name_symptoms)] re:[totalResistance()] st:[totalStealth()] ss:[totalStageSpeed()] tr:[totalTransmittable()] se:[totalSeverity()]" diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 747fe377db9b..cdbfbe3a0790 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -220,8 +220,10 @@ GLOBAL_LIST_INIT(skin_tone_names, list( * @param {icon} icon - The icon file of the cog. Default: 'icons/effects/progressbar.dmi' * * @param {iconstate} iconstate - The icon state of the cog. Default: "Cog" + * + * @param {mob} bar_override - Mob which should see the bar instead of the user */ -/proc/do_after(mob/user, delay, atom/target, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, interaction_key, max_interact_count = 1, hidden = FALSE, icon = 'icons/effects/progressbar.dmi', iconstate = "cog") +/proc/do_after(mob/user, delay, atom/target, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, interaction_key, max_interact_count = 1, hidden = FALSE, icon = 'icons/effects/progressbar.dmi', iconstate = "cog", mob/bar_override = null) if(!user) return FALSE if(!isnum(delay)) @@ -244,6 +246,10 @@ GLOBAL_LIST_INIT(skin_tone_names, list( var/holding = user.get_active_held_item() +#ifdef UNIT_TESTS + timed_action_flags &= ~IGNORE_SLOWDOWNS //it shouldn't stop unit test dummies from being fast as hell +#endif + if(!(timed_action_flags & IGNORE_SLOWDOWNS)) delay *= user.cached_multiplicative_actions_slowdown @@ -251,11 +257,11 @@ GLOBAL_LIST_INIT(skin_tone_names, list( var/datum/cogbar/cog if(progress) - if(user.client) - progbar = new(user, delay, target || user) + if(user.client || bar_override?.client) + progbar = new(bar_override || user, delay, target || user) if(!hidden && delay >= 1 SECONDS) - cog = new(user, icon, iconstate) + cog = new(bar_override || user, icon, iconstate) SEND_SIGNAL(user, COMSIG_DO_AFTER_BEGAN) @@ -854,3 +860,20 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) else . = invoked_callback.Invoke() usr = temp + +/** + * Iterates over all mobs that can see the passed movable and adds specific mood events to them based on their personalities. + * + * * source: String source for the mood event + * * personality_to_mood: A list mapping personality types to mood event types. Example: list(/datum/personality/chill = /datum/mood_event/chill_guy) + * * range: The range in which to check for viewers. Default is view range. + * * additional args may be supplied to pass into the mood event constructor. + */ +/proc/add_personality_mood_to_viewers(atom/movable/source, mood_key, list/personality_to_mood, range, ...) + for(var/mob/living/nearby in viewers(range, source)) + if(nearby.stat >= UNCONSCIOUS || nearby.is_blind()) + continue + for(var/personality in personality_to_mood) + if(HAS_PERSONALITY(nearby, personality)) + nearby.add_mood_event(arglist( list("[mood_key]_[personality]", personality_to_mood[personality]) + args.Copy(4) )) + break diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 6def00103eaf..81c4a7c83299 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -114,7 +114,7 @@ GLOBAL_VAR(command_name) /proc/new_station_name() return "[CITY_NAME] [CURRENT_STATION_YEAR]" - /* DARKPACK EDIT REMOVAL - This aint no station + /* // DARKPACK EDIT REMOVAL - This aint no station var/random = rand(1,5) var/name = "" var/new_station_name = "" @@ -399,10 +399,10 @@ GLOBAL_DATUM(syndicate_code_response_regex, /regex) return FALSE return TRUE -/// Build a list of strings containing the numbers 1-99 as both arabic and roman numerals +/// Generates and returns a list of both arabic and roman numerals for 1 through 99 /proc/generate_number_strings() - var/list/L[198] + var/list/numbers = list() for(var/i in 1 to 99) - L += "[i]" - L += "\Roman[i]" - return L + numbers += "[i]" + numbers += "\Roman[i]" + return numbers diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 9f7c95d42ea4..8e21e78b1b25 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -289,12 +289,15 @@ GLOBAL_LIST_INIT(achievements_unlocked, list()) //stop collecting feedback during grifftime SSblackbox.Seal() - world.TgsTriggerEvent("tg-Roundend", wait_for_completion = TRUE) + TriggerRoundEndTgsEvent() sleep(5 SECONDS) ready_for_reboot = TRUE standard_reboot() +/datum/controller/subsystem/ticker/proc/TriggerRoundEndTgsEvent() + world.TgsTriggerEvent("tg-Roundend", wait_for_completion = TRUE) + /datum/controller/subsystem/ticker/proc/standard_reboot() if(ready_for_reboot) if(GLOB.station_was_nuked) @@ -523,9 +526,9 @@ GLOBAL_LIST_INIT(achievements_unlocked, list()) for(var/venue_path in SSrestaurant.all_venues) var/datum/venue/venue = SSrestaurant.all_venues[venue_path] tourist_income += venue.total_income - parts += "The [venue] served [venue.customers_served] customer\s and made [venue.total_income] credits.
" - parts += "In total, they earned [tourist_income] credits[tourist_income ? "!" : "..."]
" - log_econ("Roundend service income: [tourist_income] credits.") + parts += "The [venue] served [venue.customers_served] customer\s and made [venue.total_income] [MONEY_NAME].
" + parts += "In total, they earned [tourist_income] [MONEY_NAME][tourist_income ? "!" : "..."]
" + log_econ("Roundend service income: [tourist_income] [MONEY_NAME].") // Award service achievements based on tourist income switch(tourist_income) @@ -538,7 +541,7 @@ GLOBAL_LIST_INIT(achievements_unlocked, list()) switch(tourist_income) if(0) - parts += "[span_redtext("Service did not earn any credits...")]
" + parts += "[span_redtext("Service did not earn any [MONEY_NAME]...")]
" if(1 to 2000) parts += "[span_redtext("Centcom is displeased. Come on service, surely you can do better than that.")]
" if(2001 to 4999) @@ -547,12 +550,12 @@ GLOBAL_LIST_INIT(achievements_unlocked, list()) parts += "Centcom is incredibly impressed with service today! What a team!
" parts += "General Statistics:
" - parts += "There were [station_vault] credits collected by crew this shift.
" + parts += "There were [station_vault] [MONEY_NAME] collected by crew this shift.
" if(total_players > 0) - parts += "An average of [station_vault/total_players] credits were collected.
" - log_econ("Roundend credit total: [station_vault] credits. Average Credits: [station_vault/total_players]") + parts += "An average of [station_vault/total_players] [MONEY_NAME] were collected.
" + log_econ("Roundend [MONEY_NAME_SINGULAR] total: [station_vault] [MONEY_NAME]. Average [MONEY_NAME_CAPITALIZED]: [station_vault/total_players]") if(mr_moneybags) - parts += "The most affluent crew member at shift end was [mr_moneybags.account_holder] with [mr_moneybags.account_balance] cr!" + parts += "The most affluent crew member at shift end was [mr_moneybags.account_holder] with [mr_moneybags.account_balance] [MONEY_SYMBOL]!" else parts += "Somehow, nobody made any money this shift! This'll result in some budget cuts..." return parts.Join() diff --git a/code/__HELPERS/see_through_maps.dm b/code/__HELPERS/see_through_maps.dm index cfe0aa579e23..33d39400ba67 100644 --- a/code/__HELPERS/see_through_maps.dm +++ b/code/__HELPERS/see_through_maps.dm @@ -15,10 +15,10 @@ ///Seethrough component for the ratvar wreck, in shape of the ratvar wreck #define SEE_THROUGH_MAP_RATVAR_WRECK "ratvar" -// DARKPACK EDIT START +// DARKPACK EDIT ADD START - WALLS ///Seethrough component the EFFECT that darkpack walls use. Creates a wallening like effect #define SEE_THROUGH_MAP_WALLS "darkpack_walls" -// DARKPACK EDIT END +// DARKPACK EDIT ADD END /**global statics for the see_through_component coordinate maps * For ease of use, include a comment in the shape of the coordinate map, where O is nothing, X is a hidden tile and A is the object @@ -44,7 +44,7 @@ GLOBAL_LIST_INIT(see_through_maps, list( list(-1, 1, 0), list(0, 1, 0), list(1, 1, 0) ), - // DARKPACK EDIT START + // DARKPACK EDIT ADD START - WALLS // XXX // XXX // XAX @@ -53,7 +53,7 @@ GLOBAL_LIST_INIT(see_through_maps, list( list(-1, 1, 0), list(0, 1, 0), list(1, 1, 0), list(-1, 0, 0), list(0, 0, 0), list(1, 0, 0) ), - // DARKPACK EDIT END + // DARKPACK EDIT ADD END // X // X diff --git a/code/__HELPERS/shuttle.dm b/code/__HELPERS/shuttle.dm index 31c43b1cf190..6dbbd51b617a 100644 --- a/code/__HELPERS/shuttle.dm +++ b/code/__HELPERS/shuttle.dm @@ -333,9 +333,7 @@ GLOBAL_LIST_EMPTY(shuttle_frames_by_turf) if(turfs_not_in_frame_count) if(custom_area.apc) var/obj/machinery/power/apc/apc = custom_area.apc - var/list/wallmount_comps = apc.GetComponents(/datum/component/wall_mounted) - var/datum/component/wall_mounted/wallmount_comp = length(wallmount_comps) && wallmount_comps[1] - if(turfs[get_turf(apc)] || (wallmount_comp && turfs[wallmount_comp.hanging_wall_turf])) + if(turfs[get_turf(apc)]) . |= CUSTOM_AREA_NOT_COMPLETELY_CONTAINED else if(areas) areas[custom_area] = area_turfs - turfs_not_in_frame @@ -348,9 +346,7 @@ GLOBAL_LIST_EMPTY(shuttle_frames_by_turf) . |= INTERSECTS_NON_WHITELISTED_AREA if(checked_area.apc) var/obj/machinery/power/apc/apc = checked_area.apc - var/list/wallmount_comps = apc.GetComponents(/datum/component/wall_mounted) - var/datum/component/wall_mounted/wallmount_comp = length(wallmount_comps) && wallmount_comps[1] - if(turfs[get_turf(apc)] || (wallmount_comp && turfs[wallmount_comp.hanging_wall_turf])) + if(turfs[get_turf(apc)]) . |= CONTAINS_APC_OF_NON_CUSTOM_AREA turfs -= area_turfs @@ -517,7 +513,7 @@ GLOBAL_LIST_EMPTY(shuttle_frames_by_turf) turfs = turfs.Copy() for(var/turf/turf as anything in turfs) var/move_mode = turf.fromShuttleMove(move_mode = MOVE_AREA) - if(move_mode & (MOVE_TURF | MOVE_CONTENTS)) + if(move_mode & (MOVE_TURF | MOVE_CONTENTS | MOVE_SPECIAL)) continue for(var/atom/movable/movable as anything in turf.contents) //CHECK_TICK diff --git a/code/__HELPERS/spatial_info.dm b/code/__HELPERS/spatial_info.dm index 4cc71bb091b6..1135c93b055b 100644 --- a/code/__HELPERS/spatial_info.dm +++ b/code/__HELPERS/spatial_info.dm @@ -214,6 +214,22 @@ for(var/obj/item/radio/radio as anything in radios) . |= get_hearers_in_LOS(radio.canhear_range, radio) +/// A filter to be applied to get_hearers_in_x, that removes any non-mob hearers, converting them to their relevant mob if one exists (such as dullahan heads). +/// Modifies input list. +/proc/mob_only_listeners(list/atom/movable/hearers) + RETURN_TYPE(/list/mob) + + var/hearers_length + if(isnull(hearers) || !(hearers_length = hearers.len)) // note on var assignment in the conditional: this is a micro op so we do not have to do a length() check before assigning hearers.len and so we only have to isnull() once. + return list() + + for(var/hearer_index in 1 to hearers_length) + var/atom/movable/hearer = hearers[hearer_index] + hearers[hearer_index] = hearer.get_listening_mob() + + list_clear_nulls(hearers) + return hearers + //Used when converting pixels to tiles to make them accurate #define OFFSET_X (0.5 / ICON_SIZE_X) #define OFFSET_Y (0.5 / ICON_SIZE_Y) @@ -387,6 +403,15 @@ . = view(range, source) source.luminosity = lum +/// get_hear that only gets turfs so we can use as_anything +/proc/get_hear_turfs(range, atom/source) + var/lum = source.luminosity + source.luminosity = 6 + . = list() + for(var/turf/turf in view(range, source)) + . += turf + source.luminosity = lum + ///Returns the open turf next to the center in a specific direction /proc/get_open_turf_in_dir(atom/center, dir) var/turf/open/get_turf = get_step(center, dir) diff --git a/code/__HELPERS/tts.dm b/code/__HELPERS/tts.dm index 9d96d3d4e3e2..a20df3895062 100644 --- a/code/__HELPERS/tts.dm +++ b/code/__HELPERS/tts.dm @@ -2,3 +2,9 @@ // Only allow alphanumeric characters and whitespace var/static/regex/bad_chars_regex = regex("\[^a-zA-Z0-9 ,?.!'&-]", "g") return bad_chars_regex.Replace(text, " ") + +/proc/tts_filter_encode(text, atom/movable/speaker, blips) + text = replacetext(text, "%PITCH%", SStts.pitch_enabled ? speaker.pitch : 0) + text = replacetext(text, "%FEMALE%", !!findtext(speaker.voice, "Woman")) + text = replacetext(text, "%BLIPS%", blips) + return url_encode(text) diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm index 902bfbf585ef..764fc79621a6 100644 --- a/code/__HELPERS/turfs.dm +++ b/code/__HELPERS/turfs.dm @@ -463,7 +463,7 @@ Turf and target are separate in case you want to teleport some distance from a t subtypesof(/area/station/service), \ subtypesof(/area/station/command), \ subtypesof(/area/station/hallway), \ - subtypesof(/area/station/ai_monitored), \ + subtypesof(/area/station/ai), \ subtypesof(/area/station/cargo) ) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index c7b7cdd4bc1f..4b8e02699f88 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -181,6 +181,8 @@ GLOBAL_LIST_INIT(modulo_angle_to_dir, list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH, switch(def_zone) if(BODY_ZONE_CHEST) return CHEST|GROIN + if(BODY_ZONE_PRECISE_GROIN) + return GROIN if(BODY_ZONE_HEAD) return HEAD if(BODY_ZONE_L_ARM) @@ -198,50 +200,33 @@ GLOBAL_LIST_INIT(modulo_angle_to_dir, list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH, var/list/covered_parts = list() if(!bpc) - return 0 - - if(bpc == FULL_BODY) - covered_parts |= list(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM,BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_L_LEG,BODY_ZONE_R_LEG) - - else - if(bpc & HEAD) - covered_parts |= list(BODY_ZONE_HEAD) - if(bpc & CHEST) - covered_parts |= list(BODY_ZONE_CHEST) - if(bpc & GROIN) - covered_parts |= list(BODY_ZONE_CHEST) - - if(bpc & ARMS) - covered_parts |= list(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM) - else - if(bpc & ARM_LEFT) - covered_parts |= list(BODY_ZONE_L_ARM) - if(bpc & ARM_RIGHT) - covered_parts |= list(BODY_ZONE_R_ARM) - - if(bpc & HANDS) - covered_parts |= list(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM) - else - if(bpc & HAND_LEFT) - covered_parts |= list(BODY_ZONE_L_ARM) - if(bpc & HAND_RIGHT) - covered_parts |= list(BODY_ZONE_R_ARM) - - if(bpc & LEGS) - covered_parts |= list(BODY_ZONE_L_LEG,BODY_ZONE_R_LEG) - else - if(bpc & LEG_LEFT) - covered_parts |= list(BODY_ZONE_L_LEG) - if(bpc & LEG_RIGHT) - covered_parts |= list(BODY_ZONE_R_LEG) - - if(bpc & FEET) - covered_parts |= list(BODY_ZONE_L_LEG,BODY_ZONE_R_LEG) - else - if(bpc & FOOT_LEFT) - covered_parts |= list(BODY_ZONE_L_LEG) - if(bpc & FOOT_RIGHT) - covered_parts |= list(BODY_ZONE_R_LEG) + return covered_parts + + if(bpc & HEAD) + covered_parts |= list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH) + + if(bpc & CHEST) + covered_parts |= list(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN) + else if(bpc & GROIN) + covered_parts |= BODY_ZONE_PRECISE_GROIN + + if(bpc & HAND_LEFT) + covered_parts |= list(BODY_ZONE_L_ARM, BODY_ZONE_PRECISE_L_HAND) + else if(bpc & ARM_LEFT) + covered_parts |= BODY_ZONE_L_ARM + if(bpc & HAND_RIGHT) + covered_parts |= list(BODY_ZONE_R_ARM, BODY_ZONE_PRECISE_R_HAND) + else if(bpc & ARM_RIGHT) + covered_parts |= BODY_ZONE_R_ARM + + if(bpc & FOOT_LEFT) + covered_parts |= list(BODY_ZONE_L_LEG, BODY_ZONE_PRECISE_L_FOOT) + else if(bpc & LEG_LEFT) + covered_parts |= BODY_ZONE_L_LEG + if(bpc & FOOT_RIGHT) + covered_parts |= list(BODY_ZONE_R_LEG, BODY_ZONE_PRECISE_R_FOOT) + else if(bpc & LEG_RIGHT) + covered_parts |= BODY_ZONE_R_LEG return covered_parts diff --git a/code/__HELPERS/type_processing.dm b/code/__HELPERS/type_processing.dm index 180079cf65a7..dd07d1fc9aac 100644 --- a/code/__HELPERS/type_processing.dm +++ b/code/__HELPERS/type_processing.dm @@ -1,112 +1,118 @@ +// Longer paths should come after shorter ones +GLOBAL_LIST_INIT(fancy_type_replacements, list( + /datum = "DATUM", + /area = "AREA", + /atom/movable = "MOVABLE", + /obj = "OBJ", + /turf = "TURF", + /turf/closed = "CLOSED", + /turf/open = "OPEN", + + /mob = "MOB", + /mob/living = "LIVING", + /mob/living/carbon = "CARBON", + /mob/living/carbon/human = "HUMANOID", + /mob/living/simple_animal = "SIMPLE", + /mob/living/basic = "BASIC", + /mob/living/silicon = "SILICON", + /mob/living/silicon/robot = "CYBORG", + + /obj/item = "ITEM", + /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", + /obj/item/mecha_parts/mecha_equipment/weapon = "MECHA_WEAPON", + /obj/item/organ = "ORGAN", + /obj/item/mod/control = "MODSUIT", + /obj/item/mod/module = "MODSUIT_MOD", + /obj/item/ammo_box = "AMMOBOX", + /obj/item/ammo_box/magazine = "AMMOBOX_MAGAZINE", + /obj/item/ammo_box/speedloader = "AMMOBOX_SPEEDLOADER", + /obj/item/gun = "GUN", + /obj/item/gun/magic = "GUN_MAGIC", + /obj/item/gun/energy = "GUN_ENERGY", + /obj/item/gun/energy/laser = "GUN_LASER", + /obj/item/gun/ballistic = "GUN_BALLISTIC", + /obj/item/gun/ballistic/automatic = "GUN_AUTOMATIC", + /obj/item/gun/ballistic/revolver = "GUN_REVOLVER", + /obj/item/gun/ballistic/rifle = "GUN_RIFLE", + /obj/item/gun/ballistic/shotgun = "GUN_SHOTGUN", + /obj/item/stack/sheet = "SHEET", + /obj/item/stack/sheet/mineral = "MINERAL_SHEET", + /obj/item/stack/ore = "ORE", + /obj/item/ai_module = "AI_LAW_MODULE", + /obj/item/circuitboard = "CIRCUITBOARD", + /obj/item/circuitboard/machine = "MACHINE_BOARD", + /obj/item/circuitboard/computer = "COMPUTER_BOARD", + /obj/item/reagent_containers = "REAGENT_CONTAINERS", + /obj/item/reagent_containers/applicator/pill = "PILL", + /obj/item/reagent_containers/applicator/patch = "MEDPATCH", + /obj/item/reagent_containers/hypospray/medipen = "MEDIPEN", + /obj/item/reagent_containers/cup/glass = "DRINK", + /obj/item/food = "FOOD", + /obj/item/bodypart = "BODYPART", + /obj/effect/decal/cleanable = "CLEANABLE", + /obj/item/radio/headset = "HEADSET", + /obj/item/clothing = "CLOTHING", + /obj/item/clothing/accessory = "ACCESSORY", + /obj/item/clothing/mask/gas = "GASMASK", + /obj/item/clothing/mask = "MASK", + /obj/item/clothing/gloves = "GLOVES", + /obj/item/clothing/shoes = "SHOES", + /obj/item/clothing/under/plasmaman = "PLASMAMAN_SUIT", + /obj/item/clothing/under = "JUMPSUIT", + /obj/item/clothing/suit/armor = "ARMOR", + /obj/item/clothing/suit = "SUIT", + /obj/item/clothing/head/helmet = "HELMET", + /obj/item/clothing/head = "HEAD", + /obj/item/clothing/neck = "NECK", + /obj/item/storage/backpack = "BACKPACK", + /obj/item/storage/belt = "BELT", + /obj/item/storage/pill_bottle = "PILL_BOTTLE", + /obj/item/book/manual = "MANUAL", + + /obj/structure = "STRUCTURE", + /obj/structure/closet = "CLOSET", + /obj/structure/closet/crate = "CRATE", + /obj/structure/closet/crate/secure = "LOCKED_CRATE", + /obj/structure/closet/secure_closet = "LOCKED_CLOSET", + + /obj/machinery = "MACHINERY", + /obj/machinery/atmospherics = "ATMOS_MECH", + /obj/machinery/portable_atmospherics = "PORT_ATMOS", + /obj/machinery/door = "DOOR", + /obj/machinery/door/airlock = "AIRLOCK", + /obj/machinery/rnd/production = "RND_FABRICATOR", + /obj/machinery/computer = "COMPUTER", + /obj/machinery/computer/camera_advanced/shuttle_docker = "DOCKING_COMPUTER", + /obj/machinery/vending = "VENDING", + /obj/machinery/vending/wardrobe = "JOBDROBE", + /obj/effect = "EFFECT", + /obj/projectile = "PROJECTILE", +)) + /proc/make_types_fancy(list/types) if (ispath(types)) types = list(types) var/static/list/types_to_replacement var/static/list/replacement_to_text if(!types_to_replacement) - // Longer paths come after shorter ones, try and keep the structure - var/list/work_from = list( - /datum = "DATUM", - /area = "AREA", - /atom/movable = "MOVABLE", - /obj = "OBJ", - /turf = "TURF", - /turf/closed = "CLOSED", - /turf/open = "OPEN", - - /mob = "MOB", - /mob/living = "LIVING", - /mob/living/carbon = "CARBON", - /mob/living/carbon/human = "HUMANOID", - /mob/living/simple_animal = "SIMPLE", - /mob/living/basic = "BASIC", - /mob/living/silicon = "SILICON", - /mob/living/silicon/robot = "CYBORG", - - /obj/item = "ITEM", - /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", - /obj/item/mecha_parts/mecha_equipment/weapon = "MECHA_WEAPON", - /obj/item/organ = "ORGAN", - /obj/item/mod/control = "MODSUIT", - /obj/item/mod/module = "MODSUIT_MOD", - /obj/item/ammo_box = "AMMOBOX", - /obj/item/ammo_box/magazine = "AMMOBOX_MAGAZINE", - /obj/item/ammo_box/speedloader = "AMMOBOX_SPEEDLOADER", - /obj/item/gun = "GUN", - /obj/item/gun/magic = "GUN_MAGIC", - /obj/item/gun/energy = "GUN_ENERGY", - /obj/item/gun/energy/laser = "GUN_LASER", - /obj/item/gun/ballistic = "GUN_BALLISTIC", - /obj/item/gun/ballistic/automatic = "GUN_AUTOMATIC", - /obj/item/gun/ballistic/revolver = "GUN_REVOLVER", - /obj/item/gun/ballistic/rifle = "GUN_RIFLE", - /obj/item/gun/ballistic/shotgun = "GUN_SHOTGUN", - /obj/item/stack/sheet = "SHEET", - /obj/item/stack/sheet/mineral = "MINERAL_SHEET", - /obj/item/stack/ore = "ORE", - /obj/item/ai_module = "AI_LAW_MODULE", - /obj/item/circuitboard = "CIRCUITBOARD", - /obj/item/circuitboard/machine = "MACHINE_BOARD", - /obj/item/circuitboard/computer = "COMPUTER_BOARD", - /obj/item/reagent_containers = "REAGENT_CONTAINERS", - /obj/item/reagent_containers/applicator/pill = "PILL", - /obj/item/reagent_containers/applicator/patch = "MEDPATCH", - /obj/item/reagent_containers/hypospray/medipen = "MEDIPEN", - /obj/item/reagent_containers/cup/glass = "DRINK", - /obj/item/food = "FOOD", - /obj/item/bodypart = "BODYPART", - /obj/effect/decal/cleanable = "CLEANABLE", - /obj/item/radio/headset = "HEADSET", - /obj/item/clothing = "CLOTHING", - /obj/item/clothing/accessory = "ACCESSORY", - /obj/item/clothing/mask/gas = "GASMASK", - /obj/item/clothing/mask = "MASK", - /obj/item/clothing/gloves = "GLOVES", - /obj/item/clothing/shoes = "SHOES", - /obj/item/clothing/under/plasmaman = "PLASMAMAN_SUIT", - /obj/item/clothing/under = "JUMPSUIT", - /obj/item/clothing/suit/armor = "ARMOR", - /obj/item/clothing/suit = "SUIT", - /obj/item/clothing/head/helmet = "HELMET", - /obj/item/clothing/head = "HEAD", - /obj/item/clothing/neck = "NECK", - /obj/item/storage/backpack = "BACKPACK", - /obj/item/storage/belt = "BELT", - /obj/item/storage/pill_bottle = "PILL_BOTTLE", - /obj/item/book/manual = "MANUAL", - - /obj/structure = "STRUCTURE", - /obj/structure/closet = "CLOSET", - /obj/structure/closet/crate = "CRATE", - /obj/structure/closet/crate/secure = "LOCKED_CRATE", - /obj/structure/closet/secure_closet = "LOCKED_CLOSET", - - /obj/machinery = "MACHINERY", - /obj/machinery/atmospherics = "ATMOS_MECH", - /obj/machinery/portable_atmospherics = "PORT_ATMOS", - /obj/machinery/door = "DOOR", - /obj/machinery/door/airlock = "AIRLOCK", - /obj/machinery/rnd/production = "RND_FABRICATOR", - /obj/machinery/computer = "COMPUTER", - /obj/machinery/computer/camera_advanced/shuttle_docker = "DOCKING_COMPUTER", - /obj/machinery/vending = "VENDING", - /obj/machinery/vending/wardrobe = "JOBDROBE", - /obj/effect = "EFFECT", - /obj/projectile = "PROJECTILE", - ) // ignore_root_path so we can draw the root normally - types_to_replacement = zebra_typecacheof(work_from, ignore_root_path = TRUE) - replacement_to_text = list() - for(var/key in work_from) - replacement_to_text[work_from[key]] = "[key]" + var/list/fancy_type_cache = GLOB.fancy_type_replacements + var/list/local_replacements = zebra_typecacheof(fancy_type_cache, ignore_root_path = TRUE) + var/list/local_texts = list() + for(var/key in fancy_type_cache) + local_texts[local_replacements[key]] = "[key]" + types_to_replacement = local_replacements + replacement_to_text = local_texts . = list() + var/list/local_replacements = types_to_replacement + var/list/local_texts = replacement_to_text for(var/type in types) - var/replace_with = types_to_replacement[type] + var/replace_with = local_replacements[type] if(!replace_with) .["[type]"] = type continue - var/cut_out = replacement_to_text[replace_with] + var/cut_out = local_texts[replace_with] // + 1 to account for / .[replace_with + copytext("[type]", length(cut_out) + 1)] = type @@ -141,13 +147,19 @@ if (endtype) var/list/split_filter = splittext("[key]", filter) if (!findtext(split_filter[length(split_filter)], "/")) - matches[key] = value + if (value) + matches[key] = value + else + matches += key continue else - matches[key] = value + if (value) + matches[key] = value + else + matches += key continue - if (findtext("[value]", filter, -end_len)) + if (value && findtext("[value]", filter, -end_len)) if (endtype) var/list/split_filter = splittext("[value]", filter) if (findtext(split_filter[length(split_filter)], "/")) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index fb3cc3722810..6b7d03c9e57e 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -108,6 +108,9 @@ /// Prefer the autowiki build target instead. // #define AUTOWIKI +/// If defined, we boot up, run world.run_performance_tests() and then shut down the server +// #define PERFORMANCE_TESTS + /// If this is uncommented, will profile mapload atom initializations // #define PROFILE_MAPLOAD_INIT_ATOM @@ -141,7 +144,11 @@ // 2 for preloading absolutely everything; #ifdef LOWMEMORYMODE -#define FORCE_MAP "runtimetown" //DARKPACK EDIT, ORIGINAL: #define FORCE_MAP "runtimestation" +#ifndef ABSOLUTE_MINIMUM +#define FORCE_MAP "runtimetown" // DARKPACK EDIT, ORIGINAL: #define FORCE_MAP "runtimestation" +#else +#define FORCE_MAP "runtimestation_minimal" +#endif #define FORCE_MAP_DIRECTORY "_maps" #endif diff --git a/code/_globalvars/admin.dm b/code/_globalvars/admin.dm index 9b5cada802cb..5ef3acb56d00 100644 --- a/code/_globalvars/admin.dm +++ b/code/_globalvars/admin.dm @@ -47,6 +47,7 @@ GLOBAL_LIST_INIT(spanname_to_formatting, list( "Syndie Alert" = "alertsyndie", "Alert Warning" = "alertwarning", "Alien" = "alien", + "Anarch Radio" = "anarchradio", // DARKPACK EDIT ADD "Average" = "average", "Bad" = "bad", "Big" = "big", @@ -63,9 +64,11 @@ GLOBAL_LIST_INIT(spanname_to_formatting, list( "Bold Notice" = "boldnotice", "Bold Warning" = "boldwarning", "Big Bold" = "big bold", + "Camarilla Radio" = "camarillaradio", // DARKPACK EDIT ADD "Captain-Cast" = "captaincast", "Centcom Radio" = "centcomradio", "Changeling" = "changeling", + "Clinic Radio" = "clinicradio", // DARKPACK EDIT ADD "Clown" = "clown", "Colossus" = "colossus", "Command Headset" = "command_headset", @@ -78,6 +81,7 @@ GLOBAL_LIST_INIT(spanname_to_formatting, list( "Deadchat" = "deadsay", "Deconversion Message" = "deconversion_message", "Drone Radio" = "drone", + "Endron Radio" = "endronradio", // DARKPACK EDIT ADD "Engineering Radio" = "engradio", "Extremely Big" = "extremelybig", "Entertainment Radio" = "enteradio", @@ -104,6 +108,7 @@ GLOBAL_LIST_INIT(spanname_to_formatting, list( "Medradio" = "medradio", "Message" = "message", "Mind Control" = "mind_control", + "Military Radio" = "militaryradio", // DARKPACK EDIT ADD "Monkey" = "monkey", "Narsie" = "narsie", "Narsie Small" = "narsiesmall", @@ -113,6 +118,7 @@ GLOBAL_LIST_INIT(spanname_to_formatting, list( "OOC" = "ooc", "Papyrus" = "papyrus", "Phobia" = "phobia", + "Police Radio" = "policeradio", // DARKPACK EDIT ADD "Prefix" = "prefix", "Purple" = "purple", "Radio" = "radio", diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index f8f1b2cc9178..7046a2f8f4db 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -61,22 +61,32 @@ DEFINE_BITFIELD(appearance_flags, list( )) DEFINE_BITFIELD(area_flags, list( + "VALID_TERRITORY" = VALID_TERRITORY, "BLOBS_ALLOWED" = BLOBS_ALLOWED, + "NOTELEPORT" = NOTELEPORT, + "HIDDEN_AREA" = HIDDEN_AREA, "BLOCK_SUICIDE" = BLOCK_SUICIDE, - "CAVES_ALLOWED" = CAVES_ALLOWED, + "XENOBIOLOGY_COMPATIBLE" = XENOBIOLOGY_COMPATIBLE, "CULT_PERMITTED" = CULT_PERMITTED, - "FLORA_ALLOWED" = FLORA_ALLOWED, - "HIDDEN_AREA" = HIDDEN_AREA, - "MEGAFAUNA_SPAWN_ALLOWED" = MEGAFAUNA_SPAWN_ALLOWED, - "MOB_SPAWN_ALLOWED" = MOB_SPAWN_ALLOWED, - "NOTELEPORT" = NOTELEPORT, "NO_DEATH_MESSAGE" = NO_DEATH_MESSAGE, - "PERSISTENT_ENGRAVINGS" = PERSISTENT_ENGRAVINGS, - "UNIQUE_AREA" = UNIQUE_AREA, - "VALID_TERRITORY" = VALID_TERRITORY, - "XENOBIOLOGY_COMPATIBLE" = XENOBIOLOGY_COMPATIBLE, + "EVENT_PROTECTED" = EVENT_PROTECTED, + "QUIET_LOGS" = QUIET_LOGS, + "BINARY_JAMMING" = BINARY_JAMMING, "NO_BOH" = NO_BOH, "UNLIMITED_FISHING" = UNLIMITED_FISHING, + "NO_GRAVITY" = NO_GRAVITY, + "LOCAL_TELEPORT" = LOCAL_TELEPORT, +)) + +DEFINE_BITFIELD(area_flags_mapping, list( + "UNIQUE_AREA" = UNIQUE_AREA, + "CAVES_ALLOWED" = CAVES_ALLOWED, + "FLORA_ALLOWED" = FLORA_ALLOWED, + "MOB_SPAWN_ALLOWED" = MOB_SPAWN_ALLOWED, + "MEGAFAUNA_SPAWN_ALLOWED" = MEGAFAUNA_SPAWN_ALLOWED, + "PERSISTENT_ENGRAVINGS" = PERSISTENT_ENGRAVINGS, + "VIRTUAL_AREA" = VIRTUAL_AREA, + "VIRTUAL_SAFE_AREA" = VIRTUAL_SAFE_AREA, )) DEFINE_BITFIELD(turf_flags, list( @@ -112,6 +122,7 @@ DEFINE_BITFIELD(clothing_flags, list( "VOICEBOX_DISABLED" = VOICEBOX_DISABLED, "VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE, "INTERNALS_ADJUST_EXEMPT" = INTERNALS_ADJUST_EXEMPT, + "NO_ZONE_DISABLING" = NO_ZONE_DISABLING, )) DEFINE_BITFIELD(datum_flags, list( @@ -138,7 +149,6 @@ DEFINE_BITFIELD(flags_1, list( "HTML_USE_INITAL_ICON_1" = HTML_USE_INITAL_ICON_1, "IGNORE_TURF_PIXEL_OFFSET_1" = IGNORE_TURF_PIXEL_OFFSET_1, "INITIALIZED_1" = INITIALIZED_1, - "IS_ONTOP_1" = IS_ONTOP_1, "IS_PLAYER_COLORABLE_1" = IS_PLAYER_COLORABLE_1, "NO_NEW_GAGS_PREVIEW_1" = NO_NEW_GAGS_PREVIEW_1, "NO_SCREENTIPS_1" = NO_SCREENTIPS_1, @@ -322,12 +332,14 @@ DEFINE_BITFIELD(mob_respiration_type, list( DEFINE_BITFIELD(mobility_flags, list( "MOVE" = MOBILITY_MOVE, - "PICKUP" = MOBILITY_PICKUP, - "PULL" = MOBILITY_PULL, "STAND" = MOBILITY_STAND, - "STORAGE" = MOBILITY_STORAGE, - "UI" = MOBILITY_UI, + "PICKUP" = MOBILITY_PICKUP, "USE" = MOBILITY_USE, + "UI" = MOBILITY_UI, + "STORAGE" = MOBILITY_STORAGE, + "PULL" = MOBILITY_PULL, + "REST" = MOBILITY_REST, + "LIE DOWN" = MOBILITY_LIEDOWN, )) DEFINE_BITFIELD(movement_type, list( @@ -351,7 +363,6 @@ DEFINE_BITFIELD(obj_flags, list( "BLOCKS_CONSTRUCTION" = BLOCKS_CONSTRUCTION, "BLOCKS_CONSTRUCTION_DIR" = BLOCKS_CONSTRUCTION_DIR, "IGNORE_DENSITY" = IGNORE_DENSITY, - "INFINITE_RESKIN" = INFINITE_RESKIN, "CONDUCTS_ELECTRICITY" = CONDUCTS_ELECTRICITY, "NO_DEBRIS_AFTER_DECONSTRUCTION" = NO_DEBRIS_AFTER_DECONSTRUCTION, )) @@ -495,6 +506,18 @@ DEFINE_BITFIELD(bodypart_flags, list( "BODYPART_IMPLANTED" = BODYPART_IMPLANTED, )) +DEFINE_BITFIELD(biological_state, list( + "BIO_INORGANIC" = BIO_INORGANIC, + "BIO_BONE" = BIO_BONE, + "BIO_FLESH" = BIO_FLESH, + "BIO_METAL" = BIO_METAL, + "BIO_WOOD" = BIO_WOOD, + "BIO_WIRED" = BIO_WIRED, + "BIO_BLOODED" = BIO_BLOODED, + "BIO_JOINTED" = BIO_JOINTED, + "BIO_CHITIN" = BIO_CHITIN, +)) + DEFINE_BITFIELD(change_exempt_flags, list( "BP_BLOCK_CHANGE_SPECIES" = BP_BLOCK_CHANGE_SPECIES, )) @@ -666,4 +689,22 @@ DEFINE_BITFIELD(weather_flags, list( "WEATHER_ENDLESS" = WEATHER_ENDLESS, "WEATHER_BAROMETER" = WEATHER_BAROMETER, "WEATHER_TEMPERATURE_BYPASS_CLOTHING" = WEATHER_TEMPERATURE_BYPASS_CLOTHING, + "WEATHER_STRICT_ALERT" = WEATHER_STRICT_ALERT, +)) + +DEFINE_BITFIELD(visible_info, list( + "EMPATH_SEE_COMBAT" = EMPATH_SEE_COMBAT, + "EMPATH_SEE_OXY" = EMPATH_SEE_OXY, + "EMPATH_SEE_TOX" = EMPATH_SEE_TOX, + "EMPATH_SEE_SANITY" = EMPATH_SEE_SANITY, + "EMPATH_SEE_BLIND" = EMPATH_SEE_BLIND, + "EMPATH_SEE_DEAF" = EMPATH_SEE_DEAF, + "EMPATH_SEE_HOT" = EMPATH_SEE_HOT, + "EMPATH_SEE_COLD" = EMPATH_SEE_COLD, + "EMPATH_SEE_EVIL" = EMPATH_SEE_EVIL, +)) + +DEFINE_BITFIELD(allow_custom_character, list( + "GHOSTROLE_TAKE_PREFS_SPECIES" = GHOSTROLE_TAKE_PREFS_SPECIES, + "GHOSTROLE_TAKE_PREFS_APPEARANCE" = GHOSTROLE_TAKE_PREFS_APPEARANCE, )) diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index d8bcadc1efbe..e4eb9f356c90 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -13,10 +13,10 @@ GLOBAL_VAR_INIT(ooc_allowed, TRUE) // used with admin verbs to disable ooc - not GLOBAL_VAR_INIT(dooc_allowed, TRUE) -// Debug is used exactly once (in living.dm) but is commented out in a lot of places. It is not set anywhere and only checked. -// Debug2 is used in conjunction with a lot of admin verbs and therefore is actually legit. -GLOBAL_VAR_INIT(Debug, FALSE) // global debug switch -GLOBAL_VAR_INIT(Debug2, FALSE) +// debugging_enabled is used in conjunction with a lot of admin verbs and therefore is actually legit. +// im not sure why you would ever add behavoir, likely use a define like TESTING or even checking `Debugger?.enabled` +/// global debug switch +GLOBAL_VAR_INIT(debugging_enabled, FALSE) //This was a define, but I changed it to a variable so it can be changed in-game.(kept the all-caps definition because... code...) -Errorage //Protecting these because the proper way to edit them is with the config/secrets diff --git a/code/_globalvars/darkpack/lists/ambience.dm b/code/_globalvars/darkpack/lists/ambience.dm index 797385bee058..880dc000dcc3 100644 --- a/code/_globalvars/darkpack/lists/ambience.dm +++ b/code/_globalvars/darkpack/lists/ambience.dm @@ -19,6 +19,13 @@ GLOBAL_LIST_INIT(office_ambience, list( 'modular_darkpack/modules/ambience/sounds/interior.ogg' )) -GLOBAL_LIST_INIT(prince_ambience, list( - 'modular_darkpack/modules/ambience/sounds/prince.ogg' -)) +GLOBAL_LIST_INIT(music_assoc,list( + MUSIC_CITY = list('modular_darkpack/modules/ambience/sounds/music/downtown.ogg', 'modular_darkpack/modules/ambience/sounds/music/downtown_alt.ogg', 'modular_darkpack/modules/ambience/sounds/music/what_comes_next.ogg'), + MUSIC_FOREST = list('modular_darkpack/modules/ambience/sounds/music/night_ambience.ogg', 'modular_darkpack/modules/ambience/sounds/music/for_my_clan.ogg'), + MUSIC_CHURCH = list('modular_darkpack/modules/ambience/sounds/music/hahihaho.ogg'), + MUSIC_PRINCE = list('modular_darkpack/modules/ambience/sounds/music/prince.ogg'), + MUSIC_BAR = list('modular_darkpack/modules/ambience/sounds/music/naive.ogg'), + MUSIC_HOLLYWOOD = list('modular_darkpack/modules/ambience/sounds/music/hollywood.ogg', 'modular_darkpack/modules/ambience/sounds/music/open_season.ogg', 'modular_darkpack/modules/ambience/sounds/music/is_it_all_worth_it.ogg'), + MUSIC_SANTAMONICA = list('modular_darkpack/modules/ambience/sounds/music/santamonica.ogg'), + MUSIC_SAFE = list('modular_darkpack/modules/ambience/sounds/music/volition.ogg', 'modular_darkpack/modules/ambience/sounds/music/safe_room.ogg') + )) diff --git a/code/_globalvars/darkpack/lists/miscellaneous.dm b/code/_globalvars/darkpack/lists/miscellaneous.dm index 6d9280a3a664..65c29b3cc5ec 100644 --- a/code/_globalvars/darkpack/lists/miscellaneous.dm +++ b/code/_globalvars/darkpack/lists/miscellaneous.dm @@ -2,3 +2,4 @@ GLOBAL_LIST_EMPTY(kindred_list) /// List of living Sabbat members in the city GLOBAL_LIST_EMPTY(sabbatites) + diff --git a/code/_globalvars/darkpack/lists/phone_contacts.dm b/code/_globalvars/darkpack/lists/phone_contacts.dm new file mode 100644 index 000000000000..91626e5c4da5 --- /dev/null +++ b/code/_globalvars/darkpack/lists/phone_contacts.dm @@ -0,0 +1,39 @@ +// Important Contacts + +GLOBAL_LIST_EMPTY(phones_list) +GLOBAL_LIST_EMPTY(important_contacts) + +// Contact Networks + +GLOBAL_LIST_EMPTY(millenium_tower_network) +GLOBAL_LIST_EMPTY(lasombra_network) +GLOBAL_LIST_EMPTY(tremere_network) +GLOBAL_LIST_EMPTY(giovanni_network) +GLOBAL_LIST_EMPTY(tzmisce_network) +GLOBAL_LIST_EMPTY(anarch_network) +GLOBAL_LIST_EMPTY(supply_network) +GLOBAL_LIST_EMPTY(vampire_leader_network) +GLOBAL_LIST_EMPTY(endron_network) + +#define MILLENIUM_TOWER_NETWORK 1 +#define LASOMBRA_NETWORK 2 +#define TREMERE_NETWORK 3 +#define GIOVANNI_NETWORK 4 +#define TZMISCE_NETWORK 5 +#define ANARCH_NETWORK 6 +#define SUPPLY_NETWORK 7 +#define VAMPIRE_LEADER_NETWORK 8 +#define ENDRON_NETWORK 9 + +// An indexed list of all the different phone networks that connect the phones that are part of them together. +GLOBAL_LIST_INIT(contact_networks, list( + MILLENIUM_TOWER_NETWORK = GLOB.millenium_tower_network, + LASOMBRA_NETWORK = GLOB.lasombra_network, + TREMERE_NETWORK = GLOB.tremere_network, + GIOVANNI_NETWORK = GLOB.giovanni_network, + TZMISCE_NETWORK = GLOB.tzmisce_network, + ANARCH_NETWORK = GLOB.anarch_network, + SUPPLY_NETWORK = GLOB.supply_network, + VAMPIRE_LEADER_NETWORK = GLOB.vampire_leader_network, + ENDRON_NETWORK = GLOB.endron_network, + )) diff --git a/code/_globalvars/lists/ambience.dm b/code/_globalvars/lists/ambience.dm index 295262712a47..30efdb695205 100644 --- a/code/_globalvars/lists/ambience.dm +++ b/code/_globalvars/lists/ambience.dm @@ -210,6 +210,5 @@ GLOBAL_LIST_INIT(ambience_assoc,list( AMBIENCE_BEACH = GLOB.beach_ambience, AMBIENCE_NATURE = GLOB.nature_ambience, AMBIENCE_SEWER = GLOB.sewer_ambience, - AMBIENCE_OFFICE = GLOB.office_ambience, - AMBIENCE_PRINCE = GLOB.prince_ambience // DARKPACK EDIT ADD END + AMBIENCE_OFFICE = GLOB.office_ambience // DARKPACK EDIT ADD END )) diff --git a/code/_globalvars/lists/cargo.dm b/code/_globalvars/lists/cargo.dm index 1a41609d25ce..e771a69044a5 100644 --- a/code/_globalvars/lists/cargo.dm +++ b/code/_globalvars/lists/cargo.dm @@ -1,12 +1,6 @@ GLOBAL_LIST_INIT(discountable_packs, init_discountable_packs()) -/proc/init_discountable_packs() - var/list/packs = list() - for(var/datum/supply_pack/prototype as anything in subtypesof(/datum/supply_pack)) - var/discountable = initial(prototype.discountable) - if(discountable) - LAZYADD(packs[discountable], prototype) - return packs +GLOBAL_LIST_INIT(exports_list, init_Exports()) GLOBAL_LIST_INIT(pack_discount_odds, list( SUPPLY_PACK_STD_DISCOUNTABLE = 45, @@ -15,3 +9,19 @@ GLOBAL_LIST_INIT(pack_discount_odds, list( )) GLOBAL_LIST_EMPTY(supplypod_loading_bays) + +/// Caled when the global discount pack list is initialized +/proc/init_discountable_packs() + var/list/packs = list() + for(var/datum/supply_pack/prototype as anything in subtypesof(/datum/supply_pack)) + var/discountable = initial(prototype.discountable) + if(discountable) + LAZYADD(packs[discountable], prototype) + return packs + +/// Called when the global exports_list is empty, and sets it up. +/proc/init_Exports() + var/list/exports = list() + for(var/datum/export/subtype as anything in valid_subtypesof(/datum/export)) + exports += new subtype + return exports diff --git a/code/_globalvars/lists/clothing.dm b/code/_globalvars/lists/clothing.dm index 674a32664a7e..92bf067e0017 100644 --- a/code/_globalvars/lists/clothing.dm +++ b/code/_globalvars/lists/clothing.dm @@ -9,3 +9,11 @@ GLOBAL_LIST_INIT(backpacklist, list( GMESSENGER, LSATCHEL, )) + + +GLOBAL_LIST_INIT(suit_sensor_mode_to_defines, list( + "Off" = SENSOR_OFF, + "Binary vitals" = SENSOR_LIVING, + "Exact vitals" = SENSOR_VITALS, + "Tracking beacon" = SENSOR_COORDS, +)) diff --git a/code/_globalvars/lists/crafting.dm b/code/_globalvars/lists/crafting.dm index b836582a372c..a761b29535a2 100644 --- a/code/_globalvars/lists/crafting.dm +++ b/code/_globalvars/lists/crafting.dm @@ -41,5 +41,5 @@ GLOBAL_LIST_INIT(crafting_category, list( CAT_ENTERTAINMENT, CAT_TOOLS, CAT_CULT, - CAT_TZIMISCE, //DARKPACK EDIT ADD + CAT_TZIMISCE, // DARKPACK EDIT ADD )) diff --git a/code/_globalvars/lists/engineering.dm b/code/_globalvars/lists/engineering.dm index 70114905b5f4..602452d4789e 100644 --- a/code/_globalvars/lists/engineering.dm +++ b/code/_globalvars/lists/engineering.dm @@ -21,3 +21,46 @@ GLOBAL_LIST_INIT(all_tool_behaviours, list( TOOL_WIRECUTTER, TOOL_WRENCH, )) + +GLOBAL_LIST_INIT(all_mechanical_tools, list( + TOOL_ANALYZER, + TOOL_CROWBAR, + TOOL_MULTITOOL, + TOOL_SCREWDRIVER, + TOOL_WELDER, + TOOL_WIRECUTTER, + TOOL_WRENCH, +)) + +GLOBAL_LIST_INIT(all_surgical_tools, list( + TOOL_BONESET, + TOOL_CAUTERY, + TOOL_HEMOSTAT, + TOOL_RETRACTOR, + TOOL_SAW, + TOOL_SCALPEL, +)) + +/// Mapping of tool types to icons that represent them +GLOBAL_LIST_INIT(tool_to_image, list( + TOOL_CROWBAR = image(/obj/item/crowbar), + TOOL_MULTITOOL = image(/obj/item/multitool), + TOOL_SCREWDRIVER = image(/obj/item/screwdriver), + TOOL_WIRECUTTER = image(/obj/item/wirecutters), + TOOL_WRENCH = image(/obj/item/wrench), + TOOL_WELDER = image(/obj/item/weldingtool/mini), + TOOL_ANALYZER = image(/obj/item/analyzer), + TOOL_MINING = image(/obj/item/pickaxe), + TOOL_SHOVEL = image(/obj/item/shovel), + TOOL_RETRACTOR = image(/obj/item/retractor), + TOOL_HEMOSTAT = image(/obj/item/hemostat), + TOOL_CAUTERY = image(/obj/item/cautery), + TOOL_DRILL = image(/obj/item/surgicaldrill), + TOOL_SCALPEL = image(/obj/item/scalpel), + TOOL_SAW = image(/obj/item/circular_saw), + TOOL_BONESET = image(/obj/item/bonesetter), + TOOL_KNIFE = image(/obj/item/knife/kitchen), + TOOL_BLOODFILTER = image(/obj/item/blood_filter), + TOOL_ROLLINGPIN = image(/obj/item/kitchen/rollingpin), + TOOL_RUSTSCRAPER = image(/obj/item/wirebrush), +)) diff --git a/code/_globalvars/lists/languages.dm b/code/_globalvars/lists/languages.dm new file mode 100644 index 000000000000..da4d248959eb --- /dev/null +++ b/code/_globalvars/lists/languages.dm @@ -0,0 +1,57 @@ +/// List of language prototypes to reference, assoc [type] = prototype +GLOBAL_LIST_INIT_TYPED(language_datum_instances, /datum/language, init_language_prototypes()) +/// List if all language typepaths learnable, IE, those with keys +GLOBAL_LIST_INIT(all_languages, init_all_languages()) +/// /List of language prototypes to reference, assoc "name" = typepath +GLOBAL_LIST_INIT(language_types_by_name, init_language_types_by_name()) +/// ~1400 element long list containing the 1000 most common words in the English language in alphabetical order. +/// Indexed by word, value is the rank of the word in the list. So accessing it is fasta. +GLOBAL_LIST_INIT(most_common_words_alphabetical, init_common_words_by_alphabetical()) +/// ~1000 element long list containing the 1000 most common words in the English language in frequency order. +/// Indexed by word, value is the rank of the word in the list. So accessing it is fasta. +GLOBAL_LIST_INIT(most_common_words_frequency, init_common_words_by_frequency()) + +/proc/init_language_prototypes() + var/list/lang_list = list() + for(var/datum/language/lang_type as anything in typesof(/datum/language)) + if(!initial(lang_type.key)) + continue + + lang_list[lang_type] = new lang_type() + return lang_list + +/proc/init_all_languages() + var/list/lang_list = list() + for(var/datum/language/lang_type as anything in typesof(/datum/language)) + if(!initial(lang_type.key)) + continue + lang_list += lang_type + return lang_list + +/proc/init_language_types_by_name() + var/list/lang_list = list() + for(var/datum/language/lang_type as anything in typesof(/datum/language)) + if(!initial(lang_type.key)) + continue + lang_list[initial(lang_type.name)] = lang_type + return lang_list + +/proc/init_common_words_by_alphabetical() + var/list/word_to_commonness_list = list() + var/i = 1 + for(var/word in world.file2list("strings/1400_most_common_alpha.txt")) + word_to_commonness_list[word] = i + i += 1 + return word_to_commonness_list + +/proc/init_common_words_by_frequency() + var/list/word_to_commonness_list = list() + var/i = 1 + for(var/word in world.file2list("strings/1000_most_common_frequency.txt")) + word_to_commonness_list[word] = i + i += 1 + // alphabetical list has a few more entries than the frequency list, so + // if there are any words we're missing, add them with a default "commonness" of 500 + for(var/word in world.file2list("strings/1400_most_common_alpha.txt")) + word_to_commonness_list[word] ||= 500 + return word_to_commonness_list diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 6997f90aab51..b9abc260dc8d 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -111,7 +111,7 @@ GLOBAL_LIST_INIT(common_loot, list( //common: basic items /obj/item/stack/sheet/iron/twenty = 1, /obj/item/stack/sheet/mineral/plasma = 1, /obj/item/stock_parts/power_store/cell = 1, - + /obj/effect/spawner/random/engineering/vending_restock = 1, //assemblies /obj/item/assembly/health = 1, /obj/item/assembly/igniter = 1, diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index 35a18fffdd3f..116fb3adbea0 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -135,6 +135,7 @@ GLOBAL_LIST_EMPTY(deathsquadspawn) GLOBAL_LIST_EMPTY(emergencyresponseteamspawn) GLOBAL_LIST_EMPTY(ruin_landmarks) GLOBAL_LIST_EMPTY(bar_areas) +GLOBAL_LIST_EMPTY(mining_center) // For determining vent size ranked lists, epicenters for comparison goes here. /// List of all the maps that have been cached for /proc/load_map GLOBAL_LIST_EMPTY(cached_maps) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 677b5f49d7d4..492306d497a1 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -8,32 +8,15 @@ GLOBAL_LIST_EMPTY(stealthminID) //reference list with IDs that store ckeys, for /// List of types of abstract mob which shouldn't usually exist in the world on its own if we're spawning random mobs GLOBAL_LIST_INIT(abstract_mob_types, list( - /mob/living/basic, - /mob/living/basic/blob_minion, - /mob/living/basic/bot, /mob/living/basic/construct, /mob/living/basic/guardian, /mob/living/basic/heretic_summon, - /mob/living/basic/mimic, // Cannot exist if spawned without being passed an item reference - /mob/living/basic/mining, - /mob/living/basic/pet, + /mob/living/basic/mimic/copy, // Cannot exist if spawned without being passed an item reference /mob/living/basic/soulscythe, // This is just a way for players to control the soulscythe item - /mob/living/basic/spider, - /mob/living/carbon, - /mob/living/carbon/alien, - /mob/living/carbon/alien/adult, /mob/living/carbon/human/consistent, /mob/living/carbon/human/dummy, /mob/living/carbon/human/dummy/consistent, - /mob/living/carbon/human/species, - /mob/living/silicon, - /mob/living/simple_animal, - /mob/living/simple_animal/bot, - /mob/living/simple_animal/hostile, - /mob/living/simple_animal/hostile/asteroid, - /mob/living/simple_animal/hostile/asteroid/elite, - /mob/living/simple_animal/hostile/megafauna, -)) + )) //Since it didn't really belong in any other category, I'm putting this here @@ -81,37 +64,6 @@ GLOBAL_LIST_EMPTY(revenant_relay_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) -/// List of language prototypes to reference, assoc [type] = prototype -GLOBAL_LIST_INIT_TYPED(language_datum_instances, /datum/language, init_language_prototypes()) -/// List if all language typepaths learnable, IE, those with keys -GLOBAL_LIST_INIT(all_languages, init_all_languages()) -/// /List of language prototypes to reference, assoc "name" = typepath -GLOBAL_LIST_INIT(language_types_by_name, init_language_types_by_name()) - -/proc/init_language_prototypes() - var/list/lang_list = list() - for(var/datum/language/lang_type as anything in typesof(/datum/language)) - if(!initial(lang_type.key)) - continue - - lang_list[lang_type] = new lang_type() - return lang_list - -/proc/init_all_languages() - var/list/lang_list = list() - for(var/datum/language/lang_type as anything in typesof(/datum/language)) - if(!initial(lang_type.key)) - continue - lang_list += lang_type - return lang_list - -/proc/init_language_types_by_name() - var/list/lang_list = list() - for(var/datum/language/lang_type as anything in typesof(/datum/language)) - if(!initial(lang_type.key)) - continue - lang_list[initial(lang_type.name)] = lang_type - return lang_list /// A list of all the possible blood types, keyed by id (which is just the name in most cases) GLOBAL_LIST_INIT(blood_types, init_blood_types()) @@ -119,9 +71,7 @@ GLOBAL_LIST_INIT(blood_types, init_blood_types()) /// Initializes the list of blood type singletons /proc/init_blood_types() . = list() - for(var/datum/blood_type/blood_type_path as anything in subtypesof(/datum/blood_type)) - if(blood_type_path::abstract_type == blood_type_path) // Don't instantiate abstract blood types - continue + for(var/datum/blood_type/blood_type_path as anything in valid_subtypesof(/datum/blood_type)) var/datum/blood_type/new_type = new blood_type_path() .[new_type.id] = new_type @@ -203,7 +153,7 @@ GLOBAL_LIST_INIT(dna_identity_blocks, init_identity_block_types()) /proc/init_identity_block_types() . = list() - for(var/datum/dna_block/identity/block_path as anything in subtypesof(/datum/dna_block/identity)) + for(var/datum/dna_block/identity/block_path as anything in valid_subtypesof(/datum/dna_block/identity)) var/datum/dna_block/identity/new_block = new block_path() .[block_path] = new_block @@ -212,6 +162,6 @@ GLOBAL_LIST_INIT(dna_feature_blocks, init_feature_block_types()) /proc/init_feature_block_types() . = list() - for(var/datum/dna_block/feature/block_path as anything in subtypesof(/datum/dna_block/feature)) + for(var/datum/dna_block/feature/block_path as anything in valid_subtypesof(/datum/dna_block/feature)) var/datum/dna_block/feature/new_block = new block_path() .[block_path] = new_block diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 4707ebf0a962..4eae1a55301f 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -33,12 +33,6 @@ GLOBAL_LIST_EMPTY_TYPED(singularities, /datum/component/singularity) GLOBAL_LIST_EMPTY(item_to_design_list) -/// list of all surgeries by name, associated with their path. -GLOBAL_LIST_INIT(surgeries_list, init_surgeries()) - -/// list of all surgery steps, associated by their path. -GLOBAL_LIST_INIT(surgery_steps, init_subtypes_w_path_keys(/datum/surgery_step, list())) - /// Global list of all non-cooking related crafting recipes. GLOBAL_LIST_EMPTY(crafting_recipes) /// This is a global list of typepaths, these typepaths are atoms or reagents that are associated with crafting recipes. @@ -103,4 +97,3 @@ GLOBAL_LIST_INIT(prototype_organs, typecacheof(list( /obj/item/organ/tongue/dullahan, /obj/item/organ/eyes/dullahan, ), only_root_path = TRUE)) - diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index d879e66c754b..72fe3ffa85b6 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -16,6 +16,7 @@ #define POLL_IGNORE_GOLEM "golem" #define POLL_IGNORE_HERETIC_MONSTER "heretic_monster" #define POLL_IGNORE_HOLOPARASITE "holoparasite" +#define POLL_IGNORE_HORRIFIC_NECKTIE "horrific_necktie" #define POLL_IGNORE_IMAGINARYFRIEND "imaginary_friend" #define POLL_IGNORE_LAVALAND_ELITE "lavaland_elite" #define POLL_IGNORE_MAID_IN_MIRROR "maid_in_mirror" @@ -39,7 +40,7 @@ #define POLL_IGNORE_RECOVERED_CREW "recovered_crew" #define POLL_IGNORE_EXPERIMENTAL_CLONER "experimental_cloner" #define POLL_IGNORE_FREE_SPORE "free_spore" -#define POLL_IGNORE_BAALI_GUARD "baali_guard" //DARKPACK EDIT ADD +#define POLL_IGNORE_BAALI_GUARD "baali_guard" // DARKPACK EDIT ADD GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_ACADEMY_WIZARD = "Academy Wizard Defender", @@ -58,6 +59,7 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_GOLEM = "Golems", POLL_IGNORE_HERETIC_MONSTER = "Heretic Monster", POLL_IGNORE_HOLOPARASITE = "Holoparasite", + POLL_IGNORE_HORRIFIC_NECKTIE = "Horrific Necktie", POLL_IGNORE_IMAGINARYFRIEND = "Imaginary Friend", POLL_IGNORE_LAVALAND_ELITE = "Lavaland elite", POLL_IGNORE_MAID_IN_MIRROR = "Maid in the Mirror", @@ -80,7 +82,7 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_VENUSHUMANTRAP = "Venus Human Traps", POLL_IGNORE_RECOVERED_CREW = "Recovered Crew", POLL_IGNORE_FREE_SPORE = "Free spore", - POLL_IGNORE_BAALI_GUARD = "Baali Guard", //DARKPACK EDIT ADD + POLL_IGNORE_BAALI_GUARD = "Baali Guard", // DARKPACK EDIT ADD )) GLOBAL_LIST_INIT(poll_ignore, init_poll_ignore()) diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm index d97fff7df584..225b12c8353c 100644 --- a/code/_globalvars/lists/reagents.dm +++ b/code/_globalvars/lists/reagents.dm @@ -166,7 +166,12 @@ GLOBAL_LIST_INIT(plant_traits, init_plant_traits()) 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)) + GLOB.chemical_reactions_results_lookup_list += list(list( + "name" = product_name, + "id" = reaction.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) diff --git a/code/_globalvars/lists/strings.dm b/code/_globalvars/lists/strings.dm index 80cc4816c1e4..9be0b0d36f32 100644 --- a/code/_globalvars/lists/strings.dm +++ b/code/_globalvars/lists/strings.dm @@ -6,11 +6,11 @@ GLOBAL_LIST_INIT(greek_letters, world.file2list("strings/greek_letters.txt")) GLOBAL_LIST_INIT(gross_adjectives, world.file2list("strings/names/gross_adjectives.txt")) GLOBAL_LIST_INIT(ing_verbs, world.file2list("strings/names/ing_verbs.txt")) GLOBAL_LIST_INIT(junkmail_messages, world.file2list("strings/junkmail.txt")) -GLOBAL_LIST_INIT(most_common_words, world.file2list("strings/1000_most_common.txt")) GLOBAL_LIST_INIT(numbers_as_words, world.file2list("strings/numbers_as_words.txt")) GLOBAL_LIST_INIT(phonetic_alphabet, world.file2list("strings/phonetic_alphabet.txt")) GLOBAL_LIST_INIT(verbs, world.file2list("strings/names/verbs.txt")) GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/wisdoms.txt")) +GLOBAL_LIST_INIT(preference_adjectives, world.file2list("strings/preference_adjectives.txt")) // DARKPACK EDIT ADD //loaded on startup because of " //would include in rsc if ' was used diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index 42ef18c265d3..83443b4e95aa 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -398,7 +398,6 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/grenade/clusterbuster/spawner_spesscarp, /obj/item/grenade/spawnergrenade/spesscarp, /obj/item/knife/carp, - /obj/item/nullrod/carp, /obj/item/organ/brain/carp, /obj/item/organ/heart/carp, /obj/item/organ/liver/fish, @@ -544,7 +543,7 @@ GLOBAL_LIST_INIT(phobia_objs, list( // DARKPACK EDIT ADD START - Religious phobia "religion" = typecacheof(list( /obj/item/book/bible, - ///obj/item/card/id/hunter + /obj/item/card/hunter )), // DARKPACK EDIT ADD END - Religious phobia )) diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 6516d409fb20..47351af0a4ff 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -34,6 +34,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SPINNING" = TRAIT_SPINNING, "TRAIT_STICKERED" = TRAIT_STICKERED, "TRAIT_UNHITTABLE_BY_PROJECTILES" = TRAIT_UNHITTABLE_BY_PROJECTILES, + "TRAIT_UNHITTABLE_BY_LASERS" = TRAIT_UNHITTABLE_BY_LASERS, "TRAIT_UNLINKABLE_FISHING_SPOT" = TRAIT_UNLINKABLE_FISHING_SPOT, "TRAIT_TETHER_ATTACHED" = TRAIT_TETHER_ATTACHED, ), @@ -48,6 +49,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CASTABLE_LOC" = TRAIT_CASTABLE_LOC, "TRAIT_CHASM_STOPPER" = TRAIT_CHASM_STOPPER, "TRAIT_COMBAT_MODE_SKIP_INTERACTION" = TRAIT_COMBAT_MODE_SKIP_INTERACTION, + "TRAIT_DANGEROUS_BUCKLE" = TRAIT_DANGEROUS_BUCKLE, "TRAIT_DEL_ON_SPACE_DUMP" = TRAIT_DEL_ON_SPACE_DUMP, "TRAIT_FOOD_DONT_INHERIT_NAME_FROM_PROCESSED" = TRAIT_FOOD_DONT_INHERIT_NAME_FROM_PROCESSED, "TRAIT_FROZEN" = TRAIT_FROZEN, @@ -133,6 +135,12 @@ GLOBAL_LIST_INIT(traits_by_type, list( "STATION_TRAIT_UNIQUE_AI" = STATION_TRAIT_UNIQUE_AI, "STATION_TRAIT_UNNATURAL_ATMOSPHERE" = STATION_TRAIT_UNNATURAL_ATMOSPHERE, "STATION_TRAIT_SPIKED_DRINKS" = STATION_TRAIT_SPIKED_DRINKS, + "STATION_TRAIT_RED_STAR" = STATION_TRAIT_RED_STAR, // DARKPACK EDIT ADD START - CITY_TRAITS + "STATION_TRAIT_WILD_MASQUERADE" = STATION_TRAIT_WILD_MASQUERADE, + "STATION_TRAIT_INFESTATION" = STATION_TRAIT_INFESTATION, + "STATION_TRAIT_PEST_CONTROL" = STATION_TRAIT_PEST_CONTROL, + "STATION_TRAIT_STRAY_MIGRATION" = STATION_TRAIT_STRAY_MIGRATION, + "STATION_TRAIT_COSPLAY_CONVENTION" = STATION_TRAIT_COSPLAY_CONVENTION // DARKPACK EDIT ADD END ), /datum/deathmatch_lobby = list( "TRAIT_DEATHMATCH_EXPLOSIVE_IMPLANTS" = TRAIT_DEATHMATCH_EXPLOSIVE_IMPLANTS, @@ -143,6 +151,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( /datum/wound = list( "TRAIT_WOUND_SCANNED" = TRAIT_WOUND_SCANNED, ), + /datum/antagonist/heretic = list( + "TRAIT_LOCK_GRASP_UPGRADED" = TRAIT_LOCK_GRASP_UPGRADED, + ), /obj = list( "TRAIT_CONTRABAND" = TRAIT_CONTRABAND, "TRAIT_DUCT_TAPE_UNREPAIRABLE" = TRAIT_DUCT_TAPE_UNREPAIRABLE, @@ -150,6 +161,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_WALLMOUNTED" = TRAIT_WALLMOUNTED, ), /mob = list( + "TRAIT_ABDUCTOR_HUD" = TRAIT_ABDUCTOR_HUD, "TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING, "TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING, "TRAIT_ACT_AS_CULTIST" = TRAIT_ACT_AS_CULTIST, @@ -185,30 +197,31 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BLOB_ALLY" = TRAIT_BLOB_ALLY, "TRAIT_BLOCKING_PROJECTILES" = TRAIT_BLOCKING_PROJECTILES, "TRAIT_BLOCK_FORMALDEHYDE_METABOLISM" = TRAIT_BLOCK_FORMALDEHYDE_METABOLISM, + "TRAIT_BLOCK_SECHUD" = TRAIT_BLOCK_SECHUD, "TRAIT_BLOCK_SHUTTLE_MOVEMENT" = TRAIT_BLOCK_SHUTTLE_MOVEMENT, "TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES, "TRAIT_BLOODY_MESS" = TRAIT_BLOODY_MESS, "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, - "TRAIT_BLOOD_DRINKER" = TRAIT_BLOOD_DRINKER, + "TRAIT_BLOOD_DRINKER" = TRAIT_BLOOD_DRINKER, // DARKPACK EDIT ADD "TRAIT_BLOOD_FOUNTAIN" = TRAIT_BLOOD_FOUNTAIN, - "TRAIT_BLOODY_LOVER" = TRAIT_BLOODY_LOVER, - "TRAIT_BLOODY_SUCKER" = TRAIT_BLOODY_SUCKER, + "TRAIT_BLOODY_LOVER" = TRAIT_BLOODY_LOVER, // DARKPACK EDIT ADD + "TRAIT_BLOODY_SUCKER" = TRAIT_BLOODY_SUCKER, // DARKPACK EDIT ADD "TRAIT_BOMBIMMUNE" = TRAIT_BOMBIMMUNE, "TRAIT_BONSAI" = TRAIT_BONSAI, "TRAIT_BOOZE_SLIDER" = TRAIT_BOOZE_SLIDER, "TRAIT_BORN_MONKEY" = TRAIT_BORN_MONKEY, "TRAIT_BOT_PATH_HUD" = TRAIT_BOT_PATH_HUD, "TRAIT_BOXING_READY" = TRAIT_BOXING_READY, - "TRAIT_BUGKILLER_DEATH" = TRAIT_BUGKILLER_DEATH, "TRAIT_BRAINWASHING" = TRAIT_BRAINWASHING, "TRAIT_BRAWLING_KNOCKDOWN_BLOCKED" = TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, + "TRAIT_BUGKILLER_DEATH" = TRAIT_BUGKILLER_DEATH, "TRAIT_BYPASS_EARLY_IRRADIATED_CHECK" = TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, "TRAIT_BYPASS_MEASURES" = TRAIT_BYPASS_MEASURES, "TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED, "TRAIT_CANNOT_CRYSTALIZE" = TRAIT_CANNOT_CRYSTALIZE, "TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, "TRAIT_CANT_RIDE" = TRAIT_CANT_RIDE, - "TRAIT_CAN_ENTER_TORPOR" = TRAIT_CAN_ENTER_TORPOR, + "TRAIT_CAN_ENTER_TORPOR" = TRAIT_CAN_ENTER_TORPOR, // DARKPACK EDIT ADD "TRAIT_CAN_GET_AI_TRACKING_MESSAGE" = TRAIT_CAN_GET_AI_TRACKING_MESSAGE, "TRAIT_CAN_HOLD_ITEMS" = TRAIT_CAN_HOLD_ITEMS, "TRAIT_CAN_MOUNT_CYBORGS" = TRAIT_CAN_MOUNT_CYBORGS, @@ -217,11 +230,10 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CAN_STRIP" = TRAIT_CAN_STRIP, "TRAIT_CAN_THROW_ITEMS" = TRAIT_CAN_THROW_ITEMS, "TRAIT_CAN_USE_NUKE" = TRAIT_CAN_USE_NUKE, - "TRAIT_CANNOT_RESIST_MIND_CONTROL" = TRAIT_CANNOT_RESIST_MIND_CONTROL, - "TRAIT_CARPOTOXIN_IMMUNE" = TRAIT_CARPOTOXIN_IMMUNE, + "TRAIT_CANNOT_RESIST_MIND_CONTROL" = TRAIT_CANNOT_RESIST_MIND_CONTROL, // DARKPACK EDIT ADD "TRAIT_CATLIKE_GRACE" = TRAIT_CATLIKE_GRACE, "TRAIT_CHANGELING_HIVEMIND_MUTE" = TRAIT_CHANGELING_HIVEMIND_MUTE, - "TRAIT_CHARMER" = TRAIT_CHARMER, + "TRAIT_CHARMER" = TRAIT_CHARMER, // DARKPACK EDIT ADD "TRAIT_CHASM_DESTROYED" = TRAIT_CHASM_DESTROYED, "TRAIT_CHEF_KISS" = TRAIT_CHEF_KISS, "TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS, @@ -232,11 +244,11 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CLOWN_ENJOYER" = TRAIT_CLOWN_ENJOYER, "TRAIT_CLUMSY" = TRAIT_CLUMSY, "TRAIT_COAGULATING" = TRAIT_COAGULATING, - "TRAIT_COFFIN_THERAPY" = TRAIT_COFFIN_THERAPY, + "TRAIT_COFFIN_THERAPY" = TRAIT_COFFIN_THERAPY, // DARKPACK EDIT ADD "TRAIT_COLORBLIND" = TRAIT_COLORBLIND, "TRAIT_COMBAT_MODE_LOCK" = TRAIT_COMBAT_MODE_LOCK, "TRAIT_CONNECTED_TO_CIRCUIT" = TRAIT_CONNECTED_TO_CIRCUIT, - "TRAIT_CONSENSUAL_FEEDING_ONLY" = TRAIT_CONSENSUAL_FEEDING_ONLY, + "TRAIT_CONSENSUAL_FEEDING_ONLY" = TRAIT_CONSENSUAL_FEEDING_ONLY, // DARKPACK EDIT ADD "TRAIT_CORPSELOCKED" = TRAIT_CORPSELOCKED, "TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, "TRAIT_CULT_HALO" = TRAIT_CULT_HALO, @@ -245,21 +257,22 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DEAF" = TRAIT_DEAF, "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, "TRAIT_DEFIB_BLACKLISTED" = TRAIT_DEFIB_BLACKLISTED, - "TRAIT_DEFICIENT_VITAE" = TRAIT_DEFICIENT_VITAE, + "TRAIT_DEFICIENT_VITAE" = TRAIT_DEFICIENT_VITAE, // DARKPACK EDIT ADD + "TRAIT_DESENSITIZED" = TRAIT_DESENSITIZED, "TRAIT_DESIGNATED_TARGET" = TRAIT_DESIGNATED_TARGET, "TRAIT_DETECTIVES_TASTE" = TRAIT_DETECTIVES_TASTE, "TRAIT_DETECT_STORM" = TRAIT_DETECT_STORM, - "TRAIT_DIABLERIE" = TRAIT_DIABLERIE, + "TRAIT_DIABLERIE" = TRAIT_DIABLERIE, // DARKPACK EDIT ADD "TRAIT_DIAGNOSTIC_HUD" = TRAIT_DIAGNOSTIC_HUD, - "TRAIT_DISCO_DANCER" = TRAIT_DISCO_DANCER, + "TRAIT_DISCO_DANCER" = TRAIT_DISCO_DANCER, // DARKPACK EDIT ADD "TRAIT_DISCOORDINATED_TOOL_USER" = TRAIT_DISCOORDINATED_TOOL_USER, - "TRAIT_DISEASELIKE_SEVERITY_MEDIUM" = TRAIT_DISEASELIKE_SEVERITY_MEDIUM, + "TRAIT_DISCO_DANCER" = TRAIT_DISCO_DANCER, "TRAIT_DISEASELIKE_SEVERITY_HIGH" = TRAIT_DISEASELIKE_SEVERITY_HIGH, + "TRAIT_DISEASELIKE_SEVERITY_MEDIUM" = TRAIT_DISEASELIKE_SEVERITY_MEDIUM, "TRAIT_DISFIGURED" = TRAIT_DISFIGURED, "TRAIT_DISGUISED" = TRAIT_DISGUISED, - "TRAIT_DISPLAY_JOB_IN_BINARY" = TRAIT_DISPLAY_JOB_IN_BINARY, - "TRAIT_DISCO_DANCER" = TRAIT_DISCO_DANCER, "TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER, + "TRAIT_DISPLAY_JOB_IN_BINARY" = TRAIT_DISPLAY_JOB_IN_BINARY, "TRAIT_DISSECTED" = TRAIT_DISSECTED, "TRAIT_DONT_WRITE_MEMORY" = TRAIT_DONT_WRITE_MEMORY, "TRAIT_DOUBLE_TAP" = TRAIT_DOUBLE_TAP, @@ -277,8 +290,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ELDRITCH_PAINTING_EXAMINE" = TRAIT_ELDRITCH_PAINTING_EXAMINE, "TRAIT_ELITE_CHALLENGER" = TRAIT_ELITE_CHALLENGER, "TRAIT_EMOTEMUTE" = TRAIT_EMOTEMUTE, - "TRAIT_EMPATH" = TRAIT_EMPATH, - "TRAIT_ENHANCED_MELEE_DODGE" = TRAIT_ENHANCED_MELEE_DODGE, + "TRAIT_ENHANCED_MELEE_DODGE" = TRAIT_ENHANCED_MELEE_DODGE, // DARKPACK EDIT ADD "TRAIT_ENTRAILS_READER" = TRAIT_ENTRAILS_READER, "TRAIT_EVIL" = TRAIT_EVIL, "TRAIT_EXAMINE_DEEPER_FISH" = TRAIT_EXAMINE_DEEPER_FISH, @@ -289,7 +301,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_EXPERT_FISHER" = TRAIT_EXPERT_FISHER, "TRAIT_EXTROVERT" = TRAIT_EXTROVERT, "TRAIT_FACE_COVERED" = TRAIT_FACE_COVERED, - "TRAIT_FAKE_SOULLESS" = TRAIT_FAKE_SOULLESS, + "TRAIT_FAKE_SOULLESS" = TRAIT_FAKE_SOULLESS, // DARKPACK EDIT ADD "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, "TRAIT_FASTMED" = TRAIT_FASTMED, "TRAIT_FAST_CUFFING" = TRAIT_FAST_CUFFING, @@ -297,7 +309,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FAT" = TRAIT_FAT, "TRAIT_GLUTTON" = TRAIT_GLUTTON, "TRAIT_FEARLESS" = TRAIT_FEARLESS, - "TRAIT_FEEDING_RESTRICTION" = TRAIT_FEEDING_RESTRICTION, + "TRAIT_FEEDING_RESTRICTION" = TRAIT_FEEDING_RESTRICTION, // DARKPACK EDIT ADD "TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER, "TRAIT_FERAL_BITER" = TRAIT_FERAL_BITER, "TRAIT_FINGERPRINT_PASSTHROUGH" = TRAIT_FINGERPRINT_PASSTHROUGH, @@ -328,7 +340,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_GRABRESISTANCE" = TRAIT_GRABRESISTANCE, "TRAIT_GRABWEAKNESS" = TRAIT_GRABWEAKNESS, "TRAIT_GREENTEXT_CURSED" = TRAIT_GREENTEXT_CURSED, - "TRAIT_GULLET" = TRAIT_GULLET, + "TRAIT_GULLET" = TRAIT_GULLET, // DARKPACK EDIT ADD "TRAIT_GUNFLIP" = TRAIT_GUNFLIP, "TRAIT_GUN_NATURAL" = TRAIT_GUN_NATURAL, "TRAIT_HALLUCINATION_IMMUNE" = TRAIT_HALLUCINATION_IMMUNE, @@ -348,17 +360,18 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_HIDE_EXTERNAL_ORGANS" = TRAIT_HIDE_EXTERNAL_ORGANS, "TRAIT_HIGH_VALUE_RANSOM" = TRAIT_HIGH_VALUE_RANSOM, "TRAIT_HOLY" = TRAIT_HOLY, - "TRAIT_HOMOSEXUAL" = TRAIT_HOMOSEXUAL, + "TRAIT_HOMOSEXUAL" = TRAIT_HOMOSEXUAL, // DARKPACK EDIT ADD "TRAIT_HOPELESSLY_ADDICTED" = TRAIT_HOPELESSLY_ADDICTED, "TRAIT_HOT_SPRING_CURSED" = TRAIT_HOT_SPRING_CURSED, "TRAIT_HULK" = TRAIT_HULK, - "TRAIT_HUNGRY" = TRAIT_HUNGRY, - "TRAIT_HUNTED" = TRAIT_HUNTED, + "TRAIT_HUNGRY" = TRAIT_HUNGRY, // DARKPACK EDIT ADD + "TRAIT_HUNTED" = TRAIT_HUNTED, // DARKPACK EDIT ADD "TRAIT_HUSK" = TRAIT_HUSK, "TRAIT_HYPOTHERMIC" = TRAIT_HYPOTHERMIC, "TRAIT_ID_APPRAISER" = TRAIT_ID_APPRAISER, - "TRAIT_IGNORE_ELEVATION" = TRAIT_IGNORE_ELEVATION, "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, + "TRAIT_IGNORE_ELEVATION" = TRAIT_IGNORE_ELEVATION, + "TRAIT_IGNORE_SURGERY_MODIFIERS" = TRAIT_IGNORE_SURGERY_MODIFIERS, "TRAIT_IGNORING_GRAVITY" = TRAIT_IGNORING_GRAVITY, "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, "TRAIT_IMMOBILIZED" = TRAIT_IMMOBILIZED, @@ -367,10 +380,11 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_INTROVERT" = TRAIT_INTROVERT, "TRAIT_INVISIBILITY_BLOCKED" = TRAIT_INVISIBILITY_BLOCKED, "TRAIT_INVISIBLE_MAN" = TRAIT_INVISIBLE_MAN, - "TRAIT_INVISIBLE_TO_CAMERA" = TRAIT_INVISIBLE_TO_CAMERA, + "TRAIT_INVISIBLE_TO_CAMERA" = TRAIT_INVISIBLE_TO_CAMERA, // DARKPACK EDIT ADD "TRAIT_INVISIMIN" = TRAIT_INVISIMIN, "TRAIT_IN_CALL" = TRAIT_IN_CALL, - "TRAIT_IRRESISTIBLE_VITAE" = TRAIT_IRRESISTIBLE_VITAE, + "TRAIT_IN_FRENZY" = TRAIT_IN_FRENZY, // DARKPACK EDIT ADD + "TRAIT_IRRESISTIBLE_VITAE" = TRAIT_IRRESISTIBLE_VITAE, // DARKPACK EDIT ADD "TRAIT_IS_WET" = TRAIT_IS_WET, "TRAIT_IWASBATONED" = TRAIT_IWASBATONED, "TRAIT_KISS_OF_DEATH" = TRAIT_KISS_OF_DEATH, @@ -380,23 +394,25 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_KNOW_ENGI_WIRES" = TRAIT_KNOW_ENGI_WIRES, "TRAIT_KNOW_ROBO_WIRES" = TRAIT_KNOW_ROBO_WIRES, "TRAIT_LIGHTBULB_REMOVER" = TRAIT_LIGHTBULB_REMOVER, - "TRAIT_LAZY" = TRAIT_LAZY, + "TRAIT_LAZY" = TRAIT_LAZY, // DARKPACK EDIT ADD "TRAIT_LIGHT_DRINKER" = TRAIT_LIGHT_DRINKER, "TRAIT_LIGHT_STEP" = TRAIT_LIGHT_STEP, "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, "TRAIT_LITERATE" = TRAIT_LITERATE, "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, - "TRAIT_LONGER_FRENZY" = TRAIT_LONGER_FRENZY, + "TRAIT_LONGER_FRENZY" = TRAIT_LONGER_FRENZY, // DARKPACK EDIT ADD "TRAIT_LOUD_BINARY" = TRAIT_LOUD_BINARY, + "TRAIT_LUMINESCENT_EYES" = TRAIT_LUMINESCENT_EYES, "TRAIT_MADNESS_IMMUNE" = TRAIT_MADNESS_IMMUNE, "TRAIT_MAFIAINITIATE" = TRAIT_MAFIAINITIATE, "TRAIT_MAGICALLY_GIFTED" = TRAIT_MAGICALLY_GIFTED, "TRAIT_MAGICALLY_PHASED" = TRAIT_MAGICALLY_PHASED, "TRAIT_MARTIAL_ARTS_IMMUNE" = TRAIT_MARTIAL_ARTS_IMMUNE, "TRAIT_MANSUS_TOUCHED" = TRAIT_MANSUS_TOUCHED, - "TRAIT_MASQUERADE_VIOLATING_EYES" = TRAIT_MASQUERADE_VIOLATING_EYES, - "TRAIT_MASQUERADE_VIOLATING_FACE" = TRAIT_MASQUERADE_VIOLATING_FACE, + "TRAIT_MASQUERADE_VIOLATING_EYES" = TRAIT_MASQUERADE_VIOLATING_EYES, // DARKPACK EDIT ADD + "TRAIT_MASQUERADE_VIOLATING_FACE" = TRAIT_MASQUERADE_VIOLATING_FACE, // DARKPACK EDIT ADD "TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD, + "TRAIT_MEDICAL_HUD_SENSOR_ONLY" = TRAIT_MEDICAL_HUD_SENSOR_ONLY, "TRAIT_MESON_VISION" = TRAIT_MESON_VISION, "TRAIT_MIME_FAN" = TRAIT_MIME_FAN, "TRAIT_MIMING" = TRAIT_MIMING, @@ -446,6 +462,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NOMOBSWAP" = TRAIT_NOMOBSWAP, "TRAIT_HEAD_ATMOS_SEALED" = TRAIT_HEAD_ATMOS_SEALED, "TRAIT_NOSOFTCRIT" = TRAIT_NOSOFTCRIT, + "TRAIT_NO_OXYLOSS_PASSOUT" = TRAIT_NO_OXYLOSS_PASSOUT, "TRAIT_NO_AUGMENTS" = TRAIT_NO_AUGMENTS, "TRAIT_NO_BLOOD_OVERLAY" = TRAIT_NO_BLOOD_OVERLAY, "TRAIT_NO_BREATHLESS_DAMAGE" = TRAIT_NO_BREATHLESS_DAMAGE, @@ -475,9 +492,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NO_UNDERWEAR" = TRAIT_NO_UNDERWEAR, "TRAIT_NO_ZOMBIFY" = TRAIT_NO_ZOMBIFY, "TRAIT_HIPPOCRATIC_OATH" = TRAIT_HIPPOCRATIC_OATH, - "TRAIT_NON_INT" = TRAIT_NON_INT, + "TRAIT_NON_INT" = TRAIT_NON_INT, // DARKPACK EDIT ADD "TRAIT_NUKEIMMUNE" = TRAIT_NUKEIMMUNE, - "TRAIT_OBFUSCATED" = TRAIT_OBFUSCATED, + "TRAIT_OBFUSCATED" = TRAIT_OBFUSCATED, // DARKPACK EDIT ADD "TRAIT_OFF_BALANCE_TACKLER" = TRAIT_OFF_BALANCE_TACKLER, "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, "TRAIT_ORBITING_FORBIDDEN" = TRAIT_ORBITING_FORBIDDEN, @@ -485,14 +502,14 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_OVERWATCHED" = TRAIT_OVERWATCHED, "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, "TRAIT_PACIFISM" = TRAIT_PACIFISM, - "TRAIT_PAINFUL_VAMPIRE_KISS" = TRAIT_PAINFUL_VAMPIRE_KISS, + "TRAIT_PAINFUL_VAMPIRE_KISS" = TRAIT_PAINFUL_VAMPIRE_KISS, // DARKPACK EDIT ADD "TRAIT_PAPER_MASTER" = TRAIT_PAPER_MASTER, "TRAIT_PARALYSIS_L_ARM" = TRAIT_PARALYSIS_L_ARM, "TRAIT_PARALYSIS_L_LEG" = TRAIT_PARALYSIS_L_LEG, "TRAIT_PARALYSIS_R_ARM" = TRAIT_PARALYSIS_R_ARM, "TRAIT_PARALYSIS_R_LEG" = TRAIT_PARALYSIS_R_LEG, "TRAIT_PARROT_PERCHED" = TRAIT_PARROT_PERCHED, - "TRAIT_PASS_THROUGH_WALLS" = TRAIT_PASS_THROUGH_WALLS, + "TRAIT_PASS_THROUGH_WALLS" = TRAIT_PASS_THROUGH_WALLS, // DARKPACK EDIT ADD "TRAIT_PASSTABLE" = TRAIT_PASSTABLE, "TRAIT_PASSWINDOW" = TRAIT_PASSWINDOW, "TRAIT_PERCEIVED_AS_CLOWN" = TRAIT_PERCEIVED_AS_CLOWN, @@ -516,14 +533,16 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_QUICK_CARRY" = TRAIT_QUICK_CARRY, "TRAIT_RADIMMUNE" = TRAIT_RADIMMUNE, "TRAIT_RDS_SUPPRESSED" = TRAIT_RDS_SUPPRESSED, + "TRAIT_READY_TO_OPERATE" = TRAIT_READY_TO_OPERATE, "TRAIT_REAGENT_SCANNER" = TRAIT_REAGENT_SCANNER, "TRAIT_RECENTLY_BLOCKED_MAGIC" = TRAIT_RECENTLY_BLOCKED_MAGIC, "TRAIT_RECENTLY_TREATED" = TRAIT_RECENTLY_TREATED, + "TRAIT_REFLECTIVE_EYES" = TRAIT_REFLECTIVE_EYES, "TRAIT_REGEN_SHIELD" = TRAIT_REGEN_SHIELD, - "TRAIT_REJECTED_BY_TECHNOLOGY" = TRAIT_REJECTED_BY_TECHNOLOGY, + "TRAIT_REJECTED_BY_TECHNOLOGY" = TRAIT_REJECTED_BY_TECHNOLOGY, // DARKPACK EDIT ADD "TRAIT_RELAYING_ATTACKER" = TRAIT_RELAYING_ATTACKER, "TRAIT_REMOTE_TASTING" = TRAIT_REMOTE_TASTING, - "TRAIT_REPELLED_BY_HOLINESS" = TRAIT_REPELLED_BY_HOLINESS, + "TRAIT_REPELLED_BY_HOLINESS" = TRAIT_REPELLED_BY_HOLINESS, // DARKPACK EDIT ADD "TRAIT_RESEARCH_SCANNER" = TRAIT_RESEARCH_SCANNER, "TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD, "TRAIT_RESISTHEAT" = TRAIT_RESISTHEAT, @@ -540,13 +559,15 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ROCK_STONER" = TRAIT_ROCK_STONER, "TRAIT_ROD_SUPLEX" = TRAIT_ROD_SUPLEX, "TRAIT_ROUGHRIDER" = TRAIT_ROUGHRIDER, - "TRAIT_RUBICON" = TRAIT_RUBICON, + "TRAIT_RUBICON" = TRAIT_RUBICON, // DARKPACK EDIT ADD "TRAIT_SABRAGE_PRO" = TRAIT_SABRAGE_PRO, "TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD, + "TRAIT_SECURITY_HUD_ID_ONLY" = TRAIT_SECURITY_HUD_ID_ONLY, + "TRAIT_SEE_MASK_WHISPER" = TRAIT_SEE_MASK_WHISPER, "TRAIT_SEE_WORN_COLOURS" = TRAIT_SEE_WORN_COLOURS, "TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE, "TRAIT_SELF_SURGERY" = TRAIT_SELF_SURGERY, - "TRAIT_SENSITIVE_HUMANITY" = TRAIT_SENSITIVE_HUMANITY, + "TRAIT_SENSITIVE_HUMANITY" = TRAIT_SENSITIVE_HUMANITY, // DARKPACK EDIT ADD "TRAIT_SETTLER" = TRAIT_SETTLER, "TRAIT_SHAVED" = TRAIT_SHAVED, "TRAIT_SHELL_RETREATED" = TRAIT_SHELL_RETREATED, @@ -565,11 +586,12 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SNEAK" = TRAIT_SNEAK, "TRAIT_SNOB" = TRAIT_SNOB, "TRAIT_SOFTSPOKEN" = TRAIT_SOFTSPOKEN, - "TRAIT_SOOTHED_THROAT" = TRAIT_SOOTHED_THROAT, "TRAIT_SOOTHED_HEADACHE" = TRAIT_SOOTHED_HEADACHE, + "TRAIT_SOOTHED_THROAT" = TRAIT_SOOTHED_THROAT, "TRAIT_SOUND_DEBUGGED" = TRAIT_SOUND_DEBUGGED, "TRAIT_SPACEWALK" = TRAIT_SPACEWALK, "TRAIT_SPARRING" = TRAIT_SPARRING, + "TRAIT_SPAWNED_MOB" = TRAIT_SPAWNED_MOB, "TRAIT_SPEAKS_CLEARLY" = TRAIT_SPEAKS_CLEARLY, "TRAIT_SPECIAL_TRAUMA_BOOST" = TRAIT_SPECIAL_TRAUMA_BOOST, "TRAIT_SPELLS_LOTTERY" = TRAIT_SPELLS_LOTTERY, @@ -579,7 +601,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SPRAY_PAINTABLE" = TRAIT_SPRAY_PAINTABLE, "TRAIT_STABLEHEART" = TRAIT_STABLEHEART, "TRAIT_STABLELIVER" = TRAIT_STABLELIVER, - "TRAIT_STAKE_RESISTANT" = TRAIT_STAKE_RESISTANT, + "TRAIT_STAKE_RESISTANT" = TRAIT_STAKE_RESISTANT, // DARKPACK EDIT ADD + "TRAIT_STAKE_IMMUNE" = TRAIT_STAKE_IMMUNE, // DARKPACK EDIT ADD + "TRAIT_STAKED" = TRAIT_STAKED, // DARKPACK EDIT ADD "TRAIT_STASIS" = TRAIT_STASIS, "TRAIT_STIMMED" = TRAIT_STIMMED, "TRAIT_STIMULATED" = TRAIT_STIMULATED, @@ -592,7 +616,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SUCCUMB_OVERRIDE" = TRAIT_SUCCUMB_OVERRIDE, "TRAIT_SUICIDED" = TRAIT_SUICIDED, "TRAIT_SUPERMATTER_SOOTHER" = TRAIT_SUPERMATTER_SOOTHER, - "TRAIT_SURGEON" = TRAIT_SURGEON, "TRAIT_SURGICALLY_ANALYZED" = TRAIT_SURGICALLY_ANALYZED, "TRAIT_SWIMMER" = TRAIT_SWIMMER, "TRAIT_TACKLING_FRAIL_ATTACKER" = TRAIT_TACKLING_FRAIL_ATTACKER, @@ -611,8 +634,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_THROWINGARM" = TRAIT_THROWINGARM, "TRAIT_TIME_STOP_IMMUNE" = TRAIT_TIME_STOP_IMMUNE, "TRAIT_TOO_TALL" = TRAIT_TOO_TALL, - "TRAIT_TORPOR" = TRAIT_TORPOR, - "TRAIT_TOUGH_FLESH" = TRAIT_TOUGH_FLESH, + "TRAIT_TORPOR" = TRAIT_TORPOR, // DARKPACK EDIT ADD + "TRAIT_TOUGH_FLESH" = TRAIT_TOUGH_FLESH, // DARKPACK EDIT ADD "TRAIT_TOWER_OF_BABEL" = TRAIT_TOWER_OF_BABEL, "TRAIT_TOXIMMUNE" = TRAIT_TOXIMMUNE, "TRAIT_TOXINLOVER" = TRAIT_TOXINLOVER, @@ -620,8 +643,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_TUMOR_SUPPRESSED" = TRAIT_TUMOR_SUPPRESSED, "TRAIT_TUMOR_SUPPRESSION" = TRAIT_TUMOR_SUPPRESSED, "TRAIT_UI_BLOCKED" = TRAIT_UI_BLOCKED, - "TRAIT_UNAGING" = TRAIT_UNAGING, - "TRAIT_UNBONDABLE" = TRAIT_UNBONDABLE, + "TRAIT_UNAGING" = TRAIT_UNAGING, // DARKPACK EDIT ADD + "TRAIT_UNBONDABLE" = TRAIT_UNBONDABLE, // DARKPACK EDIT ADD "TRAIT_UNBREAKABLE" = TRAIT_UNBREAKABLE, "TRAIT_UNCONVERTABLE" = TRAIT_UNCONVERTABLE, "TRAIT_UNDENSE" = TRAIT_UNDENSE, @@ -629,7 +652,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_UNINTELLIGIBLE_SPEECH" = TRAIT_UNINTELLIGIBLE_SPEECH, "TRAIT_UNKNOWN_APPEARANCE" = TRAIT_UNKNOWN_APPEARANCE, "TRAIT_UNKNOWN_VOICE" = TRAIT_UNKNOWN_VOICE, - "TRAIT_UNMASQUERADE" = TRAIT_UNMASQUERADE, + "TRAIT_UNMASQUERADE" = TRAIT_UNMASQUERADE, // DARKPACK EDIT ADD "TRAIT_UNNATURAL_RED_GLOWY_EYES" = TRAIT_UNNATURAL_RED_GLOWY_EYES, "TRAIT_UNOBSERVANT" = TRAIT_UNOBSERVANT, "TRAIT_UNSTABLE" = TRAIT_UNSTABLE, @@ -641,13 +664,13 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_VENTCRAWLER_ALWAYS" = TRAIT_VENTCRAWLER_ALWAYS, "TRAIT_VENTCRAWLER_NUDE" = TRAIT_VENTCRAWLER_NUDE, "TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE, - "TRAIT_VIOLATOR" = TRAIT_VIOLATOR, + "TRAIT_VIOLATOR" = TRAIT_VIOLATOR, // DARKPACK EDIT ADD "TRAIT_VIRUS_RESISTANCE" = TRAIT_VIRUS_RESISTANCE, - "TRAIT_VITAE_ADDICTION" = TRAIT_VITAE_ADDICTION, + "TRAIT_VITAE_ADDICTION" = TRAIT_VITAE_ADDICTION, // DARKPACK EDIT ADD "TRAIT_VOICE_MATCHES_ID" = TRAIT_VOICE_MATCHES_ID, "TRAIT_VORACIOUS" = TRAIT_VORACIOUS, - "TRAIT_VTM_CLANS" = TRAIT_VTM_CLANS, - "TRAIT_VTM_MORALITY" = TRAIT_VTM_MORALITY, + "TRAIT_VTM_CLANS" = TRAIT_VTM_CLANS, // DARKPACK EDIT ADD + "TRAIT_VTM_MORALITY" = TRAIT_VTM_MORALITY, // DARKPACK EDIT ADD "TRAIT_WAS_EVOLVED" = TRAIT_WAS_EVOLVED, "TRAIT_WATER_ADAPTATION" = TRAIT_WATER_ADAPTATION, "TRAIT_WATER_HATER" = TRAIT_WATER_HATER, @@ -672,11 +695,31 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_INVISIBLE_TO_CAMERA" = TRAIT_INVISIBLE_TO_CAMERA, "TRAIT_LEFT_EYE_SCAR" = TRAIT_LEFT_EYE_SCAR, "TRAIT_RIGHT_EYE_SCAR" = TRAIT_RIGHT_EYE_SCAR, - "HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT" = HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT, + "TRAIT_BASIC_HEALTH_HUD_VISIBLE" = TRAIT_BASIC_HEALTH_HUD_VISIBLE, "TRAIT_PREVENT_BLINKING" = TRAIT_PREVENT_BLINKING, "TRAIT_PREVENT_BLINK_LOOPS" = TRAIT_PREVENT_BLINK_LOOPS, "TRAIT_NO_EYELIDS" = TRAIT_NO_EYELIDS, "TRAIT_CARPOTOXIN_IMMUNE" = TRAIT_CARPOTOXIN_IMMUNE, + "TRAIT_FAT_IGNORE_SLOWDOWN" = TRAIT_FAT_IGNORE_SLOWDOWN, + "TRAIT_SPACE_ANT_IMMUNITY" = TRAIT_SPACE_ANT_IMMUNITY, + "TRAIT_BRAIN_TRAUMA_IMMUNITY" = TRAIT_BRAIN_TRAUMA_IMMUNITY, + "TRAIT_BLUSH_OF_HEALTH" = TRAIT_BLUSH_OF_HEALTH, // DARKPACK EDIT ADD + "TRAIT_GHOST_VISION" = TRAIT_GHOST_VISION, // DARKPACK EDIT ADD - Necromancy + "TRAIT_COLD_AURA" = TRAIT_COLD_AURA, // DARKPACK EDIT ADD + "TRAIT_FRENETIC_AURA" = TRAIT_FRENETIC_AURA, // DARKPACK EDIT ADD + "TRAIT_THAUMATURGY_KNOWLEDGE" = TRAIT_THAUMATURGY_KNOWLEDGE, // DARKPACK EDIT ADD + "TRAIT_VICISSITUDE_KNOWLEDGE" = TRAIT_VICISSITUDE_KNOWLEDGE, // DARKPACK EDIT ADD + "TRAIT_MYSTICISM_KNOWLEDGE" = TRAIT_MYSTICISM_KNOWLEDGE, // DARKPACK EDIT ADD + "TRAIT_NECROMANCY_KNOWLEDGE" = TRAIT_NECROMANCY_KNOWLEDGE, // DARKPACK EDIT ADD + "TRAIT_WARM_AURA" = TRAIT_WARM_AURA, // DARKPACK EDIT ADD + "TRAIT_PASSDOOR" = TRAIT_PASSDOOR, // DARKPACK EDIT ADD + "TRAIT_TIMEWARPER" = TRAIT_TIMEWARPER, // DARKPACK EDIT ADD + "TRAIT_SILENCED" = TRAIT_SILENCED, // DARKPACK EDIT ADD - Quietus + "TRAIT_WEAK_TO_DOMINATE" = TRAIT_WEAK_TO_DOMINATE, // DARKPACK EDIT ADD - Dominate + "TRAIT_ILLEGAL_IDENTITY" = TRAIT_ILLEGAL_IDENTITY, // DARKPACK EDIT ADD - GOVERMENT + ), + /mob/living/carbon = list( + "TRAIT_BRAINLESS_CARBON" = TRAIT_BRAINLESS_CARBON, ), /mob/dead/observer = list( "TRAIT_NO_OBSERVE" = TRAIT_NO_OBSERVE, @@ -717,12 +760,14 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_OMNI_BAIT" = TRAIT_OMNI_BAIT, "TRAIT_PLANT_WILDMUTATE" = TRAIT_PLANT_WILDMUTATE, "TRAIT_POISONOUS_BAIT" = TRAIT_POISONOUS_BAIT, - "TRAIT_T_RAY_VISIBLE" = TRAIT_T_RAY_VISIBLE, + "TRAIT_SKIP_BASIC_REACH_CHECK" = TRAIT_SKIP_BASIC_REACH_CHECK, "TRAIT_TRANSFORM_ACTIVE" = TRAIT_TRANSFORM_ACTIVE, + "TRAIT_T_RAY_VISIBLE" = TRAIT_T_RAY_VISIBLE, "TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE, "TRAIT_UNCOMPOSTABLE" = TRAIT_UNCOMPOSTABLE, "TRAIT_UNIQUE_AQUARIUM_CONTENT" = TRAIT_UNIQUE_AQUARIUM_CONTENT, "TRAIT_WIELDED" = TRAIT_WIELDED, + "TRAIT_HERETIC_AURA_HIDDEN" = TRAIT_HERETIC_AURA_HIDDEN, ), /obj/item/ammo_casing = list( "TRAIT_DART_HAS_INSERT" = TRAIT_DART_HAS_INSERT, @@ -752,6 +797,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FISH_ELECTROGENESIS" = TRAIT_FISH_ELECTROGENESIS, "TRAIT_FISH_FED_LUBE" = TRAIT_FISH_FED_LUBE, "TRAIT_FISH_FLOPPING" = TRAIT_FISH_FLOPPING, + "TRAIT_FISH_GENEGUNNED" = TRAIT_FISH_GENEGUNNED, "TRAIT_FISH_INK_ON_COOLDOWN" = TRAIT_FISH_INK_ON_COOLDOWN, "TRAIT_FISH_LOW_PRICE" = TRAIT_FISH_LOW_PRICE, "TRAIT_FISH_MADE_OF_BONE" = TRAIT_FISH_MADE_OF_BONE, @@ -796,6 +842,10 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CLIENT_STARTING_ORGAN" = TRAIT_CLIENT_STARTING_ORGAN, "TRAIT_LIVING_HEART" = TRAIT_LIVING_HEART, "TRAIT_USED_ORGAN" = TRAIT_USED_ORGAN, + "TRAIT_ORGAN_OPERATED_ON" = TRAIT_ORGAN_OPERATED_ON, + ), + /obj/item/organ/brain = list( + "TRAIT_BRAIN_DAMAGE_NODEATH" = TRAIT_BRAIN_DAMAGE_NODEATH, ), /obj/item/organ/liver = list( "TRAIT_BALLMER_SCIENTIST" = TRAIT_BALLMER_SCIENTIST, @@ -824,6 +874,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_MECHA_DIAGNOSTIC_CREATED" = TRAIT_MECHA_DIAGNOSTIC_CREATED, ), /turf = list( + "TRAIT_AI_AVOID_TURF" = TRAIT_AI_AVOID_TURF, "TRAIT_CHASM_STOPPED" = TRAIT_CHASM_STOPPED, "TRAIT_CONTAINMENT_FIELD" = TRAIT_CONTAINMENT_FIELD, "TRAIT_ELEVATED_TURF" = TRAIT_ELEVATED_TURF, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 2e681d9c410a..be69d71d22e7 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -7,6 +7,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_CATCH_AND_RELEASE" = TRAIT_CATCH_AND_RELEASE, "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER, "TRAIT_UNHITTABLE_BY_PROJECTILES" = TRAIT_UNHITTABLE_BY_PROJECTILES, + "TRAIT_UNHITTABLE_BY_LASERS" = TRAIT_UNHITTABLE_BY_LASERS, ), /atom/movable = list( "TRAIT_ASHSTORM_IMMUNE" = TRAIT_ASHSTORM_IMMUNE, @@ -32,6 +33,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_SPEED_POTIONED" = TRAIT_SPEED_POTIONED, ), /mob = list( + "TRAIT_ABDUCTOR_HUD" = TRAIT_ABDUCTOR_HUD, "TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING, "TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING, "TRAIT_ACT_AS_CULTIST" = TRAIT_ACT_AS_CULTIST, @@ -55,22 +57,23 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_BEAST_EMPATHY" = TRAIT_BEAST_EMPATHY, "TRAIT_BLOB_ALLY" = TRAIT_BLOB_ALLY, "TRAIT_BLOCK_SHUTTLE_MOVEMENT" = TRAIT_BLOCK_SHUTTLE_MOVEMENT, - "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, "TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES, + "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, "TRAIT_BOMBIMMUNE" = TRAIT_BOMBIMMUNE, "TRAIT_BONSAI" = TRAIT_BONSAI, "TRAIT_BOOZE_SLIDER" = TRAIT_BOOZE_SLIDER, + "TRAIT_BOT_PATH_HUD" = TRAIT_BOT_PATH_HUD, "TRAIT_BYPASS_MEASURES" = TRAIT_BYPASS_MEASURES, + "TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED, + "TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, "TRAIT_CAN_HOLD_ITEMS" = TRAIT_CAN_HOLD_ITEMS, "TRAIT_CAN_STRIP" = TRAIT_CAN_STRIP, "TRAIT_CAN_THROW_ITEMS" = TRAIT_CAN_THROW_ITEMS, "TRAIT_CAN_USE_NUKE" = TRAIT_CAN_USE_NUKE, - "TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED, - "TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, "TRAIT_CATLIKE_GRACE" = TRAIT_CATLIKE_GRACE, "TRAIT_CHASM_DESTROYED" = TRAIT_CHASM_DESTROYED, - "TRAIT_CHUNKYFINGERS_IGNORE_BATON" = TRAIT_CHUNKYFINGERS_IGNORE_BATON, "TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS, + "TRAIT_CHUNKYFINGERS_IGNORE_BATON" = TRAIT_CHUNKYFINGERS_IGNORE_BATON, "TRAIT_CLEANBOT_WHISPERER" = TRAIT_CLEANBOT_WHISPERER, "TRAIT_CLIFF_WALKER" = TRAIT_CLIFF_WALKER, "TRAIT_CLOWN_ENJOYER" = TRAIT_CLOWN_ENJOYER, @@ -84,9 +87,9 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_DEAF" = TRAIT_DEAF, "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, "TRAIT_DEFIB_BLACKLISTED" = TRAIT_DEFIB_BLACKLISTED, + "TRAIT_DESENSITIZED" = TRAIT_DESENSITIZED, "TRAIT_DETECT_STORM" = TRAIT_DETECT_STORM, "TRAIT_DIAGNOSTIC_HUD" = TRAIT_DIAGNOSTIC_HUD, - "TRAIT_BOT_PATH_HUD" = TRAIT_BOT_PATH_HUD, "TRAIT_DISCOORDINATED_TOOL_USER" = TRAIT_DISCOORDINATED_TOOL_USER, "TRAIT_DISFIGURED" = TRAIT_DISFIGURED, "TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER, @@ -97,14 +100,13 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_EASILY_WOUNDED" = TRAIT_EASILY_WOUNDED, "TRAIT_EASYDISMEMBER" = TRAIT_EASYDISMEMBER, "TRAIT_EMOTEMUTE" = TRAIT_EMOTEMUTE, - "TRAIT_EMPATH" = TRAIT_EMPATH, "TRAIT_ENTRAILS_READER" = TRAIT_ENTRAILS_READER, + "TRAIT_EVIL" = TRAIT_EVIL, "TRAIT_EXAMINE_FISHING_SPOT" = TRAIT_EXAMINE_FISHING_SPOT, "TRAIT_EXAMINE_FITNESS" = TRAIT_EXAMINE_FITNESS, "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, "TRAIT_EXPERT_FISHER" = TRAIT_EXPERT_FISHER, "TRAIT_EXTROVERT" = TRAIT_EXTROVERT, - "TRAIT_EVIL" = TRAIT_EVIL, "TRAIT_FACE_COVERED" = TRAIT_FACE_COVERED, "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, "TRAIT_FASTMED" = TRAIT_FASTMED, @@ -152,6 +154,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, "TRAIT_IMMOBILIZED" = TRAIT_IMMOBILIZED, + "TRAIT_IN_FRENZY" = TRAIT_IN_FRENZY, "TRAIT_INCAPACITATED" = TRAIT_INCAPACITATED, "TRAIT_INTROVERT" = TRAIT_INTROVERT, "TRAIT_INVISIBLE_MAN" = TRAIT_INVISIBLE_MAN, @@ -167,10 +170,12 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, "TRAIT_LITERATE" = TRAIT_LITERATE, "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, + "TRAIT_LUMINESCENT_EYES" = TRAIT_LUMINESCENT_EYES, "TRAIT_MADNESS_IMMUNE" = TRAIT_MADNESS_IMMUNE, "TRAIT_MAGICALLY_GIFTED" = TRAIT_MAGICALLY_GIFTED, "TRAIT_MARTIAL_ARTS_IMMUNE" = TRAIT_MARTIAL_ARTS_IMMUNE, "TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD, + "TRAIT_MEDICAL_HUD_SENSOR_ONLY" = TRAIT_MEDICAL_HUD_SENSOR_ONLY, "TRAIT_MIME_FAN" = TRAIT_MIME_FAN, "TRAIT_MIMING" = TRAIT_MIMING, "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD, @@ -224,6 +229,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE, "TRAIT_NOMOBSWAP" = TRAIT_NOMOBSWAP, "TRAIT_NOSOFTCRIT" = TRAIT_NOSOFTCRIT, + "TRAIT_NO_OXYLOSS_PASSOUT" = TRAIT_NO_OXYLOSS_PASSOUT, "TRAIT_OFF_BALANCE_TACKLER" = TRAIT_OFF_BALANCE_TACKLER, "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, "TRAIT_OVERDOSEIMMUNE" = TRAIT_OVERDOSEIMMUNE, @@ -252,6 +258,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_QUICK_CARRY" = TRAIT_QUICK_CARRY, "TRAIT_QUICKER_CARRY" = TRAIT_QUICKER_CARRY, "TRAIT_RADIMMUNE" = TRAIT_RADIMMUNE, + "TRAIT_REFLECTIVE_EYES" = TRAIT_REFLECTIVE_EYES, "TRAIT_REMOTE_TASTING" = TRAIT_REMOTE_TASTING, "TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD, "TRAIT_RESISTHEAT" = TRAIT_RESISTHEAT, @@ -264,7 +271,9 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_ROD_SUPLEX" = TRAIT_ROD_SUPLEX, "TRAIT_ROUGHRIDER" = TRAIT_ROUGHRIDER, "TRAIT_SABRAGE_PRO" = TRAIT_SABRAGE_PRO, + "TRAIT_SEE_MASK_WHISPER" = TRAIT_SEE_MASK_WHISPER, "TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD, + "TRAIT_SECURITY_HUD_ID_ONLY" = TRAIT_SECURITY_HUD_ID_ONLY, "TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE, "TRAIT_SETTLER" = TRAIT_SETTLER, "TRAIT_SHIFTY_EYES" = TRAIT_SHIFTY_EYES, @@ -293,7 +302,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE, "TRAIT_STURDY_FRAME" = TRAIT_STURDY_FRAME, "TRAIT_SUPERMATTER_SOOTHER" = TRAIT_SUPERMATTER_SOOTHER, - "TRAIT_SURGEON" = TRAIT_SURGEON, "TRAIT_SWIMMER" = TRAIT_SWIMMER, "TRAIT_SURGICALLY_ANALYZED" = TRAIT_SURGICALLY_ANALYZED, "TRAIT_TACKLING_FRAIL_ATTACKER" = TRAIT_TACKLING_FRAIL_ATTACKER, @@ -346,6 +354,9 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_LEFT_EYE_SCAR" = TRAIT_LEFT_EYE_SCAR, "TRAIT_RIGHT_EYE_SCAR" = TRAIT_RIGHT_EYE_SCAR, "TRAIT_CARPOTOXIN_IMMUNE" = TRAIT_CARPOTOXIN_IMMUNE, + "TRAIT_THAUMATURGY_KNOWLEDGE" = TRAIT_THAUMATURGY_KNOWLEDGE, // DARKPACK EDIT ADD + "TRAIT_VICISSITUDE_KNOWLEDGE" = TRAIT_VICISSITUDE_KNOWLEDGE, // DARKPACK EDIT ADD + "TRAIT_MYSTICISM_KNOWLEDGE" = TRAIT_MYSTICISM_KNOWLEDGE, // DARKPACK EDIT ADD ), /obj/item = list( "TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING, diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 1f5c943d4544..394fe4cd206c 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -294,4 +294,4 @@ // /mob/living/silicon/ai/TurfAdjacent(turf/target_turf) - return (GLOB.cameranet && GLOB.cameranet.checkTurfVis(target_turf)) + return (SScameras.is_visible_by_cameras(target_turf)) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index e7918e92327a..8c15fc8affe7 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -163,7 +163,7 @@ UnarmedAttack(item_atom, TRUE, modifiers) //Standard reach turf to turf or reaching inside storage - if(CanReach(A,W)) + if(A.IsReachableBy(src, W?.reach)) if(W) W.melee_attack_chain(src, A, modifiers) else @@ -200,42 +200,81 @@ return FALSE /** - * A backwards depth-limited breadth-first-search to see if the target is - * logically "in" anything adjacent to us. + * Returns TRUE if a movable can "Reach" this atom. This is defined as adjacency + * + * Args: + * * user: The movable trying to reach us. + * * reacher_range: How far the reacher can reach. + * * depth: How deep nested inside of an atom contents stack an object can be. + * * direct_access: Do not override. Used for recursion. */ -/atom/proc/CanReach(atom/ultimate_target, obj/item/tool, view_only = FALSE) - var/list/direct_access = DirectAccess() - var/depth = 1 + (view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH) - - var/list/closed = list() - var/list/checking = list(ultimate_target) +/atom/proc/IsReachableBy(atom/movable/user, reacher_range = 1, depth = INFINITY, direct_access = user.DirectAccess()) + SHOULD_NOT_OVERRIDE(TRUE) - while (checking.len && depth > 0) - var/list/next = list() - --depth + if(isnull(user)) + return FALSE - for(var/atom/target in checking) // will filter out nulls - if(closed[target] || isarea(target)) // avoid infinity situations - continue + if(src in direct_access) + return TRUE - if(isturf(target) || isturf(target.loc) || (target in direct_access) || (ismovable(target) && target.flags_1 & IS_ONTOP_1) || target.loc?.atom_storage) //Directly accessible atoms - if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks - return TRUE + // This is a micro-opt, if any turf ever returns false from IsContainedAtomAccessible, change this. + if(isturf(loc) || isturf(src)) + if(CheckReachableAdjacency(user, reacher_range)) + return TRUE - closed[target] = TRUE + depth-- - if (!target.loc) - continue + if(depth <= 0) + return FALSE - if(target.loc.atom_storage) - next += target.loc + if(isnull(loc) || isarea(loc)) + return FALSE + if(!HAS_TRAIT(src, TRAIT_SKIP_BASIC_REACH_CHECK) && !loc.IsContainedAtomAccessible(src, user)) + return FALSE - checking = next + return loc.IsReachableBy(user, reacher_range, depth, direct_access) - if(SEND_SIGNAL(src, COMSIG_ATOM_CANREACH, ultimate_target) & COMPONENT_ALLOW_REACH) +/atom/proc/CheckReachableAdjacency(atom/movable/reacher, reacher_range) + if(reacher.Adjacent(src)) return TRUE - return FALSE + if(isliving(reacher)) + var/mob/living/living_reacher = reacher + if(living_reacher.reach_length > reacher_range) + reacher_range = living_reacher.reach_length + + return (reacher_range > 1) && RangedReachCheck(reacher, src, reacher_range) + +/// Called by IsReachableBy() to check for ranged reaches. +/proc/RangedReachCheck(atom/movable/here, atom/movable/there, reach) + if(!here || !there) + return FALSE + + if(reach <= 1) + return FALSE + + // Prevent infinite loop. + if(istype(here, /obj/effect/abstract/reach_checker)) + return FALSE + + var/obj/effect/abstract/reach_checker/dummy = new(get_turf(here)) + for(var/i in 1 to reach) //Limit it to that many tries + var/turf/T = get_step(dummy, get_dir(dummy, there)) + if(there.IsReachableBy(dummy)) + . = TRUE + break + + if(!dummy.Move(T)) //we're blocked! + break + + qdel(dummy) + +/// Returns TRUE if an atom contained within our contents is reachable. +/atom/proc/IsContainedAtomAccessible(atom/contained, atom/movable/user) + return TRUE + +/atom/movable/IsContainedAtomAccessible(atom/contained, atom/movable/user) + return !!atom_storage /atom/proc/DirectAccess() return list(src, loc) @@ -269,7 +308,7 @@ dummy.SetInvisibility(INVISIBILITY_ABSTRACT) for(var/i in 1 to reach) //Limit it to that many tries var/turf/T = get_step(dummy, get_dir(dummy, there)) - if(dummy.CanReach(there)) + if(there.IsReachableBy(dummy)) qdel(dummy) return TRUE if(!dummy.Move(T)) //we're blocked! diff --git a/code/_onclick/click_alt.dm b/code/_onclick/click_alt.dm index 32d6d3156732..9de205d116eb 100644 --- a/code/_onclick/click_alt.dm +++ b/code/_onclick/click_alt.dm @@ -127,8 +127,8 @@ return FALSE /// No loot panel if it's on our person - if(isobj(target) && (target in get_all_gear())) - to_chat(src, span_warning("You can't search for this item, it's already in your inventory! Take it off first.")) + if(isobj(target) && (target in get_all_gear(INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT|INCLUDE_ACCESSORIES))) + to_chat(src, span_warning("You can't search for this item, it's already in your inventory![!HAS_TRAIT(target, TRAIT_NODROP) ? " Take it off first." : ""]")) return FALSE client.loot_panel.open(get_turf(target)) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 8ec29c8af140..d90ffb54507e 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -85,7 +85,7 @@ return // cyborg rightclick code, allowing borgos to use weapons at range - if(CanReach(A,W)) + if(A.IsReachableBy(src, W?.reach)) W.melee_attack_chain(src, A, modifiers) return else if(isturf(A) || isturf(A.loc)) diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index aa23d5a57eaa..46d7cee82f9f 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -11,7 +11,8 @@ if(!usr || !over) return - var/proximity_check = usr.client.check_drag_proximity(src, over, src_location, over_location, src_control, over_control, params) + var/client/usrclient = GET_CLIENT(usr) + var/proximity_check = usrclient.check_drag_proximity(src, over, src_location, over_location, src_control, over_control, params) if(proximity_check) return proximity_check @@ -38,7 +39,7 @@ var/combined_atom_flags = interaction_flags_atom | over.interaction_flags_atom if(!(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_CHECKS)) //Check for adjacency - if(!(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_ADJACENT) && (!CanReach(user) || !over.CanReach(user))) + if(!(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_ADJACENT) && (!IsReachableBy(user) || !over.IsReachableBy(user))) return // should stop you from dragging through windows if(!(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_USABILITY)) diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 88508c11e476..5f28a772f619 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -268,7 +268,7 @@ /atom/movable/screen/button_palette desc = "Drag buttons to move them
Shift-click any button to reset it
Alt-click any button to begin binding it to a key
Alt-click this to reset all buttons" - icon = 'icons/hud/64x16_actions.dmi' + icon = 'modular_darkpack/master_files/icons/hud/64x16_actions.dmi' // DARKPACK EDIT CHANGE icon_state = "screen_gen_palette" screen_loc = ui_action_palette mouse_over_pointer = MOUSE_HAND_POINTER diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index cbb3d38ce3fb..968aa79f250d 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -12,13 +12,13 @@ *flicks are forwarded to master *override makes it so the alert is not replaced until cleared by a clear_alert with clear_override, and it's used for hallucinations. */ -/mob/proc/throw_alert(category, type, severity, obj/new_master, override = FALSE, timeout_override, no_anim = FALSE) +/mob/proc/throw_alert(category, type, severity, atom/new_master, override = FALSE, timeout_override, no_anim = FALSE) if(!category || QDELETED(src)) return var/datum/weakref/master_ref - if(isdatum(new_master)) + if(isatom(new_master)) master_ref = WEAKREF(new_master) var/atom/movable/screen/alert/thealert if(alerts[category]) @@ -51,18 +51,10 @@ thealert.owner = src if(new_master) - var/mutable_appearance/master_appearance = new(new_master) - master_appearance.appearance_flags = KEEP_TOGETHER - master_appearance.layer = FLOAT_LAYER - master_appearance.plane = FLOAT_PLANE - master_appearance.dir = SOUTH - master_appearance.pixel_x = new_master.base_pixel_x - master_appearance.pixel_y = new_master.base_pixel_y - master_appearance.pixel_z = new_master.base_pixel_z - thealert.add_overlay(strip_appearance_underlays(master_appearance)) - thealert.icon_state = "template" // We'll set the icon to the client's ui pref in reorganize_alerts() thealert.master_ref = master_ref - else + thealert.RegisterSignal(new_master, COMSIG_ATOM_UPDATE_APPEARANCE, TYPE_PROC_REF(/atom/movable/screen/alert, on_master_update_appearance)) + thealert.update_appearance() + else if(severity) thealert.icon_state = "[initial(thealert.icon_state)][severity]" thealert.severity = severity @@ -103,7 +95,7 @@ /atom/movable/screen/alert icon = 'icons/hud/screen_alert.dmi' - icon_state = "default" + icon_state = "template" name = "Alert" desc = "Something seems to have gone wrong with this alert, so report this bug please" mouse_opacity = MOUSE_OPACITY_ICON @@ -118,21 +110,86 @@ /// Boolean. If TRUE, the Click() proc will attempt to Click() on the master first if there is a master. var/click_master = TRUE + ///If set true, instead of using the default icon file for screen alerts, it will use the hud's ui style + var/use_user_hud_icon = FALSE + ///If set, this overlay will be added to the icon. + var/overlay_state + ///The file to fetch the overlay from + var/overlay_icon = 'icons/hud/screen_alert.dmi' + /atom/movable/screen/alert/Initialize(mapload, datum/hud/hud_owner) . = ..() + if(PERFORM_ALL_TESTS(focus_only/screen_alert_overlay) && overlay_state && !icon_exists(overlay_icon, overlay_state)) + stack_trace("overlay_state: \"[overlay_state || "null"]\" that couldn't be found overlay_icon: \"[overlay_icon || "null"]\"") if(clickable_glow) add_filter("clickglow", 2, outline_filter(color = COLOR_GOLD, size = 1)) mouse_over_pointer = MOUSE_HAND_POINTER + if(overlay_state) + update_appearance() /atom/movable/screen/alert/MouseEntered(location,control,params) . = ..() if(!QDELETED(src)) openToolTip(usr,src,params,title = name,content = desc,theme = alerttooltipstyle) - /atom/movable/screen/alert/MouseExited() closeToolTip(usr) +/atom/movable/screen/alert/proc/on_master_update_appearance(datum/source) + SIGNAL_HANDLER + update_appearance() + +/atom/movable/screen/alert/update_overlays() + . = ..() + var/atom/our_master = master_ref?.resolve() + if(istype(our_master) && !QDELETED(our_master)) + . += add_atom_icon(our_master) + if(overlay_state) + . += mutable_appearance(overlay_icon, overlay_state) + +///Returns a copy of the appearance of the atom, with its base pixel coordinates. Useful for overlays +/atom/movable/screen/alert/proc/add_atom_icon(atom/atom) + var/mutable_appearance/atom_appearance = new(atom) + atom_appearance.appearance_flags = KEEP_TOGETHER + atom_appearance.layer = FLOAT_LAYER + atom_appearance.plane = FLOAT_PLANE + atom_appearance.dir = SOUTH + atom_appearance.pixel_x = atom.base_pixel_x + atom_appearance.pixel_y = atom.base_pixel_y + atom_appearance.pixel_w = atom.base_pixel_w + atom_appearance.pixel_z = atom.base_pixel_z + return strip_appearance_underlays(atom_appearance) + +/atom/movable/screen/alert/Click(location, control, params) + SHOULD_CALL_PARENT(TRUE) + + ..() + if(!usr || !GET_CLIENT(usr) || usr != owner) + return FALSE + var/list/modifiers = params2list(params) + if(LAZYACCESS(modifiers, SHIFT_CLICK)) // screen objects don't do the normal Click() stuff so we'll cheat + to_chat(usr, boxed_message(jointext(examine(usr), "\n"))) + return FALSE + if(!click_master) + return TRUE + var/datum/our_master = master_ref?.resolve() + if(our_master) + return usr.client.Click(our_master, location, control, params) + + return TRUE + +/atom/movable/screen/alert/Destroy() + . = ..() + severity = 0 + master_ref = null + owner = null + screen_loc = "" + +/atom/movable/screen/alert/examine(mob/user) + return list( + span_boldnotice(name), + span_info(desc), + ) //Gas alerts // Gas alerts are continuously thrown/cleared by: @@ -203,26 +260,33 @@ name = "Bronchodilated" desc = "You feel like your lungs are larger than usual! You're taking deeper breaths!" icon_state = "bronchodilated" + use_user_hud_icon = TRUE + overlay_icon = 'icons/obj/medical/organs/organs.dmi' + overlay_state = "lungs" /atom/movable/screen/alert/bronchoconstricted name = "Bronchocontracted" desc = "You feel like your lungs are smaller than usual! You might need a higher pressure environment/internals to breathe!" - icon_state = "bronchoconstricted" + use_user_hud_icon = TRUE + overlay_state = "bronchoconstricted" /atom/movable/screen/alert/gross name = "Grossed out." desc = "That was kind of gross..." - icon_state = "gross" + use_user_hud_icon = TRUE + overlay_state = "gross" /atom/movable/screen/alert/verygross name = "Very grossed out." desc = "You're not feeling very well..." - icon_state = "gross2" + use_user_hud_icon = TRUE + overlay_state = "gross2" /atom/movable/screen/alert/disgusted name = "DISGUSTED" desc = "ABSOLUTELY DISGUSTIN'" - icon_state = "gross3" + use_user_hud_icon = TRUE + overlay_state = "gross3" /atom/movable/screen/alert/hot name = "Too Hot" @@ -247,13 +311,15 @@ /atom/movable/screen/alert/hypnosis name = "Hypnosis" desc = "Something's hypnotizing you, but you're not really sure about what." - icon_state = ALERT_HYPNOSIS + use_user_hud_icon = TRUE + overlay_state = "hypnosis" var/phrase /atom/movable/screen/alert/mind_control name = "Mind Control" desc = "Your mind has been hijacked! Click to view the mind control command." - icon_state = ALERT_MIND_CONTROL + use_user_hud_icon = TRUE + overlay_state = "mind_control" clickable_glow = TRUE var/command @@ -267,7 +333,8 @@ name = "Embedded Object" desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \ If you're feeling frisky, examine yourself and click the underlined item to pull the object out." - icon_state = ALERT_EMBEDDED_OBJECT + use_user_hud_icon = TRUE + overlay_state = "embeddedobject" clickable_glow = TRUE /atom/movable/screen/alert/embeddedobject/Click() @@ -281,25 +348,29 @@ /atom/movable/screen/alert/negative name = "Negative Gravity" desc = "You're getting pulled upwards. While you won't have to worry about falling down anymore, you may accidentally fall upwards!" - icon_state = "negative" + use_user_hud_icon = TRUE + overlay_state = "negative" /atom/movable/screen/alert/weightless name = "Weightless" desc = "Gravity has ceased affecting you, and you're floating around aimlessly. You'll need something large and heavy, like a \ -wall or lattice, to push yourself off if you want to move. A jetpack would enable free range of motion. A pair of \ -magboots would let you walk around normally on the floor. Barring those, you can throw things, use a fire extinguisher, \ -or shoot a gun to move around via Newton's 3rd Law of Motion." - icon_state = "weightless" + wall or lattice, to push yourself off if you want to move. A jetpack would enable free range of motion. A pair of \ + magboots would let you walk around normally on the floor. Barring those, you can throw things, use a fire extinguisher, \ + or shoot a gun to move around via Newton's 3rd Law of Motion." + use_user_hud_icon = TRUE + overlay_state = "weightless" /atom/movable/screen/alert/highgravity name = "High Gravity" desc = "You're getting crushed by high gravity, picking up items and movement will be slowed." - icon_state = "paralysis" + use_user_hud_icon = TRUE + overlay_state = "paralysis" /atom/movable/screen/alert/veryhighgravity name = "Crushing Gravity" desc = "You're getting crushed by high gravity, picking up items and movement will be slowed. You'll also accumulate brute damage!" - icon_state = "paralysis" + use_user_hud_icon = TRUE + overlay_state = "paralysis" /atom/movable/screen/alert/fire name = "On Fire" @@ -326,7 +397,8 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." return roller.resist_fire() /atom/movable/screen/alert/give // information set when the give alert is made - icon_state = "default" + icon_state = "template" + use_user_hud_icon = TRUE clickable_glow = TRUE /// The offer we're linked to, yes this is suspiciously like a status effect alert var/datum/status_effect/offering/offer @@ -497,7 +569,9 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." /atom/movable/screen/alert/succumb name = "Succumb" desc = "Shuffle off this mortal coil." - icon_state = ALERT_SUCCUMB + use_user_hud_icon = TRUE + overlay_icon = 'icons/mob/simple/mob.dmi' + overlay_state = "ghost" clickable_glow = TRUE var/static/list/death_titles = list( "Goodnight, Sweet Prince", @@ -857,6 +931,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." name = "Something interesting is happening!" desc = "This can be clicked on to perform an action." icon_state = "template" + use_user_hud_icon = TRUE timeout = 30 SECONDS clickable_glow = TRUE /// Weakref to the target atom to use the action on @@ -884,6 +959,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." /atom/movable/screen/alert/poll_alert name = "Looking for candidates" icon_state = "template" + use_user_hud_icon = TRUE timeout = 30 SECONDS ghost_screentips = TRUE /// If true you need to call START_PROCESSING manually @@ -1035,10 +1111,27 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." /atom/movable/screen/alert/buckled name = "Buckled" desc = "You've been buckled to something. Click the alert to unbuckle unless you're handcuffed." - icon_state = ALERT_BUCKLED + use_user_hud_icon = TRUE + overlay_state = "buckled" + click_master = FALSE clickable_glow = TRUE +/atom/movable/screen/alert/buckled/Click() + . = ..() + if(!.) + return + + var/mob/living/living_owner = owner + + if(!living_owner.can_resist()) + return + living_owner.changeNext_move(CLICK_CD_RESIST) + if(living_owner.last_special <= world.time) + return living_owner.resist_buckle() + /atom/movable/screen/alert/restrained + icon_state = "template" + use_user_hud_icon = TRUE clickable_glow = TRUE /atom/movable/screen/alert/restrained/handcuffed @@ -1065,28 +1158,10 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." if((living_owner.mobility_flags & MOBILITY_MOVE) && (living_owner.last_special <= world.time)) return living_owner.resist_restraints() -/atom/movable/screen/alert/buckled/Click() - . = ..() - if(!.) - return - - var/mob/living/living_owner = owner - - if(!living_owner.can_resist()) - return - living_owner.changeNext_move(CLICK_CD_RESIST) - if(living_owner.last_special <= world.time) - return living_owner.resist_buckle() - -/atom/movable/screen/alert/shoes/untied - name = "Untied Shoes" - desc = "Your shoes are untied! Click the alert or your shoes to tie them." - icon_state = ALERT_SHOES_KNOT - -/atom/movable/screen/alert/shoes/knotted - name = "Knotted Shoes" - desc = "Someone tied your shoelaces together! Click the alert or your shoes to undo the knot." - icon_state = ALERT_SHOES_KNOT +/atom/movable/screen/alert/shoes + use_user_hud_icon = TRUE + overlay_icon = /obj/item/clothing/shoes/sneakers::icon + overlay_state = /obj/item/clothing/shoes/sneakers::icon_state clickable_glow = TRUE /atom/movable/screen/alert/shoes/Click() @@ -1102,10 +1177,22 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." carbon_owner.changeNext_move(CLICK_CD_RESIST) carbon_owner.shoes.handle_tying(carbon_owner) +/atom/movable/screen/alert/shoes/untied + name = "Untied Shoes" + desc = "Your shoes are untied! Click the alert or your shoes to tie them." + use_user_hud_icon = TRUE + overlay_icon = /obj/item/clothing/shoes/sneakers::icon + overlay_state = /obj/item/clothing/shoes/sneakers::icon_state + +/atom/movable/screen/alert/shoes/knotted + name = "Knotted Shoes" + desc = "Someone tied your shoelaces together! Click the alert or your shoes to undo the knot." + /atom/movable/screen/alert/unpossess_object name = "Unpossess" desc = "You are possessing an object. Click this alert to unpossess it." - icon_state = "buckled" + use_user_hud_icon = TRUE + overlay_state = "buckled" clickable_glow = TRUE /atom/movable/screen/alert/unpossess_object/Click() @@ -1137,7 +1224,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." return TRUE for(var/i in 1 to length(alerts)) var/atom/movable/screen/alert/alert = alerts[alerts[i]] - if(alert.icon_state == "template") + if(alert.use_user_hud_icon) alert.icon = ui_style alert.screen_loc = get_ui_alert_placement(i) screenmob.client.screen |= alert @@ -1145,34 +1232,3 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." for(var/viewer in mymob.observers) reorganize_alerts(viewer) return TRUE - -/atom/movable/screen/alert/Click(location, control, params) - SHOULD_CALL_PARENT(TRUE) - - ..() - if(!usr || !usr.client) - return FALSE - if(usr != owner) - return FALSE - var/list/modifiers = params2list(params) - if(LAZYACCESS(modifiers, SHIFT_CLICK)) // screen objects don't do the normal Click() stuff so we'll cheat - to_chat(usr, boxed_message(jointext(examine(usr), "\n"))) - return FALSE - var/datum/our_master = master_ref?.resolve() - if(our_master && click_master) - return usr.client.Click(our_master, location, control, params) - - return TRUE - -/atom/movable/screen/alert/Destroy() - . = ..() - severity = 0 - master_ref = null - owner = null - screen_loc = "" - -/atom/movable/screen/alert/examine(mob/user) - return list( - span_boldnotice(name), - span_info(desc), - ) diff --git a/code/_onclick/hud/credits.dm b/code/_onclick/hud/credits.dm index 2ce3923c8874..44749e0e4a2e 100644 --- a/code/_onclick/hud/credits.dm +++ b/code/_onclick/hud/credits.dm @@ -1,7 +1,7 @@ -#define CREDIT_ROLL_SPEED 125 -#define CREDIT_SPAWN_SPEED 10 +#define CREDIT_ROLL_SPEED (12.5 SECONDS) +#define CREDIT_SPAWN_SPEED (1 SECONDS) #define CREDIT_ANIMATE_HEIGHT (14 * ICON_SIZE_Y) -#define CREDIT_EASE_DURATION 22 +#define CREDIT_EASE_DURATION (2.2 SECONDS) #define CREDITS_PATH "[global.config.directory]/contributors.dmi" /client/proc/RollCredits() @@ -37,7 +37,6 @@ screen_loc = "12,1" plane = SPLASHSCREEN_PLANE var/client/parent - var/matrix/target /atom/movable/screen/credit/Initialize(mapload, datum/hud/hud_owner, credited, client/P, icon/I) . = ..() @@ -47,11 +46,10 @@ maptext = MAPTEXT_PIXELLARI(credited) maptext_x = ICON_SIZE_X + 8 maptext_y = (ICON_SIZE_Y / 2) - 4 - maptext_width = ICON_SIZE_X * 3 + maptext_width = ICON_SIZE_X * 6 var/matrix/M = matrix(transform) M.Translate(0, CREDIT_ANIMATE_HEIGHT) animate(src, transform = M, time = CREDIT_ROLL_SPEED) - target = M animate(src, alpha = 255, time = CREDIT_EASE_DURATION, flags = ANIMATION_PARALLEL) addtimer(CALLBACK(src, PROC_REF(FadeOut)), CREDIT_ROLL_SPEED - CREDIT_EASE_DURATION) QDEL_IN(src, CREDIT_ROLL_SPEED) @@ -67,7 +65,7 @@ return ..() /atom/movable/screen/credit/proc/FadeOut() - animate(src, alpha = 0, transform = target, time = CREDIT_EASE_DURATION) + animate(src, alpha = 0, time = CREDIT_EASE_DURATION, flags = ANIMATION_PARALLEL) #undef CREDIT_ANIMATE_HEIGHT #undef CREDIT_EASE_DURATION diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index e26eb16f6ccc..ed01cf11d6bb 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -129,6 +129,11 @@ /atom/movable/screen/fullscreen/blind/cyborg show_when_dead = TRUE +/atom/movable/screen/fullscreen/blind/noflicker + icon_state = "blackimageoverlaystatic" + layer = BLIND_LAYER + plane = FULLSCREEN_PLANE + /atom/movable/screen/fullscreen/curse icon_state = "curse" layer = CURSE_LAYER diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 7d7d46c387f2..3ff5530952ad 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -6,6 +6,8 @@ // The default UI style is the first one in the list GLOBAL_LIST_INIT(available_ui_styles, list( + "World of Darkness" = 'modular_darkpack/master_files/icons/hud/screen_darkness_new.dmi', // DARKPACK EDIT ADD - Put at the top because it has almost full coverage now! + "Pentex-Knox" = 'modular_darkpack/master_files/icons/hud/screen_pentexknox.dmi', // DARKPACK EDIT ADD - Trasen-Knox logo with a Pentex logo "Midnight" = 'icons/hud/screen_midnight.dmi', "Retro" = 'icons/hud/screen_retro.dmi', "Plasmafire" = 'icons/hud/screen_plasmafire.dmi', @@ -13,10 +15,8 @@ GLOBAL_LIST_INIT(available_ui_styles, list( "Operative" = 'icons/hud/screen_operative.dmi', "Clockwork" = 'icons/hud/screen_clockwork.dmi', "Glass" = 'icons/hud/screen_glass.dmi', - "Trasen-Knox" = 'icons/hud/screen_trasenknox.dmi', - "Detective" = 'icons/hud/screen_detective.dmi', - "World of Darkness" = 'modular_darkpack/master_files/icons/hud/screen_darkness.dmi', // DARKPACK EDIT ADD - Put at the bottom as it has terrible coverage - "World of Darkness New" = 'modular_darkpack/master_files/icons/hud/screen_darkness_new.dmi', // DARKPACK EDIT ADD - Put at the bottom as it has terrible coverage + // "Trasen-Knox" = 'icons/hud/screen_trasenknox.dmi', // DARKPACK EDIT REMOVE - Pentex-Knox instead + "Detective" = 'icons/hud/screen_detective.dmi' )) /proc/ui_style2icon(ui_style) @@ -242,10 +242,13 @@ GLOBAL_LIST_INIT(available_ui_styles, list( throw_icon = null resist_icon = null QDEL_LIST(infodisplay) + open_containers = null healths = null stamina = null healthdoll = null + bloodpool_icon = null // DARKPACK EDIT ADD + zone_icon = null // DARKPACK EDIT ADD spacesuit = null hunger = null alien_plasma_display = null @@ -345,7 +348,8 @@ GLOBAL_LIST_INIT(available_ui_styles, list( screenmob.client.screen += infodisplay if(always_visible_inventory.len) screenmob.client.screen += always_visible_inventory - if(open_containers.len) + if(open_containers.len && screenmob == mymob) // Don't show open inventories to ghosts + list_clear_nulls(open_containers) screenmob.client.screen += open_containers screenmob.client.screen += toggle_palette @@ -408,6 +412,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( for(var/M in mymob.observers) show_hud(hud_version, M) else if (viewmob.hud_used) + viewmob.hide_other_mob_action_buttons(mymob) viewmob.hud_used.plane_masters_update() viewmob.show_other_mob_action_buttons(mymob) @@ -840,4 +845,4 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /datum/action_group/listed/refresh_actions() . = ..() - owner.palette_actions.refresh_actions() // We effect them, so we gotta refresh em + owner?.palette_actions.refresh_actions() // We effect them, so we gotta refresh em diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 3ccab614996d..7a8e6bc1cfd9 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -272,6 +272,14 @@ healthdoll = new /atom/movable/screen/healthdoll/human(null, src) infodisplay += healthdoll + // DARKPACK EDIT ADD START + bloodpool_icon = new /atom/movable/screen/bloodpool(null, src) + infodisplay += bloodpool_icon + + zone_icon = new /atom/movable/screen/zone_hud(null, src) + infodisplay += zone_icon + // DARKPACK EDIT ADD END + stamina = new /atom/movable/screen/stamina(null, src) infodisplay += stamina diff --git a/code/_onclick/hud/living.dm b/code/_onclick/hud/living.dm index 71e88d5357d8..93335c11b507 100644 --- a/code/_onclick/hud/living.dm +++ b/code/_onclick/hud/living.dm @@ -22,3 +22,14 @@ //mob health doll! assumes whatever sprite the mob is healthdoll = new /atom/movable/screen/healthdoll/living(null, src) infodisplay += healthdoll + + stamina = new /atom/movable/screen/stamina(null, src) + infodisplay += stamina + + // DARKPACK EDIT ADD START + bloodpool_icon = new /atom/movable/screen/bloodpool(null, src) + infodisplay += bloodpool_icon + + zone_icon = new /atom/movable/screen/zone_hud(null, src) + infodisplay += zone_icon + // DARKPACK EDIT ADD END diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm index 643a6c167bd5..d4e57cc82d41 100644 --- a/code/_onclick/hud/new_player.dm +++ b/code/_onclick/hud/new_player.dm @@ -2,6 +2,10 @@ #define SHUTTER_WAIT_DURATION 0.2 SECONDS /// Maximum number of station trait buttons we will display, please think hard before creating scenarios where there are more than this #define MAX_STATION_TRAIT_BUTTONS_VERTICAL 3 +#define TRAIT_BUTTON_Y_ORIGIN 397 +#define TRAIT_BUTTON_X_ORIGIN 233 +#define TRAIT_BUTTON_OFFSET 27 +#define SQUARE_VIEWPORT_OFFSET 64 /datum/hud/new_player ///Whether the menu is currently on the client's screen or not @@ -34,6 +38,10 @@ start_button.RegisterSignal(src, COMSIG_HUD_LOBBY_COLLAPSED, TYPE_PROC_REF(/atom/movable/screen/lobby, collapse_button)) start_button.RegisterSignal(src, COMSIG_HUD_LOBBY_EXPANDED, TYPE_PROC_REF(/atom/movable/screen/lobby, expand_button)) +/datum/hud/new_player/on_viewdata_update() + . = ..() + place_station_trait_buttons() + /// Load and then display the buttons for relevant station traits /datum/hud/new_player/proc/show_station_trait_buttons() if (!mymob?.client || mymob.client.interviewee || !length(GLOB.lobby_station_traits)) @@ -54,14 +62,17 @@ /// Display the buttosn for relevant station traits. /datum/hud/new_player/proc/place_station_trait_buttons() + SIGNAL_HANDLER if(hud_version != HUD_STYLE_STANDARD || !mymob?.client) return - var/y_offset = 397 - var/x_offset = 233 - var/y_button_offset = 27 - var/x_button_offset = -27 + var/y_offset = TRAIT_BUTTON_Y_ORIGIN + var/x_offset = TRAIT_BUTTON_X_ORIGIN + var/y_button_offset = TRAIT_BUTTON_OFFSET + var/x_button_offset = -TRAIT_BUTTON_OFFSET var/iteration = 0 + if(mymob.client.view == SQUARE_VIEWPORT_SIZE) + x_offset -= SQUARE_VIEWPORT_OFFSET for(var/trait in shown_station_trait_buttons) var/atom/movable/screen/lobby/button/sign_up/sign_up_button = shown_station_trait_buttons[trait] iteration++ @@ -69,7 +80,7 @@ mymob.client.screen |= sign_up_button if (iteration >= MAX_STATION_TRAIT_BUTTONS_VERTICAL) iteration = 0 - y_offset = 397 + y_offset = TRAIT_BUTTON_Y_ORIGIN x_offset += x_button_offset else y_offset += y_button_offset @@ -237,8 +248,6 @@ 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, datum/hud/hud_owner) . = ..() @@ -268,14 +277,16 @@ if(!.) return var/mob/dead/new_player/new_player = hud.mymob - ready = !ready - if(ready) + + // switch based on the user, if they aren't ready then we change them to ready, and vice versa + if(new_player.ready == PLAYER_NOT_READY) new_player.auto_deadmin_on_ready_or_latejoin() new_player.ready = PLAYER_READY_TO_PLAY base_icon_state = "ready" else new_player.ready = PLAYER_NOT_READY base_icon_state = "not_ready" + update_appearance(UPDATE_ICON) SEND_SIGNAL(hud, COMSIG_HUD_PLAYER_READY_TOGGLE) @@ -594,7 +605,7 @@ 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" + blip_icon_state += "_[new_player.is_ready_to_play() ? "" : "not_"]ready" else blip_icon_state += "_disabled" var/mutable_appearance/ready_blip = mutable_appearance(icon, blip_icon_state) @@ -688,30 +699,58 @@ ///Boolean on whether or not we should have our static overlay, so we 'turn' the TV off when collapsing. var/show_static = TRUE + ///Static mutable appearance of a job icon we're displaying on the TV for overflow job. + var/static/mutable_appearance/job_overlay /atom/movable/screen/lobby/new_player_info/Initialize(mapload, datum/hud/hud_owner) . = ..() START_PROCESSING(SSnewplayer_info, src) update_text() + + //only go if the station trait is selected, otherwise it'll show "Assistant" every round. + var/datum/station_trait/overflow_job_bureaucracy/overflow_job = locate() in SSstation.station_traits + if(overflow_job && isnull(job_overlay)) + var/icon/job_icon = get_job_hud_icon(SSjob.overflow_role) + if(isnull(job_icon)) + stack_trace("[SSjob.overflow_role::title] was selected as the Job Overflow but has no icon!") + else + job_icon.Scale(ICON_SIZE_X / 2, ICON_SIZE_X / 2) + job_overlay = mutable_appearance(job_icon, offset_spokesman = src, alpha = 120, layer = src.layer+0.02) + var/matrix/job_matrix = matrix() + job_matrix.Translate(6, 14) //this is completely arbitruary just what I thought looked good. + job_overlay.transform = job_matrix + update_appearance(UPDATE_ICON) /atom/movable/screen/lobby/new_player_info/Destroy() STOP_PROCESSING(SSnewplayer_info, src) return ..() +/atom/movable/screen/lobby/new_player_info/MouseEntered(location, control, params) + . = ..() + if(QDELETED(src) || isnull(job_overlay)) + return + openToolTip(usr, src, params, title = "[SSjob.overflow_role::title] overflow", content = "The overflow for the round has been set as [SSjob.overflow_role::title].") + +/atom/movable/screen/lobby/new_player_info/MouseExited() + closeToolTip(usr) + return ..() + /atom/movable/screen/lobby/new_player_info/update_icon_state() . = ..() icon_state = base_icon_state /atom/movable/screen/lobby/new_player_info/update_overlays() . = ..() - . += mutable_appearance(icon, "[base_icon_state]_overlay", layer = src.layer+0.03) + . += mutable_appearance(icon, "[base_icon_state]_overlay", layer = src.layer+0.01) if(!show_static) return . - . += mutable_appearance(icon, "static_base", alpha = 20, layer = src.layer+0.01) + if(job_overlay) + . += job_overlay + . += mutable_appearance(icon, "static_base", alpha = 20, layer = src.layer+0.03) //we have this in a separate file because `generate_icon_alpha_mask` puts lighting even on non-existent pixels, //giving the icon a weird background color. - var/mutable_appearance/scanline = mutable_appearance(generate_icon_alpha_mask('icons/hud/lobby/newplayer_scanline.dmi', "scanline"), alpha = 20, layer = src.layer+0.02) + var/mutable_appearance/scanline = mutable_appearance(generate_icon_alpha_mask('icons/hud/lobby/newplayer_scanline.dmi', "scanline"), alpha = 20, layer = src.layer+0.04) scanline.pixel_y = OVERLAY_X_DIFF scanline.pixel_x = OVERLAY_Y_DIFF . += scanline @@ -751,9 +790,6 @@ new_maptext = "[SSmapping.current_map.map_name]
\ [LAZYLEN(GLOB.clients)] player\s online
\ [ROUND_TIME()] in
" - var/datum/station_trait/overflow_job_bureaucracy/overflow = locate() in SSstation.station_traits - if(overflow) - new_maptext += "[overflow.chosen_job_name] overflow" new_maptext += "
" else var/time_remaining = SSticker.GetTimeLeft() @@ -781,3 +817,7 @@ #undef SHUTTER_MOVEMENT_DURATION #undef SHUTTER_WAIT_DURATION #undef MAX_STATION_TRAIT_BUTTONS_VERTICAL +#undef TRAIT_BUTTON_Y_ORIGIN +#undef TRAIT_BUTTON_X_ORIGIN +#undef TRAIT_BUTTON_OFFSET +#undef SQUARE_VIEWPORT_OFFSET diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index e71876ba1e56..d960724f75bf 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -429,7 +429,7 @@ GLOBAL_LIST_EMPTY(radial_menus) /// Can be provided to choices in radial menus if you want to provide more information /datum/radial_menu_choice /// Required -- what to display for this button - var/image + var/image/image /// If provided, this will be the name the radial slice hud button. This has priority over everything else. var/name diff --git a/code/_onclick/hud/rendering/plane_master_group.dm b/code/_onclick/hud/rendering/plane_master_group.dm index f55a4f7cf868..27c57ced0eea 100644 --- a/code/_onclick/hud/rendering/plane_master_group.dm +++ b/code/_onclick/hud/rendering/plane_master_group.dm @@ -116,6 +116,7 @@ if(!our_mob?.client?.prefs?.read_preference(/datum/preference/toggle/multiz_parallax)) use_scale = FALSE */ // DARKPACK EDIT REMOVAL END + use_scale = FALSE // DARKPACK EDIT -- we want multi-z parallax offsets to always be false // No offset? piss off if(!SSmapping.max_plane_offset) return diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 3b0878b9f0f2..2addd11a4929 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -1174,7 +1174,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/splash) if(!isliving(source)) return - maptext = FORMAT_BLOOD_LEVEL_HUD_MAPTEXT(source.blood_volume) + maptext = FORMAT_BLOOD_LEVEL_HUD_MAPTEXT(source.get_blood_volume()) #undef FORMAT_BLOOD_LEVEL_HUD_MAPTEXT diff --git a/code/_onclick/hud/voidwalkerhud.dm b/code/_onclick/hud/voidwalkerhud.dm index 736c29d626d8..7ba892f7d7a4 100644 --- a/code/_onclick/hud/voidwalkerhud.dm +++ b/code/_onclick/hud/voidwalkerhud.dm @@ -8,6 +8,11 @@ floor_change.screen_loc = ui_rest static_inventory += floor_change + resist_icon = new /atom/movable/screen/resist(null, src) + resist_icon.icon = ui_style + resist_icon.screen_loc = ui_voidwalker_left_of_hands + resist_icon.update_appearance() + action_intent = new /atom/movable/screen/combattoggle/flashy/voidwalker(null, src) action_intent.icon = ui_style static_inventory += action_intent @@ -51,7 +56,7 @@ /atom/movable/screen/vomit_jump name = "vomit tracker" icon = 'icons/hud/screen_voidwalker.dmi' - icon_state = "vomitjump" + icon_state = "template" /// So we can sort of loop through it var/index = 1 diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index c5ef9b3cfc68..3759c6b0f6af 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -108,7 +108,8 @@ * See: [/obj/item/proc/melee_attack_chain] */ /obj/item/proc/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) //do stuff before attackby! - if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, target, user, modifiers, attack_modifiers) & COMPONENT_CANCEL_ATTACK_CHAIN) + var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, target, user, modifiers, attack_modifiers) | SEND_SIGNAL(user, COMSIG_USER_PRE_ITEM_ATTACK, src, target, modifiers, attack_modifiers) + if(signal_result & COMPONENT_CANCEL_ATTACK_CHAIN) return TRUE return FALSE //return TRUE to avoid calling attackby after this proc does stuff @@ -124,7 +125,7 @@ * See: [/obj/item/proc/melee_attack_chain] */ /obj/item/proc/pre_attack_secondary(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) - var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK_SECONDARY, target, user, modifiers, attack_modifiers) + var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK_SECONDARY, target, user, modifiers, attack_modifiers) | SEND_SIGNAL(user, COMSIG_USER_PRE_ITEM_ATTACK_SECONDARY, src, target, modifiers, attack_modifiers) if(signal_result & COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -180,13 +181,18 @@ return attacking_item.attack_atom(src, user, modifiers, attack_modifiers) /mob/living/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - for(var/datum/surgery/operation as anything in surgeries) - if(IS_IN_INVALID_SURGICAL_POSITION(src, operation)) - continue - if(!(operation.surgery_flags & SURGERY_SELF_OPERABLE) && (user == src) && !HAS_TRAIT(user, TRAIT_SELF_SURGERY)) - continue - if(operation.next_step(user, modifiers)) - return ITEM_INTERACT_SUCCESS + if(user.combat_mode) + return NONE + + if(HAS_TRAIT(src, TRAIT_READY_TO_OPERATE)) + var/surgery_ret = user.perform_surgery(src, tool, LAZYACCESS(modifiers, RIGHT_CLICK)) + if(surgery_ret) + return surgery_ret + + if(src == user) + var/manual_cauterization = try_manual_cauterize(tool) + if(manual_cauterization & ITEM_INTERACT_ANY_BLOCKER) + return manual_cauterization return NONE @@ -295,6 +301,12 @@ return ATTACK_FAILED var/final_force = CALCULATE_FORCE(attacking_item, attack_modifiers) +// DARKPACK EDIT ADD START + if(isliving(user)) + var/mob/living/living_user = user + var/stat_multiplier = living_user.st_get_stat(STAT_MELEE) * 0.4 + final_force *= stat_multiplier +// DARKPACK EDIT ADD END if(final_force <= 0) return 0 @@ -332,11 +344,11 @@ ), ARMOR_MAX_BLOCK) var/final_force = CALCULATE_FORCE(attacking_item, attack_modifiers) - if(mob_biotypes & MOB_ROBOTIC) + if(mob_biotypes & (MOB_ROBOTIC|MOB_MINERAL|MOB_SKELETAL)) // this should probably check hit bodypart for humanoids final_force *= attacking_item.get_demolition_modifier(src) var/wounding = attacking_item.wound_bonus - if((attacking_item.item_flags & SURGICAL_TOOL) && !user.combat_mode && body_position == LYING_DOWN && (LAZYLEN(surgeries) > 0)) + if((attacking_item.item_flags & SURGICAL_TOOL) && !user.combat_mode && HAS_TRAIT(user, TRAIT_READY_TO_OPERATE)) wounding = CANT_WOUND if(user != src) @@ -420,7 +432,7 @@ if(!attacking_item.get_sharpness() && !HAS_TRAIT(src, TRAIT_HEAD_INJURY_BLOCKED) && attacking_item.damtype == BRUTE) if(prob(damage_done)) - adjustOrganLoss(ORGAN_SLOT_BRAIN, 20) + adjust_organ_loss(ORGAN_SLOT_BRAIN, 20) if(stat == CONSCIOUS) visible_message( span_danger("[src] is knocked senseless!"), @@ -431,7 +443,7 @@ if(prob(10)) gain_trauma(/datum/brain_trauma/mild/concussion) else - adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_done * 0.2) + adjust_organ_loss(ORGAN_SLOT_BRAIN, damage_done * 0.2) // rev deconversion through blunt trauma. // this can be signalized to the rev datum @@ -478,6 +490,11 @@ return clamp(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100 /mob/living/proc/send_item_attack_message(obj/item/weapon, mob/living/user, hit_area, def_zone) + if(SEND_SIGNAL(weapon, COMSIG_SEND_ITEM_ATTACK_MESSAGE_OBJECT, src, user) & SIGNAL_MESSAGE_MODIFIED) + return TRUE + if(SEND_SIGNAL(src, COMSIG_SEND_ITEM_ATTACK_MESSAGE_CARBON, weapon, user) & SIGNAL_MESSAGE_MODIFIED) + return TRUE + if(!weapon.force && !length(weapon.attack_verb_simple) && !length(weapon.attack_verb_continuous)) return diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index eab5f0a7cd9c..1cd89773c55a 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -175,7 +175,7 @@ * Called when a simple animal is unarmed attacking / clicking on this atom. */ /atom/proc/attack_animal(mob/user, list/modifiers) - SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_ANIMAL, user) + SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_ANIMAL, user, modifiers) /** * Called when a simple animal or basic mob right clicks an atom. @@ -235,7 +235,7 @@ return TRUE /atom/proc/attack_larva(mob/user, list/modifiers) - return + SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_LARVA, user, modifiers) /** * Called when an alien larva right clicks an atom. diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 240ab23f739c..4d1839fff409 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -157,10 +157,8 @@ var/list/_entries_by_type = list() entries_by_type = _entries_by_type - for(var/I in typesof(/datum/config_entry)) //typesof is faster in this case + for(var/I in valid_subtypesof(/datum/config_entry)) //typesof is faster in this case var/datum/config_entry/E = I - if(initial(E.abstract_type) == I) - continue E = new I var/esname = E.name var/datum/config_entry/test = _entries[esname] diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 6f0f12ed10bd..de0b295200a3 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -495,6 +495,15 @@ default = 6 min_val = -1 +/// Freebie quirk points. Can't go negative because we have no way of enforcing a person has a quirk before they join. +/datum/config_entry/number/default_quirk_points + default = 2 + min_val = 0 + +/// Max personalities you can have at once +/datum/config_entry/number/max_personalities + default = 5 + /** * A config that skews with the random spawners weights * If the value is lower than 1, it'll tend to even out the odds diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index b01611fbef75..f960e6f4d62a 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -181,9 +181,6 @@ /// allow votes to change map /datum/config_entry/flag/allow_vote_map -/// allow players to vote to re-do the map vote -/datum/config_entry/flag/allow_rock_the_vote - /// the number of times we allow players to rock the vote /datum/config_entry/number/max_rocking_votes default = 1 @@ -333,6 +330,9 @@ /datum/config_entry/string/githuburl default = "https://www.github.com/tgstation/tgstation" +/datum/config_entry/string/configurl + default = "https://github.com/tgstation-operations/server-config" + /datum/config_entry/string/discordbotcommandprefix default = "?" @@ -793,3 +793,7 @@ /datum/config_entry/flag/generate_assets_in_init default = FALSE + +/datum/config_entry/number/minimum_ascension_time + default = 0 // 1 minute + min_val = 0 diff --git a/code/controllers/configuration/entries/resources.dm b/code/controllers/configuration/entries/resources.dm index 1fb8a6237d45..591e1850f4de 100644 --- a/code/controllers/configuration/entries/resources.dm +++ b/code/controllers/configuration/entries/resources.dm @@ -28,3 +28,7 @@ if (str_var && str_var[length(str_var)] != "/") str_var += "/" return ..(str_var) + +/datum/config_entry/string/storage_cdn_iframe + protection = CONFIG_ENTRY_LOCKED + default = "https://tgstation.github.io/byond-client-storage/iframe.html" diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 9b5d3b745028..80a0c486fae1 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -390,11 +390,11 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie // Topological sorting algorithm end if(length(subsystems) != length(sorted_subsystems)) - var/list/circular_dependency = subsystems.Copy() - sorted_subsystems + var/list/circular_dependency = subsystems - sorted_subsystems var/list/debug_msg = list() var/list/usr_msg = list() for(var/datum/controller/subsystem/subsystem as anything in circular_dependency) - usr_msg += "[subsystem.name]" + usr_msg += subsystem.name var/list/datum/controller/subsystem/nodes = list(circular_dependency[1]) var/list/loop = list() @@ -610,10 +610,19 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie if ((SS.flags & (SS_TICKER|SS_BACKGROUND)) == SS_TICKER) tickersubsystems += SS // Timer subsystems aren't allowed to bunch up, so we offset them a bit - timer += world.tick_lag * rand(0, 1) + timer += TICKS2DS(rand(0, 1)) SS.next_fire = timer continue + // Now, we have to set starting next_fires for all our new non ticker kids + if(SS.init_stage == init_stage - 1 && (SS.runlevels & current_runlevel)) + // Give em a random offset so things don't clump up too bad + var/delay = SS.wait + if(SS.flags & SS_TICKER) + delay = TICKS2DS(delay) + // Gotta convert to ticks cause rand needs integers + SS.next_fire = world.time + TICKS2DS(rand(0, DS2TICKS(min(delay, 2 SECONDS)))) + var/ss_runlevels = SS.runlevels var/added_to_any = FALSE for(var/I in 1 to GLOB.bitflags.len) @@ -709,7 +718,11 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie //we only want to offset it if it's new and also behind if(SS.next_fire > world.time || (SS in old_subsystems)) continue - SS.next_fire = world.time + world.tick_lag * rand(0, DS2TICKS(min(SS.wait, 2 SECONDS))) + // If they're new, give em a random offset so things don't clump up too bad + var/delay = SS.wait + if(SS.flags & SS_TICKER) + delay = TICKS2DS(delay) + SS.next_fire = world.time + TICKS2DS(rand(0, DS2TICKS(min(delay, 2 SECONDS)))) subsystems_to_check = current_runlevel_subsystems else @@ -804,6 +817,8 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie if (SS_flags & SS_NO_FIRE) subsystemstocheck -= SS continue + // If we're keeping timing and running behind, + // fire at most 25% faster then normal to try and make up the gap without spamming if ((SS_flags & (SS_TICKER|SS_KEEP_TIMING)) == SS_KEEP_TIMING && SS.last_fire + (SS.wait * 0.75) > world.time) continue if (SS.postponed_fires >= 1) diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 527823701287..b991b73918da 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -325,7 +325,7 @@ SUBSYSTEM_DEF(air) currentrun.len-- if(!M) atmos_machinery -= M - if(M.process_atmos() == PROCESS_KILL) + if(M.process_atmos(wait * 0.1) == PROCESS_KILL) stop_processing_machine(M) if(MC_TICK_CHECK) return diff --git a/code/controllers/subsystem/ambience.dm b/code/controllers/subsystem/ambience.dm index 492780ce359c..f49604b058a5 100644 --- a/code/controllers/subsystem/ambience.dm +++ b/code/controllers/subsystem/ambience.dm @@ -54,16 +54,17 @@ SUBSYSTEM_DEF(ambience) ///Attempts to play an ambient sound to a mob, returning the cooldown in deciseconds /area/proc/play_ambience(mob/M, sound/override_sound, volume = 27) var/sound/new_sound = override_sound || pick(ambientsounds) - // DARKPACK EDIT ADD START - if(!new_sound) // Dont try to play a sound if we dont have any, required by darkpack as not every area has a sound. + if(!new_sound) // Dont try to play a sound if we dont have any. return 1 MINUTES - // DARKPACK EDIT ADD END /// volume modifier for ambience as set by the player in preferences. var/volume_modifier = (M.client?.prefs.read_preference(/datum/preference/numeric/volume/sound_ambience_volume))/100 new_sound = sound(new_sound, repeat = 0, wait = 0, volume = volume*volume_modifier, channel = CHANNEL_AMBIENCE) SEND_SOUND(M, new_sound) var/sound_length = SSsounds.get_sound_length(new_sound.file) + if(!sound_length) + // This will cause sounds to cut into eachother if the sound is longer then the min_ambience_cooldown + stack_trace("play_ambience failed to get soundlength from [new_sound] with a file of [new_sound.file].") return sound_length + rand(min_ambience_cooldown, max_ambience_cooldown) /datum/controller/subsystem/ambience/proc/remove_ambience_client(client/to_remove) diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index a0fda1858892..ed8f499beac3 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -160,6 +160,20 @@ SUBSYSTEM_DEF(blackbox) record_feedback("tally", "radio_usage", 1, "CTF green team") if(FREQ_CTF_YELLOW) record_feedback("tally", "radio_usage", 1, "CTF yellow team") + // DARKPACK EDIT ADD START + if(FREQ_POLICE) + record_feedback("tally", "radio_usage", 1, "police") + if(FREQ_CLINIC) + record_feedback("tally", "radio_usage", 1, "clinic") + if(FREQ_MILITARY) + record_feedback("tally", "radio_usage", 1, "military") + if(FREQ_CAMARILLA) + record_feedback("tally", "radio_usage", 1, "camarilla") + if(FREQ_ANARCH) + record_feedback("tally", "radio_usage", 1, "anarch") + if(FREQ_ENDRON) + record_feedback("tally", "radio_usage", 1, "endron") + // DARKPACK EDIT ADD END else record_feedback("tally", "radio_usage", 1, "other") @@ -327,7 +341,7 @@ Versioning first_death["role"] = null first_death["role"] = L.mind.assigned_role.title first_death["area"] = "[AREACOORD(L)]" - first_death["damage"] = "[L.getBruteLoss()]/[L.getFireLoss()]/[L.getToxLoss()]/[L.getOxyLoss()][L.getAggLoss()]" // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE + first_death["damage"] = "[L.get_brute_loss()]/[L.get_fire_loss()]/[L.get_tox_loss()]/[L.get_oxy_loss()][L.get_agg_loss()]" // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE first_death["last_words"] = L.last_words if(!SSdbcore.Connect()) @@ -344,13 +358,13 @@ Versioning "pod" = get_area_name(L, TRUE), "laname" = L.lastattacker, "lakey" = L.lastattackerckey, - "brute" = L.getBruteLoss(), - "fire" = L.getFireLoss(), + "brute" = L.get_brute_loss(), + "fire" = L.get_fire_loss(), "brain" = L.get_organ_loss(ORGAN_SLOT_BRAIN) || BRAIN_DAMAGE_DEATH, //get_organ_loss returns null without a brain but a value is required for this column - "oxy" = L.getOxyLoss(), - "tox" = L.getToxLoss(), - "aggravated" = L.getAggLoss(), // DARKPACK EDIT ADD - AGGRAVATED_DAMAGE - "stamina" = L.getStaminaLoss(), + "oxy" = L.get_oxy_loss(), + "tox" = L.get_tox_loss(), + "aggravated" = L.get_agg_loss(), // DARKPACK EDIT ADD - AGGRAVATED_DAMAGE + "stamina" = L.get_stamina_loss(), "x_coord" = L.x, "y_coord" = L.y, "z_coord" = L.z, diff --git a/code/controllers/subsystem/cameras.dm b/code/controllers/subsystem/cameras.dm new file mode 100644 index 000000000000..5f5e9a2ec1b2 --- /dev/null +++ b/code/controllers/subsystem/cameras.dm @@ -0,0 +1,296 @@ +/// Manages the security cameras and camera chunks +SUBSYSTEM_DEF(cameras) + name = "Cameras" + flags = SS_BACKGROUND + priority = FIRE_PRIORITY_CAMERAS + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + wait = 2 MINUTES + dependencies = list( + // Required to get plane offset for static images + /datum/controller/subsystem/mapping, + ) + + /// The cameras on the map, no matter if they work or not. + /// Updated in obj/machinery/camera.dm in Initialize() and Destroy(). + var/list/obj/machinery/camera/cameras = list() + /// The chunks of the map, mapping the areas that the cameras can see. + var/list/chunks = list() + /// Chunks that must be updated + var/list/chunks_to_update = list() + /// List of images cloned by all chunk static images put onto turfs cameras cant see + /// Indexed by the plane offset to use + var/list/image/obscured_images = list() + /// Primarily for debugging, outright prevents all camera chunk updates + var/disable_camera_updates = FALSE + /// Tracks current subsystem run + var/list/current_run = list() + +/datum/controller/subsystem/cameras/Initialize() + update_offsets(SSmapping.max_plane_offset) + RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(on_offset_growth)) + return SS_INIT_SUCCESS + +/datum/controller/subsystem/cameras/fire(resumed = FALSE) + if(!resumed) + src.current_run = chunks_to_update.Copy() + chunks_to_update = list() + + var/list/current_run = src.current_run + while(current_run.len) + var/datum/camerachunk/chunk = current_run[current_run.len] + chunk.force_update(only_if_necessary = TRUE) // Forces an update if necessary + current_run.len-- + if(MC_TICK_CHECK) + break + +/datum/controller/subsystem/cameras/stat_entry(msg) + msg = "Cams: [length(cameras)] | Chunks: [length(chunks)] | Updating: [length(chunks_to_update)]" + return ..() + +/// Updates the images for new plane offsets +/datum/controller/subsystem/cameras/proc/update_offsets(new_offset) + for(var/i in length(obscured_images) to new_offset) + var/image/obscured = new('icons/effects/cameravis.dmi') + SET_PLANE_W_SCALAR(obscured, CAMERA_STATIC_PLANE, i) + obscured.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR | KEEP_APART + obscured.override = TRUE + obscured_images += obscured + +/datum/controller/subsystem/cameras/proc/on_offset_growth(datum/source, old_offset, new_offset) + SIGNAL_HANDLER + update_offsets(new_offset) + +/// Checks if a chunk has been generated in x, y, z. +/datum/controller/subsystem/cameras/proc/get_camera_chunk(x, y, z) + x = GET_CHUNK_COORD(x) + y = GET_CHUNK_COORD(y) + if(GET_LOWEST_STACK_OFFSET(z) != 0) + var/turf/lowest = get_lowest_turf(locate(x, y, z)) + return chunks["[x],[y],[lowest.z]"] + + return chunks["[x],[y],[z]"] + +// Returns the chunk in the x, y, z. +// If there is no chunk, it creates a new chunk and returns that. +/datum/controller/subsystem/cameras/proc/generate_chunk(x, y, z) + x = GET_CHUNK_COORD(x) + y = GET_CHUNK_COORD(y) + var/turf/lowest = get_lowest_turf(locate(x, y, z)) + var/key = "[x],[y],[lowest.z]" + . = chunks[key] + if(!.) + . = new /datum/camerachunk(x, y, lowest.z) + chunks[key] = . + +/// Updates what the camera eye can see. +/// It is recommended you use this when a camera eye moves or its location is set. +/datum/controller/subsystem/cameras/proc/update_eye_chunk(mob/eye/camera/eye) + var/list/visibleChunks = list() + //Get the eye's turf in case its located in an object like a mecha + var/turf/eye_turf = get_turf(eye) + if(eye.loc) + var/static_range = eye.static_visibility_range + var/x1 = max(1, eye_turf.x - static_range) + var/y1 = max(1, eye_turf.y - static_range) + var/x2 = min(world.maxx, eye_turf.x + static_range) + var/y2 = min(world.maxy, eye_turf.y + static_range) + + for(var/x = x1; x <= x2; x += CHUNK_SIZE) + for(var/y = y1; y <= y2; y += CHUNK_SIZE) + visibleChunks |= generate_chunk(x, y, eye_turf.z) + + var/list/remove = eye.visibleCameraChunks - visibleChunks + var/list/add = visibleChunks - eye.visibleCameraChunks + + for(var/datum/camerachunk/chunk as anything in remove) + chunk.remove(eye) + + for(var/datum/camerachunk/chunk as anything in add) + chunk.add(eye) + +/// Used in [/proc/major_chunk_change] - indicates the camera should be removed from the chunk list. +#define REMOVE_CAMERA 0 +/// Used in [/proc/major_chunk_change] - indicates the camera should be added to the chunk list. +#define ADD_CAMERA 1 +/// Used in [/proc/major_chunk_change] - indicates the chunk should be updated without adding/removing a camera. +#define IGNORE_CAMERA 2 + +/// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. +/datum/controller/subsystem/cameras/proc/update_visibility(atom/relevant_atom) + if(!SSticker) + return + major_chunk_change(relevant_atom, IGNORE_CAMERA) + +/// Removes a camera from a chunk. +/datum/controller/subsystem/cameras/proc/remove_camera_from_chunk(obj/machinery/camera/old_cam) + major_chunk_change(old_cam, REMOVE_CAMERA) + +/// Add a camera to a chunk. +/datum/controller/subsystem/cameras/proc/add_camera_to_chunk(obj/machinery/camera/new_cam) + if(new_cam.can_use()) + major_chunk_change(new_cam, ADD_CAMERA) + +/** + * Used for Cyborg/mecha cameras. Since portable cameras can be in ANY chunk. + * update_delay_buffer is passed all the way to queue_update() from their camera updates on movement + * to change the time between static updates. +*/ +/datum/controller/subsystem/cameras/proc/update_portable_camera(obj/machinery/camera/updating_camera, update_delay_buffer) + if(updating_camera.can_use()) + major_chunk_change(updating_camera, ADD_CAMERA, update_delay_buffer) + +/** + * Never access this proc directly!!!! + * This will update the chunk and all the surrounding chunks. + * It will also add the atom to the cameras list if you set the choice to 1. + * Setting the choice to 0 will remove the camera from the chunks. + * If you want to update the chunks around an object, without adding/removing a camera, use choice 2. + * update_delay_buffer is passed all the way to queue_update() from portable camera updates on movement + * to change the time between static updates. + */ +/datum/controller/subsystem/cameras/proc/major_chunk_change(atom/center_or_camera, choice = IGNORE_CAMERA, update_delay_buffer = 0) + PROTECTED_PROC(TRUE) + + if(QDELETED(center_or_camera) && choice == ADD_CAMERA) + CRASH("Tried to add a qdeleting camera to the net") + + var/turf/chunk_turf = get_turf(center_or_camera) + if(isnull(chunk_turf)) + return + + var/x1 = max(1, chunk_turf.x - (CHUNK_SIZE / 2)) + var/y1 = max(1, chunk_turf.y - (CHUNK_SIZE / 2)) + var/x2 = min(world.maxx, chunk_turf.x + (CHUNK_SIZE / 2)) + var/y2 = min(world.maxy, chunk_turf.y + (CHUNK_SIZE / 2)) + for(var/x = x1; x <= x2; x += CHUNK_SIZE) + for(var/y = y1; y <= y2; y += CHUNK_SIZE) + var/datum/camerachunk/chunk = get_camera_chunk(x, y, chunk_turf.z) + if(isnull(chunk)) + continue + if(choice == REMOVE_CAMERA) + // Remove the camera. + chunk.cameras[chunk_turf.z] -= center_or_camera + if(choice == ADD_CAMERA) + // You can't have the same camera in the list twice. + chunk.cameras[chunk_turf.z] |= center_or_camera + chunk.queue_update(center_or_camera, update_delay_buffer) + +/// A faster, turf only version of [/datum/controller/subsystem/cameras/proc/major_chunk_change] +/// For use in sensitive code, be careful with it +/datum/controller/subsystem/cameras/proc/bare_major_chunk_change(turf/changed) + var/x1 = max(1, changed.x - (CHUNK_SIZE / 2)) + var/y1 = max(1, changed.y - (CHUNK_SIZE / 2)) + var/x2 = min(world.maxx, changed.x + (CHUNK_SIZE / 2)) + var/y2 = min(world.maxy, changed.y + (CHUNK_SIZE / 2)) + for(var/x = x1; x <= x2; x += CHUNK_SIZE) + for(var/y = y1; y <= y2; y += CHUNK_SIZE) + var/datum/camerachunk/chunk = get_camera_chunk(x, y, changed.z) + chunk?.queue_update(changed, 0) + +/// Will check if an atom is on a viewable turf. +/// Returns TRUE if the atom is visible by any camera, FALSE otherwise. +/datum/controller/subsystem/cameras/proc/is_visible_by_cameras(atom/target) + return turf_visible_by_cameras(get_turf(target)) + +/// Checks if the passed turf is visible by any camera. +/// Returns TRUE if the turf is visible by any camera, FALSE otherwise. +/datum/controller/subsystem/cameras/proc/turf_visible_by_cameras(turf/position) + PRIVATE_PROC(TRUE) + if(isnull(position)) + return FALSE + var/datum/camerachunk/chunk = generate_chunk(position.x, position.y, position.z) + if(isnull(chunk)) + return FALSE + chunk.force_update(only_if_necessary = TRUE) // Update NOW if necessary + if(chunk.visibleTurfs[position]) + return TRUE + return FALSE + +/// Gets the camera chunk the passed turf is in. +/// Returns the chunk if it exists and is visible, null otherwise. +/datum/controller/subsystem/cameras/proc/get_turf_camera_chunk(turf/position) + RETURN_TYPE(/datum/camerachunk) + var/datum/camerachunk/chunk = generate_chunk(position.x, position.y, position.z) + if(!chunk) + return null + chunk.force_update(only_if_necessary = TRUE) // Update NOW if necessary + if(chunk.visibleTurfs[position]) + return chunk + return null + +/// Returns list of available cameras, ready to use for UIs displaying list of them +/// The format is: list("name" = "camera.c_tag", ref = REF(camera)) +/datum/controller/subsystem/cameras/proc/get_available_cameras_data(list/networks_available, list/z_levels_available) + var/list/available_cameras_data = list() + for(var/obj/machinery/camera/camera as anything in get_filtered_and_sorted_cameras(networks_available, z_levels_available)) + available_cameras_data += list(list( + name = camera.c_tag, + ref = REF(camera), + )) + + return available_cameras_data + +/** + * get_available_camera_by_tag_list + * + * Builds a list of all available cameras that can be seen to networks_available and in z_levels_available. + * Entries are stored in `c_tag[camera.can_use() ? null : " (Deactivated)"]` => `camera` format + * Args: + * networks_available - List of networks that we use to see which cameras are visible to it. + * z_levels_available - List of z levels to filter camera by. If empty, all z levels are considered valid. + * sort_by_ctag - If the resulting list should be sorted by `c_tag`. + */ +/datum/controller/subsystem/cameras/proc/get_available_camera_by_tag_list(list/networks_available, list/z_levels_available) + var/list/available_cameras_by_tag = list() + for(var/obj/machinery/camera/camera as anything in get_filtered_and_sorted_cameras(networks_available, z_levels_available)) + available_cameras_by_tag["[camera.c_tag][camera.can_use() ? null : " (Deactivated)"]"] = camera + + return available_cameras_by_tag + +/// Returns list of all cameras that passed `is_camera_available` filter and sorted by `cmp_camera_ctag_asc` +/datum/controller/subsystem/cameras/proc/get_filtered_and_sorted_cameras(list/networks_available, list/z_levels_available) + PRIVATE_PROC(TRUE) + + var/list/filtered_cameras = list() + for(var/obj/machinery/camera/camera as anything in cameras) + if(!is_camera_available(camera, networks_available, z_levels_available)) + continue + + filtered_cameras += camera + + return sortTim(filtered_cameras, GLOBAL_PROC_REF(cmp_camera_ctag_asc)) + +/// Checks if the `camera_to_check` meets the requirements of availability. +/datum/controller/subsystem/cameras/proc/is_camera_available(obj/machinery/camera/camera_to_check, list/networks_available, list/z_levels_available) + PRIVATE_PROC(TRUE) + + if(!camera_to_check.c_tag) + return FALSE + + if(length(z_levels_available) && !(camera_to_check.z in z_levels_available)) + return FALSE + + return length(camera_to_check.network & networks_available) > 0 + +#undef ADD_CAMERA +#undef REMOVE_CAMERA +#undef IGNORE_CAMERA + +/obj/effect/overlay/camera_static + name = "static" + icon = null + icon_state = null + anchored = TRUE // should only appear in vis_contents, but to be safe + appearance_flags = RESET_TRANSFORM | TILE_BOUND | LONG_GLIDE + // this combination makes the static block clicks to everything below it, + // without appearing in the right-click menu for non-AI clients + mouse_opacity = MOUSE_OPACITY_ICON + invisibility = INVISIBILITY_ABSTRACT + + plane = CAMERA_STATIC_PLANE + +ADMIN_VERB(pause_camera_updates, R_ADMIN, "Toggle Camera Updates", "Stop security cameras from updating, meaning what they see now is what they will see forever.", ADMIN_CATEGORY_DEBUG) + SScameras.disable_camera_updates = !SScameras.disable_camera_updates + log_admin("[key_name_admin(user)] [SScameras.disable_camera_updates ? "disabled" : "enabled"] camera updates.") + message_admins("Admin [key_name_admin(user)] has [SScameras.disable_camera_updates ? "disabled" : "enabled"] camera updates.") + BLACKBOX_LOG_ADMIN_VERB("Toggle Camera Updates") diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index e1a43605613a..17b2bf737ddd 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -182,11 +182,12 @@ SUBSYSTEM_DEF(dbcore) /datum/controller/subsystem/dbcore/Shutdown() shutting_down = TRUE - var/msg = "Clearing DB queries standby:[length(queries_standby)] active: [length(queries_active)] all: [length(all_queries)]" - to_chat(world, span_boldannounce(msg)) - log_world(msg) + var/initial_msg = "Clearing DB Queries. (Standby: [length(queries_standby)]; Active: [length(queries_active)]; All: [length(all_queries)])" + to_chat(world, span_boldannounce(initial_msg)) + log_world(initial_msg) + var/start_time = REALTIMEOFDAY //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 - var/endtime = REALTIMEOFDAY + SHUTDOWN_QUERY_TIMELIMIT + var/end_time = start_time + SHUTDOWN_QUERY_TIMELIMIT if(SSdbcore.Connect()) //Take over control of all active queries var/queries_to_check = queries_active.Copy() @@ -200,7 +201,7 @@ SUBSYSTEM_DEF(dbcore) //wait for them all to finish for(var/datum/db_query/query in queries_to_check) - UNTIL(query.process() || REALTIMEOFDAY > endtime) + UNTIL(query.process() || REALTIMEOFDAY > end_time) //log shutdown to the db var/datum/db_query/query_round_shutdown = SSdbcore.NewQuery( @@ -211,9 +212,9 @@ SUBSYSTEM_DEF(dbcore) query_round_shutdown.Execute(FALSE) qdel(query_round_shutdown) - msg = "Done clearing DB queries standby:[length(queries_standby)] active: [length(queries_active)] all: [length(all_queries)]" - to_chat(world, span_boldannounce(msg)) - log_world(msg) + var/completed_message = "Done clearing DB queries in [DisplayTimeText(REALTIMEOFDAY - start_time)] (Standby: [length(queries_standby)]; Active: [length(queries_active)]; All: [length(all_queries)])]" + to_chat(world, span_boldannounce(completed_message)) + log_world(completed_message) if(IsConnected()) Disconnect() stop_db_daemon() @@ -334,6 +335,8 @@ SUBSYSTEM_DEF(dbcore) GLOB.round_id = "[query_round_initialize.last_insert_id]" qdel(query_round_initialize) + log_world("Round ID: [GLOB.round_id]") + /datum/controller/subsystem/dbcore/proc/SetRoundStart() if(!Connect()) return diff --git a/code/controllers/subsystem/discord.dm b/code/controllers/subsystem/discord.dm index 2e7936f17e3a..2313a1a0a289 100644 --- a/code/controllers/subsystem/discord.dm +++ b/code/controllers/subsystem/discord.dm @@ -154,7 +154,7 @@ SUBSYSTEM_DEF(discord) // While there's a collision in the token, generate a new one (should rarely happen) while(not_unique) //Column is varchar 100, so we trim just in case someone does us the dirty later - one_time_token = trim("[pick(GLOB.most_common_words)]-[pick(GLOB.most_common_words)]-[pick(GLOB.most_common_words)]-[pick(GLOB.most_common_words)]-[pick(GLOB.most_common_words)]-[pick(GLOB.most_common_words)]", 100) + one_time_token = trim("[pick(GLOB.most_common_words_alphabetical)]-[pick(GLOB.most_common_words_alphabetical)]-[pick(GLOB.most_common_words_alphabetical)]-[pick(GLOB.most_common_words_alphabetical)]-[pick(GLOB.most_common_words_alphabetical)]-[pick(GLOB.most_common_words_alphabetical)]", 100) not_unique = find_discord_link_by_token(one_time_token, timebound = TRUE) diff --git a/code/controllers/subsystem/dynamic/__dynamic_defines.dm b/code/controllers/subsystem/dynamic/__dynamic_defines.dm index f24c772fa24b..500666dcd14a 100644 --- a/code/controllers/subsystem/dynamic/__dynamic_defines.dm +++ b/code/controllers/subsystem/dynamic/__dynamic_defines.dm @@ -43,6 +43,9 @@ /// Ruleset can be configured by admins (implements /proc/configure_ruleset) /// Only implemented for midrounds currently #define RULESET_ADMIN_CONFIGURABLE (1<<2) +/// Applied to rulesets which intentionally share a pref_flag with another rulesets +/// Denotes multiple rulesets which abide by the same preference, but are each a variation of some base ruleset +#define RULESET_VARIATION (1<<3) /// Href for cancelling midround rulesets before execution #define MIDROUND_CANCEL_HREF(...) "(CANCEL)" diff --git a/code/controllers/subsystem/dynamic/_dynamic_ruleset.dm b/code/controllers/subsystem/dynamic/_dynamic_ruleset.dm index 2ca153493399..282c83d8f0f1 100644 --- a/code/controllers/subsystem/dynamic/_dynamic_ruleset.dm +++ b/code/controllers/subsystem/dynamic/_dynamic_ruleset.dm @@ -10,9 +10,12 @@ /// Don't change this unless you know what you're doing. var/config_tag - /// What flag to check for jobbans? Optional, if unset, uses pref_flag + /// What flag to check for jobbans? + /// Optional, if unset, uses pref_flag for jobbans instead var/jobban_flag - /// What flag to check for prefs? Required if the antag has an associated preference + /// What flag to check for prefs? + /// Required if the antag has an associated preference, and must be unique + /// (unless RULESET_VARIATION is set in ruleset_flags) var/pref_flag /// Flags for this ruleset var/ruleset_flags = NONE @@ -30,7 +33,7 @@ * Or * - A single weight for all tiers. */ - var/list/weight = 0 + var/alist/weight = 0 /** * The min population for which this ruleset is available. * @@ -40,7 +43,7 @@ * Or * - A single min population for all tiers. */ - var/list/min_pop = 0 + var/alist/min_pop = 0 /// List of roles that are blacklisted from this ruleset /// For roundstart rulesets, it will prevent players from being selected for this ruleset if they have one of these roles /// For latejoin or midround rulesets, it will prevent players from being assigned to this ruleset if they have one of these roles @@ -77,6 +80,8 @@ var/minimum_required_age = 0 /// Templates necessary for this ruleset to be executed VAR_PROTECTED/list/ruleset_lazy_templates + /// Extra logging information can be set here, to be output into any admin messaging and dynamic logs. + VAR_FINAL/log_data /datum/dynamic_ruleset/New(list/dynamic_config) for(var/new_var in dynamic_config?[config_tag]) @@ -105,6 +110,7 @@ if(new_var in locked_config_values) log_dynamic("Bad config edit rejected: [new_var]") return FALSE + if(islist(new_val) && (new_var == NAMEOF(src, weight) || new_var == NAMEOF(src, min_pop))) new_val = load_tier_list(new_val) @@ -116,46 +122,23 @@ return FALSE return ..() -/// Used to create tier lists for weights and min_pop values +/// Used to create tier alists for weights and min_pop values /datum/dynamic_ruleset/proc/load_tier_list(list/incoming_list) PRIVATE_PROC(TRUE) - var/list/tier_list = new /list(4) - // loads a list of list("2" = 1, "3" = 3) into a list(null, 1, 3, null) + var/alist/tier_list = alist() + // loads a list of list("2" = 1, "3" = 3) into an alist(2 = 1, 3 = 3) for(var/tier in incoming_list) - tier_list[text2num(tier)] = incoming_list[tier] - - // turn list(null, 1, 3, null) into list(1, 1, 3, null) - for(var/i in 1 to length(tier_list)) - var/val = tier_list[i] - if(isnum(val)) - break - for(var/j in i to length(tier_list)) - var/other_val = tier_list[j] - if(!isnum(other_val)) - continue - tier_list[i] = other_val - break - - // turn list(1, 1, 3, null) into list(1, 1, 3, 3) - for(var/i in length(tier_list) to 1 step -1) - var/val = tier_list[i] - if(isnum(val)) - break - for(var/j in i to 1 step -1) - var/other_val = tier_list[j] - if(!isnum(other_val)) - continue - tier_list[i] = other_val - break - - // we can assert that tier[1] and tier[4] are not null, but we cannot say the same for tier[2] and tier[3] - // this can be happen due to the following setup: list(1, null, null, 4) - // (which is an invalid config, and should be fixed by the operator) - if(isnull(tier_list[2])) - tier_list[2] = tier_list[1] - if(isnull(tier_list[3])) - tier_list[3] = tier_list[4] + var/tier_value = text2num(tier) + if (tier_value > DYNAMIC_TIER_HIGH) + stack_trace("Dynamic config for [name] encountered a tier value exceeding DYNAMIC_TIER_HIGH!") + message_admins(span_boldannounce("Dynamic config for [name] encountered a tier value exceeding DYNAMIC_TIER_HIGH!")) + tier_value = DYNAMIC_TIER_HIGH + else if (tier_value < DYNAMIC_TIER_GREEN) + stack_trace("Dynamic config for [name] encountered a negative tier value, below DYNAMIC_TIER_GREEN!") + message_admins(span_boldannounce("Dynamic config for [name] encountered a negative tier value, below DYNAMIC_TIER_GREEN!")) + tier_value = DYNAMIC_TIER_GREEN + tier_list[tier_value] = incoming_list[tier] return tier_list @@ -165,6 +148,25 @@ /datum/dynamic_ruleset/proc/can_be_selected() return TRUE +/// Gets the list value for the given tier, otherwise use next highest tier, +/// or failing that, next lowest +/datum/dynamic_ruleset/proc/get_tier_specific_value(alist/values, tier) + PRIVATE_PROC(TRUE) + if(isnum(values[tier])) + return values[tier] + + // search higher tiers + for(var/i in tier to 4) + if(isnum(values[i])) + return values[i] + + // no dice, lower tiers? + for(var/i in tier to 1 step -1) + if(isnum(values[i])) + return values[i] + + return 0 + /** * Calculates the weight of this ruleset for the given tier. * @@ -178,11 +180,11 @@ return 0 if(!can_be_selected()) return 0 - var/final_minpop = islist(min_pop) ? min_pop[tier] : min_pop + var/final_minpop = islist(min_pop) ? get_tier_specific_value(min_pop, tier) : min_pop if(final_minpop > population_size) return 0 - var/final_weight = islist(weight) ? weight[tier] : weight + var/final_weight = islist(weight) ? get_tier_specific_value(weight, tier) : weight for(var/datum/dynamic_ruleset/other_ruleset as anything in SSdynamic.executed_rulesets) if(other_ruleset == src) continue @@ -220,6 +222,7 @@ // This is (mostly) redundant, buuuut the (potential) sleep above makes it iffy, so let's just be safe if(!can_be_selected()) + log_data = "Reason: Ruleset cannot be selected." return FALSE var/max_candidates = get_antag_cap(population_size, max_antag_cap || min_antag_cap) @@ -227,6 +230,7 @@ var/list/selected_candidates = select_candidates(antag_candidates, max_candidates) if(length(selected_candidates) < min_candidates) + log_data = "Reason: Not enough eligible candidates. Have: [length(selected_candidates)], Need: [min_candidates]" return FALSE for(var/mob/candidate as anything in selected_candidates) diff --git a/code/controllers/subsystem/dynamic/dynamic.dm b/code/controllers/subsystem/dynamic/dynamic.dm index a54157e1f884..2b51b7fff6ed 100644 --- a/code/controllers/subsystem/dynamic/dynamic.dm +++ b/code/controllers/subsystem/dynamic/dynamic.dm @@ -149,7 +149,7 @@ SUBSYSTEM_DEF(dynamic) for(var/datum/dynamic_ruleset/roundstart/ruleset in queued_rulesets) // NOTE: !! THIS CAN SLEEP !! if(!ruleset.prepare_execution( num_real_players, antag_candidates )) - log_dynamic("Roundstart: Selected ruleset [ruleset.config_tag], but preparation failed!") + log_dynamic("Roundstart: Selected ruleset [ruleset.config_tag], but preparation failed! [ruleset.log_data]") queued_rulesets -= ruleset qdel(ruleset) continue @@ -368,7 +368,7 @@ SUBSYSTEM_DEF(dynamic) // NOTE: !! THIS CAN SLEEP !! if(!picked_ruleset.prepare_execution(player_count, picked_ruleset.collect_candidates())) - log_dynamic("Midround ([range]): Selected ruleset [picked_ruleset.config_tag], but preparation failed!") + log_dynamic("Midround ([range]): Selected ruleset [picked_ruleset.config_tag], but preparation failed! [picked_ruleset.log_data]") QDEL_LIST(rulesets_weighted) return FALSE // Run the thing @@ -430,8 +430,8 @@ SUBSYSTEM_DEF(dynamic) // NOTE: !! THIS CAN SLEEP !! if(!running.prepare_execution(get_active_player_count(afk_check = TRUE), running.collect_candidates())) if(alert_admins_on_fail) - message_admins("Midround (forced): Forced ruleset [running.config_tag], but preparation failed!") - log_dynamic("Midround (forced): Forced ruleset [running.config_tag], but preparation failed!") + message_admins("Midround (forced): Forced ruleset [running.config_tag], but preparation failed! [running.log_data]") + log_dynamic("Midround (forced): Forced ruleset [running.config_tag], but preparation failed! [running.log_data]") qdel(running) return FALSE @@ -493,7 +493,7 @@ SUBSYSTEM_DEF(dynamic) return FALSE // NOTE: !! THIS CAN SLEEP !! if(!picked_ruleset.prepare_execution(player_count, list(latejoiner))) - log_dynamic("Latejoin: Selected ruleset [picked_ruleset.name] for [key_name(latejoiner)], but preparation failed! Latejoin chance has increased.") + log_dynamic("Latejoin: Selected ruleset [picked_ruleset.name] for [key_name(latejoiner)], but preparation failed! Latejoin chance has increased. [picked_ruleset.log_data]") QDEL_LIST(rulesets_weighted) failed_latejoins++ return FALSE diff --git a/code/controllers/subsystem/dynamic/dynamic_ruleset_latejoin.dm b/code/controllers/subsystem/dynamic/dynamic_ruleset_latejoin.dm index d780e2fa3446..0fc37d0daf6a 100644 --- a/code/controllers/subsystem/dynamic/dynamic_ruleset_latejoin.dm +++ b/code/controllers/subsystem/dynamic/dynamic_ruleset_latejoin.dm @@ -35,22 +35,6 @@ /datum/dynamic_ruleset/latejoin/traitor/assign_role(datum/mind/candidate) candidate.add_antag_datum(/datum/antagonist/traitor) -/datum/dynamic_ruleset/latejoin/heretic - name = "Heretic" - config_tag = "Latejoin Heretic" - preview_antag_datum = /datum/antagonist/heretic - pref_flag = ROLE_HERETIC_SMUGGLER - jobban_flag = ROLE_HERETIC - weight = 3 - min_pop = 30 // Ensures good spread of sacrifice targets - ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_HERETIC_SACRIFICE) - blacklisted_roles = list( - JOB_HEAD_OF_PERSONNEL, - ) - -/datum/dynamic_ruleset/latejoin/heretic/assign_role(datum/mind/candidate) - candidate.add_antag_datum(/datum/antagonist/heretic) - /datum/dynamic_ruleset/latejoin/changeling name = "Changeling" config_tag = "Latejoin Changeling" diff --git a/code/controllers/subsystem/dynamic/dynamic_ruleset_midround.dm b/code/controllers/subsystem/dynamic/dynamic_ruleset_midround.dm index b418f1ade422..95672517f9c9 100644 --- a/code/controllers/subsystem/dynamic/dynamic_ruleset_midround.dm +++ b/code/controllers/subsystem/dynamic/dynamic_ruleset_midround.dm @@ -26,7 +26,7 @@ midround_type = HEAVY_MIDROUND false_alarm_able = TRUE ruleset_flags = RULESET_INVADER - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 0, DYNAMIC_TIER_LOWMEDIUM = 0, DYNAMIC_TIER_MEDIUMHIGH = 1, @@ -271,7 +271,7 @@ pref_flag = ROLE_WIZARD_MIDROUND jobban_flag = ROLE_WIZARD ruleset_flags = RULESET_INVADER|RULESET_HIGH_IMPACT - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 0, DYNAMIC_TIER_LOWMEDIUM = 0, DYNAMIC_TIER_MEDIUMHIGH = 1, @@ -294,7 +294,7 @@ pref_flag = ROLE_OPERATIVE_MIDROUND jobban_flag = ROLE_OPERATIVE ruleset_flags = RULESET_INVADER|RULESET_HIGH_IMPACT - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 0, DYNAMIC_TIER_LOWMEDIUM = 1, DYNAMIC_TIER_MEDIUMHIGH = 3, @@ -378,7 +378,7 @@ false_alarm_able = TRUE pref_flag = ROLE_BLOB ruleset_flags = RULESET_INVADER - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 0, DYNAMIC_TIER_LOWMEDIUM = 1, DYNAMIC_TIER_MEDIUMHIGH = 3, @@ -418,7 +418,7 @@ false_alarm_able = TRUE pref_flag = ROLE_ALIEN ruleset_flags = RULESET_INVADER - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 0, DYNAMIC_TIER_LOWMEDIUM = 1, DYNAMIC_TIER_MEDIUMHIGH = 5, @@ -505,7 +505,7 @@ false_alarm_able = TRUE pref_flag = ROLE_SPACE_DRAGON ruleset_flags = RULESET_INVADER - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 0, DYNAMIC_TIER_LOWMEDIUM = 3, DYNAMIC_TIER_MEDIUMHIGH = 5, @@ -575,7 +575,7 @@ midround_type = HEAVY_MIDROUND pref_flag = ROLE_NINJA ruleset_flags = RULESET_INVADER - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 0, DYNAMIC_TIER_LOWMEDIUM = 0, DYNAMIC_TIER_MEDIUMHIGH = 1, @@ -658,7 +658,7 @@ candidate_role = "Changeling" pref_flag = ROLE_CHANGELING_MIDROUND jobban_flag = ROLE_CHANGELING - ruleset_flags = RULESET_INVADER + ruleset_flags = RULESET_INVADER|RULESET_VARIATION weight = 5 min_pop = 15 max_antag_cap = 1 @@ -670,6 +670,21 @@ /datum/dynamic_ruleset/midround/from_ghosts/space_changeling/assign_role(datum/mind/candidate) generate_changeling_meteor(candidate) +/datum/dynamic_ruleset/midround/from_ghosts/space_changeling/mass + name = "Mass Space Changelings" + config_tag = "Mass Changelings" + midround_type = HEAVY_MIDROUND + min_pop = 25 + min_antag_cap = 2 + max_antag_cap = 3 + repeatable_weight_decrease = 4 + weight = alist( + DYNAMIC_TIER_LOW = 0, + DYNAMIC_TIER_LOWMEDIUM = 3, + DYNAMIC_TIER_MEDIUMHIGH = 4, + DYNAMIC_TIER_HIGH = 5, + ) + /datum/dynamic_ruleset/midround/from_ghosts/paradox_clone name = "Paradox Clone" config_tag = "Paradox Clone" @@ -1064,6 +1079,7 @@ false_alarm_able = TRUE pref_flag = ROLE_SLEEPER_AGENT jobban_flag = ROLE_TRAITOR + ruleset_flags = RULESET_VARIATION weight = 10 min_pop = 3 blacklisted_roles = list( @@ -1079,6 +1095,22 @@ "[command_name()] High-Priority Update", ) +/datum/dynamic_ruleset/midround/from_living/traitor/mass + name = "Mass Traitors" + config_tag = "Mass Traitors" + midround_type = HEAVY_MIDROUND + min_pop = 15 + min_antag_cap = 2 + max_antag_cap = 4 + repeatable_weight_decrease = 8 + blacklisted_roles = list() + weight = alist( + DYNAMIC_TIER_LOW = 0, + DYNAMIC_TIER_LOWMEDIUM = 3, + DYNAMIC_TIER_MEDIUMHIGH = 8, + DYNAMIC_TIER_HIGH = 10, + ) + /datum/dynamic_ruleset/midround/from_living/malf_ai name = "Malfunctioning AI" config_tag = "Midround Malfunctioning AI" @@ -1087,7 +1119,7 @@ pref_flag = ROLE_MALF_MIDROUND jobban_flag = ROLE_MALF ruleset_flags = RULESET_HIGH_IMPACT - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 0, DYNAMIC_TIER_LOWMEDIUM = 1, DYNAMIC_TIER_MEDIUMHIGH = 3, @@ -1115,7 +1147,7 @@ midround_type = HEAVY_MIDROUND pref_flag = ROLE_BLOB_INFECTION jobban_flag = ROLE_BLOB - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 0, DYNAMIC_TIER_LOWMEDIUM = 1, DYNAMIC_TIER_MEDIUMHIGH = 3, @@ -1139,7 +1171,7 @@ midround_type = LIGHT_MIDROUND pref_flag = ROLE_OBSESSED blacklisted_roles = list() - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 5, DYNAMIC_TIER_LOWMEDIUM = 5, DYNAMIC_TIER_MEDIUMHIGH = 3, diff --git a/code/controllers/subsystem/dynamic/dynamic_ruleset_roundstart.dm b/code/controllers/subsystem/dynamic/dynamic_ruleset_roundstart.dm index 7bea57bffe88..417f7164c219 100644 --- a/code/controllers/subsystem/dynamic/dynamic_ruleset_roundstart.dm +++ b/code/controllers/subsystem/dynamic/dynamic_ruleset_roundstart.dm @@ -49,7 +49,7 @@ pref_flag = ROLE_MALF preview_antag_datum = /datum/antagonist/malf_ai ruleset_flags = RULESET_HIGH_IMPACT - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 0, DYNAMIC_TIER_LOWMEDIUM = 1, DYNAMIC_TIER_MEDIUMHIGH = 3, @@ -116,7 +116,7 @@ preview_antag_datum = /datum/antagonist/wizard pref_flag = ROLE_WIZARD ruleset_flags = RULESET_INVADER|RULESET_HIGH_IMPACT - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 0, DYNAMIC_TIER_LOWMEDIUM = 0, DYNAMIC_TIER_MEDIUMHIGH = 1, @@ -147,7 +147,7 @@ preview_antag_datum = /datum/antagonist/cult pref_flag = ROLE_CULTIST ruleset_flags = RULESET_HIGH_IMPACT - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 0, DYNAMIC_TIER_LOWMEDIUM = 1, DYNAMIC_TIER_MEDIUMHIGH = 3, @@ -208,7 +208,7 @@ preview_antag_datum = /datum/antagonist/nukeop pref_flag = ROLE_OPERATIVE ruleset_flags = RULESET_INVADER|RULESET_HIGH_IMPACT - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 0, DYNAMIC_TIER_LOWMEDIUM = 1, DYNAMIC_TIER_MEDIUMHIGH = 3, @@ -292,7 +292,7 @@ preview_antag_datum = /datum/antagonist/rev/head pref_flag = ROLE_REV_HEAD ruleset_flags = RULESET_HIGH_IMPACT - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 0, DYNAMIC_TIER_LOWMEDIUM = 1, DYNAMIC_TIER_MEDIUMHIGH = 3, @@ -367,7 +367,7 @@ config_tag = "Roundstart Spies" preview_antag_datum = /datum/antagonist/spy pref_flag = ROLE_SPY - weight = list( + weight = alist( DYNAMIC_TIER_LOW = 0, DYNAMIC_TIER_LOWMEDIUM = 1, DYNAMIC_TIER_MEDIUMHIGH = 3, diff --git a/code/controllers/subsystem/dynamic/dynamic_testing.dm b/code/controllers/subsystem/dynamic/dynamic_testing.dm index c1b5c3df0054..fe9da13d231a 100644 --- a/code/controllers/subsystem/dynamic/dynamic_testing.dm +++ b/code/controllers/subsystem/dynamic/dynamic_testing.dm @@ -13,8 +13,10 @@ ADMIN_VERB(dynamic_tester, R_DEBUG, "Dynamic Tester", "See dynamic probabilities /// A formatted report of the weights of each roundstart ruleset, refreshed occasionally and sent to the UI. var/list/roundstart_ruleset_report = list() - /// A formatted report of the weights of each midround ruleset, refreshed occasionally and sent to the UI. - var/list/midround_ruleset_report = list() + /// A formatted report of the weights of each light midround ruleset, refreshed occasionally and sent to the UI. + var/list/light_midround_ruleset_report = list() + /// A formatted report of the weights of each heavy midround ruleset, refreshed occasionally and sent to the UI. + var/list/heavy_midround_ruleset_report = list() /// What is the tier we are testing? var/tier = 1 @@ -57,8 +59,9 @@ ADMIN_VERB(dynamic_tester, R_DEBUG, "Dynamic Tester", "See dynamic probabilities data["tier"] = tier data["num_players"] = num_players - data["roundstart_ruleset_report"] = flatten_list(roundstart_ruleset_report) - data["midround_ruleset_report"] = flatten_list(midround_ruleset_report) + data["roundstart_ruleset_report"] = assoc_to_values(roundstart_ruleset_report) + data["light_midround_ruleset_report"] = assoc_to_values(light_midround_ruleset_report) + data["heavy_midround_ruleset_report"] = assoc_to_values(heavy_midround_ruleset_report) return data @@ -98,14 +101,16 @@ ADMIN_VERB(dynamic_tester, R_DEBUG, "Dynamic Tester", "See dynamic probabilities "comment" = comment, ) - midround_ruleset_report.Cut() + light_midround_ruleset_report.Cut() + heavy_midround_ruleset_report.Cut() for(var/datum/dynamic_ruleset/midround/ruleset as anything in midround_rulesets) - midround_ruleset_report[ruleset] = list( + var/list/list_to_add = ruleset.midround_type == LIGHT_MIDROUND ? light_midround_ruleset_report : heavy_midround_ruleset_report + list_to_add[ruleset] = list( "name" = ruleset.name, "weight" = ruleset.get_weight(num_players, tier), "max_candidates" = ruleset.get_antag_cap(num_players, ruleset.max_antag_cap || ruleset.min_antag_cap), "min_candidates" = ruleset.get_antag_cap(num_players, ruleset.min_antag_cap), - "comment" = ruleset.midround_type, ) + update_static_data_for_all_viewers() diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index 9125936600fa..ce6ced5b01e7 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -24,7 +24,7 @@ SUBSYSTEM_DEF(economy) var/techweb_bounty = 250 /** * List of normal (no department ones) accounts' identifiers with associated datum accounts, for big O performance. - * A list of sole account datums can be obtained with flatten_list(), another variable would be redundant rn. + * A list of sole account datums can be obtained with assoc_to_values(), another variable would be redundant rn. */ var/list/bank_accounts_by_id = list() /// A list of bank accounts indexed by their assigned job typepath. @@ -157,7 +157,7 @@ SUBSYSTEM_DEF(economy) var/datum/bank_account/bank_account = cached_processing[cached_processing[i]] if(bank_account?.account_job && !ispath(bank_account.account_job)) temporary_total += (bank_account.account_job.paycheck * STARTING_PAYCHECKS) - bank_account.payday(1, skippable = TRUE) + // bank_account.payday(1, skippable = TRUE) // DARKPACK EDIT REMOVAL station_total += bank_account.account_balance if(MC_TICK_CHECK) cached_processing.Cut(1, i + 1) @@ -168,14 +168,16 @@ SUBSYSTEM_DEF(economy) * Updates the the inflation_value, effecting newscaster alerts and the mail system. **/ /datum/controller/subsystem/economy/proc/price_update() + /* // DARKPACK EDIT REMOVAL 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]" + */ + earning_report = "[CITY_NAME] Economic Report

Expected inflation rates are measured at [SSeconomy.inflation_value()*100]%" // DARKPACK EDIT CHANGE var/update_alerts = FALSE - if(HAS_TRAIT(SSstation, STATION_TRAIT_ECONOMY_ALERTS)) + if(HAS_TRAIT(SSstation, STATION_TRAIT_ECONOMY_ALERTS) && (living_player_count() > 1)) var/datum/bank_account/moneybags var/static/list/typecache_bank = typecacheof(list(/datum/bank_account/department, /datum/bank_account/remote)) for(var/i in bank_accounts_by_id) @@ -185,11 +187,11 @@ SUBSYSTEM_DEF(economy) if(!moneybags || moneybags.account_balance < current_acc.account_balance) moneybags = current_acc if (moneybags) - earning_report += "Our GMM Spotlight would like to alert you that [moneybags.account_holder] is your station's most affulent crewmate! They've hit it big with [moneybags.account_balance] credits saved. " + earning_report += "Our GMM Spotlight would like to alert you that [moneybags.account_holder] is your station's most affulent crewmate! They've hit it big with [moneybags.account_balance] [MONEY_NAME] saved. " update_alerts = TRUE inflict_moneybags(moneybags) - earning_report += "That's all from the Nanotrasen Economist Division." - GLOB.news_network.submit_article(earning_report, "Station Earnings Report", NEWSCASTER_STATION_ANNOUNCEMENTS, null, update_alert = update_alerts) + earning_report += "
That's all from the [CITY_NAME] Economist Division." // DARKPACK EDIT CHANGE + GLOB.news_network.submit_article(earning_report, "[CITY_NAME] Earnings Report", NEWSCASTER_STATION_ANNOUNCEMENTS, null, update_alert = update_alerts) // DARKPACK EDIT CHANGE return TRUE /** @@ -204,7 +206,7 @@ SUBSYSTEM_DEF(economy) 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) + inflation_value = clamp(round(((station_total / bank_accounts_by_id.len) / station_target), 0.1), 0.9, 1.1) // DARKPACK EDIT CHANGE return inflation_value /** diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 2ecec8989d0b..1aea336e3752 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -8,6 +8,8 @@ SUBSYSTEM_DEF(events) var/list/control = list() ///assoc list of all datum/round_event_control, ordered by name. name => event var/list/events_by_name = list() + ///assoc list of all nonrunning event types, ordered by name. name => event typepath + var/list/nonrunning_events_by_name = list() ///list of all existing /datum/round_event currently being run. var/list/running = list() ///cache of currently running events, for lag checking. @@ -24,7 +26,10 @@ SUBSYSTEM_DEF(events) /datum/controller/subsystem/events/Initialize() for(var/type in typesof(/datum/round_event_control)) var/datum/round_event_control/event = new type() - if(!event.typepath || !event.valid_for_map()) + if(!event.typepath) + continue + if(!event.valid_for_map()) + nonrunning_events_by_name[event.name] = event.type continue //don't want this one! leave it for the garbage collector control += event //add it to the list of all events (controls) events_by_name[event.name] = event @@ -49,8 +54,9 @@ SUBSYSTEM_DEF(events) var/list/configuration = json_decode(file2text(json_file)) for(var/variable in configuration) var/datum/round_event_control/event = events_by_name[variable] - if(!event) - stack_trace("Invalid event [event] attempting to be configured.") + if(isnull(event)) + if(isnull(nonrunning_events_by_name[variable])) // don't stack_trace events that aren't running due to map flags + stack_trace("Invalid event [variable] attempting to be configured.") continue for(var/event_variable in configuration[variable]) if(!(event.vars.Find(event_variable))) diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index 9fb15c8087ed..f8062a8a2247 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -472,8 +472,7 @@ ADMIN_VERB(check_bomb_impacts, R_DEBUG, "Check Bomb Impact", "See what the effec var/took = (REALTIMEOFDAY - started_at) / 10 //You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare - if(GLOB.Debug2) - log_world("## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds.") + debug_world("Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds.") explosion_index += 1 diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 405f2ec12b4c..ce8672a6d9bf 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -31,7 +31,7 @@ SUBSYSTEM_DEF(job) var/list/prioritized_jobs = list() var/list/latejoin_trackers = list() - var/overflow_role = /datum/job/assistant + var/datum/job/overflow_role = /datum/job/vampire/citizen // DARKPACK EDIT, ORIGINAL: var/datum/job/overflow_role = /datum/job/assistant var/list/level_order = list(JP_HIGH, JP_MEDIUM, JP_LOW) @@ -48,6 +48,7 @@ SUBSYSTEM_DEF(job) * See [/datum/controller/subsystem/ticker/proc/equip_characters] */ var/list/chain_of_command = list( + /* // DARKPACK EDIT START JOB_CAPTAIN = 1, JOB_HEAD_OF_PERSONNEL = 2, JOB_RESEARCH_DIRECTOR = 3, @@ -55,6 +56,9 @@ SUBSYSTEM_DEF(job) JOB_CHIEF_MEDICAL_OFFICER = 5, JOB_HEAD_OF_SECURITY = 6, JOB_QUARTERMASTER = 7, + */ + JOB_PRINCE = 1, + // DARKPACK EDIT END ) /// If TRUE, some player has been assigned Captaincy or Acting Captaincy at some point during the shift and has been given the spare ID safe code. @@ -426,7 +430,7 @@ SUBSYSTEM_DEF(job) job_debug("DO: Player count to assign roles to: [initial_players_to_assign]") //Scale number of open security officer slots to population - setup_officer_positions() + //setup_officer_positions() DAKRPACK EDIT REMOVAL - JOBS //Jobs will have fewer access permissions if the number of players exceeds the threshold defined in game_options.txt var/min_access_threshold = CONFIG_GET(number/minimal_access_threshold) @@ -734,13 +738,19 @@ SUBSYSTEM_DEF(job) /atom/proc/JoinPlayerHere(mob/joining_mob, buckle) // By default, just place the mob on the same turf as the marker or whatever. - joining_mob.forceMove(get_turf(src)) + // Set joining_mob as the new mob so subtypes can use it as a proper mob. + if(ispath(joining_mob)) + joining_mob = new joining_mob(get_turf(src)) + else + joining_mob.forceMove(get_turf(src)) + return joining_mob /obj/structure/chair/JoinPlayerHere(mob/joining_mob, buckle) - . = ..() + var/mob/created_joining_mob = ..() // Placing a mob in a chair will attempt to buckle it, or else fall back to default. - if(buckle && isliving(joining_mob)) - buckle_mob(joining_mob, FALSE, FALSE) + if(buckle && isliving(created_joining_mob)) + buckle_mob(created_joining_mob, FALSE, FALSE) + return created_joining_mob /datum/controller/subsystem/job/proc/send_to_late_join(mob/M, buckle = TRUE) var/atom/destination @@ -978,7 +988,7 @@ SUBSYSTEM_DEF(job) job_debug("[debug_prefix]: Player is qdeleted, Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_GENERIC - return JOB_AVAILABLE + return check_job_eligibility_darkpack(player, possible_job, debug_prefix, add_job_to_log) // DARKPACK EDIT, ORIGINAL: return JOB_AVAILABLE /** * Check if the station manifest has at least a certain amount of this staff type. diff --git a/code/controllers/subsystem/library.dm b/code/controllers/subsystem/library.dm index 7933bbae0c75..87b64f1af870 100644 --- a/code/controllers/subsystem/library.dm +++ b/code/controllers/subsystem/library.dm @@ -58,7 +58,7 @@ SUBSYSTEM_DEF(library) /datum/controller/subsystem/library/proc/prepare_official_posters() printable_posters = list() for(var/obj/structure/sign/poster/official/poster_type as anything in subtypesof(/obj/structure/sign/poster/official)) - if (initial(poster_type.printable) == TRUE) //Mostly this check exists to keep directionals from ending up in the printable list + if (initial(poster_type.pixel_x) == 0 && initial(poster_type.pixel_y) == 0) //Anything with an initial pixel offset is a directional subtype, keep it out the list printable_posters[initial(poster_type.name)] = poster_type /datum/controller/subsystem/library/proc/prepare_library_areas() diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 45ebd159a476..d7ae34fab4ee 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -455,10 +455,12 @@ Used by the AI doomsday and the self-destruct nuke. #ifndef LOWMEMORYMODE + /* // DARKPACK EDIT REMOVAL - TODO - PENUMBRA if(current_map.minetype == MINETYPE_LAVALAND) LoadGroup(FailedZs, "Lavaland", "map_files/Mining", "Lavaland.dmm", default_traits = ZTRAITS_LAVALAND) else if (!isnull(current_map.minetype) && current_map.minetype != MINETYPE_NONE && current_map.minetype != MINETYPE_ICE) INIT_ANNOUNCE("WARNING: An unknown minetype '[current_map.minetype]' was set! This is being ignored! Update the maploader code!") + */ #endif if(LAZYLEN(FailedZs)) //but seriously, unless the server's filesystem is messed up this will never happen @@ -486,7 +488,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) /// Generates the global station area list, filling it with typepaths of unique areas found on the station Z. /datum/controller/subsystem/mapping/proc/generate_station_area_list() for(var/area/station/station_area in GLOB.areas) - if (!(station_area.area_flags & UNIQUE_AREA)) + if (!(station_area.area_flags_mapping & UNIQUE_AREA)) continue if (is_station_level(station_area.z)) GLOB.the_station_areas += station_area.type diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm index 5341a671c8ee..e0b2bcc73378 100644 --- a/code/controllers/subsystem/materials.dm +++ b/code/controllers/subsystem/materials.dm @@ -21,16 +21,16 @@ SUBSYSTEM_DEF(materials) var/list/list/material_combos ///List of stackcrafting recipes for materials using base recipes var/list/base_stack_recipes = list( - new /datum/stack_recipe("Chair", /obj/structure/chair/greyscale, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_FURNITURE), - new /datum/stack_recipe("Toilet", /obj/structure/toilet/greyscale, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_FURNITURE), - new /datum/stack_recipe("Sink Frame", /obj/structure/sinkframe, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_FURNITURE), - new /datum/stack_recipe("Material floor tile", /obj/item/stack/tile/material, 1, 4, 20, crafting_flags = CRAFT_APPLIES_MATS, category = CAT_TILES), - /* new /datum/stack_recipe("Material airlock assembly", /obj/structure/door_assembly/door_assembly_material, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), */ // DARKPACK EDIT REMOVE - new /datum/stack_recipe("Material platform", /obj/structure/platform/material, 2, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \ + new /datum/stack_recipe("Chair", /obj/structure/chair/greyscale, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_SKIP_MATERIALS_PARITY, category = CAT_FURNITURE), + new /datum/stack_recipe("Toilet", /obj/structure/toilet/greyscale, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_SKIP_MATERIALS_PARITY, category = CAT_FURNITURE), + new /datum/stack_recipe("Sink Frame", /obj/structure/sinkframe, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_SKIP_MATERIALS_PARITY, category = CAT_FURNITURE), + new /datum/stack_recipe("Material floor tile", /obj/item/stack/tile/material, 1, 4, 20, crafting_flags = CRAFT_SKIP_MATERIALS_PARITY, category = CAT_TILES), + /* new /datum/stack_recipe("Material airlock assembly", /obj/structure/door_assembly/door_assembly_material, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_SKIP_MATERIALS_PARITY, category = CAT_DOORS), */ // DARKPACK EDIT REMOVE + new /datum/stack_recipe("Material platform", /obj/structure/platform/material, 2, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_SKIP_MATERIALS_PARITY, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \ ) ///List of stackcrafting recipes for materials using rigid recipes var/list/rigid_stack_recipes = list( - new /datum/stack_recipe("Carving block", /obj/structure/carving_block, 5, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_STRUCTURE), + new /datum/stack_recipe("Carving block", /obj/structure/carving_block, 5, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_SKIP_MATERIALS_PARITY, category = CAT_STRUCTURE), ) ///A list of dimensional themes used by the dimensional anomaly and other things, most of which require materials to function. @@ -157,8 +157,7 @@ SUBSYSTEM_DEF(materials) if(!material_combos) InitializeMaterials() var/list/combo_params = list() - for(var/x in materials_declaration) - var/datum/material/mat = x + for(var/datum/material/mat as anything in materials_declaration) combo_params += "[istype(mat) ? mat.id : mat]=[OPTIMAL_COST(materials_declaration[mat] * multiplier)]" sortTim(combo_params, GLOBAL_PROC_REF(cmp_text_asc)) // We have to sort now in case the declaration was not in order var/combo_index = combo_params.Join("-") diff --git a/code/controllers/subsystem/networks/bitrunning.dm b/code/controllers/subsystem/networks/bitrunning.dm index 5e6a1c6bd345..51b7f329a4a6 100644 --- a/code/controllers/subsystem/networks/bitrunning.dm +++ b/code/controllers/subsystem/networks/bitrunning.dm @@ -19,7 +19,7 @@ SUBSYSTEM_DEF(bitrunning) var/list/levels = list() for(var/datum/lazy_template/virtual_domain/domain as anything in all_domains) - if(domain.test_only) + if(domain.domain_flags & DOMAIN_TEST_ONLY) continue var/can_view = domain.difficulty < scanner_tier && domain.cost <= points + 5 var/can_view_reward = domain.difficulty < (scanner_tier + 1) && domain.cost <= points + 3 diff --git a/code/controllers/subsystem/networks/id_access.dm b/code/controllers/subsystem/networks/id_access.dm index 66bb83a831ea..94793f311149 100644 --- a/code/controllers/subsystem/networks/id_access.dm +++ b/code/controllers/subsystem/networks/id_access.dm @@ -249,86 +249,89 @@ SUBSYSTEM_DEF(id_access) /// Setup dictionary that converts access levels to text descriptions. /datum/controller/subsystem/id_access/proc/setup_access_descriptions() - desc_by_access["[ACCESS_CARGO]"] = "Cargo Bay" - desc_by_access["[ACCESS_SECURITY]"] = "Security" - desc_by_access["[ACCESS_BRIG]"] = "Holding Cells" - desc_by_access["[ACCESS_COURT]"] = "Courtroom" - desc_by_access["[ACCESS_DETECTIVE]"] = "Detective Office" - desc_by_access["[ACCESS_MEDICAL]"] = "Medical" - desc_by_access["[ACCESS_GENETICS]"] = "Genetics Lab" - desc_by_access["[ACCESS_MORGUE]"] = "Morgue" - desc_by_access["[ACCESS_MORGUE_SECURE]"] = "Coroner" - desc_by_access["[ACCESS_SCIENCE]"] = "R&D Lab" - desc_by_access["[ACCESS_ORDNANCE]"] = "Ordnance Lab" - desc_by_access["[ACCESS_ORDNANCE_STORAGE]"] = "Ordnance Storage" - desc_by_access["[ACCESS_PLUMBING]"] = "Chemistry Lab" - desc_by_access["[ACCESS_RD]"] = "RD Office" - desc_by_access["[ACCESS_BAR]"] = "Bar" - desc_by_access["[ACCESS_JANITOR]"] = "Custodial Closet" - desc_by_access["[ACCESS_ENGINEERING]"] = "Engineering" - desc_by_access["[ACCESS_ENGINE_EQUIP]"] = "Power and Engineering Equipment" - desc_by_access["[ACCESS_MAINT_TUNNELS]"] = "Maintenance" - desc_by_access["[ACCESS_EXTERNAL_AIRLOCKS]"] = "External Airlocks" - desc_by_access["[ACCESS_CHANGE_IDS]"] = "ID Console" - desc_by_access["[ACCESS_AI_UPLOAD]"] = "AI Chambers" - desc_by_access["[ACCESS_TELEPORTER]"] = "Teleporter" - desc_by_access["[ACCESS_EVA]"] = "EVA" - desc_by_access["[ACCESS_COMMAND]"] = "Command" - desc_by_access["[ACCESS_CAPTAIN]"] = "Captain" - desc_by_access["[ACCESS_ALL_PERSONAL_LOCKERS]"] = "Personal Lockers" - desc_by_access["[ACCESS_CHAPEL_OFFICE]"] = "Chapel Office" - desc_by_access["[ACCESS_TECH_STORAGE]"] = "Technical Storage" - desc_by_access["[ACCESS_ATMOSPHERICS]"] = "Atmospherics" - desc_by_access["[ACCESS_CREMATORIUM]"] = "Crematorium" - desc_by_access["[ACCESS_ARMORY]"] = "Armory" - desc_by_access["[ACCESS_CONSTRUCTION]"] = "Construction" - desc_by_access["[ACCESS_KITCHEN]"] = "Kitchen" - desc_by_access["[ACCESS_HYDROPONICS]"] = "Hydroponics" - desc_by_access["[ACCESS_LIBRARY]"] = "Library" - desc_by_access["[ACCESS_LAWYER]"] = "Law Office" - desc_by_access["[ACCESS_ROBOTICS]"] = "Robotics" - desc_by_access["[ACCESS_VIROLOGY]"] = "Virology" - desc_by_access["[ACCESS_PSYCHOLOGY]"] = "Psychology" - desc_by_access["[ACCESS_CMO]"] = "CMO Office" - desc_by_access["[ACCESS_QM]"] = "QM Office" - desc_by_access["[ACCESS_SURGERY]"] = "Surgery" - desc_by_access["[ACCESS_THEATRE]"] = "Theatre" - desc_by_access["[ACCESS_RESEARCH]"] = "Science" - desc_by_access["[ACCESS_MINING]"] = "Mining Dock" - desc_by_access["[ACCESS_SHIPPING]"] = "Cargo Shipping" - desc_by_access["[ACCESS_VAULT]"] = "Main Vault" - desc_by_access["[ACCESS_MINING_STATION]"] = "Mining Outpost" - desc_by_access["[ACCESS_XENOBIOLOGY]"] = "Xenobiology Lab" - desc_by_access["[ACCESS_HOP]"] = "HoP Office" - desc_by_access["[ACCESS_HOS]"] = "HoS Office" - desc_by_access["[ACCESS_CE]"] = "CE Office" - desc_by_access["[ACCESS_PHARMACY]"] = "Pharmacy" - desc_by_access["[ACCESS_RC_ANNOUNCE]"] = "RC Announcements" - desc_by_access["[ACCESS_KEYCARD_AUTH]"] = "Keycode Auth." - desc_by_access["[ACCESS_TCOMMS]"] = "Telecommunications" - desc_by_access["[ACCESS_GATEWAY]"] = "Gateway" - desc_by_access["[ACCESS_BRIG_ENTRANCE]"] = "Brig" - desc_by_access["[ACCESS_MINERAL_STOREROOM]"] = "Mineral Storage" - desc_by_access["[ACCESS_MINISAT]"] = "AI Satellite" - desc_by_access["[ACCESS_WEAPONS]"] = "Weapon Permit" - desc_by_access["[ACCESS_NETWORK]"] = "Network Access" - desc_by_access["[ACCESS_MECH_MINING]"] = "Mining Mech Access" - desc_by_access["[ACCESS_MECH_MEDICAL]"] = "Medical Mech Access" - desc_by_access["[ACCESS_MECH_SECURITY]"] = "Security Mech Access" - desc_by_access["[ACCESS_MECH_SCIENCE]"] = "Science Mech Access" - desc_by_access["[ACCESS_MECH_ENGINE]"] = "Engineering Mech Access" - desc_by_access["[ACCESS_AUX_BASE]"] = "Auxiliary Base" - desc_by_access["[ACCESS_SERVICE]"] = "Service Hallway" - desc_by_access["[ACCESS_CENT_GENERAL]"] = "Code Grey" - desc_by_access["[ACCESS_CENT_THUNDER]"] = "Code Yellow" - desc_by_access["[ACCESS_CENT_STORAGE]"] = "Code Orange" - desc_by_access["[ACCESS_CENT_LIVING]"] = "Code Green" - desc_by_access["[ACCESS_CENT_MEDICAL]"] = "Code White" - desc_by_access["[ACCESS_CENT_TELEPORTER]"] = "Code Blue" - 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" + desc_by_access[ACCESS_CARGO] = "Cargo Bay" + desc_by_access[ACCESS_SECURITY] = "Security" + desc_by_access[ACCESS_BRIG] = "Holding Cells" + desc_by_access[ACCESS_COURT] = "Courtroom" + desc_by_access[ACCESS_DETECTIVE] = "Detective Office" + desc_by_access[ACCESS_MEDICAL] = "Medical" + desc_by_access[ACCESS_GENETICS] = "Genetics Lab" + desc_by_access[ACCESS_MORGUE] = "Morgue" + desc_by_access[ACCESS_MORGUE_SECURE] = "Coroner" + desc_by_access[ACCESS_SCIENCE] = "R&D Lab" + desc_by_access[ACCESS_ORDNANCE] = "Ordnance Lab" + desc_by_access[ACCESS_ORDNANCE_STORAGE] = "Ordnance Storage" + desc_by_access[ACCESS_PLUMBING] = "Chemistry Lab" + desc_by_access[ACCESS_RD] = "RD Office" + desc_by_access[ACCESS_BAR] = "Bar" + desc_by_access[ACCESS_JANITOR] = "Custodial Closet" + desc_by_access[ACCESS_ENGINEERING] = "Engineering" + desc_by_access[ACCESS_ENGINE_EQUIP] = "Power and Engineering Equipment" + desc_by_access[ACCESS_MAINT_TUNNELS] = "Maintenance" + desc_by_access[ACCESS_EXTERNAL_AIRLOCKS] = "External Airlocks" + desc_by_access[ACCESS_CHANGE_IDS] = "ID Console" + desc_by_access[ACCESS_AI_UPLOAD] = "AI Chambers" + desc_by_access[ACCESS_TELEPORTER] = "Teleporter" + desc_by_access[ACCESS_EVA] = "EVA" + desc_by_access[ACCESS_BUDGET] = "Department Budget" + desc_by_access[ACCESS_COMMAND] = "Command" + desc_by_access[ACCESS_CAPTAIN] = "Captain" + desc_by_access[ACCESS_ALL_PERSONAL_LOCKERS] = "Personal Lockers" + desc_by_access[ACCESS_CHAPEL_OFFICE] = "Chapel Office" + desc_by_access[ACCESS_TECH_STORAGE] = "Technical Storage" + desc_by_access[ACCESS_ATMOSPHERICS] = "Atmospherics" + desc_by_access[ACCESS_CREMATORIUM] = "Crematorium" + desc_by_access[ACCESS_ARMORY] = "Armory" + desc_by_access[ACCESS_CONSTRUCTION] = "Construction" + desc_by_access[ACCESS_KITCHEN] = "Kitchen" + desc_by_access[ACCESS_HYDROPONICS] = "Hydroponics" + desc_by_access[ACCESS_LIBRARY] = "Library" + desc_by_access[ACCESS_LAWYER] = "Law Office" + desc_by_access[ACCESS_ROBOTICS] = "Robotics" + desc_by_access[ACCESS_VIROLOGY] = "Virology" + desc_by_access[ACCESS_PSYCHOLOGY] = "Psychology" + desc_by_access[ACCESS_CMO] = "CMO Office" + desc_by_access[ACCESS_PARAMEDIC] = "Paramedic Office" + desc_by_access[ACCESS_QM] = "QM Office" + desc_by_access[ACCESS_SURGERY] = "Surgery" + desc_by_access[ACCESS_THEATRE] = "Theatre" + desc_by_access[ACCESS_RESEARCH] = "Science" + desc_by_access[ACCESS_MINING] = "Mining Dock" + desc_by_access[ACCESS_SHIPPING] = "Cargo Shipping" + desc_by_access[ACCESS_VAULT] = "Main Vault" + desc_by_access[ACCESS_MINING_STATION] = "Mining Outpost" + desc_by_access[ACCESS_XENOBIOLOGY] = "Xenobiology Lab" + desc_by_access[ACCESS_HOP] = "HoP Office" + desc_by_access[ACCESS_HOS] = "HoS Office" + desc_by_access[ACCESS_CE] = "CE Office" + desc_by_access[ACCESS_PHARMACY] = "Pharmacy" + desc_by_access[ACCESS_RC_ANNOUNCE] = "RC Announcements" + desc_by_access[ACCESS_KEYCARD_AUTH] = "Keycode Auth." + desc_by_access[ACCESS_TCOMMS] = "Telecommunications" + desc_by_access[ACCESS_GATEWAY] = "Gateway" + desc_by_access[ACCESS_BRIG_ENTRANCE] = "Brig" + desc_by_access[ACCESS_MINERAL_STOREROOM] = "Mineral Storage" + desc_by_access[ACCESS_MINISAT] = "AI Satellite" + desc_by_access[ACCESS_WEAPONS] = "Weapon Permit" + desc_by_access[ACCESS_NETWORK] = "Network Access" + desc_by_access[ACCESS_MECH_MINING] = "Mining Mech Access" + desc_by_access[ACCESS_MECH_MEDICAL] = "Medical Mech Access" + desc_by_access[ACCESS_MECH_SECURITY] = "Security Mech Access" + desc_by_access[ACCESS_MECH_SCIENCE] = "Science Mech Access" + desc_by_access[ACCESS_MECH_ENGINE] = "Engineering Mech Access" + desc_by_access[ACCESS_AUX_BASE] = "Auxiliary Base" + desc_by_access[ACCESS_SERVICE] = "Service Hallway" + desc_by_access[ACCESS_CENT_GENERAL] = "CentCom General Access" + desc_by_access[ACCESS_CENT_THUNDER] = "CentCom Thunderdome" + desc_by_access[ACCESS_CENT_STORAGE] = "CentCom Storage" + desc_by_access[ACCESS_CENT_LIVING] = "CentCom Living Quarters" + desc_by_access[ACCESS_CENT_MEDICAL] = "CentCom Medical" + desc_by_access[ACCESS_CENT_TELEPORTER] = "CentCom Teleporter" + desc_by_access[ACCESS_CENT_SPECOPS] = "CentCom SpecOps" + desc_by_access[ACCESS_CENT_CAPTAIN] = "CentCom Captain" + desc_by_access[ACCESS_CENT_BAR] = "CentCom Bar" + desc_by_access[ACCESS_CENT_OFFICER] = "CentCom Officer" + desc_by_access[ACCESS_BIT_DEN] = "Bitrunner Den" /** * Returns the access bitflags associated with any given access level. diff --git a/code/controllers/subsystem/networks/research.dm b/code/controllers/subsystem/networks/research.dm index dece0f78e01e..8a48e90c2661 100644 --- a/code/controllers/subsystem/networks/research.dm +++ b/code/controllers/subsystem/networks/research.dm @@ -66,6 +66,7 @@ SUBSYSTEM_DEF(research) /obj/item/assembly/signaler/anomaly/bioscrambler = MAX_CORES_BIOSCRAMBLER, /obj/item/assembly/signaler/anomaly/dimensional = MAX_CORES_DIMENSIONAL, /obj/item/assembly/signaler/anomaly/ectoplasm = MAX_CORES_ECTOPLASMIC, + /obj/item/assembly/signaler/anomaly/weather = MAX_CORES_WEATHER, ) /// Lookup list for ordnance briefers. diff --git a/code/controllers/subsystem/ore_generation.dm b/code/controllers/subsystem/ore_generation.dm index b364bfe04873..7f51c2bcbbe5 100644 --- a/code/controllers/subsystem/ore_generation.dm +++ b/code/controllers/subsystem/ore_generation.dm @@ -22,12 +22,49 @@ SUBSYSTEM_DEF(ore_generation) var/list/ore_vent_minerals = list() /datum/controller/subsystem/ore_generation/Initialize() + /// First, lets sort each ore_vent here based on their distance to the landmark, then we'll assign sizes. + var/list/sort_vents = list() + for(var/obj/structure/ore_vent/vent as anything in possible_vents) + + var/obj/landmark_anchor //We need to find the mining epicenter to gather distance from. + for(var/obj/possible_landmark as anything in GLOB.mining_center) // have to check multiple due to icebox + if(possible_landmark.z == vent.z) + landmark_anchor = possible_landmark + break + + if(!landmark_anchor) //We're missing a mining epicenter landmark, but it's not crash-worthy. + vent.vent_size_setup(random = TRUE, force_size = null, map_loading = TRUE) + continue + + sort_vents.Insert(length(sort_vents), vent) + sort_vents[vent] = get_dist(get_turf(vent),get_turf(landmark_anchor)) + + sortTim(sort_vents, GLOBAL_PROC_REF(cmp_numeric_asc), associative = TRUE) // Should sort list from closest to farthest. + possible_vents = sort_vents // Now we can work with the main list + + var/cutoff = round((length(possible_vents) / 3)) + var/vent_size_level = SMALL_VENT_TYPE + + for(var/obj/structure/ore_vent/vent as anything in possible_vents) + vent.vent_size_setup(random = FALSE, force_size = vent_size_level, map_loading = TRUE) + cutoff-- + if(cutoff > 0 || vent_size_level == LARGE_VENT_TYPE) + continue + cutoff = round((length(possible_vents) / 3)) + switch(vent_size_level) + if(SMALL_VENT_TYPE) + vent_size_level = MEDIUM_VENT_TYPE + if(MEDIUM_VENT_TYPE) + vent_size_level = LARGE_VENT_TYPE + + //Finally, we're going to round robin through the list of ore vents and assign a mineral to them until complete. //Basically, we're going to round robin through the list of ore vents and assign a mineral to them until complete. for(var/obj/structure/ore_vent/vent as anything in possible_vents) if(vent.unique_vent) continue //Ya'll already got your minerals. vent.generate_mineral_breakdown(map_loading = TRUE) + /// Handles roundstart logging logger.Log( LOG_CATEGORY_CAVE_GENERATION, diff --git a/code/controllers/subsystem/persistence/_persistence.dm b/code/controllers/subsystem/persistence/_persistence.dm index af94d034d37c..789835c2e826 100644 --- a/code/controllers/subsystem/persistence/_persistence.dm +++ b/code/controllers/subsystem/persistence/_persistence.dm @@ -94,6 +94,7 @@ SUBSYSTEM_DEF(persistence) for(var/datum/transport_controller/linear/tram/transport as anything in SStransport.transports_by_type[TRANSPORT_TYPE_TRAM]) save_tram_history(transport.specific_transport_id) save_tram_counter() + save_guestbooks() // DARKPACK EDIT ADD ///Loads up Poly's speech buffer. diff --git a/code/controllers/subsystem/persistence/engravings.dm b/code/controllers/subsystem/persistence/engravings.dm index ad00c7909d72..c60f5ae524b0 100644 --- a/code/controllers/subsystem/persistence/engravings.dm +++ b/code/controllers/subsystem/persistence/engravings.dm @@ -62,7 +62,7 @@ if(!engraving.persistent_save) continue var/area/engraved_area = get_area(engraving.parent) - if(!(engraved_area.area_flags & PERSISTENT_ENGRAVINGS)) + if(!(engraved_area.area_flags_mapping & PERSISTENT_ENGRAVINGS)) continue saved_data["entries"] += engraving.save_persistent() diff --git a/code/controllers/subsystem/persistence/scars.dm b/code/controllers/subsystem/persistence/scars.dm index fa378f24dd43..5c6a76f4e134 100644 --- a/code/controllers/subsystem/persistence/scars.dm +++ b/code/controllers/subsystem/persistence/scars.dm @@ -5,7 +5,7 @@ if(!istype(ending_human) || !ending_human.mind?.original_character_slot_index || !ending_human.client?.prefs.read_preference(/datum/preference/toggle/persistent_scars)) continue - var/mob/living/carbon/human/original_human = ending_human.mind.original_character.resolve() + var/mob/living/carbon/human/original_human = ending_human.mind.original_character?.resolve() if(!original_human) continue diff --git a/code/controllers/subsystem/processing/fishing.dm b/code/controllers/subsystem/processing/fishing.dm index 5283560a5a50..a607995157ca 100644 --- a/code/controllers/subsystem/processing/fishing.dm +++ b/code/controllers/subsystem/processing/fishing.dm @@ -29,7 +29,7 @@ PROCESSING_SUBSYSTEM_DEF(fishing) var/icon/questionmark = icon('icons/effects/random_spawners.dmi', "questionmark") var/list/mark_dimension = get_icon_dimensions(questionmark) var/list/spawned_fish = list() - var/list/fish_subtypes = sortTim(subtypesof(/obj/item/fish), GLOBAL_PROC_REF(cmp_init_name_asc)) + var/list/fish_subtypes = sortTim(valid_subtypesof(/obj/item/fish), GLOBAL_PROC_REF(cmp_init_name_asc)) // DARKPACK EDIT CHANGE - FISHING for(var/obj/item/fish/fish_type as anything in fish_subtypes) var/list/fish_dimensions = get_icon_dimensions(fish_type::icon) var/icon/fish_icon = icon(fish_type::icon, fish_type::icon_state, frame = 1, moving = FALSE) diff --git a/code/controllers/subsystem/processing/instruments.dm b/code/controllers/subsystem/processing/instruments.dm index fd486d419ebd..9cd8706e0c4f 100644 --- a/code/controllers/subsystem/processing/instruments.dm +++ b/code/controllers/subsystem/processing/instruments.dm @@ -36,10 +36,8 @@ PROCESSING_SUBSYSTEM_DEF(instruments) songs -= S /datum/controller/subsystem/processing/instruments/proc/initialize_instrument_data() - for(var/path in subtypesof(/datum/instrument)) + for(var/path in valid_subtypesof(/datum/instrument)) var/datum/instrument/I = path - if(initial(I.abstract_type) == path) - continue I = new path I.Initialize() if(!I.id) diff --git a/code/controllers/subsystem/processing/personality.dm b/code/controllers/subsystem/processing/personality.dm new file mode 100644 index 000000000000..0f9c1021befd --- /dev/null +++ b/code/controllers/subsystem/processing/personality.dm @@ -0,0 +1,83 @@ +PROCESSING_SUBSYSTEM_DEF(personalities) + name = "Personalities" + runlevels = RUNLEVEL_GAME + flags = SS_BACKGROUND|SS_POST_FIRE_TIMING + wait = 3 SECONDS + + /// All personality singletons indexed by their type + VAR_FINAL/list/datum/personality/personalities_by_type + /// All personality singletons indexed by their savefile key + VAR_FINAL/list/datum/personality/personalities_by_key + /// Assoc list of personality group to list of personality typepaths in that group + VAR_FINAL/list/incompatibilities_by_group + /// For personalities which process, this tracks all mobs we need to process for + VAR_FINAL/list/processing_personalities + +/datum/controller/subsystem/processing/personalities/Initialize() + init_personalities() + return SS_INIT_SUCCESS + +/// Initialized personality singletons +/datum/controller/subsystem/processing/personalities/proc/init_personalities() + if(length(personalities_by_type)) + return // Already initialized + + personalities_by_type = list() + personalities_by_key = list() + incompatibilities_by_group = list() + processing_personalities = list() + for(var/datum/personality/personality_type as anything in subtypesof(/datum/personality)) + var/personality_key = personality_type::savefile_key + if(isnull(personality_key)) + // Abstract personality, ignore + continue + if(personalities_by_key[personality_key]) + stack_trace("Personality save key collision! \ + key: [personality_key] - \ + new: [personality_type::name] - \ + old: [personalities_by_key[personality_key].name]") + continue + + var/datum/personality/personality = new personality_type() + personalities_by_type[personality_type] = personality + personalities_by_key[personality.savefile_key] = personality + for(var/group in personality.groups) + incompatibilities_by_group[group] ||= list() + incompatibilities_by_group[group] += personality_type + +/// Helper to check if the new personality type is incompatible with the passed list of personality types +/datum/controller/subsystem/processing/personalities/proc/is_incompatible(list/personality_types, new_personality_type) + if(!length(incompatibilities_by_group)) + stack_trace("Checking personality incompatibilities before the incompatibility list was initialized?") + return FALSE + if(length(personality_types)) + // No incompatibilities possible with no personalities + return FALSE + var/datum/personality/new_personality = personalities_by_type[new_personality_type] + if(!length(new_personality.groups)) + // No groups, so no incompatibilities + return FALSE + + // Filters all incompatibily groups against the new personality's groups + for(var/group, incompatibility_list in incompatibilities_by_group & new_personality.groups) + // Then checks if any personality type in the list is also in the group + if(length(incompatibility_list & personality_types)) + return TRUE + return FALSE + +/// Helper to select a random list of personalities, respecting incompatibilities. REturns a list of typepaths +/datum/controller/subsystem/processing/personalities/proc/select_random_personalities(lower_end = 1, upper_end = CONFIG_GET(number/max_personalities)) + var/list/personality_pool = personalities_by_type.Copy() + var/list/selected_personalities = list() + var/num = rand(lower_end, upper_end) + var/i = 1 + while(i <= num) + if(!length(personality_pool)) + break + var/picked_type = pick(personality_pool) + if(is_incompatible(selected_personalities, picked_type)) + continue + selected_personalities += picked_type + personality_pool -= picked_type + i += 1 + return selected_personalities diff --git a/code/controllers/subsystem/processing/priority_effects.dm b/code/controllers/subsystem/processing/priority_effects.dm index ee4fb7f7f6dc..f3be081ec50c 100644 --- a/code/controllers/subsystem/processing/priority_effects.dm +++ b/code/controllers/subsystem/processing/priority_effects.dm @@ -1,6 +1,6 @@ PROCESSING_SUBSYSTEM_DEF(priority_effects) name = "Priority Status Effects" - flags = SS_TICKER | SS_KEEP_TIMING | SS_NO_INIT - wait = 2 // Not seconds - we're running on SS_TICKER, so this is ticks. + flags = SS_KEEP_TIMING | SS_NO_INIT + wait = 0.2 SECONDS // Same as SSfastprocess, but can be anything, assuming you refactor all high-priority status effect intervals and durations to be a multiple of it. priority = FIRE_PRIORITY_PRIORITY_EFFECTS stat_tag = "PEFF" diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm index 81ff1a5640b4..d2b255211686 100644 --- a/code/controllers/subsystem/processing/processing.dm +++ b/code/controllers/subsystem/processing/processing.dm @@ -40,7 +40,7 @@ SUBSYSTEM_DEF(processing) * Additionally, any "prob" you use in this proc should instead use the SPT_PROB define to make sure that the final probability per second stays the same even if the subsystem's wait is altered. * Examples where this must be considered: * - Implementing a cooldown timer, use `mytimer -= seconds_per_tick`, not `mytimer -= 1`. This way, `mytimer` will always have the unit of seconds - * - Damaging a mob, do `L.adjustFireLoss(20 * seconds_per_tick)`, not `L.adjustFireLoss(20)`. This way, the damage per second stays constant even if the wait of the subsystem is changed + * - Damaging a mob, do `L.adjust_fire_loss(20 * seconds_per_tick)`, not `L.adjust_fire_loss(20)`. This way, the damage per second stays constant even if the wait of the subsystem is changed * - Probability of something happening, do `if(SPT_PROB(25, seconds_per_tick))`, not `if(prob(25))`. This way, if the subsystem wait is e.g. lowered, there won't be a higher chance of this event happening per second * * If you override this do not call parent, as it will return PROCESS_KILL. This is done to prevent objects that dont override process() from staying in the processing list diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index 82ab648eefce..67e51e2747b2 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -8,13 +8,11 @@ GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list( list(/datum/quirk/item_quirk/blindness, /datum/quirk/item_quirk/scarred_eye), list(/datum/quirk/item_quirk/blindness, /datum/quirk/item_quirk/fluoride_stare), list(/datum/quirk/item_quirk/blindness, /datum/quirk/touchy), - list(/datum/quirk/jolly, /datum/quirk/depression, /datum/quirk/apathetic, /datum/quirk/hypersensitive), + list(/datum/quirk/jolly, /datum/quirk/depression, /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), - 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/transhumanist, /datum/quirk/body_purist), list(/datum/quirk/prosthetic_organ, /datum/quirk/tin_man, /datum/quirk/body_purist), @@ -107,7 +105,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) *Randomises the quirks for a specified mob */ /datum/controller/subsystem/processing/quirks/proc/randomise_quirks(mob/living/user) - var/bonus_quirks = max((length(user.quirks) + rand(-RANDOM_QUIRK_BONUS, RANDOM_QUIRK_BONUS)), MINIMUM_RANDOM_QUIRKS) + var/bonus_quirks = max((LAZYLEN(user.quirks) + rand(-RANDOM_QUIRK_BONUS, RANDOM_QUIRK_BONUS)), MINIMUM_RANDOM_QUIRKS) var/added_quirk_count = 0 //How many we've added var/list/quirks_to_add = list() //Quirks we're adding var/good_count = 0 @@ -181,7 +179,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) var/list/positive_quirks = list() var/points_enabled = !CONFIG_GET(flag/disable_quirk_points) var/max_positive_quirks = CONFIG_GET(number/max_positive_quirks) - var/balance = 0 + var/balance = -CONFIG_GET(number/default_quirk_points) var/list/all_quirks = get_quirks() diff --git a/code/controllers/subsystem/processing/station.dm b/code/controllers/subsystem/processing/station.dm index 45a10f3a9740..3f363934e4d4 100644 --- a/code/controllers/subsystem/processing/station.dm +++ b/code/controllers/subsystem/processing/station.dm @@ -7,7 +7,7 @@ PROCESSING_SUBSYSTEM_DEF(station) ///A list of currently active station traits var/list/station_traits = list() ///Assoc list of trait type || assoc list of traits with weighted value. Used for picking traits from a specific category. - var/list/selectable_traits_by_types = list(STATION_TRAIT_POSITIVE = list(), STATION_TRAIT_NEUTRAL = list(), STATION_TRAIT_NEGATIVE = list()) + var/alist/selectable_traits_by_types = alist(STATION_TRAIT_POSITIVE = list(), STATION_TRAIT_NEUTRAL = list(), STATION_TRAIT_NEGATIVE = list()) ///Currently active announcer. Starts as a type but gets initialized after traits are selected var/datum/centcom_announcer/announcer = /datum/centcom_announcer/default ///A list of trait roles that should be protected from antag @@ -94,15 +94,17 @@ PROCESSING_SUBSYSTEM_DEF(station) return - for(var/datum/station_trait/trait_typepath as anything in subtypesof(/datum/station_trait)) + for(var/datum/station_trait/trait_typepath as anything in valid_subtypesof(/datum/station_trait)) // If forced, (probably debugging), just set it up now, keep it out of the pool. if(initial(trait_typepath.force)) setup_trait(trait_typepath) continue - if(initial(trait_typepath.abstract_type) == trait_typepath) - continue //Dont add abstract ones to it + // DARKPACK EDIT ADD START - CITY_TRAITS + if(!initial(trait_typepath.darkpack_allowed)) + continue + // DARKPACK EDIT ADD END if(!(initial(trait_typepath.trait_flags) & STATION_TRAIT_PLANETARY) && SSmapping.is_planetary()) // we're on a planet but we can't do planet ;_; continue @@ -137,6 +139,18 @@ PROCESSING_SUBSYSTEM_DEF(station) pick_traits(STATION_TRAIT_NEUTRAL, neutral_trait_budget) pick_traits(STATION_TRAIT_NEGATIVE, negative_trait_budget) + // DARKPACK EDIT ADD START - CITY_TRAITS + var/news_worthy_info + var/list/trait_list_strings = list() + for(var/datum/station_trait/station_trait as anything in station_traits) + if(!(station_trait.newspaper_message && prob(station_trait.newspaper_chance))) + continue + trait_list_strings += "[station_trait.newspaper_message]
" + if(trait_list_strings.len > 0) + news_worthy_info = "Todays events to look out for:
" + trait_list_strings.Join() + GLOB.news_network.submit_article(news_worthy_info, "The Daily Collum", NEWSCASTER_STATION_ANNOUNCEMENTS, null) + // DARKPACK EDIT ADD END + /** * Picks traits of a specific category (e.g. bad or good), initializes them, adds them to the list of traits, * then removes them from possible traits as to not roll twice and subtracts their cost from the budget. diff --git a/code/controllers/subsystem/security_level.dm b/code/controllers/subsystem/security_level.dm index 11bb96b3d2da..2e48d593faec 100644 --- a/code/controllers/subsystem/security_level.dm +++ b/code/controllers/subsystem/security_level.dm @@ -20,7 +20,7 @@ SUBSYSTEM_DEF(security_level) if(!current_security_level.looping_sound) // No sound? No play. can_fire = FALSE return - sound_to_playing_players(current_security_level.looping_sound) + sound_to_playing_players(current_security_level.looping_sound, volume_preference = /datum/preference/numeric/volume/sound_ambience_volume) /** diff --git a/code/controllers/subsystem/sounds.dm b/code/controllers/subsystem/sounds.dm index 85a9da41a602..36597f53789e 100644 --- a/code/controllers/subsystem/sounds.dm +++ b/code/controllers/subsystem/sounds.dm @@ -34,6 +34,50 @@ SUBSYSTEM_DEF(sounds) /// Any errors from precaching. VAR_PRIVATE/list/precache_errors = list() + // Comments from https://github.com/DaedalusDock/daedalusdock We love Francinum. + /// A list of sound formats that work in byond. Indexed for direct accesing rather then loop itteration or usage of `in` + var/static/list/byond_sound_formats = list( + "mid" = TRUE, //Midi, 8.3 File Name + "midi" = TRUE, //Midi, Long File Name + "mod" = TRUE, //Module, Original Amiga Tracker format + "it" = TRUE, //Impulse Tracker Module format + "s3m" = TRUE, //ScreamTracker 3 Module + "xm" = TRUE, //FastTracker 2 Module + "oxm" = TRUE, //FastTracker 2 (Vorbis Compressed Samples) + "wav" = TRUE, //Waveform Audio File Format, A (R)IFF-class format, and Microsoft's choice in the 80s sound format pissing match. + "ogg" = TRUE, //OGG Audio Container, Usually contains Vorbis-compressed Audio + //"raw" = TRUE, //On the tin, byond purports to support raw, uncompressed PCM Audio. I actually have no fucking idea how FMOD actually handles these. + //since they completely lack all information. As a confusion based anti-footgun, I'm just going to wire this to FALSE for now. It's here though. + "wma" = TRUE, //Windows Media Audio container + "aiff" = TRUE, //Audio Interchange File Format, Apple's side of the 80s sound format pissing match. It's also (R)IFF in a trenchcoat. + "mp3" = TRUE //MPeg Layer 3 Container (And usually, Codec.) + ) + + /// File types we can sniff the duration from using rustg. + var/static/list/safe_formats = list( + "ogg" = TRUE, + "mp3" = TRUE + ) + + // Currently set to private as I would prefer you use byond_sound_formats but you can unprivate it if you have a valid use! + // Put more common extensions first to speed this up a bit (So only ogg and mp3 lol.) + /// Similar to byond_sound_formats, a list of sound formats that work in byond. + VAR_PRIVATE/static/list/byond_sound_extensions = list( + ".ogg", + ".mp3", + ".mid", + ".midi", + ".mod", + ".it", + ".s3m", + ".xm", + ".oxm", + ".wav", + //".raw", See byond_sound_formats + ".wma", + ".aiff" + ) + /datum/controller/subsystem/sounds/Initialize() setup_available_channels() find_all_available_sounds() @@ -46,6 +90,10 @@ SUBSYSTEM_DEF(sounds) // Precache ambience sounds for(var/key in GLOB.ambience_assoc) sounds_to_precache |= GLOB.ambience_assoc[key] + // DARKPACK EDIT ADD START + for(var/key in GLOB.music_assoc) + sounds_to_precache |= GLOB.music_assoc[key] + // DARKPACK EDIT ADD END precache_sounds() @@ -63,26 +111,10 @@ SUBSYSTEM_DEF(sounds) /datum/controller/subsystem/sounds/proc/find_all_available_sounds() all_sounds = list() - // Put more common extensions first to speed this up a bit - var/static/list/valid_file_extensions = list( - ".ogg", - ".wav", - ".mid", - ".midi", - ".mod", - ".it", - ".s3m", - ".xm", - ".oxm", - ".raw", - ".wma", - ".aiff", - ) - - all_sounds = pathwalk("sound/", valid_file_extensions) + all_sounds = pathwalk("sound/", byond_sound_extensions) // DARKPACK EDIT ADD START - all_sounds += pathwalk("modular_darkpack/master_files/sounds/", valid_file_extensions) - all_sounds += pathwalk("modular_darkpack/modules/", valid_file_extensions) + all_sounds += pathwalk("modular_darkpack/master_files/sounds/", byond_sound_extensions) + all_sounds += pathwalk("modular_darkpack/modules/", byond_sound_extensions) // DARKPACK EDIT ADD END /// Removes a channel from using list. diff --git a/code/controllers/subsystem/sprite_accessories.dm b/code/controllers/subsystem/sprite_accessories.dm index dfe7b6aadd14..2ceed1d3fbb9 100644 --- a/code/controllers/subsystem/sprite_accessories.dm +++ b/code/controllers/subsystem/sprite_accessories.dm @@ -5,6 +5,11 @@ /// The female specific list that we get from init_sprite_accessory_subtypes() #define FEMALE_SPRITE_LIST "female_sprites" +/// Use this to init a sprite accessory list for a feature where mobs are required to have one selected +#define INIT_ACCESSORY(sprite_accessory) init_sprite_accessory_subtypes(sprite_accessory, add_blank = FALSE)[DEFAULT_SPRITE_LIST] +/// Use this to init a sprite accessory list for a feature where mobs can opt to not have one selected +#define INIT_OPTIONAL_ACCESSORY(sprite_accessory) init_sprite_accessory_subtypes(sprite_accessory, add_blank = TRUE)[DEFAULT_SPRITE_LIST] + /// subsystem that just holds lists of sprite accessories for accession in generating said sprites. /// A sprite accessory is something that we add to a human sprite to make them look different. This is hair, facial hair, underwear, mutant bits, etc. SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity @@ -36,28 +41,8 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity //Socks var/list/socks_list //! stores /datum/sprite_accessory/socks indexed by name - //Lizard Bits (all datum lists indexed by name) - var/list/lizard_markings_list - var/list/snouts_list - var/list/horns_list - var/list/frills_list - var/list/spines_list - var/list/tail_spines_list - - //Mutant Human bits - var/list/tails_list_felinid - var/list/tails_list_lizard - var/list/tails_list_monkey - var/list/tails_list_xeno - var/list/tails_list_fish - var/list/ears_list - var/list/wings_list - var/list/wings_open_list - var/list/moth_wings_list - var/list/moth_antennae_list - var/list/moth_markings_list - var/list/caps_list - var/list/pod_hair_list + //All features, indexed by feature key, then name of the sprite accessory to the datum iteslf + var/list/list/feature_list /datum/controller/subsystem/accessories/PreInit() // this stuff NEEDS to be set up before GLOB for preferences and stuff to work so this must go here. sorry setup_lists() @@ -91,26 +76,31 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity socks_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/socks)[DEFAULT_SPRITE_LIST] - lizard_markings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/lizard_markings, add_blank = TRUE)[DEFAULT_SPRITE_LIST] - tails_list_felinid = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/felinid, add_blank = TRUE)[DEFAULT_SPRITE_LIST] - tails_list_lizard = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard)[DEFAULT_SPRITE_LIST] - tails_list_monkey = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey)[DEFAULT_SPRITE_LIST] - tails_list_xeno = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/xeno)[DEFAULT_SPRITE_LIST] - //tails fo fish organ infusions, not for prefs. - tails_list_fish = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/fish)[DEFAULT_SPRITE_LIST] - snouts_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts)[DEFAULT_SPRITE_LIST] - horns_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, add_blank = TRUE)[DEFAULT_SPRITE_LIST] - ears_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, add_blank = TRUE)[DEFAULT_SPRITE_LIST] - wings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, add_blank = TRUE)[DEFAULT_SPRITE_LIST] - wings_open_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/wings_open)[DEFAULT_SPRITE_LIST] - frills_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, add_blank = TRUE)[DEFAULT_SPRITE_LIST] - spines_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, add_blank = TRUE)[DEFAULT_SPRITE_LIST] - tail_spines_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/tail_spines, add_blank = TRUE)[DEFAULT_SPRITE_LIST] - caps_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/caps)[DEFAULT_SPRITE_LIST] - moth_wings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings)[DEFAULT_SPRITE_LIST] - moth_antennae_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_antennae)[DEFAULT_SPRITE_LIST] - moth_markings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, add_blank = TRUE)[DEFAULT_SPRITE_LIST] - pod_hair_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair)[DEFAULT_SPRITE_LIST] + feature_list = list() + // felinids + feature_list[FEATURE_TAIL_CAT] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tails/felinid) + feature_list[FEATURE_EARS] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/ears) + // lizards + feature_list[FEATURE_FRILLS] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/frills) + feature_list[FEATURE_HORNS] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/horns) + feature_list[FEATURE_LIZARD_MARKINGS] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/lizard_markings) + feature_list[FEATURE_SNOUT] = INIT_ACCESSORY(/datum/sprite_accessory/snouts) + feature_list[FEATURE_SPINES] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/spines) + feature_list[FEATURE_TAILSPINES] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/tail_spines) + feature_list[FEATURE_TAIL_LIZARD] = INIT_ACCESSORY(/datum/sprite_accessory/tails/lizard) + // moths + feature_list[FEATURE_MOTH_WINGS] = INIT_ACCESSORY(/datum/sprite_accessory/moth_wings) + feature_list[FEATURE_MOTH_ANTENNAE] = INIT_ACCESSORY(/datum/sprite_accessory/moth_antennae) + feature_list[FEATURE_MOTH_MARKINGS] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/moth_markings) + // generic wings + feature_list[FEATURE_WINGS] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/wings) + feature_list[FEATURE_WINGS_OPEN] = INIT_OPTIONAL_ACCESSORY(/datum/sprite_accessory/wings_open) + // generic features + feature_list[FEATURE_MUSH_CAP] = INIT_ACCESSORY(/datum/sprite_accessory/caps) + feature_list[FEATURE_POD_HAIR] = INIT_ACCESSORY(/datum/sprite_accessory/pod_hair) + feature_list[FEATURE_TAIL_FISH] = INIT_ACCESSORY(/datum/sprite_accessory/tails/fish) + feature_list[FEATURE_TAIL_MONKEY] = INIT_ACCESSORY(/datum/sprite_accessory/tails/monkey) + feature_list[FEATURE_TAIL_XENO] = INIT_ACCESSORY(/datum/sprite_accessory/tails/xeno) /// This proc just initializes all /datum/sprite_accessory/hair_gradient into an list indexed by gradient-style name /datum/controller/subsystem/accessories/proc/init_hair_gradients() @@ -161,6 +151,9 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity return returnable_list +#undef INIT_ACCESSORY +#undef INIT_OPTIONAL_ACCESSORY + #undef DEFAULT_SPRITE_LIST #undef MALE_SPRITE_LIST #undef FEMALE_SPRITE_LIST diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 30d91ed11a65..d4cb7fe3ec80 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -41,6 +41,8 @@ SUBSYSTEM_DEF(statpanels) "Round Time: [ROUND_TIME()]", "Local City Time: [SSticker.round_start_timeofday ? "[station_time_timestamp("hh:mm MMM")] [CURRENT_STATION_YEAR]" : "The round hasn't started yet!"]", "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)", + "---", // DARKPACK EDIT ADD + "Masquerade: [SSmasquerade.get_description()]", // DARKPACK EDIT ADD ) if(SSshuttle.emergency) @@ -220,7 +222,6 @@ SUBSYSTEM_DEF(statpanels) #endif for(var/datum/controller/subsystem/sub_system as anything in Master.subsystems) mc_data[++mc_data.len] = list("\[[sub_system.state_letter()]][sub_system.name]", sub_system.stat_entry(), text_ref(sub_system)) - mc_data[++mc_data.len] = list("Camera Net", "Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]", text_ref(GLOB.cameranet)) ///immediately update the active statpanel tab of the target client /datum/controller/subsystem/statpanels/proc/immediate_send_stat_data(client/target) diff --git a/code/controllers/subsystem/stock_market.dm b/code/controllers/subsystem/stock_market.dm index 1cce5a8c5496..8ecd6cc8085d 100644 --- a/code/controllers/subsystem/stock_market.dm +++ b/code/controllers/subsystem/stock_market.dm @@ -20,16 +20,9 @@ SUBSYSTEM_DEF(stock_market) /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(possible_market.tradable) - materials_prices += possible_market materials_prices[possible_market] = 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,3) - - materials_quantity += possible_market materials_quantity[possible_market] = possible_market.tradable_base_quantity + (rand(-(possible_market.tradable_base_quantity) * 0.5, possible_market.tradable_base_quantity * 0.5)) return SS_INIT_SUCCESS diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm index 39d281964f1d..d87aa0f1dd1d 100644 --- a/code/controllers/subsystem/tgui.dm +++ b/code/controllers/subsystem/tgui.dm @@ -39,6 +39,25 @@ SUBSYSTEM_DEF(tgui) basehtml = replacetextEx(basehtml, "", "Nanotrasen (c) 2525-[CURRENT_STATION_YEAR]") +/datum/controller/subsystem/tgui/OnConfigLoad() + var/storage_iframe = CONFIG_GET(string/storage_cdn_iframe) + + if(storage_iframe && storage_iframe != /datum/config_entry/string/storage_cdn_iframe::default) + basehtml = replacetext(basehtml, "\[tgui:storagecdn\]", storage_iframe) + return + + if(CONFIG_GET(string/asset_transport) == "webroot") + var/datum/asset_transport/webroot/webroot = SSassets.transport + + var/datum/asset_cache_item/item = webroot.register_asset("iframe.html", file("tgui/public/iframe.html")) + basehtml = replacetext(basehtml, "\[tgui:storagecdn\]", webroot.get_asset_url("iframe.html", item)) + return + + if(!storage_iframe) + return + + basehtml = replacetext(basehtml, "\[tgui:storagecdn\]", storage_iframe) + /datum/controller/subsystem/tgui/Shutdown() close_all_uis() @@ -283,6 +302,27 @@ SUBSYSTEM_DEF(tgui) count++ return count + +/** + * public + * + * Resets position of all UIs to 0, 0. + * + * required user mob The mob who opened/is using the UI. + * optional src_object datum If provided, only close UIs belonging this src_object. + * + * return int The number of UIs reset. + */ +/datum/controller/subsystem/tgui/proc/reset_ui_position(mob/user, datum/src_object) + var/count = 0 + if(length(user?.tgui_open_uis) == 0) + return count + for(var/datum/tgui/ui in user.tgui_open_uis) + if(isnull(src_object) || ui.src_object == src_object) + ui.reset_ui_position() + count++ + return count + /** * private * diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 83f6e4e4ff8c..95c6923269f6 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -127,7 +127,7 @@ SUBSYSTEM_DEF(throwing) qdel(src) -/// Returns the mob thrower, or null +/// Returns the thrower, or null /datum/thrownthing/proc/get_thrower() . = thrower?.resolve() if(isnull(.)) @@ -144,11 +144,11 @@ SUBSYSTEM_DEF(throwing) return var/atom/movable/actual_target = initial_target?.resolve() - var/mob/mob_thrower = get_thrower() + var/atom/thrower = get_thrower() if(dist_travelled) //to catch sneaky things moving on our tile while we slept for(var/atom/movable/obstacle as anything in get_turf(thrownthing)) - if (obstacle == thrownthing || (obstacle == mob_thrower && !ismob(thrownthing))) + if(obstacle == thrownthing || (obstacle == thrower && !ismob(thrownthing))) continue if(ismob(obstacle) && thrownthing.pass_flags & PASSMOB && (obstacle != actual_target)) continue diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 1ec2838efc65..69ee885438f8 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -14,7 +14,11 @@ SUBSYSTEM_DEF(ticker) /// 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. + #ifdef ABSOLUTE_MINIMUM + var/start_immediately = TRUE + #else var/start_immediately = FALSE + #endif /// Boolean to track and check if our subsystem setup is done. var/setup_done = FALSE @@ -54,7 +58,7 @@ SUBSYSTEM_DEF(ticker) var/roundend_check_paused = FALSE var/round_start_time = 0 - var/round_start_timeofday = 0 // DARKPACK ADDITION + var/round_start_timeofday = 0 // DARKPACK EDIT ADD var/list/round_start_events var/list/round_end_events var/mode_result = "undefined" @@ -70,21 +74,6 @@ SUBSYSTEM_DEF(ticker) var/reboot_timer = null /datum/controller/subsystem/ticker/Initialize() - var/list/byond_sound_formats = list( - "mid" = TRUE, - "midi" = TRUE, - "mod" = TRUE, - "it" = TRUE, - "s3m" = TRUE, - "xm" = TRUE, - "oxm" = TRUE, - "wav" = TRUE, - "ogg" = TRUE, - "raw" = TRUE, - "wma" = TRUE, - "aiff" = TRUE, - ) - var/list/provisional_title_music = flist("[global.config.directory]/title_music/sounds/") var/list/music = list() var/use_rare_music = prob(1) @@ -112,11 +101,8 @@ SUBSYSTEM_DEF(ticker) music -= old_login_music for(var/S in music) - var/list/L = splittext(S,".") - if(L.len >= 2) - var/ext = LOWER_TEXT(L[L.len]) //pick the real extension, no 'honk.ogg.exe' nonsense here - if(byond_sound_formats[ext]) - continue + if(IS_SOUND_FILE(S)) + continue music -= S if(!length(music)) @@ -229,16 +215,26 @@ SUBSYSTEM_DEF(ticker) return TRUE if(GLOB.revolution_handler?.result == REVOLUTION_VICTORY) return TRUE - // DARKPACK ADDITION START - CITY_TIME + // DARKPACK EDIT ADD START - CITY_TIME if(SScity_time.roundend_started) return TRUE - // DARKPACK ADDITION END + // DARKPACK EDIT ADD END return FALSE +/// Gets a list of players with their readied state so we can post it as a log +/datum/controller/subsystem/ticker/proc/get_player_ready_states() + var/list/player_states = list() + for(var/mob/dead/new_player/player as anything in GLOB.new_player_list) + player_states[player.ckey] = player.ready + return player_states + /datum/controller/subsystem/ticker/proc/setup() to_chat(world, span_boldannounce("Starting game...")) var/init_start = world.timeofday + var/list/players_and_readiness = get_player_ready_states() + log_game("Players and Readiness: [json_encode(players_and_readiness)]", players_and_readiness) + CHECK_TICK //Configure mode and assign player to antagonists var/can_continue = FALSE @@ -248,7 +244,7 @@ SUBSYSTEM_DEF(ticker) can_continue = can_continue && SSjob.divide_occupations() //Distribute jobs CHECK_TICK - if(!GLOB.Debug2) + if(!GLOB.debugging_enabled) if(!can_continue) log_game("Game failed pre_setup") to_chat(world, "Error setting up game. Reverting to pre-game lobby.") @@ -285,13 +281,13 @@ SUBSYSTEM_DEF(ticker) LAZYCLEARLIST(round_start_events) round_start_time = world.time //otherwise round_start_time would be 0 for the signals - round_start_timeofday = world.timeofday // DARKPACK ADDITION + round_start_timeofday = world.timeofday // DARKPACK EDIT ADD SEND_SIGNAL(src, COMSIG_TICKER_ROUND_STARTING, world.time) log_world("Game start took [(world.timeofday - init_start)/10]s") INVOKE_ASYNC(SSdbcore, TYPE_PROC_REF(/datum/controller/subsystem/dbcore,SetRoundStart)) - to_chat(world, span_notice(span_bold("Welcome to [station_name()], enjoy your stay!"))) + to_chat(world, span_notice(span_bold("Another night in [station_name()], another dollar."))) // DARKPACK EDIT CHANGE SEND_SOUND(world, sound(SSstation.announcer.get_rand_welcome_sound())) current_state = GAME_STATE_PLAYING @@ -552,10 +548,15 @@ SUBSYSTEM_DEF(ticker) var/acting_captain = !is_captain_job(player_assigned_role) SSjob.promote_to_captain(new_player_living, acting_captain) OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(minor_announce), player_assigned_role.get_captaincy_announcement(new_player_living))) - if((player_assigned_role.job_flags & JOB_ASSIGN_QUIRKS) && ishuman(new_player_living) && CONFIG_GET(flag/roundstart_traits)) - if(new_player_mob.client?.prefs?.should_be_random_hardcore(player_assigned_role, new_player_living.mind)) - new_player_mob.client.prefs.hardcore_random_setup(new_player_living) - SSquirks.AssignQuirks(new_player_living, new_player_mob.client) + if(ishuman(new_player_living)) + if(player_assigned_role.job_flags & JOB_ASSIGN_QUIRKS) + if(CONFIG_GET(flag/roundstart_traits)) + if(new_player_mob.client?.prefs?.should_be_random_hardcore(player_assigned_role, new_player_living.mind)) + new_player_mob.client.prefs.hardcore_random_setup(new_player_living) + SSquirks.AssignQuirks(new_player_living, new_player_mob.client) + else // clear any personalities the prefs added since our job clearly does not want them + new_player_living.clear_personalities() + if(ishuman(new_player_living)) SEND_SIGNAL(new_player_living, COMSIG_HUMAN_CHARACTER_SETUP_FINISHED) CHECK_TICK @@ -695,7 +696,7 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/proc/send_news_report() var/news_message - var/news_source = "Nanotrasen News Network" + var/news_source = "[CITY_NAME] News Network" var/decoded_station_name = html_decode(station_name()) //decode station_name to avoid minor_announce double encode var/decoded_emergency_reason = html_decode(emergency_reason) diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 20fe4eb47b60..ef6826396c2d 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -519,30 +519,30 @@ SUBSYSTEM_DEF(timer) #if defined(TIMER_DEBUG) // Generate debug-friendly list for timer, more complex but also more expensive timer_info = list( - 1 = id, - 2 = timeToRun, - 3 = wait, - 4 = flags, - 5 = callBack, /* Safe to hold this directly because it's never del'd */ - 6 = "[callBack.object]", - 7 = text_ref(callBack.object), - 8 = getcallingtype(), - 9 = callBack.delegate, - 10 = callBack.arguments ? callBack.arguments.Copy() : null, - 11 = "[source]" + /* 1 = */ id, + /* 2 = */ timeToRun, + /* 3 = */ wait, + /* 4 = */ flags, + /* 5 = */ callBack, /* Safe to hold this directly because it's never del'd */ + /* 6 = */ "[callBack.object]", + /* 7 = */ text_ref(callBack.object), + /* 8 = */ getcallingtype(), + /* 9 = */ callBack.delegate, + /* 10 = */ callBack.arguments ? callBack.arguments.Copy() : null, + /* 11 = */ "[source]" ) #else // Generate a debuggable list for the timer, simpler but wayyyy cheaper, string generation (and ref/copy memes) is a bitch and this saves a LOT of time timer_info = list( - 1 = id, - 2 = timeToRun, - 3 = wait, - 4 = flags, - 5 = callBack, /* Safe to hold this directly because it's never del'd */ - 6 = "[callBack.object]", - 7 = getcallingtype(), - 8 = callBack.delegate, - 9 = "[source]" + /* 1 = */ id, + /* 2 = */ timeToRun, + /* 3 = */ wait, + /* 4 = */ flags, + /* 5 = */ callBack, /* Safe to hold this directly because it's never del'd */ + /* 6 = */ "[callBack.object]", + /* 7 = */ getcallingtype(), + /* 8 = */ callBack.delegate, + /* 9 = */ "[source]" ) #endif diff --git a/code/controllers/subsystem/tts.dm b/code/controllers/subsystem/tts.dm index 1106318e021c..4c9314c8ec93 100644 --- a/code/controllers/subsystem/tts.dm +++ b/code/controllers/subsystem/tts.dm @@ -105,7 +105,10 @@ SUBSYSTEM_DEF(tts) return 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 + for(var/atom/movable/hearer in listeners | SSmobs.dead_players_by_zlevel[turf_source.z])//observers always hear through walls + var/mob/listening_mob = hearer.get_listening_mob() + if(isnull(listening_mob)) + continue if(QDELING(listening_mob)) stack_trace("TTS tried to play a sound to a deleted mob.") continue @@ -115,13 +118,13 @@ SUBSYSTEM_DEF(tts) if(volume_modifier == 0 || (tts_pref == TTS_SOUND_OFF)) continue - var/sound_volume = ((listening_mob == target)? 60 : 85) + volume_offset + var/sound_volume = ((hearer == target)? 60 : 85) + volume_offset sound_volume = sound_volume*volume_modifier var/datum/language_holder/holder = listening_mob.get_language_holder() 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) + if(get_dist(hearer, turf_source) <= range) listening_mob.playsound_local( turf_source, vol = sound_volume, @@ -294,8 +297,8 @@ 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)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name, timeout_seconds = CONFIG_GET(number/tts_http_timeout_seconds)) - 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, timeout_seconds = CONFIG_GET(number/tts_http_timeout_seconds)) + request.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts?voice=[speaker]&identifier=[identifier]&filter=[tts_filter_encode(filter, speaker)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name, timeout_seconds = CONFIG_GET(number/tts_http_timeout_seconds)) + request_blips.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts-blips?voice=[speaker]&identifier=[identifier]&filter=[tts_filter_encode(filter, speaker, blips = TRUE)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name_blips, timeout_seconds = CONFIG_GET(number/tts_http_timeout_seconds)) 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) diff --git a/code/controllers/subsystem/wardrobe.dm b/code/controllers/subsystem/wardrobe.dm index 2593595bdf63..4f25ff47d1c8 100644 --- a/code/controllers/subsystem/wardrobe.dm +++ b/code/controllers/subsystem/wardrobe.dm @@ -41,6 +41,10 @@ SUBSYSTEM_DEF(wardrobe) var/stock_hit = 0 /// How many items would we make just by loading the master list once? var/one_go_master = 0 + /// Item types that should not ever be recycled, only generated (like modsuits) + var/static/list/recycle_blacklist = typecacheof(list( + /obj/item/mod/control/pre_equipped, + )) /datum/controller/subsystem/wardrobe/Initialize() setup_callbacks() @@ -207,9 +211,17 @@ SUBSYSTEM_DEF(wardrobe) order_list[queued_type] = amount +/// Take an existing object, and recycle it if we are allowed to by stashing it back into our storage +/datum/controller/subsystem/wardrobe/proc/recycle_object(obj/item/object) + // Don't restock blacklisted items, instead just delete them + if(is_type_in_typecache(object, recycle_blacklist)) + qdel(object) + return + stash_object(object) + /// Take an existing object, and insert it into our storage /// If we can't or won't take it, it's deleted. You do not own this object after passing it in -/datum/controller/subsystem/wardrobe/proc/stash_object(atom/movable/object) +/datum/controller/subsystem/wardrobe/proc/stash_object(obj/item/object) var/object_type = object.type var/list/master_info = canon_minimum[object_type] // I will not permit objects you didn't reserve ahead of time diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index 0882720cdfbd..c330455fb15f 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -109,7 +109,8 @@ SUBSYSTEM_DEF(weather) var/datum/weather/W = new weather_datum_type(z_levels, weather_data) - W.telegraph() + W.telegraph(weather_data) + return W /datum/controller/subsystem/weather/proc/make_eligible(z, possible_weather) eligible_zlevels[z] = possible_weather diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index 4e37400d51d6..224941e6ce3d 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -8,6 +8,12 @@ database_id = MEDAL_METEOR icon_state = "meteors" +/datum/award/achievement/misc/meteor_punch + name = "Your Life In Your Hands" + desc = "Give some space debris a piece of your mind" + database_id = MEDAL_METEOR_PUNCH + icon_state = "punchmeteors" + /datum/award/achievement/misc/pulse name = "Jackpot" desc = "Win a pulse rifle from an arcade machine" diff --git a/code/datums/actions/action.dm b/code/datums/actions/action.dm index 127193834b67..e17e33ded63e 100644 --- a/code/datums/actions/action.dm +++ b/code/datums/actions/action.dm @@ -178,6 +178,10 @@ return FALSE if(action_disabled) return FALSE + if((check_flags & AB_CHECK_CONSCIOUS) && owner.stat != CONSCIOUS) + if (feedback) + owner.balloon_alert(owner, "[owner.stat == DEAD ? "dead" : "unconscious"]!") + return FALSE if((check_flags & AB_CHECK_HANDS_BLOCKED) && HAS_TRAIT(owner, TRAIT_HANDS_BLOCKED)) if (feedback) owner.balloon_alert(owner, "hands blocked!") @@ -196,10 +200,6 @@ if (feedback) owner.balloon_alert(owner, "must stand up!") return FALSE - if((check_flags & AB_CHECK_CONSCIOUS) && owner.stat != CONSCIOUS) - 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!") diff --git a/code/datums/actions/items/change_name.dm b/code/datums/actions/items/change_name.dm new file mode 100644 index 000000000000..4eb9286ecc42 --- /dev/null +++ b/code/datums/actions/items/change_name.dm @@ -0,0 +1,11 @@ +/datum/action/innate/change_name + name = "Change Name" + button_icon_state = "ghost" + +/datum/action/innate/change_name/Activate() + var/new_name = reject_bad_name(tgui_input_text(usr, "Enter a new name.", "Renaming", initial(owner.name)), allow_numbers = TRUE, max_length = MAX_NAME_LEN, cap_after_symbols = FALSE) + if(!new_name) + return FALSE + + owner.fully_replace_character_name(owner.name, new_name) + return TRUE diff --git a/code/datums/actions/mobs/fire_breath.dm b/code/datums/actions/mobs/fire_breath.dm index b38687a72aba..cbc25a78e8ae 100644 --- a/code/datums/actions/mobs/fire_breath.dm +++ b/code/datums/actions/mobs/fire_breath.dm @@ -77,7 +77,7 @@ to_chat(barbecued, span_userdanger("You're frozen solid by [source]'s icy breath!")) else to_chat(barbecued, span_userdanger("You are burned by [source]'s fire breath!")) - barbecued.adjustFireLoss(fire_damage) + barbecued.adjust_fire_loss(fire_damage) /// Shoot three lines of fire in a sort of fork pattern approximating a cone /datum/action/cooldown/mob_cooldown/fire_breath/cone diff --git a/code/datums/actions/mobs/lava_swoop.dm b/code/datums/actions/mobs/lava_swoop.dm index 428c97566567..16e2e66f7ef8 100644 --- a/code/datums/actions/mobs/lava_swoop.dm +++ b/code/datums/actions/mobs/lava_swoop.dm @@ -97,7 +97,7 @@ owner.mouse_opacity = initial(owner.mouse_opacity) playsound(owner.loc, 'sound/effects/meteorimpact.ogg', 200, TRUE) for(var/mob/living/victim in orange(1, owner) - owner) - victim.adjustBruteLoss(75) + victim.adjust_brute_loss(75) if(!QDELETED(victim)) // Some mobs are deleted on death var/throw_dir = get_dir(owner, victim) if(victim.loc == owner.loc) diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 7fb76efcc62e..6c2e3d942d39 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -387,7 +387,7 @@ multiple modular subtrees with behaviors ///Stops pawns from performing such actions that should require the target to be adjacent. var/atom/movable/moving_pawn = pawn - var/can_reach = !(current_behavior.behavior_flags & AI_BEHAVIOR_REQUIRE_REACH) || moving_pawn.CanReach(current_movement_target) + var/can_reach = !(current_behavior.behavior_flags & AI_BEHAVIOR_REQUIRE_REACH) || current_movement_target.IsReachableBy(moving_pawn) if(can_reach && current_behavior.required_distance >= get_dist(moving_pawn, current_movement_target)) ///Are we close enough to engage? if(ai_movement.moving_controllers[src] == current_movement_target) //We are close enough, if we're moving stop. ai_movement.stop_moving_towards(src) diff --git a/code/datums/ai/babies/babies_subtrees.dm b/code/datums/ai/babies/babies_subtrees.dm index 60ca7dc8193a..7cadd1e8c551 100644 --- a/code/datums/ai/babies/babies_subtrees.dm +++ b/code/datums/ai/babies/babies_subtrees.dm @@ -3,10 +3,12 @@ */ /datum/ai_planning_subtree/make_babies operational_datums = list(/datum/component/breed) - ///chance to make babies + /// Chance to make babies var/chance = 5 - ///make babies behavior we will use + /// Make babies behavior we will use var/datum/ai_behavior/reproduce_behavior = /datum/ai_behavior/make_babies + /// Find partner behavior we will use + var/datum/ai_behavior/partner_behavior = /datum/ai_behavior/find_partner /datum/ai_planning_subtree/make_babies/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() @@ -25,4 +27,4 @@ return // Find target - controller.queue_behavior(/datum/ai_behavior/find_partner, BB_BABIES_TARGET, BB_BABIES_PARTNER_TYPES, BB_BABIES_CHILD_TYPES) + controller.queue_behavior(partner_behavior, BB_BABIES_TARGET, BB_BABIES_PARTNER_TYPES, BB_BABIES_CHILD_TYPES) 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 b75fc1ef38e3..2e145c31ec4b 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 @@ -22,7 +22,7 @@ var/atom/target = controller.blackboard[target_key] if (isnull(target)) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED - if (!controller.pawn.CanReach(target)) + if (!target.IsReachableBy(controller.pawn)) controller.clear_blackboard_key(BB_BASIC_MOB_MELEE_COOLDOWN_TIMER) return AI_BEHAVIOR_INSTANT 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 index 5046baa7e0f1..c30943caf50c 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/climb_tree.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/climb_tree.dm @@ -1,6 +1,6 @@ /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) +/datum/ai_behavior/find_and_set/valid_tree/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_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 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 index 07b4845f0275..31735f99231b 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/find_parent.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/find_parent.dm @@ -4,21 +4,32 @@ /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/mom_types = controller.blackboard[mom_key] var/list/ignore_types = controller.blackboard[ignore_mom_key] if(!length(mom_types)) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED 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 (is_possible_mom(mother, mom_types, ignore_types)) + all_moms += mother if(length(all_moms)) controller.set_blackboard_key(found_mom, pick(all_moms)) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + +/datum/ai_behavior/find_mom/proc/is_possible_mom(mob/mother, list/mom_types, list/ignore_types) + if(!is_type_in_list(mother, mom_types)) + return FALSE + if(is_type_in_list(mother, ignore_types)) // so the not permanent baby and the permanent baby subtype dont followed each other + return FALSE + return TRUE + +/datum/ai_behavior/find_mom/raptor/is_possible_mom(mob/mother, list/mom_types, list/ignore_types) + . = ..() + if (!. || !istype(mother, /mob/living/basic/raptor)) + return FALSE + var/mob/living/basic/raptor/raptor = mother + return raptor.growth_stage == RAPTOR_ADULT 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 index 8effc7a0fa73..98cf1654f713 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm @@ -26,7 +26,10 @@ /datum/ai_behavior/basic_melee_attack/opportunistic/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) var/atom/movable/atom_pawn = controller.pawn - if(!atom_pawn.CanReach(controller.blackboard[target_key])) + var/atom/atom_target = controller.blackboard[target_key] + if (QDELETED(atom_target)) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + if(!atom_target.IsReachableBy(atom_pawn)) return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED . = ..() return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED diff --git a/code/datums/ai/basic_mobs/basic_subtrees/drag_items.dm b/code/datums/ai/basic_mobs/basic_subtrees/drag_items.dm index f0017a67c00e..3bdb1ab8f588 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/drag_items.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/drag_items.dm @@ -6,19 +6,19 @@ if(prob(controller.blackboard[BB_GUILTY_CONSCIOUS_CHANCE])) controller.queue_behavior(/datum/ai_behavior/stop_dragging) return - if(!controller.blackboard[BB_STEAL_CHANCE]) + if(!prob(controller.blackboard[BB_STEAL_CHANCE])) return if(!controller.blackboard_key_exists(BB_ITEM_TO_STEAL)) - controller.queue_behavior(/datum/ai_behavior/find_and_set/find_stealable, /obj/item, BB_ITEM_TO_STEAL) + controller.queue_behavior(/datum/ai_behavior/find_and_set/find_stealable, BB_ITEM_TO_STEAL, /obj/item) return - controller.queue_behavior(/datum/ai_behavior/drag_target) + controller.queue_behavior(/datum/ai_behavior/drag_target, BB_ITEM_TO_STEAL) return SUBTREE_RETURN_FINISH_PLANNING /datum/ai_behavior/find_and_set/find_stealable behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION action_cooldown = 2 MINUTES -/datum/ai_behavior/find_and_set/find_stealable/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/find_stealable/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/mob/living/living_pawn = controller.pawn var/list/possible_items = shuffle_inplace(oview(search_range, controller.pawn)) @@ -32,7 +32,7 @@ /datum/ai_behavior/stop_dragging behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION -/datum/ai_behavior/stop_dragging/perform(seconds_per_tick, datum/ai_controller/controller, target_key) +/datum/ai_behavior/stop_dragging/perform(seconds_per_tick, datum/ai_controller/controller) var/mob/living/living_pawn = controller.pawn living_pawn.stop_pulling() return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED diff --git a/code/datums/ai/basic_mobs/basic_subtrees/escape_captivity.dm b/code/datums/ai/basic_mobs/basic_subtrees/escape_captivity.dm index 9dfbfce94de8..759a5c69eb85 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/escape_captivity.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/escape_captivity.dm @@ -8,11 +8,13 @@ /datum/ai_planning_subtree/escape_captivity/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) var/mob/living/living_pawn = controller.pawn - if (living_pawn.buckled && !ismob(living_pawn.buckled)) - if (!pacifist && !living_pawn.can_hold_items() || living_pawn.usable_hands < 1) // If we don't have hands then prioritise slapping the shit out of whatever we are attached to - controller.queue_behavior(/datum/ai_behavior/break_out_of_object, living_pawn.buckled) - else + if (isobj(living_pawn.buckled)) + // we can just stand up we don't need to freak out + if (pacifist || !HAS_TRAIT(living_pawn.buckled, TRAIT_DANGEROUS_BUCKLE)) controller.queue_behavior(/datum/ai_behavior/resist) + // otherwise beat the shit out of we we gotta get out NOW + else + controller.queue_behavior(/datum/ai_behavior/break_out_of_object, living_pawn.buckled) return SUBTREE_RETURN_FINISH_PLANNING if (!isturf(living_pawn.loc) && !ismob(living_pawn.loc) && !istype(living_pawn.loc, /obj/item/mob_holder)) @@ -26,7 +28,7 @@ controller.queue_behavior(/datum/ai_behavior/break_out_of_object, contained_in) else controller.queue_behavior(/datum/ai_behavior/resist) - return SUBTREE_RETURN_FINISH_PLANNING + return SUBTREE_RETURN_FINISH_PLANNING var/mob/puller = living_pawn.pulledby if (puller && puller.grab_state > GRAB_PASSIVE) @@ -60,7 +62,7 @@ if (QDELETED(target)) return FALSE var/mob/living/pawn = controller.pawn - if (!pawn.CanReach(target)) + if (!target.IsReachableBy(pawn)) return FALSE return pawn.loc == target || pawn.buckled == target diff --git a/code/datums/ai/basic_mobs/basic_subtrees/find_parent.dm b/code/datums/ai/basic_mobs/basic_subtrees/find_parent.dm index ef44df82f78d..7b35053ff386 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/find_parent.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/find_parent.dm @@ -7,7 +7,7 @@ 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) + find_mom(controller) return if(get_dist(target, baby) > minimum_distance) @@ -23,3 +23,9 @@ controller.queue_behavior(/datum/ai_behavior/perform_emote, "dances around their parent!") return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_planning_subtree/look_for_adult/proc/find_mom(datum/ai_controller/controller) + controller.queue_behavior(/datum/ai_behavior/find_mom, BB_FIND_MOM_TYPES, BB_IGNORE_MOM_TYPES, BB_FOUND_MOM) + +/datum/ai_planning_subtree/look_for_adult/raptor/find_mom(datum/ai_controller/controller) + controller.queue_behavior(/datum/ai_behavior/find_mom/raptor, BB_FIND_MOM_TYPES, BB_FOUND_MOM) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/go_for_swim.dm b/code/datums/ai/basic_mobs/basic_subtrees/go_for_swim.dm index e6427455c4ed..ba50023567fe 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/go_for_swim.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/go_for_swim.dm @@ -28,7 +28,7 @@ ///find land if its time to get out of water, otherwise find water /datum/ai_behavior/find_and_set/swim_alternate -/datum/ai_behavior/find_and_set/swim_alternate/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/swim_alternate/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/mob/living/living_pawn = controller.pawn if(QDELETED(living_pawn)) return null 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 f80ffcc155e8..525248529615 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 @@ -1,10 +1,12 @@ /datum/ai_planning_subtree/simple_find_target /// Variable to store target in var/target_key = BB_BASIC_MOB_CURRENT_TARGET + /// Targeting strategy key to use + var/strategy_key = BB_TARGETING_STRATEGY /datum/ai_planning_subtree/simple_find_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - controller.queue_behavior(/datum/ai_behavior/find_potential_targets, target_key, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + controller.queue_behavior(/datum/ai_behavior/find_potential_targets, target_key, strategy_key, 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 @@ -21,4 +23,7 @@ /datum/ai_planning_subtree/simple_find_target/increased_range /datum/ai_planning_subtree/simple_find_target/increased_range/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - controller.queue_behavior(/datum/ai_behavior/find_potential_targets/bigger_range, target_key, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + controller.queue_behavior(/datum/ai_behavior/find_potential_targets/bigger_range, target_key, strategy_key, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + +/datum/ai_planning_subtree/simple_find_target/hunt + strategy_key = BB_HUNT_TARGETING_STRATEGY diff --git a/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm b/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm index 6848d5d323d0..227b4f2fc287 100644 --- a/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm +++ b/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm @@ -154,3 +154,6 @@ if(!istype(target) || target.has_status_effect(/datum/status_effect/gutted)) return FALSE return ..() + +/datum/targeting_strategy/basic/exact_match + check_factions_exactly = TRUE diff --git a/code/datums/ai/basic_mobs/targeting_strategies/dont_target_friends.dm b/code/datums/ai/basic_mobs/targeting_strategies/dont_target_friends.dm index 41c01ca91589..268b4ca88428 100644 --- a/code/datums/ai/basic_mobs/targeting_strategies/dont_target_friends.dm +++ b/code/datums/ai/basic_mobs/targeting_strategies/dont_target_friends.dm @@ -16,7 +16,7 @@ if(!(target.resistance_flags & INDESTRUCTIBLE)) return TRUE - if(target in living_mob.ai_controller.blackboard[BB_FRIENDS_LIST]) + if(isliving(target) && (target in living_mob.ai_controller.blackboard[BB_FRIENDS_LIST])) return FALSE return ..() diff --git a/code/datums/ai/dog/dog_controller.dm b/code/datums/ai/dog/dog_controller.dm index 215224c305c6..29cb890c3ffe 100644 --- a/code/datums/ai/dog/dog_controller.dm +++ b/code/datums/ai/dog/dog_controller.dm @@ -9,7 +9,7 @@ planning_subtrees = list( /datum/ai_planning_subtree/random_speech/dog, /datum/ai_planning_subtree/pet_planning, - /datum/ai_planning_subtree/find_and_hunt_target/find_dog_food, // DARKPACK EDIT ADD + /datum/ai_planning_subtree/find_and_hunt_target/find_dog_food, // DARKPACK EDIT ADD - NPC /datum/ai_planning_subtree/dog_harassment, ) @@ -26,7 +26,7 @@ // With tongs in hand! BB_TARGET_HELD_ITEM = /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), + BB_BABIES_CHILD_TYPES = list(/mob/living/basic/pet/dog/corgi/puppy), ) planning_subtrees = list( diff --git a/code/datums/ai/generic/find_and_set.dm b/code/datums/ai/generic/find_and_set.dm index a705c7386986..95d8106a2add 100644 --- a/code/datums/ai/generic/find_and_set.dm +++ b/code/datums/ai/generic/find_and_set.dm @@ -34,21 +34,42 @@ /** * Variant of find and set that also requires the item to be edible. checks hands too */ -/datum/ai_behavior/find_and_set/edible +/datum/ai_behavior/find_and_set/food_or_drink + var/force_find_drinks = FALSE -/datum/ai_behavior/find_and_set/edible/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/food_or_drink/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/mob/living/living_pawn = controller.pawn + var/find_drinks = force_find_drinks || controller.blackboard[BB_IGNORE_DRINKS] || FALSE - for(var/atom/held_candidate as anything in living_pawn.held_items) - if(IsEdible(held_candidate)) + for(var/atom/held_candidate in living_pawn.held_items) + if(is_food_or_drink(controller, held_candidate, find_drinks)) return held_candidate - for(var/atom/local_candidate as anything in oview(search_range, controller.pawn)) - if(IsEdible(local_candidate) && istype(local_candidate, locate_path)) + for(var/atom/local_candidate in oview(search_range, controller.pawn)) + if(is_food_or_drink(controller, local_candidate, find_drinks) && istype(local_candidate, locate_path)) return local_candidate return null +/datum/ai_behavior/find_and_set/food_or_drink/proc/is_food_or_drink(datum/ai_controller/controller, obj/item/thing, find_drinks = FALSE) + return is_food(thing) || (find_drinks && is_drink(thing)) + +/datum/ai_behavior/find_and_set/food_or_drink/proc/is_food(obj/item/thing) + if(IS_EDIBLE(thing)) + return TRUE + if(istype(thing, /obj/item/reagent_containers/cup/bowl)) + return thing.reagents.total_volume > 0 + return FALSE + +/datum/ai_behavior/find_and_set/food_or_drink/proc/is_drink(obj/item/thing) + if(istype(thing, /obj/item/reagent_containers/cup/glass)) + return thing.reagents.total_volume > 0 + return FALSE + +/datum/ai_behavior/find_and_set/food_or_drink/to_eat + +/datum/ai_behavior/find_and_set/food_or_drink/to_serve + force_find_drinks = TRUE /** * Variant of find and set that only checks in hands, search range should be excluded for this @@ -71,7 +92,7 @@ */ /datum/ai_behavior/find_and_set/in_list -/datum/ai_behavior/find_and_set/in_list/search_tactic(datum/ai_controller/controller, locate_paths, search_range) +/datum/ai_behavior/find_and_set/in_list/search_tactic(datum/ai_controller/controller, locate_paths, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/list/found = typecache_filter_list(oview(search_range, controller.pawn), locate_paths) if(length(found)) return pick(found) @@ -91,7 +112,7 @@ */ /datum/ai_behavior/find_and_set/animatable -/datum/ai_behavior/find_and_set/animatable/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/animatable/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/mob/living/living_pawn = controller.pawn var/list/nearby_items = list() @@ -112,7 +133,7 @@ */ /datum/ai_behavior/find_and_set/nearest_wall -/datum/ai_behavior/find_and_set/nearest_wall/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/nearest_wall/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/mob/living/living_pawn = controller.pawn var/list/nearby_walls = list() @@ -129,7 +150,7 @@ */ /datum/ai_behavior/find_and_set/friendly_corpses -/datum/ai_behavior/find_and_set/friendly_corpses/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/friendly_corpses/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/mob/living/living_pawn = controller.pawn var/list/nearby_bodies = list() for (var/mob/living/dead_pal in oview(search_range, controller.pawn)) @@ -151,7 +172,7 @@ */ /datum/ai_behavior/find_and_set/conscious_person -/datum/ai_behavior/find_and_set/conscious_person/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/conscious_person/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/list/customers = list() for(var/mob/living/carbon/human/target in oview(search_range, controller.pawn)) if(IS_DEAD_OR_INCAP(target) || !target.mind) @@ -166,7 +187,7 @@ /datum/ai_behavior/find_and_set/nearby_friends action_cooldown = 2 SECONDS -/datum/ai_behavior/find_and_set/nearby_friends/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/nearby_friends/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/atom/friend = locate(/mob/living/carbon/human) in oview(search_range, controller.pawn) if(isnull(friend)) @@ -179,7 +200,7 @@ /datum/ai_behavior/find_and_set/in_list/turf_types -/datum/ai_behavior/find_and_set/in_list/turf_types/search_tactic(datum/ai_controller/controller, locate_paths, search_range) +/datum/ai_behavior/find_and_set/in_list/turf_types/search_tactic(datum/ai_controller/controller, locate_paths, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/list/found = RANGE_TURFS(search_range, controller.pawn) shuffle_inplace(found) for(var/turf/possible_turf as anything in found) @@ -191,7 +212,7 @@ /datum/ai_behavior/find_and_set/in_list/closest_turf -/datum/ai_behavior/find_and_set/in_list/closest_turf/search_tactic(datum/ai_controller/controller, locate_paths, search_range) +/datum/ai_behavior/find_and_set/in_list/closest_turf/search_tactic(datum/ai_controller/controller, locate_paths, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/list/found = RANGE_TURFS(search_range, controller.pawn) for(var/turf/possible_turf as anything in found) if(!is_type_in_typecache(possible_turf, locate_paths) || !can_see(controller.pawn, possible_turf, search_range)) diff --git a/code/datums/ai/generic/generic_behaviors.dm b/code/datums/ai/generic/generic_behaviors.dm index 4339c18d7bcf..da338fa45cbd 100644 --- a/code/datums/ai/generic/generic_behaviors.dm +++ b/code/datums/ai/generic/generic_behaviors.dm @@ -86,20 +86,16 @@ var/atom/target = controller.blackboard[target_key] if(QDELETED(target)) return FALSE + if(target == controller.pawn) // this can sometimes end up as ourselves, in which case there is no reason to move + return FALSE set_movement_target(controller, target) /datum/ai_behavior/use_on_object/perform(seconds_per_tick, datum/ai_controller/controller, target_key) - var/mob/living/pawn = controller.pawn - var/obj/item/held_item = pawn.get_item_by_slot(pawn.get_active_hand()) var/atom/target = controller.blackboard[target_key] if(QDELETED(target)) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED - if(held_item) - held_item.melee_attack_chain(pawn, target) - else - controller.ai_interact(target = target, combat_mode = FALSE) - + controller.ai_interact(target = target, combat_mode = FALSE) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED /datum/ai_behavior/give @@ -118,10 +114,14 @@ if(!held_item) //if held_item is null, we pretend that action was successful return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED - if(!target || !isliving(target)) + if(QDELETED(target) || !target.IsReachableBy(pawn)) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED var/mob/living/living_target = target + if(!isliving(living_target)) // target should reasonably only ever be set to a living mob + stack_trace("Tried to give an item to a non-living target!") + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + var/perform_flags = try_to_give_item(controller, living_target, held_item) if(perform_flags & AI_BEHAVIOR_FAILED) return perform_flags @@ -161,36 +161,73 @@ target.put_in_hands(held_item) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED +/datum/ai_behavior/give/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.clear_blackboard_key(target_key) /datum/ai_behavior/consume + action_cooldown = 2 SECONDS + +/datum/ai_behavior/consume/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hunger_timer_key) + var/mob/living/living_pawn = controller.pawn + var/obj/item/target = controller.blackboard[target_key] + if(QDELETED(target) || !living_pawn.is_holding(target)) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + + controller.ai_interact(target = living_pawn, combat_mode = FALSE) + + return AI_BEHAVIOR_DELAY | (is_content(living_pawn, target) ? AI_BEHAVIOR_SUCCEEDED : AI_BEHAVIOR_FAILED) + +/datum/ai_behavior/consume/finish_action(datum/ai_controller/controller, succeeded, target_key, hunger_timer_key) + . = ..() + if(!succeeded) + return + controller.set_blackboard_key(hunger_timer_key, world.time + rand(12 SECONDS, 60 SECONDS)) + + var/mob/living/living_pawn = controller.pawn + var/obj/item/target = controller.blackboard[target_key] + if(!QDELETED(target) && !DOING_INTERACTION_WITH_TARGET(living_pawn, target)) + controller.clear_blackboard_key(target_key) + living_pawn.dropItemToGround(target) // drops empty drink glasses + for(var/obj/item/trash/trash in living_pawn.held_items) + living_pawn.dropItemToGround(trash) // drops spawned trash items + +/// Check if the target is fully consumed, or being actively consumed, or if we're just bored of eating it +/datum/ai_behavior/consume/proc/is_content(mob/living/living_pawm, obj/item/target) + if(QDELETED(target)) + return TRUE + if(DOING_INTERACTION_WITH_TARGET(living_pawm, target)) + return TRUE + if(target.reagents?.total_volume <= 0) + return TRUE + // Even if we don't finish it all we can randomly decide to be done + return prob(10) + +// navigate to target item and pick it up if we can +/datum/ai_behavior/navigate_to_and_pick_up behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH action_cooldown = 2 SECONDS -/datum/ai_behavior/consume/setup(datum/ai_controller/controller, target_key) +/datum/ai_behavior/navigate_to_and_pick_up/setup(datum/ai_controller/controller, target_key, drop_held = TRUE) . = ..() set_movement_target(controller, controller.blackboard[target_key]) -/datum/ai_behavior/consume/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hunger_timer_key) +/datum/ai_behavior/navigate_to_and_pick_up/setup(datum/ai_controller/controller, target_key, drop_held = TRUE) var/mob/living/living_pawn = controller.pawn var/obj/item/target = controller.blackboard[target_key] if(QDELETED(target)) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED - if(!(target in living_pawn.held_items)) - if(!living_pawn.get_empty_held_indexes() || !living_pawn.put_in_hands(target)) - return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED - - target.melee_attack_chain(living_pawn, living_pawn) - - if(QDELETED(target) || prob(10)) // Even if we don't finish it all we can randomly decide to be done + if(living_pawn.is_holding(target)) // already in hands return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED + if(!target.IsReachableBy(living_pawn)) // can't reach it, despite being adjacent + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + if(living_pawn.get_active_held_item()) // something is in our hands already + if(!drop_held || !living_pawn.dropItemToGround(living_pawn.get_active_held_item())) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED - return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED - -/datum/ai_behavior/consume/finish_action(datum/ai_controller/controller, succeeded, target_key, hunger_timer_key) - . = ..() - if(succeeded) - controller.set_blackboard_key(hunger_timer_key, world.time + rand(12 SECONDS, 60 SECONDS)) + controller.ai_interact(target, combat_mode = FALSE) + return AI_BEHAVIOR_DELAY | (target.loc == living_pawn ? AI_BEHAVIOR_SUCCEEDED : AI_BEHAVIOR_FAILED) /** * Drops items in hands, very important for future behaviors that require the pawn to grab stuff diff --git a/code/datums/ai/generic/generic_subtrees.dm b/code/datums/ai/generic/generic_subtrees.dm index 9d5ff8638fc9..6fe92668f916 100644 --- a/code/datums/ai/generic/generic_subtrees.dm +++ b/code/datums/ai/generic/generic_subtrees.dm @@ -53,7 +53,13 @@ * relevant blackboards: * * BB_NEXT_HUNGRY - set by this subtree, is when the controller is next hungry */ +/datum/ai_planning_subtree/generic_hunger + /datum/ai_planning_subtree/generic_hunger/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + if(living_pawn.nutrition > NUTRITION_LEVEL_HUNGRY) + return + var/next_eat = controller.blackboard[BB_NEXT_HUNGRY] if(!next_eat) //inits the blackboard timer @@ -63,16 +69,30 @@ if(world.time < next_eat) return + // find food var/atom/food_target = controller.blackboard[BB_FOOD_TARGET] - if(isnull(food_target)) - controller.queue_behavior(/datum/ai_behavior/find_and_set/edible, BB_FOOD_TARGET, /obj/item, 2) - return - - var/mob/living/living_pawn = controller.pawn - if(!length(living_pawn.get_empty_held_indexes()) && !(food_target in living_pawn.held_items)) - controller.queue_behavior(/datum/ai_behavior/drop_item) + controller.queue_behavior(/datum/ai_behavior/find_and_set/food_or_drink/to_eat, BB_FOOD_TARGET, /obj/item, 2) return SUBTREE_RETURN_FINISH_PLANNING - controller.queue_behavior(/datum/ai_behavior/consume, BB_FOOD_TARGET, BB_NEXT_HUNGRY) + if(living_pawn.is_holding(food_target)) + controller.queue_behavior(/datum/ai_behavior/consume, BB_FOOD_TARGET, BB_NEXT_HUNGRY) + // it's been moved since we found it + else if(!isturf(food_target.loc)) + // someone took it. we will fight over it! + if(isliving(food_target.loc) && will_fight_for_food(food_target.loc, living_pawn, controller)) + controller.add_blackboard_key_assoc(BB_MONKEY_ENEMIES, food_target.loc, MONKEY_FOOD_HATRED_AMOUNT) + // eh, find something else + else + controller.clear_blackboard_key(BB_FOOD_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + else + controller.queue_behavior(/datum/ai_behavior/navigate_to_and_pick_up, BB_FOOD_TARGET, TRUE) return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_planning_subtree/generic_hunger/proc/will_fight_for_food(mob/living/thief, mob/living/monkey, datum/ai_controller/controller) + if(controller.blackboard[BB_MONKEY_AGGRESSIVE]) + return TRUE + if(controller.blackboard[BB_MONKEY_TAMED]) + return FALSE + return prob(100 * ((NUTRITION_LEVEL_HUNGRY - monkey.nutrition) / NUTRITION_LEVEL_HUNGRY)) diff --git a/code/datums/ai/hunting_behavior/hunting_mouse.dm b/code/datums/ai/hunting_behavior/hunting_mouse.dm index b5c9a7743a4a..3bcee20b79ea 100644 --- a/code/datums/ai/hunting_behavior/hunting_mouse.dm +++ b/code/datums/ai/hunting_behavior/hunting_mouse.dm @@ -40,7 +40,7 @@ if (!isturf(instrument.loc) || !can_see(pawn, instrument)) controller.clear_blackboard_key(BB_SONG_INSTRUMENT) return - if (pawn.CanReach(instrument)) + if (instrument.IsReachableBy(pawn)) return controller.queue_behavior(/datum/ai_behavior/travel_towards/adjacent, BB_SONG_INSTRUMENT) return SUBTREE_RETURN_FINISH_PLANNING @@ -49,7 +49,7 @@ /datum/ai_behavior/find_and_set/piano_synth // Disinclude subtypes -/datum/ai_behavior/find_and_set/piano_synth/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/piano_synth/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) for(var/obj/item/instrument/piano_synth/synth in oview(search_range, controller.pawn)) if(synth.type == /obj/item/instrument/piano_synth) return synth diff --git a/code/datums/ai/monkey/monkey_behaviors.dm b/code/datums/ai/monkey/monkey_behaviors.dm index ef49de98823d..01dd0b61449d 100644 --- a/code/datums/ai/monkey/monkey_behaviors.dm +++ b/code/datums/ai/monkey/monkey_behaviors.dm @@ -87,7 +87,7 @@ var/success = FALSE - if(do_after(living_pawn, MONKEY_ITEM_SNATCH_DELAY, victim) && target && living_pawn.CanReach(victim)) + if(do_after(living_pawn, MONKEY_ITEM_SNATCH_DELAY, victim) && target && victim.IsReachableBy(living_pawn)) for(var/obj/item/I in victim.held_items) if(I == target) @@ -195,7 +195,7 @@ //look for any potential weapons we're holding var/obj/item/potential_weapon = locate() in living_pawn.held_items - if(!living_pawn.CanReach(target, potential_weapon)) + if(!target.IsReachableBy(living_pawn, potential_weapon?.reach)) return FALSE if(isnull(potential_weapon)) diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm index 4c778f661220..18bdb0be26b0 100644 --- a/code/datums/ai/monkey/monkey_controller.dm +++ b/code/datums/ai/monkey/monkey_controller.dm @@ -25,14 +25,19 @@ have ways of interacting with a specific mob and control it. BB_MONKEY_GUN_NEURONS_ACTIVATED = FALSE, BB_SONG_LINES = MONKEY_SONG, BB_RESISTING = FALSE, + BB_MONKEY_GIVE_CHANCE = 5, ) idle_behavior = /datum/idle_behavior/idle_monkey /datum/targeting_strategy/basic/monkey /datum/targeting_strategy/basic/monkey/faction_check(datum/ai_controller/controller, mob/living/living_mob, mob/living/the_target) + // if they wronged us, all bets are off if(controller.blackboard[BB_MONKEY_ENEMIES][the_target]) return FALSE + // target was forcibly set, all bets are off again + if(controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] == the_target) + return FALSE return ..() /datum/ai_controller/monkey/process(seconds_per_tick) @@ -59,12 +64,24 @@ have ways of interacting with a specific mob and control it. planning_subtrees = list( /datum/ai_planning_subtree/generic_resist, /datum/ai_planning_subtree/monkey_combat, + /datum/ai_planning_subtree/serve_food, /datum/ai_planning_subtree/generic_hunger, /datum/ai_planning_subtree/generic_play_instrument, - /datum/ai_planning_subtree/punpun_shenanigans, + /datum/ai_planning_subtree/monkey_shenanigans, ) idle_behavior = /datum/idle_behavior/idle_monkey/pun_pun +/datum/ai_controller/monkey/pun_pun/TryPossessPawn(atom/new_pawn) + . = ..() + if(. & AI_CONTROLLER_INCOMPATIBLE) + return + pawn = new_pawn + set_blackboard_key(BB_IGNORE_DRINKS, TRUE) + set_blackboard_key(BB_MONKEY_TAMED, TRUE) + set_blackboard_key(BB_MONKEY_GIVE_CHANCE, 30) + set_blackboard_key(BB_MONKEY_PRESS_TYPEPATH, /obj/structure/desk_bell) + set_trip_mode(mode = FALSE) + /datum/ai_controller/monkey/angry /datum/ai_controller/monkey/angry/TryPossessPawn(atom/new_pawn) diff --git a/code/datums/ai/monkey/monkey_subtrees.dm b/code/datums/ai/monkey/monkey_subtrees.dm index 1210fe44ba11..dc8793ffdfed 100644 --- a/code/datums/ai/monkey/monkey_subtrees.dm +++ b/code/datums/ai/monkey/monkey_subtrees.dm @@ -7,21 +7,22 @@ return if(!controller.blackboard[BB_MONKEY_CURRENT_PRESS_TARGET]) - controller.queue_behavior(/datum/ai_behavior/find_nearby, BB_MONKEY_CURRENT_PRESS_TARGET) - return - - if(prob(50)) + if(controller.blackboard[BB_MONKEY_PRESS_TYPEPATH]) + controller.queue_behavior(/datum/ai_behavior/find_and_set, BB_MONKEY_CURRENT_PRESS_TARGET, controller.blackboard[BB_MONKEY_PRESS_TYPEPATH], 2) + else + controller.queue_behavior(/datum/ai_behavior/find_nearby, BB_MONKEY_CURRENT_PRESS_TARGET) + else if(prob(50)) controller.queue_behavior(/datum/ai_behavior/use_on_object, BB_MONKEY_CURRENT_PRESS_TARGET) return SUBTREE_RETURN_FINISH_PLANNING if(!controller.blackboard[BB_MONKEY_CURRENT_GIVE_TARGET]) - controller.queue_behavior(/datum/ai_behavior/find_and_set/pawn_must_hold_item, BB_MONKEY_CURRENT_GIVE_TARGET, /mob/living, 2) - else - if(prob(5)) - controller.queue_behavior(/datum/ai_behavior/give, BB_MONKEY_CURRENT_GIVE_TARGET) - return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_and_set/pawn_must_hold_item, BB_MONKEY_CURRENT_GIVE_TARGET, /mob/living/carbon/human, 2) + else if(prob(controller.blackboard[BB_MONKEY_GIVE_CHANCE])) + controller.queue_behavior(/datum/ai_behavior/give, BB_MONKEY_CURRENT_GIVE_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING - controller.TryFindWeapon() + if(!controller.blackboard[BB_MONKEY_TAMED]) + controller.TryFindWeapon() ///monkey combat subtree. /datum/ai_planning_subtree/monkey_combat/SelectBehaviors(datum/ai_controller/monkey/controller, seconds_per_tick) @@ -55,7 +56,8 @@ controller.queue_behavior(/datum/ai_behavior/recruit_monkeys, BB_MONKEY_CURRENT_ATTACK_TARGET) return - controller.queue_behavior(/datum/ai_behavior/battle_screech/monkey) + if(SPT_PROB(ismonkey(living_pawn) ? 25 : 10, seconds_per_tick)) + controller.queue_behavior(/datum/ai_behavior/battle_screech/monkey) controller.queue_behavior(/datum/ai_behavior/monkey_attack_mob, BB_MONKEY_CURRENT_ATTACK_TARGET) return SUBTREE_RETURN_FINISH_PLANNING @@ -69,3 +71,42 @@ controller.queue_behavior(/datum/ai_behavior/disposal_mob, BB_MONKEY_CURRENT_ATTACK_TARGET, BB_MONKEY_TARGET_DISPOSAL) return SUBTREE_RETURN_FINISH_PLANNING + +/// Finds food or drinks, picks them up, then gives them to nearby humans +/datum/ai_planning_subtree/serve_food + +/datum/ai_planning_subtree/serve_food/SelectBehaviors(datum/ai_controller/monkey/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + var/list/nearby_patrons = list() + for(var/mob/living/carbon/human/human_mob in oview(5, living_pawn)) + if(istype(human_mob.mind?.assigned_role, /datum/job/bartender)) + return // my boss is on duty! + if(human_mob.stat != CONSCIOUS || ismonkey(human_mob)) + continue + if(!human_mob.get_empty_held_indexes()) + continue + nearby_patrons += human_mob + + // Need at least 2 patrons to bother serving (bearing in mind the + if(length(nearby_patrons) < 1) + return + + var/obj/item/serving = controller.blackboard[BB_MONKEY_CURRENT_SERVED_ITEM] + if(QDELETED(serving) || serving.reagents.total_volume <= 0) + controller.queue_behavior(/datum/ai_behavior/find_and_set/food_or_drink/to_serve, BB_MONKEY_CURRENT_SERVED_ITEM, /obj/item, 2) + return + + // we have something to serve, pick a patron and go hand it over + if(living_pawn.is_holding(serving)) + controller.blackboard[BB_MONKEY_CURRENT_GIVE_TARGET] ||= pick(nearby_patrons) + controller.queue_behavior(/datum/ai_behavior/give, BB_MONKEY_CURRENT_GIVE_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + + // we have something to serve but aren't holding it yet + if(isturf(serving.loc)) + // fetch the drink + controller.queue_behavior(/datum/ai_behavior/navigate_to_and_pick_up, BB_MONKEY_CURRENT_SERVED_ITEM, TRUE) + else + // give up on the dream + controller.clear_blackboard_key(BB_MONKEY_CURRENT_SERVED_ITEM) + return SUBTREE_RETURN_FINISH_PLANNING diff --git a/code/datums/ai/monkey/punpun_subtrees.dm b/code/datums/ai/monkey/punpun_subtrees.dm deleted file mode 100644 index 6370393db001..000000000000 --- a/code/datums/ai/monkey/punpun_subtrees.dm +++ /dev/null @@ -1,22 +0,0 @@ -/datum/ai_planning_subtree/punpun_shenanigans/SelectBehaviors(datum/ai_controller/monkey/controller, seconds_per_tick) - - controller.set_trip_mode(mode = FALSE) // pun pun doesn't fuck around - - if(prob(5)) - controller.queue_behavior(/datum/ai_behavior/use_in_hand) - - if(!SPT_PROB(MONKEY_SHENANIGAN_PROB, seconds_per_tick)) - return - - if(!controller.blackboard[BB_MONKEY_CURRENT_PRESS_TARGET]) - controller.queue_behavior(/datum/ai_behavior/find_and_set, BB_MONKEY_CURRENT_PRESS_TARGET, /obj/structure/desk_bell, 2) - else if(prob(50)) - controller.queue_behavior(/datum/ai_behavior/use_on_object, BB_MONKEY_CURRENT_PRESS_TARGET) - return SUBTREE_RETURN_FINISH_PLANNING - - if(!controller.blackboard[BB_MONKEY_CURRENT_GIVE_TARGET]) - controller.queue_behavior(/datum/ai_behavior/find_and_set/pawn_must_hold_item, BB_MONKEY_CURRENT_GIVE_TARGET, /mob/living, 2) - else if(prob(30)) - controller.queue_behavior(/datum/ai_behavior/give, BB_MONKEY_CURRENT_GIVE_TARGET) - return SUBTREE_RETURN_FINISH_PLANNING - diff --git a/code/datums/ai/movement/ai_movement_jps.dm b/code/datums/ai/movement/ai_movement_jps.dm index 3781dd7f5dc7..1153833a31ee 100644 --- a/code/datums/ai/movement/ai_movement_jps.dm +++ b/code/datums/ai/movement/ai_movement_jps.dm @@ -53,6 +53,3 @@ /datum/ai_movement/jps/bot/travel_to_beacon maximum_length = AI_BOT_PATH_LENGTH max_pathing_attempts = 10 - -/datum/ai_movement/jps/modsuit - maximum_length = MOD_AI_RANGE diff --git a/code/datums/ai/objects/mod.dm b/code/datums/ai/objects/mod.dm deleted file mode 100644 index 46b41adb1c87..000000000000 --- a/code/datums/ai/objects/mod.dm +++ /dev/null @@ -1,48 +0,0 @@ -/// An AI controller for the MODsuit pathfinder module. It's activated by module and attaches itself to the user. -/datum/ai_controller/mod - blackboard = list( - BB_MOD_TARGET, - BB_MOD_MODULE, - ) - can_idle = FALSE - max_target_distance = MOD_AI_RANGE //a little spicy but its one specific item that summons it, and it doesn't run otherwise - ai_movement = /datum/ai_movement/jps/modsuit - ///ID card generated from the suit's required access. Used for pathing. - var/obj/item/card/id/advanced/id_card - -/datum/ai_controller/mod/TryPossessPawn(atom/new_pawn) - if(!istype(new_pawn, /obj/item/mod/control)) - return AI_CONTROLLER_INCOMPATIBLE - var/obj/item/mod/control/mod = new_pawn - id_card = new /obj/item/card/id/advanced/simple_bot() - if(length(mod.req_access)) - id_card.set_access(mod.req_access) - return ..() //Run parent at end - -/datum/ai_controller/mod/UnpossessPawn(destroy) - QDEL_NULL(id_card) - return ..() //Run parent at end - -/datum/ai_controller/mod/SelectBehaviors(seconds_per_tick) - current_behaviors = list() - if(blackboard[BB_MOD_TARGET] && blackboard[BB_MOD_MODULE]) - queue_behavior(/datum/ai_behavior/mod_attach) - -/datum/ai_controller/mod/get_access() - return id_card.GetAccess() - -/datum/ai_behavior/mod_attach - behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT|AI_BEHAVIOR_MOVE_AND_PERFORM - -/datum/ai_behavior/mod_attach/perform(seconds_per_tick, datum/ai_controller/controller) - if(!controller.pawn.Adjacent(controller.blackboard[BB_MOD_TARGET])) - return AI_BEHAVIOR_DELAY - var/obj/item/mod/module/pathfinder/module = controller.blackboard[BB_MOD_MODULE] - module.attach(controller.blackboard[BB_MOD_TARGET]) - return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED - -/datum/ai_behavior/mod_attach/finish_action(datum/ai_controller/controller, succeeded) - . = ..() - controller.clear_blackboard_key(BB_MOD_TARGET) - var/obj/item/mod/module/pathfinder/module = controller.blackboard[BB_MOD_MODULE] - module.end_recall(succeeded) diff --git a/code/datums/alarm.dm b/code/datums/alarm.dm index 27125efbc9c1..52788e41dacf 100644 --- a/code/datums/alarm.dm +++ b/code/datums/alarm.dm @@ -14,7 +14,7 @@ ///Represents a single source of alarms, one alarm handler will only ever count for one alarm per listener /datum/alarm_handler ///A list of alarm type -> list of areas we currently have alarms in - var/list/sent_alarms = list() + var/list/sent_alarms ///Our source atom var/atom/source_atom @@ -27,8 +27,8 @@ return ..() /datum/alarm_handler/Destroy() - for(var/alarm_type in sent_alarms) - for(var/area/area_to_clear as anything in sent_alarms[alarm_type]) + for(var/alarm_type, sent_alarm in sent_alarms) + for(var/area/area_to_clear as anything in sent_alarm) //Yeet all connected alarms clear_alarm_from_area(alarm_type, area_to_clear) source_atom = null @@ -46,13 +46,13 @@ var/area/our_area = get_area(use_as_source_atom) var/our_z_level = use_as_source_atom.z - var/list/existing_alarms = sent_alarms[alarm_type] + var/list/existing_alarms = LAZYACCESS(sent_alarms, alarm_type) if(existing_alarms) if(our_area in existing_alarms) return FALSE else - sent_alarms[alarm_type] = list() - existing_alarms = sent_alarms[alarm_type] + LAZYSET(sent_alarms, alarm_type, list()) + existing_alarms = sent_alarms[alarm_type] // List will definitely exist because of previous line, no need for lazy macro existing_alarms += our_area @@ -76,16 +76,16 @@ ///Exists so we can request that the alarms from an area are cleared, even if our source atom is no longer in that area /datum/alarm_handler/proc/clear_alarm_from_area(alarm_type, area/our_area) - var/list/existing_alarms = sent_alarms[alarm_type] - if(!existing_alarms) + var/list/existing_alarms = LAZYACCESS(sent_alarms, alarm_type) + if(isnull(existing_alarms)) return FALSE if(!(our_area in existing_alarms)) return FALSE - existing_alarms -= our_area - if(!length(existing_alarms)) - sent_alarms -= alarm_type + LAZYREMOVE(existing_alarms, our_area) + if(!LAZYLEN(existing_alarms)) + LAZYREMOVE(sent_alarms, alarm_type) our_area.active_alarms[alarm_type] -= 1 if(!length(our_area.active_alarms)) diff --git a/code/datums/announcers/default_announcer.dm b/code/datums/announcers/default_announcer.dm index bf24f611af84..68e899922918 100644 --- a/code/datums/announcers/default_announcer.dm +++ b/code/datums/announcers/default_announcer.dm @@ -1,5 +1,5 @@ /datum/centcom_announcer/default - welcome_sounds = list('sound/announcer/default/welcome.ogg') + welcome_sounds = list('modular_darkpack/master_files/sounds/announce.ogg') // DARKPACK EDIT CHANGE alert_sounds = list('sound/announcer/default/attention.ogg') command_report_sounds = list('sound/announcer/default/commandreport.ogg') event_sounds = list(ANNOUNCER_AIMALF = 'sound/announcer/default/aimalf.ogg', diff --git a/code/datums/bodypart_overlays/emote_bodypart_overlay.dm b/code/datums/bodypart_overlays/emote_bodypart_overlay.dm index cabb10558a05..fbdea6018395 100644 --- a/code/datums/bodypart_overlays/emote_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/emote_bodypart_overlay.dm @@ -39,11 +39,13 @@ * * Returns the given overlay, which can be deleted to stop displaying it. Will return null if no bodypart matching the overlay's attached_body_zone field can be found. */ -/mob/living/carbon/human/proc/give_emote_overlay(overlay_typepath) - var/datum/bodypart_overlay/simple/emote/overlay = new overlay_typepath() - var/obj/item/bodypart/bodypart = src.get_bodypart(overlay.attached_body_zone) +/mob/living/carbon/human/proc/give_emote_overlay(datum/bodypart_overlay/simple/emote/overlay_typepath) + var/obj/item/bodypart/bodypart = get_bodypart(overlay_typepath::attached_body_zone) if(!bodypart) return null + if(locate(overlay_typepath) in bodypart.bodypart_overlays) + return null + var/datum/bodypart_overlay/simple/emote/overlay = new overlay_typepath() bodypart.add_bodypart_overlay(overlay) return overlay diff --git a/code/datums/bodypart_overlays/markings_bodypart_overlay.dm b/code/datums/bodypart_overlays/markings_bodypart_overlay.dm index 5cd5eb3cedc8..ed02a96ca0fe 100644 --- a/code/datums/bodypart_overlays/markings_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/markings_bodypart_overlay.dm @@ -42,15 +42,12 @@ var/gender_string = (use_gender && limb.is_dimorphic) ? (limb.gender == MALE ? MALE : FEMALE + "_") : "" //we only got male and female sprites return mutable_appearance(icon, gender_string + icon_state + "_" + limb.body_zone, layer = layer) +/datum/bodypart_overlay/simple/body_marking/get_accessory(name) + return SSaccessories.feature_list[dna_feature_key][name] + /datum/bodypart_overlay/simple/body_marking/moth dna_feature_key = FEATURE_MOTH_MARKINGS -/datum/bodypart_overlay/simple/body_marking/moth/get_accessory(name) - return SSaccessories.moth_markings_list[name] - /datum/bodypart_overlay/simple/body_marking/lizard dna_feature_key = FEATURE_LIZARD_MARKINGS applies_to = list(/obj/item/bodypart/chest) - -/datum/bodypart_overlay/simple/body_marking/lizard/get_accessory(name) - return SSaccessories.lizard_markings_list[name] diff --git a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm index f34fa2fa255d..40b303b1a4f0 100644 --- a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm @@ -33,9 +33,10 @@ stack_trace("adding a [parent.type] to a [receiver.type] when it shouldn't be!") if(imprint_on_next_insertion) //We only want this set *once* - var/feature_name = receiver.dna.features[feature_key] + var/feature_name = receiver.dna.features[feature_key] || receiver.dna.species.mutant_organs[parent.type] if (isnull(feature_name)) - feature_name = receiver.dna.species.mutant_organs[parent.type] + stack_trace("[type] has no default feature name for organ [parent.type]!") + feature_name = get_consistent_feature_entry(get_global_feature_list()) //fallback to something set_appearance_from_name(feature_name) imprint_on_next_insertion = FALSE @@ -118,7 +119,11 @@ ///Return a dumb glob list for this specific feature (called from parse_sprite) /datum/bodypart_overlay/mutant/proc/get_global_feature_list() - CRASH("External organ has no feature list, it will render invisible") + var/list/feature_list = SSaccessories.feature_list[feature_key] + if(isnull(feature_list)) + stack_trace("External organ has no feature list, it will render invisible") + return list() + return feature_list ///Give the organ its color. Force will override the existing one. /datum/bodypart_overlay/mutant/proc/inherit_color(obj/item/bodypart/bodypart_owner, force) diff --git a/code/datums/brain_damage/brain_trauma.dm b/code/datums/brain_damage/brain_trauma.dm index 3c7f5ce7aec0..9d1caff55f68 100644 --- a/code/datums/brain_damage/brain_trauma.dm +++ b/code/datums/brain_damage/brain_trauma.dm @@ -8,14 +8,22 @@ abstract_type = /datum/brain_trauma var/name = "Brain Trauma" var/desc = "A trauma caused by brain damage, which causes issues to the patient." - var/scan_desc = "generic brain trauma" //description when detected by a health scanner - var/mob/living/carbon/owner //the poor bastard - var/obj/item/organ/brain/brain //the poor bastard's brain + /// Description when detected by a health scanner + var/scan_desc = "generic brain trauma" + /// The poor bastard + var/mob/living/carbon/owner + /// The poor bastard's brain + var/obj/item/organ/brain/brain + /// Message sent in chat when trauma is gained var/gain_text = span_notice("You feel traumatized.") + /// Message sent in chat when trauma is lost var/lose_text = span_notice("You no longer feel traumatized.") + /// If the trauma can be gained, checked in can_gain_trauma var/can_gain = TRUE - var/random_gain = TRUE //can this be gained through random traumas? - var/resilience = TRAUMA_RESILIENCE_BASIC //how hard is this to cure? + /// If this trauma can be gained randomly + var/random_gain = TRUE + /// How hard is this to cure? + var/resilience = TRAUMA_RESILIENCE_BASIC /datum/brain_trauma/Destroy() // Handles our references with our brain diff --git a/code/datums/brain_damage/creepy_trauma.dm b/code/datums/brain_damage/creepy_trauma.dm index 99cbaab630d0..cc5cac5fd38e 100644 --- a/code/datums/brain_damage/creepy_trauma.dm +++ b/code/datums/brain_damage/creepy_trauma.dm @@ -34,6 +34,7 @@ antagonist.greet() log_game("[key_name(antagonist)] has developed an obsession with [key_name(obsession)].") RegisterSignal(owner, COMSIG_CARBON_HELPED, PROC_REF(on_hug)) + ADD_TRAIT(owner, TRAIT_DESENSITIZED, REF(src)) /datum/brain_trauma/special/obsessed/on_life(seconds_per_tick, times_fired) if(!obsession || obsession.stat == DEAD) @@ -71,6 +72,7 @@ if(obsession) log_game("[key_name(owner)] is no longer obsessed with [key_name(obsession)].") UnregisterSignal(obsession, COMSIG_MOB_EYECONTACT) + REMOVE_TRAIT(owner, TRAIT_DESENSITIZED, REF(src)) /datum/brain_trauma/special/obsessed/handle_speech(datum/source, list/speech_args) if(!viewing) @@ -102,7 +104,7 @@ if(41 to 80) INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "pale") shake_camera(owner, 15, 1) - owner.adjustStaminaLoss(70) + owner.adjust_stamina_loss(70) to_chat(owner, span_userdanger("You feel your heart lurching in your chest...")) if(81 to 100) INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "cough") diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 2c99da7c6f05..05e56a445693 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -216,7 +216,7 @@ owner.imaginary_group -= src return ..() -/mob/eye/imaginary_friend/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, freq_name, freq_color, list/spans, list/message_mods = list(), message_range) +/mob/eye/imaginary_friend/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, freq_name, freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /mob/eye/imaginary_friend/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, freq_name, freq_color, list/spans, list/message_mods = list(), message_range) 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, freq_name, freq_color, spans, message_mods)) diff --git a/code/datums/brain_damage/magic.dm b/code/datums/brain_damage/magic.dm index d0026703c135..d15296baa224 100644 --- a/code/datums/brain_damage/magic.dm +++ b/code/datums/brain_damage/magic.dm @@ -74,8 +74,12 @@ scan_desc = "extra-sensory paranoia" gain_text = span_warning("You feel like something wants to kill you...") lose_text = span_notice("You no longer feel eyes on your back.") + /// Type of stalker that is chasing us + var/stalker_type = /obj/effect/client_image_holder/stalker_phantom + /// Reference to the stalker that is chasing us var/obj/effect/client_image_holder/stalker_phantom/stalker - var/close_stalker = FALSE //For heartbeat + /// Plays a sound when the stalker is near their victim + var/close_stalker = FALSE /datum/brain_trauma/magic/stalker/Destroy() QDEL_NULL(stalker) @@ -87,7 +91,7 @@ /datum/brain_trauma/magic/stalker/proc/create_stalker() var/turf/stalker_source = locate(owner.x + pick(-12, 12), owner.y + pick(-12, 12), owner.z) //random corner - stalker = new(stalker_source, owner) + stalker = new stalker_type(stalker_source, owner) /datum/brain_trauma/magic/stalker/on_lose() QDEL_NULL(stalker) @@ -125,3 +129,12 @@ desc = "It's coming closer..." image_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' image_state = "curseblob" + +// Heretic subtype that replaces the ghost guy with a stargazer +/datum/brain_trauma/magic/stalker/cosmic + stalker_type = /obj/effect/client_image_holder/stalker_phantom/cosmic + random_gain = FALSE + +/obj/effect/client_image_holder/stalker_phantom/cosmic + image_icon = 'icons/mob/nonhuman-player/96x96eldritch_mobs.dmi' + image_state = "star_gazer" diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index ffdabc0adf70..81c589d33897 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -125,7 +125,7 @@ return ..() /datum/brain_trauma/mild/healthy/on_life(seconds_per_tick, times_fired) - owner.adjustStaminaLoss(-6 * seconds_per_tick) //no pain, no fatigue + owner.adjust_stamina_loss(-6 * seconds_per_tick) //no pain, no fatigue /datum/brain_trauma/mild/healthy/on_lose() owner.remove_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) @@ -155,7 +155,7 @@ else if(SPT_PROB(1.5, seconds_per_tick)) to_chat(owner, span_warning("You feel a sudden weakness in your muscles!")) - owner.adjustStaminaLoss(50) + owner.adjust_stamina_loss(50) ..() /datum/brain_trauma/mild/muscle_spasms @@ -217,7 +217,7 @@ word = copytext(word, 1, suffix_foundon) word = html_decode(word) - if(GLOB.most_common_words[LOWER_TEXT(word)]) + if(GLOB.most_common_words_alphabetical[LOWER_TEXT(word)]) new_message += word + suffix else if(prob(30) && message_split.len > 2) diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index 4703750cd01f..3662fc74073f 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -4,21 +4,12 @@ scan_desc = "phobia" gain_text = span_warning("You start finding default values very unnerving...") lose_text = span_notice("You no longer feel afraid of default values.") + /// What do we fear exactly? var/phobia_type - /// Cooldown for proximity checks so we don't spam a range 7 view every two seconds. - COOLDOWN_DECLARE(check_cooldown) - /// Cooldown for freakouts to prevent permastunning. - COOLDOWN_DECLARE(scare_cooldown) - - ///What mood event to apply when we see the thing & freak out. - var/datum/mood_event/mood_event_type = /datum/mood_event/phobia - - var/regex/trigger_regex - //instead of cycling every atom, only cycle the relevant types - var/list/trigger_mobs - var/list/trigger_objs //also checked in mob equipment - var/list/trigger_turfs - var/list/trigger_species + /// Specific terror handler to apply, in case we want + var/terror_handler = /datum/terror_handler/phobia_source + /// What mood event to apply when we see the thing & freak out. + var/mood_event_type = /datum/mood_event/phobia /datum/brain_trauma/mild/phobia/New(new_phobia_type) if(new_phobia_type) @@ -30,132 +21,22 @@ gain_text = span_warning("You start finding [phobia_type] very unnerving...") lose_text = span_notice("You no longer feel afraid of [phobia_type].") scan_desc += " of [phobia_type]" - trigger_regex = GLOB.phobia_regexes[phobia_type] - trigger_mobs = GLOB.phobia_mobs[phobia_type] - trigger_objs = GLOB.phobia_objs[phobia_type] - trigger_turfs = GLOB.phobia_turfs[phobia_type] - trigger_species = GLOB.phobia_species[phobia_type] - ..() - -/datum/brain_trauma/mild/phobia/on_lose(silent) - owner.clear_mood_event("phobia_[phobia_type]") return ..() -/datum/brain_trauma/mild/phobia/on_life(seconds_per_tick, times_fired) - ..() - if(HAS_TRAIT(owner, TRAIT_FEARLESS)) - return - if(owner.is_blind()) - return - - if(!COOLDOWN_FINISHED(src, check_cooldown) || !COOLDOWN_FINISHED(src, scare_cooldown)) - return - - COOLDOWN_START(src, check_cooldown, 5 SECONDS) - var/list/seen_atoms = view(7, owner) - if(LAZYLEN(trigger_objs)) - for(var/obj/seen_item in seen_atoms) - if(is_scary_item(seen_item)) - freak_out(seen_item) - return - - if(LAZYLEN(trigger_turfs)) - for(var/turf/checked in seen_atoms) - if(is_type_in_typecache(checked, trigger_turfs)) - freak_out(checked) - return - - seen_atoms -= owner //make sure they aren't afraid of themselves. - if(LAZYLEN(trigger_mobs) || LAZYLEN(trigger_species) || LAZYLEN(trigger_objs)) - for(var/mob/living/checked in seen_atoms) - if (is_scary_mob(checked)) - freak_out(checked) - return - -/// Returns true if this item should be scary to us -/datum/brain_trauma/mild/phobia/proc/is_scary_item(obj/checked) - if (QDELETED(checked) || !is_type_in_typecache(checked, trigger_objs) || checked.invisibility > owner.see_invisible) - return FALSE - if (!isitem(checked)) - return TRUE - var/obj/item/checked_item = checked - return !HAS_TRAIT(checked_item, TRAIT_EXAMINE_SKIP) - -/datum/brain_trauma/mild/phobia/proc/is_scary_mob(mob/living/checked) - if(is_type_in_typecache(checked, trigger_mobs)) - return TRUE - - if (!ishuman(checked)) - return FALSE - - var/mob/living/carbon/human/as_human = checked - if (LAZYLEN(trigger_species)) - if (is_type_in_typecache(as_human.dna?.species, trigger_species)) - return TRUE - - if (!LAZYLEN(trigger_objs)) - return FALSE - - for(var/obj/item/equipped as anything in as_human.get_visible_items()) - if(is_scary_item(equipped)) - return TRUE - - return FALSE +/datum/brain_trauma/mild/phobia/on_gain() + . = ..() + var/datum/component/fearful/fear = owner.AddComponentFrom(REF(src), /datum/component/fearful, list(/datum/terror_handler/startle)) + var/datum/terror_handler/phobia_source/phobia = fear.add_handler(terror_handler, REF(src)) + phobia.trigger_regex = GLOB.phobia_regexes[phobia_type] + phobia.trigger_mobs = GLOB.phobia_mobs[phobia_type] + phobia.trigger_objs = GLOB.phobia_objs[phobia_type] + phobia.trigger_turfs = GLOB.phobia_turfs[phobia_type] + phobia.trigger_species = GLOB.phobia_species[phobia_type] + phobia.mood_event_type = mood_event_type -/datum/brain_trauma/mild/phobia/handle_hearing(datum/source, list/hearing_args) - if(!owner.can_hear() || owner == hearing_args[HEARING_SPEAKER] || !owner.has_language(hearing_args[HEARING_LANGUAGE])) //words can't trigger you if you can't hear them *taps head* - return - - if(HAS_TRAIT(owner, TRAIT_FEARLESS) || !COOLDOWN_FINISHED(src, scare_cooldown)) - return - - if(trigger_regex.Find(hearing_args[HEARING_RAW_MESSAGE]) != 0) - addtimer(CALLBACK(src, PROC_REF(freak_out), null, trigger_regex.group[2]), 1 SECONDS) //to react AFTER the chat message - hearing_args[HEARING_RAW_MESSAGE] = trigger_regex.Replace(hearing_args[HEARING_RAW_MESSAGE], "[span_phobia("$2")]$3") - -/datum/brain_trauma/mild/phobia/handle_speech(datum/source, list/speech_args) - if (HAS_TRAIT(owner, TRAIT_FEARLESS)) - return - if (trigger_regex.Find(speech_args[SPEECH_MESSAGE]) == 0) - return - - var/stutter = prob(50) - var/whisper = prob(30) - - if (!stutter && !whisper) - return - - if (whisper) - speech_args[SPEECH_SPANS] |= SPAN_SMALL_VOICE - if (stutter) - owner.set_stutter_if_lower(4 SECONDS) - to_chat(owner, span_warning("You struggle to say the word \"[span_phobia("[trigger_regex.group[2]]")]\"!")) - -/datum/brain_trauma/mild/phobia/proc/freak_out(atom/reason, trigger_word) - if(owner.stat == DEAD) - 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(trigger_word) - if (owner.has_status_effect(/datum/status_effect/minor_phobia_reaction)) - return - to_chat(owner, span_userdanger("Hearing [span_phobia(trigger_word)] [message]!")) - owner.apply_status_effect(/datum/status_effect/minor_phobia_reaction) - return - - COOLDOWN_START(src, scare_cooldown, 12 SECONDS) - if(mood_event_type) - owner.add_mood_event("phobia_[phobia_type]", mood_event_type) - - if(reason) - to_chat(owner, span_userdanger("Seeing [span_phobia(reason.name)] [message]!")) - else - to_chat(owner, span_userdanger("Something [message]!")) - - if(reason) - owner.face_atom(reason) - owner._pointed(reason) - owner.apply_status_effect(/datum/status_effect/stacking/phobia_reaction, 1, mood_event_type) +/datum/brain_trauma/mild/phobia/on_lose(silent) + . = ..() + owner.RemoveComponentSource(REF(src), /datum/component/fearful) // Defined phobia types for badminry, not included in the RNG trauma pool to avoid diluting. @@ -178,11 +59,7 @@ /datum/brain_trauma/mild/phobia/blood phobia_type = "blood" random_gain = FALSE - -/datum/brain_trauma/mild/phobia/blood/is_scary_item(obj/checked) - if (GET_ATOM_BLOOD_DNA_LENGTH(checked)) - return TRUE - return ..() + terror_handler = /datum/terror_handler/phobia_source/blood /datum/brain_trauma/mild/phobia/clowns phobia_type = "clowns" diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 57cfae25cf5e..16289a58fe5b 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -204,7 +204,6 @@ scan_desc = "monophobia" gain_text = span_warning("You feel really lonely...") lose_text = span_notice("You feel like you could be safe on your own.") - var/stress = 0 /datum/brain_trauma/severe/monophobia/on_gain() . = ..() @@ -356,7 +355,7 @@ stealables += potential_stealable for(var/obj/item/stealable as anything in shuffle(stealables)) - if(!owner.CanReach(stealable, view_only = TRUE) || stealable.IsObscured()) + if(!stealable.IsReachableBy(owner) || stealable.IsObscured()) continue // Try to do a raw click on the item with one of our empty hands, to pick it up (duh) owner.log_message("attempted to pick up (kleptomania)", LOG_ATTACK, color = "orange") diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index b27335ce3fb2..d5e5157c1c10 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -392,7 +392,7 @@ if(get_dist(owner, beepsky) <= 1) owner.playsound_local(owner, 'sound/items/weapons/egloves.ogg', 50) owner.visible_message(span_warning("[owner]'s body jerks as if it was shocked."), span_userdanger("You feel the fist of the LAW.")) - owner.adjustStaminaLoss(rand(40, 70)) + owner.adjust_stamina_loss(rand(40, 70)) QDEL_NULL(beepsky) if(prob(20) && get_dist(owner, beepsky) <= 8) @@ -463,12 +463,14 @@ owner.add_mood_event("combat_ptsd", /datum/mood_event/desentized) owner.mob_mood?.mood_modifier -= 1 //Basically nothing can change your mood owner.mob_mood?.sanity_level = SANITY_DISTURBED //Makes sanity on a unstable level unless cured + ADD_TRAIT(owner, TRAIT_DESENSITIZED, REF(src)) . = ..() /datum/brain_trauma/special/ptsd/on_lose() owner.clear_mood_event("combat_ptsd") owner.mob_mood?.mood_modifier += 1 owner.mob_mood?.sanity_level = SANITY_GREAT + REMOVE_TRAIT(owner, TRAIT_DESENSITIZED, REF(src)) return ..() /datum/brain_trauma/special/primal_instincts diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index f1d58ccb3421..0fb56079a966 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -15,8 +15,6 @@ var/poll_role = "split personality" ///How long do we give ghosts to respond? var/poll_time = 20 SECONDS - ///The stranger_backseat does not have temp body component so we will ghostize() on_lose - var/temp_component = FALSE /datum/brain_trauma/severe/split_personality/on_gain() var/mob/living/brain_owner = owner @@ -43,7 +41,7 @@ /// Attempts to get a ghost to play the personality /datum/brain_trauma/severe/split_personality/proc/get_ghost() var/mob/chosen_one = SSpolling.poll_ghosts_for_target( - question = "Do you want to play as [span_danger("[owner.real_name]'s")] [span_notice(poll_role)]?. You will be able to return to your original body after.", + question = "Do you want to play as [span_danger("[owner.real_name]'s")] [span_notice(poll_role)]?", check_jobban = ROLE_PAI, poll_time = poll_time, checked_target = owner, @@ -58,26 +56,11 @@ if(isnull(ghost)) qdel(src) return - if(ghost.mind.current)// if they previous had a body preserve them else that means they never had one or it was destroyed so assign ckey like normal - stranger_backseat.AddComponent( \ - /datum/component/temporary_body, \ - old_mind = ghost.mind, \ - old_body = ghost.mind.current, \ - ) - temp_component = TRUE - stranger_backseat.PossessByPlayer(ghost.ckey) stranger_backseat.log_message("became [key_name(owner)]'s split personality.", LOG_GAME) message_admins("[ADMIN_LOOKUPFLW(stranger_backseat)] became [ADMIN_LOOKUPFLW(owner)]'s split personality.") - owner_backseat.AddComponent( \ - /datum/component/temporary_body, \ - old_mind = owner.mind, \ - old_body = owner, \ - perma_body_attached = TRUE, \ - ) - /datum/brain_trauma/severe/split_personality/on_life(seconds_per_tick, times_fired) if(owner.stat == DEAD) @@ -89,33 +72,72 @@ ..() /datum/brain_trauma/severe/split_personality/on_lose() - // qdel the mob with the temporary component will ensure the original mind will go back into the body and vice versa for the stranger mind - if(!temp_component) - stranger_backseat?.ghostize() + if(current_controller != OWNER) //it would be funny to cure a guy only to be left with the other personality, but it seems too cruel + switch_personalities(TRUE) QDEL_NULL(stranger_backseat) QDEL_NULL(owner_backseat) ..() -// Changes who controls the body + /datum/brain_trauma/severe/split_personality/proc/switch_personalities(reset_to_owner = FALSE) if(QDELETED(owner) || QDELETED(stranger_backseat) || QDELETED(owner_backseat)) return + var/mob/living/split_personality/current_backseat + var/mob/living/split_personality/new_backseat if(current_controller == STRANGER || reset_to_owner) - //back seat to body and vice versa - stranger_backseat.PossessByPlayer(owner.ckey) - //logging - owner_backseat.log_message("assumed control of [key_name(owner)] due to [src]. (Original owner: [stranger_backseat.key])", LOG_GAME) - owner.PossessByPlayer(owner_backseat.ckey) - to_chat(stranger_backseat, span_userdanger("You feel your control being taken away... your other personality is in charge now!")) - + current_backseat = owner_backseat + new_backseat = stranger_backseat else - owner_backseat.PossessByPlayer(owner.ckey) - stranger_backseat.log_message("assumed control of [key_name(owner)] due to [src]. (Original owner: [owner_backseat.key])", LOG_GAME) - owner.PossessByPlayer(stranger_backseat.ckey) - to_chat(owner_backseat, span_userdanger("You feel your control being taken away... your other personality is in charge now!")) + current_backseat = stranger_backseat + new_backseat = owner_backseat + + if(!current_backseat.client) //Make sure we never switch to a logged off mob. + return + + current_backseat.log_message("assumed control of [key_name(owner)] due to [src]. (Original owner: [current_controller == OWNER ? owner.key : current_backseat.key])", LOG_GAME) + to_chat(owner, span_userdanger("You feel your control being taken away... your other personality is in charge now!")) + to_chat(current_backseat, span_userdanger("You manage to take control of your body!")) + + //Body to backseat + + var/h2b_id = owner.computer_id + var/h2b_ip= owner.lastKnownIP + owner.computer_id = null + owner.lastKnownIP = null + + new_backseat.ckey = owner.ckey + + new_backseat.name = owner.name + + if(owner.mind) + new_backseat.mind = owner.mind + + if(!new_backseat.computer_id) + new_backseat.computer_id = h2b_id + + if(!new_backseat.lastKnownIP) + new_backseat.lastKnownIP = h2b_ip + + if(reset_to_owner && new_backseat.mind) + new_backseat.ghostize(FALSE) + + //Backseat to body + + var/s2h_id = current_backseat.computer_id + var/s2h_ip= current_backseat.lastKnownIP + current_backseat.computer_id = null + current_backseat.lastKnownIP = null + + owner.ckey = current_backseat.ckey + owner.mind = current_backseat.mind + + if(!owner.computer_id) + owner.computer_id = s2h_id + + if(!owner.lastKnownIP) + owner.lastKnownIP = s2h_ip - to_chat(owner, span_userdanger("You manage to take control of your body!")) current_controller = !current_controller @@ -141,6 +163,11 @@ trauma.switch_personalities() qdel(trauma) + //if one of the two ghosts, the other one stays permanently + if(!body.client && trauma.initialized) + trauma.switch_personalities() + qdel(trauma) + ..() /mob/living/split_personality/Login() @@ -155,7 +182,7 @@ to_chat(src, span_warning("You cannot speak, your other self is controlling your body!")) return FALSE -/mob/living/split_personality/emote(act, m_type = null, message = null, intentional = FALSE, force_silence = FALSE, forced = FALSE) +/mob/living/split_personality/emote(act, type_override = NONE, message = null, intentional = FALSE, force_silence = FALSE, forced = FALSE) return FALSE ///////////////BRAINWASHING//////////////////// @@ -194,7 +221,7 @@ /datum/brain_trauma/severe/split_personality/brainwashing/get_ghost() set waitfor = FALSE - var/mob/chosen_one = SSpolling.poll_ghosts_for_target("Do you want to play as [span_danger("[owner.real_name]'s")] brainwashed mind? You will be able to return to your original body after.", poll_time = 7.5 SECONDS, checked_target = stranger_backseat, alert_pic = owner, role_name_text = "brainwashed mind") + var/mob/chosen_one = SSpolling.poll_ghosts_for_target("Do you want to play as [span_danger("[owner.real_name]'s")] brainwashed mind?", poll_time = 7.5 SECONDS, checked_target = stranger_backseat, alert_pic = owner, role_name_text = "brainwashed mind") if(chosen_one) stranger_backseat.PossessByPlayer(chosen_one.ckey) else @@ -298,7 +325,7 @@ //too drunk to feel anything //if they're to this point, they're likely dying of liver damage //and not accounting for that, the split personality is temporary - owner.adjustStaminaLoss(-25) + owner.adjust_stamina_loss(-25) duration_in_seconds -= seconds_per_tick /mob/living/split_personality/blackout diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 6f0b45797719..cf555170b686 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -207,7 +207,7 @@ 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) + if (owned_by && owned_by.seen_messages) var/idx = 1 var/combined_height = approx_lines for(var/datum/chatmessage/m as anything in owned_by.seen_messages[message_loc]) @@ -270,7 +270,7 @@ message.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA | KEEP_APART message.alpha = 0 message.pixel_z = starting_height - message.pixel_w = -target.base_pixel_w + message.pixel_w = -message_loc.base_pixel_w message.maptext_width = CHAT_MESSAGE_WIDTH 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 @@ -280,8 +280,9 @@ animate_lifespan = lifespan // View the message - LAZYADDASSOCLIST(owned_by.seen_messages, message_loc, src) - owned_by.images |= message + if(owned_by) + LAZYADDASSOCLIST(owned_by.seen_messages, message_loc, src) + owned_by.images |= message // Fade in animate(message, alpha = 255, time = CHAT_MESSAGE_SPAWN_TIME) diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 4b496da1b73b..5c93b9833f8f 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -457,6 +457,9 @@ var/c_type = target.type qdel(target) CRASH("Incompatible [c_type] transfer attempt to a [type]!") + if(COMPONENT_NOTRANSFER) + qdel(target) + return AddComponent(target) if(!QDELETED(target)) diff --git a/code/datums/components/anti_magic.dm b/code/datums/components/anti_magic.dm index 29855ac6c476..014a89cf6c75 100644 --- a/code/datums/components/anti_magic.dm +++ b/code/datums/components/anti_magic.dm @@ -45,7 +45,6 @@ datum/callback/check_blocking, ) - var/atom/movable/movable = parent if(!istype(movable)) return COMPONENT_INCOMPATIBLE @@ -54,6 +53,7 @@ if(isitem(movable)) RegisterSignal(movable, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) RegisterSignal(movable, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) + RegisterSignal(movable, COMSIG_ATOM_EXAMINE_TAGS, PROC_REF(get_examine_tags)) RegisterSignals(movable, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_ATOM), PROC_REF(on_attack)) compatible = TRUE else if(ismob(movable)) @@ -95,6 +95,20 @@ SIGNAL_HANDLER unregister_antimagic_signals(bucklee) +/datum/component/anti_magic/proc/get_examine_tags(atom/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(antimagic_flags == ALL_MAGIC_RESISTANCE) + examine_list["magic-proof"] = "It is thoroughly shielded against all known forms of magic." + return + + if(antimagic_flags & MAGIC_RESISTANCE) + examine_list["warded"] = "It possesses a general resistance to regular spells and magic." + if(antimagic_flags & MAGIC_RESISTANCE_MIND) + examine_list["telepathy-proof"] = "It appears to be insulated against telepathic or mental influence." + if(antimagic_flags & MAGIC_RESISTANCE_HOLY) + examine_list["blessed"] = "It is protected by a divine shield against unholy and dark forms of magic." + /datum/component/anti_magic/proc/on_equip(atom/movable/source, mob/equipper, slot) SIGNAL_HANDLER diff --git a/code/datums/components/appearance_on_aggro.dm b/code/datums/components/appearance_on_aggro.dm index 143c0b260cdb..1cc9ef4f2109 100644 --- a/code/datums/components/appearance_on_aggro.dm +++ b/code/datums/components/appearance_on_aggro.dm @@ -65,13 +65,10 @@ /datum/component/appearance_on_aggro/proc/on_icon_state_updated(mob/living/source) SIGNAL_HANDLER - if (source.stat == DEAD) - return - source.icon_state = source.ai_controller?.blackboard_key_exists(target_key) ? aggro_state : initial(source.icon_state) + if (source.stat != DEAD) + source.icon_state = source.ai_controller?.blackboard_key_exists(target_key) ? aggro_state : initial(source.icon_state) /datum/component/appearance_on_aggro/proc/on_overlays_updated(mob/living/basic/source, list/overlays) SIGNAL_HANDLER - - if(!(source.ai_controller?.blackboard_key_exists(target_key))) - return - overlays += aggro_overlay + if(source.ai_controller?.blackboard_key_exists(target_key) && source.stat != DEAD) + overlays += aggro_overlay diff --git a/code/datums/components/aquarium.dm b/code/datums/components/aquarium.dm index 314b34bfe13e..5e22047744fb 100644 --- a/code/datums/components/aquarium.dm +++ b/code/datums/components/aquarium.dm @@ -388,15 +388,15 @@ for(var/obj/item/fish/fish_type as anything in types_to_mate_with) var/list/type_fishes = tracked_fish_by_type[fish_type] - if(length(type_fishes) >= initial(fish_type.stable_population)) + if(length(type_fishes) >= fish_type::stable_population) continue candidates += type_fishes ///Check if an offspring of two fish (or one if self-reproducing) can evolve. /datum/component/aquarium/proc/check_evolution(atom/movable/source, obj/item/fish/fish, obj/item/fish/mate, datum/fish_evolution/evolution) SIGNAL_HANDLER - //chances are halved if only one parent has this evolution. - var/real_probability = (mate && (evolution.type in mate.evolution_types)) ? evolution.probability : evolution.probability * 0.5 + //chances are halved if it isn't asexual reproduction and one parent doesn't have the evolution. + var/real_probability = (isnull(mate) || (evolution.type in mate.evolution_types)) ? evolution.probability : evolution.probability * 0.5 if(HAS_TRAIT(fish, TRAIT_FISH_MUTAGENIC) || (mate && HAS_TRAIT(mate, TRAIT_FISH_MUTAGENIC))) real_probability *= 3 if(!prob(real_probability)) @@ -697,6 +697,8 @@ check_fluid_and_temperature(fish) /datum/component/aquarium/proc/admire(atom/movable/source, mob/living/user) + if(!isliving(user)) + return source.balloon_alert(user, "admiring aquarium...") if(!do_after(user, 5 SECONDS, target = source)) return diff --git a/code/datums/components/area_sound_manager.dm b/code/datums/components/area_sound_manager.dm index 8dfb7895699d..f712fc8043b3 100644 --- a/code/datums/components/area_sound_manager.dm +++ b/code/datums/components/area_sound_manager.dm @@ -43,7 +43,7 @@ /datum/component/area_sound_manager/proc/react_to_z_move(datum/source, turf/old_turf, turf/new_turf) SIGNAL_HANDLER - if(!length(accepted_zs) || (new_turf.z in accepted_zs)) + if(!length(accepted_zs) || (new_turf?.z in accepted_zs)) return qdel(src) diff --git a/code/datums/components/atom_mounted.dm b/code/datums/components/atom_mounted.dm new file mode 100644 index 000000000000..12d73e1ae240 --- /dev/null +++ b/code/datums/components/atom_mounted.dm @@ -0,0 +1,168 @@ +// This element should be applied to wall-mounted machines/structures, so that if the support structure it's "hanging" from is broken or deconstructed, the wall-hung structure will deconstruct. +/datum/component/atom_mounted + /// The closed turf our object is currently linked to. + var/atom/hanging_support_atom + +/datum/component/atom_mounted/Initialize(target_structure, on_drop_callback) + . = ..() + if(!isobj(parent)) + return COMPONENT_INCOMPATIBLE + hanging_support_atom = target_structure + RegisterSignal(hanging_support_atom, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + if(isclosedturf(hanging_support_atom)) + RegisterSignal(hanging_support_atom, COMSIG_TURF_CHANGE, PROC_REF(on_turf_changing)) + else + RegisterSignal(hanging_support_atom, COMSIG_QDELETING, PROC_REF(on_structure_delete)) + +/datum/component/atom_mounted/RegisterWithParent() + ADD_TRAIT(parent, TRAIT_WALLMOUNTED, REF(src)) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + +/datum/component/atom_mounted/UnregisterFromParent() + REMOVE_TRAIT(parent, TRAIT_WALLMOUNTED, REF(src)) + UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) + +/datum/component/atom_mounted/Destroy(force) + UnregisterSignal(hanging_support_atom, list(COMSIG_ATOM_EXAMINE)) + if(isclosedturf(hanging_support_atom)) + UnregisterSignal(hanging_support_atom, COMSIG_TURF_CHANGE) + else + UnregisterSignal(hanging_support_atom, COMSIG_QDELETING) + hanging_support_atom = null + return ..() + +/** + * When the wall is examined, explains that it's supporting the linked object. + */ +/datum/component/atom_mounted/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if (parent in view(user.client?.view || world.view, user)) + examine_list += span_notice("\The [hanging_support_atom] 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/atom_mounted/proc/on_turf_changing(datum/source, path, new_baseturfs, flags, post_change_callbacks) + SIGNAL_HANDLER + + if(ispath(path, /turf/open)) + drop_wallmount() + +/datum/component/atom_mounted/proc/on_structure_delete(datum/source, force) + SIGNAL_HANDLER + + drop_wallmount() + +/// If we get dragged from our wall (by a singulo for instance) we should deconstruct +/datum/component/atom_mounted/proc/on_move(datum/source, atom/old_loc, dir, forced, list/old_locs) + SIGNAL_HANDLER + // If we're having our lighting messed with we're likely to get dragged about + // That shouldn't lead to a decon + if(HAS_TRAIT(parent, TRAIT_LIGHTING_DEBUGGED)) + return + 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/atom_mounted/proc/drop_wallmount() + PRIVATE_PROC(TRUE) + + var/obj/hanging_parent = parent + hanging_parent.visible_message(message = span_warning("\The [hanging_parent] falls apart!"), vision_distance = 5) + hanging_parent.deconstruct(FALSE) + + +/// Returns a list of potential turfs to mount on. This should not check if those turfs are valid but only locate them +/obj/proc/get_turfs_to_mount_on() + PROTECTED_PROC(TRUE) + RETURN_TYPE(/list/turf) + + //Infer using icon offsets. Can support diagonal mounting + var/pixel_direction = NONE + if(pixel_x > (ICON_SIZE_X / 2)) + pixel_direction |= EAST + else if(pixel_x < -(ICON_SIZE_X / 2)) + pixel_direction |= WEST + if(pixel_y > (ICON_SIZE_Y / 2)) + pixel_direction |= NORTH + else if(pixel_y < -(ICON_SIZE_Y / 2)) + pixel_direction |= SOUTH + + . = list() + if(pixel_direction != NONE) + . += get_step(src, pixel_direction) + . += get_turf(src) + +/** + * Checks if our object can mount on this turf + * + * Arguments + * * turf/target - the turf we are trying to mount on +*/ +/obj/proc/is_mountable_turf(turf/target) + PROTECTED_PROC(TRUE) + SHOULD_BE_PURE(TRUE) + + return isclosedturf(target) + +/// Returns an list of object types we can mount on if the turf is unmountable +/obj/proc/get_moutable_objects() + PROTECTED_PROC(TRUE) + SHOULD_BE_PURE(TRUE) + RETURN_TYPE(/list/obj) + + var/static/list/obj/attachables = list( + /obj/structure/table, + /obj/structure/window, + /obj/structure/fence, + /obj/structure/falsewall, + ) + + return attachables + +/** + * Finds an support atom to hang this object on. If you need to mount the object on Late Initialize + * then pass TRUE inside Initialize() but not in LateInitialize(). + * The flag is only applied if no support atom could be found during Initialize() as a last resort + * + * Arguments + * * mark_for_late_init - if TRUE will apply the MOUNT_ON_LATE_INITIALIZE which gets cleared on every call + * * late_init - should only be passed as TRUE from inside LateInitialize() +*/ +/obj/proc/find_and_mount_on_atom(mark_for_late_init = FALSE, late_init = FALSE) + if(obj_flags & MOUNT_ON_LATE_INITIALIZE) + obj_flags &= ~MOUNT_ON_LATE_INITIALIZE + else if(late_init) + return TRUE + + var/area/location = get_area(src) + if(!isarea(location) || istype(location, /area/shuttle)) + return FALSE + + var/msg + if(PERFORM_ALL_TESTS(focus_only/atom_mounted) && !mark_for_late_init) + msg = "[type] Could not find attachable object at [location.type] " + + var/list/turf/attachable_turfs = get_turfs_to_mount_on() + for(var/turf/target as anything in attachable_turfs) + var/atom/attachable_atom + if(is_mountable_turf(target)) + attachable_atom = target //your usual wallmount + else + var/list/obj/attachables = get_moutable_objects() + for(var/obj/attachable in target) + if(is_type_in_list(attachable, attachables)) + attachable_atom = attachable + break + if(attachable_atom) + AddComponent(/datum/component/atom_mounted, attachable_atom) + return TRUE + if(msg) + msg += "([target.x],[target.y],[target.z]) " + if(msg) + stack_trace(msg) + + if(mark_for_late_init) + obj_flags |= MOUNT_ON_LATE_INITIALIZE + return FALSE diff --git a/code/datums/components/aura_healing.dm b/code/datums/components/aura_healing.dm index e71a06de2fb2..93d9c62c08f2 100644 --- a/code/datums/components/aura_healing.dm +++ b/code/datums/components/aura_healing.dm @@ -44,6 +44,9 @@ /// The color to give the healing visual var/healing_color = COLOR_GREEN + /// If the aura also heals the owner of the component + var/self_heal = TRUE + /// A list of being healed to active alerts var/list/mob/living/current_alerts = list() @@ -64,6 +67,7 @@ simple_heal = 0, limit_to_trait = null, healing_color = COLOR_GREEN, + self_heal = TRUE, ) if (!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -83,6 +87,7 @@ src.simple_heal = simple_heal src.limit_to_trait = limit_to_trait src.healing_color = healing_color + src.self_heal = self_heal /datum/component/aura_healing/Destroy(force) STOP_PROCESSING(SSaura, src) @@ -115,26 +120,25 @@ for (var/mob/living/candidate as anything in to_heal) if (!current_alerts[candidate]) - var/atom/movable/screen/alert/aura_healing/alert = candidate.throw_alert(alert_category, /atom/movable/screen/alert/aura_healing, new_master = parent) - alert.desc = "You are being healed by [parent]." + candidate.throw_alert(alert_category, /atom/movable/screen/alert/aura_healing, new_master = parent) current_alerts[candidate] = TRUE if (should_show_effect && candidate.health < candidate.maxHealth) new /obj/effect/temp_visual/heal(get_turf(candidate), healing_color) if (iscarbon(candidate) || issilicon(candidate) || isbasicmob(candidate)) - candidate.adjustBruteLoss(-brute_heal * seconds_per_tick, updating_health = FALSE) - candidate.adjustFireLoss(-burn_heal * seconds_per_tick, updating_health = FALSE) + candidate.adjust_brute_loss(-brute_heal * seconds_per_tick, updating_health = FALSE) + candidate.adjust_fire_loss(-burn_heal * seconds_per_tick, updating_health = FALSE) if (iscarbon(candidate)) // Toxin healing is forced for slime people - candidate.adjustToxLoss(-toxin_heal * seconds_per_tick, updating_health = FALSE, forced = TRUE) + candidate.adjust_tox_loss(-toxin_heal * seconds_per_tick, updating_health = FALSE, forced = TRUE) - candidate.adjustOxyLoss(-suffocation_heal * seconds_per_tick, updating_health = FALSE) - candidate.adjustStaminaLoss(-stamina_heal * seconds_per_tick, updating_stamina = FALSE) + candidate.adjust_oxy_loss(-suffocation_heal * seconds_per_tick, updating_health = FALSE) + candidate.adjust_stamina_loss(-stamina_heal * seconds_per_tick, updating_stamina = FALSE) for (var/organ in organ_healing) - candidate.adjustOrganLoss(organ, -organ_healing[organ] * seconds_per_tick) + candidate.adjust_organ_loss(organ, -organ_healing[organ] * seconds_per_tick) var/mob/living/carbon/carbidate = candidate for(var/datum/wound/iter_wound as anything in carbidate.all_wounds) iter_wound.adjust_blood_flow(-wound_clotting * seconds_per_tick) @@ -146,8 +150,7 @@ var/mob/living/basic/basic_candidate = candidate basic_candidate.adjust_health(-simple_heal * seconds_per_tick, updating_health = FALSE) - if (candidate.blood_volume < BLOOD_VOLUME_NORMAL) - candidate.blood_volume += blood_heal * seconds_per_tick + candidate.adjust_blood_volume(blood_heal * seconds_per_tick, maximum = BLOOD_VOLUME_NORMAL) candidate.updatehealth() @@ -158,5 +161,12 @@ /atom/movable/screen/alert/aura_healing name = "Aura Healing" icon_state = "template" + use_user_hud_icon = TRUE + clickable_glow = TRUE + click_master = FALSE + +/atom/movable/screen/alert/aura_healing/update_desc(updates) + . = ..() + desc = "You are being healed by [master_ref?.resolve()]." #undef HEAL_EFFECT_COOLDOWN diff --git a/code/datums/components/bakeable.dm b/code/datums/components/bakeable.dm index 70234236ce47..f43b4fc162b9 100644 --- a/code/datums/components/bakeable.dm +++ b/code/datums/components/bakeable.dm @@ -37,8 +37,8 @@ var/atom/result = new bake_result if(!item_target.compare_materials(result)) var/warning = "custom_materials of [result.type] when baked compared to just spawned don't match" - var/what_it_should_be = item_target.get_materials_english_list() - stack_trace("[warning]. custom_materials should be [what_it_should_be].") + var/what_it_should_be = item_target.transcribe_materials_list() + stack_trace("[warning]. should be: custom_materials = [what_it_should_be].") qdel(result) // Inherit the new values passed to the component diff --git a/code/datums/components/blob_minion.dm b/code/datums/components/blob_minion.dm index 75eee8410d25..b6db9de6c36d 100644 --- a/code/datums/components/blob_minion.dm +++ b/code/datums/components/blob_minion.dm @@ -49,6 +49,8 @@ RegisterSignal(overmind, COMSIG_QDELETING, PROC_REF(overmind_deleted)) RegisterSignal(overmind, COMSIG_BLOB_SELECTED_STRAIN, PROC_REF(strain_properties_changed)) strain_properties_changed(overmind, overmind.blobstrain) + var/mob/living_parent = parent + living_parent.pass_flags |= PASSBLOB /// Our overmind is gone, uh oh! /datum/component/blob_minion/proc/overmind_deleted() @@ -70,7 +72,6 @@ /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 @@ -113,6 +114,7 @@ COMSIG_HOSTILE_PRE_ATTACKINGTARGET, )) GLOB.blob_telepathy_mobs -= parent + living_parent.pass_flags &= ~PASSBLOB /// Become blobpilled when we gain a mind /datum/component/blob_minion/proc/on_mind_init(mob/living/minion, datum/mind/new_mind) @@ -152,9 +154,9 @@ /datum/component/blob_minion/proc/on_burned(mob/living/minion, exposed_temperature, exposed_volume) SIGNAL_HANDLER if(isnull(exposed_temperature)) - minion.adjustFireLoss(5) + minion.adjust_fire_loss(5) return - minion.adjustFireLoss(clamp(0.01 * exposed_temperature, 1, 5)) + minion.adjust_fire_loss(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) diff --git a/code/datums/components/boomerang.dm b/code/datums/components/boomerang.dm index e41917a2b104..82a189985bc5 100644 --- a/code/datums/components/boomerang.dm +++ b/code/datums/components/boomerang.dm @@ -85,7 +85,7 @@ /datum/component/boomerang/proc/aerodynamic_swing(datum/thrownthing/throwingdatum) var/mob/thrown_by = throwingdatum?.get_thrower() var/obj/item/true_parent = parent - if(thrown_by) + if(istype(thrown_by)) addtimer(CALLBACK(true_parent, TYPE_PROC_REF(/atom/movable, throw_at), thrown_by, boomerang_throw_range, throwingdatum.speed, thrown_by, TRUE), 0.1 SECONDS) COOLDOWN_START(src, last_boomerang_throw, BOOMERANG_REBOUND_INTERVAL) true_parent.visible_message( diff --git a/code/datums/components/boss_music.dm b/code/datums/components/boss_music.dm index a5d2de4c8d59..3d7bdf896bf8 100644 --- a/code/datums/components/boss_music.dm +++ b/code/datums/components/boss_music.dm @@ -12,15 +12,12 @@ ///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, -) +/datum/component/boss_music/Initialize(boss_track) . = ..() if(!ishostile(parent)) return COMPONENT_INCOMPATIBLE src.boss_track = boss_track - src.track_duration = track_duration + track_duration = SSsounds.get_sound_length(boss_track) /datum/component/boss_music/Destroy(force) . = ..() diff --git a/code/datums/components/breeding.dm b/code/datums/components/breeding.dm index 6c323ed835d3..328d7ae18572 100644 --- a/code/datums/components/breeding.dm +++ b/code/datums/components/breeding.dm @@ -2,17 +2,17 @@ * A component to allow us to breed */ /datum/component/breed - /// additional mobs we can breed with + /// Additional mobs we can breed with var/list/can_breed_with - ///weighted list of the possible baby types + /// Weighted list of the possible baby types var/list/baby_paths - ///time to wait after breeding + /// Time to wait after breeding var/breed_timer - ///AI key we set when we're ready to breed + /// AI key we set when we're ready to breed var/breed_key = BB_BREED_READY - ///are we ready to breed? + /// Are we ready to breed? var/ready_to_breed = TRUE - ///callback after we give birth to the child + /// Callback after we give birth to the child var/datum/callback/post_birth /datum/component/breed/Initialize(list/can_breed_with = list(), breed_timer = 40 SECONDS, baby_paths = list(), post_birth) @@ -44,13 +44,15 @@ REMOVE_TRAIT(parent, TRAIT_MOB_BREEDER, REF(src)) post_birth = null - /datum/component/breed/proc/breed_with_partner(mob/living/source, mob/living/target) SIGNAL_HANDLER if(source.combat_mode) return + if(!ismob(target)) + return + if(source.client || target.client) return diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index cd06bdb2a00d..43b52abb0172 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -104,6 +104,8 @@ if(HAS_TRAIT(digitigrade_fan, TRAIT_LIGHT_STEP)) damage *= 0.75 + if(flags & CALTROP_ANTS && HAS_TRAIT(digitigrade_fan, TRAIT_SPACE_ANT_IMMUNITY)) + damage = 0 if(!(flags & CALTROP_SILENT) && !digitigrade_fan.has_status_effect(/datum/status_effect/caltropped)) digitigrade_fan.apply_status_effect(/datum/status_effect/caltropped) diff --git a/code/datums/components/can_flash_from_behind.dm b/code/datums/components/can_flash_from_behind.dm index c443d160dfbd..f375df20c988 100644 --- a/code/datums/components/can_flash_from_behind.dm +++ b/code/datums/components/can_flash_from_behind.dm @@ -10,10 +10,10 @@ return COMPONENT_INCOMPATIBLE /datum/component/can_flash_from_behind/RegisterWithParent() - RegisterSignal(parent, COMSIG_MOB_PRE_FLASHED_CARBON, PROC_REF(on_pre_flashed_carbon)) + RegisterSignal(parent, COMSIG_MOB_PRE_FLASHED_MOB, PROC_REF(on_pre_flashed_carbon)) /datum/component/can_flash_from_behind/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_MOB_PRE_FLASHED_CARBON) + UnregisterSignal(parent, COMSIG_MOB_PRE_FLASHED_MOB) /datum/component/can_flash_from_behind/proc/on_pre_flashed_carbon(source, flashed, flash, deviation) SIGNAL_HANDLER diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index 7ce66b86c1ac..71bb1d28c53a 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -42,6 +42,7 @@ 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 + ADD_TRAIT(parent, TRAIT_AI_AVOID_TURF, REF(src)) 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)) @@ -53,6 +54,7 @@ parent.AddComponent(/datum/component/fishing_spot, GLOB.preset_fish_sources[/datum/fish_source/chasm]) /datum/component/chasm/UnregisterFromParent() + REMOVE_TRAIT(parent, TRAIT_AI_AVOID_TURF, REF(src)) storage = null /datum/component/chasm/proc/entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) @@ -161,16 +163,29 @@ if(isliving(dropped_thing)) var/mob/living/fallen = dropped_thing fallen.Paralyze(100) - fallen.adjustBruteLoss(30) + fallen.adjust_brute_loss(30) falling_atoms -= falling_ref return // send to oblivion - 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 ADD_TRAIT(falling_mob, TRAIT_NO_TRANSFORM, REF(src)) - falling_mob.Paralyze(20 SECONDS) + falling_mob.Stun(20 SECONDS, ignore_canstun = TRUE) + + if (HAS_MIND_TRAIT(falling_mob, TRAIT_NAIVE)) + falling_mob.do_alert_animation() + dropped_thing.visible_message(span_boldwarning("[dropped_thing] kicks [dropped_thing.p_their()] legs in the air, as if running in place!")) + dropped_thing.Shake(1, 0, 2 SECONDS, 0.3 SECONDS) + sleep(3 SECONDS) + + if (get_turf(falling_mob) != get_turf(parent)) + REMOVE_TRAIT(falling_mob, TRAIT_NO_TRANSFORM, REF(src)) + falling_mob.Paralyze(17 SECONDS, ignore_canstun = TRUE) // Wow nice job + return + + dropped_thing.visible_message(span_boldwarning("[dropped_thing] falls into [parent]!"), span_userdanger("[oblivion_message]")) var/oldtransform = dropped_thing.transform var/oldcolor = dropped_thing.color diff --git a/code/datums/components/connect_inventory.dm b/code/datums/components/connect_inventory.dm index c2e688171b43..2322c3ed9d71 100644 --- a/code/datums/components/connect_inventory.dm +++ b/code/datums/components/connect_inventory.dm @@ -32,7 +32,7 @@ /datum/component/connect_inventory/proc/update_signals() unregister_signals() - for(var/obj/item/item as anything in tracked.get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD)) + for(var/obj/item/item as anything in tracked.get_equipped_items(INCLUDE_POCKETS|INCLUDE_HELD|INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT)) if(!(allowed_slots & tracked.get_slot_by_item(item))) continue RegisterSignal(item, COMSIG_ITEM_DROPPED, PROC_REF(on_unequipped_item)) @@ -40,7 +40,7 @@ parent.RegisterSignal(item, signal, connections[signal]) /datum/component/connect_inventory/proc/unregister_signals() - for(var/obj/item/item as anything in tracked.get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD)) + for(var/obj/item/item as anything in tracked.get_equipped_items(INCLUDE_POCKETS|INCLUDE_HELD|INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT)) UnregisterSignal(item, COMSIG_ITEM_DROPPED) parent.UnregisterSignal(item, connections) diff --git a/code/datums/components/crafting/_recipes.dm b/code/datums/components/crafting/_recipes.dm index 86b5d095a55a..86a4a38d490c 100644 --- a/code/datums/components/crafting/_recipes.dm +++ b/code/datums/components/crafting/_recipes.dm @@ -26,6 +26,8 @@ var/list/parts = list() ///items, structures and machineries of types that are in this list won't transfer their materials to the result var/list/requirements_mats_blacklist + ///if set, the materials in this list and their values will be subtracted from the result. + var/list/removed_mats ///like tool_behaviors but for reagents var/list/chem_catalysts = list() ///where it shows up in the crafting UI @@ -102,9 +104,9 @@ src.reqs[material] = stack_recipe.req_amount src.category = stack_recipe.category || CAT_MISC src.placement_checks = stack_recipe.placement_checks + src.crafting_flags = stack_recipe.crafting_flags - if(!(stack_recipe.crafting_flags & CRAFT_APPLIES_MATS)) - requirements_mats_blacklist = list(material) //the item is not intended to have mats :shrug: + src.removed_mats = stack_recipe.removed_mats /** * Run custom pre-craft checks for this recipe, don't add feedback messages in this because it will spam the client @@ -122,3 +124,8 @@ /// Additional UI data to be passed to the crafting UI for this recipe /datum/crafting_recipe/proc/crafting_ui_data() return list() + +// DARKPACK EDIT ADD START +/datum/crafting_recipe/proc/is_recipe_available(mob/user) + return TRUE +// DARKPACK EDIT ADD END diff --git a/code/datums/components/crafting/chemistry.dm b/code/datums/components/crafting/chemistry.dm index 7f7d5136e836..dd21976be474 100644 --- a/code/datums/components/crafting/chemistry.dm +++ b/code/datums/components/crafting/chemistry.dm @@ -42,6 +42,7 @@ ) time = 5 SECONDS category = CAT_CHEMISTRY + crafting_flags = parent_type::crafting_flags | CRAFT_SKIP_MATERIALS_PARITY //there are two ways to make a chem bombcore. We go with the first one for mats check /datum/crafting_recipe/alcohol_burner name = "Burner (Ethanol)" diff --git a/code/datums/components/crafting/containers.dm b/code/datums/components/crafting/containers.dm index 6062da2ef55d..f3a22cd2f6e2 100644 --- a/code/datums/components/crafting/containers.dm +++ b/code/datums/components/crafting/containers.dm @@ -27,8 +27,9 @@ /obj/item/stack/sheet/mineral/bamboo = 20 ) result = /obj/item/storage/basket + crafting_flags = CRAFT_SKIP_MATERIALS_PARITY category = CAT_CONTAINERS - crafting_flags = parent_type::crafting_flags | CRAFT_MUST_BE_LEARNED + crafting_flags = parent_type::crafting_flags | CRAFT_MUST_BE_LEARNED | CRAFT_SKIP_MATERIALS_PARITY steps = list( "master the art of underwater basketweaving", "be underwater" diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 53e1fbe600d6..ffa069c3e7e6 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -238,7 +238,7 @@ var/mob/living/carbon/human/human_crafter if(ishuman(crafter)) human_crafter = crafter - recipe_time = recipe_time * human_crafter.st_stat_multiplier(STAT_CRAFTS) + recipe_time = recipe_time / human_crafter.st_get_stat(STAT_CRAFTS) // DARKPACK EDIT ADD END if(!do_after(crafter, round(recipe_time, 0.1 SECONDS), target = crafter)) @@ -251,15 +251,30 @@ //used to gather the material composition of the utilized requirements to transfer to the result var/list/total_materials = list() var/list/stuff_to_use = get_used_reqs(recipe, crafter, total_materials) + + for(var/mat in recipe.removed_mats) + var/to_remove = recipe.removed_mats[mat] + var/datum/material/ref_mat = locate(mat) in total_materials + if(!ref_mat) + continue + if(total_materials[ref_mat] < to_remove) + total_materials -= ref_mat + else + total_materials[ref_mat] -= to_remove + var/atom/result var/turf/craft_turf = get_turf(crafter.loc) - var/set_materials = TRUE + var/set_materials = !(recipe.crafting_flags & CRAFT_NO_MATERIALS) if(ispath(recipe.result, /turf)) result = craft_turf.place_on_top(recipe.result) else if(ispath(recipe.result, /obj/item/stack)) + var/res_amount = recipe.result_amount || 1 //we don't merge the stack right away but try to put it in the hand of the crafter - result = new recipe.result(craft_turf, recipe.result_amount || 1, /*merge =*/FALSE) - set_materials = FALSE //stacks are bit too complex for it for now, but you're free to change that. + if(set_materials) + result = new recipe.result(craft_turf, res_amount, /*merge =*/ FALSE, /*mat_override =*/ total_materials, /*mat_amt =*/ 1 / res_amount) + set_materials = FALSE //We've already set the materials on init. Don't do it again + else + result = new recipe.result(craft_turf, res_amount, FALSE) else result = new recipe.result(craft_turf) if(result.atom_storage && recipe.delete_contents) @@ -379,21 +394,21 @@ if(recipe.structures) requirements += recipe.structures + var/list/surroundings = get_environment(atom, recipe.blacklist) for(var/path_key in requirements) - var/list/surroundings var/amount = recipe.reqs?[path_key] || recipe.machinery?[path_key] || recipe.structures?[path_key] if(!amount)//since machinery & structures can have 0 aka CRAFTING_MACHINERY_USE - i.e. use it, don't consume it! continue - surroundings = get_environment(atom, recipe.blacklist) - surroundings -= return_list if(ispath(path_key, /datum/reagent)) if(!holder) holder = new(INFINITY, NO_REACT) //an infinite volume holder than can store reagents without reacting return_list += holder + var/list/checked = list() while(amount > 0) - var/obj/item/reagent_containers/container = locate() in surroundings + var/obj/item/reagent_containers/container = locate() in ((surroundings | return_list) - checked) if(isnull(container)) //This would only happen if the previous checks for contents and tools were flawed. stack_trace("couldn't fulfill the required amount for [path_key]. Dangit") + break if(QDELING(container)) //it's deleting... surroundings -= container continue @@ -401,7 +416,7 @@ if(reagent_volume) container.reagents.trans_to(holder, min(amount, reagent_volume), target_id = path_key, no_react = TRUE) amount -= reagent_volume - surroundings -= container + checked += container container.update_appearance(UPDATE_ICON) else if(ispath(path_key, /obj/item/stack)) var/obj/item/stack/tally_stack @@ -409,6 +424,7 @@ var/obj/item/stack/origin_stack = locate(path_key) in surroundings if(isnull(origin_stack)) //This would only happen if the previous checks for contents and tools were flawed. stack_trace("couldn't fulfill the required amount for [path_key]. Dangit") + break if(QDELING(origin_stack)) continue var/amount_to_give = min(origin_stack.amount, amount) @@ -427,6 +443,7 @@ var/atom/movable/item = locate(path_key) in surroundings if(isnull(item)) //This would only happen if the previous checks for contents and tools were flawed. stack_trace("couldn't fulfill the required amount for [path_key]. Dangit") + break if(QDELING(item)) continue return_list += item @@ -443,11 +460,11 @@ return FALSE if (recipe.category == CAT_CULT && !IS_CULTIST(user)) // Skip blood cult recipes if not cultist return FALSE - //DARKPACK EDIT ADD - START - // if (recipe.category == CAT_TZIMISCE) // TODO: [Disciplines] Uncomment when viscissitude is a thing. - // return FALSE - //DARKPACK EDIT ADD - END - return TRUE + // DARKPACK EDIT ADD - START + if (recipe.category == CAT_TZIMISCE) // TODO: [Disciplines] Uncomment when viscissitude is a thing. + return HAS_TRAIT(user, TRAIT_VICISSITUDE_KNOWLEDGE) + // DARKPACK EDIT ADD - END + return recipe.is_recipe_available(user) // DARKPACK EDIT CHANGE /datum/component/personal_crafting/proc/component_ui_interact(atom/movable/screen/craft/image, location, control, params, user) SIGNAL_HANDLER diff --git a/code/datums/components/crafting/equipment.dm b/code/datums/components/crafting/equipment.dm index 8b9079471655..79dbac1ba7a2 100644 --- a/code/datums/components/crafting/equipment.dm +++ b/code/datums/components/crafting/equipment.dm @@ -60,6 +60,7 @@ ) time = 10 SECONDS category = CAT_EQUIPMENT + removed_mats = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) /datum/crafting_recipe/motorized_wheelchair name = "Motorized Wheelchair" diff --git a/code/datums/components/crafting/furniture.dm b/code/datums/components/crafting/furniture.dm index c3f6557f89a2..ecbf1d7fc9aa 100644 --- a/code/datums/components/crafting/furniture.dm +++ b/code/datums/components/crafting/furniture.dm @@ -81,3 +81,40 @@ tool_behaviors = list(TOOL_SCREWDRIVER) category = CAT_FURNITURE time = 10 SECONDS + +/datum/crafting_recipe/lamp + name = "Desk Lamp" + result = /obj/item/flashlight/lamp + reqs = list( + /obj/item/flashlight = 1, + /obj/item/stack/rods = 1, + /obj/item/light/bulb = 1, + ) + crafting_flags = CRAFT_SKIP_MATERIALS_PARITY + tool_behaviors = list(TOOL_SCREWDRIVER) + category = CAT_FURNITURE + +/datum/crafting_recipe/lamp/New() + . = ..() + blacklist += subtypesof(/obj/item/flashlight) + +/datum/crafting_recipe/lamp/green + name = "Green Desk Lamp" + result = /obj/item/flashlight/lamp/green + +/datum/crafting_recipe/banana_lamp + name = "Banana Lamp" + result = /obj/item/flashlight/lamp/bananalamp + reqs = list( + /obj/item/flashlight/lamp = 1, + /obj/item/grown/bananapeel = 1, + ) + blacklist = list( + /obj/item/flashlight/lamp/bananalamp, + /obj/item/flashlight/lamp/space_bubble, + ) + requirements_mats_blacklist = list(/obj/item/grown/bananapeel) + tool_behaviors = list(TOOL_SCREWDRIVER) + category = CAT_FURNITURE + + diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm index fecf14d21d69..9c5e5d4304b6 100644 --- a/code/datums/components/crafting/guncrafting.dm +++ b/code/datums/components/crafting/guncrafting.dm @@ -16,6 +16,8 @@ desc = "A prototype modular receiver and trigger assembly for a firearm." icon = 'icons/obj/weapons/improvised.dmi' icon_state = "receiver" + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5.5, /datum/material/cardboard = SHEET_MATERIAL_AMOUNT) + /* // DARKPACK EDIT REMOVE /obj/item/weaponcrafting/receiver/create_slapcraft_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/pipegun) @@ -28,7 +30,7 @@ /obj/item/weaponcrafting/stock name = "rifle stock" desc = "A classic rifle stock that doubles as a grip, roughly carved out of wood." - custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 6) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 8) resistance_flags = FLAMMABLE icon = 'icons/obj/weapons/improvised.dmi' icon_state = "riflestock" @@ -68,31 +70,61 @@ /obj/item/weaponcrafting/gunkit/nuclear name = "advanced energy gun parts kit (lethal/nonlethal)" desc = "A suitcase containing the necessary gun parts to transform a standard energy gun into an advanced energy gun." + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + /datum/material/uranium = SHEET_MATERIAL_AMOUNT * 1.5, + /datum/material/titanium = HALF_SHEET_MATERIAL_AMOUNT, + ) /obj/item/weaponcrafting/gunkit/tesla name = "tesla cannon parts kit (lethal)" desc = "A suitcase containing the necessary gun parts to construct a tesla cannon around a stabilized flux anomaly. Handle with care." icon_state = "weaponskit_tesla" + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 5, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 5) /obj/item/weaponcrafting/gunkit/xray name = "x-ray laser gun parts kit (lethal)" desc = "A suitcase containing the necessary gun parts to turn a laser gun into a x-ray laser gun. Do not point most parts directly towards face." + custom_materials = list( + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/uranium = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT, + /datum/material/bluespace = SHEET_MATERIAL_AMOUNT, + ) /obj/item/weaponcrafting/gunkit/ion name = "ion carbine parts kit (nonlethal/highly destructive/very lethal (silicons))" desc = "A suitcase containing the necessary gun parts to transform a standard laser gun into a ion carbine. Perfect against lockers you don't have access to." + custom_materials = list(/datum/material/silver = SHEET_MATERIAL_AMOUNT * 3, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 4, /datum/material/uranium = SHEET_MATERIAL_AMOUNT) /obj/item/weaponcrafting/gunkit/temperature name = "temperature gun parts kit (less lethal/very lethal (lizardpeople))" desc = "A suitcase containing the necessary gun parts to transform a standard energy gun into a temperature gun. Fantastic at birthday parties and killing indigenous populations of lizardpeople." + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 1.5) /obj/item/weaponcrafting/gunkit/beam_rifle name = "\improper Event Horizon anti-existential beam rifle part kit (DOOMSDAY DEVICE, DO NOT CONSTRUCT)" desc = "What fevered minds wrought this terrible construction kit? To create a frame to harness the strange energies that flow through the Spinward Sector towards such horrible acts of violence?" + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass =SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/diamond = SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/uranium = SHEET_MATERIAL_AMOUNT * 4, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 2.25, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 2.5, + ) /obj/item/weaponcrafting/gunkit/ebow name = "energy crossbow part kit (less lethal)" desc = "Highly illegal weapons refurbishment kit that allows you to turn the standard proto-kinetic accelerator into a near-duplicate energy crossbow. Almost like the real thing!" + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT * 1.5, + /datum/material/uranium = HALF_SHEET_MATERIAL_AMOUNT * 1.5, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT * 1.5, + ) /obj/item/weaponcrafting/gunkit/hellgun name = "hellfire laser gun degradation kit (warcrime lethal)" @@ -101,6 +133,7 @@ /obj/item/weaponcrafting/gunkit/photon name = "photon cannon parts kit (nonlethal)" desc = "A suitcase containing the necessary gun parts to construct a photon cannon around a stabilized flux anomaly. Harness the power of the sun, in the palms of your hands." + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 7, /datum/material/gold = SHEET_MATERIAL_AMOUNT * 5) /obj/item/weaponcrafting/gunkit/sks name = "\improper Sakhno SKS semi-automatic rifle parts kit (lethal)" diff --git a/code/datums/components/crafting/melee_weapon.dm b/code/datums/components/crafting/melee_weapon.dm index 671e355995a5..5ab6b44a7158 100644 --- a/code/datums/components/crafting/melee_weapon.dm +++ b/code/datums/components/crafting/melee_weapon.dm @@ -33,6 +33,51 @@ time = 4 SECONDS category = CAT_WEAPON_MELEE +/datum/crafting_recipe/stunsword + name = "\improper NT-20 'Excalibur' Stunsword" + result = /obj/item/melee/baton/security/stunsword + reqs = list( + /obj/item/claymore = 1, + /obj/item/melee/baton/security = 1 + ) + blacklist = list( + /obj/item/claymore/cutlass, + /obj/item/claymore/cutlass/old, + /obj/item/claymore/carrot, + /obj/item/claymore/shortsword, + /obj/item/claymore/highlander, + /obj/item/claymore/weak, + /obj/item/claymore/weak/ceremonial, + /obj/item/claymore/highlander/robot + ) + tool_behaviors = list(TOOL_WELDER) + time = 10 SECONDS + category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/stunswordalt + name = "\improper NT-20 'Excalibur' Stunsword" + result = /obj/item/melee/baton/security/stunsword + reqs = list( + /obj/item/katana = 1, + /obj/item/melee/baton/security = 1, + ) + tool_behaviors = list(TOOL_WELDER) + crafting_flags = parent_type::crafting_flags | CRAFT_SKIP_MATERIALS_PARITY + time = 10 SECONDS + category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/stunswordalt2 + name = "\improper NT-20 'Excalibur' Stunsword" + result = /obj/item/melee/baton/security/stunsword + reqs = list( + /obj/item/melee/sabre = 1, + /obj/item/melee/baton/telescopic/contractor_baton = 1, + ) + tool_behaviors = list(TOOL_WELDER) + crafting_flags = parent_type::crafting_flags | CRAFT_SKIP_MATERIALS_PARITY + time = 10 SECONDS + category = CAT_WEAPON_MELEE + /datum/crafting_recipe/tailclub name = "Tail Club" result = /obj/item/tailclub @@ -211,3 +256,15 @@ time = 120 SECONDS category = CAT_WEAPON_MELEE */ + +/datum/crafting_recipe/dragonator_spear_untreated + name = "Untreated Giant-Killer Spear" + result = /obj/item/spear/dragonator_untreated + reqs = list( + /obj/item/stack/sheet/plasteel = 15, + /obj/item/stack/sheet/mineral/titanium = 5, + /obj/item/knife = 7, + ) + time = 5 SECONDS + category = CAT_WEAPON_MELEE + diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm index 82d072db5fa3..24d061505d4c 100644 --- a/code/datums/components/crafting/ranged_weapon.dm +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -110,7 +110,7 @@ /datum/crafting_recipe/xraylaser name = "X-ray Laser Gun" - result = /obj/item/gun/energy/xray + result = /obj/item/gun/energy/laser/xray reqs = list( /obj/item/gun/energy/laser = 1, /obj/item/weaponcrafting/gunkit/xray = 1, @@ -316,7 +316,7 @@ /datum/crafting_recipe/pipe_organ_gun name = "Pipe Organ Gun" tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) - result = /obj/structure/mounted_gun/pipe + result = /obj/structure/mounted_gun/organ_gun reqs = list( /obj/item/pipe = 8, /obj/item/stack/sheet/mineral/wood = 15, @@ -328,7 +328,48 @@ time = 15 SECONDS category = CAT_WEAPON_RANGED crafting_flags = CRAFT_CHECK_DENSITY + +/datum/crafting_recipe/Ratvarian_Repeater + name = "Emplaced Ratvarian Repeater" + tool_behaviors = list(TOOL_SCREWDRIVER,TOOL_WRENCH) + result = /obj/structure/mounted_gun/ratvarian_repeater + reqs = list( + /obj/item/stack/cable_coil = 15, + /obj/item/stock_parts/micro_laser = 2, + /obj/item/stock_parts/capacitor = 2, + /obj/item/reagent_containers/cup/glass/drinkingglass = 2, + /obj/item/stack/sheet/bronze = 5, + /obj/item/stack/rods = 10, + ) + time = 15 SECONDS + category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY + +/datum/crafting_recipe/Detached_Ratvarian_Repeater + name = "Iconoclast's Repeater" + tool_behaviors = list(TOOL_WELDER) + result = /obj/item/gun/energy/laser/musket/repeater + structures = list( + /obj/structure/mounted_gun/ratvarian_repeater = CRAFTING_STRUCTURE_CONSUME, + ) + time = 10 SECONDS + category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY */ + +/datum/crafting_recipe/large_ballista + name = "Improvised Ballista" + tool_behaviors = list(TOOL_WELDER,TOOL_SCREWDRIVER,TOOL_WRENCH,TOOL_WIRECUTTER) + result = /obj/structure/mounted_gun/ballista + reqs = list( + /obj/item/stack/cable_coil = 15, + /obj/item/stack/sheet/iron = 10, + /obj/item/stack/rods = 10, + ) + time = 8 SECONDS + category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY + /datum/crafting_recipe/trash_cannon name = "Trash Cannon" tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) diff --git a/code/datums/components/crafting/structures.dm b/code/datums/components/crafting/structures.dm index 7a32efd976db..b047daabcdaf 100644 --- a/code/datums/components/crafting/structures.dm +++ b/code/datums/components/crafting/structures.dm @@ -8,6 +8,7 @@ result = /obj/item/stack/sheet/paperframes result_amount = 5 category = CAT_STRUCTURE + requirements_mats_blacklist = list(/obj/item/stack/sheet/mineral/wood) /datum/crafting_recipe/rib name = "Colossal Rib" @@ -107,3 +108,66 @@ ) category = CAT_STRUCTURE */ + +/datum/crafting_recipe/secure_safe + name = "Secure safe" + result = /obj/item/wallframe/secure_safe + reqs = list( + /obj/item/stack/sheet/plasteel = 10, + /obj/item/stack/sheet/mineral/titanium = 5, + /obj/item/stack/cable_coil = 5, + /obj/item/stack/rods = 5, + /obj/item/wallframe/button = 1, + ) + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_DRILL) + time = 30 SECONDS + removed_mats = list( + /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.55, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + ) + category = CAT_STRUCTURE + +/datum/crafting_recipe/vault + name = "Vault" + result = /obj/structure/safe/open + reqs = list( + /obj/item/stack/sheet/mineral/metal_hydrogen = 20, + /obj/item/stack/sheet/mineral/plastitanium = 10, + /obj/item/stack/cable_coil = 5, + /obj/item/stack/rods = 5, + /obj/item/wallframe/secure_safe = 1, + ) + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_DRILL) + time = 90 SECONDS + removed_mats = list( + /datum/material/metalhydrogen = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/alloy/plastitanium = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.5, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + ) + category = CAT_STRUCTURE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND + +/datum/crafting_recipe/vault_floor + name = "Floor Vault" + result = /obj/structure/safe/floor/open + reqs = list( + /obj/item/stack/sheet/mineral/metal_hydrogen = 20, + /obj/item/stack/sheet/mineral/plastitanium = 10, + /obj/item/stack/cable_coil = 5, + /obj/item/stack/rods = 5, + ) + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_DRILL) + time = 90 SECONDS + category = CAT_STRUCTURE + removed_mats = list( + /datum/material/metalhydrogen = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/alloy/plastitanium = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + ) + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm index 3bd34f5d53f7..c115c1c964c5 100644 --- a/code/datums/components/crafting/tailoring.dm +++ b/code/datums/components/crafting/tailoring.dm @@ -151,6 +151,7 @@ tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) reqs = list(/obj/item/clothing/glasses/hud/security/sunglasses = 1) category = CAT_EQUIPMENT + crafting_flags = parent_type::crafting_flags | CRAFT_SKIP_MATERIALS_PARITY /datum/crafting_recipe/hudsunmed name = "Medical HUDsunglasses" @@ -169,6 +170,7 @@ tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) reqs = list(/obj/item/clothing/glasses/hud/health/sunglasses = 1) category = CAT_EQUIPMENT + crafting_flags = parent_type::crafting_flags | CRAFT_SKIP_MATERIALS_PARITY /datum/crafting_recipe/hudsundiag name = "Diagnostic HUDsunglasses" @@ -187,6 +189,7 @@ tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) reqs = list(/obj/item/clothing/glasses/hud/diagnostic/sunglasses = 1) category = CAT_EQUIPMENT + crafting_flags = parent_type::crafting_flags | CRAFT_SKIP_MATERIALS_PARITY /datum/crafting_recipe/scienceglasses name = "Science Glasses" @@ -205,6 +208,7 @@ tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) reqs = list(/obj/item/clothing/glasses/sunglasses/chemical = 1) category = CAT_EQUIPMENT + crafting_flags = parent_type::crafting_flags | CRAFT_SKIP_MATERIALS_PARITY */ /datum/crafting_recipe/ghostsheet name = "Ghost Sheet" @@ -540,6 +544,7 @@ /obj/item/stack/sheet/mineral/metal_hydrogen = 1, /obj/item/stack/sheet/mineral/zaukerite = 1, ) + crafting_flags = parent_type::crafting_flags | CRAFT_SKIP_MATERIALS_PARITY // stupid recipe, don't give every atmos gas mask these mats. category = CAT_CLOTHING */ diff --git a/code/datums/components/crafting/tools.dm b/code/datums/components/crafting/tools.dm index f8df4fc03c2d..b1abcc20514d 100644 --- a/code/datums/components/crafting/tools.dm +++ b/code/datums/components/crafting/tools.dm @@ -17,6 +17,7 @@ blacklist = list(/obj/item/grown/log/steel) result = /obj/structure/bonfire category = CAT_TOOLS + crafting_flags = parent_type::crafting_flags | CRAFT_SKIP_MATERIALS_PARITY /datum/crafting_recipe/boneshovel name = "Serrated Bone Shovel" @@ -119,3 +120,27 @@ ) category = CAT_TOOLS +/datum/crafting_recipe/jaws_of_recovery + name = "Modified Jaws of Recovery" + desc = "This one acts like regular jaws of life, letting you pry any door and doesn't announce doors you're prying open." + time = 10 SECONDS + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WELDER) + result = /obj/item/crowbar/power/paramedic/silent + reqs = list( + /obj/item/crowbar/power = 1, + /obj/item/bonesetter = 1, + ) + category = CAT_TOOLS + +/datum/crafting_recipe/lantern + name = "Lantern" + result = /obj/item/flashlight/lantern + reqs = list( + /obj/item/flashlight/flare/candle = 1, + /obj/item/stack/rods = 1, + /obj/item/stack/sheet/glass = 1, + ) + crafting_flags = CRAFT_SKIP_MATERIALS_PARITY + tool_behaviors = list(TOOL_SCREWDRIVER) + category = CAT_TOOLS + diff --git a/code/datums/components/crafting/weapon_ammo.dm b/code/datums/components/crafting/weapon_ammo.dm index 5f91005e883e..76b0528f97a1 100644 --- a/code/datums/components/crafting/weapon_ammo.dm +++ b/code/datums/components/crafting/weapon_ammo.dm @@ -102,7 +102,9 @@ tool_behaviors = list(TOOL_SCREWDRIVER) time = 1.2 SECONDS category = CAT_WEAPON_AMMO + crafting_flags = CRAFT_SKIP_MATERIALS_PARITY */ + /datum/crafting_recipe/trashball name = "Trashball" result = /obj/item/stack/cannonball/trashball diff --git a/code/datums/components/cult_ritual_item.dm b/code/datums/components/cult_ritual_item.dm index 1e4e4ab76bcb..f9eb301392fd 100644 --- a/code/datums/components/cult_ritual_item.dm +++ b/code/datums/components/cult_ritual_item.dm @@ -300,12 +300,14 @@ return our_turf = get_turf(cultist) //we may have moved. adjust as needed... + var/can_have_blood = CAN_HAVE_BLOOD(cultist) + cultist.visible_message( - span_warning("[cultist] [cultist.blood_volume ? "cuts open [cultist.p_their()] arm and begins writing in [cultist.p_their()] own blood":"begins sketching out a strange design"]!"), - span_cult("You [cultist.blood_volume ? "slice open your arm and ":""]begin drawing a sigil of the Geometer.") + span_warning("[cultist] [can_have_blood ? "cuts open [cultist.p_their()] arm and begins writing in [cultist.p_their()] own blood":"begins sketching out a strange design"]!"), + span_cult("You [can_have_blood ? "slice open your arm and ":""]begin drawing a sigil of the Geometer.") ) - if(cultist.blood_volume) + if(can_have_blood) 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) @@ -332,7 +334,7 @@ return FALSE cultist.visible_message( - span_warning("[cultist] creates a strange circle[cultist.blood_volume ? " in [cultist.p_their()] own blood":""]."), + span_warning("[cultist] creates a strange circle[can_have_blood ? " in [cultist.p_their()] own blood":""]."), span_cult("You finish drawing the arcane markings of the Geometer.") ) diff --git a/code/datums/components/damage_aura.dm b/code/datums/components/damage_aura.dm index 9c4e996113b8..3497e83cb90f 100644 --- a/code/datums/components/damage_aura.dm +++ b/code/datums/components/damage_aura.dm @@ -97,13 +97,14 @@ /// 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) 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 + need_mob_update += owner_mob.adjust_stamina_loss(-20 * seconds_per_tick, updating_stamina = FALSE) + need_mob_update += owner_mob.adjust_brute_loss(-1 * seconds_per_tick, updating_health = FALSE) + need_mob_update += owner_mob.adjust_fire_loss(-1 * seconds_per_tick, updating_health = FALSE) + need_mob_update += owner_mob.adjust_tox_loss(-1 * seconds_per_tick, updating_health = FALSE, forced = TRUE) + need_mob_update += owner_mob.adjust_oxy_loss(-1 * seconds_per_tick, updating_health = FALSE) + + owner_mob.adjust_blood_volume(2 * seconds_per_tick, maximum = BLOOD_VOLUME_NORMAL) + if(need_mob_update) owner_mob.updatehealth() @@ -134,16 +135,16 @@ to_chat(candidate, damage_message) if (iscarbon(candidate) || issilicon(candidate) || isbasicmob(candidate)) - candidate.adjustBruteLoss(brute_damage * seconds_per_tick, updating_health = FALSE) - candidate.adjustFireLoss(burn_damage * seconds_per_tick, updating_health = FALSE) + candidate.adjust_brute_loss(brute_damage * seconds_per_tick, updating_health = FALSE) + candidate.adjust_fire_loss(burn_damage * seconds_per_tick, updating_health = FALSE) if (iscarbon(candidate)) - candidate.adjustToxLoss(toxin_damage * seconds_per_tick, updating_health = FALSE) - candidate.adjustOxyLoss(suffocation_damage * seconds_per_tick, updating_health = FALSE) - candidate.adjustStaminaLoss(stamina_damage * seconds_per_tick, updating_stamina = FALSE) + candidate.adjust_tox_loss(toxin_damage * seconds_per_tick, updating_health = FALSE) + candidate.adjust_oxy_loss(suffocation_damage * seconds_per_tick, updating_health = FALSE) + candidate.adjust_stamina_loss(stamina_damage * seconds_per_tick, updating_stamina = FALSE) for (var/organ in organ_damage) - candidate.adjustOrganLoss(organ, organ_damage[organ] * seconds_per_tick) + candidate.adjust_organ_loss(organ, organ_damage[organ] * seconds_per_tick) else if (isanimal(candidate)) var/mob/living/simple_animal/animal_candidate = candidate animal_candidate.adjustHealth(simple_damage * seconds_per_tick, updating_health = FALSE) @@ -151,8 +152,7 @@ var/mob/living/basic/basic_candidate = candidate basic_candidate.adjust_health(simple_damage * seconds_per_tick, updating_health = FALSE) - if (candidate.blood_volume > BLOOD_VOLUME_SURVIVE) - candidate.blood_volume -= blood_damage * seconds_per_tick + candidate.adjust_blood_volume(blood_damage * seconds_per_tick, minimum = BLOOD_VOLUME_SURVIVE) candidate.updatehealth() diff --git a/code/datums/components/dart_insert.dm b/code/datums/components/dart_insert.dm index 9770de669b55..f2816949c9d2 100644 --- a/code/datums/components/dart_insert.dm +++ b/code/datums/components/dart_insert.dm @@ -60,9 +60,9 @@ add_to_dart(dart, user) return COMPONENT_CANCEL_ATTACK_CHAIN -/datum/component/dart_insert/proc/on_reskin(datum/source, mob/user, skin) +/datum/component/dart_insert/proc/on_reskin(datum/source, skin) SIGNAL_HANDLER - SEND_SIGNAL(parent, COMSIG_DART_INSERT_PARENT_RESKINNED) + SEND_SIGNAL(parent, COMSIG_DART_INSERT_PARENT_RESKINNED, skin) /datum/component/dart_insert/proc/add_to_dart(obj/item/ammo_casing/dart, mob/user) var/obj/projectile/dart_projectile = dart.loaded_projectile diff --git a/code/datums/components/dejavu.dm b/code/datums/components/dejavu.dm index 249fdc97cb57..0c880ae7b4a3 100644 --- a/code/datums/components/dejavu.dm +++ b/code/datums/components/dejavu.dm @@ -48,12 +48,12 @@ if(isliving(parent)) var/mob/living/L = parent - tox_loss = L.getToxLoss() - oxy_loss = L.getOxyLoss() - stamina_loss = L.getStaminaLoss() + tox_loss = L.get_tox_loss() + oxy_loss = L.get_oxy_loss() + stamina_loss = L.get_stamina_loss() brain_loss = L.get_organ_loss(ORGAN_SLOT_BRAIN) rewind_type = PROC_REF(rewind_living) - aggravated_loss = L.getAggLoss() // DARKPACK EDIT ADD - AGGRAVATED_DAMAGE + aggravated_loss = L.get_agg_loss() // DARKPACK EDIT ADD - AGGRAVATED_DAMAGE if(iscarbon(parent)) var/mob/living/carbon/C = parent @@ -100,11 +100,11 @@ parent.AddComponent(type, 1, rewind_interval, TRUE) var/mob/living/master = parent - master.setToxLoss(tox_loss) - master.setOxyLoss(oxy_loss) - master.setStaminaLoss(stamina_loss) - master.setOrganLoss(ORGAN_SLOT_BRAIN, brain_loss) - master.setAggLoss(aggravated_loss) // DARKPACK EDIT ADD - AGGRAVATED_DAMAGE + master.set_tox_loss(tox_loss) + master.set_oxy_loss(oxy_loss) + master.set_stamina_loss(stamina_loss) + master.set_organ_loss(ORGAN_SLOT_BRAIN, brain_loss) + master.set_agg_loss(aggravated_loss) // DARKPACK EDIT ADD - AGGRAVATED_DAMAGE rewind() /datum/component/dejavu/proc/rewind_carbon() @@ -139,12 +139,12 @@ no_rewinds_message = "\"Rewind complete. You have arrived at: 10 seconds ago.\"" /datum/component/dejavu/timeline/rewind() - playsound(get_turf(parent), 'sound/items/modsuit/rewinder.ogg') - . = ..() + playsound(get_turf(parent), 'sound/items/modsuit/rewinder.ogg', 50, TRUE) + return ..() /datum/component/dejavu/wizard rewind_message = "Your temporal ward activated, pulling you through spacetime!" /datum/component/dejavu/wizard/rewind() - playsound(get_turf(parent), 'sound/items/modsuit/rewinder.ogg') - . = ..() + playsound(get_turf(parent), 'sound/items/modsuit/rewinder.ogg', 50, TRUE) + return ..() diff --git a/code/datums/components/earprotection.dm b/code/datums/components/earprotection.dm index 542a1d0c60f3..9d9e80ff09d1 100644 --- a/code/datums/components/earprotection.dm +++ b/code/datums/components/earprotection.dm @@ -1,14 +1,24 @@ +///Whenever get_ear_protection() is called, this proc adds 'protection_value' to the wearer's natural ear protection. /datum/component/wearertargeting/earprotection - signals = list(COMSIG_CARBON_SOUNDBANG) + signals = list(COMSIG_LIVING_GET_EAR_PROTECTION) mobtype = /mob/living/carbon proctype = PROC_REF(reducebang) - var/reduce_amount = 1 + //positive amount indicating how much protection this gives + var/protection_amount = 1 valid_slots = ITEM_SLOT_EARS | ITEM_SLOT_HEAD -/datum/component/wearertargeting/earprotection/Initialize(reduce_amount = 1) +/datum/component/wearertargeting/earprotection/Initialize(protection_amount = EAR_PROTECTION_NORMAL) . = ..() - if(reduce_amount) - src.reduce_amount = reduce_amount + src.protection_amount = protection_amount + RegisterSignal(parent, COMSIG_ATOM_EXAMINE_TAGS, PROC_REF(get_examine_tags)) /datum/component/wearertargeting/earprotection/proc/reducebang(datum/source, list/reflist) - reflist[1] -= reduce_amount + SIGNAL_HANDLER + reflist[EAR_PROTECTION_ARG] += protection_amount + +/datum/component/wearertargeting/earprotection/proc/get_examine_tags(atom/source, mob/user, list/examine_list) + SIGNAL_HANDLER + if(protection_amount == EAR_PROTECTION_NORMAL) + examine_list["sound-proof"] = "It protects the ears from flashbangs and other loud noises." + else if(protection_amount >= EAR_PROTECTION_HEAVY) + examine_list["sound-proof"] = "It provides [protection_amount == EAR_PROTECTION_FULL ? "full" : "heavy"] protection against flashbangs and other loud noises." diff --git a/code/datums/components/echolocation.dm b/code/datums/components/echolocation.dm index a40c14306290..59b18ae0001b 100644 --- a/code/datums/components/echolocation.dm +++ b/code/datums/components/echolocation.dm @@ -99,17 +99,15 @@ if(HAS_TRAIT(echolocator, TRAIT_ECHOLOCATION_EXTRA_RANGE)) real_echo_range += 2 var/list/filtered = list() - var/list/seen = dview(real_echo_range, get_turf(echolocator.client?.eye || echolocator), invis_flags = echolocator.see_invisible) if(blinding) - for(var/atom/seen_atom as anything in seen) + for(var/atom/seen_atom as anything in dview(real_echo_range, get_turf(echolocator.client?.eye || echolocator), invis_flags = echolocator.see_invisible)) if(!seen_atom.alpha) continue if(allowed_paths[seen_atom.type]) filtered += seen_atom else - var/list/ranged_atoms = range(real_echo_range, get_turf(echolocator.client?.eye || echolocator)) - for(var/atom/possible_atom as anything in ranged_atoms) - if(!possible_atom.alpha) + for(var/atom/possible_atom as anything in range(real_echo_range, get_turf(echolocator.client?.eye || echolocator))) + if(!possible_atom.alpha || possible_atom.invisibility > echolocator.see_invisible) continue if(allowed_paths[possible_atom.type]) filtered += possible_atom diff --git a/code/datums/components/empathy.dm b/code/datums/components/empathy.dm new file mode 100644 index 000000000000..fb147ac6013e --- /dev/null +++ b/code/datums/components/empathy.dm @@ -0,0 +1,98 @@ +// Empath quirk component, it's a component because it can be applied in ways that don't give you the quirk. (For health analyzer purposes) + +/datum/component/empathy + + dupe_mode = COMPONENT_DUPE_SOURCES + + // Whether or not we should get scared the next time we see an evil person. + var/seen_it = FALSE + + // What sort of information we can glean from examining someone + var/visible_info = ALL + + // Whether or not we can use empathy on ourselves + var/self_empath = FALSE + + // Whether or not empathy works on humans playing dead + var/sense_dead = FALSE + + // Whether or not we can tell if people whisper under their mask from far away (We can't hear what they said, we just know they said something) + var/sense_whisper = TRUE + + // Whether or not we can be smited by someoneone with the evil trait using the mending touch mutation + var/smite_target = TRUE + +/datum/component/empathy/Initialize(seen_it = FALSE, visible_info = ALL, self_empath = FALSE, sense_dead = FALSE, sense_whisper = TRUE, smite_target = TRUE) + if (!isliving(parent)) + return COMPONENT_INCOMPATIBLE + + src.seen_it = seen_it + src.visible_info = visible_info + src.self_empath = self_empath + src.sense_dead = sense_dead + src.sense_whisper = sense_whisper + src.smite_target = smite_target + if(sense_whisper) + ADD_TRAIT(parent, TRAIT_SEE_MASK_WHISPER, REF(src)) + +/datum/component/empathy/RegisterWithParent() + RegisterSignal(parent, COMSIG_CARBON_MID_EXAMINE, PROC_REF(get_empath_info)) + RegisterSignal(parent, COMSIG_ON_LAY_ON_HANDS, PROC_REF(on_hands_laid)) + +/datum/component/empathy/proc/get_empath_info(datum/source, mob/living/target, list/examine_list) + SIGNAL_HANDLER + if(target.stat == DEAD) + return + if(HAS_TRAIT(target, TRAIT_FAKEDEATH)) + if(sense_dead) + examine_list += "Something about this dead body doesn't look right..." + else + return + var/mob/living/living_parent = parent + if(target == living_parent && !self_empath) + return + var/t_They = target.p_They() + var/t_their = target.p_their() + var/t_Their = target.p_Their() + var/t_are = target.p_are() + if((visible_info & EMPATH_SEE_COMBAT) && target.combat_mode) + examine_list += "[t_They] seem[p_s()] to be on guard." + if((visible_info & EMPATH_SEE_OXY) && target.get_oxy_loss() >= 10) + examine_list += "[t_They] seem[p_s()] winded." + if((visible_info & EMPATH_SEE_TOX) && target.get_tox_loss() >= 10) + examine_list += "[t_They] seem[p_s()] sickly." + if((visible_info & EMPATH_SEE_SANITY) && target.mob_mood.sanity <= SANITY_DISTURBED) + examine_list += "[t_They] seem[p_s()] distressed." + if((visible_info & EMPATH_SEE_BLIND) && target.is_blind()) + examine_list += "[t_They] appear[p_s()] to be staring off into space." + if((visible_info & EMPATH_SEE_DEAF) && HAS_TRAIT(target, TRAIT_DEAF)) + examine_list += "[t_They] appear[p_s()] to not be responding to noises." + if((visible_info & EMPATH_SEE_HOT) && target.bodytemperature > target.get_body_temp_heat_damage_limit()) + examine_list += "[t_They] [t_are] flushed and wheezing." + if((visible_info & EMPATH_SEE_COLD) && target.bodytemperature < target.get_body_temp_cold_damage_limit()) + examine_list += "[t_They] [t_are] shivering." + if((visible_info & EMPATH_SEE_EVIL) && HAS_TRAIT(target, TRAIT_EVIL)) + examine_list += "[t_Their] eyes radiate with a unfeeling, cold detachment. There is nothing but darkness within [t_their] soul." + if(living_parent.mind?.holy_role >= HOLY_ROLE_PRIEST) + examine_list += span_warning("PERFECT FOR SMITING!!") + else if(!seen_it) + seen_it = TRUE + living_parent.add_mood_event("encountered_evil", /datum/mood_event/encountered_evil) + living_parent.set_jitter_if_lower(15 SECONDS) + +/datum/component/empathy/proc/on_hands_laid(datum/source, mob/living/carbon/smiter) + SIGNAL_HANDLER + if(iscarbon(parent)) + var/mob/living/carbon/carbon_parent = parent + if(carbon_parent.mob_biotypes & MOB_UNDEAD) + return FALSE + if(smite_target && HAS_TRAIT(smiter, TRAIT_EVIL)) + return TRUE + return FALSE + +/datum/component/empathy/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_CARBON_MID_EXAMINE) + +/datum/component/empathy/Destroy(force = FALSE) + REMOVE_TRAIT(parent, TRAIT_SEE_MASK_WHISPER, REF(src)) + return ..() diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm index db90b67a0833..5a89a6125fe6 100644 --- a/code/datums/components/fantasy/suffixes.dm +++ b/code/datums/components/fantasy/suffixes.dm @@ -111,11 +111,12 @@ /mob/living/simple_animal, ) for(var/type in mob_subtype_whitelist) - possible_mobtypes += subtypesof(type) + possible_mobtypes += valid_subtypesof(type) var/list/mob_subtype_blacklist = list( /mob/living/simple_animal/hostile/asteroid/elite, /mob/living/simple_animal/hostile/megafauna, + /mob/living/basic/boss, ) for(var/type in mob_subtype_blacklist) possible_mobtypes -= subtypesof(type) diff --git a/code/datums/components/fearful/effects.dm b/code/datums/components/fearful/effects.dm index b2b4458cbfa1..17a62201257d 100644 --- a/code/datums/components/fearful/effects.dm +++ b/code/datums/components/fearful/effects.dm @@ -52,7 +52,7 @@ /datum/terror_handler/heart_problems handler_type = TERROR_HANDLER_EFFECT default = TRUE - COOLDOWN_DECLARE(effect_cd) + COOLDOWN_DECLARE(message_cd) /datum/terror_handler/heart_problems/tick(seconds_per_tick, terror_buildup) . = ..() @@ -66,7 +66,10 @@ return if (terror_buildup < TERROR_BUILDUP_HEART_ATTACK || !prob(15)) - owner.adjustOxyLoss(8) + owner.adjust_oxy_loss(8) + if (!COOLDOWN_FINISHED(src, message_cd)) + return + COOLDOWN_START(src, message_cd, TERROR_MESSAGE_CD) if (terror_buildup < TERROR_BUILDUP_FEAR) to_chat(owner, span_warning("Your heart skips a beat.")) else @@ -167,4 +170,48 @@ deltimer(panic_end_timer) panic_end_timer = null +/datum/terror_handler/startle + handler_type = TERROR_HANDLER_EFFECT + COOLDOWN_DECLARE(startle_cd) + +/datum/terror_handler/startle/tick(seconds_per_tick, terror_buildup) + . = ..() + if (owner.stat >= UNCONSCIOUS || !COOLDOWN_FINISHED(src, startle_cd)) + return + + if (terror_buildup < TERROR_BUILDUP_FEAR || terror_buildup - component.last_tick_buildup < TERROR_STARTLE_MINIMUM_DIFFERENCE) + return + + // The more scared we are, and the more fear we acquired at once last tick, the higher the probability of us being startled is + // Not SPT_PROB or FEAR_SCALING because this is only triggered during ticks when we actually acquire fear + if (!prob(15 * (terror_buildup - component.last_tick_buildup) / TERROR_STARTLE_MINIMUM_DIFFERENCE * terror_buildup / TERROR_BUILDUP_FEAR)) + return + + COOLDOWN_START(src, startle_cd, TERROR_STARTLE_COOLDOWN) + switch (rand(1, 3)) + if (1) + to_chat(owner, span_warning("You are startled!")) + owner.emote("jump") + owner.Immobilize(0.1 SECONDS * (terror_buildup / TERROR_BUILDUP_FEAR)) + + if (2) + owner.emote("scream") + owner.say("AAAAH!!", forced = "phobia") + if (!prob(15 * (terror_buildup / TERROR_BUILDUP_FEAR))) + return + var/held_item = owner.get_active_held_item() + if (owner.dropItemToGround(held_item)) + owner.visible_message( + span_danger("[owner.name] drops \the [held_item]!"), + span_warning("You drop \the [held_item]!"), null, COMBAT_MESSAGE_RANGE) + + if (3) + to_chat(owner, span_warning("You lose your balance!")) + owner.adjust_staggered_up_to(2 SECONDS * (terror_buildup / TERROR_BUILDUP_FEAR), 20 SECONDS) + owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/spooked) + addtimer(CALLBACK(src, PROC_REF(speed_up)), 3 SECONDS, TIMER_STOPPABLE | TIMER_DELETE_ME) + +/datum/terror_handler/startle/proc/speed_up() + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/spooked) + #undef FEAR_SCALING diff --git a/code/datums/components/fearful/fearful.dm b/code/datums/components/fearful/fearful.dm index e75d739c2a5a..a2480acb4820 100644 --- a/code/datums/components/fearful/fearful.dm +++ b/code/datums/components/fearful/fearful.dm @@ -73,7 +73,7 @@ /datum/component/fearful/proc/add_handler(handler_type, source) for (var/datum/terror_handler/existing as anything in terror_handlers) - if (existing.type == handler_type) + if (existing.type == handler_type && !existing.bespoke) terror_handlers[existing] += source return @@ -83,8 +83,21 @@ if (!overriden_handlers[override_type]) overriden_handlers[override_type] = list() overriden_handlers[override_type][handler_type] = TRUE + return handler + +/datum/component/fearful/proc/get_fear_multiplier() + var/multiplier = 1 + var/mob/living/parent_mob = parent + if(HAS_PERSONALITY(parent_mob, /datum/personality/cowardly)) + multiplier *= 1.25 + if(HAS_PERSONALITY(parent_mob, /datum/personality/paranoid)) + multiplier *= 1.10 + if(HAS_PERSONALITY(parent_mob, /datum/personality/brave)) + multiplier *= 0.75 + return multiplier /datum/component/fearful/process(seconds_per_tick) + var/fear_modifier = get_fear_multiplier() var/terror_adjustment = 0 var/list/tick_later = list() for (var/datum/terror_handler/handler as anything in terror_handlers) @@ -94,12 +107,12 @@ tick_later += handler continue var/adjustment = handler.tick(seconds_per_tick, terror_buildup) - terror_buildup = clamp(terror_buildup + adjustment, 0, TERROR_BUILDUP_MAXIMUM) + terror_buildup = clamp(terror_buildup + (adjustment * fear_modifier), 0, TERROR_BUILDUP_MAXIMUM) terror_adjustment += adjustment for (var/datum/terror_handler/handler as anything in tick_later) var/adjustment = handler.tick(seconds_per_tick, terror_buildup) - terror_buildup = clamp(terror_buildup + adjustment, 0, TERROR_BUILDUP_MAXIMUM) + terror_buildup = clamp(terror_buildup + (adjustment * fear_modifier), 0, TERROR_BUILDUP_MAXIMUM) terror_adjustment += adjustment // If we gained terror in any way, don't tick it down @@ -109,7 +122,7 @@ // Tick terror down while we're not being actively spooked if (terror_buildup > 0) - terror_buildup = max(terror_buildup - TERROR_BUILDUP_PASSIVE_DECREASE, 0) + terror_buildup = max(terror_buildup - (TERROR_BUILDUP_PASSIVE_DECREASE * (1 / fear_modifier)) * seconds_per_tick, 0) last_tick_buildup = terror_buildup /datum/component/fearful/proc/on_examine(mob/living/source, mob/user, list/examine_list) @@ -156,11 +169,12 @@ ) return COMPONENT_BLOCK_MISC_HELP - for (var/datum/brain_trauma/mild/phobia/phobia in source.get_traumas()) - if (!phobia.is_scary_mob(hugger)) - continue + var/hug_buildup = 0 + for (var/datum/terror_handler/handler as anything in terror_handlers) + hug_buildup += handler.on_hug(hugger) - terror_buildup += HUG_TERROR_AMOUNT + if (hug_buildup > 0) + terror_buildup += hug_buildup source.visible_message( span_warning("[source] recoils in fear as [hugger] attempts to hug [source.p_them()]!"), span_boldwarning("You recoil in terror as [hugger] attempts to hug you!"), diff --git a/code/datums/components/fearful/sources.dm b/code/datums/components/fearful/sources.dm deleted file mode 100644 index c0fd104c9c87..000000000000 --- a/code/datums/components/fearful/sources.dm +++ /dev/null @@ -1,168 +0,0 @@ -// Terror source handlers -/// Simple source which passively increases terror based on a single condition and can do something when its added/removed -/datum/terror_handler/simple_source - handler_type = TERROR_HANDLER_SOURCE - /// How much terror is added per second - var/buildup_per_second = 10 - /// Have we already applied our effects? - var/active = FALSE - -/datum/terror_handler/simple_source/tick(seconds_per_tick, terror_buildup) - . = ..() - if (check_condition(seconds_per_tick, terror_buildup) && terror_buildup < TERROR_BUILDUP_PASSIVE_MAXIMUM) - if (!active) - on_activation(terror_buildup) - . += min(buildup_per_second * seconds_per_tick, TERROR_BUILDUP_PASSIVE_MAXIMUM - terror_buildup) - else if (active) - on_deactivation(terror_buildup) - -/// Proc that children should override with their conditions -/datum/terror_handler/simple_source/proc/check_condition(seconds_per_tick, terror_buildup) - return !HAS_TRAIT(owner, TRAIT_FEARLESS) && !HAS_TRAIT(owner, TRAIT_MIND_TEMPORARILY_GONE) && owner.stat < UNCONSCIOUS - -/// Proc that's called when the effect is first applied, for moodlets and alike -/datum/terror_handler/simple_source/proc/on_activation(terror_buildup) - active = TRUE - -/// Proc that's called when the effect stops working, for moodlets and alike -/datum/terror_handler/simple_source/proc/on_deactivation(terror_buildup) - active = FALSE - -/// Makes the owner terrified of darkness -/datum/terror_handler/simple_source/nyctophobia - buildup_per_second = 5 // Takes about two minutes to reach maximum - /// Are we counteracted by mesons? - var/meson_negated = TRUE - -/datum/terror_handler/simple_source/nyctophobia/Destroy(force) - owner.clear_mood_event("nyctophobia") - return ..() - -/datum/terror_handler/simple_source/nyctophobia/check_condition(seconds_per_tick, terror_buildup) - . = ..() - if (!.) - return - - if (ishuman(owner)) - var/mob/living/carbon/human/as_human = owner - if(as_human.dna?.species.id in list(SPECIES_SHADOW, SPECIES_NIGHTMARE)) - return FALSE - - if (meson_negated && (owner.sight & SEE_TURFS)) - return FALSE - - var/lit_tiles = 0 - var/unlit_tiles = 0 - - for (var/turf/open/turf_to_check in range(1, owner)) - var/light_amount = turf_to_check.get_lumcount() - if (light_amount > LIGHTING_TILE_IS_DARK) - lit_tiles++ - else - unlit_tiles++ - - return lit_tiles < unlit_tiles - -/datum/terror_handler/simple_source/nyctophobia/on_activation(terror_buildup) - . = ..() - owner.add_mood_event("nyctophobia", /datum/mood_event/nyctophobia) - -/datum/terror_handler/simple_source/nyctophobia/on_deactivation(terror_buildup) - . = ..() - owner.clear_mood_event("nyctophobia") - -// Nightmare spell version with quicker buildup that shadows the quirk one, also handles removing the status upon reaching 0 terror -/datum/terror_handler/simple_source/nyctophobia/terrified - // Takes about 30 seconds to reach maximum if you include 100 from casting the spell - buildup_per_second = 15 - // Overrides the base type with slower buildup - overrides = list(/datum/terror_handler/simple_source/nyctophobia) - meson_negated = FALSE - -/datum/terror_handler/simple_source/nyctophobia/terrified/tick(seconds_per_tick, terror_buildup) - . = ..() - if (terror_buildup == 0 && !.) - owner.RemoveComponentSource("terrified", /datum/component/fearful) - -/// Makes the owner afraid of being stuck in closets, crates, mechs, etc -/datum/terror_handler/simple_source/claustrophobia - buildup_per_second = 15 - -/datum/terror_handler/simple_source/claustrophobia/Destroy(force) - owner.clear_mood_event("claustrophobia") - return ..() - -/datum/terror_handler/simple_source/claustrophobia/check_condition(seconds_per_tick, terror_buildup) - . = ..() - if (!.) - return - - if (isturf(owner.loc)) - return FALSE - - if (SPT_PROB(15, seconds_per_tick)) - to_chat(owner, span_warning("You feel trapped! Must escape... can't breathe...")) - - return TRUE - -/datum/terror_handler/simple_source/claustrophobia/on_activation(terror_buildup) - . = ..() - owner.add_mood_event("claustrophobia", /datum/mood_event/claustrophobia) - -/datum/terror_handler/simple_source/claustrophobia/on_deactivation(terror_buildup) - . = ..() - owner.clear_mood_event("claustrophobia") - -/// Makes the owner afraid of certain jolly figures -/datum/terror_handler/simple_source/clausophobia - buildup_per_second = 20 - -/datum/terror_handler/simple_source/clausophobia/check_condition(seconds_per_tick, terror_buildup) - . = ..() - if (!.) - return - - var/certified_jolly = FALSE - - for(var/mob/living/carbon/human/possible_claus in view(5, owner)) - if(istype(possible_claus.back, /obj/item/storage/backpack/santabag)) - certified_jolly = TRUE - break - - if(istype(possible_claus.head, /obj/item/clothing/head/costume/santa) || istype(possible_claus.head, /obj/item/clothing/head/helmet/space/santahat)) - certified_jolly = TRUE - break - - if(istype(possible_claus.wear_suit, /obj/item/clothing/suit/space/santa)) - certified_jolly = TRUE - break - - if (!certified_jolly) - return FALSE - - if (SPT_PROB(15, seconds_per_tick)) - to_chat(owner, span_warning("Santa Claus is here! I gotta get out of here!")) - - return TRUE - -/// Makes the owner afraid of being alone -/datum/terror_handler/simple_source/monophobia - buildup_per_second = 2.5 // Pretty low, ~4 minutes to reach passive cap - -/datum/terror_handler/simple_source/monophobia/check_condition(seconds_per_tick, terror_buildup) - . = ..() - if (!.) - return - - var/check_radius = 7 - if (owner.is_blind()) - check_radius = 1 - - for (var/mob/living/friend in view(check_radius, owner)) - if (friend == owner) - continue - - if (istype(friend, /mob/living/basic/pet) || friend.ckey) - return FALSE - - return TRUE diff --git a/code/datums/components/fearful/sources/_sources.dm b/code/datums/components/fearful/sources/_sources.dm new file mode 100644 index 000000000000..6c5631671992 --- /dev/null +++ b/code/datums/components/fearful/sources/_sources.dm @@ -0,0 +1,179 @@ +// Terror source handlers +/// Simple source which passively increases terror based on a single condition and can do something when its added/removed +/datum/terror_handler/simple_source + handler_type = TERROR_HANDLER_SOURCE + /// How much terror is added per second + var/buildup_per_second = 10 + /// Have we already applied our effects? + var/active = FALSE + +/datum/terror_handler/simple_source/tick(seconds_per_tick, terror_buildup) + . = ..() + if (check_condition(seconds_per_tick, terror_buildup) && terror_buildup < TERROR_BUILDUP_PASSIVE_MAXIMUM) + if (!active) + on_activation(terror_buildup) + . += min(buildup_per_second * seconds_per_tick, TERROR_BUILDUP_PASSIVE_MAXIMUM - terror_buildup) + else if (active) + on_deactivation(terror_buildup) + +/// Proc that children should override with their conditions +/datum/terror_handler/simple_source/proc/check_condition(seconds_per_tick, terror_buildup) + return !HAS_TRAIT(owner, TRAIT_FEARLESS) && !HAS_TRAIT(owner, TRAIT_MIND_TEMPORARILY_GONE) && owner.stat < UNCONSCIOUS + +/// Proc that's called when the effect is first applied, for moodlets and alike +/datum/terror_handler/simple_source/proc/on_activation(terror_buildup) + active = TRUE + +/// Proc that's called when the effect stops working, for moodlets and alike +/datum/terror_handler/simple_source/proc/on_deactivation(terror_buildup) + active = FALSE + +/// Makes the owner terrified of darkness +/datum/terror_handler/simple_source/nyctophobia + buildup_per_second = 5 // Takes about two minutes to reach maximum + /// Are we counteracted by mesons? + var/meson_negated = TRUE + +/datum/terror_handler/simple_source/nyctophobia/Destroy(force) + owner.clear_mood_event("nyctophobia") + return ..() + +/datum/terror_handler/simple_source/nyctophobia/check_condition(seconds_per_tick, terror_buildup) + . = ..() + if (!.) + return + + if (ishuman(owner)) + var/mob/living/carbon/human/as_human = owner + if(as_human.dna?.species.id in list(SPECIES_SHADOW, SPECIES_NIGHTMARE)) + return FALSE + + if (meson_negated && (owner.sight & SEE_TURFS)) + return FALSE + + var/lit_tiles = 0 + var/unlit_tiles = 0 + + for (var/turf/open/turf_to_check in range(1, owner)) + var/light_amount = turf_to_check.get_lumcount() + if (light_amount > LIGHTING_TILE_IS_DARK) + lit_tiles++ + else + unlit_tiles++ + + return lit_tiles < unlit_tiles + +/datum/terror_handler/simple_source/nyctophobia/on_activation(terror_buildup) + . = ..() + owner.add_mood_event("nyctophobia", /datum/mood_event/nyctophobia) + +/datum/terror_handler/simple_source/nyctophobia/on_deactivation(terror_buildup) + . = ..() + owner.clear_mood_event("nyctophobia") + +/// Nightmare spell version with quicker buildup that shadows the quirk one, also handles removing the status upon reaching 0 terror +/datum/terror_handler/simple_source/nyctophobia/terrified + // Takes about 30 seconds to reach maximum if you include 100 from casting the spell + buildup_per_second = 15 + // Overrides the base type with slower buildup + overrides = list(/datum/terror_handler/simple_source/nyctophobia) + meson_negated = FALSE + +/datum/terror_handler/simple_source/nyctophobia/terrified/tick(seconds_per_tick, terror_buildup) + . = ..() + if (terror_buildup == 0 && !.) + owner.RemoveComponentSource("terrified", /datum/component/fearful) + +/// Makes the owner afraid of being stuck in closets, crates, mechs, etc +/datum/terror_handler/simple_source/claustrophobia + buildup_per_second = 15 + COOLDOWN_DECLARE(message_cd) + +/datum/terror_handler/simple_source/claustrophobia/Destroy(force) + owner.clear_mood_event("claustrophobia") + return ..() + +/datum/terror_handler/simple_source/claustrophobia/check_condition(seconds_per_tick, terror_buildup) + . = ..() + if (!.) + return + + if (isturf(owner.loc)) + return FALSE + + if (COOLDOWN_FINISHED(src, message_cd) && SPT_PROB(15, seconds_per_tick)) + to_chat(owner, span_warning("You feel trapped! Must escape... can't breathe...")) + COOLDOWN_START(src, message_cd, TERROR_MESSAGE_CD) + + return TRUE + +/datum/terror_handler/simple_source/claustrophobia/on_activation(terror_buildup) + . = ..() + owner.add_mood_event("claustrophobia", /datum/mood_event/claustrophobia) + +/datum/terror_handler/simple_source/claustrophobia/on_deactivation(terror_buildup) + . = ..() + owner.clear_mood_event("claustrophobia") + +/// Makes the owner afraid of certain jolly figures +/datum/terror_handler/simple_source/clausophobia + buildup_per_second = 20 + COOLDOWN_DECLARE(message_cd) + +/datum/terror_handler/simple_source/clausophobia/check_condition(seconds_per_tick, terror_buildup) + . = ..() + if (!.) + return + + var/certified_jolly = FALSE + + for (var/mob/living/carbon/human/possible_claus in view(5, owner)) + if (possible_claus == owner) + continue // imagine being scared of your own existence + + if (!istype(possible_claus.wear_suit, /obj/item/clothing/suit/space/santa)) + continue + + if (istype(possible_claus.back, /obj/item/storage/backpack/santabag)) + certified_jolly = TRUE + break + + if (istype(possible_claus.head, /obj/item/clothing/head/costume/santa) || istype(possible_claus.head, /obj/item/clothing/head/helmet/space/santahat)) + certified_jolly = TRUE + break + + if (!certified_jolly) + return FALSE + + if (COOLDOWN_FINISHED(src, message_cd) && SPT_PROB(15, seconds_per_tick)) + to_chat(owner, span_warning("Santa Claus is here! I gotta get out of here!")) + COOLDOWN_START(src, message_cd, TERROR_MESSAGE_CD) + + return TRUE + +/// Makes the owner afraid of being alone +/datum/terror_handler/simple_source/monophobia + buildup_per_second = 2.5 // Pretty low, ~4 minutes to reach passive cap + COOLDOWN_DECLARE(message_cd) + +/datum/terror_handler/simple_source/monophobia/check_condition(seconds_per_tick, terror_buildup) + . = ..() + if (!.) + return + + var/check_radius = 7 + if (owner.is_blind()) + check_radius = 1 + + for (var/mob/living/friend in view(check_radius, owner)) + if (friend == owner) + continue + + if (istype(friend, /mob/living/basic/pet) || friend.ckey) + return FALSE + + if (COOLDOWN_FINISHED(src, message_cd) && SPT_PROB(10, seconds_per_tick)) + to_chat(owner, span_warning("You feel terribly lonely...")) + COOLDOWN_START(src, message_cd, TERROR_MESSAGE_CD) + + return TRUE diff --git a/code/datums/components/fearful/sources/phobia.dm b/code/datums/components/fearful/sources/phobia.dm new file mode 100644 index 000000000000..e93038677698 --- /dev/null +++ b/code/datums/components/fearful/sources/phobia.dm @@ -0,0 +1,170 @@ +/// Complex terror source that increases buildup whenever the owner hears, sees, or tries to say something they're afraid of +/datum/terror_handler/phobia_source + handler_type = TERROR_HANDLER_SOURCE + bespoke = TRUE + /// Last time we got scared shitless for passive increase in fear + /// Regex for words that set the phobia off + var/regex/trigger_regex + // Instead of cycling every atom, only cycle the relevant types + var/list/trigger_mobs + /// Includes mob equipment + var/list/trigger_objs + var/list/trigger_turfs + var/list/trigger_species + /// What mood event to apply when we see the thing & freak out. + var/mood_event_type = /datum/mood_event/phobia + /// Cooldown for proximity checks so we don't spam a range 7 view every two seconds. + COOLDOWN_DECLARE(check_cooldown) + /// Cooldown for the actual scare effect so chat spam won't instantly send us spiraling + COOLDOWN_DECLARE(scare_cooldown) + +/datum/terror_handler/phobia_source/New(mob/living/new_owner, datum/component/fearful/new_component) + . = ..() + RegisterSignal(new_owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + RegisterSignal(new_owner, COMSIG_MOVABLE_HEAR, PROC_REF(handle_hearing)) + +/datum/terror_handler/phobia_source/Destroy(force) + UnregisterSignal(owner, list(COMSIG_MOB_SAY, COMSIG_MOVABLE_HEAR)) + return ..() + +/datum/terror_handler/phobia_source/proc/can_trigger() + return !HAS_TRAIT(owner, TRAIT_FEARLESS) && !HAS_TRAIT(owner, TRAIT_MIND_TEMPORARILY_GONE) && owner.stat < UNCONSCIOUS + +/datum/terror_handler/phobia_source/tick(seconds_per_tick, terror_buildup) + . = ..() + if (!can_trigger()) + return + + // If we're still scared from the last trigger, keep adding just a tiiiiny buildup to prevent it from fading away + if (!COOLDOWN_FINISHED(src, scare_cooldown)) + return 0.01 + + if(!COOLDOWN_FINISHED(src, check_cooldown) || owner.is_blind()) + return + + COOLDOWN_START(src, check_cooldown, PHOBIA_CHECK_DELAY) + if(LAZYLEN(trigger_objs)) + for (var/obj/seen_thing in view(owner.client?.view || world.view, owner)) + if(is_scary_item(seen_thing)) + return freak_out(seen_thing) + + if(LAZYLEN(trigger_turfs)) + for(var/turf/checked in view(owner.client?.view || world.view, owner)) + if(is_type_in_typecache(checked, trigger_turfs)) + return freak_out(checked) + + if(LAZYLEN(trigger_mobs) || LAZYLEN(trigger_species) || LAZYLEN(trigger_objs)) + for(var/mob/living/checked in view(owner.client?.view || world.view, owner)) + if (checked != owner && is_scary_mob(checked)) + return freak_out(checked) + +/// Returns true if this item should be scary to us +/datum/terror_handler/phobia_source/proc/is_scary_item(obj/checked) + if (QDELETED(checked) || !is_type_in_typecache(checked, trigger_objs) || checked.invisibility > owner.see_invisible) + return FALSE + + if (!isitem(checked) || !ismob(checked.loc) || HAS_TRAIT(checked.loc, TRAIT_UNKNOWN_APPEARANCE)) + return TRUE + + var/obj/item/checked_item = checked + return !HAS_TRAIT(checked_item, TRAIT_EXAMINE_SKIP) + +/datum/terror_handler/phobia_source/proc/is_scary_mob(mob/living/checked) + if (checked.invisibility > owner.see_invisible || checked.alpha == 0) + return FALSE + + if (is_type_in_typecache(checked, trigger_mobs)) + return TRUE + + if (!ishuman(checked)) + return FALSE + + var/mob/living/carbon/human/as_human = checked + if (LAZYLEN(trigger_species)) + // Can't be racist(?) if you can't see their face + if (is_type_in_typecache(as_human.dna?.species, trigger_species) && !as_human.is_face_obscured()) + return TRUE + + if (!LAZYLEN(trigger_objs)) + return FALSE + + for (var/obj/item/equipped as anything in as_human.get_visible_items()) + if (is_scary_item(equipped)) + return TRUE + + return FALSE + +/datum/terror_handler/phobia_source/proc/handle_hearing(datum/source, list/hearing_args) + SIGNAL_HANDLER + + if (!can_trigger() || !COOLDOWN_FINISHED(src, scare_cooldown)) + return + + // Words can't trigger you if you can't hear them *taps head* + if(!owner.can_hear() || owner == hearing_args[HEARING_SPEAKER] || !owner.has_language(hearing_args[HEARING_LANGUAGE])) + return + + if(trigger_regex.Find(hearing_args[HEARING_RAW_MESSAGE])) + // To react AFTER the chat message + addtimer(CALLBACK(src, PROC_REF(freak_out), null, trigger_regex.group[2]), 1 SECONDS) + hearing_args[HEARING_RAW_MESSAGE] = trigger_regex.Replace(hearing_args[HEARING_RAW_MESSAGE], "[span_phobia("$2")]$3") + +/datum/terror_handler/phobia_source/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + + if (!can_trigger()) + return + + if (trigger_regex.Find(speech_args[SPEECH_MESSAGE]) == 0) + return + + var/stutter = prob(50) + var/whisper = prob(30) + + if (!stutter && !whisper) + return + + if (whisper) + speech_args[SPEECH_SPANS] |= SPAN_SMALL_VOICE + if (stutter) + owner.set_stutter_if_lower(4 SECONDS) + to_chat(owner, span_warning("You struggle to say the word \"[span_phobia("[trigger_regex.group[2]]")]\"!")) + +/datum/terror_handler/phobia_source/proc/freak_out(reason) + COOLDOWN_START(src, scare_cooldown, 12 SECONDS) + var/message = pick("spooks you to the bone", "shakes you up", "terrifies you", "sends you into a panic", "sends chills down your spine") + if(istext(reason)) + to_chat(owner, span_bolddanger("Hearing [span_phobia(reason)] [message]!")) + owner.add_mood_event("phobia_minor", /datum/mood_event/startled) + // Because this is called from a signal and not the main process, we need to add the buildup by hand + if (component.terror_buildup < TERROR_BUILDUP_PASSIVE_MAXIMUM) + component.terror_buildup = min(component.terror_buildup + PHOBIA_WORD_TERROR_BUILDUP, TERROR_BUILDUP_PASSIVE_MAXIMUM) + return + + if(mood_event_type) + owner.add_mood_event("phobia", mood_event_type) + + if(isatom(reason)) + var/atom/as_atom = reason + to_chat(owner, span_bolddanger("Seeing [span_phobia("[as_atom.name]")] [message]!")) + else + to_chat(owner, span_bolddanger("Something [message]!")) + return PHOBIA_FREAKOUT_TERROR_BUILDUP + +/datum/terror_handler/phobia_source/on_hug(mob/living/hugger) + if (is_scary_mob(hugger)) + return HUG_TERROR_AMOUNT + return 0 + +/// Snowflake handler for hemophobia which triggers on bloodied items and mobs +/datum/terror_handler/phobia_source/blood + +/datum/terror_handler/phobia_source/blood/is_scary_item(obj/checked) + if (GET_ATOM_BLOOD_DNA_LENGTH(checked)) + return TRUE + return ..() + +/datum/terror_handler/phobia_source/blood/is_scary_mob(mob/living/checked) + if (GET_ATOM_BLOOD_DNA_LENGTH(checked)) + return TRUE + return ..() diff --git a/code/datums/components/fearful/terror_handler.dm b/code/datums/components/fearful/terror_handler.dm index 93aa6a6c5b11..1b2add3bf35b 100644 --- a/code/datums/components/fearful/terror_handler.dm +++ b/code/datums/components/fearful/terror_handler.dm @@ -11,6 +11,8 @@ var/default = FALSE /// Other effects which should be disabled while this one is running var/list/overrides + /// Is this handler bespoke, and always requires a new instance upon adding even when one is already present? + var/bespoke = FALSE /datum/terror_handler/New(mob/living/new_owner, datum/component/fearful/new_component) . = ..() @@ -25,3 +27,7 @@ /// Single tick of terror handler, returns adjustment to terror buildup /datum/terror_handler/proc/tick(seconds_per_tick, terror_buildup) return 0 + +/// Additional effects when we're hugged by a mob, returns fear adjustment per hug. Should only be positive. +/datum/terror_handler/proc/on_hug(mob/living/hugger) + return 0 diff --git a/code/datums/components/fishing_spot.dm b/code/datums/components/fishing_spot.dm index 127f542f5611..be645066bb66 100644 --- a/code/datums/components/fishing_spot.dm +++ b/code/datums/components/fishing_spot.dm @@ -1,5 +1,6 @@ // A thing you can fish in /datum/component/fishing_spot + dupe_mode = COMPONENT_DUPE_UNIQUE /// Defines the probabilities and fish availibilty var/datum/fish_source/fish_source @@ -26,7 +27,6 @@ REMOVE_TRAIT(parent, TRAIT_FISHING_SPOT, REF(src)) fish_source.on_fishing_spot_del(src) fish_source = null - REMOVE_TRAIT(parent, TRAIT_FISHING_SPOT, REF(src)) return ..() /datum/component/fishing_spot/proc/handle_cast(datum/source, obj/item/fishing_rod/rod, mob/user) diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index 552731fc74dc..9541615485e0 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -39,11 +39,11 @@ Behavior that's still missing from this component that original food items had t ///Last time we checked for food likes var/last_check_time ///Assoc list of sources and their foodtypes - var/list/foodtypes_by_source = list() + var/list/foodtypes_by_source ///Assoc list of sources and their food flags - var/list/food_flags_by_source = list() + var/list/food_flags_by_source ///Assoc list of sources and their junkiness - var/list/junkiness_by_source = list() + var/list/junkiness_by_source /datum/component/edible/Initialize( list/initial_reagents, @@ -93,10 +93,6 @@ Behavior that's still missing from this component that original food items had t RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(UseFromHand)) RegisterSignal(parent, COMSIG_ITEM_USED_AS_INGREDIENT, PROC_REF(used_to_customize)) - var/obj/item/item = parent - if(!item.grind_results) - item.grind_results = list() //If this doesn't already exist, add it as an empty list. This is needed for the grinder to accept it. - else if(isturf(parent) || isstructure(parent)) RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(TryToEatIt)) @@ -145,16 +141,16 @@ Behavior that's still missing from this component that original food items had t var/recalculate = FALSE if(!isnull(foodtypes)) - if(foodtypes_by_source[source]) //foodtypes being overriden + if(LAZYACCESS(foodtypes_by_source, source)) //foodtypes being overriden recalculate = TRUE - foodtypes_by_source[source] = foodtypes + LAZYSET(foodtypes_by_source, source, foodtypes) if(!isnull(food_flags)) - if(food_flags_by_source[source]) //food_flags being overriden + if(LAZYACCESS(food_flags_by_source, source)) //food_flags being overridden recalculate = TRUE - food_flags_by_source[source] = food_flags + LAZYSET(food_flags_by_source, source, food_flags) if(!isnull(junkiness)) - src.junkiness += junkiness - junkiness_by_source[source] - junkiness_by_source[source] = junkiness + src.junkiness += junkiness - LAZYACCESS(junkiness_by_source, source) + LAZYSET(junkiness_by_source, source, junkiness) if(recalculate) recalculate_food_flags() @@ -194,10 +190,10 @@ Behavior that's still missing from this component that original food items had t /datum/component/edible/on_source_remove(source) //rebuild the foodtypes and food_flags bitfields without the removed source - foodtypes_by_source -= source - food_flags_by_source -= source - junkiness -= junkiness_by_source[source] - junkiness_by_source -= source + LAZYREMOVE(foodtypes_by_source, source) + LAZYREMOVE(food_flags_by_source, source) + junkiness -= LAZYACCESS(junkiness_by_source, source) + LAZYREMOVE(junkiness_by_source, source) recalculate_food_flags() return ..() @@ -205,8 +201,8 @@ Behavior that's still missing from this component that original food items had t foodtypes = NONE food_flags = NONE for(var/source_key in foodtypes_by_source) - foodtypes |= foodtypes_by_source[source_key] - food_flags |= food_flags_by_source[source_key] + foodtypes |= LAZYACCESS(foodtypes_by_source, source_key) + food_flags |= LAZYACCESS(food_flags_by_source, source_key) if(foodtypes & GORE) ADD_TRAIT(parent, TRAIT_VALID_DNA_INFUSION, REF(src)) else @@ -287,7 +283,7 @@ Behavior that's still missing from this component that original food items had t else examine_list += span_notice("[owner] was bitten multiple times!") - if(GLOB.Debug2) + if(GLOB.debugging_enabled) 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") @@ -495,6 +491,7 @@ Behavior that's still missing from this component that original food items had t playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE) if(!owner.reagents.total_volume) return + SEND_SIGNAL(eater, COMSIG_LIVING_EAT_FOOD, owner) var/sig_return = SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder, bitecount, bite_consumption) if(sig_return & DESTROY_FOOD) qdel(owner) @@ -516,6 +513,8 @@ Behavior that's still missing from this component that original food items had t checkLiked(fraction, eater) + check_materials(eater, fraction) + if(!owner.reagents.total_volume) On_Consume(eater, feeder) @@ -531,6 +530,29 @@ Behavior that's still missing from this component that original food items had t return TRUE +///Perform operations based on materials and/or if the parent object is a stack. +/datum/component/edible/proc/check_materials(mob/living/carbon/eater, fraction) + var/atom/owner = parent + var/is_stack = isstack(owner) + + //food may also apply golem buffs if it contains certain materials and the mob has the required trait + if(owner.custom_materials && HAS_TRAIT(eater, TRAIT_ROCK_EATER)) + for(var/datum/material/material as anything in owner.custom_materials) + var/effect_stack_amount = (owner.custom_materials[material] * fraction) / SHEET_MATERIAL_AMOUNT + var/datum/golem_food_buff/effect + effect = GLOB.golem_stack_food_directory[material.sheet_type || material.ore_type] + if(effect?.can_consume(eater)) + effect.on_consumption(eater, owner, effect_stack_amount) + + if(fraction >= 1) //don't bother if the item is about to be deleted anyway... + return + + if(is_stack) //stacks use up sheets, which recalulates the materials already. + var/obj/item/stack/stack = owner + stack.use(CEILING(stack.amount * fraction, 1)) + else if(owner.custom_materials) + owner.set_custom_materials(owner.custom_materials, 1 - fraction) + ///Checks whether or not the eater can actually consume the food /datum/component/edible/proc/CanConsume(mob/living/carbon/eater, mob/living/feeder) if(!iscarbon(eater)) @@ -550,8 +572,10 @@ Behavior that's still missing from this component that original food items had t qdel(food) return FALSE - if(SEND_SIGNAL(eater, COMSIG_CARBON_ATTEMPT_EAT, food) & COMSIG_CARBON_BLOCK_EAT) - return + if(SEND_SIGNAL(eater, COMSIG_CARBON_ATTEMPT_EAT, food) & BLOCK_EAT_ATTEMPT) + return FALSE + if(SEND_SIGNAL(food, COMSIG_FOOD_ATTEMPT_EAT, eater, feeder) & BLOCK_EAT_ATTEMPT) + return FALSE return TRUE ///Applies food buffs according to the crafting complexity @@ -611,10 +635,7 @@ Behavior that's still missing from this component that original food items had t 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/datum/mood_event/event = GLOB.food_quality_events[food_quality] - event = new event.type - event.timeout *= timeout_mod - gourmand.add_mood_event("quality_food", event) + gourmand.add_mood_event("quality_food", /datum/mood_event/food, food_quality, 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.")) @@ -720,6 +741,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/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) SIGNAL_HANDLER + if(QDELETED(parent)) + return SEND_SIGNAL(parent, COMSIG_FOOD_CROSSED, arrived, bitecount) ///Response to being used to customize something diff --git a/code/datums/components/food/ice_cream_holder.dm b/code/datums/components/food/ice_cream_holder.dm index d509a15484bb..59ee6cdc95b9 100644 --- a/code/datums/components/food/ice_cream_holder.dm +++ b/code/datums/components/food/ice_cream_holder.dm @@ -315,10 +315,10 @@ GLOBAL_LIST_INIT_TYPED(ice_cream_flavours, /datum/ice_cream_flavour, init_ice_cr 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 +/*/datum/ice_cream_flavour/vanilla/korta // DARKPACK EDIT REMOVE START - No lizzers 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) + ingredients = list(/datum/reagent/consumable/korta_milk, /datum/reagent/consumable/ice, /datum/reagent/consumable/vanilla)*/ // DARKPACK EDIT REMOVE END - No lizzers /datum/ice_cream_flavour/cherry_chocolate name = ICE_CREAM_CHERRY_CHOCOLATE @@ -343,11 +343,11 @@ GLOBAL_LIST_INIT_TYPED(ice_cream_flavours, /datum/ice_cream_flavour, init_ice_cr ingredients_text = "optional flavorings" takes_custom_ingredients = TRUE -/datum/ice_cream_flavour/custom/korta +/*/datum/ice_cream_flavour/custom/korta // DARKPACK EDIT REMOVE START - No lizzers name = ICE_CREAM_KORTA_CUSTOM desc = "filled with artisanal lizard-friendly ice cream. Made with real $CUSTOM_NAME. Ain't that something." ingredients = list(/datum/reagent/consumable/korta_milk, /datum/reagent/consumable/ice) - ingredients_text = "optional flavorings" + ingredients_text = "optional flavorings"*/ // DARKPACK EDIT REMOVE END - No lizzers /datum/ice_cream_flavour/custom/add_flavour(datum/component/ice_cream_holder/target, datum/reagents/custom_ingredients) if(!custom_ingredients || custom_ingredients.total_volume < 4) //consumable reagents have stronger taste so higher volume are required to allow non-food flavourings to break through better. diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm index e1d620222cbc..a9e4a3b82f99 100644 --- a/code/datums/components/gps.dm +++ b/code/datums/components/gps.dm @@ -5,11 +5,13 @@ GLOBAL_LIST_EMPTY(GPS_list) var/gpstag = "COM0" var/tracking = TRUE var/emped = FALSE + var/list/turf/tagged -/datum/component/gps/Initialize(_gpstag = "COM0") +/datum/component/gps/Initialize(_gpstag = "COM0", _tracking = TRUE) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE gpstag = _gpstag + tracking = _tracking GLOB.GPS_list += src /datum/component/gps/Destroy() @@ -32,8 +34,9 @@ GLOBAL_LIST_EMPTY(GPS_list) var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown /// UI state of GPS, altering when it can be used. var/datum/ui_state/state = null + var/debug_mode = FALSE -/datum/component/gps/item/Initialize(_gpstag = "COM0", emp_proof = FALSE, state = null, overlay_state = "working") +/datum/component/gps/item/Initialize(_gpstag = "COM0", _tracking = TRUE, emp_proof = FALSE, state = null, overlay_state = "working", debug = FALSE) . = ..() if(. == COMPONENT_INCOMPATIBLE || !isitem(parent)) return COMPONENT_INCOMPATIBLE @@ -41,17 +44,28 @@ GLOBAL_LIST_EMPTY(GPS_list) if(isnull(state)) state = GLOB.default_state src.state = state + debug_mode = debug var/atom/A = parent if(overlay_state) A.add_overlay(overlay_state) A.name = "[initial(A.name)] ([gpstag])" RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(interact)) + + if(debug_mode && tracking) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(tag_the_floor)) + if(!emp_proof) RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(on_click_alt)) +/datum/component/gps/item/Destroy() + if(tagged) + clear() + return ..() + ///Called on COMSIG_ITEM_ATTACK_SELF /datum/component/gps/item/proc/interact(datum/source, mob/user) SIGNAL_HANDLER @@ -59,6 +73,29 @@ GLOBAL_LIST_EMPTY(GPS_list) if(user) INVOKE_ASYNC(src, PROC_REF(ui_interact), user) +///Called on COMSIG_MOVABLE_MOVED +/datum/component/gps/item/proc/tag_the_floor(atom/movable/mover, turf/old_loc) + SIGNAL_HANDLER + + if(!debug_mode) + return + + var/turf/tagged_turf = get_turf(mover) + if(tagged_turf) + tagged_turf.color = RANDOM_COLOUR + tagged_turf.maptext = MAPTEXT("[tagged_turf.x],[tagged_turf.y],[tagged_turf.z]") + LAZYOR(tagged, tagged_turf) + +///Called on COMSIG_MOVABLE_MOVED +/datum/component/gps/item/proc/clear() + SIGNAL_HANDLER + + while(tagged.len) + var/turf/tagged_turf = pop(tagged) + tagged_turf.color = initial(tagged_turf.color) + tagged_turf.maptext = initial(tagged_turf.maptext) + LAZYNULL(tagged) + ///Called on COMSIG_ATOM_EXAMINE /datum/component/gps/item/proc/on_examine(datum/source, mob/user, list/examine_list) SIGNAL_HANDLER @@ -108,6 +145,13 @@ GLOBAL_LIST_EMPTY(GPS_list) to_chat(user, span_notice("[parent] is now tracking, and visible to other GPS devices.")) tracking = TRUE + if(debug_mode) + if(tracking) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(tag_the_floor)) + else + UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) + clear() + /datum/component/gps/item/ui_interact(mob/user, datum/tgui/ui) if(emped) to_chat(user, span_hear("[parent] fizzles weakly.")) diff --git a/code/datums/components/grillable.dm b/code/datums/components/grillable.dm index 34a6675edd6a..5b31a0fdec0c 100644 --- a/code/datums/components/grillable.dm +++ b/code/datums/components/grillable.dm @@ -41,8 +41,8 @@ var/atom/result = new cook_result if(!item_parent.compare_materials(result)) var/warning = "custom_materials of [result.type] when grilled compared to just spawned don't match" - var/what_it_should_be = item_parent.get_materials_english_list() - stack_trace("[warning]. custom_materials should be [what_it_should_be].") + var/what_it_should_be = item_parent.transcribe_materials_list() + stack_trace("[warning]. should be: custom_materials = [what_it_should_be].") qdel(result) /datum/component/grillable/RegisterWithParent() @@ -155,7 +155,7 @@ LAZYADD(grilled_food.intrinsic_food_materials, original_food.intrinsic_food_materials) grilled_result.set_custom_materials(original_object.custom_materials) - if(IsEdible(grilled_result) && positive_result) + if(IS_EDIBLE(grilled_result) && positive_result) BLACKBOX_LOG_FOOD_MADE(grilled_result.type) //make space and tranfer reagents if it has any, also let any bad result handle removing or converting the transferred reagents on its own terms if(grilled_result.reagents && original_object.reagents) diff --git a/code/datums/components/happiness.dm b/code/datums/components/happiness.dm index 75aecee35613..791b9b32b7c4 100644 --- a/code/datums/components/happiness.dm +++ b/code/datums/components/happiness.dm @@ -62,7 +62,7 @@ /datum/component/happiness/proc/on_eat(datum/source) SIGNAL_HANDLER - increase_happiness_level(on_eat_change) + change_happiness_level(on_eat_change) /datum/component/happiness/proc/on_clean(mob/living/source) SIGNAL_HANDLER @@ -74,7 +74,7 @@ return NONE COOLDOWN_START(src, groom_cooldown, GROOM_COOLDOWN) - increase_happiness_level(on_groom_change) + change_happiness_level(on_groom_change) return COMPONENT_CLEANED|COMPONENT_CLEANED_GAIN_XP /datum/component/happiness/proc/on_petted(datum/source, mob/living/petter, list/modifiers) @@ -91,42 +91,55 @@ /datum/component/happiness/proc/pet_animal() if(!COOLDOWN_FINISHED(src, pet_cooldown)) return - increase_happiness_level(on_petted_change) + change_happiness_level(on_petted_change) COOLDOWN_START(src, pet_cooldown, PET_COOLDOWN) -/datum/component/happiness/proc/increase_happiness_level(amount) - happiness_level = min(happiness_level + amount, maximum_happiness) - if(!HAS_TRAIT(parent, TRAIT_MOB_HIDE_HAPPINESS)) - var/mob/living/living_parent = parent +/datum/component/happiness/proc/change_happiness_level(amount) + var/old_happiness = happiness_level + happiness_level = clamp(happiness_level + amount, 0, maximum_happiness) + var/happiness_percentage = happiness_level / maximum_happiness + var/old_percentage = old_happiness / maximum_happiness + + var/old_threshold = 0 + var/new_threshold = 0 + for(var/check_percentage in callback_percentages) + if (check_percentage <= old_percentage) + old_threshold = check_percentage + if (check_percentage <= happiness_percentage) + new_threshold = check_percentage + + if (old_threshold != new_threshold) + SEND_SIGNAL(parent, COMSIG_MOB_HAPPINESS_CHANGE, happiness_percentage) + happiness_callback?.Invoke(happiness_percentage) + + var/mob/living/living_parent = parent + living_parent.ai_controller?.set_blackboard_key(blackboard_key, happiness_percentage) + + if(!HAS_TRAIT(parent, TRAIT_MOB_HIDE_HAPPINESS) && amount > 0) new /obj/effect/temp_visual/heart(living_parent.loc) living_parent.spin(spintime = 2 SECONDS, speed = 1) - START_PROCESSING(SSprocessing, src) + + if (happiness_level > 0) + START_PROCESSING(SSprocessing, src) /datum/component/happiness/proc/view_happiness(mob/living/source, mob/living/clicker) - if(HAS_TRAIT(source, TRAIT_MOB_HIDE_HAPPINESS) || !istype(clicker) || !COOLDOWN_FINISHED(src, happiness_inspect) || !clicker.CanReach(source)) + if(HAS_TRAIT(source, TRAIT_MOB_HIDE_HAPPINESS) || !istype(clicker) || !COOLDOWN_FINISHED(src, happiness_inspect) || !source.IsReachableBy(clicker)) return var/y_position = source.get_cached_height() + 1 var/obj/effect/overlay/happiness_overlay/hearts = new + hearts.pixel_w -= source.base_pixel_x + source.base_pixel_w hearts.pixel_y = y_position - hearts.set_hearts(happiness_level/maximum_happiness) + hearts.set_hearts(happiness_level / maximum_happiness) source.vis_contents += hearts COOLDOWN_START(src, happiness_inspect, INSPECT_TIMER) - /datum/component/happiness/process() - var/mob/living/living_parent = parent - var/happiness_percentage = happiness_level/maximum_happiness - living_parent.ai_controller?.set_blackboard_key(blackboard_key, happiness_percentage) - var/check_percentage_in_list = round(happiness_percentage * 100, 1) - if(check_percentage_in_list in callback_percentages) - SEND_SIGNAL(parent, COMSIG_MOB_HAPPINESS_CHANGE, happiness_percentage) - happiness_callback?.Invoke(happiness_percentage) - if(happiness_level <= 0) return PROCESS_KILL + var/mob/living/living_parent = parent var/modifier = living_parent.ai_controller?.blackboard[BB_BASIC_DEPRESSED] ? 2 : 1 - happiness_level = max(0, happiness_level - modifier) + change_happiness_level(-modifier) /obj/effect/overlay/happiness_overlay mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/datums/components/hat_stabilizer.dm b/code/datums/components/hat_stabilizer.dm index 44545f273a45..b7d1a4a3ce2b 100644 --- a/code/datums/components/hat_stabilizer.dm +++ b/code/datums/components/hat_stabilizer.dm @@ -2,7 +2,7 @@ /datum/component/hat_stabilizer dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS /// Currently "stored" hat. No armor or function will be inherited, only the icon and cover flags. - var/obj/item/clothing/head/attached_hat + var/obj/item/attached_hat /// If TRUE, the hat will fall to the ground when the owner does so. It can also be shot off. var/loose_hat = FALSE /// Original cover flags for the helmet, before a hat is placed @@ -12,6 +12,8 @@ var/use_worn_icon = TRUE /// Pixel z offset for the hat var/pixel_z_offset + /// Which way a loose hat is offset + var/head_angle = 1 /datum/component/hat_stabilizer/Initialize(use_worn_icon = FALSE, pixel_z_offset = 0, loose_hat = FALSE) if(!ismovable(parent)) @@ -114,7 +116,7 @@ if(loose_hat) var/matrix/tilt_trix = matrix(worn_overlay.transform) var/angle = 5 - tilt_trix.Turn(angle * pick(1, -1)) + tilt_trix.Turn(angle * head_angle) worn_overlay.transform = tilt_trix worn_overlay.pixel_z = pixel_z_offset + attached_hat.worn_y_offset overlays += worn_overlay @@ -132,7 +134,7 @@ if(loose_hat) var/matrix/tilt_trix = matrix(worn_overlay.transform) var/angle = 5 - tilt_trix.Turn(angle * pick(1, -1)) + tilt_trix.Turn(angle * head_angle) worn_overlay.transform = tilt_trix worn_overlay.pixel_z = pixel_z_offset + attached_hat.worn_y_offset overlays += worn_overlay @@ -147,41 +149,44 @@ SIGNAL_HANDLER var/atom/movable/movable_parent = parent - if(!istype(hitting_item, /obj/item/clothing/head)) + if(!(hitting_item.slot_flags & ITEM_SLOT_HEAD)) return if(attached_hat) movable_parent.balloon_alert(user, "hat already attached!") return + if(isclothing(hitting_item)) + var/obj/item/clothing/hat = hitting_item + if(hat.clothing_flags & STACKABLE_HELMET_EXEMPT) + movable_parent.balloon_alert(user, "invalid hat!") + return - var/obj/item/clothing/hat = hitting_item - if(hat.clothing_flags & STACKABLE_HELMET_EXEMPT) - movable_parent.balloon_alert(user, "invalid hat!") + if(!user.transferItemToLoc(hitting_item, parent, force = FALSE, silent = TRUE)) return - if(!user.transferItemToLoc(hat, parent, force = FALSE, silent = TRUE)) - return - - attach_hat(hat, user) + attach_hat(hitting_item, user) -/datum/component/hat_stabilizer/proc/attach_hat(obj/item/clothing/hat, mob/user) +/datum/component/hat_stabilizer/proc/attach_hat(obj/item/hat, mob/user) var/atom/movable/movable_parent = parent attached_hat = hat RegisterSignal(hat, COMSIG_MOVABLE_MOVED, PROC_REF(on_hat_movement)) + head_angle = pick(1, -1) if (!isnull(user)) movable_parent.balloon_alert(user, "hat attached") - if (!istype(parent, /obj/item/clothing)) + if (!isclothing(parent)) movable_parent.update_appearance() return var/obj/item/clothing/apparel = parent - apparel.attach_clothing_traits(attached_hat.clothing_traits) + if(isclothing(attached_hat)) + var/obj/item/clothing/realhat = attached_hat + apparel.attach_clothing_traits(realhat.clothing_traits) + apparel.visor_flags_cover |= realhat.visor_flags_cover former_flags = apparel.flags_cover former_visor_flags = apparel.visor_flags_cover apparel.flags_cover |= attached_hat.flags_cover - apparel.visor_flags_cover |= attached_hat.visor_flags_cover apparel.update_appearance() if (ismob(apparel.loc)) @@ -220,14 +225,16 @@ else movable_parent.balloon_alert_to_viewers("the hat falls to the floor!") - if (!istype(parent, /obj/item/clothing)) + if (!isclothing(parent)) attached_hat = null movable_parent.update_appearance() return var/former_hat = attached_hat var/obj/item/clothing/apparel = parent - apparel.detach_clothing_traits(attached_hat.clothing_traits) + if(isclothing(attached_hat)) + var/obj/item/clothing/truehat = attached_hat + apparel.detach_clothing_traits(truehat.clothing_traits) apparel.flags_cover = former_flags apparel.visor_flags_cover = former_visor_flags apparel.update_appearance() @@ -235,8 +242,8 @@ if (ismob(apparel.loc)) var/mob/wearer = apparel.loc wearer.update_clothing(wearer.get_slot_by_item(apparel)) - - return former_hat + if(isnull(user)) + return former_hat /datum/component/hat_stabilizer/proc/on_requesting_context_from_item(atom/source, list/context, obj/item/held_item, mob/user) SIGNAL_HANDLER diff --git a/code/datums/components/hazard_area.dm b/code/datums/components/hazard_area.dm index f747e8e2ace7..79a67fd78ad0 100644 --- a/code/datums/components/hazard_area.dm +++ b/code/datums/components/hazard_area.dm @@ -169,4 +169,5 @@ /atom/movable/screen/alert/status_effect/hazard_area name = "Hazardous Area" desc = "The area you are currently within is incredibly hazardous to you. Check your surroundings and vacate as soon as possible." - icon_state = "hazard_area" + use_user_hud_icon = TRUE + overlay_state = "hazard_area" diff --git a/code/datums/components/healing_touch.dm b/code/datums/components/healing_touch.dm index 07f04cba01d7..b8580e2e458f 100644 --- a/code/datums/components/healing_touch.dm +++ b/code/datums/components/healing_touch.dm @@ -45,6 +45,8 @@ var/required_modifier /// Callback to run after healing a mob var/datum/callback/after_healed + /// Callback to run to get a multiplier for our healing value + var/datum/callback/healing_multiplier /datum/component/healing_touch/Initialize( heal_brute = 20, @@ -65,6 +67,7 @@ heal_color = COLOR_HEALING_CYAN, required_modifier = null, datum/callback/after_healed = null, + datum/callback/healing_multiplier = null, ) if (!isliving(parent)) return COMPONENT_INCOMPATIBLE @@ -87,6 +90,7 @@ src.heal_color = heal_color src.required_modifier = required_modifier src.after_healed = after_healed + src.healing_multiplier = healing_multiplier RegisterSignal(parent, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(try_healing)) // Players RegisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(try_healing)) // NPCs @@ -161,14 +165,14 @@ /datum/component/healing_touch/proc/has_healable_damage(mob/living/target) if (!isnull(valid_biotypes) && !(valid_biotypes & target.mob_biotypes)) return FALSE - if (target.getStaminaLoss() > 0 && heal_stamina) + if (target.get_stamina_loss() > 0 && heal_stamina) return TRUE - if (target.getOxyLoss() > 0 && heal_oxy) + if (target.get_oxy_loss() > 0 && heal_oxy) return TRUE - if (target.getToxLoss() > 0 && heal_tox) + if (target.get_tox_loss() > 0 && heal_tox) return TRUE if (!iscarbon(target)) - return (target.getBruteLoss() > 0 && heal_brute) || (target.getFireLoss() > 0 && heal_burn) + return (target.get_brute_loss() > 0 && heal_brute) || (target.get_fire_loss() > 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)) @@ -190,15 +194,21 @@ if (complete_text) healer.visible_message(span_notice("[format_string(complete_text, healer, target)]")) + var/mult = 1 + if (healing_multiplier) + mult = healing_multiplier.Invoke(healer, target) + if (mult == 0) + return + var/healed = target.heal_overall_damage( - brute = heal_brute, - burn = heal_burn, - stamina = heal_stamina, + brute = heal_brute * mult, + burn = heal_burn * mult, + stamina = heal_stamina * mult, required_bodytype = required_bodytype, updating_health = FALSE, ) - healed += target.adjustOxyLoss(-heal_oxy, updating_health = FALSE, required_biotype = valid_biotypes) - healed += target.adjustToxLoss(-heal_tox, updating_health = FALSE, required_biotype = valid_biotypes) + healed += target.adjust_oxy_loss(-heal_oxy * mult, updating_health = FALSE, required_biotype = valid_biotypes) + healed += target.adjust_tox_loss(-heal_tox * mult, updating_health = FALSE, required_biotype = valid_biotypes) if (healed <= 0) return diff --git a/code/datums/components/heart_eater.dm b/code/datums/components/heart_eater.dm index 1ef06559624b..d61aec5ac438 100644 --- a/code/datums/components/heart_eater.dm +++ b/code/datums/components/heart_eater.dm @@ -111,11 +111,11 @@ ///Heart eater give also strong healing from hearts. /datum/component/heart_eater/proc/healing_heart(mob/living/carbon/human/eater) for(var/heal_organ in eater.organs) - eater.adjustOrganLoss(heal_organ, -50) + eater.adjust_organ_loss(heal_organ, -50) for(var/datum/wound/heal_wound in eater.all_wounds) heal_wound.remove_wound() - eater.adjustBruteLoss(-50) - eater.adjustFireLoss(-50) - eater.adjustToxLoss(-50) - eater.adjustOxyLoss(-50) - eater.adjustStaminaLoss(-50) + eater.adjust_brute_loss(-50) + eater.adjust_fire_loss(-50) + eater.adjust_tox_loss(-50) + eater.adjust_oxy_loss(-50) + eater.adjust_stamina_loss(-50) diff --git a/code/datums/components/houlihan_teleport.dm b/code/datums/components/houlihan_teleport.dm new file mode 100644 index 000000000000..b819742e495a --- /dev/null +++ b/code/datums/components/houlihan_teleport.dm @@ -0,0 +1,93 @@ +/// Teleports interactors onto a safe turf randomly picked from a list of z-levels. +/datum/component/houlihan_teleport + dupe_mode = COMPONENT_DUPE_HIGHLANDER + /// Text that will appear in the alert prompt. + var/question = "Travel back?" + /// List of z-levels that the user can teleport to. By default, this is station z-levels. + var/list/zlevels + +/datum/component/houlihan_teleport/Initialize(question, zlevels) + . = ..() + if(!isstructure(parent)) + return COMPONENT_INCOMPATIBLE + + if(!isnull(question) && (!istext(question) || !length(question))) + stack_trace("received bad question argument, falling back to default") + question = null + src.question = question || initial(src.question) + + if(!isnull(zlevels) && (!islist(zlevels) || !length(zlevels))) + stack_trace("received bad zlevels argument, falling back to default") + zlevels = null + src.zlevels = zlevels || SSmapping.levels_by_trait(ZTRAIT_STATION) + +/datum/component/houlihan_teleport/RegisterWithParent() + RegisterSignals(parent, list(COMSIG_ATOM_ATTACK_ROBOT, COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_ATTACK_ANIMAL, COMSIG_ATOM_ATTACK_LARVA), PROC_REF(handle_generic_attack)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(handle_attack_hand)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(handle_attackby)) + +/datum/component/houlihan_teleport/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_ATOM_ATTACK_ROBOT, COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_ATTACK_ANIMAL, COMSIG_ATOM_ATTACK_LARVA, //handle_generic_attack + COMSIG_ATOM_ATTACK_HAND, //handle_attack_hand + COMSIG_ATOM_ATTACKBY, //handle_attackby + )) + +/datum/component/houlihan_teleport/proc/get_me_outta_here(obj/structure/source, mob/living/user) + var/said_yes = (tgui_alert(user, question, source.name, list("Yes", "No")) == "Yes") + if(!said_yes || !source.Adjacent(user)) + return + + var/turf/destination_turf = zlevels ? find_safe_turf(zlevels) : get_safe_random_station_turf_equal_weight() + if(!destination_turf) + source.balloon_alert(user, "uh oh...") + to_chat(user, span_warning("Nothing happens. You feel like this is a bad sign.")) + return + + var/turf/user_turf = get_turf(user) + var/atom/movable/dragged = user.pulling + user.forceMove(destination_turf) + user_turf.balloon_alert_to_viewers("(pop)") + if(dragged) + var/turf/dragged_turf = get_turf(dragged) + dragged.forceMove(destination_turf) + user.start_pulling(dragged, force = TRUE) + dragged_turf.balloon_alert_to_viewers("(pop)") + + to_chat(list(user, dragged), span_notice("You blink and find yourself in [get_area_name(destination_turf)].")) + user.emote("blink") + astype(dragged, /mob)?.emote("blink") // shhhhh just let it happen + +/datum/component/houlihan_teleport/proc/handle_generic_attack(obj/structure/source, mob/living/user, list/modifiers) + SIGNAL_HANDLER + + if(user.combat_mode) + return NONE + + if(iscyborg(user) && !source.Adjacent(user)) + return NONE + + INVOKE_ASYNC(src, PROC_REF(get_me_outta_here), source, user) + return COMPONENT_NO_AFTERATTACK + +/datum/component/houlihan_teleport/proc/handle_attack_hand(obj/structure/source, mob/user, list/modifiers) + SIGNAL_HANDLER + + if(!isliving(user)) + return NONE + + var/mob/living/living_user = user + if(living_user.combat_mode) + return NONE + + INVOKE_ASYNC(src, PROC_REF(get_me_outta_here), source, living_user) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/datum/component/houlihan_teleport/proc/handle_attackby(obj/structure/source, obj/item/item, mob/living/user, list/modifiers) + SIGNAL_HANDLER + + if(user.combat_mode) + return NONE + + INVOKE_ASYNC(src, PROC_REF(get_me_outta_here), source, user) + return COMPONENT_NO_AFTERATTACK diff --git a/code/datums/components/irradiated.dm b/code/datums/components/irradiated.dm index 803af82940be..31ee58bb77ef 100644 --- a/code/datums/components/irradiated.dm +++ b/code/datums/components/irradiated.dm @@ -85,7 +85,7 @@ return PROCESS_KILL var/mob/living/carbon/human/human_parent = parent - if (human_parent.getToxLoss() == 0) + if (human_parent.get_tox_loss() == 0) qdel(src) return PROCESS_KILL @@ -181,7 +181,7 @@ if (isliving(source)) var/mob/living/living_source = source - to_chat(user, span_bolddanger("[icon2html(geiger_counter, user)] Subject is irradiated. Contamination traces back to roughly [DisplayTimeText(world.time - beginning_of_irradiation, 5)] ago. Current toxin levels: [living_source.getToxLoss()].")) + to_chat(user, span_bolddanger("[icon2html(geiger_counter, user)] Subject is irradiated. Contamination traces back to roughly [DisplayTimeText(world.time - beginning_of_irradiation, 5)] ago. Current toxin levels: [living_source.get_tox_loss()].")) else // In case the green wasn't obvious enough... to_chat(user, span_bolddanger("[icon2html(geiger_counter, user)] Target is irradiated.")) @@ -198,7 +198,8 @@ /atom/movable/screen/alert/irradiated name = "Irradiated" desc = "You're irradiated! Heal your toxins quick, and stand under a shower to halt the incoming damage." - icon_state = ALERT_IRRADIATED + use_user_hud_icon = TRUE + overlay_state = "irradiated" #undef RADIATION_BURN_SPLOTCH_DAMAGE #undef RADIATION_BURN_INTERVAL_MIN diff --git a/code/datums/components/joint_damage.dm b/code/datums/components/joint_damage.dm index 5397bd307cab..e96a387abc0e 100644 --- a/code/datums/components/joint_damage.dm +++ b/code/datums/components/joint_damage.dm @@ -31,5 +31,5 @@ var/mob/living/overlord_to_damage = overlord_mob?.resolve() if(!isnull(overlord_to_damage)) - overlord_to_damage.adjustBruteLoss(previous_health_count - source.health) ///damage or heal overlord + overlord_to_damage.adjust_brute_loss(previous_health_count - source.health) ///damage or heal overlord previous_health_count = source.health diff --git a/code/datums/components/jukebox.dm b/code/datums/components/jukebox.dm index 7e9f96571347..07004dd05b36 100644 --- a/code/datums/components/jukebox.dm +++ b/code/datums/components/jukebox.dm @@ -95,16 +95,26 @@ var/static/list/config_songs if(isnull(config_songs)) config_songs = list() - var/list/tracks = flist("[global.config.directory]/jukebox_music/sounds/") + var/list/tracks = flist(CONFIG_JUKEBOX_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]") + new_track.song_path = file("[CONFIG_JUKEBOX_SOUNDS][track_file]") var/list/track_data = splittext(track_file, "+") - if(length(track_data) < 3) + if(!length(track_data) || !IS_SOUND_FILE_SAFE(new_track.song_path)) continue - new_track.song_name = track_data[1] - new_track.song_length = text2num(track_data[2]) - new_track.song_beat = text2num(track_data[3]) + var/track_name = track_data[JUKEBOX_NAME] + track_name = strip_filepath_extension(track_name, SSsounds.safe_formats) + new_track.song_name = track_name + new_track.song_length = SSsounds.get_sound_length(new_track.song_path) + if(track_data.len >= 3) // Bandaid for legacy tracks to not use the length for the bpm rather then the actual beats. + var/static/logged_to_admins = FALSE + log_game("[new_track.song_path] track data seems to be using the legacy format; we will attempt to make it work.") + if(!logged_to_admins) + message_admins("The jukebox has tracks uploaded in a legacy format. Length is now fetched programmatically, with title and beats being the only required fields.") + logged_to_admins = TRUE + new_track.song_beat_deciseconds = text2num(track_data[3]) + else if(track_data.len >= 2) + new_track.song_beat_deciseconds = text2num(track_data[JUKEBOX_BEATS]) config_songs[new_track.song_name] = new_track if(!length(config_songs)) @@ -128,7 +138,7 @@ UNTYPED_LIST_ADD(songs_data, list( \ "name" = song_name, \ "length" = DisplayTimeText(one_song.song_length), \ - "beat" = one_song.song_beat, \ + "beat" = one_song.song_beat_deciseconds || "Unknown", \ )) data["active"] = !!active_song_sound @@ -399,11 +409,12 @@ var/song_length = 0 /// How long is a beat of the song in decisconds /// Used to determine time between effects when played - var/song_beat = 0 + /// Do note this is NOT BPM. + var/song_beat_deciseconds = 0 // Default track supplied for testing and also because it's a banger /datum/track/default song_path = 'sound/music/lobby_music/title3.ogg' song_name = "Tintin on the Moon" song_length = 3 MINUTES + 52 SECONDS - song_beat = 1 SECONDS + song_beat_deciseconds = 1 SECONDS diff --git a/code/datums/components/life_link.dm b/code/datums/components/life_link.dm index 98858f61c3cb..a79758122c51 100644 --- a/code/datums/components/life_link.dm +++ b/code/datums/components/life_link.dm @@ -65,13 +65,13 @@ amount *= our_mob.get_damage_mod(type) switch (type) if(BRUTE) - host.adjustBruteLoss(amount, forced = TRUE) + host.adjust_brute_loss(amount, forced = TRUE) if(BURN) - host.adjustFireLoss(amount, forced = TRUE) + host.adjust_fire_loss(amount, forced = TRUE) if(TOX) - host.adjustToxLoss(amount, forced = TRUE) + host.adjust_tox_loss(amount, forced = TRUE) if(OXY) - host.adjustOxyLoss(amount, forced = TRUE) + host.adjust_oxy_loss(amount, forced = TRUE) on_passed_damage?.Invoke(our_mob, host, amount) return COMPONENT_IGNORE_CHANGE @@ -80,9 +80,9 @@ /datum/component/life_link/proc/on_limb_damage(mob/living/our_mob, limb, brute, burn) SIGNAL_HANDLER if (brute != 0) - host.adjustBruteLoss(brute, updating_health = FALSE) + host.adjust_brute_loss(brute, updating_health = FALSE) if (burn != 0) - host.adjustFireLoss(burn, updating_health = FALSE) + host.adjust_fire_loss(burn, updating_health = FALSE) if (brute != 0 || burn != 0) host.updatehealth() on_passed_damage?.Invoke(our_mob, host, brute + burn) diff --git a/code/datums/components/lockable_storage.dm b/code/datums/components/lockable_storage.dm index 456bac0c45dc..51a0e48be6cd 100644 --- a/code/datums/components/lockable_storage.dm +++ b/code/datums/components/lockable_storage.dm @@ -34,13 +34,8 @@ canthold = list(/obj/item/storage/briefcase/secure), ) - - src.lock_code = lock_code - if(!isnull(lock_code)) - atom_parent.atom_storage.set_locked(STORAGE_FULLY_LOCKED) src.can_hack_open = can_hack_open - - atom_parent.update_appearance() + set_lock_code(lock_code) /datum/component/lockable_storage/RegisterWithParent() . = ..() @@ -144,8 +139,18 @@ if(!tool.use_tool(parent, user, 40 SECONDS, volume = 50)) return source.balloon_alert(user, "hacked") + set_lock_code(null) + +/datum/component/lockable_storage/proc/break_lock() + can_hack_open = FALSE // since it's broken for good lock_code = null + var/obj/source = parent + source.obj_flags |= EMAGGED + source.atom_storage.locked = STORAGE_NOT_LOCKED + SEND_SIGNAL(source, COMSIG_LOCKABLE_STORAGE_SET_CODE, lock_code) + source.update_appearance() + /datum/component/lockable_storage/proc/on_emag(obj/source, mob/user, obj/item/card/emag/emag_card) SIGNAL_HANDLER @@ -154,17 +159,36 @@ if(source.obj_flags & EMAGGED) return FALSE - source.obj_flags |= EMAGGED - can_hack_open = FALSE // since it's broken for good source.visible_message(span_warning("Sparks fly from [source]!"), blind_message = span_hear("You hear a faint electrical spark.")) source.balloon_alert(user, "lock destroyed") playsound(source, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - lock_code = null - source.atom_storage.locked = STORAGE_NOT_LOCKED - source.update_appearance() + break_lock() return ITEM_INTERACT_SUCCESS +/** + * Sets the lock code for this storage and updates the locked state accordingly + * Arguments: + * * new_code - The new lock code to set, can be null to remove the code + */ +/datum/component/lockable_storage/proc/set_lock_code(new_code, mob/living/user) + var/obj/source = parent + + // Can't set lock code if the electronics are emagged + if(source.obj_flags & EMAGGED) + return FALSE + + lock_code = new_code + SEND_SIGNAL(source, COMSIG_LOCKABLE_STORAGE_SET_CODE, new_code) + var/lock_state = lock_code ? STORAGE_FULLY_LOCKED : STORAGE_NOT_LOCKED + source.atom_storage.set_locked(lock_state) + source.update_appearance() + + if(istype(user) && new_code) + to_chat(user, span_notice("You set the [source] pincode to [lock_code].")) + + return TRUE + ///Updates the icon state depending on if we're locked or not. /datum/component/lockable_storage/proc/on_update_icon_state(obj/source) SIGNAL_HANDLER @@ -219,7 +243,7 @@ if(!lock_code) if(length(numeric_input) != 5) return TRUE - lock_code = numeric_input + set_lock_code(numeric_input, usr) numeric_input = "" return TRUE //unlocking the current code. diff --git a/code/datums/components/manual_heart.dm b/code/datums/components/manual_heart.dm index fb815cdfdbb3..2dfd703ed462 100644 --- a/code/datums/components/manual_heart.dm +++ b/code/datums/components/manual_heart.dm @@ -49,22 +49,21 @@ 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)) + RegisterSignal(parent, COMSIG_LIVING_UPDATE_BLOOD_STATUS, PROC_REF(on_update_blood_status)) 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/heart/parent_heart = carbon_parent.get_organ_slot(ORGAN_SLOT_HEART) - if(parent_heart && !HAS_TRAIT(carbon_parent, TRAIT_NOBLOOD) && carbon_parent.stat != DEAD) + if(parent_heart && CAN_HAVE_BLOOD(carbon_parent) && 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))) + UnregisterSignal(parent, list(COMSIG_CARBON_GAIN_ORGAN, COMSIG_CARBON_LOSE_ORGAN, COMSIG_HEART_MANUAL_PULSE, COMSIG_LIVING_REVIVE, COMSIG_LIVING_DEATH, COMSIG_LIVING_UPDATE_BLOOD_STATUS)) to_chat(parent, span_userdanger("You feel your heart start beating normally again!")) var/mob/living/carbon/carbon_parent = parent @@ -95,14 +94,14 @@ var/mob/living/carbon/carbon_owner = owner - if(HAS_TRAIT(carbon_owner, TRAIT_NOBLOOD)) + if(!CAN_HAVE_BLOOD(carbon_owner)) return - carbon_owner.blood_volume = min(carbon_owner.blood_volume + (blood_loss * 0.5), BLOOD_VOLUME_MAXIMUM) + carbon_owner.adjust_blood_volume(blood_loss * 0.5) carbon_owner.remove_client_colour(REF(src)) add_colour = TRUE - carbon_owner.adjustBruteLoss(-heal_brute) - carbon_owner.adjustFireLoss(-heal_burn) - carbon_owner.adjustOxyLoss(-heal_oxy) + carbon_owner.adjust_brute_loss(-heal_brute) + carbon_owner.adjust_fire_loss(-heal_burn) + carbon_owner.adjust_oxy_loss(-heal_oxy) /datum/component/manual_heart/process() var/mob/living/carbon/carbon_parent = parent @@ -115,13 +114,21 @@ if(!COOLDOWN_FINISHED(src, heart_timer)) return - carbon_parent.blood_volume = max(carbon_parent.blood_volume - blood_loss, 0) + carbon_parent.adjust_blood_volume(-blood_loss) 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, REF(src)) add_colour = FALSE +/datum/component/manual_heart/proc/on_update_blood_status(datum/source, had_blood, has_blood, new_blood_volume, old_blood_volume) + SIGNAL_HANDLER + + if (has_blood) + restart() + else + pause() + ///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 @@ -151,7 +158,7 @@ /datum/component/manual_heart/proc/check_valid() var/mob/living/carbon/carbon_parent = parent var/obj/item/organ/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 + return !isnull(parent_heart) && CAN_HAVE_BLOOD(carbon_parent) && 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 @@ -169,7 +176,7 @@ ///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) + if(!istype(heart_haver) || !CAN_HAVE_BLOOD(heart_haver) || heart_haver.stat == DEAD) return FALSE var/obj/item/organ/heart/heart_havers_heart = heart_haver.get_organ_slot(ORGAN_SLOT_HEART) if(isnull(heart_havers_heart)) diff --git a/code/datums/components/mob_chain.dm b/code/datums/components/mob_chain.dm index e2f90eed16ee..06bec239a2d4 100644 --- a/code/datums/components/mob_chain.dm +++ b/code/datums/components/mob_chain.dm @@ -171,7 +171,7 @@ SIGNAL_HANDLER if (forced) return - back?.adjustStaminaLoss(amount, forced = forced) + back?.adjust_stamina_loss(amount, forced = forced) /// On damage or heal, affect our furthest segment /datum/component/mob_chain/proc/on_adjust_damage(mob/living/our_mob, type, amount, forced) @@ -180,13 +180,13 @@ return switch (type) if(BRUTE) - back.adjustBruteLoss(amount, forced = forced) + back.adjust_brute_loss(amount, forced = forced) if(BURN) - back.adjustFireLoss(amount, forced = forced) + back.adjust_fire_loss(amount, forced = forced) if(TOX) - back.adjustToxLoss(amount, forced = forced) + back.adjust_tox_loss(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) + back.adjust_oxy_loss(amount, forced = forced) return COMPONENT_IGNORE_CHANGE /// Special handling for if damage is delegated to a mob's limbs instead of its overall damage @@ -195,9 +195,9 @@ if (isnull(back)) return if (brute != 0) - back.adjustBruteLoss(brute, updating_health = FALSE) + back.adjust_brute_loss(brute, updating_health = FALSE) if (burn != 0) - back.adjustFireLoss(burn, updating_health = FALSE) + back.adjust_fire_loss(burn, updating_health = FALSE) if (brute != 0 || burn != 0) back.updatehealth() return COMPONENT_PREVENT_LIMB_DAMAGE diff --git a/code/datums/components/monitored_area.dm b/code/datums/components/monitored_area.dm new file mode 100644 index 000000000000..6797fe15f0ab --- /dev/null +++ b/code/datums/components/monitored_area.dm @@ -0,0 +1,74 @@ +/// Area component that makes all movement inside get tracked by motion sensitive cameras +/datum/component/monitored_area + dupe_mode = COMPONENT_DUPE_UNIQUE // Only one area will ever exist, so only one component will ever exist + + /// This actually handles updating cameras and whatnot. + var/datum/motion_group/motion_group + +/datum/component/monitored_area/Initialize() + // By the way, this component should be added in LateInitialize(). + if(!isarea(parent)) + return COMPONENT_INCOMPATIBLE + motion_group = new() + +/datum/component/monitored_area/RegisterWithParent() + RegisterSignal(parent, COMSIG_AREA_ENTERED, PROC_REF(on_entered)) + RegisterSignal(parent, COMSIG_AREA_EXITED, PROC_REF(on_exited)) + // FIXME: cameras will never be updated after registration + for(var/obj/machinery/camera/camera in parent) + motion_group.track_camera(camera) + +/datum/component/monitored_area/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_AREA_ENTERED, COMSIG_AREA_EXITED)) + for(var/obj/machinery/camera/camera as anything in motion_group.motion_cameras) + motion_group.untrack_camera(camera) + +/datum/component/monitored_area/proc/on_entered(area/_source, atom/movable/gain, area/_old_area) + SIGNAL_HANDLER + motion_group.track_mob(gain) + +/datum/component/monitored_area/proc/on_exited(area/_source, atom/movable/lost, _direction) + SIGNAL_HANDLER + motion_group.untrack_mob(lost) + +/// Handler for motion groups. Motion-sensitive cameras can optionally associate with one of these groups. +/// This doesn't do anything by itself. Something needs to drive it (like a [component][/datum/component/monitored_area]). +/datum/motion_group + /// The cameras in this area that we are tracking. Lazy. + var/list/obj/machinery/camera/motion_cameras + /// Our motion targets. This gets referenced by cameras. + var/list/datum/weakref/motion_targets = list() + +/datum/motion_group/proc/track_camera(obj/machinery/camera/gain_camera) + if(!gain_camera.isMotion()) + return + + RegisterSignal(gain_camera, COMSIG_QDELETING, PROC_REF(untrack_camera)) + gain_camera.set_area_motion(src) + LAZYOR(motion_cameras, gain_camera) + +/datum/motion_group/proc/untrack_camera(obj/machinery/camera/lost_camera) + SIGNAL_HANDLER + + LAZYREMOVE(motion_cameras, lost_camera) + UnregisterSignal(lost_camera, COMSIG_QDELETING) + if(!LAZYLEN(motion_cameras)) + // clear targets if we don't have any cameras so we don't have hanging references + // (they're weakrefs but still we should be doing this) + LAZYNULL(motion_targets) + +/datum/motion_group/proc/track_mob(mob/gain_mob) + if(!ismob(gain_mob) || !LAZYLEN(motion_cameras)) + return + + for(var/obj/machinery/camera/camera as anything in motion_cameras) + camera.new_target(gain_mob) + return //?? + +/datum/motion_group/proc/untrack_mob(mob/lost_mob) + if(!ismob(lost_mob) || !LAZYLEN(motion_cameras)) + return + + for(var/obj/machinery/camera/camera as anything in motion_cameras) + camera.lost_target(lost_mob) + return //?? diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm index 72d7aeb91632..7bfead87625b 100644 --- a/code/datums/components/orbiter.dm +++ b/code/datums/components/orbiter.dm @@ -1,7 +1,11 @@ /datum/component/orbiter can_transfer = TRUE dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + /// Assoc list of all orbiters -> their initial matrix var/list/orbiter_list + /// Assoc list of orbiters -> their orbiting parameters + var/list/orbiter_params + /// Movement tracker used to check when our owner moves var/datum/movement_detector/tracker //radius: range to orbit at, radius of the circle formed by orbiting (in pixels) @@ -14,6 +18,7 @@ return COMPONENT_INCOMPATIBLE orbiter_list = list() + orbiter_params = list() begin_orbit(orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation) @@ -39,6 +44,7 @@ for(var/i in orbiter_list) end_orbit(i) orbiter_list = null + orbiter_params = null return ..() /datum/component/orbiter/InheritComponent(datum/component/orbiter/newcomp, original, atom/movable/orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation) @@ -50,11 +56,14 @@ var/atom/movable/incoming_orbiter = o incoming_orbiter.orbiting = src // It is important to transfer the signals so we don't get locked to the new orbiter component for all time - newcomp.UnregisterSignal(incoming_orbiter, COMSIG_MOVABLE_MOVED) + newcomp.UnregisterSignal(incoming_orbiter, list(COMSIG_MOVABLE_MOVED, COMSIG_ATOM_BEFORE_SHUTTLE_MOVE, COMSIG_ATOM_AFTER_SHUTTLE_MOVE)) RegisterSignal(incoming_orbiter, COMSIG_MOVABLE_MOVED, PROC_REF(orbiter_move_react)) + RegisterSignal(incoming_orbiter, COMSIG_ATOM_BEFORE_SHUTTLE_MOVE, PROC_REF(orbiter_before_shuttle_move)) orbiter_list += newcomp.orbiter_list + orbiter_params += newcomp.orbiter_params newcomp.orbiter_list = null + newcomp.orbiter_params = null /datum/component/orbiter/PostTransfer(datum/new_parent) if(!isatom(new_parent) || isarea(new_parent) || !get_turf(new_parent)) @@ -67,11 +76,14 @@ orbiter.orbiting.end_orbit(orbiter, TRUE) else orbiter.orbiting.end_orbit(orbiter) + + orbiter_params[orbiter] = args.Copy(2) orbiter_list[orbiter] = TRUE orbiter.orbiting = src ADD_TRAIT(orbiter, TRAIT_NO_FLOATING_ANIM, ORBITING_TRAIT) RegisterSignal(orbiter, COMSIG_MOVABLE_MOVED, PROC_REF(orbiter_move_react)) + RegisterSignal(orbiter, COMSIG_ATOM_BEFORE_SHUTTLE_MOVE, PROC_REF(orbiter_before_shuttle_move)) SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_BEGIN, orbiter) @@ -103,15 +115,28 @@ orbiter.abstract_move(get_turf(parent)) to_chat(orbiter, span_notice("Now orbiting [parent].")) +/datum/component/orbiter/proc/orbiter_before_shuttle_move(atom/source) + SIGNAL_HANDLER + // We need to detach ourselves before the shuttle moves and reattach afterwards + end_orbit(source, TRUE) + RegisterSignal(source, COMSIG_ATOM_AFTER_SHUTTLE_MOVE, PROC_REF(orbiter_after_shuttle_move)) + +/datum/component/orbiter/proc/orbiter_after_shuttle_move(atom/source) + SIGNAL_HANDLER + UnregisterSignal(source, COMSIG_ATOM_AFTER_SHUTTLE_MOVE) + begin_orbit(arglist(list(source) + orbiter_params[source])) + /datum/component/orbiter/proc/end_orbit(atom/movable/orbiter, refreshing=FALSE) if(!orbiter_list[orbiter]) return - UnregisterSignal(orbiter, COMSIG_MOVABLE_MOVED) + UnregisterSignal(orbiter, list(COMSIG_MOVABLE_MOVED, COMSIG_ATOM_BEFORE_SHUTTLE_MOVE, COMSIG_ATOM_AFTER_SHUTTLE_MOVE)) SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_STOP, orbiter) orbiter.SpinAnimation(0, 0) if(istype(orbiter_list[orbiter],/matrix)) //This is ugly. orbiter.transform = orbiter_list[orbiter] orbiter_list -= orbiter + if(!refreshing) + orbiter_params -= orbiter orbiter.stop_orbit(src) orbiter.orbiting = null diff --git a/code/datums/components/palette.dm b/code/datums/components/palette.dm index 2ae66f50b23c..0fb937a3b11c 100644 --- a/code/datums/components/palette.dm +++ b/code/datums/components/palette.dm @@ -106,7 +106,7 @@ var/is_right_clicking = LAZYACCESS(params2list(params), RIGHT_CLICK) var/index = text2num(choice) if(is_right_clicking) - var/chosen_color = input(user, "Pick new color", "[parent]", colors[index]) as color|null + var/chosen_color = tgui_color_picker(user, "Pick new color", "[parent]", colors[index]) if(chosen_color && !QDELETED(src) && !IS_DEAD_OR_INCAP(user) && user.is_holding(parent)) colors[index] = chosen_color update_radial_list() diff --git a/code/datums/components/payment.dm b/code/datums/components/payment.dm index 282492827370..e03ad9a61d75 100644 --- a/code/datums/components/payment.dm +++ b/code/datums/components/payment.dm @@ -124,8 +124,8 @@ user.pulling = dollars_left else user.pulling = dollars_left - log_econ("[total_cost] dollars were spent on [parent] by [user].") - to_chat(user, span_notice("Purchase completed with held cash.")) + log_econ("[total_cost] [MONEY_NAME] were spent on [parent] by [user].") + to_chat(user, span_notice("Purchase completed with held [MONEY_NAME].")) // DARKPACK EDIT CHANGE END - ECONOMY playsound(user, 'sound/effects/cashregister.ogg', 20, TRUE) return TRUE @@ -174,11 +174,11 @@ to_chat(user, span_warning("Credit Card lacks funds. Aborting.")) if(PAYMENT_VENDING) to_chat(user, span_warning("You do not possess the funds to purchase that.")) - atom_parent.balloon_alert(user, "needs [total_cost] credit\s!") + atom_parent.balloon_alert(user, "needs [total_cost] [MONEY_NAME_AUTOPURAL(total_cost)]!") return FALSE target_acc.transfer_money(credit_card.registered_account, total_cost, "Nanotrasen: Usage of Corporate Machinery") - log_econ("[total_cost] credits were spent on [parent] by [user] via [credit_card.registered_account.account_holder]'s card.") - credit_card.registered_account.bank_card_talk("[total_cost] credits deducted from your account.") + log_econ("[total_cost] [MONEY_NAME] were spent on [parent] by [user] via [credit_card.registered_account.account_holder]'s card.") + credit_card.registered_account.bank_card_talk("[total_cost] [MONEY_NAME] deducted from your account.") playsound(src, 'sound/effects/cashregister.ogg', 20, TRUE) SSeconomy.add_audit_entry(credit_card.registered_account, total_cost, parent) return TRUE diff --git a/code/datums/components/pet_commands/fetch.dm b/code/datums/components/pet_commands/fetch.dm index 143ac9ca1014..f3675534fa95 100644 --- a/code/datums/components/pet_commands/fetch.dm +++ b/code/datums/components/pet_commands/fetch.dm @@ -73,10 +73,11 @@ return var/mob/thrower = throwingdatum?.get_thrower() - if(thrower) - try_activate_command(thrower) - set_command_target(parent, thrown_thing) - parent.ai_controller.set_blackboard_key(BB_FETCH_DELIVER_TO, thrower) + if(!istype(thrower)) + return + try_activate_command(thrower) + set_command_target(parent, thrown_thing) + parent.ai_controller.set_blackboard_key(BB_FETCH_DELIVER_TO, thrower) // Don't try and fetch turfs or anchored objects if someone points at them /datum/pet_command/fetch/look_for_target(mob/living/pointing_friend, obj/item/pointed_atom) diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm index d2414cc5af0f..cc454d4327c4 100644 --- a/code/datums/components/plumbing/_plumbing.dm +++ b/code/datums/components/plumbing/_plumbing.dm @@ -26,6 +26,9 @@ var/supply_color = COLOR_BLUE ///Extend the pipe to the edge for wall-mounted plumbed devices, like sinks and showers var/extend_pipe_to_edge = FALSE + /// How many distinct reagents can we accept at once + /// Ex - if this was set to "3", our component would only request the first 3 reagents found, even if more are available + var/distinct_reagent_cap = INFINITY ///turn_connects is for wheter or not we spin with the object to change our pipes /datum/component/plumbing/Initialize(start=TRUE, ducting_layer, turn_connects=TRUE, datum/reagents/custom_receiver, extend_pipe_to_edge = FALSE) @@ -55,10 +58,19 @@ RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(create_overlays)) //called by lateinit on startup RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, PROC_REF(on_parent_dir_change)) //called when placed on a shuttle and it moves, and other edge cases RegisterSignal(parent, COMSIG_MOVABLE_CHANGE_DUCT_LAYER, PROC_REF(change_ducting_layer)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) /datum/component/plumbing/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_QDELETING, COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, COMSIG_OBJ_HIDE, \ - COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ATOM_DIR_CHANGE, COMSIG_MOVABLE_CHANGE_DUCT_LAYER)) + UnregisterSignal(parent, list( + COMSIG_MOVABLE_MOVED, + COMSIG_QDELETING, + COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, + COMSIG_OBJ_HIDE, + COMSIG_ATOM_UPDATE_OVERLAYS, + COMSIG_ATOM_DIR_CHANGE, + COMSIG_MOVABLE_CHANGE_DUCT_LAYER, + COMSIG_ATOM_EXAMINE, + )) REMOVE_TRAIT(parent, TRAIT_UNDERFLOOR, REF(src)) /datum/component/plumbing/Destroy() @@ -76,6 +88,12 @@ if(D & demand_connects) send_request(D) +/datum/component/plumbing/proc/on_examine(atom/movable/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(distinct_reagent_cap != INFINITY) + examine_list += span_notice("This plumbing component will only accept up to [distinct_reagent_cap] distinct reagents at once.") + ///Can we be added to the ductnet? /datum/component/plumbing/proc/can_add(datum/ductnet/ductnet, dir) if(!active) @@ -89,22 +107,44 @@ ///called from in process(). only calls process_request(), but can be overwritten for children with special behaviour /datum/component/plumbing/proc/send_request(dir) - process_request(dir = dir) + var/amount_to_give = MACHINE_REAGENT_TRANSFER + // infinite cap means we need to special handling, process_request will just grab as much as it wants. + if(distinct_reagent_cap == INFINITY) + process_request(amount_to_give, null, dir) // null for no specific reagent, we're not picky. + return + + // we have a cap, so we need to figure out what reagents we want + var/list/all_allowed_reagents = get_all_network_reagents(ducts["[dir]"]) + if(length(all_allowed_reagents) > distinct_reagent_cap) + all_allowed_reagents.Cut(distinct_reagent_cap + 1) + else if(!length(all_allowed_reagents)) + return + + // request an even amount of each allowed reagent + var/amount_per_reagent = round(amount_to_give / length(all_allowed_reagents), CHEMICAL_VOLUME_ROUNDING) + for(var/allowed_reagent in all_allowed_reagents) + process_request(amount_per_reagent, allowed_reagent, dir) + +/// Returns a list of all distinct reagent types available in the passed duct network. +/// The passed net can be null, it is handled. +/datum/component/plumbing/proc/get_all_network_reagents(datum/ductnet/net) + var/list/distinct_reagents = list() + for(var/datum/reagent/existing_regent as anything in reagents.reagent_list) + distinct_reagents |= existing_regent.type + for(var/datum/component/plumbing/supplier as anything in net?.suppliers) + for(var/datum/reagent/chemical as anything in supplier.reagents.reagent_list) + distinct_reagents |= chemical.type + return distinct_reagents ///check who can give us what we want, and how many each of them will give us /datum/component/plumbing/proc/process_request(amount = MACHINE_REAGENT_TRANSFER, reagent, dir, round_robin = TRUE) - //find the duct to take from - var/datum/ductnet/net - if(!ducts.Find(num2text(dir))) - return FALSE - net = ducts[num2text(dir)] - + var/datum/ductnet/net = ducts["[dir]"] //find all valid suppliers in the duct var/list/valid_suppliers = list() - for(var/datum/component/plumbing/supplier as anything in net.suppliers) + for(var/datum/component/plumbing/supplier as anything in net?.suppliers) if(supplier.can_give(amount, reagent, net)) valid_suppliers += supplier - var/suppliersLeft = valid_suppliers.len + var/suppliersLeft = length(valid_suppliers) if(!suppliersLeft) return FALSE @@ -122,12 +162,10 @@ SHOULD_BE_PURE(TRUE) if(amount <= 0) - return + return FALSE if(reagent) //only asked for one type of reagent - for(var/datum/reagent/contained_reagent as anything in reagents.reagent_list) - if(contained_reagent.type == reagent) - return TRUE + return reagents.has_reagent(reagent) else if(reagents.total_volume) //take whatever return TRUE @@ -244,6 +282,8 @@ // Machines disable when they get moved for(var/obj/machinery/duct/duct in parent_movable.loc) if(duct.anchored && (duct.duct_layer & ducting_layer)) + log_mapping("[duct.name] was found at [AREACOORD(parent_movable)] spawning on top of [parent_movable.name], \ + which should not occur as it takes ducts itself!") duct.disconnect_duct() if(demand_connects) diff --git a/code/datums/components/plumbing/automated_iv.dm b/code/datums/components/plumbing/automated_iv.dm new file mode 100644 index 000000000000..1f067a7b1e86 --- /dev/null +++ b/code/datums/components/plumbing/automated_iv.dm @@ -0,0 +1,33 @@ +/datum/component/plumbing/automated_iv + demand_connects = SOUTH + supply_connects = NORTH + ///Temporary holder to store all the reagents from the iv drip before transferring it to the ducts + var/datum/reagents/plumbing/holder + +/datum/component/plumbing/automated_iv/Initialize(start = TRUE, _ducting_layer, _turn_connects = TRUE, datum/reagents/custom_receiver, distinct_reagent_cap = 3) + . = ..() + if(!istype(parent, /obj/machinery/iv_drip/plumbing)) + return COMPONENT_INCOMPATIBLE + var/obj/machinery/iv_drip/plumbing/drip = parent + holder = new(drip.reagents.maximum_volume, drip.reagents.flags) + holder.my_atom = drip + +/datum/component/plumbing/automated_iv/Destroy(force) + QDEL_NULL(holder) + return ..() + +/datum/component/plumbing/automated_iv/can_give(amount, reagent) + var/obj/machinery/iv_drip/plumbing/drip = parent + return ..() && drip.mode == IV_TAKING + +/datum/component/plumbing/automated_iv/send_request(dir) + var/obj/machinery/iv_drip/plumbing/drip = parent + if(drip.mode == IV_INJECTING) + return ..() + +/datum/component/plumbing/automated_iv/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net, round_robin = TRUE) + reagents.trans_to(holder, reagents.total_volume) + reagents = holder + . = ..() + var/obj/machinery/iv_drip/plumbing/drip = parent + reagents = drip.reagents diff --git a/code/datums/components/plumbing/reaction_chamber.dm b/code/datums/components/plumbing/reaction_chamber.dm index 07ea18e13da6..3332d94b0948 100644 --- a/code/datums/components/plumbing/reaction_chamber.dm +++ b/code/datums/components/plumbing/reaction_chamber.dm @@ -83,5 +83,3 @@ /datum/component/plumbing/alkaline_input/send_request(dir) process_request(reagent = /datum/reagent/reaction_agent/basic_buffer, dir = dir) - - diff --git a/code/datums/components/plumbing/simple_components.dm b/code/datums/components/plumbing/simple_components.dm index 1378780353a4..98fa64f885a0 100644 --- a/code/datums/components/plumbing/simple_components.dm +++ b/code/datums/components/plumbing/simple_components.dm @@ -3,6 +3,10 @@ /datum/component/plumbing/simple_demand demand_connects = SOUTH +/datum/component/plumbing/simple_demand/Initialize(start, ducting_layer, turn_connects, datum/reagents/custom_receiver, extend_pipe_to_edge, distinct_reagent_cap = INFINITY) + src.distinct_reagent_cap = distinct_reagent_cap + return ..() + ///has one pipe output that only supplies. example is liquid pump and manual input pipe /datum/component/plumbing/simple_supply supply_connects = SOUTH diff --git a/code/datums/components/plundering_attacks.dm b/code/datums/components/plundering_attacks.dm index f55fa42b0717..93aa42925496 100644 --- a/code/datums/components/plundering_attacks.dm +++ b/code/datums/components/plundering_attacks.dm @@ -44,7 +44,7 @@ amount_to_steal = account_to_rob.account_balance plunder_stored += amount_to_steal account_to_rob.adjust_money(-amount_to_steal) - account_to_rob.bank_card_talk("Transaction confirmed! Transferred [amount_to_steal] credits to \!") + account_to_rob.bank_card_talk("Transaction confirmed! Transferred [amount_to_steal] [MONEY_NAME] to \!") /datum/component/plundering_attacks/proc/drop_plunder() SIGNAL_HANDLER diff --git a/code/datums/components/pricetag.dm b/code/datums/components/pricetag.dm index dfa1471ec912..d8636952921e 100644 --- a/code/datums/components/pricetag.dm +++ b/code/datums/components/pricetag.dm @@ -91,7 +91,7 @@ overall_item_price = max(0, overall_item_price - payee_cut) payee.adjust_money(payee_cut, "Pricetag: [capitalize(format_text(source.name))] Sale") - payee.bank_card_talk("Sale of [source] recorded. [payee_cut] credits added to account.") + payee.bank_card_talk("Sale of [source] recorded. [payee_cut] [MONEY_NAME] added to account.") // Update the report with the modified final price report.total_value[export] += overall_item_price diff --git a/code/datums/components/proficient_miner.dm b/code/datums/components/proficient_miner.dm index cdc3b65871b4..cd9d02b1bd57 100644 --- a/code/datums/components/proficient_miner.dm +++ b/code/datums/components/proficient_miner.dm @@ -1,11 +1,17 @@ /// Component given to mobs that can mine when moving /datum/component/proficient_miner + /// Toolspeed for mining, 0 will cause it to instamine rock + var/mining_speed = 0 + /// Should we pass the do_after visuals to our rider if we are a mob? + var/pass_driver = FALSE /// Last tick when we bumpmined. Prevents diagonal bumpnining being thrice as fast as normal var/last_bumpmine_tick = -1 -/datum/component/proficient_miner/Initialize() +/datum/component/proficient_miner/Initialize(mining_speed = 0, pass_driver = FALSE) if (!ismovable(parent)) return COMPONENT_INCOMPATIBLE + src.mining_speed = mining_speed + src.pass_driver = pass_driver /datum/component/proficient_miner/RegisterWithParent() RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(on_bump)) @@ -26,12 +32,37 @@ return var/turf/closed/mineral/mineral_wall = target - if(!istype(mineral_wall, /turf/closed/mineral/gibtonite)) - last_bumpmine_tick = world.time - mineral_wall.gets_drilled(source) + if(istype(mineral_wall, /turf/closed/mineral/gibtonite)) + var/turf/closed/mineral/gibtonite/gibtonite_wall = mineral_wall + if(gibtonite_wall.stage != GIBTONITE_UNSTRUCK) + return + + if(user && mining_speed > 0) + INVOKE_ASYNC(src, PROC_REF(slow_mine), user, target) + return + + last_bumpmine_tick = world.time + mineral_wall.gets_drilled(source) + +/datum/component/proficient_miner/proc/slow_mine(mob/living/user, turf/closed/mineral/mineral_wall) + if(TIMER_COOLDOWN_RUNNING(mineral_wall, REF(user))) //prevents mining turfs in progress return - var/turf/closed/mineral/gibtonite/gibtonite_wall = mineral_wall - if(gibtonite_wall.stage == GIBTONITE_UNSTRUCK) - last_bumpmine_tick = world.time - mineral_wall.gets_drilled(source) + var/mining_delay = mineral_wall.tool_mine_speed * mining_speed + TIMER_COOLDOWN_START(mineral_wall, REF(user), mining_delay) + var/static/list/mine_sounds = list('sound/effects/pickaxe/picaxe1.ogg', 'sound/effects/pickaxe/picaxe2.ogg', 'sound/effects/pickaxe/picaxe3.ogg') + playsound(user, pick(mine_sounds), 50) + + var/mob/living/driver = null + if (pass_driver && length(user.buckled_mobs)) + driver = user.buckled_mobs[1] + + if(!do_after(user, mining_delay, mineral_wall, bar_override = driver)) + TIMER_COOLDOWN_END(mineral_wall, REF(user)) //if we fail we can start again immediately + return + + if (mining_delay > MIN_TOOL_SOUND_DELAY) + playsound(user, pick(mine_sounds), 50) + + if(istype(mineral_wall)) + mineral_wall.gets_drilled(driver || user) diff --git a/code/datums/components/profound_fisher.dm b/code/datums/components/profound_fisher.dm index 836fc7e21673..3c2ddbef1a85 100644 --- a/code/datums/components/profound_fisher.dm +++ b/code/datums/components/profound_fisher.dm @@ -105,7 +105,7 @@ /datum/component/profound_fisher/proc/should_fish_on(mob/living/user, atom/target) if(!HAS_TRAIT(target, TRAIT_FISHING_SPOT) || GLOB.fishing_challenges_by_user[user]) return FALSE - if(user.combat_mode || !user.CanReach(target)) + if(user.combat_mode || !target.IsReachableBy(user)) return FALSE return TRUE diff --git a/code/datums/components/prosthetic_item.dm b/code/datums/components/prosthetic_item.dm index b8876f5484f9..1537535974f6 100644 --- a/code/datums/components/prosthetic_item.dm +++ b/code/datums/components/prosthetic_item.dm @@ -137,6 +137,9 @@ * Returns the created pseudopart */ /mob/living/carbon/proc/make_item_prosthetic(obj/item/some_thing, target_zone = BODY_ZONE_R_ARM, fall_prob = 0) + if(HAS_TRAIT_FROM(some_thing, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)) + CRASH("make_item_prosthetic given an item that is already a prosthetic limb!") + var/obj/item/bodypart/existing = get_bodypart(target_zone) existing?.drop_limb(special = TRUE) diff --git a/code/datums/components/radioactive_exposure.dm b/code/datums/components/radioactive_exposure.dm index b8a034e77882..324e8c28e295 100644 --- a/code/datums/components/radioactive_exposure.dm +++ b/code/datums/components/radioactive_exposure.dm @@ -75,4 +75,5 @@ /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 + use_user_hud_icon = TRUE + overlay_state = "radioactive_area" diff --git a/code/datums/components/redirect_attack_hand_from_turf.dm b/code/datums/components/redirect_attack_hand_from_turf.dm index 1e5380290709..6d1327f3bcc2 100644 --- a/code/datums/components/redirect_attack_hand_from_turf.dm +++ b/code/datums/components/redirect_attack_hand_from_turf.dm @@ -28,13 +28,21 @@ src.screentip_texts = screentip_texts src.interact_check = interact_check - RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) connect_to_new_turf() +/datum/component/redirect_attack_hand_from_turf/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + /datum/component/redirect_attack_hand_from_turf/Destroy(force) + interact_check = null disconnect_from_old_turf() return ..() +/datum/component/redirect_attack_hand_from_turf/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) + /datum/component/redirect_attack_hand_from_turf/proc/find_turf() PRIVATE_PROC(TRUE) @@ -101,7 +109,7 @@ var/atom/movable/movable_parent = parent if (!movable_parent.can_interact(user)) return NONE - + if (!isnull(interact_check) && !interact_check.Invoke(user)) return NONE @@ -123,7 +131,7 @@ if (!isnull(held_item)) return NONE - + if (!isnull(interact_check) && !interact_check.Invoke(user)) return NONE diff --git a/code/datums/components/reflection.dm b/code/datums/components/reflection.dm index 82ed1a24da22..d5d37b72dd2c 100644 --- a/code/datums/components/reflection.dm +++ b/code/datums/components/reflection.dm @@ -148,9 +148,9 @@ SIGNAL_HANDLER var/atom/movable/reflection = LAZYACCESS(reflected_movables, target) - if(reflection) - qdel(reflection) LAZYREMOVE(reflected_movables, target) + if(!QDELETED(reflection)) + qdel(reflection) UnregisterSignal(target, check_reflect_signals) UnregisterSignal(target, COMSIG_QDELETING) diff --git a/code/datums/components/regenerator.dm b/code/datums/components/regenerator.dm index 44c189eaf2f0..9e9fdc09738c 100644 --- a/code/datums/components/regenerator.dm +++ b/code/datums/components/regenerator.dm @@ -115,13 +115,13 @@ var/need_mob_update = FALSE if(brute_per_second) - need_mob_update += living_parent.adjustBruteLoss(-1 * heal_mod * brute_per_second * seconds_per_tick, updating_health = FALSE) + need_mob_update += living_parent.adjust_brute_loss(-1 * heal_mod * brute_per_second * seconds_per_tick, updating_health = FALSE) if(burn_per_second) - need_mob_update += living_parent.adjustFireLoss(-1 * heal_mod * burn_per_second * seconds_per_tick, updating_health = FALSE) + need_mob_update += living_parent.adjust_fire_loss(-1 * heal_mod * burn_per_second * seconds_per_tick, updating_health = FALSE) if(tox_per_second) - need_mob_update += living_parent.adjustToxLoss(-1 * heal_mod * tox_per_second * seconds_per_tick, updating_health = FALSE) + need_mob_update += living_parent.adjust_tox_loss(-1 * heal_mod * tox_per_second * seconds_per_tick, updating_health = FALSE) if(oxy_per_second) - need_mob_update += living_parent.adjustOxyLoss(-1 * heal_mod * oxy_per_second * seconds_per_tick, updating_health = FALSE) + need_mob_update += living_parent.adjust_oxy_loss(-1 * heal_mod * oxy_per_second * seconds_per_tick, updating_health = FALSE) if(heals_wounds && iscarbon(parent)) var/mob/living/carbon/carbon_parent = living_parent diff --git a/code/datums/components/reskinnable_atom.dm b/code/datums/components/reskinnable_atom.dm new file mode 100644 index 000000000000..84566458593b --- /dev/null +++ b/code/datums/components/reskinnable_atom.dm @@ -0,0 +1,208 @@ +/** + * ### Atom skin singleton datum + * + * Simple datum which holds information about a skin that can be applied to an atom. + */ +/datum/atom_skin + abstract_type = /datum/atom_skin + + /// Required, name shown in the radial menu + var/preview_name + + /// If true, changing the reskin also changes the base_icon_state of the atom + var/change_base_icon_state = FALSE + /// If true, changing the reskin also changes the inhand_icon_state of the atom + var/change_inhand_icon_state = FALSE + /// If true, unset vars are reset to their original values when applying this skin + var/reset_missing = TRUE + + /// Optional, name to change the atom to when applied + var/new_name + /// Optional, description to change the atom to when applied + var/new_desc + /// Optional, icon to change the atom to when applied + var/new_icon + /// Optional, icon_state to change the atom to when applied + var/new_icon_state + +/** + * Applies all relevant skin changes to the given atom + * Can be overridden to add additional behavior, such as registering signals or altering other vars. + * + * * apply_to: The atom to apply the skin to + */ +/datum/atom_skin/proc/apply(atom/apply_to) + SHOULD_CALL_PARENT(TRUE) + APPLY_VAR_OR_RESET_INITIAL(apply_to, name, new_name, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, desc, new_desc, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, icon, new_icon, reset_missing) + APPLY_VAR_OR_RESET_TO(apply_to, icon_state, new_icon_state, reset_missing, initial(apply_to.post_init_icon_state) || initial(apply_to.icon_state)) + if(change_base_icon_state) + APPLY_VAR_OR_RESET_INITIAL(apply_to, base_icon_state, new_icon_state, reset_missing) + if(change_inhand_icon_state && isitem(apply_to)) + var/obj/item/item_apply_to = apply_to + APPLY_VAR_OR_RESET_INITIAL(item_apply_to, inhand_icon_state, new_icon_state, reset_missing) + +/** + * Resets all changes this skin would have made to the given atom + * Does not verify that the skin was actually applied to the atom beforehand. + * Can be overridden to add additional behavior, such as unregistering signals or altering other vars. + * + * * clear_from: The atom to clear the skin from + */ +/datum/atom_skin/proc/clear_skin(atom/clear_from) + SHOULD_CALL_PARENT(TRUE) + RESET_INITIAL_IF_SET(clear_from, name, new_name) + RESET_INITIAL_IF_SET(clear_from, desc, new_desc) + RESET_INITIAL_IF_SET(clear_from, icon, new_icon) + RESET_TO_IF_SET(clear_from, icon_state, new_icon_state, initial(clear_from.post_init_icon_state) || initial(clear_from.icon_state)) + if(change_base_icon_state) + RESET_INITIAL_IF_SET(clear_from, base_icon_state, new_icon_state) + if(change_inhand_icon_state && isitem(clear_from)) + var/obj/item/item_clear_from = clear_from + RESET_INITIAL_IF_SET(item_clear_from, inhand_icon_state, new_icon_state) + +/// Gets a preview image for this skin based on the given atom's icon and icon_state +/datum/atom_skin/proc/get_preview_icon(atom/for_atom) + return image( + icon = new_icon || for_atom.icon, + icon_state = new_icon_state || for_atom.icon_state, + ) + +/** + * ### Reskinnable atoms + * + * Simple component which lets an atom be alt-clicked to open a radial menu to choose a new skin to apply. + */ +/datum/component/reskinable_item + dupe_mode = COMPONENT_DUPE_SELECTIVE + /// Base reskin type to pull options from - all subtypes except those blacklisted are valid options + VAR_PRIVATE/base_reskin_type + /// If TRUE, the reskin option is infinite-use. If FALSE, the component is deleted on use (so you're stuck with that skin). + VAR_PRIVATE/infinite_reskin = FALSE + /// List of subtypes of /datum/atom_skin that are not allowed to be used for this item + VAR_PRIVATE/list/blacklisted_subtypes + + /// Currently applied skin preview_name + VAR_PRIVATE/current_skin + +/datum/component/reskinable_item/Initialize(base_reskin_type, infinite = FALSE, initial_skin, list/blacklisted_subtypes = list()) + if(!isatom(parent) || isarea(parent)) + return COMPONENT_INCOMPATIBLE + + src.base_reskin_type = base_reskin_type + src.infinite_reskin = infinite + src.blacklisted_subtypes = blacklisted_subtypes + + if(initial_skin) + set_skin_by_name(initial_skin) + + var/atom/atom_parent = parent + atom_parent.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 + +/datum/component/reskinable_item/RegisterWithParent() + RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE_TAGS, PROC_REF(add_tags)) + RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(add_context)) + +/datum/component/reskinable_item/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_CLICK_ALT) + UnregisterSignal(parent, COMSIG_ATOM_EXAMINE_TAGS) + UnregisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM) + +/datum/component/reskinable_item/CheckDupeComponent(datum/component/comp, base_reskin_type, infinite = FALSE, initial_skin, list/blacklisted_subtypes = list()) + if(src.base_reskin_type != base_reskin_type) + return FALSE // new comp - though the alt-click behavior will collide + + src.infinite_reskin = infinite + src.blacklisted_subtypes = blacklisted_subtypes + + set_skin_by_name(initial_skin) + return TRUE // same comp + +/datum/component/reskinable_item/proc/get_skins_by_name() + var/list/reskin_options = list() + for(var/datum/atom_skin/reskin_option as anything in valid_subtypesof(base_reskin_type) - blacklisted_subtypes) + reskin_options[reskin_option::preview_name] = reskin_option + + return reskin_options + +/datum/component/reskinable_item/proc/set_skin_by_name(input_name) + var/list/reskin_options = get_skins_by_name() + if(current_skin) + var/datum/atom_skin/previous_skin = GLOB.atom_skins[reskin_options[current_skin]] + previous_skin.clear_skin(parent) + + if(input_name) + var/datum/atom_skin/reskin_to_apply = GLOB.atom_skins[reskin_options[input_name]] + reskin_to_apply.apply(parent) + + current_skin = input_name + + var/atom/atom_parent = parent + atom_parent.update_appearance() + + if(isitem(parent)) + var/obj/item/item_parent = parent + item_parent.update_slot_icon() + + SEND_SIGNAL(parent, COMSIG_OBJ_RESKIN, input_name) + +/datum/component/reskinable_item/proc/add_context(atom/source, list/context, obj/item/held_item, mob/user) + SIGNAL_HANDLER + + context[SCREENTIP_CONTEXT_ALT_LMB] = "Reskin" + return CONTEXTUAL_SCREENTIP_SET + +/datum/component/reskinable_item/proc/add_tags(atom/source, mob/user, list/tags) + SIGNAL_HANDLER + + tags["reskinnable"] = "This item is able to be reskinned! Alt-Click to do so!" + +/// Called when alt clicked and the item has unique reskin options +/datum/component/reskinable_item/proc/on_click_alt_reskin(datum/source, mob/user) + SIGNAL_HANDLER + + if(!user.can_perform_action(parent, NEED_DEXTERITY)) + return NONE + + INVOKE_ASYNC(src, PROC_REF(reskin_obj), user) + return CLICK_ACTION_SUCCESS + +/** + * Reskins object based on a user's choice + * + * Arguments: + * * user The mob choosing a reskin option + */ +/datum/component/reskinable_item/proc/reskin_obj(mob/user) + var/atom/atom_parent = parent + + var/list/items = list() + for(var/reskin_name, reskin_typepath in get_skins_by_name()) + items[reskin_name] = GLOB.atom_skins[reskin_typepath].get_preview_icon(atom_parent) + + sort_list(items) + + var/pick = show_radial_menu(user, parent, items, custom_check = CALLBACK(src, PROC_REF(check_reskin_menu), user), radius = 38, require_near = TRUE) + if(!pick || !items[pick]) + return + + set_skin_by_name(pick) + to_chat(user, span_info("[parent] is now skinned as '[pick].'")) + + if(!infinite_reskin) + qdel(src) + +/** + * Checks if we are allowed to interact with a radial menu for reskins + * + * Arguments: + * * user The mob interacting with the menu + */ +/datum/component/reskinable_item/proc/check_reskin_menu(mob/user) + if(QDELETED(parent)) + return FALSE + if(user.incapacitated) + return FALSE + return TRUE diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index e966012bdae9..a27e05915a40 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -5,8 +5,10 @@ var/can_be_driven = TRUE /// If TRUE, this creature's abilities can be triggered by the rider while mounted var/can_use_abilities = FALSE - /// shall we require riders to go through the riding minigame if they arent in our friends list + /// Shall we require riders to go through the riding minigame if they arent in our friends list var/require_minigame = FALSE + /// Do we use vehicle_move_delay or default to mob's own movespeed? + var/uses_native_speed = FALSE /// unsharable abilities that we will force to be shared anyway var/list/override_unsharable_abilities = list() /// abilities that are always blacklisted from sharing @@ -103,8 +105,12 @@ formerly_ridden.layer = MOB_LAYER return ..() +/datum/component/riding/creature/Process_Spacemove(direction, continuous_move) + var/mob/living/living_parent = parent + return override_allow_spacemove || living_parent.Process_Spacemove(direction, continuous_move) + /datum/component/riding/creature/driver_move(atom/movable/movable_parent, mob/living/user, direction) - if(!COOLDOWN_FINISHED(src, vehicle_move_cooldown) || !Process_Spacemove()) + if(!COOLDOWN_FINISHED(src, vehicle_move_cooldown) || !Process_Spacemove(direction)) return COMPONENT_DRIVER_BLOCK_MOVE if(!keycheck(user)) if(ispath(keytype, /obj/item)) @@ -113,7 +119,7 @@ return COMPONENT_DRIVER_BLOCK_MOVE var/mob/living/living_parent = parent step(living_parent, direction) - var/modified_move_delay = vehicle_move_delay + var/modified_move_delay = uses_native_speed ? living_parent.cached_multiplicative_slowdown : vehicle_move_delay if(HAS_TRAIT(user, TRAIT_ROUGHRIDER)) // YEEHAW! switch(HAS_TRAIT(user, TRAIT_PRIMITIVE) ? SANITY_LEVEL_GREAT : user.mob_mood?.sanity_level) if(SANITY_LEVEL_GREAT) @@ -126,6 +132,8 @@ modified_move_delay *= 1.1 if(SANITY_LEVEL_INSANE) modified_move_delay *= 1.2 + if(NSCOMPONENT(direction) && EWCOMPONENT(direction)) + modified_move_delay = FLOOR(modified_move_delay * sqrt(2), world.tick_lag) COOLDOWN_START(src, vehicle_move_cooldown, modified_move_delay) return ..() @@ -417,6 +425,7 @@ COOLDOWN_START(src, pony_trot_cooldown, 500 MILLISECONDS) /datum/component/riding/creature/bear + vehicle_move_delay = 1.5 /datum/component/riding/creature/bear/get_rider_offsets_and_layers(pass_index, mob/offsetter) return list( @@ -494,7 +503,7 @@ /datum/component/riding/creature/goliath keytype = /obj/item/key/lasso - vehicle_move_delay = 4 + uses_native_speed = TRUE rider_traits = list(TRAIT_NO_FLOATING_ANIM, TRAIT_TENTACLE_IMMUNE) /datum/component/riding/creature/goliath/deathmatch @@ -570,6 +579,17 @@ return charger.summoner == user /datum/component/riding/creature/goldgrub + uses_native_speed = TRUE + +/datum/component/riding/creature/goldgrub/Initialize(mob/living/riding_mob, force, ride_check_flags) + . = ..() + var/mob/living/basic/mining/goldgrub/goldgrub = parent + goldgrub.add_movespeed_modifier(/datum/movespeed_modifier/goldgrub_mount) + +/datum/component/riding/creature/goldgrub/Destroy(force) + var/mob/living/basic/mining/goldgrub/goldgrub = parent + goldgrub.remove_movespeed_modifier(/datum/movespeed_modifier/goldgrub_mount) + return ..() /datum/component/riding/creature/goldgrub/get_rider_offsets_and_layers(pass_index, mob/offsetter) return list( @@ -616,7 +636,7 @@ if(!isclosedturf(pointed)) return var/mob/living/basic/basic_parent = parent - if(!basic_parent.CanReach(pointed)) + if(!pointed.IsReachableBy(basic_parent)) return basic_parent.melee_attack(pointed) @@ -626,6 +646,7 @@ /datum/component/riding/creature/raptor require_minigame = TRUE + uses_native_speed = TRUE ride_check_flags = RIDER_NEEDS_ARM | UNBUCKLE_DISABLED_RIDER /datum/component/riding/creature/raptor/Initialize(mob/living/riding_mob, force, ride_check_flags) @@ -655,18 +676,11 @@ force_dismount(buckled_mob, throw_range = 2, gentle = TRUE) /datum/component/riding/creature/raptor/get_rider_offsets_and_layers(pass_index, mob/offsetter) - if(!SSmapping.is_planetary()) - return list( - TEXT_NORTH = list(-1, 7), - TEXT_SOUTH = list(2, 10), - TEXT_EAST = list(0, 7), - TEXT_WEST = list(0, 7), - ) return list( - TEXT_NORTH = list(0, 7), - TEXT_SOUTH = list(0, 10), - TEXT_EAST = list(-3, 9), - TEXT_WEST = list(3, 9), + TEXT_NORTH = list(-1, 7), + TEXT_SOUTH = list(2, 10), + TEXT_EAST = list(0, 7), + TEXT_WEST = list(0, 7), ) /datum/component/riding/creature/raptor/get_parent_offsets_and_layers() @@ -683,8 +697,45 @@ if (istype(raptor)) raptor.adjust_offsets(dir) -/datum/component/riding/creature/raptor/fast - vehicle_move_delay = 1.5 - /datum/component/riding/creature/raptor/combat ai_behavior_while_ridden = RIDING_PAUSE_AI_MOVEMENT + +/datum/component/riding/creature/raptor/healer/vehicle_mob_buckle(mob/living/ridden, mob/living/rider, force) + RegisterSignal(rider, COMSIG_MOB_STATCHANGE, PROC_REF(on_buckled_stat_change)) + return ..() + +/datum/component/riding/creature/raptor/healer/vehicle_mob_unbuckle(mob/living/formerly_ridden, mob/living/former_rider, force) + UnregisterSignal(former_rider, COMSIG_MOB_STATCHANGE) + return ..() + +/datum/component/riding/creature/raptor/healer/proc/on_buckled_stat_change(mob/living/source, new_stat, old_stat) + SIGNAL_HANDLER + + var/mob/living/basic/raptor/raptor = source.buckled + if (!istype(raptor)) // what + UnregisterSignal(source, COMSIG_MOB_STATCHANGE) + return + + // Heal the owner and flee whatever might've attacked them + if (new_stat == CONSCIOUS || new_stat == DEAD || old_stat != CONSCIOUS || !raptor.ai_controller) + ADD_TRAIT(raptor, TRAIT_AI_PAUSED, REF(src)) + return + + REMOVE_TRAIT(raptor, TRAIT_AI_PAUSED, REF(src)) + // Rip bozo, but you're not our friend + if (source in raptor.ai_controller.blackboard[BB_FRIENDS_LIST]) + raptor.ai_controller.set_blackboard_key(BB_INJURED_RAPTOR, source) + + for (var/mob/living/possible_hostile in view(5, raptor)) + if (possible_hostile.stat || possible_hostile.invisibility > raptor.see_invisible || source.faction_check_atom(possible_hostile)) + continue + raptor.ai_controller.set_blackboard_key(BB_BASIC_MOB_FLEE_TARGET, possible_hostile) + break + +/datum/component/riding/creature/raptor/small/get_rider_offsets_and_layers(pass_index, mob/offsetter) + return list( + TEXT_NORTH = list(-1, 5), + TEXT_SOUTH = list(2, 8), + TEXT_EAST = list(0, 5), + TEXT_WEST = list(0, 5), + ) diff --git a/code/datums/components/riding/riding_vehicle.dm b/code/datums/components/riding/riding_vehicle.dm index 9043f57f9d30..91e282a14e8b 100644 --- a/code/datums/components/riding/riding_vehicle.dm +++ b/code/datums/components/riding/riding_vehicle.dm @@ -97,7 +97,10 @@ return step(movable_parent, direction) - COOLDOWN_START(src, vehicle_move_cooldown, vehicle_move_delay) + var/move_delay = vehicle_move_delay + if(NSCOMPONENT(direction) && EWCOMPONENT(direction)) + move_delay = FLOOR(move_delay * sqrt(2), world.tick_lag) + COOLDOWN_START(src, vehicle_move_cooldown, move_delay) if(QDELETED(src)) return @@ -475,3 +478,60 @@ var/obj/vehicle/ridden/wheelchair/motorized/our_chair = parent if(istype(our_chair) && our_chair.power_cell) our_chair.power_cell.use(our_chair.energy_usage / max(our_chair.power_efficiency, 1) * 0.05) + +/datum/component/riding/vehicle/golfcart + ride_check_flags = RIDER_NEEDS_ARMS | UNBUCKLE_DISABLED_RIDER + vehicle_move_delay = 1.5 + keytype = /obj/item/key/golfcart + +/datum/component/riding/vehicle/golfcart/restore_parent_layer_and_offsets() + // just don't restore anything. + // restoring layers fucks stuff to do with the rear part + return + +/datum/component/riding/vehicle/golfcart/driver_move(atom/movable/movable_parent, mob/living/user, direction) + if (!istype(parent, /obj/vehicle/ridden/golfcart)) + return ..() + var/obj/vehicle/ridden/golfcart/cart = parent + if (!cart.cell && !cart.is_hotrod()) + return COMPONENT_DRIVER_BLOCK_MOVE + if (cart.cell) + if (cart.cell.charge <= 0) + return COMPONENT_DRIVER_BLOCK_MOVE + if (get_turf(cart.child) == get_step(cart, direction)) + cart.set_movedelay_effect(2) + else + cart.set_movedelay_effect(1) + vehicle_move_delay = cart.movedelay + return ..() + +/datum/component/riding/vehicle/golfcart/handle_ride(mob/user, direction) + if (!istype(parent, /obj/vehicle/ridden/golfcart)) + return ..() + var/obj/vehicle/ridden/golfcart/cart = parent + if (cart.cell) + var/charge_to_use = min(cart.charge_per_move, cart.cell.charge) + cart.cell.use(charge_to_use) + return ..() + +/datum/component/riding/vehicle/golfcart/update_parent_layer_and_offsets(dir, animate) + . = ..() + if (istype(parent, /obj)) + var/obj/objectified = parent + objectified.update_appearance(UPDATE_ICON) + +/datum/component/riding/vehicle/golfcart/get_rider_offsets_and_layers(pass_index, mob/offsetter) + return list( + TEXT_NORTH = list(0, -16), + TEXT_SOUTH = list(0, 10), + TEXT_EAST = list(-8, 2), + TEXT_WEST = list(8, 2), + ) + +/datum/component/riding/vehicle/golfcart/get_parent_offsets_and_layers() + return list( + TEXT_NORTH = list(0, 0, ABOVE_MOB_LAYER), + TEXT_SOUTH = list(0, 0, ABOVE_MOB_LAYER), + TEXT_EAST = list(0, 0, VEHICLE_LAYER), + TEXT_WEST = list(0, 0, VEHICLE_LAYER), + ) diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm deleted file mode 100644 index e57d23ffe50b..000000000000 --- a/code/datums/components/rotation.dm +++ /dev/null @@ -1,146 +0,0 @@ -/datum/component/simple_rotation - /// Additional stuff to do after rotation - var/datum/callback/post_rotation - /// Rotation flags for special behavior - var/rotation_flags = NONE - -/** - * Adds the ability to rotate an object by Alt-click or using Right-click verbs. - * - * args: - * * rotation_flags (optional) Bitflags that determine behavior for rotation (defined at the top of this file) - * * post_rotation (optional) Callback proc that is used after the object is rotated (sound effects, balloon alerts, etc.) - **/ -/datum/component/simple_rotation/Initialize(rotation_flags = NONE, post_rotation) - if(!ismovable(parent)) - return COMPONENT_INCOMPATIBLE - - var/atom/movable/source = parent - source.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 - - src.rotation_flags = rotation_flags - src.post_rotation = post_rotation || CALLBACK(src, PROC_REF(default_post_rotation)) - -/datum/component/simple_rotation/RegisterWithParent() - RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(rotate_left)) - RegisterSignal(parent, COMSIG_CLICK_ALT_SECONDARY, PROC_REF(rotate_right)) - RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(ExamineMessage)) - RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) - return ..() - -/datum/component/simple_rotation/PostTransfer(datum/new_parent) - //Because of the callbacks which we don't track cleanly we can't transfer this - //item cleanly, better to let the new of the new item create a new rotation datum - //instead (there's no real state worth transferring) - return COMPONENT_NOTRANSFER - -/datum/component/simple_rotation/UnregisterFromParent() - UnregisterSignal(parent, list( - COMSIG_CLICK_ALT, - COMSIG_CLICK_ALT_SECONDARY, - COMSIG_ATOM_EXAMINE, - COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, - )) - return ..() - -/datum/component/simple_rotation/Destroy() - post_rotation = null - return ..() - -/datum/component/simple_rotation/proc/ExamineMessage(datum/source, mob/user, list/examine_list) - SIGNAL_HANDLER - if(rotation_flags & ROTATION_REQUIRE_WRENCH) - examine_list += span_notice("This requires a wrench to be rotated.") - -/datum/component/simple_rotation/proc/rotate_right(datum/source, mob/user) - SIGNAL_HANDLER - rotate(user, ROTATION_CLOCKWISE) - return CLICK_ACTION_SUCCESS - -/datum/component/simple_rotation/proc/rotate_left(datum/source, mob/user) - SIGNAL_HANDLER - rotate(user, ROTATION_COUNTERCLOCKWISE) - return CLICK_ACTION_SUCCESS - -/datum/component/simple_rotation/proc/rotate(mob/user, degrees) - if(QDELETED(user)) - CRASH("[src] is being rotated [user ? "with a qdeleting" : "without a"] user") - if(!istype(user)) - CRASH("[src] is being rotated without a user of the wrong type: [user.type]") - if(!isnum(degrees)) - CRASH("[src] is being rotated without providing the amount of degrees needed") - - if(!can_be_rotated(user, degrees) || !can_user_rotate(user, degrees)) - return - - var/obj/rotated_obj = parent - rotated_obj.setDir(turn(rotated_obj.dir, degrees)) - if(rotation_flags & ROTATION_REQUIRE_WRENCH) - playsound(rotated_obj, 'sound/items/tools/ratchet.ogg', 50, TRUE) - - post_rotation.Invoke(user, degrees) - -/datum/component/simple_rotation/proc/can_user_rotate(mob/user, degrees) - if(isliving(user) && user.can_perform_action(parent, NEED_DEXTERITY)) - return TRUE - if((rotation_flags & ROTATION_GHOSTS_ALLOWED) && isobserver(user) && CONFIG_GET(flag/ghost_interaction)) - return TRUE - return FALSE - -/datum/component/simple_rotation/proc/can_be_rotated(mob/user, degrees, silent=FALSE) - var/obj/rotated_obj = parent - if(!rotated_obj.Adjacent(user)) - silent = TRUE - - if(rotation_flags & ROTATION_REQUIRE_WRENCH) - if(!isliving(user)) - return FALSE - var/obj/item/tool = user.get_active_held_item() - if(!tool || tool.tool_behaviour != TOOL_WRENCH) - if(!silent) - rotated_obj.balloon_alert(user, "need a wrench!") - return FALSE - if(!(rotation_flags & ROTATION_IGNORE_ANCHORED) && rotated_obj.anchored) - if(istype(rotated_obj, /obj/structure/window) && !silent) - rotated_obj.balloon_alert(user, "need to unscrew!") - else if(!silent) - rotated_obj.balloon_alert(user, "need to unwrench!") - return FALSE - - if(rotation_flags & ROTATION_NEEDS_ROOM) - var/target_dir = turn(rotated_obj.dir, degrees) - var/obj/structure/window/rotated_window = rotated_obj - var/fulltile = istype(rotated_window) ? rotated_window.fulltile : FALSE - if(!valid_build_direction(rotated_obj.loc, target_dir, is_fulltile = fulltile)) - if(!silent) - rotated_obj.balloon_alert(user, "can't rotate in that direction!") - return FALSE - - if(rotation_flags & ROTATION_NEEDS_UNBLOCKED) - var/turf/rotate_turf = get_turf(rotated_obj) - if(rotate_turf.is_blocked_turf(source_atom = rotated_obj)) - if(!silent) - rotated_obj.balloon_alert(user, "rotation is blocked!") - return FALSE - return TRUE - -/datum/component/simple_rotation/proc/default_post_rotation(mob/user, degrees) - return - -// maybe we don't need the item context proc but instead the hand one? since we don't need to check held_item -/datum/component/simple_rotation/proc/on_requesting_context_from_item(atom/source, list/context, obj/item/held_item, mob/user) - SIGNAL_HANDLER - - var/rotation_screentip = FALSE - - if(can_be_rotated(user, ROTATION_CLOCKWISE, silent=TRUE)) - context[SCREENTIP_CONTEXT_ALT_LMB] = "Rotate left" - rotation_screentip = TRUE - if(can_be_rotated(user, ROTATION_COUNTERCLOCKWISE, silent=TRUE)) - context[SCREENTIP_CONTEXT_ALT_RMB] = "Rotate right" - rotation_screentip = TRUE - - if(rotation_screentip) - return CONTEXTUAL_SCREENTIP_SET - - return NONE diff --git a/code/datums/components/seethrough.dm b/code/datums/components/seethrough.dm index ba674f67471d..bbae5ea34b8f 100644 --- a/code/datums/components/seethrough.dm +++ b/code/datums/components/seethrough.dm @@ -1,11 +1,9 @@ ///A component that lets you turn an object invisible when you're standing on certain relative turfs to it, like behind a tree /datum/component/seethrough - ///List of lists that represent relative coordinates to the source atom - var/list/relative_turf_coords ///A list of turfs on which we make ourself transparent var/list/watched_turfs ///Associate list, with client = trickery_image. Track which client is being tricked with which image - var/list/tricked_mobs = list() + var/list/tricked_mobs ///Which alpha do we animate towards? var/target_alpha @@ -15,18 +13,18 @@ var/perimeter_reset_timer ///Does this object let clicks from players its transparent to pass through it var/clickthrough + /// Define for the area which is considered behind + var/see_through_map ///see_through_map is a define pointing to a specific map. It's basically defining the area which is considered behind. See see_through_maps.dm for a list of maps /datum/component/seethrough/Initialize(see_through_map = SEE_THROUGH_MAP_DEFAULT, target_alpha = 100, animation_time = 0.5 SECONDS, perimeter_reset_timer = 2 SECONDS, clickthrough = TRUE) . = ..() - relative_turf_coords = GLOB.see_through_maps[see_through_map] - - if(!isatom(parent) || !LAZYLEN(relative_turf_coords)) + //GLOB.see_through_maps[see_through_map is a list of lists that represent relative coordinates to the source atom + if(!isatom(parent) || !LAZYLEN(GLOB.see_through_maps[see_through_map])) return COMPONENT_INCOMPATIBLE - relative_turf_coords = GLOB.see_through_maps[see_through_map] - src.relative_turf_coords = relative_turf_coords + src.see_through_map = see_through_map src.target_alpha = target_alpha src.animation_time = animation_time src.perimeter_reset_timer = perimeter_reset_timer @@ -40,7 +38,7 @@ /datum/component/seethrough/proc/setup_perimeter(atom/parent) watched_turfs = list() - for(var/list/coordinates as anything in relative_turf_coords) + for(var/list/coordinates as anything in GLOB.see_through_maps[see_through_map]) var/turf/target = TURF_FROM_COORDS_LIST(list(parent.x + coordinates[1], parent.y + coordinates[2], parent.z + coordinates[3])) if(isnull(target)) @@ -90,7 +88,7 @@ if(mob in tricked_mobs) var/image/trickery_image = tricked_mobs[mob] animate(trickery_image, alpha = 255, time = animation_time) - tricked_mobs.Remove(mob) + LAZYREMOVE(tricked_mobs, mob) UnregisterSignal(mob, COMSIG_MOB_LOGOUT) //after playing the fade-in animation, remove the screen obj @@ -119,7 +117,7 @@ animate(user_overlay, alpha = target_alpha, time = animation_time) - tricked_mobs[fool] = user_overlay + LAZYSET(tricked_mobs, fool, user_overlay) RegisterSignal(fool, COMSIG_MOB_LOGOUT, PROC_REF(on_client_disconnect)) @@ -150,13 +148,13 @@ for(var/atom/movable/screen/plane_master/seethrough in our_hud.get_true_plane_masters(SEETHROUGH_PLANE)) seethrough.hide_plane(fool) - tricked_mobs.Cut() + LAZYNULL(tricked_mobs) ///Image is removed when they log out because client gets deleted, so drop the mob reference /datum/component/seethrough/proc/on_client_disconnect(mob/fool) SIGNAL_HANDLER - tricked_mobs.Remove(fool) + LAZYREMOVE(tricked_mobs, fool) UnregisterSignal(fool, COMSIG_MOB_LOGOUT) RegisterSignal(fool, COMSIG_MOB_LOGIN, PROC_REF(trick_mob)) var/datum/hud/our_hud = fool.hud_used diff --git a/code/datums/components/shell.dm b/code/datums/components/shell.dm index 44252c365753..4c649a68b7df 100644 --- a/code/datums/components/shell.dm +++ b/code/datums/components/shell.dm @@ -44,7 +44,7 @@ RegisterSignal(parent, COMSIG_ATOM_ATTACK_GHOST, PROC_REF(on_attack_ghost)) if(!(shell_flags & SHELL_FLAG_CIRCUIT_UNMODIFIABLE)) RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(on_multitool_act)) - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attack_by)) + RegisterSignal(parent, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(on_item_interaction)) if(!(shell_flags & SHELL_FLAG_CIRCUIT_UNREMOVABLE)) RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), PROC_REF(on_screwdriver_act)) RegisterSignal(parent, COMSIG_OBJ_DECONSTRUCT, PROC_REF(on_object_deconstruct)) @@ -91,7 +91,7 @@ /datum/component/shell/UnregisterFromParent() UnregisterSignal(parent, list( - COMSIG_ATOM_ATTACKBY, + COMSIG_ATOM_ITEM_INTERACTION, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), COMSIG_OBJ_DECONSTRUCT, @@ -160,55 +160,56 @@ attached_circuit?.set_on(source.anchored) /** - * Called when an item hits the parent. This is the method to add the circuitboard to the component. + * Called when interacting with the parent using an item. This is the method to add the circuitboard to the component. */ -/datum/component/shell/proc/on_attack_by(atom/source, obj/item/item, mob/living/attacker) +/datum/component/shell/proc/on_item_interaction(atom/source, mob/living/user, obj/item/item, list/modifiers) SIGNAL_HANDLER - if(!is_authorized(attacker)) + if(!is_authorized(user)) return if(istype(item, /obj/item/stock_parts/power_store/cell)) - source.balloon_alert(attacker, "can't put cell in directly!") + source.balloon_alert(user, "can't put cell in directly!") return if(istype(item, /obj/item/inducer)) var/obj/item/inducer/inducer = item - INVOKE_ASYNC(inducer, TYPE_PROC_REF(/obj/item, interact_with_atom), attached_circuit || parent, attacker, list()) - return COMPONENT_NO_AFTERATTACK + INVOKE_ASYNC(inducer, TYPE_PROC_REF(/obj/item, interact_with_atom), attached_circuit || parent, user, list()) + return ITEM_INTERACT_SUCCESS if(attached_circuit) if(attached_circuit.owner_id && item == attached_circuit.owner_id.resolve()) set_locked(!locked) - source.balloon_alert(attacker, "[locked ? "locked" : "unlocked"] [source]") - return COMPONENT_NO_AFTERATTACK + source.balloon_alert(user, "[locked ? "locked" : "unlocked"] [source]") + return ITEM_INTERACT_SUCCESS if(!attached_circuit.owner_id && isidcard(item)) - source.balloon_alert(attacker, "owner id set for [item]") + source.balloon_alert(user, "owner id set for [item]") attached_circuit.owner_id = WEAKREF(item) - return COMPONENT_NO_AFTERATTACK + return ITEM_INTERACT_SUCCESS if(istype(item, /obj/item/circuit_component)) - attached_circuit.add_component_manually(item, attacker) - return COMPONENT_NO_AFTERATTACK + if(attached_circuit.add_component_manually(item, user)) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING if(!istype(item, /obj/item/integrated_circuit)) return var/obj/item/integrated_circuit/logic_board = item - . = COMPONENT_NO_AFTERATTACK if(logic_board.shell) // I'll be surprised if this ever happens - return + return ITEM_INTERACT_BLOCKING if(attached_circuit) - source.balloon_alert(attacker, "there is already a circuitboard inside!") - return + source.balloon_alert(user, "there is already a circuitboard inside!") + return ITEM_INTERACT_BLOCKING if(logic_board.current_size > capacity) - source.balloon_alert(attacker, "this is too large to fit into [parent]!") - return + source.balloon_alert(user, "this is too large to fit into [parent]!") + return ITEM_INTERACT_BLOCKING - logic_board.inserter_mind = WEAKREF(attacker.mind) - attach_circuit(logic_board, attacker) + logic_board.inserter_mind = WEAKREF(user.mind) + attach_circuit(logic_board, user) + return ITEM_INTERACT_SUCCESS /// Sets whether the shell is locked or not /datum/component/shell/proc/set_locked(new_value) diff --git a/code/datums/components/shielded.dm b/code/datums/components/shielded.dm index 8be812678287..1f3269dab2d0 100644 --- a/code/datums/components/shielded.dm +++ b/code/datums/components/shielded.dm @@ -28,6 +28,8 @@ var/show_charge_as_alpha = FALSE /// The item we use for recharging var/recharge_path + /// The item can block OVERWHELMING_ATTACK, which is mostly used by mech melee attacks. + var/can_block_overwhelming = FALSE /// The cooldown tracking when we were last hit COOLDOWN_DECLARE(recently_hit_cd) @@ -36,7 +38,7 @@ /// A callback for the sparks/message that play when a charge is used, see [/datum/component/shielded/proc/default_run_hit_callback] var/datum/callback/on_hit_effects -/datum/component/shielded/Initialize(max_charges = 3, recharge_start_delay = 20 SECONDS, charge_increment_delay = 1 SECONDS, charge_recovery = 1, lose_multiple_charges = FALSE, show_charge_as_alpha = FALSE, recharge_path = null, starting_charges = null, shield_icon_file = 'icons/effects/effects.dmi', shield_icon = "shield-old", shield_inhand = FALSE, run_hit_callback) +/datum/component/shielded/Initialize(max_charges = 3, recharge_start_delay = 20 SECONDS, charge_increment_delay = 1 SECONDS, charge_recovery = 1, lose_multiple_charges = FALSE, show_charge_as_alpha = FALSE, recharge_path = null, can_block_overwhelming = FALSE, starting_charges = null, shield_icon_file = 'icons/effects/effects.dmi', shield_icon = "shield-old", shield_inhand = FALSE, run_hit_callback) if(!isitem(parent) || max_charges <= 0) return COMPONENT_INCOMPATIBLE @@ -47,6 +49,7 @@ src.lose_multiple_charges = lose_multiple_charges src.show_charge_as_alpha = show_charge_as_alpha src.recharge_path = recharge_path + src.can_block_overwhelming = can_block_overwhelming src.shield_icon_file = shield_icon_file src.shield_icon = shield_icon src.shield_inhand = shield_inhand @@ -165,6 +168,11 @@ if(current_charges <= 0) return + + // if our shield is unable to block OVERWHELMING_ATTACK type attacks, we just let it pass. + if(attack_type == OVERWHELMING_ATTACK && !can_block_overwhelming) + return + . = COMPONENT_HIT_REACTION_BLOCK var/charge_loss = 1 // how many charges do we lose @@ -175,6 +183,9 @@ else if(damage < 3) charge_loss = 0 + else if(attack_type == OVERWHELMING_ATTACK && !lose_multiple_charges) // Always expend all charges when blocking an overwhelming attack unless we're using our shield like health. + charge_loss = max_charges + adjust_charge(-charge_loss) INVOKE_ASYNC(src, PROC_REF(actually_run_hit_callback), owner, attack_text, current_charges) diff --git a/code/datums/components/shuttle_move_deferred_checks.dm b/code/datums/components/shuttle_move_deferred_checks.dm index e7268fe98c05..bc228998c6ea 100644 --- a/code/datums/components/shuttle_move_deferred_checks.dm +++ b/code/datums/components/shuttle_move_deferred_checks.dm @@ -2,13 +2,13 @@ /datum/component/shuttle_move_deferred_checks dupe_mode = COMPONENT_DUPE_SOURCES /// An list of targets to listen for the movements of - var/list/targets = list() + var/list/targets /// The check to call on the parent when a target moves. Can be the name of a proc on the parent, or a `/datum/callback`. var/check /// A list of each target currently being moved by a shuttle - if this list is not empty, checks will not be run. - var/list/moving_targets = list() + var/list/moving_targets /datum/component/shuttle_move_deferred_checks/Initialize(check) . = ..() @@ -27,7 +27,7 @@ var/atom/movable/movable = locate(source) if(!istype(movable) || (check != src.check)) return COMPONENT_INCOMPATIBLE - targets += movable + LAZYADD(targets, movable) RegisterSignal(movable, COMSIG_MOVABLE_MOVED, PROC_REF(on_target_moved)) RegisterSignal(movable, COMSIG_ATOM_BEFORE_SHUTTLE_MOVE, PROC_REF(before_target_shuttle_move)) RegisterSignal(movable, COMSIG_ATOM_AFTER_SHUTTLE_MOVE, PROC_REF(after_target_shuttle_move)) @@ -37,11 +37,9 @@ var/atom/movable/movable = locate(source) if(!istype(movable)) return - targets -= movable - moving_targets -= movable + LAZYREMOVE(targets, movable) + LAZYREMOVE(moving_targets, movable) UnregisterSignal(movable, list(COMSIG_MOVABLE_MOVED, COMSIG_ATOM_BEFORE_SHUTTLE_MOVE, COMSIG_ATOM_AFTER_SHUTTLE_MOVE, COMSIG_QDELETING)) - if(!length(moving_targets) && length(targets)) - call_check() return ..() /datum/component/shuttle_move_deferred_checks/proc/call_check() @@ -53,18 +51,18 @@ /datum/component/shuttle_move_deferred_checks/proc/on_target_moved(atom/movable/source, atom/old_loc, dir, forced, list/old_locs) SIGNAL_HANDLER - if(length(moving_targets)) + if(LAZYLEN(moving_targets)) return call_check() /datum/component/shuttle_move_deferred_checks/proc/before_target_shuttle_move(atom/source) SIGNAL_HANDLER - moving_targets |= source + LAZYOR(moving_targets, source) /datum/component/shuttle_move_deferred_checks/proc/after_target_shuttle_move(atom/source) SIGNAL_HANDLER - moving_targets -= source - if(!length(moving_targets)) + LAZYOR(moving_targets, source) + if(!LAZYLEN(moving_targets)) call_check() /datum/component/shuttle_move_deferred_checks/proc/on_target_deleted(datum/source) diff --git a/code/datums/components/sign_language.dm b/code/datums/components/sign_language.dm index 8181388b6994..08bdb50d5a7c 100644 --- a/code/datums/components/sign_language.dm +++ b/code/datums/components/sign_language.dm @@ -310,6 +310,10 @@ /// Send a visible message depending on the tone of the message that the sender is trying to convey to the world. /datum/component/sign_language/proc/emote_tone(mob/living/carbon/carbon_parent, emote_tone) + if(ishuman(carbon_parent)) + var/mob/living/carbon/human/human_parent = carbon_parent + if(human_parent.is_face_obscured()) + return // You can't see someone's expression if their face is obscured (or disfigured) switch(emote_tone) if(TONE_INQUISITIVE) carbon_parent.visible_message(span_bold("quirks [carbon_parent.p_their()] brows quizzically."), visible_message_flags = EMOTE_MESSAGE|BLOCK_SELF_HIGHLIGHT_MESSAGE) diff --git a/code/datums/components/simple_bodycam.dm b/code/datums/components/simple_bodycam.dm index 9d653f38a784..1723a7a0a5a0 100644 --- a/code/datums/components/simple_bodycam.dm +++ b/code/datums/components/simple_bodycam.dm @@ -56,7 +56,7 @@ do_update_cam() /datum/component/simple_bodycam/proc/do_update_cam() - GLOB.cameranet.updatePortableCamera(bodycam, camera_update_time) + SScameras.update_portable_camera(bodycam, camera_update_time) /datum/component/simple_bodycam/proc/rotate_cam(datum/source, old_dir, new_dir) SIGNAL_HANDLER diff --git a/code/datums/components/space_allergy.dm b/code/datums/components/space_allergy.dm index 595c5fc0dfa9..a89161cfb775 100644 --- a/code/datums/components/space_allergy.dm +++ b/code/datums/components/space_allergy.dm @@ -18,6 +18,8 @@ SIGNAL_HANDLER if(is_on_a_planet(parent) && parent.has_gravity()) - allergy = parent.apply_status_effect(/datum/status_effect/planet_allergy) //your gamer body cant stand real gravity < Soul + var/status_effect = parent.apply_status_effect(/datum/status_effect/planet_allergy) //your gamer body cant stand real gravity < Soul + if(status_effect) + allergy = status_effect else QDEL_NULL(allergy) diff --git a/code/datums/components/speechmod.dm b/code/datums/components/speechmod.dm index 45b2a6912682..e6d39faf57ca 100644 --- a/code/datums/components/speechmod.dm +++ b/code/datums/components/speechmod.dm @@ -50,10 +50,13 @@ targeted = owner.loc RegisterSignal(targeted, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equipped)) - RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_unequipped)) - RegisterSignal(parent, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_implanted)) - RegisterSignal(parent, COMSIG_ORGAN_REMOVED, PROC_REF(on_removed)) + if (isorgan(parent)) + RegisterSignal(parent, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_implanted)) + RegisterSignal(parent, COMSIG_ORGAN_REMOVED, PROC_REF(on_removed)) + else + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equipped)) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_unequipped)) + /datum/component/speechmod/proc/handle_speech(datum/source, list/speech_args) SIGNAL_HANDLER diff --git a/code/datums/components/splattercasting.dm b/code/datums/components/splattercasting.dm index cc11afbf789e..bac08cdbbecc 100644 --- a/code/datums/components/splattercasting.dm +++ b/code/datums/components/splattercasting.dm @@ -82,7 +82,7 @@ var/blood_cost = (cooldown_remaining - new_cooldown ) * COOLDOWN_TO_BLOOD_RATIO spell.StartCooldown(new_cooldown) - source.blood_volume -= blood_cost + source.adjust_blood_volume(-blood_cost) var/cost_desc diff --git a/code/datums/components/squashable.dm b/code/datums/components/squashable.dm index 785c6771ad3f..faa9d0e37fe2 100644 --- a/code/datums/components/squashable.dm +++ b/code/datums/components/squashable.dm @@ -74,7 +74,7 @@ if(squash_flags & SQUASHED_SHOULD_BE_GIBBED) target.gib(DROP_ALL_REMAINS) else - target.adjustBruteLoss(squash_damage) + target.adjust_brute_loss(squash_damage) /datum/component/squashable/UnregisterFromParent() . = ..() diff --git a/code/datums/components/storm_hating.dm b/code/datums/components/storm_hating.dm index 896c9cd471a1..62a59a0ad71a 100644 --- a/code/datums/components/storm_hating.dm +++ b/code/datums/components/storm_hating.dm @@ -19,6 +19,7 @@ . = ..() RegisterSignal(parent, COMSIG_ENTER_AREA, PROC_REF(on_area_entered)) RegisterSignal(parent, COMSIG_EXIT_AREA, PROC_REF(on_area_exited)) + RegisterSignal(parent, COMSIG_MOB_LOGIN, PROC_REF(on_login)) /datum/component/storm_hating/UnregisterFromParent() . = ..() @@ -46,3 +47,7 @@ return parent_atom.fade_into_nothing(life_time = 3 SECONDS, fade_time = 2 SECONDS) qdel(src) + +/datum/component/storm_hating/proc/on_login(datum/source) + SIGNAL_HANDLER + qdel(src) diff --git a/code/datums/components/style/style.dm b/code/datums/components/style/style.dm index 2e8fb5cd07c1..7e156603e88f 100644 --- a/code/datums/components/style/style.dm +++ b/code/datums/components/style/style.dm @@ -95,7 +95,7 @@ src.multitooled = multitooled /datum/component/style/RegisterWithParent() - RegisterSignal(parent, COMSIG_USER_ITEM_INTERACTION, PROC_REF(hotswap)) + RegisterSignal(parent, COMSIG_USER_PRE_ITEM_ATTACK, PROC_REF(hotswap)) RegisterSignal(parent, COMSIG_MOB_MINED, PROC_REF(on_mine)) RegisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_take_damage)) RegisterSignal(parent, COMSIG_MOB_EMOTED("taunt"), PROC_REF(on_taunt)) @@ -110,7 +110,7 @@ ADD_TRAIT(parent, TRAIT_MINING_PARRYING, STYLE_TRAIT) /datum/component/style/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_USER_ITEM_INTERACTION) + UnregisterSignal(parent, COMSIG_USER_PRE_ITEM_ATTACK) UnregisterSignal(parent, COMSIG_MOB_MINED) UnregisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE) UnregisterSignal(parent, COMSIG_MOB_EMOTED("taunt")) @@ -292,27 +292,28 @@ return "#364866" /// A proc that lets a user, when their rank >= `hotswap_rank`, swap items in storage with what's in their hands, simply by clicking on the stored item with a held item -/datum/component/style/proc/hotswap(mob/living/source, atom/target, obj/item/weapon, list/modifiers) +/datum/component/style/proc/hotswap(mob/living/source, obj/item/weapon, atom/target, list/modifiers) SIGNAL_HANDLER - - if((rank < hotswap_rank) || !isitem(target) || !(target in source.get_all_contents())) + if((rank < hotswap_rank) || !isitem(target) || get(target, /mob/living) != source) return NONE var/obj/item/item_target = target - if(!(item_target.item_flags & IN_STORAGE)) return NONE - var/datum/storage/atom_storage = item_target.loc.atom_storage + INVOKE_ASYNC(src, PROC_REF(hotswap_interact), source, weapon, target, modifiers) + return COMPONENT_CANCEL_ATTACK_CHAIN +/datum/component/style/proc/hotswap_interact(mob/living/source, obj/item/weapon, atom/target, list/modifiers) + var/datum/storage/atom_storage = target.loc.atom_storage if(!atom_storage.can_insert(weapon, source, messages = FALSE)) source.balloon_alert(source, "unable to hotswap!") - return NONE + return - atom_storage.attempt_insert(weapon, source, override = TRUE) - INVOKE_ASYNC(source, TYPE_PROC_REF(/mob/living, put_in_hands), target) - source.visible_message(span_notice("[source] quickly swaps [weapon] out with [target]!"), span_notice("You quickly swap [weapon] with [target].")) - return ITEM_INTERACT_BLOCKING + if (atom_storage.attempt_insert(weapon, source, override = TRUE) && source.put_in_hands(target)) + source.visible_message(span_notice("[source] quickly swaps [weapon] out with [target]!"), span_notice("You quickly swap [weapon] with [target].")) + else + source.balloon_alert(source, "unable to hotswap!") // Point givers /datum/component/style/proc/on_punch(mob/living/carbon/human/punching_person, atom/attacked_atom, proximity) diff --git a/code/datums/components/subtype_picker.dm b/code/datums/components/subtype_picker.dm index 5f8e1b471b61..46ff3f281ab5 100644 --- a/code/datums/components/subtype_picker.dm +++ b/code/datums/components/subtype_picker.dm @@ -24,6 +24,7 @@ /datum/component/subtype_picker/Destroy(force) on_picked_callback = null + subtype2descriptions = null return ..() /datum/component/subtype_picker/RegisterWithParent() @@ -69,11 +70,12 @@ return var/picked_subtype = name2subtype[name_of_type] - picked_subtype = new picked_subtype(picker.drop_location()) - on_picked_callback?.Invoke(picked_subtype, picker) + var/obj/item/picked = new picked_subtype(picker.drop_location()) + on_picked_callback?.Invoke(picked, picker) + SEND_SIGNAL(picked, COMSIG_ITEM_SUBTYPE_PICKER_SELECTED, target, picker) qdel(target) - picker.put_in_hands(picked_subtype) + picker.put_in_hands(picked) /** * Checks if we are allowed to interact with the radial menu diff --git a/code/datums/components/surgery_initiator.dm b/code/datums/components/surgery_initiator.dm deleted file mode 100644 index 56c49e4c0ec2..000000000000 --- a/code/datums/components/surgery_initiator.dm +++ /dev/null @@ -1,344 +0,0 @@ -/// Allows an item to be used to initiate surgeries. -/datum/component/surgery_initiator - /// The currently selected target that the user is proposing a surgery on - var/datum/weakref/surgery_target_ref - - /// The last user, as a weakref - var/datum/weakref/last_user_ref - -/datum/component/surgery_initiator/Initialize() - . = ..() - if(!isitem(parent)) - return COMPONENT_INCOMPATIBLE - - var/obj/item/surgery_tool = parent - surgery_tool.item_flags |= ITEM_HAS_CONTEXTUAL_SCREENTIPS - ///Make sure we can use the surgery UI while laying down - surgery_tool.interaction_flags_atom |= INTERACT_ATOM_IGNORE_MOBILITY - -/datum/component/surgery_initiator/Destroy(force) - last_user_ref = null - surgery_target_ref = null - - return ..() - -/datum/component/surgery_initiator/RegisterWithParent() - RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(initiate_surgery_moment)) - RegisterSignal(parent, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET, PROC_REF(add_item_context)) - -/datum/component/surgery_initiator/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_ITEM_ATTACK, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET) - unregister_signals() - -/datum/component/surgery_initiator/proc/unregister_signals() - var/mob/living/last_user = last_user_ref?.resolve() - if (!isnull(last_user_ref)) - UnregisterSignal(last_user, COMSIG_MOB_SELECTED_ZONE_SET) - - var/mob/living/surgery_target = surgery_target_ref?.resolve() - if (!isnull(surgery_target_ref)) - UnregisterSignal(surgery_target, COMSIG_MOB_SURGERY_STARTED) - -/// Does the surgery initiation. -/datum/component/surgery_initiator/proc/initiate_surgery_moment(datum/source, atom/target, mob/user) - SIGNAL_HANDLER - if(!isliving(target)) - return - INVOKE_ASYNC(src, PROC_REF(do_initiate_surgery_moment), target, user) - return COMPONENT_CANCEL_ATTACK_CHAIN - -/datum/component/surgery_initiator/proc/do_initiate_surgery_moment(mob/living/target, mob/user) - var/datum/surgery/current_surgery - - for(var/i_one in target.surgeries) - var/datum/surgery/surgeryloop = i_one - if(surgeryloop.location == user.zone_selected) - current_surgery = surgeryloop - break - - if (!isnull(current_surgery) && !current_surgery.step_in_progress) - attempt_cancel_surgery(current_surgery, target, user) - return - - var/list/available_surgeries = get_available_surgeries(user, target) - - if(!length(available_surgeries)) - if (target.body_position == LYING_DOWN || !(target.mobility_flags & MOBILITY_LIEDOWN)) - target.balloon_alert(user, "no surgeries available!") - else - target.balloon_alert(user, "make them lie down!") - - return - - unregister_signals() - - last_user_ref = WEAKREF(user) - surgery_target_ref = WEAKREF(target) - - RegisterSignal(user, COMSIG_MOB_SELECTED_ZONE_SET, PROC_REF(on_set_selected_zone)) - RegisterSignal(target, COMSIG_MOB_SURGERY_STARTED, PROC_REF(on_mob_surgery_started)) - - ui_interact(user) - -/datum/component/surgery_initiator/proc/get_available_surgeries(mob/user, mob/living/target) - var/list/available_surgeries = list() - - var/obj/item/bodypart/affecting = target.get_bodypart(check_zone(user.zone_selected)) - - for(var/datum/surgery/surgery as anything in GLOB.surgeries_list) - if(!surgery.possible_locs.Find(user.zone_selected)) - continue - if(!is_type_in_list(target, surgery.target_mobtypes)) - continue - if(user == target && !HAS_TRAIT(user, TRAIT_SELF_SURGERY) && !(surgery.surgery_flags & SURGERY_SELF_OPERABLE)) - continue - - if(isnull(affecting)) - if(surgery.surgery_flags & SURGERY_REQUIRE_LIMB) - continue - else - if(surgery.requires_bodypart_type && !(affecting.bodytype & surgery.requires_bodypart_type)) - continue - if(surgery.targetable_wound && !affecting.get_wound_type(surgery.targetable_wound)) - continue - if((surgery.surgery_flags & SURGERY_REQUIRES_REAL_LIMB) && (affecting.bodypart_flags & BODYPART_PSEUDOPART)) - continue - - if(IS_IN_INVALID_SURGICAL_POSITION(target, surgery)) - continue - if(!surgery.can_start(user, target)) - continue - - available_surgeries += surgery - - return available_surgeries - -/// Does the surgery de-initiation. -/datum/component/surgery_initiator/proc/attempt_cancel_surgery(datum/surgery/the_surgery, mob/living/patient, mob/user) - var/selected_zone = user.zone_selected - - if(the_surgery.status == 1) - patient.surgeries -= the_surgery - user.visible_message( - span_notice("[user] removes [parent] from [patient]'s [patient.parse_zone_with_bodypart(selected_zone)]."), - span_notice("You remove [parent] from [patient]'s [patient.parse_zone_with_bodypart(selected_zone)]."), - ) - - patient.balloon_alert(user, "stopped work on [patient.parse_zone_with_bodypart(selected_zone)]") - - qdel(the_surgery) - return - - var/required_tool_type = TOOL_CAUTERY - var/obj/item/close_tool = user.get_inactive_held_item() - var/is_robotic = the_surgery.requires_bodypart_type == BODYTYPE_ROBOTIC - if(is_robotic) - required_tool_type = TOOL_SCREWDRIVER - - if(!close_tool || close_tool.tool_behaviour != required_tool_type) - patient.balloon_alert(user, "need a [is_robotic ? "screwdriver": "cautery"] in your inactive hand to stop the surgery!") - return - - if(the_surgery.operated_bodypart) - the_surgery.operated_bodypart.adjustBleedStacks(-5) - - patient.surgeries -= the_surgery - - user.visible_message( - span_notice("[user] closes [patient]'s [patient.parse_zone_with_bodypart(selected_zone)] with [close_tool] and removes [parent]."), - span_notice("You close [patient]'s [patient.parse_zone_with_bodypart(selected_zone)] with [close_tool] and remove [parent]."), - ) - - patient.balloon_alert(user, "closed up [patient.parse_zone_with_bodypart(selected_zone)]") - - qdel(the_surgery) - -/datum/component/surgery_initiator/proc/on_mob_surgery_started(mob/source, datum/surgery/surgery, surgery_location) - SIGNAL_HANDLER - - var/mob/living/last_user = last_user_ref.resolve() - - if (surgery_location != last_user.zone_selected) - return - - if (!isnull(last_user)) - source.balloon_alert(last_user, "someone else started a surgery!") - - ui_close() - -/datum/component/surgery_initiator/proc/on_set_selected_zone(mob/source, new_zone) - ui_interact(source) - -/datum/component/surgery_initiator/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if (!ui) - ui = new(user, src, "SurgeryInitiator") - ui.open() - -/datum/component/surgery_initiator/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if (.) - return . - - var/mob/user = usr - var/mob/living/surgery_target = surgery_target_ref.resolve() - - if (isnull(surgery_target)) - return TRUE - - switch (action) - if ("change_zone") - var/zone = params["new_zone"] - if (!(zone in list( - BODY_ZONE_HEAD, - BODY_ZONE_CHEST, - BODY_ZONE_L_ARM, - BODY_ZONE_R_ARM, - BODY_ZONE_L_LEG, - BODY_ZONE_R_LEG, - BODY_ZONE_PRECISE_EYES, - BODY_ZONE_PRECISE_MOUTH, - BODY_ZONE_PRECISE_GROIN, - ))) - return TRUE - - var/atom/movable/screen/zone_sel/zone_selector = user.hud_used?.zone_select - zone_selector?.set_selected_zone(zone, user, should_log = FALSE) - - return TRUE - if ("start_surgery") - for (var/datum/surgery/surgery as anything in get_available_surgeries(user, surgery_target)) - if (surgery.name == params["surgery_name"]) - try_choose_surgery(user, surgery_target, surgery) - return TRUE - -/datum/component/surgery_initiator/ui_assets(mob/user) - return list( - get_asset_datum(/datum/asset/simple/body_zones), - ) - -/datum/component/surgery_initiator/ui_data(mob/user) - var/mob/living/surgery_target = surgery_target_ref?.resolve() - - var/list/surgeries = list() - if (!isnull(surgery_target)) - for (var/datum/surgery/surgery as anything in get_available_surgeries(user, surgery_target)) - var/list/surgery_info = list( - "name" = surgery.name, - ) - - if (surgery_needs_exposure(surgery, surgery_target)) - surgery_info["blocked"] = TRUE - - surgeries += list(surgery_info) - - return list( - "selected_zone" = user.zone_selected, - "target_name" = surgery_target?.name, - "surgeries" = surgeries, - ) - -/datum/component/surgery_initiator/ui_close(mob/user) - unregister_signals() - surgery_target_ref = null - - return ..() - -/datum/component/surgery_initiator/ui_status(mob/user, datum/ui_state/state) - var/mob/living/surgery_target = surgery_target_ref?.resolve() - if (isnull(surgery_target)) - return UI_CLOSE - - if (!can_start_surgery(user, surgery_target)) - return UI_CLOSE - - return ..() - -/datum/component/surgery_initiator/proc/can_start_surgery(mob/user, mob/living/target) - if (!user.Adjacent(target)) - return FALSE - - // The item was moved somewhere else - var/atom/movable/tool = parent - if (tool.loc != user) - return FALSE - - // While we were choosing, another surgery was started at the same location - for (var/datum/surgery/surgery in target.surgeries) - if (surgery.location == user.zone_selected) - return FALSE - - return TRUE - -/datum/component/surgery_initiator/proc/try_choose_surgery(mob/user, mob/living/target, datum/surgery/surgery) - if (!can_start_surgery(user, target)) - // This could have a more detailed message, but the UI closes when this is true anyway, so - // if it ever comes up, it'll be because of lag. - target.balloon_alert(user, "can't start the surgery!") - return - - var/selected_zone = user.zone_selected - var/obj/item/bodypart/affecting_limb = target.get_bodypart(check_zone(selected_zone)) - - if ((surgery.surgery_flags & SURGERY_REQUIRE_LIMB) && isnull(affecting_limb)) - target.balloon_alert(user, "patient has no [parse_zone(selected_zone)]!") - return - - if (!isnull(affecting_limb)) - if(surgery.requires_bodypart_type && !(affecting_limb.bodytype & surgery.requires_bodypart_type)) - target.balloon_alert(user, "not the right type of limb!") - return - if(surgery.targetable_wound && !affecting_limb.get_wound_type(surgery.targetable_wound)) - target.balloon_alert(user, "no wound to operate on!") - return - - if (IS_IN_INVALID_SURGICAL_POSITION(target, surgery)) - target.balloon_alert(user, "patient is not lying down!") - return - - if (!surgery.can_start(user, target)) - target.balloon_alert(user, "can't start the surgery!") - return - - if (surgery_needs_exposure(surgery, target)) - target.balloon_alert(user, "expose [target.p_their()] [target.parse_zone_with_bodypart(selected_zone)]!") - return - - ui_close() - - var/datum/surgery/procedure = new surgery.type(target, selected_zone, affecting_limb) - - target.balloon_alert(user, "starting \"[LOWER_TEXT(procedure.name)]\"") - - user.visible_message( - span_notice("[user] drapes [parent] over [target]'s [target.parse_zone_with_bodypart(selected_zone)] to prepare for surgery."), - span_notice("You drape [parent] over [target]'s [target.parse_zone_with_bodypart(selected_zone)] to prepare for \an [procedure.name]."), - ) - - log_combat(user, target, "operated on", null, "(OPERATION TYPE: [procedure.name]) (TARGET AREA: [selected_zone])") - -/datum/component/surgery_initiator/proc/surgery_needs_exposure(datum/surgery/surgery, mob/living/target) - var/mob/living/user = last_user_ref?.resolve() - if (isnull(user)) - return FALSE - if(surgery.surgery_flags & SURGERY_IGNORE_CLOTHES) - return FALSE - - return !get_location_accessible(target, user.zone_selected) - -/** - * Adds context sensitivy directly to the surgery initator file for screentips - * Arguments: - * * source - the surgery drapes, cloak, or bedsheet calling surgery initator - * * context - Preparing Surgery, the component has a lot of ballon alerts to deal with most contexts - * * target - the living target mob you are doing surgery on - * * user - refers to user who will see the screentip when the drapes are on a living target - */ -/datum/component/surgery_initiator/proc/add_item_context(obj/item/source, list/context, atom/target, mob/living/user,) - SIGNAL_HANDLER - - if(!isliving(target)) - return NONE - - context[SCREENTIP_CONTEXT_LMB] = "Prepare Surgery" - return CONTEXTUAL_SCREENTIP_SET diff --git a/code/datums/components/table_smash.dm b/code/datums/components/table_smash.dm deleted file mode 100644 index 017f0cff7b3c..000000000000 --- a/code/datums/components/table_smash.dm +++ /dev/null @@ -1,197 +0,0 @@ -/// Component which allows mobs to be smashed onto this surface like a wrestling move -/datum/component/table_smash - /// If true, mobs will be placed gently on the table even if they're in an aggressive grab - var/gentle_push - /// Callback invoked after a hostile table action - var/datum/callback/after_smash - -/datum/component/table_smash/Initialize(gentle_push = FALSE, after_smash = null) - . = ..() - if (!isobj(parent)) - return COMPONENT_INCOMPATIBLE - - src.gentle_push = gentle_push - src.after_smash = after_smash - -/datum/component/table_smash/RegisterWithParent() - RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_interaction)) - RegisterSignal(parent, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(on_item_interaction)) - - var/static/list/loc_connections = list( - COMSIG_LIVING_DISARM_COLLIDE = PROC_REF(on_pushed_into), - ) - AddComponent(/datum/component/connect_loc_behalf, parent, loc_connections) - -/datum/component/table_smash/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ITEM_INTERACTION)) - -/// Called when someone clicks on our surface -/datum/component/table_smash/proc/on_interaction(obj/table, mob/user) - SIGNAL_HANDLER - - if (!table.Adjacent(user) || !user.pulling) - return - - if (!isliving(user.pulling)) - if (!(user.pulling.pass_flags & PASSTABLE)) - return - - user.Move_Pulled(table) - - if (user.pulling.loc == table.loc) - user.visible_message(span_notice("[user] places [user.pulling] onto [table]."), - span_notice("You place [user.pulling] onto [table].")) - user.stop_pulling() - - return COMPONENT_CANCEL_ATTACK_CHAIN - - var/mob/living/pushed_mob = user.pulling - if (pushed_mob.buckled) - if (pushed_mob.buckled == table) - //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 COMPONENT_CANCEL_ATTACK_CHAIN - - INVOKE_ASYNC(src, PROC_REF(perform_table_smash), table, user) - return COMPONENT_CANCEL_ATTACK_CHAIN - -/// We have a mob being pressed onto the table, but how strongly? -/datum/component/table_smash/proc/perform_table_smash(obj/table, mob/living/user) - var/mob/living/pushed_mob = user.pulling - if (user.combat_mode) - switch(user.grab_state) - if (GRAB_PASSIVE) - to_chat(user, span_warning("You need a better grip to do that!")) - return - if (GRAB_AGGRESSIVE) - if (gentle_push) - tableplace(user, pushed_mob) - else - tablepush(user, pushed_mob) - if (GRAB_NECK to GRAB_KILL) - tablelimbsmash(user, pushed_mob) - else - pushed_mob.visible_message(span_notice("[user] begins to place [pushed_mob] onto [table]..."), \ - span_userdanger("[user] begins to place [pushed_mob] onto [table]...")) - if (do_after(user, 3.5 SECONDS, target = pushed_mob)) - tableplace(user, pushed_mob) - else - return - - user.stop_pulling() - -/// Called when someone clicks on our surface with an item -/datum/component/table_smash/proc/on_item_interaction(obj/table, mob/living/user, obj/item/item, modifiers) - SIGNAL_HANDLER - if (!istype(item, /obj/item/riding_offhand)) - return NONE - - var/obj/item/riding_offhand/riding_item = item - var/mob/living/carried_mob = riding_item.rider - if (carried_mob == user) //Piggyback user. - return NONE - - INVOKE_ASYNC(src, PROC_REF(riding_offhand_act), user, item) - return ITEM_INTERACT_BLOCKING - -/// Called when someone clicks on our surface using a fireman's carry -/datum/component/table_smash/proc/riding_offhand_act(mob/living/user, obj/item/riding_offhand/riding_item) - var/mob/living/carried_mob = riding_item.rider - if (user.combat_mode) - user.unbuckle_mob(carried_mob) - tablelimbsmash(user, carried_mob) - return ITEM_INTERACT_SUCCESS - - var/tableplace_delay = 3.5 SECONDS - var/skills_space = "" - if (HAS_TRAIT(user, TRAIT_QUICKER_CARRY)) - tableplace_delay = 2 SECONDS - skills_space = " expertly" - else if (HAS_TRAIT(user, TRAIT_QUICK_CARRY)) - tableplace_delay = 2.75 SECONDS - skills_space = " quickly" - - var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) - if (istype(potential_spine)) - tableplace_delay *= potential_spine.athletics_boost_multiplier - - carried_mob.visible_message(span_notice("[user] begins to[skills_space] place [carried_mob] onto [parent]..."), - span_userdanger("[user] begins to[skills_space] place [carried_mob] onto [parent]...")) - if (!do_after(user, tableplace_delay, target = carried_mob)) - return ITEM_INTERACT_BLOCKING - user.unbuckle_mob(carried_mob) - tableplace(user, carried_mob) - return ITEM_INTERACT_SUCCESS - -/// Gently place the mob onto the table -/datum/component/table_smash/proc/tableplace(mob/living/user, mob/living/pushed_mob) - var/obj/table = parent - pushed_mob.forceMove(table.loc) - pushed_mob.set_resting(TRUE, TRUE) - pushed_mob.visible_message(span_notice("[user] places [pushed_mob] onto [parent]."), \ - span_notice("[user] places [pushed_mob] onto [parent].")) - log_combat(user, pushed_mob, "places", null, "onto [parent]") - -/// Aggressively smash the mob onto the table -/datum/component/table_smash/proc/tablepush(mob/living/user, mob/living/pushed_mob) - if (HAS_TRAIT(user, TRAIT_PACIFISM)) - to_chat(user, span_danger("Throwing [pushed_mob] onto the table might hurt them!")) - return - - var/passtable_key = REF(user) - passtable_on(pushed_mob, passtable_key) - for (var/obj/obj in user.loc.contents) - if (!obj.CanAllowThrough(pushed_mob)) - return - - var/obj/table = parent - pushed_mob.Move(table.loc) - passtable_off(pushed_mob, passtable_key) - if (pushed_mob.loc != table.loc) //Something prevented the tabling - return - - pushed_mob.Knockdown(3 SECONDS) - pushed_mob.apply_damage(10, BRUTE) - pushed_mob.apply_damage(40, STAMINA) - playsound(pushed_mob, 'sound/effects/tableslam.ogg', 90, TRUE) - pushed_mob.visible_message(span_danger("[user] slams [pushed_mob] onto \the [parent]!"), \ - span_userdanger("[user] slams you onto \the [parent]!")) - log_combat(user, pushed_mob, "tabled", null, "onto [parent]") - pushed_mob.add_mood_event("table", /datum/mood_event/table) - SEND_SIGNAL(user, COMSIG_LIVING_TABLE_SLAMMING, pushed_mob, parent) - after_smash?.Invoke(pushed_mob) - -/// Even more aggressively smash a single part of a mob onto the table -/datum/component/table_smash/proc/tablelimbsmash(mob/living/user, mob/living/pushed_mob) - var/obj/table = parent - pushed_mob.Knockdown(3 SECONDS) - var/obj/item/bodypart/banged_limb = pushed_mob.get_bodypart(user.zone_selected) || pushed_mob.get_bodypart(BODY_ZONE_HEAD) - var/extra_wound = 0 - if (HAS_TRAIT(user, TRAIT_HULK)) - extra_wound = 20 - pushed_mob.apply_damage(30, BRUTE, banged_limb, wound_bonus = extra_wound) - pushed_mob.apply_damage(60, STAMINA) - playsound(pushed_mob, 'sound/effects/bang.ogg', 90, TRUE) - pushed_mob.visible_message(span_danger("[user] smashes [pushed_mob]'s [banged_limb.plaintext_zone] against \the [parent]!"), - span_userdanger("[user] smashes your [banged_limb.plaintext_zone] against \the [parent]")) - log_combat(user, pushed_mob, "head slammed", null, "against [parent]") - pushed_mob.add_mood_event("table", /datum/mood_event/table_limbsmash, banged_limb) - table.take_damage(50) - SEND_SIGNAL(user, COMSIG_LIVING_TABLE_LIMB_SLAMMING, pushed_mob, parent) - after_smash?.Invoke(pushed_mob) - -/// Called when someone is shoved into our tile -/datum/component/table_smash/proc/on_pushed_into(turf/source, mob/living/shover, mob/living/target, shove_flags, obj/item/weapon) - SIGNAL_HANDLER - if((shove_flags & SHOVE_KNOCKDOWN_BLOCKED) || !(shove_flags & SHOVE_BLOCKED)) - return - target.Knockdown(SHOVE_KNOCKDOWN_TABLE, daze_amount = 3 SECONDS) - target.visible_message(span_danger("[shover.name] shoves [target.name] onto \the [parent]!"), - span_userdanger("You're shoved onto \the [parent] by [shover.name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, shover) - to_chat(shover, span_danger("You shove [target.name] onto \the [parent]!")) - target.throw_at(parent, 1, 1, null, FALSE) //1 speed throws with no spin are basically just forcemoves with a hard collision check - log_combat(shover, target, "shoved", "onto [parent] (table)[weapon ? " with [weapon]" : ""]") - after_smash?.Invoke(target) - return COMSIG_LIVING_SHOVE_HANDLED diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index ac4a44c99799..ad8d53b123de 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -118,7 +118,7 @@ clicked_atom = get_turf_in_angle(tackle_angle, get_turf(user), min_distance) user.Knockdown(base_knockdown, ignore_canstun = TRUE) - user.adjustStaminaLoss(stamina_cost) + user.adjust_stamina_loss(stamina_cost) user.throw_at(clicked_atom, range, speed, user, FALSE) addtimer(CALLBACK(src, PROC_REF(resetTackle)), base_knockdown, TIMER_STOPPABLE) return(COMSIG_MOB_CANCEL_CLICKON) @@ -411,6 +411,13 @@ if(istype(potential_spine)) defense_mod += potential_spine.strength_bonus + if(istype(tackle_target.wear_suit, /obj/item/clothing/suit/hooded/cultrobes/eldritch/blade)) + defense_mod += 8 + if(istype(tackle_target.wear_suit, /obj/item/clothing/suit/hooded/cultrobes/eldritch/rust)) + var/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/rust_robes = tackle_target.wear_suit + if(rust_robes.rusted) + defense_mod += 10 + // OF-FENSE var/mob/living/carbon/sacker = parent var/sacker_drunkenness = sacker.get_drunk_amount() @@ -459,11 +466,11 @@ if(human_sacker.mob_mood.sanity_level == SANITY_LEVEL_INSANE) //I've gone COMPLETELY INSANE attack_mod += 15 - human_sacker.adjustStaminaLoss(100) //AHAHAHAHAHAHAHAHA + human_sacker.adjust_stamina_loss(100) //AHAHAHAHAHAHAHAHA if(HAS_TRAIT(human_sacker, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) // tackling with riot specialized armor, like riot armor, is effective but tiring attack_mod += 2 - human_sacker.adjustStaminaLoss(20) + human_sacker.adjust_stamina_loss(20) var/randomized_tackle_roll = rand(-3, 3) - defense_mod + attack_mod + skill_mod return randomized_tackle_roll @@ -615,7 +622,7 @@ embed.ignore_throwspeed_threshold = initial(embed.ignore_throwspeed_threshold) embed.impact_pain_mult = initial(embed.impact_pain_mult) windscreen_casualty.atom_destruction() - user.adjustStaminaLoss(10 * speed) + user.adjust_stamina_loss(10 * speed) user.Paralyze(3 SECONDS) user.visible_message(span_danger("[user] smacks into [windscreen_casualty] and shatters it, shredding [user.p_them()]self with glass!"), span_userdanger("You smacks into [windscreen_casualty] and shatter it, shredding yourself with glass!")) @@ -624,8 +631,8 @@ user.Paralyze(1 SECONDS) user.Knockdown(3 SECONDS) windscreen_casualty.take_damage(30 * speed) - user.adjustStaminaLoss(10 * speed, updating_stamina=FALSE) - user.adjustBruteLoss(5 * speed) + user.adjust_stamina_loss(10 * speed, updating_stamina=FALSE) + user.adjust_brute_loss(5 * speed) /datum/component/tackler/proc/delayedSmash(obj/structure/window/windscreen_casualty) if(windscreen_casualty) @@ -669,8 +676,8 @@ 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, updating_stamina = FALSE) - owner.adjustBruteLoss(8 + messes.len, updating_health = FALSE) + owner.adjust_stamina_loss(15 + messes.len * 2, updating_stamina = FALSE) + owner.adjust_brute_loss(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() diff --git a/code/datums/components/temporary_body.dm b/code/datums/components/temporary_body.dm index 3af84faaee94..deadf90e6f99 100644 --- a/code/datums/components/temporary_body.dm +++ b/code/datums/components/temporary_body.dm @@ -12,10 +12,8 @@ var/datum/weakref/old_body_ref /// Returns the mind if the parent dies by any means var/delete_on_death = FALSE - /// If the temporary body is attached to a permanent body (split personality body) then we dont ghostize and instead just simply transfer client back - var/perma_body_attached -/datum/component/temporary_body/Initialize(datum/mind/old_mind, mob/living/old_body, delete_on_death = FALSE, perma_body_attached = FALSE) +/datum/component/temporary_body/Initialize(datum/mind/old_mind, mob/living/old_body, delete_on_death = FALSE) if(!isliving(parent)) return COMPONENT_INCOMPATIBLE src.old_mind_ref = WEAKREF(old_mind) @@ -23,7 +21,6 @@ ADD_TRAIT(old_body, TRAIT_MIND_TEMPORARILY_GONE, REF(src)) src.old_body_ref = WEAKREF(old_body) src.delete_on_death = delete_on_death - src.perma_body_attached = perma_body_attached /datum/component/temporary_body/RegisterWithParent() RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(on_parent_destroy)) @@ -48,13 +45,12 @@ return var/mob/living/living_parent = parent - if(!perma_body_attached) - var/mob/dead/observer/ghost = living_parent.ghostize() - if(!ghost) - ghost = living_parent.get_ghost() - if(!ghost) - CRASH("[src] belonging to [parent] was completely unable to find a ghost to put back into a body!") - ghost.mind = old_mind + var/mob/dead/observer/ghost = living_parent.ghostize() + if(!ghost) + ghost = living_parent.get_ghost() + if(!ghost) + CRASH("[src] belonging to [parent] was completely unable to find a ghost to put back into a body!") + ghost.mind = old_mind if(old_body?.stat != DEAD) old_mind.transfer_to(old_body, force_key_move = TRUE) else diff --git a/code/datums/components/tether.dm b/code/datums/components/tether.dm index b2aedaeb9ff4..e156640682ff 100644 --- a/code/datums/components/tether.dm +++ b/code/datums/components/tether.dm @@ -286,7 +286,7 @@ /datum/component/tether/proc/process_beam_click(atom/source, atom/location, params, mob/user) var/turf/nearest_turf for (var/turf/line_turf in get_line(get_turf(parent), get_turf(tether_target))) - if (user.CanReach(line_turf)) + if (line_turf.IsReachableBy(user)) nearest_turf = line_turf break diff --git a/code/datums/components/throwbonus_on_windup.dm b/code/datums/components/throwbonus_on_windup.dm index f93109126d1b..dd12b945f29e 100644 --- a/code/datums/components/throwbonus_on_windup.dm +++ b/code/datums/components/throwbonus_on_windup.dm @@ -45,13 +45,17 @@ start_windup() /datum/component/throwbonus_on_windup/proc/start_windup() + if(!QDELETED(our_bar)) + CRASH("throwbonus_on_windup component attempted to start windup while already winding up a throw!") throwforce_bonus = initial(throwforce_bonus) var/mob/living/our_holder = holder?.resolve() if(isnull(holder)) return + if(throw_text) to_chat(our_holder, span_warning(throw_text)) + var/x_position = CEILING(our_holder.get_visual_width() * 0.5, 1) our_bar = new() our_bar.maximum_count = maximum_bonus @@ -76,9 +80,12 @@ holder = null return ..() -/datum/component/throwbonus_on_windup/proc/throw_change(datum/source, throw_mode) +/datum/component/throwbonus_on_windup/proc/throw_change(mob/living/source, throw_mode) SIGNAL_HANDLER + if (source.get_active_held_item() != parent) + return + if(throw_mode) start_windup() else diff --git a/code/datums/components/torn_wall.dm b/code/datums/components/torn_wall.dm index 9b36921a39f3..5de757e9fd81 100644 --- a/code/datums/components/torn_wall.dm +++ b/code/datums/components/torn_wall.dm @@ -13,10 +13,11 @@ dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS var/current_stage = TORN_WALL_INITIAL -/datum/component/torn_wall/Initialize() +/datum/component/torn_wall/Initialize(current_stage) . = ..() if (!isclosedturf(parent) || isindestructiblewall(parent)) return COMPONENT_INCOMPATIBLE + src.current_stage = current_stage || src.current_stage /datum/component/torn_wall/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examined)) diff --git a/code/datums/components/transforming.dm b/code/datums/components/transforming.dm index eda017372310..a82f247df630 100644 --- a/code/datums/components/transforming.dm +++ b/code/datums/components/transforming.dm @@ -114,10 +114,10 @@ /datum/component/transforming/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_SHARPEN_ACT, COMSIG_DETECTIVE_SCANNED)) -/datum/component/transforming/proc/on_scan(datum/source, mob/user, list/extra_data) +/datum/component/transforming/proc/on_scan(datum/source, mob/user, datum/detective_scanner_log/entry) SIGNAL_HANDLER - LAZYADD(extra_data[DETSCAN_CATEGORY_NOTES], "Readings suggest some form of state changing.") + entry.add_data_entry(DETSCAN_CATEGORY_NOTES, "Readings suggest some form of state changing.") /* * Called on [COMSIG_ITEM_ATTACK_SELF]. @@ -273,11 +273,11 @@ var/obj/item/item_parent = parent switch(item_parent.damtype) if(STAMINA) - user.adjustStaminaLoss(clumsy_damage) + user.adjust_stamina_loss(clumsy_damage) if(OXY) - user.adjustOxyLoss(clumsy_damage) + user.adjust_oxy_loss(clumsy_damage) if(TOX) - user.adjustToxLoss(clumsy_damage) + user.adjust_tox_loss(clumsy_damage) if(BRUTE) user.take_bodypart_damage(brute=clumsy_damage) if(BURN) diff --git a/code/datums/components/trapdoor.dm b/code/datums/components/trapdoor.dm index 28b708200159..7407e467bf0a 100644 --- a/code/datums/components/trapdoor.dm +++ b/code/datums/components/trapdoor.dm @@ -11,10 +11,13 @@ * assembly code at the bottom of this file */ /datum/component/trapdoor + can_transfer = TRUE ///assembly tied to this trapdoor var/obj/item/assembly/trapdoor/assembly ///path of the turf this should change into when the assembly is pulsed. needed for openspace trapdoors knowing what to turn back into var/trapdoor_turf_path + ///stack of baseturfs on top of the openspace under this trapdoor + var/list/trapdoor_baseturfs = list() /// is this trapdoor "conspicuous" (ie. it gets examine text and overlay added) var/conspicuous /// overlay that makes trapdoors more obvious @@ -32,8 +35,10 @@ var/autoclose = TRUE /// Delay before trapdoor shuts close var/autoclose_delay = 5 SECONDS + /// Is this trapdoor on a shuttle + var/on_shuttle = FALSE -/datum/component/trapdoor/Initialize(starts_open, trapdoor_turf_path, assembly, conspicuous = TRUE, list/carried_decals = null, autoclose = TRUE) +/datum/component/trapdoor/Initialize(starts_open, trapdoor_turf_path, trapdoor_baseturfs, assembly, conspicuous = TRUE, list/carried_decals = null, autoclose = TRUE) if(!isopenturf(parent)) return COMPONENT_INCOMPATIBLE @@ -46,29 +51,57 @@ if(!trapdoor_overlay) trapdoor_overlay = mutable_appearance('icons/turf/overlays.dmi', "border_black", ABOVE_NORMAL_TURF_LAYER) + var/turf/parent_turf = parent + if(SSshuttle.get_containing_shuttle(parent_turf)) + on_shuttle = TRUE + if(IS_OPEN(parent)) - openspace_trapdoor_setup(trapdoor_turf_path, assembly) + openspace_trapdoor_setup(trapdoor_turf_path, trapdoor_baseturfs) if(autoclose) addtimer(CALLBACK(src, PROC_REF(try_closing)), autoclose_delay) else - tile_trapdoor_setup(trapdoor_turf_path, assembly) + tile_trapdoor_setup() if(starts_open) try_opening() +/datum/component/trapdoor/PostTransfer(datum/new_parent) + if(!isopenturf(new_parent)) + if(isatom(new_parent)) + var/atom/new_parent_atom = new_parent + new_parent_atom.visible_message(span_warning("The trapdoor mechanism under [new_parent_atom] is broken!")) + return COMPONENT_NOTRANSFER + if(SSshuttle.get_containing_shuttle(new_parent)) + on_shuttle = TRUE + else + on_shuttle = FALSE + +/datum/component/trapdoor/proc/is_under_shuttle() + var/turf/parent_turf = parent + var/shuttle_skipover_depth = parent_turf.depth_to_find_baseturf(/turf/baseturf_skipover/shuttle) + return shuttle_skipover_depth && parent_turf.depth_to_find_baseturf(/turf/baseturf_skipover/trapdoor) > shuttle_skipover_depth + ///initializing as an opened trapdoor, we need to trust that we were given the data by a closed trapdoor -/datum/component/trapdoor/proc/openspace_trapdoor_setup(trapdoor_turf_path) +/datum/component/trapdoor/proc/openspace_trapdoor_setup(trapdoor_turf_path, trapdoor_baseturfs) src.trapdoor_turf_path = trapdoor_turf_path + src.trapdoor_baseturfs = trapdoor_baseturfs ///initializing as a closed trapdoor, we need to take data from the tile we're on to give it to the open state to store -/datum/component/trapdoor/proc/tile_trapdoor_setup(trapdoor_turf_path) +/datum/component/trapdoor/proc/tile_trapdoor_setup() src.trapdoor_turf_path = parent.type + insert_trapdoor_skipover() if(stored_decals.len) reapply_all_decals() if(conspicuous) var/turf/parent_turf = parent parent_turf.add_overlay(trapdoor_overlay) +/datum/component/trapdoor/proc/insert_trapdoor_skipover() + var/turf/parent_turf = parent + if(parent_turf.depth_to_find_baseturf(/turf/baseturf_skipover/trapdoor)) + return + parent_turf.insert_baseturf((parent_turf.level_to_find_baseturf(/turf/baseturf_skipover/shuttle) || 1) + 1, /turf/baseturf_skipover/trapdoor) + /datum/component/trapdoor/RegisterWithParent() . = ..() RegisterSignal(parent, COMSIG_TURF_CHANGE, PROC_REF(turf_changed_pre)) @@ -79,6 +112,8 @@ RegisterSignal(assembly, COMSIG_ASSEMBLY_PULSED, PROC_REF(toggle_trapdoor)) RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(try_unlink)) RegisterSignal(parent, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(try_link)) + RegisterSignal(parent, COMSIG_SHUTTLE_TURF_SHOULD_MOVE_SPECIAL, PROC_REF(should_move_special)) + RegisterSignal(parent, COMSIG_SHUTTLE_TURF_ON_MOVE_SPECIAL, PROC_REF(on_move_special)) /datum/component/trapdoor/UnregisterFromParent() . = ..() @@ -89,9 +124,13 @@ UnregisterSignal(parent, COMSIG_ATOM_EXAMINE) UnregisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL)) UnregisterSignal(parent, COMSIG_ATOM_ITEM_INTERACTION) + UnregisterSignal(parent, COMSIG_SHUTTLE_TURF_SHOULD_MOVE_SPECIAL) + UnregisterSignal(parent, COMSIG_SHUTTLE_TURF_ON_MOVE_SPECIAL) /datum/component/trapdoor/proc/try_unlink(turf/source, mob/user, obj/item/tool) SIGNAL_HANDLER + if(is_under_shuttle()) + return if(!assembly) return if(IS_OPEN(parent)) @@ -103,6 +142,8 @@ /datum/component/trapdoor/proc/try_link(turf/source, mob/user, obj/item/tool) SIGNAL_HANDLER + if(is_under_shuttle()) + return if(!istype(tool, /obj/item/trapdoor_remote)) return var/obj/item/trapdoor_remote/remote = tool @@ -121,6 +162,8 @@ /datum/component/trapdoor/proc/async_try_link(turf/source, mob/user, obj/item/trapdoor_remote/remote) if(!do_after(user, 2 SECONDS, target=source)) return + if(QDELETED(src)) + return if(IS_OPEN(parent)) source.balloon_alert(user, "can't link trapdoor when its open") return @@ -134,6 +177,8 @@ /datum/component/trapdoor/proc/async_try_unlink(turf/source, mob/user, obj/item/tool) if(!do_after(user, 5 SECONDS, target=source)) return + if(QDELETED(src)) + return if(IS_OPEN(parent)) source.balloon_alert(user, "can't unlink trapdoor when its open") return @@ -156,6 +201,8 @@ * changing turfs does not bring over decals, so we must perform a little bit of element reapplication. */ /datum/component/trapdoor/proc/reapply_all_decals() + if(is_under_shuttle()) + return for(var/list/element_data as anything in stored_decals) apply_decal(element_data[1], element_data[2], element_data[3], element_data[4]) stored_decals = list() @@ -187,12 +234,12 @@ try_closing() ///signal called by turf changing -/datum/component/trapdoor/proc/turf_changed_pre(datum/source, path, new_baseturfs, flags, post_change_callbacks) +/datum/component/trapdoor/proc/turf_changed_pre(datum/source, path, list/new_baseturfs, flags, post_change_callbacks) SIGNAL_HANDLER var/turf/open/dying_trapdoor = parent if((flags & CHANGETURF_TRAPDOOR_INDUCED) == 0) //not a process of the trapdoor - if(!IS_OPEN(parent) && !ispath(path, /turf/closed) && !ispath(path, /turf/open/openspace)) // allow people to place tiles on plating / change tiles without breaking the trapdoor - post_change_callbacks += CALLBACK(src, TYPE_PROC_REF(/datum/component/trapdoor, carry_over_trapdoor), path, conspicuous, assembly) + if(!IS_OPEN(parent) && !ispath(path, /turf/closed) && islist(new_baseturfs) && new_baseturfs.Find(/turf/baseturf_skipover/trapdoor)) // allow people to place tiles on plating / change tiles without breaking the trapdoor + post_change_callbacks += CALLBACK(src, TYPE_PROC_REF(/datum/component/trapdoor, carry_over_trapdoor), path, null, conspicuous, assembly) return // otherwise, break trapdoor dying_trapdoor.visible_message(span_warning("The trapdoor mechanism in [dying_trapdoor] is broken!")) @@ -201,7 +248,7 @@ stored_decals.Cut() assembly = null return - post_change_callbacks += CALLBACK(src, TYPE_PROC_REF(/datum/component/trapdoor, carry_over_trapdoor), trapdoor_turf_path, conspicuous, assembly) + post_change_callbacks += CALLBACK(src, TYPE_PROC_REF(/datum/component/trapdoor, carry_over_trapdoor), trapdoor_turf_path, trapdoor_baseturfs, conspicuous, assembly) /** * ## carry_over_trapdoor @@ -209,8 +256,8 @@ * applies the trapdoor to the new turf (created by the last trapdoor) * apparently callbacks with arguments on invoke and the callback itself have the callback args go first. interesting! */ -/datum/component/trapdoor/proc/carry_over_trapdoor(trapdoor_turf_path, conspicuous, assembly, turf/new_turf) - new_turf.AddComponent(/datum/component/trapdoor, FALSE, trapdoor_turf_path, assembly, conspicuous, stored_decals, autoclose) +/datum/component/trapdoor/proc/carry_over_trapdoor(trapdoor_turf_path, trapdoor_baseturfs, conspicuous, assembly, turf/new_turf) + new_turf.AddComponent(/datum/component/trapdoor, FALSE, trapdoor_turf_path, trapdoor_baseturfs, assembly, conspicuous, stored_decals, autoclose) /** * ## on_examine @@ -219,6 +266,8 @@ */ /datum/component/trapdoor/proc/on_examine(datum/source, mob/user, list/examine_text) SIGNAL_HANDLER + if(is_under_shuttle()) + return if(conspicuous) examine_text += "There seems to be a tiny gap around this tile with some wires that you might be able to pulse with a multitool." @@ -230,12 +279,19 @@ */ /datum/component/trapdoor/proc/try_opening() var/turf/open/trapdoor_turf = parent + var/opening_depth = trapdoor_turf.depth_to_find_baseturf(/turf/baseturf_skipover/trapdoor) + if(!opening_depth) + stack_trace("Could not find baseturf skipover for trapdoor") + return + if(is_under_shuttle()) + return ///we want to save this turf's decals as they were right before deletion, so this is the point where we begin listening if(assembly) RegisterSignal(parent, COMSIG_TURF_DECAL_DETACHED, PROC_REF(decal_detached)) playsound(trapdoor_turf, 'sound/machines/trapdoor/trapdoor_open.ogg', 50) + trapdoor_baseturfs = trapdoor_turf.get_baseturfs_to_depth(opening_depth) trapdoor_turf.visible_message(span_warning("[trapdoor_turf] swings open!")) - trapdoor_turf.ChangeTurf(/turf/open/openspace, flags = CHANGETURF_INHERIT_AIR | CHANGETURF_TRAPDOOR_INDUCED) + trapdoor_turf.ScrapeAway(opening_depth, flags = CHANGETURF_INHERIT_AIR | CHANGETURF_TRAPDOOR_INDUCED) /** * ## try_closing @@ -251,7 +307,23 @@ return playsound(trapdoor_turf, 'sound/machines/trapdoor/trapdoor_shut.ogg', 50) trapdoor_turf.visible_message(span_warning("The trapdoor mechanism in [trapdoor_turf] swings shut!")) - trapdoor_turf.ChangeTurf(trapdoor_turf_path, flags = CHANGETURF_INHERIT_AIR | CHANGETURF_TRAPDOOR_INDUCED) + var/list/new_baseturfs = list() + new_baseturfs += trapdoor_turf.baseturfs + new_baseturfs += trapdoor_turf.type + if(on_shuttle) + new_baseturfs += /turf/baseturf_skipover/shuttle + new_baseturfs += trapdoor_baseturfs + trapdoor_baseturfs = null + trapdoor_turf.ChangeTurf(trapdoor_turf_path, new_baseturfs, flags = CHANGETURF_INHERIT_AIR | CHANGETURF_TRAPDOOR_INDUCED) + +/datum/component/trapdoor/proc/should_move_special(datum/source) + SIGNAL_HANDLER + var/turf/source_turf = source + return IS_OPEN(source_turf) && !is_under_shuttle() + +/datum/component/trapdoor/proc/on_move_special(datum/source, turf/new_turf) + SIGNAL_HANDLER + new_turf.TakeComponent(src) #undef IS_OPEN @@ -305,6 +377,7 @@ icon = 'icons/obj/devices/remote.dmi' icon_state = "trapdoor_remote" COOLDOWN_DECLARE(trapdoor_cooldown) + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.5) var/trapdoor_cooldown_time = 2 SECONDS var/obj/item/assembly/trapdoor/internals @@ -402,6 +475,7 @@ desc = "A kit containing all the parts needed to build a trapdoor. Can only be used on open space." icon = 'icons/obj/weapons/improvised.dmi' icon_state = "kitsuitcase" + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2.2) var/in_use = FALSE /obj/item/trapdoor_kit/Initialize(mapload) diff --git a/code/datums/components/usb_port.dm b/code/datums/components/usb_port.dm index a6ec5ffcf784..832d9fe67a9f 100644 --- a/code/datums/components/usb_port.dm +++ b/code/datums/components/usb_port.dm @@ -29,8 +29,6 @@ if (!isatom(parent)) return COMPONENT_INCOMPATIBLE - circuit_components = list() - src.circuit_component_types = circuit_component_types src.extra_registration_callback = extra_registration_callback src.extra_unregistration_callback = extra_unregistration_callback @@ -40,7 +38,7 @@ if(length(circuit_components)) UnregisterFromParent() should_register = TRUE - QDEL_LIST(circuit_components) + QDEL_LAZYLIST(circuit_components) for(var/circuit_component in components) var/obj/item/circuit_component/component = circuit_component @@ -49,7 +47,7 @@ if(!should_register) component.register_usb_parent(parent) RegisterSignal(component, COMSIG_CIRCUIT_COMPONENT_SAVE, PROC_REF(save_component)) - circuit_components += component + LAZYADD(circuit_components, component) if(should_register) RegisterWithParent() @@ -113,7 +111,7 @@ on_atom_usb_cable_try_attach(src, cable, null) /datum/component/usb_port/Destroy() - QDEL_LIST(circuit_components) + QDEL_LAZYLIST(circuit_components) QDEL_NULL(usb_cable_beam) attached_circuit = null @@ -160,7 +158,7 @@ /datum/component/usb_port/proc/on_atom_usb_cable_try_attach(datum/source, obj/item/usb_cable/connecting_cable, mob/user) SIGNAL_HANDLER - if (!length(circuit_components)) + if (!LAZYLEN(circuit_components)) set_circuit_components(circuit_component_types) var/atom/atom_parent = parent diff --git a/code/datums/components/wall_mounted.dm b/code/datums/components/wall_mounted.dm deleted file mode 100644 index daab50eb1877..000000000000 --- a/code/datums/components/wall_mounted.dm +++ /dev/null @@ -1,102 +0,0 @@ -// 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() - ADD_TRAIT(parent, TRAIT_WALLMOUNTED, REF(src)) - 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(on_move)) - RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(on_linked_destroyed)) - -/datum/component/wall_mounted/UnregisterFromParent() - REMOVE_TRAIT(parent, TRAIT_WALLMOUNTED, REF(src)) - 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 - if (parent in view(user.client?.view || world.view, user)) - 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() - - -/** - * If we get dragged from our wall (by a singulo for instance) we should deconstruct - */ -/datum/component/wall_mounted/proc/on_move(datum/source, atom/old_loc, dir, forced, list/old_locs) - SIGNAL_HANDLER - // If we're having our lighting messed with we're likely to get dragged about - // That shouldn't lead to a decon - if(HAS_TRAIT(parent, TRAIT_LIGHTING_DEBUGGED)) - return - 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 index 70105875d8db..35c51f0c3436 100644 --- a/code/datums/components/weatherannouncer.dm +++ b/code/datums/components/weatherannouncer.dm @@ -81,7 +81,7 @@ return // No change var/atom/movable/speaker = parent var/msg = get_warning_message() - var/obj/machinery/announcement_system/aas = get_announcement_system(/datum/aas_config_entry/weather, speaker) + var/obj/machinery/announcement_system/aas = get_announcement_system(/datum/aas_config_entry/weather, speaker, list(RADIO_CHANNEL_SUPPLY)) // Active AAS will override default announcement lines if (aas) msg = aas.compile_config_message(/datum/aas_config_entry/weather, list(), !is_weather_dangerous ? 4 : warning_level + 1) @@ -188,6 +188,14 @@ "Safe" = "No risk expected from incoming weather front.", ) +/datum/aas_config_entry/weather/act_up() + . = ..() + if (.) + return + + // 10% chance to turn off weather broadcast entirely + if (prob(10)) + enabled = FALSE #undef WEATHER_ALERT_CLEAR #undef WEATHER_ALERT_INCOMING diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index f362359f3cde..720d1ff34953 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -54,28 +54,25 @@ return ..() /datum/component/wet_floor/proc/update_overlay() + var/turf/parent_turf = parent if(!should_display_overlay) if(!current_overlay) return - var/turf/parent_turf = parent parent_turf.cut_overlay(current_overlay) current_overlay = null return var/intended - if(!isfloorturf(parent)) - intended = generic_turf_overlay - else - switch(highest_strength) - if(TURF_WET_PERMAFROST) - intended = permafrost_overlay - if(TURF_WET_ICE) - intended = ice_overlay - else - intended = water_overlay + switch(highest_strength) + if(TURF_WET_PERMAFROST) + intended = permafrost_overlay + if(TURF_WET_ICE) + // Should really get someone to make a generic_ice_overlay. + intended = parent_turf.tiled_turf ? ice_overlay : generic_turf_overlay + else + intended = parent_turf.tiled_turf ? water_overlay : generic_turf_overlay if(current_overlay != intended) - var/turf/parent_turf = parent parent_turf.cut_overlay(current_overlay) parent_turf.add_overlay(intended) current_overlay = intended diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 509153de002c..39c0f9ab284c 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -87,9 +87,13 @@ /** * Parent types. - * - * Use path Ex:(abstract_type = /obj/item). Generally for abstract code objects, atoms with a set abstract_type can never be selected by spawner. - * These should be things that should never show up in a round, this does not include things that require init behavoir to function. + * + * Abstract-ness is a meta-property of a class that is used to indicate + * that the class is intended to be used as a base class for others, and + * should not (or cannot) be instantiated. + * We have no such language concept in DM, and so we provide a datum member + * that can be used to hint at abstractness for circumstances where we would + * like that to be the case, such as base behavior providers. */ var/abstract_type = /datum @@ -338,7 +342,7 @@ var/list/filter_info = filter_data[index] if (filter_info["name"] != name) continue - filter_data -= filter_info + filter_data -= list(filter_info) filter_cache -= filter_cache[index] break @@ -488,6 +492,12 @@ var/atom/atom_cast = src // filters only work with images or atoms. return atom_cast.filters[name] +/// Returns filter data associated with the passed key +/datum/proc/get_filter_data(name) + for (var/list/filter_info as anything in filter_data) + if (filter_info["name"] == name) + return filter_info.Copy() + /// Removes the passed filter, or multiple filters, if supplied with a list. /datum/proc/remove_filter(name_or_names, update = TRUE) ASSERT(isatom(src) || isimage(src)) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 5efa1554bafb..5fc4928990b2 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -543,6 +543,9 @@ /datum/disease/advance/proc/totalTransmittable() return properties["transmittable"] +/datum/disease/advance/proc/totalSeverity() + return properties["severity"] + /** * If the disease has an incubation time (such as event diseases) start the timer, let properties determine if there's no timer set. */ diff --git a/code/datums/diseases/advance/symptoms/bleeding.dm b/code/datums/diseases/advance/symptoms/bleeding.dm new file mode 100644 index 000000000000..2964c01cefe0 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/bleeding.dm @@ -0,0 +1,68 @@ +/*Anticoagulant + * Increases stealth + * No change to resistance + * Reduces to stage speed + * Reduces transmissibility + * Fatal Level + * Bonus: Worsens blood loss +*/ + +/datum/symptom/bleeding + name = "Anticoagulant" + desc = "The virus prevents the body from clotting blood. Unnoticable unless the host is bleeding." + stealth = 1 + resistance = 0 + stage_speed = -2 + transmittable = -2 + severity = 3 + level = 7 + threshold_descs = list( + "Stage Speed 9" = "The host becomes more vulnerable to bleeding wounds.", + "Stealth 3" = "The symptom remains hidden even while active." + ) + var/easybleed = FALSE + var/hidden = FALSE + +/datum/symptom/bleeding/Start(datum/disease/advance/A) + . = ..() + if(!.) + return + if(A.totalStageSpeed() >= 9) + easybleed = TRUE + if(A.totalStealth() >= 3) + hidden = TRUE + +/datum/symptom/bleeding/Activate(datum/disease/advance/A) + . = ..() + if(!.) + return + var/mob/living/carbon/carbon_host = A.affected_mob + for(var/datum/wound/possible_bleeding_wound as anything in carbon_host.all_wounds) + if(possible_bleeding_wound.blood_flow && !hidden) + if(4 > A.stage >= 2) + to_chat(carbon_host, span_warning("Your bleeding wounds start to itch.")) + if(A.stage >= 4) + to_chat(carbon_host, span_warning("Your bleeding wounds itch like crazy as more blood leaves your body.")) + return + +/datum/symptom/bleeding/on_stage_change(datum/disease/advance/A) + . = ..() + if(!.) + return + var/mob/living/carbon/carbon_host = A.affected_mob + if(A.stage >= 4) + ADD_TRAIT(carbon_host, TRAIT_BLOOD_FOUNTAIN, DISEASE_TRAIT) + if(easybleed) + ADD_TRAIT(carbon_host, TRAIT_EASYBLEED, DISEASE_TRAIT) + return + REMOVE_TRAIT(carbon_host, TRAIT_BLOOD_FOUNTAIN, DISEASE_TRAIT) + REMOVE_TRAIT(carbon_host, TRAIT_EASYBLEED, DISEASE_TRAIT) + + +/datum/symptom/bleeding/End(datum/disease/advance/A) + . = ..() + if(!.) + return + var/mob/living/carbon/carbon_host = A.affected_mob + REMOVE_TRAIT(carbon_host, TRAIT_BLOOD_FOUNTAIN, DISEASE_TRAIT) + REMOVE_TRAIT(carbon_host, TRAIT_EASYBLEED, DISEASE_TRAIT) diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index 6ae9fe42b6e3..68ad1720d9f7 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -60,11 +60,11 @@ infected_mob.emote("gasp") /datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A) - M.adjustOxyLoss(rand(6,13)) + M.adjust_oxy_loss(rand(6,13)) return 1 /datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A) - M.adjustOxyLoss(rand(10,18)) + M.adjust_oxy_loss(rand(10,18)) return 1 /* @@ -128,25 +128,25 @@ Bonus to_chat(M, span_userdanger("[pick("Your lungs hurt!", "It hurts to breathe!")]")) Asphyxiate(M, A) M.emote("gasp") - if(M.getOxyLoss() >= (M.maxHealth / (200/120))) + if(M.get_oxy_loss() >= (M.maxHealth / (200/120))) M.visible_message(span_warning("[M] stops breathing, as if their lungs have totally collapsed!")) Asphyxiate_death(M, A) return /datum/symptom/asphyxiation/proc/Asphyxiate_stage_3_4(mob/living/M, datum/disease/advance/A) var/get_damage = rand(10,15) * power - M.adjustOxyLoss(get_damage) + M.adjust_oxy_loss(get_damage) return 1 /datum/symptom/asphyxiation/proc/Asphyxiate(mob/living/M, datum/disease/advance/A) var/get_damage = rand(15,21) * power - M.adjustOxyLoss(get_damage) + M.adjust_oxy_loss(get_damage) if(paralysis) M.reagents.add_reagent_list(list(/datum/reagent/toxin/pancuronium = 3, /datum/reagent/toxin/sodium_thiopental = 3)) return 1 /datum/symptom/asphyxiation/proc/Asphyxiate_death(mob/living/M, datum/disease/advance/A) var/get_damage = rand(25,35) * power - M.adjustOxyLoss(get_damage) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, get_damage/2) + M.adjust_oxy_loss(get_damage) + M.adjust_organ_loss(ORGAN_SLOT_BRAIN, get_damage/2) return 1 diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index 159eccfbd1cc..1d54a2b78882 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -57,6 +57,6 @@ to_chat(infected_mob, span_userdanger("You can't think straight!")) 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.adjust_organ_loss(ORGAN_SLOT_BRAIN, 3 * power, 80) infected_mob.updatehealth() return diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index bf096a9fb4ad..fa26dfbd7087 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -45,7 +45,6 @@ return var/mob/living/carbon/infected_mob = advanced_disease.affected_mob - var/obj/item/organ/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS) switch(advanced_disease.stage) if(3, 4) @@ -53,15 +52,18 @@ to_chat(infected_mob, span_warning("[pick("You hear a ringing in your ear.", "Your ears pop.")]")) if(5) if(causes_permanent_deafness) - if(ears.damage < ears.maxHealth) + if(!HAS_TRAIT_FROM(infected_mob, TRAIT_DEAF, DISEASE_TRAIT)) to_chat(infected_mob, span_userdanger("Your ears pop painfully and start bleeding!")) // Just absolutely murder me man - ears.apply_organ_damage(ears.maxHealth) + infected_mob.adjust_organ_loss(ORGAN_SLOT_EARS, INFINITY) infected_mob.emote("scream") ADD_TRAIT(infected_mob, TRAIT_DEAF, DISEASE_TRAIT) else to_chat(infected_mob, span_userdanger("Your ears pop and begin ringing loudly!")) - ears.deaf = min(20, ears.deaf + 15) + var/obj/item/organ/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS) + var/deafness_to_add = min(40 SECONDS - ears.temporary_deafness, 30 SECONDS) + if(deafness_to_add > 0) + ears.adjust_temporary_deafness(deafness_to_add) /datum/symptom/deafness/on_stage_change(datum/disease/advance/advanced_disease) . = ..() diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index 005a651b7f33..df282fb82aea 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -54,7 +54,7 @@ Bonus var/get_damage = rand(15,25) * power M.take_overall_damage(brute = get_damage, required_bodytype = BODYTYPE_ORGANIC) if(pain) - M.adjustStaminaLoss(get_damage * 2) + M.adjust_stamina_loss(get_damage * 2) if(bleed) if(ishuman(M)) var/mob/living/carbon/human/H = M diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/advance/symptoms/headache.dm index f6e2be2aba0d..b11a461c3adc 100644 --- a/code/datums/diseases/advance/symptoms/headache.dm +++ b/code/datums/diseases/advance/symptoms/headache.dm @@ -50,7 +50,7 @@ to_chat(M, span_warning("[pick("Your head hurts.", "Your head pounds.")]")) if(power >= 2 && A.stage >= 4) to_chat(M, span_warning("[pick("Your head hurts a lot.", "Your head pounds incessantly.")]")) - M.adjustStaminaLoss(25) + M.adjust_stamina_loss(25) if(power >= 3 && A.stage >= 5) to_chat(M, span_userdanger("[pick("Your head hurts!", "You feel a burning knife inside your brain!", "A wave of pain fills your head!")]")) M.Stun(35) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 2b31a2091a4b..154642529983 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -10,30 +10,36 @@ symptom_delay_min = 1 symptom_delay_max = 1 var/passive_message = "" //random message to infected but not actively healing people + var/healable_bodytypes = BODYTYPE_ORGANIC // What types of body parts we can heal -/datum/symptom/heal/Activate(datum/disease/advance/A) +/datum/symptom/heal/Activate(datum/disease/advance/our_disease) . = ..() if(!.) return - var/mob/living/M = A.affected_mob - switch(A.stage) + healable_bodytypes = BODYTYPE_ORGANIC + if(our_disease.infectable_biotypes & MOB_ROBOTIC) + healable_bodytypes |= BODYTYPE_ROBOTIC // Inorganic biology lets us heal more bodytypes + if(our_disease.infectable_biotypes & MOB_MINERAL) + healable_bodytypes |= BODYTYPE_GOLEM + var/mob/living/living_host = our_disease.affected_mob + switch(our_disease.stage) if(4, 5) - var/effectiveness = CanHeal(A) + var/effectiveness = CanHeal(our_disease) if(!effectiveness) - if(passive_message && prob(2) && passive_message_condition(M)) - to_chat(M, passive_message) + if(passive_message && prob(2) && passive_message_condition(living_host)) + to_chat(living_host, passive_message) return else - Heal(M, A, effectiveness) + Heal(living_host, our_disease, effectiveness) return -/datum/symptom/heal/proc/CanHeal(datum/disease/advance/A) +/datum/symptom/heal/proc/CanHeal(datum/disease/advance/our_disease) return power -/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A, actual_power) +/datum/symptom/heal/proc/Heal(mob/living/living_host, datum/disease/advance/our_disease, actual_power) return TRUE -/datum/symptom/heal/proc/passive_message_condition(mob/living/M) +/datum/symptom/heal/proc/passive_message_condition(mob/living/living_host) return TRUE /*Starlight Condensation @@ -64,13 +70,13 @@ #define STARLIGHT_CANNOT_HEAL 0 #define STARLIGHT_MAX_RANGE 2 -/datum/symptom/heal/starlight/Start(datum/disease/advance/A) +/datum/symptom/heal/starlight/Start(datum/disease/advance/our_disease) . = ..() if(!.) return - if(A.totalTransmittable() >= 6) + if(our_disease.totalTransmittable() >= 6) nearspace_penalty = 1 - if(A.totalStageSpeed() >= 6) + if(our_disease.totalStageSpeed() >= 6) power = 2 /datum/symptom/heal/starlight/proc/CanTileHealDirectional(turf/turf_to_check, direction) @@ -132,15 +138,15 @@ else return current_heal_level -/datum/symptom/heal/starlight/CanHeal(datum/disease/advance/A) - var/mob/living/affected_mob = A.affected_mob - var/turf/turf_of_mob = get_turf(affected_mob) +/datum/symptom/heal/starlight/CanHeal(datum/disease/advance/our_disease) + var/mob/living/living_host = our_disease.affected_mob + var/turf/turf_of_mob = get_turf(living_host) switch(CanTileHeal(turf_of_mob, FALSE)) if(STARLIGHT_CAN_HEAL_WITH_PENALTY) return power * nearspace_penalty if(STARLIGHT_CAN_HEAL) return power - for(var/turf/turf_to_check in view(affected_mob, STARLIGHT_MAX_RANGE)) + for(var/turf/turf_to_check in view(living_host, STARLIGHT_MAX_RANGE)) if(CanTileHeal(turf_to_check, TRUE)) return power * nearspace_penalty @@ -149,25 +155,19 @@ #undef STARLIGHT_CANNOT_HEAL #undef STARLIGHT_MAX_RANGE -/datum/symptom/heal/starlight/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) +/datum/symptom/heal/starlight/Heal(mob/living/carbon/carbon_host, datum/disease/advance/our_disease, actual_power) var/heal_amt = actual_power - if(M.getToxLoss() && prob(5)) - to_chat(M, span_notice("Your skin tingles as the starlight seems to heal you.")) - - M.adjustToxLoss(-(4 * heal_amt)) //most effective on toxins - - var/list/parts = M.get_damaged_bodyparts(1,1, BODYTYPE_ORGANIC) - - if(!parts.len) - return - - 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 + if(carbon_host.get_tox_loss() && prob(5)) + to_chat(carbon_host, span_notice("Your skin tingles as the starlight seems to heal you.")) + var/needs_update = FALSE + needs_update += carbon_host.adjust_tox_loss(-4 * heal_amt, updating_health = FALSE, required_biotype = healable_bodytypes) // Most effective on toxins + needs_update += carbon_host.heal_overall_damage(heal_amt, heal_amt, required_bodytype = healable_bodytypes, updating_health = FALSE) + if(needs_update) + carbon_host.updatehealth() + return TRUE -/datum/symptom/heal/starlight/passive_message_condition(mob/living/M) - if(M.getBruteLoss() || M.getFireLoss() || M.getToxLoss()) +/datum/symptom/heal/starlight/passive_message_condition(mob/living/living_host) + if(living_host.get_brute_loss() || living_host.get_fire_loss() || living_host.get_tox_loss()) return TRUE return FALSE @@ -193,23 +193,23 @@ ) var/food_conversion = FALSE -/datum/symptom/heal/chem/Start(datum/disease/advance/A) +/datum/symptom/heal/chem/Start(datum/disease/advance/our_disease) . = ..() if(!.) return - if(A.totalStageSpeed() >= 6) + if(our_disease.totalStageSpeed() >= 6) food_conversion = TRUE - if(A.totalResistance() >= 7) + if(our_disease.totalResistance() >= 7) power = 2 -/datum/symptom/heal/chem/Heal(mob/living/M, datum/disease/advance/A, actual_power) - for(var/datum/reagent/R in M.reagents.reagent_list) //Not just toxins! - M.reagents.remove_reagent(R.type, actual_power) +/datum/symptom/heal/chem/Heal(mob/living/living_host, datum/disease/advance/our_disease, actual_power) + for(var/datum/reagent/each_reagent in living_host.reagents.reagent_list) //Not just toxins! + var/food = living_host.reagents.remove_reagent(each_reagent.type, actual_power) if(food_conversion) - M.adjust_nutrition(0.3) + living_host.adjust_nutrition(0.3 * food) if(prob(2)) - to_chat(M, span_notice("You feel a mild warmth as your blood purifies itself.")) - return 1 + to_chat(living_host, span_notice("You feel a mild warmth as your blood purifies itself.")) + return TRUE /*Metabolic Boost @@ -237,23 +237,23 @@ var/triple_metabolism = FALSE var/reduced_hunger = FALSE -/datum/symptom/heal/metabolism/Start(datum/disease/advance/A) +/datum/symptom/heal/metabolism/Start(datum/disease/advance/our_disease) . = ..() if(!.) return - if(A.totalStageSpeed() >= 10) + if(our_disease.totalStageSpeed() >= 10) triple_metabolism = TRUE - if(A.totalStealth() >= 3) + if(our_disease.totalStealth() >= 3) reduced_hunger = TRUE -/datum/symptom/heal/metabolism/Heal(mob/living/carbon/infected_mob, datum/disease/advance/A, actual_power) +/datum/symptom/heal/metabolism/Heal(mob/living/carbon/carbon_host, datum/disease/advance/our_disease, actual_power) var/metabolic_boost = triple_metabolism ? 2 : 1 - 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) + carbon_host.reagents.metabolize(carbon_host, metabolic_boost * SSMOBS_DT, 0, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself + carbon_host.overeatduration = max(carbon_host.overeatduration - 4 SECONDS, 0) var/lost_nutrition = 9 - (reduced_hunger * 5) - infected_mob.adjust_nutrition(-lost_nutrition * HUNGER_FACTOR) //Hunger depletes at 10x the normal speed + carbon_host.adjust_nutrition(-lost_nutrition * HUNGER_FACTOR) //Hunger depletes at 10x the normal speed if(prob(2)) - to_chat(infected_mob, span_notice("You feel an odd gurgle in your stomach, as if it was working much faster than normal.")) + to_chat(carbon_host, span_notice("You feel an odd gurgle in your stomach, as if it was working much faster than normal.")) return TRUE /*Nocturnal Regeneration @@ -276,40 +276,31 @@ "Stage Speed 8" = "Doubles healing speed.", ) -/datum/symptom/heal/darkness/Start(datum/disease/advance/A) +/datum/symptom/heal/darkness/Start(datum/disease/advance/our_disease) . = ..() if(!.) return - if(A.totalStageSpeed() >= 8) + if(our_disease.totalStageSpeed() >= 8) power = 2 -/datum/symptom/heal/darkness/CanHeal(datum/disease/advance/A) - var/mob/living/M = A.affected_mob +/datum/symptom/heal/darkness/CanHeal(datum/disease/advance/our_disease) + var/mob/living/living_host = our_disease.affected_mob var/light_amount = 0 - if(isturf(M.loc)) //else, there's considered to be no light - var/turf/T = M.loc - light_amount = min(1,T.get_lumcount()) - 0.5 + if(isturf(living_host.loc)) //else, there's considered to be no light + var/turf/host_turf = living_host.loc + light_amount = min(1,host_turf.get_lumcount()) - 0.5 if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) return power -/datum/symptom/heal/darkness/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) +/datum/symptom/heal/darkness/Heal(mob/living/carbon/carbon_host, datum/disease/advance/our_disease, actual_power) var/heal_amt = 2 * actual_power - - var/list/parts = M.get_damaged_bodyparts(1,1,BODYTYPE_ORGANIC) - - if(!parts.len) - return - + carbon_host.heal_overall_damage(heal_amt, heal_amt * 0.5, required_bodytype = healable_bodytypes) if(prob(5)) - to_chat(M, span_notice("The darkness soothes and mends your wounds.")) - - 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 + to_chat(carbon_host, span_notice("The darkness soothes and mends your wounds.")) + return TRUE -/datum/symptom/heal/darkness/passive_message_condition(mob/living/M) - if(M.getBruteLoss() || M.getFireLoss()) +/datum/symptom/heal/darkness/passive_message_condition(mob/living/living_host) + if(living_host.get_brute_loss() || living_host.get_fire_loss()) return TRUE return FALSE @@ -338,84 +329,74 @@ "Stage Speed 7" = "Increases healing speed.", ) -/datum/symptom/heal/coma/Start(datum/disease/advance/A) +/datum/symptom/heal/coma/Start(datum/disease/advance/our_disease) . = ..() if(!.) return - if(A.totalStageSpeed() >= 7) + if(our_disease.totalStageSpeed() >= 7) power = 1.5 - if(A.totalResistance() >= 4) + if(our_disease.totalResistance() >= 4) stabilize = TRUE - if(A.totalStealth() >= 2) + if(our_disease.totalStealth() >= 2) deathgasp = TRUE -/datum/symptom/heal/coma/on_stage_change(datum/disease/advance/A) //mostly copy+pasted from the code for self-respiration's TRAIT_NOBREATH stuff +/datum/symptom/heal/coma/on_stage_change(datum/disease/advance/our_disease) //mostly copy+pasted from the code for self-respiration's TRAIT_NOBREATH stuff . = ..() if(!.) return FALSE - if(A.stage >= 4 && stabilize) - ADD_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT) + if(our_disease.stage >= 4 && stabilize) + ADD_TRAIT(our_disease.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT) else - REMOVE_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT) + REMOVE_TRAIT(our_disease.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT) return TRUE -/datum/symptom/heal/coma/End(datum/disease/advance/A) +/datum/symptom/heal/coma/End(datum/disease/advance/our_disease) . = ..() if(!.) return if(active_coma) uncoma() - REMOVE_TRAIT(A.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT) + REMOVE_TRAIT(our_disease.affected_mob, TRAIT_NOCRITDAMAGE, DISEASE_TRAIT) -/datum/symptom/heal/coma/CanHeal(datum/disease/advance/A) - var/mob/living/M = A.affected_mob - if(HAS_TRAIT(M, TRAIT_DEATHCOMA)) +/datum/symptom/heal/coma/CanHeal(datum/disease/advance/our_disease) + var/mob/living/living_host = our_disease.affected_mob + if(HAS_TRAIT(living_host, TRAIT_DEATHCOMA)) return power - if(M.IsSleeping()) + if(living_host.IsSleeping()) return power * 0.25 //Voluntary unconsciousness yields lower healing. - switch(M.stat) + switch(living_host.stat) if(UNCONSCIOUS, HARD_CRIT) return power * 0.9 if(SOFT_CRIT) return power * 0.5 - if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma && !(HAS_TRAIT(M,TRAIT_NOSOFTCRIT))) - to_chat(M, span_warning("You feel yourself slip into a regenerative coma...")) + if(living_host.get_brute_loss() + living_host.get_fire_loss() >= living_host.maxHealth * 0.7 && !active_coma && !(HAS_TRAIT(living_host, TRAIT_NOSOFTCRIT))) + to_chat(living_host, span_warning("You feel yourself slip into a regenerative coma...")) active_coma = TRUE - addtimer(CALLBACK(src, PROC_REF(coma), M), 6 SECONDS) + addtimer(CALLBACK(src, PROC_REF(coma), living_host), 6 SECONDS) -/datum/symptom/heal/coma/proc/coma(mob/living/M) - if(QDELETED(M) || M.stat == DEAD) +/datum/symptom/heal/coma/proc/coma(mob/living/living_host) + if(QDELETED(living_host) || living_host.stat == DEAD || HAS_TRAIT(living_host, TRAIT_NOSOFTCRIT)) return - M.fakedeath("regenerative_coma", !deathgasp) - addtimer(CALLBACK(src, PROC_REF(uncoma), M), 30 SECONDS) + living_host.fakedeath("regenerative_coma", !deathgasp) + addtimer(CALLBACK(src, PROC_REF(uncoma), living_host), 30 SECONDS) -/datum/symptom/heal/coma/proc/uncoma(mob/living/M) - if(QDELETED(M) || !active_coma) +/datum/symptom/heal/coma/proc/uncoma(mob/living/living_host) + if(QDELETED(living_host) || !active_coma) return active_coma = FALSE - M.cure_fakedeath("regenerative_coma") + living_host.cure_fakedeath("regenerative_coma") -/datum/symptom/heal/coma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) +/datum/symptom/heal/coma/Heal(mob/living/carbon/carbon_host, datum/disease/advance/our_disease, actual_power) var/heal_amt = 4 * actual_power - - var/list/parts = M.get_damaged_bodyparts(1,1) - - if(!parts.len) - return - - 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) - uncoma(M) - + carbon_host.heal_overall_damage(heal_amt, heal_amt, required_bodytype = healable_bodytypes) + if(active_coma && carbon_host.get_brute_loss() + carbon_host.get_fire_loss() == 0) + uncoma(carbon_host) return 1 -/datum/symptom/heal/coma/passive_message_condition(mob/living/M) - if((M.getBruteLoss() + M.getFireLoss()) > 30) +/datum/symptom/heal/coma/passive_message_condition(mob/living/living_host) + if((living_host.get_brute_loss() + living_host.get_fire_loss()) > living_host.maxHealth * 0.3) return TRUE return FALSE @@ -435,48 +416,37 @@ ) var/absorption_coeff = 1 -/datum/symptom/heal/water/Start(datum/disease/advance/A) +/datum/symptom/heal/water/Start(datum/disease/advance/our_disease) . = ..() if(!.) return - if(A.totalStageSpeed() >= 7) + if(our_disease.totalStageSpeed() >= 7) power = 2 - if(A.totalResistance() >= 5) + if(our_disease.totalResistance() >= 5) absorption_coeff = 0.25 -/datum/symptom/heal/water/CanHeal(datum/disease/advance/advanced_disease) +/datum/symptom/heal/water/CanHeal(datum/disease/advance/our_disease) . = 0 - var/mob/living/carbon/infected_mob = advanced_disease.affected_mob + var/mob/living/carbon/carbon_host = our_disease.affected_mob - if(infected_mob.fire_stacks < 0) - infected_mob.adjust_fire_stacks(min(absorption_coeff, -infected_mob.fire_stacks)) + if(carbon_host.fire_stacks < 0) + carbon_host.adjust_fire_stacks(min(absorption_coeff, -carbon_host.fire_stacks)) . += power - 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) + if(carbon_host.reagents.has_reagent(/datum/reagent/water/holywater, needs_metabolizing = FALSE)) + carbon_host.reagents.remove_reagent(/datum/reagent/water/holywater, 0.5 * absorption_coeff) . += power * 0.75 - 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) + else if(carbon_host.reagents.has_reagent(/datum/reagent/water, needs_metabolizing = FALSE)) + carbon_host.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) +/datum/symptom/heal/water/Heal(mob/living/carbon/carbon_host, datum/disease/advance/our_disease, actual_power) var/heal_amt = 2 * actual_power + if(carbon_host.heal_overall_damage(heal_amt * 0.5, heal_amt, required_bodytype = healable_bodytypes) && prob(5)) + to_chat(carbon_host, span_notice("You feel yourself absorbing the water around you to soothe your damaged skin.")) + return TRUE - var/list/parts = M.get_damaged_bodyparts(1,1, BODYTYPE_ORGANIC) //more effective on burns - - if(!parts.len) - return - - 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/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/carbon/infected_mob) - if(infected_mob.getBruteLoss() || infected_mob.getFireLoss()) +/datum/symptom/heal/water/passive_message_condition(mob/living/carbon/carbon_host) + if(carbon_host.get_brute_loss() || carbon_host.get_fire_loss()) return TRUE return FALSE @@ -510,37 +480,37 @@ ) var/temp_rate = 1 -/datum/symptom/heal/plasma/Start(datum/disease/advance/A) +/datum/symptom/heal/plasma/Start(datum/disease/advance/our_disease) . = ..() if(!.) return - if(A.totalStageSpeed() >= 7) + if(our_disease.totalStageSpeed() >= 7) power = 2 - if(A.totalTransmittable() >= 6) + if(our_disease.totalTransmittable() >= 6) temp_rate = 4 // We do this to prevent liver damage from injecting plasma when plasma fixation virus reaches stage 4 and beyond -/datum/symptom/heal/plasma/on_stage_change(datum/disease/advance/advanced_disease) +/datum/symptom/heal/plasma/on_stage_change(datum/disease/advance/our_disease) . = ..() if(!.) return FALSE - if(advanced_disease.stage >= 4) - ADD_TRAIT(advanced_disease.affected_mob, TRAIT_PLASMA_LOVER_METABOLISM, DISEASE_TRAIT) + if(our_disease.stage >= 4) + ADD_TRAIT(our_disease.affected_mob, TRAIT_PLASMA_LOVER_METABOLISM, DISEASE_TRAIT) else - REMOVE_TRAIT(advanced_disease.affected_mob, TRAIT_PLASMA_LOVER_METABOLISM, DISEASE_TRAIT) + REMOVE_TRAIT(our_disease.affected_mob, TRAIT_PLASMA_LOVER_METABOLISM, DISEASE_TRAIT) return TRUE -/datum/symptom/heal/plasma/End(datum/disease/advance/advanced_disease) +/datum/symptom/heal/plasma/End(datum/disease/advance/our_disease) . = ..() if(!.) return - REMOVE_TRAIT(advanced_disease.affected_mob, TRAIT_PLASMA_LOVER_METABOLISM, DISEASE_TRAIT) + REMOVE_TRAIT(our_disease.affected_mob, TRAIT_PLASMA_LOVER_METABOLISM, DISEASE_TRAIT) // 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/carbon/infected_mob = advanced_disease.affected_mob +/datum/symptom/heal/plasma/CanHeal(datum/disease/advance/our_disease) + var/mob/living/carbon/carbon_host = our_disease.affected_mob var/datum/gas_mixture/environment var/list/gases @@ -550,7 +520,7 @@ /// 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. - var/obj/item/tank/internals/internals_tank = infected_mob.internal + var/obj/item/tank/internals/internals_tank = carbon_host.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 @@ -558,44 +528,39 @@ // 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(carbon_host.loc) + environment = carbon_host.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(infected_mob.reagents.has_reagent(/datum/reagent/toxin/plasma, needs_metabolizing = TRUE)) + if(carbon_host.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) +/datum/symptom/heal/plasma/Heal(mob/living/carbon/carbon_host, datum/disease/advance/our_disease, actual_power) var/heal_amt = BASE_HEAL_PLASMA_FIXATION * actual_power if(prob(5)) - to_chat(M, span_notice("You feel yourself absorbing plasma inside and around you...")) - - var/target_temp = M.get_body_temp_normal() - if(M.bodytemperature > target_temp) - M.adjust_bodytemperature(-20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT, target_temp) - if(prob(5)) - to_chat(M, span_notice("You feel less hot.")) - else if(M.bodytemperature < (M.get_body_temp_normal() + 1)) - M.adjust_bodytemperature(20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT, 0, target_temp) - if(prob(5)) - to_chat(M, span_notice("You feel warmer.")) - - M.adjustToxLoss(-heal_amt) - - var/list/parts = M.get_damaged_bodyparts(1,1, BODYTYPE_ORGANIC) - if(!parts.len) - return + to_chat(carbon_host, span_notice("You feel yourself absorbing plasma inside and around you...")) + + var/difference = carbon_host.get_body_temp_normal() - carbon_host.bodytemperature if(prob(5)) - to_chat(M, span_notice("The pain from your wounds fades rapidly.")) - 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 + if(difference > -1) // Yes, it's supposed to be -1 and not 0. Probably so you keep getting passive messages even at normal temperature. + to_chat(carbon_host, span_notice("You feel warmer.")) + if(difference < 0) + to_chat(carbon_host, span_notice("You feel less hot.")) + carbon_host.adjust_bodytemperature(clamp(difference, -20 * temp_rate, 20 * temp_rate)) + var/needs_update = FALSE + needs_update += carbon_host.adjust_tox_loss(-heal_amt, updating_health = FALSE, required_biotype = healable_bodytypes) + var/brute_burn_heal = carbon_host.heal_overall_damage(heal_amt, heal_amt, required_bodytype = healable_bodytypes, updating_health = FALSE) + needs_update += brute_burn_heal + if(brute_burn_heal && prob(5)) + to_chat(carbon_host, span_notice("The pain from your wounds fades rapidly.")) + if(needs_update) + carbon_host.updatehealth() + return TRUE ///Plasma End #undef HEALING_PER_MOL @@ -617,38 +582,28 @@ symptom_delay_max = 1 passive_message = span_notice("Your skin glows faintly for a moment.") threshold_descs = list( - "Transmission 6" = "Additionally heals cellular damage.", "Resistance 7" = "Increases healing speed.", ) -/datum/symptom/heal/radiation/Start(datum/disease/advance/A) +/datum/symptom/heal/radiation/Start(datum/disease/advance/our_disease) . = ..() if(!.) return - if(A.totalResistance() >= 7) + if(our_disease.totalResistance() >= 7) power = 2 -/datum/symptom/heal/radiation/CanHeal(datum/disease/advance/A) - return HAS_TRAIT(A.affected_mob, TRAIT_IRRADIATED) ? power : 0 +/datum/symptom/heal/radiation/CanHeal(datum/disease/advance/our_disease) + return HAS_TRAIT(our_disease.affected_mob, TRAIT_IRRADIATED) ? power : 0 -/datum/symptom/heal/radiation/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) +/datum/symptom/heal/radiation/Heal(mob/living/carbon/carbon_host, datum/disease/advance/our_disease, actual_power) var/heal_amt = actual_power - - if(M.adjustToxLoss(-(2 * heal_amt), updating_health = FALSE)) - M.updatehealth() - - var/list/parts = M.get_damaged_bodyparts(1,1, BODYTYPE_ORGANIC) - - if(!parts.len) - return - - if(prob(4)) - to_chat(M, span_notice("Your skin glows faintly, and you feel your wounds mending themselves.")) - - 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 + var/needs_update = FALSE + needs_update += carbon_host.adjust_tox_loss(-2 * heal_amt, updating_health = FALSE) + var/brute_burn_heal = carbon_host.heal_overall_damage(heal_amt, heal_amt, required_bodytype = healable_bodytypes, updating_health = FALSE) + needs_update += brute_burn_heal + if(brute_burn_heal && prob(4)) + to_chat(carbon_host, span_notice("Your skin glows faintly, and you feel your wounds mending themselves.")) + return TRUE /datum/symptom/heal/radiation/can_generate_randomly() - return ..() && !HAS_TRAIT(SSstation, STATION_TRAIT_RADIOACTIVE_NEBULA) //because people can never really suffer enough + return ..() && !HAS_TRAIT(SSstation, STATION_TRAIT_RADIOACTIVE_NEBULA) // Because people can never really suffer enough diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm index 79f0646a5c4b..3478114bc6b3 100644 --- a/code/datums/diseases/advance/symptoms/oxygen.dm +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -39,11 +39,11 @@ switch(advanced_disease.stage) if(4, 5) infected_mob.losebreath = max(0, infected_mob.losebreath - 4) - infected_mob.adjustOxyLoss(-7) + infected_mob.adjust_oxy_loss(-7) if(prob(base_message_chance)) to_chat(infected_mob, span_notice("You realize you haven't been breathing.")) - if(regenerate_blood && infected_mob.blood_volume < BLOOD_VOLUME_NORMAL) - infected_mob.blood_volume += 1 + if(regenerate_blood) + infected_mob.adjust_blood_volume(1, maximum = BLOOD_VOLUME_NORMAL) else if(prob(base_message_chance)) to_chat(infected_mob, span_notice("Your lungs feel great.")) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 2848ec484b3c..894b6ffcfec4 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -64,7 +64,7 @@ M.adjust_hallucinations(-20 SECONDS) if(A.stage >= 5) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3) + M.adjust_organ_loss(ORGAN_SLOT_BRAIN, -3) if(trauma_heal_mild && iscarbon(M)) var/mob/living/carbon/C = M if(prob(10)) @@ -96,7 +96,8 @@ if(4, 5) if(advanced_disease.has_required_infectious_organ(infected_mob, ORGAN_SLOT_EARS)) var/obj/item/organ/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS) - ears.adjustEarDamage(-4, -4) + ears?.apply_organ_damage(-4) + ears?.adjust_temporary_deafness(-8 SECONDS) if(!advanced_disease.has_required_infectious_organ(infected_mob, ORGAN_SLOT_EYES)) return diff --git a/code/datums/diseases/advance/symptoms/thermoregulation.dm b/code/datums/diseases/advance/symptoms/thermoregulation.dm new file mode 100644 index 000000000000..7ab1ae6f7f91 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/thermoregulation.dm @@ -0,0 +1,39 @@ +/** Thermoregulation + * No change to stealth. + * Increases resistance. + * Reduces stage speed. + * Reduces transmissibility + * Bonus: Regulates body temperature. + */ + +/datum/symptom/thermoregulation + name = "Thermoregulation" + desc = "The virus reacts to extreme conditions and assists the body in regulating its temperature." + stealth = 0 + resistance = 1 + stage_speed = -2 + transmittable = -1 + level = 5 + severity = 0 + threshold_descs = list( + "Resistance 8" = "Increases thermal regulation speed." + ) + +/datum/symptom/thermoregulation/Start(datum/disease/advance/A) + . = ..() + if(!.) + return + if(A.totalResistance() >= 8) + power = 1.75 + +/datum/symptom/thermoregulation/Activate(datum/disease/advance/A) + . = ..() + if(!.) + return + if(A.stage >= 3) + var/mob/living/carbon/carbon_host = A.affected_mob + var/difference = carbon_host.dna.species.bodytemp_normal - carbon_host.bodytemperature + if(!(carbon_host.dna.species.bodytemp_cold_damage_limit < carbon_host.bodytemperature < carbon_host.dna.species.bodytemp_heat_damage_limit)) // No need to spam chat + to_chat(carbon_host, span_notice("You feel a [difference < 0 ? "warmth" : "chill"] spread through your body.")) + var/stage_power = (A.stage == 3) ? power * 5 : power * 10 // Half as strong at stage 3 + carbon_host.adjust_bodytemperature(clamp(difference, -stage_power, stage_power)) diff --git a/code/datums/diseases/anaphylaxis.dm b/code/datums/diseases/anaphylaxis.dm index 12d408ad2159..fb105b4b0dea 100644 --- a/code/datums/diseases/anaphylaxis.dm +++ b/code/datums/diseases/anaphylaxis.dm @@ -54,8 +54,8 @@ if(affected_mob.num_legs >= 1 && SPT_PROB(5, seconds_per_tick)) to_chat(affected_mob, span_warning("You feel your leg[affected_mob.num_hands == 1 ? "":"s"] shake violently.")) affected_mob.adjust_jitter_up_to(8 SECONDS * seconds_per_tick, 1 MINUTES) - if(prob(40) && affected_mob.getStaminaLoss() < 75) - affected_mob.adjustStaminaLoss(15) + if(prob(40) && affected_mob.get_stamina_loss() < 75) + affected_mob.adjust_stamina_loss(15) if(affected_mob.get_organ_slot(ORGAN_SLOT_EYES) && SPT_PROB(4, seconds_per_tick)) affected_mob.adjust_eye_blur(4 SECONDS * seconds_per_tick) to_chat(affected_mob, span_warning("It's getting harder to see clearly.")) diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm index f2ef68b4e499..faf0445cbcb5 100644 --- a/code/datums/diseases/beesease.dm +++ b/code/datums/diseases/beesease.dm @@ -28,7 +28,7 @@ if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_danger("Your stomach stings painfully.")) if(prob(20)) - affected_mob.adjustToxLoss(2) + affected_mob.adjust_tox_loss(2) if(4) if(SPT_PROB(5, seconds_per_tick)) affected_mob.visible_message(span_danger("[affected_mob] buzzes."), \ diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index 4f8571765aa9..615d3c949212 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -27,14 +27,14 @@ if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_danger("You don't feel like yourself.")) if(SPT_PROB(2.5, seconds_per_tick)) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 170) + affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 1, 170) if(3) if(SPT_PROB(1, seconds_per_tick)) affected_mob.emote("stare") if(SPT_PROB(1, seconds_per_tick)) affected_mob.emote("drool") if(SPT_PROB(5, seconds_per_tick)) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 170) + affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 2, 170) if(prob(2)) to_chat(affected_mob, span_danger("Your try to remember something important...but can't.")) @@ -44,7 +44,7 @@ if(SPT_PROB(1, seconds_per_tick)) affected_mob.emote("drool") if(SPT_PROB(7.5, seconds_per_tick)) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 170) + affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 3, 170) if(prob(2)) to_chat(affected_mob, span_danger("Strange buzzing fills your head, removing all thoughts.")) if(SPT_PROB(1.5, seconds_per_tick)) diff --git a/code/datums/diseases/chronic_illness.dm b/code/datums/diseases/chronic_illness.dm index 9fc6c32eda11..6152e8945585 100644 --- a/code/datums/diseases/chronic_illness.dm +++ b/code/datums/diseases/chronic_illness.dm @@ -39,12 +39,12 @@ 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.")]")) - need_mob_update += affected_mob.adjustStaminaLoss(70, updating_stamina = FALSE) + need_mob_update += affected_mob.adjust_stamina_loss(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/items/weapons/flash_ring.ogg')) if(SPT_PROB(0.5, seconds_per_tick)) - need_mob_update += affected_mob.adjustBruteLoss(1, updating_health = FALSE) + need_mob_update += affected_mob.adjust_brute_loss(1, updating_health = FALSE) if(need_mob_update) affected_mob.updatehealth() if(4) @@ -56,7 +56,7 @@ if(prob(75)) affected_mob.vomit(VOMIT_CATEGORY_BLOOD, lost_nutrition = 45) if(SPT_PROB(1, seconds_per_tick)) - need_mob_update += affected_mob.adjustStaminaLoss(100, updating_stamina = FALSE) + need_mob_update += affected_mob.adjust_stamina_loss(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!")) @@ -64,7 +64,7 @@ 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") - need_mob_update += affected_mob.adjustBruteLoss(10, updating_health = FALSE) + need_mob_update += affected_mob.adjust_brute_loss(10, updating_health = FALSE) if(need_mob_update) affected_mob.updatehealth() if(5) @@ -74,7 +74,7 @@ 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) + affected_mob.adjust_stamina_loss(100, forced = TRUE) playsound(affected_mob.loc, 'sound/effects/magic/repulse.ogg', 100, FALSE) affected_mob.emote("scream") for(var/mob/living/viewers in viewers(3, affected_mob.loc)) diff --git a/code/datums/diseases/death_sandwich_poisoning.dm b/code/datums/diseases/death_sandwich_poisoning.dm index f865f4fb5be6..6fad7e445aee 100644 --- a/code/datums/diseases/death_sandwich_poisoning.dm +++ b/code/datums/diseases/death_sandwich_poisoning.dm @@ -28,7 +28,7 @@ if(SPT_PROB(0.5, seconds_per_tick)) affected_mob.emote("gag") if(SPT_PROB(0.5, seconds_per_tick)) - affected_mob.adjustToxLoss(5) + affected_mob.adjust_tox_loss(5) if(2) if(SPT_PROB(5, seconds_per_tick)) affected_mob.emote("cough") @@ -39,7 +39,7 @@ if(prob(20)) affected_mob.take_bodypart_damage(burn = 1) if(SPT_PROB(3, seconds_per_tick)) - affected_mob.adjustToxLoss(10) + affected_mob.adjust_tox_loss(10) if(3) if(SPT_PROB(5, seconds_per_tick)) @@ -53,7 +53,7 @@ if(prob(60)) affected_mob.take_bodypart_damage(burn = 2) if(SPT_PROB(6, seconds_per_tick)) - affected_mob.adjustToxLoss(15) + affected_mob.adjust_tox_loss(15) if(SPT_PROB(1.5, seconds_per_tick)) to_chat(affected_mob, span_danger("You try to scream, but nothing comes out!")) affected_mob.set_silence_if_lower(5 SECONDS) diff --git a/code/datums/diseases/decloning.dm b/code/datums/diseases/decloning.dm index 4e13341dab6f..8d0d5ece4670 100644 --- a/code/datums/diseases/decloning.dm +++ b/code/datums/diseases/decloning.dm @@ -49,7 +49,7 @@ 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.adjust_organ_loss(ORGAN_SLOT_BRAIN, 1, 170) if(SPT_PROB(7.5, seconds_per_tick)) affected_mob.adjust_stutter(6 SECONDS) if(5) @@ -61,4 +61,4 @@ to_chat(affected_mob, span_danger("Your skin starts degrading!")) if(SPT_PROB(5, seconds_per_tick)) affected_mob.apply_status_effect(/datum/status_effect/decloning) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 170) + affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 2, 170) diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index 77f1b1a3cd25..168c7f3a2f2e 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -50,7 +50,7 @@ if(SPT_PROB(0.5, seconds_per_tick)) to_chat(affected_mob, span_danger("Your stomach hurts.")) if(prob(20)) - affected_mob.adjustToxLoss(2, FALSE) + affected_mob.adjust_tox_loss(2, FALSE) if(4) if(!transformed && !carrier) //Save original dna for when the disease is cured. diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index 9412d2a2a2f6..4fa00e060979 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -30,7 +30,7 @@ if(SPT_PROB(0.5, seconds_per_tick)) to_chat(affected_mob, span_danger("Your stomach hurts.")) if(prob(20)) - affected_mob.adjustToxLoss(1, FALSE) + affected_mob.adjust_tox_loss(1, FALSE) if(affected_mob.body_position == LYING_DOWN && SPT_PROB(10, seconds_per_tick)) to_chat(affected_mob, span_notice("You feel better.")) stage-- @@ -48,7 +48,7 @@ if(SPT_PROB(0.5, seconds_per_tick)) to_chat(affected_mob, span_danger("Your stomach hurts.")) if(prob(20)) - affected_mob.adjustToxLoss(1, FALSE) + affected_mob.adjust_tox_loss(1, FALSE) if(affected_mob.body_position == LYING_DOWN && SPT_PROB(7.5, seconds_per_tick)) to_chat(affected_mob, span_notice("You feel better.")) stage-- diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm index ee38d36b1f75..554aa62e242f 100644 --- a/code/datums/diseases/rhumba_beat.dm +++ b/code/datums/diseases/rhumba_beat.dm @@ -19,7 +19,7 @@ switch(stage) if(2) if(SPT_PROB(26, seconds_per_tick)) - affected_mob.adjustFireLoss(5) + affected_mob.adjust_fire_loss(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/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index 4b01ef804af2..f54df123c1bc 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -35,11 +35,11 @@ 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!")) - need_mob_update += affected_mob.adjustOxyLoss(5, updating_health = FALSE) + need_mob_update += affected_mob.adjust_oxy_loss(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.")) - need_mob_update += affected_mob.adjustOxyLoss(25, updating_health = FALSE) + need_mob_update += affected_mob.adjust_oxy_loss(25, updating_health = FALSE) affected_mob.emote("gasp") if(need_mob_update) affected_mob.updatehealth() @@ -47,9 +47,9 @@ 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.")]")) - need_mob_update += affected_mob.adjustStaminaLoss(70, updating_stamina = FALSE) + need_mob_update += affected_mob.adjust_stamina_loss(70, updating_stamina = FALSE) if(SPT_PROB(5, seconds_per_tick)) - need_mob_update += affected_mob.adjustStaminaLoss(100, updating_stamina = FALSE) + need_mob_update += affected_mob.adjust_stamina_loss(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(10 SECONDS) if(SPT_PROB(1, seconds_per_tick)) @@ -62,7 +62,11 @@ affected_mob.overeatduration = max(affected_mob.overeatduration - (200 SECONDS), 0) affected_mob.adjust_nutrition(-100) 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...")]")) + if(ishuman(affected_mob)) + var/mob/living/carbon/human/human_victim = affected_mob + to_chat(human_victim, span_danger("[human_victim.w_uniform? pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit...", "You feel like taking off some clothes...") : "You feel uncomfortably hot..."]")) + else + to_chat(affected_mob, span_danger("You feel uncomfortably hot...")) affected_mob.adjust_bodytemperature(40) if(need_mob_update) affected_mob.updatehealth() diff --git a/code/datums/dna/blocks/dna_features_block.dm b/code/datums/dna/blocks/dna_features_block.dm index ce66061e8dee..adda8a1b0b71 100644 --- a/code/datums/dna/blocks/dna_features_block.dm +++ b/code/datums/dna/blocks/dna_features_block.dm @@ -18,134 +18,71 @@ /datum/dna_block/feature/ethereal_color/apply_to_mob(mob/living/carbon/human/target, dna_hash) target.dna.features[feature_key] = sanitize_hexcolor(get_block(dna_hash)) -/datum/dna_block/feature/ears +/// Features tied to a sprite accessory +/datum/dna_block/feature/accessory + abstract_type = /datum/dna_block/feature/accessory + +/datum/dna_block/feature/accessory/create_unique_block(mob/living/carbon/human/target) + var/block_value = SSaccessories.feature_list[feature_key].Find(target.dna.features[feature_key]) + var/max_value = length(SSaccessories.feature_list[feature_key]) + return construct_block(block_value, max_value) + +/datum/dna_block/feature/accessory/apply_to_mob(mob/living/carbon/human/target, dna_hash) + var/block_value = get_block(dna_hash) + var/max_value = length(SSaccessories.feature_list[feature_key]) + var/deconstructed = deconstruct_block(block_value, max_value) + target.dna.features[feature_key] = SSaccessories.feature_list[feature_key][deconstructed] + +/datum/dna_block/feature/accessory/ears feature_key = FEATURE_EARS -/datum/dna_block/feature/ears/create_unique_block(mob/living/carbon/human/target) - return construct_block(SSaccessories.ears_list.Find(target.dna.features[feature_key]), length(SSaccessories.ears_list)) - -/datum/dna_block/feature/ears/apply_to_mob(mob/living/carbon/human/target, dna_hash) - target.dna.features[feature_key] = SSaccessories.ears_list[deconstruct_block(get_block(dna_hash), length(SSaccessories.ears_list))] - // One day, someone should consider merging all tails into one, this is stupid // No I don't care that it will "Create situations where a felinid grows a lizard tail" that makes it more fun -/datum/dna_block/feature/tail - feature_key = FEATURE_TAIL - -/datum/dna_block/feature/tail/create_unique_block(mob/living/carbon/human/target) - return construct_block(SSaccessories.tails_list_felinid.Find(target.dna.features[feature_key]), length(SSaccessories.tails_list_felinid)) - -/datum/dna_block/feature/tail/apply_to_mob(mob/living/carbon/human/target, dna_hash) - target.dna.features[feature_key] = SSaccessories.tails_list_felinid[deconstruct_block(get_block(dna_hash), length(SSaccessories.tails_list_felinid))] +/datum/dna_block/feature/accessory/tail + feature_key = FEATURE_TAIL_CAT -/datum/dna_block/feature/tail_lizard +/datum/dna_block/feature/accessory/tail_lizard feature_key = FEATURE_TAIL_LIZARD -/datum/dna_block/feature/tail_lizard/create_unique_block(mob/living/carbon/human/target) - return construct_block(SSaccessories.tails_list_lizard.Find(target.dna.features[feature_key]), length(SSaccessories.tails_list_lizard)) - -/datum/dna_block/feature/tail_lizard/apply_to_mob(mob/living/carbon/human/target, dna_hash) - target.dna.features[feature_key] = SSaccessories.tails_list_lizard[deconstruct_block(get_block(dna_hash), length(SSaccessories.tails_list_lizard))] - -/datum/dna_block/feature/tail_fish +/datum/dna_block/feature/accessory/tail_fish feature_key = FEATURE_TAIL_FISH -/datum/dna_block/feature/tail_fish/create_unique_block(mob/living/carbon/human/target) - return construct_block(SSaccessories.tails_list_fish.Find(target.dna.features[feature_key]), length(SSaccessories.tails_list_fish)) - -/datum/dna_block/feature/tail_fish/apply_to_mob(mob/living/carbon/human/target, dna_hash) - target.dna.features[feature_key] = SSaccessories.tails_list_fish[deconstruct_block(get_block(dna_hash), length(SSaccessories.tails_list_fish))] - -/datum/dna_block/feature/snout +/datum/dna_block/feature/accessory/snout feature_key = FEATURE_SNOUT -/datum/dna_block/feature/snout/create_unique_block(mob/living/carbon/human/target) - return construct_block(SSaccessories.snouts_list.Find(target.dna.features[feature_key]), length(SSaccessories.snouts_list)) - -/datum/dna_block/feature/snout/apply_to_mob(mob/living/carbon/human/target, dna_hash) - target.dna.features[feature_key] = SSaccessories.snouts_list[deconstruct_block(get_block(dna_hash), length(SSaccessories.snouts_list))] - -/datum/dna_block/feature/lizard_marking +/datum/dna_block/feature/accessory/lizard_marking feature_key = FEATURE_LIZARD_MARKINGS -/datum/dna_block/feature/lizard_marking/create_unique_block(mob/living/carbon/human/target) - return construct_block(SSaccessories.lizard_markings_list.Find(target.dna.features[feature_key]), length(SSaccessories.lizard_markings_list)) - -/datum/dna_block/feature/lizard_marking/apply_to_mob(mob/living/carbon/human/target, dna_hash) - target.dna.features[feature_key] = SSaccessories.lizard_markings_list[deconstruct_block(get_block(dna_hash), length(SSaccessories.lizard_markings_list))] - -/datum/dna_block/feature/horn +/datum/dna_block/feature/accessory/horn feature_key = FEATURE_HORNS -/datum/dna_block/feature/horn/create_unique_block(mob/living/carbon/human/target) - return construct_block(SSaccessories.horns_list.Find(target.dna.features[feature_key]), length(SSaccessories.horns_list)) - -/datum/dna_block/feature/horn/apply_to_mob(mob/living/carbon/human/target, dna_hash) - target.dna.features[feature_key] = SSaccessories.horns_list[deconstruct_block(get_block(dna_hash), length(SSaccessories.horns_list))] - -/datum/dna_block/feature/frill +/datum/dna_block/feature/accessory/frill feature_key = FEATURE_FRILLS -/datum/dna_block/feature/frill/create_unique_block(mob/living/carbon/human/target) - return construct_block(SSaccessories.frills_list.Find(target.dna.features[feature_key]), length(SSaccessories.frills_list)) - -/datum/dna_block/feature/frill/apply_to_mob(mob/living/carbon/human/target, dna_hash) - target.dna.features[feature_key] = SSaccessories.frills_list[deconstruct_block(get_block(dna_hash), length(SSaccessories.frills_list))] - -/datum/dna_block/feature/spine +/datum/dna_block/feature/accessory/spine feature_key = FEATURE_SPINES -/datum/dna_block/feature/spine/create_unique_block(mob/living/carbon/human/target) - return construct_block(SSaccessories.spines_list.Find(target.dna.features[feature_key]), length(SSaccessories.spines_list)) - -/datum/dna_block/feature/spine/apply_to_mob(mob/living/carbon/human/target, dna_hash) - target.dna.features[feature_key] = SSaccessories.spines_list[deconstruct_block(get_block(dna_hash), length(SSaccessories.spines_list))] - -/datum/dna_block/feature/moth_wing +/datum/dna_block/feature/accessory/moth_wing feature_key = FEATURE_MOTH_WINGS -/datum/dna_block/feature/moth_wing/create_unique_block(mob/living/carbon/human/target) +/datum/dna_block/feature/accessory/moth_wing/create_unique_block(mob/living/carbon/human/target) if(target.dna.features[feature_key] == "Burnt Off") // Why is this snowflake check a thing. Please find a way to fix this later return random_string(block_length, GLOB.hex_characters) - return construct_block(SSaccessories.moth_wings_list.Find(target.dna.features[feature_key]), length(SSaccessories.moth_wings_list)) - -/datum/dna_block/feature/moth_wing/apply_to_mob(mob/living/carbon/human/target, dna_hash) - target.dna.features[feature_key] = SSaccessories.moth_wings_list[deconstruct_block(get_block(dna_hash), length(SSaccessories.moth_wings_list))] + return ..() -/datum/dna_block/feature/moth_antenna +/datum/dna_block/feature/accessory/moth_antenna feature_key = FEATURE_MOTH_ANTENNAE -/datum/dna_block/feature/moth_antenna/create_unique_block(mob/living/carbon/human/target) +/datum/dna_block/feature/accessory/moth_antenna/create_unique_block(mob/living/carbon/human/target) if(target.dna.features[feature_key] == "Burnt Off") return random_string(block_length, GLOB.hex_characters) - return construct_block(SSaccessories.moth_antennae_list.Find(target.dna.features[feature_key]), length(SSaccessories.moth_antennae_list)) - -/datum/dna_block/feature/moth_antenna/apply_to_mob(mob/living/carbon/human/target, dna_hash) - target.dna.features[feature_key] = SSaccessories.moth_antennae_list[deconstruct_block(get_block(dna_hash), length(SSaccessories.moth_antennae_list))] + return ..() -/datum/dna_block/feature/moth_marking +/datum/dna_block/feature/accessory/moth_marking feature_key = FEATURE_MOTH_MARKINGS -/datum/dna_block/feature/moth_marking/create_unique_block(mob/living/carbon/human/target) - return construct_block(SSaccessories.moth_markings_list.Find(target.dna.features[feature_key]), length(SSaccessories.moth_markings_list)) - -/datum/dna_block/feature/moth_marking/apply_to_mob(mob/living/carbon/human/target, dna_hash) - target.dna.features[feature_key] = SSaccessories.moth_markings_list[deconstruct_block(get_block(dna_hash), length(SSaccessories.moth_markings_list))] - -/datum/dna_block/feature/mush_cap +/datum/dna_block/feature/accessory/mush_cap feature_key = FEATURE_MUSH_CAP -/datum/dna_block/feature/mush_cap/create_unique_block(mob/living/carbon/human/target) - return construct_block(SSaccessories.caps_list.Find(target.dna.features[feature_key]), length(SSaccessories.caps_list)) - -/datum/dna_block/feature/mush_cap/apply_to_mob(mob/living/carbon/human/target, dna_hash) - target.dna.features[feature_key] = SSaccessories.caps_list[deconstruct_block(get_block(dna_hash), length(SSaccessories.caps_list))] - -/datum/dna_block/feature/pod_hair +/datum/dna_block/feature/accessory/pod_hair feature_key = FEATURE_POD_HAIR - -/datum/dna_block/feature/pod_hair/create_unique_block(mob/living/carbon/human/target) - return construct_block(SSaccessories.pod_hair_list.Find(target.dna.features[feature_key]), length(SSaccessories.pod_hair_list)) - -/datum/dna_block/feature/pod_hair/apply_to_mob(mob/living/carbon/human/target, dna_hash) - target.dna.features[feature_key] = SSaccessories.pod_hair_list[deconstruct_block(get_block(dna_hash), length(SSaccessories.pod_hair_list))] diff --git a/code/datums/dna/blocks/dna_identity_block.dm b/code/datums/dna/blocks/dna_identity_block.dm index 6543da283481..74ac384b3f9d 100644 --- a/code/datums/dna/blocks/dna_identity_block.dm +++ b/code/datums/dna/blocks/dna_identity_block.dm @@ -95,7 +95,7 @@ /datum/dna_block/identity/hair_gradient /datum/dna_block/identity/hair_gradient/create_unique_block(mob/living/carbon/human/target) - return construct_block(SSaccessories.hair_gradients_list.Find(target.grad_style[GRADIENT_HAIR_KEY]), length(SSaccessories.hair_gradients_list)) + return construct_block(SSaccessories.hair_gradients_list.Find(target.get_hair_gradient_style(GRADIENT_HAIR_KEY)), length(SSaccessories.hair_gradients_list)) /datum/dna_block/identity/hair_gradient/apply_to_mob(mob/living/carbon/human/target, dna_hash) var/gradient_style = SSaccessories.hair_gradients_list[deconstruct_block(get_block(dna_hash), length(SSaccessories.hair_gradients_list))] @@ -105,7 +105,7 @@ block_length = DNA_BLOCK_SIZE_COLOR /datum/dna_block/identity/hair_gradient_color/create_unique_block(mob/living/carbon/human/target) - return sanitize_hexcolor(target.grad_color[GRADIENT_HAIR_KEY], include_crunch = FALSE) + return sanitize_hexcolor(target.get_hair_gradient_color(GRADIENT_HAIR_KEY), include_crunch = FALSE) /datum/dna_block/identity/hair_gradient_color/apply_to_mob(mob/living/carbon/human/target, dna_hash) target.set_hair_gradient_color(sanitize_hexcolor(get_block(dna_hash)), update = FALSE) @@ -113,7 +113,7 @@ /datum/dna_block/identity/facial_gradient /datum/dna_block/identity/facial_gradient/create_unique_block(mob/living/carbon/human/target) - return construct_block(SSaccessories.facial_hair_gradients_list.Find(target.grad_style[GRADIENT_FACIAL_HAIR_KEY]), length(SSaccessories.facial_hair_gradients_list)) + return construct_block(SSaccessories.facial_hair_gradients_list.Find(target.get_hair_gradient_style(GRADIENT_FACIAL_HAIR_KEY)), length(SSaccessories.facial_hair_gradients_list)) /datum/dna_block/identity/facial_gradient/apply_to_mob(mob/living/carbon/human/target, dna_hash) var/gradient_style = SSaccessories.facial_hair_gradients_list[deconstruct_block(get_block(dna_hash), length(SSaccessories.facial_hair_gradients_list))] @@ -123,7 +123,7 @@ block_length = DNA_BLOCK_SIZE_COLOR /datum/dna_block/identity/facial_gradient_color/create_unique_block(mob/living/carbon/human/target) - return sanitize_hexcolor(target.grad_color[GRADIENT_FACIAL_HAIR_KEY], include_crunch = FALSE) + return sanitize_hexcolor(target.get_hair_gradient_color(GRADIENT_FACIAL_HAIR_KEY), include_crunch = FALSE) /datum/dna_block/identity/facial_gradient_color/apply_to_mob(mob/living/carbon/human/target, dna_hash) target.set_facial_hair_gradient_color(sanitize_hexcolor(get_block(dna_hash)), update = FALSE) diff --git a/code/datums/dna/dna.dm b/code/datums/dna/dna.dm index 3720b03bd1ea..1957407588c7 100644 --- a/code/datums/dna/dna.dm +++ b/code/datums/dna/dna.dm @@ -83,7 +83,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) return ..() ///Copies the variables of a dna datum onto another. -/datum/dna/proc/copy_dna(datum/dna/new_dna, transfer_flags = COPY_DNA_SE|COPY_DNA_SPECIES) +/datum/dna/proc/copy_dna(datum/dna/new_dna, transfer_flags = COPY_DNA_SE|COPY_DNA_SPECIES|COPY_DNA_BLOOD_TYPE) // DARKPACK EDIT CHANGE - added '|COPY_DNA_BLOOD_TYPE', original : /datum/dna/proc/copy_dna(datum/dna/new_dna, transfer_flags = COPY_DNA_SE|COPY_DNA_SPECIES) new_dna.unique_enzymes = unique_enzymes new_dna.unique_identity = unique_identity new_dna.unique_features = unique_features @@ -94,13 +94,16 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) new_dna.default_mutation_genes = default_mutation_genes //if the new DNA has a holder, transform them immediately, otherwise save it if(new_dna.holder) - if (iscarbon(new_dna.holder)) + if (iscarbon(new_dna.holder) && (transfer_flags & COPY_DNA_BLOOD_TYPE)) // DARKPACK EDIT CHANGE - added & COPY_DNA_BLOOD_TYPE var/mob/living/carbon/as_carbon = new_dna.holder as_carbon.set_blood_type(blood_type) if(transfer_flags & COPY_DNA_SPECIES) new_dna.holder.set_species(species.type, icon_update = FALSE) else - new_dna.blood_type = blood_type + //DARKPACK EDIT CHANGE START - flag for copying blood type, we don't want to remove vampire blood from vampires using certain abilities + if(transfer_flags & COPY_DNA_BLOOD_TYPE) + new_dna.blood_type = blood_type + //DARKPACK EDIT CHANGE END if(transfer_flags & COPY_DNA_SPECIES) new_dna.species = new species.type if(transfer_flags & COPY_DNA_MUTATIONS && holder?.can_mutate()) @@ -722,4 +725,4 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) eyes.Remove(src) qdel(eyes) visible_message(span_notice("[src] looks up and their eyes melt away!"), span_userdanger("I understand now.")) - addtimer(CALLBACK(src, PROC_REF(adjustOrganLoss), ORGAN_SLOT_BRAIN, 200), 2 SECONDS) + addtimer(CALLBACK(src, PROC_REF(adjust_organ_loss), ORGAN_SLOT_BRAIN, 200), 2 SECONDS) diff --git a/code/datums/dna/dna_block.dm b/code/datums/dna/dna_block.dm index f9205c2278ec..eaa005cf5dfb 100644 --- a/code/datums/dna/dna_block.dm +++ b/code/datums/dna/dna_block.dm @@ -56,12 +56,14 @@ /// Blocks for unique identities (skin tones, hair style, and gender) /datum/dna_block/identity + abstract_type = /datum/dna_block/identity /datum/dna_block/identity/position_in_hash() return GLOB.total_ui_len_by_block[type] /// Blocks for unique features (mutant color, mutant bodyparts) /datum/dna_block/feature + abstract_type = /datum/dna_block/feature /// The feature key this block ties in to. var/feature_key = null diff --git a/code/datums/elements/atmos_requirements.dm b/code/datums/elements/atmos_requirements.dm index 42f5ceefe387..0b4b6e17443f 100644 --- a/code/datums/elements/atmos_requirements.dm +++ b/code/datums/elements/atmos_requirements.dm @@ -39,7 +39,7 @@ if(is_breathable_atmos(target)) target.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) return - target.adjustBruteLoss(unsuitable_atmos_damage * seconds_per_tick) + target.adjust_brute_loss(unsuitable_atmos_damage * seconds_per_tick) target.throw_alert(ALERT_NOT_ENOUGH_OXYGEN, /atom/movable/screen/alert/not_enough_oxy) /datum/element/atmos_requirements/proc/is_breathable_atmos(mob/living/target) diff --git a/code/datums/elements/basic_eating.dm b/code/datums/elements/basic_eating.dm index a0f5a2cedefa..8b011823e16f 100644 --- a/code/datums/elements/basic_eating.dm +++ b/code/datums/elements/basic_eating.dm @@ -16,10 +16,12 @@ var/drinking /// If true, we put food in our tummy instead of deleting it var/add_to_contents - /// Types the animal can eat. + /// If true, when add_to_contents would put the item into contents but when used for healing, the item is consumed instead + var/consume_healing + /// Types the animal can eat. Can be an assoc list with amount to heal/damage the mob by var/list/food_types -/datum/element/basic_eating/Attach(datum/target, heal_amt = 0, damage_amount = 0, damage_type = null, drinking = FALSE, add_to_contents = FALSE, food_types = list()) +/datum/element/basic_eating/Attach(datum/target, heal_amt = 0, damage_amount = 0, damage_type = null, drinking = FALSE, add_to_contents = FALSE, consume_healing = TRUE, food_types = list()) . = ..() if(!isliving(target)) @@ -31,6 +33,7 @@ src.damage_type = damage_type src.drinking = drinking src.add_to_contents = add_to_contents + src.consume_healing = consume_healing src.food_types = food_types RegisterSignal(target, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(try_feed)) @@ -66,7 +69,8 @@ /datum/element/basic_eating/proc/try_eating(mob/living/eater, atom/target, mob/living/feeder) if(!is_type_in_list(target, food_types)) return FALSE - if(SEND_SIGNAL(eater, COMSIG_MOB_PRE_EAT, target, feeder) & COMSIG_MOB_CANCEL_EAT) + var/list/effect_mult = list() + if(SEND_SIGNAL(eater, COMSIG_MOB_PRE_EAT, target, feeder, effect_mult) & COMSIG_MOB_CANCEL_EAT) return FALSE if(add_to_contents && !ismovable(target)) return FALSE @@ -76,22 +80,44 @@ else eat_verb = pick("bite","chew","nibble","gnaw","gobble","chomp") - if (heal_amt > 0) - var/healed = heal_amt && eater.health < eater.maxHealth - eater.heal_overall_damage(heal_amt) + var/best_match = null + var/best_value = 0 + for (var/food_path in food_types) + // Not an assoc list + if (isnull(food_types[food_path])) + break + if (istype(target, food_path) && (!best_match || ispath(food_path, best_match))) + best_match = food_path + best_value = food_types[food_path] + + var/to_heal = heal_amt + var/to_damage = damage_amount + + if (best_match) + to_heal = 0 + to_damage = 0 + if (best_value > 0) + to_heal = best_value + else if (best_value < 0) + to_damage = -best_value + + for (var/mult in effect_mult) + to_heal *= mult + to_damage *= mult + + if (to_heal > 0) + var/healed = eater.heal_overall_damage(to_heal) eater.visible_message(span_notice("[eater] [eat_verb]s [target]."), span_notice("You [eat_verb] [target][healed ? ", restoring some health" : ""].")) - - else if (damage_amount > 0 && damage_type) - eater.apply_damage(damage_amount, damage_type) - eater.visible_message(span_notice("[eater] [eat_verb]s [target], and seems to hurt itself."), span_notice("You [eat_verb] [target], hurting yourself in the process.")) - + else if (to_damage > 0 && damage_type) + var/damaged = eater.apply_damage(to_damage, damage_type) + eater.visible_message(span_notice("[eater] [eat_verb]s [target][damaged ? ", and seems to hurt [eater.p_themselves()]!" : "."]"), span_notice("You [eat_verb] [target][damaged ? ", hurting yourself in the process" : ""].")) else eater.visible_message(span_notice("[eater] [eat_verb]s [target]."), span_notice("You [eat_verb] [target].")) - finish_eating(eater, target, feeder) + finish_eating(eater, target, feeder, to_heal) return TRUE -/datum/element/basic_eating/proc/finish_eating(mob/living/eater, atom/target, mob/living/feeder) +/datum/element/basic_eating/proc/finish_eating(mob/living/eater, atom/target, mob/living/feeder, to_heal) set waitfor = FALSE if(drinking) playsound(eater.loc,'sound/items/drink.ogg', rand(10,50), TRUE) @@ -104,10 +130,12 @@ var/obj/item/stack/food_stack = target final_target = food_stack.split_stack(1) - eater.log_message("has eaten [target], [add_to_contents ? "swallowing it" : "destroying it"]!", LOG_ATTACK) + var/devour = add_to_contents && !to_heal + eater.log_message("has eaten [target], [devour ? "swallowing it" : "destroying it"]!", LOG_ATTACK) - if (add_to_contents) + if (devour) var/atom/movable/movable_target = final_target movable_target.forceMove(eater) else qdel(final_target) + diff --git a/code/datums/elements/beauty.dm b/code/datums/elements/beauty.dm index 8bfa298c1a72..edc2c0075175 100644 --- a/code/datums/elements/beauty.dm +++ b/code/datums/elements/beauty.dm @@ -11,7 +11,7 @@ * Assoc list of atoms as keys and number of time the same element instance has been attached to them as assoc value. * So things don't get odd with same-valued yet dissimilar beauty modifiers being added to the same atom. */ - var/beauty_counter = list() + var/beauty_counter /datum/element/beauty/Attach(datum/target, beauty) . = ..() @@ -19,6 +19,7 @@ return ELEMENT_INCOMPATIBLE src.beauty = beauty + LAZYINITLIST(beauty_counter) var/area/current_area = get_area(target) var/beauty_active = TRUE diff --git a/code/datums/elements/body_temp_sensitive.dm b/code/datums/elements/body_temp_sensitive.dm index e3a694baed78..9cbb027123d7 100644 --- a/code/datums/elements/body_temp_sensitive.dm +++ b/code/datums/elements/body_temp_sensitive.dm @@ -50,7 +50,7 @@ var/gave_alert = FALSE if(living_mob.bodytemperature < min_body_temp) - living_mob.adjustFireLoss(cold_damage * seconds_per_tick, forced = TRUE) + living_mob.adjust_fire_loss(cold_damage * seconds_per_tick, forced = TRUE) if(!living_mob.has_status_effect(/datum/status_effect/inebriated)) switch(cold_damage) if(1 to 5) @@ -62,7 +62,7 @@ gave_alert = TRUE else if(living_mob.bodytemperature > max_body_temp) - living_mob.adjustFireLoss(heat_damage * seconds_per_tick, forced = TRUE) + living_mob.adjust_fire_loss(heat_damage * seconds_per_tick, forced = TRUE) switch(heat_damage) if(1 to 5) living_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 1) diff --git a/code/datums/elements/bonus_damage.dm b/code/datums/elements/bonus_damage.dm index 1fce0672c515..b99d346d2898 100644 --- a/code/datums/elements/bonus_damage.dm +++ b/code/datums/elements/bonus_damage.dm @@ -32,4 +32,4 @@ 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) + living_target.adjust_brute_loss(brute_damage_amount) diff --git a/code/datums/elements/bugkiller_reagent.dm b/code/datums/elements/bugkiller_reagent.dm index f6a09989335b..226e59da3329 100644 --- a/code/datums/elements/bugkiller_reagent.dm +++ b/code/datums/elements/bugkiller_reagent.dm @@ -30,7 +30,7 @@ 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) + var/damage = min(round(reac_volume * (1 - touch_protection), 0.1), 20) if(damage < 1) return @@ -87,4 +87,5 @@ /atom/movable/screen/alert/status_effect/bugkiller_death name = "Overwhelming Toxicity" desc = "Don't go into the light!" - icon_state = "paralysis" + use_user_hud_icon = TRUE + overlay_state = "paralysis" diff --git a/code/datums/elements/climbable.dm b/code/datums/elements/climbable.dm index 2a16cfac7e6e..18cd40914719 100644 --- a/code/datums/elements/climbable.dm +++ b/code/datums/elements/climbable.dm @@ -37,7 +37,7 @@ examine_list["climbable"] = "It looks like it can be climbed on." /datum/element/climbable/proc/can_climb(atom/source, mob/user) - if (!user.CanReach(source)) + if (!source.IsReachableBy(user)) return FALSE var/dir_step = get_dir(user, source.loc) //To jump over a railing you have to be standing next to it, not far behind it. diff --git a/code/datums/elements/cuffable_item.dm b/code/datums/elements/cuffable_item.dm new file mode 100644 index 000000000000..b81068d2361f --- /dev/null +++ b/code/datums/elements/cuffable_item.dm @@ -0,0 +1,69 @@ +///This element allows the item it's attached to be bound to oneself's arm with a pair of handcuffs (sold separately). Borgs need not to apply +/datum/element/cuffable_item + +/datum/element/cuffable_item/Attach(datum/target) + . = ..() + + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examine_more)) + RegisterSignal(target, COMSIG_ATOM_ITEM_INTERACTION_SECONDARY, PROC_REF(item_interaction)) + + 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_item)) + +///Tell the player about the interaction if they examine the item twice. +/datum/element/cuffable_item/proc/on_examine_more(obj/item/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(length(user.held_items) < 0 || iscyborg(user) || source.anchored) + return + examine_list += span_smallnotice("You could bind [source.p_them()] to your wrist with a pair of handcuffs...") + +///Give context to players holding a pair of handcuffs when hovering the item +/datum/element/cuffable_item/proc/on_requesting_context_from_item(datum/source, list/context, obj/item/held_item, mob/user) + SIGNAL_HANDLER + + if (!istype(held_item, /obj/item/restraints/handcuffs)) + return NONE + var/obj/item/restraints/handcuffs/cuffs = held_item + if(!cuffs.used) + context[SCREENTIP_CONTEXT_RMB] = "Cuff to your wrist" + return CONTEXTUAL_SCREENTIP_SET + +/datum/element/cuffable_item/proc/item_interaction(obj/item/source, mob/living/user, obj/item/tool, modifiers) + SIGNAL_HANDLER + + if(!istype(tool, /obj/item/restraints/handcuffs) || iscyborg(user) || source.anchored || !source.IsReachableBy(user)) + return NONE + + INVOKE_ASYNC(src, PROC_REF(apply_cuffs), source, user, tool) + return ITEM_INTERACT_SUCCESS + +///The proc responsible for adding the status effect to the player and all... +/datum/element/cuffable_item/proc/apply_cuffs(obj/item/source, mob/living/user, obj/item/restraints/handcuffs/cuffs) + if(cuffs.used || DOING_INTERACTION_WITH_TARGET(user, source)) + return + + if(HAS_TRAIT_FROM(source, TRAIT_NODROP, CUFFED_ITEM_TRAIT)) + to_chat(user, span_warning("[source] is already cuffed to your wrist!")) + return + + if(cuffs.handcuffs_clumsiness_check(user)) + return + + source.balloon_alert(user, "cuffing item...") + playsound(source, cuffs.cuffsound, 30, TRUE, -2) + if(!do_after(user, cuffs.get_handcuff_time(user), source)) + return + + playsound(source, cuffs.cuffsuccesssound, 30, TRUE, -2) + + if(user.apply_status_effect(/datum/status_effect/cuffed_item, source, cuffs)) + source.balloon_alert(user, "item cuffed to wrist") + return + + source.balloon_alert(user, "couldn't cuff to wrist!") + return diff --git a/code/datums/elements/cuffsnapping.dm b/code/datums/elements/cuffsnapping.dm index 3640b0a5bd8d..47728af0744d 100644 --- a/code/datums/elements/cuffsnapping.dm +++ b/code/datums/elements/cuffsnapping.dm @@ -49,12 +49,20 @@ UnregisterSignal(target, list(COMSIG_ITEM_ATTACK_SECONDARY, COMSIG_ATOM_EXAMINE, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET)) return ..() -/datum/element/cuffsnapping/proc/add_item_context(obj/item/source, list/context, mob/living/carbon/target, mob/living/user) +/datum/element/cuffsnapping/proc/add_item_context(obj/item/source, list/context, atom/target, mob/living/user) SIGNAL_HANDLER - if(!iscarbon(target) || !target.handcuffed) + if(!isliving(target)) //Removing restraints takes precedence return NONE - context[SCREENTIP_CONTEXT_RMB] = "Cut Restraints" - return CONTEXTUAL_SCREENTIP_SET + var/mob/living/living_target = target + if(iscarbon(living_target)) + var/mob/living/carbon/carbon_target = living_target + if(carbon_target.handcuffed) + context[SCREENTIP_CONTEXT_RMB] = "Cut Restraints" + return CONTEXTUAL_SCREENTIP_SET + if(living_target.has_status_effect(/datum/status_effect/cuffed_item)) + context[SCREENTIP_CONTEXT_RMB] = "Remove Binds From Item" + return CONTEXTUAL_SCREENTIP_SET + return NONE ///signal called on parent being examined /datum/element/cuffsnapping/proc/on_examine(datum/target, mob/user, list/examine_list) @@ -72,48 +80,74 @@ examine_list += span_notice(examine_string) -/datum/element/cuffsnapping/proc/try_cuffsnap_target(obj/item/cutter, mob/living/carbon/target, mob/living/cutter_user, list/modifiers) +///Signal called on parent when it right-clicks another mob. +/datum/element/cuffsnapping/proc/try_cuffsnap_target(obj/item/cutter, mob/living/target, mob/living/cutter_user, list/modifiers) SIGNAL_HANDLER - if(!istype(target)) //we aren't the kind of mob that can even have cuffs, so we skip. + if(LAZYACCESS(cutter_user.do_afters, cutter)) return - if(!target.handcuffed) - return + var/mob/living/carbon/carbon_target = target + if(!istype(carbon_target) || !carbon_target.handcuffed) + var/datum/status_effect/cuffed_item/cuffed_status = target.has_status_effect(/datum/status_effect/cuffed_item) + if(!cuffed_status) + return NONE + INVOKE_ASYNC(src, PROC_REF(try_cuffsnap_item), cutter, target, cutter_user, cuffed_status.cuffed, cuffed_status.cuffs) + return COMPONENT_SKIP_ATTACK - var/obj/item/restraints/handcuffs/cuffs = target.handcuffed + var/obj/item/restraints/handcuffs/cuffs = carbon_target.handcuffed if(!istype(cuffs)) - return - - if(cuffs.restraint_strength && isnull(src.snap_time_strong)) - cutter_user.visible_message(span_notice("[cutter_user] tries to cut through [target]'s restraints with [cutter], but fails!")) - playsound(source = get_turf(cutter), soundin = cutter.usesound ? cutter.usesound : cutter.hitsound, vol = cutter.get_clamped_volume(), vary = TRUE) - return COMPONENT_SKIP_ATTACK + return NONE - else if(isnull(src.snap_time_weak)) - cutter_user.visible_message(span_notice("[cutter_user] tries to cut through [target]'s restraints with [cutter], but fails!")) - playsound(source = get_turf(cutter), soundin = cutter.usesound ? cutter.usesound : cutter.hitsound, vol = cutter.get_clamped_volume(), vary = TRUE) - return COMPONENT_SKIP_ATTACK + if(check_cuffs_strength(carbon_target, target, cutter_user, cuffs, span_notice("[cutter_user] tries to cut through [target]'s restraints with [cutter], but fails!"))) + INVOKE_ASYNC(src, PROC_REF(do_cuffsnap_target), cutter, target, cutter_user, cuffs) - . = COMPONENT_SKIP_ATTACK + return COMPONENT_SKIP_ATTACK - INVOKE_ASYNC(src, PROC_REF(do_cuffsnap_target), cutter, target, cutter_user, cuffs) +///Check that the type of restraints can be cut by this element. +/datum/element/cuffsnapping/proc/check_cuffs_strength(obj/item/cutter, mob/living/target, mob/living/cutter_user, obj/item/restraints/handcuffs/cuffs, message) + if(cuffs.restraint_strength ? snap_time_strong : snap_time_weak) + return TRUE + cutter_user.visible_message(message) + playsound(source = get_turf(cutter), soundin = cutter.usesound || cutter.hitsound, vol = cutter.get_clamped_volume(), vary = TRUE) + return FALSE +///Called when a player tries to remove the cuffs restraining another mob. /datum/element/cuffsnapping/proc/do_cuffsnap_target(obj/item/cutter, mob/living/carbon/target, mob/cutter_user, obj/item/restraints/handcuffs/cuffs) if(LAZYACCESS(cutter_user.do_afters, cutter)) return - log_combat(cutter_user, target, "cut or tried to cut [target]'s cuffs", cutter) - var/snap_time = src.snap_time_weak - if(cuffs.restraint_strength) - snap_time = src.snap_time_strong + do_snip_snap(cutter, target, cutter_user, cuffs, span_notice("[cutter_user] cuts [target]'s restraints with [cutter]!")) + +///Called when a player tries to remove the cuffs binding an item to their owner +/datum/element/cuffsnapping/proc/try_cuffsnap_item(obj/item/cutter, mob/living/target, mob/living/cutter_user, obj/item/cuffed, obj/item/restraints/handcuffs/cuffs) + if(check_cuffs_strength(cutter, target, cutter_user, cuffs, span_notice("[cutter_user] tries to cut through the restraints binding [cuffed] to [target], but fails!"))) + return + + log_combat(cutter_user, target, "cut or tried to cut restraints binding [cuffed] to") + + do_snip_snap(cutter, target, cutter_user, cuffs, span_notice("[cutter_user] cuts the restraints binding [src] to [target] with [cutter]!")) + +///The proc responsible for the very timed action that deletes the cuffs +/datum/element/cuffsnapping/proc/do_snip_snap(obj/item/cutter, mob/living/target, mob/cutter_user, obj/item/restraints/handcuffs/cuffs, message) + var/snap_time = cuffs.restraint_strength ? snap_time_strong : snap_time_weak + + var/target_was_restrained = FALSE + if(iscarbon(target)) + var/mob/living/carbon/carbon_target = target + target_was_restrained = carbon_target.handcuffed - if(snap_time == 0 || do_after(cutter_user, snap_time, target, interaction_key = cutter)) // If 0 just do it. This to bypass the do_after() creating a needless progress bar. - cutter_user.do_attack_animation(target, used_item = cutter) - cutter_user.visible_message(span_notice("[cutter_user] cuts [target]'s restraints with [cutter]!")) - qdel(target.handcuffed) - playsound(source = get_turf(cutter), soundin = cutter.usesound ? cutter.usesound : cutter.hitsound, vol = cutter.get_clamped_volume(), vary = TRUE) + if(snap_time) + if(!do_after(cutter_user, snap_time, target, interaction_key = cutter)) // If 0 just do it. This to bypass the do_after() creating a needless progress bar. + return + if(target_was_restrained) //Removing restraints takes priority over cuffed items. This only applies for carbon mobs, but we need to make sure the restraints are still the same. + var/mob/living/carbon/carbon_target = target + if(carbon_target.handcuffed != cuffs) + return - return + cutter_user.do_attack_animation(target, used_item = cutter) + cutter_user.visible_message(message) + qdel(cuffs) + playsound(source = get_turf(cutter), soundin = cutter.usesound || cutter.hitsound, vol = cutter.get_clamped_volume(), vary = TRUE) diff --git a/code/datums/elements/death_drops.dm b/code/datums/elements/death_drops.dm index 70543260707b..b5d8f988d2d7 100644 --- a/code/datums/elements/death_drops.dm +++ b/code/datums/elements/death_drops.dm @@ -41,15 +41,18 @@ if (SEND_SIGNAL(target, COMSIG_LIVING_DROP_LOOT, spawn_loot, gibbed) & COMPONENT_NO_LOOT_DROP) return + var/list/all_loot = list() for(var/thing_to_spawn in spawn_loot) for(var/i in 1 to (spawn_loot[thing_to_spawn] || 1)) - create_loot(thing_to_spawn, loot_loc, target, gibbed, spread_px = spawn_loot.len * 3) + all_loot += create_loot(thing_to_spawn, loot_loc, target, gibbed, spread_px = spawn_loot.len * 3) + + list_clear_nulls(all_loot) // in case of gibbed corpses + SEND_SIGNAL(target, COMSIG_LIVING_DROPPED_LOOT, all_loot, gibbed) /// Handles creating the loots /datum/element/death_drops/proc/create_loot(typepath, atom/loot_loc, mob/living/dead, gibbed, spread_px = 4) if(ispath(typepath, /obj/effect/mob_spawn/corpse)) - handle_corpse(typepath, loot_loc, dead, gibbed) - return + return handle_corpse(typepath, loot_loc, dead, gibbed) var/drop = new typepath(loot_loc) if(isitem(drop) && spread_px) @@ -57,18 +60,20 @@ var/clamped_px = clamp(spread_px, 0, 16) dropped_item.pixel_x = rand(-clamped_px, clamped_px) dropped_item.pixel_y = rand(-clamped_px, clamped_px) + return drop /// Handles snowflake case of mob corpses /datum/element/death_drops/proc/handle_corpse(typepath, atom/loot_loc, mob/living/dead, gibbed) var/obj/effect/mob_spawn/corpse/spawner = new typepath(loot_loc, TRUE) var/mob/living/body = spawner.create() // done before the gib check so the bodyparts will be damaged - body.setBruteLoss(dead.getBruteLoss()) - body.setFireLoss(dead.getFireLoss()) + body.set_brute_loss(dead.get_brute_loss()) + body.set_fire_loss(dead.get_fire_loss()) // if gibbed, dispose of the body if(gibbed) body.gib(DROP_ALL_REMAINS) - return + return null // otherwise continue with the rest of the damage types - body.setToxLoss(dead.getToxLoss()) - body.setOxyLoss(dead.getOxyLoss()) + body.set_tox_loss(dead.get_tox_loss()) + body.set_oxy_loss(dead.get_oxy_loss()) + return body diff --git a/code/datums/elements/digitalcamo.dm b/code/datums/elements/digitalcamo.dm index 1061131f88b6..30038f2a55da 100644 --- a/code/datums/elements/digitalcamo.dm +++ b/code/datums/elements/digitalcamo.dm @@ -27,14 +27,14 @@ /datum/element/digitalcamo/proc/HideFromAIHuds(mob/living/target) for(var/mob/living/silicon/ai/AI in GLOB.ai_list) - for (var/hud_type in AI.silicon_huds) - var/datum/atom_hud/silicon_hud = GLOB.huds[hud_type] + for (var/hud_trait in AI.silicon_huds) + var/datum/atom_hud/silicon_hud = GLOB.huds[GLOB.trait_to_hud[hud_trait]] silicon_hud.hide_single_atomhud_from(AI,target) /datum/element/digitalcamo/proc/UnhideFromAIHuds(mob/living/target) for(var/mob/living/silicon/ai/AI in GLOB.ai_list) - for (var/hud_type in AI.silicon_huds) - var/datum/atom_hud/silicon_hud = GLOB.huds[hud_type] + for (var/hud_trait in AI.silicon_huds) + var/datum/atom_hud/silicon_hud = GLOB.huds[GLOB.trait_to_hud[hud_trait]] silicon_hud.unhide_single_atomhud_from(AI,target) /datum/element/digitalcamo/proc/on_examine(datum/source, mob/M, list/examine_list) diff --git a/code/datums/elements/drag_activation.dm b/code/datums/elements/drag_activation.dm new file mode 100644 index 000000000000..12f44782f55d --- /dev/null +++ b/code/datums/elements/drag_activation.dm @@ -0,0 +1,29 @@ +/** + * drag_to_activate element + * + * Allowing things to be activated by mouse dragging. + * Useful for objects which have a TGUI window on interaction. + */ +/datum/element/drag_to_activate + +/datum/element/drag_to_activate/Attach(datum/target) + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_MOUSEDROP_ONTO, PROC_REF(activate)) + return ..() + +/datum/element/drag_to_activate/Detach(datum/source) + UnregisterSignal(source, COMSIG_MOUSEDROP_ONTO) + return ..() + +/datum/element/drag_to_activate/proc/activate(atom/movable/source, atom/over, mob/user) + SIGNAL_HANDLER + + if(!user.can_perform_action(source, FORBID_TELEKINESIS_REACH)) + return NONE + + var/obj/item/item_source = source + if(!istype(over, /atom/movable/screen)) + INVOKE_ASYNC(item_source, TYPE_PROC_REF(/obj/item, attack_self), user) + source.add_fingerprint(user) + return COMPONENT_CANCEL_MOUSEDROP_ONTO diff --git a/code/datums/elements/drag_pickup.dm b/code/datums/elements/drag_pickup.dm index 8eb73bbb4389..f93288303bd7 100644 --- a/code/datums/elements/drag_pickup.dm +++ b/code/datums/elements/drag_pickup.dm @@ -1,7 +1,8 @@ /** - * drag_pickup element; for allowing things to be picked up by dragging. + * drag_pickup element * - * Used for paper bins. + * Allowing things to be picked up or unequipped by mouse-dragging. + * Useful for objects which have an interaction on click */ /datum/element/drag_pickup @@ -15,20 +16,22 @@ UnregisterSignal(source, COMSIG_MOUSEDROP_ONTO) return ..() -/datum/element/drag_pickup/proc/pick_up(atom/source, atom/over, mob/user) +/datum/element/drag_pickup/proc/pick_up(atom/movable/source, atom/over, mob/user) SIGNAL_HANDLER - var/mob/living/picker = user - if(!istype(picker) || !user.can_perform_action(source, FORBID_TELEKINESIS_REACH)) - return - var/obj/pickup_object = source - if (pickup_object) - if (pickup_object.anchored) + if(!user.can_perform_action(source, FORBID_TELEKINESIS_REACH)) + return NONE + if(source.anchored) + return NONE + if(source.loc == user && isitem(source)) + var/obj/item/item_source = source + if(!item_source.can_mob_unequip(user)) return COMPONENT_CANCEL_MOUSEDROP_ONTO - if(over == picker) - INVOKE_ASYNC(picker, TYPE_PROC_REF(/mob/, put_in_hands), source) + if(over == user) + INVOKE_ASYNC(user, TYPE_PROC_REF(/mob, put_in_hands), source) else if(istype(over, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/Selected_hand = over - picker.putItemFromInventoryInHandIfPossible(source, Selected_hand.held_index) + var/atom/movable/screen/inventory/hand/selected_hand = over + user.putItemFromInventoryInHandIfPossible(source, selected_hand.held_index) + source.add_fingerprint(user) return COMPONENT_CANCEL_MOUSEDROP_ONTO diff --git a/code/datums/elements/dryable.dm b/code/datums/elements/dryable.dm index 3d7842b30891..8a0f9964a7d7 100644 --- a/code/datums/elements/dryable.dm +++ b/code/datums/elements/dryable.dm @@ -21,8 +21,8 @@ var/atom/result = new dry_result if(!atom_target.compare_materials(result)) var/warning = "custom_materials of [result.type] when dried compared to just spawned don't match" - var/what_it_should_be = atom_target.get_materials_english_list() - stack_trace("[warning]. custom_materials should be [what_it_should_be].") + var/what_it_should_be = atom_target.transcribe_materials_list() + stack_trace("[warning]. should be: custom_materials = [what_it_should_be].") qdel(result) diff --git a/code/datums/elements/earhealing.dm b/code/datums/elements/earhealing.dm index ac69e8cc18ed..33e599eddbe9 100644 --- a/code/datums/elements/earhealing.dm +++ b/code/datums/elements/earhealing.dm @@ -27,8 +27,9 @@ for(var/i in user_by_item) var/mob/living/carbon/user = user_by_item[i] var/obj/item/organ/ears/ears = user.get_organ_slot(ORGAN_SLOT_EARS) - if(!ears || !ears.damage || (ears.organ_flags & ORGAN_FAILING) || IS_ROBOTIC_ORGAN(ears)) + if(!ears || (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.adjust_temporary_deafness(-0.5 SECONDS * seconds_per_tick) ears.apply_organ_damage(-0.025 * seconds_per_tick) CHECK_TICK diff --git a/code/datums/elements/effect_trail.dm b/code/datums/elements/effect_trail.dm index d1d2fbec44a6..58fddf51216c 100644 --- a/code/datums/elements/effect_trail.dm +++ b/code/datums/elements/effect_trail.dm @@ -16,13 +16,55 @@ src.chosen_effect = chosen_effect /datum/element/effect_trail/Detach(datum/target) - . = ..() UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + return ..() /// Generates an effect /datum/element/effect_trail/proc/generate_effect(atom/movable/target_object) SIGNAL_HANDLER var/turf/open/open_turf = get_turf(target_object) - if(istype(open_turf)) - new chosen_effect(open_turf) + if(!istype(open_turf)) + return + new chosen_effect(open_turf) + +/// If we are a cosmic heretic, this will return the appropriate effect trail based on our passive level. returns the default trail otherwise +/proc/cosmic_trail_based_on_passive(mob/living/source) + if(isstargazer(source)) + return /datum/element/effect_trail/cosmic_field/antiprojectile + + var/datum/status_effect/heretic_passive/cosmic/cosmic_passive = source.has_status_effect(/datum/status_effect/heretic_passive/cosmic) + if(!cosmic_passive) + return /datum/element/effect_trail/cosmic_field + if(cosmic_passive.passive_level == 3) + return /datum/element/effect_trail/cosmic_field/antiprojectile + if(cosmic_passive.passive_level == 2) + return /datum/element/effect_trail/cosmic_field/antiexplosion + return /datum/element/effect_trail + +/datum/element/effect_trail/cosmic_field // Cosmic field subtype which applies any upgrades + var/prevents_explosions = FALSE + var/slows_projectiles = FALSE + +/datum/element/effect_trail/cosmic_field/Attach(datum/target, chosen_effect) + . = ..() + if(!ispath(chosen_effect, /obj/effect/forcefield/cosmic_field)) + stack_trace("Tried to attach a cosmic_field effect trail with a non-cosmic field as the chosen effect") + +/datum/element/effect_trail/cosmic_field/generate_effect(atom/movable/target_object) + var/turf/open/open_turf = get_turf(target_object) + if(!istype(open_turf)) + return + var/obj/effect/forcefield/cosmic_field/new_field = new chosen_effect(open_turf) + + if(prevents_explosions) + new_field.prevents_explosions() + if(slows_projectiles) + new_field.slows_projectiles() + +/datum/element/effect_trail/cosmic_field/antiexplosion + prevents_explosions = TRUE + +/datum/element/effect_trail/cosmic_field/antiprojectile + prevents_explosions = TRUE + slows_projectiles = TRUE diff --git a/code/datums/elements/elevation.dm b/code/datums/elements/elevation.dm index 304d79ad1608..a0c3da5f3ab7 100644 --- a/code/datums/elements/elevation.dm +++ b/code/datums/elements/elevation.dm @@ -58,8 +58,8 @@ return if(!HAS_TRAIT(location, TRAIT_TURF_HAS_ELEVATED_OBJ(pixel_shift))) RegisterSignal(location, COMSIG_TURF_RESET_ELEVATION, PROC_REF(check_elevation)) + reset_elevation(location) // This needs to go in the before COMSIG_TURF_CHANGE, or we can end up bouncing back into this and getting a runtime RegisterSignal(location, COMSIG_TURF_CHANGE, PROC_REF(pre_change_turf)) - reset_elevation(location) ADD_TRAIT(location, TRAIT_TURF_HAS_ELEVATED_OBJ(pixel_shift), ref(source)) /datum/element/elevation/proc/unregister_turf(atom/movable/source, atom/location) diff --git a/code/datums/elements/empprotection.dm b/code/datums/elements/empprotection.dm index 93a48ea5d17a..55db13d2809b 100644 --- a/code/datums/elements/empprotection.dm +++ b/code/datums/elements/empprotection.dm @@ -18,10 +18,26 @@ /datum/element/empprotection/proc/getEmpFlags(datum/source, severity) SIGNAL_HANDLER - return flags + return (flags & EMP_PROTECT_ALL) /datum/element/empprotection/proc/get_examine_tags(atom/source, mob/user, list/examine_list) SIGNAL_HANDLER - if(flags) - examine_list["EMP-proof"] = "It is shielded against electromagnetic pulses." + if(flags & EMP_NO_EXAMINE) + return + + if((flags & EMP_PROTECT_ALL) == EMP_PROTECT_ALL) + examine_list["EMP proof"] = "[source.p_They()] [source.p_are()] unaffected by electromagnetic pulses, and shields [source.p_their()] contents and wiring from them." + return + + if(flags & EMP_PROTECT_SELF) + examine_list["EMP resilient"] = "[source.p_They()] [source.p_are()] unaffected by electromagnetic pulses." + + if((flags & (EMP_PROTECT_CONTENTS|EMP_PROTECT_WIRES)) == (EMP_PROTECT_CONTENTS|EMP_PROTECT_WIRES)) + examine_list["partially EMP blocking"] = "[source.p_They()] protects [source.p_their()] wiring and contents from electromagnetic pulses." + + else if(flags & EMP_PROTECT_CONTENTS) + examine_list["partially EMP blocking"] = "[source.p_They()] protects [source.p_their()] contents from electromagnetic pulses." + + else if(flags & EMP_PROTECT_WIRES) + examine_list["partially EMP blocking"] = "[source.p_They()] protects [source.p_their()] wiring from electromagnetic pulses." diff --git a/code/datums/elements/examine_lore.dm b/code/datums/elements/examine_lore.dm new file mode 100644 index 000000000000..1ed3f998bb23 --- /dev/null +++ b/code/datums/elements/examine_lore.dm @@ -0,0 +1,39 @@ +/// A simple element for adding additional lore to things. Examine more? More like examine *lore*. +/// Yes, the name's a pun, I'm sorry, I thought it was funny at the moment. +/datum/element/examine_lore + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// The message we add to items to denote that we have cool lore to read. + var/lore_hint + /// Our lore. In order to match descriptions on items, this should be considered to be pre-italicized. + var/lore + +/datum/element/examine_lore/Attach(datum/target, lore_hint, lore) + . = ..() + + src.lore_hint = lore_hint || span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [target].") + src.lore = lore + + if(!lore) + stack_trace("[type] initialized without lore! Double-check element addition?") + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examine_more)) + + +/datum/element/examine_lore/Detach(datum/source, ...) + . = ..() + + UnregisterSignal(source, list( + COMSIG_ATOM_EXAMINE, + COMSIG_ATOM_EXAMINE_MORE, + )) + +/datum/element/examine_lore/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += lore_hint + +/datum/element/examine_lore/proc/on_examine_more(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += "[lore]" diff --git a/code/datums/elements/food/microwavable.dm b/code/datums/elements/food/microwavable.dm index e7efeae4501c..a9f5388cba1c 100644 --- a/code/datums/elements/food/microwavable.dm +++ b/code/datums/elements/food/microwavable.dm @@ -31,8 +31,8 @@ var/atom/result = new result_typepath if(!target.compare_materials(result)) var/warning = "custom_materials of [result.type] when microwaved compared to just spawned don't match" - var/what_it_should_be = target.get_materials_english_list() - stack_trace("[warning]. custom_materials should be [what_it_should_be].") + var/what_it_should_be = target.transcribe_materials_list() + stack_trace("[warning]. should be: custom_materials = [what_it_should_be].") qdel(result) /datum/element/microwavable/Detach(datum/source) diff --git a/code/datums/elements/food/processable.dm b/code/datums/elements/food/processable.dm index 59c8c0462635..b3a1e2c54e27 100644 --- a/code/datums/elements/food/processable.dm +++ b/code/datums/elements/food/processable.dm @@ -14,8 +14,10 @@ var/table_required ///Verb used in processing food (such as slice, flatten), defaults to process var/screentip_verb + ///Sound to play when the do_after begins + var/sound_to_play -/datum/element/processable/Attach(datum/target, tool_behaviour, result_atom_type, amount_created = 3, time_to_process = 2 SECONDS, table_required = FALSE, screentip_verb = "Process") +/datum/element/processable/Attach(datum/target, tool_behaviour, result_atom_type, amount_created = 3, time_to_process = 2 SECONDS, table_required = FALSE, screentip_verb = "Process", sound_to_play = null) . = ..() if(!isatom(target)) return ELEMENT_INCOMPATIBLE @@ -26,6 +28,7 @@ src.result_atom_type = result_atom_type src.table_required = table_required src.screentip_verb = screentip_verb + src.sound_to_play = sound_to_play var/atom/atom_target = target atom_target.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 @@ -42,11 +45,11 @@ var/atom/movable/result = new result_atom_type if(!prototype.compare_materials(result)) var/warning = "custom_materials of [result.type] when processed compared to just spawned don't match" - var/what_it_should_be = prototype.get_materials_english_list() + var/what_it_should_be = prototype.transcribe_materials_list() //compose a text string containing the syntax and paths to use for editing the custom_materials var if(result.custom_materials) what_it_should_be += " (you can round values a bit)" - stack_trace("[warning]. custom_materials should be [what_it_should_be] (you can round values a bit).") + stack_trace("[warning]. should be: custom_materials = [what_it_should_be] (you can round values a bit).") qdel(prototype) qdel(result) @@ -67,7 +70,7 @@ to_chat(user, span_notice("You cannot make [initial(result_atom_type.name)] here! You need a table or at least a tray.")) return - mutable_recipes += list(list(TOOL_PROCESSING_RESULT = result_atom_type, TOOL_PROCESSING_AMOUNT = amount_created, TOOL_PROCESSING_TIME = time_to_process)) + mutable_recipes += list(list(TOOL_PROCESSING_RESULT = result_atom_type, TOOL_PROCESSING_AMOUNT = amount_created, TOOL_PROCESSING_TIME = time_to_process, TOOL_PROCESSING_SOUND = sound_to_play)) ///So people know what the frick they're doing without reading from a wiki page (I mean they will inevitably but i'm trying to help, ok?) /datum/element/processable/proc/OnExamine(atom/source, mob/user, list/examine_list) diff --git a/code/datums/elements/force_move_pulled.dm b/code/datums/elements/force_move_pulled.dm new file mode 100644 index 000000000000..165da8240e8f --- /dev/null +++ b/code/datums/elements/force_move_pulled.dm @@ -0,0 +1,20 @@ +/// Click dragging (thing) will force move (thing). A good use-case example for this would be clicking on a tile with a blood decal. +/datum/element/force_move_pulled + +/datum/element/force_move_pulled/Attach(datum/target) + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + . = ..() + RegisterSignal(target, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_click), override = TRUE) + +/datum/element/force_move_pulled/Detach(datum/target) + . = ..() + UnregisterSignal(target, COMSIG_ATOM_ATTACK_HAND) + +/datum/element/force_move_pulled/proc/on_click(atom/moving_atom, mob/user, list/modifiers) + SIGNAL_HANDLER + if(isnull(user.pulling)) + return NONE + + user.Move_Pulled(moving_atom) + return COMPONENT_CANCEL_ATTACK_CHAIN diff --git a/code/datums/elements/haunted.dm b/code/datums/elements/haunted.dm index 04f985c0d891..72048122c63d 100644 --- a/code/datums/elements/haunted.dm +++ b/code/datums/elements/haunted.dm @@ -24,12 +24,12 @@ REMOVE_TRAIT(master, TRAIT_MOVE_FLYING, ELEMENT_TRAIT(type)) master.RemoveElement(/datum/element/movetype_handler) -/atom/movable/proc/make_haunted(source, color) //if not haunted, make haunted +/obj/item/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 +/obj/item/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/immerse.dm b/code/datums/elements/immerse.dm index 3e28bbb7ea7a..b23623d51b0d 100644 --- a/code/datums/elements/immerse.dm +++ b/code/datums/elements/immerse.dm @@ -198,6 +198,8 @@ GLOBAL_LIST_INIT(immerse_ignored_movable, typecacheof(list( /// Generate a mask filter mutable to use as render_source for the alpha filter based on provided width, height and immersion state /datum/element/immerse/proc/generate_immerse_mask(width, height, is_below_water) + if (!width || !height) + return var/clean_height = height width = ceil(width / ICON_SIZE_X) * ICON_SIZE_X height = ceil(height / ICON_SIZE_Y) * ICON_SIZE_Y @@ -245,6 +247,8 @@ GLOBAL_LIST_INIT(immerse_ignored_movable, typecacheof(list( var/is_below_water = (movable.layer < layer_to_check) ? "underwater-" : "" // Tall mobs still only get covered to their feet, unless they're offset down var/mutable_appearance/immerse_mask = generate_immerse_mask(movable.get_cached_width(), max(ICON_SIZE_Y - movable.pixel_z, ICON_SIZE_Y), is_below_water) + if (!immerse_mask) + return var/atom/movable/immerse_mask/effect_relay = generated_visual_overlays[movable] if (!effect_relay) effect_relay = new(movable) @@ -269,10 +273,12 @@ GLOBAL_LIST_INIT(immerse_ignored_movable, typecacheof(list( /// 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/atom/movable/immerse_mask/effect_relay = generated_visual_overlays[source] + if (!effect_relay) + return var/matrix/new_transform = matrix() new_transform.Scale(1 / source.current_size) new_transform.Turn(-new_lying_angle) - var/atom/movable/immerse_mask/effect_relay = generated_visual_overlays[source] var/mutable_appearance/relay_appearance = new(effect_relay.appearance) relay_appearance.transform = new_transform effect_relay.appearance = relay_appearance @@ -281,10 +287,13 @@ GLOBAL_LIST_INIT(immerse_ignored_movable, typecacheof(list( /datum/element/immerse/proc/on_spin_animation(atom/source, speed, loops, segments, segment) SIGNAL_HANDLER var/atom/movable/immerse_mask/immerse_mask = generated_visual_overlays[source] - immerse_mask.do_spin_animation(speed, loops, segments, -segment) + if (immerse_mask) + immerse_mask.do_spin_animation(speed, loops, segments, -segment) /datum/element/immerse/proc/on_update_offsets(mob/living/source, new_x, new_y, new_w, new_z, animate) SIGNAL_HANDLER + if (!generated_visual_overlays[source]) + return var/old_height = ceil(max(ICON_SIZE_Y - source.pixel_z, ICON_SIZE_Y) / ICON_SIZE_Y) var/new_height = ceil(max(ICON_SIZE_Y - new_z, ICON_SIZE_Y) / ICON_SIZE_Y) if (old_height != new_height) diff --git a/code/datums/elements/leeching_walk.dm b/code/datums/elements/leeching_walk.dm index f5148b43a5a5..2ad01fc12d90 100644 --- a/code/datums/elements/leeching_walk.dm +++ b/code/datums/elements/leeching_walk.dm @@ -1,5 +1,6 @@ /// Buffs and heals the target while standing on rust. /datum/element/leeching_walk + var/healing_multiplier = 1.0 // How much healing to do /datum/element/leeching_walk/Attach(datum/target) . = ..() @@ -43,17 +44,24 @@ // Heals all damage + Stamina var/need_mob_update = FALSE var/delta_time = DELTA_WORLD_TIME(SSmobs) * 0.5 // SSmobs.wait is 2 secs, so this should be halved. - need_mob_update += source.adjustBruteLoss(-3 * delta_time, updating_health = FALSE) - need_mob_update += source.adjustFireLoss(-3 * delta_time, updating_health = FALSE) - need_mob_update += source.adjustToxLoss(-3 * delta_time, updating_health = FALSE, forced = TRUE) // Slimes are people too - need_mob_update += source.adjustOxyLoss(-1.5 * delta_time, updating_health = FALSE) - need_mob_update += source.adjustStaminaLoss(-10 * delta_time, updating_stamina = FALSE) + need_mob_update += source.adjust_brute_loss(-3 * delta_time * healing_multiplier, updating_health = FALSE) + need_mob_update += source.adjust_fire_loss(-3 * delta_time * healing_multiplier, updating_health = FALSE) + need_mob_update += source.adjust_tox_loss(-3 * delta_time * healing_multiplier, updating_health = FALSE, forced = TRUE) // Slimes are people too + need_mob_update += source.adjust_oxy_loss(-1.5 * delta_time * healing_multiplier, updating_health = FALSE) + need_mob_update += source.adjust_stamina_loss(-10 * delta_time * healing_multiplier, updating_stamina = FALSE) if(need_mob_update) source.updatehealth() + new /obj/effect/temp_visual/heal(get_turf(source), COLOR_BROWN) // Reduces duration of stuns/etc source.AdjustAllImmobility((-0.5 SECONDS) * delta_time) // Heals blood loss - if(source.blood_volume < BLOOD_VOLUME_NORMAL) - source.blood_volume += 2.5 * delta_time + source.adjust_blood_volume(2.5 * delta_time, maximum = BLOOD_VOLUME_NORMAL) // Slowly regulates your body temp source.adjust_bodytemperature((source.get_body_temp_normal() - source.bodytemperature) / 5) + +/datum/element/leeching_walk/minor + healing_multiplier = 0.5 + +// Minor variant which heals slightly less and no baton resistance +/datum/element/leeching_walk/minor/on_move(mob/source, atom/old_loc, dir, forced, list/old_locs) + return diff --git a/code/datums/elements/light_eater.dm b/code/datums/elements/light_eater.dm index c13712cbce8f..6338b7ca2c4e 100644 --- a/code/datums/elements/light_eater.dm +++ b/code/datums/elements/light_eater.dm @@ -128,6 +128,12 @@ /datum/element/light_eater/proc/on_interacting_with(obj/item/source, mob/living/user, atom/target) SIGNAL_HANDLER if(eat_lights(target, source)) + if (ismob(target)) + var/mob/hit_user = target + if (hit_user.pulling) + var/atom/pulled_thing = hit_user.pulling // potentially dragging a light + if (!isliving(pulled_thing)) // we don't want conga lines to be affected + eat_lights(pulled_thing, source) // do a "pretend" attack if we're hitting something that can't normally be if(isobj(target)) var/obj/smacking = target diff --git a/code/datums/elements/noticable_organ.dm b/code/datums/elements/noticable_organ.dm index a6247d18bb53..7feac28d8d79 100644 --- a/code/datums/elements/noticable_organ.dm +++ b/code/datums/elements/noticable_organ.dm @@ -34,9 +34,7 @@ /// Proc that returns true or false if the organ should show its examine check. /datum/element/noticable_organ/proc/should_show_text(mob/living/carbon/examined) - if(body_zone && (body_zone in examined.get_covered_body_zones())) - return FALSE - return TRUE + return examined.is_location_accessible(body_zone) /datum/element/noticable_organ/proc/enable_description(obj/item/organ/target, mob/living/carbon/receiver) SIGNAL_HANDLER diff --git a/code/datums/elements/nullrod_core.dm b/code/datums/elements/nullrod_core.dm new file mode 100644 index 000000000000..020874777d5f --- /dev/null +++ b/code/datums/elements/nullrod_core.dm @@ -0,0 +1,38 @@ +///Proxy element that attaches components, elements and traits that are common to more or less all nullrods. +/datum/element/nullrod_core + +/** + * Called when the element is added to a datum. If the 'chaplain_spawnable' arg is TRUE and unit testing is enabled, + * we check that the target is actually in the nullrod_variants global list + */ +/datum/element/nullrod_core/Attach(obj/item/target, chaplain_spawnable = TRUE, rune_remove_line = "BEGONE FOUL MAGIKS!!") + . = ..() + if(!istype(target)) + return ELEMENT_INCOMPATIBLE + + target.AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY) + target.AddComponent(/datum/component/effect_remover, \ + success_feedback = "You disrupt the magic of %THEEFFECT with %THEWEAPON.", \ + success_forcesay = rune_remove_line, \ + tip_text = "Clear rune", \ + on_clear_callback = CALLBACK(src, PROC_REF(on_cult_rune_removed), target), \ + effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune, /obj/effect/cosmic_rune), \ + ) + target.AddElement(/datum/element/bane, mob_biotypes = MOB_SPIRIT, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE) + ADD_TRAIT(target, TRAIT_NULLROD_ITEM, ELEMENT_TRAIT(type)) + + if(!PERFORM_ALL_TESTS(focus_only/nullrod_variants) || !chaplain_spawnable) + return + + if(!GLOB.nullrod_variants[target.type]) + stack_trace("[target.type] is absent from the nullrod_variants global list. Please include it.") + +/// Callback for effect remover, invoked when a cult rune is cleared +/datum/element/nullrod_core/proc/on_cult_rune_removed(obj/item/nullrod, 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 [nullrod]", LOG_GAME) + SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] = TRUE diff --git a/code/datums/elements/openspace_item_click_handler.dm b/code/datums/elements/openspace_item_click_handler.dm index 9059223fb0c3..b43ec92a2bc4 100644 --- a/code/datums/elements/openspace_item_click_handler.dm +++ b/code/datums/elements/openspace_item_click_handler.dm @@ -20,7 +20,7 @@ if((target.z == 0) || (user.z == 0) || target.z == user.z) return NONE var/turf/target_turf = parse_caught_click_modifiers(modifiers, get_turf(user.client?.eye || user), user.client) - if(target_turf?.z == user.z && user.CanReach(target_turf, source)) + if(target_turf?.z == user.z && target_turf.IsReachableBy(user, source?.reach)) INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item, handle_openspace_click), target_turf, user, modifiers) return ITEM_INTERACT_BLOCKING return NONE diff --git a/code/datums/elements/organ_set_bonus.dm b/code/datums/elements/organ_set_bonus.dm index fa6b272897a0..07d7e2474d22 100644 --- a/code/datums/elements/organ_set_bonus.dm +++ b/code/datums/elements/organ_set_bonus.dm @@ -106,6 +106,8 @@ RegisterSignal(carbon_owner, COMSIG_CARBON_REMOVE_LIMB, PROC_REF(untexture_limb)) for(var/obj/item/bodypart/limb as anything in carbon_owner.bodyparts) + if (!(limb.bodytype & BODYTYPE_ORGANIC)) + continue limb.add_bodypart_overlay(new limb_overlay(), update = FALSE) if (color_overlay_priority) limb.add_color_override(COLOR_WHITE, color_overlay_priority) @@ -150,6 +152,9 @@ /datum/status_effect/organ_set_bonus/proc/texture_limb(atom/source, obj/item/bodypart/limb) SIGNAL_HANDLER + if (!(limb.bodytype & BODYTYPE_ORGANIC)) + return + // Not updating because enable/disable_bonus(obj/item/organ/removed_organ) call it down the line, and calls coming from comsigs update the owner's body themselves limb.add_bodypart_overlay(new limb_overlay(), update = FALSE) if(color_overlay_priority) diff --git a/code/datums/elements/raptor_food.dm b/code/datums/elements/raptor_food.dm new file mode 100644 index 000000000000..514509eaaba2 --- /dev/null +++ b/code/datums/elements/raptor_food.dm @@ -0,0 +1,87 @@ +/// Element which influences raptor children upon owner's consumption as food +/datum/element/raptor_food + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// Flat damage modifier + var/attack_modifier = null + /// Flat health modifier + var/health_modifier = null + /// Speed modifier + var/speed_modifier = null + /// Primary ability stat modifier + /// Multiplier equates to 1 + this + var/ability_modifier = null + /// Growth rate modifier + /// Multiplier equates to 1 + this + var/growth_modifier = null + /// Personality traits the child may get + var/list/personality_traits = null + /// Offspring color probability modifiers + var/list/color_chances = null + +/datum/element/raptor_food/Attach(obj/item/target, attack_modifier, health_modifier, speed_modifier, ability_modifier, growth_modifier, list/personality_traits, list/color_chances) + . = ..() + if (!isitem(target)) + return ELEMENT_INCOMPATIBLE + src.attack_modifier = attack_modifier + src.health_modifier = health_modifier + src.speed_modifier = speed_modifier + src.ability_modifier = ability_modifier + src.growth_modifier = growth_modifier + src.personality_traits = personality_traits + src.color_chances = color_chances + RegisterSignal(target, COMSIG_ITEM_EATEN_BY_BASIC_MOB, PROC_REF(on_eaten)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examine_more)) + +/datum/element/raptor_food/Detach(datum/source, ...) + UnregisterSignal(source, list(COMSIG_ITEM_EATEN_BY_BASIC_MOB, COMSIG_ATOM_EXAMINE_MORE)) + return ..() + +/datum/element/raptor_food/proc/on_examine_more(obj/item/source, mob/examiner, list/examine_list) + SIGNAL_HANDLER + + if (!istype(examiner.buckled, /mob/living/basic/raptor)) + return + + // Just to check for priority + var/strognest_effect = max(attack_modifier, health_modifier, speed_modifier, ability_modifier, growth_modifier, 0) + + // Only personality or color probability effects, or just pure negatives + if (strognest_effect == 0) + examine_list += span_notice("You reckon this would have unique effects on your raptor's offspring if you fed it to them...") + return + + if (strognest_effect == attack_modifier) + examine_list += span_notice("You reckon this would have make your raptor's offspring stronger if you fed it to them...") + else if (strognest_effect == health_modifier) + examine_list += span_notice("You reckon this would have make your raptor's offspring tougher if you fed it to them...") + else if (strognest_effect == speed_modifier) + examine_list += span_notice("You reckon this would have make your raptor's offspring faster if you fed it to them...") + else if (strognest_effect == ability_modifier) + examine_list += span_notice("You reckon this would have make your raptor's offspring more capable if you fed it to them...") + else if (strognest_effect == growth_modifier) + examine_list += span_notice("You reckon this would have make your raptor's offspring grow faster if you fed it to them...") + +/datum/element/raptor_food/proc/on_eaten(obj/item/source, mob/living/eater, mob/living/feeder) + SIGNAL_HANDLER + + if (!istype(eater, /mob/living/basic/raptor)) + return + + var/mob/living/basic/raptor/raptor = eater + var/list/our_food = raptor.inherited_stats.foods_eaten[source.type] + if (our_food) + our_food["amount"] += 1 + return + + raptor.inherited_stats.foods_eaten[source.type] = list( + "amount" = 1, + "attack" = attack_modifier, + "health" = health_modifier, + "speed" = speed_modifier, + "ability" = ability_modifier, + "growth" = growth_modifier, + "traits" = personality_traits?.Copy(), + "color_chances" = color_chances?.Copy(), + ) + diff --git a/code/datums/elements/reagent_scoopable_atom.dm b/code/datums/elements/reagent_scoopable_atom.dm new file mode 100644 index 000000000000..dddd7f79e4e4 --- /dev/null +++ b/code/datums/elements/reagent_scoopable_atom.dm @@ -0,0 +1,37 @@ +/datum/element/reagent_scoopable_atom + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH_ON_HOST_DESTROY + argument_hash_start_idx = 2 + var/datum/reagent/reagent_to_extract + +/datum/element/reagent_scoopable_atom/Attach(datum/target, reagent_to_extract) + . = ..() + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + if(!reagent_to_extract) + CRASH("[type] added to [target] without any reagent specified.") + src.reagent_to_extract = reagent_to_extract + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(target, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(on_item_interaction)) + +/datum/element/reagent_scoopable_atom/Detach(datum/source, ...) + UnregisterSignal(source, list(COMSIG_ATOM_EXAMINE, COMSIG_ATOM_ITEM_INTERACTION)) + return ..() + +/datum/element/reagent_scoopable_atom/proc/on_examine(atom/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + examine_list += span_info("Some [reagent_to_extract::name] could probably be scooped up with a container.") + +/datum/element/reagent_scoopable_atom/proc/on_item_interaction(atom/source, mob/living/user, obj/item/tool, list/modifiers) + SIGNAL_HANDLER + + if(tool.is_open_container()) + return extract_reagents(source, tool, user) + +/datum/element/reagent_scoopable_atom/proc/extract_reagents(atom/source, obj/item/container, mob/living/user) + if(!reagent_to_extract) + return ITEM_INTERACT_BLOCKING + if(!container.reagents.add_reagent(reagent_to_extract, rand(5, 10))) + to_chat(user, span_warning("[container] is full.")) + user.visible_message(span_notice("[user] scoops [reagent_to_extract::name] from the [source] with [container]."), span_notice("You scoop out [reagent_to_extract::name] from the [src] using [container].")) + return ITEM_INTERACT_SUCCESS diff --git a/code/datums/elements/relay_attackers.dm b/code/datums/elements/relay_attackers.dm index 5d16fbb4e1bb..5dfef67a1191 100644 --- a/code/datums/elements/relay_attackers.dm +++ b/code/datums/elements/relay_attackers.dm @@ -16,6 +16,7 @@ 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)) + RegisterSignal(target, COMSIG_POWER_ACTIVATE_ON, PROC_REF(on_power_use)) // DARKPACK EDIT ADD ADD_TRAIT(target, TRAIT_RELAYING_ATTACKER, REF(src)) /datum/element/relay_attackers/Detach(datum/source, ...) @@ -31,6 +32,7 @@ COMSIG_ATOM_PREHITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_MECH, + COMSIG_POWER_ACTIVATE_ON, // DARKPACK EDIT ADD )) REMOVE_TRAIT(source, TRAIT_RELAYING_ATTACKER, REF(src)) @@ -74,8 +76,8 @@ var/obj/item/hit_item = hit_atom if(!hit_item.throwforce) return - var/mob/thrown_by = throwingdatum?.get_thrower() - if(!ismob(thrown_by)) + var/atom/thrown_by = throwingdatum?.get_thrower() + if(!istype(thrown_by)) return relay_attacker(target, thrown_by, hit_item.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : ATTACKER_DAMAGING_ATTACK) @@ -87,6 +89,14 @@ SIGNAL_HANDLER relay_attacker(target, mecha_attacker, ATTACKER_DAMAGING_ATTACK) +// DARKPACK EDIT ADD START +/datum/element/relay_attackers/proc/on_power_use(atom/target, datum/discipline_power/used_power, hostile_usage) + SIGNAL_HANDLER + + if(hostile_usage) + relay_attacker(target, used_power.discipline.owner, ATTACKER_DAMAGING_ATTACK) +// DARKPACK EDIT ADD END + /// 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, attack_flags) SEND_SIGNAL(victim, COMSIG_ATOM_WAS_ATTACKED, attacker, attack_flags) diff --git a/code/datums/elements/rotation.dm b/code/datums/elements/rotation.dm new file mode 100644 index 000000000000..6d4441659458 --- /dev/null +++ b/code/datums/elements/rotation.dm @@ -0,0 +1,136 @@ +/datum/element/simple_rotation + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// Rotation flags for special behavior + var/rotation_flags + +/** + * Adds the ability to rotate an object by Alt-click or using Right-click verbs. + * + * args: + * * rotation_flags (optional) Bitflags that determine behavior for rotation (defined at the top of this file) + * * post_rotation (optional) Callback proc that is used after the object is rotated (sound effects, balloon alerts, etc.) + **/ +/datum/element/simple_rotation/Attach(datum/target, rotation_flags = NONE) + . = ..() + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + + var/atom/movable/source = target + source.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 + + src.rotation_flags = rotation_flags + + RegisterSignal(target, COMSIG_CLICK_ALT, PROC_REF(rotate_left)) + RegisterSignal(target, COMSIG_CLICK_ALT_SECONDARY, PROC_REF(rotate_right)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(ExamineMessage)) + RegisterSignal(target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) + +/datum/element/simple_rotation/Detach(datum/source, ...) + . = ..() + UnregisterSignal(source, list( + COMSIG_CLICK_ALT, + COMSIG_CLICK_ALT_SECONDARY, + COMSIG_ATOM_EXAMINE, + COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, + )) + return ..() + +/datum/element/simple_rotation/proc/ExamineMessage(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + if(rotation_flags & ROTATION_REQUIRE_WRENCH) + examine_list += span_notice("This requires a wrench to be rotated.") + +/datum/element/simple_rotation/proc/rotate_right(datum/source, mob/user) + SIGNAL_HANDLER + rotate(user, source, ROTATION_CLOCKWISE) + return CLICK_ACTION_SUCCESS + +/datum/element/simple_rotation/proc/rotate_left(datum/source, mob/user) + SIGNAL_HANDLER + rotate(user, source, ROTATION_COUNTERCLOCKWISE) + return CLICK_ACTION_SUCCESS + +/datum/element/simple_rotation/proc/rotate(mob/user, obj/object_to_rotate, degrees) + if(QDELETED(user)) + CRASH("[src] is being rotated [user ? "with a qdeleting" : "without a"] user") + if(!istype(user)) + CRASH("[src] is being rotated without a user of the wrong type: [user.type]") + if(!isnum(degrees)) + CRASH("[src] is being rotated without providing the amount of degrees needed") + + if(!can_be_rotated(user, object_to_rotate, degrees) || !can_user_rotate(user, object_to_rotate, degrees)) + return + + object_to_rotate.setDir(turn(object_to_rotate.dir, degrees)) + if(rotation_flags & ROTATION_REQUIRE_WRENCH) + playsound(object_to_rotate, 'sound/items/tools/ratchet.ogg', 50, TRUE) + + object_to_rotate.post_rotation(user, degrees) + +/datum/element/simple_rotation/proc/can_user_rotate(mob/user, obj/object_to_rotate, degrees) + if(isliving(user) && user.can_perform_action(object_to_rotate, NEED_DEXTERITY)) + return TRUE + if((rotation_flags & ROTATION_GHOSTS_ALLOWED) && isobserver(user) && CONFIG_GET(flag/ghost_interaction)) + return TRUE + return FALSE + +/datum/element/simple_rotation/proc/can_be_rotated(mob/user, obj/object_to_rotate, degrees, silent = FALSE) + if(!object_to_rotate.Adjacent(user)) + silent = TRUE + + if(rotation_flags & ROTATION_REQUIRE_WRENCH) + if(!isliving(user)) + return FALSE + var/obj/item/tool = user.get_active_held_item() + if(!tool || tool.tool_behaviour != TOOL_WRENCH) + if(!silent) + object_to_rotate.balloon_alert(user, "need a wrench!") + return FALSE + + if(!(rotation_flags & ROTATION_IGNORE_ANCHORED) && object_to_rotate.anchored) + if(istype(object_to_rotate, /obj/structure/window) && !silent) + object_to_rotate.balloon_alert(user, "need to unscrew!") + else if(!silent) + object_to_rotate.balloon_alert(user, "need to unwrench!") + return FALSE + + if(rotation_flags & ROTATION_NEEDS_ROOM) + var/target_dir = turn(object_to_rotate.dir, degrees) + var/obj/structure/window/window_to_rotate = object_to_rotate + var/fulltile = istype(window_to_rotate) ? window_to_rotate.fulltile : FALSE + if(!valid_build_direction(object_to_rotate.loc, target_dir, is_fulltile = fulltile)) + if(!silent) + object_to_rotate.balloon_alert(user, "can't rotate in that direction!") + return FALSE + + if(rotation_flags & ROTATION_NEEDS_UNBLOCKED) + var/turf/rotate_turf = get_turf(object_to_rotate) + if(rotate_turf.is_blocked_turf(source_atom = object_to_rotate)) + if(!silent) + object_to_rotate.balloon_alert(user, "rotation is blocked!") + return FALSE + + return TRUE + +// maybe we don't need the item context proc but instead the hand one? since we don't need to check held_item +/datum/element/simple_rotation/proc/on_requesting_context_from_item(atom/source, list/context, obj/item/held_item, mob/user) + SIGNAL_HANDLER + + var/rotation_screentip = FALSE + + if(can_be_rotated(user, source, ROTATION_CLOCKWISE, silent=TRUE)) + context[SCREENTIP_CONTEXT_ALT_LMB] = "Rotate left" + rotation_screentip = TRUE + if(can_be_rotated(user, source, ROTATION_COUNTERCLOCKWISE, silent=TRUE)) + context[SCREENTIP_CONTEXT_ALT_RMB] = "Rotate right" + rotation_screentip = TRUE + + if(rotation_screentip) + return CONTEXTUAL_SCREENTIP_SET + + return NONE + +/// Calld on the atom after it has been successfully rotated +/atom/movable/proc/post_rotation(mob/user, degrees) + return diff --git a/code/datums/elements/rust.dm b/code/datums/elements/rust.dm index 2bc63c127377..91bcd038d57d 100644 --- a/code/datums/elements/rust.dm +++ b/code/datums/elements/rust.dm @@ -36,7 +36,7 @@ /datum/element/rust/proc/handle_examine(datum/source, mob/user, list/examine_text) SIGNAL_HANDLER - examine_text += span_notice("[source] is very rusty, you could probably burn or scrape it off.") + examine_text += span_notice("[source] is very rusty, you could probably burn or scrape it off, hell maybe even pour some space cola on it to remove the rust.") /datum/element/rust/proc/apply_rust_overlay(atom/parent_atom, list/overlays) SIGNAL_HANDLER @@ -115,6 +115,10 @@ /datum/element/rust/heretic/proc/on_entered(turf/source, atom/movable/entered, ...) SIGNAL_HANDLER + if(ismecha(entered)) + var/obj/vehicle/sealed/mecha/victim = entered + victim.take_damage(20, armour_penetration = 100) + return if(!isliving(entered)) return var/mob/living/victim = entered diff --git a/code/datums/elements/spooky.dm b/code/datums/elements/spooky.dm index 8edd90dbc25b..85daaaeda78d 100644 --- a/code/datums/elements/spooky.dm +++ b/code/datums/elements/spooky.dm @@ -58,14 +58,14 @@ if(bone_amount) human.set_jitter_if_lower(12 SECONDS * bone_amount) human.set_stutter(6.5 SECONDS * bone_amount) - human.adjustStaminaLoss(3 * bone_amount * stam_dam_mult) + human.adjust_stamina_loss(3 * bone_amount * stam_dam_mult) if(iszombie(human)) - human.adjustStaminaLoss(25) + human.adjust_stamina_loss(25) human.Paralyze(15) //zombies can't resist the doot return bone_amount /datum/element/spooky/proc/spectral_change(mob/living/carbon/human/human, mob/living/user, obj/item/source) - if(human.getStaminaLoss() <= 95) + if(human.get_stamina_loss() <= 95) return if(single_use) diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm index 85f2fe6ca60f..47e38079c725 100644 --- a/code/datums/elements/strippable.dm +++ b/code/datums/elements/strippable.dm @@ -182,9 +182,14 @@ * All string keys in the list must be inside tgui\packages\tgui\interfaces\StripMenu.tsx * You can also return null if there are no alternate actions. */ -/datum/strippable_item/proc/get_alternate_actions(atom/source, mob/user) +/datum/strippable_item/proc/get_alternate_actions(atom/source, mob/user, obj/item/item) RETURN_TYPE(/list) - return null + SHOULD_CALL_PARENT(TRUE) + + var/list/alt_actions = list() + if(item) + SEND_SIGNAL(item, COMSIG_ITEM_GET_STRIPPABLE_ALT_ACTIONS, source, user, alt_actions) + return alt_actions /** * Performs an alternate action on this strippable_item. @@ -193,9 +198,9 @@ * - action_key: The key of the alternate action to perform. * Returns FALSE if unable to perform the action; whether it be due to the signal or some other factor. */ -/datum/strippable_item/proc/perform_alternate_action(atom/source, mob/user, action_key) +/datum/strippable_item/proc/perform_alternate_action(atom/source, mob/user, action_key, obj/item/item) SHOULD_CALL_PARENT(TRUE) - if(SEND_SIGNAL(user, COMSIG_TRY_ALT_ACTION, source, action_key) & COMPONENT_CANT_ALT_ACTION) + if(item && SEND_SIGNAL(item, COMSIG_ITEM_STRIPPABLE_ALT_ACTION, source, user, action_key) & COMPONENT_ALT_ACTION_DONE) return FALSE return TRUE @@ -373,9 +378,10 @@ LAZYINITLIST(result) - result["icon"] = icon2base64(icon(item.icon, item.icon_state)) + result["icon"] = icon2base64(icon(item.icon, item.icon_state, frame = 1)) result["name"] = item.name - result["alternate"] = item_data.get_alternate_actions(owner, user) + result["alternate"] = item_data.get_alternate_actions(owner, user, item) + list_clear_nulls(result["alternate"]) var/static/list/already_cried = list() if(length(result["alternate"]) > 3 && !(type in already_cried)) stack_trace("Too many alternate actions for [type]! Only three are supported at the moment! This will look bad!") @@ -486,16 +492,14 @@ return var/item = strippable_item.get_item(owner) - if (isnull(item)) - return - if (!(alt_action in strippable_item.get_alternate_actions(owner, user))) + if (!(alt_action in strippable_item.get_alternate_actions(owner, user, item))) return LAZYORASSOCLIST(interactions, user, key) // Potentially yielding - strippable_item.perform_alternate_action(owner, user, alt_action) + strippable_item.perform_alternate_action(owner, user, alt_action, item) LAZYREMOVEASSOC(interactions, user, key) diff --git a/code/datums/elements/surgery_aid.dm b/code/datums/elements/surgery_aid.dm new file mode 100644 index 000000000000..ca351cc6a56c --- /dev/null +++ b/code/datums/elements/surgery_aid.dm @@ -0,0 +1,151 @@ +/// Item can be applied to mobs to prepare them for surgery (allowing people to operate on them) +/datum/element/surgery_aid + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// The name of the aid, for examine and messages, in plural form + var/aid_name + +/datum/element/surgery_aid/Attach(datum/target, aid_name = "things") + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + src.aid_name = aid_name + RegisterSignal(target, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET, PROC_REF(on_context)) + RegisterSignal(target, COMSIG_ITEM_INTERACTING_WITH_ATOM, PROC_REF(on_item_interaction)) + + var/obj/item/realtarget = target + realtarget.item_flags |= ITEM_HAS_CONTEXTUAL_SCREENTIPS + +/datum/element/surgery_aid/Detach(datum/target) + . = ..() + UnregisterSignal(target, list(COMSIG_ITEM_INTERACTING_WITH_ATOM, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET)) + +/datum/element/surgery_aid/proc/on_context(obj/item/source, list/context, atom/target, mob/living/user) + SIGNAL_HANDLER + + if(!isliving(target)) + return NONE + + var/mob/living/target_mob = target + if(!target_mob.has_limbs) + context[SCREENTIP_CONTEXT_LMB] = HAS_TRAIT(source, TRAIT_READY_TO_OPERATE) ? "Remove [aid_name]" : "Prepare for surgery" + return CONTEXTUAL_SCREENTIP_SET + + var/obj/item/bodypart/precise_part = target_mob.get_bodypart(deprecise_zone(user.zone_selected)) || target_mob.get_bodypart(BODY_ZONE_CHEST) + context[SCREENTIP_CONTEXT_LMB] = HAS_TRAIT(precise_part, TRAIT_READY_TO_OPERATE) ? "Remove [aid_name]" : "Prepare [precise_part.plaintext_zone] for surgery" + return CONTEXTUAL_SCREENTIP_SET + +/datum/element/surgery_aid/proc/on_item_interaction(datum/source, mob/living/user, atom/target, ...) + SIGNAL_HANDLER + + if(!isliving(target)) + return NONE + + var/mob/living/target_mob = target + var/obj/item/bodypart/precise_part = target_mob.get_bodypart(deprecise_zone(user.zone_selected)) || target_mob.get_bodypart(BODY_ZONE_CHEST) + surgery_prep(target_mob, user, precise_part?.body_zone || BODY_ZONE_CHEST, aid_name) + return ITEM_INTERACT_SUCCESS + +/datum/element/surgery_aid/proc/surgery_prep(mob/living/target_mob, mob/living/surgeon, body_zone) + var/datum/status_effect/surgery_prepped/prep = target_mob.has_status_effect(__IMPLIED_TYPE__) + if(isnull(prep) || !(body_zone in prep.zones)) + target_mob.apply_status_effect(/datum/status_effect/surgery_prepped, body_zone, aid_name) + target_mob.balloon_alert(surgeon, "[parse_zone(body_zone)] surgery prepared") + return + prep.untrack_surgery(body_zone) + target_mob.balloon_alert(surgeon, "surgery cleared") + +/// Tracks which body zones have been prepped for surgery +/datum/status_effect/surgery_prepped + id = "surgery_prepped" + alert_type = null + status_type = STATUS_EFFECT_REFRESH + processing_speed = STATUS_EFFECT_NORMAL_PROCESS + tick_interval = 2 SECONDS + + /// Lazylist of zones being prepped, if empty we should not exist + var/list/zones + /// Lazylist of the names of all surgical aids used, for examine + var/list/surgical_aids + /// Counts movements while standing up - removes the effect if we move too much + var/movement_counter = 0 + +/datum/status_effect/surgery_prepped/on_creation(mob/living/new_owner, target_zone, aid_name = "things") + . = ..() + track_surgery(target_zone) + LAZYOR(surgical_aids, aid_name) + ADD_TRAIT(owner, TRAIT_READY_TO_OPERATE, TRAIT_STATUS_EFFECT(id)) // needs to happen after tracking starts + +/datum/status_effect/surgery_prepped/refresh(mob/living/new_owner, target_zone, aid_name = "things") + track_surgery(target_zone) + LAZYOR(surgical_aids, aid_name) + +/datum/status_effect/surgery_prepped/on_apply() + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + RegisterSignal(owner, COMSIG_CARBON_POST_ATTACH_LIMB, PROC_REF(on_attach_limb)) + RegisterSignal(owner, COMSIG_CARBON_POST_REMOVE_LIMB, PROC_REF(on_detach_limb)) + return TRUE + +/datum/status_effect/surgery_prepped/on_remove() + for(var/zone in zones) + untrack_surgery(zone) + REMOVE_TRAIT(owner, TRAIT_READY_TO_OPERATE, TRAIT_STATUS_EFFECT(id)) + UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_POST_ATTACH_LIMB, COMSIG_CARBON_POST_REMOVE_LIMB)) + +/datum/status_effect/surgery_prepped/get_examine_text() + var/list/zones_readable = list() + // give the body zones a consistent order, the same order as GLOB.all_body_zones + for(var/zone in GLOB.all_body_zones & zones) + zones_readable += parse_zone(zone) + + var/list/aid_readable = list() + for(var/aid in surgical_aids) + aid_readable += copytext_char(aid, -1) == "s" ? aid : "\a [aid]" + + // "They have surgial drapes and a bedsheet adorning their chest, arms, and legs." + return "[owner.p_They()] [owner.p_have()] [english_list(aid_readable)] adorning [owner.p_their()] [english_list(zones_readable)]." + +/datum/status_effect/surgery_prepped/proc/on_move(datum/source, ...) + SIGNAL_HANDLER + + if(owner.body_position == STANDING_UP) + movement_counter += 1 + if(movement_counter < 4) + return + // "The surgical drapes and bedsheets adorning John fall off!" + owner.visible_message(span_warning("The [english_list(surgical_aids)] adorning [owner] fall off!")) + qdel(src) + +/datum/status_effect/surgery_prepped/proc/on_attach_limb(datum/source, obj/item/bodypart/limb) + SIGNAL_HANDLER + + if(limb.body_zone in zones) + ADD_TRAIT(limb, TRAIT_READY_TO_OPERATE, TRAIT_STATUS_EFFECT(id)) + +/datum/status_effect/surgery_prepped/proc/on_detach_limb(datum/source, obj/item/bodypart/limb) + SIGNAL_HANDLER + + REMOVE_TRAIT(limb, TRAIT_READY_TO_OPERATE, TRAIT_STATUS_EFFECT(id)) + +/datum/status_effect/surgery_prepped/tick(seconds_between_ticks) + if(owner.body_position == LYING_DOWN && movement_counter > 0) + movement_counter -= 1 + +/datum/status_effect/surgery_prepped/proc/track_surgery(body_zone) + LAZYADD(zones, body_zone) + if(iscarbon(owner)) + var/obj/item/bodypart/precise_part = owner.get_bodypart(body_zone) + if(precise_part) + ADD_TRAIT(precise_part, TRAIT_READY_TO_OPERATE, TRAIT_STATUS_EFFECT(id)) + else if(body_zone != BODY_ZONE_CHEST) + stack_trace("Attempting to track surgery on a non-carbon mob with a non-chest body zone! This should not happen.") + +/datum/status_effect/surgery_prepped/proc/untrack_surgery(body_zone) + LAZYREMOVE(zones, body_zone) + if(iscarbon(owner)) + var/obj/item/bodypart/precise_part = owner.get_bodypart(body_zone) + if(precise_part) + REMOVE_TRAIT(precise_part, TRAIT_READY_TO_OPERATE, TRAIT_STATUS_EFFECT(id)) + if(!LAZYLEN(zones) && !QDELETED(src)) + qdel(src) // no more zones to track, remove the status effect diff --git a/code/datums/elements/swimming_tile.dm b/code/datums/elements/swimming_tile.dm index 738a8d315efb..3f825942aaa8 100644 --- a/code/datums/elements/swimming_tile.dm +++ b/code/datums/elements/swimming_tile.dm @@ -11,6 +11,12 @@ var/ticking_oxy_damage /// Probability to exhaust our swimmer var/exhaust_swimmer_prob + /// Tracked list of all mobs that are present in our turfs + var/list/mob/swimmers = list() + +/datum/element/swimming_tile/Destroy(force) + swimmers = null + return ..() /datum/element/swimming_tile/Attach(turf/target, stamina_entry_cost = 7, ticking_stamina_cost = 5, ticking_oxy_damage = 2, exhaust_swimmer_prob = 30) . = ..() @@ -39,41 +45,59 @@ /// When something enters the water set up to start drowning it /datum/element/swimming_tile/proc/enter_water(atom/source, mob/living/swimmer) SIGNAL_HANDLER - if (!istype(swimmer)) + + if(!istype(swimmer)) return - RegisterSignal(swimmer, SIGNAL_ADDTRAIT(TRAIT_IMMERSED), PROC_REF(dip_in)) + + if(QDELETED(swimmer)) + return + if(HAS_TRAIT(swimmer, TRAIT_IMMERSED)) dip_in(swimmer) + if(swimmer in swimmers) + return + + RegisterSignal(swimmer, SIGNAL_ADDTRAIT(TRAIT_IMMERSED), PROC_REF(dip_in)) + RegisterSignal(swimmer, COMSIG_QDELETING, PROC_REF(on_swimmer_del)) + swimmers |= swimmer + /// When something exits the water it probably shouldn't drowning /datum/element/swimming_tile/proc/out_of_water(atom/source, mob/living/landlubber) SIGNAL_HANDLER - UnregisterSignal(landlubber, list(SIGNAL_ADDTRAIT(TRAIT_IMMERSED))) + UnregisterSignal(landlubber, list(SIGNAL_ADDTRAIT(TRAIT_IMMERSED), COMSIG_QDELETING)) + swimmers -= landlubber + +/datum/element/swimming_tile/proc/on_swimmer_del(atom/source) + SIGNAL_HANDLER + out_of_water(null, source) /// When we've validated that someone is actually in the water start drowning the-I mean, start swimming! /datum/element/swimming_tile/proc/dip_in(mob/living/floater) SIGNAL_HANDLER - if ((!HAS_TRAIT(floater, TRAIT_SWIMMER) && (isnull(floater.buckled) || (!isvehicle(floater.buckled) && !ismob(floater.buckled))) && prob(exhaust_swimmer_prob))) - - //First, we determine our effective stamina entry cost baseline. This includes the value from the water, as well as any heavy clothing being worn. The strength trait halves this value. - var/effective_stamina_entry_cost = HAS_TRAIT(floater, TRAIT_STRENGTH) ? (stamina_entry_cost + clothing_weight(floater)) : ((stamina_entry_cost + clothing_weight(floater)) / 2) + if(HAS_TRAIT(floater, TRAIT_SWIMMER) || (isvehicle(floater.buckled) || ismob(floater.buckled)) || !prob(exhaust_swimmer_prob)) + // Apply the status anyway for when they stop riding + floater.apply_status_effect(/datum/status_effect/swimming, ticking_stamina_cost, ticking_oxy_damage) + return - //Being in high gravity doubles our effective stamina cost - var/gravity_modifier = floater.has_gravity() > STANDARD_GRAVITY ? 2 : 1 + //First, we determine our effective stamina entry cost baseline. This includes the value from the water, as well as any heavy clothing being worn. The strength trait halves this value. + var/effective_stamina_entry_cost = HAS_TRAIT(floater, TRAIT_STRENGTH) ? (stamina_entry_cost + clothing_weight(floater)) : ((stamina_entry_cost + clothing_weight(floater)) / 2) - //If our floater has a specialized spine, include that as a factor. - var/obj/item/organ/cyberimp/chest/spine/potential_spine = floater.get_organ_slot(ORGAN_SLOT_SPINE) - if(istype(potential_spine)) - effective_stamina_entry_cost *= potential_spine.athletics_boost_multiplier + //Being in high gravity doubles our effective stamina cost + var/gravity_modifier = floater.has_gravity() > STANDARD_GRAVITY ? 2 : 1 - //Finally, we get our athletics skill as a reduction to the stamina cost. This is a direct reduction. - var/athletics_skill = (floater.mind?.get_skill_level(/datum/skill/athletics) || 1) - 1 + //If our floater has a specialized spine, include that as a factor. + var/obj/item/organ/cyberimp/chest/spine/potential_spine = floater.get_organ_slot(ORGAN_SLOT_SPINE) + if(istype(potential_spine)) + effective_stamina_entry_cost *= potential_spine.athletics_boost_multiplier - floater.apply_damage(clamp((effective_stamina_entry_cost - athletics_skill) * gravity_modifier, 1, 100), STAMINA) - floater.mind?.adjust_experience(/datum/skill/athletics, (stamina_entry_cost * gravity_modifier) * 0.1) - floater.apply_status_effect(/datum/status_effect/exercised, 15 SECONDS) + //Finally, we get our athletics skill as a reduction to the stamina cost. This is a direct reduction. + var/athletics_skill = (floater.mind?.get_skill_level(/datum/skill/athletics) || 1) - 1 + floater.apply_damage(clamp((effective_stamina_entry_cost - athletics_skill) * gravity_modifier, 1, 100), STAMINA) + floater.mind?.adjust_experience(/datum/skill/athletics, (stamina_entry_cost * gravity_modifier) * 0.1) + floater.apply_status_effect(/datum/status_effect/exercised, 15 SECONDS) floater.apply_status_effect(/datum/status_effect/swimming, ticking_stamina_cost, ticking_oxy_damage) // Apply the status anyway for when they stop riding /// The weight of our swimmers clothing, including slowdown, impacts the amount of stamina damage dealt on dipping in. diff --git a/code/datums/elements/table_smash.dm b/code/datums/elements/table_smash.dm new file mode 100644 index 000000000000..b0c9c2b7d056 --- /dev/null +++ b/code/datums/elements/table_smash.dm @@ -0,0 +1,198 @@ +/// Component which allows mobs to be smashed onto this surface like a wrestling move +/datum/element/table_smash + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// If true, mobs will be placed gently on the table even if they're in an aggressive grab + var/gentle_push + +/datum/element/table_smash/Attach(datum/target, gentle_push = FALSE) + . = ..() + if (!isobj(target)) + return ELEMENT_INCOMPATIBLE + + src.gentle_push = gentle_push + + RegisterSignal(target, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_interaction)) + RegisterSignal(target, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(on_item_interaction)) + + var/static/list/loc_connections = list( + COMSIG_LIVING_DISARM_COLLIDE = TYPE_PROC_REF(/obj/structure/table, on_pushed_into), + ) + target.AddComponent(/datum/component/connect_loc_behalf, target, loc_connections) + +/datum/element/table_smash/Detach(datum/source, ...) + . = ..() + UnregisterSignal(source, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ITEM_INTERACTION)) + +/// Called when someone clicks on our surface +/datum/element/table_smash/proc/on_interaction(datum/source, mob/user) + SIGNAL_HANDLER + + var/obj/source_obj = source + if (!source_obj.Adjacent(user) || !user.pulling) + return + + if (!isliving(user.pulling)) + if (!(user.pulling.pass_flags & PASSTABLE)) + return + + user.Move_Pulled(source_obj) + + if (user.pulling.loc == source_obj.loc) + user.visible_message(span_notice("[user] places [user.pulling] onto [source_obj]."), + span_notice("You place [user.pulling] onto [source_obj].")) + user.stop_pulling() + + return COMPONENT_CANCEL_ATTACK_CHAIN + + var/mob/living/pushed_mob = user.pulling + if (pushed_mob.buckled) + if (pushed_mob.buckled == source_obj) + //Already buckled to the object, you probably meant to unbuckle them + return + + to_chat(user, span_warning("[pushed_mob] is buckled to [pushed_mob.buckled]!")) + return COMPONENT_CANCEL_ATTACK_CHAIN + + INVOKE_ASYNC(src, PROC_REF(perform_table_smash), source_obj, user) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/// We have a mob being pressed onto the table, but how strongly? +/datum/element/table_smash/proc/perform_table_smash(obj/structure/table/table, mob/living/user) + var/mob/living/pushed_mob = user.pulling + if (user.combat_mode) + switch(user.grab_state) + if (GRAB_PASSIVE) + to_chat(user, span_warning("You need a better grip to do that!")) + return + if (GRAB_AGGRESSIVE) + if (gentle_push) + tableplace(user, pushed_mob, table) + else + tablepush(user, pushed_mob, table) + if (GRAB_NECK to GRAB_KILL) + tablelimbsmash(user, pushed_mob, table) + else + pushed_mob.visible_message(span_notice("[user] begins to place [pushed_mob] onto [table]..."), \ + span_userdanger("[user] begins to place [pushed_mob] onto [table]...")) + if (do_after(user, 3.5 SECONDS, target = pushed_mob)) + tableplace(user, pushed_mob, table) + else + return + + user.stop_pulling() + +/// Called when someone clicks on our surface with an item +/datum/element/table_smash/proc/on_item_interaction(obj/structure/table/table, mob/living/user, obj/item/item, modifiers) + SIGNAL_HANDLER + if (!istype(item, /obj/item/riding_offhand)) + return NONE + + var/obj/item/riding_offhand/riding_item = item + var/mob/living/carried_mob = riding_item.rider + if (carried_mob == user) //Piggyback user. + return NONE + + INVOKE_ASYNC(src, PROC_REF(riding_offhand_act), user, item) + return ITEM_INTERACT_BLOCKING + +/// Called when someone clicks on our surface using a fireman's carry +/datum/element/table_smash/proc/riding_offhand_act(mob/living/user, obj/item/riding_offhand/riding_item, obj/structure/table/table) + var/mob/living/carried_mob = riding_item.rider + if (user.combat_mode) + user.unbuckle_mob(carried_mob) + tablelimbsmash(user, carried_mob) + return ITEM_INTERACT_SUCCESS + + var/tableplace_delay = 3.5 SECONDS + var/skills_space = "" + if (HAS_TRAIT(user, TRAIT_QUICKER_CARRY)) + tableplace_delay = 2 SECONDS + skills_space = " expertly" + else if (HAS_TRAIT(user, TRAIT_QUICK_CARRY)) + tableplace_delay = 2.75 SECONDS + skills_space = " quickly" + + var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) + if (istype(potential_spine)) + tableplace_delay *= potential_spine.athletics_boost_multiplier + + carried_mob.visible_message(span_notice("[user] begins to[skills_space] place [carried_mob] onto [table]..."), + span_userdanger("[user] begins to[skills_space] place [carried_mob] onto [table]...")) + if (!do_after(user, tableplace_delay, target = carried_mob)) + return ITEM_INTERACT_BLOCKING + user.unbuckle_mob(carried_mob) + tableplace(user, carried_mob, table) + return ITEM_INTERACT_SUCCESS + +/// Gently place the mob onto the table +/datum/element/table_smash/proc/tableplace(mob/living/user, mob/living/pushed_mob, obj/structure/table/table) + pushed_mob.forceMove(table.loc) + pushed_mob.set_resting(TRUE, TRUE) + pushed_mob.visible_message(span_notice("[user] places [pushed_mob] onto [table]."), \ + span_notice("[user] places [pushed_mob] onto [table].")) + log_combat(user, pushed_mob, "placed", null, "onto [table]") + +/// Aggressively smash the mob onto the table +/datum/element/table_smash/proc/tablepush(mob/living/user, mob/living/pushed_mob, obj/structure/table/table) + if (HAS_TRAIT(user, TRAIT_PACIFISM)) + to_chat(user, span_danger("Throwing [pushed_mob] onto the table might hurt them!")) + return + + 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(table.loc) + passtable_off(pushed_mob, passtable_key) + if (pushed_mob.loc != table.loc) //Something prevented the tabling + return + + pushed_mob.Knockdown(3 SECONDS) + pushed_mob.apply_damage(10, BRUTE) + pushed_mob.apply_damage(40, STAMINA) + playsound(pushed_mob, 'sound/effects/tableslam.ogg', 90, TRUE) + pushed_mob.visible_message(span_danger("[user] slams [pushed_mob] onto \the [table]!"), \ + span_userdanger("[user] slams you onto \the [table]!")) + log_combat(user, pushed_mob, "tabled", null, "onto [table]") + pushed_mob.add_mood_event("table", /datum/mood_event/table) + SEND_SIGNAL(user, COMSIG_LIVING_TABLE_SLAMMING, pushed_mob, table) + table.after_smash(pushed_mob) + +/// Even more aggressively smash a single part of a mob onto the table +/datum/element/table_smash/proc/tablelimbsmash(mob/living/user, mob/living/pushed_mob, obj/structure/table/table) + pushed_mob.Knockdown(3 SECONDS) + var/obj/item/bodypart/banged_limb = pushed_mob.get_bodypart(user.zone_selected) || pushed_mob.get_bodypart(BODY_ZONE_HEAD) + var/extra_wound = 0 + if (HAS_TRAIT(user, TRAIT_HULK)) + extra_wound = 20 + pushed_mob.apply_damage(30, BRUTE, banged_limb, wound_bonus = extra_wound) + pushed_mob.apply_damage(60, STAMINA) + playsound(pushed_mob, 'sound/effects/bang.ogg', 90, TRUE) + pushed_mob.visible_message(span_danger("[user] smashes [pushed_mob]'s [banged_limb.plaintext_zone] against \the [table]!"), + span_userdanger("[user] smashes your [banged_limb.plaintext_zone] against \the [table]")) + log_combat(user, pushed_mob, "head slammed", null, "against [table]") + pushed_mob.add_mood_event("table", /datum/mood_event/table_limbsmash, banged_limb) + table.take_damage(50) + SEND_SIGNAL(user, COMSIG_LIVING_TABLE_LIMB_SLAMMING, pushed_mob, table) + table.after_smash(pushed_mob) + +/// Called when someone is shoved into our tile +/obj/structure/table/proc/on_pushed_into(datum/source, mob/living/shover, mob/living/target, shove_flags, obj/item/weapon) + SIGNAL_HANDLER + if((shove_flags & SHOVE_KNOCKDOWN_BLOCKED) || !(shove_flags & SHOVE_BLOCKED)) + return + target.Knockdown(SHOVE_KNOCKDOWN_TABLE, daze_amount = 3 SECONDS) + target.visible_message(span_danger("[shover.name] shoves [target.name] onto \the [src]!"), + span_userdanger("You're shoved onto \the [src] by [shover.name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, shover) + to_chat(shover, span_danger("You shove [target.name] onto \the [src]!")) + target.throw_at(src, 1, 1, null, FALSE) //1 speed throws with no spin are basically just forcemoves with a hard collision check + log_combat(shover, target, "shoved", "onto [src] (table)[weapon ? " with [weapon]" : ""]") + after_smash(target) + return COMSIG_LIVING_SHOVE_HANDLED + +/// What happens after something gets smashed onto this table +/obj/structure/table/proc/after_smash(mob/living/smashed_onto) + return diff --git a/code/datums/elements/tool_flash.dm b/code/datums/elements/tool_flash.dm index f17d60970bf5..68a02897f941 100644 --- a/code/datums/elements/tool_flash.dm +++ b/code/datums/elements/tool_flash.dm @@ -33,5 +33,5 @@ /datum/element/tool_flash/proc/flash(datum/source, mob/living/user) SIGNAL_HANDLER - if(user && get_dist(get_turf(source), get_turf(user)) <= 1) + if(user && flash_strength > 0 && get_dist(get_turf(source), get_turf(user)) <= 1) user.flash_act(max(flash_strength,1)) diff --git a/code/datums/elements/tool_renaming.dm b/code/datums/elements/tool_renaming.dm index 729c5fd6a218..7583d27495b5 100644 --- a/code/datums/elements/tool_renaming.dm +++ b/code/datums/elements/tool_renaming.dm @@ -28,15 +28,17 @@ return NONE var/obj/renamed_obj = interacting_with + var/obj/item/tool = source - if(!(renamed_obj.obj_flags & UNIQUE_RENAME)) + if(!(renamed_obj.obj_flags & UNIQUE_RENAME) || !user.can_write(tool)) return NONE - - INVOKE_ASYNC(src, PROC_REF(async_rename), user, renamed_obj) + INVOKE_ASYNC(src, PROC_REF(async_rename), user, renamed_obj, !(renamed_obj.obj_flags & RENAME_NO_DESC)) return ITEM_INTERACT_SUCCESS -/datum/element/tool_renaming/proc/async_rename(mob/living/user, obj/renamed_obj) - var/custom_choice = tgui_input_list(user, "What would you like to edit?", "Customization", list(OPTION_RENAME, OPTION_DESCRIPTION, OPTION_RESET)) +/datum/element/tool_renaming/proc/async_rename(mob/living/user, obj/renamed_obj, description_option) + if(!renamed_obj.rename_checks(user)) + return + var/custom_choice = tgui_input_list(user, "What would you like to edit?", "Customization", list(OPTION_RENAME, description_option? OPTION_DESCRIPTION : null, OPTION_RESET)) if(QDELETED(renamed_obj) || !user.can_perform_action(renamed_obj) || isnull(custom_choice)) return @@ -49,7 +51,7 @@ if(input == old_name || !input) to_chat(user, span_notice("You changed [renamed_obj] to... well... [renamed_obj].")) return - renamed_obj.AddComponent(/datum/component/rename, input, renamed_obj.desc) + renamed_obj.AddComponent(/datum/component/rename, renamed_obj.nameformat(input, user), renamed_obj.desc) to_chat(user, span_notice("You have successfully renamed \the [old_name] to [renamed_obj].")) renamed_obj.update_appearance(UPDATE_NAME) @@ -61,13 +63,14 @@ if(input == old_desc || !input) to_chat(user, span_notice("You decide against changing [renamed_obj]'s description.")) return - renamed_obj.AddComponent(/datum/component/rename, renamed_obj.name, input) + renamed_obj.AddComponent(/datum/component/rename, renamed_obj.name, renamed_obj.descformat(input, user)) to_chat(user, span_notice("You have successfully changed [renamed_obj]'s description.")) renamed_obj.update_appearance(UPDATE_DESC) if(OPTION_RESET) qdel(renamed_obj.GetComponent(/datum/component/rename)) - to_chat(user, span_notice("You have successfully reset [renamed_obj]'s name and description.")) + to_chat(user, span_notice("You have successfully reset [renamed_obj]'s name[renamed_obj.obj_flags & RENAME_NO_DESC? "." : " and description."]")) + renamed_obj.rename_reset() renamed_obj.update_appearance(UPDATE_NAME | UPDATE_DESC) #undef OPTION_RENAME diff --git a/code/datums/elements/watery_tile.dm b/code/datums/elements/watery_tile.dm index 296928f26afd..3c72170ecefe 100644 --- a/code/datums/elements/watery_tile.dm +++ b/code/datums/elements/watery_tile.dm @@ -1,5 +1,11 @@ /datum/element/watery_tile element_flags = ELEMENT_DETACH_ON_HOST_DESTROY + /// List of atoms that are present in this element's turfs + var/list/atom/movable/wet_dogs = list() + +/datum/element/watery_tile/Destroy(force) + wet_dogs = null + return ..() /datum/element/watery_tile/Attach(turf/target) . = ..() @@ -22,11 +28,20 @@ /datum/element/watery_tile/proc/enter_water(atom/source, atom/movable/entered) SIGNAL_HANDLER + if(QDELETED(entered) || HAS_TRAIT(entered, TRAIT_WALLMOUNTED)) + return + + if(HAS_TRAIT(entered, TRAIT_IMMERSED)) + dip_in(entered) + + if(entered in wet_dogs) + return + RegisterSignal(entered, SIGNAL_ADDTRAIT(TRAIT_IMMERSED), PROC_REF(dip_in)) + RegisterSignal(entered, COMSIG_QDELETING, PROC_REF(on_content_del)) if(isliving(entered)) RegisterSignal(entered, SIGNAL_REMOVETRAIT(TRAIT_IMMERSED), PROC_REF(dip_out)) - if(HAS_TRAIT(entered, TRAIT_IMMERSED)) - dip_in(entered) + wet_dogs |= entered /datum/element/watery_tile/proc/dip_in(atom/movable/source) SIGNAL_HANDLER @@ -39,10 +54,15 @@ /datum/element/watery_tile/proc/out_of_water(atom/source, atom/movable/gone) SIGNAL_HANDLER - UnregisterSignal(gone, list(SIGNAL_ADDTRAIT(TRAIT_IMMERSED), SIGNAL_REMOVETRAIT(TRAIT_IMMERSED))) + on_content_del(gone) if(isliving(gone)) dip_out(gone) +/datum/element/watery_tile/proc/on_content_del(atom/movable/source) + SIGNAL_HANDLER + UnregisterSignal(source, list(SIGNAL_ADDTRAIT(TRAIT_IMMERSED), SIGNAL_REMOVETRAIT(TRAIT_IMMERSED), COMSIG_QDELETING)) + wet_dogs -= source + /datum/element/watery_tile/proc/dip_out(mob/living/source) SIGNAL_HANDLER source.remove_status_effect(/datum/status_effect/watery_tile_wetness) diff --git a/code/datums/embedding.dm b/code/datums/embedding.dm index dd6c044f79c4..1c876468350a 100644 --- a/code/datums/embedding.dm +++ b/code/datums/embedding.dm @@ -313,7 +313,7 @@ /// Someone attempted to pull us out! Either the owner by inspecting themselves, or someone else by examining the owner and clicking the link. /datum/embedding/proc/rip_out(mob/living/jack_the_ripper) - if (!jack_the_ripper.CanReach(owner)) + if (!owner.IsReachableBy(jack_the_ripper)) return if (!jack_the_ripper.can_perform_action(owner, FORBID_TELEKINESIS_REACH | NEED_HANDS | ALLOW_RESTING)) diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 65b74962fd9d..396a15b64c66 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -94,13 +94,19 @@ */ /datum/emote/proc/run_emote(mob/user, params, type_override, intentional = FALSE) var/msg = select_message_type(user, message, intentional) - if(params && message_param) - msg = select_param(user, params) + if(params) + if(message_param) + msg = select_param(user, params) + else + msg = params msg = replace_pronoun(user, msg) if(!msg) return + /// Use the type override if it exists + var/running_emote_type = type_override || emote_type + if(user.client) user.log_message(msg, LOG_EMOTE) @@ -116,13 +122,13 @@ playsound(source = user,soundin = tmp_sound,vol = 50, vary = FALSE, ignore_walls = sound_wall_ignore, frequency = frequency) - var/is_important = emote_type & EMOTE_IMPORTANT - var/is_visual = emote_type & EMOTE_VISIBLE - var/is_audible = emote_type & EMOTE_AUDIBLE + var/is_important = running_emote_type & EMOTE_IMPORTANT + var/is_visual = running_emote_type & EMOTE_VISIBLE + var/is_audible = running_emote_type & EMOTE_AUDIBLE var/additional_message_flags = get_message_flags(intentional) // Emote doesn't get printed to chat, runechat only - if(emote_type & EMOTE_RUNECHAT) + if(running_emote_type & EMOTE_RUNECHAT) for(var/mob/viewer as anything in viewers(user)) if(isnull(viewer.client)) continue diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm index 83eb1fb6351b..a1cb30f7032d 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm @@ -227,6 +227,15 @@ name = "Infinity Scarf (Worn)" icon_file = 'icons/mob/clothing/neck.dmi' +/datum/greyscale_config/robe_cape + name = "Robe Cape" + icon_file = 'icons/obj/clothing/neck.dmi' + json_config = 'code/datums/greyscale/json_configs/robe_cape.json' + +/datum/greyscale_config/robe_cape/worn + name = "Robe Cape" + icon_file = 'icons/mob/clothing/neck.dmi' + json_config = 'code/datums/greyscale/json_configs/robe_cape_worn.json' // // GLOVES // diff --git a/code/datums/greyscale/json_configs/robe_cape.json b/code/datums/greyscale/json_configs/robe_cape.json new file mode 100644 index 000000000000..a5ab38d41960 --- /dev/null +++ b/code/datums/greyscale/json_configs/robe_cape.json @@ -0,0 +1,10 @@ +{ + "robe_cape": [ + { + "type": "icon_state", + "icon_state": "robe_cape", + "blend_mode": "overlay", + "color_ids": [1] + } + ] +} diff --git a/code/datums/greyscale/json_configs/robe_cape_worn.json b/code/datums/greyscale/json_configs/robe_cape_worn.json new file mode 100644 index 000000000000..7dd8cd976cda --- /dev/null +++ b/code/datums/greyscale/json_configs/robe_cape_worn.json @@ -0,0 +1,10 @@ +{ + "robe_cape": [ + { + "type": "icon_state", + "icon_state": "robe_cape", + "blend_mode": "overlay", + "color_ids": [1] + } + ] +} diff --git a/code/datums/greyscale/json_configs/ushanka.json b/code/datums/greyscale/json_configs/ushanka.json index 3099b13278b2..5c895a05c145 100644 --- a/code/datums/greyscale/json_configs/ushanka.json +++ b/code/datums/greyscale/json_configs/ushanka.json @@ -6,6 +6,12 @@ "blend_mode": "overlay", "color_ids": [1] }, + { + "type": "icon_state", + "icon_state": "ushanka_fur_up", + "blend_mode": "overlay", + "color_ids": [1] + }, { "type": "icon_state", "icon_state": "ushanka_base_up", @@ -20,11 +26,18 @@ "blend_mode": "overlay", "color_ids": [1] }, + { + "type": "icon_state", + "icon_state": "ushanka_base_2", + "blend_mode": "overlay", + "color_ids": [1] + }, { "type": "icon_state", "icon_state": "ushanka_base", "blend_mode": "overlay", "color_ids": [2] } + ] } diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 8dcaa2ecfaf1..d8fdb8f846b6 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -125,26 +125,53 @@ effect.attach(location) effect.start() -// Safe location finder -/proc/find_safe_turf(zlevel, list/zlevels, extended_safety_checks = FALSE, dense_atoms = FALSE) - if(!zlevels) - if (zlevel) - zlevels = list(zlevel) - else - zlevels = SSmapping.levels_by_trait(ZTRAIT_STATION) - var/cycles = 1000 - for(var/cycle in 1 to cycles) - // DRUNK DIALLING WOOOOOOOOO +/** + * Attempts to find a "safe" floor turf within some given z-levels + * * zlevel_or_levels: The list of z-levels we are searching though. You can supply just a number and it will be turned into a list. + * * extended_safety_checks: Will do some additional checks to make sure the destination is safe, see [/proc/is_safe_turf]. + * * dense_atoms: Will additionally check to see if the turf has any dense obstructions, like machines or structures. + * + * Returns a safe floor turf, + * **BUT** there is a chance of it being null if an extremely large portion of a z-level is unsafe or blocked. + */ +/proc/find_safe_turf(zlevel_or_levels, extended_safety_checks = FALSE, dense_atoms = FALSE) as /turf/open/floor + SHOULD_BE_PURE(TRUE) + RETURN_TYPE(/turf/open/floor) + + var/list/zlevels + if(islist(zlevel_or_levels)) + zlevels = zlevel_or_levels + else if(zlevel_or_levels) + zlevels = list(zlevel_or_levels) + else + zlevels = SSmapping.levels_by_trait(ZTRAIT_STATION) + + for(var/cycle in 1 to 1000) var/x = rand(1, world.maxx) var/y = rand(1, world.maxy) var/z = pick(zlevels) var/random_location = locate(x,y,z) - - if(is_safe_turf(random_location, extended_safety_checks, dense_atoms, cycle < 300))//if the area is mostly NOTELEPORT (centcom) we gotta give up on this fantasy at some point. + var/keep_trying_no_teleport = (cycle < 300) //if the area is mostly NOTELEPORT (centcom) we gotta give up on this fantasy at some point. + if(is_safe_turf(random_location, extended_safety_checks, dense_atoms, keep_trying_no_teleport)) return random_location -/// Checks if a given turf is a "safe" location +/** + * Checks to see if a given turf is a "safe" location. Being safe requires the following to be true: + * * Must be a [floor][/turf/open/floor] + * * Must have air, and that air must have [breathable bounds][/proc/check_gases] for humans + * * Must have goldilocks temperature + * * Must have safe pressure + * + * Optionally: + * * extended_safety_checks: Will make additional checks for turfs that technically pass all previous requirements but still may not be safe + * * dense_atoms: Must be unobstructed (no blocking objects such as machines, structures or mobs) + * * no_teleport: Must not have [NOTELEPORT][/area/var/area_flag] + * + * Returns TRUE if all conditions pass, FALSE otherwise. + */ /proc/is_safe_turf(turf/random_location, extended_safety_checks = FALSE, dense_atoms = FALSE, no_teleport = FALSE) + SHOULD_BE_PURE(TRUE) + . = FALSE if(!isfloorturf(random_location)) return @@ -160,18 +187,18 @@ var/list/floor_gases = floor_gas_mixture.gases var/static/list/gases_to_check = list( - /datum/gas/oxygen = list(16, 100), + /datum/gas/oxygen = list(/obj/item/organ/lungs::safe_oxygen_min, 100), /datum/gas/nitrogen, - /datum/gas/carbon_dioxide = list(0, 10) + /datum/gas/carbon_dioxide = list(0, /obj/item/organ/lungs::safe_co2_max) ) 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)) + if((floor_gas_mixture.temperature <= BODYTEMP_COLD_DAMAGE_LIMIT) || (floor_gas_mixture.temperature >= BODYTEMP_HEAT_DAMAGE_LIMIT)) return var/pressure = floor_gas_mixture.return_pressure() - if((pressure <= 20) || (pressure >= 550)) + if((pressure <= HAZARD_LOW_PRESSURE) || (pressure >= HAZARD_HIGH_PRESSURE)) return if(extended_safety_checks) diff --git a/code/datums/hud.dm b/code/datums/hud.dm index e81ded951feb..2e8524da6306 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -7,7 +7,7 @@ GLOBAL_LIST_EMPTY(all_huds) GLOBAL_LIST_EMPTY(huds_by_category) //GLOBAL HUD LIST -GLOBAL_LIST_INIT(huds, list( +GLOBAL_ALIST_INIT(huds, alist( DATA_HUD_SECURITY_BASIC = new /datum/atom_hud/data/human/security/basic(), DATA_HUD_SECURITY_ADVANCED = new /datum/atom_hud/data/human/security/advanced(), DATA_HUD_MEDICAL_BASIC = new /datum/atom_hud/data/human/medical/basic(), @@ -18,13 +18,25 @@ GLOBAL_LIST_INIT(huds, list( DATA_HUD_AI_DETECT = new /datum/atom_hud/ai_detector(), DATA_HUD_FAN = new /datum/atom_hud/data/human/fan_hud(), DATA_HUD_MALF_APC = new /datum/atom_hud/data/malf_apc(), + DATA_HUD_AUSPEX_AURAS = new /datum/atom_hud/data/auspex_aura(), // DARKPACK EDIT ADD )) +/// Assoc list of traits to the huds they give. GLOBAL_LIST_INIT(trait_to_hud, list( - TRAIT_SECURITY_HUD = DATA_HUD_SECURITY_ADVANCED, - TRAIT_MEDICAL_HUD = DATA_HUD_MEDICAL_ADVANCED, - TRAIT_DIAGNOSTIC_HUD = DATA_HUD_DIAGNOSTIC, + TRAIT_ABDUCTOR_HUD = DATA_HUD_ABDUCTOR, TRAIT_BOT_PATH_HUD = DATA_HUD_BOT_PATH, + TRAIT_CLOWN_ENJOYER = DATA_HUD_FAN, + TRAIT_DIAGNOSTIC_HUD = DATA_HUD_DIAGNOSTIC, + TRAIT_MEDICAL_HUD = DATA_HUD_MEDICAL_ADVANCED, + TRAIT_MEDICAL_HUD_SENSOR_ONLY = DATA_HUD_MEDICAL_BASIC, + TRAIT_MIME_FAN = DATA_HUD_FAN, + TRAIT_SECURITY_HUD = DATA_HUD_SECURITY_ADVANCED, + TRAIT_SECURITY_HUD_ID_ONLY = DATA_HUD_SECURITY_BASIC, +)) + +/// Assoc list of traits that block other traits' huds to list of hud (traits) that they block +GLOBAL_LIST_INIT(trait_blockers_to_hud, list( + TRAIT_BLOCK_SECHUD = list(TRAIT_SECURITY_HUD, TRAIT_SECURITY_HUD_ID_ONLY), )) /datum/atom_hud @@ -46,7 +58,7 @@ GLOBAL_LIST_INIT(trait_to_hud, list( var/list/mob/hud_users_all_z_levels = list() ///these will be the indexes for the atom's hud_list - var/list/hud_icons = list() + var/list/hud_icons ///mobs associated with the next time this hud can be added to them var/list/next_time_allowed = list() @@ -64,6 +76,8 @@ GLOBAL_LIST_INIT(trait_to_hud, list( for(var/z_level in 1 to world.maxz) hud_atoms += list(list()) hud_users += list(list()) + if(LAZYLEN(hud_icons)) + hud_icons = string_list(hud_icons) RegisterSignal(SSdcs, COMSIG_GLOB_NEW_Z, PROC_REF(add_z_level_huds)) diff --git a/code/datums/id_trim/centcom.dm b/code/datums/id_trim/centcom.dm index 7432540f07f3..86d3ec5b9fc8 100644 --- a/code/datums/id_trim/centcom.dm +++ b/code/datums/id_trim/centcom.dm @@ -110,7 +110,7 @@ access = SSid_access.get_region_access_list(list(REGION_CENTCOM, REGION_ALL_STATION)) -/// Trim for Deathsquad officers. All Centcom and Station Access. +/// Trim for Deathsquad officers. All Centcom and Station Access. No centcom officer's access /datum/id_trim/centcom/deathsquad assignment = JOB_ERT_DEATHSQUAD trim_state = "trim_deathcommando" @@ -122,7 +122,7 @@ /datum/id_trim/centcom/deathsquad/New() . = ..() - access = SSid_access.get_region_access_list(list(REGION_CENTCOM, REGION_ALL_STATION)) + access = (SSid_access.get_region_access_list(list(REGION_CENTCOM)) - ACCESS_CENT_OFFICER) | (SSid_access.get_region_access_list(list(REGION_ALL_STATION))) /// Trim for generic ERT interns. No universal ID card changing access. /datum/id_trim/centcom/ert @@ -135,7 +135,7 @@ access = list(ACCESS_CENT_GENERAL) | (SSid_access.get_region_access_list(list(REGION_ALL_STATION)) - ACCESS_CHANGE_IDS) -/// Trim for ERT Commanders. All station and centcom access. +/// Trim for ERT Commanders. All station and centcom access. No centcom officer's access /datum/id_trim/centcom/ert/commander assignment = JOB_ERT_COMMANDER trim_state = "trim_ert_commander" @@ -144,7 +144,7 @@ /datum/id_trim/centcom/ert/commander/New() . = ..() - access = SSid_access.get_region_access_list(list(REGION_CENTCOM, REGION_ALL_STATION)) + access = (SSid_access.get_region_access_list(list(REGION_CENTCOM)) - ACCESS_CENT_OFFICER) | (SSid_access.get_region_access_list(list(REGION_ALL_STATION))) /// Trim for generic ERT seccies. No universal ID card changing access. /datum/id_trim/centcom/ert/security diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index 1f6f61eda0a7..eb9f063d64f9 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -291,6 +291,7 @@ subdepartment_color = COLOR_CARGO_BROWN sechud_icon_state = SECHUD_CARGO_TECHNICIAN minimal_access = list( + ACCESS_BUDGET, ACCESS_CARGO, ACCESS_MAINT_TUNNELS, ACCESS_MECH_MINING, @@ -353,6 +354,7 @@ ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_VIROLOGY, + ACCESS_PARAMEDIC, ) template_access = list( ACCESS_CAPTAIN, @@ -374,6 +376,7 @@ ACCESS_ATMOSPHERICS, ACCESS_AUX_BASE, ACCESS_BRIG_ENTRANCE, + ACCESS_BUDGET, ACCESS_CE, ACCESS_COMMAND, ACCESS_CONSTRUCTION, @@ -417,6 +420,7 @@ extra_wildcard_access = list() minimal_access = list( ACCESS_BRIG_ENTRANCE, + ACCESS_BUDGET, ACCESS_COMMAND, ACCESS_KEYCARD_AUTH, ACCESS_PLUMBING, @@ -432,6 +436,7 @@ ACCESS_RC_ANNOUNCE, ACCESS_SURGERY, ACCESS_VIROLOGY, + ACCESS_PARAMEDIC, ) minimal_wildcard_access = list( ACCESS_CMO, @@ -467,7 +472,7 @@ ACCESS_HOP, ) job = /datum/job/clown - honorifics = list("the Clown") + honorifics = list(" the Clown") honorific_positions = HONORIFIC_POSITION_LAST_FULL | HONORIFIC_POSITION_NONE /datum/id_trim/job/cook @@ -519,6 +524,7 @@ ACCESS_PSYCHOLOGY, ACCESS_PHARMACY, ACCESS_VIROLOGY, + ACCESS_PARAMEDIC, ) template_access = list( ACCESS_CAPTAIN, @@ -631,6 +637,7 @@ ACCESS_AUX_BASE, ACCESS_BAR, ACCESS_BRIG_ENTRANCE, + ACCESS_BUDGET, ACCESS_CARGO, ACCESS_CHAPEL_OFFICE, ACCESS_CHANGE_IDS, @@ -689,6 +696,7 @@ ACCESS_BIT_DEN, ACCESS_BRIG, ACCESS_BRIG_ENTRANCE, + ACCESS_BUDGET, ACCESS_CARGO, ACCESS_COMMAND, ACCESS_CONSTRUCTION, @@ -797,6 +805,7 @@ ACCESS_PHARMACY, ACCESS_SURGERY, ACCESS_VIROLOGY, + ACCESS_PARAMEDIC, ) template_access = list( ACCESS_CAPTAIN, @@ -825,7 +834,7 @@ ACCESS_HOP, ) job = /datum/job/mime - honorifics = list("the Mime") + honorifics = list(" the Mime") honorific_positions = HONORIFIC_POSITION_LAST_FULL | HONORIFIC_POSITION_NONE /datum/id_trim/job/paramedic @@ -840,6 +849,7 @@ ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_MECH_MEDICAL, + ACCESS_PARAMEDIC, ) extra_access = list( ACCESS_BIT_DEN, @@ -946,6 +956,7 @@ minimal_access = list( ACCESS_AUX_BASE, ACCESS_BIT_DEN, + ACCESS_BUDGET, ACCESS_CARGO, ACCESS_MAINT_TUNNELS, ACCESS_MECH_MINING, @@ -989,6 +1000,7 @@ ACCESS_AI_UPLOAD, ACCESS_AUX_BASE, ACCESS_BRIG_ENTRANCE, + ACCESS_BUDGET, ACCESS_COMMAND, ACCESS_CONSTRUCTION, ACCESS_EVA, @@ -1194,6 +1206,7 @@ ACCESS_PLUMBING, ACCESS_SURGERY, ACCESS_VIROLOGY, + ACCESS_PARAMEDIC, ) honorifics = list("Orderly", "Officer") @@ -1329,6 +1342,7 @@ ACCESS_MINERAL_STOREROOM, ACCESS_SECURITY, ACCESS_WEAPONS, + ACCESS_BUDGET, ) // See /datum/job/warden/get_access() extra_access = list( ACCESS_DETECTIVE, diff --git a/code/datums/id_trim/syndicate.dm b/code/datums/id_trim/syndicate.dm index 28a0429d9352..9f35fafee426 100644 --- a/code/datums/id_trim/syndicate.dm +++ b/code/datums/id_trim/syndicate.dm @@ -105,6 +105,8 @@ /datum/id_trim/chameleon/operative/clown assignment = "Syndicate Entertainment Operative" trim_state = "trim_clown" + sechud_icon_state = SECHUD_CLOWNOPS + /// Trim for Chameleon ID cards. Many outfits, nuke ops and some corpses hold Chameleon ID cards. /datum/id_trim/chameleon/operative/clown_leader @@ -112,3 +114,4 @@ access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER) big_pointer = TRUE pointer_color = COLOR_SYNDIE_RED + sechud_icon_state = SECHUD_CLOWNOPS diff --git a/code/datums/keybinding/_keybindings.dm b/code/datums/keybinding/_keybindings.dm index 2973e4403de0..e92eaf1d1776 100644 --- a/code/datums/keybinding/_keybindings.dm +++ b/code/datums/keybinding/_keybindings.dm @@ -16,7 +16,7 @@ if(LAZYLEN(hotkey_keys) && !LAZYLEN(classic_keys)) classic_keys = hotkey_keys.Copy() -/datum/keybinding/proc/down(client/user, turf/target) +/datum/keybinding/proc/down(client/user, turf/target, mousepos_x, mousepos_y) SHOULD_CALL_PARENT(TRUE) return SEND_SIGNAL(user.mob, keybind_signal, target) & COMSIG_KB_ACTIVATED diff --git a/code/datums/keybinding/admin.dm b/code/datums/keybinding/admin.dm index 587e26096334..0e703d7e148a 100644 --- a/code/datums/keybinding/admin.dm +++ b/code/datums/keybinding/admin.dm @@ -19,7 +19,7 @@ description = "Go ghost" keybind_signal = COMSIG_KB_ADMIN_AGHOST_DOWN -/datum/keybinding/admin/admin_ghost/down(client/user, turf/target) +/datum/keybinding/admin/admin_ghost/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -33,7 +33,7 @@ description = "Opens up the new player panel" keybind_signal = COMSIG_KB_ADMIN_PLAYERPANELNEW_DOWN -/datum/keybinding/admin/player_panel_new/down(client/user, turf/target) +/datum/keybinding/admin/player_panel_new/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -47,7 +47,7 @@ description = "Toggles buildmode" keybind_signal = COMSIG_KB_ADMIN_TOGGLEBUILDMODE_DOWN -/datum/keybinding/admin/toggle_buildmode_self/down(client/user, turf/target) +/datum/keybinding/admin/toggle_buildmode_self/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -61,7 +61,7 @@ description = "Enters stealth mode" keybind_signal = COMSIG_KB_ADMIN_STEALTHMODETOGGLE_DOWN -/datum/keybinding/admin/stealthmode/down(client/user, turf/target) +/datum/keybinding/admin/stealthmode/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -75,7 +75,7 @@ description = "Toggles ghost-like invisibility (Don't abuse this)" keybind_signal = COMSIG_KB_ADMIN_INVISIMINTOGGLE_DOWN -/datum/keybinding/admin/invisimin/down(client/user, turf/target) +/datum/keybinding/admin/invisimin/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -89,7 +89,7 @@ description = "Allows you to send a message to dead chat" keybind_signal = COMSIG_KB_ADMIN_DSAY_DOWN -/datum/keybinding/admin/deadsay/down(client/user, turf/target) +/datum/keybinding/admin/deadsay/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -103,7 +103,7 @@ description = "Shed your admin powers" keybind_signal = COMSIG_KB_ADMIN_DEADMIN_DOWN -/datum/keybinding/admin/deadmin/down(client/user, turf/target) +/datum/keybinding/admin/deadmin/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -117,7 +117,7 @@ description = "Regain your admin powers" keybind_signal = COMSIG_KB_ADMIN_READMIN_DOWN -/datum/keybinding/admin/readmin/down(client/user, turf/target) +/datum/keybinding/admin/readmin/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -131,7 +131,7 @@ description = "Open the View-Tags menu" keybind_signal = COMSIG_KB_ADMIN_VIEWTAGS_DOWN -/datum/keybinding/admin/view_tags/down(client/user, turf/target) +/datum/keybinding/admin/view_tags/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return diff --git a/code/datums/keybinding/artificial_intelligence.dm b/code/datums/keybinding/artificial_intelligence.dm index fbb7023ed9cf..8bf01889afcb 100644 --- a/code/datums/keybinding/artificial_intelligence.dm +++ b/code/datums/keybinding/artificial_intelligence.dm @@ -12,7 +12,7 @@ description = "Reconnects you to your most recently used AI shell" keybind_signal = COMSIG_KB_SILICON_RECONNECT_DOWN -/datum/keybinding/artificial_intelligence/reconnect/down(client/user, turf/target) +/datum/keybinding/artificial_intelligence/reconnect/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return diff --git a/code/datums/keybinding/client.dm b/code/datums/keybinding/client.dm index 85d10add3098..aa178cc1e0c3 100644 --- a/code/datums/keybinding/client.dm +++ b/code/datums/keybinding/client.dm @@ -10,7 +10,7 @@ description = "Ask an admin for help." keybind_signal = COMSIG_KB_CLIENT_GETHELP_DOWN -/datum/keybinding/client/admin_help/down(client/user, turf/target) +/datum/keybinding/client/admin_help/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -25,7 +25,7 @@ description = "Take a screenshot." keybind_signal = COMSIG_KB_CLIENT_SCREENSHOT_DOWN -/datum/keybinding/client/screenshot/down(client/user, turf/target) +/datum/keybinding/client/screenshot/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -39,7 +39,7 @@ description = "Makes the game window fullscreen." keybind_signal = COMSIG_KB_CLIENT_FULLSCREEN_DOWN -/datum/keybinding/client/toggle_fullscreen/down(client/user, turf/target) +/datum/keybinding/client/toggle_fullscreen/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -53,7 +53,7 @@ description = "Hide most HUD features" keybind_signal = COMSIG_KB_CLIENT_MINIMALHUD_DOWN -/datum/keybinding/client/minimal_hud/down(client/user, turf/target) +/datum/keybinding/client/minimal_hud/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -67,7 +67,7 @@ description = "Closes all UI windows you have open." keybind_signal = COMSIG_KB_CLIENT_CLOSEUI_DOWN -/datum/keybinding/client/close_every_ui/down(client/user, turf/target) +/datum/keybinding/client/close_every_ui/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return diff --git a/code/datums/keybinding/communication.dm b/code/datums/keybinding/communication.dm index 403f5bd56556..bc77eee0f93e 100644 --- a/code/datums/keybinding/communication.dm +++ b/code/datums/keybinding/communication.dm @@ -7,7 +7,7 @@ full_name = "IC Say" keybind_signal = COMSIG_KB_CLIENT_SAY_DOWN -/datum/keybinding/client/communication/say/down(client/user, turf/target) +/datum/keybinding/client/communication/say/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -21,7 +21,7 @@ full_name = "IC Radio (;)" keybind_signal = COMSIG_KB_CLIENT_RADIO_DOWN -/datum/keybinding/client/communication/radio/down(client/user, turf/target) +/datum/keybinding/client/communication/radio/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -35,7 +35,7 @@ full_name = "Out Of Character Say (OOC)" keybind_signal = COMSIG_KB_CLIENT_OOC_DOWN -/datum/keybinding/client/communication/ooc/down(client/user, turf/target) +/datum/keybinding/client/communication/ooc/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -49,7 +49,7 @@ full_name = "Custom Emote (/Me)" keybind_signal = COMSIG_KB_CLIENT_ME_DOWN -/datum/keybinding/client/communication/me/down(client/user, turf/target) +/datum/keybinding/client/communication/me/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return diff --git a/code/datums/keybinding/emote.dm b/code/datums/keybinding/emote.dm index 6ea7f89e5bce..71f9ba881350 100644 --- a/code/datums/keybinding/emote.dm +++ b/code/datums/keybinding/emote.dm @@ -11,7 +11,7 @@ name = initial(faketype.key) full_name = capitalize(initial(faketype.key)) -/datum/keybinding/emote/down(client/user, turf/target) +/datum/keybinding/emote/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return diff --git a/code/datums/keybinding/human.dm b/code/datums/keybinding/human.dm index ab432c09e8d0..b2cc0966e8dc 100644 --- a/code/datums/keybinding/human.dm +++ b/code/datums/keybinding/human.dm @@ -12,7 +12,7 @@ description = "Quickly puts an item in the best slot available" keybind_signal = COMSIG_KB_HUMAN_QUICKEQUIP_DOWN -/datum/keybinding/human/quick_equip/down(client/user, turf/target) +/datum/keybinding/human/quick_equip/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -31,7 +31,7 @@ var/slot_item_name = "belt" keybind_signal = COMSIG_KB_HUMAN_QUICKEQUIPBELT_DOWN -/datum/keybinding/human/quick_equip_belt/down(client/user, turf/target) +/datum/keybinding/human/quick_equip_belt/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return diff --git a/code/datums/keybinding/living.dm b/code/datums/keybinding/living.dm index 84a013c89abc..e750b96b02c0 100644 --- a/code/datums/keybinding/living.dm +++ b/code/datums/keybinding/living.dm @@ -12,7 +12,7 @@ description = "Break free of your current state. Handcuffed? on fire? Resist!" keybind_signal = COMSIG_KB_LIVING_RESIST_DOWN -/datum/keybinding/living/resist/down(client/user, turf/target) +/datum/keybinding/living/resist/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -31,13 +31,13 @@ owner.hud_used.resist_icon.icon_state = owner.hud_used.resist_icon.base_icon_state /datum/keybinding/living/look_up - hotkey_keys = list("L") + hotkey_keys = list("P") // DARKPACK EDIT, ORIGINAL: hotkey_keys = list("L") name = "look up" full_name = "Look Up" description = "Look up at the next z-level. Only works if directly below open space." keybind_signal = COMSIG_KB_LIVING_LOOKUP_DOWN -/datum/keybinding/living/look_up/down(client/user, turf/target) +/datum/keybinding/living/look_up/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -58,7 +58,7 @@ description = "Look down at the previous z-level. Only works if directly above open space." keybind_signal = COMSIG_KB_LIVING_LOOKDOWN_DOWN -/datum/keybinding/living/look_down/down(client/user, turf/target) +/datum/keybinding/living/look_down/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -79,7 +79,7 @@ description = "Lay down, or get up." keybind_signal = COMSIG_KB_LIVING_REST_DOWN -/datum/keybinding/living/rest/down(client/user, turf/target) +/datum/keybinding/living/rest/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -95,7 +95,7 @@ keybind_signal = COMSIG_KB_LIVING_TOGGLE_COMBAT_DOWN -/datum/keybinding/living/toggle_combat_mode/down(client/user, turf/target) +/datum/keybinding/living/toggle_combat_mode/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -109,7 +109,7 @@ description = "Enable combat mode." keybind_signal = COMSIG_KB_LIVING_ENABLE_COMBAT_DOWN -/datum/keybinding/living/enable_combat_mode/down(client/user, turf/target) +/datum/keybinding/living/enable_combat_mode/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -123,7 +123,7 @@ description = "Disable combat mode." keybind_signal = COMSIG_KB_LIVING_DISABLE_COMBAT_DOWN -/datum/keybinding/living/disable_combat_mode/down(client/user, turf/target) +/datum/keybinding/living/disable_combat_mode/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -137,7 +137,7 @@ 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, turf/target) +/datum/keybinding/living/toggle_move_intent/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -158,7 +158,7 @@ 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, turf/target) +/datum/keybinding/living/toggle_move_intent_alternative/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -188,7 +188,7 @@ description = "Hold this to turn on throw mode, and release it to turn off throw mode" keybind_signal = COMSIG_KB_LIVING_HOLDTHROWMODE_DOWN -/datum/keybinding/living/hold_throw_mode/down(client/user, turf/target) +/datum/keybinding/living/hold_throw_mode/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -219,7 +219,7 @@ return FALSE return TRUE -/datum/keybinding/living/give/down(client/user, turf/target) +/datum/keybinding/living/give/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return diff --git a/code/datums/keybinding/mob.dm b/code/datums/keybinding/mob.dm index 081ea131f584..dc9b37565084 100644 --- a/code/datums/keybinding/mob.dm +++ b/code/datums/keybinding/mob.dm @@ -9,7 +9,7 @@ description = "" keybind_signal = COMSIG_KB_MOB_STOPPULLING_DOWN -/datum/keybinding/mob/stop_pulling/down(client/user, turf/target) +/datum/keybinding/mob/stop_pulling/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -27,7 +27,7 @@ description = "" keybind_signal = COMSIG_KB_MOB_SWAPHANDS_DOWN -/datum/keybinding/mob/swap_hands/down(client/user, turf/target) +/datum/keybinding/mob/swap_hands/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -52,7 +52,7 @@ keybind_signal = COMSIG_KB_MOB_SELECTLEFTHAND_DOWN hand_index = LEFT_HANDS -/datum/keybinding/mob/select_hand/down(client/user, turf/target) +/datum/keybinding/mob/select_hand/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -72,7 +72,7 @@ description = "Uses whatever item you have inhand" keybind_signal = COMSIG_KB_MOB_ACTIVATEINHAND_DOWN -/datum/keybinding/mob/activate_inhand/down(client/user, turf/target) +/datum/keybinding/mob/activate_inhand/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -84,24 +84,49 @@ hotkey_keys = list("X") name = "drop_item" full_name = "Drop Item" - description = "" + description = "Drops the item in your active hand to the ground." keybind_signal = COMSIG_KB_MOB_DROPITEM_DOWN -/datum/keybinding/mob/drop_item/down(client/user, turf/target) +/datum/keybinding/mob/drop_item/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return if(iscyborg(user.mob)) //cyborgs can't drop items return FALSE - var/mob/M = user.mob - var/obj/item/I = M.get_active_held_item() - if(!I) + var/mob/user_mob = user.mob + var/obj/item/item_dropped = user_mob.get_active_held_item() + if(!item_dropped) to_chat(user, span_warning("You have nothing to drop in your hand!")) - else - user.mob.dropItemToGround(I) + return TRUE + user.mob.dropItemToGround(item_dropped) + return TRUE + +/datum/keybinding/mob/drop_item_specific + hotkey_keys = list("CtrlX") + name = "drop_item_specific" + full_name = "Drop Item (Specific)" + description = "Drops the item in your active where your mouse cursor is, if in range." + keybind_signal = COMSIG_KB_MOB_DROPITEM_DOWN + +/datum/keybinding/mob/drop_item_specific/down(client/user, turf/target, mousepos_x, mousepos_y) + . = ..() + if(.) + return + if(iscyborg(user.mob)) //cyborgs can't drop items + return FALSE + var/mob/user_mob = user.mob + var/obj/item/item_dropped = user_mob.get_active_held_item() + if(!item_dropped) + to_chat(user, span_warning("You have nothing to drop in your hand!")) + return TRUE + if(!user_mob.Adjacent(target) || target.is_blocked_turf(source_atom = item_dropped)) + return TRUE + var/x_value = (mousepos_x >= 0) ? mousepos_x - ICON_SIZE_X / 2 : mousepos_x + ICON_SIZE_X / 2 + var/y_value = (mousepos_y >= 0) ? mousepos_y - ICON_SIZE_Y / 2 : mousepos_y + ICON_SIZE_Y / 2 + user_mob.transfer_item_to_turf(item_dropped, target, x_value, y_value) return TRUE -/datum/keybinding/mob/target/down(client/user, turf/target) +/datum/keybinding/mob/target/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return . @@ -210,7 +235,7 @@ description = "Prevents you from moving" keybind_signal = COMSIG_KB_MOB_BLOCKMOVEMENT_DOWN -/datum/keybinding/mob/prevent_movement/down(client/user, turf/target) +/datum/keybinding/mob/prevent_movement/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return diff --git a/code/datums/keybinding/movement.dm b/code/datums/keybinding/movement.dm index bcdf3d18c7bf..2f0be3ee4ae4 100644 --- a/code/datums/keybinding/movement.dm +++ b/code/datums/keybinding/movement.dm @@ -37,7 +37,7 @@ description = "Moves your character up a z-level if possible" keybind_signal = COMSIG_KB_MOVEMENT_ZLEVEL_MOVEUP_DOWN -/datum/keybinding/movement/zlevel_upwards/down(client/user, turf/target) +/datum/keybinding/movement/zlevel_upwards/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -51,7 +51,7 @@ description = "Moves your character down a z-level if possible" keybind_signal = COMSIG_KB_MOVEMENT_ZLEVEL_MOVEDOWN_DOWN -/datum/keybinding/movement/zlevel_downwards/down(client/user, turf/target) +/datum/keybinding/movement/zlevel_downwards/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return diff --git a/code/datums/keybinding/robot.dm b/code/datums/keybinding/robot.dm index d7a89d57d928..b412a13585a6 100644 --- a/code/datums/keybinding/robot.dm +++ b/code/datums/keybinding/robot.dm @@ -12,7 +12,7 @@ description = "Equips or unequips the first module" keybind_signal = COMSIG_KB_SILICON_TOGGLEMODULEONE_DOWN -/datum/keybinding/robot/moduleone/down(client/user, turf/target) +/datum/keybinding/robot/moduleone/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -27,7 +27,7 @@ description = "Equips or unequips the second module" keybind_signal = COMSIG_KB_SILICON_TOGGLEMODULETWO_DOWN -/datum/keybinding/robot/moduletwo/down(client/user, turf/target) +/datum/keybinding/robot/moduletwo/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -42,7 +42,7 @@ description = "Equips or unequips the third module" keybind_signal = COMSIG_KB_SILICON_TOGGLEMODULETHREE_DOWN -/datum/keybinding/robot/modulethree/down(client/user, turf/target) +/datum/keybinding/robot/modulethree/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -57,7 +57,7 @@ description = "Unequips the active module" keybind_signal = COMSIG_KB_SILICON_UNEQUIPMODULE_DOWN -/datum/keybinding/robot/unequip_module/down(client/user, turf/target) +/datum/keybinding/robot/unequip_module/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return @@ -73,7 +73,7 @@ description = "Returns you to your AI core" keybind_signal = COMSIG_KB_SILION_UNDEPLOY_DOWN -/datum/keybinding/robot/undeploy/down(client/user, turf/target) +/datum/keybinding/robot/undeploy/down(client/user, turf/target, mousepos_x, mousepos_y) . = ..() if(.) return diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm index 2b2b00e19a16..7080033c63f3 100644 --- a/code/datums/looping_sounds/_looping_sound.dm +++ b/code/datums/looping_sounds/_looping_sound.dm @@ -68,7 +68,13 @@ //If we reserve a random sound channel, store the channel number here so we can clean it up later. var/reserved_channel -/datum/looping_sound/New(_parent, start_immediately = FALSE, _direct = FALSE, _skip_starting_sounds = FALSE) +/datum/looping_sound/New( + _parent, + start_immediately = FALSE, + _direct = FALSE, + _skip_starting_sounds = FALSE, + sound_channel, +) if(!mid_sounds) WARNING("A looping sound datum was created without sounds to play.") return @@ -76,6 +82,8 @@ set_parent(_parent) direct = _direct skip_starting_sounds = _skip_starting_sounds + if(sound_channel) + src.sound_channel = sound_channel if(start_immediately) start() @@ -164,9 +172,9 @@ */ /datum/looping_sound/proc/play(soundfile, volume_override) var/sound/sound_to_play = sound(soundfile) + sound_to_play.channel = sound_channel || SSsounds.random_available_channel() + sound_to_play.volume = volume_override || volume //Use volume as fallback if theres no override if(direct) - sound_to_play.channel = sound_channel || SSsounds.random_available_channel() - sound_to_play.volume = volume_override || volume //Use volume as fallback if theres no override SEND_SOUND(parent, sound_to_play) else playsound( @@ -176,6 +184,7 @@ vary, extra_range, falloff_exponent = falloff_exponent, + channel = sound_to_play.channel, pressure_affected = pressure_affected, ignore_walls = ignore_walls, falloff_distance = falloff_distance, diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm index bb7dd27e947a..55aa87b924c9 100644 --- a/code/datums/map_config.dm +++ b/code/datums/map_config.dm @@ -66,6 +66,8 @@ /// Boolean that tells SSmapping to load all away missions in the codebase. var/load_all_away_missions = FALSE + var/max_npcs = 0 // DARKPACK EDIT ADD - NPC + /** * Proc that simply loads the default map config, which should always be functional. */ @@ -251,6 +253,11 @@ maps_to_spawn += pick_weight_take(wilderness) shuffle(maps_to_spawn) + // DARKPACK EDIT ADD START - NPC + if ("max_npcs" in json) + max_npcs = json["max_npcs"] + // DARKPACK EDIT ADD END + #ifdef UNIT_TESTS // Check for unit tests to skip, no reason to check these if we're not running tests for(var/path_as_text in json["ignored_unit_tests"]) diff --git a/code/datums/mapgen/CaveGenerator.dm b/code/datums/mapgen/CaveGenerator.dm index ec27a7d4b8fa..3641edb4d93c 100644 --- a/code/datums/mapgen/CaveGenerator.dm +++ b/code/datums/mapgen/CaveGenerator.dm @@ -104,7 +104,7 @@ /datum/map_generator/cave_generator/generate_terrain(list/turfs, area/generate_in) . = ..() - if(!(generate_in.area_flags & CAVES_ALLOWED)) + if(!(generate_in.area_flags_mapping & CAVES_ALLOWED)) return if(length(possible_biomes)) @@ -138,7 +138,7 @@ * you're probably doing something wrong. */ /datum/map_generator/cave_generator/proc/generate_terrain_with_biomes(list/turfs, area/generate_in) - if(!(generate_in.area_flags & CAVES_ALLOWED)) + if(!(generate_in.area_flags_mapping & CAVES_ALLOWED)) return var/humidity_seed = rand(0, 50000) @@ -212,10 +212,10 @@ return populate_terrain_with_biomes(turfs, 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/flora_allowed = (generate_in.area_flags_mapping & FLORA_ALLOWED) && length(flora_spawn_list) + var/feature_allowed = (generate_in.area_flags_mapping & FLORA_ALLOWED) && length(feature_spawn_list) + var/mobs_allowed = (generate_in.area_flags_mapping & MOB_SPAWN_ALLOWED) && length(mob_spawn_list) + var/megas_allowed = (generate_in.area_flags_mapping & MEGAFAUNA_SPAWN_ALLOWED) && length(megafauna_spawn_list) var/start_time = REALTIMEOFDAY @@ -310,9 +310,9 @@ */ /datum/map_generator/cave_generator/proc/populate_terrain_with_biomes(list/turfs, area/generate_in) // Area var pullouts to make accessing in the loop faster - var/flora_allowed = (generate_in.area_flags & FLORA_ALLOWED) - var/features_allowed = (generate_in.area_flags & FLORA_ALLOWED) - var/fauna_allowed = (generate_in.area_flags & MOB_SPAWN_ALLOWED) + var/flora_allowed = (generate_in.area_flags_mapping & FLORA_ALLOWED) + var/features_allowed = (generate_in.area_flags_mapping & FLORA_ALLOWED) + var/fauna_allowed = (generate_in.area_flags_mapping & MOB_SPAWN_ALLOWED) var/start_time = REALTIMEOFDAY diff --git a/code/datums/mapgen/Cavegens/IcemoonCaves.dm b/code/datums/mapgen/Cavegens/IcemoonCaves.dm index 475465783617..153b0c22e804 100644 --- a/code/datums/mapgen/Cavegens/IcemoonCaves.dm +++ b/code/datums/mapgen/Cavegens/IcemoonCaves.dm @@ -26,11 +26,12 @@ ///Note that this spawn list is also in the lavaland generator weighted_feature_spawn_list = list( - /obj/structure/geyser/hollowwater = 10, - /obj/structure/geyser/plasma_oxide = 10, - /obj/structure/geyser/protozine = 10, + /obj/structure/geyser/hollowwater = 8, + /obj/structure/geyser/plasma_oxide = 8, + /obj/structure/geyser/protozine = 8, /obj/structure/geyser/random = 2, - /obj/structure/geyser/wittel = 10, + /obj/structure/geyser/wittel = 8, + /obj/structure/geyser/chiral_buffer = 8, /obj/structure/ore_vent/boss/icebox = 1, ) @@ -45,11 +46,12 @@ feature_spawn_chance = 0.15 weighted_feature_spawn_list = list( - /obj/structure/geyser/hollowwater = 10, - /obj/structure/geyser/plasma_oxide = 10, - /obj/structure/geyser/protozine = 10, + /obj/structure/geyser/hollowwater = 8, + /obj/structure/geyser/plasma_oxide = 8, + /obj/structure/geyser/protozine = 8, /obj/structure/geyser/random = 2, - /obj/structure/geyser/wittel = 10, + /obj/structure/geyser/wittel = 8, + /obj/structure/geyser/chiral_buffer = 8, ) weighted_flora_spawn_list = list( diff --git a/code/datums/mapgen/Cavegens/LavalandGenerator.dm b/code/datums/mapgen/Cavegens/LavalandGenerator.dm index 47b62ce4a1ba..be4dc3710f27 100644 --- a/code/datums/mapgen/Cavegens/LavalandGenerator.dm +++ b/code/datums/mapgen/Cavegens/LavalandGenerator.dm @@ -29,11 +29,12 @@ ///Note that this spawn list is also in the icemoon generator weighted_feature_spawn_list = list( - /obj/structure/geyser/hollowwater = 10, - /obj/structure/geyser/plasma_oxide = 10, - /obj/structure/geyser/protozine = 10, + /obj/structure/geyser/hollowwater = 8, + /obj/structure/geyser/plasma_oxide = 8, + /obj/structure/geyser/protozine = 8, /obj/structure/geyser/random = 2, - /obj/structure/geyser/wittel = 10, + /obj/structure/geyser/wittel = 8, + /obj/structure/geyser/chiral_buffer = 8, /obj/structure/ore_vent/boss = 1, ) diff --git a/code/datums/mapgen/JungleGenerator.dm b/code/datums/mapgen/JungleGenerator.dm index da7d7353a28c..61c641923a10 100644 --- a/code/datums/mapgen/JungleGenerator.dm +++ b/code/datums/mapgen/JungleGenerator.dm @@ -31,6 +31,10 @@ ) ///Used to select "zoom" level into the perlin noise, higher numbers result in slower transitions var/perlin_zoom = 65 + // DARKPACK EDIT ADD START + ///Biome that is chosen when height is above 0.85 + var/fallback_biome = /datum/biome/mountain + // DARKPACK EDIT ADD END ///Seeds the rust-g perlin noise with a random number. /datum/map_generator/jungle_generator/generate_terrain(list/turfs, area/generate_in) @@ -74,7 +78,7 @@ humidity_level = BIOME_HIGH_HUMIDITY selected_biome = possible_biomes[heat_level][humidity_level] else //Over 0.85; It's a mountain - selected_biome = /datum/biome/mountain + selected_biome = fallback_biome // DARKPACK EDIT CHANGE - /datum/biome/mountain selected_biome = SSmapping.biomes[selected_biome] //Get the instance of this biome from SSmapping selected_biome.generate_turf(gen_turf) CHECK_TICK diff --git a/code/datums/mapgen/biomes/_biome.dm b/code/datums/mapgen/biomes/_biome.dm index c80c37608352..cbd4bfd27e9b 100644 --- a/code/datums/mapgen/biomes/_biome.dm +++ b/code/datums/mapgen/biomes/_biome.dm @@ -136,7 +136,6 @@ if(!(flora_allowed && length(flora_types)) && !(features_allowed && length(feature_types)) && !(fauna_allowed && length(fauna_types))) return - for(var/turf/target_turf as anything in target_turfs) // We do the CHECK_TICK here because there's a bunch of continue calls // in this. @@ -180,43 +179,61 @@ // DARKPACK EDIT CHANGE START /datum/biome/mudlands - turf_type = /turf/open/misc/dirt/vamp + turf_type = /turf/open/misc/dirt flora_types = list( - /obj/structure/small_vamprocks = 2, - /obj/structure/vamprocks = 1, - /obj/structure/big_vamprocks = 1, + /obj/structure/flora/rock/pile/darkpack = 2, + /obj/structure/flora/rock/darkpack = 1, + /obj/structure/flora/rock/darkpack_big = 1, ) flora_density = 3 /datum/biome/plains - turf_type = /turf/open/misc/grass/vamp + turf_type = /turf/open/misc/grass flora_types = list( - /obj/structure/flora/bush/sparsegrass/style_random = 5, + /obj/effect/spawner/random/flora/grass = 25, + /obj/effect/spawner/random/flora/bushes = 10, /obj/structure/flora/tree/vamp/pine = 1, - /obj/structure/small_vamprocks = 1, - /obj/structure/vamprocks = 1, + /obj/structure/flora/rock/pile/darkpack = 1, + /obj/structure/flora/rock/darkpack = 1, ) - flora_density = 50 + flora_density = 60 + fauna_types = list( + /mob/living/basic/butterfly = 30, + /mob/living/basic/deer = 10, + /mob/living/basic/goose = 5, + /mob/living/basic/frog = 5, + /mob/living/basic/pet/fox = 1, + ) + fauna_density = 2 /datum/biome/jungle - turf_type = /turf/open/misc/grass/vamp + turf_type = /turf/open/misc/grass flora_types = list( - /obj/structure/flora/bush/sparsegrass/style_random = 1, - /obj/structure/flora/tree/vamp/pine = 2, - /obj/structure/small_vamprocks = 1, - /obj/structure/vamprocks = 1, + /obj/effect/spawner/random/flora/grass = 5, + /obj/effect/spawner/random/flora/bushes = 2, + /obj/structure/flora/tree/vamp/pine = 3, + /obj/structure/flora/rock/pile/darkpack = 1, + /obj/structure/flora/rock/darkpack = 1, ) - flora_density = 40 + flora_density = 30 + fauna_types = list( + /mob/living/basic/butterfly = 30, + /mob/living/basic/deer = 10, + /mob/living/basic/goose = 5, + /mob/living/basic/frog = 5, + /mob/living/basic/pet/fox = 1, + ) + fauna_density = 1 /datum/biome/jungle/deep - flora_density = 65 + flora_density = 50 /datum/biome/wasteland - turf_type = /turf/open/misc/dirt/vamp + turf_type = /turf/open/misc/dirt flora_types = list( - /obj/structure/small_vamprocks = 10, - /obj/structure/vamprocks = 2, - /obj/structure/big_vamprocks = 1, + /obj/structure/flora/rock/pile/darkpack = 10, + /obj/structure/flora/rock/darkpack = 2, + /obj/structure/flora/rock/darkpack_big = 1, ) flora_density = 5 @@ -224,5 +241,5 @@ turf_type = /turf/open/water/beach/vamp /datum/biome/mountain - turf_type = /turf/closed/mineral/random/jungle + turf_type = /turf/closed/wall/vampwall/rock // DARKPACK EDIT CHANGE END diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 895d0faa6138..03ae3f3202e5 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -3,18 +3,27 @@ #define LEFT_LEFT_COMBO "HH" #define RIGHT_RIGHT_COMBO "DD" +#define STRAIGHT_PUNCH "straight_punch" +#define RIGHT_HOOK "right_hook" +#define LEFT_HOOK "left_hook" +#define UPPERCUT "uppercut" +#define LIGHT_JAB "light_jab" +#define DISCOMBOBULATE "discombobulate" +#define BLIND_JAB "blind_jab" +#define CRAVEN_BLOW "craven_blow" +#define NO_COMBO "" + /datum/martial_art/boxing name = "Boxing" id = MARTIALART_BOXING pacifist_style = TRUE + help_verb = /mob/living/proc/boxing_help /// Boolean on whether we are sportsmanlike in our tussling; TRUE means we have restrictions var/honorable_boxer = TRUE /// Default damage type for our boxing. var/default_damage_type = STAMINA /// List of traits applied to users of this martial art. var/list/boxing_traits = list(TRAIT_BOXING_READY) - /// Balloon alert cooldown for warning our boxer to alternate their blows to get more damage - COOLDOWN_DECLARE(warning_cooldown) /datum/martial_art/boxing/can_teach(mob/living/new_holder) return ishuman(new_holder) @@ -31,23 +40,39 @@ ///Unlike most instances of this proc, this is actually called in _proc/tussle() ///Returns a multiplier on our skill damage bonus. -/datum/martial_art/boxing/proc/check_streak(mob/living/attacker, mob/living/defender) - var/combo_multiplier = 1 +/datum/martial_art/boxing/proc/check_streak(mob/living/attacker, mob/living/defender, obj/item/bodypart/arm/active_arm) + if(check_behind(attacker, defender) && !honorable_boxer) + reset_streak() + return CRAVEN_BLOW + + if(HAS_TRAIT(attacker, TRAIT_DETECTIVES_TASTE) && defender.is_blind()) //In short: discombobulate + reset_streak() + return DISCOMBOBULATE + + if(findtext(streak, LEFT_LEFT_COMBO) && active_arm.body_zone == BODY_ZONE_R_ARM || findtext(streak, RIGHT_RIGHT_COMBO) && active_arm.body_zone == BODY_ZONE_L_ARM) + reset_streak() + if(attacker.is_blind()) + return BLIND_JAB + else + return LIGHT_JAB - if(findtext(streak, LEFT_LEFT_COMBO) || findtext(streak, RIGHT_RIGHT_COMBO)) + else if(findtext(streak, LEFT_LEFT_COMBO) && active_arm.body_zone == BODY_ZONE_L_ARM || findtext(streak, RIGHT_RIGHT_COMBO) && active_arm.body_zone == BODY_ZONE_R_ARM) reset_streak() - if(COOLDOWN_FINISHED(src, warning_cooldown)) - COOLDOWN_START(src, warning_cooldown, 2 SECONDS) - attacker.balloon_alert(attacker, "weak combo, alternate your hits!") - return combo_multiplier * 0.5 + return STRAIGHT_PUNCH if(findtext(streak, LEFT_RIGHT_COMBO) || findtext(streak, RIGHT_LEFT_COMBO)) reset_streak() - // If we have an extra effect from the combo, perform it here. By default, we have no extra effect. - perform_extra_effect(attacker, defender) - return combo_multiplier * 1.5 + if(active_arm.body_zone == BODY_ZONE_L_ARM) + if(findtext(streak, RIGHT_LEFT_COMBO)) + return LEFT_HOOK - return combo_multiplier + else if(active_arm.body_zone == BODY_ZONE_R_ARM) + if(findtext(streak, LEFT_RIGHT_COMBO)) + return RIGHT_HOOK + else + return UPPERCUT + + return NO_COMBO /// An extra effect on some moves and attacks. /datum/martial_art/boxing/proc/perform_extra_effect(mob/living/attacker, mob/living/defender) @@ -56,7 +81,7 @@ /datum/martial_art/boxing/disarm_act(mob/living/attacker, mob/living/defender) if(honor_check(defender)) add_to_streak("D", defender) - tussle(attacker, defender, "right hook", "right hooked") + tussle(attacker, defender) return MARTIAL_ATTACK_SUCCESS /datum/martial_art/boxing/grab_act(mob/living/attacker, mob/living/defender) @@ -68,14 +93,14 @@ /datum/martial_art/boxing/harm_act(mob/living/attacker, mob/living/defender) if(honor_check(defender)) add_to_streak("H", defender) - tussle(attacker, defender, "left hook", "left hooked") + tussle(attacker, defender) return MARTIAL_ATTACK_SUCCESS // Our only boxing move, which occurs on literally all attacks; the tussle. However, quite a lot morphs the results of this proc. Combos, unlike most martial arts attacks, are checked in this proc rather than our standard unarmed procs -/datum/martial_art/boxing/proc/tussle(mob/living/attacker, mob/living/defender, atk_verb = "blind jab", atk_verbed = "blind jabbed") +/datum/martial_art/boxing/proc/tussle(mob/living/attacker, mob/living/defender) if(honorable_boxer) //Being a good sport, you never hit someone on the ground or already knocked down. It shows you're the better person. - if(defender.body_position == LYING_DOWN && defender.getStaminaLoss() >= 100 || defender.IsUnconscious()) //If they're in stamcrit or unconscious, don't bloody punch them + if(defender.body_position == LYING_DOWN && defender.get_stamina_loss() >= 100 || defender.IsUnconscious()) //If they're in stamcrit or unconscious, don't bloody punch them attacker.balloon_alert(attacker, "unsportsmanlike behaviour!") return FALSE @@ -102,45 +127,108 @@ attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) + // Our potential wound bonus on a punch. Only applies if we're dishonorable. Otherwise, we can't wound. + var/possible_wound_bonus = honorable_boxer ? 0 : CANT_WOUND + // Determines damage dealt on a punch. Against a boxing defender, we apply our skill bonus. var/damage = rand(lower_force, upper_force) - if(honor_check(defender)) - var/strength_bonus = HAS_TRAIT(attacker, TRAIT_STRENGTH) ? 2 : 0 //Investing into genetic strength improvements makes you a better boxer - - var/obj/item/organ/cyberimp/chest/spine/potential_spine = attacker.get_organ_slot(ORGAN_SLOT_SPINE) //Getting a cyberspine also pushes you further than just mere meat - if(istype(potential_spine)) - strength_bonus *= potential_spine.strength_bonus - - damage += round(athletics_skill * check_streak(attacker, defender) + strength_bonus, 1) - grant_experience = TRUE + // Attack verbs for our visible chat messages. + var/current_atk_verb = "punches" + var/current_atk_verbed = "punched" - var/current_atk_verb = atk_verb - var/current_atk_verbed = atk_verbed - - if(is_detective_job(attacker.mind?.assigned_role)) //In short: discombobulate - current_atk_verb = "discombobulate" - current_atk_verbed = "discombulated" + if(defender.check_block(attacker, damage, "[attacker]'s punch", UNARMED_ATTACK)) + return FALSE // Similar to a normal punch, should we have a value of 0 for our lower force, we simply miss outright. if(!lower_force) playsound(defender.loc, active_arm.unarmed_miss_sound, 25, TRUE, -1) - defender.visible_message(span_warning("[attacker]'s [current_atk_verb] misses [defender]!"), \ - span_danger("You avoid [attacker]'s [current_atk_verb]!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, attacker) - to_chat(attacker, span_warning("Your [current_atk_verb] misses [defender]!")) - log_combat(attacker, defender, "attempted to hit", current_atk_verb) - return FALSE - - if(defender.check_block(attacker, damage, "[attacker]'s [current_atk_verb]", UNARMED_ATTACK)) + defender.visible_message(span_warning("[attacker]'s punch misses [defender]!"), \ + span_danger("You avoid [attacker]'s punch!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, attacker) + to_chat(attacker, span_warning("Your punch misses [defender]!")) + log_combat(attacker, defender, "attempted to hit", "punch (boxing) ") return FALSE var/obj/item/bodypart/affecting = defender.get_bodypart(defender.get_random_valid_zone(attacker.zone_selected)) + + if(honor_check(defender)) + var/strength_bonus = HAS_TRAIT(attacker, TRAIT_STRENGTH) ? 2 : 0 //Investing into genetic strength improvements makes you a better boxer + + var/obj/item/organ/cyberimp/chest/spine/potential_spine = attacker.get_organ_slot(ORGAN_SLOT_SPINE) //Getting a cyberspine also pushes you further than just mere meat + if(istype(potential_spine)) + strength_bonus *= potential_spine.strength_bonus + + var/streak_augmentation = check_streak(attacker, defender, active_arm) + + var/combo_multiplier = 0 + + switch(streak_augmentation) + if(STRAIGHT_PUNCH) + current_atk_verb = "straight punches" + current_atk_verbed = "straight punched" + combo_multiplier = 1 + + if(LIGHT_JAB) + current_atk_verb = "light jabs" + current_atk_verbed = "light jabbed" + combo_multiplier = 1 + + if(LEFT_HOOK) + current_atk_verb = "left hooks" + current_atk_verbed = "left hooked" + combo_multiplier = 1.5 + attacker.changeNext_move(CLICK_CD_MELEE * 1.5) + + if(RIGHT_HOOK) + current_atk_verb = "right hooks" + current_atk_verbed = "right hooked" + combo_multiplier = 1.5 + attacker.changeNext_move(CLICK_CD_MELEE * 1.5) + + if(UPPERCUT) + current_atk_verb = "uppercuts" + current_atk_verbed = "uppercutted" + base_unarmed_effectiveness *= 1.5 + combo_multiplier = 1 + attacker.changeNext_move(CLICK_CD_MELEE * 1.5) + + if(DISCOMBOBULATE) + current_atk_verb = "discombobulates" + current_atk_verbed = "discombobulated" + affecting = defender.get_bodypart(defender.get_random_valid_zone(BODY_ZONE_HEAD)) + defender.adjust_confusion_up_to(20 SECONDS, 50 SECONDS) + defender.adjust_dizzy_up_to(20 SECONDS, 50 SECONDS) + combo_multiplier = 1 + + if(BLIND_JAB) + current_atk_verb = "blind jabs" + current_atk_verbed = "blind jabbed" + combo_multiplier = 0.5 + attacker.changeNext_move(CLICK_CD_MELEE * 1.5) + + if(CRAVEN_BLOW) + current_atk_verb = "sucker punches" + current_atk_verbed = "sucker punch" + possible_wound_bonus = damage + combo_multiplier = 2 + possible_wound_bonus *= 1.5 + affecting = defender.get_bodypart(defender.get_random_valid_zone(BODY_ZONE_HEAD)) + defender.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH, 10 SECONDS) //why yes, this could result in them being knocked out in one. + + damage += round((athletics_skill + strength_bonus) * combo_multiplier, 1) + + if(combo_multiplier >= 1) + perform_extra_effect(attacker, defender) + + if(defender.stat <= HARD_CRIT) // Do not grant experience against dead targets + grant_experience = TRUE + var/armor_block = defender.run_armor_check(affecting, MELEE, armour_penetration = base_unarmed_effectiveness) playsound(defender, attack_sound, 25, TRUE, -1) defender.visible_message( - span_danger("[attacker] [current_atk_verbed] [defender]!"), + span_danger("[attacker] [current_atk_verb] [defender]!"), span_userdanger("You're [current_atk_verbed] by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, @@ -152,7 +240,7 @@ // Determines the total amount of experience earned per punch var/experience_earned = round(damage/4, 1) - defender.apply_damage(damage, damage_type, affecting, armor_block) + defender.apply_damage(damage, damage_type, affecting, armor_block, wound_bonus = possible_wound_bonus) log_combat(attacker, defender, "punched (boxing) ") @@ -160,7 +248,7 @@ return TRUE if(grant_experience) - skill_experience_adjustment(attacker, (damage/lower_force)) + skill_experience_adjustment(attacker, defender, (damage/lower_force)) //Determine our attackers athletics level as a knockout probability bonus var/attacker_athletics_skill = (attacker.mind?.get_skill_modifier(/datum/skill/athletics, SKILL_RANDS_MODIFIER) + base_unarmed_effectiveness) @@ -180,7 +268,7 @@ playsound(defender, 'sound/effects/coin2.ogg', 40, TRUE) new /obj/effect/temp_visual/crit(get_turf(defender)) - skill_experience_adjustment(attacker, experience_earned) //double experience for a successful crit + skill_experience_adjustment(attacker, defender, experience_earned) //double experience for a successful crit return TRUE @@ -210,6 +298,10 @@ to_chat(attacker, span_danger("You stagger [defender] with a haymaker!")) log_combat(attacker, defender, "staggered (boxing) ") + if(attacker.pulling == defender && attacker.grab_state >= GRAB_AGGRESSIVE) // dubious a normal boxer will be in a state where this happens, buuuut. + var/atom/throw_target = get_edge_target_turf(defender, attacker.dir) + defender.throw_at(throw_target, 2, 2, attacker) + /// Returns whether whoever is checked by this proc is complying with the rules of boxing. The boxer cannot block non-boxers, and cannot apply their scariest moves against non-boxers. /datum/martial_art/boxing/proc/honor_check(mob/living/possible_boxer) if(!honorable_boxer) @@ -221,7 +313,7 @@ return TRUE /// Handles our instances of experience gain while boxing. It also applies the exercised status effect. -/datum/martial_art/boxing/proc/skill_experience_adjustment(mob/living/boxer, experience_value) +/datum/martial_art/boxing/proc/skill_experience_adjustment(mob/living/boxer, mob/living/defender, experience_value) //Boxing in heavier gravity gives you more experience var/gravity_modifier = boxer.has_gravity() > STANDARD_GRAVITY ? 1 : 2 @@ -261,7 +353,7 @@ experience_earned = 2 // WE reward experience for getting punched while boxing - skill_experience_adjustment(boxer, experience_earned) //just getting hit a bunch doesn't net you much experience however + skill_experience_adjustment(boxer, attacker, experience_earned) //just getting hit a bunch doesn't net you much experience however if(!prob(block_chance)) return NONE @@ -285,6 +377,23 @@ return FALSE return ..() +/mob/living/proc/boxing_help() + set name = "Focus on your Form" + set desc = "You focus on how to make the most of your boxing form." + set category = "Boxing" + to_chat(usr, "You focus on your form, visualizing how best to throw a punch.") + + to_chat(usr, "What moves you perform depend on what mouse buttons you click, and whether the last button clicked matches which hand you have selected when you throw the last punch.") + + to_chat(usr, "[span_notice("Straight Punch")]: Left Left/Right Right with the matching hand. Regular damage.") + to_chat(usr, "[span_notice("Jab")]: Left Left/Right Right with the opposite hand. Regular damage. If you're blind, you'll make a blind jab instead.") + to_chat(usr, "[span_notice("Left/Right Hook")]: Left Right/Right Left with the matching hand. Does extra damage, but slows your next hit.") + to_chat(usr, "[span_notice("Uppercut")]: Left Right/Right Left with the opposite hand. Has a higher probability to knock out the target, but slows your next hit.") + + to_chat(usr, "While in Throw Mode, you can block incoming punches and return a bit of damage back to an attacker. Blocking attacks this way causes you to lose some stamina damage.") + + to_chat(usr, "Your boxing abilities are only able to be used on other boxers.") + // Boxing Variants! /// Evil Boxing; for sick, evil scoundrels. Has no honor, making it more lethal (therefore unable to be used by pacifists). @@ -294,9 +403,26 @@ name = "Evil Boxing" id = MARTIALART_EVIL_BOXING pacifist_style = FALSE + help_verb = /mob/living/proc/evil_boxing_help honorable_boxer = FALSE boxing_traits = list(TRAIT_BOXING_READY, TRAIT_STRENGTH, TRAIT_STIMMED) +/mob/living/proc/evil_boxing_help() + set name = "Focus on Brawling" + set desc = "You ponder how best to rearrange the faces of your enemies." + set category = "Evil Boxing" + to_chat(usr, "You contemplate on the violence ahead, visualizing how best to throw a punch.") + + to_chat(usr, "What moves you perform depend on what mouse buttons you click, and whether the last button clicked matches which hand you have selected when you throw the last punch.") + + to_chat(usr, "[span_notice("Straight Punch")]: Left Left/Right Right with the matching hand. Regular damage.") + to_chat(usr, "[span_notice("Jab")]: Left Left/Right Right with the opposite hand. Regular damage. If you're blind, you'll make a blind jab instead.") + to_chat(usr, "[span_notice("Left/Right Hook")]: Left Right/Right Left with the matching hand. Does extra damage, but slows your next hit.") + to_chat(usr, "[span_notice("Uppercut")]: Left Right/Right Left with the opposite hand. Has a higher probability to knock out the target, but slows your next hit.") + to_chat(usr, "[span_notice("Sucker Punch")]: Any combination done to a vulnerable target becomes a sucker punch. This could knock them out in one!.") + + to_chat(usr, "While in Throw Mode, you can block incoming punches and return a bit of damage back to an attacker. Blocking attacks this way causes you to lose some stamina damage.") + /// Hunter Boxing: for the uncaring, completely deranged one-spacer ecological disaster. /// The honor check accepts boxing ready targets, OR various biotypes as valid targets. Uses a special crit effect rather than the standard one (against monsters). /// I guess technically, this allows for lethal boxing. If you want. @@ -304,14 +430,33 @@ name = "Hunter Boxing" id = MARTIALART_HUNTER_BOXING pacifist_style = FALSE + help_verb = /mob/living/proc/hunter_boxing_help default_damage_type = BRUTE boxing_traits = list(TRAIT_BOXING_READY) /// The mobs we are looking for to pass the honor check - var/honorable_mob_biotypes = MOB_BEAST | MOB_SPECIAL | MOB_PLANT | MOB_BUG | MOB_MINING + var/honorable_mob_biotypes = MOB_BEAST | MOB_SPECIAL | MOB_PLANT | MOB_BUG | MOB_MINING | MOB_CRUSTACEAN | MOB_REPTILE /// Our crit shout words. First word is then paired with a second word to form an attack name. var/list/first_word_strike = list("Extinction", "Brutalization", "Explosion", "Adventure", "Thunder", "Lightning", "Sonic", "Atomizing", "Whirlwind", "Tornado", "Shark", "Falcon") var/list/second_word_strike = list(" Punch", " Pawnch", "-punch", " Jab", " Hook", " Fist", " Uppercut", " Straight", " Strike", " Lunge") +/mob/living/proc/hunter_boxing_help() + set name = "Focus on the Hunt" + set desc = "You focus on how to most effectively punch the hell out of another endangered species." + set category = "Hunter Boxing" + to_chat(usr, "You focus on your Fists. You focus on Adventure. You focus on the Hunt.") + + to_chat(usr, "What moves you perform depend on what mouse buttons you click, and whether the last button clicked matches which hand you have selected when you throw the last punch.") + + to_chat(usr, "[span_notice("Straight Punch")]: Left Left/Right Right with the matching hand. Regular damage.") + to_chat(usr, "[span_notice("Jab")]: Left Left/Right Right with the opposite hand. Regular damage. If you're blind, you'll make a blind jab instead.") + to_chat(usr, "[span_notice("Left/Right Hook")]: Left Right/Right Left with the matching hand. Does extra damage, but slows your next hit.") + to_chat(usr, "[span_notice("Uppercut")]: Left Right/Right Left with the opposite hand. Has a higher probability to critically hit the target, but slows your next hit.") + + to_chat(usr, "While in Throw Mode, you can block incoming punches and return a bit of damage back to an attacker. Blocking attacks this way causes you to lose some stamina damage.") + to_chat(usr, "Stringing together effective combos restores some of your health and deals even more damage.") + + to_chat(usr, "Your hunter boxing abilities are only able to be used on the various flora, fauna and unnatural creatures that reside in this universe. Against normal humanoids, you are just a boxer.") + /datum/martial_art/boxing/hunter/honor_check(mob/living/possible_boxer) if(HAS_TRAIT(possible_boxer, TRAIT_BOXING_READY)) return TRUE @@ -360,7 +505,26 @@ defender.apply_damage(rand(15,20), default_damage_type, BODY_ZONE_CHEST) +/datum/martial_art/boxing/hunter/skill_experience_adjustment(mob/living/boxer, mob/living/defender, experience_value) + if(defender.mob_biotypes & MOB_HUMANOID && !istype(defender, /mob/living/simple_animal/hostile/megafauna)) + return ..() //IF they're a normal human, we give the normal amount of experience instead + + var/gravity_modifier = boxer.has_gravity() > STANDARD_GRAVITY ? 2 : 1 + var/big_game_bonus = (defender.maxHealth / 500) + + boxer.mind?.adjust_experience(/datum/skill/athletics, round(experience_value * (gravity_modifier + big_game_bonus), 1)) + #undef LEFT_RIGHT_COMBO #undef RIGHT_LEFT_COMBO #undef LEFT_LEFT_COMBO #undef RIGHT_RIGHT_COMBO + +#undef STRAIGHT_PUNCH +#undef RIGHT_HOOK +#undef LEFT_HOOK +#undef UPPERCUT +#undef LIGHT_JAB +#undef DISCOMBOBULATE +#undef BLIND_JAB +#undef CRAVEN_BLOW +#undef NO_COMBO diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index f2d65bf20ac1..4e3815a1e5dd 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -50,20 +50,30 @@ return NONE if(attack_type == PROJECTILE_ATTACK) return NONE - if(!prob(block_chance)) + + var/blocking_text = "block" + var/blocking_text_s = "blocks" + var/potential_block_chance = block_chance + + if(attack_type == OVERWHELMING_ATTACK) + blocking_text = "dodge" + blocking_text_s = "dodges" + potential_block_chance = clamp(round(potential_block_chance / (attack_type == OVERWHELMING_ATTACK ? 2 : 1), 1), 0, 100) + + if(!prob(potential_block_chance)) return NONE var/mob/living/attacker = GET_ASSAILANT(hitby) if(istype(attacker) && cqc_user.Adjacent(attacker)) cqc_user.visible_message( - span_danger("[cqc_user] blocks [attack_text] and twists [attacker]'s arm behind [attacker.p_their()] back!"), - span_userdanger("You block [attack_text]!"), + span_danger("[cqc_user] [blocking_text_s] [attack_text] and twists [attacker]'s arm behind [attacker.p_their()] back!"), + span_userdanger("You [blocking_text] [attack_text]!"), ) attacker.Stun(4 SECONDS) else cqc_user.visible_message( - span_danger("[cqc_user] blocks [attack_text]!"), - span_userdanger("You block [attack_text]!"), + span_danger("[cqc_user] [blocking_text_s] [attack_text]!"), + span_userdanger("You [blocking_text] [attack_text]!"), ) return SUCCESSFUL_BLOCK @@ -115,7 +125,7 @@ return FALSE attacker.do_attack_animation(defender) - if(defender.body_position == LYING_DOWN && !defender.IsUnconscious() && defender.getStaminaLoss() >= 100) + if(defender.body_position == LYING_DOWN && !defender.IsUnconscious() && defender.get_stamina_loss() >= 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!"), @@ -130,7 +140,7 @@ 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) + defender.adjust_organ_loss(ORGAN_SLOT_BRAIN, 15, 150) else defender.visible_message( @@ -146,7 +156,7 @@ defender.throw_at(throw_target, 1, 14, attacker) defender.apply_damage(10, attacker.get_attack_type()) if(defender.body_position == LYING_DOWN && !defender.IsUnconscious()) - defender.adjustStaminaLoss(45) + defender.adjust_stamina_loss(45) log_combat(attacker, defender, "kicked (CQC)") return TRUE @@ -162,7 +172,7 @@ attacker, ) to_chat(attacker, span_danger("You punch [defender]'s neck!")) - defender.adjustStaminaLoss(60) + defender.adjust_stamina_loss(60) playsound(attacker, 'sound/items/weapons/cqchit1.ogg', 50, TRUE, -1) return TRUE @@ -181,7 +191,7 @@ attacker, ) to_chat(attacker, span_danger("You lock [defender] into a restraining position!")) - defender.adjustStaminaLoss(20) + defender.adjust_stamina_loss(20) defender.Stun(10 SECONDS) restraining_mob = WEAKREF(defender) addtimer(VARSET_CALLBACK(src, restraining_mob, null), 5 SECONDS, TIMER_UNIQUE) @@ -205,7 +215,7 @@ var/obj/item/held_item = defender.get_active_held_item() if(held_item && defender.temporarilyRemoveItemFromInventory(held_item)) attacker.put_in_hands(held_item) - defender.adjustStaminaLoss(50) + defender.adjust_stamina_loss(50) defender.apply_damage(25, attacker.get_attack_type()) return TRUE diff --git a/code/datums/martial/kaza_ruk.dm b/code/datums/martial/kaza_ruk.dm new file mode 100644 index 000000000000..1f7b0625dc02 --- /dev/null +++ b/code/datums/martial/kaza_ruk.dm @@ -0,0 +1,335 @@ +/datum/martial_art/kaza_ruk + name = "Kaza Ruk" + id = MARTIALART_KAZA_RUK + grab_damage_modifier = 5 + grab_escape_chance_modifier = -10 + VAR_PRIVATE/datum/action/neck_chop/neckchop + VAR_PRIVATE/datum/action/low_sweep/lowsweep + VAR_PRIVATE/datum/action/lung_punch/lungpunch + +/datum/martial_art/kaza_ruk/activate_style(mob/living/new_holder) + . = ..() + RegisterSignal(new_holder, COMSIG_HUMAN_PUNCHED, PROC_REF(blow_followup)) + +/datum/martial_art/kaza_ruk/deactivate_style(mob/living/old_holder) + . = ..() + UnregisterSignal(old_holder, COMSIG_HUMAN_PUNCHED) + +/datum/martial_art/kaza_ruk/New() + . = ..() + neckchop = new(src) + lowsweep = new(src) + lungpunch = new(src) + +/datum/martial_art/kaza_ruk/Destroy() + neckchop = null + lowsweep = null + lungpunch = null + return ..() + +/datum/action/neck_chop + name = "Neck Chop" + desc = "Injures the neck, stopping the victim from speaking for a while." + button_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "neckchop" + check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS + +/datum/action/neck_chop/Trigger(mob/clicker, trigger_flags) + . = ..() + if(!.) + return + var/datum/martial_art/source = target + if (source.streak == "neck_chop") + owner.visible_message(span_danger("[owner] assumes a neutral stance."), "Your next attack is cleared.") + owner.balloon_alert(owner, "cleared") + source.streak = "" + else + owner.visible_message(span_danger("[owner] assumes the Neck Chop stance!"), "Your next attack will be a Neck Chop.") + owner.balloon_alert(owner, "neck chop") + source.streak = "neck_chop" + +/datum/action/low_sweep + name = "Low Sweep" + desc = "Trips the victim, knocking them down for a brief moment." + button_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "legsweep" + check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS + +/datum/action/low_sweep/Trigger(mob/clicker, trigger_flags) + . = ..() + if(!.) + return + var/datum/martial_art/source = target + if (source.streak == "low_sweep") + owner.visible_message(span_danger("[owner] assumes a neutral stance."), "Your next attack is cleared.") + owner.balloon_alert(owner, "cleared") + source.streak = "" + else + owner.visible_message(span_danger("[owner] assumes the Low Sweep stance!"), "Your next attack will be a Low Sweep.") + owner.balloon_alert(owner, "low sweep") + source.streak = "low_sweep" + +/datum/action/lung_punch//referred to internally as 'quick choke' + name = "Lung Punch" + desc = "Delivers a strong punch just above the victim's abdomen, constraining the lungs. The victim will be unable to breathe for a short time." + button_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "lungpunch" + check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS + +/datum/action/lung_punch/Trigger(mob/clicker, trigger_flags) + . = ..() + if(!.) + return + var/datum/martial_art/source = target + if (source.streak == "quick_choke") + owner.visible_message(span_danger("[owner] assumes a neutral stance."), "Your next attack is cleared.") + owner.balloon_alert(owner, "cleared") + source.streak = "" + else + owner.visible_message(span_danger("[owner] assumes the Lung Punch stance!"), "Your next attack will be a Lung Punch.") + owner.balloon_alert(owner, "lung punch") + source.streak = "quick_choke"//internal name for lung punch + +/datum/martial_art/kaza_ruk/activate_style(mob/living/new_holder) + . = ..() + to_chat(new_holder, span_userdanger("You know the arts of [name]!")) + to_chat(new_holder, span_danger("Place your cursor over a move at the top of the screen to see what it does.")) + neckchop.Grant(new_holder) + lowsweep.Grant(new_holder) + lungpunch.Grant(new_holder) + +/datum/martial_art/kaza_ruk/deactivate_style(mob/living/remove_from) + to_chat(remove_from, span_userdanger("You suddenly forget the arts of [name]...")) + neckchop?.Remove(remove_from) + lowsweep?.Remove(remove_from) + lungpunch?.Remove(remove_from) + return ..() + +/datum/martial_art/kaza_ruk/proc/check_streak(mob/living/attacker, mob/living/defender) + switch(streak) + if("neck_chop") + streak = "" + neck_chop(attacker, defender) + return TRUE + if("low_sweep") + streak = "" + low_sweep(attacker, defender) + return TRUE + if("quick_choke")//is actually lung punch + streak = "" + quick_choke(attacker, defender) + return TRUE + return FALSE + +/datum/martial_art/kaza_ruk/proc/low_sweep(mob/living/attacker, mob/living/defender) + if(defender.stat != CONSCIOUS || defender.IsParalyzed()) + return MARTIAL_ATTACK_INVALID + if(HAS_TRAIT(attacker, TRAIT_PACIFISM)) + return MARTIAL_ATTACK_INVALID // Does 5 damage, so we can't let pacifists leg sweep. + + var/tail_sweeping = FALSE + var/sweeping_language = "leg" + if(ishuman(attacker)) + var/mob/living/carbon/possible_human = attacker + var/obj/item/organ/tail/lizard/possible_lizard_tail = possible_human.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + if(possible_lizard_tail) + tail_sweeping = TRUE + sweeping_language = "tail" + + defender.visible_message( + span_warning("[attacker] [sweeping_language] 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 [sweeping_language] sweep [defender]!")) + playsound(attacker, 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + + if(tail_sweeping) + attacker.emote("spin") + + defender.apply_damage(5, BRUTE, BODY_ZONE_CHEST) + defender.Knockdown(6 SECONDS) + log_combat(attacker, defender, "leg sweeped") + return MARTIAL_ATTACK_SUCCESS + +/datum/martial_art/kaza_ruk/proc/quick_choke(mob/living/attacker, mob/living/defender)//is actually lung punch + attacker.do_attack_animation(defender) + defender.visible_message( + span_warning("[attacker] pounds [defender] on the chest!"), + span_userdanger("Your chest is slammed by [attacker]! You can't breathe!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) + to_chat(attacker, span_danger("You pound [defender] on the chest!")) + playsound(attacker, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) + if(defender.losebreath <= 10) + defender.losebreath = clamp(defender.losebreath + 5, 0, 10) + defender.adjust_oxy_loss(10) + log_combat(attacker, defender, "quickchoked") + return MARTIAL_ATTACK_SUCCESS + +/datum/martial_art/kaza_ruk/proc/neck_chop(mob/living/attacker, mob/living/defender) + if(HAS_TRAIT(attacker, TRAIT_PACIFISM)) + return MARTIAL_ATTACK_INVALID // Does 10 damage, so we can't let pacifists neck chop. + attacker.do_attack_animation(defender) + defender.visible_message( + span_warning("[attacker] karate chops [defender]'s neck!"), + span_userdanger("Your neck is karate chopped by [attacker], rendering you unable to speak!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) + to_chat(attacker, span_danger("You karate chop [defender]'s neck, rendering [defender.p_them()] unable to speak!")) + playsound(attacker, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) + defender.apply_damage(10, attacker.get_attack_type(), BODY_ZONE_HEAD) + defender.adjust_silence_up_to(20 SECONDS, 20 SECONDS) + log_combat(attacker, defender, "neck chopped") + return MARTIAL_ATTACK_SUCCESS + +/datum/martial_art/kaza_ruk/harm_act(mob/living/attacker, mob/living/defender) + if(defender.check_block(attacker, 10, attacker.name, UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL + + if(check_streak(attacker, defender)) + return MARTIAL_ATTACK_SUCCESS + + return MARTIAL_ATTACK_INVALID + +/datum/martial_art/kaza_ruk/disarm_act(mob/living/attacker, mob/living/defender) + if(defender.check_block(attacker, 0, attacker.name, UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL + if(check_streak(attacker, defender)) + return MARTIAL_ATTACK_SUCCESS + var/obj/item/stuff_in_hand = defender.get_active_held_item() + if(prob(60) && stuff_in_hand && defender.temporarilyRemoveItemFromInventory(stuff_in_hand)) + attacker.put_in_hands(stuff_in_hand) + defender.visible_message( + span_danger("[attacker] disarms [defender]!"), + span_userdanger("You're disarmed by [attacker]!"), + span_hear("You hear aggressive shuffling!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) + to_chat(attacker, span_danger("You disarm [defender]!")) + playsound(defender, 'sound/items/weapons/thudswoosh.ogg', 50, TRUE, -1) + log_combat(attacker, defender, "disarmed (Kaza Ruk)", addition = "(disarmed of [stuff_in_hand])") + return MARTIAL_ATTACK_INVALID // normal shove + +/// First, determine if we're going to execute our followup attack + +/datum/martial_art/kaza_ruk/proc/blow_followup(mob/living/source, mob/living/target, damage, attack_type, obj/item/bodypart/affecting, final_armor_block, kicking, limb_sharpness) + SIGNAL_HANDLER + + if(!prob(50)) + return + + addtimer(CALLBACK(src, PROC_REF(execute_followup), source, target, damage, attack_type, affecting, final_armor_block, kicking, limb_sharpness), 0.25 SECONDS) + +/// After our delay, do the followup. + +/datum/martial_art/kaza_ruk/proc/execute_followup(mob/living/source, mob/living/target, damage, attack_type, obj/item/bodypart/affecting, final_armor_block, kicking, limb_sharpness) + if(QDELETED(source) || QDELETED(target)) + return + + if(!source.Adjacent(target)) + return + + var/tail_usage = FALSE + var/kick_language = "an axe kick" + var/strike_language = "an elbow strike" + if(ishuman(source)) + var/mob/living/carbon/possible_human = source + var/obj/item/organ/tail/lizard/possible_lizard_tail = possible_human.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + if(possible_lizard_tail) + tail_usage = TRUE + kick_language = "a helmsplitter tail strike" + strike_language = "a whiplash tail spin" + + source.visible_message( + span_warning("[source] follows up with [kicking ? kick_language : strike_language] against [target]!"), + span_notice("You deliver [kicking ? kick_language : strike_language] against [target]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + ) + if(tail_usage) + source.emote(kicking ? "flip" : "spin") + playsound(source, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) + source.do_attack_animation(target, ATTACK_EFFECT_KICK) + target.apply_damage(round(damage/3,1), attack_type, affecting, final_armor_block, wound_bonus = damage) //Ostensibly, apply a third of our damage again // We're not being too fussy about limb bonuses for this + log_combat(source, target, "auto-followup strike (Kaza Ruk)") + +//Kaza Ruk Gloves + +/obj/item/clothing/gloves/kaza_ruk + abstract_type = /obj/item/clothing/gloves/kaza_ruk + clothing_traits = list(TRAIT_FAST_CUFFING) + +/obj/item/clothing/gloves/kaza_ruk/Initialize(mapload) + . = ..() + AddComponent(/datum/component/martial_art_giver, /datum/martial_art/kaza_ruk) + +/datum/atom_skin/kaza_ruk + abstract_type = /datum/atom_skin/kaza_ruk + reset_missing = FALSE + /// Color (/matrix) applied with the skin. If null, no color is applied. + var/reskin_color + +/datum/atom_skin/kaza_ruk/apply(atom/apply_to) + . = ..() + if(reskin_color) + apply_to.add_atom_colour(color_matrix_filter(reskin_color), FIXED_COLOUR_PRIORITY) + +/datum/atom_skin/kaza_ruk/clear_skin(atom/clear_from) + . = ..() + if(reskin_color) + clear_from.remove_atom_colour(FIXED_COLOUR_PRIORITY, reskin_color) + +/datum/atom_skin/kaza_ruk/get_preview_icon(atom/for_atom) + var/image/generated = ..() + if(reskin_color) + generated.add_filter("preview_filter", 1, color_matrix_filter(reskin_color)) + return generated + +/datum/atom_skin/kaza_ruk/red + preview_name = "Red" + +/datum/atom_skin/kaza_ruk/blue + preview_name = "Blue" + reskin_color = list(0.33, 0.33, 0.33, 0, 0, 0, 0, 0, 1) + +/obj/item/clothing/gloves/kaza_ruk/sec//more obviously named, given to sec + name = "kaza ruk gloves" + desc = "These gloves seem to guide you through a non-lizardperson friendly variant of the Tiziran martial art, Kaza Ruk. \ + You're not entirely sure how they do that. Probably nanites." + icon_state = "fightgloves" + greyscale_colors = "#c41e0d" + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + resistance_flags = NONE + +/obj/item/clothing/gloves/kaza_ruk/sec/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/kaza_ruk, infinite = TRUE) + +/obj/item/clothing/gloves/kaza_ruk/combatglovesplus + name = "combat gloves plus" + desc = "These tactical gloves are fireproof and electrically insulated. These gloves seem to guide you through a non-lizardperson friendly variant of the Tiziran martial art, Kaza Ruk." + icon_state = "black" + greyscale_colors = "#2f2e31" + siemens_coefficient = 0 + strip_delay = 8 SECONDS + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + resistance_flags = NONE + armor_type = /datum/armor/kaza_ruk_combatglovesplus + +/datum/armor/kaza_ruk_combatglovesplus + bio = 90 + fire = 80 + acid = 50 diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm deleted file mode 100644 index 1df05ac15ad8..000000000000 --- a/code/datums/martial/krav_maga.dm +++ /dev/null @@ -1,252 +0,0 @@ -/datum/martial_art/krav_maga - name = "Krav Maga" - id = MARTIALART_KRAVMAGA - VAR_PRIVATE/datum/action/neck_chop/neckchop - VAR_PRIVATE/datum/action/leg_sweep/legsweep - VAR_PRIVATE/datum/action/lung_punch/lungpunch - -/datum/martial_art/krav_maga/New() - . = ..() - neckchop = new(src) - legsweep = new(src) - lungpunch = new(src) - -/datum/martial_art/krav_maga/Destroy() - neckchop = null - legsweep = null - lungpunch = null - return ..() - -/datum/action/neck_chop - name = "Neck Chop" - desc = "Injures the neck, stopping the victim from speaking for a while." - button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "neckchop" - check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS - -/datum/action/neck_chop/Trigger(mob/clicker, trigger_flags) - . = ..() - if(!.) - return - var/datum/martial_art/source = target - if (source.streak == "neck_chop") - owner.visible_message(span_danger("[owner] assumes a neutral stance."), "Your next attack is cleared.") - source.streak = "" - else - owner.visible_message(span_danger("[owner] assumes the Neck Chop stance!"), "Your next attack will be a Neck Chop.") - source.streak = "neck_chop" - -/datum/action/leg_sweep - name = "Leg Sweep" - desc = "Trips the victim, knocking them down for a brief moment." - button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "legsweep" - check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS - -/datum/action/leg_sweep/Trigger(mob/clicker, trigger_flags) - . = ..() - if(!.) - return - var/datum/martial_art/source = target - if (source.streak == "leg_sweep") - owner.visible_message(span_danger("[owner] assumes a neutral stance."), "Your next attack is cleared.") - source.streak = "" - else - owner.visible_message(span_danger("[owner] assumes the Leg Sweep stance!"), "Your next attack will be a Leg Sweep.") - source.streak = "leg_sweep" - -/datum/action/lung_punch//referred to internally as 'quick choke' - name = "Lung Punch" - desc = "Delivers a strong punch just above the victim's abdomen, constraining the lungs. The victim will be unable to breathe for a short time." - button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "lungpunch" - check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS - -/datum/action/lung_punch/Trigger(mob/clicker, trigger_flags) - . = ..() - if(!.) - return - var/datum/martial_art/source = target - if (source.streak == "quick_choke") - owner.visible_message(span_danger("[owner] assumes a neutral stance."), "Your next attack is cleared.") - source.streak = "" - else - owner.visible_message(span_danger("[owner] assumes the Lung Punch stance!"), "Your next attack will be a Lung Punch.") - source.streak = "quick_choke"//internal name for lung punch - -/datum/martial_art/krav_maga/activate_style(mob/living/new_holder) - . = ..() - to_chat(new_holder, span_userdanger("You know the arts of [name]!")) - to_chat(new_holder, span_danger("Place your cursor over a move at the top of the screen to see what it does.")) - neckchop.Grant(new_holder) - legsweep.Grant(new_holder) - lungpunch.Grant(new_holder) - -/datum/martial_art/krav_maga/deactivate_style(mob/living/remove_from) - to_chat(remove_from, span_userdanger("You suddenly forget the arts of [name]...")) - neckchop?.Remove(remove_from) - legsweep?.Remove(remove_from) - lungpunch?.Remove(remove_from) - return ..() - -/datum/martial_art/krav_maga/proc/check_streak(mob/living/attacker, mob/living/defender) - switch(streak) - if("neck_chop") - streak = "" - neck_chop(attacker, defender) - return TRUE - if("leg_sweep") - streak = "" - leg_sweep(attacker, defender) - return TRUE - if("quick_choke")//is actually lung punch - streak = "" - quick_choke(attacker, defender) - return TRUE - return FALSE - -/datum/martial_art/krav_maga/proc/leg_sweep(mob/living/attacker, mob/living/defender) - if(defender.stat != CONSCIOUS || defender.IsParalyzed()) - return MARTIAL_ATTACK_INVALID - if(HAS_TRAIT(attacker, TRAIT_PACIFISM)) - return MARTIAL_ATTACK_INVALID // Does 5 damage, so we can't let pacifists leg sweep. - defender.visible_message( - span_warning("[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(attacker, 'sound/effects/hit_kick.ogg', 50, TRUE, -1) - defender.apply_damage(5, BRUTE, BODY_ZONE_CHEST) - defender.Knockdown(6 SECONDS) - log_combat(attacker, defender, "leg sweeped") - return MARTIAL_ATTACK_SUCCESS - -/datum/martial_art/krav_maga/proc/quick_choke(mob/living/attacker, mob/living/defender)//is actually lung punch - attacker.do_attack_animation(defender) - defender.visible_message( - span_warning("[attacker] pounds [defender] on the chest!"), - span_userdanger("Your chest is slammed by [attacker]! You can't breathe!"), - span_hear("You hear a sickening sound of flesh hitting flesh!"), - COMBAT_MESSAGE_RANGE, - attacker, - ) - to_chat(attacker, span_danger("You pound [defender] on the chest!")) - playsound(attacker, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) - if(defender.losebreath <= 10) - defender.losebreath = clamp(defender.losebreath + 5, 0, 10) - defender.adjustOxyLoss(10) - log_combat(attacker, defender, "quickchoked") - return MARTIAL_ATTACK_SUCCESS - -/datum/martial_art/krav_maga/proc/neck_chop(mob/living/attacker, mob/living/defender) - if(HAS_TRAIT(attacker, TRAIT_PACIFISM)) - return MARTIAL_ATTACK_INVALID // Does 10 damage, so we can't let pacifists neck chop. - attacker.do_attack_animation(defender) - defender.visible_message( - span_warning("[attacker] karate chops [defender]'s neck!"), - span_userdanger("Your neck is karate chopped by [attacker], rendering you unable to speak!"), - span_hear("You hear a sickening sound of flesh hitting flesh!"), - COMBAT_MESSAGE_RANGE, - attacker, - ) - to_chat(attacker, span_danger("You karate chop [defender]'s neck, rendering [defender.p_them()] unable to speak!")) - playsound(attacker, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) - defender.apply_damage(10, attacker.get_attack_type(), BODY_ZONE_HEAD) - defender.adjust_silence_up_to(20 SECONDS, 20 SECONDS) - log_combat(attacker, defender, "neck chopped") - return MARTIAL_ATTACK_SUCCESS - -/datum/martial_art/krav_maga/harm_act(mob/living/attacker, mob/living/defender) - var/picked_hit_type = pick("punch", "kick") - var/bonus_damage = 0 - if(defender.body_position == LYING_DOWN) - bonus_damage += 5 - picked_hit_type = "stomp" - - if(defender.check_block(attacker, 10 + bonus_damage, "[attacker]'s [picked_hit_type]", UNARMED_ATTACK)) - return MARTIAL_ATTACK_FAIL - if(check_streak(attacker, defender)) - return MARTIAL_ATTACK_SUCCESS - - log_combat(attacker, defender, "[picked_hit_type]ed") - var/obj/item/bodypart/affecting = defender.get_bodypart(defender.get_random_valid_zone(attacker.zone_selected)) - defender.apply_damage(10 + bonus_damage, attacker.get_attack_type(), affecting) - if(picked_hit_type == "kick" || picked_hit_type == "stomp") - attacker.do_attack_animation(defender, ATTACK_EFFECT_KICK) - playsound(defender, 'sound/effects/hit_kick.ogg', 50, TRUE, -1) - else - attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) - playsound(defender, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) - defender.visible_message( - span_danger("[attacker] [picked_hit_type]s [defender]!"), - 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] with [name]") - return MARTIAL_ATTACK_SUCCESS - -/datum/martial_art/krav_maga/disarm_act(mob/living/attacker, mob/living/defender) - if(defender.check_block(attacker, 0, attacker.name, UNARMED_ATTACK)) - return MARTIAL_ATTACK_FAIL - if(check_streak(attacker, defender)) - return MARTIAL_ATTACK_SUCCESS - var/obj/item/stuff_in_hand = defender.get_active_held_item() - if(prob(60) && stuff_in_hand && defender.temporarilyRemoveItemFromInventory(stuff_in_hand)) - attacker.put_in_hands(stuff_in_hand) - defender.visible_message( - span_danger("[attacker] disarms [defender]!"), - span_userdanger("You're disarmed by [attacker]!"), - span_hear("You hear aggressive shuffling!"), - COMBAT_MESSAGE_RANGE, - attacker, - ) - to_chat(attacker, span_danger("You disarm [defender]!")) - playsound(defender, 'sound/items/weapons/thudswoosh.ogg', 50, TRUE, -1) - log_combat(attacker, defender, "disarmed (Krav Maga)", addition = "(disarmed of [stuff_in_hand])") - return MARTIAL_ATTACK_INVALID // normal shove - -//Krav Maga Gloves - -/obj/item/clothing/gloves/krav_maga - abstract_type = /obj/item/clothing/gloves/krav_maga - clothing_traits = list(TRAIT_FAST_CUFFING) - -/obj/item/clothing/gloves/krav_maga/Initialize(mapload) - . = ..() - AddComponent(/datum/component/martial_art_giver, /datum/martial_art/krav_maga) - -/obj/item/clothing/gloves/krav_maga/sec//more obviously named, given to sec - name = "krav maga gloves" - desc = "These gloves can teach you to perform Krav Maga using nanochips." - icon_state = "fightgloves" - greyscale_colors = "#c41e0d" - cold_protection = HANDS - min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT - heat_protection = HANDS - max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - resistance_flags = NONE - -/obj/item/clothing/gloves/krav_maga/combatglovesplus - name = "combat gloves plus" - desc = "These tactical gloves are fireproof and electrically insulated, and through the use of nanochip technology will teach you the martial art of krav maga." - icon_state = "black" - greyscale_colors = "#2f2e31" - siemens_coefficient = 0 - strip_delay = 8 SECONDS - cold_protection = HANDS - min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT - heat_protection = HANDS - max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - resistance_flags = NONE - armor_type = /datum/armor/krav_maga_combatglovesplus - -/datum/armor/krav_maga_combatglovesplus - bio = 90 - fire = 80 - acid = 50 diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm index 99c2b0e22246..1578ff32152c 100644 --- a/code/datums/martial/psychotic_brawl.dm +++ b/code/datums/martial/psychotic_brawl.dm @@ -73,7 +73,7 @@ if(iscarbon(defender)) var/mob/living/carbon/carbon_defender = defender if(!istype(carbon_defender.head, /obj/item/clothing/head/helmet/) && !istype(carbon_defender.head, /obj/item/clothing/head/utility/hardhat)) - carbon_defender.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) + carbon_defender.adjust_organ_loss(ORGAN_SLOT_BRAIN, 5) attacker.Stun(rand(1 SECONDS, 4.5 SECONDS)) defender.Stun(rand(0.5 SECONDS, 3 SECONDS)) if(HAS_TRAIT(attacker, TRAIT_PACIFISM)) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index b4021fd0b402..b6f556e3aa83 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -1,66 +1,101 @@ -#define STRONG_PUNCH_COMBO "HH" +#define WRIST_WRENCH_COMBO "HG" #define LAUNCH_KICK_COMBO "HD" #define DROP_KICK_COMBO "DD" +#define KNEE_STOMACH_COMBO "GH" /datum/martial_art/the_sleeping_carp name = "The Sleeping Carp" id = MARTIALART_SLEEPINGCARP help_verb = /mob/living/proc/sleeping_carp_help display_combos = TRUE + grab_state_modifier = 1 /// List of traits applied to users of this martial art. - var/list/scarp_traits = list(TRAIT_NOGUNS, TRAIT_TOSS_GUN_HARD, TRAIT_HARDLY_WOUNDED, TRAIT_NODISMEMBER, TRAIT_HEAVY_SLEEPER) + var/list/scarp_traits = list(TRAIT_NOGUNS, TRAIT_TOSS_GUN_HARD, TRAIT_HARDLY_WOUNDED, TRAIT_NODISMEMBER, TRAIT_HEAVY_SLEEPER, TRAIT_PERFECT_ATTACKER) + /// List of objects exempt from reducing dodge probabilities + var/list/exempt_objects = list( + /obj/item/melee/baton/nunchaku, + /obj/item/staff/bostaff, + /obj/item/bambostaff, + /obj/item/cane, + /obj/item/nullrod/bostaff, + /obj/item/knife, + /obj/item/restraints/legcuffs/bola, + /obj/item/storage/toolbox, + /obj/item/spear, + /obj/item/claymore/shortsword, + /obj/item/nullrod/nullblade, + /obj/item/extendohand, + /obj/item/mop, + /obj/item/pushbroom, + /obj/item/melee/baseball_bat, + /obj/item/crowbar/hammer, + /obj/item/toy/plush/carpplushie, + ) /datum/martial_art/the_sleeping_carp/activate_style(mob/living/new_holder) . = ..() new_holder.add_traits(scarp_traits, SLEEPING_CARP_TRAIT) RegisterSignal(new_holder, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) RegisterSignal(new_holder, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(hit_by_projectile)) + RegisterSignal(new_holder, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(check_dodge)) new_holder.faction |= FACTION_CARP //:D new_holder.grant_language(/datum/language/carptongue, ALL, type) /datum/martial_art/the_sleeping_carp/deactivate_style(mob/living/remove_from) remove_from.remove_traits(scarp_traits, SLEEPING_CARP_TRAIT) - UnregisterSignal(remove_from, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_PRE_BULLET_ACT)) + UnregisterSignal(remove_from, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_PRE_BULLET_ACT, COMSIG_LIVING_CHECK_BLOCK)) remove_from.faction -= FACTION_CARP //:( remove_from.remove_language(/datum/language/carptongue, ALL, type) return ..() /datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/attacker, mob/living/defender) - if(findtext(streak,STRONG_PUNCH_COMBO)) + if(findtext(streak,WRIST_WRENCH_COMBO)) reset_streak() - return strongPunch(attacker, defender) + return wrist_wrench(attacker, defender) if(findtext(streak,LAUNCH_KICK_COMBO)) reset_streak() - return launchKick(attacker, defender) + return launch_kick(attacker, defender) if(findtext(streak,DROP_KICK_COMBO)) reset_streak() - return dropKick(attacker, defender) + return drop_kick(attacker, defender) + + if(findtext(streak,KNEE_STOMACH_COMBO)) + reset_streak() + return knee_stomach(attacker, defender) return FALSE -///Gnashing Teeth: Harm Harm, consistent 20 force punch on every second harm punch -/datum/martial_art/the_sleeping_carp/proc/strongPunch(mob/living/attacker, mob/living/defender) - // this var is so that the strong punch is always aiming for the body part the user is targeting and not trying to apply to the chest before deviating - var/obj/item/bodypart/affecting = defender.get_bodypart(defender.get_random_valid_zone(attacker.zone_selected)) +/// Gnashing Teeth: Harm Grab, twists and possibly breaks the target's arm, disarming them. +/datum/martial_art/the_sleeping_carp/proc/wrist_wrench(mob/living/attacker, mob/living/defender) + // Determine if our defender is a carbon. If not, we don't wrist wrench + if(!iscarbon(defender)) + return FALSE + + // Determine if our target has a functioning active arm. If not, return. + var/obj/item/bodypart/affecting = defender.get_active_hand() + + if(!affecting) + return FALSE + attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) - var/atk_verb = pick("precisely kick", "brutally chop", "cleanly hit", "viciously slam") defender.visible_message( - span_danger("[attacker] [atk_verb]s [defender]!"), - span_userdanger("[attacker] [atk_verb]s you!"), - span_hear("You hear a sickening sound of flesh hitting flesh!"), + span_danger("[attacker] violently twists [defender]'s [affecting]!"), + span_userdanger("[attacker] violently twists your [affecting]!"), + span_hear("You hear a sickening sound of bone snapping!"), null, attacker, ) - to_chat(attacker, span_danger("You [atk_verb] [defender]!")) + to_chat(attacker, span_danger("You violently twist [defender]'s [affecting]!")) playsound(defender, 'sound/items/weapons/punch1.ogg', 25, TRUE, -1) - log_combat(attacker, defender, "strong punched (Sleeping Carp)") - defender.apply_damage(20, attacker.get_attack_type(), affecting) + log_combat(attacker, defender, "wrist wrenched (Sleeping Carp)") + defender.apply_damage(20, BRUTE, affecting, wound_bonus = 30) + defender.drop_all_held_items() return TRUE -///Crashing Wave Kick: Harm Disarm combo, throws people seven tiles backwards -/datum/martial_art/the_sleeping_carp/proc/launchKick(mob/living/attacker, mob/living/defender) +/// Crashing Wave Kick: Harm Disarm combo, throws people seven tiles backwards +/datum/martial_art/the_sleeping_carp/proc/launch_kick(mob/living/attacker, mob/living/defender) attacker.do_attack_animation(defender, ATTACK_EFFECT_KICK) defender.visible_message( span_warning("[attacker] kicks [defender] square in the chest, sending them flying!"), @@ -76,8 +111,8 @@ log_combat(attacker, defender, "launchkicked (Sleeping Carp)") return TRUE -///Keelhaul: Disarm Disarm combo, knocks people down and deals substantial stamina damage, and also discombobulates them. Knocks objects out of their hands if they're already on the ground. -/datum/martial_art/the_sleeping_carp/proc/dropKick(mob/living/attacker, mob/living/defender) +/// Keelhaul: Disarm Disarm combo, knocks people down and deals substantial stamina damage, and also discombobulates them. Knocks objects out of their hands if they're already on the ground. +/datum/martial_art/the_sleeping_carp/proc/drop_kick(mob/living/attacker, mob/living/defender) attacker.do_attack_animation(defender, ATTACK_EFFECT_KICK) playsound(attacker, 'sound/effects/hit_kick.ogg', 50, TRUE, -1) if(defender.body_position == STANDING_UP) @@ -94,6 +129,25 @@ log_combat(attacker, defender, "dropkicked (Sleeping Carp)") return TRUE +/// Kraken Wrack: Grab Harm combo, causes them to be silenced and briefly stunned, as well as doing a moderate amount of stamina damage. +/datum/martial_art/the_sleeping_carp/proc/knee_stomach(mob/living/attacker, mob/living/defender) + attacker.do_attack_animation(defender, ATTACK_EFFECT_KICK) + playsound(attacker, 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + defender.visible_message( + span_warning("[attacker] violently slams [attacker.p_their()] knee into [defender]!"), + span_userdanger("You slam your knee straight into [defender]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) + defender.apply_damage(20, STAMINA) + defender.Paralyze(1 SECONDS) + defender.adjust_silence_up_to(5 SECONDS, 5 SECONDS) + if(defender.losebreath <= 10) + defender.losebreath = clamp(defender.losebreath + 5, 0, 10) + log_combat(attacker, defender, "kneed in the stomach (Sleeping Carp)") + return TRUE + /datum/martial_art/the_sleeping_carp/grab_act(mob/living/attacker, mob/living/defender) if(!can_deflect(attacker)) //allows for deniability return MARTIAL_ATTACK_INVALID @@ -108,7 +162,7 @@ var/grab_log_description = "grabbed" attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) playsound(defender, 'sound/items/weapons/punch1.ogg', 25, TRUE, -1) - if(defender.stat != DEAD && !defender.IsUnconscious() && defender.getStaminaLoss() >= 80) //We put our target to sleep. + if(defender.stat != DEAD && !defender.IsUnconscious() && defender.get_stamina_loss() >= 80) //We put our target to sleep. defender.visible_message( span_danger("[attacker] carefully pinch a nerve in [defender]'s neck, knocking them out cold!"), span_userdanger("[attacker] pinches something in your neck, and you fall unconscious!"), @@ -142,29 +196,14 @@ defender.investigate_log("has had [defender.p_their()] neck snapped by [attacker].", INVESTIGATE_DEATHS) return MARTIAL_ATTACK_SUCCESS - var/atk_verb = pick("kick", "chop", "hit", "slam") - var/final_damage = rand(10, 15) - if(defender.check_block(attacker, final_damage, "[attacker]'s [atk_verb]", UNARMED_ATTACK)) + if(defender.check_block(attacker, 10, attacker.name, UNARMED_ATTACK)) return MARTIAL_ATTACK_FAIL add_to_streak("H", defender) if(check_streak(attacker, defender)) return MARTIAL_ATTACK_SUCCESS - var/obj/item/bodypart/affecting = defender.get_bodypart(defender.get_random_valid_zone(attacker.zone_selected)) - attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) - defender.visible_message( - span_danger("[attacker] [atk_verb]s [defender]!"), - span_userdanger("[attacker] [atk_verb]s you!"), - span_hear("You hear a sickening sound of flesh hitting flesh!"), - null, - attacker, - ) - to_chat(attacker, span_danger("You [atk_verb] [defender]!")) - defender.apply_damage(final_damage, attacker.get_attack_type(), affecting, wound_bonus = CANT_WOUND) - playsound(defender, 'sound/items/weapons/punch1.ogg', 25, TRUE, -1) - log_combat(attacker, defender, "punched (Sleeping Carp)") - return MARTIAL_ATTACK_SUCCESS + return MARTIAL_ATTACK_INVALID // normal punch /datum/martial_art/the_sleeping_carp/disarm_act(mob/living/attacker, mob/living/defender) if(!can_deflect(attacker)) //allows for deniability @@ -198,9 +237,25 @@ /datum/martial_art/the_sleeping_carp/proc/hit_by_projectile(mob/living/carp_user, obj/projectile/hitting_projectile, def_zone) SIGNAL_HANDLER + var/determine_avoidance = 100 + var/additional_adjustments = 0 + + if(istype(hitting_projectile, /obj/projectile/bullet/c38/match/true)) // 75% chance to ignore evasion + additional_adjustments -= 75 + + determine_avoidance = clamp(determine_avoidance + carp_style_check(carp_user) + additional_adjustments, 0, 100) + + if(istype(hitting_projectile, /obj/projectile/bullet/harpoon)) // WHITE WHALE HOLY GRAIL + return NONE + if(!can_deflect(carp_user)) return NONE + if(!prob(determine_avoidance)) + return NONE + + + carp_user.visible_message( span_danger("[carp_user] effortlessly swats [hitting_projectile] aside! [carp_user.p_They()] can block bullets with [carp_user.p_their()] bare hands!"), span_userdanger("You deflect [hitting_projectile]!"), @@ -210,7 +265,7 @@ hitting_projectile.set_angle(rand(0, 360))//SHING return COMPONENT_BULLET_PIERCED -///Signal from getting attacked with an item, for a special interaction with touch spells +/// Signal from getting attacked with an item, for a special interaction with touch spells /datum/martial_art/the_sleeping_carp/proc/on_attackby(mob/living/carp_user, obj/item/attack_weapon, mob/attacker, list/modifiers) SIGNAL_HANDLER @@ -225,6 +280,98 @@ ) return COMPONENT_NO_AFTERATTACK +/// If our user has committed to being as martial arty as they can be, they may be able to avoid incoming attacks. +/datum/martial_art/the_sleeping_carp/proc/check_dodge(mob/living/carp_user, atom/movable/hitby, damage, attack_text, attack_type, ...) + SIGNAL_HANDLER + + var/determine_avoidance = clamp(round(carp_style_check(carp_user) / (attack_type == OVERWHELMING_ATTACK ? 2 : 1), 1), 0, 75) + + if(!can_deflect(carp_user)) + return + + if(attack_type == PROJECTILE_ATTACK || attack_type == THROWN_PROJECTILE_ATTACK) + return NONE + + if(!prob(determine_avoidance)) + return NONE + + carp_user.visible_message( + span_danger("[carp_user] cleanly avoids [attack_text] with incredible speed!"), + span_userdanger("You dodge [attack_text]"), + ) + playsound(carp_user.loc, 'sound/items/weapons/punchmiss.ogg', 25, TRUE, -1) + return SUCCESSFUL_BLOCK + +/* Determines how 'carp-y' or how 'martial arts-y' we are, granting us the ability to avoid attacks. +* At a baseline, we will always avoid projectile attacks, but we may not necessarily avoid other attacks. +* If we wear carp based clothing, or martial arts based clothing, we improve our style factor. +* If we are a carp mutant, we improve our style factor. +* If we literally are a carp, we just assume we're very carpy and return our max value. +* If we wear a lot of armor, we reduce our style factor. Some martial arts or carp items may result in a net netural bonus. +* If there is anything in our hands, we're also less likely to avoid attacks. +*/ +/datum/martial_art/the_sleeping_carp/proc/carp_style_check(mob/living/carp_user) + // An evaluation of how 'carp' we are. + var/style_factor_points = 0 + + if(istype(carp_user, /mob/living/basic/space_dragon) || istype(carp_user, /mob/living/basic/carp)) + return 100 + + if(!ishuman(carp_user)) // We're not concerned about nonhumans here, we can assume we've covered any relevant mobs by checking for carp. + return 0 + + var/mob/living/carbon/human/human_carp_user = carp_user + + var/obj/item/bodypart/potential_head = human_carp_user.get_bodypart(BODY_ZONE_HEAD) + var/obj/item/bodypart/potential_chest = human_carp_user.get_bodypart(BODY_ZONE_CHEST) + var/obj/item/clothing/is_it_the_shoes = human_carp_user.get_item_by_slot(ITEM_SLOT_FEET) + + // The presence of armor and heavy objects is a style malus + var/style_factor_malus = 0 + + // Lets look to see if any relevant headwear is armored or on theme + if(potential_head) + for(var/obj/item/clothing/possible_headbands in human_carp_user.get_clothing_on_part(potential_head)) + if(possible_headbands.clothing_flags & CARP_STYLE_FACTOR) + style_factor_points += 20 // Basically, you only need one chest level item to contribute + style_factor_malus += human_carp_user.run_armor_check(potential_head, MELEE) + + // Then let's look for any chest clothing that is either armored or on theme + if(potential_chest) + for(var/obj/item/clothing/possible_gi in human_carp_user.get_clothing_on_part(potential_chest)) + if(possible_gi.clothing_flags & CARP_STYLE_FACTOR) + style_factor_points += 20 // Only need one head level item to contribute + style_factor_malus += human_carp_user.run_armor_check(potential_chest, MELEE) + + // We also consider whether our footwear is appropriate + if(istype(is_it_the_shoes) && is_it_the_shoes.clothing_flags & CARP_STYLE_FACTOR) + style_factor_points += 20 + + // Achieved a carp state of mind. + if(human_carp_user.has_status_effect(/datum/status_effect/organ_set_bonus/carp)) + style_factor_points += 20 + + // We check for wielded objects. If they're not abstract items or exempt items, we add their weight as a penalty. And their block chance. + for(var/obj/item/possibly_a_held_object in human_carp_user.held_items) + if(possibly_a_held_object.item_flags & (ABSTRACT|HAND_ITEM) && !possibly_a_held_object.block_chance) + continue + + if(possibly_a_held_object in exempt_objects) + continue + + if(possibly_a_held_object.w_class <= WEIGHT_CLASS_SMALL && !possibly_a_held_object.block_chance) + continue + + style_factor_malus += possibly_a_held_object.block_chance + style_factor_malus += possibly_a_held_object.w_class * 10 * (HAS_TRAIT(possibly_a_held_object, TRAIT_WIELDED) ? 2 : 1) + + if(human_carp_user.body_position != STANDING_UP) // this ain't monkey style + style_factor_points -= 30 + + style_factor_points -= style_factor_malus + + return style_factor_points + /// Verb added to humans who learn the art of the sleeping carp. /mob/living/proc/sleeping_carp_help() set name = "Recall Teachings" @@ -232,16 +379,19 @@ set category = "Sleeping Carp" to_chat(usr, span_info("You retreat inward and recall the teachings of the Sleeping Carp...\n\ - [span_notice("Gnashing Teeth")]: Punch Punch. Deal additional damage every second (consecutive) punch! Very good chance to wound!\n\ + [span_notice("Gnashing Teeth")]: Punch Grab. Violently twists your opponent's arm, dislocating or even shattering bone and forcing them to drop their held items.\n\ [span_notice("Crashing Wave Kick")]: Punch Shove. Launch your opponent away from you with incredible force!\n\ [span_notice("Keelhaul")]: Shove Shove. Nonlethally kick an opponent to the floor, knocking them down, discombobulating them and dealing substantial stamina damage. If they're already prone, disarm them as well.\n\ - [span_notice("Grabs and Shoves")]: While in combat mode, your typical grab and shove do decent stamina damage. If you grab someone who has substantial amounts of stamina damage, you knock them out!\n\ + [span_notice("Kraken Wrack")]: Grab Punch. Deliver a knee jab into the opponent, dealing high stamina damage, as well as briefly stunning them, winding them and making it difficult for them to speak.\n\ + [span_notice("Grabs and Shoves")]: While in combat mode, your typical grab and shove do decent stamina damage, and your grabs harder to break. If you grab someone who has substantial amounts of stamina damage, you knock them out!\n\ While in combat mode (and not stunned, not a hulk, and not in a mech), you can reflect all projectiles that come your way, sending them back at the people who fired them! \n\ + However, your ability to avoid projectiles is negatively affected when your are burdened by armor, or whenever you are carrying normal-sized or heavier objects in your hands. \n\ + But if you commmit fully to the martial arts lifestyle by wearing martial arts or carp-related regalia, you will feel empowered enough to potentially avoid attacks even from melee weapons or other unarmed combatants. \n\ + Some melee weapons, such as bo starves, spears, short blades, knives, toolboxes, baseball bats and non-blocking small objects are safe to carry without affecting your ability to defend yourself. Exploit this for a tactical advantage. \n\ Also, you are more resilient against suffering wounds in combat, and your limbs cannot be dismembered. This grants you extra staying power during extended combat, especially against slashing and other bleeding weapons. \n\ You are not invincible, however- while you may not suffer debilitating wounds often, you must still watch your health and should have appropriate medical supplies for use during downtime. \n\ In addition, your training has imbued you with a loathing of guns, and you can no longer use them.")) - /obj/item/staff/bostaff name = "bo staff" desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate." @@ -301,7 +451,7 @@ span_userdanger("[user] [pick(fluffmessages)]s you with [src]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, user) to_chat(user, span_danger("You [pick(fluffmessages)] [H] with [src]!")) playsound(get_turf(user), 'sound/effects/woodhit.ogg', 75, TRUE, -1) - H.adjustStaminaLoss(rand(13,20)) + H.adjust_stamina_loss(rand(13,20)) if(prob(10)) H.visible_message(span_warning("[H] collapses!"), \ span_userdanger("Your legs give out!")) @@ -313,7 +463,7 @@ span_userdanger("You're knocked unconscious by [user]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, user) to_chat(user, span_danger("You deliver a heavy hit to [H]'s head, knocking [H.p_them()] out cold!")) H.SetSleeping(60 SECONDS) - H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 150) + H.adjust_organ_loss(ORGAN_SLOT_BRAIN, 15, 150) else return ..() @@ -337,6 +487,7 @@ . = ..() AddComponent(/datum/component/martial_art_giver, /datum/martial_art/the_sleeping_carp) -#undef STRONG_PUNCH_COMBO +#undef WRIST_WRENCH_COMBO #undef LAUNCH_KICK_COMBO #undef DROP_KICK_COMBO +#undef KNEE_STOMACH_COMBO diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index 4c66f236525d..961f27b21047 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -330,11 +330,11 @@ If you make a derivative work from this code, you must include this notification switch(rand(1,3)) if (2) - defender.adjustBruteLoss(rand(20,30)) + defender.adjust_brute_loss(rand(20,30)) if (3) EX_ACT(defender, EXPLODE_LIGHT) else - defender.adjustBruteLoss(rand(10,20)) + defender.adjust_brute_loss(rand(10,20)) else EX_ACT(defender, EXPLODE_LIGHT) @@ -368,7 +368,7 @@ If you make a derivative work from this code, you must include this notification defender.visible_message(span_danger("[attacker] headbutts [defender]!"), \ span_userdanger("You're headbutted by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) to_chat(attacker, span_danger("You headbutt [defender]!")) - defender.adjustBruteLoss(rand(10,20)) + defender.adjust_brute_loss(rand(10,20)) playsound(attacker.loc, SFX_SWING_HIT, 50, TRUE) defender.Unconscious(2 SECONDS) log_combat(attacker, defender, "headbutted") @@ -384,7 +384,7 @@ If you make a derivative work from this code, you must include this notification span_userdanger("You're roundhouse-kicked by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) to_chat(attacker, span_danger("You roundhouse-kick [defender]!")) playsound(attacker.loc, SFX_SWING_HIT, 50, TRUE) - defender.adjustBruteLoss(rand(10,20)) + defender.adjust_brute_loss(rand(10,20)) var/turf/T = get_edge_target_turf(attacker, get_dir(attacker, get_step_away(defender, attacker))) if (T && isturf(T)) @@ -428,7 +428,7 @@ If you make a derivative work from this code, you must include this notification if (falling == 1) attacker.visible_message(span_danger("...and dives head-first into the ground, ouch!"), \ span_userdanger("...and dive head-first into the ground, ouch!")) - attacker.adjustBruteLoss(rand(10,20)) + attacker.adjust_brute_loss(rand(10,20)) attacker.Paralyze(60) to_chat(attacker, span_warning("[defender] is too far away!")) return @@ -456,9 +456,9 @@ If you make a derivative work from this code, you must include this notification if (prob(33) || defender.stat) EX_ACT(defender, EXPLODE_LIGHT) else - defender.adjustBruteLoss(rand(20,30)) + defender.adjust_brute_loss(rand(20,30)) else - defender.adjustBruteLoss(rand(20,30)) + defender.adjust_brute_loss(rand(20,30)) defender.Paralyze(4 SECONDS) diff --git a/code/datums/components/material/material_container.dm b/code/datums/material/material_container.dm similarity index 86% rename from code/datums/components/material/material_container.dm rename to code/datums/material/material_container.dm index 6b1cda73099f..4990e5bf7649 100644 --- a/code/datums/components/material/material_container.dm +++ b/code/datums/material/material_container.dm @@ -12,7 +12,9 @@ //The full item was consumed #define MATERIAL_INSERT_ITEM_SUCCESS 1 -/datum/component/material_container +/datum/material_container + ///Parent to which this container is attached to + VAR_PRIVATE/atom/movable/parent /// The maximum amount of materials this material container can contain var/max_amount /// Map of material ref -> amount @@ -29,7 +31,8 @@ var/list/registered_signals /// Sets up the proper signals and fills the list of materials with the appropriate references. -/datum/component/material_container/Initialize( +/datum/material_container/New( + target, list/init_mats, max_amt = 0, _mat_container_flags = NONE, @@ -38,8 +41,7 @@ list/container_signals ) - if(!isatom(parent)) - return COMPONENT_INCOMPATIBLE + parent = target materials = list() max_amount = max(0, max_amt) @@ -67,52 +69,34 @@ for(var/signal in container_signals) parent.RegisterSignal(src, signal, container_signals[signal]) -/datum/component/material_container/Destroy(force) - materials = null - allowed_materials = null - return ..() - -/datum/component/material_container/RegisterWithParent() - . = ..() - - var/atom/atom_target = parent - //can we insert into this container if(!(mat_container_flags & MATCONTAINER_NO_INSERT)) //to insert stuff into the container - RegisterSignal(atom_target, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(on_item_insert)) - RegisterSignal(atom_target, COMSIG_ATOM_ITEM_INTERACTION_SECONDARY, PROC_REF(on_secondary_insert)) + RegisterSignal(parent, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(on_item_insert)) + RegisterSignal(parent, COMSIG_ATOM_ITEM_INTERACTION_SECONDARY, PROC_REF(on_secondary_insert)) //screen tips for inserting items - atom_target.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 - RegisterSignal(atom_target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) + parent.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 + RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) //to see available materials if(mat_container_flags & MATCONTAINER_EXAMINE) - RegisterSignal(atom_target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) //drop sheets when the object is deconstructed but not deleted RegisterSignal(parent, COMSIG_OBJ_DECONSTRUCT, PROC_REF(drop_sheets)) -/datum/component/material_container/UnregisterFromParent() - var/list/signals = list() - - if(!(mat_container_flags & MATCONTAINER_NO_INSERT)) - signals += COMSIG_ATOM_ITEM_INTERACTION - signals += COMSIG_ATOM_ITEM_INTERACTION_SECONDARY - signals += COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM - if(mat_container_flags & MATCONTAINER_EXAMINE) - signals += COMSIG_ATOM_EXAMINE - signals += COMSIG_OBJ_DECONSTRUCT - - UnregisterSignal(parent, signals) +/datum/material_container/Destroy(force) + materials = null + allowed_materials = null + return ..() -/datum/component/material_container/proc/drop_sheets() +/datum/material_container/proc/drop_sheets() SIGNAL_HANDLER retrieve_all() -/datum/component/material_container/proc/on_examine(datum/source, mob/user, list/examine_texts) +/datum/material_container/proc/on_examine(datum/source, mob/user, list/examine_texts) SIGNAL_HANDLER for(var/I in materials) @@ -121,7 +105,7 @@ if(amt) examine_texts += span_notice("It has [amt] sheets of [LOWER_TEXT(M.name)] stored.") -/datum/component/material_container/vv_edit_var(var_name, var_value) +/datum/material_container/vv_edit_var(var_name, var_value) var/old_flags = mat_container_flags . = ..() if(var_name == NAMEOF(src, mat_container_flags) && parent) @@ -162,7 +146,7 @@ * chance to process the item * - user_data: in the form rendered by ID_DATA(user), for material logging (and if this component is connected to a silo, also for permission checking) */ -/datum/component/material_container/proc/insert_item_materials(obj/item/source, multiplier = 1, atom/context = parent, alist/user_data) +/datum/material_container/proc/insert_item_materials(obj/item/source, multiplier = 1, atom/context = parent, alist/user_data) var/primary_mat var/max_mat_value = 0 var/material_amount = 0 @@ -194,7 +178,7 @@ * - 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) +/datum/material_container/proc/insert_amount_mat(amt, datum/material/mat) if(amt <= 0) return 0 amt = OPTIMAL_COST(amt) @@ -228,7 +212,7 @@ * * - delete_item: should we delete the item after its materials are consumed. does not apply to stacks if they were split due to lack of space * * - user_data - in the form rendered by ID_DATA(user), for material logging (and if this component is connected to a silo, also for permission checking) */ -/datum/component/material_container/proc/insert_item(obj/item/weapon, multiplier = 1, atom/context = parent, delete_item = TRUE, alist/user_data) +/datum/material_container/proc/insert_item(obj/item/weapon, multiplier = 1, atom/context = parent, delete_item = TRUE, alist/user_data) if(QDELETED(weapon)) return MATERIAL_INSERT_ITEM_NO_MATS multiplier = CEILING(multiplier, 0.01) @@ -245,7 +229,7 @@ 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) + var/sheets_to_insert = floor(space_left / material_per_sheet) if(!sheets_to_insert) return MATERIAL_INSERT_ITEM_NO_SPACE target = fast_split_stack(item_stack, sheets_to_insert) @@ -278,7 +262,7 @@ * * user - the mob inserting this item * * 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, atom/context = parent) +/datum/material_container/proc/user_insert(obj/item/held_item, mob/living/user, atom/context = parent) set waitfor = FALSE . = 0 @@ -489,18 +473,18 @@ if(!QDELETED(deleting)) //deleting parents also delete their children so we check qdel(deleting) -/datum/component/material_container/proc/on_item_insert(datum/source, mob/living/user, obj/item/weapon) +/datum/material_container/proc/on_item_insert(datum/source, mob/living/user, obj/item/weapon) SIGNAL_HANDLER // Don't insert material items with left click if (isstack(weapon)) return attempt_insert(user, weapon) -/datum/component/material_container/proc/on_secondary_insert(datum/source, mob/living/user, obj/item/weapon) +/datum/material_container/proc/on_secondary_insert(datum/source, mob/living/user, obj/item/weapon) SIGNAL_HANDLER return attempt_insert(user, weapon) /// Proc that allows players to fill the parent with mats -/datum/component/material_container/proc/attempt_insert(mob/living/user, obj/item/weapon) +/datum/material_container/proc/attempt_insert(mob/living/user, obj/item/weapon) //Allows you to attack the machine with iron sheets for e.g. if(!(mat_container_flags & MATCONTAINER_ANY_INTENT) && user.combat_mode) return @@ -524,7 +508,7 @@ * Arguments: * * amt - can this container hold this much amount of materials */ -/datum/component/material_container/proc/has_space(amt = 0) +/datum/material_container/proc/has_space(amt = 0) return (total_amount() + amt) <= max_amount /** @@ -533,7 +517,7 @@ * Arguments: * - [mat][/atom/material]: The material we are checking for insertability. */ -/datum/component/material_container/proc/can_hold_material(datum/material/mat) +/datum/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))) @@ -556,7 +540,7 @@ * 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) +/datum/material_container/proc/get_material_amount(datum/material/mat) if(!istype(mat)) mat = GET_MATERIAL_REF(mat) return materials[mat] @@ -568,7 +552,7 @@ * Arguments: * - [I][obj/item]: the item whos materials must be retrieved */ -/datum/component/material_container/proc/get_item_material_amount(obj/item/item) +/datum/material_container/proc/get_item_material_amount(obj/item/item) if(!istype(item) || !item.custom_materials) return 0 var/material_amount = 0 @@ -583,7 +567,7 @@ //=========================================HIGH LEVEL========================================== /// returns the total amount of material in the container -/datum/component/material_container/proc/total_amount() +/datum/material_container/proc/total_amount() . = 0 for(var/i in materials) . += get_material_amount(i) @@ -595,7 +579,7 @@ * - [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) +/datum/material_container/proc/has_enough_of_material(datum/material/req_mat, amount = 1) return get_material_amount(req_mat) >= OPTIMAL_COST(amount) @@ -608,7 +592,7 @@ * - 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) +/datum/material_container/proc/has_materials(list/mats, coefficient = 1, multiplier = 1) if(!length(mats)) return FALSE @@ -632,7 +616,7 @@ * - 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) +/datum/material_container/proc/use_amount_mat(amt, datum/material/mat) //round amount amt = OPTIMAL_COST(amt) @@ -658,7 +642,7 @@ * - 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) +/datum/material_container/proc/use_materials(list/mats, coefficient = 1, multiplier = 1) if(!mats || !length(mats)) return FALSE @@ -673,16 +657,16 @@ //===========================================HIGH LEVEL======================================= /** - * For spawning mineral sheets at a specific location. Used by machines to output sheets. + * For spawning stacks (mineral sheets or ore) at a specific location. Used by machines to output sheets. * * Arguments: - * sheet_amt: number of sheets to extract + * stack_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 + * [atom][context]: context - the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_STACK_RETRIEVED and is used mostly for silo logging * user_data - in the form rendered by ID_DATA(user), for material logging (and if this component is connected to a silo, also for permission checking) */ -/datum/component/material_container/proc/retrieve_sheets(sheet_amt, datum/material/material, atom/target = null, atom/context = parent, alist/user_data) +/datum/material_container/proc/retrieve_stack(stack_amt, datum/material/material, atom/target = null, atom/context = parent, alist/user_data) //do we support sheets of this material if(!material.sheet_type) return 0 //Add greyscale sheet handling here later @@ -690,8 +674,8 @@ 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) + stack_amt = min(floor(materials[material] / SHEET_MATERIAL_AMOUNT), stack_amt) + if(stack_amt <= 0) return 0 //auto drop location if(!target) @@ -702,27 +686,30 @@ //eject sheets based on available amount after each iteration var/count = 0 - while(sheet_amt > 0) + while(stack_amt > 0) + var/type_to_retrieve = material.sheet_type || material.ore_type //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) - new_sheets.manufactured = TRUE - count += new_sheets.amount + var/obj/item/stack/new_stack = new type_to_retrieve(target, min(stack_amt, MAX_STACK_SIZE), FALSE) + if(istype(new_stack, /obj/item/stack/sheet)) + var/obj/item/stack/sheet/new_sheets = new_stack + new_sheets.manufactured = TRUE + count += new_stack.amount //use material & deduct work needed - use_amount_mat(new_sheets.amount * SHEET_MATERIAL_AMOUNT, material) - sheet_amt -= new_sheets.amount + use_amount_mat(new_stack.amount * SHEET_MATERIAL_AMOUNT, material) + stack_amt -= new_stack.amount //send signal - SEND_SIGNAL(src, COMSIG_MATCONTAINER_SHEETS_RETRIEVED, new_sheets, context, user_data) + SEND_SIGNAL(src, COMSIG_MATCONTAINER_STACK_RETRIEVED, new_stack, context, user_data) //no point merging anything into an already full stack - if(new_sheets.amount == new_sheets.max_amount) + if(new_stack.amount == new_stack.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 + if(item_stack == new_stack || item_stack.type != type_to_retrieve) //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()) + var/merge_amount = min(item_stack.amount, new_stack.max_amount - new_stack.get_amount()) item_stack.use(merge_amount) - new_sheets.add(merge_amount) + new_stack.add(merge_amount) break return count @@ -733,21 +720,21 @@ * - 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) +/datum/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, user_data = ID_DATA(null)) + result += retrieve_stack(amount2sheet(materials[MAT]), MAT, target, context, user_data = ID_DATA(null)) return result //============================================================================================ -/datum/component/material_container/ui_static_data(mob/user) +/datum/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) +/datum/material_container/ui_data(mob/user) var/list/data = list() for(var/datum/material/material as anything in materials) @@ -770,7 +757,7 @@ * * 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) +/datum/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)) diff --git a/code/datums/components/material/remote_materials.dm b/code/datums/material/remote_materials.dm similarity index 83% rename from code/datums/components/material/remote_materials.dm rename to code/datums/material/remote_materials.dm index f122bfb908b0..9f15f3d0cb54 100644 --- a/code/datums/components/material/remote_materials.dm +++ b/code/datums/material/remote_materials.dm @@ -5,16 +5,18 @@ fallback to a local material storage in case remote storage is unavailable, and handles linking back and forth. */ -/datum/component/remote_materials +/datum/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 + ///Movable this connection is attached to + var/atom/movable/parent ///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 + var/datum/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 @@ -26,15 +28,15 @@ handles linking back and forth. ///Callback for round start silo connections. Have to cancel this if the parent gets destroyed before round start VAR_PRIVATE/datum/callback/connection -/datum/component/remote_materials/Initialize( +/datum/remote_materials/New( + parent, mapload, allow_standalone = TRUE, force_connect = FALSE, mat_container_flags = NONE, list/mat_container_signals = null, ) - if (!isatom(parent)) - return COMPONENT_INCOMPATIBLE + src.parent = parent src.allow_standalone = allow_standalone src.mat_container_flags = mat_container_flags @@ -60,7 +62,7 @@ handles linking back and forth. * 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) +/datum/remote_materials/proc/_PrepareStorage(connect_to_silo) PRIVATE_PROC(TRUE) connection = null @@ -75,25 +77,24 @@ handles linking back and forth. if (!mat_container && allow_standalone) _MakeLocal() -/datum/component/remote_materials/Destroy() +/datum/remote_materials/Destroy() if(connection) LAZYREMOVE(SSticker.round_start_events, connection) connection = null if(silo) allow_standalone = FALSE disconnect() - if(mat_container) - mat_container = null + QDEL_NULL(mat_container) return ..() -/datum/component/remote_materials/proc/_MakeLocal() +/datum/remote_materials/proc/_MakeLocal() PRIVATE_PROC(TRUE) silo = null - mat_container = parent.AddComponent( \ - /datum/component/material_container, \ + mat_container = new ( \ + parent, \ SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ local_size, \ mat_container_flags, \ @@ -102,7 +103,7 @@ handles linking back and forth. ) /// Adds/Removes this connection from the silo -/datum/component/remote_materials/proc/toggle_holding() +/datum/remote_materials/proc/toggle_holding() if(isnull(silo)) return @@ -117,13 +118,13 @@ handles linking back and forth. * * * size - the new size for local storage. measured in SHEET_MATERIAL_SIZE units */ -/datum/component/remote_materials/proc/set_local_size(size) +/datum/remote_materials/proc/set_local_size(size) local_size = size if (!silo && mat_container) mat_container.max_amount = size ///Disconnects this component from the silo -/datum/component/remote_materials/proc/disconnect() +/datum/remote_materials/proc/disconnect() if(isnull(silo)) return @@ -133,7 +134,7 @@ handles linking back and forth. if (allow_standalone) _MakeLocal() -/datum/component/remote_materials/proc/OnMultitool(datum/source, mob/user, obj/item/multitool/M) +/datum/remote_materials/proc/OnMultitool(datum/source, mob/user, obj/item/multitool/M) SIGNAL_HANDLER . = NONE @@ -146,7 +147,7 @@ handles linking back and forth. return ITEM_INTERACT_BLOCKING var/obj/machinery/ore_silo/new_silo = M.buffer - var/datum/component/material_container/new_container = new_silo.GetComponent(/datum/component/material_container) + var/datum/material_container/new_container = new_silo.materials if (silo) silo.disconnect_receptacle(src, parent) else if (mat_container) @@ -166,18 +167,18 @@ handles linking back and forth. to_chat(user, span_notice("You connect [parent] to [silo] from the multitool's buffer.")) return ITEM_INTERACT_SUCCESS -/datum/component/remote_materials/proc/on_item_insert(datum/source, mob/living/user, obj/item/target) +/datum/remote_materials/proc/on_item_insert(datum/source, mob/living/user, obj/item/target) SIGNAL_HANDLER // Only insert stacks with left click if(isstack(target)) return attempt_insert(user, target) -/datum/component/remote_materials/proc/on_secondary_insert(datum/source, mob/living/user, obj/item/target) +/datum/remote_materials/proc/on_secondary_insert(datum/source, mob/living/user, obj/item/target) SIGNAL_HANDLER return attempt_insert(user, target) /// Insert mats into silo -/datum/component/remote_materials/proc/attempt_insert(mob/living/user, obj/item/target) +/datum/remote_materials/proc/attempt_insert(mob/living/user, obj/item/target) if(!(mat_container_flags & MATCONTAINER_ANY_INTENT) && user.combat_mode) return @@ -194,14 +195,14 @@ handles linking back and forth. * * 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) +/datum/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() +/datum/remote_materials/proc/on_hold() return check_z_level() ? silo.holds[src] : FALSE /** @@ -214,7 +215,7 @@ handles linking back and forth. * * check_hold - should we check if the silo is on hold * * user_data - in the form rendered by ID_DATA(user); used as a reference for silo bans and access checks */ -/datum/component/remote_materials/proc/can_use_resource(check_hold = TRUE, alist/user_data) +/datum/remote_materials/proc/can_use_resource(check_hold = TRUE, alist/user_data) var/atom/movable/movable_parent = parent if (!istype(movable_parent)) return FALSE @@ -240,7 +241,7 @@ handles linking back and forth. * name- For logging only. the design you are trying to build e.g. matter bin, etc. * user_data - in the form rendered by ID_DATA(user), for material logging and (if this component is connected to a silo), permission checking */ -/datum/component/remote_materials/proc/use_materials(list/mats, coefficient = 1, multiplier = 1, action = "processed", name = "design", alist/user_data) +/datum/remote_materials/proc/use_materials(list/mats, coefficient = 1, multiplier = 1, action = "processed", name = "design", alist/user_data) if(!can_use_resource(user_data = user_data)) return 0 @@ -263,7 +264,7 @@ handles linking back and forth. * [drop_target][atom]- optional where to drop the sheets. null means it is dropped at this components parent location * user_data - in the form rendered by ID_DATA(user), for material logging and (if this component is connected to a silo), permission checking */ -/datum/component/remote_materials/proc/eject_sheets(datum/material/material_ref, eject_amount, atom/drop_target = null, alist/user_data) +/datum/remote_materials/proc/eject_sheets(datum/material/material_ref, eject_amount, atom/drop_target = null, alist/user_data) if(!can_use_resource(user_data = user_data)) return 0 @@ -271,7 +272,7 @@ handles linking back and forth. if(isnull(drop_target)) drop_target = movable_parent.drop_location() - return mat_container.retrieve_sheets(eject_amount, material_ref, target = drop_target, context = parent, user_data = user_data) + return mat_container.retrieve_stack(eject_amount, material_ref, target = drop_target, context = parent, user_data = user_data) /** * Insert an item into the mat container, helper proc to insert items with the correct context @@ -281,7 +282,7 @@ handles linking back and forth. * * multiplier - the multiplier applied on the materials consumed * * user_data - an alist in the form rendered by ID_DATA(user), for logging who/where/when the item was inserted */ -/datum/component/remote_materials/proc/insert_item(obj/item/weapon, multiplier = 1, alist/user_data) +/datum/remote_materials/proc/insert_item(obj/item/weapon, multiplier = 1, alist/user_data) // Inserting materials automatically shouldn't be permission-restricted if(!islist(user_data)) user_data = ID_DATA(null) diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index 86e1d6d88b55..5c56a8a451d9 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -23,8 +23,9 @@ fishing_gravity_mult = 1.1 /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) - return TRUE + if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER)) + victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5) + return TRUE ///Breaks extremely easily but is transparent. /datum/material/glass @@ -62,8 +63,9 @@ fishing_gravity_mult = 0.9 /datum/material/glass/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) - victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5, sharpness = TRUE) //cronch - return TRUE + if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER)) + victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5, sharpness = TRUE) //cronch + return TRUE /datum/material/glass/on_main_applied(atom/source, mat_amount, multiplier) . = ..() @@ -110,8 +112,9 @@ Unless you know what you're doing, only use the first three numbers. They're in fishing_gravity_mult = 1.1 /datum/material/silver/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) - victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5) - return TRUE + if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER)) + victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5) + return TRUE ///Slight force increase /datum/material/gold @@ -186,8 +189,9 @@ Unless you know what you're doing, only use the first three numbers. They're in fishing_gravity_mult = 1.1 /datum/material/diamond/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) - victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7) - return TRUE + if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER)) + victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7) + return TRUE ///Is slightly radioactive /datum/material/uranium @@ -325,7 +329,7 @@ Unless you know what you're doing, only use the first three numbers. They're in SIGNAL_HANDLER if(prob(67)) return - var/list/elegible_fish_sources = flatten_list(GLOB.preset_fish_sources) + var/list/elegible_fish_sources = assoc_to_values(GLOB.preset_fish_sources) for(var/datum/fish_source/source as anything in elegible_fish_sources) if(source.fish_source_flags & FISH_SOURCE_FLAG_NO_BLUESPACE_ROD) elegible_fish_sources -= source @@ -444,8 +448,9 @@ Unless you know what you're doing, only use the first three numbers. They're in fishing_gravity_mult = 1.1 /datum/material/titanium/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) - victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7) - return TRUE + if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER)) + victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7) + return TRUE /datum/material/runite name = "runite" @@ -484,8 +489,9 @@ Unless you know what you're doing, only use the first three numbers. They're in REMOVE_TRAIT(source, TRAIT_ROD_REMOVE_FISHING_DUD, REF(src)) //light-absorbing, environment-cancelling fishing rod. /datum/material/runite/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) - victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10) - return TRUE + if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER)) + victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10) + return TRUE ///Force decrease /datum/material/plastic @@ -568,7 +574,8 @@ Unless you know what you're doing, only use the first three numbers. They're in wooden.resistance_flags &= ~FLAMMABLE /datum/material/wood/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) - victim.apply_damage(5, BRUTE, BODY_ZONE_HEAD) + if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER)) + victim.apply_damage(5, BRUTE, BODY_ZONE_HEAD) victim.reagents.add_reagent(/datum/reagent/cellulose, rand(8, 12)) source_item?.reagents?.add_reagent(/datum/reagent/cellulose, source_item.reagents.total_volume*(2/5)) @@ -613,8 +620,9 @@ Unless you know what you're doing, only use the first three numbers. They're in REMOVE_TRAIT(source, TRAIT_ROD_REMOVE_FISHING_DUD, REF(src)) //light-absorbing, environment-cancelling fishing rod. /datum/material/adamantine/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) - victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10) - return TRUE + if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER)) + victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10) + return TRUE ///RPG Magic. /datum/material/mythril @@ -657,8 +665,9 @@ Unless you know what you're doing, only use the first three numbers. They're in qdel(source.GetComponent(/datum/component/fantasy)) /datum/material/mythril/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) - victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10) - return TRUE + if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER)) + victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10) + return TRUE //formed when freon react with o2, emits a lot of plasma when heated /datum/material/hot_ice @@ -728,8 +737,9 @@ Unless you know what you're doing, only use the first three numbers. They're in fishing_gravity_mult = 0.7 /datum/material/metalhydrogen/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) - victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7) - return TRUE + if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER)) + victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7) + return TRUE //I don't like sand. It's coarse, and rough, and irritating, and it gets everywhere. /datum/material/sand @@ -749,6 +759,7 @@ Unless you know what you're doing, only use the first three numbers. They're in beauty_modifier = 0.25 turf_sound_override = FOOTSTEP_SAND texture_layer_icon_state = "sand" + mat_rust_resistance = RUST_RESISTANCE_BASIC fish_weight_modifier = 1.2 fishing_difficulty_modifier = 30 //Sand fishing rods? What the hell are you doing? fishing_cast_range = -2 @@ -780,6 +791,7 @@ Unless you know what you're doing, only use the first three numbers. They're in beauty_modifier = 0.3 turf_sound_override = FOOTSTEP_WOOD texture_layer_icon_state = "brick" + mat_rust_resistance = RUST_RESISTANCE_BASIC fish_weight_modifier = 1.2 fishing_difficulty_modifier = 25 //Sand fishing rods? What the hell are you doing? fishing_cast_range = -2 @@ -807,6 +819,7 @@ Unless you know what you're doing, only use the first three numbers. They're in beauty_modifier = 0.3 turf_sound_override = FOOTSTEP_SAND texture_layer_icon_state = "sand" + mat_rust_resistance = RUST_RESISTANCE_ORGANIC fish_weight_modifier = 0.8 fishing_difficulty_modifier = 25 fishing_cast_range = -2 @@ -847,7 +860,8 @@ Unless you know what you're doing, only use the first three numbers. They're in /datum/material/runedmetal/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) victim.reagents.add_reagent(/datum/reagent/fuel/unholywater, rand(8, 12)) - victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5) + if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER)) + victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5) return TRUE /datum/material/bronze @@ -1079,6 +1093,7 @@ Unless you know what you're doing, only use the first three numbers. They're in REMOVE_TRAIT(source, TRAIT_ROD_IGNORE_ENVIRONMENT, REF(src)) //light-absorbing, environment-cancelling fishing rod. /datum/material/zaukerite/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) - victim.apply_damage(30, BURN, BODY_ZONE_HEAD, wound_bonus = 5) + if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER)) + victim.apply_damage(30, BURN, BODY_ZONE_HEAD, wound_bonus = 5) source_item?.reagents?.add_reagent(/datum/reagent/toxin/plasma, source_item.reagents.total_volume*5) return TRUE diff --git a/code/datums/materials/hauntium.dm b/code/datums/materials/hauntium.dm index 1fc0de30c84a..e66116789322 100644 --- a/code/datums/materials/hauntium.dm +++ b/code/datums/materials/hauntium.dm @@ -27,10 +27,10 @@ /datum/material/hauntium/on_main_applied(atom/source, mat_amount, multiplier) . = ..() - if(!isobj(source)) + if(!isitem(source)) return - var/obj/obj = source - obj.make_haunted(INNATE_TRAIT, "#f8f8ff") + var/obj/item/source_item = source + source_item.make_haunted(INNATE_TRAIT, "#f8f8ff") if(isbodypart(source)) var/obj/item/bodypart/bodypart = source if(!(bodypart::bodytype & BODYTYPE_GHOST)) @@ -42,10 +42,10 @@ /datum/material/hauntium/on_main_removed(atom/source, mat_amount, multiplier) . = ..() - if(!isobj(source)) + if(!isitem(source)) return - var/obj/obj = source - obj.remove_haunted(INNATE_TRAIT) + var/obj/item/source_item = source + source_item.remove_haunted(INNATE_TRAIT) if(isbodypart(source)) var/obj/item/bodypart/bodypart = source if(!(bodypart::bodytype & BODYTYPE_GHOST)) diff --git a/code/datums/materials/pizza.dm b/code/datums/materials/pizza.dm index dfd384348862..fbc54cf65c63 100644 --- a/code/datums/materials/pizza.dm +++ b/code/datums/materials/pizza.dm @@ -16,6 +16,7 @@ item_sound_override = 'sound/effects/meatslap.ogg' turf_sound_override = FOOTSTEP_MEAT texture_layer_icon_state = "pizza" + mat_rust_resistance = RUST_RESISTANCE_REINFORCED fish_weight_modifier = 0.9 fishing_difficulty_modifier = 13 fishing_cast_range = -2 diff --git a/code/datums/memory/key_memories.dm b/code/datums/memory/key_memories.dm index 27030a02a1df..21a46a77b716 100644 --- a/code/datums/memory/key_memories.dm +++ b/code/datums/memory/key_memories.dm @@ -99,6 +99,30 @@ /datum/memory/key/quirk_allergy/get_starts() return list("[protagonist_name] sneezing after coming into contact with [allergy_string].") +/// Tracks what kind of item the quirk user's heirloom is +/datum/memory/key/quirk_heirloom + var/heirloom_name + +/datum/memory/key/quirk_heirloom/New( + datum/mind/memorizer_mind, + atom/protagonist, + atom/deuteragonist, + atom/antagonist, + heirloom_name, +) + src.heirloom_name = heirloom_name + return ..() + +/datum/memory/key/quirk_heirloom/get_names() + return list("[protagonist_name]'s heirloom [heirloom_name].") + +/datum/memory/key/quirk_heirloom/get_starts() + return list( + "[protagonist_name] being bequeathed the heirloom [heirloom_name] by a dear relative.", + "[protagonist_name] discovering the heirloom [heirloom_name] in some long-forgotten boxes.", + "[protagonist_name] stealing the heirloom [heirloom_name] from an undeserving family member.", + ) + /// Tracks what brand a smoker quirk user likes /datum/memory/key/quirk_smoker memory_flags = MEMORY_FLAG_NOLOCATION|MEMORY_FLAG_NOPERSISTENCE|MEMORY_SKIP_UNCONSCIOUS // Does not have nomood diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm index 62b09f84adda..83af9390bb55 100644 --- a/code/datums/mind/_mind.dm +++ b/code/datums/mind/_mind.dm @@ -493,6 +493,8 @@ CRASH("set_assigned_role called with invalid role: [isnull(new_role) ? "null" : new_role]") . = assigned_role assigned_role = new_role + if(!isnull(current)) + SEND_SIGNAL(current, COMSIG_MOB_MIND_SET_ROLE, new_role) ///Sets your holy role, giving/taking away traits related to if you're gaining/losing it. /datum/mind/proc/set_holy_role(new_holy_role) @@ -531,3 +533,13 @@ /mob/dead/observer/sync_mind() return + +/// Iterates over this mind's assigned role's departments and returns a list of their primary work areas. +/datum/mind/proc/get_work_areas() + var/list/work_areas = list() + for(var/department in assigned_role.departments_list) + var/datum/job_department/dep = SSjob.joinable_departments_by_type[department] + if(dep.primary_work_area) + work_areas += dep.primary_work_area + + return work_areas diff --git a/code/datums/mocking/client.dm b/code/datums/mocking/client.dm index 9bd02f061ac6..5c684f085212 100644 --- a/code/datums/mocking/client.dm +++ b/code/datums/mocking/client.dm @@ -85,3 +85,6 @@ /datum/client_interface/proc/set_fullscreen(logging_in = FALSE) return TRUE + +/datum/client_interface/proc/check_drag_proximity(atom/dragging, atom/over, src_location, over_location, src_control, over_control, params) + return FALSE diff --git a/code/datums/mood.dm b/code/datums/mood.dm index 43fa67907751..1fc07130b139 100644 --- a/code/datums/mood.dm +++ b/code/datums/mood.dm @@ -18,8 +18,18 @@ var/sanity = SANITY_NEUTRAL /// the total combined value of all visible moodlets for the mob var/shown_mood - /// Moodlet value modifier + /// Multiplier to the sum total of mood the mob is experiencing var/mood_modifier = 1 + /// Multiplier to positive moodlet values. Stacks with mood_modifier + var/positive_mood_modifier = 1 + /// Multiplier to negative moodlet values. Stacks with mood_modifier + var/negative_mood_modifier = 1 + /// Multiplier to the length of positive moodlets. + /// Please don't set this to 0 + var/positive_moodlet_length_modifier = 1 + /// Multiplier to the length of negative moodlets. + /// Please don't set this to 0 + var/negative_moodlet_length_modifier = 1 /// Used to track what stage of moodies they're on (1-9) var/mood_level = MOOD_LEVEL_NEUTRAL /// To track what stage of sanity they're on (1-6) @@ -142,50 +152,95 @@ * * Arguments: * * category - (text) category of the mood event - see /datum/mood_event for category explanation - * * type - (path) any /datum/mood_event + * * type - (path) any /datum/mood_event (besides /datum/mood_event/conditional) */ -/datum/mood/proc/add_mood_event(category, type, ...) - // we may be passed an instantiated mood datum with a modified timeout - // it is to be used as a vehicle to copy data from and then cleaned up afterwards. - // why do it this way? because the params list may contain numbers, and we may not necessarily want those to be interpreted as a timeout modifier. - // this is only used by the food quality system currently - var/datum/mood_event/mood_to_copy_from - if (istype(type, /datum/mood_event)) - mood_to_copy_from = type - type = mood_to_copy_from.type - if (!ispath(type, /datum/mood_event)) - CRASH("A non path ([type]), was used to add a mood event. This shouldn't be happening.") +/datum/mood/proc/add_mood_event(category, new_type, ...) + if (!ispath(new_type, /datum/mood_event)) + CRASH("A non path ([new_type]), was used to add a mood event. This shouldn't be happening.") + if (ispath(new_type, /datum/mood_event/conditional)) + CRASH("A conditional mood event ([new_type]) was used in add_mood_event. Use add_conditional_mood_event instead.") if (!istext(category)) category = REF(category) - var/datum/mood_event/the_event - if (mood_events[category]) - the_event = mood_events[category] - if (the_event.type == type) - if (the_event.timeout) - if (!isnull(mood_to_copy_from)) - the_event.timeout = mood_to_copy_from.timeout - addtimer(CALLBACK(src, PROC_REF(clear_mood_event), category), the_event.timeout, (TIMER_UNIQUE|TIMER_OVERRIDE)) - qdel(mood_to_copy_from) - return // Don't need to update the event. + var/list/params = args.Copy(3) + var/datum/mood_event/new_event = new new_type(category) + if(!new_event.can_effect_mob(arglist(list(src, mob_parent) + params))) + qdel(new_event) + return + + add_mood_event_instance(new_event, params) +/** + * Handles adding a mood event instance, including replacing or refreshing existing events + */ +/datum/mood/proc/add_mood_event_instance(datum/mood_event/new_event, list/params) + PRIVATE_PROC(TRUE) + var/category = new_event.category + var/datum/mood_event/existing_event = mood_events[category] + if(existing_event) + var/continue_adding = FALSE + if(existing_event.type == new_event.type) + continue_adding = existing_event.be_refreshed(arglist(list(src) + params)) + else + continue_adding = existing_event.be_replaced(arglist(list(src, new_event) + params)) + if(!continue_adding) + update_mood() + qdel(new_event) + return clear_mood_event(category) - var/list/params = args.Copy(3) - params.Insert(1, mob_parent) - the_event = new type(arglist(params)) - if (QDELETED(the_event)) // the mood event has been deleted for whatever reason (requires a job, etc) + new_event.on_add(src, mob_parent, params) + mood_events[category] = new_event + update_mood() + if(new_event.mood_change == 0 || new_event.hidden) return + if(new_event.mood_change > 0) + add_personality_mood_to_viewers(mob_parent, "other_good_moodlet", list( + /datum/personality/empathetic = /datum/mood_event/empathetic_happy, + /datum/personality/misanthropic = /datum/mood_event/misanthropic_sad + ), range = 4) + else + add_personality_mood_to_viewers(mob_parent, "other_bad_moodlet", list( + /datum/personality/empathetic = /datum/mood_event/empathetic_sad, + /datum/personality/misanthropic = /datum/mood_event/misanthropic_happy + ), range = 4) - the_event.category = category - if (!isnull(mood_to_copy_from)) - the_event.timeout = mood_to_copy_from.timeout - qdel(mood_to_copy_from) - mood_events[category] = the_event - update_mood() +/** + * Adds a conditional mood event to the mob + * + * Arguments: + * * category - (text) category of the mood event - see /datum/mood_event for category explanation + * * base_type - (path) any /datum/mood_event/conditional + */ +/datum/mood/proc/add_conditional_mood_event(category, datum/base_type, ...) + if (!ispath(base_type, /datum/mood_event/conditional)) + if (ispath(base_type, /datum/mood_event)) + CRASH("A non-conditional mood event ([base_type]) was used in add_conditional_mood_event. Use add_mood_event instead.") + CRASH("A non path ([base_type]), was used to add a mood event. This shouldn't be happening.") + if (!istext(category)) + category = REF(category) + + var/list/params = args.Copy(3) + var/list/datum/mood_event/conditional/all_valid_conditional_events = list() + for(var/event_subtype in valid_typesof(base_type)) + var/datum/mood_event/potential_event = new event_subtype(category) + if(!potential_event.can_effect_mob(arglist(list(src, mob_parent) + params))) + qdel(potential_event) + continue + + all_valid_conditional_events += potential_event - if (the_event.timeout) - addtimer(CALLBACK(src, PROC_REF(clear_mood_event), category), the_event.timeout, (TIMER_UNIQUE|TIMER_OVERRIDE)) + if(!length(all_valid_conditional_events)) + return //no valid events to add + + var/datum/mood_event/conditional/highest_priority_event + for(var/datum/mood_event/conditional/checked_event as anything in all_valid_conditional_events) + if(!highest_priority_event || checked_event.priority > highest_priority_event.priority) + highest_priority_event = checked_event + + add_mood_event_instance(highest_priority_event, params) + all_valid_conditional_events -= highest_priority_event // you are the chosen one + QDEL_LIST(all_valid_conditional_events) // clean up the losers /** * Removes a mood event from the mob @@ -218,12 +273,14 @@ for(var/category in mood_events) var/datum/mood_event/the_event = mood_events[category] - mood += the_event.mood_change + var/event_mood = the_event.mood_change + event_mood *= max((event_mood > 0) ? positive_mood_modifier : negative_mood_modifier, 0) + mood += event_mood if (!the_event.hidden) - shown_mood += the_event.mood_change + shown_mood += event_mood - mood *= mood_modifier - shown_mood *= mood_modifier + mood *= max(mood_modifier, 0) + shown_mood *= max(mood_modifier, 0) switch(mood) if (-INFINITY to MOOD_SAD4) @@ -250,7 +307,7 @@ /// Updates the mob's mood icon /datum/mood/proc/update_mood_icon() - if (!(mob_parent.client || mob_parent.hud_used)) + if (!(mob_parent.client || mob_parent.hud_used) || isnull(mood_screen_object)) return mood_screen_object.cut_overlays() @@ -314,6 +371,7 @@ if(hud?.infodisplay) hud.infodisplay -= mood_screen_object QDEL_NULL(mood_screen_object) + UnregisterSignal(hud, COMSIG_QDELETING) /// Handles clicking on the mood HUD object /datum/mood/proc/hud_click(datum/source, location, control, params, mob/user) @@ -561,6 +619,10 @@ update_mood_icon() +/// Sets sanity to a specific amount, useful for callbacks +/datum/mood/proc/reset_sanity(amount) + set_sanity(amount, override = TRUE) + /// Adjusts sanity by a value /datum/mood/proc/adjust_sanity(amount, minimum = SANITY_INSANE, maximum = SANITY_GREAT, override = FALSE) set_sanity(sanity + amount, minimum, maximum, override) @@ -588,7 +650,6 @@ /** * Returns true if you already have a mood from a provided category. - * You may think to yourself, why am I trying to get a boolean from a component? Well, this system probably should not be a component. * * Arguments * * category - Mood category to validate against. diff --git a/code/datums/mood_events/_mood_event.dm b/code/datums/mood_events/_mood_event.dm index 499b5f892e62..165753648671 100644 --- a/code/datums/mood_events/_mood_event.dm +++ b/code/datums/mood_events/_mood_event.dm @@ -12,7 +12,10 @@ * is active while another mood event (from the same category) is triggered it will remove * the effects of the current mood event and replace it with the new one */ - var/category + VAR_FINAL/category + /// Flags that determine what kind of event this is + /// For example, you might have a "EVENT_FEAR" flag that denotes this mood event relates to being afraid of something + var/event_flags = NONE /// Icon state of the unique mood event icon, if applicable var/special_screen_obj /// if false, it will be an overlay instead @@ -22,21 +25,145 @@ /// List of required jobs for this mood event var/list/required_job -/datum/mood_event/New(mob/living/emotional_mob, ...) - owner = emotional_mob - var/list/params = args.Copy(2) - if (LAZYLEN(required_job) && !is_type_in_list(owner.mind?.assigned_role, required_job)) - qdel(src) - return - add_effects(arglist(params)) +/datum/mood_event/New(category) + src.category = category /datum/mood_event/Destroy() - remove_effects() - owner = null + if(owner) + remove_effects() + owner = null return ..() -/datum/mood_event/proc/add_effects(param) +/** + * Called when this datum is created, checks if the passed mob can experience this mood event + * + * * home - the mood datum we are being added to + * * who - the mob to check + * * ... - any other arguments that are passed to the mood event + * + * Return TRUE if the mob can experience this mood event + * Return FALSE if the mob should be unaffected + */ +/datum/mood_event/proc/can_effect_mob(datum/mood/home, mob/living/who, ...) + SHOULD_CALL_PARENT(TRUE) + if(LAZYLEN(required_job) && !is_type_in_list(who.mind?.assigned_role, required_job)) + return FALSE + + if((event_flags & MOOD_EVENT_WHIMSY)) + // Whimsical people get positive whimsical moodlets + // Non-whimsical people get negative whimsical moodlets + var/is_whimsical = HAS_PERSONALITY(who, /datum/personality/whimsical) + if(mood_change >= 0 && !is_whimsical) + return FALSE + if(mood_change < 0 && is_whimsical) + return FALSE + + if((event_flags & MOOD_EVENT_ART) && HAS_PERSONALITY(who, /datum/personality/unimaginative)) + return FALSE + + if((event_flags & MOOD_EVENT_PAIN) && HAS_TRAIT(who, TRAIT_ANALGESIA)) + return FALSE + + return TRUE + +/** + * Wrapper for the mood event being added to a mob + * + * * home - the mood datum we are being added to + * * who - the mob to add the mood event to + * * mood_args - any other arguments that are passed to the mood event + */ +/datum/mood_event/proc/on_add(datum/mood/home, mob/living/who, list/mood_args) + SHOULD_NOT_OVERRIDE(TRUE) + + owner = who + + if((event_flags & MOOD_EVENT_ART) && HAS_PERSONALITY(who, /datum/personality/creative)) + mood_change *= 1.2 + + if((event_flags & MOOD_EVENT_SPIRITUAL) && !HAS_TRAIT(who, TRAIT_SPIRITUAL)) + mood_change *= 0.2 + + if(event_flags & MOOD_EVENT_FOOD) + if(HAS_PERSONALITY(owner, /datum/personality/ascetic)) + mood_change *= 0.75 + if(HAS_PERSONALITY(owner, /datum/personality/gourmand)) + mood_change *= 1.25 + + if(event_flags & MOOD_EVENT_FEAR) + if(HAS_PERSONALITY(owner, /datum/personality/cowardly)) + mood_change *= 1.25 + if(HAS_PERSONALITY(owner, /datum/personality/brave)) + mood_change *= 0.75 + + add_effects(arglist(mood_args)) + + mood_change = floor(mood_change) + + timeout *= max((mood_change > 0) ? home.positive_moodlet_length_modifier : home.negative_moodlet_length_modifier, 0.1) + if(timeout) + addtimer(CALLBACK(home, TYPE_PROC_REF(/datum/mood, clear_mood_event), category), timeout, (TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_NO_HASH_WAIT)) + +/** + * Called when added to a mob + * + * * ... - Any arguments passed to add_mood_event after the typepath are passed here + */ +/datum/mood_event/proc/add_effects(...) return +/** + * Called when the event is cleared from a mob + */ /datum/mood_event/proc/remove_effects() return + +/** + * Called when we get added to a mood datum, but a mood of our type in our category already + * + * * home - the mood datum we are being added to + * * ... - any other arguments that are passed to the mood event + * + * Return BLOCK_NEW_MOOD to stop the new mood event from being added + * Return ALLOW_NEW_MOOD to allow the new mood event to be added - note this implicitly deletes [src] + */ +/datum/mood_event/proc/be_refreshed(datum/mood/home, ...) + // Base behavior is refresh the timer + if(timeout) + addtimer(CALLBACK(home, TYPE_PROC_REF(/datum/mood, clear_mood_event), category), timeout, (TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_NO_HASH_WAIT)) + return BLOCK_NEW_MOOD + +/** + * Called when we get added to a mood datum, but a mood of a different type is in our category + * + * * home - the mood datum we are being added to + * * new_event - the new mood event that is being added + * * ... - any other arguments that are passed to the mood event + * + * Return BLOCK_NEW_MOOD to stop the new mood event from being added + * Return ALLOW_NEW_MOOD to allow the new mood event to be added - note this implicitly deletes [src] + */ +/datum/mood_event/proc/be_replaced(datum/mood/home, datum/mood_event/new_event, ...) + return ALLOW_NEW_MOOD + +/// Subtype of mood event that iterates over all subtypes of itself to find a suitable one to apply +/datum/mood_event/conditional + abstract_type = /datum/mood_event/conditional + /// Priority of this condition over other conditions. Higher = more priority. + /// If two priorities are the same, the first one found is used, which would be the one defined first in code. + var/priority = 0 + +/datum/mood_event/conditional/can_effect_mob(datum/mood/home, mob/living/who, ...) + return ..() && condition_fulfilled(arglist(args.Copy(2))) + +/** + * Is the condition for this mood event fulfilled for the given mob? + * + * * who - the mob to check + * * ... - any other arguments that are passed to the mood event + */ +/datum/mood_event/conditional/proc/condition_fulfilled(mob/living/who, ...) + return FALSE + +/datum/mood_event/conditional/be_replaced(datum/mood/home, datum/mood_event/conditional/new_event, ...) + return initial(new_event.priority) > initial(priority) ? ALLOW_NEW_MOOD : BLOCK_NEW_MOOD diff --git a/code/datums/mood_events/death.dm b/code/datums/mood_events/death.dm new file mode 100644 index 000000000000..947e9c74b8ce --- /dev/null +++ b/code/datums/mood_events/death.dm @@ -0,0 +1,181 @@ +/datum/mood_event/conditional/see_death + mood_change = -8 + timeout = 5 MINUTES + +/datum/mood_event/conditional/see_death/can_effect_mob(datum/mood/home, mob/living/who, mob/dead_mob, dusted, gibbed) + if(isnull(dead_mob)) + stack_trace("Death mood event being applied with null dead_mob") + return FALSE + + return ..() + +/datum/mood_event/conditional/see_death/condition_fulfilled(mob/living/who, mob/dead_mob, dusted, gibbed) + return TRUE + +/datum/mood_event/conditional/see_death/add_effects(mob/dead_mob, dusted, gibbed) + update_effect(dead_mob) + + if(HAS_TRAIT(dead_mob, TRAIT_SPAWNED_MOB)) + mood_change *= 0.25 + timeout *= 0.2 + + if(HAS_PERSONALITY(owner, /datum/personality/compassionate) && mood_change < 0) + mood_change *= 1.5 + timeout *= 1.5 + + if(gibbed || dusted) + mood_change *= 1.2 + timeout *= 1.5 + + if(!description) + if(gibbed) + description = "%DEAD_MOB% just exploded in front of me!!" + else if(dusted) + description = "%DEAD_MOB% was just vaporized in front of me!!" + else + description = "I just saw %DEAD_MOB% die. How horrible..." + + description = capitalize(replacetext(description, "%DEAD_MOB%", get_descriptor(dead_mob))) + +/// Blank proc which allows conditional effects to modify mood, timeout, or description before the main effect is applied +/datum/mood_event/conditional/see_death/proc/update_effect(mob/dead_mob) + return + +/// Checks if the dead mob is a pet +/datum/mood_event/conditional/see_death/proc/is_pet(mob/dead_mob) + return istype(dead_mob, /mob/living/basic/pet) || ismonkey(dead_mob) + +/datum/mood_event/conditional/see_death/be_refreshed(datum/mood/home, mob/dead_mob, dusted, gibbed) + if(can_stack_effect(dead_mob)) + mood_change *= 1.5 + return ..() + +/datum/mood_event/conditional/see_death/be_replaced(datum/mood/home, datum/mood_event/new_event, mob/dead_mob, dusted, gibbed) + . = ..() + // when blocking a new mood event (because it's lower priority), refresh ourselves instead + if(. == BLOCK_NEW_MOOD) + return be_refreshed(home, dead_mob, dusted, gibbed) + +/// Checks if our mood can get worse by seeing another death (or better if we're weird like that) +/datum/mood_event/conditional/see_death/proc/can_stack_effect(mob/dead_mob) + // if we're desensitized, don't stack unless it's a buff + if(HAS_TRAIT(owner, TRAIT_DESENSITIZED) && mood_change > 0) + return FALSE + // if we're seeing a spawned mob die, don't stack + if(HAS_TRAIT(dead_mob, TRAIT_SPAWNED_MOB)) + return FALSE + return TRUE + +/// Changes "I saw Joe x" to "I saw the engineer x" +/datum/mood_event/conditional/see_death/proc/get_descriptor(mob/dead_mob) + if(is_pet(dead_mob)) + return "[dead_mob]" + if(dead_mob.name != "Unknown" && dead_mob.mind?.assigned_role?.job_flags & JOB_CREW_MEMBER) + return "the [LOWER_TEXT(dead_mob.mind?.assigned_role.title)]" + return "someone" + +/// Highest priority: Clown naivety about death +/datum/mood_event/conditional/see_death/naive + priority = 100 + mood_change = 0 + +/datum/mood_event/conditional/see_death/naive/condition_fulfilled(mob/living/who, mob/dead_mob, dusted, gibbed) + return HAS_TRAIT(who, TRAIT_NAIVE) && !dusted && !gibbed + +/datum/mood_event/conditional/see_death/naive/update_effect(mob/dead_mob) + description = "Have a good nap, [get_descriptor(dead_mob)]." + +/// Cultists are super brainwashed so they get buffs instead +/datum/mood_event/conditional/see_death/cult + priority = 90 + description = "More souls for the Geometer!" + mood_change = parent_type::mood_change * -0.5 + +/datum/mood_event/conditional/see_death/cult/condition_fulfilled(mob/living/who, mob/dead_mob, dusted, gibbed) + if(!HAS_TRAIT(who, TRAIT_CULT_HALO)) + return FALSE + if(HAS_TRAIT(dead_mob, TRAIT_CULT_HALO)) + return FALSE + return TRUE + +/// Revs are also brainwashed but less so +/datum/mood_event/conditional/see_death/revolutionary + priority = 85 + mood_change = parent_type::mood_change * -0.5 + +/datum/mood_event/conditional/see_death/revolutionary/condition_fulfilled(mob/living/who, mob/dead_mob, dusted, gibbed) + return IS_REVOLUTIONARY(who) && (dead_mob.mind?.assigned_role.job_flags & JOB_HEAD_OF_STAFF) + +/datum/mood_event/conditional/see_death/revolutionary/update_effect(mob/dead_mob) + var/datum/job/possible_head_job = dead_mob.mind?.assigned_role + description = "[possible_head_job.title ? "The [LOWER_TEXT(possible_head_job.title)]" : "Another head of staff"] is dead! Long live the revolution!" + +/// Then gamers +/datum/mood_event/conditional/see_death/gamer + priority = 80 + description = "Another one bites the dust!" + mood_change = parent_type::mood_change * -0.5 + +/datum/mood_event/conditional/see_death/gamer/condition_fulfilled(mob/living/who, mob/dead_mob, dusted, gibbed) + return istype(who.mind?.assigned_role, /datum/job/bitrunning_glitch) || istype(who.mind?.assigned_role, /datum/job/bit_avatar) + +/// People who just don't gaf +/datum/mood_event/conditional/see_death/dontcare + priority = 40 + mood_change = 0 + timeout = parent_type::timeout * 0.5 + +/datum/mood_event/conditional/see_death/dontcare/condition_fulfilled(mob/living/who, mob/dead_mob, dusted, gibbed) + if(HAS_PERSONALITY(who, /datum/personality/callous)) + return TRUE + if(HAS_PERSONALITY(who, /datum/personality/animal_disliker) && is_pet(dead_mob)) + return TRUE + return FALSE + +/datum/mood_event/conditional/see_death/dontcare/update_effect(mob/dead_mob, dusted, gibbed) + if(gibbed) + description = "Oh, %DEAD_MOB% exploded. Now I have to get the mop." + else if(dusted) + description = "Oh, %DEAD_MOB% was vaporized. Now I have to get the dustpan." + else + description = "Oh, %DEAD_MOB% died. Shame, I guess." + +/// Pets take priority over normal death moodlets +/datum/mood_event/conditional/see_death/pet + priority = 30 + +/datum/mood_event/conditional/see_death/pet/condition_fulfilled(mob/living/who, mob/dead_mob, dusted, gibbed) + return is_pet(dead_mob) + +/datum/mood_event/conditional/see_death/pet/update_effect(mob/dead_mob, dusted, gibbed) + if(gibbed) + description = "%DEAD_MOB% just exploded!!" + else if(dusted) + description = "%DEAD_MOB% just vaporized!!" + else + description = "%DEAD_MOB% just died!!" + + // future todo : make the hop care about ian, cmo runtime, etc. + if(HAS_PERSONALITY(owner, /datum/personality/animal_friend)) + mood_change *= 1.5 + timeout *= 1.25 + else if(!HAS_PERSONALITY(owner, /datum/personality/compassionate)) + mood_change *= 0.25 + timeout *= 0.5 + +/// Desensitized brings up the rear +/datum/mood_event/conditional/see_death/desensitized + priority = 10 + mood_change = parent_type::mood_change * 0.5 + timeout = parent_type::timeout * 0.5 + +/datum/mood_event/conditional/see_death/desensitized/condition_fulfilled(mob/living/who, mob/dead_mob, dusted, gibbed) + return HAS_TRAIT(who, TRAIT_DESENSITIZED) + +/datum/mood_event/conditional/see_death/desensitized/update_effect(mob/dead_mob, dusted, gibbed) + if(gibbed) + description = "I saw %DEAD_MOB% explode." + else if(dusted) + description = "I saw %DEAD_MOB% get vaporized." + else + description = "I saw %DEAD_MOB% die." diff --git a/code/datums/mood_events/dna_infuser_events.dm b/code/datums/mood_events/dna_infuser_events.dm index 26c07d76b111..be937d087a89 100644 --- a/code/datums/mood_events/dna_infuser_events.dm +++ b/code/datums/mood_events/dna_infuser_events.dm @@ -2,6 +2,7 @@ description = "Heh heh. \"It's on the mouse\". What a play on words." mood_change = 1 timeout = 2 MINUTES + event_flags = MOOD_EVENT_WHIMSY /datum/mood_event/gondola_serenity description = "There's a lot that could be on your mind right now. But this feeling of contentedness, a universal calling to simply sit back and observe is washing over you..." diff --git a/code/datums/mood_events/drink_events.dm b/code/datums/mood_events/drink_events.dm index 8ecc19b6fc28..6c87a0626f2b 100644 --- a/code/datums/mood_events/drink_events.dm +++ b/code/datums/mood_events/drink_events.dm @@ -31,12 +31,22 @@ if(90 to INFINITY) mood_change = 3 // crash out description = "You're my BESSST frien'... You and me agains' th' world, buddy. Le's get another drink." + if(HAS_PERSONALITY(owner, /datum/personality/teetotal)) + mood_change *= -1.5 + description = "I don't like drinking... It makes me feel horrible." + if(HAS_PERSONALITY(owner, /datum/personality/bibulous)) + mood_change *= 1.5 if(old_mood != mood_change) owner.mob_mood.update_mood() /datum/mood_event/drunk/remove_effects() QDEL_NULL(blush_overlay) +/datum/mood_event/drunk_after + mood_change = 2 + description = "The buzz might be gone, but I still feel good." + timeout = 5 MINUTES + /datum/mood_event/wrong_brandy description = "I hate that type of drink." mood_change = -2 diff --git a/code/datums/mood_events/food_events.dm b/code/datums/mood_events/food_events.dm index e64d975902ea..239e4b772932 100644 --- a/code/datums/mood_events/food_events.dm +++ b/code/datums/mood_events/food_events.dm @@ -2,55 +2,62 @@ description = "I really enjoyed eating that." mood_change = 5 timeout = 4 MINUTES + event_flags = MOOD_EVENT_FOOD /datum/mood_event/gross_food description = "I really didn't like that food." mood_change = -2 timeout = 4 MINUTES + event_flags = MOOD_EVENT_FOOD /datum/mood_event/disgusting_food description = "That food was disgusting!" mood_change = -6 timeout = 4 MINUTES + event_flags = MOOD_EVENT_FOOD /datum/mood_event/allergic_food description = "My throat itches." mood_change = -2 timeout = 4 MINUTES + event_flags = MOOD_EVENT_FOOD /datum/mood_event/breakfast description = "Nothing like a hearty breakfast to start the shift." mood_change = 2 timeout = 10 MINUTES + event_flags = MOOD_EVENT_FOOD /datum/mood_event/food timeout = 5 MINUTES - var/quality = FOOD_QUALITY_NORMAL + event_flags = MOOD_EVENT_FOOD -/datum/mood_event/food/New(mob/M, ...) - . = ..() - mood_change = 2 + 2 * quality +/datum/mood_event/food/add_effects(quality = FOOD_QUALITY_NORMAL, timeout_mod = 1) + mood_change = calculate_mood_change(quality) + timeout *= timeout_mod 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 +/datum/mood_event/food/be_refreshed(datum/mood/home, quality, timeout_mod) + var/old_mood = mood_change + // updates timeout (which is handled in parent call) and mood + timeout = max(timeout, initial(timeout) * timeout_mod) + mood_change = max(mood_change, calculate_mood_change(quality)) + // if mood_change is the same, we don't need to update the description + if(old_mood != mood_change) + description = "That food was [GLOB.food_quality_description[quality]]." + return ..() + +/datum/mood_event/food/proc/calculate_mood_change(base_quality) + var/quality = 1 + 1.5 * base_quality + if(HAS_PERSONALITY(owner, /datum/personality/ascetic)) + quality *= 0.5 + if(HAS_PERSONALITY(owner, /datum/personality/gourmand)) + if(quality <= FOOD_QUALITY_GOOD) + quality = FOOD_QUALITY_NORMAL + return ceil(quality) /datum/mood_event/pacifist_eating_fish_item description = "I shouldn't be eating living creatures..." mood_change = -1 //The disgusting food moodlet already has a pretty big negative value, this is just for context. timeout = 4 MINUTES + event_flags = MOOD_EVENT_FOOD diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 2c5a97495509..8bce84f73b43 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -10,10 +10,12 @@ /datum/mood_event/on_fire description = "I'M ON FIRE!!!" mood_change = -12 + event_flags = MOOD_EVENT_FEAR /datum/mood_event/suffocation description = "CAN'T... BREATHE..." mood_change = -12 + event_flags = MOOD_EVENT_FEAR /datum/mood_event/burnt_thumb description = "I shouldn't play with lighters..." @@ -32,6 +34,7 @@ description = "I've been creamed. Tastes like pie flavor." mood_change = -2 timeout = 3 MINUTES + event_flags = MOOD_EVENT_WHIMSY // if whimsical, no penalty /datum/mood_event/inked description = "I've been splashed with squid ink. Tastes like salt." @@ -42,6 +45,7 @@ description = "I slipped. I should be more careful next time..." mood_change = -2 timeout = 3 MINUTES + event_flags = MOOD_EVENT_WHIMSY // if whimsical, no penalty /datum/mood_event/eye_stab description = "I used to be an adventurer like you, until I took a screwdriver to the eye." @@ -81,12 +85,7 @@ description = "Ouch! My limb feels like I fell asleep on it." mood_change = -3 timeout = 2 MINUTES - -/datum/mood_event/reattachment/New(mob/M, ...) - if(HAS_TRAIT(M, TRAIT_ANALGESIA)) - qdel(src) - return - return ..() + event_flags = MOOD_EVENT_PAIN /datum/mood_event/reattachment/add_effects(obj/item/bodypart/limb) if(limb) @@ -117,12 +116,7 @@ description = "That fucking table, man that hurts..." mood_change = -3 timeout = 3 MINUTES - -/datum/mood_event/table_limbsmash/New(mob/M, ...) - if(HAS_TRAIT(M, TRAIT_ANALGESIA)) - qdel(src) - return - return ..() + event_flags = MOOD_EVENT_PAIN /datum/mood_event/table_limbsmash/add_effects(obj/item/bodypart/banged_limb) if(banged_limb) @@ -147,15 +141,18 @@ /datum/mood_event/photophobia description = "The lights are too bright..." mood_change = -3 + event_flags = MOOD_EVENT_FEAR /datum/mood_event/nyctophobia description = "It sure is dark around here..." mood_change = -3 + event_flags = MOOD_EVENT_FEAR /datum/mood_event/claustrophobia description = "Why do I feel trapped?! Let me out!!!" mood_change = -7 timeout = 1 MINUTES + event_flags = MOOD_EVENT_FEAR /datum/mood_event/bright_light description = "I hate it in the light... I need to find a darker place..." @@ -177,9 +174,14 @@ description = "I'm nervous and on edge and I can't stand still!!" mood_change = -2 +/datum/mood_event/jittery/add_effects(...) + if(HAS_PERSONALITY(owner, /datum/personality/paranoid)) + mood_change -= 1 + /datum/mood_event/choke description = "I CAN'T BREATHE!!!" mood_change = -10 + event_flags = MOOD_EVENT_FEAR /datum/mood_event/vomit description = "I just threw up. Gross." @@ -195,27 +197,25 @@ description = "Medicine may be good for me but right now it stings like hell." mood_change = -5 timeout = 60 SECONDS - -/datum/mood_event/painful_medicine/New(mob/M, ...) - if(HAS_TRAIT(M, TRAIT_ANALGESIA)) - qdel(src) - return - return ..() + event_flags = MOOD_EVENT_PAIN /datum/mood_event/startled description = "Hearing that word made me think about something scary." mood_change = -1 timeout = 1 MINUTES + event_flags = MOOD_EVENT_FEAR /datum/mood_event/phobia - description = "I saw something very frightening." + description = "I saw something very frightening!" mood_change = -4 timeout = 4 MINUTES + event_flags = MOOD_EVENT_FEAR /datum/mood_event/spooked description = "The rattling of those bones... It still haunts me." mood_change = -4 timeout = 4 MINUTES + event_flags = MOOD_EVENT_FEAR /datum/mood_event/notcreeping description = "The voices are not happy, and they painfully contort my thoughts into getting back on task." @@ -243,30 +243,24 @@ /datum/mood_event/back_pain description = "Bags never sit right on my back, this hurts like hell!" mood_change = -15 - -/datum/mood_event/back_pain/New(mob/M, ...) - if(HAS_TRAIT(M, TRAIT_ANALGESIA)) - qdel(src) - return - return ..() - -/datum/mood_event/sad_empath - description = "Someone seems upset..." - mood_change = -1 - timeout = 60 SECONDS - -/datum/mood_event/sad_empath/add_effects(mob/sadtarget) - description = "[sadtarget.name] seems upset..." + event_flags = MOOD_EVENT_PAIN /datum/mood_event/sacrifice_bad description = "Those darn savages!" mood_change = -5 timeout = 2 MINUTES + event_flags = MOOD_EVENT_SPIRITUAL /datum/mood_event/artbad description = "I've produced better art than that from my ass." mood_change = -2 timeout = 2 MINUTES + event_flags = MOOD_EVENT_ART + +/datum/mood_event/artbad/add_effects() + if(HAS_PERSONALITY(owner, /datum/personality/creative)) + mood_change = 0 + description = "Everyone has to start their art journey somewhere!" /datum/mood_event/graverobbing description = "I just desecrated someone's grave... I can't believe I did that..." @@ -280,6 +274,7 @@ /datum/mood_event/gunpoint description = "This guy is insane! I better be careful..." mood_change = -10 + event_flags = MOOD_EVENT_FEAR /datum/mood_event/tripped description = "I can't believe I fell for the oldest trick in the book!" @@ -295,6 +290,7 @@ description = "I HAD A GLIMPSE OF THE HORROR BEYOND THIS WORLD. REALITY UNCOILED BEFORE MY EYES!" mood_change = -25 timeout = 4 MINUTES + event_flags = MOOD_EVENT_FEAR /datum/mood_event/high_five_full_hand description = "Oh god, I don't even know how to high-five correctly..." @@ -320,6 +316,7 @@ /datum/mood_event/surgery description = "THEY'RE CUTTING ME OPEN!!" mood_change = -8 + event_flags = MOOD_EVENT_FEAR var/surgery_completed = FALSE /datum/mood_event/surgery/success @@ -423,16 +420,19 @@ /datum/mood_event/gamer_withdrawal description = "I wish I was gaming right now..." mood_change = -5 + event_flags = MOOD_EVENT_GAMING /datum/mood_event/gamer_lost description = "If I'm not good at video games, can I truly call myself a gamer?" - mood_change = -10 + mood_change = -6 timeout = 10 MINUTES + event_flags = MOOD_EVENT_GAMING /datum/mood_event/lost_52_card_pickup description = "This is really embarrassing! I'm ashamed to pick up all these cards off the floor..." mood_change = -3 timeout = 3 MINUTES + event_flags = MOOD_EVENT_WHIMSY | MOOD_EVENT_GAMING /datum/mood_event/russian_roulette_lose_cheater description = "I gambled and lost! Good thing I wasn't aiming for my head..." @@ -444,6 +444,12 @@ mood_change = -20 timeout = 10 MINUTES +/datum/mood_event/russian_roulette_lose/add_effects() + if(HAS_PERSONALITY(owner, /datum/personality/gambler)) + mood_change *= 0.5 + description = "I gambled my life and lost! Truth is, the game was rigged from the start..." + return + /datum/mood_event/bad_touch_bear_hug description = "I just got squeezed way too hard." mood_change = -1 @@ -473,11 +479,17 @@ description = "THE MOON JUDGES AND FINDS ME WANTING!!!" mood_change = -3 timeout = 5 MINUTES + event_flags = MOOD_EVENT_FEAR + +/datum/mood_event/moon_insanity/add_effects() + if(HAS_PERSONALITY(owner, /datum/personality/spiritual)) + mood_change *= 2 /datum/mood_event/amulet_insanity - description = "I sEe THe LiGHt, It mUsT BE stOPPed" + description = "I sEe THe LiGHt, It mUsT BE stOPPed!" mood_change = -6 timeout = 5 MINUTES + event_flags = MOOD_EVENT_FEAR /datum/mood_event/mallet_humiliation description = "Getting hit by such a stupid weapon feels rather humiliating..." @@ -535,7 +547,94 @@ description = "Blowing smoke in my face, really?" mood_change = 0 +/datum/mood_event/slots/loss + description = "Aww dang it!" + mood_change = -2 + timeout = 5 MINUTES + event_flags = MOOD_EVENT_GAMING + +/datum/mood_event/slots/loss/add_effects() + if(HAS_PERSONALITY(owner, /datum/personality/gambler)) + mood_change = 0 + description = "Aww dang it." + if(HAS_PERSONALITY(owner, /datum/personality/industrious) || HAS_PERSONALITY(owner, /datum/personality/slacking/diligent)) + mood_change *= 1.5 + /datum/mood_event/lost_control_of_life description = "I've lost control of my life." mood_change = -5 timeout = 5 MINUTES + +/datum/mood_event/empathetic_sad + description = "Seeing sad people makes me sad." + mood_change = -2 + timeout = 3 MINUTES + +/datum/mood_event/misanthropic_sad + description = "Seeing happy people makes me uneasy." + mood_change = -2 + timeout = 3 MINUTES + +/datum/mood_event/paranoid/one_on_one + description = "I'm alone with someone - what if they want to kill me?" + mood_change = -3 + event_flags = MOOD_EVENT_FEAR + +/datum/mood_event/paranoid/large_group + description = "There are so many people around - any one of them could be out to get me!" + mood_change = -3 + event_flags = MOOD_EVENT_FEAR + +/datum/mood_event/nt_disillusioned + description = "I hate the company, and everything it stands for." + mood_change = -2 + +/datum/mood_event/disillusioned_revs_lost + description = "The revolution was defeated... greaaaat." + mood_change = -2 + timeout = 10 MINUTES + +/datum/mood_event/loyalist_revs_win + description = "The revolution was a success... This will hurt quarterly profits." + mood_change = -2 + timeout = 10 MINUTES + +/datum/mood_event/slacking_off_diligent + description = "I should get back to work." + mood_change = -1 + +/datum/mood_event/unimaginative_patronage + description = "That felt like a waste of money." + mood_change = -2 + timeout = 5 MINUTES + +/datum/mood_event/unimaginative_framing + description = "I could've hung something more useful there." + mood_change = -2 + timeout = 5 MINUTES + +/datum/mood_event/unimaginative_sculpting + description = "That felt like a waste of materials." + mood_change = -2 + timeout = 5 MINUTES + +/datum/mood_event/splattered_with_blood + description = "Eugh, I just got coated in blood!" + mood_change = -4 + timeout = 4 MINUTES + +/datum/mood_event/splattered_with_blood/can_effect_mob(datum/mood/home, mob/living/who, ...) + if(isvampire(who)) + return FALSE + + return ..() + +/datum/mood_event/splattered_with_blood/add_effects(...) + if(HAS_TRAIT(owner, TRAIT_CULT_HALO)) + mood_change = 2 + description = "Blood, blood! The Geometer will be pleased." + return + if(HAS_TRAIT(owner, TRAIT_MORBID) || HAS_TRAIT(owner, TRAIT_EVIL)) + mood_change = 0 + description = "I just got coated in blood. Fascinating!" + return diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 2c4ac282c64e..cb4aa022224b 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -3,17 +3,53 @@ mood_change = 1 timeout = 2 MINUTES +/datum/mood_event/hug/add_effects() + if(HAS_PERSONALITY(owner, /datum/personality/aromantic)) + mood_change = -1 + description = "A hug? Call HR!" + return + if(HAS_PERSONALITY(owner, /datum/personality/aloof)) + mood_change = -1 + description = "I would prefer not to be touched." + return + if(HAS_PERSONALITY(owner, /datum/personality/callous)) + mood_change = 0 + description = "I hate hugs." + return + /datum/mood_event/bear_hug description = "I got squeezed very tightly, but it was quite nice." mood_change = 1 timeout = 2 MINUTES +/datum/mood_event/bear_hug/add_effects() + if(HAS_PERSONALITY(owner, /datum/personality/aromantic) \ + || HAS_PERSONALITY(owner, /datum/personality/aloof) \ + || HAS_PERSONALITY(owner, /datum/personality/callous) \ + ) + mood_change = -2 + description = "They're squeezing me too tightly!" + return + /datum/mood_event/betterhug description = "Someone was very nice to me." mood_change = 3 timeout = 4 MINUTES /datum/mood_event/betterhug/add_effects(mob/friend) + if(HAS_PERSONALITY(owner, /datum/personality/aromantic)) + mood_change = 1 + description = "[friend.name] is nice, but that's it." + return + if(HAS_PERSONALITY(owner, /datum/personality/aloof)) + mood_change = 1 + description = "[friend.name] is nice, but I wish they'd stop touching me." + return + if(HAS_PERSONALITY(owner, /datum/personality/callous)) + mood_change = 0 + description = "[friend.name] is way too nice for this station." + return + description = "[friend.name] was very nice to me." /datum/mood_event/besthug @@ -22,6 +58,19 @@ timeout = 4 MINUTES /datum/mood_event/besthug/add_effects(mob/friend) + if(HAS_PERSONALITY(owner, /datum/personality/aromantic)) + mood_change = 2 + description = "[friend.name] is great to be around, but that's it." + return + if(HAS_PERSONALITY(owner, /datum/personality/aloof)) + mood_change = 2 + description = "[friend.name] is great to be around, but I wish they'd stop touching me." + return + if(HAS_PERSONALITY(owner, /datum/personality/callous)) + mood_change = 0 + description = "[friend.name] is way too nice for this station." + return + description = "[friend.name] is great to be around, [friend.p_they()] makes me feel so happy!" /datum/mood_event/warmhug @@ -29,20 +78,49 @@ mood_change = 1 timeout = 2 MINUTES +/datum/mood_event/warmhug/add_effects() + if(HAS_PERSONALITY(owner, /datum/personality/aromantic)) + mood_change = 0 + description = "I don't like hugs, but the warmth is nice...." + return + if(HAS_PERSONALITY(owner, /datum/personality/aloof)) + mood_change = 0 + description = "I would prefer not to be touched, but the warmth is nice...." + return + if(HAS_PERSONALITY(owner, /datum/personality/callous)) + mood_change = 0 + description = "I hate hugs. I can warm myself up." + return + /datum/mood_event/tailpulled description = "I love getting my tail pulled!" mood_change = 1 timeout = 2 MINUTES +/datum/mood_event/tailpulled/add_effects() + if(HAS_PERSONALITY(owner, /datum/personality/aloof) \ + || HAS_PERSONALITY(owner, /datum/personality/aromantic) \ + || HAS_PERSONALITY(owner, /datum/personality/callous) \ + ) + mood_change = -2 + description = "Who the hell is touching my tail?" + /datum/mood_event/arcade description = "I beat the arcade game!" mood_change = 3 timeout = 8 MINUTES + event_flags = MOOD_EVENT_GAMING + +/datum/mood_event/arcade/add_effects() + if(HAS_PERSONALITY(owner, /datum/personality/industrious) || HAS_PERSONALITY(owner, /datum/personality/slacking/diligent)) + mood_change = -1 + description = "Wow, I beat the game. I could've been doing anything productive instead." /datum/mood_event/blessing description = "I've been blessed." - mood_change = 3 + mood_change = 1 timeout = 8 MINUTES + event_flags = MOOD_EVENT_SPIRITUAL /datum/mood_event/maintenance_adaptation mood_change = 8 @@ -55,21 +133,67 @@ mood_change = 1 timeout = 5 MINUTES +/datum/mood_event/book_nerd/add_effects() + if(HAS_PERSONALITY(owner, /datum/personality/erudite)) + mood_change = 2 + description = "I love reading books!" + if(HAS_PERSONALITY(owner, /datum/personality/uneducated)) + mood_change = -1 + description = "Who cares about books?" + /datum/mood_event/exercise description = "Working out releases those endorphins!" mood_change = 1 /datum/mood_event/exercise/add_effects(fitness_level) mood_change = fitness_level // the more fit you are, the more you like to work out - return ..() + if(HAS_PERSONALITY(owner, /datum/personality/slacking/lazy)) + mood_change *= -0.5 + description = "Working out, what a chore!" + else if(!HAS_PERSONALITY(owner, /datum/personality/athletic)) + mood_change *= 0.5 + description = "Working out is a bit of a chore, but it is pretty fulfilling." /datum/mood_event/pet_animal description = "Animals are adorable! I can't stop petting them!" - mood_change = 2 timeout = 5 MINUTES + /// Tracks the typepath of animal we last petted + var/animal_type /datum/mood_event/pet_animal/add_effects(mob/animal) - description = "\The [animal.name] is adorable! I can't stop petting [animal.p_them()]!" + animal_type = animal?.type + + if(HAS_PERSONALITY(owner, /datum/personality/animal_disliker)) + mood_change = -1 + description = "Ewww, [animal] is so dirty! I don't want to touch it!" + return + + var/dog_fan = HAS_PERSONALITY(owner, /datum/personality/dog_fan) + var/isdog = istype(animal, /mob/living/basic/pet/dog) + var/cat_fan = HAS_PERSONALITY(owner, /datum/personality/cat_fan) + var/iscat = istype(animal, /mob/living/basic/pet/cat) + if((dog_fan && isdog) || (cat_fan && iscat) || HAS_PERSONALITY(owner, /datum/personality/animal_friend)) + mood_change = 3 + description = "I love [animal] so much, [animal.p_theyre()] so adorable! I can't stop petting [animal.p_them()]!" + return + if(dog_fan && iscat) + mood_change = -1 + description = "I don't like [animal]! I prefer dogs!" + return + if(cat_fan && isdog) + mood_change = -1 + description = "I don't like [animal]! I prefer cats!" + return + + mood_change = 1 + description = "[animal] is adorable!" + +// Change the moodlet if we get refreshed (we may have pet another type of animal) +/datum/mood_event/pet_animal/be_refreshed(datum/mood/home, mob/animal) + . = ..() + if(animal_type == animal?.type) + return + add_effects(animal) /datum/mood_event/honk description = "I've been honked!" @@ -77,12 +201,21 @@ timeout = 4 MINUTES special_screen_obj = "honked_nose" special_screen_replace = FALSE + event_flags = MOOD_EVENT_WHIMSY /datum/mood_event/saved_life description = "It feels good to save a life." mood_change = 6 timeout = 8 MINUTES +/datum/mood_event/saved_life/add_effects() + if(HAS_PERSONALITY(owner, /datum/personality/callous)) + mood_change = 0 + description = "I don't care much for saving lives." + if(HAS_PERSONALITY(owner, /datum/personality/misanthropic)) + mood_change = -1 + description = "Saving lives is a waste of time." + /datum/mood_event/oblivious description = "What a lovely day." mood_change = 3 @@ -94,16 +227,21 @@ /datum/mood_event/focused description = "I have a goal, and I will reach it, whatever it takes!" //Used for syndies, nukeops etc so they can focus on their goals - mood_change = 4 + mood_change = 8 hidden = TRUE /datum/mood_event/badass_antag description = "I'm a fucking badass and everyone around me knows it. Just look at them; they're all fucking shaking at the mere thought of having me around." - mood_change = 7 + mood_change = 8 hidden = TRUE special_screen_obj = "badass_sun" special_screen_replace = FALSE +/datum/mood_event/ling + description = "We have a goal, and we will reach it, whatever it takes!" + mood_change = 12 + hidden = TRUE + /datum/mood_event/creeping description = "The voices have released their hooks on my mind! I feel free again!" //creeps get it when they are around their obsession mood_change = 18 @@ -117,17 +255,17 @@ /datum/mood_event/cult description = "I have seen the truth, praise the almighty one!" - mood_change = 10 //maybe being a cultist isn't that bad after all + mood_change = 12 //maybe being a cultist isn't that bad after all hidden = TRUE /datum/mood_event/heretics description = "THE HIGHER I RISE, THE MORE I SEE." - mood_change = 10 //maybe being a heretic isnt that bad after all + mood_change = 12 //maybe being a heretic isnt that bad after all hidden = TRUE /datum/mood_event/rift_fishing description = "THE MORE I FISH, THE HIGHER I RISE." - mood_change = 7 + mood_change = 6 timeout = 5 MINUTES /datum/mood_event/family_heirloom @@ -146,6 +284,7 @@ description = "There is something soothing about this music." mood_change = 3 timeout = 60 SECONDS + event_flags = MOOD_EVENT_ART /datum/mood_event/chemical_euphoria description = "Heh...hehehe...hehe..." @@ -165,30 +304,35 @@ description = "I feel comforted by the presence of a holy person." mood_change = 3 timeout = 5 MINUTES + event_flags = MOOD_EVENT_SPIRITUAL /datum/mood_event/clownshoes description = "The shoes are a clown's legacy, I never want to take them off!" - mood_change = 5 + mood_change = 3 /datum/mood_event/sacrifice_good description = "The gods are pleased with this offering!" mood_change = 5 timeout = 3 MINUTES + event_flags = MOOD_EVENT_SPIRITUAL /datum/mood_event/artok description = "It's nice to see people are making art around here." mood_change = 2 timeout = 5 MINUTES + event_flags = MOOD_EVENT_ART /datum/mood_event/artgood description = "What a thought-provoking piece of art. I'll remember that for a while." mood_change = 4 timeout = 5 MINUTES + event_flags = MOOD_EVENT_ART /datum/mood_event/artgreat description = "That work of art was so great it made me believe in the goodness of humanity. Says a lot in a place like this." mood_change = 6 timeout = 5 MINUTES + event_flags = MOOD_EVENT_ART /datum/mood_event/bottle_flip description = "The bottle landing like that was satisfying." @@ -199,6 +343,12 @@ description = "What a peculiar emblem. It makes me feel hopeful for my future." mood_change = 6 +/datum/mood_event/hope_lavaland/add_effects(...) + if(HAS_PERSONALITY(owner, /datum/personality/pessimistic)) + mood_change = 0 + description = "This emblem is a lie. There is no hope for me." + return + /datum/mood_event/confident_mane description = "I'm feeling confident with a head full of hair." mood_change = 2 @@ -215,27 +365,45 @@ /datum/mood_event/helped_up description = "Helping them up felt good!" - mood_change = 2 timeout = 45 SECONDS +/datum/mood_event/helped_up/can_effect_mob(datum/mood/home, mob/living/who, ...) + if(!HAS_PERSONALITY(owner, /datum/personality/compassionate) \ + && !HAS_PERSONALITY(owner, /datum/personality/callous) \ + && !HAS_PERSONALITY(owner, /datum/personality/misanthropic)) + return FALSE + + return ..() + /datum/mood_event/helped_up/add_effects(mob/other_person, helper) if(!other_person) return - if(helper) - description = "Helping [other_person] up felt good!" - else - description = "[other_person] helped me up, how nice of [other_person.p_them()]!" + if(HAS_PERSONALITY(owner, /datum/personality/callous) || HAS_PERSONALITY(owner, /datum/personality/misanthropic)) + mood_change = -2 + if(helper) + description = "They should have helped themselves." + else + description = "I could've gotten up myself." + + else if(HAS_PERSONALITY(owner, /datum/personality/compassionate)) + mood_change = 2 + if(helper) + description = "Helping [other_person] up felt good!" + else + description = "[other_person] helped me up, how nice of [other_person.p_them()]!" /datum/mood_event/high_ten description = "AMAZING! A HIGH-TEN!" mood_change = 3 timeout = 45 SECONDS + event_flags = MOOD_EVENT_WHIMSY /datum/mood_event/down_low description = "HA! What a rube, they never stood a chance..." mood_change = 4 timeout = 90 SECONDS + event_flags = MOOD_EVENT_WHIMSY /datum/mood_event/aquarium_positive description = "Watching fish in an aquarium is calming." @@ -252,6 +420,10 @@ timeout = 2 MINUTES /datum/mood_event/kiss/add_effects(mob/beau, direct) + if(HAS_PERSONALITY(owner, /datum/personality/aromantic)) + mood_change = -2 + description = "A kiss? Call HR!" + return if(!beau) return if(direct) @@ -277,6 +449,7 @@ description = "Ahaha! It's always funny to see someone get sprayed by a can of soda." mood_change = 2 timeout = 30 SECONDS + event_flags = MOOD_EVENT_WHIMSY /datum/mood_event/observed_soda_spill/add_effects(mob/spilled_mob, atom/soda_can) if(!spilled_mob) @@ -288,17 +461,29 @@ description = "I'm enjoying a nice gaming session!" mood_change = 2 timeout = 30 SECONDS + event_flags = MOOD_EVENT_GAMING + +/datum/mood_event/gaming/add_effects() + if(HAS_PERSONALITY(owner, /datum/personality/industrious) || HAS_PERSONALITY(owner, /datum/personality/slacking/diligent)) + mood_change = -1 + description = "Is now really the time to be playing games? I should be working." /datum/mood_event/gamer_won description = "I love winning video games!" - mood_change = 10 + mood_change = 6 timeout = 5 MINUTES + event_flags = MOOD_EVENT_GAMING /datum/mood_event/love_reagent description = "This food reminds me of the good ol' days." mood_change = 5 /datum/mood_event/love_reagent/add_effects(duration) + if(HAS_PERSONALITY(owner, /datum/personality/pessimistic)) + mood_change = 0 + description = "This food is okay, I guess." + return + if(isnum(duration)) timeout = duration @@ -306,11 +491,13 @@ description = "HA! That loser will be picking cards up for a long time!" mood_change = 3 timeout = 3 MINUTES + event_flags = MOOD_EVENT_WHIMSY | MOOD_EVENT_GAMING /datum/mood_event/playing_cards description = "I'm enjoying playing cards with other people!" mood_change = 2 timeout = 3 MINUTES + event_flags = MOOD_EVENT_GAMING /datum/mood_event/playing_cards/add_effects(param) var/card_players = 1 @@ -334,7 +521,8 @@ timeout = 5 MINUTES /datum/mood_event/russian_roulette_win/add_effects(loaded_rounds) - mood_change = 2 ** loaded_rounds + var/base = HAS_PERSONALITY(owner, /datum/personality/gambler) ? 2 : 1.8 + mood_change = round(base ** loaded_rounds, 1) /datum/mood_event/fishing description = "Fishing is relaxing." @@ -359,6 +547,7 @@ description = "It felt nice to pet the fish." mood_change = 2 timeout = 2 MINUTES + event_flags = MOOD_EVENT_WHIMSY /datum/mood_event/fish_petting/add_effects(obj/item/fish/fish, morbid) if(!morbid) @@ -391,11 +580,13 @@ description = "Swish! Nothing but net." mood_change = 2 timeout = 5 MINUTES + event_flags = MOOD_EVENT_WHIMSY | MOOD_EVENT_GAMING /datum/mood_event/basketball_dunk description = "Slam dunk! Boom, shakalaka!" mood_change = 2 timeout = 5 MINUTES + event_flags = MOOD_EVENT_WHIMSY | MOOD_EVENT_GAMING /datum/mood_event/moon_smile description = "THE MOON SHOWS ME THE TRUTH AND ITS SMILE IS FACED TOWARDS ME!!!" @@ -410,3 +601,103 @@ /datum/mood_event/prophat description = "This hat fills me with whimsical joy!" mood_change = 2 + event_flags = MOOD_EVENT_WHIMSY + +/datum/mood_event/slots + description = "Let's go gambling!" + mood_change = 1 + timeout = 1 MINUTES + event_flags = MOOD_EVENT_GAMING + +/datum/mood_event/slots/add_effects() + if(HAS_PERSONALITY(owner, /datum/personality/gambler)) + mood_change *= 2 + else if(HAS_PERSONALITY(owner, /datum/personality/industrious) || HAS_PERSONALITY(owner, /datum/personality/slacking/diligent)) + mood_change *= -1 + description = "Why am I gambling my time and money away?" + + +/datum/mood_event/slots/win + description = "Aw yeah I won!" + mood_change = 2 + timeout = 5 MINUTES + event_flags = MOOD_EVENT_GAMING + +/datum/mood_event/slots/win/be_replaced(datum/mood/home, datum/mood_event/new_event, ...) + if(new_event.mood_change < mood_change) + return BLOCK_NEW_MOOD + return ..() + +/datum/mood_event/slots/win/big + mood_change = 3 + timeout = 10 MINUTES + +/datum/mood_event/slots/win/jackpot + description = "JACKPOT! AW YEAH!" + mood_change = 6 + timeout = 30 MINUTES + +/datum/mood_event/empathetic_happy + description = "Seeing happy people makes me happy." + mood_change = 2 + timeout = 2 MINUTES + +/datum/mood_event/misanthropic_happy + description = "Seeing sad people makes me glad." + mood_change = 2 + timeout = 2 MINUTES + +/datum/mood_event/paranoid/alone + description = "Peace and quiet, no one around to threaten me." + mood_change = 1 + +/datum/mood_event/paranoid/small_group + description = "I feel safer in this small group. We've got each other's backs." + mood_change = 2 + +/datum/mood_event/nt_loyalist + description = "I feel proud to be part of the NT™ family!" + mood_change = 2 + +/datum/mood_event/loyalist_revs_lost + description = "The revolution was defeated! Long live the Nanotrasen!" + mood_change = 4 + timeout = 10 MINUTES + +/datum/mood_event/disillusioned_revs_win + description = "The revolution was a success! Viva la revolution!" + mood_change = 4 + timeout = 10 MINUTES + +/datum/mood_event/enjoying_department_area + description = "I love my job." + mood_change = 1 + +/datum/mood_event/slacking_off_lazy + description = "Boss makes a dollar, I make a dime. That's why I slack on job time." + mood_change = 1 + +/datum/mood_event/working_diligent + description = "Working hard is its own reward." + mood_change = 1 + +/datum/mood_event/creative_patronage + description = "Support artists!" + mood_change = 2 + timeout = 5 MINUTES + +/datum/mood_event/creative_framing + description = "Hanging up art really ties the room together." + mood_change = 2 + timeout = 5 MINUTES + +/datum/mood_event/creative_sculpting + description = "Sculpting is a great creative outlet." + mood_change = 2 + timeout = 5 MINUTES + +/datum/mood_event/whimsical_slip + description = "Haha! That guy fell over!" + mood_change = 3 + timeout = 2 MINUTES + event_flags = MOOD_EVENT_WHIMSY diff --git a/code/datums/mood_events/needs_events.dm b/code/datums/mood_events/needs_events.dm index 96f35708a369..6d4560215d4a 100644 --- a/code/datums/mood_events/needs_events.dm +++ b/code/datums/mood_events/needs_events.dm @@ -74,6 +74,14 @@ mood_change = -6 timeout = 4 MINUTES +/datum/mood_event/disgust/dirty_food/add_effects(...) + if(HAS_PERSONALITY(owner, /datum/personality/ascetic)) + mood_change *= 0.25 + description = "That food was dirty, but edible." + if(HAS_PERSONALITY(owner, /datum/personality/gourmand)) + mood_change *= 1.5 + description = "That food was filthy, was it made in a dumpster?!" + //Generic needs events /datum/mood_event/shower description = "I have recently had a nice shower." diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm index 7f564d6fa04e..f38a03f933ab 100644 --- a/code/datums/mutations/antenna.dm +++ b/code/datums/mutations/antenna.dm @@ -68,10 +68,12 @@ if (!owner) return ADD_TRAIT(grant_to, TRAIT_MIND_READER, GENETIC_MUTATION) + RegisterSignal(grant_to, COMSIG_MOB_EXAMINATE, PROC_REF(on_examining)) /datum/action/cooldown/spell/pointed/mindread/Remove(mob/remove_from) . = ..() REMOVE_TRAIT(remove_from, TRAIT_MIND_READER, GENETIC_MUTATION) + UnregisterSignal(remove_from, COMSIG_MOB_EXAMINATE) /datum/action/cooldown/spell/pointed/mindread/is_valid_target(atom/cast_on) if(!isliving(cast_on)) @@ -83,12 +85,15 @@ if(living_cast_on.stat == DEAD) to_chat(owner, span_warning("[cast_on] is dead!")) return FALSE + if(living_cast_on.mob_biotypes & MOB_ROBOTIC) + to_chat(owner, span_warning("[cast_on] is robotic, you can't read [cast_on.p_their()] mind!")) + return FALSE return TRUE /datum/action/cooldown/spell/pointed/mindread/cast(mob/living/cast_on) . = ..() - if(cast_on.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0)) + if(cast_on.can_block_magic(antimagic_flags, charge_cost = 0)) to_chat(owner, span_warning("As you reach into [cast_on]'s mind, \ you are stopped by a mental blockage. It seems you've been foiled.")) return @@ -97,26 +102,78 @@ to_chat(owner, span_warning("You plunge into your mind... Yep, it's your mind.")) return + if(cast_on.has_status_effect(/datum/status_effect/heretic_passive/moon)) + to_chat(owner, span_hypnophrase(span_bolddanger("YOU SEEK THE TRUTH? I WILL SHOW YOU EVERYTHING."))) + if(isliving(owner)) + var/mob/living/reader = owner + reader.apply_status_effect(/datum/status_effect/moon_converted) + return + if(HAS_TRAIT(cast_on, TRAIT_EVIL)) to_chat(owner, span_warning("As you reach into [cast_on]'s mind, \ you feel the overwhelming emptiness within. A truly evil being. \ [HAS_TRAIT(owner, TRAIT_EVIL) ? "It's nice to find someone who is like-minded." : "What is wrong with this person?"]")) - to_chat(owner, span_boldnotice("You plunge into [cast_on]'s mind...")) + var/list/log_info = list() + var/list/discovered_info = list("You plunge into [cast_on]'s mind and discover...") if(prob(20)) // chance to alert the read-ee to_chat(cast_on, span_danger("You feel something foreign enter your mind.")) + log_info += "Target alerted!" 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...")) + discovered_info += "...Drifting memories of past conversations:" + var/list/speech_block = list() for(var/spoken_memory in recent_speech) - to_chat(owner, span_notice("[spoken_memory]")) + speech_block += " \"[spoken_memory]\"..." + log_info += "Recent speech: \"[spoken_memory]\"" + discovered_info += jointext(speech_block, "
") if(iscarbon(cast_on)) var/mob/living/carbon/carbon_cast_on = cast_on - to_chat(owner, span_boldnotice("You find that their intent is to [carbon_cast_on.combat_mode ? "harm" : "help"]...")) - to_chat(owner, span_boldnotice("You uncover that [carbon_cast_on.p_their()] true identity is [carbon_cast_on.mind.name].")) + discovered_info += "...Intent to [carbon_cast_on.combat_mode ? "harm" : "help"]." + discovered_info += "...True identity of [carbon_cast_on.mind.name]." + log_info += "Intent: \"[carbon_cast_on.combat_mode ? "harm" : "help"]\"" + log_info += "Identity: \"[carbon_cast_on.mind.name]\"" + + to_chat(owner, boxed_message(span_notice(jointext(discovered_info, "
")))) + log_combat(owner, cast_on, "mind read (cast intentionally)", null, "info: [english_list(log_info, and_text = ", ")]") + +/datum/action/cooldown/spell/pointed/mindread/proc/on_examining(mob/examiner, atom/examining) + SIGNAL_HANDLER + if(!isliving(examining) || examiner == examining) + return + + INVOKE_ASYNC(src, PROC_REF(read_mind), examiner, examining) + +/datum/action/cooldown/spell/pointed/mindread/proc/read_mind(mob/living/examiner, mob/living/examined) + if(examined.stat >= UNCONSCIOUS || isnull(examined.mind) || (examined.mob_biotypes & MOB_ROBOTIC)) + return + + var/antimagic = examined.can_block_magic(antimagic_flags, charge_cost = 0) + var/read_text = "" + if(!antimagic) + read_text = examined.get_typing_text() + if(!read_text) + return + + sleep(0.5 SECONDS) // small pause so it comes after all examine text and effects + if(QDELETED(examiner)) + return + if(antimagic) + to_chat(examiner, boxed_message(span_warning("You attempt to analyze [examined]'s current thoughts, but fail to penetrate [examined.p_their()] mind - It seems you've been foiled."))) + return + + var/list/log_info = list() + if(prob(10)) + to_chat(examined, span_danger("You feel something foreign enter your mind.")) + log_info += "Target alerted!" + + to_chat(examiner, boxed_message(span_notice("You analyze [examined]'s current thoughts...
 \"[read_text]\"..."))) + log_info += "Current thought: \"[read_text]\"" + + log_combat(examiner, examined, "mind read (triggered on examine)", null, "info: [english_list(log_info, and_text = ", ")]") /datum/mutation/mindreader/New(datum/mutation/copymut) ..() diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 9b92da0dbdf8..2e633fef128d 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -703,9 +703,9 @@ return // Gives you 30 seconds of being in soft crit... give or take if(HAS_TRAIT(owner, TRAIT_TOXIMMUNE) || HAS_TRAIT(owner, TRAIT_TOXINLOVER)) - owner.adjustBruteLoss(1 * seconds_per_tick * GET_MUTATION_SYNCHRONIZER(src), forced = TRUE) + owner.adjust_brute_loss(1 * seconds_per_tick * GET_MUTATION_SYNCHRONIZER(src), forced = TRUE) else - owner.adjustToxLoss(0.5 * seconds_per_tick * GET_MUTATION_SYNCHRONIZER(src), forced = TRUE) - owner.adjustBruteLoss(0.5 * seconds_per_tick * GET_MUTATION_SYNCHRONIZER(src), forced = TRUE) + owner.adjust_tox_loss(0.5 * seconds_per_tick * GET_MUTATION_SYNCHRONIZER(src), forced = TRUE) + owner.adjust_brute_loss(0.5 * seconds_per_tick * GET_MUTATION_SYNCHRONIZER(src), forced = TRUE) // Offsets suffocation but not entirely - owner.adjustOxyLoss(-0.5 * seconds_per_tick, forced = TRUE) + owner.adjust_oxy_loss(-0.5 * seconds_per_tick, forced = TRUE) diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index e2179630beb6..2649c2fcdec1 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -34,11 +34,14 @@ if(!.) return for(var/obj/item/bodypart/part as anything in owner.bodyparts) - part.add_color_override(bodypart_color, LIMB_COLOR_HULK) + if (part.bodytype & BODYTYPE_ORGANIC) + part.add_color_override(bodypart_color, LIMB_COLOR_HULK) owner.update_body_parts() owner.add_mood_event("hulk", /datum/mood_event/hulk) RegisterSignal(owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand)) RegisterSignal(owner, COMSIG_MOB_CLICKON, PROC_REF(check_swing)) + RegisterSignal(owner, COMSIG_CARBON_ATTACH_LIMB, PROC_REF(texture_limb)) + RegisterSignal(owner, COMSIG_CARBON_REMOVE_LIMB, PROC_REF(untexture_limb)) owner.add_movespeed_mod_immunities("hulk", /datum/movespeed_modifier/damage_slowdown) /datum/mutation/hulk/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, modifiers) @@ -79,6 +82,15 @@ UnregisterSignal(owner, COMSIG_MOB_CLICKON) owner.remove_movespeed_mod_immunities("hulk", /datum/movespeed_modifier/damage_slowdown) +/datum/mutation/hulk/proc/texture_limb(atom/source, obj/item/bodypart/limb) + SIGNAL_HANDLER + if (limb.bodytype & BODYTYPE_ORGANIC) + limb.add_color_override(bodypart_color, LIMB_COLOR_HULK) + +/datum/mutation/hulk/proc/untexture_limb(atom/source, obj/item/bodypart/limb) + SIGNAL_HANDLER + limb.remove_color_override(LIMB_COLOR_HULK) + /// How many steps it takes to throw the mob #define HULK_TAILTHROW_STEPS 28 @@ -184,7 +196,7 @@ if(!collateral_mob.density || collateral_mob == yeeted_person) continue - yeeted_person.adjustBruteLoss(step*0.5) + yeeted_person.adjust_brute_loss(step*0.5) playsound(collateral_mob,'sound/items/weapons/punch1.ogg',50,TRUE) log_combat(the_hulk, collateral_mob, "has smacked with tail swing victim") log_combat(the_hulk, yeeted_person, "has smacked this person into someone while tail swinging") // i have no idea how to better word this @@ -192,14 +204,14 @@ if(collateral_mob == the_hulk) // if the hulk moves wrong and crosses himself the_hulk.visible_message(span_warning("[the_hulk] smacks [the_hulk.p_them()]self with [yeeted_person]!"), span_userdanger("You end up smacking [yeeted_person] into yourself!"), ignored_mobs = yeeted_person) to_chat(yeeted_person, span_userdanger("[the_hulk] smacks you into [the_hulk.p_them()]self, turning you free!")) - the_hulk.adjustBruteLoss(step) + the_hulk.adjust_brute_loss(step) return yeeted_person.visible_message(span_warning("[the_hulk] swings [yeeted_person] directly into [collateral_mob], sending [collateral_mob.p_them()] flying!"), \ span_userdanger("You're smacked into [collateral_mob]!"), ignored_mobs = collateral_mob) to_chat(collateral_mob, span_userdanger("[the_hulk] swings [yeeted_person] directly into you, sending you flying!")) - collateral_mob.adjustBruteLoss(step*0.5) + collateral_mob.adjust_brute_loss(step*0.5) collateral_mob.throw_at(collat_throw_target, round(step * 0.25) + 1, round(step * 0.25) + 1) step -= 5 delay += 5 @@ -261,6 +273,7 @@ TRAIT_PUSHIMMUNE, TRAIT_STUNIMMUNE, TRAIT_ANALGESIA, + TRAIT_NO_OXYLOSS_PASSOUT, ) // fight till your last breath /datum/mutation/hulk/superhuman/on_life(seconds_per_tick, times_fired) diff --git a/code/datums/mutations/reach.dm b/code/datums/mutations/reach.dm index e5757346f9b9..24f2d5d37e85 100644 --- a/code/datums/mutations/reach.dm +++ b/code/datums/mutations/reach.dm @@ -53,15 +53,16 @@ . = ..() if(!.) return - RegisterSignal(homan, COMSIG_ATOM_CANREACH, PROC_REF(on_canreach)) RegisterSignal(homan, COMSIG_LIVING_TRY_PUT_IN_HAND, PROC_REF(on_owner_equipping_item)) RegisterSignal(homan, COMSIG_LIVING_TRY_PULL, PROC_REF(on_owner_try_pull)) + homan.reach_length++ /datum/mutation/elastic_arms/on_losing(mob/living/carbon/human/homan) . = ..() if(.) return - UnregisterSignal(homan, list(COMSIG_ATOM_CANREACH, COMSIG_LIVING_TRY_PUT_IN_HAND, COMSIG_LIVING_TRY_PULL)) + UnregisterSignal(homan, list(COMSIG_LIVING_TRY_PUT_IN_HAND, COMSIG_LIVING_TRY_PULL)) + homan.reach_length = min(1, homan.reach_length - 1) /// signal sent when prompting if an item can be equipped /datum/mutation/elastic_arms/proc/on_owner_equipping_item(mob/living/carbon/human/owner, obj/item/pick_item) @@ -83,30 +84,3 @@ if(item_target.w_class > WEIGHT_CLASS_BULKY) item_target.balloon_alert(owner, "arms too floppy to pull this!") return COMSIG_LIVING_CANCEL_PULL - -// probably buggy. let's enlist our players as bug testers -/datum/mutation/elastic_arms/proc/on_canreach(mob/source, atom/target) - SIGNAL_HANDLER - - var/distance = get_dist(target, source) - - // We only care about handling the reach distance, anything closer or further is handled normally. - // Also, no z-level shenanigans. Yet. - if((distance != 2) || source.z != target.z) - return - - var/direction = get_dir(source, target) - if(!direction) - return - var/turf/open/adjacent_turf = get_step(source, direction) - - // Make sure it's an open turf we're trying to pass over. - if(!istype(adjacent_turf)) - return - - // Check if there's something dense inbetween, then allow it. - for(var/atom/thing in adjacent_turf) - if(thing.density) - return - - return COMPONENT_ALLOW_REACH diff --git a/code/datums/mutations/sight.dm b/code/datums/mutations/sight.dm index 3bbf1a1f2e6b..c618f1f0a339 100644 --- a/code/datums/mutations/sight.dm +++ b/code/datums/mutations/sight.dm @@ -107,7 +107,7 @@ if(iscarbon(cast_on)) var/mob/living/carbon/carbon_cast_on = cast_on - carbon_cast_on.adjustOrganLoss(ORGAN_SLOT_EYES, eye_damage) + carbon_cast_on.adjust_organ_loss(ORGAN_SLOT_EYES, eye_damage) ///X-ray Vision lets you see through walls. /datum/mutation/xray diff --git a/code/datums/mutations/touch.dm b/code/datums/mutations/touch.dm index 6ffcc79e8d67..ba24f4f30bc4 100644 --- a/code/datums/mutations/touch.dm +++ b/code/datums/mutations/touch.dm @@ -220,9 +220,9 @@ . = FALSE // Damage to heal - var/brute_to_heal = min(hurtguy.getBruteLoss(), 35 * heal_multiplier) + var/brute_to_heal = min(hurtguy.get_brute_loss(), 35 * heal_multiplier) // no double dipping - var/burn_to_heal = min(hurtguy.getFireLoss(), (35 - brute_to_heal) * heal_multiplier) + var/burn_to_heal = min(hurtguy.get_fire_loss(), (35 - brute_to_heal) * heal_multiplier) // Get at least organic limb to transfer the damage to var/list/mendicant_organic_limbs = list() @@ -241,11 +241,11 @@ mendicant_transfer_limb.receive_damage(brute_to_heal * pain_multiplier, burn_to_heal * pain_multiplier, forced = TRUE, wound_bonus = CANT_WOUND) if(brute_to_heal) - hurtguy.adjustBruteLoss(-brute_to_heal) + hurtguy.adjust_brute_loss(-brute_to_heal) . = TRUE if(burn_to_heal) - hurtguy.adjustFireLoss(-burn_to_heal) + hurtguy.adjust_fire_loss(-burn_to_heal) . = TRUE if(!.) @@ -306,49 +306,43 @@ iter_wound.remove_wound() iter_wound.apply_wound(mendicant_transfer_limb) - if(HAS_TRAIT(mendicant, TRAIT_NOBLOOD)) + if(!CAN_HAVE_BLOOD(mendicant) || !CAN_HAVE_BLOOD(hurtguy)) return . // 10% base var/max_blood_transfer = (BLOOD_VOLUME_NORMAL * 0.10) * heal_multiplier // Too little blood - if(hurtguy.blood_volume < BLOOD_VOLUME_NORMAL) - var/max_blood_to_hurtguy = min(mendicant.blood_volume, BLOOD_VOLUME_NORMAL - hurtguy.blood_volume) - var/blood_to_hurtguy = min(max_blood_transfer, max_blood_to_hurtguy) - if(!blood_to_hurtguy) - return . - + if(hurtguy.get_blood_volume() < BLOOD_VOLUME_NORMAL) // We ignore incompatibility here. - if(!mendicant.transfer_blood_to(hurtguy, blood_to_hurtguy, forced = TRUE, ignore_incompatibility = TRUE)) + var/blood_transferred = mendicant.transfer_blood_to(hurtguy, max_blood_transfer, ignore_low_blood = TRUE, ignore_incompatibility = TRUE) + + if(!blood_transferred) return to_chat(mendicant, span_notice("Your veins (and brain) feel a bit lighter.")) . = TRUE // Because we do our own spin on it! if(hurtguy.get_blood_compatibility(mendicant) == FALSE) - hurtguy.adjustToxLoss((blood_to_hurtguy * 0.1) * pain_multiplier) // 1 dmg per 10 blood + hurtguy.adjust_tox_loss((blood_transferred * 0.1) * pain_multiplier) // 1 dmg per 10 blood to_chat(hurtguy, span_notice("Your veins feel thicker, but they itch a bit.")) else to_chat(hurtguy, span_notice("Your veins feel thicker!")) return - if(hurtguy.blood_volume < BLOOD_VOLUME_MAXIMUM) + if(hurtguy.get_blood_volume() < BLOOD_VOLUME_EXCESS) return - // Too MUCH blood - var/max_blood_to_mendicant = BLOOD_VOLUME_EXCESS - hurtguy.blood_volume - var/blood_to_mendicant = min(max_blood_transfer, max_blood_to_mendicant) - // mender always gonna have blood - // We ignore incompatibility here. - if(!hurtguy.transfer_blood_to(mendicant, hurtguy.blood_volume - BLOOD_VOLUME_EXCESS, forced = TRUE, ignore_incompatibility = TRUE)) + var/blood_received = hurtguy.transfer_blood_to(mendicant, hurtguy.get_blood_volume() - BLOOD_VOLUME_EXCESS, ignore_incompatibility = TRUE) + + if(!blood_received) return to_chat(hurtguy, span_notice("Your veins don't feel quite so swollen anymore.")) . = TRUE // Because we do our own spin on it! if(mendicant.get_blood_compatibility(hurtguy) == FALSE) - mendicant.adjustToxLoss((blood_to_mendicant * 0.1) * pain_multiplier) // 1 dmg per 10 blood + mendicant.adjust_tox_loss((blood_received * 0.1) * pain_multiplier) // 1 dmg per 10 blood to_chat(mendicant, span_notice("Your veins swell and itch!")) else to_chat(mendicant, span_notice("Your veins swell!")) @@ -356,6 +350,8 @@ /datum/action/cooldown/spell/touch/lay_on_hands/proc/determine_if_this_hurts_instead(mob/living/carbon/mendicant, mob/living/hurtguy) + var/hurtguy_smiteable = SEND_SIGNAL(hurtguy, COMSIG_ON_LAY_ON_HANDS, mendicant) + if(hurtguy.mob_biotypes & MOB_UNDEAD && mendicant.mob_biotypes & MOB_UNDEAD) return FALSE //always return false if we're both undead //undead solidarity @@ -365,10 +361,9 @@ if(HAS_TRAIT(hurtguy, TRAIT_EVIL) && !HAS_TRAIT(mendicant, TRAIT_EVIL)) //Is the guy evil and we're not evil? If so, hurt. return TRUE - if(!(hurtguy.mob_biotypes & MOB_UNDEAD) && HAS_TRAIT(hurtguy, TRAIT_EMPATH) && HAS_TRAIT(mendicant, TRAIT_EVIL)) //Is the guy not undead, they're an empath and we're evil? If so, hurt. + if(hurtguy_smiteable) //Is some other property of the target (like the empath component) causing them to be smited? If so, hurt. return TRUE - - return FALSE + return (FALSE) ///If our target was undead or evil, we blast them with a firey beam rather than healing them. For, you know, 'holy' reasons. When did genes become so morally uptight? diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 1badba3f160a..007f7a26daa9 100644 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -24,20 +24,20 @@ var/id_trim = null /// Type path of item to go in uniform slot - var/uniform = null + var/obj/item/uniform = null /// Type path of item to go in suit slot - var/suit = null + var/obj/item/suit = null /** * Type path of item to go in suit storage slot * * (make sure it's valid for that suit) */ - var/suit_store = null + var/obj/item/suit_store = null /// Type path of item to go in back slot - var/back = null + var/obj/item/back = null /** * list of items that should go in the backpack of the user @@ -47,7 +47,7 @@ var/list/backpack_contents = null /// Type path of item to go in belt slot - var/belt = null + var/obj/item/belt = null /** * list of items that should go in the belt of the user @@ -505,7 +505,7 @@ for(var/item in beltpack) var/itype = text2path(item) if(itype) - belt_contents[itype] = belt[item] + belt_contents[itype] = beltpack[item] box = text2path(outfit_data["box"]) var/list/impl = outfit_data["implants"] implants = list() diff --git a/code/datums/personality/_personality.dm b/code/datums/personality/_personality.dm new file mode 100644 index 000000000000..e5dc2da50562 --- /dev/null +++ b/code/datums/personality/_personality.dm @@ -0,0 +1,100 @@ +/** + * ## Personality Singleton + * + * Contains information about a personaility. + * + * A personality is designed to be a small modifier to the way a mob reacts to moodlets or world events. + * + * For example, a mob with the Callous personality would not receive a positive moodlet for saving someone's life. + * + * They're not meant to be full blown quirks that hold state and such. + * If you NEED state, consider making a quirk, or moving your behavior into a component the personality applies. + */ +/datum/personality + /// Required: Name of the personality + var/name + /// Required: Description of the personality. + /// Phrased to be "In character" - i.e. "I like to help people!" + /// Rather than OOC 0 i.e. "When helping people, I get a positive moodlet." + var/desc + /// Optional: Short blurb on what positive effects this personality has on gameplay, for ui + var/pos_gameplay_desc + /// Optional: Short blurb on what negative effects this personality has on gameplay, for ui + var/neg_gameplay_desc + /// Optional: Short blurb on what neutral effects this personality has on gameplay, for ui + var/neut_gameplay_desc + /// Easy way to apply a trait as a part of a personality. + var/personality_trait + /// Required: The key to use when saving this personality to a savefile. + /// Don't change it once it's set unless you want to write migration code + var/savefile_key + /// What groups does this personality belong to? + /// Personalities in the same group are mutually exclusive. + var/list/groups + /// Does this personality need to process every tick? + /// If true, you'll need to override on_tick() with logic + var/processes = FALSE + +/datum/personality/New() + . = ..() + if(processes) + SSpersonalities.processing_personalities[src] = list() + START_PROCESSING(SSpersonalities, src) + +/datum/personality/Destroy(force) + if(force) + STOP_PROCESSING(SSpersonalities, src) + SSpersonalities.processing_personalities -= src + SSpersonalities.personalities_by_type -= type + SSpersonalities.personalities_by_key -= savefile_key + return ..() + + stack_trace("qdel called on a personality singleton!") + return QDEL_HINT_LETMELIVE + +/** + * Called when applying this personality to a mob. + * + * * who - The mob to apply this personality to. + * This mob is asserted to have `mob_mood`. + */ +/datum/personality/proc/apply_to_mob(mob/living/who) + SHOULD_CALL_PARENT(TRUE) + if(personality_trait) + ADD_TRAIT(who, personality_trait, PERSONALITY_TRAIT) + LAZYSET(who.personalities, type, TRUE) + if(processes) + SSpersonalities.processing_personalities[src] += who + +/** + * Called when removing this personality from a mob. + * + * This is not called as a part of the mob being deleted. + * + * * who - The mob to remove this personality from. + * This mob is asserted to have `mob_mood`. + */ +/datum/personality/proc/remove_from_mob(mob/living/who) + SHOULD_CALL_PARENT(TRUE) + if(personality_trait) + REMOVE_TRAIT(who, personality_trait, PERSONALITY_TRAIT) + LAZYREMOVE(who.personalities, type) + if(processes) + SSpersonalities.processing_personalities[src] -= who + +/datum/personality/process(seconds_per_tick) + for(var/mob/living/subject as anything in SSpersonalities.processing_personalities[src]) + if(subject.stat >= UNCONSCIOUS || HAS_TRAIT(subject, TRAIT_NO_TRANSFORM)) + continue + if(on_tick(subject, seconds_per_tick) != PROCESS_KILL) + continue + stack_trace("Personality [type] processed but did not override on_tick().") + SSpersonalities.processing_personalities -= src // stop tracking if we're done processing + return PROCESS_KILL + + return null + +/// Called every SSpersonality tick if `processes` is TRUE. +/// Don't call parent if you override this, that's for error checking +/datum/personality/proc/on_tick(mob/living/subject, seconds_per_tick) + return PROCESS_KILL diff --git a/code/datums/personality/_personality_groups.dm b/code/datums/personality/_personality_groups.dm new file mode 100644 index 000000000000..efc5b1bab7c7 --- /dev/null +++ b/code/datums/personality/_personality_groups.dm @@ -0,0 +1,41 @@ +// These defines are for indicating incompatible personalities by group + +/// General Modification to moodlet length +#define PERSONALITY_GROUP_MOOD_LENGTH "reaction_to_thought" +/// General modification to moodlet power +#define PERSONALITY_GROUP_MOOD_POWER "general_reaction" + +/// Changes how the person views death +#define PERSONALITY_GROUP_DEATH "reaction_to_death" +/// Changes how the person feels when generally afraid +#define PERSONALITY_GROUP_GENERAL_FEAR "reaction_to_fear" +/// Are we afraid of other people specifically +#define PERSONALITY_GROUP_PEOPLE_FEAR "reaction_to_fear_others" +/// Preferred department / job location +#define PERSONALITY_GROUP_DEPARTMENT "reaction_to_department" +/// Changes how the person views animals, specific or general +#define PERSONALITY_GROUP_ANIMALS "reaction_to_animals" +/// How they view Nanotrasen itself +#define PERSONALITY_GROUP_NT "reaction_to_nt" +/// Opinion of other crewmembers +#define PERSONALITY_GROUP_OTHERS "reaction_to_others" +/// What type of interactions they prefer +#define PERSONALITY_GROUP_INTERACTION "reaction_to_interaction" +/// How they feel about slacking off +#define PERSONALITY_GROUP_RECREATION "reaction_to_recreation" +/// How they feel about the opposite of slacking off +#define PERSONALITY_GROUP_WORK "reaction_to_work" +/// Changes how they react to imbibing alcohol +#define PERSONALITY_GROUP_ALCOHOL "reaction_to_alcohol" +/// Modifies moodlets from food +#define PERSONALITY_GROUP_FOOD "reaction_to_food" +/// How hopeful vs pessimistic they are +#define PERSONALITY_GROUP_HOPE "reaction_to_hope" +/// Specifically how they feel about humanity +#define PERSONALITY_GROUP_MISANTHROPY "reaction_to_misanthropy" +/// Whether they enjoy working out or not +#define PERSONALITY_GROUP_ATHLETICS "reaction_to_athletics" +/// Whether they enjoy art out or not +#define PERSONALITY_GROUP_ART "reaction_to_art" +/// Whether they enjoy reading out or not +#define PERSONALITY_GROUP_READING "reaction_to_reading" diff --git a/code/datums/personality/personality_preference.dm b/code/datums/personality/personality_preference.dm new file mode 100644 index 000000000000..b33fe3818068 --- /dev/null +++ b/code/datums/personality/personality_preference.dm @@ -0,0 +1,46 @@ +/datum/preference/personality + savefile_key = "personalities" + savefile_identifier = PREFERENCE_CHARACTER + can_randomize = TRUE + randomize_by_default = FALSE + +/datum/preference/personality/apply_to_human(mob/living/carbon/human/target, value) + if(isdummy(target) || !ishuman(target) || isnull(target.mob_mood)) + return + if(CONFIG_GET(flag/disable_human_mood) || !CONFIG_GET(flag/roundstart_traits)) + return + for(var/personality_key in value) + var/datum/personality/personality = SSpersonalities.personalities_by_key[personality_key] + personality.apply_to_mob(target) + +/datum/preference/personality/is_valid(value) + return islist(value) || isnull(value) + +/datum/preference/personality/deserialize(input, datum/preferences/preferences) + if(!LAZYLEN(input)) + return null + + if(!SSpersonalities.initialized) + SSpersonalities.init_personalities() + + var/list/input_sanitized + for(var/personality_key in input) + var/datum/personality/personality = SSpersonalities.personalities_by_key[personality_key] + if(!istype(personality)) + continue + if(SSpersonalities.is_incompatible(input_sanitized, personality.type)) + continue + if(LAZYLEN(input_sanitized) >= CONFIG_GET(number/max_personalities)) + break + LAZYADD(input_sanitized, personality_key) + + return input_sanitized + +/datum/preference/personality/create_default_value() + return null + +/datum/preference/personality/create_random_value(datum/preferences/preferences) + var/list/random_personalities + for(var/datum/personality/personality_type as anything in SSpersonalities.select_random_personalities()) + LAZYADD(random_personalities, initial(personality_type.savefile_key)) + return random_personalities diff --git a/code/datums/personality/reaction_generic.dm b/code/datums/personality/reaction_generic.dm new file mode 100644 index 000000000000..e0dd27abdeb6 --- /dev/null +++ b/code/datums/personality/reaction_generic.dm @@ -0,0 +1,102 @@ +/datum/personality/apathetic + savefile_key = "apathetic" + name = "Apathetic" + desc = "I don't care about much. Not the good, nor the bad, and certainly not the ugly." + neut_gameplay_desc = "All moodlets affect you less" + groups = list(PERSONALITY_GROUP_MOOD_POWER) + +/datum/personality/apathetic/apply_to_mob(mob/living/who) + . = ..() + who.mob_mood?.mood_modifier -= 0.2 + +/datum/personality/apathetic/remove_from_mob(mob/living/who) + . = ..() + who.mob_mood?.mood_modifier += 0.2 + +/datum/personality/sensitive + savefile_key = "sensitive" + name = "Sensitive" + desc = "I am easily influenced by the world around me." + neut_gameplay_desc = "All moodlets affect you more" + groups = list(PERSONALITY_GROUP_MOOD_POWER) + +/datum/personality/sensitive/apply_to_mob(mob/living/who) + . = ..() + who.mob_mood?.mood_modifier += 0.2 + +/datum/personality/sensitive/remove_from_mob(mob/living/who) + . = ..() + who.mob_mood?.mood_modifier -= 0.2 + +/datum/personality/resilient + savefile_key = "resilient" + name = "Resilient" + desc = "It's whatever. I can take it!" + pos_gameplay_desc = "Negative moodlets expire faster" + groups = list(PERSONALITY_GROUP_MOOD_LENGTH) + +/datum/personality/resilient/apply_to_mob(mob/living/who) + . = ..() + who.mob_mood?.negative_moodlet_length_modifier -= 0.2 + +/datum/personality/resilient/remove_from_mob(mob/living/who) + . = ..() + who.mob_mood?.negative_moodlet_length_modifier += 0.2 + +/datum/personality/brooding + savefile_key = "brooding" + name = "Brooding" + desc = "Everything gets to me and I can't help but think about it." + neg_gameplay_desc = "Negative moodlets last longer" + groups = list(PERSONALITY_GROUP_MOOD_LENGTH) + +/datum/personality/brooding/apply_to_mob(mob/living/who) + . = ..() + who.mob_mood?.negative_moodlet_length_modifier += 0.2 + +/datum/personality/brooding/remove_from_mob(mob/living/who) + . = ..() + who.mob_mood?.negative_moodlet_length_modifier -= 0.2 + +/datum/personality/hopeful + savefile_key = "hopeful" + name = "Hopeful" + desc = "I believe things will always get better." + pos_gameplay_desc = "Positive moodlets last longer" + groups = list(PERSONALITY_GROUP_HOPE) + +/datum/personality/hopeful/apply_to_mob(mob/living/who) + . = ..() + who.mob_mood?.positive_moodlet_length_modifier += 0.2 + +/datum/personality/hopeful/remove_from_mob(mob/living/who) + . = ..() + who.mob_mood?.positive_moodlet_length_modifier -= 0.2 + +/datum/personality/pessimistic + savefile_key = "pessimistic" + name = "Pessimistic" + desc = "I believe our best days are behind us." + neg_gameplay_desc = "Positive moodlets last shorter" + groups = list(PERSONALITY_GROUP_HOPE) + +/datum/personality/pessimistic/apply_to_mob(mob/living/who) + . = ..() + who.mob_mood?.positive_moodlet_length_modifier -= 0.2 + +/datum/personality/pessimistic/remove_from_mob(mob/living/who) + . = ..() + who.mob_mood?.positive_moodlet_length_modifier += 0.2 + +/datum/personality/whimsical + savefile_key = "whimsical" + name = "Whimsical" + desc = "This station is too serious sometimes, lighten up!" + pos_gameplay_desc = "Likes ostensibly pointless but silly things, and does not mind clownish pranks" + +/datum/personality/snob + savefile_key = "snob" + name = "Snobbish" + desc = "I expect only the best out of this station - anything less is unacceptable!" + neut_gameplay_desc = "Room quality affects your mood" + personality_trait = TRAIT_SNOB diff --git a/code/datums/personality/reaction_to_animals.dm b/code/datums/personality/reaction_to_animals.dm new file mode 100644 index 000000000000..2d3589c50a79 --- /dev/null +++ b/code/datums/personality/reaction_to_animals.dm @@ -0,0 +1,30 @@ +/datum/personality/animal_friend + savefile_key = "animal_friend" + name = "Animal Friend" + desc = "I love animals! They'll never leave my side." + pos_gameplay_desc = "Likes being around pets" + neg_gameplay_desc = "Seeing a pet's death affects your mood more" + groups = list(PERSONALITY_GROUP_ANIMALS) + +/datum/personality/cat_fan + savefile_key = "cat_fan" + name = "Cat Person" + desc = "Cats are so cute!" + pos_gameplay_desc = "Likes being around cats" + neg_gameplay_desc = "Dislikes being around dogs" + groups = list(PERSONALITY_GROUP_ANIMALS) + +/datum/personality/dog_fan + savefile_key = "dog_fan" + name = "Dog Person" + desc = "Dogs are the best!" + pos_gameplay_desc = "Likes being around dogs" + neg_gameplay_desc = "Dislikes being around cats" + groups = list(PERSONALITY_GROUP_ANIMALS) + +/datum/personality/animal_disliker + savefile_key = "animal_disliker" + name = "Animal Averse" + desc = "We can barely survive on this station, and you want to keep a pet?" + neg_gameplay_desc = "Dislikes being around pets" + groups = list(PERSONALITY_GROUP_ANIMALS) diff --git a/code/datums/personality/reaction_to_art.dm b/code/datums/personality/reaction_to_art.dm new file mode 100644 index 000000000000..ed4fb8ecd046 --- /dev/null +++ b/code/datums/personality/reaction_to_art.dm @@ -0,0 +1,13 @@ +/datum/personality/creative + savefile_key = "creative" + name = "Creative" + desc = "I like expressing myself, especially in a chaotic place like this." + pos_gameplay_desc = "Likes making and seeing art or playing music" + groups = list(PERSONALITY_GROUP_ART) + +/datum/personality/unimaginative + savefile_key = "unimaginative" + name = "Unimaginative" + desc = "I'm not good at thinking outside the box. The box is there for a reason." + neg_gameplay_desc = "Ignores art or music and dislikes making new art" + groups = list(PERSONALITY_GROUP_ART) diff --git a/code/datums/personality/reaction_to_fear.dm b/code/datums/personality/reaction_to_fear.dm new file mode 100644 index 000000000000..c9eeed5f8b37 --- /dev/null +++ b/code/datums/personality/reaction_to_fear.dm @@ -0,0 +1,13 @@ +/datum/personality/brave + savefile_key = "brave" + name = "Brave" + desc = "It'll take a lot more than a little blood to scare me." + pos_gameplay_desc = "Accumulate fear slower, and moodlets related to fear are weaker" + groups = list(PERSONALITY_GROUP_GENERAL_FEAR, PERSONALITY_GROUP_PEOPLE_FEAR) + +/datum/personality/cowardly + savefile_key = "cowardly" + name = "Cowardly" + desc = "Everything is a danger around here! Even the air!" + neg_gameplay_desc = "Accumulate fear faster, and moodlets related to fear are stronger" + groups = list(PERSONALITY_GROUP_GENERAL_FEAR) diff --git a/code/datums/personality/reaction_to_food.dm b/code/datums/personality/reaction_to_food.dm new file mode 100644 index 000000000000..aedc30d82685 --- /dev/null +++ b/code/datums/personality/reaction_to_food.dm @@ -0,0 +1,29 @@ +/datum/personality/ascetic + savefile_key = "ascetic" + name = "Ascetic" + desc = "I don't care much for luxurious foods - It's all fuel for the body." + pos_gameplay_desc = "Sorrow from eating disliked food is reduced" + neg_gameplay_desc = "Enjoyment from eating liked food is limited" + groups = list(PERSONALITY_GROUP_FOOD) + +/datum/personality/gourmand + savefile_key = "gourmand" + name = "Gourmand" + desc = "Food means everything to me!" + pos_gameplay_desc = "Enjoyment from eating liked food is strengthened" + neg_gameplay_desc = "Sadness from eating food you dislike is increased, and mediocre food is less enjoyable" + groups = list(PERSONALITY_GROUP_FOOD) + +/datum/personality/teetotal + savefile_key = "teetotal" + name = "Teetotaler" + desc = "Alcohol isn't for me." + neg_gameplay_desc = "Dislikes drinking alcohol" + groups = list(PERSONALITY_GROUP_ALCOHOL) + +/datum/personality/bibulous + savefile_key = "bibulous" + name = "Bibulous" + desc = "I'll always go for another round of drinks!" + pos_gameplay_desc = "Fulfillment from drinking lasts longer, even after you are no longer drunk" + groups = list(PERSONALITY_GROUP_ALCOHOL) diff --git a/code/datums/personality/reaction_to_groups.dm b/code/datums/personality/reaction_to_groups.dm new file mode 100644 index 000000000000..825ce6ca14df --- /dev/null +++ b/code/datums/personality/reaction_to_groups.dm @@ -0,0 +1,56 @@ +/datum/personality/introvert + savefile_key = "introvert" + name = "Introverted" + desc = "I prefer to be alone, reading or painting in the library." + pos_gameplay_desc = "Likes being in the library" + // neg_gameplay_desc = "Dislikes large groups" + personality_trait = TRAIT_INTROVERT + groups = list(PERSONALITY_GROUP_INTERACTION) + +/datum/personality/extrovert + savefile_key = "extrovert" + name = "Extroverted" + desc = "I prefer to be surrounded by people, having a drink at the Bar." + pos_gameplay_desc = "Likes being in the bar" + // neg_gameplay_desc = "Dislikes being alone" + personality_trait = TRAIT_EXTROVERT + groups = list(PERSONALITY_GROUP_INTERACTION, PERSONALITY_GROUP_OTHERS) + +/datum/personality/paranoid + savefile_key = "paranoid" + name = "Paranoid" + desc = "Everyone and everything is out to get me! This place is a deathtrap!" + pos_gameplay_desc = "Likes being alone or in moderately-sized groups" + neg_gameplay_desc = "Stressed when with one other person, or in large groups" + processes = TRUE + groups = list(PERSONALITY_GROUP_PEOPLE_FEAR) + +/datum/personality/paranoid/remove_from_mob(mob/living/who) + . = ..() + who.clear_mood_event("paranoia_personality") + +/datum/personality/paranoid/on_tick(mob/living/subject, seconds_per_tick) + var/list/nearby_people = list() + for(var/mob/living/carbon/human/nearby in view(subject, 5)) + if(nearby == subject || !is_dangerous_mob(subject, nearby)) + continue + nearby_people += nearby + + switch(length(nearby_people)) + if(0) + subject.add_mood_event("paranoia_personality", /datum/mood_event/paranoid/alone) + if(1) + subject.add_mood_event("paranoia_personality", /datum/mood_event/paranoid/one_on_one) + if(2 to 6) // 6 people is roughly the size of the larger jobs like meddoc or secoff + subject.add_mood_event("paranoia_personality", /datum/mood_event/paranoid/small_group) + else + subject.add_mood_event("paranoia_personality", /datum/mood_event/paranoid/large_group) + +/datum/personality/paranoid/proc/is_dangerous_mob(mob/living/subject, mob/living/carbon/human/target) + if(target.stat >= UNCONSCIOUS) + return FALSE + if(target.invisibility > subject.see_invisible || target.alpha < 20) + return FALSE + // things that are threatening: other players + // things that are also threatening: monkeys + return TRUE diff --git a/code/datums/personality/reaction_to_job.dm b/code/datums/personality/reaction_to_job.dm new file mode 100644 index 000000000000..3ebc5f75631f --- /dev/null +++ b/code/datums/personality/reaction_to_job.dm @@ -0,0 +1,45 @@ +/datum/personality/department + groups = list(PERSONALITY_GROUP_DEPARTMENT) + /// List of areas this personality applies to + var/list/applicable_areas + +/datum/personality/department/apply_to_mob(mob/living/who) + . = ..() + RegisterSignals(who, list(COMSIG_MOB_MIND_TRANSFERRED_INTO, COMSIG_MOB_MIND_SET_ROLE), PROC_REF(update_effect)) + // Unfortunate side effect here in that IC job changes, IE HoP are missed + who.apply_status_effect(/datum/status_effect/moodlet_in_area, /datum/mood_event/enjoying_department_area, applicable_areas & who.mind?.get_work_areas()) + +/datum/personality/department/remove_from_mob(mob/living/who) + . = ..() + UnregisterSignal(who, list(COMSIG_MOB_MIND_TRANSFERRED_INTO, COMSIG_MOB_MIND_SET_ROLE)) + who.remove_status_effect(/datum/status_effect/moodlet_in_area, /datum/mood_event/enjoying_department_area) + +/// Signal handler to update our status effect when our job changes +/datum/personality/department/proc/update_effect(mob/living/source, ...) + SIGNAL_HANDLER + + source.remove_status_effect(/datum/status_effect/moodlet_in_area, /datum/mood_event/enjoying_department_area) + source.apply_status_effect(/datum/status_effect/moodlet_in_area, /datum/mood_event/enjoying_department_area, applicable_areas & source.mind.get_work_areas()) + +/datum/personality/department/analytical + savefile_key = "analytical" + name = "Analytical" + desc = "When it comes to making decisions, I tend to be more impersonal." + neut_gameplay_desc = "Prefers working in systemic environments like engineering, research, or medical" + applicable_areas = list( + /datum/job_department/engineering::primary_work_area, + /datum/job_department/science::primary_work_area, + /datum/job_department/medical::primary_work_area, + ) + +/datum/personality/department/impulsive + savefile_key = "impulsive" + name = "Impulsive" + desc = "I'm better making stuff up as I go along." + neut_gameplay_desc = "Prefers working in social environments like cargo, command, security, or service" + applicable_areas = list( + /datum/job_department/cargo::primary_work_area, + /datum/job_department/command::primary_work_area, + /datum/job_department/security::primary_work_area, + /datum/job_department/service::primary_work_area, + ) diff --git a/code/datums/personality/reaction_to_nt.dm b/code/datums/personality/reaction_to_nt.dm new file mode 100644 index 000000000000..b5c2d6fff320 --- /dev/null +++ b/code/datums/personality/reaction_to_nt.dm @@ -0,0 +1,38 @@ +/datum/personality/nt + groups = list(PERSONALITY_GROUP_NT) + processes = TRUE + /// What mood event to apply when seeing NT propaganda + var/mood_event_type + +/datum/personality/nt/proc/can_see_nt_propaganda(mob/living/subject) + for(var/obj/structure/sign/nearby in view(subject, 5)) + if(istype(nearby, /obj/structure/sign/nanotrasen)) + return TRUE + if(istype(nearby, /obj/structure/sign/poster/official/nanotrasen_logo)) + return TRUE + + return FALSE + +/datum/personality/nt/on_tick(mob/living/subject, seconds_per_tick) + if(can_see_nt_propaganda(subject)) + subject.add_mood_event("nt_personality", mood_event_type) + else + subject.clear_mood_event("nt_personality") + +/datum/personality/nt/remove_from_mob(mob/living/who) + . = ..() + who.clear_mood_event("nt_personality") + +/datum/personality/nt/loyalist + savefile_key = "loyalist" + name = "Loyal" + desc = "I believe in the station and in Central Command, till the very end!" + pos_gameplay_desc = "Likes company posters and signs" + mood_event_type = /datum/mood_event/nt_loyalist + +/datum/personality/nt/disillusioned + savefile_key = "disillusioned" + name = "Disillusioned" + desc = "Nanotrasen isn't what it used to be. This isn't what I signed up for." + neg_gameplay_desc = "Dislikes company posters and signs" + mood_event_type = /datum/mood_event/nt_disillusioned diff --git a/code/datums/personality/reaction_to_others.dm b/code/datums/personality/reaction_to_others.dm new file mode 100644 index 000000000000..2f7506f9315f --- /dev/null +++ b/code/datums/personality/reaction_to_others.dm @@ -0,0 +1,66 @@ +/datum/personality/callous + savefile_key = "callous" + name = "Callous" + desc = "I don't care much about what happens to other people." + pos_gameplay_desc = "Does not mind seeing death" + neg_gameplay_desc = "Prefers not to help people" + groups = list(PERSONALITY_GROUP_DEATH) + +/datum/personality/compassionate + savefile_key = "compassionate" + name = "Compassionate" + desc = "I like giving a hand to those in need." + pos_gameplay_desc = "Likes helping people" + neg_gameplay_desc = "Seeing death affects your mood more" + groups = list(PERSONALITY_GROUP_DEATH, PERSONALITY_GROUP_MISANTHROPY) + +/datum/personality/empathetic + savefile_key = "empathetic" + name = "Empathetic" // according to google "empathic" means you understand other people, while "empathetic" means you feel what they feel + desc = "Other people's feelings are important to me." + pos_gameplay_desc = "Likes seeing other people happy" + neg_gameplay_desc = "Dislikes seeing other people sad" + groups = list(PERSONALITY_GROUP_OTHERS) + +/datum/personality/misanthropic + savefile_key = "misanthropic" + name = "Misanthropic" + desc = "We should have never entered the stars." + pos_gameplay_desc = "Likes seeing other people sad" + neg_gameplay_desc = "Dislikes seeing other people happy" + groups = list(PERSONALITY_GROUP_OTHERS, PERSONALITY_GROUP_MISANTHROPY) + +/datum/personality/aloof + savefile_key = "aloof" + name = "Aloof" + desc = "Why is everyone so touchy? I'd rather be left alone." + neg_gameplay_desc = "Dislikes being grabbed, touched, or hugged" + personality_trait = TRAIT_BADTOUCH + +/datum/personality/aloof/apply_to_mob(mob/living/who) + . = ..() + RegisterSignals(who, list(COMSIG_LIVING_GET_PULLED, COMSIG_CARBON_HELP_ACT), PROC_REF(uncomfortable_touch)) + +/datum/personality/aloof/remove_from_mob(mob/living/who) + . = ..() + UnregisterSignal(who, list(COMSIG_LIVING_GET_PULLED, COMSIG_CARBON_HELP_ACT)) + +/// Causes a negative moodlet to our quirk holder on signal +/datum/personality/aloof/proc/uncomfortable_touch(mob/living/source) + SIGNAL_HANDLER + + if(source.stat == DEAD) + return + + new /obj/effect/temp_visual/annoyed(source.loc) + if(source.mob_mood.sanity <= SANITY_NEUTRAL) + source.add_mood_event("bad_touch", /datum/mood_event/very_bad_touch) + else + source.add_mood_event("bad_touch", /datum/mood_event/bad_touch) + +/datum/personality/aromantic + savefile_key = "aromantic" + name = "Aromantic" + desc = "Romance has no place on the station." + neg_gameplay_desc = "Dislikes kisses and hugs" + personality_trait = TRAIT_BADTOUCH diff --git a/code/datums/personality/reaction_to_recreation.dm b/code/datums/personality/reaction_to_recreation.dm new file mode 100644 index 000000000000..49bd1be3db3d --- /dev/null +++ b/code/datums/personality/reaction_to_recreation.dm @@ -0,0 +1,109 @@ +/datum/personality/gambler + savefile_key = "gambler" + name = "Gambler" + desc = "Throwing the dice is always worth it!" + pos_gameplay_desc = "Likes gambling and card games, and content with losing when gambling" + +/datum/personality/slacking + /// Areas which are considered "slacking off" + var/list/slacker_areas = list( + /area/station/commons/fitness, + /area/station/commons/lounge, + /area/station/service/bar, + /area/station/service/cafeteria, + /area/station/service/library, + /area/station/service/minibar, + /area/station/service/theater, + ) + /// Mood event applied when in a slacking area + var/mood_event_type + +/datum/personality/slacking/apply_to_mob(mob/living/who) + . = ..() + who.apply_status_effect(/datum/status_effect/moodlet_in_area, mood_event_type, slacker_areas, CALLBACK(src, PROC_REF(is_slacking))) + +/datum/personality/slacking/remove_from_mob(mob/living/who) + . = ..() + who.remove_status_effect(/datum/status_effect/moodlet_in_area, mood_event_type) + +/// Callback for the moodlet_in_area status effect to determine if we're slacking off +/datum/personality/slacking/proc/is_slacking(mob/living/who, area/new_area) + if(!istype(new_area, /area/station/service)) + return TRUE + // Service workers don't slack in service + if(who.mind?.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_SERVICE) + return FALSE + + return TRUE + +/datum/personality/slacking/lazy + savefile_key = "lazy" + name = "Lazy" + desc = "I don't really feel like working today." + pos_gameplay_desc = "Happy in the bar or recreation areas" + mood_event_type = /datum/mood_event/slacking_off_lazy + groups = list(PERSONALITY_GROUP_RECREATION, PERSONALITY_GROUP_WORK, PERSONALITY_GROUP_ATHLETICS) + +/datum/personality/slacking/diligent + savefile_key = "diligent" + name = "Diligent" + desc = "Things need to get done around here!" + pos_gameplay_desc = "Happy when in their department" + neg_gameplay_desc = "Unhappy when slacking off in the bar or recreation areas" + mood_event_type = /datum/mood_event/slacking_off_diligent + groups = list(PERSONALITY_GROUP_RECREATION) + +/datum/personality/slacking/diligent/apply_to_mob(mob/living/who) + . = ..() + RegisterSignals(who, list(COMSIG_MOB_MIND_TRANSFERRED_INTO, COMSIG_MOB_MIND_SET_ROLE), PROC_REF(update_effect)) + // Unfortunate side effect here in that IC job changes, IE HoP are missed + who.apply_status_effect(/datum/status_effect/moodlet_in_area, /datum/mood_event/working_diligent, who.mind?.get_work_areas()) + +/datum/personality/slacking/diligent/remove_from_mob(mob/living/who) + . = ..() + UnregisterSignal(who, list(COMSIG_MOB_MIND_TRANSFERRED_INTO, COMSIG_MOB_MIND_SET_ROLE)) + who.remove_status_effect(/datum/status_effect/moodlet_in_area, /datum/mood_event/working_diligent) + +/// Signal handler to update our status effect when our job changes +/datum/personality/slacking/diligent/proc/update_effect(mob/living/source, ...) + SIGNAL_HANDLER + + source.remove_status_effect(/datum/status_effect/moodlet_in_area, /datum/mood_event/working_diligent) + source.apply_status_effect(/datum/status_effect/moodlet_in_area, /datum/mood_event/working_diligent, source.mind.get_work_areas()) + +/datum/personality/industrious + savefile_key = "industrious" + name = "Industrious" + desc = "Everyone needs to be working - otherwise we're all wasting our time." + neg_gameplay_desc = "Dislikes playing games" + groups = list(PERSONALITY_GROUP_WORK) + +/datum/personality/athletic + savefile_key = "athletic" + name = "Athletic" + desc = "Can't just sit around all day! Have to keep moving." + pos_gameplay_desc = "Likes exercising" + neg_gameplay_desc = "Dislikes being lazy" + groups = list(PERSONALITY_GROUP_ATHLETICS) + +/datum/personality/erudite + savefile_key = "erudite" + name = "Erudite" + desc = "Knowledge is power. Especially this deep in space." + pos_gameplay_desc = "Likes reading books" + groups = list(PERSONALITY_GROUP_READING) + +/datum/personality/uneducated + savefile_key = "uneducated" + name = "Uneducated" + desc = "I don't care much for books - I already know everything I need to know." + neg_gameplay_desc = "Dislikes reading books" + groups = list(PERSONALITY_GROUP_READING) + +/datum/personality/spiritual + savefile_key = "spiritual" + name = "Spiritual" + desc = "I believe in a higher power." + pos_gameplay_desc = "Likes the Chapel and the Chaplain, and has special prayers" + neg_gameplay_desc = "Dislikes unholy things" + personality_trait = TRAIT_SPIRITUAL diff --git a/code/datums/pod_style.dm b/code/datums/pod_style.dm index 8888048980cd..77fc2a4d1509 100644 --- a/code/datums/pod_style.dm +++ b/code/datums/pod_style.dm @@ -33,7 +33,7 @@ /datum/pod_style/centcom name = "\improper CentCom supply pod" ui_name = "Nanotrasen" - desc = "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to CentCom after delivery." + desc = "A Nanotrasen supply pod. This one has been marked with Central Command's designations. Teleports back to CentCom after delivery." decal_icon = "centcom" glow_color = "blue" id = "centcom" diff --git a/code/datums/proximity_monitor/fields/gravity.dm b/code/datums/proximity_monitor/fields/gravity.dm index b89f2a6085cc..f79ac17b95aa 100644 --- a/code/datums/proximity_monitor/fields/gravity.dm +++ b/code/datums/proximity_monitor/fields/gravity.dm @@ -95,7 +95,7 @@ if(-INFINITY to -1) particle_type = /particles/grav_field_up if (particle_type) - add_shared_particles(/particles/grav_field_down/strong) + add_shared_particles(particle_type) color = particle_type::color RegisterSignal(src, COMSIG_ATOM_SMOOTHED_ICON, PROC_REF(smoothed)) diff --git a/code/datums/proximity_monitor/fields/heretic_arena.dm b/code/datums/proximity_monitor/fields/heretic_arena.dm index fc89fe824d14..432a9dfbd7bb 100644 --- a/code/datums/proximity_monitor/fields/heretic_arena.dm +++ b/code/datums/proximity_monitor/fields/heretic_arena.dm @@ -63,7 +63,8 @@ GLOBAL_LIST_EMPTY(heretic_arenas) var/obj/item/melee/sickly_blade/training/new_blade = new(get_turf(human_in_range)) welfare_blades += new_blade INVOKE_ASYNC(human_in_range, TYPE_PROC_REF(/mob, put_in_hands), new_blade) - human_in_range.mind?.add_antag_datum(/datum/antagonist/heretic_arena_participant) + to_chat(human_in_range, span_boldbig("Escape is impossible. The only way out is to defeat another participant in this battle to the death.")) + human_in_range.balloon_alert(human_in_range, "start killing!") human_in_range.apply_status_effect(/datum/status_effect/arena_tracker) RegisterSignal(human_in_range, COMSIG_CAN_Z_MOVE, PROC_REF(on_try_z_move)) RegisterSignal(human_in_range, COMSIG_LADDER_TRAVEL, PROC_REF(on_try_ladder)) @@ -75,8 +76,8 @@ GLOBAL_LIST_EMPTY(heretic_arenas) mob.remove_traits(given_immunities, HERETIC_ARENA_TRAIT) mob.remove_status_effect(/datum/status_effect/arena_tracker) UnregisterSignal(mob, list(COMSIG_CAN_Z_MOVE, COMSIG_LADDER_TRAVEL, COMSIG_MOVABLE_PRE_MOVE, COMSIG_MOVABLE_POST_TELEPORT)) - if(mob.mind?.has_antag_datum(/datum/antagonist/heretic_arena_participant)) - mob.mind.remove_antag_datum(/datum/antagonist/heretic_arena_participant) + to_chat(mob, span_boldbig("Your bloodlust is sated.")) + mob.balloon_alert(mob, "escape the arena!") for(var/turf/to_restore in border_walls) to_restore.ChangeTurf(border_walls[to_restore]) for(var/obj/to_refund as anything in welfare_blades) @@ -161,8 +162,8 @@ GLOBAL_LIST_EMPTY(heretic_arenas) // The mansus celebrates your efforts if(IS_HERETIC(owner)) owner.heal_overall_damage(60, 60, 60) - owner.adjustToxLoss(-60, forced = TRUE) // Slime heretics everywhere... - owner.adjustOxyLoss(-60) + owner.adjust_tox_loss(-60, forced = TRUE) // Slime heretics everywhere... + owner.adjust_oxy_loss(-60) if(iscarbon(owner)) var/mob/living/carbon/carbon_owner = owner for(var/datum/wound/wound as anything in carbon_owner.all_wounds) diff --git a/code/datums/quirks/_quirk.dm b/code/datums/quirks/_quirk.dm index dc36c5ba0ce6..b26482ada7ba 100644 --- a/code/datums/quirks/_quirk.dm +++ b/code/datums/quirks/_quirk.dm @@ -80,7 +80,7 @@ CRASH("Attempted to add quirk to a holder when it already has a holder.") quirk_holder = new_holder - quirk_holder.quirks += src + LAZYADD(quirk_holder.quirks, src) // If we weren't passed a client source try to use a present one client_source ||= quirk_holder.client @@ -121,7 +121,7 @@ if(process_update_signals) UnregisterSignal(quirk_holder, process_update_signals) - quirk_holder.quirks -= src + LAZYREMOVE(quirk_holder.quirks, src) if(!quirk_transfer && lose_text) to_chat(quirk_holder, lose_text) @@ -278,7 +278,7 @@ return medical ? dat.Join("
") : dat.Join(", ") /mob/living/proc/cleanse_quirk_datums() //removes all trait datums - QDEL_LIST(quirks) + QDEL_LAZYLIST(quirks) /mob/living/proc/transfer_quirk_datums(mob/living/to_mob) // We could be done before the client was moved or after the client was moved diff --git a/code/datums/quirks/negative_quirks/addict.dm b/code/datums/quirks/negative_quirks/addict.dm index 2136e3192449..b1a51f689fda 100644 --- a/code/datums/quirks/negative_quirks/addict.dm +++ b/code/datums/quirks/negative_quirks/addict.dm @@ -16,7 +16,7 @@ var/process_interval = 30 SECONDS //! how frequently the quirk processes COOLDOWN_DECLARE(next_process) //! ticker for processing -/datum/quirk/item_quirk/addict/add_unique(client/client_source) +/datum/quirk/item_quirk/addict/add(client/client_source) var/mob/living/carbon/human/human_holder = quirk_holder if(!reagent_type) @@ -27,6 +27,7 @@ for(var/addiction in reagent_instance.addiction_types) human_holder.last_mind?.add_addiction_points(addiction, 1000) +/datum/quirk/item_quirk/addict/add_unique(client/client_source) var/current_turf = get_turf(quirk_holder) if(!drug_container_type) diff --git a/code/datums/quirks/negative_quirks/allergic.dm b/code/datums/quirks/negative_quirks/allergic.dm index 25621f7970e1..394a0a584f6e 100644 --- a/code/datums/quirks/negative_quirks/allergic.dm +++ b/code/datums/quirks/negative_quirks/allergic.dm @@ -26,7 +26,7 @@ ) var/allergy_string -/datum/quirk/item_quirk/allergic/add_unique(client/client_source) +/datum/quirk/item_quirk/allergic/add(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) @@ -37,34 +37,33 @@ allergy_string = allergy_chem_names.Join(", ") name = "Extreme [allergy_string] Allergies" medical_record_text = "Patient's immune system responds violently to [allergy_string]" + RegisterSignal(quirk_holder, COMSIG_MOB_REAGENT_TICK, PROC_REF(block_metab)) +/datum/quirk/item_quirk/allergic/add_unique(client/client_source) 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, LOCATION_HANDS), flavour_text = "Make sure medical staff can see this...", notify_player = TRUE) +/datum/quirk/item_quirk/allergic/remove() + UnregisterSignal(quirk_holder, COMSIG_MOB_REAGENT_TICK) + /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) - var/mob/living/carbon/carbon_quirk_holder = quirk_holder - //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)) - for(var/allergy in allergies) - var/datum/reagent/instantiated_med = carbon_quirk_holder.reagents.has_reagent(allergy) - if(!instantiated_med) - continue - instantiated_med.reagent_removal_skip_list |= ALLERGIC_REMOVAL_SKIP - return //block damage so long as epinephrine exists +/datum/quirk/item_quirk/allergic/proc/block_metab(mob/living/carbon/source, datum/reagent/chem, seconds_per_tick, times_fired) + SIGNAL_HANDLER - for(var/allergy in allergies) - var/datum/reagent/instantiated_med = carbon_quirk_holder.reagents.has_reagent(allergy) - if(!instantiated_med) - continue - 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) + if(!is_type_in_list(chem, allergies)) + return NONE + // Having epinephrine stops metabolization of an allergen, but doesn't remove it from the system + if(source.reagents.has_reagent(/datum/reagent/medicine/epinephrine)) + return COMSIG_MOB_STOP_REAGENT_METABOLISM + // Otherwise the allergen causes a ton of damage though otherwise processes normally + source.apply_damage(3 * seconds_per_tick, TOX) + source.reagents.add_reagent(/datum/reagent/toxin/histamine, 3 * seconds_per_tick) + if(SPT_PROB(10, seconds_per_tick)) + source.vomit(VOMIT_CATEGORY_DEFAULT) + source.adjust_organ_loss(pick(ORGAN_SLOT_BRAIN, ORGAN_SLOT_APPENDIX, ORGAN_SLOT_LUNGS, ORGAN_SLOT_HEART, ORGAN_SLOT_LIVER, ORGAN_SLOT_STOMACH), 10) + return NONE diff --git a/code/datums/quirks/negative_quirks/asthma.dm b/code/datums/quirks/negative_quirks/asthma.dm index 6683869a6467..08ae561dc6d4 100644 --- a/code/datums/quirks/negative_quirks/asthma.dm +++ b/code/datums/quirks/negative_quirks/asthma.dm @@ -60,18 +60,19 @@ /datum/disease/asthma_attack/critical = 1, // this can quickly kill you, so its rarity is justified ) -/datum/quirk/item_quirk/asthma/add_unique(client/client_source) - . = ..() - - var/obj/item/inhaler/albuterol/asthma/rescue_inhaler = new(get_turf(quirk_holder)) - give_item_to_holder(rescue_inhaler, list(LOCATION_BACKPACK, LOCATION_HANDS), flavour_text = "You can use this to quickly relieve the symptoms of your asthma.") - +/datum/quirk/item_quirk/asthma/add(client/client_source) RegisterSignal(quirk_holder, COMSIG_CARBON_EXPOSED_TO_SMOKE, PROC_REF(holder_exposed_to_smoke)) RegisterSignal(quirk_holder, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(organ_removed)) RegisterSignal(quirk_holder, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(exposed_to_reagents)) RegisterSignal(quirk_holder, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(on_full_heal)) RegisterSignal(quirk_holder, COMSIG_LIVING_LIFE, PROC_REF(on_life)) +/datum/quirk/item_quirk/asthma/add_unique(client/client_source) + . = ..() + + var/obj/item/inhaler/albuterol/asthma/rescue_inhaler = new(get_turf(quirk_holder)) + give_item_to_holder(rescue_inhaler, list(LOCATION_BACKPACK, LOCATION_HANDS), flavour_text = "You can use this to quickly relieve the symptoms of your asthma.") + COOLDOWN_START(src, next_attack_cooldown, time_first_attack_can_happen) /datum/quirk/item_quirk/asthma/remove() diff --git a/code/datums/quirks/negative_quirks/bad_touch.dm b/code/datums/quirks/negative_quirks/bad_touch.dm deleted file mode 100644 index f3a5d967a019..000000000000 --- a/code/datums/quirks/negative_quirks/bad_touch.dm +++ /dev/null @@ -1,31 +0,0 @@ -/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/blindness.dm b/code/datums/quirks/negative_quirks/blindness.dm index 8dafede1fe15..42517e053443 100644 --- a/code/datums/quirks/negative_quirks/blindness.dm +++ b/code/datums/quirks/negative_quirks/blindness.dm @@ -20,6 +20,11 @@ blindfold.colored_before = TRUE give_item_to_holder(blindfold, list(LOCATION_EYES, LOCATION_HANDS)) +/datum/quirk/item_quirk/blindness/is_species_appropriate(datum/species/mob_species) + if(ispath(mob_species, /datum/species/dullahan)) + return FALSE + return ..() + /datum/quirk/item_quirk/blindness/add(client/client_source) quirk_holder.become_blind(QUIRK_TRAIT) diff --git a/code/datums/quirks/negative_quirks/blood_deficiency.dm b/code/datums/quirks/negative_quirks/blood_deficiency.dm index bacdcff80ea5..7dfd01131dd3 100644 --- a/code/datums/quirks/negative_quirks/blood_deficiency.dm +++ b/code/datums/quirks/negative_quirks/blood_deficiency.dm @@ -35,11 +35,11 @@ SIGNAL_HANDLER var/mob/living/carbon/human/human_holder = quirk_holder - if(human_holder.stat == DEAD || human_holder.blood_volume <= min_blood) + + if(human_holder.stat == DEAD) return - if(!HAS_TRAIT(quirk_holder, TRAIT_NOBLOOD)) - human_holder.blood_volume = max(min_blood, human_holder.blood_volume - human_holder.dna.species.blood_deficiency_drain_rate * seconds_per_tick) + human_holder.adjust_blood_volume(-human_holder.dna.species.blood_deficiency_drain_rate * seconds_per_tick, minimum = min_blood) /// Try to update the mail goodies to match the quirk holder's blood type. If we fail for whatever reason then it will just default to the initial O- blood pack that we start with. /datum/quirk/blooddeficiency/proc/update_mail(mob/living/carbon/human/human_quirk_holder, datum/blood_type/new_blood_type, update_cached_blood_dna_info) diff --git a/code/datums/quirks/negative_quirks/brain_problems.dm b/code/datums/quirks/negative_quirks/brain_problems.dm index 8bafa07b9dd2..d9257a33c6b4 100644 --- a/code/datums/quirks/negative_quirks/brain_problems.dm +++ b/code/datums/quirks/negative_quirks/brain_problems.dm @@ -29,5 +29,10 @@ notify_player = TRUE, ) +/datum/quirk/item_quirk/brainproblems/is_species_appropriate(datum/species/mob_species) + if(ispath(mob_species, /datum/species/dullahan)) + return FALSE + return ..() + /datum/quirk/item_quirk/brainproblems/process(seconds_per_tick) - quirk_holder.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2 * seconds_per_tick) + quirk_holder.adjust_organ_loss(ORGAN_SLOT_BRAIN, 0.2 * seconds_per_tick) diff --git a/code/datums/quirks/negative_quirks/erratic.dm b/code/datums/quirks/negative_quirks/erratic.dm new file mode 100644 index 000000000000..e8b1f6b6384b --- /dev/null +++ b/code/datums/quirks/negative_quirks/erratic.dm @@ -0,0 +1,60 @@ +/datum/quirk/erratic + name = "Erratic" + desc = "You mood swings like a pendulum, causing your personality to change on a whim every so often." + icon = FA_ICON_MASKS_THEATER + value = -3 + gain_text = span_danger("You feel erratic.") // say that again? + lose_text = span_notice("You feel more stable.") + medical_record_text = "Patient has a bipolar personality disorder." + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED|QUIRK_PROCESSES + hardcore_value = 3 + mail_goodies = list(/obj/item/storage/pill_bottle/psicodine) + /// Cooldown between personality randomizations + COOLDOWN_DECLARE(randomize_cooldown) + /// Personalities before the quirk was applied + VAR_PRIVATE/list/base_personalities + /// Every other randomization, revert to base personality + var/random_index = 0 + +/datum/quirk/erratic/add(client/client_source) + base_personalities = LAZYCOPY(quirk_holder.personalities) + COOLDOWN_START(src, randomize_cooldown, rand(5, 10) MINUTES) + +/datum/quirk/erratic/remove() + replace_personalities(base_personalities) + if(!QDELING(quirk_holder)) + announce_personality_change() + +/datum/quirk/erratic/process(seconds_per_tick) + if(!COOLDOWN_FINISHED(src, randomize_cooldown)) + return + if(HAS_TRAIT(quirk_holder, TRAIT_FEARLESS) || quirk_holder.stat >= UNCONSCIOUS) + return + + COOLDOWN_START(src, randomize_cooldown, rand(6, 12) MINUTES) + randomize_personalities() + +/datum/quirk/erratic/proc/randomize_personalities() + random_index += 1 + if(random_index % 2 == 0) + random_index = 0 + replace_personalities(base_personalities) + to_chat(quirk_holder, span_notice("You feel... normal.")) + announce_personality_change() + return + + var/max = CONFIG_GET(number/max_personalities) + var/list/new_personality = prob(1) ? list() : SSpersonalities.select_random_personalities(max - 2, max + 1) + replace_personalities(new_personality) + to_chat(quirk_holder, span_notice("You feel... different.")) + announce_personality_change() + +/datum/quirk/erratic/proc/replace_personalities(list/new_personalities) + quirk_holder.clear_personalities() + quirk_holder.add_personalities(new_personalities) + +/datum/quirk/erratic/proc/announce_personality_change() + var/list/new_personality = list() + for(var/datum/personality/personality_type as anything in quirk_holder.personalities) + new_personality += initial(personality_type.name) + to_chat(quirk_holder, span_green("Your personality is now: [english_list(new_personality)].")) diff --git a/code/datums/quirks/negative_quirks/family_heirloom.dm b/code/datums/quirks/negative_quirks/family_heirloom.dm index 8b3d826cb84f..98951368cab6 100644 --- a/code/datums/quirks/negative_quirks/family_heirloom.dm +++ b/code/datums/quirks/negative_quirks/family_heirloom.dm @@ -52,6 +52,7 @@ 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) + quirk_holder.add_mob_memory(/datum/memory/key/quirk_heirloom, protagonist = quirk_holder, heirloom_name = initial(family_heirloom.name)) return ..() diff --git a/code/datums/quirks/negative_quirks/fluoride_stare.dm b/code/datums/quirks/negative_quirks/fluoride_stare.dm index 97b9c75f3e97..c14efee30143 100644 --- a/code/datums/quirks/negative_quirks/fluoride_stare.dm +++ b/code/datums/quirks/negative_quirks/fluoride_stare.dm @@ -10,6 +10,11 @@ quirk_flags = QUIRK_HUMAN_ONLY mail_goodies = list(/obj/item/reagent_containers/cup/bottle/salglu_solution, /obj/item/light/bulb) +/datum/quirk/item_quirk/fluoride_stare/is_species_appropriate(datum/species/mob_species) + if(ispath(mob_species, /datum/species/dullahan)) + return FALSE + return ..() + /datum/quirk/item_quirk/fluoride_stare/add_unique(client/client_source) var/obj/item/reagent_containers/cup/bottle/salglu_solution/saline = new(get_turf(quirk_holder)) give_item_to_holder(saline, list( diff --git a/code/datums/quirks/negative_quirks/food_allergy.dm b/code/datums/quirks/negative_quirks/food_allergy.dm index ba2c17110326..1f8a6e9e829c 100644 --- a/code/datums/quirks/negative_quirks/food_allergy.dm +++ b/code/datums/quirks/negative_quirks/food_allergy.dm @@ -39,7 +39,7 @@ GLOBAL_LIST_INIT(possible_food_allergies, list( if(target_foodtypes != NONE) // Got a preference, don't care return - target_foodtypes = pick(flatten_list(GLOB.possible_food_allergies)) + target_foodtypes = pick(assoc_to_values(GLOB.possible_food_allergies)) /datum/quirk/item_quirk/food_allergic/add_unique(client/client_source) var/what_are_we_actually_killed_by = english_list(bitfield_to_list(target_foodtypes, FOOD_FLAGS_IC)) // This should never be more than one thing but just in case we can support it diff --git a/code/datums/quirks/negative_quirks/indebted.dm b/code/datums/quirks/negative_quirks/indebted.dm index eac2cdf5192d..9d643654d311 100644 --- a/code/datums/quirks/negative_quirks/indebted.dm +++ b/code/datums/quirks/negative_quirks/indebted.dm @@ -15,7 +15,7 @@ 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...")) + to_chat(client_source.mob, span_warning("You remember, you've a hefty, [debt] [MONEY_NAME_SINGULAR] 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) diff --git a/code/datums/quirks/negative_quirks/monophobia.dm b/code/datums/quirks/negative_quirks/monophobia.dm new file mode 100644 index 000000000000..5c0d732826c3 --- /dev/null +++ b/code/datums/quirks/negative_quirks/monophobia.dm @@ -0,0 +1,16 @@ +/datum/quirk/monophobia + name = "Monophobia" + desc = "You have an extreme fear of loneliness, and have always tried to stick to large groups." + icon = FA_ICON_PEOPLE_GROUP + value = -3 + medical_record_text = "Patient has a severe fear of being left alone." + hardcore_value = 5 + mail_goodies = list(/obj/effect/spawner/random/entertainment/plushie) + +/datum/quirk/monophobia/add(client/client_source) + var/mob/living/carbon/human/human_holder = quirk_holder + human_holder.gain_trauma(new /datum/brain_trauma/severe/monophobia(), TRAUMA_RESILIENCE_ABSOLUTE) + +/datum/quirk/monophobia/remove() + var/mob/living/carbon/human/human_holder = quirk_holder + human_holder.cure_trauma_type(/datum/brain_trauma/severe/monophobia, TRAUMA_RESILIENCE_ABSOLUTE) diff --git a/code/datums/quirks/negative_quirks/narcolepsy.dm b/code/datums/quirks/negative_quirks/narcolepsy.dm index 13643b48a8f4..2f1d01f59ee3 100644 --- a/code/datums/quirks/negative_quirks/narcolepsy.dm +++ b/code/datums/quirks/negative_quirks/narcolepsy.dm @@ -11,10 +11,11 @@ /obj/item/storage/pill_bottle/prescription_stimulant, ) -/datum/quirk/item_quirk/narcolepsy/add_unique(client/client_source) +/datum/quirk/item_quirk/narcolepsy/add(client/client_source) var/mob/living/carbon/carbon_user = quirk_holder carbon_user.gain_trauma(/datum/brain_trauma/severe/narcolepsy/permanent, TRAUMA_RESILIENCE_ABSOLUTE) +/datum/quirk/item_quirk/narcolepsy/add_unique(client/client_source) give_item_to_holder( /obj/item/storage/pill_bottle/prescription_stimulant, list( diff --git a/code/datums/quirks/negative_quirks/nearsighted.dm b/code/datums/quirks/negative_quirks/nearsighted.dm index a9e945861d72..3c0b8f78c53b 100644 --- a/code/datums/quirks/negative_quirks/nearsighted.dm +++ b/code/datums/quirks/negative_quirks/nearsighted.dm @@ -14,6 +14,11 @@ associated_typepath = /datum/quirk/item_quirk/nearsighted customization_options = list(/datum/preference/choiced/glasses) +/datum/quirk/item_quirk/nearsighted/is_species_appropriate(datum/species/mob_species) + if(ispath(mob_species, /datum/species/dullahan)) + return FALSE + return ..() + /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 diff --git a/code/datums/quirks/negative_quirks/prosthetic_organ.dm b/code/datums/quirks/negative_quirks/prosthetic_organ.dm index 7877e177b39f..dddba8a28e22 100644 --- a/code/datums/quirks/negative_quirks/prosthetic_organ.dm +++ b/code/datums/quirks/negative_quirks/prosthetic_organ.dm @@ -29,7 +29,7 @@ preferred_organ = GLOB.organ_choice[pick(GLOB.organ_choice)] var/list/possible_organ_slots = organ_slots.Copy() - if(HAS_TRAIT(human_holder, TRAIT_NOBLOOD)) + if(!CAN_HAVE_BLOOD(human_holder)) possible_organ_slots -= ORGAN_SLOT_HEART if(HAS_TRAIT(human_holder, TRAIT_NOBREATH)) possible_organ_slots -= ORGAN_SLOT_LUNGS diff --git a/code/datums/quirks/negative_quirks/quadruple_amputee.dm b/code/datums/quirks/negative_quirks/quadruple_amputee.dm index 716ec9ef2399..82bb0f8deb5e 100644 --- a/code/datums/quirks/negative_quirks/quadruple_amputee.dm +++ b/code/datums/quirks/negative_quirks/quadruple_amputee.dm @@ -17,12 +17,12 @@ /datum/quirk/quadruple_amputee/post_add() to_chat(quirk_holder, span_bolddanger("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.")) + Additionally, you need to use a welding tool and cables to repair them, instead of sutures and regenerative mesh.")) /datum/quirk/quadruple_amputee/remove() if(QDELING(quirk_holder)) return - + var/mob/living/carbon/human/human_holder = quirk_holder human_holder.reset_to_original_bodypart(BODY_ZONE_L_ARM) human_holder.reset_to_original_bodypart(BODY_ZONE_R_ARM) diff --git a/code/datums/quirks/negative_quirks/tin_man.dm b/code/datums/quirks/negative_quirks/tin_man.dm index a75cbbedd766..054a5eecf06d 100644 --- a/code/datums/quirks/negative_quirks/tin_man.dm +++ b/code/datums/quirks/negative_quirks/tin_man.dm @@ -17,7 +17,7 @@ ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/cybernetic/surplus, ) var/list/possible_organ_slots = organ_slots.Copy() - if(HAS_TRAIT(human_holder, TRAIT_NOBLOOD)) + if(!CAN_HAVE_BLOOD(human_holder)) possible_organ_slots -= ORGAN_SLOT_HEART if(HAS_TRAIT(human_holder, TRAIT_NOBREATH)) possible_organ_slots -= ORGAN_SLOT_LUNGS diff --git a/code/datums/quirks/neutral_quirks/extrovert.dm b/code/datums/quirks/neutral_quirks/extrovert.dm deleted file mode 100644 index 5622956ba5b5..000000000000 --- a/code/datums/quirks/neutral_quirks/extrovert.dm +++ /dev/null @@ -1,10 +0,0 @@ -/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/introvert.dm b/code/datums/quirks/neutral_quirks/introvert.dm deleted file mode 100644 index 51f6f3e785e4..000000000000 --- a/code/datums/quirks/neutral_quirks/introvert.dm +++ /dev/null @@ -1,10 +0,0 @@ -/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/snob.dm b/code/datums/quirks/neutral_quirks/snob.dm deleted file mode 100644 index fa32cbd5f2aa..000000000000 --- a/code/datums/quirks/neutral_quirks/snob.dm +++ /dev/null @@ -1,10 +0,0 @@ -/datum/quirk/snob - name = "Snob" - desc = "You care about the finer things, if a room doesn't look nice it's 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/transhumanist.dm b/code/datums/quirks/neutral_quirks/transhumanist.dm index cbd85150e767..82570e6cf21c 100644 --- a/code/datums/quirks/neutral_quirks/transhumanist.dm +++ b/code/datums/quirks/neutral_quirks/transhumanist.dm @@ -46,6 +46,31 @@ COMSIG_CARBON_GAIN_ORGAN, COMSIG_CARBON_LOSE_ORGAN, )) + if(isnull(old_part)) + quirk_holder.clear_mood_event(MOOD_CATEGORY_TRANSHUMANIST_BODYPART) + quirk_holder.clear_mood_event(MOOD_CATEGORY_TRANSHUMANIST_PEOPLE) + return + + if(QDELETED(quirk_holder)) // We don't ever want to be adding organs to qdeleting mobs + QDEL_NULL(old_part) + return + + var/mob/living/carbon/human/human_holder = quirk_holder + if(isbodypart(old_part)) + var/obj/item/bodypart/old_bodypart = old_part + human_holder.del_and_replace_bodypart(old_bodypart, special = TRUE) + old_bodypart = null + else if(isorgan(old_part)) + var/obj/item/organ/old_organ = old_part + old_part = human_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + old_organ.Insert(quirk_holder, special = TRUE) + old_part.moveToNullspace() + STOP_PROCESSING(SSobj, old_part) + old_organ = null + old_part = null + + quirk_holder.clear_mood_event(MOOD_CATEGORY_TRANSHUMANIST_BODYPART) + quirk_holder.clear_mood_event(MOOD_CATEGORY_TRANSHUMANIST_PEOPLE) /datum/quirk/transhumanist/proc/get_bodypart_score(mob/living/carbon/target, limbs_only = FALSE) var/organic_bodytypes = 0 @@ -66,7 +91,7 @@ else if(organ.organ_flags & ORGAN_ORGANIC) organic_bodytypes += 0.02 - return list( + return alist( BODYPART_SCORE_ORGANIC = organic_bodytypes, BODYPART_SCORE_SILICON = silicon_bodytypes, BODYPART_SCORE_OTHER_BODYTYPES = other_bodytypes, @@ -76,7 +101,7 @@ /datum/quirk/transhumanist/proc/calculate_bodypart_score() SIGNAL_HANDLER - var/list/score = get_bodypart_score(quirk_holder) + var/alist/score = get_bodypart_score(quirk_holder) var/organic_bodytypes = score[BODYPART_SCORE_ORGANIC] var/silicon_bodytypes = score[BODYPART_SCORE_SILICON] var/other_bodytypes = score[BODYPART_SCORE_OTHER_BODYTYPES] @@ -142,29 +167,6 @@ else if (isorgan(old_part)) to_chat(quirk_holder, span_bolddanger("Your [slot_string] brings you one step closer to silicon perfection, but you feel you're not quite there yet.")) -/datum/quirk/transhumanist/remove() - if(isnull(old_part)) - quirk_holder.clear_mood_event(MOOD_CATEGORY_TRANSHUMANIST_BODYPART) - quirk_holder.clear_mood_event(MOOD_CATEGORY_TRANSHUMANIST_PEOPLE) - return - - var/mob/living/carbon/human/human_holder = quirk_holder - if(isbodypart(old_part)) - var/obj/item/bodypart/old_bodypart = old_part - human_holder.del_and_replace_bodypart(old_bodypart, special = TRUE) - old_bodypart = null - else if(isorgan(old_part)) - var/obj/item/organ/old_organ = old_part - old_part = human_holder.get_organ_slot(ORGAN_SLOT_TONGUE) - old_organ.Insert(quirk_holder, special = TRUE) - old_part.moveToNullspace() - STOP_PROCESSING(SSobj, old_part) - old_organ = null - old_part = null - - quirk_holder.clear_mood_event(MOOD_CATEGORY_TRANSHUMANIST_BODYPART) - quirk_holder.clear_mood_event(MOOD_CATEGORY_TRANSHUMANIST_PEOPLE) - /datum/quirk/transhumanist/process(seconds_per_tick) var/organics_nearby = 0 var/silicons_nearby = 0 @@ -177,7 +179,7 @@ continue if(iscarbon(target)) - var/list/score = get_bodypart_score(target, limbs_only = TRUE) + var/alist/score = get_bodypart_score(target, limbs_only = TRUE) // For an average human, they'll need 2 augmented limbs to not get counted as an organic nor a silicon. // If some monstrosity has 20-30 organic limbs, they'll likely need more. if(score[BODYPART_SCORE_OVERALL] < 1) diff --git a/code/datums/quirks/positive_quirks/apathetic.dm b/code/datums/quirks/positive_quirks/apathetic.dm deleted file mode 100644 index 170cb6f5d448..000000000000 --- a/code/datums/quirks/positive_quirks/apathetic.dm +++ /dev/null @@ -1,14 +0,0 @@ -/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 index bfc6db677a41..991d5653741f 100644 --- a/code/datums/quirks/positive_quirks/bilingual.dm +++ b/code/datums/quirks/positive_quirks/bilingual.dm @@ -19,12 +19,12 @@ /datum/quirk/bilingual/add(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 if(wanted_language) + // DARKPACK EDIT CHANGE START - LANGUAGES + if(wanted_language) language_type = GLOB.language_types_by_name[wanted_language] + // DARKPACK EDIT CHANGE END if(!language_type || quirk_holder.has_language(language_type)) - language_type = /datum/language/uncommon + language_type = /datum/language/spanish // DARKPACK EDIT CHANGE - LANGUAGES 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 diff --git a/code/datums/quirks/positive_quirks/chipped.dm b/code/datums/quirks/positive_quirks/chipped.dm index 484cf5ed3821..96bd668ecce0 100644 --- a/code/datums/quirks/positive_quirks/chipped.dm +++ b/code/datums/quirks/positive_quirks/chipped.dm @@ -3,19 +3,16 @@ desc = "You got caught up in the skillchip craze a few years back, and had one of the commercially available chips implanted into yourself." icon = FA_ICON_MICROCHIP value = 2 - gain_text = span_notice("The chip in your head itches a bit.") - lose_text = span_danger("You don't feel so chipped anymore..") - medical_record_text = "Patient explained how they got caught up in 'the skillchip chase' recently, and now the chip in their head itches every so often. Dumbass." + gain_text = span_notice("You suddenly feels chipped.") + lose_text = span_danger("You don't feel so chipped anymore.") + medical_record_text = "Patient explained how they got caught up in 'the skillchip chase' recently, and now they have some useless chip in their head. Dumbass." mail_goodies = list( /obj/item/skillchip/matrix_taunt, /obj/item/skillchip/big_pointer, /obj/item/skillchip/acrobatics, - /obj/item/storage/pill_bottle/mannitol/braintumor, ) /// Variable that holds the chip, used on removal. var/obj/item/skillchip/installed_chip - ///itchy status effect we give our owner - var/datum/itchy_effect /datum/quirk_constant_data/chipped associated_typepath = /datum/quirk/chipped @@ -27,8 +24,8 @@ if(isnull(chip_pref)) return ..() installed_chip = GLOB.quirk_chipped_choice[chip_pref] || GLOB.quirk_chipped_choice[pick(GLOB.quirk_chipped_choice)] - gain_text = span_notice("The [installed_chip::name] in your head itches a bit.") - lose_text = span_notice("Your head stops itching so much.") + gain_text = span_notice("The [installed_chip::name] in your head buzzes with knowledge.") + lose_text = span_notice("You stop feeling the chip inside your head.") return ..() /datum/quirk/chipped/add_unique(client/client_source) @@ -37,48 +34,9 @@ var/mob/living/carbon/quirk_holder_carbon = quirk_holder installed_chip = new installed_chip() - - RegisterSignals(installed_chip, list(COMSIG_QDELETING, COMSIG_SKILLCHIP_REMOVED), PROC_REF(remove_effect)) - RegisterSignal(installed_chip, COMSIG_SKILLCHIP_IMPLANTED, PROC_REF(apply_effect)) - quirk_holder_carbon.implant_skillchip(installed_chip, force = TRUE) installed_chip.try_activate_skillchip(silent = FALSE, force = TRUE) -/datum/quirk/chipped/proc/apply_effect(datum/source, obj/item/brain_applied) - SIGNAL_HANDLER - var/mob/living/carbon/quirk_holder_carbon = quirk_holder - if(brain_applied == quirk_holder_carbon.get_organ_slot(ORGAN_SLOT_BRAIN)) - itchy_effect = quirk_holder.apply_status_effect(/datum/status_effect/itchy_skillchip_quirk) - -/datum/quirk/chipped/proc/remove_effect(datum/source, obj/item/brain_removed) - SIGNAL_HANDLER - var/mob/living/carbon/quirk_holder_carbon = quirk_holder - if(QDELING(source) || brain_removed == quirk_holder_carbon.get_organ_slot(ORGAN_SLOT_BRAIN)) - quirk_holder.remove_status_effect(itchy_effect) - itchy_effect = null - /datum/quirk/chipped/remove() QDEL_NULL(installed_chip) - if(itchy_effect) - quirk_holder.remove_status_effect(itchy_effect) - itchy_effect = null return ..() - -/datum/status_effect/itchy_skillchip_quirk - id = "itchy skillchip" - tick_interval_lowerbound = 5 SECONDS - tick_interval_upperbound = 10 MINUTES - alert_type = null - ///lower damage we apply to our itchy owner - var/minimum_damage = 1 - ///upper damage we apply to our itchy owner - var/maximum_damage = 5 - -/datum/status_effect/itchy_skillchip_quirk/tick(seconds_between_ticks) - var/mob/living/carbon/carbon_owner = owner - var/obj/item/organ/brain/itchy_brain = carbon_owner.get_organ_slot(ORGAN_SLOT_BRAIN) - if(isnull(itchy_brain)) - return - itchy_brain.apply_organ_damage(rand(minimum_damage, maximum_damage), maximum = itchy_brain.maxHealth * 0.3) - if(owner.stat == CONSCIOUS && !owner.incapacitated && owner.get_empty_held_indexes()) - to_chat(owner, span_warning("You scratch the itch in your head.")) diff --git a/code/datums/quirks/positive_quirks/clown_enjoyer.dm b/code/datums/quirks/positive_quirks/clown_enjoyer.dm index 79dd6e0c6bfd..cccea9d074e3 100644 --- a/code/datums/quirks/positive_quirks/clown_enjoyer.dm +++ b/code/datums/quirks/positive_quirks/clown_enjoyer.dm @@ -25,7 +25,3 @@ /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, LOCATION_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 index e1c4ba911255..a0b5f47cfe8d 100644 --- a/code/datums/quirks/positive_quirks/drunk_healing.dm +++ b/code/datums/quirks/positive_quirks/drunk_healing.dm @@ -13,13 +13,13 @@ 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) + need_mob_update += quirk_holder.adjust_brute_loss(-0.1 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += quirk_holder.adjust_fire_loss(-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) + need_mob_update += quirk_holder.adjust_brute_loss(-0.4 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += quirk_holder.adjust_fire_loss(-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) + need_mob_update += quirk_holder.adjust_brute_loss(-0.8 * seconds_per_tick, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += quirk_holder.adjust_fire_loss(-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 index f80ce3b5ef18..0cb5704ad4f2 100644 --- a/code/datums/quirks/positive_quirks/empath.dm +++ b/code/datums/quirks/positive_quirks/empath.dm @@ -3,8 +3,13 @@ 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/empath/add(client/client_source) + quirk_holder.AddComponentFrom(REF(src), /datum/component/empathy) + +/datum/quirk/empath/remove(client/client_source) + quirk_holder.RemoveComponentSource(REF(src), /datum/component/empathy) diff --git a/code/datums/quirks/positive_quirks/mime_fan.dm b/code/datums/quirks/positive_quirks/mime_fan.dm index fea992202595..fb971d105790 100644 --- a/code/datums/quirks/positive_quirks/mime_fan.dm +++ b/code/datums/quirks/positive_quirks/mime_fan.dm @@ -23,7 +23,3 @@ /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, LOCATION_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/spiritual.dm b/code/datums/quirks/positive_quirks/spiritual.dm deleted file mode 100644 index 56f760e98a93..000000000000 --- a/code/datums/quirks/positive_quirks/spiritual.dm +++ /dev/null @@ -1,20 +0,0 @@ -/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, LOCATION_HANDS)) - give_item_to_holder(/obj/item/storage/box/matches, list(LOCATION_BACKPACK, LOCATION_HANDS)) diff --git a/code/datums/records/manifest.dm b/code/datums/records/manifest.dm index 2a7fc26a90d2..8a5e41c0c7f6 100644 --- a/code/datums/records/manifest.dm +++ b/code/datums/records/manifest.dm @@ -18,7 +18,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) log_manifest(readied_player.ckey, readied_player.new_character.mind, readied_player.new_character) players_to_log[readied_player.ckey] = readied_player.new_character if(ishuman(readied_player.new_character)) - inject(readied_player.new_character) + inject(readied_player.new_character, person_client = readied_player.client) // DARKPACK EDIT - Flavor Text - ORIGINAL: inject(readied_player.new_character) CHECK_TICK if(length(players_to_log)) SSblackbox.ReportRoundstartManifest(players_to_log) @@ -103,7 +103,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) /// Injects a record into the manifest. -/datum/manifest/proc/inject(mob/living/carbon/human/person, atom/appearance_proxy) +/datum/manifest/proc/inject(mob/living/carbon/human/person, atom/appearance_proxy, client/person_client) // DARKPACKED EDIT CHANGE - FLAVOR TEXT - ORIGINAL: /datum/manifest/proc/inject(mob/living/carbon/human/person, atom/appearance_proxy) set waitfor = FALSE if(!(person.mind?.assigned_role.job_flags & JOB_CREW_MANIFEST)) return @@ -141,7 +141,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) new /datum/record/crew( age = person.age, blood_type = person.get_bloodtype()?.name || "UNKNOWN", - character_appearance = character_appearance, + character_appearance = null, // DARKPACK EDIT - RECORDS, ORIGINAL: character_appearance = character_appearance dna_string = record_dna.unique_enzymes, fingerprint = md5(record_dna.unique_identity), gender = person_gender, @@ -157,6 +157,12 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) 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), + // DARKPACK EDIT START - FLAVOR TEXT + background_information = person_client?.prefs.read_preference(/datum/preference/text/background) || "", + exploitable_information = person_client?.prefs.read_preference(/datum/preference/text/exploitable) || "", + past_medical_records = person_client?.prefs.read_preference(/datum/preference/text/medical) || "", + past_criminal_records = person_client?.prefs.read_preference(/datum/preference/text/criminal) || "", + // DARKPACK EDIT END ) /// Edits the rank and trim of the found record. diff --git a/code/datums/records/record.dm b/code/datums/records/record.dm index 9785ac8ffcb0..22dd5b21a72b 100644 --- a/code/datums/records/record.dm +++ b/code/datums/records/record.dm @@ -108,6 +108,12 @@ physical_status = PHYSICAL_ACTIVE, mental_status = MENTAL_STABLE, quirk_notes, + // DARKPACK EDIT START - FLAVOR TEXT + background_information = "", + exploitable_information = "", + past_medical_records = "", + past_criminal_records = "", + // DARKPACK EDIT END ) . = ..() src.lock_ref = lock_ref @@ -118,6 +124,12 @@ src.physical_status = physical_status src.mental_status = mental_status src.quirk_notes = quirk_notes + // DARKPACK EDIT START - FLAVOR TEXT + src.background_information = background_information + src.exploitable_information = exploitable_information + src.past_medical_records = past_medical_records + src.past_criminal_records = past_criminal_records + // DARKPACK EDIT END GLOB.manifest.general += src diff --git a/code/datums/shuttles/cargo.dm b/code/datums/shuttles/cargo.dm index 0dba61fdeddc..b3fadeaaa75b 100644 --- a/code/datums/shuttles/cargo.dm +++ b/code/datums/shuttles/cargo.dm @@ -3,6 +3,10 @@ name = "Base Shuttle Template (Cargo)" who_can_purchase = null +/datum/map_template/shuttle/cargo/mini + suffix ="mini" + name = "supply shuttle (Mini)" + /datum/map_template/shuttle/cargo/kilo suffix = "kilo" name = "supply shuttle (Kilo)" diff --git a/code/datums/sprite_accessories.dm b/code/datums/sprite_accessories.dm index 2c7b862dc6b1..88f1a4043e66 100644 --- a/code/datums/sprite_accessories.dm +++ b/code/datums/sprite_accessories.dm @@ -50,7 +50,7 @@ /datum/sprite_accessory/blank name = SPRITE_ACCESSORY_NONE - icon_state = "None" + icon_state = SPRITE_ACCESSORY_NONE //////////////// // Hair Masks // @@ -2114,6 +2114,11 @@ GLOBAL_LIST_EMPTY(blended_hair_icons_cache) name = "Round" icon_state = "round" +/datum/sprite_accessory/ears/cat/cybernetic + name = "Cybernetic" + icon_state = "cyber" + locked = TRUE + /datum/sprite_accessory/ears/fox icon = 'icons/mob/human/fox_features.dmi' name = "Fox" diff --git a/code/datums/station_traits/admin_panel.dm b/code/datums/station_traits/admin_panel.dm index 67669027c54d..5d222402c91a 100644 --- a/code/datums/station_traits/admin_panel.dm +++ b/code/datums/station_traits/admin_panel.dm @@ -28,7 +28,11 @@ ADMIN_VERB(station_traits_panel, R_FUN, "Modify Station Traits", "Modify the sta var/list/valid_station_traits = list() - for (var/datum/station_trait/station_trait_path as anything in subtypesof(/datum/station_trait)) + for (var/datum/station_trait/station_trait_path as anything in valid_subtypesof(/datum/station_trait)) + // DARKPACK EDIT ADD - CITY_TRAITS + if(!initial(station_trait_path.darkpack_allowed)) + continue + // DARKPACK EDIT END valid_station_traits += list(list( "name" = initial(station_trait_path.name), "path" = station_trait_path, diff --git a/code/datums/station_traits/job_traits.dm b/code/datums/station_traits/job_traits.dm index 9cbccd6129cd..4c463c3a3e17 100644 --- a/code/datums/station_traits/job_traits.dm +++ b/code/datums/station_traits/job_traits.dm @@ -200,7 +200,7 @@ /// Gives the AI SAT a fax machine if it doesn't have one. This is copy pasted from Bridge Assistant's coffee maker. /datum/station_trait/job/human_ai/proc/give_fax_machine(datum/source) SIGNAL_HANDLER - var/area/sat_area = GLOB.areas_by_type[/area/station/ai_monitored/turret_protected/ai] + var/area/sat_area = GLOB.areas_by_type[/area/station/ai/satellite/chamber] if(isnull(sat_area)) return var/list/fax_machines = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/fax) diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index c26325904910..da87d2a7b789 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -594,7 +594,7 @@ //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 + pack.order_flags |= ORDER_SPECIAL_ENABLED //Give robotics some radiation protection modules for modsuits var/datum/supply_pack/supply_pack_modsuits = new /datum/supply_pack/engineering/rad_protection_modules() diff --git a/code/datums/status_effects/_status_effect.dm b/code/datums/status_effects/_status_effect.dm index 17eb45e168fc..4a569858655b 100644 --- a/code/datums/status_effects/_status_effect.dm +++ b/code/datums/status_effects/_status_effect.dm @@ -3,19 +3,16 @@ /datum/status_effect /// The ID of the effect. ID is used in adding and removing effects to check for duplicates, among other things. var/id = "effect" - /// When set initially / in on_creation, this is how long the status effect lasts in deciseconds. - /// While processing, this becomes the world.time when the status effect will expire. - /// -1 = infinite duration. + /// This is how long the status effect lasts in deciseconds. + /// You can put STATUS_EFFECT_PERMANENT (or INFINITY) here for infinite duration. var/duration = STATUS_EFFECT_PERMANENT - /// 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 prevent ticks, and if duration is also unlimited (-1), stop processing wholesale. + /// This is how long between [proc/tick] calls in deciseconds. + /// This has to be a multiple of the [var/wait] of the subsystem this status effect is running on, which is based on [var/processing_speed]. + /// Putting STATUS_EFFECT_NO_TICK here will stop [proc/tick] calls, and if [var/duration] is STATUS_EFFECT_PERMANENT, it stops processing entirely. + /// Putting STATUS_EFFECT_AUTO_TICK here will make every subsystem tick call [proc/tick], making the tick interval depend entirely on [var/processing_speed] var/tick_interval = 1 SECONDS - ///If our tick intervals are set to be a dynamic value within a range, the lowerbound of said range - var/tick_interval_lowerbound - ///If our tick intervals are set to be a dynamic value within a range, the upperbound of said range - var/tick_interval_upperbound + /// The time until the next [proc/tick] call, gets set to [var/tick_interval] after every [proc/tick] call and decrements on every [proc/process] call. + var/time_until_next_tick /// The mob affected by the status effect. VAR_FINAL/mob/living/owner /// How many of the effect can be on one mob, and/or what happens when you try to add a duplicate. @@ -58,10 +55,9 @@ // we will optionally allow INFINITY, because i imagine it'll be convenient in some places, // but we'll still set it to -1 / STATUS_EFFECT_PERMANENT for proper unified handling duration = STATUS_EFFECT_PERMANENT - if(duration != STATUS_EFFECT_PERMANENT) - duration = world.time + duration + if(tick_interval != STATUS_EFFECT_NO_TICK) - tick_interval = world.time + tick_interval + time_until_next_tick = tick_interval if(alert_type) var/atom/movable/screen/alert/status_effect/new_alert = owner.throw_alert(id, alert_type) @@ -69,7 +65,7 @@ linked_alert = new_alert //so we can reference the alert, if we need to update_shown_duration() - if(duration > world.time || tick_interval > world.time) //don't process if we don't care + if(duration != STATUS_EFFECT_PERMANENT || tick_interval != STATUS_EFFECT_NO_TICK) //don't process if we don't care switch(processing_speed) if(STATUS_EFFECT_FAST_PROCESS) START_PROCESSING(SSfastprocess, src) @@ -108,7 +104,7 @@ if(!linked_alert || !show_duration) return - linked_alert.maptext = MAPTEXT_TINY_UNICODE("[round((duration - world.time)/10, 1)]s") + linked_alert.maptext = MAPTEXT_TINY_UNICODE("[round(duration / 10, 1)]s") // Status effect process. Handles adjusting its duration and ticks. // If you're adding processed effects, put them in [proc/tick] @@ -120,19 +116,23 @@ qdel(src) return + if (duration != STATUS_EFFECT_PERMANENT) + duration = max(0, duration - (seconds_per_tick SECONDS)) // doing it first means its more up to date for ticks to read + + if (tick_interval != STATUS_EFFECT_NO_TICK) + time_until_next_tick = max(0, time_until_next_tick - (seconds_per_tick SECONDS)) // same here + if(tick_interval == STATUS_EFFECT_AUTO_TICK) tick(seconds_per_tick) - else if(tick_interval != STATUS_EFFECT_NO_TICK && tick_interval < world.time) - var/tick_length = (tick_interval_upperbound && tick_interval_lowerbound) ? rand(tick_interval_lowerbound, tick_interval_upperbound) : initial(tick_interval) - tick(tick_length / (1 SECONDS)) - tick_interval = world.time + tick_length + else if(tick_interval != STATUS_EFFECT_NO_TICK && time_until_next_tick <= 0) + time_until_next_tick = tick_interval // same here as well + tick(tick_interval / 10) if(QDELING(src)) - // tick deleted us, no need to continue - return + return // tick deleted us, no need to continue if(duration != STATUS_EFFECT_PERMANENT) - if(duration < world.time) + if(duration <= 0) qdel(src) return update_shown_duration() @@ -179,16 +179,13 @@ /// Called before being fully removed (before on_remove) /// Returning FALSE will cancel removal -/datum/status_effect/proc/before_remove() +/datum/status_effect/proc/before_remove(...) return TRUE /// Called when a status effect of status_type STATUS_EFFECT_REFRESH /// has its duration refreshed in apply_status_effect - is passed New() args /datum/status_effect/proc/refresh(effect, ...) - var/original_duration = initial(duration) - if(original_duration == STATUS_EFFECT_PERMANENT) - return - duration = world.time + original_duration + duration = initial(duration) /// Adds nextmove modifier multiplicatively to the owner while applied /datum/status_effect/proc/nextmove_modifier() @@ -208,13 +205,14 @@ if(!heal_flag_necessary || (heal_flags & heal_flag_necessary)) qdel(src) -/// Remove [seconds] of duration from the status effect, qdeling / ending if we eclipse the current world time. +/// Removes [seconds] of duration from the status effect. +/// Returns whether or not the status effect was qdeleted due to running out of duration. /datum/status_effect/proc/remove_duration(seconds) if(duration == STATUS_EFFECT_PERMANENT) // Infinite duration return FALSE - duration -= seconds - if(duration <= world.time) + duration -= (seconds SECONDS) + if(duration <= 0) qdel(src) return TRUE diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 6b15ee87de9b..3a999b01e6fe 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -66,10 +66,10 @@ return 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.adjust_brute_loss(-grace_heal * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += owner.adjust_fire_loss(-grace_heal * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += owner.adjust_tox_loss(-grace_heal * seconds_between_ticks, forced = TRUE) + need_mob_update += owner.adjust_oxy_loss(-(grace_heal * 2) * seconds_between_ticks, updating_health = FALSE, forced = TRUE) if(need_mob_update) owner.updatehealth() @@ -160,9 +160,9 @@ return 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) + need_mob_update += owner.adjust_brute_loss(-4 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjust_fire_loss(-2 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjust_oxy_loss(-4 * seconds_between_ticks, updating_health = FALSE) if(need_mob_update) owner.updatehealth() @@ -236,7 +236,7 @@ var/skill_level_boost = (new_owner.mind?.get_skill_level(/datum/skill/athletics) - 1) * 2 SECONDS bonus_time = (bonus_time + food_boost + skill_level_boost) * modifier - var/exhaustion_limit = new_owner.mind?.get_skill_modifier(/datum/skill/athletics, SKILL_VALUE_MODIFIER) + world.time + var/exhaustion_limit = new_owner.mind?.get_skill_modifier(/datum/skill/athletics, SKILL_VALUE_MODIFIER) if(duration + bonus_time >= exhaustion_limit) duration = exhaustion_limit to_chat(new_owner, span_userdanger("Your muscles are exhausted! Might be a good idea to sleep...")) @@ -266,14 +266,15 @@ /atom/movable/screen/alert/status_effect/exercised name = "Exercise" desc = "You feel well exercised! Sleeping will improve your fitness." - icon_state = "exercised" + use_user_hud_icon = TRUE + overlay_state = "exercised" //Hippocratic Oath: Applied when the Rod of Asclepius is activated. /datum/status_effect/hippocratic_oath id = "Hippocratic Oath" status_type = STATUS_EFFECT_UNIQUE duration = STATUS_EFFECT_PERMANENT - tick_interval = 2.5 SECONDS + tick_interval = 2.6 SECONDS alert_type = null var/datum/component/aura_healing/aura_healing @@ -299,16 +300,12 @@ ) //Makes the user passive, it's in their oath not to harm! - owner.add_traits(list(TRAIT_PACIFISM, TRAIT_HIPPOCRATIC_OATH), HIPPOCRATIC_OATH_TRAIT) - var/datum/atom_hud/med_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - med_hud.show_to(owner) + owner.add_traits(list(TRAIT_PACIFISM, TRAIT_HIPPOCRATIC_OATH, TRAIT_MEDICAL_HUD), HIPPOCRATIC_OATH_TRAIT) return ..() /datum/status_effect/hippocratic_oath/on_remove() QDEL_NULL(aura_healing) - owner.remove_traits(list(TRAIT_PACIFISM, TRAIT_HIPPOCRATIC_OATH), HIPPOCRATIC_OATH_TRAIT) - var/datum/atom_hud/med_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - med_hud.hide_from(owner) + owner.remove_traits(list(TRAIT_PACIFISM, TRAIT_HIPPOCRATIC_OATH, TRAIT_MEDICAL_HUD), HIPPOCRATIC_OATH_TRAIT) /datum/status_effect/hippocratic_oath/get_examine_text() return span_notice("[owner.p_They()] seem[owner.p_s()] to have an aura of healing and helpfulness about [owner.p_them()].") @@ -343,12 +340,12 @@ if(itemUser.health < itemUser.maxHealth) new /obj/effect/temp_visual/heal(get_turf(itemUser), "#375637") 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(-3 * 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.adjust_brute_loss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += itemUser.adjust_fire_loss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += itemUser.adjust_tox_loss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) //Because Slime People are people too + need_mob_update += itemUser.adjust_oxy_loss(-0.6 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) + need_mob_update += itemUser.adjust_stamina_loss(-3 * seconds_between_ticks, updating_stamina = FALSE, forced = TRUE) + need_mob_update += itemUser.adjust_organ_loss(ORGAN_SLOT_BRAIN, -0.6 * seconds_between_ticks) if(need_mob_update) itemUser.updatehealth() @@ -381,7 +378,9 @@ /atom/movable/screen/alert/status_effect/regenerative_core name = "Regenerative Core Tendrils" desc = "You can move faster than your broken body could normally handle!" - icon_state = "regenerative_core" + use_user_hud_icon = TRUE + overlay_icon = 'icons/obj/medical/organs/mining_organs.dmi' + overlay_state = "legion_core_stable" /datum/status_effect/regenerative_core id = "Regenerative Core" @@ -392,8 +391,8 @@ /datum/status_effect/regenerative_core/on_apply() owner.add_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) - owner.adjustBruteLoss(-25) - owner.adjustFireLoss(-25) + owner.adjust_brute_loss(-25) + owner.adjust_fire_loss(-25) owner.fully_heal(HEAL_CC_STATUS) owner.bodytemperature = owner.get_body_temp_normal() if(ishuman(owner)) @@ -423,7 +422,8 @@ /atom/movable/screen/alert/status_effect/lightningorb name = "Lightning Orb" desc = "The speed surges through you!" - icon_state = "lightningorb" + use_user_hud_icon = TRUE + overlay_state = "lightningorb" /datum/status_effect/mayhem id = "Mayhem" @@ -529,7 +529,7 @@ var/mob/living/simple_animal/healthy_animal = owner healthy_animal.adjustHealth(-(health_increase * healing_modifier)) else - owner.adjustBruteLoss(-(health_increase * healing_modifier)) + owner.adjust_brute_loss(-(health_increase * healing_modifier)) /datum/status_effect/limited_buff/health_buff/maxed_out() . = ..() @@ -549,10 +549,10 @@ return 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) + need_mob_update += owner.adjust_brute_loss(-2 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjust_fire_loss(-2 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjust_oxy_loss(-4 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjust_stamina_loss(-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 @@ -561,7 +561,8 @@ /atom/movable/screen/alert/status_effect/nest_sustenance 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" + use_user_hud_icon = TRUE + overlay_state = "nest_life" /** * Granted to wizards upon satisfying the cheese sacrifice during grand rituals. @@ -571,12 +572,7 @@ id = "blessing_of_insanity" duration = STATUS_EFFECT_PERMANENT tick_interval = STATUS_EFFECT_NO_TICK - 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 + alert_type = null /datum/status_effect/blessing_of_insanity/on_apply() if(ishuman(owner)) @@ -645,7 +641,8 @@ /atom/movable/screen/alert/status_effect/radiation_immunity name = "Radiation shielding" desc = "You're immune to radiation, get settled quick!" - icon_state = "radiation_shield" + use_user_hud_icon = TRUE + overlay_state = "radiation_shield" /// Throw an alert we're in darkness!! Nightvision can make it hard to tell so this is useful /datum/status_effect/shadow @@ -676,4 +673,5 @@ /atom/movable/screen/alert/status_effect/shadow_regeneration name = "Shadow Regeneration" desc = "Bathed in soothing darkness, you will slowly heal yourself" - icon_state = "lightless" + use_user_hud_icon = TRUE + overlay_state = "lightless" diff --git a/code/datums/status_effects/buffs/food/_food_effect.dm b/code/datums/status_effects/buffs/food/_food_effect.dm index fe63df29e3a8..15e6d9149294 100644 --- a/code/datums/status_effects/buffs/food/_food_effect.dm +++ b/code/datums/status_effects/buffs/food/_food_effect.dm @@ -14,10 +14,10 @@ if(isnum(timeout_mod)) duration *= timeout_mod if(istype(linked_alert, /atom/movable/screen/alert/status_effect/food)) - linked_alert.icon_state = "[linked_alert.base_icon_state]_[strength]" + linked_alert.overlay_state = "food_buff_[strength]" /atom/movable/screen/alert/status_effect/food name = "Hand-crafted meal" desc = "Eating it made me feel better." - icon_state = "food_buff_1" - base_icon_state = "food_buff" + use_user_hud_icon = TRUE + overlay_state = "food_buff_1" diff --git a/code/datums/status_effects/buffs/food/chilling.dm b/code/datums/status_effects/buffs/food/chilling.dm index 0827ac5a4afd..d2fb089f11fb 100644 --- a/code/datums/status_effects/buffs/food/chilling.dm +++ b/code/datums/status_effects/buffs/food/chilling.dm @@ -9,6 +9,7 @@ /atom/movable/screen/alert/status_effect/icecream_chilling name = "Cooling Off" - desc = "Nothing beats a cup of ice cream during hot, plasma-floody day..." - icon_state = "food_icecream" + desc = "Nothing beats a cup of ice cream during hot, plasma-flooded day..." + use_user_hud_icon = TRUE + overlay_state = "food_icecream" diff --git a/code/datums/status_effects/buffs/food/grant_trait.dm b/code/datums/status_effects/buffs/food/grant_trait.dm index 46d4b060739d..0b1e65dc848b 100644 --- a/code/datums/status_effects/buffs/food/grant_trait.dm +++ b/code/datums/status_effects/buffs/food/grant_trait.dm @@ -22,7 +22,8 @@ /atom/movable/screen/alert/status_effect/shockimmune name = "Grounded" desc = "That meal made me feel like a superconductor..." - icon_state = "shock_immune" + use_user_hud_icon = TRUE + overlay_state = "shock_immune" /datum/status_effect/food/trait/mute alert_type = /atom/movable/screen/alert/status_effect/mute @@ -31,7 +32,8 @@ /atom/movable/screen/alert/status_effect/mute name = "..." desc = "..." - icon_state = "mute" + use_user_hud_icon = TRUE + overlay_state = "mute" /datum/status_effect/food/trait/ashstorm_immune alert_type = /atom/movable/screen/alert/status_effect/ashstorm_immune @@ -40,7 +42,8 @@ /atom/movable/screen/alert/status_effect/ashstorm_immune name = "Ashstorm-proof" desc = "That meal makes me feel born on Lavaland." - icon_state = "ashstorm_immune" + use_user_hud_icon = TRUE + overlay_state = "ashstorm_immune" /datum/status_effect/food/trait/waddle alert_type = /atom/movable/screen/alert/status_effect/waddle @@ -53,4 +56,6 @@ /atom/movable/screen/alert/status_effect/waddle name = "Waddling" desc = "That meal makes me want to joke around." - icon_state = "waddle" + use_user_hud_icon = TRUE + overlay_icon = /obj/item/clothing/mask/gas/clown_hat::icon + overlay_state = /obj/item/clothing/mask/gas/clown_hat::icon_state diff --git a/code/datums/status_effects/buffs/food/speech.dm b/code/datums/status_effects/buffs/food/speech.dm index 9878f0ebf35b..95598c03bb93 100644 --- a/code/datums/status_effects/buffs/food/speech.dm +++ b/code/datums/status_effects/buffs/food/speech.dm @@ -28,7 +28,8 @@ /atom/movable/screen/alert/status_effect/italian_speech name = "Linguini Embrace" desc = "You feel a sudden urge to gesticulate wildly." - icon_state = "food_italian" + use_user_hud_icon = TRUE + overlay_state = "food_italian" /datum/status_effect/food/speech/french alert_type = /atom/movable/screen/alert/status_effect/french_speech @@ -56,4 +57,5 @@ /atom/movable/screen/alert/status_effect/french_speech name = "Café Chic" desc = "Suddenly, everything seems worthy of a passionate debate." - icon_state = "food_french" + use_user_hud_icon = TRUE + overlay_state = "food_french" diff --git a/code/datums/status_effects/buffs/stop_drop_roll.dm b/code/datums/status_effects/buffs/stop_drop_roll.dm index e7ff393a1dd5..a7ca2109769a 100644 --- a/code/datums/status_effects/buffs/stop_drop_roll.dm +++ b/code/datums/status_effects/buffs/stop_drop_roll.dm @@ -3,13 +3,14 @@ alert_type = null tick_interval = 0.8 SECONDS processing_speed = STATUS_EFFECT_PRIORITY + /// bar updates depending on how "on fire" you are + VAR_FINAL/datum/progressbar/bar /datum/status_effect/stop_drop_roll/on_apply() if(!iscarbon(owner)) return FALSE - var/actual_interval = initial(tick_interval) - if(!owner.Knockdown(actual_interval * 2, ignore_canstun = TRUE) || owner.body_position != LYING_DOWN) + if(!owner.Knockdown(tick_interval * 2, ignore_canstun = TRUE) || owner.body_position != LYING_DOWN) to_chat(owner, span_warning("You try to stop, drop, and roll - but you can't get on the ground!")) return FALSE @@ -17,6 +18,7 @@ RegisterSignal(owner, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(body_position_changed)) ADD_TRAIT(owner, TRAIT_HANDS_BLOCKED, TRAIT_STATUS_EFFECT(id)) // they're kinda busy! + bar = new(owner, MAX_FIRE_STACKS, owner, get_bar_progress()) start_rolling() for (var/obj/item/dropped in owner.loc) @@ -26,6 +28,12 @@ /datum/status_effect/stop_drop_roll/on_remove() UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_LIVING_SET_BODY_POSITION)) REMOVE_TRAIT(owner, TRAIT_HANDS_BLOCKED, TRAIT_STATUS_EFFECT(id)) + bar.end_progress() + bar = null + +/// Get the current progress for the progress bar +/datum/status_effect/stop_drop_roll/proc/get_bar_progress() + return MAX_FIRE_STACKS - max(0, owner.fire_stacks) /datum/status_effect/stop_drop_roll/proc/start_rolling() owner.visible_message( @@ -40,12 +48,11 @@ qdel(src) return - var/actual_interval = initial(tick_interval) - if(!owner.Knockdown(actual_interval * 1.2, ignore_canstun = TRUE)) + if(!owner.Knockdown(tick_interval * 1.2, ignore_canstun = TRUE)) stop_rolling() return - owner.spin(spintime = actual_interval, speed = actual_interval / 4) + owner.spin(spintime = tick_interval, speed = tick_interval / 4) if(!reduce_firestacks(1)) return @@ -54,6 +61,7 @@ /// Return TRUE to stop the us from rolling. /datum/status_effect/stop_drop_roll/proc/reduce_firestacks(amt = 1) owner.adjust_fire_stacks(-1 * amt) + bar.update(get_bar_progress()) return owner.fire_stacks <= 0 /// Called when we just, stop rolling, due to movement or other reasons. Maybe still on fire, maybe not. @@ -87,6 +95,10 @@ src.hallucination_weakref = hallucination_weakref return ..() +/datum/status_effect/stop_drop_roll/hallucinating/get_bar_progress() + var/datum/hallucination/fire/hallucination = hallucination_weakref?.resolve() + return 20 - max(0, hallucination?.fake_firestacks) + /datum/status_effect/stop_drop_roll/hallucinating/start_rolling() owner.visible_message( span_danger("[owner] starts rolling around on the floor, flailing about!"), @@ -100,6 +112,7 @@ return TRUE hallucination.fake_firestacks += (-1 * amt) + bar.update(get_bar_progress()) if(hallucination.fake_firestacks <= 0) hallucination.clear_fire() return TRUE diff --git a/code/datums/status_effects/buffs/xray.dm b/code/datums/status_effects/buffs/xray.dm new file mode 100644 index 000000000000..cdeb909d6234 --- /dev/null +++ b/code/datums/status_effects/buffs/xray.dm @@ -0,0 +1,30 @@ +/** + * Effectively grants a temporary form of x-ray with a cooldown period. + */ +/datum/status_effect/temporary_xray + id = "temp xray" + status_type = STATUS_EFFECT_UNIQUE + alert_type = null + duration = 10 SECONDS + show_duration = TRUE + +/datum/status_effect/temporary_xray/on_apply() + ADD_TRAIT(owner, TRAIT_XRAY_VISION, TRAIT_STATUS_EFFECT(id)) + owner.update_sight() + return TRUE + +/datum/status_effect/temporary_xray/on_remove() + REMOVE_TRAIT(owner, TRAIT_XRAY_VISION, TRAIT_STATUS_EFFECT(id)) + owner.update_sight() + +/datum/status_effect/temporary_xray/eldritch // Heretic subtype that plays a sound and screen alert + alert_type = /atom/movable/screen/alert/status_effect/temporary_xray + +/datum/status_effect/temporary_xray/eldritch/on_apply() + . = ..() + SEND_SOUND(owner, 'sound/effects/hallucinations/i_see_you1.ogg') + +/atom/movable/screen/alert/status_effect/temporary_xray + name = "Eldritch Sight" + desc = "You get a glimpse of something new..." + icon_state = "influence" diff --git a/code/datums/status_effects/cuffed_item.dm b/code/datums/status_effects/cuffed_item.dm new file mode 100644 index 000000000000..c356f377f3d5 --- /dev/null +++ b/code/datums/status_effects/cuffed_item.dm @@ -0,0 +1,164 @@ +/** + * The status effect given by the cuffable_item. + * It basically binds an item to your arm, basically making it undroppable until the cuffs or item are removed, usually done by one of: + * - clicking the status alert + * - using the topic hyperlink + * - strip menu for others + * - alternatively, dismemberment or destroying the item + */ +/datum/status_effect/cuffed_item + id = "cuffed_item" + status_type = STATUS_EFFECT_MULTIPLE + alert_type = /atom/movable/screen/alert/status_effect/cuffed_item + ///Reference to the item stuck into the player's hand + var/obj/item/cuffed + ///Reference to the pair of handcuffs used to bind the item + var/obj/item/restraints/handcuffs/cuffs + +/datum/status_effect/cuffed_item/on_creation(mob/living/new_owner, obj/item/cuffed, obj/item/restraints/handcuffs/cuffs) + src.cuffed = cuffed + src.cuffs = cuffs + . = ..() //throws the alert and all + linked_alert.update_appearance(UPDATE_OVERLAYS) + +/datum/status_effect/cuffed_item/on_apply() + if(HAS_TRAIT_FROM(cuffed, TRAIT_NODROP, CUFFED_ITEM_TRAIT)) + qdel(src) + return FALSE + owner.temporarilyRemoveItemFromInventory(cuffs, force = TRUE) + if(!owner.is_holding(cuffed) && !owner.put_in_hands(cuffed)) + owner.put_in_hands(cuffs) + qdel(src) + return FALSE + + ADD_TRAIT(cuffed, TRAIT_NODROP, CUFFED_ITEM_TRAIT) + + RegisterSignals(cuffed, list(COMSIG_ITEM_DROPPED, COMSIG_MOVABLE_MOVED, COMSIG_QDELETING), PROC_REF(on_displaced)) + RegisterSignal(cuffed, COMSIG_ATOM_UPDATE_APPEARANCE, PROC_REF(on_item_update_appearance)) + RegisterSignal(cuffed, COMSIG_ATOM_EXAMINE, PROC_REF(cuffed_reminder)) + RegisterSignal(cuffed, COMSIG_TOPIC, PROC_REF(topic_handler)) + RegisterSignal(cuffed, COMSIG_ITEM_GET_STRIPPABLE_ALT_ACTIONS, PROC_REF(get_strippable_action)) + RegisterSignal(cuffed, COMSIG_ITEM_STRIPPABLE_ALT_ACTION, PROC_REF(do_strippable_action)) + + RegisterSignals(cuffs, list(COMSIG_ITEM_EQUIPPED, COMSIG_MOVABLE_MOVED, COMSIG_QDELETING), PROC_REF(on_displaced)) + RegisterSignal(cuffs, COMSIG_ATOM_UPDATE_APPEARANCE, PROC_REF(on_item_update_appearance)) + + RegisterSignal(owner, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examine_more)) + + owner.log_message("bound [src] to themselves with restraints", LOG_GAME) + + return TRUE + +/datum/status_effect/cuffed_item/on_remove() + //Prevent possible recursions from these signals + UnregisterSignal(cuffed, list(COMSIG_ITEM_DROPPED, COMSIG_MOVABLE_MOVED, COMSIG_QDELETING)) + UnregisterSignal(cuffs, list(COMSIG_ITEM_EQUIPPED, COMSIG_MOVABLE_MOVED, COMSIG_QDELETING)) + + REMOVE_TRAIT(cuffed, TRAIT_NODROP, CUFFED_ITEM_TRAIT) + cuffed = null + + if(!QDELETED(cuffs)) + cuffs.on_uncuffed(wearer = owner) + if(!QDELETED(owner) && cuffs.loc == owner && !(cuffs in owner.get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD))) + cuffs.forceMove(owner.drop_location()) + cuffs = null + +///Called when someone examines the owner twice, so they can know if someone has a cuffed item +/datum/status_effect/cuffed_item/proc/on_examine_more(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + examine_list += span_warning("[cuffed.examine_title(user)] is bound to [owner.p_their()] [owner.get_held_index_name(owner.get_held_index_of_item(cuffed))] by [cuffs.examine_title(user)]") + +///What happens if one of the items is moved away from the mob +/datum/status_effect/cuffed_item/proc/on_displaced(datum/source) + SIGNAL_HANDLER + qdel(src) + +///Tell the player that the item is stuck to their hands someway. Also another way to trigger the try_remove_cuffs proc. +/datum/status_effect/cuffed_item/proc/cuffed_reminder(obj/item/item, mob/user, list/examine_texts) + SIGNAL_HANDLER + + if(user == owner) + examine_texts += span_notice("[item.p_Theyre()] cuffed to you by \a [cuffs]. You can remove them.") + +/// This mainly exists as a fallback in the rare case the alert icon is not reachable (too many alerts?). You should be somewhat able to examine items while blind so all good. +/datum/status_effect/cuffed_item/proc/topic_handler(atom/source, user, href_list) + SIGNAL_HANDLER + + if(user == owner && href_list["remove_cuffs_item"]) + INVOKE_ASYNC(src, PROC_REF(try_remove_cuffs), user) + +/datum/status_effect/cuffed_item/proc/get_strippable_action(obj/item/source, atom/owner, mob/user, list/alt_actions) + SIGNAL_HANDLER + alt_actions += "remove_item_cuffs" + +/datum/status_effect/cuffed_item/proc/do_strippable_action(obj/item/source, atom/owner, mob/user, action_key) + SIGNAL_HANDLER + if(action_key != "remove_item_cuffs") + return NONE + if(source != cuffed || !isliving(user)) + return NONE + + INVOKE_ASYNC(src, PROC_REF(try_remove_cuffs), user) + return COMPONENT_ALT_ACTION_DONE + +///The main proc responsible for attempting to remove the hancfuss. +/datum/status_effect/cuffed_item/proc/try_remove_cuffs(mob/living/user) + + var/interaction_key = REF(src) + if(LAZYACCESS(user.do_afters, interaction_key)) + return FALSE + + if(!(user.mobility_flags & MOBILITY_USE) || (user != owner && !owner.IsReachableBy(user))) + owner.balloon_alert(user, "can't do it right now!") + return FALSE + + if(user != owner) + owner.visible_message(span_notice("[user] tries to remove [cuffs] binding [cuffed] to [owner]"), span_warning("[user] is trying to remove [cuffs] binding [cuffed] to you.")) + + owner.balloon_alert(user, "removing cuffs...") + playsound(owner, cuffs.cuffsound, 30, TRUE, -2) + if(!do_after(user, cuffs.get_handcuff_time(user) * 1.5, owner, interaction_key = interaction_key) || QDELETED(src)) + owner.balloon_alert(user, "interrupted!") + return FALSE + + if(user != owner) + owner.visible_message(span_notice("[user] removes [cuffs] binding [cuffed] to [owner]"), span_warning("[user] removes [cuffs] binding [cuffed] to you.")) + + log_combat(user, owner, "removed restraints binding [cuffed] to") + + var/obj/item/restraints/handcuffs/ref_cuffs = cuffs + ref_cuffs.forceMove(owner.drop_location()) //This will cause the status effect to delete itself, which unsets the 'cuffs' var + user.put_in_hands(ref_cuffs) + owner.balloon_alert(user, "cuffs removed from item") + + return TRUE + +///Whenever the appearance of one of either cuffed or cuffs is updated, update the alert appearance +/datum/status_effect/cuffed_item/proc/on_item_update_appearance(datum/source) + SIGNAL_HANDLER + linked_alert.update_appearance(UPDATE_OVERLAYS) + +///The status alert linked to the cuffed_item status effect +/atom/movable/screen/alert/status_effect/cuffed_item + name = "Cuffed Item" + desc = "You've an item firmly cuffed to your arm. You probably won't be accidentally dropping it somewhere anytime soon." + use_user_hud_icon = TRUE + clickable_glow = TRUE + click_master = FALSE + +/atom/movable/screen/alert/status_effect/cuffed_item/update_overlays() + . = ..() + if(!attached_effect) + return + var/datum/status_effect/cuffed_item/effect = attached_effect + . += add_atom_icon(effect.cuffed) + var/mutable_appearance/cuffs_appearance = add_atom_icon(effect.cuffs) + cuffs_appearance.transform *= 0.8 + . += cuffs_appearance + +/atom/movable/screen/alert/status_effect/cuffed_item/Click(location, control, params) + . = ..() + if(.) + var/datum/status_effect/cuffed_item/effect = attached_effect + effect?.try_remove_cuffs(owner) diff --git a/code/datums/status_effects/debuffs/choke.dm b/code/datums/status_effects/debuffs/choke.dm index e8af4b1b94dc..7f87fba7abda 100644 --- a/code/datums/status_effects/debuffs/choke.dm +++ b/code/datums/status_effects/debuffs/choke.dm @@ -66,7 +66,7 @@ if(flaming) ash = new(owner, /particles/smoke/ash, PARTICLE_ATTACH_MOB) var/clear_in = rand(15 SECONDS, 25 SECONDS) - if(duration != -1) + if(duration != STATUS_EFFECT_PERMANENT) clear_in = min(duration, clear_in) addtimer(CALLBACK(src, PROC_REF(clear_flame)), clear_in) return TRUE @@ -163,7 +163,7 @@ /datum/status_effect/choke/proc/attempt_eat(mob/source, atom/eating) SIGNAL_HANDLER source.balloon_alert(source, "can't get it down!") - return COMSIG_CARBON_BLOCK_EAT + return BLOCK_EAT_ATTEMPT /datum/status_effect/choke/proc/helped(mob/source, mob/helping) SIGNAL_HANDLER @@ -264,7 +264,7 @@ // If we ain't starting, deal a tad bit of brute, as a treat // Note, we attempt to process 10 times a second, so over 7 seconds this'll deal 14 brute if(!before_work) - victim.adjustBruteLoss(0.2) + victim.adjust_brute_loss(0.2) return TRUE /datum/status_effect/choke/tick(seconds_between_ticks) diff --git a/code/datums/status_effects/debuffs/confusion.dm b/code/datums/status_effects/debuffs/confusion.dm index 881eb6a5c36c..d7e6f47af4a2 100644 --- a/code/datums/status_effects/debuffs/confusion.dm +++ b/code/datums/status_effects/debuffs/confusion.dm @@ -27,7 +27,7 @@ SIGNAL_HANDLER // How much time is left in the duration, in seconds. - var/time_left = (duration - world.time) / 10 + var/time_left = duration / 10 var/direction = move_args[MOVE_ARG_DIRECTION] var/new_dir diff --git a/code/datums/status_effects/debuffs/cursed.dm b/code/datums/status_effects/debuffs/cursed.dm index 083bd678635e..da3a5371910c 100644 --- a/code/datums/status_effects/debuffs/cursed.dm +++ b/code/datums/status_effects/debuffs/cursed.dm @@ -2,7 +2,7 @@ /// 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 +/datum/status_effect/slot_machine_curse id = "cursed" alert_type = /atom/movable/screen/alert/status_effect/cursed remove_on_fullheal = TRUE @@ -20,7 +20,7 @@ /// The cached path of the particles we're using to smoke var/smoke_path = null -/datum/status_effect/grouped/cursed/on_apply() +/datum/status_effect/slot_machine_curse/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)) @@ -28,7 +28,7 @@ RegisterSignal(SSdcs, COMSIG_GLOB_CURSED_SLOT_MACHINE_WON, PROC_REF(clear_curses)) return ..() -/datum/status_effect/grouped/cursed/Destroy() +/datum/status_effect/slot_machine_curse/Destroy() UnregisterSignal(SSdcs, COMSIG_GLOB_CURSED_SLOT_MACHINE_WON) branded_hand = null if (smoke_path) @@ -36,7 +36,7 @@ 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) +/datum/status_effect/slot_machine_curse/proc/check_curses(mob/user, max_curse_amount) SIGNAL_HANDLER if(curse_count >= max_curse_amount) return SLOT_MACHINE_USE_CANCEL @@ -46,7 +46,7 @@ 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() +/datum/status_effect/slot_machine_curse/proc/update_curse_count() SIGNAL_HANDLER curse_count++ @@ -55,7 +55,7 @@ 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() +/datum/status_effect/slot_machine_curse/proc/handle_after_effects() if(QDELETED(src)) return @@ -114,7 +114,7 @@ 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() +/datum/status_effect/slot_machine_curse/proc/clear_curses() SIGNAL_HANDLER if(!isnull(branded_hand)) @@ -128,7 +128,7 @@ qdel(src) /// If our owner's stat changes, rapidly surge the damage chance. -/datum/status_effect/grouped/cursed/proc/on_stat_changed() +/datum/status_effect/slot_machine_curse/proc/on_stat_changed() SIGNAL_HANDLER if(owner.stat == CONSCIOUS || owner.stat == DEAD) // reset on these two states damage_chance = initial(damage_chance) @@ -138,13 +138,13 @@ 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) +/datum/status_effect/slot_machine_curse/proc/on_death(mob/living/source, gibbed) SIGNAL_HANDLER if(!gibbed && smoke_path) owner.remove_shared_particles(smoke_path) -/datum/status_effect/grouped/cursed/update_particles() +/datum/status_effect/slot_machine_curse/update_particles() var/particle_path = /particles/smoke/steam/mild switch(curse_count) if(2 to 3) @@ -160,7 +160,7 @@ owner.add_shared_particles(particle_path) smoke_path = particle_path -/datum/status_effect/grouped/cursed/tick(seconds_between_ticks) +/datum/status_effect/slot_machine_curse/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. @@ -178,12 +178,13 @@ /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" + use_user_hud_icon = TRUE + overlay_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 + var/datum/status_effect/slot_machine_curse/linked_effect = attached_effect + var/curses = linked_effect?.curse_count switch(curses) if(2) desc = "Your greed is catching up to you..." diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index 3ae33be7acd2..c39670d25a8d 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -124,8 +124,8 @@ return ..() /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 + if(owner.get_stamina_loss()) + owner.adjust_stamina_loss(-0.3) //reduce stamina loss by 0.3 per tick, 6 per 2 seconds //SLEEPING @@ -233,10 +233,10 @@ to_chat(carbon_owner, span_notice("You feel your fitness improving!")) if(health_ratio > 0.8) // only heals minor physical damage - need_mob_update += owner.adjustBruteLoss(-0.4 * sleep_quality * seconds_between_ticks, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) - need_mob_update += owner.adjustFireLoss(-0.4 * sleep_quality * seconds_between_ticks, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) - need_mob_update += owner.adjustToxLoss(-0.2 * sleep_quality * seconds_between_ticks, updating_health = FALSE, forced = TRUE, required_biotype = MOB_ORGANIC) - need_mob_update += owner.adjustStaminaLoss(min(-0.4 * sleep_quality * seconds_between_ticks, -0.4 * HEALING_SLEEP_DEFAULT * seconds_between_ticks), updating_stamina = FALSE) + need_mob_update += owner.adjust_brute_loss(-0.4 * sleep_quality * seconds_between_ticks, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += owner.adjust_fire_loss(-0.4 * sleep_quality * seconds_between_ticks, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + need_mob_update += owner.adjust_tox_loss(-0.2 * sleep_quality * seconds_between_ticks, updating_health = FALSE, forced = TRUE, required_biotype = MOB_ORGANIC) + need_mob_update += owner.adjust_stamina_loss(min(-0.4 * sleep_quality * 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) @@ -252,7 +252,8 @@ /atom/movable/screen/alert/status_effect/asleep name = "Asleep" desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are." - icon_state = "asleep" + use_user_hud_icon = TRUE + overlay_state = "asleep" //STASIS /datum/status_effect/grouped/stasis @@ -305,7 +306,8 @@ /atom/movable/screen/alert/status_effect/stasis name = "Stasis" desc = "Your biological functions have halted. You could live forever this way, but it's pretty boring." - icon_state = "stasis" + use_user_hud_icon = TRUE + overlay_state = "stasis" /datum/status_effect/his_wrath //does minor damage over time unless holding His Grace id = "his_wrath" @@ -330,9 +332,9 @@ qdel(src) return 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) + need_mob_update = owner.adjust_brute_loss(0.04 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjust_fire_loss(0.04 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += owner.adjust_tox_loss(0.08 * seconds_between_ticks, updating_health = FALSE, forced = TRUE) if(need_mob_update) owner.updatehealth() @@ -370,8 +372,8 @@ return FALSE marked_underlay = new() - marked_underlay.pixel_w = -owner.pixel_x - marked_underlay.pixel_z = -owner.pixel_y + marked_underlay.pixel_w = -(owner.base_pixel_x + owner.base_pixel_w) + marked_underlay.pixel_z = -(owner.base_pixel_y + owner.base_pixel_z) marked_underlay.transform *= 0.5 owner.vis_contents += marked_underlay animate(marked_underlay, ready_delay, transform = matrix() * 1.2, flags = CIRCULAR_EASING | EASE_IN) @@ -410,7 +412,7 @@ new /obj/effect/temp_visual/bleed(get_turf(owner)) /datum/status_effect/stacking/saw_bleed/threshold_cross_effect() - owner.adjustBruteLoss(bleed_damage) + owner.adjust_brute_loss(bleed_damage) new /obj/effect/temp_visual/bleed/explode(get_turf(owner)) for(var/splatter_dir in GLOB.alldirs) owner.create_splatter(splatter_dir) @@ -445,7 +447,7 @@ for(var/datum/wound/bleeding_thing as anything in throat.wounds) 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) + if(pregen_data.wounding_types_valid(WOUND_SLASH) && bleeding_thing.severity > WOUND_SEVERITY_MODERATE && bleeding_thing.blood_flow > 0) still_bleeding = TRUE break if(!still_bleeding) @@ -522,7 +524,7 @@ wasting_effect.alpha = 255 animate(wasting_effect, alpha = 0, time = 32) playsound(owner, 'sound/effects/curse/curse5.ogg', 20, TRUE, -1) - owner.adjustFireLoss(0.75) + owner.adjust_fire_loss(0.75) if(curse_flags & CURSE_GRASPING) if(effect_next_activation > world.time) @@ -566,7 +568,8 @@ /atom/movable/screen/alert/status_effect/trance name = "Trance" desc = "Everything feels so distant, and you can feel your thoughts forming loops inside your head..." - icon_state = "high" + use_user_hud_icon = TRUE + overlay_state = "high" /datum/status_effect/trance/tick(seconds_between_ticks) if(stun) @@ -692,7 +695,8 @@ /atom/movable/screen/alert/status_effect/convulsing name = "Shaky Hands" desc = "You've been zapped with something and your hands can't stop shaking! You can't seem to hold on to anything." - icon_state = "convulsing" + use_user_hud_icon = TRUE + overlay_state = "convulsing" /datum/status_effect/dna_melt id = "dna_melt" @@ -715,7 +719,8 @@ /atom/movable/screen/alert/status_effect/dna_melt name = "Genetic Breakdown" desc = "I don't feel so good. Your body can't handle the mutations! You have one minute to remove your mutations, or you will be met with a horrible fate." - icon_state = "dna_melt" + use_user_hud_icon = TRUE + overlay_state = "dna_melt" /datum/status_effect/go_away id = "go_away" @@ -763,7 +768,8 @@ /atom/movable/screen/alert/status_effect/go_away name = "TO THE STARS AND BEYOND!" desc = "I must go, my people need me!" - icon_state = "high" + use_user_hud_icon = TRUE + overlay_state = "high" /datum/status_effect/fake_virus id = "fake_virus" @@ -910,7 +916,8 @@ /atom/movable/screen/alert/status_effect/ants name = "Ants!" desc = span_warning("JESUS FUCKING CHRIST! CLICK TO GET THOSE THINGS OFF!") - icon_state = "antalert" + use_user_hud_icon = TRUE + overlay_state = "antalert" clickable_glow = TRUE /atom/movable/screen/alert/status_effect/ants/Click() @@ -990,7 +997,8 @@ /atom/movable/screen/alert/status_effect/discoordinated name = "Discoordinated" desc = "You can't seem to properly use anything..." - icon_state = "convulsing" + use_user_hud_icon = TRUE + overlay_state = "convulsing" /datum/status_effect/discoordinated/on_apply() ADD_TRAIT(owner, TRAIT_DISCOORDINATED_TOOL_USER, TRAIT_STATUS_EFFECT(id)) @@ -1028,7 +1036,8 @@ /atom/movable/screen/alert/status_effect/careful_driving name = "Careful Driving" desc = "That was close! You almost ran that one over!" - icon_state = "paralysis" + use_user_hud_icon = TRUE + overlay_state = "paralysis" /datum/movespeed_modifier/careful_driving multiplicative_slowdown = 3 @@ -1054,13 +1063,13 @@ /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" + use_user_hud_icon = TRUE + overlay_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 + victim.adjust_blood_volume(-5 * seconds_between_ticks, minimum = BLOOD_VOLUME_SURVIVE + 50) // 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, type_check = REAGENT_SUB_TYPE) @@ -1104,7 +1113,8 @@ /atom/movable/screen/alert/status_effect/designated_target name = "Designated Target" desc = "You've been lit up by some kind of bright energy! Wash it off to get rid of it, or you'll be a lot easier to hit!" - icon_state = "designated_target" + use_user_hud_icon = TRUE + overlay_state = "designated_target" /datum/status_effect/designated_target id = "designated_target" diff --git a/code/datums/status_effects/debuffs/decloning.dm b/code/datums/status_effects/debuffs/decloning.dm index 0f76f10f470d..074fc8ec1fc9 100644 --- a/code/datums/status_effects/debuffs/decloning.dm +++ b/code/datums/status_effects/debuffs/decloning.dm @@ -77,7 +77,8 @@ /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" + use_user_hud_icon = TRUE + overlay_state = "dna_melt" /datum/movespeed_modifier/decloning multiplicative_slowdown = 0.7 diff --git a/code/datums/status_effects/debuffs/dizziness.dm b/code/datums/status_effects/debuffs/dizziness.dm index b47083aa5e37..547ba44df502 100644 --- a/code/datums/status_effects/debuffs/dizziness.dm +++ b/code/datums/status_effects/debuffs/dizziness.dm @@ -26,7 +26,7 @@ /datum/status_effect/dizziness/tick(seconds_between_ticks) // How much time is left, in seconds - var/amount = (duration - world.time) / 10 + var/amount = duration / 10 if(amount <= 0) return diff --git a/code/datums/status_effects/debuffs/dna_transformation.dm b/code/datums/status_effects/debuffs/dna_transformation.dm index 46e125a391e8..bd2a079d6f8b 100644 --- a/code/datums/status_effects/debuffs/dna_transformation.dm +++ b/code/datums/status_effects/debuffs/dna_transformation.dm @@ -82,10 +82,10 @@ if(duration == STATUS_EFFECT_PERMANENT) return // Already paused - time_before_pause = duration - world.time + time_before_pause = duration duration = STATUS_EFFECT_PERMANENT // Resume if we're none of the above and also were paused else if(time_before_pause != -1) - duration = time_before_pause + world.time + duration = time_before_pause time_before_pause = -1 diff --git a/code/datums/status_effects/debuffs/drugginess.dm b/code/datums/status_effects/debuffs/drugginess.dm index 8730e0ccd6ec..e0b7a4da57f3 100644 --- a/code/datums/status_effects/debuffs/drugginess.dm +++ b/code/datums/status_effects/debuffs/drugginess.dm @@ -36,4 +36,5 @@ /atom/movable/screen/alert/status_effect/high name = "High" desc = "Whoa man, you're tripping balls! Careful you don't get addicted... if you aren't already." - icon_state = "high" + use_user_hud_icon = TRUE + overlay_state = "high" diff --git a/code/datums/status_effects/debuffs/drunk.dm b/code/datums/status_effects/debuffs/drunk.dm index 8202f526f26b..ca8a1ef98a2a 100644 --- a/code/datums/status_effects/debuffs/drunk.dm +++ b/code/datums/status_effects/debuffs/drunk.dm @@ -18,8 +18,8 @@ alert_type = null /// The level of drunkness we are currently at. var/drunk_value = 0 - /// If TRUE, drunk_value will be capped at 51, preventing serious damage - var/iron_liver = FALSE + /// If TRUE, drunk_value will be capped at 51, preventing serious damage + var/iron_liver = FALSE /datum/status_effect/inebriated/on_creation(mob/living/new_owner, drunk_value = 0) . = ..() @@ -108,6 +108,7 @@ . = ..() owner.sound_environment_override = SOUND_ENVIRONMENT_PSYCHOTIC owner.add_mood_event(id, /datum/mood_event/drunk, drunk_value) + owner.clear_mood_event("[id]_after") RegisterSignal(owner, COMSIG_MOB_FIRED_GUN, PROC_REF(drunk_gun_fired)) /datum/status_effect/inebriated/drunk/on_remove() @@ -122,6 +123,8 @@ /// Clears any side effects we set due to being drunk. /datum/status_effect/inebriated/drunk/proc/clear_effects() owner.clear_mood_event(id) + if(!QDELING(owner) && HAS_PERSONALITY(owner, /datum/personality/bibulous)) + owner.add_mood_event("[id]_after", /datum/mood_event/drunk_after) if(owner.sound_environment_override == SOUND_ENVIRONMENT_PSYCHOTIC) owner.sound_environment_override = SOUND_ENVIRONMENT_NONE @@ -198,20 +201,20 @@ // Over 81, we will gain constant toxloss if(drunk_value >= 81) - owner.adjustToxLoss(1) + owner.adjust_tox_loss(1) if(owner.stat == CONSCIOUS && prob(5)) to_chat(owner, span_warning("Maybe you should lie down for a bit...")) // Over 91, we gain even more toxloss, brain damage, and have a chance of dropping into a long sleep if(drunk_value >= 91) - owner.adjustToxLoss(1) - owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.4) + owner.adjust_tox_loss(1) + owner.adjust_organ_loss(ORGAN_SLOT_BRAIN, 0.4) 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) + owner.adjust_tox_loss(2) /datum/status_effect/inebriated/drunk/proc/attempt_to_blackout() var/mob/living/carbon/drunkard = owner @@ -233,7 +236,8 @@ name = "Drunk" desc = "All that alcohol you've been drinking is impairing your speech, \ motor skills, and mental cognition. Make sure to act like it." - icon_state = "drunk" + use_user_hud_icon = TRUE + overlay_state = "drunk" #undef BALLMER_PEAK_LOW_END #undef BALLMER_PEAK_HIGH_END diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index 3367eb8176ca..b4b46a8a1c25 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -170,6 +170,7 @@ var/decay_multiplier = HAS_TRAIT(owner, TRAIT_HUSK) ? 2 : 1 // husks decay twice as fast adjust_stacks(owner.fire_stack_decay_rate * decay_multiplier * seconds_between_ticks) + SEND_SIGNAL(owner, COMSIG_FIRE_STACKS_UPDATED, stacks) if(stacks <= 0) qdel(src) @@ -280,7 +281,7 @@ owner.clear_mood_event("on_fire") SEND_SIGNAL(owner, COMSIG_LIVING_EXTINGUISHED, owner) cache_stacks() - for(var/obj/item/equipped in (owner.get_equipped_items(INCLUDE_HELD))) + for(var/obj/item/equipped as anything in owner.get_equipped_items(INCLUDE_HELD|INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT)) equipped.extinguish() /datum/status_effect/fire_handler/fire_stacks/on_remove() diff --git a/code/datums/status_effects/debuffs/genetic_damage.dm b/code/datums/status_effects/debuffs/genetic_damage.dm index 9eb90b917b7a..c0ae16d4082e 100644 --- a/code/datums/status_effects/debuffs/genetic_damage.dm +++ b/code/datums/status_effects/debuffs/genetic_damage.dm @@ -39,7 +39,7 @@ return if(total_damage >= minimum_before_tox_damage) - owner.adjustToxLoss(toxin_damage_per_second * seconds_between_ticks) + owner.adjust_tox_loss(toxin_damage_per_second * seconds_between_ticks) total_damage -= remove_per_second * seconds_between_ticks if(total_damage <= 0) diff --git a/code/datums/status_effects/debuffs/hallucination.dm b/code/datums/status_effects/debuffs/hallucination.dm index e5528a663821..9c40203c1dd7 100644 --- a/code/datums/status_effects/debuffs/hallucination.dm +++ b/code/datums/status_effects/debuffs/hallucination.dm @@ -94,7 +94,7 @@ var/lower_cd = lower_tick_interval var/upper_cd = upper_tick_interval if(variable_tier) - var/seconds_left = (duration - world.time) / 10 + var/seconds_left = duration / 10 switch(seconds_left) if(0 to 20) max_hallucination_tier = HALLUCINATION_TIER_COMMON diff --git a/code/datums/status_effects/debuffs/heart_attack.dm b/code/datums/status_effects/debuffs/heart_attack.dm index 520443f15849..592162ea0f89 100644 --- a/code/datums/status_effects/debuffs/heart_attack.dm +++ b/code/datums/status_effects/debuffs/heart_attack.dm @@ -47,12 +47,12 @@ if(time_until_stoppage > ATTACK_STAGE_THREE) if(SPT_PROB(5, seconds_between_ticks)) owner.playsound_local(owner, 'sound/effects/singlebeat.ogg', 25, FALSE, use_reverb = FALSE) - owner.adjustStaminaLoss(5) + owner.adjust_stamina_loss(5) if(time_until_stoppage <= ATTACK_STAGE_TWO && time_until_stoppage > ATTACK_STAGE_THREE) //This coughing gets replaced with worse coughing, no need to stack it. if(SPT_PROB(10, seconds_between_ticks)) owner.emote("cough") - owner.adjustStaminaLoss(10) + owner.adjust_stamina_loss(10) oxyloss_sum += 4 if(time_until_stoppage <= ATTACK_STAGE_THREE) //At this point, we start with chat messages and make it clear that something is very wrong. @@ -69,7 +69,7 @@ if(SPT_PROB(8, seconds_between_ticks)) to_chat(owner, span_danger("You feel very weak and dizzy...")) owner.adjust_confusion_up_to(6 SECONDS, 10 SECONDS) - owner.adjustStaminaLoss(20) + owner.adjust_stamina_loss(20) owner.emote("cough") oxyloss_sum += 8 @@ -79,7 +79,7 @@ to_chat(owner, span_userdanger("It feels like you're shutting down...")) owner.adjust_dizzy_up_to(4 SECONDS, 10 SECONDS) owner.adjust_eye_blur_up_to(4 SECONDS, 20 SECONDS) - owner.adjustStaminaLoss(20) + owner.adjust_stamina_loss(20) if(SPT_PROB(5, seconds_between_ticks)) owner.emote("cough") @@ -94,8 +94,8 @@ owner.Paralyze(1 SECONDS) oxyloss_sum += 3 - if(owner.getOxyLoss() < OXYLOSS_MAXIMUM) //A bad enough roll on the verge of passing out might still push you over into unconciousness for a few seconds...? - owner.adjustOxyLoss(oxyloss_sum) + if(owner.get_oxy_loss() < OXYLOSS_MAXIMUM) //A bad enough roll on the verge of passing out might still push you over into unconciousness for a few seconds...? + owner.adjust_oxy_loss(oxyloss_sum) if(time_until_stoppage <= 0) if(owner.stat == CONSCIOUS) diff --git a/code/datums/status_effects/debuffs/hooked.dm b/code/datums/status_effects/debuffs/hooked.dm index 41583e8b5f4d..cc5aa30fadba 100644 --- a/code/datums/status_effects/debuffs/hooked.dm +++ b/code/datums/status_effects/debuffs/hooked.dm @@ -22,7 +22,8 @@ /atom/movable/screen/alert/status_effect/hooked name = "Snagged By Hook" desc = "You're being caught like a fish by some asshat! Click to safely remove the hook or move away far enough to snap it off." - icon_state = "hooked" + use_user_hud_icon = TRUE + overlay_state = "hooked" clickable_glow = TRUE /atom/movable/screen/alert/status_effect/hooked/Click() @@ -58,4 +59,5 @@ /atom/movable/screen/alert/status_effect/hooked/jaws name = "Snagged By Jaws" desc = "You've been snagged by some sort of beartrap-slash-fishing-hook-gizmo! Click to safely remove the hook or move away far enough to snap it off." - icon_state = "hooked_jaws" + use_user_hud_icon = TRUE + overlay_state = "hooked_jaws" diff --git a/code/datums/status_effects/debuffs/jitteriness.dm b/code/datums/status_effects/debuffs/jitteriness.dm index ad9a7625133c..50bb8b5e09f4 100644 --- a/code/datums/status_effects/debuffs/jitteriness.dm +++ b/code/datums/status_effects/debuffs/jitteriness.dm @@ -25,7 +25,7 @@ owner.update_offsets() /datum/status_effect/jitter/get_examine_text() - switch(duration - world.time) + switch(duration) if(5 MINUTES to INFINITY) return span_boldwarning("[owner.p_They()] [owner.p_are()] convulsing violently!") if(3 MINUTES to 5 MINUTES) @@ -47,7 +47,7 @@ if(owner.resting && remove_duration(4 * seconds_between_ticks)) return - var/time_left_in_seconds = (duration - world.time) / 10 + var/time_left_in_seconds = duration / 10 owner.do_jitter_animation(time_left_in_seconds) /// Helper proc that causes the mob to do a jittering animation by jitter_amount. diff --git a/code/datums/status_effects/debuffs/phobia.dm b/code/datums/status_effects/debuffs/phobia.dm deleted file mode 100644 index 76520e4dc588..000000000000 --- a/code/datums/status_effects/debuffs/phobia.dm +++ /dev/null @@ -1,77 +0,0 @@ -/// Basically a cooldown which makes you emote when it starts, but allows it to be easily shared between multiple phobias -/datum/status_effect/minor_phobia_reaction - id = "phobia_minor" - duration = 12 SECONDS - alert_type = null - -/datum/status_effect/minor_phobia_reaction/on_apply() - . = ..() - owner.emote("scream") - owner.set_jitter_if_lower(6 SECONDS) - owner.add_mood_event("phobia_minor", /datum/mood_event/startled) - -/// Stacking severity of phobic reaction -/// The more stacks you are the more scared you are -/datum/status_effect/stacking/phobia_reaction - id = "phobia" - status_type = STATUS_EFFECT_REFRESH - stacks = 1 - max_stacks = 6 - tick_interval = 40 SECONDS - consumed_on_threshold = FALSE - -/datum/status_effect/stacking/phobia_reaction/on_creation(mob/living/new_owner, stacks_to_apply = 1, mood_event_type) - . = ..() - if (!.) - return FALSE - - if (mood_event_type) - owner.add_mood_event("phobia", mood_event_type) - return TRUE - -/datum/status_effect/stacking/phobia_reaction/refresh(effect, stacks_to_add) - . = ..() - add_stacks(stacks_to_add) - -/datum/status_effect/stacking/phobia_reaction/add_stacks(stacks_added) - . = ..() - if (stacks_added <= 0 || stacks <= 0) - return - - var/reaction = rand(1,4) - switch(reaction) - if(1) - to_chat(owner, span_warning("You are startled!")) - owner.emote("jump") - owner.Immobilize(0.1 SECONDS * stacks) - - if(2) - owner.emote("scream") - owner.say("AAAAH!!", forced = "phobia") - - if(stacks >= 5) - var/held_item = owner.get_active_held_item() - if (owner.dropItemToGround(held_item)) - owner.visible_message( - span_danger("[owner.name] drops \the [held_item]!"), - span_warning("You drop \the [held_item]!"), null, COMBAT_MESSAGE_RANGE) - - if(3) - to_chat(owner, span_warning("You lose your balance!")) - owner.adjust_staggered_up_to(2 SECONDS * stacks, 20 SECONDS) - owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/spooked) - // We're relying on the fact that there's a 12 second application cooldown to not have to bother cancelling and replacing this timer - // So if you adjust the duration keep that in mind - addtimer(CALLBACK(src, PROC_REF(speed_up)), 1 SECONDS * stacks, TIMER_STOPPABLE | TIMER_DELETE_ME) - - if(4) - to_chat(owner, span_warning("You feel faint with fright!")) - owner.adjust_dizzy_up_to(2 SECONDS * stacks, 20 SECONDS) - owner.adjust_eye_blur_up_to(1.5 SECONDS * stacks, 6 SECONDS) - -/datum/status_effect/stacking/phobia_reaction/fadeout_effect() - to_chat(owner, span_notice("You calm down.")) - -/// Remove our active movespeed modifier -/datum/status_effect/stacking/phobia_reaction/proc/speed_up() - owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/spooked) diff --git a/code/datums/status_effects/debuffs/rust_corruption.dm b/code/datums/status_effects/debuffs/rust_corruption.dm index 6ba9d6a4ee95..6692ef111a08 100644 --- a/code/datums/status_effects/debuffs/rust_corruption.dm +++ b/code/datums/status_effects/debuffs/rust_corruption.dm @@ -5,8 +5,14 @@ remove_on_fullheal = TRUE /datum/status_effect/rust_corruption/tick(seconds_between_ticks) - if(issilicon(owner)) - owner.adjustBruteLoss(10 * seconds_between_ticks) + if(issilicon(owner) || isbot(owner)) + owner.adjust_brute_loss(10 * seconds_between_ticks) return owner.adjust_disgust(5 * seconds_between_ticks) owner.reagents?.remove_all(0.75 * seconds_between_ticks) + if(!iscarbon(owner)) + return + var/mob/living/carbon/carbon_owner = owner + for(var/obj/item/bodypart/robotic_limb as anything in carbon_owner.bodyparts) + if(IS_ROBOTIC_LIMB(robotic_limb)) + robotic_limb.receive_damage(10) diff --git a/code/datums/status_effects/debuffs/screen_blur.dm b/code/datums/status_effects/debuffs/screen_blur.dm index acdce13b5a08..ee893610c12c 100644 --- a/code/datums/status_effects/debuffs/screen_blur.dm +++ b/code/datums/status_effects/debuffs/screen_blur.dm @@ -49,7 +49,7 @@ game_plane_master_controller.remove_filter("eye_blur") return - var/time_left_in_seconds = (duration - world.time) / (1 SECONDS) + var/time_left_in_seconds = duration / 10 var/amount_of_blur = clamp(time_left_in_seconds * BLUR_DURATION_TO_INTENSITY, 0.6, 3) game_plane_master_controller.add_filter("eye_blur", 1, gauss_blur_filter(amount_of_blur)) diff --git a/code/datums/status_effects/debuffs/slime/slime_leech.dm b/code/datums/status_effects/debuffs/slime/slime_leech.dm index 00c907d8d95e..661b73a203af 100644 --- a/code/datums/status_effects/debuffs/slime/slime_leech.dm +++ b/code/datums/status_effects/debuffs/slime/slime_leech.dm @@ -1,7 +1,8 @@ /atom/movable/screen/alert/status_effect/slime_leech name = "Covered in Slime" desc = "A slime is draining your very lifeforce! Remove it by hand, by hitting it, or by water." - icon_state = "slime_leech" + use_user_hud_icon = TRUE + overlay_state = "slime_leech" /datum/status_effect/slime_leech id = "slime_leech" @@ -59,18 +60,18 @@ var/totaldamage = 0 //total damage done to this unfortunate soul if(iscarbon(owner)) - totaldamage += owner.adjustBruteLoss(rand(2, 4) * 0.5 * seconds_between_ticks) - totaldamage += owner.adjustToxLoss(rand(1, 2) * 0.5 * seconds_between_ticks) + totaldamage += owner.adjust_brute_loss(rand(2, 4) * 0.5 * seconds_between_ticks) + totaldamage += owner.adjust_tox_loss(rand(1, 2) * 0.5 * seconds_between_ticks) if(isanimal_or_basicmob(owner)) var/need_mob_update - need_mob_update = totaldamage += owner.adjustBruteLoss(rand(2, 4) * 0.5 * seconds_between_ticks, updating_health = FALSE) - need_mob_update += totaldamage += owner.adjustToxLoss(rand(1, 2) * 0.5 * seconds_between_ticks, updating_health = FALSE) + need_mob_update = totaldamage += owner.adjust_brute_loss(rand(2, 4) * 0.5 * seconds_between_ticks, updating_health = FALSE) + need_mob_update += totaldamage += owner.adjust_tox_loss(rand(1, 2) * 0.5 * seconds_between_ticks, updating_health = FALSE) if(need_mob_update) owner.updatehealth() - if(totaldamage >= 0) // AdjustBruteLoss returns a negative value on successful damage adjustment + if(totaldamage >= 0) // adjust_brute_loss() returns a negative value on successful damage adjustment our_slime.balloon_alert(our_slime, "not food!") our_slime.stop_feeding() return @@ -94,4 +95,4 @@ our_slime.adjust_nutrition(-1 * 1.8 * totaldamage) //damage is already modified by seconds_between_ticks //Heal yourself. - our_slime.adjustBruteLoss(-1.5 * seconds_between_ticks) + our_slime.adjust_brute_loss(-1.5 * seconds_between_ticks) diff --git a/code/datums/status_effects/debuffs/slime/slimed.dm b/code/datums/status_effects/debuffs/slime/slimed.dm index 32fa90482233..b02d1dcc71fb 100644 --- a/code/datums/status_effects/debuffs/slime/slimed.dm +++ b/code/datums/status_effects/debuffs/slime/slimed.dm @@ -6,7 +6,8 @@ /atom/movable/screen/alert/status_effect/slimed name = "Covered in Slime" desc = "You are covered in slime and it's eating away at you! Click to start cleaning it off, or find a faster way to wash it away!" - icon_state = "slimed" + use_user_hud_icon = TRUE + overlay_state = "slimed" clickable_glow = TRUE /atom/movable/screen/alert/status_effect/slimed/Click() diff --git a/code/datums/status_effects/debuffs/spacer.dm b/code/datums/status_effects/debuffs/spacer.dm index ed14fd285968..e2e8b8be1d40 100644 --- a/code/datums/status_effects/debuffs/spacer.dm +++ b/code/datums/status_effects/debuffs/spacer.dm @@ -41,7 +41,7 @@ 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.adjust_stamina_loss(-1 * stamina_heal_per_tick) owner.AdjustAllImmobility(-1 * stun_heal_per_tick) // For comparison: Ephedrine heals 4 stamina per tick / 2 per second // and Nicotine heals 5 seconds of stun per tick / 2.5 per second @@ -74,8 +74,8 @@ 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)) + if(!the_spacer.get_stamina_loss()) + the_spacer.adjust_stamina_loss(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 @@ -85,10 +85,10 @@ /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" + use_user_hud_icon = TRUE + overlay_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." diff --git a/code/datums/status_effects/debuffs/staggered.dm b/code/datums/status_effects/debuffs/staggered.dm index 9919a156c319..4d640b643313 100644 --- a/code/datums/status_effects/debuffs/staggered.dm +++ b/code/datums/status_effects/debuffs/staggered.dm @@ -51,7 +51,7 @@ /datum/status_effect/dazed id = "dazed" status_type = STATUS_EFFECT_UNIQUE - tick_interval = 0.5 SECONDS + tick_interval = 0.6 SECONDS alert_type = null remove_on_fullheal = TRUE /// Our visual cue for the vulnerable state this status effect puts us in. @@ -121,9 +121,9 @@ /// Only applied by shoving someone to paralyze them /datum/status_effect/no_side_kick id = "no side kick" - duration = 3.5 SECONDS + duration = 3.6 SECONDS status_type = STATUS_EFFECT_UNIQUE - tick_interval = 0.5 SECONDS + tick_interval = 0.6 SECONDS alert_type = null remove_on_fullheal = TRUE diff --git a/code/datums/status_effects/debuffs/stamcrit.dm b/code/datums/status_effects/debuffs/stamcrit.dm index 5c8c2b462345..fb5b5e309203 100644 --- a/code/datums/status_effects/debuffs/stamcrit.dm +++ b/code/datums/status_effects/debuffs/stamcrit.dm @@ -16,9 +16,9 @@ // This should be in on apply but we need it to happen AFTER being added to the mob // (Because we need to wait until the status effect is in their status effect list, or we'll add two) - if(owner.getStaminaLoss() < 120) + if(owner.get_stamina_loss() < 120) // Puts you a little further into the initial stamcrit, makes stamcrit harder to outright counter with chems. - owner.adjustStaminaLoss(30, FALSE) + owner.adjust_stamina_loss(30, FALSE) // Same RegisterSignal(owner, COMSIG_LIVING_ADJUST_STAMINA_DAMAGE, PROC_REF(update_diminishing_return)) @@ -80,5 +80,5 @@ qdel(src) return - if(owner.maxHealth - owner.getStaminaLoss() > owner.crit_threshold) + if(owner.maxHealth - owner.get_stamina_loss() > owner.crit_threshold) qdel(src) diff --git a/code/datums/status_effects/debuffs/terrified.dm b/code/datums/status_effects/debuffs/terrified.dm index dcbe2f1f80ee..b0c984622e8b 100644 --- a/code/datums/status_effects/debuffs/terrified.dm +++ b/code/datums/status_effects/debuffs/terrified.dm @@ -26,7 +26,8 @@ /atom/movable/screen/alert/status_effect/terrified name = "Terrified!" desc = "You feel a supernatural darkness settle in around you, overwhelming you with panic! Get into the light!" - icon_state = "terrified" + use_user_hud_icon = TRUE + overlay_state = "terrified" #undef TERROR_INITIAL_AMOUNT #undef STACK_TERROR_AMOUNT diff --git a/code/datums/status_effects/debuffs/tower_of_babel.dm b/code/datums/status_effects/debuffs/tower_of_babel.dm index fb6f61a55364..16bc92c25152 100644 --- a/code/datums/status_effects/debuffs/tower_of_babel.dm +++ b/code/datums/status_effects/debuffs/tower_of_babel.dm @@ -56,4 +56,5 @@ /atom/movable/screen/alert/status_effect/tower_of_babel name = "Tower of babel" desc = "You seem to be babbling in a strange language..." - icon_state = "mind_control" + use_user_hud_icon = TRUE + overlay_state = "mind_control" diff --git a/code/datums/status_effects/debuffs/vision/blindness.dm b/code/datums/status_effects/debuffs/vision/blindness.dm index caf8e98a2b07..35c643c34e21 100644 --- a/code/datums/status_effects/debuffs/vision/blindness.dm +++ b/code/datums/status_effects/debuffs/vision/blindness.dm @@ -25,36 +25,41 @@ return FALSE RegisterSignals(owner, update_signals, PROC_REF(update_blindness)) - update_blindness() return ..() /datum/status_effect/grouped/blindness/source_added(source, ...) - update_blindness() + update_blindness(source) /datum/status_effect/grouped/blindness/source_removed(source, removing) if (!removing) - update_blindness() + update_blindness(source) -/datum/status_effect/grouped/blindness/proc/update_blindness() +/datum/status_effect/grouped/blindness/proc/update_blindness(changed_source) if (!CAN_BE_BLIND(owner)) // future proofing qdel(src) return if (!HAS_TRAIT(owner, TRAIT_SIGHT_BYPASS)) - make_blind() + make_blind(changed_source) return for (var/blocker in blocking_sources) if (owner.is_blind_from(blocker)) - make_blind() + make_blind(changed_source) return make_unblind() -/datum/status_effect/grouped/blindness/proc/make_blind() - owner.overlay_fullscreen(id, /atom/movable/screen/fullscreen/blind) +/datum/status_effect/grouped/blindness/proc/make_blind(changed_source) + // have some extra logic to determine what overlay to use + // by default we use the noflicker overlay + // but if our one and only source is from "temp blindness", use flicker overlay + var/overlay_to_use = /atom/movable/screen/fullscreen/blind/noflicker + if(changed_source == /datum/status_effect/temporary_blindness::id && length(sources) == 1) + overlay_to_use = /atom/movable/screen/fullscreen/blind + owner.overlay_fullscreen(id, overlay_to_use ) // You are blind - at most, able to make out shapes near you - owner.add_client_colour(/datum/client_colour/monochrome, REF(src)) + owner.add_client_colour(/datum/client_colour/blindness, REF(src)) /datum/status_effect/grouped/blindness/proc/make_unblind() owner.clear_fullscreen(id) @@ -68,7 +73,8 @@ /atom/movable/screen/alert/status_effect/blind name = "Blind" desc = "You can't see! This may be caused by a genetic defect, eye trauma, being unconscious, or something covering your eyes." - icon_state = "blind" + use_user_hud_icon = TRUE + overlay_state = "blind" /// This status effect handles applying a temporary blind to the mob. /datum/status_effect/temporary_blindness diff --git a/code/datums/status_effects/drug_effects.dm b/code/datums/status_effects/drug_effects.dm index 71739ade1812..b498e3d39810 100644 --- a/code/datums/status_effects/drug_effects.dm +++ b/code/datums/status_effects/drug_effects.dm @@ -10,7 +10,8 @@ /atom/movable/screen/alert/status_effect/woozy name = "Woozy" desc = "You feel a bit slower than usual, it seems doing things with your hands takes longer than it usually does." - icon_state = "woozy" + use_user_hud_icon = TRUE + overlay_state = "woozy" /datum/status_effect/high_blood_pressure id = "high_blood_pressure" @@ -36,7 +37,8 @@ /atom/movable/screen/alert/status_effect/high_blood_pressure name = "High blood pressure" desc = "Your blood pressure is real high right now ... You'd probably bleed like a stuck pig." - icon_state = "highbloodpressure" + use_user_hud_icon = TRUE + overlay_state = "highbloodpressure" /datum/status_effect/seizure id = "seizure" @@ -58,7 +60,8 @@ /atom/movable/screen/alert/status_effect/seizure name = "Seizure" desc = "FJOIWEHUWQEFGYUWDGHUIWHUIDWEHUIFDUWGYSXQHUIODSDBNJKVBNKDML <--- this is you right now" - icon_state = "paralysis" + use_user_hud_icon = TRUE + overlay_state = "paralysis" /datum/status_effect/stoned id = "stoned" diff --git a/code/datums/status_effects/grouped_effect.dm b/code/datums/status_effects/grouped_effect.dm index caddfe17fcab..ceb76fd4f86f 100644 --- a/code/datums/status_effects/grouped_effect.dm +++ b/code/datums/status_effects/grouped_effect.dm @@ -11,6 +11,11 @@ //Get our supplied arguments, without new_owner var/list/new_source_args = args.Copy(2) + if(isnull(source)) + stack_trace("Grouped status effect applied without a source") + qdel(src) + return FALSE + var/datum/status_effect/grouped/existing = new_owner.has_status_effect(type) if(existing) existing.sources |= source diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index b07ab1339ab4..93e6f89219c6 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -67,7 +67,8 @@ /atom/movable/screen/alert/status_effect/in_love name = "In Love" desc = "You feel so wonderfully in love!" - icon_state = "in_love" + use_user_hud_icon = TRUE + overlay_state = "in_love" /datum/status_effect/in_love id = "in_love" @@ -151,10 +152,10 @@ spell.reset_spell_cooldown() 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.adjust_brute_loss(-25, updating_health = FALSE) + need_mob_update += rewarded.adjust_fire_loss(-25, updating_health = FALSE) + need_mob_update += rewarded.adjust_tox_loss(-25, updating_health = FALSE) + need_mob_update += rewarded.adjust_oxy_loss(-25, updating_health = FALSE) if(need_mob_update) rewarded.updatehealth() @@ -169,7 +170,8 @@ /atom/movable/screen/alert/status_effect/heldup name = "Held Up" desc = "Making any sudden moves would probably be a bad idea!" - icon_state = "aimed" + use_user_hud_icon = TRUE + overlay_state = "aimed" /datum/status_effect/grouped/heldup/on_apply() owner.apply_status_effect(/datum/status_effect/grouped/surrender, REF(src)) @@ -190,7 +192,8 @@ /atom/movable/screen/alert/status_effect/holdup name = "Holding Up" desc = "You're currently pointing a gun at someone. Click to cancel." - icon_state = "aimed" + use_user_hud_icon = TRUE + overlay_state = "aimed" clickable_glow = TRUE /atom/movable/screen/alert/status_effect/holdup/Click(location, control, params) @@ -265,7 +268,7 @@ /// One of our possible takers moved, see if they left us hanging /datum/status_effect/offering/proc/check_taker_in_range(mob/living/taker) SIGNAL_HANDLER - if(owner.CanReach(taker) && !IS_DEAD_OR_INCAP(taker)) + if(taker.IsReachableBy(owner) || ((owner.pulling == taker) || (taker.pulling == owner)) && !IS_DEAD_OR_INCAP(taker)) return to_chat(taker, span_warning("You moved out of range of [owner]!")) @@ -276,7 +279,7 @@ SIGNAL_HANDLER for(var/mob/living/checking_taker as anything in possible_takers) - if(!istype(checking_taker) || !owner.CanReach(checking_taker) || IS_DEAD_OR_INCAP(checking_taker)) + if(!istype(checking_taker) || (!checking_taker.IsReachableBy(owner) && !((owner.pulling == checking_taker) || (checking_taker.pulling == owner))) || IS_DEAD_OR_INCAP(checking_taker)) remove_candidate(checking_taker) /// We lost the item, give it up @@ -291,7 +294,7 @@ * Returns `TRUE` if the taker is valid as a target for the offering. */ /datum/status_effect/offering/proc/is_taker_elligible(mob/living/taker) - return owner.CanReach(taker) && !IS_DEAD_OR_INCAP(taker) && additional_taker_check(taker) + return taker.IsReachableBy(owner) && !IS_DEAD_OR_INCAP(taker) && additional_taker_check(taker) /** * Additional checks added to `CanReach()` and `IS_DEAD_OR_INCAP()` in `is_taker_elligible()`. @@ -373,7 +376,8 @@ /atom/movable/screen/alert/status_effect/surrender name = "Surrender" desc = "Looks like you're in trouble now, bud. Click here to surrender. (Warning: You will be incapacitated.)" - icon_state = "surrender" + use_user_hud_icon = TRUE + overlay_state = "surrender" clickable_glow = TRUE /atom/movable/screen/alert/status_effect/surrender/Click(location, control, params) @@ -679,11 +683,11 @@ var/healed = 0 if(recovery) //very mild healing for those with the water adaptation trait (fish infusion) - healed += owner.adjustOxyLoss(recovery * (water_adaptation ? 1.5 : 1), updating_health = FALSE, required_biotype = MOB_ORGANIC) - healed += owner.adjustFireLoss(recovery, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) - healed += owner.adjustToxLoss(recovery, updating_health = FALSE, required_biotype = MOB_ORGANIC) - healed += owner.adjustBruteLoss(recovery, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) - healed += owner.adjustStaminaLoss(stam_recovery, updating_stamina = FALSE) + healed += owner.adjust_oxy_loss(recovery * (water_adaptation ? 1.5 : 1), updating_health = FALSE, required_biotype = MOB_ORGANIC) + healed += owner.adjust_fire_loss(recovery, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + healed += owner.adjust_tox_loss(recovery, updating_health = FALSE, required_biotype = MOB_ORGANIC) + healed += owner.adjust_brute_loss(recovery, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + healed += owner.adjust_stamina_loss(stam_recovery, updating_stamina = FALSE) if(healed) owner.updatehealth() else if(istype(shower_reagent, /datum/reagent/blood)) @@ -801,3 +805,53 @@ id = "divine_spotlight" #undef BEAM_ALPHA + +/datum/status_effect/moodlet_in_area + id = "moodlet_in_area" + duration = STATUS_EFFECT_PERMANENT + tick_interval = STATUS_EFFECT_NO_TICK + status_type = STATUS_EFFECT_MULTIPLE + alert_type = null + /// Moodlet to apply while in the area + VAR_PRIVATE/moodlet_type + /// Typecache of areas that will trigger the moodlet while in them + VAR_PRIVATE/list/allowed_areas + /// Optional callback to run when checking if the moodlet should be applied. Should return TRUE to apply, FALSE to not. + VAR_PRIVATE/datum/callback/special_check + +/datum/status_effect/moodlet_in_area/on_creation(mob/living/new_owner, moodlet_type, list/allowed_areas, datum/callback/special_check) + src.moodlet_type = moodlet_type + src.allowed_areas = typecacheof(allowed_areas) + src.special_check = special_check + return ..() + +/datum/status_effect/moodlet_in_area/before_remove(moodlet_type, ...) + return moodlet_type == src.moodlet_type + +/datum/status_effect/moodlet_in_area/on_apply() + if(!length(allowed_areas)) + return FALSE + + for(var/datum/status_effect/moodlet_in_area/other_effect in owner.status_effects) + if(other_effect.moodlet_type == moodlet_type) + return FALSE + + owner.become_area_sensitive("[id]_[moodlet_type]") + RegisterSignal(owner, COMSIG_ENTER_AREA, PROC_REF(check_area)) + return TRUE + +/datum/status_effect/moodlet_in_area/on_remove() + UnregisterSignal(owner, COMSIG_ENTER_AREA) + owner.lose_area_sensitivity("[id]_[moodlet_type]") + owner.clear_mood_event("[id]_[moodlet_type]") + +/datum/status_effect/moodlet_in_area/proc/check_area(datum/source, area/new_area) + SIGNAL_HANDLER + + if(special_check && !special_check.Invoke(owner, new_area)) + return + + if(is_type_in_typecache(new_area, allowed_areas)) + owner.add_mood_event("[id]_[moodlet_type]", moodlet_type) + else + owner.clear_mood_event("[id]_[moodlet_type]") diff --git a/code/datums/status_effects/reagent_effect.dm b/code/datums/status_effects/reagent_effect.dm new file mode 100644 index 000000000000..82475d90dd2b --- /dev/null +++ b/code/datums/status_effects/reagent_effect.dm @@ -0,0 +1,84 @@ +/// Status effect that is tied to the existence of a reagent in a mob's system +/datum/status_effect/reagent_effect + abstract_type = /datum/status_effect/reagent_effect + id = STATUS_EFFECT_ID_ABSTRACT + alert_type = null + tick_interval = STATUS_EFFECT_NO_TICK + /// We need this reagent type + var/reagent_typepath + /// Whether subtypes of the reagent are allowed to keep the effect active + var/subtypes_allowed + +/datum/status_effect/reagent_effect/on_creation(mob/living/new_owner, reagent_typepath, subtypes_allowed = TRUE) + if(isnull(src.reagent_typepath)) + if(isnull(reagent_typepath)) + stack_trace("Reagent effect [src] created without a reagent typepath!") + src.reagent_typepath = reagent_typepath + if(isnull(src.subtypes_allowed)) + src.subtypes_allowed = subtypes_allowed + return ..() + +/datum/status_effect/reagent_effect/on_apply() + if(isnull(owner.reagents) || isnull(reagent_typepath) || !can_effect()) + return FALSE + + RegisterSignal(owner.reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(check_reagents)) + add_effect() + return TRUE + +/datum/status_effect/reagent_effect/on_remove() + remove_effect() + UnregisterSignal(owner.reagents, COMSIG_REAGENTS_HOLDER_UPDATED) + +/datum/status_effect/reagent_effect/proc/check_reagents(datum/reagents/updated_reagents) + SIGNAL_HANDLER + + if(owner.reagents?.has_reagent(reagent_typepath, check_subtypes = subtypes_allowed)) + return + qdel(src) + +/// Can we add this effect to the owner? +/datum/status_effect/reagent_effect/proc/can_effect() + return TRUE + +/// Add the side effect to the owner +/datum/status_effect/reagent_effect/proc/add_effect() + return + +/// Remove the side effect from the owner +/datum/status_effect/reagent_effect/proc/remove_effect() + return + +/datum/status_effect/reagent_effect/fakedeath + id = "reagent_fake_death" + +/datum/status_effect/reagent_effect/fakedeath/add_effect() + owner.fakedeath(type) + +/datum/status_effect/reagent_effect/fakedeath/remove_effect() + owner.cure_fakedeath(type) + +/datum/status_effect/reagent_effect/freeze + id = "reagent_freeze" + +/datum/status_effect/reagent_effect/freeze/can_effect() + return !HAS_TRAIT(owner, TRAIT_RESISTCOLD) + +/datum/status_effect/reagent_effect/freeze/add_effect() + owner.apply_status_effect(/datum/status_effect/frozenstasis/irresistable) + owner.apply_status_effect(/datum/status_effect/grouped/stasis, type) + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(escape_prison)) + +/datum/status_effect/reagent_effect/freeze/remove_effect() + owner.remove_status_effect(/datum/status_effect/frozenstasis/irresistable) + owner.remove_status_effect(/datum/status_effect/grouped/stasis, type) + UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) + +/datum/status_effect/reagent_effect/freeze/proc/escape_prison(...) + SIGNAL_HANDLER + + if(isturf(owner.loc)) // we escaped ice prison + owner.reagents?.del_reagent(reagent_typepath) + if(!QDELETED(src)) + stack_trace("Despite nuking the reagent from the mob, [owner] still has [type]") + qdel(src) diff --git a/code/datums/status_effects/stacking_effect.dm b/code/datums/status_effects/stacking_effect.dm index 287419028b07..327c614f8de7 100644 --- a/code/datums/status_effects/stacking_effect.dm +++ b/code/datums/status_effects/stacking_effect.dm @@ -123,7 +123,7 @@ on_threshold_drop() if(stacks_added > 0) - tick_interval += delay_before_decay // refreshes time until decay + time_until_next_tick += delay_before_decay // refreshes time until decay if (status_overlay) status_overlay.icon_state = "[overlay_state][stacks]" diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm index 727ef357ac4e..331ae61a5f08 100644 --- a/code/datums/status_effects/wound_effects.dm +++ b/code/datums/status_effects/wound_effects.dm @@ -3,7 +3,8 @@ /atom/movable/screen/alert/status_effect/determined name = "Determined" desc = "The serious wounds you've sustained have put your body into fight-or-flight mode! Now's the time to look for an exit!" - icon_state = "wounded" + use_user_hud_icon = TRUE + overlay_state = "wounded" /datum/status_effect/determined id = "determined" @@ -67,6 +68,7 @@ /atom/movable/screen/alert/status_effect/limp name = "Limping" desc = "One or more of your legs has been wounded, slowing down steps with that leg! Get it fixed, or at least in a sling of gauze!" + icon_state = "injury" /datum/status_effect/limp/proc/check_step(mob/whocares, OldLoc, Dir, forced) SIGNAL_HANDLER diff --git a/code/datums/stock_market_events.dm b/code/datums/stock_market_events.dm index b29e52ab0ee1..1c96671c8985 100644 --- a/code/datums/stock_market_events.dm +++ b/code/datums/stock_market_events.dm @@ -8,7 +8,7 @@ "MODular Solutions", "SolGov", "Australicus Industrial Mining", - "Vey-Medical", + "Nanotrasen-DeForest Corporation", "Aussec Armory", "Dreamland Robotics" ) @@ -147,5 +147,3 @@ SSstock_market.materials_quantity[mat] = initial(mat.tradable_base_quantity) //Force the material to be available again. SSstock_market.materials_prices[mat] = initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT //Force the price to be reset once the lockdown is over. create_news() - - diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index f9ca006c9a49..41b7a61949f1 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -171,6 +171,16 @@ remove_all(update_storage = FALSE) +/// Ran on items instantiated inside the storage, basically a chopped down version of handle_enter +/datum/storage/proc/item_init(datum/source, obj/item/inited) + SIGNAL_HANDLER + + if(!istype(inited)) + return + + inited.item_flags |= IN_STORAGE + RegisterSignal(inited, COMSIG_MOUSEDROPPED_ONTO, PROC_REF(mousedrop_receive)) + /// Automatically ran on all object insertions: flag marking and view refreshing. /datum/storage/proc/handle_enter(datum/source, obj/item/arrived) SIGNAL_HANDLER @@ -223,6 +233,7 @@ RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act)) RegisterSignal(parent, COMSIG_ATOM_CONTENTS_WEIGHT_CLASS_CHANGED, PROC_REF(contents_changed_w_class)) RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(on_click_alt)) + RegisterSignal(parent, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(item_init)) /** * Sets where items are physically being stored in the case it shouldn't be on the parent. @@ -476,14 +487,20 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(!can_insert(to_insert, user, messages = messages, force = force)) return FALSE + if(SEND_SIGNAL(parent, COMSIG_ATOM_PRE_STORED_ITEM, to_insert, user, force, messages) & BLOCK_STORAGE_INSERT) + return FALSE SEND_SIGNAL(parent, COMSIG_ATOM_STORED_ITEM, to_insert, user, force) SEND_SIGNAL(src, COMSIG_STORAGE_STORED_ITEM, to_insert, user, force) - to_insert.forceMove(real_location) - item_insertion_feedback(user, to_insert, override) - parent.update_appearance() + if(ismob(to_insert.loc)) + var/mob/item_carrier = to_insert.loc + item_carrier.transferItemToLoc(to_insert, real_location, animated = FALSE) // This allows has_unequipped() to be properly called. + else + to_insert.forceMove(real_location) if(get(real_location, /mob) != user) to_insert.do_pickup_animation(real_location, user) + item_insertion_feedback(user, to_insert, override) + parent.update_appearance() return TRUE /// Since items inside storages ignore transparency for QOL reasons, we're tracking when things are dropped onto them instead of our UI elements @@ -650,7 +667,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) */ /datum/storage/proc/remove_type(type, atom/destination, amount = INFINITY, check_adjacent = FALSE, force = FALSE, mob/user, list/inserted) if(!force && check_adjacent) - if(isnull(user) || !user.CanReach(destination) || !user.CanReach(parent)) + if(isnull(user) || !destination.IsReachableBy(user) || !parent.IsReachableBy(user)) return FALSE var/list/taking = typecache_filter_list(real_location.contents, typecacheof(type)) @@ -701,9 +718,11 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) SIGNAL_HANDLER for(var/mob/user as anything in is_using) - if(user.client) - var/client/cuser = user.client - cuser.screen -= gone + user.hud_used?.open_containers -= gone + if(!user.client) + continue + var/client/cuser = user.client + cuser.screen -= gone reset_item(gone) refresh_views() @@ -726,8 +745,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) return if(collection_mode == COLLECT_ONE) - if(thing.loc == user) - user.dropItemToGround(thing, silent = TRUE) //this is nessassary to update any inventory slot it is attached to attempt_insert(thing, user) return COMPONENT_CANCEL_ATTACK_CHAIN @@ -773,40 +790,50 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) SIGNAL_HANDLER if(ismecha(user.loc) || user.incapacitated || !user.canUseStorage()) - return + return NONE if(istype(over_object, /atom/movable/screen/inventory/hand)) - if(real_location.loc != user || !user.can_perform_action(parent, FORBID_TELEKINESIS_REACH | ALLOW_RESTING)) - return + if(parent.loc != user || !user.can_perform_action(parent, FORBID_TELEKINESIS_REACH | ALLOW_RESTING)) + return NONE + + if(isitem(parent)) + var/obj/item/item_parent = parent + if(!item_parent.can_mob_unequip(user)) + return COMPONENT_CANCEL_MOUSEDROP_ONTO var/atom/movable/screen/inventory/hand/hand = over_object user.putItemFromInventoryInHandIfPossible(parent, hand.held_index) parent.add_fingerprint(user) return COMPONENT_CANCEL_MOUSEDROP_ONTO - if(ismob(over_object)) - if(over_object != user || !user.can_perform_action(parent, FORBID_TELEKINESIS_REACH | ALLOW_RESTING)) - return + if(over_object == user) + if(!user.can_perform_action(parent, FORBID_TELEKINESIS_REACH | ALLOW_RESTING)) + return NONE + + if(isliving(parent) && user.pulling == parent) + var/mob/living/as_living = parent + if(as_living.can_be_held) + return parent.add_fingerprint(user) INVOKE_ASYNC(src, PROC_REF(open_storage), user) return COMPONENT_CANCEL_MOUSEDROP_ONTO - if(istype(over_object, /atom/movable/screen)) - return + if(istype(over_object, /atom/movable/screen) || ismob(over_object)) + return NONE if(!user.can_perform_action(over_object, FORBID_TELEKINESIS_REACH)) - return + return NONE parent.add_fingerprint(user) var/atom/dump_loc = over_object.get_dumping_location() if(isnull(dump_loc)) - return + return NONE /// Don't dump *onto* objects in the same storage as ourselves if (over_object.loc == parent.loc && !isnull(parent.loc.atom_storage) && isnull(over_object.atom_storage)) - return + return NONE INVOKE_ASYNC(src, PROC_REF(dump_content_at), over_object, dump_loc, user) return COMPONENT_CANCEL_MOUSEDROP_ONTO @@ -821,7 +848,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(locked) user.balloon_alert(user, "closed!") return - if(!user.CanReach(parent) || !user.CanReach(dest_object)) + if(!parent.IsReachableBy(user) || !dest_object.IsReachableBy(user)) return if(SEND_SIGNAL(dest_object, COMSIG_STORAGE_DUMP_CONTENT, src, user) & STORAGE_DUMP_HANDLED) @@ -983,9 +1010,13 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) SIGNAL_HANDLER for(var/mob/user in can_see_contents()) - if (!user.CanReach(parent)) + if (!can_be_reached_by(user)) hide_contents(user) +/// Relay for parent.IsReachableBy +/datum/storage/proc/can_be_reached_by(mob/user) + return parent.IsReachableBy(user) + /// Close the storage UI for everyone viewing us. /datum/storage/proc/close_all() for(var/mob/user as anything in is_using) @@ -1082,10 +1113,11 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) is_using -= to_hide if(to_hide.client) - to_hide.hud_used.open_containers -= storage_interfaces[to_hide].list_ui_elements() to_hide.client.screen -= storage_interfaces[to_hide].list_ui_elements() - to_hide.hud_used.open_containers -= real_location.contents to_hide.client.screen -= real_location.contents + if(to_hide.hud_used) + to_hide.hud_used.open_containers -= storage_interfaces[to_hide].list_ui_elements() + to_hide.hud_used.open_containers -= real_location.contents QDEL_NULL(storage_interfaces[to_hide]) storage_interfaces -= to_hide @@ -1158,8 +1190,10 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /datum/storage/proc/contents_changed_w_class(datum/source, obj/item/changed, old_w_class, new_w_class) SIGNAL_HANDLER - if(new_w_class <= max_specific_storage && new_w_class + get_total_weight() <= max_total_storage) + // If old weight already overloaded the storage, don't drop the item out just in case we're inside of a premade box + if(new_w_class <= max_specific_storage && (get_total_weight() <= max_total_storage || get_total_weight() - new_w_class + old_w_class > max_total_storage)) return + if(!attempt_remove(changed, parent.drop_location())) return diff --git a/code/datums/storage/subtypes/bags.dm b/code/datums/storage/subtypes/bags.dm index 95ae354bcfda..73e6670e5674 100644 --- a/code/datums/storage/subtypes/bags.dm +++ b/code/datums/storage/subtypes/bags.dm @@ -232,7 +232,7 @@ . = ..() set_holdable(/obj/item/ammo_casing/harpoon) -///Rebar quiber bag +///Rebar quiver bag /datum/storage/bag/rebar_quiver max_specific_storage = WEIGHT_CLASS_TINY max_slots = 10 @@ -268,12 +268,51 @@ /datum/storage/bag/garment numerical_stacking = FALSE max_total_storage = 200 - max_slots = 15 + max_slots = 20 insert_preposition = "in" + allow_big_nesting = TRUE /datum/storage/bag/garment/New(atom/parent, max_slots, max_specific_storage, max_total_storage, rustle_sound, remove_rustle_sound) . = ..() - set_holdable(/obj/item/clothing) + set_holdable( + can_hold_list = list(/obj/item/clothing, /obj/item/storage/backpack), + exception_hold_list = list(/obj/item/storage/backpack), + ) + +/datum/storage/bag/garment/can_insert(obj/item/to_insert, mob/user, messages, force) + . = ..() + if(!.) + return FALSE + + if(istype(to_insert, /obj/item/storage/backpack) && length(to_insert.contents)) + if(messages && user) + parent.balloon_alert(user, "can't store filled backpacks!") + return FALSE + + return TRUE + +/datum/storage/bag/garment/item_init(datum/source, obj/item/inited) + . = ..() + if(!istype(inited, /obj/item/storage/backpack)) + return + RegisterSignal(inited, COMSIG_ATOM_PRE_STORED_ITEM, PROC_REF(block_inner_storage)) + +/datum/storage/bag/garment/handle_enter(datum/source, obj/item/arrived) + . = ..() + if(!istype(arrived, /obj/item/storage/backpack)) + return + RegisterSignal(arrived, COMSIG_ATOM_PRE_STORED_ITEM, PROC_REF(block_inner_storage)) + +/datum/storage/bag/garment/handle_exit(datum/source, obj/item/gone) + . = ..() + UnregisterSignal(gone, COMSIG_ATOM_PRE_STORED_ITEM) + +/datum/storage/bag/garment/proc/block_inner_storage(obj/item/backpack, to_insert, user, force, messages) + SIGNAL_HANDLER + + if(user && messages) + parent.balloon_alert(user, "garment bag is in the way!") + return BLOCK_STORAGE_INSERT ///Quiver bag /datum/storage/bag/quiver diff --git a/code/datums/storage/subtypes/belts.dm b/code/datums/storage/subtypes/belts.dm index 3f3470a0e4c5..48c20789f7de 100644 --- a/code/datums/storage/subtypes/belts.dm +++ b/code/datums/storage/subtypes/belts.dm @@ -74,6 +74,7 @@ /obj/item/flesh_shears, /obj/item/blood_scanner, /obj/item/reflexhammer, + /obj/item/crowbar/power/paramedic, )) ///Security belt @@ -293,6 +294,16 @@ . = ..() set_holdable(/obj/item/melee/parsnip_sabre) +/datum/storage/gladius_belt + max_slots = 1 + do_rustle = FALSE + max_specific_storage = WEIGHT_CLASS_BULKY + click_alt_open = FALSE + +/datum/storage/gladius_belt/New(atom/parent, max_slots, max_specific_storage, max_total_storage, rustle_sound, remove_rustle_sound) + . = ..() + set_holdable(/obj/item/claymore/gladius) + ///Plant belt /datum/storage/plant_belt max_slots = 6 diff --git a/code/datums/storage/subtypes/boxes.dm b/code/datums/storage/subtypes/boxes.dm index a8acd98884b0..2a50119749f1 100644 --- a/code/datums/storage/subtypes/boxes.dm +++ b/code/datums/storage/subtypes/boxes.dm @@ -16,6 +16,13 @@ . = ..() set_holdable(/obj/item/food/donkpocket) +/datum/storage/box/donk_bullets/New(atom/parent, max_slots, max_specific_storage, max_total_storage, rustle_sound, remove_rustle_sound) + . = ..() + set_holdable(list( + /obj/item/food/donkpocket, + /obj/item/ammo_casing/shotgun, + )) + ///Coffee box /datum/storage/box/coffee max_slots = 5 diff --git a/code/datums/storage/subtypes/holsters.dm b/code/datums/storage/subtypes/holsters.dm index e82007fea711..fd0ee9f50402 100644 --- a/code/datums/storage/subtypes/holsters.dm +++ b/code/datums/storage/subtypes/holsters.dm @@ -19,6 +19,7 @@ /obj/item/gun/energy/dueling, /obj/item/food/grown/banana, /obj/item/gun/energy/laser/thermal, + /obj/item/gun/energy/laser/pistol, /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, @@ -37,6 +38,7 @@ /obj/item/gun/energy/laser/thermal, /obj/item/gun/energy/recharge/ebow, /obj/item/gun/energy/laser/captain, + /obj/item/gun/energy/laser/pistol, /obj/item/gun/energy/e_gun/hos, ) @@ -62,6 +64,7 @@ /obj/item/gun/energy/dueling, /obj/item/gun/energy/laser/thermal, /obj/item/gun/energy/laser/captain, + /obj/item/gun/energy/laser/pistol, /obj/item/gun/energy/e_gun/hos, /obj/item/gun/ballistic/rifle/boltaction, //fits if you make it an obrez ) @@ -89,6 +92,7 @@ /obj/item/gun/energy/disabler, /obj/item/gun/energy/dueling, /obj/item/gun/energy/laser/captain, + /obj/item/gun/energy/laser/pistol, /obj/item/gun/energy/e_gun/hos, ) diff --git a/code/datums/storage/subtypes/others/misc.dm b/code/datums/storage/subtypes/others/misc.dm index ead768ca9338..1b1011b769dc 100644 --- a/code/datums/storage/subtypes/others/misc.dm +++ b/code/datums/storage/subtypes/others/misc.dm @@ -32,6 +32,7 @@ /obj/item/reagent_containers/medigel/sterilizine, /obj/item/retractor, /obj/item/scalpel, + /obj/item/shears, /obj/item/stack/medical/bone_gel, /obj/item/stack/sticky_tape/surgical, /obj/item/surgical_drapes, diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index 270d85f24d4b..c8498923e92f 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -57,19 +57,19 @@ /// Types of area to affect var/area_type = /area/space /// Areas to be affected by the weather, calculated when the weather begins - var/list/impacted_areas = list() + VAR_FINAL/list/impacted_areas = list() /// A weighted list of areas impacted by weather, where weights reflect the total turf count in each area. - var/list/impacted_areas_weighted = list() + VAR_FINAL/list/impacted_areas_weighted = list() /// The total number of turfs impacted by weather across all z-levels and areas. - var/total_impacted_turfs = 0 + VAR_FINAL/total_impacted_turfs = 0 /// Areas affected by weather have their blend modes changed - var/list/impacted_areas_blend_modes = list() + VAR_FINAL/list/impacted_areas_blend_modes = list() /// Areas that are protected and excluded from the affected areas. var/list/protected_areas = list() /// The list of z-levels that this weather is actively affecting - var/impacted_z_levels + VAR_FINAL/impacted_z_levels /// A weighted list of z-levels impacted by weather, where weights reflect the total turf count on each level - var/list/impacted_z_levels_weighted = list() + VAR_FINAL/list/impacted_z_levels_weighted = list() /// Since it's above everything else, this is the layer used by default. var/overlay_layer = AREA_LAYER @@ -109,15 +109,15 @@ var/weather_flags = NONE /// List of current mobs being processed by weather - var/list/current_mobs = list() + VAR_FINAL/list/current_mobs = list() /// The weather turf counter to keep track of how many turfs we have processed so far - var/turf_iteration = 0 + VAR_FINAL/turf_iteration = 0 /// The weather thunder counter to keep track of how much thunder we have processed so far - var/thunder_iteration = 0 + VAR_FINAL/thunder_iteration = 0 /// Index of the current section our weather subsystem is processing from our subsystem_tasks - var/task_index = 1 + VAR_FINAL/task_index = 1 /// The list of allowed tasks our weather subsystem is allowed to process (determined by weather_flags) - var/list/subsystem_tasks = list() + VAR_FINAL/list/subsystem_tasks = list() /// The temperature of our weather that is applied to weather reagents and mobs using adjust_bodytemperature() var/weather_temperature = T20C @@ -137,11 +137,12 @@ ..() impacted_z_levels = z_levels - area_type = weather_data?["area"] || area_type - weather_flags = weather_data?["weather_flags"] || weather_flags - turf_thunder_chance = isnull(weather_data?["thunder_chance"]) ? turf_thunder_chance : weather_data?["thunder_chance"] + weather_flags = isnull(weather_data?[WEATHER_FORCED_FLAGS]) ? weather_flags : weather_data?[WEATHER_FORCED_FLAGS] + turf_thunder_chance = isnull(weather_data?[WEATHER_FORCED_THUNDER]) ? turf_thunder_chance : weather_data?[WEATHER_FORCED_THUNDER] + telegraph_duration = isnull(weather_data?[WEATHER_FORCED_TELEGRAPH]) ? telegraph_duration : weather_data?[WEATHER_FORCED_TELEGRAPH] + end_duration = isnull(weather_data?[WEATHER_FORCED_END]) ? end_duration : weather_data?[WEATHER_FORCED_END] - var/datum/reagent/custom_reagent = weather_data?["reagent"] + var/datum/reagent/custom_reagent = weather_data?[WEATHER_FORCED_REAGENT] var/reagent_id if(custom_reagent) reagent_id = custom_reagent @@ -165,7 +166,7 @@ if(weather_flags & (WEATHER_THUNDER)) subsystem_tasks += SSWEATHER_THUNDER - setup_weather_areas() + setup_weather_areas(weather_data?[WEATHER_FORCED_AREAS]) setup_weather_turfs() /datum/weather/Destroy() @@ -179,26 +180,94 @@ * Calculates duration and hit areas, and makes a callback for the actual weather to start * */ -/datum/weather/proc/telegraph() +/datum/weather/proc/telegraph(list/weather_data) if(stage == STARTUP_STAGE) return stage = STARTUP_STAGE SEND_GLOBAL_SIGNAL(COMSIG_WEATHER_TELEGRAPH(type), src) - - weather_duration = rand(weather_duration_lower, weather_duration_upper) + weather_duration = isnull(weather_data?[WEATHER_FORCED_DURATION]) ? rand(weather_duration_lower, weather_duration_upper) : weather_data?[WEATHER_FORCED_DURATION] SSweather.processing |= src update_areas() if(telegraph_duration) send_alert(telegraph_message, telegraph_sound, telegraph_sound_vol) - addtimer(CALLBACK(src, PROC_REF(start)), telegraph_duration) - -/datum/weather/proc/setup_weather_areas() - var/list/affectareas = list() - for(var/area/selected_area as anything in get_areas(area_type)) - affectareas += selected_area - for(var/area/protected_area as anything in protected_areas) - affectareas -= get_areas(protected_area) - for(var/area/affected_area as anything in affectareas) + addtimer(CALLBACK(src, PROC_REF(start)), telegraph_duration, TIMER_UNIQUE) + + // so /datum/element/weather_listener relies on z traits to determine when to set up sound managers + // thus if we force weather on a z level that doesn't match the target trait, we need to manually set up sound managers + if(target_trait) + manually_setup_sound_manager() + +/// Manually add a sound manager to all mobs +/datum/weather/proc/manually_setup_sound_manager() + var/list/filtered_zs = get_impacted_zs_without_trait() + var/list/playlist = get_playlist_ref() + // we only need to manually handle sound managers if there are zs without the trait being affected, fortunately + if(!length(filtered_zs) || isnull(playlist)) + return + + // add in dead mobs so we can get observers covered too + for(var/mob/living/affected as anything in GLOB.mob_living_list | GLOB.dead_mob_list) + if(isnull(affected.client)) + // this registers 400+ odd signals... maybe we should reconsider + RegisterSignal(affected, COMSIG_MOB_LOGIN, PROC_REF(handle_mob_log_in)) + continue + + manually_setup_sound_manager_on_mob(affected, playlist, filtered_zs) + + RegisterSignal(SSdcs, COMSIG_GLOB_MOB_CREATED, PROC_REF(handle_new_mob_sound_manager)) + +/// Returns a reference to the "sound playlist" for this weather type +/datum/weather/proc/get_playlist_ref() + return null + +/// Returns a list of z-levels impacted that do not have the target trait +/datum/weather/proc/get_impacted_zs_without_trait() + var/list/zs_without_trait = list() + for(var/z in impacted_z_levels) + if(!SSmapping.level_trait(z, target_trait)) + zs_without_trait += z + return zs_without_trait + +/datum/weather/proc/handle_new_mob_sound_manager(datum/source, mob/the_mob) + SIGNAL_HANDLER + + if(isnull(the_mob.client)) + RegisterSignal(the_mob, COMSIG_MOB_LOGIN, PROC_REF(handle_mob_log_in)) + return + + manually_setup_sound_manager_on_mob(the_mob) + +/datum/weather/proc/handle_mob_log_in(mob/source) + SIGNAL_HANDLER + + if(stage >= END_STAGE) + stack_trace("Attempted to add a sound manager to a mob after weather ended") + UnregisterSignal(source, COMSIG_MOB_LOGIN) + return + + manually_setup_sound_manager_on_mob(source) + +/datum/weather/proc/manually_setup_sound_manager_on_mob(mob/living/affected, list/playlist = get_playlist_ref(), list/filtered_zs = get_impacted_zs_without_trait()) + PRIVATE_PROC(TRUE) + + var/list/sound_change_signals = list( + COMSIG_WEATHER_TELEGRAPH(type), + COMSIG_WEATHER_START(type), + COMSIG_WEATHER_WINDDOWN(type), + ) + + var/datum/component/our_comp = affected.AddComponent( \ + /datum/component/area_sound_manager, \ + area_loop_pairs = playlist, \ + acceptable_zs = filtered_zs, \ + ) + our_comp.RegisterSignals(SSdcs, sound_change_signals, TYPE_PROC_REF(/datum/component/area_sound_manager, handle_change)) + our_comp.RegisterSignal(SSdcs, COMSIG_WEATHER_END(type), TYPE_PROC_REF(/datum/component/area_sound_manager, handle_removal)) + +/datum/weather/proc/setup_weather_areas(list/forced_areas) + for(var/area/affected_area as anything in (forced_areas || get_areas(area_type))) + if(is_type_in_list(affected_area, protected_areas)) + continue if(!(weather_flags & WEATHER_INDOORS) && !affected_area.outdoors) continue @@ -263,7 +332,7 @@ update_areas() send_alert(weather_message, weather_sound) if(!(weather_flags & (WEATHER_ENDLESS))) - addtimer(CALLBACK(src, PROC_REF(wind_down)), weather_duration) + addtimer(CALLBACK(src, PROC_REF(wind_down)), weather_duration, TIMER_UNIQUE) for(var/area/impacted_area as anything in impacted_areas) SEND_SIGNAL(impacted_area, COMSIG_WEATHER_BEGAN_IN_AREA(type), src) @@ -281,7 +350,7 @@ stage = WIND_DOWN_STAGE update_areas() send_alert(end_message, end_sound, end_sound_vol) - addtimer(CALLBACK(src, PROC_REF(end)), end_duration) + addtimer(CALLBACK(src, PROC_REF(end)), end_duration, TIMER_UNIQUE) /** * Fully ends the weather @@ -294,12 +363,17 @@ if(stage == END_STAGE) return SEND_GLOBAL_SIGNAL(COMSIG_WEATHER_END(type), src) + UnregisterSignal(SSdcs, COMSIG_GLOB_MOB_CREATED) 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), src) + if(target_trait) + for(var/mob/living/affected as anything in GLOB.mob_living_list | GLOB.dead_mob_list) + UnregisterSignal(affected, COMSIG_MOB_LOGIN) + // handles sending all alerts /datum/weather/proc/send_alert(alert_msg, alert_sfx, alert_sfx_vol = 100) for(var/z_level in impacted_z_levels) @@ -315,7 +389,24 @@ // the checks for if a mob should receive alerts, returns TRUE if can /datum/weather/proc/can_get_alert(mob/player) var/turf/mob_turf = get_turf(player) - return !isnull(mob_turf) + if(isnull(mob_turf)) + return FALSE + + if((weather_flags & WEATHER_STRICT_ALERT) && !can_see_weather(player)) + return FALSE + + return TRUE + +/// Checks if the player is in or can see an area affected by the weather +/datum/weather/proc/can_see_weather(mob/player) + if(HAS_MIND_TRAIT(player, TRAIT_DETECT_STORM)) + return TRUE + + for(var/area/nearby in view(player)) + if(nearby in impacted_areas) + return TRUE + + return FALSE /** * Returns TRUE if the living mob can be affected by the weather @@ -427,19 +518,16 @@ to_chat(hit_mob, span_userdanger("You've been struck by lightning!")) hit_mob.electrocute_act(50, "thunder", flags = SHOCK_TESLA|SHOCK_NOGLOVES) - for(var/obj/hit_thing in weather_turf) - if(QDELETED(hit_thing)) // stop, it's already dead + for(var/obj/item/stack/ore/hit_ore in weather_turf) + if(QDELETED(hit_ore)) continue - if(!hit_thing.uses_integrity) - continue - if(hit_thing.invisibility != INVISIBILITY_NONE) - continue - if(HAS_TRAIT(hit_thing, TRAIT_UNDERFLOOR)) - continue - hit_thing.take_damage(20, BURN, ENERGY, FALSE) - playsound(weather_turf, 'sound/effects/magic/lightningbolt.ogg', 100, extrarange = 10, falloff_distance = 10) + // ores that get struck by thunder are smelted + // a bolt of lightning can reach temperatures of 30,000 Kelvin which is 5x hotter than the sun + hit_ore.fire_act(30000) + + playsound(weather_turf, 'modular_darkpack/master_files/sounds/lightning.ogg', 100, extrarange = 50, falloff_distance = 50) // DARKPACK EDIT CHANGE weather_turf.visible_message(span_danger("A thunderbolt strikes [weather_turf]!")) - explosion(weather_turf, light_impact_range = 1, flame_range = 1, silent = TRUE, adminlog = FALSE) + new /obj/effect/hotspot(weather_turf) /** * Updates the overlays on impacted areas diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm index 2eb77ff33f0f..367977a90bca 100644 --- a/code/datums/weather/weather_types/ash_storm.dm +++ b/code/datums/weather/weather_types/ash_storm.dm @@ -28,6 +28,9 @@ var/list/weak_sounds = list() var/list/strong_sounds = list() +/datum/weather/ash_storm/get_playlist_ref() + return GLOB.ash_storm_sounds + /datum/weather/ash_storm/telegraph() for(var/area/impacted_area as anything in impacted_areas) if(impacted_area.outdoors) @@ -61,7 +64,7 @@ return TRUE /datum/weather/ash_storm/weather_act_mob(mob/living/victim) - victim.adjustFireLoss(4, required_bodytype = BODYTYPE_ORGANIC) + victim.adjust_fire_loss(4, required_bodytype = BODYTYPE_ORGANIC) return ..() /datum/weather/ash_storm/end() diff --git a/code/datums/weather/weather_types/floor_is_lava.dm b/code/datums/weather/weather_types/floor_is_lava.dm index 14130421e6e4..2dcbbed0aa75 100644 --- a/code/datums/weather/weather_types/floor_is_lava.dm +++ b/code/datums/weather/weather_types/floor_is_lava.dm @@ -44,5 +44,5 @@ return FALSE /datum/weather/floor_is_lava/weather_act_mob(mob/living/victim) - victim.adjustFireLoss(3) + victim.adjust_fire_loss(3) return ..() diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index 671dedfa428b..d55938e2bd9d 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -17,10 +17,29 @@ end_message = span_notice("The air seems to be cooling off again.") area_type = /area - protected_areas = list(/area/station/maintenance, /area/station/ai_monitored/turret_protected/ai_upload, /area/station/ai_monitored/turret_protected/ai_upload_foyer, - /area/station/ai_monitored/turret_protected/aisat/maint, /area/station/ai_monitored/command/storage/satellite, - /area/station/ai_monitored/turret_protected/ai, /area/station/commons/storage/emergency/starboard, /area/station/commons/storage/emergency/port, - /area/shuttle, /area/station/security/prison/safe, /area/station/security/prison/toilet, /area/mine/maintenance, /area/icemoon/underground, /area/ruin/comms_agent/maint) + protected_areas = list( + // General areas + /area/station/maintenance, // This is where we tell people to go + /area/shuttle, // Would be quite rude + + // AI + /area/station/ai/satellite/maintenance, // Duh... + /area/station/ai/upload, + /area/station/ai/satellite/chamber, + + // Rad shelters + /area/station/commons/storage/emergency/starboard, + /area/station/commons/storage/emergency/port, + + // Prison + /area/station/security/prison/safe, + /area/station/security/prison/toilet, + + // Off-station + /area/mine/maintenance, + /area/ruin/comms_agent/maint, + /area/icemoon/underground, + ) target_trait = ZTRAIT_STATION immunity_type = TRAIT_RADSTORM_IMMUNE diff --git a/code/datums/weather/weather_types/rain_storm.dm b/code/datums/weather/weather_types/rain_storm.dm index 1a4da05eb2af..4516112824c4 100644 --- a/code/datums/weather/weather_types/rain_storm.dm +++ b/code/datums/weather/weather_types/rain_storm.dm @@ -27,10 +27,20 @@ weather_flags = (WEATHER_TURFS | WEATHER_MOBS | WEATHER_THUNDER | WEATHER_BAROMETER) whitelist_weather_reagents = list(/datum/reagent/water) +/datum/weather/rain_storm/get_playlist_ref() + return GLOB.rain_storm_sounds + /datum/weather/rain_storm/telegraph() GLOB.rain_storm_sounds.Cut() for(var/area/impacted_area as anything in impacted_areas) GLOB.rain_storm_sounds[impacted_area] = /datum/looping_sound/rain/start + + // change the message for if rain is triggered inside the station (no canopy of course) + for(var/z in impacted_z_levels) + if(is_station_level(z)) + telegraph_message = span_warning("Thunder rumbles from above. You hear droplets hitting the floor around you.") + break + return ..() /datum/weather/rain_storm/start() @@ -92,14 +102,7 @@ desc = "A magical thunderstorm rains down below, drenching anyone caught in it with mysterious rain." telegraph_message = span_danger("A magical rain cloud appears above. You hear droplets falling down.") - protected_areas = list( - /area/station/maintenance, /area/station/ai_monitored/turret_protected/ai_upload, - /area/station/ai_monitored/turret_protected/ai_upload_foyer, /area/station/ai_monitored/turret_protected/aisat/maint, - /area/station/ai_monitored/command/storage/satellite, /area/station/ai_monitored/turret_protected/ai, - /area/station/commons/storage/emergency/starboard, /area/station/commons/storage/emergency/port, - /area/shuttle, /area/station/security/prison/safe, /area/station/security/prison/toilet, /area/mine/maintenance, - /area/icemoon/underground, /area/ruin/comms_agent/maint - ) + protected_areas = /datum/weather/rad_storm::protected_areas // same time durations as floor_is_lava event telegraph_duration = 15 SECONDS diff --git a/code/datums/weather/weather_types/sand_storm.dm b/code/datums/weather/weather_types/sand_storm.dm index 89d71c09ae54..fdac54739e3d 100644 --- a/code/datums/weather/weather_types/sand_storm.dm +++ b/code/datums/weather/weather_types/sand_storm.dm @@ -24,6 +24,9 @@ weather_flags = (WEATHER_MOBS | WEATHER_BAROMETER) +/datum/weather/sand_storm/get_playlist_ref() + return GLOB.sand_storm_sounds + /datum/weather/sand_storm/telegraph() GLOB.sand_storm_sounds.Cut() for(var/area/impacted_area as anything in impacted_areas) @@ -43,7 +46,7 @@ return ..() /datum/weather/sand_storm/weather_act_mob(mob/living/victim) - victim.adjustBruteLoss(5, required_bodytype = BODYTYPE_ORGANIC) + victim.adjust_brute_loss(5, required_bodytype = BODYTYPE_ORGANIC) return ..() /datum/weather/sand_storm/harmless diff --git a/code/datums/weather/weather_types/snow_storm.dm b/code/datums/weather/weather_types/snow_storm.dm index 01a07df61336..f4a3baaa1900 100644 --- a/code/datums/weather/weather_types/snow_storm.dm +++ b/code/datums/weather/weather_types/snow_storm.dm @@ -28,7 +28,10 @@ // snowstorms should be colder than default icebox atmos weather_temperature = ICEBOX_MIN_TEMPERATURE - 40 // snowstorms temperature ignores any clothing insulation - weather_flags = (WEATHER_MOBS | WEATHER_BAROMETER | WEATHER_TEMPERATURE_BYPASS_CLOTHING) + weather_flags = (WEATHER_MOBS | WEATHER_BAROMETER | WEATHER_TEMPERATURE_BYPASS_CLOTHING | WEATHER_STRICT_ALERT) + +/datum/weather/snow_storm/get_playlist_ref() + return GLOB.snowstorm_sounds /datum/weather/snow_storm/start() GLOB.snowstorm_sounds.Cut() // it's passed by ref @@ -40,29 +43,6 @@ GLOB.snowstorm_sounds.Cut() return ..() -// since snowstorm is on a station z level, add extra checks to not annoy everyone -/datum/weather/snow_storm/can_get_alert(mob/player) - if(!..()) - return FALSE - - if(!is_station_level(player.z)) - return TRUE // bypass checks - - if(isobserver(player)) - return TRUE - - if(HAS_MIND_TRAIT(player, TRAIT_DETECT_STORM)) - return TRUE - - if(istype(get_area(player), /area/mine)) - return TRUE - - for(var/area/snow_area in impacted_areas) - if(locate(snow_area) in view(player)) - return TRUE - - return FALSE - ///A storm that doesn't stop storming, and is a bit stronger /datum/weather/snow_storm/forever_storm telegraph_duration = 0 SECONDS diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index b53bb64183bb..739b5e8adecd 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -22,9 +22,9 @@ return FALSE /atom/proc/attempt_wire_interaction(mob/user) - if(!wires) + if(isnull(wires)) return WIRE_INTERACTION_FAIL - if(!user.CanReach(src)) + if(!IsReachableBy(user)) return WIRE_INTERACTION_FAIL INVOKE_ASYNC(wires, TYPE_PROC_REF(/datum/wires, interact), user) return WIRE_INTERACTION_BLOCK @@ -43,13 +43,13 @@ var/wire_behavior = WIRES_INPUT /// List of all wires. - var/list/wires = list() + var/list/wires /// List of cut wires. - var/list/cut_wires = list() // List of wires that have been cut. + var/list/cut_wires // List of wires that have been cut. /// Dictionary of colours to wire. - var/list/colors = list() + var/list/colors /// List of attached assemblies. - var/list/assemblies = list() + var/list/assemblies /// If every instance of these wires should be random. Prevents wires from showing up in station blueprints. var/randomize = FALSE @@ -103,10 +103,10 @@ holder = null //properly clear refs to avoid harddels & other problems for(var/color in assemblies) - var/obj/item/assembly/assembly = assemblies[color] + var/obj/item/assembly/assembly = LAZYACCESS(assemblies, color) assembly.holder = null assembly.connected = null - LAZYCLEARLIST(assemblies) + LAZYNULL(assemblies) return ..() /// Adds a number of wires which do absolutely nothing. @@ -115,7 +115,7 @@ var/dud = WIRE_DUD_PREFIX + "[--duds]" if(dud in wires) continue - wires += dud + LAZYADD(wires, dud) ///Called when holder is qdeleted for us to clean ourselves as not to leave any unlawful references. /datum/wires/proc/on_holder_qdel(atom/source, force) @@ -124,7 +124,7 @@ qdel(src) /datum/wires/proc/randomize() - if(length(wires) > length(default_possible_colors)) + if(LAZYLEN(wires) > length(default_possible_colors)) stack_trace("Wire type [type] has more wires than possible colors, consider adding more colors or removing wires.") var/list/possible_colors = default_possible_colors.Copy() @@ -132,10 +132,10 @@ for(var/wire in shuffle(wires)) if(!length(possible_colors)) possible_colors = default_possible_colors.Copy() - colors[pick_n_take(possible_colors)] = wire + LAZYSET(colors, pick_n_take(possible_colors), wire) /datum/wires/proc/shuffle_wires() - colors.Cut() + LAZYCLEARLIST(colors) randomize() /datum/wires/proc/repair() @@ -143,7 +143,7 @@ cut(wire) // I KNOW I KNOW OK /datum/wires/proc/get_wire(color) - return colors[color] + return LAZYACCESS(colors, color) /datum/wires/proc/get_color_of_wire(wire_type) for(var/color in colors) @@ -152,12 +152,12 @@ return color /datum/wires/proc/get_attached(color) - if(assemblies[color]) - return assemblies[color] + if(LAZYACCESS(assemblies, color)) + return LAZYACCESS(assemblies, color) return null /datum/wires/proc/is_attached(color) - if(assemblies[color]) + if(LAZYACCESS(assemblies, color)) return TRUE /datum/wires/proc/is_cut(wire) @@ -167,7 +167,7 @@ return is_cut(get_wire(color)) /datum/wires/proc/is_all_cut() - if(cut_wires.len == wires.len) + if(LAZYLEN(cut_wires) == LAZYLEN(wires)) return TRUE /datum/wires/proc/is_dud(wire) @@ -178,11 +178,11 @@ /datum/wires/proc/cut(wire, mob/living/source) if(is_cut(wire)) - cut_wires -= wire + LAZYREMOVE(cut_wires, wire) SEND_SIGNAL(src, COMSIG_MEND_WIRE(wire), wire) on_cut(wire, mend = TRUE, source = source) else - cut_wires += wire + LAZYADD(cut_wires, wire) SEND_SIGNAL(src, COMSIG_CUT_WIRE(wire), wire) on_cut(wire, mend = FALSE, source = source) @@ -190,7 +190,7 @@ cut(get_wire(color), source) /datum/wires/proc/cut_random(source) - cut(wires[rand(1, wires.len)], source) + cut(LAZYACCESS(wires, rand(1, LAZYLEN(wires))), source) /datum/wires/proc/cut_all(source) for(var/wire in wires) @@ -205,26 +205,26 @@ /datum/wires/proc/pulse_color(color, mob/living/user, force=FALSE) pulse(get_wire(color), user, force) -/datum/wires/proc/pulse_assembly(obj/item/assembly/S) - for(var/color in assemblies) - if(S == assemblies[color]) +/datum/wires/proc/pulse_assembly(obj/item/assembly/assembly) + for(var/color, our_assembly in assemblies) + if(assembly == our_assembly) pulse_color(color, force=TRUE) return TRUE -/datum/wires/proc/attach_assembly(color, obj/item/assembly/S) - if(S && istype(S) && S.assembly_behavior && !is_attached(color) && !(SEND_SIGNAL(S, COMSIG_ASSEMBLY_PRE_ATTACH, holder) & COMPONENT_CANCEL_ATTACH)) - assemblies[color] = S - S.forceMove(holder) - S.connected = src - S.on_attach() // Notify assembly that it is attached - return S +/datum/wires/proc/attach_assembly(color, obj/item/assembly/assembly) + if(assembly && istype(assembly) && assembly.assembly_behavior && !is_attached(color) && !(SEND_SIGNAL(assembly, COMSIG_ASSEMBLY_PRE_ATTACH, holder) & COMPONENT_CANCEL_ATTACH)) + LAZYSET(assemblies, color, assembly) + assembly.forceMove(holder) + assembly.connected = src + assembly.on_attach() // Notify assembly that it is attached + return assembly /datum/wires/proc/detach_assembly(color) - var/obj/item/assembly/S = get_attached(color) - if(S && istype(S)) - assemblies -= color - S.on_detach() // Notify the assembly. This should remove the reference to our holder - return S + var/obj/item/assembly/assembly = get_attached(color) + if(assembly && istype(assembly)) + LAZYREMOVE(assemblies, color) + assembly.on_detach() // Notify the assembly. This should remove the reference to our holder + return assembly /// Called from [/atom/proc/emp_act] /datum/wires/proc/emp_pulse() @@ -259,9 +259,9 @@ if(!interactable(user)) return FALSE ui_interact(user) - for(var/A in assemblies) - var/obj/item/I = assemblies[A] - if(istype(I) && I.on_found(user)) + for(var/color, assembly in assemblies) + var/obj/item/assembly_item = assembly + if(istype(assembly_item) && assembly_item.on_found(user)) break return TRUE diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 8c09520cab09..1c7000c916cf 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -94,7 +94,7 @@ status += "The speed light is [A.normalspeed ? "on" : "off"]." status += "The emergency light is [A.emergency ? "on" : "off"]." - if(A.unres_sensor) + if(A.unres_latch) status += "The unrestricted exit display is [A.unres_sides ? "indicating that it is letting people pass from the [dir2text(REVERSE_DIR(A.unres_sides))]" : "faintly flickering"]." else status += "The unrestricted exit display is completely inactive." @@ -150,7 +150,7 @@ A.feedback = !A.feedback 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) + if(!A.unres_latch) //only works if the "latch" 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 = REVERSE_DIR(A.unres_sides) A.update_appearance() @@ -217,7 +217,7 @@ if(isliving(usr)) A.shock(usr, 50) if(WIRE_UNRESTRICTED_EXIT) // If this wire is cut, the unrestricted helper goes away. If you mend it, it'll go "haywire" and pick a new direction at random. Might have to cut/mend a time or two to get the direction you want. - 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) + if(!A.unres_latch) //only works if the "latch" 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 if(mend) A.unres_sides = pick(NORTH, SOUTH, EAST, WEST) diff --git a/code/datums/wires/mulebot.dm b/code/datums/wires/mulebot.dm index 31bfe164b549..c3b4efe3460e 100644 --- a/code/datums/wires/mulebot.dm +++ b/code/datums/wires/mulebot.dm @@ -30,7 +30,7 @@ if(is_cut(WIRE_MOTOR1) && is_cut(WIRE_MOTOR2)) ADD_TRAIT(mule, TRAIT_IMMOBILIZED, MOTOR_LACK_TRAIT) holder.audible_message(span_hear("The motors of [mule] go silent."), null, 1) - else + else if(HAS_TRAIT_FROM(mule, TRAIT_IMMOBILIZED, MOTOR_LACK_TRAIT)) REMOVE_TRAIT(mule, TRAIT_IMMOBILIZED, MOTOR_LACK_TRAIT) holder.audible_message(span_hear("The motors of [mule] whir to life!"), null, 1) diff --git a/code/datums/wounds/_wound_static_data.dm b/code/datums/wounds/_wound_static_data.dm index cd8d2a78caf6..f0da2a822886 100644 --- a/code/datums/wounds/_wound_static_data.dm +++ b/code/datums/wounds/_wound_static_data.dm @@ -26,10 +26,9 @@ /// 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 type 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/required_wounding_type /// 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 @@ -40,12 +39,10 @@ /// 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]. + /// 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. 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. @@ -77,7 +74,7 @@ /** * 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. + * * suggested_wounding_typs: The wounding type to be checked against the wounding type we require. Defaults to required_wounding_type. * * 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. * @@ -86,19 +83,16 @@ * if we have a biotype mismatch, if the limb isn't in a viable zone, or if there's 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) +/datum/wound_pregen_data/proc/can_be_applied_to(obj/item/bodypart/limb, suggested_wounding_type = required_wounding_type, 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) + if (!istype(limb)) return FALSE if (random_roll && !can_be_randomly_generated) return FALSE - if (HAS_TRAIT(limb.owner, TRAIT_NEVER_WOUNDED) || HAS_TRAIT(limb.owner, TRAIT_GODMODE)) - return FALSE - - if (!wounding_types_valid(suggested_wounding_types)) + if (!wounding_types_valid(suggested_wounding_type)) return FALSE if (care_about_existing_wounds) @@ -151,22 +145,11 @@ /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) +/// Returns TRUE if we use WOUND_ALL or our wounding type +/datum/wound_pregen_data/proc/wounding_types_valid(suggested_wounding_type) + if (required_wounding_type == WOUND_ALL) return TRUE - if (!length(suggested_wounding_types)) - return FALSE - - for (var/iter_wounding_type 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 + return suggested_wounding_type == required_wounding_type /** * A simple getter for [threshold_minimum], with arguments supplied to allow custom behavior. diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index 52afebe24078..5941718110a2 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -63,8 +63,6 @@ /// 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 /// 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 @@ -93,8 +91,6 @@ /// What status effect we assign on application 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 * [base_xadone_progress_to_qdel] power var/cryo_progress @@ -123,9 +119,8 @@ update_actionspeed_modifier() /datum/wound/Destroy() - QDEL_NULL(attached_surgery) if (limb) - remove_wound() + remove_wound(destroying = QDELING(limb)) QDEL_NULL(actionspeed_mod) @@ -177,16 +172,15 @@ * * * Arguments: - * * L: The bodypart we're wounding, we don't care about the person, we can get them through the limb + * * limb: The bodypart we're wounding, we don't care about the person, we can get them through the limb * * silent: Not actually necessary I don't think, was originally used for demoting wounds so they wouldn't make new messages, but I believe old_wound took over that, I may remove this shortly * * old_wound: If our new wound is a replacement for one of the same time (promotion or demotion), we can reference the old one just before it's removed to copy over necessary vars * * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented) * * attack_direction: For bloodsplatters, if relevant * * 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", replacing = FALSE) - - if (!can_be_applied_to(L, old_wound)) +/datum/wound/proc/apply_wound(obj/item/bodypart/limb, silent = FALSE, datum/wound/old_wound = null, smited = FALSE, attack_direction = null, wound_source = "Unknown", replacing = FALSE) + if (!limb.is_woundable() || !can_be_applied_to(limb, old_wound)) qdel(src) return FALSE @@ -198,8 +192,8 @@ else src.wound_source = "Unknown" - set_victim(L.owner) - set_limb(L, replacing) + set_victim(limb.owner) + set_limb(limb, replacing) LAZYADD(victim.all_wounds, src) LAZYADD(limb.wounds, src) update_descriptions() @@ -226,7 +220,7 @@ victim.visible_message(msg, span_userdanger("Your [limb.plaintext_zone] [occur_text]!"), vision_distance = vis_dist) if(sound_effect) - playsound(L.owner, sound_effect, sound_volume + (20 * severity), TRUE, falloff_exponent = SOUND_FALLOFF_EXPONENT + 2, ignore_walls = FALSE, falloff_distance = 0) + playsound(limb.owner, sound_effect, sound_volume + (20 * severity), TRUE, falloff_exponent = SOUND_FALLOFF_EXPONENT + 2, ignore_walls = FALSE, falloff_distance = 0) wound_injury(old_wound, attack_direction = attack_direction) if(!demoted) @@ -235,13 +229,13 @@ 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) +/datum/wound/proc/can_be_applied_to(obj/item/bodypart/limb, 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) + return pregen_data.can_be_applied_to(limb, old_wound = old_wound) /// Returns the zones we can be applied to. /datum/wound/proc/get_viable_zones() @@ -270,6 +264,7 @@ UnregisterSignal(victim, COMSIG_QDELETING) UnregisterSignal(victim, COMSIG_MOB_SWAP_HANDS) UnregisterSignal(victim, COMSIG_CARBON_POST_REMOVE_LIMB) + UnregisterSignal(victim, COMSIG_ATOM_ITEM_INTERACTION) if (actionspeed_mod) victim.remove_actionspeed_modifier(actionspeed_mod) // no need to qdelete it, just remove it from our victim @@ -278,13 +273,15 @@ 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)) - + RegisterSignal(victim, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(interact_try_treating)) 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) +/// * replaced - Is the wound being overriden by another (stronger) wound? +/// * destroying - Is this coming from a limb's Destroy() call? If so, cut down on updates we cause +/datum/wound/proc/set_limb(obj/item/bodypart/new_value, replaced = FALSE, destroying = 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 @@ -292,7 +289,8 @@ UnregisterSignal(limb, COMSIG_QDELETING) UnregisterSignal(limb, list(COMSIG_BODYPART_GAUZED, COMSIG_BODYPART_UNGAUZED)) LAZYREMOVE(limb.wounds, src) - limb.update_wounds(replaced) + if (!destroying) + limb.update_wounds(replaced) if (disabling) limb.remove_traits(list(TRAIT_PARALYSIS, TRAIT_DISABLED_BY_WOUND), REF(src)) @@ -328,14 +326,17 @@ SIGNAL_HANDLER qdel(src) -/// Remove the wound from whatever it's afflicting, and cleans up whatever status 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) +/// Remove the wound from whatever it's afflicting, and cleans up whatever status effects it had or modifiers it had on interaction times. +/// * ignore_limb - Used for detachments where we only want to forget the victim +/// * replaced - If the wound is being replaced by another type +/// * destroying - If we're being removed by a limb getting destroyed +/datum/wound/proc/remove_wound(ignore_limb, replaced = FALSE, destroying = 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 && can_scar && !already_scarred && !replaced) + if(limb && can_scar && !already_scarred && !replaced && !destroying) already_scarred = TRUE var/datum/scar/new_scar = new new_scar.generate(limb, src) @@ -345,12 +346,12 @@ null_victim() // we use the proc here because some behaviors may depend on changing victim to some new value if(limb && !ignore_limb) - set_limb(null, replaced) // since we're removing limb's ref to us, we should do the same + set_limb(null, replaced, destroying) // since we're removing limb's ref to us, we should do the same // if you want to keep the ref, do it externally, there's 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) + SEND_SIGNAL(mob_victim, COMSIG_CARBON_POST_LOSE_WOUND, src, old_limb, ignore_limb, replaced, destroying) if(!replaced && !limb) mob_victim.update_health_hud() @@ -460,69 +461,78 @@ if(WOUND_SEVERITY_LOSS) victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_LOSS) +/datum/wound/proc/interact_try_treating(datum/source, mob/living/user, obj/item/tool, ...) + SIGNAL_HANDLER + + return try_treating(tool, user) + /** - * try_treating() is an intercept run from [/mob/living/carbon/proc/attackby] right after surgeries but before anything else. Return TRUE here if the item is something that is relevant to treatment to take over the interaction. + * Attempt to treat the wound with the given item/tool by the given user + * This proc leads into [/datum/wound/proc/treat] * - * This proc leads into [/datum/wound/proc/treat] and probably shouldn't be added onto in children types. You can specify what items or tools you want to be intercepted - * with var/list/treatable_by and var/treatable_tool, then if an item fulfills one of those requirements and our wound claims it first, it goes over to treat() and treat_self(). + * You can specify what items or tools you want to be intercepted + * with var/list/treatable_by and var/treatable_tool, + * then if an item fulfills one of those requirements and our wound claims it first, + * it goes over to treat() and treat_self(). * * Arguments: * * I: The item we're trying to use * * user: The mob trying to use it on us */ -/datum/wound/proc/try_treating(obj/item/I, mob/user) - // first we weed out if we're not dealing with our wound's bodypart, or if it might be an attack - if(!I || limb.body_zone != user.zone_selected) - return FALSE +/datum/wound/proc/try_treating(obj/item/tool, mob/living/user) + SHOULD_NOT_OVERRIDE(TRUE) - if(isliving(user)) - var/mob/living/tendee = user - if(I.force && tendee.combat_mode) - return FALSE + if(limb.body_zone != user.zone_selected) + return NONE - if(!item_can_treat(I, user)) - return FALSE + if(user.combat_mode && tool.force) + return NONE + + if(!item_can_treat(tool, user)) + return NONE - // 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 + // 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 if(DOING_INTERACTION_WITH_TARGET(user, victim)) to_chat(user, span_warning("You're already interacting with [victim]!")) - return TRUE + return ITEM_INTERACT_BLOCKING // next we check if the bodypart in actually accessible (not under thick clothing). We skip the species trait check since skellies // & such may need to use bone gel but may be wearing a space suit for..... whatever reason a skeleton would wear a space suit for if(ishuman(victim)) var/mob/living/carbon/human/victim_human = victim if(!victim_human.try_inject(user, injection_flags = INJECT_CHECK_IGNORE_SPECIES | INJECT_TRY_SHOW_ERROR_MESSAGE)) - return TRUE + return ITEM_INTERACT_BLOCKING - // lastly, treat them - return treat(I, user) // we allow treat to return a value so it can control if the item does its normal interaction or not + INVOKE_ASYNC(src, PROC_REF(treat), tool, user) + return ITEM_INTERACT_SUCCESS /// 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)) + if((user == victim || (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 + if(is_type_in_list(potential_treater, treatable_by)) + return TRUE + return FALSE -/// 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) +/// 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/tool, mob/user) return FALSE -/// Like try_treating() but for unhanded interactions, used by joint dislocations for manual bodypart chiropractice for example. Ignores thick material checks since you can pop an arm into place through a thick suit unlike using sutures +/// Like try_treating() but for unhanded interactions, used by joint dislocations for manual bodypart chiropractice for example. +/// Ignores thick material checks since you can pop an arm into place through a thick suit unlike using sutures /datum/wound/proc/try_handling(mob/living/user) return FALSE /// Someone is using something that might be used for treating the wound on this limb -/datum/wound/proc/treat(obj/item/I, mob/user) +/datum/wound/proc/treat(obj/item/tool, mob/user) return /// If var/processing is TRUE, this is run on each life tick @@ -743,7 +753,7 @@ var/datum/wound_pregen_data/pregen_data = get_pregen_data() - if ((WOUND_BLUNT in pregen_data.required_wounding_types) && severity >= WOUND_SEVERITY_CRITICAL) + if (pregen_data.required_wounding_type == WOUND_BLUNT && 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. diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm index 8103f7047f1a..b3e3051fefdd 100644 --- a/code/datums/wounds/bones.dm +++ b/code/datums/wounds/bones.dm @@ -8,7 +8,7 @@ abstract = TRUE required_limb_biostate = BIO_BONE - required_wounding_types = list(WOUND_BLUNT) + required_wounding_type = WOUND_BLUNT wound_series = WOUND_SERIES_BONE_BLUNT_BASIC @@ -69,7 +69,7 @@ return ..() -/datum/wound/blunt/bone/remove_wound(ignore_limb, replaced) +/datum/wound/blunt/bone/remove_wound(ignore_limb, replaced, destroying) limp_slowdown = 0 limp_chance = 0 QDEL_NULL(active_trauma) @@ -88,7 +88,7 @@ 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) - var/is_bone_limb = ((limb.biological_state & BIO_BONE) && !(limb.biological_state & BIO_FLESH)) + var/is_bone_limb = ((limb.biological_state & BIO_BONE) && !(limb.biological_state & (BIO_FLESH|BIO_CHITIN))) if(!gelled || (!taped && !is_bone_limb)) return @@ -101,7 +101,7 @@ if(!is_bone_limb && SPT_PROB(severity * 1.5, seconds_per_tick)) victim.take_bodypart_damage(rand(1, severity * 2), wound_bonus=CANT_WOUND) - victim.adjustStaminaLoss(rand(2, severity * 2.5)) + victim.adjust_stamina_loss(rand(2, severity * 2.5)) if(prob(33)) to_chat(victim, span_danger("You feel a sharp pain in your body as your bones are reforming!")) @@ -169,7 +169,7 @@ if(!victim || wounding_dmg < WOUND_MINIMUM_DAMAGE || !victim.can_bleed()) return - if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume && prob(internal_bleeding_chance + wounding_dmg)) + if(limb.body_zone == BODY_ZONE_CHEST && victim.get_blood_volume() && prob(internal_bleeding_chance + wounding_dmg)) var/blood_bled = rand(1, wounding_dmg * (severity == WOUND_SEVERITY_CRITICAL ? 2 : 1.5)) // 12 brute toolbox can cause up to 18/24 bleeding with a severe/critical chest wound switch(blood_bled) if(1 to 6) @@ -338,19 +338,19 @@ victim.apply_damage(10, BRUTE, limb, wound_bonus = CANT_WOUND) malpractice(user) -/datum/wound/blunt/bone/moderate/treat(obj/item/I, mob/user) +/datum/wound/blunt/bone/moderate/treat(obj/item/tool, 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 [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" : ""]...")) + victim.visible_message(span_danger("[user] begins [scanned ? "expertly" : ""] resetting [victim.p_their()] [limb.plaintext_zone] with [tool]."), span_warning("You begin resetting your [limb.plaintext_zone] with [tool][scanned ? ", keeping the holo-image's indications in mind" : ""]...")) else - 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" : ""]...")) + user.visible_message(span_danger("[user] begins [scanned ? "expertly" : ""] resetting [victim]'s [limb.plaintext_zone] with [tool]."), span_notice("You begin resetting [victim]'s [limb.plaintext_zone] with [tool][scanned ? ", keeping the holo-image's indications in mind" : ""]...")) if(!do_after(user, treatment_delay, target = victim, extra_checks=CALLBACK(src, PROC_REF(still_exists)))) - return TRUE + return if(victim == user) victim.apply_damage(15, BRUTE, limb, wound_bonus = CANT_WOUND) @@ -362,7 +362,6 @@ victim.emote("scream") qdel(src) - return TRUE /* Severe (Hairline Fracture) @@ -436,6 +435,9 @@ 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)" + /// Tracks if a surgeon has reset the bone (part one of the surgical treatment process) + VAR_FINAL/reset = FALSE + /datum/wound_pregen_data/bone/compound abstract = FALSE @@ -453,7 +455,7 @@ /// if someone is using bone gel on our wound /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)) + if((limb.biological_state & BIO_BONE) && !(limb.biological_state & (BIO_FLESH|BIO_CHITIN))) return skelly_gel(I, user) if(gelled) @@ -533,11 +535,15 @@ processes = TRUE return TRUE -/datum/wound/blunt/bone/treat(obj/item/I, mob/user) - if(istype(I, /obj/item/stack/medical/bone_gel)) - return gel(I, user) - else if(istype(I, /obj/item/stack/sticky_tape/surgical)) - return tape(I, user) +/datum/wound/blunt/bone/item_can_treat(obj/item/potential_treater, mob/user) + // assume that - if working on a ready-to-operate limb - the surgery wants to do the real surgery instead of bone regeneration + return ..() && !HAS_TRAIT(limb, TRAIT_READY_TO_OPERATE) + +/datum/wound/blunt/bone/treat(obj/item/tool, mob/user) + if(istype(tool, /obj/item/stack/medical/bone_gel)) + gel(tool, user) + if(istype(tool, /obj/item/stack/sticky_tape/surgical)) + tape(tool, user) /datum/wound/blunt/bone/get_scanner_description(mob/user) . = ..() @@ -545,7 +551,7 @@ . += "
" if(severity > WOUND_SEVERITY_MODERATE) - if((limb.biological_state & BIO_BONE) && !(limb.biological_state & BIO_FLESH)) + if((limb.biological_state & BIO_BONE) && !(limb.biological_state & (BIO_FLESH|BIO_CHITIN))) if(!gelled) . += "Recommended Treatment: Apply bone gel directly to injured limb. Creatures of pure bone don't seem to mind bone gel application nearly as much as fleshed individuals. Surgical tape will also be unnecessary.\n" else @@ -560,6 +566,6 @@ if(limb.body_zone == BODY_ZONE_HEAD) . += "Cranial Trauma Detected: Patient will suffer random bouts of [severity == WOUND_SEVERITY_SEVERE ? "mild" : "severe"] brain traumas until bone is repaired." - else if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume) + else if(limb.body_zone == BODY_ZONE_CHEST && CAN_HAVE_BLOOD(victim)) . += "Ribcage Trauma Detected: Further trauma to chest is likely to worsen internal bleeding until bone is repaired." . += "
" diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index 5fae2f77e7a9..870df194c537 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -18,23 +18,21 @@ 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 - /// How much damage to our flesh we currently have. Once both this and infestation reach 0, the wound is considered healed + /// How much damage to our flesh we currently have. Once both this and infection 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) + // Infection vars (only for severe and critical) /// How quickly infection breeds on this burn if we don't have disinfectant - var/infestation_rate = 0 + var/infection_rate = 0 /// Our current level of infection - var/infestation = 0 - /// Our current level of sanitization/anti-infection, from disinfectants/alcohol/UV lights. While positive, totally pauses and slowly reverses infestation effects each tick + var/infection = 0 + /// Our current level of sanitization/anti-infection, from disinfectants/alcohol/UV lights. While positive, totally pauses and slowly reverses infection effects each tick var/sanitization = 0 - /// 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) + /// Once we reach infection beyond WOUND_INFECTION_SEPTIC, 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) @@ -44,7 +42,7 @@ . = ..() if(strikes_to_lose_limb <= 0) // we've already hit sepsis, nothing more to do - victim.adjustToxLoss(0.25 * seconds_per_tick) + victim.adjust_tox_loss(0.25 * seconds_per_tick) if(SPT_PROB(0.5, seconds_per_tick)) 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 @@ -56,10 +54,10 @@ if(HAS_TRAIT(victim, TRAIT_VIRUS_RESISTANCE)) sanitization += 0.9 if(HAS_TRAIT(victim, TRAIT_IMMUNODEFICIENCY)) - infestation += 0.05 + infection += 0.05 sanitization = max(sanitization - 0.15, 0) - if(infestation_rate <= 0.15 && prob(50)) - infestation_rate += 0.001 + if(infection_rate <= 0.15 && prob(50)) + infection_rate += 0.001 if(limb.current_gauze) limb.seep_gauze(WOUND_BURN_SANITIZATION_RATE * seconds_per_tick) @@ -69,11 +67,11 @@ flesh_healing = max(flesh_healing - (0.5 * bandage_factor * seconds_per_tick), 0) // good bandages multiply the length of flesh healing // if we have little/no infection, the limb doesn't have much burn damage, and our nutrition is good, heal some flesh - if(infestation <= WOUND_INFECTION_MODERATE && (limb.burn_dam < 5) && (victim.nutrition >= NUTRITION_LEVEL_FED)) + if(infection <= WOUND_INFECTION_MODERATE && (limb.burn_dam < 5) && (victim.nutrition >= NUTRITION_LEVEL_FED)) flesh_healing += 0.2 // here's the check to see if we're cleared up - if((flesh_damage <= 0) && (infestation <= WOUND_INFECTION_MODERATE)) + if((flesh_damage <= 0) && (infection <= WOUND_INFECTION_MODERATE)) to_chat(victim, span_green("The burns on your [limb.plaintext_zone] have cleared up!")) qdel(src) return @@ -81,18 +79,18 @@ // sanitization is checked after the clearing check but before the actual ill-effects, because we freeze the effects of infection while we have sanitization if(sanitization > 0) var/bandage_factor = limb.current_gauze?.burn_cleanliness_bonus || 1 - infestation = max(infestation - (WOUND_BURN_SANITIZATION_RATE * seconds_per_tick), 0) + infection = max(infection - (WOUND_BURN_SANITIZATION_RATE * seconds_per_tick), 0) sanitization = max(sanitization - (WOUND_BURN_SANITIZATION_RATE * bandage_factor * seconds_per_tick), 0) return - infestation += infestation_rate * seconds_per_tick - switch(infestation) + infection += infection_rate * seconds_per_tick + switch(infection) if(0 to WOUND_INFECTION_MODERATE) return if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE) if(SPT_PROB(15, seconds_per_tick)) - victim.adjustToxLoss(0.2) + victim.adjust_tox_loss(0.2) if(prob(6)) to_chat(victim, span_warning("The blisters on your [limb.plaintext_zone] ooze a strange pus...")) @@ -108,7 +106,7 @@ return if(SPT_PROB(10, seconds_per_tick)) - victim.adjustToxLoss(0.5) + victim.adjust_tox_loss(0.5) if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC) if(!disabling) @@ -124,12 +122,12 @@ if(SPT_PROB(2.48, seconds_per_tick)) if(prob(20)) to_chat(victim, span_warning("You contemplate life without your [limb.plaintext_zone]...")) - victim.adjustToxLoss(0.75) + victim.adjust_tox_loss(0.75) else - victim.adjustToxLoss(1) + victim.adjust_tox_loss(1) if(WOUND_INFECTION_SEPTIC to INFINITY) - if(SPT_PROB(0.5 * infestation, seconds_per_tick)) + if(SPT_PROB(0.5 * infection, seconds_per_tick)) strikes_to_lose_limb-- switch(strikes_to_lose_limb) if(2 to INFINITY) @@ -167,7 +165,7 @@ condition += " underneath a dressing of [bandage_condition] [limb.current_gauze.name]." else - switch(infestation) + switch(infection) if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE) condition += ", [span_deadsay("with early signs of infection.")]" if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL) @@ -184,7 +182,7 @@ /datum/wound/burn/flesh/severity_text(simple = FALSE) . = ..() . += " Burn / " - switch(infestation) + switch(infection) if(-INFINITY to WOUND_INFECTION_MODERATE) . += "No" if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE) @@ -206,10 +204,10 @@ . = ..() . += "
" - if(infestation <= sanitization && flesh_damage <= flesh_healing) + if(infection <= sanitization && flesh_damage <= flesh_healing) . += "No further treatment required: Burns will heal shortly." else - switch(infestation) + switch(infection) if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE) . += "Infection Level: Moderate\n" if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL) @@ -218,7 +216,7 @@ . += "Infection Level: [span_deadsay("CRITICAL")]\n" if(WOUND_INFECTION_SEPTIC to INFINITY) . += "Infection Level: [span_deadsay("LOSS IMMINENT")]\n" - if(infestation > sanitization) + if(infection > sanitization) . += "\tSurgical debridement, antibiotics/sterilizers, or regenerative mesh will rid infection. Paramedic UV penlights are also effective.\n" if(flesh_damage > 0) @@ -231,7 +229,7 @@ /// Checks if the wound is in a state that ointment or flesh will help /datum/wound/burn/flesh/proc/can_be_ointmented_or_meshed() - if(infestation > 0 && sanitization < infestation) + if(infection > 0 && sanitization < infection) return TRUE if(flesh_damage > 0 && flesh_healing <= flesh_damage) return TRUE @@ -241,19 +239,18 @@ /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 TRUE - if(infestation <= 0 || infestation < sanitization) + return + if(infection <= 0 || infection < sanitization) to_chat(user, span_notice("There's no infection to treat on [victim]'s [limb.plaintext_zone]!")) - return TRUE + return 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/flesh/treat(obj/item/I, mob/user) - if(istype(I, /obj/item/flashlight/pen/paramedic)) - return uv(I, user) +/datum/wound/burn/flesh/treat(obj/item/tool, mob/user) + if(istype(tool, /obj/item/flashlight/pen/paramedic)) + uv(tool, 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/flesh/on_stasis(seconds_per_tick, times_fired) @@ -264,12 +261,12 @@ return if(flesh_healing > 0) flesh_damage = max(flesh_damage - (0.1 * seconds_per_tick), 0) - if((flesh_damage <= 0) && (infestation <= 1)) + if((flesh_damage <= 0) && (infection <= 1)) to_chat(victim, span_green("The burns on your [limb.plaintext_zone] have cleared up!")) qdel(src) return if(sanitization > 0) - infestation = max(infestation - (0.1 * WOUND_BURN_SANITIZATION_RATE * seconds_per_tick), 0) + infection = max(infection - (0.1 * WOUND_BURN_SANITIZATION_RATE * seconds_per_tick), 0) /datum/wound/burn/flesh/on_synthflesh(reac_volume) flesh_healing += reac_volume * 0.5 // 20u patch will heal 10 flesh standard @@ -277,7 +274,7 @@ /datum/wound_pregen_data/flesh_burn abstract = TRUE - required_wounding_types = list(WOUND_BURN) + required_wounding_type = WOUND_BURN required_limb_biostate = BIO_FLESH wound_series = WOUND_SERIES_FLESH_BURN_BASIC @@ -325,8 +322,8 @@ damage_multiplier_penalty = 1.2 series_threshold_penalty = 40 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 + treatable_by = list(/obj/item/flashlight/pen/paramedic) + infection_rate = 0.07 // appx 9 minutes to reach sepsis without any treatment flesh_damage = 12.5 scar_keyword = "burnsevere" @@ -356,8 +353,8 @@ sound_effect = 'sound/effects/wounds/sizzle2.ogg' threshold_penalty = 25 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 + treatable_by = list(/obj/item/flashlight/pen/paramedic) + infection_rate = 0.075 // appx 4.33 minutes to reach sepsis without any treatment flesh_damage = 20 scar_keyword = "burncritical" diff --git a/code/datums/wounds/cranial_fissure.dm b/code/datums/wounds/cranial_fissure.dm index 6cda116df216..f61e5386fb56 100644 --- a/code/datums/wounds/cranial_fissure.dm +++ b/code/datums/wounds/cranial_fissure.dm @@ -2,7 +2,7 @@ wound_path_to_generate = /datum/wound/cranial_fissure required_limb_biostate = BIO_BONE - required_wounding_types = list(WOUND_ALL) + required_wounding_type = WOUND_ALL wound_series = WOUND_SERIES_CRANIAL_FISSURE @@ -40,6 +40,9 @@ severity = WOUND_SEVERITY_CRITICAL sound_effect = 'sound/effects/dismember.ogg' + /// If TRUE we have been prepped for surgery (to repair) + VAR_FINAL/prepped = FALSE + #define CRANIAL_FISSURE_FILTER_DISPLACEMENT "cranial_fissure_displacement" /datum/wound/cranial_fissure/wound_injury(datum/wound/old_wound = null, attack_direction = null) @@ -50,7 +53,7 @@ RegisterSignal(victim, COMSIG_MOB_SLIPPED, PROC_REF(on_owner_slipped)) -/datum/wound/cranial_fissure/remove_wound(ignore_limb, replaced) +/datum/wound/cranial_fissure/remove_wound(ignore_limb, replaced, destroying) REMOVE_TRAIT(limb, TRAIT_IMMUNE_TO_CRANIAL_FISSURE, type) if (!isnull(victim)) REMOVE_TRAIT(victim, TRAIT_HAS_CRANIAL_FISSURE, type) diff --git a/code/datums/wounds/loss.dm b/code/datums/wounds/loss.dm index 4fb5cad387f1..ea6eefca691e 100644 --- a/code/datums/wounds/loss.dm +++ b/code/datums/wounds/loss.dm @@ -5,7 +5,7 @@ required_limb_biostate = NONE require_any_biostate = TRUE - required_wounding_types = list(WOUND_ALL) + required_wounding_type = WOUND_ALL wound_series = WOUND_SERIES_LOSS_BASIC @@ -49,7 +49,7 @@ set_limb(dismembered_part) second_wind() log_wound(victim, src) - if(dismembered_part.can_bleed() && wounding_type != WOUND_BURN && victim.blood_volume) + if(dismembered_part.can_bleed() && wounding_type != WOUND_BURN && victim.get_blood_volume()) victim.spray_blood(attack_direction, severity) dismembered_part.dismember(wounding_type == WOUND_BURN ? BURN : BRUTE, wounding_type = wounding_type) qdel(src) diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm index 676f8c89f4b4..0a2e98dcf8fa 100644 --- a/code/datums/wounds/pierce.dm +++ b/code/datums/wounds/pierce.dm @@ -24,7 +24,6 @@ name = "Piercing Wound" sound_effect = 'sound/items/weapons/slice.ogg' processes = TRUE - treatable_by = list(/obj/item/stack/medical/suture) treatable_tools = list(TOOL_CAUTERY) base_treat_time = 3 SECONDS wound_flags = (ACCEPTS_GAUZE | CAN_BE_GRASPED) @@ -42,16 +41,18 @@ var/internal_bleeding_chance /// If we let off blood when hit, the max blood lost is this * the incoming damage var/internal_bleeding_coefficient + /// If TRUE we are ready to be mended in surgery + VAR_FINAL/mend_state = FALSE /datum/wound/pierce/bleed/wound_injury(datum/wound/old_wound = null, attack_direction = null) set_blood_flow(initial_flow) - if(limb.can_bleed() && attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY) + if(limb.can_bleed() && attack_direction && victim.get_blood_volume() > BLOOD_VOLUME_OKAY) victim.spray_blood(attack_direction, severity) 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)) + if(victim.stat == DEAD || (wounding_dmg < 5) || !limb.can_bleed() || !victim.get_blood_volume() || !prob(internal_bleeding_chance + wounding_dmg)) return if(limb.current_gauze?.splint_factor) wounding_dmg *= (1 - limb.current_gauze.splint_factor) @@ -131,13 +132,14 @@ to_chat(victim, span_green("The holes on your [limb.plaintext_zone] have [!limb.can_bleed() ? "healed up" : "stopped bleeding"]!")) qdel(src) -/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/bleed/check_grab_treatments(obj/item/tool, mob/user) + // 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 tool.get_temperature() -/datum/wound/pierce/bleed/treat(obj/item/I, mob/user) - if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature()) - return tool_cauterize(I, user) +/datum/wound/pierce/bleed/treat(obj/item/tool, mob/user) + if(tool.tool_behaviour == TOOL_CAUTERY || tool.get_temperature()) + tool_cauterize(tool, user) /datum/wound/pierce/bleed/on_xadone(power) . = ..() @@ -179,14 +181,13 @@ adjust_blood_flow(-blood_cauterized) if(blood_flow > 0) - return try_treating(I, user) - return TRUE + try_treating(I, user) /datum/wound_pregen_data/flesh_pierce abstract = TRUE - required_limb_biostate = (BIO_FLESH) - required_wounding_types = list(WOUND_PIERCE) + required_limb_biostate = BIO_FLESH + required_wounding_type = WOUND_PIERCE wound_series = WOUND_SERIES_FLESH_PUNCTURE_BLEED @@ -204,8 +205,8 @@ occur_text = "spurts out a thin stream of blood" sound_effect = 'sound/effects/wounds/pierce1.ogg' severity = WOUND_SEVERITY_MODERATE - initial_flow = 1.5 - gauzed_clot_rate = 0.8 + initial_flow = 1.25 + gauzed_clot_rate = 0.75 clot_rate = 0.03 internal_bleeding_chance = 30 internal_bleeding_coefficient = 1.25 @@ -283,8 +284,8 @@ occur_text = "looses a violent spray of blood, revealing a pierced wound" sound_effect = 'sound/effects/wounds/pierce2.ogg' severity = WOUND_SEVERITY_SEVERE - initial_flow = 2.25 - gauzed_clot_rate = 0.6 + initial_flow = 2 + gauzed_clot_rate = 0.5 clot_rate = 0.02 internal_bleeding_chance = 60 internal_bleeding_coefficient = 1.5 @@ -340,7 +341,7 @@ RegisterSignal(limb, COMSIG_BODYPART_UPDATE_WOUND_OVERLAY, PROC_REF(wound_overlay)) limb.update_part_wound_overlay() -/datum/wound/pierce/bleed/severe/eye/remove_wound(ignore_limb, replaced) +/datum/wound/pierce/bleed/severe/eye/remove_wound(ignore_limb, replaced, destroying) if (!isnull(limb)) UnregisterSignal(limb, COMSIG_BODYPART_UPDATE_WOUND_OVERLAY) return ..() @@ -396,8 +397,8 @@ occur_text = "blasts apart, sending chunks of viscera flying in all directions" sound_effect = 'sound/effects/wounds/pierce3.ogg' severity = WOUND_SEVERITY_CRITICAL - initial_flow = 3 - gauzed_clot_rate = 0.4 + initial_flow = 2.5 + gauzed_clot_rate = 0.3 internal_bleeding_chance = 80 internal_bleeding_coefficient = 1.75 threshold_penalty = 15 diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm index 0e88f7cee5d1..23fda75c902a 100644 --- a/code/datums/wounds/slash.dm +++ b/code/datums/wounds/slash.dm @@ -25,7 +25,7 @@ /datum/wound_pregen_data/flesh_slash abstract = TRUE - required_wounding_types = list(WOUND_SLASH) + required_wounding_type = WOUND_SLASH required_limb_biostate = BIO_FLESH wound_series = WOUND_SERIES_FLESH_SLASH_BLEED @@ -34,8 +34,6 @@ name = "Slashing (Cut) Flesh Wound" threshold_penalty = 5 processes = TRUE - treatable_by = list(/obj/item/stack/medical/suture) - treatable_by_grabbed = list(/obj/item/gun/energy/laser) treatable_tools = list(TOOL_CAUTERY) base_treat_time = 3 SECONDS wound_flags = (ACCEPTS_GAUZE|CAN_BE_GRASPED) @@ -68,7 +66,7 @@ old_wound.clear_highest_scar() else set_blood_flow(initial_flow) - if(limb.can_bleed() && attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY) + if(limb.can_bleed() && attack_direction && victim.get_blood_volume() > BLOOD_VOLUME_OKAY) victim.spray_blood(attack_direction, severity) if(!highest_scar) @@ -89,7 +87,7 @@ SIGNAL_HANDLER set_highest_scar(null) -/datum/wound/slash/flesh/remove_wound(ignore_limb, replaced) +/datum/wound/slash/flesh/remove_wound(ignore_limb, replaced, destroying) if(!replaced && highest_scar) already_scarred = TRUE highest_scar.lazy_attach(limb) @@ -166,17 +164,18 @@ /* 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/flesh/check_grab_treatments(obj/item/I, mob/user) - if(istype(I, /obj/item/gun/energy/laser)) +/datum/wound/slash/flesh/check_grab_treatments(obj/item/tool, mob/user) + if(istype(tool, /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 + if(tool.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 + return FALSE -/datum/wound/slash/flesh/treat(obj/item/I, mob/user) - if(istype(I, /obj/item/gun/energy/laser)) - return las_cauterize(I, user) - else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature()) - return tool_cauterize(I, user) +/datum/wound/slash/flesh/treat(obj/item/tool, mob/user) + if(istype(tool, /obj/item/gun/energy/laser)) + las_cauterize(tool, user) + else if(tool.tool_behaviour == TOOL_CAUTERY || tool.get_temperature()) + tool_cauterize(tool, user) /datum/wound/slash/flesh/try_handling(mob/living/user) if(user.pulling != victim || !HAS_TRAIT(user, TRAIT_WOUND_LICKER) || !victim.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE)) @@ -253,9 +252,8 @@ if(!lasgun.process_fire(victim, victim, TRUE, null, limb.body_zone)) return 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 + adjust_blood_flow(-1 * (damage / (5 * self_penalty_mult))) // 20 / 5 = 4 bloodflow removed, p good /// If someone is using either a cautery tool or something with heat to cauterize this cut /datum/wound/slash/flesh/proc/tool_cauterize(obj/item/I, mob/user) @@ -287,11 +285,10 @@ adjust_blood_flow(-blood_cauterized) if(blood_flow > minimum_flow) - return try_treating(I, user) + try_treating(I, user) + else if(demotes_to) to_chat(user, span_green("You successfully lower the severity of [user == victim_stored ? "your" : "[victim_stored]'s"] cuts.")) - return TRUE - return FALSE /datum/wound/slash/get_limb_examine_description() return span_warning("The flesh on this limb appears badly lacerated.") @@ -306,9 +303,9 @@ occur_text = "is cut open, slowly leaking blood" sound_effect = 'sound/effects/wounds/blood1.ogg' severity = WOUND_SEVERITY_MODERATE - initial_flow = 2 + initial_flow = 1.75 minimum_flow = 0.5 - clot_rate = 0.05 + clot_rate = 0.04 series_threshold_penalty = 10 status_effect_type = /datum/status_effect/wound/slash/flesh/moderate scar_keyword = "slashmoderate" @@ -338,9 +335,9 @@ occur_text = "is ripped open, veins spurting blood" sound_effect = 'sound/effects/wounds/blood2.ogg' severity = WOUND_SEVERITY_SEVERE - initial_flow = 3.25 - minimum_flow = 2.75 - clot_rate = 0.03 + initial_flow = 2.75 + minimum_flow = 2 + clot_rate = 0.02 series_threshold_penalty = 25 demotes_to = /datum/wound/slash/flesh/moderate status_effect_type = /datum/status_effect/wound/slash/flesh/severe @@ -371,9 +368,9 @@ occur_text = "is torn open, spraying blood wildly" 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 + initial_flow = 3.75 + minimum_flow = 3.5 + clot_rate = -0.012 // critical cuts actively get worse instead of better threshold_penalty = 15 demotes_to = /datum/wound/slash/flesh/severe status_effect_type = /datum/status_effect/wound/slash/flesh/critical diff --git a/code/game/area/ai_monitored.dm b/code/game/area/ai_monitored.dm deleted file mode 100644 index f6559d344c4a..000000000000 --- a/code/game/area/ai_monitored.dm +++ /dev/null @@ -1,31 +0,0 @@ -/area/station/ai_monitored - name = "\improper AI Monitored Area" - sound_environment = SOUND_ENVIRONMENT_ROOM - var/list/obj/machinery/camera/motioncameras - var/list/datum/weakref/motionTargets = list() - -/area/station/ai_monitored/Initialize(mapload) - . = ..() - if(!mapload) - return - for (var/obj/machinery/camera/ai_camera in src) - if(!ai_camera.isMotion()) - continue - LAZYADD(motioncameras, ai_camera) - ai_camera.set_area_motion(src) - -/area/station/ai_monitored/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) - . = ..() - if (!ismob(arrived) || !LAZYLEN(motioncameras)) - return - for(var/obj/machinery/camera/cam as anything in motioncameras) - cam.newTarget(arrived) - return - -/area/station/ai_monitored/Exited(atom/movable/gone, atom/old_loc, list/atom/old_locs) - . = ..() - if (!ismob(gone) || !LAZYLEN(motioncameras)) - return - for(var/obj/machinery/camera/cam as anything in motioncameras) - cam.lostTargetRef(WEAKREF(gone)) - return diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index cbe227905f37..c9692021a01b 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -24,7 +24,10 @@ /// This uses the same nested list format as turfs_by_zlevel var/list/list/turf/turfs_to_uncontain_by_zlevel = list() - var/area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + /// General flag for area properties + var/area_flags = VALID_TERRITORY | BLOBS_ALLOWED | CULT_PERMITTED + /// Flag for mapping related area properties (such as cavegen) + var/area_flags_mapping = UNIQUE_AREA ///Do we have an active fire alarm? var/fire = FALSE @@ -58,6 +61,8 @@ /// For space, the asteroid, lavaland, etc. Used with blueprints or with weather to determine if we are adding a new area (vs editing a station room) var/outdoors = FALSE + /// Whether or not this area unifies all of its motion sensors. + var/motion_monitored = FALSE /// Size of the area in open turfs, only calculated for indoors areas. var/areasize = 0 @@ -163,7 +168,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) /area/New() // This interacts with the map loader, so it needs to be set immediately // rather than waiting for atoms to initialize. - if (area_flags & UNIQUE_AREA) + if (area_flags_mapping & UNIQUE_AREA) GLOB.areas_by_type[type] = src GLOB.areas += src energy_usage = new /list(AREA_USAGE_LEN) // Some atoms would like to use power in Initialize() @@ -210,6 +215,8 @@ GLOBAL_LIST_EMPTY(teleportlocs) /area/LateInitialize() power_change() // all machines set to current power level, also updates icon update_beauty() + if(motion_monitored) + AddComponent(/datum/component/monitored_area) /// Generate turfs, including cool cave wall gen /area/proc/RunTerrainGeneration() diff --git a/code/game/area/areas/ai_monitored.dm b/code/game/area/areas/ai_monitored.dm deleted file mode 100644 index 4e63479987e8..000000000000 --- a/code/game/area/areas/ai_monitored.dm +++ /dev/null @@ -1,129 +0,0 @@ -// Specific AI monitored areas - -// Stub defined ai_monitored.dm -/area/station/ai_monitored - -/area/station/ai_monitored/turret_protected - -// AI -/area/station/ai_monitored - icon_state = "ai" - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/ai_monitored/aisat/exterior - name = "\improper AI Satellite Exterior" - icon_state = "ai" - airlock_wires = /datum/wires/airlock/ai - -/area/station/ai_monitored/command/storage/satellite - name = "\improper AI Satellite Maint" - icon_state = "ai_storage" - ambience_index = AMBIENCE_DANGER - airlock_wires = /datum/wires/airlock/ai - -// Turret protected -/area/station/ai_monitored/turret_protected - ambientsounds = list('sound/ambience/engineering/ambitech.ogg', 'sound/ambience/engineering/ambitech2.ogg', 'sound/ambience/engineering/ambiatmos.ogg', 'sound/ambience/engineering/ambiatmos2.ogg') - ///Some sounds (like the space jam) are terrible when on loop. We use this variable to add it to other AI areas, but override it to keep it from the AI's core. - var/ai_will_not_hear_this = list('sound/ambience/misc/ambimalf.ogg') - airlock_wires = /datum/wires/airlock/ai - -/area/station/ai_monitored/turret_protected/Initialize(mapload) - . = ..() - if(ai_will_not_hear_this) - ambientsounds += ai_will_not_hear_this - -/area/station/ai_monitored/turret_protected/ai_upload - name = "\improper AI Upload Chamber" - icon_state = "ai_upload" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/ai_monitored/turret_protected/ai_upload_foyer - name = "\improper AI Upload Access" - icon_state = "ai_upload_foyer" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/ai_monitored/turret_protected/ai - name = "\improper AI Chamber" - icon_state = "ai_chamber" - ai_will_not_hear_this = null - -/area/station/ai_monitored/turret_protected/aisat - name = "\improper AI Satellite" - icon_state = "ai" - sound_environment = SOUND_ENVIRONMENT_ROOM - -/area/station/ai_monitored/turret_protected/aisat/atmos - name = "\improper AI Satellite Atmos" - icon_state = "ai" - -/area/station/ai_monitored/turret_protected/aisat/foyer - name = "\improper AI Satellite Foyer" - icon_state = "ai_foyer" - -/area/station/ai_monitored/turret_protected/aisat/service - name = "\improper AI Satellite Service" - icon_state = "ai" - -/area/station/ai_monitored/turret_protected/aisat/hallway - name = "\improper AI Satellite Hallway" - icon_state = "ai" - -/area/station/ai_monitored/turret_protected/aisat/teleporter - name ="\improper AI Satellite Teleporter" - icon_state = "ai" - -/area/station/ai_monitored/turret_protected/aisat/equipment - name ="\improper AI Satellite Equipment" - icon_state = "ai" - -/area/station/ai_monitored/turret_protected/aisat/maint - name = "\improper AI Satellite Maintenance" - icon_state = "ai_maint" - -/area/station/ai_monitored/turret_protected/aisat/uppernorth - name = "\improper AI Satellite Upper Fore" - icon_state = "ai" - -/area/station/ai_monitored/turret_protected/aisat/uppersouth - name = "\improper AI Satellite Upper Aft" - icon_state = "ai" - -/area/station/ai_monitored/turret_protected/aisat_interior - name = "\improper AI Satellite Antechamber" - icon_state = "ai_interior" - sound_environment = SOUND_AREA_LARGE_ENCLOSED - -/area/station/ai_monitored/turret_protected/ai_sat_ext_as - name = "\improper AI Sat Ext" - icon_state = "ai_sat_east" - -/area/station/ai_monitored/turret_protected/ai_sat_ext_ap - name = "\improper AI Sat Ext" - icon_state = "ai_sat_west" - -// Station specific ai monitored rooms, move here for consistency - -//Command - AI Monitored -/area/station/ai_monitored/command/storage/eva - name = "EVA Storage" - icon_state = "eva" - ambience_index = AMBIENCE_DANGER - -/area/station/ai_monitored/command/storage/eva/upper - name = "Upper EVA Storage" - -/area/station/ai_monitored/command/nuke_storage - name = "\improper Vault" - icon_state = "nuke_storage" - airlock_wires = /datum/wires/airlock/command - -//Security - AI Monitored -/area/station/ai_monitored/security/armory - name = "\improper Armory" - icon_state = "armory" - ambience_index = AMBIENCE_DANGER - airlock_wires = /datum/wires/airlock/security - -/area/station/ai_monitored/security/armory/upper - name = "Upper Armory" diff --git a/code/game/area/areas/away_content.dm b/code/game/area/areas/away_content.dm index 648ef4c8d316..39d7ebce1dbe 100644 --- a/code/game/area/areas/away_content.dm +++ b/code/game/area/areas/away_content.dm @@ -11,7 +11,6 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" default_gravity = STANDARD_GRAVITY ambience_index = AMBIENCE_AWAY sound_environment = SOUND_ENVIRONMENT_ROOM - area_flags = UNIQUE_AREA /area/awaymission/museum name = "Nanotrasen Museum" @@ -33,11 +32,11 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" name = "Super Secret Room" static_lighting = FALSE base_lighting_alpha = 255 - area_flags = UNIQUE_AREA|NOTELEPORT + area_flags = NOTELEPORT default_gravity = STANDARD_GRAVITY /area/awaymission/secret - area_flags = UNIQUE_AREA|NOTELEPORT|HIDDEN_AREA + area_flags = NOTELEPORT|HIDDEN_AREA /area/awaymission/secret/unpowered always_unpowered = TRUE diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index 06a87345f9cf..58d0439eed33 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -8,7 +8,7 @@ static_lighting = TRUE requires_power = FALSE default_gravity = STANDARD_GRAVITY - area_flags = UNIQUE_AREA | NOTELEPORT + area_flags = NOTELEPORT flags_1 = NONE // This is just to define the category @@ -142,7 +142,6 @@ name = "Thunderdome Observation" icon_state = "thunder_observe" - // ENEMY // Wizard @@ -152,16 +151,15 @@ static_lighting = TRUE requires_power = FALSE default_gravity = STANDARD_GRAVITY - area_flags = UNIQUE_AREA | NOTELEPORT + area_flags = NOTELEPORT flags_1 = NONE - //Abductors /area/centcom/abductor_ship name = "Abductor Ship" icon_state = "abductor_ship" requires_power = FALSE - area_flags = UNIQUE_AREA | NOTELEPORT + area_flags = NOTELEPORT static_lighting = FALSE base_lighting_alpha = 255 default_gravity = STANDARD_GRAVITY @@ -173,7 +171,7 @@ icon_state = "syndie-ship" requires_power = FALSE default_gravity = STANDARD_GRAVITY - area_flags = UNIQUE_AREA | NOTELEPORT + area_flags = NOTELEPORT flags_1 = NONE ambience_index = AMBIENCE_DANGER @@ -218,12 +216,11 @@ name = "Mafia Minigame" icon_state = "mafia" static_lighting = FALSE - base_lighting_alpha = 255 requires_power = FALSE default_gravity = STANDARD_GRAVITY flags_1 = NONE - area_flags = BLOCK_SUICIDE | UNIQUE_AREA + area_flags = BLOCK_SUICIDE //CAPTURE THE FLAG /area/centcom/ctf @@ -234,7 +231,7 @@ base_lighting_alpha = 255 default_gravity = STANDARD_GRAVITY flags_1 = NONE - area_flags = UNIQUE_AREA | NOTELEPORT | NO_DEATH_MESSAGE | BLOCK_SUICIDE + area_flags = NOTELEPORT | NO_DEATH_MESSAGE | BLOCK_SUICIDE /area/centcom/ctf/control_room name = "Control Room A" @@ -278,7 +275,6 @@ icon_state = "asteroid" requires_power = FALSE default_gravity = STANDARD_GRAVITY - area_flags = UNIQUE_AREA ambience_index = AMBIENCE_MINING flags_1 = CAN_BE_DIRTY_1 sound_environment = SOUND_AREA_ASTEROID @@ -288,7 +284,7 @@ ambience_index = AMBIENCE_RUINS always_unpowered = FALSE requires_power = TRUE - area_flags = UNIQUE_AREA | BLOBS_ALLOWED + area_flags = BLOBS_ALLOWED /area/centcom/asteroid/nearstation/bomb_site name = "\improper Bomb Testing Asteroid" diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm index 9f0bcfab8f6d..3d97da72c39a 100644 --- a/code/game/area/areas/mining.dm +++ b/code/game/area/areas/mining.dm @@ -3,7 +3,8 @@ icon = 'icons/area/areas_station.dmi' icon_state = "mining" default_gravity = STANDARD_GRAVITY - area_flags = VALID_TERRITORY | UNIQUE_AREA | FLORA_ALLOWED | CULT_PERMITTED + area_flags = VALID_TERRITORY | CULT_PERMITTED + area_flags_mapping = UNIQUE_AREA | FLORA_ALLOWED ambient_buzz = 'sound/ambience/lavaland/magma.ogg' /area/mine/lobby @@ -132,7 +133,7 @@ icon_state = "mining" default_gravity = STANDARD_GRAVITY flags_1 = NONE - area_flags = VALID_TERRITORY | UNIQUE_AREA | FLORA_ALLOWED + area_flags = VALID_TERRITORY | FLORA_ALLOWED sound_environment = SOUND_AREA_LAVALAND ambient_buzz = 'sound/ambience/lavaland/magma.ogg' allow_shuttle_docking = TRUE @@ -146,7 +147,7 @@ power_light = FALSE requires_power = TRUE ambience_index = AMBIENCE_MINING - area_flags = VALID_TERRITORY | UNIQUE_AREA + area_flags = VALID_TERRITORY /area/lavaland/underground name = "Lavaland Caves" @@ -157,7 +158,6 @@ power_equip = FALSE power_light = FALSE ambience_index = AMBIENCE_MINING - area_flags = VALID_TERRITORY | UNIQUE_AREA | FLORA_ALLOWED /area/lavaland/surface/outdoors name = "Lavaland Wastes" @@ -165,12 +165,14 @@ /area/lavaland/surface/outdoors/unexplored //monsters and ruins spawn here icon_state = "unexplored" - area_flags = VALID_TERRITORY | UNIQUE_AREA | CAVES_ALLOWED | FLORA_ALLOWED | MOB_SPAWN_ALLOWED + area_flags = VALID_TERRITORY + area_flags_mapping = UNIQUE_AREA | CAVES_ALLOWED | FLORA_ALLOWED | MOB_SPAWN_ALLOWED map_generator = /datum/map_generator/cave_generator/lavaland /area/lavaland/surface/outdoors/unexplored/danger //megafauna will also spawn here icon_state = "danger" - area_flags = VALID_TERRITORY | UNIQUE_AREA | CAVES_ALLOWED | FLORA_ALLOWED | MOB_SPAWN_ALLOWED | MEGAFAUNA_SPAWN_ALLOWED + area_flags = VALID_TERRITORY + area_flags_mapping = parent_type::area_flags_mapping | MEGAFAUNA_SPAWN_ALLOWED /// Same thing as parent, but uses a different map generator for the icemoon ruin that needs it. /area/lavaland/surface/outdoors/unexplored/danger/no_ruins @@ -178,9 +180,7 @@ /area/lavaland/surface/outdoors/explored name = "Lavaland Labor Camp" - area_flags = VALID_TERRITORY | UNIQUE_AREA - - + area_flags = VALID_TERRITORY /**********************Ice Moon Areas**************************/ @@ -189,7 +189,7 @@ icon_state = "mining" default_gravity = STANDARD_GRAVITY flags_1 = NONE - area_flags = UNIQUE_AREA | FLORA_ALLOWED + area_flags_mapping = UNIQUE_AREA | FLORA_ALLOWED ambience_index = AMBIENCE_ICEMOON sound_environment = SOUND_AREA_ICEMOON ambient_buzz = 'sound/ambience/lavaland/magma.ogg' @@ -203,7 +203,6 @@ power_equip = FALSE power_light = FALSE requires_power = TRUE - area_flags = UNIQUE_AREA | FLORA_ALLOWED /area/icemoon/surface/outdoors // parent that defines if something is on the exterior of the station. name = "Icemoon Wastes" @@ -227,33 +226,33 @@ if(HAS_TRAIT(SSstation, STATION_TRAIT_FORESTED)) map_generator = /datum/map_generator/cave_generator/icemoon/surface/forested // flip this on, the generator has already disabled dangerous fauna - area_flags = MOB_SPAWN_ALLOWED | FLORA_ALLOWED + area_flags_mapping = MOB_SPAWN_ALLOWED | FLORA_ALLOWED /area/icemoon/surface/outdoors/always_forested icon_state = "forest" map_generator = /datum/map_generator/cave_generator/icemoon/surface/forested - area_flags = MOB_SPAWN_ALLOWED | FLORA_ALLOWED | CAVES_ALLOWED + area_flags_mapping = MOB_SPAWN_ALLOWED | FLORA_ALLOWED | CAVES_ALLOWED /area/icemoon/surface/outdoors/rocky icon_state = "rocky" map_generator = /datum/map_generator/cave_generator/icemoon/surface/rocky - area_flags = MOB_SPAWN_ALLOWED | FLORA_ALLOWED | CAVES_ALLOWED + area_flags_mapping = MOB_SPAWN_ALLOWED | FLORA_ALLOWED | CAVES_ALLOWED /area/icemoon/surface/outdoors/noteleport // for places like the cursed spring water - area_flags = UNIQUE_AREA | FLORA_ALLOWED | NOTELEPORT + area_flags_mapping = parent_type::area_flags_mapping | NOTELEPORT /area/icemoon/surface/outdoors/noruins // when you want random generation without the chance of getting ruins icon_state = "noruins" - area_flags = UNIQUE_AREA | FLORA_ALLOWED | MOB_SPAWN_ALLOWED | CAVES_ALLOWED - map_generator = /datum/map_generator/cave_generator/icemoon/surface/noruins + area_flags_mapping = parent_type::area_flags_mapping | MOB_SPAWN_ALLOWED | CAVES_ALLOWED + map_generator = /datum/map_generator/cave_generator/icemoon/surface/noruins /area/icemoon/surface/outdoors/labor_camp name = "Icemoon Labor Camp" - area_flags = UNIQUE_AREA + area_flags_mapping = /area::area_flags_mapping /area/icemoon/surface/outdoors/unexplored //monsters and ruins spawn here icon_state = "unexplored" - area_flags = UNIQUE_AREA | FLORA_ALLOWED | MOB_SPAWN_ALLOWED | CAVES_ALLOWED + area_flags_mapping = parent_type::area_flags_mapping | MOB_SPAWN_ALLOWED | CAVES_ALLOWED /area/icemoon/surface/outdoors/unexplored/rivers // rivers spawn here icon_state = "danger" @@ -263,10 +262,10 @@ . = ..() 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_flags_mapping |= 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 + area_flags_mapping = /area/icemoon/::area_flags_mapping | CAVES_ALLOWED /area/icemoon/underground name = "Icemoon Caves" @@ -276,16 +275,15 @@ power_environ = FALSE power_equip = FALSE power_light = FALSE - area_flags = UNIQUE_AREA | FLORA_ALLOWED /area/icemoon/underground/unexplored // mobs and megafauna and ruins spawn here name = "Icemoon Caves" icon_state = "unexplored" - area_flags = CAVES_ALLOWED | FLORA_ALLOWED | MOB_SPAWN_ALLOWED | MEGAFAUNA_SPAWN_ALLOWED + area_flags_mapping = CAVES_ALLOWED | FLORA_ALLOWED | MOB_SPAWN_ALLOWED | MEGAFAUNA_SPAWN_ALLOWED /area/icemoon/underground/unexplored/no_rivers icon_state = "norivers" - area_flags = CAVES_ALLOWED | FLORA_ALLOWED // same rules as "shoreline" turfs since we might need this to pull double-duty + area_flags_mapping = CAVES_ALLOWED | FLORA_ALLOWED // same rules as "shoreline" turfs since we might need this to pull double-duty map_generator = /datum/map_generator/cave_generator/icemoon /area/icemoon/underground/unexplored/rivers // rivers spawn here @@ -297,15 +295,15 @@ /area/icemoon/underground/unexplored/rivers/deep/shoreline //use this for when you don't want mobs to spawn in certain areas in the "deep" portions. Think adjacent to rivers or station structures. icon_state = "shore" - area_flags = UNIQUE_AREA | CAVES_ALLOWED | FLORA_ALLOWED + area_flags_mapping = /area/icemoon/::area_flags_mapping | CAVES_ALLOWED /area/icemoon/underground/explored // ruins can't spawn here name = "Icemoon Underground" - area_flags = UNIQUE_AREA + area_flags_mapping = /area::area_flags_mapping /area/icemoon/underground/explored/graveyard name = "Graveyard" - area_flags = UNIQUE_AREA + area_flags_mapping = /area::area_flags_mapping ambience_index = AMBIENCE_SPOOKY icon = 'icons/area/areas_station.dmi' icon_state = "graveyard" diff --git a/code/game/area/areas/misc.dm b/code/game/area/areas/misc.dm index df3fbe4b18fc..94c826a729b1 100644 --- a/code/game/area/areas/misc.dm +++ b/code/game/area/areas/misc.dm @@ -10,7 +10,7 @@ power_light = FALSE power_equip = FALSE power_environ = FALSE - area_flags = UNIQUE_AREA|NO_GRAVITY + area_flags = NO_GRAVITY outdoors = TRUE ambience_index = AMBIENCE_SPACE flags_1 = CAN_BE_DIRTY_1 diff --git a/code/game/area/areas/ruins/_ruins.dm b/code/game/area/areas/ruins/_ruins.dm index f2ecc7ac73e3..92fff19386da 100644 --- a/code/game/area/areas/ruins/_ruins.dm +++ b/code/game/area/areas/ruins/_ruins.dm @@ -5,7 +5,7 @@ icon = 'icons/area/areas_ruins.dmi' icon_state = "ruins" default_gravity = STANDARD_GRAVITY - area_flags = HIDDEN_AREA | UNIQUE_AREA + area_flags = HIDDEN_AREA ambience_index = AMBIENCE_RUINS flags_1 = CAN_BE_DIRTY_1 sound_environment = SOUND_ENVIRONMENT_STONEROOM diff --git a/code/game/area/areas/ruins/icemoon.dm b/code/game/area/areas/ruins/icemoon.dm index 7dff4bdba551..80f8f6bb33ae 100644 --- a/code/game/area/areas/ruins/icemoon.dm +++ b/code/game/area/areas/ruins/icemoon.dm @@ -59,10 +59,10 @@ sound_environment = SOUND_AREA_SMALL_ENCLOSED ambience_index = AMBIENCE_DANGER area_flags = NOTELEPORT + area_flags_mapping = NONE mood_bonus = -10 mood_message = "What the fuck." - /area/ruin/planetengi name = "\improper Engineering Outpost" @@ -115,11 +115,13 @@ /area/ruin/outpost31/lab name = "\improper Outpost 31 Lab" area_flags = NOTELEPORT //megafauna arena + area_flags_mapping = NONE requires_power = FALSE /area/ruin/outpost31/lootroom name = "\improper Outpost 31 Secondary Storage" area_flags = NOTELEPORT //megafauna loot room + area_flags_mapping = NONE requires_power = FALSE /area/ruin/outpost31/recroom diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm index 4e806bf1c103..cef9e3d308a3 100644 --- a/code/game/area/areas/ruins/lavaland.dm +++ b/code/game/area/areas/ruins/lavaland.dm @@ -43,6 +43,7 @@ /area/ruin/unpowered/cultaltar name = "\improper Cult Altar" area_flags = CULT_PERMITTED + area_flags_mapping = NONE ambience_index = AMBIENCE_SPOOKY /area/ruin/thelizardsgas_lavaland diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm index c2e32c86bee0..24bd482633ce 100644 --- a/code/game/area/areas/ruins/space.dm +++ b/code/game/area/areas/ruins/space.dm @@ -2,7 +2,8 @@ /area/ruin/space default_gravity = ZERO_GRAVITY - area_flags = UNIQUE_AREA + area_flags = NONE + area_flags_mapping = UNIQUE_AREA /area/ruin/space/unpowered always_unpowered = TRUE @@ -16,11 +17,10 @@ /area/ruin/space/has_grav/powered requires_power = FALSE - // Ruin solars define, /area/solars was moved to /area/station/solars, causing the solars specific areas to lose their properties /area/ruin/space/solars requires_power = FALSE - area_flags = UNIQUE_AREA + area_flags = NONE flags_1 = NONE ambience_index = AMBIENCE_ENGI airlock_wires = /datum/wires/airlock/engineering @@ -310,7 +310,7 @@ icon = 'icons/area/areas_ruins.dmi' // Solars inheriet areas_misc.dmi, not areas_ruin.dmi icon_state = "os_charlie_solars" requires_power = FALSE - area_flags = UNIQUE_AREA + area_flags = NONE sound_environment = SOUND_AREA_SPACE /area/ruin/space/ancientstation/charlie/storage @@ -534,7 +534,7 @@ /area/ruin/space/djstation/solars name = "\improper DJ Station Solars" icon_state = "DJ" - area_flags = UNIQUE_AREA + area_flags = NONE default_gravity = ZERO_GRAVITY /area/ruin/space/djstation/service @@ -582,7 +582,7 @@ /area/ruin/space/has_grav/hellfactoryoffice name = "\improper Hell Factory Office" - area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | NOTELEPORT + area_flags = VALID_TERRITORY | BLOBS_ALLOWED | NOTELEPORT //Ruin of Spinward Smoothies @@ -600,7 +600,7 @@ /area/ruin/space/has_grav/powered/biooutpost name = "\improper Bioresearch Outpost" - area_flags = UNIQUE_AREA | NOTELEPORT + area_flags = NOTELEPORT /area/ruin/space/has_grav/powered/biooutpost/vault name = "\improper Bioresearch Outpost Secure Testing" diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index c37d53de1517..9a651fb5e3dc 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -10,6 +10,7 @@ always_unpowered = FALSE // Loading the same shuttle map at a different time will produce distinct area instances. area_flags = NONE + area_flags_mapping = NONE icon = 'icons/area/areas_station.dmi' icon_state = "shuttle" flags_1 = CAN_BE_DIRTY_1 @@ -120,11 +121,9 @@ static_lighting = FALSE base_lighting_alpha = 255 - /area/shuttle/arrival name = "Arrival Shuttle" - area_flags = UNIQUE_AREA// SSjob refers to this area for latejoiners - + area_flags_mapping = UNIQUE_AREA // SSjob refers to this area for latejoiners /area/shuttle/arrival/on_joining_game(mob/living/boarder) if(SSshuttle.arrivals?.mode == SHUTTLE_CALL) @@ -133,22 +132,17 @@ boarder.playsound_local(get_turf(boarder), 'sound/announcer/ApproachingTG.ogg', 25) boarder.update_parallax_teleport() - /area/shuttle/pod_1 name = "Escape Pod One" - area_flags = NONE /area/shuttle/pod_2 name = "Escape Pod Two" - area_flags = NONE /area/shuttle/pod_3 name = "Escape Pod Three" - area_flags = NONE /area/shuttle/pod_4 name = "Escape Pod Four" - area_flags = NONE /area/shuttle/mining name = "Mining Shuttle" @@ -166,10 +160,9 @@ /area/shuttle/escape name = "Emergency Shuttle" - area_flags = BLOBS_ALLOWED + area_flags = CULT_PERMITTED area_limited_icon_smoothing = /area/shuttle/escape flags_1 = CAN_BE_DIRTY_1 - area_flags = CULT_PERMITTED /area/shuttle/escape/backup name = "Backup Emergency Shuttle" diff --git a/code/game/area/areas/station/ai.dm b/code/game/area/areas/station/ai.dm new file mode 100644 index 000000000000..ff12a728f282 --- /dev/null +++ b/code/game/area/areas/station/ai.dm @@ -0,0 +1,93 @@ +/area/station/ai + icon_state = "ai" + sound_environment = SOUND_AREA_STANDARD_STATION + airlock_wires = /datum/wires/airlock/ai + motion_monitored = TRUE + + ambientsounds = list('sound/ambience/engineering/ambitech.ogg', 'sound/ambience/engineering/ambitech2.ogg', 'sound/ambience/engineering/ambiatmos.ogg', 'sound/ambience/engineering/ambiatmos2.ogg') + /// Disables ambientsounds if TRUE. Used for mundane AI locations like the exterior or storage room. + var/secure = TRUE + /// Some sounds (like the space jam) are terrible when on loop. + /// We use this variable to add it to other AI areas, but override it to keep it from the AI's core. + var/annoying_ambience = list('sound/ambience/misc/ambimalf.ogg') + +/area/station/ai/Initialize(mapload) + . = ..() + if(!secure) + ambientsounds = null + return + if(annoying_ambience) + ambientsounds += annoying_ambience + +/* --------- */ + +/area/station/ai/upload + name = "\improper AI Upload Area" + icon_state = "unknown" // this is supposed to be for sorting, but if you want to make an upload hallway you can change this + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/ai/upload/chamber + name = "\improper AI Upload Chamber" + icon_state = "ai_upload" + +/area/station/ai/upload/foyer + name = "\improper AI Upload Access" + icon_state = "ai_upload_foyer" + +/* SATELLITE */ + +/area/station/ai/satellite + name = "\improper AI Satellite" + sound_environment = SOUND_ENVIRONMENT_ROOM + +/area/station/ai/satellite/chamber + name = "\improper AI Chamber" + icon_state = "ai_chamber" + annoying_ambience = null + +/area/station/ai/satellite/exterior + name = "\improper AI Satellite Exterior" + secure = FALSE + +/area/station/ai/satellite/maintenance + name = "\improper AI Satellite Maintenance" + icon_state = "ai_maint" + +/area/station/ai/satellite/maintenance/storage + name = "\improper AI Satellite Storage" + icon_state = "ai_storage" + ambience_index = AMBIENCE_DANGER + +/* Interior */ + +/area/station/ai/satellite/interior + name = "\improper AI Satellite Antechamber" + icon_state = "ai_interior" + sound_environment = SOUND_AREA_LARGE_ENCLOSED + +/area/station/ai/satellite/foyer + name = "\improper AI Satellite Foyer" + icon_state = "ai_foyer" + +/area/station/ai/satellite/hallway + name = "\improper AI Satellite Hallway" + +/area/station/ai/satellite/uppernorth + name = "\improper AI Satellite Upper Fore" + +/area/station/ai/satellite/uppersouth + name = "\improper AI Satellite Upper Aft" + +/* Functions */ + +/area/station/ai/satellite/atmos + name = "\improper AI Satellite Atmospherics" + +/area/station/ai/satellite/service + name = "\improper AI Satellite Service" + +/area/station/ai/satellite/teleporter + name ="\improper AI Satellite Teleporter" + +/area/station/ai/satellite/equipment + name ="\improper AI Satellite Equipment" diff --git a/code/game/area/areas/station/command.dm b/code/game/area/areas/station/command.dm index ee4325d94aef..30f126dc42cb 100644 --- a/code/game/area/areas/station/command.dm +++ b/code/game/area/areas/station/command.dm @@ -36,6 +36,22 @@ icon_state = "command" sound_environment = SOUND_AREA_SMALL_ENCLOSED +// Monitored areas + +/area/station/command/eva + name = "EVA Storage" + icon_state = "eva" + ambience_index = AMBIENCE_DANGER + motion_monitored = TRUE + +/area/station/command/eva/upper + name = "Upper EVA Storage" + +/area/station/command/vault + name = "\improper Vault" + icon_state = "nuke_storage" // someone should change this, not me though + motion_monitored = TRUE + /* * Command Head Areas */ diff --git a/code/game/area/areas/station/common.dm b/code/game/area/areas/station/common.dm index 2280215ab6ee..1b6eba4dc25e 100644 --- a/code/game/area/areas/station/common.dm +++ b/code/game/area/areas/station/common.dm @@ -2,7 +2,7 @@ name = "\improper Crew Facilities" icon_state = "commons" sound_environment = SOUND_AREA_STANDARD_STATION - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + area_flags = BLOBS_ALLOWED | CULT_PERMITTED /* * Dorm Areas diff --git a/code/game/area/areas/station/engineering.dm b/code/game/area/areas/station/engineering.dm index 71fe6024d887..feb565ecd534 100644 --- a/code/game/area/areas/station/engineering.dm +++ b/code/game/area/areas/station/engineering.dm @@ -26,7 +26,7 @@ /*outside atmos*/ /area/station/engineering/atmos/space_catwalk name = "\improper Atmospherics Space Catwalk" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + area_flags = BLOBS_ALLOWED | CULT_PERMITTED sound_environment = SOUND_AREA_SPACE ambience_index = AMBIENCE_SPACE @@ -63,7 +63,7 @@ /area/station/engineering/atmospherics_engine name = "\improper Atmospherics Engine" icon_state = "atmos_engine" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + area_flags = BLOBS_ALLOWED | CULT_PERMITTED /area/station/engineering/lobby name = "\improper Engineering Lobby" @@ -72,7 +72,7 @@ /area/station/engineering/supermatter name = "\improper Supermatter Engine" icon_state = "engine_sm" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + area_flags = BLOBS_ALLOWED | CULT_PERMITTED sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/station/engineering/supermatter/waste @@ -119,7 +119,7 @@ /area/station/engineering/storage/tcomms name = "Telecomms Storage" icon_state = "tcom_storage" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + area_flags = BLOBS_ALLOWED | CULT_PERMITTED /* * Construction Areas diff --git a/code/game/area/areas/station/hallway.dm b/code/game/area/areas/station/hallway.dm index 9512f20c709c..12a5ba6816b4 100644 --- a/code/game/area/areas/station/hallway.dm +++ b/code/game/area/areas/station/hallway.dm @@ -83,7 +83,7 @@ /area/station/hallway/secondary/entry name = "\improper Arrival Shuttle Hallway" icon_state = "entry" - area_flags = UNIQUE_AREA | EVENT_PROTECTED + area_flags = EVENT_PROTECTED /area/station/hallway/secondary/dock name = "\improper Secondary Station Dock Hallway" diff --git a/code/game/area/areas/station/maintenance.dm b/code/game/area/areas/station/maintenance.dm index 5e636719e7a0..a6fa76cd80e9 100644 --- a/code/game/area/areas/station/maintenance.dm +++ b/code/game/area/areas/station/maintenance.dm @@ -1,7 +1,7 @@ /area/station/maintenance name = "Generic Maintenance" ambience_index = AMBIENCE_MAINT - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED | PERSISTENT_ENGRAVINGS + area_flags = BLOBS_ALLOWED | CULT_PERMITTED | PERSISTENT_ENGRAVINGS airlock_wires = /datum/wires/airlock/maint sound_environment = SOUND_AREA_TUNNEL_ENCLOSED forced_ambience = TRUE @@ -94,7 +94,7 @@ /area/station/maintenance/department/science/xenobiology name = "Xenobiology Maintenance" icon_state = "xenomaint" - area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | XENOBIOLOGY_COMPATIBLE | CULT_PERMITTED + area_flags = VALID_TERRITORY | BLOBS_ALLOWED | XENOBIOLOGY_COMPATIBLE | CULT_PERMITTED /* * Generic Maintenance Tunnels @@ -165,6 +165,9 @@ name = "Central Starboard Maintenance" icon_state = "centralstarboardmaint" +/area/station/maintenance/starboard/central/upper + name = "Upper Central Starboard Maintenance" + /area/station/maintenance/starboard/greater name = "Greater Starboard Maintenance" icon_state = "greaterstarboardmaint" @@ -177,10 +180,16 @@ name = "Aft Starboard Maintenance" icon_state = "asmaint" +/area/station/maintenance/starboard/aft/upper + name = "Upper Aft Starboard Maintenance" + /area/station/maintenance/starboard/fore name = "Fore Starboard Maintenance" icon_state = "fsmaint" +/area/station/maintenance/starboard/fore/upper + name = "Upper Fore Starboard Maintenance" + /area/station/maintenance/port name = "Port Maintenance" icon_state = "portmaint" diff --git a/code/game/area/areas/station/misc.dm b/code/game/area/areas/station/misc.dm index be99950c7361..fde6b00bf5f2 100644 --- a/code/game/area/areas/station/misc.dm +++ b/code/game/area/areas/station/misc.dm @@ -30,6 +30,6 @@ power_light = FALSE requires_power = TRUE ambience_index = AMBIENCE_MINING - area_flags = UNIQUE_AREA + area_flags = NONE outdoors = TRUE allow_shuttle_docking = TRUE diff --git a/code/game/area/areas/station/science.dm b/code/game/area/areas/station/science.dm index 57623ee6183d..b64e7efe75a4 100644 --- a/code/game/area/areas/station/science.dm +++ b/code/game/area/areas/station/science.dm @@ -114,23 +114,23 @@ /area/station/science/ordnance/burnchamber name = "\improper Ordnance Burn Chamber" icon_state = "ord_burn" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + area_flags = BLOBS_ALLOWED | CULT_PERMITTED /area/station/science/ordnance/freezerchamber name = "\improper Ordnance Freezer Chamber" icon_state = "ord_freeze" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + area_flags = BLOBS_ALLOWED | 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_flags = BLOBS_ALLOWED | CULT_PERMITTED /area/station/science/ordnance/bomb name = "\improper Ordnance Bomb Site" icon_state = "ord_boom" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED | NO_GRAVITY + area_flags = BLOBS_ALLOWED | CULT_PERMITTED | NO_GRAVITY /area/station/science/ordnance/bomb/planet area_flags = /area/station/science/ordnance/bomb::area_flags & ~NO_GRAVITY diff --git a/code/game/area/areas/station/security.dm b/code/game/area/areas/station/security.dm index 1faf889684cc..8c15638c7f02 100644 --- a/code/game/area/areas/station/security.dm +++ b/code/game/area/areas/station/security.dm @@ -79,6 +79,15 @@ icon_state = "evidence" sound_environment = SOUND_AREA_SMALL_ENCLOSED +/area/station/security/armory + name = "\improper Armory" + icon_state = "armory" + ambience_index = AMBIENCE_DANGER + motion_monitored = TRUE + +/area/station/security/armory/upper + name = "Upper Armory" + /area/station/security/detectives_office name = "\improper Detective's Office" icon_state = "detective" @@ -185,7 +194,7 @@ /area/station/security/prison name = "\improper Prison Wing" icon_state = "sec_prison" - area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED | PERSISTENT_ENGRAVINGS + area_flags = VALID_TERRITORY | BLOBS_ALLOWED | CULT_PERMITTED | PERSISTENT_ENGRAVINGS //Rad proof /area/station/security/prison/toilet diff --git a/code/game/area/areas/station/service.dm b/code/game/area/areas/station/service.dm index f315a055f2e9..355406563264 100644 --- a/code/game/area/areas/station/service.dm +++ b/code/game/area/areas/station/service.dm @@ -77,7 +77,7 @@ mood_bonus = 5 mood_message = "I love being in the library!" mood_trait = TRAIT_INTROVERT - area_flags = CULT_PERMITTED | BLOBS_ALLOWED | UNIQUE_AREA + area_flags = CULT_PERMITTED | BLOBS_ALLOWED sound_environment = SOUND_AREA_LARGE_SOFTFLOOR /area/station/service/library/garden @@ -112,7 +112,7 @@ /area/station/service/chapel name = "\improper Chapel" icon_state = "chapel" - mood_bonus = 5 + mood_bonus = 4 mood_message = "Being in the chapel brings me peace." mood_trait = TRAIT_SPIRITUAL ambience_index = AMBIENCE_HOLY @@ -180,7 +180,7 @@ /area/station/service/janitor name = "\improper Custodial Closet" icon_state = "janitor" - area_flags = CULT_PERMITTED | BLOBS_ALLOWED | UNIQUE_AREA + area_flags = CULT_PERMITTED | BLOBS_ALLOWED sound_environment = SOUND_AREA_SMALL_ENCLOSED /area/station/service/barber diff --git a/code/game/area/areas/station/solars.dm b/code/game/area/areas/station/solars.dm index 8d3a81420e7d..569a7f0a169e 100644 --- a/code/game/area/areas/station/solars.dm +++ b/code/game/area/areas/station/solars.dm @@ -5,7 +5,7 @@ /area/station/solars icon_state = "panels" requires_power = FALSE - area_flags = UNIQUE_AREA|NO_GRAVITY + area_flags = NO_GRAVITY flags_1 = NONE ambience_index = AMBIENCE_ENGI airlock_wires = /datum/wires/airlock/engineering @@ -44,7 +44,7 @@ /area/station/solars/starboard/fore/asteriod name = "\improper Starboard Bow Asteriod Solar Array" icon_state = "panelsFS" - area_flags = UNIQUE_AREA // solar areas directly on asteriod have gravity + area_flags = NONE // solar areas directly on asteriod have gravity /area/station/solars/port name = "\improper Port Solar Array" @@ -53,7 +53,7 @@ /area/station/solars/port/asteriod name = "\improper Port Asteriod Solar Array" icon_state = "panelsP" - area_flags = UNIQUE_AREA // solar areas directly on asteriod have gravity + area_flags = NONE // solar areas directly on asteriod have gravity /area/station/solars/port/aft name = "\improper Port Quarter Solar Array" diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index ce77ca09ada3..2519189fdece 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -336,11 +336,12 @@ return FALSE /** - * Ensure a list of atoms/reagents exists inside this atom + * Called whenever an item is crafted, either via stack recipes or crafting recipes from the crafting menu * - * Cycles through the list of movables used up in the recipe and calls used_in_craft() for each of them - * then it either moves them inside the object or deletes - * them depending on whether they're in the list of parts for the recipe or not + * By default, it just cycles through the list of movables used in the recipe and calls used_in_craft() for each of them, + * then it either moves them inside the object if they're in the list of parts for the recipe + * or deletes them if they're not. + * The proc can be overriden by subtypes, as long as it always call parent. */ /atom/proc/on_craft_completion(list/components, datum/crafting_recipe/current_recipe, atom/crafter) SHOULD_CALL_PARENT(TRUE) @@ -349,17 +350,17 @@ var/list/parts_by_type = remaining_parts?.Copy() for(var/parttype in parts_by_type) //necessary for our is_type_in_list() call with the zebra arg set to true parts_by_type[parttype] = parttype - for(var/obj/item/item in components) // machinery or structure objects in the list are guaranteed to be used up. We only check items. - item.used_in_craft(src, current_recipe) - var/matched_type = is_type_in_list(item, parts_by_type, zebra = TRUE) + for(var/atom/movable/movable as anything in components) // machinery or structure objects in the list are guaranteed to be used up. We only check items. + movable.used_in_craft(src, current_recipe) + var/matched_type = is_type_in_list(movable, parts_by_type, zebra = TRUE) if(!matched_type) continue - if(isliving(item.loc)) - var/mob/living/living = item.loc - living.transferItemToLoc(item, src) + if(isliving(movable.loc) && isitem(movable)) + var/mob/living/living = movable.loc + living.transferItemToLoc(movable, src) else - item.forceMove(src) + movable.forceMove(src) if(matched_type) remaining_parts[matched_type] -= 1 @@ -428,7 +429,7 @@ for(var/datum/reagent/current_reagent as anything in reagents) . |= current_reagent.expose_atom(src, reagents[current_reagent], methods) -/// Are you allowed to drop this atom +/// Are you allowed to drop stuff inside this atom /atom/proc/AllowDrop() return FALSE @@ -653,7 +654,10 @@ /atom/proc/StartProcessingAtom(mob/living/user, obj/item/process_item, list/chosen_option) var/processing_time = chosen_option[TOOL_PROCESSING_TIME] + var/sound_to_play = chosen_option[TOOL_PROCESSING_SOUND] to_chat(user, span_notice("You start working on [src].")) + if(sound_to_play) + playsound(src, sound_to_play, 50, TRUE) if(!process_item.use_tool(src, user, processing_time, volume=50)) return var/atom/atom_to_create = chosen_option[TOOL_PROCESSING_RESULT] diff --git a/code/game/atom/alternate_appearance.dm b/code/game/atom/alternate_appearance.dm index 1bc5ae0d6415..e642de36fe35 100644 --- a/code/game/atom/alternate_appearance.dm +++ b/code/game/atom/alternate_appearance.dm @@ -110,6 +110,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) ) /datum/atom_hud/alternate_appearance/basic/New(key, image/I, options = AA_TARGET_SEE_APPEARANCE) + signals_registering = string_list(signals_registering) ..() transfer_overlays = options & AA_MATCH_TARGET_OVERLAYS image = I @@ -228,7 +229,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) /datum/atom_hud/alternate_appearance/basic/heretic -/datum/atom_hud/alternate_appearance/basic/heretic/mobShouldSee(mob/M) - if(IS_HERETIC(M)) +/datum/atom_hud/alternate_appearance/basic/heretic/mobShouldSee(mob/viewer) + if(IS_HERETIC_OR_MONSTER(viewer)) return TRUE return FALSE diff --git a/code/game/atom/atom_act.dm b/code/game/atom/atom_act.dm index 197d6c9e38b4..2a0475302b4a 100644 --- a/code/game/atom/atom_act.dm +++ b/code/game/atom/atom_act.dm @@ -72,6 +72,14 @@ if(!(protection & EMP_PROTECT_WIRES) && istype(wires)) wires.emp_pulse() + if(flags_1 & HOLOGRAM_1) // holograms should ignore EMP_PROTECT flags (since the protection itself is also a hologram) + if(prob(75 / severity)) + // avoid spamming messages for anything inside the holodeck directly + if(!istype(get_area(src), /area/station/holodeck)) + visible_message(span_warning("[src] fades away!")) + animate(alpha = 0, time = 1 SECONDS) + QDEL_IN(src, 1 SECONDS) + SEND_SIGNAL(src, COMSIG_ATOM_EMP_ACT, severity, protection) return protection // Pass the protection value collected here upwards @@ -85,8 +93,18 @@ */ /atom/proc/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE, blocked = null) + var/sigreturn = SEND_SIGNAL(src, COMSIG_ATOM_PRE_BULLET_ACT, hitting_projectile, def_zone, piercing_hit) + + if(sigreturn & COMPONENT_BULLET_PIERCED) + return BULLET_ACT_FORCE_PIERCE + if(sigreturn & COMPONENT_BULLET_BLOCKED) + return BULLET_ACT_BLOCK + if(sigreturn & COMPONENT_BULLET_ACTED) + return BULLET_ACT_HIT + if (isnull(blocked)) blocked = check_projectile_armor(def_zone, hitting_projectile) + return bullet_act(hitting_projectile, def_zone, piercing_hit, blocked) /** @@ -100,15 +118,6 @@ */ /atom/proc/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE, blocked = 0) SHOULD_CALL_PARENT(TRUE) - - var/sigreturn = SEND_SIGNAL(src, COMSIG_ATOM_PRE_BULLET_ACT, hitting_projectile, def_zone, piercing_hit, blocked) - if(sigreturn & COMPONENT_BULLET_PIERCED) - return BULLET_ACT_FORCE_PIERCE - if(sigreturn & COMPONENT_BULLET_BLOCKED) - return BULLET_ACT_BLOCK - if(sigreturn & COMPONENT_BULLET_ACTED) - return BULLET_ACT_HIT - SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, hitting_projectile, def_zone, piercing_hit, blocked) if(QDELETED(hitting_projectile)) // Signal deleted it? return BULLET_ACT_BLOCK @@ -221,8 +230,9 @@ * * Override this if you want custom behaviour in whatever gets hit by the rust * /turf/rust_turf should be used instead for overriding rust on turfs + * rust_strength (optional) - if you want to vary the effect based on the users' strength */ -/atom/proc/rust_heretic_act() +/atom/proc/rust_heretic_act(rust_strength) return ///wrapper proc that passes our mob's rust_strength to the target we are rusting @@ -243,7 +253,7 @@ * Default behaviour is to send [COMSIG_ATOM_RCD_ACT] and return FALSE */ /atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - SEND_SIGNAL(src, COMSIG_ATOM_RCD_ACT, user, the_rcd, rcd_data["[RCD_DESIGN_MODE]"]) + SEND_SIGNAL(src, COMSIG_ATOM_RCD_ACT, user, the_rcd, rcd_data[RCD_DESIGN_MODE]) return FALSE ///Return the values you get when an RCD eats you? diff --git a/code/game/atom/atom_examine.dm b/code/game/atom/atom_examine.dm index 7b6260758d0b..4053c3dc1cf2 100644 --- a/code/game/atom/atom_examine.dm +++ b/code/game/atom/atom_examine.dm @@ -153,7 +153,7 @@ return "\a [src]" /mob/living/get_examine_name(mob/user) - var/visible_name = get_visible_name() + var/visible_name = get_visible_name(examiner = user) // DARKPACK EDIT, ORIGINAL: var/visible_name = get_visible_name() var/list/name_override = list(visible_name) if(SEND_SIGNAL(user, COMSIG_LIVING_PERCEIVE_EXAMINE_NAME, src, visible_name, name_override) & COMPONENT_EXAMINE_NAME_OVERRIDEN) return name_override[1] @@ -193,5 +193,5 @@ * * add_id_name - If TRUE, ID information such as honorifics or name (if mismatched) are appended * * force_real_name - If TRUE, will always return real_name and add (as face_name/id_name) if it doesn't match their appearance */ -/atom/proc/get_visible_name(add_id_name = TRUE, force_real_name = FALSE) +/atom/proc/get_visible_name(add_id_name = TRUE, force_real_name = FALSE, mob/examiner) // DARKPACK EDIT, ORIGINAL: /atom/proc/get_visible_name(add_id_name = TRUE, force_real_name = FALSE) return name diff --git a/code/game/atom/atom_materials.dm b/code/game/atom/atom_materials.dm index 542930919ce5..a4200fd418f1 100644 --- a/code/game/atom/atom_materials.dm +++ b/code/game/atom/atom_materials.dm @@ -29,16 +29,28 @@ /atom/proc/initialize_materials(list/materials, multiplier = 1) SHOULD_NOT_OVERRIDE(TRUE) if(multiplier != 1) - materials = materials.Copy() //avoid editing the list that was originally used as argument if it's ever going to be used again. + materials = materials.Copy() //avoid editing the original list since it may be cached somewhere (likely in the materials subsystem). for(var/current_material in materials) materials[current_material] *= multiplier + //Let's be sure that there are absolutely no materials in the list that aren't positive. + var/list/nonpos_mats + for(var/mat in materials) + if(materials[mat] <= 0) + LAZYADD(nonpos_mats, "[mat] = [materials[mat]]") + materials -= mat + if(length(nonpos_mats)) + stack_trace("materials with non-positive values found in [type]: [english_list(nonpos_mats, and_text = ", ")]") + if(!length(materials)) + return + sortTim(materials, GLOBAL_PROC_REF(cmp_numeric_dsc), associative = TRUE) apply_material_effects(materials) ///proc responsible for applying material effects when setting materials. /atom/proc/apply_material_effects(list/materials) SHOULD_CALL_PARENT(TRUE) + if(material_flags & MATERIAL_EFFECTS) var/list/material_effects = get_material_effects_list(materials) finalize_material_effects(material_effects) @@ -375,19 +387,7 @@ * Gets the most common material in the object. */ /atom/proc/get_master_material() - var/list/cached_materials = custom_materials - if(!length(cached_materials)) - return null - - var/most_common_material = null - var/max_amount = 0 - for(var/material in cached_materials) - if(cached_materials[material] > max_amount) - most_common_material = material - max_amount = cached_materials[material] - - if(most_common_material) - return GET_MATERIAL_REF(most_common_material) + return length(custom_materials) ? GET_MATERIAL_REF(custom_materials[1]) : null //materials are sorted by amount, the first is always the main one /** * Gets the total amount of materials in this atom. @@ -396,6 +396,16 @@ return isnull(custom_materials) ? 0 : counterlist_sum(custom_materials) +///A simple proc that iterates through each material that the object is made of and spawns some stacks based on their amount and associated sheet/ore type. +/atom/proc/drop_costum_materials(multiplier = 1) + for(var/datum/material/material as anything in custom_materials) + var/stack_type = material.sheet_type || material.ore_type + if(!stack_type) + continue + var/amount_to_spawn = FLOOR(custom_materials[material] / SHEET_MATERIAL_AMOUNT * multiplier, 1) + if(amount_to_spawn > 0) + new stack_type(loc, amount_to_spawn) + /** * A bit of leeway when comparing the amount of material of two items. * This was made to test the material composition of items spawned via crafting/processable component and an items of the same type spawned @@ -410,6 +420,8 @@ /// Compares the materials of two items to see if they're roughly the same. Primarily used in crafting and processing unit tests. /atom/proc/compare_materials(atom/target) + if(custom_materials == target.custom_materials) // SSmaterials caches the combinations so we don't have to run more complex checks + return TRUE if(length(custom_materials) != length(target.custom_materials)) return FALSE for(var/mat in custom_materials) @@ -421,22 +433,65 @@ return FALSE return TRUE -#undef COMPARISION_ACCEPTABLE_MATERIAL_DEVIATION - /** - * Returns a string with the materials and their respective amounts in it (eg. [list(/datum/material/meat = 100, /datum/material/plastic = 10)] ) - * also used in several unit tests. + * Returns a string with the materials and their respective amounts written in a way that reflects how it's displayed in the code + * (eg. [list(/datum/material/meat = 100, /datum/material/plastic = 10)]). Also used in several unit tests. + * Not to be confused with get_material_english_list() + * Arguments: + * * as_sheets: returns the text in terms of sheets, e.g "[list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 2)]" */ -/atom/proc/get_materials_english_list() - if(!custom_materials) - return "null" - var/text = "\[list(" +/atom/proc/transcribe_materials_list(list/mats_list, as_sheets = TRUE) + if(!mats_list) + if(!custom_materials) + return "null" + mats_list = custom_materials + var/text = "list(" var/index = 1 - var/mats_len = length(custom_materials) - for(var/datum/material/mat as anything in custom_materials) - text += "[mat.type] = [custom_materials[mat]]" + var/mats_len = length(mats_list) + for(var/datum/material/mat as anything in mats_list) + var/amount_string = "" + if(as_sheets) + var/amount = sheets_from_value(mats_list[mat]) + switch(amount) + if(0 to 0.49) + amount_string = "SMALL_MATERIAL_AMOUNT * " + num2text(amount * 10) + if(0.5) + amount_string = "HALF_SHEET_MATERIAL_AMOUNT" + if(1) + amount_string = "SHEET_MATERIAL_AMOUNT" + else + amount_string = "SHEET_MATERIAL_AMOUNT * " + num2text(amount) + else + amount_string = "[mats_list[mat]]" + text += "[mat.type] = " + amount_string if(index < mats_len) text += ", " index++ - text += ")\]" + text += ")" return text + +/// Convert a raw material amount into +/// "SHEET_MATERIAL_AMOUNT", or "* N", with rounding rules. +/proc/sheets_from_value(value, sheet_amount = SHEET_MATERIAL_AMOUNT) + if(!value) + return 0 + + // If value is small, do NOT try rounding to nearest 0 or 5. percentage error becomes huge. + var/final_value + + if(value < sheet_amount) + // Use exact amount for small-value materials (0.1, 0.25, 0.55, etc) + final_value = value + else + // Large values: round to nearest 0 or 5 + var/nearest5_value = round(value / 5) * 5 + var/max_error = value * COMPARISION_ACCEPTABLE_MATERIAL_DEVIATION // 3% + if(abs(nearest5_value - value) <= max_error) + final_value = nearest5_value + else + final_value = value + + var/final_sheet_multiplier = final_value / sheet_amount + return final_sheet_multiplier + +#undef COMPARISION_ACCEPTABLE_MATERIAL_DEVIATION diff --git a/code/game/atom/atom_vv.dm b/code/game/atom/atom_vv.dm index 92f8be528c64..176ee8e5248f 100644 --- a/code/game/atom/atom_vv.dm +++ b/code/game/atom/atom_vv.dm @@ -214,7 +214,7 @@ * At the atom level, if you edit a var named "color" it will add the atom colour with * admin level priority to the atom colours list * - * Also, if GLOB.Debug2 is FALSE, it sets the [ADMIN_SPAWNED_1] flag on [flags_1][/atom/var/flags_1], which signifies + * Also, if GLOB.debugging_enabled is FALSE, it sets the [ADMIN_SPAWNED_1] flag on [flags_1][/atom/var/flags_1], which signifies * the object has been admin edited */ /atom/vv_edit_var(var_name, var_value) @@ -287,7 +287,7 @@ datum_flags |= DF_VAR_EDITED return - if(!GLOB.Debug2) + if(!GLOB.debugging_enabled) flags_1 |= ADMIN_SPAWNED_1 . = ..() diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 3a984ee64f9f..5377dccfddc7 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -174,6 +174,8 @@ blocker.dir = dir blocker.appearance_flags = appearance_flags | EMISSIVE_APPEARANCE_FLAGS blocker.plane = GET_NEW_PLANE(EMISSIVE_PLANE, PLANE_TO_OFFSET(plane)) // Takes a light path through the normal macro for a microop + if (IS_TOPDOWN_PLANE(plane)) + blocker.layer = TOPDOWN_TO_EMISSIVE_LAYER(layer) // Ok so this is really cursed, but I want to set with this blocker cheaply while // Still allowing it to be removed from the overlays list later // So I'm gonna flatten it, then insert the flattened overlay into overlays AND the managed overlays list, directly @@ -577,7 +579,7 @@ if(pulling_mob.buckled && pulling_mob.buckled.buckle_prevents_pull) //if they're buckled to something that disallows pulling, prevent it stop_pulling() return FALSE - if(moving_atom == loc && pulling.density) + if(get_turf(moving_atom) == loc && pulling.density) return FALSE var/move_dir = get_dir(pulling.loc, moving_atom) if(!Process_Spacemove(move_dir)) @@ -1328,13 +1330,13 @@ return ..() // Calls throw_at after checking that the move strength is greater than the thrown atom's move resist. Identical args. -/atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE) +/atom/movable/proc/safe_throw_at(atom/target, range, speed, atom/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE) if((force < (move_resist * MOVE_FORCE_THROW_RATIO)) || (move_resist == INFINITY)) return return throw_at(target, range, speed, thrower, spin, diagonals_first, callback, force, gentle) ///If this returns FALSE then callback will not be called. -/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE, quickstart = TRUE, throw_datum_typepath = /datum/thrownthing) +/atom/movable/proc/throw_at(atom/target, range, speed, atom/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE, quickstart = TRUE, throw_datum_typepath = /datum/thrownthing) . = FALSE if(QDELETED(src)) @@ -1350,36 +1352,38 @@ pulledby.stop_pulling() //They are moving! Wouldn't it be cool if we calculated their momentum and added it to the throw? - if (thrower && thrower.last_move && thrower.client && thrower.client.move_delay >= world.time + world.tick_lag*2) - var/user_momentum = thrower.cached_multiplicative_slowdown - if (!user_momentum) //no movement_delay, this means they move once per byond tick, lets calculate from that instead. - user_momentum = world.tick_lag - - user_momentum = 1 / user_momentum // convert from ds to the tiles per ds that throw_at uses. - - if (get_dir(thrower, target) & last_move) - user_momentum = user_momentum //basically a noop, but needed - else if (get_dir(target, thrower) & last_move) - user_momentum = -user_momentum //we are moving away from the target, lets slowdown the throw accordingly - else - user_momentum = 0 - + if(ismob(thrower)) + var/mob/thrower_mob = thrower + if(thrower_mob.last_move && thrower_mob.client && thrower_mob.client.move_delay >= world.time) + var/user_momentum = thrower_mob.cached_multiplicative_slowdown + if (!user_momentum) //no movement_delay, this means they move once per byond tick, lets calculate from that instead. + user_momentum = world.tick_lag + + user_momentum = 1 / user_momentum // convert from ds to the tiles per ds that throw_at uses. + + if (get_dir(thrower_mob, target) & last_move) + user_momentum = user_momentum //basically a noop, but needed + else if (get_dir(target, thrower_mob) & last_move) + user_momentum = -user_momentum //we are moving away from the target, lets slowdown the throw accordingly + else + user_momentum = 0 - if (user_momentum) - //first lets add that momentum to range. - range *= (user_momentum / speed) + 1 - //then lets add it to speed - speed += user_momentum - if (speed <= 0) - return//no throw speed, the user was moving too fast. + if (user_momentum) + //first lets add that momentum to range. + range *= (user_momentum / speed) + 1 + //then lets add it to speed + speed += user_momentum + if (speed <= 0) + return//no throw speed, the user was moving too fast. . = TRUE // No failure conditions past this point. var/target_zone if(QDELETED(thrower)) thrower = null //Let's not pass a qdeleting reference if any. - else - target_zone = thrower.zone_selected + else if(ismob(thrower)) + var/mob/thrower_mob = thrower + target_zone = thrower_mob.zone_selected var/datum/thrownthing/thrown_thing = new throw_datum_typepath(src, target, get_dir(src, target), range, speed, thrower, diagonals_first, force, gentle, callback, target_zone) diff --git a/code/game/communications.dm b/code/game/communications.dm index 9e40080a49d2..52bfc922e378 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -110,6 +110,14 @@ GLOBAL_LIST_INIT(default_radio_channels, list( RADIO_CHANNEL_CTF_RED = FREQ_CTF_RED, RADIO_CHANNEL_CTF_YELLOW = FREQ_CTF_YELLOW, STATUS_DISPLAY_RELAY = FREQ_STATUS_DISPLAYS, + // DARKPACK EDIT ADD START + RADIO_CHANNEL_POLICE = FREQ_POLICE, + RADIO_CHANNEL_CLINIC = FREQ_CLINIC, + RADIO_CHANNEL_MILITARY = FREQ_MILITARY, + RADIO_CHANNEL_CAMARILLA = FREQ_CAMARILLA, + RADIO_CHANNEL_ANARCH = FREQ_ANARCH, + RADIO_CHANNEL_ENDRON = FREQ_ENDRON, + // DARKPACK EDIT ADD END )) GLOBAL_LIST_INIT(reserved_radio_frequencies, list( diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 959716d230da..190e7f66f50c 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -8,48 +8,35 @@ /* DATA HUD DATUMS */ /atom/proc/add_to_all_human_data_huds() - for(var/datum/atom_hud/data/human/hud in GLOB.huds) - hud.add_atom_to_hud(src) + for(var/hud_key, hud_type in GLOB.huds) + astype(hud_type, /datum/atom_hud/data/human)?.add_atom_to_hud(src) /atom/proc/remove_from_all_data_huds() - for(var/datum/atom_hud/data/hud in GLOB.huds) - hud.remove_atom_from_hud(src) + for(var/hud_key, hud_type in GLOB.huds) + astype(hud_type, /datum/atom_hud/data)?.remove_atom_from_hud(src) /datum/atom_hud/data /datum/atom_hud/data/human/medical hud_icons = list(STATUS_HUD, HEALTH_HUD) +/// Sees health (0-100) status (alive, dead), but relies on suit sensors being on /datum/atom_hud/data/human/medical/basic -/datum/atom_hud/data/human/medical/basic/proc/check_sensors(mob/living/carbon/human/human) - if(!istype(human)) - return FALSE - if(HAS_TRAIT(human, HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT)) - return TRUE - var/obj/item/clothing/under/undersuit = human.w_uniform - if(!istype(undersuit)) - return FALSE - if(undersuit.has_sensor < HAS_SENSORS) - return FALSE - if(undersuit.sensor_mode <= SENSOR_VITALS) - return FALSE - return TRUE - -/datum/atom_hud/data/human/medical/basic/add_atom_to_single_mob_hud(mob/M, mob/living/carbon/H) - if(check_sensors(H)) - ..() - -/datum/atom_hud/data/human/medical/basic/proc/update_suit_sensors(mob/living/carbon/H) - check_sensors(H) ? add_atom_to_hud(H) : remove_atom_from_hud(H) +/datum/atom_hud/data/human/medical/basic/add_atom_to_single_mob_hud(mob/requesting_mob, atom/hud_atom) + if(HAS_TRAIT(hud_atom, TRAIT_BASIC_HEALTH_HUD_VISIBLE)) + return ..() +/// Sees health (0-100) status (alive, dead), always /datum/atom_hud/data/human/medical/advanced /datum/atom_hud/data/human/security +/// Only sees ID card job /datum/atom_hud/data/human/security/basic hud_icons = list(ID_HUD) +/// Sees ID card job, implants, and wanted status /datum/atom_hud/data/human/security/advanced hud_icons = list(ID_HUD, IMPSEC_FIRST_HUD, IMPLOYAL_HUD, IMPSEC_SECOND_HUD, WANTED_HUD) @@ -165,11 +152,6 @@ Medical HUD! Basic mode needs suit sensors on. //HOOKS -//called when a human changes suit sensors -/mob/living/carbon/proc/update_suit_sensors() - var/datum/atom_hud/data/human/medical/basic/B = GLOB.huds[DATA_HUD_MEDICAL_BASIC] - B.update_suit_sensors(src) - //called when a living mob changes health /mob/living/proc/med_hud_set_health() set_hud_image_state(HEALTH_HUD, "hud[RoundHealth(src)]") @@ -385,11 +367,11 @@ Diagnostic HUDs! //Borgie battery tracking! /mob/living/silicon/robot/proc/diag_hud_set_borgcell() - if(cell) + if(QDELETED(cell) || (cell.maxcharge == 0)) + set_hud_image_state(DIAG_BATT_HUD, "hudnobatt") + else var/chargelvl = (cell.charge/cell.maxcharge) set_hud_image_state(DIAG_BATT_HUD, "hudbatt[RoundDiagBar(chargelvl)]") - else - set_hud_image_state(DIAG_BATT_HUD, "hudnobatt") //borg-AI shell tracking /mob/living/silicon/robot/proc/diag_hud_set_aishell() //Shows if AI is controlling a cyborg via a BORIS module @@ -418,11 +400,11 @@ Diagnostic HUDs! set_hud_image_state(DIAG_MECH_HUD, "huddiag[RoundDiagBar(atom_integrity/max_integrity)]") /obj/vehicle/sealed/mecha/proc/diag_hud_set_mechcell() - if(cell) + if(QDELETED(cell) || (cell.maxcharge == 0)) + set_hud_image_state(DIAG_BATT_HUD, "hudnobatt") + else var/chargelvl = cell.charge/cell.maxcharge set_hud_image_state(DIAG_BATT_HUD, "hudbatt[RoundDiagBar(chargelvl)]") - else - set_hud_image_state(DIAG_BATT_HUD, "hudnobatt") /obj/vehicle/sealed/mecha/proc/diag_hud_set_mechstat() if(!internal_damage) @@ -489,11 +471,11 @@ Diagnostic HUDs! set_hud_image_state(DIAG_BOT_HUD, "") /mob/living/simple_animal/bot/mulebot/proc/diag_hud_set_mulebotcell() - if(cell) + if(QDELETED(cell) || (cell.maxcharge == 0)) + set_hud_image_state(DIAG_BATT_HUD, "hudnobatt") + else var/chargelvl = (cell.charge/cell.maxcharge) set_hud_image_state(DIAG_BATT_HUD, "hudbatt[RoundDiagBar(chargelvl)]") - else - set_hud_image_state(DIAG_STAT_HUD, "hudnobatt") /*~~~~~~~~~~~~ Airlocks! diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index a98b03d9c831..171086b06b65 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -10,7 +10,7 @@ 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) 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)) + if(istype(get_area(smes), /area/station/ai) || !is_station_level(smes.z)) continue smes.charge = 0 smes.output_level = 0 diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 904646f24085..33256f6d3909 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -295,11 +295,10 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) steal_hint = "A self-defense weapon standard-issue for all heads of staffs barring the Head of Security. Rarely found off of their person." /datum/objective_item/steal/traitor/telebaton/check_special_completion(obj/item/thing) - return thing.type == /obj/item/melee/baton/telescopic + return !istype(thing, /obj/item/melee/baton/telescopic/contractor_baton) /obj/item/melee/baton/telescopic/add_stealing_item_objective() - if(type == /obj/item/melee/baton/telescopic) - return add_item_to_steal(src, /obj/item/melee/baton/telescopic) + return add_item_to_steal(src, /obj/item/melee/baton/telescopic) /datum/objective_item/steal/traitor/cargo_budget name = "cargo's departmental budget" @@ -402,15 +401,15 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) /datum/objective_item/steal/jetpack name = "the Captain's jetpack" - targetitem = /obj/item/tank/jetpack/oxygen/captain + targetitem = /obj/item/tank/jetpack/captain excludefromjob = list(JOB_CAPTAIN) item_owner = list(JOB_CAPTAIN) exists_on_map = TRUE difficulty = 3 steal_hint = "A special yellow jetpack found in the Suit Storage Unit in the Captain's Quarters." -/obj/item/tank/jetpack/oxygen/captain/add_stealing_item_objective() - return add_item_to_steal(src, /obj/item/tank/jetpack/oxygen/captain) +/obj/item/tank/jetpack/captain/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/tank/jetpack/captain) /datum/objective_item/steal/magboots name = "the chief engineer's advanced magnetic boots" @@ -912,6 +911,17 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) /obj/item/mod/control/pre_equipped/rescue/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/rescue) +/datum/objective_item/steal/spy/cmo_defib + name = "Chief Medical Officer's Compact Defibrillator" + targetitem = /obj/item/defibrillator/compact/loaded/cmo + excludefromjob = list(JOB_CHIEF_MEDICAL_OFFICER) + exists_on_map = TRUE + difficulty = 2 + steal_hint = "The Compact Defibrillator, found on their person, or in their closet." + +/obj/item/defibrillator/compact/loaded/cmo/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/defibrillator/compact/loaded/cmo) + /datum/objective_item/steal/spy/hos_modsuit name = "the head of security's safeguard MOD control unit" targetitem = /obj/item/mod/control/pre_equipped/safeguard diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index c97d4d4fbe11..c3fc2b6fbfa2 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -209,6 +209,8 @@ PROTECTED_PROC(TRUE) SHOULD_CALL_PARENT(TRUE) + find_and_mount_on_atom(late_init = TRUE) + power_change() if(use_power == NO_POWER_USE) return @@ -309,7 +311,11 @@ set waitfor = FALSE return PROCESS_KILL -/obj/machinery/proc/process_atmos()//If you dont use process why are you here +/** + * Process but for machines interacting with atmospherics. + * Like process, anything sensitive to changes in the wait time between process ticks should account for seconds_per_tick. +**/ +/obj/machinery/proc/process_atmos(seconds_per_tick)//If you dont touch atmos why are you here set waitfor = FALSE return PROCESS_KILL @@ -396,7 +402,7 @@ 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))) + if(wires && (movable_atom in assoc_to_values(wires.assemblies))) continue if(subset && !(movable_atom in subset)) @@ -738,7 +744,7 @@ var/mob/user = ui.user add_fingerprint(user) update_last_used(user) - if(isAI(user) && !GLOB.cameranet.checkTurfVis(get_turf(src))) //We check if they're an AI specifically here, so borgs/adminghosts/human wand can still access off-camera stuff. + if(isAI(user) && !SScameras.is_visible_by_cameras(get_turf(src))) //We check if they're an AI specifically here, so borgs/adminghosts/human wand can still access off-camera stuff. to_chat(user, span_warning("You can no longer connect to this device!")) return FALSE return ..() @@ -1237,8 +1243,9 @@ dropped_atom.pixel_x = -8 + ((.%3)*8) dropped_atom.pixel_y = -8 + (round( . / 3)*8) -/obj/machinery/rust_heretic_act() - take_damage(500, BRUTE, MELEE, 1) +/obj/machinery/rust_heretic_act(rust_strength) + var/damage = 500 + rust_strength * 200 + take_damage(damage, BRUTE, BOMB, 1) /obj/machinery/vv_edit_var(vname, vval) if(vname == NAMEOF(src, occupant)) diff --git a/code/game/machinery/ai_core/_core.dm b/code/game/machinery/ai_core/_core.dm new file mode 100644 index 000000000000..512e193ac121 --- /dev/null +++ b/code/game/machinery/ai_core/_core.dm @@ -0,0 +1,248 @@ +#define AI_CORE_BRAIN(X) X.braintype == "Android" ? "brain" : "MMI" + +/obj/structure/ai_core + name = "\improper AI core" + desc = "The framework for an artificial intelligence core." + icon = 'icons/mob/silicon/ai.dmi' + icon_state = "build_0" + base_icon_state = "build_" + density = TRUE + anchored = FALSE + max_integrity = 500 + custom_materials = list(/datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 4) + var/state = CORE_STATE_EMPTY + var/datum/ai_laws/laws + var/obj/item/circuitboard/aicore/circuit + var/obj/item/mmi/core_mmi + +/obj/structure/ai_core/Initialize(mapload, state = src.state, obj/item/mmi/core_mmi = null) + . = ..() + laws = new + laws.set_laws_config() + + if(core_mmi && state < CORE_STATE_CABLED) + stack_trace("supplied a core_mmi as constructor argument, but core state wouldn't have accepted it!") + state = CORE_STATE_FINISHED // just in case... + src.state = state + if(state >= CORE_STATE_CIRCUIT) + circuit = new(src) + if(state >= CORE_STATE_CABLED) + if(!core_mmi) + core_mmi = new /obj/item/mmi(src) + core_mmi.brain = new(core_mmi) + core_mmi.brain.organ_flags |= ORGAN_FROZEN + core_mmi.set_brainmob(new /mob/living/brain()) + core_mmi.brainmob.container = core_mmi + core_mmi.update_appearance() + core_mmi.forceMove(src) + src.core_mmi = core_mmi + set_anchored(TRUE) + + update_appearance(UPDATE_ICON_STATE) + +/obj/structure/ai_core/update_icon_state() + if(state != CORE_STATE_FINISHED) + icon_state = "[base_icon_state][state]" + if(state == CORE_STATE_CABLED && core_mmi) + icon_state += "b" + else + icon_state = "ai-empty" + return ..() + +/obj/structure/ai_core/Exited(atom/movable/gone, direction) + . = ..() + if(gone == circuit) + circuit = null + if((state != CORE_STATE_GLASSED) && (state != CORE_STATE_FINISHED)) + state = CORE_STATE_EMPTY + update_appearance() + if(gone == core_mmi) + core_mmi = null + update_appearance() + +/obj/structure/ai_core/atom_deconstruct(disassembled = TRUE) + if(state >= CORE_STATE_GLASSED) + new /obj/item/stack/sheet/rglass(drop_location(), 2) + if(state >= CORE_STATE_CABLED) + new /obj/item/stack/cable_coil(drop_location(), 5) + core_mmi?.forceMove(drop_location()) + circuit?.forceMove(drop_location()) + new /obj/item/stack/sheet/plasteel(drop_location(), 4) + +/obj/structure/ai_core/Destroy() + QDEL_NULL(circuit) + QDEL_NULL(core_mmi) + QDEL_NULL(laws) + return ..() + +/obj/structure/ai_core/examine(mob/user) + . = ..() + . += span_notice("It has some bolts that look [anchored ? "tightened" : "loosened"].") + + switch(state) + if(CORE_STATE_EMPTY) + . += span_notice("There is a slot for a circuit board, the frame can be melted down.") + if(CORE_STATE_CIRCUIT) + . += span_notice("The circuit board can be screwed into place or pried out.") + if(CORE_STATE_SCREWED) + . += span_notice("The frame can be wired, the circuit board can be unfastened.") + if(CORE_STATE_CABLED) + if(!core_mmi) + . += span_notice("There are wires which could be hooked up to an MMI or positronic brain, or cut.") + else + var/accept_laws = TRUE + if(core_mmi.laws.id != DEFAULT_AI_LAWID || !core_mmi.brainmob || !core_mmi.brainmob?.mind) + accept_laws = FALSE + . += span_notice("There is a slot for a reinforced glass panel, the [AI_CORE_BRAIN(core_mmi)] could be pried out.[accept_laws ? " A law module can be swiped across." : ""]") + if(CORE_STATE_GLASSED) + . += span_notice("The monitor [core_mmi?.brainmob?.mind && !suicide_check() ? "and neural interface " : ""]can be screwed in, the panel can be pried out.") + if(CORE_STATE_FINISHED) + . += 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/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(state < CORE_STATE_FINISHED) + return construction_item_interaction(user, tool, modifiers) + + return NONE + +/// Exists to be used for callbacks. +/obj/structure/ai_core/proc/check_state(state_to_check) + return (state == state_to_check) + +/obj/structure/ai_core/latejoin_inactive + name = "networked AI core" + desc = "This AI core is connected by bluespace transmitters to NTNet, allowing for an AI personality to be downloaded to it on the fly mid-shift." + anchored = TRUE + state = CORE_STATE_FINISHED + var/available = TRUE + var/safety_checks = TRUE + var/active = TRUE + +/obj/structure/ai_core/latejoin_inactive/Initialize(mapload, state, posibrain) + . = ..() + GLOB.latejoin_ai_cores += src + +/obj/structure/ai_core/latejoin_inactive/Destroy() + GLOB.latejoin_ai_cores -= src + return ..() + +/obj/structure/ai_core/latejoin_inactive/examine(mob/user) + . = ..() + . += "Its transmitter seems to be [active? "on" : "off"]." + . += span_notice("You could [active? "deactivate" : "activate"] it with a multitool.") + +/obj/structure/ai_core/latejoin_inactive/proc/is_available() //If people still manage to use this feature to spawn-kill AI latejoins ahelp them. + if(!available) + return FALSE + if(!safety_checks) + return TRUE + if(!active) + return FALSE + var/turf/T = get_turf(src) + var/area/A = get_area(src) + if(!(A.area_flags & BLOBS_ALLOWED)) + return FALSE + if(!A.power_equip) + return FALSE + if(!SSmapping.level_trait(T.z,ZTRAIT_STATION)) + return FALSE + if(!isfloorturf(T)) + return FALSE + return TRUE + +/obj/structure/ai_core/latejoin_inactive/multitool_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return NONE + + if(!tool.use_tool(src, user, 0 SECONDS, 0, 50)) + return ITEM_INTERACT_BLOCKING + + active = !active + balloon_alert(user, "[active ? "activated" : "deactivated"] transmitters") + return ITEM_INTERACT_SUCCESS + +/obj/structure/ai_core/proc/ai_structure_to_mob() + var/mob/living/brain/the_brainmob = core_mmi.brainmob + if(!the_brainmob.mind || suicide_check()) + return FALSE + the_brainmob.mind.remove_antags_for_borging() + if(!the_brainmob.mind.has_ever_been_ai) + SSblackbox.record_feedback("amount", "ais_created", 1) + var/mob/living/silicon/ai/ai_mob = null + + if(core_mmi.overrides_aicore_laws) + ai_mob = new /mob/living/silicon/ai(loc, core_mmi.laws, the_brainmob) + core_mmi.laws = null //MMI's law datum is being donated, so we need the MMI to let it go or the GC will eat it + else + ai_mob = new /mob/living/silicon/ai(loc, laws, the_brainmob) + laws = null //we're giving the new AI this datum, so let's not delete it when we qdel(src) 5 lines from now + + var/datum/antagonist/malf_ai/malf_datum = IS_MALF_AI(ai_mob) + if(malf_datum) + malf_datum.add_law_zero() + + if(!isnull(the_brainmob.client)) + ai_mob.set_gender(the_brainmob.client) + if(core_mmi.force_replace_ai_name) + ai_mob.fully_replace_character_name(ai_mob.name, core_mmi.replacement_ai_name()) + ai_mob.posibrain_inside = core_mmi.braintype == "Android" + deadchat_broadcast(" has been brought online at [get_area_name(ai_mob, format_text = TRUE)].", span_name("[ai_mob]"), follow_target = ai_mob, message_type = DEADCHAT_ANNOUNCEMENT) + qdel(src) + return ai_mob + +/// Quick proc to call to see if the brainmob inside of us has suicided. Returns TRUE if we have, FALSE in any other scenario. +/obj/structure/ai_core/proc/suicide_check() + if(isnull(core_mmi) || isnull(core_mmi.brainmob)) + return FALSE + return HAS_TRAIT(core_mmi.brainmob, TRAIT_SUICIDED) + +/* +This is a good place for AI-related object verbs so I'm sticking it here. +If adding stuff to this, don't forget that an AI need to cancel_camera() whenever it physically moves to a different location. +That prevents a few funky behaviors. +*/ +//The type of interaction, the player performing the operation, the AI itself, and the card object, if any. + + +/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.")) + return FALSE + return TRUE + +/obj/structure/ai_core/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/aicard/card) + if(state != CORE_STATE_FINISHED || !..()) + return + if(core_mmi && core_mmi.brainmob) + if(core_mmi.brainmob.mind) + to_chat(user, span_warning("[src] already contains an active mind!")) + return + else if(suicide_check()) + to_chat(user, span_warning("[AI_CORE_BRAIN(core_mmi)] installed in [src] is completely useless!")) + return + //Transferring a carded AI to a core. + if(interaction == AI_TRANS_FROM_CARD) + AI.set_control_disabled(FALSE) + AI.radio_enabled = TRUE + AI.forceMove(loc) // to replace the terminal. + to_chat(AI, span_notice("You have been uploaded to a stationary terminal. Remote device connection restored.")) + to_chat(user, "[span_boldnotice("Transfer successful")]: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.") + card.AI = null + AI.battery = circuit.battery + AI.posibrain_inside = isnull(core_mmi) || core_mmi.braintype == "Android" + qdel(src) + else //If for some reason you use an empty card on an empty AI terminal. + to_chat(user, span_alert("There is no AI loaded on this terminal.")) + +/obj/item/circuitboard/aicore + name = "AI core (AI Core Board)" //Well, duh, but best to be consistent + var/battery = 200 //backup battery for when the AI loses power. Copied to/from AI mobs when carding, and placed here to avoid recharge via deconning the core + +/obj/item/circuitboard/aicore/Initialize(mapload) + . = ..() + if(mapload && HAS_TRAIT(SSstation, STATION_TRAIT_HUMAN_AI)) + return INITIALIZE_HINT_QDEL + +#undef AI_CORE_BRAIN diff --git a/code/game/machinery/ai_core/core_construction.dm b/code/game/machinery/ai_core/core_construction.dm new file mode 100644 index 000000000000..df1a36782daa --- /dev/null +++ b/code/game/machinery/ai_core/core_construction.dm @@ -0,0 +1,253 @@ +#define AI_CORE_BRAIN(X) X.braintype == "Android" ? "brain" : "MMI" +#define UPDATE_STATE(new_state) state = new_state; update_appearance(UPDATE_ICON_STATE) +#define CHECK_STATE_CALLBACK(maintained_state) CALLBACK(src, PROC_REF(check_state), maintained_state) + +/obj/structure/ai_core/welder_act(mob/living/user, obj/item/tool) + if(state != CORE_STATE_EMPTY) + balloon_alert(user, "frame has to be empty!") + return ITEM_INTERACT_BLOCKING + + if(!tool.tool_start_check(user, 1)) + return ITEM_INTERACT_BLOCKING + + if(!tool.use_tool(src, user, 2 SECONDS, 1, 50, CHECK_STATE_CALLBACK(CORE_STATE_EMPTY))) + return ITEM_INTERACT_BLOCKING + + deconstruct(TRUE) + return ITEM_INTERACT_SUCCESS + +/obj/structure/ai_core/wrench_act(mob/living/user, obj/item/tool) + if(state >= CORE_STATE_FINISHED) + set_anchored(TRUE) //teehee + balloon_alert(user, "can't unanchor!") + return ITEM_INTERACT_BLOCKING + + default_unfasten_wrench(user, tool) + return ITEM_INTERACT_SUCCESS + +/obj/structure/ai_core/screwdriver_act(mob/living/user, obj/item/tool) + switch(state) + if(CORE_STATE_EMPTY) + balloon_alert(user, "nothing to screw in there!") + return ITEM_INTERACT_BLOCKING + if(CORE_STATE_CIRCUIT) + if(!tool.use_tool(src, user, 0 SECONDS, 0, 50, CHECK_STATE_CALLBACK(CORE_STATE_CIRCUIT))) + return ITEM_INTERACT_BLOCKING + balloon_alert(user, "board secured") + UPDATE_STATE(CORE_STATE_SCREWED) + return ITEM_INTERACT_SUCCESS + if(CORE_STATE_SCREWED) + if(!tool.use_tool(src, user, 0 SECONDS, 0, 50, CHECK_STATE_CALLBACK(CORE_STATE_SCREWED))) + return ITEM_INTERACT_BLOCKING + balloon_alert(user, "board unsecured") + UPDATE_STATE(CORE_STATE_CIRCUIT) + return ITEM_INTERACT_SUCCESS + if(CORE_STATE_CABLED) + balloon_alert(user, "can't reach the board!") + return ITEM_INTERACT_BLOCKING + if(CORE_STATE_GLASSED) + if(!anchored) + balloon_alert(user, "isn't anchored!") + return ITEM_INTERACT_BLOCKING + if(!tool.use_tool(src, user, 0 SECONDS, 0, 50, CHECK_STATE_CALLBACK(CORE_STATE_GLASSED))) + return ITEM_INTERACT_BLOCKING + if(suicide_check()) + balloon_alert(user, "processor is completely useless!") + return ITEM_INTERACT_BLOCKING + + var/atom/movable/alert_source = src + if(core_mmi.brainmob?.mind) + alert_source = ai_structure_to_mob() || alert_source + else + UPDATE_STATE(CORE_STATE_FINISHED) + alert_source.balloon_alert(user, "connected monitor[core_mmi?.brainmob?.mind ? " and neural network" : ""]") + return ITEM_INTERACT_SUCCESS + if(CORE_STATE_FINISHED) + if(!core_mmi?.brainmob?.mind || suicide_check()) + balloon_alert(user, "processor is inactive!") + return ITEM_INTERACT_BLOCKING + + if(!anchored) + balloon_alert(user, "anchor it first!") + return ITEM_INTERACT_BLOCKING + + balloon_alert(user, "connecting neural network...") + if(!tool.use_tool(src, user, 10 SECONDS, 0, 50, CHECK_STATE_CALLBACK(CORE_STATE_FINISHED))) + return ITEM_INTERACT_BLOCKING + + var/atom/movable/alert_source = ai_structure_to_mob() + if(!alert_source) + balloon_alert(user, "processor is inactive!") + return ITEM_INTERACT_BLOCKING + + alert_source.balloon_alert(user, "connected neural network") + return ITEM_INTERACT_SUCCESS + +/obj/structure/ai_core/crowbar_act(mob/living/user, obj/item/tool) + switch(state) + if(CORE_STATE_EMPTY) + balloon_alert(user, "nothing to pry out!") + return ITEM_INTERACT_BLOCKING + if(CORE_STATE_CIRCUIT) + if(!tool.use_tool(src, user, 0 SECONDS, 0, 50, CHECK_STATE_CALLBACK(CORE_STATE_CIRCUIT))) + return ITEM_INTERACT_BLOCKING + + circuit.forceMove(drop_location()) + UPDATE_STATE(CORE_STATE_EMPTY) + return ITEM_INTERACT_SUCCESS + if(CORE_STATE_SCREWED) + balloon_alert(user, "won't budge!") + return ITEM_INTERACT_BLOCKING + if(CORE_STATE_CABLED) + if(!core_mmi) + balloon_alert(user, "nothing to pry out!") + return ITEM_INTERACT_BLOCKING + if(!tool.use_tool(src, user, 0 SECONDS, 0, 50, CHECK_STATE_CALLBACK(CORE_STATE_CABLED)) || !core_mmi) + return ITEM_INTERACT_BLOCKING + + core_mmi.forceMove(drop_location()) + UPDATE_STATE(CORE_STATE_CABLED) + return ITEM_INTERACT_SUCCESS + if(CORE_STATE_GLASSED) + if(!tool.use_tool(src, user, 0 SECONDS, 0, 50, CHECK_STATE_CALLBACK(CORE_STATE_GLASSED))) + return ITEM_INTERACT_BLOCKING + + new /obj/item/stack/sheet/rglass(drop_location(), 2) + UPDATE_STATE(CORE_STATE_CABLED) + return ITEM_INTERACT_SUCCESS + if(CORE_STATE_FINISHED) + balloon_alert(user, "display is on!") + return ITEM_INTERACT_SUCCESS + +/obj/structure/ai_core/wirecutter_act(mob/living/user, obj/item/tool) + switch(state) + if(CORE_STATE_EMPTY to CORE_STATE_CIRCUIT) + balloon_alert(user, "nothing to cut!") + return ITEM_INTERACT_BLOCKING + if(CORE_STATE_CABLED) + if(core_mmi) + balloon_alert(user, "[AI_CORE_BRAIN(core_mmi)] in the way!") + return ITEM_INTERACT_BLOCKING + + if(!tool.use_tool(src, user, 0 SECONDS, 0, 50, CHECK_STATE_CALLBACK(CORE_STATE_CABLED)) || core_mmi) + return ITEM_INTERACT_BLOCKING + + new /obj/item/stack/cable_coil(drop_location(), 5) + UPDATE_STATE(CORE_STATE_SCREWED) + return ITEM_INTERACT_SUCCESS + if(CORE_STATE_GLASSED) + balloon_alert(user, "nothing left to cut!") + return ITEM_INTERACT_BLOCKING + if(CORE_STATE_FINISHED) + if(!tool.use_tool(src, user, 0 SECONDS, 0, 50, CHECK_STATE_CALLBACK(CORE_STATE_FINISHED))) + return ITEM_INTERACT_BLOCKING + + UPDATE_STATE(CORE_STATE_GLASSED) + return ITEM_INTERACT_SUCCESS + +/// Handles the interaction chain the same as item_interaction. Exists to isolate construction behaviour from other item behaviour. +/obj/structure/ai_core/proc/construction_item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/circuitboard/aicore)) + return install_board(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + + if(istype(tool, /obj/item/stack/cable_coil)) + return add_cabling(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + + if(istype(tool, /obj/item/mmi)) + return install_mmi(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + if(istype(tool, /obj/item/ai_module)) + return update_laws(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + if(istype(tool, /obj/item/stack/sheet/rglass)) + return install_glass(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + + return NONE + +/obj/structure/ai_core/proc/install_board(mob/living/user, obj/item/circuitboard/aicore/circuit) + if(state != CORE_STATE_EMPTY) + return FALSE + if(!user.transferItemToLoc(circuit, src)) + return FALSE + + playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) + src.circuit = circuit + UPDATE_STATE(CORE_STATE_CIRCUIT) + return TRUE + +/obj/structure/ai_core/proc/add_cabling(mob/living/user, obj/item/stack/cable_coil/cable) + if(state != CORE_STATE_SCREWED) + return FALSE + + if(cable.get_amount() < 5) + balloon_alert(user, "not enough [cable::name]!") + return FALSE + + balloon_alert(user, "adding cable...") + if(!cable.use_tool(src, user, 2 SECONDS, 5, 50, CHECK_STATE_CALLBACK(CORE_STATE_SCREWED))) + return FALSE + + UPDATE_STATE(CORE_STATE_CABLED) + return TRUE + +/obj/structure/ai_core/proc/install_mmi(mob/living/user, obj/item/mmi/mmi) + if(state != CORE_STATE_CABLED) + return FALSE + + if(!mmi.brain_check(user)) + var/wants_install = (tgui_alert(user, "This [AI_CORE_BRAIN(mmi)] is inactive, would you like to make an inactive AI?", "Installing AI [AI_CORE_BRAIN(mmi)]", list("Yes", "No")) == "Yes") + if(!wants_install) + return FALSE + if(QDELETED(src) || QDELETED(user) || QDELETED(mmi) || !user.is_holding(mmi) || !Adjacent(user)) + return FALSE + if(mmi.brainmob && HAS_TRAIT(mmi.brainmob, TRAIT_SUICIDED)) + balloon_alert(user, "[AI_CORE_BRAIN(mmi)] is useless!") + return FALSE + else + var/mob/living/brain/mmi_brainmob = mmi.brainmob + if(!CONFIG_GET(flag/allow_ai) || (mmi_brainmob && is_banned_from(mmi_brainmob.ckey, JOB_AI))) + if(!QDELETED(src) && !QDELETED(user) && !QDELETED(mmi) && user.is_holding(mmi) && Adjacent(user)) + balloon_alert(user, "[mmi] won't fit!") + return FALSE + + if(state != CORE_STATE_CABLED) + return FALSE + if(!user.transferItemToLoc(mmi, src)) + return FALSE + + core_mmi = mmi + UPDATE_STATE(CORE_STATE_CABLED) + return TRUE + +/obj/structure/ai_core/proc/update_laws(mob/living/user, obj/item/ai_module/module) + if(!core_mmi) + balloon_alert(user, "no brain installed!") + return FALSE + if(!core_mmi.brainmob || !core_mmi.brainmob?.mind || suicide_check()) + balloon_alert(user, "[AI_CORE_BRAIN(core_mmi)] is inactive!") + return FALSE + if(core_mmi.laws.id != DEFAULT_AI_LAWID) + balloon_alert(user, "[AI_CORE_BRAIN(core_mmi)] already has set laws!") + return FALSE + + module.install(laws, user) + return TRUE + +/obj/structure/ai_core/proc/install_glass(mob/living/user, obj/item/stack/sheet/rglass/glass) + if(state != CORE_STATE_CABLED) + return FALSE + + if(!core_mmi) + balloon_alert(user, "needs a processor!") + return FALSE + if(glass.get_amount() < 2) + balloon_alert(user, "not enough [glass::name]!") + return FALSE + + if(!glass.use_tool(src, user, 2 SECONDS, 2, 50, CHECK_STATE_CALLBACK(CORE_STATE_CABLED)) || !core_mmi) + return FALSE + + UPDATE_STATE(CORE_STATE_GLASSED) + return TRUE + +#undef CHECK_STATE_CALLBACK +#undef UPDATE_STATE +#undef AI_CORE_BRAIN diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index 745971011946..a66cd3209a21 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -29,10 +29,10 @@ GLOBAL_LIST_EMPTY(announcement_systems) var/errorlight = "Error_Red" /obj/machinery/announcement_system/Initialize(mapload) + config_entries = init_subtypes(/datum/aas_config_entry, list()) . = ..() - GLOB.announcement_systems += src radio = new radio_type(src) - config_entries = init_subtypes(/datum/aas_config_entry, list()) + GLOB.announcement_systems += src update_appearance() /obj/machinery/announcement_system/randomize_language_if_on_station() @@ -122,6 +122,13 @@ GLOBAL_LIST_EMPTY(announcement_systems) )) return list("config_entries" = configs) +/obj/machinery/announcement_system/ui_static_data(mob/user) + var/list/data = list() + + data["max_announcement_len"] = MAX_AAS_LENGTH + + return data + /obj/machinery/announcement_system/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) @@ -148,7 +155,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) message_admins("[ADMIN_LOOKUPFLW(usr)] tried to set announcement line for nonexisting line in the [config.name] for AAS. Probably href injection. Received line: [html_encode(params["lineKey"])]") log_game("[key_name(usr)] tried to mess with AAS. For [config.name] he tried to edit nonexistend [params["lineKey"]]") return - var/new_message = trim(html_encode(params["newText"]), MAX_MESSAGE_LEN) + var/new_message = trim(html_encode(params["newText"]), MAX_AAS_LENGTH) if(new_message) config.announcement_lines_map[params["lineKey"]] = new_message usr.log_message("updated [params["lineKey"]] line in the [config.name] to: [new_message]", LOG_GAME) @@ -168,13 +175,14 @@ GLOBAL_LIST_EMPTY(announcement_systems) /obj/machinery/announcement_system/proc/has_supported_channels(list/channels) if (!LAZYLEN(channels) || (RADIO_CHANNEL_COMMON in channels)) // Okay, I am not proud of this, but I don't want CentCom or Syndie AASs to broadcast on Common. - return src.type == /obj/machinery/announcement_system + // Because our overrides can just change radio withour creating new subtype we prefer to check both. + return src.type == /obj/machinery/announcement_system && src.radio_type == /obj/machinery/announcement_system::radio_type for(var/channel in channels) if(radio.channels[channel]) return TRUE return FALSE -/// Can AAS receive request for broadcast from you? +/// Can AAS receive request for broadcast from you? Null source means yes. /obj/machinery/announcement_system/proc/can_be_reached_from(atom/source) if(!source || !istype(source)) return TRUE @@ -182,6 +190,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) if (!source_turf) return TRUE // Keep updated with broadcasting.dm (/datum/signal/subspace/vocal/New) + // FFF (For Future Feature): think about adding radio relay support. Maybe implementing /datum/signal/subspace/aas_event or something similar. return z in SSmapping.get_connected_levels(source_turf) /// Compiles the announcement message with the provided variables. Announcement line is optional. @@ -205,13 +214,13 @@ GLOBAL_LIST_EMPTY(announcement_systems) for(var/channel in channels) radio.talk_into(src, message, channel, command_span ? list(speech_span, SPAN_COMMAND) : null) -/// Announces configs entry message with the provided variables. Channels and announcement_line are optional. +/// Announces configs entry message with the provided variables. Channels, announcement_line and command_span are optional. /obj/machinery/announcement_system/proc/announce(aas_config_entry_type, list/variables_map, list/channels, announcement_line, command_span) var/msg = compile_config_message(aas_config_entry_type, variables_map, announcement_line, TRUE) if (msg) broadcast(msg, channels, command_span) -/// Returns a random announcement system that is operational, has the specified config entry, signal can reach source and radio supports any channel in list. Config entry, source and channels are optional. +/// Returns a random announcement system that is operational, has the specified config entry, signal can reach source and radio supports any channel in list. All args are optional. /proc/get_announcement_system(aas_config_entry_type, source, list/channels) if (!GLOB.announcement_systems.len) return null @@ -225,7 +234,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) intact_aass += announce return intact_aass.len ? pick(intact_aass) : null -/// Announces the provided message with the provided variables and config entry type. Channels, announcement_line, command_span and source are optional. +/// Announces the provided message with the provided variables and config entry type. Only aas_config_entry_type and variables_map are mandatory. Other args are optional. /proc/aas_config_announce(aas_config_entry_type, list/variables_map, source, list/channels, announcement_line, command_span) var/obj/machinery/announcement_system/announcer = get_announcement_system(aas_config_entry_type, source, channels) if (!announcer) @@ -245,7 +254,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) // Can be changed or disabled by players var/modifiable = TRUE -/// Compiles the announcement message with the provided variables. Announcement line is optional. +/// Compiles the announcement message with the provided variables. Announcement line is optional, may be both index or line key. /datum/aas_config_entry/proc/compile_announce(list/variables_map, announcement_line) var/announcement_message = LAZYACCESS(announcement_lines_map, announcement_line) // If index was provided LAZYACCESS will return us a key, not value @@ -273,7 +282,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) */ /datum/aas_config_entry/arrival - name = "Arrival Announcement" + name = "Global: Arrival Announcement" announcement_lines_map = list( "Message" = "%PERSON has signed up as %RANK") vars_and_tooltips_map = list( @@ -291,7 +300,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) "ERR)#: DA#AB@#E NOT F(*ND!") /datum/aas_config_entry/newhead - name = "Departmental Head Announcement" + name = "Departmental: Head Announcement" announcement_lines_map = list( "Message" = "%PERSON, %RANK, is the department head.") vars_and_tooltips_map = list( @@ -309,7 +318,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) "AAS.exe is not responding. NanoOS is searching for a solution to the problem.") /datum/aas_config_entry/researched_node - name = "Research Node Announcement" + name = "Science Alert: Research Node Announcement" announcement_lines_map = list( "Message" = "The %NODE techweb node has been researched") vars_and_tooltips_map = list( @@ -328,7 +337,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) "ERR)#R - B*@ TEXT F*O(ND!") /datum/aas_config_entry/arrivals_broken - name = "Arrivals Shuttle Malfunction Announcement" + name = "Engineering Alert: Arrivals Shuttle Malfunction Announcement" announcement_lines_map = list( "Message" = "The arrivals shuttle has been damaged. Docking for repairs...") general_tooltip = "Broadcasted, when arrivals shuttle docks for repairs. No replacable variables provided." diff --git a/code/game/machinery/atmos_field_gen.dm b/code/game/machinery/atmos_field_gen.dm index 72a0c4a9d05f..004728d39143 100644 --- a/code/game/machinery/atmos_field_gen.dm +++ b/code/game/machinery/atmos_field_gen.dm @@ -39,7 +39,7 @@ /obj/machinery/atmos_shield_gen/Initialize(mapload) . = ..() register_context() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) set_wires(new /datum/wires/atmosshieldgen(src)) SSmachines.processing_early += src if(on) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 2f5d5a49073c..1636380afe3d 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -26,7 +26,7 @@ ///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 + var/datum/material_container/materials ///direction we output onto (if 0, on top of us) var/drop_direction = 0 //looping sound for printing items @@ -34,8 +34,8 @@ /obj/machinery/autolathe/Initialize(mapload) print_sound = new(src, FALSE) - materials = AddComponent( \ - /datum/component/material_container, \ + materials = new ( \ + src, \ SSmaterials.materials_by_category[MAT_CATEGORY_ITEM_MATERIAL], \ 0, \ MATCONTAINER_EXAMINE|MATCONTAINER_ACCEPT_ALLOYS, \ @@ -52,7 +52,7 @@ /obj/machinery/autolathe/Destroy() QDEL_NULL(print_sound) - materials = null + QDEL_NULL(materials) return ..() /obj/machinery/autolathe/examine(mob/user) @@ -302,6 +302,13 @@ target_location = get_turf(src) else target_location = get_turf(src) + + //give achievement for using unique material + if(design.materials[MAT_CATEGORY_ITEM_MATERIAL]) + for(var/datum/material/material in materials_needed) + if(!istype(material, /datum/material/glass) && !istype(material, /datum/material/iron)) + ui.user.client.give_award(/datum/award/achievement/misc/getting_an_upgrade, ui.user) + break addtimer(CALLBACK(src, PROC_REF(do_make_item), design, build_count, build_time_per_item, material_cost_coefficient, charge_per_item, materials_needed, target_location), build_time_per_item) return TRUE diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm index c6ff98ec3719..2c6f88fde4e9 100644 --- a/code/game/machinery/bank_machine.dm +++ b/code/game/machinery/bank_machine.dm @@ -60,7 +60,7 @@ if(value) if(synced_bank_account) synced_bank_account.adjust_money(value) - say("Credits deposited! The [synced_bank_account.account_holder] is now [synced_bank_account.account_balance] cr.") + say("[MONEY_NAME_CAPITALIZED] deposited! The [synced_bank_account.account_holder] is now [synced_bank_account.account_balance] [MONEY_SYMBOL].") qdel(weapon) return return ..() @@ -112,13 +112,13 @@ switch(action) if("siphon") if(is_station_level(src.z) || is_centcom_level(src.z)) - say("Siphon of station credits has begun!") + say("Siphon of station [MONEY_NAME] has begun!") start_siphon(ui.user) else say("Error: Console not in reach of station, withdrawal cannot begin.") . = TRUE if("halt") - say("Station credit withdrawal halted.") + say("Station [MONEY_NAME_SINGULAR] withdrawal halted.") end_siphon() . = TRUE diff --git a/code/game/machinery/barsigns.dm b/code/game/machinery/barsigns.dm index 2b1b6fc4b852..cabbc744c134 100644 --- a/code/game/machinery/barsigns.dm +++ b/code/game/machinery/barsigns.dm @@ -30,7 +30,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) //Roundstart/map specific barsigns "belong" in their area and should be renaming it, signs created from wallmounts will not. change_area_name = mapload set_sign(new /datum/barsign/hiddensigns/signoff) - find_and_hang_on_wall() + if(mapload) + find_and_mount_on_atom() /obj/machinery/barsign/proc/set_sign(datum/barsign/sign) if(!istype(sign)) diff --git a/code/game/machinery/botlaunchpad.dm b/code/game/machinery/botlaunchpad.dm index e044bb1e2968..9cd9c647accf 100644 --- a/code/game/machinery/botlaunchpad.dm +++ b/code/game/machinery/botlaunchpad.dm @@ -48,7 +48,7 @@ launched_bot = WEAKREF(possible_bot) podspawn(list( "target" = get_turf(src), - "path" = /obj/structure/closet/supplypod/botpod, + "path" = /obj/structure/closet/supplypod/transport/botpod, "style" = /datum/pod_style/seethrough, "reverse_dropoff_coords" = list(reverse_turf.x, reverse_turf.y, reverse_turf.z) )) @@ -66,15 +66,6 @@ var/mob/living/simple_animal/bot/simple_bot = our_bot simple_bot.call_bot(src, get_turf(src)) -/obj/structure/closet/supplypod/botpod - style = /datum/pod_style/seethrough - explosionSize = list(0,0,0,0) - reversing = TRUE +/obj/structure/closet/supplypod/transport/botpod reverse_option_list = list("Mobs"=TRUE,"Objects"=FALSE,"Anchored"=FALSE,"Underfloor"=FALSE,"Wallmounted"=FALSE,"Floors"=FALSE,"Walls"=FALSE,"Mecha"=FALSE) - delays = list(POD_TRANSIT = 0, POD_FALLING = 0, POD_OPENING = 0, POD_LEAVING = 0) - reverse_delays = list(POD_TRANSIT = 15, POD_FALLING = 10, POD_OPENING = 0, POD_LEAVING = 0) - custom_rev_delay = TRUE - effectQuiet = TRUE leavingSound = 'sound/vehicles/rocketlaunch.ogg' - close_sound = null - pod_flags = FIRST_SOUNDS diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index e1ae2b9c4415..c0a7ef8278c4 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -44,16 +44,12 @@ * INITIALIZATION */ -/obj/machinery/button/Initialize(mapload, ndir = 0, built = 0) +/obj/machinery/button/Initialize(mapload) . = ..() - if(built) - setDir(ndir) + if(!mapload) set_panel_open(TRUE) update_appearance() - if(!built && !device && device_type) - device = new device_type(src) - check_access(null) if(length(req_access) || length(req_one_access)) @@ -64,8 +60,9 @@ board.one_access = 1 board.accesses = req_one_access - setup_device() - find_and_hang_on_wall() + setup_device(mapload) + if(mapload) + find_and_mount_on_atom() register_context() /obj/machinery/button/Destroy() @@ -73,7 +70,9 @@ QDEL_NULL(board) return ..() -/obj/machinery/button/proc/setup_device() +/obj/machinery/button/proc/setup_device(mapload) + if(mapload && !device && device_type) + device = new device_type(src) if(id && istype(device, /obj/item/assembly/control)) var/obj/item/assembly/control/control_device = device control_device.id = id @@ -401,17 +400,17 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/button/door, 24) /obj/machinery/button/door/indestructible resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF -/obj/machinery/button/door/setup_device() - if(!device) - if(normaldoorcontrol) - var/obj/item/assembly/control/airlock/airlock_device = new(src) - airlock_device.specialfunctions = specialfunctions - device = airlock_device - else - var/obj/item/assembly/control/control_device = new(src) - control_device.sync_doors = sync_doors - device = control_device - ..() +/obj/machinery/button/door/setup_device(mapload) + if(mapload) + device = normaldoorcontrol ? new /obj/item/assembly/control/airlock(src) : new /obj/item/assembly/control(src) + + if(istype(device, /obj/item/assembly/control/airlock)) + var/obj/item/assembly/control/airlock/airlock_device = device + airlock_device.specialfunctions = specialfunctions + else if(istype(device, /obj/item/assembly/control)) + var/obj/item/assembly/control/control_device = device + control_device.sync_doors = sync_doors + return ..() /obj/machinery/button/door/incinerator_vent_ordmix name = "combustion chamber vent control" @@ -499,10 +498,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/button/door, 24) device_type = /obj/item/assembly/control/curtain var/sync_doors = TRUE -/obj/machinery/button/curtain/setup_device() +/obj/machinery/button/curtain/setup_device(mapload) + . = ..() var/obj/item/assembly/control/curtain = device - curtain.sync_doors = sync_doors - return ..() + if(istype(curtain)) + curtain.sync_doors = sync_doors /obj/machinery/button/crematorium name = "crematorium igniter" @@ -523,3 +523,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/button/door, 24) result_path = /obj/machinery/button custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) pixel_shift = 24 + +/obj/item/wallframe/button/find_support_structure(atom/structure) + return istype(structure, /obj/structure/table) ? structure : ..() + +/obj/item/wallframe/button/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(istype(interacting_with, /obj/structure/table)) + return user.combat_mode ? ..() : NONE + return ..() diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index ac76ab76194e..a0146c341b77 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -1,3 +1,12 @@ +/// Active power use of a regular default camera +#define CAMERA_POWER_CONSUMPTION (BASE_MACHINE_ACTIVE_CONSUMPTION * 0.02) +/// Active power multiplier of the xray camera upgrade +#define XRAY_POWER_MOD (10) +/// Active power multiplier of the motion camera upgrade +#define MOTION_POWER_MOD (4) +/// Active power multiplier of the EMP camera upgrade +#define EMP_POWER_MOD (1.25) + /** * Camera assembly frame * Putting this on a wall will put a deconstructed camera machine on the wall. @@ -7,13 +16,13 @@ desc = "The basic construction for SecurEYE-Always-Watching-You cameras." // DARKPACK EDIT CHANGE icon = 'icons/obj/machines/camera.dmi' icon_state = "cameracase" - custom_materials = list( - /datum/material/iron = SMALL_MATERIAL_AMOUNT * 4, - /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2.5, - ) + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) result_path = /obj/machinery/camera/autoname/deconstructed wall_external = TRUE +/obj/item/wallframe/camera/find_support_structure(atom/structure) + return istype(structure, /obj/structure/window) ? structure : ..() + /obj/machinery/camera name = "security camera" desc = "It's used to monitor rooms." @@ -21,7 +30,7 @@ icon_state = "camera" base_icon_state = "camera" use_power = ACTIVE_POWER_USE - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.02 + active_power_usage = CAMERA_POWER_CONSUMPTION layer = WALL_OBJ_LAYER resistance_flags = FIRE_PROOF damage_deflection = 12 @@ -85,7 +94,7 @@ var/list/datum/weakref/localMotionTargets = list() var/detectTime = 0 - var/area/station/ai_monitored/area_motion = null + var/datum/motion_group/area_motion = null var/alarm_delay = 30 // Don't forget, there's another 3 seconds in queueAlarm() MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera, 0) @@ -103,22 +112,19 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) fire = 90 acid = 50 -/obj/machinery/camera/Initialize(mapload, ndir, building) +/obj/machinery/camera/Initialize(mapload) . = ..() - if(building) - setDir(ndir) - for(var/network_name in network) network -= network_name network += LOWER_TEXT(network_name) - GLOB.cameranet.cameras += src + SScameras.cameras += src myarea = get_room_area() if(camera_enabled) - GLOB.cameranet.addCamera(src) + SScameras.add_camera_to_chunk(src) LAZYADD(myarea.cameras, src) #ifdef MAP_TEST update_appearance() @@ -128,16 +134,18 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) else //this is handled by toggle_camera, so no need to update it twice. update_appearance() #endif - alarm_manager = new(src) - find_and_hang_on_wall(directional = TRUE, \ - custom_drop_callback = CALLBACK(src, PROC_REF(deconstruct), FALSE)) + if(mapload) + find_and_mount_on_atom(mark_for_late_init = TRUE) + +/obj/machinery/camera/get_turfs_to_mount_on() + return list(get_step(src, dir)) /obj/machinery/camera/Destroy(force) if(can_use()) toggle_cam(null, 0) //kick anyone viewing out and remove from the camera chunks - GLOB.cameranet.removeCamera(src) - GLOB.cameranet.cameras -= src + SScameras.remove_camera_from_chunk(src) + SScameras.cameras -= src cancelCameraAlarm() if(isarea(myarea)) LAZYREMOVE(myarea.cameras, src) @@ -181,8 +189,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) SIGNAL_HANDLER proximity_monitor = null -/obj/machinery/camera/proc/set_area_motion(area/A) - area_motion = A +/obj/machinery/camera/proc/set_area_motion(datum/motion_group/group) + area_motion = group create_prox_monitor() /obj/machinery/camera/examine(mob/user) @@ -222,11 +230,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) if(!prob(150 / severity)) return network = list() - GLOB.cameranet.removeCamera(src) + SScameras.remove_camera_from_chunk(src) set_machine_stat(machine_stat | EMPED) set_light(0) emped++ //Increase the number of consecutive EMP's update_appearance() + calculate_active_power() addtimer(CALLBACK(src, PROC_REF(post_emp_reset), emped, network), reset_time) for(var/mob/M as anything in GLOB.player_list) if (M.client?.eye == src) @@ -249,9 +258,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) set_machine_stat(machine_stat & ~EMPED) update_appearance() if(can_use()) - GLOB.cameranet.addCamera(src) + SScameras.add_camera_to_chunk(src) emped = 0 //Resets the consecutive EMP count addtimer(CALLBACK(src, PROC_REF(cancelCameraAlarm)), 10 SECONDS) + calculate_active_power() /obj/machinery/camera/attack_ai(mob/living/silicon/ai/user) if (!istype(user)) @@ -262,7 +272,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) /obj/machinery/camera/proc/setViewRange(num = 7) src.view_range = num - GLOB.cameranet.updateVisibility(src, 0) + SScameras.update_visibility(src) /obj/machinery/camera/proc/shock(mob/living/user) if(!istype(user)) @@ -339,7 +349,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) /obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = TRUE) camera_enabled = !camera_enabled if(can_use()) - GLOB.cameranet.addCamera(src) + SScameras.add_camera_to_chunk(src) if (isturf(loc)) myarea = get_area(src) LAZYADD(myarea.cameras, src) @@ -347,12 +357,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) myarea = null else set_light(0) - GLOB.cameranet.removeCamera(src) + SScameras.remove_camera_from_chunk(src) if (isarea(myarea)) LAZYREMOVE(myarea.cameras, src) // We are not guarenteed that the camera will be on a turf. account for that - var/turf/our_turf = get_turf(src) - GLOB.cameranet.updateChunk(our_turf.x, our_turf.y, our_turf.z) var/change_msg = "deactivates" if(camera_enabled) change_msg = "reactivates" @@ -368,6 +376,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) playsound(src, 'sound/items/tools/wirecutter.ogg', 100, TRUE) update_appearance() //update Initialize() if you remove this. + calculate_active_power() // now disconnect anyone using the camera //Apparently, this will disconnect anyone even if the camera was re-activated. @@ -392,6 +401,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) return FALSE return TRUE +/// Returns a list of turfs in this camera's view. +/// This includes turfs that are "obscured by darkness" from the camera's POV. /obj/machinery/camera/proc/can_see() var/list/see = null var/turf/pos = get_turf(src) @@ -400,26 +411,22 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) var/check_higher = directly_above && istransparentturf(directly_above) && (pos != get_highest_turf(pos)) if(isXRay()) - see = range(view_range, pos) + see = RANGE_TURFS(view_range, pos) else - see = get_hear(view_range, pos) + see = get_hear_turfs(view_range, pos) + if(check_lower || check_higher) // Haha datum var access KILL ME - for(var/turf/seen in see) + for(var/turf/seen as anything in see) if(check_lower) - var/turf/visible = seen - while(visible && istransparentturf(visible)) - var/turf/below = GET_TURF_BELOW(visible) - for(var/turf/adjacent in range(1, below)) - see += adjacent - see += adjacent.contents - visible = below + var/turf/below = GET_TURF_BELOW(seen) + while(below && istransparentturf(below)) + see += RANGE_TURFS(1, below) + below = GET_TURF_BELOW(below) if(check_higher) var/turf/above = GET_TURF_ABOVE(seen) while(above && istransparentturf(above)) - for(var/turf/adjacent in range(1, above)) - see += adjacent - see += adjacent.contents + see += RANGE_TURFS(1, above) above = GET_TURF_ABOVE(above) return see @@ -452,3 +459,19 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) ///Called when the camera stops being watched on a camera console. /obj/machinery/camera/proc/on_stop_watching() return + +/obj/machinery/camera/proc/calculate_active_power() + if(!can_use()) + active_power_usage = 0 + return + + var/xray_power_mod = (camera_upgrade_bitflags & CAMERA_UPGRADE_XRAY) && !malf_xray_firmware_present ? XRAY_POWER_MOD : 1 + var/motion_power_mod = (camera_upgrade_bitflags & CAMERA_UPGRADE_MOTION) ? MOTION_POWER_MOD : 1 + var/EMP_power_mod = (camera_upgrade_bitflags & CAMERA_UPGRADE_EMP_PROOF) && !malf_emp_firmware_present ? EMP_POWER_MOD : 1 + + active_power_usage = CAMERA_POWER_CONSUMPTION * xray_power_mod * motion_power_mod * EMP_power_mod + +#undef CAMERA_POWER_CONSUMPTION +#undef XRAY_POWER_MOD +#undef MOTION_POWER_MOD +#undef EMP_POWER_MOD diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index ba5e793d68ce..a9923b8117ec 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -1,7 +1,7 @@ /obj/machinery/camera/process() // motion camera event loop if(!isMotion()) - return PROCESS_KILL + return PROCESS_KILL // FIXME: This is never undone if the camera gets upgraded to a motion camera if(machine_stat & EMPED) return if (detectTime > 0) @@ -13,14 +13,14 @@ var/mob/target = targetref.resolve() if(QDELETED(target) || target.stat == DEAD || (!area_motion && !in_range(src, target))) //If not part of a monitored area and the camera is not in range or the target is dead - lostTargetRef(targetref) + lost_target(target) /obj/machinery/camera/proc/getTargetList() if(area_motion) - return area_motion.motionTargets + return area_motion.motion_targets return localMotionTargets -/obj/machinery/camera/proc/newTarget(mob/target) +/obj/machinery/camera/proc/new_target(mob/target) if(isAI(target)) return FALSE if (detectTime == 0) @@ -29,19 +29,17 @@ targets |= WEAKREF(target) return TRUE +/obj/machinery/camera/proc/lost_target(mob/target) + var/list/targets = getTargetList() + targets -= WEAKREF(target) + if (!length(targets)) + cancelAlarm() + /obj/machinery/camera/Destroy() localMotionTargets = null - if(area_motion) - LAZYREMOVE(area_motion.motioncameras, src) cancelAlarm() return ..() -/obj/machinery/camera/proc/lostTargetRef(datum/weakref/R) - var/list/targets = getTargetList() - targets -= R - if (targets.len == 0) - cancelAlarm() - /obj/machinery/camera/proc/cancelAlarm() if (detectTime == -1 && camera_enabled) alarm_manager.clear_alarm(ALARM_MOTION) @@ -61,7 +59,7 @@ // Motion cameras outside of an "ai monitored" area will use this to detect stuff. if (!area_motion) if(isliving(AM)) - newTarget(AM) + new_target(AM) /obj/machinery/camera/motion/thunderdome name = "entertainment camera" diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index a8e20505387b..45ec252b98df 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -149,23 +149,26 @@ /obj/machinery/camera/proc/upgradeEmpProof(malf_upgrade, ignore_malf_upgrades) if(isEmpProof(ignore_malf_upgrades)) //pass a malf upgrade to ignore_malf_upgrades so we can replace the malf module with the normal one return //that way if someone tries to upgrade an already malf-upgraded camera, it'll just upgrade it to a normal version. - AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) if(malf_upgrade) malf_emp_firmware_active = TRUE //don't add parts to drop, update icon, ect. reconstructing it will also retain the upgrade. malf_emp_firmware_present = TRUE //so the upgrade is retained after incompatible parts are removed. + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL|EMP_NO_EXAMINE) else if(!emp_module) //only happens via upgrading in camera/attackby() emp_module = new(src) - if(malf_emp_firmware_active) - malf_emp_firmware_active = FALSE //make it appear like it's just normally upgraded so the icons and examine texts are restored. + malf_emp_firmware_active = FALSE //make it appear like it's just normally upgraded so the icons and examine texts are restored. + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) camera_upgrade_bitflags |= CAMERA_UPGRADE_EMP_PROOF + calculate_active_power() /obj/machinery/camera/proc/removeEmpProof(ignore_malf_upgrades) if(ignore_malf_upgrades) //don't downgrade it if malf software is forced onto it. return RemoveElement(/datum/element/empprotection, EMP_PROTECT_ALL) + RemoveElement(/datum/element/empprotection, EMP_PROTECT_ALL|EMP_NO_EXAMINE) camera_upgrade_bitflags &= ~CAMERA_UPGRADE_EMP_PROOF + calculate_active_power() /obj/machinery/camera/proc/isXRay(ignore_malf_upgrades) return (camera_upgrade_bitflags & CAMERA_UPGRADE_XRAY) && (!(ignore_malf_upgrades && malf_xray_firmware_active)) @@ -184,11 +187,14 @@ camera_upgrade_bitflags |= CAMERA_UPGRADE_XRAY update_appearance() + SScameras.update_visibility(src) + calculate_active_power() /obj/machinery/camera/proc/removeXRay(ignore_malf_upgrades) if(!ignore_malf_upgrades) //don't downgrade it if malf software is forced onto it. camera_upgrade_bitflags &= ~CAMERA_UPGRADE_XRAY update_appearance() + calculate_active_power() /obj/machinery/camera/proc/isMotion() return camera_upgrade_bitflags & CAMERA_UPGRADE_MOTION @@ -203,6 +209,7 @@ proximity_monitor = new(src) camera_upgrade_bitflags |= CAMERA_UPGRADE_MOTION create_prox_monitor() + calculate_active_power() /obj/machinery/camera/proc/removeMotion() if(name == "motion-sensitive security camera") @@ -210,3 +217,4 @@ camera_upgrade_bitflags &= ~CAMERA_UPGRADE_MOTION if(!area_motion) QDEL_NULL(proximity_monitor) + calculate_active_power() diff --git a/code/game/machinery/camera/silicon_camera.dm b/code/game/machinery/camera/silicon_camera.dm index 62f591711346..d573c59f6320 100644 --- a/code/game/machinery/camera/silicon_camera.dm +++ b/code/game/machinery/camera/silicon_camera.dm @@ -33,6 +33,7 @@ ///The alert given to silicons being watched. /atom/movable/screen/alert/being_recorded - icon_state = "recording" name = "Recorded" desc = "Someone is currently watching your internal camera through a camera console." + use_user_hud_icon = TRUE + overlay_state = "recording" diff --git a/code/game/machinery/civilian_bounties.dm b/code/game/machinery/civilian_bounties.dm index 0b24fb8ebe10..9f2254a28ce7 100644 --- a/code/game/machinery/civilian_bounties.dm +++ b/code/game/machinery/civilian_bounties.dm @@ -336,9 +336,9 @@ /obj/item/bounty_cube/examine() . = ..() if(speed_bonus) - . += span_notice("[time2text(next_nag_time - world.time,"mm:ss", NO_TIMEZONE)] remains until [bounty_value * speed_bonus] credit speedy delivery bonus lost.") + . += span_notice("[time2text(next_nag_time - world.time,"mm:ss", NO_TIMEZONE)] remains until [bounty_value * speed_bonus] [MONEY_NAME_SINGULAR] speedy delivery bonus lost.") if(handler_tip && !bounty_handler_account) - . += span_notice("Scan this in the cargo shuttle with an export scanner to register your bank account for the [bounty_value * handler_tip] credit handling tip.") + . += span_notice("Scan this in the cargo shuttle with an export scanner to register your bank account for the [bounty_value * handler_tip] [MONEY_NAME_SINGULAR] handling tip.") /obj/item/bounty_cube/process(seconds_per_tick) //if our nag cooldown has finished and we aren't on Centcom or in transit, then nag @@ -347,7 +347,7 @@ var/nag_message = "[src] is unsent in [get_area(src)]." //nag on Supply channel and reduce the speed bonus multiplier to nothing - var/obj/machinery/announcement_system/aas = get_announcement_system(/datum/aas_config_entry/bounty_cube_unsent, src) + var/obj/machinery/announcement_system/aas = get_announcement_system(/datum/aas_config_entry/bounty_cube_unsent, src, list(RADIO_CHANNEL_SUPPLY)) if (aas) nag_message = aas.compile_config_message(/datum/aas_config_entry/bounty_cube_unsent, list("LOCATION" = get_area_name(src), "COST" = bounty_value), "Regular Message") if (speed_bonus) @@ -372,7 +372,7 @@ bounty_holder = holder_id.registered_name bounty_holder_job = holder_id.assignment bounty_holder_account = holder_id.registered_account - name = "\improper [bounty_value] cr [name]" + name = "\improper [bounty_value] [MONEY_SYMBOL] [name]" desc += " The sales tag indicates it was [bounty_holder] ([bounty_holder_job])'s reward for completing the [bounty_name] bounty." AddComponent(/datum/component/pricetag, holder_id.registered_account, holder_cut, FALSE) AddComponent(/datum/component/gps, "[src]") diff --git a/code/game/machinery/computer/accounting.dm b/code/game/machinery/computer/accounting.dm index 75a890d382ac..878c450e8194 100644 --- a/code/game/machinery/computer/accounting.dm +++ b/code/game/machinery/computer/accounting.dm @@ -71,7 +71,7 @@ bank_account.payday_modifier = clamp(round(text2num(params["pay_mod"]), 0.05), MIN_PAY_MOD, MAX_PAY_MOD) var/new_check_total = bank_account.payday_modifier * bank_account.account_job.paycheck var/raise_or_cut = new_check_total > old_modifier * bank_account.account_job.paycheck ? "raised" : "cut" - bank_account.bank_card_talk("Paycheck [raise_or_cut] to [new_check_total]cr.") + bank_account.bank_card_talk("Paycheck [raise_or_cut] to [new_check_total][MONEY_SYMBOL].") SSeconomy.add_audit_entry(bank_account, new_check_total, "Paycheck [raise_or_cut]") return TRUE diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 6c6b41da72c5..dd76cd1efb71 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -68,9 +68,9 @@ say("Not enough energy. Restoration cancelled.") return FALSE 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) + need_mob_update += occupier.adjust_oxy_loss(-5, updating_health = FALSE) + need_mob_update += occupier.adjust_fire_loss(-5, updating_health = FALSE) + need_mob_update += occupier.adjust_brute_loss(-5, updating_health = FALSE) if(need_mob_update) occupier.updatehealth() if(occupier.health >= 0 && occupier.stat == DEAD) diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 892113713617..6c56f6e2aa60 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -102,7 +102,7 @@ */ /obj/machinery/computer/apc_control/proc/check_apc(obj/machinery/power/apc/checked_apc) - return (is_on_station ? is_station_level(checked_apc.z) : checked_apc.z == z) && !checked_apc.malfhack && !checked_apc.aidisabled && !(checked_apc.obj_flags & EMAGGED) && !checked_apc.machine_stat && !istype(checked_apc.area, /area/station/ai_monitored) + return (is_on_station ? is_station_level(checked_apc.z) : checked_apc.z == z) && !checked_apc.malfhack && !checked_apc.aidisabled && !(checked_apc.obj_flags & EMAGGED) && !checked_apc.machine_stat && !istype(checked_apc.area, /area/station/ai) /obj/machinery/computer/apc_control/ui_interact(mob/user, datum/tgui/ui) . = ..() diff --git a/code/game/machinery/computer/arcade/orion.dm b/code/game/machinery/computer/arcade/orion.dm index 6c2945cb1260..ce26a9b50fbe 100644 --- a/code/game/machinery/computer/arcade/orion.dm +++ b/code/game/machinery/computer/arcade/orion.dm @@ -546,7 +546,7 @@ /datum/aas_config_entry/orion_violent_behavior_alert // Well we don't want to show that only Orion Trails reports violent behavior, eh-h? - name = "Violent Behavior Alert" + name = "Global: Violent Behavior Alert" announcement_lines_map = list( RADIO_CHANNEL_SECURITY = "SECURITY ALERT: Crewmember %PERSON recorded displaying antisocial tendencies in %LOCATION by %SOURCE. Please watch for violent behavior.", RADIO_CHANNEL_MEDICAL = "PSYCH ALERT: Crewmember %PERSON recorded displaying antisocial tendencies in %LOCATION by %SOURCE. Please schedule psych evaluation.", diff --git a/code/game/machinery/computer/atmos_computers/_air_sensor.dm b/code/game/machinery/computer/atmos_computers/_air_sensor.dm index ad870c9520b7..bb40f34fcf6c 100644 --- a/code/game/machinery/computer/atmos_computers/_air_sensor.dm +++ b/code/game/machinery/computer/atmos_computers/_air_sensor.dm @@ -167,7 +167,7 @@ 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) + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT + SMALL_MATERIAL_AMOUNT * 0.3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.2) /obj/item/air_sensor/Initialize(mapload, inlet, outlet) . = ..() diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 5dd9ec491279..d5f6b8210069 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -8,7 +8,7 @@ /obj/structure/frame/computer/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) register_context() /obj/structure/frame/computer/atom_deconstruct(disassembled = TRUE) @@ -106,9 +106,6 @@ if(state != FRAME_COMPUTER_STATE_EMPTY) balloon_alert(user, "circuit already installed!") return FALSE - if(!anchored && istype(board)) - balloon_alert(user, "frame must be anchored!") - return FALSE . = ..() if(. && !by_hand) // Installing via RPED auto-secures it state = FRAME_COMPUTER_STATE_BOARD_SECURED @@ -194,8 +191,6 @@ if(FRAME_COMPUTER_STATE_GLASSED) if(finalize_construction(user, tool)) return ITEM_INTERACT_SUCCESS - - balloon_alert(user, "missing components!") return ITEM_INTERACT_BLOCKING /obj/structure/frame/computer/crowbar_act(mob/living/user, obj/item/tool) @@ -295,6 +290,10 @@ return TRUE /obj/structure/frame/computer/finalize_construction(mob/living/user, obj/item/tool) + if(!anchored) + balloon_alert(user, "frame must be anchored!") + return FALSE + tool.play_tool_sound(src) var/obj/machinery/new_machine = new circuit.build_path(loc) new_machine.balloon_alert(user, "monitor connected") diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 8725bda22f5e..f33cff0c7ea0 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -89,7 +89,7 @@ var/list/data = list() data["network"] = network data["mapRef"] = cam_screen.assigned_map - data["cameras"] = GLOB.cameranet.get_available_cameras_data(network) + data["cameras"] = SScameras.get_available_cameras_data(network) return data /obj/machinery/computer/security/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) @@ -99,7 +99,7 @@ if(action == "switch_camera") active_camera?.on_stop_watching(src) - var/obj/machinery/camera/selected_camera = locate(params["camera"]) in GLOB.cameranet.cameras + var/obj/machinery/camera/selected_camera = locate(params["camera"]) in SScameras.cameras active_camera = selected_camera if(isnull(active_camera)) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index bb034b1a3220..42188e251a26 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -55,9 +55,10 @@ actions += new move_down_action(src) if(add_usb_port) AddComponent(/datum/component/usb_port, \ - list( + typecacheof(list( /obj/item/circuit_component/advanced_camera, /obj/item/circuit_component/advanced_camera_intercept, + ), \ ), \ extra_registration_callback = PROC_REF(register_usb_port), \ extra_unregistration_callback = PROC_REF(unregister_usb_port) \ @@ -183,10 +184,10 @@ else camera_location = myturf else - if((!consider_zlock || (myturf.z in z_lock)) && GLOB.cameranet.checkTurfVis(myturf)) + if((!consider_zlock || (myturf.z in z_lock)) && SScameras.is_visible_by_cameras(myturf)) camera_location = myturf else - for(var/obj/machinery/camera/C as anything in GLOB.cameranet.cameras) + for(var/obj/machinery/camera/C as anything in SScameras.cameras) if(!C.can_use() || consider_zlock && !(C.z in z_lock)) continue var/list/network_overlap = networks & C.network @@ -229,7 +230,7 @@ var/mob/eye/camera/remote/remote_eye = owner.remote_control var/obj/machinery/computer/camera_advanced/origin = remote_eye.origin_ref.resolve() - var/list/cameras_by_tag = GLOB.cameranet.get_available_camera_by_tag_list(origin.networks, origin.z_lock) + var/list/cameras_by_tag = SScameras.get_available_camera_by_tag_list(origin.networks, origin.z_lock) playsound(origin, 'sound/machines/terminal/terminal_prompt.ogg', 25, FALSE) var/camera = tgui_input_list(usr, "Camera to view", "Cameras", cameras_by_tag) @@ -403,7 +404,7 @@ var/turf/eye_turf = get_turf(source) if(!eye_turf) return - if(!GLOB.cameranet.checkTurfVis(eye_turf)) + if(!SScameras.is_visible_by_cameras(eye_turf)) return eye_x.set_output(source.x) eye_y.set_output(source.y) @@ -490,7 +491,7 @@ var/turf/target_turf = get_turf(target) if(!target_turf) return - if(!GLOB.cameranet.checkTurfVis(target_turf)) + if(!SScameras.is_visible_by_cameras(target_turf)) return if(TIMER_COOLDOWN_RUNNING(parent.shell, COOLDOWN_CIRCUIT_TARGET_INTERCEPT)) return diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index ca41ef3e4bb2..69a4ccc765f8 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -261,7 +261,7 @@ if (can_buy_shuttles_or_fail_reason != FALSE) to_chat(user, span_alert("[can_buy_shuttles_or_fail_reason]")) return - var/list/shuttles = flatten_list(SSmapping.shuttle_templates) + var/list/shuttles = assoc_to_values(SSmapping.shuttle_templates) var/datum/map_template/shuttle/shuttle = locate(params["shuttle"]) in shuttles if (!istype(shuttle)) return @@ -282,7 +282,7 @@ bank_account.adjust_money(-shuttle.credit_cost) var/purchaser_name = (obj_flags & EMAGGED) ? scramble_message_replace_chars("AUTHENTICATION FAILURE: CVE-2018-17107", 60) : user.real_name - minor_announce("[purchaser_name] has purchased [shuttle.name] for [shuttle.credit_cost] credits.[shuttle.extra_desc ? " [shuttle.extra_desc]" : ""]" , "Shuttle Purchase") + minor_announce("[purchaser_name] has purchased [shuttle.name] for [shuttle.credit_cost] [MONEY_NAME].[shuttle.extra_desc ? " [shuttle.extra_desc]" : ""]" , "Shuttle Purchase") message_admins("[ADMIN_LOOKUPFLW(user)] purchased [shuttle.name].") log_shuttle("[key_name(user)] has purchased [shuttle.name].") diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 61965fe25aa0..e8f700fd966c 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -13,9 +13,7 @@ /obj/machinery/computer/crew/Initialize(mapload, obj/item/circuitboard/C) . = ..() - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/medical_console_data, - )) + AddComponent(/datum/component/usb_port, typecacheof(list(/obj/item/circuit_component/medical_console_data), only_root_path = TRUE)) /obj/item/circuit_component/medical_console_data display_name = "Crew Monitoring Data" @@ -258,16 +256,19 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) continue // Current status - if (sensor_mode >= SENSOR_LIVING) + if (sensor_mode >= SENSOR_VITALS) entry["life_status"] = tracked_living_mob.stat + else if (sensor_mode == SENSOR_LIVING) + // binary sensors should only report alive or dead + entry["life_status"] = (tracked_living_mob.stat == DEAD) ? DEAD : CONSCIOUS // Damage if (sensor_mode >= SENSOR_VITALS) entry += list( - "oxydam" = round(tracked_living_mob.getOxyLoss(), 1), - "toxdam" = round(tracked_living_mob.getToxLoss(), 1), - "burndam" = round(tracked_living_mob.getFireLoss(), 1), - "brutedam" = round(tracked_living_mob.getBruteLoss(), 1), + "oxydam" = round(tracked_living_mob.get_oxy_loss(), 1), + "toxdam" = round(tracked_living_mob.get_tox_loss(), 1), + "burndam" = round(tracked_living_mob.get_fire_loss(), 1), + "brutedam" = round(tracked_living_mob.get_brute_loss(), 1), "health" = round(tracked_living_mob.health, 1), ) diff --git a/code/game/machinery/computer/launchpad_control.dm b/code/game/machinery/computer/launchpad_control.dm index 1502e5af5062..dcbd6499ec7f 100644 --- a/code/game/machinery/computer/launchpad_control.dm +++ b/code/game/machinery/computer/launchpad_control.dm @@ -12,9 +12,7 @@ /obj/machinery/computer/launchpad/Initialize(mapload) launchpads = list() . = ..() - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/bluespace_launchpad/console, - )) + AddComponent(/datum/component/usb_port, typecacheof(list(/obj/item/circuit_component/bluespace_launchpad/console), only_root_path = TRUE)) /obj/item/circuit_component/bluespace_launchpad/console display_name = "Bluespace Launchpad Console" diff --git a/code/game/machinery/computer/operating_computer.dm b/code/game/machinery/computer/operating_computer.dm index 0c7498888a6d..e31d028d95f1 100644 --- a/code/game/machinery/computer/operating_computer.dm +++ b/code/game/machinery/computer/operating_computer.dm @@ -9,12 +9,21 @@ circuit = /obj/item/circuitboard/computer/operating interaction_flags_machine = parent_type::interaction_flags_machine | INTERACT_MACHINE_REQUIRES_STANDING + light_color = LIGHT_COLOR_GREEN + + /// Linked operating table, if any var/obj/structure/table/optable/table + /// List if surgery typepaths available on this computer var/list/advanced_surgeries = list() + /// Techweb linked to this operating computer var/datum/techweb/linked_techweb - light_color = LIGHT_COLOR_BLUE - + /// Currently selected body zone for surgery + var/target_zone = BODY_ZONE_CHEST + /// Experiment handler component reference var/datum/component/experiment_handler/experiment_handler + /// Lazyassoclist of mob weakrefs to the zone they had selected when opening the UI + /// When closing the UI we try to revert their zone selector to that zone + var/list/datum/weakref/zone_on_open /obj/machinery/computer/operating/Initialize(mapload) . = ..() @@ -26,6 +35,14 @@ if(!CONFIG_GET(flag/no_default_techweb_link) && !linked_techweb) CONNECT_TO_RND_SERVER_ROUNDSTART(linked_techweb, src) + if(linked_techweb) + RegisterSignal(linked_techweb, COMSIG_TECHWEB_ADD_DESIGN, PROC_REF(on_techweb_research)) + RegisterSignal(linked_techweb, COMSIG_TECHWEB_REMOVE_DESIGN, PROC_REF(on_techweb_unresearch)) + RegisterSignal(linked_techweb, COMSIG_TECHWEB_EXPERIMENT_COMPLETED, PROC_REF(update_static_data_batched)) + + for(var/datum/design/surgery/design in linked_techweb.get_researched_design_datums()) + advanced_surgeries |= design.surgery + var/list/operating_signals = list( COMSIG_OPERATING_COMPUTER_AUTOPSY_COMPLETE = TYPE_PROC_REF(/datum/component/experiment_handler, try_run_autopsy_experiment), ) @@ -50,25 +67,30 @@ linked_techweb = tool.buffer return TRUE -/obj/machinery/computer/operating/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) - if(istype(O, /obj/item/disk/surgery)) - user.visible_message(span_notice("[user] begins to load \the [O] in \the [src]..."), \ - span_notice("You begin to load a surgery protocol from \the [O]..."), \ - span_hear("You hear the chatter of a floppy drive.")) - var/obj/item/disk/surgery/D = O - if(do_after(user, 1 SECONDS, target = src)) - advanced_surgeries |= D.surgeries - return TRUE - return ..() +/obj/machinery/computer/operating/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/disk/surgery)) + user.visible_message( + span_notice("[user] begins to load [tool] in [src]..."), + span_notice("You begin to load a surgery protocol from [tool]..."), + span_hear("You hear the chatter of a floppy drive."), + ) + var/obj/item/disk/surgery/disky = tool + if(!do_after(user, 1 SECONDS, src)) + return ITEM_INTERACT_BLOCKING + advanced_surgeries |= disky.surgeries + update_static_data_for_all_viewers() + playsound(src, 'sound/machines/compiler/compiler-stage2.ogg', 50, FALSE, SILENCED_SOUND_EXTRARANGE) + balloon_alert(user, "surgeries loaded") + return ITEM_INTERACT_SUCCESS -/obj/machinery/computer/operating/proc/sync_surgeries() - if(!linked_techweb) - return - for(var/i in linked_techweb.researched_designs) - var/datum/design/surgery/D = SSresearch.techweb_design_by_id(i) - if(!istype(D)) - continue - advanced_surgeries |= D.surgery + if((tool.item_flags & SURGICAL_TOOL) && !user.combat_mode) + ui_interact(user) + return ITEM_INTERACT_SUCCESS + + return NONE + +/obj/machinery/computer/operating/on_set_is_operational(old_value) + update_static_data_for_all_viewers() /obj/machinery/computer/operating/proc/find_table() for(var/direction in GLOB.alldirs) @@ -77,36 +99,74 @@ table.computer = src break -/obj/machinery/computer/operating/ui_state(mob/user) - return GLOB.standing_state +/obj/machinery/computer/operating/ui_status(mob/user, datum/ui_state/state) + . = ..() + if(isliving(user)) + . = min(., ui_check(user)) + +/// Checks for special ui state conditions +/obj/machinery/computer/operating/proc/ui_check(mob/living/user) + // lower states should be checked first + + // normally machines revert to "disabled" when non-operational, + // but here we outright close it so people can't gleam extra info + if(!is_operational) + return UI_CLOSE + // if you're knocked out, ie anesthetic... definitely a no-go + if(user.stat >= UNCONSCIOUS || HAS_TRAIT(user, TRAIT_KNOCKEDOUT)) + return UI_CLOSE + // the patient itself should be blocked from viewing the computer + if(user.body_position == LYING_DOWN) + return (user.loc == table?.loc) ? UI_CLOSE : UI_DISABLED + // we have a tight range check so people can't spy on surgeries from across the room + // likewise it'd be pretty lame if you could see what was going on while incapacitated + if(get_dist(user, src) > 2 || user.incapacitated) + return UI_DISABLED + + return UI_INTERACTIVE /obj/machinery/computer/operating/ui_interact(mob/user, datum/tgui/ui) . = ..() ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "OperatingComputer", name) - ui.open() + if(ui) + return + + if(ishuman(user)) + // if you are the first human to open the ui, it changes to your active zone + if(!LAZYLEN(zone_on_open)) + target_zone = user.zone_selected + // then we record what you were looking at for when you close it + LAZYSET(zone_on_open, WEAKREF(user), user.zone_selected) + + ui = new(user, src, "OperatingComputer", name) + ui.open() + +/obj/machinery/computer/operating/ui_close(mob/user) + . = ..() + // reverts zone to whatever you had going into it, typically chest, so you don't have to mess around with it + var/zone_found = LAZYACCESS(zone_on_open, WEAKREF(user)) + if(!zone_found) + return + + var/atom/movable/screen/zone_sel/selector = user.hud_used?.zone_select + selector?.set_selected_zone(zone_found, user, FALSE) + LAZYREMOVE(zone_on_open, WEAKREF(user)) + if(!LAZYLEN(zone_on_open)) + zone_on_open = initial(zone_on_open) + +/obj/machinery/computer/operating/ui_assets(mob/user) + . = ..() + . += get_asset_datum(/datum/asset/simple/body_zones) /obj/machinery/computer/operating/ui_data(mob/user) var/list/data = list() - var/list/all_surgeries = list() - for(var/datum/surgery/surgeries as anything in advanced_surgeries) - var/list/surgery = list() - surgery["name"] = initial(surgeries.name) - surgery["desc"] = initial(surgeries.desc) - all_surgeries += list(surgery) - data["surgeries"] = all_surgeries - - //If there's no patient just hop to it yeah? - if(!table) - data["patient"] = null + + data["has_table"] = !!table + data["target_zone"] = target_zone + if(isnull(table?.patient)) return data - data["table"] = table data["patient"] = list() - data["procedures"] = list() - if(!table.patient) - return data var/mob/living/carbon/patient = table.patient switch(patient.stat) @@ -114,7 +174,7 @@ data["patient"]["stat"] = "Conscious" data["patient"]["statstate"] = "good" if(SOFT_CRIT) - data["patient"]["stat"] = "Conscious" + data["patient"]["stat"] = "Critical Condition" data["patient"]["statstate"] = "average" if(UNCONSCIOUS, HARD_CRIT) data["patient"]["stat"] = "Unconscious" @@ -126,34 +186,84 @@ data["patient"]["blood_type"] = patient.get_bloodtype()?.name || "UNKNOWN" data["patient"]["maxHealth"] = patient.maxHealth data["patient"]["minHealth"] = HEALTH_THRESHOLD_DEAD - data["patient"]["bruteLoss"] = patient.getBruteLoss() - data["patient"]["fireLoss"] = patient.getFireLoss() - data["patient"]["toxLoss"] = patient.getToxLoss() - data["patient"]["oxyLoss"] = patient.getOxyLoss() - if(patient.surgeries.len) - for(var/datum/surgery/procedure in patient.surgeries) - var/datum/surgery_step/surgery_step = GLOB.surgery_steps[procedure.steps[procedure.status]] - var/chems_needed = surgery_step.get_chem_list() - var/alternative_step - var/alt_chems_needed = "" - var/alt_chems_present = FALSE - if(surgery_step.repeatable) - var/datum/surgery_step/next_step = procedure.get_surgery_next_step() - if(next_step) - alternative_step = capitalize(next_step.name) - alt_chems_needed = next_step.get_chem_list() - alt_chems_present = next_step.chem_check(patient) - else - alternative_step = "Finish operation" - data["procedures"] += list(list( - "name" = capitalize("[patient.parse_zone_with_bodypart(procedure.location)] [procedure.name]"), - "next_step" = capitalize(surgery_step.name), - "chems_needed" = chems_needed, - "alternative_step" = alternative_step, - "alt_chems_needed" = alt_chems_needed, - "chems_present" = surgery_step.chem_check(patient), - "alt_chems_present" = alt_chems_present + data["patient"]["bruteLoss"] = patient.get_brute_loss() + data["patient"]["fireLoss"] = patient.get_fire_loss() + data["patient"]["toxLoss"] = patient.get_tox_loss() + data["patient"]["oxyLoss"] = patient.get_oxy_loss() + data["patient"]["blood_level"] = patient.blood_volume + data["patient"]["standard_blood_level"] = BLOOD_VOLUME_NORMAL + data["patient"]["surgery_state"] = patient.get_surgery_state_as_list(deprecise_zone(target_zone)) + return data + +/obj/machinery/computer/operating/ui_static_data(mob/user) + var/list/data = list() + + data["experiments"] = list() + data["techwebs"] = list() + data["surgeries"] = list() + if(!is_operational) + return data + + if(linked_techweb) + data["techwebs"] += list(list( + "web_id" = linked_techweb.id, + "web_org" = linked_techweb.organization, + "selected" = TRUE, + "ref" = REF(linked_techweb), + "all_servers" = linked_techweb.techweb_servers, + )) + + for(var/datum/experiment/experiment as anything in linked_techweb.available_experiments) + if(istype(experiment, /datum/experiment/autopsy)) + data["experiments"] += list(experiment.to_ui_data()) + + var/list/operations = GLOB.operations.get_instances_from(GLOB.operations.unlocked | advanced_surgeries) + var/any_recommended = FALSE + for(var/datum/surgery_operation/operation as anything in operations) + var/recommend = FALSE + if(table?.patient && operation.show_as_next_step(table.patient, target_zone)) + recommend = TRUE + any_recommended = TRUE + + data["surgeries"] += list(list( + "name" = operation.rnd_name || operation.name, + "desc" = operation.rnd_desc || operation.desc, + "tool_rec" = operation.get_recommended_tool() || "error", + "requirements" = operation.get_requirements(), + "show_as_next" = recommend, + "show_in_list" = TRUE, + "priority" = operation.operation_flags & OPERATION_PRIORITY_NEXT_STEP, + "mechanic" = operation.operation_flags & OPERATION_MECHANIC, + )) + + if(!any_recommended && table?.patient) + var/obj/item/part = table.patient.get_bodypart(deprecise_zone(target_zone)) + var/just_drapes = FALSE + if(table.patient.has_limbs) + if(isnull(part)) + data["surgeries"] += list(list( + "name" = "Prepare for [/datum/surgery_operation/prosthetic_replacement::name]", + "desc" = "Prepare the patient's chest for prosthetic limb attachment.", + "tool_rec" = "operate on chest", + "show_as_next" = TRUE, + "show_in_list" = FALSE, + )) + + else if(!HAS_TRAIT(part, TRAIT_READY_TO_OPERATE)) + just_drapes = TRUE + + else if(!HAS_TRAIT(table.patient, TRAIT_READY_TO_OPERATE)) + just_drapes = TRUE + + if(just_drapes) + data["surgeries"] += list(list( + "name" = "Prepare for surgery", + "desc" = "Begin surgery by applying surgical drapes to the patient.", + "tool_rec" = /obj/item/surgical_drapes::name, + "show_as_next" = TRUE, + "show_in_list" = FALSE, )) + return data /obj/machinery/computer/operating/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) @@ -161,11 +271,39 @@ if(.) return switch(action) - if("sync") - sync_surgeries() if("open_experiments") experiment_handler.ui_interact(usr) + if("change_zone") + if(params["new_zone"] in (GLOB.all_body_zones + GLOB.all_precise_body_zones)) + target_zone = params["new_zone"] + var/atom/movable/screen/zone_sel/selector = ui.user.hud_used?.zone_select + selector?.set_selected_zone(params["new_zone"], ui.user, FALSE) + update_static_data_for_all_viewers() return TRUE +/obj/machinery/computer/operating/proc/on_techweb_research(datum/source, datum/design/surgery/design) + SIGNAL_HANDLER + + if(!istype(design)) + return + + advanced_surgeries |= design.surgery + update_static_data_batched() + +/obj/machinery/computer/operating/proc/on_techweb_unresearch(datum/source, datum/design/surgery/design) + SIGNAL_HANDLER + + if(!istype(design)) + return + + advanced_surgeries -= design.surgery + update_static_data_batched() + +/// Updates static data for all viewers after a miniscule delay (to batch multiple updates together) +/obj/machinery/computer/operating/proc/update_static_data_batched(...) + SIGNAL_HANDLER + + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum, update_static_data_for_all_viewers)), 0.1 SECONDS, TIMER_UNIQUE) + #undef MENU_OPERATION #undef MENU_SURGERIES 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 97e9e74b5ce1..f6df92dd4442 100644 --- a/code/game/machinery/computer/orders/order_computer/mining_order.dm +++ b/code/game/machinery/computer/orders/order_computer/mining_order.dm @@ -1,4 +1,4 @@ -#define CREDIT_TYPE_MINING "mp" + /obj/machinery/computer/order_console/mining name = "mining equipment order console" @@ -15,7 +15,7 @@ and hopefully get delivered by them. 35% cheaper than express delivery."} express_tooltip = @{"Sends your purchases instantly."} - credit_type = CREDIT_TYPE_MINING + credit_type = MONEY_MINING_SYMBOL order_categories = list( CATEGORY_MINING, @@ -94,6 +94,7 @@ name = "mining point transfer card" desc = "A small, reusable card for transferring mining points. Swipe your ID card over it to start the process." icon_state = "data_1" + slot_flags = NONE // DARKPACK EDIT ADD ///Amount of points this card contains. var/points = 0 @@ -127,6 +128,5 @@ points += amount to_chat(user, span_notice("You transfer [amount] mining points from [attacking_id] to [src].")) -#undef CREDIT_TYPE_MINING #undef TO_POINT_CARD #undef TO_USER_ID 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 a83b930eada4..d89dd05c4349 100644 --- a/code/game/machinery/computer/orders/order_computer/order_computer.dm +++ b/code/game/machinery/computer/orders/order_computer/order_computer.dm @@ -1,6 +1,5 @@ ///List of all items that can be found in the different types of order consoles, to purchase. GLOBAL_LIST_EMPTY(order_console_products) -#define CREDIT_TYPE_CREDIT "credit" /obj/machinery/computer/order_console name = "Orders Console" @@ -25,7 +24,7 @@ GLOBAL_LIST_EMPTY(order_console_products) var/announcement_line ///The kind of cash does the console use. - var/credit_type = CREDIT_TYPE_CREDIT + var/credit_type = MONEY_SYMBOL ///Whether the console can only use express mode ONLY var/forced_express = FALSE ///Multiplied cost to use for cargo mode @@ -235,7 +234,7 @@ GLOBAL_LIST_EMPTY(order_console_products) return /datum/aas_config_entry/order_console - name = "Local Ordering Console Announcements" + name = "Cargo Alert: Local Ordering Console Announcements" announcement_lines_map = list() general_tooltip = "Used to make announces, when consoles listed here placing new order" @@ -250,5 +249,3 @@ GLOBAL_LIST_EMPTY(order_console_products) announcement_lines_map["Error"] = "Unknown Error happened, while we tried to procceed an order, please report this to Nanotrasen." . = ..() - -#undef CREDIT_TYPE_CREDIT 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 41c52d9b0a0e..f9247d039ce7 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 @@ -38,10 +38,6 @@ purchase_path = /obj/item/clothing/gloves/fingerless/punch_mitts cost_per_order = 1000 -/datum/orderable_item/mining/crusher_retool_kit - purchase_path = /obj/item/crusher_trophy/retool_kit - cost_per_order = 150 - /datum/orderable_item/mining/resonator purchase_path = /obj/item/resonator cost_per_order = 710 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 65bbee24ead6..c253b8d51bac 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 @@ -34,6 +34,6 @@ cost_per_order = 525 /datum/orderable_item/toys_drones/drone_sentience - purchase_path = /obj/item/slimepotion/slime/sentience/mining + purchase_path = /obj/item/slimepotion/sentience/mining cost_per_order = 850 diff --git a/code/game/machinery/computer/records/medical.dm b/code/game/machinery/computer/records/medical.dm index 9bc1bcdbc26a..8e80223c1725 100644 --- a/code/game/machinery/computer/records/medical.dm +++ b/code/game/machinery/computer/records/medical.dm @@ -66,6 +66,7 @@ rank = target.rank, species = target.species, trim = target.trim, + past_medical_records = target.past_medical_records, // DARKPACK EDIT - FLAVOR TEXT )) data["records"] = records diff --git a/code/game/machinery/computer/records/security.dm b/code/game/machinery/computer/records/security.dm index 9bda57e15d38..41afa732ebba 100644 --- a/code/game/machinery/computer/records/security.dm +++ b/code/game/machinery/computer/records/security.dm @@ -35,10 +35,12 @@ /obj/machinery/computer/records/security/Initialize(mapload, obj/item/circuitboard/C) . = ..() - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/arrest_console_data, - /obj/item/circuit_component/arrest_console_arrest, - )) + AddComponent(/datum/component/usb_port, \ + typecacheof(list( + /obj/item/circuit_component/arrest_console_data, + /obj/item/circuit_component/arrest_console_arrest, + ), only_root_path = TRUE) \ + ) /obj/machinery/computer/records/security/emp_act(severity) . = ..() @@ -130,6 +132,7 @@ species = target.species, trim = target.trim, wanted_status = target.wanted_status, + past_criminal_records = target.past_criminal_records, // DARKPACK EDIT - FLAVOR TEXT )) data["records"] = records @@ -209,7 +212,7 @@ var/max = CONFIG_GET(number/maxfine) if(params["fine"] > max) - to_chat(usr, span_warning("The maximum fine is [max] credits.")) + to_chat(usr, span_warning("The maximum fine is [max] [MONEY_NAME].")) playsound(src, 'sound/machines/terminal/terminal_error.ogg', 75, TRUE) return FALSE @@ -231,7 +234,7 @@ var/datum/crime/citation/new_citation = new(name = input_name, details = input_details, author = usr, fine = params["fine"]) target.citations += new_citation - new_citation.alert_owner(user, src, target.name, "You have been issued a [params["fine"]]cr citation for [input_name]. Fines are payable at Security.") + new_citation.alert_owner(user, src, target.name, "You have been issued a [params["fine"]][MONEY_SYMBOL] citation for [input_name]. Fines are payable at Security.") investigate_log("New Citation: [input_name] Fine: [params["fine"]] | Added to [target.name] by [key_name(user)]", INVESTIGATE_RECORDS) SSblackbox.ReportCitation(REF(new_citation), user.ckey, user.real_name, target.name, input_name, input_details, params["fine"]) diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index b879669317b4..f102f185ffcf 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -8,19 +8,18 @@ /// Station alert datum for showing alerts UI var/datum/station_alert/alert_control -/obj/machinery/computer/station_alert/examine(mob/user) - . = ..() - var/obj/item/circuitboard/computer/station_alert/my_circuit = circuit - . += span_info("The console is set to [my_circuit.station_only ? "track all station and mining alarms" : "track alarms on the same z-level"].") - /obj/machinery/computer/station_alert/Initialize(mapload) - link_alerts() + if(is_station_level(z)) + var/static/list/alert_areas + if(isnull(alert_areas)) + alert_areas = (GLOB.the_station_areas + typesof(/area/mine)) + alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER), SSmapping.levels_by_trait(ZTRAIT_STATION), alert_areas) + else + name = "local alert console" + alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER), list(z), title = name) + RegisterSignals(alert_control.listener, list(COMSIG_ALARM_LISTENER_TRIGGERED, COMSIG_ALARM_LISTENER_CLEARED), PROC_REF(update_alarm_display)) return ..() -/obj/machinery/computer/station_alert/on_construction(mob/user) - . = ..() - link_alerts() - /obj/machinery/computer/station_alert/Destroy() QDEL_NULL(alert_control) return ..() @@ -42,26 +41,6 @@ if(length(alert_control.listener.alarms)) . += "alert:2" -/** - * Clears out any active alert_control listeners, then sets up a new one based on the circuit settings - */ -/obj/machinery/computer/station_alert/proc/link_alerts() - //Start from scratch, clear out the existing alert listeners - QDEL_NULL(alert_control) - - //Then we check the circuit to determine if it should show alarms from Station & Mining areas, - //or Local (z-level) areas - var/obj/item/circuitboard/computer/station_alert/my_circuit = circuit - if(my_circuit.station_only) - name = "station alert console" - var/list/alert_areas - alert_areas = (GLOB.the_station_areas + typesof(/area/mine)) - alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER), listener_areas = alert_areas, title = name) - else - name = "local alert console" - alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER), list(z), title = name) - RegisterSignals(alert_control.listener, list(COMSIG_ALARM_LISTENER_TRIGGERED, COMSIG_ALARM_LISTENER_CLEARED), PROC_REF(update_alarm_display)) - /** * Signal handler for calling an icon update in case an alarm is added or cleared * @@ -71,7 +50,3 @@ /obj/machinery/computer/station_alert/proc/update_alarm_display(datum/source) SIGNAL_HANDLER update_icon() - -// Subtype which only checks station areas and the mining station -/obj/machinery/computer/station_alert/station_only - circuit = /obj/item/circuitboard/computer/station_alert/station_only diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index 7e34dae70257..b17589bb4bac 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -24,9 +24,7 @@ id = "[rand(1000, 9999)]" link_power_station() - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/teleporter_control_console, - )) + AddComponent(/datum/component/usb_port, typecacheof(list(/obj/item/circuit_component/teleporter_control_console), only_root_path = TRUE)) /obj/machinery/computer/teleporter/Destroy() if (power_station) diff --git a/code/game/machinery/computer/telescreen.dm b/code/game/machinery/computer/telescreen.dm index 12bafc3f73ec..6f5f335a54d0 100644 --- a/code/game/machinery/computer/telescreen.dm +++ b/code/game/machinery/computer/telescreen.dm @@ -14,6 +14,11 @@ var/frame_type = /obj/item/wallframe/telescreen projectiles_pass_chance = 100 +/obj/machinery/computer/security/telescreen/Initialize(mapload) + . = ..() + if(mapload) + find_and_mount_on_atom() + /obj/item/wallframe/telescreen name = "telescreen frame" desc = "A wall-mountable telescreen frame. Apply to wall to use." @@ -70,7 +75,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/entertainment/Initialize(mapload) . = ..() - find_and_hang_on_wall() register_context() RegisterSignal(SSdcs, COMSIG_GLOB_NETWORK_BROADCAST_UPDATED, PROC_REF(on_network_broadcast_updated)) speakers = new(src) @@ -106,7 +110,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai if(HAS_SILICON_ACCESS(user) || (user.interaction_range && user.interaction_range >= get_dist(user, src))) can_range = TRUE - if((can_range || user.CanReach(src)) && ISADVANCEDTOOLUSER(user)) + if((can_range || IsReachableBy(user)) && ISADVANCEDTOOLUSER(user)) if(user.incapacitated) return UI_UPDATE if(!can_range && user.can_hold_items() && (user.usable_hands <= 0 || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))) @@ -298,6 +302,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/ordnance /obj/item/wallframe/telescreen/engine name = "engine telescreen frame" result_path = /obj/machinery/computer/security/telescreen/engine + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/engine, 32) @@ -310,6 +315,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/engine, /obj/item/wallframe/telescreen/turbine name = "turbine telescreen frame" result_path = /obj/machinery/computer/security/telescreen/turbine + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/turbine, 32) @@ -346,6 +352,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/prison, /obj/item/wallframe/telescreen/auxbase name = "auxiliary base telescreen frame" result_path = /obj/machinery/computer/security/telescreen/auxbase + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/auxbase, 32) @@ -550,3 +557,16 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/deep_sto say("The [tv_show_name] show has [is_show_active ? "begun" : "ended"]") var/announcement = is_show_active ? pick(tv_starters) : pick(tv_enders) set_network_broadcast_status(tv_network_id, is_show_active, announcement) + +/obj/machinery/computer/security/telescreen/monastery + name = "monastery monitor" + desc = "A telescreen that connects to the monastery's camera network." + network = list(CAMERANET_NETWORK_MONASTERY) + frame_type = /obj/item/wallframe/telescreen/monastery + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/monastery, 32) + +/obj/item/wallframe/telescreen/monastery + name = "monastery telescreen frame" + result_path = /obj/machinery/computer/security/telescreen/monastery + diff --git a/code/game/machinery/computer/warrant.dm b/code/game/machinery/computer/warrant.dm index 7e66c748917b..dd85df26060a 100644 --- a/code/game/machinery/computer/warrant.dm +++ b/code/game/machinery/computer/warrant.dm @@ -105,13 +105,13 @@ return FALSE var/amount = params["amount"] - if(!amount || !isnum(amount) || amount > warrant.fine || !account.adjust_money(-amount, "Paid fine for [target.name]")) + if(!amount || !isnum(amount) || amount <= 0 || amount > warrant.fine || !account.adjust_money(-amount, "Paid fine for [target.name]")) to_chat(user, span_warning("ACCESS DENIED: Invalid amount.")) playsound(src, 'sound/machines/terminal/terminal_error.ogg', 100, TRUE) return FALSE - account.bank_card_talk("You have paid [amount]cr towards [target.name]'s fine of [warrant.fine]cr.") - log_econ("[amount]cr was transferred from [user]'s transaction to [target.name]'s [warrant.fine]cr fine") + account.bank_card_talk("You have paid [amount][MONEY_SYMBOL] towards [target.name]'s fine of [warrant.fine][MONEY_SYMBOL].") + log_econ("[amount][MONEY_SYMBOL] was transferred from [user]'s transaction to [target.name]'s [warrant.fine][MONEY_SYMBOL] fine") SSblackbox.record_feedback("amount", "credits_transferred", amount) warrant.pay_fine(amount) @@ -124,7 +124,7 @@ "A friendly face", "A helpful stranger", ) - warrant.alert_owner(user, src, target.name, "[pick(titles)] has paid [amount]cr towards your fine.") + warrant.alert_owner(user, src, target.name, "[pick(titles)] has paid [amount][MONEY_SYMBOL] towards your fine.") var/datum/bank_account/sec_account = SSeconomy.get_dep_account(ACCOUNT_SEC) sec_account.adjust_money(amount) @@ -166,7 +166,7 @@ bounty_text += "Issued to:
[usr]
" bounty_text += "Issued on:
[warrant.time]
" bounty_text += "Comments:
[!target.security_note ? "None." : target.security_note]

" - bounty_text += "
FINE: [warrant.fine] credits
" + bounty_text += "
FINE: [warrant.fine] [MONEY_NAME]
" printing = TRUE balloon_alert(user, "printing") @@ -174,7 +174,7 @@ var/obj/item/paper/bounty = new(null) bounty.name = "Bounty for [target.name]" - bounty.desc = "A [warrant.fine]cr bounty for [target.name]." + bounty.desc = "A [warrant.fine][MONEY_SYMBOL] bounty for [target.name]." bounty.add_raw_text(bounty_text) bounty.update_icon() diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 880313d09fb1..5012c0eb1aa3 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -6,6 +6,7 @@ base_icon_state = "box_" density = TRUE max_integrity = 250 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5) /// What board do we accept var/board_type = /obj/item/circuitboard /// Reference to the circuit inside the frame diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index da0c67f3cf1a..65796e0cc7f3 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -337,7 +337,7 @@ glow.even_cycle = !glow.even_cycle if(prob(2)) // Unique effects for the dance floor that show up randomly to mix things up INVOKE_ASYNC(src, PROC_REF(hierofunk)) - sleep(music_player.selection.song_beat) + sleep(music_player.selection.song_beat_deciseconds || 1 SECONDS) if(QDELETED(src)) return diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index 8ad4b148f25c..d5ca3b4f7661 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -21,10 +21,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) +/obj/machinery/defibrillator_mount/Initialize(mapload) + . = ..() + if(mapload) + find_and_mount_on_atom() + /obj/machinery/defibrillator_mount/loaded/Initialize(mapload) //loaded subtype for mapping use . = ..() defib = new/obj/item/defibrillator/loaded(src) - find_and_hang_on_wall() /obj/machinery/defibrillator_mount/Destroy() QDEL_NULL(defib) @@ -227,11 +231,15 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) icon_state = "mobile" anchored = FALSE density = TRUE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5.15, /datum/material/silver = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.5) /obj/machinery/defibrillator_mount/mobile/Initialize(mapload) . = ..() AddElement(/datum/element/noisy_movement) +/obj/machinery/defibrillator_mount/mobile/find_and_mount_on_atom(mark_for_late_init, late_init) + return //its mobile + /obj/machinery/defibrillator_mount/mobile/wrench_act_secondary(mob/living/user, obj/item/tool) if(user.combat_mode) return ..() diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index e88fc78f4083..2fea89c46050 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -70,6 +70,7 @@ icon_state = "woodenbarricade" resistance_flags = FLAMMABLE bar_material = WOOD + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 5) /// When destroyed or deconstructed, how many planks of wood does our barricade drop? Also determines how many it takes to repair the barricade and by how much. var/drop_amount = 3 diff --git a/code/game/machinery/digital_clock.dm b/code/game/machinery/digital_clock.dm index edf6f480253e..57c58083aae7 100644 --- a/code/game/machinery/digital_clock.dm +++ b/code/game/machinery/digital_clock.dm @@ -80,7 +80,8 @@ /obj/machinery/digital_clock/Initialize(mapload) . = ..() - find_and_hang_on_wall() + if(mapload) + find_and_mount_on_atom() AddElement(/datum/element/beauty, 200) /obj/machinery/digital_clock/process(seconds_per_tick) diff --git a/code/game/machinery/dna_infuser/dna_infuser.dm b/code/game/machinery/dna_infuser/dna_infuser.dm index 1e64561c9be4..8c8c0512bc33 100644 --- a/code/game/machinery/dna_infuser/dna_infuser.dm +++ b/code/game/machinery/dna_infuser/dna_infuser.dm @@ -226,10 +226,10 @@ /obj/machinery/dna_infuser/click_alt(mob/user) if(infusing) balloon_alert(user, "not while it's on!") - return + return CLICK_ACTION_BLOCKING if(!infusing_from) balloon_alert(user, "no sample to eject!") - return + return CLICK_ACTION_BLOCKING balloon_alert(user, "ejected sample") infusing_from.forceMove(get_turf(src)) infusing_from = null diff --git a/code/game/machinery/dna_infuser/dna_infusion.dm b/code/game/machinery/dna_infuser/dna_infusion.dm index 2ea3b09ca7c4..b2de63a3a2d3 100644 --- a/code/game/machinery/dna_infuser/dna_infusion.dm +++ b/code/game/machinery/dna_infuser/dna_infusion.dm @@ -25,7 +25,7 @@ ///returns /datum/infuser_entry that matches an item being used for infusion, returns a fly mutation on failure /atom/movable/proc/get_infusion_entry() as /datum/infuser_entry var/datum/infuser_entry/found - for(var/datum/infuser_entry/entry as anything in flatten_list(GLOB.infuser_entries)) + for(var/datum/infuser_entry/entry as anything in assoc_to_values(GLOB.infuser_entries)) if(entry.tier == DNA_MUTANT_UNOBTAINABLE) continue if(is_type_in_list(src, entry.input_obj_or_mob)) diff --git a/code/game/machinery/dna_infuser/infuser_book.dm b/code/game/machinery/dna_infuser/infuser_book.dm index 416ed038d640..370d7a87c1eb 100644 --- a/code/game/machinery/dna_infuser/infuser_book.dm +++ b/code/game/machinery/dna_infuser/infuser_book.dm @@ -29,7 +29,7 @@ var/list/data = list() // Collect all info from each intry. var/list/entry_data = list() - for(var/datum/infuser_entry/entry as anything in flatten_list(GLOB.infuser_entries)) + for(var/datum/infuser_entry/entry as anything in assoc_to_values(GLOB.infuser_entries)) if(entry.tier == DNA_MUTANT_UNOBTAINABLE) continue var/list/individual_entry_data = list() diff --git a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm index d4e9618ccc01..fa9d0032a499 100644 --- a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm @@ -119,6 +119,7 @@ greyscale_config = /datum/greyscale_config/mutant_organ greyscale_colors = CARP_COLORS can_smoothen_out = FALSE + shade_color = "blue" ///Timer counting down. When finished, the owner gets a bad moodlet. var/cooldown_timer diff --git a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm index cf5e93f07acc..8c5b91a1a358 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm @@ -134,7 +134,7 @@ if(!bonus_active || !HAS_TRAIT(owner, TRAIT_IS_WET)) return owner.adjust_bodytemperature(-2 * seconds_between_ticks, min_temp = owner.get_body_temp_normal()) - owner.adjustStaminaLoss(-1.5 * seconds_between_ticks) + owner.adjust_stamina_loss(-1.5 * seconds_between_ticks) /datum/status_effect/organ_set_bonus/fish/proc/update_wetness(datum/source) SIGNAL_HANDLER @@ -220,7 +220,7 @@ greyscale_colors = FISH_ORGAN_COLOR bodypart_overlay = /datum/bodypart_overlay/mutant/tail/fish - dna_block = /datum/dna_block/feature/tail_fish + dna_block = /datum/dna_block/feature/accessory/tail_fish wag_flags = NONE organ_traits = list(TRAIT_FLOPPING, TRAIT_SWIMMER) restyle_flags = EXTERNAL_RESTYLE_FLESH @@ -288,9 +288,9 @@ /datum/bodypart_overlay/mutant/tail/fish/on_mob_insert(obj/item/organ/parent, mob/living/carbon/receiver) //Initialize the related dna feature block if we don't have any so it doesn't error out. //This isn't tied to any species, but I kinda want it to be mutable instead of having a fixed sprite accessory. - if(imprint_on_next_insertion && !receiver.dna.features[FEATURE_TAIL_FISH]) - receiver.dna.features[FEATURE_TAIL_FISH] = pick(SSaccessories.tails_list_fish) - receiver.dna.update_uf_block(/datum/dna_block/feature/tail_fish) + if(imprint_on_next_insertion && !receiver.dna.features[feature_key]) + receiver.dna.features[feature_key] = pick(SSaccessories.feature_list[feature_key]) + receiver.dna.update_uf_block(/datum/dna_block/feature/accessory/tail_fish) return ..() @@ -301,9 +301,6 @@ else //otherwise get one from a set of faded out blue and some greys colors. return pick("#B4B8DD", "#85C7D0", "#67BBEE", "#2F4450", "#55CCBB", "#999FD0", "#345066", "#585B69", "#7381A0", "#B6DDE5", "#4E4E50") -/datum/bodypart_overlay/mutant/tail/fish/get_global_feature_list() - return SSaccessories.tails_list_fish - /datum/bodypart_overlay/mutant/tail/fish/get_image(image_layer, obj/item/bodypart/limb) var/mutable_appearance/appearance = ..() // We add all appearances the parent bodypart has to the tail to inherit scales and fancy effects @@ -377,7 +374,7 @@ breathe_gas_volume(breath, /datum/gas/water_vapor, /datum/gas/carbon_dioxide) // Heal mob if not in crit. if(breather.health >= breather.crit_threshold && breather.oxyloss) - breather.adjustOxyLoss(-5) + breather.adjust_oxy_loss(-5) /// Called when there isn't enough water to breath /obj/item/organ/lungs/fish/proc/on_low_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp) @@ -470,6 +467,37 @@ icon = 'icons/obj/medical/organs/infuser_organs.dmi' icon_state = "inky_tongue" actions_types = list(/datum/action/cooldown/ink_spit) + /** + * This is probably the most complex tts filter that won't require external files to be added to the tts image. + * It works as follows: + * 1. Increase the pitch of the input audio. Pitch increase is lower for higher speaker pitch and vice-versa. + * 2. Apply a mid-heavy EQ curve. + * 3. Using an oscillating target frequency: + * - Apply a low pass filter with its cutoff at the target frequency + * - Boost frequencies very close to the target frequency + */ + voice_filter = "\ + rubberband=pitch='\ + ifnot(%BLIPS%,\ + 2-(%PITCH%+if(%FEMALE%,4))/16\ + ,1)'\ + :formant=preserved,\ + highpass=f=1000:t=s:w=24,\ + equalizer=f=1200:g=15,\ + equalizer=f=4350:g=-15,\ + highshelf=f=870:g=1,\ + afftfilt=\ + real='\ + st(0,(b+0.5)/nb*sr);\ + st(1,3000+1500*sin(9.3*2*PI*pts));\ + st(2,ld(0)/ld(1));\ + re*(1-ld(2)^2+2*gauss(log(ld(2)+1)))'\ + :imag='\ + st(0,(b+0.5)/nb*sr);\ + st(1,3000+1500*sin(9.3*2*PI*pts));\ + st(2,ld(0)/ld(1));\ + im*(1-ld(2)^2+2*gauss(log(ld(2)+1)))'\ + :win_size=1024" // Seafood instead of meat, because it's a fish organ foodtype_flags = RAW | SEAFOOD | GORE @@ -500,7 +528,6 @@ organ_traits = list(TRAIT_TETRODOTOXIN_HEALING, TRAIT_ALCOHOL_TOLERANCE) //drink like a fish :^) liver_resistance = parent_type::liver_resistance * 1.5 food_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue = 5, /datum/reagent/iron = 5, /datum/reagent/toxin/tetrodotoxin = 5) - grind_results = list(/datum/reagent/consumable/nutriment/peptides = 5, /datum/reagent/toxin/tetrodotoxin = 5) // Seafood instead of meat, because it's a fish organ foodtype_flags = RAW | SEAFOOD | GORE @@ -511,6 +538,9 @@ . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fish) +/obj/item/organ/liver/fish/grind_results() + return list(/datum/reagent/consumable/nutriment/peptides = 5, /datum/reagent/toxin/tetrodotoxin = 5) + #undef FISH_ORGAN_COLOR #undef FISH_SCLERA_COLOR #undef FISH_PUPIL_COLOR 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 1d9c8bdc743e..1af4ad7f2ee3 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm @@ -20,7 +20,7 @@ // so we need to delay species change until we're fully inserted RegisterSignal(inserted_organ, COMSIG_ORGAN_BODYPART_INSERTED, PROC_REF(flyify)) -/datum/status_effect/organ_set_bonus/fly/proc/flyify(obj/item/organ/source, obj/item/bodypart/limb, movement_flags) +/datum/status_effect/organ_set_bonus/fly/proc/flyify(obj/item/organ/source, obj/item/bodypart/limb) SIGNAL_HANDLER var/mob/living/carbon/human/new_fly = owner // just in case? diff --git a/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm index 68a0ca007968..3986994762cf 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm @@ -6,6 +6,6 @@ visual = TRUE damage_multiplier = 2 - dna_block = /datum/dna_block/feature/ears + dna_block = /datum/dna_block/feature/accessory/ears bodypart_overlay = /datum/bodypart_overlay/mutant/cat_ears sprite_accessory_override = /datum/sprite_accessory/ears/fox diff --git a/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm b/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm index 900f566f0576..6f2e35b32198 100644 --- a/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm @@ -63,6 +63,7 @@ greyscale_config = /datum/greyscale_config/mutant_organ greyscale_colors = GOLIATH_COLORS can_smoothen_out = FALSE + shade_color = "garnet" var/obj/item/goliath_infuser_hammer/hammer 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 71922f1b3a9f..7d17f1bb477e 100644 --- a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm @@ -107,8 +107,19 @@ AddElement(/datum/element/noticable_organ, "%PRONOUN_Their teeth are oddly shaped and yellowing.", BODY_ZONE_PRECISE_MOUTH) AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/rat) +/obj/item/organ/tongue/rat/proc/whimsy_check(mob/living/checking) + if(check_holidays(APRIL_FOOLS)) + return TRUE + if(HAS_PERSONALITY(checking, /datum/personality/whimsical)) + return TRUE + if(prob(1)) + return TRUE + return FALSE + /obj/item/organ/tongue/rat/modify_speech(datum/source, list/speech_args) . = ..() + if(!whimsy_check(source)) + return var/message = LOWER_TEXT(speech_args[SPEECH_MESSAGE]) if(message == "hi" || message == "hi.") speech_args[SPEECH_MESSAGE] = "Cheesed to meet you!" @@ -125,6 +136,8 @@ /obj/item/organ/tongue/rat/proc/on_item_given(mob/living/carbon/offerer, mob/living/taker, obj/item/given) SIGNAL_HANDLER + if(!whimsy_check(offerer)) + return INVOKE_ASYNC(src, PROC_REF(its_on_the_mouse), offerer, taker) /obj/item/organ/tongue/rat/proc/its_on_the_mouse(mob/living/carbon/offerer, mob/living/taker) diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index ab14767479fe..1ad319486c8e 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -159,6 +159,41 @@ SIGNAL_HANDLER set_linked_console(null) +// Disk skins +/datum/atom_skin/dna_disk + abstract_type = /datum/atom_skin/dna_disk + +/datum/atom_skin/dna_disk/red + preview_name = "Red" + new_icon_state = "datadisk0" + +/datum/atom_skin/dna_disk/dark_blue + preview_name = "Dark Blue" + new_icon_state = "datadisk1" + +/datum/atom_skin/dna_disk/yellow + preview_name = "Yellow" + new_icon_state = "datadisk2" + +/datum/atom_skin/dna_disk/black + preview_name = "Black" + new_icon_state = "datadisk3" + +/datum/atom_skin/dna_disk/green + preview_name = "Green" + new_icon_state = "datadisk4" + +/datum/atom_skin/dna_disk/purple + preview_name = "Purple" + new_icon_state = "datadisk5" + +/datum/atom_skin/dna_disk/grey + preview_name = "Grey" + new_icon_state = "datadisk6" + +/datum/atom_skin/dna_disk/light_blue + preview_name = "Light Blue" + new_icon_state = "datadisk7" //Just for transferring between genetics machines. /obj/item/disk/data @@ -168,20 +203,10 @@ var/list/mutations = list() var/max_mutations = 6 var/read_only = FALSE //Well,it's still a floppy disk - obj_flags = parent_type::obj_flags | INFINITE_RESKIN - unique_reskin = list( - "Red" = "datadisk0", - "Dark Blue" = "datadisk1", - "Yellow" = "datadisk2", - "Black" = "datadisk3", - "Green" = "datadisk4", - "Purple" = "datadisk5", - "Grey" = "datadisk6", - "Light Blue" = "datadisk7", - ) /obj/item/disk/data/Initialize(mapload) . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/dna_disk, infinite = TRUE) icon_state = "datadisk[rand(0,7)]" add_overlay("datadisk_gene") if(length(genetic_makeup_buffer)) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 5f67b791e906..d3fc1574cc67 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -179,13 +179,13 @@ damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_R prepare_huds() - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_atom_to_hud(src) + var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC] + diag_hud.add_atom_to_hud(src) diag_hud_set_electrified() // Click on the floor to close airlocks - AddComponent(/datum/component/redirect_attack_hand_from_turf) + AddComponent(/datum/component/redirect_attack_hand_from_turf, interact_check = CALLBACK(src, PROC_REF(drag_check))) AddElement(/datum/element/nav_computer_icon, 'icons/effects/nav_computer_indicators.dmi', "airlock", TRUE) @@ -193,6 +193,12 @@ RegisterSignal(SSdcs, COMSIG_GLOB_GREY_TIDE, PROC_REF(grey_tide)) +// if dragging, block 'Click on the floor to close airlocks' +/obj/machinery/door/airlock/proc/drag_check(mob/user) + if (user.pulling) + return FALSE + return TRUE + /obj/machinery/door/airlock/proc/grey_tide(datum/source, list/grey_tide_areas) SIGNAL_HANDLER @@ -308,8 +314,8 @@ close_others.Cut() QDEL_NULL(note) QDEL_NULL(seal) - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.remove_atom_from_hud(src) + var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC] + diag_hud.remove_atom_from_hud(src) return ..() /obj/machinery/door/airlock/Exited(atom/movable/gone, direction) @@ -503,7 +509,10 @@ /obj/machinery/door/airlock/proc/is_secure() return (security_level > 0) -/// Checks if this door would be affected by any currently active RETA grants +/** + * Checks if this door would be affected by any currently active RETA grants + * If a grant is active, return the authorized department + */ /obj/machinery/door/airlock/proc/has_active_reta_access() if(!CONFIG_GET(flag/reta_enabled)) return FALSE @@ -521,11 +530,11 @@ for(var/required_access in req_access) if(required_access in origin_dept_access) - return TRUE + return LOWER_TEXT(target_dept) for(var/required_access in req_one_access) if(required_access in origin_dept_access) - return TRUE + return LOWER_TEXT(target_dept) return FALSE @@ -736,6 +745,10 @@ else . += "It looks very robust." + var/active_reta = has_active_reta_access() + if(active_reta) + . += span_nicegreen("Emergency Temporary Access is enabled for [EXAMINE_HINT(active_reta)] ID cards.") + if(issilicon(user) && !(machine_stat & BROKEN)) . += span_notice("Shift-click [src] to [ density ? "open" : "close"] it.") . += span_notice("Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts.") @@ -928,6 +941,9 @@ update_appearance() return ITEM_INTERACT_SUCCESS +/obj/machinery/door/airlock/screwdriver_act_secondary(mob/living/user, obj/item/tool) + return screwdriver_act(user, tool) + /obj/machinery/door/airlock/wirecutter_act(mob/living/user, obj/item/tool) if(panel_open && security_level == AIRLOCK_SECURITY_PLASTEEL) . = ITEM_INTERACT_SUCCESS // everything after this shouldn't result in attackby @@ -943,7 +959,7 @@ security_level = AIRLOCK_SECURITY_PLASTEEL_O return . if(note) - if(user.CanReach(src)) + if(IsReachableBy(user)) user.visible_message(span_notice("[user] cuts down [note] from [src]."), span_notice("You remove [note] from [src].")) else //telekinesis visible_message(span_notice("[tool] cuts down [note] from [src].")) @@ -1151,7 +1167,7 @@ return if(atom_integrity < max_integrity) - if(!W.tool_start_check(user, amount=1)) + if(!W.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) return user.visible_message(span_notice("[user] begins welding the airlock."), \ span_notice("You begin repairing the airlock..."), \ @@ -1166,7 +1182,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=1)) + if(!tool.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) return user.visible_message(span_notice("[user] begins [welded ? "unwelding":"welding"] the airlock."), \ span_notice("You begin [welded ? "unwelding":"welding"] the airlock..."), \ @@ -1288,6 +1304,11 @@ prying_so_hard = FALSE return + if(!isnull(tool)) + if(SEND_SIGNAL(tool, COMSIG_TOOL_FORCE_OPEN_AIRLOCK, user, src) & COMPONENT_TOOL_DO_NOT_ALLOW_FORCE_OPEN) + prying_so_hard = FALSE + return + prying_so_hard = FALSE if(check_electrified && shock(user, 100)) @@ -1338,10 +1359,9 @@ set_airlock_state(AIRLOCK_OPENING, animated = TRUE, force_type = forced) var/transparent_delay = animation_segment_delay(AIRLOCK_OPENING_TRANSPARENT) sleep(transparent_delay) - set_opacity(0) + set_opacity(FALSE) if(multi_tile) filler.set_opacity(FALSE) - update_freelook_sight() var/passable_delay = animation_segment_delay(AIRLOCK_OPENING_PASSABLE) - transparent_delay sleep(passable_delay) set_density(FALSE) @@ -1428,7 +1448,6 @@ set_opacity(TRUE) if(multi_tile) filler.set_opacity(TRUE) - update_freelook_sight() var/close_delay = animation_segment_delay(AIRLOCK_CLOSING_FINISHED) - unpassable_delay - opaque_delay sleep(close_delay) set_airlock_state(AIRLOCK_CLOSED, animated = FALSE) @@ -1512,10 +1531,10 @@ /obj/machinery/door/airlock/proc/finish_emag_act() if(QDELETED(src)) return FALSE - set_machine_stat(machine_stat & ~MAINT) operating = FALSE if(!open()) set_airlock_state(AIRLOCK_CLOSED) + set_machine_stat(machine_stat & ~MAINT) obj_flags |= EMAGGED feedback = FALSE locked = TRUE @@ -1666,7 +1685,7 @@ return FALSE /obj/machinery/door/airlock/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - switch(rcd_data["[RCD_DESIGN_MODE]"]) + switch(rcd_data[RCD_DESIGN_MODE]) if(RCD_DECONSTRUCT) qdel(src) return TRUE @@ -2422,6 +2441,7 @@ aiControlDisabled = AI_WIRE_DISABLED req_access = list(ACCESS_BLOODCULT) damage_deflection = 10 + custom_materials = list(/datum/material/runedmetal = SHEET_MATERIAL_AMOUNT) var/openingoverlaytype = /obj/effect/temp_visual/cult/door var/friendly = FALSE var/stealthy = FALSE diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 2973579153a8..5e25742d4dc5 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -6,7 +6,7 @@ /// If the airlock should require ALL or only ONE of the listed accesses var/one_access = 0 /// Checks to see if this airlock has an unrestricted helper (will set to TRUE if present). - var/unres_sensor = FALSE + var/unres_latch = FALSE /// Unrestricted sides, or sides of the airlock that will open regardless of access var/unres_sides = NONE ///what name are we passing to the finished airlock diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 9cb7dea5cc66..b18a82c0677f 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -1,4 +1,8 @@ -#define DOOR_CLOSE_WAIT 60 ///Default wait until doors autoclose +///Default wait until doors autoclose +#define DOOR_CLOSE_WAIT 60 +/// Trait for checking if a mob is currently activating an unrestricted airlock open and thus has pressure pushes blocked +#define TRAIT_UNRESTRICTED_AIRLOCK_OPENING "trait_unrestricted_airlock_opening" + /obj/machinery/door name = "door" desc = "It opens and closes." @@ -56,10 +60,7 @@ var/real_explosion_block ///if TRUE, this door will always open on red alert var/red_alert_access = FALSE - /// Checks to see if this airlock has an unrestricted "sensor" within (will set to TRUE if present). - var/unres_sensor = FALSE - /// Unrestricted sides. A bitflag for which direction (if any) can open the door with no access - var/unres_sides = NONE + /// Whether or not the door can crush mobs. var/can_crush = TRUE /// Whether or not the door can be opened by hand (used for blast doors and shutters) @@ -73,6 +74,19 @@ /// What specific lift ID do we link with? var/transport_linked_id + /// Checks to see if this airlock has an unrestricted "latch" within (will set to TRUE if present). + var/unres_latch = FALSE + /// Unrestricted sides. A bitflag for which direction (if any) can open the door with no access + var/unres_sides = NONE + /// Delayed open for unrestricted users. If there is an unrestricted side, we want to know if the door opening should be delayed for a bit to add tension and what-not + var/delayed_unres_open = FALSE + /// Lower range for random time to open for unrestricted users + var/delayed_unres_time_lower = 2 SECONDS + /// Upper range for random time to open for unrestricted users + var/delayed_unres_time_upper = 3 SECONDS + /// Cooldown tracker to prevent message spam when resisting pressure while opening via unrestricted latch + COOLDOWN_DECLARE(pressure_push_cooldown) + /datum/armor/machinery_door melee = 30 bullet = 30 @@ -98,7 +112,6 @@ set_bounds() set_filler() update_overlays() - update_freelook_sight() air_update_turf(TRUE, TRUE) register_context() if(elevator_mode) @@ -163,7 +176,6 @@ layer = initial(layer) /obj/machinery/door/Destroy() - update_freelook_sight() if(elevator_mode) GLOB.elevator_doors -= src if(spark_system) @@ -336,16 +348,80 @@ if(density) run_animation(DOOR_DENY_ANIMATION) -/obj/machinery/door/allowed(mob/M) +/obj/machinery/door/allowed(mob/accessor) if(emergency) return TRUE - if(unrestricted_side(M)) + + . = ..() // let's see if this user has any funny way to access this before we try unrestricted stuff as that will have potential delays + + if(. == TRUE) return TRUE - return ..() -/obj/machinery/door/proc/unrestricted_side(mob/opener) //Allows for specific side of airlocks to be unrestrected (IE, can exit maint freely, but need access to enter) + if(unrestricted_side(accessor)) + if(!delayed_unres_open) + return TRUE + + return attempt_delayed_unres_open(accessor) + + return FALSE + + + +/// Allows for specific side of airlocks to be unrestricted (IE, can exit maint freely, but need access to enter) +/obj/machinery/door/proc/unrestricted_side(mob/opener) return get_dir(src, opener) & unres_sides +/// Initiates a do_after to open the door after a delay for unrestricted openers +/// Returns TRUE if we successfully finished the do_after, FALSE otherwise +/obj/machinery/door/proc/attempt_delayed_unres_open(mob/opener) + if(opener.do_after_count() > 0) // not allowed to do this if you're doing something else. just wait lad. + return FALSE + + var/do_after_time = rand(delayed_unres_time_lower, delayed_unres_time_upper) + ADD_TRAIT(opener, TRAIT_UNRESTRICTED_AIRLOCK_OPENING, REF(src)) + RegisterSignal(opener, COMSIG_ATOM_PRE_PRESSURE_PUSH, PROC_REF(stop_pressure_during_unres_open)) + addtimer(CALLBACK(src, PROC_REF(deregister_pressure_push_signal), opener), do_after_time + 0.5 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) // extra half-second to be safe, else this is just a guarantee we remove the signal. + + SSblackbox.record_feedback("tally", "unrestricted_airlock_usage", 1, "open attempt ([type])") // statcollecting on how often people try to use this. + balloon_alert(opener, "activating unrestricted latch...") + + if(istype(get_area(src), /area/station/maintenance)) + playsound(get_turf(src), 'sound/machines/airlock/airlock_latch_hiss.ogg', 45, vary = TRUE, falloff_exponent = (SOUND_FALLOFF_EXPONENT * 2)) // sound travels further in maintenance muahaha + else + playsound(get_turf(src), 'sound/machines/airlock/airlock_latch_hiss.ogg', 30, vary = TRUE, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE, falloff_exponent = (SOUND_FALLOFF_EXPONENT * 1.5)) + + if(do_after(opener, do_after_time, target = src)) + SSblackbox.record_feedback("tally", "unrestricted_airlock_usage", 1, "open success ([type])") // no need to tally failures as we can assume it as long as we have this + the total + return TRUE + + deregister_pressure_push_signal(opener) // if you fail the do_after early then you lose your pressure immunity, womp. + return FALSE + +/// While activating the door, we are able to block pressure pushes since we're "grasping the override handle" or something similar to that. +/// This basically exists to prevent the door's delay from being SUPREMELY annoying when you're trying to escape pressure-based damage during the unrestricted latch do_after. +/obj/machinery/door/proc/stop_pressure_during_unres_open(mob/source) + SIGNAL_HANDLER + if(QDELETED(source)) + return + + if(!COOLDOWN_FINISHED(src, pressure_push_cooldown)) // avoid spam + return COMSIG_ATOM_BLOCKS_PRESSURE + + // have both since this is a newer mechanic and i want it to be a bit more obvious why for the time being + balloon_alert(source, "resisting pressure!") + to_chat(source, span_warning("You're holding onto the unrestricted latch, preventing pressure from pushing you away!")) + COOLDOWN_START(src, pressure_push_cooldown, 5 SECONDS) + return COMSIG_ATOM_BLOCKS_PRESSURE + +/// Exists to ensure that we always deregister the pressure push blocking signal. Can be called multiple times safely as we check the trait. +/obj/machinery/door/proc/deregister_pressure_push_signal(mob/opener) + if(!HAS_TRAIT_FROM(opener, TRAIT_UNRESTRICTED_AIRLOCK_OPENING, REF(src))) + return + + UnregisterSignal(opener, COMSIG_ATOM_PRE_PRESSURE_PUSH) + REMOVE_TRAIT(opener, TRAIT_UNRESTRICTED_AIRLOCK_OPENING, REF(src)) + + /obj/machinery/door/proc/try_to_weld(obj/item/weldingtool/W, mob/user) return @@ -376,6 +452,9 @@ try_to_crowbar(tool, user, forced_open) return ITEM_INTERACT_SUCCESS +/obj/machinery/door/try_to_crowbar_secondary(obj/item/acting_object, mob/user) + try_to_crowbar(null, user, FALSE) + /obj/machinery/door/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(weapon, /obj/item/access_key)) var/obj/item/access_key/key = weapon @@ -508,7 +587,7 @@ operating = TRUE use_energy(active_power_usage) run_animation(DOOR_OPENING_ANIMATION) - set_opacity(0) + set_opacity(FALSE) var/passable_delay = animation_segment_delay(DOOR_OPENING_PASSABLE) SLEEP_NOT_DEL(passable_delay) set_density(FALSE) @@ -517,10 +596,9 @@ SLEEP_NOT_DEL(open_delay) layer = initial(layer) update_appearance() - set_opacity(0) + set_opacity(FALSE) operating = FALSE air_update_turf(TRUE, FALSE) - update_freelook_sight() if(autoclose) autoclose_in(DOOR_CLOSE_WAIT) return TRUE @@ -556,10 +634,9 @@ SLEEP_NOT_DEL(close_delay) update_appearance() if(visible && !glass) - set_opacity(1) + set_opacity(TRUE) operating = FALSE air_update_turf(TRUE, TRUE) - update_freelook_sight() if(!can_crush) return TRUE @@ -618,10 +695,6 @@ /obj/machinery/door/proc/hasPower() return !(machine_stat & NOPOWER) -/obj/machinery/door/proc/update_freelook_sight() - if(!glass && GLOB.cameranet) - GLOB.cameranet.updateVisibility(src, 0) - /obj/machinery/door/block_superconductivity() // All non-glass airlocks block heat, this is intended. if(opacity || heat_proof) return 1 @@ -632,7 +705,13 @@ /obj/machinery/door/morgue/Initialize(mapload) . = ..() - AddComponent(/datum/component/redirect_attack_hand_from_turf) + AddComponent(/datum/component/redirect_attack_hand_from_turf, interact_check = CALLBACK(src, PROC_REF(drag_check))) + +// if dragging, block redirect_Attack_hand_from_turf +/obj/machinery/door/morgue/proc/drag_check(mob/user) + if (user.pulling) + return FALSE + return TRUE /obj/machinery/door/get_dumping_location() return null @@ -706,3 +785,4 @@ return ..(0) #undef DOOR_CLOSE_WAIT +#undef TRAIT_UNRESTRICTED_AIRLOCK_OPENING diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 8b3f9f6e5fce..b14a54f29777 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -586,7 +586,7 @@ SIGNAL_HANDLER - if(!QDELETED(crowbar_owner) && crowbar_owner.CanReach(src)) + if(!QDELETED(crowbar_owner) && IsReachableBy(crowbar_owner)) if(!ismob(crowbar_owner)) return var/mob/living/mob_user = crowbar_owner @@ -743,13 +743,17 @@ /obj/machinery/door/firedoor/border_only/Initialize(mapload) . = ..() + flags_1 &= ~PREVENT_CLICK_UNDER_1 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/close() + . = ..() + flags_1 &= ~PREVENT_CLICK_UNDER_1 + /obj/machinery/door/firedoor/border_only/adjust_lights_starting_offset() light_xoffset = 0 light_yoffset = 0 @@ -815,6 +819,7 @@ base_icon_state = "frame" anchored = FALSE density = TRUE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3) var/constructionStep = CONSTRUCTION_NO_CIRCUIT var/reinforced = 0 /// Is this a border_only firelock? Used in several checks during construction @@ -951,7 +956,7 @@ return FALSE /obj/structure/firelock_frame/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - switch(rcd_data["[RCD_DESIGN_MODE]"]) + switch(rcd_data[RCD_DESIGN_MODE]) if(RCD_UPGRADE_SIMPLE_CIRCUITS) user.balloon_alert(user, "circuit installed") constructionStep = CONSTRUCTION_PANEL_OPEN @@ -971,10 +976,11 @@ flags_1 = ON_BORDER_1 obj_flags = CAN_BE_HIT | IGNORE_DENSITY directional = TRUE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/firelock_frame/border_only/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM) + AddElement(/datum/element/simple_rotation, ROTATION_NEEDS_ROOM) var/static/list/loc_connections = list( COMSIG_ATOM_EXIT = PROC_REF(on_exit), diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index 3a7225419b51..16cf0bf509e4 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -44,7 +44,7 @@ /obj/machinery/door/password/get_save_vars() return ..() + NAMEOF(src, password) -/obj/machinery/door/password/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/obj/machinery/door/password/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/machinery/door/password/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) . = ..() if(!density || !voice_activated || radio_freq) return diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index b3804ff010b6..cfd1f99ba9b6 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -14,6 +14,7 @@ resistance_flags = FIRE_PROOF damage_deflection = 70 can_open_with_hands = FALSE + custom_materials = list(/datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 15, /datum/material/iron = SMALL_MATERIAL_AMOUNT * 2, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2) /// The recipe for this door var/datum/crafting_recipe/recipe_type = /datum/crafting_recipe/blast_doors /// The current deconstruction step diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index 04ced0d2ea7a..c09dae310ceb 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -3,12 +3,13 @@ name = "shutters" desc = "Heavy duty mechanical shutters with an atmospheric seal that keeps them airtight once closed." icon = 'modular_darkpack/master_files/icons/obj/doors/shutters.dmi' // DARKPACK EDIT CHANGE - layer = SHUTTER_LAYER - closingLayer = SHUTTER_LAYER + layer = ABOVE_ALL_MOB_LAYER // DARKPACK EDIT CHANGE + closingLayer = ABOVE_ALL_MOB_LAYER // DARKPACK EDIT CHANGE damage_deflection = 20 armor_type = /datum/armor/poddoor_shutters max_integrity = 100 recipe_type = /datum/crafting_recipe/shutters + custom_materials = list(/datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 5, /datum/material/iron = SMALL_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT) animation_sound = 'sound/machines/shutter.ogg' show_nav_computer_icon = FALSE @@ -45,6 +46,7 @@ /obj/machinery/door/poddoor/shutters/preopen/deconstructed deconstruction = BLASTDOOR_NEEDS_WIRES + custom_materials = list(/datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 5) /obj/machinery/door/poddoor/shutters/indestructible name = "hardened shutters" diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 429b648624a2..65fbe58e7e76 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -256,7 +256,6 @@ var/open_delay = animation_segment_delay(DOOR_OPENING_FINISHED) - passable_delay sleep(open_delay) air_update_turf(TRUE, FALSE) - update_freelook_sight() if(operating == 1) //emag again operating = FALSE @@ -299,7 +298,6 @@ sleep(unpassable_delay) set_density(TRUE) air_update_turf(TRUE, TRUE) - update_freelook_sight() var/close_delay = animation_segment_delay(DOOR_CLOSING_FINISHED) - unpassable_delay sleep(close_delay) @@ -464,6 +462,13 @@ return ..() /obj/machinery/door/window/try_to_crowbar(obj/item/I, mob/user, forced = FALSE) + if(istype(I, /obj/item/crowbar/power)) + var/obj/item/crowbar/power/power_tool = I + if(power_tool.limit_jaws_access && forced) + playsound(src.loc, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) + user.balloon_alert(user, "cannot pry open!") + return + if(!hasPower() || forced) if(density) open(BYPASS_DOOR_CHECKS) @@ -479,7 +484,7 @@ return FALSE /obj/machinery/door/window/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - if(rcd_data["[RCD_DESIGN_MODE]"] == RCD_DECONSTRUCT) + if(rcd_data[RCD_DESIGN_MODE] == RCD_DECONSTRUCT) qdel(src) return TRUE return FALSE @@ -542,8 +547,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/brigdoor/security/holding operating = TRUE set_density(FALSE) + set_opacity(FALSE) air_update_turf(TRUE, FALSE) - update_freelook_sight() operating = FALSE update_appearance() @@ -557,8 +562,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/brigdoor/security/holding operating = TRUE set_density(TRUE) + set_opacity(TRUE) air_update_turf(TRUE, TRUE) - update_freelook_sight() operating = FALSE update_appearance() diff --git a/code/game/machinery/drone_dispenser.dm b/code/game/machinery/drone_dispenser.dm index 53ff9597b847..5189ffe4b9b4 100644 --- a/code/game/machinery/drone_dispenser.dm +++ b/code/game/machinery/drone_dispenser.dm @@ -66,12 +66,12 @@ /// Sound that the drone dispnser plays when it's broken. var/break_sound = 'sound/machines/warning-buzzer.ogg' /// Reference to the object's internal storage for materials. - var/datum/component/material_container/materials + var/datum/material_container/materials /obj/machinery/drone_dispenser/Initialize(mapload) . = ..() - materials = AddComponent( \ - /datum/component/material_container, \ + materials = new ( \ + src, \ list(/datum/material/iron, /datum/material/glass), \ SHEET_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, \ MATCONTAINER_EXAMINE, \ @@ -84,7 +84,7 @@ //REGISTER_REQUIRED_MAP_ITEM(1, 1) // DARKPACK EDIT REMOVAL /obj/machinery/drone_dispenser/Destroy() - materials = null + QDEL_NULL(materials) return ..() /obj/machinery/drone_dispenser/preloaded diff --git a/code/game/machinery/ecto_sniffer.dm b/code/game/machinery/ecto_sniffer.dm index 7f94df42b72a..6c7de7e50976 100644 --- a/code/game/machinery/ecto_sniffer.dm +++ b/code/game/machinery/ecto_sniffer.dm @@ -61,15 +61,18 @@ tool.play_tool_sound(src, 15) set_anchored(!anchored) balloon_alert(user, "sniffer [anchored ? "anchored" : "unanchored"]") + return ITEM_INTERACT_SUCCESS + +/obj/machinery/ecto_sniffer/screwdriver_act(mob/living/user, obj/item/screwdrivertool) + if(default_deconstruction_screwdriver(user, "ecto_sniffer_open", "ecto_sniffer", screwdrivertool)) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING -/obj/machinery/ecto_sniffer/screwdriver_act(mob/living/user, obj/item/I) - . = ..() - if(!.) - return default_deconstruction_screwdriver(user, "ecto_sniffer_open", "ecto_sniffer", I) /obj/machinery/ecto_sniffer/crowbar_act(mob/living/user, obj/item/tool) - if(!default_deconstruction_crowbar(tool)) - return ..() + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING /obj/machinery/ecto_sniffer/Destroy() ectoplasmic_residues = null diff --git a/code/game/machinery/experimental_cloner/experimental_cloner_fuckup.dm b/code/game/machinery/experimental_cloner/experimental_cloner_fuckup.dm index 96168a953ad2..cbd7fda5aba9 100644 --- a/code/game/machinery/experimental_cloner/experimental_cloner_fuckup.dm +++ b/code/game/machinery/experimental_cloner/experimental_cloner_fuckup.dm @@ -106,7 +106,7 @@ var/obj/item/bodypart/old_bodypart = victim.get_bodypart(target_zone) var/obj/item/bodypart/new_bodypart = new part_type() - new_bodypart.replace_limb(victim, TRUE) + new_bodypart.replace_limb(victim) qdel(old_bodypart) /// Contaminated sample diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 1b5e012d2fb0..74600bab3841 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -10,6 +10,13 @@ result_path = /obj/machinery/firealarm pixel_shift = 26 +/obj/item/wallframe/firealarm/try_build(atom/support, mob/user) + var/area/A = get_area(user) + if(A.always_unpowered) + balloon_alert(user, "cannot place in this area!") + return FALSE + return ..() + /obj/machinery/firealarm name = "fire alarm" desc = "Pull this in case of emergency. Thus, keep pulling it forever." @@ -49,10 +56,10 @@ fire = 90 acid = 30 -/obj/machinery/firealarm/Initialize(mapload, dir, building) +/obj/machinery/firealarm/Initialize(mapload) . = ..() id_tag = assign_random_name() - if(building) + if(!mapload) buildstage = FIRE_ALARM_BUILD_NO_CIRCUIT set_panel_open(TRUE) if(name == initial(name)) @@ -65,9 +72,7 @@ soundloop = new(src, FALSE) set_wires(new /datum/wires/firealarm(src)) - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/firealarm, - )) + AddComponent(/datum/component/usb_port, typecacheof(list(/obj/item/circuit_component/firealarm), only_root_path = TRUE)) AddComponent( \ /datum/component/redirect_attack_hand_from_turf, \ @@ -78,10 +83,10 @@ ) register_context() - find_and_hang_on_wall() + if(mapload) + find_and_mount_on_atom() update_appearance() - /obj/machinery/firealarm/Destroy() if(my_area) LAZYREMOVE(my_area.firealarms, src) @@ -506,7 +511,7 @@ return FALSE /obj/machinery/firealarm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - switch(rcd_data["[RCD_DESIGN_MODE]"]) + switch(rcd_data[RCD_DESIGN_MODE]) if(RCD_WALLFRAME) balloon_alert_to_viewers("circuit installed") buildstage = FIRE_ALARM_BUILD_NO_WIRES diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 1d98eb41bcdb..f08fc0046820 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -16,7 +16,7 @@ var/flash_range = 2 //this is roughly the size of a brig cell. /// How strong Paralyze()'d targets are when flashed. - var/strength = 10 SECONDS + var/strength = 5 SECONDS COOLDOWN_DECLARE(flash_cooldown) /// Duration of time between flashes. @@ -24,11 +24,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) -/obj/machinery/flasher/Initialize(mapload, ndir = 0, built = 0) - . = ..() // ..() is EXTREMELY IMPORTANT, never forget to add it - if(!built) +/obj/machinery/flasher/Initialize(mapload) + . = ..() + if(mapload) bulb = new(src) - find_and_hang_on_wall() + find_and_mount_on_atom() /obj/machinery/flasher/vv_edit_var(vname, vval) . = ..() @@ -120,8 +120,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) if (get_dist(src, living_mob) > flash_range) continue - if(living_mob.flash_act(affect_silicon = TRUE)) - living_mob.log_message("was AOE flashed by an automated portable flasher", LOG_ATTACK) + if(bulb.flash_mob(living_mob, confusion_duration = strength * 1.5, extra_log = "by [src]")) living_mob.Paralyze(strength) flashed = TRUE @@ -161,7 +160,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) icon = 'icons/obj/machines/sec.dmi' icon_state = "pflash1-p" base_icon_state = "pflash" - strength = 8 SECONDS + strength = 4 SECONDS anchored = FALSE density = TRUE ///Proximity monitor associated with this atom, needed for proximity checks. @@ -171,14 +170,19 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) . = ..() proximity_monitor = new(src, 0) +/obj/machinery/flasher/portable/find_and_mount_on_atom(mark_for_late_init, late_init) + return //its meant to be carried and mobile + /obj/machinery/flasher/portable/HasProximity(atom/movable/proximity_check_mob) if(!COOLDOWN_FINISHED(src, flash_cooldown)) return - if(iscarbon(proximity_check_mob)) - var/mob/living/carbon/proximity_carbon = proximity_check_mob - if (proximity_carbon.move_intent != MOVE_INTENT_WALK && anchored) - flash() + if(!isliving(proximity_check_mob)) + return + + var/mob/living/proximity_living = proximity_check_mob + if (proximity_living.move_intent != MOVE_INTENT_WALK && anchored) + flash() /obj/machinery/flasher/portable/vv_edit_var(vname, vval) . = ..() diff --git a/code/game/machinery/flatpacker.dm b/code/game/machinery/flatpacker.dm index 07f76e3bd078..011ddf7f1b1a 100644 --- a/code/game/machinery/flatpacker.dm +++ b/code/game/machinery/flatpacker.dm @@ -16,7 +16,7 @@ /// Coefficient applied to consumed materials. Lower values result in lower material consumption. var/creation_efficiency = 2 ///The container to hold materials - var/datum/component/material_container/materials + var/datum/material_container/materials /// The inserted board var/obj/item/circuitboard/machine/inserted_board /// List of components that need to be packed along with the circuitboard @@ -33,8 +33,8 @@ /obj/machinery/flatpacker/Initialize(mapload) register_context() - materials = AddComponent( \ - /datum/component/material_container, \ + materials = new ( \ + src, \ SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ 0, \ MATCONTAINER_EXAMINE, \ @@ -44,10 +44,10 @@ return ..() /obj/machinery/flatpacker/Destroy() - materials = null + QDEL_NULL(materials) QDEL_NULL(inserted_board) QDEL_LIST(flatpacked_components) - . = ..() + return ..() /obj/machinery/flatpacker/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = NONE @@ -219,7 +219,7 @@ return costs /obj/machinery/flatpacker/base_item_interaction(mob/living/user, obj/item/attacking_item, list/modifiers) - if(attacking_item.flags_1 & HOLOGRAM_1 || attacking_item.item_flags & ABSTRACT) + if(attacking_item.flags_1 & HOLOGRAM_1) return ITEM_INTERACT_SKIP_TO_ATTACK if(istype(attacking_item, /obj/item/circuitboard/machine)) @@ -373,7 +373,7 @@ say("No power to dispense sheets") return - materials.retrieve_sheets(amount, material) + materials.retrieve_stack(amount, material) return TRUE /** diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 993372e72e2a..b50fc10e723e 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -575,7 +575,7 @@ Possible to do for anyone motivated enough: /*This is the proc for special two-way communication between AI and holopad/people talking near holopad. For the other part of the code, check silicon say.dm. Particularly robot talk.*/ -/obj/machinery/holopad/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/obj/machinery/holopad/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/machinery/holopad/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) . = ..() if(speaker && LAZYLEN(masters) && !radio_freq)//Master is mostly a safety in case lag hits or something. Radio_freq so AIs dont hear holopad stuff through radios. for(var/mob/living/silicon/ai/master in masters) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 887c04ebedee..285b19b6c4bb 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -10,6 +10,7 @@ armor_type = /datum/armor/machinery_igniter resistance_flags = FIRE_PROOF processing_flags = NONE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5 + HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT / 2) var/id = null var/on = FALSE @@ -163,7 +164,8 @@ 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() + if(mapload) + find_and_mount_on_atom() /obj/machinery/sparker/Destroy() QDEL_NULL(spark_system) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index d606556985b3..8e400fc964a0 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -1,7 +1,3 @@ -///IV drip operation mode when it sucks blood from the object -#define IV_TAKING 0 -///IV drip operation mode when it injects reagents into the object -#define IV_INJECTING 1 ///What the transfer rate value is rounded to #define IV_TRANSFER_RATE_STEP 0.01 ///Minimum possible IV drip transfer rate in units per second @@ -24,6 +20,7 @@ mouse_drag_pointer = MOUSE_ACTIVE_POINTER use_power = NO_POWER_USE interaction_flags_mouse_drop = NEED_HANDS + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.1, /datum/material/plastic = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.2) /// Information and effects about where the IV drip is attached to var/datum/iv_drip_attachment/attachment @@ -264,7 +261,7 @@ return // If the human is losing too much blood, beep. - if(attached_mob.blood_volume < BLOOD_VOLUME_SAFE && prob(5)) + if(attached_mob.get_blood_volume(apply_modifiers = TRUE) < BLOOD_VOLUME_SAFE && prob(5)) audible_message(span_hear("[src] beeps loudly.")) playsound(loc, 'sound/machines/beep/twobeep_high.ogg', 50, TRUE) var/atom/movable/target = use_internal_storage ? src : reagent_container @@ -273,10 +270,12 @@ /obj/machinery/iv_drip/attack_hand_secondary(mob/user, list/modifiers) . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return - if(!ishuman(user)) + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || !ishuman(user)) return + if (quick_toggle(user)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/iv_drip/proc/quick_toggle(mob/user) if(attachment) visible_message(span_notice("[attachment.attached_to] is detached from [src].")) detach_iv() @@ -284,7 +283,7 @@ eject_beaker(user) else toggle_mode() - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return TRUE ///called when an IV is attached /obj/machinery/iv_drip/proc/attach_iv(atom/target, mob/user) @@ -456,10 +455,8 @@ /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!" - icon_state = ALERT_IV_CONNECTED - -#undef IV_TAKING -#undef IV_INJECTING + use_user_hud_icon = TRUE + overlay_state = "iv_connected" #undef MIN_IV_TRANSFER_RATE #undef MAX_IV_TRANSFER_RATE diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 471e43f94130..e45daf7a98e5 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -38,8 +38,8 @@ /obj/machinery/launchpad/Initialize(mapload) . = ..() prepare_huds() - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_atom_to_hud(src) + var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC] + diag_hud.add_atom_to_hud(src) update_hud() @@ -57,8 +57,8 @@ return ..() /obj/machinery/launchpad/Destroy() - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.remove_atom_from_hud(src) + var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC] + diag_hud.remove_atom_from_hud(src) return ..() /obj/machinery/launchpad/examine(mob/user) @@ -104,9 +104,7 @@ update_indicator() if(stationary) - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/bluespace_launchpad, - )) + AddComponent(/datum/component/usb_port, typecacheof(list(/obj/item/circuit_component/bluespace_launchpad), only_root_path = TRUE)) /// Whether this launchpad can send or receive. /obj/machinery/launchpad/proc/is_available() diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index ceb5716849a7..58e5bdf209e3 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -23,9 +23,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light_switch, 26) AddComponent(/datum/component/redirect_attack_hand_from_turf) - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/light_switch, - )) + AddComponent(/datum/component/usb_port, typecacheof(list(/obj/item/circuit_component/light_switch), only_root_path = TRUE)) if(istext(area)) area = text2path(area) if(ispath(area)) @@ -34,7 +32,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light_switch, 26) area = get_area(src) if(autoname) name = "light switch ([area.name])" - find_and_hang_on_wall(custom_drop_callback = CALLBACK(src, PROC_REF(deconstruct), TRUE)) + if(mapload) + find_and_mount_on_atom() register_context() update_appearance() diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index f3d8e236c73c..39564a41609c 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -33,7 +33,7 @@ stored_research = GLOB.autounlock_techwebs[/datum/techweb/autounlocking/limbgrower] . = ..() AddComponent(/datum/component/plumbing/simple_demand) - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) register_context() /obj/machinery/limbgrower/add_context(atom/source, list/context, obj/item/held_item, mob/user) diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm index a10aff9f448f..3b8ef7cd22f7 100644 --- a/code/game/machinery/medical_kiosk.dm +++ b/code/game/machinery/medical_kiosk.dm @@ -10,8 +10,6 @@ /// Shows if the machine is being used for a reagent scan. #define KIOSK_SCANNING_REAGENTS (1<<3) - - /obj/machinery/medical_kiosk name = "medical kiosk" desc = "A freestanding medical kiosk, which can provide a wide range of medical analysis for diagnosis." @@ -114,34 +112,40 @@ return board.custom_cost -/obj/machinery/medical_kiosk/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) - if(default_deconstruction_screwdriver(user, "[base_icon_state]_open", "[base_icon_state]_off", O)) - return - else if(default_deconstruction_crowbar(O)) - return - - if(istype(O, /obj/item/scanner_wand)) - var/obj/item/scanner_wand/W = O - if(scanner_wand) - balloon_alert(user, "already has a wand!") - return - if(HAS_TRAIT(O, TRAIT_NODROP) || !user.transferItemToLoc(O, src)) - balloon_alert(user, "stuck to your hand!") - return - 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()) - if(patient_ref != target_ref) - clearScans() - patient_ref = target_ref - user.visible_message(span_notice("[W.return_patient()] has been set as the current patient.")) - W.selected_target = null - playsound(src, 'sound/machines/click.ogg', 50, TRUE) - scanner_wand = O - return - return ..() +/obj/machinery/medical_kiosk/screwdriver_act(mob/living/user, obj/item/tool) + if(default_deconstruction_screwdriver(user, "[base_icon_state]_open", "[base_icon_state]_off", tool)) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING + +/obj/machinery/medical_kiosk/crowbar_act(mob/living/user, obj/item/tool) + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING + +/obj/machinery/medical_kiosk/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/scanner_wand)) + return NONE + + var/obj/item/scanner_wand/wand = tool + if(scanner_wand) + balloon_alert(user, "already has a wand!") + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + balloon_alert(user, "stuck to your hand!") + return ITEM_INTERACT_BLOCKING + user.visible_message(span_notice("[user] snaps [tool] 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(wand.selected_target) + var/datum/weakref/target_ref = WEAKREF(wand.return_patient()) + if(patient_ref != target_ref) + clearScans() + patient_ref = target_ref + user.visible_message(span_notice("[wand.return_patient()] has been set as the current patient.")) + wand.selected_target = null + playsound(src, 'sound/machines/click.ogg', 50, TRUE) + scanner_wand = tool + return ITEM_INTERACT_SUCCESS /obj/machinery/medical_kiosk/attack_hand_secondary(mob/user, list/modifiers) . = ..() @@ -221,10 +225,10 @@ var/patient_status = "Alive." var/max_health = patient.maxHealth var/total_health = patient.health - var/brute_loss = patient.getBruteLoss() - var/fire_loss = patient.getFireLoss() - var/tox_loss = patient.getToxLoss() - var/oxy_loss = patient.getOxyLoss() + var/brute_loss = patient.get_brute_loss() + var/fire_loss = patient.get_fire_loss() + var/tox_loss = patient.get_tox_loss() + var/oxy_loss = patient.get_oxy_loss() var/chaos_modifier = 0 var/sickness = "Patient does not show signs of disease." @@ -232,7 +236,7 @@ var/bleed_status = "Patient is not currently bleeding." var/blood_status = " Patient either has no blood, or does not require it to function." - var/blood_percent = round((patient.blood_volume / BLOOD_VOLUME_NORMAL) * 100) + var/blood_percent = round((patient.get_blood_volume(apply_modifiers = TRUE) / BLOOD_VOLUME_NORMAL) * 100) var/datum/blood_type/blood_type = patient.get_bloodtype() var/blood_name = "error" var/blood_warning = " " diff --git a/code/game/machinery/medipen_refiller.dm b/code/game/machinery/medipen_refiller.dm index 3f365ff3b1de..336554771f54 100644 --- a/code/game/machinery/medipen_refiller.dm +++ b/code/game/machinery/medipen_refiller.dm @@ -24,7 +24,7 @@ /obj/machinery/medipen_refiller/Initialize(mapload) . = ..() AddComponent(/datum/component/plumbing/simple_demand) - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) register_context() /obj/machinery/medipen_refiller/add_context(atom/source, list/context, obj/item/held_item, mob/user) diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index a3f1859fe26e..a1e6726b129a 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -25,7 +25,7 @@ /// codes as set on map: "tag1;tag2" or "tag1=value;tag2=value" var/codes_txt = "" - req_one_access = list(ACCESS_ENGINEERING, ACCESS_ROBOTICS) + req_one_access = list(ACCESS_CARGO, ACCESS_ENGINEERING, ACCESS_ROBOTICS) /datum/armor/machinery_navbeacon melee = 70 diff --git a/code/game/machinery/newscaster/newscaster_data.dm b/code/game/machinery/newscaster/newscaster_data.dm index 59b8f09db477..b10f0fd74f64 100644 --- a/code/game/machinery/newscaster/newscaster_data.dm +++ b/code/game/machinery/newscaster/newscaster_data.dm @@ -165,8 +165,8 @@ GLOBAL_LIST_EMPTY(request_list) var/message_count = 0 /datum/feed_network/New() - create_feed_channel(NEWSCASTER_STATION_ANNOUNCEMENTS, "SS13", "Company news, staff announcements, and all the latest information. Have a secure shift!", locked = TRUE) - create_feed_channel(NEWSCASTER_SPACE_BETTING, "NtOS", "News from the SpaceBet PDA App! Download now and make your own bets!", locked = TRUE) + create_feed_channel(NEWSCASTER_STATION_ANNOUNCEMENTS, NEWSPAPER_COMPANY, "Local news, Help Wanted, and all the hottest stories!", locked = TRUE) // DARKPACK EDIT CHANGE + // create_feed_channel(NEWSCASTER_SPACE_BETTING, "NtOS", "News from the SpaceBet PDA App! Download now and make your own bets!", locked = TRUE) // DARKPACK EDIT REMOVAL wanted_issue = new /datum/wanted_message /datum/feed_network/proc/add_feed_channel(datum/feed_channel/new_channel) diff --git a/code/game/machinery/newscaster/newscaster_machine.dm b/code/game/machinery/newscaster/newscaster_machine.dm index bea301dbc647..08180d53a91b 100644 --- a/code/game/machinery/newscaster/newscaster_machine.dm +++ b/code/game/machinery/newscaster/newscaster_machine.dm @@ -72,12 +72,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) -/obj/machinery/newscaster/Initialize(mapload, ndir, building) +/obj/machinery/newscaster/Initialize(mapload) . = ..() GLOB.allCasters += src GLOB.allbountyboards += src update_appearance() - find_and_hang_on_wall() + if(mapload) + find_and_mount_on_atom() /obj/machinery/newscaster/Destroy() GLOB.allCasters -= src @@ -877,7 +878,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 30, TRUE) return TRUE payment_target.transfer_money(current_user, active_request.value, "Bounty Request") - say("Paid out [active_request.value] credits.") + say("Paid out [active_request.value] [MONEY_NAME].") GLOB.request_list.Remove(active_request) qdel(active_request) diff --git a/code/game/machinery/newscaster/newspaper.dm b/code/game/machinery/newscaster/newspaper.dm index 481964066dce..bb85ffbd89d3 100644 --- a/code/game/machinery/newscaster/newspaper.dm +++ b/code/game/machinery/newscaster/newspaper.dm @@ -5,7 +5,7 @@ */ /obj/item/newspaper name = "newspaper" - desc = "An issue of The Griffon, the newspaper circulating in the city." // DARKPACK EDIT CHANGE + desc = "An issue of " + NEWSPAPER_COMPANY + ", the newspaper circulating around " + CITY_NAME + " and surrounding cities." // DARKPACK EDIT CHANGE icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "newspaper" inhand_icon_state = "newspaper" @@ -234,6 +234,7 @@ "name" = news_channels.channel_name, "page_number" = news_content.Find(news_channels), )) + data["newspaper_company"] = NEWSPAPER_COMPANY // DARKPACK EDIT ADD return data /obj/item/newspaper/ui_data(mob/user) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index a4b4ef8af319..cc52f2793dfd 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -19,6 +19,7 @@ Buildable meters icon_state_preview = "manifold4w" inhand_icon_state = "buildpipe" w_class = WEIGHT_CLASS_NORMAL + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) ///Piping layer that we are going to be on var/piping_layer = PIPING_LAYER_DEFAULT ///Type of pipe-object made, selected from the RPD @@ -42,65 +43,100 @@ Buildable meters */ // DARKPACK EDIT REMOVE /obj/item/pipe/directional RPD_type = PIPE_UNARY + /obj/item/pipe/directional/he_junction icon_state_preview = "junction" pipe_type = /obj/machinery/atmospherics/pipe/heat_exchanging/junction + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) + /obj/item/pipe/directional/vent name = "air vent fitting" icon_state_preview = "uvent" pipe_type = /obj/machinery/atmospherics/components/unary/vent_pump + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6 + SMALL_MATERIAL_AMOUNT / 2, /datum/material/glass = SMALL_MATERIAL_AMOUNT / 2) + /obj/item/pipe/directional/scrubber name = "air scrubber fitting" icon_state_preview = "scrubber" pipe_type = /obj/machinery/atmospherics/components/unary/vent_scrubber + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6 + SMALL_MATERIAL_AMOUNT / 2, /datum/material/glass = SMALL_MATERIAL_AMOUNT / 2) + /obj/item/pipe/directional/connector icon_state_preview = "connector" pipe_type = /obj/machinery/atmospherics/components/unary/portables_connector + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) + /obj/item/pipe/directional/passive_vent icon_state_preview = "pvent" pipe_type = /obj/machinery/atmospherics/components/unary/passive_vent + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) + /obj/item/pipe/directional/injector icon_state_preview = "injector" pipe_type = /obj/machinery/atmospherics/components/unary/outlet_injector + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SMALL_MATERIAL_AMOUNT / 2) + /obj/item/pipe/directional/he_exchanger icon_state_preview = "heunary" pipe_type = /obj/machinery/atmospherics/components/unary/heat_exchanger + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT, /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT) + /obj/item/pipe/directional/airlock_pump icon_state_preview = "airlock_pump" pipe_type = /obj/machinery/atmospherics/components/unary/airlock_pump + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.7) + /obj/item/pipe/binary RPD_type = PIPE_STRAIGHT + /obj/item/pipe/binary/layer_adapter icon_state_preview = "manifoldlayer" pipe_type = /obj/machinery/atmospherics/pipe/layer_manifold + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) + /obj/item/pipe/binary/color_adapter icon_state_preview = "adapter_center" pipe_type = /obj/machinery/atmospherics/pipe/color_adapter + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) + /obj/item/pipe/binary/pressure_pump icon_state_preview = "pump" pipe_type = /obj/machinery/atmospherics/components/binary/pump + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6, /datum/material/glass = SMALL_MATERIAL_AMOUNT / 2) + /obj/item/pipe/binary/manual_valve icon_state_preview = "mvalve" pipe_type = /obj/machinery/atmospherics/components/binary/valve + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) + /obj/item/pipe/binary/bendable RPD_type = PIPE_BENDABLE + /obj/item/pipe/trinary RPD_type = PIPE_TRINARY + /obj/item/pipe/trinary/flippable RPD_type = PIPE_TRIN_M var/flipped = FALSE + /obj/item/pipe/trinary/flippable/filter name = "gas filter fitting" icon_state_preview = "filter" pipe_type = /obj/machinery/atmospherics/components/trinary/filter + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6, /datum/material/glass = SMALL_MATERIAL_AMOUNT / 2) + /obj/item/pipe/trinary/flippable/mixer icon_state_preview = "mixer" pipe_type = /obj/machinery/atmospherics/components/trinary/mixer + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6, /datum/material/glass = SMALL_MATERIAL_AMOUNT / 2) + /obj/item/pipe/quaternary RPD_type = PIPE_ONEDIR + /obj/item/pipe/quaternary/pipe icon_state_preview = "manifold4w" pipe_type = /obj/machinery/atmospherics/pipe/smart + /obj/item/pipe/quaternary/pipe/crafted /obj/item/pipe/quaternary/pipe/crafted/Initialize(mapload, _pipe_type, _dir, obj/machinery/atmospherics/make_from, device_color, device_init_dir = SOUTH) @@ -114,6 +150,7 @@ Buildable meters /obj/item/pipe/quaternary/he_pipe icon_state_preview = "he_manifold4w" pipe_type = /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) /obj/item/pipe/Initialize(mapload, _pipe_type, _dir, obj/machinery/atmospherics/make_from, device_color, device_init_dir = SOUTH) if(make_from) @@ -129,7 +166,7 @@ Buildable meters pixel_y += rand(-5, 5) //Flipping handled manually due to custom handling for trinary pipes - AddComponent(/datum/component/simple_rotation, ROTATION_NO_FLIPPING) + AddElement(/datum/element/simple_rotation, ROTATION_NO_FLIPPING) // Only 'normal' pipes if(type != /obj/item/pipe/quaternary) @@ -393,7 +430,7 @@ Buildable meters if(prob(20)) C.spew_organ() sleep(0.5 SECONDS) - C.blood_volume = 0 + C.set_blood_volume(0) return(OXYLOSS|BRUTELOSS) /obj/item/pipe/examine(mob/user) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 58123bc23232..e7a9826b1832 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -84,7 +84,7 @@ DEFINE_BITFIELD(turret_flags, list( /// World.time the turret last fired var/last_fired = 0 /// Ticks until next shot (1.5 ?) - var/shot_delay = 15 + var/shot_delay = 1.5 SECONDS /// Turret flags about who is turret allowed to shoot var/turret_flags = TURRET_FLAG_SHOOT_CRIMINALS | TURRET_FLAG_SHOOT_ANOMALOUS /// Determines if the turret is on @@ -830,7 +830,7 @@ DEFINE_BITFIELD(turret_flags, list( /obj/machinery/porta_turret/syndicate/shuttle scan_range = 9 - shot_delay = 3 + shot_delay = 3 DECISECONDS stun_projectile = /obj/projectile/bullet/p50/penetrator/shuttle lethal_projectile = /obj/projectile/bullet/p50/penetrator/shuttle lethal_projectile_sound = 'sound/items/weapons/gun/smg/shot.ogg' @@ -928,212 +928,6 @@ DEFINE_BITFIELD(turret_flags, list( stun_projectile = /obj/projectile/kinetic/miner stun_projectile_sound = 'sound/items/weapons/kinetic_accel.ogg' -//////////////////////// -//Turret Control Panel// -//////////////////////// - -/obj/machinery/turretid - name = "turret control panel" - desc = "Used to control a room's automated defenses." - icon = 'icons/obj/machines/turret_control.dmi' - icon_state = "control_standby" - base_icon_state = "control" - density = FALSE - req_access = list(ACCESS_AI_UPLOAD) - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - interaction_flags_click = ALLOW_SILICON_REACH - /// Variable dictating if linked turrets are active and will shoot targets - var/enabled = TRUE - /// Variable dictating if linked turrets will shoot lethal projectiles - var/lethal = FALSE - /// Variable dictating if the panel is locked, preventing changes to turret settings - var/locked = TRUE - /// An area in which linked turrets are located, it can be an area name, path or nothing - var/control_area = null - /// AI is unable to use this machine if set to TRUE - var/ailock = FALSE - /// Variable dictating if linked turrets will shoot cyborgs - var/shoot_cyborgs = FALSE - /// List of weakrefs to all turrets - var/list/turrets = list() - -/obj/machinery/turretid/Initialize(mapload, ndir = 0, built = 0) - . = ..() - if(built) - locked = FALSE - power_change() //Checks power and initial settings - find_and_hang_on_wall() - -/obj/machinery/turretid/Destroy() - turrets.Cut() - return ..() - -/obj/machinery/turretid/Initialize(mapload) //map-placed turrets autolink turrets - . = ..() - if(!mapload) - return - - // The actual area that control_area refers to - var/area/control_area_instance - - if(control_area) - control_area_instance = get_area_instance_from_text(control_area) - if(!control_area_instance) - log_mapping("Bad control_area path for [src] at [AREACOORD(src)]: [control_area]") - if(!control_area_instance) - control_area_instance = get_area(src) - - for(var/obj/machinery/porta_turret/T in control_area_instance) - turrets |= WEAKREF(T) - -/obj/machinery/turretid/examine(mob/user) - . += ..() - if(issilicon(user) && !(machine_stat & BROKEN)) - . += {"[span_notice("Ctrl-click [src] to [ enabled ? "disable" : "enable"] turrets.")] - [span_notice("Alt-click [src] to set turrets to [ lethal ? "stun" : "kill"].")]"} - -/obj/machinery/turretid/multitool_act(mob/living/user, obj/item/multitool/multi_tool) - . = NONE - if(machine_stat & BROKEN) - return - - if(multi_tool.buffer && istype(multi_tool.buffer, /obj/machinery/porta_turret)) - turrets |= WEAKREF(multi_tool.buffer) - to_chat(user, span_notice("You link \the [multi_tool.buffer] with \the [src].")) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/turretid/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) - if(machine_stat & BROKEN) - return - - if (issilicon(user)) - return attack_hand(user) - - var/id = attacking_item.GetID() - - if(isnull(id)) - return - - if (check_access(id)) - if(obj_flags & EMAGGED) - to_chat(user, span_warning("The turret control is unresponsive!")) - return - - locked = !locked - to_chat(user, span_notice("You [ locked ? "lock" : "unlock"] the panel.")) - else - to_chat(user, span_alert("Access denied.")) - -/obj/machinery/turretid/emag_act(mob/user, obj/item/card/emag/emag_card) - if(obj_flags & EMAGGED) - 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)) - return attack_hand(user) - else - to_chat(user, span_warning("There seems to be a firewall preventing you from accessing this device!")) - -/obj/machinery/turretid/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "TurretControl", name) - ui.open() - -/obj/machinery/turretid/ui_data(mob/user) - var/list/data = list() - data["locked"] = locked - data["siliconUser"] = HAS_SILICON_ACCESS(user) - data["enabled"] = enabled - data["lethal"] = lethal - data["shootCyborgs"] = shoot_cyborgs - return data - -/obj/machinery/turretid/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - - var/mob/user = ui.user - - switch(action) - if("lock") - if(!HAS_SILICON_ACCESS(user)) - return - if((obj_flags & EMAGGED) || (machine_stat & BROKEN)) - to_chat(user, span_warning("The turret control is unresponsive!")) - return - locked = !locked - return TRUE - if("power") - toggle_on(user) - return TRUE - if("mode") - toggle_lethal(user) - return TRUE - if("shoot_silicons") - shoot_silicons(user) - return TRUE - -/obj/machinery/turretid/proc/toggle_lethal(mob/user) - lethal = !lethal - 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 - 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 - if (user) - var/status = shoot_cyborgs ? "Shooting Borgs" : "Not Shooting Borgs" - balloon_alert(user, LOWER_TEXT(status)) - add_hiddenprint(user) - log_combat(user, src, "[status]") - updateTurrets() - -/obj/machinery/turretid/proc/updateTurrets() - for (var/datum/weakref/turret_ref in turrets) - var/obj/machinery/porta_turret/turret = turret_ref.resolve() - if(!turret) - turrets -= turret_ref - continue - turret.setState(enabled, lethal, shoot_cyborgs) - update_appearance() - -/obj/machinery/turretid/update_icon_state() - if(machine_stat & NOPOWER) - icon_state = "[base_icon_state]_off" - return ..() - if (enabled) - icon_state = "[base_icon_state]_[lethal ? "kill" : "stun"]" - return ..() - icon_state = "[base_icon_state]_standby" - return ..() - -/obj/item/wallframe/turret_control - name = "turret control frame" - desc = "Used for building turret control panels." - icon = 'icons/obj/machines/turret_control.dmi' - icon_state = "control_frame" - result_path = /obj/machinery/turretid - custom_materials = list(/datum/material/iron= SHEET_MATERIAL_AMOUNT) - pixel_shift = 29 - /obj/item/gun/proc/get_turret_properties() . = list() .["lethal_projectile"] = null @@ -1175,7 +969,7 @@ DEFINE_BITFIELD(turret_flags, list( .["stun_projectile"] = /obj/projectile/beam/lasertag/bluetag .["lethal_projectile"] = /obj/projectile/beam/lasertag/bluetag .["base_icon_state"] = "blue" - .["shot_delay"] = 30 + .["shot_delay"] = 3 SECONDS .["team_color"] = "blue" /obj/item/gun/energy/laser/redtag/get_turret_properties() @@ -1183,7 +977,7 @@ DEFINE_BITFIELD(turret_flags, list( .["stun_projectile"] = /obj/projectile/beam/lasertag/redtag .["lethal_projectile"] = /obj/projectile/beam/lasertag/redtag .["base_icon_state"] = "red" - .["shot_delay"] = 30 + .["shot_delay"] = 3 SECONDS .["team_color"] = "red" /obj/item/gun/energy/e_gun/turret/get_turret_properties() @@ -1239,7 +1033,7 @@ DEFINE_BITFIELD(turret_flags, list( /obj/machinery/porta_turret/lasertag/bullet_act(obj/projectile/projectile) . = ..() - if(!on) + if(!on || . != BULLET_ACT_HIT) return if(team_color == "blue" && istype(projectile, /obj/projectile/beam/lasertag/redtag)) set_disabled(10 SECONDS) diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index 93b0ada37fad..6b06894e0106 100644 --- a/code/game/machinery/porta_turret/portable_turret_construct.dm +++ b/code/game/machinery/porta_turret/portable_turret_construct.dm @@ -15,7 +15,9 @@ desc = "An unfinished covered turret frame." anchored = FALSE density = TRUE + obj_flags = UNIQUE_RENAME | RENAME_NO_DESC use_power = NO_POWER_USE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5) var/build_step = PTURRET_UNSECURED //the current step in the building process var/finish_name = "turret" //the name applied to the product turret var/obj/item/gun/installed_gun = null @@ -192,6 +194,12 @@ return return ..() +/obj/machinery/porta_turret_construct/nameformat(input, user) + finish_name = input + return input + +/obj/machinery/porta_turret_construct/rename_reset() + finish_name = initial(finish_name) /obj/machinery/porta_turret_construct/attack_hand(mob/user, list/modifiers) . = ..() diff --git a/code/game/machinery/porta_turret/turret_control.dm b/code/game/machinery/porta_turret/turret_control.dm new file mode 100644 index 000000000000..c1b436f3dcc1 --- /dev/null +++ b/code/game/machinery/porta_turret/turret_control.dm @@ -0,0 +1,214 @@ +/obj/machinery/turretid + name = "turret control panel" + desc = "Used to control a room's automated defenses." + icon = 'icons/obj/machines/turret_control.dmi' + icon_state = "control" + base_icon_state = "control" + density = FALSE + req_access = list(ACCESS_AI_UPLOAD) + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + interaction_flags_click = ALLOW_SILICON_REACH + /// Variable dictating if linked turrets are active and will shoot targets + var/enabled = TRUE + /// Variable dictating if linked turrets will shoot lethal projectiles + var/lethal = FALSE + /// Variable dictating if the panel is locked, preventing changes to turret settings + var/locked = TRUE + /// An area in which linked turrets are located, it can be an area name, path or nothing + var/control_area = null + /// AI is unable to use this machine if set to TRUE + var/ailock = FALSE + /// Variable dictating if linked turrets will shoot cyborgs + var/shoot_cyborgs = FALSE + /// List of weakrefs to all turrets + var/list/turrets = list() + +/obj/machinery/turretid/Initialize(mapload) + . = ..() + + if(mapload) + find_and_mount_on_atom() + else + locked = FALSE + power_change() + + var/area/control_area_instance + + if(control_area) + control_area_instance = get_area_instance_from_text(control_area) + if(!control_area_instance) + log_mapping("Bad control_area path for [src] at [AREACOORD(src)]: [control_area]") + + if(!control_area_instance) + control_area_instance = get_area(src) + + for(var/obj/machinery/porta_turret/T in control_area_instance) + turrets |= WEAKREF(T) + +/obj/machinery/turretid/Destroy() + turrets.Cut() + return ..() + +/obj/machinery/turretid/update_overlays() + . = ..() + if(machine_stat & NOPOWER) + if(enabled) + . += mutable_appearance(icon, "button_left") + if(lethal) + . += mutable_appearance(icon, "button_right") + return + + if(enabled) + . += mutable_appearance(icon, "button_left") + . += emissive_appearance(icon, "emissive_button_left", src) + if(lethal) + . += mutable_appearance(icon, "kill") + . += mutable_appearance(icon, "button_right") + . += emissive_appearance(icon, "emissive_button_right", src) + else + . += mutable_appearance(icon, "stun") + else + . += mutable_appearance(icon, "standby") + . += emissive_appearance(icon, "emissive_screen", src) + +/obj/machinery/turretid/power_change() + . = ..() + update_appearance(UPDATE_OVERLAYS) + +/obj/machinery/turretid/examine(mob/user) + . += ..() + if(issilicon(user) && !(machine_stat & BROKEN)) + . += span_notice("Ctrl-click [src] to [ enabled ? "disable" : "enable"] turrets.") + . += span_notice("Alt-click [src] to set turrets to [ lethal ? "stun" : "kill"].") + +/obj/machinery/turretid/multitool_act(mob/living/user, obj/item/multitool/multi_tool) + . = NONE + if(machine_stat & BROKEN) + return + + if(multi_tool.buffer && istype(multi_tool.buffer, /obj/machinery/porta_turret)) + turrets |= WEAKREF(multi_tool.buffer) + to_chat(user, span_notice("You link \the [multi_tool.buffer] with \the [src].")) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/turretid/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) + if(machine_stat & BROKEN) + return + + if (issilicon(user)) + return attack_hand(user) + + var/id = attacking_item.GetID() + + if(isnull(id)) + return + + if (check_access(id)) + if(obj_flags & EMAGGED) + to_chat(user, span_warning("The turret control is unresponsive!")) + return + + locked = !locked + to_chat(user, span_notice("You [ locked ? "lock" : "unlock"] the panel.")) + else + to_chat(user, span_alert("Access denied.")) + +/obj/machinery/turretid/emag_act(mob/user, obj/item/card/emag/emag_card) + if(obj_flags & EMAGGED) + 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)) + return attack_hand(user) + else + to_chat(user, span_warning("There seems to be a firewall preventing you from accessing this device!")) + +/obj/machinery/turretid/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "TurretControl", name) + ui.open() + +/obj/machinery/turretid/ui_data(mob/user) + var/list/data = list() + data["locked"] = locked + data["siliconUser"] = HAS_SILICON_ACCESS(user) + data["enabled"] = enabled + data["lethal"] = lethal + data["shootCyborgs"] = shoot_cyborgs + return data + +/obj/machinery/turretid/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + var/mob/user = ui.user + + switch(action) + if("lock") + if(!HAS_SILICON_ACCESS(user)) + return + if((obj_flags & EMAGGED) || (machine_stat & BROKEN)) + to_chat(user, span_warning("The turret control is unresponsive!")) + return + locked = !locked + return TRUE + if("power") + toggle_on(user) + return TRUE + if("mode") + toggle_lethal(user) + return TRUE + if("shoot_silicons") + shoot_silicons(user) + return TRUE + +/obj/machinery/turretid/proc/toggle_lethal(mob/user) + lethal = !lethal + 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 + 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 + if (user) + var/status = shoot_cyborgs ? "Shooting Borgs" : "Not Shooting Borgs" + balloon_alert(user, LOWER_TEXT(status)) + add_hiddenprint(user) + log_combat(user, src, "[status]") + updateTurrets() + +/obj/machinery/turretid/proc/updateTurrets() + for (var/datum/weakref/turret_ref in turrets) + var/obj/machinery/porta_turret/turret = turret_ref.resolve() + if(!turret) + turrets -= turret_ref + continue + turret.setState(enabled, lethal, shoot_cyborgs) + update_appearance() + +/obj/item/wallframe/turret_control + name = "turret control frame" + desc = "Used for building turret control panels." + icon = 'icons/obj/machines/turret_control.dmi' + icon_state = "control_frame" + result_path = /obj/machinery/turretid + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6) + pixel_shift = 30 diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index 4f13690290e1..d09f2af6e7a6 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -23,9 +23,7 @@ if(map_pad_id) mapped_quantum_pads[map_pad_id] = src - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/quantumpad, - )) + AddComponent(/datum/component/usb_port, typecacheof(list(/obj/item/circuit_component/quantumpad), only_root_path = TRUE)) /obj/machinery/quantumpad/Destroy() mapped_quantum_pads -= map_pad_id diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index a655972eb3be..2b5196b947e7 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -12,8 +12,6 @@ var/recharge_coeff = 1 /// Did we put power into "charging" last process()? var/using_power = FALSE - /// Did we finish recharging the currently inserted item? - var/finished_recharging = FALSE /// List of items that can be recharged var/static/list/allowed_devices = typecacheof(list( /obj/item/gun/energy, @@ -71,7 +69,6 @@ charging = arrived START_PROCESSING(SSmachines, src) update_use_power(ACTIVE_POWER_USE) - finished_recharging = FALSE using_power = TRUE update_appearance() return ..() @@ -156,17 +153,25 @@ if(charging_cell) if(charging_cell.charge < charging_cell.maxcharge) charge_cell(charging_cell.chargerate * recharge_coeff * seconds_per_tick, charging_cell) - using_power = TRUE + if(charging_cell.charge >= charging_cell.maxcharge) //Inserted thing is at max charge/ammo, notify those around us + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + say("[charging] has finished recharging!") + else + using_power = TRUE update_appearance() + return if(istype(charging, /obj/item/ammo_box/magazine/recharge)) //if you add any more snowflake ones, make sure to update the examine messages too. var/obj/item/ammo_box/magazine/recharge/power_pack = charging for(var/charge_iterations in 1 to recharge_coeff) - if(power_pack.stored_ammo.len >= power_pack.max_ammo) - break - power_pack.stored_ammo += new power_pack.ammo_type(power_pack) - use_energy(active_power_usage * seconds_per_tick) - using_power = TRUE + if(power_pack.stored_ammo.len < power_pack.max_ammo) + power_pack.stored_ammo += new power_pack.ammo_type(power_pack) + use_energy(active_power_usage * seconds_per_tick) + if(power_pack.stored_ammo >= power_pack.max_ammo) + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + say("[charging] has finished recharging!") + else + using_power = TRUE update_appearance() return @@ -179,18 +184,16 @@ using_power = TRUE else if(recalibrating_gun.shots_before_degradation < recalibrating_gun.max_shots_before_degradation) - recalibrating_gun.attempt_recalibration(TRUE, 1 * recharge_coeff) + recalibrating_gun.attempt_recalibration(TRUE, recharge_coeff) use_energy(active_power_usage * recharge_coeff * seconds_per_tick) - using_power = TRUE - + if(recalibrating_gun.shots_before_degradation == recalibrating_gun.max_shots_before_degradation) + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + say("[charging] has finished recalibrating!") + else + using_power = TRUE update_appearance() return - if(!using_power && !finished_recharging) //Inserted thing is at max charge/ammo, notify those around us - finished_recharging = TRUE - playsound(src, 'sound/machines/ping.ogg', 30, TRUE) - say("[charging] has finished recharging!") - /obj/machinery/recharger/emp_act(severity) . = ..() if (. & EMP_PROTECT_CONTENTS) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index e8a0a823871b..3eacf7b7f9f3 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -16,14 +16,14 @@ var/datum/callback/charge_cell ///Whether we're sending iron and glass to a cyborg. Requires Silo connection. var/sendmats = FALSE - var/datum/component/remote_materials/materials + var/datum/remote_materials/materials /obj/machinery/recharge_station/Initialize(mapload) . = ..() - materials = AddComponent( - /datum/component/remote_materials, \ + materials = new ( + src, \ mapload, \ mat_container_flags = MATCONTAINER_NO_INSERT, \ ) @@ -46,7 +46,7 @@ GLOB.roundstart_station_borgcharger_areas += area_name /obj/machinery/recharge_station/Destroy() - materials = null + QDEL_NULL(materials) charge_cell = null return ..() diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index dcbc5aa0e410..9ce642b513ff 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -16,16 +16,16 @@ var/crush_damage = 1000 var/eat_victim_items = TRUE var/item_recycle_sound = 'sound/items/tools/welder.ogg' - var/datum/component/material_container/materials + var/datum/material_container/materials /obj/machinery/recycler/Initialize(mapload) - materials = AddComponent( - /datum/component/material_container, \ + materials = new ( + src, \ SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ INFINITY, \ MATCONTAINER_NO_INSERT \ ) - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) AddComponent( /datum/component/butchering/recycler, \ speed = 0.1 SECONDS, \ @@ -45,7 +45,7 @@ AddElement(/datum/element/connect_loc, loc_connections) /obj/machinery/recycler/Destroy() - materials = null + QDEL_NULL(materials) return ..() /obj/machinery/recycler/RefreshParts() @@ -76,7 +76,7 @@ return SUCCESSFUL_UNFASTEN /obj/machinery/recycler/crowbar_act(mob/living/user, obj/item/tool) - if(default_pry_open(tool, close_after_pry = TRUE)) + if(default_deconstruction_crowbar(tool)) return ITEM_INTERACT_SUCCESS return ITEM_INTERACT_BLOCKING @@ -125,135 +125,144 @@ INVOKE_ASYNC(src, PROC_REF(eat), enterer) /obj/machinery/recycler/proc/eat(atom/movable/morsel, sound=TRUE) - if(machine_stat & (BROKEN|NOPOWER)) - return - if(safety_mode) - return - if(iseffect(morsel)) + if(machine_stat & (BROKEN|NOPOWER) || safety_mode) return if(!isturf(morsel.loc)) - return //I don't know how you called Crossed() but stop it. - if(morsel.resistance_flags & INDESTRUCTIBLE) + stack_trace("on_entered() called with invalid location: [morsel.loc]") // I don't know how you called Entered() but stop it. return - if(morsel.flags_1 & HOLOGRAM_1) - visible_message(span_notice("[morsel] fades away!")) - qdel(morsel) + if(morsel.resistance_flags & INDESTRUCTIBLE) return + /// Queue of objects to process. var/list/atom/to_eat = list(morsel) - - var/living_detected = FALSE //technically includes silicons as well but eh + /// Regular items to be recycled. var/list/nom = list() - var/list/crunchy_nom = list() //Mobs have to be handled differently so they get a different list instead of checking them multiple times. + /// Living mobs to be crushed. + var/list/crunchy_nom = list() // Mobs have to be handled differently so they get a different list instead of checking them multiple times. + /// Count of items that couldn't be processed. var/not_eaten = 0 - while (to_eat.len) - var/atom/movable/thing = to_eat[1] - to_eat -= thing + while(LAZYLEN(to_eat)) + var/atom/movable/thing = popleft(to_eat) - if (thing.flags_1 & HOLOGRAM_1) - qdel(thing) - continue + if(triggers_safety_shutdown(thing)) + emergency_stop() + return - if (thing.resistance_flags & INDESTRUCTIBLE) - if (!isturf(thing.loc) && !recursive_loc_check(thing, /mob/living)) + if(thing.resistance_flags & INDESTRUCTIBLE) + if(!isturf(thing.loc) && !recursive_loc_check(thing, /mob/living)) thing.forceMove(loc) - not_eaten += 1 + not_eaten++ continue - if (isliving(thing)) - living_detected = TRUE - crunchy_nom += thing - if (!issilicon(thing)) - to_eat |= thing.contents + if(thing.flags_1 & HOLOGRAM_1) + for(var/atom/movable/hologram_content as anything in thing.contents) + hologram_content.forceMove(loc) // we shouldn't qdel() the non-holographic content of the hologram. + visible_message(span_notice("[thing] fades away!")) + qdel(thing) continue - if (!isobj(thing)) - not_eaten += 1 + if(isliving(thing)) + LAZYADD(crunchy_nom, thing) + if(!issilicon(thing)) + LAZYOR(to_eat, thing.contents) continue - if (isitem(thing)) - var/obj/item/as_item = thing - if (as_item.item_flags & ABSTRACT) - not_eaten += 1 - continue + if(!isobj(thing)) + not_eaten++ + continue - // Prevent blindly deconstructing locked secure closets (head closets, important departmental orders, etc.) - // unless they have already been unlocked to prevent exploiting the recycler to bypass closet access. - if (iscloset(thing)) - var/obj/structure/closet/as_closet = thing - if (as_closet.secure && as_closet.locked) - not_eaten += 1 + if(isitem(thing)) + var/obj/item/item_thing = thing + if(item_thing.item_flags & ABSTRACT) + not_eaten++ continue - if (istype(thing, /obj/item/organ/brain) || istype(thing, /obj/item/dullahan_relay)) - living_detected = TRUE - - if (istype(thing, /obj/item/mmi)) - var/obj/item/mmi/mmi = thing - if (!isnull(mmi.brain)) - living_detected = TRUE + if(iscloset(thing)) + var/obj/structure/closet/closet_thing = thing + if(closet_thing.secure && closet_thing.locked) // Prevent blindly deconstructing locked secure closets (head closets, important departmental orders, etc.) + not_eaten++ // unless they have already been unlocked to prevent exploiting the recycler to bypass closet access. + continue - nom += thing - to_eat |= thing.contents + LAZYADD(nom, thing) + LAZYOR(to_eat, thing.contents) - if(living_detected) // First, check if we have any living beings detected. - if(obj_flags & EMAGGED) - for(var/CRUNCH in crunchy_nom) // Eat them and keep going because we don't care about safety. - if(!isliving(CRUNCH)) // MMIs and brains will get eaten like normal items - continue + for(var/mob/living/living_mob in crunchy_nom) + if(!is_operational) //we ran out of power after recycling a large amount to living stuff, time to stop + break + if(living_mob.incorporeal_move) + continue - var/mob/living/living_mob = CRUNCH - if(living_mob.incorporeal_move) - continue + crush_living(living_mob) + use_energy(active_power_usage) - if(!is_operational) //we ran out of power after recycling a large amount to living stuff, time to stop - break - crush_living(CRUNCH) - use_energy(active_power_usage) - else // Stop processing right now without eating anything. - emergency_stop() - return + var/nom_length = LAZYLEN(nom) /** * we process the list in reverse so that atoms without parents/contents are deleted first & their parents are deleted next & so on. * this is the reverse order in which get_all_contents() returns its list * if we delete an atom containing stuff then all its stuff are deleted with it as well so we will end recycling deleted items down the list and gain nothing from them */ - for(var/i = length(nom); i >= 1; i--) + for(var/i = nom_length; i >= 1; i--) if(!is_operational) //we ran out of power after recycling a large amount to items, time to stop break + var/full_power_usage = TRUE var/obj/nom_obj = nom[i] - if (isitem(nom_obj)) + + if(isitem(nom_obj)) // Whether or not items consume full power depends on if they produced a material when recycled. full_power_usage = recycle_item(nom_obj) else // When a non-item is eaten, we deconstruct it with dismantled = FALSE so that // it and its contents aren't just deleted. These always consume full power. nom_obj.deconstruct(FALSE) + use_energy(active_power_usage / (full_power_usage ? 1 : 2)) - if(nom.len && sound) - playsound(src, item_recycle_sound, (50 + nom.len * 5), TRUE, nom.len, ignore_walls = (nom.len - 10)) // As a substitute for playing 50 sounds at once. + if(nom_length && sound) + var/sound_volume = clamp(nom_length * 5, 50, 100) + var/walls_ignoring = max(nom_length - 10, 0) + playsound(src, item_recycle_sound, sound_volume, TRUE, nom_length, ignore_walls = walls_ignoring) // As a substitute for playing 50 sounds at once. + if(not_eaten) - playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', (50 + not_eaten * 5), FALSE, not_eaten, ignore_walls = (not_eaten - 10)) // Ditto. - -/obj/machinery/recycler/proc/recycle_item(obj/item/weapon) - . = FALSE - var/obj/item/grown/log/wood = weapon - if(istype(wood)) - var/seed_modifier = 0 - if(wood.seed) - seed_modifier = round(wood.seed.potency / 25) + var/sound_volume = clamp(not_eaten * 5, 50, 100) + var/walls_ignoring = max(not_eaten - 10, 0) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', sound_volume, FALSE, not_eaten, ignore_walls = walls_ignoring) // Ditto. + +/// Determines if the target should trigger an emergency stop due to safety concerns. +/obj/machinery/recycler/proc/triggers_safety_shutdown(atom/movable/target) + if(obj_flags & EMAGGED) + return FALSE // Emagged recycler ignores all safety checks. + + if(isliving(target)) + return TRUE + + if(isbrain(target) || istype(target, /obj/item/dullahan_relay)) + return TRUE + + if(istype(target, /obj/item/mmi)) + var/obj/item/mmi/mmi_thing = target + return !!(mmi_thing.brain) + + return FALSE + +/obj/machinery/recycler/proc/recycle_item(obj/item/target) + if(istype(target, /obj/item/grown/log)) + var/obj/item/grown/log/wood = target + var/seed_modifier = wood.seed ? round(wood.seed.potency / 25) : 0 new wood.plank_type(loc, 1 + seed_modifier) - . = TRUE - else - var/retrieved = materials.insert_item(weapon, multiplier = (amount_produced / 100)) - if(retrieved > 0) //item was salvaged i.e. deleted - materials.retrieve_all() - return TRUE - qdel(weapon) + qdel(target) + return TRUE + + var/retrieved = materials.insert_item(target, multiplier = (amount_produced / 100)) + if(retrieved > 0) //item was salvaged i.e. deleted + materials.retrieve_all() + qdel(target) + return TRUE + + qdel(target) + return FALSE /obj/machinery/recycler/proc/emergency_stop() playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) @@ -267,16 +276,13 @@ update_appearance() /obj/machinery/recycler/proc/crush_living(mob/living/living_mob) - living_mob.forceMove(loc) - if(issilicon(living_mob)) playsound(src, 'sound/items/tools/welder.ogg', 50, TRUE) else playsound(src, 'sound/effects/splat.ogg', 50, TRUE) - if(iscarbon(living_mob)) - if(living_mob.stat == CONSCIOUS) - living_mob.say("ARRRRRRRRRRRGH!!!", forced= "recycler grinding") + if(iscarbon(living_mob) && living_mob.stat == CONSCIOUS) + living_mob.say("ARRRRRRRRRRRGH!!!", forced= "recycler grinding") if(!issilicon(living_mob)) add_mob_blood(living_mob) @@ -284,7 +290,7 @@ // Instantly lie down, also go unconscious from the pain, before you die. living_mob.Unconscious(100) - living_mob.adjustBruteLoss(crush_damage) + living_mob.adjust_brute_loss(crush_damage) update_appearance() /obj/machinery/recycler/on_deconstruction(disassembled) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 44d6ebbffde0..018bfd65e500 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -128,7 +128,8 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) if(dept_key) LAZYADD(GLOB.reta_consoles_by_origin[dept_key], src) - find_and_hang_on_wall() + if(mapload) + find_and_mount_on_atom() /obj/machinery/requests_console/Destroy() QDEL_LIST(messages) @@ -190,7 +191,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) // Check if user can call this emergency (prevent self-calls) RETA var/user_dept = reta_get_user_department(usr) - if(user_dept == target_dept) + if(user_dept == target_dept && !isAdminGhostAI(usr)) to_chat(usr, span_alert("You cannot call your own department for emergency assistance.")) return @@ -201,6 +202,28 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) emergency = emergency_type + // Enhanced announcement with caller info + var/caller_info = "" + // Aghosts have no IDs, but they hold authorithy so instead calling them Unknowns just drop caller info completely + if(usr && isliving(usr)) + caller_info = "(Identification not provided)" + var/mob/living/caller_mob = usr + var/obj/item/card/id/ID = caller_mob.get_idcard() + if(ID) + caller_info = "(Called by [ID.registered_name], [ID.assignment])" + // Centcom still refuses to provide IDs to their silicons + else if (issilicon(caller_mob)) + caller_info = "(Called by [caller_mob.name], [caller_mob.job])" + // Cyborgs do not have their job var set, and this is wrong + if(iscyborg(caller_mob) && caller_mob?.mind?.assigned_role) + caller_info = "(Called by [caller_mob.name], [caller_mob.mind.assigned_role.title])" + + // If someone swiped their ID before + else if (message_verified_by) + caller_info = "(Last authentication: [message_verified_by])" + message_stamped_by = "" + message_verified_by = "" + // Grant RETA if conditions are met if(origin_dept && target_dept && CONFIG_GET(flag/reta_enabled)) // Set cooldown @@ -214,66 +237,56 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) // Track this call for multiple department analysis reta_track_call(origin_dept, target_dept) - // Enhanced announcement with caller info - var/caller_info = "" - if(usr) - var/caller_name = usr.real_name || "Unknown" - var/caller_title = "Unknown Position" - if(usr?.mind?.assigned_role) - caller_title = usr.mind.assigned_role.title - caller_info = " (Called by [caller_name], [caller_title])" - - var/enhanced_location = "[department][caller_info]" - switch(emergency_type) if(REQ_EMERGENCY_SECURITY) - aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = enhanced_location), null, list(RADIO_CHANNEL_SECURITY), REQ_EMERGENCY_SECURITY) + aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = department, "CALLER" = caller_info, "RETARESPONDERS" = granted_count), src, list(RADIO_CHANNEL_SECURITY), "Security") if(REQ_EMERGENCY_ENGINEERING) - aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = enhanced_location), null, list(RADIO_CHANNEL_ENGINEERING), REQ_EMERGENCY_ENGINEERING) + aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = department, "CALLER" = caller_info, "RETARESPONDERS" = granted_count), src, list(RADIO_CHANNEL_ENGINEERING), "Engineering") if(REQ_EMERGENCY_MEDICAL) - aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = enhanced_location), null, list(RADIO_CHANNEL_MEDICAL), REQ_EMERGENCY_MEDICAL) + aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = department, "CALLER" = caller_info, "RETARESPONDERS" = granted_count), src, list(RADIO_CHANNEL_MEDICAL), "Medical") // Send confirmation to the calling department about the RETA activation - var/calling_message = "RETA activated[caller_info]. [target_dept] personnel now have temporary access to your areas." - - // Get an announcement system to send simple radio messages - var/obj/machinery/announcement_system/announcer = get_announcement_system(null, null, list(RADIO_CHANNEL_COMMON)) - if(announcer) - switch(origin_dept) - if("Security") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_SECURITY) - if("Engineering") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_ENGINEERING) - if("Medical") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_MEDICAL) - if("Science") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_SCIENCE) - if("Service") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_SERVICE) - if("Command") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_COMMAND) - if("Cargo") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_SUPPLY) - if("Mining") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_SUPPLY) - + var/list/target_channels = list() + switch(origin_dept) + if("Security") + target_channels += RADIO_CHANNEL_SECURITY + if("Engineering") + target_channels += RADIO_CHANNEL_ENGINEERING + if("Medical") + target_channels += RADIO_CHANNEL_MEDICAL + if("Science") + target_channels += RADIO_CHANNEL_SCIENCE + if("Service") + target_channels += RADIO_CHANNEL_SERVICE + if("Command") + target_channels += RADIO_CHANNEL_COMMAND + if("Cargo") + target_channels += RADIO_CHANNEL_SUPPLY + if("Mining") + target_channels += RADIO_CHANNEL_SUPPLY + + // Do not announce if RETA failed to activate + if (granted_count) + aas_config_announce(/datum/aas_config_entry/rc_reta_announcement, list("GRANTEE" = target_dept, "CALLER" = caller_info), src, target_channels) // Log RETA activity log_game("RETA: [origin_dept] called [target_dept] emergency, granted access to [granted_count] responder IDs for [duration_ds/10] seconds") // Push UI updates to consoles in the same origin department reta_push_ui_updates(origin_dept, target_dept) + // Making sure our emergency is synced with RETA timers + addtimer(CALLBACK(src, PROC_REF(clear_emergency)), duration_ds) else // Normal emergency call without RETA switch(emergency_type) if(REQ_EMERGENCY_SECURITY) - aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = department), null, list(RADIO_CHANNEL_SECURITY), REQ_EMERGENCY_SECURITY) + aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = department, "CALLER" = caller_info), null, list(RADIO_CHANNEL_SECURITY), "Security") if(REQ_EMERGENCY_ENGINEERING) - aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = department), null, list(RADIO_CHANNEL_ENGINEERING), REQ_EMERGENCY_ENGINEERING) + aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = department, "CALLER" = caller_info), null, list(RADIO_CHANNEL_ENGINEERING), "Engineering") if(REQ_EMERGENCY_MEDICAL) - aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = department), null, list(RADIO_CHANNEL_MEDICAL), REQ_EMERGENCY_MEDICAL) + aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = department, "CALLER" = caller_info), null, list(RADIO_CHANNEL_MEDICAL), "Medical") + addtimer(CALLBACK(src, PROC_REF(clear_emergency)), 5 MINUTES) update_appearance() - addtimer(CALLBACK(src, PROC_REF(clear_emergency)), 5 MINUTES) return TRUE if("send_announcement") if(!COOLDOWN_FINISHED(src, announcement_cooldown)) @@ -534,20 +547,96 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/requests_console/auto_name, 30) icon_state = "req_comp_off" result_path = /obj/machinery/requests_console/auto_name pixel_shift = 30 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7) /datum/aas_config_entry/rc_emergency - name = "RC Alert: Emergency" + name = "RC Alert: Emergency Request" announcement_lines_map = list( - "Security" = "SECURITY EMERGENCY in %LOCATION - RETA door access granted to responders!", - "Engineering" = "ENGINEERING EMERGENCY in %LOCATION - RETA door access granted to responders!", - "Medical" = "MEDICAL EMERGENCY in %LOCATION - RETA door access granted to responders!", + REQ_EMERGENCY_SECURITY = "SECURITY EMERGENCY in %LOCATION %CALLER!!!", + REQ_EMERGENCY_ENGINEERING = "ENGINEERING EMERGENCY in %LOCATION %CALLER!!!", + REQ_EMERGENCY_MEDICAL = "MEDICAL EMERGENCY in %LOCATION %CALLER!!!", ) + vars_and_tooltips_map = list( - "LOCATION" = "will be replaced with the department name and caller information (Name, Job Title)", + "LOCATION" = "will be replaced with the department name", + "CALLER" = "with caller name and job if applicable", ) +/datum/aas_config_entry/rc_emergency/New() + . = ..() + // If RETA enabled change config lines to include RETA info + if(CONFIG_GET(flag/reta_enabled)) + // Non sec/engi/med personnel may be called by CC or AI (I hope) for anomaly removal and etc. Mostly admin triggered calls + announcement_lines_map = list( + "RETA Granted" = "- RETA door access granted to responders", + "RETA Failed" = "- no RETA access provided", + "Security" = "SECURITY EMERGENCY in %LOCATION %CALLER %RETA!!!", + "Engineering" = "ENGINEERING EMERGENCY in %LOCATION %CALLER %RETA!!!", + "Medical" = "MEDICAL EMERGENCY in %LOCATION %CALLER, %RETA!!!", + "Science" = "Science personnel was requested in %LOCATION %CALLER %RETA.", + "Service" = "Service personnel was requested in %LOCATION %CALLER %RETA.", + "Command" = "Command personnel was requested in %LOCATION %CALLER %RETA.", + "Cargo" = "Cargo personnel was requested in %LOCATION %CALLER %RETA.", + "Mining" = "Miners were requested in %LOCATION %CALLER %RETA.", + ) + vars_and_tooltips_map = list( + "LOCATION" = "will be replaced with the department name", + "CALLER" = "with caller name and job if applicable", + "RETA" = "with RETA Granted or RETA Failed lines depending on RETA system report", + ) + +/datum/aas_config_entry/rc_emergency/compile_announce(list/variables_map, announcement_line) + if (!variables_map["CALLER"]) + variables_map["CALLER"] = "(Caller placeholder)" + + variables_map["RETA"] = variables_map["RETARESPONDERS"] ? announcement_lines_map["RETA Granted"] : announcement_lines_map["RETA Failed"] + . = ..() + // In case - someone expands RETA departments, but forgets to add announcement lines for them + if (!announcement_lines_map[announcement_line]) + . = "ERROR: UNKNOWN DEPARTMENT \[[announcement_line]\] CALLED IN [variables_map["LOCATION"] || "\[NO DATA\]"] [variables_map["CALLER"]]. PLEASE REPORT THIS TO NT TECH SUPPORT." + + var/list/exploded_string = splittext_char(., "(Caller placeholder)") + var/list/trimed_message = list() + for (var/line in exploded_string) + line = trim(line) + if (line) + trimed_message += line + // Rebuild the string without empty lines + . = trimed_message.Join(" ") + +/datum/aas_config_entry/rc_reta_announcement + name = "RC Alert: RETA Granted" + announcement_lines_map = list( + "Message" = "RETA activated %CALLER. %GRANTEE personnel now have temporary access to your areas." + ) + + vars_and_tooltips_map = list( + "CALLER" = "will be replaced with caller info if applicable", + "GRANTEE" = "with who may now access targeted areas", + ) + +/datum/aas_config_entry/rc_reta_announcement/New() + . = ..() + // If RETA disabled - we should be down + if(!CONFIG_GET(flag/reta_enabled)) + announcement_lines_map["Message"] = "RETA system is disabled." + enabled = FALSE + modifiable = FALSE + +/datum/aas_config_entry/rc_reta_announcement/compile_announce(list/variables_map, announcement_line) + if (!variables_map["CALLER"]) + variables_map["CALLER"] = "(Caller placeholder)" + var/list/exploded_string = splittext_char(..(), "(Caller placeholder)") + var/list/trimed_message = list() + for (var/line in exploded_string) + line = trim(line) + if (line) + trimed_message += line + // Rebuild the string without empty lines + . = trimed_message.Join(" ") + /datum/aas_config_entry/rc_new_message - name = "RC Alert: New Message " + name = "RC Alert: New Message" // Yes, players can't use html tags, however they can use speech mods like | or +, but sh-sh-sh, don't tell them! announcement_lines_map = list( "Unauthenticated" = "Message from %SENDER to %RECEIVER: %MESSAGE", diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm index a73576f36615..e9e94686f7f2 100644 --- a/code/game/machinery/roulette_machine.dm +++ b/code/game/machinery/roulette_machine.dm @@ -220,11 +220,14 @@ cut_overlays() update_appearance() set_light(0) + if(isliving(user)) + var/mob/living/living_user = user + living_user.add_mood_event("roulette", /datum/mood_event/slots) var/rolled_number = rand(0, 36) playsound(src, 'sound/machines/roulette/roulettewheel.ogg', 50) - addtimer(CALLBACK(src, PROC_REF(finish_play), player_id, bet_type, bet_amount, payout, rolled_number), 34) //4 deciseconds more so the animation can play + addtimer(CALLBACK(src, PROC_REF(finish_play), player_id, bet_type, bet_amount, payout, rolled_number, user), 34) //4 deciseconds more so the animation can play addtimer(CALLBACK(src, PROC_REF(finish_play_animation)), 3 SECONDS) use_energy(active_power_usage) @@ -235,7 +238,7 @@ playsound(src, 'sound/machines/piston/piston_lower.ogg', 70) ///Ran after a while to check if the player won or not. -/obj/machinery/roulette/proc/finish_play(obj/item/card/id/player_id, bet_type, bet_amount, potential_payout, rolled_number) +/obj/machinery/roulette/proc/finish_play(obj/item/card/id/player_id, bet_type, bet_amount, potential_payout, rolled_number, mob/user) last_spin = rolled_number var/is_winner = check_win(bet_type, bet_amount, rolled_number) //Predetermine if we won @@ -249,17 +252,22 @@ handle_color_light(color) if(!is_winner) - say("You lost! Better luck next time") + say("You lost! Better luck next time.") playsound(src, 'sound/machines/synth/synth_no.ogg', 50) + if(isliving(user) && (user in viewers(src))) + var/mob/living/living_user = user + living_user.add_mood_event("roulette", /datum/mood_event/slots/loss) return FALSE // Prevents money generation exploits. Doesn't prevent the owner being a scrooge and running away with the money. var/account_balance = my_card?.registered_account?.account_balance potential_payout = (account_balance >= potential_payout) ? potential_payout : account_balance - say("You have won [potential_payout] credits! Congratulations!") + say("You have won [potential_payout] [MONEY_NAME]! Congratulations!") playsound(src, 'sound/machines/synth/synth_yes.ogg', 50) - + if(isliving(user) && (user in viewers(src))) + var/mob/living/living_user = user + living_user.add_mood_event("roulette", potential_payout >= ROULETTE_JACKPOT_AMOUNT ? /datum/mood_event/slots/win/jackpot : /datum/mood_event/slots/win/big) dispense_prize(potential_payout) ///Fills a list of coins that should be dropped. diff --git a/code/game/machinery/scanner_gate.dm b/code/game/machinery/scanner_gate.dm index 49475d53f951..27271f3c4b16 100644 --- a/code/game/machinery/scanner_gate.dm +++ b/code/game/machinery/scanner_gate.dm @@ -87,7 +87,7 @@ COMSIG_ATOM_ENTERED = PROC_REF(on_entered), ) AddElement(/datum/element/connect_loc, loc_connections) - AddComponent(/datum/component/simple_rotation, ROTATION_IGNORE_ANCHORED|ROTATION_REQUIRE_WRENCH|ROTATION_NEEDS_UNBLOCKED) + AddElement(/datum/element/simple_rotation, ROTATION_IGNORE_ANCHORED|ROTATION_REQUIRE_WRENCH|ROTATION_NEEDS_UNBLOCKED) register_context() /obj/machinery/scanner_gate/Destroy(force) diff --git a/code/game/machinery/sheetifier.dm b/code/game/machinery/sheetifier.dm index 815b35213b9e..c689318ddc47 100644 --- a/code/game/machinery/sheetifier.dm +++ b/code/game/machinery/sheetifier.dm @@ -7,12 +7,12 @@ circuit = /obj/item/circuitboard/machine/sheetifier layer = BELOW_OBJ_LAYER var/busy_processing = FALSE - var/datum/component/material_container/materials + var/datum/material_container/materials /obj/machinery/sheetifier/Initialize(mapload) . = ..() - materials = AddComponent( \ - /datum/component/material_container, \ + materials = new ( \ + src, \ list(/datum/material/meat, /datum/material/hauntium), \ SHEET_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, \ MATCONTAINER_EXAMINE, \ @@ -24,7 +24,7 @@ ) /obj/machinery/sheetifier/Destroy() - materials = null + QDEL_NULL(materials) return ..() /obj/machinery/sheetifier/update_overlays() diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 24057c27a346..e3e1e54f046f 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -58,7 +58,7 @@ /obj/structure/emergency_shield/regenerating/Initialize(mapload) . = ..() - AddElement(/datum/element/empprotection, EMP_PROTECT_SELF) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_NO_EXAMINE) /obj/structure/emergency_shield/regenerating/Destroy() STOP_PROCESSING(SSobj, src) @@ -84,7 +84,7 @@ /obj/structure/emergency_shield/cult/Initialize(mapload) . = ..() - AddElement(/datum/element/empprotection, EMP_PROTECT_SELF) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_NO_EXAMINE) /obj/structure/emergency_shield/cult/narsie name = "sanguine barrier" diff --git a/code/game/machinery/sleepers.dm b/code/game/machinery/sleepers.dm index 9b843cd55061..1715ead99680 100644 --- a/code/game/machinery/sleepers.dm +++ b/code/game/machinery/sleepers.dm @@ -218,10 +218,10 @@ data["occupant"]["health"] = mob_occupant.health data["occupant"]["maxHealth"] = mob_occupant.maxHealth data["occupant"]["minHealth"] = HEALTH_THRESHOLD_DEAD - data["occupant"]["bruteLoss"] = mob_occupant.getBruteLoss() - data["occupant"]["oxyLoss"] = mob_occupant.getOxyLoss() - data["occupant"]["toxLoss"] = mob_occupant.getToxLoss() - data["occupant"]["fireLoss"] = mob_occupant.getFireLoss() + data["occupant"]["bruteLoss"] = mob_occupant.get_brute_loss() + data["occupant"]["oxyLoss"] = mob_occupant.get_oxy_loss() + data["occupant"]["toxLoss"] = mob_occupant.get_tox_loss() + data["occupant"]["fireLoss"] = mob_occupant.get_fire_loss() data["occupant"]["brainLoss"] = mob_occupant.get_organ_loss(ORGAN_SLOT_BRAIN) data["occupant"]["reagents"] = list() if(mob_occupant.reagents && mob_occupant.reagents.reagent_list.len) diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 470d791080a7..ded188b82bd1 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -122,7 +122,7 @@ var/obj/item/holochip/inserted_chip = inserted if(!user.temporarilyRemoveItemFromInventory(inserted_chip)) return ITEM_INTERACT_BLOCKING - balloon_alert(user, "[inserted_chip.credits] credit[inserted_chip.credits == 1 ? "" : "s"] inserted") + balloon_alert(user, "[inserted_chip.credits] [MONEY_NAME_AUTOPURAL(inserted_chip.credits)] inserted") balance += inserted_chip.credits qdel(inserted_chip) return ITEM_INTERACT_SUCCESS @@ -227,6 +227,9 @@ if(user) the_name = user.real_name visible_message(span_notice("[user] pulls the lever and the slot machine starts spinning!")) + if(isliving(user)) + var/mob/living/living_user = user + living_user.add_mood_event("slots_spin", /datum/mood_event/slots) else the_name = "Exaybachay" @@ -306,8 +309,11 @@ else if(check_jackpot(JACKPOT_SEVENS)) var/prize = money + JACKPOT - visible_message("[src] says, 'JACKPOT! You win [prize] credits!'") + visible_message("[src] says, 'JACKPOT! You win [prize] [MONEY_NAME]!'") priority_announce("Congratulations to [user ? user.real_name : usrname] for winning the jackpot at the slot machine in [get_area(src)]!") + if(isliving(user) && (user in viewers(src))) + var/mob/living/living_user = user + living_user.add_mood_event("slots", /datum/mood_event/slots/win/jackpot) jackpots += 1 money = 0 if(paymode == HOLOCHIP) @@ -321,12 +327,18 @@ sleep(REEL_DEACTIVATE_DELAY) else if(linelength == 5) - visible_message("[src] says, 'Big Winner! You win a thousand credits!'") + visible_message("[src] says, 'Big Winner! You win a thousand [MONEY_NAME]!'") give_money(BIG_PRIZE) + if(isliving(user) && (user in viewers(src))) + var/mob/living/living_user = user + living_user.add_mood_event("slots", /datum/mood_event/slots/win/big) else if(linelength == 4) - visible_message("[src] says, 'Winner! You win four hundred credits!'") + visible_message("[src] says, 'Winner! You win four hundred [MONEY_NAME]!'") give_money(SMALL_PRIZE) + if(isliving(user) && (user in viewers(src))) + var/mob/living/living_user = user + living_user.add_mood_event("slots", /datum/mood_event/slots/win) else if(linelength == 3) to_chat(user, span_notice("You win three free games!")) @@ -337,6 +349,9 @@ balloon_alert(user, "no luck!") playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50) did_player_win = FALSE + if(isliving(user) && (user in viewers(src))) + var/mob/living/living_user = user + living_user.add_mood_event("slots", /datum/mood_event/slots/loss) if(did_player_win) add_filter("jackpot_rays", 3, ray_filter) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 0e1f8ae06298..3010b84b19ea 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -39,8 +39,8 @@ var/settable_temperature_median = 30 + T0C ///Range of temperatures above and below the median that we can set our target temperature (increase by upgrading the capacitors) var/settable_temperature_range = 30 - ///Should we add an overlay for open spaceheaters - var/display_panel = TRUE + /// The icon_state of the emissive, because improvised heaters are special and don't follow along with the modes + var/emissive_state /datum/armor/machinery_space_heater fire = 80 @@ -118,8 +118,12 @@ /obj/machinery/space_heater/update_overlays() . = ..() - if(panel_open && display_panel) + + if(on) + . += emissive_appearance(icon, "[emissive_state ? emissive_state : base_icon_state + "-" + mode]-emissive", src, alpha = src.alpha) + if(panel_open) . += "[base_icon_state]-open" + . += emissive_blocker(icon, "[base_icon_state]-open", src, alpha = src.alpha) /obj/machinery/space_heater/on_set_panel_open() update_appearance() @@ -313,16 +317,14 @@ ///For use with heating reagents in a ghetto way /obj/machinery/space_heater/improvised_chem_heater - icon = 'icons/obj/medical/chemical.dmi' - icon_state = "sheater-off" name = "improvised chem heater" desc = "A space heater fashioned to reroute heating to a water bath on top." panel_open = TRUE //This is always open - since we've injected wires in the panel //We inherit the cell from the heater prior cell = null interaction_flags_click = FORBID_TELEKINESIS_REACH - display_panel = FALSE settable_temperature_range = 50 + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 3, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) ///The beaker within the heater var/obj/item/reagent_containers/beaker = null /// How quickly it delivers heat to the reagents. In watts per joule of the thermal energy difference of the reagent from the temperature difference of the current and target temperatures. @@ -479,14 +481,24 @@ . = ..() if(!on || !beaker || !cell) icon_state = "sheater-off" + emissive_state = null return if(target_temperature < beaker.reagents.chem_temp) icon_state = "sheater-cool" + emissive_state = icon_state return if(target_temperature > beaker.reagents.chem_temp) icon_state = "sheater-heat" + emissive_state = icon_state return icon_state = "sheater-off" + emissive_state = null + +/obj/machinery/space_heater/improvised_chem_heater/update_overlays() + . += ..() + . += "[icon_state]-beaker" + . += "[base_icon_state]-rigged" + . += emissive_blocker(icon, "[base_icon_state]-rigged", src, alpha = src.alpha) /obj/machinery/space_heater/improvised_chem_heater/RefreshParts() . = ..() diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index a360c9229c01..69a8555f3e1a 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -51,7 +51,7 @@ GLOBAL_DATUM_INIT(status_font, /datum/font, new /datum/font/tiny_unicode/size_12 pixel_shift = 32 //makes it go on the wall when built -/obj/machinery/status_display/Initialize(mapload, ndir, building) +/obj/machinery/status_display/Initialize(mapload) . = ..() update_appearance() @@ -403,11 +403,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/evac, 32) // register for radio system SSradio.add_object(src, frequency) // Circuit USB - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/status_display, - )) + AddComponent(/datum/component/usb_port, typecacheof(list(/obj/item/circuit_component/status_display), only_root_path = TRUE)) RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, PROC_REF(on_sec_level_change)) - find_and_hang_on_wall() + if(mapload) + find_and_mount_on_atom() /obj/machinery/status_display/evac/Destroy() SSradio.remove_object(src,frequency) @@ -591,7 +590,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/evac, 32) LAZYOR(active_displays, new_display) set_display_with_priority(SD_GREENSCREEN, DISPLAY_PRIORITY_MESSAGE, force_override = TRUE) if("friendcomputer") - friendc = !friendc + // Friend Computer should only affect AI displays, not evac displays + return update() /obj/machinery/status_display/evac/vv_edit_var(vname, vval) @@ -732,32 +732,68 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/evac, 32) desc = "A small screen which the AI can use to present itself." current_mode = SD_PICTURE var/emotion = AI_DISPLAY_DONT_GLOW + var/frequency = FREQ_STATUS_DISPLAYS + var/friendc = FALSE // track if Friend Computer mode + var/last_picture // For when Friend Computer mode is undone MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) +/obj/machinery/status_display/ai/Initialize(mapload) + . = ..() + // register for radio system to receive AI emote signals + SSradio.add_object(src, frequency) + if(mapload) + find_and_mount_on_atom() + +/obj/machinery/status_display/ai/Destroy() + SSradio.remove_object(src, frequency) + return ..() + /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 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)) - var/datum/emote/ai/emotion_display/emote = _emote - if(initial(emote.emotion) == emotion_result) - user.emote(initial(emote.key)) - break + + // Open the TGUI interface for selecting status display options + if(!user.status_display_picker) + user.status_display_picker = new(user, src) + user.status_display_picker.ui_interact(user) /obj/machinery/status_display/ai/process() if(machine_stat & NOPOWER) update_appearance() return PROCESS_KILL - set_picture(GLOB.ai_status_display_emotes[emotion]) + if(!length(GLOB.ai_status_display_all_options)) + init_ai_status_display_options() + + var/icon_state + // First try the combined list + if(emotion in GLOB.ai_status_display_all_options) + icon_state = GLOB.ai_status_display_all_options[emotion] + // Then try the original emotes list + else if(emotion in GLOB.ai_status_display_emotes) + icon_state = GLOB.ai_status_display_emotes[emotion] + // Default fallback + else + icon_state = "ai_download" + + set_picture(icon_state) return PROCESS_KILL +/obj/machinery/status_display/ai/receive_signal(datum/signal/signal) + switch(signal.data["command"]) + if("friendcomputer") + friendc = !friendc + if(friendc) + last_picture = emotion // Save current display + emotion = AI_EMOTION_FRIEND_COMPUTER + else + if(last_picture) + emotion = last_picture // Restore previous display + else + emotion = AI_DISPLAY_DONT_GLOW + update_appearance() + /obj/item/circuit_component/status_display display_name = "Status Display" desc = "Output text and pictures to a status display." @@ -842,7 +878,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) /// list to pick the first line from var/list/firstline_to_secondline = list() -/obj/machinery/status_display/random_message/Initialize(mapload, ndir, building) +/obj/machinery/status_display/random_message/Initialize(mapload) if(firstline_to_secondline?.len) message1 = pick(firstline_to_secondline) message2 = firstline_to_secondline[message1] @@ -993,7 +1029,7 @@ GLOBAL_LIST_EMPTY_TYPED(greenscreen_displays, /obj/effect/abstract/greenscreen_d /obj/machinery/greenscreen_camera/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation, ROTATION_IGNORE_ANCHORED) + AddElement(/datum/element/simple_rotation, ROTATION_IGNORE_ANCHORED) update_appearance(UPDATE_OVERLAYS) /obj/machinery/greenscreen_camera/Destroy() diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 5ca275106b01..64e4e735afd0 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -7,8 +7,8 @@ icon_state = "classic" base_icon_state = "classic" power_channel = AREA_USAGE_EQUIP - density = TRUE - obj_flags = CAN_BE_HIT | BLOCKS_CONSTRUCTION // Becomes undense when the unit is open + density = TRUE // Becomes undense when the unit is open + obj_flags = CAN_BE_HIT | BLOCKS_CONSTRUCTION | UNIQUE_RENAME | RENAME_NO_DESC interaction_flags_mouse_drop = NEED_DEXTERITY max_integrity = 250 req_access = list() @@ -80,12 +80,12 @@ /obj/machinery/suit_storage_unit/captain mask_type = /obj/item/clothing/mask/gas/atmos/captain - storage_type = /obj/item/tank/jetpack/oxygen/captain + storage_type = /obj/item/tank/jetpack/captain mod_type = /obj/item/mod/control/pre_equipped/magnate /obj/machinery/suit_storage_unit/centcom mask_type = /obj/item/clothing/mask/gas/atmos/centcom - storage_type = /obj/item/tank/jetpack/oxygen/captain + storage_type = /obj/item/tank/jetpack/captain mod_type = /obj/item/mod/control/pre_equipped/corporate /obj/machinery/suit_storage_unit/engine @@ -137,7 +137,7 @@ /obj/machinery/suit_storage_unit/syndicate mask_type = /obj/item/clothing/mask/gas/syndicate - storage_type = /obj/item/tank/jetpack/oxygen/harness + storage_type = /obj/item/tank/jetpack/harness mod_type = /obj/item/mod/control/pre_equipped/nuclear /obj/machinery/suit_storage_unit/syndicate/lavaland @@ -493,9 +493,9 @@ update_appearance() if(mob_occupant) if(uv_super) - mob_occupant.adjustFireLoss(rand(20, 36)) + mob_occupant.adjust_fire_loss(rand(20, 36)) else - mob_occupant.adjustFireLoss(rand(10, 16)) + mob_occupant.adjust_fire_loss(rand(10, 16)) if(iscarbon(mob_occupant) && mob_occupant.stat < UNCONSCIOUS) //Awake, organic and screaming mob_occupant.emote("scream") @@ -697,33 +697,6 @@ balloon_alert(user, "set to [choice]") return ITEM_INTERACT_SUCCESS - if(!state_open && IS_WRITING_UTENSIL(tool)) - if(locked) - balloon_alert(user, "unlock first!") - return ITEM_INTERACT_BLOCKING - if(isnull(id_card)) - balloon_alert(user, "not yours to rename!") - return ITEM_INTERACT_BLOCKING - - var/name_set = FALSE - var/desc_set = FALSE - var/str = tgui_input_text(user, "Personal Unit Name", "Unit Name", max_length = MAX_NAME_LEN) - if(!isnull(str)) - name = str - name_set = TRUE - str = tgui_input_text(user, "Personal Unit Description", "Unit Description", max_length = MAX_DESC_LEN) - if(!isnull(str)) - desc = str - desc_set = TRUE - var/bit_flag = NONE - if(name_set) - bit_flag |= UPDATE_NAME - if(desc_set) - bit_flag |= UPDATE_DESC - if(bit_flag) - update_appearance(bit_flag) - return ITEM_INTERACT_SUCCESS - if(state_open && is_operational) if(istype(tool, /obj/item/clothing/suit)) if(suit) @@ -804,6 +777,15 @@ if(.) return ..() +/obj/machinery/suit_storage_unit/rename_checks(mob/living/user) + . = TRUE + if(locked) + balloon_alert(user, "unlock first!") + return FALSE + if(!access_check(user)) + balloon_alert(user, "not yours to rename!") + return FALSE + /// If the SSU needs to have any communications wires cut. /obj/machinery/suit_storage_unit/proc/disable_modlink() if(isnull(mod)) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 224345a8f6d0..d28b9b5694ca 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -15,6 +15,7 @@ subsystem_type = /datum/controller/subsystem/processing/fastprocess interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_OFFLINE use_power = NO_POWER_USE + custom_materials = list(/datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 10) /// What is the lowest amount of time we can set the timer to? var/minimum_timer = SYNDIEBOMB_MIN_TIMER_SECONDS @@ -69,6 +70,12 @@ if(!active) return PROCESS_KILL + for(var/obj/effect/forcefield/cosmic_field/potential_field as anything in GLOB.active_cosmic_fields) + if(get_dist(potential_field, src) < 3) + new /obj/effect/temp_visual/revenant(get_turf(src)) + defuse() + return + if(!isnull(next_beep) && (next_beep <= world.time)) var/volume switch(seconds_remaining()) @@ -270,7 +277,7 @@ activate() add_fingerprint(user) // We don't really concern ourselves with duds or fakes after this - if(isnull(payload) || istype(payload, /obj/machinery/syndicatebomb/training)) + if(isnull(payload) || istype(payload, /obj/item/bombcore/training)) return notify_ghosts( @@ -350,6 +357,7 @@ w_class = WEIGHT_CLASS_NORMAL flags_1 = PREVENT_CONTENTS_EXPLOSION_1 // We detonate upon being exploded. resistance_flags = FLAMMABLE //Burnable (but the casing isn't) + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.05) var/adminlog = null var/range_heavy = 3 var/range_medium = 9 @@ -446,7 +454,8 @@ /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, cardinals_only = FALSE) + for(var/atom/spawned as anything in spawn_and_random_walk(summon_path, src, amt_summon, walk_chance=50, admin_spawn=TRUE, cardinals_only = FALSE)) + ADD_TRAIT(spawned, TRAIT_SPAWNED_MOB, INNATE_TRAIT) qdel(B) qdel(src) diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index 53d217f6cb75..ad3a0a80db1c 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -180,7 +180,7 @@ stack_trace("null found in the hearers list returned by the spatial grid. this is bad") continue spans -= blacklisted_spans - hearer.Hear(virt, language, message, frequency, data["frequency_name"], data["frequency_color"], spans, message_mods, message_range = INFINITY) + hearer.Hear(virt, language, message, frequency, data["frequency_name"], data["frequency_color"], spans, message_mods, message_range = INFINITY, source = source) // DARKPACK EDIT, ORIGINAL: hearer.Hear(virt, language, message, frequency, data["frequency_name"], data["frequency_color"], 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)) @@ -194,7 +194,10 @@ spans_part = "[spans_part] ) " var/lang_name = data["language"] - var/log_text = "\[[get_radio_name(frequency)]\] [spans_part]\"[message]\" (language: [lang_name])" + // DARKPACK EDIT ADD START + var/obj/item/radio/radio = source + var/log_text = "\[[get_radio_name(frequency)]\] [radio.radio_id][spans_part]\"[message]\" (language: [lang_name])" + // DARKPACK EDIT ADD END var/mob/source_mob = virt.source diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 7a606d426419..39ac4b438422 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -13,6 +13,7 @@ FREQ_CTF_YELLOW, FREQ_CTF_GREEN, FREQ_CTF_BLUE, + FREQ_MILITARY, // DARKPACK EDIT ADD ) /obj/machinery/telecomms/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) @@ -322,7 +323,7 @@ info["name"] = new_name // No color changing for channels with theme settings if(!GLOB.freqtospan["[freq]"]) - var/new_color = input(usr, "Choose color for frequency", "Modifying Frequency Information", info["color"]) as color|null + var/new_color = tgui_color_picker(usr, "Choose color for frequency", "Modifying Frequency Information", info["color"]) if(new_color) info["color"] = new_color frequency_infos[params["freq"]] = info @@ -341,7 +342,7 @@ for(var/list/channel in get_channels()) if(channel["freq"] == freq || channel["name"] == name) return - var/color = input(usr, "Choose color for frequency", "Adding Frequency Information") as color|null + var/color = tgui_color_picker(usr, "Choose color for frequency", "Adding Frequency Information") if(!color) return frequency_infos[num2text(freq)] = list( diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm index 63668487de75..5e0e7877d981 100644 --- a/code/game/machinery/telecomms/machines/allinone.dm +++ b/code/game/machinery/telecomms/machines/allinone.dm @@ -52,7 +52,31 @@ "[FREQ_SECURITY]" = list( "name" = RADIO_CHANNEL_SECURITY, "color" = RADIO_COLOR_SECURITY - ) + ), // DARKPACK EDIT ADD START + "[FREQ_POLICE]" = list( + "name" = RADIO_CHANNEL_POLICE, + "color" = RADIO_COLOR_POLICE + ), + "[FREQ_CLINIC]" = list( + "name" = RADIO_CHANNEL_CLINIC, + "color" = RADIO_COLOR_CLINIC + ), + "[FREQ_MILITARY]" = list( + "name" = RADIO_CHANNEL_MILITARY, + "color" = RADIO_COLOR_MILITARY + ), + "[FREQ_CAMARILLA]" = list( + "name" = RADIO_CHANNEL_CAMARILLA, + "color" = RADIO_COLOR_CAMARILLA + ), + "[FREQ_ANARCH]" = list( + "name" = RADIO_CHANNEL_ANARCH, + "color" = RADIO_COLOR_ANARCH + ), + "[FREQ_ENDRON]" = list( + "name" = RADIO_CHANNEL_ENDRON, + "color" = RADIO_COLOR_ENDRON + ) // DARKPACK EDIT ADD END ) /obj/machinery/telecomms/allinone/nuclear diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 6b705fa3dc58..c2da8bd27808 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -92,7 +92,7 @@ playsound(src.loc, 'sound/items/tools/welder.ogg', 50, TRUE) victim.emote("scream") // It is painful - victim.adjustBruteLoss(max(0, 80 - victim.getBruteLoss())) // Hurt the human, don't try to kill them though. + victim.adjust_brute_loss(max(0, 80 - victim.get_brute_loss())) // Hurt the human, don't try to kill them though. // Sleep for a couple of ticks to allow the human to see the pain sleep(0.5 SECONDS) diff --git a/code/game/machinery/wall_healer.dm b/code/game/machinery/wall_healer.dm index 89de765ecbe1..3bcef5c124ae 100644 --- a/code/game/machinery/wall_healer.dm +++ b/code/game/machinery/wall_healer.dm @@ -69,6 +69,8 @@ update_appearance() init_payment() register_context() + if(mapload) + find_and_mount_on_atom() /obj/machinery/wall_healer/Destroy() clear_using_mob() @@ -485,10 +487,10 @@ add_mob_blood(current_user) return - var/brute_healing_now = round(min(initial(brute_healing) * 0.1, brute_healing, current_user.getBruteLoss()), DAMAGE_PRECISION) - var/burn_healing_now = round(min(initial(burn_healing) * 0.1, burn_healing, current_user.getFireLoss()), DAMAGE_PRECISION) - var/tox_healing_now = round(min(initial(tox_healing) * 0.1, tox_healing, current_user.getToxLoss()), DAMAGE_PRECISION) - var/blood_healing_now = HAS_TRAIT(current_user, TRAIT_NOBLOOD) ? 0 : round(min(initial(blood_healing) * 0.1, blood_healing, max(BLOOD_VOLUME_OKAY - current_user.blood_volume, 0)), 0.1) + var/brute_healing_now = round(min(initial(brute_healing) * 0.1, brute_healing, current_user.get_brute_loss()), DAMAGE_PRECISION) + var/burn_healing_now = round(min(initial(burn_healing) * 0.1, burn_healing, current_user.get_fire_loss()), DAMAGE_PRECISION) + var/tox_healing_now = round(min(initial(tox_healing) * 0.1, tox_healing, current_user.get_tox_loss()), DAMAGE_PRECISION) + var/blood_healing_now = round(min(initial(blood_healing) * 0.1, blood_healing, max(0, BLOOD_VOLUME_OKAY - current_user.get_blood_volume())), 0.1) var/cost = round(per_heal_cost * (brute_healing_now + burn_healing_now + tox_healing_now + blood_healing_now), 1) if(attempt_charge(src, current_user, extra_fees = cost) & COMPONENT_OBJ_CANCEL_CHARGE) @@ -500,18 +502,17 @@ var/amount_healed = 0 if(brute_healing_now) - amount_healed += current_user.adjustBruteLoss(-brute_healing_now, required_bodytype = BODYTYPE_ORGANIC) + amount_healed += current_user.adjust_brute_loss(-brute_healing_now, required_bodytype = BODYTYPE_ORGANIC) brute_healing -= brute_healing_now add_mob_blood(current_user) if(burn_healing_now) - amount_healed += current_user.adjustFireLoss(-burn_healing_now, required_bodytype = BODYTYPE_ORGANIC) + amount_healed += current_user.adjust_fire_loss(-burn_healing_now, required_bodytype = BODYTYPE_ORGANIC) burn_healing -= burn_healing_now if(tox_healing_now) - amount_healed += current_user.adjustToxLoss(-tox_healing_now, required_biotype = MOB_ORGANIC) + amount_healed += current_user.adjust_tox_loss(-tox_healing_now, required_biotype = MOB_ORGANIC) tox_healing -= tox_healing_now if(blood_healing_now) - current_user.blood_volume += blood_healing_now - amount_healed += blood_healing_now + amount_healed += current_user.adjust_blood_volume(blood_healing_now, maximum = BLOOD_VOLUME_OKAY) blood_healing -= blood_healing_now add_mob_blood(current_user) @@ -526,10 +527,10 @@ playsound(src, 'sound/machines/defib/defib_saftyOff.ogg', 50, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) if(antispam_counter % 3 != 1) return - var/missed_brute_healing = brute_healing_now > 0 && !current_user.getBruteLoss() - var/missed_burn_healing = burn_healing_now > 0 && !current_user.getFireLoss() - var/missed_tox_healing = tox_healing_now > 0 && !current_user.getToxLoss() - var/missed_blood_healing = blood_healing_now > 0 && current_user.blood_volume >= BLOOD_VOLUME_OKAY + var/missed_brute_healing = brute_healing_now > 0 && !current_user.get_brute_loss() + var/missed_burn_healing = burn_healing_now > 0 && !current_user.get_fire_loss() + var/missed_tox_healing = tox_healing_now > 0 && !current_user.get_tox_loss() + var/missed_blood_healing = blood_healing_now > 0 && current_user.get_blood_volume() >= BLOOD_VOLUME_OKAY if(missed_brute_healing || missed_burn_healing || missed_tox_healing || missed_blood_healing) to_chat(current_user, span_notice("Nothing happens. Seems like [src] needs to recharge.")) return diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 33208d160e6e..b88f0f9c1dd2 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -180,16 +180,33 @@ GLOBAL_LIST_INIT(dye_registry, list( icon_state = "wm_1_0" density = TRUE state_open = TRUE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SHEET_MATERIAL_AMOUNT) + circuit = /obj/item/circuitboard/machine/washing_machine var/busy = FALSE var/bloody_mess = FALSE var/obj/item/color_source - var/max_wash_capacity = 5 + /// The max amount of items that can be washed per load + var/max_wash_capacity + /// The time it takes to wash a load of laundry + var/time_to_wash + /// The current number of items inserted + var/total_load = 0 /obj/machinery/washing_machine/examine(mob/user) . = ..() if(!busy) . += span_notice("Right-click with an empty hand to start a wash cycle.") +/obj/machinery/washing_machine/RefreshParts() + . = ..() + var/total_volume = 0 + for(var/obj/item/reagent_containers/cup/beaker/beaker in component_parts) + total_volume += beaker.reagents.maximum_volume + max_wash_capacity = floor(total_volume/20) + + for(var/datum/stock_part/servo/servo in component_parts) + time_to_wash = 20 SECONDS / servo.tier + /obj/machinery/washing_machine/process(seconds_per_tick) if(!busy) animate(src, transform=matrix(), time=2) @@ -290,7 +307,7 @@ GLOBAL_LIST_INIT(dye_registry, list( /mob/living/carbon/human/machine_wash(obj/machinery/washing_machine/washer, mob/user) adjust_wet_stacks(8) adjust_disgust(40, DISGUST_LEVEL_VERYDISGUSTED) - adjustOxyLoss(12) + adjust_oxy_loss(12) log_combat(user, src, "machine washed (oxy)") /obj/item/machine_wash(obj/machinery/washing_machine/washer) @@ -329,7 +346,7 @@ GLOBAL_LIST_INIT(dye_registry, list( icon_state = "wm_[state_open]_blood" return ..() - var/full = contents.len ? 1 : 0 + var/full = total_load ? 1 : 0 icon_state = "wm_[state_open]_[full]" return ..() @@ -361,7 +378,7 @@ GLOBAL_LIST_INIT(dye_registry, list( if(bloody_mess) to_chat(user, span_warning("[src] must be cleaned up first!")) return ITEM_INTERACT_BLOCKING - if(contents.len >= max_wash_capacity) + if(total_load >= max_wash_capacity) to_chat(user, span_warning("The washing machine is full!")) return ITEM_INTERACT_BLOCKING if(!user.transferItemToLoc(item, src)) @@ -369,6 +386,7 @@ GLOBAL_LIST_INIT(dye_registry, list( return ITEM_INTERACT_BLOCKING if(item.dye_color) color_source = item + total_load++ update_appearance() return ITEM_INTERACT_SUCCESS @@ -431,7 +449,7 @@ GLOBAL_LIST_INIT(dye_registry, list( if(HAS_TRAIT(user, TRAIT_BRAINWASHING)) ADD_TRAIT(src, TRAIT_BRAINWASHING, SKILLCHIP_TRAIT) update_appearance() - addtimer(CALLBACK(src, PROC_REF(wash_cycle), user), 20 SECONDS) + addtimer(CALLBACK(src, PROC_REF(wash_cycle), user), time_to_wash) START_PROCESSING(SSfastprocess, src) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -445,3 +463,4 @@ GLOBAL_LIST_INIT(dye_registry, list( . = ..() set_density(TRUE) //because machinery/open_machine() sets it to FALSE color_source = null + total_load = 0 diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 3babf33eb9ef..ad6b4259f414 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -104,7 +104,14 @@ RegisterSignal(src, COMSIG_MOVABLE_SET_ANCHORED, PROC_REF(on_set_anchored)) M.set_buckled(src) buckled_mobs |= M - M.throw_alert(ALERT_BUCKLED, /atom/movable/screen/alert/buckled) + + ///If the icon is too big, don't add it to the screen alert + var/add_src_icon = TRUE + var/list/dim = get_icon_dimensions(icon) + if(dim["height"] > ICON_SIZE_Y || dim["width"] > ICON_SIZE_X) + add_src_icon = FALSE + + M.throw_alert(ALERT_BUCKLED, /atom/movable/screen/alert/buckled, new_master = add_src_icon ? src : null) M.set_glide_size(glide_size) M.Move(loc) @@ -351,7 +358,7 @@ * user - The mob unbuckling buckled_mob */ /atom/movable/proc/user_unbuckle_mob(mob/living/buckled_mob, mob/user) - if(!(buckled_mob in buckled_mobs) || !user.CanReach(buckled_mob)) + if(!(buckled_mob in buckled_mobs) || !buckled_mob.IsReachableBy(user)) return var/mob/living/M = unbuckle_mob(buckled_mob) if(M) diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm index 3cf2ee6a8f5a..57aa83b532e7 100644 --- a/code/game/objects/effects/anomalies/_anomalies.dm +++ b/code/game/objects/effects/anomalies/_anomalies.dm @@ -24,7 +24,7 @@ ///Chance per second that we will move var/move_chance = ANOMALY_MOVECHANCE -/obj/effect/anomaly/Initialize(mapload, new_lifespan) +/obj/effect/anomaly/Initialize(mapload, new_lifespan, drops_core = TRUE) . = ..() if(!mapload) @@ -36,6 +36,9 @@ if (!impact_area) return INITIALIZE_HINT_QDEL + if(!drops_core) + anomaly_core = null + if(anomaly_core) anomaly_core = new anomaly_core(src) anomaly_core.code = rand(1,100) diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm index 234e5e740ffb..75b07ba9c1e4 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm @@ -157,8 +157,8 @@ var/obj/machinery/door/airlock/airlock = object var/obj/machinery/door/new_airlock = new_object new_airlock.unres_sides = airlock.unres_sides - new_airlock.req_access = airlock.req_access.Copy() - new_airlock.req_one_access = airlock.req_one_access.Copy() + new_airlock.req_access = airlock.req_access?.Copy() + new_airlock.req_one_access = airlock.req_one_access?.Copy() new_airlock.locked = airlock.locked new_airlock.emergency = airlock.emergency new_airlock.update_appearance() diff --git a/code/game/objects/effects/anomalies/anomalies_flux.dm b/code/game/objects/effects/anomalies/anomalies_flux.dm index 1d823d00b60b..ddf7b0367336 100644 --- a/code/game/objects/effects/anomalies/anomalies_flux.dm +++ b/code/game/objects/effects/anomalies/anomalies_flux.dm @@ -44,10 +44,10 @@ /obj/effect/anomaly/flux/detonate() switch(emp_zap) if(FLUX_EMP) - empulse(src, 4, 16) + empulse(src, 4, 16, emp_source = src) explosion(src, heavy_impact_range = 1, light_impact_range = 4, flash_range = 6) //Trashes the room a bit, might blow a small hole in the hull. if(FLUX_LIGHT_EMP) - empulse(src, 4, 6) + empulse(src, 4, 6, emp_source = src) explosion(src, light_impact_range = 3, flash_range = 6) if(FLUX_NO_EMP) new /obj/effect/particle_effect/sparks(loc) diff --git a/code/game/objects/effects/anomalies/anomalies_weather.dm b/code/game/objects/effects/anomalies/anomalies_weather.dm new file mode 100644 index 000000000000..ea407acfa3af --- /dev/null +++ b/code/game/objects/effects/anomalies/anomalies_weather.dm @@ -0,0 +1,100 @@ +/obj/effect/anomaly/weather + name = "weather anomaly" + anomaly_core = /obj/item/assembly/signaler/anomaly/weather + lifespan = ANOMALY_COUNTDOWN_TIMER * 2.5 + + /// Chance per turf per second that we will produce thunder. Use the defines + var/thunder_chance = 0 + /// The type of weather this anomaly will produce. If unset, will be picked from select_weather() + var/datum/weather/weather_type + /// List of active weathers spawned by this anomaly + VAR_PRIVATE/list/active_weathers + +/obj/effect/anomaly/weather/Initialize(mapload, new_lifespan, drops_core, forced_anomaly_type = src.weather_type, forced_thunder_chance = src.thunder_chance) + . = ..() + + add_atom_colour(COLOR_MATRIX_INVERT, FIXED_COLOUR_PRIORITY) + + weather_type = forced_anomaly_type || select_weather() + thunder_chance = forced_thunder_chance + + active_weathers = list() + + var/telegraph = lifespan / 5 // 1/5th of the time is dedicated to telegraphing, to give people time to find and defuse it + var/end_dur = lifespan / 15 // then 1/15th of the time is dedicated to winding down + var/total_dur = lifespan - telegraph - end_dur + + var/list/affected_areas = list(impact_area) + var/list/num_turfs = length(impact_area.get_turfs_from_all_zlevels()) + for(var/spread_dir in GLOB.alldirs) + var/area/nearby = find_adjacent_impacted_area(spread_dir) + // prevents nearby the central hallway from basically always being included + if(isnull(nearby) || length(nearby.get_turfs_from_all_zlevels()) > num_turfs * 1.5) + continue + affected_areas |= nearby + + var/datum/weather/weather = SSweather.run_weather( + weather_datum_type = weather_type, + z_levels = z, + weather_data = list( + WEATHER_FORCED_AREAS = affected_areas, + WEATHER_FORCED_FLAGS = weather_type::weather_flags | WEATHER_INDOORS | WEATHER_THUNDER | WEATHER_STRICT_ALERT, + WEATHER_FORCED_THUNDER = thunder_chance, + WEATHER_FORCED_TELEGRAPH = telegraph, + WEATHER_FORCED_END = end_dur, + WEATHER_FORCED_DURATION = total_dur, + ) + ) + RegisterSignal(weather, COMSIG_QDELETING, PROC_REF(clear_ref)) + active_weathers += weather + +/obj/effect/anomaly/weather/proc/clear_ref(datum/weather/weather_datum) + SIGNAL_HANDLER + active_weathers -= weather_datum + UnregisterSignal(weather_datum, COMSIG_QDELETING) + +/obj/effect/anomaly/weather/proc/select_weather() + return pick( + /datum/weather/rain_storm, + /datum/weather/snow_storm, + /datum/weather/sand_storm, + ) + +/// steps outward from src to find an area that is not the impact_area. +/obj/effect/anomaly/weather/proc/find_adjacent_impacted_area(check_dir) + var/limit = 9 + var/turf/next_turf = get_step(src, check_dir) + while(next_turf.loc == impact_area && limit > 0) + next_turf = get_step(next_turf, check_dir) + if(isnull(next_turf)) + return null + limit -= 1 + + return next_turf.loc + +/obj/effect/anomaly/weather/anomalyNeutralize() + for(var/datum/weather/weather_datum as anything in active_weathers) + weather_datum?.wind_down() + return ..() + +/obj/effect/anomaly/weather/detonate() + playsound(src, 'sound/effects/magic/repulse.ogg', 100, TRUE) + for(var/atom/movable/repulsed in range(src, 5)) + if(repulsed == src || repulsed.anchored) + continue + var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(repulsed, src))) + repulsed.safe_throw_at(throwtarget, 6, 2, src, force = MOVE_FORCE_EXTREMELY_STRONG) + +/obj/effect/anomaly/weather/Destroy() + for(var/datum/weather/weather_datum as anything in active_weathers) + clear_ref(weather_datum) + return ..() + +/obj/effect/anomaly/weather/thundering + name = "thundering weather anomaly" + + thunder_chance = THUNDER_CHANCE_HIGH + // maybe we can put acid rain in this later? + // though it'd feel unfair if it showed up and immediately dumped acid on people. + // we would need an even longer telegraphing time for that + weather_type = /datum/weather/rain_storm diff --git a/code/game/objects/effects/blessing.dm b/code/game/objects/effects/blessing.dm index 540be85db4ed..f4f9ea381400 100644 --- a/code/game/objects/effects/blessing.dm +++ b/code/game/objects/effects/blessing.dm @@ -6,16 +6,22 @@ anchored = TRUE density = FALSE mouse_opacity = MOUSE_OPACITY_TRANSPARENT + /// Is this blessing visible to those with the ability to see blessed tiles? (chaplains) + var/invisible /obj/effect/blessing/Initialize(mapload) . = ..() + + RegisterSignal(loc, COMSIG_ATOM_INTERCEPT_TELEPORTING, PROC_REF(block_cult_teleport)) + + if(invisible) + return + var/image/blessing_icon = image(icon = 'icons/effects/effects.dmi', icon_state = "blessed", layer = ABOVE_NORMAL_TURF_LAYER, loc = src) blessing_icon.alpha = 64 blessing_icon.appearance_flags = RESET_ALPHA add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/blessed_aware, "blessing", blessing_icon) - RegisterSignal(loc, COMSIG_ATOM_INTERCEPT_TELEPORTING, PROC_REF(block_cult_teleport)) - /obj/effect/blessing/Destroy() UnregisterSignal(loc, COMSIG_ATOM_INTERCEPT_TELEPORTING) return ..() @@ -26,3 +32,6 @@ if(channel == TELEPORT_CHANNEL_CULT) return TRUE + +/obj/effect/blessing/invisible + invisible = TRUE diff --git a/code/game/objects/effects/decals/cleanable/ants.dm b/code/game/objects/effects/decals/cleanable/ants.dm index b6a3fa38c3fa..465cbe391bb6 100644 --- a/code/game/objects/effects/decals/cleanable/ants.dm +++ b/code/game/objects/effects/decals/cleanable/ants.dm @@ -1,6 +1,6 @@ /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." + name = "ants" // DARKPACK EDIT CHANGE + desc = "A small colony of ants. Do not let them in your pants." // DARKPACK EDIT CHANGE icon = 'icons/obj/debris.dmi' icon_state = "ants" beauty = -150 diff --git a/code/game/objects/effects/decals/cleanable/blood.dm b/code/game/objects/effects/decals/cleanable/blood.dm index 488c1b610d9c..c6b342cb7bc5 100644 --- a/code/game/objects/effects/decals/cleanable/blood.dm +++ b/code/game/objects/effects/decals/cleanable/blood.dm @@ -739,11 +739,10 @@ . += bloodstep_overlay if(emissive_alpha && emissive_alpha < alpha && !dried) - var/enter_emissive_state = "[enter_state]_emissive-[emissive_alpha]" - var/mutable_appearance/emissive_overlay = bloody_footprints_cache[enter_emissive_state] + var/enter_emissive_state = "[enter_state]_emissive-[Ddir]-[emissive_alpha]" + var/image/emissive_overlay = bloody_footprints_cache[enter_emissive_state] if(!emissive_overlay) - emissive_overlay = blood_emissive(icon, "[icon_state_to_use]1") - emissive_overlay.dir = Ddir + emissive_overlay = image(blood_emissive(icon, "[icon_state_to_use]1"), dir = Ddir) bloody_footprints_cache[enter_emissive_state] = emissive_overlay . += emissive_overlay @@ -756,11 +755,10 @@ . += bloodstep_overlay if(emissive_alpha && emissive_alpha < alpha && !dried) - var/exit_emissive_state = "[exit_state]_emissive-[emissive_alpha]" - var/mutable_appearance/emissive_overlay = bloody_footprints_cache[exit_emissive_state] + var/exit_emissive_state = "[exit_state]_emissive-[Ddir]-[emissive_alpha]" + var/image/emissive_overlay = bloody_footprints_cache[exit_emissive_state] if(!emissive_overlay) - emissive_overlay = blood_emissive(icon, "[icon_state_to_use]2") - emissive_overlay.dir = Ddir + emissive_overlay = image(blood_emissive(icon, "[icon_state_to_use]2"), dir = Ddir) bloody_footprints_cache[exit_emissive_state] = emissive_overlay . += emissive_overlay @@ -852,6 +850,9 @@ if(splatter_strength <= 0) break iter_atom.add_blood_DNA(GET_ATOM_BLOOD_DNA(src)) + if(isliving(iter_atom)) + var/mob/living/splatted = iter_atom + splatted.add_mood_event("splattered_with_blood", /datum/mood_event/splattered_with_blood) splatter_strength-- // we used all our blood so go away diff --git a/code/game/objects/effects/decals/cleanable/fuel.dm b/code/game/objects/effects/decals/cleanable/fuel.dm index e372e93c43d6..ced0b5376b1b 100644 --- a/code/game/objects/effects/decals/cleanable/fuel.dm +++ b/code/game/objects/effects/decals/cleanable/fuel.dm @@ -78,8 +78,9 @@ /obj/effect/decal/cleanable/fuel_pool/bullet_act(obj/projectile/hit_proj) . = ..() - ignite() - log_combat(hit_proj.firer, src, "used [hit_proj] to ignite") + if(hit_proj.damage > 0) + ignite() + log_combat(hit_proj.firer, src, "used [hit_proj] to ignite") /obj/effect/decal/cleanable/fuel_pool/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(item.ignition_effect(src, user)) diff --git a/code/game/objects/effects/decals/cleanable/mess.dm b/code/game/objects/effects/decals/cleanable/mess.dm index 660b4180b226..a67190083ac0 100644 --- a/code/game/objects/effects/decals/cleanable/mess.dm +++ b/code/game/objects/effects/decals/cleanable/mess.dm @@ -82,7 +82,7 @@ if(!isnull(broken_flooring)) return var/turf/T = get_turf(src) - if(T.tiled_dirt && is_tileable) + if(T.tiled_turf && is_tileable) icon = 'icons/effects/dirt.dmi' icon_state = "dirt-0" smoothing_flags = SMOOTH_BITMASK @@ -194,7 +194,8 @@ if(. || !ishuman(user)) return var/mob/living/carbon/human/as_human = user - if(!isflyperson(as_human)) + var/obj/item/organ/tongue/user_tongue = user.get_organ_slot(ORGAN_SLOT_TONGUE) + if(!istype(user_tongue, /obj/item/organ/tongue/fly)) return playsound(get_turf(src), 'sound/items/drink.ogg', 50, TRUE) //slurp as_human.visible_message(span_alert("[as_human] extends a small proboscis into the vomit pool, sucking it with a slurping sound.")) @@ -354,7 +355,7 @@ GLOBAL_LIST_EMPTY(nebula_vomits) /obj/effect/decal/cleanable/garbage name = "trash bag" // DARKPACK EDIT CHANGE - ORIGINAL: name = "decomposing garbage" desc = "Holds garbage inside." // DARKPACK EDIT CHANGE - ORIGINAL: desc = "A split open garbage bag, its stinking content seems to be partially liquified. Yuck!" - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' // DARKPACK EDIT CHANGE - ORIGINAL: icon = 'icons/obj/debris.dmi' + icon = 'modular_darkpack/modules/decor/icons/trash.dmi' // DARKPACK EDIT CHANGE - ORIGINAL: icon = 'icons/obj/debris.dmi' icon_state = "garbage1" // DARKPACK EDIT CHANGE - ORIGINAL: icon_state = "garbage" plane = GAME_PLANE layer = CLEANABLE_OBJECT_LAYER @@ -383,3 +384,7 @@ GLOBAL_LIST_EMPTY(nebula_vomits) flick("rubble_bounce", src) icon_state = "rubble" update_appearance(UPDATE_ICON_STATE) + +/obj/effect/decal/cleanable/can_bits + name = "shredded can" + desc = "This story doesn't hold water anymore." diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index be3e03d5e6e6..b8069b0ab41a 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -19,6 +19,7 @@ while(isopenspaceturf(loc) && can_z_move(DOWN, z_move_flags = ZMOVE_ALLOW_ANCHORED)) zMove(DOWN, z_move_flags = ZMOVE_ALLOW_ANCHORED) AddElement(/datum/element/connect_loc, loc_connections) + AddElement(/datum/element/force_move_pulled) /obj/effect/decal/blob_act(obj/structure/blob/B) if(B && B.loc == loc) diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index a527317b4766..16254e9610c6 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -48,7 +48,7 @@ ///Releases a cloud of smoke based on the randomly generated reagent in Initialize(). /obj/effect/decal/remains/human/smokey/proc/release_smoke(mob/living/smoke_releaser) - visible_message(span_warning("[smoke_releaser] disturbs the [src], which releases a huge cloud of gas!")) + visible_message(span_warning("[smoke_releaser] disturbs [src], which releases a huge cloud of gas!")) var/datum/effect_system/fluid_spread/smoke/chem/cigarette_puff = new() cigarette_puff.chemholder.add_reagent(that_shit_that_killed_saddam, 15) cigarette_puff.attach(get_turf(src)) diff --git a/code/game/objects/effects/decals/turfdecal/markings.dm b/code/game/objects/effects/decals/turfdecal/markings.dm index 53815dd6457f..df0b3f4c0fa7 100644 --- a/code/game/objects/effects/decals/turfdecal/markings.dm +++ b/code/game/objects/effects/decals/turfdecal/markings.dm @@ -187,8 +187,7 @@ //Bottom -/obj/effect/turf_decal/syndicateemblem/bottom/left/obj/effect/turf_decal/raven/nine - icon_state = "RAVEN9" +/obj/effect/turf_decal/syndicateemblem/bottom/left icon_state = "synd1,1" /obj/effect/turf_decal/syndicateemblem/bottom/middle @@ -383,6 +382,28 @@ /obj/effect/turf_decal/siding/wood/end icon_state = "siding_wood_end" +// DARKPACK EDIT ADD START +// Matches the floor colors we use alot more then the default +/obj/effect/turf_decal/siding/wood/dark + color = "#4a3925" + +/obj/effect/turf_decal/siding/wood/dark/corner + icon_state = "siding_wood_corner" + +/obj/effect/turf_decal/siding/wood/dark/end + icon_state = "siding_wood_end" + +/obj/effect/turf_decal/siding/wood/light + color = "#9a704a" + +/obj/effect/turf_decal/siding/wood/light/corner + icon_state = "siding_wood_corner" + +/obj/effect/turf_decal/siding/wood/light/end + icon_state = "siding_wood_end" + +// DARKPACK EDIT ADD END + /obj/effect/turf_decal/siding/thinplating icon_state = "siding_thinplating" color = "#aaaaaa" diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 6ddd65f12cfc..73ffc52a2bdb 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -12,14 +12,6 @@ would spawn and follow the beaker, even if it is carried or thrown. pass_flags = PASSTABLE | PASSGRILLE anchored = TRUE -/obj/effect/particle_effect/Initialize(mapload) - . = ..() - GLOB.cameranet.updateVisibility(src) - -/obj/effect/particle_effect/Destroy() - GLOB.cameranet.updateVisibility(src) - return ..() - // Prevents effects from getting registered for SSnewtonian_movement /obj/effect/particle_effect/newtonian_move(inertia_angle, instant = FALSE, start_delay = 0, drift_force = 0, controlled_cap = null) return TRUE 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 6d71edad180b..83ef6e552938 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 @@ -207,7 +207,7 @@ return smoker.drop_all_held_items() - smoker.adjustOxyLoss(1) + smoker.adjust_oxy_loss(1) smoker.emote("cough") /** diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index 377bf58fda69..08f996081a15 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -95,12 +95,15 @@ receive_ricochet_chance_mod = INFINITY //we do ricochet a lot! initial_duration = 10 SECONDS +GLOBAL_LIST_EMPTY_TYPED(active_cosmic_fields, /obj/effect/forcefield/cosmic_field) + /// The cosmic heretics forcefield /obj/effect/forcefield/cosmic_field name = "Cosmic Field" desc = "A field that cannot be passed by people marked with a cosmic star." icon = 'icons/effects/eldritch.dmi' icon_state = "cosmic_carpet" + mouse_opacity = MOUSE_OPACITY_TRANSPARENT anchored = TRUE layer = GIB_LAYER density = FALSE @@ -108,10 +111,27 @@ initial_duration = 30 SECONDS /// Flags for what antimagic can just ignore our forcefields var/antimagic_flags = MAGIC_RESISTANCE + /// If we are able to slow down projectiles + var/slows_projectiles = FALSE /obj/effect/forcefield/cosmic_field/Initialize(mapload, flags = MAGIC_RESISTANCE) . = ..() antimagic_flags = flags + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + COMSIG_ATOM_EXITED = PROC_REF(on_loc_exited), + ) + AddElement(/datum/element/connect_loc, loc_connections) + // Make sure that if we create a field, we apply whatever effects + for(var/atom/movable/thing in get_turf(src)) + on_entered(src, thing) + +/obj/effect/forcefield/cosmic_field/Destroy(force) + // Make sure when the field goes away that the effects don't persist + for(var/atom/movable/thing in get_turf(src)) + on_loc_exited(src, thing) + GLOB.active_cosmic_fields -= src + return ..() /obj/effect/forcefield/cosmic_field/CanAllowThrough(atom/movable/mover, border_dir) if(!isliving(mover)) @@ -119,10 +139,68 @@ var/mob/living/living_mover = mover if(living_mover.can_block_magic(antimagic_flags, charge_cost = 0)) return ..() + // Being buckled/pulled by a cosmic heretic will allow you through cosmic fields EVEN IF you have a star mark + if(ismob(living_mover.buckled)) + var/mob/living/fireman = living_mover.buckled + if(fireman.has_status_effect(/datum/status_effect/heretic_passive/cosmic)) + return ..() + if(living_mover.pulledby?.has_status_effect(/datum/status_effect/heretic_passive/cosmic)) + return ..() if(living_mover.has_status_effect(/datum/status_effect/star_mark)) return FALSE return ..() +/obj/effect/forcefield/cosmic_field/proc/on_entered(datum/source, atom/movable/thing) + SIGNAL_HANDLER + if(isprojectile(thing) && slows_projectiles) + var/obj/projectile/bullet = thing + if(istype(bullet, /obj/projectile/magic/star_ball)) // Don't slow down star balls + return + bullet.speed *= 0.2 // 80% Slowdown + return + + if(!isliving(thing)) + return + var/mob/living/living_mover = thing + var/datum/status_effect/heretic_passive/cosmic/cosmic_passive = living_mover.has_status_effect(/datum/status_effect/heretic_passive/cosmic) + if(!cosmic_passive) + return + living_mover.add_movespeed_modifier(/datum/movespeed_modifier/cosmic_field) + +/obj/effect/forcefield/cosmic_field/proc/on_loc_exited(datum/source, atom/movable/thing) + SIGNAL_HANDLER + if(isprojectile(thing) && slows_projectiles) + var/obj/projectile/bullet = thing + if(istype(bullet, /obj/projectile/magic/star_ball)) // Don't speed up star balls + return + bullet.speed /= 0.2 // 80% Slowdown + return + + if(!isliving(thing)) + return + var/mob/living/living_mover = thing + var/datum/status_effect/heretic_passive/cosmic/cosmic_passive = living_mover.has_status_effect(/datum/status_effect/heretic_passive/cosmic) + if(!cosmic_passive) + return + living_mover.remove_movespeed_modifier(/datum/movespeed_modifier/cosmic_field) + +/// Adds the ability to slow down any projectiles that enters any turf we occupy +/obj/effect/forcefield/cosmic_field/proc/slows_projectiles() + slows_projectiles = TRUE + +/// Adds our cosmic field to the global list which bombs check to see if they have to stop exploding +/obj/effect/forcefield/cosmic_field/proc/prevents_explosions() + GLOB.active_cosmic_fields += src + +/datum/movespeed_modifier/cosmic_field + multiplicative_slowdown = -0.25 + +/obj/effect/forcefield/cosmic_field/star_blast + initial_duration = 5 SECONDS + +/obj/effect/forcefield/cosmic_field/star_touch + initial_duration = 30 SECONDS + /obj/effect/forcefield/cosmic_field/fast initial_duration = 5 SECONDS diff --git a/code/game/objects/effects/info.dm b/code/game/objects/effects/info.dm index c9295a090c18..9ffb49a84f79 100644 --- a/code/game/objects/effects/info.dm +++ b/code/game/objects/effects/info.dm @@ -18,7 +18,7 @@ /obj/effect/abstract/info/Click() . = ..() - to_chat(usr, info_text) + to_chat(usr, boxed_message("[span_boldnotice(name)]
[span_info(info_text)]")) /obj/effect/abstract/info/MouseEntered(location, control, params) . = ..() diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 347bc96faa89..f7e04e3d04eb 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -555,22 +555,14 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) return /obj/effect/landmark/start/hangover/JoinPlayerHere(mob/joining_mob, buckle) - . = ..() - make_hungover(joining_mob) - -/obj/effect/landmark/start/hangover/closet - name = "hangover spawn closet" - icon_state = "hangover_spawn_closet" - -/obj/effect/landmark/start/hangover/closet/JoinPlayerHere(mob/joining_mob, buckle) + var/mob/created_joining_mob = ..() + make_hungover(created_joining_mob) 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 + created_joining_mob.forceMove(closet) + return created_joining_mob + return created_joining_mob //Landmark that creates destinations for the navigate verb to path to /obj/effect/landmark/navigate_destination diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 28ebbd5cf3e6..aaa2b2858b8e 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -226,7 +226,7 @@ /obj/effect/mine/sound/bwoink name = "bwoink mine" - sound = 'sound/effects/adminhelp.ogg' + sound = 'modular_darkpack/master_files/sounds/adminhelp.ogg' // DARKPACK EDIT CHANGE /// These mines spawn pellet_clouds around them when triggered /obj/effect/mine/shrapnel diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 84b1e5ad1253..cdae1ecbe19d 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -99,3 +99,8 @@ /obj/effect/abstract/marker/powernet name = "powernet run marker" var/powernet_owner + +/// Used by RangedReachCheck +/obj/effect/abstract/reach_checker + pass_flags = PASSTABLE + invisibility = INVISIBILITY_ABSTRACT diff --git a/code/game/objects/effects/particles/brimdust.dm b/code/game/objects/effects/particles/brimdust.dm new file mode 100644 index 000000000000..1b6cb338fbad --- /dev/null +++ b/code/game/objects/effects/particles/brimdust.dm @@ -0,0 +1,17 @@ +/particles/brimdust + icon = 'icons/effects/particles/generic.dmi' + icon_state = "cross" + width = 100 + height = 100 + count = 1000 + color = "#88304e" + spawning = 3 + lifespan = 0.7 SECONDS + fade = 1 SECONDS + velocity = list(0, 0) + position = generator(GEN_CIRCLE, 0, 16, NORMAL_RAND) + drift = generator(GEN_VECTOR, list(-0.2, 0), list(0.2, 0)) + gravity = list(0, -0.5) + scale = generator(GEN_VECTOR, list(0.3, 0.3), list(1,1), NORMAL_RAND) + rotation = 30 + spin = generator(GEN_NUM, -20, 20) diff --git a/code/game/objects/effects/phased_mob.dm b/code/game/objects/effects/phased_mob.dm index 69fe4cb22506..f2a275117da8 100644 --- a/code/game/objects/effects/phased_mob.dm +++ b/code/game/objects/effects/phased_mob.dm @@ -82,8 +82,7 @@ /obj/effect/dummy/phased_mob/ex_act() return FALSE -/obj/effect/dummy/phased_mob/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) - SHOULD_CALL_PARENT(FALSE) +/obj/effect/dummy/phased_mob/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) return BULLET_ACT_FORCE_PIERCE /obj/effect/dummy/phased_mob/relaymove(mob/living/user, direction) diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 8acf36f6e6fe..a42cab19b022 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -135,10 +135,10 @@ return ..() return BULLET_ACT_FORCE_PIERCE -/obj/effect/portal/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit) - if (!teleport(hitting_projectile, force = TRUE)) - return ..() - return BULLET_ACT_FORCE_PIERCE +/obj/effect/portal/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) + if (teleport(hitting_projectile, force = TRUE)) + return BULLET_ACT_FORCE_PIERCE + return ..() /obj/effect/portal/proc/teleport(atom/movable/moving, force = FALSE) if(!force && (!istype(moving) || iseffect(moving) || (ismecha(moving) && !mech_sized) || (!isobj(moving) && !ismob(moving)))) //Things that shouldn't teleport. diff --git a/code/game/objects/effects/poster_motivational.dm b/code/game/objects/effects/poster_motivational.dm index 42100144f7af..702cdfdde8a3 100644 --- a/code/game/objects/effects/poster_motivational.dm +++ b/code/game/objects/effects/poster_motivational.dm @@ -105,8 +105,6 @@ /datum/mood_event/poster_mood description = "That poster is really motivating me!" mood_change = 2 - category = POSTER_MOOD_CAT - // random posters @@ -154,6 +152,8 @@ When people read this poster they'll feel better!" icon_state = "bike" +// Departmental posters + /obj/item/poster/quirk/cargo_logo poster_type = /obj/structure/sign/poster/quirk/cargo_logo quirk_poster_department = ACCOUNT_CAR diff --git a/code/game/objects/effects/posters/contraband.dm b/code/game/objects/effects/posters/contraband.dm index 137e9c64b6fd..94da3e99fcb8 100644 --- a/code/game/objects/effects/posters/contraband.dm +++ b/code/game/objects/effects/posters/contraband.dm @@ -845,3 +845,17 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/bojack, 32) icon_state = "double_rainbow" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/double_rainbow, 32) + +/obj/structure/sign/poster/contraband/vodka + name = "Vodka" + desc = "The text is written entirely in Russian. You can barely read anything except the word 'BODKA'." + icon_state = "vodka" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/vodka, 32) + +/obj/structure/sign/poster/contraband/ninja + name = "Ninja" + desc = "Greetings from the Spider Clan." + icon_state = "ninja" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/ninja, 32) diff --git a/code/game/objects/effects/posters/official.dm b/code/game/objects/effects/posters/official.dm index 070036e009cf..ef5ad4ae8561 100644 --- a/code/game/objects/effects/posters/official.dm +++ b/code/game/objects/effects/posters/official.dm @@ -429,3 +429,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/boombox, 32) icon_state = "download_gun" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/download, 32) + +/obj/structure/sign/poster/official/mining + name = "Undiscovered Species" + desc = "A poster showing one of the Ash Walker species. We still know very little about them, be a pioneer! \ + When people read this poster they'll feel better!" + icon_state = "ashwalkers" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/mining, 32) diff --git a/code/game/objects/effects/posters/poster.dm b/code/game/objects/effects/posters/poster.dm index ebfc3a791bb2..1fe4e3656917 100644 --- a/code/game/objects/effects/posters/poster.dm +++ b/code/game/objects/effects/posters/poster.dm @@ -18,13 +18,9 @@ force = 0 resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_SMALL - var/poster_type + var/obj/structure/sign/poster/poster_type = /obj/structure/sign/poster/random var/obj/structure/sign/poster/poster_structure -/obj/item/poster/examine(mob/user) - . = ..() - . += span_notice("You can booby-trap the poster by using a glass shard on it before you put it up.") - /obj/item/poster/Initialize(mapload, obj/structure/sign/poster/new_poster_structure) . = ..() @@ -36,53 +32,104 @@ AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks) if(new_poster_structure && (new_poster_structure.loc != src)) - new_poster_structure.forceMove(src) //The poster structure *must* be in the item's contents for the exited() proc to properly clean up when placing the poster + qdel(new_poster_structure.GetComponent(/datum/component/atom_mounted)) + new_poster_structure.forceMove(src) poster_structure = new_poster_structure - if(!new_poster_structure && poster_type) - poster_structure = new poster_type(src) + if(!poster_type) // If we weren't already assigned a poster_type, we infer from the contained poster_structure + if(istype(poster_structure, /obj/structure/sign/poster)) // Make sure our poster structure is valid + poster_type = poster_structure.type + else + stack_trace("Rolled poster [type] was created without either a valid poster_type [poster_type] or poster_structure [poster_structure]") + poster_type = /obj/structure/sign/poster/random // Panic, do something random + if(ispath(poster_type, /obj/structure/sign/poster)) // Make sure we have a valid poster_type before using it + name = "[poster_type::poster_item_name] - [poster_type::name]" + desc = poster_type::poster_item_desc + icon_state = poster_type::poster_item_icon_state + else // We did not have a valid poster_type, light the beacons + CRASH("Rolled poster [type] has an invalid or null poster_type [poster_type]") - // posters store what name and description they would like their - // rolled up form to take. - if(poster_structure) - if(QDELETED(poster_structure)) - stack_trace("A poster was initialized with a qdeleted poster_structure, something's gone wrong") - return INITIALIZE_HINT_QDEL - name = poster_structure.poster_item_name - desc = poster_structure.poster_item_desc - icon_state = poster_structure.poster_item_icon_state +/obj/item/poster/Destroy(force) + QDEL_NULL(poster_structure) + return ..() - name = "[name] - [poster_structure.original_name]" +/obj/item/poster/examine(mob/user) + . = ..() + . += span_notice("You can booby-trap the poster by using a glass shard on it before you put it up.") /obj/item/poster/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!istype(I, /obj/item/shard)) return ..() - if (poster_structure.trap?.resolve()) + if (locate(/obj/item/shard) in (poster_structure?.contents || contents)) balloon_alert(user, "already trapped!") return - if(!user.transferItemToLoc(I, poster_structure)) + if(!user.transferItemToLoc(I, src)) return - poster_structure.trap = WEAKREF(I) to_chat(user, span_notice("You conceal \the [I] inside the rolled up poster.")) -/obj/item/poster/Exited(atom/movable/gone, direction) - . = ..() - if(gone == poster_structure) - poster_structure = null - if(!QDELING(src)) - qdel(src) //we're now a poster, huzzah! +/obj/item/poster/interact_with_atom(turf/closed/wall_structure, mob/living/user, list/modifiers) + if(!isclosedturf(wall_structure)) + return NONE -/obj/item/poster/Destroy(force) - QDEL_NULL(poster_structure) - return ..() + var/turf/user_turf = get_turf(user) + var/dir = get_dir(user_turf, wall_structure) + if(!(dir in GLOB.cardinals)) + balloon_alert(user, "stand in line with wall!") + return ITEM_INTERACT_BLOCKING + + // Deny placing posters on currently-diagonal walls, although the wall may change in the future. + if (wall_structure.smoothing_flags & SMOOTH_DIAGONAL_CORNERS) + for(var/overlay in wall_structure.overlays) + var/image/new_image = overlay + if(copytext(new_image.icon_state, 1, 3) == "d-") //3 == length("d-") + 1 + to_chat(user, span_warning("Cannot place on diagonal wall!")) + return ITEM_INTERACT_FAILURE + + var/stuff_on_wall = 0 + for(var/obj/contained_object in wall_structure.contents) //Let's see if it already has a poster on it or too much stuff + if(istype(contained_object, /obj/structure/sign/poster)) + balloon_alert(user, "no room!") + return ITEM_INTERACT_FAILURE + stuff_on_wall++ + if(stuff_on_wall == 3) + balloon_alert(user, "no room!") + return ITEM_INTERACT_FAILURE + + balloon_alert(user, "hanging poster...") + var/obj/structure/sign/poster/placed_poster = poster_structure || new poster_type(src) + placed_poster.forceMove(user_turf) + placed_poster.setDir(dir) + switch(dir) + if(NORTH) + placed_poster.pixel_y = 32 + if(SOUTH) + placed_poster.pixel_y = -32 + if(EAST) + placed_poster.pixel_x = 32 + if(WEST) + placed_poster.pixel_x = -32 + var/obj/item/shard/trap = locate() in contents + if(trap) + trap.forceMove(placed_poster) + placed_poster.poster_item_type = type + poster_structure = null + flick("poster_being_set", placed_poster) + playsound(src, 'sound/items/poster/poster_being_created.ogg', 100, TRUE) + qdel(src) -// The poster sign/structure + var/turf/user_drop_location = get_turf(user) + if(!do_after(user, PLACE_SPEED, placed_poster, extra_checks = CALLBACK(placed_poster, TYPE_PROC_REF(/obj/structure/sign/poster, snowflake_closed_turf_check), wall_structure))) + placed_poster.roll_and_drop(user_drop_location, user) + return ITEM_INTERACT_FAILURE + + placed_poster.AddComponent(/datum/component/atom_mounted, wall_structure) + placed_poster.on_placed_poster(user) + return ITEM_INTERACT_SUCCESS /** * The structure form of a poster. - * * These are what get placed on maps as posters. They are also what gets created when a player places a poster on a wall. * For the item form that can be spawned for players, see [/obj/item/poster] */ @@ -98,18 +145,19 @@ var/never_random = FALSE // used for the 'random' subclasses. ///Exclude posters of these types from being added to the random pool var/list/blacklisted_types = list() - ///Whether the poster should be printable from library management computer. Mostly exists to keep directionals from being printed. + ///Whether the poster should be printable from library management computer. var/printable = FALSE + ///What type should we put back in the rolled poster when we get cut down + var/cutdown_type var/poster_item_name = "hypothetical poster" var/poster_item_desc = "This hypothetical poster item should not exist, let's be honest here." var/poster_item_icon_state = "rolled_poster" var/poster_item_type = /obj/item/poster - ///A sharp shard of material can be hidden inside of a poster, attempts to embed when it is torn down. - var/datum/weakref/trap /obj/structure/sign/poster/Initialize(mapload) . = ..() + cutdown_type = type if(random_basetype) randomise(random_basetype) if(!ruined) @@ -142,7 +190,8 @@ poster_types -= typesof(iterated_type) var/list/approved_types = list() for(var/obj/structure/sign/poster/type_of_poster as anything in poster_types) - if(initial(type_of_poster.icon_state) && !initial(type_of_poster.never_random)) + // It must have an icon state, not be banned from the random pool, and not be pixel shifted (eliminates directional subtypes) + if(initial(type_of_poster.icon_state) && !initial(type_of_poster.never_random) && !initial(type_of_poster.pixel_x) && !initial(type_of_poster.pixel_y)) approved_types |= type_of_poster var/obj/structure/sign/poster/selected = pick(approved_types) @@ -155,6 +204,7 @@ poster_item_desc = initial(selected.poster_item_desc) poster_item_icon_state = initial(selected.poster_item_icon_state) ruined = initial(selected.ruined) + cutdown_type = initial(selected.type) if(length(GLOB.holidays) && prob(30)) // its the holidays! lets get festive apply_holiday() update_appearance() @@ -172,15 +222,15 @@ desc = holi_data.poster_desc icon_state = holi_data.poster_icon -/obj/structure/sign/poster/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers) - if(tool.tool_behaviour == TOOL_WIRECUTTER) - tool.play_tool_sound(src, 100) - if(ruined) - to_chat(user, span_notice("You remove the remnants of the poster.")) - qdel(src) - else - to_chat(user, span_notice("You carefully remove the poster from the wall.")) - roll_and_drop(Adjacent(user) ? get_turf(user) : loc, user) +/obj/structure/sign/poster/wirecutter_act(mob/living/user, obj/item/tool) + tool.play_tool_sound(src, 100) + if(ruined) + to_chat(user, span_notice("You remove the remnants of the poster.")) + qdel(src) + else + to_chat(user, span_notice("You carefully remove the poster from the wall.")) + roll_and_drop(Adjacent(user) ? get_turf(user) : loc, user) + return ITEM_INTERACT_SUCCESS /obj/structure/sign/poster/attack_hand(mob/user, list/modifiers) . = ..() @@ -197,7 +247,7 @@ // HO-HO-HOHOHO HU HU-HU HU-HU /obj/structure/sign/poster/proc/spring_trap(mob/user) - var/obj/item/shard/payload = trap?.resolve() + var/obj/item/shard/payload = locate() in contents if (!payload) return @@ -222,45 +272,9 @@ /// Re-creates the poster item from the poster structure /obj/structure/sign/poster/proc/return_to_poster_item(atom/location) - return new poster_item_type(location, src) - -//separated to reduce code duplication. Moved here for ease of reference and to unclutter r_wall/attackby() -/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 - - // Deny placing posters on currently-diagonal walls, although the wall may change in the future. - if (smoothing_flags & SMOOTH_DIAGONAL_CORNERS) - for (var/overlay in overlays) - var/image/new_image = overlay - if(copytext(new_image.icon_state, 1, 3) == "d-") //3 == length("d-") + 1 - return - - var/stuff_on_wall = 0 - for(var/obj/contained_object in contents) //Let's see if it already has a poster on it or too much stuff - if(istype(contained_object, /obj/structure/sign/poster)) - balloon_alert(user, "no room!") - return - stuff_on_wall++ - if(stuff_on_wall == 3) - balloon_alert(user, "no room!") - return - - balloon_alert(user, "hanging poster...") - var/obj/structure/sign/poster/placed_poster = rolled_poster.poster_structure - - flick("poster_being_set", placed_poster) - placed_poster.forceMove(src) //deletion of the poster is handled in poster/Exited(), so don't have to worry about P anymore. - playsound(src, 'sound/items/poster/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_closed_turf_check), src))) - placed_poster.roll_and_drop(user_drop_location, user) - return - - placed_poster.on_placed_poster(user) - return TRUE + . = new poster_item_type(location, new cutdown_type) + qdel(src) + return . /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) diff --git a/code/game/objects/effects/spawners/costume.dm b/code/game/objects/effects/spawners/costume.dm index 32f5bcd4fc8f..a679783c4b2b 100644 --- a/code/game/objects/effects/spawners/costume.dm +++ b/code/game/objects/effects/spawners/costume.dm @@ -30,7 +30,7 @@ /obj/effect/spawner/costume/madscientist name = "mad scientist costume spawner" items = list( - /obj/item/clothing/under/rank/captain/suit, + /obj/item/clothing/under/costume/captain, /obj/item/clothing/head/flatcap, /obj/item/clothing/suit/toggle/labcoat/mad, ) @@ -38,7 +38,7 @@ /obj/effect/spawner/costume/elpresidente name = "el presidente costume spawner" items = list( - /obj/item/clothing/under/rank/captain/suit, + /obj/item/clothing/under/costume/captain, /obj/item/clothing/head/flatcap, /obj/item/cigarette/cigar/havana, /obj/item/clothing/shoes/jackboots, diff --git a/code/game/objects/effects/spawners/random/armory.dm b/code/game/objects/effects/spawners/random/armory.dm index d4a142405399..3661a510ad06 100644 --- a/code/game/objects/effects/spawners/random/armory.dm +++ b/code/game/objects/effects/spawners/random/armory.dm @@ -62,6 +62,33 @@ icon_state = "laser_gun" loot = list(/obj/item/gun/energy/laser) +/obj/effect/spawner/random/armory/laser_pistol + name = "laser pistol spawner" + icon_state = "laser_gun" + spawn_loot_count = 6 + loot = list(/obj/item/gun/energy/laser/pistol) + +/obj/effect/spawner/random/armory/laser_carbine + name = "laser_carbine spawner" + icon_state = "laser_gun" + loot = list(/obj/item/gun/energy/laser/carbine) + +/obj/effect/spawner/random/armory/assault_laser + name = "assault laser gun spawner" + icon_state = "laser_gun" + spawn_loot_count = 1 + loot = list(/obj/item/gun/energy/laser/assault) + +/obj/effect/spawner/random/armory/pick_laser_loadout + name = "laser gun type randomizer" + icon_state = "laser_gun" + spawn_loot_count = 1 + loot = list( + /obj/effect/spawner/random/armory/laser_gun = 30, + /obj/effect/spawner/random/armory/laser_carbine = 30, + /obj/effect/spawner/random/armory/laser_pistol = 10, + ) + /obj/effect/spawner/random/armory/e_gun name = "energy gun spawner" icon_state = "e_gun" diff --git a/code/game/objects/effects/spawners/random/bureaucracy.dm b/code/game/objects/effects/spawners/random/bureaucracy.dm index 7a6b62618e6f..ea66c109a10a 100644 --- a/code/game/objects/effects/spawners/random/bureaucracy.dm +++ b/code/game/objects/effects/spawners/random/bureaucracy.dm @@ -19,7 +19,7 @@ name = "stamp spawner" icon_state = "stamp" loot = list( - /obj/item/stamp = 3, + /obj/item/stamp/granted = 3, /obj/item/stamp/denied = 1, ) @@ -42,6 +42,7 @@ icon_state = "paper" loot = list( /obj/item/paper = 20, + /obj/item/paperplane = 2, /obj/item/paper/crumpled = 2, /obj/item/paper/crumpled/bloody = 2, /obj/item/paper/crumpled/muddy = 2, diff --git a/code/game/objects/effects/spawners/random/engineering.dm b/code/game/objects/effects/spawners/random/engineering.dm index 8075b5fc8af3..0b628f3ee33f 100644 --- a/code/game/objects/effects/spawners/random/engineering.dm +++ b/code/game/objects/effects/spawners/random/engineering.dm @@ -118,8 +118,118 @@ /obj/effect/spawner/random/engineering/vending_restock name = "vending restock spawner" icon_state = "vending_restock" - loot_subtype_path = /obj/item/vending_refill - loot = list() + loot = list( + /obj/effect/spawner/random/engineering/vending_restock/common = 935, + /obj/effect/spawner/random/engineering/vending_restock/rare = 60, + /obj/effect/spawner/random/engineering/vending_restock/oddity = 5, + ) + +/obj/effect/spawner/random/engineering/vending_restock/wardrobe + name = "wardrobe vending restock spawner" + icon_state = "vending_restock" + loot = list( + /obj/item/vending_refill/wardrobe/det_wardrobe = 1, + /obj/item/vending_refill/wardrobe/medi_wardrobe = 1, + /obj/item/vending_refill/wardrobe/chem_wardrobe = 1, + /obj/item/vending_refill/wardrobe/viro_wardrobe = 1, + /obj/item/vending_refill/wardrobe/sec_wardrobe = 1, + /obj/item/vending_refill/wardrobe/science_wardrobe = 1, + /obj/item/vending_refill/wardrobe/robo_wardrobe = 1, + /obj/item/vending_refill/wardrobe/gene_wardrobe = 1, + /obj/item/vending_refill/wardrobe/engi_wardrobe = 1, + /obj/item/vending_refill/wardrobe/atmos_wardrobe = 1, + /obj/item/vending_refill/wardrobe/cargo_wardrobe = 1, + /obj/item/vending_refill/wardrobe/hydro_wardrobe = 1, + /obj/item/vending_refill/wardrobe/chap_wardrobe = 1, + /obj/item/vending_refill/wardrobe/chef_wardrobe = 1, + /obj/item/vending_refill/wardrobe/chap_wardrobe = 1, + /obj/item/vending_refill/wardrobe/curator_wardrobe= 1, + /obj/item/vending_refill/wardrobe/jani_wardrobe = 1, + /obj/item/vending_refill/wardrobe/law_wardrobe = 1, + + ) + + +/obj/effect/spawner/random/engineering/vending_restock/food_and_drink + name = "food & drink vending restock spawner" + icon_state = "vending_restock" + loot = list( + /obj/item/vending_refill/cigarette = 1, + /obj/item/vending_refill/cola = 1, + /obj/item/vending_refill/coffee = 1, + /obj/item/vending_refill/snack = 1, + /obj/item/vending_refill/boozeomat = 1, + /obj/item/vending_refill/sustenance = 1, + /obj/item/vending_refill/sovietsoda = 1, + /obj/item/vending_refill/cola/shamblers = 1, + ) + +/obj/effect/spawner/random/engineering/vending_restock/medical + name = "medical vending restock spawner" + icon_state = "vending_restock" + loot = list( + /obj/item/vending_refill/wallmed = 1, + /obj/item/vending_refill/medical = 1, + /obj/item/vending_refill/drugs = 1, + ) + +/obj/effect/spawner/random/engineering/vending_restock/engineering + name = "engineering vending restock spawner" + icon_state = "vending_restock" + loot = list( + /obj/item/vending_refill/engivend = 1, + /obj/item/vending_refill/engineering = 1, + /obj/item/vending_refill/youtool = 1, + /obj/item/vending_refill/modularpc = 1, + /obj/item/vending_refill/robotics = 1, + /obj/item/vending_refill/assist = 1, + ) + +//common everyday vendors +/obj/effect/spawner/random/engineering/vending_restock/common + name = "common vending restock spawner" + icon_state = "vending_restock" + loot = list( + /obj/effect/spawner/random/engineering/vending_restock/wardrobe = 8, //roughtly reduced to half weight due to lameness of drobe contents + /obj/effect/spawner/random/engineering/vending_restock/food_and_drink = 8, + /obj/effect/spawner/random/engineering/vending_restock/engineering = 6, + /obj/effect/spawner/random/engineering/vending_restock/medical = 3, + /obj/item/vending_refill/cart = 1, + /obj/item/vending_refill/clothing = 1, + /obj/item/vending_refill/autodrobe = 1, + /obj/item/vending_refill/security = 1, + /obj/item/vending_refill/custom = 1, + /obj/item/vending_refill/dinnerware = 1, + /obj/item/vending_refill/cytopro = 1, + /obj/item/vending_refill/hydronutrients = 1, + /obj/item/vending_refill/hydroseeds = 1, + /obj/item/vending_refill/games = 1, + ) + +//vendors that should feel rare and special but are unlikely to warp the shift too much +/obj/effect/spawner/random/engineering/vending_restock/rare + name = "rare vending restock spawner" + icon_state = "vending_restock" + loot = list( + /obj/item/vending_refill/syndichem = 1, + /obj/item/vending_refill/cigarette/syndicate = 1, + /obj/item/vending_refill/plasmaresearch = 1, + /obj/item/vending_refill/donksnackvendor = 1, + /obj/item/vending_refill/donksoft = 1, + /obj/item/vending_refill/hotdog = 1, + ) + +//high chance to derail the shift, use cautiously +/obj/effect/spawner/random/engineering/vending_restock/oddity + name = "oddity vending restock spawner" + icon_state = "vending_restock" + loot = list( + + /obj/item/vending_refill/magivend = 1, + /obj/item/vending_refill/liberation = 1, + /obj/item/vending_refill/wardrobe/cent_wardrobe = 1, + + ) /obj/effect/spawner/random/engineering/atmospherics_portable name = "portable atmospherics machine spawner" diff --git a/code/game/objects/effects/spawners/random/entertainment.dm b/code/game/objects/effects/spawners/random/entertainment.dm index 1af5f2ee53be..ea4343512857 100644 --- a/code/game/objects/effects/spawners/random/entertainment.dm +++ b/code/game/objects/effects/spawners/random/entertainment.dm @@ -285,10 +285,13 @@ /obj/item/toy/plush/shark = 3, /obj/item/toy/plush/unicorn = 3, /obj/item/toy/plush/monkey = 3, + /obj/item/toy/plush/donkpocket = 3, // super rare plushies /obj/item/toy/plush/bubbleplush = 2, /obj/item/toy/plush/ratplush = 2, /obj/item/toy/plush/narplush = 2, + /obj/item/toy/plush/whiny_plushie = 2, + /obj/item/toy/plush/rouny = 2, ) /obj/effect/spawner/random/entertainment/colorful_grenades 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 9ec343953f54..c4e89a169dd4 100644 --- a/code/game/objects/effects/spawners/random/food_or_drink.dm +++ b/code/game/objects/effects/spawners/random/food_or_drink.dm @@ -110,7 +110,7 @@ /obj/item/food/grown/onion, /obj/item/food/grown/peanut, /obj/item/food/grown/pineapple, - /obj/item/seeds/plum, + /obj/item/food/grown/plum, /obj/item/food/grown/potato, /obj/item/food/grown/pumpkin, /obj/item/food/grown/carrot, diff --git a/code/game/objects/effects/spawners/random/lavaland_mobs.dm b/code/game/objects/effects/spawners/random/lavaland_mobs.dm index 4c6cf0353245..4fa771c7d778 100644 --- a/code/game/objects/effects/spawners/random/lavaland_mobs.dm +++ b/code/game/objects/effects/spawners/random/lavaland_mobs.dm @@ -55,11 +55,41 @@ desc = "Chance to spawn a rare shiny version." icon = 'icons/mob/simple/lavaland/raptor_big.dmi' icon_state = "raptor_red" + pixel_x = -12 loot = list( - /mob/living/basic/raptor/red = 20, - /mob/living/basic/raptor/white = 20, - /mob/living/basic/raptor/purple = 20, - /mob/living/basic/raptor/green = 20, - /mob/living/basic/raptor/yellow = 20, + /mob/living/basic/raptor/red = 25, + /mob/living/basic/raptor/white = 25, + /mob/living/basic/raptor/purple = 25, + /mob/living/basic/raptor/green = 25, + /mob/living/basic/raptor/yellow = 25, + /mob/living/basic/raptor/blue = 25, /mob/living/basic/raptor/black = 1, ) + +/obj/effect/spawner/random/lavaland_mob/raptor/young + name = "random raptor youngling" + icon_state = "young_red" + loot = list( + /mob/living/basic/raptor/young/red = 25, + /mob/living/basic/raptor/young/white = 25, + /mob/living/basic/raptor/young/purple = 25, + /mob/living/basic/raptor/young/green = 25, + /mob/living/basic/raptor/young/yellow = 25, + /mob/living/basic/raptor/young/blue = 25, + /mob/living/basic/raptor/young/black = 1, + ) + +/obj/effect/spawner/random/lavaland_mob/raptor/baby + name = "random raptor chick" + icon = 'icons/mob/simple/lavaland/raptor_baby.dmi' + icon_state = "baby_red" + pixel_x = 0 + loot = list( + /mob/living/basic/raptor/baby/red = 25, + /mob/living/basic/raptor/baby/white = 25, + /mob/living/basic/raptor/baby/purple = 25, + /mob/living/basic/raptor/baby/green = 25, + /mob/living/basic/raptor/baby/yellow = 25, + /mob/living/basic/raptor/baby/blue = 25, + /mob/living/basic/raptor/baby/black = 1, + ) diff --git a/code/game/objects/effects/spawners/random/structure.dm b/code/game/objects/effects/spawners/random/structure.dm index a83b88c3a986..3e2b64212272 100644 --- a/code/game/objects/effects/spawners/random/structure.dm +++ b/code/game/objects/effects/spawners/random/structure.dm @@ -116,6 +116,7 @@ icon_state = "crate" loot = list( /obj/structure/closet/crate = 20, + /obj/structure/closet/crate/cardboard = 5, /obj/structure/closet/crate/wooden = 1, /obj/structure/closet/crate/internals = 1, /obj/structure/closet/crate/medical = 1, diff --git a/code/game/objects/effects/spawners/random/trash.dm b/code/game/objects/effects/spawners/random/trash.dm index efb4d5c10dbf..d5a510a071d6 100644 --- a/code/game/objects/effects/spawners/random/trash.dm +++ b/code/game/objects/effects/spawners/random/trash.dm @@ -9,7 +9,7 @@ loot = list( /obj/effect/spawner/random/trash/food_packaging = 26, /obj/effect/decal/cleanable/garbage = 20, - /obj/item/trash/can = 8, + /obj/effect/spawner/random/trash/crushed_can = 8, /obj/item/shard = 8, /obj/effect/spawner/random/trash/botanical_waste = 8, /obj/effect/spawner/random/trash/cigbutt = 8, @@ -37,11 +37,11 @@ /obj/item/broken_bottle = 3, /obj/item/reagent_containers/cup/soda_cans/grey_bull = 1, /obj/effect/spawner/random/engineering/tool = 1, - /mob/living/basic/mouse = 1, + /obj/effect/spawner/random/trash/rat = 1, // DARKPACK EDIT CHANGE /mob/living/basic/snail = 1, /obj/item/food/grown/cannabis = 1, /obj/item/rag = 1, - /obj/effect/spawner/random/entertainment/drugs= 1, + /obj/effect/spawner/random/entertainment/drugs = 1, /obj/item/modular_computer/pda = 1, /obj/item/reagent_containers/syringe = 1, /obj/effect/spawner/random/entertainment/cigar = 1, @@ -51,10 +51,33 @@ if(mapload) var/turf/location = get_turf(loc) if(location.initial_gas_mix != OPENTURF_DEFAULT_ATMOS && location.initial_gas_mix != OPENTURF_DIRTY_ATMOS) - loot -= /mob/living/basic/mouse + loot -= /obj/effect/spawner/random/trash/rat loot -= /mob/living/basic/snail return ..() +/obj/effect/spawner/random/trash/cigpack + name = "empty cigarette pack spawner" + loot = list( + /obj/item/storage/fancy/cigarettes/empty = 5, + /obj/item/storage/fancy/cigarettes/cigpack_uplift/empty = 5, + /obj/item/storage/fancy/cigarettes/cigpack_robust/empty = 5, + /obj/item/storage/fancy/cigarettes/cigpack_robustgold/empty = 5, + /obj/item/storage/fancy/cigarettes/cigpack_carp/empty = 5, + /obj/item/storage/fancy/cigarettes/cigpack_midori/empty = 5, + /obj/item/storage/fancy/rollingpapers/empty = 3, + /obj/item/storage/fancy/cigarettes/cigars/empty = 3, + /obj/item/storage/fancy/cigarettes/cigars/cohiba/empty = 3, + /obj/item/storage/fancy/cigarettes/cigars/havana/empty = 3, + /obj/item/storage/fancy/cigarettes/cigpack_greytide/empty = 3, + /obj/item/storage/fancy/cigarettes/dromedaryco/empty = 2, + /obj/item/storage/fancy/cigarettes/cigpack_shadyjims/empty = 2, + /obj/item/storage/fancy/cigarettes/cigpack_xeno/empty = 2, + /obj/item/storage/fancy/cigarettes/cigpack_candy/empty = 2, + /obj/item/storage/fancy/cigarettes/cigpack_cannabis/empty = 1, + /obj/item/storage/fancy/cigarettes/cigpack_mindbreaker/empty = 1, + /obj/item/storage/fancy/cigarettes/cigpack_syndicate/empty = 1, + ) + /obj/effect/spawner/random/trash/cigbutt name = "cigarette butt spawner" loot = list( @@ -72,25 +95,52 @@ /obj/item/trash/raisins = 2, /obj/item/trash/cheesie = 2, /obj/item/trash/candy = 2, - /obj/item/trash/chips = 2, + /obj/item/trash/chips = 10, // DARKPACK EDIT CHANGE /obj/item/trash/sosjerky = 2, /obj/item/trash/pistachios = 2, /obj/item/trash/peanuts = 2, + /obj/item/reagent_containers/cup/glass/sillycup = 2, /obj/item/trash/boritos = 1, /obj/item/trash/boritos/green = 1, /obj/item/trash/boritos/purple = 1, /obj/item/trash/boritos/red = 1, /obj/item/trash/can/food/beans = 1, /obj/item/trash/can/food/peaches = 1, + /obj/item/trash/can/food/peaches/maint = 1, + /obj/item/trash/can/food/tomatoes = 1, /obj/item/trash/can/food/envirochow = 1, + /obj/item/trash/can/food/squid_ink = 1, + /obj/item/trash/can/food/chap = 1, + /obj/item/trash/can/food/jellyfish = 1, + /obj/item/trash/can/food/desert_snails = 1, + /obj/item/trash/can/food/larvae = 1, + /obj/item/trash/can/food/pine_nuts = 1, /obj/item/trash/popcorn = 1, + /obj/item/trash/popcorn/salty = 1, /obj/item/trash/energybar = 1, - /obj/item/trash/can/food/peaches/maint = 1, /obj/item/trash/semki = 1, + /obj/item/trash/semki/healthy = 1, /obj/item/trash/cnds = 1, /obj/item/trash/syndi_cakes = 1, /obj/item/trash/shrimp_chips = 1, + /obj/item/trash/hot_shots = 1, + /obj/item/trash/sticko = 1, + /obj/item/trash/sticko/matcha = 1, + /obj/item/trash/sticko/nutty = 1, + /obj/item/trash/sticko/pineapple = 1, + /obj/item/trash/sticko/yuyake = 1, + /obj/item/trash/shok_roks = 1, + /obj/item/trash/shok_roks/citrus = 1, + /obj/item/trash/shok_roks/berry = 1, + /obj/item/trash/shok_roks/tropical = 1, + /obj/item/trash/shok_roks/lanternfruit = 1, + /obj/item/trash/fleet_ration = 1, + /obj/item/trash/spacers_sidekick = 1, + /obj/item/popsicle_stick = 1, + /obj/item/trash/ready_donk = 1, /obj/item/trash/tray = 1, + /obj/item/trash/vampirebar = 5, // DARKPACK EDIT ADD START + /obj/item/trash/vampirenugget = 1, // DARKPACK EDIT ADD END ) /obj/effect/spawner/random/trash/botanical_waste @@ -136,6 +186,9 @@ name = "gross decal spawner" icon_state = "vomit" loot = list( + /obj/effect/decal/cleanable/trash = 20, // DARKPACK EDIT ADD START + /obj/effect/decal/cleanable/litter = 6, + /obj/effect/decal/cleanable/cardboard = 6, // DARKPACK EDIT ADD END /obj/effect/decal/cleanable/dirt = 6, /obj/effect/decal/cleanable/garbage = 3, /obj/effect/decal/cleanable/vomit/old = 3, @@ -154,19 +207,20 @@ spawn_scatter_radius = 2 loot = list( // This spawner will scatter garbage around a dirty site. /obj/effect/spawner/random/trash/garbage = 6, - // DARKPACK EDIT CHANGE START - /mob/living/basic/cockroach = 4, +// DARKPACK EDIT CHANGE START /obj/effect/decal/cleanable/garbage = 4, /obj/effect/decal/cleanable/vomit/old = 3, /obj/effect/spawner/random/trash/cigbutt = 2, + /mob/living/basic/cockroach = 1, ) /obj/effect/spawner/random/trash/grime/Initialize(mapload) if(mapload) var/turf/location = get_turf(loc) if(location.initial_gas_mix != OPENTURF_DEFAULT_ATMOS && location.initial_gas_mix != OPENTURF_DIRTY_ATMOS) - loot -= list(/mob/living/basic/cockroach, /mob/living/basic/cockroach/bloodroach) + loot -= /mob/living/basic/cockroach return ..() +// DARKPACK EDIT CHANGE END /obj/effect/spawner/random/trash/moisture name = "water hazard spawner" @@ -285,7 +339,8 @@ name = "box spawner" icon_state = "box" loot = list( - /obj/structure/closet/cardboard = 9, + /obj/structure/closet/cardboard = 5, + /obj/structure/closet/crate/cardboard = 4, /obj/structure/closet/cardboard/metal = 1, ) diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index 6dd8729cf977..271cdaaf69ea 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -371,11 +371,16 @@ again. return ..() /obj/effect/spawner/structure/electrified_grille - name = "electrified grill spawner" + name = "electrified grille spawner" icon = 'icons/obj/structures_spawners.dmi' icon_state = "electrified_grille" spawn_list = list(/obj/structure/grille, /obj/structure/cable) +/obj/effect/spawner/structure/electrified_grille/layer1 + name = "layer 1 electrified grille spawner" + icon_state = "red_electrified_grille" + spawn_list = list(/obj/structure/grille, /obj/structure/cable/layer1) + ///flipped tables /obj/effect/spawner/structure/flipped_table name = "flipped table spawner" diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 247a372fcb65..55239756339c 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -245,8 +245,10 @@ setDir(mimiced_atom.dir) mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/effect/temp_visual/decoy/fading/Initialize(mapload, atom/mimiced_atom) +/obj/effect/temp_visual/decoy/fading/Initialize(mapload, atom/mimiced_atom, start_alpha) . = ..() + if (start_alpha) + alpha = start_alpha animate(src, alpha = 0, time = duration) /obj/effect/temp_visual/decoy/fading/threesecond @@ -802,3 +804,24 @@ color = COLOR_FULL_TONER_BLACK duration = 12 SECONDS amount_to_scale = 12 + +/obj/effect/temp_visual/circle_wave/star_blast + color = COLOR_VOID_PURPLE + +/obj/effect/temp_visual/focus_ring + randomdir = FALSE + name = "ring" + icon_state = "focus_ring" + layer = BELOW_MOB_LAYER + duration = 2.5 SECONDS + pixel_y = -4 + alpha = 0 + +/obj/effect/temp_visual/focus_ring/Initialize(mapload) + . = ..() + animate(src, alpha = 100, time = 2 SECONDS, easing = QUAD_EASING|EASE_IN) + addtimer(CALLBACK(src, PROC_REF(dissipate)), 2 SECONDS) + + +/obj/effect/temp_visual/focus_ring/proc/dissipate() + animate(src, alpha = 0, time = 0.5 SECONDS, easing = QUAD_EASING|EASE_OUT) diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index e7246fd04ef6..640e08da102f 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -1,13 +1,13 @@ -/proc/empulse(turf/epicenter, heavy_range, light_range, log=0) +/proc/empulse(turf/epicenter, heavy_range, light_range, emp_source) if(!epicenter) return if(!isturf(epicenter)) epicenter = get_turf(epicenter.loc) - if(log) - message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") - log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") + if(emp_source) + message_admins("EMP with size ([heavy_range], [light_range]) in [ADMIN_VERBOSEJMP(epicenter)], caused by [emp_source] ") + log_game("EMP with size ([heavy_range], [light_range]) in [ADMIN_VERBOSEJMP(epicenter)], caused by [emp_source] ") if(heavy_range > 1) new /obj/effect/temp_visual/emp/pulse(epicenter) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 16afa2cd7634..269211ab1f79 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -184,7 +184,7 @@ VAR_PROTECTED/datum/embedding/embed_data ///for flags such as [GLASSESCOVERSEYES] - var/flags_cover = 0 + var/flags_cover = NONE var/heat = 0 /// All items with sharpness of SHARP_EDGED or higher will automatically get the butchering component. var/sharpness = NONE @@ -225,11 +225,6 @@ ///What dye registry should be looked at when dying this item; see washing_machine.dm var/dying_key - ///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 - ///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 @@ -240,14 +235,6 @@ /// A lazylist used for applying fantasy values, contains the actual modification applied to a variable. var/list/fantasy_modifications = null - /// Has the item been reskinned? - var/current_skin - /// List of options to reskin. - var/list/unique_reskin - /// If reskins change base icon state as well - var/unique_reskin_changes_base_icon_state = FALSE - /// If reskins change inhands as well - var/unique_reskin_changes_inhand = FALSE /// Do we apply a click cooldown when resisting this object if it is restraining them? var/resist_cooldown = CLICK_CD_BREAKOUT @@ -283,8 +270,6 @@ SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_ITEM, src) - setup_reskinning() - /obj/item/Destroy(force) // This var exists as a weird proxy "owner" ref // It's used in a few places. Stop using it, and optimially replace all uses please @@ -299,19 +284,6 @@ return ..() - -/obj/item/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - - if(!unique_reskin) - return - - if(current_skin && !(obj_flags & INFINITE_RESKIN)) - return - - context[SCREENTIP_CONTEXT_ALT_LMB] = "Reskin" - return CONTEXTUAL_SCREENTIP_SET - /obj/item/click_ctrl(mob/user) SHOULD_NOT_OVERRIDE(TRUE) @@ -610,7 +582,7 @@ if(throwing) throwing.finalize(FALSE) if(loc == user && outside_storage) - if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src)) + if(!can_mob_unequip(user) || !user.temporarilyRemoveItemFromInventory(src)) return . = FALSE @@ -620,7 +592,9 @@ user.dropItemToGround(src) return TRUE -/obj/item/proc/allow_attack_hand_drop(mob/user) +/// Called when a mob is manually attempting to unequip the item +/// Returning FALSE will prevent the unequip from happening +/obj/item/proc/can_mob_unequip(mob/user) return TRUE /obj/item/attack_paw(mob/user, list/modifiers) @@ -737,10 +711,10 @@ if(item_flags & DROPDEL && !QDELETED(src)) qdel(src) - item_flags &= ~IN_INVENTORY UnregisterSignal(src, list(SIGNAL_ADDTRAIT(TRAIT_NO_WORN_ICON), SIGNAL_REMOVETRAIT(TRAIT_NO_WORN_ICON))) SEND_SIGNAL(src, COMSIG_ITEM_DROPPED, user) - if(!silent) + SEND_SIGNAL(user, COMSIG_MOB_DROPPED_ITEM, src) + if(!silent && drop_sound) play_drop_sound(DROP_SOUND_VOLUME) /// called just as an item is picked up (loc is not yet changed) @@ -748,7 +722,6 @@ SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user) SEND_SIGNAL(user, COMSIG_LIVING_PICKED_UP_ITEM, src) - item_flags |= IN_INVENTORY /// called when "found" in pockets and storage items. Returns 1 if the search should end. /obj/item/proc/on_found(mob/finder) @@ -806,7 +779,6 @@ for(var/datum/action/action as anything in actions) give_item_action(action, user, slot) - item_flags |= IN_INVENTORY RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_NO_WORN_ICON), SIGNAL_REMOVETRAIT(TRAIT_NO_WORN_ICON)), PROC_REF(update_slot_icon), override = TRUE) if(!initial && (slot_flags & slot) && (play_equip_sound())) @@ -973,7 +945,7 @@ /obj/item/proc/update_slot_icon() SIGNAL_HANDLER - if(!ismob(loc)) + if(!ismob(loc) || QDELETED(loc)) return var/mob/owner = loc owner.update_clothing(slot_flags | owner.get_slot_by_item(src)) @@ -1006,6 +978,13 @@ location = get_turf(pyromanic) if(isturf(location)) location.hotspot_expose(flame_heat, 5) + // DARKPACK EDIT ADD START - TURF_FIRE + if(SEND_SIGNAL(location, COMSIG_TURF_OPEN_FLAME, flame_heat) & BLOCK_TURF_IGNITION) + return + var/turf/open/open_location = loc // NOT the location variable used earlier else cigarettes in mouths start fires + if(isopenturf(open_location) && open_location.flammability >= 1 && prob(open_location.flammability)) + open_location.ignite_turf(2) // if there's enough flammability for a fire to sustain itself.. + // DARKPACK EDIT ADD END /// If an object can successfully be used as a fire starter it will return a message /obj/item/proc/ignition_effect(atom/A, mob/user) @@ -1053,6 +1032,12 @@ /obj/item/proc/blend_requirements(obj/machinery/reagentgrinder/R) return TRUE +///Returns a reagent list containing the reagents this item produces when ground up in a grinder +/obj/item/proc/grind_results() + RETURN_TYPE(/list/datum/reagent) + + return null + ///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() PROTECTED_PROC(TRUE) @@ -1086,18 +1071,26 @@ /obj/item/proc/grind_atom(datum/reagents/target_holder, mob/user) PROTECTED_PROC(TRUE) + var/list/datum/reagent/grind_reagents = grind_results() + . = FALSE - if(length(grind_results)) - target_holder.add_reagent_list(grind_results) + if(length(grind_reagents)) + target_holder.add_reagent_list(grind_reagents) . = TRUE if(reagents?.trans_to(target_holder, reagents.total_volume, transferred_by = user)) . = TRUE +///Returns A reagent the nutriments are converted into when the item is juiced. +/obj/item/proc/juice_typepath() + RETURN_TYPE(/datum/reagent) + + return null + ///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() PROTECTED_PROC(TRUE) - if(!juice_typepath) + if(!juice_typepath()) return -1 return SEND_SIGNAL(src, COMSIG_ITEM_ON_JUICE) @@ -1131,9 +1124,11 @@ . = FALSE - if(ispath(juice_typepath)) - reagents.convert_reagent(/datum/reagent/consumable/nutriment, juice_typepath, include_source_subtypes = FALSE) - reagents.convert_reagent(/datum/reagent/consumable/nutriment/vitamin, juice_typepath, include_source_subtypes = FALSE) + var/juice_result = juice_typepath() + + if(ispath(juice_result)) + reagents.convert_reagent(/datum/reagent/consumable/nutriment, juice_result, include_source_subtypes = FALSE) + reagents.convert_reagent(/datum/reagent/consumable/nutriment/vitamin, juice_result, include_source_subtypes = FALSE) . = TRUE if(!QDELETED(target_holder)) @@ -1213,9 +1208,13 @@ if("operative") outline_color = COLOR_THEME_OPERATIVE if("clockwork") - outline_color = COLOR_THEME_CLOCKWORK //if you want free gbp go fix the fact that clockwork's tooltip css is glass' + outline_color = COLOR_THEME_CLOCKWORK if("glass") outline_color = COLOR_THEME_GLASS + if("trasen-knox") + outline_color = COLOR_THEME_TRASENKNOX + if("detective") + outline_color = COLOR_THEME_DETECTIVE else //this should never happen, hopefully outline_color = COLOR_WHITE if(color) @@ -1318,28 +1317,26 @@ /obj/item/proc/get_part_rating() return 0 +/** + * this proc override makes sure that even if DoUnEquip is not properly called through the appropriate channels, + * it'll still be called if we find that the item has the IN_INVENTORY flag. + * + * THIS IS BY NO MEAN AN EXCUSE TO KNOWINGLY AVOID CALLING THE RIGHT PROCS FOR INVENTORY MANAGEMENT, + * BUT A FALLBACK IN THE CASE WE MISTAKINGLY DON'T, TO MAKE SURE THINGS WORK AS INTENDED SINCE + * INVENTORY MANAGEMENT HAS A LOT MORE TO IT THAN JUST CALLING A PROC OR TWO MANUALLY. + */ /obj/item/doMove(atom/destination) - if (!ismob(loc)) + if (!(item_flags & IN_INVENTORY)) return ..() - var/mob/owner = loc - var/hand_index = owner.get_held_index_of_item(src) - if(!hand_index) + if(!ismob(loc)) + stack_trace("[src] had the IN_INVENTORY flag but the location was not a mob!") + item_flags &= ~IN_INVENTORY return ..() - owner.held_items[hand_index] = null - owner.update_held_items() - if(owner.client) - owner.client.screen -= src - if(owner.observers?.len) - for(var/mob/dead/observe as anything in owner.observers) - if(observe.client) - observe.client.screen -= src - layer = initial(layer) - SET_PLANE_IMPLICIT(src, initial(plane)) - appearance_flags &= ~NO_CLIENT_COLOR - dropped(owner, FALSE) - return ..() + var/mob/owner = loc + // This should remove the IN_INVENTORY flag. Otherwise we'll end up having a loop + owner.transferItemToLoc(src, destination, force = TRUE, silent = TRUE, animated = FALSE) /obj/item/proc/canStrip(mob/stripper, mob/owner) SHOULD_BE_PURE(TRUE) @@ -1779,7 +1776,7 @@ /// 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) - var/chosen_color = input(user,"Pick new color", "[src]", default_color) as color|null + var/chosen_color = tgui_color_picker(user, "Pick new color", "[src]", default_color) if(!chosen_color || QDELETED(src) || IS_DEAD_OR_INCAP(user) || !user.is_holding(src)) return set_painting_tool_color(chosen_color) @@ -2094,3 +2091,11 @@ target_limb = victim.get_bodypart(target_limb) || victim.bodyparts[1] return get_embed()?.embed_into(victim, target_limb) + +/// Checks if user can insert a valid container into the chemistry machine. +/obj/item/proc/can_insert_container(mob/living/user, obj/machinery/chem_machine) + return is_chem_container() && chem_machine.can_interact(user) && user.can_perform_action(chem_machine, ALLOW_SILICON_REACH | FORBID_TELEKINESIS_REACH) + +/// Checks if this container is valid for use with chemistry machinery. +/obj/item/proc/is_chem_container() + return FALSE diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index f8824861dba0..ce9d9be36860 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -6,34 +6,21 @@ result_path = /obj/machinery/power/apc/auto_name /obj/item/wallframe/apc/try_build(turf/on_wall, user) - if(!..()) - return var/turf/T = get_turf(on_wall) //the user is not where it needs to be. var/area/A = get_area(user) if(A.apc) to_chat(user, span_warning("This area already has an APC!")) - return //only one APC per area - if(!A.requires_power) + return FALSE //only one APC per area + if(!A.requires_power || A.always_unpowered) to_chat(user, span_warning("You cannot place [src] in this area!")) - return //can't place apcs in areas with no power requirement + return FALSE //can't place apcs in areas with no power requirement for(var/obj/machinery/power/terminal/E in T) if(E.master) to_chat(user, span_warning("There is another network terminal here!")) - return - else - new /obj/item/stack/cable_coil(T, 10) - to_chat(user, span_notice("You cut the cables and disassemble the unused power terminal.")) - qdel(E) - return TRUE - -/obj/item/wallframe/apc/screwdriver_act(mob/living/user, obj/item/tool) - //overriding the wallframe parent screwdriver act with this one which allows applying to existing apc frames. + return FALSE + return ..() - var/turf/turf = get_step(get_turf(user), user.dir) - if(iswallturf(turf)) - if(locate(/obj/machinery/power/apc) in get_turf(user)) - var/obj/machinery/power/apc/mounted_apc = locate(/obj/machinery/power/apc) in get_turf(user) - mounted_apc.wallframe_act(user, src) - return ITEM_INTERACT_SUCCESS - turf.item_interaction(user, src) - return ITEM_INTERACT_SUCCESS +/obj/item/wallframe/apc/after_attach(obj/machinery/power/apc/attached_to) + for(var/obj/machinery/power/terminal/E in attached_to.loc) + attached_to.make_terminal() + return diff --git a/code/game/objects/items/binoculars.dm b/code/game/objects/items/binoculars.dm index 5557d457d4a7..f84c41475438 100644 --- a/code/game/objects/items/binoculars.dm +++ b/code/game/objects/items/binoculars.dm @@ -9,6 +9,7 @@ righthand_file = 'icons/mob/inhands/items_righthand.dmi' slot_flags = ITEM_SLOT_NECK | ITEM_SLOT_BELT w_class = WEIGHT_CLASS_SMALL + custom_price = 300 // DARKPACK EDIT ADD - ECONOMY /obj/item/binoculars/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/broom.dm b/code/game/objects/items/broom.dm index 970bb5a55261..1456913b6125 100644 --- a/code/game/objects/items/broom.dm +++ b/code/game/objects/items/broom.dm @@ -18,6 +18,7 @@ attack_verb_continuous = list("sweeps", "brushes off", "bludgeons", "whacks") attack_verb_simple = list("sweep", "brush off", "bludgeon", "whack") resistance_flags = FLAMMABLE + custom_price = 20 // DARKPACK EDIT ADD - ECONOMY /obj/item/pushbroom/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/busts_and_figurines.dm b/code/game/objects/items/busts_and_figurines.dm index 592302cab677..660fffa2d833 100644 --- a/code/game/objects/items/busts_and_figurines.dm +++ b/code/game/objects/items/busts_and_figurines.dm @@ -109,7 +109,7 @@ // 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) + user.adjust_organ_loss(ORGAN_SLOT_BRAIN, 2) COOLDOWN_RESET(src, oath_cd) /obj/item/maneki_neko diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index 36efc61481d6..89f9a14d99cb 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -8,6 +8,7 @@ resistance_flags = FLAMMABLE obj_flags = CAN_BE_HIT item_flags = NO_PIXEL_RANDOM_DROP + custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT * 5) /// If the cutout is pushed over and has to be righted var/pushed_over = FALSE /// If the cutout actually appears as what it portray and not a discolored version diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index edca8559a20a..ebe92fe1e71e 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -29,6 +29,7 @@ pickup_sound = 'sound/items/handling/id_card/id_card_pickup1.ogg' drop_sound = 'sound/items/handling/id_card/id_card_drop1.ogg' sound_vary = TRUE + slot_flags = ITEM_SLOT_ID // DARKPACK EDIT ADD /// 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 @@ -141,7 +142,7 @@ /obj/item/card/id/Initialize(mapload) . = ..() - /* DARKPACK EDIT REMOVAL - ECONOMY + /* // DARKPACK EDIT REMOVAL - ECONOMY var/datum/bank_account/blank_bank_account = new("Unassigned", SSjob.get_job_type(/datum/job/unassigned), player_account = FALSE) registered_account = blank_bank_account registered_account.replaceable = TRUE @@ -549,11 +550,11 @@ else if(istype(held_item, /obj/item/rupee)) context[SCREENTIP_CONTEXT_LMB] = "Insert?" - /* DARKPACK EDIT REMOVAL - ECONOMY + /* // DARKPACK EDIT REMOVAL - ECONOMY if(isnull(registered_account) || registered_account.replaceable) //Same check we use when we check if we can assign an account context[SCREENTIP_CONTEXT_ALT_RMB] = "Assign account" else if(registered_account.account_balance > 0) - context[SCREENTIP_CONTEXT_ALT_LMB] = "Withdraw credits" + context[SCREENTIP_CONTEXT_ALT_LMB] = "Withdraw [MONEY_NAME]" */ if(trim && length(trim.honorifics)) context[SCREENTIP_CONTEXT_CTRL_LMB] = "Toggle honorific" @@ -680,7 +681,7 @@ var/money_added = mass_insert_money(money_contained, user) if(!money_added) return ITEM_INTERACT_BLOCKING - to_chat(user, span_notice("You stuff the contents into the card! They disappear in a puff of bluespace smoke, adding [money_added] worth of credits to the linked account.")) + to_chat(user, span_notice("You stuff the contents into the card! They disappear in a puff of bluespace smoke, adding [money_added] worth of [MONEY_NAME] to the linked account.")) return ITEM_INTERACT_SUCCESS return NONE @@ -707,13 +708,13 @@ return FALSE registered_account.adjust_money(cash_money, "System: Deposit") SSblackbox.record_feedback("amount", "credits_inserted", cash_money) - log_econ("[cash_money] credits were inserted into [src] owned by [src.registered_name]") + log_econ("[cash_money] [MONEY_NAME] were inserted into [src] owned by [src.registered_name]") if(physical_currency) - to_chat(user, span_notice("You stuff [money] into [src]. It disappears in a small puff of bluespace smoke, adding [cash_money] credits to the linked account.")) + to_chat(user, span_notice("You stuff [money] into [src]. It disappears in a small puff of bluespace smoke, adding [cash_money] [MONEY_NAME] to the linked account.")) else - to_chat(user, span_notice("You insert [money] into [src], adding [cash_money] credits to the linked account.")) + to_chat(user, span_notice("You insert [money] into [src], adding [cash_money] [MONEY_NAME] to the linked account.")) - to_chat(user, span_notice("The linked account now reports a balance of [registered_account.account_balance] cr.")) + to_chat(user, span_notice("The linked account now reports a balance of [registered_account.account_balance] [MONEY_SYMBOL].")) qdel(money) return TRUE @@ -740,7 +741,7 @@ registered_account.adjust_money(total, "System: Deposit") SSblackbox.record_feedback("amount", "credits_inserted", total) - log_econ("[total] credits were inserted into [src] owned by [src.registered_name]") + log_econ("[total] [MONEY_NAME] were inserted into [src] owned by [src.registered_name]") QDEL_LIST(money) return total @@ -776,12 +777,15 @@ account.account_balance += old_account.account_balance account.bank_cards += src registered_account = account - to_chat(user, span_notice("The provided account has been linked to this ID card. It contains [account.account_balance] credits.")) + to_chat(user, span_notice("The provided account has been linked to this ID card. It contains [account.account_balance] [MONEY_NAME].")) return TRUE /obj/item/card/id/click_alt(mob/living/user) if(!alt_click_can_use_id(user)) return NONE + if (registered_account.being_dumped) + registered_account.bank_card_talk(span_warning("内部服务器错误"), TRUE) + return CLICK_ACTION_SUCCESS 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) @@ -789,9 +793,6 @@ if(choice == "Pay Debt") pay_debt(user) return CLICK_ACTION_SUCCESS - if (registered_account.being_dumped) - registered_account.bank_card_talk(span_warning("内部服务器错误"), TRUE) - return CLICK_ACTION_SUCCESS if(loc != user) to_chat(user, span_warning("You must be holding the ID to continue!")) return CLICK_ACTION_BLOCKING @@ -802,22 +803,22 @@ if(choice == "Link Account") set_new_account(user) return CLICK_ACTION_SUCCESS - var/amount_to_remove = tgui_input_number(user, "How much do you want to withdraw? (Max: [registered_account.account_balance] cr)", "Withdraw Funds", max_value = registered_account.account_balance) + var/amount_to_remove = tgui_input_number(user, "How much do you want to withdraw? (Max: [registered_account.account_balance] [MONEY_SYMBOL])", "Withdraw Funds", max_value = registered_account.account_balance) if(!amount_to_remove || QDELETED(user) || QDELETED(src) || issilicon(user) || loc != user) return CLICK_ACTION_BLOCKING if(!alt_click_can_use_id(user)) return CLICK_ACTION_BLOCKING - if(registered_account.adjust_money(-amount_to_remove, "System: Withdrawal")) - var/obj/item/holochip/holochip = new (user.drop_location(), amount_to_remove) - user.put_in_hands(holochip) - to_chat(user, span_notice("You withdraw [amount_to_remove] credits into a holochip.")) - SSblackbox.record_feedback("amount", "credits_removed", amount_to_remove) - log_econ("[amount_to_remove] credits were removed from [src] owned by [src.registered_name]") - return CLICK_ACTION_SUCCESS - else + if(!registered_account.adjust_money(-amount_to_remove, "System: Withdrawal")) 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) + registered_account.bank_card_talk(span_warning("ERROR: The linked account requires [difference] more [MONEY_NAME_AUTOPURAL(difference)] to perform that withdrawal."), TRUE) return CLICK_ACTION_BLOCKING + var/obj/item/holochip/holochip = new (user.drop_location(), amount_to_remove) + user.put_in_hands(holochip) + to_chat(user, span_notice("You withdraw [amount_to_remove] [MONEY_NAME] into a holochip.")) + SSblackbox.record_feedback("amount", "credits_removed", amount_to_remove) + log_econ("[amount_to_remove] [MONEY_NAME] were removed from [src] owned by [registered_name]") + return CLICK_ACTION_SUCCESS + /obj/item/card/id/click_alt_secondary(mob/user) if(!alt_click_can_use_id(user)) @@ -826,15 +827,15 @@ set_new_account(user) /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)) + var/amount_to_pay = tgui_input_number(user, "How much do you want to pay? (Max: [registered_account.account_balance] [MONEY_SYMBOL])", "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.") + var/message = span_notice("You pay [amount_to_pay] [MONEY_NAME] of a [prev_debt] [MONEY_SYMBOL] debt. [registered_account.account_debt] [MONEY_SYMBOL] to go.") if(!registered_account.account_debt) - message = span_nicegreen("You pay the last [amount_to_pay] credits of your debt, extinguishing it. Congratulations!") + message = span_nicegreen("You pay the last [amount_to_pay] [MONEY_NAME] of your debt, extinguishing it. Congratulations!") to_chat(user, message) /obj/item/card/id/examine(mob/user) @@ -842,19 +843,19 @@ if(!user.can_read(src)) return - /* DARKPACK EDIT REMOVAL - ECONOMY + /* // DARKPACK EDIT REMOVAL - ECONOMY if(registered_account && !isnull(registered_account.account_id)) - . += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr." + . += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] [MONEY_SYMBOL]." if(ACCESS_COMMAND in access) var/datum/bank_account/linked_dept = SSeconomy.get_dep_account(registered_account.account_job.paycheck_department) - . += "The [linked_dept.account_holder] linked to the ID reports a balance of [linked_dept.account_balance] cr." + . += "The [linked_dept.account_holder] linked to the ID reports a balance of [linked_dept.account_balance] [MONEY_SYMBOL]." else . += span_notice("Alt-Right-Click the ID to set the linked bank account.") */ if(HAS_TRAIT(user, TRAIT_ID_APPRAISER)) . += HAS_TRAIT(src, TRAIT_JOB_FIRST_ID_CARD) ? span_boldnotice("Hmm... yes, this ID was issued from Central Command!") : span_boldnotice("This ID was created in this sector, not by Central Command.") - if(HAS_TRAIT(src, TRAIT_TASTEFULLY_THICK_ID_CARD) && (user.is_holding(src) || (user.CanReach(src) && user.put_in_hands(src, ignore_animation = FALSE)))) + if(HAS_TRAIT(src, TRAIT_TASTEFULLY_THICK_ID_CARD) && (user.is_holding(src) || (IsReachableBy(user) && user.put_in_hands(src, ignore_animation = FALSE)))) ADD_TRAIT(src, TRAIT_NODROP, "psycho") . += span_hypnophrase("Look at that subtle coloring... The tasteful thickness of it. Oh my God, it even has a watermark...") var/sound/slowbeat = sound('sound/effects/health/slowbeat.ogg', repeat = TRUE) @@ -885,19 +886,19 @@ if(registered_age) . += "The card indicates that the holder is [registered_age] years old. [(registered_age < AGE_MINOR) ? "There's a holographic stripe that reads [span_danger("'MINOR: DO NOT SERVE ALCOHOL OR TOBACCO'")] along the bottom of the card." : ""]" - /* DARKPACK EDIT REMOVAL - ECONOMY + /* // DARKPACK EDIT REMOVAL - ECONOMY if(registered_account) 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." + . += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] [MONEY_SYMBOL]." 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.") + . += span_warning("The account is currently indebted for [registered_account.account_debt] [MONEY_SYMBOL]. [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) - . += "The [D.account_holder] reports a balance of [D.account_balance] cr." + . += "The [D.account_holder] reports a balance of [D.account_balance] [MONEY_SYMBOL]." . += span_info("Alt-Click the ID to pull money from the linked account in the form of holochips.") - . += span_info("You can insert credits into the linked account by pressing holochips, cash, or coins against the ID.") + . += span_info("You can insert [MONEY_NAME] into the linked account by pressing holochips, cash, or coins against the ID.") if(registered_account.replaceable) . += span_info("Alt-Right-Click the ID to change the linked bank account.") if(registered_account.civilian_bounty) @@ -1940,8 +1941,11 @@ 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_length = 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) + var/default_age = AGE_MIN + if(ishuman(user)) + var/mob/living/carbon/human/human_user = user + default_age = human_user.age ? clamp(human_user.age, AGE_MIN, AGE_MAX) : AGE_MIN + var/new_age = tgui_input_number(user, "Choose the ID's age", "Agent card age", default_age, AGE_MAX, AGE_MIN) if(!after_input_check(user)) return TRUE @@ -2063,6 +2067,7 @@ worn_icon_state = "nothing" resistance_flags = FLAMMABLE slot_flags = ITEM_SLOT_ID + custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT) ///The "name" of the "owner" of this "ID" var/scribbled_name ///The assignment written on this card. @@ -2139,7 +2144,7 @@ /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)) + if(QDELETED(user) || QDELETED(item) || QDELETED(src) || user.incapacitated || !user.is_holding(item) || !IsReachableBy(user) || !user.can_write(item)) return FALSE return TRUE diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm index d316725fbfea..ed5a62cc562a 100644 --- a/code/game/objects/items/chainsaw.dm +++ b/code/game/objects/items/chainsaw.dm @@ -24,6 +24,7 @@ actions_types = list(/datum/action/item_action/startchainsaw) tool_behaviour = TOOL_SAW toolspeed = 1.5 //Turn it on first you dork + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 3) var/force_on = 24 /// The looping sound for our chainsaw when running var/datum/looping_sound/chainsaw/chainsaw_loop diff --git a/code/game/objects/items/cigarettes.dm b/code/game/objects/items/cigarettes.dm index 098cd7a05351..e0c1bf290965 100644 --- a/code/game/objects/items/cigarettes.dm +++ b/code/game/objects/items/cigarettes.dm @@ -22,7 +22,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM base_icon_state = "match" w_class = WEIGHT_CLASS_TINY heat = 1000 - grind_results = list(/datum/reagent/phosphorus = 2) /// Whether this match has been lit. var/lit = FALSE /// Whether this match has burnt out. @@ -32,6 +31,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM /// If the match is broken var/broken = FALSE +/obj/item/match/grind_results() + return list(/datum/reagent/phosphorus = 2) + /obj/item/match/process(seconds_per_tick) smoketime -= seconds_per_tick * (1 SECONDS) if(smoketime <= 0) @@ -163,8 +165,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM name = "firebrand" desc = "An unlit firebrand. It makes you wonder why it's not just called a stick." smoketime = 40 SECONDS - custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/carbon = 2) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) + +/obj/item/match/firebrand/grind_results() + return list(/datum/reagent/carbon = 2) /obj/item/match/firebrand/Initialize(mapload) . = ..() @@ -175,6 +179,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM desc = "A budget lighter done by using a battery and some aluminium. Hold tightly to ignite." icon_state = "battery_unlit" base_icon_state = "battery" + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.5) /obj/item/match/battery/attack_self(mob/living/user, modifiers) . = ..() @@ -198,7 +203,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM throw_speed = 0.5 w_class = WEIGHT_CLASS_TINY slot_flags = ITEM_SLOT_MASK - grind_results = list() heat = 1000 light_range = 1 light_color = LIGHT_COLOR_FIRE @@ -423,16 +427,29 @@ CIGARETTE PACKETS ARE IN FANCY.DM damtype = BURN force = 4 - if(reagents && reagents.has_reagent(/datum/reagent/drug/methamphetamine)) + if(reagents?.has_reagent(/datum/reagent/flash_powder)) + if(!isliving(loc)) + loc.visible_message(span_hear("\The [src] burns up!")) + qdel(src) + return + var/mob/living/user = loc + loc.visible_message(span_hear("[user]'s [name] burns up as [p_they(user)] fall to the ground!"), span_danger("The solution violently explodes!")) + user.flash_act(INFINITY, visual = TRUE, length = 5 SECONDS) + user.playsound_local(get_turf(user), SFX_EXPLOSION, 50, TRUE) + user.cause_hallucination(/datum/hallucination/death, "trick trick [name]") + qdel(src) + return + + if(reagents?.has_reagent(/datum/reagent/drug/methamphetamine)) reagents.flags |= NO_REACT - if(reagents.get_reagent_amount(/datum/reagent/toxin/plasma)) // the plasma explodes when exposed to fire + if(reagents?.get_reagent_amount(/datum/reagent/toxin/plasma)) // the plasma explodes when exposed to fire var/datum/effect_system/reagents_explosion/e = new() e.set_up(round(reagents.get_reagent_amount(/datum/reagent/toxin/plasma) / 2.5, 1), get_turf(src), 0, 0) e.start(src) qdel(src) return - if(reagents.get_reagent_amount(/datum/reagent/fuel)) // the fuel explodes, too, but much less violently + if(reagents?.get_reagent_amount(/datum/reagent/fuel)) // the fuel explodes, too, but much less violently var/datum/effect_system/reagents_explosion/e = new() e.set_up(round(reagents.get_reagent_amount(/datum/reagent/fuel) / 5, 1), get_turf(src), 0, 0) e.start(src) @@ -552,7 +569,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/obj/item/organ/lungs/lungs = smoker.get_organ_slot(ORGAN_SLOT_LUNGS) 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.adjust_organ_loss(ORGAN_SLOT_LUNGS, lung_harm * smoker_resistance) if(!reagents.trans_to(smoker, to_smoke, methods = INHALE, ignore_stomach = TRUE)) reagents.remove_all(to_smoke) @@ -711,6 +728,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM lung_harm = 2 list_reagents = list (/datum/reagent/drug/nicotine = 20, /datum/reagent/medicine/regen_jelly = 15, /datum/reagent/drug/krokodil = 4) +/obj/item/cigarette/flash_powder + desc = /obj/item/cigarette/space_cigarette::desc + list_reagents = list (/datum/reagent/drug/nicotine = 9, /datum/reagent/flash_powder = 5) + // Rollies. /obj/item/cigarette/rollie @@ -892,7 +913,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_state = "cigbutt" w_class = WEIGHT_CLASS_TINY throwforce = 0 - grind_results = list(/datum/reagent/carbon = 2) + +/obj/item/cigbutt/grind_results() + return list(/datum/reagent/carbon = 2) /obj/item/cigbutt/cigarbutt name = "cigar butt" @@ -916,6 +939,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM list_reagents = null w_class = WEIGHT_CLASS_SMALL choke_forever = TRUE + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) ///name of the stuff packed inside this pipe var/packeditem @@ -993,7 +1017,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM inhand_icon_on = null inhand_icon_off = null lung_harm = 2 - custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 3) /////////// //ROLLING// diff --git a/code/game/objects/items/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm index 97b2a1441b9f..df4d12233213 100644 --- a/code/game/objects/items/circuitboards/circuitboard.dm +++ b/code/game/objects/items/circuitboards/circuitboard.dm @@ -15,7 +15,6 @@ abstract_type = /obj/item/circuitboard custom_materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT) w_class = WEIGHT_CLASS_SMALL - grind_results = list(/datum/reagent/silicon = 20) greyscale_colors = CIRCUIT_COLOR_GENERIC var/build_path = null /// whether or not the circuit board will build into a vendor whose products cost nothing (used for offstation vending machines mostly) @@ -30,6 +29,9 @@ set_greyscale(new_config = /datum/greyscale_config/circuit) return ..() +/obj/item/circuitboard/grind_results() + return list(/datum/reagent/silicon = 20) + /obj/item/circuitboard/proc/apply_default_parts(obj/machinery/machine) if(LAZYLEN(machine.component_parts)) // This really shouldn't happen. If it somehow does, print out a stack trace and gracefully handle it. diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index aa1680b63d6e..b1a7e0bb445c 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -247,20 +247,6 @@ name = "Station Alerts" greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/station_alert - var/station_only = FALSE - -/obj/item/circuitboard/computer/station_alert/station_only - station_only = TRUE - -/obj/item/circuitboard/computer/station_alert/examine(mob/user) - . = ..() - . += span_info("The board is configured to [station_only ? "track all station and mining alarms" : "track alarms on the same z-level"].") - . += span_notice("The board mode can be changed with a [EXAMINE_HINT("multitool")].") - -/obj/item/circuitboard/computer/station_alert/multitool_act(mob/living/user) - station_only = !station_only - balloon_alert(user, "tracking set to [station_only ? "station" : "z-level"]") - return TRUE /obj/item/circuitboard/computer/turbine_computer name = "Turbine Computer" @@ -443,12 +429,20 @@ name = "R&D Console" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/rdconsole + req_access = list(ACCESS_RESEARCH) // Research access is required to toggle the lock. + var/silence_announcements = FALSE + var/locked = TRUE + +// An unlocked subtype of the board for mapping. +/obj/item/circuitboard/computer/rdconsole/unlocked + locked = FALSE /obj/item/circuitboard/computer/rdconsole/examine(mob/user) . = ..() . += span_info("The board is configured to [silence_announcements ? "silence" : "announce"] researched nodes on radio.") . += span_notice("The board mode can be changed with a [EXAMINE_HINT("multitool")].") + . += span_notice("The board is [locked ? "locked" : "unlocked"], and can be [locked ? "unlocked" : "locked"] with an ID that has research access.") /obj/item/circuitboard/computer/rdconsole/multitool_act(mob/living/user) . = ..() @@ -459,6 +453,10 @@ balloon_alert(user, "announcements [silence_announcements ? "enabled" : "disabled"]") /obj/item/circuitboard/computer/rdconsole/emag_act(mob/user, obj/item/card/emag/emag_card) + if (locked) + locked = FALSE + to_chat(user, span_notice("You magnetically trigger the locking mechanism, causing it to unlock.")) + if (obj_flags & EMAGGED) return FALSE @@ -467,6 +465,20 @@ to_chat(user, span_notice("You overload the node announcement chip, forcing every node to be announced on the common channel.")) return TRUE +/obj/item/circuitboard/computer/rdconsole/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) + if (user.combat_mode || !isidcard(attacking_item)) + return ..() + if (check_access(attacking_item)) + locked = !locked + balloon_alert(user, locked ? "locked" : "unlocked") + user.visible_message( + message = span_notice("\The [user] unlock[user.p_s()] \the [src] with \the [attacking_item]."), + self_message = span_notice("You unlock \the [src] with \the [attacking_item]."), + blind_message = span_hear("You hear a soft beep."), + ) + else + balloon_alert(user, "no access!") + /obj/item/circuitboard/computer/rdservercontrol name = "R&D Server Control" greyscale_colors = CIRCUIT_COLOR_SCIENCE diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm index ededd868fb7e..3306f4d5b740 100644 --- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm @@ -659,7 +659,7 @@ if(!valid_vendor_names_paths) valid_vendor_names_paths = list() for(var/obj/machinery/vending/vendor_type as anything in subtypesof(/obj/machinery/vending)) - if(vendor_type::allow_custom) + if(vendor_type::allow_custom && vendor_type::refill_canister) valid_vendor_names_paths[vendor_type::name] = vendor_type /obj/item/circuitboard/machine/vendor/screwdriver_act(mob/living/user, obj/item/tool) @@ -688,27 +688,6 @@ set_type(machine.type) return ..() -/obj/item/circuitboard/machine/vending/donksofttoyvendor - name = "Donksoft Toy Vendor" - build_path = /obj/machinery/vending/donksofttoyvendor - req_components = list( - /obj/item/stack/sheet/glass = 1, - /obj/item/vending_refill/donksoft = 1) - -/obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor - name = "Syndicate Donksoft Toy Vendor" - build_path = /obj/machinery/vending/toyliberationstation - req_components = list( - /obj/item/stack/sheet/glass = 1, - /obj/item/vending_refill/donksoft = 1) - -/obj/item/circuitboard/machine/vending/donksnackvendor - name = "Donk Co Snack Vendor" - build_path = /obj/machinery/vending/donksnack - req_components = list( - /obj/item/stack/sheet/glass = 1, - /obj/item/vending_refill/donksnackvendor = 1) - /obj/item/circuitboard/machine/bountypad name = "Civilian Bounty Pad" greyscale_colors = CIRCUIT_COLOR_GENERIC @@ -1402,13 +1381,6 @@ greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/rnd/production/techfab/department/service -/obj/item/circuitboard/machine/vendatray - name = "Vend-A-Tray" - greyscale_colors = CIRCUIT_COLOR_SERVICE - build_path = /obj/structure/displaycase/forsale - 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 @@ -1914,3 +1886,14 @@ req_components = list( /datum/stock_part/micro_laser = 1, ) + +/obj/item/circuitboard/machine/washing_machine + name = "Washing Machine" + greyscale_colors = CIRCUIT_COLOR_SERVICE + build_path = /obj/machinery/washing_machine + req_components = list( + /obj/item/stack/sheet/glass = 1, + /obj/item/reagent_containers/cup/beaker = 2, + /datum/stock_part/water_recycler = 1, + /datum/stock_part/servo = 1, + ) diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index d41afbc303e6..0115af303849 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -25,7 +25,6 @@ throwforce = 0 throw_speed = 3 throw_range = 7 - grind_results = list(/datum/reagent/lye = 10) var/cleanspeed = 3.5 SECONDS //slower than mop force_string = "robust... against germs" var/uses = 100 @@ -35,6 +34,9 @@ AddComponent(/datum/component/slippery, 80) AddComponent(/datum/component/cleaner, cleanspeed, 0.1, pre_clean_callback=CALLBACK(src, PROC_REF(should_clean)), on_cleaned_callback=CALLBACK(src, PROC_REF(decreaseUses))) //less scaling for soapies +/obj/item/soap/grind_results() + return list(/datum/reagent/lye = 10) + /obj/item/soap/examine(mob/user) . = ..() var/max_uses = initial(uses) @@ -56,37 +58,45 @@ /obj/item/soap/homemade desc = "A homemade bar of soap. Smells of... well...." - grind_results = list(/datum/reagent/consumable/liquidgibs = 9, /datum/reagent/lye = 9) icon_state = "soapgibs" inhand_icon_state = "soapgibs" worn_icon_state = "soapgibs" cleanspeed = 3 SECONDS // faster than base soap to reward chemists for going to the effort +/obj/item/soap/homemade/grind_results() + return list(/datum/reagent/consumable/liquidgibs = 9, /datum/reagent/lye = 9) + /obj/item/soap/nanotrasen desc = "A heavy duty bar of Nanotrasen brand soap. Smells of plasma." - grind_results = list(/datum/reagent/toxin/plasma = 10, /datum/reagent/lye = 10) icon_state = "soapnt" inhand_icon_state = "soapnt" worn_icon_state = "soapnt" cleanspeed = 2.8 SECONDS //janitor gets this uses = 300 +/obj/item/soap/nanotrasen/grind_results() + return list(/datum/reagent/toxin/plasma = 10, /datum/reagent/lye = 10) + /obj/item/soap/deluxe desc = "A deluxe Waffle Corporation brand bar of soap. Smells of high-class luxury." - grind_results = list(/datum/reagent/consumable/aloejuice = 10, /datum/reagent/lye = 10) icon_state = "soapdeluxe" inhand_icon_state = "soapdeluxe" worn_icon_state = "soapdeluxe" cleanspeed = 2 SECONDS //captain gets one of these +/obj/item/soap/deluxe/grind_results() + return list(/datum/reagent/consumable/aloejuice = 10, /datum/reagent/lye = 10) + /obj/item/soap/syndie desc = "An untrustworthy bar of soap made of strong chemical agents that dissolve blood faster." - grind_results = list(/datum/reagent/toxin/acid = 10, /datum/reagent/lye = 10) icon_state = "soapsyndie" inhand_icon_state = "soapsyndie" worn_icon_state = "soapsyndie" cleanspeed = 0.5 SECONDS //faster than mops so it's useful for traitors who want to clean crime scenes +/obj/item/soap/syndie/grind_results() + return list(/datum/reagent/toxin/acid = 10, /datum/reagent/lye = 10) + /obj/item/soap/drone name = "\improper integrated soap module" inhand_icon_state = "soapnt" @@ -97,13 +107,26 @@ /obj/item/soap/omega name = "\improper Omega soap" desc = "The most advanced soap known to mankind. The beginning of the end for germs." - grind_results = list(/datum/reagent/consumable/potato_juice = 9, /datum/reagent/consumable/ethanol/lizardwine = 9, /datum/reagent/monkey_powder = 9, /datum/reagent/drug/krokodil = 9, /datum/reagent/toxin/acid/nitracid = 9, /datum/reagent/baldium = 9, /datum/reagent/consumable/ethanol/hooch = 9, /datum/reagent/bluespace = 9, /datum/reagent/drug/pumpup = 9, /datum/reagent/consumable/space_cola = 9) icon_state = "soapomega" inhand_icon_state = "soapomega" worn_icon_state = "soapomega" cleanspeed = 0.3 SECONDS //Only the truest of mind soul and body get one of these uses = 800 //In the Greek numeric system, Omega has a value of 800 +/obj/item/soap/omega/grind_results() + return list( + /datum/reagent/consumable/potato_juice = 9, + /datum/reagent/consumable/ethanol/lizardwine = 9, + /datum/reagent/monkey_powder = 9, + /datum/reagent/drug/krokodil = 9, + /datum/reagent/toxin/acid/nitracid = 9, + /datum/reagent/baldium = 9, + /datum/reagent/consumable/ethanol/hooch = 9, + /datum/reagent/bluespace = 9, + /datum/reagent/drug/pumpup = 9, + /datum/reagent/consumable/space_cola = 9 + ) + /obj/item/soap/omega/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is using [src] to scrub themselves from the timeline! It looks like [user.p_theyre()] trying to commit suicide!")) new /obj/structure/chrono_field(user.loc, user) @@ -229,6 +252,7 @@ inhand_icon_state = "gold_horn" worn_icon_state = "horn_gold" COOLDOWN_DECLARE(golden_horn_cooldown) + custom_materials = list(/datum/material/bananium = SHEET_MATERIAL_AMOUNT * 5) /obj/item/bikehorn/golden/attack() flip_mobs() diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index e3b994bd834c..06604a872fdf 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -1,6 +1,8 @@ #define WAND_OPEN "open" #define WAND_BOLT "bolt" #define WAND_EMERGENCY "emergency" +#define WAND_SHOCK "shock" +#define WAND_DEPOWER "depower" /obj/item/door_remote icon_state = "remote" @@ -12,6 +14,8 @@ name = "control wand" desc = "A remote for controlling a set of airlocks." w_class = WEIGHT_CLASS_TINY + drop_sound = 'sound/items/door_remote/door_remote_drop1.ogg' + pickup_sound = 'sound/items/door_remote/door_remote_pick_up1.ogg' var/department = "civilian" var/mode = WAND_OPEN @@ -26,11 +30,15 @@ var/static/list/area/restricted_areas = list( /area/station/command/bridge, /*so Captain's remote isn't totally useless*/ /area/station/security, /*so antag RD/HoP/QM/CMO can't easily screw up the brig doors*/ - /area/station/ai_monitored/command/nuke_storage, /*aka Vault since it's QM's special thing*/ - /area/station/ai_monitored/turret_protected/ai, // these are areas exclusive to RD - /area/station/ai_monitored/turret_protected/ai_upload_foyer, // but sometimes mappers might misconfig - /area/station/ai_monitored/turret_protected/ai_upload, // their doors with our several dozen access helpers + /area/station/command/vault, /*aka Vault since it's QM's special thing*/ + /area/station/ai/satellite/chamber, // these are areas exclusive to RD + /area/station/ai/upload, // but sometimes mappers might misconfig their doors with our several dozen access helpers ) + COOLDOWN_DECLARE(shock_cooldown) + /// sound played when mode is switched + var/mode_switch_sound = SFX_REMOTE_MODE_SWITCH + /// sound played when an action is done + var/action_sound = SFX_REMOTE_ACTION /obj/item/door_remote/Initialize(mapload) . = ..() @@ -50,17 +58,35 @@ return TRUE return FALSE +/obj/item/door_remote/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() + if(obj_flags & EMAGGED) + return FALSE + balloon_alert(user, "restricted functions unlocked") + obj_flags |= EMAGGED + update_icon_state() + return TRUE + /obj/item/door_remote/attack_self(mob/user) - var/static/list/ops = list(WAND_OPEN = "Open Door", WAND_BOLT = "Toggle Bolts", WAND_EMERGENCY = "Toggle Emergency Access") + var/static/list/ops = list(WAND_OPEN = "Open Door", WAND_BOLT = "Toggle Bolts", WAND_EMERGENCY = "Toggle Emergency Access", WAND_SHOCK = "Shock Door", WAND_DEPOWER = "Depower Door") switch(mode) if(WAND_OPEN) mode = WAND_BOLT if(WAND_BOLT) mode = WAND_EMERGENCY if(WAND_EMERGENCY) + if(!(obj_flags & EMAGGED)) + mode = WAND_OPEN + else + mode = WAND_SHOCK + if(WAND_SHOCK) + mode = WAND_DEPOWER + if(WAND_DEPOWER) mode = WAND_OPEN update_icon_state() balloon_alert(user, "mode: [ops[mode]]") + if(mode_switch_sound) + playsound(src, mode_switch_sound, 50, TRUE) /obj/item/door_remote/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!istype(interacting_with, /obj/machinery/door) && !isturf(interacting_with)) @@ -100,9 +126,8 @@ region_access = REGION_RESEARCH owner_trim = /datum/id_trim/job/research_director our_domain = list( - /area/station/ai_monitored/turret_protected/ai, - /area/station/ai_monitored/turret_protected/ai_upload_foyer, - /area/station/ai_monitored/turret_protected/ai_upload, + /area/station/ai/satellite/chamber, + /area/station/ai/upload, ) /obj/item/door_remote/head_of_security @@ -120,7 +145,7 @@ department = "cargo" region_access = REGION_SUPPLY owner_trim = /datum/id_trim/job/quartermaster - our_domain = list( /area/station/ai_monitored/command/nuke_storage ) + our_domain = list( /area/station/command/vault ) /obj/item/door_remote/chief_medical_officer name = "medical door remote" @@ -140,6 +165,8 @@ /obj/item/door_remote/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) var/obj/machinery/door/door + if(action_sound) + playsound(src, action_sound, 50, TRUE) if (istype(interacting_with, /obj/machinery/door)) door = interacting_with @@ -176,6 +203,7 @@ door.open() else door.close() + if (WAND_BOLT) if (!istype(airlock)) interacting_with.balloon_alert(user, "only airlocks!") @@ -187,6 +215,7 @@ else airlock.bolt() log_combat(user, airlock, "bolted", src) + if (WAND_EMERGENCY) if (!istype(airlock)) interacting_with.balloon_alert(user, "only airlocks!") @@ -195,17 +224,43 @@ airlock.emergency = !airlock.emergency airlock.update_appearance(UPDATE_ICON) + if (WAND_SHOCK) + if (!istype(airlock)) + interacting_with.balloon_alert(user, "only airlocks!") + return ITEM_INTERACT_BLOCKING + if (!COOLDOWN_FINISHED(src, shock_cooldown)) + interacting_with.balloon_alert(user, "shock pulse resetting!") + return ITEM_INTERACT_BLOCKING + if (airlock.isElectrified()) + interacting_with.balloon_alert(user, "already electrified!") + else + airlock.set_electrified(MACHINE_DEFAULT_ELECTRIFY_TIME, user) + COOLDOWN_START(src, shock_cooldown, 10 SECONDS) + + if (WAND_DEPOWER) + if (!istype(airlock)) + interacting_with.balloon_alert(user, "only airlocks!") + return ITEM_INTERACT_BLOCKING + // First hit disrupts main power, backup comes back in ten seconds, if you stick around you can hit backup for 60 more seconds of downtime. + if (!airlock.main_power_timer) + airlock.loseMainPower() + else if (!airlock.backup_power_time) + airlock.loseBackupPower() + return ITEM_INTERACT_SUCCESS /obj/item/door_remote/update_icon_state() var/icon_state_mode - switch(mode) - if(WAND_OPEN) - icon_state_mode = "open" - if(WAND_BOLT) - icon_state_mode = "bolt" - if(WAND_EMERGENCY) - icon_state_mode = "emergency" + if(!(obj_flags & EMAGGED)) + switch(mode) + if(WAND_OPEN) + icon_state_mode = "open" + if(WAND_BOLT) + icon_state_mode = "bolt" + if(WAND_EMERGENCY) + icon_state_mode = "emergency" + else + icon_state_mode = "emergency" icon_state = "[base_icon_state]_[department]_[icon_state_mode]" return ..() @@ -213,3 +268,5 @@ #undef WAND_OPEN #undef WAND_BOLT #undef WAND_EMERGENCY +#undef WAND_SHOCK +#undef WAND_DEPOWER diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm index a96f38cf99fb..d20d3fc60bad 100644 --- a/code/game/objects/items/cosmetics.dm +++ b/code/game/objects/items/cosmetics.dm @@ -194,6 +194,10 @@ inhand_icon_state = "razor" obj_flags = CONDUCTS_ELECTRICITY w_class = WEIGHT_CLASS_TINY + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP + custom_price = 50 // DARKPACK EDIT ADD - ECONOMY /obj/item/razor/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins shaving [user.p_them()]self without the razor guard! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -229,8 +233,9 @@ var/new_style = tgui_input_list(user, "Select a facial hairstyle", "Grooming", SSaccessories.facial_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!")) + var/covering = human_target.is_mouth_covered() + if(covering) + to_chat(user, span_warning("[covering] is in the way!")) return if(!(noggin.head_flags & HEAD_FACIAL_HAIR)) to_chat(user, span_warning("There is no facial hair to style!")) @@ -247,8 +252,9 @@ else return else - if(!get_location_accessible(human_target, location)) - to_chat(user, span_warning("The mask is in the way!")) + var/covering = human_target.is_mouth_covered() + if(covering) + to_chat(user, span_warning("[covering] is in the way!")) return if(!(noggin.head_flags & HEAD_FACIAL_HAIR)) to_chat(user, span_warning("There is no facial hair to shave!")) @@ -285,7 +291,7 @@ var/new_style = tgui_input_list(user, "Select a hairstyle", "Grooming", SSaccessories.hairstyles_list) if(isnull(new_style)) return - if(!get_location_accessible(human_target, location)) + if(!human_target.is_location_accessible(location)) to_chat(user, span_warning("The headgear is in the way!")) return if(!(noggin.head_flags & HEAD_HAIR)) @@ -301,7 +307,7 @@ human_target.set_hairstyle(new_style, update = TRUE) return else - if(!get_location_accessible(human_target, location)) + if(!human_target.is_location_accessible(location)) to_chat(user, span_warning("The headgear is in the way!")) return if(!(noggin.head_flags & HEAD_HAIR)) diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm index 2664cff95d4a..b2254fa2e657 100644 --- a/code/game/objects/items/crab17.dm +++ b/code/game/objects/items/crab17.dm @@ -22,7 +22,7 @@ var/turf/targetturf = get_safe_random_station_turf_equal_weight() if (!targetturf) return FALSE - var/list/accounts_to_rob = flatten_list(SSeconomy.bank_accounts_by_id) + var/list/accounts_to_rob = assoc_to_values(SSeconomy.bank_accounts_by_id) var/mob/living/L if(isliving(user)) L = user @@ -201,7 +201,7 @@ * Grabs the accounts to be robbed and puts them in accounts_to_rob, tells the accounts they're being drained and calls dump() to start draining. */ /obj/structure/checkoutmachine/proc/start_dumping() - accounts_to_rob = flatten_list(SSeconomy.bank_accounts_by_id) + accounts_to_rob = assoc_to_values(SSeconomy.bank_accounts_by_id) accounts_to_rob -= bogdanoff?.get_bank_account() for(var/i in accounts_to_rob) var/datum/bank_account/B = i diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 30731e086b53..f055aa108bd7 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -30,7 +30,6 @@ w_class = WEIGHT_CLASS_TINY attack_verb_continuous = list("attacks", "colours") attack_verb_simple = list("attack", "colour") - grind_results = list() interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_IGNORE_MOBILITY /// Icon state to use when capped @@ -215,7 +214,10 @@ drawtype = pick(all_drawables) AddElement(/datum/element/venue_price, FOOD_PRICE_EXOTIC) - if(can_change_colour) + //This makes sure that spraycans do not rename stuff instead of painting + if(!can_change_colour) + AddElement(/datum/element/tool_renaming) + else AddComponent(/datum/component/palette, AVAILABLE_SPRAYCAN_SPACE, paint_color) refill() @@ -809,6 +811,10 @@ ) register_context() register_item_context() + // If default crayon red colour, pick a more fun spraycan colour + if(!paint_color) + 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/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) . = ..() @@ -859,13 +865,6 @@ 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(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) . = ..() if(charges != INFINITE_CHARGES) diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm index 59c5339c3140..8da91ef371af 100644 --- a/code/game/objects/items/credit_holochip.dm +++ b/code/game/objects/items/credit_holochip.dm @@ -16,7 +16,7 @@ if(!credits && amount) credits = amount if(credits <= 0 && !mapload) - stack_trace("Holochip created with 0 or less credits in [get_area_name(src)]!") + stack_trace("Holochip created with 0 or less [MONEY_NAME] in [get_area_name(src)]!") return INITIALIZE_HINT_QDEL add_traits(list(TRAIT_FISHING_BAIT, TRAIT_BAIT_ALLOW_FISHING_DUD), INNATE_TRAIT) update_appearance() @@ -24,20 +24,20 @@ /obj/item/holochip/examine(mob/user) . = ..() - . += "[span_notice("It's loaded with [credits] credit[( credits > 1 ) ? "s" : ""]")]\n"+\ + . += "[span_notice("It's loaded with [credits] [MONEY_NAME_AUTOPURAL(credits)]")]\n"+\ span_notice("Alt-Click to split.") /obj/item/holochip/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) if(istype(held_item, /obj/item/holochip)) context[SCREENTIP_CONTEXT_LMB] = "Merge Into" - context[SCREENTIP_CONTEXT_ALT_LMB] = "Extract Credits" + context[SCREENTIP_CONTEXT_ALT_LMB] = "Extract [MONEY_NAME_CAPITALIZED]" return CONTEXTUAL_SCREENTIP_SET /obj/item/holochip/get_item_credit_value() return credits /obj/item/holochip/update_name() - name = "\improper [credits] credit holochip" + name = "\improper [credits] [MONEY_NAME_SINGULAR] holochip" return ..() /obj/item/holochip/update_icon_state() @@ -117,7 +117,7 @@ if(loc != user) to_chat(user, span_warning("You must be holding the holochip to continue!")) return CLICK_ACTION_BLOCKING - var/split_amount = tgui_input_number(user, "How many credits do you want to extract from the holochip? (Max: [credits] cr)", "Holochip", max_value = credits) + var/split_amount = tgui_input_number(user, "How many [MONEY_NAME] do you want to extract from the holochip? (Max: [credits] [MONEY_SYMBOL])", "Holochip", max_value = credits) if(!split_amount || QDELETED(user) || QDELETED(src) || issilicon(user) || !usr.can_perform_action(src, NEED_DEXTERITY|FORBID_TELEKINESIS_REACH) || loc != user) return CLICK_ACTION_BLOCKING var/new_credits = spend(split_amount, TRUE) @@ -126,7 +126,7 @@ if(!user.put_in_hands(chip)) chip.forceMove(user.drop_location()) add_fingerprint(user) - to_chat(user, span_notice("You extract [split_amount] credits into a new holochip.")) + to_chat(user, span_notice("You extract [split_amount] [MONEY_NAME] into a new holochip.")) return CLICK_ACTION_SUCCESS /obj/item/holochip/emp_act(severity) diff --git a/code/game/objects/items/debug_items.dm b/code/game/objects/items/debug_items.dm index 354e628895d0..a382733560d7 100644 --- a/code/game/objects/items/debug_items.dm +++ b/code/game/objects/items/debug_items.dm @@ -59,72 +59,10 @@ /obj/item/debug/omnitool/attack_self(mob/user) if(!user) return - var/list/tool_list = list( - "Crowbar" = image(icon = 'icons/obj/tools.dmi', icon_state = "crowbar"), - "Multitool" = image(icon = 'icons/obj/devices/tool.dmi', icon_state = "multitool"), - "Screwdriver" = image(icon = 'icons/map_icons/items/_item.dmi', icon_state = "/obj/item/screwdriver"), - "Wirecutters" = image(icon = 'icons/obj/tools.dmi', icon_state = "cutters_map"), - "Wrench" = image(icon = 'icons/obj/tools.dmi', icon_state = "wrench"), - "Welding Tool" = image(icon = 'icons/obj/tools.dmi', icon_state = "miniwelder"), - "Analyzer" = image(icon = 'icons/obj/devices/scanner.dmi', icon_state = "analyzer"), - "Pickaxe" = image(icon = 'icons/obj/mining.dmi', icon_state = "minipick"), - "Shovel" = image(icon = 'icons/obj/mining.dmi', icon_state = "shovel"), - "Retractor" = image(icon = 'icons/obj/medical/surgery_tools.dmi', icon_state = "retractor"), - "Hemostat" = image(icon = 'icons/obj/medical/surgery_tools.dmi', icon_state = "hemostat"), - "Cautery" = image(icon = 'icons/obj/medical/surgery_tools.dmi', icon_state = "cautery"), - "Drill" = image(icon = 'icons/obj/medical/surgery_tools.dmi', icon_state = "drill"), - "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/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/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) + var/tool_result = show_radial_menu(user, src, GLOB.tool_to_image, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) if(!check_menu(user)) return - switch(tool_result) - 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 - if("Analyzer") - tool_behaviour = TOOL_ANALYZER - if("Pickaxe") - tool_behaviour = TOOL_MINING - if("Shovel") - tool_behaviour = TOOL_SHOVEL - 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("Knife") - tool_behaviour = TOOL_KNIFE - if("Blood Filter") - tool_behaviour = TOOL_BLOODFILTER - if("Rolling Pin") - tool_behaviour = TOOL_ROLLINGPIN - if("Wire Brush") - tool_behaviour = TOOL_RUSTSCRAPER + tool_behaviour = tool_result /obj/item/debug/omnitool/item_spawner name = "spawntool" diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 205a47e9cb62..ea2c0a38692d 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -56,6 +56,7 @@ paddles = new paddle_type(src) update_power() RegisterSignal(paddles, COMSIG_DEFIBRILLATOR_SUCCESS, PROC_REF(on_defib_success)) + AddElement(/datum/element/drag_pickup) /obj/item/defibrillator/loaded/Initialize(mapload) //starts with hicap . = ..() @@ -120,30 +121,15 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/defibrillator/attack_hand(mob/user, list/modifiers) if(loc == user) - if(slot_flags & ITEM_SLOT_BACK) - if(user.get_item_by_slot(ITEM_SLOT_BACK) == src) - ui_action_click() - else - to_chat(user, span_warning("Put the defibrillator on your back first!")) - - else if(slot_flags & ITEM_SLOT_BELT) - if(user.get_item_by_slot(ITEM_SLOT_BELT) == src) - ui_action_click() - else - to_chat(user, span_warning("Strap the defibrillator's belt on first!")) + if(user.get_slot_by_item(src) & slot_flags) + ui_action_click() + else + balloon_alert(user, "equip the unit first!") return else if(istype(loc, /obj/machinery/defibrillator_mount)) ui_action_click() //checks for this are handled in defibrillator.mount.dm return ..() -/obj/item/defibrillator/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params) - if(!ismob(loc)) - return - var/mob/living_mob = loc - if(!living_mob.incapacitated && istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/hand = over_object - living_mob.putItemFromInventoryInHandIfPossible(src, hand.held_index) - /obj/item/defibrillator/screwdriver_act(mob/living/user, obj/item/tool) if(!cell || !cell_removable) return FALSE @@ -273,9 +259,10 @@ desc = "A belt-equipped defibrillator that can be rapidly deployed." icon_state = "defibcompact" inhand_icon_state = null + slot_flags = ITEM_SLOT_BELT|ITEM_SLOT_SUITSTORE|ITEM_SLOT_DEX_STORAGE + worn_icon = 'icons/mob/clothing/belt.dmi' worn_icon_state = "defibcompact" w_class = WEIGHT_CLASS_NORMAL - slot_flags = ITEM_SLOT_BELT paddle_state = "defibcompact-paddles" powered_state = "defibcompact-powered" charge_state = "defibcompact-charge" @@ -287,6 +274,11 @@ cell = new(src) update_power() +/obj/item/defibrillator/compact/loaded/cmo // subtype for the spy steal objective + name = "chief medical officer's compact defibrillator" + icon_state = "defibcmo" + resistance_flags = INDESTRUCTIBLE // So no cheesy getting rid of like other steal/head items + /obj/item/defibrillator/compact/combat name = "combat defibrillator" desc = "A belt-equipped blood-red defibrillator. Can revive through thick clothing, has an experimental self-recharging battery, and can be utilized as a weapon via applying the paddles while in a combat stance." @@ -348,6 +340,7 @@ . = ..() AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_BACK) AddComponent(/datum/component/two_handed, force_unwielded=8, force_wielded=12) + RegisterSignal(src, COMSIG_HUMAN_NON_STORAGE_HOTKEY, PROC_REF(on_non_storage_hotkey)) /obj/item/shockpaddles/Destroy() defib = null @@ -515,7 +508,7 @@ busy = TRUE M.visible_message(span_danger("[user] touches [M] with [src]!"), \ span_userdanger("[user] touches [M] with [src]!")) - M.adjustStaminaLoss(60) + M.adjust_stamina_loss(60) M.Knockdown(75) M.set_jitter_if_lower(100 SECONDS) M.apply_status_effect(/datum/status_effect/convulsing) @@ -615,25 +608,31 @@ fail_reason = "Patient's brain is missing. Further attempts futile." if (DEFIB_FAIL_BLACKLISTED) fail_reason = "Patient has been blacklisted from revival. Further attempts futile." + // DARKPACK EDIT START + if (DEFIB_FAIL_STAKED) + fail_reason = "Patient's heart has external embedded items, repair and try again." + // DARKPACK EDIT END + if (DEFIB_FAIL_GOLEM) + fail_reason = "Patient is constructed from inorganic materials. Further attempts futile, though manual reconstruction is possible." if(fail_reason) user.visible_message(span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - [fail_reason]")) playsound(src, 'sound/machines/defib/defib_failed.ogg', 50, FALSE) else - var/total_brute = H.getBruteLoss() - var/total_burn = H.getFireLoss() + var/total_brute = H.get_brute_loss() + var/total_burn = H.get_fire_loss() 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) - need_mob_update += H.adjustOxyLoss(H.health - HALFWAYCRITDEATH, updating_health = FALSE) + need_mob_update += H.adjust_oxy_loss(H.health - HALFWAYCRITDEATH, updating_health = FALSE) else - var/overall_damage = total_brute + total_burn + H.getToxLoss() + H.getOxyLoss() + var/overall_damage = total_brute + total_burn + H.get_tox_loss() + H.get_oxy_loss() var/mobhealth = H.health - 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) + need_mob_update += H.adjust_oxy_loss((mobhealth - HALFWAYCRITDEATH) * (H.get_oxy_loss() / overall_damage), updating_health = FALSE) + need_mob_update += H.adjust_tox_loss((mobhealth - HALFWAYCRITDEATH) * (H.get_tox_loss() / overall_damage), updating_health = FALSE, forced = TRUE) // force tox heal for toxin lovers too + need_mob_update += H.adjust_fire_loss((mobhealth - HALFWAYCRITDEATH) * (total_burn / overall_damage), updating_health = FALSE) + need_mob_update += H.adjust_brute_loss((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.")) @@ -676,6 +675,13 @@ /obj/item/shockpaddles/proc/is_wielded() return HAS_TRAIT(src, TRAIT_WIELDED) +/obj/item/shockpaddles/proc/on_non_storage_hotkey(datum/source, mob/living/carbon/human/user, obj/item/possible_storage) + SIGNAL_HANDLER + if(possible_storage == defib) + user.dropItemToGround(src) + return COMPONENT_STORAGE_HOTKEY_HANDLED + return NONE + /obj/item/shockpaddles/cyborg name = "cyborg defibrillator paddles" icon = 'icons/obj/medical/defib.dmi' diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index 6c25f9db9fab..71c9211d28e4 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -5,6 +5,7 @@ //Child of carpplushie because this should do everything the toy does and more /obj/item/toy/plush/carpplushie/dehy_carp + offspring_type = /obj/item/toy/plush/carpplushie var/mob/owner = null //Carp doesn't attack owner, set when using in hand var/mobtype = /mob/living/basic/carp //So admins can change what mob spawns via var fuckery var/swelling = FALSE @@ -19,9 +20,6 @@ owner = user RegisterSignal(owner, COMSIG_QDELETING, PROC_REF(owner_deleted)) -/obj/item/toy/plush/carpplushie/dehy_carp/plop(obj/item/toy/plush/Daddy) - return FALSE - /obj/item/toy/plush/carpplushie/dehy_carp/proc/Swell() if(swelling) return diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 759790ab1558..1f9a78e3f3fb 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -11,6 +11,9 @@ w_class = WEIGHT_CLASS_SMALL slot_flags = ITEM_SLOT_BELT item_flags = NOBLUDGEON + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP var/flush = FALSE var/mob/living/silicon/ai/AI @@ -32,12 +35,14 @@ desc = "A stylish upgrade (?) to the intelliCard." icon_state = "aitater" base_icon_state = "aitater" + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.5) /obj/item/aicard/aispook name = "intelliLantern" desc = "A spoOoOoky upgrade to the intelliCard." icon_state = "aispook" base_icon_state = "aispook" + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.5) /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!")) @@ -156,7 +161,7 @@ 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.adjust_oxy_loss(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 index b63ecf25870c..0c9f0c6f9c48 100644 --- a/code/game/objects/items/devices/aicard_evil.dm +++ b/code/game/objects/items/devices/aicard_evil.dm @@ -69,7 +69,7 @@ // 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) + var/obj/structure/ai_core/detritus = locate() in get_turf(src) qdel(detritus) AI.set_control_disabled(FALSE) AI.radio_enabled = TRUE diff --git a/code/game/objects/items/devices/beacon.dm b/code/game/objects/items/devices/beacon.dm index a7c34a92c0df..4e4bdcbf885d 100644 --- a/code/game/objects/items/devices/beacon.dm +++ b/code/game/objects/items/devices/beacon.dm @@ -6,6 +6,7 @@ inhand_icon_state = "beacon" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' + obj_flags = UNIQUE_RENAME var/enabled = TRUE var/renamed = FALSE @@ -46,15 +47,3 @@ /obj/item/beacon/attack_hand_secondary(mob/user, list/modifiers) attack_self(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - -/obj/item/beacon/attackby(obj/item/W, mob/user) - if(IS_WRITING_UTENSIL(W)) // needed for things that use custom names like the locator - var/new_name = tgui_input_text(user, "What would you like the name to be?", "Beacon", max_length = MAX_NAME_LEN) - if(!user.can_perform_action(src)) - return - if(new_name) - name = new_name - renamed = TRUE - return - else - return ..() diff --git a/code/game/objects/items/devices/blood_scanner.dm b/code/game/objects/items/devices/blood_scanner.dm index 5add88050f51..4a32545b0a45 100644 --- a/code/game/objects/items/devices/blood_scanner.dm +++ b/code/game/objects/items/devices/blood_scanner.dm @@ -56,13 +56,13 @@ /obj/item/blood_scanner/proc/scan_blood(mob/living/scanner, mob/living/carbon/scanned_person) var/render_list = list() - var/oxy_loss = scanned_person.getOxyLoss() - var/tox_loss = scanned_person.getToxLoss() + var/oxy_loss = scanned_person.get_oxy_loss() + var/tox_loss = scanned_person.get_tox_loss() render_list += span_info("You read the [src]'s screen:\n") render_list += "Blood Type: [scanned_person?.dna?.blood_type]\n" if(oxy_loss > 50)//if they have knockout levels of suffocation damage render_list += "Warning: Hypoxic blood oxygen levels.\n" - if(scanned_person.blood_volume <= BLOOD_VOLUME_SAFE) + if(scanned_person.get_blood_volume(apply_modifiers = TRUE) <= BLOOD_VOLUME_SAFE) render_list += "Warning: Dangerously low blood flow.\n" if(tox_loss > 10) render_list += "Warning: Toxic buildup detected in bloodstream.\n" diff --git a/code/game/objects/items/devices/desynchronizer.dm b/code/game/objects/items/devices/desynchronizer.dm index cd7c745a168c..31006c8dc1d9 100644 --- a/code/game/objects/items/devices/desynchronizer.dm +++ b/code/game/objects/items/devices/desynchronizer.dm @@ -41,7 +41,7 @@ /obj/item/desynchronizer/click_alt(mob/living/user) var/new_duration = tgui_input_number(user, "Set the duration", "Desynchronizer", duration / 10, max_duration, 5) - if(!new_duration || QDELETED(user) || QDELETED(src) || !usr.can_perform_action(src, NEED_DEXTERITY)) + if(!new_duration || QDELETED(user) || QDELETED(src) || !user.can_perform_action(src, NEED_DEXTERITY)) return CLICK_ACTION_BLOCKING duration = new_duration to_chat(user, span_notice("You set the duration to [DisplayTimeText(duration)].")) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 6dc9c157b96d..43daebf8a3e9 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -8,7 +8,7 @@ desc = "A hand-held emergency light." custom_price = PAYCHECK_CREW icon = 'modular_darkpack/master_files/icons/obj/lighting.dmi' // DARKPACK EDIT CHANGE - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') // DARKPACK EDIT ADD + ONFLOOR_ICON_HELPER('modular_darkpack/master_files/icons/obj/lighting_onfoor.dmi') // DARKPACK EDIT ADD dir = WEST icon_state = "flashlight" inhand_icon_state = "flashlight" @@ -18,7 +18,10 @@ w_class = WEIGHT_CLASS_SMALL obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT - custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 0.2) + custom_materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.2, + ) actions_types = list(/datum/action/item_action/toggle_light) action_slots = ALL light_system = OVERLAY_LIGHT_DIRECTIONAL @@ -26,6 +29,10 @@ light_range = 4 light_power = 1 light_on = FALSE + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP + /// 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) @@ -38,9 +45,14 @@ var/start_on = FALSE /// When true, painting the flashlight won't change its light color var/ignore_base_color = FALSE + /// This simply means if the flashlight can be cuffed to your hand (why?) + var/has_closed_handle = TRUE + custom_price = 10 // DARKPACK EDIT ADD - ECONOMY /obj/item/flashlight/Initialize(mapload) . = ..() + if(has_closed_handle) + AddElement(/datum/element/cuffable_item) if(start_on) set_light_on(TRUE) update_brightness() @@ -225,7 +237,7 @@ . += span_notice_ml("[patient] has [pill_count] pill[pill_count > 1 ? "s" : ""] implanted in [patient.p_their()] teeth.\n") //assess any suffocation damage - var/hypoxia_status = patient.getOxyLoss() > 20 + var/hypoxia_status = patient.get_oxy_loss() > 20 if(patient == user) if(hypoxia_status) @@ -244,9 +256,11 @@ else . += span_info_ml("You press a finger to [patient.p_their()] gums:\n") - if(patient.blood_volume <= BLOOD_VOLUME_SAFE && patient.blood_volume > BLOOD_VOLUME_OKAY) + var/cached_blood_volume = patient.get_blood_volume(apply_modifiers = TRUE) + + if(cached_blood_volume <= BLOOD_VOLUME_SAFE && cached_blood_volume > BLOOD_VOLUME_OKAY) . += span_danger_ml("Color returns slowly!\n")//low blood - else if(patient.blood_volume <= BLOOD_VOLUME_OKAY) + else if(cached_blood_volume <= BLOOD_VOLUME_OKAY) . += span_danger_ml("Color does not return!\n")//critical blood else . += span_notice_ml("Color returns quickly.\n")//they're okay :D @@ -330,6 +344,7 @@ light_range = 2 light_power = 0.8 light_color = "#CCFFFF" + has_closed_handle = FALSE COOLDOWN_DECLARE(holosign_cooldown) /obj/item/flashlight/pen/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) @@ -387,6 +402,7 @@ light_power = 0.8 light_color = "#99ccff" hitsound = 'sound/items/weapons/genhit1.ogg' + has_closed_handle = FALSE // the desk lamps are a bit special /obj/item/flashlight/lamp @@ -404,6 +420,7 @@ obj_flags = CONDUCTS_ELECTRICITY custom_materials = null start_on = TRUE + has_closed_handle = FALSE // green-shaded desk lamp /obj/item/flashlight/lamp/green @@ -433,9 +450,9 @@ light_color = LIGHT_COLOR_FLARE light_system = OVERLAY_LIGHT light_power = 2 - grind_results = list(/datum/reagent/sulfur = 15) sound_on = 'sound/items/match_strike.ogg' toggle_context = FALSE + has_closed_handle = FALSE /// How many seconds of fuel we have left var/fuel = 0 /// Do we randomize the fuel when initialized @@ -446,7 +463,11 @@ var/trash_type = /obj/item/trash/flare /// If the light source can be extinguished var/can_be_extinguished = FALSE - custom_materials = list(/datum/material/plastic= SMALL_MATERIAL_AMOUNT * 0.5) + custom_materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, + /datum/material/plasma = SMALL_MATERIAL_AMOUNT * 0.5, + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 0.5, + ) /obj/item/flashlight/flare/Initialize(mapload) . = ..() @@ -460,6 +481,9 @@ damtype = BURN update_brightness() +/obj/item/flashlight/flare/grind_results() + return list(/datum/reagent/sulfur = 15) + /obj/item/flashlight/flare/init_slapcrafting() return @@ -552,6 +576,7 @@ name = "red candle" desc = "In Greek myth, Prometheus stole fire from the Gods and gave it to \ humankind. The jewelry he kept for himself." + ONFLOOR_ICON_HELPER(null) // DARKPACK EDIT ADD icon = 'icons/obj/candle.dmi' icon_state = "candle1" inhand_icon_state = "candle" @@ -703,6 +728,7 @@ slot_flags = null trash_type = /obj/effect/decal/cleanable/ash can_be_extinguished = TRUE + custom_materials = list(/datum/material/wood = SMALL_MATERIAL_AMOUNT*0.5) /obj/item/flashlight/flare/torch/on start_on = TRUE @@ -714,6 +740,7 @@ fuel = INFINITY randomize_fuel = FALSE start_on = TRUE + custom_materials = null /obj/item/flashlight/flare/torch/red color = "#ff0000" @@ -772,6 +799,7 @@ light_range = 6 //luminosity when on light_color = "#ffff66" light_system = OVERLAY_LIGHT + has_closed_handle = FALSE /obj/item/flashlight/emp var/emp_max_charges = 4 @@ -842,10 +870,11 @@ base_icon_state = "glowstick" inhand_icon_state = null worn_icon_state = "lightstick" - grind_results = list(/datum/reagent/phenol = 15, /datum/reagent/hydrogen = 10, /datum/reagent/oxygen = 5) //Meth-in-a-stick sound_on = 'sound/effects/wounds/crack2.ogg' // the cracking sound isn't just for wounds silly toggle_context = FALSE ignore_base_color = TRUE + has_closed_handle = FALSE + custom_materials = null /// How much max fuel we have var/max_fuel = 0 /// How much oxygen gets added upon cracking the stick. Doesn't actually produce a reaction with the fluid but it does allow for bootleg chemical "grenades" @@ -874,6 +903,11 @@ ) RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(on_reagent_change)) +/obj/item/flashlight/glowstick/grind_results() + . = list(/datum/reagent/phenol = 15, /datum/reagent/hydrogen = 10) + if(!light_on) + .[/datum/reagent/oxygen] = 5 + /obj/item/flashlight/glowstick/proc/get_fuel() return reagents.get_reagent_amount(fuel_type) @@ -913,7 +947,6 @@ /obj/item/flashlight/glowstick/proc/turn_on() reagents.add_reagent(/datum/reagent/oxygen, oxygen_added) - grind_results -= /datum/reagent/oxygen set_light_on(TRUE) // Just in case var/datum/action/toggle = locate(/datum/action/item_action/toggle_light) in actions // No sense having a toggle light action that we don't use eh? @@ -1025,6 +1058,7 @@ plane = FLOOR_PLANE anchored = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + has_closed_handle = FALSE ///Boolean that switches when a full color flip ends, so the light can appear in all colors. var/even_cycle = FALSE ///Base light_range that can be set on Initialize to use in smooth light range expansions and contractions. diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 25bae4306091..2f65c72436fe 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -112,9 +112,9 @@ /obj/item/geiger_counter/click_alt(mob/living/user) if(!scanning) - to_chat(usr, span_warning("[src] must be on to reset its radiation level!")) + to_chat(user, span_warning("[src] must be on to reset its radiation level!")) return CLICK_ACTION_BLOCKING - to_chat(usr, span_notice("You flush [src]'s radiation counts, resetting it to normal.")) + to_chat(user, span_notice("You flush [src]'s radiation counts, resetting it to normal.")) last_perceived_radiation_danger = null update_appearance(UPDATE_ICON) return CLICK_ACTION_SUCCESS diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 16bf5b9f2434..35ab6e546792 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -11,7 +11,13 @@ w_class = WEIGHT_CLASS_SMALL slot_flags = ITEM_SLOT_BELT obj_flags = UNIQUE_RENAME + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP var/gpstag + var/tracking_on = TRUE + var/debug_mode = FALSE + var/overlay_icon = "working" /obj/item/gps/Initialize(mapload) . = ..() @@ -19,7 +25,7 @@ /// Adds the GPS component to this item. /obj/item/gps/proc/add_gps_component() - AddComponent(/datum/component/gps/item, gpstag) + AddComponent(/datum/component/gps/item, gpstag, tracking_on, overlay_state = overlay_icon, debug = debug_mode) /obj/item/gps/spaceruin gpstag = SPACE_SIGNAL_GPSTAG @@ -60,33 +66,8 @@ name = "visible GPS" gpstag = "ADMIN" desc = "This admin-spawn GPS unit leaves the coordinates visible \ - on any turf that it passes over, for debugging. Especially useful \ + on any turf that it passes over while being dragged on the floor. Especially useful \ for marking the area around the transition edges." - var/list/turf/tagged - -/obj/item/gps/visible_debug/Initialize(mapload) - . = ..() - tagged = list() - START_PROCESSING(SSfastprocess, src) - -/obj/item/gps/visible_debug/process() - var/turf/T = get_turf(src) - if(T) - // I assume it's faster to color,tag and OR the turf in, rather - // then checking if its there - T.color = RANDOM_COLOUR - T.maptext = MAPTEXT("[T.x],[T.y],[T.z]") - tagged |= T - -/obj/item/gps/visible_debug/proc/clear() - while(tagged.len) - var/turf/T = pop(tagged) - T.color = initial(T.color) - T.maptext = initial(T.maptext) - -/obj/item/gps/visible_debug/Destroy() - if(tagged) - clear() - tagged = null - STOP_PROCESSING(SSfastprocess, src) - . = ..() + tracking_on = FALSE + debug_mode = TRUE + overlay_icon = FALSE diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index ab35b3c08fec..c15b6083dc61 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -323,15 +323,63 @@ icon_state = "lightreplacer_high" max_uses = 50 +#define BLIGHTREPLACER_SPOT_COOLDOWN (BLIGHTREPLACER_SPOT_LIFE + 1 SECONDS) +#define BLIGHTREPLACER_SPOT_RANGE 7 +#define BLIGHTREPLACER_SPOT_LIFE (5 SECONDS) + /obj/item/lightreplacer/blue name = "bluespace light replacer" desc = "A modified light replacer that zaps lights into place. Refill with broken or working lightbulbs, or sheets of glass." icon_state = "lightreplacer_blue" bluespace_toggle = TRUE + actions_types = list(/datum/action/item_action/lightreplacer_scan) + action_slots = ALL + COOLDOWN_DECLARE(lightreplacer_spot_cooldown) /obj/item/lightreplacer/blue/emag_act() return FALSE // balancing against longrange explosions +/obj/item/lightreplacer/blue/ui_action_click(mob/user, actiontype) + if(!COOLDOWN_FINISHED(src, lightreplacer_spot_cooldown)) + balloon_alert(user, "on cooldown!") + return + COOLDOWN_START(src, lightreplacer_spot_cooldown, BLIGHTREPLACER_SPOT_COOLDOWN) + lightreplacer_scan() + +/// Scans the area in search of fixtures with broken bulbs in the BLIGHTREPLACER_SPOT_RANGE range, and also marks them with the blue_firefly effect. +/obj/item/lightreplacer/blue/proc/lightreplacer_scan() + var/turf/source_turf = get_turf(src) + for(var/obj/machinery/light/broken_light in dview(BLIGHTREPLACER_SPOT_RANGE, source_turf)) + if(broken_light.status == LIGHT_OK) + continue + var/obj/effect/temp_visual/blue_firefly/firefly = new(get_turf(broken_light)) + animate(firefly, alpha = 0, time = BLIGHTREPLACER_SPOT_LIFE, easing = CIRCULAR_EASING | EASE_IN) + +/datum/action/item_action/lightreplacer_scan + name = "Scan for broken lamps" + desc = "Scans the surrounding area for fixtures with broken light bulbs and marks them." + +/obj/effect/temp_visual/blue_firefly + name = "bluespace firefly" + icon = 'icons/effects/effects.dmi' + icon_state = "bluespace_firefly" + light_power = 1 + light_range = 2 + light_color = LIGHT_COLOR_DARK_BLUE + duration = BLIGHTREPLACER_SPOT_LIFE + +/obj/effect/temp_visual/blue_firefly/Initialize(mapload) + . = ..() + update_appearance(UPDATE_OVERLAYS) + +/obj/effect/temp_visual/blue_firefly/update_overlays() + . = ..() + . += emissive_appearance(icon, icon_state, src, alpha = src.alpha) + +#undef BLIGHTREPLACER_SPOT_COOLDOWN +#undef BLIGHTREPLACER_SPOT_RANGE +#undef BLIGHTREPLACER_SPOT_LIFE + #undef GLASS_SHEET_USES #undef LIGHTBULB_COST #undef BULB_SHARDS_REQUIRED diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index e72444914232..626c42d65a44 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -295,10 +295,10 @@ for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) - var/datum/camerachunk/chunk = GLOB.cameranet.getCameraChunk(x, y, epicenter.z) + var/datum/camerachunk/chunk = SScameras.generate_chunk(x, y, epicenter.z) // removing cameras in build mode didnt affect it and i guess it needs an AI eye to update so we have to do this manually // unless we only want to see static in a jank manner only if an eye updates it - chunk?.update() // UPDATE THE FUCK NOW + chunk?.force_update(only_if_necessary = FALSE) // UPDATE THE FUCK NOW . |= chunk /obj/item/multitool/ai_detect/proc/cleanup_static() diff --git a/code/game/objects/items/devices/pressureplates.dm b/code/game/objects/items/devices/pressureplates.dm index d75682d72a4c..d1bff2e74328 100644 --- a/code/game/objects/items/devices/pressureplates.dm +++ b/code/game/objects/items/devices/pressureplates.dm @@ -9,6 +9,7 @@ icon_state = "pressureplate" layer = ABOVE_OPEN_TURF_LAYER plane = FLOOR_PLANE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.75, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.7) var/trigger_mob = TRUE var/trigger_item = FALSE var/specific_item = null diff --git a/code/game/objects/items/devices/quantum_keycard.dm b/code/game/objects/items/devices/quantum_keycard.dm index c815cc41ef1e..abe5d99b55d8 100644 --- a/code/game/objects/items/devices/quantum_keycard.dm +++ b/code/game/objects/items/devices/quantum_keycard.dm @@ -22,7 +22,7 @@ /area/station/service = COLOR_SERVICE_LIME, /area/centcom = COLOR_CENTCOM_BLUE, // how? /area/station/command = COLOR_COMMAND_BLUE, - /area/station/ai_monitored = COLOR_COMMAND_BLUE, + /area/station/ai = COLOR_COMMAND_BLUE, /area/station/medical = COLOR_MEDICAL_BLUE, /area/station/science = COLOR_SCIENCE_PINK, /area/station/engineering = COLOR_ENGINEERING_ORANGE, @@ -45,9 +45,10 @@ /obj/item/quantum_keycard/click_alt(mob/living/user) to_chat(user, span_notice("You start pressing [src]'s unlink button...")) - if(do_after(user, 4 SECONDS, target = src)) - to_chat(user, span_notice("The keycard beeps twice and disconnects the quantum link.")) - set_pad() + if(!do_after(user, 4 SECONDS, target = src)) + return CLICK_ACTION_BLOCKING + to_chat(user, span_notice("The keycard beeps twice and disconnects the quantum link.")) + set_pad() return CLICK_ACTION_SUCCESS /obj/item/quantum_keycard/proc/set_pad(obj/machinery/quantumpad/new_pad) diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 3867ace4fc1f..c7507b31bd07 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -9,6 +9,9 @@ obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BACK w_class = WEIGHT_CLASS_HUGE + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT *5, /datum/material/glass=SHEET_MATERIAL_AMOUNT * 1.25) var/on = TRUE diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 9e81f9b9d2b0..111551e653ad 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -13,6 +13,14 @@ GLOBAL_LIST_INIT(channel_tokens, list( MODE_BINARY = MODE_TOKEN_BINARY, RADIO_CHANNEL_AI_PRIVATE = RADIO_TOKEN_AI_PRIVATE, RADIO_CHANNEL_ENTERTAINMENT = RADIO_TOKEN_ENTERTAINMENT, + // DARKPACK EDIT ADD START + RADIO_CHANNEL_POLICE = RADIO_TOKEN_POLICE, + RADIO_CHANNEL_CLINIC = RADIO_TOKEN_CLINIC, + RADIO_CHANNEL_MILITARY = RADIO_TOKEN_MILITARY, + RADIO_CHANNEL_CAMARILLA = RADIO_TOKEN_CAMARILLA, + RADIO_CHANNEL_ANARCH = RADIO_TOKEN_ANARCH, + RDAIO_CHANNEL_ENDRON = RADIO_TOKEN_ENDRON, + // DARKPACK EDIT ADD END )) /obj/item/radio/headset @@ -49,6 +57,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( /obj/item/radio/headset/examine(mob/user) . = ..() + /* // DARKPACK EDIT REMOVAL START if(!(item_flags & IN_INVENTORY) || loc != user) . += span_notice("A small screen on the headset flashes, it's too small to read without holding or wearing the headset.") return @@ -71,6 +80,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( . += span_notice("A small screen on the headset displays the following available frequencies:") . += span_notice("
    [available_channels.Join()]
") + */ // DARKPACK EDIT REMOVAL END if(command) . += span_info("Alt-click to toggle the high-volume mode.") @@ -268,12 +278,12 @@ GLOBAL_LIST_INIT(channel_tokens, list( /obj/item/radio/headset/heads command = TRUE + icon_state = "com_headset" + worn_icon_state = "com_headset" /obj/item/radio/headset/heads/captain name = "\proper the captain's headset" desc = "The headset of the king." - icon_state = "com_headset" - worn_icon_state = "com_headset" keyslot = /obj/item/encryptionkey/heads/captain /obj/item/radio/headset/heads/captain/alt @@ -289,22 +299,16 @@ GLOBAL_LIST_INIT(channel_tokens, list( /obj/item/radio/headset/heads/rd name = "\proper the research director's headset" desc = "Headset of the fellow who keeps society marching towards technological singularity." - icon_state = "com_headset" - worn_icon_state = "com_headset" keyslot = /obj/item/encryptionkey/heads/rd /obj/item/radio/headset/heads/hos name = "\proper the head of security's headset" desc = "The headset of the man in charge of keeping order and protecting the station." - icon_state = "com_headset" - worn_icon_state = "com_headset" keyslot = /obj/item/encryptionkey/heads/hos /obj/item/radio/headset/heads/hos/advisor name = "\proper the veteran security advisor headset" desc = "The headset of the man who was in charge of keeping order and protecting the station..." - icon_state = "com_headset" - worn_icon_state = "com_headset" keyslot = /obj/item/encryptionkey/heads/hos command = FALSE @@ -321,29 +325,21 @@ GLOBAL_LIST_INIT(channel_tokens, list( /obj/item/radio/headset/heads/ce name = "\proper the chief engineer's headset" desc = "The headset of the guy in charge of keeping the station powered and undamaged." - icon_state = "com_headset" - worn_icon_state = "com_headset" keyslot = /obj/item/encryptionkey/heads/ce /obj/item/radio/headset/heads/cmo name = "\proper the chief medical officer's headset" desc = "The headset of the highly trained medical chief." - icon_state = "com_headset" - worn_icon_state = "com_headset" keyslot = /obj/item/encryptionkey/heads/cmo /obj/item/radio/headset/heads/hop name = "\proper the head of personnel's headset" desc = "The headset of the guy who will one day be captain." - icon_state = "com_headset" - worn_icon_state = "com_headset" keyslot = /obj/item/encryptionkey/heads/hop /obj/item/radio/headset/heads/qm name = "\proper the quartermaster's headset" desc = "The headset of the guy who runs the cargo department." - icon_state = "com_headset" - worn_icon_state = "com_headset" keyslot = /obj/item/encryptionkey/heads/qm /obj/item/radio/headset/headset_cargo @@ -469,25 +465,23 @@ GLOBAL_LIST_INIT(channel_tokens, list( return TRUE /obj/item/radio/headset/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(istype(W, /obj/item/encryptionkey)) - if(keyslot && keyslot2) - to_chat(user, span_warning("The headset can't hold another key!")) - return - - if(!keyslot) - if(!user.transferItemToLoc(W, src)) - return - keyslot = W - - else - if(!user.transferItemToLoc(W, src)) - return - keyslot2 = W + if(!istype(W, /obj/item/encryptionkey)) + return ..() + if(keyslot && keyslot2) + to_chat(user, span_warning("The headset can't hold another key!")) + return - recalculateChannels() + if(!keyslot) + if(!user.transferItemToLoc(W, src)) + return + keyslot = W else - return ..() + if(!user.transferItemToLoc(W, src)) + return + keyslot2 = W + + recalculateChannels() /obj/item/radio/headset/recalculateChannels() . = ..() diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 5aa33a87672f..c354b29c518c 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -28,24 +28,23 @@ icon_state = "intercom_prison" icon_off = "intercom_prison-p" -/obj/item/radio/intercom/prison/Initialize(mapload, ndir, building) +/obj/item/radio/intercom/prison/Initialize(mapload) . = ..() wires?.cut(WIRE_TX) -/obj/item/radio/intercom/Initialize(mapload, ndir, building) +/obj/item/radio/intercom/Initialize(mapload) . = ..() var/area/current_area = get_area(src) if(!current_area) return RegisterSignal(current_area, COMSIG_AREA_POWER_CHANGE, PROC_REF(AreaPowerCheck)) + if(mapload) + find_and_mount_on_atom() 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() - . = ..() GLOB.intercoms_list -= src + return ..() /obj/item/radio/intercom/examine(mob/user) . = ..() @@ -87,7 +86,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) - knock_down() + deconstruct(TRUE) /** * Override attack_tk_grab instead of attack_tk because we actually want attack_tk's @@ -126,7 +125,7 @@ return TRUE -/obj/item/radio/intercom/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/obj/item/radio/intercom/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/item/radio/intercom/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) if(message_mods[RADIO_EXTENSION] == MODE_INTERCOM) return // Avoid hearing the same thing twice return ..() @@ -187,9 +186,8 @@ /** * Called by the wall mount component and reused during the tool deconstruction proc. */ -/obj/item/radio/intercom/proc/knock_down() +/obj/item/radio/intercom/atom_deconstruct(disassembled) 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 @@ -199,7 +197,7 @@ icon_state = "intercom" result_path = /obj/item/radio/intercom/unscrewed pixel_shift = 26 - custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.75, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.25) + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom, 27) @@ -209,7 +207,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom, 27) anonymize = TRUE freqlock = RADIO_FREQENCY_EMAGGABLE_LOCK -/obj/item/radio/intercom/chapel/Initialize(mapload, ndir, building) +/obj/item/radio/intercom/chapel/Initialize(mapload) . = ..() set_frequency(1481) set_broadcasting(TRUE) @@ -233,8 +231,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom, 27) desc = "A custom-made Syndicate-issue intercom used to transmit on all Nanotrasen frequencies. Particularly expensive." freerange = TRUE +/obj/item/radio/intercom/mi13 + name = "intercom" + desc = "Talk through this to talk to whoever is in this facility with you." + freerange = TRUE + MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/prison, 27) MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/chapel, 27) MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/command, 27) MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/syndicate, 27) MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/syndicate/freerange, 27) +MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/mi13, 27) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index d2d479693f9e..df539b62bb5f 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -2,7 +2,7 @@ /obj/item/radio icon = 'icons/obj/devices/voice.dmi' - name = "station bounced radio" + name = "city bounced radio" // DARKPACK EDIT, ORIGINAL: name = "station bounced radio" icon_state = "walkietalkie" inhand_icon_state = "walkietalkie" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' @@ -11,6 +11,9 @@ desc = "A basic handheld radio that communicates with local telecommunication networks." dog_fashion = /datum/dog_fashion/back interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_ALLOW_USER_LOCATION | INTERACT_ATOM_IGNORE_MOBILITY + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT @@ -336,6 +339,11 @@ if(is_within_radio_jammer_range(src) && !(special_channels & RADIO_SPECIAL_SYNDIE)) return + // DARKPACK EDIT START + if(get_area(src) == typesof(/area/vtm/interior/sewer)) // If we're in the sewers, consider the radio JAMMED. https://www.youtube.com/watch?v=FcArnepkhv0 + return + // DARKPACK EDIT END + // Determine the identity information which will be attached to the signal. var/atom/movable/virtualspeaker/speaker = new(null, talking_movable, src) @@ -343,7 +351,7 @@ var/datum/signal/subspace/vocal/signal = new(src, freq, speaker, language, radio_message, spans, message_mods) // Independent radios, on the CentCom frequency, reach all independent radios - if ((special_channels & RADIO_SPECIAL_CENTCOM) && (freq == FREQ_CENTCOM || freq == FREQ_STATUS_DISPLAYS)) + if ((special_channels & RADIO_SPECIAL_CENTCOM) && (freq == FREQ_CENTCOM || freq == FREQ_STATUS_DISPLAYS || freq == FREQ_MILITARY)) // DARKPACK EDIT, ORIGINAL: if ((special_channels & RADIO_SPECIAL_CENTCOM) && (freq == FREQ_CENTCOM || freq == FREQ_STATUS_DISPLAYS)) signal.data["compression"] = 0 signal.transmission_method = TRANSMISSION_SUPERSPACE signal.levels = list(0) @@ -381,7 +389,7 @@ signal.levels = SSmapping.get_connected_levels(T) signal.broadcast() -/obj/item/radio/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/obj/item/radio/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/item/radio/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) . = ..() if(radio_freq || !broadcasting || get_dist(src, speaker) > canhear_range || message_mods[MODE_RELAY]) return diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm index 8e3c1cfbbf13..c95d7f9333dd 100644 --- a/code/game/objects/items/devices/reverse_bear_trap.dm +++ b/code/game/objects/items/devices/reverse_bear_trap.dm @@ -101,7 +101,7 @@ if(!do_after(user, 3 SECONDS, target = target) || target.get_item_by_slot(ITEM_SLOT_HEAD)) return target.visible_message(span_warning("[user] forces and locks [src] onto [target]'s head!"), \ - span_userdanger("[target] locks [src] onto your head!"), "You hear a click, and then a timer ticking down.") + span_userdanger("[user] locks [src] onto your head!"), "You hear a click, and then a timer ticking down.") to_chat(user, span_danger("You force [src] onto [target]'s head and click the padlock shut.")) user.dropItemToGround(src) diff --git a/code/game/objects/items/devices/scanners/autopsy_scanner.dm b/code/game/objects/items/devices/scanners/autopsy_scanner.dm index af0ff55abd19..40835bc79202 100644 --- a/code/game/objects/items/devices/scanners/autopsy_scanner.dm +++ b/code/game/objects/items/devices/scanners/autopsy_scanner.dm @@ -13,6 +13,9 @@ w_class = WEIGHT_CLASS_NORMAL custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*2) custom_price = PAYCHECK_COMMAND + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP /obj/item/autopsy_scanner/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!isliving(interacting_with)) @@ -64,10 +67,10 @@ autopsy_information += "Time of Death - [scanned.station_timestamp_timeofdeath]
" autopsy_information += "Subject has been dead for [DisplayTimeText(round(world.time - scanned.timeofdeath))].
" - var/oxy_loss = scanned.getOxyLoss() - var/tox_loss = scanned.getToxLoss() - var/fire_loss = scanned.getFireLoss() - var/brute_loss = scanned.getBruteLoss() + var/oxy_loss = scanned.get_oxy_loss() + var/tox_loss = scanned.get_tox_loss() + var/fire_loss = scanned.get_fire_loss() + var/brute_loss = scanned.get_brute_loss() /// "Body Data" portion of the autopsy - damage, wounds, and limbs var/dmgreport = "Body Data:\ \ @@ -184,31 +187,32 @@ // Blood Info if(HAS_TRAIT(scanned, TRAIT_HUSK)) - autopsy_information += "Blood can't be found, subject is husked by: " - if(HAS_TRAIT_FROM(scanned, TRAIT_HUSK, BURN)) - autopsy_information += "Severe burns.
" - else if (HAS_TRAIT_FROM(scanned, TRAIT_HUSK, CHANGELING_DRAIN)) + autopsy_information += "Subject is husked by: " + if(HAS_TRAIT_FROM(scanned, TRAIT_HUSK, CHANGELING_DRAIN)) autopsy_information += "Desiccation, commonly caused by Changelings.
" - else + else if(!HAS_TRAIT_FROM(scanned, TRAIT_HUSK, BURN)) // prioritize showing unknown causes over burns autopsy_information += "Unknown causes.
" - else - var/datum/blood_type/blood_type = scanned.get_bloodtype() - if(blood_type) - var/blood_percent = round((scanned.blood_volume / BLOOD_VOLUME_NORMAL) * 100) - var/blood_type_format - var/level_format - if(scanned.blood_volume <= BLOOD_VOLUME_SAFE && scanned.blood_volume > BLOOD_VOLUME_OKAY) - level_format = "LOW [blood_percent]%, [scanned.blood_volume] cl" - else if(scanned.blood_volume <= BLOOD_VOLUME_OKAY) - level_format = "CRITICAL [blood_percent]%, [scanned.blood_volume] cl" - else - level_format = "[blood_percent]%, [scanned.blood_volume] cl" - if(blood_type.get_type()) - blood_type_format = "type: [blood_type.get_type()]" - autopsy_information += "[blood_type.get_blood_name()] level: [level_format], [blood_type_format]
" - var/blood_alcohol_content = scanned.get_blood_alcohol_content() - if(blood_alcohol_content > 0) - autopsy_information += "↳ [blood_type?.get_blood_name() || "Blood"] alcohol content: [blood_alcohol_content]%
" + else + autopsy_information += "Severe burns.
" + + var/datum/blood_type/blood_type = scanned.get_bloodtype() + if(blood_type) + var/cached_blood_volume = scanned.get_blood_volume(apply_modifiers = TRUE) + var/blood_percent = round((cached_blood_volume / BLOOD_VOLUME_NORMAL) * 100) + var/blood_type_format + var/level_format + if(cached_blood_volume <= BLOOD_VOLUME_SAFE && cached_blood_volume > BLOOD_VOLUME_OKAY) + level_format = "LOW [blood_percent]%, [cached_blood_volume] cl" + else if(cached_blood_volume <= BLOOD_VOLUME_OKAY) + level_format = "CRITICAL [blood_percent]%, [cached_blood_volume] cl" + else + level_format = "[blood_percent]%, [cached_blood_volume] cl" + if(blood_type.get_type()) + blood_type_format = "type: [blood_type.get_type()]" + autopsy_information += "[blood_type.get_blood_name()] level: [level_format], [blood_type_format]
" + var/blood_alcohol_content = scanned.get_blood_alcohol_content() + if(blood_alcohol_content > 0) + autopsy_information += "↳ [blood_type?.get_blood_name() || "Blood"] alcohol content: [blood_alcohol_content]%
" autopsy_information += "
" autopsy_information += "Chemical Data:
" diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index 2e9352d2c2ff..b7a7ce648068 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -16,7 +16,6 @@ throw_range = 7 tool_behaviour = TOOL_ANALYZER custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT * 0.3, /datum/material/glass=SMALL_MATERIAL_AMOUNT * 0.2) - grind_results = list(/datum/reagent/mercury = 5, /datum/reagent/iron = 5, /datum/reagent/silicon = 5) interaction_flags_click = NEED_LITERACY|NEED_LIGHT|ALLOW_RESTING pickup_sound = 'sound/items/handling/gas_analyzer/gas_analyzer_pickup.ogg' drop_sound = 'sound/items/handling/gas_analyzer/gas_analyzer_drop.ogg' @@ -44,6 +43,9 @@ slapcraft_recipes = slapcraft_recipe_list,\ ) */ // DARKPACK EDIT REMOVE +/obj/item/analyzer/grind_results() + return list(/datum/reagent/mercury = 5, /datum/reagent/iron = 5, /datum/reagent/silicon = 5) + /obj/item/analyzer/equipped(mob/user, slot, initial) . = ..() ADD_TRAIT(user, TRAIT_DETECT_STORM, CLOTHING_TRAIT) @@ -234,5 +236,7 @@ worn_icon_state = "analyzer" w_class = WEIGHT_CLASS_NORMAL custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.2, /datum/material/gold = SMALL_MATERIAL_AMOUNT*3, /datum/material/bluespace=SMALL_MATERIAL_AMOUNT*2) - grind_results = list(/datum/reagent/mercury = 5, /datum/reagent/iron = 5, /datum/reagent/silicon = 5) ranged_scan_distance = 15 + +/obj/item/analyzer/ranged/grind_results() + return list(/datum/reagent/mercury = 5, /datum/reagent/iron = 5, /datum/reagent/silicon = 5) diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index 90d4d9bcc8f6..c70ce933df49 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -21,13 +21,16 @@ throw_range = 7 custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT *2) interaction_flags_click = NEED_LITERACY|NEED_LIGHT|ALLOW_RESTING + custom_price = PAYCHECK_COMMAND + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP /// Verbose/condensed var/mode = SCANNER_VERBOSE /// HEALTH/WOUND var/scanmode = SCANMODE_HEALTH /// Advanced health analyzer 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 var/last_scan_text @@ -153,10 +156,10 @@ var/list/render_list = list() // Damage specifics - var/oxy_loss = target.getOxyLoss() - var/tox_loss = target.getToxLoss() - var/fire_loss = target.getFireLoss() - var/brute_loss = target.getBruteLoss() + var/oxy_loss = target.get_oxy_loss() + var/tox_loss = target.get_tox_loss() + var/fire_loss = target.get_fire_loss() + var/brute_loss = target.get_brute_loss() var/mob_status = (!target.appears_alive() ? span_alert("Deceased") : "[round(target.health / target.maxHealth, 0.01) * 100]% healthy") if(HAS_TRAIT(target, TRAIT_FAKEDEATH) && target.stat != DEAD) @@ -175,22 +178,22 @@ // Husk detection if(HAS_TRAIT(target, TRAIT_HUSK)) if(advanced) - if(HAS_TRAIT_FROM(target, TRAIT_HUSK, BURN)) - render_list += "Subject has been husked by [conditional_tooltip("severe burns", "Tend burns and apply a de-husking agent, such as [/datum/reagent/medicine/c2/synthflesh::name].", tochat)].
" - else if (HAS_TRAIT_FROM(target, TRAIT_HUSK, CHANGELING_DRAIN)) + if(HAS_TRAIT_FROM(target, TRAIT_HUSK, CHANGELING_DRAIN)) render_list += "Subject has been husked by [conditional_tooltip("desiccation", "Irreparable. Under normal circumstances, revival can only proceed via brain transplant.", tochat)].
" - else + else if(!HAS_TRAIT_FROM(target, TRAIT_HUSK, BURN)) // prioritize showing unknown causes over burns render_list += "Subject has been husked by mysterious causes.
" + else + render_list += "Subject has been husked by [conditional_tooltip("severe burns", "Tend burns and apply a de-husking agent, such as [/datum/reagent/medicine/c2/synthflesh::name].", tochat)].
" else render_list += "Subject has been husked.
" - if(target.getStaminaLoss()) + if(target.get_stamina_loss()) if(advanced) - render_list += "Fatigue level: [target.getStaminaLoss()]%.
" + render_list += "Fatigue level: [target.get_stamina_loss()]%.
" else render_list += "Subject appears to be suffering from fatigue.
" - + // Check for brain - both organic (carbon) and synthetic (cyborg MMI) var/has_brain = FALSE if(target.get_organ_slot(ORGAN_SLOT_BRAIN)) @@ -199,7 +202,7 @@ var/mob/living/silicon/robot/cyborg_target = target if(cyborg_target.mmi?.brain) has_brain = TRUE - + if(!has_brain) // kept exclusively for soul purposes render_list += "Subject lacks a brain.
" @@ -368,15 +371,16 @@ // Blood Level var/datum/blood_type/blood_type = target.get_bloodtype() if(blood_type) - var/blood_percent = round((target.blood_volume / BLOOD_VOLUME_NORMAL) * 100) + var/cached_blood_volume = target.get_blood_volume(apply_modifiers = TRUE) + var/blood_percent = round((cached_blood_volume / BLOOD_VOLUME_NORMAL) * 100) var/blood_type_format var/level_format - if(target.blood_volume <= BLOOD_VOLUME_SAFE && target.blood_volume > BLOOD_VOLUME_OKAY) - level_format = "LOW [blood_percent]%, [target.blood_volume] cl" + if(cached_blood_volume <= BLOOD_VOLUME_SAFE && cached_blood_volume > BLOOD_VOLUME_OKAY) + level_format = "LOW [blood_percent]%, [cached_blood_volume] cl" if (blood_type.restoration_chem) level_format = conditional_tooltip(level_format, "Recommendation: [blood_type.restoration_chem::name] supplement.", tochat) - else if(target.blood_volume <= BLOOD_VOLUME_OKAY) - level_format = "CRITICAL [blood_percent]%, [target.blood_volume] cl" + else if(cached_blood_volume <= BLOOD_VOLUME_OKAY) + level_format = "CRITICAL [blood_percent]%, [cached_blood_volume] cl" var/recommendation = list() if (blood_type.restoration_chem) recommendation += "[blood_type.restoration_chem::name] supplement" @@ -388,7 +392,7 @@ recommendation += "immediate [blood_type.get_blood_name()] transufion" level_format = conditional_tooltip(level_format, "Recommendation: [english_list(recommendation, and_text = " or ")].", tochat) else - level_format = "[blood_percent]%, [target.blood_volume] cl" + level_format = "[blood_percent]%, [cached_blood_volume] cl" if (blood_type.get_type()) blood_type_format = "type: [blood_type.get_type()]" @@ -398,7 +402,7 @@ compatible_types_readable |= initial(comp_blood_type.name) blood_type_format = span_tooltip("Can receive from types [english_list(compatible_types_readable)].", blood_type_format) - render_list += "[blood_type.get_blood_name()] level: [level_format],[blood_type_format]
" + render_list += "[blood_type.get_blood_name()] level: [level_format],[blood_type_format]
" var/blood_alcohol_content = target.get_blood_alcohol_content() if(blood_alcohol_content > 0) @@ -691,7 +695,7 @@ show_emotion(AID_EMOTION_HAPPY) /obj/item/healthanalyzer/simple/proc/violence_damage(mob/living/user) - user.adjustBruteLoss(4) + user.adjust_brute_loss(4) /obj/item/healthanalyzer/simple/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!isliving(interacting_with)) @@ -759,7 +763,7 @@ scan_for_what = "diseases" /obj/item/healthanalyzer/simple/disease/violence_damage(mob/living/user) - user.adjustBruteLoss(1) + user.adjust_brute_loss(1) user.reagents.add_reagent(/datum/reagent/toxin, rand(1, 3)) /obj/item/healthanalyzer/simple/disease/do_the_scan(mob/living/carbon/scanning, mob/living/user) diff --git a/code/game/objects/items/devices/scanners/plant_analyzer.dm b/code/game/objects/items/devices/scanners/plant_analyzer.dm index fcce33141dfd..4adfec936299 100644 --- a/code/game/objects/items/devices/scanners/plant_analyzer.dm +++ b/code/game/objects/items/devices/scanners/plant_analyzer.dm @@ -13,6 +13,9 @@ w_class = WEIGHT_CLASS_TINY slot_flags = ITEM_SLOT_BELT custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*0.3, /datum/material/glass =SMALL_MATERIAL_AMOUNT*0.2) + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP /// Cached data from ui_interact var/list/last_scan_data /// Weakref to the last thing we scanned @@ -262,16 +265,16 @@ if(graft) last_scan_data["graft_data"] = list( - "name" = graft.parent_name, + "name" = graft.plant_dna.name, "icon" = graft.icon, "icon_state" = graft.icon_state, - "yield" = graft.yield, - "production" = graft.production, - "lifespan" = graft.lifespan, - "endurance" = graft.endurance, - "weed_rate" = graft.weed_rate, - "weed_chance" = graft.weed_chance, - "graft_gene" = graft.stored_trait.type, + "yield" = graft.plant_dna.yield, + "production" = graft.plant_dna.production, + "lifespan" = graft.plant_dna.lifespan, + "endurance" = graft.plant_dna.endurance, + "weed_rate" = graft.plant_dna.weed_rate, + "weed_chance" = graft.plant_dna.weed_chance, + "graft_gene" = graft.plant_dna.graft_gene.type ) if(user) @@ -323,11 +326,11 @@ product_grinder_results[seed.product] = list() var/obj/item/food/grown/product = new seed.product var/datum/reagent/product_distill_reagent = product.distill_reagent - var/datum/reagent/product_juice_typepath = product.juice_typepath + var/datum/reagent/product_juice_typepath = product.juice_typepath() product_grinder_results[seed.product]["distill_reagent"] = initial(product_distill_reagent.name) product_grinder_results[seed.product]["juice_name"] = initial(product_juice_typepath.name) product_grinder_results[seed.product]["grind_results"] = list() - for(var/datum/reagent/reagent as anything in product.grind_results) + for(var/datum/reagent/reagent as anything in product.grind_results()) product_grinder_results[seed.product]["grind_results"] += initial(reagent.name) qdel(product) seed_data["distill_reagent"] = product_grinder_results[seed.product]["distill_reagent"] diff --git a/code/game/objects/items/devices/scanners/sequence_scanner.dm b/code/game/objects/items/devices/scanners/sequence_scanner.dm index d22372fa1089..938c5637b74e 100644 --- a/code/game/objects/items/devices/scanners/sequence_scanner.dm +++ b/code/game/objects/items/devices/scanners/sequence_scanner.dm @@ -15,6 +15,9 @@ throw_speed = 3 throw_range = 7 custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*2) + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP var/list/discovered = list() //hit a dna console to update the scanners database var/list/buffer diff --git a/code/game/objects/items/devices/scanners/t_scanner.dm b/code/game/objects/items/devices/scanners/t_scanner.dm index 0e8e2c441829..30083139abd2 100644 --- a/code/game/objects/items/devices/scanners/t_scanner.dm +++ b/code/game/objects/items/devices/scanners/t_scanner.dm @@ -11,6 +11,9 @@ lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT * 1.5) + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP /// Is this T-Ray scanner currently on? var/on = FALSE diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm index e68c8095fe01..9eb9ee94255c 100644 --- a/code/game/objects/items/devices/sensor_device.dm +++ b/code/game/objects/items/devices/sensor_device.dm @@ -11,6 +11,13 @@ slot_flags = ITEM_SLOT_BELT custom_price = PAYCHECK_CREW * 5 custom_premium_price = PAYCHECK_CREW * 6 + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP /obj/item/sensor_device/attack_self(mob/user) GLOB.crewmonitor.show(user,src) //Proc already exists, just had to call it + +/obj/item/sensor_device/Initialize(mapload) + . = ..() + AddElement(/datum/element/drag_to_activate) diff --git a/code/game/objects/items/devices/table_clock.dm b/code/game/objects/items/devices/table_clock.dm index 0d8195363668..3184ed43857f 100644 --- a/code/game/objects/items/devices/table_clock.dm +++ b/code/game/objects/items/devices/table_clock.dm @@ -32,7 +32,7 @@ . += span_info("It appears to be currently broken. You can use it in-hand to repair it.") else . += span_info("The current CST (local) time is: [station_time_timestamp()].") - . += span_info("The current TCT (galactic) time is: [time2text(world.realtime, "hh:mm:ss", NO_TIMEZONE)].") + //. += span_info("The current TCT (galactic) time is: [time2text(world.realtime, "hh:mm:ss", NO_TIMEZONE)].") DARKPACK EDIT REMOVAL /obj/item/table_clock/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) . = ..() diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 149015ce2925..fd2a5e5607bc 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -29,6 +29,7 @@ var/time_left_warning = 60 SECONDS ///Sound loop that plays when recording or playing back. var/datum/looping_sound/tape_recorder_hiss/soundloop + custom_price = 50 // DARKPACK EDIT ADD - ECONOMY /obj/item/taperecorder/Initialize(mapload) . = ..() @@ -109,8 +110,8 @@ update_appearance() /obj/item/taperecorder/fire_act(exposed_temperature, exposed_volume) - mytape.unspool() //Fires unspool the tape, which makes sense if you don't think about it - ..() + mytape?.unspool() //Fires unspool the tape, which makes sense if you don't think about it + return ..() //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/taperecorder/attack_hand(mob/user, list/modifiers) @@ -153,7 +154,7 @@ return ..() -/obj/item/taperecorder/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range) +/obj/item/taperecorder/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/item/taperecorder/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range) . = ..() if(message_mods[MODE_RELAY] || !mytape || istype(speaker, /obj/item/taperecorder)) return @@ -396,6 +397,7 @@ var/unspooled = FALSE var/list/icons_available = list() var/radial_icon_file = 'icons/hud/radial_tape.dmi' + custom_price = 10 // DARKPACK EDIT ADD - ECONOMY /obj/item/tape/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index f5b569b55324..b4c9c628c05a 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -404,6 +404,7 @@ effective or pretty fucking useless. desc = "A jury-rigged device that disrupts nearby radio communication. Its crude construction provides a significantly smaller area of effect compared to its Syndicate counterpart." range = 5 disruptor_range = 3 + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.5) /obj/item/jammer/makeshift/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index aee6e25b8327..0b5574de31c0 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -24,6 +24,7 @@ /obj/item/transfer_valve/Initialize(mapload) . = ..() + AddElement(/datum/element/cuffable_item) RegisterSignal(src, COMSIG_ITEM_FRIED, PROC_REF(on_fried)) register_context() register_item_context() @@ -234,6 +235,11 @@ if(!istype(target) || (target != tank_one && target != tank_two)) return FALSE + for(var/obj/effect/forcefield/cosmic_field/potential_field as anything in GLOB.active_cosmic_fields) + if(get_dist(potential_field, src) < 3) + new /obj/effect/temp_visual/revenant(get_turf(src)) + return FALSE + // Throw both tanks into processing queue var/datum/gas_mixture/target_mix = target.return_air() var/datum/gas_mixture/other_mix diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index b563e70cb2c9..416abb3064e9 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -70,7 +70,7 @@ /obj/item/dice/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) var/mob/thrown_by = throwingdatum?.get_thrower() - if(thrown_by) + if(istype(thrown_by)) diceroll(thrown_by) return ..() @@ -355,7 +355,7 @@ if(4) //Destroy Equipment selected_turf.visible_message(span_userdanger("Everything [user] is holding and wearing disappears!")) - var/list/belongings = user.get_all_gear() + var/list/belongings = user.get_all_gear(NONE) //don't delete prosthetics or abstract items. QDEL_LIST(belongings) if(5) //Monkeying @@ -369,7 +369,7 @@ //Throw selected_turf.visible_message(span_userdanger("Unseen forces throw [user]!")) user.Stun(60) - user.adjustBruteLoss(50) + user.adjust_brute_loss(50) var/throw_dir = pick(GLOB.cardinals) var/atom/throw_target = get_edge_target_turf(user, throw_dir) user.throw_at(throw_target, 200, 4) diff --git a/code/game/objects/items/dna_probe.dm b/code/game/objects/items/dna_probe.dm index 9e3be2dce40c..1f7307a8d75b 100644 --- a/code/game/objects/items/dna_probe.dm +++ b/code/game/objects/items/dna_probe.dm @@ -54,6 +54,9 @@ /obj/item/dna_probe/proc/try_upload_dna(obj/machinery/dna_vault/target, mob/user) var/uploaded = 0 + stored_dna_plants -= target.plant_dna + stored_dna_human -= target.human_dna + stored_dna_animal -= target.animal_dna var/plant_dna_length = length(stored_dna_plants) var/human_dna_length = length(stored_dna_human) var/animal_dna_length = length(stored_dna_animal) diff --git a/code/game/objects/items/drug_items.dm b/code/game/objects/items/drug_items.dm index bea5cec30fa2..1fd6a788894e 100644 --- a/code/game/objects/items/drug_items.dm +++ b/code/game/objects/items/drug_items.dm @@ -74,7 +74,6 @@ transfer_fingerprints_to(ampoule_shard) splash_reagents(hit_atom, throwingdatum?.get_thrower(), was_thrown = TRUE, allow_closed_splash = FALSE) qdel(src) - hit_atom.Bumped(ampoule_shard) /obj/item/reagent_containers/cup/blastoff_ampoule/Initialize(mapload, vol) . = ..() diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index f6edc5da9018..3f2aea409c75 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -151,7 +151,7 @@ if(HAS_TRAIT(src, TRAIT_WIELDED)) user.take_bodypart_damage(20,25,check_armor = TRUE) else - user.adjustStaminaLoss(25) + user.adjust_stamina_loss(25) /obj/item/dualsaber/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) if(!HAS_TRAIT(src, TRAIT_WIELDED)) diff --git a/code/game/objects/items/dyespray.dm b/code/game/objects/items/dyespray.dm index c0c3f8bf6143..a62a17f43520 100644 --- a/code/game/objects/items/dyespray.dm +++ b/code/game/objects/items/dyespray.dm @@ -57,8 +57,8 @@ 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)) + var/new_grad_color = tgui_color_picker(user, "Choose a secondary hair color:", "Character Preference", human_target.get_hair_gradient_color()) + if(!new_grad_color || !user.can_perform_action(src, NEED_DEXTERITY) || !target.IsReachableBy(user)) return to_chat(user, span_notice("You start applying the hair dye...")) @@ -105,7 +105,7 @@ return var/default_color = overlay.dye_color || overlay.draw_color - var/new_color = input(user, "Choose a color for [selected]:", "Character Preference", default_color) as color|null + var/new_color = tgui_color_picker(user, "Choose a color for [selected]:", "Character Preference", default_color) if(isnull(new_color) || new_color == default_color || !user.can_perform_action(src, NEED_DEXTERITY)) return if(QDELETED(selected) || !(selected in target.organs)) diff --git a/code/game/objects/items/emags.dm b/code/game/objects/items/emags.dm index 219e1a3e144d..9bce1d09fdd0 100644 --- a/code/game/objects/items/emags.dm +++ b/code/game/objects/items/emags.dm @@ -31,8 +31,7 @@ var/emag_count = 0 for(var/obj/item/card/emag/emag in get_all_contents() + emag_card.get_all_contents()) // This is including itself emag_count++ - if(emag_count > 6) // 1 uplink's worth is the limit - to_chat(user, span_warning("Nope, lesson learned. No more.")) + if(emag_count >= 128) // prevent overlay sprite overload allowed on a single item, incase someone manages to (somehow) emag an emag 128 times return FALSE if(emag_card.loc != loc) // Both have to be in your hand (or TK shenanigans) return FALSE diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 4c8507dd88f3..ff9a9453d124 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -162,7 +162,7 @@ throwforce = 1 w_class = WEIGHT_CLASS_SMALL force = 3 - custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.4) + custom_materials = null max_water = 30 sprite_name = "coolant" dog_fashion = null @@ -358,7 +358,7 @@ /obj/item/extinguisher/click_alt(mob/user) if(!user.is_holding(src)) - to_chat(user, span_notice("You must be holding the [src] in your hands do this!")) + to_chat(user, span_notice("You must be holding [src] in your hands to do this!")) return CLICK_ACTION_BLOCKING EmptyExtinguisher(user) return CLICK_ACTION_SUCCESS @@ -367,17 +367,21 @@ if(loc == user && reagents.total_volume) reagents.expose(user.loc, TOUCH) reagents.clear_reagents() - user.visible_message(span_notice("[user] empties out \the [src] onto the floor using the release valve."), span_info("You quietly empty out \the [src] using its release valve.")) - -//firebot assembly -/obj/item/extinguisher/attackby(obj/O, mob/user, list/modifiers, list/attack_modifiers) - if(istype(O, /obj/item/bodypart/arm/left/robot) || istype(O, /obj/item/bodypart/arm/right/robot)) - to_chat(user, span_notice("You add [O] to [src].")) - qdel(O) - qdel(src) - user.put_in_hands(new /obj/item/bot_assembly/firebot) - else - ..() + user.visible_message(span_notice("[user] empties out [src] onto the floor using the release valve."), span_info("You quietly empty out [src] using its release valve.")) + +// Firebot assembly +/obj/item/extinguisher/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if (!istype(tool, /obj/item/bodypart/arm/left/robot) && !istype(tool, /obj/item/bodypart/arm/right/robot)) + return NONE + + to_chat(user, span_notice("You add [tool] to [src].")) + qdel(tool) + var/obj/item/bot_assembly/firebot/assembly = new(drop_location()) + var/held_index = user.is_holding(src) + qdel(src) + if (held_index) + user.put_in_hand(assembly, held_index) + return ITEM_INTERACT_SUCCESS /obj/item/extinguisher/anti name = "fire extender" diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm index ed88848ea6d4..23cd24c375c5 100644 --- a/code/game/objects/items/fireaxe.dm +++ b/code/game/objects/items/fireaxe.dm @@ -69,6 +69,8 @@ GLOBAL_DATUM(bridge_axe, /obj/item/fireaxe) return if(target.resistance_flags & INDESTRUCTIBLE) return + if(QDELETED(target)) + return if(istype(target, /obj/structure/window) || istype(target, /obj/structure/grille)) target.atom_destruction("fireaxe") @@ -83,6 +85,7 @@ GLOBAL_DATUM(bridge_axe, /obj/item/fireaxe) icon_angle = 180 force_unwielded = 5 force_wielded = 23 + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 6) /* * Metal Hydrogen Axe diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 015423ac6e02..04cf93803c52 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -12,7 +12,7 @@ throw_speed = 1 throw_range = 5 w_class = WEIGHT_CLASS_NORMAL - custom_materials = list(/datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT * 0.5) + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.05, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.8) resistance_flags = FIRE_PROOF trigger_guard = TRIGGER_GUARD_NORMAL light_system = OVERLAY_LIGHT @@ -25,7 +25,9 @@ var/lit = FALSE //on or off var/operating = FALSE//cooldown var/obj/item/weldingtool/weldtool = null + /// The igniter stored in the flamethrower var/obj/item/assembly/igniter/igniter = null + /// The plasma tank that we shoot gas from var/obj/item/tank/internals/plasma/ptank = null var/warned_admins = FALSE //for the message_admins() when lit //variables for prebuilt flamethrowers @@ -94,9 +96,9 @@ return ITEM_INTERACT_SUCCESS /obj/item/flamethrower/wrench_act(mob/living/user, obj/item/tool) - . = TRUE + . = ITEM_INTERACT_SUCCESS if(status) - return FALSE + return ITEM_INTERACT_BLOCKING tool.play_tool_sound(src) var/turf/T = get_turf(src) if(weldtool) @@ -119,34 +121,34 @@ update_appearance() return TRUE -/obj/item/flamethrower/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(isigniter(W)) - var/obj/item/assembly/igniter/I = W - if(I.secured) - return +/obj/item/flamethrower/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(isigniter(tool)) + var/obj/item/assembly/igniter/inserting_igniter = tool + if(inserting_igniter.secured) + return ITEM_INTERACT_BLOCKING if(igniter) - return - if(!user.transferItemToLoc(W, src)) - return - igniter = I + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + igniter = inserting_igniter update_appearance() - return - - else if(istype(W, /obj/item/tank/internals/plasma)) + balloon_alert(user, "attached") + return ITEM_INTERACT_SUCCESS + if(istype(tool, /obj/item/tank/internals/plasma)) if(ptank) - if(user.transferItemToLoc(W,src)) - ptank.forceMove(get_turf(src)) - ptank = W - to_chat(user, span_notice("You swap the plasma tank in [src]!")) - return - if(!user.transferItemToLoc(W, src)) - return - ptank = W + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + ptank.forceMove(get_turf(src)) + ptank = tool + to_chat(user, span_notice("You swap the plasma tank in [src]!")) + return ITEM_INTERACT_SUCCESS + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + ptank = tool update_appearance() - return + return ITEM_INTERACT_SUCCESS - else - return ..() + return NONE /obj/item/flamethrower/return_analyzable_air() if(ptank) diff --git a/code/game/objects/items/flatpacks.dm b/code/game/objects/items/flatpacks.dm index 8894b05f7b80..b2a49a517875 100644 --- a/code/game/objects/items/flatpacks.dm +++ b/code/game/objects/items/flatpacks.dm @@ -103,6 +103,7 @@ icon_state = "flatcart" density = TRUE opacity = FALSE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 8, /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT) /obj/structure/flatpack_cart/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/food/_food.dm b/code/game/objects/items/food/_food.dm index 604b6c3c5abe..7475a8c18ba6 100644 --- a/code/game/objects/items/food/_food.dm +++ b/code/game/objects/items/food/_food.dm @@ -10,7 +10,6 @@ righthand_file = 'icons/mob/inhands/items/food_righthand.dmi' abstract_type = /obj/item/food obj_flags = UNIQUE_RENAME - grind_results = list() material_flags = MATERIAL_NO_EDIBILITY /** * A list of material paths. the main material in the custom_materials list is also added on init. diff --git a/code/game/objects/items/food/bread.dm b/code/game/objects/items/food/bread.dm index a100c0be1bfe..a16c67f8127c 100644 --- a/code/game/objects/items/food/bread.dm +++ b/code/game/objects/items/food/bread.dm @@ -22,7 +22,7 @@ /obj/item/food/bread/make_processable() if (slice_type) - AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice") + AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) AddElement(/datum/element/processable, TOOL_SAW, slice_type, yield, 4 SECONDS, table_required = TRUE, screentip_verb = "Slice") // Abstract parent object for sliced bread items. Should not be made obtainable in game. diff --git a/code/game/objects/items/food/burgers.dm b/code/game/objects/items/food/burgers.dm index 6b69b12d814b..0f01fbd439da 100644 --- a/code/game/objects/items/food/burgers.dm +++ b/code/game/objects/items/food/burgers.dm @@ -686,7 +686,12 @@ tastes = list("bun" = 2, "beef patty" = 4, "cheese" = 2, "beef soaked in chili" = 3, "a smoking flare" = 2) foodtypes = GRAIN | MEAT | DAIRY | VEGETABLES crafting_complexity = FOOD_COMPLEXITY_4 - custom_materials = list(/datum/material/meat = MEATDISH_MATERIAL_AMOUNT * 2, /datum/material/plastic= SMALL_MATERIAL_AMOUNT * 0.5) + custom_materials = list( + /datum/material/meat = MEATDISH_MATERIAL_AMOUNT * 2, + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, + /datum/material/plasma = SMALL_MATERIAL_AMOUNT * 0.5, + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 0.5, + ) /obj/item/food/burger/crazy/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/food/cake.dm b/code/game/objects/items/food/cake.dm index 91340435ab63..b53063672542 100644 --- a/code/game/objects/items/food/cake.dm +++ b/code/game/objects/items/food/cake.dm @@ -21,7 +21,7 @@ /obj/item/food/cake/make_processable() if (slice_type) - AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice") + AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/cakeslice icon = 'icons/obj/food/piecake.dmi' diff --git a/code/game/objects/items/food/cheese.dm b/code/game/objects/items/food/cheese.dm index 74af37742e7c..78d590fa10a4 100644 --- a/code/game/objects/items/food/cheese.dm +++ b/code/game/objects/items/food/cheese.dm @@ -59,7 +59,7 @@ AddComponent(/datum/component/food_storage) /obj/item/food/cheese/wheel/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cheese/wedge, 5, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cheese/wedge, 5, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/cheese/wheel/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/baked_cheese, rand(20 SECONDS, 25 SECONDS), TRUE, TRUE) @@ -87,6 +87,7 @@ tastes = list("cheese" = 4, "royalty" = 1) rat_heal = 70 crafting_complexity = FOOD_COMPLEXITY_3 + custom_materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT * 5) //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 @@ -131,7 +132,7 @@ 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") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cheese/firm_cheese_slice, 3, 3 SECONDS, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/cheese/firm_cheese_slice name = "firm cheese slice" diff --git a/code/game/objects/items/food/donuts.dm b/code/game/objects/items/food/donuts.dm index 3cfe6410adde..f074e88800d1 100644 --- a/code/game/objects/items/food/donuts.dm +++ b/code/game/objects/items/food/donuts.dm @@ -18,7 +18,7 @@ var/extra_reagent = null var/decorated_adjective = "sprinkled" crafting_complexity = FOOD_COMPLEXITY_2 - custom_price = 1 // DARKPACK EDIT ADD - FOOD + custom_price = 1 // DARKPACK EDIT ADD - ECONOMY /obj/item/food/donut/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/food/dough.dm b/code/game/objects/items/food/dough.dm index fe58ad5b09ec..9997b457befc 100644 --- a/code/game/objects/items/food/dough.dm +++ b/code/game/objects/items/food/dough.dm @@ -15,7 +15,7 @@ // Dough + rolling pin = flat dough /obj/item/food/dough/make_processable() - AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/food/flatdough, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Flatten") + AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/food/flatdough, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Flatten", sound_to_play = SFX_ROLLING_PIN_ROLLING) /obj/item/food/flatdough name = "flat dough" @@ -32,7 +32,7 @@ // sliceable into 3xdoughslices /obj/item/food/flatdough/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/doughslice, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/doughslice, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/pizzabread name = "pizza bread" @@ -63,7 +63,7 @@ AddComponent(/datum/component/bakeable, /obj/item/food/bun, rand(20 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/food/doughslice/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/bait/doughball, 5, 3 SECONDS, screentip_verb = "Slice") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/bait/doughball, 5, 3 SECONDS, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/bun name = "bun" @@ -94,7 +94,7 @@ AddComponent(/datum/component/bakeable, /obj/item/food/cake/plain, rand(70 SECONDS, 90 SECONDS), TRUE, TRUE) /obj/item/food/cakebatter/make_processable() - AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/food/piedough, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Flatten") + AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/food/piedough, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Flatten", sound_to_play = SFX_ROLLING_PIN_ROLLING) /obj/item/food/piedough name = "pie dough" @@ -110,7 +110,7 @@ AddComponent(/datum/component/bakeable, /obj/item/food/pie/plain, rand(30 SECONDS, 45 SECONDS), TRUE, TRUE) /obj/item/food/piedough/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/rawpastrybase, 6, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/rawpastrybase, 6, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/rawpastrybase name = "raw pastry base" diff --git a/code/game/objects/items/food/lizard.dm b/code/game/objects/items/food/lizard.dm index 4b6230303a2a..ee1ca09e882f 100644 --- a/code/game/objects/items/food/lizard.dm +++ b/code/game/objects/items/food/lizard.dm @@ -73,7 +73,7 @@ custom_materials = list(/datum/material/meat = MEATSLAB_MATERIAL_AMOUNT) /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") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/headcheese_slice, 5, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/headcheese_slice name = "headcheese slice" @@ -451,7 +451,7 @@ AddComponent(/datum/component/bakeable, bread_type, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) /obj/item/food/rootdough/make_processable() - AddElement(/datum/element/processable, TOOL_ROLLINGPIN, flat_type, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Flatten") + AddElement(/datum/element/processable, TOOL_ROLLINGPIN, flat_type, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Flatten", sound_to_play = SFX_ROLLING_PIN_ROLLING) /obj/item/food/rootdough/egg desc = "A root based dough, made with nuts, tubers and eggs. Used in a wide range of Tiziran cooking." @@ -472,7 +472,7 @@ var/grill_type = /obj/item/food/root_flatbread /obj/item/food/flatrootdough/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, process_type, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice") + AddElement(/datum/element/processable, TOOL_KNIFE, process_type, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/flatrootdough/make_grillable() AddComponent(/datum/component/grillable, grill_type, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) @@ -499,7 +499,7 @@ foodtypes = parent_type::foodtypes | MEAT /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") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/spaghetti/nizaya, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/rootdoughslice/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/rootroll, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) diff --git a/code/game/objects/items/food/martian.dm b/code/game/objects/items/food/martian.dm index b83e28ec0767..24f1729257f7 100644 --- a/code/game/objects/items/food/martian.dm +++ b/code/game/objects/items/food/martian.dm @@ -409,7 +409,7 @@ // 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!" + desc = "The original and best Big Blue, straight outta Hawaii's favourite burger joint. Catch the wave, brother!" // DARKPACK EDIT CHANGE icon = 'icons/obj/food/martian.dmi' icon_state = "big_blue_burger" food_reagents = list( @@ -425,7 +425,7 @@ /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." + 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 world-wide. Given Big Kahuna operates most of its stores in Hawaii, it's perhaps no wonder this dish is popular there." // DARKPACK EDIT CHANGE icon = 'icons/obj/food/martian.dmi' icon_state = "chappy_patty" food_reagents = list( @@ -489,7 +489,7 @@ /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." + desc = "The quintessential breakfast sandwich with a fruity twist. Egg, belly pork, pineapple, cheese. Simple. Classic." // DARKPACK EDIT CHANGE icon = 'icons/obj/food/martian.dmi' icon_state = "croque_martienne" food_reagents = list( @@ -587,7 +587,7 @@ /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." + desc = "Fried kimchi, mixed with sugar and topped with bratwurst. A popular dish at non-traditional izakayas." // DARKPACK EDIT CHANGE icon = 'icons/obj/food/martian.dmi' icon_state = "brat_kimchi" food_reagents = list( @@ -650,7 +650,7 @@ /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." + desc = "A fried pastry snack from Malaysia. Stuffed with curried chicken and potatoes, alongside a slice of hard boiled egg, it's a popular street food in San Francisco." // DARKPACK EDIT CHANGE icon = 'icons/obj/food/martian.dmi' icon_state = "epok_epok" food_reagents = list( @@ -887,7 +887,7 @@ /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." + desc = "Considered a Macanese variant on piri-piri, fēizhōu jī, or galinha à africana, or African chicken (if you're feeling like speaking English), is a popular dish in the region, and subsequently also in San Francisco due to its influx of Macanese immigrants." // DARKPACK EDIT CHANGE - not satisfied with this one icon = 'icons/obj/food/martian.dmi' icon_state = "feizhou_ji" food_reagents = list( @@ -1166,7 +1166,7 @@ /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." + desc = "Frozen pineapple, on a stick, with just a little dunk of dark chocolate." // DARKPACK EDIT CHANGE overlay_state = "pineapple_pop" food_reagents = list( /datum/reagent/consumable/pineapplejuice = 4, @@ -1250,7 +1250,7 @@ /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." + desc = "Spicy fried pickle spears? Such a bold combination can surely come only from one place- American ballparks? Well, not really, but they are a popular snack there." // DARKPACK EDIT CHANGE icon = 'icons/obj/food/martian.dmi' icon_state = "frickles" food_reagents = list( @@ -1285,7 +1285,7 @@ /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." + desc = "A classic German bread transformed by the hand of American imperialism into a game-day snack." // DARKPACK EDIT CHANGE icon = 'icons/obj/food/martian.dmi' icon_state = "ballpark_pretzel" food_reagents = list( @@ -1317,7 +1317,7 @@ /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." + desc = "Skewered chicken meatballs in a sweet-and-savoury yakitori sauce. A common sight at Japanese ballparks." // DARKPACK EDIT CHANGE icon = 'icons/obj/food/martian.dmi' icon_state = "ballpark_tsukune" food_reagents = list( diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm index 98469b34709d..e9dff6900def 100644 --- a/code/game/objects/items/food/meatdish.dm +++ b/code/game/objects/items/food/meatdish.dm @@ -359,7 +359,7 @@ // sliceable into 4xtempehslices /obj/item/food/tempeh/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/tempehslice, 4, 5 SECONDS, table_required = TRUE, screentip_verb = "Slice") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/tempehslice, 4, 5 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) //add an icon for slices /obj/item/food/tempehslice @@ -466,7 +466,7 @@ AddComponent(/datum/component/grillable, meatball_type, rand(30 SECONDS, 40 SECONDS), TRUE) /obj/item/food/raw_meatball/make_processable() - AddElement(/datum/element/processable, TOOL_ROLLINGPIN, patty_type, 1, table_required = TRUE, screentip_verb = "Flatten") + AddElement(/datum/element/processable, TOOL_ROLLINGPIN, patty_type, 1, table_required = TRUE, screentip_verb = "Flatten", sound_to_play = SFX_ROLLING_PIN_ROLLING) /obj/item/food/raw_meatball/human name = "strange raw meatball" @@ -638,8 +638,8 @@ custom_materials = list(/datum/material/meat = MEATSLAB_MATERIAL_AMOUNT) /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") - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/sausage/american, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/salami, 6, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/sausage/american, 1, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/sausage/american name = "american sausage" diff --git a/code/game/objects/items/food/meatslab.dm b/code/game/objects/items/food/meatslab.dm index 6e3f124cc8ea..55fa78c32955 100644 --- a/code/game/objects/items/food/meatslab.dm +++ b/code/game/objects/items/food/meatslab.dm @@ -52,7 +52,7 @@ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe? /obj/item/food/meat/slab/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain, MEATSLAB_PROCESSED_AMOUNT, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain, MEATSLAB_PROCESSED_AMOUNT, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE) ///////////////////////////////////// HUMAN MEATS ////////////////////////////////////////////////////// @@ -66,7 +66,7 @@ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/plain/human, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe? /obj/item/food/meat/slab/human/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain/human, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/plain/human, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/meat/slab/human/mutant abstract_type = /obj/item/food/meat/slab/human/mutant @@ -211,6 +211,10 @@ foodtypes = RAW | MEAT | BUGS blood_decal_type = /obj/effect/decal/cleanable/insectguts +/obj/item/food/meat/slab/bugmeat/Initialize(mapload) + . = ..() + AddElement(/datum/element/raptor_food, health_modifier = 2, color_chances = string_list(list(/datum/raptor_color/green = 2))) + /obj/item/food/meat/slab/mouse name = "mouse meat" desc = "A slab of mouse meat. Best not eat it raw." @@ -262,7 +266,7 @@ AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/killertomato, rand(70 SECONDS, 85 SECONDS), TRUE, TRUE) /obj/item/food/meat/slab/killertomato/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/killertomato, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/killertomato, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/meat/slab/bear name = "bear meat" @@ -278,7 +282,7 @@ foodtypes = RAW | MEAT /obj/item/food/meat/slab/bear/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/bear, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/bear, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/meat/slab/bear/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/bear, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE) @@ -301,7 +305,7 @@ blood_decal_type = /obj/effect/decal/cleanable/blood/xeno /obj/item/food/meat/slab/xeno/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/xeno, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/xeno, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/meat/slab/xeno/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/xeno, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE) @@ -320,7 +324,7 @@ blood_decal_type = /obj/effect/decal/cleanable/insectguts /obj/item/food/meat/slab/spider/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/spider, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/spider, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/meat/slab/spider/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/spider, rand(40 SECONDS, 70 SECONDS), TRUE, TRUE) @@ -337,6 +341,10 @@ tastes = list("meat" = 1) foodtypes = RAW | MEAT | TOXIC +/obj/item/food/meat/slab/goliath/Initialize(mapload) + . = ..() + AddElement(/datum/element/raptor_food, attack_modifier = 0.5, speed_modifier = -0.05, color_chances = string_list(list(/datum/raptor_color/red = 5))) + /obj/item/food/meat/slab/goliath/burn() visible_message(span_notice("[src] finishes cooking!")) new /obj/item/food/meat/steak/goliath(loc) @@ -403,7 +411,7 @@ foodtypes = RAW | MEAT | GORE /obj/item/food/meat/slab/gondola/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/gondola, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/gondola, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/meat/slab/gondola/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/gondola, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe? @@ -420,7 +428,7 @@ /obj/item/food/meat/slab/penguin/make_processable() . = ..() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/penguin, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/penguin, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/meat/slab/penguin/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/penguin, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe? @@ -463,7 +471,7 @@ 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") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/chicken, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/meat/slab/chicken/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/chicken, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) //Add medium rare later maybe? (no this is chicken) @@ -569,6 +577,10 @@ trash_type = null tastes = list("meat" = 1, "rock" = 1) +/obj/item/food/meat/steak/goliath/Initialize(mapload) + . = ..() + AddElement(/datum/element/raptor_food, attack_modifier = 1, speed_modifier = -0.075, color_chances = string_list(list(/datum/raptor_color/red = 7))) + /obj/item/food/meat/steak/gondola name = "gondola steak" tastes = list("meat" = 1, "tranquility" = 1) diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index 97b59fa0475a..afb2f506685c 100644 --- a/code/game/objects/items/food/misc.dm +++ b/code/game/objects/items/food/misc.dm @@ -13,9 +13,11 @@ tastes = list("watermelon" = 1) foodtypes = FRUIT food_flags = FOOD_FINGER_FOOD - juice_typepath = /datum/reagent/consumable/watermelonjuice w_class = WEIGHT_CLASS_SMALL +/obj/item/food/watermelonslice/juice_typepath() + return /datum/reagent/consumable/watermelonjuice + /obj/item/food/watermelonmush name = "watermelon mush" desc = "A plop of watery goodness." @@ -29,9 +31,11 @@ tastes = list("watermelon" = 1) foodtypes = FRUIT food_flags = FOOD_FINGER_FOOD - juice_typepath = /datum/reagent/consumable/watermelonjuice w_class = WEIGHT_CLASS_SMALL +/obj/item/food/watermelonmush/juice_typepath() + return /datum/reagent/consumable/watermelonjuice + /obj/item/food/holymelonslice name = "holymelon slice" desc = "A slice of holy goodness." @@ -45,9 +49,11 @@ tastes = list("holymelon" = 1) foodtypes = FRUIT food_flags = FOOD_FINGER_FOOD - juice_typepath = /datum/reagent/water/holywater w_class = WEIGHT_CLASS_SMALL +/obj/item/food/holymelonslice/juice_typepath() + return /datum/reagent/water/holywater + /obj/item/food/holymelonmush name = "holymelon mush" desc = "A plop of holy goodness." @@ -61,9 +67,11 @@ tastes = list("holymelon" = 1) foodtypes = FRUIT food_flags = FOOD_FINGER_FOOD - juice_typepath = /datum/reagent/water/holywater w_class = WEIGHT_CLASS_SMALL +/obj/item/food/holymelonmush/juice_typepath() + return /datum/reagent/water/holywater + /obj/item/food/barrelmelonslice name = "barrelmelon slice" desc = "A slice of beery goodness." @@ -77,9 +85,11 @@ tastes = list("beer" = 1) foodtypes = FRUIT food_flags = FOOD_FINGER_FOOD - juice_typepath = /datum/reagent/consumable/ethanol/beer w_class = WEIGHT_CLASS_SMALL +/obj/item/food/barrelmelonslice/juice_typepath() + return /datum/reagent/consumable/ethanol/beer + /obj/item/food/barrelmelonmush name = "barrelmelon mush" desc = "A plop of beery goodness." @@ -93,9 +103,10 @@ tastes = list("beer" = 1) foodtypes = FRUIT food_flags = FOOD_FINGER_FOOD - juice_typepath = /datum/reagent/consumable/ethanol/beer w_class = WEIGHT_CLASS_SMALL +/obj/item/food/barrelmelonmush/juice_typepath() + return /datum/reagent/consumable/ethanol/beer /obj/item/food/appleslice name = "apple slice" @@ -110,9 +121,11 @@ tastes = list("apple" = 1) foodtypes = FRUIT food_flags = FOOD_FINGER_FOOD - juice_typepath = /datum/reagent/consumable/applejuice w_class = WEIGHT_CLASS_SMALL +/obj/item/food/appleslice/juice_typepath() + return /datum/reagent/consumable/applejuice + /obj/item/food/hugemushroomslice name = "huge mushroom slice" desc = "A slice from a huge mushroom." @@ -390,7 +403,7 @@ to_chat(user, span_notice("You stick the rod into the stick of butter.")) user.temporarilyRemoveItemFromInventory(src) var/obj/item/food/butter/on_a_stick/new_item = new(drop_location()) - if (user.CanReach(new_item)) + if (new_item.IsReachableBy(user)) user.put_in_hands(new_item) qdel(src) return TRUE @@ -405,7 +418,7 @@ can_stick = FALSE /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") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/butterslice, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/butterslice name = "butter slice" @@ -431,11 +444,13 @@ name = "pineapple slice" desc = "A sliced piece of juicy pineapple." icon_state = "pineapple_slice" - juice_typepath = /datum/reagent/consumable/pineapplejuice tastes = list("pineapple" = 1) foodtypes = FRUIT | PINEAPPLE w_class = WEIGHT_CLASS_TINY +/obj/item/food/pineappleslice/juice_typepath() + return /datum/reagent/consumable/pineapplejuice + /obj/item/food/crab_rangoon name = "crab rangoon" desc = "Has many names, like crab puffs, cheese won'tons, crab dumplings? Whatever you call them, they're a fabulous blast of cream cheesy crab." @@ -619,10 +634,12 @@ /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/juice_typepath() + return /datum/reagent/consumable/pickle + /obj/item/food/pickle/make_edible() . = ..() AddComponentFrom(SOURCE_EDIBLE_INNATE, /datum/component/edible, check_liked = CALLBACK(src, PROC_REF(check_liked))) @@ -849,8 +866,7 @@ /obj/item/food/ink_sac/proc/blind_em(mob/living/victim, can_splat_on) if(can_splat_on) - victim.adjust_temp_blindness_up_to(7 SECONDS, 10 SECONDS) - victim.adjust_confusion_up_to(3.5 SECONDS, 6 SECONDS) - victim.Paralyze(2 SECONDS) //splat! + victim.adjust_temp_blindness_up_to(2.5 SECONDS, 3 SECONDS) + victim.adjust_confusion_up_to(2.5 SECONDS, 3 SECONDS) victim.visible_message(span_warning("[victim] is inked by [src]!"), span_userdanger("You've been inked by [src]!")) playsound(victim, SFX_DESECRATION, 50, TRUE) diff --git a/code/game/objects/items/food/monkeycube.dm b/code/game/objects/items/food/monkeycube.dm index bfb9ccc0f4e0..e2f797918178 100644 --- a/code/game/objects/items/food/monkeycube.dm +++ b/code/game/objects/items/food/monkeycube.dm @@ -31,6 +31,7 @@ var/mob/spammer = get_mob_by_key(fingerprintslast) var/mob/living/bananas = new spawned_mob(drop_location(), TRUE, spammer) // funny that we pass monkey init args to non-monkey mobs, that's totally a future issue if (!QDELETED(bananas)) + ADD_TRAIT(bananas, TRAIT_SPAWNED_MOB, INNATE_TRAIT) if(faction) bananas.faction = faction diff --git a/code/game/objects/items/food/moth.dm b/code/game/objects/items/food/moth.dm index 92587947a6bb..1982690339fd 100644 --- a/code/game/objects/items/food/moth.dm +++ b/code/game/objects/items/food/moth.dm @@ -194,7 +194,7 @@ 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") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/green_lasagne_slice, 6, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/green_lasagne_slice name = "green lasagne al forno slice" @@ -229,8 +229,8 @@ /obj/item/food/big_baked_rice name = "big baked rice" - desc = "A mothic favourite, baked rice can be filled with a variety of vegetable fillings to make a delicious meal to share. \ - Potatoes are also often layered on the bottom of the cooking vessel to create a flavourful crust which is hotly contested amongst diners." + desc = "An iconic favourite, baked rice can be filled with a variety of vegetable fillings to make a delicious meal to share. \ + Potatoes are also often layered on the bottom of the cooking vessel to create a flavourful crust which is hotly contested amongst diners." // DARKPACK EDIT CHANGE icon = 'icons/obj/food/moth.dmi' icon_state = "big_baked_rice" food_reagents = list( diff --git a/code/game/objects/items/food/packaged.dm b/code/game/objects/items/food/packaged.dm index 5b5f45a8d28a..1458c3c101dd 100644 --- a/code/game/objects/items/food/packaged.dm +++ b/code/game/objects/items/food/packaged.dm @@ -166,13 +166,11 @@ splat_color = COLOR_NEARLY_ALL_BLACK, \ hit_callback = CALLBACK(src, PROC_REF(blind_em)), \ ) - ADD_TRAIT(src, TRAIT_UNCATCHABLE, INNATE_TRAIT) //good luck catching the liquid /obj/item/food/canned/squid_ink/proc/blind_em(mob/living/victim, can_splat_on) if(can_splat_on) - victim.adjust_temp_blindness_up_to(7 SECONDS, 10 SECONDS) - victim.adjust_confusion_up_to(3.5 SECONDS, 6 SECONDS) - victim.Paralyze(2 SECONDS) //splat! + victim.adjust_temp_blindness_up_to(2.5 SECONDS, 3 SECONDS) + victim.adjust_confusion_up_to(2.5 SECONDS, 3 SECONDS) victim.visible_message(span_warning("[victim] is inked by [src]!"), span_userdanger("You've been inked by [src]!")) playsound(victim, SFX_DESECRATION, 50, TRUE) diff --git a/code/game/objects/items/food/pastries.dm b/code/game/objects/items/food/pastries.dm index bfb01a76cd72..2b5e56eefd83 100644 --- a/code/game/objects/items/food/pastries.dm +++ b/code/game/objects/items/food/pastries.dm @@ -15,7 +15,7 @@ food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL crafting_complexity = FOOD_COMPLEXITY_2 - custom_price = 1 // DARKPACK EDIT ADD - FOOD + custom_price = 1 // DARKPACK EDIT ADD - ECONOMY /obj/item/food/muffin/berry name = "berry muffin" @@ -471,7 +471,7 @@ 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") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/brownie, 4, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/brownie name = "brownie" @@ -520,7 +520,7 @@ 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") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/peanut_butter_brownie, 4, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/peanut_butter_brownie name = "peanut butter brownie" diff --git a/code/game/objects/items/food/pie.dm b/code/game/objects/items/food/pie.dm index e7535c7ee05c..2e29b2a33451 100644 --- a/code/game/objects/items/food/pie.dm +++ b/code/game/objects/items/food/pie.dm @@ -16,7 +16,7 @@ /obj/item/food/pie/make_processable() if (slice_type) - AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, table_required = TRUE, screentip_verb = "Slice") + AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, table_required = TRUE, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/pieslice name = "pie slice" diff --git a/code/game/objects/items/food/pizza.dm b/code/game/objects/items/food/pizza.dm index 411c76097d51..ab8267e7ea4a 100644 --- a/code/game/objects/items/food/pizza.dm +++ b/code/game/objects/items/food/pizza.dm @@ -73,7 +73,7 @@ . = ..() if(!sliced) return - user.visible_message(span_notice("You take a slice of [src]."), span_notice("[user] takes a slice of [src].")) + user.visible_message(span_notice("[user] takes a slice of [src]."), span_notice("You take a slice of [src].")) produce_slice(user) /obj/item/food/pizza/proc/get_slices_filter() //to not repeat code @@ -134,7 +134,7 @@ 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") + AddElement(/datum/element/processable, TOOL_ROLLINGPIN, /obj/item/stack/sheet/pizza, 1, 1 SECONDS, table_required = TRUE, screentip_verb = "Flatten", sound_to_play = SFX_ROLLING_PIN_ROLLING) /obj/item/food/pizza/margherita name = "pizza margherita" diff --git a/code/game/objects/items/food/sandwichtoast.dm b/code/game/objects/items/food/sandwichtoast.dm index 62d766839a9c..6e92d4013782 100644 --- a/code/game/objects/items/food/sandwichtoast.dm +++ b/code/game/objects/items/food/sandwichtoast.dm @@ -30,9 +30,9 @@ custom_materials = null /obj/item/food/sandwich/cheese/make_grillable() - AddComponent(/datum/component/grillable, /obj/item/food/sandwich/cheese/grilled, rand(30 SECONDS, 60 SECONDS), TRUE) + AddComponent(/datum/component/grillable, /obj/item/food/sandwich/grilled_cheese, rand(30 SECONDS, 60 SECONDS), TRUE) -/obj/item/food/sandwich/cheese/grilled +/obj/item/food/sandwich/grilled_cheese name = "grilled cheese sandwich" desc = "A warm, melty sandwich that goes perfectly with tomato soup." icon_state = "toastedsandwich" @@ -43,8 +43,10 @@ /datum/reagent/carbon = 4, ) tastes = list("toast" = 2, "cheese" = 3, "butter" = 1) + foodtypes = GRAIN | DAIRY venue_value = FOOD_PRICE_NORMAL crafting_complexity = FOOD_COMPLEXITY_3 + custom_materials = null /obj/item/food/sandwich/jelly name = "jelly sandwich" @@ -268,6 +270,7 @@ tastes = list("bread" = 1, "meat" = 1, "tomato sauce" = 1, "death" = 1) foodtypes = MEAT|VEGETABLES|GRAIN eat_time = 4 SECONDS // Makes it harder to force-feed this to people as a weapon, as funny as that is. + custom_materials = list(/datum/material/meat = MEATSLAB_MATERIAL_AMOUNT * 2) var/static/list/correct_clothing = list(/obj/item/clothing/under/rank/civilian/cookjorts, /obj/item/clothing/under/shorts/jeanshorts) /obj/item/food/sandwich/death/Initialize(mapload) diff --git a/code/game/objects/items/food/snacks.dm b/code/game/objects/items/food/snacks.dm index 9da40b24807b..7caf726e8123 100644 --- a/code/game/objects/items/food/snacks.dm +++ b/code/game/objects/items/food/snacks.dm @@ -230,9 +230,11 @@ 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/nutriment/fat/oil = 2) var/safe_for_consumption = TRUE +/obj/item/food/peanuts/grind_results() + return list(/datum/reagent/consumable/peanut_butter = 5, /datum/reagent/consumable/nutriment/fat/oil = 2) + /obj/item/food/peanuts/salted name = "\improper Gallery's salt reserves peanuts" desc = "Tastes salty." @@ -397,7 +399,9 @@ 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/nutriment/fat/oil = 2) + +/obj/item/food/pistachios/grind_results() + return list(/datum/reagent/consumable/peanut_butter = 5, /datum/reagent/consumable/nutriment/fat/oil = 2) /obj/item/food/semki name = "\improper Semki Sunflower Seeds" @@ -538,7 +542,9 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types()) 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/hot_shots/grind_results() + return list(/datum/reagent/consumable/nutriment/fat/oil = 3, /datum/reagent/consumable/caramel = 2) /obj/item/food/sticko name = "\improper Sticko Classic" diff --git a/code/game/objects/items/frog_statue.dm b/code/game/objects/items/frog_statue.dm index d1f65dc4b2ad..8c95ef4951bc 100644 --- a/code/game/objects/items/frog_statue.dm +++ b/code/game/objects/items/frog_statue.dm @@ -96,7 +96,7 @@ return if(contained_frog.stat == DEAD) contained_frog.revive() - contained_frog.adjustBruteLoss(-5) + contained_frog.adjust_brute_loss(-5) /obj/item/frog_statue/proc/animate_filter(mob/living/frog) add_filter(STATUE_FILTER, 2, list("type" = "outline", "color" = FILTER_COLOR, "size" = 1)) @@ -146,7 +146,7 @@ new_frog.name = frog_name /obj/item/frog_contract/proc/select_frog_color(mob/user, mob/living/basic/leaper/new_frog) - var/frog_color = input(user, "Select your frog's color!" , "Pet toad color", COLOR_GREEN) as color|null + var/frog_color = tgui_color_picker(user, "Select your frog's color!" , "Pet toad color", COLOR_GREEN) if(isnull(frog_color)) to_chat(user, span_warning("Please choose a valid color.")) select_frog_color(user, new_frog) diff --git a/code/game/objects/items/gift.dm b/code/game/objects/items/gift.dm index 1843431f3d2a..03fefc39ee18 100644 --- a/code/game/objects/items/gift.dm +++ b/code/game/objects/items/gift.dm @@ -106,6 +106,8 @@ /obj/item/gift/anything name = "christmas gift" desc = "It could be anything!" + /// Weak reference to who this gift is for and who can open it, if that's nobody then anyone can + var/datum/weakref/recipient_ref = null /obj/item/gift/anything/get_gift_type() var/static/list/obj/item/possible_gifts = null @@ -115,3 +117,25 @@ var/gift_type = pick(possible_gifts) return gift_type + +/obj/item/gift/anything/attack_self(mob/user) + if (isnull(recipient_ref)) + return ..() + + var/datum/mind/recipient = recipient_ref.resolve() + if(recipient && recipient != user?.mind) + to_chat(user, span_notice("This gift isn't for you, and you don't want to get on Santa's bad side!")) + return FALSE + return ..() + +/// Assign the mind of someone as the person this gift is for +/obj/item/gift/anything/proc/assign_recipient(datum/mind/recipient) + if (ismob(recipient)) // You're presumably at this point because you are an admin who fucked up but I will save you + var/mob/recipient_mob = recipient + recipient = recipient_mob.mind + + if (isnull(recipient)) + return + + name = "[initial(name)] for [recipient.name] ([recipient.assigned_role.title])" + recipient_ref = WEAKREF(recipient) diff --git a/code/game/objects/items/granters/magic/charge.dm b/code/game/objects/items/granters/magic/charge.dm index 988d17aa13ba..0210227d3b0b 100644 --- a/code/game/objects/items/granters/magic/charge.dm +++ b/code/game/objects/items/granters/magic/charge.dm @@ -17,4 +17,5 @@ /obj/item/book/granter/action/spell/charge/recoil(mob/living/user) . = ..() to_chat(user,span_warning("[src] suddenly feels very warm!")) - empulse(src, 1, 1) + empulse(src, 1, 1, emp_source = src) + diff --git a/code/game/objects/items/granters/martial_arts/cqc.dm b/code/game/objects/items/granters/martial_arts/cqc.dm index 4fff32623c86..4fb39673e9c8 100644 --- a/code/game/objects/items/granters/martial_arts/cqc.dm +++ b/code/game/objects/items/granters/martial_arts/cqc.dm @@ -24,6 +24,6 @@ to_chat(user, span_warning("[src] explodes!")) playsound(src,'sound/effects/explosion/explosion1.ogg',40,TRUE) user.flash_act(1, 1) - user.adjustBruteLoss(6) - user.adjustFireLoss(6) + user.adjust_brute_loss(6) + user.adjust_fire_loss(6) qdel(src) 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 88123439725f..17db0d9ba147 100644 --- a/code/game/objects/items/granters/martial_arts/sleeping_carp.dm +++ b/code/game/objects/items/granters/martial_arts/sleeping_carp.dm @@ -4,8 +4,9 @@ martial_name = "sleeping carp" desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art." greet = span_sciradio("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 Combat 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.") + directed toward you while in Combat Mode. You are also able to sometimes dodge melee and unarmed attacks against you, but only as long as you dress in appropriate martial arts clothing. Or \ + carp-themed clothing. 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/scrolls.dmi' icon_state = "sleepingcarp" worn_icon_state = "scroll" diff --git a/code/game/objects/items/grenades/_grenade.dm b/code/game/objects/items/grenades/_grenade.dm index 262a493cc753..11e7f3683e28 100644 --- a/code/game/objects/items/grenades/_grenade.dm +++ b/code/game/objects/items/grenades/_grenade.dm @@ -180,6 +180,13 @@ update_appearance() return FALSE + for(var/obj/effect/forcefield/cosmic_field/potential_field as anything in GLOB.active_cosmic_fields) + if(get_dist(potential_field, src) < 3) + new /obj/effect/temp_visual/revenant(get_turf(src)) + active = FALSE + update_appearance() + return FALSE + dud_flags |= GRENADE_USED // Don't detonate if we have already detonated. if(shrapnel_type && shrapnel_radius && !shrapnel_initialized) // add a second check for adding the component in case whatever triggered the grenade went straight to prime (badminnery for example) shrapnel_initialized = TRUE diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index 98b7edf19ae2..b5780ea8406a 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -6,6 +6,7 @@ inhand_icon_state = "flashbang" w_class = WEIGHT_CLASS_SMALL force = 2 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) /// Which stage of construction this grenade is currently at. var/stage = GRENADE_EMPTY /// The set of reagent containers that have been added to this grenade casing. diff --git a/code/game/objects/items/grenades/clusterbuster.dm b/code/game/objects/items/grenades/clusterbuster.dm index 33f0c8774836..13ceb593cc02 100644 --- a/code/game/objects/items/grenades/clusterbuster.dm +++ b/code/game/objects/items/grenades/clusterbuster.dm @@ -106,25 +106,12 @@ /obj/effect/payload_spawner/random_slime/volatile volatile = TRUE -/obj/item/slime_extract/proc/activate_slime() - var/list/slime_chems = src.activate_reagents - if(!QDELETED(src)) - var/chem = pick(slime_chems) - var/amount = 5 - if(chem == "lesser plasma") //In the rare case we get another rainbow. - chem = /datum/reagent/toxin/plasma - amount = 4 - if(chem == "holy water and uranium") - chem = /datum/reagent/uranium - reagents.add_reagent(/datum/reagent/water/holywater) - reagents.add_reagent(chem, amount) - /obj/effect/payload_spawner/random_slime/spawn_payload(type, numspawned) for(var/_ in 1 to numspawned) var/chosen = pick(subtypesof(/obj/item/slime_extract)) var/obj/item/slime_extract/slime_extract = new chosen(loc) if(volatile) - addtimer(CALLBACK(slime_extract, TYPE_PROC_REF(/obj/item/slime_extract, activate_slime)), rand(RANDOM_DETONATE_MIN_TIME, RANDOM_DETONATE_MAX_TIME)) + addtimer(CALLBACK(slime_extract, TYPE_PROC_REF(/obj/item/slime_extract, auto_activate_reaction)), rand(RANDOM_DETONATE_MIN_TIME, RANDOM_DETONATE_MAX_TIME)) var/steps = rand(1, 4) for(var/step in 1 to steps) step_away(src, loc) diff --git a/code/game/objects/items/grenades/emgrenade.dm b/code/game/objects/items/grenades/emgrenade.dm index 4f3b9d2e4849..295faeb98097 100644 --- a/code/game/objects/items/grenades/emgrenade.dm +++ b/code/game/objects/items/grenades/emgrenade.dm @@ -8,7 +8,6 @@ . = ..() if(!.) return - update_mob() - empulse(src, 4, 10) + empulse(src, 4, 10, emp_source = src) qdel(src) diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index 41d370d7bdd8..cf7c11ade6a7 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -32,24 +32,30 @@ return update_mob() - var/flashbang_turf = get_turf(src) + var/turf/flashbang_turf = get_turf(src) if(!flashbang_turf) return + + //Check that there's enough pressure on the detonation turf for the 'bang' part of the flashbang to work. + var/datum/gas_mixture/environment = flashbang_turf.return_air() + var/pressure = environment?.return_pressure() + var/soundbang = pressure >= SOUND_MINIMUM_PRESSURE + do_sparks(rand(5, 9), FALSE, src) playsound(flashbang_turf, 'sound/items/weapons/flashbang.ogg', 100, TRUE, 8, 0.9) new /obj/effect/dummy/lighting_obj (flashbang_turf, flashbang_range + 2, 4, COLOR_WHITE, 2) for(var/mob/living/living_mob in get_hearers_in_view(flashbang_range, flashbang_turf)) - bang(get_turf(living_mob), living_mob) + bang(get_turf(living_mob), living_mob, soundbang) qdel(src) -/obj/item/grenade/flashbang/proc/bang(turf/turf, mob/living/living_mob) +/obj/item/grenade/flashbang/proc/bang(turf/turf, mob/living/living_mob, soundbang = TRUE) if(living_mob.stat == DEAD) //They're dead! return living_mob.show_message(span_warning("BANG"), MSG_AUDIBLE) - var/distance = max(0, get_dist(get_turf(src), turf)) + var/distance = get_dist(get_turf(src), turf) var/sweetspot_range = clamp(CEILING(flashbang_range/sweetspot_divider, 1), 0, flashbang_range) -//Flash + //Flash var/attempt_flash = living_mob.flash_act(affect_silicon = 1) if(attempt_flash == FLASH_COMPLETED) if(distance <= sweetspot_range || issilicon(living_mob)) @@ -60,20 +66,23 @@ living_mob.dropItemToGround(living_mob.get_active_held_item()) living_mob.dropItemToGround(living_mob.get_inactive_held_item()) -//Bang - if(!distance || loc == living_mob || loc == living_mob.loc) - living_mob.soundbang_act(2, 20 SECONDS, 10, 15) + //Bang + if(!soundbang && distance) + return + + if(!distance) + living_mob.soundbang_act(SOUNDBANG_OVERWHELMING, 20 SECONDS, 10, 15) return if(distance <= 1) // Adds more stun as to not prime n' pull (#45381) - living_mob.soundbang_act(2, 3 SECONDS, 5) + living_mob.soundbang_act(SOUNDBANG_STRONG, 3 SECONDS, 5) return if(distance <= sweetspot_range) - living_mob.soundbang_act(1, max(200 / max(1, distance), 60), rand(0, 5)) + living_mob.soundbang_act(SOUNDBANG_NORMAL, max(20 SECONDS / max(1, distance), 60), rand(0, 5)) return - if(!living_mob.soundbang_act(1, 0, rand(0, 2))) + if(!living_mob.soundbang_act(SOUNDBANG_NORMAL, 0, rand(0, 2))) return living_mob.adjust_staggered_up_to(max(200/max(1, distance), 5), 10 SECONDS) @@ -133,17 +142,17 @@ if(living_mob.stat == DEAD) //They're dead! return living_mob.show_message(span_warning("POP"), MSG_AUDIBLE) - var/distance = max(0, get_dist(get_turf(src), turf)) + var/distance = get_dist(get_turf(src), turf) //Flash if(living_mob.flash_act(affect_silicon = 1)) living_mob.Paralyze(max(10/max(1, distance), 5)) living_mob.Knockdown(max(100/max(1, distance), 60)) //Bang - 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) + if(!distance) + living_mob.Paralyze(2 SECONDS) + living_mob.Knockdown(20 SECONDS) + living_mob.soundbang_act(SOUNDBANG_NORMAL, 200, 10, 15) if(living_mob.apply_damages(brute = 10, burn = 10)) to_chat(living_mob, span_userdanger("The blast from \the [src] bruises and burns you!")) diff --git a/code/game/objects/items/grenades/ghettobomb.dm b/code/game/objects/items/grenades/ghettobomb.dm index 1a7dc6f4fffc..dec21fdc1f4c 100644 --- a/code/game/objects/items/grenades/ghettobomb.dm +++ b/code/game/objects/items/grenades/ghettobomb.dm @@ -16,6 +16,7 @@ shrapnel_type = /obj/projectile/bullet/shrapnel/ied det_time = 225 SECONDS //this is handled by assemblies now display_timer = FALSE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.65, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2) /// Explosive power var/power = 5 /// Our assembly that when activated causes us to explode diff --git a/code/game/objects/items/grenades/hypno.dm b/code/game/objects/items/grenades/hypno.dm index d77049419abc..13bdf7351ab4 100644 --- a/code/game/objects/items/grenades/hypno.dm +++ b/code/game/objects/items/grenades/hypno.dm @@ -32,46 +32,38 @@ /obj/item/grenade/hypnotic/proc/bang(turf/turf, mob/living/living_mob) if(living_mob.stat == DEAD) //They're dead! return - var/distance = max(0, get_dist(get_turf(src), turf)) + var/distance = get_dist(get_turf(src), turf) //Bang var/hypno_sound = FALSE //Hearing protection check - if(iscarbon(living_mob)) - var/mob/living/carbon/target = living_mob - var/list/reflist = list(1) - SEND_SIGNAL(target, COMSIG_CARBON_SOUNDBANG, reflist) - var/intensity = reflist[1] - var/ear_safety = target.get_ear_protection() - var/effect_amount = intensity - ear_safety - if(effect_amount > 0) - hypno_sound = TRUE + if(living_mob.get_ear_protection() < 0) + hypno_sound = TRUE - if(!distance || loc == living_mob || loc == living_mob.loc) - living_mob.Paralyze(10) - living_mob.Knockdown(100) + if(!distance) + living_mob.Paralyze(1 SECONDS) + living_mob.Knockdown(10 SECONDS) to_chat(living_mob, span_hypnophrase("The sound echoes in your brain...")) living_mob.adjust_hallucinations(150 SECONDS) else if(distance <= 1) - living_mob.Paralyze(5) - living_mob.Knockdown(30) + living_mob.Paralyze(0.5 SECONDS) + living_mob.Knockdown(3 SECONDS) if(hypno_sound) to_chat(living_mob, span_hypnophrase("The sound echoes in your brain...")) living_mob.adjust_hallucinations(150 SECONDS) //Flash - if(living_mob.flash_act(affect_silicon = 1)) - living_mob.Paralyze(max(10/max(1, distance), 5)) - living_mob.Knockdown(max(100/max(1, distance), 40)) - if(iscarbon(living_mob)) - var/mob/living/carbon/target = living_mob - if(target.hypnosis_vulnerable()) //The sound causes the necessary conditions unless the target has mindshield or hearing protection - target.apply_status_effect(/datum/status_effect/trance, 100, TRUE) - else - to_chat(target, span_hypnophrase("The light is so pretty...")) - target.adjust_drowsiness_up_to(20 SECONDS, 40 SECONDS) - target.adjust_confusion_up_to(10 SECONDS, 20 SECONDS) - target.adjust_dizzy_up_to(20 SECONDS, 40 SECONDS) + if(!living_mob.flash_act(affect_silicon = TRUE)) + return + living_mob.Paralyze(max(1 SECONDS / (distance || 1), 0.5 SECONDS)) + living_mob.Knockdown(max(10 SECONDS / (distance || 1), 4 SECONDS)) + if(living_mob.hypnosis_vulnerable()) //The sound causes the necessary conditions unless the target has mindshield or hearing protection + living_mob.apply_status_effect(/datum/status_effect/trance, 10 SECONDS, TRUE) + return + to_chat(living_mob, span_hypnophrase("The light is so pretty...")) + living_mob.adjust_drowsiness_up_to(20 SECONDS, 40 SECONDS) + living_mob.adjust_confusion_up_to(10 SECONDS, 20 SECONDS) + living_mob.adjust_dizzy_up_to(20 SECONDS, 40 SECONDS) diff --git a/code/game/objects/items/grenades/spawnergrenade.dm b/code/game/objects/items/grenades/spawnergrenade.dm index e479d7d818a0..0c7962675788 100644 --- a/code/game/objects/items/grenades/spawnergrenade.dm +++ b/code/game/objects/items/grenades/spawnergrenade.dm @@ -29,6 +29,8 @@ // Spawn some hostile syndicate critters and spread them out var/list/spawned = spawn_and_random_walk(spawner_type, target_turf, deliveryamt, walk_chance = 50, admin_spawn = ((flags_1 & ADMIN_SPAWNED_1) ? TRUE : FALSE)) afterspawn(spawned) + for(var/mob/living/created as anything in spawned) + ADD_TRAIT(created, TRAIT_SPAWNED_MOB, INNATE_TRAIT) qdel(src) diff --git a/code/game/objects/items/grenades/syndieminibomb.dm b/code/game/objects/items/grenades/syndieminibomb.dm index 6e874f9d864b..02fb27777bcd 100644 --- a/code/game/objects/items/grenades/syndieminibomb.dm +++ b/code/game/objects/items/grenades/syndieminibomb.dm @@ -73,6 +73,6 @@ for (var/turf/open/floor/floor in view(freeze_range, loc)) floor.MakeSlippery(TURF_WET_PERMAFROST, 6 MINUTES) for(var/mob/living/carbon/victim in floor) - victim.adjustStaminaLoss(stamina_damage) + victim.adjust_stamina_loss(stamina_damage) victim.adjust_bodytemperature(temp_adjust) qdel(src) diff --git a/code/game/objects/items/gun_maintenance.dm b/code/game/objects/items/gun_maintenance.dm index 77ba80352910..d580d37fe253 100644 --- a/code/game/objects/items/gun_maintenance.dm +++ b/code/game/objects/items/gun_maintenance.dm @@ -14,6 +14,7 @@ w_class = WEIGHT_CLASS_BULKY drop_sound = 'sound/items/handling/ammobox_drop.ogg' pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6) /// How many times we can use this maintenance kit to maintain a gun var/uses = 3 /// THe maximum uses, used for our examine text. diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index ca6aee647f02..1e5ef4bd23e9 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -128,11 +128,11 @@ to_chat(user, span_warning("You can't bring yourself to noogie [target]! You don't want to risk harming anyone...")) return - if(!(target?.get_bodypart(BODY_ZONE_HEAD)) || user.pulling != target || user.grab_state < GRAB_AGGRESSIVE || user.getStaminaLoss() > 80) + if(!(target?.get_bodypart(BODY_ZONE_HEAD)) || user.pulling != target || user.grab_state < GRAB_AGGRESSIVE || user.get_stamina_loss() > 80) return FALSE var/obj/item/bodypart/head/the_head = target.get_bodypart(BODY_ZONE_HEAD) - if(!(the_head.biological_state & BIO_FLESH)) + if(!(the_head.biological_state & (BIO_FLESH|BIO_CHITIN))) to_chat(user, span_warning("You can't noogie [target], [target.p_they()] [target.p_have()] no skin on [target.p_their()] head!")) return @@ -174,7 +174,7 @@ if(!(target?.get_bodypart(BODY_ZONE_HEAD)) || user.pulling != target) return FALSE - if(user.getStaminaLoss() > 80) + if(user.get_stamina_loss() > 80) to_chat(user, span_warning("You're too tired to continue giving [target] a noogie!")) to_chat(target, span_danger("[user] is too tired to continue giving you a noogie!")) return @@ -190,7 +190,7 @@ log_combat(user, target, "given a noogie to", addition = "([damage] brute before armor)") target.apply_damage(damage, BRUTE, BODY_ZONE_HEAD) - user.adjustStaminaLoss(iteration + 5) + user.adjust_stamina_loss(iteration + 5) playsound(get_turf(user), SFX_RUSTLE, 50) if(prob(33)) @@ -245,7 +245,7 @@ shake_camera(slapped, 2, 2) slapped.Paralyze(2.5 SECONDS) slapped.adjust_confusion(7 SECONDS) - slapped.adjustStaminaLoss(40) + slapped.adjust_stamina_loss(40) else if(user.zone_selected == BODY_ZONE_HEAD || user.zone_selected == BODY_ZONE_PRECISE_MOUTH) if(user == slapped) user.visible_message( diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 328552a28f08..cd986a7e4517 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -55,17 +55,16 @@ ///How long it takes to handcuff someone var/handcuff_time = 4 SECONDS - ///Multiplier for handcuff time - var/handcuff_time_mod = 1 ///Sound that plays when starting to put handcuffs on someone var/cuffsound = 'sound/items/weapons/handcuffs.ogg' ///Sound that plays when restrain is successful var/cuffsuccesssound = 'sound/items/handcuff_finish.ogg' - ///If set, handcuffs will be destroyed on application and leave behind whatever this is set to. - var/trashtype = null /// How strong the cuffs are. Weak cuffs can be broken with wirecutters or boxcutters. var/restraint_strength = HANDCUFFS_TYPE_STRONG + /// Is this pair of cuff being actually used? + var/used = FALSE + /obj/item/restraints/handcuffs/apply_fantasy_bonuses(bonus) . = ..() handcuff_time = modify_fantasy_variable("handcuff_time", handcuff_time, -bonus * 2, minimum = 0.3 SECONDS) @@ -79,7 +78,7 @@ acid = 50 /obj/item/restraints/handcuffs/attack(mob/living/target_mob, mob/living/user) - if(!iscarbon(target_mob)) + if(!iscarbon(target_mob) || used) return attempt_to_cuff(target_mob, user) @@ -90,9 +89,7 @@ victim.balloon_alert(user, "can't be handcuffed!") return - if(iscarbon(user) && (HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))) //Clumsy people have a 50% chance to handcuff themselves instead of their target. - to_chat(user, span_warning("Uh... how do those things work?!")) - apply_cuffs(user, user) + if(handcuffs_clumsiness_check(user)) return if(!isnull(victim.handcuffed)) @@ -114,12 +111,7 @@ playsound(loc, cuffsound, 30, TRUE, -2) log_combat(user, victim, "attempted to handcuff") - if(HAS_TRAIT(user, TRAIT_FAST_CUFFING)) - handcuff_time_mod = 0.75 - else - handcuff_time_mod = 1 - - if(!do_after(user, handcuff_time * handcuff_time_mod, victim, timed_action_flags = IGNORE_SLOWDOWNS) || !victim.canBeHandcuffed()) + if(!do_after(user, get_handcuff_time(user), victim, timed_action_flags = IGNORE_SLOWDOWNS) || !victim.canBeHandcuffed()) victim.balloon_alert(user, "failed to handcuff!") to_chat(user, span_warning("You fail to handcuff [victim]!")) log_combat(user, victim, "failed to handcuff") @@ -136,7 +128,16 @@ log_combat(user, victim, "successfully handcuffed") SSblackbox.record_feedback("tally", "handcuffs", 1, type) +///Return the amount of time the user would spend cuffing someone or something +/obj/item/restraints/handcuffs/proc/get_handcuff_time(mob/user) + return handcuff_time * (HAS_TRAIT(user, TRAIT_FAST_CUFFING) ? 0.75 : 1) +/obj/item/restraints/handcuffs/proc/handcuffs_clumsiness_check(mob/user) + if(!iscarbon(user) || !HAS_TRAIT(user, TRAIT_CLUMSY) || prob(50)) //Clumsy people have a 50% chance to handcuff themselves instead of their target. + return FALSE + to_chat(user, span_warning("Uh... how do those things work?!")) + apply_cuffs(user, user) + return TRUE /** * When called, this instantly puts handcuffs on someone (if actually possible) * @@ -153,16 +154,24 @@ return var/obj/item/restraints/handcuffs/cuffs = src - if(trashtype) - cuffs = new trashtype() - else if(dispense) + if(dispense) cuffs = new type() target.equip_to_slot(cuffs, ITEM_SLOT_HANDCUFFED) - if(trashtype && !dispense) + if(dispense) qdel(src) +/obj/item/restraints/handcuffs/equipped(mob/living/user, slot) + . = ..() + if(slot == ITEM_SLOT_HANDCUFFED) + RegisterSignal(src, COMSIG_ITEM_DROPPED, PROC_REF(on_uncuffed)) //Make sure zipties are no longer usable the next time someone removes them + +/obj/item/restraints/handcuffs/proc/on_uncuffed(datum/source, mob/living/wearer) + SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) + UnregisterSignal(src, COMSIG_ITEM_DROPPED) + /** * # Alien handcuffs * @@ -199,7 +208,7 @@ var/cable_color = CABLE_COLOR_RED lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 1.5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 0.75) + custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 1.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.5) breakouttime = 30 SECONDS cuffsound = 'sound/items/weapons/cablecuff.ogg' pickup_sound = null @@ -342,10 +351,15 @@ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' custom_materials = null breakouttime = 45 SECONDS - trashtype = /obj/item/restraints/handcuffs/cable/zipties/used color = null cable_color = null +/obj/item/restraints/handcuffs/cable/zipties/on_uncuffed(datum/source, mob/living/wearer) + . = ..() + desc = "A pair of broken zipties." + icon_state = "cuff_used" + used = TRUE + /** * # Used zipties * @@ -354,9 +368,7 @@ /obj/item/restraints/handcuffs/cable/zipties/used desc = "A pair of broken zipties." icon_state = "cuff_used" - -/obj/item/restraints/handcuffs/cable/zipties/used/attack() - return + used = TRUE /** * # Fake Zipties @@ -372,6 +384,21 @@ /obj/item/restraints/handcuffs/cable/zipties/fake/used desc = "A pair of broken fake zipties." icon_state = "cuff_used" + used = TRUE + +///handcuffs applied by cult magic and heretics sacrifice +/obj/item/restraints/handcuffs/cult + name = "shadow shackles" + desc = "Shackles that bind the wrists with sinister magic." + breakouttime = 45 SECONDS + icon_state = "cult_shackles" + flags_1 = NONE + +/obj/item/restraints/handcuffs/cult/on_uncuffed(datum/source, mob/living/wearer) + . = ..() + wearer.visible_message(span_danger("[wearer]'s shackles shatter in a discharge of dark magic!"), span_userdanger("Your [src] shatters in a discharge of dark magic!")) + qdel(src) + /** * # Generic leg cuffs @@ -545,6 +572,7 @@ righthand_file = 'icons/mob/inhands/weapons/thrown_righthand.dmi' breakouttime = 3.5 SECONDS//easy to apply, easy to break out of gender = NEUTER + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6.1, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.5) ///Amount of time to knock the target down for once it's hit in deciseconds. var/knockdown = 0 ///Reference of the mob we will attempt to snare @@ -597,6 +625,7 @@ inhand_icon_state = "bola_r" breakouttime = 7 SECONDS knockdown = 3.5 SECONDS + custom_materials = list(/datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 6.1, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.7) /** * A security variant of the bola. @@ -612,6 +641,7 @@ w_class = WEIGHT_CLASS_SMALL breakouttime = 6 SECONDS custom_price = PAYCHECK_COMMAND * 0.35 + custom_materials = null /obj/item/restraints/legcuffs/bola/energy/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index 367aba1e8643..e9e49d0c6f24 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -157,7 +157,7 @@ master.remove_status_effect(/datum/status_effect/his_grace) REMOVE_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT) master.Paralyze(60) - master.adjustBruteLoss(master.maxHealth) + master.adjust_brute_loss(master.maxHealth) playsound(master, 'sound/effects/splat.ogg', 100, FALSE) else master.apply_status_effect(/datum/status_effect/his_grace,gender) @@ -181,7 +181,7 @@ do_attack_animation(L, null, src) playsound(L, 'sound/items/weapons/smash.ogg', 50, TRUE) playsound(L, 'sound/effects/desecration/desecration-01.ogg', 50, TRUE) - L.adjustBruteLoss(force) + L.adjust_brute_loss(force) adjust_bloodthirst(-5) //Don't stop attacking they're right there! else consume(L) @@ -235,7 +235,7 @@ return var/victims = 0 meal.visible_message(span_warning("[src] swings open and devours [meal]!"), "[src] consumes you!") - meal.adjustBruteLoss(200) + meal.adjust_brute_loss(200) playsound(meal, 'sound/effects/desecration/desecration-02.ogg', 75, TRUE) playsound(src, 'sound/items/eatfood.ogg', 100, TRUE) meal.forceMove(src) diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index 23db75e850c6..6e46cdb2a4df 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -13,6 +13,9 @@ throw_speed = 3 throw_range = 7 item_flags = NOBLUDGEON + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP var/list/signs var/max_signs = 10 //time to create a holosign in deciseconds. diff --git a/code/game/objects/items/implants/implant_explosive.dm b/code/game/objects/items/implants/implant_explosive.dm index 1714010ae036..832eca03a786 100644 --- a/code/game/objects/items/implants/implant_explosive.dm +++ b/code/game/objects/items/implants/implant_explosive.dm @@ -143,16 +143,13 @@ if(imp_in && !imp_in.stat && !no_paralyze) imp_in.visible_message(span_warning("[imp_in] doubles over in pain!")) 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(var/index in 1 to 3) // Total of 4 bomb beeps, and we've already beeped once //for extra spice - var/beep_volume = 35 + var/beep_volume = 30 + (5 * index) 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) @@ -166,9 +163,9 @@ ///When called, just explodes /obj/item/implant/explosive/proc/explode(atom/override_explode_target = null) - explosion_devastate = round(explosion_devastate) - explosion_heavy = round(explosion_heavy) - explosion_light = round(explosion_light) + explosion_devastate = floor(explosion_devastate) + explosion_heavy = floor(explosion_heavy) + explosion_light = floor(explosion_light) explosion(override_explode_target || 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) var/mob/living/kill_mob = isliving(override_explode_target) ? override_explode_target : imp_in if(!isnull(kill_mob)) diff --git a/code/game/objects/items/implants/implant_kaza_ruk.dm b/code/game/objects/items/implants/implant_kaza_ruk.dm new file mode 100644 index 000000000000..ce26fb1b678b --- /dev/null +++ b/code/game/objects/items/implants/implant_kaza_ruk.dm @@ -0,0 +1,41 @@ +/obj/item/implant/kaza_ruk + name = "kaza ruk implant" + desc = "Teaches you the Tiziran martial arts of Kaza Ruk in 5 short instructional videos beamed directly into your eyeballs." + icon = 'icons/obj/scrolls.dmi' + icon_state ="scroll2" + /// The martial art style this implant teaches. + var/datum/martial_art/kaza_ruk/style + +/obj/item/implant/kaza_ruk/get_data() + var/dat = {"Implant Specifications:
+ Name: Kaza Ruk Implant
+ Life: 4 hours after death of host
+ Implant Details:
+ Function: Teaches even the clumsiest host the arts of Kaza Ruk."} + return dat + +/obj/item/implant/kaza_ruk/Initialize(mapload) + . = ..() + style = new(src) + +/obj/item/implant/kaza_ruk/Destroy() + QDEL_NULL(style) + return ..() + +/obj/item/implant/kaza_ruk/activate() + . = ..() + if(isnull(imp_in.mind)) + return + if(style.unlearn(imp_in)) + return + + style.teach(imp_in) + +/obj/item/implanter/kaza_ruk + name = "implanter (kaza ruk)" + imp_type = /obj/item/implant/kaza_ruk + +/obj/item/implantcase/kaza_ruk + name = "implant case - 'Kaza Ruk'" + desc = "A glass case containing an implant that can teach the user the Tiziran martial arts of Kaza Ruk." + imp_type = /obj/item/implant/kaza_ruk diff --git a/code/game/objects/items/implants/implant_krav_maga.dm b/code/game/objects/items/implants/implant_krav_maga.dm deleted file mode 100644 index 5dd821a683d6..000000000000 --- a/code/game/objects/items/implants/implant_krav_maga.dm +++ /dev/null @@ -1,41 +0,0 @@ -/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/scrolls.dmi' - icon_state ="scroll2" - /// The martial art style this implant teaches. - var/datum/martial_art/krav_maga/style - -/obj/item/implant/krav_maga/get_data() - var/dat = {"Implant Specifications:
- Name: Krav Maga Implant
- Life: 4 hours after death of host
- Implant Details:
- Function: Teaches even the clumsiest host the arts of Krav Maga."} - return dat - -/obj/item/implant/krav_maga/Initialize(mapload) - . = ..() - style = new(src) - -/obj/item/implant/krav_maga/Destroy() - QDEL_NULL(style) - return ..() - -/obj/item/implant/krav_maga/activate() - . = ..() - if(isnull(imp_in.mind)) - return - if(style.unlearn(imp_in)) - return - - style.teach(imp_in) - -/obj/item/implanter/krav_maga - name = "implanter (krav maga)" - imp_type = /obj/item/implant/krav_maga - -/obj/item/implantcase/krav_maga - name = "implant case - 'Krav Maga'" - desc = "A glass case containing an implant that can teach the user the arts of Krav Maga." - imp_type = /obj/item/implant/krav_maga diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index ceccbe1b729e..6e053a1a44b4 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -20,7 +20,7 @@ /obj/item/implant/emp/activate() . = ..() uses-- - empulse(imp_in, 3, 5) + empulse(imp_in, 3, 5, emp_source = src) if(!uses) qdel(src) diff --git a/code/game/objects/items/implants/implantcase.dm b/code/game/objects/items/implants/implantcase.dm index 87fca49be899..d034bc47f15e 100644 --- a/code/game/objects/items/implants/implantcase.dm +++ b/code/game/objects/items/implants/implantcase.dm @@ -13,6 +13,7 @@ throw_range = 5 w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/glass= SMALL_MATERIAL_AMOUNT * 5) + obj_flags = UNIQUE_RENAME | RENAME_NO_DESC ///the implant within the case var/obj/item/implant/imp = null ///Type of implant this will spawn as imp upon being spawned @@ -36,18 +37,7 @@ return ..() /obj/item/implantcase/attackby(obj/item/used_item, mob/living/user, list/modifiers, list/attack_modifiers) - if(IS_WRITING_UTENSIL(used_item)) - if(!user.can_write(used_item)) - return - var/new_name = tgui_input_text(user, "What would you like the label to be?", name, max_length = MAX_NAME_LEN) - if((user.get_active_held_item() != used_item) || !user.can_perform_action(src)) - return - if(new_name) - playsound(src, SFX_WRITING_PEN, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, SOUND_FALLOFF_EXPONENT + 3, ignore_walls = FALSE) - name = "implant case - '[new_name]'" - else - name = "implant case" - else if(istype(used_item, /obj/item/implanter)) + if(istype(used_item, /obj/item/implanter)) var/obj/item/implanter/used_implanter = used_item if(used_implanter.imp && !imp) //implanter to case implant transfer @@ -68,6 +58,8 @@ else return ..() +/obj/item/implantcase/nameformat(input, user) + return "implant case[input? " - '[input]'" : null]" ///An implant case that spawns with a tracking implant, as well as an appropriate name and description. /obj/item/implantcase/tracking diff --git a/code/game/objects/items/implants/implanter.dm b/code/game/objects/items/implants/implanter.dm index 5d249d95587a..971365abea4f 100644 --- a/code/game/objects/items/implants/implanter.dm +++ b/code/game/objects/items/implants/implanter.dm @@ -12,6 +12,7 @@ throw_speed = 3 throw_range = 5 w_class = WEIGHT_CLASS_SMALL + obj_flags = UNIQUE_RENAME | RENAME_NO_DESC custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT * 6, /datum/material/glass=SMALL_MATERIAL_AMOUNT *2) ///The implant in our implanter var/obj/item/implant/imp = null @@ -44,24 +45,11 @@ else to_chat(user, span_warning("[src] fails to implant [target].")) -/obj/item/implanter/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) - if(IS_WRITING_UTENSIL(I)) - return ..() - if(!user.can_write(I)) - return - - var/new_name = tgui_input_text(user, "What would you like the label to be?", name, max_length = MAX_NAME_LEN) - if(user.get_active_held_item() != I) - return - if(!user.can_perform_action(src)) - return - if(new_name) - name = "implanter ([new_name])" - else - name = "implanter" - /obj/item/implanter/Initialize(mapload) . = ..() if(!imp && imp_type) imp = new imp_type(src) update_appearance() + +/obj/item/implanter/nameformat(input, user) + return "implanter[input? " ([input])" : null]" diff --git a/code/game/objects/items/implants/security/implant_chem.dm b/code/game/objects/items/implants/security/implant_chem.dm index 178dfcae2a60..d957100ce700 100644 --- a/code/game/objects/items/implants/security/implant_chem.dm +++ b/code/game/objects/items/implants/security/implant_chem.dm @@ -95,9 +95,7 @@ desc = "A glass case containing a remote chemical implant." imp_type = /obj/item/implant/chem -/obj/item/implantcase/chem/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(istype(W, /obj/item/reagent_containers/syringe) && imp) - W.interact_with_atom(imp, user, modifiers) - return TRUE - else - return ..() +/obj/item/implantcase/chem/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/reagent_containers/syringe) && imp) + return NONE + return tool.interact_with_atom(imp, user, modifiers) diff --git a/code/game/objects/items/inspector.dm b/code/game/objects/items/inspector.dm index d0feef1471e9..56e63994c223 100644 --- a/code/game/objects/items/inspector.dm +++ b/code/game/objects/items/inspector.dm @@ -22,6 +22,9 @@ interaction_flags_click = NEED_DEXTERITY throw_range = 1 throw_speed = 1 + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP ///How long it takes to print on time each mode, ordered NORMAL, FAST, HONK var/list/time_list = list(5 SECONDS, 1 SECONDS, 0.1 SECONDS) ///Which print time mode we're on. @@ -333,6 +336,7 @@ icon_state = "bananium_inspector" w_class = WEIGHT_CLASS_SMALL max_mode = BANANIUM_CLOWN_INSPECTOR_PRINT_SOUND_MODE_LAST + custom_materials = list(/datum/material/bananium = SHEET_MATERIAL_AMOUNT * 5) ///How many more times can we print? var/paper_charges = 32 ///Max value of paper_charges @@ -455,18 +459,22 @@ * If it is ground, it will turn into 5u water. */ /obj/item/paper/fake_report/water - grind_results = list(/datum/reagent/water = 5) interaction_flags_click = NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING +/obj/item/paper/fake_report/water/grind_results() + return list(/datum/reagent/water = 5) + /obj/item/paper/fake_report/water/click_alt(mob/living/user) var/datum/action/innate/origami/origami_action = locate() in user.actions if(origami_action?.active) //Origami masters can fold water make_plane(user, /obj/item/paperplane/syndicate) - else if(do_after(user, 1 SECONDS, target = src, progress=TRUE)) - var/turf/open/target = get_turf(src) - target.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS) - to_chat(user, span_notice("As you try to fold [src] into the shape of a plane, it disintegrates into water!")) - qdel(src) + return CLICK_ACTION_SUCCESS + if(!do_after(user, 1 SECONDS, target = src, progress=TRUE)) + return CLICK_ACTION_BLOCKING + var/turf/open/target = get_turf(src) + target.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS) + to_chat(user, span_notice("As you try to fold [src] into the shape of a plane, it disintegrates into water!")) + qdel(src) return CLICK_ACTION_SUCCESS #undef ENERGY_TO_SPEAK diff --git a/code/game/objects/items/kirby_plants/kirbyplants.dm b/code/game/objects/items/kirby_plants/kirbyplants.dm index d0d5b179adc4..08989ccb3636 100644 --- a/code/game/objects/items/kirby_plants/kirbyplants.dm +++ b/code/game/objects/items/kirby_plants/kirbyplants.dm @@ -1,6 +1,6 @@ /obj/item/kirbyplants name = "potted plant" - icon = 'icons/obj/fluff/flora/plants.dmi' + icon = 'modular_darkpack/master_files/icons/obj/fluff/flora/plants.dmi' // DARKPACK EDIT CHANGE icon_state = "plant-01" base_icon_state = "plant-01" desc = "A little bit of nature contained in a pot." @@ -11,6 +11,8 @@ throw_speed = 2 throw_range = 4 item_flags = NO_PIXEL_RANDOM_DROP + drop_sound = SFX_POTTED_PLANT_DROP + pickup_sound = SFX_POTTED_PLANT_PICKUP /// Can this plant be trimmed by someone with TRAIT_BONSAI var/trimmable = TRUE @@ -19,6 +21,7 @@ ///If it's a special named plant, set this to true to prevent dead-name overriding. var/custom_plant_name = FALSE var/static/list/random_plant_states + var/static/list/random_darkpack_states // DARKPACK EDIT ADD /obj/item/kirbyplants/Initialize(mapload) . = ..() @@ -176,3 +179,45 @@ /obj/item/kirbyplants/fern/Initialize(mapload) . = ..() AddElement(/datum/element/swabable, CELL_LINE_TABLE_ALGAE, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 5) + +// DARKPACK EDIT ADD START +/obj/item/kirbyplants/darkpack + icon_state = "plant0" + base_icon_state = "plant0" + +/obj/item/kirbyplants/darkpack/generate_states() + var/list/plant_states = list() + for(var/i in 1 to 5) + var/number = "[i]" + plant_states += "plant[number]" + + return plant_states + +/obj/item/kirbyplants/darkpack/random + +/obj/item/kirbyplants/darkpack/random/proc/randomize_base_icon_state() + if(isnull(random_darkpack_states)) + random_darkpack_states = generate_states() + base_icon_state = pick(random_darkpack_states) + if(!dead) //no need to update the icon if we're already dead. + update_appearance(UPDATE_ICON) + +/obj/item/kirbyplants/darkpack/random/Initialize(mapload) + . = ..() + randomize_base_icon_state() + +/obj/item/kirbyplants/darkpack/plant1 + icon_state = "plant1" + +/obj/item/kirbyplants/darkpack/plant2 + icon_state = "plant2" + +/obj/item/kirbyplants/darkpack/plant3 + icon_state = "plant3" + +/obj/item/kirbyplants/darkpack/plant4 + icon_state = "plant4" + +/obj/item/kirbyplants/darkpack/plant5 + icon_state = "plant5" +// DARKPACK EDIT ADD END diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index b756f593ec43..687b1518e538 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -38,6 +38,9 @@ sharpness = SHARP_POINTY var/datum/reagent/forkload //used to eat omelette custom_price = PAYCHECK_LOWER + sound_vary = TRUE + pickup_sound = SFX_CUTLERY_PICKUP + drop_sound = SFX_CUTLERY_DROP /datum/armor/kitchen_fork fire = 50 @@ -77,6 +80,8 @@ throwforce = 0 custom_materials = list(/datum/material/plastic = SMALL_MATERIAL_AMOUNT * 0.8) custom_price = PAYCHECK_LOWER * 1 + pickup_sound = null + drop_sound = null /obj/item/kitchen/fork/plastic/Initialize(mapload) . = ..() @@ -100,6 +105,8 @@ attack_verb_simple = list("prod", "whiff", "scratch", "poke") sharpness = SHARP_EDGED custom_price = PAYCHECK_LOWER * 2 + pickup_sound = null + drop_sound = null /obj/item/knife/plastic/Initialize(mapload) . = ..() @@ -124,7 +131,7 @@ /obj/item/knife/kitchen/silicon/examine() . = ..() - . += " It's fitted with a [tool_behaviour] head." + . += "It's fitted with a [tool_behaviour] head." /obj/item/knife/kitchen/silicon/attack_self(mob/user) playsound(get_turf(user), 'sound/items/tools/change_drill.ogg', 50, TRUE) @@ -160,13 +167,16 @@ throwforce = 5 throw_speed = 3 throw_range = 7 - custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 1.5) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_NORMAL attack_verb_continuous = list("bashes", "batters", "bludgeons", "thrashes", "whacks") attack_verb_simple = list("bash", "batter", "bludgeon", "thrash", "whack") custom_price = PAYCHECK_CREW * 1.5 tool_behaviour = TOOL_ROLLINGPIN + sound_vary = TRUE + pickup_sound = SFX_ROLLING_PIN_PICKUP + drop_sound = SFX_ROLLING_PIN_DROP /obj/item/kitchen/rollingpin/illegal name = "metal rolling pin" @@ -202,6 +212,9 @@ custom_price = PAYCHECK_LOWER * 2 tool_behaviour = TOOL_MINING toolspeed = 25 // Literally 25 times worse than the base pickaxe + sound_vary = TRUE + pickup_sound = SFX_CUTLERY_PICKUP + drop_sound = SFX_CUTLERY_DROP var/spoon_sip_size = 5 @@ -316,6 +329,8 @@ custom_materials = list(/datum/material/plastic = SMALL_MATERIAL_AMOUNT * 1.2) toolspeed = 75 // The plastic spoon takes 5 minutes to dig through a single mineral turf... It's one, continuous, breakable, do_after... custom_price = PAYCHECK_LOWER * 1 + pickup_sound = null + drop_sound = null /datum/armor/kitchen_spoon fire = 50 diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index 4f34b4cf4f47..fcda07ed8975 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -27,6 +27,10 @@ tool_behaviour = TOOL_KNIFE var/list/alt_continuous = list("stabs", "pierces", "shanks") var/list/alt_simple = list("stab", "pierce", "shank") + sound_vary = TRUE + operating_sound = SFX_KNIFE_SLICE + pickup_sound = SFX_KNIFE_PICKUP + drop_sound = SFX_KNIFE_DROP /datum/armor/item_knife fire = 50 @@ -213,7 +217,7 @@ obj_flags = parent_type::obj_flags & ~CONDUCTS_ELECTRICITY force = 15 throwforce = 15 - custom_materials = null + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 2) /datum/embedding/combat_knife/weak embed_chance = 35 @@ -241,7 +245,7 @@ attack_verb_continuous = list("shanks", "shivs") attack_verb_simple = list("shank", "shiv") armor_type = /datum/armor/none - custom_materials = list(/datum/material/glass = SMALL_MATERIAL_AMOUNT * 4) + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT) /obj/item/knife/shiv/make_stabby() AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -3) @@ -254,7 +258,7 @@ force = 9 throwforce = 13 armor_type = /datum/armor/shiv_plasma - custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT *4, /datum/material/plasma=SMALL_MATERIAL_AMOUNT * 2) + custom_materials = list(/datum/material/alloy/plasmaglass = SHEET_MATERIAL_AMOUNT) /datum/armor/shiv_plasma melee = 25 @@ -274,7 +278,7 @@ throw_range = 7 wound_bonus = 10 armor_type = /datum/armor/shiv_titanium - custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT * 4, /datum/material/titanium=SMALL_MATERIAL_AMOUNT * 2) + custom_materials = list(/datum/material/alloy/titaniumglass = SHEET_MATERIAL_AMOUNT) /datum/armor/shiv_titanium melee = 25 @@ -297,7 +301,7 @@ wound_bonus = 10 exposed_wound_bonus = 20 armor_type = /datum/armor/shiv_plastitanium - custom_materials = list(/datum/material/glass= SMALL_MATERIAL_AMOUNT * 4, /datum/material/alloy/plastitanium= SMALL_MATERIAL_AMOUNT * 2) + custom_materials = list(/datum/material/alloy/plastitaniumglass = SHEET_MATERIAL_AMOUNT) /datum/armor/shiv_plastitanium melee = 50 diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index e08080504dd8..3439e6867f5d 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -15,6 +15,7 @@ w_class = WEIGHT_CLASS_TINY throw_speed = 1 throw_range = 7 + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.2, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.2) var/state = DEFLATED var/datum/gas_mixture/air_contents = null @@ -98,7 +99,6 @@ /obj/item/latexballoon/bullet_act(obj/projectile/projectile) if(projectile.damage > 0) burst() - return ..() /obj/item/latexballoon/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) diff --git a/code/game/objects/items/lighter.dm b/code/game/objects/items/lighter.dm index ceb9ebb243a5..9d1f9c655605 100644 --- a/code/game/objects/items/lighter.dm +++ b/code/game/objects/items/lighter.dm @@ -9,8 +9,7 @@ obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT resistance_flags = FIRE_PROOF - grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/fuel/oil = 5) - custom_price = 20 // DARKPACK EDIT CHANGE + custom_price = 20 // DARKPACK EDIT CHANGE - ECONOMY light_system = OVERLAY_LIGHT light_range = 2 light_power = 1.3 @@ -37,11 +36,14 @@ "thirteen", "snake", ) + /// Whether the lighter starts with fuel + var/spawns_with_reagent = TRUE /obj/item/lighter/Initialize(mapload) . = ..() create_reagents(maximum_fuel, REFILLABLE | DRAINABLE) - reagents.add_reagent(/datum/reagent/fuel, maximum_fuel) + if(spawns_with_reagent) + reagents.add_reagent(/datum/reagent/fuel, maximum_fuel) if(!overlay_state) overlay_state = pick(overlay_list) AddComponent(\ @@ -52,6 +54,9 @@ ) update_appearance() +/obj/item/lighter/grind_results() + return list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/fuel/oil = 5) + /obj/item/lighter/examine(mob/user) . = ..() if(get_fuel() <= 0) @@ -227,12 +232,11 @@ /obj/item/lighter/process(seconds_per_tick) if(lit) + open_flame(heat) burned_fuel_for += seconds_per_tick if(burned_fuel_for >= TOOL_FUEL_BURN_INTERVAL) use(used = 0.25) - open_flame(heat) - /obj/item/lighter/get_temperature() return lit * heat @@ -313,7 +317,9 @@ heat_while_on = parent_type::heat_while_on + 1000 //Blue flame is hotter, this means this does act as a welding tool. light_color = LIGHT_COLOR_CYAN overlay_state = "slime" - grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/medicine/pyroxadone = 5) + +/obj/item/lighter/slime/grind_results() + return list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/medicine/pyroxadone = 5) /obj/item/lighter/skull name = "badass zippo" @@ -325,13 +331,15 @@ desc = "In lieu of fuel, performative spirit can be used to light cigarettes." icon_state = "mlighter" //These ones don't show a flame. light_color = LIGHT_COLOR_HALOGEN - heat_while_on = 0 //I swear it's a real lighter dude you just can't see the flame dude I promise + heat_while_on = TCMB //I swear it's a real lighter dude you just can't see the flame dude I promise overlay_state = "mime" - grind_results = list(/datum/reagent/iron = 1, /datum/reagent/toxin/mutetoxin = 5, /datum/reagent/consumable/nothing = 10) light_range = 0 light_power = 0 fancy = FALSE +/obj/item/lighter/mime/grind_results() + return list(/datum/reagent/iron = 1, /datum/reagent/toxin/mutetoxin = 5, /datum/reagent/consumable/nothing = 10) + /obj/item/lighter/mime/ignition_effect(atom/A, mob/user) . = span_infoplain("[user] lifts \the [src] to the [A], which miraculously lights!") @@ -341,11 +349,13 @@ icon_state = "slighter" light_color = LIGHT_COLOR_ELECTRIC_CYAN overlay_state = "bright" - grind_results = list(/datum/reagent/iron = 1, /datum/reagent/flash_powder = 10) light_range = 8 light_power = 3 //Irritatingly bright and large enough to cover a small room. fancy = FALSE +/obj/item/lighter/bright/grind_results() + return list(/datum/reagent/iron = 1, /datum/reagent/flash_powder = 10) + /obj/item/lighter/bright/examine(mob/user) . = ..() @@ -367,3 +377,9 @@ /obj/item/lighter/mime, /obj/item/lighter/bright, ) + +/obj/item/lighter/empty + spawns_with_reagent = FALSE + +/obj/item/lighter/greyscale/empty + spawns_with_reagent = FALSE diff --git a/code/game/objects/items/maintenance_loot.dm b/code/game/objects/items/maintenance_loot.dm index 9ad0c206bbca..9a87976932ce 100644 --- a/code/game/objects/items/maintenance_loot.dm +++ b/code/game/objects/items/maintenance_loot.dm @@ -21,12 +21,14 @@ w_class = WEIGHT_CLASS_BULKY wound_bonus = 20 demolition_mod = 1.25 - grind_results = list(/datum/reagent/lead = 20) pickup_sound = 'sound/items/handling/lead_pipe/lead_pipe_pickup.ogg' drop_sound = 'sound/items/handling/materials/metal_drop.ogg' throw_drop_sound = 'sound/items/handling/lead_pipe/lead_pipe_drop.ogg' hitsound = 'sound/items/lead_pipe_hit.ogg' +/obj/item/lead_pipe/grind_results() + return list(/datum/reagent/lead = 20) + //A good battery early in the shift. Source of lead & sulfuric acid reagents. //Add lead material to this once implemented. /obj/item/stock_parts/power_store/cell/lead @@ -42,7 +44,9 @@ emp_damage_modifier = 4 // 15 shots. charge_light_type = null connector_type = "leadacid" - grind_results = list(/datum/reagent/lead = 15, /datum/reagent/toxin/acid = 15, /datum/reagent/water = 20) + +/obj/item/stock_parts/power_store/cell/lead/grind_results() + return list(/datum/reagent/lead = 15, /datum/reagent/toxin/acid = 15, /datum/reagent/water = 20) //starts partially discharged /obj/item/stock_parts/power_store/cell/lead/Initialize(mapload) @@ -56,8 +60,8 @@ ) // Give our owner shock touch when entering the digital realm -/obj/item/stock_parts/power_store/cell/lead/proc/shockingly_improve_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) - if(external_load_flags & DOMAIN_FORBIDS_ABILITIES) +/obj/item/stock_parts/power_store/cell/lead/proc/shockingly_improve_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags) + if(domain_flags & DOMAIN_FORBIDS_ABILITIES) return BITRUNNER_GEAR_LOAD_BLOCKED if(!avatar.can_mutate()) diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index f798fa66ad84..611a035acba9 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -98,6 +98,7 @@ \ Dough: 10u water + 15u flour for simple dough.
\ 6u egg yolk + 12 egg white + 15u flour + 5u sugar for cake batter.
\ + (15u soy milk can be substituted for the eggs.)
\ Doughs can be transformed by using a knife and rolling pin.
\ All doughs can be baked.
\ Bowl: Add recipe ingredients and liquid to make soups.
\ diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 5c883ddda084..7b3cf5c969e0 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -30,7 +30,7 @@ /// How much stamina damage we deal on a successful hit against a living, non-cyborg mob. var/stamina_damage = 55 /// How much armor does our baton ignore? This operates as armour penetration, but only applies to the stun attack. - var/stun_armour_penetration = 15 + var/stun_armour_penetration = 15 // pens very light / cosmetic armor /// What armor does our stun attack check before delivering the attack? var/armour_type_against_stun = MELEE /// Chance of causing force_say() when stunning a human mob @@ -76,6 +76,7 @@ . = ..() register_item_context() + add_deep_lore() /obj/item/melee/baton/add_weapon_description() AddElement(/datum/element/weapon_description, attached_proc = PROC_REF(add_baton_notes)) @@ -96,70 +97,100 @@ readout += "\nThe effects of each strike can be mitigated by utilizing [span_warning("[armour_type_against_stun]")] armor." - readout += "\nIt has a stun armor-piercing capability of [span_warning("[get_stun_penetration_value()]%")]." + readout += "\nIt has a stun armor-piercing capability of [span_warning("[stun_armour_penetration]%")]." return readout.Join("\n") -/// Checks if we can actually USE the baton. Impure -/obj/item/melee/baton/proc/can_baton(mob/living/target, mob/living/user) +/obj/item/melee/baton/proc/add_deep_lore() + return + +#define STUN_ATTACK "stun attack" + +/** + * Checks if we can stun targets with the baton. + * + * Impure (has chat feedback and mutates state in some subtypes). + * In other words don't call this unless a stun is being attempted. + * + * * target - The mob being hit with the baton + * * user - The mob using the baton + * * harmbatonning - Whether or not this is being called from a harmbaton attack + * + * Returns TRUE if we can stun the target, FALSE if we cannot. + */ +/obj/item/melee/baton/proc/try_stun(mob/living/target, mob/living/user, harmbatonning) PROTECTED_PROC(TRUE) - if(clumsy_check(user, target)) + if(!active) return FALSE - if(!chunky_finger_usable && ishuman(user)) var/mob/living/carbon/human/human_user = user if(human_user.check_chunky_fingers() && user.is_holding(src) && !HAS_MIND_TRAIT(user, TRAIT_CHUNKYFINGERS_IGNORE_BATON)) - balloon_alert(human_user, "fingers are too big!") + if(!harmbatonning) + balloon_alert(human_user, "fingers are too big!") return FALSE - + if(!COOLDOWN_FINISHED(src, cooldown_check)) + if(wait_desc && !harmbatonning) + balloon_alert(user, wait_desc) + return FALSE + if(HAS_TRAIT_FROM(target, TRAIT_IWASBATONED, REF(user)) ) //no doublebaton abuse anon! + if(!harmbatonning) + target.balloon_alert(user, "can't stun yet!") + return FALSE return TRUE // Stun attack /obj/item/melee/baton/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() - if(. || !isliving(target)) - return . - - if(!can_baton(target, user)) + if(.) return TRUE - if(!COOLDOWN_FINISHED(src, cooldown_check)) - if(wait_desc) - balloon_alert(user, wait_desc) - return TRUE + if(!isliving(target)) + return FALSE // bashing objects + + var/harmbatonning = LAZYACCESS(modifiers, RIGHT_CLICK) + if(harmbatonning && !stun_on_harmbaton) + return FALSE // harmbatonning, no stun + + // see if this attack will result in a stun, or if we need to cancel it + if(!try_stun(target, user, harmbatonning)) + if(harmbatonning) + return FALSE // if harmbatonning, ALwAYS attack + if(active) + return TRUE // if active, but can't stun? no attack + if(!user.combat_mode) + return TRUE // if not in combat mode? no attack + + return FALSE // otherwise, attack normally + + // clumsy people redirect this attack - yes, this bypasses IWASBATONED and such + if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) + user.visible_message( + span_danger("[user] accidentally hits [user.p_them()]self over the head with [src]! What a doofus!"), + span_userdanger("You accidentally hit yourself over the head with [src]!"), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) - if(HAS_TRAIT_FROM(target, TRAIT_IWASBATONED, REF(user))) //no doublebaton abuse anon! - target.balloon_alert(user, "can't stun yet!") - return TRUE + finalize_baton_attack(user, user, clumsy = TRUE) + user.apply_damage(2 * force, BRUTE, BODY_ZONE_HEAD, attacking_item = src) + log_combat(user, user, "accidentally stun attacked [user.p_them()]self due to their clumsiness", src) + user.do_attack_animation(user) + user.changeNext_move(attack_speed) + return TRUE // you hit yourself, nerd - if(active) - // when we continue to attack, deal 0 (brute) damage (just stun) + // if not harm batonning, we override the default attack properties do do nothing + if(!harmbatonning) SET_ATTACK_FORCE(attack_modifiers, 0) MUTE_ATTACK_HITSOUND(attack_modifiers) HIDE_ATTACK_MESSAGES(attack_modifiers) - return . - -// Harm attack -/obj/item/melee/baton/pre_attack_secondary(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) - . = ..() - if(. != SECONDARY_ATTACK_CALL_NORMAL || !isliving(target)) - return . - - if(!can_baton(target, user)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - - // call attack, NOT pre_attack - // (so we go directly to harming) - return SECONDARY_ATTACK_CONTINUE_CHAIN + // then denote the attack as "will stun" for afterattack + LAZYSET(attack_modifiers, STUN_ATTACK, TRUE) + return FALSE // attack and stun // This is where stun gets applied /obj/item/melee/baton/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) - if(!isliving(target) || !active || !COOLDOWN_FINISHED(src, cooldown_check) || HAS_TRAIT_FROM(target, TRAIT_IWASBATONED, REF(user))) - return - // worst check in the chain but - right click = harmbaton - if(LAZYACCESS(modifiers, RIGHT_CLICK) && !stun_on_harmbaton) + if(QDELETED(target) || !LAZYACCESS(attack_modifiers, STUN_ATTACK)) return - finalize_baton_attack(target, user, modifiers) + finalize_baton_attack(target, user) var/list/desc if(iscyborg(target)) @@ -205,17 +236,17 @@ return CONTEXTUAL_SCREENTIP_SET /// Wrapper for calling "stun()" and doing relevant vfx/sfx -/obj/item/melee/baton/proc/finalize_baton_attack(mob/living/target, mob/living/user, list/modifiers) +/obj/item/melee/baton/proc/finalize_baton_attack(mob/living/target, mob/living/user, clumsy = FALSE) PROTECTED_PROC(TRUE) COOLDOWN_START(src, cooldown_check, cooldown) if(on_stun_sound) playsound(src, on_stun_sound, on_stun_volume, TRUE, -1) - if(baton_effect(target, user, modifiers) && user) + if(baton_effect(target, user, null, clumsy) && user) set_batoned(target, user, cooldown) log_combat(user, target, "stunned", src.name) /// The actual "stun()" of the stun baton -/obj/item/melee/baton/proc/baton_effect(mob/living/target, mob/living/user, list/modifiers, stun_override) +/obj/item/melee/baton/proc/baton_effect(mob/living/target, mob/living/user, stun_override, clumsy) PROTECTED_PROC(TRUE) var/trait_check = HAS_TRAIT(target, TRAIT_BATON_RESISTANCE) if(iscyborg(target)) @@ -229,8 +260,7 @@ var/mob/living/carbon/human/human_target = target if(prob(force_say_chance)) human_target.force_say() - var/effective_armour_penetration = get_stun_penetration_value() - var/armour_block = target.run_armor_check(null, armour_type_against_stun, null, null, effective_armour_penetration) + var/armour_block = target.run_armor_check(null, armour_type_against_stun, null, null, stun_armour_penetration) target.apply_damage(stamina_damage, STAMINA, blocked = armour_block) if(!trait_check) target.Knockdown((isnull(stun_override) ? knockdown_time : stun_override)) @@ -275,38 +305,7 @@ ADD_TRAIT(target, TRAIT_IWASBATONED, user_ref) addtimer(TRAIT_CALLBACK_REMOVE(target, TRAIT_IWASBATONED, user_ref), cooldown) -/obj/item/melee/baton/proc/clumsy_check(mob/living/user, mob/living/intented_target) - if(!active || !HAS_TRAIT(user, TRAIT_CLUMSY) || prob(50)) - return FALSE - user.visible_message(span_danger("[user] accidentally hits [user.p_them()]self over the head with [src]! What a doofus!"), span_userdanger("You accidentally hit yourself over the head with [src]!"), visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE) - - if(iscyborg(user)) - if(affect_cyborg) - user.flash_act(affect_silicon = TRUE) - user.Paralyze(clumsy_knockdown_time) - additional_effects_cyborg(user, user) // user is the target here - if(on_stun_sound) - playsound(src, on_stun_sound, on_stun_volume, TRUE, -1) - else - playsound(src, 'sound/effects/bang.ogg', 10, TRUE) - else - //straight up always force say for clumsy humans - if(ishuman(user)) - var/mob/living/carbon/human/human_user = user - human_user.force_say() - user.Knockdown(clumsy_knockdown_time) - user.apply_damage(stamina_damage, STAMINA) - additional_effects_non_cyborg(user, user) // user is the target here - if(on_stun_sound) - playsound(src, on_stun_sound, on_stun_volume, TRUE, -1) - - user.apply_damage(2 * force, BRUTE, BODY_ZONE_HEAD, attacking_item = src) - log_combat(user, user, "accidentally stun attacked [user.p_them()]self due to their clumsiness", src) - user.do_attack_animation(user) - -/// Handles the penetration value of our baton, called during baton_effect() -/obj/item/melee/baton/proc/get_stun_penetration_value() - return stun_armour_penetration +#undef STUN_ATTACK /obj/item/conversion_kit name = "conversion kit" @@ -410,23 +409,22 @@ name = "bronze-capped telescopic baton" desc = "A compact yet robust personal defense weapon. Can be concealed when folded. This one is ranked BRONZE, and thus has mediocre penetrative power." icon_state = "telebaton_bronze" - stun_armour_penetration = 20 /obj/item/melee/baton/telescopic/silver name = "silver-capped telescopic baton" desc = "A compact yet robust personal defense weapon. Can be concealed when folded. This one is ranked SILVER, and thus has decent penetrative power." icon_state = "telebaton_silver" - stun_armour_penetration = 40 + stun_armour_penetration = 30 // strong enough to pen sec armor /obj/item/melee/baton/telescopic/gold name = "gold-capped telescopic baton" desc = "A compact yet robust personal defense weapon. Can be concealed when folded. This one is ranked GOLD, and thus has exceptional penetrative power." icon_state = "telebaton_gold" - stun_armour_penetration = 60 + stun_armour_penetration = 50 // strong enough to pen syndicate modsuits /obj/item/melee/baton/telescopic/contractor_baton name = "contractor baton" - desc = "A compact, specialised baton assigned to Syndicate contractors. Applies light electrical shocks to targets." + desc = "A high tech telescopic stun baton, as developed by Cybersun Industries. Delivers a precise shock to a target's central nervous system to incapacitate them." icon = 'icons/obj/weapons/baton.dmi' icon_state = "contractor_baton" worn_icon_state = "contractor_baton" @@ -440,7 +438,7 @@ cooldown = 2.5 SECONDS force_say_chance = 80 //very high force say chance because it's funny stamina_damage = 85 - stun_armour_penetration = 40 + stun_armour_penetration = 30 // strong enough to pen sec armor clumsy_knockdown_time = 24 SECONDS affect_cyborg = TRUE wait_desc = "still charging!" @@ -459,7 +457,7 @@ /obj/item/melee/baton/security name = "stun baton" - desc = "A stun baton for incapacitating people with." + desc = "The Secure Apprehension Device, as developed by Nanotrasen. Delivers a precise shock to a target's central nervous system to incapacitate them." desc_controls = "Left click to stun, right click to harm." icon = 'icons/obj/weapons/baton.dmi' icon_state = "stunbaton" @@ -476,8 +474,6 @@ force_say_chance = 50 stamina_damage = 60 armour_type_against_stun = ENERGY - // This value is added to our stun armour penetration when called by get_stun_penetration_value(). For giving some batons extra OOMPH. - var/additional_stun_armour_penetration = 0 knockdown_time = 5 SECONDS clumsy_knockdown_time = 15 SECONDS cooldown = 2.5 SECONDS @@ -509,8 +505,6 @@ var/convertible = TRUE //if it can be converted with a conversion kit ///Whether or not our inhand changes when active. var/active_changes_inhand = TRUE - ///Whether or not our baton visibly changes the inhand sprite based on inserted cell - var/tip_changes_color = TRUE ///When set, inhand_icon_state defaults to this instead of base_icon_state var/base_inhand_state = null @@ -581,10 +575,7 @@ if(active) icon_state = "[base_icon_state]_active" if(active_changes_inhand) - if(tip_changes_color) - inhand_icon_state = "[base_inhand]_active_[get_baton_tip_color()]" - else - inhand_icon_state = "[base_inhand]_active" + inhand_icon_state = "[base_inhand]_active" return ..() if(!cell) icon_state = "[base_icon_state]_nocell" @@ -646,35 +637,7 @@ /// Toggles the stun baton's light /obj/item/melee/baton/security/proc/toggle_light() - set_light_color(get_baton_tip_color(TRUE)) set_light_on(!light_on) - return - -/// Change our baton's top color based on the contained cell. -/obj/item/melee/baton/security/proc/get_baton_tip_color(set_light = FALSE) - var/tip_type_to_set - var/tip_light_to_set - - if(cell) - var/chargepower = cell.maxcharge - var/zap_value = clamp(chargepower/STANDARD_CELL_CHARGE, 0, 100) - switch(zap_value) - if(-INFINITY to 10) - tip_type_to_set = "orange" - tip_light_to_set = LIGHT_COLOR_ORANGE - if(11 to 20) - tip_type_to_set = "red" - tip_light_to_set = LIGHT_COLOR_INTENSE_RED - if(21 to 30) - tip_type_to_set = "green" - tip_light_to_set = LIGHT_COLOR_GREEN - if(31 to INFINITY) - tip_type_to_set = "blue" - tip_light_to_set = LIGHT_COLOR_BLUE - else - tip_type_to_set = "orange" - - return set_light ? tip_light_to_set : tip_type_to_set /obj/item/melee/baton/security/proc/turn_on(mob/user) active = TRUE @@ -703,28 +666,18 @@ //we're below minimum, turn off turn_off() -/obj/item/melee/baton/security/clumsy_check(mob/living/carbon/human/user) - . = ..() - if(.) - SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK) - deductcharge(cell_hit_cost) - -/obj/item/melee/baton/security/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) - . = ..() - if(. || !isliving(target)) - return . - - if(!active && !user.combat_mode) +/obj/item/melee/baton/security/try_stun(mob/living/target, mob/living/user, harmbatonning) + if(!active && !harmbatonning && !user.combat_mode) target.visible_message( span_warning("[user] prods [target] with [src]. Luckily it was off."), span_warning("[user] prods you with [src]. Luckily it was off."), visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, ) - return TRUE + return FALSE - return . + return ..() -/obj/item/melee/baton/security/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override) +/obj/item/melee/baton/security/baton_effect(mob/living/target, mob/living/user, stun_override, clumsy) if(iscyborg(loc)) var/mob/living/silicon/robot/robot = loc if(!robot || !robot.cell || !robot.cell.use(cell_hit_cost)) @@ -734,13 +687,6 @@ stun_override = 0 //Avoids knocking people down prematurely. return ..() -/obj/item/melee/baton/security/get_stun_penetration_value() - if(cell) - var/chargepower = cell.maxcharge - var/zap_pen = clamp(chargepower/STANDARD_CELL_CHARGE, 0, 100) - return zap_pen + additional_stun_armour_penetration - return stun_armour_penetration + additional_stun_armour_penetration - /* * After a target is hit, we apply some status effects. * After a period of time, we then check to see what stun duration we give. @@ -808,6 +754,56 @@ /obj/item/melee/baton/security/loaded/hos preload_cell_type = /obj/item/stock_parts/power_store/cell/super +// Stunsword Skins +/datum/atom_skin/stunsword + abstract_type = /datum/atom_skin/stunsword + change_inhand_icon_state = TRUE + change_base_icon_state = TRUE + +/datum/atom_skin/stunsword/default + preview_name = "Default" + new_icon_state = "stunsword" + +/datum/atom_skin/stunsword/energy + preview_name = "Energy" + new_icon_state = "stunsword_energy" + +///Stun Sword +/obj/item/melee/baton/security/stunsword + name = "\improper NT-20 'Excalibur' Stunsword" + desc = "It's a sword. It stuns. What more could you want?" + icon_state = "stunsword" + inhand_icon_state = "stunsword" + base_icon_state = "stunsword" + lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' + righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' + hitsound = 'sound/items/weapons/bladeslice.ogg' + attack_verb_continuous = list("attacks", "slashes", "slices", "tears", "lacerates", "rips", "dices", "cuts") + attack_verb_simple = list("attack", "slash", "slice", "tear", "lacerate", "rip", "dice", "cut") + inhand_x_dimension = 64 + inhand_y_dimension = 64 + w_class = WEIGHT_CLASS_HUGE + sharpness = SHARP_EDGED + force = 30 + throwforce = 10 + wound_bonus = 0 + exposed_wound_bonus = 30 + stun_armour_penetration = 40 + throw_stun_chance = 60 + convertible = FALSE + + obj_flags = UNIQUE_RENAME + +/obj/item/melee/baton/security/stunsword/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/stunsword) + +/obj/item/melee/baton/security/stunsword/add_deep_lore() + return + +/obj/item/melee/baton/security/stunsword/loaded + preload_cell_type = /obj/item/stock_parts/power_store/cell/bluespace // 40% stun_armour_penetration + //Makeshift stun baton. Replacement for stun gloves. /obj/item/melee/baton/security/cattleprod name = "stunprod" @@ -830,7 +826,7 @@ slot_flags = ITEM_SLOT_BACK convertible = FALSE active_changes_inhand = FALSE - tip_changes_color = FALSE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.15, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2) var/obj/item/assembly/igniter/sparkler ///Determines whether or not we can improve the cattleprod into a new type. Prevents turning the cattleprod subtypes into different subtypes, or wasting materials on making it....another version of itself. var/can_upgrade = TRUE @@ -839,6 +835,9 @@ . = ..() sparkler = new (src) +/obj/item/melee/baton/security/cattleprod/add_deep_lore() + return + /obj/item/melee/baton/security/cattleprod/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)//handles sticking a crystal onto a stunprod to make an improved cattleprod if(!istype(item, /obj/item/stack)) return ..() @@ -871,16 +870,16 @@ var/obj/item/melee/baton/security/cattleprod/brand_new_prod = new our_prod(user.loc) user.put_in_hands(brand_new_prod) -/obj/item/melee/baton/security/cattleprod/can_baton(mob/living/target, mob/living/user) - if(!sparkler.activate()) - return FALSE - return ..() +/obj/item/melee/baton/security/cattleprod/try_stun(mob/living/target, mob/living/user, harmbatonning) + return ..() && sparkler.activate() /obj/item/melee/baton/security/cattleprod/Destroy() - if(sparkler) - QDEL_NULL(sparkler) + QDEL_NULL(sparkler) return ..() +/obj/item/melee/baton/security/cattleprod/loaded + preload_cell_type = /obj/item/stock_parts/power_store/cell/high + /obj/item/melee/baton/security/boomerang name = "\improper OZtek Boomerang" desc = "A device invented in 2486 for the great Space Emu War by the confederacy of Australicus, these high-tech boomerangs also work exceptionally well at stunning crewmembers. Just be careful to catch it when thrown!" @@ -896,13 +895,15 @@ throw_stun_chance = 99 //Have you prayed today? convertible = FALSE active_changes_inhand = FALSE - tip_changes_color = FALSE custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*2, /datum/material/silver = SHEET_MATERIAL_AMOUNT*5, /datum/material/gold = SHEET_MATERIAL_AMOUNT) /obj/item/melee/baton/security/boomerang/Initialize(mapload) . = ..() AddComponent(/datum/component/boomerang, throw_range + 2, TRUE) +/obj/item/melee/baton/security/boomerang/add_deep_lore() + return + /obj/item/melee/baton/security/boomerang/loaded //Same as above, comes with a cell. preload_cell_type = /obj/item/stock_parts/power_store/cell/high @@ -915,18 +916,13 @@ inhand_icon_state = "teleprod" slot_flags = null can_upgrade = FALSE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.15, /datum/material/bluespace = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2) -/obj/item/melee/baton/security/cattleprod/teleprod/clumsy_check(mob/living/carbon/human/user) - . = ..() - if(!.) - return - do_teleport(user, get_turf(user), 50, channel = TELEPORT_CHANNEL_BLUESPACE) - -/obj/item/melee/baton/security/cattleprod/teleprod/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override) +/obj/item/melee/baton/security/cattleprod/teleprod/baton_effect(mob/living/target, mob/living/user, stun_override, clumsy) . = ..() if(!. || target.move_resist >= MOVE_FORCE_OVERPOWERING) return - do_teleport(target, get_turf(target), 15, channel = TELEPORT_CHANNEL_BLUESPACE) + do_teleport(target, get_turf(target), clumsy ? 50 : 15, channel = TELEPORT_CHANNEL_BLUESPACE) /obj/item/melee/baton/security/cattleprod/telecrystalprod name = "snatcherprod" @@ -939,13 +935,7 @@ throw_stun_chance = 50 //I think it'd be funny can_upgrade = FALSE -/obj/item/melee/baton/security/cattleprod/telecrystalprod/clumsy_check(mob/living/carbon/human/user) - . = ..() - if(!.) - return - do_teleport(src, get_turf(user), 50, channel = TELEPORT_CHANNEL_BLUESPACE) //Wait, where did it go? - -/obj/item/melee/baton/security/cattleprod/telecrystalprod/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override) +/obj/item/melee/baton/security/cattleprod/telecrystalprod/baton_effect(mob/living/target, mob/living/user, stun_override, clumsy) . = ..() if(!.) return @@ -958,6 +948,8 @@ stuff_in_hand.forceMove(user.drop_location()) stuff_in_hand.loc.visible_message(span_warning("[stuff_in_hand] suddenly appears!")) + if(clumsy && user.dropItemToGround(src, force = TRUE, silent = TRUE)) + do_teleport(src, get_turf(user), 50, channel = TELEPORT_CHANNEL_BLUESPACE) //Wait, where did it go? /obj/item/melee/baton/nunchaku name = "Syndie Fitness Nunchuks" @@ -977,7 +969,7 @@ knockdown_time = 0.25 SECONDS demolition_mod = 1.5 stamina_damage = 30 // 4 hit stamcrit - stun_armour_penetration = 30 // bronze-silver telescopic + stun_armour_penetration = 25 // bronze-silver telescopic force = 16 // 7 hit crit exposed_wound_bonus = 5 @@ -1000,7 +992,7 @@ randomize_state() // blocks any melee/throwable attacks - owner.adjustStaminaLoss(5) + owner.adjust_stamina_loss(5) final_block_chance = 100 // counterattack at melee @@ -1010,3 +1002,56 @@ melee_attack_chain(owner, attacker, LEFT_CLICK) return ..() + +// Deep Lore // + +/obj/item/melee/baton/security/add_deep_lore() + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \ + lore = "The Secure Apprehension Device (sometimes referred to as the SAD in the officer training manuals) is \ + the unholy union of a mace and a cattleprod. This nonlethal device was designed to put a stop to ruffians, \ + scoundrels, ne'er-do-wells and criminals wherever they may rear their ugly heads.
\ +
\ + A symbol of Nanotrasen security forces, the stun baton is the primary tool officers employ against the \ + unlawful scum and villainy of the Spinward and abroad. Trained to 'baton first, interrogate later', \ + Nanotrasen security has long since earned itself a mixed reputation. Able to rapidly shut down the \ + central nervous system of a criminal with only a few direct applications of the conductive striking head \ + of the device, few would-be troublemakers want to find themselves on the wrong end of an officer brandishing \ + this baton.
\ +
\ + TerraGov law enforcement has avoided the adoption of stun batons due to various ethical dilemmas posed by \ + their usage, largely because of the longterm physical and mental ramifications of being struck by a human cattleprod. \ + Citizens' rights advocacy groups protest against the proliferation of stun batons as a policing tool, \ + arguing that they are 'inhumane' and 'authoritarian'. Nanotrasen, on the other hand, has had no such qualms \ + when deploying stun batons as a compliance measure across all of their existing stations and facilities against \ + unruly members of staff." \ + ) + +// Contractor Baton + +/obj/item/melee/baton/telescopic/contractor_baton/add_deep_lore() + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \ + lore = "The Contract Acquisition Device (sometimes referred to as the CAD in encrypted correspondence) is \ + one of the more frequently encountered examples of Cybersun Industries weaponry. Extremely similar to Nanotrasen's \ + own Secure Apprehension Device (also simply known as the stun baton), the contractor baton is able to induce \ + CNS disruption in a target to render them helpless. It is also capable of devastating blunt force trauma if \ + used as a bludgeon. The contractor baton is also capable of telescopic deployment, allowing for discretion while \ + making an approach towards a target.
\ +
\ + The contractor baton is famously associated with contractors, elite Cybersun field agents. While the standard \ + agent would often be tasked with sabotage, terrorism, murder or theft, contractors have the critical task of \ + kidnapping high value personnel. Anyone with the potential to possess classified or sensitive data about Nanotrasen \ + security systems and devices could be a target for Cybersun.
\ +
\ + Extracting this information is most easily performed on living subjects. As such, the contractor baton was designed \ + with nonlethal incapacitation in mind. However, Cybersun Industries has long since found workarounds for extracting \ + data from the recently deceased, should the contractor find themselves with only a corpse left to send back. Death \ + may not spare you from the machinations of Cybersun Industries if they deem you a valuable asset towards their goals.
\ +
\ + Nanotrasen utilizes a number of countermeasures to contractor insurgencies, such as employing selective memory wiping \ + or falsified memory injection, the establishment of 'dummy' command staff through the artificial acceleration \ + of otherwise incompetent but useful crewmembers (whose incompetence will often result in an acceptable degree \ + of operational disruption), which provides convenient scapegoats in the event of a security breach as well as \ + frequent staff turnover and reassignment." \ + ) diff --git a/code/game/objects/items/melee/chainofcommand.dm b/code/game/objects/items/melee/chainofcommand.dm index 8009b031df4c..ed0482f4abc1 100644 --- a/code/game/objects/items/melee/chainofcommand.dm +++ b/code/game/objects/items/melee/chainofcommand.dm @@ -66,7 +66,8 @@ /atom/movable/screen/alert/status_effect/commanded name = "Commanded" desc = "You are inspired to do things faster!" - icon_state = "commanded" + use_user_hud_icon = TRUE + overlay_state = "commanded" /obj/item/melee/chainofcommand/tailwhip name = "liz o' nine tails" @@ -74,6 +75,7 @@ icon_state = "tailwhip" inhand_icon_state = "tailwhip" item_flags = NONE + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.1, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.1) /obj/item/melee/chainofcommand/tailwhip/kitty name = "cat o' nine tails" diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index f5005a23b613..8c4505490664 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -23,6 +23,8 @@ var/active_force = 30 /// Throwforce while active. var/active_throwforce = 20 + /// The throw speed of the weapon when on + var/active_throw_speed = 4 /// Sharpness while active. var/active_sharpness = SHARP_EDGED /// Hitsound played attacking while active. @@ -61,7 +63,7 @@ /datum/component/transforming, \ force_on = active_force, \ throwforce_on = active_throwforce, \ - throw_speed_on = 4, \ + throw_speed_on = active_throw_speed, \ sharpness_on = active_sharpness, \ hitsound_on = active_hitsound, \ w_class_on = active_w_class, \ @@ -156,6 +158,7 @@ active_force = 150 active_throwforce = 30 + active_throw_speed = 3 active_w_class = WEIGHT_CLASS_HUGE /obj/item/melee/energy/axe/make_transformable() @@ -163,7 +166,7 @@ /datum/component/transforming, \ force_on = active_force, \ throwforce_on = active_throwforce, \ - throw_speed_on = throw_speed, \ + throw_speed_on = active_throw_speed, \ sharpness_on = sharpness, \ w_class_on = active_w_class, \ ) @@ -211,6 +214,9 @@ if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) return FALSE + if(attack_type == OVERWHELMING_ATTACK) + return FALSE + if(attack_type == LEAP_ATTACK) final_block_chance -= 25 //OH GOD GET IT OFF ME @@ -329,6 +335,10 @@ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' light_color = COLOR_RED +/obj/item/melee/energy/sword/pirate/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) //closed sword guard + /// Energy blades, which are effectively perma-extended energy swords /obj/item/melee/energy/blade name = "energy blade" @@ -380,13 +390,9 @@ icon_angle = 0 /obj/item/melee/energy/sword/surplus - name = "\improper Type I 'Iaito' energy sword" - desc = "Oversized, overengineered, and mass-produced. The two blades help make up for the poor cutting plane the emitter generates. Hopefully. \ - Supposedly, this version of the energy sword was a Waffle Corp prototype that was first trialed in a variety of armed conflicts around the interstellar \ - frontier. The success rate, and survival of its users, were abysmally low. To make matters worse, they had made so many of these swords (accidentally) that \ - it would cost the company more disposing of them than trying to offload them to raise a quick buck. Thus, the 'Iaito' was 'born'. Often found in the hands of \ - grunts, mooks, goons, criminals, wannabe assassins or lunatics. You may or may not fit into one of these categories if you are genuinely attempting to kill someone\ - with this sword." + name = "\improper Pattern I 'Iaito' energy sword" + desc = "Oversized, overengineered, and somehow still mass-produced. The twin energy blades, theoretically, help make up for the poor cutting plane the emitter generates. \ + When there are no more heroes in a desperate struggle, it's kill or be killed." icon_state = "surplus_e_sword" inhand_icon_state = "surplus_e_sword" base_icon_state = "surplus_e_sword" @@ -396,6 +402,7 @@ inhand_y_dimension = 64 active_force = 15 // This force is augmented by the state of our target. active_throwforce = 15 + active_throw_speed = 3 alt_continuous = list("whacks", "smacks", "bashes") alt_simple = list("whack", "smack", "bash") alt_sharpness = NONE @@ -413,6 +420,18 @@ /obj/item/melee/energy/sword/surplus/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TRANSFORMING_PRE_TRANSFORM, PROC_REF(check_power)) + AddElement(/datum/element/examine_lore, \ + lore = "This early iteration of the now infamous energy sword was, supposedly, a Waffle Corp prototype first trialed in a variety of armed conflicts \ + around the interstellar frontier.
\ +
\ + Unfortunately, the success rate of the platform, along with the survival rate of its users, was abysmally low. \ + To make matters worse, initial overestimation of its effectiveness meant that by the time its myriad flaws reared their heads, production had already \ + reached such a level that the company behind its manufacture would have to pay more to properly disassemble and dispose of the swords, \ + than if they started offloading them onto markets of various legitimacy to try and recoup costs. Thus, the Iaito was 'born'.

\ + As a consequence of its haphazard proliferation and its low market price compared to later, improved energy sword models, examples of the Iaito are \ + typically found in the hands of various grunts, mooks, goons, criminals, wannabe assassins, lunatics, or those otherwise embroiled in \ + a desperate struggle. If you're actually trying to kill someone with this sword, you may or may not fit into one or more of those categories." \ + ) /obj/item/melee/energy/sword/surplus/examine(mob/user) . = ..() @@ -486,6 +505,26 @@ if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) || charge <= 0) return + expend_charge(user) + +/obj/item/melee/energy/sword/surplus/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(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) + return FALSE + + if(attack_type == OVERWHELMING_ATTACK) + return FALSE + + if(attack_type == LEAP_ATTACK) + final_block_chance -= 25 + + if(prob(final_block_chance) && charge) + expend_charge(owner) + return TRUE + +/obj/item/melee/energy/sword/surplus/proc/expend_charge(mob/user) + if(!charge) // not that this will ever get here without charge, but... + return + charge-- if(charge <= 0) user.balloon_alert(user, "out of charge!") @@ -506,3 +545,49 @@ playsound(src, 'sound/items/baton/telescopic_baton_folded_pickup.ogg', 40, TRUE) COOLDOWN_START(src, jiggle_cooldown, 1 SECONDS) return TRUE + +// Null rod variants + +/obj/item/melee/energy/sword/nullrod + name = "light energy sword" + desc = "If you strike me down, I shall become more robust than you can possibly imagine." + throw_speed = 3 + throw_range = 4 + block_chance = 30 + armour_penetration = 0 + wound_bonus = -10 + demolition_mod = 1 + sword_color_icon = "blue" + light_color = LIGHT_COLOR_LIGHT_CYAN + active_force = 18 + active_throwforce = 10 + active_throw_speed = 3 + alt_force_mod = -3 + +/obj/item/melee/energy/sword/nullrod/Initialize(mapload) + . = ..() + AddElement(/datum/element/nullrod_core) + +/obj/item/melee/energy/sword/nullrod/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(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) + return FALSE + + if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK) + final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword. Or a road roller, if one happened to hit you. + + return ..() + +/obj/item/melee/energy/sword/nullrod/red + name = "dark energy sword" + desc = "Woefully ineffective when used on steep terrain." + sword_color_icon = "red" + light_color = COLOR_SOFT_RED + +/obj/item/melee/energy/sword/nullrod/pirate + name = "nautical energy cutlass" + desc = "Convincing HR that your religion involved piracy was no mean feat." + icon_state = "e_cutlass" + inhand_icon_state = "e_cutlass" + base_icon_state = "e_cutlass" + sword_color_icon = null + light_color = COLOR_RED diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index feac13198ce6..2f4defafa2cd 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -43,7 +43,7 @@ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' obj_flags = CONDUCTS_ELECTRICITY | UNIQUE_RENAME - force = 15 + force = 20 throwforce = 10 demolition_mod = 0.75 //but not metal w_class = WEIGHT_CLASS_BULKY @@ -60,6 +60,7 @@ /obj/item/melee/sabre/Initialize(mapload) . = ..() + AddElement(/datum/element/cuffable_item) //closed sword guard AddComponent(/datum/component/jousting) //fast and effective, but as a sword, it might damage the results. AddComponent(/datum/component/butchering, \ @@ -93,7 +94,7 @@ INVOKE_ASYNC(baned_target, TYPE_PROC_REF(/mob/living/carbon/human, emote), "scream") /obj/item/melee/sabre/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) - if(attack_type == (PROJECTILE_ATTACK || LEAP_ATTACK || OVERWHELMING_ATTACK)) + if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK) final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword. Or a road roller, if one happened to hit you. return ..() @@ -138,11 +139,11 @@ if(!QDELETED(affecting) && !(affecting.bodypart_flags & BODYPART_UNREMOVABLE) && affecting.owner == user && !QDELETED(user)) playsound(user, hitsound, 25, TRUE) affecting.dismember(BRUTE) - user.adjustBruteLoss(20) + user.adjust_brute_loss(force * 1.25) /obj/item/melee/sabre/proc/manual_suicide(mob/living/user, originally_nodropped) if(!QDELETED(user)) - user.adjustBruteLoss(200) + user.adjust_brute_loss(200) user.death(FALSE) REMOVE_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT) @@ -173,10 +174,11 @@ /obj/item/melee/parsnip_sabre/Initialize(mapload) . = ..() + AddElement(/datum/element/cuffable_item) //closed sword guard AddComponent(/datum/component/jousting) /obj/item/melee/parsnip_sabre/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) - if(attack_type == (PROJECTILE_ATTACK || LEAP_ATTACK || OVERWHELMING_ATTACK)) + if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK) final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword. Or a road roller, if one happened to hit you. return ..() @@ -212,12 +214,12 @@ block_sound = 'sound/items/weapons/parry.ogg' /obj/item/melee/beesword/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(attack_type == (PROJECTILE_ATTACK || LEAP_ATTACK || OVERWHELMING_ATTACK)) + if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK) final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword. Or a road roller, if one happened to hit you. return ..() /obj/item/melee/beesword/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) - if(iscarbon(target)) + if(iscarbon(target) && !QDELETED(target)) var/mob/living/carbon/carbon_target = target carbon_target.reagents.add_reagent(/datum/reagent/toxin, 4) @@ -241,6 +243,7 @@ armour_penetration = 1000 force_string = "INFINITE" item_flags = NEEDS_PERMIT|NO_BLOOD_ON_ITEM + custom_materials = list(/datum/material/adamantine = SHEET_MATERIAL_AMOUNT * 20, /datum/material/iron = SHEET_MATERIAL_AMOUNT) var/obj/machinery/power/supermatter_crystal/shard var/balanced = 1 @@ -511,7 +514,7 @@ material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_AFFECT_STATISTICS //Material type changes the prefix as well as the color. custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 4.5, /datum/material/wood = SHEET_MATERIAL_AMOUNT * 1.5) //Defaults to an Iron Mace. slot_flags = ITEM_SLOT_BELT - force = 14 + force = 16 w_class = WEIGHT_CLASS_BULKY throwforce = 8 block_chance = 10 @@ -541,6 +544,7 @@ desc = "[initial(desc)] Its handle is made of [material.name]." /obj/item/melee/cleric_mace/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(attack_type == (PROJECTILE_ATTACK || LEAP_ATTACK || OVERWHELMING_ATTACK)) + if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK) final_block_chance = 0 //Don't bring a...mace to a gunfight, and also you aren't going to really block someone full body tackling you with a mace. Or a road roller, if one happened to hit you. return ..() + diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 591dd127411c..a4a738469cd5 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -24,6 +24,7 @@ /obj/item/reagent_containers/cup/bucket, /obj/structure/mop_bucket, )) + custom_price = 20 // DARKPACK EDIT ADD - ECONOMY /obj/item/mop/apply_fantasy_bonuses(bonus) . = ..() diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index ee3b323eec02..dc93e9364390 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -47,6 +47,7 @@ /obj/item/pet_carrier/Initialize(mapload) . = ..() register_context() + AddElement(/datum/element/cuffable_item) /obj/item/pet_carrier/Destroy() if(occupants.len) diff --git a/code/game/objects/items/piggy_bank.dm b/code/game/objects/items/piggy_bank.dm index 9678ab72f164..071faaca6900 100644 --- a/code/game/objects/items/piggy_bank.dm +++ b/code/game/objects/items/piggy_bank.dm @@ -176,7 +176,7 @@ initial_value = PAYCHECK_CREW //it takes about 66 shifts for it to hit its max value on its own. maximum_savings_per_shift = PAYCHECK_COMMAND * 16 //and 2 if you actively use it. -/* DARKPACK EDIT REMOVAL +/* // DARKPACK EDIT REMOVAL /obj/item/piggy_bank/vault/Initialize(mapload) . = ..() //one piggy bank should exist, preferibly inside the vault's safe. diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index 2e0f7af61021..2e23ffdfbb77 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -14,6 +14,9 @@ throw_speed = 3 throw_range = 7 custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2.5) + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP var/active = FALSE var/atom/movable/target //The thing we're searching for var/minimum_range = 0 //at what range the pinpointer declares you to be at your destination @@ -217,6 +220,7 @@ GLOBAL_LIST_EMPTY(sniffable_sheets) desc = "A handheld tracking device that locates sheets of glass and iron." icon_state = "pinpointer_sniffer" worn_icon_state = "pinpointer_black" + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.8, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.7) /obj/item/pinpointer/material_sniffer/scan_for_target() if(target || !GLOB.sniffable_sheets.len) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index f733481ae9b4..48e5f14d0c6e 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -19,13 +19,12 @@ var/obj/item/toy/plush/plush_child var/obj/item/toy/plush/paternal_parent //who initiated creation var/obj/item/toy/plush/maternal_parent //who owns, see love() - var/static/list/breeding_blacklist = typecacheof(/obj/item/toy/plush/carpplushie/dehy_carp) // you cannot have sexual relations with this plush var/list/scorned = list() //who the plush hates var/list/scorned_by = list() //who hates the plush, to remove external references on Destroy() var/heartbroken = FALSE var/vowbroken = FALSE var/young = FALSE -///Prevents players from cutting stuffing out of a plushie if true + ///Prevents players from cutting stuffing out of a plushie if true var/divine = FALSE var/mood_message var/list/love_message @@ -34,6 +33,9 @@ var/list/vowbroken_message var/list/parent_message var/normal_desc + /// The type of offspring this plush generates. If not set, it'll default to the type itself on init. + var/offspring_type + //--end of love :'(-- /* @@ -47,6 +49,7 @@ AddComponent(/datum/component/squeak, squeak_override) AddElement(/datum/element/bed_tuckable, mapload, 6, -5, 90) AddElement(/datum/element/toy_talk) + AddElement(/datum/element/cuffable_item) //have we decided if Pinocchio goes in the blue or pink aisle yet? if(gender == NEUTER) @@ -55,6 +58,9 @@ else gender = MALE + if(!offspring_type) + offspring_type = type + love_message = list("\n[src] is so happy, \he could rip a seam!") partner_message = list("\n[src] has a ring on \his finger! It says bound to my dear [partner].") heartbroken_message = list("\n[src] looks so sad.") @@ -290,19 +296,15 @@ mood_message = pick(partner_message) update_desc() -/obj/item/toy/plush/proc/plop(obj/item/toy/plush/Daddy) - if(partner != Daddy) +/obj/item/toy/plush/proc/plop(obj/item/toy/plush/daddy) + if(partner != daddy) return FALSE //we do not have bastards in our toyshop - if(is_type_in_typecache(Daddy, breeding_blacklist)) - return FALSE // some love is forbidden - - if(prob(50)) //it has my eyes - plush_child = new type(get_turf(loc)) - else //it has your eyes - plush_child = new Daddy.type(get_turf(loc)) + // Ask the RNG if it looks more like mommy or daddy. + var/chosen_type = pick(offspring_type, daddy.offspring_type) - plush_child.make_young(src, Daddy) + plush_child = new chosen_type(get_turf(loc)) + plush_child.make_young(src, daddy) /obj/item/toy/plush/proc/make_young(obj/item/toy/plush/Mama, obj/item/toy/plush/Dada) if(Mama == Dada) diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm deleted file mode 100644 index e8fe75c74b36..000000000000 --- a/code/game/objects/items/pneumaticCannon.dm +++ /dev/null @@ -1,346 +0,0 @@ - -#define PCANNON_FIREALL 1 -#define PCANNON_FILO 2 -#define PCANNON_FIFO 3 -///Defines for the pressure strength of the cannon -#define LOW_PRESSURE 1 -#define MID_PRESSURE 2 -#define HIGH_PRESSURE 3 - -/obj/item/pneumatic_cannon - name = "pneumatic cannon" - desc = "A gas-powered cannon that can fire any object loaded into it." - w_class = WEIGHT_CLASS_BULKY - force = 8 //Very heavy - attack_verb_continuous = list("bludgeons", "smashes", "beats") - attack_verb_simple = list("bludgeon", "smash", "beat") - icon = 'icons/obj/weapons/pneumaticCannon.dmi' - icon_state = "pneumaticCannon" - inhand_icon_state = "bulldog" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - armor_type = /datum/armor/item_pneumatic_cannon - var/maxWeightClass = 20 //The max weight of items that can fit into the cannon - var/loadedWeightClass = 0 //The weight of items currently in the cannon - var/obj/item/tank/internals/tank = null //The gas tank that is drawn from to fire things - var/gasPerThrow = 3 //How much gas is drawn from a tank's pressure to fire - var/list/loadedItems = list() //The items loaded into the cannon that will be fired out - var/pressure_setting = LOW_PRESSURE //How powerful the cannon is - higher pressure = more gas but more powerful throws - var/checktank = TRUE - var/range_multiplier = 1 - var/throw_amount = 1 //How many items to throw per fire - var/fire_mode = PCANNON_FIFO - var/automatic = FALSE - var/needs_air = TRUE - var/clumsyCheck = TRUE - var/list/allowed_typecache //Leave as null to allow all. - var/charge_amount = 1 - var/charge_ticks = 1 - var/charge_tick = 0 - var/charge_type - var/selfcharge = FALSE - var/fire_sound = 'sound/items/weapons/sonic_jackhammer.ogg' - var/spin_item = TRUE //Do the projectiles spin when launched? - trigger_guard = TRIGGER_GUARD_NORMAL - - -/datum/armor/item_pneumatic_cannon - fire = 60 - acid = 50 - -/obj/item/pneumatic_cannon/Initialize(mapload) - . = ..() - if(selfcharge) - init_charge() - -/obj/item/pneumatic_cannon/proc/init_charge() //wrapper so it can be vv'd easier - START_PROCESSING(SSobj, src) - -/obj/item/pneumatic_cannon/process() - charge_tick++ - if(charge_tick >= charge_ticks && charge_type) - fill_with_type(charge_type, charge_amount) - -/obj/item/pneumatic_cannon/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/pneumatic_cannon/CanItemAutoclick() - return automatic - -/obj/item/pneumatic_cannon/proc/pressure_setting_to_text(pressure_setting) - switch(pressure_setting) - if(LOW_PRESSURE) - return "low" - if(MID_PRESSURE) - return "medium" - if(HIGH_PRESSURE) - return "high" - else - CRASH("Invalid pressure setting: [pressure_setting]!") - -/obj/item/pneumatic_cannon/examine(mob/user) - . = ..() - var/list/out = list() - if(!in_range(user, src)) - out += span_notice("You'll need to get closer to see any more.") - return - for(var/obj/item/I in loadedItems) - out += span_info("[icon2html(I, user)] It has \a [I] loaded.") - CHECK_TICK - if(tank) - out += span_notice("[icon2html(tank, user)] It has \a [tank] mounted onto it. It could be removed with a screwdriver.") - if(needs_air == TRUE) - . += span_notice("Use a wrench to change the pressure level. Current output level is [pressure_setting_to_text(pressure_setting)].") - . += out.Join("\n") - -/obj/item/pneumatic_cannon/screwdriver_act(mob/living/user, obj/item/tool) - if(tank) - tool.play_tool_sound(src) - updateTank(tank, 1, user) - return TRUE - -/obj/item/pneumatic_cannon/wrench_act(mob/living/user, obj/item/tool) - if(needs_air == FALSE) - return - playsound(src, 'sound/items/tools/ratchet.ogg', 50, TRUE) - pressure_setting = pressure_setting >= HIGH_PRESSURE ? LOW_PRESSURE : pressure_setting + 1 - balloon_alert(user, "output level set to [pressure_setting_to_text(pressure_setting)]") - return TRUE - -/obj/item/pneumatic_cannon/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers) - if(user.combat_mode) - return ..() - if(istype(W, /obj/item/tank/internals)) - if(needs_air == FALSE) - return - if(!tank) - var/obj/item/tank/internals/IT = W - if(IT.volume <= 3) - to_chat(user, span_warning("\The [IT] is too small for \the [src].")) - return - updateTank(W, 0, user) - else if(W.type == type) - to_chat(user, span_warning("You're fairly certain that putting a pneumatic cannon inside another pneumatic cannon would cause a spacetime disruption.")) - else if(loadedWeightClass >= maxWeightClass) - to_chat(user, span_warning("\The [src] can't hold any more items!")) - else if(isitem(W)) - var/obj/item/IW = W - load_item(IW, user) - -/obj/item/pneumatic_cannon/proc/can_load_item(obj/item/I, mob/user) - if(!istype(I)) //Players can't load non items, this allows for admin varedit inserts. - return TRUE - if(allowed_typecache && !is_type_in_typecache(I, allowed_typecache)) - if(user) - to_chat(user, span_warning("[I] won't fit into [src]!")) - return - if((loadedWeightClass + I.w_class) > maxWeightClass) //Only make messages if there's a user - if(user) - to_chat(user, span_warning("\The [I] won't fit into \the [src]!")) - return FALSE - if(I.w_class > w_class) - if(user) - to_chat(user, span_warning("\The [I] is too large to fit into \the [src]!")) - return FALSE - return TRUE - -/obj/item/pneumatic_cannon/proc/load_item(obj/item/I, mob/user) - if(!can_load_item(I, user)) - return FALSE - if(user) //Only use transfer proc if there's a user, otherwise just set loc. - if(!user.transferItemToLoc(I, src)) - return FALSE - to_chat(user, span_notice("You load \the [I] into \the [src].")) - else - I.forceMove(src) - loadedItems += I - if(isitem(I)) - loadedWeightClass += I.w_class - else - loadedWeightClass++ - return TRUE - -/obj/item/pneumatic_cannon/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - if(user.combat_mode) - return ITEM_INTERACT_SKIP_TO_ATTACK - Fire(user, interacting_with) - return ITEM_INTERACT_SUCCESS - -/obj/item/pneumatic_cannon/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - Fire(user, interacting_with) - return ITEM_INTERACT_SUCCESS - -/obj/item/pneumatic_cannon/proc/Fire(mob/living/user, atom/target) - if(!istype(user) && !target) - return - var/discharge = 0 - if(!can_trigger_gun(user)) - return - if(!loadedItems || !loadedWeightClass) - to_chat(user, span_warning("\The [src] has nothing loaded.")) - return - if(!tank && checktank) - to_chat(user, span_warning("\The [src] can't fire without a source of gas.")) - return - if(HAS_TRAIT(user, TRAIT_PACIFISM)) - to_chat(user, span_warning("You can't bring yourself to fire \the [src]! You don't want to risk harming anyone...") ) - return - if(tank && !tank.remove_air(gasPerThrow * pressure_setting)) - to_chat(user, span_warning("\The [src] lets out a weak hiss and doesn't react!")) - return - if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(75) && clumsyCheck && iscarbon(user)) - var/mob/living/carbon/C = user - C.visible_message(span_warning("[C] loses [C.p_their()] grip on [src], causing it to go off!"), span_userdanger("[src] slips out of your hands and goes off!")) - C.dropItemToGround(src, TRUE) - if(prob(10)) - target = get_turf(user) - else - var/list/possible_targets = range(3,src) - target = pick(possible_targets) - discharge = 1 - if(!discharge) - user.visible_message(span_danger("[user] fires \the [src]!"), \ - span_danger("You fire \the [src]!")) - log_combat(user, target, "fired at", src) - var/turf/T = get_target(target, get_turf(src)) - playsound(src, fire_sound, 50, TRUE) - fire_items(T, user) - if(pressure_setting >= 3 && iscarbon(user)) - var/mob/living/carbon/C = user - C.visible_message(span_warning("[C] is thrown down by the force of the cannon!"), span_userdanger("[src] slams into your shoulder, knocking you down!")) - C.Paralyze(60) - -/obj/item/pneumatic_cannon/proc/fire_items(turf/target, mob/user) - if(fire_mode == PCANNON_FIREALL) - for(var/obj/item/ITD in loadedItems) //Item To Discharge - if(!throw_item(target, ITD, user)) - break - else - for(var/i in 1 to throw_amount) - if(!loadedItems.len) - break - var/atom/movable/I - if(fire_mode == PCANNON_FILO) - I = loadedItems[loadedItems.len] - else - I = loadedItems[1] - if(!throw_item(target, I, user)) - break - -/obj/item/pneumatic_cannon/proc/throw_item(turf/target, atom/movable/AM, mob/user) - if(!istype(AM)) - return FALSE - loadedItems -= AM - if(isitem(AM)) - var/obj/item/I = AM - loadedWeightClass -= I.w_class - else - loadedWeightClass-- - AM.forceMove(get_turf(src)) - AM.throw_at(target, pressure_setting * 10 * range_multiplier, pressure_setting * 2, user, spin_item) - return TRUE - -/obj/item/pneumatic_cannon/proc/get_target(turf/target, turf/starting) - if(range_multiplier == 1) - return target - var/x_o = (target.x - starting.x) - var/y_o = (target.y - starting.y) - var/new_x = clamp((starting.x + (x_o * range_multiplier)), 0, world.maxx) - var/new_y = clamp((starting.y + (y_o * range_multiplier)), 0, world.maxy) - var/turf/newtarget = locate(new_x, new_y, starting.z) - return newtarget - -/obj/item/pneumatic_cannon/Exited(atom/movable/gone, direction) - . = ..() - if(loadedItems.Remove(gone)) - var/obj/item/item = gone - if(istype(item)) - loadedWeightClass -= item.w_class - else - loadedWeightClass-- - else if (gone == tank) - tank = null - update_appearance() - -/obj/item/pneumatic_cannon/ghetto //Obtainable by improvised methods; more gas per use, less capacity - name = "improvised pneumatic cannon" - desc = "A gas-powered, object-firing cannon made out of common parts." - force = 5 - maxWeightClass = 10 - gasPerThrow = 5 - -/obj/item/pneumatic_cannon/proc/updateTank(obj/item/tank/internals/thetank, removing = 0, mob/living/carbon/human/user) - if(removing) - if(!tank) - return - to_chat(user, span_notice("You detach \the [thetank] from \the [src].")) - tank.forceMove(user.drop_location()) - user.put_in_hands(tank) - tank = null - if(!removing) - if(tank) - to_chat(user, span_warning("\The [src] already has a tank.")) - return - if(!user.transferItemToLoc(thetank, src)) - return - to_chat(user, span_notice("You hook \the [thetank] up to \the [src].")) - tank = thetank - update_appearance() - -/obj/item/pneumatic_cannon/update_overlays() - . = ..() - if(!tank) - return - . += tank.icon_state - -/obj/item/pneumatic_cannon/proc/fill_with_type(type, amount) - if(!ispath(type, /obj) && !ispath(type, /mob)) - return FALSE - var/loaded = 0 - for(var/i in 1 to amount) - var/obj/item/I = new type - if(!load_item(I, null)) - qdel(I) - return loaded - loaded++ - CHECK_TICK - -/obj/item/pneumatic_cannon/pie - name = "pie cannon" - desc = "Load cream pie for optimal results." - force = 10 - icon_state = "piecannon" - gasPerThrow = 0 - checktank = FALSE - range_multiplier = 3 - fire_mode = PCANNON_FIFO - throw_amount = 1 - maxWeightClass = 150 //50 pies. :^) - needs_air = FALSE - clumsyCheck = FALSE - var/static/list/pie_typecache = typecacheof(/obj/item/food/pie) - -/obj/item/pneumatic_cannon/pie/Initialize(mapload) - . = ..() - allowed_typecache = pie_typecache - -/obj/item/pneumatic_cannon/pie/selfcharge - automatic = TRUE - selfcharge = TRUE - charge_type = /obj/item/food/pie/cream - maxWeightClass = 60 //20 pies. - -/obj/item/pneumatic_cannon/pie/selfcharge/cyborg - name = "low velocity pie cannon" - automatic = FALSE - charge_type = /obj/item/food/pie/cream/nostun - maxWeightClass = 6 //2 pies - charge_ticks = 2 //4 second/pie - -#undef PCANNON_FIREALL -#undef PCANNON_FILO -#undef PCANNON_FIFO -#undef LOW_PRESSURE -#undef MID_PRESSURE -#undef HIGH_PRESSURE diff --git a/code/game/objects/items/pneumatic_cannon.dm b/code/game/objects/items/pneumatic_cannon.dm new file mode 100644 index 000000000000..8ea0ee60b67a --- /dev/null +++ b/code/game/objects/items/pneumatic_cannon.dm @@ -0,0 +1,347 @@ + +#define PCANNON_FIREALL 1 +#define PCANNON_FILO 2 +#define PCANNON_FIFO 3 +///Defines for the pressure strength of the cannon +#define LOW_PRESSURE 1 +#define MID_PRESSURE 2 +#define HIGH_PRESSURE 3 + +/obj/item/pneumatic_cannon + name = "pneumatic cannon" + desc = "A gas-powered cannon that can fire any object loaded into it." + w_class = WEIGHT_CLASS_BULKY + force = 8 //Very heavy + attack_verb_continuous = list("bludgeons", "smashes", "beats") + attack_verb_simple = list("bludgeon", "smash", "beat") + icon = 'icons/obj/weapons/pneumaticCannon.dmi' + icon_state = "pneumaticCannon" + inhand_icon_state = "bulldog" + lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + armor_type = /datum/armor/item_pneumatic_cannon + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6) + var/maxWeightClass = 20 //The max weight of items that can fit into the cannon + var/loadedWeightClass = 0 //The weight of items currently in the cannon + var/obj/item/tank/internals/tank = null //The gas tank that is drawn from to fire things + var/gasPerThrow = 3 //How much gas is drawn from a tank's pressure to fire + var/list/loadedItems = list() //The items loaded into the cannon that will be fired out + var/pressure_setting = LOW_PRESSURE //How powerful the cannon is - higher pressure = more gas but more powerful throws + var/checktank = TRUE + var/range_multiplier = 1 + var/throw_amount = 1 //How many items to throw per fire + var/fire_mode = PCANNON_FIFO + var/automatic = FALSE + var/needs_air = TRUE + var/clumsyCheck = TRUE + var/list/allowed_typecache //Leave as null to allow all. + var/charge_amount = 1 + var/charge_ticks = 1 + var/charge_tick = 0 + var/charge_type + var/selfcharge = FALSE + var/fire_sound = 'sound/items/weapons/sonic_jackhammer.ogg' + var/spin_item = TRUE //Do the projectiles spin when launched? + trigger_guard = TRIGGER_GUARD_NORMAL + + +/datum/armor/item_pneumatic_cannon + fire = 60 + acid = 50 + +/obj/item/pneumatic_cannon/Initialize(mapload) + . = ..() + if(selfcharge) + init_charge() + +/obj/item/pneumatic_cannon/proc/init_charge() //wrapper so it can be vv'd easier + START_PROCESSING(SSobj, src) + +/obj/item/pneumatic_cannon/process() + charge_tick++ + if(charge_tick >= charge_ticks && charge_type) + fill_with_type(charge_type, charge_amount) + +/obj/item/pneumatic_cannon/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/pneumatic_cannon/CanItemAutoclick() + return automatic + +/obj/item/pneumatic_cannon/proc/pressure_setting_to_text(pressure_setting) + switch(pressure_setting) + if(LOW_PRESSURE) + return "low" + if(MID_PRESSURE) + return "medium" + if(HIGH_PRESSURE) + return "high" + else + CRASH("Invalid pressure setting: [pressure_setting]!") + +/obj/item/pneumatic_cannon/examine(mob/user) + . = ..() + var/list/out = list() + if(!in_range(user, src)) + out += span_notice("You'll need to get closer to see any more.") + return + for(var/obj/item/I in loadedItems) + out += span_info("[icon2html(I, user)] It has \a [I] loaded.") + CHECK_TICK + if(tank) + out += span_notice("[icon2html(tank, user)] It has \a [tank] mounted onto it. It could be removed with a screwdriver.") + if(needs_air == TRUE) + . += span_notice("Use a wrench to change the pressure level. Current output level is [pressure_setting_to_text(pressure_setting)].") + . += out.Join("\n") + +/obj/item/pneumatic_cannon/screwdriver_act(mob/living/user, obj/item/tool) + if(tank) + tool.play_tool_sound(src) + updateTank(tank, 1, user) + return TRUE + +/obj/item/pneumatic_cannon/wrench_act(mob/living/user, obj/item/tool) + if(needs_air == FALSE) + return + playsound(src, 'sound/items/tools/ratchet.ogg', 50, TRUE) + pressure_setting = pressure_setting >= HIGH_PRESSURE ? LOW_PRESSURE : pressure_setting + 1 + balloon_alert(user, "output level set to [pressure_setting_to_text(pressure_setting)]") + return TRUE + +/obj/item/pneumatic_cannon/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers) + if(user.combat_mode) + return ..() + if(istype(W, /obj/item/tank/internals)) + if(needs_air == FALSE) + return + if(!tank) + var/obj/item/tank/internals/IT = W + if(IT.volume <= 3) + to_chat(user, span_warning("\The [IT] is too small for \the [src].")) + return + updateTank(W, 0, user) + else if(W.type == type) + to_chat(user, span_warning("You're fairly certain that putting a pneumatic cannon inside another pneumatic cannon would cause a spacetime disruption.")) + else if(loadedWeightClass >= maxWeightClass) + to_chat(user, span_warning("\The [src] can't hold any more items!")) + else if(isitem(W)) + var/obj/item/IW = W + load_item(IW, user) + +/obj/item/pneumatic_cannon/proc/can_load_item(obj/item/I, mob/user) + if(!istype(I)) //Players can't load non items, this allows for admin varedit inserts. + return TRUE + if(allowed_typecache && !is_type_in_typecache(I, allowed_typecache)) + if(user) + to_chat(user, span_warning("[I] won't fit into [src]!")) + return + if((loadedWeightClass + I.w_class) > maxWeightClass) //Only make messages if there's a user + if(user) + to_chat(user, span_warning("\The [I] won't fit into \the [src]!")) + return FALSE + if(I.w_class > w_class) + if(user) + to_chat(user, span_warning("\The [I] is too large to fit into \the [src]!")) + return FALSE + return TRUE + +/obj/item/pneumatic_cannon/proc/load_item(obj/item/I, mob/user) + if(!can_load_item(I, user)) + return FALSE + if(user) //Only use transfer proc if there's a user, otherwise just set loc. + if(!user.transferItemToLoc(I, src)) + return FALSE + to_chat(user, span_notice("You load \the [I] into \the [src].")) + else + I.forceMove(src) + loadedItems += I + if(isitem(I)) + loadedWeightClass += I.w_class + else + loadedWeightClass++ + return TRUE + +/obj/item/pneumatic_cannon/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(user.combat_mode) + return ITEM_INTERACT_SKIP_TO_ATTACK + Fire(user, interacting_with) + return ITEM_INTERACT_SUCCESS + +/obj/item/pneumatic_cannon/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + Fire(user, interacting_with) + return ITEM_INTERACT_SUCCESS + +/obj/item/pneumatic_cannon/proc/Fire(mob/living/user, atom/target) + if(!istype(user) && !target) + return + var/discharge = 0 + if(!can_trigger_gun(user)) + return + if(!loadedItems || !loadedWeightClass) + to_chat(user, span_warning("\The [src] has nothing loaded.")) + return + if(!tank && checktank) + to_chat(user, span_warning("\The [src] can't fire without a source of gas.")) + return + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + to_chat(user, span_warning("You can't bring yourself to fire \the [src]! You don't want to risk harming anyone...") ) + return + if(tank && !tank.remove_air(gasPerThrow * pressure_setting)) + to_chat(user, span_warning("\The [src] lets out a weak hiss and doesn't react!")) + return + if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(75) && clumsyCheck && iscarbon(user)) + var/mob/living/carbon/C = user + C.visible_message(span_warning("[C] loses [C.p_their()] grip on [src], causing it to go off!"), span_userdanger("[src] slips out of your hands and goes off!")) + C.dropItemToGround(src, TRUE) + if(prob(10)) + target = get_turf(user) + else + var/list/possible_targets = range(3,src) + target = pick(possible_targets) + discharge = 1 + if(!discharge) + user.visible_message(span_danger("[user] fires \the [src]!"), \ + span_danger("You fire \the [src]!")) + log_combat(user, target, "fired at", src) + var/turf/T = get_target(target, get_turf(src)) + playsound(src, fire_sound, 50, TRUE) + fire_items(T, user) + if(pressure_setting >= 3 && iscarbon(user)) + var/mob/living/carbon/C = user + C.visible_message(span_warning("[C] is thrown down by the force of the cannon!"), span_userdanger("[src] slams into your shoulder, knocking you down!")) + C.Paralyze(60) + +/obj/item/pneumatic_cannon/proc/fire_items(turf/target, mob/user) + if(fire_mode == PCANNON_FIREALL) + for(var/obj/item/ITD in loadedItems) //Item To Discharge + if(!throw_item(target, ITD, user)) + break + else + for(var/i in 1 to throw_amount) + if(!loadedItems.len) + break + var/atom/movable/I + if(fire_mode == PCANNON_FILO) + I = loadedItems[loadedItems.len] + else + I = loadedItems[1] + if(!throw_item(target, I, user)) + break + +/obj/item/pneumatic_cannon/proc/throw_item(turf/target, atom/movable/AM, mob/user) + if(!istype(AM)) + return FALSE + loadedItems -= AM + if(isitem(AM)) + var/obj/item/I = AM + loadedWeightClass -= I.w_class + else + loadedWeightClass-- + AM.forceMove(get_turf(src)) + AM.throw_at(target, pressure_setting * 10 * range_multiplier, pressure_setting * 2, user, spin_item) + return TRUE + +/obj/item/pneumatic_cannon/proc/get_target(turf/target, turf/starting) + if(range_multiplier == 1) + return target + var/x_o = (target.x - starting.x) + var/y_o = (target.y - starting.y) + var/new_x = clamp((starting.x + (x_o * range_multiplier)), 0, world.maxx) + var/new_y = clamp((starting.y + (y_o * range_multiplier)), 0, world.maxy) + var/turf/newtarget = locate(new_x, new_y, starting.z) + return newtarget + +/obj/item/pneumatic_cannon/Exited(atom/movable/gone, direction) + . = ..() + if(loadedItems.Remove(gone)) + var/obj/item/item = gone + if(istype(item)) + loadedWeightClass -= item.w_class + else + loadedWeightClass-- + else if (gone == tank) + tank = null + update_appearance() + +/obj/item/pneumatic_cannon/ghetto //Obtainable by improvised methods; more gas per use, less capacity + name = "improvised pneumatic cannon" + desc = "A gas-powered, object-firing cannon made out of common parts." + force = 5 + maxWeightClass = 10 + gasPerThrow = 5 + +/obj/item/pneumatic_cannon/proc/updateTank(obj/item/tank/internals/thetank, removing = 0, mob/living/carbon/human/user) + if(removing) + if(!tank) + return + to_chat(user, span_notice("You detach \the [thetank] from \the [src].")) + tank.forceMove(user.drop_location()) + user.put_in_hands(tank) + tank = null + if(!removing) + if(tank) + to_chat(user, span_warning("\The [src] already has a tank.")) + return + if(!user.transferItemToLoc(thetank, src)) + return + to_chat(user, span_notice("You hook \the [thetank] up to \the [src].")) + tank = thetank + update_appearance() + +/obj/item/pneumatic_cannon/update_overlays() + . = ..() + if(!tank) + return + . += tank.icon_state + +/obj/item/pneumatic_cannon/proc/fill_with_type(type, amount) + if(!ispath(type, /obj) && !ispath(type, /mob)) + return FALSE + var/loaded = 0 + for(var/i in 1 to amount) + var/obj/item/I = new type + if(!load_item(I, null)) + qdel(I) + return loaded + loaded++ + CHECK_TICK + +/obj/item/pneumatic_cannon/pie + name = "pie cannon" + desc = "Load cream pie for optimal results." + force = 10 + icon_state = "piecannon" + gasPerThrow = 0 + checktank = FALSE + range_multiplier = 3 + fire_mode = PCANNON_FIFO + throw_amount = 1 + maxWeightClass = 150 //50 pies. :^) + needs_air = FALSE + clumsyCheck = FALSE + var/static/list/pie_typecache = typecacheof(/obj/item/food/pie) + +/obj/item/pneumatic_cannon/pie/Initialize(mapload) + . = ..() + allowed_typecache = pie_typecache + +/obj/item/pneumatic_cannon/pie/selfcharge + automatic = TRUE + selfcharge = TRUE + charge_type = /obj/item/food/pie/cream + maxWeightClass = 60 //20 pies. + +/obj/item/pneumatic_cannon/pie/selfcharge/cyborg + name = "low velocity pie cannon" + automatic = FALSE + charge_type = /obj/item/food/pie/cream/nostun + maxWeightClass = 6 //2 pies + charge_ticks = 2 //4 second/pie + +#undef PCANNON_FIREALL +#undef PCANNON_FILO +#undef PCANNON_FIFO +#undef LOW_PRESSURE +#undef MID_PRESSURE +#undef HIGH_PRESSURE diff --git a/code/game/objects/items/rcd/RCD.dm b/code/game/objects/items/rcd/RCD.dm index 892cbe70489f..1e531a2ddcc6 100644 --- a/code/game/objects/items/rcd/RCD.dm +++ b/code/game/objects/items/rcd/RCD.dm @@ -68,9 +68,9 @@ design_category = GLOB.rcd_designs[root_category][1] var/list/design = GLOB.rcd_designs[root_category][design_category][1] - rcd_design_path = design["[RCD_DESIGN_PATH]"] + rcd_design_path = design[RCD_DESIGN_PATH] design_title = initial(rcd_design_path.name) - mode = design["[RCD_DESIGN_MODE]"] + mode = design[RCD_DESIGN_MODE] construction_mode = mode GLOB.rcd_list += src @@ -115,15 +115,13 @@ mode = RCD_TURF user.visible_message(span_suicide("[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide!")) - if(checkResource(16, user)) // It takes 16 resources to construct a wall + if(useResource(16, user)) // It takes 16 resources to construct a wall var/success = T.rcd_act(user, src, list("[RCD_DESIGN_MODE]" = RCD_TURF, "[RCD_DESIGN_PATH]" = /turf/open/floor/plating/rcd)) T = get_turf(user) // If the RCD placed a floor instead of a wall, having a wall without plating under it is cursed // There isn't an easy programmatical way to check if rcd_act will place a floor or a wall, so just repeat using it for free if(success && isopenturf(T)) T.rcd_act(user, src, list("[RCD_DESIGN_MODE]" = RCD_TURF, "[RCD_DESIGN_PATH]" = /turf/open/floor/plating/rcd)) - useResource(16, user) - activate() playsound(get_turf(user), SFX_TOOL_SWITCH, 20, TRUE) user.gib(DROP_ALL_REMAINS) return MANUAL_SUICIDE @@ -140,8 +138,8 @@ * * [mob][user]- the user */ /obj/item/construction/rcd/proc/can_place(atom/target, list/rcd_results, mob/user) - var/rcd_mode = rcd_results["[RCD_DESIGN_MODE]"] - var/atom/movable/rcd_structure = rcd_results["[RCD_DESIGN_PATH]"] + var/rcd_mode = rcd_results[RCD_DESIGN_MODE] + var/atom/movable/rcd_structure = rcd_results[RCD_DESIGN_PATH] /** *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 destroy something then this check is not necessary @@ -173,9 +171,18 @@ * if we are trying to create plating on turf which is not a proper floor then don't 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_mode == RCD_TURF && rcd_structure == /turf/open/floor/plating/rcd && (!istype(target_turf, /turf/open/floor) || istype(target, /obj/structure/girder))) + else if(rcd_mode == RCD_TURF && rcd_structure == /turf/open/floor/plating/rcd) //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(target, /obj/structure/girder) && target_turf.is_blocked_turf(exclude_mobs = FALSE, source_atom = null, ignore_atoms = list(target))) + var/list/ignore_types = list() + if(isturf(target)) + if(isfloorturf(target)) + ignore_types += /obj/structure/girder + else + ignore_types = null + else if(istype(target, /obj/structure/girder)) + ignore_types += /obj/structure/girder + + if(ignore_types && target_turf.is_blocked_turf(exclude_mobs = FALSE, source_atom = null, ignore_atoms = ignore_types, type_list = TRUE)) playsound(get_turf(user), SFX_TOOL_SWITCH, 20, TRUE) balloon_alert(user, "something is on the girder!") return FALSE @@ -250,8 +257,8 @@ balloon_alert(user, "too durable!") return ITEM_INTERACT_BLOCKING - rcd_results["[RCD_DESIGN_MODE]"] = mode - rcd_results["[RCD_DESIGN_PATH]"] = rcd_design_path + rcd_results[RCD_DESIGN_MODE] = mode + rcd_results[RCD_DESIGN_PATH] = rcd_design_path var/delay = rcd_results["delay"] * delay_mod if ( @@ -265,10 +272,10 @@ var/target_name = target.name //Store this information before it gets mutated by the rcd. var/target_path = target.type - var/atom/design_path = rcd_results["[RCD_DESIGN_PATH]"] + var/atom/design_path = rcd_results[RCD_DESIGN_PATH] var/location = AREACOORD(target) if(_rcd_create_effect(target, user, delay, rcd_results)) - log_tool("[key_name(user)] used [src] to [rcd_results["[RCD_DESIGN_MODE]"] != RCD_DECONSTRUCT ? "construct [initial(design_path.name)]([design_path])" : "deconstruct [target_name]([target_path])"] at [location]") + log_tool("[key_name(user)] used [src] to [rcd_results[RCD_DESIGN_MODE] != RCD_DECONSTRUCT ? "construct [initial(design_path.name)]([design_path])" : "deconstruct [target_name]([target_path])"] at [location]") current_active_effects -= 1 return ITEM_INTERACT_SUCCESS @@ -285,10 +292,10 @@ /obj/item/construction/rcd/proc/_rcd_create_effect(atom/target, mob/user, delay, list/rcd_results) PRIVATE_PROC(TRUE) - var/obj/effect/constructing_effect/rcd_effect = new(get_turf(target), delay, rcd_results["[RCD_DESIGN_MODE]"], construction_upgrades) + var/obj/effect/constructing_effect/rcd_effect = new(get_turf(target), delay, rcd_results[RCD_DESIGN_MODE], construction_upgrades) //resource & structure placement sanity checks before & after delay along with beam effects - if(!checkResource(rcd_results["cost"], user) || !can_place(target, rcd_results, user)) + if(!useResource(rcd_results["cost"], user, TRUE) || !can_place(target, rcd_results, user)) qdel(rcd_effect) return FALSE var/beam @@ -302,17 +309,14 @@ return FALSE if (QDELETED(rcd_effect)) return FALSE - if(!checkResource(rcd_results["cost"], user) || !can_place(target, rcd_results, user)) + if(!useResource(rcd_results["cost"], user, TRUE) || !can_place(target, rcd_results, user)) qdel(rcd_effect) return FALSE - if(!useResource(rcd_results["cost"], user)) - qdel(rcd_effect) - return FALSE - activate() if(!target.rcd_act(user, src, rcd_results)) qdel(rcd_effect) return FALSE + useResource(rcd_results["cost"], user) playsound(loc, 'sound/machines/click.ogg', 50, TRUE) rcd_effect.end_animation() return TRUE @@ -417,9 +421,9 @@ if(design == null) //not a valid design return TRUE design_category = category_name - mode = design["[RCD_DESIGN_MODE]"] + mode = design[RCD_DESIGN_MODE] construction_mode = mode - rcd_design_path = design["[RCD_DESIGN_PATH]"] + rcd_design_path = design[RCD_DESIGN_PATH] design_title = initial(rcd_design_path.name) blueprint_changed = TRUE @@ -486,31 +490,20 @@ max_matter = borgy.cell.maxcharge return borgy.cell.charge -/obj/item/construction/rcd/borg/useResource(amount, mob/user) - if(!iscyborg(user)) - return 0 - var/mob/living/silicon/robot/borgy = user - if(!borgy.cell) - if(user) - balloon_alert(user, "no cell found!") - return 0 - . = borgy.cell.use(amount * energyfactor) //borgs get 1.3x the use of their RCDs - if(!. && user) - balloon_alert(user, "insufficient charge!") - return . - -/obj/item/construction/rcd/borg/checkResource(amount, mob/user) - if(!iscyborg(user)) - return 0 +/obj/item/construction/rcd/borg/useResource(amount, mob/user, dry_run) var/mob/living/silicon/robot/borgy = user + if(!iscyborg(borgy)) + return FALSE if(!borgy.cell) - if(user) - balloon_alert(user, "no cell found!") - return 0 - . = borgy.cell.charge >= (amount * energyfactor) - if(!. && user) + balloon_alert(user, "no cell found!") + return FALSE + if(borgy.cell.charge < (amount * energyfactor)) balloon_alert(user, "insufficient charge!") - return . + return FALSE + if(!dry_run) + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + return borgy.cell.use(amount * energyfactor) + return TRUE /obj/item/construction/rcd/borg/syndicate name = "syndicate RCD" @@ -603,28 +596,37 @@ var/obj/vehicle/sealed/mecha/gundam = owner return round(gundam.get_charge() / MASS_TO_ENERGY) -/obj/item/construction/rcd/exosuit/useResource(amount, mob/user) +/obj/item/construction/rcd/exosuit/useResource(amount, mob/user, dry_run) if(silo_link) return ..() if(!ismecha(owner)) - return 0 - var/obj/vehicle/sealed/mecha/gundam = owner - if(!gundam.use_energy(amount * MASS_TO_ENERGY)) - gundam.balloon_alert(user, "insufficient charge!") return FALSE - return TRUE - -/obj/item/construction/rcd/exosuit/checkResource(amount, mob/user) - if(silo_link) - return ..() - if(!ismecha(owner)) - return 0 var/obj/vehicle/sealed/mecha/gundam = owner if(!gundam.has_charge(amount * MASS_TO_ENERGY)) gundam.balloon_alert(user, "insufficient charge!") return FALSE + if(!dry_run) + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + return gundam.use_energy(amount * MASS_TO_ENERGY) return TRUE +/obj/item/construction/rcd/exosuit/detonate_pulse() + var/obj/item/mecha_parts/mecha_equipment/rcd/ourshell = loc + if(!istype(ourshell)) + return + ourshell.audible_message(span_danger("[ourshell] begins to vibrate and buzz loudly!"), \ + span_danger("[ourshell] begins vibrating violently!")) + // 5 seconds to get rid of it + addtimer(CALLBACK(src, PROC_REF(detonate_pulse_explode)), 5 SECONDS) + +/obj/item/construction/rcd/exosuit/detonate_pulse_explode() + var/obj/item/mecha_parts/mecha_equipment/rcd/ourshell = loc + explosion(ourshell, light_impact_range = 3, flame_range = 1, flash_range = 1) + if(owner) + ourshell.detach() + qdel(ourshell) + + #undef MASS_TO_ENERGY #undef FREQUENT_USE_DEBUFF_MULTIPLIER diff --git a/code/game/objects/items/rcd/RCL.dm b/code/game/objects/items/rcd/RCL.dm index 1d966d37670f..6c48d2f691d7 100644 --- a/code/game/objects/items/rcd/RCL.dm +++ b/code/game/objects/items/rcd/RCL.dm @@ -324,6 +324,7 @@ max_amount = 30 name = "makeshift rapid pipe cleaner layer" ghetto = TRUE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 15) /obj/item/rcl/ghetto/update_icon_state() if(!loaded) diff --git a/code/game/objects/items/rcd/RHD.dm b/code/game/objects/items/rcd/RHD.dm index 53e5ba0cb7dd..ccd2b9f50639 100644 --- a/code/game/objects/items/rcd/RHD.dm +++ b/code/game/objects/items/rcd/RHD.dm @@ -35,7 +35,7 @@ /// bitflags for banned upgrades var/banned_upgrades = NONE /// remote connection to the silo - var/datum/component/remote_materials/silo_mats + var/datum/remote_materials/silo_mats /// switch to use internal or remote storage var/silo_link = FALSE /// has the blueprint design changed @@ -51,9 +51,13 @@ spark_system.set_up(5, 0, src) spark_system.attach(src) if(construction_upgrades & RCD_UPGRADE_SILO_LINK) - silo_mats = AddComponent(/datum/component/remote_materials, mapload, FALSE) + silo_mats = new (src, mapload, FALSE) update_appearance() +/obj/item/construction/Destroy() + QDEL_NULL(silo_mats) + return ..() + ///An do_after() specially designed for rhd devices /obj/item/construction/proc/build_delay(mob/user, delay, atom/target) if(delay <= 0) @@ -122,7 +126,7 @@ return FALSE construction_upgrades |= design_disk.upgrade if((design_disk.upgrade & RCD_UPGRADE_SILO_LINK) && !silo_mats) - silo_mats = AddComponent(/datum/component/remote_materials, FALSE, FALSE) + silo_mats = new (src, FALSE, FALSE) playsound(loc, 'sound/machines/click.ogg', 50, TRUE) qdel(design_disk) update_static_data_for_all_viewers() @@ -166,9 +170,6 @@ balloon_alert(user, "storage full!") return FALSE -/obj/item/construction/proc/activate() - playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) - /obj/item/construction/attack_self(mob/user) playsound(loc, 'sound/effects/pop.ogg', 50, FALSE) if(prob(20)) @@ -181,27 +182,39 @@ if(ratio > 0) . += "[icon_state]_charge[ratio]" -/obj/item/construction/proc/useResource(amount, mob/user) +/** + * Uses resource to do some action. Returns amount of resource used or TRUE/FALSE if only an dry run is required + * + * Arguments + * * amount - the amount of resource to use + * * mob/user - the player using the resource + * * dry_run - if TRUE will only check if the amount of resource is available but will not use any +*/ +/obj/item/construction/proc/useResource(amount, mob/user, dry_run = FALSE) if(!silo_mats || !silo_link) if(matter < amount) + if(has_ammobar) + flick("[icon_state]_empty", src) if(user) balloon_alert(user, "not enough matter!") return FALSE - matter -= amount - update_appearance() - return TRUE + if(!dry_run) + matter -= amount + update_appearance() + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) else - if(!silo_mats.mat_container) + if(!silo_mats.can_use_resource(user_data = ID_DATA(user))) if(user) - balloon_alert(user, "no silo detected!") + balloon_alert(user, "permission denied!") return FALSE - 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 - silo_mats.use_materials(list(/datum/material/iron = SILO_USE_AMOUNT), multiplier = amount, action = "RESTOCKED", name = "x restocked an RCD", user_data = ID_DATA(user)) - return TRUE + if(!dry_run) + amount = silo_mats.use_materials(list(/datum/material/iron = SILO_USE_AMOUNT), multiplier = amount, action = "RESTOCKED", name = "x restocked an RCD", user_data = ID_DATA(user)) + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + return dry_run ? TRUE : amount /obj/item/construction/ui_static_data(mob/user) . = list() @@ -254,23 +267,6 @@ /obj/item/construction/proc/handle_ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) return null -/obj/item/construction/proc/checkResource(amount, mob/user) - if(!silo_mats || !silo_mats.mat_container || !silo_link) - if(silo_link) - balloon_alert(user, "silo link invalid!") - return FALSE - else - . = matter >= amount - else - if(!silo_mats.can_use_resource(user_data = ID_DATA(user))) - return FALSE - . = 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) - flick("[icon_state]_empty", src) //somewhat hacky thing to make RCDs with ammo counters actually have a blinking yellow light - return . - /obj/item/construction/proc/range_check(atom/target, mob/user) if(target.z != user.z) return diff --git a/code/game/objects/items/rcd/RLD.dm b/code/game/objects/items/rcd/RLD.dm index 27e0b14b084d..88681dade527 100644 --- a/code/game/objects/items/rcd/RLD.dm +++ b/code/game/objects/items/rcd/RLD.dm @@ -1,11 +1,11 @@ // RAPID LIGHTING DEVICE -// modes of operation +//modes of operation #define GLOW_MODE 1 #define LIGHT_MODE 2 #define REMOVE_MODE 3 -// operation costs +//operation costs #define LIGHT_TUBE_COST 10 #define FLOOR_LIGHT_COST 15 #define GLOW_STICK_COST 5 @@ -32,7 +32,6 @@ /// mode of operation see above defines var/mode = LIGHT_MODE - ///reference to thr original icons var/static/list/original_options = list( "Color Pick" = icon(icon = 'icons/hud/radial.dmi', icon_state = "omni"), @@ -42,6 +41,7 @@ ) ///will contain the original icons modified with the color choice var/list/display_options = list() + ///Current color choice var/color_choice = "#ffffff" /obj/item/construction/rld/Initialize(mapload) @@ -69,7 +69,7 @@ mode = GLOW_MODE to_chat(user, span_notice("You change RLD's mode to 'Light Launcher'.")) if("Color Pick") - var/new_choice = input(user,"","Choose Color",color_choice) as color + var/new_choice = tgui_color_picker(user, "", "Choose Color", color_choice) if(new_choice == null) return @@ -78,7 +78,7 @@ if(option == "Color Pick" || option == "Deconstruct" || option == "Silo Link") continue var/icon/icon = icon(original_options[option]) - icon.SetIntensity(new_rgb[1]/255, new_rgb[2]/255, new_rgb[3]/255) //apply new scale + icon.SetIntensity(new_rgb[1] / 255, new_rgb[2] / 255, new_rgb[3] / 255) //apply new scale display_options[option] = icon color_choice = new_choice @@ -101,8 +101,8 @@ /** * Try to place/remove a light or throw a glowstick - * Arguments * + * Arguments * * atom/interacting_with - the target atom to light or throw glowsticks at * * mob/user - the player doing this action */ @@ -119,26 +119,24 @@ return NONE //resource sanity checks before & after delay - if(!checkResource(DECONSTRUCT_COST, user)) + if(!useResource(DECONSTRUCT_COST, user, TRUE)) return ITEM_INTERACT_BLOCKING var/beam = user.Beam(interacting_with, icon_state="light_beam", time = 15) playsound(src, 'sound/machines/click.ogg', 50, TRUE) if(!do_after(user, REMOVE_DELAY, target = interacting_with)) qdel(beam) return ITEM_INTERACT_BLOCKING - if(!checkResource(DECONSTRUCT_COST, user)) + if(!useResource(DECONSTRUCT_COST, user, TRUE)) return ITEM_INTERACT_BLOCKING - if(!useResource(DECONSTRUCT_COST, user)) - return ITEM_INTERACT_BLOCKING - activate() qdel(interacting_with) + useResource(DECONSTRUCT_COST, user) return ITEM_INTERACT_SUCCESS if(LIGHT_MODE) //resource sanity checks before & after delay var/cost = iswallturf(interacting_with) ? LIGHT_TUBE_COST : FLOOR_LIGHT_COST - if(!checkResource(cost, user)) + if(!useResource(cost, user, TRUE)) return ITEM_INTERACT_BLOCKING var/beam = user.Beam(interacting_with, icon_state="light_beam", time = BUILD_DELAY) playsound(loc, 'sound/machines/click.ogg', 50, TRUE) @@ -146,7 +144,7 @@ if(!do_after(user, BUILD_DELAY, target = interacting_with)) qdel(beam) return ITEM_INTERACT_BLOCKING - if(!checkResource(cost, user)) + if(!useResource(cost, user, TRUE)) return ITEM_INTERACT_BLOCKING if(iswallturf(interacting_with)) @@ -173,31 +171,26 @@ if(!winner) balloon_alert(user, "no valid target!") return ITEM_INTERACT_BLOCKING - if(!useResource(cost, user)) - return ITEM_INTERACT_BLOCKING - activate() var/obj/machinery/light/L = new /obj/machinery/light(get_turf(winner)) L.setDir(get_dir(winner, interacting_with)) L.color = color_choice L.set_light_color(color_choice) + useResource(cost, user) return ITEM_INTERACT_SUCCESS if(isfloorturf(interacting_with)) var/turf/target = get_turf(interacting_with) if(locate(/obj/machinery/light/floor) in target) return ITEM_INTERACT_BLOCKING - if(!useResource(cost, user)) - return ITEM_INTERACT_BLOCKING - activate() var/obj/machinery/light/floor/FL = new /obj/machinery/light/floor(target) FL.color = color_choice FL.set_light_color(color_choice) + useResource(cost, user) return ITEM_INTERACT_SUCCESS if(GLOW_MODE) if(!useResource(GLOW_STICK_COST, user)) return ITEM_INTERACT_BLOCKING - activate() // Picks the closest fitting color for the fluid by hue var/closest_diff = null var/closest_fluid = null diff --git a/code/game/objects/items/rcd/RPLD.dm b/code/game/objects/items/rcd/RPLD.dm index 043d99125c08..d14d78e6b99a 100644 --- a/code/game/objects/items/rcd/RPLD.dm +++ b/code/game/objects/items/rcd/RPLD.dm @@ -197,26 +197,24 @@ //resource & placement sanity check before & after delay var/is_allowed = TRUE - if(!checkResource(cost, user) || !(is_allowed = canPlace(destination))) + if(!useResource(cost, user, TRUE) || !(is_allowed = canPlace(destination))) if(!is_allowed) balloon_alert(user, "tile is blocked!") return FALSE if(!build_delay(user, cost, target = destination)) return FALSE - if(!checkResource(cost, user) || !(is_allowed = canPlace(destination))) + if(!useResource(cost, user, TRUE) || !(is_allowed = canPlace(destination))) if(!is_allowed) balloon_alert(user, "tile is blocked!") return FALSE - if(!useResource(cost, user)) - return FALSE - activate() playsound(loc, 'sound/machines/click.ogg', 50, TRUE) if(ispath(blueprint, /obj/machinery/duct)) var/is_omni = current_color == DUCT_COLOR_OMNI new blueprint(destination, FALSE, GLOB.pipe_paint_colors[current_color], GLOB.plumbing_layers[current_layer], null, is_omni) else new blueprint(destination, FALSE, GLOB.plumbing_layers[current_layer]) + useResource(cost, user) return TRUE /obj/item/construction/plumbing/proc/canPlace(turf/destination) @@ -312,6 +310,8 @@ 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" + ///Extra price because it appears in bartender's vendor + custom_premium_price = PAYCHECK_CREW * 6 ///Design types for plumbing service constructor var/static/list/service_design_types = list( //Category 1 synthesizers diff --git a/code/game/objects/items/rcd/RTD.dm b/code/game/objects/items/rcd/RTD.dm index 50f973246c80..b552fc33d4e1 100644 --- a/code/game/objects/items/rcd/RTD.dm +++ b/code/game/objects/items/rcd/RTD.dm @@ -285,7 +285,7 @@ return ITEM_INTERACT_BLOCKING //resource sanity check before & after delay along with special effects - if(!checkResource(selected_design.cost, user)) + if(!useResource(selected_design.cost, user, TRUE)) return ITEM_INTERACT_BLOCKING var/delay = CONSTRUCTION_TIME(selected_design.cost) var/obj/effect/constructing_effect/rcd_effect = new(floor, delay, RCD_TURF) @@ -299,15 +299,11 @@ qdel(beam) qdel(rcd_effect) return ITEM_INTERACT_BLOCKING - if(!checkResource(selected_design.cost, user)) + if(!useResource(selected_design.cost, user, TRUE)) qdel(rcd_effect) return ITEM_INTERACT_BLOCKING //do the tilling - if(!useResource(selected_design.cost, user)) - qdel(rcd_effect) - return ITEM_INTERACT_BLOCKING - activate() //step 1 create tile var/obj/item/stack/tile/final_tile = selected_design.new_tile(user.drop_location(), selected_direction) if(QDELETED(final_tile)) //if you were standing on a stack of tiles this newly spawned tile could get merged with it cause its spawned on your location @@ -320,6 +316,7 @@ for(var/datum/overlay_info/info in design_overlays) info.add_decal(new_turf) rcd_effect.end_animation() + useResource(selected_design.cost, user) return ITEM_INTERACT_SUCCESS @@ -357,7 +354,7 @@ return ITEM_INTERACT_BLOCKING //resource sanity check before & after delay along with beam effects - if(!checkResource(cost * 0.7, user)) //no ballon alert for checkResource as it already spans an alert to chat + if(!useResource(cost * 0.7, user, TRUE)) //no ballon alert for checkResource as it already spans an alert to chat return ITEM_INTERACT_BLOCKING var/delay = DECONSTRUCTION_TIME(cost) var/obj/effect/constructing_effect/rcd_effect = new(floor, delay, RCD_DECONSTRUCT) @@ -371,15 +368,11 @@ qdel(beam) qdel(rcd_effect) return ITEM_INTERACT_BLOCKING - if(!checkResource(cost * 0.7, user)) + if(!useResource(cost * 0.7, user, TRUE)) qdel(rcd_effect) return ITEM_INTERACT_BLOCKING //begin deconstruction - if(!useResource(cost * 0.7, user)) - qdel(rcd_effect) - return ITEM_INTERACT_BLOCKING - activate() //find & collect all decals var/list/all_decals = list() for(var/obj/effect/decal in floor.contents) @@ -393,6 +386,7 @@ else //for every other turf we scrape away exposing base turf underneath floor.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) rcd_effect.end_animation() + useResource(cost * 0.7, user) return ITEM_INTERACT_SUCCESS @@ -415,27 +409,20 @@ max_matter = borgy.cell.maxcharge return borgy.cell.charge -/obj/item/construction/rtd/borg/useResource(amount, mob/user) - if(!iscyborg(user)) - return 0 - var/mob/living/silicon/robot/borgy = user - if(!borgy.cell) - balloon_alert(user, "no cell found!") - return 0 - . = borgy.cell.use(amount * RTD_BORG_ENERGY_FACTOR) - if(!.) - balloon_alert(user, "insufficient charge!") - -/obj/item/construction/rtd/borg/checkResource(amount, mob/user) - if(!iscyborg(user)) - return 0 +/obj/item/construction/rtd/borg/useResource(amount, mob/user, dry_run) var/mob/living/silicon/robot/borgy = user + if(!iscyborg(borgy)) + return FALSE if(!borgy.cell) balloon_alert(user, "no cell found!") - return 0 - . = borgy.cell.charge >= (amount * RTD_BORG_ENERGY_FACTOR) - if(!.) + return FALSE + if(borgy.cell.charge < (amount * RTD_BORG_ENERGY_FACTOR)) balloon_alert(user, "insufficient charge!") + return FALSE + if(!dry_run) + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + return borgy.cell.use(amount * RTD_BORG_ENERGY_FACTOR) + return TRUE #undef RTD_BORG_ENERGY_FACTOR diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index 0d84fda683f2..e820a462ff53 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -9,6 +9,7 @@ attack_verb_simple = list("forcefully inspire", "violently encourage", "relentlessly galvanize") lefthand_file = 'icons/mob/inhands/equipment/banners_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/banners_righthand.dmi' + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) var/inspiration_available = TRUE //If this banner can be used to inspire crew var/morale_time = 0 var/morale_cooldown = 600 //How many deciseconds between uses @@ -66,8 +67,8 @@ /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) + need_mob_update += inspired_human.adjust_brute_loss(-15, updating_health = FALSE) + need_mob_update += inspired_human.adjust_fire_loss(-15, updating_health = FALSE) if(need_mob_update) inspired_human.updatehealth() inspired_human.AdjustStun(-4 SECONDS) @@ -129,8 +130,8 @@ /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) + need_mob_update += inspired_human.adjust_tox_loss(-15, updating_health = FALSE) + need_mob_update += inspired_human.set_oxy_loss(0, updating_health = FALSE) if(need_mob_update) inspired_human.updatehealth() inspired_human.reagents.add_reagent(/datum/reagent/medicine/inaprovaline, 5) @@ -404,8 +405,11 @@ /obj/item/claymore/weak desc = "This one is rusted." - force = 24 - armour_penetration = 10 + icon = 'icons/obj/weapons/sword.dmi' + icon_state = "claymore_old" + worn_icon = 'icons/mob/clothing/back.dmi' + force = 30 + armour_penetration = 15 /obj/item/claymore/weak/make_stabby() AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -9) diff --git a/code/game/objects/items/robot/items/generic.dm b/code/game/objects/items/robot/items/generic.dm index d282ae01b7f6..aee8274d2b8e 100644 --- a/code/game/objects/items/robot/items/generic.dm +++ b/code/game/objects/items/robot/items/generic.dm @@ -39,7 +39,7 @@ return user.do_attack_animation(attacked_mob) - attacked_mob.adjustStaminaLoss(stamina_damage) + attacked_mob.adjust_stamina_loss(stamina_damage) attacked_mob.set_confusion_if_lower(5 SECONDS) attacked_mob.adjust_stutter(20 SECONDS) attacked_mob.set_jitter_if_lower(5 SECONDS) @@ -174,7 +174,7 @@ ) else if(!iscyborg(attacked_mob)) - attacked_mob.adjustFireLoss(10) + attacked_mob.adjust_fire_loss(10) user.visible_message( span_userdanger("[user] shocks [attacked_mob]!"), span_danger("You shock [attacked_mob]!"), @@ -201,7 +201,7 @@ span_danger("You crush [attacked_mob]!"), ) playsound(loc, 'sound/items/weapons/smash.ogg', 50, TRUE, -1) - attacked_mob.adjustBruteLoss(15) + attacked_mob.adjust_brute_loss(15) user.cell.use(0.3 * STANDARD_CELL_CHARGE, force = TRUE) COOLDOWN_START(src, crush_cooldown, HUG_CRUSH_COOLDOWN) @@ -373,7 +373,7 @@ span_danger("The siren pierces your hearing!"), ) for(var/mob/living/carbon/carbon in get_hearers_in_view(9, user)) - if(carbon.get_ear_protection()) + if(carbon.get_ear_protection() > 0) continue carbon.adjust_confusion(6 SECONDS) @@ -386,18 +386,20 @@ to_chat(robot_user.connected_ai, "
[span_notice("NOTICE - Peacekeeping 'HARM ALARM' used by: [user]")]
") else user.audible_message("BZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZT") - for(var/mob/living/carbon/carbon in get_hearers_in_view(9, user)) - var/bang_effect = carbon.soundbang_act(2, 0, 0, 5) + for(var/mob/living/living in get_hearers_in_view(9, user)) + var/bang_effect = living.soundbang_act(SOUNDBANG_STRONG, 0, 0, 5) switch(bang_effect) + if(0) + continue if(1) - carbon.adjust_confusion(5 SECONDS) - carbon.adjust_stutter(20 SECONDS) - carbon.adjust_jitter(20 SECONDS) - if(2) - carbon.Paralyze(40) - carbon.adjust_confusion(10 SECONDS) - carbon.adjust_stutter(30 SECONDS) - carbon.adjust_jitter(50 SECONDS) + living.adjust_confusion(5 SECONDS) + living.adjust_stutter(20 SECONDS) + living.adjust_jitter(20 SECONDS) + else + living.Paralyze(4 SECONDS) + living.adjust_confusion(10 SECONDS) + living.adjust_stutter(30 SECONDS) + living.adjust_jitter(50 SECONDS) playsound(get_turf(src), 'sound/machines/warning-buzzer.ogg', 130, 3) COOLDOWN_START(src, alarm_cooldown, HARM_ALARM_NO_SAFETY_COOLDOWN) user.log_message("used an emagged Cyborg Harm Alarm", LOG_ATTACK) diff --git a/code/game/objects/items/robot/items/hypo.dm b/code/game/objects/items/robot/items/hypo.dm index c68d4e0bb262..2c80fdc35e47 100644 --- a/code/game/objects/items/robot/items/hypo.dm +++ b/code/game/objects/items/robot/items/hypo.dm @@ -112,13 +112,13 @@ * In most places we add + 1 because we're secretly keeping [max_volume_per_reagent + 1] * units, so that when this reagent runs out it's not wholesale removed from the reagents */ - var/max_volume_per_reagent = 30 + var/max_volume_per_reagent = 25 /// Cell cost for charging a reagent - var/charge_cost = 0.05 * STANDARD_CELL_CHARGE + var/charge_cost = 0.075 * STANDARD_CELL_CHARGE /// Counts up to the next time we charge var/charge_timer = 0 /// Time it takes for shots to recharge (in seconds) - var/recharge_time = 10 + var/recharge_time = 12 ///Optional variable to override the temperature add_reagent() will use var/dispensed_temperature = DEFAULT_REAGENT_TEMPERATURE /// If the hypospray can go through armor or thick material @@ -178,10 +178,12 @@ /obj/item/reagent_containers/borghypo/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!iscarbon(interacting_with)) return NONE + var/mob/living/carbon/injectee = interacting_with if(!selected_reagent) balloon_alert(user, "no reagent selected!") return ITEM_INTERACT_BLOCKING + if(!stored_reagents.has_reagent(selected_reagent.type, amount_per_transfer_from_this)) balloon_alert(user, "not enough [selected_reagent.name]!") return ITEM_INTERACT_BLOCKING @@ -190,19 +192,16 @@ balloon_alert(user, "[injectee.parse_zone_with_bodypart(user.zone_selected)] is blocked!") return ITEM_INTERACT_BLOCKING - // This is the in-between where we're storing the reagent we're going to inject the injectee with - // because we cannot specify a singular reagent to transfer in trans_to - var/datum/reagents/hypospray_injector = new() - stored_reagents.remove_reagent(selected_reagent.type, amount_per_transfer_from_this) - hypospray_injector.add_reagent(selected_reagent.type, amount_per_transfer_from_this, reagtemp = dispensed_temperature, no_react = TRUE) + if (!injectee.reagents) + balloon_alert(user, "unable to inject!") + return ITEM_INTERACT_BLOCKING to_chat(injectee, span_warning("You feel a tiny prick!")) 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, 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])") + user.changeNext_move(CLICK_CD_MELEE) + stored_reagents.trans_to(injectee, amount_per_transfer_from_this, target_id = selected_reagent.type, 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])") return ITEM_INTERACT_SUCCESS /obj/item/reagent_containers/borghypo/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/game/objects/items/robot/items/storage.dm b/code/game/objects/items/robot/items/storage.dm index a9e94b7c0d9e..8236b58108c2 100644 --- a/code/game/objects/items/robot/items/storage.dm +++ b/code/game/objects/items/robot/items/storage.dm @@ -209,6 +209,23 @@ item_flags = SURGICAL_TOOL storable = list(/obj/item/organ, /obj/item/bodypart) + /// Underlay of whatever we have stored + var/image/stored_underlay + +/obj/item/borg/apparatus/organ_storage/update_overlays() + . = ..() + if(stored_underlay) + underlays -= stored_underlay + if(!stored) + return + stored_underlay = image(stored) + stored_underlay.layer = FLOAT_LAYER + stored_underlay.plane = FLOAT_PLANE + stored_underlay.pixel_w = 0 + stored_underlay.pixel_x = 0 + stored_underlay.pixel_y = 0 + stored_underlay.pixel_z = 0 + underlays += stored_underlay /obj/item/borg/apparatus/organ_storage/examine() . = ..() @@ -220,22 +237,6 @@ . += "Nothing." . += span_notice(" Alt-click will drop the currently stored organ. ") -/obj/item/borg/apparatus/organ_storage/update_overlays() - . = ..() - icon_state = null // hides the original icon (otherwise it's drawn underneath) - var/mutable_appearance/bag - if(stored) - var/mutable_appearance/stored_organ = new /mutable_appearance(stored) - stored_organ.layer = FLOAT_LAYER - stored_organ.plane = FLOAT_PLANE - stored_organ.pixel_w = 0 - stored_organ.pixel_z = 0 - . += stored_organ - bag = mutable_appearance(icon, icon_state = "evidence") // full bag - else - bag = mutable_appearance(icon, icon_state = "evidenceobj") // empty bag - . += bag - /obj/item/borg/apparatus/organ_storage/click_alt(mob/living/silicon/robot/user) if(!stored) to_chat(user, span_notice("[src] is empty.")) @@ -243,8 +244,7 @@ var/obj/item/organ = stored user.visible_message(span_notice("[user] dumps [organ] from [src]."), span_notice("You dump [organ] from [src].")) - cut_overlays() - organ.forceMove(get_turf(src)) + organ.forceMove(drop_location()) return CLICK_ACTION_SUCCESS ///Apparatus to allow Engineering/Sabo borgs to manipulate any material sheets. @@ -254,7 +254,8 @@ icon_state = "borg_stack_apparatus" storable = list(/obj/item/stack/sheet, /obj/item/stack/tile, - /obj/item/stack/rods) + /obj/item/stack/rods, + /obj/item/stack/conveyor) /obj/item/borg/apparatus/sheet_manipulator/Initialize(mapload) update_appearance() @@ -292,6 +293,7 @@ /obj/item/electronics, /obj/item/stock_parts/power_store, /obj/item/light, + /obj/item/conveyor_switch_construct, ) /obj/item/borg/apparatus/engineering/Initialize(mapload) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 5dee6df43084..5264bca98bdf 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -170,17 +170,16 @@ if(istype(W, /obj/item/stack/sheet/iron)) var/obj/item/stack/sheet/iron/M = W if(!l_arm && !r_arm && !l_leg && !r_leg && !chest && !head) - if (M.use(1)) - var/obj/item/bot_assembly/ed209/B = new - B.forceMove(drop_location()) - to_chat(user, span_notice("You arm the robot frame.")) - var/holding_this = user.get_inactive_held_item() == src - qdel(src) - if (holding_this) - user.put_in_inactive_hand(B) - else + if (!M.use(1)) to_chat(user, span_warning("You need one sheet of iron to start building ED-209!")) return + var/obj/item/bot_assembly/ed209/assembly = new(drop_location()) + to_chat(user, span_notice("You arm the robot frame.")) + var/held_index = user.is_holding(src) + qdel(src) + if (held_index) + user.put_in_hand(assembly, held_index) + else if(istype(W, /obj/item/bodypart/leg/left/robot)) if(l_leg) return diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index a44bcd4e4870..e8a5a93ea666 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -359,8 +359,8 @@ else repair_amount = -1 energy_cost = 0.01 * STANDARD_CELL_CHARGE - cyborg.adjustBruteLoss(repair_amount) - cyborg.adjustFireLoss(repair_amount) + cyborg.adjust_brute_loss(repair_amount) + cyborg.adjust_fire_loss(repair_amount) cyborg.updatehealth() cyborg.cell.use(energy_cost) else diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index cbf5b6aed52a..ed6cf5d63857 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -1,4 +1,4 @@ -#define BATON_BASH_COOLDOWN (3 SECONDS) +#define WEAPON_BASH_COOLDOWN (3 SECONDS) /obj/item/shield name = "shield" @@ -26,7 +26,7 @@ /// sound the shield makes when it breaks var/shield_break_sound = 'sound/effects/bang.ogg' /// baton bash cooldown - COOLDOWN_DECLARE(baton_bash) + COOLDOWN_DECLARE(weapon_bash) /// is shield bashable? var/is_bashable = TRUE /// sound when a shield is bashed @@ -43,6 +43,7 @@ /obj/item/shield/Initialize(mapload) . = ..() AddElement(/datum/element/disarm_attack) + AddElement(/datum/element/cuffable_item) //I mean, it has a closed handle, right? /obj/item/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) var/effective_block_chance = final_block_chance @@ -53,7 +54,7 @@ if(attack_type == LEAP_ATTACK) effective_block_chance = 100 if(attack_type == OVERWHELMING_ATTACK) - effective_block_chance -= 25 + effective_block_chance = 0 final_block_chance = clamp(effective_block_chance, 0, 100) . = ..() if(.) @@ -74,13 +75,14 @@ . = ..() if(. & ITEM_INTERACT_ANY_BLOCKER) return . - if(!istype(tool, /obj/item/melee/baton) || !is_bashable) + if(!istype(tool, /obj/item/melee) || !is_bashable) return . - if(!COOLDOWN_FINISHED(src, baton_bash)) + if(!COOLDOWN_FINISHED(src, weapon_bash)) return ITEM_INTERACT_BLOCKING - user.visible_message(span_warning("[user] bashes [src] with [tool]!")) playsound(src, shield_bash_sound, 50, TRUE) - COOLDOWN_START(src, baton_bash, BATON_BASH_COOLDOWN) + user.manual_emote("bashes [src] with [tool]!") + COOLDOWN_START(src, weapon_bash, WEAPON_BASH_COOLDOWN) + user.Shake(3, 3, 0.5 SECONDS) return ITEM_INTERACT_SUCCESS /obj/item/shield/proc/on_shield_block(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) @@ -115,7 +117,7 @@ desc = "A medieval wooden buckler." icon_state = "buckler" inhand_icon_state = "buckler" - custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 10) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 20) resistance_flags = FLAMMABLE block_chance = 30 max_integrity = 55 @@ -129,6 +131,7 @@ block_chance = 40 max_integrity = 40 w_class = WEIGHT_CLASS_NORMAL + custom_materials = null /obj/item/shield/kite name = "kite shield" @@ -165,7 +168,7 @@ desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder, less so bullets and laser beams." icon_state = "riot" inhand_icon_state = "riot" - custom_materials = list(/datum/material/glass= SHEET_MATERIAL_AMOUNT * 3.75, /datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/glass= SHEET_MATERIAL_AMOUNT * 4.05, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.8) transparent = TRUE max_integrity = 75 shield_break_sound = 'sound/effects/glass/glassbr3.ogg' @@ -201,6 +204,7 @@ icon_state = "flashshield" inhand_icon_state = "flashshield" var/obj/item/assembly/flash/handheld/embedded_flash = /obj/item/assembly/flash/handheld + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5.1, /datum/material/glass= SHEET_MATERIAL_AMOUNT * 4.35) /obj/item/shield/riot/flash/Initialize(mapload) . = ..() @@ -343,7 +347,7 @@ var/effective_block_chance = final_block_chance if(attack_type == OVERWHELMING_ATTACK) - effective_block_chance -= 25 + effective_block_chance = 0 if(attack_type == PROJECTILE_ATTACK) var/obj/projectile/our_projectile = hitby @@ -477,10 +481,10 @@ desc = "A crude shield made out of several sheets of iron taped together, not very durable." icon_state = "improvised" inhand_icon_state = "improvised" - custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT * 2) + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 10) max_integrity = 35 shield_break_leftover = /obj/item/stack/rods/two armor_type = /datum/armor/item_shield/improvised block_sound = 'sound/items/trayhit/trayhit2.ogg' -#undef BATON_BASH_COOLDOWN +#undef WEAPON_BASH_COOLDOWN diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 8ed78cccc876..32b8c08747d6 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -5,7 +5,7 @@ icon_state = "target_h" density = FALSE max_integrity = 1800 - item_flags = CAN_BE_HIT + obj_flags = CAN_BE_HIT /// Lazylist to keep track of bullet-hole overlays. var/list/bullethole_overlays @@ -32,7 +32,7 @@ if(isnull(always_leave_marks)) always_leave_marks = typecacheof(list( /obj/projectile/beam/practice, - /obj/projectile/beam/laser/carbine/practice, + /obj/projectile/beam/laser/rapid/practice, )) var/is_invalid_damage = hitting_projectile.damage_type != BRUTE && hitting_projectile.damage_type != BURN diff --git a/code/game/objects/items/signs.dm b/code/game/objects/items/signs.dm index 671cad6780f2..6b70eb9cad8b 100644 --- a/code/game/objects/items/signs.dm +++ b/code/game/objects/items/signs.dm @@ -5,11 +5,12 @@ name = "blank picket sign" desc = "It's blank." force = 5 + obj_flags = UNIQUE_RENAME | RENAME_NO_DESC w_class = WEIGHT_CLASS_BULKY attack_verb_continuous = list("bashes", "smacks") attack_verb_simple = list("bash", "smack") resistance_flags = FLAMMABLE - + custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT * 2, /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) var/label = "" COOLDOWN_DECLARE(picket_sign_cooldown) @@ -20,21 +21,14 @@ resistance_flags = NONE actions_types = list(/datum/action/item_action/nano_picket_sign) -/obj/item/picket_sign/proc/retext(mob/user, obj/item/writing_instrument) - if(!user.can_write(writing_instrument)) - return - var/txt = tgui_input_text(user, "What would you like to write on the sign?", "Sign Label", max_length = 30) - if(txt && user.can_perform_action(src)) - playsound(src, SFX_WRITING_PEN, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, SOUND_FALLOFF_EXPONENT + 3, ignore_walls = FALSE) - label = txt - name = "[label] sign" - desc = "It reads: [label]" +/obj/item/picket_sign/nameformat(input, user) + playsound(src, SFX_WRITING_PEN, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, SOUND_FALLOFF_EXPONENT + 3, ignore_walls = FALSE) + label = input + AddComponent(/datum/component/rename, name, "It reads: [input]") + return "[input] sign" -/obj/item/picket_sign/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(IS_WRITING_UTENSIL(W)) - retext(user, W) - else - return ..() +/obj/item/picket_sign/rename_reset() + label = initial(label) /obj/item/picket_sign/attack_self(mob/living/carbon/human/user) if(!COOLDOWN_FINISHED(src, picket_sign_cooldown)) @@ -66,7 +60,10 @@ if(!istype(target, /obj/item/picket_sign)) return FALSE var/obj/item/picket_sign/sign = target - sign.retext(owner) + var/input = tgui_input_text(owner, "What would you like to write on the sign?", "Sign Label", max_length = 30) + if(input && owner.can_perform_action(sign)) + sign.label = input + sign.AddComponent(/datum/component/rename, "[input] sign", "It reads: [input]") return TRUE /datum/crafting_recipe/picket_sign diff --git a/code/game/objects/items/skateboards.dm b/code/game/objects/items/skateboards.dm new file mode 100644 index 000000000000..7b5e3c92d252 --- /dev/null +++ b/code/game/objects/items/skateboards.dm @@ -0,0 +1,67 @@ + +/obj/item/melee/skateboard + name = "skateboard" + desc = "A skateboard. It can be placed on its wheels and ridden, or used as a radical weapon." + icon = 'modular_darkpack/master_files/icons/mob/rideables/vehicles.dmi' // DARKPACK EDIT CHANGE - Darkpack skateboard icon + icon_state = "skateboard_held" + inhand_icon_state = "skateboard" + force = 12 + throwforce = 4 + w_class = WEIGHT_CLASS_NORMAL + attack_verb_continuous = list("smacks", "whacks", "slams", "smashes") + attack_verb_simple = list("smack", "whack", "slam", "smash") + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 10) + custom_price = 50 // DARKPACK EDIT ADD - ECONOMY + ///The vehicle counterpart for the board + var/board_item_type = /obj/vehicle/ridden/scooter/skateboard + +/obj/item/melee/skateboard/attack_self(mob/user) + var/obj/vehicle/ridden/scooter/skateboard/S = new board_item_type(get_turf(user))//this probably has fucky interactions with telekinesis but for the record it wasn't my fault + S.buckle_mob(user) + qdel(src) + +/obj/item/melee/skateboard/improvised + name = "improvised skateboard" + desc = "A jury-rigged skateboard. It can be placed on its wheels and ridden, or used as a radical weapon." + board_item_type = /obj/vehicle/ridden/scooter/skateboard/improvised + custom_price = 25 // DARKPACK EDIT ADD - ECONOMY + +/obj/item/melee/skateboard/pro + name = "skateboard" + desc = "An EightO brand professional skateboard. It looks sturdy and well made." + icon_state = "skateboard2_held" + inhand_icon_state = "skateboard2" + board_item_type = /obj/vehicle/ridden/scooter/skateboard/pro + custom_price = 150 // DARKPACK EDIT ADD - ECONOMY + custom_premium_price = PAYCHECK_COMMAND * 5 + +/obj/item/melee/skateboard/hoverboard + name = "hoverboard" + desc = "A blast from the past, so retro!" + icon_state = "hoverboard_red_held" + inhand_icon_state = "hoverboard_red" + board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard + custom_premium_price = PAYCHECK_COMMAND * 5.4 //If I can't make it a meme I'll make it RAD + +/obj/item/melee/skateboard/hoverboard/admin + name = "Board Of Directors" + desc = "The engineering complexity of a spaceship concentrated inside of a board. Just as expensive, too." + icon_state = "hoverboard_nt_held" + inhand_icon_state = "hoverboard_nt" + board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard/admin + +/obj/item/melee/skateboard/holyboard + name = "holy skateboard" + desc = "A board blessed by the gods with the power to grind for our sins. Has the initials 'J.C.' on the underside." + icon_state = "hoverboard_holy_held" + inhand_icon_state = "hoverboard_holy" + force = 18 + throwforce = 6 + w_class = WEIGHT_CLASS_NORMAL + attack_verb_continuous = list("bashes", "crashes", "grinds", "skates") + attack_verb_simple = list("bash", "crash", "grind", "skate") + board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard/holyboarded + +/obj/item/melee/skateboard/holyboard/Initialize(mapload) + . = ..() + AddElement(/datum/element/nullrod_core) diff --git a/code/game/objects/items/soulscythe.dm b/code/game/objects/items/soulscythe.dm index d58ae34de501..fad7413520d7 100644 --- a/code/game/objects/items/soulscythe.dm +++ b/code/game/objects/items/soulscythe.dm @@ -138,15 +138,15 @@ return TRUE /obj/item/soulscythe/proc/use_blood(amount = 0, message = TRUE) - if(amount > soul.blood_volume) + if(amount > soul.get_blood_volume()) if(message) to_chat(soul, span_warning("Not enough blood!")) return FALSE - soul.blood_volume -= amount + soul.adjust_blood_volume(-amount) return TRUE /obj/item/soulscythe/proc/give_blood(amount) - soul.blood_volume = min(MAX_BLOOD_LEVEL, soul.blood_volume + amount) + soul.adjust_blood_volume(amount, maximum = MAX_BLOOD_LEVEL) /obj/item/soulscythe/proc/on_resist(mob/living/user) SIGNAL_HANDLER @@ -256,17 +256,18 @@ gender = NEUTER mob_biotypes = MOB_SPIRIT faction = list() - blood_volume = MAX_BLOOD_LEVEL + default_blood_volume = MAX_BLOOD_LEVEL hud_type = /datum/hud/soulscythe + spawn_blacklisted = TRUE /mob/living/basic/soulscythe/Initialize(mapload) . = ..() - add_traits(list(TRAIT_ASHSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE), ROUNDSTART_TRAIT) + add_traits(list(TRAIT_ASHSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE, TRAIT_LAVA_IMMUNE), INNATE_TRAIT) RegisterSignal(src, COMSIG_LIVING_LIFE, PROC_REF(on_life)) /mob/living/basic/soulscythe/proc/on_life(datum/source, seconds_per_tick, times_fired) // done like this because there's no need to go through all of life since the item does the work anyways if(stat == CONSCIOUS) - blood_volume = min(MAX_BLOOD_LEVEL, blood_volume + round(1 * seconds_per_tick)) + adjust_blood_volume(round(1 * seconds_per_tick), maximum = MAX_BLOOD_LEVEL) return COMPONENT_LIVING_CANCEL_LIFE_PROCESSING /// Special projectile for the soulscythe. diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index d1658244ea6a..98350fc2ca97 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -8,14 +8,15 @@ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' icon_angle = -45 force = 10 + reach = 2 w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK throwforce = 20 throw_speed = 4 - demolition_mod = 0.75 + demolition_mod = 0.75 // Note: This is significant, as this needs to be low enough that any possible force adjustments from better spears does not go over airlock deflection. See AIRLOCK_DAMAGE_DEFLECTION_N. embed_type = /datum/embedding/spear - armour_penetration = 10 - custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass= HALF_SHEET_MATERIAL_AMOUNT * 2) + armour_penetration = 5 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.65, /datum/material/glass= SHEET_MATERIAL_AMOUNT * 1.15) hitsound = 'sound/items/weapons/bladeslice.ogg' attack_verb_continuous = list("attacks", "pokes", "jabs", "tears", "lacerates", "gores") attack_verb_simple = list("attack", "poke", "jab", "tear", "lacerate", "gore") @@ -32,6 +33,10 @@ var/force_unwielded = 10 /// How much damage to do wielded var/force_wielded = 18 + /// Whether or not hitting with this spear causes damage to the spear itself + var/improvised_construction = TRUE + /// What is left over when a spear breaks + var/spear_leftovers = /obj/item/stack/rods /datum/embedding/spear impact_pain_mult = 2 @@ -59,6 +64,8 @@ force_unwielded = force_unwielded, \ force_wielded = force_wielded, \ icon_wielded = "[icon_prefix]1", \ + wield_callback = CALLBACK(src, PROC_REF(on_wield)), \ + unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \ ) add_headpike_component() update_appearance() @@ -89,38 +96,89 @@ if(/obj/item/shard/plasma) force = 11 throwforce = 21 - custom_materials = list(/datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT, /datum/material/alloy/plasmaglass= HALF_SHEET_MATERIAL_AMOUNT * 2) icon_prefix = "spearplasma" + modify_max_integrity(220) + wound_bonus = -10 force_unwielded = 11 force_wielded = 19 - AddComponent(/datum/component/two_handed, force_unwielded=force_unwielded, force_wielded=force_wielded, icon_wielded="[icon_prefix]1") + AddComponent(/datum/component/two_handed, \ + force_unwielded = force_unwielded, \ + force_wielded = force_wielded, \ + icon_wielded = "[icon_prefix]1", \ + wield_callback = CALLBACK(src, PROC_REF(on_wield)), \ + unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \ + ) + if(/obj/item/shard/titanium) - force = 13 - throwforce = 21 + force = 12 + throwforce = 22 throw_range = 8 throw_speed = 5 - custom_materials = list(/datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT, /datum/material/alloy/titaniumglass= HALF_SHEET_MATERIAL_AMOUNT * 2) - wound_bonus = -10 - force_unwielded = 13 - force_wielded = 18 + modify_max_integrity(230) + wound_bonus = -5 + force_unwielded = 12 + force_wielded = 20 + armour_penetration = 10 icon_prefix = "speartitanium" - AddComponent(/datum/component/two_handed, force_unwielded=force_unwielded, force_wielded=force_wielded, icon_wielded="[icon_prefix]1") + AddComponent(/datum/component/two_handed, \ + force_unwielded = force_unwielded, \ + force_wielded = force_wielded, \ + icon_wielded = "[icon_prefix]1", \ + wield_callback = CALLBACK(src, PROC_REF(on_wield)), \ + unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \ + ) + if(/obj/item/shard/plastitanium) force = 13 - throwforce = 22 + throwforce = 23 throw_range = 9 throw_speed = 5 - custom_materials = list(/datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT, /datum/material/alloy/plastitaniumglass= HALF_SHEET_MATERIAL_AMOUNT * 2) - wound_bonus = -10 + modify_max_integrity(240) + wound_bonus = 0 exposed_wound_bonus = 20 force_unwielded = 13 - force_wielded = 20 + force_wielded = 21 + armour_penetration = 15 icon_prefix = "spearplastitanium" - AddComponent(/datum/component/two_handed, force_unwielded=force_unwielded, force_wielded=force_wielded, icon_wielded="[icon_prefix]1") + AddComponent(/datum/component/two_handed, \ + force_unwielded = force_unwielded, \ + force_wielded = force_wielded, \ + icon_wielded = "[icon_prefix]1", \ + wield_callback = CALLBACK(src, PROC_REF(on_wield)), \ + unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \ + ) update_appearance() return ..() +/obj/item/spear/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) + if(!improvised_construction) + return + take_damage(force/2, sound_effect = FALSE) + +/obj/item/spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + if (.) //spear was caught + return + if(!improvised_construction) + return + take_damage(throwforce/2, sound_effect = FALSE) + +/obj/item/spear/atom_destruction(damage_flag) + playsound(src, 'sound/effects/grillehit.ogg', 50) + new spear_leftovers(get_turf(src)) + if(isliving(loc)) + loc.balloon_alert(loc, "spear broken!") + return ..() + +/obj/item/spear/proc/on_wield(obj/item/source, mob/living/carbon/user) + reach = 1 + armour_penetration *= 2 + +/obj/item/spear/proc/on_unwield(obj/item/source, mob/living/carbon/user) + reach = 2 + armour_penetration /= 2 + /obj/item/spear/explosive name = "explosive lance" icon_state = "spearbomb0" @@ -196,19 +254,18 @@ attack_verb_simple = list("gore") force_unwielded = 15 force_wielded = 25 + improvised_construction = FALSE /obj/item/spear/grey_tide/afterattack(atom/movable/target, mob/living/user, list/modifiers, list/attack_modifiers) user.faction |= "greytide([REF(user)])" if(!isliving(target)) return var/mob/living/stabbed = target - if(istype(stabbed, /mob/living/simple_animal/hostile/illusion)) + if(istype(stabbed, /mob/living/basic/illusion)) return if(stabbed.stat == CONSCIOUS && prob(50)) - var/mob/living/simple_animal/hostile/illusion/fake_clone = new(user.loc) - fake_clone.faction = user.faction.Copy() - fake_clone.Copy_Parent(user, 100, user.health/2.5, 12, 30) - fake_clone.GiveTarget(stabbed) + var/mob/living/basic/illusion/fake_clone = new(user.loc) + fake_clone.full_setup(user, target_mob = stabbed, faction = user.faction, life = 10 SECONDS, hp = user.health / 2.5, damage = 12, replicate = 30) //MILITARY /obj/item/spear/military @@ -226,6 +283,7 @@ throw_range = 9 throw_speed = 5 sharpness = NONE // we break bones instead of cutting flesh + improvised_construction = FALSE /obj/item/spear/military/add_headpike_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/headpikemilitary) @@ -235,21 +293,83 @@ slapcraft_recipes = slapcraft_recipe_list,\ ) +/* + * Anti-big monster spear + * "WHERES MY DRAGONATOR?!" + */ +/obj/item/spear/dragonator + icon = 'icons/obj/weapons/48x.dmi' + icon_state = "speardragon0" + icon_prefix = "speardragon" + base_icon_state = "speardragon0" + lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' + name = "Giantslayer Spear" + desc = "An oversized multi-bladed spear designed to kill large hostile xenoforms such as space dragons or the creatures of lavaland. Capable of being launched from a ballista." + demolition_mod = 0.5 + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + force = 13 + throwforce = 23 + throw_range = 9 + throw_speed = 5 + wound_bonus = 0 + exposed_wound_bonus = 20 + force_unwielded = 13 + force_wielded = 21 + armour_penetration = 15 + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 42, + /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 15, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 5) + +/obj/item/spear/dragonator/Initialize(mapload) + . = ..() + AddElement(/datum/element/bane, mob_biotypes = MOB_MINING, damage_multiplier = 3.5) //For killing really big monsters, + +/* + * Untreated Giantslayer , needs to be thrown into lava + */ +/obj/item/spear/dragonator_untreated + icon = 'icons/obj/weapons/48x.dmi' + icon_state = "speardragonraw0" + icon_prefix = "speardragonraw" + base_icon_state = "speardragonraw0" + lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' + name = "Unfired Giantslayer Spear" + desc = "A half-finished giantslayer spear, needs to be thrown in lava to forge the metals to a killing edge." + demolition_mod = 0.5 + wound_bonus = 0 + exposed_wound_bonus = 0 + force_unwielded = 5 + force_wielded = 10 + armour_penetration = 0 + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 42, + /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 15, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 5) + +/obj/item/spear/dragonator_untreated/fire_act(exposed_temperature, exposed_volume) + var/obj/item/spear/dragonator/dragonator = new(loc) + playsound(dragonator.loc, 'sound/effects/magic/staff_change.ogg',5) + qdel(src) + + /* * Bone Spear */ /obj/item/spear/bonespear //Blatant imitation of spear, but made out of bone. Not valid for explosive modification. + name = "bone spear" + desc = "A haphazardly-constructed yet still deadly weapon. The pinnacle of modern technology." icon_state = "bone_spear0" base_icon_state = "bone_spear0" icon_prefix = "bone_spear" - name = "bone spear" - desc = "A haphazardly-constructed yet still deadly weapon. The pinnacle of modern technology." - throwforce = 22 - armour_penetration = 15 //Enhanced armor piercing - custom_materials = list(/datum/material/bone = HALF_SHEET_MATERIAL_AMOUNT * 7) + armour_penetration = 20 //Enhanced armor piercing + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 4) force_unwielded = 12 force_wielded = 20 + spear_leftovers = /obj/item/stack/sheet/bone /obj/item/spear/bonespear/add_headpike_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/headpikebone) @@ -262,18 +382,16 @@ /* * Bamboo Spear */ -/obj/item/spear/bamboospear //Blatant imitation of spear, but all natural. Also not valid for explosive modification. +/obj/item/spear/bamboospear //Blatant imitation of spear, but all natural. icon_state = "bamboo_spear0" base_icon_state = "bamboo_spear0" icon_prefix = "bamboo_spear" name = "bamboo spear" desc = "A haphazardly-constructed bamboo stick with a sharpened tip, ready to poke holes into unsuspecting people." - throwforce = 22 //Better to throw - custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 20) - force_unwielded = 10 - force_wielded = 18 - + throwforce = 23 //Better to throw + custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 25) + spear_leftovers = /obj/item/stack/sheet/mineral/bamboo /obj/item/spear/bamboospear/add_headpike_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/headpikebamboo) @@ -305,6 +423,7 @@ ) action_slots = ITEM_SLOT_HANDS actions_types = list(/datum/action/item_action/skybulge) + improvised_construction = FALSE ///The action button the spear gives, usable once a minute. /datum/action/item_action/skybulge diff --git a/code/game/objects/items/stacks/ammonia_crystals.dm b/code/game/objects/items/stacks/ammonia_crystals.dm index 2ed833192905..885ab685a80c 100644 --- a/code/game/objects/items/stacks/ammonia_crystals.dm +++ b/code/game/objects/items/stacks/ammonia_crystals.dm @@ -6,5 +6,7 @@ w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE max_amount = 50 - grind_results = list(/datum/reagent/ammonia = 10) merge_type = /obj/item/stack/ammonia_crystals + +/obj/item/stack/ammonia_crystals/grind_results() + return list(/datum/reagent/ammonia = 10) diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 1082d682c4ff..a278c02ce130 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -10,12 +10,14 @@ mats_per_unit = list(/datum/material/bluespace=SHEET_MATERIAL_AMOUNT) points = 50 refined_type = /obj/item/stack/sheet/bluespace_crystal - grind_results = list(/datum/reagent/bluespace = 20) scan_state = "rock_bscrystal" merge_type = /obj/item/stack/ore/bluespace_crystal /// The teleport range when crushed/thrown at someone. var/blink_range = 8 +/obj/item/stack/ore/bluespace_crystal/grind_results() + return list(/datum/reagent/bluespace = 20) + /obj/item/stack/ore/bluespace_crystal/refined name = "refined bluespace crystal" points = 0 @@ -28,6 +30,7 @@ . = ..() pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) + AddElement(/datum/element/raptor_food, ability_modifier = 0.05, attack_modifier = 0.5, color_chances = string_list(list(/datum/raptor_color/black = 1))) /obj/item/stack/ore/bluespace_crystal/get_part_rating() return 1 @@ -60,11 +63,13 @@ blink_range = 4 // Not as good as the organic stuff! points = 0 //nice try refined_type = null - grind_results = list(/datum/reagent/bluespace = 10, /datum/reagent/silicon = 20) merge_type = /obj/item/stack/ore/bluespace_crystal/artificial drop_sound = null //till I make a better one pickup_sound = null +/obj/item/stack/ore/bluespace_crystal/artificial/grind_results() + return list(/datum/reagent/bluespace = 10, /datum/reagent/silicon = 20) + //Polycrystals, aka stacks /obj/item/stack/sheet/bluespace_crystal name = "bluespace polycrystal" @@ -78,11 +83,12 @@ attack_verb_continuous = list("bluespace polybashes", "bluespace polybatters", "bluespace polybludgeons", "bluespace polythrashes", "bluespace polysmashes") attack_verb_simple = list("bluespace polybash", "bluespace polybatter", "bluespace polybludgeon", "bluespace polythrash", "bluespace polysmash") novariants = TRUE - grind_results = list(/datum/reagent/bluespace = 20) merge_type = /obj/item/stack/sheet/bluespace_crystal material_type = /datum/material/bluespace var/crystal_type = /obj/item/stack/ore/bluespace_crystal/refined +/obj/item/stack/sheet/bluespace_crystal/grind_results() + return list(/datum/reagent/bluespace = 20) /obj/item/stack/sheet/bluespace_crystal/attack_self(mob/user)// to prevent the construction menu from ever happening to_chat(user, span_warning("You cannot crush the polycrystal in-hand, try breaking one off.")) diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm index 5541c90895e2..35bb72d0a672 100644 --- a/code/game/objects/items/stacks/cash.dm +++ b/code/game/objects/items/stacks/cash.dm @@ -13,17 +13,19 @@ full_w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE var/value = 0 - grind_results = list(/datum/reagent/cellulose = 10) /obj/item/stack/spacecash/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1) . = ..() add_traits(list(TRAIT_FISHING_BAIT, TRAIT_BAIT_ALLOW_FISHING_DUD), INNATE_TRAIT) update_desc() +/obj/item/stack/spacecash/grind_results() + return list(/datum/reagent/cellulose = 10) + /obj/item/stack/spacecash/update_desc() . = ..() var/total_worth = get_item_credit_value() - desc = "It's worth [total_worth] credit[(total_worth > 1) ? "s" : null] in total." + desc = "It's worth [total_worth] [MONEY_NAME_AUTOPURAL(total_worth)] in total." /obj/item/stack/spacecash/get_item_credit_value() return (amount*value) diff --git a/code/game/objects/items/stacks/golem_food/golem_food_buff.dm b/code/game/objects/items/stacks/golem_food/golem_food_buff.dm index 09c1a335ef11..4960a6dfb131 100644 --- a/code/game/objects/items/stacks/golem_food/golem_food_buff.dm +++ b/code/game/objects/items/stacks/golem_food/golem_food_buff.dm @@ -17,15 +17,15 @@ return !existing || istype(existing, status_effect) /// Called when someone actually eats this -/datum/golem_food_buff/proc/on_consumption(mob/living/carbon/consumer, atom/movable/consumed) +/datum/golem_food_buff/proc/on_consumption(mob/living/carbon/consumer, atom/movable/consumed, multiplier = 1) if (!HAS_TRAIT(consumer, TRAIT_ROCK_METAMORPHIC)) return - apply_effects(consumer, consumed) + apply_effects(consumer, consumed, multiplier) /// Apply our desired effects to the eater -/datum/golem_food_buff/proc/apply_effects(mob/living/carbon/consumer, atom/movable/consumed) +/datum/golem_food_buff/proc/apply_effects(mob/living/carbon/consumer, atom/movable/consumed, multiplier = 1) if (status_effect) - consumer.apply_status_effect(status_effect) + consumer.apply_status_effect(status_effect, multiplier) /// Can eat at any time, but isn't very nutritious /datum/golem_food_buff/glass @@ -40,12 +40,12 @@ /// Amount by which you heal from eating some iron var/healed_amount = 3 /// Order in which to heal damage types - var/list/damage_heal_order = list(BRUTE, BURN, TOX, OXY) + var/list/damage_heal_order = list(BRUTE, BURN) -/datum/golem_food_buff/iron/apply_effects(mob/living/carbon/consumer, atom/movable/consumed) +/datum/golem_food_buff/iron/apply_effects(mob/living/carbon/consumer, atom/movable/consumed, multiplier = 1) if (consumer.health == consumer.maxHealth) return - consumer.heal_ordered_damage(healed_amount, damage_heal_order) + consumer.heal_ordered_damage(healed_amount * multiplier, damage_heal_order) new /obj/effect/temp_visual/heal(get_turf(consumer), COLOR_HEALING_CYAN) /datum/golem_food_buff/uranium @@ -90,7 +90,7 @@ exclusive = FALSE added_info = "After consumption, you can launch this mineral like a rocket. It's a little hard to keep down." -/datum/golem_food_buff/gibtonite/apply_effects(mob/living/carbon/human/consumer, atom/movable/consumed) +/datum/golem_food_buff/gibtonite/apply_effects(mob/living/carbon/human/consumer, atom/movable/consumed, multiplier = 1) var/obj/item/gibtonite_hand/new_hand = new(null, /* held_gibtonite = */ consumed) if(consumer.put_in_hands(new_hand)) @@ -108,10 +108,14 @@ exclusive = FALSE added_info = "After consumption, you can use the stored power to teleport yourself." -/datum/golem_food_buff/bluespace/apply_effects(mob/living/carbon/human/consumer, obj/item/stack/consumed) +/datum/golem_food_buff/bluespace/apply_effects(mob/living/carbon/human/consumer, atom/movable/consumed, multiplier = 1) + if(multiplier <= 0.2) + return var/obj/item/bluespace_finger/new_hand = new - if (consumed.amount == 1) - consumer.dropItemToGround(consumed) + if (isstack(consumed)) + var/obj/item/stack/stack = consumed + if(stack.amount == 1) + consumer.dropItemToGround(stack) if (consumer.put_in_hands(new_hand, del_on_fail = TRUE)) return consumer.balloon_alert(consumer, "no free hands!") 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 cb6498ffdc5e..a00b149097a4 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 @@ -94,9 +94,16 @@ animate(alpha = 50, time = 7.5 SECONDS, loop = -1, easing = SINE_EASING) return TRUE -/datum/status_effect/golem/on_creation(mob/living/new_owner) +/datum/status_effect/golem/on_creation(mob/living/new_owner, multiplier = 1) + ///instead of straight out multiplying the duration, we use exponents to flatten the duration so it doesn't become exceedingly long for golems + var/exponent = 0.2 if(!isgolem(new_owner)) duration *= 0.1 + exponent = 0.5 //non-golem benefit more from higher multipliers since it normally only lasts for 30 seconds for them. + if(multiplier > 1) + duration *= multiplier ** exponent + else // if the multiplier is lower than 1, don't bother using powers. + duration *= multiplier var/buff_duration = duration . = ..() if (!.) @@ -366,7 +373,7 @@ alert_desc = "You are more resistant to physical blows, and pack more of a punch yourself." filter_color = LIGHT_COLOR_HALOGEN /// Amount to reduce brute damage by - var/brute_modifier = 0.7 + var/brute_modifier = 0.8 // golems already have an innate 0.5 brute resistance - this is multiplicate on top of that /// How much extra damage do we do with our fists? var/damage_increase = 3 /// Deal this much extra damage to mining mobs, most of which take 0 unarmed damage usually diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 1518c3880972..babf8d5db3d1 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -16,6 +16,7 @@ cost = 250 source = /datum/robot_energy_storage/medical merge_type = /obj/item/stack/medical + apply_verb = "treating" /// How long it takes to apply it to yourself var/self_delay = 5 SECONDS /// How long it takes to apply it to someone else @@ -32,8 +33,6 @@ var/sanitization /// How much we add to flesh_healing for burn wounds on application var/flesh_regeneration - /// Verb used when applying this object to someone - var/apply_verb = "treating" /// Whether this item can be used on dead bodies var/works_on_dead = FALSE /// The sound this makes when starting healing with this item @@ -328,7 +327,7 @@ break // one at a time affecting.adjustBleedStacks(-1 * stop_bleeding, 0) if(flesh_regeneration || sanitization) - for(var/datum/wound/burn/flesh/wound as anything in affecting.wounds) + for(var/datum/wound/burn/flesh/wound in affecting.wounds) if(wound.can_be_ointmented_or_meshed()) wound.flesh_healing += flesh_regeneration wound.sanitization += sanitization @@ -336,9 +335,9 @@ post_heal_effects(max(previous_damage - affecting.get_damage(), 0), patient, user) return TRUE -/// Healing a simple mob, just an adjustbruteloss call +/// Healing a simple mob, just an adjust_brute_loss() call /obj/item/stack/medical/proc/heal_simplemob(mob/living/patient, mob/living/user) - patient.adjustBruteLoss(-1 * (heal_brute * patient.maxHealth / 100)) + patient.adjust_brute_loss(-1 * (heal_brute * patient.maxHealth / 100)) user.visible_message( span_green("[user] applies [src] on [patient]."), span_green("You apply [src] on [patient]."), @@ -360,10 +359,12 @@ heal_brute = 40 self_delay = 4 SECONDS other_delay = 2 SECONDS - grind_results = list(/datum/reagent/medicine/c2/libital = 10) merge_type = /obj/item/stack/medical/bruise_pack apply_verb = "applying to" - custom_price = 50 // DARKPACK EDIT ADD + custom_price = 50 // DARKPACK EDIT ADD - ECONOMY + +/obj/item/stack/medical/bruise_pack/grind_results() + return list(/datum/reagent/medicine/c2/libital = 10) /obj/item/stack/medical/bruise_pack/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is bludgeoning [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -379,10 +380,11 @@ other_delay = 2 SECONDS max_amount = 12 amount = 6 - grind_results = list(/datum/reagent/cellulose = 2) custom_price = PAYCHECK_CREW * 2 absorption_rate = 0.125 absorption_capacity = 5 + sanitization = 3 + flesh_regeneration = 5 splint_factor = 0.7 burn_cleanliness_bonus = 0.35 merge_type = /obj/item/stack/medical/gauze @@ -398,6 +400,9 @@ . = ..() register_context() +/obj/item/stack/medical/gauze/grind_results() + return list(/datum/reagent/cellulose = 2) + /obj/item/stack/medical/gauze/Destroy(force) . = ..() @@ -491,6 +496,13 @@ if(limb.cached_bleed_rate) add_mob_blood(patient) + + // Dressing burns provides a "one-time" bonus to sanitization and healing + // However, any notable infection will reduce the effectiveness of this bonus + for(var/datum/wound/burn/flesh/wound in limb.wounds) + wound.sanitization += sanitization * (wound.infection > 0.1 ? 0.2 : 1) + wound.flesh_healing += flesh_regeneration * (wound.infection > 0.1 ? 0 : 1) + limb.apply_gauze(src) /obj/item/stack/medical/gauze/twelve @@ -502,7 +514,7 @@ balloon_alert(user, "not enough gauze!") return new /obj/item/stack/sheet/cloth(I.drop_location()) - if(user.CanReach(src)) + if(IsReachableBy(user)) user.visible_message(span_notice("[user] cuts [src] into pieces of cloth with [I]."), \ span_notice("You cut [src] into pieces of cloth with [I]."), \ span_hear("You hear cutting.")) @@ -528,6 +540,8 @@ burn_cleanliness_bonus = 0.7 absorption_rate = 0.075 absorption_capacity = 4 + sanitization = 1 + flesh_regeneration = 3 merge_type = /obj/item/stack/medical/gauze/improvised /* @@ -550,8 +564,7 @@ max_amount = 10 repeating = TRUE heal_brute = 10 - stop_bleeding = 0.6 - grind_results = list(/datum/reagent/medicine/spaceacillin = 2) + stop_bleeding = 0.5 merge_type = /obj/item/stack/medical/suture apply_verb = "suturing" drop_sound = SFX_SUTURE_DROP @@ -560,15 +573,20 @@ heal_continuous_sound = SFX_SUTURE_CONTINUOUS heal_end_sound = SFX_SUTURE_END +/obj/item/stack/medical/suture/grind_results() + return list(/datum/reagent/medicine/spaceacillin = 2) + /obj/item/stack/medical/suture/medicated name = "medicated suture" icon_state = "suture_purp" desc = "A suture infused with drugs that speed up wound healing of the treated laceration." heal_brute = 15 stop_bleeding = 0.75 - grind_results = list(/datum/reagent/medicine/polypyr = 1) merge_type = /obj/item/stack/medical/suture/medicated +/obj/item/stack/medical/suture/medicated/grind_results() + return list(/datum/reagent/medicine/polypyr = 1) + /obj/item/stack/medical/ointment name = "ointment" desc = "Basic burn ointment, rated effective for second degree burns with proper bandaging, though it's still an effective stabilizer for worse burns. Not terribly good at outright healing burns though." @@ -581,14 +599,15 @@ max_amount = 8 self_delay = 4 SECONDS other_delay = 2 SECONDS - heal_burn = 5 flesh_regeneration = 2.5 sanitization = 0.25 - grind_results = list(/datum/reagent/medicine/c2/lenturi = 10) merge_type = /obj/item/stack/medical/ointment apply_verb = "applying to" - custom_price = 50 // DARKPACK EDIT ADD + custom_price = 50 // DARKPACK EDIT ADD - ECONOMY + +/obj/item/stack/medical/ointment/grind_results() + return list(/datum/reagent/medicine/c2/lenturi = 10) /obj/item/stack/medical/ointment/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is squeezing [src] into [user.p_their()] mouth! [user.p_do(TRUE)]n't [user.p_they()] know that stuff is toxic?")) @@ -613,17 +632,20 @@ heal_begin_sound = SFX_REGEN_MESH_BEGIN heal_continuous_sound = SFX_REGEN_MESH_CONTINUOUS heal_end_sound = SFX_REGEN_MESH_END - - var/is_open = TRUE ///This var determines if the sterile packaging of the mesh has been opened. - grind_results = list(/datum/reagent/medicine/spaceacillin = 2) merge_type = /obj/item/stack/medical/mesh + ///This var determines if the sterile packaging of the mesh has been opened. + var/is_open = TRUE + /obj/item/stack/medical/mesh/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1) . = ..() if(amount == max_amount) //only seal full mesh packs is_open = FALSE update_appearance() +/obj/item/stack/medical/mesh/grind_results() + return list(/datum/reagent/medicine/spaceacillin = 2) + /obj/item/stack/medical/mesh/update_icon_state() if(is_open) return ..() @@ -660,15 +682,16 @@ /obj/item/stack/medical/mesh/advanced name = "advanced regenerative mesh" desc = "An advanced mesh made with aloe extracts and sterilizing chemicals, used to treat burns." - gender = PLURAL icon_state = "aloe_mesh" heal_burn = 15 sanitization = 1.25 flesh_regeneration = 3.5 - grind_results = list(/datum/reagent/consumable/aloejuice = 1) merge_type = /obj/item/stack/medical/mesh/advanced +/obj/item/stack/medical/mesh/advanced/grind_results() + return list(/datum/reagent/consumable/aloejuice = 1) + /obj/item/stack/medical/mesh/advanced/update_icon_state() if(is_open) return ..() @@ -677,7 +700,6 @@ /obj/item/stack/medical/aloe name = "aloe cream" desc = "A healing paste for minor cuts and burns." - gender = PLURAL singular_name = "aloe cream" icon_state = "aloe_paste" @@ -689,7 +711,6 @@ repeating = TRUE heal_brute = 3 heal_burn = 3 - grind_results = list(/datum/reagent/consumable/aloejuice = 1) merge_type = /obj/item/stack/medical/aloe apply_verb = "applying to" @@ -697,6 +718,9 @@ . = ..() AddComponent(/datum/component/bakeable, /obj/item/food/badrecipe, rand(10 SECONDS, 15 SECONDS), FALSE) +/obj/item/stack/medical/aloe/grind_results() + return list(/datum/reagent/consumable/aloejuice = 1) + /obj/item/stack/medical/aloe/fresh amount = 2 @@ -704,20 +728,20 @@ name = "bone gel" singular_name = "bone gel" desc = "A potent medical gel that, when applied to a damaged bone in a proper surgical setting, triggers an intense melding reaction to repair the wound. Can be directly applied alongside surgical sticky tape to a broken bone in dire circumstances, though this is very harmful to the patient and not recommended." - icon = 'icons/obj/medical/surgery_tools.dmi' icon_state = "bone-gel" inhand_icon_state = "bone-gel" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - amount = 5 self_delay = 20 - grind_results = list(/datum/reagent/bone_dust = 10, /datum/reagent/carbon = 10) novariants = TRUE merge_type = /obj/item/stack/medical/bone_gel apply_verb = "applying to" +/obj/item/stack/medical/bone_gel/grind_results() + return list(/datum/reagent/bone_dust = 10, /datum/reagent/carbon = 10) + /obj/item/stack/medical/bone_gel/get_surgery_tool_overlay(tray_extended) return "gel" + (tray_extended ? "" : "_out") @@ -775,7 +799,7 @@ /obj/item/stack/medical/poultice/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/living/user) . = ..() playsound(src, 'sound/misc/soggy.ogg', 30, TRUE) - healed_mob.adjustOxyLoss(amount_healed) + healed_mob.adjust_oxy_loss(amount_healed) /obj/item/stack/medical/bandage name = "first aid bandage" @@ -791,10 +815,11 @@ stop_bleeding = 0.2 self_delay = 3 SECONDS other_delay = 1 SECONDS - grind_results = list(/datum/reagent/medicine/c2/libital = 2) apply_verb = "applying to" pickup_sound = SFX_CLOTH_PICKUP - // add a better drop sound more fitting for a lil' itty bitty band-aid + +/obj/item/stack/medical/bandage/grind_results() + return list(/datum/reagent/medicine/c2/libital = 2) /obj/item/stack/medical/bandage/makeshift name = "makeshift bandage" diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 61fdd829aca6..cafb00e59447 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -11,7 +11,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ new/datum/stack_recipe("ladder", /obj/structure/ladder/crafted, 15, time = 15 SECONDS, crafting_flags = CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, 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, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("probing cane", /obj/item/cane/white, 3, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY, category = CAT_TOOLS), \ + new/datum/stack_recipe("probing cane", /obj/item/cane/white, 3, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_SKIP_MATERIALS_PARITY, category = CAT_TOOLS), \ new/datum/stack_recipe("sharpened iron rod", /obj/item/ammo_casing/rebar, 1, time = 0.2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY, category = CAT_WEAPON_AMMO), \ )) @@ -28,7 +28,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ throw_speed = 3 throw_range = 7 demolition_mod = 1.25 - mats_per_unit = list(/datum/material/iron=HALF_SHEET_MATERIAL_AMOUNT) + mats_per_unit = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) max_amount = 50 attack_verb_continuous = list("hits", "bludgeons", "whacks") attack_verb_simple = list("hit", "bludgeon", "whack") @@ -42,6 +42,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ pickup_sound = 'sound/items/handling/materials/iron_rod_pick_up.ogg' drop_sound = 'sound/items/handling/materials/metal_drop.ogg' sound_vary = TRUE + usable_for_construction = TRUE /datum/embedding/rods embed_chance = 50 @@ -80,9 +81,9 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ . = ..() var/amount = get_amount() if(amount <= 5) - icon_state = "rods-[amount]" + icon_state = "[initial(icon_state)]-[amount]" else - icon_state = "rods" + icon_state = initial(icon_state) /obj/item/stack/rods/welder_act(mob/living/user, obj/item/tool) if(get_amount() < 2) @@ -133,7 +134,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ name = "heat resistant rod" desc = "Treated, specialized iron rods. When exposed to the vacuum of space their coating breaks off, but they can hold up against the extreme heat of active lava." singular_name = "heat resistant rod" - icon_state = "rods" + icon_state = "lavarods" inhand_icon_state = "rods" color = "#5286b9ff" obj_flags = CONDUCTS_ELECTRICITY @@ -150,6 +151,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ name = "shuttle frame rods" desc = "Treated, specialized iron rods suitable for the construction of shuttle frames or the expansion of existing shuttles." singular_name = "shuttle frame rod" + icon_state = "shuttlerods" mats_per_unit = list(/datum/material/iron=HALF_SHEET_MATERIAL_AMOUNT, /datum/material/titanium=SMALL_MATERIAL_AMOUNT) merge_type = /obj/item/stack/rods/shuttle diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index bc3529093d0b..04f902ba7301 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -25,7 +25,6 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ armor_type = /datum/armor/sheet_glass resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/glass - grind_results = list(/datum/reagent/silicon = 20) material_type = /datum/material/glass table_type = /obj/structure/table/glass matter_amount = 4 @@ -39,6 +38,9 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ fire = 50 acid = 100 +/obj/item/stack/sheet/glass/grind_results() + return list(/datum/reagent/silicon = 20) + /obj/item/stack/sheet/glass/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins to slice [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS @@ -101,12 +103,14 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ armor_type = /datum/armor/sheet_plasmaglass resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmaglass - grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10) material_flags = NONE table_type = /obj/structure/table/glass/plasmaglass pickup_sound = 'sound/items/handling/materials/glass_pick_up.ogg' drop_sound = 'sound/items/handling/materials/glass_drop.ogg' +/obj/item/stack/sheet/plasmaglass/grind_results() + return list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10) + /obj/item/stack/sheet/plasmaglass/fifty amount = 50 @@ -146,7 +150,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ null, \ new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/unanchored, time = 0.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_WINDOWS), \ new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/fulltile/unanchored, 2, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_IS_FULLTILE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("glass shard", /obj/item/shard, time = 10, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND, category = CAT_MISC), \ + new/datum/stack_recipe("glass shard", /obj/item/shard, time = 10, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_SKIP_MATERIALS_PARITY, category = CAT_MISC), \ new/datum/stack_recipe("reinforced glass tile", /obj/item/stack/tile/rglass, 1, 4, 20, category = CAT_TILES) \ )) @@ -161,12 +165,14 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ armor_type = /datum/armor/sheet_rglass resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/rglass - grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10) matter_amount = 6 table_type = /obj/structure/table/reinforced/rglass pickup_sound = 'sound/items/handling/materials/glass_pick_up.ogg' drop_sound = 'sound/items/handling/materials/glass_drop.ogg' +/obj/item/stack/sheet/rglass/grind_results() + return list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10) + /obj/item/stack/sheet/rglass/fifty amount = 50 @@ -185,7 +191,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ GLOBAL_LIST_INIT(prglass_recipes, list ( \ new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/plasma/unanchored, time = 0.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_WINDOWS), \ new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/plasma/fulltile/unanchored, 2, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_IS_FULLTILE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 40, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND, category = CAT_MISC), \ + new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 40, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_SKIP_MATERIALS_PARITY, category = CAT_MISC), \ new/datum/stack_recipe("reinforced plasma glass tile", /obj/item/stack/tile/rglass/plasma, 1, 4, 20, category = CAT_TILES) \ )) */ @@ -201,13 +207,15 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ resistance_flags = ACID_PROOF material_flags = NONE merge_type = /obj/item/stack/sheet/plasmarglass - grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10, /datum/reagent/iron = 10) gulag_valid = TRUE matter_amount = 8 table_type = /obj/structure/table/reinforced/plasmarglass pickup_sound = 'sound/items/handling/materials/glass_pick_up.ogg' drop_sound = 'sound/items/handling/materials/glass_drop.ogg' +/obj/item/stack/sheet/plasmarglass/grind_results() + return list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10, /datum/reagent/iron = 10) + /datum/armor/sheet_plasmarglass melee = 20 fire = 80 @@ -378,6 +386,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( to_chat(user, span_notice("You begin to wrap the [cloth] around the [src]...")) if(do_after(user, craft_time, target = src)) var/obj/item/knife/shiv/shiv = new shiv_type + shiv.set_custom_materials(custom_materials) cloth.use(1) to_chat(user, span_notice("You wrap the [cloth] around the [src], forming a makeshift weapon.")) remove_item_from_storage(src, user) diff --git a/code/game/objects/items/stacks/sheets/hot_ice.dm b/code/game/objects/items/stacks/sheets/hot_ice.dm index cb7b016c8e30..de42ef32e448 100644 --- a/code/game/objects/items/stacks/sheets/hot_ice.dm +++ b/code/game/objects/items/stacks/sheets/hot_ice.dm @@ -5,10 +5,12 @@ singular_name = "hot ice piece" icon = 'icons/obj/stack_objects.dmi' mats_per_unit = list(/datum/material/hot_ice=SHEET_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/toxin/hot_ice = 25) material_type = /datum/material/hot_ice merge_type = /obj/item/stack/sheet/hot_ice +/obj/item/stack/sheet/hot_ice/grind_results() + return list(/datum/reagent/toxin/hot_ice = 25) + /obj/item/stack/sheet/hot_ice/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins licking \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return FIRELOSS//dont you kids know that stuff is toxic? diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm index 8597cfc859f2..4d06e8fb3d16 100644 --- a/code/game/objects/items/stacks/sheets/light.dm +++ b/code/game/objects/items/stacks/sheets/light.dm @@ -11,9 +11,12 @@ throw_range = 7 obj_flags = CONDUCTS_ELECTRICITY max_amount = 60 - grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/copper = 5) + mats_per_unit = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.05, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.05) merge_type = /obj/item/stack/light_w +/obj/item/stack/light_w/grind_results() + return list(/datum/reagent/silicon = 20, /datum/reagent/copper = 5) + /obj/item/stack/light_w/examine(mob/user) . = ..() . += span_warning("\The [src] looks unfinished, add iron to complete it.") diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 94a98705b6f6..a38bffbe1eeb 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -24,9 +24,9 @@ Mineral Sheets */ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ - /* new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \ */ // DARKPACK EDIT REMOVE + /* new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ */ // DARKPACK EDIT REMOVE new/datum/stack_recipe("sandstone platform", /obj/structure/platform/sandstone, 2, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND, category = CAT_MISC), \ + new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_NO_MATERIALS, category = CAT_MISC), \ )) /obj/item/stack/sheet/mineral/sandstone @@ -38,7 +38,7 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ throw_speed = 3 throw_range = 5 mats_per_unit = list(/datum/material/sandstone=SHEET_MATERIAL_AMOUNT) - sheettype = "sandstone" + construction_path_type = "sandstone" merge_type = /obj/item/stack/sheet/mineral/sandstone walltype = /turf/closed/wall/mineral/sandstone material_type = /datum/material/sandstone @@ -72,6 +72,9 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ . = ..() . += GLOB.sandbag_recipes +/obj/item/stack/sheet/mineral/sandbags/fifty + amount = 50 + /obj/item/emptysandbag name = "empty sandbag" desc = "A bag to be filled with sand." @@ -99,23 +102,27 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ icon_state = "sheet-diamond" inhand_icon_state = "sheet-diamond" singular_name = "diamond" - sheettype = "diamond" + construction_path_type = "diamond" mats_per_unit = list(/datum/material/diamond=SHEET_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/carbon = 20) gulag_valid = TRUE merge_type = /obj/item/stack/sheet/mineral/diamond material_type = /datum/material/diamond walltype = /turf/closed/wall/mineral/diamond -// DARKPACK CHANGE START +// DARKPACK EDIT CHANGE START GLOBAL_LIST_INIT(diamond_recipes, list ( \ + new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ new/datum/stack_recipe("diamond tile", /obj/item/stack/tile/mineral/diamond, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ )) + +/obj/item/stack/sheet/mineral/diamond/grind_results() + return list(/datum/reagent/carbon = 20) + /* /obj/item/stack/sheet/mineral/diamond/get_main_recipes() . = ..() . += GLOB.diamond_recipes */ -// DARKPACK CHANGE END +// DARKPACK EDIT CHANGE END /obj/item/stack/sheet/mineral/diamond/five amount = 5 @@ -130,23 +137,28 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ icon_state = "sheet-uranium" inhand_icon_state = "sheet-uranium" singular_name = "uranium sheet" - sheettype = "uranium" + construction_path_type = "uranium" mats_per_unit = list(/datum/material/uranium=SHEET_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/uranium = 20) gulag_valid = TRUE merge_type = /obj/item/stack/sheet/mineral/uranium material_type = /datum/material/uranium walltype = /turf/closed/wall/mineral/uranium -// DARKPACK CHANGE START +// DARKPACK EDIT CHANGE START GLOBAL_LIST_INIT(uranium_recipes, list ( \ + new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new/datum/stack_recipe("depleted uranium platform", /obj/structure/platform/uranium, 2, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \ new/datum/stack_recipe("uranium tile", /obj/item/stack/tile/mineral/uranium, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ )) + +/obj/item/stack/sheet/mineral/uranium/grind_results() + return list(/datum/reagent/uranium = 20) + /* /obj/item/stack/sheet/mineral/uranium/get_main_recipes() . = ..() . += GLOB.uranium_recipes */ -// DARKPACK CHANGE END +// DARKPACK EDIT CHANGE END /obj/item/stack/sheet/mineral/uranium/five amount = 5 @@ -164,22 +176,24 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \ icon_state = "sheet-plasma" inhand_icon_state = "sheet-plasma" singular_name = "plasma sheet" - sheettype = "plasma" + construction_path_type = "plasma" resistance_flags = FLAMMABLE max_integrity = 100 mats_per_unit = list(/datum/material/plasma=SHEET_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/toxin/plasma = 20) gulag_valid = TRUE merge_type = /obj/item/stack/sheet/mineral/plasma material_type = /datum/material/plasma walltype = /turf/closed/wall/mineral/plasma +/obj/item/stack/sheet/mineral/plasma/grind_results() + return list(/datum/reagent/toxin/plasma = 20) + /obj/item/stack/sheet/mineral/plasma/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins licking \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return TOXLOSS//dont you kids know that stuff is toxic? GLOBAL_LIST_INIT(plasma_recipes, list ( \ - /* new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \ */ // DARKPACK EDIT REMOVE + /* new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ */ // DARKPACK EDIT REMOVE new/datum/stack_recipe("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ )) /* // DARKPACK EDIT REMOVE @@ -204,21 +218,24 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ icon_state = "sheet-gold" inhand_icon_state = "sheet-gold" singular_name = "gold bar" - sheettype = "gold" + construction_path_type = "gold" mats_per_unit = list(/datum/material/gold=SHEET_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/gold = 20) gulag_valid = TRUE merge_type = /obj/item/stack/sheet/mineral/gold material_type = /datum/material/gold walltype = /turf/closed/wall/mineral/gold GLOBAL_LIST_INIT(gold_recipes, list ( \ - /* new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \ */ // DARKPACK EDIT REMOVE + /* new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ */ // DARKPACK EDIT REMOVE new/datum/stack_recipe("golden platform", /obj/structure/platform/gold, 2, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \ new/datum/stack_recipe("gold tile", /obj/item/stack/tile/mineral/gold, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ new/datum/stack_recipe("blank plaque", /obj/item/plaque, 1, crafting_flags = NONE, category = CAT_FURNITURE), \ new/datum/stack_recipe("Simple Crown", /obj/item/clothing/head/costume/crown, 5, crafting_flags = NONE, category = CAT_CLOTHING), \ )) + +/obj/item/stack/sheet/mineral/gold/grind_results() + return list(/datum/reagent/gold = 20) + /* // DARKPACK EDIT REMOVE /obj/item/stack/sheet/mineral/gold/get_main_recipes() . = ..() @@ -235,9 +252,8 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ icon_state = "sheet-silver" inhand_icon_state = "sheet-silver" singular_name = "silver bar" - sheettype = "silver" + construction_path_type = "silver" mats_per_unit = list(/datum/material/silver=SHEET_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/silver = 20) gulag_valid = TRUE merge_type = /obj/item/stack/sheet/mineral/silver material_type = /datum/material/silver @@ -245,10 +261,14 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ walltype = /turf/closed/wall/mineral/silver GLOBAL_LIST_INIT(silver_recipes, list ( \ - /* new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \ */ // DARKPACK EDIT REMOVE + /* new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ */ // DARKPACK EDIT REMOVE new/datum/stack_recipe("silver platform", /obj/structure/platform/silver, 2, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \ new/datum/stack_recipe("silver tile", /obj/item/stack/tile/mineral/silver, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ )) + +/obj/item/stack/sheet/mineral/silver/grind_results() + return list(/datum/reagent/silver = 20) + /* // DARKPACK EDIT REMOVE /obj/item/stack/sheet/mineral/silver/get_main_recipes() . = ..() @@ -265,9 +285,8 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ icon_state = "sheet-bananium" inhand_icon_state = null singular_name = "bananium sheet" - sheettype = "bananium" + construction_path_type = "bananium" mats_per_unit = list(/datum/material/bananium=SHEET_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/consumable/banana = 20) gulag_valid = TRUE merge_type = /obj/item/stack/sheet/mineral/bananium material_type = /datum/material/bananium @@ -276,6 +295,10 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ GLOBAL_LIST_INIT(bananium_recipes, list ( \ new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ )) + +/obj/item/stack/sheet/mineral/bananium/grind_results() + return list(/datum/reagent/consumable/banana = 20) + /* // DARKPACK EDIT REMOVE /obj/item/stack/sheet/mineral/bananium/get_main_recipes() . = ..() @@ -297,7 +320,7 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \ w_class = WEIGHT_CLASS_NORMAL throw_speed = 1 throw_range = 3 - sheettype = "titanium" + construction_path_type = "titanium" mats_per_unit = list(/datum/material/titanium=SHEET_MATERIAL_AMOUNT) gulag_valid = TRUE merge_type = /obj/item/stack/sheet/mineral/titanium @@ -308,7 +331,7 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ new /datum/stack_recipe("Titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ new/datum/stack_recipe("Titanium Platform", /obj/structure/platform/titanium, 2, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \ /* new /datum/stack_recipe("Shuttle seat", /obj/structure/chair/comfy/shuttle, 2, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ - new /datum/stack_recipe("Material tram door assembly", /obj/structure/door_assembly/multi_tile/door_assembly_tram, 8, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ */ // DARKPACK EDIT REMOVE + new /datum/stack_recipe("Tram door assembly", /obj/structure/door_assembly/multi_tile/door_assembly_tram, 8, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ */ // DARKPACK EDIT REMOVE )) /* // DARKPACK EDIT REMOVE /obj/item/stack/sheet/mineral/titanium/get_main_recipes() @@ -351,7 +374,7 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ w_class = WEIGHT_CLASS_NORMAL throw_speed = 1 throw_range = 3 - sheettype = "plastitanium" + construction_path_type = "plastitanium" mats_per_unit = list(/datum/material/alloy/plastitanium=SHEET_MATERIAL_AMOUNT) gulag_valid = TRUE material_type = /datum/material/alloy/plastitanium @@ -380,7 +403,6 @@ GLOBAL_LIST_INIT(plastitanium_recipes, list ( \ singular_name = "snow block" force = 1 throwforce = 2 - grind_results = list(/datum/reagent/consumable/ice = 20) merge_type = /obj/item/stack/sheet/mineral/snow walltype = /turf/closed/wall/mineral/snow material_type = /datum/material/snow @@ -398,6 +420,9 @@ GLOBAL_LIST_INIT(snow_recipes, list ( \ . = ..() AddComponent(/datum/component/storm_hating) +/obj/item/stack/sheet/mineral/snow/grind_results() + return list(/datum/reagent/consumable/ice = 20) + /obj/item/stack/sheet/mineral/snow/get_main_recipes() . = ..() . += GLOB.snow_recipes @@ -461,7 +486,7 @@ GLOBAL_LIST_INIT(adamantine_recipes, list( icon_state = "sheet-abductor" inhand_icon_state = "sheet-abductor" singular_name = "alien alloy sheet" - sheettype = "abductor" + construction_path_type = "abductor" mats_per_unit = list(/datum/material/alloy/alien=SHEET_MATERIAL_AMOUNT) merge_type = /obj/item/stack/sheet/mineral/abductor material_type = /datum/material/alloy/alien @@ -470,6 +495,7 @@ GLOBAL_LIST_INIT(adamantine_recipes, list( GLOBAL_LIST_INIT(abductor_recipes, list ( \ new/datum/stack_recipe("alien bed", /obj/structure/bed/abductor, 2, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 2, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("strange closet", /obj/structure/closet/acloset, 2, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_CONTAINERS), \ new/datum/stack_recipe("alien table frame", /obj/structure/table_frame/abductor, 1, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ new/datum/stack_recipe("alien airlock assembly", /obj/structure/door_assembly/door_assembly_abductor, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ null, \ @@ -491,9 +517,11 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \ icon_state = "slag" singular_name = "coal lump" merge_type = /obj/item/stack/sheet/mineral/coal - grind_results = list(/datum/reagent/carbon = 20) novariants = TRUE +/obj/item/stack/sheet/mineral/coal/grind_results() + return list(/datum/reagent/carbon = 20) + /obj/item/stack/sheet/mineral/coal/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(W.get_temperature() > 300)//If the temperature of the object is over 300, then ignite var/turf/T = get_turf(src) diff --git a/code/game/objects/items/stacks/sheets/runed_metal.dm b/code/game/objects/items/stacks/sheets/runed_metal.dm index 5e0900a3ff3f..674dea391c1e 100644 --- a/code/game/objects/items/stacks/sheets/runed_metal.dm +++ b/code/game/objects/items/stacks/sheets/runed_metal.dm @@ -75,13 +75,15 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \ inhand_icon_state = "sheet-runed" icon = 'icons/obj/stack_objects.dmi' mats_per_unit = list(/datum/material/runedmetal = SHEET_MATERIAL_AMOUNT) - sheettype = "runed" + construction_path_type = "runed" merge_type = /obj/item/stack/sheet/runed_metal - grind_results = list(/datum/reagent/iron = 5, /datum/reagent/blood = 15) material_type = /datum/material/runedmetal has_unique_girder = TRUE use_radial = TRUE +/obj/item/stack/sheet/runed_metal/grind_results() + return list(/datum/reagent/iron = 5, /datum/reagent/blood = 15) + /obj/item/stack/sheet/runed_metal/interact(mob/user) if(!IS_CULTIST(user)) to_chat(user, span_warning("Only one with forbidden knowledge could hope to work this metal...")) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index dacad2baac0e..e2c39a5232b4 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -31,18 +31,20 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("lime comfy chair", /obj/structure/chair/comfy/lime, 2, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ new/datum/stack_recipe("teal comfy chair", /obj/structure/chair/comfy/teal, 2, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ )), \ - new/datum/stack_recipe_list("sofas", list( - new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa/middle, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), - new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), - new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), - new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE) - )), \ - new/datum/stack_recipe_list("corporate sofas", list( \ - new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa/corp, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ - new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/corp/left, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ - new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/corp/right, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ - new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corp/corner, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ - )), \ + new/datum/stack_recipe_list("sofas", list( \ + new /datum/stack_recipe("corporate sofa (middle)", /obj/structure/chair/sofa/corp, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("corporate sofa (left)", /obj/structure/chair/sofa/corp/left, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("corporate sofa (right)", /obj/structure/chair/sofa/corp/right, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("corporate sofa (corner)", /obj/structure/chair/sofa/corp/corner, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa/middle, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("retro sofa (middle)", /obj/structure/chair/sofa/middle/brown, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("retro sofa (left)", /obj/structure/chair/sofa/left/brown, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("retro sofa (right)", /obj/structure/chair/sofa/right/brown, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("retro sofa (corner)", /obj/structure/chair/sofa/corner/brown, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE) \ + )), \ new /datum/stack_recipe_list("benches", list( \ new /datum/stack_recipe("bench (middle)", /obj/structure/chair/sofa/bench, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ new /datum/stack_recipe("bench (left)", /obj/structure/chair/sofa/bench/left, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ @@ -127,7 +129,6 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ obj_flags = CONDUCTS_ELECTRICITY resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/iron - grind_results = list(/datum/reagent/iron = 20) gulag_valid = TRUE table_type = /obj/structure/table material_type = /datum/material/iron @@ -147,6 +148,9 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ ) AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) +/obj/item/stack/sheet/iron/grind_results() + return list(/datum/reagent/iron = 20) + /obj/item/stack/sheet/iron/examine(mob/user) . = ..() . += span_notice("Right click on floor to build:") @@ -252,6 +256,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ // DARKPACK EDIT CHANGE START GLOBAL_LIST_INIT(plasteel_recipes, list ( \ new/datum/stack_recipe("shutter assembly", /obj/machinery/door/poddoor/shutters/preopen/deconstructed, 5, time = 5 SECONDS, crafting_flags = CRAFT_ONE_PER_TURF, category = CAT_DOORS), + new/datum/stack_recipe("large metal box", /obj/structure/closet/cardboard/metal, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_CONTAINERS), null, new /datum/stack_recipe_list("airlock assemblies", list( \ new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), @@ -272,7 +277,6 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ armor_type = /datum/armor/sheet_plasteel resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/plasteel - grind_results = list(/datum/reagent/iron = 20, /datum/reagent/toxin/plasma = 20) gulag_valid = TRUE table_type = /obj/structure/table/reinforced material_flags = NONE @@ -282,6 +286,9 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ fire = 100 acid = 80 +/obj/item/stack/sheet/plasteel/grind_results() + return list(/datum/reagent/iron = 20, /datum/reagent/toxin/plasma = 20) + /obj/item/stack/sheet/plasteel/get_main_recipes() . = ..() . += GLOB.plasteel_recipes @@ -317,6 +324,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new/datum/stack_recipe("wooden barrel", /obj/structure/fermenting_barrel, 8, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_CONTAINERS), \ new/datum/stack_recipe("dog bed", /obj/structure/bed/dogbed, 10, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ new/datum/stack_recipe("dresser", /obj/structure/dresser, 10, time = 1.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("cabinet", /obj/structure/closet/cabinet, 2, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_CONTAINERS), \ new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 1 SECONDS, crafting_flags = NONE, category = CAT_ENTERTAINMENT),\ new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 1 SECONDS, crafting_flags = NONE, category = CAT_ENTERTAINMENT),\ new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ @@ -329,7 +337,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/cup/bucket/wooden, 3, time = 1 SECONDS, crafting_flags = NONE, category = CAT_CONTAINERS),\ new/datum/stack_recipe("rake", /obj/item/cultivator/rake, 5, time = 1 SECONDS, crafting_flags = NONE, category = CAT_TOOLS),\ new/datum/stack_recipe("wooden crate", /obj/structure/closet/crate/wooden, 6, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE),\ - new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 1.5 SECONDS, crafting_flags = NONE, category = CAT_WEAPON_MELEE),\ + new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 1.5 SECONDS, crafting_flags = NONE, category = CAT_WEAPON_MELEE, removed_mats = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 1.5)),\ new/datum/stack_recipe("wooden crutch", /obj/item/cane/crutch/wood, 5, time = 1.5 SECONDS, crafting_flags = NONE, category = CAT_WEAPON_MELEE),\ new/datum/stack_recipe("loom", /obj/structure/loom, 10, time = 1.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_TOOLS), \ new/datum/stack_recipe("mortar", /obj/item/reagent_containers/cup/mortar, 3, crafting_flags = NONE, category = CAT_CHEMISTRY), \ @@ -362,12 +370,11 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ inhand_icon_state = "sheet-wood" icon = 'icons/obj/stack_objects.dmi' mats_per_unit = list(/datum/material/wood=SHEET_MATERIAL_AMOUNT) - sheettype = "wood" + construction_path_type = "wood" armor_type = /datum/armor/mineral_wood resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/mineral/wood material_type = /datum/material/wood - grind_results = list(/datum/reagent/cellulose = 20) //no lignocellulose or lignin reagents yet, walltype = /turf/closed/wall/mineral/wood stairs_type = /obj/structure/stairs/wood pickup_sound = 'sound/items/handling/materials/wood_pick_up.ogg' @@ -376,6 +383,9 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ /datum/armor/mineral_wood fire = 50 +/obj/item/stack/sheet/mineral/wood/grind_results() + return list(/datum/reagent/cellulose = 20) + /obj/item/stack/sheet/mineral/wood/get_main_recipes() . = ..() . += GLOB.wood_recipes @@ -407,7 +417,7 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \ new/datum/stack_recipe("bamboo spear", /obj/item/spear/bamboospear, 25, time = 9 SECONDS, crafting_flags = NONE, category = CAT_WEAPON_MELEE), \ new/datum/stack_recipe("blow gun", /obj/item/gun/syringe/blowgun, 10, time = 7 SECONDS, crafting_flags = NONE, category = CAT_WEAPON_RANGED), \ new/datum/stack_recipe("crude syringe", /obj/item/reagent_containers/syringe/crude, 5, time = 1 SECONDS, crafting_flags = NONE, category = CAT_CHEMISTRY), \ - new/datum/stack_recipe("rice hat", /obj/item/clothing/head/costume/rice_hat, 10, time = 7 SECONDS, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("rice hat", /obj/item/clothing/head/costume/rice_hat, 10, time = 7 SECONDS, crafting_flags = CRAFT_SKIP_MATERIALS_PARITY, category = CAT_CLOTHING), \ null, \ new/datum/stack_recipe("bamboo stool", /obj/structure/chair/stool/bamboo, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ new/datum/stack_recipe("bamboo mat piece", /obj/item/stack/tile/bamboo, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ @@ -427,13 +437,12 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \ icon_state = "sheet-bamboo" inhand_icon_state = "sheet-bamboo" icon = 'icons/obj/stack_objects.dmi' - sheettype = "bamboo" + construction_path_type = "bamboo" mats_per_unit = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT) throwforce = 15 armor_type = /datum/armor/mineral_bamboo resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/mineral/bamboo - grind_results = list(/datum/reagent/cellulose = 10) material_type = /datum/material/bamboo walltype = /turf/closed/wall/mineral/bamboo drop_sound = null @@ -442,6 +451,9 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \ /datum/armor/mineral_bamboo fire = 50 +/obj/item/stack/sheet/mineral/bamboo/grind_results() + return list(/datum/reagent/cellulose = 10) + /obj/item/stack/sheet/mineral/bamboo/get_main_recipes() . = ..() . += GLOB.bamboo_recipes @@ -503,10 +515,12 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ merge_type = /obj/item/stack/sheet/cloth drop_sound = 'sound/items/handling/cloth/cloth_drop1.ogg' pickup_sound = 'sound/items/handling/cloth/cloth_pickup1.ogg' - grind_results = list(/datum/reagent/cellulose = 20) pickup_sound = SFX_CLOTH_PICKUP drop_sound = SFX_CLOTH_DROP +/obj/item/stack/sheet/cloth/grind_results() + return list(/datum/reagent/cellulose = 20) + /obj/item/stack/sheet/cloth/get_main_recipes() . = ..() . += GLOB.cloth_recipes @@ -543,7 +557,8 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ . = ..() . += GLOB.durathread_recipes */ -/obj/item/stack/sheet/durathread/on_item_crafted(mob/builder, atom/created) +/obj/item/stack/sheet/durathread/used_in_craft(atom/created, datum/crafting_recipe/recipe) + . = ..() created.set_armor_rating(CONSUME, max(50, created.get_armor_rating(CONSUME))) /obj/item/stack/sheet/cotton @@ -555,23 +570,25 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ force = 0 throwforce = 0 merge_type = /obj/item/stack/sheet/cotton - grind_results = list(/datum/reagent/cellulose = 20) - var/loom_result = /obj/item/stack/sheet/cloth - var/loom_time = 1 SECONDS drop_sound = 'sound/items/handling/cloth/cloth_drop1.ogg' pickup_sound = 'sound/items/handling/cloth/cloth_pickup1.ogg' + var/loom_result = /obj/item/stack/sheet/cloth + var/loom_time = 1 SECONDS + /obj/item/stack/sheet/cotton/Initialize(mapload) . = ..() AddElement(/datum/element/loomable, resulting_atom = loom_result, loom_time = loom_time) +/obj/item/stack/sheet/cotton/grind_results() + return list(/datum/reagent/cellulose = 20) + /obj/item/stack/sheet/cotton/durathread name = "raw durathread bundle" desc = "A bundle of raw durathread ready to be spun on the loom." singular_name = "raw durathread ball" icon_state = "sheet-durathreadraw" merge_type = /obj/item/stack/sheet/cotton/durathread - grind_results = list() loom_result = /obj/item/stack/sheet/durathread /obj/item/stack/sheet/cotton/wool @@ -580,7 +597,6 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ singular_name = "raw wool ball" icon_state = "sheet-wool" merge_type = /obj/item/stack/sheet/cotton/wool - grind_results = list() loom_result = /obj/item/stack/sheet/cloth /* @@ -590,6 +606,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ new/datum/stack_recipe("box", /obj/item/storage/box, crafting_flags = NONE, category = CAT_CONTAINERS), \ new/datum/stack_recipe("large box", /obj/structure/closet/cardboard, 4, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("medium box", /obj/structure/closet/crate/cardboard, 4, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_CONTAINERS), \ new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5, crafting_flags = NONE, category = CAT_ENTERTAINMENT), \ null, \ @@ -646,7 +663,8 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ null, \ )) // DARKPACK EDIT CHANGE END -/obj/item/stack/sheet/cardboard //BubbleWrap //it's cardboard you fuck + +/obj/item/stack/sheet/cardboard name = "cardboard" desc = "Large sheets of card, like boxes folded flat." singular_name = "cardboard sheet" @@ -657,7 +675,6 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ force = 0 throwforce = 0 merge_type = /obj/item/stack/sheet/cardboard - grind_results = list(/datum/reagent/cellulose = 10) material_type = /datum/material/cardboard pickup_sound = 'sound/items/handling/materials/cardboard_pick_up.ogg' drop_sound = 'sound/items/handling/materials/cardboard_drop.ogg' @@ -671,6 +688,10 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ slapcraft_recipes = slapcraft_recipe_list,\ ) */ + +/obj/item/stack/sheet/cardboard/grind_results() + return list(/datum/reagent/cellulose = 10) + /obj/item/stack/sheet/cardboard/get_main_recipes() . = ..() . += GLOB.cardboard_recipes @@ -721,29 +742,26 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ lefthand_file = 'icons/mob/inhands/items/sheets_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/sheets_righthand.dmi' resistance_flags = FIRE_PROOF | ACID_PROOF - sheettype = "bronze" + construction_path_type = "bronze" force = 5 throwforce = 10 max_amount = 50 throw_speed = 1 throw_range = 3 novariants = FALSE - grind_results = list(/datum/reagent/iron = 20, /datum/reagent/copper = 12) //we have no "tin" reagent so this is the closest thing merge_type = /obj/item/stack/sheet/bronze table_type = /obj/structure/table/bronze material_type = /datum/material/bronze walltype = /turf/closed/wall/mineral/bronze has_unique_girder = TRUE +/obj/item/stack/sheet/bronze/grind_results() + return list(/datum/reagent/iron = 20, /datum/reagent/copper = 12) + /obj/item/stack/sheet/bronze/get_main_recipes() . = ..() . += GLOB.bronze_recipes -/obj/item/stack/sheet/paperframes/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1) - . = ..() - pixel_x = 0 - pixel_y = 0 - /obj/item/stack/sheet/bronze/thirty amount = 30 @@ -785,7 +803,6 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ w_class = WEIGHT_CLASS_NORMAL throw_speed = 1 throw_range = 3 - grind_results = list(/datum/reagent/carbon = 10) merge_type = /obj/item/stack/sheet/bone material_type = /datum/material/bone drop_sound = null @@ -810,6 +827,10 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) + +/obj/item/stack/sheet/bone/grind_results() + return list(/datum/reagent/carbon = 10) + // DARKPACK EDIT CHANGE START GLOBAL_LIST_INIT(plastic_recipes, list( new /datum/stack_recipe("plastic floor tile", /obj/item/stack/tile/plastic, 1, 4, 20, time = 2 SECONDS, crafting_flags = NONE, category = CAT_TILES), \ @@ -817,7 +838,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list( new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, time = 4 SECONDS, category = CAT_FURNITURE), \ new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/cup/glass/waterbottle/empty, crafting_flags = NONE, category = CAT_CONTAINERS), \ new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/cup/glass/waterbottle/large/empty, 3, crafting_flags = NONE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("colo cups", /obj/item/reagent_containers/cup/glass/colocup, 1, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("colo cups", /obj/item/reagent_containers/cup/glass/colocup, 1, crafting_flags = NONE, category = CAT_CONTAINERS, removed_mats = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT)), \ new /datum/stack_recipe("mannequin", /obj/structure/mannequin/plastic, 25, time = 5 SECONDS, crafting_flags = CRAFT_ONE_PER_TURF, category = CAT_ENTERTAINMENT), \ new /datum/stack_recipe("wet floor sign", /obj/item/clothing/suit/caution, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \ new /datum/stack_recipe("warning cone", /obj/item/clothing/head/cone, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \ @@ -864,11 +885,13 @@ GLOBAL_LIST_INIT(paperframe_recipes, list( mats_per_unit = list(/datum/material/paper = SHEET_MATERIAL_AMOUNT) merge_type = /obj/item/stack/sheet/paperframes resistance_flags = FLAMMABLE - grind_results = list(/datum/reagent/cellulose = 20) material_type = /datum/material/paper drop_sound = null pickup_sound = null +/obj/item/stack/sheet/paperframes/grind_results() + return list(/datum/reagent/cellulose = 20) + /obj/item/stack/sheet/paperframes/get_main_recipes() . = ..() . += GLOB.paperframe_recipes @@ -936,7 +959,9 @@ GLOBAL_LIST_INIT(pizza_sheet_recipes, list( 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/grind_results() + return list(/datum/reagent/hauntium = 20) /obj/item/stack/sheet/hauntium/fifty amount = 50 diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index 35e8dd161f4d..bd50d1648e8e 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -18,14 +18,13 @@ pickup_sound = 'sound/items/handling/materials/metal_pick_up.ogg' drop_sound = 'sound/items/handling/materials/metal_drop.ogg' sound_vary = TRUE - /// this is used for girders in the creation of walls/false walls - var/sheettype = null + usable_for_construction = TRUE + /// text string used to find typepaths used in door and wall (false and tram too) construction for door assemblies and girders respectively + var/construction_path_type = null ///If true, this is worth points in the gulag labour stacker var/gulag_valid = FALSE ///Set to true if this is vended from a material storage var/manufactured = FALSE - ///What type of wall does this sheet spawn - var/walltype /// whether this sheet can be sniffed by the material sniffer var/sniffable = FALSE diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index c970f41dab82..b1cb72cba89c 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -45,8 +45,6 @@ // these amounts will be multiplied by the stack size in on_grind() /// Amount of matter given back to RCDs var/matter_amount = 0 - /// Does this stack require a unique girder in order to make a wall? - var/has_unique_girder = FALSE /// What typepath table we create from this stack var/obj/structure/table/table_type /// What typepath stairs do we create from this stack @@ -60,6 +58,8 @@ // They're here instead of /stack/medical // because sticky tape can be used as a makeshift bandage or splint + /// Verb used when applying this object to someone + var/apply_verb = "applying" /// If set and this used as a splint for a broken bone wound, /// This is used as a multiplier for applicable slowdowns (lower = better) (also for speeding up burn recoveries) var/splint_factor @@ -73,6 +73,13 @@ /// or until the cut heals, whichever comes first var/absorption_rate + /// Can this stack be used for contruction of girders? + var/usable_for_construction = FALSE + /// Does this stack require a unique girder in order to make a wall? + var/has_unique_girder = FALSE + ///What type of wall does this sheet spawn + var/walltype + /obj/item/stack/Initialize(mapload, new_amount = amount, merge = TRUE, list/mat_override=null, mat_amt=1) amount = new_amount if(amount <= 0) @@ -89,12 +96,11 @@ if(merge) . = INITIALIZE_HINT_LATELOAD - var/materials_mult = amount if(LAZYLEN(mat_override)) - materials_mult *= mat_amt mats_per_unit = mat_override if(LAZYLEN(mats_per_unit)) - initialize_materials(mats_per_unit, materials_mult) + mats_per_unit = SSmaterials.FindOrCreateMaterialCombo(mats_per_unit, mat_amt) + initialize_materials(mats_per_unit, amount) recipes = get_main_recipes().Copy() if(material_type) @@ -115,17 +121,21 @@ /obj/item/stack/LateInitialize() merge_with_loc() +/obj/item/stack/Destroy() + mats_per_unit = null + return ..() + /obj/item/stack/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) . = ..() if((!throwing || throwing.target_turf == loc) && old_loc != loc && (flags_1 & INITIALIZED_1)) - merge_with_loc() + merge_with_loc(merge_into_ourselves = !isnull(pulledby)) ///Called to lazily update the materials of the item whenever the used or if more is added /obj/item/stack/proc/update_custom_materials() if(length(mats_per_unit)) set_custom_materials(mats_per_unit, amount) -/obj/item/stack/proc/find_other_stack(list/already_found) +/obj/item/stack/proc/find_other_stack(list/already_found, merge_into_ourselves = FALSE) if(QDELETED(src) || isnull(loc)) return for(var/obj/item/stack/item_stack in loc) @@ -136,27 +146,25 @@ var/stack_ref = REF(item_stack) if(already_found[stack_ref]) continue - if(can_merge(item_stack)) + if(merge_into_ourselves ? item_stack.can_merge(src) : can_merge(item_stack)) already_found[stack_ref] = TRUE return item_stack /// Tries to merge the stack with everything on the same tile. -/obj/item/stack/proc/merge_with_loc() +/obj/item/stack/proc/merge_with_loc(merge_into_ourselves = FALSE) var/list/already_found = list() // change to alist whenever dreamchecker and such finally supports that - var/obj/item/other_stack = find_other_stack(already_found) + var/obj/item/stack/other_stack = find_other_stack(already_found, merge_into_ourselves) var/sanity = max_amount // just in case while(other_stack && sanity > 0) sanity-- - if(merge(other_stack)) + if(!merge_into_ourselves) + if(merge(other_stack)) + return FALSE + else if (other_stack.merge(src) && !QDELETED(other_stack)) return FALSE - other_stack = find_other_stack(already_found) + other_stack = find_other_stack(already_found, TRUE) return TRUE -/obj/item/stack/apply_material_effects(list/materials) - . = ..() - if(amount) - mats_per_unit = SSmaterials.FindOrCreateMaterialCombo(materials, 1/amount) - /obj/item/stack/blend_requirements() if(is_cyborg) to_chat(usr, span_warning("[src] is too integrated into your chassis and can't be ground up!")) @@ -168,14 +176,16 @@ if(current_amount <= 0 || QDELETED(src)) //just to get rid of this 0 amount/deleted stack we return success return TRUE + var/list/grind_reagents = grind_results() + 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] + for(var/reagent in grind_reagents) + total_volume += grind_reagents[reagent] //compute number of pieces(or sheets) from available_volume var/available_amount = min(current_amount, round(available_volume / total_volume)) @@ -183,7 +193,6 @@ 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) @@ -203,12 +212,14 @@ return list() //empty list /obj/item/stack/proc/update_weight() - if(amount <= (max_amount * (1/3))) - update_weight_class(clamp(full_w_class-2, WEIGHT_CLASS_TINY, full_w_class)) - else if (amount <= (max_amount * (2/3))) - update_weight_class(clamp(full_w_class-1, WEIGHT_CLASS_TINY, full_w_class)) - else - update_weight_class(full_w_class) + update_weight_class(get_weight_from_size(amount)) + +/obj/item/stack/proc/get_weight_from_size(stack_amount) + if(stack_amount <= (max_amount * (1/3))) + return clamp(full_w_class - 2, WEIGHT_CLASS_TINY, full_w_class) + if(stack_amount <= (max_amount * (2/3))) + return clamp(full_w_class - 1, WEIGHT_CLASS_TINY, full_w_class) + return full_w_class /obj/item/stack/update_icon_state() if(novariants) @@ -407,7 +418,7 @@ #undef FULL_LIST /// Makes the item with the given recipe. -/obj/item/stack/proc/make_item(mob/builder, datum/stack_recipe/recipe, multiplier) +/obj/item/stack/proc/make_item(mob/builder, datum/stack_recipe/recipe, multiplier = 1) if(get_amount() < 1 && !is_cyborg) //sanity check as this shouldn't happen qdel(src) return @@ -444,31 +455,42 @@ var/turf/covered_turf = builder.drop_location() if(!isturf(covered_turf)) return - var/turf/created_turf = covered_turf.place_on_top(recipe.result_type, flags = CHANGETURF_INHERIT_AIR) + created = covered_turf.place_on_top(recipe.result_type, flags = CHANGETURF_INHERIT_AIR) builder.balloon_alert(builder, "placed [ispath(recipe.result_type, /turf/open) ? "floor" : "wall"]") - if((recipe.crafting_flags & CRAFT_APPLIES_MATS) && LAZYLEN(mats_per_unit)) - created_turf.set_custom_materials(mats_per_unit, recipe.req_amount / recipe.res_amount) else created = new recipe.result_type(builder.drop_location()) builder.balloon_alert(builder, "built item") - if(created) + // split the material and use it for the craft + var/obj/item/stack/used_stack = split_stack(recipe.req_amount * multiplier) + if(ismovable(created)) created.setDir(builder.dir) - SEND_SIGNAL(created, COMSIG_ATOM_CONSTRUCTED, builder) - on_item_crafted(builder, created) + created.on_craft_completion(list(used_stack), null, builder) - // Use up the material - use(recipe.req_amount * multiplier) builder.investigate_log("crafted [recipe.title]", INVESTIGATE_CRAFTING) // Apply mat datums - if((recipe.crafting_flags & CRAFT_APPLIES_MATS) && LAZYLEN(mats_per_unit)) + if(LAZYLEN(mats_per_unit) && !(recipe.crafting_flags & CRAFT_NO_MATERIALS)) + var/list/result_mats = mats_per_unit.Copy() + for(var/mat in recipe.removed_mats) + var/to_remove = recipe.removed_mats[mat] + var/datum/material/ref_mat = locate(mat) in result_mats + if(!ref_mat) + continue + if(result_mats[ref_mat] < to_remove) + result_mats -= ref_mat + else + result_mats[ref_mat] -= to_remove + if(isstack(created)) var/obj/item/stack/crafted_stack = created - crafted_stack.set_custom_materials(mats_per_unit, (recipe.req_amount / recipe.res_amount) * crafted_stack.amount) + crafted_stack.mats_per_unit = SSmaterials.FindOrCreateMaterialCombo(result_mats) + update_custom_materials() else - created.set_custom_materials(mats_per_unit, recipe.req_amount / recipe.res_amount) + created.set_custom_materials(result_mats, recipe.req_amount * multiplier) + + qdel(used_stack) //you've outlived your purpose // We could be qdeleted - like if it's a stack and has already been merged if(QDELETED(created)) @@ -487,10 +509,6 @@ 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. @@ -567,11 +585,10 @@ if (amount < used) return FALSE amount -= used - if(check && is_zero_amount(delete_if_zero = TRUE)) - return TRUE - update_custom_materials() - update_appearance() - update_weight() + if(!is_zero_amount(delete_if_zero = check)) + update_custom_materials() + update_appearance() + update_weight() return TRUE /obj/item/stack/tool_use_check(mob/living/user, amount, heat_required) @@ -666,8 +683,35 @@ transfer = min(transfer, round((target_stack.source.max_energy - target_stack.source.energy) / target_stack.cost)) else transfer = min(transfer, (limit ? limit : target_stack.max_amount) - target_stack.amount) - if(pulledby) + // Ensure that we're not bloating the target stack to the point where it falls out of storage + if(target_stack.loc?.atom_storage) + var/datum/storage/target_storage = target_stack.loc?.atom_storage + var/cur_size = target_stack.w_class + var/new_size = target_stack.get_weight_from_size(target_stack.amount + transfer) + var/real_new_size = new_size + var/real_cur_size = cur_size + + // Ensure that we don't end up with two mergeable stacks if our own size gets reduced enough from the merge and we share the space + if (!is_cyborg && loc == target_stack.loc) + real_cur_size += w_class + if (amount > transfer) + real_new_size += get_weight_from_size(amount - transfer) + + // If total size changed, check for overflows + if(new_size > cur_size) + var/size_limit = max(new_size - target_storage.max_specific_storage, target_storage.get_total_weight() + real_new_size - real_cur_size - target_storage.max_total_storage) + // If we're over the stack limit the storage container can support, reduce the transferred amount + // to the nearest size threshold, then by a third of the target stack per excess size + if(size_limit > 0) + var/to_threshold = FLOOR(target_stack.amount + transfer, floor(target_stack.max_amount / 3)) + transfer = clamp(to_threshold - floor(target_stack.max_amount / 3) * (size_limit - 1) - target_stack.amount, 0, transfer) + + if(!transfer) + return + + if(pulledby && is_zero_amount(delete_if_zero = FALSE)) pulledby.start_pulling(target_stack) + target_stack.copy_evidences(src) use(transfer, transfer = TRUE, check = FALSE) target_stack.add(transfer) diff --git a/code/game/objects/items/stacks/stack_recipe.dm b/code/game/objects/items/stacks/stack_recipe.dm index f507e2fc784a..3f30d259aa91 100644 --- a/code/game/objects/items/stacks/stack_recipe.dm +++ b/code/game/objects/items/stacks/stack_recipe.dm @@ -25,6 +25,8 @@ var/trait_modifier = 1 /// Category for general crafting menu var/category + /// The amount of material to remove from the recipe's result + var/list/removed_mats ///crafting_flags var to hold bool values var/crafting_flags = CRAFT_CHECK_DENSITY @@ -41,6 +43,7 @@ trait_booster, trait_modifier = 1, category, + list/removed_mats, ) src.title = title @@ -55,6 +58,8 @@ src.trait_modifier = trait_modifier src.category = src.category || category || CAT_MISC + src.removed_mats = removed_mats + // We create base64 image only if item have color. Otherwise use icon_ref for TGUI var/obj/item/result = result_type var/paint = result::color diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm index 38e9854aa039..e373de11aada 100644 --- a/code/game/objects/items/stacks/tape.dm +++ b/code/game/objects/items/stacks/tape.dm @@ -12,14 +12,14 @@ amount = 5 max_amount = 5 resistance_flags = FLAMMABLE - grind_results = list(/datum/reagent/cellulose = 5) splint_factor = 0.65 merge_type = /obj/item/stack/sticky_tape + greyscale_config = /datum/greyscale_config/tape + greyscale_colors = "#B2B2B2#BD6A62" + var/conferred_embed = /datum/embedding/sticky_tape ///The tape type you get when ripping off a piece of tape. var/obj/tape_gag = /obj/item/clothing/mask/muzzle/tape - greyscale_config = /datum/greyscale_config/tape - greyscale_colors = "#B2B2B2#BD6A62" /datum/embedding/sticky_tape pain_mult = 0 @@ -27,6 +27,9 @@ ignore_throwspeed_threshold = TRUE immune_traits = null +/obj/item/stack/sticky_tape/grind_results() + return list(/datum/reagent/cellulose = 5) + /obj/item/stack/sticky_tape/attack_hand(mob/user, list/modifiers) if(user.get_inactive_held_item() == src) if(is_zero_amount(delete_if_zero = TRUE)) @@ -166,7 +169,7 @@ if(issilicon(interacting_with)) var/mob/living/silicon/robotic_pal = interacting_with - var/robot_is_damaged = robotic_pal.getBruteLoss() + var/robot_is_damaged = robotic_pal.get_brute_loss() if(!robot_is_damaged) user.balloon_alert(user, "[robotic_pal] is not damaged!") @@ -178,7 +181,7 @@ if(!do_after(user, 3 SECONDS, target = robotic_pal)) return ITEM_INTERACT_BLOCKING - robotic_pal.adjustBruteLoss(-object_repair_value) + robotic_pal.adjust_brute_loss(-object_repair_value) use(1) to_chat(user, span_notice("You finish repairing [interacting_with] with [src].")) return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/items/stacks/tiles/light.dm b/code/game/objects/items/stacks/tiles/light.dm index 0c4bce3310a2..651cf36ac1a3 100644 --- a/code/game/objects/items/stacks/tiles/light.dm +++ b/code/game/objects/items/stacks/tiles/light.dm @@ -8,6 +8,7 @@ attack_verb_simple = list("bash", "batter", "bludgeon", "thrash", "smash") turf_type = /turf/open/floor/light merge_type = /obj/item/stack/tile/light + mats_per_unit = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.05, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.05) var/state = 0 /obj/item/stack/tile/light/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm index 4e7c23b51ff5..67a905b4334f 100644 --- a/code/game/objects/items/stacks/tiles/tile_mineral.dm +++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm @@ -230,3 +230,4 @@ turf_type = /turf/open/floor/fake_snow mineralType = "snow" merge_type = /obj/item/stack/tile/mineral/snow + mats_per_unit = list(/datum/material/snow = HALF_SHEET_MATERIAL_AMOUNT / 2) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 31c20817c906..024142e04c44 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -137,6 +137,7 @@ /obj/item/stack/tile/wood/tile, /obj/item/stack/tile/wood/parquet, ) + mats_per_unit = list(/datum/material/wood = HALF_SHEET_MATERIAL_AMOUNT / 2) /obj/item/stack/tile/wood/parquet name = "parquet wood floor tile" @@ -175,6 +176,7 @@ /obj/item/stack/tile/bamboo/tatami/purple, /obj/item/stack/tile/bamboo/tatami/black, ) + mats_per_unit = list(/datum/material/bamboo = HALF_SHEET_MATERIAL_AMOUNT / 2) /obj/item/stack/tile/bamboo/tatami name = "Tatami with green rim" @@ -207,6 +209,7 @@ inhand_icon_state = "tile-basalt" turf_type = /turf/open/floor/fakebasalt merge_type = /obj/item/stack/tile/basalt + mats_per_unit = list(/datum/material/sand = SHEET_MATERIAL_AMOUNT * 2) //Carpets /obj/item/stack/tile/carpet @@ -1079,6 +1082,7 @@ /obj/item/stack/tile/circuit/green, /obj/item/stack/tile/circuit/red, ) + mats_per_unit = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.05, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.05) /obj/item/stack/tile/circuit/green name = "green circuit tile" @@ -1142,7 +1146,7 @@ singular_name = "plastic floor tile" desc = "A tile of cheap, flimsy plastic flooring." icon_state = "tile_plastic" - mats_per_unit = list(/datum/material/plastic=SMALL_MATERIAL_AMOUNT*5) + mats_per_unit = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT / 2) turf_type = /turf/open/floor/plastic merge_type = /obj/item/stack/tile/plastic @@ -1191,13 +1195,13 @@ desc = "A clangy tile made of high-quality bronze. Clockwork construction techniques allow the clanging to be minimized." icon_state = "tile_brass" turf_type = /turf/open/floor/bronze - mats_per_unit = list(/datum/material/bronze=SMALL_MATERIAL_AMOUNT*5) + mats_per_unit = list(/datum/material/bronze = HALF_SHEET_MATERIAL_AMOUNT / 2) merge_type = /obj/item/stack/tile/bronze tile_reskin_types = list( /obj/item/stack/tile/bronze, /obj/item/stack/tile/bronze/flat, /obj/item/stack/tile/bronze/filled, - ) + ) /obj/item/stack/tile/bronze/flat name = "flat bronze tile" @@ -1257,7 +1261,7 @@ desc = "Flooring that shows its contents underneath. Engineers love it!" icon_state = "maint_catwalk" inhand_icon_state = "tile-catwalk" - mats_per_unit = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT) + mats_per_unit = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.2) turf_type = /turf/open/floor/catwalk_floor merge_type = /obj/item/stack/tile/catwalk_tile //Just to be cleaner, these all stack with each other tile_reskin_types = list( @@ -1324,7 +1328,7 @@ inhand_icon_state = "tile-rglass" turf_type = /turf/open/floor/glass/reinforced merge_type = /obj/item/stack/tile/rglass - mats_per_unit = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 0.125, /datum/material/glass=SHEET_MATERIAL_AMOUNT * 0.25) // 4 tiles per sheet + mats_per_unit = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.125, /datum/material/glass=SHEET_MATERIAL_AMOUNT * 0.25) // 4 tiles per sheet /obj/item/stack/tile/rglass/sixty amount = 60 diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index 600c7b3e451b..0c445cc2986b 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -53,8 +53,8 @@ set_greyscale(colors = list(generated_base_color, generated_ribbon_color)) /obj/item/stack/wrapping_paper/click_alt(mob/user) - var/new_base = input(user, "", "Select a base color", color) as color - var/new_ribbon = input(user, "", "Select a ribbon color", color) as color + var/new_base = tgui_color_picker(user, "", "Select a base color", color) + var/new_ribbon = tgui_color_picker(user, "", "Select a ribbon color", color) if(!new_base || !new_ribbon) return CLICK_ACTION_BLOCKING @@ -93,9 +93,11 @@ amount = 25 max_amount = 25 resistance_flags = FLAMMABLE - grind_results = list(/datum/reagent/cellulose = 5) merge_type = /obj/item/stack/package_wrap +/obj/item/stack/package_wrap/grind_results() + return list(/datum/reagent/cellulose = 5) + /obj/item/stack/package_wrap/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] begins wrapping [user.p_them()]self in \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) if(use(3)) diff --git a/code/game/objects/items/stickers.dm b/code/game/objects/items/stickers.dm index 992474937957..eb4b20d6f17b 100644 --- a/code/game/objects/items/stickers.dm +++ b/code/game/objects/items/stickers.dm @@ -220,3 +220,12 @@ /obj/item/sticker/syndicate/trap name = "bear trap sticker" icon_state = "trap" + +/obj/item/sticker/purity_seal + name = "purity seal" + icon_state = "purity_seal_1" + desc = "Looking closer, you realize it's actually a mass produced sticker. You suppose it's the holiness that counts." + +/obj/item/sticker/purity_seal/purity_seal_2 + icon_state = "purity_seal_2" + diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 5d56a3c11bf0..1c8ae11f65a2 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -140,6 +140,12 @@ icon_state = "backpack-medical" inhand_icon_state = "medicalpack" +/obj/item/storage/backpack/chief_medic + name = "chief medical officer's backpack" + desc = "A backpack with just enough pockets to carry the chief medical officer's equipment." + icon_state = "backpack-chiefmedical" + inhand_icon_state = "medicalpack" + /obj/item/storage/backpack/coroner name = "coroner backpack" desc = "It's a backpack especially designed for use in an undead environment." @@ -315,6 +321,12 @@ icon_state = "satchel-medical" inhand_icon_state = "satchel-med" +/obj/item/storage/backpack/satchel/chief_medic + name = "chief medical officer's satchel" + desc = "A satchel with barely enough pockets to carry the chief medical officer's equipment." + icon_state = "satchel-chiefmedical" + inhand_icon_state = "satchel-med" + /obj/item/storage/backpack/satchel/vir name = "virologist satchel" desc = "A sterile satchel with virologist colours." @@ -420,6 +432,12 @@ icon_state = "messenger_medical" inhand_icon_state = "messenger_medical" +/obj/item/storage/backpack/messenger/chief_medic + name = "chief medical officer's messenger bag" + desc = "A slim messenger bag appreciated by chief medical officers for staying out of their way while working - unlike their chemists." + icon_state = "messenger_chiefmedical" + 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." diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 1ce7b49e879c..ed63a3e01446 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -36,6 +36,7 @@ storage_type = /datum/storage/bag/trash ///If true, can be inserted into the janitor cart var/insertable = TRUE + custom_price = 20 // DARKPACK EDIT ADD - ECONOMY /obj/item/storage/bag/trash/Initialize(mapload) . = ..() @@ -101,82 +102,139 @@ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKETS w_class = WEIGHT_CLASS_NORMAL storage_type = /datum/storage/bag/ore - ///If this is TRUE, the holder won't receive any messages when they fail to pick up ore through crossing it + /// If this is TRUE, the holder won't receive any messages when they fail to pick up ore through crossing it var/spam_protection = FALSE - var/mob/listeningTo - ///Cooldown on balloon alerts when picking ore + /// Mob we're currently tracking + var/mob/listening_to = null + /// Are we currently dropping off ores? Used to prevent the bag from instantly picking up ores after dropping them + var/dropping_ores = FALSE + /// Cooldown on balloon alerts when picking ore COOLDOWN_DECLARE(ore_bag_balloon_cooldown) +/obj/item/storage/bag/ore/Destroy(force) + listening_to = null + return ..() + /obj/item/storage/bag/ore/equipped(mob/user) . = ..() - if(listeningTo == user) + if (listening_to) return - if(listeningTo) - UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) - RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(pickup_ores)) - listeningTo = user + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_user_moved)) + if (isturf(user.loc)) + RegisterSignal(user.loc, COMSIG_ATOM_ENTERED, PROC_REF(on_obj_entered)) + RegisterSignal(user.loc, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(on_atom_initialized_on)) + listening_to = user /obj/item/storage/bag/ore/dropped() . = ..() - if(listeningTo) - UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) - listeningTo = null + if(!listening_to) + return + UnregisterSignal(listening_to, COMSIG_MOVABLE_MOVED) + if (listening_to.loc) + UnregisterSignal(listening_to.loc, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON)) + listening_to = null + +// Ensure we don't suck up ores that we've just dropped off +/obj/item/storage/bag/ore/attack_self(mob/user, modifiers) + dropping_ores = TRUE + . = ..() + dropping_ores = FALSE /obj/item/storage/bag/ore/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if(istype(tool, /obj/item/boulder)) to_chat(user, span_warning("You can't fit [tool] into [src]. \ Perhaps you should break it down first, or find an ore box.")) return ITEM_INTERACT_BLOCKING - return NONE -/obj/item/storage/bag/ore/proc/pickup_ores(mob/living/user) +/obj/item/storage/bag/ore/proc/on_user_moved(mob/living/user, atom/old_loc, dir, forced) SIGNAL_HANDLER - var/show_message = FALSE - var/obj/structure/ore_box/box - var/turf/tile = get_turf(user) + if(old_loc) + UnregisterSignal(old_loc, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON)) + var/turf/tile = get_turf(user) if(!isturf(tile)) return + RegisterSignal(tile, COMSIG_ATOM_ENTERED, PROC_REF(on_obj_entered)) + RegisterSignal(tile, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(on_atom_initialized_on)) + INVOKE_ASYNC(src, PROC_REF(handle_move), user) + +/obj/item/storage/bag/ore/proc/handle_move(mob/living/user) + if(user.stat != CONSCIOUS) + return + var/turf/tile = get_turf(user) + var/obj/structure/ore_box/box = null if(istype(user.pulling, /obj/structure/ore_box)) box = user.pulling - if(atom_storage) - for(var/thing in tile) - if(!is_type_in_typecache(thing, atom_storage.can_hold)) - continue - if(box) - user.transferItemToLoc(thing, box) - show_message = TRUE - else if(atom_storage.attempt_insert(thing, user)) - show_message = TRUE - else - if(!spam_protection) - balloon_alert(user, "bag full!") - spam_protection = TRUE - continue - if(show_message) - playsound(user, SFX_RUSTLE, 50, TRUE) - if(!COOLDOWN_FINISHED(src, ore_bag_balloon_cooldown)) - return - - COOLDOWN_START(src, ore_bag_balloon_cooldown, ORE_BAG_BALOON_COOLDOWN) - if (box) - balloon_alert(user, "scoops ore into box") - user.visible_message( - span_notice("[user] offloads the ores beneath [user.p_them()] into [box]."), - ignored_mobs = user - ) - else - balloon_alert(user, "scoops ore into bag") - user.visible_message( - span_notice("[user] scoops up the ores beneath [user.p_them()]."), - ignored_mobs = user - ) + var/show_message = FALSE + for(var/atom/thing as anything in tile) + if(!is_type_in_typecache(thing, atom_storage.can_hold)) + continue + if(pickup_ore(thing, user, box)) + show_message = TRUE + + if (!show_message) + spam_protection = FALSE + return + + playsound(user, SFX_RUSTLE, 50, TRUE) + if(!COOLDOWN_FINISHED(src, ore_bag_balloon_cooldown)) + return spam_protection = FALSE + COOLDOWN_START(src, ore_bag_balloon_cooldown, ORE_BAG_BALOON_COOLDOWN) + + if (box) + balloon_alert(user, "scoops ore into box") + user.visible_message( + span_notice("[user] offloads the ores beneath [user.p_them()] into [box]."), + ignored_mobs = user + ) + return + + balloon_alert(user, "scoops ore into bag") + user.visible_message( + span_notice("[user] scoops up the ores beneath [user.p_them()]."), + ignored_mobs = user + ) + +/obj/item/storage/bag/ore/proc/pickup_ore(obj/item/ore, mob/user, obj/structure/ore_box/box) + if (!box && istype(user.pulling, /obj/structure/ore_box)) + box = user.pulling + + if (box) + user.transferItemToLoc(ore, box, animated = FALSE) + return TRUE + + if (istype(ore, /obj/item/stack/ore)) + var/obj/item/stack/ore/real_ore = ore + for(var/obj/item/stack/ore/stored_ore as anything in src) + if(!real_ore.can_merge(stored_ore)) + continue + real_ore.merge(stored_ore) + if(QDELETED(real_ore)) + return TRUE + + if (atom_storage.attempt_insert(ore, user)) + return TRUE + + if (!spam_protection) + balloon_alert(user, "bag full!") + spam_protection = TRUE + return FALSE + +/obj/item/storage/bag/ore/proc/on_obj_entered(atom/new_loc, atom/movable/arrived, atom/old_loc) + SIGNAL_HANDLER + if(is_type_in_list(arrived, atom_storage.can_hold) && !dropping_ores && old_loc != loc) + INVOKE_ASYNC(src, PROC_REF(pickup_ore), arrived, listening_to) + +/obj/item/storage/bag/ore/proc/on_atom_initialized_on(atom/loc, atom/new_atom) + SIGNAL_HANDLER + if(is_type_in_list(new_atom, atom_storage.can_hold)) + INVOKE_ASYNC(src, PROC_REF(pickup_ore), new_atom, listening_to) /obj/item/storage/bag/ore/cyborg name = "cyborg mining satchel" @@ -250,7 +308,7 @@ // "Only 20 uranium 'cause of radiation" /obj/item/storage/bag/sheetsnatcher/debug/PopulateContents() // amount should be null if it should spawn with the type's default amount - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/stack/sheet/iron/fifty = null, /obj/item/stack/sheet/glass/fifty = null, /obj/item/stack/sheet/rglass/fifty = null, @@ -272,6 +330,7 @@ /obj/item/stack/rods/fifty = null, /obj/item/stack/sheet/mineral/plastitanium = 50, /obj/item/stack/sheet/mineral/abductor = 50, + /obj/item/stack/sheet/mineral/sandbags/fifty = null, /obj/item/stack/sheet/cardboard/fifty = null, ) for(var/obj/item/stack/stack_type as anything in items_inside) @@ -302,6 +361,9 @@ custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*1.5) custom_price = PAYCHECK_CREW * 0.6 storage_type = /datum/storage/bag/tray + sound_vary = TRUE + pickup_sound = SFX_TRAY_PICKUP + drop_sound = SFX_TRAY_DROP /obj/item/storage/bag/tray/attack(mob/living/M, mob/living/user) . = ..() @@ -455,6 +517,7 @@ slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_SUITSTORE|ITEM_SLOT_NECK resistance_flags = FLAMMABLE storage_type = /datum/storage/bag/rebar_quiver + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 6.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.5) /obj/item/storage/bag/rebar_quiver/syndicate icon_state = "syndie_quiver_0" @@ -508,7 +571,7 @@ return var/obj/item/ammo_casing/rebar/ammo_to_load = contents[1] - held_crossbow.attackby(ammo_to_load, user) + held_crossbow.item_interaction(user, ammo_to_load) /obj/item/storage/bag/quiver name = "quiver" @@ -524,6 +587,7 @@ /obj/item/storage/bag/quiver/lesser storage_type = /datum/storage/bag/quiver/less + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT) /obj/item/storage/bag/quiver/full/PopulateContents() . = ..() diff --git a/code/game/objects/items/storage/basket.dm b/code/game/objects/items/storage/basket.dm index ab33ea67d844..4859bd6b598c 100644 --- a/code/game/objects/items/storage/basket.dm +++ b/code/game/objects/items/storage/basket.dm @@ -7,3 +7,6 @@ resistance_flags = FLAMMABLE storage_type = /datum/storage/basket +/obj/item/storage/basket/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 90c990113767..c8695185429a 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -454,7 +454,7 @@ /obj/item/grenade/syndieminibomb = 2, /obj/item/multitool = 1, /obj/item/screwdriver = 1, - ),src) + ), src) /obj/item/storage/belt/wands @@ -588,10 +588,19 @@ w_class = WEIGHT_CLASS_BULKY interaction_flags_click = parent_type::interaction_flags_click | NEED_DEXTERITY | NEED_HANDS var/stored_blade + actions_types = list(/datum/action/innate/blade_counter) + action_slots = ITEM_SLOT_BELT + COOLDOWN_DECLARE(resheath_cooldown) + COOLDOWN_DECLARE(full_ability_cooldown) /obj/item/storage/belt/sheath/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) + RegisterSignal(src, COMSIG_ATOM_STORED_ITEM, PROC_REF(post_resheath)) + +/obj/item/storage/belt/sheath/Destroy(force) + . = ..() + UnregisterSignal(src, COMSIG_ATOM_STORED_ITEM) /obj/item/storage/belt/sheath/examine(mob/user) . = ..() @@ -599,17 +608,17 @@ . += span_notice("Alt-click it to quickly draw the blade.") /obj/item/storage/belt/sheath/click_alt(mob/user) - if(length(contents)) - var/obj/item/I = contents[1] - user.visible_message(span_notice("[user] takes [I] out of [src]."), span_notice("You take [I] out of [src].")) - user.put_in_hands(I) - update_appearance() - else + if(!length(contents)) balloon_alert(user, "it's empty!") + return CLICK_ACTION_BLOCKING + var/obj/item/stored_item = contents[1] + user.visible_message(span_notice("[user] takes [stored_item] out of [src]."), span_notice("You take [stored_item] out of [src].")) + user.put_in_hands(stored_item) + update_appearance() return CLICK_ACTION_SUCCESS /obj/item/storage/belt/sheath/update_icon_state() - icon_state = initial(inhand_icon_state) + icon_state = initial(base_icon_state) // DARKPACK TODO - Fallcon will make a PR that upstreams this change soon inhand_icon_state = initial(inhand_icon_state) worn_icon_state = initial(worn_icon_state) if(contents.len) @@ -623,6 +632,104 @@ new stored_blade(src) update_appearance() +/obj/item/storage/belt/sheath/proc/post_resheath() + SIGNAL_HANDLER + COOLDOWN_START(src, resheath_cooldown, 10 SECONDS) + +/datum/action/innate/blade_counter + name = "Counterattack" + desc = "Anticipate an enemy's attack and strike back with your sheathed blade." + button_icon = 'icons/mob/actions/actions_spells.dmi' + button_icon_state = "declaration" + ranged_mousepointer = 'icons/effects/mouse_pointers/honorbound.dmi' + + enable_text = "You prepare to counterattack a target..." + disable_text = "You relax your stance." + + click_action = TRUE + + var/datum/weakref/eyed_fool + +/datum/action/innate/blade_counter/IsAvailable(feedback = TRUE) + if(!isliving(owner)) + return FALSE + var/obj/item/storage/belt/sheath/owners_sheath = target + if(!COOLDOWN_FINISHED(owners_sheath, full_ability_cooldown)) + if(feedback) + to_chat(owner, span_warning("You failed a counterattack too recently!")) + return FALSE + if(!length(owners_sheath.contents)) + if(feedback) + to_chat(owner, span_warning("Your sheath is empty!")) + return FALSE + if(!COOLDOWN_FINISHED(owners_sheath, resheath_cooldown)) + if(feedback) + to_chat(owner, span_warning("You only just resheathed your blade!")) + return FALSE + return TRUE + +/datum/action/innate/blade_counter/proc/final_checks(atom/cast_on) + if(!isliving(cast_on)) + return FALSE + if(owner == cast_on) + to_chat(owner, span_warning("You can't counterattack yourself!")) + return FALSE + var/mob/living/target = cast_on + if(!target.mind) + to_chat(owner, span_warning("They are too unpredictable to counterattack!")) + return FALSE + var/obj/item/storage/belt/sheath/oursheath = target + if(!length(oursheath.contents)) + return FALSE + return TRUE + +/datum/action/innate/blade_counter/do_ability(mob/living/swordsman, mob/living/cast_on) + if(!final_checks(cast_on)) + return TRUE + var/obj/item/storage/belt/sheath/used_sheath = target + RegisterSignal(swordsman, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(counter_attack)) + swordsman.Immobilize(1 SECONDS) + eyed_fool = WEAKREF(cast_on) + swordsman.visible_message(span_danger("[swordsman] widens [p_their(swordsman)] stance, [p_their(swordsman)] hand hovering over \the [used_sheath]!"), span_notice("You prepare to counterattack [cast_on]!")) + addtimer(CALLBACK(src, PROC_REF(relax), swordsman), 1 SECONDS) + COOLDOWN_START(used_sheath, full_ability_cooldown, 60 SECONDS) + unset_ranged_ability(swordsman) + return TRUE + +#define COUNTERMULTIPLIER 3 + +/datum/action/innate/blade_counter/proc/counter_attack(mob/living/forward_thinker, atom/attackingthing, damage, attack_text, attack_type) + SIGNAL_HANDLER + var/obj/item/storage/belt/sheath/used_sheath = target + if(!used_sheath || !length(used_sheath.contents) || (attack_type != MELEE_ATTACK && attack_type != UNARMED_ATTACK)) + return FAILED_BLOCK + + var/obj/item/justicetool = used_sheath.contents[1] + var/mob/living/fool = isliving(attackingthing) ? attackingthing : attackingthing.loc + if(used_sheath.loc != forward_thinker || fool != eyed_fool.resolve() || !forward_thinker.put_in_active_hand(justicetool)) + return FAILED_BLOCK + var/obj/item/bodypart/offending_hand = fool.get_active_hand() + fool.apply_damage( + damage = justicetool.force * COUNTERMULTIPLIER, + damagetype = justicetool.damtype, + def_zone = offending_hand, + blocked = fool.run_armor_check(offending_hand, MELEE, armour_penetration = justicetool.armour_penetration, silent = TRUE), + wound_bonus = justicetool.wound_bonus * COUNTERMULTIPLIER, + exposed_wound_bonus = justicetool.exposed_wound_bonus * COUNTERMULTIPLIER, + sharpness = justicetool.sharpness, + attack_direction = get_dir(forward_thinker, fool), + attacking_item = justicetool, + ) + playsound(forward_thinker, 'sound/items/unsheath.ogg', 50, TRUE) + forward_thinker.visible_message(span_danger("[forward_thinker] swiftly draws \the [justicetool] and strikes [fool] during [p_their(fool)] attack!"), span_notice("You swiftly draw \the [justicetool] and counter-attack [fool]!")) + COOLDOWN_RESET(used_sheath, full_ability_cooldown) + return SUCCESSFUL_BLOCK + +#undef COUNTERMULTIPLIER + +/datum/action/innate/blade_counter/proc/relax(mob/living/holder) + UnregisterSignal(holder, COMSIG_LIVING_CHECK_BLOCK) + /obj/item/storage/belt/sheath/sabre name = "sabre sheath" desc = "An ornate sheath designed to hold an officer's blade." @@ -640,6 +747,15 @@ worn_icon_state = "grass_sheath" storage_type = /datum/storage/green_sabre_belt +/obj/item/storage/belt/sheath/gladius + name = "gladius scabbard" + desc = "A fun-sized sheath for a fun-sized sword." + icon_state = "gladius_sheath" + inhand_icon_state = "gladius_sheath" + worn_icon_state = "gladius_sheath" + storage_type = /datum/storage/gladius_belt + stored_blade = /obj/item/claymore/gladius + /obj/item/storage/belt/plant name = "botanical belt" desc = "A sturdy leather belt used to hold most hydroponics supplies." diff --git a/code/game/objects/items/storage/boxes/_boxes.dm b/code/game/objects/items/storage/boxes/_boxes.dm index ab29439da506..a491ace1eea7 100644 --- a/code/game/objects/items/storage/boxes/_boxes.dm +++ b/code/game/objects/items/storage/boxes/_boxes.dm @@ -19,6 +19,8 @@ /obj/item/storage/box/Initialize(mapload) . = ..() + if(foldable_result == /obj/item/stack/sheet/cardboard) + set_custom_materials(list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT)) update_appearance() /obj/item/storage/box/suicide_act(mob/living/carbon/user) diff --git a/code/game/objects/items/storage/boxes/cargo_boxes.dm b/code/game/objects/items/storage/boxes/cargo_boxes.dm index ea2fc77ffb13..749873b50a06 100644 --- a/code/game/objects/items/storage/boxes/cargo_boxes.dm +++ b/code/game/objects/items/storage/boxes/cargo_boxes.dm @@ -6,10 +6,10 @@ illustration = "shipping" /obj/item/storage/box/shipping/PopulateContents() - var/static/items_inside = list( - /obj/item/dest_tagger=1, - /obj/item/universal_scanner=1, - /obj/item/stack/package_wrap/small=2, - /obj/item/stack/wrapping_paper/small=1, - ) + var/list/items_inside = list( + /obj/item/dest_tagger = 1, + /obj/item/universal_scanner = 1, + /obj/item/stack/package_wrap/small = 2, + /obj/item/stack/wrapping_paper/small = 1, + ) generate_items_inside(items_inside,src) diff --git a/code/game/objects/items/storage/boxes/clothes_boxes.dm b/code/game/objects/items/storage/boxes/clothes_boxes.dm index 2ac97ff0313d..f692354a689d 100644 --- a/code/game/objects/items/storage/boxes/clothes_boxes.dm +++ b/code/game/objects/items/storage/boxes/clothes_boxes.dm @@ -232,6 +232,14 @@ new /obj/item/clothing/gloves/divine_archer(src) new /obj/item/clothing/shoes/divine_archer(src) +/obj/item/storage/box/holy/heretic + name = "Occult Practitioner Kit" + typepath_for_preview = /obj/item/clothing/suit/chaplainsuit/armor/heretic + +/obj/item/storage/box/holy/heretic/PopulateContents() + new /obj/item/clothing/suit/chaplainsuit/armor/heretic(src) + new /obj/item/clothing/head/helmet/chaplain/heretic(src) + /obj/item/storage/box/floor_camo name = "floor tile camo box" desc = "Thank you for shopping from Camo-J's, our uniquely designed \ diff --git a/code/game/objects/items/storage/boxes/engineering_boxes.dm b/code/game/objects/items/storage/boxes/engineering_boxes.dm index 66e9887039e6..f2f0d43d6208 100644 --- a/code/game/objects/items/storage/boxes/engineering_boxes.dm +++ b/code/game/objects/items/storage/boxes/engineering_boxes.dm @@ -24,7 +24,7 @@ storage_type = /datum/storage/box/debug /obj/item/storage/box/debugtools/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/card/emag=1, /obj/item/construction/rcd/combat/admin=1, /obj/item/disk/tech_disk/debug=1, @@ -41,6 +41,7 @@ /obj/item/uplink/nuclear/debug=1, /obj/item/clothing/ears/earmuffs/debug=1, /obj/item/gps/visible_debug=1, + /obj/item/clothing/glasses/meson/engine/admin=1, ) generate_items_inside(items_inside, src) diff --git a/code/game/objects/items/storage/boxes/food_boxes.dm b/code/game/objects/items/storage/boxes/food_boxes.dm index 090bb71e3b03..68337585ef12 100644 --- a/code/game/objects/items/storage/boxes/food_boxes.dm +++ b/code/game/objects/items/storage/boxes/food_boxes.dm @@ -48,6 +48,7 @@ desc = "Instructions: DO NOT heat in microwave. Product will remove all hostile threats with cutting edge Donk Co. technology." icon_state = "donkpocketboxshell" donktype = /obj/item/ammo_casing/shotgun/flechette/donk + storage_type = /datum/storage/box/donk_bullets /obj/item/storage/box/papersack name = "paper sack" @@ -58,6 +59,7 @@ illustration = null resistance_flags = FLAMMABLE foldable_result = null + custom_materials = list(/datum/material/paper = SHEET_MATERIAL_AMOUNT * 1.25) /// A list of all available papersack reskins var/list/papersack_designs = list() ///What design from papersack_designs we are currently using. @@ -336,7 +338,7 @@ w_class = WEIGHT_CLASS_TINY illustration = null foldable_result = null - custom_price = 3 // DARKPACK EDIT CHANGE + custom_price = 3 // DARKPACK EDIT CHANGE - ECONOMY storage_type = /datum/storage/box/gum ///Typepath of the type of gum that spawns with this box, this is passed to the wrapper for spawning in. @@ -377,7 +379,6 @@ w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE item_flags = NOBLUDGEON|SKIP_FANTASY_ON_SPAWN - grind_results = list(/datum/reagent/aluminium = 1) ///The typepath of the type of gum that will spawn in our PopulateContents, ///this is set in Initialize by the gum box if there is one. @@ -392,6 +393,9 @@ atom_storage.display_contents = FALSE update_appearance(UPDATE_OVERLAYS) +/obj/item/storage/bubblegum_wrapper/grind_results() + return list(/datum/reagent/aluminium = 1) + /obj/item/storage/bubblegum_wrapper/PopulateContents() new gum_to_spawn(src) diff --git a/code/game/objects/items/storage/boxes/implant_boxes.dm b/code/game/objects/items/storage/boxes/implant_boxes.dm index b0961f881e31..b3f1db2e4572 100644 --- a/code/game/objects/items/storage/boxes/implant_boxes.dm +++ b/code/game/objects/items/storage/boxes/implant_boxes.dm @@ -5,7 +5,7 @@ illustration = "implant" /obj/item/storage/box/trackimp/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/implantcase/tracking = 4, /obj/item/implanter = 1, /obj/item/implantpad = 1, @@ -19,7 +19,7 @@ illustration = "implant" /obj/item/storage/box/minertracker/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/implantcase/tracking = 2, /obj/item/implantcase/beacon = 2, /obj/item/implanter = 1, @@ -34,7 +34,7 @@ illustration = "implant" /obj/item/storage/box/chemimp/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/implantcase/chem = 5, /obj/item/implanter = 1, /obj/item/implantpad = 1, @@ -47,7 +47,7 @@ illustration = "implant" /obj/item/storage/box/exileimp/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/implantcase/exile = 5, /obj/item/implanter = 1, /obj/item/implantpad = 1, @@ -61,7 +61,7 @@ illustration = "implant" /obj/item/storage/box/beaconimp/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/implantcase/beacon = 3, /obj/item/implanter = 1, /obj/item/implantpad = 1, @@ -74,7 +74,7 @@ illustration = "implant" /obj/item/storage/box/teleport_blocker/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/implantcase/teleport_blocker = 2, /obj/item/implanter = 1, /obj/item/implantpad = 1, diff --git a/code/game/objects/items/storage/boxes/job_boxes.dm b/code/game/objects/items/storage/boxes/job_boxes.dm index 21c5b51341aa..0c78be971bcd 100644 --- a/code/game/objects/items/storage/boxes/job_boxes.dm +++ b/code/game/objects/items/storage/boxes/job_boxes.dm @@ -190,9 +190,11 @@ return ITEM_INTERACT_BLOCKING qdel(tool) loc.balloon_alert(user, "wheels added, honk!") - var/obj/item/bot_assembly/honkbot/A = new + var/obj/item/bot_assembly/honkbot/assembly = new(drop_location()) + var/held_index = user.is_holding(src) qdel(src) - user.put_in_hands(A) + if (held_index) + user.put_in_hand(assembly, held_index) return ITEM_INTERACT_SUCCESS /obj/item/storage/box/clown/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 7d468ff81b1a..f8563a10024e 100644 --- a/code/game/objects/items/storage/boxes/medical_boxes.dm +++ b/code/game/objects/items/storage/boxes/medical_boxes.dm @@ -87,7 +87,7 @@ illustration = "dna" /obj/item/storage/box/injectors/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/dnainjector/h2m = 3, /obj/item/dnainjector/m2h = 3, ) @@ -127,7 +127,7 @@ illustration = "beaker" /obj/item/storage/box/evilmeds/PopulateContents() - var/static/list/items_inside = list( + var/list/items_inside = list( /obj/item/reagent_containers/cup/beaker/meta/omnizine = 1, /obj/item/reagent_containers/cup/beaker/meta/sal_acid = 1, /obj/item/reagent_containers/cup/beaker/meta/oxandrolone = 1, diff --git a/code/game/objects/items/storage/boxes/misc.dm b/code/game/objects/items/storage/boxes/misc.dm index 41c958b1398e..c9d184feb619 100644 --- a/code/game/objects/items/storage/boxes/misc.dm +++ b/code/game/objects/items/storage/boxes/misc.dm @@ -63,7 +63,7 @@ icon_state = "blank_package" /obj/item/storage/box/methdealer/PopulateContents() - var/static/list/items_inside = list( + var/list/items_inside = list( /obj/item/food/drug/meth_crystal = 4, /obj/item/cigarette/pipe/crackpipe = 2, ) @@ -75,7 +75,7 @@ icon_state = "blank_package" /obj/item/storage/box/opiumdealer/PopulateContents() - var/static/list/items_inside = list( + var/list/items_inside = list( /obj/item/food/drug/opium = 4, /obj/item/cigarette/pipe/cobpipe = 2, ) @@ -87,7 +87,7 @@ icon_state = "blank_package" /obj/item/storage/box/kronkdealer/PopulateContents() - var/static/list/items_inside = list( + var/list/items_inside = list( /obj/item/food/drug/moon_rock = 4, /obj/item/cigarette/pipe/crackpipe = 2, ) diff --git a/code/game/objects/items/storage/boxes/science_boxes.dm b/code/game/objects/items/storage/boxes/science_boxes.dm index 46d0890ea409..11eebd8699cf 100644 --- a/code/game/objects/items/storage/boxes/science_boxes.dm +++ b/code/game/objects/items/storage/boxes/science_boxes.dm @@ -71,7 +71,7 @@ desc = "Contains a variety of basic stock parts." /obj/item/storage/box/stockparts/basic/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/stock_parts/capacitor = 3, /obj/item/stock_parts/servo = 3, /obj/item/stock_parts/matter_bin = 3, @@ -86,7 +86,7 @@ icon_state = "syndiebox" /obj/item/storage/box/stockparts/deluxe/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/stock_parts/capacitor/quadratic = 3, /obj/item/stock_parts/scanning_module/triphasic = 3, /obj/item/stock_parts/servo/femto = 3, @@ -104,7 +104,7 @@ new /obj/item/circuitboard/machine/protolathe/offstation(src) new /obj/item/circuitboard/machine/destructive_analyzer(src) new /obj/item/circuitboard/machine/circuit_imprinter/offstation(src) - new /obj/item/circuitboard/computer/rdconsole(src) + new /obj/item/circuitboard/computer/rdconsole/unlocked(src) /obj/item/storage/box/stabilized //every single stabilized extract from xenobiology name = "box of stabilized extracts" @@ -112,7 +112,7 @@ storage_type = /datum/storage/box/stabilized /obj/item/storage/box/stabilized/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/slimecross/stabilized/adamantine=1, /obj/item/slimecross/stabilized/black=1, /obj/item/slimecross/stabilized/blue=1, diff --git a/code/game/objects/items/storage/boxes/service_boxes.dm b/code/game/objects/items/storage/boxes/service_boxes.dm index 1ef3dd4f47e5..d8e6c2f65209 100644 --- a/code/game/objects/items/storage/boxes/service_boxes.dm +++ b/code/game/objects/items/storage/boxes/service_boxes.dm @@ -150,7 +150,7 @@ custom_premium_price = PAYCHECK_CREW * 3 /obj/item/storage/box/dishdrive/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/circuitboard/machine/dish_drive = 1, /obj/item/screwdriver = 1, /obj/item/stack/cable_coil/five = 1, @@ -294,3 +294,14 @@ /obj/item/storage/box/heretic_box/PopulateContents() for(var/i in 1 to rand(1,4)) new /obj/item/toy/reality_pierce(src) + + +/obj/item/storage/box/purity_seal_box + name = "box of purity seals" + desc = "A box containing several blessed purity seals." + +/obj/item/storage/box/purity_seal_box/PopulateContents() + for(var/i in 1 to 4) + new /obj/item/sticker/purity_seal(src) + new /obj/item/sticker/purity_seal/purity_seal_2(src) + diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index dc710870c56b..3bb4f1d990b7 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -21,6 +21,10 @@ /// The path of the folder that gets spawned in New() var/folder_path = /obj/item/folder +/obj/item/storage/briefcase/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) + /obj/item/storage/briefcase/PopulateContents() new /obj/item/pen(src) var/obj/item/folder/folder = new folder_path(src) @@ -81,10 +85,17 @@ icon_state = "secure" base_icon_state = "secure" inhand_icon_state = "sec-case" + var/stored_lock_code /obj/item/storage/briefcase/secure/Initialize(mapload) . = ..() - AddComponent(/datum/component/lockable_storage) + AddComponent(/datum/component/lockable_storage, stored_lock_code) + RegisterSignal(src, COMSIG_LOCKABLE_STORAGE_SET_CODE, PROC_REF(update_lock_code)) + +/obj/item/storage/briefcase/secure/proc/update_lock_code(obj/item/storage/briefcase/secure/briefacase, new_code) + SIGNAL_HANDLER + + stored_lock_code = new_code /// Base container used for gimmick disks. /obj/item/storage/briefcase/secure/digital_storage diff --git a/code/game/objects/items/storage/dufflebags.dm b/code/game/objects/items/storage/dufflebags.dm index 159f581a76d9..15eaf089d30d 100644 --- a/code/game/objects/items/storage/dufflebags.dm +++ b/code/game/objects/items/storage/dufflebags.dm @@ -132,6 +132,12 @@ icon_state = "duffel-medical" inhand_icon_state = "duffel-med" +/obj/item/storage/backpack/duffelbag/chief_medic + name = "chief medical officer's duffel bag" + desc = "A large duffel bag for handling the duties of the entire medical department at once." + icon_state = "duffel-chiefmedical" + inhand_icon_state = "duffel-med" + /obj/item/storage/backpack/duffelbag/coroner name = "coroner duffel bag" desc = "A large duffel bag for holding large amounts of organs at once." diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index b2e215904fc4..3a7552030ee2 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -176,7 +176,6 @@ open_status = FANCY_CONTAINER_ALWAYS_OPEN contents_tag = "candle" storage_type = /datum/storage/candle_box - custom_price = 8 // DARKPACK EDIT ADD //////////// //CIG PACK// @@ -232,6 +231,8 @@ . = ..() register_context() + if(!spawn_count) + update_appearance() /obj/item/storage/fancy/cigarettes/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) . = ..() @@ -295,6 +296,11 @@ . += "[use_icon_state]_[cig_position]" cig_position++ +/obj/item/storage/fancy/cigarettes/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/dromedaryco name = "\improper Camel packet" // DARKPACK EDIT CHANGE desc = "I'd walk a mile for a Camel!" // DARKPACK EDIT CHANGE @@ -302,6 +308,11 @@ base_icon_state = "dromedary" spawn_type = /obj/item/cigarette/dromedary +/obj/item/storage/fancy/cigarettes/dromedaryco/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_uplift name = "\improper Uplift Smooth packet" desc = "Your favorite brand, now menthol flavored." @@ -309,6 +320,11 @@ base_icon_state = "uplift" spawn_type = /obj/item/cigarette/uplift +/obj/item/storage/fancy/cigarettes/cigpack_uplift/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_robust name = "\improper Malboro packet" // DARKPACK EDIT CHANGE desc = "You get a lot to like with Malboro." // DARKPACK EDIT CHANGE @@ -316,6 +332,11 @@ base_icon_state = "robust" spawn_type = /obj/item/cigarette/robust +/obj/item/storage/fancy/cigarettes/cigpack_robust/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_robustgold name = "\improper Malboro Gold packet" // DARKPACK EDIT CHANGE desc = "You get a lot to like with Malboro." // DARKPACK EDIT CHANGE @@ -323,6 +344,11 @@ base_icon_state = "robustg" spawn_type = /obj/item/cigarette/robustgold +/obj/item/storage/fancy/cigarettes/cigpack_robustgold/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_greytide name = "\improper Mainthol Grey packet" desc = "The thin grey line." @@ -330,6 +356,11 @@ base_icon_state = "greytide" spawn_type = /obj/item/cigarette/greytide +/obj/item/storage/fancy/cigarettes/cigpack_greytide/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_carp name = "\improper Carp Classic packet" desc = "Since 1896." // DARKPACK EDIT CHANGE @@ -337,6 +368,11 @@ base_icon_state = "carp" spawn_type = /obj/item/cigarette/carp +/obj/item/storage/fancy/cigarettes/cigpack_carp/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_syndicate name = "cigarette packet" desc = "An obscure brand of cigarettes." @@ -344,6 +380,11 @@ base_icon_state = "syndie" spawn_type = /obj/item/cigarette/syndicate +/obj/item/storage/fancy/cigarettes/cigpack_syndicate/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_midori name = "\improper Midori Tabako packet" desc = "You can't understand the runes, but the packet smells funny." @@ -351,6 +392,11 @@ base_icon_state = "midori" spawn_type = /obj/item/cigarette/rollie/nicotine +/obj/item/storage/fancy/cigarettes/cigpack_midori/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_candy name = "\improper Timmy's First Candy Smokes packet" desc = "Unsure about smoking? Want to bring your children safely into the family tradition? Look no more with this special packet! Includes 100%* Nicotine-Free candy cigarettes." @@ -366,6 +412,11 @@ if(prob(7)) spawn_type = /obj/item/cigarette/candy/nicotine //uh oh! +/obj/item/storage/fancy/cigarettes/cigpack_candy/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_shadyjims name = "\improper Shady Jim's Super Slims packet" desc = "Is your weight slowing you down? Having trouble running away from gravitational singularities? Can't stop stuffing your mouth? Smoke Shady Jim's Super Slims and watch all that fat burn away. Guaranteed results!" @@ -373,6 +424,11 @@ base_icon_state = "shadyjim" spawn_type = /obj/item/cigarette/shadyjims +/obj/item/storage/fancy/cigarettes/cigpack_shadyjims/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_xeno name = "\improper Newport packet" // DARKPACK EDIT CHANGE desc = "Alive with pleasure!" // DARKPACK EDIT CHANGE @@ -380,6 +436,11 @@ base_icon_state = "slime" spawn_type = /obj/item/cigarette/xeno +/obj/item/storage/fancy/cigarettes/cigpack_xeno/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_cannabis name = "\improper Freak Brothers' Special packet" desc = "A label on the packaging reads, \"Endorsed by Phineas, Freddy and Franklin.\"" @@ -387,6 +448,11 @@ base_icon_state = "midori" spawn_type = /obj/item/cigarette/rollie/cannabis +/obj/item/storage/fancy/cigarettes/cigpack_cannabis/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_mindbreaker name = "\improper Leary's Delight packet" desc = "Banned in over 36 galaxies." @@ -394,6 +460,14 @@ base_icon_state = "shadyjim" spawn_type = /obj/item/cigarette/rollie/mindbreaker +/obj/item/storage/fancy/cigarettes/cigpack_mindbreaker/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + +/obj/item/storage/fancy/cigarettes/flash_powder + spawn_type = /obj/item/cigarette/flash_powder + /obj/item/storage/fancy/rollingpapers name = "rolling paper pack" desc = "A pack of Rollers brand rolling papers." // DARKPACK EDIT CHANGE @@ -408,11 +482,20 @@ has_open_closed_states = FALSE storage_type = /datum/storage/rolling_paper_pack +/obj/item/storage/fancy/rollingpapers/Initialize(mapload) + . = ..() + + if(!spawn_count) + update_appearance() + /obj/item/storage/fancy/rollingpapers/update_overlays() . = ..() if(!contents.len) . += "[base_icon_state]_empty" +/obj/item/storage/fancy/rollingpapers/empty + spawn_count = 0 + ///////////// //CIGAR BOX// ///////////// @@ -436,6 +519,10 @@ //reset any changes the parent call may have made icon_state = base_icon_state +/obj/item/storage/fancy/cigarettes/cigars/empty + spawn_count = 0 + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigars/update_overlays() . = ..() if(!open_status) @@ -452,6 +539,10 @@ base_icon_state = "cohibacase" spawn_type = /obj/item/cigarette/cigar/cohiba +/obj/item/storage/fancy/cigarettes/cigars/cohiba/empty + spawn_count = 0 + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigars/havana name = "\improper premium Havanian cigar case" desc = "A case of classy Havanian cigars." @@ -459,6 +550,10 @@ base_icon_state = "cohibacase" spawn_type = /obj/item/cigarette/cigar/havana +/obj/item/storage/fancy/cigarettes/cigars/havana/empty + spawn_count = 0 + open_status = FANCY_CONTAINER_OPEN + /* * Heart Shaped Box w/ Chocolates */ @@ -514,7 +609,7 @@ spawn_count = 10 contents_tag = "pickle" foldable_result = /obj/item/reagent_containers/cup/beaker/large - custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.25) open_status = FANCY_CONTAINER_ALWAYS_OPEN has_open_closed_states = FALSE storage_type = /datum/storage/pickles_jar diff --git a/code/game/objects/items/storage/garment.dm b/code/game/objects/items/storage/garment.dm index 971e30818aea..fb0a57427734 100644 --- a/code/game/objects/items/storage/garment.dm +++ b/code/game/objects/items/storage/garment.dm @@ -39,6 +39,10 @@ name = "quartermasters's garment bag" desc = "A bag for storing extra clothes and shoes. This one belongs to the quartermaster." +/obj/item/storage/bag/garment/paramedic + name = "EMT's garment bag" + desc = "A bag for storing extra clothes and shoes. This one belongs to the emergency medical team." + /obj/item/storage/bag/garment/captain/PopulateContents() new /obj/item/clothing/under/rank/captain(src) new /obj/item/clothing/under/rank/captain/skirt(src) @@ -54,6 +58,10 @@ new /obj/item/clothing/head/hats/caphat/parade(src) new /obj/item/clothing/neck/cloak/cap(src) new /obj/item/clothing/shoes/laceup(src) + 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) /obj/item/storage/bag/garment/hop/PopulateContents() new /obj/item/clothing/under/rank/civilian/head_of_personnel(src) @@ -92,7 +100,7 @@ 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/gloves/kaza_ruk/sec(src) new /obj/item/clothing/glasses/hud/security/sunglasses(src) new /obj/item/clothing/mask/gas/sechailer(src) @@ -121,7 +129,11 @@ new /obj/item/clothing/head/beret/medical/cmo(src) new /obj/item/clothing/head/utility/surgerycap/cmo(src) new /obj/item/clothing/neck/cloak/cmo(src) - new /obj/item/clothing/shoes/sneakers/blue (src) + new /obj/item/clothing/shoes/sneakers/white(src) + new /obj/item/storage/backpack/chief_medic(src) + new /obj/item/storage/backpack/satchel/chief_medic(src) + new /obj/item/storage/backpack/duffelbag/chief_medic(src) + new /obj/item/storage/backpack/messenger/chief_medic(src) /obj/item/storage/bag/garment/engineering_chief/PopulateContents() new /obj/item/clothing/under/rank/engineering/chief_engineer(src) @@ -147,3 +159,10 @@ new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/neck/cloak/qm(src) new /obj/item/clothing/shoes/sneakers/brown(src) + +/obj/item/storage/bag/garment/paramedic/PopulateContents() + new /obj/item/clothing/under/rank/medical/paramedic(src) + new /obj/item/clothing/under/rank/medical/paramedic/skirt(src) + new /obj/item/clothing/gloves/latex/nitrile(src) + new /obj/item/clothing/shoes/workboots/black(src) + new /obj/item/clothing/glasses/hud/health(src) diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm index 379d8b1c3bfb..a4f9a271c175 100644 --- a/code/game/objects/items/storage/holsters.dm +++ b/code/game/objects/items/storage/holsters.dm @@ -37,9 +37,13 @@ desc = "A rather plain pair of shoulder holsters with a bit of insulated padding inside. Designed to hold energy weaponry. A production stamp indicates that it was shipped with a disabler." /obj/item/storage/belt/holster/energy/disabler/PopulateContents() - generate_items_inside(list( - /obj/item/gun/energy/disabler = 1, - ),src) + new /obj/item/gun/energy/disabler(src) + +/obj/item/storage/belt/holster/energy/laser_pistol + desc = "A rather plain pair of shoulder holsters with a bit of insulated padding inside. Designed to hold energy weaponry. A production stamp indicates that it was shipped with a Type 5C laser pistol." + +/obj/item/storage/belt/holster/energy/laser_pistol/PopulateContents() + new /obj/item/gun/energy/laser/pistol(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." @@ -102,6 +106,3 @@ /obj/item/ammo_box/speedloader/c357 = 2, /obj/item/gun/ballistic/revolver/cowboy/nuclear = 1, ), src) - - - diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 02f89c0f351c..791be925adf0 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -22,6 +22,7 @@ register_context() update_icon_state() + AddElement(/datum/element/cuffable_item) ///screentips for lockboxes /obj/item/storage/lockbox/add_context(atom/source, list/context, obj/item/held_item, mob/user) diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index a4ad08cbbf11..ab56a9253320 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -27,6 +27,10 @@ /// Defines damage type of the medkit. General ones stay null. Used for medibot healing bonuses var/damagetype_healed +/obj/item/storage/medkit/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) + /obj/item/storage/medkit/regular icon_state = "medkit" desc = "A first aid kit with the ability to heal common types of injuries." @@ -38,7 +42,7 @@ /obj/item/storage/medkit/regular/PopulateContents() if(empty) return - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/stack/medical/gauze = 1, /obj/item/stack/medical/suture = 2, /obj/item/stack/medical/mesh = 2, @@ -56,7 +60,7 @@ /obj/item/storage/medkit/emergency/PopulateContents() if(empty) return - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/healthanalyzer/simple = 1, /obj/item/stack/medical/gauze = 1, /obj/item/stack/medical/bandage = 1, @@ -76,7 +80,7 @@ /obj/item/storage/medkit/surgery/PopulateContents() if(empty) return - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/healthanalyzer = 1, /obj/item/stack/medical/gauze/twelve = 1, /obj/item/stack/medical/suture = 2, @@ -100,7 +104,7 @@ /obj/item/storage/medkit/surgery_syndie/PopulateContents() if(empty) return - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/scalpel/advanced = 1, /obj/item/retractor/advanced = 1, /obj/item/cautery/advanced = 1, @@ -126,7 +130,7 @@ /obj/item/storage/medkit/ancient/PopulateContents() if(empty) return - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/stack/medical/gauze = 1, /obj/item/stack/medical/bruise_pack = 3, /obj/item/stack/medical/ointment= 3) @@ -153,7 +157,7 @@ /obj/item/storage/medkit/fire/PopulateContents() if(empty) return - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/reagent_containers/applicator/patch/aiuri = 3, /obj/item/reagent_containers/spray/hercuri = 1, /obj/item/reagent_containers/hypospray/medipen/oxandrolone = 1, @@ -178,7 +182,7 @@ /obj/item/storage/medkit/toxin/PopulateContents() if(empty) return - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/storage/pill_bottle/multiver/less = 1, /obj/item/reagent_containers/syringe/syriniver = 3, /obj/item/storage/pill_bottle/potassiodide = 1, @@ -204,7 +208,7 @@ /obj/item/storage/medkit/o2/PopulateContents() if(empty) return - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/reagent_containers/syringe/convermol = 3, /obj/item/reagent_containers/hypospray/medipen/salbutamol = 1, /obj/item/reagent_containers/hypospray/medipen = 1, @@ -228,7 +232,7 @@ /obj/item/storage/medkit/brute/PopulateContents() if(empty) return - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/reagent_containers/applicator/patch/libital = 3, /obj/item/stack/medical/gauze = 1, /obj/item/storage/pill_bottle/probital = 1, @@ -251,7 +255,7 @@ /obj/item/storage/medkit/advanced/PopulateContents() if(empty) return - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/reagent_containers/applicator/patch/synthflesh = 3, /obj/item/reagent_containers/hypospray/medipen/atropine = 2, /obj/item/stack/medical/gauze = 1, @@ -270,7 +274,7 @@ /obj/item/storage/medkit/tactical_lite/PopulateContents() if(empty) return - var/static/list/items_inside = list( + var/list/items_inside = list( /obj/item/healthanalyzer/advanced = 1, /obj/item/reagent_containers/hypospray/medipen/atropine = 1, /obj/item/stack/medical/gauze = 1, @@ -293,7 +297,7 @@ /obj/item/storage/medkit/tactical/PopulateContents() if(empty) return - var/static/list/items_inside = list( + var/list/items_inside = list( /obj/item/cautery = 1, /obj/item/scalpel = 1, /obj/item/healthanalyzer/advanced = 1, @@ -315,13 +319,15 @@ desc = "May or may not contain traces of lead." icon_state = "medkit_tactical_premium" inhand_icon_state = "medkit-tactical-premium" - grind_results = list(/datum/reagent/lead = 10) storage_type = /datum/storage/medkit/tactical/premium +/obj/item/storage/medkit/tactical/premium/grind_results() + return list(/datum/reagent/lead = 10) + /obj/item/storage/medkit/tactical/premium/PopulateContents() if(empty) return - var/static/list/items_inside = list( + var/list/items_inside = list( /obj/item/stack/medical/suture/medicated = 2, /obj/item/stack/medical/mesh/advanced = 2, /obj/item/reagent_containers/applicator/patch/libital = 3, @@ -352,7 +358,7 @@ /obj/item/storage/medkit/coroner/PopulateContents() if(empty) return - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/reagent_containers/cup/bottle/formaldehyde = 1, /obj/item/reagent_containers/medigel/sterilizine = 1, /obj/item/reagent_containers/blood = 1, @@ -370,14 +376,16 @@ balloon_alert(user, "items inside!") return ITEM_INTERACT_BLOCKING - var/obj/item/bot_assembly/medbot/medbot_assembly = new() + var/obj/item/bot_assembly/medbot/medbot_assembly = new(drop_location()) medbot_assembly.set_skin(get_medbot_skin()) - user.put_in_hands(medbot_assembly) medbot_assembly.balloon_alert(user, "arm added") medbot_assembly.robot_arm = tool.type medbot_assembly.medkit_type = type qdel(tool) + var/held_index = user.is_holding(src) qdel(src) + if (held_index) + user.put_in_hand(medbot_assembly, held_index) return ITEM_INTERACT_SUCCESS /// Gets what skin (icon_state) this medkit uses for a medbot @@ -492,6 +500,7 @@ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' w_class = WEIGHT_CLASS_SMALL storage_type = /datum/storage/test_tube_rack + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT) /obj/item/storage/test_tube_rack/update_icon_state() icon_state = "[base_icon_state][contents.len > 0 ? contents.len : null]" diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index d9e2fe3ae67c..957d6f2e355d 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -19,9 +19,6 @@ PopulateContents() - for (var/obj/item/item in src) - item.item_flags |= IN_STORAGE - /obj/item/storage/create_storage( max_slots, max_specific_storage, diff --git a/code/game/objects/items/storage/toolboxes/_toolbox.dm b/code/game/objects/items/storage/toolboxes/_toolbox.dm index 1a078bebec8d..7601e3264250 100644 --- a/code/game/objects/items/storage/toolboxes/_toolbox.dm +++ b/code/game/objects/items/storage/toolboxes/_toolbox.dm @@ -46,6 +46,7 @@ latches = "quad_latch" // like winning the lottery, but worse update_appearance() AddElement(/datum/element/falling_hazard, damage = force, wound_bonus = wound_bonus, hardhat_safety = TRUE, crushes = FALSE, impact_sound = hitsound) + AddElement(/datum/element/cuffable_item) /obj/item/storage/toolbox/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if (user.combat_mode || !user.has_hand_for_held_index(user.get_inactive_hand_index())) @@ -99,7 +100,7 @@ picked_tool.melee_attack_chain(user, interacting_with, modifiers) current_interactions -= 1 - if (QDELETED(picked_tool) || picked_tool.loc != user || !user.CanReach(picked_tool)) + if (QDELETED(picked_tool) || picked_tool.loc != user || !picked_tool.IsReachableBy(user)) current_interactions = 0 return @@ -148,13 +149,15 @@ /obj/item/storage/toolbox/crafter = "#9D3282", /obj/item/storage/toolbox/syndicate = "#3d3d3d", ) - var/obj/item/bot_assembly/repairbot/repair = new + var/obj/item/bot_assembly/repairbot/repair = new(drop_location()) repair.toolbox = type var/new_color = toolbox_colors[type] || "#445eb3" repair.set_color(new_color) - user.put_in_hands(repair) repair.update_appearance() repair.balloon_alert(user, "sensor added!") qdel(tool) + var/held_index = user.is_holding(src) qdel(src) + if (held_index) + user.put_in_hand(repair, held_index) return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/items/storage/toolboxes/weapons.dm b/code/game/objects/items/storage/toolboxes/weapons.dm index b1e13ba58b57..f7d638486593 100644 --- a/code/game/objects/items/storage/toolboxes/weapons.dm +++ b/code/game/objects/items/storage/toolboxes/weapons.dm @@ -122,7 +122,7 @@ var/i_dont_even_think_once_about_blowing_stuff_up = tgui_alert(user, "Would you like to activate the evidence disposal bomb now?", "BYE BYE", list("Yes","No")) - if(i_dont_even_think_once_about_blowing_stuff_up != "Yes" || currently_exploding || QDELETED(user) || QDELETED(src) || user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING)) + if(i_dont_even_think_once_about_blowing_stuff_up != "Yes" || currently_exploding || QDELETED(user) || QDELETED(src) || !user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING)) return explosion_timer = addtimer(CALLBACK(src, PROC_REF(think_fast_chucklenuts)), 5 SECONDS, (TIMER_UNIQUE|TIMER_OVERRIDE)) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 53548989384a..1e8a9acbba86 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -301,7 +301,7 @@ new /obj/item/clothing/head/helmet/marine/pmc(src) new /obj/item/clothing/mask/gas/sechailer(src) new /obj/item/clothing/glasses/night(src) // 3~ TC - new /obj/item/clothing/gloves/krav_maga/combatglovesplus(src) //5TC + new /obj/item/clothing/gloves/kaza_ruk/combatglovesplus(src) //5TC new /obj/item/clothing/shoes/jackboots(src) new /obj/item/storage/belt/military/assault/fisher(src) //items in this belt easily costs 18 TC @@ -751,7 +751,7 @@ new spess_suit(src) // Above allows me to get the helmet from a variable on the object var/obj/item/clothing/head/helmet/space/syndicate/spess_helmet = GLOB.syndicate_space_suits_to_helmets[spess_suit] new spess_helmet(src) // 4 TC for the space gear - new /obj/item/tank/jetpack/oxygen/harness(src) // They kinda need this to fly to the cruiser. + new /obj/item/tank/jetpack/harness(src) // They kinda need this to fly to the cruiser. // Tacticool gear new /obj/item/clothing/shoes/combat(src) new /obj/item/clothing/under/syndicate(src) @@ -889,9 +889,15 @@ /obj/item/storage/box/syndicate/horse_box/PopulateContents() new /obj/item/food/monkeycube/dangerous_horse(src) - new /obj/item/slimepotion/slime/sentience/nuclear/dangerous_horse(src) + new /obj/item/slimepotion/sentience/nuclear/dangerous_horse(src) new /obj/item/food/grown/apple(src) +/obj/item/storage/box/syndicate/sleeping_carp/PopulateContents() + new /obj/item/book/granter/martial/carp(src) + new /obj/item/clothing/head/costume/snakeeater(src) + new /obj/item/clothing/under/costume/gi(src) + new /obj/item/clothing/shoes/sandal(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 8ab4b176ee1a..51bb6b6e0e18 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -35,7 +35,7 @@ is_magnetic_found = TRUE if(!is_magnetic_found) - var/card_tally = SSid_access.tally_access(id_card, ACCESS_FLAG_COMMAND) + var/card_tally = SSid_access.tally_access(id_card, ACCESS_FLAG_PRV_COMMAND) if(card_tally > winning_tally) winning_tally = card_tally front_id = id_card diff --git a/code/game/objects/items/surgery_tray.dm b/code/game/objects/items/surgery_tray.dm index e55b7d711865..8c0ccdad40fe 100644 --- a/code/game/objects/items/surgery_tray.dm +++ b/code/game/objects/items/surgery_tray.dm @@ -13,6 +13,7 @@ slowdown = 1 item_flags = SLOWS_WHILE_IN_HAND pass_flags = NONE + custom_materials = list(/datum/material/silver = SHEET_MATERIAL_AMOUNT, /datum/material/iron = SHEET_MATERIAL_AMOUNT) /// If true we're currently portable var/is_portable = TRUE @@ -218,6 +219,7 @@ /obj/item/reagent_containers/medigel/sterilizine, /obj/item/bonesetter, /obj/item/blood_filter, + /obj/item/shears, /obj/item/stack/medical/bone_gel, /obj/item/stack/sticky_tape/surgical, /obj/item/clothing/mask/surgical, diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 815631e4cf8d..ad6c52709baf 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -1,5 +1,5 @@ /obj/item/tank/jetpack - name = "jetpack (empty)" + name = "jetpack (oxygen)" desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution." icon_state = "jetpack" inhand_icon_state = "jetpack" @@ -189,6 +189,7 @@ full_speed = FALSE drift_force = 1 NEWTONS stabilizer_force = 0.5 NEWTONS + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 4.4, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3) /obj/item/tank/jetpack/improvised/allow_thrust(num) if(!ismob(loc)) @@ -207,13 +208,7 @@ icon_state = "jetpack-void" inhand_icon_state = "jetpack-void" -/obj/item/tank/jetpack/oxygen - name = "jetpack (oxygen)" - desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas. Use with caution." - icon_state = "jetpack" - inhand_icon_state = "jetpack" - -/obj/item/tank/jetpack/oxygen/harness +/obj/item/tank/jetpack/harness name = "jet harness (oxygen)" desc = "A lightweight tactical harness, used by those who don't want to be weighed down by traditional jetpacks." icon_state = "jetpack-mini" @@ -222,7 +217,7 @@ throw_range = 7 w_class = WEIGHT_CLASS_NORMAL -/obj/item/tank/jetpack/oxygen/captain +/obj/item/tank/jetpack/captain name = "captain's jetpack" desc = "A compact, lightweight jetpack containing a high amount of compressed oxygen." icon_state = "jetpack-captain" @@ -234,14 +229,12 @@ drift_force = 2 NEWTONS stabilizer_force = 2 NEWTONS -/obj/item/tank/jetpack/oxygen/security +/obj/item/tank/jetpack/security name = "security jetpack (oxygen)" desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas by security forces." icon_state = "jetpack-sec" inhand_icon_state = "jetpack-sec" - - /obj/item/tank/jetpack/carbondioxide name = "jetpack (carbon dioxide)" desc = "A tank of compressed carbon dioxide for use as propulsion in zero-gravity areas. Painted black to indicate that it should not be used as a source for internals." diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index a704d49a7f38..3891f34bd095 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -28,6 +28,7 @@ create_reagents(volume, OPENCONTAINER) noz = make_noz() RegisterSignal(noz, COMSIG_MOVABLE_MOVED, PROC_REF(noz_move)) + AddElement(/datum/element/drag_pickup) /obj/item/watertank/Destroy() QDEL_NULL(noz) @@ -90,12 +91,6 @@ else return ..() -/obj/item/watertank/mouse_drop_dragged(atom/over_object) - var/mob/M = loc - if(istype(M) && istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/H = over_object - M.putItemFromInventoryInHandIfPossible(src, H.held_index) - /obj/item/watertank/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(attacking_item == noz) remove_noz() diff --git a/code/game/objects/items/tcg/tcg.dm b/code/game/objects/items/tcg/tcg.dm index d40b236f5c5a..bf4408062c8d 100644 --- a/code/game/objects/items/tcg/tcg.dm +++ b/code/game/objects/items/tcg/tcg.dm @@ -188,6 +188,7 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) icon_state = "deck_up" base_icon_state = "deck" obj_flags = UNIQUE_RENAME + spawn_blacklisted = TRUE var/flipped = FALSE var/static/radial_draw = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_draw") var/static/radial_shuffle = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_shuffle") diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index b1adc436e7a2..18eabb3f8169 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -12,7 +12,7 @@ */ /obj/item/locator name = "bluespace locator" - desc = "Used to track portable teleportation beacons and targets with embedded tracking implants." + desc = "A handheld device that locks onto the unique bluespace resonance of tracking implants, providing real-time directional and positional data." icon = 'icons/obj/devices/tracker.dmi' icon_state = "locator" var/temp = null @@ -34,61 +34,35 @@ /obj/item/locator/ui_data(mob/user) var/list/data = list() - data["trackingrange"] = tracking_range; - // Get our current turf location. - var/turf/sr = get_turf(src) - - if (sr) - // Check every teleport beacon. - var/list/tele_beacons = list() - for(var/obj/item/beacon/W in GLOB.teleportbeacons) - - // Get the tracking beacon's turf location. - var/turf/tr = get_turf(W) + var/turf/current_turf = get_turf(src) // Get our current turf location. + if(!current_turf) + return data - // Make sure it's on a turf and that its Z-level matches the tracker's Z-level - if (tr && tr.z == sr.z) - // Get the distance between the beacon's turf and our turf - var/distance = max(abs(tr.x - sr.x), abs(tr.y - sr.y)) - - // If the target is too far away, skip over this beacon. - if(distance > tracking_range) - continue - - var/beacon_name + var/list/track_implants = list() + for(var/obj/item/implant/tracking/tracking_implant in GLOB.tracked_implants) + if(!tracking_implant.imp_in || !isliving(tracking_implant.imp_in)) + continue - if(W.renamed) - beacon_name = W.name - else - var/area/A = get_area(W) - beacon_name = A.name + var/mob/living/tracked_mob = tracking_implant.imp_in + if(tracked_mob.stat == DEAD) + if(tracked_mob.timeofdeath + tracking_implant.lifespan_postmortem < world.time) + continue - var/D = dir2text(get_dir(sr, tr)) - tele_beacons += list(list(name = beacon_name, direction = D, distance = distance)) + var/turf/implant_turf = get_turf(tracking_implant) + if(!implant_turf || implant_turf.z != current_turf.z) + continue - data["telebeacons"] = tele_beacons + var/distance = max(abs(implant_turf.x - current_turf.x), abs(implant_turf.y - current_turf.y)) // get Chebyshev distance + if(distance > tracking_range) + continue - var/list/track_implants = list() + var/implant_direction = dir2text(get_dir(current_turf, implant_turf)) + track_implants += list(list(name = tracking_implant.imp_in.name, direction = implant_direction, distance = distance)) - for (var/obj/item/implant/beacon/tracking_beacon in GLOB.tracked_implants) - if (!tracking_beacon.imp_in || !isliving(tracking_beacon.loc)) - continue - else - var/mob/living/living_mob = tracking_beacon.loc - if (living_mob.stat == DEAD) - if (living_mob.timeofdeath + tracking_beacon.lifespan_postmortem < world.time) - continue - var/turf/tr = get_turf(tracking_beacon) - var/distance = max(abs(tr.x - sr.x), abs(tr.y - sr.y)) - - if(distance > tracking_range) - continue + data["trackimplants"] = track_implants - var/D = dir2text(get_dir(sr, tr)) - track_implants += list(list(name = tracking_beacon.imp_in.name, direction = D, distance = distance)) - data["trackimplants"] = track_implants return data #define PORTAL_LOCATION_DANGEROUS "portal_location_dangerous" @@ -113,6 +87,9 @@ custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5) armor_type = /datum/armor/item_hand_tele resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP ///List of portal pairs created by this hand tele var/list/active_portal_pairs = list() ///Maximum concurrent active portal pairs allowed @@ -426,7 +403,7 @@ var/bagholdingcheck = FALSE if(iscarbon(user)) var/mob/living/carbon/teleporting_guy = user - if(locate(/obj/item/storage/backpack/holding) in teleporting_guy.get_all_gear()) + if(locate(/obj/item/storage/backpack/holding) in teleporting_guy.get_all_gear(INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT|INCLUDE_ACCESSORIES)) bagholdingcheck = TRUE if(isclosedturf(destination)) diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index ab9acd207a95..c13d621036d3 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -204,7 +204,7 @@ if(victim.incorporeal_move || HAS_TRAIT(victim, TRAIT_GODMODE)) //try to keep this in sync with supermatter's consume fail conditions return ..() var/mob/thrower = throwingdatum?.get_thrower() - if(thrower) + if(istype(thrower)) log_combat(thrower, hit_atom, "consumed", src) message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)], thrown by [key_name_admin(thrower)].") investigate_log("has consumed [key_name(victim)], thrown by [key_name(thrower)]", INVESTIGATE_ENGINE) diff --git a/code/game/objects/items/tongs.dm b/code/game/objects/items/tongs.dm index 3c85cc8c004c..a6be04b604fd 100644 --- a/code/game/objects/items/tongs.dm +++ b/code/game/objects/items/tongs.dm @@ -81,7 +81,7 @@ if (COOLDOWN_FINISHED(src, clack_cooldown)) click_clack() return ..() - if (!IsEdible(attacked) || attacked.w_class > WEIGHT_CLASS_NORMAL || !isnull(tonged)) + if (!IS_EDIBLE(attacked) || attacked.w_class > WEIGHT_CLASS_NORMAL || !isnull(tonged)) return ..() tonged = attacked attacked.do_pickup_animation(src) diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 731fd3e6f0a6..411989719766 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -25,6 +25,7 @@ toolspeed = 1 armor_type = /datum/armor/item_crowbar var/force_opens = FALSE + custom_price = 20 // DARKPACK EDIT ADD - ECONOMY /datum/armor/item_crowbar fire = 50 @@ -132,9 +133,32 @@ 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 = 0 SECONDS + /// The text used for our jaws tool description while active + var/active_text = "cutting" + /// The text used for our jaws tool description while inactive + var/inactive_text = "prying" + /// The default tool behavior. This should match tool_behavior + var/first_tool_behavior = TOOL_CROWBAR + /// The active tool behavior. This should not match tool_behavior on init. + var/second_tool_behavior = TOOL_WIRECUTTER + /// Determines if we want to limit our jaws of life from opening certain doors or not. + var/limit_jaws_access = FALSE + /// The access on doors that block our jaws of life from opening if limit_jaws_access is TRUE. Does nothing if FALSE. + var/list/blacklisted_access = list() + /// Whether or not our jaws throw out an alert when we pry open a door. Default alert sends out a message to security comms. + var/radio_alert = FALSE + /// If radio_alert is TRUE, access in this list that is found on our pried open door is ignored. + var/list/ignored_access = list( + ACCESS_MAINT_TUNNELS, + ACCESS_AUX_BASE, + ACCESS_EXTERNAL_AIRLOCKS, + ) + COOLDOWN_DECLARE(alert_cooldown) + /// How long between announcements from our jaws of life. Keeps the jaws from getting too radio spammy. + var/alert_cooldown_time = 1 MINUTES /obj/item/crowbar/power/get_all_tool_behaviours() - return list(TOOL_CROWBAR, TOOL_WIRECUTTER) + return list(first_tool_behavior, second_tool_behavior) /obj/item/crowbar/power/Initialize(mapload) . = ..() @@ -148,6 +172,11 @@ inhand_icon_change = FALSE, \ ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) + RegisterSignal(src, COMSIG_TOOL_FORCE_OPEN_AIRLOCK, PROC_REF(on_force_open)) + +/obj/item/crowbar/power/examine() + . = ..() + . += "It's fitted with a [tool_behaviour == first_tool_behavior ? inactive_text : active_text] head." /* * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. @@ -157,27 +186,68 @@ /obj/item/crowbar/power/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - tool_behaviour = (active ? TOOL_WIRECUTTER : TOOL_CROWBAR) + tool_behaviour = (active ? second_tool_behavior : first_tool_behavior) if(user) - balloon_alert(user, "attached [active ? "cutting" : "prying"]") + balloon_alert(user, "attached [tool_behaviour == first_tool_behavior ? inactive_text : active_text]") playsound(src, 'sound/items/tools/change_jaws.ogg', 50, TRUE) - if(tool_behaviour == TOOL_CROWBAR) + if(tool_behaviour != TOOL_WIRECUTTER) RemoveElement(/datum/element/cuffsnapping, snap_time_weak_handcuffs, snap_time_strong_handcuffs) else AddElement(/datum/element/cuffsnapping, snap_time_weak_handcuffs, snap_time_strong_handcuffs) return COMPONENT_NO_DEFAULT_MESSAGE -/obj/item/crowbar/power/syndicate - name = "jaws of death" - desc = "An improved, faster, and smaller copy of Nanotrasen's standard jaws of life. Can be used to force open airlocks in its crowbar configuration." - icon_state = "jaws_syndie" - w_class = WEIGHT_CLASS_SMALL - toolspeed = 0.5 - force_opens = TRUE +/* + * Signal proc for [COMSIG_TOOL_FORCE_OPEN_AIRLOCK]. + * + * Determines if our jaws of life is restricted from opening some doors, and whether or not we need to alert over the radio whenever they are used to + * pry open a door. Useful if you want to restrict jaws of life in some fashion. + */ -/obj/item/crowbar/power/examine() - . = ..() - . += " It's fitted with a [tool_behaviour == TOOL_CROWBAR ? "prying" : "cutting"] head." +/obj/item/crowbar/power/proc/on_force_open(obj/item/source, mob/user, obj/machinery/door/airlock/target) + SIGNAL_HANDLER + + var/list/collective_access = list() + collective_access += target.req_access + collective_access += target.req_one_access + + if(limit_jaws_access) + for(var/possible_blacklisted_access in collective_access) + if(possible_blacklisted_access in blacklisted_access) + playsound(src.loc, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) + user.balloon_alert(user, "cannot pry open!") + return COMPONENT_TOOL_DO_NOT_ALLOW_FORCE_OPEN + + if(radio_alert && COOLDOWN_FINISHED(src, alert_cooldown)) + + if(!collective_access) //Return if the door has literally no access at all + return COMPONENT_TOOL_ALLOW_FORCE_OPEN + + for(var/possible_public_access in collective_access) //Return if the door has otherwise unimportant access + if((possible_public_access in ignored_access)) + return COMPONENT_TOOL_ALLOW_FORCE_OPEN + + sound_the_alarms(user, target) + COOLDOWN_START(src, alert_cooldown, alert_cooldown_time) + return COMPONENT_TOOL_ALLOW_FORCE_OPEN + +///Our alert for our jaws of life. +/obj/item/crowbar/power/proc/sound_the_alarms(mob/user, obj/machinery/door/airlock/target) + aas_config_announce(/datum/aas_config_entry/jaws_entry_alert, list( + "PERSON" = user.name, + "LOCATION" = get_area_name(target), + "TOOL" = name), src, list(RADIO_CHANNEL_SECURITY), RADIO_CHANNEL_SECURITY) + +/datum/aas_config_entry/jaws_entry_alert + // This tool screams into the radio whenever the user successfully pries open an airlock. + name = "Door Forced Entry Alert" + announcement_lines_map = list( + RADIO_CHANNEL_SECURITY = "SECURITY ALERT: %PERSON has forced open a door at %LOCATION using %TOOL. Confirm that this was done during an emergency by authorized staff.", + ) + vars_and_tooltips_map = list( + "PERSON" = "will be replaced with the name of the user", + "LOCATION" = "with the area of the door", + "TOOL" = "replaced with the tool used", + ) /obj/item/crowbar/power/suicide_act(mob/living/user) if(tool_behaviour == TOOL_CROWBAR) @@ -194,6 +264,82 @@ playsound(loc, SFX_DESECRATION, 50, TRUE, -1) return BRUTELOSS +/obj/item/crowbar/power/syndicate + name = "jaws of death" + desc = "An improved, faster, and smaller copy of Nanotrasen's standard jaws of life. Can be used to force open airlocks in its crowbar configuration." + icon_state = "jaws_syndie" + w_class = WEIGHT_CLASS_SMALL + toolspeed = 0.5 + +/obj/item/crowbar/power/paramedic + name = "jaws of recovery" + desc = "A specialized version of the jaws of life, primarily to be used by paramedics to recover the injured and the recently deceased. Rather than a cutting arm, this tool has a bonesetting apparatus. \ + Cannot access certain high security areas due to safety concerns." + icon_state = "jaws_paramedic" + inhand_icon_state = "jawsparamedic" + worn_icon_state = "jawsparamedic" + w_class = WEIGHT_CLASS_BULKY + toolspeed = 1 + slot_flags = null + active_text = "bonesetting" + second_tool_behavior = TOOL_BONESET + limit_jaws_access = TRUE + blacklisted_access = list( + ACCESS_COMMAND, + ACCESS_AI_UPLOAD, + ACCESS_CAPTAIN, + ACCESS_HOP, + ACCESS_SECURITY, + ACCESS_BRIG, + ACCESS_ARMORY, + ACCESS_HOS, + ACCESS_DETECTIVE, + ACCESS_CE, + ACCESS_CMO, + ACCESS_QM, + ACCESS_VAULT, + ACCESS_RD, + ACCESS_SYNDICATE, + ) + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 4.75, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 2.50, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 1.75, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.25, + ) + radio_alert = TRUE + +/obj/item/crowbar/power/paramedic/sound_the_alarms(mob/user, obj/machinery/door/airlock/target) + aas_config_announce(/datum/aas_config_entry/jaws_entry_alert_paramedic, list( + "PERSON" = user.name, + "LOCATION" = get_area_name(target), + "TOOL" = name), src, list(RADIO_CHANNEL_SECURITY), RADIO_CHANNEL_SECURITY) + + aas_config_announce(/datum/aas_config_entry/jaws_entry_alert_paramedic, list( + "PERSON" = user.name, + "LOCATION" = get_area_name(target), + "TOOL" = name), src, list(RADIO_CHANNEL_MEDICAL), RADIO_CHANNEL_MEDICAL) + +/datum/aas_config_entry/jaws_entry_alert_paramedic + // This tool screams into the radio whenever the user successfully pries open an airlock. + name = "Door Forced Entry Medical Alert" + announcement_lines_map = list( + RADIO_CHANNEL_SECURITY = "SECURITY ALERT: %PERSON has forced open a door at %LOCATION using %TOOL. Confirm that this was done during an emergency by authorized staff.", + RADIO_CHANNEL_MEDICAL = "MEDICAL ALERT: %PERSON has forced open a door at %LOCATION using %TOOL. Confirm that this was done during an emergency by authorized staff.", + ) + vars_and_tooltips_map = list( + "PERSON" = "will be replaced with the name of the user", + "LOCATION" = "with the area of the door", + "TOOL" = "replaced with the tool used", + ) + +/obj/item/crowbar/power/paramedic/silent + desc = "A specialized version of the jaws of life, primarily to be used by paramedics to recover the injured and the recently deceased. Rather than a cutting arm, this tool has a bonesetting apparatus. \ + This one looks upgraded." + w_class = WEIGHT_CLASS_NORMAL // it's a modified, normal jaws + limit_jaws_access = FALSE + radio_alert = FALSE + /obj/item/crowbar/cyborg name = "hydraulic crowbar" desc = "A hydraulic prying tool, simple but powerful." diff --git a/code/game/objects/items/tools/painter/paintable_decals.dm b/code/game/objects/items/tools/painter/paintable_decals.dm index 5cfbd2cc27f8..a2c330f516a1 100644 --- a/code/game/objects/items/tools/painter/paintable_decals.dm +++ b/code/game/objects/items/tools/painter/paintable_decals.dm @@ -170,7 +170,7 @@ category = "Tiles" default_alpha = /obj/effect/turf_decal/tile::alpha possible_colors = list( - "Neutral" = /obj/effect/turf_decal/tile/neutral::color, + "Neutral" = "#d4d4d432", // very lazy way to do transparent decal, should be remade in future "White" = "#FFFFFF", "Dark" = /obj/effect/turf_decal/tile/dark::color, "Bar Burgundy" = /obj/effect/turf_decal/tile/bar::color, diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index e1b644a08cc9..429cb66a7ef1 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -47,6 +47,7 @@ COLOR_TOOL_CYAN, COLOR_TOOL_YELLOW, ) + custom_price = 20 // DARKPACK EDIT ADD - ECONOMY /datum/armor/item_screwdriver fire = 50 @@ -143,7 +144,7 @@ /obj/item/screwdriver/power/examine() . = ..() - . += " It's fitted with a [tool_behaviour == TOOL_SCREWDRIVER ? "screw" : "bolt"] bit." + . += "It's fitted with a [tool_behaviour == TOOL_SCREWDRIVER ? "screw" : "bolt"] bit." /obj/item/screwdriver/power/suicide_act(mob/living/user) if(tool_behaviour == TOOL_SCREWDRIVER) diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 6ad4bbe579eb..be9eb72889ee 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -48,6 +48,7 @@ var/activation_sound = 'sound/items/tools/welderactivate.ogg' var/deactivation_sound = 'sound/items/tools/welderdeactivate.ogg' + custom_price = 20 // DARKPACK EDIT ADD - ECONOMY /datum/armor/item_weldingtool fire = 100 @@ -333,6 +334,7 @@ name = "industrial welding tool" desc = "A slightly larger welder with a larger tank." icon_state = "indwelder" + inhand_icon_state = "indwelder" max_fuel = 40 custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT*0.6) @@ -353,6 +355,7 @@ name = "emergency welding tool" desc = "A miniature welder used during emergencies." icon_state = "miniwelder" + inhand_icon_state = "miniwelder" max_fuel = 10 w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*0.3, /datum/material/glass=SMALL_MATERIAL_AMOUNT*0.1) @@ -369,6 +372,7 @@ desc = "An alien welding tool. Whatever fuel it uses, it never runs out." icon = 'icons/obj/antags/abductor.dmi' icon_state = "welder" + inhand_icon_state = "abductorwelder" 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) light_system = NO_LIGHT_SUPPORT diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index 612a7cf498c0..7e3d3d39cd53 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -9,13 +9,15 @@ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - /* DARKPACK EDIT REMOVAL START + /* // DARKPACK EDIT REMOVAL START + flags_1 = IS_PLAYER_COLORABLE_1|NO_NEW_GAGS_PREVIEW_1 greyscale_config = /datum/greyscale_config/wirecutters greyscale_config_belt = /datum/greyscale_config/wirecutters_belt_overlay greyscale_config_inhand_left = /datum/greyscale_config/wirecutter_inhand_left greyscale_config_inhand_right = /datum/greyscale_config/wirecutter_inhand_right */ // DARKPACK EDIT REMOVAL END + greyscale_colors = COLOR_RED obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT force = 6 @@ -49,6 +51,7 @@ 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 + custom_price = 20 // DARKPACK EDIT ADD - ECONOMY /datum/armor/item_wirecutters fire = 50 @@ -75,6 +78,10 @@ icon_state = "cutters" toolspeed = 0.1 random_color = FALSE + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_colors = null snap_time_strong_handcuffs = 1 SECONDS /obj/item/wirecutters/cyborg @@ -85,3 +92,5 @@ worn_icon_state = "cutters" toolspeed = 0.5 random_color = FALSE + greyscale_config = null + greyscale_colors = null diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index 25f7e75593fb..28ba97dfcec3 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -25,6 +25,7 @@ tool_behaviour = TOOL_WRENCH toolspeed = 1 armor_type = /datum/armor/item_wrench + custom_price = 20 // DARKPACK EDIT ADD - ECONOMY /datum/armor/item_wrench fire = 50 diff --git a/code/game/objects/items/toy_mechs.dm b/code/game/objects/items/toy_mechs.dm index 74dccf416ee6..cf8b1f341289 100644 --- a/code/game/objects/items/toy_mechs.dm +++ b/code/game/objects/items/toy_mechs.dm @@ -226,15 +226,15 @@ if(1, 3) SpinAnimation(5, 0) playsound(src, 'sound/vehicles/mecha/mechstep.ogg', 30, TRUE) - user.adjustBruteLoss(25) - user.adjustStaminaLoss(50) + user.adjust_brute_loss(25) + user.adjust_stamina_loss(50) if(2) user.SpinAnimation(5, 0) playsound(user, 'sound/items/weapons/smash.ogg', 20, TRUE) combat_health-- //we scratched it! if(4) say(special_attack_cry + "!!") - user.adjustStaminaLoss(25) + user.adjust_stamina_loss(25) if(!combat_sleep(1 SECONDS, null, user)) say("PATHETIC.") @@ -243,7 +243,7 @@ return SHAME sleep(0.5 SECONDS) - user.adjustBruteLoss(450) + user.adjust_brute_loss(450) in_combat = FALSE say("AN EASY WIN. MY POWER INCREASES.") // steal a soul, become swole diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 55a6ba57957f..ed736c39150c 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -459,7 +459,7 @@ return if(!user.is_holding(src)) // Half digestion? Start choking to death user.visible_message(span_suicide("[user] panics and starts choking [user.p_them()]self to death!")) - user.adjustOxyLoss(200) + user.adjust_oxy_loss(200) user.death(FALSE) // unfortunately you have to handle the suiciding yourself with a manual suicide user.ghostize(FALSE) // get the fuck out of our body return @@ -467,13 +467,13 @@ 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(VOMIT_CATEGORY_BLOOD, lost_nutrition = 100, distance = 0) - user.adjustOxyLoss(120) + user.adjust_oxy_loss(120) user.dropItemToGround(src) // incase the crit state doesn't drop the singulo to the floor user.set_suicide(FALSE) return user.transferItemToLoc(src, user, TRUE) CH.cavity_item = src // The mother came inside and found Andy, dead with a HUGE belly full of toys - user.adjustOxyLoss(200) // You know how most small toys in the EU have that 3+ onion head icon and a warning that says "Unsuitable for children under 3 years of age due to small parts - choking hazard"? This is why. + user.adjust_oxy_loss(200) // You know how most small toys in the EU have that 3+ onion head icon and a warning that says "Unsuitable for children under 3 years of age due to small parts - choking hazard"? This is why. user.death(FALSE) user.ghostize(FALSE) @@ -586,6 +586,7 @@ w_class = WEIGHT_CLASS_SMALL attack_verb_continuous = list("attacks", "strikes", "hits") attack_verb_simple = list("attack", "strike", "hit") + custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 4, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.1, /datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.1) /// Whether our sword has been multitooled to rainbow var/hacked = FALSE /// The color of our fake energy sword @@ -788,7 +789,7 @@ /obj/item/dualsaber/toy/impale(mob/living/user)//Stops Toy Dualsabers from injuring clowns to_chat(user, span_warning("You twirl around a bit before losing your balance and impaling yourself on [src].")) - user.adjustStaminaLoss(25) + user.adjust_stamina_loss(25) /obj/item/toy/katana name = "replica katana" @@ -1081,6 +1082,7 @@ icon_state = "snowball" throwforce = 20 //the same damage as a disabler shot damtype = STAMINA //maybe someday we can add stuffing rocks (or perhaps ore?) into snowballs to make them deal brute damage + custom_materials = list(/datum/material/snow = SHEET_MATERIAL_AMOUNT) /obj/item/toy/snowball/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) user.throw_item(interacting_with) @@ -1208,7 +1210,7 @@ /obj/item/toy/figure/Initialize(mapload) . = ..() - desc = "A \"Space Life\" brand [src]." + desc = "A \"Black Dog Games Factory\" brand [src]." // DARKPACK EDIT CHANGE AddElement(/datum/element/toy_talk) /obj/item/toy/figure/attack_self(mob/user as mob) diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 9e513a939cff..8dc3181464c2 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -46,7 +46,9 @@ /obj/item/trash/boritos name = "boritos bag" icon_state = "boritos" - grind_results = list(/datum/reagent/aluminium = 1) //from the mylar bag + +/obj/item/trash/boritos/grind_results() + return list(/datum/reagent/aluminium = 1) /obj/item/trash/boritos/green icon_state = "boritosgreen" @@ -130,9 +132,11 @@ name = "crushed can" icon_state = "cola" resistance_flags = NONE - grind_results = list(/datum/reagent/aluminium = 10) custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*2) +/obj/item/trash/can/grind_results() + return list(/datum/reagent/aluminium = 10) + /obj/item/trash/can/food icon = 'icons/obj/food/canned.dmi' icon_state = "peachcan_empty" diff --git a/code/game/objects/items/v8_engine.dm b/code/game/objects/items/v8_engine.dm index 2d2d5e405933..5b5e934bb25e 100644 --- a/code/game/objects/items/v8_engine.dm +++ b/code/game/objects/items/v8_engine.dm @@ -1,8 +1,14 @@ -#define ENGINE_COOLDOWN (5 SECONDS) -#define DASH_COOLDOWN (2.5 SECONDS) +#define ENGINE_COOLDOWN 5 SECONDS +#define SLASH_COOLDOWN 1.2 SECONDS +#define SLASH_WINDUP 1 SECONDS +#define CHARGE_DAMAGE_MOD 10 #define HOUSE_EDGE_ICONS_MAX 3 #define HOUSE_EDGE_ICONS_MIN 0 +/** + * File for the House Edge sword and the V8 Engine, obtained from the black market. + */ + /obj/item/v8_engine name = "ancient engine" desc = "An extremely well-preserved, massive V8 engine from the early 2000s. It seems to be missing the rest of the vehicle. There's a tiny label on the side." @@ -46,8 +52,9 @@ name = "House Edge" desc = "Dangerous. Loud. Sleek. It has a built in roulette wheel. This thing could easily rip your arm off if you're not careful." icon = 'icons/obj/weapons/sword.dmi' - icon_state = "house_edge0" - inhand_icon_state = "house_edge0" + icon_state = "house_edge" + base_icon_state = "house_edge" + inhand_icon_state = "house_edge" icon_angle = -45 lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' @@ -57,7 +64,9 @@ throwforce = 10 throw_range = 5 throw_speed = 1 + armour_penetration = 15 hitsound = 'sound/items/car_engine_start.ogg' + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 14, /datum/material/cardboard = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.8) /// The number of charges the house edge has accrued through 2-handed hits, to charge a more powerful charge attack. var/fire_charges = 0 ///Sound played when wielded. @@ -74,14 +83,11 @@ /obj/item/house_edge/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(!ismob(target)) return - if(HAS_TRAIT(src, TRAIT_WIELDED)) + var/mob/mob_target = target + if(HAS_TRAIT(src, TRAIT_WIELDED) && mob_target.stat != DEAD) //Add a fire charge to a max of 3, updates icon_state. fire_charges = clamp((fire_charges + 1), HOUSE_EDGE_ICONS_MIN, HOUSE_EDGE_ICONS_MAX) COOLDOWN_RESET(src, fire_charge_cooldown) - else - //Lose a fire charge to a min of 0, updates icon_state. - fire_charges = clamp((fire_charges - 1), HOUSE_EDGE_ICONS_MIN, HOUSE_EDGE_ICONS_MAX) - do_sparks(number = 0, cardinal_only = TRUE, source = src) update_appearance(UPDATE_ICON_STATE) /obj/item/house_edge/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) @@ -90,26 +96,102 @@ if(fire_charges <= 0) balloon_alert(user, "no fire charges!") return ITEM_INTERACT_BLOCKING - user.throw_at(target = get_turf(interacting_with), range = 2 * fire_charges, speed = 5, thrower = user, spin = FALSE, gentle = FALSE, quickstart = TRUE) - COOLDOWN_START(src, fire_charge_cooldown, DASH_COOLDOWN) - reset_charges(on_dash = TRUE) + to_chat(user, span_boldnotice("You take aim at [interacting_with]...")) + user.add_shared_particles(/particles/bonfire) + + if(!do_after(user, SLASH_WINDUP, target = src)) + // Special attack fizzles, no slash and charges lost. + reset_charges() + drop_particles(user) + return ITEM_INTERACT_BLOCKING + + user.add_shared_particles(/particles/bonfire) + new /obj/effect/temp_visual/focus_ring(get_turf(src)) + playsound(src, 'sound/items/car_engine_start.ogg', vol = 35, vary = FALSE, extrarange = 3) + + if(!do_after(user, SLASH_WINDUP * 2, target = src) || fire_charges < 3) + flaming_slash(interacting_with, user, upgraded = FALSE) + return ITEM_INTERACT_SUCCESS + + flaming_slash(interacting_with, user, upgraded = TRUE) //Upgraded slash. return ITEM_INTERACT_SUCCESS /obj/item/house_edge/update_icon_state() - inhand_icon_state = HAS_TRAIT(src, TRAIT_WIELDED) ? "house_edge1" : "house_edge0" - icon_state = "house_edge[fire_charges]" + inhand_icon_state = HAS_TRAIT(src, TRAIT_WIELDED) ? "house_edge1" : "house_edge" + icon_state = "[base_icon_state][fire_charges ? fire_charges : ""]" return ..() -/obj/item/house_edge/proc/reset_charges(on_dash = FALSE) - if(!COOLDOWN_FINISHED(src, fire_charge_cooldown) && !on_dash) +/** + * Proc that handles the house edge's fire_charge mechanic when resetting charges back to zero. + * Updates icon, sets count, and updates icon. + */ +/obj/item/house_edge/proc/reset_charges(on_slash = FALSE) + if(!COOLDOWN_FINISHED(src, fire_charge_cooldown) && !on_slash) return if(fire_charges) balloon_alert_to_viewers("charges lost!") fire_charges = 0 - icon_state = "house_edge[fire_charges]" - update_icon() + update_icon(UPDATE_OVERLAYS|UPDATE_ICON_STATE) + +/// Kills any of the relevant particles off the wielder, as added during special attacks. +/obj/item/house_edge/proc/drop_particles(mob/living/user) + user.remove_shared_particles(/particles/bonfire) + +/** + * Proc that creates and fires the flaming_slash projectile from the house edge special attack. + * Extends off the ranged_interact_with_atom_secondary() behavior. + * * upgraded: when juiced up from the second do_after, applies a light explosion radius to the slash. + */ +/obj/item/house_edge/proc/flaming_slash(atom/interacting_with, mob/living/user, upgraded = FALSE) + // Do the cool slash + var/obj/projectile/flaming_slash/projectile = new /obj/projectile/flaming_slash(get_turf(src)) + + projectile.aim_projectile(interacting_with, src) + projectile.firer = user + projectile.damage += (10 * fire_charges) + if(upgraded) + projectile.explosion_power = 1 + projectile.damage /= 2 // The damage is pretty solid normally, but with the explosion and all the RNG that comes with, it's nearly a 1-shot. This evens a playing field a bit. + projectile.fire(null, interacting_with) + + user.visible_message(span_danger("[user] makes a[upgraded ? " devastating" : "" ] blazing slash at [interacting_with]!"),\ + span_notice("You take a blazing swipe at [interacting_with]!")) + playsound(src, 'sound/items/modsuit/flamethrower.ogg', vol = 75, vary = FALSE, extrarange = 3) + playsound(src, 'sound/items/weapons/slash.ogg', vol = 50, vary = FALSE, extrarange = 3) + + drop_particles(user) + COOLDOWN_START(src, fire_charge_cooldown, SLASH_COOLDOWN) + reset_charges(on_slash = TRUE) + +/// Flaming slash for the special attack at max charges. +/obj/projectile/flaming_slash + name = "flaming slash" + desc = "Someone is about to cash out." + icon_state = "flaming_slash" + damage_type = BURN + armor_flag = MELEE //We're operating off of anime remote slash logic here. As such, we can treat this as a hybrid burn/brute this way. + damage = 10 // Damage amps based on the number of flame_charges it was created off of. + speed = 2 + light_range = 1 + light_power = 1 + light_color = LIGHT_COLOR_FIRE + sharpness = SHARP_EDGED + + ///Applied in on_hit as the light_devastation_range. Defaults to zero unless giving the slash an extra juiced charge. + var/explosion_power = 0 + +/obj/projectile/flaming_slash/on_hit(atom/target, blocked, pierce_hit) + . = ..() + explosion(loc, + light_impact_range = explosion_power, + flame_range = 3, + explosion_cause = "[firer] using \the [fired_from]", + explosion_arc = 120 + ) #undef ENGINE_COOLDOWN -#undef DASH_COOLDOWN +#undef SLASH_COOLDOWN +#undef SLASH_WINDUP +#undef CHARGE_DAMAGE_MOD #undef HOUSE_EDGE_ICONS_MAX #undef HOUSE_EDGE_ICONS_MIN diff --git a/code/game/objects/items/virgin_mary.dm b/code/game/objects/items/virgin_mary.dm index 5ae4d33df2bc..cbd63adf7c00 100644 --- a/code/game/objects/items/virgin_mary.dm +++ b/code/game/objects/items/virgin_mary.dm @@ -56,5 +56,5 @@ return MANUAL_SUICIDE /obj/item/virgin_mary/proc/manual_suicide(mob/living/user) - user.adjustOxyLoss(200) + user.adjust_oxy_loss(200) user.death(FALSE) diff --git a/code/game/objects/items/wall_mounted.dm b/code/game/objects/items/wall_mounted.dm index 2db970b556ae..2cd4c4011dad 100644 --- a/code/game/objects/items/wall_mounted.dm +++ b/code/game/objects/items/wall_mounted.dm @@ -6,65 +6,92 @@ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' w_class = WEIGHT_CLASS_SMALL + ///The final object to construct after mount var/result_path - var/wall_external = FALSE // For frames that are external to the wall they are placed on, like light fixtures and cameras. - var/pixel_shift //The amount of pixels + /// For frames that are external to the wall they are placed on, like light fixtures and cameras. + var/wall_external = FALSE + //The amount of pixels to shift when mounted + var/pixel_shift -/obj/item/wallframe/proc/try_build(turf/on_wall, mob/user) - if(get_dist(on_wall,user) > 1) +/** + * Returns an structure to mount on from the atom passed + * for e.g if its not an closed turf then return an structure on the turf to mount on + * Arguments + * * atom/structure - the atom or something in this atom we are trying to mount on +*/ +/obj/item/wallframe/proc/find_support_structure(atom/structure) + SHOULD_BE_PURE(TRUE) + + return isclosedturf(structure) ? structure : null + +/obj/item/wallframe/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + var/atom/support_structure = find_support_structure(interacting_with) + if(isnull(support_structure)) + return NONE + if(!try_build(support_structure, user)) + return ITEM_INTERACT_FAILURE + + playsound(loc, 'sound/machines/click.ogg', 75, TRUE) + user.visible_message(span_notice("[user.name] attaches [src] to the wall."), + span_notice("You attach [src] to the wall."), + span_hear("You hear clicking.")) + + var/floor_to_support = get_dir(user, support_structure) + var/obj/hanging_object = new result_path(get_turf(user)) + hanging_object.setDir(floor_to_support) + if(pixel_shift) + switch(floor_to_support) + if(NORTH) + hanging_object.pixel_y = pixel_shift + if(SOUTH) + hanging_object.pixel_y = -pixel_shift + if(EAST) + hanging_object.pixel_x = pixel_shift + if(WEST) + hanging_object.pixel_x = -pixel_shift + if(!istype(get_area(user), /area/shuttle)) //due to turf changing issue we don't mount here for now + hanging_object.AddComponent(/datum/component/atom_mounted, support_structure) + after_attach(hanging_object) + qdel(src) + + return ITEM_INTERACT_SUCCESS + +/** + * Check if we can build on this support structure + * + * Arguments + * * atom/support - the atom we are trying to mount on + * * mob/user - the player attempting to do the mount +*/ +/obj/item/wallframe/proc/try_build(atom/support, mob/user) + if(get_dist(support, user) > 1) balloon_alert(user, "you are too far!") - return - var/floor_to_wall = get_dir(user, on_wall) - if(!(floor_to_wall in GLOB.cardinals)) + return FALSE + var/floor_to_support = get_dir(user, support) + if(!(floor_to_support in GLOB.cardinals)) balloon_alert(user, "stand in line with wall!") - return + return FALSE var/turf/T = get_turf(user) - var/area/A = get_area(T) if(!isfloorturf(T)) balloon_alert(user, "cannot place here!") - return - if(A.always_unpowered) - balloon_alert(user, "cannot place in this area!") - return - if(check_wall_item(T, floor_to_wall, wall_external)) + return FALSE + if(check_wall_item(T, floor_to_support, wall_external)) balloon_alert(user, "already something here!") - return + return FALSE return TRUE -/obj/item/wallframe/proc/attach(turf/on_wall, mob/user) - if(result_path) - playsound(src.loc, 'sound/machines/click.ogg', 75, TRUE) - user.visible_message(span_notice("[user.name] attaches [src] to the wall."), - span_notice("You attach [src] to the wall."), - span_hear("You hear clicking.")) - var/floor_to_wall = get_dir(user, on_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) - hanging_object.pixel_y = pixel_shift - if(SOUTH) - hanging_object.pixel_y = -pixel_shift - if(EAST) - hanging_object.pixel_x = pixel_shift - if(WEST) - hanging_object.pixel_x = -pixel_shift - after_attach(hanging_object) - - qdel(src) - +/** + * Stuff to do after wallframe attached to support atom + * + * Arguments + * * obj/attached_to - the object that has been created on the atom +*/ /obj/item/wallframe/proc/after_attach(obj/attached_to) transfer_fingerprints_to(attached_to) /obj/item/wallframe/screwdriver_act(mob/living/user, obj/item/tool) - // For camera-building borgs - var/turf/wall_turf = get_step(get_turf(user), user.dir) - if(iswallturf(wall_turf)) - wall_turf.item_interaction(user, src) - return ITEM_INTERACT_SUCCESS + return interact_with_atom(get_step(get_turf(user), user.dir), user) /obj/item/wallframe/wrench_act(mob/living/user, obj/item/tool) var/metal_amt = round(custom_materials[GET_MATERIAL_REF(/datum/material/iron)]/SHEET_MATERIAL_AMOUNT) //Replace this shit later @@ -91,5 +118,10 @@ obj_flags = CONDUCTS_ELECTRICITY w_class = WEIGHT_CLASS_SMALL custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 0.5) - grind_results = list(/datum/reagent/iron = 10, /datum/reagent/silicon = 10) custom_price = PAYCHECK_CREW * 0.5 + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP + +/obj/item/electronics/grind_results() + return list(/datum/reagent/iron = 10, /datum/reagent/silicon = 10) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 1f0583f75037..cabe475fb602 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -155,7 +155,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 return BRUTELOSS /obj/item/claymore/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) - if(attack_type == (PROJECTILE_ATTACK || LEAP_ATTACK || OVERWHELMING_ATTACK)) + if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK) final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword. Or a road roller, if one happened to hit you. return ..() @@ -173,6 +173,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throw_range = 5 armour_penetration = 35 +/obj/item/claymore/cutlass/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) //closed sword guard + /obj/item/claymore/cutlass/old name = "old cutlass" desc = parent_type::desc + " This one seems a tad old." @@ -359,6 +363,25 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/claymore/highlander/robot/process() loc.layer = ABOVE_ALL_MOB_LAYER +/obj/item/claymore/gladius + name = "gladius" + desc = "A short but formidable sword, favored by recently-reanimated ancient warriors." + icon = 'icons/obj/weapons/sword.dmi' + icon_state = "gladius" + inhand_icon_state = "gladius" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + sharpness = SHARP_POINTY + attack_verb_continuous = list("stabs", "cuts") + attack_verb_simple = list("stab", "cut") + slot_flags = null + sound_vary = TRUE + block_sound = 'sound/items/weapons/parry.ogg' + hitsound = 'sound/items/weapons/bladeslice.ogg' + pickup_sound = SFX_KNIFE_PICKUP + drop_sound = SFX_KNIFE_DROP + + /obj/item/katana name = "katana" desc = "Woefully underpowered in D20." @@ -392,6 +415,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 alt_simple = string_list(alt_simple) AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -15) +/obj/item/katana/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) + if(attack_type == OVERWHELMING_ATTACK) + final_block_chance = 0 //Not a high freuqnecy blade, sorry pal + return ..() + /datum/armor/item_katana fire = 100 acid = 50 @@ -563,8 +591,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/phone name = "red phone" desc = "Should anything ever go wrong..." - icon = 'icons/obj/devices/voice.dmi' - icon_state = "red_phone" + icon = 'modular_darkpack/modules/phones/icons/phone.dmi' // DARKPACK EDIT CHANGE + icon_state = "phone_red" // DARKPACK EDIT CHANGE force = 3 throwforce = 2 throw_speed = 3 @@ -600,6 +628,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 icon_angle = -135 lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' + custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 4) /obj/item/bambostaff/Initialize(mapload) . = ..() @@ -614,6 +643,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 icon_state = inhand_icon_state = "[base_icon_state][HAS_TRAIT(src, TRAIT_WIELDED)]" return ..() +/obj/item/bambostaff/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(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK) + final_block_chance = 0 //Don't bring a staff to a gunfight, and also you aren't going to really block someone full body tackling you with a staff. Or a road roller, if one happened to hit you. + return ..() + /obj/item/cane name = "cane" desc = "A cane used by a true gentleman. Or a clown." @@ -672,6 +706,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb_continuous = list("bludgeons", "whacks", "thrashes") attack_verb_simple = list("bludgeon", "whack", "thrash") +/obj/item/cane/crutch/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) + /obj/item/cane/crutch/examine(mob/user, thats) . = ..() // tacked on after the cane string @@ -708,7 +746,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 desc = "A handmade crutch. Also makes a decent bludgeon if you need it." icon_state = "crutch_wood" inhand_icon_state = "crutch_wood" - custom_materials = list(/datum/material/wood = SMALL_MATERIAL_AMOUNT * 0.5) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 5) /obj/item/cane/white name = "white cane" @@ -724,6 +762,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/cane/white/Initialize(mapload) . = ..() + AddElement(/datum/element/cuffable_item) AddComponent( \ /datum/component/transforming, \ force_on = 7, \ @@ -810,7 +849,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 gender = PLURAL icon = 'icons/effects/magic.dmi' icon_state = "ectoplasm" - grind_results = list(/datum/reagent/hauntium = 25) //can be ground into hauntium + +/obj/item/ectoplasm/grind_results() + return list(/datum/reagent/hauntium = 25) /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!")) @@ -835,87 +876,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throw_range = 1 attack_verb_continuous = list("clubs", "bludgeons") attack_verb_simple = list("club", "bludgeon") - -/obj/item/melee/skateboard - name = "skateboard" - desc = "A skateboard. It can be placed on its wheels and ridden, or used as a radical weapon." - icon = 'icons/mob/rideables/vehicles.dmi' - icon_state = "skateboard_held" - inhand_icon_state = "skateboard" - force = 12 - throwforce = 4 - w_class = WEIGHT_CLASS_NORMAL - attack_verb_continuous = list("smacks", "whacks", "slams", "smashes") - attack_verb_simple = list("smack", "whack", "slam", "smash") - ///The vehicle counterpart for the board - var/board_item_type = /obj/vehicle/ridden/scooter/skateboard - -/obj/item/melee/skateboard/attack_self(mob/user) - var/obj/vehicle/ridden/scooter/skateboard/S = new board_item_type(get_turf(user))//this probably has fucky interactions with telekinesis but for the record it wasn't my fault - S.buckle_mob(user) - qdel(src) - -/obj/item/melee/skateboard/improvised - name = "improvised skateboard" - desc = "A jury-rigged skateboard. It can be placed on its wheels and ridden, or used as a radical weapon." - board_item_type = /obj/vehicle/ridden/scooter/skateboard/improvised - -/obj/item/melee/skateboard/pro - name = "skateboard" - desc = "An EightO brand professional skateboard. It looks sturdy and well made." - icon_state = "skateboard2_held" - inhand_icon_state = "skateboard2" - board_item_type = /obj/vehicle/ridden/scooter/skateboard/pro - custom_premium_price = PAYCHECK_COMMAND * 5 - -/obj/item/melee/skateboard/hoverboard - name = "hoverboard" - desc = "A blast from the past, so retro!" - icon_state = "hoverboard_red_held" - inhand_icon_state = "hoverboard_red" - board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard - custom_premium_price = PAYCHECK_COMMAND * 5.4 //If I can't make it a meme I'll make it RAD - -/obj/item/melee/skateboard/hoverboard/admin - name = "Board Of Directors" - desc = "The engineering complexity of a spaceship concentrated inside of a board. Just as expensive, too." - icon_state = "hoverboard_nt_held" - inhand_icon_state = "hoverboard_nt" - board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard/admin - -/obj/item/melee/skateboard/holyboard - name = "holy skateboard" - desc = "A board blessed by the gods with the power to grind for our sins. Has the initials 'J.C.' on the underside." - icon_state = "hoverboard_holy_held" - inhand_icon_state = "hoverboard_holy" - force = 18 - throwforce = 6 - w_class = WEIGHT_CLASS_NORMAL - attack_verb_continuous = list("bashes", "crashes", "grinds", "skates") - attack_verb_simple = list("bash", "crash", "grind", "skate") - board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard/holyboarded - -/obj/item/melee/skateboard/holyboard/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 MAGICKS!!", \ - 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) \ - ) - AddElement(/datum/element/bane, mob_biotypes = MOB_SPIRIT, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE) - -/obj/item/melee/skateboard/holyboard/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 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) /obj/item/melee/baseball_bat name = "baseball bat" @@ -1095,10 +1056,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 w_class = WEIGHT_CLASS_SMALL /// Things in this list will be instantly splatted. Flyman weakness is handled in the flyman species weakness proc. var/static/list/splattable - /// Things in this list which take a lot more damage from the fly swatter, but not be necessarily killed by it. - var/static/list/strong_against - /// How much extra damage the fly swatter does against mobs it is strong against - var/extra_strength_damage = 24 /obj/item/melee/flyswatter/Initialize(mapload) . = ..() @@ -1113,15 +1070,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/effect/decal/cleanable/ants, /obj/item/queen_bee, )) - if (isnull(strong_against)) - strong_against = typecacheof(list( - /mob/living/basic/spider, - )) - + AddElement(/datum/element/bane, mob_biotypes = MOB_BUG, target_type = /mob/living/basic, damage_multiplier = 0, added_damage = 24, requires_combat_mode = FALSE) /obj/item/melee/flyswatter/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(is_type_in_typecache(target, splattable)) to_chat(user, span_warning("You easily splat [target].")) + if(QDELETED(target)) + return if(isliving(target)) new /obj/effect/decal/cleanable/insectguts(target.drop_location()) var/mob/living/bug = target @@ -1129,10 +1084,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 bug.gib(DROP_ALL_REMAINS) else qdel(target) - return - if(is_type_in_typecache(target, strong_against) && isliving(target)) - var/mob/living/living_target = target - living_target.adjustBruteLoss(extra_strength_damage) /obj/item/proc/can_trigger_gun(mob/living/user, akimbo_usage) if(!user.can_use_guns(src)) @@ -1263,7 +1214,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 playsound(src, SFX_BULLET_MISS, 75, TRUE) return TRUE return FALSE - if(prob(final_block_chance * (HAS_TRAIT(src, TRAIT_WIELDED) ? 2 : 1))) + var/stop_that_blade = (final_block_chance + (attack_type == OVERWHELMING_ATTACK ? 25 : 0)) * (HAS_TRAIT(src, TRAIT_WIELDED) ? 2 : 1) + if(prob(stop_that_blade)) owner.visible_message(span_danger("[owner] parries [attack_text] with [src]!")) return TRUE return FALSE diff --git a/code/game/objects/items/wiki_manuals.dm b/code/game/objects/items/wiki_manuals.dm index 671f408557c6..e3647434e61f 100644 --- a/code/game/objects/items/wiki_manuals.dm +++ b/code/game/objects/items/wiki_manuals.dm @@ -200,7 +200,7 @@ part.adjustBleedStacks(5) H.gib_animation() sleep(0.3 SECONDS) - H.adjustBruteLoss(1000) //to make the body super-bloody + H.adjust_brute_loss(1000) //to make the body super-bloody // if we use gib() then the body gets deleted H.spawn_gibs() H.spill_organs(DROP_ALL_REMAINS) diff --git a/code/game/objects/items/wind_turbine.dm b/code/game/objects/items/wind_turbine.dm index 74cd1213b698..b713c3acd5ee 100644 --- a/code/game/objects/items/wind_turbine.dm +++ b/code/game/objects/items/wind_turbine.dm @@ -22,12 +22,11 @@ force = 10 throwforce = 6 w_class = WEIGHT_CLASS_BULKY + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 22, /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.5) ///What item is being charged currently? var/obj/item/charging = null ///Did we put power into "charging" last process()? var/using_power = FALSE - ///Did we finish recharging the currently inserted item? - var/finished_recharging = FALSE ///Current rotor animation frame. (floating point value). var/rotor_tick = 0 @@ -231,7 +230,6 @@ if(is_type_in_typecache(arrived, allowed_devices)) charging = arrived START_PROCESSING(SSmachines, src) - finished_recharging = FALSE using_power = TRUE update_appearance() return ..() @@ -313,18 +311,17 @@ if(charging_cell) var/wanted_power = min(charging_cell.maxcharge - charging_cell.charge, charging_cell.chargerate) if(wanted_power > 0) - using_power = TRUE var/power_to_give = min(available_power, wanted_power) * seconds_per_tick / 2 if (power_to_give > 0) charging_cell.give(power_to_give) available_power -= power_to_give + if(charging_cell.charge == charging_cell.maxcharge) + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + say("[charging] has finished recharging!") + else + using_power = TRUE update_appearance() - if(!using_power && !finished_recharging) //Inserted thing is at max charge/ammo, notify those around us - finished_recharging = TRUE - playsound(src, 'sound/machines/ping.ogg', 30, TRUE) - say("[charging] has finished recharging!") - /obj/item/portable_wind_turbine/emp_act(severity) . = ..() if (. & EMP_PROTECT_CONTENTS) diff --git a/code/game/objects/items/wizard_weapons.dm b/code/game/objects/items/wizard_weapons.dm index 7179eedb9d58..5c8eaf4a8184 100644 --- a/code/game/objects/items/wizard_weapons.dm +++ b/code/game/objects/items/wizard_weapons.dm @@ -64,7 +64,7 @@ return charged = FALSE - if(isliving(target)) + if(isliving(target) && !QDELETED(target)) var/mob/living/smacked = target smacked.take_bodypart_damage(20, 0) playsound(user, 'sound/items/weapons/marauder.ogg', 50, TRUE) diff --git a/code/game/objects/items_reskin.dm b/code/game/objects/items_reskin.dm deleted file mode 100644 index 98a3165b5e2a..000000000000 --- a/code/game/objects/items_reskin.dm +++ /dev/null @@ -1,95 +0,0 @@ -/// Called when alt clicked and the item has unique reskin options -/obj/item/proc/on_click_alt_reskin(datum/source, mob/user) - SIGNAL_HANDLER - - if(!user.can_perform_action(src, NEED_DEXTERITY)) - return NONE - - if(!(obj_flags & INFINITE_RESKIN) && current_skin) - return NONE - - INVOKE_ASYNC(src, PROC_REF(reskin_obj), user) - return CLICK_ACTION_SUCCESS - -/** - * Checks if we should set up reskinning, - * by default if unique_reskin is set. - * - * Called on setup_reskinning(). - * Inheritors should override this to add their own checks. - */ -/obj/item/proc/check_setup_reskinning() - SHOULD_CALL_PARENT(TRUE) - if(unique_reskin) - return TRUE - - return FALSE - -/** - * Registers signals and context for reskinning, - * if check_setup_reskinning() passes. - * - * Called on Initialize(...). - * Inheritors should override this to add their own setup steps, - * or to avoid double calling register_context(). - */ -/obj/item/proc/setup_reskinning() - SHOULD_CALL_PARENT(FALSE) - if(!check_setup_reskinning()) - return - - RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) - register_context() - -/** - * Reskins object based on a user's choice - * - * Arguments: - * * user The mob choosing a reskin option - */ -/obj/item/proc/reskin_obj(mob/user) - if(!LAZYLEN(unique_reskin)) - return - - var/list/items = list() - for(var/reskin_option in unique_reskin) - var/image/item_image = image(icon = src.icon, icon_state = unique_reskin[reskin_option]) - items += list("[reskin_option]" = item_image) - sort_list(items) - - var/pick = show_radial_menu(user, src, items, custom_check = CALLBACK(src, PROC_REF(check_reskin_menu), user), radius = 38, require_near = TRUE) - if(!pick) - return - if(!unique_reskin[pick]) - return - current_skin = pick - icon_state = unique_reskin[pick] - - if (unique_reskin_changes_base_icon_state) - base_icon_state = icon_state - - if (unique_reskin_changes_inhand) - inhand_icon_state = icon_state - - update_appearance() - - to_chat(user, "[src] is now skinned as '[pick].'") - SEND_SIGNAL(src, COMSIG_OBJ_RESKIN, user, pick) - - -/** - * Checks if we are allowed to interact with a radial menu for reskins - * - * Arguments: - * * user The mob interacting with the menu - */ -/obj/item/proc/check_reskin_menu(mob/user) - if(QDELETED(src)) - return FALSE - if(!(obj_flags & INFINITE_RESKIN) && current_skin) - return FALSE - if(!istype(user)) - return FALSE - if(user.incapacitated) - return FALSE - return TRUE diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 1d343314531a..6dd7f49ac611 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -27,7 +27,7 @@ return TRUE -/obj/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) +/obj/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE, blocked = null) . = ..() if(. != BULLET_ACT_HIT) return . @@ -125,8 +125,9 @@ /obj/fire_act(exposed_temperature, exposed_volume) if(HAS_TRAIT(src, TRAIT_UNDERFLOOR)) return - if(exposed_temperature && !(resistance_flags & FIRE_PROOF)) - take_damage(clamp(0.02 * exposed_temperature, 0, 20), BURN, FIRE, 0) + var/potential_damage = 0.02 * exposed_temperature + if(exposed_temperature && !(resistance_flags & FIRE_PROOF) && (potential_damage > damage_deflection)) + take_damage(clamp(potential_damage, 0, 20), BURN, FIRE, 0) if(QDELETED(src)) // take_damage() can send our obj to an early grave, let's stop here if that happens return if(!(resistance_flags & ON_FIRE) && (resistance_flags & FLAMMABLE) && !(resistance_flags & FIRE_PROOF)) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 5f9b566b6703..cc7cf0f2ccd8 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -64,10 +64,14 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag) if (id_tag) GLOB.objects_by_id_tag[id_tag] = src + if(opacity) + SScameras.update_visibility(src) /obj/Destroy(force) if(!ismachinery(src)) STOP_PROCESSING(SSobj, src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists + if(opacity) + SScameras.update_visibility(src) SStgui.close_uis(src) GLOB.objects_by_id_tag -= id_tag . = ..() @@ -347,3 +351,19 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag) if(HAS_TRAIT(target, TRAIT_INVERTED_DEMOLITION)) return (1 / demolition_mod) return demolition_mod + +/// Checks performed by a renamable object(through UNIQUE_RENAME obj_flag) before renaming begins. +/obj/proc/rename_checks(mob/living/user) + return TRUE + +/// Returns the final name of the object, and does any side effects of renaming, such as sounds. +/obj/proc/nameformat(input, mob/living/user) + return input + +/// Same as nameformat, but for desc. +/obj/proc/descformat(input, mob/living/user) + return input + +/// Called when UNIQUE_RENAME is reset +/obj/proc/rename_reset() + return diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 3e7e13c1df2f..9d4442238ac9 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -23,10 +23,8 @@ if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH(src) QUEUE_SMOOTH_NEIGHBORS(src) - GLOB.cameranet.updateVisibility(src) /obj/structure/Destroy(force) - GLOB.cameranet.updateVisibility(src) if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH_NEIGHBORS(src) return ..() diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm deleted file mode 100644 index 6eee27ce24ee..000000000000 --- a/code/game/objects/structures/ai_core.dm +++ /dev/null @@ -1,484 +0,0 @@ -#define AI_CORE_BRAIN(X) X.braintype == "Android" ? "brain" : "MMI" - -/obj/structure/ai_core - density = TRUE - anchored = FALSE - name = "\improper AI core" - icon = 'icons/mob/silicon/ai.dmi' - icon_state = "0" - desc = "The framework for an artificial intelligence core." - max_integrity = 500 - var/state = EMPTY_CORE - var/datum/ai_laws/laws - var/obj/item/circuitboard/aicore/circuit - var/obj/item/mmi/core_mmi - /// only used in cases of AIs piloting mechs or shunted malf AIs, possible later use cases - var/mob/living/silicon/ai/remote_ai = null - -/obj/structure/ai_core/Initialize(mapload) - . = ..() - laws = new - laws.set_laws_config() - -/obj/structure/ai_core/examine(mob/user) - . = ..() - if(!anchored) - if(state != EMPTY_CORE) - . += span_notice("It has some bolts that could be tightened.") - else - . += span_notice("It has some bolts that could be tightened. The frame can be melted down.") - else - switch(state) - if(EMPTY_CORE) - . += span_notice("There is a slot for a circuit board, its bolts can be loosened.") - if(CIRCUIT_CORE) - . += span_notice("The circuit board can be screwed into place or pried out.") - if(SCREWED_CORE) - . += span_notice("The frame can be wired, the circuit board can be unfastened.") - if(CABLED_CORE) - if(!core_mmi) - . += span_notice("There are wires which could be hooked up to an MMI or positronic brain, or cut.") - else - var/accept_laws = TRUE - if(core_mmi.laws.id != DEFAULT_AI_LAWID || !core_mmi.brainmob || !core_mmi.brainmob?.mind) - accept_laws = FALSE - . += span_notice("There is a slot for a reinforced glass panel, the [AI_CORE_BRAIN(core_mmi)] could be pried out.[accept_laws ? " A law module can be swiped across." : ""]") - if(GLASS_CORE) - . += span_notice("The monitor [core_mmi?.brainmob?.mind && !suicide_check() ? "and neural interface " : ""]can be screwed in, the panel can be pried out.") - 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/Exited(atom/movable/gone, direction) - . = ..() - if(gone == circuit) - circuit = null - if((state != GLASS_CORE) && (state != AI_READY_CORE)) - state = EMPTY_CORE - update_appearance() - if(gone == core_mmi) - core_mmi = null - update_appearance() - -/obj/structure/ai_core/Destroy() - if(istype(remote_ai)) - remote_ai = null - QDEL_NULL(circuit) - QDEL_NULL(core_mmi) - QDEL_NULL(laws) - return ..() - -/obj/structure/ai_core/take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armour_penetration) - . = ..() - if(. > 0 && istype(remote_ai)) - to_chat(remote_ai, span_danger("Your core is under attack!")) - - -/obj/structure/ai_core/deactivated - icon_state = "ai-empty" - anchored = TRUE - state = AI_READY_CORE - var/mob/living/silicon/ai/attached_ai - -/obj/structure/ai_core/deactivated/Initialize(mapload, skip_mmi_creation = FALSE, posibrain = FALSE, linked_ai) - . = ..() - circuit = new(src) - if(linked_ai) - attached_ai = linked_ai - if(skip_mmi_creation) - return - if(posibrain) - core_mmi = new/obj/item/mmi/posibrain(src, /* autoping = */ FALSE) - else - core_mmi = new(src) - core_mmi.brain = new(core_mmi) - core_mmi.update_appearance() - -/obj/structure/ai_core/deactivated/Destroy() - if(attached_ai) - attached_ai.linked_core = null - attached_ai = null - . = ..() - -/obj/structure/ai_core/deactivated/proc/disable_doomsday(datum/source) - SIGNAL_HANDLER - attached_ai.ShutOffDoomsdayDevice() - -/obj/structure/ai_core/latejoin_inactive - name = "networked AI core" - desc = "This AI core is connected by bluespace transmitters to NTNet, allowing for an AI personality to be downloaded to it on the fly mid-shift." - icon_state = "ai-empty" - anchored = TRUE - state = AI_READY_CORE - var/available = TRUE - var/safety_checks = TRUE - var/active = TRUE - -/obj/structure/ai_core/latejoin_inactive/Initialize(mapload) - . = ..() - circuit = new(src) - core_mmi = new(src) - core_mmi.brain = new(core_mmi) - core_mmi.update_appearance() - GLOB.latejoin_ai_cores += src - -/obj/structure/ai_core/latejoin_inactive/Destroy() - GLOB.latejoin_ai_cores -= src - return ..() - -/obj/structure/ai_core/latejoin_inactive/examine(mob/user) - . = ..() - . += "Its transmitter seems to be [active? "on" : "off"]." - . += span_notice("You could [active? "deactivate" : "activate"] it with a multitool.") - -/obj/structure/ai_core/latejoin_inactive/proc/is_available() //If people still manage to use this feature to spawn-kill AI latejoins ahelp them. - if(!available) - return FALSE - if(!safety_checks) - return TRUE - if(!active) - return FALSE - var/turf/T = get_turf(src) - var/area/A = get_area(src) - if(!(A.area_flags & BLOBS_ALLOWED)) - return FALSE - if(!A.power_equip) - return FALSE - if(!SSmapping.level_trait(T.z,ZTRAIT_STATION)) - return FALSE - if(!isfloorturf(T)) - return FALSE - return TRUE - -/obj/structure/ai_core/latejoin_inactive/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers) - if(tool.tool_behaviour == TOOL_MULTITOOL) - active = !active - to_chat(user, span_notice("You [active? "activate" : "deactivate"] \the [src]'s transmitters.")) - return - return ..() - -/obj/structure/ai_core/wrench_act(mob/living/user, obj/item/tool) - . = ..() - default_unfasten_wrench(user, tool) - return ITEM_INTERACT_SUCCESS - -/obj/structure/ai_core/screwdriver_act(mob/living/user, obj/item/tool) - . = ..() - if(state == AI_READY_CORE) - if(!core_mmi) - balloon_alert(user, "no brain installed!") - return ITEM_INTERACT_SUCCESS - else if(!core_mmi.brainmob?.mind || suicide_check()) - balloon_alert(user, "brain is inactive!") - return ITEM_INTERACT_SUCCESS - else - balloon_alert(user, "connecting neural network...") - if(!tool.use_tool(src, user, 10 SECONDS)) - return ITEM_INTERACT_SUCCESS - if(!ai_structure_to_mob()) - return ITEM_INTERACT_SUCCESS - balloon_alert(user, "connected neural network") - return ITEM_INTERACT_SUCCESS - -/obj/structure/ai_core/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers) - if(remote_ai) - to_chat(remote_ai, span_danger("CORE TAMPERING DETECTED!")) - if(!anchored) - if(tool.tool_behaviour == TOOL_WELDER) - if(state != EMPTY_CORE) - balloon_alert(user, "core must be empty to deconstruct it!") - return - - if(!tool.tool_start_check(user, amount=1)) - return - - balloon_alert(user, "deconstructing frame...") - if(tool.use_tool(src, user, 20, volume=50) && state == EMPTY_CORE) - balloon_alert(user, "deconstructed frame") - deconstruct(TRUE) - return - else - if(!user.combat_mode) - balloon_alert(user, "bolt it down first!") - return - else - return ..() - else - switch(state) - if(EMPTY_CORE) - if(istype(tool, /obj/item/circuitboard/aicore)) - if(!user.transferItemToLoc(tool, src)) - return - playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) - balloon_alert(user, "circuit board inserted") - update_appearance() - state = CIRCUIT_CORE - circuit = tool - return - if(CIRCUIT_CORE) - if(tool.tool_behaviour == TOOL_SCREWDRIVER) - tool.play_tool_sound(src) - balloon_alert(user, "board screwed into place") - state = SCREWED_CORE - update_appearance() - return - if(tool.tool_behaviour == TOOL_CROWBAR) - tool.play_tool_sound(src) - balloon_alert(user, "circuit board removed") - state = EMPTY_CORE - circuit.forceMove(loc) - return - if(SCREWED_CORE) - if(tool.tool_behaviour == TOOL_SCREWDRIVER && circuit) - tool.play_tool_sound(src) - balloon_alert(user, "circuit board unfastened") - state = CIRCUIT_CORE - update_appearance() - return - if(istype(tool, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = tool - if(C.get_amount() >= 5) - playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) - balloon_alert(user, "adding cables to frame...") - if(do_after(user, 2 SECONDS, target = src) && state == SCREWED_CORE && C.use(5)) - balloon_alert(user, "added cables to frame.") - state = CABLED_CORE - update_appearance() - else - balloon_alert(user, "need five lengths of cable!") - return - if(CABLED_CORE) - if(tool.tool_behaviour == TOOL_WIRECUTTER) - if(core_mmi) - balloon_alert(user, "remove the [AI_CORE_BRAIN(core_mmi)] first!") - else - tool.play_tool_sound(src) - balloon_alert(user, "cables removed") - state = SCREWED_CORE - update_appearance() - new /obj/item/stack/cable_coil(drop_location(), 5) - return - - if(istype(tool, /obj/item/stack/sheet/rglass)) - if(!core_mmi) - balloon_alert(user, "add a brain first!") - return - var/obj/item/stack/sheet/rglass/G = tool - if(G.get_amount() >= 2) - playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) - balloon_alert(user, "adding glass panel...") - if(do_after(user, 2 SECONDS, target = src) && state == CABLED_CORE && G.use(2)) - balloon_alert(user, "added glass panel") - state = GLASS_CORE - update_appearance() - else - balloon_alert(user, "need two sheets of reinforced glass!") - return - - if(istype(tool, /obj/item/ai_module)) - if(!core_mmi) - balloon_alert(user, "no brain installed!") - return - if(!core_mmi.brainmob || !core_mmi.brainmob?.mind || suicide_check()) - balloon_alert(user, "[AI_CORE_BRAIN(core_mmi)] is inactive!") - return - if(core_mmi.laws.id != DEFAULT_AI_LAWID) - balloon_alert(user, "[AI_CORE_BRAIN(core_mmi)] already has set laws!") - return - var/obj/item/ai_module/module = tool - module.install(laws, user) - return - - if(istype(tool, /obj/item/mmi) && !core_mmi) - var/obj/item/mmi/M = tool - if(!M.brain_check(user)) - var/install = tgui_alert(user, "This [AI_CORE_BRAIN(M)] is inactive, would you like to make an inactive AI?", "Installing AI [AI_CORE_BRAIN(M)]", list("Yes", "No")) - if(install != "Yes") - return - if(M.brainmob && HAS_TRAIT(M.brainmob, TRAIT_SUICIDED)) - to_chat(user, span_warning("[M.name] is completely useless!")) - return - if(!user.transferItemToLoc(M, src)) - return - core_mmi = M - balloon_alert(user, "added [AI_CORE_BRAIN(core_mmi)] to frame") - update_appearance() - return - - var/mob/living/brain/B = M.brainmob - if(!CONFIG_GET(flag/allow_ai) || (is_banned_from(B.ckey, JOB_AI) && !QDELETED(src) && !QDELETED(user) && !QDELETED(M) && !QDELETED(user) && Adjacent(user))) - if(!QDELETED(M)) - to_chat(user, span_warning("This [M.name] does not seem to fit!")) - return - if(!user.transferItemToLoc(M,src)) - return - - core_mmi = M - balloon_alert(user, "added [AI_CORE_BRAIN(core_mmi)] to frame") - update_appearance() - return - - if(tool.tool_behaviour == TOOL_CROWBAR && core_mmi) - tool.play_tool_sound(src) - balloon_alert(user, "removed [AI_CORE_BRAIN(core_mmi)]") - if(remote_ai) - var/mob/living/silicon/ai/remoted_ai = remote_ai - remoted_ai.break_core_link() - if(!IS_MALF_AI(remoted_ai)) - //don't pull back shunted malf AIs - remoted_ai.death(gibbed = TRUE, drop_mmi = FALSE) - ///the drop_mmi param determines whether the MMI is dropped at their current location - ///which in this case would be somewhere else, so we drop their MMI at the core instead - remoted_ai.make_mmi_drop_and_transfer(core_mmi, src) - core_mmi.forceMove(loc) //if they're malf, just drops a blank MMI, or if it's an incomplete shell - return //it drops the mmi that was put in before it was finished - - if(GLASS_CORE) - if(tool.tool_behaviour == TOOL_CROWBAR) - tool.play_tool_sound(src) - balloon_alert(user, "removed glass panel") - state = CABLED_CORE - update_appearance() - new /obj/item/stack/sheet/rglass(loc, 2) - return - - if(tool.tool_behaviour == TOOL_SCREWDRIVER) - if(suicide_check()) - to_chat(user, span_warning("The brain installed is completely useless.")) - return - tool.play_tool_sound(src) - - var/atom/alert_source = src - if(core_mmi.brainmob?.mind) - alert_source = ai_structure_to_mob() || alert_source - else - state = AI_READY_CORE - update_appearance() - alert_source.balloon_alert(user, "connected monitor[core_mmi?.brainmob?.mind ? " and neural network" : ""]") - return - - if(AI_READY_CORE) - if(istype(tool, /obj/item/aicard)) - return //handled by /obj/structure/ai_core/transfer_ai() - - if(tool.tool_behaviour == TOOL_WIRECUTTER) - tool.play_tool_sound(src) - balloon_alert(user, "disconnected monitor") - state = GLASS_CORE - update_appearance() - return - return ..() - -/obj/structure/ai_core/proc/ai_structure_to_mob() - var/mob/living/brain/the_brainmob = core_mmi.brainmob - if(!the_brainmob.mind || suicide_check()) - return FALSE - the_brainmob.mind.remove_antags_for_borging() - if(!the_brainmob.mind.has_ever_been_ai) - SSblackbox.record_feedback("amount", "ais_created", 1) - var/mob/living/silicon/ai/ai_mob = null - - if(core_mmi.overrides_aicore_laws) - ai_mob = new /mob/living/silicon/ai(loc, core_mmi.laws, the_brainmob) - core_mmi.laws = null //MMI's law datum is being donated, so we need the MMI to let it go or the GC will eat it - else - ai_mob = new /mob/living/silicon/ai(loc, laws, the_brainmob) - laws = null //we're giving the new AI this datum, so let's not delete it when we qdel(src) 5 lines from now - - var/datum/antagonist/malf_ai/malf_datum = IS_MALF_AI(ai_mob) - if(malf_datum) - malf_datum.add_law_zero() - - if(!isnull(the_brainmob.client)) - ai_mob.set_gender(the_brainmob.client) - if(core_mmi.force_replace_ai_name) - ai_mob.fully_replace_character_name(ai_mob.name, core_mmi.replacement_ai_name()) - ai_mob.posibrain_inside = core_mmi.braintype == "Android" - deadchat_broadcast(" has been brought online at [get_area_name(ai_mob, format_text = TRUE)].", span_name("[ai_mob]"), follow_target = ai_mob, message_type = DEADCHAT_ANNOUNCEMENT) - qdel(src) - return ai_mob - -/obj/structure/ai_core/update_icon_state() - switch(state) - if(EMPTY_CORE) - icon_state = "0" - if(CIRCUIT_CORE) - icon_state = "1" - if(SCREWED_CORE) - icon_state = "2" - if(CABLED_CORE) - if(core_mmi) - icon_state = "3b" - else - icon_state = "3" - if(GLASS_CORE) - icon_state = "4" - if(AI_READY_CORE) - icon_state = "ai-empty" - return ..() - -/obj/structure/ai_core/atom_deconstruct(disassembled = TRUE) - if(state >= GLASS_CORE) - new /obj/item/stack/sheet/rglass(loc, 2) - if(state >= CABLED_CORE) - new /obj/item/stack/cable_coil(loc, 5) - if(circuit) - circuit.forceMove(loc) - circuit = null - new /obj/item/stack/sheet/plasteel(loc, 4) - -/// Quick proc to call to see if the brainmob inside of us has suicided. Returns TRUE if we have, FALSE in any other scenario. -/obj/structure/ai_core/proc/suicide_check() - if(isnull(core_mmi) || isnull(core_mmi.brainmob)) - return FALSE - return HAS_TRAIT(core_mmi.brainmob, TRAIT_SUICIDED) - -/* -This is a good place for AI-related object verbs so I'm sticking it here. -If adding stuff to this, don't forget that an AI need to cancel_camera() whenever it physically moves to a different location. -That prevents a few funky behaviors. -*/ -//The type of interaction, the player performing the operation, the AI itself, and the card object, if any. - - -/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.")) - return FALSE - return TRUE - -/obj/structure/ai_core/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/aicard/card) - if(state != AI_READY_CORE || !..()) - return - if(core_mmi && core_mmi.brainmob) - if(core_mmi.brainmob.mind) - to_chat(user, span_warning("[src] already contains an active mind!")) - return - else if(suicide_check()) - to_chat(user, span_warning("[AI_CORE_BRAIN(core_mmi)] installed in [src] is completely useless!")) - return - //Transferring a carded AI to a core. - if(interaction == AI_TRANS_FROM_CARD) - AI.set_control_disabled(FALSE) - AI.radio_enabled = TRUE - AI.forceMove(loc) // to replace the terminal. - to_chat(AI, span_notice("You have been uploaded to a stationary terminal. Remote device connection restored.")) - to_chat(user, "[span_boldnotice("Transfer successful")]: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.") - card.AI = null - AI.battery = circuit.battery - AI.posibrain_inside = isnull(core_mmi) || core_mmi.braintype == "Android" - qdel(src) - else //If for some reason you use an empty card on an empty AI terminal. - to_chat(user, span_alert("There is no AI loaded on this terminal.")) - -/obj/item/circuitboard/aicore - name = "AI core (AI Core Board)" //Well, duh, but best to be consistent - var/battery = 200 //backup battery for when the AI loses power. Copied to/from AI mobs when carding, and placed here to avoid recharge via deconning the core - -/obj/item/circuitboard/aicore/Initialize(mapload) - . = ..() - if(mapload && HAS_TRAIT(SSstation, STATION_TRAIT_HUMAN_AI)) - return INITIALIZE_HINT_QDEL - -#undef AI_CORE_BRAIN diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index 1f77227a8bec..2c0b620dce92 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -15,6 +15,10 @@ can_deconstruct = FALSE var/static/mutable_appearance/nest_overlay = mutable_appearance('icons/mob/nonhuman-player/alien.dmi', "nestoverlay", LYING_MOB_LAYER) +/obj/structure/bed/nest/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_DANGEROUS_BUCKLE, INNATE_TRAIT) + /obj/structure/bed/nest/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) if(held_item?.tool_behaviour == TOOL_WRENCH) return NONE diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 6b687c8a4b01..c6435e1973d7 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -19,6 +19,7 @@ resistance_flags = FLAMMABLE max_integrity = 100 integrity_failure = 0.35 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) /// What material this bed is made of var/build_stack_type = /obj/item/stack/sheet/iron /// How many mats to drop when deconstructed @@ -314,6 +315,7 @@ build_stack_type = /obj/item/stack/sheet/mineral/wood build_stack_amount = 10 elevation = 0 + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 10) var/owned = FALSE /obj/structure/bed/dogbed/ian @@ -381,6 +383,7 @@ icon_state = "bed_double" build_stack_amount = 4 max_buckled_mobs = 2 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 4) /// The mob who buckled to this bed second, to avoid other mobs getting pixel-shifted before he unbuckles. var/mob/living/goldilocks diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index f01698e6bb86..637910ce9e4d 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -19,8 +19,6 @@ ///How much sitting on this chair influences fishing difficulty var/fishing_modifier = -5 var/has_armrest = FALSE - // The mutable appearance used for the overlay over buckled mobs. - var/mutable_appearance/armrest /obj/structure/chair/Initialize(mapload) . = ..() @@ -28,8 +26,6 @@ name = "tactical [name]" fishing_modifier -= 8 MakeRotate() - if (has_armrest) - gen_armrest() if(can_buckle && fishing_modifier) AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) @@ -67,14 +63,6 @@ visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, ) -/obj/structure/chair/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) - if(same_z_layer || !has_armrest) - return ..() - cut_overlay(armrest) - QDEL_NULL(armrest) - gen_armrest() - return ..() - /obj/structure/chair/examine(mob/user) . = ..() . += span_notice("It's held together by a couple of bolts.") @@ -83,11 +71,10 @@ ///This proc adds the rotate component, overwrite this if you for some reason want to change some specific args. /obj/structure/chair/proc/MakeRotate() - AddComponent(/datum/component/simple_rotation, ROTATION_IGNORE_ANCHORED|ROTATION_GHOSTS_ALLOWED) + AddElement(/datum/element/simple_rotation, ROTATION_IGNORE_ANCHORED|ROTATION_GHOSTS_ALLOWED) /obj/structure/chair/Destroy() SSjob.latejoin_trackers -= src //These may be here due to the arrivals shuttle - QDEL_NULL(armrest) return ..() /obj/structure/chair/atom_deconstruct(disassembled) @@ -111,29 +98,16 @@ return . = ..() -/obj/structure/chair/update_atom_colour() +/obj/structure/chair/update_overlays() . = ..() - if (armrest) - color_atom_overlay(armrest) - -/obj/structure/chair/proc/gen_armrest() - armrest = GetArmrest() - armrest.layer = ABOVE_MOB_LAYER - armrest.appearance_flags |= KEEP_APART - update_armrest() - -/obj/structure/chair/proc/GetArmrest() - return mutable_appearance(icon, "[icon_state]_armrest") - -/obj/structure/chair/proc/update_armrest() + if (!has_buckled_mobs()) + return + var/mutable_appearance/armrest = mutable_appearance(icon, "[icon_state]_armrest", ABOVE_MOB_LAYER, src, appearance_flags = KEEP_APART) + var/mutable_appearance/armrest_blocker = emissive_blocker(icon, "[icon_state]_armrest", src, ABOVE_MOB_LAYER) if (cached_color_filter) armrest = filter_appearance_recursive(armrest, cached_color_filter) - update_appearance() - -/obj/structure/chair/update_overlays() - . = ..() - if(has_buckled_mobs()) - . += armrest + . += armrest + . += armrest_blocker ///allows each chair to request the electrified_buckle component with overlays that dont look ridiculous /obj/structure/chair/proc/electrify_self(obj/item/assembly/shock_kit/input_shock_kit, mob/user, list/overlays_from_child_procs) @@ -183,13 +157,13 @@ . = ..() handle_layer() if (has_armrest) - update_armrest() + update_appearance() /obj/structure/chair/post_unbuckle_mob() . = ..() handle_layer() if (has_armrest) - update_armrest() + update_appearance() /obj/structure/chair/setDir(newdir) ..() @@ -214,6 +188,7 @@ buildstackamount = 3 item_chair = /obj/item/chair/wood fishing_modifier = -6 + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 3) /obj/structure/chair/wood/narsie_act() return @@ -233,6 +208,7 @@ item_chair = null fishing_modifier = -7 has_armrest = TRUE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/chair/comfy/brown color = rgb(70, 47, 28) @@ -258,7 +234,7 @@ unbuckle_sound = SFX_SEATBELT_UNBUCKLE resistance_flags = FIRE_PROOF max_integrity = 120 - custom_materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/chair/comfy/shuttle/electrify_self(obj/item/assembly/shock_kit/input_shock_kit, mob/user, list/overlays_from_child_procs) if(!overlays_from_child_procs) @@ -312,6 +288,7 @@ icon_state = "carp_chair" buildstacktype = /obj/item/stack/sheet/animalhide/carp fishing_modifier = -12 + custom_materials = null /obj/structure/chair/office name = "office chair" @@ -320,6 +297,7 @@ item_chair = null fishing_modifier = -6 icon_state = "officechair_dark" + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5) /obj/structure/chair/office/Initialize(mapload) . = ..() @@ -346,11 +324,17 @@ name = "stool" desc = "Apply butt." icon_state = "stool" - can_buckle = FALSE buildstackamount = 1 item_chair = /obj/item/chair/stool max_integrity = 300 +/obj/structure/chair/stool/post_buckle_mob(mob/living/Mob) + Mob.add_offsets(type, z_add = 4) + . = ..() + +/obj/structure/chair/stool/post_unbuckle_mob(mob/living/Mob) + Mob.remove_offsets(type) + MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool, 0) /obj/structure/chair/stool/narsie_act() @@ -382,13 +366,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool, 0) desc = "It has some unsavory stains on it..." icon_state = "bar" item_chair = /obj/item/chair/stool/bar - can_buckle = TRUE - -/obj/structure/chair/stool/bar/post_buckle_mob(mob/living/M) - M.pixel_y += 4 -/obj/structure/chair/stool/bar/post_unbuckle_mob(mob/living/M) - M.pixel_y -= 4 +/obj/structure/chair/stool/bar/post_buckle_mob(mob/living/Mob) + . = ..() + Mob.add_offsets(type, z_add = 7) MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) @@ -401,6 +382,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) buildstacktype = /obj/item/stack/sheet/mineral/bamboo buildstackamount = 2 item_chair = /obj/item/chair/stool/bamboo + custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 2) /obj/item/chair name = "chair" @@ -419,7 +401,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) max_integrity = 100 hitsound = 'sound/items/trayhit/trayhit1.ogg' hit_reaction_chance = 50 - custom_materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) item_flags = SKIP_FANTASY_ON_SPAWN // Duration of daze inflicted when the chair is smashed against someone from behind. @@ -428,6 +410,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) // What structure type does this chair become when placed? var/obj/structure/chair/origin_type = /obj/structure/chair +/obj/item/chair/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) + /obj/item/chair/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins hitting [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) playsound(src,hitsound,50,TRUE) @@ -442,25 +428,28 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) plant(user) /obj/item/chair/proc/plant(mob/user) - var/turf/T = get_turf(loc) - if(isgroundlessturf(T)) + var/turf/turf = user.loc + if(!istype(turf) || isgroundlessturf(turf)) to_chat(user, span_warning("You need ground to plant this on!")) return + if(!user.dropItemToGround(src)) + to_chat(user, span_warning("[src] is stuck to your hand!")) + return if(flags_1 & HOLOGRAM_1) to_chat(user, span_notice("You try to place down \the [src], but it fades away!")) qdel(src) return - for(var/obj/A in T) - if(istype(A, /obj/structure/chair)) + for(var/obj/object in turf) + if(istype(object, /obj/structure/chair)) to_chat(user, span_warning("There is already a chair here!")) return - if(A.density && !(A.flags_1 & ON_BORDER_1)) + if(object.density && !(object.flags_1 & ON_BORDER_1)) to_chat(user, span_warning("There is already something here!")) return user.visible_message(span_notice("[user] rights \the [src.name]."), span_notice("You right \the [name].")) - var/obj/structure/chair/chair = new origin_type(get_turf(loc)) + var/obj/structure/chair/chair = new origin_type(turf) chair.set_custom_materials(custom_materials) TransferComponents(chair) chair.setDir(user.dir) @@ -543,6 +532,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) origin_type = /obj/structure/chair/stool/bamboo max_integrity = 40 //Submissive and breakable unlike the chad iron stool daze_amount = 0 //Not hard enough to cause them to become dazed + custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 2) /obj/item/chair/stool/narsie_act() return //sturdy enough to ignore a god @@ -557,6 +547,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) origin_type = /obj/structure/chair/wood custom_materials = null daze_amount = 0 + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 3) /obj/item/chair/wood/narsie_act() return @@ -582,6 +573,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) item_chair = null fishing_modifier = -13 //the pinnacle of Ratvarian technology. has_armrest = TRUE + custom_materials = list(/datum/material/bronze = SHEET_MATERIAL_AMOUNT) /// Total rotations made var/turns = 0 @@ -625,6 +617,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) obj_flags = parent_type::obj_flags | NO_DEBRIS_AFTER_DECONSTRUCTION alpha = 0 fishing_modifier = -21 //it only lives for 25 seconds, so we make them worth it. + custom_materials = null /obj/structure/chair/mime/wrench_act_secondary(mob/living/user, obj/item/weapon) return NONE @@ -641,7 +634,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) desc = "No matter how much you squirm, it'll still be uncomfortable." resistance_flags = FLAMMABLE max_integrity = 70 - custom_materials = list(/datum/material/plastic =SHEET_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 2) buildstacktype = /obj/item/stack/sheet/plastic buildstackamount = 2 item_chair = /obj/item/chair/plastic @@ -675,7 +668,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) w_class = WEIGHT_CLASS_NORMAL force = 7 throw_range = 5 //Lighter Weight --> Flies Farther. - custom_materials = list(/datum/material/plastic =SHEET_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 2) max_integrity = 70 daze_amount = 0 origin_type = /obj/structure/chair/plastic diff --git a/code/game/objects/structures/beds_chairs/pew.dm b/code/game/objects/structures/beds_chairs/pew.dm index e6c64d9f36f0..22faec36e70b 100644 --- a/code/game/objects/structures/beds_chairs/pew.dm +++ b/code/game/objects/structures/beds_chairs/pew.dm @@ -8,10 +8,11 @@ buildstacktype = /obj/item/stack/sheet/mineral/wood buildstackamount = 3 item_chair = null + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 3) ///This proc adds the rotate component, overwrite this if you for some reason want to change some specific args. /obj/structure/chair/pew/MakeRotate() - AddComponent(/datum/component/simple_rotation, ROTATION_REQUIRE_WRENCH|ROTATION_IGNORE_ANCHORED) + AddElement(/datum/element/simple_rotation, ROTATION_REQUIRE_WRENCH|ROTATION_IGNORE_ANCHORED) /obj/structure/chair/pew/left name = "left wooden pew end" diff --git a/code/game/objects/structures/beds_chairs/sofa.dm b/code/game/objects/structures/beds_chairs/sofa.dm index 986bbcd99a07..75c2deb8d6d0 100644 --- a/code/game/objects/structures/beds_chairs/sofa.dm +++ b/code/game/objects/structures/beds_chairs/sofa.dm @@ -51,6 +51,27 @@ path/corner/color_name {\ COLORED_SOFA(/obj/structure/chair/sofa, brown, SOFA_BROWN) COLORED_SOFA(/obj/structure/chair/sofa, maroon, SOFA_MAROON) +// Make crafted brown sofas use the "retro sofa" display name without changing map-spawned ones. +/obj/structure/chair/sofa/middle/brown/Initialize(mapload) + . = ..() + if(!mapload) + name = "retro sofa" + +/obj/structure/chair/sofa/left/brown/Initialize(mapload) + . = ..() + if(!mapload) + name = "retro sofa" + +/obj/structure/chair/sofa/right/brown/Initialize(mapload) + . = ..() + if(!mapload) + name = "retro sofa" + +/obj/structure/chair/sofa/corner/brown/Initialize(mapload) + . = ..() + if(!mapload) + name = "retro sofa" + // Original icon ported from Eris(?) and updated to work here. /obj/structure/chair/sofa/corp name = "sofa" @@ -111,6 +132,7 @@ COLORED_SOFA(/obj/structure/chair/sofa, maroon, SOFA_MAROON) buildstacktype = /obj/item/stack/sheet/mineral/bamboo buildstackamount = 3 has_armrest = FALSE + custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 3) /obj/structure/chair/sofa/bamboo/left icon_state = "bamboo_sofaend_left" diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 01536a2518a2..58196a173da6 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -37,7 +37,7 @@ LINEN BINS /obj/item/bedsheet/Initialize(mapload) . = ..() - AddComponent(/datum/component/surgery_initiator) + AddElement(/datum/element/surgery_aid, "bedsheet") AddElement(/datum/element/bed_tuckable, mapload, 0, 0, 0) if(bedsheet_type == BEDSHEET_DOUBLE) stack_amount *= 2 @@ -92,7 +92,7 @@ LINEN BINS return ITEM_INTERACT_SUCCESS /obj/item/bedsheet/attack_self(mob/living/user) - if(!user.CanReach(src)) //No telekinetic grabbing. + if(!IsReachableBy(user)) //No telekinetic grabbing. return if(user.body_position != LYING_DOWN) return @@ -581,6 +581,7 @@ LINEN BINS resistance_flags = FLAMMABLE max_integrity = 70 anchored_tabletop_offset = 6 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) /// The number of bedsheets in the bin var/amount = 10 /// A list of actual sheets within the bin diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index 2ad9ac77a68e..f05d8f646f4c 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -12,15 +12,17 @@ desc = "For grilling, broiling, charring, smoking, heating, roasting, toasting, simmering, searing, melting, and occasionally burning things." icon = 'modular_darkpack/master_files/icons/obj/service/hydroponics/equipment.dmi' // DARKPACK EDIT CHANGE icon_state = "bonfire" + base_icon_state = "bonfire" // DARKPACK EDIT ADD light_color = LIGHT_COLOR_FIRE density = FALSE anchored = TRUE buckle_lying = 0 pass_flags_self = PASSTABLE | LETPASSTHROW + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 10) /// is the bonfire lit? var/burning = FALSE /// icon for the bonfire while on. for a softer more burning embers icon, use "bonfire_warm" - var/burn_icon = "bonfire_on_fire" + var/burn_icon = "_on_fire" /// if the bonfire has a grill attached var/grill = FALSE /// the looping sound effect that is played while burning @@ -108,7 +110,7 @@ return burning_loop.start() - icon_state = burn_icon + icon_state = "[base_icon_state][burn_icon]" // DARKPACK EDIT CHANGE burning = TRUE set_light(6) bonfire_burn() @@ -167,7 +169,7 @@ return burning_loop.stop() - icon_state = "bonfire" + icon_state = base_icon_state // DARKPACK EDIT CHANGE burning = FALSE set_light(0) QDEL_NULL(particles) @@ -199,4 +201,14 @@ /obj/structure/bonfire/prelit/LateInitialize() start_burning() +// DARKPACK EDIT ADD START +/obj/structure/bonfire/alt + icon_state = "campfire" + base_icon_state = "campfire" + +/obj/structure/bonfire/prelit/alt + icon_state = "campfire" + base_icon_state = "campfire" +// DARKPACK EDIT ADD END + #undef BONFIRE_FIRE_STACK_STRENGTH diff --git a/code/game/objects/structures/cannons/cannon.dm b/code/game/objects/structures/cannons/cannon.dm index 4c44ae646a86..383e35172093 100644 --- a/code/game/objects/structures/cannons/cannon.dm +++ b/code/game/objects/structures/cannons/cannon.dm @@ -15,14 +15,14 @@ var/anchorable_cannon = TRUE var/obj/item/stack/cannonball/loaded_cannonball = null var/charge_ignited = FALSE - var/fire_delay = 15 + var/fire_delay = 1.5 SECONDS var/charge_size = 15 var/fire_sound = 'sound/items/weapons/gun/general/cannon.ogg' /obj/structure/cannon/Initialize(mapload) . = ..() create_reagents(charge_size) - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) /obj/structure/cannon/examine(mob/user) . = ..() @@ -117,6 +117,7 @@ icon_state = "garbagegun" anchored = FALSE anchorable_cannon = FALSE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 11.15, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.5) var/fires_before_deconstruction = 5 /obj/structure/cannon/trash/fire() diff --git a/code/game/objects/structures/cannons/cannonballs.dm b/code/game/objects/structures/cannons/cannonballs.dm index 855292e8521a..fca8eb7e901d 100644 --- a/code/game/objects/structures/cannons/cannonballs.dm +++ b/code/game/objects/structures/cannons/cannonballs.dm @@ -71,6 +71,7 @@ base_icon_state = "trashballs" merge_type = /obj/item/stack/cannonball/trashball projectile_type = /obj/projectile/bullet/cannonball/trashball + custom_materials = list(/datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT) /obj/item/stack/cannonball/trashball/four amount = 4 diff --git a/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm index 3a7a027acb58..758a3f197e8a 100644 --- a/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm +++ b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm @@ -9,34 +9,51 @@ icon = 'icons/obj/weapons/cannons.dmi' icon_state = "falconet_patina" var/icon_state_base = "falconet_patina" + var/icon_state_loaded = "falconet_patina" var/icon_state_fire = "falconet_patina_fire" max_integrity = 300 ///whether the cannon can be unwrenched from the ground. Anchorable_cannon equivalent. var/anchorable_gun = TRUE + /// does this thing need ammo at all or does it just make ammo? + var/uses_ammo = TRUE ///Max shots per firing of the gun. var/max_shots_per_fire = 1 + ///Delay it takes to load the gun. Set to 0 if none. + var/load_delay = 0 + ///Message displayed when loading gun + var/loading_message = "gun loaded" ///Shots currently loaded. Should never be more than max_shots_per_fire. var/shots_in_gun = 1 ///shots added to gun, per piece of ammo loaded. var/shots_per_load = 1 + ///Does it have an alternative ammo type it can uses + var/has_alt_ammo = FALSE + //Is it loaded with said alternative ammo? + var/use_alt_ammo = FALSE ///Accepted "ammo" type var/obj/item/ammo_type = /obj/item/ammo_casing/strilka310 + ///Alternative ammo types, for extra effects! + var/obj/item/alt_ammo_type = /obj/item/ammo_casing/strilka310 ///Projectile from said gun. Doesnt automatically inherit said ammo's projectile in case you wanted to make a gun that shoots floor tiles or something. var/obj/projectile/projectile_type = /obj/projectile/bullet/strilka310 + ///Projectile from said gun. Doesnt automatically inherit said ammo's projectile in case you wanted to make a gun that shoots floor tiles or something. + var/obj/projectile/alt_projectile_type = /obj/projectile/bullet/strilka310 ///If the gun has anything in it. var/loaded_gun = TRUE ///If the gun is currently loaded with its maximum capacity. var/fully_loaded_gun = TRUE ///delay in firing the gun after lighting - var/fire_delay = 5 + var/fire_delay = 5 DECISECONDS ///Delay between shots - var/shot_delay = 3 + var/shot_delay = 3 DECISECONDS ///If the gun shakes the camera when firing var/firing_shakes_camera = TRUE ///sound of firing for all but last shot var/fire_sound = 'sound/items/weapons/gun/general/mountedgun.ogg' ///sound of firing for last shot var/last_fire_sound = 'sound/items/weapons/gun/general/mountedgunend.ogg' + ///So you can't reload it mid-firing + var/is_firing = FALSE /obj/structure/mounted_gun/wrench_act(mob/living/user, obj/item/tool) . = ..() @@ -46,37 +63,45 @@ return ITEM_INTERACT_SUCCESS ///Covers Reloading and lighting of the gun -/obj/structure/mounted_gun/attackby(obj/item/ammo_casing/used_item, mob/user, list/modifiers, list/attack_modifiers) - var/ignition_message = used_item.ignition_effect(src, user) // Checks if item used can ignite stuff. - if(istype(used_item, ammo_type)) +/obj/structure/mounted_gun/attackby(obj/item/ammo_casing/used_item, mob/user, params) + if(is_firing) + balloon_alert(user, "gun is firing!") + return + if(istype(used_item, ammo_type) && (uses_ammo == TRUE)) //see if the gun needs to be loaded in some way. if(fully_loaded_gun) balloon_alert(user, "already fully loaded!") return - else - shots_in_gun = shots_in_gun + shots_per_load //Add one to the shots in the gun - - loaded_gun = TRUE // Make sure it registers theres ammo in there, so it can fire. - QDEL_NULL(used_item) - if(shots_in_gun >= max_shots_per_fire) - shots_in_gun = max_shots_per_fire // in case of somehow firing only some of a guns shots, and reloading, you still cant get above the maximum ammo size. - fully_loaded_gun = TRUE //So you cant load extra. + + if(load_delay > 0 && !do_after(user, load_delay, target = src)) return - else if(ignition_message) // if item the player used ignites, light the gun! - visible_message(ignition_message) - user.log_message("fired a cannon", LOG_ATTACK) - log_game("[key_name(user)] fired a cannon in [AREACOORD(src)]") - addtimer(CALLBACK(src, PROC_REF(fire)), fire_delay) //uses fire proc as shown below to shoot the gun + shots_in_gun = shots_in_gun + shots_per_load //Add one to the shots in the gun + balloon_alert(user, loading_message) + loaded_gun = TRUE // Make sure it registers theres ammo in there, so it can fire. + QDEL_NULL(used_item) + if(shots_in_gun >= max_shots_per_fire) + shots_in_gun = max_shots_per_fire // in case of somehow firing only some of a guns shots, and reloading, you still cant get above the maximum ammo size. + fully_loaded_gun = TRUE //So you cant load extra. + icon_state = icon_state_loaded + return + +/obj/structure/mounted_gun/attack_hand(mob/living/user, list/modifiers) + if(is_firing) + balloon_alert(user, "gun is firing!") return - ..() + user.log_message("fired a mounted gun", LOG_ATTACK) + log_game("[key_name(user)] fired a mounted gun in [AREACOORD(src)]") + addtimer(CALLBACK(src, PROC_REF(fire)), fire_delay) //uses fire proc as shown below to shoot the gun + return /obj/structure/mounted_gun/proc/fire() if (!loaded_gun) balloon_alert_to_viewers("gun is not loaded!","",2) return + is_firing = TRUE for(var/times_fired = 1, times_fired <= shots_in_gun, times_fired++) //The normal DM for loop structure since the times it has fired is changing in the loop itself. for(var/mob/shaken_mob in urange(10, src)) - if(shaken_mob.stat == CONSCIOUS && firing_shakes_camera == TRUE) + if(shaken_mob.stat == CONSCIOUS && firing_shakes_camera == TRUE) //is the mob awake to feel the shaking? shake_camera(shaken_mob, 3, 1) icon_state = icon_state_fire if(loaded_gun) @@ -84,23 +109,29 @@ if (times_fired < shots_in_gun) playsound(src, fire_sound, 50, FALSE, 5) else - playsound(src, last_fire_sound, 50, TRUE, 5) - var/obj/projectile/fired_projectile = new projectile_type(get_turf(src)) + playsound(src, last_fire_sound, 50, TRUE, 5) //for the empty fire sound + + var/obj/projectile/fired_projectile = (use_alt_ammo) ? new alt_projectile_type(get_turf(src)) : new projectile_type(get_turf(src)) fired_projectile.firer = src fired_projectile.fired_from = src fired_projectile.fire(dir2angle(dir)) sleep(shot_delay) - loaded_gun = FALSE - shots_in_gun = 0 - fully_loaded_gun = FALSE + + if(uses_ammo == TRUE) + loaded_gun = FALSE + use_alt_ammo = FALSE + shots_in_gun = 0 + fully_loaded_gun = FALSE + is_firing = FALSE icon_state = icon_state_base -/obj/structure/mounted_gun/pipe +/obj/structure/mounted_gun/organ_gun name = "Pipe Organ Gun" desc = "To become master over one who has killed, one must become a better killer. This engine of destruction is one of many things made to that end." icon_state = "pipeorgangun" icon_state_base = "pipeorgangun" + icon_state_loaded = "pipeorgangun" icon_state_fire = "pipeorgangun_fire" anchored = FALSE anchorable_gun = TRUE @@ -111,11 +142,12 @@ projectile_type = /obj/projectile/bullet/junk loaded_gun = TRUE fully_loaded_gun = TRUE - fire_delay = 3 - shot_delay = 2 + fire_delay = 3 DECISECONDS + shot_delay = 2 DECISECONDS firing_shakes_camera = FALSE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 24.5, /datum/material/wood = SHEET_MATERIAL_AMOUNT * 15, /datum/material/glass = SMALL_MATERIAL_AMOUNT) -/obj/structure/mounted_gun/pipe/examine_more(mob/user) +/obj/structure/mounted_gun/organ_gun/examine_more(mob/user) . = ..() . += span_notice("Looking down at \the [src], you recall a tale told to you in some distant memory...") @@ -125,7 +157,7 @@ . += span_info("As such, the man who ended another's life with a stone, was in turn smote himself by another wielding a spear. After spears, bows. Swords. Guns. Tanks. Missiles. And on and on Vengeance fed. Growing stronger. Growing Worse.") . += span_info("Vengeance persists to this day. It sometimes may slumber, seemingly content with having gorged itself, but in the end, its ceaseless hunger can be neither numbed nor sated.") -/obj/structure/mounted_gun/pipe/fire() +/obj/structure/mounted_gun/organ_gun/fire() if (!loaded_gun) balloon_alert_to_viewers("Gun is not loaded!","",2) return @@ -164,6 +196,7 @@ desc = "''Quantity has a quality of its own.''" icon_state = "canister_gatling" icon_state_base = "canister_gatling" + icon_state_loaded = "canister_gatling" icon_state_fire = "canister_gatling_fire" anchored = FALSE anchorable_gun = TRUE @@ -174,8 +207,8 @@ projectile_type = /obj/projectile/bullet/shrapnel loaded_gun = TRUE fully_loaded_gun = TRUE - fire_delay = 3 - shot_delay = 1 + fire_delay = 3 DECISECONDS + shot_delay = 1 DECISECONDS firing_shakes_camera = FALSE /obj/item/ammo_casing/canister_shot @@ -186,3 +219,136 @@ throwforce = 0 w_class = WEIGHT_CLASS_BULKY projectile_type = /obj/projectile/bullet/shrapnel + +/obj/structure/mounted_gun/ratvarian_repeater + name = "Ratvarian Repeater" + desc = "''Brains? Bronze? Why not both?''" + icon_state = "ratvarian_repeater" + icon_state_base = "ratvarian_repeater" + icon_state_fire = "ratvarian_repeater_fire" + loading_message = "gun charged" + anchored = FALSE + anchorable_gun = TRUE + uses_ammo = FALSE + load_delay = 30 + max_shots_per_fire = 12 + shots_per_load = 12 + shots_in_gun = 12 + fire_sound = 'sound/items/weapons/thermalpistol.ogg' + last_fire_sound = 'sound/items/weapons/thermalpistol.ogg' + projectile_type = /obj/projectile/beam/laser/musket/repeater + loaded_gun = TRUE + fully_loaded_gun = TRUE + fire_delay = 1 + shot_delay = 2 + firing_shakes_camera = FALSE + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5.25, + /datum/material/bronze = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.29 + ) + +/obj/structure/mounted_gun/ratvarian_repeater/dump_contents() + return // Stub because we don't want to do anything here + +/obj/structure/mounted_gun/ratvarian_repeater/attack_hand(mob/user, params) //the repeater is weird so has to have its own code since it takes no ammo. + + if(is_firing) + balloon_alert(user, "gun is firing!") + return + + if(!fully_loaded_gun) + if(!do_after(user, load_delay, target = src)) + return + shots_in_gun = shots_per_load //Add one to the shots in the gun + balloon_alert(user, "mechanism wound.") + playsound(src, 'sound/effects/magic/clockwork/fellowship_armory.ogg', 50, FALSE, 5) + loaded_gun = TRUE // Make sure it registers theres ammo in there, so it can fire. + if(shots_in_gun >= max_shots_per_fire) + shots_in_gun = max_shots_per_fire // in case of somehow firing only some of a guns shots, and reloading, you still cant get above the maximum ammo size. + fully_loaded_gun = TRUE //So you cant load extra. + return + + user.log_message("fired a ratvatian repeater", LOG_ATTACK) + log_game("[key_name(user)] fired a ratvatian repeater in [AREACOORD(src)]") + addtimer(CALLBACK(src, PROC_REF(fire)), fire_delay) //uses fire proc as shown below to shoot the gun + +/obj/structure/mounted_gun/ratvarian_repeater/fire() + if (!loaded_gun) + balloon_alert_to_viewers("needs winding!", vision_distance = 2) + return + is_firing = TRUE + for(var/times_fired = 1, times_fired <= shots_in_gun, times_fired++) //The normal DM for loop structure since the times it has fired is changing in the loop itself. + if(loaded_gun) + icon_state = icon_state_fire + if (times_fired < shots_in_gun) + playsound(src, fire_sound, 50, FALSE, 5) + else + playsound(src, last_fire_sound, 50, TRUE, 5) //for the empty fire sound + var/obj/projectile/fired_projectile = new projectile_type(get_turf(src)) + fired_projectile.firer = src + fired_projectile.fired_from = src + fired_projectile.fire(dir2angle(dir)) + if(times_fired % 2 != 1)//Burst Fire. + sleep(shot_delay) + sleep(shot_delay) + loaded_gun = FALSE + shots_in_gun = 0 + fully_loaded_gun = FALSE + is_firing = FALSE + icon_state = icon_state_base + +/obj/structure/mounted_gun/ballista + name = "Improvised Ballista" + desc = "''Engineers like to solve problems. If there are no problems handily available, they will create their own problems.''" + icon_state = "Improvised_Ballista" + icon_state_base = "Improvised_Ballista" + icon_state_loaded = "Improvised_Ballista_Loaded" + icon_state_fire = "Improvised_Ballista" + anchored = FALSE + anchorable_gun = TRUE + uses_ammo = TRUE + load_delay = 60 + max_shots_per_fire = 1 + shots_per_load = 1 + shots_in_gun = 1 + fire_sound = 'sound/items/xbow_lock.ogg' + last_fire_sound = 'sound/items/xbow_lock.ogg' + has_alt_ammo = TRUE + ammo_type = /obj/item/spear + projectile_type = /obj/projectile/bullet/ballista_spear + alt_ammo_type = /obj/item/spear/dragonator + alt_projectile_type = /obj/projectile/bullet/ballista_spear_dragon + loaded_gun = FALSE + fully_loaded_gun = FALSE + fire_delay = 1 + shot_delay = 1 + firing_shakes_camera = FALSE + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 15.15, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.5 + ) + +/obj/structure/mounted_gun/ballista/attackby(obj/item/ammo_casing/used_item, mob/user, params) //again its single shot so its kinda weird. + if(is_firing) + balloon_alert(user, "gun is firing") + return + + if(!istype(used_item, ammo_type)) + return + + if(fully_loaded_gun) + balloon_alert(user, "already fully loaded!") + return + + if(istype(used_item, alt_ammo_type)) + use_alt_ammo = TRUE + + playsound(src, 'sound/items/weapons/draw_bow.ogg', 50, FALSE, 5) + do_after(user, load_delay, target = src) + shots_in_gun = 1 //MAX OF ONE SHOT. + balloon_alert(user, loading_message) + loaded_gun = TRUE + QDEL_NULL(used_item) + fully_loaded_gun = TRUE + icon_state = icon_state_loaded diff --git a/code/game/objects/structures/cat_house.dm b/code/game/objects/structures/cat_house.dm index ea016e00d677..746c67f0b1ec 100644 --- a/code/game/objects/structures/cat_house.dm +++ b/code/game/objects/structures/cat_house.dm @@ -5,6 +5,7 @@ icon_state = "cat_house" density = TRUE anchored = TRUE + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 5) ///cat residing in this house var/mob/living/resident_cat diff --git a/code/game/objects/structures/chess.dm b/code/game/objects/structures/chess.dm index 04410e299809..a8d45ccbf8fc 100644 --- a/code/game/objects/structures/chess.dm +++ b/code/game/objects/structures/chess.dm @@ -6,6 +6,7 @@ name = "\improper Probably a White Pawn" desc = "This is weird. Please inform administration on how you managed to get the parent chess piece. Thanks!" max_integrity = 100 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/chess/wrench_act(mob/user, obj/item/tool) if(flags_1 & HOLOGRAM_1) diff --git a/code/game/objects/structures/construction_console/construction_actions.dm b/code/game/objects/structures/construction_console/construction_actions.dm index cce7d2ee5162..398e97954e71 100644 --- a/code/game/objects/structures/construction_console/construction_actions.dm +++ b/code/game/objects/structures/construction_console/construction_actions.dm @@ -32,10 +32,10 @@ if (!area_constraint) return TRUE if(!istype(build_area, area_constraint)) - to_chat(owner, span_warning("You can only build within [area_constraint]!")) + to_chat(owner, span_warning("You can only build within [area_constraint::name]!")) return FALSE if(only_station_z && !is_station_level(build_target.z)) - to_chat(owner, span_warning("[area_constraint] has launched and can no longer be modified.")) + to_chat(owner, span_warning("[area_constraint::name] has launched and can no longer be modified.")) return FALSE return TRUE diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 50437e1936a0..a01ba7fdeef3 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -20,7 +20,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) /// 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 - + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) /// The overlay for the closet's door var/obj/effect/overlay/closet_door/door_obj /// Whether or not this door is being animated @@ -154,6 +154,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) add_to_roundstart_list() closet_see_inside = new(src) + obj_flags |= UNIQUE_RENAME // if closed, any item at the crate's loc is put in the contents if (mapload) @@ -289,12 +290,27 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) if(vname in list(NAMEOF(src, locked), NAMEOF(src, welded), NAMEOF(src, secure), NAMEOF(src, icon_welded), NAMEOF(src, delivery_icon))) update_appearance() +// Clone of closet items +/obj/effect/appearance_clone/closet_item + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + /// Animates the closet door opening and closing /obj/structure/closet/proc/animate_door(closing = FALSE) if(!door_anim_time) return if(!door_obj) door_obj = new + if(closing && length(contents)) + var/icon/mask_icon = icon(icon, has_closed_overlay ? "[icon_door || base_icon_state || initial(icon_state)]_door" : icon_state) + // When closing, all of our contents are already in src - they've already disappeared from the world + // So to make the animation less jarring, we create a clone of everything in the closet to show in the animation + for(var/content in src) + var/obj/effect/appearance_clone/closet_item/clone = new(loc, content) + // Mask keeps in in bounds of the inside of the closet + clone.add_filter("closet_mask", 1, alpha_mask_filter(x = -1 * (clone.pixel_x + clone.pixel_w), y = -1 * (clone.pixel_y + clone.pixel_z), icon = mask_icon)) + clone.layer = FLOAT_LAYER - 1 + vis_contents += clone + var/default_door_icon = "[icon_door || icon_state]_door" vis_contents += door_obj door_obj.icon = icon @@ -330,6 +346,9 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) /obj/structure/closet/proc/end_door_animation() is_animating_door = FALSE vis_contents -= door_obj + for(var/obj/effect/appearance_clone/closet_item/clone in vis_contents) + vis_contents -= clone + qdel(clone) update_icon() /// Calculates the matrix to be applied to the animated door overlay @@ -374,10 +393,20 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) var/screentip_change = FALSE if(isnull(held_item)) - if(secure && !broken) - context[SCREENTIP_CONTEXT_RMB] = opened ? "Lock" : "Unlock" if(!welded) context[SCREENTIP_CONTEXT_LMB] = opened ? "Close" : "Open" + context[SCREENTIP_CONTEXT_RMB] = opened ? "Close" : "Open" + if(secure && !broken) + if (opened) + context[SCREENTIP_CONTEXT_RMB] = "Close" + else + context[SCREENTIP_CONTEXT_RMB] = !locked ? "Lock" : "Unlock" + if (locked) + context[SCREENTIP_CONTEXT_LMB] = "Unlock" + screentip_change = TRUE + if(secure && !opened && istype(held_item, /obj/item/card/id)) + context[SCREENTIP_CONTEXT_LMB] = !locked ? "Lock" : "Unlock" + context[SCREENTIP_CONTEXT_RMB] = !locked ? "Lock" : "Unlock" screentip_change = TRUE if(istype(held_item, cutting_tool)) @@ -836,39 +865,6 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) else balloon_alert(user, "set to [choice]") - else if(!opened && IS_WRITING_UTENSIL(weapon)) - if(locked) - balloon_alert(user, "unlock first!") - return - - if(isnull(id_card) && secure) - balloon_alert(user, "not yours to rename!") - return - - var/name_set = FALSE - var/desc_set = FALSE - - - var/input_name = tgui_input_text(user, "Locker Name", "Locker Name", max_length = MAX_NAME_LEN) - - if(!isnull(input_name)) - name = input_name - name_set = TRUE - - var/input_desc = tgui_input_text(user, "Locker Description", "Locker Description", max_length = MAX_DESC_LEN) - - if(!isnull(input_desc)) - desc = input_desc - desc_set = TRUE - - var/bit_flag = NONE - if(name_set) - bit_flag |= UPDATE_NAME - if(desc_set) - bit_flag |= UPDATE_DESC - if(bit_flag) - update_appearance(bit_flag) - else if(opened) if(istype(weapon, cutting_tool)) if(weapon.tool_behaviour == TOOL_WELDER) @@ -1260,6 +1256,16 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) /obj/structure/closet/proc/add_to_roundstart_list() GLOB.roundstart_station_closets += src +/obj/structure/closet/rename_checks(mob/living/user) + . = TRUE + if(locked) + src.balloon_alert(user, "unlock first!") + return FALSE + + if(isnull(id_card) && secure) + src.balloon_alert(user, "not yours to rename!") + return FALSE + ///Spears deal bonus damages to lockers /obj/structure/closet/secure_closet/attacked_by(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/spear)) diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index 2c596b67aebb..12d9b7a37943 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -19,6 +19,7 @@ can_install_electronics = FALSE paint_jobs = null can_weld_shut = FALSE + door_anim_time = 0 var/foldedbag_path = /obj/item/bodybag var/obj/item/bodybag/foldedbag_instance = null @@ -39,6 +40,7 @@ rmb_text = "Fold up", \ ) AddElement(/datum/element/contextual_screentip_sharpness, lmb_text = "Remove Tag") + obj_flags |= UNIQUE_RENAME | RENAME_NO_DESC /obj/structure/closet/body_bag/Destroy() // If we have a stored bag, and it's in nullspace (not in someone's hand), delete it. @@ -47,28 +49,22 @@ return ..() /obj/structure/closet/body_bag/attackby(obj/item/interact_tool, mob/user, list/modifiers, list/attack_modifiers) - if (IS_WRITING_UTENSIL(interact_tool)) - if(!user.can_write(interact_tool)) - return - var/t = tgui_input_text(user, "What would you like the label to be?", name, max_length = 53) - if(user.get_active_held_item() != interact_tool) - return - if(!user.can_perform_action(src)) - return - handle_tag("[t ? t : initial(name)]") - return - if(!tag_name) - return if(interact_tool.tool_behaviour == TOOL_WIRECUTTER || interact_tool.get_sharpness()) to_chat(user, span_notice("You cut the tag off [src].")) - handle_tag() + playsound(src, SFX_WRITING_PEN, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, SOUND_FALLOFF_EXPONENT + 3, ignore_walls = FALSE) + tag_name = null + update_appearance() + qdel(src.GetComponent(/datum/component/rename)) -///Handles renaming of the bodybag's examine tag. -/obj/structure/closet/body_bag/proc/handle_tag(new_name) +/obj/structure/closet/body_bag/nameformat(input, user) playsound(src, SFX_WRITING_PEN, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, SOUND_FALLOFF_EXPONENT + 3, ignore_walls = FALSE) - tag_name = new_name - name = tag_name ? "[initial(name)] - [tag_name]" : initial(name) - update_appearance() + tag_name = input + update_icon() + return tag_name ? "[initial(name)] - [tag_name]" : initial(name) + +/obj/structure/closet/body_bag/rename_reset() + tag_name = null + update_icon() /obj/structure/closet/body_bag/update_overlays() . = ..() diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 7773d54e3e4c..66f7e2780e56 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -9,6 +9,8 @@ can_weld_shut = 0 cutting_tool = /obj/item/wirecutters material_drop = /obj/item/stack/sheet/cardboard + material_drop_amount = 4 + custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT * 4) delivery_icon = "deliverybox" anchorable = FALSE open_sound = 'sound/machines/cardboard_box.ogg' @@ -118,4 +120,5 @@ close_sound = 'sound/machines/crate/crate_close.ogg' open_sound_volume = 35 close_sound_volume = 50 + custom_materials = list(/datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 4) material_drop = /obj/item/stack/sheet/plasteel diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm index 4e43ea2ce10b..407fea71c316 100644 --- a/code/game/objects/structures/crates_lockers/closets/fitness.dm +++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm @@ -13,7 +13,6 @@ new /obj/item/clothing/under/shorts/green(src) new /obj/item/clothing/under/costume/jabroni(src) - /obj/structure/closet/boxinggloves name = "boxing gloves closet" desc = "It's a storage unit for gloves for use in the boxing ring." @@ -26,7 +25,6 @@ new /obj/item/clothing/gloves/boxing/yellow(src) new /obj/item/clothing/gloves/boxing(src) - /obj/structure/closet/masks name = "mask closet" desc = "IT'S A STORAGE UNIT FOR FIGHTER MASKS OLE!" @@ -37,7 +35,6 @@ new /obj/item/clothing/mask/luchador/rudos(src) new /obj/item/clothing/mask/luchador/tecnicos(src) - /obj/structure/closet/lasertag/red name = "red laser tag equipment" desc = "It's a storage unit for laser tag equipment." diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 5ba0e8c42010..69e521508861 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -10,12 +10,15 @@ close_sound_volume = 50 max_integrity = 70 door_anim_time = 0 // no animation + material_drop = /obj/item/stack/sheet/mineral/wood + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/closet/acloset name = "strange closet" desc = "It looks alien!" icon_state = "alien" material_drop = /obj/item/stack/sheet/mineral/abductor + custom_materials = list(/datum/material/alloy/alien = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/closet/gimmick name = "administrative supply closet" 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 fdaaa8d4b067..4e50ffb2960d 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -7,7 +7,7 @@ /obj/structure/closet/gmcloset/PopulateContents() ..() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/clothing/head/hats/tophat = 2, /obj/item/radio/headset/headset_srv = 2, /obj/item/clothing/under/costume/buttondown/slacks/service = 2, @@ -30,7 +30,7 @@ /obj/structure/closet/chefcloset/PopulateContents() ..() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/clothing/under/suit/waiter = 2, /obj/item/radio/headset/headset_srv = 2, /obj/item/clothing/accessory/waistcoat = 2, @@ -119,7 +119,7 @@ icon_door = "sec_wardrobe" /obj/structure/closet/wardrobe/red/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/clothing/suit/hooded/wintercoat/security = 1, /obj/item/storage/backpack/security = 1, /obj/item/storage/backpack/satchel/sec = 1, @@ -139,7 +139,7 @@ icon_door = "cargo_wardrobe" /obj/structure/closet/wardrobe/cargotech/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/clothing/suit/hooded/wintercoat/cargo = 1, /obj/item/clothing/under/rank/cargo/tech = 3, /obj/item/clothing/shoes/sneakers/black = 3, @@ -153,7 +153,7 @@ icon_door = "atmos_wardrobe" /obj/structure/closet/wardrobe/atmospherics_yellow/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/clothing/accessory/pocketprotector = 1, /obj/item/storage/backpack/duffelbag/engineering = 1, /obj/item/storage/backpack/satchel/eng = 1, @@ -171,7 +171,7 @@ icon_door = "engi_wardrobe" /obj/structure/closet/wardrobe/engineering_yellow/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/clothing/accessory/pocketprotector = 1, /obj/item/storage/backpack/duffelbag/engineering = 1, /obj/item/storage/backpack/industrial = 1, @@ -190,7 +190,7 @@ icon_door = "med_wardrobe" /obj/structure/closet/wardrobe/white/medical/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/clothing/accessory/pocketprotector = 1, /obj/item/storage/backpack/duffelbag/med = 1, /obj/item/storage/backpack/medic = 1, @@ -213,7 +213,7 @@ icon_door = "robo_wardrobe" /obj/structure/closet/wardrobe/robotics_black/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/clothing/glasses/hud/diagnostic = 2, /obj/item/clothing/under/rank/rnd/roboticist = 2, /obj/item/clothing/suit/toggle/labcoat = 2, @@ -233,7 +233,7 @@ icon_door = "chem_wardrobe" /obj/structure/closet/wardrobe/chemistry_white/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/clothing/under/rank/medical/chemist = 2, /obj/item/clothing/shoes/sneakers/white = 2, /obj/item/clothing/suit/toggle/labcoat/chemist = 2, @@ -251,7 +251,7 @@ icon_door = "gen_wardrobe" /obj/structure/closet/wardrobe/genetics_white/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/clothing/under/rank/rnd/geneticist = 2, /obj/item/clothing/shoes/sneakers/white = 2, /obj/item/clothing/suit/toggle/labcoat/genetics = 2, @@ -268,7 +268,7 @@ icon_door = "viro_wardrobe" /obj/structure/closet/wardrobe/virology_white/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/clothing/under/rank/medical/virologist = 2, /obj/item/clothing/shoes/sneakers/white = 2, /obj/item/clothing/suit/toggle/labcoat/virologist = 2, @@ -285,7 +285,7 @@ icon_door = "sci_wardrobe" /obj/structure/closet/wardrobe/science_white/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/clothing/accessory/pocketprotector = 1, /obj/item/storage/backpack/science = 2, /obj/item/storage/backpack/satchel/science = 2, @@ -304,7 +304,7 @@ icon_door = "botany_wardrobe" /obj/structure/closet/wardrobe/botanist/PopulateContents() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/storage/backpack/botany = 2, /obj/item/storage/backpack/satchel/hyd = 2, /obj/item/storage/backpack/messenger/hyd = 2, 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 22dd2bec4b2b..e448c3d553de 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -35,7 +35,7 @@ /obj/structure/closet/secure_closet/engineering_electrical/PopulateContents() ..() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/inducer = 2, /obj/item/storage/toolbox/electrical = 3, /obj/item/electronics/apc = 3, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index c4ee98fb1068..c9986bae481f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -3,9 +3,13 @@ base_icon_state = "freezer" icon = 'modular_darkpack/master_files/icons/obj/storage/closet32x32.dmi' // DARKPACK EDIT ADD flags_1 = PREVENT_CONTENTS_EXPLOSION_1 - door_anim_squish = 0.22 - door_anim_angle = 123 - door_anim_time = 4 + // DARKPACK EDIT CHANGE START + door_anim_time = 0 + enable_door_overlay = FALSE + has_opened_overlay = FALSE + has_closed_overlay = FALSE + // DARKPACK EDIT CHANGE END + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5.3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3.5) /// If FALSE, we will protect the first person in the freezer from an explosion / nuclear blast. var/jones = FALSE paint_jobs = null @@ -16,6 +20,12 @@ /// Minimum temperature of the internal air mixture var/minimum_temperature = T0C - 60 +// DARKPACK EDIT ADD START - handles fridge open/close states since parent type handles it alot differently +/obj/structure/closet/secure_closet/freezer/update_icon_state() + . = ..() + icon_state = opened ? "freezeropen" : "freezer" +// DARKPACK EDIT ADD END + /obj/structure/closet/secure_closet/freezer/process_internal_air(seconds_per_tick) if(opened) var/datum/gas_mixture/current_exposed_air = loc.return_air() 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 084631931815..849c7f74e8e5 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -6,7 +6,7 @@ /obj/structure/closet/secure_closet/medical1/PopulateContents() ..() - var/static/items_inside = list( + var/list/items_inside = list( /obj/item/reagent_containers/cup/beaker = 2, /obj/item/reagent_containers/dropper = 2, /obj/item/storage/belt/medical = 1, @@ -83,14 +83,11 @@ new /obj/item/computer_disk/command/cmo(src) new /obj/item/radio/headset/heads/cmo(src) new /obj/item/megaphone/command(src) - new /obj/item/defibrillator/compact/loaded(src) - new /obj/item/healthanalyzer/advanced(src) new /obj/item/assembly/flash/handheld(src) new /obj/item/autosurgeon/medical_hud(src) new /obj/item/door_remote/chief_medical_officer(src) new /obj/item/clothing/neck/petcollar(src) new /obj/item/pet_carrier(src) - new /obj/item/wallframe/defib_mount(src) new /obj/item/circuitboard/machine/techfab/department/medical(src) new /obj/item/storage/photo_album/cmo(src) new /obj/item/storage/lockbox/medal/med(src) @@ -100,6 +97,7 @@ // Traitor steal objective new /obj/item/reagent_containers/hypospray/cmo(src) + new /obj/item/defibrillator/compact/loaded/cmo(src) /obj/structure/closet/secure_closet/animal name = "animal control locker" @@ -139,3 +137,23 @@ new /obj/item/storage/box/syringes/variety(src) new /obj/item/storage/box/beakers/variety(src) new /obj/item/clothing/glasses/science(src) + +/obj/structure/closet/secure_closet/paramedic + name = "emergency medical team locker" + req_access = list(ACCESS_PARAMEDIC) + icon_state = "paramed_secure" + +/obj/structure/closet/secure_closet/paramedic/PopulateContents() + ..() + + var/list/items_inside = list( + /obj/item/storage/medkit/emergency = 1, + /obj/item/storage/box/bandages = 1, + /obj/item/pinpointer/crew = 1, + /obj/item/storage/belt/medical/paramedic = 1, + /obj/item/radio/headset/headset_med = 2, + /obj/item/emergency_bed = 2, + /obj/item/storage/bag/garment/paramedic = 2, + ) + generate_items_inside(items_inside,src) + diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index f639df5f1286..01eb0550d57f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -45,6 +45,8 @@ open_sound_volume = 25 close_sound_volume = 50 door_anim_time = 0 // no animation + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) + material_drop = /obj/item/stack/sheet/mineral/wood /obj/structure/closet/secure_closet/personal/cabinet/PopulateContents() new /obj/item/storage/backpack/satchel/leather/withwallet( src ) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 1fad4a1c9025..1d798b567a3c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -8,6 +8,7 @@ secure = TRUE damage_deflection = 20 material_drop_amount = 5 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.5) /datum/armor/closet_secure_closet melee = 30 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 51a41063e71a..d1fef8c52da4 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -5,11 +5,6 @@ /obj/structure/closet/secure_closet/captains/PopulateContents() ..() - - 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) @@ -18,6 +13,7 @@ new /obj/item/radio/headset/heads/captain(src) new /obj/item/door_remote/captain(src) new /obj/item/storage/photo_album/captain(src) + new /obj/item/megaphone/command(src) /obj/structure/closet/secure_closet/captains/populate_contents_immediate() new /obj/item/gun/energy/e_gun(src) @@ -94,6 +90,7 @@ new /obj/item/storage/belt/security/full(src) new /obj/item/flashlight/seclite(src) new /obj/item/door_remote/head_of_security(src) + new /obj/item/storage/belt/bandolier(src) /obj/structure/closet/secure_closet/warden/populate_contents_immediate() @@ -178,7 +175,7 @@ /obj/structure/closet/secure_closet/injection name = "lethal injections locker" - req_access = list(ACCESS_HOS) + req_access = list(ACCESS_ARMORY) /obj/structure/closet/secure_closet/injection/PopulateContents() ..() @@ -312,7 +309,7 @@ new /obj/item/storage/box/firingpins(src) new /obj/item/gun/energy/ionrifle(src) for(var/i in 1 to 3) - new /obj/item/gun/energy/laser/thermal(src) + new /obj/item/gun/energy/laser/pistol(src) /obj/structure/closet/secure_closet/armory3/populate_contents_immediate() for(var/i in 1 to 3) diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index fc2c2fe56d10..f07fd7dca1df 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -30,6 +30,8 @@ new /obj/item/clothing/shoes/sneakers/black(src) new /obj/item/mod/module/plasma_stabilizer(src) new /obj/item/climbing_hook/syndicate(src) + new /obj/item/mod/module/thermal_regulator(src) + new /obj/item/mod/module/plasma_stabilizer(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/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index cd2cfe725489..a888034bd5ff 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -51,7 +51,6 @@ new /obj/item/clothing/mask/bandana/skull/black(src) return - /obj/structure/closet/wardrobe/green name = "green wardrobe" icon_door = "green" @@ -67,7 +66,6 @@ new /obj/item/clothing/mask/bandana/green(src) return - /obj/structure/closet/wardrobe/orange name = "prison wardrobe" desc = "It's a storage unit for prisoner attire." // DARKPACK EDIT CHANGE @@ -82,7 +80,6 @@ new /obj/item/clothing/shoes/sneakers/orange(src) return - /obj/structure/closet/wardrobe/yellow name = "yellow wardrobe" icon_door = "yellow" @@ -98,7 +95,6 @@ new /obj/item/clothing/mask/bandana/gold(src) return - /obj/structure/closet/wardrobe/white name = "white wardrobe" icon_door = "white" @@ -133,7 +129,6 @@ new /obj/item/clothing/shoes/sneakers/white(src) return - /obj/structure/closet/wardrobe/grey name = "grey wardrobe" icon_door = "grey" @@ -163,7 +158,6 @@ new /obj/item/clothing/accessory/pocketprotector(src) return - /obj/structure/closet/wardrobe/mixed name = "mixed wardrobe" icon_door = "mixed" diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index c54605eb78c2..e7be92d5a849 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -184,6 +184,7 @@ paint_jobs = null elevation_open = 0 can_weld_shut = FALSE + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 5) /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." @@ -283,8 +284,8 @@ new /obj/item/reagent_containers/blood/b_plus(src) new /obj/item/reagent_containers/blood/o_minus(src) new /obj/item/reagent_containers/blood/o_plus(src) - new /obj/item/reagent_containers/blood/lizard(src) - new /obj/item/reagent_containers/blood/ethereal(src) +// new /obj/item/reagent_containers/blood/lizard(src) // DARKPACK EDIT REMOVAL +// new /obj/item/reagent_containers/blood/ethereal(src) // DARKPACK EDIT REMOVAL for(var/i in 1 to 3) new /obj/item/reagent_containers/blood/random(src) new /obj/item/paper/fluff/jobs/medical/blood_types(src) diff --git a/code/game/objects/structures/crates_lockers/crates/abandoned_crates/abandoned_crates.dm b/code/game/objects/structures/crates_lockers/crates/abandoned_crates/abandoned_crates.dm new file mode 100644 index 000000000000..009a8c6a843a --- /dev/null +++ b/code/game/objects/structures/crates_lockers/crates/abandoned_crates/abandoned_crates.dm @@ -0,0 +1,242 @@ +//Originally coded by ISaidNo, later modified by Kelenius. Ported from Baystation12. + +/obj/structure/closet/crate/secure/loot + name = "abandoned crate" + desc = "What could be inside?" + icon_state = "securecrate" + base_icon_state = "securecrate" + integrity_failure = 0 //no breaking open the crate + var/code = null + /// Associated list of previous attempts w/ bulls & cows + var/list/previous_attempts = list() + var/attempts = 10 + var/code_length = 4 + var/qdel_on_open = FALSE + var/spawned_loot = FALSE + tamperproof = 90 + interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND + + divable = FALSE // Stop people from "diving into" the crate accidentally, and then detonating it. + + /// Possible loot from the crate, selected according to a weighted list: [typepath] = probability % + var/list/possible_loot = list( + list( // Toys & Entertainment + /obj/item/melee/skateboard/pro = 5, + /obj/effect/spawner/abandoned_crate/snappop = 5, + /obj/effect/spawner/abandoned_crate/posters = 5, + /obj/item/toy/balloon/corgi = 2, + /obj/effect/spawner/abandoned_crate/mecha = 2, + /obj/item/toy/balloon/syndicate = 2, + /obj/item/toy/plush/snakeplushie = 2, + /obj/item/bikehorn/airhorn = 2, + /obj/item/toy/plush/beeplushie = 2, + /obj/item/toy/plush/lizard_plushie = 2, + /obj/item/toy/plush/nukeplushie = 1, + /obj/effect/spawner/abandoned_crate/bwoink = 1, + /obj/effect/spawner/abandoned_crate/pay_day = 1, + /obj/item/melee/skateboard/hoverboard = 1, + /obj/item/implanter/sad_trombone = 1, + ) = 34, // sum of weights inside list + + list( // Weapons & Combat + /obj/item/melee/baton = 2, + /obj/item/clothing/gloves/boxing/evil = 1, + /obj/item/melee/energy/sword/bananium = 1, + /obj/item/katana = 1, + ) = 5, + + list( // Clothing + /obj/item/storage/box/syndie_kit/chameleon/broken = 5, + /obj/item/clothing/shoes/kindle_kicks = 2, + /obj/effect/spawner/abandoned_crate/kitty = 2, + /obj/effect/spawner/abandoned_crate/space_suit = 2, + /obj/effect/spawner/abandoned_crate/fursuit = 2, + ) = 13, + + list( // Tools & Equipment + /obj/item/modular_computer/pda/clear = 5, + /obj/item/defibrillator/compact = 2, + ) = 7, + + list( // Materials + /obj/effect/spawner/abandoned_crate/diamonds = 5, + /obj/effect/spawner/abandoned_crate/bluespace_crystal = 2, + /obj/effect/spawner/abandoned_crate/bananium = 2, + ) = 9, + + list( // Seed & Plants + /obj/item/seeds/firelemon = 5, + /obj/effect/spawner/abandoned_crate/weed = 1, + ) = 6, + + list( // Consumables + /obj/effect/spawner/abandoned_crate/booze = 5, + /obj/effect/spawner/abandoned_crate/boda = 5, + /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, + ) = 11, + + list( // Mobs + /mob/living/basic/bot/honkbot = 5, + /mob/living/basic/pet/gondola = 2, + /obj/effect/spawner/abandoned_crate/bloodroaches = 1, + ) = 8, + + list( // Medical & Science + /obj/item/dnainjector/xraymut = 1, + /obj/item/dnainjector/wackymut = 1, + ) = 2, + + list( // Dangerous + /obj/effect/spawner/abandoned_crate/gibtonite = 2, + /obj/effect/spawner/abandoned_crate/mimic = 1, + /obj/effect/spawner/abandoned_crate/bees = 1, + ) = 4, + + list( // Misc + /obj/effect/spawner/random/structure/closet_empty/crate = 1, //crate with crate + ) = 1, + ) + +/obj/structure/closet/crate/secure/loot/Initialize(mapload) + . = ..() + code = generate_code(code_length) + +/// Generates a random code of specified length with no repeating digits +/obj/structure/closet/crate/secure/loot/proc/generate_code(length) + var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0") + var/list/code_digits = list() + + for(var/i in 1 to length) + if(!digits.len) + break + var/digit = pick(digits) + code_digits += digit + digits -= digit //there are never matching digits in the answer + + return code_digits.Join("") + +//ATTACK HAND IGNORING PARENT RETURN VALUE +/obj/structure/closet/crate/secure/loot/attack_hand(mob/user, list/modifiers) + if(!locked) + return ..() + if(!user.can_perform_action(src)) + return + + var/input = tgui_input_text(user, title = "Deca-code lock", message = "Enter [code_length] digits. All digits must be unique.", max_length = code_length) + + if(input == code) + if(!spawned_loot) + spawn_loot() + tamperproof = 0 // set explosion chance to zero, so we dont accidently hit it with a multitool and instantly die + togglelock(user) + SStgui.close_user_uis(user, src) + return + + if(!validate_input(input)) + to_chat(user, span_notice("You leave the crate alone.")) + return + + to_chat(user, span_warning("A red light flashes.")) + previous_attempts += list(bulls_and_cows(input)) + attempts-- + + if(attempts <= 0) + boom(user) + +/// Checks if user input is a valid code attempt +/obj/structure/closet/crate/secure/loot/proc/validate_input(input) + if(!input || code_length != length(input)) + return FALSE + + var/list/used_digits = list() + for(var/i = 1 to length(input)) + var/char = input[i] + if(!(char >= "0" && char <= "9")) //if a non-digit is found, reject the input + return FALSE + if(char in used_digits) //if a digit is repeated, reject the input + return FALSE + used_digits += char + + return TRUE + +/obj/structure/closet/crate/secure/loot/click_alt(mob/living/user) + attack_hand(user) //this helps you not blow up so easily by overriding unlocking which results in an immediate boom. + return CLICK_ACTION_SUCCESS + +/obj/structure/closet/crate/secure/loot/ui_interact(mob/user, datum/tgui/ui) + . = ..() + + // Attempt to update tgui ui, open and update if needed. + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AbandonedCrate", name) + ui.open() + +/obj/structure/closet/crate/secure/loot/ui_data(mob/user) + var/list/data = list() + + data["previous_attempts"] = previous_attempts + data["attempts_left"] = attempts + + return data + +/obj/structure/closet/crate/secure/loot/multitool_act(mob/living/user, obj/item/tool) + if(!locked) + return + if(Adjacent(user)) + ui_interact(user) + + return ITEM_INTERACT_SUCCESS + +/// Implements bulls and cows algorithm to compare guess against actual code +/obj/structure/closet/crate/secure/loot/proc/bulls_and_cows(guess) + var/bulls = 0 + var/cows = 0 + + for(var/i = 1 to code_length) + var/guess_char = guess[i] + var/code_char = code[i] + + if(guess_char == code_char) + bulls++ + else if(findtext(code, guess_char)) + cows++ + + return list("attempt" = guess, "bulls" = bulls, "cows" = cows) + +/obj/structure/closet/crate/secure/loot/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() + + if(locked) + 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) + . = ..() //Run the normal code. + if(locked) //Double check if the crate actually locked itself when the normal code ran. + //reset the anti-tampering, number of attempts and last attempt when the lock is re-enabled. + tamperproof = initial(tamperproof) + attempts = initial(attempts) + previous_attempts = list() + return + if(tamperproof) + return + return ..() + +/obj/structure/closet/crate/secure/loot/atom_deconstruct(disassembled = TRUE) + if(locked) + boom() + return + return ..() + +/obj/structure/closet/crate/secure/loot/after_open(mob/living/user, force) + . = ..() + if(qdel_on_open) + qdel(src) + +/obj/structure/closet/crate/secure/loot/proc/spawn_loot() + var/loot = pick_weight_recursive(possible_loot) + new loot(src) + spawned_loot = TRUE diff --git a/code/game/objects/structures/crates_lockers/crates/abandoned_crates/abandoned_crates_loot.dm b/code/game/objects/structures/crates_lockers/crates/abandoned_crates/abandoned_crates_loot.dm new file mode 100644 index 000000000000..490b280c66c2 --- /dev/null +++ b/code/game/objects/structures/crates_lockers/crates/abandoned_crates/abandoned_crates_loot.dm @@ -0,0 +1,163 @@ +/** + * Abandoned Crate Loot Spawner + * + * Base spawner for generating loot contents in abandoned crates + */ +/obj/effect/spawner/abandoned_crate + name = "abandoned crate loot spawner" + desc = "i feel lucky" + /// Associative list with actual loot: item_type = quantity + var/list/loot + +/obj/effect/spawner/abandoned_crate/Initialize(mapload) + . = ..() + + if(LAZYLEN(loot)) + for(var/atom in loot) + for(var/i in 1 to loot[atom]) + new atom(loc) + +/obj/effect/spawner/abandoned_crate/booze + loot = list( + /obj/item/reagent_containers/cup/glass/bottle/rum = 1, + /obj/item/reagent_containers/cup/glass/bottle/whiskey = 2, + /obj/item/lighter = 1, + /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 1, + /obj/item/cigarette/rollie = 3 + ) + +/obj/effect/spawner/abandoned_crate/diamonds + loot = list( + /obj/item/stack/ore/diamond = 10 + ) + +/obj/effect/spawner/abandoned_crate/posters + loot = list( + /obj/item/poster/random_contraband = 5 + ) + +/obj/effect/spawner/abandoned_crate/boda + loot = list( + /obj/item/vending_refill/sovietsoda = 1, + /obj/item/circuitboard/machine/vendor = 1 + ) + +/obj/effect/spawner/abandoned_crate/boda/Initialize(mapload) + . = ..() + + for(var/obj/item/circuitboard/machine/vendor/board in loc) + board.set_type(/obj/machinery/vending/sovietsoda) + +/obj/effect/spawner/abandoned_crate/snappop + loot = list( + /obj/item/toy/snappop/phoenix = 5 + ) + +/obj/effect/spawner/abandoned_crate/mecha + loot = list() + +/obj/effect/spawner/abandoned_crate/mecha/Initialize(mapload) + var/mecha = pick(subtypesof(/obj/item/toy/mecha)) + loot[mecha] = 1 + + return ..() + +/obj/effect/spawner/abandoned_crate/space_suit + loot = list( + /obj/item/borg/upgrade/modkit/aoe/mobs = 1, + /obj/item/clothing/suit/space = 1, + /obj/item/clothing/head/helmet/space = 1 + ) + +/obj/effect/spawner/abandoned_crate/kitty + loot = list( + /obj/item/clothing/head/costume/kitty = 5, + /obj/item/clothing/neck/petcollar = 5 + ) + +/obj/effect/spawner/abandoned_crate/fursuit + loot = list( + /obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian = 1, + /obj/item/clothing/suit/hooded/ian_costume = 1 + ) + +/obj/effect/spawner/abandoned_crate/gibtonite + loot = list( + /obj/item/gibtonite = 1, + ) + +/obj/effect/spawner/abandoned_crate/gibtonite/Initialize(mapload) + . = ..() + + for(var/obj/item/gibtonite/free_bomb in loc) + free_bomb.quality = rand(GIBTONITE_QUALITY_LOW, GIBTONITE_QUALITY_HIGH) + free_bomb.GibtoniteReaction(null, "A secure loot closet has spawned a live") + +/obj/effect/spawner/abandoned_crate/bluespace_crystal + loot = list( + /obj/item/stack/ore/bluespace_crystal = 5 + ) + +/obj/effect/spawner/abandoned_crate/bananium + loot = list( + /obj/item/stack/sheet/mineral/bananium = 10 + ) + +/obj/effect/spawner/abandoned_crate/weed + loot = list() + +/obj/effect/spawner/abandoned_crate/weed/Initialize(mapload) + var/seed_type = pick(typesof(/obj/item/seeds/cannabis)) + var/cannabis_type= pick(typesof(/obj/item/food/grown/cannabis)) + var/weed_amount = rand(2, 4) + + for(var/i in 1 to weed_amount) + loot[seed_type] = (loot[seed_type] || 0) + 1 + loot[cannabis_type] = (loot[cannabis_type] || 0) + 1 + + return ..() + +/obj/effect/spawner/abandoned_crate/bloodroaches + loot = list( + /mob/living/basic/cockroach/bloodroach = 30 + ) + +/obj/effect/spawner/abandoned_crate/mimic + loot = list( + /mob/living/basic/mimic/crate = 1 + ) + +/obj/effect/spawner/abandoned_crate/mimic/Initialize(mapload) + . = ..() + + var/obj/structure/closet/crate/secure/loot/parent_crate = loc + if(istype(parent_crate)) + parent_crate.qdel_on_open = TRUE + +/obj/effect/spawner/abandoned_crate/bwoink + loot = list( + /obj/item/banhammer = 1, + /obj/effect/mine/sound/bwoink = 3 + ) + +/obj/effect/spawner/abandoned_crate/bwoink/Initialize(mapload) + . = ..() + + for(var/obj/effect/mine/sound/bwoink/mine in loc) + mine.set_anchored(FALSE) + mine.move_resist = MOVE_RESIST_DEFAULT + +/obj/effect/spawner/abandoned_crate/pay_day + loot = list( + /obj/item/clothing/mask/balaclava = 4, + /obj/item/gun/ballistic/shotgun/toy = 1, + /obj/item/gun/ballistic/automatic/pistol/toy = 1, + /obj/item/gun/ballistic/automatic/toy = 1, + /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted = 1, + /obj/item/ammo_box/foambox = 1 + ) + +/obj/effect/spawner/abandoned_crate/bees + loot = list( + /mob/living/basic/bee/toxin = 3 + ) diff --git a/code/game/objects/structures/crates_lockers/crates/cardboard.dm b/code/game/objects/structures/crates_lockers/crates/cardboard.dm index 1544bb2e0a40..55a843f9edf8 100644 --- a/code/game/objects/structures/crates_lockers/crates/cardboard.dm +++ b/code/game/objects/structures/crates_lockers/crates/cardboard.dm @@ -1,9 +1,9 @@ /obj/structure/closet/crate/cardboard name = "cardboard box" desc = "A box, in which you can place things. Revolutionary, I know." - pass_flags_self = PASSSTRUCTURE material_drop = /obj/item/stack/sheet/cardboard material_drop_amount = 4 + custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT * 4) icon_state = "cardboard" base_icon_state = "cardboard" open_sound = 'sound/items/poster/poster_ripped.ogg' diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm index 54f8e3541b29..898939afc029 100644 --- a/code/game/objects/structures/crates_lockers/crates/large.dm +++ b/code/game/objects/structures/crates_lockers/crates/large.dm @@ -71,3 +71,13 @@ 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]" + +// DARKPACK EDIT ADD - Paths, finding artifacts in crates +/obj/structure/closet/crate/large/Destroy() + // 10% chance to spawn a random artifact when destroyed (spawner has 50% chance of spawning nothing) + if(!length(contents) && prob(16)) + var/turf/T = get_turf(src) + if(T) + new /obj/effect/spawner/random/occult/artifact(T) + return ..() +// DARKPACK EDIT ADD END diff --git a/code/game/objects/structures/crates_lockers/crates/wooden.dm b/code/game/objects/structures/crates_lockers/crates/wooden.dm index 5703cb6ddcb3..d1ffc7246e8c 100644 --- a/code/game/objects/structures/crates_lockers/crates/wooden.dm +++ b/code/game/objects/structures/crates_lockers/crates/wooden.dm @@ -1,6 +1,8 @@ /obj/structure/closet/crate/wooden name = "wooden crate" desc = "Works just as well as a metal one." + icon = 'modular_darkpack/master_files/icons/obj/storage/crates32x32.dmi' // DARKPACK EDIT CHANGE + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 6) material_drop = /obj/item/stack/sheet/mineral/wood material_drop_amount = 6 icon_state = "wooden" @@ -11,6 +13,7 @@ close_sound_volume = 50 paint_jobs = null cutting_tool = /obj/item/crowbar + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 6) /obj/structure/closet/crate/wooden/toy name = "toy box" diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index cde4f4da174e..ec864ca5a86f 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -12,6 +12,7 @@ anchored = TRUE opacity = FALSE density = FALSE + custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 2, /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) /// used in making the icon state var/icon_type = "bathroom" var/open = TRUE @@ -43,7 +44,7 @@ /obj/structure/curtain/attackby(obj/item/W, mob/user) if (istype(W, /obj/item/toy/crayon)) - color = input(user,"","Choose Color",color) as color + color = tgui_color_picker(user, "", "Choose Color", color) else return ..() @@ -107,6 +108,7 @@ color = null alpha = 255 opaque_closed = TRUE + custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) /obj/structure/curtain/cloth/atom_deconstruct(disassembled = TRUE) new /obj/item/stack/sheet/cloth (loc, 4) diff --git a/code/game/objects/structures/detectiveboard.dm b/code/game/objects/structures/detectiveboard.dm index c2f143ced07c..91df15cc4436 100644 --- a/code/game/objects/structures/detectiveboard.dm +++ b/code/game/objects/structures/detectiveboard.dm @@ -34,9 +34,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/detectiveboard, 32) if(istype(item, /obj/item/paper) || istype(item, /obj/item/photo)) item.forceMove(src) cases[current_case].notices++ + find_and_mount_on_atom() register_context() - find_and_hang_on_wall() /// Attaching evidences: photo and papers diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index fb6347791dc3..3f3d06534a01 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -227,6 +227,7 @@ resistance_flags = FLAMMABLE anchored = TRUE density = FALSE + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 5) ///The airlock electronics inserted into the chassis, to be moved to the finished product. var/obj/item/electronics/airlock/electronics @@ -562,7 +563,7 @@ if(payments_acc) payments_acc.adjust_money(sale_price, "Display Case: [capitalize(showpiece.name)]") usr.put_in_hands(showpiece) - to_chat(usr, span_notice("You purchase [showpiece] for [sale_price] credits.")) + to_chat(usr, span_notice("You purchase [showpiece] for [sale_price] [MONEY_NAME].")) playsound(src, 'sound/effects/cashregister.ogg', 40, TRUE) flick("[initial(icon_state)]_vend", src) showpiece = null @@ -665,7 +666,7 @@ /obj/structure/displaycase/forsale/examine(mob/user) . = ..() if(showpiece && !open) - . += span_notice("[showpiece] is for sale for [sale_price] credits.") + . += span_notice("[showpiece] is for sale for [sale_price] [MONEY_NAME].") if(broken) . += span_notice("[src] is sparking and the hover field generator seems to be overloaded. Use a multitool to fix it.") diff --git a/code/game/objects/structures/divine.dm b/code/game/objects/structures/divine.dm index 6114a20158c6..bfe843d7f4d6 100644 --- a/code/game/objects/structures/divine.dm +++ b/code/game/objects/structures/divine.dm @@ -10,13 +10,13 @@ /obj/structure/sacrificealtar/click_alt(mob/living/user) if(!has_buckled_mobs()) return CLICK_ACTION_BLOCKING - var/mob/living/L = locate() in buckled_mobs - if(!L) + var/mob/living/buckled_mob = locate() in buckled_mobs + if(!buckled_mob) return CLICK_ACTION_BLOCKING - 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(DROP_ALL_REMAINS) - message_admins("[ADMIN_LOOKUPFLW(user)] has sacrificed [key_name_admin(L)] on the sacrificial altar at [AREACOORD(src)].") + to_chat(user, span_notice("Invoking the sacred ritual, you sacrifice [buckled_mob].")) + buckled_mob.investigate_log("has been sacrificially gibbed on an altar.", INVESTIGATE_DEATHS) + buckled_mob.gib(DROP_ALL_REMAINS) + message_admins("[ADMIN_LOOKUPFLW(user)] has sacrificed [key_name_admin(buckled_mob)] on the sacrificial altar at [AREACOORD(src)].") return CLICK_ACTION_SUCCESS /obj/structure/healingfountain diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index c8c9cdf058d9..90a97bd7d10e 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -6,6 +6,7 @@ anchored = FALSE density = TRUE max_integrity = 200 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 4) /// Airlock's current construction state var/state = AIRLOCK_ASSEMBLY_NEEDS_WIRES var/base_name = "Airlock" @@ -48,6 +49,7 @@ /obj/structure/door_assembly/Initialize(mapload) . = ..() + obj_flags |= UNIQUE_RENAME | RENAME_NO_DESC update_appearance() update_name() @@ -81,23 +83,15 @@ if(created_name) . += span_notice("There is a small paper placard on the assembly, written on it is '[created_name]'.") -/obj/structure/door_assembly/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers) - if(IS_WRITING_UTENSIL(W) && !user.combat_mode) - var/t = tgui_input_text(user, "Enter the name for the door", "Airlock Renaming", created_name, max_length = MAX_NAME_LEN) - if(!t) - return - if(!in_range(src, usr) && loc != usr) - return - created_name = t - - else if((W.tool_behaviour == TOOL_WELDER) && (mineral || glass || !anchored )) - if(!W.tool_start_check(user, amount=1)) +/obj/structure/door_assembly/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers) + if((tool.tool_behaviour == TOOL_WELDER) && (mineral || glass || !anchored )) + if(!tool.tool_start_check(user, amount=1)) return if(mineral) var/obj/item/stack/sheet/mineral/mineral_path = text2path("/obj/item/stack/sheet/mineral/[mineral]") user.visible_message(span_notice("[user] welds the [mineral] plating off the airlock assembly."), span_notice("You start to weld the [mineral] plating off the airlock assembly...")) - if(W.use_tool(src, user, 40, volume=50)) + if(tool.use_tool(src, user, 40, volume=50)) to_chat(user, span_notice("You weld the [mineral] plating off.")) new mineral_path(loc, 2) var/obj/structure/door_assembly/PA = new previous_assembly(loc) @@ -105,7 +99,7 @@ else if(glass) user.visible_message(span_notice("[user] welds the glass panel out of the airlock assembly."), span_notice("You start to weld the glass panel out of the airlock assembly...")) - if(W.use_tool(src, user, 40, volume=50)) + if(tool.use_tool(src, user, 40, volume=50)) to_chat(user, span_notice("You weld the glass panel out.")) if(heat_proof_finished) new /obj/item/stack/sheet/rglass(get_turf(src)) @@ -116,11 +110,11 @@ else if(!anchored) user.visible_message(span_warning("[user] disassembles the airlock assembly."), \ span_notice("You start to disassemble the airlock assembly...")) - if(W.use_tool(src, user, 40, volume=50)) + if(tool.use_tool(src, user, 40, volume=50)) to_chat(user, span_notice("You disassemble the airlock assembly.")) deconstruct(TRUE) - else if(W.tool_behaviour == TOOL_WRENCH) + else if(tool.tool_behaviour == TOOL_WRENCH) if(!anchored ) var/door_check = 1 for(var/obj/machinery/door/D in loc) @@ -133,7 +127,7 @@ span_notice("You start to secure the airlock assembly to the floor..."), \ span_hear("You hear wrenching.")) - if(W.use_tool(src, user, 40, volume=100)) + if(tool.use_tool(src, user, 40, volume=100)) if(anchored) return to_chat(user, span_notice("You secure the airlock assembly.")) @@ -146,31 +140,31 @@ user.visible_message(span_notice("[user] unsecures the airlock assembly from the floor."), \ span_notice("You start to unsecure the airlock assembly from the floor..."), \ span_hear("You hear wrenching.")) - if(W.use_tool(src, user, 40, volume=100)) + if(tool.use_tool(src, user, 40, volume=100)) if(!anchored) return to_chat(user, span_notice("You unsecure the airlock assembly.")) name = "airlock assembly" set_anchored(FALSE) - else if(istype(W, /obj/item/stack/cable_coil) && state == AIRLOCK_ASSEMBLY_NEEDS_WIRES && anchored ) - if(!W.tool_start_check(user, amount=1)) + else if(istype(tool, /obj/item/stack/cable_coil) && state == AIRLOCK_ASSEMBLY_NEEDS_WIRES && anchored ) + if(!tool.tool_start_check(user, amount=1)) return user.visible_message(span_notice("[user] wires the airlock assembly."), \ span_notice("You start to wire the airlock assembly...")) - if(W.use_tool(src, user, 40, amount=1)) + if(tool.use_tool(src, user, 40, amount=1)) if(state != AIRLOCK_ASSEMBLY_NEEDS_WIRES) return state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS to_chat(user, span_notice("You wire the airlock assembly.")) name = "wired airlock assembly" - else if((W.tool_behaviour == TOOL_WIRECUTTER) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) + else if((tool.tool_behaviour == TOOL_WIRECUTTER) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) user.visible_message(span_notice("[user] cuts the wires from the airlock assembly."), \ span_notice("You start to cut the wires from the airlock assembly...")) - if(W.use_tool(src, user, 40, volume=100)) + if(tool.use_tool(src, user, 40, volume=100)) if(state != AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS) return to_chat(user, span_notice("You cut the wires from the airlock assembly.")) @@ -178,27 +172,27 @@ state = AIRLOCK_ASSEMBLY_NEEDS_WIRES name = "secured airlock assembly" - else if(istype(W, /obj/item/electronics/airlock) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) - W.play_tool_sound(src, 100) + else if(istype(tool, /obj/item/electronics/airlock) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) + tool.play_tool_sound(src, 100) user.visible_message(span_notice("[user] installs the electronics into the airlock assembly."), \ span_notice("You start to install electronics into the airlock assembly...")) if(do_after(user, 4 SECONDS, target = src)) if( state != AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) return - if(!user.transferItemToLoc(W, src)) + if(!user.transferItemToLoc(tool, src)) return to_chat(user, span_notice("You install the airlock electronics.")) state = AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER name = "near finished airlock assembly" - electronics = W + electronics = tool - else if((W.tool_behaviour == TOOL_CROWBAR) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) + else if((tool.tool_behaviour == TOOL_CROWBAR) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) user.visible_message(span_notice("[user] removes the electronics from the airlock assembly."), \ span_notice("You start to remove electronics from the airlock assembly...")) - if(W.use_tool(src, user, 40, volume=100)) + if(tool.use_tool(src, user, 40, volume=100)) if(state != AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER) return to_chat(user, span_notice("You remove the airlock electronics.")) @@ -212,69 +206,69 @@ electronics = null ae.forceMove(src.loc) - else if(istype(W, /obj/item/stack/sheet) && (!glass || !mineral)) - var/obj/item/stack/sheet/G = W - if(G) - if(G.get_amount() >= 1) - if(!noglass) - if(!glass) - if(istype(G, /obj/item/stack/sheet/rglass) || istype(G, /obj/item/stack/sheet/glass)) - playsound(src, 'sound/items/tools/crowbar.ogg', 100, TRUE) - user.visible_message(span_notice("[user] adds [G.name] to the airlock assembly."), \ - span_notice("You start to install [G.name] into the airlock assembly...")) - if(do_after(user, 4 SECONDS, target = src)) - if(G.get_amount() < 1 || glass) - return - if(G.type == /obj/item/stack/sheet/rglass) - to_chat(user, span_notice("You install [G.name] windows into the airlock assembly.")) - heat_proof_finished = 1 //reinforced glass makes the airlock heat-proof - name = "near finished heat-proofed window airlock assembly" - else - to_chat(user, span_notice("You install regular glass windows into the airlock assembly.")) - name = "near finished window airlock assembly" - G.use(1) - glass = TRUE - if(!nomineral && !mineral) - if(istype(G, /obj/item/stack/sheet/mineral) && G.sheettype) - var/M = G.sheettype - var/mineralassembly = text2path("/obj/structure/door_assembly/door_assembly_[M]") - if(!ispath(mineralassembly)) - to_chat(user, span_warning("You cannot add [G] to [src]!")) - return - if(G.get_amount() >= 2) - playsound(src, 'sound/items/tools/crowbar.ogg', 100, TRUE) - user.visible_message(span_notice("[user] adds [G.name] to the airlock assembly."), \ - span_notice("You start to install [G.name] into the airlock assembly...")) - if(do_after(user, 4 SECONDS, target = src)) - if(G.get_amount() < 2 || mineral) - return - to_chat(user, span_notice("You install [M] plating into the airlock assembly.")) - G.use(2) - var/obj/structure/door_assembly/MA = new mineralassembly(loc) - - if(MA.noglass && glass) //in case the new door doesn't support glass. prevents the new one from reverting to a normal airlock after being constructed. - var/obj/item/stack/sheet/dropped_glass - if(heat_proof_finished) - dropped_glass = new /obj/item/stack/sheet/rglass(drop_location()) - heat_proof_finished = FALSE - else - dropped_glass = new /obj/item/stack/sheet/glass(drop_location()) - glass = FALSE - to_chat(user, span_notice("As you finish, a [dropped_glass.singular_name] falls out of [MA]'s frame.")) - - transfer_assembly_vars(src, MA, TRUE) - else - to_chat(user, span_warning("You need at least two sheets add a mineral cover!")) - else - to_chat(user, span_warning("You cannot add [G] to [src]!")) + else if(istype(tool, /obj/item/stack/sheet)) + var/obj/item/stack/sheet/sheet = tool + if(!glass && (istype(sheet, /obj/item/stack/sheet/rglass) || istype(sheet, /obj/item/stack/sheet/glass))) + if(noglass) + to_chat(user, span_warning("You cannot add [sheet] to [src]!")) + return + playsound(src, 'sound/items/tools/crowbar.ogg', 100, TRUE) + user.visible_message(span_notice("[user] adds [sheet.name] to the airlock assembly."), \ + span_notice("You start to install [sheet.name] into the airlock assembly...")) + if(do_after(user, 4 SECONDS, target = src)) + if(sheet.get_amount() < 1 || glass) + return + if(sheet.type == /obj/item/stack/sheet/rglass) + to_chat(user, span_notice("You install [sheet.name] windows into the airlock assembly.")) + heat_proof_finished = 1 //reinforced glass makes the airlock heat-proof + name = "near finished heat-proofed window airlock assembly" + else + to_chat(user, span_notice("You install regular glass windows into the airlock assembly.")) + name = "near finished window airlock assembly" + sheet.use(1) + glass = TRUE + return + + if(istype(sheet, /obj/item/stack/sheet/mineral) && sheet.construction_path_type) + if(nomineral || mineral) + to_chat(user, span_warning("You cannot add [sheet] to [src]!")) + return + + var/M = sheet.construction_path_type + var/mineralassembly = text2path("/obj/structure/door_assembly/door_assembly_[M]") + if(!ispath(mineralassembly)) + to_chat(user, span_warning("You cannot add [sheet] to [src]!")) + return + if(sheet.get_amount() < 2) + to_chat(user, span_warning("You need at least two sheets add a mineral cover!")) + return + + playsound(src, 'sound/items/tools/crowbar.ogg', 100, TRUE) + user.visible_message(span_notice("[user] adds [sheet.name] to the airlock assembly."), \ + span_notice("You start to install [sheet.name] into the airlock assembly...")) + if(!do_after(user, 4 SECONDS, target = src) || sheet.get_amount() < 2 || mineral) + return + to_chat(user, span_notice("You install [M] plating into the airlock assembly.")) + sheet.use(2) + var/obj/structure/door_assembly/MA = new mineralassembly(loc) + + if(MA.noglass && glass) //in case the new door doesn't support glass. prevents the new one from reverting to a normal airlock after being constructed. + var/obj/item/stack/sheet/dropped_glass + if(heat_proof_finished) + dropped_glass = new /obj/item/stack/sheet/rglass(drop_location()) + heat_proof_finished = FALSE else - to_chat(user, span_warning("You cannot add [G] to [src]!")) + dropped_glass = new /obj/item/stack/sheet/glass(drop_location()) + glass = FALSE + to_chat(user, span_notice("As you finish, a [dropped_glass.singular_name] falls out of [MA]'s frame.")) + + transfer_assembly_vars(src, MA, TRUE) - else if((W.tool_behaviour == TOOL_SCREWDRIVER) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) + else if((tool.tool_behaviour == TOOL_SCREWDRIVER) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) user.visible_message(span_notice("[user] finishes the airlock."), \ span_notice("You start finishing the airlock...")) - if(W.use_tool(src, user, 40, volume=100)) + if(tool.use_tool(src, user, 40, volume=100)) if(loc && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER) to_chat(user, span_notice("You finish the airlock.")) finish_door() @@ -315,7 +309,7 @@ door.closeOtherId = electronics.passed_cycle_id door.update_other_id() if(door.unres_sides) - door.unres_sensor = TRUE + door.unres_latch = TRUE door.previous_airlock = previous_assembly electronics.forceMove(door) door.autoclose = TRUE @@ -384,7 +378,14 @@ return FALSE /obj/structure/door_assembly/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - if(rcd_data["[RCD_DESIGN_MODE]"] == RCD_DECONSTRUCT) + if(rcd_data[RCD_DESIGN_MODE] == RCD_DECONSTRUCT) qdel(src) return TRUE return FALSE + +/obj/structure/door_assembly/nameformat(input, mob/living/user) + created_name = input + return input + +/obj/structure/door_assembly/rename_reset() + created_name = null diff --git a/code/game/objects/structures/door_assembly_types.dm b/code/game/objects/structures/door_assembly_types.dm index d62fb1bec767..203039779d6e 100644 --- a/code/game/objects/structures/door_assembly_types.dm +++ b/code/game/objects/structures/door_assembly_types.dm @@ -122,6 +122,7 @@ noglass = TRUE material_type = /obj/item/stack/sheet/plasteel material_amt = 4 + custom_materials = list(/datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 4) /obj/structure/door_assembly/door_assembly_vault name = "vault door assembly" @@ -132,6 +133,7 @@ noglass = TRUE material_type = /obj/item/stack/sheet/plasteel material_amt = 6 + custom_materials = list(/datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 6) /obj/structure/door_assembly/door_assembly_shuttle name = "shuttle airlock assembly" @@ -255,6 +257,7 @@ airlock_type = /obj/machinery/door/airlock/bronze noglass = TRUE material_type = /obj/item/stack/sheet/bronze + custom_materials = list(/datum/material/bronze = SHEET_MATERIAL_AMOUNT * 4) /obj/structure/door_assembly/door_assembly_bronze/seethru airlock_type = /obj/machinery/door/airlock/bronze/seethru @@ -282,6 +285,7 @@ noglass = TRUE mineral = "titanium" material_type = /obj/item/stack/sheet/mineral/titanium + custom_materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 8) /obj/structure/door_assembly/door_assembly_material/atom_deconstruct(disassembled = TRUE) var/turf/target_turf = get_turf(src) diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index 8bfab74cf274..a1a40e4075d4 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -6,6 +6,7 @@ resistance_flags = FLAMMABLE density = TRUE anchored = TRUE + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 10) /obj/structure/dresser/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(I.tool_behaviour == TOOL_WRENCH) @@ -44,7 +45,7 @@ if(new_undies) dressing_human.underwear = new_undies if("Underwear Color") - var/new_underwear_color = input(dressing_human, "Choose your underwear color", "Underwear Color", dressing_human.underwear_color) as color|null + var/new_underwear_color = tgui_color_picker(dressing_human, "Choose your underwear color", "Underwear Color", dressing_human.underwear_color) if(new_underwear_color) dressing_human.underwear_color = sanitize_hexcolor(new_underwear_color) if("Undershirt") diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 269d049316dd..e4f258b13b7c 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -2,7 +2,7 @@ name = "extinguisher cabinet" desc = "A small wall mounted cabinet designed to hold a fire extinguisher." icon = 'modular_darkpack/master_files/icons/obj/wallmounts32x48.dmi' // DARKPACK EDIT CHANGE - icon_state = "extinguisher" + MAP_SWITCH(icon_state = "extinguisher", icon_state = "extinguisher_mapswitch") // DARKPACK EDIT CHANGE anchored = TRUE density = FALSE max_integrity = 200 @@ -11,16 +11,22 @@ var/opened = FALSE MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) - -/obj/structure/extinguisher_cabinet/Initialize(mapload, ndir, building) +// DARKPACK EDIT ADD START +/obj/structure/extinguisher_cabinet/directional/east + pixel_w = -29 +/obj/structure/extinguisher_cabinet/directional/west + pixel_w = 29 +// DARKPACK EDIT ADD END + +/obj/structure/extinguisher_cabinet/Initialize(mapload) . = ..() - if(building) + if(!mapload) opened = TRUE else stored_extinguisher = new /obj/item/extinguisher(src) + find_and_mount_on_atom() 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) . = ..() diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index d140a2cb6db2..44aa56d6088f 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -8,6 +8,7 @@ armor_type = /datum/armor/structure_fireaxecabinet max_integrity = 150 integrity_failure = 0.33 + custom_materials = /obj/item/wallframe/fireaxecabinet::custom_materials /// Do we need to be unlocked to be opened. var/locked = TRUE /// Are we opened, can someone take the held item out. @@ -20,6 +21,8 @@ var/item_overlay = "axe" /// Whether we should populate our own contents on Initialize() var/populate_contents = TRUE + /// The tool behavior necessary to unlock the cabinet + var/unlocking_tool_behavior = TOOL_MULTITOOL MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) @@ -36,7 +39,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) if(populate_contents) held_item = new item_path(src) update_appearance() - find_and_hang_on_wall() + if(mapload) + find_and_mount_on_atom() /obj/structure/fireaxecabinet/Destroy() if(held_item) @@ -44,7 +48,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) return ..() /obj/structure/fireaxecabinet/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) - if(iscyborg(user) || attacking_item.tool_behaviour == TOOL_MULTITOOL) + if(iscyborg(user) || attacking_item.tool_behaviour == unlocking_tool_behavior) toggle_lock(user) else if(attacking_item.tool_behaviour == TOOL_WELDER && !user.combat_mode && !broken) if(atom_integrity < max_integrity) @@ -218,6 +222,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet/empty, 32) icon_state = "fireaxe" result_path = /obj/structure/fireaxecabinet/empty pixel_shift = 32 + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 5.1, /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 5, /datum/material/iron = SMALL_MATERIAL_AMOUNT) /obj/structure/fireaxecabinet/mechremoval name = "mech removal tool cabinet" @@ -243,3 +248,30 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet/mechremoval/empty, 32) desc = "Home to a very special crowbar. Apply to wall to use." icon_state = "mechremoval" result_path = /obj/structure/fireaxecabinet/mechremoval/empty + +/obj/structure/fireaxecabinet/jawsofrecovery + name = "jaws of recovery tool cabinet" + desc = "There is a small label that reads \"For Emergency use only\" along with details for safe use of the jaws of recovery. \ + The lock seems to require...a surgical drill bit to unlock? You have no idea who thought this was a good idea." + icon_state = "jaws_of_recovery" + item_path = /obj/item/crowbar/power/paramedic + item_overlay = "jaws" + unlocking_tool_behavior = TOOL_DRILL + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet/jawsofrecovery, 32) + +/obj/structure/fireaxecabinet/jawsofrecovery/atom_deconstruct(disassembled = TRUE) + if(held_item && loc) + held_item.forceMove(loc) + new /obj/item/wallframe/fireaxecabinet/jawsofrecovery(loc) + +/obj/structure/fireaxecabinet/jawsofrecovery/empty + populate_contents = FALSE + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet/jawsofrecovery/empty, 32) + +/obj/item/wallframe/fireaxecabinet/jawsofrecovery + name = "jaws of recovery tool cabinet" + desc = "Home to the paramedic's jaws of recovery. Apply to wall to use." + icon_state = "jaws_of_recovery" + result_path = /obj/structure/fireaxecabinet/jawsofrecovery/empty diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 4565cd1b09a4..c951d2a7b364 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -11,9 +11,6 @@ /// If set, the flora will have this as its description after being harvested. When the flora becomes harvestable again, it regerts to its initial(desc) var/harvested_desc - /// A lazylist of products that could be created when harvesting this flora, syntax is (type = weight) - /// Because of how this works, it can spawn in anomalies if you want it to. Or wall girders - var/product_types /// If the user is able to harvest this with their hands var/harvest_with_hands = FALSE /// The "verb" to use when the user harvests the flora @@ -27,9 +24,9 @@ /// If false, the flora won't be able to be harvested at all. If it's true, go through checks normally to determine if the flora is able to be harvested var/harvestable = TRUE - /// The low end of how many product_type items you get + /// The low end of how many harvested items you get var/harvest_amount_low = 1 - /// The high end of how many product_type items you get + /// The high end of how many harvested items you get var/harvest_amount_high = 3 //Messages to show to the user depending on how many items they get when harvesting the flora @@ -133,24 +130,34 @@ if(use_default_sound) return ..() -/* +/** + * A helper proc for getting the products that could be created when harvesting this flora, list syntax is (type = weight) + * Because of how this works, it can spawn in anomalies if you want it to. Or wall girders + * Returns: An assoc list of obj typepaths and their weights e.g. list(/obj/item/food/grass = 1), or null + */ +/obj/structure/flora/proc/get_potential_products() + return null + +/** * A helper proc for getting a random amount of products, associated with the flora's product list. - * Returns: A list where each value is (product_type = amount_of_products) + * Returns: A list where each value is (harvested_item_typepath = amount_of_products) */ /obj/structure/flora/proc/get_products_list() - if(!LAZYLEN(product_types)) - return list() + var/list/potential_product_list = get_potential_products() + if(isnull(potential_product_list)) + return + var/list/product_list = list() var/harvest_amount = rand(harvest_amount_low, harvest_amount_high) for(var/iteration in 1 to harvest_amount) - var/chosen_product = pick_weight(product_types) + var/chosen_product = pick_weight(potential_product_list) if(!product_list[chosen_product]) product_list[chosen_product] = 0 product_list[chosen_product]++ return product_list -/* +/** * A helper proc that determines if a user can currently harvest this flora with whatever tool they're trying to use. * Returns: TRUE if they can harvest, FALSE if not. Null if it's not harvestable at all. */ @@ -177,7 +184,7 @@ return FALSE -/* +/** * This gets called after a mob tries to harvest this flora with the correct tool. * It displays a flavor message to whoever's harvesting this flora, then creates new products depending on the flora's product list. * Also renames the flora if harvested_name or harvested_desc is set in the variables @@ -185,11 +192,11 @@ */ /obj/structure/flora/proc/harvest(user, product_amount_multiplier = 1) . = FALSE - if(harvested && !LAZYLEN(product_types)) + if(harvested) return FALSE var/list/products_to_create = get_products_list() - if(!products_to_create.len) + if(!LAZYLEN(products_to_create)) return FALSE var/products_created = 0 @@ -250,7 +257,7 @@ desc = initial(desc) harvested = FALSE -/* +/** * Called after the user uproots the flora with a shovel. */ /obj/structure/flora/proc/uproot(mob/living/user) @@ -260,7 +267,7 @@ previous_rotation = pick(-90, 90) transform = M.Turn(previous_rotation) -/* +/** * Called after the user plants the flora back into the ground after uprooted */ /obj/structure/flora/proc/replant(mob/living/user) @@ -289,7 +296,6 @@ layer = FLY_LAYER plane = ABOVE_GAME_PLANE drag_slowdown = 1.5 - product_types = list(/obj/item/grown/log/tree = 1) harvest_amount_low = 6 harvest_amount_high = 10 harvest_message_low = "You manage to gather a few logs from the tree." @@ -304,6 +310,9 @@ . = ..() AddComponent(/datum/component/seethrough, get_seethrough_map()) +/obj/structure/flora/tree/get_potential_products() + return list(/obj/item/grown/log/tree = 1) + ///Return a see_through_map, examples in seethrough.dm /obj/structure/flora/tree/proc/get_seethrough_map() return SEE_THROUGH_MAP_DEFAULT @@ -536,7 +545,6 @@ desc = "A patch of overgrown grass." 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 harvest_amount_low = 0 harvest_amount_high = 2 @@ -546,6 +554,9 @@ can_uproot = TRUE flora_flags = FLORA_HERBAL +/obj/structure/flora/grass/get_potential_products() + return list(/obj/item/food/grown/grass = 10, /obj/item/seeds/grass = 1) + /obj/structure/flora/grass/brown icon_state = "snowgrass1bb" @@ -845,6 +856,12 @@ /obj/structure/flora/bush/flowers_yw icon_state = "ywflowers_1" +// DARKPACK EDIT ADD START - Flowers Sway in the Wind +/obj/structure/flora/bush/flowers_yw/Initialize(mapload) + . = ..() + AddElement(/datum/element/swaying, sway_angle = 4, sway_time = 2 SECONDS) +// DARKPACK EDIT ADD END + /obj/structure/flora/bush/flowers_yw/style_2 icon_state = "ywflowers_2" @@ -859,6 +876,12 @@ /obj/structure/flora/bush/flowers_br icon_state = "brflowers_1" +// DARKPACK EDIT ADD START - Flowers Sway in the Wind +/obj/structure/flora/bush/flowers_br/Initialize(mapload) + . = ..() + AddElement(/datum/element/swaying, sway_angle = 4, sway_time = 2 SECONDS) +// DARKPACK EDIT ADD END + /obj/structure/flora/bush/flowers_br/style_2 icon_state = "brflowers_2" @@ -873,6 +896,12 @@ /obj/structure/flora/bush/flowers_pp icon_state = "ppflowers_1" +// DARKPACK EDIT ADD START - Flowers Sway in the Wind +/obj/structure/flora/bush/flowers_pp/Initialize(mapload) + . = ..() + AddElement(/datum/element/swaying, sway_angle = 4, sway_time = 2 SECONDS) +// DARKPACK EDIT ADD END + /obj/structure/flora/bush/flowers_pp/style_2 icon_state = "ppflowers_2" @@ -1006,7 +1035,6 @@ icon = 'icons/obj/fluff/flora/rocks.dmi' density = TRUE resistance_flags = FIRE_PROOF - product_types = list(/obj/item/stack/ore/glass/basalt = 1) harvest_amount_low = 10 harvest_amount_high = 20 harvest_message_med = "You finish mining the rock." @@ -1015,6 +1043,9 @@ can_uproot = FALSE delete_on_harvest = TRUE +/obj/structure/flora/rock/get_potential_products() + return list(/obj/item/stack/ore/glass/basalt = 1) + /obj/structure/flora/rock/style_2 icon_state = "basalt2" diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index 1ce124dc3c36..331643a77f9a 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -283,7 +283,7 @@ /obj/structure/fluff/tram_rail name = "tram rail" desc = "Great for trams, not so great for skating." - icon = 'icons/obj/tram/tram_rails.dmi' + icon = 'modular_darkpack/master_files/icons/obj/tram/tram_rails.dmi' // DARKPACK EDIT CHANGE - Doesnt have directionals by default 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 d17cb7b410e6..f51bfafa2e5a 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -11,6 +11,7 @@ smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_GIRDER canSmoothWith = SMOOTH_GROUP_GIRDER + SMOOTH_GROUP_WALLS + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) var/state = GIRDER_NORMAL var/girderpasschance = 20 // percentage chance that a projectile passes through the girder. var/can_displace = TRUE //If the girder can be moved around by wrenching it @@ -44,12 +45,7 @@ . += span_notice("[src] is designed for tram usage. Deconstructed with a screwdriver!") /obj/structure/girder/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - var/platingmodifier = 1 - if(HAS_TRAIT(user, TRAIT_QUICK_BUILD)) - platingmodifier = 0.7 - if(next_beep <= world.time) - next_beep = world.time + 10 - playsound(src, 'sound/machines/clockcult/integration_cog_install.ogg', 50, TRUE) + add_fingerprint(user) if(istype(W, /obj/item/gun/energy/plasmacutter)) @@ -64,9 +60,14 @@ if(!QDELETED(M)) M.add_fingerprint(user) qdel(src) + return + + if(isstack(W)) + var/obj/item/stack/stack = W + if(!stack.usable_for_construction) + balloon_alert(user, "can't make walls with it!") return - else if(isstack(W)) if(iswallturf(loc) || (locate(/obj/structure/falsewall) in src.loc.contents)) balloon_alert(user, "wall already present!") return @@ -78,245 +79,255 @@ balloon_alert(user, "need tram floors!") return - if(istype(W, /obj/item/stack/rods)) - var/obj/item/stack/rods/rod = W - var/amount = construction_cost[rod.type] - if(state == GIRDER_DISPLACED) - if(rod.get_amount() < amount) - balloon_alert(user, "need [amount] rods!") - return - balloon_alert(user, "concealing entrance...") - if(do_after(user, 2 SECONDS, target = src)) - if(rod.get_amount() < amount) - return - rod.use(amount) - var/obj/structure/falsewall/iron/FW = new (loc) - transfer_fingerprints_to(FW) - qdel(src) - return - else if(state == GIRDER_REINF) - balloon_alert(user, "need plasteel sheet!") + make_wall(stack, user) + return + + if(istype(W, /obj/item/pipe)) + var/obj/item/pipe/P = W + if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds. + if(!user.transfer_item_to_turf(P, drop_location())) return - else + balloon_alert(user, "inserted pipe") + return + + return ..() + +/obj/structure/girder/proc/make_wall(obj/item/stack/stack, mob/user) + var/speed_modifier = 1 + if(HAS_TRAIT(user, TRAIT_QUICK_BUILD)) + speed_modifier = 0.7 + if(next_beep <= world.time) + next_beep = world.time + 10 + playsound(src, 'sound/machines/clockcult/integration_cog_install.ogg', 50, TRUE) + + if(istype(stack, /obj/item/stack/rods)) + var/obj/item/stack/rods/rod = stack + var/amount = construction_cost[rod.type] + if(state == GIRDER_DISPLACED) + if(rod.get_amount() < amount) + balloon_alert(user, "need [amount] rods!") + return + balloon_alert(user, "concealing entrance...") + if(do_after(user, 2 SECONDS, target = src)) if(rod.get_amount() < amount) - balloon_alert(user, "need [amount] rods!") return - balloon_alert(user, "adding rods...") - if(do_after(user, 4 SECONDS, target = src)) - if(rod.get_amount() < amount) - return - rod.use(amount) - var/turf/T = get_turf(src) - T.place_on_top(/turf/closed/wall/mineral/iron) - transfer_fingerprints_to(T) - qdel(src) - return + rod.use(amount) + var/obj/structure/falsewall/iron/FW = new (loc) + transfer_fingerprints_to(FW) + qdel(src) + return - if(!istype(W, /obj/item/stack/sheet)) + if(state == GIRDER_REINF) + balloon_alert(user, "need plasteel sheet!") return - var/obj/item/stack/sheet/sheets = W - if(istype(sheets, /obj/item/stack/sheet/iron)) - var/amount = construction_cost[/obj/item/stack/sheet/iron] - if(state == GIRDER_DISPLACED) - if(sheets.get_amount() < amount) - balloon_alert(user, "need [amount] sheets!") - return - balloon_alert(user, "concealing entrance...") - if(do_after(user, 20*platingmodifier, target = src)) - if(sheets.get_amount() < amount) - return - sheets.use(amount) - var/obj/structure/falsewall/F = new (loc) - transfer_fingerprints_to(F) - qdel(src) - return - else if(state == GIRDER_REINF) - balloon_alert(user, "need plasteel sheet!") + if(rod.get_amount() < amount) + balloon_alert(user, "need [amount] rods!") + return + balloon_alert(user, "adding rods...") + if(do_after(user, 4 SECONDS, target = src)) + if(rod.get_amount() < amount) return - else if(state == GIRDER_TRAM) - if(sheets.get_amount() < amount) - balloon_alert(user, "need [amount] sheets!") - return - balloon_alert(user, "adding plating...") - if (do_after(user, 4 SECONDS, target = src)) - if(sheets.get_amount() < amount) - return - sheets.use(amount) - var/obj/structure/tram/alt/iron/tram_wall = new(loc) - transfer_fingerprints_to(tram_wall) - qdel(src) + rod.use(amount) + var/turf/T = get_turf(src) + T.place_on_top(/turf/closed/wall/mineral/iron) + transfer_fingerprints_to(T) + qdel(src) + return + + else if(istype(stack, /obj/item/stack/sheet/iron)) + var/amount = construction_cost[/obj/item/stack/sheet/iron] + if(state == GIRDER_DISPLACED) + if(stack.get_amount() < amount) + balloon_alert(user, "need [amount] sheets!") return - else - if(sheets.get_amount() < amount) - balloon_alert(user, "need [amount] sheets!") + balloon_alert(user, "concealing entrance...") + if(do_after(user, 20 * speed_modifier, target = src)) + if(stack.get_amount() < amount) return - balloon_alert(user, "adding plating...") - if (do_after(user, 40*platingmodifier, target = src)) - if(sheets.get_amount() < amount) - return - sheets.use(amount) - var/turf/T = get_turf(src) - T.place_on_top(/turf/closed/wall) - transfer_fingerprints_to(T) - qdel(src) + stack.use(amount) + var/obj/structure/falsewall/F = new (loc) + transfer_fingerprints_to(F) + qdel(src) return - - if(istype(sheets, /obj/item/stack/sheet/titaniumglass) && state == GIRDER_TRAM) - var/amount = construction_cost[/obj/item/stack/sheet/titaniumglass] - if(sheets.get_amount() < amount) + else if(state == GIRDER_REINF) + balloon_alert(user, "need plasteel sheet!") + return + else if(state == GIRDER_TRAM) + if(stack.get_amount() < amount) balloon_alert(user, "need [amount] sheets!") return - balloon_alert(user, "adding panel...") - if (do_after(user, 2 SECONDS, target = src)) - if(sheets.get_amount() < amount) + balloon_alert(user, "adding plating...") + if (do_after(user, 4 SECONDS, target = src)) + if(stack.get_amount() < amount) return - sheets.use(amount) - var/obj/structure/tram/tram_wall = new(loc) + stack.use(amount) + var/obj/structure/tram/alt/iron/tram_wall = new(loc) transfer_fingerprints_to(tram_wall) qdel(src) return - - if(istype(sheets, /obj/item/stack/sheet/plasteel)) - var/amount = construction_cost[/obj/item/stack/sheet/plasteel] - if(state == GIRDER_DISPLACED) - if(sheets.get_amount() < amount) - balloon_alert(user, "need [amount] sheets!") - return - balloon_alert(user, "concealing entrance...") - if(do_after(user, 2 SECONDS, target = src)) - if(sheets.get_amount() < amount) - return - sheets.use(amount) - var/obj/structure/falsewall/reinforced/FW = new (loc) - transfer_fingerprints_to(FW) - qdel(src) - return - else if(state == GIRDER_REINF) - amount = 1 // hur dur let's make plasteel have different construction amounts 4norasin - if(sheets.get_amount() < amount) - return - balloon_alert(user, "adding plating...") - if(do_after(user, 50*platingmodifier, target = src)) - if(sheets.get_amount() < amount) - return - sheets.use(amount) - var/turf/T = get_turf(src) - T.place_on_top(/turf/closed/wall/r_wall) - transfer_fingerprints_to(T) - qdel(src) + else + if(stack.get_amount() < amount) + balloon_alert(user, "need [amount] sheets!") return - else - amount = 1 // hur dur x2 - if(sheets.get_amount() < amount) + balloon_alert(user, "adding plating...") + if (do_after(user, 40 * speed_modifier, target = src)) + if(stack.get_amount() < amount) return - balloon_alert(user, "reinforcing frame...") - if(do_after(user, 60*platingmodifier, target = src)) - if(sheets.get_amount() < amount) - return - sheets.use(amount) - var/obj/structure/girder/reinforced/R = new (loc) - transfer_fingerprints_to(R) - qdel(src) + stack.use(amount) + var/turf/T = get_turf(src) + T.place_on_top(/turf/closed/wall) + transfer_fingerprints_to(T) + qdel(src) + return + + else if(istype(stack, /obj/item/stack/sheet/titaniumglass) && state == GIRDER_TRAM) + var/amount = construction_cost[/obj/item/stack/sheet/titaniumglass] + if(stack.get_amount() < amount) + balloon_alert(user, "need [amount] sheets!") + return + balloon_alert(user, "adding panel...") + if (do_after(user, 2 SECONDS, target = src)) + if(stack.get_amount() < amount) return + stack.use(amount) + var/obj/structure/tram/tram_wall = new(loc) + transfer_fingerprints_to(tram_wall) + qdel(src) + return - if(istype(sheets, /obj/item/stack/sheet/mineral/plastitanium)) - if(state == GIRDER_REINF) - if(sheets.get_amount() < 1) + else if(istype(stack, /obj/item/stack/sheet/plasteel)) + var/amount = construction_cost[/obj/item/stack/sheet/plasteel] + if(state == GIRDER_DISPLACED) + if(stack.get_amount() < amount) + balloon_alert(user, "need [amount] sheets!") + return + balloon_alert(user, "concealing entrance...") + if(do_after(user, 2 SECONDS, target = src)) + if(stack.get_amount() < amount) return - balloon_alert(user, "adding plating...") - if(do_after(user, 50*platingmodifier, target = src)) - if(sheets.get_amount() < 1) - return - sheets.use(1) - var/turf/T = get_turf(src) - T.place_on_top(/turf/closed/wall/r_wall/plastitanium) - transfer_fingerprints_to(T) - qdel(src) + stack.use(amount) + var/obj/structure/falsewall/reinforced/FW = new (loc) + transfer_fingerprints_to(FW) + qdel(src) return - // No return here because generic material construction handles making normal plastitanium walls - - if(!sheets.has_unique_girder && sheets.material_type) - if(istype(src, /obj/structure/girder/reinforced)) - balloon_alert(user, "need plasteel or plastitanium!") + else if(state == GIRDER_REINF) + amount = 1 // hur dur let's make plasteel have different construction amounts 4norasin + if(stack.get_amount() < amount) return - - var/M = sheets.sheettype - var/amount = construction_cost["exotic_material"] - if(state == GIRDER_TRAM) - if(sheets.get_amount() < amount) - balloon_alert(user, "need [amount] sheets!") + balloon_alert(user, "adding plating...") + if(do_after(user, 50 * speed_modifier, target = src)) + if(stack.get_amount() < amount) return - var/tram_wall_type = text2path("/obj/structure/tram/alt/[M]") - if(!tram_wall_type) - balloon_alert(user, "need titanium glass or mineral!") + stack.use(amount) + var/turf/T = get_turf(src) + T.place_on_top(/turf/closed/wall/r_wall) + transfer_fingerprints_to(T) + qdel(src) + return + else + amount = 1 // hur dur x2 + if(stack.get_amount() < amount) + return + balloon_alert(user, "reinforcing frame...") + if(do_after(user, 60 * speed_modifier, target = src)) + if(stack.get_amount() < amount) return - balloon_alert(user, "adding plating...") - if (do_after(user, 4 SECONDS, target = src)) - if(sheets.get_amount() < amount) - return - var/obj/structure/tram/tram_wall - tram_wall = new tram_wall_type(loc) - sheets.use(amount) - transfer_fingerprints_to(tram_wall) - qdel(src) + stack.use(amount) + var/obj/structure/girder/reinforced/R = new (loc) + transfer_fingerprints_to(R) + qdel(src) + return + + else if(istype(stack, /obj/item/stack/sheet/mineral/plastitanium)) + if(state == GIRDER_REINF) + if(stack.get_amount() < 1) return - if(state == GIRDER_DISPLACED) - var/falsewall_type = text2path("/obj/structure/falsewall/[M]") - if(sheets.get_amount() < amount) - balloon_alert(user, "need [amount] sheets!") + balloon_alert(user, "adding plating...") + if(do_after(user, 50 * speed_modifier, target = src)) + if(stack.get_amount() < 1) return - balloon_alert(user, "concealing entrance...") - if(do_after(user, 2 SECONDS, target = src)) - if(sheets.get_amount() < amount) - return - sheets.use(amount) - var/obj/structure/falsewall/falsewall - if(falsewall_type) - falsewall = new falsewall_type (loc) - else - var/obj/structure/falsewall/material/mat_falsewall = new(loc) - var/list/material_list = list() - material_list[GET_MATERIAL_REF(sheets.material_type)] = SHEET_MATERIAL_AMOUNT * 2 - if(material_list) - mat_falsewall.set_custom_materials(material_list) - falsewall = mat_falsewall - transfer_fingerprints_to(falsewall) - qdel(src) + stack.use(1) + var/turf/T = get_turf(src) + T.place_on_top(/turf/closed/wall/r_wall/plastitanium) + transfer_fingerprints_to(T) + qdel(src) + return + // No return here because generic material construction handles making normal plastitanium walls + + else if(!stack.has_unique_girder && stack.material_type) + if(istype(src, /obj/structure/girder/reinforced)) + balloon_alert(user, "need plasteel or plastitanium!") + return + + var/material + if(istype(stack, /obj/item/stack/sheet)) + var/obj/item/stack/sheet/sheet = stack + material = sheet.construction_path_type + var/amount = construction_cost["exotic_material"] + if(state == GIRDER_TRAM) + if(stack.get_amount() < amount) + balloon_alert(user, "need [amount] sheets!") + return + var/tram_wall_type = text2path("/obj/structure/tram/alt/[material]") + if(!tram_wall_type) + balloon_alert(user, "need titanium glass or mineral!") + return + balloon_alert(user, "adding plating...") + if (do_after(user, 4 SECONDS, target = src)) + if(stack.get_amount() < amount) return - else - if(sheets.get_amount() < amount) - balloon_alert(user, "need [amount] sheets!") + var/obj/structure/tram/tram_wall + tram_wall = new tram_wall_type(loc) + stack.use(amount) + transfer_fingerprints_to(tram_wall) + qdel(src) + return + if(state == GIRDER_DISPLACED) + var/falsewall_type = text2path("/obj/structure/falsewall/[material]") + if(stack.get_amount() < amount) + balloon_alert(user, "need [amount] sheets!") + return + balloon_alert(user, "concealing entrance...") + if(do_after(user, 2 SECONDS, target = src)) + if(stack.get_amount() < amount) return - balloon_alert(user, "adding plating...") - if (do_after(user, 4 SECONDS, target = src)) - if(sheets.get_amount() < amount) - return - sheets.use(amount) - var/turf/T = get_turf(src) - if(sheets.walltype) - T.place_on_top(sheets.walltype) - else - var/turf/newturf = T.place_on_top(/turf/closed/wall/material) - var/list/material_list = list() - material_list[GET_MATERIAL_REF(sheets.material_type)] = SHEET_MATERIAL_AMOUNT * 2 - if(material_list) - newturf.set_custom_materials(material_list) - - transfer_fingerprints_to(T) - qdel(src) + stack.use(amount) + var/obj/structure/falsewall/falsewall + if(falsewall_type) + falsewall = new falsewall_type (loc) + else + var/obj/structure/falsewall/material/mat_falsewall = new(loc) + var/list/material_list = list() + material_list[GET_MATERIAL_REF(stack.material_type)] = SHEET_MATERIAL_AMOUNT * 2 + if(material_list) + mat_falsewall.set_custom_materials(material_list) + falsewall = mat_falsewall + transfer_fingerprints_to(falsewall) + qdel(src) return - - add_hiddenprint(user) - - else if(istype(W, /obj/item/pipe)) - var/obj/item/pipe/P = W - if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds. - if(!user.transfer_item_to_turf(P, drop_location())) + else + if(stack.get_amount() < amount) + balloon_alert(user, "need [amount] sheets!") return - balloon_alert(user, "inserted pipe") - else - return ..() + balloon_alert(user, "adding plating...") + if (do_after(user, 4 SECONDS, target = src)) + if(stack.get_amount() < amount) + return + stack.use(amount) + var/turf/T = get_turf(src) + if(stack.walltype) + T.place_on_top(stack.walltype) + else + var/turf/newturf = T.place_on_top(/turf/closed/wall/material) + var/list/material_list = list() + material_list[GET_MATERIAL_REF(stack.material_type)] = SHEET_MATERIAL_AMOUNT * 2 + if(material_list) + newturf.set_custom_materials(material_list) + + transfer_fingerprints_to(T) + qdel(src) + return // Screwdriver behavior for girders /obj/structure/girder/screwdriver_act(mob/user, obj/item/tool) @@ -462,6 +473,7 @@ smoothing_flags = NONE smoothing_groups = null canSmoothWith = null + custom_materials = list(/datum/material/runedmetal = SHEET_MATERIAL_AMOUNT) /obj/structure/girder/cult/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) @@ -514,7 +526,7 @@ return FALSE /obj/structure/girder/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - switch(rcd_data["[RCD_DESIGN_MODE]"]) + switch(rcd_data[RCD_DESIGN_MODE]) if(RCD_TURF) if(the_rcd.rcd_design_path != /turf/open/floor/plating/rcd) return FALSE @@ -537,6 +549,7 @@ smoothing_flags = NONE smoothing_groups = null canSmoothWith = null + custom_materials = list(/datum/material/bronze = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/girder/bronze/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index d21f7d457ab1..ed3aa733d662 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -15,6 +15,7 @@ armor_type = /datum/armor/structure_grille max_integrity = 50 integrity_failure = 0.4 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) var/rods_type = /obj/item/stack/rods var/rods_amount = 2 /// Whether or not we're disappearing but dramatically @@ -92,7 +93,7 @@ return FALSE /obj/structure/grille/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - switch(rcd_data["[RCD_DESIGN_MODE]"]) + switch(rcd_data[RCD_DESIGN_MODE]) if(RCD_DECONSTRUCT) qdel(src) return TRUE @@ -106,7 +107,7 @@ if(!clear_tile(user)) return FALSE - var/obj/structure/window/window_path = rcd_data["[RCD_DESIGN_PATH]"] + var/obj/structure/window/window_path = rcd_data[RCD_DESIGN_PATH] if(!ispath(window_path)) CRASH("Invalid window path type in RCD: [window_path]") diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm index ca7344d2f247..6742e89248bf 100644 --- a/code/game/objects/structures/guillotine.dm +++ b/code/game/objects/structures/guillotine.dm @@ -42,6 +42,12 @@ buckle_lying = 0 buckle_prevents_pull = TRUE layer = ABOVE_MOB_LAYER + custom_materials = list( + /datum/material/wood = SHEET_MATERIAL_AMOUNT * 20, + /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/iron = SMALL_MATERIAL_AMOUNT, + /datum/material/glass = SMALL_MATERIAL_AMOUNT, + ) /// The sound the guillotine makes when it successfully cuts off a head var/drop_sound = 'sound/items/weapons/guillotine.ogg' /// The current state of the blade diff --git a/code/game/objects/structures/gym/punching_bag.dm b/code/game/objects/structures/gym/punching_bag.dm index bea51bc1d8c6..f767f77c912b 100644 --- a/code/game/objects/structures/gym/punching_bag.dm +++ b/code/game/objects/structures/gym/punching_bag.dm @@ -5,6 +5,7 @@ icon_state = "punchingbag" anchored = TRUE layer = ABOVE_MOB_LAYER + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5) ///List of sounds that can be played when punched. var/static/list/hit_sounds = list( 'sound/items/weapons/genhit1.ogg', @@ -65,7 +66,7 @@ if(HAS_TRAIT(user, TRAIT_STRENGTH)) //The strong get reductions to stamina damage taken while exercising stamina_exhaustion *= 0.5 - user.adjustStaminaLoss(stamina_exhaustion) + user.adjust_stamina_loss(stamina_exhaustion) user.mind?.adjust_experience(/datum/skill/athletics, is_heavy_gravity ? 0.6 : 0.3) user.apply_status_effect(/datum/status_effect/exercised) diff --git a/code/game/objects/structures/gym/weight_machine.dm b/code/game/objects/structures/gym/weight_machine.dm index c9b59efd89f0..c3ba59cead6b 100644 --- a/code/game/objects/structures/gym/weight_machine.dm +++ b/code/game/objects/structures/gym/weight_machine.dm @@ -12,6 +12,7 @@ density = TRUE anchored = TRUE blocks_emissive = EMISSIVE_BLOCK_UNIQUE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7) ///How much we shift the user's pixel y when using the weight machine. var/pixel_shift_z = -3 @@ -214,7 +215,7 @@ if(HAS_TRAIT(user, TRAIT_STRENGTH)) //The strong get reductions to stamina damage taken while exercising stamina_exhaustion *= 0.5 - user.adjustStaminaLoss(stamina_exhaustion * seconds_per_tick) + user.adjust_stamina_loss(stamina_exhaustion * seconds_per_tick) return TRUE diff --git a/code/game/objects/structures/headpike.dm b/code/game/objects/structures/headpike.dm index c9b9562ce731..5dcfac5f77ea 100644 --- a/code/game/objects/structures/headpike.dm +++ b/code/game/objects/structures/headpike.dm @@ -5,6 +5,7 @@ icon_state = "headpike" density = FALSE anchored = TRUE + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.15, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.65) var/obj/item/spear/spear var/obj/item/spear/speartype = /obj/item/spear var/obj/item/bodypart/head/victim @@ -12,10 +13,12 @@ /obj/structure/headpike/bone //for bone spears icon_state = "headpike-bone" speartype = /obj/item/spear/bonespear + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 4) /obj/structure/headpike/bamboo //for bamboo spears icon_state = "headpike-bamboo" speartype = /obj/item/spear/bamboospear + custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 25) /obj/structure/headpike/military //for military spears icon_state = "headpike-military" diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 97b9404b3a46..f1492da1267c 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -8,6 +8,7 @@ density = TRUE anchored = FALSE max_integrity = 200 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5) /obj/structure/kitchenspike_frame/Initialize(mapload) . = ..() @@ -74,10 +75,12 @@ buckle_lying = FALSE can_buckle = TRUE max_integrity = 250 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7) /obj/structure/kitchenspike/Initialize(mapload) . = ..() register_context() + ADD_TRAIT(src, TRAIT_DANGEROUS_BUCKLE, INNATE_TRAIT) /obj/structure/kitchenspike/examine(mob/user) . = ..() @@ -119,7 +122,7 @@ playsound(src.loc, 'sound/effects/splat.ogg', 25, TRUE) target.emote("scream") target.add_splatter_floor() - target.adjustBruteLoss(30) + target.adjust_brute_loss(30) target.setDir(2) var/matrix/m180 = matrix(target.transform) m180.Turn(180) @@ -142,7 +145,7 @@ buckled_mob.visible_message(span_warning("[buckled_mob] struggles to break free from [src]!"),\ span_notice("You struggle to break free from [src], exacerbating your wounds! (Stay still for two minutes.)"),\ span_hear("You hear a wet squishing noise..")) - buckled_mob.adjustBruteLoss(30) + buckled_mob.adjust_brute_loss(30) if(!do_after(buckled_mob, 2 MINUTES, target = src, hidden = TRUE)) if(buckled_mob?.buckled) to_chat(buckled_mob, span_warning("You fail to free yourself!")) @@ -150,7 +153,7 @@ return ..() /obj/structure/kitchenspike/post_unbuckle_mob(mob/living/buckled_mob) - buckled_mob.adjustBruteLoss(30) + buckled_mob.adjust_brute_loss(30) INVOKE_ASYNC(buckled_mob, TYPE_PROC_REF(/mob, emote), "scream") buckled_mob.AdjustParalyzed(20) var/matrix/m180 = matrix(buckled_mob.transform) diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index 28fc8b08f94b..1405f2b36d5f 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -7,6 +7,7 @@ base_icon_state = "ladder" anchored = TRUE obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7.5) ///the ladder below this one VAR_FINAL/obj/structure/ladder/down ///the ladder above this one @@ -257,10 +258,11 @@ // Our climbers athletics ability // DARKPACK EDIT CHANGE START - STORYTELLER_STATS + // DARKPACK TODO - standardize stat doafter delays var/fitness_level = 1 if(isliving(user)) var/mob/living/living_user = user - fitness_level = living_user.st_get_stat(STAT_DEXTERITY) + living_user.st_get_stat(STAT_ATHLETICS) + fitness_level = living_user.st_get_stat(STAT_DEXTERITY) + living_user.st_get_stat(STAT_ATHLETICS) * travel_time/10 // DARKPACK EDIT CHANGE END // Misc bonuses to the climb speed. @@ -292,7 +294,7 @@ var/turf/target = get_turf(ladder) user.zMove(target = target, z_move_flags = ZMOVE_CHECK_PULLEDBY|ZMOVE_ALLOW_BUCKLED|ZMOVE_INCLUDE_PULLED) - /* DARKPACK EDIT REMOVAL + /* // DARKPACK EDIT REMOVAL if(grant_exp) var/fitness_level = user.mind?.get_skill_level(/datum/skill/athletics) user.mind?.adjust_experience(/datum/skill/athletics, round(ATHLETICS_SKILL_MISC_EXP/(fitness_level || 1), 1)) //get a little experience for our trouble diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 65e6e80e6373..b6c959a05ab3 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -16,7 +16,7 @@ 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) + var/list/give_turf_traits = list(TRAIT_CHASM_STOPPED, TRAIT_HYPERSPACE_STOPPED, TRAIT_TURF_IGNORE_SLOWDOWN, TRAIT_IMMERSE_STOPPED) /obj/structure/lattice/Initialize(mapload) . = ..() @@ -48,6 +48,10 @@ for(var/thing_that_falls in turfloc) turfloc.zFall(thing_that_falls) + var/area/turf_area = get_area(turfloc) + if(isspaceturf(turfloc) && istype(turf_area, /area/space/nearstation)) + set_turf_to_area(turfloc, GLOB.areas_by_type[/area/space]) + /obj/structure/lattice/proc/deconstruction_hints(mob/user) return span_notice("The rods look like they could be cut. There's space for more rods or a tile.") @@ -82,8 +86,8 @@ return FALSE /obj/structure/lattice/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - if(rcd_data["[RCD_DESIGN_MODE]"] == RCD_TURF) - var/design_structure = rcd_data["[RCD_DESIGN_PATH]"] + if(rcd_data[RCD_DESIGN_MODE] == RCD_TURF) + var/design_structure = rcd_data[RCD_DESIGN_PATH] if(design_structure == /turf/open/floor/plating/rcd) var/turf/T = src.loc if(isgroundlessturf(T)) @@ -196,12 +200,11 @@ /obj/structure/lattice/catwalk/boulder name = "boulder platform" desc = "A boulder, floating on the molten hot deadly lava. More like a BOATlder." - icon = 'icons/obj/ore.dmi' - icon_state = "boulder_platform" + icon = 'icons/obj/smooth_structures/boulder_platform.dmi' + icon_state = "boulder_platform-0" base_icon_state = "boulder_platform" - smoothing_flags = NONE - smoothing_groups = null - canSmoothWith = null + smoothing_groups = SMOOTH_GROUP_BOULDER_PLATFORM + canSmoothWith = SMOOTH_GROUP_BOULDER_PLATFORM + SMOOTH_GROUP_FLOOR_LAVA build_material = null /// The type of particle to make before the platform collapses. var/warning_particle = /particles/smoke/ash @@ -224,10 +227,9 @@ . = ..() /obj/structure/lattice/catwalk/boulder/proc/pre_self_destruct() - if(istype(loc, /turf/open/lava/plasma)) - add_overlay("plasma_cracks") - else - add_overlay("lava_cracks") + var/mutable_appearance/cracks_overlay = mutable_appearance('icons/obj/ore.dmi', istype(loc, /turf/open/lava/plasma) ? "plasma_cracks" : "lava_cracks", src) + cracks_overlay.blend_mode = BLEND_INSET_OVERLAY + add_overlay(cracks_overlay) animate(src, alpha = 0, time = 2 SECONDS, pixel_y = -16, easing = QUAD_EASING|EASE_IN) addtimer(CALLBACK(src, PROC_REF(self_destruct)), 2 SECONDS) diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index a34bcb10a43e..bbbc8da76e49 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -108,6 +108,12 @@ reagent_id = /datum/reagent/water/hollowwater true_name = "hollow water geyser" +/obj/structure/geyser/chiral_buffer + reagent_id = /datum/reagent/reaction_agent/inversing_buffer + point_value = 250 + true_name = "chiral inversing geyser" + discovery_message = "It's a rare chiral inversing geyser! This could be very powerful in the right hands... " + /obj/structure/geyser/random point_value = 500 diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index 2e00a08a600c..305ecf611fc5 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -237,13 +237,34 @@ addtimer(CALLBACK(node, TYPE_PROC_REF(/atom, update_appearance)), wave_timer * 0.75) add_shared_particles(/particles/smoke/ash) for(var/i in 1 to 5) // Clears the surroundings of the ore vent before starting wave defense. - for(var/turf/closed/mineral/rock in oview(i)) - if(istype(rock, /turf/open/misc/asteroid) && prob(35)) // so it's too common - new /obj/effect/decal/cleanable/rubble(rock) - if(prob(100 - (i * 15))) - rock.gets_drilled(user) + for(var/turf/rock in oview(i)) + + if(istype(rock, /turf/closed/mineral)) //Solid wall checks: Mine out the wall, but start skipping more as we move farther away. + if(prob(50 + (i * 8))) + continue + var/turf/closed/mineral/drillable = rock + drillable.gets_drilled(user) if(prob(50)) - new /obj/effect/decal/cleanable/rubble(rock) + new /obj/effect/decal/cleanable/rubble(rock) // Only throw rubble when we actually mine something, and not all the time. + continue //skip the rest of the checks + + if(istype(rock, /turf/open/misc/asteroid) && prob(35)) // Open rock floors: make rubble decals occasionally. + new /obj/effect/decal/cleanable/rubble(rock) + continue + + if(istype(rock, /turf/open/lava)) // Lava turfs, skip as we get farther away, otherwise produce a boulder and make it a platform, lasting the whole wave. + if(prob(30 + (i * 8))) // We want to skip these less than the mining walls, since lava is more common to deal with. + continue + + var/obj/item/boulder/produced = produce_boulder(FALSE) + var/obj/structure/lattice/catwalk/boulder/platform = produced.create_platform(rock, null, wave_timer) + + if(!platform || !QDELETED(produced)) + qdel(produced) + continue + platform.alpha = 0 + platform.pixel_z = -16 + animate(platform, alpha = 255, time = 2 SECONDS, pixel_z = 0, easing = QUAD_EASING|EASE_OUT) sleep(0.6 SECONDS) return TRUE @@ -475,50 +496,66 @@ log_game("Vent-spawned mob [key_name_and_tag(killed)] was killed") SSblackbox.record_feedback("tally", "ore_vent_mobs_killed", 1, killed.type) -//comes with the station, and is already tapped. -/obj/structure/ore_vent/starter_resources - name = "active ore vent" - desc = "An ore vent, brimming with underground ore. It's already supplying the station with iron and glass." - tapped = TRUE - discovered = TRUE - unique_vent = TRUE - boulder_size = BOULDER_SIZE_SMALL - mineral_breakdown = list( - /datum/material/iron = 1, - /datum/material/glass = 1, - ) +/** + * The part of initialization and the ore_generation subsystem's setup that assigns the size of an ore_vent and it's boulders. + * @param random: Used for random sized boulders, and the standard (pre 9-6-2025) behavior. + * @param force_size: An override we use for map_generation, when we know what size boulder we need from this ore vent already. Use the standard ore_vent size defines. + */ +/obj/structure/ore_vent/proc/vent_size_setup(random = FALSE, force_size, map_loading) + var/string_boulder_size -/obj/structure/ore_vent/random + if(force_size) + string_boulder_size = force_size + + else if(random) + string_boulder_size = pick_weight(ore_vent_options) -/obj/structure/ore_vent/random/Initialize(mapload) - . = ..() - if(!unique_vent && !mapload) - generate_mineral_breakdown(map_loading = mapload) //Default to random mineral breakdowns, unless this is a unique vent or we're still setting up default vent distribution. - generate_description() - artifact_chance = rand(0, MAX_ARTIFACT_ROLL_CHANCE) - var/string_boulder_size = pick_weight(ore_vent_options) name = "[string_boulder_size] ore vent" switch(string_boulder_size) if(LARGE_VENT_TYPE) boulder_size = BOULDER_SIZE_LARGE wave_timer = WAVE_DURATION_LARGE - if(mapload) + if(map_loading) GLOB.ore_vent_sizes["large"] += 1 if(MEDIUM_VENT_TYPE) boulder_size = BOULDER_SIZE_MEDIUM wave_timer = WAVE_DURATION_MEDIUM - if(mapload) + if(map_loading) GLOB.ore_vent_sizes["medium"] += 1 if(SMALL_VENT_TYPE) boulder_size = BOULDER_SIZE_SMALL wave_timer = WAVE_DURATION_SMALL - if(mapload) + if(map_loading) GLOB.ore_vent_sizes["small"] += 1 else boulder_size = BOULDER_SIZE_SMALL //Might as well set a default value wave_timer = WAVE_DURATION_SMALL name = initial(name) +//comes with the station, and is already tapped. +/obj/structure/ore_vent/starter_resources + name = "active ore vent" + desc = "An ore vent, brimming with underground ore. It's already supplying the station with iron and glass." + tapped = TRUE + discovered = TRUE + unique_vent = TRUE + boulder_size = BOULDER_SIZE_SMALL + mineral_breakdown = list( + /datum/material/iron = 1, + /datum/material/glass = 1, + ) + +/obj/structure/ore_vent/random + // Todo: determine if we need a boulder_size default thats unique from the override performed in vent_size_setup. + +/obj/structure/ore_vent/random/Initialize(mapload) + . = ..() + if(!unique_vent && !mapload) + generate_mineral_breakdown(map_loading = mapload) //Default to random mineral breakdowns, unless this is a unique vent or we're still setting up default vent distribution. + generate_description() + artifact_chance = rand(0, MAX_ARTIFACT_ROLL_CHANCE) + if(!mapload) + vent_size_setup(random = TRUE) // We only do this here specific to random distribution ore vents, and within mapload we handle this manually within SSore_generation. /obj/structure/ore_vent/random/icebox //The one that shows up on the top level of icebox @@ -621,6 +658,20 @@ /mob/living/simple_animal/hostile/megafauna/colossus, ) +/obj/effect/landmark/mining_center + name = "Mining Epicenter" + icon_state = "mining_epicenter" + +/obj/effect/landmark/mining_center/Initialize(mapload) + ..() + + for(var/obj/mining_mark as anything in GLOB.mining_center) + if(src.z == mining_mark.z) + CRASH("\The [src] spawned on Z level [z] already exists! Maps should only have at most one mining epicenter for normal ore generation.") + + GLOB.mining_center += loc + return INITIALIZE_HINT_QDEL + #undef MAX_ARTIFACT_ROLL_CHANCE #undef MINERAL_TYPE_OPTIONS_RANDOM #undef OVERLAY_OFFSET_START diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm index 2d10df50a747..c60bae1af3f6 100644 --- a/code/game/objects/structures/loom.dm +++ b/code/game/objects/structures/loom.dm @@ -6,6 +6,7 @@ icon_state = "loom" density = TRUE anchored = TRUE + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 10) /obj/structure/loom/Initialize(mapload) . = ..() diff --git a/code/game/objects/structures/maintenance.dm b/code/game/objects/structures/maintenance.dm index 273a446eb854..0ee8e1b2bcb8 100644 --- a/code/game/objects/structures/maintenance.dm +++ b/code/game/objects/structures/maintenance.dm @@ -148,7 +148,7 @@ at the cost of risking a vicious bite.**/ var/altar_result = show_radial_menu(user, src, altar_options, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) switch(altar_result) if("Change Color") - var/chosen_color = input(user, "", "Choose Color", pants_color) as color|null + var/chosen_color = tgui_color_picker(user, "", "Choose Color", pants_color) if(!isnull(chosen_color) && user.can_perform_action(src)) pants_color = chosen_color if("Create Artefact") @@ -250,6 +250,7 @@ at the cost of risking a vicious bite.**/ icon_state = "steam_vent" anchored = TRUE density = FALSE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.3, /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 2) /// How often does the vent reset the blow_steam cooldown. var/steam_speed = 20 SECONDS /// Is the steam vent active? diff --git a/code/game/objects/structures/mannequin.dm b/code/game/objects/structures/mannequin.dm index 2260751bbf70..8fedeebb1143 100644 --- a/code/game/objects/structures/mannequin.dm +++ b/code/game/objects/structures/mannequin.dm @@ -63,7 +63,7 @@ material = pick(MANNEQUIN_WOOD, MANNEQUIN_PLASTIC) icon_state = "mannequin_[material]_[body_type == FEMALE ? "female" : "male"]" AddElement(/datum/element/strippable, GLOB.strippable_mannequin_items) - AddComponent(/datum/component/simple_rotation, ROTATION_IGNORE_ANCHORED) + AddElement(/datum/element/simple_rotation, ROTATION_IGNORE_ANCHORED) AddComponent(/datum/component/marionette) update_appearance() @@ -146,9 +146,11 @@ /obj/structure/mannequin/wood material = MANNEQUIN_WOOD + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 25) /obj/structure/mannequin/plastic material = MANNEQUIN_PLASTIC + custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 25) /obj/structure/mannequin/skeleton name = "skeleton model" diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index eaa18fd6eb1f..0bddf5575d28 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -25,6 +25,7 @@ anchored = TRUE integrity_failure = 0.5 max_integrity = 200 + custom_materials = /obj/item/wallframe/mirror::custom_materials ///Can this mirror be removed from walls with tools? var/deconstructable = TRUE var/list/mirror_options = INERT_MIRROR_OPTIONS @@ -34,10 +35,6 @@ ///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 @@ -58,6 +55,10 @@ update_signals = list(COMSIG_ATOM_BREAK), \ check_reflect_signals = list(SIGNAL_ADDTRAIT(TRAIT_NO_MIRROR_REFLECTION), SIGNAL_REMOVETRAIT(TRAIT_NO_MIRROR_REFLECTION)), \ ) + if(mapload) + find_and_mount_on_atom() + update_choices() + register_context() /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. @@ -69,11 +70,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) -/obj/structure/mirror/Initialize(mapload) - . = ..() - find_and_hang_on_wall() - register_context() - /obj/structure/mirror/broken icon_state = "mirror_broke" @@ -85,14 +81,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) /obj/structure/mirror/attack_hand(mob/living/carbon/human/user) . = ..() - if(. || !ishuman(user) || broken) return TRUE - if(!istype(src, /obj/structure/mirror/magic) && !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return TRUE //no tele-grooming (if nonmagical) - - return display_radial_menu(user) + display_radial_menu(user) + return TRUE /obj/structure/mirror/wrench_act_secondary(mob/living/user, obj/item/tool) if(!deconstructable) @@ -111,9 +104,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) new /obj/item/wallframe/mirror(loc, 1) /obj/structure/mirror/proc/display_radial_menu(mob/living/carbon/human/user) + if(!can_use_mirror(user)) + return + var/pick = show_radial_menu(user, src, mirror_options, user, radius = 36, require_near = TRUE, tooltips = TRUE) - if(!pick) - return TRUE //get out + if(!pick || !can_use_mirror(user) || !pre_change(user, pick)) + return switch(pick) if(CHANGE_HAIR) @@ -129,45 +125,53 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) if(CHANGE_EYES) change_eyes(user) - return display_radial_menu(user) + display_radial_menu(user) + +/// Ran before we dive into any changes, can be used to block changes by returning FALSE +/obj/structure/mirror/proc/pre_change(mob/living/carbon/human/user, picked) + return TRUE + +/// Checks if the mob can continue to use the mirror +/obj/structure/mirror/proc/can_use_mirror(mob/living/carbon/human/user) + return !QDELETED(src) && !QDELETED(user) && user.can_perform_action(src, FORBID_TELEKINESIS_REACH) /obj/structure/mirror/proc/change_beard(mob/living/carbon/human/beard_dresser) if(beard_dresser.physique == FEMALE) if(beard_dresser.facial_hairstyle == "Shaved") balloon_alert(beard_dresser, "nothing to shave!") - return TRUE + return var/shave_beard = tgui_alert(beard_dresser, "Shave your beard?", "Grooming", list("Yes", "No")) - if(shave_beard == "Yes") + if(shave_beard == "Yes" && can_use_mirror(beard_dresser)) beard_dresser.set_facial_hairstyle("Shaved", update = TRUE) - return TRUE + return var/new_style = tgui_input_list(beard_dresser, "Select a facial hairstyle", "Grooming", SSaccessories.facial_hairstyles_list) - if(isnull(new_style)) - return TRUE + if(isnull(new_style) || !can_use_mirror(beard_dresser)) + return 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 + return beard_dresser.set_facial_hairstyle(new_style, update = TRUE) /obj/structure/mirror/proc/change_hair(mob/living/carbon/human/hairdresser) var/new_style = tgui_input_list(hairdresser, "Select a hairstyle", "Grooming", SSaccessories.hairstyles_list) - if(isnull(new_style)) - return TRUE + if(isnull(new_style) || !can_use_mirror(hairdresser)) + return if(HAS_TRAIT(hairdresser, TRAIT_BALD)) 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 + return 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 + if(!newname || !can_use_mirror(user)) + return user.real_name = newname user.name = newname if(user.dna) @@ -178,49 +182,55 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) // 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(isnull(racechoice) || !can_use_mirror(race_changer)) + return var/new_race_path = selectable_races[racechoice] if(!ispath(new_race_path, /datum/species)) - return TRUE + return - var/datum/species/newrace = new new_race_path() + var/datum/species/newrace = GLOB.species_prototypes[new_race_path] var/attributes_desc = newrace.get_physical_attributes() var/answer = tgui_alert(race_changer, attributes_desc, "Become a [newrace]?", list("Yes", "No")) + if(!answer || !can_use_mirror(race_changer)) + return if(answer != "Yes") - qdel(newrace) change_race(race_changer) // try again return - race_changer.set_species(newrace, icon_update = FALSE) + on_species_change(race_changer, newrace) + race_changer.set_species(new_race_path, 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) + if(new_s_tone && can_use_mirror(race_changer)) race_changer.skin_tone = new_s_tone race_changer.dna.update_ui_block(/datum/dna_block/identity/skin_tone) 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[FEATURE_MUTANT_COLOR]) as color|null - if(new_mutantcolor) + var/new_mutantcolor = tgui_color_picker(race_changer, "Choose your skin color:", "Race change", race_changer.dna.features[FEATURE_MUTANT_COLOR]) + if(new_mutantcolor && can_use_mirror(race_changer)) var/list/mutant_hsv = rgb2hsv(new_mutantcolor) - if(mutant_hsv[3] >= 50) // mutantcolors must be bright race_changer.dna.features[FEATURE_MUTANT_COLOR] = sanitize_hexcolor(new_mutantcolor) race_changer.dna.update_uf_block(/datum/dna_block/feature/mutant_color) else to_chat(race_changer, span_notice("Invalid color. Your color is not bright enough.")) - return TRUE race_changer.update_body(is_creating = TRUE) race_changer.update_mutations_overlay() // no hulk lizard +/// Hook for mirrors to do stuff on species change +/obj/structure/mirror/proc/on_species_change(mob/living/carbon/human/race_changer, datum/species/newrace) + return + // 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 + if(!chosen_sex || !can_use_mirror(sexy)) + return switch(chosen_sex) if("Warlock") @@ -238,7 +248,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) 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") + if(chosen_physique && chosen_physique != "Wizards Don't Need Gender" && can_use_mirror(sexy)) sexy.physique = (chosen_physique == "Warlock Physique") ? MALE : FEMALE sexy.dna.update_ui_block(/datum/dna_block/identity/gender) @@ -247,9 +257,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) sexy.update_clothing(ITEM_SLOT_ICLOTHING) // update gender shaped clothing /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 + var/new_eye_color = tgui_color_picker(user, "Choose your eye color", "Eye Color", user.eye_color_left) + if(isnull(new_eye_color) || !can_use_mirror(user)) + return user.set_eye_color(sanitize_hexcolor(new_eye_color)) user.dna.update_ui_block(/datum/dna_block/identity/eye_colors) user.update_body() @@ -341,10 +351,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) desc = "An unmounted mirror. Attach it to a wall to use." icon = 'icons/obj/watercloset.dmi' icon_state = "mirror" - custom_materials = list( - /datum/material/glass = SHEET_MATERIAL_AMOUNT, - /datum/material/silver = SHEET_MATERIAL_AMOUNT, - ) + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 5, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 2) result_path = /obj/structure/mirror pixel_shift = 28 @@ -367,41 +374,42 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) /obj/structure/mirror/magic/change_beard(mob/living/carbon/human/beard_dresser) // magical mirrors do nothing but give you the damn beard var/new_style = tgui_input_list(beard_dresser, "Select a facial hairstyle", "Grooming", SSaccessories.facial_hairstyles_list) - if(isnull(new_style)) - return TRUE + if(isnull(new_style) || !can_use_mirror(beard_dresser)) + return + beard_dresser.set_facial_hairstyle(new_style, update = TRUE) - return TRUE //Magic mirrors can change hair color as well /obj/structure/mirror/magic/change_hair(mob/living/carbon/human/user) var/hairchoice = tgui_alert(user, "Hairstyle or hair color?", "Change Hair", list("Style", "Color")) + if(!can_use_mirror(user)) + return if(hairchoice == "Style") //So you just want to use a mirror then? return ..() - var/new_hair_color = input(user, "Choose your hair color", "Hair Color", user.hair_color) as color|null - + var/new_hair_color = tgui_color_picker(user, "Choose your hair color", "Hair Color", user.hair_color) + if(!new_hair_color || !can_use_mirror(user)) + return if(new_hair_color) user.set_haircolor(sanitize_hexcolor(new_hair_color)) user.dna.update_ui_block(/datum/dna_block/identity/hair_color) 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) + var/new_face_color = tgui_color_picker(user, "Choose your facial hair color", "Hair Color", user.facial_hair_color) + if(new_face_color && can_use_mirror(user)) user.set_facial_haircolor(sanitize_hexcolor(new_face_color)) user.dna.update_ui_block(/datum/dna_block/identity/facial_color) -/obj/structure/mirror/magic/attack_hand(mob/living/carbon/human/user) - . = ..() - if(.) - return TRUE - - if(HAS_TRAIT(user, TRAIT_ADVANCEDTOOLUSER) && HAS_TRAIT(user, TRAIT_LITERATE)) - return TRUE +/// Hook for mirrors to do stuff on species change +/obj/structure/mirror/magic/on_species_change(mob/living/carbon/human/race_changer, datum/species/newrace) + if(HAS_TRAIT(race_changer, TRAIT_ADVANCEDTOOLUSER) && HAS_TRAIT(race_changer, TRAIT_LITERATE)) + return - to_chat(user, span_alert("You feel quite intelligent.")) + to_chat(race_changer, span_alert("You feel quite intelligent.")) // Prevents wizards from being soft locked out of everything // If this stays after the species was changed once more, well, the magic mirror did it. It's magic i aint gotta explain shit - user.add_traits(list(TRAIT_LITERATE, TRAIT_ADVANCEDTOOLUSER), SPECIES_TRAIT) - return TRUE + race_changer.add_traits(list(TRAIT_LITERATE, TRAIT_ADVANCEDTOOLUSER), SPECIES_TRAIT) + +/obj/structure/mirror/magic/lesser /obj/structure/mirror/magic/lesser/Initialize(mapload) // Roundstart species don't have a flag, so it has to be set on Initialize. @@ -419,32 +427,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) /// If the last user has altered anything about themselves var/changed = FALSE -/obj/structure/mirror/magic/pride/display_radial_menu(mob/living/carbon/human/user) - var/pick = show_radial_menu(user, src, mirror_options, user, radius = 36, require_near = TRUE, tooltips = TRUE) - if(!pick) - return TRUE //get out - +/obj/structure/mirror/magic/pride/pre_change(mob/living/carbon/human/user, picked) + . = ..() changed = TRUE - 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/magic/pride/attack_hand(mob/living/carbon/human/user) changed = FALSE . = ..() - if (!changed) + if (!changed || QDELETED(user) || !IN_GIVEN_RANGE(user, src, 3)) // 3 range gives a tiny bit of leeway if you try to run away after using it return user.visible_message( span_bolddanger("The ground splits beneath [user] as [user.p_their()] hand leaves the mirror!"), diff --git a/code/game/objects/structures/mystery_box.dm b/code/game/objects/structures/mystery_box.dm index f01c2f3911ad..7b71200fb47e 100644 --- a/code/game/objects/structures/mystery_box.dm +++ b/code/game/objects/structures/mystery_box.dm @@ -23,6 +23,9 @@ GLOBAL_LIST_INIT(mystery_box_guns, list( /obj/item/gun/energy/e_gun, /obj/item/gun/energy/e_gun/nuclear, /obj/item/gun/energy/laser, + /obj/item/gun/energy/laser/soul, + /obj/item/gun/energy/laser/pistol, + /obj/item/gun/energy/laser/assault, /obj/item/gun/energy/laser/hellgun, /obj/item/gun/energy/laser/captain, /obj/item/gun/energy/laser/scatter, @@ -174,13 +177,15 @@ GLOBAL_LIST_INIT(mystery_fishing, list( /obj/structure/mystery_box/proc/generate_valid_types() valid_types = get_sane_item_types(selectable_base_type) +/obj/structure/mystery_box/IsContainedAtomAccessible(atom/contained, atom/movable/user) + return TRUE + /// The box has been activated, play the sound and spawn the prop item /obj/structure/mystery_box/proc/activate(mob/living/user) box_state = MYSTERY_BOX_CHOOSING update_icon_state() presented_item = new(src) presented_item.vis_flags = VIS_INHERIT_PLANE - presented_item.flags_1 |= IS_ONTOP_1 vis_contents += presented_item presented_item.start_animation(src) current_sound_channel = SSsounds.reserve_sound_channel(src) diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index 7e11eb6cb406..d9b7a4c5c03d 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -35,7 +35,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/noticeboard, 32) paper.forceMove(src) notices++ update_appearance(UPDATE_ICON) - find_and_hang_on_wall() + if(mapload) + find_and_mount_on_atom() //attaching papers!! /obj/structure/noticeboard/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) diff --git a/code/game/objects/structures/plaques/_plaques.dm b/code/game/objects/structures/plaques/_plaques.dm index 5baf25200fdd..de143b17f9f3 100644 --- a/code/game/objects/structures/plaques/_plaques.dm +++ b/code/game/objects/structures/plaques/_plaques.dm @@ -20,6 +20,8 @@ /obj/structure/plaque/Initialize(mapload) . = ..() + if(mapload) + find_and_mount_on_atom() register_context() /obj/structure/plaque/add_context(atom/source, list/context, obj/item/held_item, mob/user) diff --git a/code/game/objects/structures/plaques/static_plaques.dm b/code/game/objects/structures/plaques/static_plaques.dm index f5b24e3f24ff..6aed496b6f41 100644 --- a/code/game/objects/structures/plaques/static_plaques.dm +++ b/code/game/objects/structures/plaques/static_plaques.dm @@ -9,6 +9,13 @@ SET_PLANE_IMPLICIT(src, FLOOR_PLANE) layer = HIGH_TURF_LAYER +/obj/structure/plaque/static_plaque/get_moutable_objects() + return list() + +/obj/structure/plaque/static_plaque/find_and_mount_on_atom(mark_for_late_init, late_init) + if(isProbablyWallMounted(src)) + return ..() + /obj/structure/plaque/static_plaque/atmos name = "\improper FEA Atmospherics Division plaque" desc = "This plaque commemorates the fall of the Atmos FEA division. For all the charred, dizzy, and brittle men who have died in its hands." @@ -38,9 +45,9 @@ //Current stations -// Birdshot: added Apr 29, 2023 (#74371) -/obj/structure/plaque/static_plaque/golden/commission/birdshot - desc = "Spinward Sector Station SS-13\n'Birdshot' Class Outpost\nCommissioned 29/04/2563\n'Shooting for the Stars'" +// Catwalk: added Apr 10, 2025 (#90532) +/obj/structure/plaque/static_plaque/golden/commission/catwalk + desc = "Spinward Sector Station SS-13\n'Catwalk' Class Outpost\nCommissioned 10/04/2565\n'The New Level'" // Deltastation: added Dec 17, 2016 (#22066) /obj/structure/plaque/static_plaque/golden/commission/delta @@ -124,6 +131,10 @@ /obj/structure/plaque/static_plaque/golden/commission/uterus desc = "Spinward Sector Station SS-01\n'Uterus' Class Outpost\nCommissioned 03/09/2551\nDecommissioned 21/06/2552\n'Humanity's Vanguard'" +// Birdshot: added Apr 29, 2023 (#74371), removed Jul 9, 2025 (#92022) — 2 years, 2 months, 10 days +/obj/structure/plaque/static_plaque/golden/commission/birdshot + desc = "Spinward Sector Station SS-13\n'Birdshot' Class Outpost\nCommissioned 29/04/2563\nDecommissioned 09/07/2565\n'Shooting for the Stars'" + // Other Stations // Space Station 13, Developer Class Outpost, Station Commissioned 30.12.2322, For the Glory of the Workers of the Third Soviet Union diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 09638e6d7178..0c153c59128e 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -12,6 +12,7 @@ integrity_failure = 0.75 // This layer only matters for determining when you click it vs other objects layer = BELOW_OPEN_DOOR_LAYER + custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 5) /// If TRUE, we can't pass through unless the mob is resting (or fulfills more specific requirements) var/require_resting = TRUE /// Layer the flaps render on @@ -84,7 +85,7 @@ /obj/structure/plasticflaps/proc/check_melt(turf/source, datum/gas_mixture/air, temperature) SIGNAL_HANDLER - if(temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + if(temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST * 1.5) return if(!COOLDOWN_FINISHED(src, burn_damage_cd)) return diff --git a/code/game/objects/structures/platform.dm b/code/game/objects/structures/platform.dm index 6adfcf310aa5..3eb0b76f2139 100644 --- a/code/game/objects/structures/platform.dm +++ b/code/game/objects/structures/platform.dm @@ -7,6 +7,7 @@ icon = 'icons/obj/smooth_structures/platform/window_frame_normal.dmi' icon_state = "window_frame_normal-0" base_icon_state = "window_frame_normal" + layer = PLATFORM_LAYER // DARKPACK EDIT ADD - (Allows tables to be placed ontop of platforms (but please dont)) smoothing_flags = SMOOTH_BITMASK|SMOOTH_OBJ smoothing_groups = SMOOTH_GROUP_PLATFORMS canSmoothWith = SMOOTH_GROUP_PLATFORMS @@ -18,6 +19,7 @@ anchored = TRUE armor_type = /datum/armor/half_wall material_flags = MATERIAL_EFFECTS | MATERIAL_AFFECT_STATISTICS + custom_materials = list(/datum/material/iron = PLATFORM_BASE_MATERIAL_AMOUNT) /// Icon used for the frame var/frame_icon = 'icons/obj/smooth_structures/platform/frame_faces/window_frame_normal.dmi' /// Material used in our construction @@ -49,7 +51,7 @@ AddElement(/datum/element/elevation, pixel_shift = 12) AddElement(/datum/element/give_turf_traits, string_list(turf_traits)) AddElement(/datum/element/footstep_override, footstep = footstep, priority = STEP_SOUND_TABLE_PRIORITY) - AddComponent(/datum/component/table_smash) + AddElement(/datum/element/table_smash) /obj/structure/platform/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) . = ..() diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 5beb43a31bcd..7fa9a6ccb18d 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -13,7 +13,7 @@ /// 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 = 25 - + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) var/climbable = TRUE ///item released when deconstructed var/item_deconstruct = /obj/item/stack/rods @@ -32,6 +32,7 @@ icon_state = "railing_corner" density = FALSE climbable = FALSE + custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) /obj/structure/railing/corner/unbreakable resistance_flags = INDESTRUCTIBLE @@ -72,7 +73,7 @@ ) AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) - AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM) + AddElement(/datum/element/simple_rotation, ROTATION_NEEDS_ROOM) /obj/structure/railing/examine(mob/user) . = ..() @@ -172,6 +173,7 @@ item_deconstruct = /obj/item/stack/sheet/mineral/wood layer = ABOVE_MOB_LAYER plane = GAME_PLANE + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/railing/wooden_fence/Initialize(mapload) . = ..() diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index ada47e65bc0a..082a140d6993 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -5,6 +5,7 @@ desc = "A base for reflector assemblies." anchored = FALSE density = FALSE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5) var/deflector_icon_state var/mutable_appearance/deflector_overlay var/finished = FALSE @@ -36,9 +37,7 @@ if(admin) can_rotate = FALSE - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/reflector, - )) + AddComponent(/datum/component/usb_port, typecacheof(list(/obj/item/circuit_component/reflector), only_root_path = TRUE)) /obj/structure/reflector/examine(mob/user) . = ..() @@ -209,6 +208,7 @@ finished = TRUE buildstacktype = /obj/item/stack/sheet/rglass buildstackamount = 10 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 10, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 10) /obj/structure/reflector/double/anchored anchored = TRUE @@ -234,6 +234,7 @@ finished = TRUE buildstacktype = /obj/item/stack/sheet/mineral/diamond buildstackamount = 1 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 10, /datum/material/diamond = SHEET_MATERIAL_AMOUNT) /obj/structure/reflector/box/anchored anchored = TRUE diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index fbfd3e004069..84dcf0deafcf 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -18,7 +18,16 @@ FLOOR SAFES anchored = TRUE density = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + obj_flags = CONDUCTS_ELECTRICITY interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT + custom_materials = list( + /datum/material/metalhydrogen = SHEET_MATERIAL_AMOUNT * 15, + /datum/material/alloy/plastitanium = SHEET_MATERIAL_AMOUNT * 8, + /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 6, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, + ) + material_flags = MATERIAL_EFFECTS /// The maximum combined w_class of stuff in the safe var/maxspace = 24 /// The amount of tumblers that will be generated @@ -41,14 +50,26 @@ FLOOR SAFES /obj/structure/safe/Initialize(mapload) . = ..() - update_appearance(UPDATE_ICON) + var/static/list/tool_behaviors = list( + TOOL_WRENCH = list( + SCREENTIP_CONTEXT_LMB = "Reset lock", + ), + ) + AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) + // Combination generation for(var/iterating in 1 to number_of_tumblers) tumblers.Add(rand(0, 99)) - if(!mapload) + if(density) + AddElement(/datum/element/climbable) + AddElement(/datum/element/elevation, pixel_shift = 22) + + if(open && !locked) return + update_appearance(UPDATE_ICON) + // Put as many items on our turf inside as possible for(var/obj/item/inserting_item in loc) if(space >= maxspace) @@ -57,11 +78,46 @@ FLOOR SAFES space += inserting_item.w_class inserting_item.forceMove(src) +/obj/structure/safe/examine(mob/user) + . = ..() + . += span_notice("The locking mechanism gears are wrenched in place.") + /obj/structure/safe/update_icon_state() //uses the same icon as the captain's spare safe (therefore lockable storage) so keep it in line with that icon_state = "[initial(icon_state)][open ? null : "_locked"]" return ..() +/obj/structure/safe/wrench_act(mob/living/user, obj/item/tool) + if(!open) + balloon_alert(user, "must be open!") + return ITEM_INTERACT_BLOCKING + + balloon_alert(user, "resetting lock...") + to_chat(user, span_notice("You begin resetting the lock for [src]. You'll need to set [number_of_tumblers] numbers.")) + + var/list/new_tumblers = list() + for(var/tumbler_index in 1 to number_of_tumblers) + var/input_value = tgui_input_number(user, "Set tumbler #[tumbler_index] (0-99):", "Set Lock", 0, 99, 0) + if(isnull(input_value)) + balloon_alert(user, "reset cancelled!") + return ITEM_INTERACT_BLOCKING + if(!user.can_perform_action(src)) + balloon_alert(user, "reset interrupted!") + return ITEM_INTERACT_BLOCKING + new_tumblers.Add(input_value) + + tool.play_tool_sound(src) + if(!do_after(user, 10 SECONDS, target = src)) + return ITEM_INTERACT_BLOCKING + + tumblers = new_tumblers + current_tumbler_index = 1 + dial = 0 + tool.play_tool_sound(src) + to_chat(user, span_notice("You successfully reset the lock for [src]. The new combination is: [tumblers.Join("-")].")) + balloon_alert(user, "lock set!") + return ITEM_INTERACT_SUCCESS + /obj/structure/safe/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(open) . = TRUE //no afterattack @@ -238,17 +294,30 @@ FLOOR SAFES if(total_ticks == 1 || prob(SOUND_CHANCE)) balloon_alert(user, pick(sounds)) +/obj/structure/safe/open + open = TRUE + locked = FALSE + //FLOOR SAFES /obj/structure/safe/floor name = "floor safe" icon_state = "floorsafe" density = FALSE layer = LOW_OBJ_LAYER + custom_materials = list( + /datum/material/metalhydrogen = SHEET_MATERIAL_AMOUNT * 15, + /datum/material/alloy/plastitanium = SHEET_MATERIAL_AMOUNT * 8, + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.55, + ) /obj/structure/safe/floor/Initialize(mapload) . = ..() AddElement(/datum/element/undertile) +/obj/structure/safe/floor/open + open = TRUE + locked = FALSE + ///Special safe for the station's vault. Not explicitly required, but the piggy bank inside it is. /obj/structure/safe/vault diff --git a/code/game/objects/structures/secure_safe.dm b/code/game/objects/structures/secure_safe.dm index e3a74c00300b..71c3d0bb481a 100644 --- a/code/game/objects/structures/secure_safe.dm +++ b/code/game/objects/structures/secure_safe.dm @@ -6,6 +6,17 @@ base_icon_state = "wall_safe" result_path = /obj/structure/secure_safe pixel_shift = 32 + w_class = WEIGHT_CLASS_GIGANTIC + obj_flags = CONDUCTS_ELECTRICITY + resistance_flags = FIRE_PROOF + custom_materials = list( + /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 8, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 4, + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + ) + material_flags = MATERIAL_EFFECTS + /// The lock code transferred from the structure + var/stored_lock_code /obj/item/wallframe/secure_safe/Initialize(mapload) . = ..() @@ -13,12 +24,55 @@ max_specific_storage = WEIGHT_CLASS_GIGANTIC, max_total_storage = 20, ) - atom_storage.set_locked(STORAGE_FULLY_LOCKED) + if(stored_lock_code && !(obj_flags & EMAGGED)) + atom_storage.set_locked(STORAGE_FULLY_LOCKED) + update_appearance() + +/obj/item/wallframe/secure_safe/update_icon_state() + . = ..() + if(obj_flags & EMAGGED) + icon_state = "[base_icon_state]_broken" + else + icon_state = "[base_icon_state][stored_lock_code ? "_locked" : null]" -/obj/item/wallframe/secure_safe/after_attach(obj/attached_to) +/obj/item/wallframe/secure_safe/emag_act(mob/user, obj/item/card/emag/emag_card) . = ..() + if(obj_flags & EMAGGED) + return FALSE + + obj_flags |= EMAGGED + visible_message(span_warning("Sparks fly from [src]!"), blind_message = span_hear("You hear a faint electrical spark.")) + balloon_alert(user, "lock destroyed") + playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + stored_lock_code = null + atom_storage.locked = STORAGE_NOT_LOCKED + update_appearance() + return TRUE + +/obj/item/wallframe/secure_safe/after_attach(obj/structure/secure_safe/safe) + if(!istype(safe)) + return ..() + for(var/obj/item in contents) - item.forceMove(attached_to) + item.forceMove(safe) + + var/datum/component/lockable_storage/storage_component = safe.GetComponent(/datum/component/lockable_storage) + if(stored_lock_code) + storage_component?.set_lock_code(stored_lock_code) + + if(obj_flags & EMAGGED) + storage_component?.break_lock() + + return ..() + +/datum/armor/secure_safe + melee = 30 + bullet = 30 + laser = 20 + energy = 20 + bomb = 30 + fire = 95 + acid = 30 /** * Wall safes @@ -33,21 +87,48 @@ base_icon_state = "wall_safe" anchored = TRUE density = FALSE + resistance_flags = FIRE_PROOF + obj_flags = CONDUCTS_ELECTRICITY + armor_type = /datum/armor/secure_safe + max_integrity = 300 + damage_deflection = 21 + custom_materials = list( + /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT*5, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT*3, + ) + material_flags = MATERIAL_EFFECTS + /// The lock code used to open the safe + var/stored_lock_code MAPPING_DIRECTIONAL_HELPERS(/obj/structure/secure_safe, 32) /obj/structure/secure_safe/Initialize(mapload) . = ..() //this will create the storage for us. - AddComponent(/datum/component/lockable_storage) - if(!density) - find_and_hang_on_wall() + AddComponent(/datum/component/lockable_storage, stored_lock_code) if(mapload) PopulateContents() + find_and_mount_on_atom() + RegisterSignal(src, COMSIG_LOCKABLE_STORAGE_SET_CODE, PROC_REF(update_lock_code)) + +/obj/structure/secure_safe/find_and_mount_on_atom(mark_for_late_init, late_init) + if(!density) + return ..() /obj/structure/secure_safe/atom_deconstruct(disassembled) if(!density) //if we're a wall item, we'll drop a wall frame. var/obj/item/wallframe/secure_safe/new_safe = new(get_turf(src)) + + // Transfer lock code to the wallframe + var/datum/component/lockable_storage/storage_component = GetComponent(/datum/component/lockable_storage) + if(storage_component) + new_safe.stored_lock_code = storage_component.lock_code + + if(obj_flags & EMAGGED) + new_safe.obj_flags |= EMAGGED + + new_safe.update_appearance() + for(var/obj/item in contents) item.forceMove(new_safe) @@ -55,6 +136,16 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/secure_safe, 32) new /obj/item/paper(src) new /obj/item/pen(src) +/obj/structure/secure_safe/proc/update_lock_code(obj/structure/secure_safe/safe, new_code) + SIGNAL_HANDLER + + stored_lock_code = new_code + +/obj/structure/secure_safe/ex_act(severity, target) + if(severity <= EXPLODE_LIGHT) + return FALSE + return ..() + /obj/structure/secure_safe/hos name = "head of security's safe" @@ -73,15 +164,16 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/secure_safe, 32) It is made out of the same material as the station's Black Box and is designed to resist all conventional weaponry. \ There appears to be a small amount of surface corrosion. It doesn't look like it could withstand much of an explosion.\ Due to the expensive material, it was made incredibly small to cut corners, leaving only enough room to fit something as slim as an ID card." - icon = 'icons/obj/structures.dmi' icon_state = "spare_safe" base_icon_state = "spare_safe" armor_type = /datum/armor/safe_caps_spare - max_integrity = 300 damage_deflection = 30 // prevents stealing the captain's spare using null rods/lavaland monsters/AP projectiles density = TRUE anchored_tabletop_offset = 6 - custom_materials = list(/datum/material/gold = SMALL_MATERIAL_AMOUNT) + custom_materials = list( + /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT*5, + /datum/material/gold = SHEET_MATERIAL_AMOUNT*3, + ) material_flags = MATERIAL_EFFECTS /datum/armor/safe_caps_spare diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm index 70d8b24cfd6f..06d2f744e312 100644 --- a/code/game/objects/structures/shower.dm +++ b/code/game/objects/structures/shower.dm @@ -374,7 +374,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) to_chat(living, span_warning("[src] is freezing!")) else if(current_temperature == SHOWER_BOILING) living.adjust_bodytemperature(35, 0, 500) - living.adjustFireLoss(5) + living.adjust_fire_loss(5) to_chat(living, span_danger("[src] is searing!")) @@ -384,10 +384,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) icon_state = "shower_frame" desc = "A shower frame, that needs a water recycler to finish construction." anchored = FALSE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/showerframe/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) /obj/structure/showerframe/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(tool, /obj/item/stock_parts/water_recycler)) diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index c3786e81e28e..e1debb4aab1f 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -14,8 +14,6 @@ var/is_editable = FALSE ///sign_change_name is used to make nice looking, alphabetized 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 @@ -25,12 +23,11 @@ /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) + if(mapload && !find_and_mount_on_atom(mark_for_late_init = TRUE)) + return INITIALIZE_HINT_LATELOAD -/obj/structure/sign/Destroy() - . = ..() - knock_down_callback = null +/obj/structure/sign/LateInitialize() + find_and_mount_on_atom(late_init = TRUE) /obj/structure/sign/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() @@ -54,17 +51,17 @@ /obj/structure/sign/wrench_act(mob/living/user, obj/item/wrench/I) . = ..() if(!buildable_sign) - return TRUE + return ITEM_INTERACT_FAILURE user.visible_message(span_notice("[user] starts removing [src]..."), \ span_notice("You start unfastening [src].")) I.play_tool_sound(src) if(!I.use_tool(src, user, 4 SECONDS)) - return TRUE + return ITEM_INTERACT_FAILURE playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) user.visible_message(span_notice("[user] unfastens [src]."), \ span_notice("You unfasten [src].")) - knock_down(user) - return TRUE + deconstruct(TRUE) + return ITEM_INTERACT_SUCCESS /obj/structure/sign/welder_act(mob/living/user, obj/item/I) . = ..() @@ -112,16 +109,8 @@ 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() +/obj/structure/sign/atom_deconstruct(disassembled) + var/turf/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. @@ -131,9 +120,7 @@ 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) inherit from the parent type. icon_state = "backing" @@ -142,19 +129,6 @@ is_editable = TRUE sign_change_name = "Blank Sign" -/obj/structure/sign/nanotrasen - name = "\improper Nanotrasen logo sign" - sign_change_name = "Corporate Logo - Nanotrasen" - desc = "A sign with the Nanotrasen logo on it. Glory to Nanotrasen!" - icon_state = "nanotrasen" - is_editable = TRUE - -/obj/structure/sign/logo - name = "\improper Nanotrasen logo sign" - desc = "The Nanotrasen corporate logo." - icon_state = "nanotrasen_sign1" - buildable_sign = FALSE - /obj/item/sign name = "sign backing" desc = "A plastic sign backing, use a pen to change the decal. It can be placed on a wall." @@ -191,32 +165,35 @@ context[SCREENTIP_CONTEXT_LMB] = "Change design" return CONTEXTUAL_SCREENTIP_SET -/obj/item/sign/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) - if(is_editable && IS_WRITING_UTENSIL(I)) - if(!length(GLOB.editable_sign_types)) - CRASH("GLOB.editable_sign_types failed to populate") - var/choice = tgui_input_list(user, "Select a sign type", "Sign Customization", GLOB.editable_sign_types) - if(isnull(choice)) - return - if(!Adjacent(user)) //Make sure user is adjacent still. - to_chat(user, span_warning("You need to stand next to the sign to change it!")) - return - user.visible_message(span_notice("You begin changing [src].")) - if(!do_after(user, 4 SECONDS, target = src)) - return - set_sign_type(GLOB.editable_sign_types[choice]) - user.visible_message(span_notice("You finish changing the sign.")) - return - return ..() +/obj/item/sign/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!is_editable || !IS_WRITING_UTENSIL(tool)) + return ..() + if(!length(GLOB.editable_sign_types)) + CRASH("GLOB.editable_sign_types failed to populate") + var/choice = tgui_input_list(user, "Select a sign type", "Sign Customization", GLOB.editable_sign_types) + if(isnull(choice)) + return ITEM_INTERACT_BLOCKING + if(!Adjacent(user)) //Make sure user is adjacent still. + to_chat(user, span_warning("You need to stand next to the sign to change it!")) + return ITEM_INTERACT_BLOCKING + user.visible_message(span_notice("You begin changing [src].")) + if(!do_after(user, 4 SECONDS, target = src)) + return ITEM_INTERACT_BLOCKING + set_sign_type(GLOB.editable_sign_types[choice]) + user.visible_message(span_notice("You finish changing the sign.")) + return ITEM_INTERACT_SUCCESS /obj/item/sign/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!iswallturf(interacting_with) && !istype(interacting_with, /obj/structure/tram)) return NONE var/turf/target_turf = interacting_with var/turf/user_turf = get_turf(user) + var/dir = get_dir(user_turf, target_turf) + if(!(dir in GLOB.cardinals)) + balloon_alert(user, "stand in line with wall!") + return ITEM_INTERACT_BLOCKING var/obj/structure/sign/placed_sign = new sign_path(user_turf) //We place the sign on the turf the user is standing, and pixel shift it to the target wall, as below. //This is to mimic how signs and other wall objects are usually placed by mappers, and so they're only visible from one side of a wall. - var/dir = get_dir(user_turf, target_turf) if(dir & NORTH) placed_sign.pixel_y = 32 else if(dir & SOUTH) @@ -230,7 +207,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) + placed_sign.AddComponent(/datum/component/atom_mounted, target_turf) qdel(src) return ITEM_INTERACT_SUCCESS @@ -252,6 +229,9 @@ atom_integrity = max_integrity return TRUE +/obj/item/sign/screwdriver_act(mob/living/user, obj/item/tool) + return interact_with_atom(get_step(get_turf(user), user.dir), user) + /obj/item/sign/proc/set_sign_type(obj/structure/sign/fake_type) name = initial(fake_type.name) if(fake_type != /obj/structure/sign/blank) diff --git a/code/game/objects/structures/signs/signs_interactive.dm b/code/game/objects/structures/signs/signs_interactive.dm index 5ef9031fef93..e8b98ac3473b 100644 --- a/code/game/objects/structures/signs/signs_interactive.dm +++ b/code/game/objects/structures/signs/signs_interactive.dm @@ -8,7 +8,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/clock, 32) /obj/structure/sign/clock/examine(mob/user) . = ..() . += span_info("The current CST (local) time is: [station_time_timestamp()].") - . += span_info("The current TCT (galactic) time is: [time2text(world.realtime, "hh:mm:ss", 0)].") + //. += span_info("The current TCT (galactic) time is: [time2text(world.realtime, "hh:mm:ss", 0)].") DARKPACK EDIT REMOVAL /obj/structure/sign/calendar name = "wall calendar" diff --git a/code/game/objects/structures/signs/signs_maps.dm b/code/game/objects/structures/signs/signs_maps.dm index a6701ed7e909..8bfd2aebbd07 100644 --- a/code/game/objects/structures/signs/signs_maps.dm +++ b/code/game/objects/structures/signs/signs_maps.dm @@ -23,6 +23,9 @@ /obj/structure/sign/map/meta/right icon_state = "map-right-MS" +/obj/structure/sign/map/pubby + icon_state = "map-pubby" + /obj/structure/sign/directions/science name = "science department sign" desc = "A direction sign, pointing out which way the Science department is." diff --git a/code/game/objects/structures/signs/signs_misc.dm b/code/game/objects/structures/signs/signs_misc.dm index 8cf802fc939b..b167f62ec9d1 100644 --- a/code/game/objects/structures/signs/signs_misc.dm +++ b/code/game/objects/structures/signs/signs_misc.dm @@ -109,3 +109,18 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/xenobio_guide, 32) return data MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/tram_plate, 32) + +/obj/structure/sign/nanotrasen + name = "\improper Nanotrasen logo sign" + sign_change_name = "Corporate Logo - Nanotrasen" + desc = "A sign with the Nanotrasen logo on it. Glory to Nanotrasen!" + icon_state = "nanotrasen" + is_editable = TRUE + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/nanotrasen, 32) + +/obj/structure/sign/logo + name = "\improper Nanotrasen logo sign" + desc = "The Nanotrasen corporate logo." + icon_state = "nanotrasen_sign1" + buildable_sign = FALSE diff --git a/code/game/objects/structures/signs/signs_warning.dm b/code/game/objects/structures/signs/signs_warning.dm index db44c75669d8..7f92f111f237 100644 --- a/code/game/objects/structures/signs/signs_warning.dm +++ b/code/game/objects/structures/signs/signs_warning.dm @@ -11,6 +11,7 @@ is_editable = TRUE MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/warning, 32) +MAPPING_DIAGONAL_HELPERS(/obj/structure/sign/warning, 32) /obj/structure/sign/warning/secure_area name = "\improper SECURE AREA sign" @@ -18,6 +19,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/warning, 32) desc = "A warning sign which reads 'SECURE AREA'." MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/warning/secure_area, 32) +MAPPING_DIAGONAL_HELPERS(/obj/structure/sign/warning/secure_area, 32) /obj/structure/sign/warning/docking name = "\improper KEEP CLEAR: DOCKING AREA sign" diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index a98871a95b52..e91c77e5a4cf 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -221,7 +221,7 @@ /obj/structure/spawner/nether/process(seconds_per_tick) for(var/mob/living/living_mob in contents) playsound(src, 'sound/effects/magic/demon_consume.ogg', 50, TRUE) - living_mob.adjustBruteLoss(60 * seconds_per_tick) + living_mob.adjust_brute_loss(60 * seconds_per_tick) new /obj/effect/gibspawner/generic(get_turf(living_mob), living_mob) if(living_mob.stat == DEAD) var/mob/living/basic/blankbody/newmob = new(loc) @@ -280,7 +280,7 @@ . = ..() if(!IS_CULTIST(user) && isliving(user)) var/mob/living/living_user = user - living_user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15) + living_user.adjust_organ_loss(ORGAN_SLOT_BRAIN, 15) . += span_danger("The voices of the damned echo relentlessly in your mind, continously rebounding on the walls of your self the more you focus on [src]. Your head pounds, better keep away...") else . += span_cult("The gateway will create one weak proteon construct every [spawn_time * 0.1] seconds, up to a total of [max_mobs], that may be controlled by the spirits of the dead.") diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm index 00fa242a725f..fb1d58f0d58e 100644 --- a/code/game/objects/structures/stairs.dm +++ b/code/game/objects/structures/stairs.dm @@ -2,6 +2,9 @@ #define STAIR_TERMINATOR_NO 1 #define STAIR_TERMINATOR_YES 2 +/// Range within which stair indicators will appear for approaching mobs +#define STAIR_INDICATOR_RANGE 3 + // dir determines the direction of travel to go upwards // stairs require /turf/open/openspace as the tile above them to work, unless your stairs have 'force_open_above' set to TRUE // multiple stair objects can be chained together; the Z level transition will happen on the final stair object in the chain @@ -10,12 +13,23 @@ name = "stairs" icon = 'modular_darkpack/master_files/icons/obj/stairs.dmi' // DARKPACK EDIT CHANGE icon_state = "stairs" + base_icon_state = "stairs" anchored = TRUE move_resist = INFINITY - - var/force_open_above = FALSE // replaces the turf above this stair obj with /turf/open/openspace - var/terminator_mode = STAIR_TERMINATOR_AUTOMATIC - var/turf/listeningTo + plane = FLOOR_PLANE + layer = ABOVE_OPEN_TURF_LAYER + + max_integrity = 500 // DARKPACK EDIT CHANGE + /// If TRUE replaces the turf above this stair obj with /turf/open/openspace + var/force_open_above = FALSE + /// Determines if this stair is the last in a "chain" of stairs, ie next step is upstairs + VAR_FINAL/terminator_mode = STAIR_TERMINATOR_AUTOMATIC + /// Upstairs turf. Is observed for changes if force_open_above is TRUE (to re-open if necessary) + VAR_FINAL/turf/directly_above + /// If TRUE, we have left/middle/right sprites. + var/has_merged_sprites = TRUE + /// Lazyassoc list of weakef to mob viewing stair indicators to their images + VAR_PRIVATE/list/mob_to_image /obj/structure/stairs/north dir = NORTH @@ -31,49 +45,94 @@ /obj/structure/stairs/wood icon_state = "stairs_wood" + has_merged_sprites = FALSE /obj/structure/stairs/stone icon_state = "stairs_stone" + has_merged_sprites = FALSE /obj/structure/stairs/material icon_state = "stairs_material" material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + has_merged_sprites = FALSE /obj/structure/stairs/Initialize(mapload) + . = ..() + GLOB.stairs += src if(force_open_above) force_open_above() build_signal_listener() update_surrounding() - var/static/list/loc_connections = list( - COMSIG_ATOM_EXIT = PROC_REF(on_exit), + var/static/list/exit_connections = list( + COMSIG_ATOM_EXIT = PROC_REF(on_exit_stairs), ) - AddElement(/datum/element/connect_loc, loc_connections) + AddElement(/datum/element/connect_loc, exit_connections) + + var/static/list/range_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_enter_range), + COMSIG_ATOM_EXITED = PROC_REF(on_exit_range), + ) + AddComponent(/datum/component/connect_range, tracked = src, connections = range_connections, range = STAIR_INDICATOR_RANGE) - return ..() /obj/structure/stairs/Destroy() - listeningTo = null + if(directly_above) + UnregisterSignal(directly_above, COMSIG_TURF_MULTIZ_NEW) + directly_above = null + for(var/climber_ref in mob_to_image) + clear_climber_image(climber_ref, instant = TRUE) GLOB.stairs -= src return ..() -/obj/structure/stairs/Move() //Look this should never happen but... +/obj/structure/stairs/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) //Look this should never happen but... . = ..() if(force_open_above) build_signal_listener() update_surrounding() +/// Updates the sprite and the sprites of neighboring stairs to reflect merged sprites /obj/structure/stairs/proc/update_surrounding() + if(!has_merged_sprites) + return + update_appearance() - for(var/i in GLOB.cardinals) - var/turf/T = get_step(get_turf(src), i) - var/obj/structure/stairs/S = locate() in T - if(S) - S.update_appearance() -/obj/structure/stairs/proc/on_exit(datum/source, atom/movable/leaving, direction) + for(var/obj/structure/stairs/stair in get_step(src, turn(dir, 90))) + stair.update_appearance() + + for(var/obj/structure/stairs/stair in get_step(src, turn(dir, -90))) + stair.update_appearance() + +/obj/structure/stairs/update_icon_state() + . = ..() + if(!has_merged_sprites) + return + + var/has_left_stairs = FALSE + var/has_right_stairs = FALSE + for(var/obj/structure/stairs/stair in get_step(src, turn(dir, 90))) + if(stair.dir == dir) + has_left_stairs = TRUE + break + + for(var/obj/structure/stairs/stair in get_step(src, turn(dir, -90))) + if(stair.dir == dir) + has_right_stairs = TRUE + break + + if(has_left_stairs && has_right_stairs) + icon_state = "[base_icon_state]-m" + else if(has_left_stairs) + icon_state = "[base_icon_state]-r" + else if(has_right_stairs) + icon_state = "[base_icon_state]-l" + else + icon_state = base_icon_state + +/obj/structure/stairs/proc/on_exit_stairs(datum/source, atom/movable/leaving, direction) SIGNAL_HANDLER if(leaving == src) @@ -85,19 +144,95 @@ leaving.Bump(src) return COMPONENT_ATOM_BLOCK_EXIT +#define POINT_X_COMPONENT(pdir) ((pdir & EAST) ? 2 : ((pdir & WEST) ? -2 : 0)) +#define POINT_Y_COMPONENT(pdir) ((pdir & SOUTH) ? 2 : ((pdir & NORTH) ? -2 : 0)) + +/obj/structure/stairs/proc/on_enter_range(datum/source, atom/movable/entered) + SIGNAL_HANDLER + + if(!isliving(entered)) + return + + var/mob/living/climber = entered + var/datum/weakref/climber_ref = WEAKREF(climber) + if(!climber.client || !climber.client.prefs.read_preference(/datum/preference/toggle/stair_indicator)) + return + if(climber.dir == REVERSE_DIR(dir)) + return // walking away + if(LAZYACCESS(mob_to_image, climber_ref)) + return // already see it + if(!(climber in viewers(STAIR_INDICATOR_RANGE + 1, src))) + return // can't see the staircase (+1 tile for some leeway) + if(!isopenturf(get_step_multiz(src, UP))) + return // no place to go up to + + var/image/pointing_image = get_pointing_image() + climber.client.images += pointing_image + pointing_image.alpha = 0 + animate(pointing_image, pixel_x = POINT_X_COMPONENT(dir), pixel_y = POINT_Y_COMPONENT(dir), time = 0.5 SECONDS, easing = SINE_EASING|EASE_OUT, loop = -1, tag = "point_xy") + animate(pixel_x = 0, pixel_y = 0, time = 0.5 SECONDS, easing = SINE_EASING|EASE_IN) + animate(pointing_image, alpha = 180, time = 0.75 SECONDS, tag = "point_fadein") + LAZYSET(mob_to_image, climber_ref, pointing_image) + +/obj/structure/stairs/proc/on_exit_range(datum/source, atom/movable/exited) + SIGNAL_HANDLER + + if(!isliving(exited)) + return + + var/datum/weakref/climber_ref = WEAKREF(exited) + if(!LAZYACCESS(mob_to_image, climber_ref)) + return // not seeing anything + if(exited in viewers(STAIR_INDICATOR_RANGE, src)) + return // still in range and can see the staircase + + clear_climber_image(climber_ref) + +/obj/structure/stairs/proc/clear_climber_image(datum/weakref/climber_ref, instant = FALSE) + var/image/pointing_image = LAZYACCESS(mob_to_image, climber_ref) + if(!pointing_image) + LAZYREMOVE(mob_to_image, climber_ref) // just in case + return + if(instant) + clear_climber_image_callback(climber_ref, pointing_image) + return + + animate(pointing_image, alpha = 0, time = 0.75 SECONDS, tag = "point_fadeout") + // note: the player won't see a new indicator until the image is fully a removed, so this timer also serves as a cooldown + addtimer(CALLBACK(src, PROC_REF(clear_climber_image_callback), climber_ref, pointing_image), 1.5 SECONDS, TIMER_UNIQUE) + +/obj/structure/stairs/proc/clear_climber_image_callback(datum/weakref/climber_ref, image/pointing_image) + PRIVATE_PROC(TRUE) + var/mob/living/climber = climber_ref?.resolve() + climber?.client?.images -= pointing_image + LAZYREMOVE(mob_to_image, climber_ref) + +/obj/structure/stairs/proc/get_pointing_image() + PROTECTED_PROC(TRUE) + var/image/point_image = image('icons/hud/screen_gen.dmi', src, "arrow_large_white_still") + point_image.color = COLOR_DARK_MODERATE_LIME_GREEN + point_image.appearance_flags |= KEEP_APART + point_image.transform = matrix().Turn(dir2angle(REVERSE_DIR(dir))) + point_image.layer = BELOW_MOB_LAYER + SET_PLANE(point_image, GAME_PLANE, src) + return point_image + +#undef POINT_X_COMPONENT +#undef POINT_Y_COMPONENT + /obj/structure/stairs/Cross(atom/movable/AM) if(isTerminator() && (get_dir(src, AM) == dir)) return FALSE return ..() /obj/structure/stairs/proc/stair_ascend(atom/movable/climber) - var/turf/checking = get_step_multiz(get_turf(src), UP) + var/turf/checking = get_step_multiz(src, UP) if(!istype(checking)) return // I'm only interested in if the pass is unobstructed, not if the mob will actually make it if(!climber.can_z_move(UP, get_turf(src), checking, z_move_flags = ZMOVE_ALLOW_BUCKLED)) return - var/turf/target = get_step_multiz(get_turf(src), (dir|UP)) + var/turf/target = get_step_multiz(src, dir|UP) if(istype(target) && !climber.can_z_move(DOWN, target, z_move_flags = ZMOVE_FALL_FLAGS)) //Don't throw them into a tile that will just dump them back down. climber.zMove(target = target, z_move_flags = ZMOVE_STAIRS_FLAGS) /// Moves anything that's being dragged by src or anything buckled to it to the stairs turf. @@ -113,22 +248,22 @@ if(var_name != NAMEOF(src, force_open_above)) return if(!var_value) - if(listeningTo) - UnregisterSignal(listeningTo, COMSIG_TURF_MULTIZ_NEW) - listeningTo = null + if(directly_above) + UnregisterSignal(directly_above, COMSIG_TURF_MULTIZ_NEW) + directly_above = null else build_signal_listener() force_open_above() /obj/structure/stairs/proc/build_signal_listener() - if(listeningTo) - UnregisterSignal(listeningTo, COMSIG_TURF_MULTIZ_NEW) - var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) + if(directly_above) + UnregisterSignal(directly_above, COMSIG_TURF_MULTIZ_NEW) + var/turf/open/openspace/T = get_step_multiz(src, UP) RegisterSignal(T, COMSIG_TURF_MULTIZ_NEW, PROC_REF(on_multiz_new)) - listeningTo = T + directly_above = T /obj/structure/stairs/proc/force_open_above() - var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) + var/turf/open/openspace/T = get_step_multiz(src, UP) if(T && !istype(T)) T.ChangeTurf(/turf/open/openspace, flags = CHANGETURF_INHERIT_AIR) @@ -136,7 +271,7 @@ SIGNAL_HANDLER if(dir == UP) - var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) + var/turf/open/openspace/T = get_step_multiz(src, UP) if(T && !istype(T)) T.ChangeTurf(/turf/open/openspace, flags = CHANGETURF_INHERIT_AIR) @@ -192,6 +327,7 @@ icon_state = "stairs_frame" density = FALSE anchored = FALSE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5) /// What type of stack will this drop on deconstruction? var/frame_stack = /obj/item/stack/rods /// How much of frame_stack should this drop on deconstruction? @@ -199,12 +335,13 @@ /obj/structure/stairs_frame/wood name = "wooden stairs frame" - desc = "Everything you need to build a staircase, minus the actual stairs, this one is made of wood." + desc = "Everything you need to build a staircase, minus the actual stairs. This one is made of wood." frame_stack = /obj/item/stack/sheet/mineral/wood + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 10) /obj/structure/stairs_frame/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) /obj/structure/stairs_frame/examine(mob/living/carbon/human/user) . = ..() @@ -282,3 +419,5 @@ #undef STAIR_TERMINATOR_AUTOMATIC #undef STAIR_TERMINATOR_NO #undef STAIR_TERMINATOR_YES + +#undef STAIR_INDICATOR_RANGE diff --git a/code/game/objects/structures/steps.dm b/code/game/objects/structures/steps.dm index a8e27e0b21a6..70eee9cb3d7c 100644 --- a/code/game/objects/structures/steps.dm +++ b/code/game/objects/structures/steps.dm @@ -6,6 +6,7 @@ icon_state = "iron" anchored = TRUE move_resist = INFINITY + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/steps/Initialize(mapload) . = ..() @@ -16,7 +17,7 @@ AddElement(/datum/element/connect_loc, loc_connections) AddComponent(/datum/component/climb_walkable) - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) register_context() /obj/structure/steps/add_context(atom/source, list/context, obj/item/held_item, mob/user) diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index 36ae8e5fb704..f5df2da0fa57 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -17,6 +17,7 @@ density = FALSE anchored = FALSE layer = PROJECTILE_HIT_THRESHHOLD_LAYER + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) max_integrity = 100 var/framestack = /obj/item/stack/rods var/framestackamount = 2 @@ -97,6 +98,7 @@ framestack = /obj/item/stack/sheet/mineral/wood framestackamount = 2 resistance_flags = FLAMMABLE + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/table_frame/wood/get_table_type(obj/item/stack/our_stack) if(istype(our_stack, /obj/item/stack/sheet/mineral/wood)) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 894425ce174b..75bd2e5ac047 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -91,10 +91,10 @@ make_climbable() AddElement(/datum/element/give_turf_traits, string_list(turf_traits)) AddElement(/datum/element/footstep_override, priority = STEP_SOUND_TABLE_PRIORITY) - AddComponent(/datum/component/table_smash, gentle_push = slam_gently, after_smash = CALLBACK(src, PROC_REF(after_smash))) + AddElement(/datum/element/table_smash, gentle_push = slam_gently) /// Called after someone is harmfully smashed into us -/obj/structure/table/proc/after_smash(mob/living/smashed) +/obj/structure/table/after_smash(mob/living/smashed_onto) return // This is mostly for our children /// Applies additional properties based on the frame used to construct this table. @@ -427,7 +427,7 @@ return FALSE /obj/structure/table/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - if(rcd_data["[RCD_DESIGN_MODE]"] == RCD_DECONSTRUCT) + if(rcd_data[RCD_DESIGN_MODE] == RCD_DECONSTRUCT) qdel(src) return TRUE return FALSE @@ -552,6 +552,7 @@ COMSIG_ATOM_ENTERED = PROC_REF(on_entered), ) AddElement(/datum/element/connect_loc, loc_connections) + AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_AI_AVOID_TURF))) /obj/structure/table/glass/proc/on_entered(datum/source, atom/movable/AM) SIGNAL_HANDLER @@ -632,7 +633,7 @@ canSmoothWith = SMOOTH_GROUP_WOOD_TABLES custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT) -/obj/structure/table/wood/after_smash(mob/living/smashed) +/obj/structure/table/wood/after_smash(mob/living/smashed_onto) if(QDELETED(src) || prob(66)) return visible_message( @@ -641,9 +642,9 @@ ) playsound(src, 'sound/effects/wounds/crack2.ogg', 50, TRUE) - smashed.Knockdown(10 SECONDS) - smashed.Paralyze(2 SECONDS) - smashed.apply_damage(20, BRUTE) + smashed_onto.Knockdown(10 SECONDS) + smashed_onto.Paralyze(2 SECONDS) + smashed_onto.apply_damage(20, BRUTE) deconstruct(FALSE) /obj/structure/table/wood/narsie_act(total_override = TRUE) @@ -858,7 +859,7 @@ canSmoothWith = SMOOTH_GROUP_BRONZE_TABLES can_flip = FALSE -/obj/structure/table/bronze/after_smash(mob/living/pushed_mob) +/obj/structure/table/bronze/after_smash(mob/living/smashed_onto) playsound(src, 'sound/effects/magic/clockwork/fellowship_armory.ogg', 50, TRUE) /obj/structure/table/reinforced/rglass @@ -937,6 +938,7 @@ var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(mark_patient), + COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON = PROC_REF(mark_patient), COMSIG_ATOM_EXITED = PROC_REF(unmark_patient), ) AddElement(/datum/element/connect_loc, loc_connections) @@ -1045,15 +1047,15 @@ buckled.remove_offsets(type) /// Any mob that enters our tile will be marked as a potential patient. They will be turned into a patient if they lie down. -/obj/structure/table/optable/proc/mark_patient(datum/source, mob/living/carbon/potential_patient) +/obj/structure/table/optable/proc/mark_patient(datum/source, mob/living/potential_patient) SIGNAL_HANDLER if(!istype(potential_patient)) return - RegisterSignal(potential_patient, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(recheck_patient)) + RegisterSignal(potential_patient, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(recheck_patient), TRUE) recheck_patient(potential_patient) // In case the mob is already lying down before they entered. /// Unmark the potential patient. -/obj/structure/table/optable/proc/unmark_patient(datum/source, mob/living/carbon/potential_patient) +/obj/structure/table/optable/proc/unmark_patient(datum/source, mob/living/potential_patient) SIGNAL_HANDLER if(!istype(potential_patient)) return @@ -1070,34 +1072,60 @@ if(patient && patient != potential_patient) return - if(potential_patient.body_position == LYING_DOWN && potential_patient.loc == loc) + if(IS_LYING_OR_CANNOT_LIE(potential_patient) && potential_patient.loc == loc) set_patient(potential_patient) return // Find another lying mob as a replacement. - for (var/mob/living/carbon/replacement_patient in loc.contents) - if(replacement_patient.body_position == LYING_DOWN) - set_patient(replacement_patient) - return + var/found_replacement + for (var/mob/living/replacement_patient in loc) + if(!IS_LYING_OR_CANNOT_LIE(replacement_patient)) + continue + if(iscarbon(found_replacement)) + break + else if(isliving(found_replacement) && !iscarbon(replacement_patient)) + continue // Prefer carbons over non-carbons. + found_replacement = replacement_patient - set_patient(null) + set_patient(found_replacement) /obj/structure/table/optable/proc/set_patient(mob/living/carbon/new_patient) if (patient) - UnregisterSignal(patient, list(COMSIG_MOB_SURGERY_STARTED, COMSIG_MOB_SURGERY_FINISHED)) + UnregisterSignal(patient, list( + SIGNAL_ADDTRAIT(TRAIT_READY_TO_OPERATE), + SIGNAL_REMOVETRAIT(TRAIT_READY_TO_OPERATE), + COMSIG_LIVING_BEING_OPERATED_ON, + COMSIG_LIVING_SURGERY_FINISHED, + COMSIG_LIVING_UPDATING_SURGERY_STATE, + )) if (patient.external && patient.external == air_tank) patient.close_externals() patient = new_patient update_appearance() + computer?.update_static_data_for_all_viewers() if (!patient) return - RegisterSignal(patient, COMSIG_MOB_SURGERY_STARTED, PROC_REF(on_surgery_change)) - RegisterSignal(patient, COMSIG_MOB_SURGERY_FINISHED, PROC_REF(on_surgery_change)) + RegisterSignals(patient, list( + SIGNAL_ADDTRAIT(TRAIT_READY_TO_OPERATE), + SIGNAL_REMOVETRAIT(TRAIT_READY_TO_OPERATE), + COMSIG_LIVING_SURGERY_FINISHED, + COMSIG_LIVING_UPDATING_SURGERY_STATE, + ), PROC_REF(on_surgery_change)) + RegisterSignal(patient, COMSIG_LIVING_BEING_OPERATED_ON, PROC_REF(get_surgeries)) /obj/structure/table/optable/proc/on_surgery_change(datum/source) SIGNAL_HANDLER update_appearance() + computer?.update_static_data_batched() + +/obj/structure/table/optable/proc/get_surgeries(datum/source, mob/living/surgeon, list/operations) + SIGNAL_HANDLER + + if(isnull(computer)) + return + + operations |= computer.advanced_surgeries /obj/structure/table/optable/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if (istype(tool, /obj/item/clothing/mask/breath)) @@ -1149,7 +1177,7 @@ tool.play_tool_sound(src, 50) balloon_alert(user, "mask detached") UnregisterSignal(breath_mask, list(COMSIG_MOVABLE_MOVED, COMSIG_ITEM_DROPPED)) - if (user.CanReach(breath_mask)) + if (breath_mask.IsReachableBy(user)) user.put_in_hands(breath_mask) breath_mask = null update_appearance() @@ -1164,7 +1192,7 @@ air_tank.forceMove(drop_location()) tool.play_tool_sound(src, 50) balloon_alert(user, "tank detached") - if (user.CanReach(air_tank)) + if (air_tank.IsReachableBy(user)) user.put_in_hands(air_tank) if (patient?.external && patient.external == air_tank) patient.close_externals() @@ -1196,7 +1224,7 @@ . += span_notice("There's a port for a breathing mask tube on its side.") /obj/structure/table/optable/proc/detach_mask(mob/living/user) - if (!istype(user) || !user.CanReach(src) || !user.can_interact_with(src)) + if (!istype(user) || !IsReachableBy(user) || !user.can_interact_with(src)) return FALSE if (!breath_mask) @@ -1212,7 +1240,7 @@ return TRUE /obj/structure/table/optable/mouse_drop_dragged(atom/over, mob/living/user, src_location, over_location, params) - if (over != patient || !istype(user) || !user.CanReach(src) || !user.can_interact_with(src)) + if (over != patient || !istype(user) || !IsReachableBy(user) || !user.can_interact_with(src)) return if (!air_tank) @@ -1278,7 +1306,7 @@ . += mutable_appearance(icon, air_tank.tank_holder_icon_state) if (breath_mask?.loc == src) . += mutable_appearance(icon, "mask_[breath_mask.icon_state]") - if (!length(patient?.surgeries)) + if (!patient || !HAS_TRAIT(patient, TRAIT_READY_TO_OPERATE)) return . += mutable_appearance(icon, "[icon_state]_[computer ? "" : "un"]linked") if (computer) @@ -1442,4 +1470,3 @@ R.add_fingerprint(user) qdel(src) building = FALSE - diff --git a/code/game/objects/structures/toiletbong.dm b/code/game/objects/structures/toiletbong.dm index fa770dd75ee1..664cf9a00109 100644 --- a/code/game/objects/structures/toiletbong.dm +++ b/code/game/objects/structures/toiletbong.dm @@ -6,12 +6,13 @@ base_icon_state = "toiletbong" density = FALSE anchored = TRUE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.05, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.8) var/smokeradius = 1 var/mutable_appearance/weed_overlay /obj/structure/toiletbong/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) + AddElement(/datum/element/simple_rotation) create_storage(storage_type = /datum/storage/toiletbong) weed_overlay = mutable_appearance('icons/obj/watercloset.dmi', "[base_icon_state]_overlay") @@ -78,12 +79,11 @@ update_appearance(UPDATE_ICON) /obj/structure/toiletbong/wrench_act(mob/living/user, obj/item/tool) - ..() default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS ///Called in the simple rotation's post_rotation callback, playing a sound cue to players. -/obj/structure/toiletbong/proc/post_rotation(mob/user, degrees) +/obj/structure/toiletbong/post_rotation(mob/user, degrees) playsound(src, 'sound/items/deconstruct.ogg', 50) /obj/structure/toiletbong/crowbar_act(mob/living/user, obj/item/tool) @@ -94,9 +94,9 @@ if (!do_after(user, 10 SECONDS, target = src)) return FALSE new /obj/item/flamethrower(get_turf(src)) - new /obj/item/stack/sheet/iron(get_turf(src)) var/obj/item/tank/internals/plasma/ptank = new /obj/item/tank/internals/plasma(get_turf(src)) ptank.air_contents.gases[/datum/gas/plasma][MOLES] = (0) + drop_costum_materials() qdel(src) return TRUE 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 420e39f627d5..199345a5d6ce 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -15,7 +15,7 @@ /obj/structure/c_transit_tube/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) + AddElement(/datum/element/simple_rotation) /obj/structure/c_transit_tube/proc/can_wrench_in_loc(mob/user) var/turf/source_turf = get_turf(loc) @@ -27,7 +27,7 @@ return FALSE return TRUE -/obj/structure/c_transit_tube/proc/post_rotation(mob/user, degrees) +/obj/structure/c_transit_tube/post_rotation(mob/user, degrees) if(flipped_build_type && degrees == ROTATION_FLIP) setDir(turn(dir, degrees)) //Turn back we don't actually flip flipped = !flipped diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index 11f4817b94cf..a14a5137b020 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -217,7 +217,7 @@ /obj/structure/trap/damage/trap_effect(mob/living/victim) to_chat(victim, span_bolddanger("The ground quakes beneath your feet!")) victim.Paralyze(10 SECONDS) - victim.adjustBruteLoss(35) + victim.adjust_brute_loss(35) var/obj/structure/flora/rock/style_random/giant_rock = new(get_turf(src)) QDEL_IN(giant_rock, 20 SECONDS) diff --git a/code/game/objects/structures/votingbox.dm b/code/game/objects/structures/votingbox.dm index f31c8510d31a..8ab34de74ba5 100644 --- a/code/game/objects/structures/votingbox.dm +++ b/code/game/objects/structures/votingbox.dm @@ -9,7 +9,7 @@ icon_state = "votebox_maint" anchored = TRUE - + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 15) var/obj/item/card/id/owner //Slapping the box with this ID starts/ends the vote. var/voting_active = FALSE //Voting or Maintenance Mode diff --git a/code/game/objects/structures/water_structures/sink.dm b/code/game/objects/structures/water_structures/sink.dm index 47425b8f8a65..d3fcd3b732fa 100644 --- a/code/game/objects/structures/water_structures/sink.dm +++ b/code/game/objects/structures/water_structures/sink.dm @@ -105,13 +105,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14)) user.visible_message(span_notice("[user] washes [user.p_their()] [washing_face ? "face" : "hands"] using [src]."), \ span_notice("You wash your [washing_face ? "face" : "hands"] using [src].")) -/obj/structure/sink/attackby(obj/item/O, mob/living/user, list/modifiers, list/attack_modifiers) +/obj/structure/sink/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(busy) to_chat(user, span_warning("Someone's already washing here!")) return - if(is_reagent_container(O)) - var/obj/item/reagent_containers/RG = O + if(is_reagent_container(attacking_item)) + var/obj/item/reagent_containers/RG = attacking_item if(reagents.total_volume <= 0) to_chat(user, span_notice("\The [src] is dry.")) return FALSE @@ -124,8 +124,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14)) to_chat(user, span_notice("\The [RG] is full.")) return FALSE - if(istype(O, /obj/item/melee/baton/security)) - var/obj/item/melee/baton/security/baton = O + if(istype(attacking_item, /obj/item/melee/baton/security)) + var/obj/item/melee/baton/security/baton = attacking_item if(baton.cell?.charge && baton.active) flick("baton_active", src) user.Paralyze(baton.knockdown_time) @@ -136,69 +136,69 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14)) playsound(src, baton.on_stun_sound, 50, TRUE) return - if(istype(O, /obj/item/mop)) + if(istype(attacking_item, /obj/item/mop) || astype(attacking_item, /obj/item/rag)?.blood_level == 0) if(reagents.total_volume <= 0) to_chat(user, span_notice("\The [src] is dry.")) return FALSE - reagents.trans_to(O, 5, transferred_by = user) + reagents.trans_to(attacking_item, 5, transferred_by = user) begin_reclamation() - to_chat(user, span_notice("You wet [O] in [src].")) + to_chat(user, span_notice("You wet [attacking_item] in [src].")) playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) return - if(O.tool_behaviour == TOOL_WRENCH) - O.play_tool_sound(src) + if(attacking_item.tool_behaviour == TOOL_WRENCH) + attacking_item.play_tool_sound(src) deconstruct() return - if(O.tool_behaviour == TOOL_CROWBAR) + if(attacking_item.tool_behaviour == TOOL_CROWBAR) if(!has_water_reclaimer) to_chat(user, span_warning("There isn't a water recycler to remove.")) return - O.play_tool_sound(src) + attacking_item.play_tool_sound(src) has_water_reclaimer = FALSE new/obj/item/stock_parts/water_recycler(get_turf(loc)) to_chat(user, span_notice("You remove the water reclaimer from [src].")) return - if(istype(O, /obj/item/stock_parts/water_recycler)) + if(istype(attacking_item, /obj/item/stock_parts/water_recycler)) if(has_water_reclaimer) to_chat(user, span_warning("There is already has a water recycler installed.")) return playsound(src, 'sound/machines/click.ogg', 20, TRUE) - qdel(O) + qdel(attacking_item) has_water_reclaimer = TRUE begin_reclamation() return - if(istype(O, /obj/item/storage/fancy/pickles_jar)) - if(O.contents.len) + if(istype(attacking_item, /obj/item/storage/fancy/pickles_jar)) + if(attacking_item.contents.len) to_chat(user, span_notice("Looks like there's something left in the jar")) return - new /obj/item/reagent_containers/cup/beaker/large(loc) + qdel(attacking_item) to_chat(user, span_notice("You washed the jar, ridding it of the brine.")) - qdel(O) + user.put_in_active_hand(new /obj/item/reagent_containers/cup/beaker/large(loc)) return - if(!istype(O)) + if(!istype(attacking_item)) return - if(O.item_flags & ABSTRACT) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand. + if(attacking_item.item_flags & ABSTRACT) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand. return - if(!user.combat_mode || (O.item_flags & NOBLUDGEON)) - to_chat(user, span_notice("You start washing [O]...")) + if(!user.combat_mode || (attacking_item.item_flags & NOBLUDGEON)) + to_chat(user, span_notice("You start washing [attacking_item]...")) playsound(src, 'sound/machines/sink-faucet.ogg', 50) busy = TRUE if(!do_after(user, 4 SECONDS, target = src)) busy = FALSE return 1 busy = FALSE - O.wash(CLEAN_WASH) - reagents.expose(O, TOUCH, 5 / max(reagents.total_volume, 5)) - user.visible_message(span_notice("[user] washes [O] using [src]."), \ - span_notice("You wash [O] using [src].")) + attacking_item.wash(CLEAN_WASH) + reagents.expose(attacking_item, TOUCH, 5 / max(reagents.total_volume, 5)) + user.visible_message(span_notice("[user] washes [attacking_item] using [src]."), \ + span_notice("You wash [attacking_item] using [src].")) return 1 else return ..() @@ -251,7 +251,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/kitchen, (-16)) /obj/structure/sink/basin icon_state = "basin" -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/basin, (-14)) +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/basin, (-16)) // DARKPACK EDIT ADD END /obj/structure/sinkframe @@ -264,7 +264,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/basin, (-14)) /obj/structure/sinkframe/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) /obj/structure/sinkframe/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(tool, /obj/item/stock_parts/water_recycler)) diff --git a/code/game/objects/structures/water_structures/toilet.dm b/code/game/objects/structures/water_structures/toilet.dm index df9740126584..890736740bc2 100644 --- a/code/game/objects/structures/water_structures/toilet.dm +++ b/code/game/objects/structures/water_structures/toilet.dm @@ -6,6 +6,7 @@ base_icon_state = "toilet" density = FALSE anchored = TRUE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) /// Boolean if whether the toilet is currently flushing. var/flushing = FALSE @@ -17,10 +18,6 @@ var/w_items = 0 /// Reference to the mob being given a swirlie. var/mob/living/swirlie - /// The type of material used to build the toilet. - var/buildstacktype = /obj/item/stack/sheet/iron - /// How much of the buildstacktype is needed to construct the toilet. - var/buildstackamount = 1 /// Lazylist of items in the cistern. var/list/cistern_items /// Lazylist of fish in the toilet, not to be mixed with the items in the cistern. Max of 3 @@ -119,7 +116,7 @@ playsound(src.loc, SFX_SWING_HIT, 25, TRUE) swirlie.visible_message(span_danger("[user] slams the toilet seat onto [swirlie]'s head!"), span_userdanger("[user] slams the toilet seat onto your head!"), span_hear("You hear reverberating porcelain.")) log_combat(user, swirlie, "swirlied (brute)") - swirlie.adjustBruteLoss(5) + swirlie.adjust_brute_loss(5) return if(user.pulling && isliving(user.pulling)) @@ -151,10 +148,10 @@ var/mob/living/carbon/carbon_grabbed = grabbed_mob if(!carbon_grabbed.internal) log_combat(user, carbon_grabbed, "swirlied (oxy)") - carbon_grabbed.adjustOxyLoss(5) + carbon_grabbed.adjust_oxy_loss(5) else log_combat(user, grabbed_mob, "swirlied (oxy)") - grabbed_mob.adjustOxyLoss(5) + grabbed_mob.adjust_oxy_loss(5) if(was_alive && swirlie.stat == DEAD && swirlie.client) swirlie.client.give_award(/datum/award/achievement/misc/swirlie, swirlie) // just like space high school all over again! swirlie = null @@ -162,10 +159,10 @@ playsound(src.loc, 'sound/effects/bang.ogg', 25, TRUE) grabbed_mob.visible_message(span_danger("[user] slams [grabbed_mob.name] into [src]!"), span_userdanger("[user] slams you into [src]!")) log_combat(user, grabbed_mob, "toilet slammed") - grabbed_mob.adjustBruteLoss(5) + grabbed_mob.adjust_brute_loss(5) return - if(cistern_open && !cover_open && user.CanReach(src)) + if(cistern_open && !cover_open && IsReachableBy(user)) if(!LAZYLEN(cistern_items)) to_chat(user, span_notice("The cistern is empty.")) return @@ -232,18 +229,15 @@ if(!flushing && cover_open) . += "[base_icon_state]-water" -/obj/structure/toilet/atom_deconstruct(dissambled = TRUE) - for(var/obj/toilet_item in cistern_items) +/obj/structure/toilet/dump_contents() + for(var/obj/toilet_item in (cistern_items + fishes)) toilet_item.forceMove(drop_location()) - if(buildstacktype) - new buildstacktype(loc,buildstackamount) - else - for(var/datum/material/M as anything in custom_materials) - new M.sheet_type(loc, FLOOR(custom_materials[M] / SHEET_MATERIAL_AMOUNT, 1)) + +/obj/structure/toilet/atom_deconstruct(dissambled = TRUE) + dump_contents() + drop_costum_materials() if(has_water_reclaimer) new /obj/item/stock_parts/water_recycler(drop_location()) - if(stuck_item) - stuck_item.forceMove(drop_location()) /obj/structure/toilet/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if(user.combat_mode) @@ -395,7 +389,7 @@ /obj/structure/toilet/greyscale material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS - buildstacktype = null + custom_materials = null has_water_reclaimer = FALSE /obj/structure/toilet/secret @@ -408,3 +402,29 @@ secret.desc += " It's a secret!" w_items += secret.w_class LAZYADD(cistern_items, secret) + +///A toilet made of meat that only drops remains when deconstructed, often unleashed unto this cursed plane of existence by hopeless people off'ing themselves with experi-scanners. +/obj/structure/toilet/greyscale/flesh + desc = "A horrendous mass of fused flesh resembling a standard-issue HT-451 model toilet. How it manages to function as one is beyond you. \ + This one seems to be made out of the flesh of a devoted employee of the RnD department." + +/obj/structure/toilet/greyscale/flesh/Initialize(mapload, mob/living/carbon/suicide) + . = ..() + ///The suicide victim's brain that will be placed inside the toilet's cistern + var/obj/item/organ/brain/toilet_brain + if(suicide) + toilet_brain = suicide.get_organ_slot(ORGAN_SLOT_BRAIN) + suicide.gib(DROP_BRAIN) //we delete everything but the brain, as it's going to be moved to the cistern + set_custom_materials(list(GET_MATERIAL_REF(/datum/material/meat/mob_meat, suicide) = SHEET_MATERIAL_AMOUNT)) + else + toilet_brain = new(drop_location()) + set_custom_materials(list(/datum/material/meat = SHEET_MATERIAL_AMOUNT)) + + toilet_brain.forceMove(src) + w_items += toilet_brain.w_class + +//this also prevents the toilet from dropping meat sheets. if you want to cheese the meat exepriments, sacrifice more people +/obj/structure/toilet/greyscale/flesh/atom_deconstruct(dissambled = TRUE) + for(var/obj/toilet_item in cistern_items) + toilet_item.forceMove(drop_location()) + new /obj/effect/decal/remains/human(loc) diff --git a/code/game/objects/structures/water_structures/urinal.dm b/code/game/objects/structures/water_structures/urinal.dm index 180c1b1649dc..f81b25de55ad 100644 --- a/code/game/objects/structures/water_structures/urinal.dm +++ b/code/game/objects/structures/water_structures/urinal.dm @@ -16,7 +16,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) . = ..() if(mapload) hidden_item = new /obj/item/food/urinalcake(src) - find_and_hang_on_wall() + find_and_mount_on_atom() /obj/structure/urinal/Exited(atom/movable/gone, direction) . = ..() @@ -37,7 +37,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) user.changeNext_move(CLICK_CD_MELEE) user.visible_message(span_danger("[user] slams [grabbed_mob] into [src]!"), span_danger("You slam [grabbed_mob] into [src]!")) grabbed_mob.emote("scream") - grabbed_mob.adjustBruteLoss(8) + grabbed_mob.adjust_brute_loss(8) else to_chat(user, span_warning("You need a tighter grip!")) return diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 62fa00a6457f..9107d6180c0f 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -8,9 +8,10 @@ anchored = FALSE density = FALSE dir = NORTH - obj_flags = CAN_BE_HIT | BLOCKS_CONSTRUCTION_DIR + obj_flags = CAN_BE_HIT | BLOCKS_CONSTRUCTION_DIR | UNIQUE_RENAME | RENAME_NO_DESC set_dir_on_move = FALSE can_atmos_pass = ATMOS_PASS_PROC + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 5, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5) /// Reference to the airlock electronics inside for determining window access. var/obj/item/electronics/airlock/electronics = null @@ -46,7 +47,7 @@ ) AddElement(/datum/element/connect_loc, loc_connections) - AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM) + AddElement(/datum/element/simple_rotation, ROTATION_NEEDS_ROOM) /obj/structure/windoor_assembly/Destroy() set_density(FALSE) @@ -251,17 +252,6 @@ electronics = null ae.forceMove(drop_location()) - else if(IS_WRITING_UTENSIL(W)) - var/t = tgui_input_text(user, "Enter the name for the door", "Windoor Renaming", created_name, max_length = MAX_NAME_LEN) - if(!t) - return - if(!in_range(src, usr) && loc != usr) - return - created_name = t - return - - - //Crowbar to complete the assembly, Step 7 complete. else if(W.tool_behaviour == TOOL_CROWBAR) if(!electronics) @@ -335,7 +325,7 @@ if(EAST,WEST) windoor.unres_sides &= ~NORTH windoor.unres_sides &= ~SOUTH - windoor.unres_sensor = TRUE + windoor.unres_latch = TRUE electronics.forceMove(windoor) windoor.electronics = electronics windoor.autoclose = TRUE @@ -367,3 +357,10 @@ update_appearance() return + +/obj/structure/windoor_assembly/nameformat(input, user) + created_name = input + return input + +/obj/structure/windoor_assembly/rename_reset() + created_name = initial(created_name) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 383f9d953b5d..071c696197a8 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -17,6 +17,7 @@ set_dir_on_move = FALSE flags_ricochet = RICOCHET_HARD receive_ricochet_chance_mod = 0.5 + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT) var/state = WINDOW_OUT_OF_FRAME var/reinf = FALSE var/heat_resistance = 800 @@ -68,7 +69,7 @@ flags_1 |= ALLOW_DARK_PAINTS_1 RegisterSignal(src, COMSIG_OBJ_PAINTED, PROC_REF(on_painted)) AddElement(/datum/element/atmos_sensitive, mapload) - AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) + AddElement(/datum/element/simple_rotation, ROTATION_NEEDS_ROOM) var/static/list/loc_connections = list( COMSIG_ATOM_EXIT = PROC_REF(on_exit), @@ -105,7 +106,7 @@ return FALSE /obj/structure/window/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - if(rcd_data["[RCD_DESIGN_MODE]"] == RCD_DECONSTRUCT) + if(rcd_data[RCD_DESIGN_MODE] == RCD_DECONSTRUCT) qdel(src) return TRUE return FALSE @@ -359,7 +360,7 @@ dropped_debris += new /obj/item/stack/rods(location, (fulltile ? 2 : 1)) return dropped_debris -/obj/structure/window/proc/post_rotation(mob/user, degrees) +/obj/structure/window/post_rotation(mob/user, degrees) air_update_turf(TRUE, FALSE) /obj/structure/window/proc/on_painted(obj/structure/window/source, mob/user, obj/item/toy/crayon/spraycan/spraycan, is_dark_color) @@ -424,7 +425,7 @@ ratio = CEILING(ratio*4, 1) * 25 if(ratio > 75) return - . += mutable_appearance('icons/obj/structures.dmi', "damage[ratio]", -(layer+0.1)) + . += mutable_appearance('modular_darkpack/modules/deprecated/icons/32x48.dmi', "damage[ratio]", -(layer+0.1)) // DARKPACK EDIT CHANGE /obj/structure/window/should_atmos_process(datum/gas_mixture/air, exposed_temperature) return exposed_temperature > T0C + heat_resistance @@ -495,6 +496,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/unanchored/spawner, 0) glass_type = /obj/item/stack/sheet/rglass rad_insulation = RAD_LIGHT_INSULATION receive_ricochet_chance_mod = 1.1 + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT, /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) //this is shitcode but all of construction is shitcode and needs a refactor, it works for now //If you find this like 4 years later and construction still hasn't been refactored, I'm so sorry for this @@ -618,14 +620,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/spawner, 0) MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/unanchored/spawner, 0) -// You can't rust glass! So only reinforced glass can be impacted. -/obj/structure/window/reinforced/rust_heretic_act() - add_atom_colour(COLOR_RUSTED_GLASS, FIXED_COLOUR_PRIORITY) - AddElement(/datum/element/rust) - set_armor(/datum/armor/none) - take_damage(get_integrity() * 0.5) - modify_max_integrity(initial(max_integrity) * 0.2) - /obj/structure/window/plasma name = "plasma window" desc = "A window made out of a plasma-silicate alloy. It looks insanely tough to break and burn through." @@ -638,6 +632,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/unanchored/spawner, glass_type = /obj/item/stack/sheet/plasmaglass rad_insulation = RAD_MEDIUM_INSULATION glass_material_datum = /datum/material/alloy/plasmaglass + custom_materials = list(/datum/material/alloy/plasmaglass = SHEET_MATERIAL_AMOUNT) /datum/armor/window_plasma melee = 80 @@ -668,6 +663,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/plasma/spawner, 0) glass_type = /obj/item/stack/sheet/plasmarglass rad_insulation = RAD_HEAVY_INSULATION glass_material_datum = /datum/material/alloy/plasmaglass + custom_materials = list(/datum/material/alloy/plasmaglass = SHEET_MATERIAL_AMOUNT, /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) /datum/armor/reinforced_plasma melee = 80 @@ -713,6 +709,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE glass_amount = 2 + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/window/fulltile/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(the_rcd.mode == RCD_DECONSTRUCT) @@ -734,6 +731,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE glass_amount = 2 + custom_materials = list(/datum/material/alloy/plasmaglass = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/window/plasma/fulltile/unanchored anchored = FALSE @@ -751,6 +749,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE glass_amount = 2 + custom_materials = list(/datum/material/alloy/plasmaglass = SHEET_MATERIAL_AMOUNT * 2, /datum/material/iron = SHEET_MATERIAL_AMOUNT) /obj/structure/window/reinforced/plasma/fulltile/unanchored anchored = FALSE @@ -771,6 +770,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE glass_amount = 2 + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, /datum/material/iron = SHEET_MATERIAL_AMOUNT) /obj/structure/window/reinforced/fulltile/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(the_rcd.mode == RCD_DECONSTRUCT) @@ -1008,6 +1008,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw icon = 'icons/obj/smooth_structures/structure_variations.dmi' icon_state = "clockwork_window-single" glass_type = /obj/item/stack/sheet/bronze + custom_materials = list(/datum/material/bronze = SHEET_MATERIAL_AMOUNT * 1) MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/bronze/spawner, 0) @@ -1026,6 +1027,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/bronze/spawner, 0) obj_flags = CAN_BE_HIT max_integrity = 50 glass_amount = 2 + custom_materials = list(/datum/material/bronze = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/window/bronze/fulltile/unanchored anchored = FALSE diff --git a/code/game/say.dm b/code/game/say.dm index 588e6946477a..5fa92db9c6d6 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -22,6 +22,14 @@ GLOBAL_LIST_INIT(freqtospan, list( "[FREQ_CTF_GREEN]" = "greenteamradio", "[FREQ_CTF_YELLOW]" = "yellowteamradio", "[FREQ_STATUS_DISPLAYS]" = "captaincast", + // DARKPACK EDIT START + "[FREQ_POLICE]" = "policeradio", + "[FREQ_CLINIC]" = "clinicradio", + "[FREQ_MILITARY]" = "militaryradio", + "[FREQ_CAMARILLA]" = "camarillaradio", + "[FREQ_ANARCH]" = "anarchradio", + "[FREQ_ENDRON]" = "endronradio", + // DARKPACK EDIT END )) /** @@ -68,7 +76,7 @@ GLOBAL_LIST_INIT(freqtospan, list( /// Called when this movable hears a message from a source. /// Returns TRUE if the message was received and understood. -/atom/movable/proc/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0) +/atom/movable/proc/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0, source) // DARKPACK EDIT, ORIGINAL: /atom/movable/proc/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0) SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) return TRUE @@ -139,7 +147,7 @@ GLOBAL_LIST_INIT(freqtospan, list( if (!CONFIG_GET(flag/tts_no_whisper) || (CONFIG_GET(flag/tts_no_whisper) && !message_mods[WHISPER_MODE])) 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, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), visible_name = FALSE) +/atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), visible_name = FALSE, source) // DARKPACK EDIT, ORIGINAL: /atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, 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/freq_color = get_radio_color(radio_freq, radio_freq_color) @@ -151,6 +159,28 @@ GLOBAL_LIST_INIT(freqtospan, list( //Speaker name var/namepart = speaker.get_message_voice(visible_name) + // DARKPACK EDIT START + var/atom/movable/reliable_narrator = speaker + if(istype(reliable_narrator, /atom/movable/virtualspeaker)) + var/atom/movable/virtualspeaker/fakespeaker = reliable_narrator + reliable_narrator = fakespeaker.source + + if(ismob(src) && (namepart != "Unknown") && ismob(reliable_narrator)) + var/mob/receiver_mob = src + if(receiver_mob.mind?.guestbook) + var/mob/speaker_human = reliable_narrator + var/known_name = receiver_mob.mind.guestbook.get_known_name(src, reliable_narrator, speaker_human.real_name) + if(known_name) + namepart = "[known_name]" + else + var/mob/living/carbon/human/human_narrator = reliable_narrator + namepart = "[human_narrator.get_generic_name(prefixed = TRUE, lowercase = TRUE)]" + + if(radio_freq >= USABLE_RADIO_FREQUENCY_FOR_PHONE_RANGE) + var/icon/phone_icon = icon('modular_darkpack/modules/phones/icons/chat_icon.dmi', "phone") + freqpart = icon2html(phone_icon, src) + // DARKPACK EDIT END + //End name span. var/endspanpart = "" @@ -165,7 +195,9 @@ GLOBAL_LIST_INIT(freqtospan, list( var/messagepart = speaker.generate_messagepart(raw_message, spans, message_mods) messagepart = " [messagepart]" - return "[spanpart1][spanpart2][freqpart][languageicon][compose_track_href(speaker, namepart)][namepart][compose_job(speaker, message_language, raw_message, radio_freq)][endspanpart][messagepart]" + var/obj/item/radio/radio = source // DARKPACK EDIT ADD + var/radio_id = radio?.radio_id ? "\[[radio?.radio_id]\] " : null // DARKPACK EDIT ADD + return "[spanpart1][spanpart2][freqpart][radio_id][languageicon][compose_track_href(speaker, namepart)][namepart][compose_job(speaker, message_language, raw_message, radio_freq)][endspanpart][messagepart]" // DARKPACK EDIT, ORIGINAL: return "[spanpart1][spanpart2][freqpart][languageicon][compose_track_href(speaker, namepart)][namepart][compose_job(speaker, message_language, raw_message, radio_freq)][endspanpart][messagepart]" /atom/movable/proc/compose_track_href(atom/movable/speaker, message_langs, raw_message, radio_freq) return "" diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index feb8f6c3dce5..d8af0f533fbf 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -37,7 +37,7 @@ /obj/machinery/power/shuttle_engine/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) register_context() if(!mapload) engine_state = ENGINE_UNWRENCHED diff --git a/code/game/sound/sound.dm b/code/game/sound/sound.dm index d68c1794e08d..d57ca4754ad1 100644 --- a/code/game/sound/sound.dm +++ b/code/game/sound/sound.dm @@ -32,6 +32,18 @@ if (!turf_source) return + //DARKPACK EDIT START - Quietus + // Check if the source or its loc is silenced + if(HAS_TRAIT(source, TRAIT_SILENCED)) + return + if(isliving(source.loc)) + var/mob/living/silenced_mob = source.loc + if(HAS_TRAIT(silenced_mob, TRAIT_SILENCED)) + return + //if(isturf(source)) because unarmed attacks playsound(turf) rather than playsound(mob) or whatever as others do + //what about grenades and bullet impact noises? + //DARKPACK EDIT END + //allocate a channel if necessary now so its the same for everyone channel = channel || SSsounds.random_available_channel() @@ -39,6 +51,9 @@ var/maxdistance = SOUND_RANGE + extrarange var/source_z = turf_source.z + if (falloff_distance >= maxdistance) + CRASH("playsound(): falloff_distance is equal to or higher than maxdistance! Bump up extrarange or reduce the falloff_distance.") + if(vary && !frequency) frequency = get_rand_frequency() // skips us having to do it per-sound later. should just make this a macro tbh @@ -179,13 +194,13 @@ SEND_SOUND(src, sound_to_use) -/proc/sound_to_playing_players(soundin, volume = 100, vary = FALSE, frequency = 0, channel = 0, pressure_affected = FALSE, sound/S) +/proc/sound_to_playing_players(soundin, volume = 100, vary = FALSE, frequency = 0, channel = 0, pressure_affected = FALSE, sound/S, datum/preference/numeric/volume/volume_preference = null) if(!S) S = sound(get_sfx(soundin)) for(var/m in GLOB.player_list) if(ismob(m) && !isnewplayer(m)) var/mob/M = m - M.playsound_local(M, null, volume, vary, frequency, null, channel, pressure_affected, S) + M.playsound_local(M, null, volume, vary, frequency, null, channel, pressure_affected, S, volume_preference = volume_preference) /mob/proc/stop_sound_channel(chan) SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = chan)) diff --git a/code/game/sound/sound_keys/sound_keys.dm b/code/game/sound/sound_keys/sound_keys.dm index 971f50c38727..52d97f4f8f60 100644 --- a/code/game/sound/sound_keys/sound_keys.dm +++ b/code/game/sound/sound_keys/sound_keys.dm @@ -847,3 +847,292 @@ key = SFX_RORO_WARBLE file_paths = list( 'sound/mobs/non-humanoids/roro/roro_warble.ogg') + +/datum/sound_effect/potted_plant_drop + key = SFX_POTTED_PLANT_DROP + file_paths = list( + 'sound/items/potted_plant/potted_plant_drop1.ogg', + 'sound/items/potted_plant/potted_plant_drop2.ogg', + 'sound/items/potted_plant/potted_plant_drop3.ogg', + 'sound/items/potted_plant/potted_plant_drop4.ogg', + 'sound/items/potted_plant/potted_plant_drop5.ogg', + ) + +/datum/sound_effect/potted_plant_pickup + key = SFX_POTTED_PLANT_PICKUP + file_paths = list( + 'sound/items/potted_plant/potted_plant_pickup1.ogg', + 'sound/items/potted_plant/potted_plant_pickup2.ogg', + 'sound/items/potted_plant/potted_plant_pickup3.ogg', + 'sound/items/potted_plant/potted_plant_pickup4.ogg', + 'sound/items/potted_plant/potted_plant_pickup5.ogg', + + ) + +/datum/sound_effect/goggles_pickup + key = SFX_GOGGLES_PICKUP + file_paths = list( + 'sound/items/goggles/goggles_pickup1.ogg', + 'sound/items/goggles/goggles_pickup2.ogg', + 'sound/items/goggles/goggles_pickup3.ogg', + ) + +/datum/sound_effect/goggles_drop + key = SFX_GOGGLES_DROP + file_paths = list( + 'sound/items/goggles/goggles_drop1.ogg', + 'sound/items/goggles/goggles_drop2.ogg', + 'sound/items/goggles/goggles_drop3.ogg', + ) + +/datum/sound_effect/goggles_equip + key = SFX_GOGGLES_EQUIP + file_paths = list( + 'sound/items/goggles/goggles_equip1.ogg', + 'sound/items/goggles/goggles_equip2.ogg', + 'sound/items/goggles/goggles_equip3.ogg', + 'sound/items/goggles/goggles_equip4.ogg', + ) + +/datum/sound_effect/glasses_pickup + key = SFX_GLASSES_PICKUP + file_paths = list( + 'sound/items/glasses/glasses_pickup1.ogg', + 'sound/items/glasses/glasses_pickup2.ogg', + 'sound/items/glasses/glasses_pickup3.ogg', + ) + +/datum/sound_effect/glasses_drop + key = SFX_GLASSES_DROP + file_paths = list( + 'sound/items/glasses/glasses_drop1.ogg', + 'sound/items/glasses/glasses_drop2.ogg', + 'sound/items/glasses/glasses_drop3.ogg', + ) + +/datum/sound_effect/glasses_equip + key = SFX_GLASSES_EQUIP + file_paths = list( + 'sound/items/glasses/glasses_equip1.ogg', + 'sound/items/glasses/glasses_equip2.ogg', + ) + +/datum/sound_effect/food_plate_pickup + key = SFX_FOOD_PLATE_PICKUP + file_paths = list( + 'sound/items/food_plate/food_plate_pickup1.ogg', + 'sound/items/food_plate/food_plate_pickup2.ogg', + 'sound/items/food_plate/food_plate_pickup3.ogg', + ) + +/datum/sound_effect/food_plate_drop + key = SFX_FOOD_PLATE_DROP + file_paths = list( + 'sound/items/food_plate/food_plate_drop1.ogg', + 'sound/items/food_plate/food_plate_drop2.ogg', + 'sound/items/food_plate/food_plate_drop3.ogg', + ) + +/datum/sound_effect/cutlery_pickup + key = SFX_CUTLERY_PICKUP + file_paths = list( + 'sound/items/cutlery/cutlery_pickup1.ogg', + 'sound/items/cutlery/cutlery_pickup2.ogg', + 'sound/items/cutlery/cutlery_pickup3.ogg', + ) + +/datum/sound_effect/cutlery_drop + key = SFX_CUTLERY_DROP + file_paths = list( + 'sound/items/cutlery/cutlery_drop1.ogg', + 'sound/items/cutlery/cutlery_drop2.ogg', + 'sound/items/cutlery/cutlery_drop3.ogg', + ) + +/datum/sound_effect/knife_pickup + key = SFX_KNIFE_PICKUP + file_paths = list( + 'sound/items/knife/knife_pickup1.ogg', + 'sound/items/knife/knife_pickup2.ogg', + 'sound/items/knife/knife_pickup3.ogg', + ) + +/datum/sound_effect/knife_drop + key = SFX_KNIFE_DROP + file_paths = list( + 'sound/items/knife/knife_drop1.ogg', + 'sound/items/knife/knife_drop2.ogg', + 'sound/items/knife/knife_drop3.ogg', + ) + +/datum/sound_effect/knife_slice + key = SFX_KNIFE_SLICE + file_paths = list( + 'sound/items/knife/knife_slice1.ogg', + 'sound/items/knife/knife_slice2.ogg', + 'sound/items/knife/knife_slice3.ogg', + 'sound/items/knife/knife_slice4.ogg', + 'sound/items/knife/knife_slice5.ogg', + 'sound/items/knife/knife_slice6.ogg', + ) + +/datum/sound_effect/pot_pickup + key = SFX_POT_PICKUP + file_paths = list( + 'sound/items/pot/pot_pickup1.ogg', + 'sound/items/pot/pot_pickup2.ogg', + 'sound/items/pot/pot_pickup3.ogg', + ) + +/datum/sound_effect/pot_drop + key = SFX_POT_DROP + file_paths = list( + 'sound/items/pot/pot_drop1.ogg', + 'sound/items/pot/pot_drop2.ogg', + 'sound/items/pot/pot_drop3.ogg', + ) + +/datum/sound_effect/tray_pickup + key = SFX_TRAY_PICKUP + file_paths = list( + 'sound/items/tray/tray_pickup1.ogg', + 'sound/items/tray/tray_pickup2.ogg', + 'sound/items/tray/tray_pickup3.ogg', + ) + +/datum/sound_effect/tray_drop + key = SFX_TRAY_DROP + file_paths = list( + 'sound/items/tray/tray_drop1.ogg', + 'sound/items/tray/tray_drop2.ogg', + 'sound/items/tray/tray_drop3.ogg', + ) + +/datum/sound_effect/tray_insert + key = SFX_TRAY_INSERT + file_paths = list( + 'sound/items/tray/tray_insert1.ogg', + 'sound/items/tray/tray_insert2.ogg', + 'sound/items/tray/tray_insert3.ogg', + ) + +/datum/sound_effect/rolling_pin_pickup + key = SFX_ROLLING_PIN_PICKUP + file_paths = list( + 'sound/items/rolling_pin/rolling_pin_pickup1.ogg', + 'sound/items/rolling_pin/rolling_pin_pickup2.ogg', + 'sound/items/rolling_pin/rolling_pin_pickup3.ogg', + ) + +/datum/sound_effect/rolling_pin_drop + key = SFX_ROLLING_PIN_DROP + file_paths = list( + 'sound/items/rolling_pin/rolling_pin_drop1.ogg', + 'sound/items/rolling_pin/rolling_pin_drop2.ogg', + 'sound/items/rolling_pin/rolling_pin_drop3.ogg', + ) + +/datum/sound_effect/rolling_pin_rolling + key = SFX_ROLLING_PIN_ROLLING + file_paths = list( + 'sound/items/rolling_pin/rolling_pin_rolling1.ogg', + 'sound/items/rolling_pin/rolling_pin_rolling2.ogg', + 'sound/items/rolling_pin/rolling_pin_rolling3.ogg', + 'sound/items/rolling_pin/rolling_pin_rolling4.ogg', + 'sound/items/rolling_pin/rolling_pin_rolling5.ogg', + 'sound/items/rolling_pin/rolling_pin_rolling6.ogg', + ) + +/datum/sound_effect/fire_mode_switch + key = SFX_FIRE_MODE_SWITCH + file_paths = list( + 'sound/items/weapons/gun_mode_switch1.ogg', + ) + + +/datum/sound_effect/remote_mode_switch + key = SFX_REMOTE_MODE_SWITCH + file_paths = list( + 'sound/items/door_remote/door_remote_switch1.ogg', + 'sound/items/door_remote/door_remote_switch2.ogg', + 'sound/items/door_remote/door_remote_switch3.ogg', + ) + +/datum/sound_effect/remote_action + key = SFX_REMOTE_ACTION + file_paths = list( + 'sound/items/door_remote/door_remote_action1.ogg', + 'sound/items/door_remote/door_remote_action2.ogg', + ) + +/datum/sound_effect/gas_mask_pickup + key = SFX_GAS_MASK_PICKUP + file_paths = list( + 'sound/items/gas_mask/gas_mask_pickup1.ogg', + 'sound/items/gas_mask/gas_mask_pickup2.ogg', + 'sound/items/gas_mask/gas_mask_pickup3.ogg', + ) + +/datum/sound_effect/gas_mask_drop + key = SFX_GAS_MASK_DROP + file_paths = list( + 'sound/items/gas_mask/gas_mask_drop1.ogg', + 'sound/items/gas_mask/gas_mask_drop2.ogg', + 'sound/items/gas_mask/gas_mask_drop3.ogg', + ) + +/datum/sound_effect/gas_mask_equip + key = SFX_GAS_MASK_EQUIP + file_paths = list( + 'sound/items/gas_mask/gas_mask_equip1.ogg', + 'sound/items/gas_mask/gas_mask_equip2.ogg', + 'sound/items/gas_mask/gas_mask_equip3.ogg', + ) + +/datum/sound_effect/generic_device_pickup + key = SFX_GENERIC_DEVICE_PICKUP + file_paths = list( + 'sound/items/generic_device/generic_device_pickup1.ogg', + 'sound/items/generic_device/generic_device_pickup2.ogg', + 'sound/items/generic_device/generic_device_pickup3.ogg', + 'sound/items/generic_device/generic_device_pickup4.ogg', + 'sound/items/generic_device/generic_device_pickup5.ogg', + ) + +/datum/sound_effect/generic_device_drop + key = SFX_GENERIC_DEVICE_DROP + file_paths = list( + 'sound/items/generic_device/generic_device_drop1.ogg', + 'sound/items/generic_device/generic_device_drop2.ogg', + 'sound/items/generic_device/generic_device_drop3.ogg', + 'sound/items/generic_device/generic_device_drop4.ogg', + 'sound/items/generic_device/generic_device_drop5.ogg', + ) + +/datum/sound_effect/hard_hat_pickup + key = SFX_HARD_HAT_PICKUP + file_paths = list( + 'sound/items/hard_hat/hard_hat_pickup1.ogg', + 'sound/items/hard_hat/hard_hat_pickup2.ogg', + 'sound/items/hard_hat/hard_hat_pickup3.ogg', + 'sound/items/hard_hat/hard_hat_pickup4.ogg', + 'sound/items/hard_hat/hard_hat_pickup5.ogg', + ) + +/datum/sound_effect/hard_hat_drop + key = SFX_HARD_HAT_DROP + file_paths = list( + 'sound/items/hard_hat/hard_hat_drop1.ogg', + 'sound/items/hard_hat/hard_hat_drop2.ogg', + 'sound/items/hard_hat/hard_hat_drop3.ogg', + 'sound/items/hard_hat/hard_hat_drop4.ogg', + 'sound/items/hard_hat/hard_hat_drop5.ogg', + ) + +/datum/sound_effect/hard_hat_equip + key = SFX_HARD_HAT_EQUIP + file_paths = list( + 'sound/items/hard_hat/hard_hat_equip1.ogg', + 'sound/items/hard_hat/hard_hat_equip2.ogg', + 'sound/items/hard_hat/hard_hat_equip3.ogg', + ) diff --git a/code/game/turfs/baseturf_skipover.dm b/code/game/turfs/baseturf_skipover.dm index 9bef78a15ea1..16d4f124c257 100644 --- a/code/game/turfs/baseturf_skipover.dm +++ b/code/game/turfs/baseturf_skipover.dm @@ -12,6 +12,10 @@ name = "Shuttle baseturf skipover" desc = "Acts as the bottom of the shuttle, if this isn't here the shuttle floor is broken through." +/turf/baseturf_skipover/trapdoor + name = "Trapdoor baseturf skipover" + desc = "Acts as the bottom of a stack of baseturfs affected by a trapdoor." + /turf/baseturf_bottom name = "Z-level baseturf placeholder" desc = "Marker for z-level baseturf, usually resolves to space." diff --git a/code/game/turfs/baseturfs.dm b/code/game/turfs/baseturfs.dm index 09ca2b81c5ef..0ceda1dba1b7 100644 --- a/code/game/turfs/baseturfs.dm +++ b/code/game/turfs/baseturfs.dm @@ -100,6 +100,13 @@ return null return baseturfs.len - index + 1 +/// Similar to depth_to_find_baseturf, but directly returns the index of the found baseturf. +/// This number can be passed into insert_baseturf to insert a baseturf before the found baseturf. +/turf/proc/level_to_find_baseturf(baseturf_type) + if(!islist(baseturfs)) + return baseturfs == baseturf_type ? 1 : null + return baseturfs.Find(baseturf_type) || null + /// Returns the baseturf at the given depth. /// For example, baseturf_at_depth(1) will give the baseturf that would show up when scraping once. /turf/proc/baseturf_at_depth(index) @@ -181,3 +188,8 @@ insert_baseturf(search_position, stack_type) else if(type == search_type) insert_baseturf(turf_type = stack_type) + +/// Gets a copy of the baseturfs up to the specified depth +/turf/proc/get_baseturfs_to_depth(depth) + var/list/baseturf_list = islist(baseturfs) ? baseturfs : list(baseturfs) + return baseturf_list.Copy(baseturf_list.len - depth + 1) diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 2deb6f367812..49ebdb577a92 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -20,7 +20,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( /turf/proc/copyTurf(turf/copy_to_turf, copy_air = FALSE, flags = null) if(copy_to_turf.type != type) - copy_to_turf.ChangeTurf(type, flags) + copy_to_turf.ChangeTurf(type, null, flags) if(copy_to_turf.icon_state != icon_state) copy_to_turf.icon_state = icon_state if(copy_to_turf.icon != icon) @@ -193,7 +193,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( space_tile.enable_starlight() if(old_opacity != opacity && SSticker) - GLOB.cameranet.bareMajorChunkChange(src) + SScameras.bare_major_chunk_change(src) // We will only run this logic if the tile is not on the prime z layer, since we use area overlays to cover that if(SSmapping.z_level_to_plane_offset[z]) diff --git a/code/game/turfs/closed/indestructible.dm b/code/game/turfs/closed/indestructible.dm index 0354fc316bfd..c6ad9db01433 100644 --- a/code/game/turfs/closed/indestructible.dm +++ b/code/game/turfs/closed/indestructible.dm @@ -18,12 +18,6 @@ /turf/closed/indestructible/singularity_act() return -/turf/closed/indestructible/attackby(obj/item/attacking_item, mob/user, list/modifiers) - 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' diff --git a/code/game/turfs/closed/wall/misc_walls.dm b/code/game/turfs/closed/wall/misc_walls.dm index 6bb8520189ec..861533c4b175 100644 --- a/code/game/turfs/closed/wall/misc_walls.dm +++ b/code/game/turfs/closed/wall/misc_walls.dm @@ -44,15 +44,14 @@ /turf/closed/wall/rust //SDMM supports colors, this is simply for easier mapping - //and should be removed on initialize - color = MAP_SWITCH(null, COLOR_ORANGE_BROWN) + WHEN_MAP(color = COLOR_ORANGE_BROWN) /turf/closed/wall/rust/Initialize(mapload) . = ..() AddElement(/datum/element/rust) /turf/closed/wall/heretic_rust - color = MAP_SWITCH(null, COLOR_GREEN_GRAY) + WHEN_MAP(color = COLOR_GREEN_GRAY) /turf/closed/wall/heretic_rust/Initialize(mapload) . = ..() @@ -60,8 +59,7 @@ /turf/closed/wall/r_wall/rust //SDMM supports colors, this is simply for easier mapping - //and should be removed on initialize - color = MAP_SWITCH(null, COLOR_ORANGE_BROWN) + WHEN_MAP(color = COLOR_ORANGE_BROWN) base_decon_state = "rusty_r_wall" /turf/closed/wall/r_wall/rust/Initialize(mapload) @@ -69,7 +67,7 @@ AddElement(/datum/element/rust) /turf/closed/wall/r_wall/heretic_rust - color = MAP_SWITCH(null, COLOR_GREEN_GRAY) + WHEN_MAP(color = COLOR_GREEN_GRAY) /turf/closed/wall/r_wall/heretic_rust/Initialize(mapload) . = ..() diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm index a416091aed5c..5b4e791f8e22 100644 --- a/code/game/turfs/closed/wall/reinf_walls.dm +++ b/code/game/turfs/closed/wall/reinf_walls.dm @@ -224,7 +224,7 @@ .["delay"] *= RCD_RWALL_DELAY_MULT /turf/closed/wall/r_wall/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - if(the_rcd.canRturf || rcd_data["[RCD_DESIGN_MODE]"] == RCD_WALLFRAME) + if(the_rcd.canRturf || rcd_data[RCD_DESIGN_MODE] == RCD_WALLFRAME) return ..() /turf/closed/wall/r_wall/rust_turf() diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index b7eb985bee55..1df2ea0251bd 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -92,10 +92,6 @@ if(newgirder) //maybe we don't /want/ a girder! transfer_fingerprints_to(newgirder) - for(var/obj/O in src.contents) //Eject contents! - if(istype(O, /obj/structure/sign/poster)) - var/obj/structure/sign/poster/P = O - INVOKE_ASYNC(P, TYPE_PROC_REF(/obj/structure/sign/poster, roll_and_drop), src) if(decon_type) ChangeTurf(decon_type, flags = CHANGETURF_INHERIT_AIR) else @@ -199,7 +195,7 @@ add_fingerprint(user) //the istype cascade has been spread among various procs for easy overriding - if(try_clean(tool, user) || try_wallmount(tool, user) || try_decon(tool, user)) + if(try_clean(tool, user) || try_decon(tool, user)) return ITEM_INTERACT_SUCCESS return NONE @@ -222,20 +218,6 @@ return FALSE -/turf/closed/wall/proc/try_wallmount(obj/item/W, mob/user) - //check for wall mounted frames - if(istype(W, /obj/item/wallframe)) - var/obj/item/wallframe/F = W - if(F.try_build(src, user)) - F.attach(src, user) - return TRUE - return FALSE - //Poster stuff - else if(istype(W, /obj/item/poster) && Adjacent(user)) //no tk memes. - return place_poster(W,user) - - return FALSE - /turf/closed/wall/proc/try_decon(obj/item/I, mob/user) if(I.tool_behaviour == TOOL_WELDER) if(!I.tool_start_check(user, amount=round(slicing_duration / 50), heat_required = HIGH_TEMPERATURE_REQUIRED)) @@ -283,11 +265,12 @@ return FALSE /turf/closed/wall/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - switch(rcd_data["[RCD_DESIGN_MODE]"]) + switch(rcd_data[RCD_DESIGN_MODE]) if(RCD_WALLFRAME) - var/obj/item/wallframe/wallmount = rcd_data["[RCD_DESIGN_PATH]"] + var/obj/item/wallframe/wallmount = rcd_data[RCD_DESIGN_PATH] var/obj/item/wallframe/new_wallmount = new wallmount(user.drop_location()) - return try_wallmount(new_wallmount, user, src) + if(new_wallmount.interact_with_atom(src, user) == ITEM_INTERACT_SUCCESS) + return TRUE if(RCD_DECONSTRUCT) ScrapeAway() return TRUE diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index ee889a876115..4fa24bd38419 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -188,7 +188,7 @@ barefootstep = FOOTSTEP_HARD_BAREFOOT clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY - tiled_dirt = TRUE + tiled_turf = TRUE /turf/open/indestructible/Melt() to_be_destroyed = FALSE @@ -264,7 +264,7 @@ barefootstep = FOOTSTEP_LAVA clawfootstep = FOOTSTEP_LAVA heavyfootstep = FOOTSTEP_LAVA - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/indestructible/necropolis/Initialize(mapload) . = ..() @@ -327,7 +327,7 @@ barefootstep = null clawfootstep = null heavyfootstep = null - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/indestructible/binary name = "tear in the fabric of reality" @@ -457,7 +457,6 @@ playsound(slipper.loc, 'sound/misc/slip.ogg', 50, TRUE, -3) SEND_SIGNAL(slipper, COMSIG_ON_CARBON_SLIP) - slipper.add_mood_event("slipped", /datum/mood_event/slipped) if(force_drop && iscarbon(slipper)) //carbon specific behavior that living doesn't have var/mob/living/carbon/carbon = slipper for(var/obj/item/item in slipper.held_items) diff --git a/code/game/turfs/open/ashplanet.dm b/code/game/turfs/open/ashplanet.dm index e6703c04eb55..35c7ec5b1cd1 100644 --- a/code/game/turfs/open/ashplanet.dm +++ b/code/game/turfs/open/ashplanet.dm @@ -14,7 +14,7 @@ barefootstep = FOOTSTEP_SAND clawfootstep = FOOTSTEP_SAND heavyfootstep = FOOTSTEP_GENERIC_HEAVY - tiled_dirt = FALSE + tiled_turf = FALSE rust_resistance = RUST_RESISTANCE_ORGANIC var/smooth_icon = 'icons/turf/floors/ash.dmi' diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index 312b33664915..4e131d0bf981 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -9,12 +9,13 @@ damaged_dmi = 'icons/turf/floors.dmi' icon_state = "asteroid" base_icon_state = "asteroid" + turf_flags = IS_SOLID footstep = FOOTSTEP_SAND barefootstep = FOOTSTEP_SAND clawfootstep = FOOTSTEP_SAND heavyfootstep = FOOTSTEP_GENERIC_HEAVY - rust_resistance = RUST_RESISTANCE_ORGANIC + rust_resistance = RUST_RESISTANCE_BASIC /// Base turf type to be created by the tunnel var/turf_type = /turf/open/misc/asteroid /// Whether this turf has different icon states diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index e490abceda74..df1278b29d4f 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -42,7 +42,7 @@ return FALSE /turf/open/chasm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - if(rcd_data["[RCD_DESIGN_MODE]"] == RCD_TURF && rcd_data["[RCD_DESIGN_PATH]"] == /turf/open/floor/plating/rcd) + if(rcd_data[RCD_DESIGN_MODE] == RCD_TURF && rcd_data[RCD_DESIGN_PATH] == /turf/open/floor/plating/rcd) place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE diff --git a/code/game/turfs/open/dirtystation.dm b/code/game/turfs/open/dirtystation.dm index 3808622982da..7e9c72e30ee2 100644 --- a/code/game/turfs/open/dirtystation.dm +++ b/code/game/turfs/open/dirtystation.dm @@ -95,7 +95,7 @@ //Areas where gibs will be present. Robusting probably happened some time ago. var/static/list/gib_covered_areas = typecacheof(list( - /area/station/ai_monitored/turret_protected, + /area/station/ai/satellite, /area/station/security, /area/station/command/heads_quarters/hos, )) diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index ec4b5ca50ada..595623275c7a 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -3,7 +3,7 @@ name = "floor" icon = 'icons/turf/floors.dmi' base_icon_state = "floor" - baseturfs = /turf/open/floor/plating + baseturfs = /turf/open/floor/plating/concrete // DARKPACK EDIT CHANGE footstep = FOOTSTEP_FLOOR barefootstep = FOOTSTEP_HARD_BAREFOOT @@ -16,7 +16,7 @@ thermal_conductivity = 0.02 heat_capacity = 20000 - tiled_dirt = TRUE + tiled_turf = TRUE overfloor_placed = TRUE @@ -208,9 +208,6 @@ /turf/open/floor/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_TURF) - if(the_rcd.rcd_design_path != /turf/open/floor/plating/rcd) - return FALSE - var/obj/structure/girder/girder = locate() in src if(girder) return girder.rcd_vals(user, the_rcd) @@ -220,6 +217,10 @@ src, RCD_MEMORY_WALL, ) if(RCD_WINDOWGRILLE) + var/obj/structure/grille/grille = locate() in src + if(grille) + return grille.rcd_vals(user, the_rcd) + //default cost for building a grill for fulltile windows var/cost = 4 var/delay = 1 SECONDS @@ -266,13 +267,9 @@ return FALSE -/// if you are updating this make to to update /turf/open/misc/rcd_act() too /turf/open/floor/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - switch(rcd_data["[RCD_DESIGN_MODE]"]) + switch(rcd_data[RCD_DESIGN_MODE]) if(RCD_TURF) - if(rcd_data["[RCD_DESIGN_PATH]"] != /turf/open/floor/plating/rcd) - return FALSE - var/obj/structure/girder/girder = locate() in src if(girder) return girder.rcd_act(user, the_rcd, rcd_data) @@ -280,12 +277,12 @@ place_on_top(/turf/closed/wall) return TRUE if(RCD_WINDOWGRILLE) - //check if we are building a window - var/obj/structure/window/window_path = rcd_data["[RCD_DESIGN_PATH]"] - if(!ispath(window_path)) - CRASH("Invalid window path type in RCD: [window_path]") + var/obj/structure/grille/grille = locate() in src + if(grille) + return grille.rcd_act(user, the_rcd, rcd_data) //allow directional windows to be built without grills + var/obj/structure/window/window_path = rcd_data[RCD_DESIGN_PATH] if(!initial(window_path.fulltile)) if(!valid_build_direction(src, user.dir, is_fulltile = FALSE)) balloon_alert(user, "window already here!") @@ -295,13 +292,11 @@ 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) - new_grille.set_anchored(TRUE) + grille = new(src) + grille.set_anchored(TRUE) return TRUE if(RCD_AIRLOCK) - var/obj/machinery/door/airlock_type = rcd_data["[RCD_DESIGN_PATH]"] + var/obj/machinery/door/airlock_type = rcd_data[RCD_DESIGN_PATH] if(ispath(airlock_type, /obj/machinery/door/window)) if(!valid_build_direction(src, user.dir, is_fulltile = FALSE)) @@ -335,7 +330,7 @@ assembly.finish_door() return TRUE if(RCD_STRUCTURE) - var/atom/movable/design_type = rcd_data["[RCD_DESIGN_PATH]"] + var/atom/movable/design_type = rcd_data[RCD_DESIGN_PATH] //map absolute types to basic subtypes var/atom/movable/locate_type = design_type diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index eea5232aa062..3be12306bab9 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -16,7 +16,7 @@ barefootstep = FOOTSTEP_WOOD_BAREFOOT clawfootstep = FOOTSTEP_WOOD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY - tiled_dirt = FALSE + tiled_turf = FALSE rust_resistance = RUST_RESISTANCE_BASIC /turf/open/floor/wood/broken_states() @@ -148,7 +148,7 @@ barefootstep = FOOTSTEP_GRASS clawfootstep = FOOTSTEP_GRASS heavyfootstep = FOOTSTEP_GENERIC_HEAVY - tiled_dirt = FALSE + tiled_turf = FALSE rust_resistance = RUST_RESISTANCE_ORGANIC /turf/open/floor/grass/broken_states() @@ -202,7 +202,7 @@ barefootstep = FOOTSTEP_GRASS clawfootstep = FOOTSTEP_GRASS heavyfootstep = FOOTSTEP_GENERIC_HEAVY - tiled_dirt = FALSE + tiled_turf = FALSE rust_resistance = RUST_RESISTANCE_ORGANIC /turf/open/floor/fake_snow @@ -216,7 +216,7 @@ floor_tile = null initial_gas_mix = FROZEN_ATMOS bullet_bounce_sound = null - tiled_dirt = FALSE + tiled_turf = FALSE rust_resistance = RUST_RESISTANCE_ORGANIC slowdown = 1.5 bullet_sizzle = TRUE @@ -251,7 +251,7 @@ barefootstep = FOOTSTEP_SAND clawfootstep = FOOTSTEP_SAND heavyfootstep = FOOTSTEP_GENERIC_HEAVY - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/floor/fakebasalt/Initialize(mapload) . = ..() @@ -280,7 +280,7 @@ barefootstep = FOOTSTEP_CARPET_BAREFOOT clawfootstep = FOOTSTEP_CARPET_BAREFOOT heavyfootstep = FOOTSTEP_GENERIC_HEAVY - tiled_dirt = FALSE + tiled_turf = FALSE rust_resistance = RUST_RESISTANCE_BASIC /turf/open/floor/carpet/examine(mob/user) @@ -867,7 +867,7 @@ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_TURF_CHASM canSmoothWith = SMOOTH_GROUP_TURF_CHASM - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/floor/fakepit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) underlay_appearance.icon = 'icons/turf/floors.dmi' @@ -893,7 +893,7 @@ floor_tile = /obj/item/stack/tile/fakespace layer = SPACE_LAYER plane = PLANE_SPACE - tiled_dirt = FALSE + tiled_turf = FALSE damaged_dmi = 'icons/turf/space.dmi' /turf/open/floor/fakespace/broken_states() diff --git a/code/game/turfs/open/floor/iron_floor.dm b/code/game/turfs/open/floor/iron_floor.dm index 978a9ab0fdf5..d4fa5912142f 100644 --- a/code/game/turfs/open/floor/iron_floor.dm +++ b/code/game/turfs/open/floor/iron_floor.dm @@ -472,7 +472,7 @@ /turf/open/floor/iron/grimy icon_state = "grimy" base_icon_state = "grimy" - tiled_dirt = FALSE + tiled_turf = FALSE floor_tile = /obj/item/stack/tile/iron/grimy /turf/open/floor/iron/vaporwave @@ -485,13 +485,14 @@ desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of a meteor and a spaceman. The spaceman is laughing. The meteor is exploding." icon_state = "plaque" base_icon_state = "plaque" - tiled_dirt = FALSE + tiled_turf = FALSE floor_tile = /obj/item/stack/tile/iron/goonplaque /turf/open/floor/iron/stairs + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' // DARKPACK EDIT CHANGE icon_state = "stairs" base_icon_state = "stairs" - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/floor/iron/stairs/airless initial_gas_mix = AIRLESS_ATMOS @@ -518,8 +519,8 @@ initial_gas_mix = AIRLESS_ATMOS /turf/open/floor/iron/stairs/old - icon_state = "stairs-old" - base_icon_state = "stairs-old" + icon_state = "stairs" // DARKPACK EDIT CHANGE + base_icon_state = "stairs" // DARKPACK EDIT CHANGE /turf/open/floor/iron/stairs/old/airless initial_gas_mix = AIRLESS_ATMOS diff --git a/code/game/turfs/open/floor/light_floor.dm b/code/game/turfs/open/floor/light_floor.dm index eaccba29aaaa..93ae88597ad1 100644 --- a/code/game/turfs/open/floor/light_floor.dm +++ b/code/game/turfs/open/floor/light_floor.dm @@ -19,7 +19,7 @@ var/currentcolor = LIGHT_COLOR_CYAN ///var to prevent changing color on certain admin spawn only tiles var/can_modify_colour = TRUE - tiled_dirt = FALSE + tiled_turf = FALSE ///icons for radial menu var/static/list/lighttile_designs ///used for light floors that cycle colours diff --git a/code/game/turfs/open/floor/mineral_floor.dm b/code/game/turfs/open/floor/mineral_floor.dm index 8ca8b45c101e..8456afc084b7 100644 --- a/code/game/turfs/open/floor/mineral_floor.dm +++ b/code/game/turfs/open/floor/mineral_floor.dm @@ -15,7 +15,7 @@ material_flags = MATERIAL_EFFECTS rust_resistance = RUST_RESISTANCE_BASIC var/list/icons - tiled_dirt = FALSE + tiled_turf = FALSE diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm index ef96b90b021c..b35ca8691821 100644 --- a/code/game/turfs/open/floor/misc_floor.dm +++ b/code/game/turfs/open/floor/misc_floor.dm @@ -7,6 +7,7 @@ base_icon_state = "bcircuit" light_color = LIGHT_COLOR_BABY_BLUE floor_tile = /obj/item/stack/tile/circuit + rust_resistance = RUST_RESISTANCE_REINFORCED /// If we want to ignore our area's power status and just be always off /// Mostly for mappers doing asthetic things, or cases where the floor should be broken var/always_off = FALSE @@ -237,6 +238,7 @@ desc = "This one takes you back." icon_state = "eighties" floor_tile = /obj/item/stack/tile/eighties + rust_resistance = RUST_RESISTANCE_BASIC /turf/open/floor/eighties/broken_states() return list("eighties_damaged") diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 8aa5c2ed3935..2a440db7c742 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -187,7 +187,7 @@ return list("delay" = 0, "cost" = 1) /turf/open/floor/plating/foam/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - if(rcd_data["[RCD_DESIGN_MODE]"] == RCD_TURF && rcd_data["[RCD_DESIGN_PATH]"] == /turf/open/floor/plating/rcd) + if(rcd_data[RCD_DESIGN_MODE] == RCD_TURF && rcd_data[RCD_DESIGN_PATH] == /turf/open/floor/plating/rcd) ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE diff --git a/code/game/turfs/open/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm index 40fd70555246..2b6fe12a158c 100644 --- a/code/game/turfs/open/floor/plating/misc_plating.dm +++ b/code/game/turfs/open/floor/plating/misc_plating.dm @@ -18,7 +18,7 @@ name = "alien floor" icon_state = "alienpod1" base_icon_state = "alienpod1" - tiled_dirt = FALSE + tiled_turf = FALSE rust_resistance = RUST_RESISTANCE_ORGANIC // Not actually broken, just should never break...yeah. broken = TRUE @@ -32,7 +32,7 @@ name = "alien plating" icon_state = "alienplating" base_icon_state = "alienplating" - tiled_dirt = FALSE + tiled_turf = FALSE rust_resistance = RUST_RESISTANCE_ORGANIC damaged_dmi = null diff --git a/code/game/turfs/open/floor/reinforced_floor.dm b/code/game/turfs/open/floor/reinforced_floor.dm index 219e284db364..bc8f70655759 100644 --- a/code/game/turfs/open/floor/reinforced_floor.dm +++ b/code/game/turfs/open/floor/reinforced_floor.dm @@ -10,7 +10,7 @@ barefootstep = FOOTSTEP_HARD_BAREFOOT clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY - tiled_dirt = FALSE + tiled_turf = FALSE rcd_proof = TRUE rust_resistance = RUST_RESISTANCE_REINFORCED floor_tile = /obj/item/stack/rods @@ -93,12 +93,6 @@ /turf/open/floor/engine/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) -/turf/open/floor/engine/attack_hand(mob/user, list/modifiers) - . = ..() - if(.) - return - user.Move_Pulled(src) - //air filled floors; used in atmos pressure chambers /turf/open/floor/engine/n2o diff --git a/code/game/turfs/open/grass.dm b/code/game/turfs/open/grass.dm index 4dd5946a7ed1..f1668ef94be0 100644 --- a/code/game/turfs/open/grass.dm +++ b/code/game/turfs/open/grass.dm @@ -62,3 +62,13 @@ /turf/open/misc/grass/lavaland initial_gas_mix = LAVALAND_DEFAULT_ATMOS + +// DARKPACK EDIT ADD START +/turf/open/misc/grass/nosmooth + layer = LOW_FLOOR_LAYER + smoothing_flags = null + smoothing_groups = null + canSmoothWith = null + smooth_broken = null + smooth_burnt = null +// DARKPACK EDIT ADD END diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index d814fd7d6327..d12fe69c31ad 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -190,7 +190,7 @@ return FALSE /turf/open/lava/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - if(rcd_data["[RCD_DESIGN_MODE]"] == RCD_TURF && rcd_data["[RCD_DESIGN_PATH]"] == /turf/open/floor/plating/rcd) + if(rcd_data[RCD_DESIGN_MODE] == RCD_TURF && rcd_data[RCD_DESIGN_PATH] == /turf/open/floor/plating/rcd) place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE @@ -342,7 +342,7 @@ ADD_TRAIT(burn_living, TRAIT_NO_EXTINGUISH, TURF_TRAIT) burn_living.adjust_fire_stacks(lava_firestacks * seconds_per_tick) burn_living.ignite_mob() - burn_living.adjustFireLoss(lava_damage * seconds_per_tick) + burn_living.adjust_fire_loss(lava_damage * seconds_per_tick) return TRUE return FALSE @@ -406,17 +406,9 @@ immunity_resistance_flags = FREEZE_PROOF lava_temperature = 100 -/turf/open/lava/plasma/examine(mob/user) +/turf/open/lava/plasma/Initialize(mapload) . = ..() - . += span_info("Some liquid plasma could probably be scooped up with a container.") - -/turf/open/lava/plasma/attackby(obj/item/I, mob/user, list/modifiers) - if(!I.is_open_container()) - return ..() - if(!I.reagents.add_reagent(/datum/reagent/toxin/plasma, rand(5, 10))) - to_chat(user, span_warning("[I] is full.")) - return - user.visible_message(span_notice("[user] scoops some plasma from the [src] with [I]."), span_notice("You scoop out some plasma from the [src] using [I].")) + AddElement(/datum/element/reagent_scoopable_atom, /datum/reagent/toxin/plasma) /turf/open/lava/plasma/do_burn(atom/movable/burn_target, seconds_per_tick = 1) . = TRUE @@ -426,8 +418,8 @@ var/mob/living/burn_living = burn_target var/need_mob_update // This is from plasma, so it should obey plasma biotype requirements - need_mob_update += burn_living.adjustToxLoss(15, updating_health = FALSE, required_biotype = MOB_ORGANIC) - need_mob_update += burn_living.adjustFireLoss(25, updating_health = FALSE) + need_mob_update += burn_living.adjust_tox_loss(15, updating_health = FALSE, required_biotype = MOB_ORGANIC) + need_mob_update += burn_living.adjust_fire_loss(25, updating_health = FALSE) if(need_mob_update) burn_living.updatehealth() diff --git a/code/game/turfs/open/misc.dm b/code/game/turfs/open/misc.dm index b9c27e3faf26..666ad1aef854 100644 --- a/code/game/turfs/open/misc.dm +++ b/code/game/turfs/open/misc.dm @@ -19,7 +19,7 @@ thermal_conductivity = 0.02 heat_capacity = 20000 - tiled_dirt = TRUE + tiled_turf = TRUE /turf/open/misc/attackby(obj/item/attacking_item, mob/user, list/modifiers) . = ..() @@ -89,8 +89,8 @@ return FALSE /turf/open/misc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - if(rcd_data["[RCD_DESIGN_MODE]"] == RCD_TURF) - if(rcd_data["[RCD_DESIGN_PATH]"] != /turf/open/floor/plating/rcd) + if(rcd_data[RCD_DESIGN_MODE] == RCD_TURF) + if(rcd_data[RCD_DESIGN_PATH] != /turf/open/floor/plating/rcd) return FALSE place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index d2149766faa1..2af5fcdef491 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -113,6 +113,53 @@ /turf/open/openspace/CanBuildHere() return can_build_on +// DARKPACK EDIT ADD START +/turf/open/openspace/attack_hand(mob/user, list/modifiers) + . = ..() + if(.) + return + + return user.climb_down(src) + +/turf/open/openspace/attack_animal(mob/user, list/modifiers) + . = ..() + if(.) + return + + return user.climb_down(src) + +/turf/open/openspace/attack_basic_mob(mob/user, list/modifiers) + . = ..() + if(.) + return + + return user.climb_down(src) + +/mob/proc/climb_down(turf/open/openspace/target_turf) + var/turf/down_turf = GET_TURF_BELOW(target_turf) + if(!can_z_move(DOWN, target_turf, down_turf, ZMOVE_FEEDBACK)) + return FALSE + + return zMove(DOWN, down_turf, ZMOVE_FEEDBACK) + +/mob/living/climb_down(turf/open/openspace/target_turf) + var/turf/down_turf = GET_TURF_BELOW(target_turf) + if(!can_z_move(DOWN, target_turf, down_turf, ZMOVE_FEEDBACK)) + return FALSE + + to_chat(src, span_notice("You start climbing down...")) + + // DARKPACK TODO - standardize stat doafter delays + var/result = do_after(src, (11 - (st_get_stat(STAT_DEXTERITY) + st_get_stat(STAT_ATHLETICS))) SECONDS, target_turf) + if(!result) + to_chat(src, span_warning("You were interrupted and failed to climb down.")) + return FALSE + + if(zMove(DOWN, down_turf, ZMOVE_FEEDBACK)) + to_chat(src, span_notice("You climb down successfully.")) + return TRUE +// DARKPACK EDIT ADD END + /turf/open/openspace/attackby(obj/item/attacking_item, mob/user, list/modifiers) ..() if(!CanBuildHere()) @@ -142,7 +189,7 @@ return FALSE /turf/open/openspace/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - if(rcd_data["[RCD_DESIGN_MODE]"] == RCD_TURF && rcd_data["[RCD_DESIGN_PATH]"] == /turf/open/floor/plating/rcd) + if(rcd_data[RCD_DESIGN_MODE] == RCD_TURF && rcd_data[RCD_DESIGN_PATH] == /turf/open/floor/plating/rcd) place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE diff --git a/code/game/turfs/open/planet.dm b/code/game/turfs/open/planet.dm index e0fe7e842b94..55963e2cf684 100644 --- a/code/game/turfs/open/planet.dm +++ b/code/game/turfs/open/planet.dm @@ -12,7 +12,7 @@ barefootstep = FOOTSTEP_SAND clawfootstep = FOOTSTEP_SAND heavyfootstep = FOOTSTEP_GENERIC_HEAVY - tiled_dirt = FALSE + tiled_turf = FALSE rust_resistance = RUST_RESISTANCE_ORGANIC /turf/open/misc/dirt/station diff --git a/code/game/turfs/open/sand.dm b/code/game/turfs/open/sand.dm index af583de77791..71ffa6be6131 100644 --- a/code/game/turfs/open/sand.dm +++ b/code/game/turfs/open/sand.dm @@ -8,7 +8,7 @@ barefootstep = FOOTSTEP_SAND clawfootstep = FOOTSTEP_SAND heavyfootstep = FOOTSTEP_GENERIC_HEAVY - rust_resistance = RUST_RESISTANCE_ORGANIC + rust_resistance = RUST_RESISTANCE_REINFORCED /turf/open/misc/beach/Initialize(mapload) . = ..() @@ -72,7 +72,7 @@ barefootstep = FOOTSTEP_SAND clawfootstep = FOOTSTEP_SAND heavyfootstep = FOOTSTEP_GENERIC_HEAVY - tiled_dirt = FALSE + tiled_turf = FALSE rust_resistance = RUST_RESISTANCE_ORGANIC /turf/open/misc/sandy_dirt/break_tile() diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index d37d338b6ac6..edb8a337987e 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -44,8 +44,8 @@ GLOBAL_LIST_EMPTY(starlight) /turf/open/space icon = 'icons/turf/space.dmi' - MAP_SWITCH(icon_state = "space", icon_state = "space_map") - name = CITY_NAME // DARKPACK EDIT CHANGE - ORIGINAL: name = "\proper space" + icon_state = MAP_SWITCH("space", "space_map") + name = "\proper space" overfloor_placed = FALSE underfloor_accessibility = UNDERFLOOR_INTERACTABLE rust_resistance = RUST_RESISTANCE_ABSOLUTE @@ -60,8 +60,8 @@ GLOBAL_LIST_EMPTY(starlight) run_later = TRUE plane = PLANE_SPACE layer = SPACE_LAYER - light_power = 0.25 // DARKPACK EDIT CHANGE, ORIGINAL: light_power = 1 - CITY_TIME - light_range = 0.5 // DARKPACK EDIT CHANGE, ORIGINAL: light_range = 2 - CITY_TIME + light_power = 1 + light_range = 2 light_color = COLOR_STARLIGHT light_height = LIGHTING_HEIGHT_SPACE light_on = FALSE @@ -72,7 +72,7 @@ GLOBAL_LIST_EMPTY(starlight) force_no_gravity = TRUE /turf/open/space/basic - MAP_SWITCH(icon_state = "space", icon_state = "space_basic_map") + icon_state = MAP_SWITCH("space", "space_basic_map") /turf/open/space/basic/New() //Do not convert to Initialize SHOULD_CALL_PARENT(FALSE) @@ -174,10 +174,10 @@ GLOBAL_LIST_EMPTY(starlight) /turf/open/space/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) if(the_rcd.mode == RCD_TURF) - if(rcd_data["[RCD_DESIGN_PATH]"] == /turf/open/floor/plating/rcd) + if(rcd_data[RCD_DESIGN_PATH] == /turf/open/floor/plating/rcd) place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE - else if(rcd_data["[RCD_DESIGN_PATH]"] == /obj/structure/lattice/catwalk) + else if(rcd_data[RCD_DESIGN_PATH] == /obj/structure/lattice/catwalk) var/obj/structure/lattice/lattice = locate(/obj/structure/lattice, src) if(lattice) qdel(lattice) @@ -193,6 +193,9 @@ GLOBAL_LIST_EMPTY(starlight) if (!. || isspaceturf(.)) return + if (flags & CHANGETURF_NO_AREA_CHANGE) + return + var/area/new_turf_area = get_area(.) if (istype(new_turf_area, /area/space) && !istype(new_turf_area, /area/space/nearstation)) set_turf_to_area(., GLOB.areas_by_type[/area/space/nearstation]) diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm index 7dde7cb70b1f..35678cc45ad3 100644 --- a/code/game/turfs/open/water.dm +++ b/code/game/turfs/open/water.dm @@ -40,6 +40,8 @@ var/ticking_oxy_damage = 2 var/exhaust_swimmer_prob = 30 + var/datum/reagent/reagent_to_extract = /datum/reagent/water + /turf/open/water/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(on_atom_inited)) @@ -47,6 +49,8 @@ if(!isnull(fishing_datum)) add_lazy_fishing(fishing_datum) ADD_TRAIT(src, TRAIT_CATCH_AND_RELEASE, INNATE_TRAIT) + if(reagent_to_extract) + AddElement(/datum/element/reagent_scoopable_atom, reagent_to_extract) ///We lazily add the immerse element when something is spawned or crosses this turf and not before. /turf/open/water/proc/on_atom_inited(datum/source, atom/movable/movable) @@ -109,6 +113,7 @@ base_icon_state = "water" baseturfs = /turf/open/water/beach fishing_datum = /datum/fish_source/ocean/beach + reagent_to_extract = /datum/reagent/water/salt /turf/open/water/beach/Initialize(mapload) . = ..() @@ -154,6 +159,7 @@ planetary_atmos = FALSE immerse_overlay_alpha = 190 fishing_datum = /datum/fish_source/hot_spring + reagent_to_extract = /datum/reagent/water/mineral /turf/open/water/hot_spring/Initialize(mapload) . = ..() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 223fc48a72ff..3a17329e8781 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -52,7 +52,7 @@ GLOBAL_LIST_EMPTY(station_turfs) var/bullet_sizzle = FALSE //used by ammo_casing/bounce_away() to determine if the shell casing should make a sizzle sound when it's ejected over the turf //IE if the turf is supposed to be water, set TRUE. - var/tiled_dirt = FALSE // use smooth tiled dirt decal + var/tiled_turf = FALSE // use tiled water and dirt decals ///Icon-smoothing variable to map a diagonal wall corner with a fixed underlay. var/list/fixed_underlay = null @@ -91,7 +91,7 @@ GLOBAL_LIST_EMPTY(station_turfs) var/force_no_gravity = FALSE ///This turf's resistance to getting rusted - var/rust_resistance = RUST_RESISTANCE_ORGANIC + var/rust_resistance = RUST_RESISTANCE_BASIC /// How pathing algorithm will check if this turf is passable by itself (not including content checks). By default it's just density check. /// WARNING: Currently to use a density shortcircuiting this does not support dense turfs with special allow through function @@ -553,9 +553,6 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/proc/can_lay_cable() return can_have_cabling() && underfloor_accessibility >= UNDERFLOOR_INTERACTABLE -/turf/proc/visibilityChanged() - GLOB.cameranet.updateVisibility(src) - /turf/proc/burn_tile() return @@ -669,11 +666,12 @@ GLOBAL_LIST_EMPTY(station_turfs) return TRUE /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/throw_up = new vomit_type(src, vomiter?.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 @@ -682,21 +680,28 @@ GLOBAL_LIST_EMPTY(station_turfs) 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/stomach/belly = M.get_organ_slot(ORGAN_SLOT_STOMACH) +/proc/clear_reagents_to_vomit_pool(mob/living/carbon/owner, obj/effect/decal/cleanable/vomit/vomit, purge_ratio = 0.1) + var/obj/item/organ/stomach/belly = owner.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, transferred_by = M) - //clear the stomach of anything even not food + if (vomit.reagents) + vomit.reagents.maximum_volume += chemicals_lost + else + vomit.create_reagents(chemicals_lost) + + belly.reagents.trans_to(vomit, chemicals_lost, transferred_by = owner) + // Clear the stomach of anything even not food for(var/bile in belly.reagents.reagent_list) var/datum/reagent/reagent = bile if(!belly.food_reagents[reagent.type]) belly.reagents.remove_reagent(reagent.type, min(reagent.volume, 10)) - else - var/bit_vol = reagent.volume - belly.food_reagents[reagent.type] - if(bit_vol > 0) - belly.reagents.remove_reagent(reagent.type, min(bit_vol, 10)) + continue + + var/bit_vol = reagent.volume - belly.food_reagents[reagent.type] + if(bit_vol > 0) + belly.reagents.remove_reagent(reagent.type, min(bit_vol, 10)) //Whatever happens after high temperature fire dies out or thermite reaction works. //Should return new turf @@ -799,7 +804,7 @@ GLOBAL_LIST_EMPTY(station_turfs) /// Returns whether it is safe for an atom to move across this turf /turf/proc/can_cross_safely(atom/movable/crossing) - return TRUE + return !HAS_TRAIT(src, TRAIT_AI_AVOID_TURF) /** * the following are some fishing-related optimizations to shave off as much diff --git a/code/game/world.dm b/code/game/world.dm index e2dd3726c35e..b687b25256db 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -186,6 +186,10 @@ GLOBAL_VAR(restart_counter) setup_autowiki() #endif + #ifdef PERFORMANCE_TESTS + queue_performance_tests() + #endif + /world/proc/HandleTestRun() //trigger things to run the whole process Master.sleep_offline_after_initializations = FALSE @@ -199,6 +203,25 @@ GLOBAL_VAR(restart_counter) #endif SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), cb, 10 SECONDS)) +/world/proc/queue_performance_tests() + //trigger things to run the whole process + Master.sleep_offline_after_initializations = FALSE + SSticker.start_immediately = TRUE + var/datum/callback/cb = CALLBACK(src, PROC_REF(run_performance_tests)) + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), cb, 10 SECONDS)) + +/// Stub proc intended to be filled with code that does some test, profiles it, and logs that test. +/// Intended to be used with line by line macros, but you should live your truth +/world/proc/run_performance_tests() + // In case we do somethin that could otherwise end the round + SSticker.delay_end = TRUE + // Your code goes here + + // Logging goes here + // (sample line by line) stat_tracking_export_to_csv_later("file_name.csv", GLOB.cost_list, GLOB.count_list) + SSticker.delay_end = FALSE + shutdown() + /// Returns a list of data about the world state, don't clutter /world/proc/get_world_state_for_logging() var/data = list() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index e1159d405032..e13afc05d769 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -35,29 +35,44 @@ ////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS -ADMIN_VERB(spawn_atom, R_SPAWN, "Spawn", "Spawn an atom.", ADMIN_CATEGORY_DEBUG, object as text) - if(!object) - return - var/list/preparsed = splittext(object,":") - var/path = preparsed[1] - var/amount = 1 - if(preparsed.len > 1) - amount = clamp(text2num(preparsed[2]),1,ADMIN_SPAWN_CAP) +ADMIN_VERB(spawn_atom, R_SPAWN, "Spawn", "Spawn an atom.", ADMIN_CATEGORY_DEBUG, object as text|null) + var/static/list/atom_types + if (isnull(atom_types)) + atom_types = subtypesof(/atom) + + var/chosen_path = null + var/list/preparsed = null + if (object) + preparsed = splittext(object, ":") + var/list/matches = filter_fancy_list(atom_types, preparsed[1]) + if (length(matches) == 1) + chosen_path = matches[1] + + if(!chosen_path) + var/datum/spawn_menu/menu = user.holder.spawn_menu + if (!menu) + menu = new() + user.holder.spawn_menu = menu + menu.init_value = object + menu.ui_interact(user.mob) + BLACKBOX_LOG_ADMIN_VERB("Spawn Atom") + return TRUE - var/chosen = pick_closest_path(path) - if(!chosen) - return - var/turf/T = get_turf(user.mob) + var/amount = 1 + if (length(preparsed) > 1) + amount = clamp(text2num(preparsed[2]), 1, ADMIN_SPAWN_CAP) - if(ispath(chosen, /turf)) - T.ChangeTurf(chosen) + var/turf/target_turf = get_turf(user.mob) + if (ispath(chosen_path, /turf)) + target_turf.ChangeTurf(chosen_path) else - for(var/i in 1 to amount) - var/atom/A = new chosen(T) - A.flags_1 |= ADMIN_SPAWNED_1 + for (var/i in 1 to amount) + var/atom/spawned = new chosen_path(target_turf) + spawned.flags_1 |= ADMIN_SPAWNED_1 - log_admin("[key_name(user)] spawned [amount] x [chosen] at [AREACOORD(user.mob)]") + log_admin("[key_name(user.mob)] spawned [amount] x [chosen_path] at [AREACOORD(user.mob)]") BLACKBOX_LOG_ADMIN_VERB("Spawn Atom") + return TRUE ADMIN_VERB(spawn_atom_pod, R_SPAWN, "PodSpawn", "Spawn an atom via supply drop.", ADMIN_CATEGORY_DEBUG, object as text) var/chosen = pick_closest_path(object) @@ -84,7 +99,7 @@ ADMIN_VERB(spawn_cargo, R_SPAWN, "Spawn Cargo", "Spawn a cargo crate.", ADMIN_CA if(!chosen) return var/datum/supply_pack/S = new chosen - S.admin_spawned = TRUE + S.order_flags |= ORDER_ADMIN_SPAWNED S.generate(get_turf(user.mob)) log_admin("[key_name(user)] spawned cargo pack [chosen] at [AREACOORD(user.mob)]") diff --git a/code/modules/admin/admin_fax_panel.dm b/code/modules/admin/admin_fax_panel.dm index 3a9744ee3e48..d426c48b14dd 100644 --- a/code/modules/admin/admin_fax_panel.dm +++ b/code/modules/admin/admin_fax_panel.dm @@ -25,7 +25,7 @@ ADMIN_VERB(fax_panel, R_ADMIN, "Fax Panel", "View and respond to faxes sent to C available_faxes += WEAKREF(fax) //Get all stamps - for(var/stamp in subtypesof(/obj/item/stamp)) + for(var/stamp in valid_subtypesof(/obj/item/stamp)) var/obj/item/stamp/real_stamp = new stamp() if(!istype(real_stamp, /obj/item/stamp/chameleon) && !istype(real_stamp, /obj/item/stamp/mod)) var/stamp_detail = real_stamp.get_writing_implement_details() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index a2ea441d8232..6c62612366b8 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -33,6 +33,11 @@ ADMIN_VERB(admin_ghost, R_ADMIN, "AGhost", "Become a ghost without DNR.", ADMIN_ //ghostize log_admin("[key_name(user)] admin ghosted.") message_admins("[key_name_admin(user)] admin ghosted.") + // DARKPACK EDIT START + if(isavatar(user.mob)) + var/mob/living/basic/avatar/ghost = user.mob + ghost.exit_avatar(force = TRUE) + // DARKPACK EDIT END var/mob/body = user.mob body.ghostize(TRUE, TRUE) user.init_verbs() diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm index 823a4a9e64bf..0bf184689063 100644 --- a/code/modules/admin/callproc/callproc.dm +++ b/code/modules/admin/callproc/callproc.dm @@ -159,7 +159,10 @@ ADMIN_VERB(advanced_proc_call, R_DEBUG, "Advanced ProcCall", "Call a proc on any returnval = WrapAdminProcCall(GLOBAL_PROC, procname, lst) // Pass the lst as an argument list to the proc BLACKBOX_LOG_ADMIN_VERB("Advanced ProcCall") if(get_retval) - get_retval += returnval + if (islist(returnval)) + get_retval += list(returnval) // Wrap to stop BYOND from concat-ing the lists + else + get_retval += returnval . = get_callproc_returnval(returnval, procname) if(.) to_chat(usr, ., confidential = TRUE) diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 3e8d212d0713..fdde0aa1cb23 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -135,11 +135,11 @@ var/effect_range = 5 /obj/effect/fun_balloon/scatter/effect() - for(var/mob/living/M in range(effect_range, get_turf(src))) - var/turf/T = find_safe_turf(zlevel = src.z) - new /obj/effect/temp_visual/gravpush(get_turf(M)) - M.forceMove(T) - to_chat(M, span_notice("Pop!"), confidential = TRUE) + for(var/mob/living/dispersed_mob in range(effect_range, get_turf(src))) + var/turf/drop_off = find_safe_turf(z) + new /obj/effect/temp_visual/gravpush(get_turf(dispersed_mob)) + dispersed_mob.forceMove(drop_off) + dispersed_mob.balloon_alert(dispersed_mob, "pop!") // ----------- Station Crash // Can't think of anywhere better to put it right now diff --git a/code/modules/admin/greyscale_modify_menu.dm b/code/modules/admin/greyscale_modify_menu.dm index c87c424661fd..7d3710ffb08f 100644 --- a/code/modules/admin/greyscale_modify_menu.dm +++ b/code/modules/admin/greyscale_modify_menu.dm @@ -166,12 +166,12 @@ if("pick_color") var/group = params["color_index"] - var/new_color = input( + var/new_color = tgui_color_picker( usr, "Choose color for greyscale color group [group]:", "Greyscale Modification Menu", split_colors[group] - ) as color|null + ) if(new_color) split_colors[group] = new_color queue_refresh() diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 6be76b4df87b..18b96318f067 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -32,12 +32,14 @@ GLOBAL_PROTECT(href_token) var/deadmined - var/datum/filter_editor/filteriffic + var/datum/filter_editor/filterrific var/datum/particle_editor/particle_test var/datum/colorblind_tester/color_test var/datum/plane_master_debug/plane_debug var/obj/machinery/computer/libraryconsole/admin_only_do_not_map_in_you_fucker/library_manager var/datum/pathfind_debug/path_debug + var/datum/spawn_menu/spawn_menu + var/datum/spawnpanel/spawn_panel /// Whether or not the user tried to connect, but was blocked by 2FA var/blocked_by_2fa = FALSE diff --git a/code/modules/admin/outfit_editor.dm b/code/modules/admin/outfit_editor.dm index 765fbb9999d4..7a8b4f60ccab 100644 --- a/code/modules/admin/outfit_editor.dm +++ b/code/modules/admin/outfit_editor.dm @@ -55,7 +55,7 @@ "name" = initial(item.name), "desc" = initial(item.desc), // at this point initializing the item is probably faster tbh - "sprite" = icon2base64(icon(initial(item.icon), initial(item.icon_state))), + "sprite" = icon2base64(icon(initial(item.icon), initial(item.icon_state), frame = 1)), ) return data @@ -78,7 +78,9 @@ var/icon/dummysprite = get_flat_human_icon(null, dummy_key = dummy_key, showDirs = list(SOUTH), - outfit_override = drip) + outfit_override = drip, + no_anim = TRUE, + ) data["dummy64"] = icon2base64(dummysprite) return data diff --git a/code/modules/admin/poll_management.dm b/code/modules/admin/poll_management.dm index 88a38c90166b..80ba5ec56a03 100644 --- a/code/modules/admin/poll_management.dm +++ b/code/modules/admin/poll_management.dm @@ -229,8 +229,7 @@ output += "
" var/datum/browser/panel = new(usr, "pmpanel", "Poll Management Panel", 780, 640) panel.add_stylesheet("admin_panelscss", 'html/admin/admin_panels.css') - if(usr.client.prefs.read_preference(/datum/preference/toggle/tgui_fancy)) //some browsers (IE8) have trouble with unsupported css3 elements that break the panel's functionality, so we won't load those if a user is in no frills tgui mode since that's for similar compatability support - panel.add_stylesheet("admin_panelscss3", 'html/admin/admin_panels_css3.css') + panel.add_stylesheet("admin_panelscss3", 'html/admin/admin_panels_css3.css') panel.set_content(jointext(output, "")) panel.open() @@ -527,8 +526,7 @@ panel_height = 320 var/datum/browser/panel = new(usr, "popanel", "Poll Option Panel", 370, panel_height) panel.add_stylesheet("admin_panelscss", 'html/admin/admin_panels.css') - if(usr.client.prefs.read_preference(/datum/preference/toggle/tgui_fancy)) //some browsers (IE8) have trouble with unsupported css3 elements that break the panel's functionality, so we won't load those if a user is in no frills tgui mode since that's for similar compatability support - panel.add_stylesheet("admin_panelscss3", 'html/admin/admin_panels_css3.css') + panel.add_stylesheet("admin_panelscss3", 'html/admin/admin_panels_css3.css') panel.set_content(jointext(output, "")) panel.open() diff --git a/code/modules/admin/smites/boneless.dm b/code/modules/admin/smites/boneless.dm index a3031ce13ffc..3fd1a1121f4b 100644 --- a/code/modules/admin/smites/boneless.dm +++ b/code/modules/admin/smites/boneless.dm @@ -11,7 +11,7 @@ var/mob/living/carbon/carbon_target = target for(var/obj/item/bodypart/limb as anything in carbon_target.bodyparts) - var/severity = pick_weight(list( + var/severity = pick_weight(alist( WOUND_SEVERITY_MODERATE = 1, WOUND_SEVERITY_SEVERE = 2, WOUND_SEVERITY_CRITICAL = 2, diff --git a/code/modules/admin/smites/brain_damage.dm b/code/modules/admin/smites/brain_damage.dm index ceafc49df24c..1d70bc60f6cd 100644 --- a/code/modules/admin/smites/brain_damage.dm +++ b/code/modules/admin/smites/brain_damage.dm @@ -4,4 +4,4 @@ /datum/smite/brain_damage/effect(client/user, mob/living/target) . = ..() - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, BRAIN_DAMAGE_DEATH - 1, BRAIN_DAMAGE_DEATH - 1) + target.adjust_organ_loss(ORGAN_SLOT_BRAIN, BRAIN_DAMAGE_DEATH - 1, BRAIN_DAMAGE_DEATH - 1) diff --git a/code/modules/admin/smites/bsa.dm b/code/modules/admin/smites/bsa.dm index 806de6442938..b833af12a3a8 100644 --- a/code/modules/admin/smites/bsa.dm +++ b/code/modules/admin/smites/bsa.dm @@ -22,7 +22,7 @@ if (target.health <= 1) target.gib(DROP_BODYPARTS) else - target.adjustBruteLoss(min(BSA_MAX_DAMAGE, target.health - 1)) + target.adjust_brute_loss(min(BSA_MAX_DAMAGE, target.health - 1)) target.Paralyze(BSA_PARALYZE_TIME) target.set_stutter(BSA_STUTTER_TIME) diff --git a/code/modules/admin/smites/dock_pay.dm b/code/modules/admin/smites/dock_pay.dm index a3828feb828d..6eaa7b53792f 100644 --- a/code/modules/admin/smites/dock_pay.dm +++ b/code/modules/admin/smites/dock_pay.dm @@ -18,14 +18,14 @@ if (card.registered_account.account_balance == 0) to_chat(user, span_warning("ID Card lacks any funds. No pay to dock.")) return - var/new_cost = input("How much pay are we docking? Current balance: [card.registered_account.account_balance] credits.", "BUDGET CUTS") as num|null + var/new_cost = input("How much pay are we docking? Current balance: [card.registered_account.account_balance] [MONEY_NAME].", "BUDGET CUTS") as num|null if (!new_cost) return if (!(card.registered_account.has_money(new_cost))) to_chat(user, span_warning("ID Card lacked funds. Emptying account.")) - card.registered_account.bank_card_talk("[new_cost] credits deducted from your account based on performance review.") + card.registered_account.bank_card_talk("[new_cost] [MONEY_NAME] deducted from your account based on performance review.") card.registered_account.account_balance = 0 else card.registered_account.account_balance = card.registered_account.account_balance - new_cost - card.registered_account.bank_card_talk("[new_cost] credits deducted from your account based on performance review.") + card.registered_account.bank_card_talk("[new_cost] [MONEY_NAME] deducted from your account based on performance review.") SEND_SOUND(target, 'sound/machines/buzz/buzz-sigh.ogg') diff --git a/code/modules/admin/smites/fake_bwoink.dm b/code/modules/admin/smites/fake_bwoink.dm index a4179ff5ce82..95d30298729b 100644 --- a/code/modules/admin/smites/fake_bwoink.dm +++ b/code/modules/admin/smites/fake_bwoink.dm @@ -4,4 +4,4 @@ /datum/smite/fake_bwoink/effect(client/user, mob/living/target) . = ..() - SEND_SOUND(target, 'sound/effects/adminhelp.ogg') + SEND_SOUND(target, 'modular_darkpack/master_files/sounds/adminhelp.ogg') // DARKPACK EDIT CHANGE diff --git a/code/modules/admin/smites/lightning.dm b/code/modules/admin/smites/lightning.dm index 99cb46bdaace..be015a8a1c15 100644 --- a/code/modules/admin/smites/lightning.dm +++ b/code/modules/admin/smites/lightning.dm @@ -11,7 +11,7 @@ /proc/lightningbolt(mob/living/user) var/turf/lightning_source = get_step(get_step(user, NORTH), NORTH) lightning_source.Beam(user, icon_state="lightning[rand(1,12)]", time = 5) - user.adjustFireLoss(LIGHTNING_BOLT_DAMAGE) + user.adjust_fire_loss(LIGHTNING_BOLT_DAMAGE) playsound(get_turf(user), 'sound/effects/magic/lightningbolt.ogg', 50, TRUE) if(ishuman(user)) var/mob/living/carbon/human/human_target = user diff --git a/code/modules/admin/smites/retcon.dm b/code/modules/admin/smites/retcon.dm index 461b7b330bbf..33beb3542e89 100644 --- a/code/modules/admin/smites/retcon.dm +++ b/code/modules/admin/smites/retcon.dm @@ -27,7 +27,7 @@ /datum/smite/retcon/proc/delete_bank_account(mob/living/target) var/name = target.real_name - var/account_list = flatten_list(SSeconomy.bank_accounts_by_id) + var/account_list = assoc_to_values(SSeconomy.bank_accounts_by_id) for(var/datum/bank_account/account in account_list) if(account.account_holder == name) qdel(account) diff --git a/code/modules/admin/spawn_menu.dm b/code/modules/admin/spawn_menu.dm new file mode 100644 index 000000000000..07e461e39573 --- /dev/null +++ b/code/modules/admin/spawn_menu.dm @@ -0,0 +1,92 @@ +/datum/spawn_menu + /// Does the menu default to a regex prefix? + var/regex_search = FALSE + /// Does the search include atom names? + var/name_search = TRUE + /// Should we display full typepaths or the condensed versions? + var/fancy_types = TRUE + /// Should abstract types be included in the search? + var/include_abstracts = FALSE + /// Initial search value from the latest command + var/init_value = null + +/datum/spawn_menu/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if (!ui) + ui = new(user, src, "SpawnSearch") + ui.open() + +/datum/spawn_menu/ui_state(mob/user) + return ADMIN_STATE(R_SPAWN) + +/datum/spawn_menu/ui_act(action, params, datum/tgui/ui) + if (..() || !check_rights_for(ui.user.client, R_SPAWN)) + return FALSE + + switch (action) + if ("setRegexSearch") + regex_search = params["regexSearch"] + return TRUE + + if ("setNameSearch") + name_search = params["searchNames"] + return TRUE + + if ("setFancyTypes") + fancy_types = params["fancyTypes"] + return TRUE + + if ("setIncludeAbstracts") + include_abstracts = params["includeAbstracts"] + return TRUE + + if ("spawn") + var/path = text2path(params["type"]) + if (!path) + return TRUE + var/amount = clamp(text2num(params["amount"]) || 1, 1, ADMIN_SPAWN_CAP) + var/turf/target_turf = get_turf(ui.user) + if(ispath(path, /turf)) + target_turf.ChangeTurf(path) + else + for(var/i in 1 to amount) + var/atom/spawned = new path(target_turf) + spawned.flags_1 |= ADMIN_SPAWNED_1 + + log_admin("[key_name(ui.user)] spawned [amount] x [path] at [AREACOORD(ui.user)]") + SStgui.close_uis(src) + return TRUE + + if ("cancel") + SStgui.close_uis(src) + return TRUE + +/datum/spawn_menu/ui_data(mob/user) + var/list/data = list() + data["initValue"] = init_value + data["searchNames"] = name_search + data["regexSearch"] = regex_search + data["fancyTypes"] = fancy_types + data["includeAbstracts"] = include_abstracts + return data + +/datum/spawn_menu/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/json/spawn_menu), + ) + +/datum/asset/json/spawn_menu + name = "spawn_menu_atom_data" + +/datum/asset/json/spawn_menu/generate() + var/list/data = list() + var/static/list/types_list + if (isnull(types_list)) + var/list/local_types = list() + for (var/atom/atom_type as anything in subtypesof(/atom)) + local_types[atom_type] = atom_type::name || "" + types_list = local_types + data["types"] = types_list + data["abstractTypes"] = get_abstract_types() + data["fancyTypes"] = GLOB.fancy_type_replacements + return data diff --git a/code/modules/admin/spawn_panel/spawn_panel.dm b/code/modules/admin/spawn_panel/spawn_panel.dm index 95097d6badea..a5cc42a43919 100644 --- a/code/modules/admin/spawn_panel/spawn_panel.dm +++ b/code/modules/admin/spawn_panel/spawn_panel.dm @@ -15,14 +15,10 @@ #define OFFSET_ABSOLUTE "Absolute offset" #define OFFSET_RELATIVE "Relative offset" -GLOBAL_LIST_INIT(spawnpanels_by_ckey, list()) - /* An instance of a /tg/UI™ Spawn Panel. Stores preferences, spawns things, controls the UI. Unique for each user (their ckey). */ /datum/spawnpanel - /// Who this instance of spawn panel belongs to. The instances are unique to correctly keep modified values between multiple admins. - var/owner_ckey /// Where and how the atom should be spawned. var/where_target_type = WHERE_FLOOR_BELOW_MOB /// The atom selected from the panel. @@ -57,45 +53,21 @@ GLOBAL_LIST_INIT(spawnpanels_by_ckey, list()) offset = list("X" = 0, "Y" = 0, "Z" = 0) /datum/spawnpanel/ui_interact(mob/user, datum/tgui/ui) - if(user.client.ckey != owner_ckey) - return - ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "SpawnPanel") ui.open() -/// Returns a `spawnpanel` instance belonging to this `user`, or creates and registers a new one -/proc/get_spawnpanel_for_admin(mob/user) - if(!user?.client?.ckey) - return null - - var/ckey = user.client.ckey - - if(GLOB.spawnpanels_by_ckey[ckey]) - return GLOB.spawnpanels_by_ckey[ckey] - - var/datum/spawnpanel/new_panel = new() - new_panel.owner_ckey = ckey - GLOB.spawnpanels_by_ckey[ckey] = new_panel - - return new_panel - /datum/spawnpanel/ui_close(mob/user) . = ..() if (precise_mode && precise_mode != PRECISE_MODE_OFF) toggle_precise_mode(PRECISE_MODE_OFF) /datum/spawnpanel/ui_state(mob/user) - if(user.client.ckey != owner_ckey) - return GLOB.never_state - return ADMIN_STATE(R_ADMIN) + return ADMIN_STATE(R_SPAWN) -/datum/spawnpanel/ui_act(action, params) - if(..()) - return FALSE - - if(usr.client.ckey != owner_ckey) +/datum/spawnpanel/ui_act(action, params, datum/tgui/ui) + if(..() || !check_rights_for(ui.user.client, R_SPAWN)) return FALSE switch(action) @@ -106,12 +78,10 @@ GLOBAL_LIST_INIT(spawnpanels_by_ckey, list()) available_icon_states = icon_states(selected_atom_icon) if(!(selected_atom_icon_state in available_icon_states)) selected_atom_icon_state = available_icon_states[1] - SStgui.update_uis(src) return TRUE if("set-apply-icon-override") apply_icon_override = !!params["value"] - SStgui.update_uis(src) return TRUE if("reset-DMI-icon") @@ -123,35 +93,28 @@ GLOBAL_LIST_INIT(spawnpanels_by_ckey, list()) available_icon_states = icon_states(selected_atom_icon) else available_icon_states = list() - - SStgui.update_uis(src) return TRUE if("select-new-icon-state") selected_atom_icon_state = params["new_state"] - SStgui.update_uis(src) return TRUE if("reset-icon-state") selected_atom_icon_state = null if(selected_atom) selected_atom_icon_state = initial(selected_atom.icon_state) - SStgui.update_uis(src) return TRUE if("set-icon-size") atom_icon_size = params["size"] - SStgui.update_uis(src) return TRUE if("reset-icon-size") atom_icon_size = 100 - SStgui.update_uis(src) return TRUE if("get-icon-states") available_icon_states = icon_states(selected_atom_icon) - SStgui.update_uis(src) return TRUE if("selected-atom-changed") diff --git a/code/modules/admin/sql_ban_system.dm b/code/modules/admin/sql_ban_system.dm index 71b2c866f0dd..113845a1f7f0 100644 --- a/code/modules/admin/sql_ban_system.dm +++ b/code/modules/admin/sql_ban_system.dm @@ -194,10 +194,8 @@ var/datum/browser/panel = new(usr, "banpanel", "Banning Panel", 910, panel_height) panel.add_stylesheet("admin_panelscss", 'html/admin/admin_panels.css') panel.add_stylesheet("banpanelcss", 'html/admin/banpanel.css') - var/tgui_fancy = usr.client.prefs.read_preference(/datum/preference/toggle/tgui_fancy) - if(tgui_fancy) //some browsers (IE8) have trouble with unsupported css3 elements and DOM methods that break the panel's functionality, so we won't load those if a user is in no frills tgui mode since that's for similar compatability support - panel.add_stylesheet("admin_panelscss3", 'html/admin/admin_panels_css3.css') - panel.add_script("banpaneljs", 'html/admin/banpanel.js') + panel.add_stylesheet("admin_panelscss3", 'html/admin/admin_panels_css3.css') + panel.add_script("banpaneljs", 'html/admin/banpanel.js') var/list/output = list("
[HrefTokenFormField()]") output += {"
" for(var/datum/job/job_datum as anything in department.get_jobban_jobs()) if(break_counter > 0 && (break_counter % 3 == 0)) @@ -337,7 +335,8 @@ if(!department_index) stack_trace("Failed to find a department index for [department.type] in the departments_list of [job_datum.type]") output += {" "} else @@ -352,7 +351,7 @@ "Abstract" = list("Appearance", "Emote", "Deadchat", "OOC", "Urgent Adminhelp"), ) for(var/department in other_job_lists) - output += "
" + output += "
" break_counter = 0 for(var/job in other_job_lists[department]) if(break_counter > 0 && (break_counter % 3 == 0)) @@ -399,9 +398,14 @@ ROLE_WIZARD, ROLE_VOIDWALKER, ), + // DARKPACK EDIT ADD START + "Darkpack Ban Options" = list( + BAN_LOOC, + ), + // DARKPACK EDIT ADD END ) for(var/department in long_job_lists) - output += "
" + output += "
" break_counter = 0 for(var/job in long_job_lists[department]) if(break_counter > 0 && (break_counter % 10 == 0)) diff --git a/code/modules/admin/tag.dm b/code/modules/admin/tag.dm index e3c3dc9c0a85..6b2160585b2d 100644 --- a/code/modules/admin/tag.dm +++ b/code/modules/admin/tag.dm @@ -44,11 +44,11 @@ #define TAG_MARK(X) "(MARK)" #define TAG_SIMPLE_HEALTH(X) "Health: [X.health]" #define TAG_CARBON_HEALTH(X) "Health: [X.health] (\ - [X.getBruteLoss()] \ - [X.getFireLoss()] \ - [X.getToxLoss()] \ - [X.getOxyLoss()] \ - [X.getAggLoss()]" // DARKPACK EDIT ADD - AGGRAVATED_DAMAGE + [X.get_brute_loss()] \ + [X.get_fire_loss()] \ + [X.get_tox_loss()] \ + [X.get_oxy_loss()] \ + [X.get_agg_loss()]" // DARKPACK EDIT ADD - AGGRAVATED_DAMAGE ADMIN_VERB(display_tags, R_ADMIN, "View Tags", "Display all of the tagged datums.", ADMIN_CATEGORY_GAME) var/index = 0 diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 76db18e794ba..85156dbffe9a 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -714,8 +714,8 @@ if(DEAD) status = "Dead" health_description = "Status: [status]" - health_description += "
Brute: [lifer.getBruteLoss()] - Burn: [lifer.getFireLoss()] - Toxin: [lifer.getToxLoss()] - Suffocation: [lifer.getOxyLoss()]" - health_description += "
Brain: [lifer.get_organ_loss(ORGAN_SLOT_BRAIN)] - Stamina: [lifer.getStaminaLoss()] - Aggravated: [lifer.getAggLoss()]" // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE + health_description += "
Brute: [lifer.get_brute_loss()] - Burn: [lifer.get_fire_loss()] - Toxin: [lifer.get_tox_loss()] - Suffocation: [lifer.get_oxy_loss()]" + health_description += "
Brain: [lifer.get_organ_loss(ORGAN_SLOT_BRAIN)] - Stamina: [lifer.get_stamina_loss()] - Aggravated: [lifer.get_agg_loss()]" // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE else health_description = "This mob type has no health to speak of." @@ -929,6 +929,16 @@ return M.get_language_holder().open_language_menu(usr) + else if(href_list["rpreminder"]) + var/mob/rper = locate(href_list["rpreminder"]) in GLOB.player_list + if(QDELETED(rper)) + return + // literally just gives them a sound and a message + SEND_SOUND(rper, sound('sound/misc/roleplay.ogg')) + to_chat(rper, boxed_message("You hear a nagging voice in your head... [span_hypnophrase("Please roleplay appropriately.")]")) + message_admins("[ADMIN_LOOKUPFLW(usr)] reminded [ADMIN_LOOKUPFLW(rper)] to roleplay appropriately.") + log_admin("[key_name(usr)] reminded [key_name(rper)] to roleplay appropriately.") + else if(href_list["traitor"]) if(!check_rights(R_ADMIN)) return @@ -1272,9 +1282,6 @@ var/ban_id = href_list["unbanlog"] ban_log(ban_id) - else if(href_list["beakerpanel"]) - beaker_panel_act(href_list) - else if(href_list["reloadpolls"]) GLOB.polls.Cut() GLOB.poll_options.Cut() diff --git a/code/modules/admin/verbs/admin.dm b/code/modules/admin/verbs/admin.dm index c63abb8888b4..d678f4e1cc8f 100644 --- a/code/modules/admin/verbs/admin.dm +++ b/code/modules/admin/verbs/admin.dm @@ -125,7 +125,7 @@ ADMIN_VERB(cmd_admin_check_player_exp, R_ADMIN, "Player Playtime", "View player return chosen_trait = available_traits[chosen_trait] - var/source = "adminabuse" + var/source = TRAIT_ADMIN_GRANTED switch(add_or_remove) if("Add") //Not doing source choosing here intentionally to make this bit faster to use, you can always vv it. if(GLOB.movement_type_trait_to_flag[chosen_trait]) //include the required element. @@ -183,6 +183,11 @@ ADMIN_VERB(drop_everything, R_ADMIN, "Drop Everything", ADMIN_VERB_NO_DESCRIPTIO if(MUTE_DEADCHAT) mute_string = "deadchat and DSAY" feedback_string = "Deadchat" + // DARKPACK EDIT ADD START + if(MUTE_LOOC) + mute_string = "LOOC" + feedback_string = "LOOC" + // DARKPACK EDIT ADD END if(MUTE_INTERNET_REQUEST) mute_string = "internet sound requests" feedback_string = "Internet Sound Requests" diff --git a/code/modules/admin/verbs/adminfun.dm b/code/modules/admin/verbs/adminfun.dm index 4da149a9c182..883eb6949ef9 100644 --- a/code/modules/admin/verbs/adminfun.dm +++ b/code/modules/admin/verbs/adminfun.dm @@ -165,6 +165,96 @@ ADMIN_VERB(polymorph_all, R_ADMIN, "Polymorph All", "Applies the effects of the message_admins("Mass polymorph started by [who_did_it] is complete.") +/// Allow admin to mass add or remove a trait across all mobs +ADMIN_VERB(mass_modify_traits, R_FUN, "Mass Modify Traits", "Adds or removes a trait from every mob.", ADMIN_CATEGORY_FUN) + + var/choice = tgui_alert(user, "Add or Remove Trait?", "Mass Add/Remove Trait", list("Add", "Remove")) + if(isnull(choice)) + return + var/is_add = (choice == "Add") + var/lower_choice = LOWER_TEXT(choice) + + // Build list of valid traits that can be applied to mobs + var/list/available_traits = list() + for(var/key in GLOB.admin_visible_traits) + if(ispath(/mob, key)) // so we get atom and atom/movable traits too, which doing (istype(key, /mob)) would skip + available_traits += GLOB.admin_visible_traits[key] + if(!length(available_traits)) + return + + available_traits = sort_list(available_traits, GLOBAL_PROC_REF(cmp_typepaths_asc)) // sort alphabetically + + var/mob_trait = tgui_input_list(user, "Select a trait to [lower_choice].", "Mass [choice] Trait", available_traits) + if(isnull(mob_trait)) + return + mob_trait = available_traits[mob_trait] + + var/target_scope = tgui_alert(user, "[choice] [lower_choice == "add" ? "to" : "from"] all mobs, or only cliented ones?", "Scope", list("All", "Cliented")) + if(!target_scope) + return + var/cliented_only = (target_scope == "Cliented") + + // So we get readable trait name to display in the uis + if(!GLOB.admin_trait_name_map) + GLOB.admin_trait_name_map = generate_admin_trait_name_map() + var/trait_name = GLOB.admin_trait_name_map[mob_trait] || mob_trait + + // Ask for confirmation first + var/action_word = is_add ? "to" : "from" + var/confirm = tgui_alert( + user, + "Please confirm you want to [lower_choice] [trait_name] [action_word] every [cliented_only ? "cliented" : ""] mob?", + "Confirm Mass [choice] Trait", + list("Yes", "No") + ) + if(confirm != "Yes") + return + + // Perform operation + var/affected = 0 + if(is_add) // Adding trait + var/needs_movetype = GLOB.movement_type_trait_to_flag[mob_trait] + for(var/mob/mob_to_modify as anything in GLOB.alive_mob_list) + if(cliented_only && !mob_to_modify.client) + continue + if(needs_movetype) + mob_to_modify.AddElement(/datum/element/movetype_handler) + ADD_TRAIT(mob_to_modify, mob_trait, TRAIT_ADMIN_GRANTED) + affected++ + + else // Removing trait + var/source = null + var/remove_mode = tgui_alert(user, "Remove from specific source?", "Mass Remove Trait", list("All", "Admin-Granted Traits", "Specific")) + if(isnull(remove_mode)) + return + + switch(remove_mode) + if("Admin-Granted Traits") source = TRAIT_ADMIN_GRANTED + if("Specific") + source = LOWER_TEXT(tgui_input_text(user, "Enter source", "Mass Remove Trait", max_length = MAX_NAME_LEN)) + if(isnull(source)) + return + + for(var/mob/mob_to_modify as anything in GLOB.alive_mob_list) + if(cliented_only && !mob_to_modify.client) + continue + REMOVE_TRAIT(mob_to_modify, mob_trait, source) + affected++ + + if(affected) + var/plural = affected == 1 ? "mob" : "mobs" + var/log_msg = "[key_name_admin(user)] mass [lower_choice][is_add ? "ed" : "d"] [trait_name] [action_word] [affected] [plural]." + message_admins(log_msg) + log_admin(log_msg) + +/// Returns only traits that apply to mobs +/proc/get_mob_admin_traits() + var/list/out = list() + for(var/key in GLOB.admin_visible_traits) + if(ispath(key, /mob)) // key is a mob type or subtype + out += GLOB.admin_visible_traits[key] + return out + ADMIN_VERB_AND_CONTEXT_MENU(admin_smite, R_ADMIN|R_FUN, "Smite", "Smite a player with divine power.", ADMIN_CATEGORY_FUN, mob/living/target in world) var/punishment = tgui_input_list(user, "Choose a punishment", "DIVINE SMITING", GLOB.smites) diff --git a/code/modules/admin/verbs/admingame.dm b/code/modules/admin/verbs/admingame.dm index 3787ed3a2ec9..3b884f21a3a3 100644 --- a/code/modules/admin/verbs/admingame.dm +++ b/code/modules/admin/verbs/admingame.dm @@ -87,6 +87,10 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_ADMIN, "Show Player Panel", mo body += "OOC | " body += "PRAY | " body += "ADMINHELP | " + // DARKPACK EDIT ADD START + body += "DEADCHAT | " + body += "LOOC\]" + // DARKPACK EDIT ADD END body += "WEBREQ | " body += "DEADCHAT\]" body += "(toggle all)" @@ -101,7 +105,8 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_ADMIN, "Show Player Panel", mo body += "Narrate to | " body += "Subtle message | " body += "Play sound to | " - body += "Language Menu" + body += "Language Menu | " + body += "Roleplay Reminder" if(player.client) if(!isnewplayer(player)) @@ -340,15 +345,17 @@ ADMIN_VERB(combo_hud, R_ADMIN, "Toggle Combo HUD", "Toggles the Admin Combo HUD. log_admin("[key_name(user)] toggled their admin combo HUD [user.combo_hud_enabled ? "ON" : "OFF"].") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Combo HUD", "[user.combo_hud_enabled ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! +/// List of hud traits in the admin combo hud +#define ADMIN_HUDS list(TRAIT_SECURITY_HUD, TRAIT_MEDICAL_HUD, TRAIT_DIAGNOSTIC_HUD, TRAIT_BOT_PATH_HUD) + /client/proc/enable_combo_hud() if (combo_hud_enabled) return combo_hud_enabled = TRUE - for (var/hudtype in list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC, DATA_HUD_BOT_PATH)) - var/datum/atom_hud/atom_hud = GLOB.huds[hudtype] - atom_hud.show_to(mob) + for (var/hudtrait in ADMIN_HUDS) + ADD_TRAIT(mob, hudtrait, ADMIN_TRAIT) for (var/datum/atom_hud/alternate_appearance/basic/antagonist_hud/antag_hud in GLOB.active_alternate_appearances) antag_hud.show_to(mob) @@ -362,9 +369,8 @@ ADMIN_VERB(combo_hud, R_ADMIN, "Toggle Combo HUD", "Toggles the Admin Combo HUD. combo_hud_enabled = FALSE - for (var/hudtype in list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC, DATA_HUD_BOT_PATH)) - var/datum/atom_hud/atom_hud = GLOB.huds[hudtype] - atom_hud.hide_from(mob) + for (var/hudtrait in ADMIN_HUDS) + REMOVE_TRAIT(mob, hudtrait, ADMIN_TRAIT) for (var/datum/atom_hud/alternate_appearance/basic/antagonist_hud/antag_hud in GLOB.active_alternate_appearances) antag_hud.hide_from(mob) @@ -372,6 +378,8 @@ ADMIN_VERB(combo_hud, R_ADMIN, "Toggle Combo HUD", "Toggles the Admin Combo HUD. mob.lighting_cutoff = mob.default_lighting_cutoff() mob.update_sight() +#undef ADMIN_HUDS + ADMIN_VERB(show_traitor_panel, R_ADMIN, "Show Traitor Panel", "Edit mobs's memory and role", ADMIN_CATEGORY_GAME, mob/target_mob) var/datum/mind/target_mind = target_mob.mind if(!target_mind) @@ -417,8 +425,9 @@ ADMIN_VERB(lag_switch_panel, R_ADMIN, "Show Lag Switches", "Display the controls user << browse(dat.Join(), "window=lag_switch_panel;size=420x480") ADMIN_VERB(spawn_panel, R_SPAWN, "Spawn Panel", "Spawn Panel (TGUI).", ADMIN_CATEGORY_GAME) - var/datum/spawnpanel/panel = get_spawnpanel_for_admin(user.mob) - if(panel) - panel.ui_interact(user.mob) + var/datum/spawnpanel/panel = user.holder.spawn_panel + if(!panel) + panel = new() + user.holder.spawn_panel = panel + panel.ui_interact(user.mob) BLACKBOX_LOG_ADMIN_VERB("Spawn Panel") - diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 9a9a295510e7..7b174d75ea41 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -416,7 +416,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) //send this msg to all admins for(var/client/X in GLOB.admins) if(X.prefs.toggles & SOUND_ADMINHELP) - SEND_SOUND(X, sound('sound/effects/adminhelp.ogg')) + SEND_SOUND(X, sound('modular_darkpack/master_files/sounds/adminhelp.ogg')) // DARKPACK EDIT CHANGE window_flash(X, ignorepref = TRUE) to_chat(X, type = MESSAGE_TYPE_ADMINPM, @@ -524,7 +524,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(initiator) initiator.giveadminhelpverb() - SEND_SOUND(initiator, sound('sound/effects/adminhelp.ogg')) + SEND_SOUND(initiator, sound('modular_darkpack/master_files/sounds/adminhelp.ogg')) // DARKPACK EDIT CHANGE to_chat(initiator, "- AdminHelp Rejected! -", confidential = TRUE) to_chat(initiator, "Your admin help was rejected. The adminhelp verb has been returned to you so that you may try again.", confidential = TRUE) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index eb1733b1ae5e..e96fba64e853 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -406,7 +406,7 @@ ADMIN_VERB(cmd_admin_pm_panel, R_NONE, "Admin PM", "Show a list of clients to PM SSblackbox.LogAhelp(recipient_ticket_id, "Reply", send_message, recip_ckey, our_ckey) //always play non-admin recipients the adminhelp sound - SEND_SOUND(recipient, sound('sound/effects/adminhelp.ogg')) + SEND_SOUND(recipient, sound('modular_darkpack/master_files/sounds/adminhelp.ogg')) // DARKPACK EDIT CHANGE return TRUE // Ok if we're here, either this message is for an admin, or someone somehow figured out how to send a new message as a player @@ -443,7 +443,7 @@ ADMIN_VERB(cmd_admin_pm_panel, R_NONE, "Admin PM", "Show a list of clients to PM // Let's play some music for the admin, only if they want it tho if(sound_prefs & SOUND_ADMINHELP) - SEND_SOUND(recipient, sound('sound/effects/adminhelp.ogg')) + SEND_SOUND(recipient, sound('modular_darkpack/master_files/sounds/adminhelp.ogg')) // DARKPACK EDIT CHANGE SEND_SIGNAL(ticket, COMSIG_ADMIN_HELP_REPLIED) @@ -709,7 +709,7 @@ ADMIN_VERB(cmd_admin_pm_panel, R_NONE, "Admin PM", "Show a list of clients to PM // Nullcheck because we run a winset in window flash and I do not trust byond if(recipient) //always play non-admin recipients the adminhelp sound - SEND_SOUND(recipient, 'sound/effects/adminhelp.ogg') + SEND_SOUND(recipient, 'modular_darkpack/master_files/sounds/adminhelp.ogg') // DARKPACK EDIT CHANGE recipient.externalreplyamount = EXTERNALREPLYCOUNT return "Message Successful" diff --git a/code/modules/admin/verbs/adminweather.dm b/code/modules/admin/verbs/adminweather.dm index e5c77625b802..8721a1aabb25 100644 --- a/code/modules/admin/verbs/adminweather.dm +++ b/code/modules/admin/verbs/adminweather.dm @@ -28,9 +28,9 @@ ADMIN_VERB(run_weather, R_ADMIN|R_FUN, "Run Weather", "Triggers specific weather return var/list/area_choices = list() - if(!length(area_choices)) - for(var/area/area_type as anything in typesof(/area)) - area_choices[initial(area_type.type)] = area_type + for(var/area/area_instance as anything in GLOB.areas) + area_choices[area_instance.type] ||= list() + area_choices[area_instance.type] |= area_instance var/area/area_choice = tgui_input_list(user, "Select an area for weather to target", "Target Area", area_choices) if(!area_choice) @@ -72,10 +72,10 @@ ADMIN_VERB(run_weather, R_ADMIN|R_FUN, "Run Weather", "Triggers specific weather thunder_value = GLOB.thunder_chance_options[thunder_choice] var/list/weather_data = list( - area = area_choice, - weather_flags = weather_bitflags, - thunder_chance = thunder_value, - reagent = reagent_choice, + WEATHER_FORCED_AREAS = area_choice, + WEATHER_FORCED_FLAGS = weather_bitflags, + WEATHER_FORCED_THUNDER = thunder_value, + WEATHER_FORCED_REAGENT = reagent_choice, ) SSweather.run_weather(weather_choice, z_level, weather_data) diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index 9f744ff01474..8eb313150bb3 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -9,7 +9,7 @@ ADMIN_VERB(atmos_debug, R_DEBUG, "Check Plumbing", "Verifies the integrity of th //Pipes 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)) + if(istype(pipe, /obj/machinery/atmospherics/pipe/smart) || istype(pipe, /obj/machinery/atmospherics/pipe/layer_manifold) || istype(pipe, /obj/machinery/atmospherics/pipe/multiz)) continue if(pipe.z && (!pipe.nodes || !pipe.nodes.len || (null in pipe.nodes))) to_chat(user, "Unconnected [pipe.name] located at [ADMIN_VERBOSEJMP(pipe)]", confidential = TRUE) diff --git a/code/modules/admin/verbs/beakerpanel.dm b/code/modules/admin/verbs/beakerpanel.dm index 7088fba92f12..94dcb7fb1718 100644 --- a/code/modules/admin/verbs/beakerpanel.dm +++ b/code/modules/admin/verbs/beakerpanel.dm @@ -1,320 +1,93 @@ -/proc/reagentsforbeakers() - . = list() - for(var/t in subtypesof(/datum/reagent)) - var/datum/reagent/R = t - . += list(list("id" = t, "text" = initial(R.name))) - - . = json_encode(.) - -/proc/beakersforbeakers() - . = list() - for(var/t in subtypesof(/obj/item/reagent_containers)) - var/obj/item/reagent_containers/C = t - . += list(list("id" = t, "text" = initial(C.name), "volume" = initial(C.volume))) - - . = json_encode(.) - -/datum/admins/proc/beaker_panel_act(list/href_list) - switch (href_list["beakerpanel"]) - if ("spawncontainer") - var/containerdata = json_decode(href_list["container"]) - var/obj/item/reagent_containers/container = beaker_panel_create_container(containerdata, get_turf(usr)) - usr.log_message("spawned a [container] containing [pretty_string_from_reagent_list(container.reagents.reagent_list)]", LOG_GAME) - if ("spawngrenade") - var/obj/item/grenade/chem_grenade/grenade = new(get_turf(usr)) - var/containersdata = json_decode(href_list["containers"]) - var/reagent_string - for (var/i in 1 to 2) - grenade.beakers += beaker_panel_create_container(containersdata[i], grenade) - reagent_string += " ([grenade.beakers[i].name] [i] : " + pretty_string_from_reagent_list(grenade.beakers[i].reagents.reagent_list) + ");" - grenade.stage_change(GRENADE_READY) - var/grenadedata = json_decode(href_list["grenadedata"]) - switch (href_list["grenadetype"]) - if ("normal") // Regular cable coil-timed grenade - var/det_time = text2num(grenadedata["grenade-timer"]) - if (det_time) - grenade.det_time = det_time - usr.log_message("spawned a [grenade] containing: [reagent_string]", LOG_GAME) - -/datum/admins/proc/beaker_panel_prep_assembly(obj/item/assembly/towrap, grenade) - var/obj/item/assembly/igniter/igniter = new - igniter.secured = FALSE - var/obj/item/assembly_holder/assholder = new(grenade) - towrap.forceMove(assholder) - igniter.forceMove(assholder) - assholder.assemble(igniter, towrap, usr) - assholder.master = grenade - return assholder - -/datum/admins/proc/beaker_panel_create_container(list/containerdata, location) - var/containertype = text2path(containerdata["container"]) - var/obj/item/reagent_containers/container = new containertype(location) - var/datum/reagents/reagents = container.reagents - for(var/datum/reagent/R in reagents.reagent_list) // clear the container of reagents - reagents.remove_reagent(R.type,R.volume) - for (var/list/item in containerdata["reagents"]) - var/datum/reagent/reagenttype = text2path(item["reagent"]) - var/amount = text2num(item["volume"]) - if ((reagents.total_volume + amount) > reagents.maximum_volume) - reagents.maximum_volume = reagents.total_volume + amount - reagents.add_reagent(reagenttype, amount) +/datum/beaker_panel + +/datum/beaker_panel/ui_state(mob/user) + return ADMIN_STATE(R_ADMIN) + +/datum/beaker_panel/ui_close() + qdel(src) + +/datum/beaker_panel/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "BeakerPanel") + ui.open() + +/datum/beaker_panel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + var/mob/user = ui.user + switch(action) + if("spawn") + var/obj/created = spawn_container_from_data(user, params["spawn_info"]) + user.log_message("spawned a [created] containing [pretty_string_from_reagent_list(created.reagents.reagent_list)]", LOG_ADMIN) + return TRUE + if("spawngrenade") + var/obj/item/grenade/chem_grenade/grenade = spawn_grenade_from_data(user, params["spawn_info"], params["grenade_info"]) + var/log_string = list() + for(var/obj/beaker as anything in grenade.beakers) + log_string += pretty_string_from_reagent_list(beaker.reagents.reagent_list) + user.log_message("spawned a [grenade] containing [english_list(log_string)]", LOG_ADMIN) + return TRUE + +/datum/beaker_panel/ui_static_data(mob/user) + var/list/data = list() + + data["reagents"] = list() + data["containers"] = list() + + for(var/datum/reagent/reagent_type as anything in subtypesof(/datum/reagent)) + if(!reagent_type::name) + continue + data["reagents"] += list(list("id" = reagent_type, "text" = reagent_type::name)) + + for(var/obj/item/reagent_containers/container_type as anything in subtypesof(/obj/item/reagent_containers)) + if(!container_type::name) + continue + data["containers"] += list(list("id" = container_type, "text" = container_type::name, "volume" = container_type::volume)) + + return data + +/datum/beaker_panel/proc/spawn_container_from_data(mob/user, list/spawn_info) + var/container_type = text2path(spawn_info["container"]) + var/list/container_reagents = list() + for(var/reagent_string, reagent_amount in spawn_info["reagents"]) + container_reagents[text2path(reagent_string)] = text2num(reagent_amount) + + return spawn_container(user, container_type, container_reagents) + +/datum/beaker_panel/proc/spawn_container(mob/user, container_type, list/container_reagents) + var/obj/item/reagent_containers/container = new container_type(user.drop_location()) + container.reagents.maximum_volume = INFINITY + container.reagents.clear_reagents() + container.reagents.add_reagent_list(container_reagents) + container.reagents.maximum_volume = max(container.reagents.total_volume, initial(container.volume)) return container -ADMIN_VERB(beaker_panel, R_SPAWN, "Spawn Reagent Container", "Spawn a reagent container.", ADMIN_CATEGORY_EVENTS) - var/datum/asset/asset_datum = get_asset_datum(/datum/asset/simple/namespaced/common) - asset_datum.send(user) - //Could somebody tell me why this isn't using the browser datum, given that it copypastes all of browser datum's html - // fuck if I know, but im not touching it - var/dat = {" - - - - - - - - - - - - - - -
-
Beaker panel
-
- -
- - - -
-
-
-note: beakers recommended, other containers may have issues -
- - "} - for (var/i in 1 to 2 ) - dat += {" -
-

- Container [i]: -

-
- - -
-
-
- -     - -     - - -
-
    -
  • - -
       - -
    -
  • -
-
- "} - - dat += {" -
-
- - - "} - - user << browse(dat, "window=beakerpanel;size=1100x720") +ADMIN_VERB(beaker_panel, R_SPAWN, "Spawn Reagent Container", "Spawn a reagent container.", ADMIN_CATEGORY_EVENTS) + var/datum/beaker_panel/panel = new + panel.ui_interact(user.mob) diff --git a/code/modules/admin/verbs/commandreport.dm b/code/modules/admin/verbs/commandreport.dm index 9d2202d8fdad..8d118339fcab 100644 --- a/code/modules/admin/verbs/commandreport.dm +++ b/code/modules/admin/verbs/commandreport.dm @@ -100,13 +100,13 @@ ADMIN_VERB(create_command_report, R_ADMIN, "Create Command Report", "Create a co if("set_report_sound") if(params["picked_sound"] == CUSTOM_SOUND_PRESET) played_sound = DEFAULT_ANNOUNCEMENT_SOUND // fallback by default - var/sound_file = input(ui_user, "Select sound file (OGG, WAV, MP3)", "Upload sound") as file|null + var/sound_file = input(ui_user, "Select sound file", "Upload sound") as sound|null if(!sound_file) tgui_alert(ui_user, "The custom sound could not be loaded. The standard sound will be played.", "Loading error", list("Ok")) return - if(!(copytext("[sound_file]", -4) in list(".ogg", ".wav", ".mp3"))) - tgui_alert(ui_user, "Invalid file type. Please select an OGG, WAV, or MP3 file.", "Loading error", list("Ok")) + if(!IS_SOUND_FILE(sound_file)) + tgui_alert(ui_user, "Invalid file type. Please select a sound file.", "Loading error", list("Ok")) return played_sound = sound_file diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index a981a5c3e74c..c0782a5bf4cc 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -1,6 +1,6 @@ ADMIN_VERB(toggle_game_debug, R_DEBUG, "Debug-Game", "Toggles game debugging.", ADMIN_CATEGORY_DEBUG) - GLOB.Debug2 = !GLOB.Debug2 - var/message = "toggled debugging [(GLOB.Debug2 ? "ON" : "OFF")]" + GLOB.debugging_enabled = !GLOB.debugging_enabled + var/message = "toggled debugging [(GLOB.debugging_enabled ? "ON" : "OFF")]" message_admins("[key_name_admin(user)] [message].") log_admin("[key_name(user)] [message].") BLACKBOX_LOG_ADMIN_VERB("Toggle Debug Two") @@ -320,7 +320,7 @@ ADMIN_VERB(cmd_admin_areatest, R_DEBUG, "Test Areas", "Tests the areas for vario areas_with_intercom.Add(A.type) CHECK_TICK - for(var/obj/machinery/camera/C as anything in GLOB.cameranet.cameras) + for(var/obj/machinery/camera/C as anything in SScameras.cameras) var/area/A = get_area(C) if(!A) dat += "Skipped over [C] in invalid location, [C.loc].
" @@ -615,7 +615,7 @@ ADMIN_VERB(place_ruin, R_DEBUG, "Spawn Ruin", "Attempt to randomly place a speci themed_names[name] = list(ruin, theme, list(ruin.default_area)) names += sort_list(themed_names) - var/ruinname = tgui_input_list(user, "Select ruin", "Spawn Ruin", sort_list(names)) + var/ruinname = tgui_input_list(user, "Select ruin", "Spawn Ruin", names) var/data = names[ruinname] if (!data) return diff --git a/code/modules/admin/verbs/hiddenprints.dm b/code/modules/admin/verbs/hiddenprints.dm index a2c5ad63f24f..89834411f47f 100644 --- a/code/modules/admin/verbs/hiddenprints.dm +++ b/code/modules/admin/verbs/hiddenprints.dm @@ -8,7 +8,7 @@ if(!islist(victim_hiddenprints)) victim_hiddenprints = list() - var/list/hiddenprints = flatten_list(victim_hiddenprints) + var/list/hiddenprints = assoc_to_values(victim_hiddenprints) list_clear_nulls(hiddenprints) if(!length(hiddenprints)) diff --git a/code/modules/admin/verbs/jukebox_moderation.dm b/code/modules/admin/verbs/jukebox_moderation.dm new file mode 100644 index 000000000000..4b7bf35594c5 --- /dev/null +++ b/code/modules/admin/verbs/jukebox_moderation.dm @@ -0,0 +1,57 @@ +ADMIN_VERB(upload_jukebox_music, R_SERVER, "Jukebox Upload Music", "Upload a valid .ogg file to be accessed via the jukebox.", ADMIN_CATEGORY_SERVER) + var/file = input(user, "Select a .ogg file to upload to the jukebox.") as sound|null + if(!file) + return + + // we could theorticly support other sound types but OGG is the better format from what I am aware and I am 100% sure its length is properly fetched. + if(!IS_OGG_FILE(file)) + tgui_alert(user, "Invalid file type. Please select an OGG file.", "Loading error", list("Ok")) + return + + var/list/track_data = splittext(file, "+") + if(track_data.len < 2) + if(tgui_alert(user, "Your song currently does not have a beat in deciseconds added to its title, e.g: SS13+5.ogg. Continue?", "Confirmation", list("Yes", "No")) != "Yes") + return + if(track_data.len > 2) + tgui_alert(user, "Titles should only have its title and beat in deciseconds, e.g: SS13+5.ogg", "Loading error", list("Ok")) + return + + + var/clean_name = SANITIZE_FILENAME("[file]") + var/save_path = "[CONFIG_JUKEBOX_SOUNDS][clean_name]" + + // Copy uploaded file to the server + fcopy(file, save_path) + + message_admins("[key_name_admin(user)] uploaded [clean_name] to the jukebox!") + to_chat(user, span_notice("Successfully uploaded [clean_name]!")) + +ADMIN_VERB(browse_jukebox_music, R_SERVER, "Jukebox Browse Music", "Browse music files for moderation.", ADMIN_CATEGORY_SERVER) + var/list/files = flist(CONFIG_JUKEBOX_SOUNDS) + // Filter out things that are not sound files, like the exclude + for(var/thing in files) + if(!IS_SOUND_FILE(thing)) + files -= thing + if(!files.len) + to_chat(user, span_warning("No uploaded tracks found.")) + return + + var/choice = tgui_input_list(user, "Select a track:", "Select Jukebox Music", files) + if(!choice) + return + + var/path = "[CONFIG_JUKEBOX_SOUNDS][choice]" + + switch(tgui_alert(user, "Play, Delete, or Download?", choice, list("Play", "Delete", "Download"))) + if ("Play") + SEND_SOUND(user, sound(path)) + if ("Delete") + fdel(path) + var/msg = "[key_name_admin(user)] deleted [choice] from the jukebox!" + message_admins(msg) + log_admin(msg) + SSblackbox.record_feedback("associative", "jukebox_deletion", 1, list("round_id" = "[GLOB.round_id]", "deletor" = "[key_name_admin(user)]", "deleted" = "[choice]")) + if ("Download") + user << ftp(file(path)) + else + return diff --git a/code/modules/admin/verbs/light_debug.dm b/code/modules/admin/verbs/light_debug.dm index 04026573b26e..daf012a9b30e 100644 --- a/code/modules/admin/verbs/light_debug.dm +++ b/code/modules/admin/verbs/light_debug.dm @@ -256,7 +256,7 @@ GLOBAL_LIST_EMPTY(light_debugged_atoms) 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 + var/chosen_color = tgui_color_picker(ui.user, "Pick new color", "[parent]", parent.light_color) if(chosen_color) parent.set_light(l_color = chosen_color) if("set_power") diff --git a/code/modules/admin/verbs/map_export.dm b/code/modules/admin/verbs/map_export.dm index 398f85170fe4..27a58116634d 100644 --- a/code/modules/admin/verbs/map_export.dm +++ b/code/modules/admin/verbs/map_export.dm @@ -56,7 +56,7 @@ ADMIN_VERB(map_export, R_DEBUG, "Map Export", "Select a part of the map by coord // Save resources in silo /obj/machinery/ore_silo/on_object_saved() var/data - var/datum/component/material_container/material_holder = GetComponent(/datum/component/material_container) + var/datum/material_container/material_holder = materials for(var/each in material_holder.materials) var/amount = material_holder.materials[each] / 100 var/datum/material/material_datum = each diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index dcb9d902f319..aee630b82cc5 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -8,11 +8,11 @@ ADMIN_VERB(camera_view, R_DEBUG, "Camera Range Display", "Shows the range of cam if(!on) var/list/seen = list() - for(var/obj/machinery/camera/C as anything in GLOB.cameranet.cameras) - for(var/turf/T in C.can_see()) - seen[T]++ - for(var/turf/T in seen) - T.maptext = MAPTEXT(seen[T]) + for(var/obj/machinery/camera/cam as anything in SScameras.cameras) + for(var/turf/cam_turf as anything in cam.can_see()) + seen[cam]++ + for(var/turf/seen_turf as anything in seen) + seen_turf.maptext = MAPTEXT(seen[seen_turf]) BLACKBOX_LOG_ADMIN_VERB("Show Camera Range") #ifdef TESTING @@ -34,7 +34,7 @@ ADMIN_VERB_VISIBILITY(sec_camera_report, ADMIN_VERB_VISIBLITY_FLAG_MAPPING_DEBUG ADMIN_VERB(sec_camera_report, R_DEBUG, "Camera Report", "Get a printout of all camera issues.", ADMIN_CATEGORY_MAPPING) var/list/obj/machinery/camera/CL = list() - for(var/obj/machinery/camera/C as anything in GLOB.cameranet.cameras) + for(var/obj/machinery/camera/C as anything in SScameras.cameras) CL += C var/output = {"Camera Abnormalities Report
@@ -196,27 +196,27 @@ ADMIN_VERB(disable_communication, R_DEBUG, "Disable all communication verbs", "D ADMIN_VERB_VISIBILITY(create_mapping_job_icons, ADMIN_VERB_VISIBLITY_FLAG_MAPPING_DEBUG) ADMIN_VERB(create_mapping_job_icons, R_DEBUG, "Generate job landmarks icons", "Generates job starting location landmarks.", ADMIN_CATEGORY_MAPPING) var/icon/final = icon() - var/mob/living/carbon/human/dummy/D = new(locate(1,1,1)) //spawn on 1,1,1 so we don't have runtimes when items are deleted - D.setDir(SOUTH) - for(var/job in subtypesof(/datum/job)) - var/datum/job/JB = new job - switch(JB.title) + var/mob/living/carbon/human/dummy/consistent/mannequin = new(get_turf(usr)) + mannequin.setDir(SOUTH) + for(var/job_type in valid_subtypesof(/datum/job)) + var/datum/job/job_datum = SSjob.get_job_type(job_type) + switch(job_datum.title) if(JOB_AI) - final.Insert(icon('icons/mob/silicon/ai.dmi', "ai", SOUTH, 1), "AI") + final.Insert(icon('icons/mob/silicon/ai.dmi', "ai", SOUTH, 1), JOB_AI) if(JOB_CYBORG) - final.Insert(icon('icons/mob/silicon/robots.dmi', "robot", SOUTH, 1), "Cyborg") + final.Insert(icon('icons/mob/silicon/robots.dmi', "robot", SOUTH, 1), JOB_CYBORG) else - for(var/obj/item/I in D) - qdel(I) - randomize_human_normie(D) - D.dress_up_as_job( - equipping = JB, + if(!job_datum.outfit) + continue + mannequin.delete_equipment() + mannequin.dress_up_as_job( + equipping = job_datum, visual_only = TRUE, consistent = TRUE, ) - var/icon/I = icon(getFlatIcon(D), frame = 1) - final.Insert(I, JB.title) - qdel(D) + var/icon/job_icon = get_flat_existing_human_icon(mannequin, list(SOUTH)) + final.Insert(job_icon, job_datum.title, frame = 1) + qdel(mannequin) //Also add the x for(var/x_number in 1 to 4) final.Insert(icon('icons/hud/screen_gen.dmi', "x[x_number == 1 ? "" : x_number]"), "x[x_number == 1 ? "" : x_number]") diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 48788da79688..a0877e803d82 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -20,7 +20,7 @@ ADMIN_VERB(play_sound, R_SOUND, "Play Global Sound", "Play a sound to all connec admin_sound.status = SOUND_STREAM admin_sound.volume = vol - var/res = tgui_alert(user, "Show the title of this song to the players?",, list("Yes","No", "Cancel")) + var/res = tgui_alert(user, "Show the title of this song to the players?", "Play Sound", list("Yes", "No", "Cancel")) switch(res) if("Yes") to_chat(world, span_boldannounce("An admin played: [sound]"), confidential = TRUE) @@ -104,34 +104,44 @@ GLOBAL_VAR_INIT(web_sound_cooldown, 0) music_extra_data["album"] = data["album"] duration = data["duration"] * 1 SECONDS if (duration > 10 MINUTES) - if((tgui_alert(user, "This song is over 10 minutes long. Are you sure you want to play it?", "Length Warning!", list("No", "Yes", "Cancel")) != "Yes")) + if((tgui_alert(user, "This song is over 10 minutes long. Are you sure you want to play it?", "Length Warning", list("No", "Yes", "Cancel")) != "Yes")) return - var/res = tgui_alert(user, "Show the title of and link to this song to the players?\n[title]", "Show Info?", list("Yes", "No", "Cancel")) - switch(res) + var/include_song_data = tgui_alert(user, "Show the title of and link to this song to the players?\n[title]", "Song Info", list("Yes", "No", "Cancel")) + switch(include_song_data) if("Yes") music_extra_data["title"] = data["title"] + music_extra_data["artist"] = data["artist"] if("No") - music_extra_data["link"] = "Song Link Hidden" - music_extra_data["title"] = "Song Title Hidden" - music_extra_data["artist"] = "Song Artist Hidden" - music_extra_data["upload_date"] = "Song Upload Date Hidden" - music_extra_data["album"] = "Song Album Hidden" + music_extra_data["link"] = "\[\[HYPERLINK BLOCKED\]\]" + music_extra_data["title"] = "Untitled" + music_extra_data["artist"] = "Unknown" + music_extra_data["upload_date"] = "XX.YY.ZZZZ" + music_extra_data["album"] = "Default" if("Cancel", null) return - var/anon = tgui_alert(user, "Display who played the song?", "Credit Yourself?", list("Yes", "No", "Cancel")) - switch(anon) + var/credit_yourself = tgui_alert(user, "Display who played the song?", "Credit Yourself", list("Yes", "No", "Cancel")) + + var/list/to_chat_message = list() + + switch(credit_yourself) if("Yes") - if(res == "Yes") - to_chat(world, span_boldannounce("[user.key] played: [webpage_url]"), confidential = TRUE) + if(include_song_data == "Yes") + to_chat_message += span_notice("[user.ckey] played: [span_linkify(webpage_url)]") else - to_chat(world, span_boldannounce("[user.key] played a sound"), confidential = TRUE) + to_chat_message += span_notice("[user.ckey] played a sound.") if("No") - if(res == "Yes") - to_chat(world, span_boldannounce("An admin played: [webpage_url]"), confidential = TRUE) + if(include_song_data == "Yes") + to_chat_message += span_notice("An admin played: [span_linkify(webpage_url)]") + else + to_chat_message += span_notice("An admin played a sound.") if("Cancel", null) return + if(credit) - to_chat(world, span_boldannounce(credit), confidential = TRUE) + to_chat_message += span_notice("
[credit]") + + to_chat(world, fieldset_block("Now Playing: [span_bold(music_extra_data["title"])] by [span_bold(music_extra_data["artist"])]", jointext(to_chat_message, ""), "boxed_message")) + 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]") @@ -155,6 +165,7 @@ GLOBAL_VAR_INIT(web_sound_cooldown, 0) // Stops playing lobby music and admin loaded music automatically. SEND_SOUND(C, sound(null, channel = CHANNEL_LOBBYMUSIC)) SEND_SOUND(C, sound(null, channel = CHANNEL_ADMIN)) + SEND_SOUND(C, sound(null, channel = CHANNEL_MUSIC)) // DARKPACK EDIT ADD - AMBIENCE if(!stop_web_sounds) C.tgui_panel?.play_music(web_sound_url, music_extra_data) else diff --git a/code/modules/admin/verbs/request_internet_sound.dm b/code/modules/admin/verbs/request_internet_sound.dm index 296c59867e4a..376547fd0e4a 100644 --- a/code/modules/admin/verbs/request_internet_sound.dm +++ b/code/modules/admin/verbs/request_internet_sound.dm @@ -2,32 +2,28 @@ set category = "OOC" set name = "Request Internet Sound" - if(GLOB.say_disabled) //This is here to try to identify lag problems - to_chat(usr, span_danger("Speech is currently admin-disabled."), confidential = TRUE) - return - - if (!CONFIG_GET(flag/request_internet_sound)) + if(!CONFIG_GET(flag/request_internet_sound)) to_chat(usr, span_danger("This server has disabled internet sound requests."), confidential = TRUE) return - var/request_url = tgui_input_text(usr, "Please Input a URL", "Only certain sites are allowed, such as YouTube, SoundCloud, and Bandcamp.", "") + var/request_url = tgui_input_text(usr, "Please input a URL. Supported sources: [replacetext(replacetext(CONFIG_GET(string/request_internet_allowed), "\\", ""), ",", ", ")].", "Request Intenet sound") if(!request_url) return - //regex filter var/regex/allowed_regex = regex(replacetext(CONFIG_GET(string/request_internet_allowed), ",", "|"), "i") if(!allowed_regex.Find(request_url)) - 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) + 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." + credit = null log_internet_request("[src.key]/([src.name]): [request_url]") if(usr.client) @@ -38,10 +34,14 @@ return 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, credit)]") + to_chat(usr, span_info("You requested [span_linkify(request_url)] to be played."), confidential = TRUE) + + var/list/admin_message = list() + admin_message += ("[ADMIN_FULLMONTY(src)] [ADMIN_SC(src)] has requested the following to be played:
") + admin_message += ("[span_linkify(request_url)] [ADMIN_PLAY_INTERNET(request_url, credit)]") + for(var/client/admin_client in GLOB.admins) if(get_chat_toggles(admin_client) & CHAT_PRAYER) - to_chat(admin_client, request_url, type = MESSAGE_TYPE_PRAYER, confidential = TRUE) + to_chat(admin_client, fieldset_block("Internet sound requested", jointext(admin_message, ""), "boxed_message"), 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 1fb078f39ab9..7f580e1020c3 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -231,9 +231,8 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w 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) - var/mob/living/carbon/human/H = i - H.set_species(newtype) + for(var/mob/living/carbon/human/human_mob as anything in GLOB.human_list) + human_mob.set_species(newtype) if("power") if(!is_funmin) return @@ -518,9 +517,8 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Monkeyize All Humans")) message_admins("[key_name_admin(holder)] made everyone into monkeys.") log_admin("[key_name_admin(holder)] made everyone into monkeys.") - for(var/i in GLOB.human_list) - var/mob/living/carbon/human/H = i - INVOKE_ASYNC(H, TYPE_PROC_REF(/mob/living/carbon, monkeyize)) + for(var/mob/living/carbon/human/human_mob as anything in GLOB.human_list) + INVOKE_ASYNC(human_mob, TYPE_PROC_REF(/mob/living/carbon, monkeyize)) if("antag_all") if(!is_funmin) return @@ -554,9 +552,9 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w if(!is_funmin) return SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Mass Braindamage")) - for(var/mob/living/carbon/human/H in GLOB.player_list) - to_chat(H, span_bolddanger("You suddenly feel stupid."), confidential = TRUE) - H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60, 80) + for(var/mob/living/carbon/human/human_mob in GLOB.player_list) + to_chat(human_mob, span_bolddanger("You suddenly feel stupid."), confidential = TRUE) + human_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 60, 80) message_admins("[key_name_admin(holder)] made everybody brain damaged") if("floorlava") SSweather.run_weather(/datum/weather/floor_is_lava) @@ -573,33 +571,32 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w return SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Chinese Cartoons")) message_admins("[key_name_admin(holder)] made everything kawaii.") - for(var/i in GLOB.human_list) - var/mob/living/carbon/human/H = i - SEND_SOUND(H, sound(SSstation.announcer.event_sounds[ANNOUNCER_ANIMES])) + for(var/mob/living/carbon/human/human_mob as anything in GLOB.human_list) + SEND_SOUND(human_mob, sound(SSstation.announcer.event_sounds[ANNOUNCER_ANIMES])) - if(H.dna.species.id == SPECIES_HUMAN) - if(H.dna.features[FEATURE_TAIL] == "None" || H.dna.features[FEATURE_EARS] == "None") + if(human_mob.dna.species.id == SPECIES_HUMAN) + if(human_mob.dna.features[FEATURE_TAIL_CAT] == "None" || human_mob.dna.features[FEATURE_EARS] == "None") var/obj/item/organ/ears/cat/ears = new var/obj/item/organ/tail/cat/tail = new - ears.Insert(H, movement_flags = DELETE_IF_REPLACED) - tail.Insert(H, movement_flags = DELETE_IF_REPLACED) + ears.Insert(human_mob, movement_flags = DELETE_IF_REPLACED) + tail.Insert(human_mob, movement_flags = DELETE_IF_REPLACED) var/list/honorifics = list("[MALE]" = list("kun"), "[FEMALE]" = list("chan","tan"), "[NEUTER]" = list("san"), "[PLURAL]" = list("san")) //John Robust -> Robust-kun - var/list/names = splittext(H.real_name," ") + var/list/names = splittext(human_mob.real_name," ") var/forename = names.len > 1 ? names[2] : names[1] - var/newname = "[forename]-[pick(honorifics["[H.gender]"])]" - H.fully_replace_character_name(H.real_name,newname) - H.update_body_parts() + var/newname = "[forename]-[pick(honorifics["[human_mob.gender]"])]" + human_mob.fully_replace_character_name(human_mob.real_name,newname) + human_mob.update_body_parts() if(animetype == "Yes") var/seifuku = pick(typesof(/obj/item/clothing/under/costume/seifuku)) - var/obj/item/clothing/under/costume/seifuku/I = new seifuku - var/olduniform = H.w_uniform - H.temporarilyRemoveItemFromInventory(H.w_uniform, TRUE, FALSE) - H.equip_to_slot_or_del(I, ITEM_SLOT_ICLOTHING) + var/obj/item/clothing/under/costume/seifuku/anime_uniform = new seifuku + var/olduniform = human_mob.w_uniform + human_mob.temporarilyRemoveItemFromInventory(human_mob.w_uniform, TRUE, FALSE) + human_mob.equip_to_slot_or_del(anime_uniform, ITEM_SLOT_ICLOTHING) qdel(olduniform) if(droptype == "Yes") - ADD_TRAIT(I, TRAIT_NODROP, ADMIN_TRAIT) + ADD_TRAIT(anime_uniform, TRAIT_NODROP, ADMIN_TRAIT) else - to_chat(H, span_warning("You're not kawaii enough for this!"), confidential = TRUE) + to_chat(human_mob, span_warning("You're not kawaii enough for this!"), confidential = TRUE) if("masspurrbation") if(!is_funmin) return @@ -709,16 +706,16 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w /// portal_appearance is a list in the form (turf's plane offset + 1) -> appearance to use /proc/do_portal_spawn(turf/loc, mobtype, numtospawn, list/portal_appearance, players, humanoutfit) for (var/i in 1 to numtospawn) - var/mob/spawnedMob = new mobtype(loc) + var/mob/spawned_mob = new mobtype(loc) if (length(players)) var/mob/chosen = players[1] if (chosen.client) - chosen.client.prefs.safe_transfer_prefs_to(spawnedMob, is_antag = TRUE) - spawnedMob.PossessByPlayer(chosen.key) + chosen.client.prefs.safe_transfer_prefs_to(spawned_mob, is_antag = TRUE) + spawned_mob.PossessByPlayer(chosen.key) players -= chosen - if (ishuman(spawnedMob) && ispath(humanoutfit, /datum/outfit)) - var/mob/living/carbon/human/H = spawnedMob - H.equipOutfit(humanoutfit) + if (ishuman(spawned_mob) && ispath(humanoutfit, /datum/outfit)) + var/mob/living/carbon/human/human_mob = spawned_mob + human_mob.equipOutfit(humanoutfit) var/turf/T = get_step(loc, SOUTHWEST) T.flick_overlay_static(portal_appearance[GET_TURF_PLANE_OFFSET(T) + 1], 15) playsound(T, 'sound/effects/magic/lightningbolt.ogg', rand(80, 100), TRUE) diff --git a/code/modules/admin/verbs/selectequipment.dm b/code/modules/admin/verbs/selectequipment.dm index 7586726c48e5..5731702e6caa 100644 --- a/code/modules/admin/verbs/selectequipment.dm +++ b/code/modules/admin/verbs/selectequipment.dm @@ -107,7 +107,9 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(select_equipment, R_FUN, "Select Equipment", mob/ta var/icon/dummysprite = get_flat_human_icon(null, dummy_key = dummy_key, - outfit_override = selected_outfit) + outfit_override = selected_outfit, + no_anim = TRUE, + ) data["icon64"] = icon2base64(dummysprite) data["name"] = target_mob diff --git a/code/modules/admin/verbs/server.dm b/code/modules/admin/verbs/server.dm index 8b724cfe1448..0033c6c12694 100644 --- a/code/modules/admin/verbs/server.dm +++ b/code/modules/admin/verbs/server.dm @@ -18,6 +18,7 @@ ADMIN_VERB(toggle_hub, R_SERVER, "Toggle Hub", "Toggles the server's visilibilit #define REGULAR_RESTART "Regular Restart" #define REGULAR_RESTART_DELAYED "Regular Restart (with delay)" +#define NO_EVENT_RESTART "Restart, Skip TGS Event" #define HARD_RESTART "Hard Restart (No Delay/Feedback Reason)" #define HARDEST_RESTART "Hardest Restart (No actions, just reboot)" #define TGS_RESTART "Server Restart (Kill and restart DD)" @@ -29,6 +30,7 @@ ADMIN_VERB(restart, R_SERVER, "Reboot World", "Restarts the world immediately.", options += HARDEST_RESTART if(world.TgsAvailable()) + options.Insert(3, NO_EVENT_RESTART) options += TGS_RESTART; if(SSticker.admin_delay_notice) @@ -42,18 +44,19 @@ ADMIN_VERB(restart, R_SERVER, "Reboot World", "Restarts the world immediately.", BLACKBOX_LOG_ADMIN_VERB("Reboot World") var/init_by = "Initiated by [user.holder.fakekey ? "Admin" : user.key]." switch(result) - if(REGULAR_RESTART) - if(!user.is_localhost()) - if(alert(user, "Are you sure you want to restart the server?","This server is live", "Restart", "Cancel") != "Restart") - return FALSE - SSticker.Reboot(init_by, "admin reboot - by [user.key] [user.holder.fakekey ? "(stealth)" : ""]", 10) - if(REGULAR_RESTART_DELAYED) - var/delay = input("What delay should the restart have (in seconds)?", "Restart Delay", 5) as num|null + if(REGULAR_RESTART, REGULAR_RESTART_DELAYED, NO_EVENT_RESTART) + var/delay = 1 + if(result == REGULAR_RESTART_DELAYED) + delay = input("What delay should the restart have (in seconds)?", "Restart Delay", 5) as num|null if(!delay) return FALSE if(!user.is_localhost()) if(alert(user,"Are you sure you want to restart the server?","This server is live", "Restart", "Cancel") != "Restart") return FALSE + + if (result != NO_EVENT_RESTART) + SSticker.TriggerRoundEndTgsEvent() + SSticker.Reboot(init_by, "admin reboot - by [user.key] [user.holder.fakekey ? "(stealth)" : ""]", delay * 10) if(HARD_RESTART) to_chat(world, "World reboot - [init_by]") @@ -67,6 +70,7 @@ ADMIN_VERB(restart, R_SERVER, "Reboot World", "Restarts the world immediately.", #undef REGULAR_RESTART #undef REGULAR_RESTART_DELAYED +#undef NO_EVENT_RESTART #undef HARD_RESTART #undef HARDEST_RESTART #undef TGS_RESTART diff --git a/code/modules/admin/view_variables/filterrific.dm b/code/modules/admin/view_variables/filterrific.dm index 0ddd07aec4fe..89172c46e12b 100644 --- a/code/modules/admin/view_variables/filterrific.dm +++ b/code/modules/admin/view_variables/filterrific.dm @@ -10,7 +10,7 @@ /datum/filter_editor/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "Filteriffic") + ui = new(user, src, "Filterrific") ui.open() /datum/filter_editor/ui_static_data(mob/user) @@ -21,7 +21,14 @@ /datum/filter_editor/ui_data() var/list/data = list() data["target_name"] = target.name - data["target_filter_data"] = target.filter_data + var/list/target_filter_data = list() + for (var/list/filter_info as anything in target.filter_data) + filter_info = deep_copy_list(filter_info) + if (filter_info["transform"]) + var/matrix/filter_transform = filter_info["transform"] + filter_info["transform"] = list("a" = filter_transform.a, "b" = filter_transform.b, "c" = filter_transform.c, "d" = filter_transform.d, "e" = filter_transform.e, "f" = filter_transform.f) + target_filter_data += list(filter_info) + data["target_filter_data"] = target_filter_data return data /datum/filter_editor/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) @@ -32,7 +39,7 @@ switch(action) if("add_filter") var/target_name = params["name"] - while(target.filter_data && target.filter_data[target_name]) + while(target.get_filter(target_name)) target_name = "[target_name]-dupe" target.add_filter(target_name, params["priority"], list("type" = params["type"])) . = TRUE @@ -40,9 +47,9 @@ target.remove_filter(params["name"]) . = TRUE if("rename_filter") - var/list/filter_data = target.filter_data[params["name"]] + var/list/filter_info = target.get_filter_data(params["name"]) target.remove_filter(params["name"]) - target.add_filter(params["new_name"], filter_data["priority"], filter_data) + target.add_filter(params["new_name"], filter_data["priority"], filter_info) . = TRUE if("edit_filter") target.remove_filter(params["name"]) @@ -56,18 +63,10 @@ target.transition_filter(params["name"], params["new_data"], 4) . = TRUE if("modify_filter_value") - var/list/old_filter_data = target.filter_data[params["name"]] - var/list/new_filter_data = old_filter_data.Copy() - for(var/entry in params["new_data"]) - new_filter_data[entry] = params["new_data"][entry] - for(var/entry in new_filter_data) - if(entry == GLOB.master_filter_info[old_filter_data["type"]]["defaults"][entry]) - new_filter_data.Remove(entry) - target.remove_filter(params["name"]) - target.add_filter(params["name"], old_filter_data["priority"], new_filter_data) + target.modify_filter(params["name"], params["new_data"]) . = TRUE if("modify_color_value") - var/new_color = input(usr, "Pick new filter color", "Filteriffic Colors!") as color|null + var/new_color = input(usr, "Pick new filter color", "Filterrific Colors!") as color|null if(new_color) target.transition_filter(params["name"], list("color" = new_color), 4) . = TRUE @@ -76,6 +75,16 @@ if(new_icon) target.modify_filter(params["name"], list("icon" = new_icon)) . = TRUE + if("modify_transform_value") + var/list/filter_info = target.get_filter_data(params["name"]) + if (!filter_info) + return + var/matrix/new_transform = matrix(filter_info[params["field_name"]]) + if (!(params["transform_key"] in list("a", "b", "c", "d", "e", "f"))) + return + new_transform.vars[params["transform_key"]] = text2num(params["transform_value"]) + target.modify_filter(params["name"], list(params["field_name"] = new_transform)) + . = TRUE if("mass_apply") if(!check_rights_for(usr.client, R_FUN)) to_chat(usr, span_userdanger("Stay in your lane, jannie.")) @@ -83,15 +92,14 @@ var/target_path = text2path(params["path"]) if(!target_path) return - var/filters_to_copy = target.filters - var/filter_data_to_copy = target.filter_data + var/list/filter_data_to_copy = target.filter_data var/count = 0 - for(var/thing in world.contents) - if(istype(thing, target_path)) - var/atom/thing_at = thing - thing_at.filters = filters_to_copy - thing_at.filter_data = filter_data_to_copy - count += 1 + for(var/atom/thing_at as anything in world.contents) + if(!istype(thing_at, target_path)) + continue + thing_at.filter_data = filter_data_to_copy.Copy() + thing_at.update_filters() + count += 1 message_admins("LOCAL CLOWN [usr.ckey] JUST MASS FILTER EDITED [count] WITH PATH OF [params["path"]]!") log_admin("LOCAL CLOWN [usr.ckey] JUST MASS FILTER EDITED [count] WITH PATH OF [params["path"]]!") 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 index 4d0573832843..db887d8053ef 100644 --- 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 @@ -4,7 +4,7 @@ * * 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 + * Much like filterrific, '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 diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 2addf6f53741..55a8ad8ac504 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -74,27 +74,27 @@ var/newamt switch(Text) if("brute") - L.adjustBruteLoss(amount, forced = TRUE) - newamt = L.getBruteLoss() + L.adjust_brute_loss(amount, forced = TRUE) + newamt = L.get_brute_loss() if("fire") - L.adjustFireLoss(amount, forced = TRUE) - newamt = L.getFireLoss() + L.adjust_fire_loss(amount, forced = TRUE) + newamt = L.get_fire_loss() if("toxin") - L.adjustToxLoss(amount, forced = TRUE) - newamt = L.getToxLoss() + L.adjust_tox_loss(amount, forced = TRUE) + newamt = L.get_tox_loss() if("oxygen") - L.adjustOxyLoss(amount, forced = TRUE) - newamt = L.getOxyLoss() + L.adjust_oxy_loss(amount, forced = TRUE) + newamt = L.get_oxy_loss() if("brain") - L.adjustOrganLoss(ORGAN_SLOT_BRAIN, amount) + L.adjust_organ_loss(ORGAN_SLOT_BRAIN, amount) newamt = L.get_organ_loss(ORGAN_SLOT_BRAIN) if("stamina") - L.adjustStaminaLoss(amount, forced = TRUE) - newamt = L.getStaminaLoss() + L.adjust_stamina_loss(amount, forced = TRUE) + newamt = L.get_stamina_loss() // DARKPACK EDIT ADD START - AGGRAVATED_DAMAGE if("aggravated") - L.adjustAggLoss(amount, forced = TRUE) - newamt = L.getAggLoss() + L.adjust_agg_loss(amount, forced = TRUE) + newamt = L.get_agg_loss() // DARKPACK EDIT ADD END else to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]", confidential = TRUE) diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 1f9d16332f6d..3404163bbbc3 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -191,7 +191,8 @@ GLOBAL_LIST_EMPTY(antagonists) old_body.remove_from_current_living_antags() var/datum/action/antag_info/info_button = info_button_ref?.resolve() if(info_button) - info_button.Remove(old_body) + if(old_body) + info_button.Remove(old_body) info_button.Grant(new_body) apply_innate_effects(new_body) if(new_body.stat != DEAD) @@ -471,6 +472,7 @@ GLOBAL_LIST_EMPTY(antagonists) dummy = dummy || new /mob/living/carbon/human/dummy/consistent dummy.equipOutfit(outfit, visuals_only = TRUE) dummy.wear_suit?.update_greyscale() + dummy.set_combat_mode(TRUE) var/icon = getFlatIcon(dummy) // We don't want to qdel the dummy right away, since its items haven't initialized yet. diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm index 2bc2346aae81..42d3645300bf 100644 --- a/code/modules/antagonists/abductor/abductor.dm +++ b/code/modules/antagonists/abductor/abductor.dm @@ -74,11 +74,11 @@ objectives += team.objectives finalize_abductor() // We don't want abductors to be converted by other antagonists - owner.add_traits(list(TRAIT_ABDUCTOR_TRAINING, TRAIT_UNCONVERTABLE), ABDUCTOR_ANTAGONIST) + owner.add_traits(list(TRAIT_ABDUCTOR_TRAINING, TRAIT_ABDUCTOR_HUD, TRAIT_UNCONVERTABLE), ABDUCTOR_ANTAGONIST) return ..() /datum/antagonist/abductor/on_removal() - owner.remove_traits(list(TRAIT_ABDUCTOR_TRAINING, TRAIT_UNCONVERTABLE), ABDUCTOR_ANTAGONIST) + owner.remove_traits(list(TRAIT_ABDUCTOR_TRAINING, TRAIT_ABDUCTOR_HUD, TRAIT_UNCONVERTABLE), ABDUCTOR_ANTAGONIST) return ..() /datum/antagonist/abductor/greet() @@ -114,13 +114,47 @@ break /datum/antagonist/abductor/scientist/on_gain() - owner.add_traits(list(TRAIT_ABDUCTOR_SCIENTIST_TRAINING, TRAIT_SURGEON), ABDUCTOR_ANTAGONIST) + owner.add_traits(list(TRAIT_ABDUCTOR_SCIENTIST_TRAINING), ABDUCTOR_ANTAGONIST) return ..() /datum/antagonist/abductor/scientist/on_removal() - owner.remove_traits(list(TRAIT_ABDUCTOR_SCIENTIST_TRAINING, TRAIT_SURGEON), ABDUCTOR_ANTAGONIST) + owner.remove_traits(list(TRAIT_ABDUCTOR_SCIENTIST_TRAINING), ABDUCTOR_ANTAGONIST) return ..() +/datum/antagonist/abductor/scientist/apply_innate_effects(mob/living/mob_override) + var/mob/living/glorp = mob_override || owner.current + RegisterSignal(glorp, COMSIG_LIVING_OPERATING_ON, PROC_REF(add_surgery)) + +/datum/antagonist/abductor/scientist/remove_innate_effects(mob/living/mob_override) + var/mob/living/glorp = mob_override || owner.current + UnregisterSignal(glorp, COMSIG_LIVING_OPERATING_ON) + +/datum/antagonist/abductor/scientist/proc/add_surgery(datum/source, mob/living/patient, list/possible_operations) + SIGNAL_HANDLER + + var/static/list/ayy_operations + if(!length(ayy_operations)) + ayy_operations = list() + ayy_operations += /datum/surgery_operation/basic/tend_wounds/combo/upgraded/master + ayy_operations += /datum/surgery_operation/basic/viral_bonding + ayy_operations += /datum/surgery_operation/limb/add_plastic // unlocks advanced plastic surgery + ayy_operations += /datum/surgery_operation/limb/bionecrosis + ayy_operations += /datum/surgery_operation/limb/clamp_bleeders/abductor + ayy_operations += /datum/surgery_operation/limb/close_skin/abductor + ayy_operations += /datum/surgery_operation/limb/incise_organs/abductor + ayy_operations += /datum/surgery_operation/limb/incise_skin/abductor + ayy_operations += /datum/surgery_operation/limb/organ_manipulation/external/abductor + ayy_operations += /datum/surgery_operation/limb/organ_manipulation/internal/abductor + ayy_operations += /datum/surgery_operation/limb/retract_skin/abductor + ayy_operations += /datum/surgery_operation/limb/unclamp_bleeders/abductor + ayy_operations += /datum/surgery_operation/organ/fix_wings // i guess + ayy_operations += typesof(/datum/surgery_operation/limb/bioware) + ayy_operations += typesof(/datum/surgery_operation/organ/brainwash) + ayy_operations += typesof(/datum/surgery_operation/organ/lobotomy) + ayy_operations += typesof(/datum/surgery_operation/organ/pacify) + + possible_operations |= ayy_operations + /datum/antagonist/abductor/admin_add(datum/mind/new_owner,mob/admin) var/list/current_teams = list() for(var/datum/team/abductor_team/T in GLOB.antagonist_teams) @@ -132,7 +166,7 @@ // Keep in mind the darker colors don't look all that great, but it's easier to just reference an existing color list than make a new one var/colorchoice = tgui_input_list(admin, "Select Which Color?", "Alien Spraypainter", GLOB.color_list_ethereal + "Custom Color") if(colorchoice == "Custom Color") - colorchoice = input(admin, "Pick new color", "Alien Spraypainter", COLOR_WHITE) as color|null + colorchoice = tgui_color_picker(admin, "Pick new color", "Alien Spraypainter", COLOR_WHITE) else colorchoice = GLOB.color_list_ethereal[colorchoice] team.team_skincolor = colorchoice diff --git a/code/modules/antagonists/abductor/abductor_structures.dm b/code/modules/antagonists/abductor/abductor_structures.dm index 4668a67b65ba..92b73488767d 100644 --- a/code/modules/antagonists/abductor/abductor_structures.dm +++ b/code/modules/antagonists/abductor/abductor_structures.dm @@ -7,6 +7,7 @@ icon = 'icons/obj/antags/abductor.dmi' build_stack_type = /obj/item/stack/sheet/mineral/abductor icon_state = "bed" + custom_materials = list(/datum/material/alloy/alien = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/table_frame/abductor name = "alien table frame" @@ -14,6 +15,7 @@ icon_state = "alien_frame" framestack = /obj/item/stack/sheet/mineral/abductor framestackamount = 1 + custom_materials = list(/datum/material/alloy/alien = SHEET_MATERIAL_AMOUNT) /obj/structure/table_frame/abductor/get_table_type(obj/item/stack/our_stack) if(istype(our_stack, /obj/item/stack/sheet/mineral/abductor)) @@ -36,6 +38,7 @@ frame = /obj/structure/table_frame/abductor custom_materials = list(/datum/material/silver =SHEET_MATERIAL_AMOUNT) can_flip = FALSE + custom_materials = list(/datum/material/alloy/alien = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/table/optable/abductor name = "alien operating table" @@ -49,6 +52,7 @@ icon_state = "bed" can_buckle = TRUE buckle_lying = 90 + custom_materials = list(/datum/material/alloy/alien = SHEET_MATERIAL_AMOUNT, /datum/material/silver = SHEET_MATERIAL_AMOUNT) /// Amount to inject per second var/inject_amount = 0.5 @@ -88,6 +92,7 @@ can_weld_shut = FALSE door_anim_time = 0 material_drop = /obj/item/stack/sheet/mineral/abductor + custom_materials = list(/datum/material/alloy/alien = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/door_assembly/door_assembly_abductor name = "alien airlock assembly" @@ -97,3 +102,4 @@ airlock_type = /obj/machinery/door/airlock/abductor material_type = /obj/item/stack/sheet/mineral/abductor noglass = TRUE + custom_materials = list(/datum/material/alloy/alien = SHEET_MATERIAL_AMOUNT * 4) diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm deleted file mode 100644 index 07be8836f970..000000000000 --- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm +++ /dev/null @@ -1,64 +0,0 @@ -/datum/surgery/organ_extraction - name = "Experimental organ replacement" - possible_locs = list(BODY_ZONE_CHEST) - surgery_flags = SURGERY_IGNORE_CLOTHES | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/extract_organ, - /datum/surgery_step/gland_insert, - ) - -/datum/surgery/organ_extraction/can_start(mob/user, mob/living/carbon/target) - if(!ishuman(user)) - return FALSE - if(!..()) - return FALSE - if(isabductor(user)) - return TRUE - var/mob/living/non_abductor = user - if(locate(/obj/item/implant/abductor) in non_abductor.implants) - return TRUE - return FALSE - - -/datum/surgery_step/extract_organ - name = "remove heart" - accept_hand = 1 - time = 3.2 SECONDS - var/obj/item/organ/IC = null - var/list/organ_types = list(/obj/item/organ/heart) - -/datum/surgery_step/extract_organ/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - for(var/atom/A in target.organs) - if(A.type in organ_types) - IC = A - break - user.visible_message(span_notice("[user] starts to remove [target]'s organs."), span_notice("You start to remove [target]'s organs...")) - -/datum/surgery_step/extract_organ/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(IC) - user.visible_message(span_notice("[user] pulls [IC] out of [target]'s [target_zone]!"), span_notice("You pull [IC] out of [target]'s [target_zone].")) - user.put_in_hands(IC) - IC.Remove(target) - return 1 - else - to_chat(user, span_warning("You don't find anything in [target]'s [target_zone]!")) - return 1 - -/datum/surgery_step/gland_insert - name = "insert gland" - implements = list(/obj/item/organ/heart/gland = 100) - time = 3.2 SECONDS - -/datum/surgery_step/gland_insert/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message(span_notice("[user] starts to insert [tool] into [target]."), span_notice("You start to insert [tool] into [target]...")) - -/datum/surgery_step/gland_insert/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message(span_notice("[user] inserts [tool] into [target]."), span_notice("You insert [tool] into [target].")) - user.temporarilyRemoveItemFromInventory(tool, TRUE) - var/obj/item/organ/heart/gland/gland = tool - gland.Insert(target, special = TRUE, movement_flags = FROM_ABDUCTOR_SURGERY) - return TRUE diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_clothing.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_clothing.dm index 1ab9db5898be..99108afdbcf4 100644 --- a/code/modules/antagonists/abductor/equipment/gear/abductor_clothing.dm +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_clothing.dm @@ -160,7 +160,7 @@ to_chat(loc, span_warning("Combat injection is still recharging.")) return var/mob/living/carbon/human/wearer = loc - wearer.adjustStaminaLoss(-75) + wearer.adjust_stamina_loss(-75) wearer.SetUnconscious(0) wearer.SetStun(0) wearer.SetKnockdown(0) diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm index febfa8758a4d..3cdbda71f79d 100644 --- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm @@ -5,11 +5,10 @@ abstract_type = /obj/item/abductor /obj/item/proc/AbductorCheck(mob/user) - if (HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING)) + if (HAS_MIND_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!")) + + balloon_alert(user, "no idea how this works!") return FALSE /obj/item/abductor/proc/ScientistCheck(mob/user) @@ -262,7 +261,7 @@ inhand_icon_state = "shrink_ray" icon_state = "shrink_ray" automatic_charge_overlays = FALSE - fire_delay = 30 + fire_delay = 3 SECONDS 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) @@ -378,12 +377,10 @@ Return to step 11 of normal process."} icon_state = "wonderprodProbe" inhand_icon_state = "wonderprodProbe" -/obj/item/melee/baton/abductor/can_baton(mob/living/target, mob/living/user) - if(!AbductorCheck(user)) - return FALSE - return ..() +/obj/item/melee/baton/abductor/try_stun(mob/living/target, mob/living/user, harmbatonning) + return AbductorCheck(user) && ..() -/obj/item/melee/baton/abductor/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override) +/obj/item/melee/baton/abductor/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override, clumsy) switch (mode) if(BATON_STUN) target.visible_message(span_danger("[user] stuns [target] with [src]!"), @@ -445,7 +442,7 @@ Return to step 11 of normal process."} 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.set_handcuffed(new /obj/item/restraints/handcuffs/energy(carbon_victim)) to_chat(user, span_notice("You restrain [carbon_victim].")) log_combat(user, carbon_victim, "handcuffed") else @@ -481,22 +478,16 @@ Return to step 11 of normal process."} 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!")) +/obj/item/restraints/handcuffs/energy/on_uncuffed(datum/source, mob/living/wearer) + . = ..() + wearer.visible_message(span_danger("[wearer]'s [name] breaks in a discharge of energy!"), span_userdanger("[wearer]'s [name] breaks in a discharge of energy!")) var/datum/effect_system/spark_spread/sparks = new - sparks.set_up(4,0,user.loc) + sparks.set_up(4,0,wearer.loc) sparks.start() - . = ..() + qdel(src) /obj/item/melee/baton/abductor/examine(mob/user) . = ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/chem.dm b/code/modules/antagonists/abductor/equipment/glands/chem.dm index 54644bd8e9f3..5bd5a618e16b 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/heart/gland/chem/activate() var/chem_to_add = pick(possible_reagents) owner.reagents.add_reagent(chem_to_add, 2) - owner.adjustToxLoss(-5, forced = TRUE) + owner.adjust_tox_loss(-5, forced = TRUE) ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm index eb50a7e9fda8..4d4deeee6aee 100644 --- a/code/modules/antagonists/abductor/equipment/glands/heal.dm +++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm @@ -55,11 +55,11 @@ if(!limb) replace_limb(zone) return - if((limb.get_damage() >= (limb.max_damage / 2)) || (!IS_ORGANIC_LIMB(limb))) + if((limb.get_damage() >= (limb.max_damage / 2)) || (!IS_ORGANIC_LIMB(limb)) && !HAS_TRAIT(owner, TRAIT_NODISMEMBER)) replace_limb(zone, limb) return - if(owner.getToxLoss() > 40) + if(owner.get_tox_loss() > 40) replace_blood() return var/tox_amount = 0 @@ -68,8 +68,8 @@ if(tox_amount > 10) replace_blood() return - if(owner.blood_volume < BLOOD_VOLUME_OKAY) - owner.blood_volume = BLOOD_VOLUME_NORMAL + if(owner.get_blood_volume() < BLOOD_VOLUME_OKAY) + owner.set_blood_volume(BLOOD_VOLUME_NORMAL) to_chat(owner, span_warning("You feel your blood pulsing within you.")) return @@ -194,13 +194,13 @@ var/keep_going = FALSE owner.vomit(vomit_flags = (MOB_VOMIT_BLOOD | MOB_VOMIT_FORCE), lost_nutrition = 0, distance = 3) owner.Stun(15) - owner.adjustToxLoss(-15, forced = TRUE) + owner.adjust_tox_loss(-15, forced = TRUE) - owner.blood_volume = min(BLOOD_VOLUME_NORMAL, owner.blood_volume + 20) - if(owner.blood_volume < BLOOD_VOLUME_NORMAL) + owner.adjust_blood_volume(20, maximum = BLOOD_VOLUME_NORMAL) + if(owner.get_blood_volume() < BLOOD_VOLUME_NORMAL) keep_going = TRUE - if(owner.getToxLoss()) + if(owner.get_tox_loss()) keep_going = TRUE for(var/datum/reagent/toxin/R in owner.reagents.reagent_list) owner.reagents.remove_reagent(R.type, 4) @@ -226,7 +226,7 @@ gibs.streak(dirs) var/obj/item/bodypart/chest/new_chest = new(null) - new_chest.replace_limb(owner, TRUE) + new_chest.replace_limb(owner) qdel(chest) #undef REJECTION_VOMIT_FLAGS diff --git a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm index 3480d20de4e0..d312a4409d06 100644 --- a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm +++ b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm @@ -26,7 +26,7 @@ if(2) to_chat(target, span_warning("You hear an annoying buzz in your head.")) target.adjust_confusion(15 SECONDS) - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 160) + target.adjust_organ_loss(ORGAN_SLOT_BRAIN, 10, 160) if(3) target.adjust_hallucinations(150 SECONDS) diff --git a/code/modules/antagonists/abductor/machinery/camera.dm b/code/modules/antagonists/abductor/machinery/camera.dm index 644e3a827bf7..10abf2577ee3 100644 --- a/code/modules/antagonists/abductor/machinery/camera.dm +++ b/code/modules/antagonists/abductor/machinery/camera.dm @@ -66,13 +66,13 @@ to_chat(owner, span_warning("This area is too heavily shielded to safely transport to.")) return - if(istype(target_area, /area/station/ai_monitored)) + if(target_area.motion_monitored) to_chat(owner, span_warning("This area is too heavily shielded to safely transport to.")) return use_delay = (world.time + abductor_pad_cooldown) - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) + if(SScameras.is_visible_by_cameras(remote_eye.loc)) P.PadToLoc(remote_eye.loc) /datum/action/innate/teleport_out @@ -110,13 +110,13 @@ to_chat(owner, span_warning("This area is too heavily shielded to safely transport to.")) return - if(istype(target_area, /area/station/ai_monitored)) + if(target_area.motion_monitored) to_chat(owner, span_warning("This area is too heavily shielded to safely transport to.")) return use_delay = (world.time + teleport_self_cooldown) - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) + if(SScameras.is_visible_by_cameras(remote_eye.loc)) P.MobToLoc(remote_eye.loc,C) /datum/action/innate/vest_mode_swap diff --git a/code/modules/antagonists/blob/blobstrains/_reagent.dm b/code/modules/antagonists/blob/blobstrains/_reagent.dm index 3273087a692b..e2841ceb019f 100644 --- a/code/modules/antagonists/blob/blobstrains/_reagent.dm +++ b/code/modules/antagonists/blob/blobstrains/_reagent.dm @@ -26,8 +26,6 @@ // These can only be applied by blobs. They are what (reagent) blobs are made out of. /datum/reagent/blob - name = "Unknown" - description = "" color = COLOR_WHITE taste_description = "bad code and slime" chemical_flags = NONE diff --git a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm index 64aa9c26f75f..43b213a2dd9d 100644 --- a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm +++ b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm @@ -28,8 +28,8 @@ /datum/reagent/blob/cryogenic_poison/on_mob_life(mob/living/carbon/exposed_mob, seconds_per_tick, times_fired) . = ..() 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) + need_mob_update = exposed_mob.adjust_brute_loss(0.5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += exposed_mob.adjust_fire_loss(0.5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += exposed_mob.adjust_tox_loss(0.5 * REM * seconds_per_tick, updating_health = FALSE) if(need_mob_update) . = UPDATE_MOB_HEALTH diff --git a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm index 43c18fc80909..585bc830917f 100644 --- a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm +++ b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm @@ -30,6 +30,6 @@ . = ..() reac_volume = return_mob_expose_reac_volume(exposed_mob, methods, reac_volume, show_message, touch_protection, overmind) exposed_mob.losebreath += round(0.2*reac_volume) - exposed_mob.adjustStaminaLoss(reac_volume * 1.2) + exposed_mob.adjust_stamina_loss(reac_volume * 1.2) if(exposed_mob) exposed_mob.apply_damage(0.6*reac_volume, OXY) diff --git a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm index 40019beb013e..98dc4279f690 100644 --- a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm +++ b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm @@ -48,5 +48,5 @@ exposed_mob.adjust_wet_stacks(reac_volume / 10) exposed_mob.apply_damage(0.4*reac_volume, BRUTE, wound_bonus=CANT_WOUND) if(exposed_mob) - exposed_mob.adjustStaminaLoss(reac_volume, FALSE) + exposed_mob.adjust_stamina_loss(reac_volume, FALSE) exposed_mob.apply_damage(0.4 * reac_volume, OXY) diff --git a/code/modules/antagonists/blob/blobstrains/reactive_spines.dm b/code/modules/antagonists/blob/blobstrains/reactive_spines.dm index 778b1a227842..1275a18b418d 100644 --- a/code/modules/antagonists/blob/blobstrains/reactive_spines.dm +++ b/code/modules/antagonists/blob/blobstrains/reactive_spines.dm @@ -42,4 +42,4 @@ /datum/reagent/blob/reactive_spines/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message, touch_protection, mob/eye/blob/overmind) . = ..() reac_volume = return_mob_expose_reac_volume(exposed_mob, methods, reac_volume, show_message, touch_protection, overmind) - exposed_mob.adjustBruteLoss(reac_volume) + exposed_mob.adjust_brute_loss(reac_volume) diff --git a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm index 101995f23d5b..3963a7535a61 100644 --- a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm +++ b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm @@ -28,7 +28,7 @@ /datum/reagent/blob/regenerative_materia/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) . = ..() - if(metabolizer.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE)) + if(metabolizer.adjust_tox_loss(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/overmind.dm b/code/modules/antagonists/blob/overmind.dm index fb7fc944b1c4..a5ee1697a3bc 100644 --- a/code/modules/antagonists/blob/overmind.dm +++ b/code/modules/antagonists/blob/overmind.dm @@ -198,7 +198,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) /// Create a blob spore and link it to us /mob/eye/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) + var/mob/living/basic/blob_minion/spore/spore = new spore_type(spore_turf, blob_borne = TRUE) spore.AddComponent(/datum/component/blob_minion, src) return spore diff --git a/code/modules/antagonists/blob/powers.dm b/code/modules/antagonists/blob/powers.dm index 2415b9db895f..593cd4ebc6f4 100644 --- a/code/modules/antagonists/blob/powers.dm +++ b/code/modules/antagonists/blob/powers.dm @@ -216,7 +216,8 @@ factory.assign_blobbernaut(null) return FALSE - var/mob/living/basic/blob_minion/blobbernaut/minion/blobber = new(get_turf(factory)) + var/mob_type = /mob/living/basic/blob_minion/blobbernaut/minion + var/mob/living/basic/blob_minion/blobbernaut/minion/blobber = new mob_type(get_turf(factory), blob_borne = TRUE) blobber.AddComponent(/datum/component/blob_minion, new_overmind = src, new_death_cloud_size = blobber.death_cloud_size) factory.assign_blobbernaut(blobber) blobber.assign_key(ghost.key, blobstrain) diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index 334dbf246fcb..a20da754d4e4 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -54,7 +54,7 @@ if (!istype(carbon_owner)) return carbon_owner.AddComponentFrom(REF(src), /datum/component/can_flash_from_behind) - RegisterSignal(carbon_owner, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON, PROC_REF(on_mob_successful_flashed_carbon)) + RegisterSignal(carbon_owner, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB, PROC_REF(on_mob_successful_flashed_mob)) /// Take away the ability to add more brothers /datum/antagonist/brother/proc/remove_conversion_skills() @@ -62,12 +62,12 @@ return var/mob/living/carbon/carbon_owner = owner.current carbon_owner.RemoveComponentSource(REF(src), /datum/component/can_flash_from_behind) - UnregisterSignal(carbon_owner, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON) + UnregisterSignal(carbon_owner, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB) -/datum/antagonist/brother/proc/on_mob_successful_flashed_carbon(mob/living/source, mob/living/carbon/flashed, obj/item/assembly/flash/flash) +/datum/antagonist/brother/proc/on_mob_successful_flashed_mob(mob/living/source, mob/living/flashed, obj/item/assembly/flash/flash) SIGNAL_HANDLER - if (flashed.stat == DEAD) + if (flashed.stat == DEAD || issilicon(flashed) || isdrone(flashed)) return if (flashed.stat != CONSCIOUS) diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 81193cc0547d..7b410dc732bd 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -6,7 +6,7 @@ roundend_category = "changelings" antagpanel_category = "Changeling" pref_flag = ROLE_CHANGELING - antag_moodlet = /datum/mood_event/focused + antag_moodlet = /datum/mood_event/ling antag_hud_name = "changeling" hijack_speed = 0.5 ui_name = "AntagInfoChangeling" @@ -144,6 +144,7 @@ RegisterSignal(living_mob, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(get_status_tab_item)) RegisterSignals(living_mob, list(COMSIG_MOB_MIDDLECLICKON, COMSIG_MOB_ALTCLICKON), PROC_REF(on_click_sting)) ADD_TRAIT(living_mob, TRAIT_FAKE_SOULLESS, CHANGELING_TRAIT) + ADD_TRAIT(living_mob, TRAIT_BRAINLESS_CARBON, CHANGELING_TRAIT) if(living_mob.hud_used) var/datum/hud/hud_used = living_mob.hud_used @@ -203,6 +204,7 @@ handle_clown_mutation(living_mob, removing = FALSE) UnregisterSignal(living_mob, list(COMSIG_MOB_LOGIN, COMSIG_LIVING_LIFE, COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_MOB_GET_STATUS_TAB_ITEMS, COMSIG_MOB_MIDDLECLICKON, COMSIG_MOB_ALTCLICKON)) REMOVE_TRAIT(living_mob, TRAIT_FAKE_SOULLESS, CHANGELING_TRAIT) + REMOVE_TRAIT(living_mob, TRAIT_BRAINLESS_CARBON, CHANGELING_TRAIT) if(living_mob.hud_used) var/datum/hud/hud_used = living_mob.hud_used diff --git a/code/modules/antagonists/changeling/powers/_biodegrade_bioacid.dm b/code/modules/antagonists/changeling/powers/_biodegrade_bioacid.dm new file mode 100644 index 000000000000..7278a16c89a2 --- /dev/null +++ b/code/modules/antagonists/changeling/powers/_biodegrade_bioacid.dm @@ -0,0 +1,25 @@ +/datum/reagent/toxin/acid/bio_acid + name = "adaptive bio-acid" + description = "An immensely strong, acidic substance of seemingly biological origin. It is teeming with microscopic\ + organisms that seem to alter its composition to most adaptively dissolve whatever it comes into contact with." + color = "#9455ff" + creation_purity = 100 + toxpwr = 0 + acidpwr = 0 + ph = 0.0 + penetrates_skin = TOUCH + +/datum/reagent/toxin/acid/bio_acid/expose_mob(mob/living/exposed_mob, methods = TOUCH, reac_volume, show_message = TRUE, touch_protection) + if(IS_CHANGELING(exposed_mob)) + to_chat(exposed_mob, span_changeling("We excrete a bio-agent to neutralize the bio-acid. It is routine and reflexive to do so.")) + volume = min(0.1, volume) + holder.update_total() + return + . = ..() + exposed_mob.adjust_fire_loss(round(reac_volume * min(1 - touch_protection), 0.1) * 3, required_bodytype = BODYTYPE_ORGANIC) // full bio protection = 100% damage reduction + exposed_mob.acid_act(10, 50) + +/datum/reagent/toxin/acid/bio_acid/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + if(SPT_PROB(50, seconds_per_tick)) + affected_mob.emote(pick("screech", "cry")) diff --git a/code/modules/antagonists/changeling/powers/adrenaline.dm b/code/modules/antagonists/changeling/powers/adrenaline.dm index 0b1ad87a7b4e..04f59962c015 100644 --- a/code/modules/antagonists/changeling/powers/adrenaline.dm +++ b/code/modules/antagonists/changeling/powers/adrenaline.dm @@ -15,7 +15,7 @@ // Get us standing up. user.SetAllImmobility(0) - user.setStaminaLoss(0) + user.set_stamina_loss(0) user.set_resting(FALSE, instant = TRUE) user.reagents.add_reagent(/datum/reagent/medicine/changelingadrenaline, 4) //Tank 5 consecutive baton hits diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index 8a5fae3bd8ae..101bd9358449 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -1,116 +1,109 @@ /datum/action/changeling/biodegrade name = "Biodegrade" desc = "Dissolves restraints or other objects preventing free movement. Costs 30 chemicals." - helptext = "This is obvious to nearby people, and can destroy standard restraints and closets." + helptext = "This is obvious to nearby people, and can destroy standard restraints and closets. Works against grabs." button_icon_state = "biodegrade" - chemical_cost = 30 //High cost to prevent spam + chemical_cost = 30 dna_cost = 2 req_human = TRUE disabled_by_fire = FALSE + var/static/bio_acid_path = /datum/reagent/toxin/acid/bio_acid + var/static/bio_acid_amount_per_spray = 6 + var/static/bio_acid_color = "#9455ff" /datum/action/changeling/biodegrade/sting_action(mob/living/carbon/human/user) - if(user.handcuffed) - var/obj/O = user.get_item_by_slot(ITEM_SLOT_HANDCUFFED) - if(!istype(O)) - return FALSE - user.visible_message(span_warning("[user] vomits a glob of acid on [user.p_their()] [O]!"), \ - span_warning("We vomit acidic ooze onto our restraints!")) + . = FALSE + var/list/obj/restraints = list() + var/obj/handcuffs = user.get_item_by_slot(ITEM_SLOT_HANDCUFFED) + var/obj/legcuffs = user.get_item_by_slot(ITEM_SLOT_LEGCUFFED) + var/obj/item/clothing/suit/straitjacket = user.get_item_by_slot(ITEM_SLOT_OCLOTHING) + var/obj/item/clothing/shoes/sneakers/orange/prisoner_shoes = user.get_item_by_slot(ITEM_SLOT_FEET) + var/obj/item/clothing/shoes/knotted_shoes = user.get_item_by_slot(ITEM_SLOT_FEET) + var/obj/some_manner_of_cage = astype(user.loc, /obj) + var/mob/living/space_invader = user.pulledby || user.buckled - addtimer(CALLBACK(src, PROC_REF(dissolve_handcuffs), user, O), 3 SECONDS) - log_combat(user, user.handcuffed, "melted handcuffs", addition = "(biodegrade)") - ..() - return TRUE + if(!istype(prisoner_shoes) || !prisoner_shoes.attached_cuffs) + prisoner_shoes = null + if(!istype(knotted_shoes) || knotted_shoes.tied != SHOES_KNOTTED) + knotted_shoes = null + if(!straitjacket?.breakouttime) + straitjacket = null - if(user.legcuffed) - var/obj/O = user.get_item_by_slot(ITEM_SLOT_LEGCUFFED) - if(!istype(O)) - return FALSE - user.visible_message(span_warning("[user] vomits a glob of acid on [user.p_their()] [O]!"), \ - span_warning("We vomit acidic ooze onto our restraints!")) + if(!handcuffs && !legcuffs && !straitjacket && !prisoner_shoes && !knotted_shoes && !some_manner_of_cage && !space_invader) + user.balloon_alert(user, "already free!") + return . + ..() - addtimer(CALLBACK(src, PROC_REF(dissolve_legcuffs), user, O), 3 SECONDS) - log_combat(user, user.legcuffed, "melted legcuffs", addition = "(biodegrade)") - ..() - return TRUE + if(handcuffs) + restraints.Add(handcuffs) + if(legcuffs) + restraints.Add(legcuffs) + if(straitjacket) + restraints.Add(straitjacket) + if(prisoner_shoes) + restraints.Add(prisoner_shoes) + if(knotted_shoes) + restraints.Add(knotted_shoes) + if(some_manner_of_cage) + restraints.Add(some_manner_of_cage) - 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 [user.wear_suit.name]!")) - addtimer(CALLBACK(src, PROC_REF(dissolve_straightjacket), user, S), 3 SECONDS) - log_combat(user, user.wear_suit, "melted [user.wear_suit]", addition = "(biodegrade)") - ..() - return TRUE + for(var/obj/restraint as anything in restraints) + if(restraint.obj_flags & (INDESTRUCTIBLE | ACID_PROOF | UNACIDABLE)) + to_chat(user, span_changeling("We cannot use bio-acid to destroy [restraint]!")) + continue - 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), 7 SECONDS) - log_combat(user, user.loc, "melted locker", addition = "(biodegrade)") - ..() - return TRUE - - 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 - log_combat(user, user.loc, "melted cocoon", addition = "(biodegrade)") - ..() - return TRUE - - var/obj/item/clothing/shoes/shoes = user.shoes - if(istype(shoes) && shoes.tied == SHOES_KNOTTED && !(shoes.resistance_flags & (INDESTRUCTIBLE|UNACIDABLE|ACID_PROOF))) - new /obj/effect/decal/cleanable/greenglow(shoes.drop_location()) + if(restraint == user.loc) + restraint.visible_message(span_warning("Bubbling acid start spewing out of [restraint]...")) + addtimer(CALLBACK(restraint, TYPE_PROC_REF(/atom, atom_destruction), ACID), 4 SECONDS) + for(var/beat in 1 to 3) + addtimer(CALLBACK(src, PROC_REF(make_puddle), restraint), beat SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), restraint, 'sound/items/tools/welder.ogg', 50, TRUE), beat SECONDS) + log_combat(user = user, target = restraint, what_done = "melted restraining container", addition = "(biodegrade)") + return + //otherwise it's some kind of worn restraint + addtimer(CALLBACK(restraint, TYPE_PROC_REF(/atom, atom_destruction), ACID), 1.5 SECONDS) + log_combat(user = user, target = restraint, what_done = "melted restraining item", addition = "(biodegrade)") user.visible_message( - span_warning("[user] vomits a glob of acid on [user.p_their()] tied up [shoes.name], melting [shoes.p_them()] into a pool of goo!"), - span_warning("We vomit acidic ooze onto our tied up [shoes.name], melting [shoes.p_them()] into a pool of goo!"), - ) - log_combat(user, shoes, "melted own shoes", addition = "(biodegrade)") - qdel(shoes) - ..() - return TRUE - - user.balloon_alert(user, "already free!") - return FALSE + span_warning("[user] spews torrents of acid onto [restraint], melting them with horrifying ease."), + user.balloon_alert(user, "melting restraints..."), + span_danger("You hear retching, then the sizzling of powerful acid, closer to the sound of hissing steam.")) + playsound(user, 'sound/items/tools/welder.ogg', 50, TRUE) + . = TRUE -/datum/action/changeling/biodegrade/proc/dissolve_handcuffs(mob/living/carbon/human/user, obj/O) - if(O && user.handcuffed == O) - user.visible_message(span_warning("[O] dissolve[O.gender == PLURAL?"":"s"] into a puddle of sizzling goop.")) - new /obj/effect/decal/cleanable/greenglow(O.drop_location()) - qdel(O) + if(space_invader) + punish_with_acid(user, space_invader) + . = TRUE + return . -/datum/action/changeling/biodegrade/proc/dissolve_legcuffs(mob/living/carbon/human/user, obj/O) - if(O && user.legcuffed == O) - user.visible_message(span_warning("[O] dissolve[O.gender == PLURAL?"":"s"] into a puddle of sizzling goop.")) - new /obj/effect/decal/cleanable/greenglow(O.drop_location()) - qdel(O) +/// Spawn green acid puddle underneath obj, used for callback +/datum/action/changeling/biodegrade/proc/make_puddle(obj/melted_restraint) + if (melted_restraint) // incase obj gets qdel'd + return new /obj/effect/decal/cleanable/greenglow(get_turf(melted_restraint)) -/datum/action/changeling/biodegrade/proc/dissolve_straightjacket(mob/living/carbon/human/user, obj/S) - if(S && user.wear_suit == S) - user.visible_message(span_warning("[S] dissolves into a puddle of sizzling goop.")) - new /obj/effect/decal/cleanable/greenglow(S.drop_location()) - qdel(S) +/datum/action/changeling/biodegrade/proc/acid_blast(atom/movable/user, atom/movable/target) + var/datum/reagents/ephemeral_acid = new + ephemeral_acid.add_reagent(bio_acid_path, bio_acid_amount_per_spray) + var/mutable_appearance/splash_animation = mutable_appearance('icons/effects/effects.dmi', "splash") + splash_animation.color = bio_acid_color + target.flick_overlay_view(splash_animation, 3 SECONDS) + ephemeral_acid.expose(target, TOUCH) -/datum/action/changeling/biodegrade/proc/open_closet(mob/living/carbon/human/user, obj/structure/closet/C) - if(C && user.loc == C) - C.visible_message(span_warning("[C]'s door breaks and opens!")) - new /obj/effect/decal/cleanable/greenglow(C.drop_location()) - C.welded = FALSE - C.locked = FALSE - C.broken = TRUE - C.open() - to_chat(user, span_warning("We open the container restraining us!")) - -/datum/action/changeling/biodegrade/proc/dissolve_cocoon(mob/living/carbon/human/user, obj/structure/spider/cocoon/C) - if(C && user.loc == C) - new /obj/effect/decal/cleanable/greenglow(C.drop_location()) - qdel(C) //The cocoon's destroy will move the changeling outside of it without interference - to_chat(user, span_warning("We dissolve the cocoon!")) +/datum/action/changeling/biodegrade/proc/punish_with_acid(mob/living/carbon/human/user, mob/living/hapless_manhandler) + acid_blast(user, hapless_manhandler) + playsound(user, 'sound/mobs/non-humanoids/bileworm/bileworm_spit.ogg', 50, TRUE) + if(IS_CHANGELING(hapless_manhandler)) + user.visible_message( + span_danger("[user] spews a mist of sizzling acid onto [hapless_manhandler]... but nothing happens!"), + span_changeling("We prepare our escape, spraying bio-acid on our captor... [span_danger("But nothing happened?!")]"), + span_danger("You hear retching, then a sizzling that terminates quite abruptly.") + ) + to_chat(hapless_manhandler, span_changeling("Our prey attempts to dissuade us with one of our biology's simplest adaptions. Quaint.")) + return + user.visible_message( + span_danger("[user] spews a mist of sizzling acid onto [hapless_manhandler], using the opportunity to wrestle away."), + user.balloon_alert(user, "dissuading captor..."), + span_danger("You hear retching, then sizzling, quickly muffled by a loud keening of pain.")) + hapless_manhandler.Stun(2 SECONDS) + hapless_manhandler.emote("scream") + hapless_manhandler.stop_pulling() + log_combat(user = user, target = hapless_manhandler, what_done = "acid-spewed to escape a grab", addition = "(biodegrade)") diff --git a/code/modules/antagonists/changeling/powers/darkness_adaptation.dm b/code/modules/antagonists/changeling/powers/darkness_adaptation.dm index 47fe31c215b5..4d8e8a7e4746 100644 --- a/code/modules/antagonists/changeling/powers/darkness_adaptation.dm +++ b/code/modules/antagonists/changeling/powers/darkness_adaptation.dm @@ -51,7 +51,7 @@ /// Makes the user harder to see in the dark (and makes the user see in the dark easier) /datum/status_effect/darkness_adapted id = "darkness_adapted" - tick_interval = 0.5 SECONDS + tick_interval = 0.6 SECONDS alert_type = null /// Threshold before the dark color is applied var/dark_color_threshold = 70 diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm index 23658907cd27..0988b9c6b15f 100644 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ b/code/modules/antagonists/changeling/powers/headcrab.dm @@ -1,7 +1,10 @@ +#define LAST_RESORT_EXPLOSION_RANGE 2 +#define LAST_RESORT_BLIND_RANGE 4 + /datum/action/changeling/headcrab name = "Last Resort" - desc = "We sacrifice our current body in a moment of need, placing us in control of a vessel that can plant our likeness in a new host. Costs 20 chemicals." - helptext = "We will be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us." + desc = "We sacrifice our current body in a moment of need, violently expanding to break through obstacles and reforming as a headslug. Costs 20 chemicals." + helptext = "We will violently expand, destroying obstacles around us, then be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us." button_icon_state = "last_resort" chemical_cost = 20 dna_cost = 1 @@ -19,34 +22,66 @@ /datum/action/changeling/headcrab/sting_action(mob/living/user) set waitfor = FALSE var/confirm = tgui_alert(user, "Are we sure we wish to destroy our body and create a headslug?", "Last Resort", list("Yes", "No")) - if(confirm != "Yes") + if(active || confirm != "Yes") return - + active = TRUE ..() - var/datum/mind/stored_mind = user.mind - var/list/organs = user.get_organs_for_zone(BODY_ZONE_HEAD, TRUE) + user.visible_message(span_boldwarning("[user]'s body begins to pulsate and swell unnaturally!")) + playsound(user, 'sound/effects/wounds/crack1.ogg', 100, TRUE) + animate(user, transform = user.transform * 1.5, color = COLOR_RED, time = 1 SECONDS) + if(is_walled(user)) + user.Immobilize(1.5 SECONDS) // to prevent the breaking of the wrong walls (who would think of using the antistun after the last resort) + escaping_prison(user) + addtimer(CALLBACK(src, PROC_REF(gibbing), user), 1.1 SECONDS) - explosion(user, light_impact_range = 2, adminlog = TRUE, explosion_cause = src) - for(var/mob/living/carbon/human/blinded_human in range(2, user)) - var/obj/item/organ/eyes/eyes = blinded_human.get_organ_slot(ORGAN_SLOT_EYES) - if(!eyes || blinded_human.is_blind()) - continue - to_chat(blinded_human, span_userdanger("You are blinded by a shower of blood!")) - blinded_human.Stun(4 SECONDS) - blinded_human.set_eye_blur_if_lower(40 SECONDS) - blinded_human.adjust_confusion(12 SECONDS) - - for(var/mob/living/silicon/blinded_silicon in range(2,user)) - to_chat(blinded_silicon, span_userdanger("Your sensors are disabled by a shower of blood!")) - blinded_silicon.Paralyze(6 SECONDS) +/datum/action/changeling/headcrab/proc/gibbing(mob/living/user) + if(QDELETED(user)) + active = FALSE + return + gore_explosion(user) + var/datum/mind/stored_mind = user.mind + var/list/organs = user.get_organs_for_zone(BODY_ZONE_HEAD, TRUE) var/turf/user_turf = get_turf(user) + 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(DROP_ALL_REMAINS) - . = TRUE - addtimer(CALLBACK(src, PROC_REF(spawn_headcrab), stored_mind, user_turf, organs), 1 SECONDS) + addtimer(CALLBACK(src, PROC_REF(spawn_headcrab), stored_mind, user_turf, organs), 0.5 SECONDS) // without this delay the worm will be almost dead due to the explosion :( + +/// Creates a light explosion, blinds and confuses mobs in range +/datum/action/changeling/headcrab/proc/gore_explosion(mob/living/user) + var/list/user_DNA = user.get_blood_dna_list() + user.visible_message(span_boldwarning("[user]'s body ruptures in a violent explosion of biomass!")) + playsound(user, 'sound/effects/goresplat.ogg', 100, TRUE) //yuck!! + explosion(user, light_impact_range = LAST_RESORT_EXPLOSION_RANGE, flame_range = 0, flash_range = 0, adminlog = TRUE, silent = TRUE, explosion_cause = src) + user.spawn_gibs() + + for(var/turf/bloody_turf in view(LAST_RESORT_BLIND_RANGE, user)) + var/obj/effect/decal/cleanable/blood/blood_spot = new(bloody_turf) + blood_spot.add_blood_DNA(user_DNA) + + for(var/mob/living/blinded in view(LAST_RESORT_BLIND_RANGE, user)) + if(blinded == user) + continue + blinded.visible_message(span_danger("[blinded] is splattered with blood!"), span_userdanger("You're splattered with blood!")) + blinded.add_blood_DNA(user_DNA) + playsound(blinded, 'sound/effects/splat.ogg', 50, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE) + + if(ishuman(blinded)) + var/mob/living/carbon/human/blinded_human = blinded + var/obj/item/organ/eyes/eyes = blinded_human.get_organ_slot(ORGAN_SLOT_EYES) + if(!eyes || blinded_human.is_blind()) + continue + to_chat(blinded_human, span_userdanger("You are blinded by a shower of blood!")) + blinded_human.Stun(4 SECONDS) + blinded_human.set_eye_blur_if_lower(40 SECONDS) + blinded_human.adjust_confusion(12 SECONDS) + if(issilicon(blinded)) + var/mob/living/silicon/blinded_silicon = blinded + to_chat(blinded_silicon, span_userdanger("Your sensors are disabled by a shower of blood!")) + blinded_silicon.Paralyze(6 SECONDS) /// Creates the headrab to occupy /datum/action/changeling/headcrab/proc/spawn_headcrab(datum/mind/stored_mind, turf/spawn_location, list/organs) @@ -56,4 +91,53 @@ 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!")) + to_chat(crab, span_warning("We burst out of the remains of our former body in a shower of gore!")) + active = FALSE + +/// Ruptures nearby walls using the torn_wall component. Also it destroys objects with density. +/datum/action/changeling/headcrab/proc/escaping_prison(mob/living/user) + user.visible_message(span_boldwarning("[user]'s expanding form begins crushing the surrounding obstacles!")) + var/list/walls_to_destroy = list() + + for(var/turf/nearby_turf in range(1, user)) + if(iswallturf(nearby_turf)) + var/turf/closed/wall/nearby_wall = nearby_turf + var/datum/component/torn_wall/torn_comp = nearby_wall.GetComponent(/datum/component/torn_wall) + if(!torn_comp) + nearby_wall.AddComponent(/datum/component/torn_wall, current_stage = 1) + else + torn_comp.current_stage = 1 + walls_to_destroy += nearby_wall + continue + for(var/obj/obj_obstacle in nearby_turf) + if(!obj_obstacle.density || (obj_obstacle.resistance_flags & INDESTRUCTIBLE) || !obj_obstacle.anchored) + continue + if(obj_obstacle.uses_integrity) + obj_obstacle.take_damage(300) + + addtimer(CALLBACK(src, PROC_REF(finalize_destruction), walls_to_destroy, user, user.loc), 1 SECONDS) + +/// Completes the destruction of the walls after a 1-second delay for more drama +/datum/action/changeling/headcrab/proc/finalize_destruction(list/affected_walls, mob/living/user, atom/user_prev_loc) + if(QDELETED(user) || (user.loc != user_prev_loc)) + active = FALSE + return + for(var/turf/closed/wall/wall in affected_walls) + if(QDELETED(wall)) + continue + wall.AddComponent(/datum/component/torn_wall) + +/datum/action/changeling/headcrab/proc/is_walled(mob/living/user) + var/turf/ling_turf = get_turf(user) + if(!ling_turf) + return FALSE + var/blocked_directions + + for(var/dir in GLOB.cardinals) + var/turf/neighbor = get_step(ling_turf, dir) + if(!neighbor || neighbor.is_blocked_turf(exclude_mobs = TRUE)) + blocked_directions++ + return blocked_directions >= 3 //1x2 cage won't be able to contain linga + +#undef LAST_RESORT_EXPLOSION_RANGE +#undef LAST_RESORT_BLIND_RANGE diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index dbf97c2f6f44..762b6b4c90d9 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -227,6 +227,8 @@ ) /obj/item/melee/arm_blade/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) + if(QDELETED(target)) + return if(istype(target, /obj/structure/table)) var/obj/smash = target smash.deconstruct(FALSE) @@ -297,7 +299,7 @@ fire_sound = 'sound/effects/splat.ogg' force = 0 max_charges = 1 - fire_delay = 1 + fire_delay = 1 DECISECONDS throwforce = 0 //Just to be on the safe side throw_range = 0 throw_speed = 0 @@ -523,6 +525,9 @@ loc.visible_message(span_warning("The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!"), span_warning("We inflate our hand into a strong shield."), span_hear("You hear organic matter ripping and tearing!")) /obj/item/shield/changeling/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) + if(attack_type == OVERWHELMING_ATTACK) + return FALSE + if(remaining_uses < 1) if(ishuman(loc)) var/mob/living/carbon/human/H = loc diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index 09ebee22d592..6956a7d9dcfd 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -1,6 +1,7 @@ /datum/action/changeling/resonant_shriek name = "Resonant Shriek" - desc = "Our lungs and vocal cords shift, allowing us to briefly emit a noise that deafens and confuses humans, causing them to lose some control over their movements. Best used to stop prey from escaping. Costs 20 chemicals." + desc = "Our lungs and vocal cords shift, allowing us to emit a noise that deafens and confuses non-changelings, causing them to lose some control over their movements. \ + Best used to stop prey from escaping. Doesn't work well in a vacuum. Costs 20 chemicals." helptext = "Emits a high-frequency sound that confuses and deafens humans to hamper their movement, blows out nearby lights and overloads cyborg sensors." button_icon_state = "resonant_shriek" chemical_cost = 20 @@ -14,25 +15,19 @@ if(user.movement_type & VENTCRAWLING) user.balloon_alert(user, "can't shriek in pipes!") return FALSE - for(var/mob/living/M in get_hearers_in_view(4, user)) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(!IS_CHANGELING(C)) - var/obj/item/organ/ears/ears = C.get_organ_slot(ORGAN_SLOT_EARS) - if(ears) - ears.adjustEarDamage(0, 30) - C.adjust_confusion(25 SECONDS) - C.set_jitter_if_lower(100 SECONDS) - else - SEND_SOUND(C, sound('sound/effects/screech.ogg')) + playsound(user, 'sound/effects/screech.ogg', 100) + for(var/mob/living/living in get_hearers_in_view(4, user)) + if(IS_CHANGELING(living) || !living.soundbang_act(SOUNDBANG_MASSIVE, stun_pwr = 0, damage_pwr = 0, deafen_pwr = 1 MINUTES, ignore_deafness = TRUE, send_sound = FALSE)) + continue + if(issilicon(living)) + living.Paralyze(rand(10 SECONDS, 20 SECONDS)) + continue + living.adjust_confusion(25 SECONDS) + living.set_jitter_if_lower(100 SECONDS) - if(issilicon(M)) - SEND_SOUND(M, sound('sound/items/weapons/flash.ogg')) - M.Paralyze(rand(100,200)) - - for(var/obj/machinery/light/L in range(4, user)) - L.on = TRUE - L.break_light_tube() + for(var/obj/machinery/light/light in range(4, user)) + light.on = TRUE + light.break_light_tube() stoplag() return TRUE @@ -49,7 +44,7 @@ if(user.movement_type & VENTCRAWLING) user.balloon_alert(user, "can't shriek in pipes!") return FALSE - empulse(get_turf(user), 2, 5, 1) + empulse(get_turf(user), 2, 5, 1, emp_source = src) for(var/obj/machinery/light/L in range(5, usr)) L.on = TRUE L.break_light_tube() diff --git a/code/modules/antagonists/changeling/powers/strained_muscles.dm b/code/modules/antagonists/changeling/powers/strained_muscles.dm index 3ea59f5df089..2c3686f3fe65 100644 --- a/code/modules/antagonists/changeling/powers/strained_muscles.dm +++ b/code/modules/antagonists/changeling/powers/strained_muscles.dm @@ -49,7 +49,7 @@ stacks++ - user.adjustStaminaLoss(stacks * 1.3) //At first the changeling may regenerate stamina fast enough to nullify fatigue, but it will stack + user.adjust_stamina_loss(stacks * 1.3) //At first the changeling may regenerate stamina fast enough to nullify fatigue, but it will stack if(stacks == 11) //Warning message that the stacks are getting too high to_chat(user, span_warning("Our legs are really starting to hurt...")) diff --git a/code/modules/antagonists/clown_ops/clown_weapons.dm b/code/modules/antagonists/clown_ops/clown_weapons.dm index cba33a918026..cf1599d4c3a4 100644 --- a/code/modules/antagonists/clown_ops/clown_weapons.dm +++ b/code/modules/antagonists/clown_ops/clown_weapons.dm @@ -10,77 +10,6 @@ volume = 30 list_reagents = list(/datum/reagent/lube = 30) -//COMBAT CLOWN SHOES -//Clown shoes with combat stats and noslip. Of course they still squeak. -/obj/item/clothing/shoes/clown_shoes/combat - name = "combat clown shoes" - desc = "advanced clown shoes that protect the wearer and render them nearly immune to slipping on their own peels. They also squeak at 100% capacity." - clothing_traits = list(TRAIT_NO_SLIP_WATER) - slowdown = SHOES_SLOWDOWN - body_parts_covered = FEET|LEGS - armor_type = /datum/armor/clown_shoes_combat - strip_delay = 7 SECONDS - resistance_flags = NONE - -/datum/armor/clown_shoes_combat - melee = 25 - bullet = 25 - laser = 25 - energy = 25 - bomb = 50 - bio = 90 - fire = 70 - acid = 50 - -/obj/item/clothing/shoes/clown_shoes/combat/Initialize(mapload) - . = ..() - - create_storage(storage_type = /datum/storage/pockets/shoes) - -/// Recharging rate in PPS (peels per second) -#define BANANA_SHOES_RECHARGE_RATE 17 -#define BANANA_SHOES_MAX_CHARGE 3000 - -//The super annoying version -/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat - name = "mk-honk combat shoes" - desc = "The culmination of years of clown combat research, these shoes leave a trail of chaos in their wake. They will slowly recharge themselves over time, or can be manually charged with bananium." - slowdown = SHOES_SLOWDOWN - armor_type = /datum/armor/banana_shoes_combat - strip_delay = 7 SECONDS - resistance_flags = NONE - always_noslip = TRUE - body_parts_covered = FEET|LEGS - -/datum/armor/banana_shoes_combat - melee = 25 - bullet = 25 - laser = 25 - energy = 25 - bomb = 50 - bio = 50 - fire = 90 - acid = 50 - -/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/Initialize(mapload) - . = ..() - - create_storage(storage_type = /datum/storage/pockets/shoes) - 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/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) - -/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/attack_self(mob/user) - ui_action_click(user) - -#undef BANANA_SHOES_RECHARGE_RATE -#undef BANANA_SHOES_MAX_CHARGE - //BANANIUM SWORD /obj/item/melee/energy/sword/bananium diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 23af33c99e9f..cd116c0c97ab 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -183,7 +183,7 @@ owner.whisper(invocation, language = /datum/language/common, forced = "cult invocation") owner.visible_message(span_warning("[owner]'s hand flashes a bright blue!"), \ span_cult_italic("You speak the cursed words, emitting an EMP blast from your hand.")) - empulse(owner, 2, 5) + empulse(owner, 2, 5, emp_source = src) charges-- SSblackbox.record_feedback("tally", "cult_spell_invoke", 1, "[name]") if(charges <= 0) @@ -572,7 +572,7 @@ span_userdanger("[user] begins shaping dark magic shackles around your wrists!")) if(do_after(user, 3 SECONDS, C)) if(!C.handcuffed) - C.set_handcuffed(new /obj/item/restraints/handcuffs/energy/cult/used(C)) + C.equip_to_slot_or_del(new /obj/item/restraints/handcuffs/cult, ITEM_SLOT_HANDCUFFED, indirect_action = TRUE) C.adjust_silence(10 SECONDS) to_chat(user, span_notice("You shackle [C].")) log_combat(user, C, "shackled") @@ -584,19 +584,6 @@ else to_chat(user, span_warning("[C] is already bound.")) - -/obj/item/restraints/handcuffs/energy/cult //For the shackling spell - name = "shadow shackles" - desc = "Shackles that bind the wrists with sinister magic." - trashtype = /obj/item/restraints/handcuffs/energy/used - item_flags = DROPDEL - -/obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user) - user.visible_message(span_danger("[user]'s shackles shatter in a discharge of dark magic!"), \ - span_userdanger("Your [src] shatters in a discharge of dark magic!")) - . = ..() - - //Construction: Converts 50 iron to a construct shell, plasteel to runed metal, airlock to brittle runed airlock, a borg to a construct, or borg shell to a construct shell /obj/item/melee/blood_magic/construction name = "Twisting Aura" @@ -765,7 +752,7 @@ if(!ishuman(target)) return var/mob/living/carbon/human/human_bloodbag = target - if(HAS_TRAIT(human_bloodbag, TRAIT_NOBLOOD)) + if(!CAN_HAVE_BLOOD(human_bloodbag)) human_bloodbag.balloon_alert(user, "no blood!") return if(human_bloodbag.stat == DEAD) @@ -818,21 +805,22 @@ /// used to ensure the proc returns TRUE if we completely restore an undamaged persons blood var/blood_donor = FALSE - if(human_bloodbag.blood_volume < BLOOD_VOLUME_SAFE) - var/blood_needed = BLOOD_VOLUME_SAFE - human_bloodbag.blood_volume + var/cached_blood_volume = human_bloodbag.get_blood_volume() + if(cached_blood_volume < BLOOD_VOLUME_SAFE) + var/blood_needed = BLOOD_VOLUME_SAFE - cached_blood_volume /// how much blood we are capable of restoring, based on spell charges var/blood_bank = USES_TO_BLOOD * uses if(blood_bank < blood_needed) - human_bloodbag.blood_volume += blood_bank + human_bloodbag.adjust_blood_volume(blood_bank) to_chat(user,span_danger("You use the last of your blood rites to restore what blood you could!")) uses = 0 return TRUE blood_donor = TRUE - human_bloodbag.blood_volume = BLOOD_VOLUME_SAFE + human_bloodbag.set_blood_volume(BLOOD_VOLUME_SAFE) uses -= round(blood_needed / USES_TO_BLOOD) 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() + var/overall_damage = human_bloodbag.get_brute_loss() + human_bloodbag.get_fire_loss() + human_bloodbag.get_tox_loss() + human_bloodbag.get_oxy_loss() if(overall_damage == 0) if(blood_donor) return TRUE @@ -850,10 +838,10 @@ human_bloodbag.visible_message(span_warning("[human_bloodbag] is [uses == 0 ? "partially healed":"fully healed"] by [human_bloodbag == user ? "[human_bloodbag.p_their()]":"[human_bloodbag]'s"] blood magic!")) var/need_mob_update = FALSE - need_mob_update += human_bloodbag.adjustOxyLoss(damage_healed * (human_bloodbag.getOxyLoss() / overall_damage), updating_health = FALSE) - need_mob_update += human_bloodbag.adjustToxLoss(damage_healed * (human_bloodbag.getToxLoss() / overall_damage), updating_health = FALSE) - need_mob_update += human_bloodbag.adjustFireLoss(damage_healed * (human_bloodbag.getFireLoss() / overall_damage), updating_health = FALSE) - need_mob_update += human_bloodbag.adjustBruteLoss(damage_healed * (human_bloodbag.getBruteLoss() / overall_damage), updating_health = FALSE) + need_mob_update += human_bloodbag.adjust_oxy_loss(damage_healed * (human_bloodbag.get_oxy_loss() / overall_damage), updating_health = FALSE) + need_mob_update += human_bloodbag.adjust_tox_loss(damage_healed * (human_bloodbag.get_tox_loss() / overall_damage), updating_health = FALSE) + need_mob_update += human_bloodbag.adjust_fire_loss(damage_healed * (human_bloodbag.get_fire_loss() / overall_damage), updating_health = FALSE) + need_mob_update += human_bloodbag.adjust_brute_loss(damage_healed * (human_bloodbag.get_brute_loss() / overall_damage), updating_health = FALSE) if(need_mob_update) human_bloodbag.updatehealth() playsound(get_turf(human_bloodbag), 'sound/effects/magic/staff_healing.ogg', 25) @@ -871,10 +859,10 @@ 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 FALSE - if(human_bloodbag.blood_volume <= BLOOD_VOLUME_SAFE) + if(human_bloodbag.get_blood_volume() <= BLOOD_VOLUME_SAFE) to_chat(user,span_warning("[human_bloodbag.p_Theyre()] missing too much blood - you cannot drain [human_bloodbag.p_them()] further!")) return FALSE - human_bloodbag.blood_volume -= BLOOD_DRAIN_GAIN * USES_TO_BLOOD + human_bloodbag.adjust_blood_volume(-BLOOD_DRAIN_GAIN * USES_TO_BLOOD) uses += BLOOD_DRAIN_GAIN user.Beam(human_bloodbag, icon_state="drainbeam", time = 1 SECONDS) playsound(get_turf(human_bloodbag), 'sound/effects/magic/enter_blood.ogg', 50) diff --git a/code/modules/antagonists/cult/cult_armor.dm b/code/modules/antagonists/cult/cult_armor.dm index 4f6aae945be4..d4a62d5fd54b 100644 --- a/code/modules/antagonists/cult/cult_armor.dm +++ b/code/modules/antagonists/cult/cult_armor.dm @@ -246,6 +246,7 @@ actions_types = null color_cutoffs = list(40, 0, 0) //red glass_colour_type = null + custom_materials = null /obj/item/clothing/glasses/hud/health/night/cultblind/equipped(mob/living/user, slot) . = ..() diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index ca4bb86cc978..93dfabbfc72d 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -13,6 +13,7 @@ icon = 'icons/obj/weapons/khopesh.dmi' icon_state = "render" inhand_icon_state = "cultdagger" + worn_icon = null worn_icon_state = "render" icon_angle = -45 lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' @@ -55,7 +56,7 @@ Striking a noncultist, however, will tear their flesh."} if(owner.get_active_held_item() != src) block_message = "[owner] parries [attack_text] with [src] in their offhand" - if(IS_CULTIST(owner) && prob(final_block_chance) && attack_type != (PROJECTILE_ATTACK || OVERWHELMING_ATTACK)) + if(IS_CULTIST(owner) && prob(final_block_chance) && (attack_type != PROJECTILE_ATTACK || attack_type != OVERWHELMING_ATTACK)) new /obj/effect/temp_visual/cult/sparks(get_turf(owner)) owner.visible_message(span_danger("[block_message]")) return TRUE @@ -88,6 +89,7 @@ Striking a noncultist, however, will tear their flesh."} icon = 'icons/obj/weapons/sword.dmi' icon_state = "cultblade" inhand_icon_state = "cultblade" + worn_icon = 'icons/mob/clothing/back.dmi' worn_icon_state = "cultblade" icon_angle = -45 lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' @@ -143,7 +145,7 @@ Striking a noncultist, however, will tear their flesh."} var/mob/living/carbon/human/miscreant = user miscreant.apply_damage(rand(force/2, force), BRUTE, pick(GLOB.arm_zones)) else - user.adjustBruteLoss(rand(force/2,force)) + user.adjust_brute_loss(rand(force/2,force)) return ..() @@ -222,7 +224,7 @@ Striking a noncultist, however, will tear their flesh."} // Moon PATH_MOON = list( WIELDER_SPELLS = list(/datum/action/cooldown/spell/pointed/projectile/moon_parade), - SWORD_SPELLS = list(/datum/action/cooldown/spell/pointed/moon_smile), + SWORD_SPELLS = list(/datum/action/cooldown/spell/pointed/mind_gate), SWORD_PREFIX = "shimmering", ), // Starter @@ -412,7 +414,7 @@ Striking a noncultist, however, will tear their flesh."} fling_act.Grant(trapped_entity) // Set the sword's path for spell selection. - heretic_path = heretic_holder.heretic_path + heretic_path = heretic_holder.heretic_path.route || PATH_START // Copy the objectives to keep for roundend, remove the datum as neither us nor the heretic need it anymore var/list/copied_objectives = heretic_holder.objectives.Copy() @@ -686,7 +688,7 @@ Striking a noncultist, however, will tear their flesh."} . = ..() if(!IS_CULTIST(user) && isliving(user)) var/mob/living/living_user = user - living_user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) + living_user.adjust_organ_loss(ORGAN_SLOT_BRAIN, 5) . += span_danger("It hurts just to look at it. Better keep away.") else . += span_cult("It can be used to create a gateway to Nar'Sie's domain, which will summon weak, sentient constructs over time.") @@ -1069,7 +1071,7 @@ Striking a noncultist, however, will tear their flesh."} var/mob/living/L = target if(L.density) L.Paralyze(20) - L.adjustBruteLoss(45) + L.adjust_brute_loss(45) playsound(L, 'sound/effects/hallucinations/wail.ogg', 50, TRUE) L.emote("scream") user.Beam(temp_target, icon_state="blood_beam", time = 7, beam_type = /obj/effect/ebeam/blood) @@ -1098,46 +1100,45 @@ Striking a noncultist, however, will tear their flesh."} var/illusions = 2 /obj/item/shield/mirror/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) - if(IS_CULTIST(owner)) - if(attack_type == PROJECTILE_ATTACK) - if(damage_type == BRUTE || damage_type == BURN) - if(damage >= 30) - var/turf/T = get_turf(owner) - T.visible_message(span_warning("The sheer force from [hitby] shatters the mirror shield!")) - new /obj/effect/temp_visual/cult/sparks(T) - playsound(T, 'sound/effects/glass/glassbr3.ogg', 100) - owner.Paralyze(25) - qdel(src) - return FALSE - var/obj/projectile/projectile = hitby - if(projectile.reflectable) - return FALSE //To avoid reflection chance double-dipping with block chance - . = ..() - if(.) - if(illusions > 0) - illusions-- - addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/shield/mirror, readd)), 45 SECONDS) - if(prob(60)) - var/mob/living/simple_animal/hostile/illusion/M = new(owner.loc) - M.faction = list(FACTION_CULT) - M.Copy_Parent(owner, 70, 10, 5) - M.move_to_delay = owner.cached_multiplicative_slowdown - else - var/mob/living/simple_animal/hostile/illusion/escape/E = new(owner.loc) - E.Copy_Parent(owner, 70, 10) - E.GiveTarget(owner) - E.Goto(owner, owner.cached_multiplicative_slowdown, E.minimum_distance) - return TRUE - else + if(!IS_CULTIST(owner)) if(prob(50)) - var/mob/living/simple_animal/hostile/illusion/H = new(owner.loc) - H.Copy_Parent(owner, 100, 20, 5) - H.faction = list(FACTION_CULT) - H.GiveTarget(owner) - H.move_to_delay = owner.cached_multiplicative_slowdown - to_chat(owner, span_danger("[src] betrays you!")) + var/mob/living/basic/illusion/bizarro = new(owner.loc) + bizarro.full_setup(owner, target_mob = owner, faction = list(FACTION_CULT), life = 10 SECONDS, damage = 20, replicate = 5) + + to_chat(owner, span_bolddanger("You're betrayed by \"yourself\"!")) + return FALSE + + if(attack_type == PROJECTILE_ATTACK) + if(damage_type == BRUTE || damage_type == BURN) + if(damage >= 30) + var/turf/T = get_turf(owner) + T.visible_message(span_warning("The sheer force from [hitby] shatters the mirror shield!")) + new /obj/effect/temp_visual/cult/sparks(T) + playsound(T, 'sound/effects/glass/glassbr3.ogg', 100) + owner.Paralyze(25) + qdel(src) + return FALSE + var/obj/projectile/projectile = hitby + if(projectile.reflectable) + return FALSE //To avoid reflection chance double-dipping with block chance + + . = ..() + if(!.) return FALSE + if(illusions > 0) + illusions-- + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/shield/mirror, readd)), 45 SECONDS) + if(prob(60)) // make a potentially slower, but replicable apparation + var/mob/living/basic/illusion/apparation = new(owner.loc) + apparation.full_setup(owner, target_mob = null, faction = list(FACTION_CULT), life = 7 SECONDS, damage = 10, replicate = 5) + apparation.cached_multiplicative_slowdown = owner.cached_multiplicative_slowdown + else // normal apparation designed to escape + var/mob/living/basic/illusion/escape/decoy = new(owner.loc) + decoy.full_setup(owner, target_mob = owner, faction = list(FACTION_CULT), life = 7 SECONDS, damage = 10) // Damage for retaliation + return TRUE + + /obj/item/shield/mirror/proc/readd() illusions++ if(illusions == initial(illusions) && isliving(loc)) diff --git a/code/modules/antagonists/cult/cult_structure_altar.dm b/code/modules/antagonists/cult/cult_structure_altar.dm index 237d695996f5..a6b646587c74 100644 --- a/code/modules/antagonists/cult/cult_structure_altar.dm +++ b/code/modules/antagonists/cult/cult_structure_altar.dm @@ -12,6 +12,7 @@ icon_state = "talismanaltar" break_message = span_warning("The altar shatters, leaving only the wailing of the damned!") mansus_conversion_path = /obj/effect/heretic_rune + custom_materials = list(/datum/material/runedmetal = SHEET_MATERIAL_AMOUNT * 3) /obj/structure/destructible/cult/item_dispenser/altar/setup_options() var/static/list/altar_items = list( diff --git a/code/modules/antagonists/cult/cult_structure_archives.dm b/code/modules/antagonists/cult/cult_structure_archives.dm index 29c00cf0168f..9445d200219b 100644 --- a/code/modules/antagonists/cult/cult_structure_archives.dm +++ b/code/modules/antagonists/cult/cult_structure_archives.dm @@ -14,6 +14,7 @@ light_color = LIGHT_COLOR_FIRE break_message = span_warning("The books and tomes of the archives burn into ash as the desk shatters!") mansus_conversion_path = /obj/item/codex_cicatrix + custom_materials = list(/datum/material/runedmetal = SHEET_MATERIAL_AMOUNT * 3) /obj/structure/destructible/cult/item_dispenser/archives/setup_options() var/static/list/archive_items = list( diff --git a/code/modules/antagonists/cult/cult_structure_forge.dm b/code/modules/antagonists/cult/cult_structure_forge.dm index 689cdd2edcb9..3fe9a884369d 100644 --- a/code/modules/antagonists/cult/cult_structure_forge.dm +++ b/code/modules/antagonists/cult/cult_structure_forge.dm @@ -14,6 +14,7 @@ light_color = LIGHT_COLOR_LAVA break_message = span_warning("The forge breaks apart into shards with a howling scream!") mansus_conversion_path = /obj/structure/destructible/eldritch_crucible + custom_materials = list(/datum/material/runedmetal = SHEET_MATERIAL_AMOUNT * 3) /obj/structure/destructible/cult/item_dispenser/forge/setup_options() var/static/list/forge_items = list( diff --git a/code/modules/antagonists/cult/cult_structure_pylon.dm b/code/modules/antagonists/cult/cult_structure_pylon.dm index 54151f1171e1..506e8dd0ef96 100644 --- a/code/modules/antagonists/cult/cult_structure_pylon.dm +++ b/code/modules/antagonists/cult/cult_structure_pylon.dm @@ -8,6 +8,7 @@ break_sound = 'sound/effects/glass/glassbr2.ogg' break_message = span_warning("The blood-red crystal falls to the floor and shatters!") /// Length of the cooldown in between tile corruptions. Doubled if no turfs are found. + custom_materials = list(/datum/material/runedmetal = SHEET_MATERIAL_AMOUNT * 4) var/corruption_cooldown_duration = 5 SECONDS /// The cooldown for corruptions. COOLDOWN_DECLARE(corruption_cooldown) diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 697b1dc88c96..1db1297c884d 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -19,12 +19,11 @@ cult_team = null return ..() -/obj/structure/destructible/cult/Initialize(mapload) +/obj/structure/destructible/cult/on_craft_completion(list/components, datum/crafting_recipe/current_recipe, atom/crafter) . = ..() - RegisterSignal(src, COMSIG_ATOM_CONSTRUCTED, PROC_REF(on_constructed)) - -/obj/structure/destructible/cult/proc/on_constructed(datum/source, mob/builder) - SIGNAL_HANDLER + if(!ismob(crafter)) + return + var/mob/living/builder = crafter var/datum/antagonist/cult/cultist = builder.mind?.has_antag_datum(/datum/antagonist/cult, TRUE) cult_team = cultist?.get_team() diff --git a/code/modules/antagonists/cult/datums/cult_team.dm b/code/modules/antagonists/cult/datums/cult_team.dm index 130683a9046f..7cbd9fe6284a 100644 --- a/code/modules/antagonists/cult/datums/cult_team.dm +++ b/code/modules/antagonists/cult/datums/cult_team.dm @@ -58,6 +58,7 @@ SEND_SOUND(mind.current, 'sound/music/antag/bloodcult/bloodcult_eyes.ogg') to_chat(mind.current, span_cult_large(span_warning("The veil weakens as your cult grows, your eyes begin to glow..."))) mind.current.AddElement(/datum/element/cult_eyes) + ADD_TRAIT(mind.current, TRAIT_DESENSITIZED, CULT_TRAIT) cult_risen = TRUE log_game("The blood cult has risen with [cultplayers] players.") diff --git a/code/modules/antagonists/cult/datums/cultist.dm b/code/modules/antagonists/cult/datums/cultist.dm index ba6678e53ffc..55f0f61d97ab 100644 --- a/code/modules/antagonists/cult/datums/cultist.dm +++ b/code/modules/antagonists/cult/datums/cultist.dm @@ -65,6 +65,7 @@ if(cult_team.cult_risen) current.AddElement(/datum/element/cult_eyes, initial_delay = 0 SECONDS) + ADD_TRAIT(current, TRAIT_DESENSITIZED, CULT_TRAIT) if(cult_team.cult_ascendent) current.AddElement(/datum/element/cult_halo, initial_delay = 0 SECONDS) @@ -87,7 +88,8 @@ if (HAS_TRAIT(current, TRAIT_CULT_HALO)) current.RemoveElement(/datum/element/cult_halo) - REMOVE_TRAIT(owner.current, TRAIT_HEALS_FROM_CULT_PYLONS, CULT_TRAIT) + REMOVE_TRAIT(current, TRAIT_DESENSITIZED, CULT_TRAIT) + REMOVE_TRAIT(current, TRAIT_HEALS_FROM_CULT_PYLONS, CULT_TRAIT) /datum/antagonist/cult/on_mindshield(mob/implanter) if(!silent) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 799e54f2c488..fbadeba3518d 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -290,11 +290,11 @@ structure_check() searches for nearby cultist structures required for the invoca to_chat(invoker, span_warning("Something is shielding [convertee]'s mind!")) return FALSE - var/brutedamage = convertee.getBruteLoss() - var/burndamage = convertee.getFireLoss() + var/brutedamage = convertee.get_brute_loss() + var/burndamage = convertee.get_fire_loss() if(brutedamage || burndamage) - convertee.adjustBruteLoss(-(brutedamage * 0.75)) - convertee.adjustFireLoss(-(burndamage * 0.75)) + convertee.adjust_brute_loss(-(brutedamage * 0.75)) + convertee.adjust_fire_loss(-(burndamage * 0.75)) convertee.visible_message( span_warning("[convertee] writhes in pain [(brutedamage || burndamage) \ @@ -930,7 +930,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) color = "#FC9B54" set_light(6, 1, color) for(var/mob/living/target in viewers(T)) - if(!IS_CULTIST(target) && target.blood_volume) + if(!IS_CULTIST(target) && CAN_HAVE_BLOOD(target)) if(target.can_block_magic(charge_cost = 0)) continue to_chat(target, span_cult_large("Your blood boils in your veins!")) @@ -955,7 +955,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) /obj/effect/rune/blood_boil/proc/do_area_burn(turf/T, multiplier) set_light(6, 1, color) for(var/mob/living/target in viewers(T)) - if(!IS_CULTIST(target) && target.blood_volume) + if(!IS_CULTIST(target) && target.get_blood_volume()) if(target.can_block_magic(charge_cost = 0)) continue target.take_overall_damage(tick_damage*multiplier, tick_damage*multiplier) @@ -1025,7 +1025,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) 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) - 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 + new_human.add_traits(list(TRAIT_NOBREATH, TRAIT_SPAWNED_MOB, TRAIT_PERMANENTLY_MORTAL), INNATE_TRAIT) // permanently mortal can be removed once this is a bespoke kind of mob ghosts++ playsound(src, 'sound/effects/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.")) @@ -1148,17 +1148,16 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) for(var/mob/living/target in range(src, 3)) target.Paralyze(30) - empulse(T, 0.42*(intensity), 1) + empulse(T, 0.42*(intensity), 1, emp_source = src) var/list/images = list() - var/datum/atom_hud/sec_hud = GLOB.huds[DATA_HUD_SECURITY_ADVANCED] for(var/mob/living/M in GLOB.alive_mob_list) if(!is_valid_z_level(T, get_turf(M))) continue if(ishuman(M)) if(!IS_CULTIST(M)) - sec_hud.hide_from(M) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(hudFix), M), duration) + ADD_TRAIT(M, TRAIT_BLOCK_SECHUD, CULT_TRAIT) + addtimer(TRAIT_CALLBACK_REMOVE(M, TRAIT_BLOCK_SECHUD, CULT_TRAIT), duration) var/image/A = image('icons/mob/nonhuman-player/cult.dmi',M,"cultist", ABOVE_MOB_LAYER) A.override = 1 add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/noncult, "human_apoc", A, NONE) @@ -1235,13 +1234,3 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) if(I.icon_state != "bloodsparkles") I.override = TRUE sleep(19 SECONDS) - - - -/proc/hudFix(mob/living/carbon/human/target) - if(!target || !target.client) - return - var/obj/O = target.get_item_by_slot(ITEM_SLOT_EYES) - if(istype(O, /obj/item/clothing/glasses/hud/security)) - var/datum/atom_hud/sec_hud = GLOB.huds[DATA_HUD_SECURITY_ADVANCED] - sec_hud.show_to(target) diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index 73544961dec4..c0bf50819e01 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -36,6 +36,14 @@ equipERT() . = ..() +/datum/antagonist/ert/apply_innate_effects(mob/living/mob_override) + var/mob/living/carbon/human/officer = mob_override || owner.current + ADD_TRAIT(officer, TRAIT_DESENSITIZED, REF(src)) + +/datum/antagonist/ert/remove_innate_effects(mob/living/mob_override) + var/mob/living/carbon/human/officer = mob_override || owner.current + REMOVE_TRAIT(officer, TRAIT_DESENSITIZED, REF(src)) + /datum/antagonist/ert/get_team() return ert_team diff --git a/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm b/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm index 65e22b1ed6c2..854ac2d43a48 100644 --- a/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm +++ b/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm @@ -85,8 +85,8 @@ if(istype(equip_to.w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/uniform = equip_to.w_uniform - uniform.sensor_mode = NO_SENSORS - uniform.has_sensor = NO_SENSORS + uniform.set_sensor_mode(SENSOR_OFF) + uniform.set_has_sensor(NO_SENSORS) /datum/outfit/russian_hunter/leader name = "Russian Hunter Leader" diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index caeeb61071bc..c6858a7ec15a 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -31,47 +31,65 @@ stinger_sound = 'sound/music/antag/heretic/heretic_gain.ogg' antag_flags = parent_type::antag_flags | ANTAG_OBSERVER_VISIBLE_PANEL + /// Contains multiple separate heretic shops so you can choose between multiple when buying. + var/list/heretic_shops = list( + HERETIC_KNOWLEDGE_START = list(), + HERETIC_KNOWLEDGE_TREE = list(), + HERETIC_KNOWLEDGE_SHOP = list(), + HERETIC_KNOWLEDGE_DRAFT = list() + ) + /// A static typecache of all tools we can scribe with. + var/static/list/scribing_tools = typecacheof(list(/obj/item/pen, /obj/item/toy/crayon)) + /// A blacklist of turfs we cannot scribe on. + var/static/list/blacklisted_rune_turfs = typecacheof(list(/turf/open/space, /turf/open/openspace, /turf/open/lava, /turf/open/chasm)) + /// A static list of all paths we can take and related info for the UI + var/static/list/path_info = list() + /// Assoc list of [typepath] = [knowledge instance]. A list of all knowledge this heretic's reserached. + var/list/researched_knowledge = list() + /// 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() + /// List that keeps track of which items have been gifted to the heretic after a cultist was sacrificed. Used to alter drop chances to reduce dupes. + var/list/unlocked_heretic_items = list( + /obj/item/melee/sickly_blade/cursed = 0, + /obj/item/clothing/neck/heretic_focus/crimson_medallion = 0, + /mob/living/basic/construct/harvester/heretic = 0, + ) + /// Whether or not the heretic can make unlimited blades, but unable to blade break to teleport + var/unlimited_blades = FALSE + /// Whether we are allowed to ascend + var/feast_of_owls = FALSE /// Whether we give this antagonist objectives on gain. var/give_objectives = TRUE /// Whether we've ascended! (Completed one of the final rituals) var/ascended = FALSE - /// The path our heretic has chosen. Mostly used for flavor. - var/heretic_path = PATH_START + /// Whether we're drawing a rune or not + var/drawing_rune = FALSE + /// The path our heretic has chosen. + var/datum/heretic_knowledge_tree_column/heretic_path + /// Reference to the overlay heretics get when they get strong enough + var/static/mutable_appearance/eldritch_overlay = mutable_appearance('icons/mob/effects/heretic_aura.dmi', "heretic_aura") /// A sum of how many knowledge points this heretic CURRENTLY has. Used to research. var/knowledge_points = 1 /// 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. - var/list/researched_knowledge = list() + /// Tracks how many knowledge points the heretic has aqcuired. Once you get enough points you lose the ability to blade break + var/knowledge_gained = 0 /// The organ slot we place our Living Heart in. var/living_heart_organ_slot = ORGAN_SLOT_HEART /// A list of TOTAL how many sacrifices completed. (Includes high value sacrifices) var/total_sacrifices = 0 /// A list of TOTAL how many high value sacrifices completed. (Heads of staff) 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. - var/static/list/scribing_tools = typecacheof(list(/obj/item/pen, /obj/item/toy/crayon)) - /// A blacklist of turfs we cannot scribe on. - var/static/list/blacklisted_rune_turfs = typecacheof(list(/turf/open/space, /turf/open/openspace, /turf/open/lava, /turf/open/chasm)) - /// Controls what types of turf we can spread rust to, increases as we unlock more powerful rust abilites - var/rust_strength = 0 - /// Wether we are allowed to ascend - var/feast_of_owls = FALSE - - /// List that keeps track of which items have been gifted to the heretic after a cultist was sacrificed. Used to alter drop chances to reduce dupes. - var/list/unlocked_heretic_items = list( - /obj/item/melee/sickly_blade/cursed = 0, - /obj/item/clothing/neck/heretic_focus/crimson_medallion = 0, - /mob/living/basic/construct/harvester/heretic = 0, - ) + /// Controls what types of turf we can spread rust to + var/rust_strength = 1 /// Simpler version of above used to limit amount of loot that can be hoarded var/rewards_given = 0 + /// Our heretic passive level. Tracked here in case of body moving shenanigans + var/passive_level = 1 + /// How many points are needed to gain a visible heretic aura + var/points_to_aura = 8 /datum/antagonist/heretic/Destroy() LAZYNULL(sac_targets) @@ -107,13 +125,6 @@ icon_path = result_mob.icon icon_state = result_mob.icon_state - //if the knowledge is an eldritch mark, use the mark sprite - else if(ispath(knowledge,/datum/heretic_knowledge/mark)) - var/datum/heretic_knowledge/mark/mark_knowledge = knowledge - var/datum/status_effect/eldritch/mark_effect = mark_knowledge.mark_type - icon_path = mark_effect.effect_icon - icon_state = mark_effect.effect_icon_state - //if the knowledge is an ascension, use the achievement sprite else if(ispath(knowledge,/datum/heretic_knowledge/ultimate)) var/datum/heretic_knowledge/ultimate/ascension_knowledge = knowledge @@ -130,70 +141,127 @@ result_parameters["moving"] = icon_moving return result_parameters -/datum/antagonist/heretic/proc/get_knowledge_data(datum/heretic_knowledge/knowledge, done) - +/datum/antagonist/heretic/proc/get_knowledge_data(datum/heretic_knowledge/knowledge, list/source_list, done = FALSE, category = HERETIC_KNOWLEDGE_TREE) + if(!length(source_list)) + CRASH("get_knowledge_data called without source_list! (Got: [source_list || "empty list"])") var/list/knowledge_data = list() knowledge_data["path"] = knowledge knowledge_data["icon_params"] = get_icon_of_knowledge(knowledge) knowledge_data["name"] = initial(knowledge.name) knowledge_data["gainFlavor"] = initial(knowledge.gain_text) - knowledge_data["cost"] = initial(knowledge.cost) - knowledge_data["disabled"] = (!done) && (initial(knowledge.cost) > knowledge_points) - knowledge_data["bgr"] = GLOB.heretic_research_tree[knowledge][HKT_UI_BGR] - knowledge_data["finished"] = done - knowledge_data["ascension"] = ispath(knowledge,/datum/heretic_knowledge/ultimate) + knowledge_data["cost"] = source_list[knowledge][HKT_COST] + knowledge_data["depth"] = source_list[knowledge][HKT_DEPTH] + knowledge_data["bgr"] = source_list[knowledge][HKT_UI_BGR] + knowledge_data[HKT_CATEGORY] = category + knowledge_data["ascension"] = ispath(knowledge, /datum/heretic_knowledge/ultimate) + knowledge_data["done"] = done //description of a knowledge might change, make sure we are not shown the initial() value in that case - if(done) - var/datum/heretic_knowledge/knowledge_instance = researched_knowledge[knowledge] + var/list/knowledge_info = researched_knowledge[knowledge] + if(islist(knowledge_info)) + var/datum/heretic_knowledge/knowledge_instance = knowledge_info[HKT_INSTANCE] + knowledge_data["desc"] = knowledge_instance.desc else knowledge_data["desc"] = initial(knowledge.desc) - return knowledge_data + +/datum/antagonist/heretic/ui_interact(mob/user, datum/tgui/ui) + . = ..() + ui?.set_autoupdate(FALSE) + /datum/antagonist/heretic/ui_data(mob/user) - var/list/data = list() + var/list/data = list("charges" = knowledge_points) + + data["objectives"] = get_objectives() + data["can_change_objective"] = can_assign_self_objectives + + data["paths"] = path_info + data["passive_level"] = passive_level - data["charges"] = knowledge_points data["total_sacrifices"] = total_sacrifices data["ascended"] = ascended + data["points_to_aura"] = points_to_aura - var/list/tiers = list() + var/list/tree_data = list() + var/list/shop_knowledge = list() // This should be cached in some way, but the fact that final knowledge // has to update its disabled state based on whether all objectives are complete, // makes this very difficult. I'll figure it out one day maybe - for(var/datum/heretic_knowledge/knowledge as anything in researched_knowledge) - var/list/knowledge_data = get_knowledge_data(knowledge,TRUE) - - while(GLOB.heretic_research_tree[knowledge][HKT_DEPTH] > tiers.len) - tiers += list(list("nodes"=list())) + for(var/knowledge_path in researched_knowledge) + var/list/knowledge_info = researched_knowledge[knowledge_path] + /// draft knowledges are only shown post-research + var/list/knowledge_data = get_knowledge_data(knowledge_path, researched_knowledge, TRUE, knowledge_info[HKT_CATEGORY]) + var/category = knowledge_info[HKT_CATEGORY] + + var/depth = knowledge_info[HKT_DEPTH] + while(depth > length(tree_data)) + tree_data += list(list("nodes" = list())) + + if(category == HERETIC_KNOWLEDGE_SHOP || category == HERETIC_KNOWLEDGE_DRAFT) + shop_knowledge += list(knowledge_data) + continue - tiers[GLOB.heretic_research_tree[knowledge][HKT_DEPTH]]["nodes"] += list(knowledge_data) + tree_data[depth]["nodes"] += list(knowledge_data) - for(var/datum/heretic_knowledge/knowledge as anything in get_researchable_knowledge()) - var/list/knowledge_data = get_knowledge_data(knowledge,FALSE) + // TODO: sanity for purchasing categories as bypasses are likely rn + var/list/heretic_tree = heretic_shops[HERETIC_KNOWLEDGE_TREE] + var/list/researchable_knowledges = get_researchable_knowledge() + for(var/datum/heretic_knowledge/knowledge_path as anything in heretic_tree) + if(ispath(knowledge_path, /datum/heretic_knowledge/limited_amount/starting)) + continue + var/list/knowledge_info = heretic_tree[knowledge_path] + if(!(knowledge_info[HKT_ID] in researchable_knowledges)) + continue + var/list/knowledge_data = get_knowledge_data(knowledge_path, heretic_tree, FALSE) // Final knowledge can't be learned until all objectives are complete. - if(ispath(knowledge, /datum/heretic_knowledge/ultimate)) - knowledge_data["disabled"] ||= !can_ascend() + if(ispath(knowledge_path, /datum/heretic_knowledge/ultimate)) + var/ascension_check = can_ascend() + if(ascension_check != HERETIC_CAN_ASCEND) + knowledge_data["disabled"] = TRUE + knowledge_data["tooltip"] = ascension_check - while(GLOB.heretic_research_tree[knowledge][HKT_DEPTH] > tiers.len) - tiers += list(list("nodes"=list())) - tiers[GLOB.heretic_research_tree[knowledge][HKT_DEPTH]]["nodes"] += list(knowledge_data) + var/depth = knowledge_data[HKT_DEPTH] - data["knowledge_tiers"] = tiers + while(depth > length(tree_data)) + tree_data += list(list("nodes" = list())) - return data + tree_data[depth]["nodes"] += list(knowledge_data) -/datum/antagonist/heretic/ui_static_data(mob/user) - var/list/data = list() - data["objectives"] = get_objectives() - data["can_change_objective"] = can_assign_self_objectives + if(!heretic_path) + data["knowledge_tiers"] = tree_data + return data + + var/list/heretic_drafts = heretic_shops[HERETIC_KNOWLEDGE_DRAFT] + for(var/datum/heretic_knowledge/knowledge_path as anything in heretic_drafts) + var/list/knowledge_info = heretic_drafts[knowledge_path] + if(!(knowledge_info[HKT_ID] in researchable_knowledges)) + continue + var/list/knowledge_data = get_knowledge_data(knowledge_path, heretic_drafts, FALSE, HERETIC_KNOWLEDGE_DRAFT) + + var/depth = knowledge_data[HKT_DEPTH] + while(depth > length(tree_data)) + tree_data += list(list("nodes" = list())) + + tree_data[depth]["nodes"] += list(knowledge_data) + + data["knowledge_tiers"] = tree_data + var/list/shop = heretic_shops[HERETIC_KNOWLEDGE_SHOP] + for(var/knowledge_path in shop) + var/list/knowledge_info = shop[knowledge_path] + if(!(knowledge_info[HKT_ID] in researchable_knowledges)) + continue + + var/list/knowledge_data = get_knowledge_data(knowledge_path, shop, FALSE, HERETIC_KNOWLEDGE_SHOP) + shop_knowledge += list(knowledge_data) + + data["knowledge_shop"] = shop_knowledge return data @@ -207,21 +275,27 @@ var/datum/heretic_knowledge/researched_path = text2path(params["path"]) if(!ispath(researched_path, /datum/heretic_knowledge)) CRASH("Heretic attempted to learn non-heretic_knowledge path! (Got: [researched_path || "invalid path"])") - if(!(researched_path in get_researchable_knowledge())) + var/shop_category = params["category"] + if(!researchable_knowledge(researched_path, shop_category)) message_admins("Heretic [key_name(owner)] potentially attempted to href exploit to learn knowledge they can't learn!") CRASH("Heretic attempted to learn knowledge they can't learn! (Got: [researched_path])") - if(ispath(researched_path, /datum/heretic_knowledge/ultimate) && !can_ascend()) + if(ispath(researched_path, /datum/heretic_knowledge/ultimate) & can_ascend() != HERETIC_CAN_ASCEND) message_admins("Heretic [key_name(owner)] potentially attempted to href exploit to learn ascension knowledge without completing objectives!") CRASH("Heretic attempted to learn a final knowledge despite not being able to ascend!") - if(initial(researched_path.cost) > knowledge_points) - return TRUE - if(!gain_knowledge(researched_path)) - return TRUE + + if(!purchase_knowledge(researched_path, shop_category)) + return FALSE + update_data_for_all_viewers() log_heretic_knowledge("[key_name(owner)] gained knowledge: [initial(researched_path.name)]") - knowledge_points -= initial(researched_path.cost) return TRUE +/datum/antagonist/heretic/proc/researchable_knowledge(datum/heretic_knowledge/knowledge_path, shop_category = HERETIC_KNOWLEDGE_TREE) + var/list/knowledge_info = heretic_shops[shop_category][knowledge_path] + if(knowledge_info[HKT_ID] in get_researchable_knowledge()) + return TRUE + return FALSE + /datum/antagonist/heretic/submit_player_objective(retain_existing = FALSE, retain_escape = TRUE, force = FALSE) if (isnull(owner) || isnull(owner.current)) return @@ -243,7 +317,7 @@ /datum/antagonist/heretic/get_preview_icon() var/icon/icon = render_preview_outfit(preview_outfit) - // MOTHBLOCKS TOOD: Copied and pasted from cult, make this its own proc + // MOTHBLOCKS TODO: Copied and pasted from cult, make this its own proc // The sickly blade is 64x64, but getFlatIcon crunches to 32x32. // So I'm just going to add it in post, screw it. @@ -267,15 +341,20 @@ return ..() /datum/antagonist/heretic/on_gain() - if(!GLOB.heretic_research_tree) - GLOB.heretic_research_tree = generate_heretic_research_tree() + generate_heretic_starting_knowledge(heretic_shops[HERETIC_KNOWLEDGE_START]) + if(!length(path_info)) + for(var/datum/heretic_knowledge_tree_column/path as anything in subtypesof(/datum/heretic_knowledge_tree_column)) + path = new path() + path_info += list(path.get_ui_data(src, HERETIC_KNOWLEDGE_START)) + qdel(path) if(give_objectives) - forge_primary_objectives() + forge_primary_objectives(heretic_shops[HERETIC_KNOWLEDGE_TREE]) for(var/starting_knowledge in GLOB.heretic_start_knowledge) - gain_knowledge(starting_knowledge) + gain_knowledge(starting_knowledge, HERETIC_KNOWLEDGE_START, update = FALSE) + owner.current.AddElement(/datum/element/leeching_walk/minor) ADD_TRAIT(owner, TRAIT_SEE_BLESSED_TILES, REF(src)) addtimer(CALLBACK(src, PROC_REF(passive_influence_gain)), passive_gain_timer) // Gain +1 knowledge every 20 minutes. @@ -283,12 +362,15 @@ /datum/antagonist/heretic/on_removal() if(owner.current) - for(var/knowledge_index in researched_knowledge) - var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_index] + for(var/knowledge_path in researched_knowledge) + var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_path][HKT_INSTANCE] knowledge.on_lose(owner.current, src) + QDEL_NULL(researched_knowledge[knowledge_path][HKT_INSTANCE]) REMOVE_TRAIT(owner, TRAIT_SEE_BLESSED_TILES, REF(src)) - QDEL_LIST_ASSOC_VAL(researched_knowledge) + owner.current.RemoveElement(/datum/element/leeching_walk/minor) + QDEL_NULL(heretic_path) + owner.current.cut_overlay(eldritch_overlay) return ..() /datum/antagonist/heretic/apply_innate_effects(mob/living/mob_override) @@ -296,7 +378,7 @@ handle_clown_mutation(our_mob, "Ancient knowledge described to you has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") our_mob.faction |= FACTION_HERETIC - if (!issilicon(our_mob)) + if(!issilicon(our_mob)) GLOB.reality_smash_track.add_tracked_mind(owner) ADD_TRAIT(our_mob, TRAIT_MANSUS_TOUCHED, REF(src)) @@ -304,31 +386,89 @@ RegisterSignals(our_mob, list(COMSIG_MOB_BEFORE_SPELL_CAST, COMSIG_MOB_SPELL_ACTIVATED), PROC_REF(on_spell_cast)) RegisterSignal(our_mob, COMSIG_USER_ITEM_INTERACTION, PROC_REF(on_item_use)) RegisterSignal(our_mob, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(after_fully_healed)) + RegisterSignal(our_mob, COMSIG_ATOM_EXAMINE, PROC_REF(on_heretic_examine)) + + RegisterSignals( + our_mob, + list(SIGNAL_ADDTRAIT(TRAIT_HERETIC_AURA_HIDDEN), SIGNAL_REMOVETRAIT(TRAIT_HERETIC_AURA_HIDDEN)), + PROC_REF(update_heretic_aura) + ) /datum/antagonist/heretic/remove_innate_effects(mob/living/mob_override) var/mob/living/our_mob = mob_override || owner.current handle_clown_mutation(our_mob, removing = FALSE) our_mob.faction -= FACTION_HERETIC - if (owner in GLOB.reality_smash_track.tracked_heretics) + if(owner in GLOB.reality_smash_track.tracked_heretics) GLOB.reality_smash_track.remove_tracked_mind(owner) REMOVE_TRAIT(our_mob, TRAIT_MANSUS_TOUCHED, REF(src)) - UnregisterSignal(our_mob, list( - COMSIG_MOB_BEFORE_SPELL_CAST, - COMSIG_MOB_SPELL_ACTIVATED, - COMSIG_USER_ITEM_INTERACTION, - COMSIG_LIVING_POST_FULLY_HEAL, - COMSIG_LIVING_CULT_SACRIFICED, - )) + UnregisterSignal( + our_mob, + list( + COMSIG_MOB_BEFORE_SPELL_CAST, + COMSIG_MOB_SPELL_ACTIVATED, + COMSIG_USER_ITEM_INTERACTION, + COMSIG_LIVING_POST_FULLY_HEAL, + COMSIG_LIVING_CULT_SACRIFICED, + COMSIG_ATOM_EXAMINE, + SIGNAL_ADDTRAIT(TRAIT_HERETIC_AURA_HIDDEN), + SIGNAL_REMOVETRAIT(TRAIT_HERETIC_AURA_HIDDEN) + ) + ) + +/// Removes the ability to blade break, removes cloak of shadows and removes the cap on how many blades you can craft +/datum/antagonist/heretic/proc/disable_blade_breaking() + if(unlimited_blades) + return + var/mob/heretic_mob = owner.current + unlimited_blades = TRUE + to_chat(heretic_mob, span_boldwarning("You have gained a lot of power, the mansus will no longer allow you to break your blades, but you can now make as many as you wish.")) + heretic_mob.balloon_alert(heretic_mob, "blade breaking disabled!") + update_heretic_aura() + var/datum/action/cooldown/spell/shadow_cloak/cloak_spell = locate() in heretic_mob.actions + cloak_spell.Remove(heretic_mob) + +/// Adds an overlay to the heretic +/datum/antagonist/heretic/proc/update_heretic_aura() + SIGNAL_HANDLER + var/mob/heretic_mob = owner.current + heretic_mob.cut_overlay(eldritch_overlay) + + if(!should_show_aura()) + return FALSE + + heretic_mob.add_overlay(eldritch_overlay) + return TRUE + +/datum/antagonist/heretic/proc/should_show_aura() + if(!can_assign_self_objectives) + return FALSE // We spurned the offer of the Mansus :( + if(!unlimited_blades || HAS_TRAIT(owner.current, TRAIT_HERETIC_AURA_HIDDEN)) + return FALSE // No aura if we have the trait or is too early still + if(feast_of_owls) + return FALSE // No use in giving the aura to a heretic that can't ascend + if(heretic_path?.route == PATH_LOCK) + return FALSE // Lock heretics never get this aura + return TRUE + +/datum/antagonist/heretic/proc/on_heretic_examine(datum/source, mob/user, text) + SIGNAL_HANDLER + if(!should_show_aura()) + return + var/mob/heretic_mob = owner.current + var/potential_string = "[heretic_mob.p_They()] [heretic_mob.p_are()] crackling with a swirling green vortex of energy." + if(can_ascend() == HERETIC_CAN_ASCEND) + potential_string += " [heretic_mob.p_They()] [heretic_mob.p_are()] shedding [heretic_mob.p_their()] mortal shell!" + text += span_green(potential_string) /datum/antagonist/heretic/on_body_transfer(mob/living/old_body, mob/living/new_body) . = ..() if(old_body == new_body) // if they were using a temporary body return - for(var/knowledge_index in researched_knowledge) - var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_index] + for(var/knowledge_path in researched_knowledge) + var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_path][HKT_INSTANCE] knowledge.on_lose(old_body, src) knowledge.on_gain(new_body, src) @@ -415,7 +555,7 @@ /datum/antagonist/heretic/proc/draw_rune(mob/living/user, turf/target_turf, drawing_time = 20 SECONDS, additional_checks) drawing_rune = TRUE - var/rune_colour = GLOB.heretic_path_to_color[heretic_path] + var/rune_colour = GLOB.heretic_path_to_color[heretic_path?.route || PATH_START] target_turf.balloon_alert(user, "drawing rune...") var/obj/effect/temp_visual/drawing_heretic_rune/drawing_effect if (drawing_time < (10 SECONDS)) @@ -569,8 +709,8 @@ /** * Create our objectives for our heretic. */ -/datum/antagonist/heretic/proc/forge_primary_objectives() - var/datum/objective/heretic_research/research_objective = new() +/datum/antagonist/heretic/proc/forge_primary_objectives(heretic_research_tree) + var/datum/objective/heretic_research/research_objective = new(heretic_research_tree = heretic_research_tree) research_objective.owner = owner objectives += research_objective @@ -582,7 +722,7 @@ var/datum/objective/minor_sacrifice/sac_objective = new() sac_objective.owner = owner if(num_heads < 2) // They won't get major sacrifice, so bump up minor sacrifice a bit - sac_objective.target_amount += 2 + sac_objective.target_amount = 5 sac_objective.update_explanation_text() objectives += sac_objective @@ -630,11 +770,19 @@ * Used in callbacks for passive gain over time. */ /datum/antagonist/heretic/proc/passive_influence_gain() - knowledge_points++ - if(owner.current.stat <= SOFT_CRIT) + adjust_knowledge_points(1) + if(owner?.current?.stat <= SOFT_CRIT) to_chat(owner.current, "[span_hear("You hear a whisper...")] [span_hypnophrase(pick_list(HERETIC_INFLUENCE_FILE, "drain_message"))]") addtimer(CALLBACK(src, PROC_REF(passive_influence_gain)), passive_gain_timer) +/datum/antagonist/heretic/proc/adjust_knowledge_points(amount, update = TRUE) + knowledge_points = max(0, knowledge_points + amount) // Don't allow negative knowledge points + knowledge_gained += max(0, amount) + if(knowledge_gained > points_to_aura && !unlimited_blades) + disable_blade_breaking() + if(update) + update_data_for_all_viewers() + /datum/antagonist/heretic/roundend_report() var/list/parts = list() @@ -665,8 +813,9 @@ var/list/string_of_knowledge = list() - for(var/knowledge_index in researched_knowledge) - var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_index] + for(var/knowledge_path in researched_knowledge) + var/list/knowledge_info = researched_knowledge[knowledge_path] + var/datum/heretic_knowledge/knowledge = knowledge_info[HKT_INSTANCE] string_of_knowledge += knowledge.name parts += english_list(string_of_knowledge) @@ -758,7 +907,7 @@ if(!change_num || QDELETED(src)) return - knowledge_points += change_num + adjust_knowledge_points(change_num) /** * Admin proc for giving a heretic a focus. @@ -775,8 +924,8 @@ /datum/antagonist/heretic/antag_panel_data() var/list/string_of_knowledge = list() - for(var/knowledge_index in researched_knowledge) - var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_index] + for(var/knowledge_path in researched_knowledge) + var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_path][HKT_INSTANCE] if(istype(knowledge, /datum/heretic_knowledge/ultimate)) string_of_knowledge += span_bold(knowledge.name) else @@ -797,35 +946,72 @@ . += "None!
" . += "
" +/datum/antagonist/heretic/proc/purchase_knowledge(datum/heretic_knowledge/knowledge_type, category = HERETIC_KNOWLEDGE_TREE, update = TRUE) + var/list/shop_list = heretic_shops[category] + if(!shop_list) + stack_trace("Heretic attempted to learn knowledge from a non-existent category! (Got: [category])") + return FALSE + + var/list/knowledge_data = shop_list[knowledge_type] + if(!knowledge_data) + stack_trace("[type] purchase_knowledge was given a path that doesn't exist in the heretic [category] knowledge list! (Got: [knowledge_type])") + return FALSE + + var/cost = knowledge_data[HKT_COST] + if(cost > knowledge_points) + return FALSE + if(!gain_knowledge(knowledge_type, category, update)) + return FALSE + adjust_knowledge_points(-cost, FALSE) + return TRUE /** * Learns the passed [typepath] of knowledge, creating a knowledge datum * and adding it to our researched knowledge list. * * Returns TRUE if the knowledge was added successfully. FALSE otherwise. */ -/datum/antagonist/heretic/proc/gain_knowledge(datum/heretic_knowledge/knowledge_type) +/datum/antagonist/heretic/proc/gain_knowledge(datum/heretic_knowledge/knowledge_type, category = HERETIC_KNOWLEDGE_TREE, update = TRUE) + var/list/knowledge_list = heretic_shops[category] if(!ispath(knowledge_type)) stack_trace("[type] gain_knowledge was given an invalid path! (Got: [knowledge_type])") return FALSE + var/list/knowledge_data = knowledge_list[knowledge_type] + if(!islist(knowledge_data)) + knowledge_data = make_knowledge_entry(knowledge_type, category) + heretic_shops[category][knowledge_type] = knowledge_data if(get_knowledge(knowledge_type)) return FALSE var/datum/heretic_knowledge/initialized_knowledge = new knowledge_type() - researched_knowledge[knowledge_type] = initialized_knowledge + if(!initialized_knowledge.pre_research(owner.current, src)) + return FALSE + researched_knowledge[knowledge_type] = knowledge_data.Copy() + researched_knowledge[knowledge_type][HKT_INSTANCE] = initialized_knowledge + researched_knowledge[knowledge_type][HKT_CATEGORY] = category + + // case for letting you modify depth post-purchase + var/purchased_depth = knowledge_data[HKT_PURCHASED_DEPTH] + if(purchased_depth != 0 && isnum(purchased_depth)) + researched_knowledge[knowledge_type][HKT_DEPTH] = purchased_depth + + knowledge_list -= knowledge_type + initialized_knowledge.on_research(owner.current, src) - update_static_data(owner.current) + if(update) + update_data_for_all_viewers() + return TRUE /** - * Get a list of all knowledge TYPEPATHS that we can currently research. + * Get a list of all knowledge IDs that we can currently research. */ /datum/antagonist/heretic/proc/get_researchable_knowledge() var/list/researchable_knowledge = list() var/list/banned_knowledge = list() - for(var/knowledge_index in researched_knowledge) - var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_index] - researchable_knowledge |= GLOB.heretic_research_tree[knowledge_index][HKT_NEXT] - banned_knowledge |= GLOB.heretic_research_tree[knowledge_index][HKT_BAN] - banned_knowledge |= knowledge.type + for(var/knowledge_type in researched_knowledge) + var/list/knowledge_info = researched_knowledge[knowledge_type] + researchable_knowledge |= knowledge_info[HKT_NEXT] + banned_knowledge |= knowledge_info[HKT_BAN] + banned_knowledge |= knowledge_type researchable_knowledge -= banned_knowledge return researchable_knowledge @@ -833,7 +1019,10 @@ * Check if the wanted type-path is in the list of research knowledge. */ /datum/antagonist/heretic/proc/get_knowledge(wanted) - return researched_knowledge[wanted] + var/list/knowledge_data = researched_knowledge[wanted] + if(knowledge_data) + return knowledge_data[HKT_INSTANCE] + return null /// Makes our heretic more able to rust things. /// if side_path_only is set to TRUE, this function does nothing for rust heretics. @@ -852,8 +1041,8 @@ /datum/antagonist/heretic/proc/get_rituals() var/list/rituals = list() - for(var/knowledge_index in researched_knowledge) - var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_index] + for(var/knowledge_path in researched_knowledge) + var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_path][HKT_INSTANCE] if(!knowledge.can_be_invoked(src)) continue rituals[knowledge.name] = knowledge @@ -866,14 +1055,19 @@ * 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 :( if(feast_of_owls) - return FALSE // We sold our ambition for immediate power :/ + return "The owls have taken your right of ascension (denied ascension)." // We sold our ambition for immediate power :/ + if(!can_assign_self_objectives) + return "The mansus has spurned you (denied ascension)." for(var/datum/objective/must_be_done as anything in objectives) if(!must_be_done.check_completion()) - return FALSE - return TRUE + return "Must complete all objectives before ascending." + var/config_time = CONFIG_GET(number/minimum_ascension_time) MINUTES + + var/time_passed = STATION_TIME_PASSED() + if(config_time >= time_passed) + return "Too early, must wait [DisplayTimeText(config_time - time_passed)] before ascending." + return HERETIC_CAN_ASCEND /** * Helper to determine if a Heretic @@ -901,7 +1095,7 @@ /datum/objective/minor_sacrifice/New(text) . = ..() - target_amount = rand(3, 4) + target_amount = 4 update_explanation_text() /datum/objective/minor_sacrifice/update_explanation_text() @@ -932,7 +1126,7 @@ /// The length of a main path. Calculated once in New(). var/static/main_path_length = 0 -/datum/objective/heretic_research/New(text) +/datum/objective/heretic_research/New(text, heretic_research_tree) . = ..() if(!main_path_length) @@ -940,7 +1134,8 @@ // (All the main paths are (should be) the same length, so it doesn't matter.) var/rust_paths_found = 0 for(var/datum/heretic_knowledge/knowledge as anything in subtypesof(/datum/heretic_knowledge)) - if(GLOB.heretic_research_tree[knowledge][HKT_ROUTE] == PATH_RUST) + var/list/knowledge_data = heretic_research_tree[knowledge] + if(knowledge_data && knowledge_data[HKT_ROUTE] == PATH_RUST) rust_paths_found++ main_path_length = rust_paths_found @@ -976,6 +1171,6 @@ /datum/outfit/heretic name = "Heretic (Preview only)" - suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch - head = /obj/item/clothing/head/hooded/cult_hoodie/eldritch + suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch/rust + head = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/rust r_hand = /obj/item/melee/touch_attack/mansus_fist diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index fe2805202fcf..4b2b82adc56a 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -32,6 +32,8 @@ var/priority = 0 ///If this is considered starting knowledge, TRUE if yes var/is_starting_knowledge = FALSE + /// If the spell is final knowledge, disables blade breaking and removes the cap on how many blades we can make + var/is_final_knowledge = FALSE /// In case we want to override the default UI icon getter and plug in our own icon instead. /// if research_tree_icon_path is not null, research_tree_icon_state must also be specified or things may break var/research_tree_icon_path @@ -40,6 +42,23 @@ var/research_tree_icon_dir = SOUTH ///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 + /// This is used for the drafting system. By default is 0 (Meaning it won't show up in the draft), also makes it show up in the shop according to this tier + var/drafting_tier = 0 + /// decides if it's added to the shop, only, and not drafts + var/is_shop_only = FALSE + +/** + * Called before the knowledge is researched, + * use this for any checks that should happen before the knowledge is researched. + * Returns TRUE if the knowledge can be researched, FALSE otherwise. + */ +/datum/heretic_knowledge/proc/pre_research(mob/user, datum/antagonist/heretic/our_heretic) + // consider moving this check to a type instead + if(is_final_knowledge && !our_heretic.unlimited_blades) + var/choice = tgui_alert(user, "THIS WILL DISABLE BLADE BREAKING, Are you ready to research this? The blade cap will also be removed.", "Get Final Spell?", list("Yes", "No")) + if(choice != "Yes") + return FALSE + return TRUE /** Called when the knowledge is first researched. * This is only ever called once per heretic. @@ -54,6 +73,8 @@ if(gain_text) to_chat(user, span_warning("[gain_text]")) on_gain(user, our_heretic) + if(is_final_knowledge && !our_heretic.unlimited_blades) + our_heretic.disable_blade_breaking() /** * Called when the knowledge is applied to a mob. @@ -210,6 +231,11 @@ return ..() /datum/heretic_knowledge/limited_amount/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) + var/datum/antagonist/heretic/our_heretic = GET_HERETIC(user) + if(our_heretic && our_heretic.unlimited_blades) + if(length(result_atoms & typesof(/obj/item/melee/sickly_blade))) + return TRUE + for(var/datum/weakref/ref as anything in created_items) var/atom/real_thing = ref.resolve() if(QDELETED(real_thing)) @@ -230,6 +256,7 @@ /** * A knowledge subtype for limited_amount knowledge * used for base knowledge (the ones that make blades) + * Grants your path-relevant grasp upgrade, passive and grasp mark * * A heretic can only learn one /starting type knowledge, * and their ascension depends on whichever they chose. @@ -239,38 +266,55 @@ limit = 2 cost = 1 priority = MAX_KNOWLEDGE_PRIORITY - 5 + /// The status effect typepath we apply on people on mansus grasp. + var/datum/status_effect/eldritch/mark_type + /// The status effect of our passive + var/datum/status_effect/heretic_passive/eldritch_passive = /datum/status_effect/heretic_passive /datum/heretic_knowledge/limited_amount/starting/on_research(mob/user, datum/antagonist/heretic/our_heretic) . = ..() - our_heretic.heretic_path = GLOB.heretic_research_tree[type][HKT_ROUTE] - SSblackbox.record_feedback("tally", "heretic_path_taken", 1, our_heretic.heretic_path) + for(var/datum/heretic_knowledge_tree_column/column_path as anything in subtypesof(/datum/heretic_knowledge_tree_column)) + if(column_path::route != our_heretic.researched_knowledge[type][HKT_ROUTE]) + continue + our_heretic.heretic_path = new column_path() + if(!our_heretic.heretic_path) + // If we don't have a path, we can't continue. + to_chat(user, span_warning("Oh shit, something broke, no path found!")) + stack_trace("failed to find valid path [our_heretic.heretic_shops[HERETIC_KNOWLEDGE_TREE][type][HKT_ROUTE]] from researching [src]") + return + SSblackbox.record_feedback("tally", "heretic_path_taken", 1, our_heretic.heretic_path.route) + our_heretic.update_heretic_aura() + our_heretic.generate_heretic_research_tree() + determine_drafted_knowledge( + our_heretic.heretic_path.route, + our_heretic.heretic_shops[HERETIC_KNOWLEDGE_TREE], + our_heretic.heretic_shops[HERETIC_KNOWLEDGE_SHOP], + our_heretic.heretic_shops[HERETIC_KNOWLEDGE_DRAFT], + ) + SEND_SIGNAL(src, COMSIG_HERETIC_SHOP_SETUP) -/** - * A knowledge subtype for heretic knowledge - * that applies a mark on use. - * - * A heretic can only learn one /mark type knowledge. - */ -/datum/heretic_knowledge/mark - abstract_parent_type = /datum/heretic_knowledge/mark - cost = 2 - /// The status effect typepath we apply on people on mansus grasp. - var/datum/status_effect/eldritch/mark_type -/datum/heretic_knowledge/mark/on_gain(mob/user, datum/antagonist/heretic/our_heretic) +/datum/heretic_knowledge/limited_amount/starting/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignals(user, list(COMSIG_HERETIC_MANSUS_GRASP_ATTACK, COMSIG_LIONHUNTER_ON_HIT), PROC_REF(on_mansus_grasp)) RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(on_eldritch_blade)) + if(isliving(user)) + var/mob/living/living_user = user + living_user.apply_status_effect(eldritch_passive) -/datum/heretic_knowledge/mark/on_lose(mob/user, datum/antagonist/heretic/our_heretic) +/datum/heretic_knowledge/limited_amount/starting/on_lose(mob/user, datum/antagonist/heretic/our_heretic) UnregisterSignal(user, list(COMSIG_HERETIC_MANSUS_GRASP_ATTACK, COMSIG_HERETIC_BLADE_ATTACK)) + if(isliving(user)) + var/mob/living/living_user = user + living_user.remove_status_effect(eldritch_passive) /** * Signal proc for [COMSIG_HERETIC_MANSUS_GRASP_ATTACK]. * * Whenever we cast mansus grasp on someone, apply our mark. */ -/datum/heretic_knowledge/mark/proc/on_mansus_grasp(mob/living/source, mob/living/target) +/datum/heretic_knowledge/limited_amount/starting/proc/on_mansus_grasp(mob/living/source, mob/living/target) SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) create_mark(source, target) @@ -279,7 +323,7 @@ * * Whenever we attack someone with our blade, attempt to trigger any marks on them. */ -/datum/heretic_knowledge/mark/proc/on_eldritch_blade(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) +/datum/heretic_knowledge/limited_amount/starting/proc/on_eldritch_blade(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) SIGNAL_HANDLER if(!isliving(target)) @@ -293,7 +337,7 @@ * * Can be overriden to set or pass in additional vars of the status effect. */ -/datum/heretic_knowledge/mark/proc/create_mark(mob/living/source, mob/living/target) +/datum/heretic_knowledge/limited_amount/starting/proc/create_mark(mob/living/source, mob/living/target) if(target.stat == DEAD) return return target.apply_status_effect(mark_type) @@ -303,7 +347,7 @@ * * If there is no mark, returns FALSE. Returns TRUE if a mark was triggered. */ -/datum/heretic_knowledge/mark/proc/trigger_mark(mob/living/source, mob/living/target) +/datum/heretic_knowledge/limited_amount/starting/proc/trigger_mark(mob/living/source, mob/living/target) var/datum/status_effect/eldritch/mark = target.has_status_effect(/datum/status_effect/eldritch) if(!istype(mark)) return FALSE @@ -319,7 +363,7 @@ */ /datum/heretic_knowledge/blade_upgrade abstract_parent_type = /datum/heretic_knowledge/blade_upgrade - cost = 2 + cost = 1 /datum/heretic_knowledge/blade_upgrade/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(on_eldritch_blade)) @@ -416,7 +460,6 @@ var/datum/antagonist/heretic_monster/heretic_monster = summoned.mind.add_antag_datum(/datum/antagonist/heretic_monster) heretic_monster.set_owner(user.mind) - ADD_TRAIT(heretic_monster, TRAIT_HERETIC_SUMMON, INNATE_TRAIT) var/datum/objective/heretic_summon/summon_objective = locate() in user.mind.get_all_objectives() summon_objective?.num_summoned++ @@ -467,22 +510,18 @@ ) var/static/list/potential_uncommoner_items = list( - /obj/item/restraints/legcuffs/beartrap, /obj/item/restraints/handcuffs/cable/zipties, + /obj/item/melee/baton, /obj/item/circular_saw, /obj/item/scalpel, /obj/item/clothing/gloves/color/yellow, - /obj/item/melee/baton/security, /obj/item/clothing/glasses/sunglasses, ) required_atoms = list() - // 2 organs. Can be the same. - required_atoms[pick(potential_organs)] += 1 + // 1 Organ, 1 Easy, 1 Hard required_atoms[pick(potential_organs)] += 1 - // 2-3 random easy items. - required_atoms[pick(potential_easy_items)] += rand(2, 3) - // 1 uncommon item. + required_atoms[pick(potential_easy_items)] += 1 required_atoms[pick(potential_uncommoner_items)] += 1 /datum/heretic_knowledge/knowledge_ritual/on_research(mob/user, datum/antagonist/heretic/our_heretic) @@ -508,7 +547,7 @@ /datum/heretic_knowledge/knowledge_ritual/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) var/datum/antagonist/heretic/our_heretic = GET_HERETIC(user) - our_heretic.knowledge_points += KNOWLEDGE_RITUAL_POINTS + our_heretic.adjust_knowledge_points(KNOWLEDGE_RITUAL_POINTS) was_completed = TRUE to_chat(user, span_boldnotice("[name] completed!")) @@ -516,6 +555,7 @@ desc += " (Completed!)" log_heretic_knowledge("[key_name(user)] completed a [name] at [gameTimestamp()].") user.add_mob_memory(/datum/memory/heretic_knowledge_ritual) + SEND_SIGNAL(our_heretic, COMSIG_HERETIC_PASSIVE_UPGRADE_FINAL) return TRUE #undef KNOWLEDGE_RITUAL_POINTS @@ -540,8 +580,9 @@ /datum/heretic_knowledge/ultimate/on_research(mob/user, datum/antagonist/heretic/our_heretic) . = ..() var/total_points = 0 - for(var/datum/heretic_knowledge/knowledge as anything in flatten_list(our_heretic.researched_knowledge)) - total_points += knowledge.cost + for(var/datum/heretic_knowledge/knowledge as anything in our_heretic.researched_knowledge) + var/list/cost = our_heretic.researched_knowledge[knowledge][HKT_COST] + total_points += cost log_heretic_knowledge("[key_name(user)] gained knowledge of their final ritual at [gameTimestamp()]. \ They have [length(our_heretic.researched_knowledge)] knowledge nodes researched, totalling [total_points] points \ @@ -551,7 +592,7 @@ if(invoker.ascended) return FALSE - if(!invoker.can_ascend()) + if(invoker.can_ascend() != HERETIC_CAN_ASCEND) return FALSE return TRUE @@ -578,8 +619,11 @@ return (sacrifice.stat == DEAD) && !ismonkey(sacrifice) /datum/heretic_knowledge/ultimate/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) + var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) heretic_datum.ascended = TRUE + // In case we skipped ritual of knowledge + SEND_SIGNAL(heretic_datum, COMSIG_HERETIC_PASSIVE_UPGRADE_FINAL) // Show the cool red gradiant in our UI heretic_datum.update_static_data(user) @@ -589,7 +633,7 @@ human_user.physiology.brute_mod *= 0.5 human_user.physiology.burn_mod *= 0.5 - SSblackbox.record_feedback("tally", "heretic_ascended", 1, GLOB.heretic_research_tree[type][HKT_ROUTE]) + SSblackbox.record_feedback("tally", "heretic_ascended", 1, heretic_datum.heretic_path.route) log_heretic_knowledge("[key_name(user)] completed their final ritual at [gameTimestamp()].") notify_ghosts( "[user.real_name] has completed an ascension ritual!", @@ -603,9 +647,14 @@ color_override = "pink", ) + if(EMERGENCY_IDLE_OR_RECALLED) + SSshuttle.call_evac_shuttle("Critical reality rupture detected on supranatural casuality long-range scanners. Mass crew casualty and possible station destruction determined to be beyond acceptable probability. Priority evacuation shuttle dispatched.") + SSshuttle.emergency_no_recall = TRUE + if(!isnull(ascension_achievement)) user.client?.give_award(ascension_achievement, user) - heretic_datum.increase_rust_strength() + heretic_datum.rust_strength = 4 // Ascended heretics can rust whatever they want (below RUST_RESISTANCE_ABSOLUTE) + ADD_TRAIT(user, TRAIT_DESENSITIZED, type) return TRUE /datum/heretic_knowledge/ultimate/cleanup_atoms(list/selected_atoms) diff --git a/code/modules/antagonists/heretic/heretic_monsters.dm b/code/modules/antagonists/heretic/heretic_monsters.dm index 53ca3b88aac5..08215531b123 100644 --- a/code/modules/antagonists/heretic/heretic_monsters.dm +++ b/code/modules/antagonists/heretic/heretic_monsters.dm @@ -23,6 +23,16 @@ master = null return ..() +/datum/antagonist/heretic_monster/apply_innate_effects(mob/living/mob_override) + . = ..() + var/mob/living/target = mob_override || owner.current + ADD_TRAIT(target, TRAIT_HERETIC_SUMMON, REF(src)) + +/datum/antagonist/heretic_monster/remove_innate_effects(mob/living/mob_override) + var/mob/living/target = mob_override || owner.current + REMOVE_TRAIT(target, TRAIT_HERETIC_SUMMON, REF(src)) + return ..() + /* * Set our [master] var to a new mind. */ diff --git a/code/modules/antagonists/heretic/influences.dm b/code/modules/antagonists/heretic/influences.dm index 426ef7a2018c..c00fdf10f170 100644 --- a/code/modules/antagonists/heretic/influences.dm +++ b/code/modules/antagonists/heretic/influences.dm @@ -156,7 +156,7 @@ return . += span_userdanger("Your mind burns as you stare at the tear!") - user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 190) + user.adjust_organ_loss(ORGAN_SLOT_BRAIN, 10, 190) user.add_mood_event("gates_of_mansus", /datum/mood_event/gates_of_mansus) /obj/effect/heretic_influence @@ -170,6 +170,8 @@ var/being_drained = FALSE /// The icon state applied to the image created for this influence. var/real_icon_state = "reality_smash" + /// Proximity monitor that gives any nearby heretics x-ray vision + var/datum/proximity_monitor/influence_monitor/monitor /obj/effect/heretic_influence/Initialize(mapload) . = ..() @@ -182,12 +184,14 @@ AddElement(/datum/element/block_turf_fingerprints) AddComponent(/datum/component/redirect_attack_hand_from_turf, interact_check = CALLBACK(src, PROC_REF(verify_user_can_see))) AddComponent(/datum/component/fishing_spot, GLOB.preset_fish_sources[/datum/fish_source/dimensional_rift]) + monitor = new(src, 7) /obj/effect/heretic_influence/proc/verify_user_can_see(mob/user) return (user.mind in GLOB.reality_smash_track.tracked_heretics) /obj/effect/heretic_influence/Destroy() GLOB.reality_smash_track.smashes -= src + QDEL_NULL(monitor) return ..() /obj/effect/heretic_influence/attack_hand_secondary(mob/user, list/modifiers) @@ -224,21 +228,29 @@ * * If successful, the influence is drained and deleted. */ -/obj/effect/heretic_influence/proc/drain_influence(mob/living/user, knowledge_to_gain, drain_speed = 10 SECONDS) +/obj/effect/heretic_influence/proc/drain_influence(mob/living/user, knowledge_to_gain, drain_speed = HERETIC_RIFT_DEFAULT_DRAIN_SPEED) being_drained = TRUE loc.balloon_alert(user, "draining influence...") + // Only gives you the dripping eye effect if you have faster drain speed than default + var/mutable_appearance/draining_overlay = mutable_appearance('icons/mob/effects/heretic_aura.dmi', "heretic_eye_dripping") + if(drain_speed < HERETIC_RIFT_DEFAULT_DRAIN_SPEED) + draining_overlay.pixel_y = 16 + user.add_overlay(draining_overlay) + if(!do_after(user, drain_speed, src, hidden = TRUE)) being_drained = FALSE loc.balloon_alert(user, "interrupted!") + user.cut_overlay(draining_overlay) return // We don't need to set being_drained back since we delete after anyways loc.balloon_alert(user, "influence drained") + user.cut_overlay(draining_overlay) var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) - heretic_datum.knowledge_points += knowledge_to_gain + heretic_datum.adjust_knowledge_points(knowledge_to_gain) // Aaand now we delete it after_drain(user) @@ -269,3 +281,19 @@ /datum/atom_hud/alternate_appearance/basic/has_antagonist/heretic antag_datum_type = /datum/antagonist/heretic add_ghost_version = TRUE + +/datum/proximity_monitor/influence_monitor + /// Cooldown before we can give another heretic xray + COOLDOWN_DECLARE(xray_cooldown) + +/datum/proximity_monitor/influence_monitor/on_entered(atom/source, atom/movable/arrived, turf/old_loc) + . = ..() + if(!isliving(arrived)) + return + if(!COOLDOWN_FINISHED(src, xray_cooldown)) + return + var/mob/living/arrived_living = arrived + if(!IS_HERETIC(arrived_living)) + return + arrived_living.apply_status_effect(/datum/status_effect/temporary_xray/eldritch) + COOLDOWN_START(src, xray_cooldown, 3 MINUTES) diff --git a/code/modules/antagonists/heretic/items/corrupted_organs.dm b/code/modules/antagonists/heretic/items/corrupted_organs.dm index 5ffe055de80a..59cd6ccc0677 100644 --- a/code/modules/antagonists/heretic/items/corrupted_organs.dm +++ b/code/modules/antagonists/heretic/items/corrupted_organs.dm @@ -264,8 +264,7 @@ hearer.adjust_timed_status_effect(15 SECONDS, /datum/status_effect/speech/slurring/heretic) hearer.emote("scream") hearer.add_mood_event("gates_of_mansus", /datum/mood_event/gates_of_mansus) - var/obj/item/organ/ears/regret = hearer.get_organ_slot(ORGAN_SLOT_EARS) - regret?.adjustEarDamage(10,20) + hearer.sound_damage(10, 40 SECONDS) return "[owner.p_Their()] lungs emit [span_hypnophrase(breath_noise)]" /// It's full of worms diff --git a/code/modules/antagonists/heretic/items/eldritch_flask.dm b/code/modules/antagonists/heretic/items/eldritch_flask.dm index 101da3312415..02adc82d9fa1 100644 --- a/code/modules/antagonists/heretic/items/eldritch_flask.dm +++ b/code/modules/antagonists/heretic/items/eldritch_flask.dm @@ -26,12 +26,13 @@ return NONE if(!isliving(target)) return NONE + user.changeNext_move(CLICK_CD_MELEE) var/mob/living/living_target = target + if(living_target == user) + return ITEM_INTERACT_BLOCKING if(reagents.total_volume >= reagents.maximum_volume) to_chat(user, span_notice("[src] is full.")) return ITEM_INTERACT_BLOCKING - if(living_target == user) - return ITEM_INTERACT_BLOCKING if(living_target.can_block_magic(MAGIC_RESISTANCE_HOLY)) to_chat(user, span_warning("You are unable to draw any blood from [living_target]!")) COOLDOWN_START(src, drain_cooldown, 5 SECONDS) diff --git a/code/modules/antagonists/heretic/items/eldritch_painting.dm b/code/modules/antagonists/heretic/items/eldritch_painting.dm index f42670b4cc89..54bc953ee1d9 100644 --- a/code/modules/antagonists/heretic/items/eldritch_painting.dm +++ b/code/modules/antagonists/heretic/items/eldritch_painting.dm @@ -28,7 +28,7 @@ /// The range of the paintings effect var/range = 7 -/obj/structure/sign/painting/eldritch/Initialize(mapload, dir, building) +/obj/structure/sign/painting/eldritch/Initialize(mapload) . = ..() if(ispath(applied_status_effect)) var/static/list/connections = list(COMSIG_ATOM_ENTERED = PROC_REF(apply_status_effect)) @@ -44,7 +44,7 @@ return if(IS_HERETIC(viewer)) return - if(viewer.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND)) + if(viewer.can_block_magic(MAGIC_RESISTANCE_MOON)) return if(viewer.reagents.has_reagent(/datum/reagent/water/holywater)) return @@ -54,7 +54,7 @@ to_chat(viewer, span_hypnophrase("Your mind is overcome! The painting leaves a mark on your psyche.")) /obj/structure/sign/painting/eldritch/wirecutter_act(mob/living/user, obj/item/I) - if(!user.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND)) + if(!user.can_block_magic(MAGIC_RESISTANCE_MOON)) user.add_mood_event("ripped_eldritch_painting", /datum/mood_event/eldritch_painting) to_chat(user, span_hypnophrase("There's an itch in your brain. It's laughing at you...")) qdel(src) @@ -123,7 +123,7 @@ // Gives them some nutrition examiner.adjust_nutrition(50) to_chat(examiner, span_warning("You feel a searing pain in your stomach!")) - examiner.adjustOrganLoss(ORGAN_SLOT_STOMACH, 5) + examiner.adjust_organ_loss(ORGAN_SLOT_STOMACH, 5) to_chat(examiner, span_notice("You feel less hungry.")) to_chat(examiner, span_warning("You should stockpile raw meat and organs, before you get hungry again.")) examiner.add_mood_event("respite_eldritch_hunger", /datum/mood_event/eldritch_painting/desire_examine) @@ -177,7 +177,7 @@ /obj/item/food/grown/harebell, ) -/obj/structure/sign/painting/eldritch/vines/Initialize(mapload, dir, building) +/obj/structure/sign/painting/eldritch/vines/Initialize(mapload) . = ..() new /datum/spacevine_controller(get_turf(src), mutations, 0, 10) diff --git a/code/modules/antagonists/heretic/items/forbidden_book.dm b/code/modules/antagonists/heretic/items/forbidden_book.dm index d3c22d7b6873..35039d3e88f4 100644 --- a/code/modules/antagonists/heretic/items/forbidden_book.dm +++ b/code/modules/antagonists/heretic/items/forbidden_book.dm @@ -11,7 +11,7 @@ /// Helps determine the icon state of this item when it's used on self. var/book_open = FALSE /// How fast we can drain influences - var/drain_speed = 10 SECONDS + var/drain_speed = 5 SECONDS /// How fast we can draw runes var/draw_speed = 8 SECONDS @@ -79,7 +79,7 @@ desc = "A hideous, ragged book covered in separately-blinking eyes, all of them staring at you. You have no idea how to hold this thing, and to be honest you're not sure if you want to." base_icon_state = "book_morbus" icon_state = "book_morbus" - drain_speed = 7 SECONDS + drain_speed = 2.5 SECONDS draw_speed = 5 SECONDS /// List of mobs we've cursed with transmutation. When the codex is destroyed all those curses become undone var/list/transmuted_victims = list() @@ -94,7 +94,7 @@ return var/mob/living/carbon/human/human_user = user to_chat(human_user, span_userdanger("Your mind burns as you stare at the pages!")) - human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 190) + human_user.adjust_organ_loss(ORGAN_SLOT_BRAIN, 10, 190) human_user.add_mood_event("gates_of_mansus", /datum/mood_event/gates_of_mansus) /obj/item/codex_cicatrix/morbus/examine_more(mob/user) diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm index 027f3fc2cf7a..da3aaec74533 100644 --- a/code/modules/antagonists/heretic/items/heretic_armor.dm +++ b/code/modules/antagonists/heretic/items/heretic_armor.dm @@ -1,58 +1,1086 @@ +/*! + * Contains the eldritch robes for heretics, a suit of armor that they can make via a ritual + */ + // Eldritch armor. Looks cool, hood lets you cast heretic spells. +/obj/item/clothing/suit/hooded/cultrobes/eldritch + name = "ominous armor" + desc = "A ragged, dusty set of robes. Strange eyes line the inside." + icon_state = "armor" + inhand_icon_state = null + flags_inv = HIDESHOES | HIDEJUMPSUIT | HIDEBELT + body_parts_covered = CHEST | GROIN | LEGS | FEET | ARMS + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF + clothing_flags = THICKMATERIAL | PLASMAMAN_PREVENT_IGNITION + transparent_protection = HIDEGLOVES | HIDESUITSTORAGE | HIDEJUMPSUIT | HIDESHOES | HIDENECK + cold_protection = FULL_BODY + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + allowed = list(/obj/item/melee/sickly_blade, /obj/item/gun/ballistic/rifle/lionhunter) + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch + armor_type = /datum/armor/eldritch_armor + clothing_traits = list(TRAIT_HERETIC_AURA_HIDDEN) + /// Whether the hood is flipped up + var/hood_up = FALSE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/equipped(mob/user, slot, initial) + . = ..() + if(!(slot_flags & slot)) + return + if(!IS_HERETIC(user)) + robes_side_effect(user) + return + // Heretic equipped the robes? Grant them the effects + on_robes_gained(user) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/dropped(mob/living/user) + . = ..() + on_robes_lost(user) + +/// Adds effects to the user when they equip their robes +/obj/item/clothing/suit/hooded/cultrobes/eldritch/proc/on_robes_gained(mob/living/user) + return + +/// Removes any effects that our robes have, returns `TRUE` if the item dropped was not robes +/obj/item/clothing/suit/hooded/cultrobes/eldritch/proc/on_robes_lost(mob/living/user) + return + +/// Applies a punishment to the user when the robes are equipped +/obj/item/clothing/suit/hooded/cultrobes/eldritch/proc/robes_side_effect(mob/living/user) + SHOULD_NOT_SLEEP(TRUE) // sleep here would fuck over the timing + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/proc/is_equipped(mob/wearer) + return wearer.get_slot_by_item(src) & slot_flags + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/on_hood_up(obj/item/clothing/head/hooded/hood) + hood_up = TRUE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/on_hood_down(obj/item/clothing/head/hooded/hood) + hood_up = FALSE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/examine(mob/user) + . = ..() + if(!IS_HERETIC(user)) + return + if(hood_up) + return + + // Our hood gains the heretic_focus element. + . += span_notice("Allows you to cast heretic spells while the hood is up.") + /obj/item/clothing/head/hooded/cult_hoodie/eldritch name = "ominous hood" icon = 'icons/obj/clothing/head/helmet.dmi' worn_icon = 'icons/mob/clothing/head/helmet.dmi' - icon_state = "eldritch" + icon_state = "helmet" desc = "A torn, dust-caked hood. Strange eyes line the inside." - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF - flash_protect = FLASH_PROTECTION_WELDER + flags_inv = HIDEMASK | HIDEEARS | HIDEEYES | HIDEFACE | HIDEHAIR | HIDEFACIALHAIR | HIDESNOUT + flags_cover = HEADCOVERSEYES | PEPPERPROOF + flash_protect = FLASH_PROTECTION_WELDER_HYPER_SENSITIVE + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF + clothing_flags = THICKMATERIAL | PLASMAMAN_PREVENT_IGNITION | SNUG_FIT + armor_type = /datum/armor/eldritch_armor /obj/item/clothing/head/hooded/cult_hoodie/eldritch/Initialize(mapload) . = ..() AddElement(/datum/element/heretic_focus) -/obj/item/clothing/suit/hooded/cultrobes/eldritch - name = "ominous armor" - desc = "A ragged, dusty set of robes. Strange eyes line the inside." - icon_state = "eldritch_armor" - inhand_icon_state = null - flags_inv = HIDESHOES|HIDEJUMPSUIT - body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS - allowed = list(/obj/item/melee/sickly_blade, /obj/item/gun/ballistic/rifle/lionhunter) - hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch - // Slightly better than normal cult robes - armor_type = /datum/armor/cultrobes_eldritch - /// Whether the hood is flipped up - var/hood_up = FALSE +/datum/armor/eldritch_armor + melee = 50 + bullet = 50 + laser = 50 + energy = 50 + bomb = 35 + bio = 20 + fire = 20 + acid = 20 + wound = 20 + +//---- Path-Specific Eldritch Robes, First is robes, then is hood + +// Ash +// Prevents fire from decaying while worn, also passively generates fire via the toggle +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash + name = "\improper Scorched Mantle" + desc = "Left to burn to tatters, what remains is naught but a blackened echo of the mantle of the Watch. \ + Yet the soot-choked folds turn blade and flame from the form within. A brief reprieve before its gaze turns inwards." + icon_state = "ash_armor" + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/ash + armor_type = /datum/armor/eldritch_armor/ash + flags_inv = HIDEBELT + body_parts_covered = FULL_BODY + heat_protection = FULL_BODY + max_heat_protection_temperature = 50000 + cold_protection = FULL_BODY + min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | LAVA_PROOF | FREEZE_PROOF + actions_types = list(/datum/action/item_action/toggle/flames) + /// If our robes are actively generating flames + var/flame_generation = FALSE + /// Cooldown before our robes will create new flames + COOLDOWN_DECLARE(flame_creation) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/Initialize(mapload) + . = ..() + AddElement(/datum/element/radiation_protected_clothing) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/on_robes_gained(mob/living/user) + if(!isliving(user)) + return + var/mob/living/wearer = user + wearer.fire_stack_decay_rate = 0 + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/on_robes_lost(mob/living/user) + if(!isliving(user)) + return + var/mob/living/wearer = user + wearer.fire_stack_decay_rate = initial(wearer.fire_stack_decay_rate) + if(flame_generation) + toggle_flames(wearer) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/robes_side_effect(mob/living/user) + if(!iscarbon(user)) + return + var/mob/living/carbon/victim = user + var/iteration = 0 + for(var/obj/item/bodypart/limb as anything in victim.bodyparts) + if(istype(limb, /obj/item/bodypart/head) || istype(limb, /obj/item/bodypart/chest)) + continue + iteration++ + addtimer(CALLBACK(src, PROC_REF(burn_limbs), limb), 1 SECONDS * iteration) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/proc/burn_limbs(obj/item/bodypart/limb) + if(QDELETED(limb) || !limb.owner || !is_equipped(limb.owner)) + return + limb.dismember(BURN) + +/datum/action/item_action/toggle/flames + button_icon = 'icons/effects/magic.dmi' + button_icon_state = "fireball" + +/datum/action/item_action/toggle/flames/do_effect(trigger_flags) + var/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/item_target = target + if(!item_target || !istype(item_target)) + return FALSE + item_target.toggle_flames(owner) + +/// Starts/Stops the passive generation of fire stacks on our wearer +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/proc/toggle_flames(mob/living/user) + flame_generation = !flame_generation + + if(flame_generation) + START_PROCESSING(SSobj, src) + else + user.extinguish() + STOP_PROCESSING(SSobj, src) + + user.balloon_alert(user, flame_generation ? "enabled" : "disabled") + user.fire_stack_decay_rate = flame_generation ? 0 : initial(user.fire_stack_decay_rate) + // Extinguishes the wearer after they disable the flames + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/process(seconds_per_tick) + if(!COOLDOWN_FINISHED(src, flame_creation)) + return + var/mob/living/wearer = loc + if(!isliving(wearer)) + STOP_PROCESSING(SSobj, src) + flame_generation = FALSE + return + COOLDOWN_START(src, flame_creation, 5 SECONDS) + wearer.adjust_fire_stacks(1) + wearer.ignite_mob(TRUE) + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/ash + name = "\improper Scorched Mantle" + desc = "Left to burn to tatters, what remains is naught but a blackened echo of the mantle of the Watch. \ + Yet the soot-choked folds turn blade and flame from the form within. A brief reprieve before its gaze turns inwards." + icon_state = "ash_armor" + armor_type = /datum/armor/eldritch_armor/ash + +/datum/armor/eldritch_armor/ash + melee = 40 + bullet = 60 + laser = 50 + energy = 50 + bomb = 100 + bio = 20 + fire = 100 + acid = 20 + wound = 20 + +// Blade +// Is shock-proof and gives you baton resistance +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade + name = "\improper Shattered Panoply" + desc = "The sharpened edges of this ancient suit of armor assert a revelation known to aspirants of battle; \ + a true warrior can not be distinguished from the blade they wield." + icon_state = "blade_armor" + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/blade + armor_type = /datum/armor/eldritch_armor/blade + siemens_coefficient = 0 + var/murdering_with_blades = FALSE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/on_robes_gained(mob/living/user) + . = ..() + user.add_traits(list(TRAIT_SHOCKIMMUNE, TRAIT_BATON_RESISTANCE), REF(src)) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/on_robes_lost(mob/user, obj/item/clothing/suit/hooded/cultrobes/eldritch/robes) + . = ..() + if(.) + return + user.remove_traits(list(TRAIT_SHOCKIMMUNE, TRAIT_BATON_RESISTANCE), REF(src)) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/robes_side_effect(mob/living/user) + INVOKE_ASYNC(src, PROC_REF(start_throwing_blades), user) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/proc/start_throwing_blades(mob/living/target) + if(murdering_with_blades) + return + murdering_with_blades = TRUE + + var/delay = 2 SECONDS + var/knives = 100 + for(var/knife in 1 to knives) + if(!should_keep_cutting(target)) + break + addtimer(CALLBACK(src, PROC_REF(cut_em_good), target), delay * knife) + delay = max(0.5 SECONDS, delay - 0.1 SECONDS) + + murdering_with_blades = FALSE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/proc/should_keep_cutting(mob/living/target) + if(target.stat == DEAD || !is_equipped(target)) + return FALSE + return TRUE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/proc/cut_em_good(mob/living/target) + if(!should_keep_cutting(target)) + return + var/list/turf/valid_turfs = get_blade_turfs(get_turf(target)) + if(!length(valid_turfs)) + var/mob/living/carbon/carbon_target = target + if(iscarbon(target)) + var/obj/item/bodypart/limb = pick(carbon_target.bodyparts) + limb.force_wound_upwards(/datum/wound/slash/flesh/severe) + return + throw_blade(pick(valid_turfs), target) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/proc/get_blade_turfs(mob/user) + var/list/turfs_around_us = get_perimeter(user, 4) + var/list/valid_turfs = list() + for(var/turf/open/valid_turf in turfs_around_us) + if(!valid_turf.is_blocked_turf() && get_angle(valid_turf, user) != 180) + valid_turfs |= valid_turf + return valid_turfs -/datum/armor/cultrobes_eldritch +/obj/item/knife/kitchen/magic + icon = 'icons/effects/eldritch.dmi' + icon_state = "dio_knife" + name = "magic knife" + throwforce = 15 + // most importantly, this ignores shields + armour_penetration = 200 + pass_flags = ALL + +/obj/item/knife/kitchen/magic/Initialize(mapload) + . = ..() + AddElement(/datum/element/movetype_handler) + add_traits(list(TRAIT_MOVE_PHASING, TRAIT_MOVE_FLOATING, TRAIT_UNCATCHABLE), INNATE_TRAIT) + add_filter("dio_knife", 2, list("type" = "outline", "color" = "#ececff", "size" = 1)) + set_embed(/datum/embedding/magic_knife) + +/obj/item/knife/kitchen/magic/get_demolition_modifier(obj/target) + if(!ismob(target)) + return 100 + return ..() + +/datum/embedding/magic_knife + + embed_chance = 150 + fall_chance = 0 + impact_pain_mult = 0 + ignore_throwspeed_threshold = TRUE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/proc/throw_blade(turf/target_turf, mob/user) + var/obj/item/knife/kitchen/magic/knife = new(target_turf) + knife.alpha = 0 + knife.throw_at() + + var/matrix/transform = matrix(knife.transform) + var/angle = get_angle(target_turf, user) + transform.Turn(angle) + var/appear_delay = 0.5 SECONDS + var/throw_delay = 1 SECONDS + var/delete_delay = 10 SECONDS + addtimer(CALLBACK(knife, TYPE_PROC_REF(/atom/movable, throw_at), user, 50, 5, null, FALSE), throw_delay) + animate(knife, transform = transform, time = throw_delay, ANIMATION_PARALLEL) + animate(knife, alpha = 255, time = appear_delay, ANIMATION_PARALLEL) + animate(alpha = 0, time = delete_delay) + QDEL_IN(knife, delete_delay + appear_delay + throw_delay) + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/blade + name = "\improper Shattered Panoply" + desc = "The sharpened edges of this ancient suit of armor assert a revelation known to aspirants of battle; \ + a true warrior can not be distinguished from the blade they wield." + icon_state = "blade_armor" + armor_type = /datum/armor/eldritch_armor/blade + siemens_coefficient = 0 + +/datum/armor/eldritch_armor/blade melee = 50 bullet = 50 laser = 50 energy = 50 + bomb = 50 + bio = 50 + fire = 50 + acid = 50 + wound = 50 + +// Cosmic +// Allows you to toggle gravity for yourself at will +/obj/item/clothing/suit/hooded/cultrobes/eldritch/cosmic + name = "\improper Starwoven Cloak" + desc = "Gleaming gems conjure forth wisps of power, turning about to illuminate the wearer in a dim radiance. \ + Gazing upon the robe, you cannot help but feel noticed." + icon_state = "cosmic_armor" + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/cosmic + armor_type = /datum/armor/eldritch_armor/cosmic + clothing_flags = THICKMATERIAL | PLASMAMAN_PREVENT_IGNITION | STOPSPRESSUREDAMAGE + cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS + min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT + actions_types = list(/datum/action/item_action/toggle/gravity) + /// If our robes are making us weightless + var/weightless_enabled = FALSE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/cosmic/Initialize(mapload) + . = ..() + AddElement(/datum/element/radiation_protected_clothing) + +// Removes your antigravity if you lose the robes +/obj/item/clothing/suit/hooded/cultrobes/eldritch/cosmic/on_robes_lost(mob/user, obj/item/clothing/suit/hooded/cultrobes/eldritch/robes) + if(.) + return + if(weightless_enabled) + toggle_gravity(user) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/cosmic/robes_side_effect(mob/living/user) + var/obj/item/organ/brain/victim_brain = user.get_organ_slot(ORGAN_SLOT_BRAIN) + if(!victim_brain) + return + + victim_brain.gain_trauma(/datum/brain_trauma/magic/stalker/cosmic, TRAUMA_RESILIENCE_MAGIC) + +/datum/action/item_action/toggle/gravity + button_icon = 'icons/effects/magic.dmi' + button_icon_state = "magicm" + +/datum/action/item_action/toggle/gravity/do_effect(trigger_flags) + var/obj/item/clothing/suit/hooded/cultrobes/eldritch/cosmic/item_target = target + if(!item_target || !istype(item_target)) + return FALSE + item_target.toggle_gravity(owner) + +/// Gives us free movement in 0 gravity when enabled +/obj/item/clothing/suit/hooded/cultrobes/eldritch/cosmic/proc/toggle_gravity(mob/living/user) + if(!weightless_enabled) + user.add_traits(list(TRAIT_NEGATES_GRAVITY, TRAIT_MOVE_FLYING, TRAIT_FREE_HYPERSPACE_MOVEMENT), REF(src)) + user.balloon_alert(user, "enabled") + else + user.remove_traits(list(TRAIT_NEGATES_GRAVITY, TRAIT_MOVE_FLYING, TRAIT_FREE_HYPERSPACE_MOVEMENT), REF(src)) + user.balloon_alert(user, "disabled") + weightless_enabled = !weightless_enabled + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/cosmic + name = "\improper Starwoven Hood" + desc = "Gleaming gems conjure forth wisps of power, turning about to illuminate the wearer in a dim radiance. \ + Gazing upon the robe, you cannot help but feel noticed." + icon_state = "cosmic_armor" + armor_type = /datum/armor/eldritch_armor/cosmic + clothing_flags = THICKMATERIAL | PLASMAMAN_PREVENT_IGNITION | STOPSPRESSUREDAMAGE + cold_protection = HEAD + min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/cosmic/Initialize(mapload) + . = ..() + AddElement(/datum/element/radiation_protected_clothing) + +/datum/armor/eldritch_armor/cosmic + melee = 20 + bullet = 30 + laser = 60 + energy = 60 bomb = 35 bio = 20 fire = 20 acid = 20 wound = 20 -/obj/item/clothing/suit/hooded/cultrobes/eldritch/on_hood_up(obj/item/clothing/head/hooded/hood) - hood_up = TRUE +// Flesh +// Emits a healing aura that affects any heretic summons (excluding the heretic himself) +/obj/item/clothing/suit/hooded/cultrobes/eldritch/flesh + name = "Writhing Embrace" + desc = "A rotten carcass, or perhaps several, twisted into fleshy polyps, knotted intestines and cracked bone. \ + How one 'wears' this baffles reasonable understanding. It moves when it believes itself unobserved." + icon_state = "flesh_armor" + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/flesh + armor_type = /datum/armor/eldritch_armor/flesh + /// The aura healing component. Used to delete it when taken off. + var/datum/component/healing_aura -/obj/item/clothing/suit/hooded/cultrobes/eldritch/on_hood_down(obj/item/clothing/head/hooded/hood) - hood_up = FALSE +/obj/item/clothing/suit/hooded/cultrobes/eldritch/flesh/on_robes_gained(mob/living/user) + healing_aura = user.AddComponent( \ + /datum/component/aura_healing, \ + range = 15, \ + brute_heal = 3, \ + burn_heal = 3, \ + blood_heal = 3, \ + suffocation_heal = 3, \ + stamina_heal = 15, \ + simple_heal = 3, \ + requires_visibility = FALSE, \ + limit_to_trait = TRAIT_HERETIC_SUMMON, \ + healing_color = COLOR_RED, \ + self_heal = FALSE, \ + ) -/obj/item/clothing/suit/hooded/cultrobes/eldritch/examine(mob/user) +/obj/item/clothing/suit/hooded/cultrobes/eldritch/flesh/on_robes_lost(mob/user, obj/item/clothing/suit/hooded/cultrobes/eldritch/robes) + QDEL_NULL(healing_aura) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/flesh/robes_side_effect(mob/living/user) + if(!iscarbon(user)) + return + var/mob/living/carbon/victim = user + var/iteration = 0 + for(var/obj/item/bodypart/limb as anything in victim.bodyparts) + iteration++ + addtimer(CALLBACK(limb, TYPE_PROC_REF(/obj/item/bodypart, force_wound_upwards), /datum/wound/slash/flesh/critical), 1 SECONDS * iteration) + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/flesh + icon_state = "flesh_armor" + armor_type = /datum/armor/eldritch_armor/flesh + clothing_traits = list(TRAIT_MEDICAL_HUD) + +/datum/armor/eldritch_armor/flesh + melee = 70 + bullet = 40 + laser = 30 + energy = 30 + bomb = 35 + bio = 100 + fire = 0 + acid = 100 + wound = 20 + +// Lock +// Gives you digital camo, silences your footsteps and makes you un-examineable +/obj/item/clothing/suit/hooded/cultrobes/eldritch/lock + name = "Shifting Guise" + icon_state = "lock_armor" + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/lock + armor_type = /datum/armor/eldritch_armor/lock + flags_inv = parent_type::flags_inv | HIDEMUTWINGS + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/lock/on_robes_gained(mob/living/user) + user.AddElement(/datum/element/digitalcamo) + user.add_traits(list(TRAIT_SILENT_FOOTSTEPS, TRAIT_UNKNOWN_APPEARANCE, TRAIT_UNKNOWN_VOICE), REF(src)) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/lock/on_robes_lost(mob/user, obj/item/clothing/suit/hooded/cultrobes/eldritch/robes) + user.RemoveElement(/datum/element/digitalcamo) + user.remove_traits(list(TRAIT_SILENT_FOOTSTEPS, TRAIT_UNKNOWN_APPEARANCE, TRAIT_UNKNOWN_VOICE), REF(src)) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/lock/robes_side_effect(mob/living/user) + if(!iscarbon(user)) + return + var/mob/living/carbon/victim = user + var/list/things = victim.get_equipped_items(ALL) + var/turf/our_turf = get_turf(victim) + var/list/turf/nearby_turfs = RANGE_TURFS(5, our_turf) - our_turf + for(var/obj/item/to_throw in things) + if(user.dropItemToGround(to_throw)) + to_throw.safe_throw_at(pick(nearby_turfs), 2, 1, spin = TRUE) + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/lock + icon_state = "lock_armor" + armor_type = /datum/armor/eldritch_armor/lock + +/datum/armor/eldritch_armor/lock + melee = 40 + bullet = 40 + laser = 40 + energy = 40 + bomb = 40 + bio = 40 + fire = 40 + acid = 40 + wound = 40 + +// Moon +// Converts all damage into brain damage, nullifying the attack in the process +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon + name = "\improper Resplendant Regalia" + desc = "The confounding nature of this opulent garb turns and twists the sight. \ + The viewer must come to a chilling revelation; \ + what they see is as true as any other face." + icon_state = "moon_armor" + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/moon + armor_type = /datum/armor/eldritch_armor/moon + flags_inv = HIDESHOES | HIDEJUMPSUIT | HIDEMUTWINGS + clothing_traits = list( + TRAIT_HERETIC_AURA_HIDDEN, + TRAIT_BATON_RESISTANCE, + TRAIT_STUNIMMUNE, + TRAIT_NEVER_WOUNDED, + TRAIT_PACIFISM, + TRAIT_NOHUNGER + ) + /// Hud that gets shown to the wearer, gives a rough estimate of their current brain damage + var/atom/movable/screen/moon_health/health_hud + /// Boolean if you are brain dead so the sound doesn't spam during the delay + var/braindead = FALSE + //---- Messages that get sent when someone wearing the moon robes is attacked + /// Visible message that nearby people see + var/static/list/visible_message_list = list( + "%USER seems to hardly register that they have been harmed by %ATTACKER, not even flinching naturally.", + "Though wounded, %USER seems oblivious to %ATTACKER.", + "You hear %USER laughing. But they have not made a single sound, even when struck by %ATTACKER.", + ) + /// Message sent to the wearer who got attacked + var/static/list/self_message_list = list( + "Your body ripples as still water freshly disturbed. The sensation is exquisite, and you have %ATTACKER to thank.", + "A bell tolls. %ATTACKER has struck the hour and you tick to that tune.", + //"You are needed in [area name]. You need to be there. %ATTACKER might want you to stay, but you are needed in [area name].", + //"You see %ATTACKER strike a [name of animal]. The face of the beast is a mirror of your own. How strange.", + "%ATTACKER bumps you and you spill your tea. It's fine. You've plenty of cups.", + "You hear a roaring crash. The waves hit the boat. The sea is vast and dark. You see %ATTACKER striking the water, cursing its master.", + "Sequins scatter into the air around %ATTACKER. The sequins...", + "You notice that a button has popped off your collar. How did that happen? Maybe %ATTACKER is to blame.", + "%ATTACKER isn't very funny, and you're struggling to see the punchline.", + ) + /// Message sent to blind people nearby + var/static/list/blind_message_list = list( + "You hear echoing laughter.", + "You hear a distance chorus.", + "You hear the sound of bells and whistles.", + "You hear the clack of a tambourine.", + ) + /// List of all signals registered, used for cleanup + var/signal_registered = list() + /// damage modifier to all incoming damage, which is also converted to brain damage + var/damage_modifier = 1.15 + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/equipped(mob/user, slot, initial) . = ..() - if(!IS_HERETIC(user)) + if(!ishuman(user) || !(slot_flags & slot)) return - if(hood_up) + var/mob/living/carbon/human/human_user = user + // Gives the hud to the wearer, if there's no hud, register the signal to be given on creation + if(human_user.hud_used) + on_hud_created(human_user) + else + RegisterSignal(human_user, COMSIG_MOB_HUD_CREATED, PROC_REF(on_hud_created)) + signal_registered += COMSIG_MOB_HUD_CREATED + + human_user.add_movespeed_mod_immunities(REF(src), /datum/movespeed_modifier/equipment_speedmod) + RegisterSignal(human_user, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, PROC_REF(on_apply_modifiers)) + signal_registered += COMSIG_MOB_APPLY_DAMAGE_MODIFIERS + + // adjust ignores damage modifiers so we listen to them separately + var/list/damage_adjust_signals = list( + COMSIG_LIVING_ADJUST_BRUTE_DAMAGE, + COMSIG_LIVING_ADJUST_BURN_DAMAGE, + COMSIG_LIVING_ADJUST_OXY_DAMAGE, + COMSIG_LIVING_ADJUST_TOX_DAMAGE, + COMSIG_LIVING_ADJUST_STAMINA_DAMAGE + ) + + RegisterSignals(human_user, damage_adjust_signals, PROC_REF(adjust_damage)) + signal_registered += damage_adjust_signals + + RegisterSignal(human_user, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + signal_registered += COMSIG_LIVING_DEATH + + RegisterSignal(human_user, COMSIG_SEND_ITEM_ATTACK_MESSAGE_CARBON, PROC_REF(item_attack_response)) + signal_registered += COMSIG_SEND_ITEM_ATTACK_MESSAGE_CARBON + + var/obj/item/organ/brain/our_brain = human_user.get_organ_slot(ORGAN_SLOT_BRAIN) + if(!our_brain) return + ADD_TRAIT(our_brain, TRAIT_BRAIN_DAMAGE_NODEATH, REF(src)) + START_PROCESSING(SSobj, src) - // Our hood gains the heretic_focus element. - . += span_notice("Allows you to cast heretic spells while the hood is up.") +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/dropped(mob/living/user) + . = ..() + if(!ishuman(user)) + return + var/mob/living/carbon/human/wearer = user + UnregisterSignal(wearer, signal_registered) + signal_registered = list() + + wearer.remove_movespeed_mod_immunities(REF(src), /datum/movespeed_modifier/equipment_speedmod) + var/obj/item/organ/brain/our_brain = wearer.get_organ_slot(ORGAN_SLOT_BRAIN) + if(our_brain) + REMOVE_TRAIT(our_brain, TRAIT_BRAIN_DAMAGE_NODEATH, REF(src)) + braindead = FALSE + if(health_hud in user.hud_used.infodisplay) + on_hud_remove(user) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/on_apply_modifiers(mob/living/user, damage_mods, damage, damagetype, def_zone, sharpness, attack_direction, attacking_item) + SIGNAL_HANDLER + if(braindead) + return + damage_mods += 0 + handle_damage(user, damage) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/adjust_damage(mob/living/user, type, amount, forced) + SIGNAL_HANDLER + handle_damage(user, amount) + return COMPONENT_IGNORE_CHANGE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/handle_damage(mob/living/user, damage) + user.adjust_organ_loss(ORGAN_SLOT_BRAIN, damage * damage_modifier) + check_braindeath(user) + +/// Gives the health HUD to the wearer +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/on_hud_created(mob/living/carbon/human/wearer) + SIGNAL_HANDLER + var/datum/hud/original_hud = wearer.hud_used + // Remove the old health elements + var/list/to_remove = list(/atom/movable/screen/stamina, /atom/movable/screen/healths, /atom/movable/screen/healthdoll/human) + for(var/removing in original_hud.infodisplay) + if(is_type_in_list(removing, to_remove)) + original_hud.infodisplay -= removing + QDEL_NULL(removing) + + wearer.mob_mood.unmodify_hud() + // Add the moon health hud element + health_hud = new(null, original_hud) + original_hud.infodisplay += health_hud + original_hud.show_hud(original_hud.hud_version) + UnregisterSignal(wearer, COMSIG_MOB_HUD_CREATED) + signal_registered -= COMSIG_MOB_HUD_CREATED + +/// Removes the HUD element from the wearer +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/on_hud_remove(mob/living/carbon/human/wearer) + var/datum/hud/original_hud = wearer.hud_used + original_hud.infodisplay -= health_hud + QDEL_NULL(health_hud) + // Restore the old health elements + var/atom/movable/screen/stamina/stamina_hud = new(null, original_hud) + var/atom/movable/screen/healths/old_health_hud = new(null, original_hud) + var/atom/movable/screen/healthdoll/human/health_doll_hud = new(null, original_hud) + original_hud.infodisplay += stamina_hud + original_hud.infodisplay += old_health_hud + original_hud.infodisplay += health_doll_hud + wearer.mob_mood.modify_hud() + original_hud.show_hud(original_hud.hud_version) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/can_mob_unequip(mob/user) + if(!ishuman(user)) + return ..() + var/mob/living/carbon/human/wearer = user + if(wearer.get_organ_loss(ORGAN_SLOT_BRAIN) > 0) + wearer.balloon_alert(user, "can't strip, brain damaged!") + return FALSE + return ..() + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/item_attack_response(mob/living/victim, obj/item/weapon, mob/living/attacker) + SIGNAL_HANDLER + var/visible_message = pick(visible_message_list) + visible_message = replacetext(visible_message, "%USER", victim.get_visible_name()) + visible_message = replacetext(visible_message, "%ATTACKER", attacker.get_visible_name()) + + var/self_message = pick(self_message_list) + self_message = replacetext(self_message_list, "%ATTACKER", attacker.get_visible_name()) + + var/blind_message = pick(blind_message_list) + victim.visible_message(span_danger(visible_message), span_userdanger(self_message), span_danger(blind_message)) + return SIGNAL_MESSAGE_MODIFIED + +/// Once you reach this point you're completely brain dead, so lets play our effects before you eat shit +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/kill_wearer(mob/living/carbon/human/wearer) + if(IS_HERETIC(wearer)) + var/datum/action/cooldown/spell/aoe/moon_ringleader/temp_spell = new(wearer) + temp_spell.cast(wearer) + qdel(temp_spell) + var/obj/item/organ/brain/our_brain = wearer.get_organ_slot(ORGAN_SLOT_BRAIN) + REMOVE_TRAIT(our_brain, TRAIT_BRAIN_DAMAGE_NODEATH, REF(src)) + wearer.death() + +/// Blows up your head when you die +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/on_death(mob/wearer) + SIGNAL_HANDLER + if(!ishuman(wearer)) + return + var/mob/living/carbon/human/human_wearer = wearer + var/obj/item/bodypart/head/to_explode = human_wearer.get_bodypart(BODY_ZONE_HEAD) + if(!to_explode) + return + human_wearer.visible_message(span_warning("[human_wearer]'s head splatters with a sickening crunch!"), ignored_mobs = list(human_wearer)) + new /obj/effect/gibspawner/generic(get_turf(human_wearer), human_wearer) + to_explode.dismember(dam_type = BRUTE, silent = TRUE) + to_explode.drop_organs() + qdel(to_explode) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/process(seconds_per_tick) + var/mob/living/carbon/human/wearer = loc + if(!istype(wearer) || wearer.wear_suit != src || wearer.stat == DEAD) + return ..() + if(!IS_HERETIC_OR_MONSTER(wearer)) + wearer.adjust_organ_loss(ORGAN_SLOT_BRAIN, 20) + var/brain_damage = wearer.get_organ_loss(ORGAN_SLOT_BRAIN) + var/emote_rng = 0 + var/list/emote_list = list() + switch(brain_damage) + if(0) + emote_rng = 0 + emote_list = list() + if(1 to 30) + emote_rng = 20 + emote_list = list("laugh") + if(31 to 60) + emote_rng = 40 + emote_list = list("laugh", "smile") + if(61 to 100) + emote_rng = 60 + emote_list = list("laugh", "smile", "cough") + if(101 to 150) + emote_rng = 80 + emote_list = list("laugh", "smile", "cough", "gasp") + if(151 to 200) + emote_rng = 100 + emote_list = list("laugh", "smile", "cough", "gasp", "scream") + if(!prob(emote_rng)) + return + for(var/perform in emote_list) + wearer.emote("[perform]") + check_braindeath(wearer) + +/// Checks if you are brain dead, starts the dying process once you've reached it +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/check_braindeath(mob/living/carbon/human/wearer) + var/obj/item/organ/brain/our_brain = wearer.get_organ_slot(ORGAN_SLOT_BRAIN) + if(braindead || our_brain.damage < our_brain.maxHealth) + return + + braindead = TRUE + wearer.set_organ_loss(ORGAN_SLOT_BRAIN, INFINITY) + playsound(wearer, 'sound/effects/pope_entry.ogg', 50) + to_chat(wearer, span_bold(span_hypnophrase("A terrible fate has befallen you."))) + addtimer(CALLBACK(src, PROC_REF(kill_wearer), wearer), 5 SECONDS) + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/moon + name = "\improper Resplendant Hood" + icon_state = "moon_armor" + armor_type = /datum/armor/eldritch_armor/moon + +/datum/armor/eldritch_armor/moon + melee = 0 + bullet = 0 + laser = 0 + energy = 0 + bomb = 0 + bio = 0 + fire = 0 + acid = 0 + wound = 0 + +/atom/movable/screen/moon_health + name = "Health Level" + icon = 'icons/hud/moon_health_64x64.dmi' + icon_state = "moon_hud_1" + base_icon_state = "moon_hud" + screen_loc = "EAST-1:0, SOUTH+6:16" + +/atom/movable/screen/moon_health/Initialize(mapload, datum/hud/hud_owner) + . = ..() + if(isnull(hud_owner) || !ishuman(hud_owner.mymob)) + return INITIALIZE_HINT_QDEL + var/mob/living/carbon/human/wearer = hud_owner.mymob + var/obj/item/organ/brain/our_brain = wearer.get_organ_slot(ORGAN_SLOT_BRAIN) + if(!our_brain) + return INITIALIZE_HINT_QDEL + update_health(our_brain) + RegisterSignal(our_brain, COMSIG_ORGAN_ADJUST_DAMAGE, PROC_REF(update_health)) + +/// Changes the icon based on the brain health of the wearer +/atom/movable/screen/moon_health/proc/update_health(obj/item/organ/brain, damage_amount, maximum, required_organ_flag) + SIGNAL_HANDLER + if(!brain.owner || !ishuman(brain.owner)) + qdel(src) + return + var/mob/living/carbon/human/wearer = brain.owner + if(istype(wearer.wear_suit, /obj/item/clothing/suit/hooded/cultrobes/eldritch/moon)) + var/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/robes = wearer.wear_suit + if(robes.braindead) + icon_state = base_icon_state + "_6" + return // Don't update the icon once our "dying" process has begun + switch(brain.damage) + if(0 to 20) + icon_state = base_icon_state + "_1" + if(21 to 50) + icon_state = base_icon_state + "_2" + if(51 to 100) + icon_state = base_icon_state + "_3" + if(101 to 150) + icon_state = base_icon_state + "_4" + if(151 to 189) + icon_state = base_icon_state + "_5" + if(190 to INFINITY) + icon_state = base_icon_state + "_6" + +// Rust +// Gains more armor while standing on top of rust. Has an animated overlay +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust + name = "\improper Salvaged Remains" + desc = "Touching the folds of this plain robe seem to fill you with unease. \ + Even looking fills you with a sense of vertigo. \ + Some pulse threatening to pull you within." + icon_state = "rust_armor" + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/rust + armor_type = /datum/armor/eldritch_armor/rust + /// Grace period timer before the + COOLDOWN_DECLARE(rust_grace_period) + /// If our armor is rusted, used to update the sprite + var/rusted = FALSE + /// Atom used to animate our overlay + var/atom/movable/rust_overlay + /// The mutable that is actually overlayed on the mob + var/mutable_appearance/rust_appearance + /// identifier for the overlay + var/static/overlay_id = 0 + /// Overlay for the armor object + var/image/object_overlay + /// Overlay for the hood object + var/image/hood_object_overlay + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/Initialize(mapload) + . = ..() + overlay_id++ + if(!object_overlay) + object_overlay = image(icon, icon_state = "rust_armor_overlay") + if(!hood_object_overlay) + hood_object_overlay = image('icons/obj/clothing/head/helmet.dmi', icon_state = "rust_armor_overlay") + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/on_robes_gained(mob/living/user) + . = ..() + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + rust_overlay = new() + rust_overlay.icon = 'icons/mob/clothing/suits/armor.dmi' + rust_overlay.render_target = "*rust_overlay_[overlay_id]" + rust_overlay.vis_flags |= VIS_INHERIT_DIR | VIS_INHERIT_LAYER | VIS_INHERIT_ID + user.vis_contents += rust_overlay // Should be invisible, we just update the sprite as needed + + rust_appearance = new /mutable_appearance() + rust_appearance.render_source = "*rust_overlay_[overlay_id]" + update_appearance(UPDATE_ICON) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/on_robes_lost(mob/user, obj/item/clothing/suit/hooded/cultrobes/eldritch/robes) + . = ..() + if(.) + return + UnregisterSignal(user, list(COMSIG_MOVABLE_MOVED)) + user.vis_contents -= rust_overlay + rusted = FALSE + set_armor(/datum/armor/eldritch_armor/rust) + + REMOVE_TRAIT(user, TRAIT_PIERCEIMMUNE, REF(src)) + cut_overlay(object_overlay) + QDEL_NULL(rust_overlay) + QDEL_NULL(rust_appearance) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/robes_side_effect(mob/living/user) + . = ..() + if(!iscarbon(user)) + return + var/mob/living/carbon/victim = user + var/list/organ_list = victim.organs + if(!length(organ_list)) + return + + var/iteration = 0 + var/organs_to_puke = rand(1, 3) + for(var/obj/item/organ/to_puke as anything in organ_list) + if(iteration > organs_to_puke) + break + iteration++ + addtimer(CALLBACK(src, PROC_REF(vomit_your_guts_out), victim), 1 SECONDS * iteration) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/proc/vomit_your_guts_out(mob/living/carbon/victim) + if(QDELETED(victim) || !is_equipped(victim)) + return + victim.vomit(MOB_VOMIT_BLOOD | MOB_VOMIT_MESSAGE | MOB_VOMIT_HARM | MOB_VOMIT_FORCE) + victim.spew_organ(rand(4, 6)) + +/* + * Signal proc for [COMSIG_MOVABLE_MOVED]. + * + * Checks if our armor values should be increased on the new turf + */ +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/proc/on_move(mob/source, atom/old_loc, dir, forced, list/old_locs) + SIGNAL_HANDLER + + var/turf/mover_turf = get_turf(source) + if(HAS_TRAIT(mover_turf, TRAIT_RUSTY)) + set_armor(/datum/armor/eldritch_armor/rust/on_rust) + + ADD_TRAIT(source, TRAIT_PIERCEIMMUNE, REF(src)) + COOLDOWN_RESET(src, rust_grace_period) + if(rusted) // Already rusted, don't update overlay + return + rusted = TRUE + update_rust() + else + if(!rusted) // Already unrusted, don't update overlay + return + // Start the timer for the first time we step off rust + if(!COOLDOWN_STARTED(src, rust_grace_period)) + COOLDOWN_START(src, rust_grace_period, 1 SECONDS) + return + if(!COOLDOWN_FINISHED(src, rust_grace_period)) + return + + // *Actually* remove the effects after our grace period expires. + // Keep in mind since we call updates `on_move` this means you can technically stand still to keep the benefits. + COOLDOWN_RESET(src, rust_grace_period) + set_armor(/datum/armor/eldritch_armor/rust) + REMOVE_TRAIT(source, TRAIT_PIERCEIMMUNE, REF(src)) + rusted = FALSE + update_rust() + +/// Updates the icon of our overlay and applies the animation +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/proc/update_rust() + // Animation + Update the overlay sprite on our armor + if(!rusted) + rust_overlay?.icon_state = null + flick("[worn_icon_state]"+"_off", rust_overlay) + cut_overlay(object_overlay) + hood?.cut_overlay(hood_object_overlay) + return + rust_overlay?.icon_state = "[worn_icon_state]" + "_overlay" + flick("[worn_icon_state]"+"_on", rust_overlay) + add_overlay(object_overlay) + hood?.add_overlay(hood_object_overlay) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/worn_overlays(mutable_appearance/standing, isinhands) + . = ..() + // Should basically catch toggling the hood on/off while standing on rust + if(rusted) + rust_overlay?.icon_state = "[worn_icon_state]" + "_overlay" + else + rust_overlay?.icon_state = null + . += rust_appearance + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/rust + name = "\improper Salvaged Remains" + desc = "Touching the folds of this plain robe seem to fill you with unease. \ + Even looking fills you with a sense of vertigo. \ + Some pulse threatening to pull you within." + icon_state = "rust_armor" + armor_type = /datum/armor/eldritch_armor/rust + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/rust/equipped(mob/living/user, slot) + . = ..() + if(!(slot_flags & slot)) + UnregisterSignal(user, list(COMSIG_MOVABLE_MOVED)) + return + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + +/* + * Signal proc for [COMSIG_MOVABLE_MOVED]. + * + * Checks if our armor values should be increased on the new turf + */ +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/rust/proc/on_move(mob/source, atom/old_loc, dir, forced, list/old_locs) + SIGNAL_HANDLER + + var/turf/mover_turf = get_turf(source) + if(HAS_TRAIT(mover_turf, TRAIT_RUSTY)) + set_armor(/datum/armor/eldritch_armor/rust/on_rust) + else + set_armor(/datum/armor/eldritch_armor/rust) + +/datum/armor/eldritch_armor/rust + melee = 30 + bullet = 30 + laser = 30 + energy = 30 + bomb = 50 + bio = 30 + fire = 30 + acid = 30 + wound = 30 + +/datum/armor/eldritch_armor/rust/on_rust + melee = 60 + bullet = 60 + laser = 60 + energy = 60 + bomb = 100 + bio = 60 + fire = 60 + acid = 60 + wound = 60 + +// Void +// Gives you a short stealth when you are hit +/obj/item/clothing/suit/hooded/cultrobes/eldritch/void + name = "\improper Hollow Weave" + desc = "At first, the empty canvas of this robe seems to shimmer with a faint, cold light. \ + Yet upon tracking the shape of the folds more carefully, it is better to describe it as the absence of such a thing." + icon_state = "void_armor" + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/void + armor_type = /datum/armor/eldritch_armor/void + /// Cooldown before we can go back into stealth + COOLDOWN_DECLARE(stealth_cooldown) + /// Timer before our stealth runs out + var/stealth_timer + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/void/on_robes_lost(mob/user, obj/item/clothing/suit/hooded/cultrobes/eldritch/robes) + . = ..() + if(. || !timeleft(stealth_timer)) + return + // Remove from stealth when you lose the robes + deltimer(stealth_timer) + end_stealth(user) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/void/robes_side_effect(mob/living/user) + . = ..() + user.adjust_bodytemperature(-INFINITY) + ADD_TRAIT(user, TRAIT_HYPOTHERMIC, REF(src)) + if(!isliving(user)) + return + var/mob/living/victim = user + victim.apply_status_effect(/datum/status_effect/frozenstasis/irresistable) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/void/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text, final_block_chance, damage, attack_type, damage_type) + . = ..() + if(!COOLDOWN_FINISHED(src, stealth_cooldown)) + return + COOLDOWN_START(src, stealth_cooldown, 20 SECONDS) + stealth_timer = addtimer(CALLBACK(src, PROC_REF(end_stealth), owner), 5 SECONDS, TIMER_STOPPABLE) + owner.alpha = 0 + return TRUE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/void/proc/end_stealth(mob/living/carbon/human/owner) + animate(owner, time = 1 SECONDS, alpha = initial(owner.alpha)) + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/void + name = "\improper Hollow Weave" + desc = "At first, the empty canvas of this robe seems to shimmer with a faint, cold light. \ + Yet upon tracking the shape of the folds more carefully, it is better to describe it as the absence of such a thing." + icon_state = "void_armor" + armor_type = /datum/armor/eldritch_armor/void + +/datum/armor/eldritch_armor/void + melee = 40 + bullet = 40 + laser = 50 + energy = 50 + bomb = 40 + bio = 40 + fire = 40 + acid = 40 + wound = 40 // Void cloak. Turns invisible with the hood up, lets you hide stuff. /obj/item/clothing/head/hooded/cult_hoodie/void @@ -108,6 +1136,12 @@ make_visible() ADD_TRAIT(src, TRAIT_CONTRABAND_BLOCKER, INNATE_TRAIT) +/obj/item/clothing/suit/hooded/cultrobes/void/on_hood_up(obj/item/clothing/head/hooded/hood) + hood_up = TRUE + +/obj/item/clothing/suit/hooded/cultrobes/void/on_hood_down(obj/item/clothing/head/hooded/hood) + hood_up = FALSE + /obj/item/clothing/suit/hooded/cultrobes/void/equipped(mob/user, slot) . = ..() if(slot & ITEM_SLOT_OCLOTHING) @@ -118,12 +1152,6 @@ . = ..() UnregisterSignal(user, list(COMSIG_MOB_UNEQUIPPED_ITEM, COMSIG_MOB_EQUIPPED_ITEM)) -/obj/item/clothing/suit/hooded/cultrobes/void/on_hood_up(obj/item/clothing/head/hooded/hood) - hood_up = TRUE - -/obj/item/clothing/suit/hooded/cultrobes/void/on_hood_down(obj/item/clothing/head/hooded/hood) - hood_up = FALSE - /obj/item/clothing/suit/hooded/cultrobes/void/proc/hide_item(datum/source, obj/item/item, slot) SIGNAL_HANDLER if(slot & ITEM_SLOT_SUITSTORE) @@ -140,6 +1168,7 @@ // 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.") + . += span_notice("Is space worthy as long as the hood is down.") /obj/item/clothing/suit/hooded/cultrobes/void/on_hood_down(obj/item/clothing/head/hooded/hood) make_visible() @@ -165,6 +1194,7 @@ RemoveElement(/datum/element/heretic_focus) if(isliving(loc)) + loc.remove_traits(list(TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTCOLD), REF(src)) REMOVE_TRAIT(loc, TRAIT_RESISTLOWPRESSURE, REF(src)) loc.balloon_alert(loc, "cloak hidden") loc.visible_message(span_notice("Light shifts around [loc], making the cloak around them invisible!")) @@ -175,6 +1205,6 @@ AddElement(/datum/element/heretic_focus) if(isliving(loc)) - ADD_TRAIT(loc, TRAIT_RESISTLOWPRESSURE, REF(src)) + loc.add_traits(list(TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTCOLD), REF(src)) loc.balloon_alert(loc, "cloak revealed") loc.visible_message(span_notice("A kaleidoscope of colours collapses around [loc], a cloak appearing suddenly around their person!")) diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm index 51de634ff439..30433933ec84 100644 --- a/code/modules/antagonists/heretic/items/heretic_blades.dm +++ b/code/modules/antagonists/heretic/items/heretic_blades.dm @@ -54,6 +54,9 @@ return . /obj/item/melee/sickly_blade/attack_self(mob/user) + var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) + if(heretic_datum?.unlimited_blades) + return if(HAS_TRAIT(user, TRAIT_ELDRITCH_ARENA_PARTICIPANT)) user.balloon_alert(user, "can't escape!") if(escape_attempts > 2) @@ -78,7 +81,7 @@ /// Attempts to teleport the passed mob to somewhere safe on the station, if they can use the blade. /obj/item/melee/sickly_blade/proc/seek_safety(mob/user) - var/turf/safe_turf = find_safe_turf(zlevels = z, extended_safety_checks = TRUE) + var/turf/safe_turf = find_safe_turf(z, extended_safety_checks = TRUE) if(check_usability(user)) if(do_teleport(user, safe_turf, channel = TELEPORT_CHANNEL_MAGIC)) to_chat(user, span_warning("As you shatter [src], you feel a gust of energy flow through your body. [after_use_message]")) @@ -163,23 +166,20 @@ /obj/item/melee/sickly_blade/dark/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) . = ..() - if(!infused || target == user || !isliving(target)) + if(!infused || target == user || !isliving(target) || QDELETED(target)) return - var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) + var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) var/mob/living/living_target = target if(!heretic_datum) return - //Apply our heretic mark - var/datum/heretic_knowledge/mark/blade_mark/mark_to_apply = heretic_datum.get_knowledge(/datum/heretic_knowledge/mark/blade_mark) + // Apply our heretic mark + var/datum/heretic_knowledge/limited_amount/starting/base_blade/mark_to_apply = heretic_datum.get_knowledge(/datum/heretic_knowledge/limited_amount/starting/base_blade) if(!mark_to_apply) return mark_to_apply.create_mark(user, living_target) - - //Remove the infusion from any blades we own (and update their sprite) - for(var/obj/item/melee/sickly_blade/dark/to_infuse in user.get_all_contents_type(/obj/item/melee/sickly_blade/dark)) - to_infuse.infused = FALSE - to_infuse.update_appearance(UPDATE_ICON) + infused = FALSE + update_appearance(UPDATE_ICON) user.update_held_items() if(!check_behind(user, living_target)) @@ -279,7 +279,7 @@ else if(prob(15)) to_chat(user, span_big(span_hypnophrase("LW'NAFH'NAHOR UH'ENAH'YMG EPGOKA AH NAFL MGEMPGAH'EHYE"))) to_chat(user, span_danger("Horrible, unintelligible utterances flood your mind!")) - user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15) // This can kill you if you ignore it + user.adjust_organ_loss(ORGAN_SLOT_BRAIN, 15) // This can kill you if you ignore it return TRUE /obj/item/melee/sickly_blade/cursed/equipped(mob/user, slot) @@ -304,6 +304,11 @@ return ITEM_INTERACT_BLOCKING return NONE +/obj/item/melee/sickly_blade/cursed/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(attack_type == OVERWHELMING_ATTACK) + return FALSE + return ..() + // Weaker blade variant given to people so they can participate in the heretic arena spell /obj/item/melee/sickly_blade/training name = "\improper imperfect blade" diff --git a/code/modules/antagonists/heretic/items/heretic_grenade.dm b/code/modules/antagonists/heretic/items/heretic_grenade.dm index eb6f4ecf0778..47e0817d94f3 100644 --- a/code/modules/antagonists/heretic/items/heretic_grenade.dm +++ b/code/modules/antagonists/heretic/items/heretic_grenade.dm @@ -72,7 +72,7 @@ . = ..() if(!ishuman(exposed_mob)) if(issilicon(exposed_mob) || ismecha(exposed_mob) || isbot(exposed_mob)) - exposed_mob.adjustBruteLoss(500) + exposed_mob.adjust_brute_loss(500) return if(IS_HERETIC(exposed_mob)) return diff --git a/code/modules/antagonists/heretic/items/heretic_necks.dm b/code/modules/antagonists/heretic/items/heretic_necks.dm index 5faf97ba0059..ad5ab5f99425 100644 --- a/code/modules/antagonists/heretic/items/heretic_necks.dm +++ b/code/modules/antagonists/heretic/items/heretic_necks.dm @@ -82,8 +82,8 @@ return to_chat(user, span_danger("[src] explodes into a shower of gore and blood, drenching your arm. You can feel the blood seeping into your skin. You inmediately feel better, but soon, the feeling turns hollow as your veins itch.")) new /obj/effect/gibspawner/generic(get_turf(src)) - var/heal_amt = user.adjustBruteLoss(-50) - user.adjustFireLoss( -(50 - abs(heal_amt)) ) // no double dipping + var/heal_amt = user.adjust_brute_loss(-50) + user.adjust_fire_loss( -(50 - abs(heal_amt)) ) // no double dipping // I want it to poison the user but I also think it'd be neat if they got their juice as well. But that cancels most of the damage out. So I dunno. user.reagents?.add_reagent(/datum/reagent/fuel/unholywater, rand(6, 10)) @@ -146,7 +146,6 @@ icon_state = "eye_medalion" w_class = WEIGHT_CLASS_SMALL - // The amulet conversion tool used by moon heretics /obj/item/clothing/neck/heretic_focus/moon_amulet name = "moonlight amulet" @@ -154,31 +153,158 @@ icon = 'icons/obj/antags/eldritch.dmi' icon_state = "moon_amulette" w_class = WEIGHT_CLASS_SMALL - // How much damage does this item do to the targets sanity? + /// How much damage does this item do to the targets sanity? var/sanity_damage = 20 + var/list/possible_sounds = list( + 'sound/items/sitcom_laugh/SitcomLaugh1.ogg', + 'sound/items/sitcom_laugh/SitcomLaugh2.ogg', + 'sound/items/sitcom_laugh/SitcomLaugh3.ogg', + ) + var/valid_weapon_type = /obj/item/melee/sickly_blade + var/sanity_threshold = SANITY_LEVEL_INSANE -/obj/item/clothing/neck/heretic_focus/moon_amulet/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers) - var/mob/living/carbon/human/hit = target - if(!IS_HERETIC_OR_MONSTER(user)) - user.balloon_alert(user, "you feel a presence watching you") - user.add_mood_event("Moon Amulet Insanity", /datum/mood_event/amulet_insanity) - user.mob_mood.adjust_sanity(-50) +/obj/item/clothing/neck/heretic_focus/moon_amulet/examine(mob/user) + . = ..() + if(IS_HERETIC(user)) + . += span_notice("Wearing this amulet increases your healing speed by 50%") + +/obj/item/clothing/neck/heretic_focus/moon_amulet/equipped(mob/living/user, slot) + . = ..() + if(!IS_HERETIC(user) && (slot_flags & slot)) + channel_amulet(user) + return // Equipping the amulet as a non-heretic will give you a fat mood debuff and nothing else + if(!(slot_flags & slot)) + on_amulet_deactivate(user) return + on_amulet_activate(user) + +/// Modifies any blades you hold/pickup/drop when the amulet is enabled +/obj/item/clothing/neck/heretic_focus/moon_amulet/proc/on_amulet_activate(mob/living/user) + RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(blade_channel)) + RegisterSignal(user, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(on_equip_item)) + RegisterSignal(user, COMSIG_MOB_DROPPED_ITEM, PROC_REF(on_dropped_item)) + // Just make sure we pacify blades potentially in our hands when we put on the amulet + on_equip_item(user, user.get_active_held_item(), ITEM_SLOT_HANDS) + on_equip_item(user, user.get_inactive_held_item(), ITEM_SLOT_HANDS) + ADD_TRAIT(user, TRAIT_THERMAL_VISION, REF(src)) + user.update_sight() + // If the equipper is a moon heretic, we buff their passive + var/datum/status_effect/heretic_passive/moon/moon_passive = user.has_status_effect(/datum/status_effect/heretic_passive/moon) + moon_passive?.amulet_equipped = TRUE + +/// Modifies any blades you hold/pickup/drop when the amulet is disabled +/obj/item/clothing/neck/heretic_focus/moon_amulet/proc/on_amulet_deactivate(mob/living/user) + // Make sure to restore the values of any blades we might be holding when our amulet is deactivated + on_dropped_item(user, user.get_active_held_item()) + on_dropped_item(user, user.get_inactive_held_item()) + UnregisterSignal(user, list(COMSIG_HERETIC_BLADE_ATTACK, COMSIG_MOB_EQUIPPED_ITEM, COMSIG_MOB_DROPPED_ITEM)) + REMOVE_TRAIT(user, TRAIT_THERMAL_VISION, REF(src)) + user.update_sight() + var/datum/status_effect/heretic_passive/moon/moon_passive = user.has_status_effect(/datum/status_effect/heretic_passive/moon) + moon_passive?.amulet_equipped = FALSE + +/obj/item/clothing/neck/heretic_focus/moon_amulet/dropped(mob/living/user) + on_amulet_deactivate(user) + return ..() - if(hit.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND)) +/obj/item/clothing/neck/heretic_focus/moon_amulet/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers) + if(channel_amulet(user, target)) return + return ..() + +/obj/item/clothing/neck/heretic_focus/moon_amulet/proc/blade_channel(mob/living/attacker, mob/living/victim) + SIGNAL_HANDLER + channel_amulet(attacker, victim) + +/// Makes whoever the target is a bit more insane. If they are insane enough, they will be zombified into a moon zombie +/obj/item/clothing/neck/heretic_focus/moon_amulet/proc/channel_amulet(mob/user, atom/target) + + if(!isliving(user)) + return FALSE + var/mob/living/living_user = user + if(!IS_HERETIC_OR_MONSTER(living_user)) + living_user.balloon_alert(living_user, "you feel a presence watching you") + living_user.add_mood_event("Moon Amulet Insanity", /datum/mood_event/amulet_insanity) + living_user.mob_mood.adjust_sanity(-50) + return FALSE + if(!isliving(target)) + return FALSE + var/mob/living/living_target = target + + if(!ishuman(target)) + living_target.adjust_fire_loss(30) + return TRUE + var/mob/living/carbon/human/human_target = target + if(IS_HERETIC_OR_MONSTER(human_target)) + living_user.balloon_alert(living_user, "resists effects!") + return FALSE + if(human_target.has_status_effect(/datum/status_effect/moon_slept) || human_target.has_status_effect(/datum/status_effect/moon_converted)) + human_target.balloon_alert(living_user, "causing damage!") + human_target.adjust_organ_loss(ORGAN_SLOT_BRAIN, 25) + return FALSE + if(human_target.can_block_magic(MAGIC_RESISTANCE_MOON)) + return FALSE + if(!human_target.mob_mood) + return FALSE + if(human_target.mob_mood.sanity_level < sanity_threshold) + human_target.balloon_alert(living_user, "their mind is too strong!") + human_target.add_mood_event("Moon Amulet Insanity", /datum/mood_event/amulet_insanity) + human_target.mob_mood.adjust_sanity(-sanity_damage) + else + if(HAS_TRAIT(target, TRAIT_MINDSHIELD)) + human_target.balloon_alert(living_user, "their mind almost bends but something protects it!") + human_target.apply_status_effect(/datum/status_effect/moon_slept) + return TRUE + human_target.balloon_alert(living_user, "their mind bends to see the truth!") + human_target.apply_status_effect(/datum/status_effect/moon_converted) + living_user.log_message("made [human_target] insane.", LOG_GAME) + human_target.log_message("was driven insane by [living_user]", LOG_GAME) + return TRUE - if(!hit.mob_mood) +/// Modifies any blades that we equip while wearing the amulet +/obj/item/clothing/neck/heretic_focus/moon_amulet/proc/on_equip_item(mob/user, obj/item/blade, slot) + SIGNAL_HANDLER + if(!istype(blade, valid_weapon_type)) + return // We only care about modifying blades + if(slot & ITEM_SLOT_HANDS) + blade.force = 0 + blade.wound_bonus = 0 + blade.exposed_wound_bonus = 0 + blade.armour_penetration = 200 + RegisterSignal(blade, COMSIG_SEND_ITEM_ATTACK_MESSAGE_OBJECT, PROC_REF(modify_attack_message)) return + blade.force = initial(blade.force) + blade.wound_bonus = initial(blade.wound_bonus) + blade.exposed_wound_bonus = initial(blade.exposed_wound_bonus) + blade.armour_penetration = initial(blade.armour_penetration) + UnregisterSignal(blade, COMSIG_SEND_ITEM_ATTACK_MESSAGE_OBJECT) - if(hit.mob_mood.sanity_level > SANITY_LEVEL_UNSTABLE) - user.balloon_alert(user, "their mind is too strong!") - hit.add_mood_event("Moon Amulet Insanity", /datum/mood_event/amulet_insanity) - hit.mob_mood.adjust_sanity(-sanity_damage) - return ..() +/obj/item/clothing/neck/heretic_focus/moon_amulet/proc/modify_attack_message(obj/item/weapon, mob/living/victim, mob/living/attacker) + SIGNAL_HANDLER - user.balloon_alert(user, "their mind bends to see the truth!") - hit.apply_status_effect(/datum/status_effect/moon_converted) - user.log_message("made [target] insane.", LOG_GAME) - hit.log_message("was driven insane by [user]") - . = ..() + var/list/attack_list = list( + "You sweep [weapon] towards [victim], splitting [victim.p_Their()] image in two.", + "You strike [victim] with [weapon], spilling forth a cascade from within. Immaculate.", + "As it bite deep, your [weapon] unburdens [victim] of unneeded thought.", + ) + to_chat(attacker, span_danger(pick(attack_list))) + + var/list/victim_list = list( + "You are struck by [attacker], but the [weapon] tears away something more than parts of your body.", + "You see an arch of light as [attacker]'s [weapon] twists towards you, and you see the world briefly in tetrachrome.", + "As [attacker] carves into you with [weapon], you lose something deep within. The agony is worse than any wound.", + ) + to_chat(victim, span_userdanger(pick(victim_list))) + playsound(attacker, pick(possible_sounds), 40, TRUE) + return SIGNAL_MESSAGE_MODIFIED + +/// Modifies any blades that we drop while wearing the amulet +/obj/item/clothing/neck/heretic_focus/moon_amulet/proc/on_dropped_item(mob/user, obj/item/dropped_item) + SIGNAL_HANDLER + if(!istype(dropped_item, valid_weapon_type)) + return // We only care about modifying blades + dropped_item.force = initial(dropped_item.force) + dropped_item.wound_bonus = initial(dropped_item.wound_bonus) + dropped_item.exposed_wound_bonus = initial(dropped_item.exposed_wound_bonus) + dropped_item.armour_penetration = initial(dropped_item.armour_penetration) + UnregisterSignal(dropped_item, COMSIG_SEND_ITEM_ATTACK_MESSAGE_OBJECT) diff --git a/code/modules/antagonists/heretic/items/labyrinth_handbook.dm b/code/modules/antagonists/heretic/items/labyrinth_handbook.dm index 178b8b16da5b..b458a51a9c9a 100644 --- a/code/modules/antagonists/heretic/items/labyrinth_handbook.dm +++ b/code/modules/antagonists/heretic/items/labyrinth_handbook.dm @@ -2,14 +2,19 @@ name = "labyrinth pages" desc = "A field of papers flying in the air, repulsing heathens with impossible force." icon_state = "lintel" - initial_duration = 8 SECONDS + initial_duration = 15 SECONDS + +/obj/effect/forcefield/wizard/heretic/CanAllowThrough(atom/movable/mover, border_dir) + if(istype(mover.throwing?.get_thrower(), /obj/effect/forcefield/wizard/heretic)) + return TRUE + return ..() /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) + bumpee.safe_throw_at(throwtarget, 10, 10, src, 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 @@ -31,15 +36,21 @@ 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 + /// Current charges remaining + var/charges = 5 + /// Max possible amount of charges + var/max_charges = 5 + /// List that contains each timer for the charge + var/list/charge_timers = list() + /// How long before a charge is restored + var/charge_time = 15 SECONDS /obj/item/heretic_labyrinth_handbook/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.") + . += span_notice("It has [charges] charge\s remaining.") /obj/item/heretic_labyrinth_handbook/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(HAS_TRAIT(interacting_with, TRAIT_COMBAT_MODE_SKIP_INTERACTION)) @@ -51,11 +62,15 @@ if(ishuman(user)) 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.adjust_organ_loss(ORGAN_SLOT_BRAIN, 30, 190) human_user.add_mood_event("gates_of_mansus", /datum/mood_event/gates_of_mansus) human_user.dropItemToGround(src) return ITEM_INTERACT_BLOCKING + if(charges <= 0) + balloon_alert(user, "no charges!") + return ITEM_INTERACT_BLOCKING + var/turf/turf_target = get_turf(interacting_with) if(locate(barrier_type) in turf_target) user.balloon_alert(user, "already occupied!") @@ -64,8 +79,9 @@ new /obj/effect/temp_visual/paper_scatter(turf_target) playsound(turf_target, 'sound/effects/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) + charges-- + charge_timers.Add(addtimer(CALLBACK(src, PROC_REF(recharge)), charge_time, TIMER_STOPPABLE)) return ITEM_INTERACT_SUCCESS + +/obj/item/heretic_labyrinth_handbook/proc/recharge() + charges = min(charges+1, max_charges) diff --git a/code/modules/antagonists/heretic/items/madness_mask.dm b/code/modules/antagonists/heretic/items/madness_mask.dm index 1be99d41012f..b9721f0501b7 100644 --- a/code/modules/antagonists/heretic/items/madness_mask.dm +++ b/code/modules/antagonists/heretic/items/madness_mask.dm @@ -4,9 +4,10 @@ desc = "A mask created from suffering. When you look into its eyes, it looks back." icon_state = "mad_mask" inhand_icon_state = null + clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH | PEPPERPROOF + resistance_flags = LAVA_PROOF | FIRE_PROOF w_class = WEIGHT_CLASS_SMALL - flags_cover = MASKCOVERSEYES - resistance_flags = FLAMMABLE flags_inv = HIDEFACE|HIDEFACIALHAIR|HIDESNOUT ///Who is wearing this var/mob/living/carbon/human/local_user @@ -53,7 +54,7 @@ REMOVE_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) for(var/mob/living/carbon/human/human_in_range in view(local_user)) - if(IS_HERETIC_OR_MONSTER(human_in_range) || human_in_range.is_blind()) + if(IS_HERETIC_OR_MONSTER(human_in_range) || human_in_range.stat > SOFT_CRIT || human_in_range.is_blind()) continue if(human_in_range.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND)) @@ -67,9 +68,9 @@ if(SPT_PROB(40, seconds_per_tick)) human_in_range.set_jitter_if_lower(10 SECONDS) - if(human_in_range.getStaminaLoss() <= 85 && SPT_PROB(30, seconds_per_tick)) + if(human_in_range.get_stamina_loss() <= 85 && SPT_PROB(30, seconds_per_tick)) human_in_range.emote(pick("giggle", "laugh")) - human_in_range.adjustStaminaLoss(10) + human_in_range.adjust_stamina_loss(10) if(SPT_PROB(25, seconds_per_tick)) human_in_range.set_dizzy_if_lower(10 SECONDS) diff --git a/code/modules/antagonists/heretic/items/unfathomable_curio.dm b/code/modules/antagonists/heretic/items/unfathomable_curio.dm index 44af5f0acb15..f30af1fd32ea 100644 --- a/code/modules/antagonists/heretic/items/unfathomable_curio.dm +++ b/code/modules/antagonists/heretic/items/unfathomable_curio.dm @@ -65,16 +65,16 @@ return to_chat(wearer, span_warning("Laughter echoes in your mind....")) - wearer.adjustOrganLoss(ORGAN_SLOT_BRAIN, 40) + wearer.adjust_organ_loss(ORGAN_SLOT_BRAIN, 40) wearer.dropItemToGround(src, TRUE) - wearer.gain_trauma(pick(brain_traumas) ,TRAUMA_RESILIENCE_ABSOLUTE) + wearer.gain_trauma(pick(brain_traumas), TRAUMA_RESILIENCE_MAGIC) /obj/item/storage/belt/unfathomable_curio/examine(mob/living/carbon/user) . = ..() if(IS_HERETIC(user)) return - user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 160) + user.adjust_organ_loss(ORGAN_SLOT_BRAIN, 10, 160) user.adjust_temp_blindness(5 SECONDS) . += span_notice("It. It looked. IT WRAPS ITSELF AROUND ME.") diff --git a/code/modules/antagonists/heretic/knowledge/_heretic_paths.dm b/code/modules/antagonists/heretic/knowledge/_heretic_paths.dm index 5e3583e14b38..5890e459c162 100644 --- a/code/modules/antagonists/heretic/knowledge/_heretic_paths.dm +++ b/code/modules/antagonists/heretic/knowledge/_heretic_paths.dm @@ -1,199 +1,387 @@ -//Global typecache of all heretic knowledges -> instantiate the tree columns -> make them link themselves -> replace the old heretic stuff -//heretic research tree is a directional graph so we can use some basic graph stuff to make internally handling it easier -GLOBAL_LIST(heretic_research_tree) +/// Assoc list of heretic_route.path string -> list of knowledges in that path, see generate_heretic_path() in code/modules/antagonists/heretic/knowledge/_heretic_paths.dm +GLOBAL_LIST(heretic_path_knowledges) +GLOBAL_LIST_INIT(heretic_path_datums, init_heretic_path_datums()) + +/proc/init_heretic_path_datums() + var/list/paths = list() + for(var/datum/heretic_knowledge_tree_column/column_path as anything in subtypesof(/datum/heretic_knowledge_tree_column)) + if(initial(column_path.abstract_parent_type) == column_path) + continue + var/datum/heretic_knowledge_tree_column/heretic_route = new column_path() + paths[heretic_route.route] += heretic_route + return paths -//HKT = Heretic Knowledge Tree (Heretic Research Tree :3) these objects really only exist for a short period of time at startup and then get deleted /datum/heretic_knowledge_tree_column - ///Route that symbolizes what path this is - var/route + ///Route that symbolizes what path this is, MUST be unique between paths + var/route = PATH_START + var/icon_state = "dark_blade" + /* + * Complexity grades: + * Easy = COLOR_GREEN + * Medium = COLOR_YELLOW + * Hard = COLOR_RED + */ + var/complexity = "Insane" + var/complexity_color = COLOR_WHITE + var/list/icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "dark_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + var/list/description = list("A heretic knowledge tree column, used to define a path of knowledge.") + var/list/pros = list("Is bad", "Is very bad", "Is extremely bad") + var/list/cons = list("Smells bad", "Looks bad", "Tastes bad") + var/list/tips = list("Don't use it", "Don't touch it", "Don't look at it") ///Used to determine if this is a side path or a main path var/abstract_parent_type = /datum/heretic_knowledge_tree_column - ///IDs od neighbours (to left and right) - var/neighbour_type_left - var/neighbour_type_right - ///Tier1 knowledge (or knowledges) - var/tier1 - ///Tier2 knowledge (or knowledges) - var/tier2 - ///Tier3 knowledge (or knowledges) - var/tier3 ///UI background - var/ui_bgr = "node_side" - -/datum/heretic_knowledge_tree_column/main - abstract_parent_type = /datum/heretic_knowledge_tree_column/main - - ///Starting knowledge - first thing you pick - var/start - ///Grasp upgrade - var/grasp - ///Mark upgrade - var/mark - ///Unique ritual of knoweldge - var/ritual_of_knowledge - ///Path specific unique ability - var/unique_ability + var/ui_bgr = BGR_SIDE + + //-- Knowledge in order of unlocking + ///Starting knowledge - first thing you pick. Gives you access to blades, grasp, mark and passive + var/datum/heretic_knowledge/limited_amount/starting/start + ///Tier1 knowledge + var/knowledge_tier1 + ///Tier2 knowledge + var/knowledge_tier2 + ///Path-Specific Heretic robes + var/robes + ///Tier3 knowledge + var/knowledge_tier3 ///Blade upgrade var/blade + ///Tier4 knowledge + var/knowledge_tier4 ///Ascension var/ascension + // Drafting system, if a path has any side-knowledge that is guaranteed to be one of the options + /// Knowledge guaranteed to show up in the first draft + var/guaranteed_side_tier1 + /// Knowledge guaranteed to show up in the second draft + var/guaranteed_side_tier2 + /// Knowledge guaranteed to show up in the third draft + var/guaranteed_side_tier3 + + +/datum/heretic_knowledge_tree_column/proc/get_ui_data(datum/antagonist/heretic/our_heretic, category) + var/list/power_info = our_heretic.heretic_shops[category] + var/list/data = list( + "route" = route, + "icon" = icon.Copy(), + "complexity" = complexity, + "complexity_color" = complexity_color, + "description" = description.Copy(), + "pros" = pros.Copy(), + "cons" = cons.Copy(), + "tips" = tips.Copy(), + "starting_knowledge" = our_heretic.get_knowledge_data(start, power_info), + ) + + data["preview_abilities"] = list( + our_heretic.get_knowledge_data(knowledge_tier1, power_info, category = category), + our_heretic.get_knowledge_data(knowledge_tier2, power_info, category = category), + our_heretic.get_knowledge_data(knowledge_tier3, power_info, category = category), + our_heretic.get_knowledge_data(knowledge_tier4, power_info, category = category), + ) + + var/datum/status_effect/heretic_passive/passive = new start.eldritch_passive() + data["passive"] = list( + "name" = initial(passive.name), + "description" = passive.passive_descriptions.Copy(), + ) + qdel(passive) + + return data + + +/** + * Modifies the 2 lists provided in the arguments and sets it up so the heretic can actually start researching stuff. + * Specifically generates the tier 1-4 knowledges + start ones for each path as well for the preview (should probably be moved to use the actual list of per-path researches) + * Importantly, this adds HKT_NEXT's for the starting knowledges so the heretic's next researches are considered valid +**/ +/proc/generate_heretic_starting_knowledge(list/starting_knowledges = list()) + for(var/knowledge in GLOB.heretic_start_knowledge) + starting_knowledges[knowledge] = make_knowledge_entry(knowledge, null, HERETIC_KNOWLEDGE_START) + + var/list/start_knowledges = list() + var/list/start_knowledge_ids = list() + for(var/route in GLOB.heretic_path_datums) + var/datum/heretic_knowledge_tree_column/column_path = GLOB.heretic_path_datums[route] + var/start_knowledge = column_path::start + // why aren't the tiered knowledges in a list?!?!? (initial() probably) + var/t1_knowledge = column_path::knowledge_tier1 + var/t2_knowledge = column_path::knowledge_tier2 + var/t3_knowledge = column_path::knowledge_tier3 + var/t4_knowledge = column_path::knowledge_tier4 + starting_knowledges[start_knowledge] = make_knowledge_entry(start_knowledge, column_path, HERETIC_KNOWLEDGE_START, HKT_DEPTH_START) + starting_knowledges[t1_knowledge] = make_knowledge_entry(t1_knowledge, column_path, HERETIC_KNOWLEDGE_START, HKT_DEPTH_TIER_1) + starting_knowledges[t2_knowledge] = make_knowledge_entry(t2_knowledge, column_path, HERETIC_KNOWLEDGE_START, HKT_DEPTH_TIER_2) + starting_knowledges[t3_knowledge] = make_knowledge_entry(t3_knowledge, column_path, HERETIC_KNOWLEDGE_START, HKT_DEPTH_TIER_3) + starting_knowledges[t4_knowledge] = make_knowledge_entry(t4_knowledge, column_path, HERETIC_KNOWLEDGE_START, HKT_DEPTH_TIER_4) + // start the HKT_NEXT chain here + starting_knowledges[/datum/heretic_knowledge/spell/basic][HKT_NEXT] += starting_knowledges[start_knowledge][HKT_ID] + // notably, the heretic's tree isn't yet generated so we have to generate the ID here instead of fetching it, hopefully this doesn't break + starting_knowledges[start_knowledge][HKT_NEXT] += make_knowledge_id(t1_knowledge, HERETIC_KNOWLEDGE_TREE) + start_knowledges += start_knowledge + start_knowledge_ids += starting_knowledges[start_knowledge][HKT_ID] + + // make sure to prevent starting on other paths + for(var/knowledge_path in start_knowledges) + var/list/target_knowledge = starting_knowledges[knowledge_path] + target_knowledge[HKT_BAN] += start_knowledge_ids - target_knowledge[HKT_ID] + +//TODO: use this to generate the globallist +/datum/antagonist/heretic/proc/generate_heretic_research_tree() + if(!heretic_path) + stack_trace("somehow called generate_heretic_research_tree with a falsey heretic_path") + return + if(!length(GLOB.heretic_path_knowledges)) + GLOB.heretic_path_knowledges = generate_global_heretic_tree() + var/list/selected_route = GLOB.heretic_path_knowledges[heretic_path.route] + if(!selected_route) + stack_trace("called generate_heretic_research_tree with a invalid heretic_path.route") + return + heretic_shops[HERETIC_KNOWLEDGE_TREE] = deep_copy_list_alt(selected_route) + +/proc/generate_global_heretic_tree() + var/heretic_research_tree = list() + for(var/path in GLOB.heretic_path_datums) + var/datum/heretic_knowledge_tree_column/heretic_route = GLOB.heretic_path_datums[path] + heretic_research_tree[path] = generate_heretic_path(heretic_route) + if(!length(heretic_research_tree)) + CRASH("Somehow generated an empty heretic research tree, this should never happen.") + return heretic_research_tree -/proc/generate_heretic_research_tree() +/proc/make_knowledge_entry(datum/heretic_knowledge/knowledge, datum/heretic_knowledge_tree_column/path, category = HERETIC_KNOWLEDGE_TREE, depth = 1, cost = -1) + return list( + HKT_NEXT = list(), + HKT_BAN = list(), + HKT_DEPTH = depth, + HKT_PURCHASED_DEPTH = 0, + HKT_UI_BGR = path ? path::ui_bgr : BGR_SIDE, + HKT_COST = cost != -1 ? cost : knowledge::cost, + HKT_ROUTE = path ? path::route : null, + HKT_CATEGORY = category, + HKT_ID = make_knowledge_id(knowledge, category), + ) + +/// ID's are not unique, the same knowledge with the same type in the same shop will always have the same ID. +/proc/make_knowledge_id(datum/heretic_knowledge/knowledge, shop_category = HERETIC_KNOWLEDGE_TREE) + var/type_string = replacetext("[knowledge::type]", "/", "", 1, 2) + var/our_type = replacetext(type_string, "/", "_") + return "[shop_category]/[our_type]" + +/proc/generate_heretic_path(datum/heretic_knowledge_tree_column/heretic_path) var/list/heretic_research_tree = list() - //Initialize the data structure - for(var/type in subtypesof(/datum/heretic_knowledge)) - heretic_research_tree[type] = list() - heretic_research_tree[type][HKT_NEXT] = list() - heretic_research_tree[type][HKT_BAN] = list() - heretic_research_tree[type][HKT_DEPTH] = 1 - heretic_research_tree[type][HKT_UI_BGR] = "node_side" - - var/datum/heretic_knowledge/knowledge = type - if(initial(knowledge.is_starting_knowledge)) - heretic_research_tree[type][HKT_ROUTE] = PATH_START - continue - - heretic_research_tree[type][HKT_ROUTE] = null - - var/list/paths = list() - for(var/type in subtypesof(/datum/heretic_knowledge_tree_column)) - var/datum/heretic_knowledge_tree_column/column_path = type - if(initial(column_path.abstract_parent_type) == column_path) - continue - - var/datum/heretic_knowledge_tree_column/column = new type() - paths[column.type] = column - - var/list/start_blacklist = list() - var/list/grasp_blacklist = list() - var/list/mark_blacklist = list() - var/list/blade_blacklist = list() - var/list/asc_blacklist = list() + var/list/tree_paths = list() + + tree_paths += list( + heretic_path.knowledge_tier1, + heretic_path.knowledge_tier2, + heretic_path.knowledge_tier3, + heretic_path.knowledge_tier4, + heretic_path.robes, + heretic_path.blade, + heretic_path.ascension, + ) + + for(var/datum/heretic_knowledge/type as anything in tree_paths) + heretic_research_tree[type] = make_knowledge_entry(type, heretic_path, depth = 1) + + var/knowledge_tier1 = heretic_path.knowledge_tier1 + var/knowledge_tier2 = heretic_path.knowledge_tier2 + var/knowledge_tier3 = heretic_path.knowledge_tier3 + var/knowledge_tier4 = heretic_path.knowledge_tier4 + + //horizontal (two way) + heretic_research_tree[knowledge_tier1][HKT_DEPTH] = HKT_DEPTH_TIER_1 + heretic_research_tree[knowledge_tier1][HKT_NEXT] += heretic_research_tree[knowledge_tier2][HKT_ID] + + heretic_research_tree[knowledge_tier2][HKT_DEPTH] = HKT_DEPTH_TIER_2 + heretic_research_tree[knowledge_tier2][HKT_NEXT] += heretic_research_tree[heretic_path.robes][HKT_ID] + + heretic_research_tree[knowledge_tier3][HKT_DEPTH] = HKT_DEPTH_TIER_3 + heretic_research_tree[knowledge_tier3][HKT_NEXT] += heretic_research_tree[heretic_path.blade][HKT_ID] + heretic_research_tree[heretic_path.robes][HKT_NEXT] += heretic_research_tree[knowledge_tier3][HKT_ID] + + heretic_research_tree[knowledge_tier4][HKT_DEPTH] = HKT_DEPTH_TIER_4 + heretic_research_tree[heretic_path.blade][HKT_NEXT] += heretic_research_tree[knowledge_tier4][HKT_ID] + heretic_research_tree[knowledge_tier4][HKT_NEXT] += heretic_research_tree[heretic_path.ascension][HKT_ID] + + //depth stuff + heretic_research_tree[heretic_path.robes][HKT_DEPTH] = HKT_DEPTH_ROBES + heretic_research_tree[heretic_path.blade][HKT_DEPTH] = HKT_DEPTH_ARMOR + heretic_research_tree[heretic_path.ascension][HKT_DEPTH] = HKT_DEPTH_ASCENSION + //and we're done + return heretic_research_tree - for(var/id in paths) - if(!istype(paths[id],/datum/heretic_knowledge_tree_column/main)) +/** + * Each heretic has a few drafted knowledges within their heretic knowledge tree. + * This is not during the knowledge tree creation because we want to know what path our heretic picks so we filter out dupe knowledges. + * Also generates shop knowledges as their validation is shared. + * Modifies shop_list and final_draft that are provided in the arguments. + */ +/proc/determine_drafted_knowledge(route, list/tree = list(), list/shop = list(), list/final_draft = list()) + if(!route) + stack_trace("somehow called determine_drafted_knowledge with a falsey current_path") + return + var/list/heretic_research_tree = tree + var/datum/heretic_knowledge_tree_column/heretic_path = GLOB.heretic_path_datums[route] + + /// costs by index mapped to depth + var/list/shop_costs = list(1, 2, 2, 2, 3) + + // Relevant variables that we pull from the path + var/knowledge_tier1 = heretic_path.knowledge_tier1 + var/knowledge_tier2 = heretic_path.knowledge_tier2 + var/knowledge_tier3 = heretic_path.knowledge_tier3 + var/knowledge_tier4 = heretic_path.knowledge_tier4 + + var/list/path_knowledges = list( + knowledge_tier1, + knowledge_tier2, + knowledge_tier3, + knowledge_tier4, + ) + + // Every path can have a guaranteed option that will show up in the first 3 drafts (Otherwise we just run as normal) + var/datum/heretic_knowledge/guaranteed_draft_t1 = heretic_path.guaranteed_side_tier1 + var/datum/heretic_knowledge/guaranteed_draft_t2 = heretic_path.guaranteed_side_tier2 + var/datum/heretic_knowledge/guaranteed_draft_t3 = heretic_path.guaranteed_side_tier3 + + var/list/guaranteed_drafts = list( + guaranteed_draft_t1, + guaranteed_draft_t2, + guaranteed_draft_t3, + ) + + var/list/shop_unlock_order = list( + knowledge_tier1, + knowledge_tier2, + heretic_path.robes, + knowledge_tier3, + knowledge_tier4, + ) + + var/list/draft_ineligible = path_knowledges.Copy() + draft_ineligible += guaranteed_drafts + + var/list/elligible_knowledge = list() + var/list/shop_knowledge = list() + for(var/tier in 1 to HERETIC_DRAFT_TIER_MAX) + elligible_knowledge += list(list()) + shop_knowledge += list(list()) + + for(var/datum/heretic_knowledge/potential_type as anything in subtypesof(/datum/heretic_knowledge)) + if(potential_type::drafting_tier == 0) continue - var/datum/heretic_knowledge_tree_column/main/column = paths[id] - - start_blacklist += column.start - grasp_blacklist += column.grasp - mark_blacklist += column.mark - blade_blacklist += column.blade - asc_blacklist += column.ascension - - heretic_research_tree[/datum/heretic_knowledge/spell/basic][HKT_NEXT] += start_blacklist - - for(var/id in paths) - var/datum/heretic_knowledge_tree_column/this_column = paths[id] - var/datum/heretic_knowledge_tree_column/neighbour_0 = paths[this_column.neighbour_type_left] - var/datum/heretic_knowledge_tree_column/neighbour_1 = paths[this_column.neighbour_type_right] - //horizontal (two way) - var/list/tier1 = this_column.tier1 - var/list/tier2 = this_column.tier2 - var/list/tier3 = this_column.tier3 - - //Tier1, 2 and 3 can technically be lists so we handle them here - if(!islist(this_column.tier1)) - tier1 = list(this_column.tier1) - - if(!islist(this_column.tier2)) - tier2 = list(this_column.tier2) - - if(!islist(this_column.tier3)) - tier3 = list(this_column.tier3) - - for(var/t1_knowledge in tier1) - heretic_research_tree[t1_knowledge][HKT_NEXT] += neighbour_0.tier1 - heretic_research_tree[t1_knowledge][HKT_NEXT] += neighbour_1.tier1 - heretic_research_tree[t1_knowledge][HKT_ROUTE] = this_column.route - heretic_research_tree[t1_knowledge][HKT_UI_BGR] = this_column.ui_bgr - heretic_research_tree[t1_knowledge][HKT_DEPTH] = 4 - - for(var/t2_knowledge in tier2) - heretic_research_tree[t2_knowledge][HKT_NEXT] += neighbour_0.tier2 - heretic_research_tree[t2_knowledge][HKT_NEXT] += neighbour_1.tier2 - heretic_research_tree[t2_knowledge][HKT_ROUTE] = this_column.route - heretic_research_tree[t2_knowledge][HKT_UI_BGR] = this_column.ui_bgr - heretic_research_tree[t2_knowledge][HKT_DEPTH] = 8 - - for(var/t3_knowledge in tier3) - heretic_research_tree[t3_knowledge][HKT_NEXT] += neighbour_0.tier3 - heretic_research_tree[t3_knowledge][HKT_NEXT] += neighbour_1.tier3 - heretic_research_tree[t3_knowledge][HKT_ROUTE] = this_column.route - heretic_research_tree[t3_knowledge][HKT_UI_BGR] = this_column.ui_bgr - heretic_research_tree[t3_knowledge][HKT_DEPTH] = 10 - - //Everything below this line is considered to be a "main path" and not a side path - //Since we are handling the heretic research tree column by column this is required - if(this_column.abstract_parent_type != /datum/heretic_knowledge_tree_column/main) + // Don't add the knowledge if it's obtainable later in the path + if(is_path_in_list(potential_type, draft_ineligible)) continue - - var/datum/heretic_knowledge_tree_column/main/main_column = this_column - //vertical (one way) - heretic_research_tree[/datum/heretic_knowledge/spell/basic] += main_column.start - heretic_research_tree[main_column.start][HKT_NEXT] += main_column.grasp - heretic_research_tree[main_column.grasp][HKT_NEXT] += main_column.tier1 - //t1 handling - for(var/t1_knowledge in tier1) - heretic_research_tree[t1_knowledge][HKT_NEXT] += main_column.mark - - heretic_research_tree[main_column.mark][HKT_NEXT] += main_column.ritual_of_knowledge - heretic_research_tree[main_column.ritual_of_knowledge][HKT_NEXT] += main_column.unique_ability - heretic_research_tree[main_column.unique_ability][HKT_NEXT] += main_column.tier2 - //t2 handling - for(var/t2_knowledge in tier2) - heretic_research_tree[t2_knowledge][HKT_NEXT] += main_column.blade - - heretic_research_tree[main_column.blade][HKT_NEXT] += main_column.tier3 - //t3 handling - for(var/t3_knowledge in tier3) - heretic_research_tree[t3_knowledge][HKT_NEXT] += main_column.ascension - - //blacklist - heretic_research_tree[main_column.start][HKT_BAN] += (start_blacklist - main_column.start) + (asc_blacklist - main_column.ascension) - heretic_research_tree[main_column.grasp][HKT_BAN] += (grasp_blacklist - main_column.grasp) - heretic_research_tree[main_column.mark][HKT_BAN] += (mark_blacklist - main_column.mark) - heretic_research_tree[main_column.blade][HKT_BAN] += (blade_blacklist - main_column.blade) - - //route stuff - heretic_research_tree[main_column.start][HKT_ROUTE] = main_column.route - heretic_research_tree[main_column.grasp][HKT_ROUTE] = main_column.route - heretic_research_tree[main_column.mark][HKT_ROUTE] = main_column.route - heretic_research_tree[main_column.ritual_of_knowledge][HKT_ROUTE] = main_column.route - heretic_research_tree[main_column.unique_ability][HKT_ROUTE] = main_column.route - heretic_research_tree[main_column.blade][HKT_ROUTE] = main_column.route - heretic_research_tree[main_column.ascension][HKT_ROUTE] = main_column.route - - heretic_research_tree[main_column.start][HKT_UI_BGR] = main_column.ui_bgr - heretic_research_tree[main_column.grasp][HKT_UI_BGR] = main_column.ui_bgr - heretic_research_tree[main_column.mark][HKT_UI_BGR] = main_column.ui_bgr - heretic_research_tree[main_column.ritual_of_knowledge][HKT_UI_BGR] = main_column.ui_bgr - heretic_research_tree[main_column.unique_ability][HKT_UI_BGR] = main_column.ui_bgr - heretic_research_tree[main_column.blade][HKT_UI_BGR] = main_column.ui_bgr - heretic_research_tree[main_column.ascension][HKT_UI_BGR] = main_column.ui_bgr - //depth stuff - heretic_research_tree[main_column.start][HKT_DEPTH] = 2 - heretic_research_tree[main_column.grasp][HKT_DEPTH] = 3 - heretic_research_tree[main_column.mark][HKT_DEPTH] = 5 - heretic_research_tree[main_column.ritual_of_knowledge][HKT_DEPTH] = 6 - heretic_research_tree[main_column.unique_ability][HKT_DEPTH] = 7 - heretic_research_tree[main_column.blade][HKT_DEPTH] = 9 - heretic_research_tree[main_column.ascension][HKT_DEPTH] = 11 - - //Per path bullshit goes here \/\/\/ - for(var/t2_knowledge in tier2) - heretic_research_tree[t2_knowledge][HKT_NEXT] += /datum/heretic_knowledge/reroll_targets - - // If you want to do any custom bullshit put it here \/\/\/ - heretic_research_tree[/datum/heretic_knowledge/reroll_targets][HKT_ROUTE] = PATH_SIDE - heretic_research_tree[/datum/heretic_knowledge/reroll_targets][HKT_DEPTH] = 8 - - heretic_research_tree[/datum/heretic_knowledge/rifle][HKT_NEXT] += /datum/heretic_knowledge/rifle_ammo - heretic_research_tree[/datum/heretic_knowledge/rifle_ammo][HKT_ROUTE] = PATH_SIDE - heretic_research_tree[/datum/heretic_knowledge/rifle_ammo][HKT_DEPTH] = heretic_research_tree[/datum/heretic_knowledge/rifle][HKT_DEPTH] - - //and we're done - QDEL_LIST_ASSOC_VAL(paths) - return heretic_research_tree + if(!potential_type::is_shop_only) + elligible_knowledge[potential_type::drafting_tier] += potential_type + shop_knowledge[potential_type::drafting_tier] += potential_type + + var/list/drafts = list( + list( + "parent_knowledge" = knowledge_tier1, + "guaranteed_knowledge" = guaranteed_draft_t1, + "probabilities" = list("1" = 50, "2" = 50, "3" = 0, "4" = 0, "5" = 0), + HKT_DEPTH = HKT_DEPTH_DRAFT_1, + ), + list( + "parent_knowledge" = knowledge_tier2, + "guaranteed_knowledge" = guaranteed_draft_t2, + "probabilities" = list("1" = 50, "2" = 25, "3" = 25, "4" = 0, "5" = 0), + HKT_DEPTH = HKT_DEPTH_DRAFT_2, + ), + list( + "parent_knowledge" = knowledge_tier3, + "guaranteed_knowledge" = guaranteed_draft_t3, + "probabilities" = list("1" = 20, "2" = 20, "3" = 20, "4" = 20, "5" = 20), + HKT_DEPTH = HKT_DEPTH_DRAFT_3, + ), + list( + "parent_knowledge" = knowledge_tier4, + "probabilities" = list("1" = 0, "2" = 0, "3" = 0, "4" = 0, "5" = 100), + HKT_DEPTH = HKT_DEPTH_DRAFT_4, + ) + ) + /// generate 3 drafts for each draft tier, while banning you from picking multiple drafts + for(var/draft in drafts) + var/parent_knowledge_path = draft["parent_knowledge"] + var/datum/heretic_knowledge/guaranteed_draft = draft["guaranteed_knowledge"] + var/list/probabilities = draft["probabilities"] + var/depth = draft[HKT_DEPTH] + var/list/draft_blacklist = list() + + for(var/cycle in 1 to 3) + var/datum/heretic_knowledge/selected_knowledge + if(guaranteed_draft && cycle == 1) + selected_knowledge = guaranteed_draft + var/shop_tier = shop_knowledge[guaranteed_draft::drafting_tier] + if(shop_tier && !(guaranteed_draft in shop_tier)) + shop_tier += guaranteed_draft + else + // rng kinda not correct but like, whatever + var/chosen_tier = min(text2num(pick_weight(probabilities)), length(elligible_knowledge)) + var/list/picked_tier = elligible_knowledge[chosen_tier] + selected_knowledge = pick_n_take(picked_tier) + + if(!length(picked_tier)) + elligible_knowledge.Cut(chosen_tier, chosen_tier + 1) + + if(isnull(selected_knowledge)) + stack_trace("Failed to select a knowledge for heretic path [heretic_path] at depth [depth]. This should never happen.") + continue + + final_draft[selected_knowledge] = make_knowledge_entry( + selected_knowledge, + null, + HERETIC_KNOWLEDGE_DRAFT, + depth, + 0, + ) + final_draft[selected_knowledge][HKT_PURCHASED_DEPTH] = selected_knowledge::drafting_tier + var/draft_id = final_draft[selected_knowledge][HKT_ID] + draft_blacklist[selected_knowledge] = draft_id + heretic_research_tree[parent_knowledge_path][HKT_NEXT] |= draft_id + + var/list/blacklist_ids = assoc_to_values(draft_blacklist) + for(var/blacklist_path in draft_blacklist) + var/id = draft_blacklist[blacklist_path] + final_draft[blacklist_path][HKT_BAN] += (blacklist_ids - id) + + // all possible drafts are added to the shop, this time with costs + for(var/drafting_tier in 1 to length(shop_knowledge)) + var/unlocked_by = shop_unlock_order[drafting_tier] + var/list/eligible_tier = shop_knowledge[drafting_tier] + for(var/knowledge_type in eligible_tier) + shop[knowledge_type] = make_knowledge_entry( + knowledge_type, + null, + HERETIC_KNOWLEDGE_SHOP, + drafting_tier, + shop_costs[drafting_tier], + ) + var/shop_id = shop[knowledge_type][HKT_ID] + heretic_research_tree[unlocked_by][HKT_NEXT] |= shop_id + // ban the corresponding same knowledge from the final draft to prevent duplicates + var/found = final_draft[knowledge_type] + if(!found) + continue + found[HKT_BAN] |= shop_id + + var/gun_path = /datum/heretic_knowledge/rifle + var/ammo_path = /datum/heretic_knowledge/rifle_ammo + shop[ammo_path] = make_knowledge_entry(ammo_path, null, HERETIC_KNOWLEDGE_SHOP, 2) + var/ammo_id = shop[ammo_path][HKT_ID] + shop[gun_path][HKT_NEXT] |= ammo_id + + var/already_in = final_draft[gun_path] + if(already_in) + already_in[HKT_NEXT] |= ammo_id diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index 9d657c7b3e72..6579c857b8db 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -1,19 +1,50 @@ - -/datum/heretic_knowledge_tree_column/main/ash - neighbour_type_left = /datum/heretic_knowledge_tree_column/cosmic_to_ash - neighbour_type_right = /datum/heretic_knowledge_tree_column/ash_to_moon - +/datum/heretic_knowledge_tree_column/ash route = PATH_ASH ui_bgr = "node_ash" + complexity = "Easy" + complexity_color = COLOR_GREEN + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "ash_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Ash revolves around fire, mobility and brutal crowd control against single opponents.", + "Play this path if you are new to Heretic, or really enjoy hit and run playstyles.", + ) + pros = list( + "Very potent even from the beginning of the path.", + "Easy access to a mobility spells and expanded vision.", + "Very powerful mark effect.", + ) + cons = list( + "Has less power than most heretics beyond their starting abilities.", + "Lacks durability in long conflicts.", + "Reliant on hitting fast and hard before their opponents can mount proper countermeasures.", + ) + tips = list( + "Your Mansus Grasp applies a short blind and a mark that puts your opponent into stamina crit when triggered by your blade. The mark can spread to nearby opponents.", + "Selecting this path makes you immune to high temperature damage. Remember, however, that your clothes can still burn! If you want to protect yourself from your own fire, wear a Scorched Mantle.", + "Your Scorched Mantle will cause you to generate firestacks on your own body (Make sure you toggle the effect!). Upon reaching 5 fire stacks, your ashen spells will be empowered (indicated by your spells being highlighted in green).", + "Your Ashen passage is a short cooldown jaunt capable of removing restraints. If empowered, it gains a longer jaunt time, and also will remove stuns and stamina crit.", + "Volcano blast can make short work of your enemies, should they be foolish enough to stick close to each other. If empowered, it will have no cast time and generate twice the amount of firestacks. Burn the heathens to ashes!", + "Do not neglect the Mask of Madness. It will slowly sap the stamina of your enemies and make them hallucinate.", + "Make sure to set as many enemies on fire as you possibly can! Nightwatcher's Rebirth will heal you and have its cooldown reduced based on how many mobs you siphon.", + "Your ascension grants you complete immunity to environmental hazards, including bombs! But you are still vulnerable to more conventional weaponry. Do not become overconfident.", + ) + start = /datum/heretic_knowledge/limited_amount/starting/base_ash - grasp = /datum/heretic_knowledge/ashen_grasp - tier1 = /datum/heretic_knowledge/spell/ash_passage - mark = /datum/heretic_knowledge/mark/ash_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/ash - unique_ability = /datum/heretic_knowledge/spell/fire_blast - tier2 = /datum/heretic_knowledge/mad_mask + knowledge_tier1 = /datum/heretic_knowledge/spell/ash_passage + guaranteed_side_tier1 = /datum/heretic_knowledge/medallion + knowledge_tier2 = /datum/heretic_knowledge/spell/fire_blast + guaranteed_side_tier2 = /datum/heretic_knowledge/rifle + robes = /datum/heretic_knowledge/armor/ash + knowledge_tier3 = /datum/heretic_knowledge/mad_mask + guaranteed_side_tier3 = /datum/heretic_knowledge/summon/ashy blade = /datum/heretic_knowledge/blade_upgrade/ash - tier3 = /datum/heretic_knowledge/spell/flame_birth + knowledge_tier4 = /datum/heretic_knowledge/spell/flame_birth ascension = /datum/heretic_knowledge/ultimate/ash_final /datum/heretic_knowledge/limited_amount/starting/base_ash @@ -29,24 +60,11 @@ result_atoms = list(/obj/item/melee/sickly_blade/ash) research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "ash_blade" + mark_type = /datum/status_effect/eldritch/ash + eldritch_passive = /datum/status_effect/heretic_passive/ash -/datum/heretic_knowledge/ashen_grasp - name = "Grasp of Ash" - desc = "Your Mansus Grasp will burn the eyes of the victim, damaging them and blurring their vision." - gain_text = "The Nightwatcher was the first of them, his treason started it all. \ - Their lantern, expired to ash - their watch, absent." - cost = 1 - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_ash" - -/datum/heretic_knowledge/ashen_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) - -/datum/heretic_knowledge/ashen_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK) - -/datum/heretic_knowledge/ashen_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER +/datum/heretic_knowledge/limited_amount/starting/base_ash/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() if(target.is_blind()) return @@ -55,30 +73,10 @@ return to_chat(target, span_danger("A bright green light burns your eyes horrifically!")) - target.adjustOrganLoss(ORGAN_SLOT_EYES, 15) + target.adjust_organ_loss(ORGAN_SLOT_EYES, 15) target.set_eye_blur_if_lower(20 SECONDS) -/datum/heretic_knowledge/spell/ash_passage - name = "Ashen Passage" - desc = "Grants you Ashen Passage, a spell that lets you phase out of reality and traverse a short distance, passing though any walls." - gain_text = "He knew how to walk between the planes." - - action_to_add = /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash - cost = 1 - - -/datum/heretic_knowledge/mark/ash_mark - name = "Mark of Ash" - desc = "Your Mansus Grasp now applies the Mark of Ash. The mark is triggered from an attack with your Ashen Blade. \ - When triggered, the victim takes additional stamina and burn damage, and the mark is transferred to a nearby heathen. \ - Damage dealt is decreased with each transfer. \ - Triggering the mark will also greatly reduce the cooldown of your Mansus Grasp." - gain_text = "He was a very particular man, always watching in the dead of night. \ - But in spite of his duty, he regularly tranced through the Manse with his blazing lantern held high. \ - He shone brightly in the darkness, until the blaze begin to die." - mark_type = /datum/status_effect/eldritch/ash - -/datum/heretic_knowledge/mark/ash_mark/trigger_mark(mob/living/source, mob/living/target) +/datum/heretic_knowledge/limited_amount/starting/base_ash/trigger_mark(mob/living/source, mob/living/target) . = ..() if(!.) return @@ -89,20 +87,41 @@ grasp.next_use_time -= round(grasp.cooldown_time*0.75) grasp.build_all_button_icons() -/datum/heretic_knowledge/knowledge_ritual/ash - +/datum/heretic_knowledge/spell/ash_passage + name = "Ashen Passage" + desc = "Grants you Ashen Passage, a spell that lets you phase out of reality, allowing you to traverse a short distance, passing though any walls. \ + When empowered, it will break you out of any stuns and restraints, and will have a longer range." + gain_text = "He knew how to walk between the planes." + action_to_add = /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash + cost = 2 + drafting_tier = 5 /datum/heretic_knowledge/spell/fire_blast name = "Volcano Blast" desc = "Grants you Volcano Blast, a spell that - after a short charge - fires off a beam of energy \ at a nearby enemy, setting them on fire and burning them. If they do not extinguish themselves, \ - the beam will continue to another target." + the beam will continue to another target. \ + When empowered, has instant cast time and blasts enemies with more flames." gain_text = "No fire was hot enough to rekindle them. No fire was bright enough to save them. No fire is eternal." action_to_add = /datum/action/cooldown/spell/charged/beam/fire_blast - cost = 1 + cost = 2 research_tree_icon_frame = 7 +/datum/heretic_knowledge/armor/ash + desc = "Allows you to transmute a table (or a suit), a mask and a match to create a scorched mantle. \ + It provides completes protection from fire, and is able to produce more flames passively. \ + When you have enough fire, you may cast empowered versions of your ashen spells. \ + Acts as a focus while hooded." + gain_text = "The Watch remain as they fell, crumbling away from sight. \ + Yet the winds blowing through the city call them back to service, dust kicked into the air, a drifting silhouette of the fallen." + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash) + research_tree_icon_state = "ash_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + /obj/item/match = 1, + ) /datum/heretic_knowledge/mad_mask name = "Mask of Madness" @@ -117,7 +136,7 @@ /obj/item/flashlight/flare/candle = 4, ) result_atoms = list(/obj/item/clothing/mask/madness_mask) - cost = 1 + cost = 2 research_tree_icon_path = 'icons/obj/clothing/masks.dmi' research_tree_icon_state = "mad_mask" @@ -146,8 +165,9 @@ gain_text = "The fire was inescapable, and yet, life remained in his charred body. \ The Nightwatcher was a particular man, always watching." action_to_add = /datum/action/cooldown/spell/aoe/fiery_rebirth - cost = 1 + cost = 2 research_tree_icon_frame = 5 + is_final_knowledge = TRUE /datum/heretic_knowledge/ultimate/ash_final name = "Ashlord's Rite" diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index 759f77a2adc1..495d994f1372 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -1,20 +1,53 @@ - -/datum/heretic_knowledge_tree_column/main/blade - neighbour_type_left = /datum/heretic_knowledge_tree_column/void_to_blade - neighbour_type_right = /datum/heretic_knowledge_tree_column/blade_to_rust - +/datum/heretic_knowledge_tree_column/blade route = PATH_BLADE ui_bgr = "node_blade" + complexity = "Hard" + complexity_color = COLOR_RED + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "dark_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Blade is as the name suggests.", + "You are highly competent at cutting your opponents to ribbons.", + "Pick this path if you want to fight, and you want to be the best at fighting.", + ) + pros = list( + "Capable of blocking incoming attacks, retaliating with a riposte.", + "Rapidly deals damage through dual-wielded blades and channeled strikes.", + "High defense against stuns and knockdowns.", + "Highly lethal combatant in a direct combat with a single opponent.", + ) + cons = list( + "Requires a high degree of skill input.", + "Without blades, the path loses most of its fighting power.", + "Lacks mobility options.", + "Lacks environmental protections.", + ) + tips = list( + "Your Mansus Grasp will stun your opponent if they are attacked from behind or while they are prone. This also locks them in the room they are in until the mark is detonated. Triggering the mark will grant you a orbiting knife that will protect you from one melee or ranged attack.", + "You have the highest blade cap out of all paths (A total of 4). But since they require silver or titanium to craft, you might be strapped for ingredients if the miners aren't doing their job. If you need materials, shuttle walls and seats are a source of titanium metal, and surgery tables a source of silver.", + "You are highly reliant on approaching opponents in melee. Slips, bolas and beartraps are your worst enemy. You can counteract slips by crafting a pair of Greaves Of The Prophet, or remove restraints with Ashen Passage.", + "Realignment will pull you out of stuns and knockdowns, but also pacifies you for the duration.", + "With Empowered Blades, your offensive power grows considerably. You are able to fight with dual-wielded blades, and can empower them by activating your Mansus Grasp while wielding your blades. Your blades also deal additional damage to objects, silicons and mechs.", + "Maintaining a good offense also creates a good defense. With orbiting blades, you are able to block additional incoming attacks.", + "With Furious Steel, you can not only produce several knives for defensive purposes, but throw them by clicking with an empty hand. This gives you additional ranged power in a pinch.", + "Use Wolves Among Sheep with caution. Not only does it have a significant cooldown, but it also arms anyone trapped in the effect with you with blades of their own. Use it either as a last ditch defense, or when you know you have the upper hand and need an extra edge. Just don't try to flee the area before taking someone out first.", + ) start = /datum/heretic_knowledge/limited_amount/starting/base_blade - grasp = /datum/heretic_knowledge/blade_grasp - tier1 = /datum/heretic_knowledge/blade_dance - mark = /datum/heretic_knowledge/mark/blade_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/blade - unique_ability = /datum/heretic_knowledge/spell/realignment - tier2 = /datum/heretic_knowledge/spell/furious_steel + knowledge_tier1 = /datum/heretic_knowledge/spell/realignment + guaranteed_side_tier1 = /datum/heretic_knowledge/greaves_of_the_prophet + knowledge_tier2 = /datum/heretic_knowledge/duel_stance + guaranteed_side_tier2 = /datum/heretic_knowledge/essence + robes = /datum/heretic_knowledge/armor/blade + knowledge_tier3 = /datum/heretic_knowledge/spell/furious_steel + guaranteed_side_tier3 = /datum/heretic_knowledge/rune_carver blade = /datum/heretic_knowledge/blade_upgrade/blade - tier3 = /datum/heretic_knowledge/spell/wolves_among_sheep + knowledge_tier4 = /datum/heretic_knowledge/spell/wolves_among_sheep ascension = /datum/heretic_knowledge/ultimate/blade_final /datum/heretic_knowledge/limited_amount/starting/base_blade @@ -31,24 +64,11 @@ limit = 4 // It's the blade path, it's a given research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "dark_blade" + mark_type = /datum/status_effect/eldritch/blade + eldritch_passive = /datum/status_effect/heretic_passive/blade -/datum/heretic_knowledge/blade_grasp - name = "Grasp of the Blade" - desc = "Your Mansus Grasp will cause a short stun when used on someone lying down or facing away from you." - gain_text = "The story of the footsoldier has been told since antiquity. It is one of blood and valor, \ - and is championed by sword, steel and silver." - cost = 1 - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_blade" - -/datum/heretic_knowledge/blade_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) - -/datum/heretic_knowledge/blade_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK) - -/datum/heretic_knowledge/blade_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER +/datum/heretic_knowledge/limited_amount/starting/base_blade/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() if(!check_behind(source, target)) return @@ -59,109 +79,7 @@ target.balloon_alert(source, "backstab!") playsound(target, 'sound/items/weapons/guillotine.ogg', 100, TRUE) -/// The cooldown duration between triggers of blade dance -#define BLADE_DANCE_COOLDOWN (20 SECONDS) - -/datum/heretic_knowledge/blade_dance - name = "Dance of the Brand" - desc = "Being attacked while wielding a Heretic Blade in either hand will deliver a riposte \ - 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." - cost = 1 - research_tree_icon_path = 'icons/mob/actions/actions_ecult.dmi' - research_tree_icon_state = "shatter" - /// Whether the counter-attack is ready or not. - /// Used instead of cooldowns, so we can give feedback when it's ready again - var/riposte_ready = TRUE - -/datum/heretic_knowledge/blade_dance/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(on_shield_reaction)) - -/datum/heretic_knowledge/blade_dance/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, COMSIG_LIVING_CHECK_BLOCK) - -/datum/heretic_knowledge/blade_dance/proc/on_shield_reaction( - mob/living/carbon/human/source, - atom/movable/hitby, - damage = 0, - attack_text = "the attack", - attack_type = MELEE_ATTACK, - armour_penetration = 0, - damage_type = BRUTE, -) - - SIGNAL_HANDLER - - if(attack_type != MELEE_ATTACK) - return - - if(!riposte_ready) - return - - if(INCAPACITATED_IGNORING(source, INCAPABLE_GRAB)) - return - - var/mob/living/attacker = hitby.loc - if(!istype(attacker)) - return - - if(!source.Adjacent(attacker)) - return - - // Let's check their held items to see if we can do a riposte - var/obj/item/main_hand = source.get_active_held_item() - var/obj/item/off_hand = source.get_inactive_held_item() - // This is the item that ends up doing the "blocking" (flavor) - var/obj/item/striking_with - - // First we'll check if the offhand is valid - if(!QDELETED(off_hand) && istype(off_hand, /obj/item/melee/sickly_blade)) - striking_with = off_hand - - // Then we'll check the mainhand - // We do mainhand second, because we want to prioritize it over the offhand - if(!QDELETED(main_hand) && istype(main_hand, /obj/item/melee/sickly_blade)) - striking_with = main_hand - - // No valid item in either slot? No riposte - if(!striking_with) - return - - // If we made it here, deliver the strike - INVOKE_ASYNC(src, PROC_REF(counter_attack), source, attacker, striking_with, attack_text) - - // And reset after a bit - riposte_ready = FALSE - addtimer(CALLBACK(src, PROC_REF(reset_riposte), source), BLADE_DANCE_COOLDOWN) - -/datum/heretic_knowledge/blade_dance/proc/counter_attack(mob/living/carbon/human/source, mob/living/target, obj/item/melee/sickly_blade/weapon, attack_text) - playsound(get_turf(source), 'sound/items/weapons/parry.ogg', 100, TRUE) - source.balloon_alert(source, "riposte used") - source.visible_message( - span_warning("[source] leans into [attack_text] and delivers a sudden riposte back at [target]!"), - span_warning("You lean into [attack_text] and deliver a sudden riposte back at [target]!"), - span_hear("You hear a clink, followed by a stab."), - ) - weapon.melee_attack_chain(source, target) - -/datum/heretic_knowledge/blade_dance/proc/reset_riposte(mob/living/carbon/human/source) - riposte_ready = TRUE - source.balloon_alert(source, "riposte ready") - -#undef BLADE_DANCE_COOLDOWN - -/datum/heretic_knowledge/mark/blade_mark - name = "Mark of the Blade" - desc = "Your Mansus Grasp now applies the Mark of the Blade. While marked, \ - the victim will be unable to leave their current room until it expires or is triggered. \ - Triggering the mark will summon a knife that will orbit you for a short time. \ - The knife will block any attack directed towards you, but is consumed on use." - gain_text = "His general wished to end the war, but the Champion knew there could be no life without death. \ - He would slay the coward himself, and anyone who tried to run." - mark_type = /datum/status_effect/eldritch/blade - -/datum/heretic_knowledge/mark/blade_mark/create_mark(mob/living/source, mob/living/target) +/datum/heretic_knowledge/limited_amount/starting/base_blade/create_mark(mob/living/source, mob/living/target) var/datum/status_effect/eldritch/blade/blade_mark = ..() if(istype(blade_mark)) var/area/to_lock_to = get_area(target) @@ -169,16 +87,12 @@ to_chat(target, span_hypnophrase("An otherworldly force is compelling you to stay in [get_area_name(to_lock_to)]!")) return blade_mark -/datum/heretic_knowledge/mark/blade_mark/trigger_mark(mob/living/source, mob/living/target) +/datum/heretic_knowledge/limited_amount/starting/base_blade/trigger_mark(mob/living/source, mob/living/target) . = ..() if(!.) return source.apply_status_effect(/datum/status_effect/protective_blades, 60 SECONDS, 1, 20, 0 SECONDS) -/datum/heretic_knowledge/knowledge_ritual/blade - - - /datum/heretic_knowledge/spell/realignment name = "Realignment" desc = "Grants you Realignment a spell that wil realign your body rapidly for a short period. \ @@ -186,7 +100,91 @@ 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." action_to_add = /datum/action/cooldown/spell/realignment - cost = 1 + cost = 2 + +/// The amount of blood flow reduced per level of severity of gained bleeding wounds for Stance of the Torn Champion. +#define BLOOD_FLOW_PER_SEVEIRTY -1 + +/datum/heretic_knowledge/duel_stance + name = "Stance of the Torn Champion" + desc = "Grants resilience to blood loss from wounds and immunity to having your limbs dismembered. \ + Additionally, when damaged below 50% of your maximum health, \ + you gain increased resistance to gaining wounds and resistance to slowdown." + 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." + cost = 2 + research_tree_icon_path = 'icons/effects/blood.dmi' + research_tree_icon_state = "suitblood" + research_tree_icon_dir = SOUTH + drafting_tier = 5 + /// Whether we're currently in duelist stance, gaining certain buffs (low health) + var/in_duelist_stance = FALSE + +/datum/heretic_knowledge/duel_stance/on_gain(mob/user, datum/antagonist/heretic/our_heretic) + ADD_TRAIT(user, TRAIT_NODISMEMBER, type) + RegisterSignal(user, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(user, COMSIG_CARBON_GAIN_WOUND, PROC_REF(on_wound_gain)) + RegisterSignal(user, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(on_health_update)) + + on_health_update(user) // Run this once, so if the knowledge is learned while hurt it activates properly + +/datum/heretic_knowledge/duel_stance/on_lose(mob/user, datum/antagonist/heretic/our_heretic) + REMOVE_TRAIT(user, TRAIT_NODISMEMBER, type) + if(in_duelist_stance) + user.remove_traits(list(TRAIT_HARDLY_WOUNDED), type) + if(isliving(user)) + var/mob/living/living_mob = user + living_mob.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown, TRUE) + + UnregisterSignal(user, list(COMSIG_ATOM_EXAMINE, COMSIG_CARBON_GAIN_WOUND, COMSIG_LIVING_HEALTH_UPDATE)) + +/datum/heretic_knowledge/duel_stance/proc/on_examine(mob/living/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + var/obj/item/held_item = source.get_active_held_item() + if(in_duelist_stance) + examine_list += span_warning("[source] looks unnaturally poised[held_item?.force >= 15 ? " and ready to strike out":""].") + +/datum/heretic_knowledge/duel_stance/proc/on_wound_gain(mob/living/source, datum/wound/gained_wound, obj/item/bodypart/limb) + SIGNAL_HANDLER + + if(gained_wound.blood_flow <= 0) + return + + gained_wound.adjust_blood_flow(gained_wound.severity * BLOOD_FLOW_PER_SEVEIRTY) + +/datum/heretic_knowledge/duel_stance/proc/on_health_update(mob/living/source) + SIGNAL_HANDLER + + if(in_duelist_stance && source.health > source.maxHealth * 0.5) + source.balloon_alert(source, "exited duelist stance") + in_duelist_stance = FALSE + source.remove_traits(list(TRAIT_HARDLY_WOUNDED), type) + source.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown, TRUE) + return + + if(!in_duelist_stance && source.health <= source.maxHealth * 0.5) + source.balloon_alert(source, "entered duelist stance") + in_duelist_stance = TRUE + ADD_TRAIT(source, TRAIT_HARDLY_WOUNDED, type) + source.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown, TRUE) + return + +#undef BLOOD_FLOW_PER_SEVEIRTY + +/datum/heretic_knowledge/armor/blade + desc = "Allows you to transmute a table (or a suit), a mask and a sheet of titanium or silver to create a Shattered Panoply. \ + Provides baton resistance and shock insulation while worn. \ + Acts as a focus while hooded." + gain_text = "The echoing, directionless cacophony of violence reverberates about me. \ + Even as the Champion's steel panoply was torn from their form, each piece craves purpose still, seeking to intercept unseen or imagined attackers." + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade) + research_tree_icon_state = "blade_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + list(/obj/item/stack/sheet/mineral/silver, /obj/item/stack/sheet/mineral/titanium) = 1, + ) /datum/heretic_knowledge/spell/wolves_among_sheep name = "Wolves Among Sheep" @@ -199,8 +197,9 @@ I have made an enemy of all, and peace will never be known to me \ again. I have shattered bonds and severed all alliances. In this truth, \ I know now the fragility of comradery. My enemies will be all, divided." - cost = 1 + cost = 2 action_to_add = /datum/action/cooldown/spell/wolves_among_sheep + is_final_knowledge = TRUE /datum/heretic_knowledge/blade_upgrade/blade name = "Empowered Blades" @@ -221,11 +220,10 @@ . = ..() RegisterSignal(user, COMSIG_TOUCH_HANDLESS_CAST, PROC_REF(on_grasp_cast)) RegisterSignal(user, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(on_blade_equipped)) - RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(do_melee_effects)) /datum/heretic_knowledge/blade_upgrade/blade/on_lose(mob/user, datum/antagonist/heretic/our_heretic) . = ..() - UnregisterSignal(user, list(COMSIG_TOUCH_HANDLESS_CAST, COMSIG_MOB_EQUIPPED_ITEM, COMSIG_HERETIC_BLADE_ATTACK)) + UnregisterSignal(user, list(COMSIG_TOUCH_HANDLESS_CAST, COMSIG_MOB_EQUIPPED_ITEM)) ///Tries to infuse our held blade with our mansus grasp /datum/heretic_knowledge/blade_upgrade/blade/proc/on_grasp_cast(mob/living/carbon/cast_on) @@ -296,7 +294,7 @@ /datum/heretic_knowledge/blade_upgrade/blade/proc/on_blade_equipped(mob/user, obj/item/equipped, slot) SIGNAL_HANDLER if(istype(equipped, /obj/item/melee/sickly_blade/dark)) - equipped.demolition_mod = 1.5 + equipped.demolition_mod = 2.5 /datum/heretic_knowledge/spell/furious_steel name = "Furious Steel" @@ -307,7 +305,7 @@ 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." action_to_add = /datum/action/cooldown/spell/pointed/projectile/furious_steel - cost = 1 + cost = 2 /datum/heretic_knowledge/ultimate/blade_final name = "Maelstrom of Silver" @@ -336,7 +334,7 @@ . = ..() ADD_TRAIT(user, TRAIT_NEVER_WOUNDED, type) 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, /obj/effect/floating_blade, 1 MINUTES) + user.apply_status_effect(/datum/status_effect/protective_blades/recharging, STATUS_EFFECT_PERMANENT, 8, 30, 0.25 SECONDS, /obj/effect/floating_blade, 60 SECONDS) user.add_stun_absorption( source = name, message = span_warning("%EFFECT_OWNER throws off the stun!"), diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index ca950c8d0ea8..7acf182d30ef 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -1,20 +1,50 @@ - -/datum/heretic_knowledge_tree_column/main/cosmic - neighbour_type_left = /datum/heretic_knowledge_tree_column/rust_to_cosmic - neighbour_type_right = /datum/heretic_knowledge_tree_column/cosmic_to_ash - +/datum/heretic_knowledge_tree_column/cosmic route = PATH_COSMIC ui_bgr = "node_cosmos" + complexity = "Hard" + complexity_color = COLOR_RED + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "cosmic_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Cosmos revolves around area denial, teleporation, and mastery over space.", + "Pick this path if you enjoy adapting to your environment and thinking outside (or inside) the box.", + ) + pros = list( + "Control the movement of foes with cosmic fields", + "Move in and around space with ease.", + "Teleport rapidly across the station.", + "Confound opponents with barriers upon barriers.", + ) + cons = list( + "Requires you spread your star mark to affect opponents with your cosmic fields.", + "Relatively low damage.", + "Relatively low direct defense, highly reliant on proper use of abilities.", + ) + tips = list( + "Your Mansus Grasp will mark your opponent with a star mark, as well as leave a mark that, when detonated, will teleport your opponent back to the place where the mark was applied and briefly paralyze them.", + "Your cosmic runes can quickly teleport you from two different locations instantly. Beware, however; non-heretics are also able to travel through them. Be creative and have your opponents teleport right into a trap. They come out star marked!", + "When standing on top of a cosmic rune, you can click on yourself with a empty hand to activate it.", + "Star marked opponents cannot cross your cosmic fields willingly. But they can be dragged through!", + "Star Blast is both a jaunt ability as well as a disabling tool. Use it to catch several people in your cosmic fields at once.", + "Star Touch will prevent your target from teleporting away. Should they fail to break the tether, they will be put to sleep and then teleport to your feet.", + "It's Always a good idea to leave one cosmic rune near your ritual rune, it will allow you to quickly kidnap your targets to sacrifice them.", + ) start = /datum/heretic_knowledge/limited_amount/starting/base_cosmic - grasp = /datum/heretic_knowledge/cosmic_grasp - tier1 = /datum/heretic_knowledge/spell/cosmic_runes - mark = /datum/heretic_knowledge/mark/cosmic_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/cosmic - unique_ability = /datum/heretic_knowledge/spell/star_touch - tier2 = /datum/heretic_knowledge/spell/star_blast + knowledge_tier1 = /datum/heretic_knowledge/spell/cosmic_runes + guaranteed_side_tier1 = /datum/heretic_knowledge/eldritch_coin + knowledge_tier2 = /datum/heretic_knowledge/spell/star_blast + guaranteed_side_tier2 = /datum/heretic_knowledge/spell/space_phase + robes = /datum/heretic_knowledge/armor/cosmic + knowledge_tier3 = /datum/heretic_knowledge/spell/star_touch + guaranteed_side_tier3 = /datum/heretic_knowledge/essence blade = /datum/heretic_knowledge/blade_upgrade/cosmic - tier3 = /datum/heretic_knowledge/spell/cosmic_expansion + knowledge_tier4 = /datum/heretic_knowledge/spell/cosmic_expansion ascension = /datum/heretic_knowledge/ultimate/cosmic_final /datum/heretic_knowledge/limited_amount/starting/base_cosmic @@ -30,30 +60,16 @@ result_atoms = list(/obj/item/melee/sickly_blade/cosmic) research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "cosmic_blade" - -/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. \ - People with a star mark can not pass cosmic fields." - gain_text = "Some stars dimmed, others' magnitude increased. \ - With newfound strength I could channel the nebula's power into myself." - cost = 1 - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_cosmos" - -/datum/heretic_knowledge/cosmic_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) - -/datum/heretic_knowledge/cosmic_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK) + mark_type = /datum/status_effect/eldritch/cosmic + eldritch_passive = /datum/status_effect/heretic_passive/cosmic /// Aplies the effect of the mansus grasp when it hits a target. -/datum/heretic_knowledge/cosmic_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER +/datum/heretic_knowledge/limited_amount/starting/base_cosmic/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() to_chat(target, span_danger("A cosmic ring appeared above your head!")) target.apply_status_effect(/datum/status_effect/star_mark, source) - new /obj/effect/forcefield/cosmic_field(get_turf(source)) + create_cosmic_field(get_turf(source), source) /datum/heretic_knowledge/spell/cosmic_runes name = "Cosmic Runes" @@ -63,20 +79,30 @@ gain_text = "The distant stars crept into my dreams, roaring and screaming without reason. \ I spoke, and heard my own words echoed back." action_to_add = /datum/action/cooldown/spell/cosmic_rune - cost = 1 + cost = 2 + drafting_tier = 5 +/datum/heretic_knowledge/spell/star_blast + name = "Star Blast" + desc = "Fires a projectile that moves very slowly, raising a short-lived wall of cosmic fields where it goes. \ + Anyone hit by the projectile will receive burn damage, a knockdown, and give people in a three tile range a star mark." + gain_text = "The Beast was behind me now at all times, with each sacrifice words of affirmation coursed through me." + action_to_add = /datum/action/cooldown/spell/pointed/projectile/star_blast + cost = 2 -/datum/heretic_knowledge/mark/cosmic_mark - name = "Mark of Cosmos" - 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, \ - leaving a cosmic field in their place. \ - They will then be paralyzed for 2 seconds." - gain_text = "The Beast now whispered to me occasionally, only small tidbits of their circumstances. \ - I can help them, I have to help them." - mark_type = /datum/status_effect/eldritch/cosmic +/datum/heretic_knowledge/armor/cosmic -/datum/heretic_knowledge/knowledge_ritual/cosmic + desc = "Allows you to transmute a table (or a suit), a mask and a sheet of plasma to create a Starwoven Cloak, grants protection from the hazards of space while granting to the user the ability to levitate at will. \ + Acts as a focus while hooded." + gain_text = "Like radiant cords, the stars shone in union across the silken shape of a billowing cloak, that at once does and does not drape my shoulders. \ + The eyes of the Beast rested upon me, and through me." + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/cosmic) + research_tree_icon_state = "cosmic_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + /obj/item/stack/sheet/mineral/plasma = 1, + ) /datum/heretic_knowledge/spell/star_touch name = "Star Touch" @@ -87,23 +113,14 @@ 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." action_to_add = /datum/action/cooldown/spell/touch/star_touch - cost = 1 - -/datum/heretic_knowledge/spell/star_blast - name = "Star Blast" - desc = "Fires a projectile that moves very slowly, raising a short-lived wall of cosmic fields where it goes. \ - Anyone hit by the projectile will receive burn damage, a knockdown, and give people in a three tile range a star mark." - gain_text = "The Beast was behind me now at all times, with each sacrifice words of affirmation coursed through me." - action_to_add = /datum/action/cooldown/spell/pointed/projectile/star_blast - cost = 1 + cost = 2 /datum/heretic_knowledge/blade_upgrade/cosmic name = "Cosmic Blade" - desc = "Your blade now deals damage to people's organs through cosmic radiation. \ + desc = "Your blade now star marks your victims, and allows you to attack star marked heathens from further away. \ Your attacks will chain bonus damage to up to two previous victims. \ - 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 receive, \ - a cosmic trail and increase your combo timer up to ten seconds." + The combo is reset after two seconds without making an attack, or if you attack someone already marked. \ + If you combo three attacks you will receive a cosmic trail and increase your combo timer up to ten seconds." 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." research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' @@ -124,27 +141,27 @@ var/increase_amount = 0.5 SECONDS /// The hits we have on a mob with a mind. var/combo_counter = 0 + /// How much further we can hit people, modified by ascension + var/max_attack_range = 2 + +/datum/heretic_knowledge/blade_upgrade/cosmic/on_ranged_eldritch_blade(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) + . = ..() + if(!isliving(target) || get_dist(source, target) > max_attack_range || !target.has_status_effect(/datum/status_effect/star_mark)) + return + source.changeNext_move(blade.attack_speed) + return blade.attack(target, source) /datum/heretic_knowledge/blade_upgrade/cosmic/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) - var/static/list/valid_organ_slots = list( - ORGAN_SLOT_HEART, - ORGAN_SLOT_LUNGS, - ORGAN_SLOT_STOMACH, - ORGAN_SLOT_EYES, - ORGAN_SLOT_EARS, - ORGAN_SLOT_LIVER, - ORGAN_SLOT_BRAIN - ) if(source == target || !isliving(target)) return + target.apply_status_effect(/datum/status_effect/star_mark, source) if(combo_timer) deltimer(combo_timer) 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() var/need_mob_update = FALSE - need_mob_update += target.adjustFireLoss(5, updating_health = FALSE) - need_mob_update += target.adjustOrganLoss(pick(valid_organ_slots), 8) + need_mob_update += target.adjust_fire_loss(5, updating_health = FALSE) if(need_mob_update) target.updatehealth() if(target == second_target_resolved || target == third_target_resolved) @@ -156,24 +173,20 @@ new /obj/effect/temp_visual/cosmic_explosion(get_turf(second_target_resolved)) playsound(get_turf(second_target_resolved), 'sound/effects/magic/cosmic_energy.ogg', 25, FALSE) need_mob_update = FALSE - need_mob_update += second_target_resolved.adjustFireLoss(14, updating_health = FALSE) - need_mob_update += second_target_resolved.adjustOrganLoss(pick(valid_organ_slots), 12) + need_mob_update += second_target_resolved.adjust_fire_loss(14, updating_health = FALSE) if(need_mob_update) second_target_resolved.updatehealth() if(third_target_resolved) new /obj/effect/temp_visual/cosmic_domain(get_turf(third_target_resolved)) playsound(get_turf(third_target_resolved), 'sound/effects/magic/cosmic_energy.ogg', 50, FALSE) need_mob_update = FALSE - need_mob_update += third_target_resolved.adjustFireLoss(28, updating_health = FALSE) - need_mob_update += third_target_resolved.adjustOrganLoss(pick(valid_organ_slots), 14) + need_mob_update += third_target_resolved.adjust_fire_loss(28, updating_health = FALSE) if(need_mob_update) third_target_resolved.updatehealth() - if(combo_counter > 3) - target.apply_status_effect(/datum/status_effect/star_mark, source) + if(combo_counter == 3) if(target.mind && target.stat != DEAD) increase_combo_duration() - if(combo_counter == 4) - source.AddElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) + source.AddElement(cosmic_trail_based_on_passive(source), /obj/effect/forcefield/cosmic_field/fast) third_target = second_target second_target = WEAKREF(target) @@ -181,8 +194,7 @@ /datum/heretic_knowledge/blade_upgrade/cosmic/proc/reset_combo(mob/living/source) second_target = null third_target = null - if(combo_counter > 3) - source.RemoveElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) + source.RemoveElement(cosmic_trail_based_on_passive(source), /obj/effect/forcefield/cosmic_field/fast) combo_duration = combo_duration_amount combo_counter = 0 new /obj/effect/temp_visual/cosmic_cloud(get_turf(source)) @@ -196,16 +208,17 @@ /datum/heretic_knowledge/spell/cosmic_expansion name = "Cosmic Expansion" - desc = "Grants you Cosmic Expansion, a spell that creates a 3x3 area of cosmic fields around you. \ + desc = "Grants you Cosmic Expansion, a spell that creates a 5x5 area of cosmic fields around you. \ Nearby beings will also receive a star mark." gain_text = "The ground now shook beneath me. The Beast inhabited me, and their voice was intoxicating." action_to_add = /datum/action/cooldown/spell/conjure/cosmic_expansion - cost = 1 + cost = 2 + is_final_knowledge = TRUE /datum/heretic_knowledge/ultimate/cosmic_final name = "Creators's Gift" desc = "The ascension ritual of the Path of Cosmos. \ - Bring 3 corpses with bluespace dust in their body to a transmutation rune to complete the ritual. \ + Bring 3 corpses with a star mark to a transmutation rune to complete the ritual. \ When completed, you become the owner of a Star Gazer. \ You will be able to command the Star Gazer with Alt+click. \ You can also give it commands through speech. \ @@ -228,22 +241,33 @@ /datum/pet_command/follow, /datum/pet_command/attack/star_gazer ) + /// List of traits given once ascended + var/static/list/ascended_traits = list(TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTCOLD, TRAIT_RESISTHEAT, TRAIT_XRAY_VISION) + /// List of traits given to our cute lil guy + var/static/list/stargazer_traits = list(TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTCOLD, TRAIT_RESISTHEAT, TRAIT_BOMBIMMUNE, TRAIT_XRAY_VISION) /datum/heretic_knowledge/ultimate/cosmic_final/is_valid_sacrifice(mob/living/carbon/human/sacrifice) . = ..() if(!.) return FALSE - return sacrifice.has_reagent(/datum/reagent/bluespace) + return sacrifice.has_status_effect(/datum/status_effect/star_mark) /datum/heretic_knowledge/ultimate/cosmic_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) . = ..() - var/mob/living/basic/heretic_summon/star_gazer/star_gazer_mob = new /mob/living/basic/heretic_summon/star_gazer(loc) + user.add_traits(ascended_traits, type) + if(ishuman(user)) + var/mob/living/carbon/human/ascended_human = user + var/obj/item/organ/eyes/heretic_eyes = ascended_human.get_organ_slot(ORGAN_SLOT_EYES) + ascended_human.update_sight() + heretic_eyes?.color_cutoffs = list(30, 30, 30) + ascended_human.update_sight() + + var/mob/living/basic/heretic_summon/star_gazer/star_gazer_mob = new /mob/living/basic/heretic_summon/star_gazer(loc, user) star_gazer_mob.maxHealth = INFINITY star_gazer_mob.health = INFINITY user.AddComponent(/datum/component/death_linked, star_gazer_mob) star_gazer_mob.AddComponent(/datum/component/obeys_commands, star_gazer_commands, radial_menu_offset = list(30,0), radial_menu_lifetime = 15 SECONDS, radial_relative_to_user = TRUE) - 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) var/datum/action/cooldown/open_mob_commands/commands_action = new /datum/action/cooldown/open_mob_commands() commands_action.Grant(user, star_gazer_mob) @@ -251,6 +275,8 @@ if(star_touch_spell) star_touch_spell.set_star_gazer(star_gazer_mob) star_touch_spell.ascended = TRUE + star_gazer_mob.add_traits(stargazer_traits, type) + star_gazer_mob.leash_to(star_gazer_mob, user) var/datum/antagonist/heretic/heretic_datum = user.mind.has_antag_datum(/datum/antagonist/heretic) var/datum/heretic_knowledge/blade_upgrade/cosmic/blade_upgrade = heretic_datum.get_knowledge(/datum/heretic_knowledge/blade_upgrade/cosmic) @@ -258,6 +284,46 @@ blade_upgrade.combo_duration_amount = 10 SECONDS blade_upgrade.max_combo_duration = 30 SECONDS blade_upgrade.increase_amount = 2 SECONDS + blade_upgrade.max_attack_range = 3 var/datum/action/cooldown/spell/conjure/cosmic_expansion/cosmic_expansion_spell = locate() in user.actions cosmic_expansion_spell?.ascended = TRUE + + var/datum/action/cooldown/mob_cooldown/replace_star_gazer/replace_gazer = new(src) + replace_gazer.Grant(user) + replace_gazer.bad_dog = WEAKREF(star_gazer_mob) + +/// Replace an annoying griefer you were paired up to with a different but probably no less annoying player. +/datum/action/cooldown/mob_cooldown/replace_star_gazer + name = "Reset Star Gazer Consciousness" + desc = "Replaces the mind of your summon with that of a different ghost." + button_icon = 'icons/mob/simple/mob.dmi' + button_icon_state = "ghost" + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + check_flags = NONE + click_to_activate = FALSE + cooldown_time = 5 SECONDS + melee_cooldown_time = 0 + shared_cooldown = NONE + /// Weakref to the stargazer we care about + var/datum/weakref/bad_dog + +/datum/action/cooldown/mob_cooldown/replace_star_gazer/Activate(atom/target) + StartCooldown(5 MINUTES) + + var/mob/living/to_reset = bad_dog.resolve() + + to_chat(owner, span_hierophant("You prompt [to_reset] to shift it\'s personality...")) + var/mob/chosen_one = SSpolling.poll_ghost_candidates("Do you want to play as [span_danger("[owner.real_name]'s")] [span_notice(to_reset.name)]?", check_jobban = ROLE_PAI, poll_time = 10 SECONDS, alert_pic = to_reset, jump_target = owner, role_name_text = to_reset.name, amount_to_pick = 1) + if(isnull(chosen_one)) + to_chat(owner, span_hierophant("Your request to shift [to_reset]'\s personality appears to have been denied... Looks like you're stuck with it for now.")) + StartCooldown() + return FALSE + to_chat(to_reset, span_hierophant("Your summoner reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance.")) + to_chat(owner, span_hierophant("The mind of [to_reset] has twisted itself to suit you better.")) + message_admins("[key_name_admin(chosen_one)] has taken control of ([ADMIN_LOOKUPFLW(to_reset)])") + to_reset.ghostize(FALSE) + to_reset.PossessByPlayer(chosen_one.key) + StartCooldown() + return TRUE diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index aa8bbaa5039c..cb2ac3d3bde0 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -1,24 +1,52 @@ -/// The max amount of health a ghoul has. -#define GHOUL_MAX_HEALTH 25 -/// The max amount of health a voiceless dead has. -#define MUTE_MAX_HEALTH 50 - -/datum/heretic_knowledge_tree_column/main/flesh - neighbour_type_left = /datum/heretic_knowledge_tree_column/lock_to_flesh - neighbour_type_right = /datum/heretic_knowledge_tree_column/flesh_to_void - +/datum/heretic_knowledge_tree_column/flesh route = PATH_FLESH ui_bgr = "node_flesh" + complexity = "Varies" + complexity_color = COLOR_ORANGE + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "flesh_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Flesh revolves around summoning ghouls and monstrosities to do your bidding.", + "Pick this path if you enjoy the fantasy of being a necromancer commanding legions of allies.", + ) + pros = list( + "Can turn dead humanoids into fragile but loyal ghouls.", + "Access to a versatile list of summoned minions.", + "Your summons are very versatie and can quicky overwhelm the crew should you coordinate your attacks", + "Eating organs or being fat grants various boons (depending on the level of your passive).", + ) + cons = list( + "A high degree of your progression is obtaining additional summoned monsters.", + "You have very little utility beyond your summoned monsters.", + "You gain no inherent access to defensive, offensive or mobility spells.", + "You are mostly focused around supporting your minions.", + ) + tips = list( + "Your Mansus Grasp allows you to turn dead humanoids into ghouls (even mindshielded humanoids like security officers and the captain). It also Leaves a mark that causes heavy bleeding when triggered by your bloody blade.", + "As a Flesh Heretic, organs and dead bodies are your best friends! You can use them for rituals, to heal or to gain buffs.", + "Your Flesh Surgery spell can heal your summons. Your robes grant you an aura that also heals nearby summons (but not yourself).", + "Your Flesh Surgery spell also lets you steal organs from humanoids. Useful if you need a spare liver.", + "Raw Prophets can link you and other summons in a telepathic network, allowing for long distance co-ordination.", + "Flesh Stalkers are decent combatants with the ability to disguise themselves as small creatures, like beepskies and corgis. They can also utilize an EMP spell, but this can potentially harm them if they transformed into a robot!", + "Your success with this path is reliant on how knowledgable or robust your minions are. However, there is always power in numbers; the more minions, the higher your chances of success.", + "Your minions are more expendable than you are. Do not be afraid to tell them to go to their deaths. You can just recover them later... maybe.", + ) start = /datum/heretic_knowledge/limited_amount/starting/base_flesh - grasp = /datum/heretic_knowledge/limited_amount/flesh_grasp - tier1 = /datum/heretic_knowledge/limited_amount/flesh_ghoul - mark = /datum/heretic_knowledge/mark/flesh_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/flesh - unique_ability = /datum/heretic_knowledge/spell/flesh_surgery - tier2 = /datum/heretic_knowledge/summon/raw_prophet + knowledge_tier1 = /datum/heretic_knowledge/limited_amount/flesh_ghoul + guaranteed_side_tier1 = /datum/heretic_knowledge/limited_amount/risen_corpse + knowledge_tier2 = /datum/heretic_knowledge/spell/flesh_surgery + guaranteed_side_tier2 = /datum/heretic_knowledge/crucible + robes = /datum/heretic_knowledge/armor/flesh + knowledge_tier3 = /datum/heretic_knowledge/summon/raw_prophet + guaranteed_side_tier3 = /datum/heretic_knowledge/spell/crimson_cleave blade = /datum/heretic_knowledge/blade_upgrade/flesh - tier3 = /datum/heretic_knowledge/summon/stalker + knowledge_tier4 = /datum/heretic_knowledge/summon/stalker ascension = /datum/heretic_knowledge/ultimate/flesh_final /datum/heretic_knowledge/limited_amount/starting/base_flesh @@ -35,6 +63,8 @@ limit = 3 // Bumped up so they can arm up their ghouls too. research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "flesh_blade" + mark_type = /datum/status_effect/eldritch/flesh + eldritch_passive = /datum/status_effect/heretic_passive/flesh /datum/heretic_knowledge/limited_amount/starting/base_flesh/on_research(mob/user, datum/antagonist/heretic/our_heretic) . = ..() @@ -45,28 +75,8 @@ to_chat(user, span_hierophant("Undertaking the Path of Flesh, you are given another objective.")) our_heretic.owner.announce_objectives() -/datum/heretic_knowledge/limited_amount/flesh_grasp - name = "Grasp of Flesh" - desc = "Your Mansus Grasp gains the ability to create a ghoul out of corpse with a soul. \ - Ghouls have only 25 health and look like husks to the heathens' eyes, but can use Bloody Blades effectively. \ - You can only create one at a time by this method." - gain_text = "My new found desires drove me to greater and greater heights." - - limit = 1 - cost = 1 - - - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_flesh" - -/datum/heretic_knowledge/limited_amount/flesh_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) - -/datum/heretic_knowledge/limited_amount/flesh_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK) - -/datum/heretic_knowledge/limited_amount/flesh_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER +/datum/heretic_knowledge/limited_amount/starting/base_flesh/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() if(target.stat != DEAD) return @@ -92,8 +102,11 @@ make_ghoul(source, target) +/// The max amount of health a ghoul has. +#define GHOUL_MAX_HEALTH 25 + /// Makes [victim] into a ghoul. -/datum/heretic_knowledge/limited_amount/flesh_grasp/proc/make_ghoul(mob/living/user, mob/living/carbon/human/victim) +/datum/heretic_knowledge/limited_amount/starting/base_flesh/proc/make_ghoul(mob/living/user, mob/living/carbon/human/victim) user.log_message("created a ghoul, controlled by [key_name(victim)].", LOG_GAME) message_admins("[ADMIN_LOOKUPFLW(user)] created a ghoul, [ADMIN_LOOKUPFLW(victim)].") @@ -106,11 +119,11 @@ ) /// Callback for the ghoul status effect - Tracking all of our ghouls -/datum/heretic_knowledge/limited_amount/flesh_grasp/proc/apply_to_ghoul(mob/living/ghoul) +/datum/heretic_knowledge/limited_amount/starting/base_flesh/proc/apply_to_ghoul(mob/living/ghoul) LAZYADD(created_items, WEAKREF(ghoul)) /// Callback for the ghoul status effect - Tracking all of our ghouls -/datum/heretic_knowledge/limited_amount/flesh_grasp/proc/remove_from_ghoul(mob/living/ghoul) +/datum/heretic_knowledge/limited_amount/starting/base_flesh/proc/remove_from_ghoul(mob/living/ghoul) LAZYREMOVE(created_items, WEAKREF(ghoul)) /datum/heretic_knowledge/limited_amount/flesh_ghoul @@ -125,12 +138,10 @@ /obj/item/food/grown/poppy = 1, ) limit = 2 - cost = 1 + cost = 2 research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' research_tree_icon_state = "ghoul_voiceless" - - /datum/heretic_knowledge/limited_amount/flesh_ghoul/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) . = ..() if(!.) @@ -173,6 +184,9 @@ make_ghoul(user, soon_to_be_ghoul) return TRUE +/// The max amount of health a voiceless dead has. +#define MUTE_MAX_HEALTH 50 + /// Makes [victim] into a ghoul. /datum/heretic_knowledge/limited_amount/flesh_ghoul/proc/make_ghoul(mob/living/user, mob/living/carbon/human/victim) user.log_message("created a voiceless dead, controlled by [key_name(victim)].", LOG_GAME) @@ -196,17 +210,6 @@ LAZYREMOVE(created_items, WEAKREF(ghoul)) REMOVE_TRAIT(ghoul, TRAIT_MUTE, MAGIC_TRAIT) -/datum/heretic_knowledge/mark/flesh_mark - name = "Mark of Flesh" - desc = "Your Mansus Grasp now applies the Mark of Flesh. The mark is triggered from an attack with your Bloody Blade. \ - When triggered, the victim begins to bleed significantly." - gain_text = "That's when I saw them, the marked ones. They were out of reach. They screamed, and screamed." - - - mark_type = /datum/status_effect/eldritch/flesh - -/datum/heretic_knowledge/knowledge_ritual/flesh - /datum/heretic_knowledge/spell/flesh_surgery name = "Knitting of Flesh" desc = "Grants you the spell Knit Flesh. This spell allows you to remove organs from victims \ @@ -215,7 +218,22 @@ gain_text = "But they were not out of my reach for long. With every step, the screams grew, until at last \ I learned that they could be silenced." action_to_add = /datum/action/cooldown/spell/touch/flesh_surgery - cost = 1 + cost = 2 + drafting_tier = 5 + +/datum/heretic_knowledge/armor/flesh + desc = "Allows you to transmute a table (or a suit), a mask and a pool of blood to create a writhing embrace. \ + It grants you the ability to detect the health condition of other living (and non-living) and an aura that slowly heals your summons. \ + Acts as a focus while hooded." + gain_text = "I tugged these wretched, slothing things about me, like one might a warm blanket. \ + With eyes-not-mine, they will witness. With teeth-not-mine, they will clench. With limbs-not-mine, they will break." + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/flesh) + research_tree_icon_state = "flesh_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + /obj/effect/decal/cleanable/blood = 1, + ) /datum/heretic_knowledge/summon/raw_prophet name = "Raw Ritual" @@ -230,7 +248,7 @@ /obj/item/bodypart/arm/left = 1, ) mob_to_summon = /mob/living/basic/heretic_summon/raw_prophet - cost = 1 + cost = 2 poll_ignore_define = POLL_IGNORE_RAW_PROPHET @@ -268,10 +286,10 @@ /obj/item/paper = 1, ) mob_to_summon = /mob/living/basic/heretic_summon/stalker - cost = 1 + cost = 2 poll_ignore_define = POLL_IGNORE_STALKER - + is_final_knowledge = TRUE /datum/heretic_knowledge/ultimate/flesh_final name = "Priest's Final Hymn" @@ -297,7 +315,7 @@ worm_spell.Grant(user) var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) - var/datum/heretic_knowledge/limited_amount/flesh_grasp/grasp_ghoul = heretic_datum.get_knowledge(/datum/heretic_knowledge/limited_amount/flesh_grasp) + var/datum/heretic_knowledge/limited_amount/starting/base_flesh/grasp_ghoul = heretic_datum.get_knowledge(/datum/heretic_knowledge/limited_amount/starting/base_flesh) grasp_ghoul.limit *= 3 var/datum/heretic_knowledge/limited_amount/flesh_ghoul/ritual_ghoul = heretic_datum.get_knowledge(/datum/heretic_knowledge/limited_amount/flesh_ghoul) ritual_ghoul.limit *= 3 diff --git a/code/modules/antagonists/heretic/knowledge/general_side.dm b/code/modules/antagonists/heretic/knowledge/general_side.dm deleted file mode 100644 index e2f445cb8a62..000000000000 --- a/code/modules/antagonists/heretic/knowledge/general_side.dm +++ /dev/null @@ -1,42 +0,0 @@ -// Some general sidepath options. - -/datum/heretic_knowledge/reroll_targets - name = "The Relentless Heartbeat" - desc = "Allows you transmute a harebell, a book, and a jumpsuit while standing over a rune \ - to reroll your sacrifice targets." - gain_text = "The heart is the principle that continues and preserves." - required_atoms = list( - /obj/item/food/grown/harebell = 1, - /obj/item/book = 1, - /obj/item/clothing/under = 1, - ) - cost = 1 - research_tree_icon_path = 'icons/mob/actions/actions_animal.dmi' - research_tree_icon_state = "gaze" - -/datum/heretic_knowledge/reroll_targets/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) - - var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) - // Check first if they have a Living Heart. If it's missing, we should - // throw a fail to show the heretic that there's no point in rerolling - // if you don't have a heart to track the targets in the first place. - if(heretic_datum.has_living_heart() != HERETIC_HAS_LIVING_HEART) - loc.balloon_alert(user, "ritual failed, no living heart!") - return FALSE - - return TRUE - -/datum/heretic_knowledge/reroll_targets/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) - var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) - for(var/mob/living/carbon/human/target as anything in heretic_datum.sac_targets) - heretic_datum.remove_sacrifice_target(target) - - var/datum/heretic_knowledge/hunt_and_sacrifice/target_finder = heretic_datum.get_knowledge(/datum/heretic_knowledge/hunt_and_sacrifice) - if(!target_finder) - CRASH("Heretic datum didn't have a hunt_and_sacrifice knowledge learned, what?") - - if(!target_finder.obtain_targets(user, heretic_datum = heretic_datum)) - loc.balloon_alert(user, "ritual failed, no targets found!") - return FALSE - - return TRUE diff --git a/code/modules/antagonists/heretic/knowledge/heretic_armor_knowledge.dm b/code/modules/antagonists/heretic/knowledge/heretic_armor_knowledge.dm new file mode 100644 index 000000000000..5bd0379cfe30 --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/heretic_armor_knowledge.dm @@ -0,0 +1,26 @@ +/datum/heretic_knowledge/armor + name = "Armorer's Ritual" + desc = "Allows you to transmute a table (or a suit) and a mask to create Eldritch Armor. \ + Eldritch Armor provides great protection while also acting as a focus when hooded." + gain_text = "The Rusted Hills welcomed the Blacksmith in their generosity. And the Blacksmith \ + returned their generosity in kind." + + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + ) + abstract_parent_type = /datum/heretic_knowledge/armor + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch) + cost = 1 + + research_tree_icon_path = 'icons/obj/clothing/suits/armor.dmi' + research_tree_icon_state = "eldritch_armor" + research_tree_icon_frame = 1 + +/datum/heretic_knowledge/armor/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) + . = ..() + var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) + if(!heretic_datum) + return + SEND_SIGNAL(heretic_datum, COMSIG_HERETIC_PASSIVE_UPGRADE_FIRST) + heretic_datum.gain_knowledge(/datum/heretic_knowledge/knowledge_ritual) diff --git a/code/modules/antagonists/heretic/knowledge/lock_lore.dm b/code/modules/antagonists/heretic/knowledge/lock_lore.dm index b59711a93086..76f2dfd27763 100644 --- a/code/modules/antagonists/heretic/knowledge/lock_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/lock_lore.dm @@ -1,23 +1,50 @@ - -/datum/heretic_knowledge_tree_column/main/lock - neighbour_type_left = /datum/heretic_knowledge_tree_column/moon_to_lock - neighbour_type_right = /datum/heretic_knowledge_tree_column/lock_to_flesh - +/datum/heretic_knowledge_tree_column/lock route = PATH_LOCK ui_bgr = "node_lock" + complexity = "Medium" + complexity_color = COLOR_YELLOW + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "key_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Lock revolves around access, area denial, theft and gadgets.", + "Pick this path if you want a less confrontational playstyle and more interested in being a slippery rat.", + ) + pros = list( + "Your mansus grasp can open any lock, unlock every terminal and bypass any access restriction.", + "lock heretics get a discount from the knowledge shop, making it the perfect path if you want to experiment with the various trinkets the shop has to offer.", + ) + cons = list( + "The weakest heretic path in direct combat, period.", + "Very limited direct combat benefits.", + "You have no defensive benefits or immunities.", + "no mobility or direct additional teleportation", + "Highly reliant on sourcing power from other departments, players and the game world.", + ) + tips = list( + "Your mansus grasp allows you to access everything, from airlocks, consoles and even exosuits, but it has no additional effects on players. It will however leave a mark that when triggered will make your victim unable to leave the room you are in.", + "Your blade also functions as a crowbar! You can store it in utility belts And, in a pitch, use it to force open an airlock.", + "Your Eldritch ID can create a portal between 2 different airlocks. Useful if you want to enstablish a secret base.", + "Use your labyrinth book to shake off pursuers. It creates impassible walls to anyone but you.", + ) - start = /datum/heretic_knowledge/limited_amount/starting/base_knock - grasp = /datum/heretic_knowledge/lock_grasp - tier1 = /datum/heretic_knowledge/key_ring - mark = /datum/heretic_knowledge/mark/lock_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/lock - unique_ability = /datum/heretic_knowledge/limited_amount/concierge_rite - tier2 = /datum/heretic_knowledge/spell/burglar_finesse + start = /datum/heretic_knowledge/limited_amount/starting/base_lock + knowledge_tier1 = /datum/heretic_knowledge/key_ring + guaranteed_side_tier1 = /datum/heretic_knowledge/painting + knowledge_tier2 = /datum/heretic_knowledge/limited_amount/concierge_rite + guaranteed_side_tier2 = /datum/heretic_knowledge/spell/opening_blast + robes = /datum/heretic_knowledge/armor/lock + knowledge_tier3 = /datum/heretic_knowledge/spell/burglar_finesse + guaranteed_side_tier3 = /datum/heretic_knowledge/summon/fire_shark blade = /datum/heretic_knowledge/blade_upgrade/flesh/lock - tier3 = /datum/heretic_knowledge/spell/caretaker_refuge + knowledge_tier4 = /datum/heretic_knowledge/spell/caretaker_refuge ascension = /datum/heretic_knowledge/ultimate/lock_final -/datum/heretic_knowledge/limited_amount/starting/base_knock +/datum/heretic_knowledge/limited_amount/starting/base_lock name = "A Steward's Secret" desc = "Opens up the Path of Lock to you. \ Allows you to transmute a knife and a crowbar into a Key Blade. \ @@ -32,33 +59,31 @@ limit = 2 research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "key_blade" + mark_type = /datum/status_effect/eldritch/lock + eldritch_passive = /datum/status_effect/heretic_passive/lock -/datum/heretic_knowledge/lock_grasp - name = "Grasp of Lock" - 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." - cost = 1 - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_lock" - -/datum/heretic_knowledge/lock_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) +/datum/heretic_knowledge/limited_amount/starting/base_lock/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)) + var/datum/action/cooldown/spell/touch/mansus_grasp/grasp_spell = locate() in user.actions + grasp_spell?.invocation_type = INVOCATION_NONE + grasp_spell?.sound = null -/datum/heretic_knowledge/lock_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) +/datum/heretic_knowledge/limited_amount/starting/base_lock/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/lock_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER +/datum/heretic_knowledge/limited_amount/starting/base_lock/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() + var/obj/item/clothing/under/suit = target.get_item_by_slot(ITEM_SLOT_ICLOTHING) + if(!suit.can_adjust) + return if(istype(suit) && suit.adjusted == NORMAL_STYLE) suit.toggle_jumpsuit_adjust() suit.update_appearance() -/datum/heretic_knowledge/lock_grasp/proc/on_secondary_mansus_grasp(mob/living/source, atom/target) +/datum/heretic_knowledge/limited_amount/starting/base_lock/proc/on_secondary_mansus_grasp(mob/living/source, atom/target) SIGNAL_HANDLER if(ismecha(target)) @@ -80,7 +105,14 @@ var/turf/target_turf = get_turf(target) SEND_SIGNAL(target_turf, COMSIG_ATOM_MAGICALLY_UNLOCKED, src, source) - playsound(target, 'sound/effects/magic/hereticknock.ogg', 100, TRUE, -1) + SEND_SOUND(source, 'sound/effects/magic/hereticknock.ogg') + + if(HAS_TRAIT(source, TRAIT_LOCK_GRASP_UPGRADED)) + var/datum/action/cooldown/spell/touch/mansus_grasp/grasp = locate() in source.actions + if(grasp) + grasp.next_use_time -= round(grasp.cooldown_time*0.75) + grasp.build_all_button_icons() + return return COMPONENT_USE_HAND @@ -99,7 +131,7 @@ /obj/item/card/id/advanced = 1, ) result_atoms = list(/obj/item/card/id/advanced/heretic) - cost = 1 + cost = 2 research_tree_icon_path = 'icons/obj/card.dmi' research_tree_icon_state = "card_gold" @@ -115,20 +147,10 @@ result_item.shapeshift(id) return TRUE -/datum/heretic_knowledge/mark/lock_mark - name = "Mark of Lock" - desc = "Your Mansus Grasp now applies the Mark of Lock. \ - 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 = "The Gatekeeper was a corrupt Steward. She hindered her fellows for her own twisted amusement." - mark_type = /datum/status_effect/eldritch/lock - -/datum/heretic_knowledge/knowledge_ritual/lock - -/datum/heretic_knowledge/limited_amount/concierge_rite // item that creates 3 max at a time heretic only barriers, probably should limit to 1 only, holy people can also pass +/datum/heretic_knowledge/limited_amount/concierge_rite name = "Concierge's Rite" desc = "Allows you to transmute a crayon, a wooden plank, and a multitool to create a Labyrinth Handbook. \ - It can materialize a barricade at range that only you and people resistant to magic can pass. 3 uses." + It can materialize a barricade at range that only you and people resistant to magic can pass. Has 5 charges which regenerate over time." gain_text = "The Concierge scribbled my name into the Handbook. \"Welcome to your new home, fellow Steward.\"" required_atoms = list( /obj/item/toy/crayon = 1, @@ -136,9 +158,25 @@ /obj/item/multitool = 1, ) result_atoms = list(/obj/item/heretic_labyrinth_handbook) - cost = 1 + cost = 2 research_tree_icon_path = 'icons/obj/service/library.dmi' research_tree_icon_state = "heretichandbook" + drafting_tier = 5 + +/datum/heretic_knowledge/armor/lock + desc = "Allows you to transmute a table (or a suit), a mask and a crowbar to create a shifting guise. \ + It grants you camoflage from cameras, hides your identity, voice and muffles your footsteps. \ + Acts as a focus while hooded." + gain_text = "While stewards are known to the Concierge, \ + they still consort between one another and with outsiders under shaded cloaks and drawn hoods. \ + Familiarity is treachery, even to oneself." + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/lock) + research_tree_icon_state = "lock_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + /obj/item/crowbar = 1, + ) /datum/heretic_knowledge/spell/burglar_finesse name = "Burglar's Finesse" @@ -147,9 +185,9 @@ gain_text = "Consorting with Burglar spirits is frowned upon, but a Steward will always want to learn about new doors." action_to_add = /datum/action/cooldown/spell/pointed/burglar_finesse - cost = 1 + cost = 2 -/datum/heretic_knowledge/blade_upgrade/flesh/lock //basically a chance-based weeping avulsion version of the former +/datum/heretic_knowledge/blade_upgrade/flesh/lock name = "Opening Blade" desc = "Your blade has a chance to cause a weeping avulsion on attack." gain_text = "The Pilgrim-Surgeon was not an Steward. Nonetheless, its blades and sutures proved a match for their keys." @@ -169,7 +207,8 @@ You are invincible but unable to harm anything. Cancelled by being hit with an anti-magic item." gain_text = "Jealously, the Guard and the Hound hunted me. But I unlocked my form, and was but a haze, untouchable." action_to_add = /datum/action/cooldown/spell/caretaker - cost = 1 + cost = 2 + is_final_knowledge = TRUE /datum/heretic_knowledge/ultimate/lock_final name = "Unlock the Labyrinth" diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm index 69dd2dd4aade..d69b0bdb31a2 100644 --- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -1,57 +1,80 @@ - -/datum/heretic_knowledge_tree_column/main/moon - neighbour_type_left = /datum/heretic_knowledge_tree_column/ash_to_moon - neighbour_type_right = /datum/heretic_knowledge_tree_column/moon_to_lock - +/datum/heretic_knowledge_tree_column/moon route = PATH_MOON ui_bgr = "node_moon" + complexity = "Hard" + complexity_color = COLOR_RED + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "moon_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Moon revolves around sanity, sowing confusion and discord, and skirting the conventional rules of combat.", + "Play this path if you are already experienced with Heretic and want to try something highly unconventional, or simply if you desire to play a pacifist Heretic (Yes, really!)." + ) + pros = list( + "High amount of tools to confound foes.", + "Sows chaos through the station via lunatics.", + "Practically immune to disabling effects while wearing the Resplendent Regalia." + ) + cons = list( + "No mobility.", + "Mo direct tools to damage your opponents.", + "Reliant on misdirection and confusion.", + "Lunatics can become liabilities.", + "Fairly fragile despite their unique protection mechanics.", + "Death while wearing the Resplendent Regalia results in a gorey end.", + ) + tips = list( + "Your Mansus Grasp will make your victim briefly hallucinate and apply a mark that, when triggered by your moon blade, will apply confusion and pacify them (the latter will get removed if the victim receives too much damage at once).", + "Your moon blade is special compared to the other heretic blades. It can be used even if you are pacified.", + "Your passive makes you completely impervious to brain traumas and slowly regenerates your brain health. Makes sure to upgrade it to bolster the regeneration effect.", + "Your Resplendent Regalia utterly changes the rules of combat for you and your opponents; You become fully immune to disabling effect, and all damage received (lethal or non lethal) will be converted into brain damage. However. the robes themselves have no armor, and prevent you from using guns as well as pacifying you (you can still use your moon blade).", + "Your moon amulette allows you to channel its effects through your moon blade. When toggled on, your Moon blade will no longer do lethal damage, but do sanity damage and become unblockable, this also allows you to use it while wearing your robes!", + "Your moon amulette is a vital part of your kit, as it allows your passive to regenerate double the brain health while worn.", + "If the sanity of your opponents goes below a certain threshold, they'll become a lunatic. Lunatics are prompted to start attacking everyone (including you). Should you want to sacrifice them (or to get them to leave you be), hit them again with your moon blade to put them to sleep.", + "Ringleader's Rise summons an army of clones. They do barely any damage, but should they be attacked by non-heretics, they will explode and cause sanity and brain damage to those around them.", + "Your ascension will grant you an aura that converts nearby people to loyal lunatics. However, if they have a mindshield implant, their heads will instead detonate after a time.", + ) start = /datum/heretic_knowledge/limited_amount/starting/base_moon - grasp = /datum/heretic_knowledge/moon_grasp - tier1 = /datum/heretic_knowledge/spell/moon_smile - mark = /datum/heretic_knowledge/mark/moon_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/moon - unique_ability = /datum/heretic_knowledge/spell/moon_parade - tier2 = /datum/heretic_knowledge/moon_amulet + knowledge_tier1 = /datum/heretic_knowledge/spell/mind_gate + guaranteed_side_tier1 = /datum/heretic_knowledge/phylactery + knowledge_tier2 = /datum/heretic_knowledge/moon_amulet + guaranteed_side_tier2 = /datum/heretic_knowledge/codex_morbus + robes = /datum/heretic_knowledge/armor/moon + knowledge_tier3 = /datum/heretic_knowledge/spell/moon_parade + guaranteed_side_tier3 = /datum/heretic_knowledge/unfathomable_curio blade = /datum/heretic_knowledge/blade_upgrade/moon - tier3 = /datum/heretic_knowledge/spell/moon_ringleader + knowledge_tier4 = /datum/heretic_knowledge/spell/moon_ringleader ascension = /datum/heretic_knowledge/ultimate/moon_final /datum/heretic_knowledge/limited_amount/starting/base_moon name = "Moonlight Troupe" desc = "Opens up the Path of Moon to you. \ - Allows you to transmute 2 sheets of iron and a knife into an Lunar Blade. \ + Allows you to transmute 2 sheets of glass and a knife into an Lunar Blade. \ You can only create two at a time." gain_text = "Under the light of the moon the laughter echoes." required_atoms = list( /obj/item/knife = 1, - /obj/item/stack/sheet/iron = 2, + /obj/item/stack/sheet/glass = 2, ) result_atoms = list(/obj/item/melee/sickly_blade/moon) research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "moon_blade" + mark_type = /datum/status_effect/eldritch/moon + eldritch_passive = /datum/status_effect/heretic_passive/moon /datum/heretic_knowledge/limited_amount/starting/base_moon/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - ADD_TRAIT(user, TRAIT_EMPATH, REF(src)) - -/datum/heretic_knowledge/moon_grasp - name = "Grasp of Lunacy" - desc = "Your Mansus Grasp will cause your victims to hallucinate everyone as lunar mass, \ - and hides your identity for a short duration." - gain_text = "The troupe on the side of the moon showed me truth, and I took it." - cost = 1 - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_moon" - -/datum/heretic_knowledge/moon_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) + . = ..() + user.AddComponentFrom(REF(src), /datum/component/empathy, seen_it = TRUE, visible_info = ALL, self_empath = FALSE, sense_dead = FALSE, sense_whisper = TRUE, smite_target = FALSE) -/datum/heretic_knowledge/moon_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK) +/datum/heretic_knowledge/limited_amount/starting/base_moon/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() -/datum/heretic_knowledge/moon_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER - if(target.can_block_magic(MAGIC_RESISTANCE_MIND)) + if(target.can_block_magic(MAGIC_RESISTANCE_MOON)) to_chat(target, span_danger("You hear echoing laughter from above..but it is dull and distant.")) return @@ -64,39 +87,23 @@ carbon_target.cause_hallucination(/datum/hallucination/delusion/preset/moon, "delusion/preset/moon hallucination caused by mansus grasp") carbon_target.mob_mood.adjust_sanity(-30) -/datum/heretic_knowledge/spell/moon_smile - name = "Smile of the moon" - desc = "Grants you Smile of the moon, a ranged spell muting, blinding, deafening and knocking down the target for a\ - duration based on their sanity." - gain_text = "The moon smiles upon us all and those who see its true side can bring its joy." - - action_to_add = /datum/action/cooldown/spell/pointed/moon_smile - cost = 1 - -/datum/heretic_knowledge/mark/moon_mark - name = "Mark of Moon" - desc = "Your Mansus Grasp now applies the Mark of Moon, pacifying the victim until attacked. \ - The mark can also be triggered from an attack with your Moon Blade, leaving the victim confused." - gain_text = "The troupe on the moon would dance all day long \ - and in that dance the moon would smile upon us \ - but when the night came its smile would dull forced to gaze on the earth." - mark_type = /datum/status_effect/eldritch/moon +/datum/heretic_knowledge/spell/mind_gate + name = "Mind Gate" + desc = "Grants you Mind Gate, a spell which mutes,deafens, blinds, inflicts hallucinations, \ + confusion, oxygen loss and brain damage to its target over 10 seconds.\ + The caster takes 20 brain damage per use." + gain_text = "My mind swings open like a gate, and its insight will let me perceive the truth." -/datum/heretic_knowledge/knowledge_ritual/moon - -/datum/heretic_knowledge/spell/moon_parade - name = "Lunar Parade" - desc = "Grants you Lunar Parade, a spell that - after a short charge - sends a carnival forward \ - when hitting someone they are forced to join the parade and suffer hallucinations." - gain_text = "The music like a reflection of the soul compelled them, like moths to a flame they followed" - action_to_add = /datum/action/cooldown/spell/pointed/projectile/moon_parade - cost = 1 + action_to_add = /datum/action/cooldown/spell/pointed/mind_gate + cost = 2 /datum/heretic_knowledge/moon_amulet name = "Moonlight Amulet" desc = "Allows you to transmute 2 sheets of glass, a heart and a tie to create a Moonlight Amulet. \ If the item is used on someone with low sanity they go berserk attacking everyone, \ - if their sanity isn't low enough it decreases their mood." + if their sanity isn't low enough it decreases their mood. \ + Wearing this will grant you the ability to see heathens through walls and make your blades harmless, they will instead directly attack their mind. \ + Provides thermal vision and doubles the brain regen of a moon heretic while worn." gain_text = "At the head of the parade he stood, the moon condensed into one mass, a reflection of the soul." required_atoms = list( @@ -105,19 +112,41 @@ /obj/item/clothing/neck/tie = 1, ) result_atoms = list(/obj/item/clothing/neck/heretic_focus/moon_amulet) - cost = 1 - + cost = 2 research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' research_tree_icon_state = "moon_amulette" research_tree_icon_frame = 9 +/datum/heretic_knowledge/armor/moon + desc = "Allows you to transmute a table (or a suit), a mask and two sheets of glass to create a Resplendant Regalia, this robe will render the user fully immune to disabling effects and convert all forms of damage into brain damage, while also pacifying the user and render him unable to use ranged weapons (Moon blade will bypass pacifism). \ + Acts as a focus while hooded." + gain_text = "Trails of light and mirth flowed from every arm of this magnificent attire. \ + The troupe twirled in irridescent cascades, dazzling onlookers with the truth they sought. \ + I observed, basking in the light, to find my self." + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon) + research_tree_icon_state = "moon_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + /obj/item/stack/sheet/glass = 2, + ) + +/datum/heretic_knowledge/spell/moon_parade + name = "Lunar Parade" + desc = "Grants you Lunar Parade, a spell that - after a short charge - sends a carnival forward \ + when hitting someone they are forced to join the parade and suffer hallucinations." + gain_text = "The music like a reflection of the soul compelled them, like moths to a flame they followed" + action_to_add = /datum/action/cooldown/spell/pointed/projectile/moon_parade + cost = 2 + drafting_tier = 5 + /datum/heretic_knowledge/blade_upgrade/moon name = "Moonlight Blade" - desc = "Your blade now deals brain damage, causes random hallucinations and does sanity damage." + desc = "Your blade now deals brain damage, causes random hallucinations and does sanity damage. \ + Deals more brain damage if your victim is insane or unconscious." gain_text = "His wit was sharp as a blade, cutting through the lie to bring us joy." - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' research_tree_icon_state = "blade_upgrade_moon" @@ -125,16 +154,19 @@ if(source == target || !isliving(target)) return - if(target.can_block_magic(MAGIC_RESISTANCE_MIND)) + if(target.can_block_magic(MAGIC_RESISTANCE_MOON)) return - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 100) target.cause_hallucination( \ get_random_valid_hallucination_subtype(/datum/hallucination/body), \ "upgraded path of moon blades", \ ) target.emote(pick("giggle", "laugh")) - target.mob_mood.adjust_sanity(-10) + target.mob_mood?.adjust_sanity(-10) + if(target.stat == CONSCIOUS && target.mob_mood?.sanity >= SANITY_NEUTRAL) + target.adjust_organ_loss(ORGAN_SLOT_BRAIN, 10) + return + target.adjust_organ_loss(ORGAN_SLOT_BRAIN, 25) /datum/heretic_knowledge/spell/moon_ringleader name = "Ringleaders Rise" @@ -145,17 +177,17 @@ The ringleader pointed up and the dim light of truth illuminated us further." action_to_add = /datum/action/cooldown/spell/aoe/moon_ringleader - cost = 1 - + cost = 2 research_tree_icon_frame = 5 + is_final_knowledge = TRUE /datum/heretic_knowledge/ultimate/moon_final name = "The Last Act" desc = "The ascension ritual of the Path of Moon. \ Bring 3 corpses with more than 50 brain damage to a transmutation rune to complete the ritual. \ When completed, you become a harbinger of madness gaining and aura of passive sanity decrease, \ - confusion increase and, if their sanity is low enough, brain damage and blindness. \ + crewmembers with low enough sanity will be converted into acolytes. \ 1/5th of the crew will turn into acolytes and follow your command, they will all receive moonlight amulets." gain_text = "We dived down towards the crowd, his soul splitting off in search of greater venture \ for where the Ringleader had started the parade, I shall continue it unto the suns demise \ @@ -198,62 +230,91 @@ var/max_lunatics = ceil(max(length(GLOB.manifest.locked), length(lunatic_candidates)) * 0.2) for(var/mob/living/carbon/human/crewmate as anything in lunatic_candidates) - // Heretics, lunatics and monsters shouldn't become lunatics because they either have a master or have a mansus grasp - if(IS_HERETIC_OR_MONSTER(crewmate)) - to_chat(crewmate, span_boldwarning("[user]'s rise is influencing those who are weak willed. Their minds shall rend." )) - continue - // Mindshielded and anti-magic folks are immune against this effect because this is a magical mind effect - if(HAS_MIND_TRAIT(crewmate, TRAIT_UNCONVERTABLE) || crewmate.can_block_magic(MAGIC_RESISTANCE)) - to_chat(crewmate, span_boldwarning("You feel shielded from something." )) - continue if(amount_of_lunatics > max_lunatics) to_chat(crewmate, span_boldwarning("You feel uneasy, as if for a brief moment something was gazing at you.")) continue - var/datum/antagonist/lunatic/lunatic = crewmate.mind.add_antag_datum(/datum/antagonist/lunatic) - lunatic.set_master(user.mind, user) - var/obj/item/clothing/neck/heretic_focus/moon_amulet/amulet = new(crewmate.drop_location()) - var/static/list/slots = list( - LOCATION_NECK, - LOCATION_HANDS, - LOCATION_RPOCKET, - LOCATION_LPOCKET, - LOCATION_BACKPACK, - ) - crewmate.equip_in_one_of_slots(amulet, slots, qdel_on_fail = FALSE) - crewmate.emote("laugh") - amount_of_lunatics++ + if(attempt_conversion(crewmate, user)) + amount_of_lunatics++ + +/datum/heretic_knowledge/ultimate/moon_final/proc/attempt_conversion(mob/living/carbon/convertee, mob/user) + // Heretics, lunatics and monsters shouldn't become lunatics because they either have a master or have a mansus grasp + if(IS_HERETIC_OR_MONSTER(convertee)) + to_chat(convertee, span_boldwarning("[user]'s rise is influencing those who are weak willed. Their minds shall rend." )) + return FALSE + // Mindshielded and anti-magic folks are immune against this effect because this is a magical mind effect + if(HAS_MIND_TRAIT(convertee, TRAIT_UNCONVERTABLE) || convertee.can_block_magic(MAGIC_RESISTANCE)) + to_chat(convertee, span_boldwarning("You feel shielded from something." )) + return FALSE + + if(!convertee.mind) + return FALSE + + var/datum/antagonist/lunatic/lunatic = convertee.mind.add_antag_datum(/datum/antagonist/lunatic) + lunatic.set_master(user.mind, user) + var/obj/item/clothing/neck/heretic_focus/moon_amulet/amulet = new(convertee.drop_location()) + var/static/list/slots = list( + LOCATION_NECK, + LOCATION_HANDS, + LOCATION_RPOCKET, + LOCATION_LPOCKET, + LOCATION_BACKPACK, + ) + convertee.equip_in_one_of_slots(amulet, slots, qdel_on_fail = FALSE) + INVOKE_ASYNC(convertee, TYPE_PROC_REF(/mob, emote), "laugh") + return TRUE /datum/heretic_knowledge/ultimate/moon_final/proc/on_life(mob/living/source, seconds_per_tick, times_fired) SIGNAL_HANDLER - visible_hallucination_pulse( center = get_turf(source), radius = 7, hallucination_duration = 60 SECONDS ) - for(var/mob/living/carbon/carbon_view in view(5, source)) + for(var/mob/living/carbon/carbon_view in range(7, source)) + var/carbon_sanity = carbon_view.mob_mood.sanity if(carbon_view.stat != CONSCIOUS) continue if(IS_HERETIC_OR_MONSTER(carbon_view)) continue - if(carbon_view.can_block_magic(MAGIC_RESISTANCE_MIND)) //Somehow a shitty piece of tinfoil is STILL able to hold out against the power of an ascended heretic. + if(carbon_view.can_block_magic(MAGIC_RESISTANCE_MOON)) //Somehow a shitty piece of tinfoil is STILL able to hold out against the power of an ascended heretic. continue new /obj/effect/temp_visual/moon_ringleader(get_turf(carbon_view)) + if(carbon_view.has_status_effect(/datum/status_effect/confusion)) + to_chat(carbon_view, span_big(span_hypnophrase("YOUR HEAD RATTLES WITH A THOUSAND VOICES JOINED IN A MADDENING CACOPHONY OF SOUND AND MUSIC. EVERY FIBER OF YOUR BEING SAYS 'RUN'."))) carbon_view.adjust_confusion(2 SECONDS) - carbon_view.mob_mood.adjust_sanity(-5) - var/carbon_sanity = carbon_view.mob_mood.sanity - if(carbon_sanity < 30) - if(SPT_PROB(20, seconds_per_tick)) - to_chat(carbon_view, span_warning("you feel your mind beginning to rend!")) - carbon_view.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) - - if(carbon_sanity < 10) - if(SPT_PROB(20, seconds_per_tick)) - to_chat(carbon_view, span_warning("it echoes through you!")) - visible_hallucination_pulse( - center = get_turf(carbon_view), - radius = 7, - hallucination_duration = 50 SECONDS - ) - carbon_view.adjust_temp_blindness(5 SECONDS) + carbon_view.mob_mood.adjust_sanity(-20) + + if(carbon_sanity >= 10) + return + // So our sanity is dead, time to fuck em up + if(SPT_PROB(20, seconds_per_tick)) + to_chat(carbon_view, span_warning("it echoes through you!")) + visible_hallucination_pulse( + center = get_turf(carbon_view), + radius = 7, + hallucination_duration = 50 SECONDS + ) + carbon_view.adjust_temp_blindness(5 SECONDS) + if(should_mind_explode(carbon_view)) + to_chat(carbon_view, span_boldbig(span_red(\ + "YOUR SENSES REEL AS YOUR MIND IS ENVELOPED BY AN OTHERWORLDLY FORCE ATTEMPTING TO REWRITE YOUR VERY BEING. \ + YOU CANNOT EVEN BEGIN TO SCREAM BEFORE YOUR IMPLANT ACTIVATES ITS PSIONIC FAIL-SAFE PROTOCOL, TAKING YOUR HEAD WITH IT."))) + var/obj/item/bodypart/head/head = locate() in carbon_view.bodyparts + if(head) + head.dismember() + else + carbon_view.gib(DROP_ALL_REMAINS) + var/datum/effect_system/reagents_explosion/explosion = new() + explosion.set_up(1, get_turf(carbon_view), TRUE, 0) + explosion.start(src) + else + attempt_conversion(carbon_view, source) + + +/datum/heretic_knowledge/ultimate/moon_final/proc/should_mind_explode(mob/living/carbon/target) + if(HAS_TRAIT(target, TRAIT_MINDSHIELD)) + return TRUE + if(IS_CULTIST_OR_CULTIST_MOB(target)) + return TRUE + return FALSE diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index 4a60d372445e..dfd35ef10731 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -1,20 +1,53 @@ - -/datum/heretic_knowledge_tree_column/main/rust - neighbour_type_left = /datum/heretic_knowledge_tree_column/blade_to_rust - neighbour_type_right = /datum/heretic_knowledge_tree_column/rust_to_cosmic - +/datum/heretic_knowledge_tree_column/rust route = PATH_RUST ui_bgr = "node_rust" + complexity = "Medium" + complexity_color = COLOR_YELLOW + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "rust_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Rust revolves around durability, corruption and brute forcing your way through obstacles.", + "Pick this path if you enjoy a standing your ground and letting the fight come to you.", + ) + pros = list( + "Standing on rusted tiles makes you highly durable; regenerating wounds and removing stuns.", + "Rusted tiles harm your foes and slow them down.", + "You are able to destroy walls, objects, mechs, structures and airlocks with ease.", + "You can instantly obliterate silicons or synthetic crew members with your Mansus Grasp.", + "You have a high amount of disruption abilities to make it easier to fight in your territory.", + ) + cons = list( + "Extremely overt; throws stealth completely out as an option.", + "If you are not on rusted tiles, you become significantly more vulnerable.", + "Being locked to a territorial conflict makes it much easier to use destructive tools (like bombs) against you.", + "Your high amount of defensive power is at the cost of offensive power.", + ) + tips = list( + "Your Mansus Grasp will instantly destroy mechs, silicons and androids. Hitting a marked target with your blade will cause heavy disgust and make them vomit, knocking them down briefly.", + "Your Mansus Grasp and your spells are capable of rusting walls and floors, making them beneficial to you and harmful to the crew and silicons. Spread rust as much as possible.", + "Rusted turfs will heal you, regulate your blood temperature, make you resistant to batons knockdown, regenerate your stamina and blood and heal your wound and limbs once you level up your passive.", + "Always fight on your turf. Your opponent entering your turf are at a significant disadvantage.", + "Your Reassembled Raiment is only empowered while you are on your rusted tiles. If you want the most out of its power, stay on your rusted tiles.", + "Your ability to destroy objects and walls improves as your passive ugprade increases; eventually you will be able to melt through airlocks, reinforced walls and even titanium walls.", + "Spreading rust can be fairly slow, especially early on. Consider summoning a few rust walkers to help you expand your domain.", + "Rusted Construction allows you to produce barriers for cover or escape, or even block off someone else's escape in a pinch. Make the most of it to manipulate the environment to your needs.", + ) start = /datum/heretic_knowledge/limited_amount/starting/base_rust - grasp = /datum/heretic_knowledge/rust_fist - tier1 = /datum/heretic_knowledge/rust_regen - mark = /datum/heretic_knowledge/mark/rust_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/rust - unique_ability = /datum/heretic_knowledge/spell/rust_construction - tier2 = /datum/heretic_knowledge/spell/area_conversion + knowledge_tier1 = /datum/heretic_knowledge/spell/area_conversion + guaranteed_side_tier1 = /datum/heretic_knowledge/rust_sower + knowledge_tier2 = /datum/heretic_knowledge/spell/rust_construction + guaranteed_side_tier2 = /datum/heretic_knowledge/summon/rusty + robes = /datum/heretic_knowledge/armor/rust + knowledge_tier3 = /datum/heretic_knowledge/spell/entropic_plume + guaranteed_side_tier3 = /datum/heretic_knowledge/crucible blade = /datum/heretic_knowledge/blade_upgrade/rust - tier3 = /datum/heretic_knowledge/spell/entropic_plume + knowledge_tier4 = /datum/heretic_knowledge/spell/rust_charge ascension = /datum/heretic_knowledge/ultimate/rust_final /datum/heretic_knowledge/limited_amount/starting/base_rust @@ -30,34 +63,34 @@ result_atoms = list(/obj/item/melee/sickly_blade/rust) research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "rust_blade" + mark_type = /datum/status_effect/eldritch/rust + eldritch_passive = /datum/status_effect/heretic_passive/rust -/datum/heretic_knowledge/rust_fist - name = "Grasp of Rust" - desc = "Your Mansus Grasp will deal 500 damage to non-living matter and rust any surface it touches. \ - Already rusted surfaces are destroyed. Surfaces and structures can only be rusted by using Right-Click. \ - Allows you to rust basic iron walls and floors." - gain_text = "On the ceiling of the Mansus, rust grows as moss does on a stone." - cost = 1 - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_rust" - -/datum/heretic_knowledge/rust_fist/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) +/datum/heretic_knowledge/limited_amount/starting/base_rust/on_gain(mob/user, datum/antagonist/heretic/our_heretic) + . = ..() RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY, PROC_REF(on_secondary_mansus_grasp)) - our_heretic.increase_rust_strength() + user.RemoveElement(/datum/element/leeching_walk/minor) -/datum/heretic_knowledge/rust_fist/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, list(COMSIG_HERETIC_MANSUS_GRASP_ATTACK, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY)) +/datum/heretic_knowledge/limited_amount/starting/base_rust/on_lose(mob/user, datum/antagonist/heretic/our_heretic) + . = ..() + UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY) + user.AddElement(/datum/element/leeching_walk/minor) -/datum/heretic_knowledge/rust_fist/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER +/datum/heretic_knowledge/limited_amount/starting/base_rust/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() + + if(iscarbon(target)) + var/mob/living/carbon/carbon_target = target + for(var/obj/item/bodypart/robotic_limb as anything in carbon_target.bodyparts) + if(IS_ROBOTIC_LIMB(robotic_limb)) + robotic_limb.receive_damage(500) if(!issilicon(target) && !(target.mob_biotypes & MOB_ROBOTIC)) return source.do_rust_heretic_act(target) -/datum/heretic_knowledge/rust_fist/proc/on_secondary_mansus_grasp(mob/living/source, atom/target) +/datum/heretic_knowledge/limited_amount/starting/base_rust/proc/on_secondary_mansus_grasp(mob/living/source, atom/target) SIGNAL_HANDLER // Rusting an airlock causes it to lose power, mostly to prevent the airlock from shocking you. @@ -69,34 +102,14 @@ source.do_rust_heretic_act(target) return COMPONENT_USE_HAND -/datum/heretic_knowledge/rust_regen - 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." - cost = 1 - research_tree_icon_path = 'icons/effects/eldritch.dmi' - research_tree_icon_state = "cloud_swirl" +/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." - -/datum/heretic_knowledge/rust_regen/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - user.AddElement(/datum/element/leeching_walk) - -/datum/heretic_knowledge/rust_regen/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - user.RemoveElement(/datum/element/leeching_walk) - -/datum/heretic_knowledge/mark/rust_mark - name = "Mark of Rust" - desc = "Your Mansus Grasp now applies the Mark of Rust. The mark is triggered from an attack with your Rusty Blade. \ - When triggered, your victim will suffer heavy disgust and confusion. \ - Allows you to rust reinforced walls and floors as well as plasteel." - gain_text = "The Blacksmith looks away. To a place lost long ago. \"Rusted Hills help those in dire need... at a cost.\"" - mark_type = /datum/status_effect/eldritch/rust - -/datum/heretic_knowledge/mark/rust_mark/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - . = ..() - our_heretic.increase_rust_strength() - -/datum/heretic_knowledge/knowledge_ritual/rust + action_to_add = /datum/action/cooldown/mob_cooldown/charge/rust + cost = 2 + is_final_knowledge = TRUE /datum/heretic_knowledge/spell/rust_construction name = "Rust Construction" @@ -105,7 +118,21 @@ 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." action_to_add = /datum/action/cooldown/spell/pointed/rust_construction - cost = 1 + cost = 2 + +/datum/heretic_knowledge/armor/rust + desc = "Allows you to transmute a table (or a suit), a mask and any trash item to create a Salvaged Remains. \ + Has extra armor, tackle resistance and syringe immunity while standing on rust. \ + Acts as a focus while hooded." + gain_text = "From beneath warped scrap, the Blacksmith pulls forth an ancient fabric. \ + \"Whatever this once stood for is lost. So now, we give it new purpose.\"" + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust) + research_tree_icon_state = "rust_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + /obj/item/trash = 1, + ) /datum/heretic_knowledge/spell/area_conversion name = "Aggressive Spread" @@ -113,13 +140,9 @@ Already rusted surfaces are destroyed \ Also improves the rusting abilities of non rust-heretics." gain_text = "All wise men know well not to visit the Rusted Hills... Yet the Blacksmith's tale was inspiring." action_to_add = /datum/action/cooldown/spell/aoe/rust_conversion - cost = 1 + cost = 2 research_tree_icon_frame = 5 -/datum/heretic_knowledge/spell/area_conversion/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - . = ..() - our_heretic.increase_rust_strength(TRUE) - /datum/heretic_knowledge/blade_upgrade/rust name = "Toxic Blade" desc = "Your Rusty Blade now disgusts enemies on attack \ Allows you to rust Titanium and Plastitanium.." @@ -128,10 +151,6 @@ research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' research_tree_icon_state = "blade_upgrade_rust" -/datum/heretic_knowledge/blade_upgrade/rust/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - . = ..() - our_heretic.increase_rust_strength() - /datum/heretic_knowledge/blade_upgrade/rust/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) if(source == target || !isliving(target)) return @@ -139,6 +158,7 @@ /datum/heretic_knowledge/spell/area_conversion/on_gain(mob/user, datum/antagonist/heretic/our_heretic) . = ..() + /datum/heretic_knowledge/spell/entropic_plume name = "Entropic Plume" desc = "Grants you Entropic Plume, a spell that releases a vexing wave of Rust. \ @@ -148,14 +168,8 @@ The Blacksmith was gone, and you hold their blade. Champions of hope, the Rustbringer is nigh!" action_to_add = /datum/action/cooldown/spell/cone/staggered/entropic_plume - cost = 1 - - - -/datum/heretic_knowledge/spell/entropic_plume/on_gain(mob/user) - . = ..() - var/datum/antagonist/heretic/our_heretic = GET_HERETIC(user) - our_heretic.increase_rust_strength(TRUE) + cost = 2 + drafting_tier = 5 /datum/heretic_knowledge/ultimate/rust_final name = "Rustbringer's Oath" @@ -234,7 +248,7 @@ 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) + addtimer(CALLBACK(src, PROC_REF(transform_area), turfs_to_transform["[iterator]"]), (2 SECONDS) * iterator) /datum/heretic_knowledge/ultimate/rust_final/proc/transform_area(list/turfs) turfs = shuffle(turfs) @@ -287,13 +301,14 @@ return var/need_mob_update = FALSE - var/base_heal_amt = 2.5 * DELTA_WORLD_TIME(SSmobs) - need_mob_update += source.adjustBruteLoss(-base_heal_amt, updating_health = FALSE) - need_mob_update += source.adjustFireLoss(-base_heal_amt, updating_health = FALSE) - need_mob_update += source.adjustToxLoss(-base_heal_amt, updating_health = FALSE, forced = TRUE) - need_mob_update += source.adjustOxyLoss(-base_heal_amt, updating_health = FALSE) - need_mob_update += source.adjustStaminaLoss(-base_heal_amt * 4, updating_stamina = FALSE) - if(source.blood_volume < BLOOD_VOLUME_NORMAL) - source.blood_volume += base_heal_amt + var/base_heal_amt = 1 * DELTA_WORLD_TIME(SSmobs) + need_mob_update += source.adjust_brute_loss(-base_heal_amt, updating_health = FALSE) + need_mob_update += source.adjust_fire_loss(-base_heal_amt, updating_health = FALSE) + need_mob_update += source.adjust_tox_loss(-base_heal_amt, updating_health = FALSE, forced = TRUE) + need_mob_update += source.adjust_oxy_loss(-base_heal_amt, updating_health = FALSE) + need_mob_update += source.adjust_stamina_loss(-base_heal_amt * 4, updating_stamina = FALSE) + + source.adjust_blood_volume(base_heal_amt, maximum = BLOOD_VOLUME_NORMAL) + if(need_mob_update) source.updatehealth() diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/reroll_targets.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/reroll_targets.dm new file mode 100644 index 000000000000..b2c2b5b6e13a --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/reroll_targets.dm @@ -0,0 +1,45 @@ +/*! + * Contains the reroll targets knowledge perk + */ + +/datum/heretic_knowledge/reroll_targets + name = "The Relentless Heartbeat" + desc = "Allows you transmute a harebell, a book, and a jumpsuit while standing over a rune \ + to reroll your sacrifice targets." + gain_text = "The heart is the principle that continues and preserves." + required_atoms = list( + /obj/item/food/grown/harebell = 1, + /obj/item/book = 1, + /obj/item/clothing/under = 1, + ) + cost = 1 + research_tree_icon_path = 'icons/mob/actions/actions_animal.dmi' + research_tree_icon_state = "gaze" + is_shop_only = TRUE + drafting_tier = 2 + +/datum/heretic_knowledge/reroll_targets/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) + var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) + // Check first if they have a Living Heart. If it's missing, we should + // throw a fail to show the heretic that there's no point in rerolling + // if you don't have a heart to track the targets in the first place. + if(heretic_datum.has_living_heart() != HERETIC_HAS_LIVING_HEART) + loc.balloon_alert(user, "ritual failed, no living heart!") + return FALSE + + return TRUE + +/datum/heretic_knowledge/reroll_targets/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) + var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) + for(var/mob/living/carbon/human/target as anything in heretic_datum.sac_targets) + heretic_datum.remove_sacrifice_target(target) + + var/datum/heretic_knowledge/hunt_and_sacrifice/target_finder = heretic_datum.get_knowledge(/datum/heretic_knowledge/hunt_and_sacrifice) + if(!target_finder) + CRASH("Heretic datum didn't have a hunt_and_sacrifice knowledge learned, what?") + + if(!target_finder.obtain_targets(user, heretic_datum = heretic_datum)) + loc.balloon_alert(user, "ritual failed, no targets found!") + return FALSE + + return TRUE 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 ef0b03911379..2a0cb869a989 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm @@ -4,7 +4,8 @@ /atom/movable/screen/alert/status_effect/unholy_determination name = "Unholy Determination" desc = "You appear in a unfamiliar room. The darkness begins to close in. Panic begins to set in. There is no time. Fight on, or die!" - icon_state = "wounded" + icon_state = "heretic_template" + overlay_state = "wounded" /// The buff given to people within the shadow realm to assist them in surviving. /datum/status_effect/unholy_determination @@ -22,8 +23,8 @@ /datum/status_effect/unholy_determination/on_apply() owner.add_traits(list(TRAIT_COAGULATING, TRAIT_NOCRITDAMAGE, TRAIT_NOSOFTCRIT), TRAIT_STATUS_EFFECT(id)) - if(owner.blood_volume < BLOOD_VOLUME_OKAY) - owner.blood_volume = BLOOD_VOLUME_OKAY + if(owner.get_blood_volume() < BLOOD_VOLUME_OKAY) + owner.set_blood_volume(BLOOD_VOLUME_OKAY) return TRUE /datum/status_effect/unholy_determination/on_remove() @@ -65,10 +66,10 @@ owner.losebreath = max(owner.losebreath - (0.5 * seconds_between_ticks), 0) var/damage_healed = 0 - damage_healed += owner.adjustToxLoss(-amount, updating_health = FALSE, forced = TRUE) - damage_healed += owner.adjustOxyLoss(-amount, updating_health = FALSE) - damage_healed += owner.adjustBruteLoss(-amount, updating_health = FALSE) - damage_healed += owner.adjustFireLoss(-amount, updating_health = FALSE) + damage_healed += owner.adjust_tox_loss(-amount, updating_health = FALSE, forced = TRUE) + damage_healed += owner.adjust_oxy_loss(-amount, updating_health = FALSE) + damage_healed += owner.adjust_brute_loss(-amount, updating_health = FALSE) + damage_healed += owner.adjust_fire_loss(-amount, updating_health = FALSE) if(damage_healed > 0) owner.updatehealth() @@ -93,22 +94,8 @@ * Slow and stop any blood loss the owner's experiencing. */ /datum/status_effect/unholy_determination/proc/adjust_bleed_wounds(seconds_between_ticks) - if(!iscarbon(owner) || !owner.blood_volume) - return - - if(owner.blood_volume < BLOOD_VOLUME_NORMAL) - owner.blood_volume = owner.blood_volume + (2 * seconds_between_ticks) - - var/mob/living/carbon/carbon_owner = owner - var/datum/wound/bloodiest_wound - for(var/datum/wound/iter_wound as anything in carbon_owner.all_wounds) - if(iter_wound.blood_flow && (iter_wound.blood_flow > bloodiest_wound?.blood_flow)) - bloodiest_wound = iter_wound - - if(!bloodiest_wound) - return - - bloodiest_wound.adjust_blood_flow(-0.5 * seconds_between_ticks) + owner.adjust_blood_volume(2 * seconds_between_ticks, maximum = BLOOD_VOLUME_NORMAL) + owner.coagulant_effect(0.5 * seconds_between_ticks) /// Torment the target with a frightening hand /proc/fire_curse_hand(mob/living/carbon/victim, turf/forced_turf, range = 8, projectile_type = /obj/projectile/curse_hand/hel) 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 210baad0dda1..2463d2313116 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm @@ -211,11 +211,11 @@ // Heads give 3 points, cultists give 1 point (and a special reward), normal sacrifices give 2 points. heretic_datum.total_sacrifices++ if((sac_job_flag & JOB_HEAD_OF_STAFF)) - heretic_datum.knowledge_points += 3 + heretic_datum.adjust_knowledge_points(3) heretic_datum.high_value_sacrifices++ feedback += " graciously" if(cultist_datum) - heretic_datum.knowledge_points += 1 + heretic_datum.adjust_knowledge_points(1) grant_reward(user, sacrifice, loc) // easier to read var/rewards_given = heretic_datum.rewards_given @@ -234,7 +234,7 @@ to_chat(user, non_flavor_warning) return else - heretic_datum.knowledge_points += 2 + heretic_datum.adjust_knowledge_points(2) to_chat(user, span_hypnophrase("[feedback].")) if(!begin_sacrifice(sacrifice)) @@ -333,10 +333,10 @@ var/turf/destination = get_turf(destination_landmark) sac_target.visible_message(span_danger("[sac_target] begins to shudder violenty as dark tendrils begin to drag them into thin air!")) - sac_target.set_handcuffed(new /obj/item/restraints/handcuffs/energy/cult(sac_target)) + sac_target.equip_to_slot_or_del(new /obj/item/restraints/handcuffs/cult, ITEM_SLOT_HANDCUFFED, indirect_action = TRUE) sac_target.dropItemToGround(sac_target.legcuffed, TRUE) - sac_target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 85, 150) + sac_target.adjust_organ_loss(ORGAN_SLOT_BRAIN, 85, 150) sac_target.do_jitter_animation() log_combat(heretic_mind.current, sac_target, "sacrificed") @@ -345,7 +345,7 @@ // If our target is dead, try to revive them // and if we fail to revive them, don't proceede the chain - sac_target.adjustOxyLoss(-100, FALSE) + sac_target.adjust_oxy_loss(-100, FALSE) if(!sac_target.heal_and_revive(50, span_danger("[sac_target]'s heart begins to beat with an unholy force as they return from death!"))) return @@ -390,7 +390,7 @@ // If our target died during the (short) wait timer, // and we fail to revive them (using a lower number than before), // just disembowel them and stop the chain - sac_target.adjustOxyLoss(-100, FALSE) + sac_target.adjust_oxy_loss(-100, FALSE) if(!sac_target.heal_and_revive(60, span_danger("[sac_target]'s heart begins to beat with an unholy force as they return from death!"))) disembowel_target(sac_target) return @@ -499,7 +499,7 @@ sac_target.clear_mood_event("shadow_realm") 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 + victim_heretic.adjust_knowledge_points(-3) // 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) @@ -581,7 +581,7 @@ sac_target.set_eye_blur_if_lower(100 SECONDS) sac_target.set_dizzy_if_lower(1 MINUTES) sac_target.AdjustKnockdown(80) - sac_target.adjustStaminaLoss(120) + sac_target.adjust_stamina_loss(120) // Glad i'm outta there, though! sac_target.add_mood_event("shadow_realm_survived", /datum/mood_event/shadow_realm_live) 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 3dee1c0176f1..726665f97dfd 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_map.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_map.dm @@ -38,28 +38,6 @@ GLOBAL_LIST_EMPTY(heretic_sacrifice_landmarks) name = "lock heretic sacrifice landmark" for_heretic_path = PATH_LOCK -// 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/fluff/general.dmi' - icon_state = "signpost" - anchored = TRUE - density = TRUE - -/obj/structure/no_effect_signpost/void - name = "signpost at the edge of the universe" - desc = "A direction in the directionless void." - density = FALSE - /// Brightness of the signpost. - var/range = 2 - /// Light power of the signpost. - var/power = 0.8 - -/obj/structure/no_effect_signpost/void/Initialize(mapload) - . = ..() - set_light(range, power) - // Some VERY dim lights, used for the void sacrifice realm. /obj/machinery/light/very_dim nightshift_allowed = FALSE @@ -87,7 +65,7 @@ GLOBAL_LIST_EMPTY(heretic_sacrifice_landmarks) default_gravity = STANDARD_GRAVITY ambience_index = AMBIENCE_SPOOKY sound_environment = SOUND_ENVIRONMENT_CAVE - area_flags = UNIQUE_AREA | NOTELEPORT | HIDDEN_AREA | BLOCK_SUICIDE | NO_BOH + area_flags = NOTELEPORT | HIDDEN_AREA | BLOCK_SUICIDE | NO_BOH /area/centcom/heretic_sacrifice/Initialize(mapload) if(!ambientsounds) diff --git a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm deleted file mode 100644 index 35b5ae382d13..000000000000 --- a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm +++ /dev/null @@ -1,60 +0,0 @@ -/datum/heretic_knowledge_tree_column/ash_to_moon - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/ash - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/moon - - route = PATH_SIDE - - tier1 = /datum/heretic_knowledge/medallion - tier2 = /datum/heretic_knowledge/ether - tier3 = /datum/heretic_knowledge/summon/ashy - -// Sidepaths for knowledge between Ash and Flesh. -/datum/heretic_knowledge/medallion - name = "Ashen Eyes" - desc = "Allows you to transmute a pair of eyes, a candle, and a glass shard into an Eldritch Medallion. \ - The Eldritch Medallion grants you thermal vision while worn, and also functions as a focus." - gain_text = "Piercing eyes guided them through the mundane. Neither darkness nor terror could stop them." - - required_atoms = list( - /obj/item/organ/eyes = 1, - /obj/item/shard = 1, - /obj/item/flashlight/flare/candle = 1, - ) - result_atoms = list(/obj/item/clothing/neck/eldritch_amulet) - cost = 1 - research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' - research_tree_icon_state = "eye_medalion" - -/datum/heretic_knowledge/ether - name = "Ether Of The Newborn" - desc = "Transmutes a pool of vomit and a shard into a single use potion, drinking it will remove any sort of abnormality from your body including diseases, traumas and implants \ - on top of restoring it to full health, at the cost of losing consciousness for an entire minute." - gain_text = "Vision and thought grow hazy as the fumes of this ichor swirl up to meet me. \ - Through the haze, I find myself staring back in relief, or something grossly resembling my visage. \ - It is this wretched thing that I consign to my fate, and whose own that I snatch through the haze of dreams. Fools that we are." - required_atoms = list( - /obj/item/shard = 1, - /obj/effect/decal/cleanable/vomit = 1, - ) - result_atoms = list(/obj/item/ether) - cost = 1 - research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' - research_tree_icon_state = "poison_flask" - -/datum/heretic_knowledge/summon/ashy - name = "Ashen Ritual" - desc = "Allows you to transmute a head, a pile of ash, and a book to create an Ash Spirit. \ - Ash Spirits have a short range jaunt and the ability to cause bleeding in foes at range. \ - They also have the ability to create a ring of fire around themselves for a length of time." - gain_text = "I combined my principle of hunger with my desire for destruction. The Marshal knew my name, and the Nightwatcher gazed on." - - required_atoms = list( - /obj/effect/decal/cleanable/ash = 1, - /obj/item/bodypart/head = 1, - /obj/item/book = 1, - ) - mob_to_summon = /mob/living/basic/heretic_summon/ash_spirit - cost = 1 - - poll_ignore_define = POLL_IGNORE_ASH_SPIRIT - diff --git a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm deleted file mode 100644 index 8f9a595859f9..000000000000 --- a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm +++ /dev/null @@ -1,136 +0,0 @@ -/datum/heretic_knowledge_tree_column/blade_to_rust - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/blade - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/rust - - route = PATH_SIDE - - tier1 = /datum/heretic_knowledge/armor - tier2 = list(/datum/heretic_knowledge/crucible, /datum/heretic_knowledge/rifle) - tier3 = list(/datum/heretic_knowledge/spell/rust_charge, /datum/heretic_knowledge/greaves_of_the_prophet) - -// Sidepaths for knowledge between Rust and Blade. -/datum/heretic_knowledge/armor - name = "Armorer's Ritual" - desc = "Allows you to transmute a table and a gas mask to create Eldritch Armor. \ - Eldritch Armor provides great protection while also acting as a focus when hooded." - gain_text = "The Rusted Hills welcomed the Blacksmith in their generosity. And the Blacksmith \ - returned their generosity in kind." - - required_atoms = list( - /obj/structure/table = 1, - /obj/item/clothing/mask/gas = 1, - ) - result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch) - cost = 1 - - research_tree_icon_path = 'icons/obj/clothing/suits/armor.dmi' - research_tree_icon_state = "eldritch_armor" - research_tree_icon_frame = 12 - - -/datum/heretic_knowledge/crucible - name = "Mawed Crucible" - desc = "Allows you to transmute a portable water tank and a table to create a Mawed Crucible. \ - The Mawed Crucible can brew powerful potions for combat and utility, but must be fed bodyparts and organs between uses." - gain_text = "This is pure agony. I wasn't able to summon the figure of the Aristocrat, \ - but with the Priest's attention I stumbled upon a different recipe..." - - required_atoms = list( - /obj/structure/reagent_dispensers/watertank = 1, - /obj/structure/table = 1, - ) - result_atoms = list(/obj/structure/destructible/eldritch_crucible) - cost = 1 - - research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' - research_tree_icon_state = "crucible" - - -/datum/heretic_knowledge/rifle - name = "Lionhunter's Rifle" - desc = "Allows you to transmute a piece of wood, with hide \ - from any animal,and a camera to create the Lionhunter's rifle. \ - The Lionhunter's Rifle is a long ranged ballistic weapon with three shots. \ - These shots function as normal, albeit weak high-caliber munitions when fired from \ - close range or at inanimate objects. You can aim the rifle at distant foes, \ - causing the shot to mark your victim with your grasp and teleport you directly to them." - gain_text = "I met an old man in an antique shop who wielded a very unusual weapon. \ - I could not purchase it at the time, but they showed me how they made it ages ago." - - required_atoms = list( - /obj/item/stack/sheet/mineral/wood = 1, - /obj/item/stack/sheet/animalhide = 1, - /obj/item/camera = 1, - ) - result_atoms = list(/obj/item/gun/ballistic/rifle/lionhunter) - cost = 1 - - - research_tree_icon_path = 'icons/obj/weapons/guns/ballistic.dmi' - research_tree_icon_state = "goldrevolver" - -/datum/heretic_knowledge/rifle_ammo - name = "Lionhunter Rifle Ammunition" - desc = "Allows you to transmute 3 ballistic ammo casings (used or unused) of any caliber, \ - including shotgun shells 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. \ - They were very effective, for simple iron, but used up quickly. I soon ran out. \ - No replacement munitions worked in their stead. It was peculiar in what it wanted." - required_atoms = list( - /obj/item/ammo_casing = 3, - ) - result_atoms = list(/obj/item/ammo_box/speedloader/strilka310/lionhunter) - cost = 0 - - research_tree_icon_path = 'icons/obj/weapons/guns/ammo.dmi' - research_tree_icon_state = "310_strip" - - /// A list of calibers that the ritual will deny. Only ballistic calibers are allowed. - var/static/list/caliber_blacklist = list( - CALIBER_LASER, - CALIBER_ENERGY, - CALIBER_FOAM, - CALIBER_ARROW, - CALIBER_HARPOON, - CALIBER_HOOK, - ) - -/datum/heretic_knowledge/rifle_ammo/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) - for(var/obj/item/ammo_casing/casing in atoms) - if(!(casing.caliber in caliber_blacklist)) - continue - - // Remove any casings in the caliber_blacklist list from atoms - atoms -= casing - - // 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." - - action_to_add = /datum/action/cooldown/mob_cooldown/charge/rust - cost = 1 - -/datum/heretic_knowledge/greaves_of_the_prophet - name = "Greaves Of The Prophet" - desc = "Allows you to combine a pair of Jackboots and 2 sheets of Titanium into a pair of Armored Greaves, they confer to the user fully immunity to slips." - gain_text = " \ - Gristle churns into joint, a pop, and the fool twists a blackened foot from the \ - jaws of another. At their game for centuries, this mangled tree of limbs twists, \ - thrashing snares buried into snarling gums, seeking to shred the weight of grafted \ - neighbors. Weighed down by lacerated feet, this canopy of rancid idiots ever seeks \ - the undoing of its own bonds. I dread the thought of walking in their wake, but \ - I must press on all the same. Their rhythms keep the feud fresh with indifference \ - to barrier or border. Pulling more into their turmoil as they waltz." - cost = 1 - required_atoms = list( - /obj/item/clothing/shoes/jackboots = 1, - /obj/item/stack/sheet/mineral/titanium = 2, - ) - result_atoms = list(/obj/item/clothing/shoes/greaves_of_the_prophet) - research_tree_icon_path = 'icons/obj/clothing/shoes.dmi' - research_tree_icon_state = "hereticgreaves" diff --git a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm deleted file mode 100644 index d15bb242989c..000000000000 --- a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm +++ /dev/null @@ -1,62 +0,0 @@ -/datum/heretic_knowledge_tree_column/cosmic_to_ash - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/cosmic - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/ash - - route = PATH_SIDE - - tier1 = /datum/heretic_knowledge/summon/fire_shark - tier2 = /datum/heretic_knowledge/spell/space_phase - tier3 = /datum/heretic_knowledge/eldritch_coin - - -// Sidepaths for knowledge between Cosmos and Ash. - -/datum/heretic_knowledge/summon/fire_shark - name = "Scorching Shark" - 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 = "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." - - required_atoms = list( - /obj/effect/decal/cleanable/ash = 1, - /obj/item/organ/liver = 1, - /obj/item/stack/sheet/mineral/plasma = 1, - ) - mob_to_summon = /mob/living/basic/heretic_summon/fire_shark - cost = 1 - - poll_ignore_define = POLL_IGNORE_FIRE_SHARK - - research_tree_icon_dir = EAST - -/datum/heretic_knowledge/spell/space_phase - name = "Space Phase" - desc = "Grants you Space Phase, a spell that allows you to move freely through space. \ - You can only phase in and out when you are on a space or misc turf." - gain_text = "You feel like your body can move through space as if you where dust." - - action_to_add = /datum/action/cooldown/spell/jaunt/space_crawl - cost = 1 - - - research_tree_icon_frame = 6 - -/datum/heretic_knowledge/eldritch_coin - name = "Eldritch Coin" - 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 toggle their bolts \ - when landing on tails. If you insert the coin into an airlock, it will be consumed \ - to fry its electronics, opening the airlock permanently unless bolted. " - gain_text = "The Mansus is a place of all sorts of sins. But greed held a special role." - - required_atoms = list( - /obj/item/stack/sheet/mineral/diamond = 1, - /obj/item/stack/sheet/mineral/plasma = 1, - ) - result_atoms = list(/obj/item/coin/eldritch) - cost = 1 - - research_tree_icon_path = 'icons/obj/economy.dmi' - research_tree_icon_state = "coin_heretic" - diff --git a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm deleted file mode 100644 index bd7f1cf621c6..000000000000 --- a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm +++ /dev/null @@ -1,63 +0,0 @@ -/datum/heretic_knowledge_tree_column/flesh_to_void - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/flesh - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/void - - route = PATH_SIDE - - tier1 = /datum/heretic_knowledge/void_cloak - tier2 = /datum/heretic_knowledge/spell/blood_siphon - tier3 = list(/datum/heretic_knowledge/spell/void_prison, /datum/heretic_knowledge/spell/cleave) - -// Sidepaths for knowledge between Flesh and Void. - -/datum/heretic_knowledge/void_cloak - name = "Void Cloak" - desc = "Allows you to transmute a glass shard, a bedsheet, and any outer clothing item (such as armor or a suit jacket) \ - to create a Void Cloak. While the hood is down, the cloak functions as a focus, \ - and while the hood is up, the cloak is completely invisible. It also provide decent armor and \ - has pockets which can hold one of your blades, various ritual components (such as organs), and small heretical trinkets." - gain_text = "The Owl is the keeper of things that are not quite in practice, but in theory are. Many things are." - - required_atoms = list( - /obj/item/shard = 1, - /obj/item/clothing/suit = 1, - /obj/item/bedsheet = 1, - ) - result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/void) - cost = 1 - - research_tree_icon_path = 'icons/obj/clothing/suits/armor.dmi' - research_tree_icon_state = "void_cloak" - -/datum/heretic_knowledge/spell/blood_siphon - name = "Blood Siphon" - desc = "Grants you Blood Siphon, a spell that drains a victim of blood and health, transferring it to you. \ - 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." - - action_to_add = /datum/action/cooldown/spell/pointed/blood_siphon - cost = 1 - -/datum/heretic_knowledge/spell/void_prison - name = "Void Prison" - desc = "Grants you Void Prison, a spell that places your victim into ball, making them unable to do anything or speak. \ - Applies void chill afterwards." - gain_text = "At first, I see myself, waltzing along a snow-laden street. \ - I try to yell, grab hold of this fool and tell them to run. \ - But the only welts made are on my own beating fist. \ - My smiling face turns to regard me, reflecting back in glassy eyes the empty path I have been lead down." - - action_to_add = /datum/action/cooldown/spell/pointed/void_prison - cost = 1 - -/datum/heretic_knowledge/spell/cleave - name = "Blood Cleave" - desc = "Grants you Cleave, an area-of-effect targeted spell \ - that causes heavy bleeding and blood loss to anyone afflicted." - gain_text = "At first I didn't understand these instruments of war, but the Priest \ - told me to use them regardless. Soon, he said, I would know them well." - - action_to_add = /datum/action/cooldown/spell/pointed/cleave - cost = 1 - - diff --git a/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_four.dm b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_four.dm new file mode 100644 index 000000000000..87345d7ed0c4 --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_four.dm @@ -0,0 +1,120 @@ +/*! + * Tier 4 knowledge: Combat related knowledge + */ + +/datum/heretic_knowledge/spell/space_phase + name = "Space Phase" + desc = "Grants you Space Phase, a spell that allows you to move freely through space. \ + You can only phase in and out when you are on a space or misc turf." + gain_text = "You feel like your body can move through space as if you where dust." + + action_to_add = /datum/action/cooldown/spell/jaunt/space_crawl + cost = 2 + research_tree_icon_frame = 6 + drafting_tier = 4 + +/datum/heretic_knowledge/unfathomable_curio + name = "Unfathomable Curio" + desc = "Allows you to transmute 3 rods, lungs, and any belt into an Unfathomable Curio - \ + a belt that can hold blades and items for rituals. Whilst worn it will veil you, \ + blocking one blow of incoming damage, at the cost of the veil. The veil will recharge itself out of combat." + gain_text = "The mansus holds many a curio, some are not meant for the mortal eye." + + required_atoms = list( + /obj/item/organ/lungs = 1, + /obj/item/stack/rods = 3, + /obj/item/storage/belt = 1, + ) + result_atoms = list(/obj/item/storage/belt/unfathomable_curio) + cost = 2 + research_tree_icon_path = 'icons/obj/clothing/belts.dmi' + research_tree_icon_state = "unfathomable_curio" + drafting_tier = 4 + +/datum/heretic_knowledge/rust_sower + name = "Rust Sower Grenade" + desc = "Allows you to combine a chemical grenade casing and some moldy food to conjure a cursed grenade filled with Eldritch Rust, upon detonating it releases a huge cloud that blinds organics, rusts affected turfs and obliterates Silicons and Mechs." + gain_text = "The choked vines of the Rusted Hills are burdened with such overripe fruits. It undoes the markers of progress, leaving a clean slate to work into new shapes." + required_atoms = list( + list( + /obj/item/food/breadslice/moldy, + /obj/item/food/badrecipe/moldy, + /obj/item/food/deadmouse/moldy, + /obj/item/food/pizzaslice/moldy, + /obj/item/food/boiledegg/rotten, + /obj/item/food/egg/rotten + ) = 1, + /obj/item/grenade/chem_grenade = 1 + ) + result_atoms = list(/obj/item/grenade/chem_grenade/rust_sower) + cost = 2 + research_tree_icon_path = 'icons/obj/weapons/grenade.dmi' + research_tree_icon_state = "rustgrenade" + drafting_tier = 4 + +/datum/heretic_knowledge/spell/crimson_cleave + name = "Crimson Cleave" + desc = "Grants you Crimson Cleave, a targeted spell which siphons health in a small AOE. Cleanses all wounds upon casting" + gain_text = "At first I didn't understand these instruments of war, but the Priest \ + told me to use them regardless. Soon, he said, I would know them well." + action_to_add = /datum/action/cooldown/spell/pointed/crimson_cleave + cost = 2 + drafting_tier = 4 + +/datum/heretic_knowledge/rifle + name = "Lionhunter's Rifle" + desc = "Allows you to transmute a piece of wood, with hide \ + from any animal, and a camera to create the Lionhunter's rifle. \ + The Lionhunter's Rifle is a long ranged ballistic weapon with three shots. \ + These shots function as normal, albeit weak high-caliber munitions when fired from \ + close range or at inanimate objects. You can aim the rifle at distant foes, \ + causing the shot to mark your victim with your grasp and teleport you directly to them." + gain_text = "I met an old man in an antique shop who wielded a very unusual weapon. \ + I could not purchase it at the time, but they showed me how they made it ages ago." + required_atoms = list( + /obj/item/stack/sheet/mineral/wood = 1, + /obj/item/stack/sheet/animalhide = 1, + /obj/item/camera = 1, + ) + result_atoms = list(/obj/item/gun/ballistic/rifle/lionhunter) + cost = 2 + research_tree_icon_path = 'icons/obj/weapons/guns/ballistic.dmi' + research_tree_icon_state = "goldrevolver" + drafting_tier = 2 + +/datum/heretic_knowledge/rifle_ammo + name = "Lionhunter Rifle Ammunition" + desc = "Allows you to transmute 3 ballistic ammo casings (used or unused) of any caliber, \ + including shotgun shells 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. \ + They were very effective, for simple iron, but used up quickly. I soon ran out. \ + No replacement munitions worked in their stead. It was peculiar in what it wanted." + required_atoms = list( + /obj/item/ammo_casing = 3, + ) + result_atoms = list(/obj/item/ammo_box/speedloader/strilka310/lionhunter) + cost = 0 + research_tree_icon_path = 'icons/obj/weapons/guns/ammo.dmi' + research_tree_icon_state = "310_strip" + + /// A list of calibers that the ritual will deny. Only ballistic calibers are allowed. + var/static/list/caliber_blacklist = list( + CALIBER_LASER, + CALIBER_ENERGY, + CALIBER_FOAM, + CALIBER_ARROW, + CALIBER_HARPOON, + CALIBER_HOOK, + ) + +/datum/heretic_knowledge/rifle_ammo/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) + for(var/obj/item/ammo_casing/casing in atoms) + if(!(casing.caliber in caliber_blacklist)) + continue + + // Remove any casings in the caliber_blacklist list from atoms + atoms -= casing + + // 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 diff --git a/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_one.dm b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_one.dm new file mode 100644 index 000000000000..e8a3f9b4d674 --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_one.dm @@ -0,0 +1,102 @@ +/*! + * Tier 1 knowledge: Stealth and general utility + */ + +/datum/heretic_knowledge/void_cloak + name = "Void Cloak" + desc = "Allows you to transmute a glass shard, a bedsheet, and any outer clothing item (such as armor or a suit jacket) \ + to create a Void Cloak. While the hood is down, the cloak functions as a focus and protects you from space. \ + While the hood is up, the cloak is completely invisible. It also provide decent armor and \ + has pockets which can hold one of your blades, various ritual components (such as organs), and small heretical trinkets." + gain_text = "The Owl is the keeper of things that are not quite in practice, but in theory are. Many things are." + required_atoms = list( + /obj/item/shard = 1, + /obj/item/clothing/suit = 1, + /obj/item/bedsheet = 1, + ) + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/void) + cost = 1 + research_tree_icon_path = 'icons/obj/clothing/suits/armor.dmi' + research_tree_icon_state = "void_cloak" + drafting_tier = 1 + +/datum/heretic_knowledge/medallion + name = "Ashen Eyes" + desc = "Allows you to transmute a pair of eyes, a candle, and a glass shard into an Eldritch Medallion. \ + The Eldritch Medallion grants you thermal vision while worn, and also functions as a focus." + gain_text = "Piercing eyes guided them through the mundane. Neither darkness nor terror could stop them." + required_atoms = list( + /obj/item/organ/eyes = 1, + /obj/item/shard = 1, + /obj/item/flashlight/flare/candle = 1, + ) + result_atoms = list(/obj/item/clothing/neck/eldritch_amulet) + cost = 1 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "eye_medalion" + drafting_tier = 1 + +/datum/heretic_knowledge/essence // AKA Eldritch Flask + name = "Priest's Ritual" + desc = "Allows you to transmute a tank of water and a glass shard into a Flask of Eldritch Essence. \ + Eldritch Essence can be consumed for potent healing, or given to heathens for deadly poisoning." + gain_text = "This is an old recipe. The Owl whispered it to me. \ + Created by the Priest - the Liquid that both was and is not." + required_atoms = list( + /obj/structure/reagent_dispensers/watertank = 1, + /obj/item/shard = 1, + ) + result_atoms = list(/obj/item/reagent_containers/cup/beaker/eldritch) + cost = 1 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "eldritch_flask" + drafting_tier = 1 + +/datum/heretic_knowledge/phylactery + name = "Phylactery of Damnation" + desc = "Allows you to transmute a sheet of glass and a poppy into a Phylactery that can instantly draw blood, even from long distances. \ + Be warned, your target may still feel a prick." + gain_text = "A tincture twisted into the shape of a bloodsucker vermin. \ + Whether it chose the shape for itself, or this is the humor of the sickened mind that conjured this vile implement into being is something best not pondered." + required_atoms = list( + /obj/item/stack/sheet/glass = 1, + /obj/item/food/grown/poppy = 1, + ) + result_atoms = list(/obj/item/reagent_containers/cup/phylactery) + cost = 1 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "phylactery_2" + drafting_tier = 1 + +/datum/heretic_knowledge/crucible + name = "Mawed Crucible" + desc = "Allows you to transmute a portable water tank and a table to create a Mawed Crucible. \ + The Mawed Crucible can brew powerful potions for combat and utility, but must be fed bodyparts and organs between uses." + gain_text = "This is pure agony. I wasn't able to summon the figure of the Aristocrat, \ + but with the Priest's attention I stumbled upon a different recipe..." + required_atoms = list( + /obj/structure/reagent_dispensers/watertank = 1, + /obj/structure/table = 1, + ) + result_atoms = list(/obj/structure/destructible/eldritch_crucible) + cost = 1 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "crucible" + drafting_tier = 1 + +/datum/heretic_knowledge/eldritch_coin + name = "Eldritch Coin" + 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 toggle their bolts \ + when landing on tails. If you insert the coin into an airlock, it will be consumed \ + to fry its electronics, opening the airlock permanently unless bolted. " + gain_text = "The Mansus is a place of all sorts of sins. But greed held a special role." + required_atoms = list( + /obj/item/stack/sheet/mineral/diamond = 1, + /obj/item/stack/sheet/mineral/plasma = 1, + ) + result_atoms = list(/obj/item/coin/eldritch) + cost = 1 + research_tree_icon_path = 'icons/obj/economy.dmi' + research_tree_icon_state = "coin_heretic" + drafting_tier = 1 diff --git a/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_three.dm b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_three.dm new file mode 100644 index 000000000000..03b27b7965e8 --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_three.dm @@ -0,0 +1,178 @@ +/*! + * Tier 3 knowledge: Summons + */ + +/datum/heretic_knowledge/summon/rusty + name = "Rusted Ritual" + desc = "Allows you to transmute a pool of vomit, some cable coil, and 10 sheets of iron into a Rust Walker. \ + Rust Walkers excel at spreading rust and are moderately strong in combat." + gain_text = "I combined my knowledge of creation with my desire for corruption. The Marshal knew my name, and the Rusted Hills echoed out." + required_atoms = list( + /obj/effect/decal/cleanable/vomit = 1, + /obj/item/stack/sheet/iron = 10, + /obj/item/stack/cable_coil = 15, + ) + mob_to_summon = /mob/living/basic/heretic_summon/rust_walker + cost = 2 + poll_ignore_define = POLL_IGNORE_RUST_SPIRIT + drafting_tier = 3 + +/datum/heretic_knowledge/summon/maid_in_mirror + name = "Maid in the Mirror" + desc = "Allows you to transmute five sheets of glass, any suit, and a pair of lungs to create a Maid in the Mirror. \ + Maid in the Mirrors are decent combatants that can become incorporeal by phasing in and out of the mirror realm, serving as powerful scouts and ambushers. \ + Their attacks also apply a stack of void chill." + gain_text = "Within each reflection, lies a gateway into an unimaginable world of colors never seen and \ + people never met. The ascent is glass, and the walls are knives. Each step is blood, if you do not have a guide." + + required_atoms = list( + /obj/item/stack/sheet/glass = 5, + /obj/item/clothing/suit = 1, + /obj/item/organ/lungs = 1, + ) + cost = 2 + + mob_to_summon = /mob/living/basic/heretic_summon/maid_in_the_mirror + poll_ignore_define = POLL_IGNORE_MAID_IN_MIRROR + drafting_tier = 3 + +/datum/heretic_knowledge/summon/ashy + name = "Ashen Ritual" + desc = "Allows you to transmute a Bonfire and a book to create an Ash Spirit. \ + Ash Spirits have a short range jaunt and the ability to cause bleeding in foes at range. \ + They also have the ability to create a ring of fire around themselves for a length of time. \ + They have a low amount of health, but will passively recover given enough time to do so." + gain_text = "I combined my principle of hunger with my desire for destruction. The Marshal knew my name, and the Nightwatcher gazed on." + required_atoms = list( + /obj/effect/decal/cleanable/ash = 1, + /obj/item/book = 1, + /obj/structure/bonfire = 1, + ) + mob_to_summon = /mob/living/basic/heretic_summon/ash_spirit + cost = 2 + + poll_ignore_define = POLL_IGNORE_ASH_SPIRIT + drafting_tier = 3 + +/// The max health given to Shattered Risen +#define RISEN_MAX_HEALTH 125 + +/datum/heretic_knowledge/limited_amount/risen_corpse + name = "Shattered Ritual" + desc = "Allows you to transmute a corpse with a soul, a pair of latex or nitrile gloves, and \ + and any exosuit clothing (such as armor) to create a Shattered Risen. \ + Shattered Risen are strong ghouls that have 125 health, but cannot hold items, \ + instead having two brutal weapons for hands. You can only create one at a time." + gain_text = "I witnessed a cold, rending force drag this corpse back to near-life. \ + When it moves, it crunches like broken glass. Its hands are no longer recognizable as human - \ + each clenched fist contains a brutal nest of sharp bone-shards instead." + + required_atoms = list( + /obj/item/clothing/suit = 1, + /obj/item/clothing/gloves/latex = 1, + ) + limit = 1 + cost = 2 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "ghoul_shattered" + drafting_tier = 3 + +/datum/heretic_knowledge/limited_amount/risen_corpse/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 + if(!IS_VALID_GHOUL_MOB(body) || HAS_TRAIT(body, TRAIT_HUSK)) + to_chat(user, span_hierophant_warning("[body] is not in a valid state to be made into a ghoul.")) + continue + if(!body.mind) + to_chat(user, span_hierophant_warning("[body] is mindless and cannot be made into a ghoul.")) + continue + if(!body.client && !body.mind.get_ghost(ghosts_with_clients = TRUE)) + to_chat(user, span_hierophant_warning("[body] is soulless and cannot be made into a ghoul.")) + continue + + // We will only accept valid bodies with a mind, or with a ghost connected that used to control the body + selected_atoms += body + return TRUE + + loc.balloon_alert(user, "ritual failed, no valid body!") + return FALSE + +/datum/heretic_knowledge/limited_amount/risen_corpse/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) + var/mob/living/carbon/human/soon_to_be_ghoul = locate() in selected_atoms + if(QDELETED(soon_to_be_ghoul)) // No body? No ritual + stack_trace("[type] reached on_finished_recipe without a human in selected_atoms to make a ghoul out of.") + loc.balloon_alert(user, "ritual failed, no valid body!") + return FALSE + + soon_to_be_ghoul.grab_ghost() + if(!soon_to_be_ghoul.mind || !soon_to_be_ghoul.client) + stack_trace("[type] reached on_finished_recipe without a minded / cliented human in selected_atoms to make a ghoul out of.") + loc.balloon_alert(user, "ritual failed, no valid body!") + return FALSE + + selected_atoms -= soon_to_be_ghoul + make_risen(user, soon_to_be_ghoul) + return TRUE + +/// Make [victim] into a shattered risen ghoul. +/datum/heretic_knowledge/limited_amount/risen_corpse/proc/make_risen(mob/living/user, mob/living/carbon/human/victim) + user.log_message("created a shattered risen out of [key_name(victim)].", LOG_GAME) + victim.log_message("became a shattered risen of [key_name(user)]'s.", LOG_VICTIM, log_globally = FALSE) + message_admins("[ADMIN_LOOKUPFLW(user)] created a shattered risen, [ADMIN_LOOKUPFLW(victim)].") + + victim.apply_status_effect( + /datum/status_effect/ghoul, + RISEN_MAX_HEALTH, + user.mind, + CALLBACK(src, PROC_REF(apply_to_risen)), + CALLBACK(src, PROC_REF(remove_from_risen)), + ) + +/// Callback for the ghoul status effect - what effects are applied to the ghoul. +/datum/heretic_knowledge/limited_amount/risen_corpse/proc/apply_to_risen(mob/living/risen) + LAZYADD(created_items, WEAKREF(risen)) + risen.AddComponent(/datum/component/mutant_hands, mutant_hand_path = /obj/item/mutant_hand/shattered_risen) + +/// Callback for the ghoul status effect - cleaning up effects after the ghoul status is removed. +/datum/heretic_knowledge/limited_amount/risen_corpse/proc/remove_from_risen(mob/living/risen) + LAZYREMOVE(created_items, WEAKREF(risen)) + qdel(risen.GetComponent(/datum/component/mutant_hands)) + +#undef RISEN_MAX_HEALTH + +/// The "hand" "weapon" used by shattered risen +/obj/item/mutant_hand/shattered_risen + name = "bone-shards" + desc = "What once appeared to be a normal human fist, now holds a mauled nest of sharp bone-shards." + color = "#001aff" + hitsound = SFX_SHATTER + force = 16 + wound_bonus = -30 + exposed_wound_bonus = 15 + demolition_mod = 1.5 + sharpness = SHARP_EDGED + +/datum/heretic_knowledge/summon/fire_shark + name = "Scorching Shark" + 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 = "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." + + required_atoms = list( + /obj/effect/decal/cleanable/ash = 1, + /obj/item/organ/liver = 1, + /obj/item/stack/sheet/mineral/plasma = 1, + ) + mob_to_summon = /mob/living/basic/heretic_summon/fire_shark + cost = 2 + + poll_ignore_define = POLL_IGNORE_FIRE_SHARK + + research_tree_icon_dir = EAST + drafting_tier = 3 diff --git a/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_two.dm b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_two.dm new file mode 100644 index 000000000000..cac879740de5 --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_two.dm @@ -0,0 +1,165 @@ +/*! + * Tier 2 knowledge: Defensive tools and curses + */ + +/** + * Codex Morbus, an upgrade to the base codex + * Functionally an upgraded version of the codex, but it also has the ability to cast curses by right clicking at a rune. + * Requires you to have the blood of your victim in your off-hand + */ +/datum/heretic_knowledge/codex_morbus + name = "Codex Morbus" + desc = "Allows you to to combine a codex cicatrix, and a body into a Codex Morbus. \ + It draws runes and siphons essences a bit faster. \ + Right Click on a rune to curse crewmembers, the target's blood is required in your off hand for a curse to take effect (Best combined with Phylactery Of Damnation)." + gain_text = "The spine of this leather-bound tome creaks with an eerily pained sigh. \ + To ply page from place takes considerable effort, and I dare not linger on the suggestions the book makes for longer than necessary. \ + It speaks of coming plagues, of waiting supplicants of dead and forgotten gods, and the undoing of mortal kind. \ + It speaks of needles to peel the skin of the world back and leaving it to fester. And it speaks to me by name." + required_atoms = list( + /obj/item/codex_cicatrix = 1, + /mob/living/carbon/human = 1, + ) + result_atoms = list(/obj/item/codex_cicatrix/morbus) + cost = 2 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "book_morbus" + drafting_tier = 2 + +/datum/heretic_knowledge/codex_morbus/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) + . = ..() + var/mob/living/carbon/human/to_fuck_up = locate() in selected_atoms + for(var/_limb in to_fuck_up.bodyparts) + var/obj/item/bodypart/limb = _limb + limb.force_wound_upwards(/datum/wound/slash/flesh/critical) + for(var/obj/item/bodypart/limb as anything in to_fuck_up.bodyparts) + to_fuck_up.cause_wound_of_type_and_severity(WOUND_BLUNT, limb, WOUND_SEVERITY_CRITICAL) + return TRUE + +/datum/heretic_knowledge/greaves_of_the_prophet + name = "Greaves Of The Prophet" + desc = "Allows you to combine a pair of shoes and 2 sheets of titanium or silver into a pair of Armored Greaves, they confer to the user full immunity to slips." + gain_text = " \ + Gristle churns into joint, a pop, and the fool twists a blackened foot from the \ + jaws of another. At their game for centuries, this mangled tree of limbs twists, \ + thrashing snares buried into snarling gums, seeking to shred the weight of grafted \ + neighbors. Weighed down by lacerated feet, this canopy of rancid idiots ever seeks \ + the undoing of its own bonds. I dread the thought of walking in their wake, but \ + I must press on all the same. Their rhythms keep the feud fresh with indifference \ + to barrier or border. Pulling more into their turmoil as they waltz." + required_atoms = list( + /obj/item/clothing/shoes = 1, + list(/obj/item/stack/sheet/mineral/titanium, /obj/item/stack/sheet/mineral/silver) = 2, + ) + result_atoms = list(/obj/item/clothing/shoes/greaves_of_the_prophet) + cost = 2 + research_tree_icon_path = 'icons/obj/clothing/shoes.dmi' + research_tree_icon_state = "hereticgreaves" + drafting_tier = 2 + +/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." + + action_to_add = /datum/action/cooldown/spell/aoe/wave_of_desperation + cost = 2 + drafting_tier = 2 + +/datum/heretic_knowledge/rune_carver + name = "Carving Knife" + desc = "Allows you to transmute a knife, a shard of glass, and a piece of paper to create a Carving Knife. \ + The Carving Knife allows you to etch difficult to see traps that trigger on heathens who walk overhead. \ + Also makes for a handy throwing weapon." + gain_text = "Etched, carved... eternal. There is power hidden in everything. I can unveil it! \ + I can carve the monolith to reveal the chains!" + required_atoms = list( + /obj/item/knife = 1, + /obj/item/shard = 1, + /obj/item/paper = 1, + ) + result_atoms = list(/obj/item/melee/rune_carver) + cost = 2 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "rune_carver" + drafting_tier = 2 + +/datum/heretic_knowledge/ether + name = "Ether Of The Newborn" + desc = "Transmutes a pool of vomit and a shard into a single use potion, drinking it will remove any sort of abnormality from your body including diseases, traumas and implants \ + on top of restoring it to full health, at the cost of losing consciousness for an entire minute." + gain_text = "Vision and thought grow hazy as the fumes of this ichor swirl up to meet me. \ + Through the haze, I find myself staring back in relief, or something grossly resembling my visage. \ + It is this wretched thing that I consign to my fate, and whose own that I snatch through the haze of dreams. Fools that we are." + required_atoms = list( + /obj/item/shard = 1, + /obj/effect/decal/cleanable/vomit = 1, + ) + result_atoms = list(/obj/item/ether) + cost = 2 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "poison_flask" + drafting_tier = 2 + +/datum/heretic_knowledge/painting + name = "Unsealed Arts" + desc = "Allows you to transmute a canvas and an additional item to create a painting. \ + Each painting has a unique effect and recipe. Possible paintings: \ + The Sister and He Who Wept: Requires a pair of Eyes. Clears your own mind, and curses non-heretics with hallucinations. \ + The Feast of Desire: Requires a severed limb. Supplies you with random organs, and curses non-heretics with a hunger for flesh. \ + Great Chaparral Over Rolling Hills: Requires any plant produce. Spreads kudzu when placed, and supplies you with poppies and harebells. \ + Lady of the Gate: Requires any pair of Gloves. Clears your mutations, mutates non-heretics and curses them with scratching. \ + Master of the Rusted Mountain: Requires a piece of Trash. Curses non-heretics to rust the floor they walk on." + gain_text = "A wind of inspiration blows through me. Beyond the veil and past the gate great works exist, yet to be painted. \ + They yearn for mortal eyes, so I shall give them an audience." + required_atoms = list(/obj/item/canvas = 1) + result_atoms = list(/obj/item/canvas) + cost = 2 + research_tree_icon_path = 'icons/obj/signs.dmi' + research_tree_icon_state = "eldritch_painting_weeping" + drafting_tier = 2 + +/datum/heretic_knowledge/painting/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) + if(locate(/obj/item/organ/eyes) in atoms) + src.result_atoms = list(/obj/item/wallframe/painting/eldritch/weeping) + src.required_atoms = list( + /obj/item/canvas = 1, + /obj/item/organ/eyes = 1, + ) + return TRUE + + if(locate(/obj/item/bodypart) in atoms) + src.result_atoms = list(/obj/item/wallframe/painting/eldritch/desire) + src.required_atoms = list( + /obj/item/canvas = 1, + /obj/item/bodypart = 1, + ) + return TRUE + + if(locate(/obj/item/food/grown) in atoms) + src.result_atoms = list(/obj/item/wallframe/painting/eldritch/vines) + src.required_atoms = list( + /obj/item/canvas = 1, + /obj/item/food/grown = 1, + ) + return TRUE + + if(locate(/obj/item/clothing/gloves) in atoms) + src.result_atoms = list(/obj/item/wallframe/painting/eldritch/beauty) + src.required_atoms = list( + /obj/item/canvas = 1, + /obj/item/clothing/gloves = 1, + ) + return TRUE + + if(locate(/obj/item/trash) in atoms) + src.result_atoms = list(/obj/item/wallframe/painting/eldritch/rust) + src.required_atoms = list( + /obj/item/canvas = 1, + /obj/item/trash = 1, + ) + return TRUE + + user.balloon_alert(user, "no additional atom present!") + return FALSE diff --git a/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm deleted file mode 100644 index 11d31a64ebea..000000000000 --- a/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm +++ /dev/null @@ -1,50 +0,0 @@ -/datum/heretic_knowledge_tree_column/lock_to_flesh - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/lock - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/flesh - - route = PATH_SIDE - - tier1 = /datum/heretic_knowledge/phylactery - tier2 = /datum/heretic_knowledge/spell/opening_blast - tier3 = /datum/heretic_knowledge/spell/apetra_vulnera - -/** - * Phylactery of Damnation - */ -/datum/heretic_knowledge/phylactery - name = "Phylactery of Damnation" - desc = "Allows you to transmute a sheet of glass and a poppy into a Phylactery that can instantly draw blood, even from long distances. \ - Be warned, your target may still feel a prick." - gain_text = "A tincture twisted into the shape of a bloodsucker vermin. \ - Whether it chose the shape for itself, or this is the humor of the sickened mind that conjured this vile implement into being is something best not pondered." - required_atoms = list( - /obj/item/stack/sheet/glass = 1, - /obj/item/food/grown/poppy = 1, - ) - result_atoms = list(/obj/item/reagent_containers/cup/phylactery) - cost = 1 - research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' - research_tree_icon_state = "phylactery_2" - -// Sidepaths for knowledge between Knock and Flesh. -/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. \ - However, you will fall unconscious a short time after casting this spell." - gain_text = "My shackles undone in dark fury, their feeble bindings crumble before my power." - - action_to_add = /datum/action/cooldown/spell/aoe/wave_of_desperation - cost = 1 - -/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." - - action_to_add = /datum/action/cooldown/spell/pointed/apetra_vulnera - cost = 1 - - diff --git a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm deleted file mode 100644 index 890a1458f057..000000000000 --- a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm +++ /dev/null @@ -1,138 +0,0 @@ -/datum/heretic_knowledge_tree_column/moon_to_lock - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/moon - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/lock - - route = PATH_SIDE - - tier1 = /datum/heretic_knowledge/spell/mind_gate - tier2 = list(/datum/heretic_knowledge/unfathomable_curio, /datum/heretic_knowledge/painting) - tier3 = /datum/heretic_knowledge/codex_morbus - -// Sidepaths for knowledge between Knock and Moon. - -/datum/heretic_knowledge/spell/mind_gate - name = "Mind Gate" - desc = "Grants you Mind Gate, a spell which inflicts hallucinations, \ - confusion, oxygen loss and brain damage to its target over 10 seconds.\ - The caster takes 20 brain damage per use." - gain_text = "My mind swings open like a gate, and its insight will let me perceive the truth." - - action_to_add = /datum/action/cooldown/spell/pointed/mind_gate - cost = 1 - -/datum/heretic_knowledge/unfathomable_curio - name = "Unfathomable Curio" - desc = "Allows you to transmute 3 rods, lungs and any belt into an Unfathomable Curio, \ - a belt that can hold blades and items for rituals. Whilst worn it will also \ - veil you, allowing you to take 5 hits without suffering damage, this veil will recharge very slowly \ - outside of combat." - gain_text = "The mansus holds many a curio, some are not meant for the mortal eye." - - required_atoms = list( - /obj/item/organ/lungs = 1, - /obj/item/stack/rods = 3, - /obj/item/storage/belt = 1, - ) - result_atoms = list(/obj/item/storage/belt/unfathomable_curio) - cost = 1 - - research_tree_icon_path = 'icons/obj/clothing/belts.dmi' - research_tree_icon_state = "unfathomable_curio" - - -/datum/heretic_knowledge/painting - name = "Unsealed Arts" - desc = "Allows you to transmute a canvas and an additional item to create a painting. \ - Each painting has a unique effect and recipe. Possible paintings: \ - The Sister and He Who Wept: Requires a pair of Eyes. Clears your own mind, and curses non-heretics with hallucinations. \ - The Feast of Desire: Requires a severed limb. Supplies you with random organs, and curses non-heretics with a hunger for flesh. \ - Great Chaparral Over Rolling Hills: Requires any plant produce. Spreads kudzu when placed, and supplies you with poppies and harebells. \ - Lady of the Gate: Requires any pair of Gloves. Clears your mutations, mutates non-heretics and curses them with scratching. \ - Master of the Rusted Mountain: Requires a piece of Trash. Curses non-heretics to rust the floor they walk on." - gain_text = "A wind of inspiration blows through me. Beyond the veil and past the gate great works exist, yet to be painted. \ - They yearn for mortal eyes, so I shall give them an audience." - - required_atoms = list(/obj/item/canvas = 1) - result_atoms = list(/obj/item/canvas) - cost = 1 - - research_tree_icon_path = 'icons/obj/signs.dmi' - research_tree_icon_state = "eldritch_painting_weeping" - - -/datum/heretic_knowledge/painting/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) - if(locate(/obj/item/organ/eyes) in atoms) - src.result_atoms = list(/obj/item/wallframe/painting/eldritch/weeping) - src.required_atoms = list( - /obj/item/canvas = 1, - /obj/item/organ/eyes = 1, - ) - return TRUE - - if(locate(/obj/item/bodypart) in atoms) - src.result_atoms = list(/obj/item/wallframe/painting/eldritch/desire) - src.required_atoms = list( - /obj/item/canvas = 1, - /obj/item/bodypart = 1, - ) - return TRUE - - if(locate(/obj/item/food/grown) in atoms) - src.result_atoms = list(/obj/item/wallframe/painting/eldritch/vines) - src.required_atoms = list( - /obj/item/canvas = 1, - /obj/item/food/grown = 1, - ) - return TRUE - - if(locate(/obj/item/clothing/gloves) in atoms) - src.result_atoms = list(/obj/item/wallframe/painting/eldritch/beauty) - src.required_atoms = list( - /obj/item/canvas = 1, - /obj/item/clothing/gloves = 1, - ) - return TRUE - - if(locate(/obj/item/trash) in atoms) - src.result_atoms = list(/obj/item/wallframe/painting/eldritch/rust) - src.required_atoms = list( - /obj/item/canvas = 1, - /obj/item/trash = 1, - ) - return TRUE - - user.balloon_alert(user, "no additional atom present!") - return FALSE - -/** - * Codex Morbus, an upgrade to the base codex - * Functionally an upgraded version of the codex, but it also has the ability to cast curses by right clicking at a rune. - * Requires you to have the blood of your victim in your off-hand - */ -/datum/heretic_knowledge/codex_morbus - name = "Codex Morbus" - desc = "Allows you to to combine a codex cicatrix, and a body into a Codex Morbus. \ - It draws runes and siphons essences a bit faster. \ - Right Click on a rune to curse crewmembers, the target's blood is required in your off hand for a curse to take effect (Best combined with Phylactery Of Damnation)." - gain_text = "The spine of this leather-bound tome creaks with an eerily pained sigh. \ - To ply page from place takes considerable effort, and I dare not linger on the suggestions the book makes for longer than necessary. \ - It speaks of coming plagues, of waiting supplicants of dead and forgotten gods, and the undoing of mortal kind. \ - It speaks of needles to peel the skin of the world back and leaving it to fester. And it speaks to me by name." - required_atoms = list( - /obj/item/codex_cicatrix = 1, - /mob/living/carbon/human = 1, - ) - result_atoms = list(/obj/item/codex_cicatrix/morbus) - cost = 1 - research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' - research_tree_icon_state = "book_morbus" - -/datum/heretic_knowledge/codex_morbus/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) - . = ..() - var/mob/living/carbon/human/to_fuck_up = locate() in selected_atoms - for(var/_limb in to_fuck_up.bodyparts) - var/obj/item/bodypart/limb = _limb - limb.force_wound_upwards(/datum/wound/slash/flesh/critical) - for(var/obj/item/bodypart/limb as anything in to_fuck_up.bodyparts) - to_fuck_up.cause_wound_of_type_and_severity(WOUND_BLUNT, limb, WOUND_SEVERITY_CRITICAL) - return TRUE diff --git a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm deleted file mode 100644 index 998008e79eeb..000000000000 --- a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm +++ /dev/null @@ -1,87 +0,0 @@ -/datum/heretic_knowledge_tree_column/rust_to_cosmic - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/rust - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/cosmic - - route = PATH_SIDE - - tier1 = /datum/heretic_knowledge/essence - tier2 = list(/datum/heretic_knowledge/entropy_pulse, /datum/heretic_knowledge/rust_sower) - tier3 = /datum/heretic_knowledge/summon/rusty - - -// Sidepaths for knowledge between Rust and Cosmos. - -/datum/heretic_knowledge/essence - name = "Priest's Ritual" - desc = "Allows you to transmute a tank of water and a glass shard into a Flask of Eldritch Essence. \ - Eldritch Essence can be consumed for potent healing, or given to heathens for deadly poisoning." - gain_text = "This is an old recipe. The Owl whispered it to me. \ - Created by the Priest - the Liquid that both was and is not." - - required_atoms = list( - /obj/structure/reagent_dispensers/watertank = 1, - /obj/item/shard = 1, - ) - result_atoms = list(/obj/item/reagent_containers/cup/beaker/eldritch) - cost = 1 - - - research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' - research_tree_icon_state = "eldritch_flask" - -/datum/heretic_knowledge/rust_sower - name = "Rust Sower Grenade" - desc = "Allws you to combine a chemical grenade casing and a liver to conjure a cursed grenade filled with Eldritch Rust, upon detonating it releases a huge cloud that blinds organics, rusts affected turfs and obliterates Silicons and Mechs." - gain_text = "The choked vines of the Rusted Hills are burdened with such overripe fruits. It undoes the markers of progress, leaving a clean slate to work into new shapes." - required_atoms = list( - /obj/item/grenade/chem_grenade = 1, - /obj/item/organ/liver = 1, - ) - result_atoms = list(/obj/item/grenade/chem_grenade/rust_sower) - cost = 1 - research_tree_icon_path = 'icons/obj/weapons/grenade.dmi' - research_tree_icon_state = "rustgrenade" - -/datum/heretic_knowledge/entropy_pulse - name = "Pulse of Entropy" - desc = "Allows you to transmute 10 iron sheets and a garbage item 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 = 10, - /obj/item/trash = 1, - ) - cost = 0 - - research_tree_icon_path = 'icons/mob/actions/actions_ecult.dmi' - research_tree_icon_state = "corrode" - research_tree_icon_frame = 10 - - var/rusting_range = 8 - -/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(10) || isclosedturf(nearby_turf)) - continue - nearby_turf.rust_heretic_act() - return TRUE - -/datum/heretic_knowledge/summon/rusty - name = "Rusted Ritual" - desc = "Allows you to transmute a pool of vomit, some cable coil, and 10 sheets of iron into a Rust Walker. \ - Rust Walkers excel at spreading rust and are moderately strong in combat." - gain_text = "I combined my knowledge of creation with my desire for corruption. The Marshal knew my name, and the Rusted Hills echoed out." - - required_atoms = list( - /obj/effect/decal/cleanable/vomit = 1, - /obj/item/stack/sheet/iron = 10, - /obj/item/stack/cable_coil = 15, - ) - mob_to_summon = /mob/living/basic/heretic_summon/rust_walker - cost = 1 - - poll_ignore_define = POLL_IGNORE_RUST_SPIRIT - - diff --git a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm deleted file mode 100644 index 86c0fd527ee1..000000000000 --- a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm +++ /dev/null @@ -1,158 +0,0 @@ -// Sidepaths for knowledge between Void and Blade. - -/datum/heretic_knowledge_tree_column/void_to_blade - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/void - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/blade - - route = PATH_SIDE - - tier1 = /datum/heretic_knowledge/limited_amount/risen_corpse - tier2 = /datum/heretic_knowledge/rune_carver - tier3 = /datum/heretic_knowledge/summon/maid_in_mirror - - - -/// The max health given to Shattered Risen -#define RISEN_MAX_HEALTH 125 - -/datum/heretic_knowledge/limited_amount/risen_corpse - name = "Shattered Ritual" - desc = "Allows you to transmute a corpse with a soul, a pair of latex or nitrile gloves, and \ - and any exosuit clothing (such as armor) to create a Shattered Risen. \ - Shattered Risen are strong ghouls that have 125 health, but cannot hold items, \ - instead having two brutal weapons for hands. You can only create one at a time." - gain_text = "I witnessed a cold, rending force drag this corpse back to near-life. \ - When it moves, it crunches like broken glass. Its hands are no longer recognizable as human - \ - each clenched fist contains a brutal nest of sharp bone-shards instead." - - required_atoms = list( - /obj/item/clothing/suit = 1, - /obj/item/clothing/gloves/latex = 1, - ) - limit = 1 - cost = 1 - - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "ghoul_shattered" - - -/datum/heretic_knowledge/limited_amount/risen_corpse/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 - if(!IS_VALID_GHOUL_MOB(body) || HAS_TRAIT(body, TRAIT_HUSK)) - to_chat(user, span_hierophant_warning("[body] is not in a valid state to be made into a ghoul.")) - continue - if(!body.mind) - to_chat(user, span_hierophant_warning("[body] is mindless and cannot be made into a ghoul.")) - continue - if(!body.client && !body.mind.get_ghost(ghosts_with_clients = TRUE)) - to_chat(user, span_hierophant_warning("[body] is soulless and cannot be made into a ghoul.")) - continue - - // We will only accept valid bodies with a mind, or with a ghost connected that used to control the body - selected_atoms += body - return TRUE - - loc.balloon_alert(user, "ritual failed, no valid body!") - return FALSE - -/datum/heretic_knowledge/limited_amount/risen_corpse/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) - var/mob/living/carbon/human/soon_to_be_ghoul = locate() in selected_atoms - if(QDELETED(soon_to_be_ghoul)) // No body? No ritual - stack_trace("[type] reached on_finished_recipe without a human in selected_atoms to make a ghoul out of.") - loc.balloon_alert(user, "ritual failed, no valid body!") - return FALSE - - soon_to_be_ghoul.grab_ghost() - if(!soon_to_be_ghoul.mind || !soon_to_be_ghoul.client) - stack_trace("[type] reached on_finished_recipe without a minded / cliented human in selected_atoms to make a ghoul out of.") - loc.balloon_alert(user, "ritual failed, no valid body!") - return FALSE - - selected_atoms -= soon_to_be_ghoul - make_risen(user, soon_to_be_ghoul) - return TRUE - -/// Make [victim] into a shattered risen ghoul. -/datum/heretic_knowledge/limited_amount/risen_corpse/proc/make_risen(mob/living/user, mob/living/carbon/human/victim) - user.log_message("created a shattered risen out of [key_name(victim)].", LOG_GAME) - victim.log_message("became a shattered risen of [key_name(user)]'s.", LOG_VICTIM, log_globally = FALSE) - message_admins("[ADMIN_LOOKUPFLW(user)] created a shattered risen, [ADMIN_LOOKUPFLW(victim)].") - - victim.apply_status_effect( - /datum/status_effect/ghoul, - RISEN_MAX_HEALTH, - user.mind, - CALLBACK(src, PROC_REF(apply_to_risen)), - CALLBACK(src, PROC_REF(remove_from_risen)), - ) - -/// Callback for the ghoul status effect - what effects are applied to the ghoul. -/datum/heretic_knowledge/limited_amount/risen_corpse/proc/apply_to_risen(mob/living/risen) - LAZYADD(created_items, WEAKREF(risen)) - risen.AddComponent(/datum/component/mutant_hands, mutant_hand_path = /obj/item/mutant_hand/shattered_risen) - -/// Callback for the ghoul status effect - cleaning up effects after the ghoul status is removed. -/datum/heretic_knowledge/limited_amount/risen_corpse/proc/remove_from_risen(mob/living/risen) - LAZYREMOVE(created_items, WEAKREF(risen)) - qdel(risen.GetComponent(/datum/component/mutant_hands)) - -#undef RISEN_MAX_HEALTH - -/// The "hand" "weapon" used by shattered risen -/obj/item/mutant_hand/shattered_risen - name = "bone-shards" - desc = "What once appeared to be a normal human fist, now holds a mauled nest of sharp bone-shards." - color = "#001aff" - hitsound = SFX_SHATTER - force = 16 - wound_bonus = -30 - exposed_wound_bonus = 15 - demolition_mod = 1.5 - sharpness = SHARP_EDGED - -/datum/heretic_knowledge/rune_carver - name = "Carving Knife" - desc = "Allows you to transmute a knife, a shard of glass, and a piece of paper to create a Carving Knife. \ - The Carving Knife allows you to etch difficult to see traps that trigger on heathens who walk overhead. \ - Also makes for a handy throwing weapon." - gain_text = "Etched, carved... eternal. There is power hidden in everything. I can unveil it! \ - I can carve the monolith to reveal the chains!" - - required_atoms = list( - /obj/item/knife = 1, - /obj/item/shard = 1, - /obj/item/paper = 1, - ) - result_atoms = list(/obj/item/melee/rune_carver) - cost = 1 - - - research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' - research_tree_icon_state = "rune_carver" - -/datum/heretic_knowledge/summon/maid_in_mirror - name = "Maid in the Mirror" - desc = "Allows you to transmute five sheets of titanium, a flash, a suit of armor, and a pair of lungs \ - to create a Maid in the Mirror. Maid in the Mirrors are decent combatants that can become incorporeal by \ - phasing in and out of the mirror realm, serving as powerful scouts and ambushers. \ - However, they are weak to mortal gaze and take damage by being examined." - gain_text = "Within each reflection, lies a gateway into an unimaginable world of colors never seen and \ - people never met. The ascent is glass, and the walls are knives. Each step is blood, if you do not have a guide." - - required_atoms = list( - /obj/item/stack/sheet/mineral/titanium = 5, - /obj/item/clothing/suit/armor = 1, - /obj/item/assembly/flash = 1, - /obj/item/organ/lungs = 1, - ) - cost = 1 - - 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 907a7cb0f20c..830e6edae325 100644 --- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm @@ -168,9 +168,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) /datum/heretic_knowledge/living_heart/proc/is_valid_heart(obj/item/organ/new_heart) if(QDELETED(new_heart)) return FALSE - if(!new_heart.useable) - return FALSE - if(new_heart.organ_flags & (ORGAN_ROBOTIC|ORGAN_FAILING)) + if(new_heart.organ_flags & (ORGAN_UNUSABLE|ORGAN_ROBOTIC|ORGAN_FAILING)) return FALSE return TRUE @@ -211,7 +209,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) */ /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. \ + desc = "Allows you to transmute a book, any pen, 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. \ @@ -221,7 +219,6 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) /obj/item/pen = 1, list(/mob/living, /obj/item/stack/sheet/leather, /obj/item/stack/sheet/animalhide, /obj/item/food/deadmouse) = 1, ) - banned_atom_types = list(/obj/item/pen) result_atoms = list(/obj/item/codex_cicatrix) cost = 1 is_starting_knowledge = TRUE @@ -230,11 +227,6 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' research_tree_icon_state = "book" -/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(!.) @@ -311,13 +303,15 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) . = TRUE heretic_datum.feast_of_owls = TRUE + heretic_datum.update_heretic_aura() user.set_temp_blindness(reward * 1 SECONDS) user.AdjustParalyzed(reward * 1 SECONDS) user.playsound_local(get_turf(user), 'sound/music/antag/heretic/heretic_gain_intense.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) for(var/i in 1 to reward) user.emote("scream") playsound(loc, 'sound/items/eatfood.ogg', 100, TRUE) - heretic_datum.knowledge_points++ + heretic_datum.adjust_knowledge_points(1) + to_chat(user, span_danger("You feel something invisible tearing away at your very essence!")) user.do_jitter_animation() sleep(1 SECONDS) diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm index 0bb54d6d1579..68d518f1c06d 100644 --- a/code/modules/antagonists/heretic/knowledge/void_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm @@ -1,20 +1,50 @@ - -/datum/heretic_knowledge_tree_column/main/void - neighbour_type_left = /datum/heretic_knowledge_tree_column/flesh_to_void - neighbour_type_right = /datum/heretic_knowledge_tree_column/void_to_blade - +/datum/heretic_knowledge_tree_column/void route = PATH_VOID ui_bgr = "node_void" + complexity = "Easy" + complexity_color = COLOR_GREEN + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "void_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Void focuses on stealth, freezing cold, mobility and depressurization.", + "Pick this path if you enjoy being a highly mobile assassin who leaves their foes struggling to catch up.", + ) + pros = list( + "Protection from the hazards of space.", + "Your spells apply a stacking debuff that chills and slows targets.", + "High amount of mobility spells.", + "Highly stealthy.", + ) + cons = list( + "Though protected from space, you are not nearly as mobile in it as you are on foot.", + "Has a difficult time fighting opponents immune to cold effects.", + "Has a difficult time with silicon-based lifeforms.", + ) + tips = list( + "Your Mansus Grasp allows you to mute your targets, making it ideal for silent assassinations (keep in mind that it won't short circuit their suit sensors, make sure you turn them off after you kill them). Yhe grasp also applies a mark that when triggered by the void blade will apply the maximum amount of stacks of void chill to your target, slowing them down to a crawl.", + "Void Cloak can be used to hide one of your blades and a Codex Cicatrix when the hood is down, while acting as a focus when it's up.", + "Void chill is a debuff applied by your spells, your grasp, your mark and your blade once you unlock the upgrade. Each stack slows your target movement speed by 10% and make them gradually colder, up to a maximum of 5 stacks.", + "At 5 stacks void chill will also prevent your target from heating up.", + "You are immune to low pressure and cold damage at the start of the shift. Upgrade your passive to level 2 to no longer need to breathe. Use this to your advantage.", + "Void prison can put a target in stasis for 10 seconds. Ideal if you are fighting multiple opponents and need to isolate one target at a time.", + "Void Conduit is your signature ability. It slowly destroys windows and airlocks around its area of effect. Use it to depressurize the station and expand your domain.", + ) start = /datum/heretic_knowledge/limited_amount/starting/base_void - grasp = /datum/heretic_knowledge/void_grasp - tier1 = /datum/heretic_knowledge/cold_snap - mark = /datum/heretic_knowledge/mark/void_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/void - unique_ability = /datum/heretic_knowledge/spell/void_conduit - tier2 = /datum/heretic_knowledge/spell/void_phase + knowledge_tier1 = /datum/heretic_knowledge/spell/void_phase + guaranteed_side_tier1 = /datum/heretic_knowledge/void_cloak + knowledge_tier2 = /datum/heretic_knowledge/spell/void_prison + guaranteed_side_tier2 = /datum/heretic_knowledge/ether + robes = /datum/heretic_knowledge/armor/void + knowledge_tier3 = /datum/heretic_knowledge/spell/void_pull + guaranteed_side_tier3 = /datum/heretic_knowledge/summon/maid_in_mirror blade = /datum/heretic_knowledge/blade_upgrade/void - tier3 = /datum/heretic_knowledge/spell/void_pull + knowledge_tier4 = /datum/heretic_knowledge/spell/void_conduit ascension = /datum/heretic_knowledge/ultimate/void_final /datum/heretic_knowledge/limited_amount/starting/base_void @@ -28,6 +58,8 @@ result_atoms = list(/obj/item/melee/sickly_blade/void) research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "void_blade" + mark_type = /datum/status_effect/eldritch/void + eldritch_passive = /datum/status_effect/heretic_passive/void /datum/heretic_knowledge/limited_amount/starting/base_void/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) if(!isopenturf(loc)) @@ -41,23 +73,8 @@ return ..() -/datum/heretic_knowledge/void_grasp - name = "Grasp of Void" - desc = "Your Mansus Grasp will temporarily mute and chill the victim." - gain_text = "I saw the cold watcher who observes me. The chill mounts within me. \ - They are quiet. This isn't the end of the mystery." - cost = 1 - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_void" - -/datum/heretic_knowledge/void_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) - -/datum/heretic_knowledge/void_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK) - -/datum/heretic_knowledge/void_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER +/datum/heretic_knowledge/limited_amount/starting/base_void/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() if(!iscarbon(target)) return @@ -66,59 +83,6 @@ carbon_target.adjust_silence(10 SECONDS) carbon_target.apply_status_effect(/datum/status_effect/void_chill, 2) -/datum/heretic_knowledge/cold_snap - name = "Aristocrat's Way" - desc = "Grants you immunity to cold temperatures, and removes your need to breathe. \ - 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." - cost = 1 - research_tree_icon_path = 'icons/effects/effects.dmi' - research_tree_icon_state = "the_freezer" - - /// Traits we apply to become immune to the environment - var/static/list/gain_traits = list(TRAIT_NO_SLIP_ICE, TRAIT_NO_SLIP_SLIDE) - -/datum/heretic_knowledge/cold_snap/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - user.add_traits(list(TRAIT_NOBREATH, TRAIT_RESISTCOLD), type) - RegisterSignal(user, COMSIG_LIVING_LIFE, PROC_REF(check_environment)) - -/datum/heretic_knowledge/cold_snap/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - user.remove_traits(list(TRAIT_RESISTCOLD, TRAIT_NOBREATH), type) - UnregisterSignal(user, COMSIG_LIVING_LIFE) - -///Checks if our traits should be active -/datum/heretic_knowledge/cold_snap/proc/check_environment(mob/living/user) - SIGNAL_HANDLER - - var/datum/gas_mixture/environment = user.loc?.return_air() - if(!isnull(environment)) - var/affected_temperature = environment.return_temperature() - var/affected_pressure = environment.return_pressure() - if(affected_temperature <= T0C || affected_pressure < ONE_ATMOSPHERE) - user.add_traits(gain_traits, type) - else - user.remove_traits(gain_traits, type) - -/datum/heretic_knowledge/mark/void_mark - name = "Mark of Void" - desc = "Your Mansus Grasp now applies the Mark of Void. The mark is triggered from an attack with your Void Blade. \ - When triggered, further silences the victim and swiftly lowers the temperature of their body and the air around them." - gain_text = "A gust of wind? A shimmer in the air? The presence is overwhelming, \ - my senses began to betray me. My mind is my own enemy." - mark_type = /datum/status_effect/eldritch/void - -/datum/heretic_knowledge/knowledge_ritual/void - -/datum/heretic_knowledge/spell/void_conduit - name = "Void Conduit" - desc = "Grants you Void Conduit, a spell which summons a pulsing gate to the Void itself. Every pulse breaks windows and airlocks, while afflicting Heathens with an eldritch chill and shielding Heretics against low pressure." - gain_text = "The hum in the still, cold air turns to a cacophonous rattle. \ - Over the noise, there is no distinction to the clattering of window panes and the yawning knowledge that ricochets through my skull. \ - The doors won't close. I can't keep the cold out now." - action_to_add = /datum/action/cooldown/spell/conjure/void_conduit - cost = 1 - /datum/heretic_knowledge/spell/void_phase name = "Void Phase" desc = "Grants you Void Phase, a long range targeted teleport spell. \ @@ -126,9 +90,59 @@ 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." action_to_add = /datum/action/cooldown/spell/pointed/void_phase - cost = 1 + cost = 2 research_tree_icon_frame = 7 +/datum/heretic_knowledge/spell/void_prison + name = "Void Prison" + desc = "Grants you Void Prison, a spell that places your victim into a ball, making them unable to do anything or speak. \ + Applies void chill afterwards." + gain_text = "At first, I see myself, waltzing along a snow-laden street. \ + I try to yell, grab hold of this fool and tell them to run. \ + But the only welts made are on my own beating fist. \ + My smiling face turns to regard me, reflecting back in glassy eyes the empty path I have been lead down." + + action_to_add = /datum/action/cooldown/spell/pointed/void_prison + cost = 2 + drafting_tier = 5 + +/datum/heretic_knowledge/armor/void + name = "Hollow Weave" + desc = "Allows you to transmute a table (or a suit) and a mask in sub-zero temperatures to create a Hollow Weave, this armor will periodically nullify attacks and grant you a short stealth camoflage to reposition yourself. \ + Acts as a focus while hooded." + gain_text = "Stepping through the cold air, I am shocked by a new sensation. \ + Thousands of almost imperceivable threads cling to my form. \ + I am left adrift with every step. \ + Even as I hear the crunch of snow as I plant my foot to the ground, I feel nothing." + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/void) + research_tree_icon_state = "void_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + ) + +/datum/heretic_knowledge/armor/void/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) + if(!isopenturf(loc)) + loc.balloon_alert(user, "ritual failed, invalid location!") + return FALSE + + var/turf/open/our_turf = loc + if(our_turf.GetTemperature() > T0C) + loc.balloon_alert(user, "ritual failed, not cold enough!") + return FALSE + + return ..() + +/datum/heretic_knowledge/spell/void_pull + name = "Void Pull" + 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." + + action_to_add = /datum/action/cooldown/spell/aoe/void_pull + cost = 2 + research_tree_icon_frame = 6 + /datum/heretic_knowledge/blade_upgrade/void name = "Seeking Blade" desc = "Your blade now freezes enemies. Additionally, you can now attack distant marked targets with your Void Blade, teleporting directly next to them." @@ -156,17 +170,15 @@ /datum/heretic_knowledge/blade_upgrade/void/proc/follow_up_attack(mob/living/user, mob/living/target, obj/item/melee/sickly_blade/blade) blade.melee_attack_chain(user, target) -/datum/heretic_knowledge/spell/void_pull - name = "Void Pull" - 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." - - action_to_add = /datum/action/cooldown/spell/aoe/void_pull - cost = 1 - - - research_tree_icon_frame = 6 +/datum/heretic_knowledge/spell/void_conduit + name = "Void Conduit" + desc = "Grants you Void Conduit, a spell which summons a pulsing gate to the Void itself. Every pulse breaks windows and airlocks, while afflicting Heathens with an eldritch chill and shielding Heretics against low pressure." + gain_text = "The hum in the still, cold air turns to a cacophonous rattle. \ + Over the noise, there is no distinction to the clattering of window panes and the yawning knowledge that ricochets through my skull. \ + The doors won't close. I can't keep the cold out now." + action_to_add = /datum/action/cooldown/spell/conjure/void_conduit + cost = 2 + is_final_knowledge = TRUE /datum/heretic_knowledge/ultimate/void_final name = "Waltz at the End of Time" diff --git a/code/modules/antagonists/heretic/magic/aggressive_spread.dm b/code/modules/antagonists/heretic/magic/aggressive_spread.dm index 8f775f871f3b..dbbdecc2cfb1 100644 --- a/code/modules/antagonists/heretic/magic/aggressive_spread.dm +++ b/code/modules/antagonists/heretic/magic/aggressive_spread.dm @@ -16,6 +16,23 @@ aoe_radius = 2 +/datum/action/cooldown/spell/aoe/rust_conversion/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + + return SPELL_NO_IMMEDIATE_COOLDOWN + +/datum/action/cooldown/spell/aoe/rust_conversion/after_cast(atom/cast_on) + . = ..() + var/datum/status_effect/heretic_passive/rust/rust_passive = owner.has_status_effect(/datum/status_effect/heretic_passive/rust) + if(!rust_passive) + StartCooldown(cooldown_time) + return + + var/new_cooldown = 35 SECONDS - (rust_passive.passive_level * 5 SECONDS) + StartCooldown(new_cooldown) + /datum/action/cooldown/spell/aoe/rust_conversion/get_things_to_cast_on(atom/center) var/list/things_to_convert = RANGE_TURFS(aoe_radius, center) diff --git a/code/modules/antagonists/heretic/magic/apetravulnera.dm b/code/modules/antagonists/heretic/magic/apetravulnera.dm index e80d08911848..c0398b2b7458 100644 --- a/code/modules/antagonists/heretic/magic/apetravulnera.dm +++ b/code/modules/antagonists/heretic/magic/apetravulnera.dm @@ -27,7 +27,7 @@ if(IS_HERETIC_OR_MONSTER(cast_on)) return FALSE - if(!cast_on.blood_volume) + if(!CAN_HAVE_BLOOD(cast_on)) return FALSE if(cast_on.can_block_magic(antimagic_flags)) diff --git a/code/modules/antagonists/heretic/magic/ash_ascension.dm b/code/modules/antagonists/heretic/magic/ash_ascension.dm index 7dc39389a563..2cccd61d4e79 100644 --- a/code/modules/antagonists/heretic/magic/ash_ascension.dm +++ b/code/modules/antagonists/heretic/magic/ash_ascension.dm @@ -154,7 +154,7 @@ if((L in hit_list) || L == source) continue hit_list += L - L.adjustFireLoss(20) + L.adjust_fire_loss(20) to_chat(L, span_userdanger("You're hit by [source]'s eldritch flames!")) new /obj/effect/hotspot(T) diff --git a/code/modules/antagonists/heretic/magic/ash_jaunt.dm b/code/modules/antagonists/heretic/magic/ash_jaunt.dm index b64c5fdc9ae3..1b62e99f0cbf 100644 --- a/code/modules/antagonists/heretic/magic/ash_jaunt.dm +++ b/code/modules/antagonists/heretic/magic/ash_jaunt.dm @@ -1,6 +1,6 @@ /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash name = "Ashen Passage" - desc = "A short range spell that allows you to pass unimpeded through walls." + desc = "A short range spell that allows you to pass unimpeded through walls, removing restraints if empowered." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -20,6 +20,59 @@ jaunt_type = /obj/effect/dummy/phased_mob/spell_jaunt/red jaunt_in_type = /obj/effect/temp_visual/dir_setting/ash_shift jaunt_out_type = /obj/effect/temp_visual/dir_setting/ash_shift/out + /// If we are on fire while wearing ash robes, we can empower our next cast + var/empowered_cast = FALSE + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/Grant(mob/grant_to) + . = ..() + RegisterSignal(grant_to, COMSIG_FIRE_STACKS_UPDATED, PROC_REF(update_status_on_signal)) + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/Remove(mob/remove_from) + . = ..() + UnregisterSignal(remove_from, COMSIG_FIRE_STACKS_UPDATED) + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/apply_button_overlay(atom/movable/screen/movable/action_button/current_button, force) + . = ..() + // Put an active border whenever our spell is able to be casted empowered + if(!ishuman(owner)) + return + var/mob/living/carbon/human/human_owner = owner + if(!istype(human_owner.wear_suit, /obj/item/clothing/suit/hooded/cultrobes/eldritch/ash)) + return + if(human_owner.fire_stacks <= 3) + return + + current_button.cut_overlay(current_button.button_overlay) + current_button.button_overlay = mutable_appearance(icon = overlay_icon, icon_state = "bg_spell_border_active_green") + current_button.add_overlay(current_button.button_overlay) + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/cast(mob/living/cast_on) + if(!iscarbon(owner)) + return ..() + + // Wearing Ash heretic armor empowers your spells if you have over 3 fire stacks + if(!ishuman(owner)) + return ..() + var/mob/living/carbon/human/human_owner = owner + if(human_owner.fire_stacks <= 3) + return ..() + if(!istype(human_owner.wear_suit, /obj/item/clothing/suit/hooded/cultrobes/eldritch/ash)) + return ..() + + empowered_cast = TRUE + human_owner.set_stamina_loss(0) + human_owner.SetAllImmobility(0) + var/mob/living/carbon/carbon_owner = owner + carbon_owner.uncuff() + var/obj/item/clothing/shoes/shoes = carbon_owner.shoes + if(istype(shoes) && shoes.tied == SHOES_KNOTTED) + shoes.adjust_laces(SHOES_TIED, carbon_owner) + + return ..() + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/do_jaunt(mob/living/cast_on) + jaunt_duration = (empowered_cast ? 1.5 SECONDS : initial(jaunt_duration)) + return ..() /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/do_steam_effects() return diff --git a/code/modules/antagonists/heretic/magic/blood_cleave.dm b/code/modules/antagonists/heretic/magic/blood_cleave.dm index d5317f23e344..065286f490e5 100644 --- a/code/modules/antagonists/heretic/magic/blood_cleave.dm +++ b/code/modules/antagonists/heretic/magic/blood_cleave.dm @@ -36,7 +36,7 @@ ) continue - if(!victim.blood_volume) + if(!CAN_HAVE_BLOOD(victim)) continue victim.visible_message( diff --git a/code/modules/antagonists/heretic/magic/blood_siphon.dm b/code/modules/antagonists/heretic/magic/blood_siphon.dm index c63b17a703ff..cb0b4ec355c7 100644 --- a/code/modules/antagonists/heretic/magic/blood_siphon.dm +++ b/code/modules/antagonists/heretic/magic/blood_siphon.dm @@ -40,15 +40,10 @@ ) var/mob/living/living_owner = owner - cast_on.adjustBruteLoss(20) - living_owner.adjustBruteLoss(-20) + cast_on.adjust_brute_loss(20) + living_owner.adjust_brute_loss(-20) - if(!cast_on.blood_volume || !living_owner.blood_volume) - return TRUE - - cast_on.blood_volume -= 20 - if(living_owner.blood_volume < BLOOD_VOLUME_MAXIMUM) // we dont want to explode from casting - living_owner.blood_volume += 20 + cast_on.transfer_blood_to(living_owner, 20, ignore_low_blood = TRUE, ignore_incompatibility = TRUE, transfer_viruses = FALSE) if(!iscarbon(cast_on) || !iscarbon(owner)) return TRUE diff --git a/code/modules/antagonists/heretic/magic/caretaker.dm b/code/modules/antagonists/heretic/magic/caretaker.dm index 01a9970b2047..f2f30747b465 100644 --- a/code/modules/antagonists/heretic/magic/caretaker.dm +++ b/code/modules/antagonists/heretic/magic/caretaker.dm @@ -30,7 +30,7 @@ return for(var/mob/living/alive in orange(5, owner)) - if(alive.stat != DEAD && alive.client) + if(alive.stat != DEAD && alive.client && (owner in view(alive))) owner.balloon_alert(owner, "other minds nearby!") return . | SPELL_CANCEL_CAST diff --git a/code/modules/antagonists/heretic/magic/cosmic_expansion.dm b/code/modules/antagonists/heretic/magic/cosmic_expansion.dm index c191b00d32c0..3d5c9e779394 100644 --- a/code/modules/antagonists/heretic/magic/cosmic_expansion.dm +++ b/code/modules/antagonists/heretic/magic/cosmic_expansion.dm @@ -1,6 +1,6 @@ /datum/action/cooldown/spell/conjure/cosmic_expansion name = "Cosmic Expansion" - desc = "This spell generates a 3x3 domain of cosmic fields. \ + desc = "This spell generates a 5x5 domain of cosmic fields. \ Creatures up to 7 tiles away will also receive a star mark." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" @@ -9,14 +9,14 @@ sound = 'sound/effects/magic/cosmic_expansion.ogg' school = SCHOOL_FORBIDDEN - cooldown_time = 45 SECONDS + cooldown_time = 15 SECONDS invocation = "C'SM'S 'XP'ND!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE - summon_amount = 9 - summon_radius = 1 + summon_amount = 25 + summon_radius = 2 summon_type = list(/obj/effect/forcefield/cosmic_field) /// The range at which people will get marked with a star mark. var/star_mark_range = 7 @@ -24,16 +24,18 @@ var/obj/effect/expansion_effect = /obj/effect/temp_visual/cosmic_domain /// If the heretic is ascended or not var/ascended = FALSE + /// Weakref to our summoner, only relevant if we are a stargazer. Prevents us from harming our master + var/datum/weakref/summoner /datum/action/cooldown/spell/conjure/cosmic_expansion/cast(mob/living/cast_on) new expansion_effect(get_turf(cast_on)) for(var/mob/living/nearby_mob in range(star_mark_range, cast_on)) - if(cast_on == nearby_mob || cast_on.buckled == nearby_mob) + if(cast_on == nearby_mob || cast_on.buckled == nearby_mob || IS_HERETIC_OR_MONSTER(nearby_mob) || cast_on == summoner?.resolve()) continue nearby_mob.apply_status_effect(/datum/status_effect/star_mark, cast_on) - if (ascended) + if (ascended && length(summon_type)) for(var/turf/cast_turf as anything in get_turfs(get_turf(cast_on))) - new /obj/effect/forcefield/cosmic_field(cast_turf) + create_cosmic_field(cast_turf, owner, summon_type[1]) return ..() /datum/action/cooldown/spell/conjure/cosmic_expansion/proc/get_turfs(turf/target_turf) @@ -42,3 +44,17 @@ target_turfs += get_ranged_target_turf(target_turf, direction, 2) target_turfs += get_ranged_target_turf(target_turf, direction, 3) return target_turfs + +/datum/action/cooldown/spell/conjure/cosmic_expansion/post_summon(obj/effect/forcefield/cosmic_field/summoned_object, atom/cast_on) + . = ..() + if(isstargazer(owner)) + summoned_object.slows_projectiles() + summoned_object.prevents_explosions() + return + var/datum/status_effect/heretic_passive/cosmic/cosmic_passive = owner.has_status_effect(/datum/status_effect/heretic_passive/cosmic) + if(!cosmic_passive) + return + if(cosmic_passive.passive_level > 1) + summoned_object.prevents_explosions() + if(cosmic_passive.passive_level > 2) + summoned_object.slows_projectiles() diff --git a/code/modules/antagonists/heretic/magic/cosmic_runes.dm b/code/modules/antagonists/heretic/magic/cosmic_runes.dm index af023e73a032..6d85604411f6 100644 --- a/code/modules/antagonists/heretic/magic/cosmic_runes.dm +++ b/code/modules/antagonists/heretic/magic/cosmic_runes.dm @@ -70,6 +70,13 @@ silicon_image.override = TRUE add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "cosmic", silicon_image) ADD_TRAIT(src, TRAIT_MOPABLE, INNATE_TRAIT) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + COMSIG_ATOM_EXITED = PROC_REF(on_exited) + ) + AddElement(/datum/element/connect_loc, loc_connections) + for(var/mob/living/mobs in get_turf(src)) + RegisterSignal(mobs, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_self)) /obj/effect/cosmic_rune/attack_paw(mob/living/user, list/modifiers) return attack_hand(user, modifiers) @@ -92,10 +99,32 @@ return invoke(user) +/obj/effect/cosmic_rune/proc/on_entered(datum/source, atom/movable/arrived) + SIGNAL_HANDLER + if(!isliving(arrived)) + return + RegisterSignal(arrived, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_self)) + +/// If something clicks on themselves while on top of the rune, we instead will act as if they clicked on the rune instead +/obj/effect/cosmic_rune/proc/on_attack_self(datum/source, mob/living/user) + SIGNAL_HANDLER + if(source == user) + INVOKE_ASYNC(src, TYPE_PROC_REF(/atom, attack_hand), user) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/obj/effect/cosmic_rune/proc/on_exited(datum/source, exiter) + SIGNAL_HANDLER + UnregisterSignal(exiter, COMSIG_ATOM_ATTACK_HAND) + /// For invoking the rune /obj/effect/cosmic_rune/proc/invoke(mob/living/user) var/obj/effect/cosmic_rune/linked_rune_resolved = linked_rune?.resolve() new rune_effect(get_turf(src)) + var/atom/pulled_thing + if(IS_HERETIC(user)) + if(user.pulling) + pulled_thing = user.pulling + do_teleport(user.pulling, get_turf(linked_rune_resolved), no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC) do_teleport( user, get_turf(linked_rune_resolved), @@ -104,9 +133,13 @@ asoundin = 'sound/effects/magic/cosmic_energy.ogg', asoundout = 'sound/effects/magic/cosmic_energy.ogg', ) + if(pulled_thing) // Regrab after the teleports are done + user.start_pulling(pulled_thing) for(var/mob/living/person_on_rune in get_turf(src)) if(person_on_rune.has_status_effect(/datum/status_effect/star_mark)) do_teleport(person_on_rune, get_turf(linked_rune_resolved), no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC) + if(!IS_HERETIC(user)) + user.apply_status_effect(/datum/status_effect/star_mark) new rune_effect(get_turf(linked_rune_resolved)) /// For if someone failed to invoke the rune diff --git a/code/modules/antagonists/heretic/magic/crimson_cleave.dm b/code/modules/antagonists/heretic/magic/crimson_cleave.dm new file mode 100644 index 000000000000..b64a5221a50c --- /dev/null +++ b/code/modules/antagonists/heretic/magic/crimson_cleave.dm @@ -0,0 +1,62 @@ +/datum/action/cooldown/spell/pointed/crimson_cleave + name = "Crimson Cleave" + desc = "A targeted spell that heals you while damaging the enemy. \ + It cleanses you of all wounds as well." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "blood_siphon" + ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi' + + school = SCHOOL_FORBIDDEN + cooldown_time = 30 SECONDS + + invocation = "FL'MS O'ET'RN'ITY." + invocation_type = INVOCATION_WHISPER + spell_requirements = NONE + + cast_range = 5 + + /// The radius of the cleave effect + var/cleave_radius = 1 + /// What type of wound we apply + var/wound_type = /datum/wound/slash/flesh/critical/cleave + +/datum/action/cooldown/spell/pointed/crimson_cleave/can_cast_spell(feedback = TRUE) + return ..() && isliving(owner) + +/datum/action/cooldown/spell/pointed/crimson_cleave/is_valid_target(atom/cast_on) + return ..() && isliving(cast_on) + +/datum/action/cooldown/spell/pointed/crimson_cleave/cast(atom/cast_on) + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/carbon_owner = owner + for(var/obj/item/bodypart/limbs as anything in carbon_owner.bodyparts) + for(var/datum/wound/iter_wound as anything in limbs.wounds) + iter_wound.remove_wound() + + var/mob/living/living_owner = owner + for(var/mob/living/carbon/human/victim in range(cleave_radius, cast_on)) + if(victim == owner || IS_HERETIC_OR_MONSTER(victim)) + continue + if(victim.can_block_magic(antimagic_flags)) + victim.visible_message( + span_danger("[victim]'s flashes in a firey glow, but repels the blaze!"), + span_danger("Your body begins to flash a firey glow, but you are protected!!") + ) + continue + + victim.visible_message( + span_danger("[victim]'s veins are shredded from within as an unholy blaze erupts from [victim.p_their()] blood!"), + span_danger("Your veins burst from within and unholy flame erupts from your blood!") + ) + + victim.apply_damage(15, BRUTE, wound_bonus = CANT_WOUND) + living_owner.adjust_brute_loss(-15) + + victim.transfer_blood_to(living_owner, 15, ignore_low_blood = TRUE, ignore_incompatibility = TRUE, transfer_viruses = FALSE) + + new /obj/effect/temp_visual/cleave(get_turf(victim)) + + return TRUE diff --git a/code/modules/antagonists/heretic/magic/fire_blast.dm b/code/modules/antagonists/heretic/magic/fire_blast.dm index 104b4697cd2d..69ab3b5688ae 100644 --- a/code/modules/antagonists/heretic/magic/fire_blast.dm +++ b/code/modules/antagonists/heretic/magic/fire_blast.dm @@ -15,12 +15,53 @@ invocation = "V'LC'N!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE - channel_time = 5 SECONDS - target_radius = 5 + channel_time = 2.5 SECONDS + target_radius = 7 max_beam_bounces = 4 /// How long the beam visual lasts, also used to determine time between jumps var/beam_duration = 2 SECONDS + /// If our spell is empowered, it will have added effects + var/empowered_cast = FALSE + +/datum/action/cooldown/spell/charged/beam/fire_blast/Grant(mob/grant_to) + . = ..() + RegisterSignal(grant_to, COMSIG_FIRE_STACKS_UPDATED, PROC_REF(update_status_on_signal)) + +/datum/action/cooldown/spell/charged/beam/fire_blast/Remove(mob/remove_from) + . = ..() + UnregisterSignal(remove_from, COMSIG_FIRE_STACKS_UPDATED) + +/datum/action/cooldown/spell/charged/beam/fire_blast/apply_button_overlay(atom/movable/screen/movable/action_button/current_button, force) + . = ..() + // Put an active border whenever our spell is able to be casted empowered + if(!ishuman(owner)) + return + var/mob/living/carbon/human/human_owner = owner + if(!istype(human_owner.wear_suit, /obj/item/clothing/suit/hooded/cultrobes/eldritch/ash)) + return + if(human_owner.fire_stacks <= 3) + return + + current_button.cut_overlay(current_button.button_overlay) + current_button.button_overlay = mutable_appearance(icon = overlay_icon, icon_state = "bg_spell_border_active_green") + current_button.add_overlay(current_button.button_overlay) + +/datum/action/cooldown/spell/charged/beam/fire_blast/before_cast(atom/cast_on) + empowered_cast = FALSE + channel_time = initial(channel_time) + // Wearing Ash heretic armor empowers your spells if you have over 3 fire stacks + if(!ishuman(owner)) + return ..() + var/mob/living/carbon/human/human_owner = owner + if(human_owner.fire_stacks <= 3) + return ..() + if(!istype(human_owner.wear_suit, /obj/item/clothing/suit/hooded/cultrobes/eldritch/ash)) + return ..() + empowered_cast = TRUE + channel_time = 0.1 SECONDS + human_owner.extinguish_mob() + return ..() /datum/action/cooldown/spell/charged/beam/fire_blast/cast(atom/cast_on) var/mob/living/caster = get_caster_from_target(cast_on) @@ -29,7 +70,7 @@ caster.apply_status_effect(/datum/status_effect/fire_blasted, beam_duration, -2) return ..() -/datum/action/cooldown/spell/charged/beam/fire_blast/send_beam(atom/origin, mob/living/carbon/to_beam, bounces = 4) +/datum/action/cooldown/spell/charged/beam/fire_blast/send_beam(atom/origin, mob/living/carbon/to_beam, bounces = max_beam_bounces) // Send a beam from the origin to the hit mob origin.Beam(to_beam, icon_state = "solar_beam", time = beam_duration, beam_type = /obj/effect/ebeam/reacting/fire) @@ -46,7 +87,7 @@ // Otherwise, if unblocked apply the damage and set them up else to_beam.apply_damage(20, BURN, wound_bonus = 5) - to_beam.adjust_fire_stacks(3) + to_beam.adjust_fire_stacks(empowered_cast ? 6 : 3) to_beam.ignite_mob() // Apply the fire blast status effect to show they got blasted to_beam.apply_status_effect(/datum/status_effect/fire_blasted, beam_duration * 0.5) @@ -66,7 +107,7 @@ continue nearby_living.Knockdown(0.8 SECONDS) nearby_living.apply_damage(15, BURN, wound_bonus = 5) - nearby_living.adjust_fire_stacks(2) + nearby_living.adjust_fire_stacks(empowered_cast ? 4 : 2) nearby_living.ignite_mob() /// Timer callback to continue the chain, calling send_fire_bream recursively. @@ -116,7 +157,7 @@ id = "fire_blasted" alert_type = null duration = 5 SECONDS - tick_interval = 0.5 SECONDS + tick_interval = 0.6 SECONDS /// How much fire / stam to do per tick (stamina damage is doubled this) var/tick_damage = 1 /// How long does the animation of the appearance last? If 0 or negative, we make no overlay @@ -137,8 +178,8 @@ return TRUE /datum/status_effect/fire_blasted/tick(seconds_between_ticks) - owner.adjustFireLoss(tick_damage * seconds_between_ticks) - owner.adjustStaminaLoss(2 * tick_damage * seconds_between_ticks) + owner.adjust_fire_loss(tick_damage * seconds_between_ticks) + owner.adjust_stamina_loss(2 * tick_damage * seconds_between_ticks) // The beam fireblast spits out, causes people to walk through it to be on fire /obj/effect/ebeam/reacting/fire diff --git a/code/modules/antagonists/heretic/magic/flesh_surgery.dm b/code/modules/antagonists/heretic/magic/flesh_surgery.dm index 26e21f54ae4c..c50b9c81e12d 100644 --- a/code/modules/antagonists/heretic/magic/flesh_surgery.dm +++ b/code/modules/antagonists/heretic/magic/flesh_surgery.dm @@ -126,7 +126,7 @@ /datum/action/cooldown/spell/touch/flesh_surgery/proc/register_held_organ(obj/item/organ/new_held_organ, obj/item/melee/touch_attack/hand) hand.vis_contents += new_held_organ held_organ = new_held_organ - new_held_organ.flags_1 |= IS_ONTOP_1 + ADD_TRAIT(new_held_organ, TRAIT_SKIP_BASIC_REACH_CHECK, REF(src)) new_held_organ.vis_flags |= VIS_INHERIT_PLANE RegisterSignal(new_held_organ, COMSIG_MOVABLE_MOVED, PROC_REF(unregister_held_organ)) RegisterSignal(new_held_organ, COMSIG_QDELETING, PROC_REF(unregister_held_organ)) @@ -139,7 +139,7 @@ /datum/action/cooldown/spell/touch/flesh_surgery/proc/unregister_held_organ(obj/item/organ/removed_organ) LAZYREMOVE(attached_hand.vis_contents, removed_organ) held_organ = null - removed_organ.flags_1 &= ~IS_ONTOP_1 + REMOVE_TRAIT(removed_organ, TRAIT_SKIP_BASIC_REACH_CHECK, REF(src)) removed_organ.vis_flags &= ~VIS_INHERIT_PLANE UnregisterSignal(removed_organ, list(COMSIG_MOVABLE_MOVED, COMSIG_QDELETING)) // Reset item offsets diff --git a/code/modules/antagonists/heretic/magic/furious_steel.dm b/code/modules/antagonists/heretic/magic/furious_steel.dm index af9691a01d6e..237fd52ec02d 100644 --- a/code/modules/antagonists/heretic/magic/furious_steel.dm +++ b/code/modules/antagonists/heretic/magic/furious_steel.dm @@ -10,7 +10,7 @@ sound = 'sound/items/weapons/guillotine.ogg' school = SCHOOL_FORBIDDEN - cooldown_time = 60 SECONDS + cooldown_time = 30 SECONDS invocation = "F'LSH'NG S'LV'R!" invocation_type = INVOCATION_SHOUT diff --git a/code/modules/antagonists/heretic/magic/madness_touch.dm b/code/modules/antagonists/heretic/magic/madness_touch.dm index a5d075f3a149..09743c20bc43 100644 --- a/code/modules/antagonists/heretic/magic/madness_touch.dm +++ b/code/modules/antagonists/heretic/magic/madness_touch.dm @@ -11,7 +11,7 @@ cooldown_time = 15 SECONDS invocation_type = INVOCATION_NONE spell_requirements = NONE - antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND + antimagic_flags = MAGIC_RESISTANCE_MOON /datum/action/cooldown/spell/touch/mad_touch/is_valid_target(atom/cast_on) if(!ishuman(cast_on)) diff --git a/code/modules/antagonists/heretic/magic/mansus_grasp.dm b/code/modules/antagonists/heretic/magic/mansus_grasp.dm index bf99c063e209..78f550ccec20 100644 --- a/code/modules/antagonists/heretic/magic/mansus_grasp.dm +++ b/code/modules/antagonists/heretic/magic/mansus_grasp.dm @@ -65,7 +65,7 @@ carbon_hit.adjust_timed_status_effect(4 SECONDS, /datum/status_effect/speech/slurring/heretic) carbon_hit.AdjustKnockdown(5 SECONDS, daze_amount = 3 SECONDS) - carbon_hit.adjustStaminaLoss(80) + carbon_hit.adjust_stamina_loss(80) return TRUE @@ -127,7 +127,7 @@ return FIRELOSS if(prob(70)) - carbon_user.adjustFireLoss(20) + carbon_user.adjust_fire_loss(20) playsound(carbon_user, 'sound/effects/wounds/sizzle1.ogg', 70, vary = TRUE) if(prob(50)) carbon_user.emote("scream") diff --git a/code/modules/antagonists/heretic/magic/mind_gate.dm b/code/modules/antagonists/heretic/magic/mind_gate.dm index 74a04eba396e..2e033ea35e8a 100644 --- a/code/modules/antagonists/heretic/magic/mind_gate.dm +++ b/code/modules/antagonists/heretic/magic/mind_gate.dm @@ -1,7 +1,8 @@ /datum/action/cooldown/spell/pointed/mind_gate name = "Mind Gate" desc = "Deals you 20 brain damage and the target suffers a hallucination, \ - is left confused for 10 seconds, and suffers oxygen loss and brain damage." + is left confused for 10 seconds, and suffers oxygen loss and brain damage. \ + It also blinds, mutes and deafens your target, if their sanity is low enough, they will be knocked down as well." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -17,6 +18,7 @@ cast_range = 6 active_msg = "You prepare to open your mind..." + antimagic_flags = MAGIC_RESISTANCE_MOON /datum/action/cooldown/spell/pointed/mind_gate/can_cast_spell(feedback = TRUE) return ..() && isliving(owner) @@ -31,11 +33,36 @@ to_chat(owner, span_warning("Their mind doesn't swing open, but neither does yours.")) return FALSE + var/mob/living/living_owner = owner + living_owner.adjust_organ_loss(ORGAN_SLOT_BRAIN, 20, 140) + cast_on.adjust_confusion(10 SECONDS) - cast_on.adjustOxyLoss(30) + cast_on.adjust_oxy_loss(30) cast_on.cause_hallucination(get_random_valid_hallucination_subtype(/datum/hallucination/body), "Mind gate, cast by [owner]") cast_on.cause_hallucination(/datum/hallucination/delusion/preset/heretic/gate, "Caused by mindgate") - cast_on.adjustOrganLoss(ORGAN_SLOT_BRAIN, 30) + cast_on.adjust_organ_loss(ORGAN_SLOT_BRAIN, 30) - var/mob/living/living_owner = owner - living_owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20, 140) + /// The duration of these effects are based on sanity, mainly for flavor but also to make it a weaker alpha strike + var/maximum_duration = 15 SECONDS + var/mind_gate_duration = ((SANITY_MAXIMUM - cast_on.mob_mood.sanity) / (SANITY_MAXIMUM - SANITY_INSANE)) * maximum_duration + 1 SECONDS + to_chat(cast_on, span_warning("Your eyes cry out in pain, your ears bleed and your lips seal! THE MOON SMILES UPON YOU!")) + cast_on.adjust_temp_blindness(mind_gate_duration) + cast_on.set_eye_blur_if_lower(mind_gate_duration + 1 SECONDS) + + cast_on.sound_damage(0, mind_gate_duration) + + cast_on.adjust_silence(mind_gate_duration) + cast_on.add_mood_event("moon_smile", /datum/mood_event/moon_smile) + + // Only knocksdown if the target has a low enough sanity + if(cast_on.mob_mood.sanity < 40) + cast_on.AdjustKnockdown(2 SECONDS) + //Lowers sanity + cast_on.mob_mood.adjust_sanity(-20) + + //If our moon heretic has their level 3 passive, we channel the amulet effect + var/datum/status_effect/heretic_passive/moon/our_passive = living_owner.has_status_effect(/datum/status_effect/heretic_passive/moon) + if(our_passive?.amulet) + our_passive.amulet.channel_amulet(owner, cast_on) + + return TRUE diff --git a/code/modules/antagonists/heretic/magic/mirror_walk.dm b/code/modules/antagonists/heretic/magic/mirror_walk.dm index 93642c7f324d..9aa5de82ed1a 100644 --- a/code/modules/antagonists/heretic/magic/mirror_walk.dm +++ b/code/modules/antagonists/heretic/magic/mirror_walk.dm @@ -2,7 +2,8 @@ name = "Mirror Walk" desc = "Allows you to traverse invisibly and freely across the station within the realm of the mirror. \ You can only enter and exit the realm of mirrors when nearby reflective surfaces and items, \ - such as windows, mirrors, and reflective walls or equipment." + such as windows, mirrors, and reflective walls or equipment. \ + You will slowly heal damage while in this form." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_minor_antag.dmi' @@ -90,7 +91,7 @@ // It would likely be a bad idea to teleport into an ai monitored area (ai sat) var/area/phase_area = get_area(phase_turf) - if(istype(phase_area, /area/station/ai_monitored)) + if(phase_area.motion_monitored) to_chat(unjaunter, span_warning("It's probably not a very wise idea to exit the mirror's realm here.")) return FALSE @@ -156,3 +157,14 @@ /obj/effect/dummy/phased_mob/mirror_walk name = "reflection" + +/obj/effect/dummy/phased_mob/mirror_walk/Initialize(mapload, atom/movable/jaunter) + . = ..() + START_PROCESSING(SSobj, src) + +/obj/effect/dummy/phased_mob/mirror_walk/process(seconds_per_tick) + if(!isliving(jaunter)) + STOP_PROCESSING(SSobj, src) + return ..() + var/mob/living/living_jaunter = jaunter + living_jaunter.heal_overall_damage(5 * seconds_per_tick) diff --git a/code/modules/antagonists/heretic/magic/moon_parade.dm b/code/modules/antagonists/heretic/magic/moon_parade.dm index 48df0ab58dfb..97f4eb864baf 100644 --- a/code/modules/antagonists/heretic/magic/moon_parade.dm +++ b/code/modules/antagonists/heretic/magic/moon_parade.dm @@ -19,7 +19,7 @@ deactive_msg = "You stop the music and halt the parade... for now." cast_range = 12 projectile_type = /obj/projectile/moon_parade - + antimagic_flags = MAGIC_RESISTANCE_MOON /obj/projectile/moon_parade name = "Lunar parade" @@ -63,7 +63,7 @@ return PROJECTILE_PIERCE_PHASE // Anti-magic destroys the projectile for consistency and counterplay - if(victim.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND)) + if(victim.can_block_magic(MAGIC_RESISTANCE_MOON)) visible_message(span_warning("The parade hits [victim] and a sudden wave of clarity comes over you!")) return PROJECTILE_DELETE_WITHOUT_HITTING @@ -76,31 +76,22 @@ var/mob/living/victim = target - if(!(victim in mobs_hit)) - RegisterSignal(victim, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, PROC_REF(moon_block_move)) - RegisterSignal(victim, COMSIG_QDELETING, PROC_REF(clear_mob)) - victim.AddComponent(/datum/component/leash, src, distance = 1) - victim.balloon_alert(victim, "you feel unable to move away from the parade!") - mobs_hit += victim + if(!was_hit_already(victim)) + victim.apply_status_effect(/datum/status_effect/moon_parade, src) + mobs_hit += WEAKREF(victim) victim.add_mood_event("Moon Insanity", /datum/mood_event/moon_insanity) victim.cause_hallucination(/datum/hallucination/delusion/preset/moon, name) victim.mob_mood.adjust_sanity(-20) +/obj/projectile/moon_parade/proc/was_hit_already(mob/living/victim) + for(var/datum/weakref/ref as anything in mobs_hit) + var/mob/living/hit_victim = ref.resolve() + if(hit_victim == victim) + return TRUE + return FALSE + /obj/projectile/moon_parade/Destroy() - for(var/mob/living/leftover_mob as anything in mobs_hit) - clear_mob(leftover_mob) - mobs_hit.Cut() // You never know + mobs_hit.Cut() soundloop.stop() return ..() - -// Blocks movement in order to make it appear like the character is transfixed to the projectile and wandering after it -// Coded this way because its a simple way to hold the illusion compared to other methods -/obj/projectile/moon_parade/proc/moon_block_move(datum/source) - SIGNAL_HANDLER - return COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE - -/obj/projectile/moon_parade/proc/clear_mob(datum/source) - SIGNAL_HANDLER - UnregisterSignal(source, list(COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, COMSIG_QDELETING)) - mobs_hit -= source diff --git a/code/modules/antagonists/heretic/magic/moon_ringleader.dm b/code/modules/antagonists/heretic/magic/moon_ringleader.dm index 130212f94551..54702b411718 100644 --- a/code/modules/antagonists/heretic/magic/moon_ringleader.dm +++ b/code/modules/antagonists/heretic/magic/moon_ringleader.dm @@ -1,8 +1,7 @@ /datum/action/cooldown/spell/aoe/moon_ringleader name = "Ringleaders Rise" - desc = "Big AoE spell that deals brain damage and causes hallucinations to everyone in the AoE. \ - The worse their sanity, the stronger this spell becomes. \ - If their sanity is low enough, they even snap and go insane, and the spell then further halves their sanity." + desc = "Big AoE spell that summons copies of you. \ + If any copies are attacked, they cause brain damage, sanity damage, and will briefly stun everyone nearby." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -11,7 +10,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 1 MINUTES - antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND + antimagic_flags = MAGIC_RESISTANCE_MOON invocation = "R'S 'E!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE @@ -22,6 +21,7 @@ /datum/action/cooldown/spell/aoe/moon_ringleader/cast(mob/living/caster) new moon_effect(get_turf(caster)) + caster.faction |= "ringleader([REF(caster)])" return ..() /datum/action/cooldown/spell/aoe/moon_ringleader/get_things_to_cast_on(atom/center, radius_override) @@ -30,10 +30,10 @@ for(var/mob/living/carbon/nearby_mob in o_range) if(nearby_mob.stat == DEAD) continue - if(!nearby_mob.mob_mood) - continue if(IS_HERETIC_OR_MONSTER(nearby_mob)) continue + if(issilicon(nearby_mob)) + continue if(nearby_mob.can_block_magic(antimagic_flags)) continue @@ -42,17 +42,50 @@ return stuff /datum/action/cooldown/spell/aoe/moon_ringleader/cast_on_thing_in_aoe(mob/living/carbon/victim, mob/living/caster) - var/victim_sanity = victim.mob_mood.sanity + var/mob/living/basic/illusion/shover/shove_clone = new(pick(RANGE_TURFS(2, victim))) + shove_clone.full_setup( + caster, + target_mob = victim, + faction = caster.faction, + life = 30 SECONDS, + hp = caster.health, + damage = 1, + replicate = 0, + ) + shove_clone.AddElement(/datum/element/relay_attackers) + RegisterSignal(shove_clone, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + +/// Used by Ringleaders Rise, illusions created by this spell will explode when they are interacted with +/datum/action/cooldown/spell/aoe/moon_ringleader/proc/on_attacked(mob/victim, atom/attacker) + SIGNAL_HANDLER + if(isliving(attacker)) + var/mob/living/living_attacker = attacker + if(IS_HERETIC_OR_MONSTER(living_attacker)) // Heretics cant smack these guys to trigger their effects + return + playsound(victim, 'sound/items/party_horn.ogg', 30) + new /obj/effect/decal/cleanable/confetti(get_turf(victim)) + + for(var/mob/living/mob in range(3, victim)) + if(IS_HERETIC_OR_MONSTER(mob)) + continue + if(mob.can_block_magic(antimagic_flags)) + continue + + //If our moon heretic has their level 3 passive, we channel the amulet effect + var/mob/living/basic/illusion/fake_clone = victim + var/mob/living/living_owner = fake_clone.parent_mob_ref.resolve() + if(!living_owner) + continue + var/datum/status_effect/heretic_passive/moon/our_passive = living_owner.has_status_effect(/datum/status_effect/heretic_passive/moon) + // We channel the amulet before the "spell effects" so that people don't get converted after 1 clone goes off + our_passive?.amulet?.channel_amulet(living_owner, mob) - victim.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100 - victim_sanity, 160) - for(var/i in 1 to round((120 - victim_sanity) / 10)) - victim.cause_hallucination(get_random_valid_hallucination_subtype(/datum/hallucination/body), name) - if(victim_sanity < 15) - victim.apply_status_effect(/datum/status_effect/moon_converted) - caster.log_message("made [victim] insane.", LOG_GAME) - victim.log_message("was driven insane by [caster]") - victim.mob_mood.adjust_sanity(victim_sanity * -0.5) + mob.AdjustStun(1 SECONDS) + mob.AdjustKnockdown(1 SECONDS) + mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 50, 150) + mob.mob_mood?.adjust_sanity(-50) + qdel(victim) /obj/effect/temp_visual/moon_ringleader icon = 'icons/effects/eldritch.dmi' diff --git a/code/modules/antagonists/heretic/magic/moon_smile.dm b/code/modules/antagonists/heretic/magic/moon_smile.dm deleted file mode 100644 index fd98dc0d841f..000000000000 --- a/code/modules/antagonists/heretic/magic/moon_smile.dm +++ /dev/null @@ -1,55 +0,0 @@ -/datum/action/cooldown/spell/pointed/moon_smile - name = "Smile of the moon" - desc = "Lets you turn the gaze of the moon on someone \ - temporarily blinding, muting, deafening and knocking down a single target if their sanity is low enough." - background_icon_state = "bg_heretic" - overlay_icon_state = "bg_heretic_border" - button_icon = 'icons/mob/actions/actions_ecult.dmi' - button_icon_state = "moon_smile" - ranged_mousepointer = 'icons/effects/mouse_pointers/moon_target.dmi' - - sound = 'sound/effects/magic/blind.ogg' - school = SCHOOL_FORBIDDEN - cooldown_time = 20 SECONDS - antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND - invocation = "M'N S'M'LE!" - invocation_type = INVOCATION_SHOUT - spell_requirements = NONE - cast_range = 6 - - active_msg = "You prepare to let them see the true face..." - -/datum/action/cooldown/spell/pointed/moon_smile/can_cast_spell(feedback = TRUE) - return ..() && isliving(owner) - -/datum/action/cooldown/spell/pointed/moon_smile/is_valid_target(atom/cast_on) - return ..() && ishuman(cast_on) - -/datum/action/cooldown/spell/pointed/moon_smile/cast(mob/living/carbon/human/cast_on) - . = ..() - /// The duration of these effects are based on sanity, mainly for flavor but also to make it a weaker alpha strike - var/maximum_duration = 15 SECONDS - var/moon_smile_duration = ((SANITY_MAXIMUM - cast_on.mob_mood.sanity) / (SANITY_MAXIMUM - SANITY_INSANE)) * maximum_duration - if(cast_on.can_block_magic(antimagic_flags)) - to_chat(cast_on, span_notice("The moon turns, its smile no longer set on you.")) - to_chat(owner, span_warning("The moon does not smile upon them.")) - return FALSE - - playsound(cast_on, 'sound/effects/hallucinations/i_see_you1.ogg', 50, 1) - to_chat(cast_on, span_warning("Your eyes cry out in pain, your ears bleed and your lips seal! THE MOON SMILES UPON YOU!")) - cast_on.adjust_temp_blindness(moon_smile_duration + 1 SECONDS) - cast_on.set_eye_blur_if_lower(moon_smile_duration + 2 SECONDS) - - var/obj/item/organ/ears/ears = cast_on.get_organ_slot(ORGAN_SLOT_EARS) - //adjustEarDamage takes deafness duration parameter in one unit per two seconds, instead of the normal time, so we divide by two seconds - ears?.adjustEarDamage(0, (moon_smile_duration + 1 SECONDS) / (2 SECONDS)) - - cast_on.adjust_silence(moon_smile_duration + 1 SECONDS) - cast_on.add_mood_event("moon_smile", /datum/mood_event/moon_smile) - - // Only knocksdown if the target has a low enough sanity - if(cast_on.mob_mood.sanity < 40) - cast_on.AdjustKnockdown(2 SECONDS) - //Lowers sanity - cast_on.mob_mood.adjust_sanity(-20) - return TRUE diff --git a/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm index 6b156e016531..2bb5b32c4bcf 100644 --- a/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm +++ b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm @@ -10,28 +10,38 @@ school = SCHOOL_FORBIDDEN cooldown_time = 1 MINUTES + aoe_radius = 14 invocation = "GL'RY T' TH' N'GHT'W'TCH'ER." invocation_type = INVOCATION_WHISPER spell_requirements = SPELL_REQUIRES_HUMAN + /// Tracks how many victims the spell has chosen, lowers the cooldown for each target + var/victims_counter + +/datum/action/cooldown/spell/aoe/fiery_rebirth/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + + return SPELL_NO_IMMEDIATE_COOLDOWN /datum/action/cooldown/spell/aoe/fiery_rebirth/cast(mob/living/carbon/human/cast_on) cast_on.extinguish_mob() return ..() /datum/action/cooldown/spell/aoe/fiery_rebirth/get_things_to_cast_on(atom/center) + victims_counter = 0 var/list/things = list() for(var/mob/living/carbon/nearby_mob in range(aoe_radius, center)) if(nearby_mob == owner || nearby_mob == center) continue - if(!nearby_mob.mind || !nearby_mob.client) - continue if(IS_HERETIC_OR_MONSTER(nearby_mob)) continue if(nearby_mob.stat == DEAD || !nearby_mob.on_fire) continue things += nearby_mob + victims_counter++ return things @@ -44,17 +54,26 @@ victim.investigate_log("has been executed by fiery rebirth.", INVESTIGATE_DEATHS) victim.death() victim.apply_damage(20, BURN) + victim.extinguish_mob() // Heal the caster for every victim damaged 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) + need_mob_update += caster.adjust_brute_loss(-10, updating_health = FALSE) + need_mob_update += caster.adjust_fire_loss(-10, updating_health = FALSE) + need_mob_update += caster.adjust_tox_loss(-10, updating_health = FALSE, forced = TRUE) + need_mob_update += caster.adjust_oxy_loss(-10, updating_health = FALSE) + need_mob_update += caster.adjust_stamina_loss(-10, updating_stamina = FALSE) if(need_mob_update) caster.updatehealth() +/datum/action/cooldown/spell/aoe/fiery_rebirth/after_cast(atom/cast_on) + . = ..() + if(!victims_counter) + StartCooldown(cooldown_time) + return + var/new_cooldown = cooldown_time - victims_counter * 10 SECONDS + StartCooldown(max(9 SECONDS, new_cooldown)) // Hard capped so an ascended heretic doesn't get to freely spam + /obj/effect/temp_visual/eldritch_smoke icon = 'icons/effects/eldritch.dmi' icon_state = "smoke" diff --git a/code/modules/antagonists/heretic/magic/realignment.dm b/code/modules/antagonists/heretic/magic/realignment.dm index 12d751be83a9..1f33b8d1e1bd 100644 --- a/code/modules/antagonists/heretic/magic/realignment.dm +++ b/code/modules/antagonists/heretic/magic/realignment.dm @@ -73,7 +73,7 @@ owner.remove_filter(id) /datum/status_effect/realignment/tick(seconds_between_ticks) - owner.adjustStaminaLoss(-10) + owner.adjust_stamina_loss(-10) owner.AdjustAllImmobility(-1 SECONDS) /atom/movable/screen/alert/status_effect/realignment diff --git a/code/modules/antagonists/heretic/magic/rust_charge.dm b/code/modules/antagonists/heretic/magic/rust_charge.dm index 56054bd56fdd..506ef1949b4b 100644 --- a/code/modules/antagonists/heretic/magic/rust_charge.dm +++ b/code/modules/antagonists/heretic/magic/rust_charge.dm @@ -5,36 +5,43 @@ will deal high damage to others and rust around you during the charge. \ As it is the rust that empowers you with this ability, no focus is needed." charge_distance = 10 - charge_damage = 50 + charge_damage = 25 cooldown_time = 45 SECONDS + charge_past = 0 /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) + if(ishuman(owner)) + var/mob/living/carbon/human/human_owner = owner + human_owner.physiology.damage_resistance += 100 + RegisterSignal(owner, COMSIG_FINISHED_CHARGE, PROC_REF(affect_aoe)) 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/mob/living/living_owner = owner + living_owner.do_rust_heretic_act(victim) + for(var/dir in GLOB.alldirs) var/turf/nearby_turf = get_step(victim, dir) if(istype(nearby_turf)) - nearby_turf.rust_heretic_act() + living_owner.do_rust_heretic_act(nearby_turf) /datum/action/cooldown/mob_cooldown/charge/rust/DestroySurroundings(atom/movable/charger) if(!destroy_objects) return - for(var/dir in GLOB.cardinals) + for(var/dir in GLOB.alldirs) 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)) + if(!istype(source) || !istype(next_turf)) continue SSexplosions.medturf += next_turf @@ -49,3 +56,15 @@ INVOKE_ASYNC(src, PROC_REF(DestroySurroundings), source) try_hit_target(source, target, charge_damage) + +/datum/action/cooldown/mob_cooldown/charge/rust/proc/affect_aoe() + SIGNAL_HANDLER + UnregisterSignal(owner, COMSIG_FINISHED_CHARGE) + for(var/mob/living/nearby_mob in view(1, owner)) + if(nearby_mob == owner) + continue + nearby_mob.apply_damage(charge_damage, BRUTE, wound_bonus = CANT_WOUND) + nearby_mob.Knockdown(5 SECONDS) + if(ishuman(owner)) + var/mob/living/carbon/human/human_owner = owner + human_owner.physiology.damage_resistance -= 100 diff --git a/code/modules/antagonists/heretic/magic/rust_construction.dm b/code/modules/antagonists/heretic/magic/rust_construction.dm index 59aeacf30049..acfc73231e34 100644 --- a/code/modules/antagonists/heretic/magic/rust_construction.dm +++ b/code/modules/antagonists/heretic/magic/rust_construction.dm @@ -8,7 +8,8 @@ check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_CONSCIOUS|AB_CHECK_HANDS_BLOCKED school = SCHOOL_FORBIDDEN - cooldown_time = 8 SECONDS + cooldown_time = 2 SECONDS + unset_after_click = FALSE // Both of these are changed in before_cast invocation = "Someone raises a wall of rust." diff --git a/code/modules/antagonists/heretic/magic/rust_wave.dm b/code/modules/antagonists/heretic/magic/rust_wave.dm index 45f1f878cff9..70e36471a21a 100644 --- a/code/modules/antagonists/heretic/magic/rust_wave.dm +++ b/code/modules/antagonists/heretic/magic/rust_wave.dm @@ -17,7 +17,7 @@ invocation_type = INVOCATION_WHISPER spell_requirements = NONE - cone_levels = 5 + cone_levels = 6 respect_density = TRUE /datum/action/cooldown/spell/cone/staggered/entropic_plume/cast(atom/cast_on) @@ -33,9 +33,10 @@ /datum/action/cooldown/spell/cone/staggered/entropic_plume/do_mob_cone_effect(mob/living/victim, atom/caster, level) if(victim.can_block_magic(antimagic_flags) || IS_HERETIC_OR_MONSTER(victim) || victim == caster) return - victim.apply_status_effect(/datum/status_effect/amok) - victim.apply_status_effect(/datum/status_effect/cloudstruck, level * 1 SECONDS) + victim.apply_status_effect(/datum/status_effect/forced_combat/amok) + victim.apply_status_effect(/datum/status_effect/cloudstruck, 5 SECONDS) victim.adjust_disgust(100) + to_chat(victim, span_boldwarning("You feel filled with a rage that is not your own!")) /datum/action/cooldown/spell/cone/staggered/entropic_plume/calculate_cone_shape(current_level) // At the first level (that isn't level 1) we will be small diff --git a/code/modules/antagonists/heretic/magic/star_blast.dm b/code/modules/antagonists/heretic/magic/star_blast.dm index ad36cf9186ac..b4cd2ec02b86 100644 --- a/code/modules/antagonists/heretic/magic/star_blast.dm +++ b/code/modules/antagonists/heretic/magic/star_blast.dm @@ -1,6 +1,7 @@ /datum/action/cooldown/spell/pointed/projectile/star_blast name = "Star Blast" - desc = "This spell fires a disk with cosmic energies at a target, spreading the star mark." + desc = "This spell fires an unstoppable disk with cosmic energies at a target, spreading the star mark. \ + When recasted, you will be teleported to the disk, and cosmic fields will generate from the disk and from the caster, pulling nearby heathens into it." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -8,7 +9,7 @@ sound = 'sound/effects/magic/cosmic_energy.ogg' school = SCHOOL_FORBIDDEN - cooldown_time = 20 SECONDS + cooldown_time = 1 SECONDS // Cooldown is tied to teleportation, not firing invocation = "R'T'T' ST'R!" invocation_type = INVOCATION_SHOUT @@ -18,24 +19,78 @@ deactive_msg = "You stop swirling cosmic energies from the palm of your hand... for now." cast_range = 12 projectile_type = /obj/projectile/magic/star_ball + /// Weakref to the projectile we fire, so that we can recast our ability to teleport to its location + var/datum/weakref/projectile_weakref + /// Weakref to our summoner, only relevant if we are a stargazer. Prevents us from harming our master + var/datum/weakref/summoner + +/datum/action/cooldown/spell/pointed/projectile/star_blast/ready_projectile(obj/projectile/to_fire, atom/target, mob/user, iteration) + . = ..() + projectile_weakref = WEAKREF(to_fire) + to_fire.AddElement(cosmic_trail_based_on_passive(user), /obj/effect/forcefield/cosmic_field/fast) + +/datum/action/cooldown/spell/pointed/projectile/star_blast/apply_button_overlay(atom/movable/screen/movable/action_button/current_button, force) + var/obj/projectile/magic/star_ball/active_ball = projectile_weakref?.resolve() + if(!active_ball) + return ..() + + // Means we have a ball active so we'll put a border indicating you can re-cast it + current_button.cut_overlay(current_button.button_overlay) + current_button.button_overlay = mutable_appearance(icon = overlay_icon, icon_state = "bg_spell_border_active_green") + current_button.add_overlay(current_button.button_overlay) + +/datum/action/cooldown/spell/pointed/projectile/star_blast/set_click_ability(mob/on_who) + var/obj/projectile/magic/star_ball/active_ball = projectile_weakref?.resolve() + if(!active_ball) + build_all_button_icons(UPDATE_OVERLAYS) + return ..() + + pull_victims() + do_teleport(owner, active_ball) + pull_victims() // Yes, this is intentional, we want to pull mobs from the place we were, and the place we've teleported to + QDEL_NULL(active_ball) + build_all_button_icons(UPDATE_OVERLAYS) + // Cooldown of the ability itself is only 1 second after shooting, it's 25 seconds after we teleport to our ball + StartCooldown(25 SECONDS) + +/datum/action/cooldown/spell/pointed/projectile/star_blast/proc/pull_victims() + new /obj/effect/temp_visual/circle_wave/star_blast(get_turf(owner)) + for(var/turf/spawn_turf in range(1, get_turf(owner))) + if(spawn_turf.density) + continue + create_cosmic_field(spawn_turf, owner, /obj/effect/forcefield/cosmic_field/star_blast) + for(var/mob/living/nearby_mob in view(2, owner)) + if(nearby_mob == owner || nearby_mob == summoner?.resolve()) + continue + // Don't grab people who are tucked away or something + if(!isturf(nearby_mob.loc)) + continue + if(IS_HERETIC_OR_MONSTER(nearby_mob)) + continue + if(nearby_mob.can_block_magic(antimagic_flags)) + continue + for(var/i in 1 to 3) + nearby_mob.forceMove(get_step_towards(nearby_mob, owner)) + nearby_mob.apply_status_effect(/datum/status_effect/star_mark) + +/datum/action/cooldown/spell/pointed/projectile/star_blast/after_cast(atom/cast_on) + . = ..() + unset_click_ability(owner) // Unselect because we will re-select it to teleport /obj/projectile/magic/star_ball name = "star ball" icon_state = "star_ball" - damage = 20 - damage_type = BURN + damage = 0 speed = 0.2 - range = 100 + range = 25 knockdown = 4 SECONDS + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSBLOB | PASSMOB | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSFLAPS | PASSDOORS | PASSVEHICLE | PASSITEM | PASSWINDOW + projectile_piercing = PASSMOB | PASSVEHICLE /// Effect for when the ball hits something var/obj/effect/explosion_effect = /obj/effect/temp_visual/cosmic_explosion /// The range at which people will get marked with a star mark. var/star_mark_range = 3 -/obj/projectile/magic/star_ball/Initialize(mapload) - . = ..() - AddElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) - /obj/projectile/magic/star_ball/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() var/mob/living/cast_on = firer @@ -46,9 +101,4 @@ /obj/projectile/magic/star_ball/Destroy() playsound(get_turf(src), 'sound/effects/magic/cosmic_energy.ogg', 50, FALSE) - for(var/turf/cast_turf as anything in get_turfs()) - new /obj/effect/forcefield/cosmic_field(cast_turf) return ..() - -/obj/projectile/magic/star_ball/proc/get_turfs() - return list(get_turf(src), pick(get_step(src, NORTH), get_step(src, SOUTH)), pick(get_step(src, EAST), get_step(src, WEST))) diff --git a/code/modules/antagonists/heretic/magic/star_touch.dm b/code/modules/antagonists/heretic/magic/star_touch.dm index bf7491ab037f..54400f883f3e 100644 --- a/code/modules/antagonists/heretic/magic/star_touch.dm +++ b/code/modules/antagonists/heretic/magic/star_touch.dm @@ -1,10 +1,9 @@ /datum/action/cooldown/spell/touch/star_touch name = "Star Touch" - desc = "Manifests cosmic fields on tiles next to you while marking the victim with a star mark \ - or consuming an already present star mark to put them to sleep for 4 seconds. \ - They will then be linked to you with a cosmic ray, burning them for up to a minute, or \ - until they can escape your sight. Star Touch can also remove Cosmic Runes, or teleport you \ - to your Star Gazer when used on yourself." + desc = "Can be used to apply a star mark to a target. \ + If your victim is already star marked, tethers you to your target with a cosmic ray. \ + If the tether remains unbroken for 8 seconds, they will be put to sleep and teleported to you. \ + Star Touch can also remove Cosmic Runes, or teleport you to your Star Gazer when used in hand." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -35,13 +34,13 @@ ) /datum/action/cooldown/spell/touch/star_touch/cast_on_hand_hit(obj/item/melee/touch_attack/hand, mob/living/victim, mob/living/carbon/caster) - if(victim.has_status_effect(/datum/status_effect/star_mark)) - victim.apply_effect(4 SECONDS, effecttype = EFFECT_UNCONSCIOUS) - victim.remove_status_effect(/datum/status_effect/star_mark) - else + if(!victim.has_status_effect(/datum/status_effect/star_mark)) victim.apply_status_effect(/datum/status_effect/star_mark, caster) + return TRUE + victim.remove_status_effect(/datum/status_effect/star_mark) + victim.adjust_drowsiness(8 SECONDS) for(var/turf/cast_turf as anything in get_turfs(victim)) - new /obj/effect/forcefield/cosmic_field(cast_turf) + create_cosmic_field(cast_turf, caster) caster.apply_status_effect(/datum/status_effect/cosmic_beam, victim) return TRUE @@ -82,6 +81,15 @@ effects_we_clear = list(/obj/effect/cosmic_rune), \ ) +/obj/item/melee/touch_attack/star_touch/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(!isliving(interacting_with)) + return + var/mob/living/living_target = interacting_with + if(get_dist(living_target, user) > 3) + return + return melee_attack_chain(user, living_target, modifiers) + /* * Callback for effect_remover component. */ @@ -89,7 +97,17 @@ 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(user) - remove_hand_with_no_refund(user) + if(!QDELETED(star_touch_spell)) + qdel(star_touch_spell) + var/datum/action/cooldown/spell/cosmic_rune/rune_spell = locate() in user.actions + var/obj/effect/cosmic_rune/first_rune = rune_spell.first_rune.resolve() + var/obj/effect/cosmic_rune/second_rune = rune_spell.second_rune.resolve() + if(!QDELETED(first_rune)) + new /obj/effect/temp_visual/cosmic_rune_fade(get_turf(first_rune)) + QDEL_NULL(first_rune) + if(!QDELETED(second_rune)) + new /obj/effect/temp_visual/cosmic_rune_fade(get_turf(second_rune)) + QDEL_NULL(second_rune) /obj/item/melee/touch_attack/star_touch/ignition_effect(atom/to_light, mob/user) . = span_rose("[user] effortlessly snaps [user.p_their()] fingers near [to_light], igniting it with cosmic energies. Fucking badass!") @@ -118,7 +136,7 @@ /datum/status_effect/cosmic_beam id = "cosmic_beam" tick_interval = 0.2 SECONDS - duration = 1 MINUTES + duration = 8 SECONDS status_type = STATUS_EFFECT_REPLACE alert_type = null /// Stores the current beam target @@ -133,12 +151,26 @@ var/active = FALSE /// The storage for the beam var/datum/beam/current_beam = null + /// The timer for the teleport effect + var/teleport_timer + /// The effect trail that we add to our victim + var/cosmic_effect_trail /datum/status_effect/cosmic_beam/on_creation(mob/living/new_owner, mob/living/current_target) src.current_target = current_target + cosmic_effect_trail = cosmic_trail_based_on_passive(new_owner) start_beam(current_target, new_owner) + ADD_TRAIT(current_target, TRAIT_NO_TELEPORT, REF(src)) + teleport_timer = addtimer(CALLBACK(src, PROC_REF(yoink_victim), new_owner), 8 SECONDS, TIMER_STOPPABLE) return ..() +/// Puts the victim to sleep and teleports them to the casters' location +/datum/status_effect/cosmic_beam/proc/yoink_victim(mob/living/carbon/caster) + current_target.apply_effect(8 SECONDS, effecttype = EFFECT_UNCONSCIOUS) + REMOVE_TRAIT(current_target, TRAIT_NO_TELEPORT, REF(src)) + do_teleport(current_target, caster, channel = TELEPORT_CHANNEL_MAGIC, forced = TRUE) + current_target.apply_status_effect(/datum/status_effect/star_mark) + /datum/status_effect/cosmic_beam/be_replaced() if(active) QDEL_NULL(current_beam) @@ -155,17 +187,15 @@ last_check = world.time - if(!los_check(owner, current_target)) + if(!get_dist(owner, current_target) > 8) QDEL_NULL(current_beam)//this will give the target lost message return - if(current_target) - on_beam_tick(current_target) - /** * Proc that always is called when we want to end the beam and makes sure things are cleaned up, see beam_died() */ /datum/status_effect/cosmic_beam/proc/lose_target() + deltimer(teleport_timer) if(active) QDEL_NULL(current_beam) active = FALSE @@ -181,6 +211,7 @@ /datum/status_effect/cosmic_beam/proc/beam_died() SIGNAL_HANDLER to_chat(owner, span_warning("You lose control of the beam!")) + active = FALSE lose_target() duration = 0 @@ -194,24 +225,21 @@ current_target = target active = TRUE - current_beam = user.Beam(current_target, icon_state="cosmic_beam", time = 1 MINUTES, maxdistance = max_range, beam_type = /obj/effect/ebeam/cosmic) + current_beam = user.Beam(current_target, icon_state="cosmic_beam", time = 8 SECONDS, maxdistance = max_range, beam_type = /obj/effect/ebeam/cosmic) RegisterSignal(current_beam, COMSIG_QDELETING, PROC_REF(beam_died)) SSblackbox.record_feedback("tally", "gun_fired", 1, type) if(current_target) - on_beam_hit(current_target) + on_beam_hit(current_target, user) /// 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/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) - if(target.adjustFireLoss(3, updating_health = FALSE)) - target.updatehealth() +/datum/status_effect/cosmic_beam/proc/on_beam_hit(mob/living/target, mob/living/user) + if(isstargazer(target)) + return + target.AddElement(cosmic_effect_trail, /obj/effect/forcefield/cosmic_field/star_touch) /// 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/heretic_summon/star_gazer)) - target.RemoveElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) + if(isstargazer(target)) + return + target.RemoveElement(cosmic_effect_trail, /obj/effect/forcefield/cosmic_field/star_touch) diff --git a/code/modules/antagonists/heretic/magic/void_conduit.dm b/code/modules/antagonists/heretic/magic/void_conduit.dm index 0b7d325e3f86..4ba5e0d547b6 100644 --- a/code/modules/antagonists/heretic/magic/void_conduit.dm +++ b/code/modules/antagonists/heretic/magic/void_conduit.dm @@ -28,6 +28,7 @@ icon_state = "void_conduit" anchored = TRUE density = TRUE + max_integrity = 150 ///Overlay to apply to the tiles in range of the conduit var/static/image/void_overlay = image(icon = 'icons/turf/overlays.dmi', icon_state = "voidtile") ///List of tiles that we added an overlay to, so we can clear them when the conduit is deleted @@ -99,13 +100,9 @@ else affected_mob.apply_status_effect(/datum/status_effect/void_chill, 1) - if(istype(thing_to_affect, /obj/machinery/door) || istype(thing_to_affect, /obj/structure/door_assembly)) - var/obj/affected_door = thing_to_affect - affected_door.take_damage(rand(15, 30)) - - if(istype(thing_to_affect, /obj/structure/window) || istype(thing_to_affect, /obj/structure/grille)) - var/obj/structure/affected_structure = thing_to_affect - affected_structure.take_damage(rand(10, 20)) + if(istype(thing_to_affect, /obj/machinery/door) || istype(thing_to_affect, /obj/structure/door_assembly) || istype(thing_to_affect, /obj/structure/window) || istype(thing_to_affect, /obj/structure/grille)) + var/obj/affected_structure = thing_to_affect + affected_structure.take_damage(rand(15, 30)) /datum/looping_sound/void_conduit mid_sounds = 'sound/ambience/misc/ambiatm1.ogg' diff --git a/code/modules/antagonists/heretic/magic/void_phase.dm b/code/modules/antagonists/heretic/magic/void_phase.dm index 473fa057cf54..74f00d6fba62 100644 --- a/code/modules/antagonists/heretic/magic/void_phase.dm +++ b/code/modules/antagonists/heretic/magic/void_phase.dm @@ -10,7 +10,7 @@ ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi' school = SCHOOL_FORBIDDEN - cooldown_time = 25 SECONDS + cooldown_time = 20 SECONDS invocation = "RE'L'TY PH'S'E." invocation_type = INVOCATION_WHISPER @@ -57,7 +57,7 @@ if(living_mob.can_block_magic(antimagic_flags)) continue living_mob.apply_damage(40, BRUTE, wound_bonus = CANT_WOUND) - living_mob.apply_status_effect(/datum/status_effect/void_chill, 1) + living_mob.apply_status_effect(/datum/status_effect/void_chill, 2) /obj/effect/temp_visual/voidin icon = 'icons/effects/96x96.dmi' diff --git a/code/modules/antagonists/heretic/magic/void_prison.dm b/code/modules/antagonists/heretic/magic/void_prison.dm index a70c4e36ffab..3cb065453709 100644 --- a/code/modules/antagonists/heretic/magic/void_prison.dm +++ b/code/modules/antagonists/heretic/magic/void_prison.dm @@ -53,7 +53,7 @@ /datum/status_effect/void_prison/on_remove() if(!IS_HERETIC(owner)) - owner.apply_status_effect(/datum/status_effect/void_chill, 3) + owner.apply_status_effect(/datum/status_effect/void_chill, 1) if(stasis_overlay) //Free our prisoner owner.remove_traits(list(TRAIT_GODMODE, TRAIT_NO_TRANSFORM, TRAIT_SOFTSPOKEN), TRAIT_STATUS_EFFECT(id)) @@ -97,5 +97,7 @@ /atom/movable/screen/alert/status_effect/void_prison name = "Void Prison" desc = "A Yawning void encases your mortal coil." //Go straight to jail, do not pass GO, do not collect 200$ - icon = 'icons/mob/actions/actions_ecult.dmi' - icon_state = "voidball_effect" + use_user_hud_icon = TRUE + icon_state = "heretic_template" + overlay_icon = 'icons/mob/actions/actions_ecult.dmi' + overlay_state = "voidball_effect" diff --git a/code/modules/antagonists/heretic/magic/void_pull.dm b/code/modules/antagonists/heretic/magic/void_pull.dm index 4e73ff6f49bf..b705940846e3 100644 --- a/code/modules/antagonists/heretic/magic/void_pull.dm +++ b/code/modules/antagonists/heretic/magic/void_pull.dm @@ -1,7 +1,6 @@ /datum/action/cooldown/spell/aoe/void_pull name = "Void Pull" - desc = "Calls the void, damaging, knocking down, and stunning people nearby. \ - Distant foes are also pulled closer to you (but not damaged)." + desc = "Calls the void, damaging, knocking down, pulling people closer, and stunning people nearby." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -14,12 +13,7 @@ invocation = "BR'NG F'RTH TH'M T' M'." invocation_type = INVOCATION_WHISPER spell_requirements = NONE - - aoe_radius = 7 - /// The radius of the actual damage circle done before cast - var/damage_radius = 1 - /// The radius of the stun applied to nearby people on cast - var/stun_radius = 4 + aoe_radius = 2 // Before the cast, we do some small AOE damage around the caster /datum/action/cooldown/spell/aoe/void_pull/before_cast(atom/cast_on) @@ -29,14 +23,9 @@ new /obj/effect/temp_visual/voidin(get_turf(cast_on)) - // Before we cast the actual effects, deal AOE damage to anyone adjacent to us - for(var/mob/living/nearby_living as anything in get_things_to_cast_on(cast_on, damage_radius)) - nearby_living.apply_damage(30, BRUTE, wound_bonus = CANT_WOUND) - nearby_living.apply_status_effect(/datum/status_effect/void_chill, 1) - -/datum/action/cooldown/spell/aoe/void_pull/get_things_to_cast_on(atom/center, radius_override = 1) +/datum/action/cooldown/spell/aoe/void_pull/get_things_to_cast_on(atom/center) var/list/things = list() - for(var/mob/living/nearby_mob in view(radius_override || aoe_radius, center)) + for(var/mob/living/nearby_mob in view(aoe_radius, center)) if(nearby_mob == owner || nearby_mob == center) continue // Don't grab people who are tucked away or something @@ -53,11 +42,9 @@ // For the actual cast, we microstun people nearby and pull them in /datum/action/cooldown/spell/aoe/void_pull/cast_on_thing_in_aoe(mob/living/victim, atom/caster) - // If the victim's within the stun radius, they're stunned / knocked down - if(get_dist(victim, caster) < stun_radius) - victim.AdjustKnockdown(3 SECONDS) - victim.AdjustParalyzed(0.5 SECONDS) - - // Otherwise, they take a few steps closer + victim.apply_damage(30, BRUTE, wound_bonus = CANT_WOUND) + victim.apply_status_effect(/datum/status_effect/void_chill, 3) + victim.AdjustKnockdown(3 SECONDS) + victim.AdjustParalyzed(0.5 SECONDS) for(var/i in 1 to 3) victim.forceMove(get_step_towards(victim, caster)) diff --git a/code/modules/antagonists/heretic/magic/wave_of_desperation.dm b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm index 16e3440ebbee..cf00b7692eb8 100644 --- a/code/modules/antagonists/heretic/magic/wave_of_desperation.dm +++ b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm @@ -1,14 +1,14 @@ /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!" + Cannot be cast unless you are restrained. (Can be casted without a focus)" 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/effects/magic/swap.ogg' - school = SCHOOL_FORBIDDEN + school = SCHOOL_EVOCATION cooldown_time = 5 MINUTES invocation = "F'K 'FF." diff --git a/code/modules/antagonists/heretic/status_effects/buffs.dm b/code/modules/antagonists/heretic/status_effects/buffs.dm index 3da3c43e1ebd..f3660e2f8136 100644 --- a/code/modules/antagonists/heretic/status_effects/buffs.dm +++ b/code/modules/antagonists/heretic/status_effects/buffs.dm @@ -24,6 +24,7 @@ owner.alpha = initial(owner.alpha) owner.pass_flags &= ~(PASSCLOSEDTURF | PASSGLASS | PASSGRILLE | PASSMACHINE | PASSSTRUCTURE | PASSTABLE | PASSMOB | PASSDOORS | PASSVEHICLE) owner.forceMove(location) + owner.apply_status_effect(/datum/status_effect/crucible_soul_cooldown) location = null /datum/status_effect/crucible_soul/get_examine_text() @@ -43,6 +44,14 @@ target = active_effect qdel(target) +/datum/status_effect/crucible_soul_cooldown + id = "Crucible Soul Cooldown" + status_type = STATUS_EFFECT_UNIQUE + duration = 2 MINUTES + alert_type = /atom/movable/screen/alert/status_effect/crucible_soul/cooldown + show_duration = TRUE + remove_on_fullheal = TRUE + // DUSK AND DAWN /datum/status_effect/duskndawn id = "Blessing of Dusk and Dawn" @@ -91,8 +100,8 @@ return var/mob/living/carbon/carbie = owner - carbie.adjustBruteLoss(-0.5 * seconds_between_ticks, updating_health = FALSE) - carbie.adjustFireLoss(-0.5 * seconds_between_ticks, updating_health = FALSE) + carbie.adjust_brute_loss(-0.5 * seconds_between_ticks, updating_health = FALSE) + carbie.adjust_fire_loss(-0.5 * seconds_between_ticks, updating_health = FALSE) for(var/BP in carbie.bodyparts) var/obj/item/bodypart/part = BP for(var/W in part.wounds) @@ -107,11 +116,11 @@ if(WOUND_SEVERITY_CRITICAL) heal_amt = 6 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) + if (pregen_data.wounding_types_valid(WOUND_BURN)) + carbie.adjust_fire_loss(-heal_amt) else - carbie.adjustBruteLoss(-heal_amt) - carbie.blood_volume += carbie.blood_volume >= BLOOD_VOLUME_NORMAL ? 0 : heal_amt*3 + carbie.adjust_brute_loss(-heal_amt) + carbie.adjust_blood_volume(heal_amt * 3, maximum = BLOOD_VOLUME_NORMAL) /atom/movable/screen/alert/status_effect/crucible_soul @@ -119,6 +128,10 @@ desc = "You phased through reality. You are halfway to your final destination..." icon_state = "crucible" +/atom/movable/screen/alert/status_effect/crucible_soul/cooldown + desc = "You have recently phased through reality. You must wait before you can do so once more." + icon_state = "crucible_cooldown" + /atom/movable/screen/alert/status_effect/duskndawn name = "Blessing of Dusk and Dawn" desc = "Many things hide beyond the horizon. With Owl's help I managed to slip past Sun's guard and Moon's watch." @@ -355,3 +368,24 @@ name = "Blessing of The Moon" desc = "The Moon clouds their vision, as the sun always has yours." icon_state = "moon_hide" + +// 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 = STATUS_EFFECT_NO_TICK + +/atom/movable/screen/alert/status_effect/heretic_lastresort + name = "Last Resort" + desc = "Your head spins, heart pumping as fast as it can!" + 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 won't give up that easily!")) + return TRUE + +/datum/status_effect/heretic_lastresort/on_remove() + REMOVE_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id)) diff --git a/code/modules/antagonists/heretic/status_effects/debuffs.dm b/code/modules/antagonists/heretic/status_effects/debuffs.dm index 2ed47663fba9..73f01092a681 100644 --- a/code/modules/antagonists/heretic/status_effects/debuffs.dm +++ b/code/modules/antagonists/heretic/status_effects/debuffs.dm @@ -1,16 +1,19 @@ -// AMOK -/datum/status_effect/amok - id = "amok" +/// Forces the mob to attack nearby targets +/datum/status_effect/forced_combat + id = "forced_combat" status_type = STATUS_EFFECT_REPLACE alert_type = null duration = 10 SECONDS - tick_interval = 1 SECONDS + tick_interval = CLICK_CD_MELEE + /// We stop attacking after this many successful attacks + var/num_attacks = INFINITY -/datum/status_effect/amok/on_apply(mob/living/afflicted) - to_chat(owner, span_boldwarning("You feel filled with a rage that is not your own!")) - return TRUE +/datum/status_effect/forced_combat/on_creation(mob/living/new_owner, duration = 10 SECONDS, num_attacks = INFINITY) + src.duration = duration + src.num_attacks = num_attacks + return ..() -/datum/status_effect/amok/tick(seconds_between_ticks) +/datum/status_effect/forced_combat/tick(seconds_between_ticks) var/prev_combat_mode = owner.combat_mode owner.set_combat_mode(TRUE) @@ -18,21 +21,37 @@ // Otherwise, just look for adjacent targets var/search_radius = isgun(owner.get_active_held_item()) ? 3 : 1 - var/list/mob/living/targets = list() + var/list/mob/living/targets for(var/mob/living/potential_target in oview(owner, search_radius)) - if(IS_HERETIC_OR_MONSTER(potential_target)) + if(!will_attack(potential_target)) continue - targets += potential_target + LAZYADD(targets, potential_target) if(LAZYLEN(targets)) - owner.log_message(" attacked someone due to the amok debuff.", LOG_ATTACK) //the following attack will log itself + owner.log_message(" attacked someone due to the [id] debuff.", LOG_ATTACK) //the following attack will log itself owner.ClickOn(pick(targets)) + num_attacks -= 1 owner.set_combat_mode(prev_combat_mode) + if(num_attacks <= 0) + qdel(src) + +/datum/status_effect/forced_combat/proc/will_attack(mob/living/friendly) + return TRUE + +/datum/status_effect/forced_combat/amok + id = "amok_forced_combat" + remove_on_fullheal = TRUE + alert_type = null + +/datum/status_effect/forced_combat/amok/will_attack(mob/living/friendly) + return !IS_HERETIC_OR_MONSTER(friendly) + /datum/status_effect/cloudstruck id = "cloudstruck" status_type = STATUS_EFFECT_REPLACE + remove_on_fullheal = TRUE alert_type = null duration = 3 SECONDS on_remove_on_mob_delete = TRUE @@ -78,31 +97,32 @@ human_owner.set_timed_status_effect(100 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) if(30 to 40) // Don't fully kill liver that's important - human_owner.adjustOrganLoss(ORGAN_SLOT_LIVER, 10, 90) + human_owner.adjust_organ_loss(ORGAN_SLOT_LIVER, 10, 90) if(40 to 50) // Don't fully kill heart that's important - human_owner.adjustOrganLoss(ORGAN_SLOT_HEART, 10, 90) + human_owner.adjust_organ_loss(ORGAN_SLOT_HEART, 10, 90) if(50 to 60) // You can fully kill the stomach that's not crucial - human_owner.adjustOrganLoss(ORGAN_SLOT_STOMACH, 10) + human_owner.adjust_organ_loss(ORGAN_SLOT_STOMACH, 10) if(60 to 70) // Same with eyes - human_owner.adjustOrganLoss(ORGAN_SLOT_EYES, 5) + human_owner.adjust_organ_loss(ORGAN_SLOT_EYES, 5) if(70 to 80) // And same with ears - human_owner.adjustOrganLoss(ORGAN_SLOT_EARS, 10) + human_owner.adjust_organ_loss(ORGAN_SLOT_EARS, 10) if(80 to 90) // But don't fully kill lungs that's usually important - human_owner.adjustOrganLoss(ORGAN_SLOT_LUNGS, 10, 90) + human_owner.adjust_organ_loss(ORGAN_SLOT_LUNGS, 10, 90) if(90 to 95) // And definitely don't fully kil brains - human_owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20, 190) + human_owner.adjust_organ_loss(ORGAN_SLOT_BRAIN, 20, 190) if(95 to 100) human_owner.adjust_confusion_up_to(12 SECONDS, 24 SECONDS) /datum/status_effect/star_mark id = "star_mark" alert_type = /atom/movable/screen/alert/status_effect/star_mark + remove_on_fullheal = TRUE duration = 30 SECONDS status_type = STATUS_EFFECT_REPLACE ///overlay used to indicate that someone is marked @@ -130,7 +150,7 @@ return ..() /datum/status_effect/star_mark/on_apply() - if(istype(owner, /mob/living/basic/heretic_summon/star_gazer)) + if(isstargazer(owner)) 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) @@ -155,34 +175,14 @@ /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 = STATUS_EFFECT_NO_TICK - -/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) - /// Used by moon heretics to make people mad /datum/status_effect/moon_converted id = "moon converted" alert_type = /atom/movable/screen/alert/status_effect/moon_converted duration = STATUS_EFFECT_PERMANENT status_type = STATUS_EFFECT_REPLACE + remove_on_fullheal = TRUE + heal_flag_necessary = HEAL_ADMIN ///used to track damage var/damage_sustained = 0 ///overlay used to indicate that someone is marked @@ -208,12 +208,12 @@ /datum/status_effect/moon_converted/on_apply() RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) // Heals them so people who are in crit can have this affect applied on them and still be of some use for the heretic - owner.adjustBruteLoss( -150 + owner.mob_mood.sanity) - owner.adjustFireLoss(-150 + owner.mob_mood.sanity) + owner.adjust_brute_loss(-150 + owner.mob_mood.sanity) + owner.adjust_fire_loss(-150 + owner.mob_mood.sanity) to_chat(owner, span_hypnophrase(("THE MOON SHOWS YOU THE TRUTH AND THE LIARS WISH TO COVER IT, SLAY THEM ALL!!!"))) owner.balloon_alert(owner, "they lie..THEY ALL LIE!!!") - owner.AdjustUnconscious(7 SECONDS, ignore_canstun = FALSE) + owner.SetUnconscious(60 SECONDS, ignore_canstun = FALSE) ADD_TRAIT(owner, TRAIT_MUTE, TRAIT_STATUS_EFFECT(id)) RegisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(update_owner_overlay)) owner.update_appearance(UPDATE_OVERLAYS) @@ -249,6 +249,20 @@ owner.update_appearance(UPDATE_OVERLAYS) return ..() +// exists to apply sleep and deny adding duplicates +/datum/status_effect/moon_slept + id = "moon slept" + duration = 2 MINUTES + status_type = STATUS_EFFECT_UNIQUE + remove_on_fullheal = TRUE + alert_type = null + +/datum/status_effect/moon_slept/on_apply() + . = owner.SetUnconscious(duration * 0.5, ignore_canstun = FALSE) + if(!.) + owner.balloon_alert(owner, "sleep resisted!") + to_chat(owner, span_hypnophrase(("THE MOON SHOWS YOU THE TRUTH AND THE LIARS WISH TO COVER IT, w-wait no that's not right"))) + owner.balloon_alert(owner, "they lie..wait-what are they lying about?") /atom/movable/screen/alert/status_effect/moon_converted name = "Moon Converted" @@ -262,6 +276,7 @@ alert_type = /atom/movable/screen/alert/status_effect/eldritch_painting duration = 10 MINUTES status_type = STATUS_EFFECT_UNIQUE + remove_on_fullheal = TRUE /datum/status_effect/eldritch_painting/on_apply() if(IS_HERETIC_OR_MONSTER(owner)) @@ -389,3 +404,64 @@ name = "Climb Over the Rusted Mountain" desc = "Your every footfall erodes the ground beneath you! Everything crumbles away! Maybe if you looked closer at the mountain in that painting, the path might be clearer..." icon_state = "eldritch_painting_rust" + +/atom/movable/screen/alert/status_effect/eldritch_parade + name = "Lunar Parade" + desc = "You MUST ENTER THE LUNAR PARADE! FOLLOW THE LIGHTS! LET THEM GUIDE YOU!" + icon = 'icons/obj/weapons/guns/projectiles.dmi' + icon_state = "lunar_parade" + +/datum/status_effect/moon_parade + id = "moon_parade" + remove_on_fullheal = TRUE + alert_type = /atom/movable/screen/alert/status_effect/eldritch_parade + duration = 20 SECONDS + tick_interval = -1 + /// The component that leashes us to the parade + var/datum/component/leash/leash_component + /// what atom we are leashed to + var/atom/leashed_to + /// how much damage before we release the leash + var/damage_release_threshold = 50 + /// how much damage we have received so far + var/damage_received = 0 + +/datum/status_effect/moon_parade/on_creation(mob/living/new_owner, atom/leashed_by) + leashed_to = leashed_by + . = ..() + +/datum/status_effect/moon_parade/on_apply() + if(!istype(leashed_to)) + return FALSE + owner.balloon_alert(owner, "you feel unable to move away from the [leashed_to]!") + leash_component = owner.AddComponent(/datum/component/leash, leashed_to, distance = 1) + RegisterSignal(leashed_to, COMSIG_QDELETING, PROC_REF(delete_self)) + RegisterSignal(owner, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, PROC_REF(block_move)) + RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damage_received)) + return TRUE + +/datum/status_effect/moon_parade/on_remove() + . = ..() + QDEL_NULL(leash_component) + UnregisterSignal(owner, list(COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, COMSIG_MOB_APPLY_DAMAGE)) + if(leashed_to) + UnregisterSignal(leashed_to, COMSIG_QDELETING) + +/datum/status_effect/moon_parade/proc/delete_self(datum/source) + SIGNAL_HANDLER + qdel(src) + +/datum/status_effect/moon_parade/proc/on_damage_received(mob/attacked, damage_amount, damagetype) + SIGNAL_HANDLER + if(damagetype == STAMINA) + return + damage_received += damage_amount + if(damage_received >= damage_release_threshold) + owner.balloon_alert(owner, "you are free!") + qdel(src) + +// Blocks movement in order to make it appear like the character is transfixed to the projectile and wandering after it +// Coded this way because its a simple way to hold the illusion compared to other methods +/datum/status_effect/moon_parade/proc/block_move(datum/source) + SIGNAL_HANDLER + return COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE diff --git a/code/modules/antagonists/heretic/status_effects/ghoul.dm b/code/modules/antagonists/heretic/status_effects/ghoul.dm index 598b43f60fd0..7219b77ac14f 100644 --- a/code/modules/antagonists/heretic/status_effects/ghoul.dm +++ b/code/modules/antagonists/heretic/status_effects/ghoul.dm @@ -62,6 +62,7 @@ on_made_callback?.Invoke(human_target) ADD_TRAIT(human_target, TRAIT_FAKEDEATH, TRAIT_STATUS_EFFECT(id)) ADD_TRAIT(human_target, TRAIT_HERETIC_SUMMON, TRAIT_STATUS_EFFECT(id)) + ADD_TRAIT(human_target, TRAIT_DESENSITIZED, TRAIT_STATUS_EFFECT(id)) human_target.become_husk(TRAIT_STATUS_EFFECT(id)) human_target.faction |= FACTION_HERETIC @@ -92,6 +93,7 @@ on_lost_callback?.Invoke(human_target) REMOVE_TRAIT(human_target, TRAIT_FAKEDEATH, TRAIT_STATUS_EFFECT(id)) REMOVE_TRAIT(human_target, TRAIT_HERETIC_SUMMON, TRAIT_STATUS_EFFECT(id)) + REMOVE_TRAIT(human_target, TRAIT_DESENSITIZED, TRAIT_STATUS_EFFECT(id)) human_target.cure_husk(TRAIT_STATUS_EFFECT(id)) human_target.faction -= FACTION_HERETIC human_target.mind?.remove_antag_datum(/datum/antagonist/heretic_monster) @@ -103,4 +105,5 @@ /atom/movable/screen/alert/status_effect/ghoul name = "Flesh Servant" desc = "You are a Ghoul!" - icon_state = ALERT_MIND_CONTROL + icon_state = "heretic_template" + overlay_state = "mind_control" diff --git a/code/modules/antagonists/heretic/status_effects/heretic_passive.dm b/code/modules/antagonists/heretic/status_effects/heretic_passive.dm new file mode 100644 index 000000000000..8b647c2c5b54 --- /dev/null +++ b/code/modules/antagonists/heretic/status_effects/heretic_passive.dm @@ -0,0 +1,588 @@ +#define HERETIC_LEVEL_START 1 +#define HERETIC_LEVEL_UPGRADE 2 +#define HERETIC_LEVEL_FINAL 3 + +/datum/status_effect/heretic_passive + id = "heretic_passive" + duration = STATUS_EFFECT_PERMANENT + status_type = STATUS_EFFECT_REPLACE + alert_type = null + on_remove_on_mob_delete = TRUE + /// Reference to the owning heretic datum + var/datum/antagonist/heretic/heretic_datum + ///What level is our passive currently on + var/passive_level = HERETIC_LEVEL_START + /// Name of the passive, used by the UI + var/name = "Heretic Passive" + var/list/passive_descriptions = list( + "Grants you a passive ability based on your heretic type. This ability will upgrade as you gain more power.", + "Your passive ability has been upgraded, doing something else.", + "Your passive ability has been upgraded to its final form, granting you a powerful new ability.", + ) + +/datum/status_effect/heretic_passive/on_apply() + . = ..() + heretic_datum = GET_HERETIC(owner) + RegisterSignal(heretic_datum, COMSIG_HERETIC_PASSIVE_UPGRADE_FIRST, PROC_REF(heretic_level_upgrade)) + RegisterSignal(heretic_datum, COMSIG_HERETIC_PASSIVE_UPGRADE_FINAL, PROC_REF(heretic_level_final)) + if(!heretic_datum) + return FALSE + + // Just in case of shenanigans, assume the antag datum is correct about our level + if(heretic_datum.passive_level == 3) + heretic_level_final() + return + if(heretic_datum.passive_level == 2) + heretic_level_upgrade() + return + +/datum/status_effect/heretic_passive/on_remove() + UnregisterSignal(heretic_datum, list( + COMSIG_HERETIC_PASSIVE_UPGRADE_FIRST, + COMSIG_HERETIC_PASSIVE_UPGRADE_FINAL, + )) + heretic_datum = null + return ..() + +/// Gives our first upgrade +/datum/status_effect/heretic_passive/proc/heretic_level_upgrade() + SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) + passive_level = HERETIC_LEVEL_UPGRADE + heretic_datum.passive_level = HERETIC_LEVEL_UPGRADE + heretic_datum.update_data_for_all_viewers() + if(!heretic_datum.unlimited_blades) + heretic_datum.disable_blade_breaking() + +/// Gives our final upgrade +/datum/status_effect/heretic_passive/proc/heretic_level_final() + SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) + if(passive_level == HERETIC_LEVEL_START) + heretic_level_upgrade() + passive_level = HERETIC_LEVEL_FINAL + heretic_datum.passive_level = HERETIC_LEVEL_FINAL + heretic_datum.update_data_for_all_viewers() + + +//---- Ash Passive +// Level 1 grants heat and ash storm immunity +// Level 2 grants lava immunity +// Level 3 grants resistance to high pressure +/datum/status_effect/heretic_passive/ash + name = "Vow of Destruction" + passive_descriptions = list( + "Heat and ash storm immunity.", + "Lava immunity.", + "Resistance to high and low pressure." + ) + +/datum/status_effect/heretic_passive/ash/on_apply() + . = ..() + owner.add_traits(list(TRAIT_RESISTHEAT, TRAIT_ASHSTORM_IMMUNE), REF(src)) + +/datum/status_effect/heretic_passive/ash/heretic_level_upgrade() + . = ..() + ADD_TRAIT(owner, TRAIT_LAVA_IMMUNE, REF(src)) + +/datum/status_effect/heretic_passive/ash/heretic_level_final() + . = ..() + owner.add_traits(list(TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE), REF(src)) + +/datum/status_effect/heretic_passive/ash/on_remove() + owner.remove_traits(list(TRAIT_RESISTHEAT, TRAIT_ASHSTORM_IMMUNE, TRAIT_LAVA_IMMUNE, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE), REF(src)) + return ..() + +//---- Blade Passive +// Gives you riposte while wielding a heretic blade +// Cooldown starts at 20 and goes down 5 seconds per level +// Level 1 has a 20 second cooldown + counts as block +// Level 2 Makes you immune to fall damage/stun from falling +// Level 3 only has the cooldown reduction (nothing else added) +/datum/status_effect/heretic_passive/blade + name = "Dance of the Brand" + id = "blade_passive" + passive_descriptions = list( + "Being attacked while wielding a Heretic Blade in either hand will deliver a free, instant counterattack to the attacker. This effect can only trigger once every 20 seconds.", + "Immunity to fall damage.", + "Cooldown of the riposte reduced to 10 seconds." + ) + /// The cooldown before we can riposte again + var/base_cooldown = 20 SECONDS + /// The cooldown reduction gained from upgrading + var/cooldown_reduction = 5 SECONDS + /// Whether the counter-attack is ready or not. + /// Used so we can give feedback when it's ready again + var/riposte_ready = TRUE + +/datum/status_effect/heretic_passive/blade/on_apply() + . = ..() + RegisterSignal(owner, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(on_shield_reaction)) + +/datum/status_effect/heretic_passive/blade/heretic_level_upgrade() + . = ..() + RegisterSignal(owner, COMSIG_LIVING_Z_IMPACT, PROC_REF(z_impact_react)) + +/datum/status_effect/heretic_passive/blade/on_remove() + . = ..() + UnregisterSignal(owner, list(COMSIG_LIVING_CHECK_BLOCK, COMSIG_LIVING_Z_IMPACT)) + +/// Blocks the effects from falling +/datum/status_effect/heretic_passive/blade/proc/z_impact_react(datum/source, levels, turf/fell_on) + SIGNAL_HANDLER + new /obj/effect/temp_visual/mook_dust(fell_on) + owner.visible_message(span_notice("[owner] lands on [fell_on] safely, and quite stylishly on [p_their()] feet!")) + INVOKE_ASYNC(owner, TYPE_PROC_REF(/atom, SpinAnimation), 0.5 SECONDS, 0) + INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob/, emote), "flip") + return ZIMPACT_CANCEL_DAMAGE | ZIMPACT_NO_MESSAGE | ZIMPACT_NO_SPIN + +/// Checks if we can counter-attack +/datum/status_effect/heretic_passive/blade/proc/on_shield_reaction( + mob/living/carbon/human/source, + atom/movable/hitby, + damage = 0, + attack_text = "the attack", + attack_type = MELEE_ATTACK, + armour_penetration = 0, + damage_type = BRUTE, +) + SIGNAL_HANDLER + + if(attack_type != MELEE_ATTACK) + return + + if(!riposte_ready) + return + + if(INCAPACITATED_IGNORING(source, INCAPABLE_GRAB)) + return + + var/mob/living/attacker = hitby.loc + if(!istype(attacker)) + return + + if(!source.Adjacent(attacker)) + return + + // Let's check their held items to see if we can do a riposte + var/obj/item/main_hand = source.get_active_held_item() + var/obj/item/off_hand = source.get_inactive_held_item() + // This is the item that ends up doing the "blocking" (flavor) + var/obj/item/striking_with + + // First we'll check if the offhand is valid + if(!QDELETED(off_hand) && istype(off_hand, /obj/item/melee/sickly_blade)) + striking_with = off_hand + + // Then we'll check the mainhand + // We do mainhand second, because we want to prioritize it over the offhand + if(!QDELETED(main_hand) && istype(main_hand, /obj/item/melee/sickly_blade)) + striking_with = main_hand + + // No valid item in either slot? No riposte + if(!striking_with) + return + + // If we made it here, deliver the strike + INVOKE_ASYNC(src, PROC_REF(counter_attack), source, attacker, striking_with, attack_text) + + // And reset after a bit + riposte_ready = FALSE + addtimer(CALLBACK(src, PROC_REF(reset_riposte), source), (base_cooldown - cooldown_reduction * (passive_level - 1))) + + if(passive_level > HERETIC_LEVEL_START) + return SUCCESSFUL_BLOCK + +/// Does the actual counter-attack +/datum/status_effect/heretic_passive/blade/proc/counter_attack(mob/living/carbon/human/source, mob/living/target, obj/item/melee/sickly_blade/weapon, attack_text) + playsound(get_turf(source), 'sound/items/weapons/parry.ogg', 100, TRUE) + source.balloon_alert(source, "riposte used") + source.visible_message( + span_warning("[source] leans into [attack_text] and delivers a sudden riposte back at [target]!"), + span_warning("You lean into [attack_text] and deliver a sudden riposte back at [target]!"), + span_hear("You hear a clink, followed by a stab."), + ) + weapon.melee_attack_chain(source, target) + +/// Gives feedback to the user +/datum/status_effect/heretic_passive/blade/proc/reset_riposte(mob/living/carbon/human/source) + riposte_ready = TRUE + source.balloon_alert(source, "riposte ready") + +//---- Cosmic Passive +// Level 1 Cosmic fields will speed up the caster and provide stamina regen +// Level 2 Cosmic fields will disable any nearby bombs/TTVs/Syndicate Bombs +// Level 3 Cosmic fields will temporarily slow down bullets that pass through them +/datum/status_effect/heretic_passive/cosmic + name = "Chosen of the Stars" + id = "cosmic_passive" + passive_descriptions = list( + "Cosmic fields speed you up and regenerate stamina.", + "Cosmic fields disrupt grenades or signalers from being activated and turn off already primed grenades.", + "Cosmic fields slow projectiles down." + ) + +/datum/status_effect/heretic_passive/cosmic/tick(seconds_between_ticks) + . = ..() + if(locate(/obj/effect/forcefield/cosmic_field) in get_turf(owner)) + var/delta_time = DELTA_WORLD_TIME(SSmobs) * 0.5 // SSmobs.wait is 2 secs, so this should be halved. + owner.adjust_stamina_loss(-15 * delta_time, updating_stamina = FALSE) + +/** + * Creates a cosmic field at a given loc + * + * * Args: + * * `loc`: Where the cosmic field is created + * * Optional `creator`: Checks if the passed mob has a cosmic passive. Upgrades the cosmic field based on their passive level + * * Optional `type`: Makes a specific type of cosmic field if we don't want the default + */ +/proc/create_cosmic_field(loc, mob/living/creator, type = /obj/effect/forcefield/cosmic_field) + var/obj/effect/forcefield/cosmic_field/new_field + new_field = new type(loc) + + if(!creator || !ismob(creator)) + return + if(isstargazer(creator)) + new_field.slows_projectiles() + new_field.prevents_explosions() + return + var/datum/status_effect/heretic_passive/cosmic/cosmic_passive = creator.has_status_effect(/datum/status_effect/heretic_passive/cosmic) + if(!cosmic_passive) + return + if(cosmic_passive.passive_level > HERETIC_LEVEL_START) + new_field.prevents_explosions() + if(cosmic_passive.passive_level > HERETIC_LEVEL_UPGRADE) + new_field.slows_projectiles() + +//---- Flesh Passive +// Makes you never get disgust, virus immune and immune to damage from space ants +// Level 2, organs and raw meat heals you. You also become a voracious glutton who likes all food. No slowdown from being fat +// Level 3, being fat gives damage resistance +/datum/status_effect/heretic_passive/flesh + name = "Ravenous Hunger" + id = "flesh_passive" + passive_descriptions = list( + "Immunity to Diseases, Disgust and space ants.", + "Eating organs or meat now heals you, gain the voracious and gluttonous trait and being fat doesn't slow you down.", + "Gain a flat 25% damage and stamina damage reduction when fat as well as baton resistance." + ) + +/datum/status_effect/heretic_passive/flesh/on_apply() + . = ..() + owner.add_traits(list(TRAIT_VIRUSIMMUNE, TRAIT_SPACE_ANT_IMMUNITY), REF(src)) + +/datum/status_effect/heretic_passive/flesh/tick(seconds_between_ticks) + . = ..() + owner.set_disgust(0) + +/datum/status_effect/heretic_passive/flesh/heretic_level_upgrade() + . = ..() + RegisterSignal(owner, COMSIG_LIVING_EAT_FOOD, PROC_REF(on_eat)) + owner.add_traits(list(TRAIT_FAT_IGNORE_SLOWDOWN, TRAIT_VORACIOUS, TRAIT_GLUTTON), REF(src)) + if(!ishuman(owner)) + return + var/mob/living/carbon/human/fat_human = owner + fat_human.on_fat() // Make sure to update the movespeed modifier in case we gain the trait while already fat + var/obj/item/organ/tongue/tongue = fat_human.get_organ_slot(ORGAN_SLOT_TONGUE) + tongue.liked_foodtypes = ALL + tongue.disliked_foodtypes = NONE + tongue.toxic_foodtypes = NONE + +/// Any time you take a bite of something, if it's meat or an organ you will heal some damage +/datum/status_effect/heretic_passive/flesh/proc/on_eat(mob/eater, atom/food) + SIGNAL_HANDLER + var/obj/item/organ/consumed_organ = food + if(istype(consumed_organ) && consumed_organ.foodtype_flags & MEAT) + heal_glutton() // Heal the owner if they eat meat + return + var/obj/item/food/consumed_food = food + if(istype(consumed_food) && consumed_food.foodtypes & MEAT) + heal_glutton() // Heal the owner if they eat meat + +/datum/status_effect/heretic_passive/flesh/proc/heal_glutton() + var/healed_amount = owner.heal_overall_damage(2, 2, updating_health = FALSE) + healed_amount += owner.adjust_oxy_loss(-2, FALSE) + healed_amount += owner.adjust_tox_loss(-2, FALSE, TRUE) + owner.adjust_blood_volume(2.5) + if(!iscarbon(owner)) + return + var/mob/living/carbon/carbon_eater = owner + for(var/obj/item/bodypart/wounded_limb as anything in carbon_eater.bodyparts) + for(var/datum/wound/to_cure as anything in wounded_limb.wounds) + to_cure.remove_wound() + break + if(healed_amount > 0) + owner.updatehealth() + new /obj/effect/temp_visual/heal(get_turf(owner), COLOR_RED) + +/datum/status_effect/heretic_passive/flesh/heretic_level_final() + . = ..() + if(!ishuman(owner)) + return + var/mob/living/carbon/human/fat_human = owner + RegisterSignals(fat_human, list(SIGNAL_ADDTRAIT(TRAIT_FAT), SIGNAL_REMOVETRAIT(TRAIT_FAT)), PROC_REF(on_fat)) + on_fat() + +/// Gives/Removes damage resistance when we become/lose fatness +/datum/status_effect/heretic_passive/flesh/proc/on_fat(datum/source) + if(!ishuman(owner)) + return + var/mob/living/carbon/human/heretic = owner + if(HAS_TRAIT(heretic, TRAIT_FAT)) + heretic.physiology.damage_resistance += 25 + ADD_TRAIT(heretic, TRAIT_BATON_RESISTANCE, REF(src)) + else + heretic.physiology.damage_resistance -= 25 + REMOVE_TRAIT(heretic, TRAIT_BATON_RESISTANCE, REF(src)) + +/datum/status_effect/heretic_passive/flesh/on_remove() + . = ..() + owner.remove_traits(list(TRAIT_VIRUSIMMUNE, TRAIT_SPACE_ANT_IMMUNITY, TRAIT_FAT_IGNORE_SLOWDOWN, TRAIT_VORACIOUS, TRAIT_GLUTTON, TRAIT_BATON_RESISTANCE), REF(src)) + UnregisterSignal(owner, list(COMSIG_LIVING_EAT_FOOD, SIGNAL_ADDTRAIT(TRAIT_FAT), SIGNAL_REMOVETRAIT(TRAIT_FAT))) + if(!ishuman(owner)) + return + var/mob/living/carbon/human/heretic = owner + if(!HAS_TRAIT(heretic, TRAIT_FAT)) + return + heretic.physiology.damage_resistance -= 25 + heretic.on_fat() + +//---- Lock Passive +// On gain you can understand and speak every language +// Level 1 Shock immunity + Side knowledge is cheaper +// Level 2 Gains X-ray Vision +// Level 3 your grasp no longer goes on cooldown when opening things +/datum/status_effect/heretic_passive/lock + name = "Open Invitation" + id = "lock_passive" + passive_descriptions = list( + "Shock insulation, all knowledges researched from the shop are cheaper", + "X-ray vision, you can see through walls and objects.", + "Grasp no longer goes on cooldown when used to open a door or locker." + ) + +/datum/status_effect/heretic_passive/lock/on_apply() + . = ..() + ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, REF(src)) + RegisterSignal(heretic_datum, COMSIG_HERETIC_SHOP_SETUP, PROC_REF(on_shop_setup)) // Just in case we are applying this after the shop was set up + +/datum/status_effect/heretic_passive/lock/heretic_level_upgrade() + . = ..() + ADD_TRAIT(owner, TRAIT_XRAY_VISION, REF(src)) + owner.update_sight() + +/datum/status_effect/heretic_passive/lock/heretic_level_final() + . = ..() + ADD_TRAIT(owner, TRAIT_LOCK_GRASP_UPGRADED, REF(src)) + +/datum/status_effect/heretic_passive/lock/on_remove() + UnregisterSignal(owner, COMSIG_HERETIC_SHOP_SETUP) + owner.remove_traits(list(TRAIT_SHOCKIMMUNE, TRAIT_XRAY_VISION, TRAIT_LOCK_GRASP_UPGRADED), REF(src)) + owner.update_sight() + return ..() + +/datum/status_effect/heretic_passive/lock/proc/on_shop_setup(datum/antagonist/heretic/heretic_datum) + SIGNAL_HANDLER + var/list/shop = heretic_datum.heretic_shops[HERETIC_KNOWLEDGE_SHOP] + for(var/knowledge_type in shop) + var/list/heretic_info = shop[knowledge_type] + if(heretic_info) + heretic_info[HKT_COST] = max(1, heretic_info[HKT_COST] - 1) // Reduce cost by 1, minimum of 1 + +//---- Moon Passive +// Heals 5 brain damage per level +// Prevents brain trauma +// Level 2 grants sleep immunity +// Level 3, Mind gate + Ringleader's rise will channel the moon amulet effects +/datum/status_effect/heretic_passive/moon + name = "Do You Hear The Voices Too?" + id = "moon_passive" + passive_descriptions = list( + "Can no longer develop brain traumas, passively regenerates brain health, (this bonus is halved in combat).", + "Sleep immunity, increases the ratio at which your brain damage regenerates.", + "Mind gate and Ringleader's rise will channel the moon amulet effects, further inreases brain regeneration." + ) + /// Built-in moon amulet which channels through your spells + var/obj/item/clothing/neck/heretic_focus/moon_amulet/amulet + /// When were we last attacked? + var/last_attack = 0 + /// How long the combat tag lasts for + var/combat_lockout = 5 SECONDS + /// Boolean if you are wearing the moon amulet + var/amulet_equipped = FALSE + +/datum/status_effect/heretic_passive/moon/on_apply() + . = ..() + var/obj/item/organ/brain/our_brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN) + if(!our_brain) + return + ADD_TRAIT(our_brain, TRAIT_BRAIN_TRAUMA_IMMUNITY, REF(src)) + owner.AddElement(/datum/element/relay_attackers) + RegisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + +/// Saves world.time when we are attacked by anything +/datum/status_effect/heretic_passive/moon/proc/on_attacked(mob/victim, atom/attacker) + SIGNAL_HANDLER + last_attack = world.time + +/datum/status_effect/heretic_passive/moon/tick(seconds_between_ticks) + . = ..() + var/healing_amount = ((world.time > last_attack + combat_lockout) ? -1 * passive_level * seconds_between_ticks : -2 * passive_level * seconds_between_ticks) + if(heretic_datum.ascended) + healing_amount = -15 * seconds_between_ticks + if(!amulet_equipped) + healing_amount *= 0.5 // Half healing if you dont have the moon amulet + owner.adjust_organ_loss(ORGAN_SLOT_BRAIN, healing_amount) + + var/obj/item/organ/brain/our_brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN) + if(!our_brain) + return + for(var/datum/brain_trauma/trauma as anything in our_brain.traumas) + if(istype(trauma, BRAIN_TRAUMA_MILD) || istype(trauma, BRAIN_TRAUMA_SEVERE)) + our_brain.cure_trauma_type(trauma.type, trauma.resilience) + +/datum/status_effect/heretic_passive/moon/heretic_level_upgrade() + . = ..() + ADD_TRAIT(owner, TRAIT_SLEEPIMMUNE, REF(src)) + +/datum/status_effect/heretic_passive/moon/heretic_level_final() + . = ..() + amulet = new() + +/datum/status_effect/heretic_passive/moon/on_remove() + var/obj/item/organ/brain/our_brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN) + if(!our_brain) + return ..() + REMOVE_TRAIT(our_brain, TRAIT_BRAIN_TRAUMA_IMMUNITY, REF(src)) + REMOVE_TRAIT(owner, TRAIT_SLEEPIMMUNE, REF(src)) + UnregisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED) + QDEL_NULL(amulet) + return ..() + +//---- Rust Passive +// Level 2 and 3 will increase our rust strength +// Level 1 provides healing and baton resist when standing on rust +// Level 2 will heal wounds when standing on rust +// Level 3 will restore lost limbs when standing on rust +/datum/status_effect/heretic_passive/rust + name = "Leeching Walk" + id = "rust_passive" + passive_descriptions = list( + "Standing on Rusted tiles heals and purge chems off your body.", + "Standing on Rusted tiles closes up your wounds and heals your organs, you may now rust reinforced floors and walls, healing effect increased.", + "Standing on Rusted tiles regenerates your limbs, you may now rust titanium and plastitanium walls, healing effect increased." + ) + +/datum/status_effect/heretic_passive/rust/on_apply() + . = ..() + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + RegisterSignal(owner, COMSIG_LIVING_LIFE, PROC_REF(on_life)) + +/datum/status_effect/heretic_passive/rust/on_remove() + . = ..() + UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_LIVING_LIFE)) + +/datum/status_effect/heretic_passive/rust/heretic_level_upgrade() + . = ..() + if(heretic_datum.rust_strength < 2) + heretic_datum.increase_rust_strength() // Bring us up to 2 + +/datum/status_effect/heretic_passive/rust/heretic_level_final() + . = ..() + if(heretic_datum.rust_strength < 3) + heretic_datum.increase_rust_strength() // Bring us up to 3 + +/* + * Signal proc for [COMSIG_MOVABLE_MOVED]. + * + * Checks if we should have baton resistance on the new turf. + */ +/datum/status_effect/heretic_passive/rust/proc/on_move(mob/source, atom/old_loc, dir, forced, list/old_locs) + SIGNAL_HANDLER + + var/turf/mover_turf = get_turf(source) + if(HAS_TRAIT(mover_turf, TRAIT_RUSTY)) + ADD_TRAIT(source, TRAIT_BATON_RESISTANCE, REF(src)) + else + REMOVE_TRAIT(source, TRAIT_BATON_RESISTANCE, REF(src)) + +/** + * Signal proc for [COMSIG_LIVING_LIFE]. + * + * Gradually heals the heretic ([source]) on rust, + * including baton knockdown and stamina damage. + */ +/datum/status_effect/heretic_passive/rust/proc/on_life(mob/living/source, seconds_per_tick, times_fired) + SIGNAL_HANDLER + + var/turf/our_turf = get_turf(source) + if(!HAS_TRAIT(our_turf, TRAIT_RUSTY)) + return + + // Heals all damage + Stamina + var/need_mob_update = FALSE + var/delta_time = DELTA_WORLD_TIME(SSmobs) * 0.5 // SSmobs.wait is 2 secs, so this should be halved. + var/main_healing = 1 + 1 * passive_level * delta_time + var/stam_healing = 5 + 5 * passive_level * delta_time + need_mob_update += source.heal_overall_damage(-main_healing, -main_healing, updating_health = FALSE) + need_mob_update += source.adjust_stamina_loss(-stam_healing, updating_stamina = FALSE) + need_mob_update += source.adjust_tox_loss(-main_healing, updating_health = FALSE, forced = TRUE) // Slimes are people too + need_mob_update += source.adjust_oxy_loss(-main_healing, updating_health = FALSE) + if(need_mob_update) + source.updatehealth() + new /obj/effect/temp_visual/heal(get_turf(owner), COLOR_BROWN) + // Reduces duration of stuns/etc + var/stun_reduction = 0.5 * passive_level * delta_time + source.AdjustAllImmobility(-stun_reduction) + // Heals blood loss + source.adjust_blood_volume(2.5 * delta_time, maximum = BLOOD_VOLUME_NORMAL) + for(var/datum/reagent/reagent as anything in source.reagents.reagent_list) + source.reagents.remove_reagent(reagent.type, 2 * reagent.purge_multiplier * REM * seconds_per_tick) + + if(!iscarbon(source)) + return + var/mob/living/carbon/carbon_owner = source + if(passive_level < HERETIC_LEVEL_UPGRADE) + return + for(var/obj/item/bodypart/wounded_limb as anything in carbon_owner.bodyparts) + for(var/datum/wound/to_cure as anything in wounded_limb.wounds) + to_cure.remove_wound() + for(var/obj/item/organ/internal as anything in carbon_owner.organs) + internal.apply_organ_damage(round(-2 * seconds_per_tick)) + if(passive_level < HERETIC_LEVEL_FINAL) + return + if(length(carbon_owner.get_missing_limbs())) + carbon_owner.regenerate_limbs() + +//---- Void Passive +// Level 1 Cold and Low pressure resist +// Level 2 No breathe +// Level 3 No slip on water/ice +/datum/status_effect/heretic_passive/void + name = "Aristocrat's Way" + id = "void_passive" + passive_descriptions = list( + "Cold and low pressure immunity.", + "You no longer need to breathe.", + "Water, ice and slippery surfaces no slip you." + ) + +/datum/status_effect/heretic_passive/void/on_apply() + . = ..() + owner.add_traits(list(TRAIT_RESISTCOLD, TRAIT_RESISTLOWPRESSURE), REF(src)) + +/datum/status_effect/heretic_passive/void/heretic_level_upgrade() + . = ..() + ADD_TRAIT(owner, TRAIT_NOBREATH, REF(src)) + +/datum/status_effect/heretic_passive/void/heretic_level_final() + . = ..() + owner.add_traits(list(TRAIT_NO_SLIP_WATER, TRAIT_NO_SLIP_ICE, TRAIT_NO_SLIP_SLIDE), REF(src)) + +/datum/status_effect/heretic_passive/void/on_remove() + . = ..() + owner.remove_traits(list(TRAIT_RESISTCOLD, TRAIT_RESISTLOWPRESSURE, TRAIT_NOBREATH, TRAIT_NO_SLIP_WATER, TRAIT_NO_SLIP_ICE, TRAIT_NO_SLIP_SLIDE), REF(src)) + +#undef HERETIC_LEVEL_START +#undef HERETIC_LEVEL_UPGRADE +#undef HERETIC_LEVEL_FINAL diff --git a/code/modules/antagonists/heretic/status_effects/mark_effects.dm b/code/modules/antagonists/heretic/status_effects/mark_effects.dm index 3069eb9b19d7..465ad530d24e 100644 --- a/code/modules/antagonists/heretic/status_effects/mark_effects.dm +++ b/code/modules/antagonists/heretic/status_effects/mark_effects.dm @@ -83,8 +83,8 @@ /datum/status_effect/eldritch/ash/on_effect() if(iscarbon(owner)) var/mob/living/carbon/carbon_owner = owner - carbon_owner.adjustStaminaLoss(6 * repetitions) // first one = 30 stam - carbon_owner.adjustFireLoss(3 * repetitions) // first one = 15 burn + carbon_owner.adjust_stamina_loss(6 * repetitions) // first one = 30 stam + carbon_owner.adjust_fire_loss(3 * repetitions) // first one = 15 burn for(var/mob/living/carbon/victim in shuffle(range(1, carbon_owner))) if(IS_HERETIC(victim) || victim == carbon_owner) continue @@ -220,7 +220,7 @@ /datum/status_effect/eldritch/cosmic/on_effect() new teleport_effect(get_turf(owner)) - new /obj/effect/forcefield/cosmic_field(get_turf(owner)) + create_cosmic_field(get_turf(owner), owner) do_teleport( owner, get_turf(cosmic_diamond), @@ -258,12 +258,12 @@ /datum/status_effect/eldritch/moon/on_apply() . = ..() - if(owner.can_block_magic(MAGIC_RESISTANCE_MIND)) + if(owner.can_block_magic(MAGIC_RESISTANCE_MOON)) return FALSE ADD_TRAIT(owner, TRAIT_PACIFISM, TRAIT_STATUS_EFFECT(id)) owner.emote(pick("giggle", "laugh")) owner.balloon_alert(owner, "you feel unable to hurt a soul!") - RegisterSignal (owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) + RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) return TRUE /// Checks for damage so the heretic can't just attack them with another weapon whilst they are unable to fight back @@ -285,14 +285,14 @@ /datum/status_effect/eldritch/moon/on_effect() owner.adjust_confusion(30 SECONDS) - owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 25, 160) + owner.adjust_organ_loss(ORGAN_SLOT_BRAIN, 25, 160) owner.emote(pick("giggle", "laugh")) owner.add_mood_event("Moon Insanity", /datum/mood_event/moon_insanity) return ..() /datum/status_effect/eldritch/moon/on_remove() . = ..() - UnregisterSignal (owner, COMSIG_MOB_APPLY_DAMAGE) + UnregisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE) // In case the trait was not removed earlier REMOVE_TRAIT(owner, TRAIT_PACIFISM, TRAIT_STATUS_EFFECT(id)) diff --git a/code/modules/antagonists/heretic/status_effects/void_chill.dm b/code/modules/antagonists/heretic/status_effects/void_chill.dm index ce302e21c3a3..f457a4040ff2 100644 --- a/code/modules/antagonists/heretic/status_effects/void_chill.dm +++ b/code/modules/antagonists/heretic/status_effects/void_chill.dm @@ -26,6 +26,8 @@ /datum/status_effect/void_chill/on_apply() if(issilicon(owner)) return FALSE + if(IS_HERETIC_OR_MONSTER(owner)) + return FALSE return TRUE /datum/status_effect/void_chill/on_remove() @@ -94,15 +96,16 @@ /atom/movable/screen/alert/status_effect/void_chill name = "Void Chill" desc = "There's something freezing you from within and without. You've never felt cold this oppressive before..." - icon_state = "void_chill_minor" + icon_state = "heretic_template" + overlay_state = "void_chill_minor" -/atom/movable/screen/alert/status_effect/void_chill/update_icon_state() - . = ..() +/atom/movable/screen/alert/status_effect/void_chill/update_overlays() if(!istype(attached_effect, /datum/status_effect/void_chill)) - return + return ..() var/datum/status_effect/void_chill/chill_effect = attached_effect if(chill_effect.stacks >= 5) - icon_state = "void_chill_oh_fuck" + overlay_state = "void_chill_oh_fuck" + return ..() /atom/movable/screen/alert/status_effect/void_chill/update_desc(updates) . = ..() diff --git a/code/modules/antagonists/heretic/structures/carving_knife.dm b/code/modules/antagonists/heretic/structures/carving_knife.dm index 289b1784c4d7..3c3e51439d5f 100644 --- a/code/modules/antagonists/heretic/structures/carving_knife.dm +++ b/code/modules/antagonists/heretic/structures/carving_knife.dm @@ -239,7 +239,7 @@ if(!iscarbon(victim)) return var/mob/living/carbon/carbon_victim = victim - carbon_victim.adjustStaminaLoss(80) + carbon_victim.adjust_stamina_loss(80) carbon_victim.adjust_silence(20 SECONDS) carbon_victim.adjust_stutter(1 MINUTES) carbon_victim.adjust_confusion(5 SECONDS) diff --git a/code/modules/antagonists/heretic/structures/mawed_crucible.dm b/code/modules/antagonists/heretic/structures/mawed_crucible.dm index fa2199362ce0..51fe408dfefe 100644 --- a/code/modules/antagonists/heretic/structures/mawed_crucible.dm +++ b/code/modules/antagonists/heretic/structures/mawed_crucible.dm @@ -78,6 +78,25 @@ return /obj/structure/destructible/eldritch_crucible/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/codex_cicatrix) || istype(tool, /obj/item/melee/touch_attack/mansus_fist)) + playsound(src, 'sound/items/deconstruct.ogg', 30, TRUE, ignore_walls = FALSE) + set_anchored(!anchored) + balloon_alert(user, "[anchored ? "":"un"]anchored") + return ITEM_INTERACT_SUCCESS + if(istype(tool, /obj/item/reagent_containers/cup/beaker/eldritch)) + if(current_mass < max_mass) + balloon_alert(user, "not full enough!") + return ITEM_INTERACT_SUCCESS + var/obj/item/reagent_containers/cup/beaker/eldritch/to_fill = tool + if(to_fill.reagents.total_volume >= to_fill.reagents.maximum_volume) + balloon_alert(user, "flask is full!") + return ITEM_INTERACT_SUCCESS + to_fill.reagents.add_reagent(/datum/reagent/eldritch, 50) + do_item_attack_animation(src, used_item = tool, animation_type = ATTACK_ANIMATION_BLUNT) + current_mass-- + balloon_alert(user, "refilled flask") + return ITEM_INTERACT_SUCCESS + if(isbodypart(tool)) var/obj/item/bodypart/consumed = tool if(!IS_ORGANIC_LIMB(consumed)) @@ -109,26 +128,6 @@ return NONE -/obj/structure/destructible/eldritch_crucible/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(istype(tool, /obj/item/codex_cicatrix) || istype(tool, /obj/item/melee/touch_attack/mansus_fist)) - playsound(src, 'sound/items/deconstruct.ogg', 30, TRUE, ignore_walls = FALSE) - set_anchored(!anchored) - balloon_alert(user, "[anchored ? "":"un"]anchored") - return ITEM_INTERACT_SUCCESS - if(istype(tool, /obj/item/reagent_containers/cup/beaker/eldritch)) - if(current_mass < max_mass) - balloon_alert(user, "not full enough!") - return ITEM_INTERACT_SUCCESS - var/obj/item/reagent_containers/cup/beaker/eldritch/to_fill = tool - if(to_fill.reagents.total_volume >= to_fill.reagents.maximum_volume) - balloon_alert(user, "flask is full!") - return ITEM_INTERACT_SUCCESS - to_fill.reagents.add_reagent(/datum/reagent/eldritch, 50) - do_item_attack_animation(src, used_item = tool, animation_type = ATTACK_ANIMATION_BLUNT) - current_mass-- - balloon_alert(user, "refilled flask") - return ITEM_INTERACT_SUCCESS - /obj/structure/destructible/eldritch_crucible/attack_hand(mob/user, list/modifiers) . = ..() if(.) @@ -253,6 +252,8 @@ var/crucible_tip = "Doesn't do anything." /// Typepath to the status effect this applies var/status_effect + /// If you can drink the same potion while the effect is active + var/can_refresh = TRUE /obj/item/eldritch_potion/examine(mob/user) . = ..() @@ -269,6 +270,9 @@ if(!iscarbon(user)) return + if(!can_refresh && user.has_status_effect(status_effect)) + return + playsound(src, 'sound/effects/bubbles/bubbles.ogg', 50, TRUE) if(!IS_HERETIC_OR_MONSTER(user)) @@ -297,7 +301,14 @@ desc = "A glass bottle containing a bright orange, translucent liquid." icon_state = "crucible_soul" status_effect = /datum/status_effect/crucible_soul - crucible_tip = "Allows you to walk through walls. After expiring, you are teleported to your original location. Lasts 15 seconds." + crucible_tip = "Allows you to walk through walls. After expiring, you are teleported to your original location. Lasts 40 seconds." + can_refresh = FALSE + +/obj/item/eldritch_potion/crucible_soul/attack_self(mob/user) + if(user.has_status_effect(/datum/status_effect/crucible_soul_cooldown)) + balloon_alert(user, "on cooldown!") + return TRUE + return ..() /obj/item/eldritch_potion/duskndawn name = "brew of dusk and dawn" diff --git a/code/modules/antagonists/heretic/transmutation_rune.dm b/code/modules/antagonists/heretic/transmutation_rune.dm index 7caa7fcb73a2..b786991e5f4e 100644 --- a/code/modules/antagonists/heretic/transmutation_rune.dm +++ b/code/modules/antagonists/heretic/transmutation_rune.dm @@ -189,7 +189,7 @@ // This doesn't necessarily mean the ritual will succeed, but it's valid! // Do the animations and associated feedback. flick("[icon_state]_active", src) - playsound(user, 'sound/effects/magic/castsummon.ogg', 75, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_exponent = 10) + playsound(user, 'sound/effects/magic/castsummon.ogg', 50, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_exponent = 10, ignore_walls = FALSE) // - We temporarily make all of our chosen atoms invisible, as some rituals may sleep, // and we don't want people to be able to run off with ritual items. diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm index 5d381f623bde..d197f91f5732 100644 --- a/code/modules/antagonists/highlander/highlander.dm +++ b/code/modules/antagonists/highlander/highlander.dm @@ -8,12 +8,13 @@ antag_flags = ANTAG_FAKE|ANTAG_SKIP_GLOBAL_LIST /// Traits we apply/remove to our target on-demand. var/static/list/applicable_traits = list( + TRAIT_DESENSITIZED, TRAIT_NOBREATH, TRAIT_NODISMEMBER, TRAIT_NOFIRE, TRAIT_NOGUNS, - TRAIT_TOSS_GUN_HARD, TRAIT_SHOCKIMMUNE, + TRAIT_TOSS_GUN_HARD, ) /datum/antagonist/highlander/apply_innate_effects(mob/living/mob_override) diff --git a/code/modules/antagonists/malf_ai/malf_ai.dm b/code/modules/antagonists/malf_ai/malf_ai.dm index f448670eedad..d35a00f8b7cc 100644 --- a/code/modules/antagonists/malf_ai/malf_ai.dm +++ b/code/modules/antagonists/malf_ai/malf_ai.dm @@ -40,7 +40,6 @@ malfunction_flavor = strings(MALFUNCTION_FLAVOR_FILE, employer) add_law_zero() - RegisterSignal(owner.current, COMSIG_SILICON_AI_CORE_STATUS, PROC_REF(core_status)) if(malf_sound) owner.current.playsound_local(get_turf(owner.current), malf_sound, 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) owner.current.grant_language(/datum/language/codespeak, source = LANGUAGE_MALF) @@ -57,7 +56,6 @@ malf_ai.remove_malf_abilities() QDEL_NULL(malf_ai.malf_picker) - UnregisterSignal(owner, COMSIG_SILICON_AI_CORE_STATUS) return ..() /// Generates a complete set of malf AI objectives up to the traitor objective limit. @@ -271,14 +269,6 @@ return malf_ai_icon -/datum/antagonist/malf_ai/proc/core_status(datum/source) - SIGNAL_HANDLER - - var/mob/living/silicon/ai/malf_owner = owner.current - if(malf_owner?.linked_core) - return COMPONENT_CORE_ALL_GOOD - return COMPONENT_CORE_DISCONNECTED - //Subtype of Malf AI datum, used for one of the traitor final objectives /datum/antagonist/malf_ai/infected name = "Infected AI" diff --git a/code/modules/antagonists/malf_ai/malf_ai_modules.dm b/code/modules/antagonists/malf_ai/malf_ai_modules.dm index f5425593eff3..f2c6eb49eda5 100644 --- a/code/modules/antagonists/malf_ai/malf_ai_modules.dm +++ b/code/modules/antagonists/malf_ai/malf_ai_modules.dm @@ -158,13 +158,13 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) Obtaining control of the weapon will be easier if Head of Staff office APCs are already under your control." cost = 130 one_purchase = TRUE - minimum_apcs = 15 // So you cant speedrun delta + minimum_apcs = 10 // So you cant speedrun delta power_type = /datum/action/innate/ai/nuke_station unlock_text = span_notice("You slowly, carefully, establish a connection with the on-station self-destruct. You can now activate it at any time.") ///List of areas that grant discounts. "heads_quarters" will match any head of staff office. var/list/discount_areas = list( /area/station/command/heads_quarters, - /area/station/ai_monitored/command/nuke_storage + /area/station/command/vault ) ///List of hacked head of staff office areas. Includes the vault too. Provides a 20 PT discount per (Min 50 PT cost) var/list/hacked_command_areas = list() @@ -505,10 +505,11 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) cooldown_period = 10 SECONDS /datum/action/innate/ai/destroy_rcds/Activate() - for(var/I in GLOB.rcd_list) - if(!istype(I, /obj/item/construction/rcd/borg)) //Ensures that cyborg RCDs are spared. - var/obj/item/construction/rcd/RCD = I - RCD.detonate_pulse() + for(var/potential_rcd in GLOB.rcd_list) + if(istype(potential_rcd, /obj/item/construction/rcd/borg)) //Ensures that cyborg RCDs are spared. + continue + var/obj/item/construction/rcd/definite_rcd = potential_rcd + definite_rcd.detonate_pulse() to_chat(owner, span_danger("RCD detonation pulse emitted.")) owner.playsound_local(owner, 'sound/machines/beep/twobeep.ogg', 50, 0) @@ -630,11 +631,13 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) continue found_intercom.audible_message(message = "[found_intercom] crackles for a split second.", hearing_distance = 3) playsound(found_intercom, 'sound/items/airhorn/airhorn.ogg', 100, TRUE) - for(var/mob/living/carbon/honk_victim in ohearers(6, found_intercom)) + for(var/mob/living/honk_victim in ohearers(6, found_intercom)) + if(issilicon(honk_victim)) + continue var/turf/victim_turf = get_turf(honk_victim) if(isspaceturf(victim_turf) && !victim_turf.Adjacent(found_intercom)) //Prevents getting honked in space continue - if(honk_victim.soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 30, deafen_pwr = 60)) //Ear protection will prevent these effects + if(honk_victim.soundbang_act(SOUNDBANG_NORMAL, stun_pwr = 20, damage_pwr = 30, deafen_pwr = 60)) //Ear protection will prevent these effects honk_victim.set_jitter_if_lower(120 SECONDS) to_chat(honk_victim, span_clown("HOOOOONK!")) @@ -697,8 +700,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) var/turf/T = turfs[n] if(!isfloorturf(T)) success = FALSE - var/datum/camerachunk/C = GLOB.cameranet.getCameraChunk(T.x, T.y, T.z) - if(!C.visibleTurfs[T]) + if(!SScameras.is_visible_by_cameras(T)) alert_msg = "You don't have camera vision of this location!" success = FALSE for(var/atom/movable/AM in T.contents) @@ -823,7 +825,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) /datum/action/innate/ai/reactivate_cameras/Activate() var/fixed_cameras = 0 - for(var/obj/machinery/camera/C as anything in GLOB.cameranet.cameras) + for(var/obj/machinery/camera/C as anything in SScameras.cameras) if(!uses) break if(!C.camera_enabled || C.view_range != initial(C.view_range)) @@ -855,13 +857,12 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) AI.update_sight() var/upgraded_cameras = 0 - for(var/obj/machinery/camera/camera as anything in GLOB.cameranet.cameras) + for(var/obj/machinery/camera/camera as anything in SScameras.cameras) var/upgraded = FALSE if(!camera.isXRay()) camera.upgradeXRay(TRUE) //if this is removed you can get rid of camera_assembly/var/malf_xray_firmware_active and clean up isxray() //Update what it can see. - GLOB.cameranet.updateVisibility(camera, 0) upgraded = TRUE if(!camera.isEmpProof()) @@ -888,7 +889,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) /datum/ai_module/malf/upgrade/upgrade_turrets/upgrade(mob/living/silicon/ai/AI) 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_ALL) + turret.AddElement(/datum/element/empprotection, EMP_PROTECT_ALL|EMP_NO_EXAMINE) turret.max_integrity = 200 turret.repair_damage(200) turret.lethal_projectile = /obj/projectile/beam/laser/heavylaser //Once you see it, you will know what it means to FEAR. diff --git a/code/modules/antagonists/nightmare/nightmare.dm b/code/modules/antagonists/nightmare/nightmare.dm index 6b9aeb60549a..a6157b8f27df 100644 --- a/code/modules/antagonists/nightmare/nightmare.dm +++ b/code/modules/antagonists/nightmare/nightmare.dm @@ -17,6 +17,14 @@ forge_objectives() . = ..() +/datum/antagonist/nightmare/apply_innate_effects(mob/living/mob_override) + var/mob/living/nightmare = mob_override || owner.current + nightmare.mob_mood.mood_modifier -= 1 + +/datum/antagonist/nightmare/remove_innate_effects(mob/living/mob_override) + var/mob/living/nightmare = mob_override || owner.current + nightmare.mob_mood.mood_modifier += 1 + /datum/outfit/nightmare name = "Nightmare (Preview only)" diff --git a/code/modules/antagonists/nightmare/nightmare_organs.dm b/code/modules/antagonists/nightmare/nightmare_organs.dm index f3972d2e31c9..92139f73c226 100644 --- a/code/modules/antagonists/nightmare/nightmare_organs.dm +++ b/code/modules/antagonists/nightmare/nightmare_organs.dm @@ -8,6 +8,7 @@ desc = "A fleshy growth that was dug out of the skull of a Nightmare." icon = 'icons/obj/medical/organs/organs.dmi' icon_state = "brain-x-d" + shade_color = "black, somehow" ///Our associated shadow jaunt spell, for all nightmares var/datum/action/cooldown/spell/jaunt/shadow_walk/our_jaunt diff --git a/code/modules/antagonists/ninja/energy_katana.dm b/code/modules/antagonists/ninja/energy_katana.dm index 1182bd568734..a03dfa66fd9c 100644 --- a/code/modules/antagonists/ninja/energy_katana.dm +++ b/code/modules/antagonists/ninja/energy_katana.dm @@ -88,7 +88,7 @@ var/obj/item/sword = target if(length(line) <= 1 || !teleport(user, line[length(line) - 1])) // teleports to the second last turf, should be adjacent to the target return - if(!user.CanReach(stabbing, target)) + if(!stabbing.IsReachableBy(user, sword?.reach)) return sword.melee_attack_chain(user, stabbing) if(prob(5) && check_holidays(APRIL_FOOLS)) diff --git a/code/modules/antagonists/ninja/energy_net_nets.dm b/code/modules/antagonists/ninja/energy_net_nets.dm index 5f08762b3413..8d4b37cc0add 100644 --- a/code/modules/antagonists/ninja/energy_net_nets.dm +++ b/code/modules/antagonists/ninja/energy_net_nets.dm @@ -27,6 +27,7 @@ underlay.layer = BELOW_MOB_LAYER SET_PLANE_EXPLICIT(underlay, GAME_PLANE, src) add_overlay(underlay) + ADD_TRAIT(src, TRAIT_DANGEROUS_BUCKLE, INNATE_TRAIT) /obj/structure/energy_net/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0) if(damage_type == BRUTE || damage_type == BURN) diff --git a/code/modules/antagonists/nukeop/datums/operative.dm b/code/modules/antagonists/nukeop/datums/operative.dm index 0279a12939dd..6c56cfa826b8 100644 --- a/code/modules/antagonists/nukeop/datums/operative.dm +++ b/code/modules/antagonists/nukeop/datums/operative.dm @@ -40,6 +40,7 @@ /datum/antagonist/nukeop/on_gain() give_alias() forge_objectives() + owner.current.add_personality(/datum/personality/callous) . = ..() owner.set_assigned_role(SSjob.get_job_type(job_type)) equip_op() @@ -129,6 +130,7 @@ var/mob/living/carbon/human/operative = owner.current ADD_TRAIT(operative, TRAIT_NOFEAR_HOLDUPS, INNATE_TRAIT) + ADD_TRAIT(operative, TRAIT_DESENSITIZED, INNATE_TRAIT) 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 diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm index 490b598289c4..0f7dc33bc6fd 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm @@ -112,7 +112,7 @@ /obj/item/disk/nuclear/proc/manual_suicide(mob/living/user) user.remove_atom_colour(ADMIN_COLOUR_PRIORITY) user.visible_message(span_suicide("[user] is destroyed by the nuclear blast!")) - user.adjustOxyLoss(200) + user.adjust_oxy_loss(200) user.death(FALSE) /obj/item/disk/nuclear/fake diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index 758fcbb7d6a9..b54a3540307d 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -102,7 +102,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) var/datum/techweb/station_techweb = locate(/datum/techweb/science) in SSresearch.techwebs if(station_techweb) - var/obj/machinery/announcement_system/announcement_system = get_announcement_system() + var/obj/machinery/announcement_system/announcement_system = get_announcement_system(null, null, list(RADIO_CHANNEL_SCIENCE)) if (!isnull(announcement_system)) announcement_system.broadcast("Additional research data received from Nanotrasen R&D Division following the emergency protocol.", list(RADIO_CHANNEL_SCIENCE), TRUE) station_techweb.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS * 3)) diff --git a/code/modules/antagonists/paradox_clone/paradox_clone.dm b/code/modules/antagonists/paradox_clone/paradox_clone.dm index d009d9b5d481..18631c512375 100644 --- a/code/modules/antagonists/paradox_clone/paradox_clone.dm +++ b/code/modules/antagonists/paradox_clone/paradox_clone.dm @@ -50,9 +50,8 @@ //dont want anyone noticing there's two now var/mob/living/carbon/human/clone_human = owner.current var/obj/item/clothing/under/sensor_clothes = clone_human.w_uniform - if(sensor_clothes) - sensor_clothes.sensor_mode = SENSOR_OFF - clone_human.update_suit_sensors() + if(istype(sensor_clothes)) + sensor_clothes.set_sensor_mode(SENSOR_OFF) // Perform a quick copy of existing memories. // This may result in some minutely imperfect memories, but it'll do diff --git a/code/modules/antagonists/pirate/pirate.dm b/code/modules/antagonists/pirate/pirate.dm index 63fd6a313070..7b09a2540ecb 100644 --- a/code/modules/antagonists/pirate/pirate.dm +++ b/code/modules/antagonists/pirate/pirate.dm @@ -12,7 +12,7 @@ /datum/antagonist/pirate/greet() . = ..() - to_chat(owner, "The station refused to pay for your protection. Protect the ship, siphon the credits from the station, and raid it for even more loot.") + to_chat(owner, "The station refused to pay for your protection. Protect the ship, siphon the [MONEY_NAME] from the station, and raid it for even more loot.") owner.announce_objectives() /datum/antagonist/pirate/get_team() @@ -46,11 +46,12 @@ var/datum/language_holder/holder = owner_mob.get_language_holder() holder.grant_language(/datum/language/piratespeak, source = LANGUAGE_PIRATE) holder.selected_language = /datum/language/piratespeak + ADD_TRAIT(owner_mob, TRAIT_DESENSITIZED, REF(src)) /datum/antagonist/pirate/remove_innate_effects(mob/living/mob_override) var/mob/living/owner_mob = mob_override || owner.current - if (owner_mob) - owner_mob.remove_language(/datum/language/piratespeak, source = LANGUAGE_PIRATE) + owner_mob.remove_language(/datum/language/piratespeak, source = LANGUAGE_PIRATE) + REMOVE_TRAIT(owner_mob, TRAIT_DESENSITIZED, REF(src)) /datum/team/pirate name = "\improper Pirate crew" @@ -80,7 +81,7 @@ /datum/objective/loot/update_explanation_text() if(cargo_hold) var/area/storage_area = get_area(cargo_hold) - explanation_text = "Acquire loot and store [target_value] of credits worth in [storage_area.name] cargo hold." + explanation_text = "Acquire loot and store [target_value] of [MONEY_NAME] worth in [storage_area.name] cargo hold." /datum/objective/loot/proc/loot_listing() //Lists notable loot. @@ -116,7 +117,7 @@ parts += "Loot stolen: " var/datum/objective/loot/L = locate() in objectives parts += L.loot_listing() - parts += "Total loot value : [L.get_loot_value()]/[L.target_value] credits" + parts += "Total loot value : [L.get_loot_value()]/[L.target_value] [MONEY_NAME]" if(L.check_completion() && !all_dead) parts += "The pirate crew was successful!" diff --git a/code/modules/antagonists/pirate/pirate_outfits.dm b/code/modules/antagonists/pirate/pirate_outfits.dm index 8976e212c547..5b75e046199f 100644 --- a/code/modules/antagonists/pirate/pirate_outfits.dm +++ b/code/modules/antagonists/pirate/pirate_outfits.dm @@ -25,10 +25,9 @@ outfit_id.update_icon() var/obj/item/clothing/under/pirate_uniform = equipped.w_uniform - if(pirate_uniform) - pirate_uniform.has_sensor = NO_SENSORS - pirate_uniform.sensor_mode = SENSOR_OFF - equipped.update_suit_sensors() + if(istype(pirate_uniform)) + pirate_uniform.set_has_sensor(NO_SENSORS) + pirate_uniform.set_sensor_mode(SENSOR_OFF) /datum/outfit/pirate/captain name = "Space Pirate Captain" @@ -59,7 +58,17 @@ /datum/outfit/pirate/space/captain/cardboard name = "Space Pirate Captain (EVA)" - l_hand = /obj/item/nullrod/claymore/saber/pirate + l_hand = /obj/item/fake_e_cutlass + +/obj/item/fake_e_cutlass + name = "fake energy cutlass" + desc = "Damn, son, where'd you find this? (Tell a coder if you do)" + icon = 'icons/obj/weapons/transforming_energy.dmi' + icon_state = "e_cutlass_on" + inhand_icon_state = "e_cutlass_on" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + item_flags = ABSTRACT /datum/outfit/pirate/silverscale name = "Silver Scale Member" diff --git a/code/modules/antagonists/pirate/pirate_roles.dm b/code/modules/antagonists/pirate/pirate_roles.dm index bbde9ea0befb..d5998c7d29a8 100644 --- a/code/modules/antagonists/pirate/pirate_roles.dm +++ b/code/modules/antagonists/pirate/pirate_roles.dm @@ -14,6 +14,7 @@ you_are_text = "You are a space pirate." flavour_text = "The station refused to pay for your protection. Protect the ship, siphon the credits from the station, and raid it for even more loot." spawner_job_path = /datum/job/space_pirate + allow_custom_character = GHOSTROLE_TAKE_PREFS_APPEARANCE ///Rank of the pirate on the ship, it's used in generating pirate names! var/rank = "Deserter" ///Path of the structure we spawn after creating a pirate. @@ -25,7 +26,7 @@ ///json key to pirate names, the last part ("fish" in "Cometfish") var/name_endings = "generic_endings" -/obj/effect/mob_spawn/ghost_role/human/pirate/special(mob/living/spawned_mob, mob/mob_possessor) +/obj/effect/mob_spawn/ghost_role/human/pirate/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs) . = ..() spawned_mob.fully_replace_character_name(spawned_mob.real_name, generate_pirate_name(spawned_mob.gender)) spawned_mob.mind.add_antag_datum(/datum/antagonist/pirate) @@ -35,7 +36,7 @@ var/endings = strings(PIRATE_NAMES_FILE, name_endings) return "[rank ? rank + " " : ""][pick(beggings)][pick(endings)]" -/obj/effect/mob_spawn/ghost_role/human/pirate/create(mob/mob_possessor, newname) +/obj/effect/mob_spawn/ghost_role/human/pirate/create(mob/mob_possessor, newname, apply_prefs) if(fluff_spawn) new fluff_spawn(drop_location()) return ..() @@ -58,6 +59,7 @@ outfit = /datum/outfit/pirate rank = "Mate" fluff_spawn = null + allow_custom_character = NONE /obj/effect/mob_spawn/ghost_role/human/pirate/skeleton/captain rank = "Captain" @@ -75,6 +77,7 @@ mob_species = /datum/species/lizard/silverscale outfit = /datum/outfit/pirate/silverscale rank = "High-born" + allow_custom_character = NONE /obj/effect/mob_spawn/ghost_role/human/pirate/silverscale/generate_pirate_name(spawn_gender) var/first_name @@ -184,6 +187,7 @@ mob_species = /datum/species/ethereal/lustrous outfit = /datum/outfit/pirate/lustrous rank = "Scintillant" + allow_custom_character = NONE /obj/effect/mob_spawn/ghost_role/human/pirate/lustrous/captain rank = "Radiant" @@ -205,7 +209,7 @@ outfit = /datum/outfit/pirate/medieval rank = "Footsoldier" -/obj/effect/mob_spawn/ghost_role/human/pirate/medieval/special(mob/living/carbon/spawned_mob) +/obj/effect/mob_spawn/ghost_role/human/pirate/medieval/special(mob/living/carbon/spawned_mob, mob/mob_possessor, apply_prefs) . = ..() if(rank == "Footsoldier") spawned_mob.add_traits(list(TRAIT_NOGUNS, TRAIT_TOSS_GUN_HARD), INNATE_TRAIT) @@ -217,7 +221,7 @@ rank = "Warlord" outfit = /datum/outfit/pirate/medieval/warlord -/obj/effect/mob_spawn/ghost_role/human/pirate/medieval/warlord/special(mob/living/carbon/spawned_mob) +/obj/effect/mob_spawn/ghost_role/human/pirate/medieval/warlord/special(mob/living/carbon/spawned_mob, mob/mob_possessor, apply_prefs) . = ..() spawned_mob.dna.add_mutation(/datum/mutation/hulk/superhuman, MUTATION_SOURCE_GHOST_ROLE) spawned_mob.dna.add_mutation(/datum/mutation/gigantism, MUTATION_SOURCE_GHOST_ROLE) diff --git a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm index 51a7a5d055a0..0f980c5e1d28 100644 --- a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm +++ b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm @@ -65,7 +65,7 @@ /obj/machinery/shuttle_scrambler/proc/dump_loot(mob/user) if(credits_stored) // Prevents spamming empty holochips new /obj/item/holochip(drop_location(), credits_stored) - to_chat(user,span_notice("You retrieve the siphoned credits!")) + to_chat(user,span_notice("You retrieve the siphoned [MONEY_NAME]!")) credits_stored = 0 else to_chat(user,span_notice("There's nothing to withdraw.")) @@ -143,8 +143,6 @@ /// Looks across the station for items that are pirate specific exports /obj/machinery/loot_locator/proc/find_random_loot() - if(!GLOB.exports_list.len) - setupExports() var/list/possible_loot = list() for(var/datum/export/pirate/possible_export in GLOB.exports_list) possible_loot += possible_export @@ -160,15 +158,15 @@ 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/lobotomy/mechanic, - /datum/surgery/advanced/bioware/vein_threading, - /datum/surgery/advanced/bioware/vein_threading/mechanic, - /datum/surgery/advanced/bioware/nerve_splicing, - /datum/surgery/advanced/bioware/nerve_splicing/mechanic, - /datum/surgery_step/heal/combo/upgraded, - /datum/surgery_step/pacify, - /datum/surgery_step/pacify/mechanic, + /datum/surgery_operation/organ/lobotomy, + /datum/surgery_operation/organ/lobotomy/mechanic, + /datum/surgery_operation/limb/bioware/vein_threading, + /datum/surgery_operation/limb/bioware/vein_threading/mechanic, + /datum/surgery_operation/limb/bioware/nerve_splicing, + /datum/surgery_operation/limb/bioware/nerve_splicing/mechanic, + /datum/surgery_operation/basic/tend_wounds/combo/upgraded, + /datum/surgery_operation/organ/pacify, + /datum/surgery_operation/organ/pacify/mechanic, ) //Pad & Pad Terminal @@ -402,6 +400,7 @@ deltimer(sending_timer) /datum/export/pirate + abstract_type = /datum/export/pirate sales_market = EXPORT_MARKET_PIRACY /// Attempts to find the thing on station @@ -421,8 +420,7 @@ if(head_mobs.len) return pick(head_mobs) -/datum/export/pirate/ransom/get_cost(atom/movable/exported_item) - var/mob/living/carbon/human/ransomee = exported_item +/datum/export/pirate/ransom/get_base_cost(mob/living/carbon/human/ransomee) if(ransomee.stat != CONSCIOUS || !ransomee.mind || HAS_TRAIT(ransomee.mind, TRAIT_HAS_BEEN_KIDNAPPED)) //mint condition only return 0 else if(FACTION_PIRATE in ransomee.faction) //can't ransom your fellow pirates to CentCom! @@ -472,18 +470,20 @@ /datum/export/pirate/cash cost = 1 + k_hit_percentile = 0.1 / MAX_STACK_SIZE unit_name = "bill" export_types = list(/obj/item/stack/spacecash) -/datum/export/pirate/cash/get_cost(obj/exported_item) - var/obj/item/stack/spacecash/cash = exported_item - return cash.value * cash.amount +/datum/export/pirate/cash/get_amount(obj/item/stack/spacecash/cash) + return cash.amount + +/datum/export/pirate/cash/get_base_cost(obj/item/stack/spacecash/cash) + return cash.value /datum/export/pirate/holochip cost = 1 unit_name = "holochip" export_types = list(/obj/item/holochip) -/datum/export/pirate/holochip/get_cost(atom/movable/exported_item) - var/obj/item/holochip/chip = exported_item +/datum/export/pirate/holochip/get_base_cost(obj/item/holochip/chip) return chip.credits diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm index 13a1ff7e1d60..ac4c66263a2b 100644 --- a/code/modules/antagonists/revenant/revenant_blight.dm +++ b/code/modules/antagonists/revenant/revenant_blight.dm @@ -37,14 +37,14 @@ 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) - need_mob_update += affected_mob.adjustStaminaLoss(20, updating_stamina = FALSE) + need_mob_update += affected_mob.adjust_stamina_loss(20, updating_stamina = FALSE) new /obj/effect/temp_visual/revenant(affected_mob.loc) if(stagedamage < stage) stagedamage++ - need_mob_update += affected_mob.adjustToxLoss(1 * stage * seconds_per_tick, updating_health = FALSE) //should, normally, do about 30 toxin damage. + need_mob_update += affected_mob.adjust_tox_loss(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)) - need_mob_update += affected_mob.adjustStaminaLoss(stage, updating_stamina = FALSE) + need_mob_update += affected_mob.adjust_stamina_loss(stage, updating_stamina = FALSE) if(need_mob_update) affected_mob.updatehealth() @@ -62,7 +62,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, updating_stamina = FALSE) + affected_mob.adjust_stamina_loss(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.set_haircolor("#1d2953", override = TRUE) diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 5f5389040731..94e5f0c04847 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -180,20 +180,20 @@ . = ..() var/mob/living/real_mob = mob_override || owner.current real_mob.AddComponentFrom(REF(src), /datum/component/can_flash_from_behind) - RegisterSignal(real_mob, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON, PROC_REF(on_flash_success)) + RegisterSignal(real_mob, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB, PROC_REF(on_flash_success)) /datum/antagonist/rev/head/remove_innate_effects(mob/living/mob_override) . = ..() var/mob/living/real_mob = mob_override || owner.current real_mob.RemoveComponentSource(REF(src), /datum/component/can_flash_from_behind) - UnregisterSignal(real_mob, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON) + UnregisterSignal(real_mob, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB) -/// Signal proc for [COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON]. +/// Signal proc for [COMSIG_MOB_SUCCESSFUL_FLASHED_MOB]. /// Bread and butter of revolution conversion, successfully flashing a carbon will make them a revolutionary -/datum/antagonist/rev/head/proc/on_flash_success(mob/living/source, mob/living/carbon/flashed, obj/item/assembly/flash/flash, deviation) +/datum/antagonist/rev/head/proc/on_flash_success(mob/living/source, mob/living/flashed, obj/item/assembly/flash/flash, deviation) SIGNAL_HANDLER - if(flashed.stat == DEAD) + if(flashed.stat == DEAD || issilicon(flashed) || isdrone(flashed)) return if(flashed.stat != CONSCIOUS) to_chat(source, span_warning("[flashed.p_They()] must be conscious before you can convert [flashed.p_them()]!")) diff --git a/code/modules/antagonists/revolution/revolution_handler.dm b/code/modules/antagonists/revolution/revolution_handler.dm index d3bdbf972693..f4c703ba952d 100644 --- a/code/modules/antagonists/revolution/revolution_handler.dm +++ b/code/modules/antagonists/revolution/revolution_handler.dm @@ -73,6 +73,10 @@ GLOBAL_DATUM(revolution_handler, /datum/revolution_handler) if(isnull(real_headrev)) continue add_memory_in_range(real_headrev, 5, /datum/memory/revolution_rev_victory, protagonist = real_headrev) + add_personality_mood_to_viewers(real_headrev, "revwin", list( + /datum/personality/nt/loyalist = /datum/mood_event/loyalist_revs_win, + /datum/personality/nt/disillusioned = /datum/mood_event/disillusioned_revs_win, + ), range = 5) result = REVOLUTION_VICTORY @@ -99,6 +103,10 @@ GLOBAL_DATUM(revolution_handler, /datum/revolution_handler) var/mob/living/head_of_staff = head_tracker.target?.current if(!isnull(head_of_staff)) add_memory_in_range(head_of_staff, 5, /datum/memory/revolution_heads_victory, protagonist = head_of_staff) + add_personality_mood_to_viewers(head_of_staff, "revlost", list( + /datum/personality/nt/loyalist = /datum/mood_event/loyalist_revs_lost, + /datum/personality/nt/disillusioned = /datum/mood_event/disillusioned_revs_lost + ), range = 5) priority_announce("It appears the mutiny has been quelled. Please return yourself and your incapacitated colleagues to work. \ We have remotely blacklisted the head revolutionaries in your medical records to prevent accidental revival.", null, null, null, "[command_name()] Loyalty Monitoring Division") diff --git a/code/modules/antagonists/sentient_creature/sentient_creature.dm b/code/modules/antagonists/sentient_creature/sentient_creature.dm index 48b149574f96..b2035471c466 100644 --- a/code/modules/antagonists/sentient_creature/sentient_creature.dm +++ b/code/modules/antagonists/sentient_creature/sentient_creature.dm @@ -23,6 +23,11 @@ var/mob/living/master = owner.enslaved_to?.resolve() if(master) owner.current.copy_languages(master, LANGUAGE_MASTER) + ADD_TRAIT(owner, TRAIT_UNCONVERTABLE, REF(src)) + return ..() + +/datum/antagonist/sentient_creature/on_removal() + REMOVE_TRAIT(owner, TRAIT_UNCONVERTABLE, REF(src)) return ..() /datum/antagonist/sentient_creature/ui_static_data(mob/user) diff --git a/code/modules/antagonists/space_ninja/space_ninja.dm b/code/modules/antagonists/space_ninja/space_ninja.dm index c8b20cab10f6..47d73b368bfa 100644 --- a/code/modules/antagonists/space_ninja/space_ninja.dm +++ b/code/modules/antagonists/space_ninja/space_ninja.dm @@ -15,6 +15,14 @@ ///Whether or not this ninja will obtain objectives var/give_objectives = TRUE +/datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override) + var/mob/ninja = mob_override || owner.current + ADD_TRAIT(ninja, TRAIT_DESENSITIZED, REF(src)) + +/datum/antagonist/ninja/remove_innate_effects(mob/living/mob_override) + var/mob/ninja = mob_override || owner.current + REMOVE_TRAIT(ninja, TRAIT_DESENSITIZED, REF(src)) + /** * Proc that equips the space ninja outfit on a given individual. By default this is the owner of the antagonist datum. * diff --git a/code/modules/antagonists/spy/spy_bounty.dm b/code/modules/antagonists/spy/spy_bounty.dm index 9fbb6c1c7c35..2adbe7f05c72 100644 --- a/code/modules/antagonists/spy/spy_bounty.dm +++ b/code/modules/antagonists/spy/spy_bounty.dm @@ -31,6 +31,8 @@ VAR_FINAL/initalized = FALSE /// Whether the bounty has been completed. VAR_FINAL/claimed = FALSE + /// What pool we picked the loot from. + VAR_FINAL/loot_difficulty /// What uplink item the bounty will reward on completion. VAR_FINAL/datum/uplink_item/reward_item @@ -70,16 +72,47 @@ /// Selects what uplink item the bounty will reward on completion. /datum/spy_bounty/proc/select_reward(datum/spy_bounty_handler/handler) - var/list/loot_pool = handler.possible_uplink_items[difficulty] + loot_difficulty = difficulty + + var/list/loot_pool + // work backwards from the highest difficulty loot pool to find one that has items + for(var/i in length(handler.possible_uplink_items) to 1 step -1) + var/pool_tier = handler.possible_uplink_items[i] + // we're not looking for this difficult, skip + if(pool_tier != loot_difficulty) + continue + // we found our difficulty's loot pool, if it has items we're done + loot_pool = handler.possible_uplink_items[pool_tier] + if(length(loot_pool) || i == 1) + break + // if our difficult does not have items, and we're not at the lowest difficulty, step down and try again + loot_difficulty = handler.possible_uplink_items[i - 1] if(!length(loot_pool)) - reward_item = /datum/uplink_item/bundles_tc/telecrystal + reward_item = SStraitor.uplink_items_by_type[/datum/uplink_item/bundles_tc/telecrystal] return // future todo : add some junk items for when we run out of items reward_item = pick(loot_pool) + // we remove here, rather than on claim, to reduce the chance of duplicate rewards in a single batch + // otherwise it would be not only possible, but *likely* to get the same reward simultaneously across bounties + // (though the reason this is a probability is so there is a rare chance this can happen anyways, for the fun of it) if(prob(80)) loot_pool -= reward_item +/** + * Called when the bounty gets cleared after the end of a bounty period + * + * * handler - The bounty handler that is handling this bounty. + */ +/datum/spy_bounty/proc/clear_bounty(datum/spy_bounty_handler/handler) + ASSERT(initalized, "Trying to clear an uninitialized bounty!") + + // another chance to return unclaimed reward items to the bounty pool + if(!claimed && reward_item && prob(40)) + handler.possible_uplink_items[loot_difficulty || difficulty] |= reward_item + + qdel(src) + /** * Checks if the passed movable is a valid target for this bounty. * @@ -460,7 +493,7 @@ /obj/machinery/teleport, /obj/machinery/computer/teleporter, ) - location_type = /area/station/ai_monitored/aisat + location_type = /area/station/ai/satellite /// Subtype for a bounty that targets a specific crew member /datum/spy_bounty/targets_person @@ -702,10 +735,10 @@ bot_type = /mob/living/simple_animal/bot/secbot/pingsky help = "Abduct Officer Pingsky - commonly found protecting the station's AI." -/datum/spy_bounty/some_bot/scrubbs +/datum/spy_bounty/some_bot/scrubs difficulty = SPY_DIFFICULTY_EASY bot_type = /mob/living/basic/bot/cleanbot/medbay - help = "Abduct Scrubbs, MD - commonly found mopping up blood in Medbay." + help = "Abduct Scrubs, MD - commonly found mopping up blood in Medbay." -/datum/spy_bounty/some_bot/scrubbs/can_claim(mob/user) +/datum/spy_bounty/some_bot/scrubs/can_claim(mob/user) return !(user.mind?.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_MEDICAL) diff --git a/code/modules/antagonists/spy/spy_bounty_handler.dm b/code/modules/antagonists/spy/spy_bounty_handler.dm index 4b4ba9a835c3..2f4cfc876c74 100644 --- a/code/modules/antagonists/spy/spy_bounty_handler.dm +++ b/code/modules/antagonists/spy/spy_bounty_handler.dm @@ -113,22 +113,43 @@ continue bounty_types[difficulty][bounty] = weight + var/list/limited_items = list() + var/list/show_anyways = list() + show_anyways += typesof(/datum/uplink_item/spy_unique/shotgun_ammo) // acquiring a shotgun is not difficult + for(var/datum/uplink_item/item as anything in SStraitor.uplink_items) - if(isnull(item.item) || item.item == ABSTRACT_UPLINK_ITEM) + // limited items is populated as we go + if(item in limited_items) continue - if(!(item.purchasable_from & UPLINK_SPY)) + // proc handles checking if the item is valid + if(!try_add_to_loot_pool(item)) continue - // This will have some overlap, and that's intentional - - // Adds some variety, rare moments where you can get a hard reward for an easier bounty (or visa versa) - if(item.cost <= CONFIG_GET(number/spy_easy_reward_tc_threshold)) - possible_uplink_items[SPY_DIFFICULTY_EASY] += item - if(item.cost >= CONFIG_GET(number/spy_easy_reward_tc_threshold) && item.cost <= CONFIG_GET(number/spy_hard_reward_tc_threshold)) - possible_uplink_items[SPY_DIFFICULTY_MEDIUM] += item - if(item.cost >= CONFIG_GET(number/spy_hard_reward_tc_threshold)) - possible_uplink_items[SPY_DIFFICULTY_HARD] += item + // any child items, such as ammo, are removed from the pool until the parent item is rewarded + for(var/child_item_type in (item.relevant_child_items || list()) - show_anyways) + if(prob(10)) // 10% chance to have it anyways though. teehee + continue + var/child_item = SStraitor.uplink_items_by_type[child_item_type] + for(var/difficulty in possible_uplink_items) + possible_uplink_items[difficulty] -= child_item + limited_items |= child_item refresh_bounty_list() +/// Helper to attempt to add the passed uplink item datum to the possible bounty pool(s). +/datum/spy_bounty_handler/proc/try_add_to_loot_pool(datum/uplink_item/item) + if(isnull(item.item) || item.item == ABSTRACT_UPLINK_ITEM || !(item.purchasable_from & UPLINK_SPY)) + return FALSE + + // This will have some overlap, and that's intentional - + // Adds some variety, rare moments where you can get a hard reward for an easier bounty (or visa versa) + if(item.cost <= CONFIG_GET(number/spy_easy_reward_tc_threshold)) + possible_uplink_items[SPY_DIFFICULTY_EASY] |= item + if(item.cost >= CONFIG_GET(number/spy_easy_reward_tc_threshold) && item.cost <= CONFIG_GET(number/spy_hard_reward_tc_threshold)) + possible_uplink_items[SPY_DIFFICULTY_MEDIUM] |= item + if(item.cost >= CONFIG_GET(number/spy_hard_reward_tc_threshold)) + possible_uplink_items[SPY_DIFFICULTY_HARD] |= item + return TRUE + /// Helper that returns a list of all active bounties in a single list, regardless of difficulty. /datum/spy_bounty_handler/proc/get_all_bounties() as /list var/list/all_bounties = list() @@ -152,7 +173,9 @@ bounties_to_give[SPY_DIFFICULTY_MEDIUM] += converted_medium_bounties for(var/difficulty in bounties) - QDEL_LIST(bounties[difficulty]) + for(var/datum/spy_bounty/bounty as anything in bounties[difficulty]) + bounty.clear_bounty(src) + bounties[difficulty].Cut() var/list/pool = bounty_types[difficulty] var/amount_to_give = bounties_to_give[difficulty] diff --git a/code/modules/antagonists/spy/spy_uplink.dm b/code/modules/antagonists/spy/spy_uplink.dm index 7131a0028ca6..879061ed25aa 100644 --- a/code/modules/antagonists/spy/spy_uplink.dm +++ b/code/modules/antagonists/spy/spy_uplink.dm @@ -148,12 +148,16 @@ return FALSE var/bounty_key = bounty.get_dupe_protection_key(stealing) + // record that we've claimed this type of bounty handler.all_claimed_bounty_types[bounty_key] += 1 handler.claimed_bounties_from_last_pool[bounty_key] = TRUE - + // clear up the bounty itself bounty.clean_up_stolen_item(stealing, spy, handler) bounty.claimed = TRUE - + // adds child items to the bounty pool, ie ammo for a newly acquired gun + for(var/child_item_type in bounty.reward_item.relevant_child_items) + handler.try_add_to_loot_pool(SStraitor.uplink_items_by_type[child_item_type]) + // and finally, spawn the reward var/atom/movable/reward = bounty.reward_item.spawn_item_for_generic_use(spy) if(isitem(reward)) spy.put_in_hands(reward) diff --git a/code/modules/antagonists/traitor/contractor/contractor_items.dm b/code/modules/antagonists/traitor/contractor/contractor_items.dm index 8d1dbf99e444..86bbaf4168c5 100644 --- a/code/modules/antagonists/traitor/contractor/contractor_items.dm +++ b/code/modules/antagonists/traitor/contractor/contractor_items.dm @@ -11,23 +11,23 @@ name = "Contractor Guide" default_raw_text = {"Welcome agent, congratulations on your new position as contractor. On top of your already assigned objectives,\ this kit will provide you contracts to take on for TC payments.\ -

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

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

\ -

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

\ -

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

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

\ +

The contractor hub, available at the top right of the uplink, will provide you unique items and abilities. These are bought using Contractor Rep, \ with two Rep being provided each time you complete a contract.

\

Using the tablet

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

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

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

\

The tablet can also be recharged at any cell charger.

\

Extracting

\ @@ -38,7 +38,7 @@
  • Grab your target, and drag them into the pod.
  • \ \

    Ransoms

    \ -

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

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

    \

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

    "} diff --git a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm index 71ae454df72f..fb1212fb931f 100644 --- a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm @@ -141,7 +141,7 @@ return contractor_id.registered_account.adjust_money(ransom * 0.35) contractor_id.registered_account.bank_card_talk("We've processed the ransom, agent. \ - Here's your cut - your balance is now [contractor_id.registered_account.account_balance] cr.", TRUE) + Here's your cut - your balance is now [contractor_id.registered_account.account_balance] [MONEY_SYMBOL].", TRUE) #define VICTIM_EXPERIENCE_START 0 #define VICTIM_EXPERIENCE_FIRST_HIT 1 diff --git a/code/modules/antagonists/voidwalker/voidwalker_abilities.dm b/code/modules/antagonists/voidwalker/voidwalker_abilities.dm index a1da3474d9c9..afc11f2c3c80 100644 --- a/code/modules/antagonists/voidwalker/voidwalker_abilities.dm +++ b/code/modules/antagonists/voidwalker/voidwalker_abilities.dm @@ -2,7 +2,8 @@ /datum/action/cooldown/spell/pointed/unsettle name = "Unsettle" desc = "Stare directly into someone who doesn't see you. Remain in their view for a bit to stun them for 2 seconds and announce your presence to them. " - button_icon_state = "terrify" + button_icon = 'icons/mob/actions/actions_voidwalker.dmi' + button_icon_state = "unsettle" background_icon_state = "bg_void" overlay_icon_state = null panel = null @@ -60,7 +61,7 @@ /datum/action/cooldown/spell/pointed/unsettle/proc/spookify(mob/living/carbon/human/target) target.Paralyze(stun_time) - target.adjustStaminaLoss(stamina_damage) + target.adjust_stamina_loss(stamina_damage) target.apply_status_effect(/datum/status_effect/speech/slurring/generic) target.emote("scream") @@ -80,7 +81,7 @@ name = "Cosmic Transmit" background_icon_state = "bg_void" button_icon = 'icons/mob/actions/actions_voidwalker.dmi' - button_icon_state = "voidwalker_telepathy" + button_icon_state = "telepathy" panel = null overlay_icon_state = null @@ -112,7 +113,9 @@ /datum/action/cooldown/mob_cooldown/charge/voidwalker name = "Cosmic Dash" - button_icon_state = "void_dash" + background_icon_state = "bg_void" + button_icon = 'icons/mob/actions/actions_voidwalker.dmi' + button_icon_state = "dash" charge_past = 0 charge_damage = 20 cooldown_time = 8 SECONDS diff --git a/code/modules/antagonists/voidwalker/voidwalker_kidnap.dm b/code/modules/antagonists/voidwalker/voidwalker_kidnap.dm index cada56a33eb3..a0dad18436f1 100644 --- a/code/modules/antagonists/voidwalker/voidwalker_kidnap.dm +++ b/code/modules/antagonists/voidwalker/voidwalker_kidnap.dm @@ -21,7 +21,7 @@ GLOBAL_LIST_EMPTY(voidwalker_void) default_gravity = STANDARD_GRAVITY ambience_index = AMBIENCE_SPOOKY sound_environment = SOUND_ENVIRONMENT_CAVE - area_flags = UNIQUE_AREA | NOTELEPORT | HIDDEN_AREA | BLOCK_SUICIDE + area_flags = NOTELEPORT | HIDDEN_AREA | BLOCK_SUICIDE /// Mini car where people drive around in in their mangled corpse to heal a bit before they get dumped back on station /obj/effect/wisp_mobile diff --git a/code/modules/antagonists/voidwalker/voidwalker_mob.dm b/code/modules/antagonists/voidwalker/voidwalker_mob.dm index 7915e85d1164..447389876ea2 100644 --- a/code/modules/antagonists/voidwalker/voidwalker_mob.dm +++ b/code/modules/antagonists/voidwalker/voidwalker_mob.dm @@ -83,6 +83,7 @@ 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 . = ..() + status_flags &= ~CANSTUN AddElement(/datum/element/simple_flying) AddElement(/datum/element/glass_pacifist) @@ -146,6 +147,9 @@ var/should_attack = try_kidnap(hewmon) + // Marks the victim with nodeath + hewmon.apply_status_effect(/datum/status_effect/void_chomped) + if(!should_attack) return FALSE @@ -259,7 +263,7 @@ CRASH("[victim] was instantly dumped after being voidwalker kidnapped due to a missing landmark!") else victim.heal_and_revive(90) - victim.adjustOxyLoss(-100, FALSE) + victim.adjust_oxy_loss(-100, FALSE) conversions_remaining++ diff --git a/code/modules/antagonists/voidwalker/voidwalker_status_effects.dm b/code/modules/antagonists/voidwalker/voidwalker_status_effects.dm index 9de244d59499..dc3ddbd6d51a 100644 --- a/code/modules/antagonists/voidwalker/voidwalker_status_effects.dm +++ b/code/modules/antagonists/voidwalker/voidwalker_status_effects.dm @@ -8,23 +8,25 @@ alert_type = /atom/movable/screen/alert/status_effect/veryhighgravity /datum/status_effect/planet_allergy/tick() - owner.adjustBruteLoss(1) + owner.adjust_brute_loss(1) /atom/movable/screen/alert/status_effect/veryhighgravity name = "Crushing Gravity" desc = "You're getting crushed by high gravity, picking up items and movement will be slowed. You'll also accumulate brute damage!" - icon_state = "paralysis" + use_user_hud_icon = TRUE + overlay_state = "paralysis" -/datum/status_effect/void_eatered - id = "void_eatered" - duration = 10 SECONDS +/datum/status_effect/void_chomped + id = "void_chomped" + duration = 15 SECONDS + status_type = STATUS_EFFECT_REFRESH remove_on_fullheal = TRUE alert_type = null -/datum/status_effect/void_eatered/on_apply() +/datum/status_effect/void_chomped/on_apply() . = ..() ADD_TRAIT(owner, TRAIT_NODEATH, TRAIT_STATUS_EFFECT(id)) -/datum/status_effect/void_eatered/on_remove() +/datum/status_effect/void_chomped/on_remove() . = ..() REMOVE_TRAIT(owner, TRAIT_NODEATH, TRAIT_STATUS_EFFECT(id)) diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 4d90d4aa53bf..6f6b87c5e170 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -304,7 +304,7 @@ uniform = /obj/item/clothing/under/costume/roman shoes = /obj/item/clothing/shoes/roman back = /obj/item/spear - r_hand = /obj/item/claymore + belt = /obj/item/storage/belt/sheath/gladius l_hand = /obj/item/shield/roman /datum/outfit/roman/pre_equip(mob/living/carbon/human/H, visuals_only) diff --git a/code/modules/antagonists/wizard/equipment/enchanted_clown_suit.dm b/code/modules/antagonists/wizard/equipment/enchanted_clown_suit.dm index 623971276937..c0ae9379f1b3 100644 --- a/code/modules/antagonists/wizard/equipment/enchanted_clown_suit.dm +++ b/code/modules/antagonists/wizard/equipment/enchanted_clown_suit.dm @@ -62,7 +62,7 @@ return ..() /datum/action/cooldown/spell/conjure_item/clown_pockets/post_created(atom/cast_on, atom/created) - cast_on.visible_message(span_notice("[cast_on] pulls out [created]!")) + cast_on.visible_message(span_notice("[cast_on] pulls out [created]!"), span_notice("You pull out [created]!")) /datum/action/cooldown/spell/conjure_item/clown_pockets/can_cast_spell(feedback = TRUE) . = ..() @@ -76,7 +76,8 @@ /// Prints a funny message, exists so I can override it to print a different message /datum/action/cooldown/spell/conjure_item/clown_pockets/proc/cast_message(mob/cast_on) cast_on.visible_message(span_notice("[cast_on] reaches far deeper into [cast_on.p_their()] pockets than you think \ - should be possible and starts rummaging around for something.")) + should be possible and starts rummaging around for something."), span_notice("You reach further down into your \ + pockets than you ever have before and feel around for something.")) /// Longer cooldown variant which is attached to the enchanted clown suit /datum/action/cooldown/spell/conjure_item/clown_pockets/enchantment @@ -84,7 +85,8 @@ cooldown_time = 60 SECONDS /datum/action/cooldown/spell/conjure_item/clown_pockets/enchantment/cast_message(mob/cast_on) - cast_on.visible_message(span_notice("[cast_on] starts rummaging around in [cast_on.p_their()] comically large pants.")) + cast_on.visible_message(span_notice("[cast_on] starts rummaging around in [cast_on.p_their()] comically large pants."), span_notice("You \ + start rummaging around in your comically large pants.")) /// Enchanted clown suit /obj/item/clothing/under/rank/civilian/clown/magic diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 79798ec1f5e4..0b8f22598559 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -24,7 +24,6 @@ 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) . = ..() @@ -33,6 +32,9 @@ if(!base_name) base_name = initial(name) +/obj/item/soulstone/grind_results() + return list(/datum/reagent/hauntium = 25, /datum/reagent/silicon = 10) //can be ground into hauntium + /obj/item/soulstone/update_appearance(updates) . = ..() for(var/mob/living/basic/shade/sharded_shade in src) @@ -417,7 +419,7 @@ /obj/item/soulstone/proc/check_menu(mob/user, obj/structure/constructshell/shell) if(!istype(user)) return FALSE - if(user.incapacitated || !user.is_holding(src) || !user.CanReach(shell, src)) + if(user.incapacitated || !user.is_holding(src) || !shell.IsReachableBy(user, reach)) return FALSE return TRUE @@ -489,7 +491,7 @@ /// Called when a ghost is chosen to become a shade. /obj/item/soulstone/proc/on_poll_concluded(mob/living/master, mob/living/victim, mob/dead/observer/ghost) - if(isnull(victim) || master.incapacitated || !master.is_holding(src) || !master.CanReach(victim, src)) + if(isnull(victim) || master.incapacitated || !master.is_holding(src) || !victim.IsReachableBy(master, reach)) return FALSE if(isnull(ghost?.client)) to_chat(master, span_danger("There were no spirits willing to become a shade.")) diff --git a/code/modules/antagonists/wizard/equipment/teleport_rod.dm b/code/modules/antagonists/wizard/equipment/teleport_rod.dm index 47187dcc4f75..a0cc6224ce2d 100644 --- a/code/modules/antagonists/wizard/equipment/teleport_rod.dm +++ b/code/modules/antagonists/wizard/equipment/teleport_rod.dm @@ -214,7 +214,8 @@ /atom/movable/screen/alert/status_effect/teleport_flux name = "Teleport Flux" desc = "Your body exists in a state of flux, making further teleportation dangerous." - icon_state = "flux" + use_user_hud_icon = TRUE + overlay_state = "flux" /atom/movable/screen/alert/status_effect/teleport_flux/perma name = "Permanent " + parent_type::name diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/cheese.dm b/code/modules/antagonists/wizard/grand_ritual/finales/cheese.dm index f0b8ef709aee..6357848b36a4 100644 --- a/code/modules/antagonists/wizard/grand_ritual/finales/cheese.dm +++ b/code/modules/antagonists/wizard/grand_ritual/finales/cheese.dm @@ -37,7 +37,7 @@ [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.adjust_organ_loss(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) diff --git a/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm b/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm index 8965d55b92d4..c86c6a84bf3d 100644 --- a/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm +++ b/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm @@ -123,7 +123,7 @@ /datum/grand_side_effect/emp/trigger(potency, turf/ritual_location, mob/invoker) var/heavy = LERP(0, 3, potency/GRAND_RITUAL_FINALE_COUNT) var/light = LERP(3, 6, potency/GRAND_RITUAL_FINALE_COUNT) - empulse(ritual_location, heavy, light) + empulse(ritual_location, heavy, light, emp_source = src) /// Swap locations of nearby mobs arbitrarily and confuse them /datum/grand_side_effect/translocate @@ -353,10 +353,10 @@ /// Typepaths of mobs to create var/static/list/permitted_mobs = list( /mob/living/basic/carp, + /mob/living/basic/illusion, /mob/living/basic/killer_tomato, /mob/living/basic/skeleton, /mob/living/basic/wumborian_fugu, - /mob/living/simple_animal/hostile/illusion, /mob/living/simple_animal/hostile/ooze, ) diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index f261b38497dc..f31ae96f050c 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -84,7 +84,8 @@ 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, announce = FALSE) + owner.current.add_personality(/datum/personality/introvert) + owner.current.add_personality(/datum/personality/callous) // no sense of right and wrong if(give_objectives) create_objectives() if(move_to_lair) diff --git a/code/modules/art/paintings.dm b/code/modules/art/paintings.dm index 5e1c44bec852..1c62bc96cb24 100644 --- a/code/modules/art/paintings.dm +++ b/code/modules/art/paintings.dm @@ -12,6 +12,7 @@ density = TRUE resistance_flags = FLAMMABLE max_integrity = 60 + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 5) var/obj/item/canvas/painting = null //Adding canvases @@ -224,7 +225,7 @@ return FALSE //I'd have this done inside the signal, but that'd have to be asynced, //while we want the UI to be updated after the color is chosen, not before. - var/chosen_color = input(user, "Pick new color", painting_implement, params["old_color"]) as color|null + var/chosen_color = tgui_color_picker(user, "Pick new color", painting_implement, params["old_color"]) if(!chosen_color || IS_DEAD_OR_INCAP(user) || !user.is_holding(painting_implement)) return FALSE SEND_SIGNAL(painting_implement, COMSIG_PAINTING_TOOL_PALETTE_COLOR_CHANGED, chosen_color, params["color_index"]) @@ -258,7 +259,10 @@ LAZYREMOVE(zoom_by_observer, user.key) /obj/item/canvas/proc/finalize(mob/user) - if(painting_metadata.loaded_from_json || finalized) + if(finalized || painting_metadata.loaded_from_json) + return + if(!in_range(src, user)) + user.balloon_alert(user, "too far away!") return if(!try_rename(user)) return @@ -275,7 +279,7 @@ #define CURATOR_PERCENTILE_CUT 0.225 #define SERVICE_PERCENTILE_CUT 0.125 -/obj/item/canvas/proc/patron(mob/user) +/obj/item/canvas/proc/patron(mob/living/user) if(!finalized || !isliving(user)) return if(!painting_metadata.loaded_from_json) @@ -314,7 +318,7 @@ if(curator_cut) for(var/datum/bank_account/curator as anything in curator_accounts) curator.adjust_money(curator_cut, "Painting: Patronage cut") - curator.bank_card_talk("Cut on patronage received, account now holds [curator.account_balance] cr.") + curator.bank_card_talk("Cut on patronage received, account now holds [curator.account_balance] [MONEY_SYMBOL].") if(istype(loc, /obj/structure/sign/painting)) var/obj/structure/sign/painting/frame = loc @@ -327,6 +331,10 @@ last_patron = WEAKREF(user.mind) to_chat(user, span_notice("Nanotrasen Trust Foundation thanks you for your contribution. You're now an official patron of this painting.")) + if(HAS_PERSONALITY(user, /datum/personality/creative)) + user.add_mood_event("creative_patronage", /datum/mood_event/creative_patronage) + if(HAS_PERSONALITY(user, /datum/personality/unimaginative)) + user.add_mood_event("unimaginative_patronage", /datum/mood_event/unimaginative_patronage) var/list/possible_frames = SSpersistent_paintings.get_available_frames(offer_amount) if(possible_frames.len <= 1) // Not much room for choices here. return @@ -356,7 +364,7 @@ /obj/item/canvas/proc/can_select_frame(mob/user) if(!istype(loc, /obj/structure/sign/painting)) return FALSE - if(!user?.CanReach(loc) || IS_DEAD_OR_INCAP(user)) + if(!loc.IsReachableBy(user) || IS_DEAD_OR_INCAP(user)) return FALSE if(!last_patron || !IS_WEAKREF_OF(user?.mind, last_patron)) return FALSE @@ -709,11 +717,9 @@ /obj/structure/sign/painting/get_save_vars() return ..() - NAMEOF(src, icon) -/obj/structure/sign/painting/Initialize(mapload, dir, building) +/obj/structure/sign/painting/Initialize(mapload) . = ..() SSpersistent_paintings.painting_frames += src - if(dir) - setDir(dir) /obj/structure/sign/painting/Destroy() . = ..() @@ -728,12 +734,8 @@ else return ..() -/obj/structure/sign/painting/knock_down(mob/living/user) - var/turf/drop_turf - if(user) - drop_turf = get_turf(user) - else - drop_turf = drop_location() +/obj/structure/sign/painting/atom_deconstruct(disassembled) + var/turf/drop_turf = drop_location() current_canvas?.forceMove(drop_turf) var/obj/item/wallframe/frame = new wallframe_type(drop_turf) frame.update_integrity(get_integrity()) //Transfer how damaged it is. @@ -770,7 +772,7 @@ INVOKE_ASYNC(current_canvas, TYPE_PROC_REF(/obj/item/canvas, select_new_frame), user) return CLICK_ACTION_SUCCESS -/obj/structure/sign/painting/proc/frame_canvas(mob/user, obj/item/canvas/new_canvas) +/obj/structure/sign/painting/proc/frame_canvas(mob/living/user, obj/item/canvas/new_canvas) if(!(new_canvas.type in accepted_canvas_types)) to_chat(user, span_warning("[new_canvas] won't fit in this frame.")) return FALSE @@ -781,6 +783,10 @@ to_chat(user,span_notice("You frame [current_canvas].")) add_art_element() update_appearance() + if(HAS_PERSONALITY(user, /datum/personality/creative)) + user.add_mood_event("creative_framing", /datum/mood_event/creative_framing) + if(HAS_PERSONALITY(user, /datum/personality/unimaginative)) + user.add_mood_event("unimaginative_framing", /datum/mood_event/unimaginative_framing) return TRUE return FALSE @@ -922,7 +928,7 @@ var/our_dir = get_dir(user, on_wall) var/check_dir = our_dir & (EAST|WEST) ? NORTH : EAST var/turf/closed/wall/second_wall = get_step(on_wall, check_dir) - if(!istype(second_wall) || !user.CanReach(second_wall)) + if(!istype(second_wall) || !second_wall.IsReachableBy(user)) to_chat(user, span_warning("You need a reachable wall to the [check_dir == EAST ? "right" : "left"] of this one to mount this frame!")) return FALSE if(check_wall_item(second_wall, our_dir, wall_external)) @@ -944,11 +950,11 @@ wallframe_type = /obj/item/wallframe/painting/large /obj/structure/sign/painting/large/Initialize(mapload) - . = ..() // Necessary so that the painting is framed correctly by the frame overlay when flipped. ADD_KEEP_TOGETHER(src, INNATE_TRAIT) if(mapload) finalize_size() + return ..() /** * This frame is visually put between two wall turfs and it has an icon that's bigger than 32px, and because @@ -971,7 +977,10 @@ if(EAST) bound_height = 64 -/obj/structure/sign/painting/large/frame_canvas(mob/user, obj/item/canvas/new_canvas) +/obj/structure/sign/painting/large/get_turfs_to_mount_on() + return (!pixel_x && !pixel_y) ? list(get_step(src, dir)) : ..() + +/obj/structure/sign/painting/large/frame_canvas(mob/living/user, obj/item/canvas/new_canvas) . = ..() if(.) set_painting_offsets() diff --git a/code/modules/art/statues.dm b/code/modules/art/statues.dm index 7a2fc5a8f5aa..7e4174ebcfb0 100644 --- a/code/modules/art/statues.dm +++ b/code/modules/art/statues.dm @@ -20,12 +20,14 @@ var/impressiveness = 15 /// Art component subtype added to this statue var/art_type = /datum/element/art + /// Set to true to prevent it from being carved out of a block + var/uncarveable = FALSE /obj/structure/statue/Initialize(mapload) . = ..() AddElement(art_type, impressiveness) AddElement(/datum/element/beauty, impressiveness * 75) - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) AddComponent(/datum/component/marionette) /obj/structure/statue/wrench_act(mob/living/user, obj/item/tool) @@ -277,10 +279,10 @@ name = "Elder Atmosian" desc = "A statue of an Elder Atmosian, capable of bending the laws of thermodynamics to their will." icon_state = "eng" - custom_materials = list(/datum/material/metalhydrogen = SHEET_MATERIAL_AMOUNT*10) + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 30, /datum/material/metalhydrogen = SHEET_MATERIAL_AMOUNT * 20, /datum/material/zaukerite = SHEET_MATERIAL_AMOUNT * 15) max_integrity = 1000 impressiveness = 100 - abstract_type = /obj/structure/statue/elder_atmosian //This one is uncarvable + uncarveable = TRUE ///////////Goliath////////////////////////////////////////////////// /obj/structure/statue/goliath @@ -347,6 +349,7 @@ Moving interrupts /obj/item/chisel/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(sculpting) return ITEM_INTERACT_BLOCKING + if(istype(interacting_with, /obj/structure/carving_block)) var/obj/structure/carving_block/sculpt_block = interacting_with @@ -401,6 +404,10 @@ Moving interrupts if(!interrupted && !QDELETED(prepared_block)) prepared_block.create_statue() user.balloon_alert(user, "statue finished") + if(HAS_PERSONALITY(user, /datum/personality/creative)) + user.add_mood_event("creative_sculpting", /datum/mood_event/creative_sculpting) + if(HAS_PERSONALITY(user, /datum/personality/unimaginative)) + user.add_mood_event("unimaginative_sculpting", /datum/mood_event/unimaginative_sculpting) stop_sculpting(silent = !interrupted) /// To setup the sculpting target for the carving block @@ -439,15 +446,16 @@ Moving interrupts for(var/statue_path in prepared_block.get_possible_statues()) var/obj/structure/statue/abstract_statue = statue_path choices[statue_path] = image(icon = initial(abstract_statue.icon), icon_state = initial(abstract_statue.icon_state)) + if(!choices.len) - user.balloon_alert(user, "no abstract statues for material!") + user.balloon_alert(user, "no statues for material!") var/choice = show_radial_menu(user, prepared_block, choices, require_near = TRUE) if(choice) prepared_block.current_preset_type = choice var/image/chosen_looks = choices[choice] prepared_block.current_target = chosen_looks.appearance - user.balloon_alert(user, "abstract statue selected") + user.balloon_alert(user, "statue selected") /obj/structure/carving_block name = "block" @@ -568,11 +576,11 @@ Moving interrupts /obj/structure/carving_block/proc/build_statue_cost_table() . = list() for(var/statue_type in subtypesof(/obj/structure/statue) - /obj/structure/statue/custom) - var/obj/structure/statue/S = new statue_type() - if(!S.icon_state || S.abstract_type == S.type || !S.custom_materials) + var/obj/structure/statue/fake_statue = new statue_type() + if(!fake_statue.icon_state || fake_statue.abstract_type == fake_statue.type || fake_statue.uncarveable || !fake_statue.custom_materials) continue - .[S.type] = S.custom_materials - qdel(S) + .[fake_statue.type] = fake_statue.custom_materials + qdel(fake_statue) /obj/structure/statue/custom name = "custom statue" diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 8c8900cb025a..c1df928d8b68 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -10,6 +10,7 @@ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' throwforce = 0 w_class = WEIGHT_CLASS_TINY + assembly_flags = ASSEMBLY_NO_DUPLICATES custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*3, /datum/material/glass = SMALL_MATERIAL_AMOUNT*3) light_system = OVERLAY_LIGHT //Used as a flash here. light_range = FLASH_LIGHT_RANGE @@ -62,7 +63,7 @@ /obj/item/assembly/flash/proc/clown_check(mob/living/carbon/human/user) if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) - flash_carbon(user, user, confusion_duration = 15 SECONDS, targeted = FALSE) + flash_mob(user, user, confusion_duration = 15 SECONDS, targeted = FALSE) return FALSE return TRUE @@ -91,8 +92,8 @@ if(user) targets -= user to_chat(user, span_danger("[src] emits a blinding light!")) - for(var/mob/living/carbon/nearby_carbon in targets) - flash_carbon(nearby_carbon, user, confusion_duration, targeted = FALSE, generic_message = TRUE) + for(var/mob/living/nearby_living in targets) + flash_mob(nearby_living, user, confusion_duration, targeted = FALSE, generic_message = TRUE) return TRUE /obj/item/assembly/flash/proc/get_flash_targets(atom/target_loc, range = 3, override_vision_checks = FALSE) @@ -136,13 +137,13 @@ * * targeted - determines if it was aoe or targeted * * generic_message - checks if it should display default message. */ -/obj/item/assembly/flash/proc/flash_carbon(mob/living/carbon/flashed, mob/user, confusion_duration = 15 SECONDS, targeted = TRUE, generic_message = FALSE) +/obj/item/assembly/flash/proc/flash_mob(mob/living/flashed, mob/user, confusion_duration = 15 SECONDS, targeted = TRUE, generic_message = FALSE, extra_log = null) if(!istype(flashed)) - return + return FALSE if(user) - log_combat(user, flashed, "[targeted? "flashed(targeted)" : "flashed(AOE)"]", src) + log_combat(user, flashed, "[targeted? "flashed(targeted)" : "flashed(AOE)"] [extra_log]", src) else //caused by emp/remote signal - flashed.log_message("was [targeted? "flashed(targeted)" : "flashed(AOE)"]", LOG_ATTACK) + flashed.log_message("was [targeted? "flashed(targeted)" : "flashed(AOE)"] [extra_log]", LOG_ATTACK) if(generic_message && flashed != user) to_chat(flashed, span_danger("[src] emits a blinding light!")) @@ -150,9 +151,9 @@ var/deviation = calculate_deviation(flashed, user || src) if(user) - var/sigreturn = SEND_SIGNAL(user, COMSIG_MOB_PRE_FLASHED_CARBON, flashed, src, deviation) + var/sigreturn = SEND_SIGNAL(user, COMSIG_MOB_PRE_FLASHED_MOB, flashed, src, deviation) if(sigreturn & STOP_FLASH) - return + return FALSE if(sigreturn & DEVIATION_OVERRIDE_FULL) deviation = DEVIATION_FULL @@ -163,28 +164,50 @@ //If you face away from someone they shouldn't notice any effects. if(deviation == DEVIATION_FULL) - return + return FALSE - if(targeted) - var/flash_result = flashed.flash_act(1, 1) - if(flash_result == FLASH_COMPLETED) - return //Behavior was overwritten, so we just skip the flashy stunny part and go with the override behavior instead + var/flash_result = flashed.flash_act(1, override_blindness_check = targeted, affect_silicon = TRUE) + if(!flash_result) + if(targeted) + if(user) + visible_message(span_warning("[user] fails to blind [flashed] with the flash!"), span_danger("[user] fails to blind you with the flash!")) + else + to_chat(flashed, span_danger("[src] fails to blind you!")) + return FALSE + + flashed.adjust_confusion_up_to(confusion_duration, confusion_duration * CONFUSION_STACK_MAX_MULTIPLIER) + + if(!targeted) + return TRUE - if(flash_result) - flashed.set_confusion_if_lower(confusion_duration * CONFUSION_STACK_MAX_MULTIPLIER) - visible_message(span_danger("[user] blinds [flashed] with the flash!"), span_userdanger("[user] blinds you with the flash!")) + if(flash_result != FLASH_COMPLETED) //If the behavior was overwritten, we just skip the flashy stunny part and go with the override behavior instead + if(issilicon(flashed)) + if(flashed.is_blind()) + var/flash_duration = rand(8,12) SECONDS + flashed.Paralyze(flash_duration) + flashed.set_temp_blindness_if_lower(flash_duration) + if(user) + user.visible_message(span_warning("[user] overloads [flashed]'s sensors and computing with the flash!"), span_danger("You overload [flashed]'s sensors and computing with the flash!")) + else + to_chat(flashed, "[src] overloads your sensors and computing!") + else + flashed.set_temp_blindness_if_lower( (rand(5,15) SECONDS)) + if(user) + user.visible_message(span_warning("[user] blinds [flashed] with the flash!"), span_danger("You blind [flashed] with the flash!")) + else + to_chat(flashed, "You're blinded by [src]!") + else //easy way to make sure that you can only long stun someone who is facing in your direction - flashed.adjustStaminaLoss(rand(80, 120) * (1 - (deviation * 0.5))) + flashed.adjust_stamina_loss(rand(80, 120) * (1 - (deviation * 0.5))) flashed.Knockdown(rand(25, 50) * (1 - (deviation * 0.5))) - SEND_SIGNAL(user, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON, flashed, src, deviation) + if(user) + visible_message(span_danger("[user] blinds [flashed] with the flash!"), span_userdanger("[user] blinds you with the flash!")) + else + to_chat(flashed, "You're blinded by [src]!") - else if(user) - visible_message(span_warning("[user] fails to blind [flashed] with the flash!"), span_danger("[user] fails to blind you with the flash!")) - else - to_chat(flashed, span_danger("[src] fails to blind you!")) - else - if(flashed.flash_act()) - flashed.set_confusion_if_lower(confusion_duration * CONFUSION_STACK_MAX_MULTIPLIER) + if(user) + SEND_SIGNAL(user, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB, flashed, src, deviation) + return TRUE /** * Handles the directionality of the attack @@ -201,18 +224,24 @@ if(HAS_TRAIT(victim, TRAIT_SPINNING)) return DEVIATION_NONE + // I don't want to mess with cyborgs' deep-rooted weakness to flashes + if(issilicon(victim)) + return DEVIATION_NONE + if(iscarbon(victim)) var/mob/living/carbon/carbon_victim = victim if(carbon_victim.get_eye_protection() < FLASH_PROTECTION_SENSITIVE) // If we have really bad flash sensitivity, usually due to really sensitive eyes, we get flashed from all directions return DEVIATION_NONE + var/turf/attacker_turf = get_turf(attacker) + // Are they on the same tile? We'll return partial deviation. This may be someone flashing while lying down // or flashing someone they're stood on the same turf as, or a borg flashing someone buckled to them. - if(victim.loc == attacker.loc) + if(victim.loc == attacker_turf) return DEVIATION_PARTIAL // If the victim was looking at the attacker, this is the direction they'd have to be facing. - var/victim_to_attacker = get_dir(victim, attacker) + var/victim_to_attacker = get_dir(victim, attacker_turf) // The victim's dir is necessarily a cardinal value. var/victim_dir = victim.dir @@ -236,39 +265,19 @@ // Attacker lateral to the victim. return DEVIATION_PARTIAL -/obj/item/assembly/flash/attack(mob/living/M, mob/user) +/obj/item/assembly/flash/attack(mob/living/target, mob/user) if(!try_use_flash(user)) return FALSE - . = TRUE - if(iscarbon(M)) - flash_carbon(M, user, confusion_duration = 5 SECONDS, targeted = TRUE) - return - if(issilicon(M)) - 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.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 - - user.visible_message(span_warning("[user] fails to blind [M] with the flash!"), span_warning("You fail to blind [M] with the flash!")) + flash_mob(target, user, confusion_duration = 5 SECONDS, targeted = TRUE) + return TRUE /obj/item/assembly/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0) if(holder) return FALSE if(!AOE_flash(user = user)) return FALSE + return TRUE /obj/item/assembly/flash/emp_act(severity) . = ..() @@ -286,12 +295,14 @@ /obj/item/assembly/flash/cyborg /obj/item/assembly/flash/cyborg/attack(mob/living/M, mob/user) - ..() - new /obj/effect/temp_visual/borgflash(get_turf(src)) + . = ..() + if (.) + new /obj/effect/temp_visual/borgflash(get_turf(src)) /obj/item/assembly/flash/cyborg/attack_self(mob/user) - ..() - new /obj/effect/temp_visual/borgflash(get_turf(src)) + . = ..() + if (.) + new /obj/effect/temp_visual/borgflash(get_turf(src)) /obj/item/assembly/flash/cyborg/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) return @@ -354,42 +365,43 @@ /obj/item/assembly/flash/hypnotic/burn_out() return -/obj/item/assembly/flash/hypnotic/flash_carbon(mob/living/carbon/M, mob/user, confusion_duration = 15, targeted = TRUE, generic_message = FALSE) - if(!istype(M)) - return +/obj/item/assembly/flash/hypnotic/flash_mob(mob/living/flashed, mob/user, confusion_duration = 5 SECONDS, targeted = TRUE, generic_message = FALSE, extra_log = null) if(user) - log_combat(user, M, "[targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]", src) + log_combat(user, flashed, "[targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"] [extra_log]", src) else //caused by emp/remote signal - M.log_message("was [targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]", LOG_ATTACK) - if(generic_message && M != user) - to_chat(M, span_notice("[src] emits a soothing light...")) - if(targeted) - if(M.flash_act(1, 1)) - var/hypnosis = FALSE - if(M.hypnosis_vulnerable()) - hypnosis = TRUE + flashed.log_message("was [targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"] [extra_log]", LOG_ATTACK) + + if(generic_message && flashed != user) + to_chat(flashed, span_notice("[src] emits a soothing light...")) + + if(!flashed.flash_act(1, override_blindness_check = targeted, affect_silicon = TRUE)) + if(targeted) if(user) - user.visible_message(span_danger("[user] blinds [M] with the flash!"), span_danger("You hypno-flash [M]!")) - - if(!hypnosis) - to_chat(M, span_hypnophrase("The light makes you feel oddly relaxed...")) - M.adjust_confusion_up_to(10 SECONDS, 20 SECONDS) - M.adjust_dizzy_up_to(20 SECONDS, 40 SECONDS) - M.adjust_drowsiness_up_to(20 SECONDS, 40 SECONDS) - M.adjust_pacifism(10 SECONDS) + user.visible_message(span_warning("[user] fails to blind [flashed] with the flash!"), span_warning("You fail to hypno-flash [flashed]!")) else - M.apply_status_effect(/datum/status_effect/trance, 200, TRUE) + to_chat(flashed, span_danger("[src] fails to blind you!")) + return FALSE - else if(user) - user.visible_message(span_warning("[user] fails to blind [M] with the flash!"), span_warning("You fail to hypno-flash [M]!")) - else - to_chat(M, span_danger("[src] fails to blind you!")) - - else if(M.flash_act()) - to_chat(M, span_notice("Such a pretty light...")) - M.adjust_confusion_up_to(4 SECONDS, 20 SECONDS) - M.adjust_dizzy_up_to(8 SECONDS, 40 SECONDS) - M.adjust_drowsiness_up_to(8 SECONDS, 40 SECONDS) - M.adjust_pacifism(4 SECONDS) + if(!targeted) + to_chat(flashed, span_notice("Such a pretty light...")) + flashed.adjust_confusion_up_to(confusion_duration, confusion_duration * 2 * CONFUSION_STACK_MAX_MULTIPLIER) + flashed.adjust_dizzy_up_to(8 SECONDS, 40 SECONDS) + flashed.adjust_drowsiness_up_to(8 SECONDS, 40 SECONDS) + flashed.adjust_pacifism(4 SECONDS) + return TRUE + + if(user) + user.visible_message(span_danger("[user] blinds [flashed] with the flash!"), span_danger("You hypno-flash [flashed]!")) + else + to_chat(flashed, "You're blinded by [src]!") + + if(!flashed.hypnosis_vulnerable()) + to_chat(flashed, span_hypnophrase("The light makes you feel oddly relaxed...")) + flashed.adjust_confusion_up_to(confusion_duration * 2, confusion_duration * 2 * CONFUSION_STACK_MAX_MULTIPLIER) + flashed.adjust_dizzy_up_to(20 SECONDS, 40 SECONDS) + flashed.adjust_drowsiness_up_to(20 SECONDS, 40 SECONDS) + flashed.adjust_pacifism(10 SECONDS) + else + flashed.apply_status_effect(/datum/status_effect/trance, 200, TRUE) #undef CONFUSION_STACK_MAX_MULTIPLIER diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index f4ee56221c1f..74f2f748f1b8 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -15,7 +15,7 @@ /obj/item/assembly_holder/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) /obj/item/assembly_holder/Destroy() QDEL_LAZYLIST(assemblies) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index f0e9b5136ee8..e48ae62b576a 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -28,7 +28,7 @@ /obj/item/assembly/infra/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) /obj/item/assembly/infra/Destroy() QDEL_NULL(active_beam) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 2b2065a67a04..fb61b7c74ab8 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -3,7 +3,7 @@ desc = "A handy little spring-loaded trap for catching pesty rodents." icon_state = "mousetrap" inhand_icon_state = "mousetrap" - custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT, /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) assembly_behavior = ASSEMBLY_TOGGLEABLE_INPUT var/armed = FALSE drop_sound = 'sound/items/handling/component_drop.ogg' diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 72a2395641d9..0c122e7c8514 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -45,7 +45,7 @@ return user.visible_message(span_suicide("[user]'s [src] receives a signal, killing [user.p_them()] instantly!")) user.set_suicide(TRUE) - user.adjustOxyLoss(200)//it sends an electrical pulse to their heart, killing them. or something. + user.adjust_oxy_loss(200)//it sends an electrical pulse to their heart, killing them. or something. user.death(FALSE) playsound(user, 'sound/machines/beep/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) qdel(src) diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index b0dd20dec231..ddcdfae5745c 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -21,7 +21,7 @@ /obj/item/assembly/timer/proc/manual_suicide(mob/living/user) user.visible_message(span_suicide("[user]'s time is up!")) - user.adjustOxyLoss(200) + user.adjust_oxy_loss(200) user.death(FALSE) /obj/item/assembly/timer/Initialize(mapload) diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index ebf9d71a8ddf..7d3acb19f169 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -33,7 +33,7 @@ . = ..() . += span_notice("Use a multitool to swap between \"inclusive\", \"exclusive\", \"recognizer\", and \"voice sensor\" mode.") -/obj/item/assembly/voice/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/obj/item/assembly/voice/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/item/assembly/voice/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) . = ..() if(message_mods[WHISPER_MODE] || message_mods[MODE_RELAY]) //Too quiet lad return FALSE diff --git a/code/modules/asset_cache/assets/body_zones.dm b/code/modules/asset_cache/assets/body_zones.dm index cbdf268f6c1a..388b57b57e24 100644 --- a/code/modules/asset_cache/assets/body_zones.dm +++ b/code/modules/asset_cache/assets/body_zones.dm @@ -6,6 +6,7 @@ /datum/asset/simple/body_zones/register() assets["body_zones.base_midnight.png"] = icon('icons/hud/screen_midnight.dmi', "zone_sel") + assets["body_zones.base_slimecore.png"] = icon('icons/hud/screen_slimecore.dmi', "zone_sel") add_limb(BODY_ZONE_HEAD) add_limb(BODY_ZONE_CHEST) diff --git a/code/modules/asset_cache/assets/chat.dm b/code/modules/asset_cache/assets/chat.dm index 471e8ce85dc6..c6d6ebe6a459 100644 --- a/code/modules/asset_cache/assets/chat.dm +++ b/code/modules/asset_cache/assets/chat.dm @@ -4,10 +4,11 @@ /datum/asset/spritesheet_batched/chat/create_spritesheets() insert_all_icons("emoji", EMOJI_SET) // pre-loading all lanugage icons also helps to avoid meta - insert_all_icons("language", 'icons/ui/chat/language.dmi') + insert_all_icons("language", 'modular_darkpack/master_files/icons/ui/chat/language.dmi') // DARKPACK EDIT CHANGE - LANGUAGES + insert_all_icons("phone", 'modular_darkpack/modules/phones/icons/chat_icon.dmi') // DARKPACK EDIT CHANGE - PHONES // catch languages which are pulling icons from another file for(var/datum/language/L as anything in subtypesof(/datum/language)) var/icon = initial(L.icon) - if (icon != 'icons/ui/chat/language.dmi') + if (icon != 'modular_darkpack/master_files/icons/ui/chat/language.dmi') // DARKPACK EDIT CHANGE - LANGUAGES var/icon_state = initial(L.icon_state) insert_icon("language-[icon_state]", uni_icon(icon, icon_state)) diff --git a/code/modules/asset_cache/assets/fish.dm b/code/modules/asset_cache/assets/fish.dm index 1399f8e35a33..dbcb21314f33 100644 --- a/code/modules/asset_cache/assets/fish.dm +++ b/code/modules/asset_cache/assets/fish.dm @@ -3,7 +3,7 @@ /datum/asset/spritesheet_batched/fish/create_spritesheets() var/list/id_list = list() - for (var/obj/item/fish/fish_type as anything in subtypesof(/obj/item/fish)) + for (var/obj/item/fish/fish_type as anything in valid_subtypesof(/obj/item/fish)) // DARKPACK EDIT CHANGE - FISHING var/fish_icon = initial(fish_type.icon) var/fish_icon_state = initial(fish_type.icon_state) var/id = sanitize_css_class_name("[fish_icon][fish_icon_state]") diff --git a/code/modules/asset_cache/transports/asset_transport.dm b/code/modules/asset_cache/transports/asset_transport.dm index 3a07160ae0aa..4e2f3a301760 100644 --- a/code/modules/asset_cache/transports/asset_transport.dm +++ b/code/modules/asset_cache/transports/asset_transport.dm @@ -120,7 +120,7 @@ if (!keep_local_name) new_asset_name = "asset.[ACI.hash][ACI.ext]" if (client.sent_assets[new_asset_name] == asset_hash) - if (GLOB.Debug2) + if (GLOB.debugging_enabled) log_asset("DEBUG: Skipping send of `[asset_name]` (as `[new_asset_name]`) for `[client]` because it already exists in the client's sent_assets list") continue unreceived[asset_name] = ACI diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index f3eec5be260d..5afb71e0329c 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -21,6 +21,9 @@ * is handled by the hotspot itself, specifically perform_exposure(). */ /turf/open/hotspot_expose(exposed_temperature, exposed_volume, soh) + if(exposed_temperature < TCMB) + exposed_temperature = TCMB + CRASH("[src].hotspot_expose() called with exposed_temperature < [TCMB]") //If the air doesn't exist we just return false var/list/air_gases = air?.gases if(!air_gases) @@ -172,6 +175,11 @@ if(!istype(location) || !location.air) return FALSE + // DARKPACK EDIT ADD START - TURF_FIRE + if(SEND_SIGNAL(location, COMSIG_TURF_HOTSPOT_EXPOSE) & SUPPRESS_FIRE) + return FALSE + // DARKPACK EDIT ADD END + if(location.active_hotspot && location.active_hotspot != src) // If we're attempting to spawn on a turf which *just* had a hotspot spawned on it, abort and kill ourselves if(location.active_hotspot.just_spawned) @@ -452,11 +460,13 @@ var/turf/open/sound_turf = locate(average_x, average_y, average_Z) if(sound) sound.falloff_distance = drop_off_dist + sound.extra_range = drop_off_dist if(sound_turf != current_sound_loc) sound.parent = sound_turf return sound = new(sound_turf, TRUE) sound.falloff_distance = drop_off_dist + sound.extra_range = drop_off_dist current_sound_loc = sound_turf #undef MIN_SIZE_SOUND diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index ffd45abb6008..64cd36ca239e 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -7,10 +7,10 @@ //Builds a list of gas id to reaction group for(var/gas_id in GLOB.meta_gas_info) priority_reactions[gas_id] = list( - PRIORITY_PRE_FORMATION = list(), - PRIORITY_FORMATION = list(), - PRIORITY_POST_FORMATION = list(), - PRIORITY_FIRE = list() + /* PRIORITY_PRE_FORMATION = */ list(), + /* PRIORITY_FORMATION = */ list(), + /* PRIORITY_POST_FORMATION = */ list(), + /* PRIORITY_FIRE = */ list() ) for(var/datum/gas_reaction/reaction as anything in subtypesof(/datum/gas_reaction)) diff --git a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm index 9013e31b632f..4392a804d96f 100644 --- a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm +++ b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm @@ -90,13 +90,11 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) /obj/machinery/airalarm/get_save_vars() return ..() - NAMEOF(src, name) -/obj/machinery/airalarm/Initialize(mapload, ndir, nbuild) +/obj/machinery/airalarm/Initialize(mapload) . = ..() set_wires(new /datum/wires/airalarm(src)) - if(ndir) - setDir(ndir) - if(nbuild) + if(!mapload) buildstage = AIR_ALARM_BUILD_NO_CIRCUIT set_panel_open(TRUE) @@ -123,15 +121,18 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) select_mode(src, /datum/air_alarm_mode/filtering, should_apply = FALSE) AddElement(/datum/element/connect_loc, atmos_connections) - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/air_alarm_general, - /obj/item/circuit_component/air_alarm, - /obj/item/circuit_component/air_alarm_scrubbers, - /obj/item/circuit_component/air_alarm_vents - )) + AddComponent(/datum/component/usb_port, \ + typecacheof(list( + /obj/item/circuit_component/air_alarm_general, + /obj/item/circuit_component/air_alarm, + /obj/item/circuit_component/air_alarm_scrubbers, + /obj/item/circuit_component/air_alarm_vents + ), only_root_path = TRUE) \ + ) GLOB.air_alarms += src - find_and_hang_on_wall() + if(mapload) + find_and_mount_on_atom() register_context() check_enviroment() 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 67d2ba9fdc06..943a10766bb6 100644 --- a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm +++ b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm @@ -51,7 +51,7 @@ return FALSE /obj/machinery/airalarm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - if(rcd_data["[RCD_DESIGN_MODE]"] == RCD_WALLFRAME) + if(rcd_data[RCD_DESIGN_MODE] == RCD_WALLFRAME) balloon_alert(user, "circuit installed") buildstage = AIR_ALARM_BUILD_NO_WIRES update_appearance() @@ -186,3 +186,10 @@ icon_state = "alarm_bitem" result_path = /obj/machinery/airalarm pixel_shift = 27 + +/obj/item/wallframe/airalarm/try_build(atom/support, mob/user) + var/area/A = get_area(user) + if(A.always_unpowered) + balloon_alert(user, "cannot place in this area!") + return FALSE + return ..() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index eb966f318b63..546d2818ebcf 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -20,7 +20,7 @@ /obj/machinery/atmospherics/components/binary/circulator/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) //default cold circ for mappers /obj/machinery/atmospherics/components/binary/circulator/cold diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index f281fee74f26..cf729cef15f4 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -24,9 +24,7 @@ /obj/machinery/atmospherics/components/binary/pump/Initialize(mapload) . = ..() - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/atmos_pump, - )) + AddComponent(/datum/component/usb_port, typecacheof(list(/obj/item/circuit_component/atmos_pump), only_root_path = TRUE)) register_context() /obj/machinery/atmospherics/components/binary/pump/add_context(atom/source, list/context, obj/item/held_item, mob/user) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm index 812ca4b300c5..b728805cec6e 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm @@ -87,7 +87,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off. /obj/machinery/atmospherics/components/binary/valve/digital/Initialize(mapload) . = ..() - AddComponent(/datum/component/usb_port, list(/obj/item/circuit_component/digital_valve)) + AddComponent(/datum/component/usb_port, typecacheof(list(/obj/item/circuit_component/digital_valve), only_root_path = TRUE)) /obj/item/circuit_component/digital_valve display_name = "Digital Valve" 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 b287fb35874d..6ea471f74768 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -28,9 +28,11 @@ /obj/machinery/atmospherics/components/binary/volume_pump/Initialize(mapload) . = ..() - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/atmos_volume_pump, - )) + AddComponent(/datum/component/usb_port, \ + typecacheof(list( + /obj/item/circuit_component/atmos_volume_pump, + ), only_root_path = TRUE) \ + ) register_context() /obj/machinery/atmospherics/components/binary/volume_pump/click_ctrl(mob/user) @@ -69,11 +71,19 @@ var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] -// Pump mechanism just won't do anything if the pressure is too high/too low unless you overclock it. + // Pump mechanism just won't do anything if the pressure is too high/too low unless you overclock it. var/input_starting_pressure = air1.return_pressure() var/output_starting_pressure = air2.return_pressure() + // Requires being able to leak air in order to overclock. + if(overclocked) + var/turf/turf = loc + if(isclosedturf(turf)) + balloon_alert_to_viewers("jammed!") + overclocked = FALSE + update_appearance(UPDATE_ICON) + if((input_starting_pressure < VOLUME_PUMP_MINIMUM_OUTPUT_PRESSURE) || ((output_starting_pressure > VOLUME_PUMP_MAX_OUTPUT_PRESSURE)) && !overclocked) return 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 e36d99cb6d73..0e6e899778cd 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm @@ -4,7 +4,7 @@ * fusion_process() handles all the main fusion reaction logic and consequences (lightning, radiation, particles) from an active fusion reaction. */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/process(seconds_per_tick) +/obj/machinery/atmospherics/components/unary/hypertorus/core/process_atmos(seconds_per_tick) /* *Pre-checks */ @@ -21,11 +21,11 @@ // Run the reaction if it is either live or being started if (start_power || power_level) - play_ambience() + play_ambience(seconds_per_tick) fusion_process(seconds_per_tick) // Note that we process damage/healing even if the fusion process aborts. // Running out of fuel won't save you if your moderator and coolant are exploding on their own. - process_moderator_overflow() + process_moderator_overflow(seconds_per_tick) process_damageheal(seconds_per_tick) check_alert() if (start_power) @@ -34,6 +34,10 @@ check_deconstructable() + if(linked_interface) + // The interface MUST be updated after every atmos tick to show accurate information. + SStgui.update_uis(linked_interface) + /** * Called by process() * Contains the main fusion calculations and checks, for more informations check the comments along the code. @@ -202,11 +206,11 @@ radiation = max(-(PLANCK_LIGHT_CONSTANT / 5e-18) * radiation_modifier * delta_temperature, 0) power_output = efficiency * (internal_power - conduction - radiation) //Hotter air is easier to heat up and cool down - heat_limiter_modifier = 10 * (10 ** power_level) * (heating_conductor / 100) + heat_limiter_modifier = 5 * (10 ** power_level) * (heating_conductor / 100) //The amount of heat that is finally emitted, based on the power output. Min and max are variables that depends of the modifier heat_output_min = - heat_limiter_modifier * 0.01 * negative_temperature_multiplier heat_output_max = heat_limiter_modifier * positive_temperature_multiplier - heat_output = clamp(internal_instability * power_output * heat_modifier / 100, heat_output_min, heat_output_max) + heat_output = clamp(internal_instability * power_output * heat_modifier / 200, heat_output_min, heat_output_max) // Is the fusion process actually going to run? // Note we have to always perform the above calculations to keep the UI updated, so we can't use this to early return. @@ -219,9 +223,9 @@ var/production_amount switch(power_level) if(3,4) - production_amount = clamp(heat_output * 5e-4, 0, fuel_consumption_rate) * seconds_per_tick + production_amount = clamp(heat_output / 1000, 0, fuel_consumption_rate) * seconds_per_tick else - production_amount = clamp(heat_output / 10 ** (power_level+1), 0, fuel_consumption_rate) * seconds_per_tick + production_amount = clamp(heat_output * 2 / 10 ** (power_level+1), 0, fuel_consumption_rate) * seconds_per_tick // antinob production is special, and uses its own calculations from how stale the fusion mix is (via byproduct ratio and fresh fuel rate) var/dirty_production_rate = scaled_fuel_list[scaled_fuel_list[3]] / fuel_injection_rate @@ -379,7 +383,11 @@ //Modifies the internal_fusion temperature with the amount of heat output var/temperature_modifier = selected_fuel.temperature_change_multiplier if(internal_fusion.temperature <= FUSION_MAXIMUM_TEMPERATURE * temperature_modifier) - internal_fusion.temperature = clamp(internal_fusion.temperature + heat_output,TCMB,FUSION_MAXIMUM_TEMPERATURE * temperature_modifier) + internal_fusion.temperature = clamp( + internal_fusion.temperature + heat_output * seconds_per_tick, + TCMB, + FUSION_MAXIMUM_TEMPERATURE * temperature_modifier, + ) else internal_fusion.temperature -= heat_limiter_modifier * 0.01 * seconds_per_tick diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm index 10f4b8980292..ddf8f950aa1e 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm @@ -214,9 +214,9 @@ /** * Infrequently plays accent sounds, and adjusts main loop parameters */ -/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/play_ambience() +/obj/machinery/atmospherics/components/unary/hypertorus/core/proc/play_ambience(seconds_per_tick) // We play delam/neutral sounds at a rate determined by power and critical_threshold_proximity - if(last_accent_sound < world.time && prob(20)) + if(last_accent_sound < world.time && SPT_PROB(10, seconds_per_tick)) var/aggression = min(((critical_threshold_proximity / 800) * ((power_level) / 5)), 1.0) * 100 if(critical_threshold_proximity >= 300) playsound(src, SFX_HYPERTORUS_MELTING, max(50, aggression), FALSE, 40, 30, falloff_distance = 10) @@ -560,7 +560,7 @@ epicenter = loc, heavy_range = critical ? emp_heavy_size * 2 : emp_heavy_size, light_range = critical ? emp_light_size * 2 : emp_heavy_size, - log = TRUE + emp_source = src ) qdel(src) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/airlock_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/airlock_pump.dm index 1942b78cc9a1..3a3d505bc19b 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/airlock_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/airlock_pump.dm @@ -24,7 +24,8 @@ icon = 'icons/obj/machines/atmospherics/unary_devices.dmi' icon_state = "airlock_pump" pipe_state = "airlock_pump" - use_power = ACTIVE_POWER_USE + use_power = IDLE_POWER_USE + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION can_unwrench = TRUE welded = FALSE @@ -122,7 +123,10 @@ . = ..() if(mapload) can_unwrench = FALSE - + var/datum/gas_mixture/distro_air = airs[1] + var/datum/gas_mixture/waste_air = airs[2] + distro_air.volume = 1000 + waste_air.volume = 1000 /obj/machinery/atmospherics/components/unary/airlock_pump/post_machine_initialize() . = ..() @@ -153,14 +157,6 @@ tile_air_pressure = max(0, local_turf.return_air().return_pressure()) on_dock_request(tile_air_pressure) -/obj/machinery/atmospherics/components/unary/airlock_pump/Initialize(mapload) - . = ..() - var/datum/gas_mixture/distro_air = airs[1] - var/datum/gas_mixture/waste_air = airs[2] - distro_air.volume = 1000 - waste_air.volume = 1000 - - /obj/machinery/atmospherics/components/unary/airlock_pump/on_deconstruction(disassembled) . = ..() if(cycling_set_up) @@ -176,6 +172,12 @@ to_chat(user, span_warning("You cannot unwrench [src], wait for the cycle completion!")) return FALSE +/obj/machinery/atmospherics/components/unary/airlock_pump/set_on(active) + . = ..() + if(active) + update_use_power(ACTIVE_POWER_USE) + else + update_use_power(IDLE_POWER_USE) /obj/machinery/atmospherics/components/unary/airlock_pump/process_atmos() if(!on) @@ -336,7 +338,6 @@ return TRUE - ///Complete/Abort cycle with the passed message /obj/machinery/atmospherics/components/unary/airlock_pump/proc/stop_cycle(message = null, unbolt_only = FALSE) if(!on) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 7dd07ab59907..303f905a086f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -20,6 +20,7 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT pixel_y = 22 appearance_flags = KEEP_TOGETHER + vis_flags = VIS_INHERIT_PLANE /// The current occupant being presented var/mob/living/occupant @@ -569,10 +570,10 @@ occupant_data["health"] = mob_occupant.health occupant_data["maxHealth"] = mob_occupant.maxHealth - occupant_data["bruteLoss"] = mob_occupant.getBruteLoss() - occupant_data["oxyLoss"] = mob_occupant.getOxyLoss() - occupant_data["toxLoss"] = mob_occupant.getToxLoss() - occupant_data["fireLoss"] = mob_occupant.getFireLoss() + occupant_data["bruteLoss"] = mob_occupant.get_brute_loss() + occupant_data["oxyLoss"] = mob_occupant.get_oxy_loss() + occupant_data["toxLoss"] = mob_occupant.get_tox_loss() + occupant_data["fireLoss"] = mob_occupant.get_fire_loss() .["occupant"] = occupant_data var/datum/gas_mixture/air1 = internal_connector.gas_connector.airs[1] @@ -680,10 +681,14 @@ /datum/aas_config_entry/medical_cryo_announcements/compile_announce(list/variables_map, announcement_line) variables_map["AUTOEJECTING"] = variables_map["EJECTING"] ? announcement_lines_map["Autoejecting"] : "" - . = ..() - // Why double replacetext_char? Well, to handle cases where variable in the middle of sentence like "also %AUTOEJECTING this", so there will be no double spaces - // Yeah I am bad, at this, sorry (it should be a perfect place for regex usage, but I am weak) - . = trim(replacetext_char(replacetext_char(., "\[NO DATA\] ", ""), "\[NO DATA\]", "")) + var/list/exploded_string = splittext_char(..(), "\[NO DATA\]") + var/list/trimed_message = list() + for (var/line in exploded_string) + line = trim(line) + if (line) + trimed_message += line + // Rebuild the string without empty lines + . = trimed_message.Join(" ") #undef MAX_TEMPERATURE #undef CRYO_MULTIPLY_FACTOR 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 c8bfd8628e9b..4f1f4a2aa645 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm @@ -17,7 +17,6 @@ ..() update_appearance() - /obj/machinery/atmospherics/components/unary/click_alt(mob/living/beno) beno.handle_ventcrawl(src) return CLICK_ACTION_SUCCESS diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index d74841072e24..0d1b66bdaee6 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -36,9 +36,11 @@ if(!target) reattach_to_layer() - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/atmos_meter, - )) + AddComponent(/datum/component/usb_port, \ + typecacheof(list( + /obj/item/circuit_component/atmos_meter, + ), only_root_path = TRUE) \ + ) return ..() /obj/machinery/meter/proc/reattach_to_layer() diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index 362e2d1c9e72..f61ebf3766be 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -12,6 +12,9 @@ icon_state = "miner" density = FALSE resistance_flags = INDESTRUCTIBLE|ACID_PROOF|FIRE_PROOF + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 1.5 + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 1.25 + initialize_directions = NONE var/spawn_id = null var/spawn_temp = T20C /// Moles of gas to spawn per second @@ -26,9 +29,6 @@ var/power_draw_dynamic_kpa_coeff = 0.5 var/broken = FALSE var/broken_message = "ERROR" - idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 1.5 - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - initialize_directions = NONE /obj/machinery/atmospherics/miner/Initialize(mapload) . = ..() diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index b1615a82032f..7ed1d9ca32a8 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -18,6 +18,7 @@ integrity_failure = 0.4 pressure_resistance = 7 * ONE_ATMOSPHERE req_access = list() + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 10) ///Is the valve open? var/valve_open = FALSE diff --git a/code/modules/autowiki/pages/fishing.dm b/code/modules/autowiki/pages/fishing.dm index 57ce95712fd3..b82c9994faa3 100644 --- a/code/modules/autowiki/pages/fishing.dm +++ b/code/modules/autowiki/pages/fishing.dm @@ -12,7 +12,7 @@ var/def_breeding_text = DisplayTimeText(def_breeding) var/list/generated_icons = list() - var/list/fish_types = subtypesof(/obj/item/fish) + var/list/fish_types = valid_subtypesof(/obj/item/fish) // DARKPACK EDIT CHANGE - FISHING sortTim(fish_types, GLOBAL_PROC_REF(cmp_fish_fluid)) for (var/obj/item/fish/fish as anything in fish_types) diff --git a/code/modules/autowiki/pages/stockparts.dm b/code/modules/autowiki/pages/stockparts.dm index 7d2b68b236b2..715006014826 100644 --- a/code/modules/autowiki/pages/stockparts.dm +++ b/code/modules/autowiki/pages/stockparts.dm @@ -18,11 +18,7 @@ /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 - + for(var/part_type in valid_subtypesof(/obj/item/stock_parts)) if(!battery_whitelist.Find(part_type) && ispath(part_type, /obj/item/stock_parts/power_store)) continue diff --git a/code/modules/autowiki/pages/surgery.dm b/code/modules/autowiki/pages/surgery.dm new file mode 100644 index 000000000000..029267788f94 --- /dev/null +++ b/code/modules/autowiki/pages/surgery.dm @@ -0,0 +1,125 @@ +/datum/autowiki/surgery + page = "Template:Autowiki/Content/Surgeries" + var/list/already_generated_tools = list() + +/datum/autowiki/surgery/generate() + var/output = "" + + var/list/unlocked_operations_alpha = list() + var/list/locked_operations_alpha = list() + for(var/op_type, op_datum in GLOB.operations.operations_by_typepath) + if(op_type in GLOB.operations.locked) + locked_operations_alpha += op_datum + else + unlocked_operations_alpha += op_datum + + // sorts all unlocked operations alphabetically by name, then followed by all locked operations by name + sortTim(unlocked_operations_alpha, GLOBAL_PROC_REF(cmp_name_asc)) + sortTim(locked_operations_alpha, GLOBAL_PROC_REF(cmp_name_asc)) + + for(var/datum/surgery_operation/operation as anything in unlocked_operations_alpha + locked_operations_alpha) + if(operation.operation_flags & OPERATION_NO_WIKI) + continue + + var/list/operation_data = list() + var/locked = (operation in locked_operations_alpha) + + operation_data["name"] = escape_value(capitalize(replacetext(operation.rnd_name || operation.name, "\"", """))) + operation_data["description"] = escape_value(replacetext(operation.rnd_desc || operation.desc, "\"", """)) + + var/list/raw_reqs = operation.get_requirements() + if(length(raw_reqs[2]) == 1) + raw_reqs[1] += raw_reqs[2] + raw_reqs[2] = list() + + operation_data["hard_requirements"] = format_requirement_list(raw_reqs[1]) + operation_data["soft_requirements"] = format_requirement_list(raw_reqs[2]) + operation_data["optional_requirements"] = format_requirement_list(raw_reqs[3]) + operation_data["blocker_requirements"] = format_requirement_list(raw_reqs[4]) + + operation_data["tools"] = format_tool_list(operation) + + var/type_id = LOWER_TEXT(replacetext("[operation.type]", "[/datum/surgery_operation]", "")) + var/filename = "surgery_[SANITIZE_FILENAME(escape_value(type_id))]" + operation_data["icon"] = filename + + var/image/radial_base = image('icons/hud/screen_alert.dmi', "template") + var/image/radial_overlay = operation.get_default_radial_image() + radial_overlay.plane = radial_base.plane + radial_overlay.layer = radial_base.layer + 1 + radial_base.overlays += radial_overlay + + upload_icon(getFlatIcon(radial_base, no_anim = TRUE), filename) + + operation_data["cstyle"] = "" + if(locked && (operation.operation_flags & OPERATION_MECHANIC)) + operation_data["cstyle"] = "background: linear-gradient(115deg, [COLOR_VOID_PURPLE] 50%, [COLOR_DARK_MODERATE_LIME_GREEN] 50%); color: [COLOR_WHITE];" + else if(locked) + operation_data["cstyle"] = "background-color: [COLOR_VOID_PURPLE]; color: [COLOR_WHITE];" + else if(operation.operation_flags & OPERATION_MECHANIC) + operation_data["cstyle"] = "background-color: [COLOR_DARK_MODERATE_LIME_GREEN]; color: [COLOR_WHITE];" + + output += include_template("Autowiki/SurgeryTemplate", operation_data) + + return include_template("Autowiki/SurgeryTableTemplate", list("content" = output)) + +/datum/autowiki/surgery/proc/format_requirement_list(list/requirements) + var/output + for(var/requirement in requirements) + output += "
  • [escape_value(capitalize(requirement))]
  • " + + return output ? "
      [output]
    " : "" + +/datum/autowiki/surgery/proc/format_tool_list(datum/surgery_operation/operation) + var/output = "" + + // tools which should not show up in the tools list + var/list/blacklisted_tool_types = list( + /obj/item/shovel/giant_wrench, // easter egg interaction + ) + + for(var/tool, multiplier in operation.implements) + if(tool in blacklisted_tool_types) + continue + + var/list/tool_info = list() + + tool_info["tool_multiplier"] = multiplier + + var/tool_name = escape_value(get_tool_name(operation, tool)) + tool_info["tool_name"] = tool_name + + var/tool_id = LOWER_TEXT(replacetext("[tool_name]", " ", "_")) + var/tool_icon = "surgery_tool_[SANITIZE_FILENAME(tool_id)]" // already escaped + tool_info["tool_icon"] = tool_icon + + if(!already_generated_tools[tool_icon]) + already_generated_tools[tool_icon] = TRUE + var/image/tool_image = get_tool_icon(tool) + upload_icon(getFlatIcon(tool_image, no_anim = TRUE), tool_icon) + + output += include_template("Autowiki/SurgeryToolTemplate", tool_info) + + return output + +/datum/autowiki/surgery/proc/get_tool_name(datum/surgery_operation/operation, obj/item/tool) + if(istext(tool)) + return capitalize(tool) + if(tool == /obj/item) + return operation.get_any_tool() + return capitalize(format_text(tool::name)) + +/datum/autowiki/surgery/proc/get_tool_icon(obj/item/tool) + if(tool == IMPLEMENT_HAND) + return image(/obj/item/hand_item) + if(istext(tool)) + return GLOB.tool_to_image[tool] || image('icons/effects/random_spawners.dmi', "questionmark") + if(tool == /obj/item) + return image('icons/effects/random_spawners.dmi', "questionmark") + if(ispath(tool, /obj/item/melee/energy)) // snowflake for soul reasons + return image(tool::icon, "[tool::icon_state]_on") + if(ispath(tool, /obj/item/bodypart)) // snowflake for readability + return image('icons/obj/medical/surgery_ui.dmi', "surgery_limbs") + if(ispath(tool, /obj/item/organ)) // snowflake for readability + return image('icons/obj/medical/surgery_ui.dmi', "surgery_chest") + return image(tool) diff --git a/code/modules/awaymissions/cordon.dm b/code/modules/awaymissions/cordon.dm index 738efa1d7c21..5a84b4381dac 100644 --- a/code/modules/awaymissions/cordon.dm +++ b/code/modules/awaymissions/cordon.dm @@ -58,7 +58,7 @@ icon_state = "cordon" static_lighting = FALSE base_lighting_alpha = 255 - area_flags = UNIQUE_AREA|NOTELEPORT|HIDDEN_AREA + area_flags = NOTELEPORT|HIDDEN_AREA requires_power = FALSE /area/misc/cordon/Entered(atom/movable/arrived, area/old_area) diff --git a/code/modules/awaymissions/mission_code/heretic/cbrn.dm b/code/modules/awaymissions/mission_code/heretic/cbrn.dm new file mode 100644 index 000000000000..7c73b0edda33 --- /dev/null +++ b/code/modules/awaymissions/mission_code/heretic/cbrn.dm @@ -0,0 +1,22 @@ +/obj/item/clothing/head/utility/radiation/cbrnhood + name = "\improper CBRN hood" + desc = "A hood with radiation protective properties along with acidic and biological protective properties. The label reads, 'Made with thin lead sheets, please do not consume.'" + armor_type = /datum/armor/utility_radiation/cbrn + +/datum/armor/utility_radiation/cbrn + melee = 60 + bullet = 40 + laser = 30 + energy = 80 + bomb = 20 + bio = 100 + fire = 75 + acid = 100 + wound = 25 + +/obj/item/clothing/suit/utility/radiation/cbrnsuit + name = "\improper CBRN suit" + desc = "A hood with radiation protective properties along with acidic and biological protective properties. The label reads, 'Made with thin lead sheets, please do not consume.'" + allowed = null + slowdown = 0 + armor_type = /datum/armor/utility_radiation/cbrn diff --git a/code/modules/awaymissions/mission_code/heretic/fake_items.dm b/code/modules/awaymissions/mission_code/heretic/fake_items.dm new file mode 100644 index 000000000000..ab6c72941cea --- /dev/null +++ b/code/modules/awaymissions/mission_code/heretic/fake_items.dm @@ -0,0 +1,57 @@ +/obj/item/fake_items + name = "An item, of which is fake" + desc = "If you see this you feel like you should contact an 'admin' or make an 'issue report' whatever that means" + icon = 'icons/ui/chat/pepe.dmi' + icon_state = "rare_pepe" + +/obj/item/fake_items/sm_sliver + name = "supermatter sliver" + desc = "A tiny, highly volatile sliver of a supermatter crystal. Do not handle without protection!" + icon = 'icons/obj/antags/syndicate_tools.dmi' + icon_state = "supermatter_sliver" + anchored = 1 + +/obj/item/fake_items/feddy_fazbear + name = "Springlock Module" + desc = "A springlock module disguised as a dna lock module, thankfully there is a note on it telling you this." + icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' + icon_state = /obj/item/mod/module/dna_lock::icon_state + anchored = 1 + +/obj/item/fake_items/time_stopper + name = "MOD timestopper module" + desc = "A module that can halt time in a small radius around the user... for as long as they \ + want! Great for monologues or lunch breaks. Keep in mind moving will end the stop, and the \ + module has a hefty cooldown period to avoid reality errors." + icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' + icon_state = "timestop" + anchored = 1 + +/obj/item/fake_items/wabbajack + name = "Wabbajack" + desc = "If there is some deity out there, they've definitely skipped their psych appointment before creating this." + icon = 'icons/obj/weapons/guns/magic.dmi' + icon_state = "the_wabbajack" + anchored = 1 + +/obj/item/fake_items/abductor_win_stick + name = "advanced baton" + desc = "A quad-mode baton used for incapacitation and restraining of specimens." + icon = 'icons/obj/antags/abductor.dmi' + icon_state = "wonderprodStun" + anchored = 1 + +/obj/item/fake_items/l6_saw + name = "L6 SAW" + desc = "A heavily modified 7mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation." + icon = 'icons/obj/weapons/guns/ballistic.dmi' + icon_state = "l6" + anchored = 1 + +/obj/item/fake_items/lahti_l39 + name = "Lahti L-39" + desc = "The Lahti L-39, now manufactured in space with better materials making it more portable and reliable- still loaded in the same massive cartridge, \ + this thing was made to go through a tank and come out the other end- imagine what it could do to an exosuit, there's also a completely useless sight which is totally obstructed by the magazine." + icon = 'icons/obj/weapons/guns/lahtil39.dmi' + icon_state = "lahtil" + anchored = 1 diff --git a/code/modules/awaymissions/mission_code/heretic/heretic.dm b/code/modules/awaymissions/mission_code/heretic/heretic.dm new file mode 100644 index 000000000000..9613bdbdde5e --- /dev/null +++ b/code/modules/awaymissions/mission_code/heretic/heretic.dm @@ -0,0 +1,22 @@ +/area/awaymission/beach/heretic + name = "heretic beach" + icon_state = "away2" + requires_power = FALSE + static_lighting = TRUE + area_flags = NOTELEPORT + default_gravity = 1 + +/area/awaymission/caves/heretic_laboratory + name = "heretic lab" + requires_power = FALSE + static_lighting = TRUE + area_flags = NOTELEPORT + default_gravity = 1 + +/area/awaymission/caves/heretic_laboratory_clean + name = "heretic lab clean" + icon_state = "away2" + requires_power = FALSE + static_lighting = TRUE + area_flags = NOTELEPORT + default_gravity = 1 diff --git a/code/modules/awaymissions/mission_code/heretic/heretic_gateway_guns.dm b/code/modules/awaymissions/mission_code/heretic/heretic_gateway_guns.dm new file mode 100644 index 000000000000..a8990d14474e --- /dev/null +++ b/code/modules/awaymissions/mission_code/heretic/heretic_gateway_guns.dm @@ -0,0 +1,52 @@ +/obj/item/gun/energy/shrink_ray/one_shot + 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, This one is jerry-rigged to work with a non alien cell. It still recharges though." + ammo_type = list(/obj/item/ammo_casing/energy/shrink/worse) + +/obj/item/ammo_casing/energy/shrink/worse + projectile_type = /obj/projectile/magic/shrink/alien + select_name = "shrink ray" + e_cost = LASER_SHOTS(1, STANDARD_CELL_CHARGE) + +/obj/item/gun/ballistic/automatic/napad + name = "\improper 'Napad' Submachine Gun" + desc = "A 9mm submachine gun with a sizeable magazine, there are no other markings on it, why is it so big?" + icon = 'icons/obj/weapons/guns/ninemmsmg/napad_item.dmi' + icon_state = "napad" + worn_icon = 'icons/obj/weapons/guns/ninemmsmg/napad_worn.dmi' + worn_icon_state = "napad" + lefthand_file = 'icons/obj/weapons/guns/ninemmsmg/napad_lefthand.dmi' + righthand_file = 'icons/obj/weapons/guns/ninemmsmg/napad_righthand.dmi' + inhand_icon_state = "napad" + special_mags = FALSE + bolt_type = BOLT_TYPE_LOCKING + w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_HEAVY + slot_flags = ITEM_SLOT_BACK + accepted_magazine_type = /obj/item/ammo_box/magazine/napad + fire_sound = 'sound/items/weapons/gun/rifle/smg_heavy.ogg' + fire_sound_volume = 80 + can_suppress = FALSE + burst_size = 1 + fire_delay = 0.55 SECONDS + actions_types = list() + projectile_wound_bonus = -10 + projectile_damage_multiplier = 0.65 + +/obj/item/gun/ballistic/automatic/napad/no_mag + spawnwithmagazine = FALSE + +/obj/item/ammo_box/magazine/napad + name = "\improper Napad submachinegun magazine" + desc = "A magazine for a submachine gun. Holds twenty five rounds of 9mm ammunition." + icon = 'icons/obj/weapons/guns/ammo.dmi' + icon_state = "napad_mag" + w_class = WEIGHT_CLASS_NORMAL + multiple_sprites = AMMO_BOX_FULL_EMPTY + ammo_type = /obj/item/ammo_casing/c9mm + caliber = CALIBER_9MM + max_ammo = 25 + +/obj/item/ammo_box/magazine/napad/spawns_empty + start_empty = TRUE diff --git a/code/modules/awaymissions/mission_code/heretic/heretic_gateway_misc.dm b/code/modules/awaymissions/mission_code/heretic/heretic_gateway_misc.dm new file mode 100644 index 000000000000..afa5be882afb --- /dev/null +++ b/code/modules/awaymissions/mission_code/heretic/heretic_gateway_misc.dm @@ -0,0 +1,91 @@ +/obj/item/keycard/heretic_entrance + name = "secure storage keycard" + desc = "A keycard that simply states, basic access." + color = "#000000" + puzzle_id = "heretic_gateway0" + +/obj/machinery/door/puzzle/keycard/heretic_entrance + name = "secure airlock" + puzzle_id = "heretic_gateway0" + +/obj/item/keycard/highsec_access + name = "secure storage keycard" + desc = "A keycard that simply states, 'only under exteme circumstances'." + color = "#440000" + puzzle_id = "heretic_gateway1" + +/obj/machinery/door/puzzle/keycard/highsec_access + name = "secure airlock" + puzzle_id = "heretic_gateway1" + +/obj/item/keycard/cbrn_area + name = "CBRN storage keycard" + desc = "A keycard that has a few weird logos and stickers on it all related to biohazards or radiation." + color = "#80e71f" + puzzle_id = "heretic_gateway2" + +/obj/machinery/door/puzzle/keycard/cbrn_area + name = "secure airlock" + puzzle_id = "heretic_gateway2" + +/obj/item/keycard/biological_anomalies + name = "Bio storage keycard" + desc = "A keycard that looks like the basic access card however it has a biological hazard warning on it." + color = "#357735" + puzzle_id = "heretic_gateway3" + +/obj/machinery/door/puzzle/keycard/biological_anomalies + name = "secure airlock" + puzzle_id = "heretic_gateway3" + +/obj/item/keycard/weapon_anomalies + name = "Weapon storage keycard" + desc = "A keycard that looks like the basic access card however it has a simple recognizable handgun on it." + color = "#4b4b4b" + puzzle_id = "heretic_gateway4" + +/obj/machinery/door/puzzle/keycard/weapon_anomalies + name = "secure airlock" + puzzle_id = "heretic_gateway4" + +/obj/item/keycard/misc_anomalies + name = "Misc storage keycard" + desc = "A keycard that looks like the basic access card however it has a staff on it." + color = "#df2190" + puzzle_id = "heretic_gateway5" + +/obj/machinery/door/puzzle/keycard/misc_anomalies + name = "secure airlock" + puzzle_id = "heretic_gateway5" + +/obj/item/paper/fluff/awaymissions/heretic + name = "a hint" + desc = "This place was designed with many failsafes to keep whats in it safe" + +/obj/item/paper/fluff/awaymissions/heretic/floorsafe + default_raw_text = "
  • X X X X X X X X X X
  • \ +
  • X X X X X X X X X X
  • \ +
  • X X X X X X X X X X
  • \ +
  • X X X X X X X X X X
  • \ +
  • X X X X X X X X X X
  • \ +
  • X X X X X X X X X X
  • \ +
  • X X + X X X X X X X
  • \ +
  • X X X X X X X X X X
  • \ +
  • X X X X X X X X X X
  • \ +
  • X X X X X X X X X X
  • " + +/obj/item/paper/fluff/awaymissions/heretic/blackroomhint + default_raw_text = "Hey, one of the high sec guards came through and closed things off and told us to evacuate, they hid the keycard to the facility in this room in its proper spot. If you can read this it should be fine and remember to look into the walls to find the keycard." + +/obj/item/paper/fluff/awaymissions/heretic/gravehint + default_raw_text = "there are rumors around the office that there are a few fake graves in the graveyard down the way that are empty and instead have, insurance- in them whatever that means, Yours truly, Jeramy." + +/turf/open/misc/ashplanet/wateryrock/safeair + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + +/obj/machinery/mass_driver/feeder + name = "mass driver" + id = "MASSDRIVER_HERETIC" + +/obj/machinery/computer/pod/old/mass_driver_controller/feeder + id = "MASSDRIVER_HERETIC" diff --git a/code/modules/awaymissions/mission_code/heretic/heretic_gateway_spawners.dm b/code/modules/awaymissions/mission_code/heretic/heretic_gateway_spawners.dm new file mode 100644 index 000000000000..8997813061ee --- /dev/null +++ b/code/modules/awaymissions/mission_code/heretic/heretic_gateway_spawners.dm @@ -0,0 +1,21 @@ +/obj/effect/spawner/random/heretic_gateway + name = "random heretic keycard spawn" + desc = "Spawns a random keycard, but probably trash." + loot = list( + /obj/item/keycard/cbrn_area = 5, + /obj/item/keycard/biological_anomalies = 20, + /obj/item/keycard/misc_anomalies = 20, + /obj/item/keycard/weapon_anomalies = 20, + /obj/effect/spawner/random/trash/deluxe_garbage = 35 + ) + +/obj/effect/spawner/random/heretic_gateway_low + name = "random heretic keycard spawn" + desc = "Spawns a random keycard, but definitely just trash." + loot = list( + /obj/item/keycard/cbrn_area = 0.5, + /obj/item/keycard/biological_anomalies = 5, + /obj/item/keycard/misc_anomalies = 5, + /obj/item/keycard/weapon_anomalies = 4, + /obj/effect/spawner/random/trash/deluxe_garbage = 85.5 + ) diff --git a/code/modules/awaymissions/mission_code/heretic/heretic_gateway_tram.dm b/code/modules/awaymissions/mission_code/heretic/heretic_gateway_tram.dm new file mode 100644 index 000000000000..bd6360766332 --- /dev/null +++ b/code/modules/awaymissions/mission_code/heretic/heretic_gateway_tram.dm @@ -0,0 +1,29 @@ +/obj/effect/landmark/transport/transport_id/heretic + specific_transport_id = HERETIC_LINE_1 + +/obj/effect/landmark/transport/nav_beacon/tram/nav/heretic + name = HERETIC_LINE_1 + specific_transport_id = TRAM_NAV_BEACONS + +/obj/effect/landmark/transport/nav_beacon/tram/platform/heretic/left + name = "Port" + specific_transport_id = HERETIC_LINE_1 + platform_code = HERETIC_PORT + +/obj/effect/landmark/transport/nav_beacon/tram/platform/heretic/middle + name = "Central" + specific_transport_id = HERETIC_LINE_1 + platform_code = HERETIC_CENTRAL + +/obj/effect/landmark/transport/nav_beacon/tram/platform/heretic/right + name = "Starboard" + specific_transport_id = HERETIC_LINE_1 + platform_code = HERETIC_STARBOARD + +/obj/machinery/transport/tram_controller/heretic_tram_controller + configured_transport_id = HERETIC_LINE_1 + +/obj/machinery/computer/tram_controls/heretic_tram_computer + icon = 'icons/obj/tram/heretic_tram.dmi' + icon_screen = HERETIC_LINE_1 + specific_transport_id = HERETIC_LINE_1 diff --git a/code/modules/awaymissions/mission_code/heretic/zlevel.dm b/code/modules/awaymissions/mission_code/heretic/zlevel.dm new file mode 100644 index 000000000000..792be643b3a6 --- /dev/null +++ b/code/modules/awaymissions/mission_code/heretic/zlevel.dm @@ -0,0 +1,3 @@ +/obj/effect/landmark/awaystart/heretic + name = "Heretic" + id = AWAYSTART_HERETIC diff --git a/code/modules/awaymissions/signpost.dm b/code/modules/awaymissions/signpost.dm index 94c71287eefb..b822043b4a21 100644 --- a/code/modules/awaymissions/signpost.dm +++ b/code/modules/awaymissions/signpost.dm @@ -1,70 +1,45 @@ -/*An alternative to exit gateways, signposts send you back to somewhere safe onstation with their semiotic magic.*/ /obj/structure/signpost + name = "signpost" + desc = "Won't somebody give me a sign?" icon = 'icons/obj/fluff/general.dmi' icon_state = "signpost" anchored = TRUE density = TRUE - var/question = "Travel back?" - var/list/zlevels + + /// Whether or not this enables the Houlihan element. + var/teleports = FALSE + /// Optional replacement for the teleport question. + var/question = null + /// Optional list of z-levels that the Houlihan element can send us to. Modify this on Initialize(). + VAR_FINAL/list/zlevels = null /obj/structure/signpost/Initialize(mapload) - . = ..() + ..() set_light(2) - zlevels = SSmapping.levels_by_trait(ZTRAIT_STATION) - -/obj/structure/signpost/interact(mob/user) - . = ..() - if(.) - return - if(tgui_alert(usr,question,name,list("Yes","No")) == "Yes" && Adjacent(user)) - var/turf/T = zlevels ? find_safe_turf(zlevels=zlevels) : get_safe_random_station_turf_equal_weight() - - if(T) - var/atom/movable/AM = user.pulling - if(AM) - AM.forceMove(T) - user.forceMove(T) - if(AM) - user.start_pulling(AM) - to_chat(user, span_notice("You blink and find yourself in [get_area_name(T)].")) - else - to_chat(user, "Nothing happens. You feel that this is a bad sign.") - -/obj/structure/signpost/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - return interact(user) + return INITIALIZE_HINT_LATELOAD -/obj/structure/signpost/attack_paw(mob/user, list/modifiers) - return interact(user) +/obj/structure/signpost/LateInitialize() + // This is here cause we wanna be super sure zlevels is properly initialized + if(teleports) + AddComponent(/datum/component/houlihan_teleport, question, zlevels) -/obj/structure/signpost/attack_hulk(mob/user) - return - -/obj/structure/signpost/attack_larva(mob/user, list/modifiers) - return interact(user) - -/obj/structure/signpost/attack_robot(mob/user) - if (Adjacent(user)) - return interact(user) - -/obj/structure/signpost/attack_animal(mob/user, list/modifiers) - return interact(user) +/* ----------------- */ /obj/structure/signpost/salvation name = "\proper salvation" desc = "In the darkest times, we will find our way home." resistance_flags = INDESTRUCTIBLE - -/obj/structure/signpost/exit - name = "exit" - desc = "Make sure to bring all your belongings with you when you \ - exit the area." - question = "Leave? You might never come back." - -/obj/structure/signpost/exit/Initialize(mapload) + teleports = TRUE + +/obj/structure/signpost/void + name = "signpost at the edge of the universe" + desc = "A direction in the directionless void." + density = FALSE + /// Brightness of the signpost. + var/range = 2 + /// Light power of the signpost. + var/power = 0.8 + +/obj/structure/signpost/void/Initialize(mapload) . = ..() - zlevels = list() - for(var/i in 1 to world.maxz) - zlevels += i - zlevels -= SSmapping.levels_by_trait(ZTRAIT_CENTCOM) // no easy victory, even with meme signposts - // also, could you think of the horror if they ended up in a holodeck - // template or something + set_light(range, power) diff --git a/code/modules/basketball/basketball.dm b/code/modules/basketball/basketball.dm index 274a9602546e..cd811f75d59a 100644 --- a/code/modules/basketball/basketball.dm +++ b/code/modules/basketball/basketball.dm @@ -94,7 +94,7 @@ for(var/i in 1 to 6) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), src, 'sound/items/basketball_bounce.ogg', 75, FALSE), 0.25 SECONDS * i) - addtimer(CALLBACK(user, TYPE_PROC_REF(/mob/living/carbon/, adjustStaminaLoss), STAMINA_COST_SPINNING), 1.5 SECONDS) + addtimer(CALLBACK(user, TYPE_PROC_REF(/mob/living/carbon/, adjust_stamina_loss), STAMINA_COST_SPINNING), 1.5 SECONDS) /// Used to calculate our disarm chance based on stamina, direction, and spinning /// Note - monkeys use attack_paw() and never trigger this signal (so they always have 100% disarm) @@ -104,12 +104,12 @@ // spinning gives you a lower disarm chance but it drains stamina var/disarm_chance = HAS_TRAIT(baller, TRAIT_SPINNING) ? 35 : 50 // ballers stamina results in lower disarm, stealer stamina results in higher disarm - disarm_chance += (baller.getStaminaLoss() - stealer.getStaminaLoss()) / 2 + disarm_chance += (baller.get_stamina_loss() - stealer.get_stamina_loss()) / 2 // the lowest chance for disarm is 25% and the highest is 75% disarm_chance = clamp(disarm_chance, MIN_DISARM_CHANCE, MAX_DISARM_CHANCE) // getting disarmed or shoved while holding the ball drains stamina - baller.adjustStaminaLoss(STAMINA_COST_DISARMING) + baller.adjust_stamina_loss(STAMINA_COST_DISARMING) if(!prob(disarm_chance)) return // the disarm failed @@ -188,7 +188,7 @@ if(istype(interacting_with, /obj/structure/hoop) && baller.Adjacent(interacting_with)) return NONE // Do hoop stuff - baller.adjustStaminaLoss(STAMINA_COST_SHOOTING) + baller.adjust_stamina_loss(STAMINA_COST_SHOOTING) var/dunk_dir = get_dir(baller, interacting_with) var/dunk_pixel_y = dunk_dir & SOUTH ? -16 : 16 diff --git a/code/modules/basketball/basketball_map_loading.dm b/code/modules/basketball/basketball_map_loading.dm index 1dac20436685..319e3cbdc573 100644 --- a/code/modules/basketball/basketball_map_loading.dm +++ b/code/modules/basketball/basketball_map_loading.dm @@ -30,7 +30,7 @@ base_lighting_alpha = 255 default_gravity = STANDARD_GRAVITY flags_1 = NONE - area_flags = UNIQUE_AREA | NOTELEPORT | NO_DEATH_MESSAGE | BLOCK_SUICIDE + area_flags = NOTELEPORT | NO_DEATH_MESSAGE | BLOCK_SUICIDE /datum/lazy_template/basketball map_dir = "_maps/minigame/basketball" diff --git a/code/modules/basketball/hoop.dm b/code/modules/basketball/hoop.dm index 0e742c633473..b1963a050b20 100644 --- a/code/modules/basketball/hoop.dm +++ b/code/modules/basketball/hoop.dm @@ -18,6 +18,7 @@ density = TRUE layer = ABOVE_MOB_LAYER interaction_flags_click = NEED_DEXTERITY | NEED_HANDS | FORBID_TELEKINESIS_REACH + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3.5) /// Keeps track of the total points scored var/total_score = 0 /// The chance to score a ball into the hoop based on distance @@ -25,7 +26,7 @@ /obj/structure/hoop/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation, ROTATION_REQUIRE_WRENCH|ROTATION_IGNORE_ANCHORED, post_rotation = CALLBACK(src, PROC_REF(reset_appearance))) + AddElement(/datum/element/simple_rotation, ROTATION_REQUIRE_WRENCH|ROTATION_IGNORE_ANCHORED) update_appearance() register_context() @@ -33,7 +34,7 @@ context[SCREENTIP_CONTEXT_CTRL_LMB] = "Reset score" return CONTEXTUAL_SCREENTIP_SET -/obj/structure/hoop/proc/reset_appearance() +/obj/structure/hoop/post_rotation(mob/user, degrees) update_appearance() /obj/structure/hoop/proc/score(obj/item/toy/basketball/ball, mob/living/baller, points) @@ -109,7 +110,7 @@ score(ball, baller, 2) if(istype(ball, /obj/item/toy/basketball)) - baller.adjustStaminaLoss(STAMINA_COST_DUNKING) + baller.adjust_stamina_loss(STAMINA_COST_DUNKING) /obj/structure/hoop/attack_hand(mob/living/baller, list/modifiers) . = ..() @@ -127,7 +128,7 @@ loser.Paralyze(100) visible_message(span_danger("[baller] dunks [loser] into \the [src]!")) playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 100, FALSE) - baller.adjustStaminaLoss(STAMINA_COST_DUNKING_MOB) + baller.adjust_stamina_loss(STAMINA_COST_DUNKING_MOB) baller.stop_pulling() /obj/structure/hoop/click_ctrl(mob/user) @@ -148,13 +149,16 @@ var/click_on_hoop = TRUE var/mob/living/thrower = throwingdatum?.get_thrower() + if(!istype(thrower)) + return + // aim penalty for not clicking directly on the hoop when shooting if(!istype(backboard) || backboard != src) click_on_hoop = FALSE score_chance *= 0.5 // aim penalty for spinning while shooting - if(istype(thrower) && HAS_TRAIT(thrower, TRAIT_SPINNING)) + if(HAS_TRAIT(thrower, TRAIT_SPINNING)) score_chance *= 0.5 if(prob(score_chance)) diff --git a/code/modules/bitrunning/antagonists/cyber_police.dm b/code/modules/bitrunning/antagonists/cyber_police.dm index 3e335475ac6d..bf2606bf8153 100644 --- a/code/modules/bitrunning/antagonists/cyber_police.dm +++ b/code/modules/bitrunning/antagonists/cyber_police.dm @@ -33,7 +33,6 @@ /datum/outfit/cyber_police/post_equip(mob/living/carbon/human/user, visuals_only) 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() + if(istype(officer_uniform)) + officer_uniform.set_has_sensor(NO_SENSORS) + officer_uniform.set_sensor_mode(SENSOR_OFF) diff --git a/code/modules/bitrunning/areas.dm b/code/modules/bitrunning/areas.dm index 74c6aa3c15ce..66060559a942 100644 --- a/code/modules/bitrunning/areas.dm +++ b/code/modules/bitrunning/areas.dm @@ -14,7 +14,8 @@ name = "Virtual Domain Ruins" icon_state = "bit_ruin" icon = 'icons/area/areas_station.dmi' - area_flags = UNIQUE_AREA | LOCAL_TELEPORT | EVENT_PROTECTED | HIDDEN_AREA | UNLIMITED_FISHING + area_flags = LOCAL_TELEPORT | EVENT_PROTECTED | HIDDEN_AREA | UNLIMITED_FISHING + area_flags_mapping = VIRTUAL_AREA default_gravity = STANDARD_GRAVITY requires_power = FALSE @@ -26,7 +27,8 @@ /area/virtual_domain/safehouse name = "Virtual Domain Safehouse" - area_flags = UNIQUE_AREA | LOCAL_TELEPORT | EVENT_PROTECTED | VIRTUAL_SAFE_AREA | UNLIMITED_FISHING + area_flags = LOCAL_TELEPORT | EVENT_PROTECTED | UNLIMITED_FISHING + area_flags_mapping = UNIQUE_AREA | VIRTUAL_AREA | VIRTUAL_SAFE_AREA icon_state = "bit_safe" requires_power = FALSE sound_environment = SOUND_ENVIRONMENT_ROOM @@ -36,32 +38,49 @@ /area/lavaland/surface/outdoors/virtual_domain name = "Virtual Domain Lava Ruins" icon_state = "bit_ruin" - area_flags = UNIQUE_AREA | LOCAL_TELEPORT | EVENT_PROTECTED | HIDDEN_AREA | UNLIMITED_FISHING + area_flags = /area/virtual_domain::area_flags + area_flags_mapping = /area/virtual_domain::area_flags_mapping /area/icemoon/underground/explored/virtual_domain name = "Virtual Domain Ice Ruins" icon_state = "bit_ice" - area_flags = UNIQUE_AREA | LOCAL_TELEPORT | EVENT_PROTECTED | HIDDEN_AREA | UNLIMITED_FISHING + area_flags = /area/virtual_domain::area_flags + area_flags_mapping = /area/virtual_domain::area_flags_mapping /area/ruin/space/virtual_domain name = "Virtual Domain Unexplored Location" icon = 'icons/area/areas_station.dmi' icon_state = "bit_ruin" - area_flags = UNIQUE_AREA | LOCAL_TELEPORT | EVENT_PROTECTED | HIDDEN_AREA | UNLIMITED_FISHING + area_flags = /area/virtual_domain::area_flags + area_flags_mapping = /area/virtual_domain::area_flags_mapping /area/space/virtual_domain name = "Virtual Domain Space" icon = 'icons/area/areas_station.dmi' icon_state = "bit_space" - area_flags = UNIQUE_AREA | LOCAL_TELEPORT | EVENT_PROTECTED | HIDDEN_AREA | UNLIMITED_FISHING + area_flags = /area/virtual_domain::area_flags + area_flags_mapping = /area/virtual_domain::area_flags_mapping ///Areas that virtual entities should not be in /area/virtual_domain/protected_space name = "Virtual Domain Safe Zone" - area_flags = UNIQUE_AREA | LOCAL_TELEPORT | EVENT_PROTECTED | VIRTUAL_SAFE_AREA | UNLIMITED_FISHING + area_flags = /area/virtual_domain/safehouse::area_flags + area_flags_mapping = /area/virtual_domain/safehouse::area_flags_mapping icon_state = "bit_safe" /area/virtual_domain/protected_space/fullbright static_lighting = FALSE base_lighting_alpha = 255 + +/// A hash lookup list of all the virtual area types +GLOBAL_LIST_INIT_TYPED(virtual_areas, /area, populate_virtual_areas()) + +/// Constructs the list of virtual areas +/proc/populate_virtual_areas() + RETURN_TYPE(/list/area) + var/list/area/virtual_areas = list() + for(var/area/area_type as anything in subtypesof(/area)) + if (area_type::area_flags_mapping & VIRTUAL_AREA) + virtual_areas[area_type] = TRUE + return virtual_areas diff --git a/code/modules/bitrunning/components/avatar_connection.dm b/code/modules/bitrunning/components/avatar_connection.dm index 5a433a167dc7..5c3844dbf9d0 100644 --- a/code/modules/bitrunning/components/avatar_connection.dm +++ b/code/modules/bitrunning/components/avatar_connection.dm @@ -11,6 +11,8 @@ var/datum/weakref/server_ref /// The netpod the avatar is in var/datum/weakref/netpod_ref + /// If we've taken any damage, is set to FALSE - for tracking nohit bonus + var/nohit = TRUE /datum/component/avatar_connection/Initialize( datum/mind/old_mind, @@ -18,6 +20,7 @@ obj/machinery/quantum_server/server, obj/machinery/netpod/pod, help_text, + copy_body, ) if(!isliving(parent) || !isliving(old_body) || !old_mind || !server.is_operational || !pod.is_operational) @@ -65,8 +68,18 @@ if(alias && avatar.real_name != alias) avatar.fully_replace_character_name(newname = alias) + avatar.voice = old_body.voice + avatar.voice_filter = old_body.voice_filter + if(ishuman(avatar) && ishuman(old_body) && copy_body) + var/mob/living/carbon/human/human_avatar = avatar + var/mob/living/carbon/human/human_old_body = old_body + human_avatar.dna.unique_identity = human_old_body.dna.unique_identity + human_avatar.physique = human_old_body.physique + human_avatar.updateappearance(mutcolor_update = TRUE) + update_avatar_id() + avatar.mind.set_assigned_role(SSjob.get_job_type(/datum/job/bit_avatar)) for(var/skill_type in old_mind.known_skills) avatar.mind.set_experience(skill_type, old_mind.get_skill_exp(skill_type), silent = TRUE) @@ -179,6 +192,7 @@ if(old_body.stat > SOFT_CRIT) // KO! full_avatar_disconnect(cause_damage = TRUE) + nohit = FALSE /// Handles minds being swapped around in subsequent avatars /datum/component/avatar_connection/proc/on_mind_transfer(datum/mind/source, mob/living/previous_body) diff --git a/code/modules/bitrunning/components/avatar_gear.dm b/code/modules/bitrunning/components/avatar_gear.dm index 09a336f4bd0d..919d047b8a46 100644 --- a/code/modules/bitrunning/components/avatar_gear.dm +++ b/code/modules/bitrunning/components/avatar_gear.dm @@ -64,6 +64,6 @@ tracked_human_ref = WEAKREF(to_track) RegisterSignal(to_track, COMSIG_BITRUNNER_STOCKING_GEAR, PROC_REF(load_onto_avatar)) -/datum/component/loads_avatar_gear/proc/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) +/datum/component/loads_avatar_gear/proc/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags) SIGNAL_HANDLER - return load_callback?.Invoke(neo, avatar, external_load_flags) + return load_callback?.Invoke(neo, avatar, domain_flags) diff --git a/code/modules/bitrunning/components/netpod_healing.dm b/code/modules/bitrunning/components/netpod_healing.dm index 86f80e854e0b..dd70c29a0308 100644 --- a/code/modules/bitrunning/components/netpod_healing.dm +++ b/code/modules/bitrunning/components/netpod_healing.dm @@ -34,12 +34,11 @@ return var/need_mob_update = FALSE - need_mob_update += owner.adjustBruteLoss(-BASE_HEAL * seconds_per_tick, updating_health = FALSE) - need_mob_update += owner.adjustFireLoss(-BASE_HEAL * seconds_per_tick, updating_health = FALSE) - need_mob_update += owner.adjustToxLoss(-BASE_HEAL * seconds_per_tick, updating_health = FALSE, forced = TRUE) + need_mob_update += owner.adjust_brute_loss(-BASE_HEAL * seconds_per_tick, updating_health = FALSE) + need_mob_update += owner.adjust_fire_loss(-BASE_HEAL * seconds_per_tick, updating_health = FALSE) + need_mob_update += owner.adjust_tox_loss(-BASE_HEAL * seconds_per_tick, updating_health = FALSE, forced = TRUE) - if(owner.blood_volume < BLOOD_VOLUME_NORMAL) - owner.blood_volume += BASE_HEAL * seconds_per_tick + owner.adjust_blood_volume(BASE_HEAL * seconds_per_tick, maximum = BLOOD_VOLUME_NORMAL) if(need_mob_update) owner.updatehealth() @@ -63,7 +62,8 @@ /atom/movable/screen/alert/status_effect/embryonic name = "Embryonic Stasis" - icon_state = "netpod_stasis" + use_user_hud_icon = TRUE + overlay_state = "netpod_stasis" desc = "You feel like you're in a dream." #undef BASE_HEAL diff --git a/code/modules/bitrunning/components/virtual_entity.dm b/code/modules/bitrunning/components/virtual_entity.dm index 52a259a6d049..77e387adc1d6 100644 --- a/code/modules/bitrunning/components/virtual_entity.dm +++ b/code/modules/bitrunning/components/virtual_entity.dm @@ -38,7 +38,7 @@ stack_trace("Virtual entity entered a location with no area!") return - if(location_area.area_flags & VIRTUAL_SAFE_AREA) + if(location_area.area_flags_mapping & VIRTUAL_SAFE_AREA) source.balloon_alert(source, "out of bounds!") COOLDOWN_START(src, OOB_cooldown, 2 SECONDS) return COMPONENT_MOVABLE_BLOCK_PRE_MOVE diff --git a/code/modules/bitrunning/job.dm b/code/modules/bitrunning/job.dm index d62bd2cf3aea..5baf875ccf7d 100644 --- a/code/modules/bitrunning/job.dm +++ b/code/modules/bitrunning/job.dm @@ -1,7 +1,6 @@ /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 @@ -39,3 +38,6 @@ uniform = /obj/item/clothing/under/rank/cargo/bitrunner belt = /obj/item/modular_computer/pda/bitrunner ears = /obj/item/radio/headset/headset_cargo + +/datum/job/bit_avatar + title = "Bit Avatar" diff --git a/code/modules/bitrunning/netpod/_netpod.dm b/code/modules/bitrunning/netpod/_netpod.dm index e372f004255f..80c3bfc5b211 100644 --- a/code/modules/bitrunning/netpod/_netpod.dm +++ b/code/modules/bitrunning/netpod/_netpod.dm @@ -1,5 +1,5 @@ #define BASE_DISCONNECT_DAMAGE 40 - +#define SCANNING_TOGGLE_COOLDOWN 5 /obj/machinery/netpod name = "netpod" @@ -26,6 +26,10 @@ var/disconnect_damage /// Static list of outfits to select from var/list/cached_outfits = list() + /// Whether bit avatars become visually similar to their bitrunner on first creation + var/copy_body = FALSE + /// The next time copy_body can be toggled + var/scanning_can_toggle = 0 /obj/machinery/netpod/post_machine_initialize() @@ -53,21 +57,21 @@ if(isnull(held_item)) context[SCREENTIP_CONTEXT_LMB] = "Select Outfit" - return CONTEXTUAL_SCREENTIP_SET - - if(held_item.tool_behaviour == TOOL_SCREWDRIVER && !occupant && !state_open) - context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] Panel" - return CONTEXTUAL_SCREENTIP_SET - - if(held_item.tool_behaviour == TOOL_CROWBAR) - if(isnull(occupant)) - if(panel_open) - context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + else + if(held_item.tool_behaviour == TOOL_SCREWDRIVER && !occupant && !state_open) + context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] Panel" + + if(held_item.tool_behaviour == TOOL_CROWBAR) + if(isnull(occupant)) + if(panel_open) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + else + context[SCREENTIP_CONTEXT_LMB] = "[state_open ? "Close" : "Open"] Cover" else - context[SCREENTIP_CONTEXT_LMB] = "[state_open ? "Close" : "Open"] Cover" - else - context[SCREENTIP_CONTEXT_LMB] = "Break out" - return CONTEXTUAL_SCREENTIP_SET + context[SCREENTIP_CONTEXT_LMB] = "Break out" + + context[SCREENTIP_CONTEXT_ALT_LMB] = "[copy_body ? "Disable" : "Enable"] Scan" + return CONTEXTUAL_SCREENTIP_SET /obj/machinery/netpod/examine(mob/user) . = ..() @@ -88,6 +92,9 @@ . += span_infoplain("Drag yourself into the pod to engage the link.") . += span_infoplain("It has limited resuscitation capabilities. Remaining in the pod can heal some injuries.") . += span_infoplain("It has a security system that will alert the occupant if it is tampered with.") + if(copy_body) + . += span_infoplain("Occupant scanning is currently enabled, which will cause bit avatars to look like the occupant when first created.") + . += span_infoplain("Alt-click to [copy_body ? "disable" : "enable"] occupant scanning.") if(isnull(occupant)) . += span_infoplain("It's currently unoccupied.") @@ -149,5 +156,14 @@ disconnect_damage = BASE_DISCONNECT_DAMAGE * (1 - source.servo_bonus) +/obj/machinery/netpod/click_alt(mob/user) + if(world.time < scanning_can_toggle) + return CLICK_ACTION_BLOCKING + copy_body = !copy_body + scanning_can_toggle = world.time + SCANNING_TOGGLE_COOLDOWN + playsound(src, 'sound/machines/click.ogg', 50, TRUE) + user.balloon_alert_to_viewers(user, "scanning [copy_body ? "enabled" : "disabled"]") + return CLICK_ACTION_SUCCESS #undef BASE_DISCONNECT_DAMAGE +#undef SCANNING_TOGGLE_COOLDOWN diff --git a/code/modules/bitrunning/netpod/utils.dm b/code/modules/bitrunning/netpod/utils.dm index 264d4ab4e3bd..3cb7d53e5ac9 100644 --- a/code/modules/bitrunning/netpod/utils.dm +++ b/code/modules/bitrunning/netpod/utils.dm @@ -47,7 +47,7 @@ return mob_occupant.flash_act(override_blindness_check = TRUE, visual = TRUE) - mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, disconnect_damage) + mob_occupant.adjust_organ_loss(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!")) @@ -111,6 +111,7 @@ server = server, \ pod = src, \ help_text = generated_domain.help_text, \ + copy_body = copy_body, \ ) connected = TRUE diff --git a/code/modules/bitrunning/objects/disks.dm b/code/modules/bitrunning/objects/disks.dm index b51a1dd076c8..f91aeaab0438 100644 --- a/code/modules/bitrunning/objects/disks.dm +++ b/code/modules/bitrunning/objects/disks.dm @@ -35,7 +35,7 @@ . += span_notice("It cannot make another selection.") /// Handles loading our stuff onto avatars -/obj/item/bitrunning_disk/proc/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) +/obj/item/bitrunning_disk/proc/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags) return NONE @@ -46,8 +46,8 @@ /// The list of actions that this can grant var/list/datum/action/selectable_actions = list() -/obj/item/bitrunning_disk/ability/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) - if(external_load_flags & DOMAIN_FORBIDS_ABILITIES) +/obj/item/bitrunning_disk/ability/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags) + if(domain_flags & DOMAIN_FORBIDS_ABILITIES) return BITRUNNER_GEAR_LOAD_BLOCKED if(isnull(granted_action)) @@ -118,8 +118,8 @@ /// The list of actions that this can grant var/list/obj/selectable_items = list() -/obj/item/bitrunning_disk/item/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) - if(external_load_flags & DOMAIN_FORBIDS_ITEMS) +/obj/item/bitrunning_disk/item/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags) + if(domain_flags & DOMAIN_FORBIDS_ITEMS) return BITRUNNER_GEAR_LOAD_BLOCKED if(isnull(granted_item)) diff --git a/code/modules/bitrunning/objects/gimmick_disks/_gimmick_disk.dm b/code/modules/bitrunning/objects/gimmick_disks/_gimmick_disk.dm index 8722b1ad27f2..24702d1254ad 100644 --- a/code/modules/bitrunning/objects/gimmick_disks/_gimmick_disk.dm +++ b/code/modules/bitrunning/objects/gimmick_disks/_gimmick_disk.dm @@ -13,10 +13,10 @@ QDEL_NULL(granted_loadout) return ..() -/obj/item/bitrunning_disk/gimmick/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) +/obj/item/bitrunning_disk/gimmick/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags) if(isnull(granted_loadout)) return BITRUNNER_GEAR_LOAD_FAILED - return granted_loadout.grant_loadout(neo, avatar, external_load_flags) + return granted_loadout.grant_loadout(neo, avatar, domain_flags) /obj/item/bitrunning_disk/gimmick/attack_self(mob/user, modifiers) . = ..() @@ -57,17 +57,17 @@ var/prefix_container_name = TRUE /// Grants out loadout. -/datum/bitrunning_gimmick/proc/grant_loadout(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) +/datum/bitrunning_gimmick/proc/grant_loadout(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags) var/return_flags = NONE - return_flags |= grant_items(neo, avatar, external_load_flags) - return_flags |= grant_abilities(neo, avatar, external_load_flags) + return_flags |= grant_items(neo, avatar, domain_flags) + return_flags |= grant_abilities(neo, avatar, domain_flags) return return_flags -/datum/bitrunning_gimmick/proc/grant_items(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) +/datum/bitrunning_gimmick/proc/grant_items(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags) if(!length(granted_items)) return NONE - if(external_load_flags & DOMAIN_FORBIDS_ITEMS) + if(domain_flags & DOMAIN_FORBIDS_ITEMS) return BITRUNNER_GEAR_LOAD_BLOCKED var/obj/item/container_item = new container_item_type() @@ -81,11 +81,11 @@ return NONE -/datum/bitrunning_gimmick/proc/grant_abilities(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) +/datum/bitrunning_gimmick/proc/grant_abilities(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags) if(!length(granted_actions)) return NONE - if(external_load_flags & DOMAIN_FORBIDS_ABILITIES) + if(domain_flags & DOMAIN_FORBIDS_ABILITIES) return BITRUNNER_GEAR_LOAD_BLOCKED var/return_flags = NONE @@ -99,4 +99,3 @@ our_action.Grant(avatar) return return_flags - diff --git a/code/modules/bitrunning/objects/vendor.dm b/code/modules/bitrunning/objects/vendor.dm index c42a954b9785..951e8ff46362 100644 --- a/code/modules/bitrunning/objects/vendor.dm +++ b/code/modules/bitrunning/objects/vendor.dm @@ -1,5 +1,3 @@ -#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." @@ -15,7 +13,7 @@ and hopefully get delivered by them. 35% cheaper than express delivery."} express_tooltip = @{"Sends your purchases instantly."} - credit_type = CREDIT_TYPE_BITRUNNING + credit_type = MONEY_BITRUNNING_SYMBOL order_categories = list( CATEGORY_BITRUNNING_FLAIR, @@ -74,7 +72,7 @@ /datum/supply_pack/bitrunning name = "bitrunning order" - hidden = TRUE + order_flags = ORDER_INVISIBLE crate_name = "bitrunning delivery crate" access = list(ACCESS_BIT_DEN) test_ignored = TRUE @@ -84,5 +82,3 @@ name = "[purchaser]'s Bitrunning Order" src.cost = cost src.contains = contains - -#undef CREDIT_TYPE_BITRUNNING diff --git a/code/modules/bitrunning/server/_parent.dm b/code/modules/bitrunning/server/_parent.dm index 71e02f45a1c4..9e0e8251d019 100644 --- a/code/modules/bitrunning/server/_parent.dm +++ b/code/modules/bitrunning/server/_parent.dm @@ -28,6 +28,8 @@ var/list/datum/weakref/spawned_threat_refs = list() /// Scales loot with extra players var/multiplayer_bonus = 1.1 + /// Extra bonus for every player that nohits the run + var/nohit_bonus = 0.8 /// 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 @@ -143,17 +145,16 @@ return ..() -/obj/machinery/quantum_server/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) - . = ..() - - if(!istype(weapon, /obj/item/bitrunning_debug)) - return +/obj/machinery/quantum_server/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/bitrunning_debug)) + return NONE + balloon_alert(user, "*hacker voice* i'm in") obj_flags |= EMAGGED glitch_chance = 0.5 capacitor_coefficient = 0.1 points = 100 - + return ITEM_INTERACT_SUCCESS /obj/machinery/quantum_server/crowbar_act(mob/living/user, obj/item/crowbar) . = NONE diff --git a/code/modules/bitrunning/server/loot.dm b/code/modules/bitrunning/server/loot.dm index c3c8963e8cbc..9fdbcebbca4a 100644 --- a/code/modules/bitrunning/server/loot.dm +++ b/code/modules/bitrunning/server/loot.dm @@ -16,11 +16,36 @@ rewards_base += (length(spawned_threat_refs) * 2) - for(var/index in 2 to length(avatar_connection_refs)) - rewards_base += multiplayer_bonus + rewards_base += get_multiplayer_bonus() + + rewards_base += get_nohit_bouns() return rewards_base +/// Calculates total bonus from completing the domain in multiplayer +/obj/machinery/quantum_server/proc/get_multiplayer_bonus() + var/total = 0 + var/multiplayer = FALSE + for(var/datum/weakref/connection_ref as anything in avatar_connection_refs) + var/datum/component/avatar_connection/connection = connection_ref.resolve() + if(isnull(connection)) + continue + if(multiplayer) + total += multiplayer_bonus + multiplayer = TRUE + return total + +/// Calculates total bonus from completing the domain without taking damage +/obj/machinery/quantum_server/proc/get_nohit_bouns() + if(generated_domain.domain_flags & DOMAIN_NO_NOHIT_BONUS) + return 0 + + var/total = 0 + for(var/datum/weakref/connection_ref as anything in avatar_connection_refs) + var/datum/component/avatar_connection/connection = connection_ref.resolve() + if(connection?.nohit) + total += nohit_bonus + return total /// Handles spawning the (new) crate and deleting the former /obj/machinery/quantum_server/proc/generate_loot(obj/cache, obj/machinery/byteforge/chosen_forge) @@ -101,8 +126,13 @@ if(domain_randomized) text += "- **Randomized:** + 0.2\n" - if(length(avatar_connection_refs) > 1) - text += "- **Multiplayer:** + [(length(avatar_connection_refs) - 1) * multiplayer_bonus]\n" + var/mp_bonus = get_multiplayer_bonus() + if(mp_bonus) + text += "- **Multiplayer:** + [mp_bonus]\n" + + var/nohit_bonus = get_nohit_bouns() + if(nohit_bonus) + text += "- **No hit:** + [nohit_bonus]\n" if(domain_threats > 0) text += "- **Threats:** + [domain_threats * 2]\n" diff --git a/code/modules/bitrunning/server/obj_generation.dm b/code/modules/bitrunning/server/obj_generation.dm index 30f7b2c47e6e..23134dbe019e 100644 --- a/code/modules/bitrunning/server/obj_generation.dm +++ b/code/modules/bitrunning/server/obj_generation.dm @@ -129,7 +129,7 @@ /// 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, datum/lazy_template/virtual_domain/generated_domain) - var/domain_forbids_flags = generated_domain.external_load_flags + var/domain_forbids_flags = generated_domain.domain_flags var/import_ban = list() var/disk_ban = list() diff --git a/code/modules/bitrunning/server/threats.dm b/code/modules/bitrunning/server/threats.dm index d8d79aee7669..c8d21785960c 100644 --- a/code/modules/bitrunning/server/threats.dm +++ b/code/modules/bitrunning/server/threats.dm @@ -131,7 +131,7 @@ /obj/machinery/quantum_server/proc/station_spawn(mob/living/antag, obj/machinery/byteforge/chosen_forge) antag.balloon_alert(antag, "scanning...") chosen_forge.setup_particles(angry = TRUE) - var/obj/machinery/announcement_system/aas = get_announcement_system(source = src) + var/obj/machinery/announcement_system/aas = get_announcement_system(null, src, list(RADIO_CHANNEL_SUPPLY)) if (aas) aas.broadcast("QUANTUM SERVER ALERT: Security breach detected. Unauthorized entry sequence in progress...", list(RADIO_CHANNEL_SUPPLY)) SEND_SIGNAL(src, COMSIG_BITRUNNER_STATION_SPAWN) diff --git a/code/modules/bitrunning/server/util.dm b/code/modules/bitrunning/server/util.dm index 9c40c957203b..ce79ee7aa5bd 100644 --- a/code/modules/bitrunning/server/util.dm +++ b/code/modules/bitrunning/server/util.dm @@ -25,10 +25,10 @@ "health" = creature.health, "name" = creature.name, "pilot" = pilot, - "brute" = creature.getBruteLoss(), - "burn" = creature.getFireLoss(), - "tox" = creature.getToxLoss(), - "oxy" = creature.getOxyLoss(), + "brute" = creature.get_brute_loss(), + "burn" = creature.get_fire_loss(), + "tox" = creature.get_tox_loss(), + "oxy" = creature.get_oxy_loss(), )) return hosted_avatars @@ -96,7 +96,7 @@ 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) && \ + if(!(initial(available.domain_flags) & DOMAIN_TEST_ONLY) && \ init_cost <= points && \ init_cost > BITRUNNER_COST_NONE && \ init_cost < BITRUNNER_COST_EXTREME \ diff --git a/code/modules/bitrunning/spawners.dm b/code/modules/bitrunning/spawners.dm index 06eccfdcd600..4baa533c1040 100644 --- a/code/modules/bitrunning/spawners.dm +++ b/code/modules/bitrunning/spawners.dm @@ -9,7 +9,7 @@ var/antag = TRUE -/obj/effect/mob_spawn/ghost_role/human/virtual_domain/special(mob/living/spawned_mob, mob/mob_possessor) +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs) var/datum/mind/ghost_mind = mob_possessor.mind if(ghost_mind) // Preserves any previous bodies before making the switch spawned_mob.AddComponent(/datum/component/temporary_body, ghost_mind, ghost_mind.current, TRUE) @@ -18,6 +18,7 @@ if(antag) spawned_mob.mind.add_antag_datum(/datum/antagonist/domain_ghost_actor) + spawned_mob.mind.set_assigned_role(SSjob.get_job_type(/datum/job/bitrunning_glitch)) /// Simulates a ghost role spawn without calling special(), ie a bitrunner spawn instead of a ghost. /obj/effect/mob_spawn/ghost_role/human/virtual_domain/proc/artificial_spawn(mob/living/runner) @@ -33,14 +34,16 @@ outfit = /datum/outfit/beachbum spawner_job_path = /datum/job/beach_bum antag = FALSE + allow_custom_character = GHOSTROLE_TAKE_PREFS_APPEARANCE /obj/effect/mob_spawn/ghost_role/human/virtual_domain/beach/lifeguard name = "virtual lifeguard sleeper" you_are_text = "You are a spunky virtual lifeguard!" flavour_text = "It's up to you to make sure nobody lags or gets eaten by malware and stuff." outfit = /datum/outfit/beachbum/lifeguard + allow_custom_character = NONE -/obj/effect/mob_spawn/ghost_role/human/virtual_domain/beach/lifeguard/special(mob/living/carbon/human/lifeguard, mob/mob_possessor) +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/beach/lifeguard/special(mob/living/carbon/human/lifeguard, mob/mob_possessor, apply_prefs) . = ..() lifeguard.gender = FEMALE lifeguard.update_body() @@ -50,6 +53,7 @@ you_are_text = "You are a virtual beach bartender!" flavour_text = "Your job is to keep the virtually rendered drinks coming, and help the dudebros engage drunkness simulations." outfit = /datum/outfit/spacebartender + allow_custom_character = ALL //Skeleton Pirates /obj/effect/mob_spawn/ghost_role/human/virtual_domain/pirate @@ -72,7 +76,7 @@ head = /obj/item/clothing/head/costume/pirate/bandana/armored shoes = /obj/item/clothing/shoes/pirate/armored -/obj/effect/mob_spawn/ghost_role/human/virtual_domain/pirate/special(mob/living/spawned_mob, mob/mob_possessor) +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/pirate/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs) . = ..() spawned_mob.fully_replace_character_name(spawned_mob.real_name, "[pick(strings(PIRATE_NAMES_FILE, "generic_beginnings"))][pick(strings(PIRATE_NAMES_FILE, "generic_endings"))]") diff --git a/code/modules/bitrunning/util/virtual_megafauna.dm b/code/modules/bitrunning/util/virtual_megafauna.dm index 2707db9e2e74..4daf00141978 100644 --- a/code/modules/bitrunning/util/virtual_megafauna.dm +++ b/code/modules/bitrunning/util/virtual_megafauna.dm @@ -6,8 +6,23 @@ true_spawn = FALSE + // rebuild the achievement element's arguments to remove it appropriately + if (achievement_type || score_achievement_type) + var/list/achievements = list(/datum/award/achievement/boss/boss_killer, /datum/award/score/boss_score) + if (achievement_type) + achievements += achievement_type + if (score_achievement_type) + achievements += score_achievement_type + RemoveElement(/datum/element/kill_achievement, string_list(achievements), crusher_achievement_type, /datum/memory/megafauna_slayer) + + // remove the crusher loot element's arguments also to remove it appropriately + RemoveElement(\ + /datum/element/crusher_loot,\ + trophy_type = crusher_loot,\ + guaranteed_drop = 0.6,\ + replace_all = replace_crusher_drop,\ + drop_immediately = del_on_death,\ + ) + loot.Cut() loot += /obj/structure/closet/crate/secure/bitrunning/encrypted - - crusher_loot.Cut() - crusher_loot += /obj/structure/closet/crate/secure/bitrunning/encrypted diff --git a/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm b/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm index 80f07448b69f..5ae0793b6e92 100644 --- a/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm +++ b/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm @@ -6,6 +6,7 @@ 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" + domain_flags = DOMAIN_NO_NOHIT_BONUS /datum/lazy_template/virtual_domain/beach_bar/setup_domain(list/created_atoms) . = ..() diff --git a/code/modules/bitrunning/virtual_domain/domains/breeze_bay.dm b/code/modules/bitrunning/virtual_domain/domains/breeze_bay.dm index 118e2fa3f86c..3d08c4359cb8 100644 --- a/code/modules/bitrunning/virtual_domain/domains/breeze_bay.dm +++ b/code/modules/bitrunning/virtual_domain/domains/breeze_bay.dm @@ -5,6 +5,7 @@ key = "breeze_bay" map_name = "breeze_bay" reward_points = BITRUNNER_REWARD_LOW + domain_flags = DOMAIN_NO_NOHIT_BONUS /datum/lazy_template/virtual_domain/breeze_bay/setup_domain(list/created_atoms) . = ..() diff --git a/code/modules/bitrunning/virtual_domain/domains/gondola_asteroid.dm b/code/modules/bitrunning/virtual_domain/domains/gondola_asteroid.dm index 420702391440..297b48228f7e 100644 --- a/code/modules/bitrunning/virtual_domain/domains/gondola_asteroid.dm +++ b/code/modules/bitrunning/virtual_domain/domains/gondola_asteroid.dm @@ -6,6 +6,7 @@ I bet there's a way to move it myself." key = "gondola_asteroid" map_name = "gondola_asteroid" + domain_flags = DOMAIN_NO_NOHIT_BONUS /// Very pushy gondolas, great for moving loot crates. /obj/structure/closet/crate/secure/bitrunning/encrypted/gondola diff --git a/code/modules/bitrunning/virtual_domain/domains/grassland_hunt.dm b/code/modules/bitrunning/virtual_domain/domains/grassland_hunt.dm index 9c9e1c7171a6..005587e9b7ef 100644 --- a/code/modules/bitrunning/virtual_domain/domains/grassland_hunt.dm +++ b/code/modules/bitrunning/virtual_domain/domains/grassland_hunt.dm @@ -6,6 +6,7 @@ key = "grasslands_hunt" map_name = "grasslands_hunt" mob_modules = list(/datum/modular_mob_segment/deer) + domain_flags = DOMAIN_NO_NOHIT_BONUS /datum/lazy_template/virtual_domain/grasslands_hunt/setup_domain(list/created_atoms) diff --git a/code/modules/bitrunning/virtual_domain/domains/heretic_hunt.dm b/code/modules/bitrunning/virtual_domain/domains/heretic_hunt.dm new file mode 100644 index 000000000000..43225d18e38b --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/heretic_hunt.dm @@ -0,0 +1,234 @@ +/datum/lazy_template/virtual_domain/heretic_hunt + name = "Heretical Hunt" + cost = BITRUNNER_COST_LOW + desc = "Betray your fellow man to achieve ultimate power." + difficulty = BITRUNNER_DIFFICULTY_LOW + help_text = "Heretics require sacrifice to fuel their dark rituals - bring corpses back to the ritual site! \ + Corpses of higher ranking crew members are more valuable and may be holding useful equipment." + forced_outfit = /datum/outfit/virtual_domain_heretic + key = "heretic_hunt" + map_name = "heretic_hunt" + reward_points = BITRUNNER_REWARD_LOW + +/datum/lazy_template/virtual_domain/heretic_hunt/setup_domain(list/created_atoms) + for(var/mob/living/basic/fake_crewman/target in created_atoms) + RegisterSignal(target, COMSIG_LIVING_DROPPED_LOOT, PROC_REF(on_body_spawned)) + + for(var/mob/living/basic/heretic_summon/helper in created_atoms) + helper.ai_controller = new /datum/ai_controller/basic_controller/simple/simple_hostile(helper) + helper.ai_controller.blackboard[BB_BASIC_MOB_IDLE_WALK_CHANCE] = 0.1 + + var/obj/effect/heretic_rune/big/rune = locate() in created_atoms + rune.set_greyscale(pick(assoc_to_values(GLOB.heretic_path_to_color))) + +/datum/lazy_template/virtual_domain/heretic_hunt/proc/on_body_spawned(mob/living/source, list/loot, gibbed) + SIGNAL_HANDLER + + if(gibbed) + return + + for(var/mob/living/carbon/human/body in loot) + RegisterSignal(body, COMSIG_MOVABLE_MOVED, PROC_REF(check_loc)) + // let's be safe + for(var/obj/item/modular_computer/pda/pda in body.get_all_gear()) + qdel(pda) + +/datum/lazy_template/virtual_domain/heretic_hunt/proc/check_loc(mob/living/carbon/human/source, ...) + SIGNAL_HANDLER + + var/obj/effect/heretic_rune/big/rune = locate() in source.loc + if(isnull(rune)) + return + + var/datum/job/fake_job = SSjob.get_job(source.job) || SSjob.get_job_type(/datum/job/unassigned) + // 10 points are needed + if(fake_job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + add_points(3) + else if(fake_job.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY) + add_points(2) + else + add_points(1) + // cleanup + source.gib(ALL) + + // mimic a ritual effect + if(locate(/obj/structure/closet/crate/secure/bitrunning/encrypted) in range(1, rune)) + rune.balloon_alert_to_viewers("ritual completed") + else + rune.balloon_alert_to_viewers("sacrifice accepted") + flick("[rune.icon_state]_active", rune) + playsound(rune, 'sound/effects/magic/castsummon.ogg', 50, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_exponent = 10, ignore_walls = FALSE) + +/datum/outfit/virtual_domain_heretic + name = "Virtual Domain Heretic" + + // this gear is just given to them in the safehouse + // suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch + // suit_store = /obj/item/melee/sickly_blade + + // otherwise just thematically appropriate clothing + uniform = /obj/item/clothing/under/color/black + shoes = /obj/item/clothing/shoes/jackboots + neck = /obj/item/clothing/neck/heretic_focus + mask = /obj/item/clothing/mask/madness_mask + +/datum/outfit/virtual_domain_heretic/pre_equip(mob/living/carbon/human/user, visuals_only) + ADD_TRAIT(user, TRAIT_ACT_AS_HERETIC, INNATE_TRAIT) + ADD_TRAIT(user, TRAIT_NO_TELEPORT, INNATE_TRAIT) + user.AddElement(/datum/element/leeching_walk) + user.faction |= FACTION_HERETIC + +// All it does is stand there, only attacks if attacked (Manuel player) +/datum/ai_controller/basic_controller/fake_crewman + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + BB_REINFORCEMENTS_SAY = "Help me!", + ) + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking + planning_subtrees = list( + /datum/ai_planning_subtree/escape_captivity, + /datum/ai_planning_subtree/call_reinforcements, + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/attack_obstacle_in_path/trooper, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/datum/ai_controller/basic_controller/fake_crewman/ranged + planning_subtrees = list( + /datum/ai_planning_subtree/escape_captivity, + /datum/ai_planning_subtree/call_reinforcements, + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/maintain_distance, + /datum/ai_planning_subtree/ranged_skirmish, + /datum/ai_planning_subtree/attack_obstacle_in_path/trooper, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +// Immediately tries to attack the player (Terry player) +/datum/ai_controller/basic_controller/fake_crewman/instant_hostile + planning_subtrees = list( + /datum/ai_planning_subtree/escape_captivity, + /datum/ai_planning_subtree/call_reinforcements, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path/trooper, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/datum/ai_controller/basic_controller/fake_crewman/instant_hostile/ranged + planning_subtrees = list( + /datum/ai_planning_subtree/escape_captivity, + /datum/ai_planning_subtree/call_reinforcements, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/maintain_distance, + /datum/ai_planning_subtree/ranged_skirmish, + /datum/ai_planning_subtree/attack_obstacle_in_path/trooper, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +// The actual crewmate +/mob/living/basic/fake_crewman + name = "crewmember" + desc = "How do you do, fellow crewmen?" + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + faction = list(FACTION_HOSTILE, "vdom_fake_crew") + icon = 'icons/mob/simple/simple_human.dmi' + gender = MALE + basic_mob_flags = DEL_ON_DEATH + + ai_controller = /datum/ai_controller/basic_controller/fake_crewman + + maxHealth = 60 + health = 60 + melee_damage_lower = 15 + melee_damage_upper = 20 + obj_damage = 20 + armour_penetration = 10 + + attack_sound = null // autoset + melee_damage_type = null // autoset + + var/death_spawner = /obj/effect/mob_spawn/corpse/human + var/obj/item/weapon = /obj/item/storage/toolbox + +/mob/living/basic/fake_crewman/Initialize(mapload) + . = ..() + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/death_drops, string_list(list(weapon, death_spawner))) + var/lhand = prob(50) ? weapon : null + var/rhand = lhand ? null : weapon + apply_dynamic_human_appearance(src, mob_spawn_path = death_spawner, l_hand = lhand, r_hand = rhand) + + attack_sound ||= weapon::hitsound + melee_damage_type ||= weapon::damtype + sharpness = weapon::sharpness + wound_bonus = weapon::wound_bonus * 0.5 + exposed_wound_bonus = weapon::exposed_wound_bonus * 0.5 + +/mob/living/basic/fake_crewman/md + name = "medical doctor" + death_spawner = /obj/effect/mob_spawn/corpse/human/doctor + weapon = /obj/item/circular_saw + +/mob/living/basic/fake_crewman/sec + name = "security officer" + ai_controller = /datum/ai_controller/basic_controller/fake_crewman/instant_hostile + death_spawner = /obj/effect/mob_spawn/corpse/human/secoff + weapon = /obj/item/knife/combat/survival + damage_coeff = list(BRUTE = 0.6, BURN = 0.6, TOX = 1, STAMINA = 1, OXY = 1) + +/mob/living/basic/fake_crewman/engi + name = "engineer" + death_spawner = /obj/effect/mob_spawn/corpse/human/engineer + weapon = /obj/item/weldingtool + attack_sound = 'sound/items/tools/welder.ogg' + melee_damage_type = BURN + damage_coeff = list(BRUTE = 1, BURN = 0.9, TOX = 1, STAMINA = 1, OXY = 1) + +/mob/living/basic/fake_crewman/engi/mod + death_spawner = /obj/effect/mob_spawn/corpse/human/engineer/mod + damage_coeff = list(BRUTE = 0.8, BURN = 0.8, TOX = 1, STAMINA = 1, OXY = 1) + +/mob/living/basic/fake_crewman/assistant + name = "assistant" + ai_controller = /datum/ai_controller/basic_controller/fake_crewman/instant_hostile + death_spawner = /obj/effect/mob_spawn/corpse/human/assistant + weapon = /obj/item/knife/shiv + +/mob/living/basic/fake_crewman/assistant/alt + weapon = /obj/item/storage/toolbox/mechanical + +/mob/living/basic/fake_crewman/boss + name = "senior crewmember" + maxHealth = 120 + health = 120 + melee_damage_lower = 20 + melee_damage_upper = 25 + armour_penetration = 30 + +/mob/living/basic/fake_crewman/boss/cmo + name = "chief medical officer" + death_spawner = /obj/effect/mob_spawn/corpse/human/cmo + weapon = /obj/item/surgicaldrill + +/mob/living/basic/fake_crewman/boss/ce + name = "chief engineer" + ai_controller = /datum/ai_controller/basic_controller/fake_crewman/ranged + death_spawner = /obj/effect/mob_spawn/corpse/human/ce + weapon = /obj/item/gun/energy/plasmacutter/adv + +/mob/living/basic/fake_crewman/boss/ce/Initialize(mapload) + . = ..() + AddComponent(/datum/component/ranged_attacks, /obj/item/ammo_casing/energy/plasma/adv, projectile_sound = 'sound/items/weapons/plasma_cutter.ogg', cooldown_time = 1.6 SECONDS) + +/mob/living/basic/fake_crewman/boss/hos + name = "head of security" + ai_controller = /datum/ai_controller/basic_controller/fake_crewman/instant_hostile/ranged + death_spawner = /obj/effect/mob_spawn/corpse/human/hos + weapon = /obj/item/gun/energy/e_gun/hos + damage_coeff = list(BRUTE = 0.6, BURN = 0.6, TOX = 1, STAMINA = 1, OXY = 1) + +/mob/living/basic/fake_crewman/boss/hos/Initialize(mapload) + . = ..() + AddComponent(/datum/component/ranged_attacks, /obj/item/ammo_casing/energy/laser, projectile_sound = 'sound/items/weapons/laser.ogg', cooldown_time = 1.2 SECONDS) diff --git a/code/modules/bitrunning/virtual_domain/domains/pipedream.dm b/code/modules/bitrunning/virtual_domain/domains/pipedream.dm index 595600ce71c4..f32c984248a3 100644 --- a/code/modules/bitrunning/virtual_domain/domains/pipedream.dm +++ b/code/modules/bitrunning/virtual_domain/domains/pipedream.dm @@ -102,4 +102,3 @@ name = "Factory Quartermaster" outfit = /datum/outfit/factory/qm icon_state = "corpsecargotech" - diff --git a/code/modules/bitrunning/virtual_domain/domains/stairs_and_cliffs.dm b/code/modules/bitrunning/virtual_domain/domains/stairs_and_cliffs.dm index 8407912dbb47..a4b8c87fb955 100644 --- a/code/modules/bitrunning/virtual_domain/domains/stairs_and_cliffs.dm +++ b/code/modules/bitrunning/virtual_domain/domains/stairs_and_cliffs.dm @@ -12,6 +12,7 @@ key = "stairs_and_cliffs" map_name = "stairs_and_cliffs" reward_points = BITRUNNER_REWARD_MEDIUM + domain_flags = DOMAIN_NO_NOHIT_BONUS /turf/open/cliff/snowrock/virtual_domain name = "icy cliff" diff --git a/code/modules/bitrunning/virtual_domain/domains/test_only.dm b/code/modules/bitrunning/virtual_domain/domains/test_only.dm index 185ed4335e63..3bf25bb121a3 100644 --- a/code/modules/bitrunning/virtual_domain/domains/test_only.dm +++ b/code/modules/bitrunning/virtual_domain/domains/test_only.dm @@ -3,7 +3,7 @@ name = "Test Only" key = "test_only" map_name = "test_only" - test_only = TRUE + domain_flags = DOMAIN_TEST_ONLY /datum/lazy_template/virtual_domain/test_only/expensive key = "test_only_expensive" diff --git a/code/modules/bitrunning/virtual_domain/domains/vaporwave.dm b/code/modules/bitrunning/virtual_domain/domains/vaporwave.dm index 5da6449ccf92..6be31f9bf187 100644 --- a/code/modules/bitrunning/virtual_domain/domains/vaporwave.dm +++ b/code/modules/bitrunning/virtual_domain/domains/vaporwave.dm @@ -7,3 +7,4 @@ key = "vaporwave" map_name = "vaporwave" reward_points = BITRUNNER_REWARD_EXTREME + domain_flags = DOMAIN_NO_NOHIT_BONUS diff --git a/code/modules/bitrunning/virtual_domain/domains/wendigo.dm b/code/modules/bitrunning/virtual_domain/domains/wendigo.dm index 6db7c3337b6b..890d7f6891ed 100644 --- a/code/modules/bitrunning/virtual_domain/domains/wendigo.dm +++ b/code/modules/bitrunning/virtual_domain/domains/wendigo.dm @@ -8,10 +8,10 @@ map_name = "wendigo" reward_points = BITRUNNER_REWARD_HIGH -/obj/effect/mob_spawn/corpse/human/bitrunner/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/corpse/human/bitrunner/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs) . = ..() spawned_mob.apply_status_effect(/datum/status_effect/gutted) -/obj/effect/mob_spawn/corpse/human/cyber_police/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/corpse/human/cyber_police/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs) . = ..() spawned_mob.apply_status_effect(/datum/status_effect/gutted) diff --git a/code/modules/bitrunning/virtual_domain/virtual_domain.dm b/code/modules/bitrunning/virtual_domain/virtual_domain.dm index 9bb6a609ce1e..9ebd82bd43d8 100644 --- a/code/modules/bitrunning/virtual_domain/virtual_domain.dm +++ b/code/modules/bitrunning/virtual_domain/virtual_domain.dm @@ -13,8 +13,6 @@ var/filename = "virtual_domain.dmm" /// 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 /** * Generic settings / UI @@ -32,13 +30,13 @@ var/name = "Virtual Domain" /// Points to reward for completion. Used to purchase new domains and calculate ore rewards. var/reward_points = BITRUNNER_REWARD_MIN + /// Any additional flags for this domain + var/domain_flags = NONE /** * Player customization */ - /// Any restrictions this domain has on what external sources can load in - var/external_load_flags = NONE /// Any outfit that you wish to force on avatars. Overrides preferences var/datum/outfit/forced_outfit diff --git a/code/modules/capture_the_flag/ctf_equipment.dm b/code/modules/capture_the_flag/ctf_equipment.dm index 6360f763678a..214ca0ec6916 100644 --- a/code/modules/capture_the_flag/ctf_equipment.dm +++ b/code/modules/capture_the_flag/ctf_equipment.dm @@ -157,6 +157,9 @@ ammo_x_offset = 2 shaded_charge = FALSE +/obj/item/gun/energy/laser/instakill/add_deep_lore() + return + /obj/item/gun/energy/laser/instakill/Initialize(mapload) . = ..() AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) @@ -169,6 +172,7 @@ projectile_type = /obj/projectile/beam/instakill e_cost = 0 // Not possible to use the macro select_name = "DESTROY" + muzzle_flash_color = LIGHT_COLOR_BLUE /obj/projectile/beam/instakill name = "instagib laser" diff --git a/code/modules/cards/cardhand.dm b/code/modules/cards/cardhand.dm index fa0339cde9c6..96085ca5c018 100644 --- a/code/modules/cards/cardhand.dm +++ b/code/modules/cards/cardhand.dm @@ -80,6 +80,7 @@ /obj/item/toy/cards/cardhand/item_interaction(mob/living/user, obj/item/tool, list/modifiers) var/obj/item/toy/singlecard/card + var/interacting_with_deck = FALSE if(istype(tool, /obj/item/toy/singlecard)) card = tool @@ -93,7 +94,8 @@ to_chat(user, span_warning("\The [dealer_deck] is stacked too high!")) return ITEM_INTERACT_BLOCKING - card = dealer_deck.draw(user) + card = dealer_deck.get_top_card(user) + interacting_with_deck = TRUE if(!card) return NONE @@ -101,6 +103,9 @@ if(insert(card)) if(LAZYACCESS(modifiers, RIGHT_CLICK)) card.Flip() + if(interacting_with_deck) + var/obj/item/toy/cards/deck/dealer_deck = tool + dealer_deck.draw(user) return ITEM_INTERACT_SUCCESS to_chat(user, span_warning("You can't hold any more cards in your hand!")) diff --git a/code/modules/cards/cards.dm b/code/modules/cards/cards.dm index fbfa2a396587..7fcb19da6bbb 100644 --- a/code/modules/cards/cards.dm +++ b/code/modules/cards/cards.dm @@ -30,7 +30,7 @@ return . var/mob/thrower = throwingdatum?.get_thrower() - if(!thrower) // if a mob didn't throw it (need two people to play 52 pickup) + if(!istype(thrower)) // if a mob didn't throw it (need two people to play 52 pickup) return if(count_cards() == 0) @@ -113,15 +113,16 @@ /** * Draws a card from the deck or hand of cards. * - * Draws the top card unless a card arg is supplied then it picks that specific card - * and returns it (the card arg is used by the radial menu for cardhands to select - * specific cards out of the cardhand) + * Draws the top card, removing it from the associated card atoms list, + * unless a card arg is supplied; then it picks that specific card, removes it from the + * associated card atoms list, and returns it (the card arg is used by the radial menu for cardhands to select + * specific cards out of the cardhand). * Arguments: * * mob/living/user - The user drawing the card. * * obj/item/toy/singlecard/card (optional) - The card drawn from the hand **/ /obj/item/toy/cards/proc/draw(mob/living/user, obj/item/toy/singlecard/card) - if(!isliving(user) || !user.can_perform_action(src, NEED_DEXTERITY| FORBID_TELEKINESIS_REACH)) + if(!isliving(user) || !user.can_perform_action(src, NEED_DEXTERITY | FORBID_TELEKINESIS_REACH)) return if(count_cards() == 0) @@ -130,13 +131,18 @@ var/list/cards = fetch_card_atoms() - card = card || cards[1] //draw the card on top + card ||= pick_card(user, cards) cards -= card update_appearance() playsound(src, 'sound/items/cards/cardflip.ogg', 50, TRUE) return card +/// Picks what card the user draws from the deck +/obj/item/toy/cards/proc/pick_card(mob/living/user, list/obj/item/toy/singlecard/cards) + // By default just pick the top card + return cards[1] + /// Returns the cards in this deck. /// Lazily generates the cards if they haven't already been made. /obj/item/toy/cards/proc/fetch_card_atoms() diff --git a/code/modules/cards/deck/blank.dm b/code/modules/cards/deck/blank.dm index 841e338fbdb3..49792446c6f9 100644 --- a/code/modules/cards/deck/blank.dm +++ b/code/modules/cards/deck/blank.dm @@ -5,7 +5,6 @@ icon_state = "deck_white_full" deckstyle = "white" has_unique_card_icons = FALSE - is_standard_deck = FALSE decksize = 25 can_play_52_card_pickup = FALSE @@ -13,9 +12,7 @@ icon_state = "deck_black_full" deckstyle = "black" -/obj/item/toy/cards/deck/blank/Initialize(mapload) - . = ..() - +/obj/item/toy/cards/deck/blank/initialize_cards() for(var/_ in 1 to decksize) initial_cards += /datum/deck_card/blank diff --git a/code/modules/cards/deck/cas.dm b/code/modules/cards/deck/cas.dm index fc713574c893..bab01179c6a2 100644 --- a/code/modules/cards/deck/cas.dm +++ b/code/modules/cards/deck/cas.dm @@ -10,7 +10,6 @@ icon_state = "deck_white_full" deckstyle = "white" has_unique_card_icons = FALSE - is_standard_deck = FALSE decksize = 150 can_play_52_card_pickup = FALSE @@ -26,8 +25,7 @@ GLOBAL_LIST_INIT(card_decks, list( white = world.file2list("strings/cas_white.txt") )) -/obj/item/toy/cards/deck/cas/Initialize(mapload) - . = ..() +/obj/item/toy/cards/deck/cas/initialize_cards() var/list/cards_against_space = GLOB.card_decks[deckstyle] var/list/possible_cards = cards_against_space.Copy() diff --git a/code/modules/cards/deck/deck.dm b/code/modules/cards/deck/deck.dm index 61d25ca92885..aa6bc6beec1b 100644 --- a/code/modules/cards/deck/deck.dm +++ b/code/modules/cards/deck/deck.dm @@ -16,8 +16,6 @@ var/shuffle_time = DECK_SHUFFLE_TIME /// Deck shuffling cooldown. COOLDOWN_DECLARE(shuffle_cooldown) - /// If the deck is the standard 52 playing card deck (used for poker and blackjack) - var/is_standard_deck = TRUE /// The amount of cards to spawn in the deck (optional) var/decksize = 54 /// The description of the cardgame that is played with this deck (used for memories) @@ -26,21 +24,25 @@ var/obj/machinery/computer/holodeck/holodeck /// If the cards in the deck have different card faces icons (blank and CAS decks do not) var/has_unique_card_icons = TRUE + /// The base sprite for the deck. + var/deck_base_icon = "deck_" /// The art style of deck used (determines both deck and card icons used) var/deckstyle = "nanotrasen" /obj/item/toy/cards/deck/Initialize(mapload) . = ..() - // Can't hold more cards than we spawn with - card_limit = decksize AddElement(/datum/element/drag_pickup) AddComponent(/datum/component/two_handed, attacksound='sound/items/cards/cardflip.ogg') register_context() - if(!is_standard_deck) - return + initialize_cards() + + if(length(initial_cards)) + card_limit = length(initial_cards) - // generate a normal playing card deck +/// Generates the cards in this deck. If not overridden, generates a standard 52-card deck (and 2 jokers). +/obj/item/toy/cards/deck/proc/initialize_cards() + SHOULD_CALL_PARENT(FALSE) // you should be overriding this for subtypes, probably initial_cards += "Joker Clown" initial_cards += "Joker Mime" for(var/suit in list("Hearts", "Spades", "Clubs", "Diamonds")) @@ -109,6 +111,16 @@ user.balloon_alert_to_viewers("shuffles the deck") addtimer(CALLBACK(src, PROC_REF(CardgameEvent), user), 60 SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE) +/** + * Grabs the top card in the deck, but does not actually manipulate the deck. + */ +/obj/item/toy/cards/deck/proc/get_top_card(mob/living/user) + if(count_cards() == 0) + to_chat(user, span_warning("There are no more cards to draw!")) + return + var/list/cards = fetch_card_atoms() + return cards[1] + /// This checks if nearby mobs are playing a cardgame and triggers a mood and memory /obj/item/toy/cards/deck/proc/CardgameEvent(mob/living/dealer) var/card_players = list() @@ -159,13 +171,13 @@ /obj/item/toy/cards/deck/update_icon_state() switch(count_cards()) if(27 to INFINITY) - icon_state = "deck_[deckstyle]_full" + icon_state = "[deck_base_icon][deckstyle]_full" if(11 to 27) - icon_state = "deck_[deckstyle]_half" + icon_state = "[deck_base_icon][deckstyle]_half" if(1 to 11) - icon_state = "deck_[deckstyle]_low" + icon_state = "[deck_base_icon][deckstyle]_low" else - icon_state = "deck_[deckstyle]_empty" + icon_state = "[deck_base_icon][deckstyle]_empty" return ..() /obj/item/toy/cards/deck/insert(obj/item/toy/card_item) @@ -196,7 +208,7 @@ return . var/mob/living/thrower = throwingdatum?.get_thrower() - if(!thrower) // if a mob didn't throw it (need two people to play 52 pickup) + if(!istype(thrower)) // if a mob didn't throw it (need two people to play 52 pickup) return target.visible_message(span_warning("[target] is forced to play 52 card pickup!"), span_warning("You are forced to play 52 card pickup.")) @@ -221,5 +233,19 @@ resistance_flags = NONE shuffle_time = DECK_SYNDIE_SHUFFLE_TIME +/// A card shoe. For holding a lot of cards, but not for committing card-based psychological warfare (crashing people by throwing 100+ cards at them). +/obj/item/toy/cards/deck/cardshoe + name = "card shoe" + desc = "A clear plastic card dispenser for holding a large amount of cards. For better or for worse, \ + the dispenser is designed to prevent a haphazard scattering of cards if thrown." + icon_state = "deckshoe_empty" // woe, codersprites upon thee + card_limit = 432 // 8 decks of 54 cards. if... you somehow need to do that much card gaming. + can_play_52_card_pickup = FALSE + deck_base_icon = "deckshoe" + deckstyle = "" // no deck style because it wouldn't matter + +/obj/item/toy/cards/deck/cardshoe/initialize_cards() + return + #undef DECK_SHUFFLE_TIME #undef DECK_SYNDIE_SHUFFLE_TIME diff --git a/code/modules/cards/deck/kotahi.dm b/code/modules/cards/deck/kotahi.dm index c4c625445a77..0e0307c400f5 100644 --- a/code/modules/cards/deck/kotahi.dm +++ b/code/modules/cards/deck/kotahi.dm @@ -4,10 +4,8 @@ cardgame_desc = "KOTAHI game" icon_state = "deck_kotahi_full" deckstyle = "kotahi" - is_standard_deck = FALSE -/obj/item/toy/cards/deck/kotahi/Initialize(mapload) - . = ..() +/obj/item/toy/cards/deck/kotahi/initialize_cards() for(var/colour in list("Red","Yellow","Green","Blue")) initial_cards += "[colour] 0" //kotahi decks have only one colour of each 0, weird huh? for(var/k in 0 to 1) //two of each colour of number diff --git a/code/modules/cards/deck/tarot.dm b/code/modules/cards/deck/tarot.dm index e68a8fe4dedf..a408b04a6cf3 100644 --- a/code/modules/cards/deck/tarot.dm +++ b/code/modules/cards/deck/tarot.dm @@ -7,10 +7,8 @@ cardgame_desc = "tarot card reading" icon_state = "deck_tarot_full" deckstyle = "tarot" - is_standard_deck = FALSE -/obj/item/toy/cards/deck/tarot/Initialize(mapload) - . = ..() +/obj/item/toy/cards/deck/tarot/initialize_cards() for(var/suit in list("Hearts", "Pikes", "Clovers", "Tiles")) for(var/i in 1 to 10) initial_cards += "[i] of [suit]" @@ -30,6 +28,23 @@ M.Turn(180) card.transform = M +/obj/item/toy/cards/deck/tarot/pick_card(mob/living/user, list/obj/item/toy/singlecard/cards) + // If the user is cursed they have increase chance of drawing Death or The Tower + if(!HAS_TRAIT(user, TRAIT_CURSED)) + return ..() + + var/total_card = length(cards) + // give a boosted chance if they're using the full deck + var/chance_modifier = total_card >= 56 ? 24 : 4 + if(!prob(min(33, chance_modifier / total_card * 100))) + return ..() + + for(var/obj/item/toy/singlecard/card as anything in cards) + if(card.cardname == "Death" || card.cardname == "The Tower") + return card + + return ..() + /obj/item/toy/cards/deck/tarot/haunted name = "haunted tarot game deck" desc = "A spooky looking tarot deck. You can sense a supernatural presence linked to the cards..." diff --git a/code/modules/cards/deck/wizoff.dm b/code/modules/cards/deck/wizoff.dm index 21eb37d96c64..d7e67825c4a8 100644 --- a/code/modules/cards/deck/wizoff.dm +++ b/code/modules/cards/deck/wizoff.dm @@ -5,10 +5,8 @@ cardgame_desc = "Wiz-Off game" icon_state = "deck_wizoff_full" deckstyle = "wizoff" - is_standard_deck = FALSE -/obj/item/toy/cards/deck/wizoff/Initialize(mapload) - . = ..() +/obj/item/toy/cards/deck/wizoff/initialize_cards() var/card_list = strings("wizoff.json", "wizard") initial_cards += new /datum/deck_card/of_type(/obj/item/toy/singlecard/wizoff_ruleset) // ruleset should be the top card for(var/card in card_list) diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm index c3106c426b29..d1323786f258 100644 --- a/code/modules/cargo/bounties/medical.dm +++ b/code/modules/cargo/bounties/medical.dm @@ -38,6 +38,7 @@ /obj/item/organ/ears/cybernetic/upgraded = TRUE, /obj/item/organ/ears/cybernetic/whisper = TRUE, /obj/item/organ/ears/cybernetic/xray = TRUE, + /obj/item/organ/ears/cybernetic/volume = TRUE, ) /datum/bounty/item/medical/liver diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index e045eb15d6b7..1961b374a47f 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -777,15 +777,13 @@ ADMIN_VERB(centcom_podlauncher, R_ADMIN, "Config/Launch Supplypod", "Configure a /datum/centcom_podlauncher/proc/clearBay() //Clear all objs and mobs from the selected bay for (var/obj/object in bay.get_all_contents()) - if (istype(object.type, /obj/effect/light_emitter/podbay)) + if (istype(object, /obj/effect/light_emitter/podbay)) continue qdel(object) - for (var/mob/mob in bay.get_all_contents()) + for (var/mob/living/mob in bay.get_all_contents()) + mob.ghostize(FALSE) qdel(mob) - for (var/bayturf in bay) - var/turf/turf_to_clear = bayturf - if (istype(turf_to_clear, /obj/effect/light_emitter/podbay)) - continue + for (var/turf/turf_to_clear in bay) turf_to_clear.ChangeTurf(/turf/open/floor/iron) /datum/centcom_podlauncher/Destroy() //The Destroy() proc. This is called by ui_close proc, or whenever the user leaves the game diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index 1e140d646df2..78241aa6d748 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -30,14 +30,6 @@ Then the player gets the profit from selling his own wasted time. ///set to false if any objects in a dry run were unscannable var/all_contents_scannable = TRUE -/// Makes sure the exports list is populated and that the report isn't null. -/proc/init_export(datum/export_report/external_report) - if(!length(GLOB.exports_list)) - setupExports() - if(isnull(external_report)) - external_report = new - return external_report - /* * Handles exporting a movable atom and its contents * Arguments: @@ -52,7 +44,8 @@ Then the player gets the profit from selling his own wasted time. if(!islist(export_markets)) export_markets = list(export_markets) - external_report = init_export(external_report) + if(!external_report) + external_report = new var/list/contents = exported_atom.get_all_contents_ignoring(ignore_typecache) @@ -73,7 +66,8 @@ Then the player gets the profit from selling his own wasted time. /// It works like export_item_and_contents(), however it ignores the contents. Meaning only `exported_atom` will be valued. /proc/export_single_item(atom/movable/exported_atom, apply_elastic = TRUE, delete_unsold = TRUE, dry_run = FALSE, datum/export_report/external_report, export_markets = list(EXPORT_MARKET_STATION)) - external_report = init_export(external_report) + if(!external_report) + external_report = new var/sold = _export_loop(exported_atom, apply_elastic, dry_run, external_report, export_markets) if(!dry_run && (sold || delete_unsold) && sold != EXPORT_SOLD_DONT_DELETE) @@ -95,23 +89,28 @@ Then the player gets the profit from selling his own wasted time. external_report.all_contents_scannable = FALSE break sold = export.sell_object(exported_atom, external_report, dry_run, apply_elastic) - external_report.exported_atoms += " [exported_atom.name]" break return sold /datum/export + abstract_type = /datum/export + /// Unit name. Only used in "Received [total_amount] [name]s [message]." var/unit_name = "" /// Message appended to the sale report var/message = "" - /// Cost of item, in cargo credits. Must not allow for infinite price dupes, see above. + + ///Price per unit of an exported item var/cost = 1 /// whether this export can have a negative impact on the cargo budget or not var/allow_negative_cost = FALSE - /// coefficient used in marginal price calculation that roughly corresponds to the inverse of price elasticity, or "quantity elasticity" - var/k_elasticity = 1/30 - /// Coefficient used in the recovery of elastic price calculation. See Process, this value and k_elasticity are multiplied together to form the exponent that returns the price to normal. - var/k_recovery_elasticity = 1/30 + ///The percentage of an items real price that is earned when selling that item on cargo + var/k_elasticity = 1 + ///The percentage decrease on this exports elasticity per unit of item sold + var/k_hit_percentile = 0.05 + ///Time taken for this exports elasticity to reach back to 100% + var/k_recovery_time = 10 MINUTES + /// The multiplier of the amount sold shown on the report. Useful for exports, such as material, which costs are not strictly per single units sold. var/amount_report_multiplier = 1 /// Type of the exported object. If none, the export datum is considered base type. @@ -125,46 +124,55 @@ Then the player gets the profit from selling his own wasted time. /// Export market that this export applies to. Defaults to EXPORT_MARKET_STATION for items sold to the standard supply shuttle, replacements exist for pirates, etc. var/sales_market = EXPORT_MARKET_STATION - /// cost includes elasticity, this does not. - var/init_cost - - - /datum/export/New() ..() - SSprocessing.processing += src - init_cost = cost - export_types = typecacheof(export_types, only_root_path = !include_subtypes, ignore_root_path = FALSE) + export_types = typecacheof(export_types, only_root_path = !include_subtypes) exclude_types = typecacheof(exclude_types) /datum/export/Destroy() - SSprocessing.processing -= src return ..() -/datum/export/process() - cost *= NUM_E**(k_elasticity * k_recovery_elasticity) - // A little note here based on the standard values for k_recovery_elasticity: 1/30 will result in a price that started at 20% to go back to 100% in around 20 minutes, ramping up over time. - if(cost > init_cost) - cost = init_cost +/datum/export/process(seconds_per_tick) + k_elasticity += seconds_per_tick / k_recovery_time + if(k_elasticity >= 1) + k_elasticity = 1 + return PROCESS_KILL -/// Checks the cost. 0 cost items are skipped in export. -/datum/export/proc/get_cost(obj/exported_item, apply_elastic = TRUE) - var/amount = get_amount(exported_item) - if(apply_elastic) - if(k_elasticity != 0) - return round((cost/k_elasticity) * (1 - NUM_E**(-1 * k_elasticity * amount))) //anti-derivative of the marginal cost function - else - return round(cost * amount) //alternative form derived from L'Hopital to avoid division by 0 - else - return round(init_cost * amount) +/** + * Returns the cost of 1 unit of the exported item + * + * Arguments + * * obj/exported_item - the item we whos base cost we are trying to compute +*/ +/datum/export/proc/get_base_cost(obj/exported_item) + return cost /* -* Checks the amount of exportable in object. Credits in the bill, sheets in the stack, etc. -* Usually acts as a multiplier for a cost, so item that has 0 amount will be skipped in export. + * Returns the amount of exportable in object. Credits in the bill, sheets in the stack, etc. + * Usually acts as a multiplier for a cost, so item that has 0 amount will be skipped in export. + * + * Arguments + * * obj/exported_item - the amount of units in this exported item */ /datum/export/proc/get_amount(obj/exported_item) return 1 + +/** + * Returns the cost of the xported item i.e. amount * base cost * elasticity if TRUE + * + * Arguments + * * obj/exported_item - the item we are trying to export + * * apply_elastic - should we use elasticity +*/ +/datum/export/proc/get_cost(obj/exported_item, apply_elastic = TRUE) + SHOULD_NOT_OVERRIDE(TRUE) + + var/total = get_base_cost(exported_item) * get_amount(exported_item) + if(apply_elastic && initial(k_elasticity) > 0) + total *= k_elasticity + return ROUND_UP(total) + /// Checks if the item is fit for export datum. /datum/export/proc/applies_to(obj/exported_item, apply_elastic = TRUE, export_markets) for(var/found_market in export_markets) @@ -206,10 +214,14 @@ Then the player gets the profit from selling his own wasted time. if(!(export_result & COMPONENT_STOP_EXPORT_REPORT)) report.total_value[src] += export_value report.total_amount[src] += export_amount * amount_report_multiplier + report.exported_atoms += "[sold_item.name]" if(!dry_run) - if(apply_elastic) - cost *= NUM_E**(-1 * k_elasticity * export_amount) //marginal cost modifier + if(apply_elastic && k_elasticity > 0) + k_elasticity -= export_amount * k_hit_percentile + if(k_elasticity < 0) + k_elasticity = 0 + SSprocessing.processing |= src SSblackbox.record_feedback("nested tally", "export_sold_cost", 1, list("[sold_item.type]", "[export_value]")) return EXPORT_SOLD @@ -225,7 +237,7 @@ Then the player gets the profit from selling his own wasted time. var/total_value = ex.total_value[src] var/total_amount = ex.total_amount[src] - var/msg = "[total_value] credits: Received [total_amount] " + var/msg = "[total_value] [MONEY_NAME]: Received [total_amount] " if(total_value > 0) msg = "+" + msg @@ -242,11 +254,3 @@ Then the player gets the profit from selling his own wasted time. msg += "." return msg -GLOBAL_LIST_EMPTY(exports_list) - -/// Called when the global exports_list is empty, and sets it up. -/proc/setupExports() - for(var/subtype in subtypesof(/datum/export)) - var/datum/export/export_datum = new subtype - if(export_datum.export_types && export_datum.export_types.len) // Exports without a type are invalid/base types - GLOB.exports_list += export_datum diff --git a/code/modules/cargo/exports/civilain_bounty.dm b/code/modules/cargo/exports/civilain_bounty.dm index 05241e0ab755..b4066bacbb1e 100644 --- a/code/modules/cargo/exports/civilain_bounty.dm +++ b/code/modules/cargo/exports/civilain_bounty.dm @@ -4,5 +4,5 @@ unit_name = "completed bounty cube" export_types = list(/obj/item/bounty_cube) -/datum/export/bounty_box/get_cost(obj/item/bounty_cube/cube, apply_elastic) +/datum/export/bounty_box/get_base_cost(obj/item/bounty_cube/cube) return cube.bounty_value + (cube.bounty_value * cube.speed_bonus) diff --git a/code/modules/cargo/exports/fish.dm b/code/modules/cargo/exports/fish.dm index 0714041d4b59..0ecf977e4cde 100644 --- a/code/modules/cargo/exports/fish.dm +++ b/code/modules/cargo/exports/fish.dm @@ -1,9 +1,8 @@ /datum/export/fish cost = 30 + k_hit_percentile = 0.03 unit_name = "fish" export_types = list(/obj/item/fish) -/datum/export/fish/get_cost(obj/item/fish/fish, apply_elastic) - var/elastic_cost = ..() - var/elastic_percent = elastic_cost / init_cost - return round(fish.get_export_price(elastic_cost, elastic_percent)) +/datum/export/fish/get_base_cost(obj/item/fish/fish) + return fish.get_export_price(..()) diff --git a/code/modules/cargo/exports/food_and_drink.dm b/code/modules/cargo/exports/food_and_drink.dm index b44c05f0c789..9fc99f8716f1 100644 --- a/code/modules/cargo/exports/food_and_drink.dm +++ b/code/modules/cargo/exports/food_and_drink.dm @@ -10,13 +10,8 @@ include_subtypes = TRUE exclude_types = list(/obj/item/food/grown) -/datum/export/food/get_cost(obj/item/food/object, allowed_categories, apply_elastic) +/datum/export/food/get_base_cost(obj/item/food/object) if(HAS_TRAIT(object, TRAIT_FOOD_SILVER)) return FOOD_PRICE_WORTHLESS - var/elastic_cost = ..() - if(object.venue_value) - var/elastic_percent = elastic_cost / init_cost - return round(object.venue_value * elastic_percent) - - return elastic_cost + return object.venue_value ? object.venue_value : ..() diff --git a/code/modules/cargo/exports/gear.dm b/code/modules/cargo/exports/gear.dm index c420191ee80d..c55afb10f444 100644 --- a/code/modules/cargo/exports/gear.dm +++ b/code/modules/cargo/exports/gear.dm @@ -1,109 +1,107 @@ -/datum/export/gear - -/datum/export/gear/sec_helmet +/datum/export/sec_helmet cost = CARGO_CRATE_VALUE * 0.5 unit_name = "helmet" export_types = list(/obj/item/clothing/head/helmet/sec) -/datum/export/gear/sec_armor +/datum/export/sec_armor cost = CARGO_CRATE_VALUE * 0.5 unit_name = "armor vest" export_types = list(/obj/item/clothing/suit/armor/vest) -/datum/export/gear/riot_shield +/datum/export/riot_shield cost = CARGO_CRATE_VALUE * 0.5 unit_name = "riot shield" export_types = list(/obj/item/shield/riot) -/datum/export/gear/mask/breath +/datum/export/breath_mask cost = CARGO_CRATE_VALUE * 0.01 unit_name = "breath mask" export_types = list(/obj/item/clothing/mask/breath) -/datum/export/gear/mask/gas +/datum/export/gas_mask cost = CARGO_CRATE_VALUE * 0.05 unit_name = "gas mask" export_types = list(/obj/item/clothing/mask/gas) include_subtypes = FALSE -/datum/export/gear/space/helmet +/datum/export/helmet_space cost = CARGO_CRATE_VALUE * 0.15 unit_name = "space helmet" export_types = list(/obj/item/clothing/head/helmet/space, /obj/item/clothing/head/helmet/space/eva, /obj/item/clothing/head/helmet/space/nasavoid) include_subtypes = FALSE -/datum/export/gear/space/suit +/datum/export/suit_space cost = CARGO_CRATE_VALUE * 0.3 unit_name = "space suit" export_types = list(/obj/item/clothing/suit/space, /obj/item/clothing/suit/space/eva, /obj/item/clothing/suit/space/nasavoid) include_subtypes = FALSE -/datum/export/gear/space/syndiehelmet +/datum/export/syndiehelmet_space cost = CARGO_CRATE_VALUE * 0.3 unit_name = "Syndicate space helmet" export_types = list(/obj/item/clothing/head/helmet/space/syndicate) -/datum/export/gear/space/syndiesuit +/datum/export/syndiesuit_space cost = CARGO_CRATE_VALUE * 0.6 unit_name = "Syndicate space suit" export_types = list(/obj/item/clothing/suit/space/syndicate) -/datum/export/gear/radhelmet +/datum/export/radhelmet cost = CARGO_CRATE_VALUE * 0.1 unit_name = "radsuit hood" export_types = list(/obj/item/clothing/head/utility/radiation) -/datum/export/gear/radsuit +/datum/export/radsuit cost = CARGO_CRATE_VALUE * 0.2 unit_name = "radsuit" export_types = list(/obj/item/clothing/suit/utility/radiation) -/datum/export/gear/biohood +/datum/export/biohood cost = CARGO_CRATE_VALUE * 0.1 unit_name = "biosuit hood" export_types = list(/obj/item/clothing/head/bio_hood) -/datum/export/gear/biosuit +/datum/export/biosuit cost = CARGO_CRATE_VALUE * 0.2 unit_name = "biosuit" export_types = list(/obj/item/clothing/suit/bio_suit) -/datum/export/gear/bombhelmet +/datum/export/bombhelmet cost = CARGO_CRATE_VALUE * 0.1 unit_name = "bomb suit hood" export_types = list(/obj/item/clothing/head/utility/bomb_hood) -/datum/export/gear/bombsuit +/datum/export/bombsuit cost = CARGO_CRATE_VALUE * 0.2 unit_name = "bomb suit" export_types = list(/obj/item/clothing/suit/utility/bomb_suit) -/datum/export/gear/lizardboots +/datum/export/lizardboots cost = CARGO_CRATE_VALUE * 0.7 unit_name = "lizard skin boots" export_types = list(/obj/item/clothing/shoes/cowboy/lizard) include_subtypes = FALSE -/datum/export/gear/lizardmasterwork +/datum/export/lizardmasterwork cost = CARGO_CRATE_VALUE * 2 unit_name = "Hugs-the-Feet lizard boots" export_types = list(/obj/item/clothing/shoes/cowboy/lizard/masterwork) -/datum/export/gear/bilton +/datum/export/bilton cost = CARGO_CRATE_VALUE * 5 unit_name = "bilton wrangler boots" export_types = list(/obj/item/clothing/shoes/cowboy/fancy) -/datum/export/gear/ebonydie +/datum/export/ebonydie cost = CARGO_CRATE_VALUE unit_name = "ebony die" export_types = list(/obj/item/dice/d6/ebony) -/datum/export/gear/rare_lighter +/datum/export/rare_lighter cost = CARGO_CRATE_VALUE * 4 unit_name = "novelty lighter" export_types = list( diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index ed65563b02ca..d54e89241f84 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -1,4 +1,4 @@ -/datum/export/large/crate +/datum/export/crate cost = CARGO_CRATE_VALUE k_elasticity = 0 unit_name = "crate" @@ -8,121 +8,122 @@ /obj/structure/closet/crate/large, /obj/structure/closet/crate/mail, /obj/structure/closet/crate/wooden, + /obj/structure/closet/crate/cardboard, ) -/datum/export/large/crate/total_printout(datum/export_report/ex, notes = TRUE) // That's why a goddamn metal crate costs that much. +/datum/export/crate/total_printout(datum/export_report/ex, notes = TRUE) // That's why a goddamn metal crate costs that much. . = ..() if(. && notes) . += " Thanks for participating in Nanotrasen Crates Recycling Program." -/datum/export/large/crate/wooden - cost = CARGO_CRATE_VALUE/5 +/datum/export/crate/wooden + cost = CARGO_CRATE_VALUE / 5 unit_name = "large wooden crate" export_types = list(/obj/structure/closet/crate/large) exclude_types = list() -/datum/export/large/crate/wooden/ore +/datum/export/crate/wooden/ore unit_name = "ore box" export_types = list(/obj/structure/ore_box) -/datum/export/large/crate/wood +/datum/export/crate/wood cost = CARGO_CRATE_VALUE * 0.48 unit_name = "wooden crate" export_types = list(/obj/structure/closet/crate/wooden) exclude_types = list() -/datum/export/large/crate/coffin +/datum/export/crate/coffin cost = CARGO_CRATE_VALUE/2 //50 wooden crates cost 800 credits, and you can make 10 coffins in seconds with those planks. Each coffin selling for 100 means you can make a net gain of 200 credits for wasting your time making coffins. unit_name = "coffin" export_types = list(/obj/structure/closet/crate/coffin) -/datum/export/large/reagent_dispenser +/datum/export/crate/cardboard + cost = CARGO_CRATE_VALUE/5 + unit_name = "cardboard box" + export_types = list(/obj/structure/closet/crate/cardboard, /obj/structure/closet/cardboard) + +/datum/export/reagent_dispenser + abstract_type = /datum/export/reagent_dispenser cost = CARGO_CRATE_VALUE * 0.5 // +0-400 depending on amount of reagents left + ///cost for an full holder of reagents var/contents_cost = CARGO_CRATE_VALUE * 0.8 -/datum/export/large/reagent_dispenser/get_cost(obj/structure/reagent_dispensers/dispenser) - var/ratio = dispenser.reagents.total_volume / dispenser.reagents.maximum_volume +/datum/export/reagent_dispenser/get_base_cost(obj/structure/reagent_dispensers/dispenser) + return ..() + round(contents_cost * (dispenser.reagents.total_volume / dispenser.reagents.maximum_volume)) - return ..() + round(contents_cost * ratio) - -/datum/export/large/reagent_dispenser/water +/datum/export/reagent_dispenser/water unit_name = "watertank" export_types = list(/obj/structure/reagent_dispensers/watertank) contents_cost = CARGO_CRATE_VALUE * 0.4 -/datum/export/large/reagent_dispenser/fuel +/datum/export/reagent_dispenser/fuel unit_name = "fueltank" export_types = list(/obj/structure/reagent_dispensers/fueltank) -/datum/export/large/reagent_dispenser/beer +/datum/export/reagent_dispenser/beer unit_name = "beer keg" contents_cost = CARGO_CRATE_VALUE * 3.5 export_types = list(/obj/structure/reagent_dispensers/beerkeg) -/datum/export/large/pipedispenser +/datum/export/pipedispenser cost = CARGO_CRATE_VALUE * 2.5 unit_name = "pipe dispenser" export_types = list(/obj/machinery/pipedispenser) -/datum/export/large/emitter +/datum/export/emitter cost = CARGO_CRATE_VALUE * 2.75 unit_name = "emitter" export_types = list(/obj/machinery/power/emitter) -/datum/export/large/field_generator +/datum/export/field_generator cost = CARGO_CRATE_VALUE * 2.75 unit_name = "field generator" export_types = list(/obj/machinery/field/generator) -/datum/export/large/tesla_coil +/datum/export/tesla_coil cost = CARGO_CRATE_VALUE * 2.25 unit_name = "tesla coil" export_types = list(/obj/machinery/power/energy_accumulator/tesla_coil) -/datum/export/large/supermatter +/datum/export/supermatter cost = CARGO_CRATE_VALUE * 16 unit_name = "supermatter shard" export_types = list(/obj/machinery/power/supermatter_crystal/shard) -/datum/export/large/grounding_rod +/datum/export/grounding_rod cost = CARGO_CRATE_VALUE * 1.2 unit_name = "grounding rod" export_types = list(/obj/machinery/power/energy_accumulator/grounding_rod) -/datum/export/large/iv +/datum/export/iv cost = CARGO_CRATE_VALUE * 0.25 unit_name = "iv drip" export_types = list(/obj/machinery/iv_drip) -/datum/export/large/barrier +/datum/export/barrier cost = CARGO_CRATE_VALUE * 0.25 unit_name = "security barrier" export_types = list(/obj/item/grenade/barrier, /obj/structure/barricade/security) +///Maximum number of credits you can earn from selling your gas canister cause its theoritically infinite +#define MAX_GAS_CREDITS 15000 + /** - * Gas canister exports. - * I'm going to put a quick aside here as this has been a pain to balance for several years now, and I'd like to at least break how to keep gas exports tame. - * So: Gasses are sold in canisters below, which have a variable amount of maximum pressure before they start to break. The largest of which is 9.2e13 kPa. - * This means we can determine a theoretical maximum value for gas sale prices using the ideal gas laws, as we know we have a minimum gas temperature of 2.7 kelvin. - * - * Additional note on base value. Gasses are soft capped to limit how much they're worth at large quantities, and time and time again players will find new ways to break your gasses. - * so please, *PLEASE* try not to go too much further past 10. - - * * AUTHORS NOTE: This means the theoretical, insane madman number of moles of a single gas in a can sits at a horrifying 4,098,150,709.4 moles. - * * Use this as you will, and when someone makes a quinquadrillion credits using gas exports, use these metrics as a way to balance the bejesus out of them. - * * For more information, see code\modules\atmospherics\machinery\portable\canister.dm. - */ -/datum/export/large/gas_canister + * Maximum pressure a canister can withstand is 9.2e13 kPa at a minimum of 2.7K which would contain a horrifying 4,098,150,709.4 moles. + * We don't want players making that much credits so we limit the total amount earned to MAX_GAS_CREDITS +*/ +/datum/export/gas_canister cost = CARGO_CRATE_VALUE * 0.05 //Base cost of canister. You get more for nice gases inside. unit_name = "Gas Canister" export_types = list(/obj/machinery/portable_atmospherics/canister) - k_elasticity = 0.00033 -/datum/export/large/gas_canister/get_cost(obj/machinery/portable_atmospherics/canister/canister) - var/worth = cost +/datum/export/gas_canister/get_base_cost(obj/machinery/portable_atmospherics/canister/canister) var/datum/gas_mixture/canister_mix = canister.return_air() + if(!canister_mix.total_moles()) + return 0 var/canister_gas = canister_mix.gases - var/list/gases_to_check = list( + + var/static/list/gases_to_check = list( /datum/gas/bz, /datum/gas/nitrium, /datum/gas/hypernoblium, @@ -139,14 +140,18 @@ /datum/gas/halon, ) + var/worth = cost for(var/gasID in gases_to_check) canister_mix.assert_gas(gasID) if(canister_gas[gasID][MOLES] > 0) worth += get_gas_value(gasID, canister_gas[gasID][MOLES]) + if(worth > MAX_GAS_CREDITS) + worth = MAX_GAS_CREDITS + break - canister_mix.garbage_collect() return worth -/datum/export/large/gas_canister/proc/get_gas_value(datum/gas/gasType, moles) - var/baseValue = initial(gasType.base_value) - return round((baseValue/k_elasticity) * (1 - NUM_E**(-1 * k_elasticity * moles))) +/datum/export/gas_canister/proc/get_gas_value(datum/gas/gasType, moles) + return ROUND_UP(initial(gasType.base_value) * moles) + +#undef MAX_GAS_CREDITS diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm index a764866ad287..78f98cb04da6 100644 --- a/code/modules/cargo/exports/lavaland.dm +++ b/code/modules/cargo/exports/lavaland.dm @@ -1,6 +1,7 @@ //Tendril chest artifacts and ruin loot. //Consumable or one-use items like the magic D20 and gluttony's blessing are omitted /datum/export/lavaland + abstract_type = /datum/export/lavaland unit_name = "lava planet artifact" /// Prefix to add to our unit name after generation var/prefix = null diff --git a/code/modules/cargo/exports/manifest.dm b/code/modules/cargo/exports/manifest.dm index 03fe33467fb9..861dae87027f 100644 --- a/code/modules/cargo/exports/manifest.dm +++ b/code/modules/cargo/exports/manifest.dm @@ -36,8 +36,7 @@ return TRUE return FALSE -/datum/export/manifest_error_denied/get_cost(obj/O) - var/obj/item/paper/fluff/jobs/cargo/manifest/M = O +/datum/export/manifest_error_denied/get_base_cost(obj/item/paper/fluff/jobs/cargo/manifest/M) return ..() + M.order_cost @@ -59,8 +58,7 @@ return TRUE return FALSE -/datum/export/manifest_error/get_cost(obj/O) - var/obj/item/paper/fluff/jobs/cargo/manifest/M = O +/datum/export/manifest_error/get_base_cost(obj/item/paper/fluff/jobs/cargo/manifest/M) return -min(M.order_cost * 0.5, MAX_MANIFEST_PENALTY) @@ -82,8 +80,7 @@ return TRUE return FALSE -/datum/export/manifest_correct_denied/get_cost(obj/O) - var/obj/item/paper/fluff/jobs/cargo/manifest/M = O +/datum/export/manifest_correct_denied/get_base_cost(obj/item/paper/fluff/jobs/cargo/manifest/M) return -min(M.order_cost * 0.5, MAX_MANIFEST_PENALTY) #undef MAX_MANIFEST_PENALTY diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm index 890a93eebf41..5678fb4459fc 100644 --- a/code/modules/cargo/exports/materials.dm +++ b/code/modules/cargo/exports/materials.dm @@ -1,33 +1,55 @@ /datum/export/material + abstract_type = /datum/export/material cost = 5 // Cost per SHEET_MATERIAL_AMOUNT, which is 100cm3 as of May 2023. + k_hit_percentile = 0.2 / MAX_STACK_SIZE //Meaning selling 1 full stack of materials will decrease subsequent sales by 20% + k_recovery_time = 8 MINUTES message = "cm3 of developer's tears. Please, report this on github" amount_report_multiplier = SHEET_MATERIAL_AMOUNT - 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 ) + ///Material id we are trying to + var/datum/material/material_id = null // 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 +/datum/export/material/New() + var/temp_exports = export_types + export_types = null + . = ..() + export_types = init_export_types(temp_exports) + +/** + * Inits an list of exports for this type. For performance this usually returns a static list + * + * Arguments + * * export_data - exports whos type cache we are trying to create +*/ +/datum/export/material/proc/init_export_types(export_data) + PROTECTED_PROC(TRUE) + + var/static/list/shared_exports = null + if(isnull(shared_exports)) + shared_exports = typecacheof(export_data, only_root_path = !include_subtypes) + + return shared_exports + /datum/export/material/get_amount(obj/O) - if(!material_id) - return 0 if(!isitem(O)) return 0 var/obj/item/I = O var/list/mat_comp = I.get_material_composition() var/datum/material/mat_ref = ispath(material_id) ? locate(material_id) in mat_comp : GET_MATERIAL_REF(material_id) - if(isnull(mat_comp[mat_ref])) + var/amount = mat_comp[mat_ref] + if(!amount) return 0 - var/amount = mat_comp[mat_ref] if(istype(I, /obj/item/stack/ore)) amount *= 0.8 // Station's ore redemption equipment is really goddamn good. - return round(amount / SHEET_MATERIAL_AMOUNT) // Materials. Static materials exist as parent types, while materials subject to the stock market have a fluid cost as determined by material/market types @@ -44,7 +66,7 @@ material_id = /datum/material/bananium message = "cm3 of bananium" -/datum/export/material/diamond +/datum/export/material/adamantine cost = CARGO_CRATE_VALUE material_id = /datum/material/adamantine message = "cm3 of adamantine" @@ -70,76 +92,48 @@ material_id = /datum/material/hot_ice export_types = /obj/item/stack/sheet/hot_ice +/datum/export/material/hot_ice/init_export_types(export_data) + return typecacheof(export_data, only_root_path = !include_subtypes) + /datum/export/material/metal_hydrogen cost = CARGO_CRATE_VALUE * 1.05 message = "cm3 of metallic hydrogen" material_id = /datum/material/metalhydrogen export_types = /obj/item/stack/sheet/mineral/metal_hydrogen +/datum/export/material/metal_hydrogen/init_export_types(export_data) + return typecacheof(export_data, only_root_path = !include_subtypes) + /datum/export/material/market + abstract_type = /datum/export/material/market cost = 1 - k_recovery_elasticity = 1/10 //Modeled such that a stack of materials, selling to drop the cost to ~20%, will recover fully in 8 minutes instead of 20. - export_types = list( - /obj/item/stack/sheet/mineral, - /obj/item/stack/tile/mineral, - /obj/item/stack/ore, - /obj/item/coin, - /obj/item/stock_block, - ) -/datum/export/material/market/applies_to(obj/exported_obj, apply_elastic) - . = ..() - if(istype(exported_obj, /obj/item/stock_block)) - var/obj/item/stock_block/block = exported_obj - if(!block.export_mat) - return FALSE - if(block.export_mat == material_id) - return TRUE - return FALSE - -/datum/export/material/market/get_amount(obj/exported_obj) - if(istype(exported_obj, /obj/item/stock_block)) - var/obj/item/stock_block/block = exported_obj - return block.quantity - return ..() +/datum/export/material/market/get_base_cost(obj/exported_obj) + return ..() * SSstock_market.materials_prices[material_id] -/datum/export/material/market/get_cost(obj/exported_obj, apply_elastic = TRUE) - if(!material_id) - return 0 - - var/obj/item/exported_item = exported_obj - var/amount = get_amount(exported_item) - if(!amount) - return 0 +/** + * Returns number of sheets in this item + * + * Arguments + * * obj/sold_item - the item whos sheets we are computing +*/ +/datum/export/material/market/proc/get_sheets(obj/sold_item) + PROTECTED_PROC(TRUE) - var/obj/item/stock_block/block - if(istype(exported_item, /obj/item/stock_block)) - block = exported_item - if(block.export_mat != material_id) - return 0 - - var/material_value = 0 - if(block) - if(block.fluid) - material_value = SSstock_market.materials_prices[block.export_mat] * amount - else - material_value = block.export_value - else - material_value = SSstock_market.materials_prices[material_id] * amount - return (apply_elastic ? cost : init_cost) * material_value // Cost in this case is only serving as the elastic modifier, where material value is the raw value of the sheets sold. + return get_amount(sold_item) /datum/export/material/market/sell_object(obj/sold_item, datum/export_report/report, dry_run, apply_elastic) . = ..() - var/amount = get_amount(sold_item) - if(!amount) + var/sheets = get_sheets(sold_item) + if(!sheets) return //This formula should impact lower quantity materials greater, and higher quantity materials less. Still, it's a bit rough. Tweaking may be needed. if(!dry_run) //decrease the market price - SSstock_market.adjust_material_price(material_id, -SSstock_market.materials_prices[material_id] * (amount / (amount + SSstock_market.materials_quantity[material_id]))) + SSstock_market.adjust_material_price(material_id, -SSstock_market.materials_prices[material_id] * (sheets / (sheets + SSstock_market.materials_quantity[material_id]))) //increase the stock - SSstock_market.adjust_material_quantity(material_id, amount) + SSstock_market.adjust_material_quantity(material_id, sheets) /datum/export/material/market/diamond material_id = /datum/material/diamond @@ -167,8 +161,10 @@ export_types = list( /obj/item/stack/sheet/bluespace_crystal, /obj/item/stack/ore/bluespace_crystal, - /obj/item/stock_block, - ) //For whatever reason, bluespace crystals are not a mineral + ) + +/datum/export/material/market/bscrystal/init_export_types(export_data) + return typecacheof(export_data, only_root_path = !include_subtypes) /datum/export/material/market/iron message = "cm3 of iron" @@ -179,9 +175,11 @@ /obj/item/stack/rods, /obj/item/stack/ore, /obj/item/coin, - /obj/item/stock_block, ) +/datum/export/material/market/iron/init_export_types(export_data) + return typecacheof(export_data, only_root_path = !include_subtypes) + /datum/export/material/market/glass message = "cm3 of glass" material_id = /datum/material/glass @@ -189,5 +187,32 @@ /obj/item/stack/sheet/glass, /obj/item/stack/ore, /obj/item/shard, - /obj/item/stock_block, ) + +/datum/export/material/market/glass/init_export_types(export_data) + return typecacheof(export_data, only_root_path = !include_subtypes) + +/datum/export/material/market/stock_block + amount_report_multiplier = 1 + k_hit_percentile = 0.2 //20% hit per block stock which is synomonous to an full stack of sheets + message = "" + unit_name = "stock block" + export_types = list(/obj/item/stock_block) + +/datum/export/material/market/stock_block/init_export_types(export_data) + return typecacheof(export_data, only_root_path = !include_subtypes) + +/datum/export/material/market/stock_block/get_amount(obj/item/stock_block/block) + return 1 //sold as 1 stock block but we adjust the markets via get_sheets() + +/datum/export/material/market/stock_block/get_sheets(obj/item/stock_block/block) + return block.custom_materials[block.custom_materials[1]] / SHEET_MATERIAL_AMOUNT + +/datum/export/material/market/stock_block/get_base_cost(obj/item/stock_block/block) + + return (block.fluid ? SSstock_market.materials_prices[block.custom_materials[1].type] : block.export_value) * get_sheets(block) + +/datum/export/material/market/stock_block/sell_object(obj/item/stock_block/block, datum/export_report/report, dry_run, apply_elastic) + material_id = block.custom_materials[1].type + + return ..() diff --git a/code/modules/cargo/exports/mecha.dm b/code/modules/cargo/exports/mecha.dm index 06eb94401a6e..085977f02b8f 100644 --- a/code/modules/cargo/exports/mecha.dm +++ b/code/modules/cargo/exports/mecha.dm @@ -1,24 +1,24 @@ -/datum/export/mecha/ripley +/datum/export/ripley cost = CARGO_CRATE_VALUE * 13 unit_name = "APLU MK-II Ripley" export_types = list(/obj/vehicle/sealed/mecha/ripley/mk2) -/datum/export/mecha/clarke +/datum/export/clarke cost = CARGO_CRATE_VALUE * 16 unit_name = "Clarke" export_types = list(/obj/vehicle/sealed/mecha/clarke) -/datum/export/mecha/odysseus +/datum/export/odysseus cost = CARGO_CRATE_VALUE * 11 unit_name = "Odysseus" export_types = list(/obj/vehicle/sealed/mecha/odysseus) -/datum/export/mecha/gygax +/datum/export/gygax cost = CARGO_CRATE_VALUE * 28 unit_name = "Gygax" export_types = list(/obj/vehicle/sealed/mecha/gygax) -/datum/export/mecha/durand +/datum/export/durand cost = CARGO_CRATE_VALUE * 20 unit_name = "Durand" export_types = list(/obj/vehicle/sealed/mecha/durand) diff --git a/code/modules/cargo/exports/organs.dm b/code/modules/cargo/exports/organs.dm index b446337586d0..6447d7d46276 100644 --- a/code/modules/cargo/exports/organs.dm +++ b/code/modules/cargo/exports/organs.dm @@ -2,14 +2,13 @@ #define CLIENT_ORGAN_MULT 10 /datum/export/organ + abstract_type = /datum/export/organ include_subtypes = FALSE //CentCom doesn't need organs from non-humans. -/datum/export/organ/get_cost(obj/exported_item, apply_elastic) - if(HAS_TRAIT(exported_item, TRAIT_CLIENT_STARTING_ORGAN)) - // Multiply value for organs that started in a player - // Unaffected by price elasticity as there's a limited amount of these in play - return round(init_cost * CLIENT_ORGAN_MULT) - return ..() +/datum/export/organ/get_base_cost(obj/exported_item) + // Multiply value for organs that started in a player + // Unaffected by price elasticity as there's a limited amount of these in play + return round(..() * HAS_TRAIT(exported_item, TRAIT_CLIENT_STARTING_ORGAN) ? CLIENT_ORGAN_MULT : 1) /datum/export/organ/heart cost = CARGO_CRATE_VALUE * 0.2 //For the man who has everything and nothing. @@ -46,18 +45,17 @@ unit_name = "humanoid tongue" export_types = list(/obj/item/organ/tongue) -/datum/export/organ/external/tail/lizard +/datum/export/organ/lizard_tail cost = CARGO_CRATE_VALUE * 1.25 unit_name = "lizard tail" export_types = list(/obj/item/organ/tail/lizard) - -/datum/export/organ/external/tail/cat +/datum/export/organ/cat_tail cost = CARGO_CRATE_VALUE * 1.5 unit_name = "cat tail" export_types = list(/obj/item/organ/tail/cat) -/datum/export/organ/ears/cat +/datum/export/organ/cat_ears cost = CARGO_CRATE_VALUE unit_name = "cat ears" export_types = list(/obj/item/organ/ears/cat) diff --git a/code/modules/cargo/exports/parts.dm b/code/modules/cargo/exports/parts.dm index fc8c9656fea7..d5d672425ba1 100644 --- a/code/modules/cargo/exports/parts.dm +++ b/code/modules/cargo/exports/parts.dm @@ -1,34 +1,34 @@ // Circuit boards, spare parts, etc. -/datum/export/solar/assembly +/datum/export/solar_assembly cost = CARGO_CRATE_VALUE * 0.25 unit_name = "solar panel assembly" export_types = list(/obj/item/solar_assembly) -/datum/export/solar/tracker_board +/datum/export/tracker_board cost = CARGO_CRATE_VALUE * 0.5 unit_name = "solar tracker board" export_types = list(/obj/item/electronics/tracker) -/datum/export/solar/control_board +/datum/export/control_board cost = CARGO_CRATE_VALUE * 0.75 unit_name = "solar panel control board" export_types = list(/obj/item/circuitboard/computer/solar_control) //Data Disks -/datum/export/modular_part/portabledrive/advanced +/datum/export/advanced_disk cost = CARGO_CRATE_VALUE * 0.4 unit_name = "advanced data disk" export_types = list(/obj/item/computer_disk/advanced) include_subtypes = FALSE -/datum/export/modular_part/portabledrive/super +/datum/export/super_disk cost = CARGO_CRATE_VALUE * 0.6 unit_name = "super data disk" export_types = list(/obj/item/computer_disk/super) include_subtypes = FALSE -/datum/export/modular_part/portabledrive/standard +/datum/export/standard_disk cost = CARGO_CRATE_VALUE * 0.2 unit_name = "data disk" export_types = list(/obj/item/computer_disk) diff --git a/code/modules/cargo/exports/seeds.dm b/code/modules/cargo/exports/seeds.dm index 981e77c16b62..b560c7bbee5b 100644 --- a/code/modules/cargo/exports/seeds.dm +++ b/code/modules/cargo/exports/seeds.dm @@ -1,38 +1,38 @@ /datum/export/seed cost = CARGO_CRATE_VALUE * 0.25 // Gets multiplied by potency - k_elasticity = 1 //price inelastic/quantity elastic, only need to export a few samples + k_elasticity = 0 //price inelastic/quantity elastic, only need to export a few samples unit_name = "new plant species sample" export_types = list(/obj/item/seeds) - var/needs_discovery = FALSE // Only for undiscovered species + /// Only for undiscovered species + var/needs_discovery = FALSE + /// Plants sold on the market var/static/list/discovered_plants = list() + /// Highest rarity of the most valuable seed + var/highest_rarity = 0 -/datum/export/seed/get_cost(obj/O) - var/obj/item/seeds/S = O - if(!needs_discovery && (S.type in discovered_plants)) +/datum/export/seed/New() + . = ..() + for(var/obj/item/seeds/seed as anything in subtypesof(/obj/item/seeds)) + if(seed::rarity > highest_rarity) + highest_rarity = seed::rarity + +/datum/export/seed/get_base_cost(obj/item/seeds/S) + var/discovered = discovered_plants[S.type] + if(!needs_discovery && discovered) return 0 - if(needs_discovery && !(S.type in discovered_plants)) + if(needs_discovery && !discovered) return 0 - return ..() * S.rarity // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later. + return ..() * (S.rarity / highest_rarity) // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later. -/datum/export/seed/sell_object(obj/O, datum/export_report/report, dry_run, apply_elastic) +/datum/export/seed/sell_object(obj/item/seeds/S, datum/export_report/report, dry_run, apply_elastic) . = ..() if(. && !dry_run) - var/obj/item/seeds/S = O discovered_plants[S.type] = S.potency - /datum/export/seed/potency cost = CARGO_CRATE_VALUE * 0.0125 // Gets multiplied by potency and rarity. unit_name = "improved plant sample" - export_types = list(/obj/item/seeds) needs_discovery = TRUE // Only for already discovered species -/datum/export/seed/potency/get_cost(obj/O) - var/obj/item/seeds/S = O - var/cost = ..() - if(!cost) - return 0 - - var/potDiff = (S.potency - discovered_plants[S.type]) - - return round(..() * potDiff) +/datum/export/seed/potency/get_base_cost(obj/item/seeds/S) + return ..() * (S.potency - discovered_plants[S.type]) diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm index 53ca52ab27bd..ebc821fcb4d6 100644 --- a/code/modules/cargo/exports/sheets.dm +++ b/code/modules/cargo/exports/sheets.dm @@ -1,4 +1,5 @@ /datum/export/stack + abstract_type = /datum/export/stack unit_name = "sheet" /datum/export/stack/get_amount(obj/O) @@ -9,48 +10,48 @@ // Hides -/datum/export/stack/skin/monkey +/datum/export/stack/monkey cost = CARGO_CRATE_VALUE * 0.25 unit_name = "monkey hide" export_types = list(/obj/item/stack/sheet/animalhide/monkey) -/datum/export/stack/skin/human +/datum/export/stack/human cost = CARGO_CRATE_VALUE * 0.5 unit_name = "piece" message = "of human skin" export_types = list(/obj/item/stack/sheet/animalhide/human) -/datum/export/stack/skin/goliath_hide +/datum/export/stack/goliath_hide cost = CARGO_CRATE_VALUE unit_name = "goliath hide" export_types = list(/obj/item/stack/sheet/animalhide/goliath_hide) -/datum/export/stack/skin/cat +/datum/export/stack/cat cost = CARGO_CRATE_VALUE * 0.75 unit_name = "cat hide" export_types = list(/obj/item/stack/sheet/animalhide/cat) -/datum/export/stack/skin/corgi +/datum/export/stack/corgi cost = CARGO_CRATE_VALUE unit_name = "corgi hide" export_types = list(/obj/item/stack/sheet/animalhide/corgi) -/datum/export/stack/skin/lizard +/datum/export/stack/lizard cost = CARGO_CRATE_VALUE * 0.75 unit_name = "lizard hide" export_types = list(/obj/item/stack/sheet/animalhide/lizard) -/datum/export/stack/skin/gondola +/datum/export/stack/gondola cost = CARGO_CRATE_VALUE * 10 unit_name = "gondola hide" export_types = list(/obj/item/stack/sheet/animalhide/gondola) -/datum/export/stack/skin/xeno +/datum/export/stack/xeno cost = CARGO_CRATE_VALUE * 2.5 unit_name = "alien hide" export_types = list(/obj/item/stack/sheet/animalhide/xeno) -/datum/export/stack/skin/carp +/datum/export/stack/carp cost = CARGO_CRATE_VALUE * 0.5 unit_name = "carp skin" export_types = list(/obj/item/stack/sheet/animalhide/carp) diff --git a/code/modules/cargo/exports/stamped_paperwork.dm b/code/modules/cargo/exports/stamped_paperwork.dm index 6f2c0e47ee19..ee7a52f177a5 100644 --- a/code/modules/cargo/exports/stamped_paperwork.dm +++ b/code/modules/cargo/exports/stamped_paperwork.dm @@ -5,15 +5,8 @@ exclude_types = list(/obj/item/paperwork/photocopy) //Has its own category allow_negative_cost = TRUE -/datum/export/paperwork/get_cost(obj/item/paperwork/sold_paperwork) - var/paperwork_cost = cost - - if(sold_paperwork.stamped) - paperwork_cost = ..() - else - paperwork_cost = -init_cost //Punishment for improperly filed paperwork. - - return paperwork_cost +/datum/export/paperwork/get_base_cost(obj/item/paperwork/sold_paperwork) + return sold_paperwork.stamped ? ..() : -cost /datum/export/photocopy cost = CARGO_CRATE_VALUE @@ -25,7 +18,7 @@ ///Used to track if a batch of photocopy exports has backfired var/backfired = FALSE -/datum/export/photocopy/get_cost(obj/item/paperwork/photocopy/sold_paperwork) +/datum/export/photocopy/get_base_cost(obj/item/paperwork/photocopy/sold_paperwork) if(sold_paperwork.stamped && !backfired) //Upon backfiring, no more photocopies are processed or sold until the next cargo shipment if(sold_paperwork.voided) return 0 //Voided photocopies do nothing @@ -34,12 +27,12 @@ if(prob(backfire_chance)) backfire_chance = 0 backfired = TRUE - return -init_cost * 4 //too high of an amount to allow for infinite money + return -cost * 4 //too high of an amount to allow for infinite money else return ..() else - return -init_cost + return -cost /datum/export/photocopy/total_printout(datum/export_report/ex, notes) . = ..() diff --git a/code/modules/cargo/exports/weapons.dm b/code/modules/cargo/exports/weapons.dm index bceeab64b4c8..198d1c185f49 100644 --- a/code/modules/cargo/exports/weapons.dm +++ b/code/modules/cargo/exports/weapons.dm @@ -1,6 +1,7 @@ // Weapon exports. Stun batons, disablers, etc. /datum/export/weapon + abstract_type = /datum/export/weapon include_subtypes = FALSE /datum/export/weapon/baton @@ -25,6 +26,20 @@ cost = CARGO_CRATE_VALUE unit_name = "laser gun" export_types = list(/obj/item/gun/energy/laser) + exclude_types = list( + /obj/item/gun/energy/laser/pistol, + /obj/item/gun/energy/laser/assault, + ) + +/datum/export/weapon/laser_pistol + cost = CARGO_CRATE_VALUE * 0.2 + unit_name = "laser pistol" + export_types = list(/obj/item/gun/energy/laser/pistol) + +/datum/export/weapon/laser_assault + cost = CARGO_CRATE_VALUE * 10 + unit_name = "assault laser gun" + export_types = list(/obj/item/gun/energy/laser/assault) /datum/export/weapon/disabler cost = CARGO_CRATE_VALUE * 0.5 @@ -79,4 +94,4 @@ cost = CARGO_CRATE_VALUE * 1.5 unit_name = "WT-550 automatic rifle" export_types = list(/obj/item/gun/ballistic/automatic/wt550) - + diff --git a/code/modules/cargo/exports/xenobio.dm b/code/modules/cargo/exports/xenobio.dm index 4b83e97567ec..77d4b845ec9e 100644 --- a/code/modules/cargo/exports/xenobio.dm +++ b/code/modules/cargo/exports/xenobio.dm @@ -1,41 +1,39 @@ -/datum/export/slime - -/datum/export/slime/grey +/datum/export/slime_extract_grey cost = CARGO_CRATE_VALUE * 0.05 unit_name = "grey slime core" export_types = list(/obj/item/slime_extract/grey) -/datum/export/slime/common +/datum/export/slime_extract_common cost = CARGO_CRATE_VALUE * 0.12 unit_name = "common slime core" export_types = list(/obj/item/slime_extract/metal,/obj/item/slime_extract/orange,/obj/item/slime_extract/purple,/obj/item/slime_extract/blue) -/datum/export/slime/uncommon +/datum/export/slime_extract_uncommon cost = CARGO_CRATE_VALUE * 0.2 unit_name = "uncommon slime core" export_types = list(/obj/item/slime_extract/gold,/obj/item/slime_extract/green,/obj/item/slime_extract/red,/obj/item/slime_extract/pink) -/datum/export/slime/rare +/datum/export/slime_extract_rare cost = CARGO_CRATE_VALUE * 0.28 unit_name = "rare slime core" export_types = list(/obj/item/slime_extract/silver,/obj/item/slime_extract/darkblue,/obj/item/slime_extract/darkpurple,/obj/item/slime_extract/yellow) -/datum/export/slime/charged +/datum/export/slime_extract_charged cost = CARGO_CRATE_VALUE unit_name = "\improper EMP-proof slime core" export_types = list(/obj/item/stock_parts/power_store/cell/emproof/slime) -/datum/export/slime/hypercharged +/datum/export/slime_extract_hypercharged cost = CARGO_CRATE_VALUE * 1.2 unit_name = "hypercharged slime core" export_types = list(/obj/item/stock_parts/power_store/cell/high/slime_hypercharged) -/datum/export/slime/epic //EPIIIIIIC +/datum/export/slime_extract_epic //EPIIIIIIC cost = CARGO_CRATE_VALUE * 0.44 unit_name = "epic slime core" export_types = list(/obj/item/slime_extract/black,/obj/item/slime_extract/cerulean,/obj/item/slime_extract/oil,/obj/item/slime_extract/sepia,/obj/item/slime_extract/pyrite,/obj/item/slime_extract/adamantine,/obj/item/slime_extract/lightpink,/obj/item/slime_extract/bluespace) -/datum/export/slime/rainbow +/datum/export/slime_extract_rainbow cost = CARGO_CRATE_VALUE unit_name = "rainbow slime core" export_types = list(/obj/item/slime_extract/rainbow) diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index 86a4d4f3a4fb..5bc0337fa0df 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -119,7 +119,7 @@ data["beaconError"] = using_beacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary data["hasBeacon"] = beacon != null//is there a linked beacon? data["beaconName"] = beacon ? beacon.name : "No Beacon Found" - data["printMsg"] = COOLDOWN_FINISHED(src, beacon_print_cooldown) ? "Print Beacon for [BEACON_COST] credits" : "Print Beacon for [BEACON_COST] credits ([COOLDOWN_TIMELEFT(src, beacon_print_cooldown)])" //buttontext for printing beacons + data["printMsg"] = COOLDOWN_FINISHED(src, beacon_print_cooldown) ? "Print Beacon for [BEACON_COST] [MONEY_NAME]" : "Print Beacon for [BEACON_COST] [MONEY_NAME] ([COOLDOWN_TIMELEFT(src, beacon_print_cooldown)])" //buttontext for printing beacons data["supplies"] = list() message = "Sales are near-instantaneous - please choose carefully." if(SSshuttle.supply_blocked) diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm index 210014e87de3..4415aa96ac3e 100644 --- a/code/modules/cargo/goodies.dm +++ b/code/modules/cargo/goodies.dm @@ -2,7 +2,7 @@ /datum/supply_pack/goody access = NONE group = "Goodies" - goody = TRUE + order_flags = ORDER_GOODY crate_type = null discountable = SUPPLY_PACK_STD_DISCOUNTABLE @@ -99,22 +99,36 @@ contains = list(/obj/item/gun/energy/e_gun) /datum/supply_pack/goody/laser_single - name = "Laser Gun Single-Pack" - desc = "Contains one laser gun, the lethal workhorse of Nanotrasen security everywhere." + name = "Type 5 Laser Gun Single-Pack" + desc = "Contains one Type 5 laser gun, the lethal workhorse of Nanotrasen security everywhere." cost = PAYCHECK_COMMAND * 6 access_view = ACCESS_WEAPONS contains = list(/obj/item/gun/energy/laser) /datum/supply_pack/goody/carbine_single - name = "Laser Carbine Single_Pack" - desc = "Contains one laser carbines, capable of rapidly firing weak lasers." + name = "Type 5/R Laser Carbine Single-Pack" + desc = "Contains one laser carbine. Fires a rapid burst of slightly weaker laser projectiles." cost = PAYCHECK_COMMAND * 8 access_view = ACCESS_WEAPONS contains = list(/obj/item/gun/energy/laser/carbine) +/datum/supply_pack/goody/laser_pistol_single + name = "Type 5/C Laser Pistol Single-Pack" + desc = "Contains one Type 5C laser pistol in an energy shoulder holster. Groovy." + cost = PAYCHECK_COMMAND * 2 + access_view = ACCESS_WEAPONS + contains = list(/obj/item/storage/belt/holster/energy/laser_pistol) + +/datum/supply_pack/goody/laser_single_soul + name = "Type 3 Laser Gun Single-Pack" + desc = "Contains one Type 3 laser gun. They don't make 'em like they used to." + cost = PAYCHECK_COMMAND * 6 + access_view = ACCESS_WEAPONS + contains = list(/obj/item/gun/energy/laser/soul) + /datum/supply_pack/goody/smg_single name = "Disabler SMG Single_Pack" - desc = "Contains one disabler SMGs, capable of rapidly firing weak disabler beams." + desc = "Contains one disabler SMG, capable of rapidly firing weak disabler beams." cost = PAYCHECK_COMMAND * 6 access_view = ACCESS_WEAPONS contains = list(/obj/item/gun/energy/disabler/smg) @@ -412,3 +426,9 @@ /obj/item/circuitboard/computer/shuttle/docker, /obj/item/circuitboard/machine/engine/propulsion = 2, ) + +/datum/supply_pack/goody/golfcart_key + name = "Spare Golf Cart Key" + desc = "If you in your carelessness lost the key to your golfcart you can purchase one. Unfortunately not covered by warranty." + cost = PAYCHECK_CREW * 5 + contains = list(/obj/item/key/golfcart) diff --git a/code/modules/cargo/markets/_market.dm b/code/modules/cargo/markets/_market.dm index e2a21eb12eba..4212ac63d862 100644 --- a/code/modules/cargo/markets/_market.dm +++ b/code/modules/cargo/markets/_market.dm @@ -61,7 +61,7 @@ // I can't get the price of the item and shipping in a clean way to the UI, so I have to do this. if(balance < price) - to_chat(user, span_warning("You don't have enough credits in [uplink] for [item] with [method] shipping.")) + to_chat(user, span_warning("You don't have enough [MONEY_NAME] in [uplink] for [item] with [method] shipping.")) return FALSE if(item.buy(uplink, user, method, legal_status)) diff --git a/code/modules/cargo/markets/market_items/misc.dm b/code/modules/cargo/markets/market_items/misc.dm index 7f1ede77d53f..801e4d4e76d2 100644 --- a/code/modules/cargo/markets/market_items/misc.dm +++ b/code/modules/cargo/markets/market_items/misc.dm @@ -221,3 +221,12 @@ . = ..() if(.) availability_prob *= 0.5 + +/datum/market_item/misc/tricktrickcigarettes + name = "Trick Trick Cigarettes" + desc = "Cigarettes filled with flash powder. Makes for a fun prank!" + item = /obj/item/storage/fancy/cigarettes/flash_powder + price_min = PAYCHECK_CREW + price_max = PAYCHECK_CREW * 3 + stock_max = 3 + availability_prob = 25 diff --git a/code/modules/cargo/markets/market_items/weapons.dm b/code/modules/cargo/markets/market_items/weapons.dm index 76df017d5f7a..c9326807cc5e 100644 --- a/code/modules/cargo/markets/market_items/weapons.dm +++ b/code/modules/cargo/markets/market_items/weapons.dm @@ -145,7 +145,7 @@ availability_prob = 35 /datum/market_item/weapon/surplus_esword - name = "Type I 'Iaito' Energy Sword" + name = "Pattern I 'Iaito' Energy Sword" desc = "A mass-produced energy sword. It is functionally worse than a milspec energy sword commonly found amongst paramilitary organizations. \ But hey, better than nothing. Does have some power supply problems, but nothing that a bit of percussive maintenance can't fix." item = /obj/item/melee/energy/sword/surplus diff --git a/code/modules/cargo/markets/market_telepad.dm b/code/modules/cargo/markets/market_telepad.dm index ea04c1f5bb9e..445cd3296030 100644 --- a/code/modules/cargo/markets/market_telepad.dm +++ b/code/modules/cargo/markets/market_telepad.dm @@ -93,8 +93,8 @@ . = ..() if(!(machine_stat & NOPOWER)) . += span_info("A small display reads:") - . += span_tinynoticeital("Current market restock price: [EXAMINE_HINT("[restock_cost] cr")].") - . += span_tinynoticeital("Market placement fee: [EXAMINE_HINT("[PLACE_ON_MARKET_COST] cr")].") + . += span_tinynoticeital("Current market restock price: [EXAMINE_HINT("[restock_cost] [MONEY_SYMBOL]")].") + . += span_tinynoticeital("Market placement fee: [EXAMINE_HINT("[PLACE_ON_MARKET_COST] [MONEY_SYMBOL]")].") . += span_tinynoticeital("Withholding tax on local items: [EXAMINE_HINT("[MARKET_WITHHOLDING_TAX * 100]%")].") /obj/machinery/ltsrbt/update_icon_state() @@ -192,7 +192,7 @@ return if(creds_value < restock_cost) - say("Insufficient credits!") + say("Insufficient [MONEY_NAME]!") playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 40, FALSE) return ITEM_INTERACT_BLOCKING @@ -289,7 +289,7 @@ playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 40, FALSE) return if(!card.registered_account.adjust_money(-PLACE_ON_MARKET_COST, "Market: Placement Fee")) - say("Insufficient credits!") + say("Insufficient [MONEY_NAME]!") playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 40, FALSE) return account = card.registered_account diff --git a/code/modules/cargo/markets/market_uplink.dm b/code/modules/cargo/markets/market_uplink.dm index 9a5509b5e8b6..5585f434c23a 100644 --- a/code/modules/cargo/markets/market_uplink.dm +++ b/code/modules/cargo/markets/market_uplink.dm @@ -3,7 +3,7 @@ desc = "A market uplink. Usable with markets. You probably shouldn't have this!" icon = 'icons/obj/devices/blackmarket.dmi' icon_state = "uplink" - + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.65, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3.3) // UI variables. /// What category is the current uplink viewing? var/viewing_category @@ -56,7 +56,7 @@ current_user = null data["categories"] = market ? market.categories : null data["delivery_methods"] = list() - data["money"] = "N/A cr" + data["money"] = "N/A [MONEY_SYMBOL]" if(current_user) data["money"] = current_user.account_balance data["buying"] = buying diff --git a/code/modules/cargo/materials_market.dm b/code/modules/cargo/materials_market.dm index 43bf07f5628f..83b047957c9e 100644 --- a/code/modules/cargo/materials_market.dm +++ b/code/modules/cargo/materials_market.dm @@ -17,16 +17,6 @@ idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION light_power = 3 light_range = MINIMUM_USEFUL_LIGHT_RANGE - /// What items can be converted into a stock block? Must be a stack subtype based on current implementation. - var/static/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 @@ -55,47 +45,41 @@ if(default_deconstruction_crowbar(tool)) return ITEM_INTERACT_SUCCESS -/obj/machinery/materials_market/attackby(obj/item/markable_object, mob/user, list/modifiers, list/attack_modifiers) - if(is_type_in_list(markable_object, exportable_material_items)) - if(machine_stat & NOPOWER) - balloon_alert(user, "no power!") - return FALSE - var/material_to_export - var/obj/item/stack/exportable = markable_object - for(var/datum/material/mat as anything in SSstock_market.materials_prices) - if(exportable.has_material_type(mat)) - material_to_export = mat - break //This is only for trading non-alloys, so we can break here - - - var/datum/export_report/report = export_item_and_contents(exportable, apply_elastic = FALSE, dry_run = TRUE) // We'll apply elastic price reduction when fully sold. - var/price = 0 - var/amount = 0 - for(var/exported_datum in report.total_amount) - price += report.total_value[exported_datum] - amount += report.total_amount[exported_datum] - - if(amount <= 1) - balloon_alert(user, "stack too small!") - return FALSE - - if(price <= 0) - balloon_alert(user, "not valuable enough to sell!") - return FALSE - - qdel(markable_object) - var/obj/item/stock_block/new_block = new /obj/item/stock_block(drop_location()) - new_block.export_value = price - new_block.export_mat = material_to_export - new_block.quantity = amount / SHEET_MATERIAL_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/synth_yes.ogg', 50, FALSE) - return TRUE - return ..() +/obj/machinery/materials_market/item_interaction(mob/living/user, obj/item/stack/exportable, list/modifiers) + . = NONE + if(!isstack(exportable)) + return + + if(!is_operational) + balloon_alert(user, "no power!") + return ITEM_INTERACT_FAILURE + + var/list/datum/material/materials = exportable.custom_materials + if(materials.len != 1) + balloon_alert(user, "alloy stacks not allowed") + return ITEM_INTERACT_FAILURE + + var/price = SSstock_market.materials_prices[materials[1].type] + if(!price) + balloon_alert(user, "materials in stack are worthless") + return ITEM_INTERACT_FAILURE + + if(!user.transferItemToLoc(exportable, src)) + to_chat(user, span_warning("[exportable] is stuck in hand!")) + return ITEM_INTERACT_FAILURE + + var/obj/item/stock_block/new_block = new /obj/item/stock_block(drop_location()) + new_block.export_value = price + new_block.set_custom_materials(materials) + to_chat(user, span_notice("You have created a stock block worth [new_block.export_value * exportable.amount] [MONEY_SYMBOL]! Sell it before it becomes liquid!")) + playsound(src, 'sound/machines/synth/synth_yes.ogg', 50, FALSE) + qdel(exportable) + use_energy(active_power_usage) + return ITEM_INTERACT_SUCCESS /obj/machinery/materials_market/power_change() . = ..() - if(machine_stat & NOPOWER) + if(!is_operational) set_light(0, 0) else set_light(initial(light_range), initial(light_power)) @@ -192,7 +176,7 @@ //Pulling elastic modifier into data. for(var/datum/export/material/market/export_est in GLOB.exports_list) if(export_est.material_id == traded_mat) - elastic_mult = (export_est.cost / export_est.init_cost) * 100 + elastic_mult = export_est.k_elasticity * 100 material_data += list(list( "name" = initial(traded_mat.name), @@ -288,7 +272,6 @@ var/cost = SSstock_market.materials_prices[material_bought] * quantity 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 @@ -299,14 +282,14 @@ var/prior_sheets = current_order.pack.contains[sheet_to_buy] if(prior_sheets + quantity > SSstock_market.materials_quantity[material_bought] ) say("There aren't enough sheets on the market! Please wait for more sheets to be traded before adding more.") - playsound(usr, 'sound/machines/synth/synth_no.ogg', 35, FALSE) + playsound(living_user, 'sound/machines/synth/synth_no.ogg', 35, FALSE) return // Check if the order exceeded the purchase limit var/prior_stacks = ROUND_UP(prior_sheets / MAX_STACK_SIZE) if(prior_stacks >= MAX_STACK_LIMIT) say("There are already 10 stacks of sheets on order! Please wait for them to arrive before ordering more.") - playsound(usr, 'sound/machines/synth/synth_no.ogg', 35, FALSE) + playsound(living_user, 'sound/machines/synth/synth_no.ogg', 35, FALSE) return // Prevents you from ordering more than the available budget @@ -334,7 +317,7 @@ orderer_rank = GALATIC_MATERIAL_ORDER, orderer_ckey = living_user.ckey, paying_account = is_ordering_private ? account_payable : null, - cost_type = "cr", + cost_type = MONEY_SYMBOL, can_be_cancelled = FALSE ) //first time order compute the correct cost and compare @@ -367,10 +350,6 @@ 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 its value with the market (aka fluid)? var/fluid = FALSE @@ -381,7 +360,11 @@ /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)].") + + var/datum/material/export_mat = custom_materials[1] + var/quantity = custom_materials[export_mat] / SHEET_MATERIAL_AMOUNT + . += span_notice("\The [src] is worth [quantity * export_value] [MONEY_SYMBOL], from selling [quantity] sheets of [export_mat.name].") + if(fluid) . += span_warning("\The [src] is currently liquid! Its value is based on the market price.") else @@ -393,9 +376,7 @@ update_appearance(UPDATE_ICON_STATE) /obj/item/stock_block/proc/update_value() - if(!SSstock_market.materials_prices[export_mat]) - return - export_value = quantity * SSstock_market.materials_prices[export_mat] + export_value = SSstock_market.materials_prices[custom_materials[1]] 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 d436591f7b9b..612540012584 100644 --- a/code/modules/cargo/order.dm +++ b/code/modules/cargo/order.dm @@ -72,7 +72,7 @@ coupon, charge_on_purchase = TRUE, manifest_can_fail = TRUE, - cost_type = "cr", + cost_type = MONEY_SYMBOL, can_be_cancelled = TRUE, ) id = SSshuttle.order_number++ @@ -98,7 +98,7 @@ var/cost = pack.get_cost() if(applied_coupon) //apply discount price cost *= (1 - applied_coupon.discount_pct_off) - if(paying_account && !pack.goody) //privately purchased and not a goody means 1.1x the cost + if(paying_account?.add_to_accounts && !(pack.order_flags & ORDER_GOODY)) //privately purchased and not a goody means 1.1x the cost cost *= 1.1 return round(cost) @@ -141,7 +141,7 @@ manifest_text += "Contents:
    " manifest_text += "
      " var/container_contents = list() // Associative list with the format (item_name = nº of occurrences, ...) - for(var/obj/item/stuff in container.contents - manifest_paper) + for(var/atom/movable/stuff as anything in container.contents - manifest_paper) if(isstack(stuff)) var/obj/item/stack/thing = stuff container_contents[thing.singular_name] += thing.amount @@ -189,7 +189,7 @@ else account_holder = "Cargo" var/obj/structure/closet/crate/crate = pack.generate(A, paying_account) - if(pack.contraband) + if(pack.order_flags & ORDER_CONTRABAND) for(var/atom/movable/item_within as anything in crate.get_all_contents()) ADD_TRAIT(item_within, TRAIT_CONTRABAND, INNATE_TRAIT) if(department_destination) diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index d5984da9ec98..454a24a3a257 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -7,7 +7,7 @@ ///Can the supply console send the shuttle back and forth? Used in the UI backend. var/can_send = TRUE - ///Can this console only send requests? + ///Can this console only send requests? Typically used at the cargo front desk for pedestrians. var/requestonly = FALSE ///Can you approve requests placed for cargo? Works differently between the app and the computer. var/can_approve_requests = TRUE @@ -103,11 +103,9 @@ 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) @@ -116,7 +114,6 @@ 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, @@ -124,8 +121,8 @@ "id" = order.id, "amount" = 1, "orderer" = order.orderer, - "paid" = !isnull(order.paying_account) ? 1 : 0, //number of orders purchased privatly - "dep_order" = order.department_destination ? 1 : 0, //number of orders purchased by a department + "paid" = !isnull(order.paying_account), //number of orders purchased privatly + "dep_order" = !!order.department_destination, //number of orders purchased by a department "can_be_cancelled" = order.can_be_cancelled, )) data["cart"] = list() @@ -136,15 +133,14 @@ data["requests"] = 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" = pack.name, "cost" = pack.get_cost(), "orderer" = order.orderer, "reason" = order.reason, "id" = order.id, + "account" = order.paying_account ? order.paying_account.account_holder : "Cargo Department" )) - data["amount_by_name"] = amount_by_name return data @@ -161,6 +157,9 @@ "packs" = get_packs_data(pack.group), ) + data["displayed_currency_full_name"] = " [MONEY_NAME]" + data["displayed_currency_name"] = " [MONEY_SYMBOL]" + return data /** @@ -175,14 +174,17 @@ if(pack.group != group) continue + if(pack.order_flags & ORDER_INVISIBLE) + continue + // Express console packs check - if(express && (pack.hidden || pack.special)) + if(express && (pack.order_flags & (ORDER_EMAG_ONLY | ORDER_SPECIAL))) continue - if(!express && ((pack.hidden && !(obj_flags & EMAGGED)) || (pack.special && !pack.special_enabled) || pack.drop_pod_only)) + if(!express && (((pack.order_flags & ORDER_EMAG_ONLY) && !(obj_flags & EMAGGED)) || ((pack.order_flags & ORDER_SPECIAL) && !(pack.order_flags & ORDER_SPECIAL_ENABLED)) || (pack.order_flags & ORDER_POD_ONLY))) continue - if(pack.contraband && !contraband) + if((pack.order_flags & ORDER_CONTRABAND) && !contraband) continue var/obj/item/first_item = length(pack.contains) > 0 ? pack.contains[1] : null @@ -193,9 +195,9 @@ "desc" = pack.desc || pack.name, // If there is a description, use it. Otherwise use the pack's name. "first_item_icon" = first_item?.icon, "first_item_icon_state" = first_item?.icon_state, - "goody" = pack.goody, + "goody" = (pack.order_flags & ORDER_GOODY), "access" = pack.access, - "contraband" = pack.contraband, + "contraband" = (pack.order_flags & ORDER_CONTRABAND), "contains" = pack.get_contents_ui_data(), )) @@ -223,7 +225,8 @@ 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)) + + if(((pack.order_flags & ORDER_EMAG_ONLY) && !(obj_flags & EMAGGED)) || ((pack.order_flags & ORDER_CONTRABAND) && !contraband) || (pack.order_flags & ORDER_POD_ONLY) || ((pack.order_flags & ORDER_SPECIAL) && !(pack.order_flags & ORDER_SPECIAL_ENABLED))) return var/name = "*None Provided*" @@ -238,34 +241,46 @@ rank = "Silicon" var/datum/bank_account/account - if(self_paid && isliving(user)) + if(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(IS_DEPARTMENTAL_CARD(id_card)) - say("The [src] rejects [id_card].") - return - account = id_card.registered_account - if(!istype(account)) - say("Invalid bank account.") - return - var/list/access = id_card.GetAccess() - if(pack.access_view && !(pack.access_view in access)) - say("[id_card] lacks the requisite access for this purchase.") - return + account = id_card?.registered_account // We can still assign an account for request department purposes. + if(self_paid) + if(!istype(id_card)) + say("No ID card detected.") + return + if(IS_DEPARTMENTAL_CARD(id_card)) + say("The [src] rejects [id_card].") + return + if(!istype(account)) + say("Invalid bank account.") + return + var/list/access = id_card.GetAccess() + if(pack.access_view && !(pack.access_view in access)) + 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) + var/datum/bank_account/personal_department + if(requestonly && !self_paid && !(pack.order_flags & ORDER_GOODY)) working_list = SSshuttle.request_list reason = tgui_input_text(user, "Reason", name, max_length = MAX_MESSAGE_LEN) if(isnull(reason)) return - if(pack.goody && !self_paid) + name = account?.account_holder + if(account?.account_job) + personal_department = SSeconomy.get_dep_account(account.account_job.paycheck_department) + if(!(personal_department.account_holder == "Cargo Budget")) + var/dept_choice = tgui_alert(user, "Which department are you requesting this for?", "Choose department to request from", list("Cargo Budget", "[personal_department.account_holder]")) + if(!dept_choice) + return + if(dept_choice == "Cargo Budget") + personal_department = null + + if((pack.order_flags & ORDER_GOODY) && !self_paid) playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) say("ERROR: Small crates may only be purchased by private accounts.") return @@ -276,6 +291,9 @@ say("ERROR: No more then [CARGO_MAX_ORDER] of any pack may be ordered at once") return + if(!self_paid) + account = personal_department + amount = clamp(amount, 1, CARGO_MAX_ORDER - similar_count) for(var/count in 1 to amount) var/obj/item/coupon/applied_coupon @@ -287,7 +305,7 @@ break var/datum/supply_order/order = new( - pack = pack , + pack = pack, orderer = name, orderer_rank = rank, orderer_ckey = ckey, diff --git a/code/modules/cargo/packs/_packs.dm b/code/modules/cargo/packs/_packs.dm index 71f8ed26c7a9..e4650000d15f 100644 --- a/code/modules/cargo/packs/_packs.dm +++ b/code/modules/cargo/packs/_packs.dm @@ -3,10 +3,6 @@ var/name = "Crate" /// The group that the supply pack is sorted into within the cargo purchasing UI. var/group = "" - /// Is this cargo supply pack visible to the cargo purchasing UI. - var/hidden = FALSE - /// Is this supply pack purchasable outside of the standard purchasing band? Contraband is available by multitooling the cargo purchasing board. - var/contraband = FALSE /// Cost of the crate. DO NOT GO ANY LOWER THAN X1.4 the "CARGO_CRATE_VALUE" value if using regular crates, or infinite profit will be possible! var/cost = CARGO_CRATE_VALUE * 1.4 /// What access is required to open the crate when spawned? @@ -25,24 +21,14 @@ var/desc = "" /// What typepath of crate do you spawn? var/crate_type = /obj/structure/closet/crate - /// Should we message admins? - var/dangerous = FALSE - /// Event/Station Goals/Admin enabled packs - var/special = FALSE - /// When a cargo pack can be unlocked by special events (as seen in special), this toggles if it's been enabled in the round yet (For example, after the station alert, we can now enable buying the station goal pack). - var/special_enabled = FALSE - /// Only usable by the Bluespace Drop Pod via the express cargo console - var/drop_pod_only = FALSE /// If this pack comes shipped in a specific pod when launched from the express console var/special_pod - /// Was this spawned through an admin proc? - var/admin_spawned = FALSE - /// Goodies can only be purchased by private accounts and can have coupons apply to them. They also come in a lockbox instead of a full crate, so the crate price min doesn't apply - var/goody = FALSE /// Can coupons target this pack? If so, how rarely? var/discountable = SUPPLY_PACK_NOT_DISCOUNTABLE /// Is this supply pack considered unpredictable for the purposes of testing unit testing? Examples include the stock market, or miner supply crates. If true, exempts from unit testing var/test_ignored = FALSE + /// Various properties for cargo order mostly used to determine which consoles can see it + var/order_flags = NONE /datum/supply_pack/New() id = type @@ -95,7 +81,7 @@ contains[item] = 1 for(var/iteration = 1 to contains[item]) var/atom/A = new item(C) - if(!admin_spawned) + if(!(order_flags & ORDER_ADMIN_SPAWNED)) continue A.flags_1 |= ADMIN_SPAWNED_1 @@ -126,7 +112,7 @@ */ /datum/supply_pack/custom name = "mining order" - hidden = TRUE + order_flags = ORDER_INVISIBLE crate_name = "shaft mining delivery crate" access = ACCESS_MINING test_ignored = TRUE @@ -186,6 +172,6 @@ while(sheets_to_spawn) var/spawn_quantity = min(sheets_to_spawn, MAX_STACK_SIZE) var/obj/item/stack/sheet/ordered_stack = new possible_stack(C, spawn_quantity) - if(admin_spawned) + if(order_flags & ORDER_ADMIN_SPAWNED) ordered_stack.flags_1 |= ADMIN_SPAWNED_1 sheets_to_spawn -= spawn_quantity diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm index 325af2c95226..bd543d84ad49 100644 --- a/code/modules/cargo/packs/costumes_toys.dm +++ b/code/modules/cargo/packs/costumes_toys.dm @@ -74,7 +74,7 @@ name = "Hilarious Firing Pin Crate" desc = "I uh... I'm not really sure what this does. Wanna buy it?" cost = CARGO_CRATE_VALUE * 10 - contraband = TRUE + order_flags = ORDER_CONTRABAND contains = list(/obj/item/firing_pin/clown) crate_name = "toy crate" // It's /technically/ a toy. For the clown, at least. crate_type = /obj/structure/closet/crate/wooden @@ -110,7 +110,7 @@ name = "Laser Tag Firing Pins Crate" desc = "Three laser tag firing pins used in laser-tag units to ensure users are wearing their vests." cost = CARGO_CRATE_VALUE * 3.5 - contraband = TRUE + order_flags = ORDER_CONTRABAND contains = list(/obj/item/storage/box/lasertagpins) crate_name = "laser tag crate" @@ -190,7 +190,7 @@ if(prob(50)) the_toy = pick_weight(GLOB.arcade_prize_pool) else - the_toy = pick(subtypesof(/obj/item/toy/plush)) + the_toy = /obj/effect/spawner/random/entertainment/plushie_delux new the_toy(C) /datum/supply_pack/costumes_toys/wizard @@ -281,3 +281,39 @@ crate_name = "long balloons kit" crate_type = /obj/structure/closet/crate/wooden discountable = SUPPLY_PACK_STD_DISCOUNTABLE + +/datum/supply_pack/costumes_toys/christmas + name = "Surplus Christmas Gifts" + desc = "This crate contains pre-wrapped gifts addressed to station employees, sourced at random from Nanotrasen surplus as part of a morale boosting initiative." + cost = CARGO_CRATE_VALUE * 30 + contains = list() + order_flags = ORDER_SPECIAL + crate_type = /obj/structure/closet/crate/mail + discountable = SUPPLY_PACK_NOT_DISCOUNTABLE + +/datum/supply_pack/costumes_toys/christmas/fill(obj/structure/closet/crate/crate) + var/list/mail_recipients = list() + for(var/mob/living/carbon/human/human in GLOB.player_list) + if(human.stat == DEAD || !human.mind) + continue + // Skip wizards, nuke ops, cyborgs; They're not written down as employees + if(!(human.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) + continue + mail_recipients += human.mind + + for (var/i in 1 to rand(4, 6)) + var/obj/item/gift/anything/gift = new(crate) + var/datum/mind/recipient = pick_n_take(mail_recipients) + if(recipient) + gift.assign_recipient(recipient) + else + qdel(gift) + break + + var/obj/item/delivery/big/parcel = new(crate.loc) + parcel.base_icon_state = crate.delivery_icon + parcel.giftwrapped = TRUE + parcel.update_icon() + parcel.drag_slowdown = crate.drag_slowdown + crate.forceMove(parcel) + parcel.name = "christmas gifts" diff --git a/code/modules/cargo/packs/engineering.dm b/code/modules/cargo/packs/engineering.dm index ee808e9a8d61..84e0ee501c16 100644 --- a/code/modules/cargo/packs/engineering.dm +++ b/code/modules/cargo/packs/engineering.dm @@ -160,7 +160,7 @@ devastating feat of human engineering and testament to wartime determination. \ Highly advanced research is required for proper construction." cost = CARGO_CRATE_VALUE * 30 - special = TRUE + order_flags = ORDER_SPECIAL access_view = ACCESS_COMMAND contains = list(/obj/item/paper/guides/jobs/engineering/bsa, /obj/item/circuitboard/machine/bsa/front, @@ -176,7 +176,7 @@ library of scientific knowledge, capable of granting superhuman powers and abilities. \ Highly advanced research is required for proper construction. Also contains five DNA probes." cost = CARGO_CRATE_VALUE * 24 - special = TRUE + order_flags = ORDER_SPECIAL access_view = ACCESS_COMMAND contains = list(/obj/item/circuitboard/machine/dna_vault, /obj/item/dna_probe = 5, @@ -187,7 +187,7 @@ name = "DNA Vault Samplers" desc = "Contains five DNA probes for use in the DNA vault." cost = CARGO_CRATE_VALUE * 6 - special = TRUE + order_flags = ORDER_SPECIAL access_view = ACCESS_COMMAND contains = list(/obj/item/dna_probe = 5) crate_name= "dna samplers crate" @@ -236,7 +236,7 @@ contains = list(/obj/machinery/power/emitter = 2) crate_name = "emitter crate" crate_type = /obj/structure/closet/crate/secure/engineering - dangerous = TRUE + order_flags = ORDER_DANGEROUS /datum/supply_pack/engine/field_gen name = "Field Generator Crate" @@ -276,7 +276,7 @@ contains = list(/obj/machinery/power/supermatter_crystal/shard) crate_name = "supermatter shard crate" crate_type = /obj/structure/closet/crate/secure/radiation - dangerous = TRUE + order_flags = ORDER_DANGEROUS discountable = SUPPLY_PACK_RARE_DISCOUNTABLE /datum/supply_pack/engine/tesla_coils @@ -302,12 +302,12 @@ ) crate_name = "HFR crate" crate_type = /obj/structure/closet/crate/secure/engineering/atmos - dangerous = TRUE + order_flags = ORDER_DANGEROUS /datum/supply_pack/engineering/rad_protection_modules name = "Radiation Protection Modules" desc = "Contains multiple radiation protections modules for MODsuits." - hidden = TRUE + order_flags = ORDER_INVISIBLE contains = list(/obj/item/mod/module/rad_protection = 3) crate_name = "modsuit radiation modules" crate_type = /obj/structure/closet/crate/engineering @@ -317,7 +317,7 @@ desc = "Contains circuitboards and radiation modules for constructing radioactive nebula shielding." cost = CARGO_CRATE_VALUE * 2 - special = TRUE + order_flags = ORDER_SPECIAL contains = list( /obj/item/mod/module/rad_protection = 5, /obj/item/circuitboard/machine/radioactive_nebula_shielding = 5, @@ -334,3 +334,13 @@ contains = list(/obj/machinery/power/portagrav = 1) crate_name = "portable gravity unit crate" crate_type = /obj/structure/closet/crate/engineering + +/datum/supply_pack/engineering/golfcart + name = "Golf Cart Parts Kit Crate" + desc = "Contains the parts to build a cart intended for moving heavy machinery and cargo across the station. \ + Nanotrasen assumes no liability for carts operated as 'party wagons'." + cost = CARGO_CRATE_VALUE * 11 + access_view = ACCESS_ENGINEERING + contains = list(/obj/item/golfcart_kit = 1, /obj/item/key/golfcart = 2, /obj/item/stock_parts/power_store/cell/lead = 1) + crate_name = "golf cart parts kit" + crate_type = /obj/structure/closet/crate/engineering diff --git a/code/modules/cargo/packs/exploration.dm b/code/modules/cargo/packs/exploration.dm index 17f1ce1cb2c7..12b56130c2ca 100644 --- a/code/modules/cargo/packs/exploration.dm +++ b/code/modules/cargo/packs/exploration.dm @@ -1,7 +1,7 @@ /// Exploration drone unlockables /// /datum/supply_pack/exploration - special = TRUE + order_flags = ORDER_SPECIAL group = "Outsourced" /datum/supply_pack/exploration/scrapyard diff --git a/code/modules/cargo/packs/general.dm b/code/modules/cargo/packs/general.dm index ca70a1674282..ab0a1ed5cfb8 100644 --- a/code/modules/cargo/packs/general.dm +++ b/code/modules/cargo/packs/general.dm @@ -113,7 +113,7 @@ /obj/item/folder/red, /obj/item/folder/yellow, /obj/item/clipboard = 2, - /obj/item/stamp, + /obj/item/stamp/granted, /obj/item/stamp/denied, /obj/item/laser_pointer/purple, ) @@ -156,7 +156,7 @@ Call today and we'll shoot over a demo unit for just 300 credits!" cost = CARGO_CRATE_VALUE * 0.6 //Empty pod, so no crate refund contains = list() - drop_pod_only = TRUE + order_flags = ORDER_POD_ONLY crate_type = null special_pod = /obj/structure/closet/supplypod/bluespacepod @@ -211,7 +211,7 @@ /datum/supply_pack/misc/syndicate name = "Assorted Syndicate Gear" desc = "Contains a random assortment of syndicate gear." - special = TRUE //Cannot be ordered via cargo + order_flags = ORDER_SPECIAL //Cannot be ordered via cargo contains = list() crate_name = "syndicate gear crate" crate_type = /obj/structure/closet/crate @@ -224,8 +224,7 @@ ///Generate assorted uplink items, taking into account the same surplus modifiers used for surplus crates /datum/supply_pack/misc/syndicate/fill(obj/structure/closet/crate/C) var/list/uplink_items = list() - for(var/datum/uplink_item/item_path as anything in SStraitor.uplink_items_by_type) - var/datum/uplink_item/item = SStraitor.uplink_items_by_type[item_path] + for(var/datum/uplink_item/item as anything in SStraitor.uplink_items) if(item.purchasable_from & contents_uplink_type && item.item) uplink_items += item diff --git a/code/modules/cargo/packs/imports.dm b/code/modules/cargo/packs/imports.dm index d98d1b2ee114..71adad87aee3 100644 --- a/code/modules/cargo/packs/imports.dm +++ b/code/modules/cargo/packs/imports.dm @@ -24,7 +24,7 @@ name = "Foam Force Pistols Crate" desc = "Psst.. hey bud... remember those old foam force pistols that got discontinued for being too cool? \ Well I got two of those right here with your name on em. I'll even throw in a spare mag for each, waddya say?" - contraband = TRUE + order_flags = ORDER_CONTRABAND cost = CARGO_CRATE_VALUE * 3 contains = list( /obj/item/gun/ballistic/automatic/pistol/toy = 2, @@ -56,7 +56,7 @@ desc = "Wait, is this the right crate? It has a frowny face, what does that mean?" cost = CARGO_CRATE_VALUE * 4 contains = list(/mob/living/basic/spider/giant/hunter) - contraband = TRUE + order_flags = ORDER_CONTRABAND /datum/supply_pack/imports/bamboo50 name = "50 Bamboo Cuttings" @@ -125,7 +125,7 @@ name = "NULL_ENTRY" desc = "(*!&@#OKAY, OPERATIVE, WE SEE HOW MUCH MONEY YOU'RE FLAUNTING. FINE. HAVE THIS, AND GOOD LUCK PUTTING IT TOGETHER!#@*$" cost = CARGO_CRATE_VALUE * 100 - hidden = TRUE + order_flags = ORDER_EMAG_ONLY contains = list(/obj/item/book/granter/crafting_recipe/regal_condor) /datum/supply_pack/imports/mafia @@ -133,7 +133,7 @@ desc = "This crate contains everything you need to set up your own ethnicity-based racketeering operation." cost = CARGO_CRATE_VALUE * 4 contains = list() - contraband = TRUE + order_flags = ORDER_CONTRABAND /datum/supply_pack/imports/mafia/fill(obj/structure/closet/crate/our_crate) for(var/items in 1 to 4) @@ -148,7 +148,7 @@ name = "'Contraband' Crate" desc = "Psst.. bud... want some contraband? I can get you a poster, some nice cigs, dank, even some \ sponsored items...you know, the good stuff. Just keep it away from the cops, kay?" - contraband = TRUE + order_flags = ORDER_CONTRABAND cost = CARGO_CRATE_VALUE * 20 contains = list( /obj/effect/spawner/random/contraband = 5, @@ -162,7 +162,7 @@ SMUGGLING THIS CRATE THROUGH A FEW OUTDATED CUSTOMS CHECKPOINTS, WE'VE THE NEXT BEST THING! \ SERVICE AUTORIFLES. DON'T WORRY, THE RUMORS ABOUT THE GUN MELTING YOU ARE JUST THAT! RUMORS! \ THESE THINGS WORK FINE! MIGHT BE SLIGHTLY DIRTY.!#@*$" - hidden = TRUE + order_flags = ORDER_EMAG_ONLY cost = CARGO_CRATE_VALUE * 7 contains = list( /obj/item/gun/ballistic/automatic/wt550 = 2, @@ -173,7 +173,7 @@ /datum/supply_pack/imports/wt550ammo name = "Smuggled WT-550 Ammo Crate" desc = "(*!&@#OPERATIVE, YOU LIKE THAT WT-550? THEN WHY NOT EQUIP YOURSELF WITH SOME MORE AMMO!!#@*$" - hidden = TRUE + order_flags = ORDER_EMAG_ONLY cost = CARGO_CRATE_VALUE * 4 contains = list( /obj/item/ammo_box/magazine/wt550m9 = 2, @@ -187,7 +187,7 @@ 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 AN ARMOR VEST AND HELMET, A BOX OF FIVE EMP GRENADES, THREE SMOKEBOMBS, TWO GLUON GRENADES AND TWO FRAG GRENADES!#@*$" - hidden = TRUE + order_flags = ORDER_EMAG_ONLY cost = CARGO_CRATE_VALUE * 10 contains = list( /obj/item/storage/box/emps, @@ -203,7 +203,7 @@ name = "Special Ops Crate" desc = "(*!&@#THE PIGS ON YOUR TAIL? MAYBE YOU CAN BUY SOME TIME WITH THIS CRATE! \ CONTAINS A CHAMELEON MASK, BELT AND JUMPSUIT, MIRAGE GRENADES AND AN AGENT CARD! AND A KNIFE!!#@*$" - hidden = TRUE + order_flags = ORDER_EMAG_ONLY cost = CARGO_CRATE_VALUE * 10 contains = list( /obj/item/clothing/mask/chameleon, @@ -220,7 +220,7 @@ desc = "Hello <;~insert appropriate greeting here: 'Comrade'|'Imperalist Scum'|'Quartermaster of Reputable Station'~;>, \ we have the most modern russian military equipment the black market can offer, for the right price of course. \ No lock, best price." - contraband = TRUE + order_flags = ORDER_CONTRABAND cost = CARGO_CRATE_VALUE * 12 contains = list( /obj/item/food/rationpack, @@ -252,7 +252,7 @@ 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 \ dead comrade when you run out." - hidden = TRUE + order_flags = ORDER_EMAG_ONLY cost = CARGO_CRATE_VALUE * 6 contains = list(/obj/item/gun/ballistic/rifle/boltaction = 6) @@ -261,7 +261,7 @@ desc = "TUNNEL SNAKES OWN THIS TOWN. Contains an unbranded All Terrain Vehicle, and a \ complete gang outfit -- consists of black gloves, a menacing skull bandanna, and a SWEET leather overcoat!" cost = CARGO_CRATE_VALUE * 4 - contraband = TRUE + order_flags = ORDER_CONTRABAND contains = list( /obj/vehicle/ridden/atv, /obj/item/key/atv, @@ -280,8 +280,7 @@ contains = list() crate_type = /obj/structure/closet/crate/secure/loot crate_name = "abandoned crate" - contraband = TRUE - dangerous = TRUE //these are literally bombs so.... + order_flags = ORDER_CONTRABAND | ORDER_DANGEROUS //these are literally bombs so.... discountable = SUPPLY_PACK_RARE_DISCOUNTABLE /datum/supply_pack/imports/shambler_evil @@ -290,7 +289,7 @@ 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 + order_flags = ORDER_CONTRABAND /datum/supply_pack/imports/hide name = "Animal Hide Crate" @@ -312,7 +311,7 @@ name = "Big Slappy parts" desc = "Illegal Big Slappy parts. The fastest and statistically most dangerous wrench." cost = CARGO_CRATE_VALUE * 22 - contraband = TRUE + order_flags = ORDER_CONTRABAND contains = list(/obj/item/weaponcrafting/giant_wrench) crate_name = "unknown parts crate" @@ -337,7 +336,7 @@ espionage uniform used by the very best. Providing the best \ flexibility, with our latest Camo-tech threads. Perfect for \ risky espionage hallway operations. Enjoy our product!" - contraband = TRUE + order_flags = ORDER_CONTRABAND cost = CARGO_CRATE_VALUE * 6 contains = list( /obj/item/clothing/under/syndicate/floortilecamo = 3, @@ -359,7 +358,7 @@ station? Fear not, the Long-To-Short-Range-Bluespace-Transceiver (LTSRBT for short) \ is here to help. Contains a LTSRBT circuit, two bluespace crystals, and one ansible." cost = CARGO_CRATE_VALUE * 10 - contraband = TRUE + order_flags = ORDER_CONTRABAND contains = list( /obj/item/circuitboard/machine/ltsrbt, /obj/item/stack/ore/bluespace_crystal/artificial = 2, diff --git a/code/modules/cargo/packs/livestock.dm b/code/modules/cargo/packs/livestock.dm index 9adbd31c84d0..51dd406c39b6 100644 --- a/code/modules/cargo/packs/livestock.dm +++ b/code/modules/cargo/packs/livestock.dm @@ -17,7 +17,7 @@ /datum/supply_pack/critter/butterfly name = "Butterflies Crate" desc = "Not a very dangerous insect, but they do give off a better image than, say, flies or cockroaches."//is that a motherfucking worm reference - contraband = TRUE + order_flags = ORDER_CONTRABAND cost = CARGO_CRATE_VALUE * 5 contains = list(/mob/living/basic/butterfly) crate_name = "entomology samples crate" @@ -113,7 +113,7 @@ cost = CARGO_CRATE_VALUE * 8 contains = list(/mob/living/basic/crab) crate_name = "look sir free crabs" - drop_pod_only = TRUE + order_flags = ORDER_POD_ONLY /datum/supply_pack/critter/crab/generate() . = ..() @@ -218,7 +218,7 @@ /datum/supply_pack/critter/garden_gnome name = "Garden Gnome Crate" desc = "Collect them all for your garden. Comes with three!" - hidden = TRUE + order_flags = ORDER_EMAG_ONLY cost = CARGO_CRATE_VALUE * 15 contains = list(/mob/living/basic/garden_gnome) crate_name = "garden gnome crate" diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm index 2cae5797fa2d..ddd212374517 100644 --- a/code/modules/cargo/packs/medical.dm +++ b/code/modules/cargo/packs/medical.dm @@ -176,7 +176,7 @@ ) crate_name = "virus crate" crate_type = /obj/structure/closet/crate/secure/plasma - dangerous = TRUE + order_flags = ORDER_DANGEROUS /datum/supply_pack/medical/cmoturtlenecks name = "Chief Medical Officer Turtlenecks" @@ -226,3 +226,11 @@ /obj/item/pestle, ) crate_name = "organ growing kit" + +/datum/supply_pack/medical/chiral_inversing_buffer + name = "Chiral Inversing Buffer Crate" + desc = "A crate containing a rare sample of an inversing buffer. \ + It can transform impure reagents into their inverse counterparts when the right conditions are met." + cost = CARGO_CRATE_VALUE * 3 + contains = list(/obj/item/reagent_containers/cup/bottle/inversing_buffer) + crate_name = "chiral inversing buffer crate" diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm index 0b935f9fa36a..d6f6468899ae 100644 --- a/code/modules/cargo/packs/organic.dm +++ b/code/modules/cargo/packs/organic.dm @@ -4,6 +4,7 @@ /datum/supply_pack/organic/hydroponics access_view = ACCESS_HYDROPONICS + crate_type = /obj/structure/closet/crate/hydroponics /datum/supply_pack/organic/hydroponics/beekeeping_suits name = "Beekeeper Suit Crate" @@ -31,29 +32,62 @@ crate_name = "beekeeping starter crate" crate_type = /obj/structure/closet/crate/hydroponics -/datum/supply_pack/organic/randomized/chef - name = "Excellent Meat Crate" - desc = "The best cuts in the whole galaxy. Contains a random assortment of exotic meats." - cost = CARGO_CRATE_VALUE * 4 - contains = list(/obj/item/food/meat/slab/human/mutant/slime, - /obj/item/food/meat/slab/killertomato, - /obj/item/food/meat/slab/bear, - /obj/item/food/meat/slab/xeno, - /obj/item/food/meat/slab/spider, - /obj/item/food/meat/rawbacon, - /obj/item/food/meat/slab/penguin, - /obj/item/food/spiderleg, - /obj/item/food/fishmeat/carp, - /obj/item/food/meat/slab/human, - /obj/item/food/meat/slab/grassfed, - ) +/datum/supply_pack/organic/randomized + test_ignored = TRUE crate_name = "food crate" -/datum/supply_pack/organic/randomized/chef/fill(obj/structure/closet/crate/C) +/datum/supply_pack/organic/randomized/fill(obj/structure/closet/crate/C) for(var/i in 1 to 15) var/item = pick(contains) new item(C) +/datum/supply_pack/organic/randomized/chef + name = "Excellent Meat Crate" + desc = "The best cuts in the whole galaxy. Contains a random assortment of exotic meats." + cost = CARGO_CRATE_VALUE * 4 + contains = list( + /obj/item/food/meat/slab/human/mutant/slime, + /obj/item/food/meat/slab/killertomato, + /obj/item/food/meat/slab/bear, + /obj/item/food/meat/slab/xeno, + /obj/item/food/meat/slab/spider, + /obj/item/food/meat/rawbacon, + /obj/item/food/meat/slab/penguin, + /obj/item/food/spiderleg, + /obj/item/food/fishmeat/carp, + /obj/item/food/meat/slab/human, + /obj/item/food/meat/slab/grassfed, + ) + +/datum/supply_pack/organic/randomized/fruits + name = "Fruit Crate" + desc = "Rich in vitamins. Contains a lime, orange, watermelon, apple, berries and a lemon." + cost = CARGO_CRATE_VALUE * 3 + contains = list( + /obj/item/food/grown/citrus/lime, + /obj/item/food/grown/citrus/orange, + /obj/item/food/grown/watermelon, + /obj/item/food/grown/apple, + /obj/item/food/grown/berries, + /obj/item/food/grown/citrus/lemon, + ) + +/datum/supply_pack/organic/randomized/vegetables + name = "Vegetables Crate" + desc = "Grown in vats. Contains a chili, corn, tomato, potato, carrot, chanterelle, onion, pumpkin, and cucumber." + cost = CARGO_CRATE_VALUE * 1.8 + contains = list( + /obj/item/food/grown/chili, + /obj/item/food/grown/corn, + /obj/item/food/grown/tomato, + /obj/item/food/grown/potato, + /obj/item/food/grown/carrot, + /obj/item/food/grown/mushroom/chanterelle, + /obj/item/food/grown/onion, + /obj/item/food/grown/pumpkin, + /obj/item/food/grown/cucumber, + ) + /datum/supply_pack/organic/exoticseeds name = "Exotic Seeds Crate" desc = "Any entrepreneuring botanist's dream. Contains twelve different seeds, \ @@ -97,20 +131,6 @@ ) crate_name = "food crate" -/datum/supply_pack/organic/randomized/chef/fruits - name = "Fruit Crate" - desc = "Rich in vitamins. Contains a lime, orange, watermelon, apple, \ - berries and a lemon." - cost = CARGO_CRATE_VALUE * 3 - contains = list(/obj/item/food/grown/citrus/lime, - /obj/item/food/grown/citrus/orange, - /obj/item/food/grown/watermelon, - /obj/item/food/grown/apple, - /obj/item/food/grown/berries, - /obj/item/food/grown/citrus/lemon, - ) - crate_name = "food crate" - /datum/supply_pack/organic/cream_piee name = "High-yield Clown-grade Cream Pie Crate" desc = "Designed by Aussec's Advanced Warfare Research Division, \ @@ -119,13 +139,13 @@ cost = CARGO_CRATE_VALUE * 12 contains = list(/obj/item/storage/backpack/duffelbag/clown/cream_pie) crate_name = "party equipment crate" - contraband = TRUE + order_flags = ORDER_CONTRABAND access = ACCESS_THEATRE access_view = ACCESS_THEATRE crate_type = /obj/structure/closet/crate/secure discountable = SUPPLY_PACK_RARE_DISCOUNTABLE -/datum/supply_pack/organic/hydroponics +/datum/supply_pack/organic/hydroponics/supplies name = "Hydroponics Crate" desc = "Supplies for growing a great garden! Contains two bottles of ammonia, \ two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, \ @@ -140,7 +160,6 @@ /obj/item/clothing/suit/apron, ) crate_name = "hydroponics crate" - crate_type = /obj/structure/closet/crate/hydroponics /datum/supply_pack/organic/hydroponics/hydrotank name = "Hydroponics Backpack Crate" @@ -276,23 +295,6 @@ crate_name = "seeds crate" crate_type = /obj/structure/closet/crate/hydroponics -/datum/supply_pack/organic/randomized/chef/vegetables - name = "Vegetables Crate" - desc = "Grown in vats. Contains a chili, corn, tomato, potato, carrot, \ - chanterelle, onion, pumpkin, and cucumber." - cost = CARGO_CRATE_VALUE * 1.8 - contains = list(/obj/item/food/grown/chili, - /obj/item/food/grown/corn, - /obj/item/food/grown/tomato, - /obj/item/food/grown/potato, - /obj/item/food/grown/carrot, - /obj/item/food/grown/mushroom/chanterelle, - /obj/item/food/grown/onion, - /obj/item/food/grown/pumpkin, - /obj/item/food/grown/cucumber, - ) - crate_name = "food crate" - /datum/supply_pack/organic/grill name = "Grilling Starter Kit" desc = "Hey dad I'm Hungry. Hi Hungry I'm THE NEW GRILLING STARTER KIT \ @@ -331,6 +333,7 @@ ) crate_name = "\improper Tiziran Supply box" crate_type = /obj/structure/closet/crate/cardboard/tiziran + test_ignored = TRUE /datum/supply_pack/organic/mothic_supply name = "Mothic Supply Box" @@ -357,7 +360,7 @@ crate_type = /obj/structure/closet/crate/cardboard /datum/supply_pack/organic/syrup_contraband - contraband = TRUE + order_flags = ORDER_CONTRABAND name = "Contraband Syrups Box" desc = "A packaged box containing illegal coffee syrups. Possession of these carries a penalty established in the galactic penal code." cost = CARGO_CRATE_VALUE * 6 @@ -396,3 +399,50 @@ contains = list(/obj/structure/reagent_dispensers/servingdish) crate_name = "nutraslop serving dish crate" + +/datum/supply_pack/organic/hydroponics/soil_normal + name = "NT-Ag Potting Soil Crate" + desc = "A crate containing sacks of regular, commercial soil." + cost = CARGO_CRATE_VALUE * 2 + crate_name = "potting soil crate" + contains = list( + /obj/item/soil_sack = 5, + ) + +/datum/supply_pack/organic/hydroponics/soil_vermaculite + name = "NT-Ag Vermaculite Crate" + desc = "A crate containing sacks of NT-Ag vermaculite. Your favorite expanded mineral!" + cost = CARGO_CRATE_VALUE * 2 + crate_name = "vermaculite crate" + contains = list( + /obj/item/soil_sack/vermaculite = 3, + ) + +/datum/supply_pack/organic/hydroponics/soil_gel + name = "NT-Ag Hydrogel Beads Crate" + desc = "A crate containing sacks of prehydrated superabsorbent gel beads. Everyone likes some nice beads." + cost = CARGO_CRATE_VALUE * 2 + crate_name = "hydrogel beads crate" + contains = list( + /obj/item/soil_sack/gel = 3, + ) + + +/datum/supply_pack/organic/hydroponics/soil_coir + name = "NT-Ag Korta Coir Crate" + desc = "A crate containing sacks of korta root coir. Good for starting a mushroom farm!" + cost = CARGO_CRATE_VALUE * 3 + crate_name = "korta coir crate" + contains = list( + /obj/item/soil_sack/coir = 3, + ) + +/datum/supply_pack/organic/hydroponics/soil_worm + name = "NT-Ag Worm Castings Crate" + desc = "A crate containing sacks of vermicompost. Worms not included! Or?.." + cost = CARGO_CRATE_VALUE * 4 + crate_name = "worm castings crate" + contains = list( + /obj/item/soil_sack/worm = 3, + ) + diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm index 51a01c4b8a16..177ba2689b59 100644 --- a/code/modules/cargo/packs/science.dm +++ b/code/modules/cargo/packs/science.dm @@ -155,7 +155,7 @@ contains = list(/obj/item/transfer_valve = 2) crate_name = "tank transfer valves crate" crate_type = /obj/structure/closet/crate/secure/science - dangerous = TRUE + order_flags = ORDER_DANGEROUS /datum/supply_pack/science/monkey_helmets name = "Monkey Mind Magnification Helmet crate" diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index 41942e1ba47e..9754885e4234 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -144,7 +144,7 @@ The Alpha and the Omega of security headwear. Guaranteed to strike fear into the hearts \ of each and every criminal aboard the station. Also comes with a security gasmask." cost = CARGO_CRATE_VALUE * 6 //justice comes at a price. An expensive, noisy price. - contraband = TRUE + order_flags = ORDER_CONTRABAND contains = list(/obj/item/clothing/head/helmet/toggleable/justice, /obj/item/clothing/mask/gas/sechailer, ) @@ -171,7 +171,7 @@ desc = "Spare equipment found in a warehouse. Contains a constable's outfit, \ whistle, and conversion kit." cost = CARGO_CRATE_VALUE * 2.2 - contraband = TRUE + order_flags = ORDER_CONTRABAND contains = list(/obj/item/clothing/under/rank/security/constable, /obj/item/clothing/head/costume/constable, /obj/item/clothing/gloves/color/white, @@ -241,19 +241,20 @@ crate_type = /obj/structure/closet/crate/secure/plasma /datum/supply_pack/security/armory/laser - name = "Lasers Crate" - desc = "Contains three lethal, high-energy laser guns." + name = "Type 5 Laser Gun Crate" + desc = "Contains three Type 5 laser guns, developed by Nanotrasen. For when the going gets tough, you get going with the \ + Type 5 Heat Delivery System. As developed by Nanotrasen." cost = CARGO_CRATE_VALUE * 4 contains = list(/obj/item/gun/energy/laser = 3) - crate_name = "laser crate" + crate_name = "\improper Type 5 laser 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." + name = "Type 5/R Laser Carbine Crate" + desc = "Contains three Type 5R laser carbines, developed by Nanotrasen. Fires a rapid burst of slightly weaker laser projectiles." cost = CARGO_CRATE_VALUE * 9 contains = list(/obj/item/gun/energy/laser/carbine = 3) - crate_name = "laser carbine crate" + crate_name = "\improper Type 5R laser carbine crate" crate_type = /obj/structure/closet/crate/secure/plasma /datum/supply_pack/security/armory/disabler_smg @@ -266,9 +267,9 @@ /datum/supply_pack/security/armory/battle_rifle name = "NT BR-38 Crate" - desc = "An experimental energy-based ballistic battle rifle. Only available to \ - Nanotrasen stations for security purposes. DO NOT RESELL TO OUTSIDE COMPANIES. \ - Contains three NT BR-38 rifles and 6 magazines containing .38 Standard." + desc = "An experimental energy-based ballistic battle rifle, as developed by Nanotrasen. \ + Only available to Nanotrasen stations for security purposes. DO NOT RESELL TO OUTSIDE \ + COMPANIES. Contains three NT BR-38 rifles and 6 magazines containing .38 Standard." cost = CARGO_CRATE_VALUE * 100 contains = list( /obj/item/gun/ballistic/automatic/battle_rifle = 3, @@ -307,7 +308,7 @@ ) crate_name = "incendiary weapons crate" crate_type = /obj/structure/closet/crate/secure/plasma - dangerous = TRUE + order_flags = ORDER_DANGEROUS /datum/supply_pack/security/armory/mindshield name = "Mindshield Implants Crate" diff --git a/code/modules/cargo/packs/service.dm b/code/modules/cargo/packs/service.dm index 858040bb544b..919d4ca61536 100644 --- a/code/modules/cargo/packs/service.dm +++ b/code/modules/cargo/packs/service.dm @@ -7,7 +7,7 @@ back to work with this crate containing stamps, an export scanner, \ destination tagger, hand labeler and some package wrapping." cost = CARGO_CRATE_VALUE * 1.75 - contains = list(/obj/item/stamp, + contains = list(/obj/item/stamp/granted, /obj/item/stamp/denied, /obj/item/universal_scanner, /obj/item/dest_tagger, diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 441138cbdae6..08a0e649a117 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -71,6 +71,19 @@ bluespace = TRUE explosionSize = list(0,0,0,0) +/// Quick setup for if you want a pod that transports a specific object somewhere and makes it look like it is flying away +/obj/structure/closet/supplypod/transport + style = /datum/pod_style/seethrough + specialised = TRUE + explosionSize = list(0,0,0,0) + reversing = TRUE + delays = list(POD_TRANSIT = 0, POD_FALLING = 0, POD_OPENING = 0, POD_LEAVING = 0) + reverse_delays = list(POD_TRANSIT = 15, POD_FALLING = 10, POD_OPENING = 0, POD_LEAVING = 0) + custom_rev_delay = TRUE + effectQuiet = TRUE + close_sound = null + pod_flags = FIRST_SOUNDS + /obj/structure/closet/supplypod/podspawn/deathmatch desc = "A blood-red styled drop pod." specialised = TRUE @@ -300,6 +313,7 @@ if (custom_rev_delay) delays = reverse_delays backToNonReverseIcon() + SEND_SIGNAL(src, COMSIG_SUPPLYPOD_RETURNING) var/turf/return_turf = locate(reverse_dropoff_coords[1], reverse_dropoff_coords[2], reverse_dropoff_coords[3]) new /obj/effect/pod_landingzone(return_turf, src) @@ -308,9 +322,9 @@ var/list/boom = explosionSize resistance_flags = initial(resistance_flags) set_density(TRUE) //Density is originally false so the pod doesn't block anything while it's still falling through the air - AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_magnitude) if(effectShrapnel) - SEND_SIGNAL(src, COMSIG_SUPPLYPOD_LANDED) + AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_magnitude) + SEND_SIGNAL(src, COMSIG_SUPPLYPOD_LANDED) for (var/mob/living/target_living in turf_underneath) if (iscarbon(target_living)) //If effectLimb is true (which means we pop limbs off when we hit people): if (effectLimb) @@ -318,8 +332,7 @@ for (var/bp in carbon_target_mob.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands var/obj/item/bodypart/bodypart = bp if(bodypart.body_part != HEAD && bodypart.body_part != CHEST)//we dont want to kill him, just teach em a lesson! - if (!(bodypart.bodypart_flags & BODYPART_UNREMOVABLE)) - bodypart.dismember() //Using the power of flextape i've sawed this man's limb in half! + if(bodypart.dismember()) //Using the power of flextape i've sawed this man's limb in half! break if (effectOrgans) //effectOrgans means remove every organ in our mob var/mob/living/carbon/carbon_target_mob = target_living @@ -332,17 +345,16 @@ for (var/bp in carbon_target_mob.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands var/obj/item/bodypart/bodypart = bp var/destination = get_edge_target_turf(turf_underneath, pick(GLOB.alldirs)) - if (!(bodypart.bodypart_flags & BODYPART_UNREMOVABLE)) - bodypart.dismember() //Using the power of flextape i've sawed this man's bodypart in half! + if (bodypart.dismember()) //Using the power of flextape i've sawed this man's bodypart in half! bodypart.throw_at(destination, 2, 3) sleep(0.1 SECONDS) 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) + target_living.adjust_brute_loss(5000) //THATS A LOT OF DAMAGE (called just in case gib() doesnt work on em) if (!QDELETED(target_living)) 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) + target_living.adjust_brute_loss(damage) if (boom?.len == 4) boom.len += 1 @@ -364,6 +376,7 @@ moveToNullspace() addtimer(CALLBACK(src, PROC_REF(open_pod), benis), delays[POD_OPENING]) //After the opening delay passes, we use the open proc from this supplyprod while referencing the contents of the "holder", in this case the gondolapod mob else if (ispath(style, /datum/pod_style/seethrough)) + transform = matrix() open_pod(src) else addtimer(CALLBACK(src, PROC_REF(open_pod), src), delays[POD_OPENING]) //After the opening delay passes, we use the open proc from this supplypod, while referencing this supplypod's contents @@ -415,7 +428,8 @@ if (!holder) return take_contents(holder) - playsound(holder, close_sound, soundVolume*0.75, TRUE, -3) + if (close_sound) + playsound(holder, close_sound, soundVolume*0.75, TRUE, -3) holder.setClosed() addtimer(CALLBACK(src, PROC_REF(preReturn), holder), delays[POD_LEAVING] * 0.2) //Start to leave a bit after closing for cinematic effect @@ -658,7 +672,11 @@ stack_trace("Pod landingzone effect created with no pod") return INITIALIZE_HINT_QDEL transform = matrix() * 1.5 - animate(src, transform = matrix()*0.01, time = pod.delays[POD_TRANSIT]+pod.delays[POD_FALLING]) + var/arrival_time = pod.delays[POD_TRANSIT] + pod.delays[POD_FALLING] + if (arrival_time > 0) + animate(src, transform = matrix()*0.01, time = arrival_time) + else + alpha = 0 /obj/effect/pod_landingzone //This is the object that forceMoves the supplypod to its location name = "Landing Zone Indicator" @@ -685,13 +703,17 @@ if (!pod.effectStealth) helper = new (drop_location(), pod) alpha = 255 - animate(src, transform = matrix().Turn(90), time = pod.delays[POD_TRANSIT]+pod.delays[POD_FALLING]) + var/arrival_time = pod.delays[POD_TRANSIT] + pod.delays[POD_FALLING] + if (arrival_time > 0) + animate(src, transform = matrix().Turn(90), time = arrival_time) + else + alpha = 0 if (single_order) if (istype(single_order, /datum/supply_order)) var/datum/supply_order/SO = single_order if (SO.pack.crate_type) SO.generate(pod) - else if (SO.pack.goody) //Goody orders lack a crate_type and need special handling + else if (SO.pack.order_flags & ORDER_GOODY) //Goody orders lack a crate_type and need special handling SO.generateCombo(pod, SO.orderer, SO.pack.contains, SO.pack.cost) else if (istype(single_order, /atom/movable)) var/atom/movable/O = single_order @@ -701,7 +723,7 @@ if(pod.effectStun) //If effectStun is true, stun any mobs caught on this pod_landingzone until the pod gets a chance to hit them for (var/mob/living/target_living in get_turf(src)) target_living.Stun(pod.delays[POD_TRANSIT]+10, ignore_canstun = TRUE)//you ain't goin nowhere, kid. - if (pod.delays[POD_TRANSIT] + pod.delays[POD_FALLING] < pod.fallingSoundLength) + if (arrival_time < pod.fallingSoundLength) pod.fallingSoundLength = 3 //The default falling sound is a little long, so if the landing time is shorter than the default falling sound, use a special, shorter default falling sound pod.fallingSound = 'sound/items/weapons/mortar_whistle.ogg' var/soundStartTime = pod.delays[POD_TRANSIT] - pod.fallingSoundLength + pod.delays[POD_FALLING] diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm index d8b5aafdb28c..9c74037e0809 100644 --- a/code/modules/cargo/supplypod_beacon.dm +++ b/code/modules/cargo/supplypod_beacon.dm @@ -10,6 +10,7 @@ armor_type = /datum/armor/supplypod_beacon resistance_flags = FIRE_PROOF interaction_flags_click = ALLOW_SILICON_REACH + obj_flags = UNIQUE_RENAME | RENAME_NO_DESC /// The linked console var/obj/machinery/computer/cargo/express/express_console /// If linked @@ -103,17 +104,3 @@ return CLICK_ACTION_BLOCKING unlink_console() return CLICK_ACTION_SUCCESS - -/obj/item/supplypod_beacon/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(!IS_WRITING_UTENSIL(tool)) - return NONE - - var/new_beacon_name = tgui_input_text(user, "What would you like the tag to be?", "Beacon Tag", max_length = MAX_NAME_LEN) - if(isnull(new_beacon_name)) - return ITEM_INTERACT_BLOCKING - - if(!user.can_perform_action(src) || !user.can_write(tool)) - return ITEM_INTERACT_BLOCKING - - name = "[initial(name)] ([new_beacon_name])" - return ITEM_INTERACT_SUCCESS diff --git a/code/modules/cargo/universal_scanner.dm b/code/modules/cargo/universal_scanner.dm index 01d9f4e7f55f..9668c4c0bea2 100644 --- a/code/modules/cargo/universal_scanner.dm +++ b/code/modules/cargo/universal_scanner.dm @@ -120,7 +120,7 @@ if(!chosen_price || QDELETED(user) || QDELETED(src) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH) || loc != user) return new_custom_price = chosen_price - to_chat(user, span_notice("[src] will now give things a [new_custom_price] cr tag.")) + to_chat(user, span_notice("[src] will now give things a [new_custom_price] [MONEY_SYMBOL] tag.")) /obj/item/universal_scanner/item_ctrl_click(mob/user) . = CLICK_ACTION_BLOCKING @@ -149,7 +149,7 @@ . += span_notice("Ctrl-click to clear the registered account.") if(scanning_mode == SCAN_PRICE_TAG) - . += span_notice("The current custom price is set to [new_custom_price] cr. Right-click to change.") + . += span_notice("The current custom price is set to [new_custom_price] [MONEY_SYMBOL]. Right-click to change.") /obj/item/universal_scanner/add_context(atom/source, list/context, obj/item/held_item, mob/user) switch(scanning_mode) @@ -178,7 +178,7 @@ if(length(target.contents)) message = "Scanned [target] and its contents" if(price) - message += ", total value: [price] credits" + message += ", total value: [price] [MONEY_NAME]" else message += ", no export values" warning = TRUE @@ -190,7 +190,7 @@ message += ", unable to determine value." warning = TRUE else if(price) - message += ", value: [price] credits." + message += ", value: [price] [MONEY_NAME]." else message += ", no export value." warning = TRUE @@ -231,7 +231,7 @@ cube.AddComponent(/datum/component/pricetag, scanner_account, cube.handler_tip, FALSE) cube.bounty_handler_account = scanner_account - cube.bounty_handler_account.bank_card_talk("Bank account for [price ? "[price * cube.handler_tip] credit " : ""]handling tip successfully registered.") + cube.bounty_handler_account.bank_card_talk("Bank account for [price ? "[price * cube.handler_tip] [MONEY_NAME_SINGULAR] " : ""]handling tip successfully registered.") if(cube.bounty_holder_account != cube.bounty_handler_account) //No need to send a tracking update to the person scanning it cube.bounty_holder_account.bank_card_talk("[cube] was scanned in \the [get_area(cube)] by [scan_human] ([scan_human.job]).") @@ -246,7 +246,7 @@ if(isitem(target)) var/obj/item/selected_target = target selected_target.custom_price = new_custom_price - to_chat(user, span_notice("You set the price of [selected_target] to [new_custom_price] cr.")) + to_chat(user, span_notice("You set the price of [selected_target] to [new_custom_price] [MONEY_SYMBOL].")) /** * check_menu: Checks if we are allowed to interact with a radial menu diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm index 524f24eb149f..bb4ad106f737 100644 --- a/code/modules/client/client_colour.dm +++ b/code/modules/client/client_colour.dm @@ -170,6 +170,14 @@ // Color types +///we want it to be less harsh for players to take blindness quirk, this adds enough color to not cause too much eye strain +/datum/client_colour/blindness + priority = CLIENT_COLOR_HELMET_PRIORITY + split_filters = TRUE + color = list(/*R*/ 0.51,0.3,0.3,0, /*G*/ 0.29,0.51,0.29,0, /*B*/ 0.3,0.3,0.61,0, /*A*/ 0,0,0,1, /*C*/ 0,0,0,0) // dim and less saturated + fade_in = 2 SECONDS + fade_out = 2 SECONDS + ///A client color that makes the screen look a bit more grungy, halloweenesque even. /datum/client_colour/halloween_helmet priority = CLIENT_COLOR_HELMET_PRIORITY diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index ccfe4ea99e01..ef2fe78eea30 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -4,8 +4,11 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( "1622" = "Bug breaking rendering can lead to wallhacks.", - )) - +)) +GLOBAL_LIST_INIT(unrecommended_builds, list( + "1670" = "Bug breaking in-world text rendering.", + "1671" = "Bug breaking in-world text rendering.", +)) #define LIMITER_SIZE 5 #define CURRENT_SECOND 1 #define SECOND_COUNT 2 @@ -265,8 +268,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( persistent_client = new(ckey) persistent_client.set_client(src) - if(byond_version >= 516) - winset(src, null, list("browser-options" = "find,refresh,byondstorage")) + winset(src, null, list("browser-options" = "find,refresh")) // Instantiate stat panel stat_panel = new(src, "statbrowser") @@ -320,30 +322,47 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(!joined_player_preferences) continue //this shouldn't happen. - var/client/C = GLOB.directory[joined_player_ckey] - var/in_round = "" - if (joined_players[joined_player_ckey]) - in_round = " who has played in the current round" - var/message_type = "Notice" + var/client/potential_match = GLOB.directory[joined_player_ckey] + + var/matched_ip = null + var/matched_cid = null + var/same_round = FALSE - var/matches if(joined_player_preferences.last_ip == address) - matches += "IP ([address])" + matched_ip = "IP [address]" + if(joined_player_preferences.last_id == computer_id) - if(matches) - matches = "BOTH [matches] and " - alert_admin_multikey = TRUE - message_type = "MULTIKEY" - matches += "Computer ID ([computer_id])" + matched_cid = "Computer ID [computer_id]" alert_mob_dupe_login = TRUE - if(matches) - if(C) - message_admins(span_danger("[message_type]: Connecting player [key_name_admin(src)] has the same [matches] as [key_name_admin(C)][in_round].")) - log_admin_private("[message_type]: Connecting player [key_name(src)] has the same [matches] as [key_name(C)][in_round].") - else - message_admins(span_danger("[message_type]: Connecting player [key_name_admin(src)] has the same [matches] as [joined_player_ckey](no longer logged in)[in_round]. ")) - log_admin_private("[message_type]: Connecting player [key_name(src)] has the same [matches] as [joined_player_ckey](no longer logged in)[in_round].") + if(isnull(matched_ip) && isnull(matched_cid)) + continue + + if (joined_players[joined_player_ckey]) + same_round = TRUE + + var/double_match = !isnull(matched_ip) && !isnull(matched_cid) + + if(double_match && same_round) + alert_admin_multikey = TRUE + + var/list/concatables = list() + concatables += span_danger(span_bold("[double_match ? "MULTIKEY" : "Notice"]:")) + concatables += "Connecting player [key_name_admin(src)] has the same" + if(double_match) + concatables += "!BOTH! [matched_ip] and [matched_cid]" + else + concatables += (!isnull(matched_ip) ? matched_ip : matched_cid) + concatables += "as [isnull(potential_match) ? "[joined_player_ckey] (no longer logged in)" : "[key_name_admin(potential_match)]"]" + if(same_round) + concatables += span_bold("in the current round") + + concatables += "" + + var/sendable_string = jointext(concatables, " ") + + message_admins(sendable_string) + log_admin_private(strip_html_full(sendable_string, MAX_MESSAGE_LEN)) . = ..() //calls mob.Login() @@ -551,6 +570,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( to_chat(src, span_warning("Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.")) update_ambience_pref(prefs.read_preference(/datum/preference/numeric/volume/sound_ambience_volume)) + update_music_pref(prefs.read_preference(/datum/preference/numeric/volume/sound_music_volume)) // DARKPACK EDIT ADD - AMBIENCE check_ip_intel() //This is down here because of the browse() calls in tooltip/New() @@ -1124,8 +1144,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( /client/proc/open_filter_editor(atom/in_atom) if(holder) - holder.filteriffic = new /datum/filter_editor(in_atom) - holder.filteriffic.ui_interact(mob) + holder.filterrific = new /datum/filter_editor(in_atom) + holder.filterrific.ui_interact(mob) ///opens the particle editor UI for the in_atom object for this client /client/proc/open_particle_editor(atom/movable/in_atom) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 2a0402a570db..899599889f8d 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -47,6 +47,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) //Job preferences 2.0 - indexed by job title , no key or value implies never var/list/job_preferences = list() + // DARKPACK EDIT ADD START - STORYTELLR_STATS + var/list/preference_storyteller_stats = list() + // DARKPACK EDIT ADD END /// The current window, PREFERENCE_TAB_* in [`code/__DEFINES/preferences.dm`] var/current_window = PREFERENCE_TAB_CHARACTER_PREFERENCES @@ -256,12 +259,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/default_value = read_preference(requested_preference.type) // Yielding - var/new_color = input( + var/new_color = tgui_color_picker( usr, "Select new color", null, default_value || COLOR_WHITE, - ) as color | null + ) if (!new_color) return FALSE @@ -270,6 +273,30 @@ GLOBAL_LIST_EMPTY(preferences_datums) return FALSE return TRUE + // DARKPACK EDIT ADD START + if ("open_external_input_list") + var/requested_preference_key = params["preference"] + + var/datum/preference/external_choiced/requested_preference = GLOB.preference_entries_by_key[requested_preference_key] + if (isnull(requested_preference)) + return FALSE + + if (!istype(requested_preference)) + return FALSE + + var/default_value = read_preference(requested_preference.type) + + // Yielding + var/new_value = tgui_input_list(usr, "Set Preference Option", "Set Preference", requested_preference.get_choices(src), default_value) + + if (!new_value) + return FALSE + + if (!update_preference(requested_preference, new_value)) + return FALSE + + return TRUE + // DARKPACK EDIT ADD END for (var/datum/preference_middleware/preference_middleware as anything in middleware) var/delegation = preference_middleware.action_delegations[action] @@ -417,7 +444,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) return TRUE /datum/preferences/proc/GetQuirkBalance() - var/bal = 0 + var/bal = CONFIG_GET(number/default_quirk_points) for(var/V in all_quirks) var/datum/quirk/T = SSquirks.quirks[V] bal -= initial(T.value) @@ -503,13 +530,28 @@ GLOBAL_LIST_EMPTY(preferences_datums) apply_character_randomization_prefs(is_antag) apply_prefs_to(character, icon_updates) -/// Applies the given preferences to a human mob. -/datum/preferences/proc/apply_prefs_to(mob/living/carbon/human/character, icon_updates = TRUE) +/** + * Applies the given preferences to a human mob. + * + * Arguments: + * * character - The human mob to apply the preferences to + * * icon_updates - Whether to update the mob's icons after applying preferences. + * Is often skipped to save processing when an update will happen later anyway. + * * do_not_apply - A list of preference types to skip when applying preferences. + */ +/datum/preferences/proc/apply_prefs_to(mob/living/carbon/human/character, icon_updates = TRUE, list/do_not_apply) character.dna.features = list() + // DARKPACK EDIT ADD START - STORYTELLER STATS + if(preference_storyteller_stats) + apply_stats_from_prefs(character) + // DARKPACK EDIT ADD END + for (var/datum/preference/preference as anything in get_preferences_in_priority_order()) if (preference.savefile_identifier != PREFERENCE_CHARACTER) continue + if (preference.type in do_not_apply) + continue // DARKPACK EDIT ADD START - TTRPG preferences // Preferences with must_have_relevant_trait are skipped for characters who // don't have the relevant trait. diff --git a/code/modules/client/preferences/_preference.dm b/code/modules/client/preferences/_preference.dm index 669eaa8aaf92..063091f86e07 100644 --- a/code/modules/client/preferences/_preference.dm +++ b/code/modules/client/preferences/_preference.dm @@ -38,10 +38,12 @@ /// Preferences relating to World of Darkness TTRPG elements #define PREFERENCE_PRIORITY_WORLD_OF_DARKNESS 11 + +#define PREFERENCE_PRIORITY_REQUIRES_CLAN 12 // DARKPACK EDIT ADD END - TTRPG preferences /// The maximum preference priority, keep this updated, but don't use it for `priority`. -#define MAX_PREFERENCE_PRIORITY PREFERENCE_PRIORITY_WORLD_OF_DARKNESS // DARKPACK EDIT CHANGE - TTRPG Preferences +#define MAX_PREFERENCE_PRIORITY PREFERENCE_PRIORITY_REQUIRES_CLAN // DARKPACK EDIT CHANGE - TTRPG Preferences /// For choiced preferences, this key will be used to set display names in constant data. #define CHOICED_PREFERENCE_DISPLAY_NAMES "display_names" @@ -58,17 +60,13 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) /proc/init_preference_entries() var/list/output = list() - for (var/datum/preference/preference_type as anything in subtypesof(/datum/preference)) - if (initial(preference_type.abstract_type) == preference_type) - continue + for (var/datum/preference/preference_type as anything in valid_subtypesof(/datum/preference)) output[preference_type] = new preference_type return output /proc/init_preference_entries_by_key() var/list/output = list() - for (var/datum/preference/preference_type as anything in subtypesof(/datum/preference)) - if (initial(preference_type.abstract_type) == preference_type) - continue + for (var/datum/preference/preference_type as anything in valid_subtypesof(/datum/preference)) output[initial(preference_type.savefile_key)] = GLOB.preference_entries[preference_type] return output @@ -121,7 +119,7 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) /// If the selected species has this in its /datum/species/body_markings, /// will show the feature as selectable. - var/relevant_body_markings = null + var/datum/bodypart_overlay/simple/body_marking/relevant_body_markings = null /// If the selected species has this in its /datum/species/inherent_traits, /// will show the feature as selectable. @@ -129,7 +127,7 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) /// If the selected species has this in its /datum/species/var/external_organs, /// will show the feature as selectable. - var/relevant_external_organ = null + var/obj/item/organ/relevant_organ = null /// If the selected species has this head_flag by default, /// will show the feature as selectable. @@ -199,7 +197,7 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) /// Returns TRUE for a successful application. /// Return FALSE if it is invalid. /datum/preference/proc/write(list/save_data, value) - SHOULD_NOT_OVERRIDE(TRUE) + //SHOULD_NOT_OVERRIDE(TRUE) // DARKPACK EDIT REMOVAL - I want to overide this acctually c: if (!is_valid(value)) return FALSE @@ -285,7 +283,7 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) /datum/preferences/proc/write_preference(datum/preference/preference, preference_value) var/save_data = get_save_data_for_savefile_identifier(preference.savefile_identifier) var/new_value = preference.deserialize(preference_value, src) - var/success = preference.write(save_data, new_value) + var/success = preference.write(save_data, new_value, src) // DARKPACK EDIT ADD END if (success) value_cache[preference.type] = new_value return success @@ -298,7 +296,7 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) return FALSE var/new_value = preference.deserialize(preference_value, src) - var/success = preference.write(null, new_value) + var/success = preference.write(null, new_value, src) // DARKPACK EDIT CHANGE if (!success) return FALSE @@ -341,7 +339,7 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) /// Checks if this preference is relevant and thus visible to the passed preferences object. /datum/preference/proc/has_relevant_feature(datum/preferences/preferences) - if(isnull(relevant_inherent_trait) && isnull(relevant_external_organ) && isnull(relevant_head_flag) && isnull(relevant_body_markings)) + if(isnull(relevant_inherent_trait) && isnull(relevant_organ) && isnull(relevant_head_flag) && isnull(relevant_body_markings)) return TRUE return current_species_has_savekey(preferences) @@ -455,6 +453,71 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) return data +/// This subtype handles a lot of boilerplate for implementing a species preference tied to a feature key / sprite accessory +/datum/preference/choiced/species_feature + abstract_type = /datum/preference/choiced/species_feature + /// What feature key does this feature represent? + /// Does not need to be set, it will infer it from either relevant_organ or relevant_body_markings. + /// However you can set it manually if you have a more complex feature. + var/feature_key + +/datum/preference/choiced/species_feature/New() + . = ..() + if(relevant_organ && relevant_organ::bodypart_overlay) + feature_key ||= relevant_organ::bodypart_overlay::feature_key + main_feature_name ||= capitalize(relevant_organ::name) + if(relevant_body_markings) + feature_key ||= relevant_body_markings::dna_feature_key + main_feature_name ||= "Body markings" + if(isnull(feature_key)) + CRASH("`feature_key` was not set or inferable for [type]!") + +/datum/preference/choiced/species_feature/init_possible_values() + return assoc_to_keys_features(get_accessory_list()) + +/datum/preference/choiced/species_feature/create_default_value() + return get_consistent_feature_entry(get_accessory_list()) + +/datum/preference/choiced/species_feature/apply_to_human(mob/living/carbon/human/target, value) + target.dna.features[feature_key] = value + +/// Returns what acessory list to draw from +/datum/preference/choiced/species_feature/proc/get_accessory_list() as /list + return SSaccessories.feature_list[feature_key] + +/// Get a specific accessory for a given value +/datum/preference/choiced/species_feature/proc/get_accessory_for_value(value) + return get_accessory_list()[value] + +// DARKPACK EDIT ADD START +/// A preference that is a choice of one option among a fixed set. +/// Used for preferences such as clothing. +/datum/preference/external_choiced + abstract_type = /datum/preference/external_choiced + +/datum/preference/external_choiced/proc/get_choices(datum/preferences/preferences) + CRASH("`get_choices()` was not implemented for [type]!") + +/datum/preference/external_choiced/is_valid(value, datum/preferences/preferences) + return value in get_choices(preferences) + +// This guy is evil and needs preferences for like every proc +/datum/preference/external_choiced/write(list/save_data, value, datum/preferences/preferences) + if (!is_valid(value, preferences)) + return FALSE + + if (!isnull(save_data)) + save_data[savefile_key] = serialize(value) + + return TRUE + +/datum/preference/external_choiced/deserialize(input, datum/preferences/preferences) + return sanitize_inlist(input, get_choices(preferences), create_default_value(preferences)) + +/datum/preference/external_choiced/create_default_value(datum/preferences/preferences) + return pick(get_choices(preferences)) +// DARKPACK EDIT ADD END + /// A preference that represents an RGB color of something. /// Will give the value as 6 hex digits, without a hash. /datum/preference/color diff --git a/code/modules/client/preferences/accessibility.dm b/code/modules/client/preferences/accessibility.dm index e74867199788..6af31083f24f 100644 --- a/code/modules/client/preferences/accessibility.dm +++ b/code/modules/client/preferences/accessibility.dm @@ -18,3 +18,28 @@ default_value = FALSE savefile_key = "remove_double_click" savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/numeric/min_recoil_multiplier + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + maximum = 200 + minimum = 0 + savefile_key = "min_recoil_multiplier" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/numeric/min_recoil_multiplier/create_default_value() + return 100 + +/// When toggled, enables staircase indicators +/datum/preference/toggle/stair_indicator + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + default_value = TRUE + savefile_key = "stair_indicator" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/toggle/stair_indicator/apply_to_client_updated(client/client, value) + if(value || !isliving(client.mob)) // only hide, showing is more trouble than it's worth + return + + var/datum/weakref/climber_ref = WEAKREF(client.mob) + for(var/obj/structure/stairs/stair as anything in GLOB.stairs) + stair.clear_climber_image(climber_ref) diff --git a/code/modules/client/preferences/ai_emote_display.dm b/code/modules/client/preferences/ai_emote_display.dm index fc70e284583f..685887e4e491 100644 --- a/code/modules/client/preferences/ai_emote_display.dm +++ b/code/modules/client/preferences/ai_emote_display.dm @@ -6,13 +6,17 @@ should_generate_icons = TRUE /datum/preference/choiced/ai_emote_display/init_possible_values() - return assoc_to_keys(GLOB.ai_status_display_emotes) + if(!length(GLOB.ai_status_display_all_options)) + init_ai_status_display_options() + return assoc_to_keys(GLOB.ai_status_display_all_options) /datum/preference/choiced/ai_emote_display/icon_for(value) if (value == "Random") return uni_icon('icons/mob/silicon/ai.dmi', "questionmark") else - return uni_icon('icons/obj/machines/status_display.dmi', GLOB.ai_status_display_emotes[value]) + if(!length(GLOB.ai_status_display_all_options)) + init_ai_status_display_options() + return uni_icon('icons/obj/machines/status_display.dmi', GLOB.ai_status_display_all_options[value]) /datum/preference/choiced/ai_emote_display/is_accessible(datum/preferences/preferences) if (!..(preferences)) diff --git a/code/modules/client/preferences/language.dm b/code/modules/client/preferences/language.dm index 97d69ebf2f5c..8c65adcfdecf 100644 --- a/code/modules/client/preferences/language.dm +++ b/code/modules/client/preferences/language.dm @@ -5,7 +5,7 @@ should_generate_icons = TRUE /datum/preference/choiced/language/create_default_value() - return "Random" + return /datum/language/spanish::name // DARKPACK EDIT CHANGE - LANGUAGES /datum/preference/choiced/language/is_accessible(datum/preferences/preferences) if (!..()) @@ -20,7 +20,7 @@ lang_icon.scale(32, 32) return lang_icon - var/datum/universal_icon/unknown = uni_icon('icons/ui/chat/language.dmi', "unknown") + var/datum/universal_icon/unknown = uni_icon('modular_darkpack/master_files/icons/ui/chat/language.dmi', "unknown") // DARKPACK EDIT CHANGE - LANGUAGES unknown.scale(32, 32) return unknown @@ -30,9 +30,11 @@ if(!GLOB.uncommon_roundstart_languages.len) generate_selectable_species_and_languages() + /* // DARKPACK EDIT REMOVAL - LANGUAGES values += "Random" //we add uncommon as it's foreigner-only. values += /datum/language/uncommon::name + */ for(var/datum/language/language_type as anything in GLOB.uncommon_roundstart_languages) if(initial(language_type.name) in values) diff --git a/code/modules/client/preferences/middleware/antags.dm b/code/modules/client/preferences/middleware/antags.dm index dd81ac44760f..39948078b112 100644 --- a/code/modules/client/preferences/middleware/antags.dm +++ b/code/modules/client/preferences/middleware/antags.dm @@ -149,11 +149,12 @@ GLOBAL_LIST_INIT(non_ruleset_antagonists, list( for (var/datum/dynamic_ruleset/ruleset as anything in subtypesof(/datum/dynamic_ruleset)) var/datum/antagonist/antagonist_type = initial(ruleset.preview_antag_datum) var/antag_flag = initial(ruleset.pref_flag) - if (isnull(antagonist_type) || isnull(antag_flag)) + if(isnull(antagonist_type) || isnull(antag_flag)) continue - // antag_flag is guaranteed to be unique by unit tests. - antagonists[initial(ruleset.pref_flag)] = antagonist_type + // antag_flag is guaranteed to be unique for all non-RULESET_VARIATION rulesets + // the ||= covers specifically those rulesets - prefer the first one over variations + antagonists[initial(ruleset.pref_flag)] ||= antagonist_type var/list/generated_icons = list() diff --git a/code/modules/client/preferences/middleware/jobs.dm b/code/modules/client/preferences/middleware/jobs.dm index 392822eac614..0fb4308c2ca3 100644 --- a/code/modules/client/preferences/middleware/jobs.dm +++ b/code/modules/client/preferences/middleware/jobs.dm @@ -15,7 +15,7 @@ if (isnull(job)) return FALSE - if (job.faction != FACTION_STATION) + if (job.faction != FACTION_CITY) // DARKPACK EDIT, ORGINAL: if (job.faction != FACTION_STATION) return FALSE if (!preferences.set_job_preference_level(job, level)) diff --git a/code/modules/client/preferences/middleware/personality.dm b/code/modules/client/preferences/middleware/personality.dm new file mode 100644 index 000000000000..835198abada3 --- /dev/null +++ b/code/modules/client/preferences/middleware/personality.dm @@ -0,0 +1,66 @@ +/datum/preference_middleware/personality + action_delegations = list( + "handle_personality" = PROC_REF(handle_personality), + "clear_personalities" = PROC_REF(clear_personalities), + ) + +/datum/preference_middleware/personality/proc/handle_personality(list/params, mob/user) + var/datum/personality/personality_type = text2path(params["personality_type"]) + if(!ispath(personality_type, /datum/personality)) + return FALSE + + var/personality_key = initial(personality_type.savefile_key) + var/list/personalities = preferences.read_preference(/datum/preference/personality) + if(personality_key in personalities) + LAZYREMOVE(personalities, personality_key) + else + if(LAZYLEN(personalities) >= CONFIG_GET(number/max_personalities)) + return TRUE + if(SSpersonalities.is_incompatible(personalities, personality_type)) + return TRUE + LAZYADD(personalities, personality_key) + preferences.update_preference(GLOB.preference_entries[/datum/preference/personality], personalities) + return TRUE + +/datum/preference_middleware/personality/proc/clear_personalities(list/params, mob/user) + preferences.update_preference(GLOB.preference_entries[/datum/preference/personality], null) + return TRUE + +/datum/preference_middleware/personality/get_constant_data() + var/list/data = list() + + data["personalities"] = list() + for(var/datum/personality/personality_type as anything in SSpersonalities.personalities_by_type) + var/datum/personality/personality = SSpersonalities.personalities_by_type[personality_type] + data["personalities"] += list(list( + "description" = personality.desc, + "pos_gameplay_description" = personality.pos_gameplay_desc, + "neg_gameplay_description" = personality.neg_gameplay_desc, + "neut_gameplay_description" = personality.neut_gameplay_desc, + "name" = personality.name, + "path" = personality_type, + "groups" = personality.groups, + )) + + data["personality_incompatibilities"] = SSpersonalities.incompatibilities_by_group + + return data + +/datum/preference_middleware/personality/get_ui_static_data(mob/user) + var/list/data = list() + + var/max = CONFIG_GET(number/max_personalities) + data["max_personalities"] = max >= length(SSpersonalities.personalities_by_type) ? -1 : max + data["mood_enabled"] = !CONFIG_GET(flag/disable_human_mood) + + return data + +/datum/preference_middleware/personality/get_ui_data(mob/user) + var/list/data = list() + + data["selected_personalities"] = list() + for(var/personality_key in preferences.read_preference(/datum/preference/personality)) + var/datum/personality/personality = SSpersonalities.personalities_by_key[personality_key] + data["selected_personalities"] += personality.type + + return data diff --git a/code/modules/client/preferences/middleware/quirks.dm b/code/modules/client/preferences/middleware/quirks.dm index 8c9f35ec3762..34725325eaf8 100644 --- a/code/modules/client/preferences/middleware/quirks.dm +++ b/code/modules/client/preferences/middleware/quirks.dm @@ -49,6 +49,7 @@ var/list/data = list() data["selected_quirks"] = get_selected_quirks() + data["default_quirk_balance"] = CONFIG_GET(number/default_quirk_points) data["species_disallowed_quirks"] = get_species_compatibility() return data diff --git a/code/modules/client/preferences/migrations/human_tail_ears_migration.dm b/code/modules/client/preferences/migrations/human_tail_ears_migration.dm new file mode 100644 index 000000000000..6399761bd72a --- /dev/null +++ b/code/modules/client/preferences/migrations/human_tail_ears_migration.dm @@ -0,0 +1,4 @@ +/// Rename feature_human_tail and feature_human_ears to something not stupid +/datum/preferences/proc/migrate_felinid_feature_keys(list/save_data) + save_data["feature_cat_ears"] = save_data["feature_human_ears"] + save_data["feature_cat_tail"] = save_data["feature_human_tail"] diff --git a/code/modules/client/preferences/migrations/quirk_personality_migration.dm b/code/modules/client/preferences/migrations/quirk_personality_migration.dm new file mode 100644 index 000000000000..96ba4a2a5da6 --- /dev/null +++ b/code/modules/client/preferences/migrations/quirk_personality_migration.dm @@ -0,0 +1,16 @@ +/** + * Replace a quirk with a personality + * + * If this is accompanied with removal of a quirk, + * you don't need to worry about handling that here - + * quirk sanitization happens AFTER migration + */ +/datum/preferences/proc/migrate_quirk_to_personality(quirk_to_migrate, datum/personality/new_typepath) + ASSERT(istext(quirk_to_migrate) && ispath(new_typepath, /datum/personality)) + if(!(quirk_to_migrate in all_quirks)) + return + var/list/personalities = read_preference(/datum/preference/personality) + if(LAZYLEN(personalities) >= CONFIG_GET(number/max_personalities)) + return + LAZYADD(personalities, initial(new_typepath.savefile_key)) + write_preference(GLOB.preference_entries[/datum/preference/personality], personalities) diff --git a/code/modules/client/preferences/migrations/tgui_prefs_migration.dm b/code/modules/client/preferences/migrations/tgui_prefs_migration.dm index ba4b4d03e909..2d852c96a022 100644 --- a/code/modules/client/preferences/migrations/tgui_prefs_migration.dm +++ b/code/modules/client/preferences/migrations/tgui_prefs_migration.dm @@ -33,7 +33,6 @@ // Before tgui preferences menu, "traitor" would handle both roundstart, midround, and latejoin. // These were split apart. /datum/preferences/proc/migrate_antagonists() - migrate_antagonist(ROLE_HERETIC, list(ROLE_HERETIC_SMUGGLER)) migrate_antagonist(ROLE_MALF, list(ROLE_MALF_MIDROUND)) migrate_antagonist(ROLE_OPERATIVE, list(ROLE_OPERATIVE_MIDROUND, ROLE_LONE_OPERATIVE)) migrate_antagonist(ROLE_REV_HEAD, list(ROLE_PROVOCATEUR)) diff --git a/code/modules/client/preferences/multiz_parallax.dm b/code/modules/client/preferences/multiz_parallax.dm index dee58ec1e98c..cea49b4ddf5a 100644 --- a/code/modules/client/preferences/multiz_parallax.dm +++ b/code/modules/client/preferences/multiz_parallax.dm @@ -1,5 +1,5 @@ /// Whether or not to toggle multiz parallax, the parallax effect for lower z-levels. -/* DARKPACK EDIT REMOVAL START - Offsets Z levels to give the appearance of building stacking - This setting caused the lower plates to offset relative to the viewer's perspective +/* // DARKPACK EDIT REMOVAL START - Offsets Z levels to give the appearance of building stacking - This setting caused the lower plates to offset relative to the viewer's perspective // Which gave the appearance that buildings 'bent' in relation to where you observed them. /datum/preference/toggle/multiz_parallax category = PREFERENCE_CATEGORY_GAME_PREFERENCES diff --git a/code/modules/client/preferences/species_features/ethereal.dm b/code/modules/client/preferences/species_features/ethereal.dm index fc93cf4008ea..03fcbd4287bf 100644 --- a/code/modules/client/preferences/species_features/ethereal.dm +++ b/code/modules/client/preferences/species_features/ethereal.dm @@ -20,8 +20,8 @@ ethereal_base.blend_icon(uni_icon('icons/mob/human/species/ethereal/bodyparts.dmi', "ethereal_l_arm"), ICON_OVERLAY) ethereal_base.blend_icon(uni_icon('icons/mob/human/species/ethereal/bodyparts.dmi', "ethereal_r_arm"), ICON_OVERLAY) - var/datum/universal_icon/eyes = uni_icon('icons/mob/human/human_face.dmi', "eyes_l") - eyes.blend_icon(uni_icon('icons/mob/human/human_face.dmi', "eyes_r"), ICON_OVERLAY) + var/datum/universal_icon/eyes = uni_icon('icons/mob/human/human_eyes.dmi', "eyes_l") + eyes.blend_icon(uni_icon('icons/mob/human/human_eyes.dmi', "eyes_r"), ICON_OVERLAY) eyes.blend_color(COLOR_BLACK, ICON_MULTIPLY) ethereal_base.blend_icon(eyes, ICON_OVERLAY) diff --git a/code/modules/client/preferences/species_features/felinid.dm b/code/modules/client/preferences/species_features/felinid.dm index 857f8831eb82..013cb31463e6 100644 --- a/code/modules/client/preferences/species_features/felinid.dm +++ b/code/modules/client/preferences/species_features/felinid.dm @@ -1,32 +1,13 @@ -/datum/preference/choiced/tail_felinid - savefile_key = "feature_human_tail" //savefile keys cannot be changed, blame whoever named them this way. +/datum/preference/choiced/species_feature/tail_felinid + savefile_key = "feature_cat_tail" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES can_randomize = FALSE - relevant_external_organ = /obj/item/organ/tail/cat + relevant_organ = /obj/item/organ/tail/cat -/datum/preference/choiced/tail_felinid/init_possible_values() - return assoc_to_keys_features(SSaccessories.tails_list_felinid) - -/datum/preference/choiced/tail_felinid/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features[FEATURE_TAIL] = value - -/datum/preference/choiced/tail_felinid/create_default_value() - var/datum/sprite_accessory/tails/felinid/cat/tail = /datum/sprite_accessory/tails/felinid/cat - return initial(tail.name) - -/datum/preference/choiced/felinid_ears - savefile_key = "feature_human_ears" //savefile keys cannot be changed, blame whoever named them this way. +/datum/preference/choiced/species_feature/felinid_ears + savefile_key = "feature_cat_ears" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES can_randomize = FALSE - relevant_external_organ = /obj/item/organ/ears/cat - -/datum/preference/choiced/felinid_ears/init_possible_values() - return assoc_to_keys_features(SSaccessories.ears_list) - -/datum/preference/choiced/felinid_ears/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features[FEATURE_EARS] = value - -/datum/preference/choiced/felinid_ears/create_default_value() - return /datum/sprite_accessory/ears/cat::name + relevant_organ = /obj/item/organ/ears/cat diff --git a/code/modules/client/preferences/species_features/lizard.dm b/code/modules/client/preferences/species_features/lizard.dm index cfb1231986b6..10236d9e4154 100644 --- a/code/modules/client/preferences/species_features/lizard.dm +++ b/code/modules/client/preferences/species_features/lizard.dm @@ -4,7 +4,7 @@ if (isnull(lizard)) lizard = uni_icon('icons/mob/human/species/lizard/bodyparts.dmi', "lizard_head", EAST) - var/datum/universal_icon/eyes = uni_icon('icons/mob/human/human_face.dmi', "eyes_l", EAST) + var/datum/universal_icon/eyes = uni_icon(/obj/item/organ/eyes/lizard::eye_icon, "[/obj/item/organ/eyes/lizard::eye_icon_state]_l", EAST) eyes.blend_color(COLOR_GRAY, ICON_MULTIPLY) lizard.blend_icon(eyes, ICON_OVERLAY) @@ -23,7 +23,7 @@ return final_icon -/datum/preference/choiced/lizard_body_markings +/datum/preference/choiced/species_feature/lizard_body_markings savefile_key = "feature_lizard_body_markings" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_FEATURES @@ -31,11 +31,8 @@ should_generate_icons = TRUE relevant_body_markings = /datum/bodypart_overlay/simple/body_marking/lizard -/datum/preference/choiced/lizard_body_markings/init_possible_values() - return assoc_to_keys_features(SSaccessories.lizard_markings_list) - -/datum/preference/choiced/lizard_body_markings/icon_for(value) - var/datum/sprite_accessory/sprite_accessory = SSaccessories.lizard_markings_list[value] +/datum/preference/choiced/species_feature/lizard_body_markings/icon_for(value) + var/datum/sprite_accessory/sprite_accessory = get_accessory_for_value(value) var/datum/universal_icon/final_icon = uni_icon('icons/mob/human/species/lizard/bodyparts.dmi', "lizard_chest_m") @@ -54,42 +51,27 @@ return final_icon -/datum/preference/choiced/lizard_body_markings/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features[FEATURE_LIZARD_MARKINGS] = value - -/datum/preference/choiced/lizard_frills +/datum/preference/choiced/species_feature/lizard_frills savefile_key = "feature_lizard_frills" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Frills" should_generate_icons = TRUE - relevant_external_organ = /obj/item/organ/frills - -/datum/preference/choiced/lizard_frills/init_possible_values() - return assoc_to_keys_features(SSaccessories.frills_list) - -/datum/preference/choiced/lizard_frills/icon_for(value) - return generate_lizard_side_shot(SSaccessories.frills_list[value], "frills") + relevant_organ = /obj/item/organ/frills -/datum/preference/choiced/lizard_frills/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features[FEATURE_FRILLS] = value +/datum/preference/choiced/species_feature/lizard_frills/icon_for(value) + return generate_lizard_side_shot(get_accessory_for_value(value), "frills") -/datum/preference/choiced/lizard_horns +/datum/preference/choiced/species_feature/lizard_horns savefile_key = "feature_lizard_horns" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Horns" should_generate_icons = TRUE - relevant_external_organ = /obj/item/organ/horns + relevant_organ = /obj/item/organ/horns -/datum/preference/choiced/lizard_horns/init_possible_values() - return assoc_to_keys_features(SSaccessories.horns_list) - -/datum/preference/choiced/lizard_horns/icon_for(value) - return generate_lizard_side_shot(SSaccessories.horns_list[value], "horns") - -/datum/preference/choiced/lizard_horns/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features[FEATURE_HORNS] = value +/datum/preference/choiced/species_feature/lizard_horns/icon_for(value) + return generate_lizard_side_shot(get_accessory_for_value(value), "horns") /datum/preference/choiced/lizard_legs savefile_key = "feature_lizard_legs" @@ -120,7 +102,7 @@ if(!path) continue var/obj/item/bodypart/new_part = new path() - new_part.replace_limb(target, TRUE) + new_part.replace_limb(target) new_part.update_limb(is_creating = TRUE) qdel(old_part) @@ -130,46 +112,25 @@ var/datum/species/species_type = preferences.read_preference(/datum/preference/choiced/species) return initial(species_type.digitigrade_customization) == DIGITIGRADE_OPTIONAL -/datum/preference/choiced/lizard_snout +/datum/preference/choiced/species_feature/lizard_snout savefile_key = "feature_lizard_snout" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Snout" should_generate_icons = TRUE - relevant_external_organ = /obj/item/organ/snout - -/datum/preference/choiced/lizard_snout/init_possible_values() - return assoc_to_keys_features(SSaccessories.snouts_list) + relevant_organ = /obj/item/organ/snout -/datum/preference/choiced/lizard_snout/icon_for(value) - return generate_lizard_side_shot(SSaccessories.snouts_list[value], "snout", include_snout = FALSE) +/datum/preference/choiced/species_feature/lizard_snout/icon_for(value) + return generate_lizard_side_shot(get_accessory_for_value(value), "snout", include_snout = FALSE) -/datum/preference/choiced/lizard_snout/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features[FEATURE_SNOUT] = value - -/datum/preference/choiced/lizard_spines +/datum/preference/choiced/species_feature/lizard_spines savefile_key = "feature_lizard_spines" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_external_organ = /obj/item/organ/spines - -/datum/preference/choiced/lizard_spines/init_possible_values() - return assoc_to_keys_features(SSaccessories.spines_list) - -/datum/preference/choiced/lizard_spines/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features[FEATURE_SPINES] = value + relevant_organ = /obj/item/organ/spines -/datum/preference/choiced/lizard_tail +/datum/preference/choiced/species_feature/lizard_tail savefile_key = "feature_lizard_tail" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_external_organ = /obj/item/organ/tail/lizard - -/datum/preference/choiced/lizard_tail/init_possible_values() - return assoc_to_keys_features(SSaccessories.tails_list_lizard) - -/datum/preference/choiced/lizard_tail/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features[FEATURE_TAIL_LIZARD] = value - -/datum/preference/choiced/lizard_tail/create_default_value() - return /datum/sprite_accessory/tails/lizard/smooth::name + relevant_organ = /obj/item/organ/tail/lizard diff --git a/code/modules/client/preferences/species_features/monkey.dm b/code/modules/client/preferences/species_features/monkey.dm index cc4cc5ab19da..e80eca3f4e2e 100644 --- a/code/modules/client/preferences/species_features/monkey.dm +++ b/code/modules/client/preferences/species_features/monkey.dm @@ -1,15 +1,6 @@ -/datum/preference/choiced/monkey_tail +/datum/preference/choiced/species_feature/monkey_tail savefile_key = "feature_monkey_tail" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_external_organ = /obj/item/organ/tail/monkey + relevant_organ = /obj/item/organ/tail/monkey can_randomize = FALSE - -/datum/preference/choiced/monkey_tail/init_possible_values() - return assoc_to_keys_features(SSaccessories.tails_list_monkey) - -/datum/preference/choiced/monkey_tail/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features[FEATURE_TAIL_MONKEY] = value - -/datum/preference/choiced/monkey_tail/create_default_value() - return /datum/sprite_accessory/tails/monkey/default::name diff --git a/code/modules/client/preferences/species_features/moth.dm b/code/modules/client/preferences/species_features/moth.dm index 477e8485b2e0..b0d7746aaa34 100644 --- a/code/modules/client/preferences/species_features/moth.dm +++ b/code/modules/client/preferences/species_features/moth.dm @@ -1,23 +1,20 @@ -/datum/preference/choiced/moth_antennae +/datum/preference/choiced/species_feature/moth_antennae savefile_key = "feature_moth_antennae" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Antennae" should_generate_icons = TRUE - relevant_external_organ = /obj/item/organ/antennae + relevant_organ = /obj/item/organ/antennae -/datum/preference/choiced/moth_antennae/init_possible_values() - return assoc_to_keys_features(SSaccessories.moth_antennae_list) - -/datum/preference/choiced/moth_antennae/icon_for(value) +/datum/preference/choiced/species_feature/moth_antennae/icon_for(value) var/static/datum/universal_icon/moth_head if (isnull(moth_head)) moth_head = uni_icon('icons/mob/human/species/moth/bodyparts.dmi', "moth_head") - moth_head.blend_icon(uni_icon('icons/mob/human/human_face.dmi', "motheyes_l"), ICON_OVERLAY) - moth_head.blend_icon(uni_icon('icons/mob/human/human_face.dmi', "motheyes_r"), ICON_OVERLAY) + moth_head.blend_icon(uni_icon(/obj/item/organ/eyes/moth::eye_icon, "[/obj/item/organ/eyes/moth::eye_icon_state]_l"), ICON_OVERLAY) + moth_head.blend_icon(uni_icon(/obj/item/organ/eyes/moth::eye_icon, "[/obj/item/organ/eyes/moth::eye_icon_state]_r"), ICON_OVERLAY) - var/datum/sprite_accessory/antennae = SSaccessories.moth_antennae_list[value] + var/datum/sprite_accessory/antennae = get_accessory_for_value(value) var/datum/universal_icon/icon_with_antennae = moth_head.copy() icon_with_antennae.blend_icon(uni_icon(antennae.icon, "m_moth_antennae_[antennae.icon_state]_FRONT"), ICON_OVERLAY) @@ -26,10 +23,7 @@ return icon_with_antennae -/datum/preference/choiced/moth_antennae/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features[FEATURE_MOTH_ANTENNAE] = value - -/datum/preference/choiced/moth_markings +/datum/preference/choiced/species_feature/moth_markings savefile_key = "feature_moth_markings" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_FEATURES @@ -37,10 +31,7 @@ should_generate_icons = TRUE relevant_body_markings = /datum/bodypart_overlay/simple/body_marking/moth -/datum/preference/choiced/moth_markings/init_possible_values() - return assoc_to_keys_features(SSaccessories.moth_markings_list) - -/datum/preference/choiced/moth_markings/icon_for(value) +/datum/preference/choiced/species_feature/moth_markings/icon_for(value) var/static/list/body_parts = list( /obj/item/bodypart/head/moth, /obj/item/bodypart/chest/moth, @@ -55,10 +46,10 @@ for (var/obj/item/bodypart/body_part as anything in body_parts) moth_body.blend_icon(uni_icon('icons/mob/human/species/moth/bodyparts.dmi', initial(body_part.icon_state)), ICON_OVERLAY) - moth_body.blend_icon(uni_icon('icons/mob/human/human_face.dmi', "motheyes_l"), ICON_OVERLAY) - moth_body.blend_icon(uni_icon('icons/mob/human/human_face.dmi', "motheyes_r"), ICON_OVERLAY) + moth_body.blend_icon(uni_icon(/obj/item/organ/eyes/moth::eye_icon, "[/obj/item/organ/eyes/moth::eye_icon_state]_l"), ICON_OVERLAY) + moth_body.blend_icon(uni_icon(/obj/item/organ/eyes/moth::eye_icon, "[/obj/item/organ/eyes/moth::eye_icon_state]_r"), ICON_OVERLAY) - var/datum/sprite_accessory/markings = SSaccessories.moth_markings_list[value] + var/datum/sprite_accessory/markings = get_accessory_for_value(value) var/datum/universal_icon/icon_with_markings = moth_body.copy() if (value != SPRITE_ACCESSORY_NONE) @@ -76,23 +67,14 @@ return icon_with_markings -/datum/preference/choiced/moth_markings/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features[FEATURE_MOTH_MARKINGS] = value - -/datum/preference/choiced/moth_wings +/datum/preference/choiced/species_feature/moth_wings savefile_key = "feature_moth_wings" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Moth wings" should_generate_icons = TRUE - relevant_external_organ = /obj/item/organ/wings/moth - -/datum/preference/choiced/moth_wings/init_possible_values() - return assoc_to_keys_features(SSaccessories.moth_wings_list) + relevant_organ = /obj/item/organ/wings/moth -/datum/preference/choiced/moth_wings/icon_for(value) - var/datum/sprite_accessory/moth_wings = SSaccessories.moth_wings_list[value] +/datum/preference/choiced/species_feature/moth_wings/icon_for(value) + var/datum/sprite_accessory/moth_wings = get_accessory_for_value(value) return uni_icon(moth_wings.icon, "m_moth_wings_[moth_wings.icon_state]_BEHIND") - -/datum/preference/choiced/moth_wings/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features[FEATURE_MOTH_WINGS] = value diff --git a/code/modules/client/preferences/species_features/mushperson.dm b/code/modules/client/preferences/species_features/mushperson.dm index 64d24d6301c5..d15c6764dc30 100644 --- a/code/modules/client/preferences/species_features/mushperson.dm +++ b/code/modules/client/preferences/species_features/mushperson.dm @@ -1,11 +1,5 @@ -/datum/preference/choiced/mushroom_cap +/datum/preference/choiced/species_feature/mushroom_cap savefile_key = "feature_mushperson_cap" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_external_organ = /obj/item/organ/mushroom_cap - -/datum/preference/choiced/mushroom_cap/init_possible_values() - return assoc_to_keys_features(SSaccessories.caps_list) - -/datum/preference/choiced/mushroom_cap/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features[FEATURE_MUSH_CAP] = value + relevant_organ = /obj/item/organ/mushroom_cap diff --git a/code/modules/client/preferences/species_features/pod.dm b/code/modules/client/preferences/species_features/pod.dm index 9cb5dd63b23b..25a898f7461b 100644 --- a/code/modules/client/preferences/species_features/pod.dm +++ b/code/modules/client/preferences/species_features/pod.dm @@ -1,16 +1,13 @@ -/datum/preference/choiced/pod_hair +/datum/preference/choiced/species_feature/pod_hair savefile_key = "feature_pod_hair" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Hairstyle" should_generate_icons = TRUE - relevant_external_organ = /obj/item/organ/pod_hair + relevant_organ = /obj/item/organ/pod_hair -/datum/preference/choiced/pod_hair/init_possible_values() - return assoc_to_keys_features(SSaccessories.pod_hair_list) - -/datum/preference/choiced/pod_hair/icon_for(value) - var/datum/sprite_accessory/pod_hair = SSaccessories.pod_hair_list[value] +/datum/preference/choiced/species_feature/pod_hair/icon_for(value) + var/datum/sprite_accessory/pod_hair = get_accessory_for_value(value) var/datum/universal_icon/icon_with_hair = uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "pod_head_m") @@ -23,9 +20,3 @@ icon_with_hair.blend_color(COLOR_GREEN, ICON_MULTIPLY) return icon_with_hair - -/datum/preference/choiced/pod_hair/create_default_value() - return pick(assoc_to_keys_features(SSaccessories.pod_hair_list)) - -/datum/preference/choiced/pod_hair/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features[FEATURE_POD_HAIR] = value diff --git a/code/modules/client/preferences/tgui.dm b/code/modules/client/preferences/tgui.dm index 4cf57be94daf..a42e047be49d 100644 --- a/code/modules/client/preferences/tgui.dm +++ b/code/modules/client/preferences/tgui.dm @@ -1,13 +1,3 @@ -/datum/preference/toggle/tgui_fancy - category = PREFERENCE_CATEGORY_GAME_PREFERENCES - savefile_key = "tgui_fancy" - savefile_identifier = PREFERENCE_PLAYER - -/datum/preference/toggle/tgui_fancy/apply_to_client(client/client, value) - for (var/datum/tgui/tgui as anything in client.mob?.tgui_open_uis) - // Force it to reload either way - tgui.update_static_data(client.mob) - // Determines if input boxes are in tgui or old fashioned /datum/preference/toggle/tgui_input category = PREFERENCE_CATEGORY_GAME_PREFERENCES diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 74b989ca9ef3..bb3a7b303292 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -13,7 +13,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 49 +#define SAVEFILE_VERSION_MAX 51 #define IS_DATA_OBSOLETE(version) (version == SAVE_DATA_OBSOLETE) #define SHOULD_UPDATE_DATA(version) (version >= SAVE_DATA_NO_ERROR && version < SAVEFILE_VERSION_MAX) @@ -137,6 +137,33 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car quirk_to_migrate = "Cyborg Pre-screened dogtag", new_typepath = /obj/item/clothing/accessory/dogtag/borg_ready, ) + if(current_version < 50) + migrate_quirk_to_personality( + quirk_to_migrate = "Extrovert", + new_typepath = /datum/personality/extrovert, + ) + migrate_quirk_to_personality( + quirk_to_migrate = "Introvert", + new_typepath = /datum/personality/introvert, + ) + migrate_quirk_to_personality( + quirk_to_migrate = "Bad Touch", + new_typepath = /datum/personality/aloof, + ) + migrate_quirk_to_personality( + quirk_to_migrate = "Apathetic", + new_typepath = /datum/personality/apathetic, + ) + migrate_quirk_to_personality( + quirk_to_migrate = "Snob", + new_typepath = /datum/personality/snob, + ) + migrate_quirk_to_personality( + quirk_to_migrate = "Spiritual", + new_typepath = /datum/personality/spiritual, + ) + if(current_version < 51) + migrate_felinid_feature_keys(save_data) /// checks through keybindings for outdated unbound keys and updates them /datum/preferences/proc/check_keybindings() @@ -340,11 +367,29 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Quirks all_quirks = save_data?["all_quirks"] + // DARKPACK EDIT ADD START - STORYTELLER_STATS + var/list/stats_list = save_data?["preference_storyteller_stats"] + // DARKPACK EDIT ADD END + //try to fix any outdated data if necessary //preference updating will handle saving the updated data for us. if(SHOULD_UPDATE_DATA(data_validity_integer)) update_character(data_validity_integer, save_data) + // DARKPACK EDIT ADD START - STORYTELLER_STATS + if(!stats_list) + preference_storyteller_stats = create_new_stat_prefs(preference_storyteller_stats) + for(var/stat_path in stats_list) + var/proper_stat_path = text2path(stat_path) + var/datum/st_stat/stat = new proper_stat_path() + if(stats_list[stat_path]) // If the stat_path already exists in our savefile, update our datum. + stat.set_score(stats_list[stat_path][STAT_SCORE]) + stat.set_points(stats_list[stat_path][STAT_POINTS]) + stat.freebie_cost_spent = stats_list[stat_path][STAT_FREEBIE_COST_SPENT] + preference_storyteller_stats[stat_path] = stat + update_middleware_stats(preference_storyteller_stats) + // DARKPACK EDIT ADD END + //Sanitize randomise = SANITIZE_LIST(randomise) job_preferences = SANITIZE_LIST(job_preferences) @@ -356,6 +401,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car job_preferences -= j all_quirks = SSquirks.filter_invalid_quirks(SANITIZE_LIST(all_quirks)) + validate_quirks() return TRUE @@ -398,6 +444,20 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Quirks save_data["all_quirks"] = all_quirks + // DARKPACK EDIT ADD START- STORYTELLER_STATS + if(!length(preference_storyteller_stats)) + preference_storyteller_stats = create_new_stat_prefs(preference_storyteller_stats) + var/list/stats_list = preference_storyteller_stats + var/list/new_stats_list = list() + for(var/stat_typepath in stats_list) + var/datum/st_stat/stat = stats_list[stat_typepath] + new_stats_list[stat_typepath] = list() + new_stats_list[stat_typepath][STAT_SCORE] = stat.get_score(include_bonus = FALSE) + new_stats_list[stat_typepath][STAT_POINTS] = stat.get_points() + new_stats_list[stat_typepath][STAT_FREEBIE_COST_SPENT] = stat.freebie_cost_spent + save_data["preference_storyteller_stats"] = new_stats_list + // DARKPACK EDIT ADD END + return TRUE /datum/preferences/proc/switch_to_slot(new_slot) diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 1381c3d6b54b..6c7fde8e222e 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -141,7 +141,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") return ADMIN_VERB(set_ooc_color, R_FUN, "Set Player OOC Color", "Modifies the global OOC color.", ADMIN_CATEGORY_SERVER) - var/newColor = input(user, "Please select the new player OOC color.", "OOC color") as color|null + var/newColor = tgui_color_picker(user, "Please select the new player OOC color.", "OOC color") if(isnull(newColor)) return var/new_color = sanitize_color(newColor) diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 6e00140b3b43..6599507d6a87 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -101,7 +101,7 @@ /// The actual proc that will apply the damage to the suiciding mob. damage_type is the actual type of damage we want to deal, if that matters. /// Return TRUE if we actually apply any real damage, FALSE otherwise. /mob/living/proc/apply_suicide_damage(obj/item/suicide_tool, damage_type = NONE) - adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) + adjust_oxy_loss(max(maxHealth * 2 - get_tox_loss() - get_fire_loss() - get_brute_loss() - get_oxy_loss(), 0)) return TRUE /// If we want to apply multiple types of damage to a carbon mob based on the way they suicide, this is the proc that handles that. @@ -126,10 +126,10 @@ for(var/filtered_type in filtered_damage_types) switch(filtered_type) if(BRUTELOSS) - adjustBruteLoss(damage_to_apply) + adjust_brute_loss(damage_to_apply) if(FIRELOSS) - adjustFireLoss(damage_to_apply) + adjust_fire_loss(damage_to_apply) if(OXYLOSS) - adjustOxyLoss(damage_to_apply) + adjust_oxy_loss(damage_to_apply) if(TOXLOSS) - adjustToxLoss(damage_to_apply) + adjust_tox_loss(damage_to_apply) diff --git a/code/modules/clothing/chameleon/_chameleon_action.dm b/code/modules/clothing/chameleon/_chameleon_action.dm index 4befe80fbe82..88ca8e51fe86 100644 --- a/code/modules/clothing/chameleon/_chameleon_action.dm +++ b/code/modules/clothing/chameleon/_chameleon_action.dm @@ -93,7 +93,7 @@ chameleon_typecache |= typecacheof(type_to_add) for(var/obj/item/item_type as anything in chameleon_typecache) - if(chameleon_blacklist[item_type] || (item_type::item_flags & ABSTRACT) || !item_type::icon_state) + if(chameleon_blacklist[item_type] || (item_type::item_flags & ABSTRACT) || item_type == item_type::abstract_type || !item_type::icon_state) continue var/chameleon_item_name = "[item_type::name] ([item_type::post_init_icon_state || item_type::icon_state])" chameleon_list[chameleon_item_name] = item_type diff --git a/code/modules/clothing/chameleon/chameleon_gun.dm b/code/modules/clothing/chameleon/chameleon_gun.dm index 4a282a3e75ae..c1c17a8ae5a7 100644 --- a/code/modules/clothing/chameleon/chameleon_gun.dm +++ b/code/modules/clothing/chameleon/chameleon_gun.dm @@ -16,7 +16,7 @@ /obj/item/gun/energy/laser/chameleon/Initialize(mapload) . = ..() - AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS|EMP_NO_EXAMINE) // 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(default_look) diff --git a/code/modules/clothing/chameleon/generic_chameleon_clothing.dm b/code/modules/clothing/chameleon/generic_chameleon_clothing.dm index a8f03b0b3f98..2cd2da4ed674 100644 --- a/code/modules/clothing/chameleon/generic_chameleon_clothing.dm +++ b/code/modules/clothing/chameleon/generic_chameleon_clothing.dm @@ -3,7 +3,7 @@ do { \ var/datum/action/item_action/chameleon/change/_action = locate() in item.actions; \ _action?.emp_randomise(INFINITY); \ - item.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF); \ + item.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_NO_EXAMINE); \ } while(FALSE) // Cham jumpsuit @@ -30,6 +30,7 @@ do { \ sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle?? random_sensor = FALSE resistance_flags = NONE + clothing_flags = CARP_STYLE_FACTOR can_adjust = FALSE armor_type = /datum/armor/clothing_under/chameleon actions_types = list(/datum/action/item_action/chameleon/change/jumpsuit) @@ -58,6 +59,7 @@ do { \ inhand_icon_state = "armor" blood_overlay_type = "armor" resistance_flags = NONE + clothing_flags = CARP_STYLE_FACTOR armor_type = /datum/armor/suit_chameleon actions_types = list(/datum/action/item_action/chameleon/change/suit) action_slots = ALL @@ -87,6 +89,7 @@ do { \ icon_state = "meson" inhand_icon_state = "meson" resistance_flags = NONE + clothing_flags = CARP_STYLE_FACTOR armor_type = /datum/armor/glasses_chameleon actions_types = list(/datum/action/item_action/chameleon/change/glasses) action_slots = ALL @@ -106,13 +109,14 @@ do { \ acid = 50 /obj/item/clothing/gloves/chameleon - desc = "These gloves provide protection against electric shock." name = "insulated gloves" + desc = "These gloves provide protection against electric shock." icon_state = "yellow" inhand_icon_state = "ygloves" greyscale_colors = null resistance_flags = NONE + clothing_flags = CARP_STYLE_FACTOR body_parts_covered = HANDS|ARMS armor_type = /datum/armor/gloves_chameleon actions_types = list(/datum/action/item_action/chameleon/change/gloves) @@ -140,6 +144,7 @@ do { \ worn_icon = 'icons/mob/clothing/head/hats.dmi' icon_state = "greysoft" resistance_flags = NONE + clothing_flags = CARP_STYLE_FACTOR armor_type = /datum/armor/head_chameleon actions_types = list(/datum/action/item_action/chameleon/change/hat) action_slots = ALL @@ -179,7 +184,7 @@ do { \ inhand_icon_state = "gas_alt" resistance_flags = NONE armor_type = /datum/armor/mask_chameleon - clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS | CARP_STYLE_FACTOR flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH w_class = WEIGHT_CLASS_SMALL @@ -240,6 +245,7 @@ do { \ greyscale_config_inhand_right = /datum/greyscale_config/sneakers/inhand_right greyscale_colors = "#545454#ffffff" resistance_flags = NONE + clothing_flags = CARP_STYLE_FACTOR armor_type = /datum/armor/shoes_chameleon actions_types = list(/datum/action/item_action/chameleon/change/shoes) action_slots = ALL @@ -325,6 +331,7 @@ do { \ // Cham Stamp /obj/item/stamp/chameleon + icon_state = "stamp-syndicate" actions_types = list(/datum/action/item_action/chameleon/change/stamp) action_slots = ALL diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 198cb6b27a94..1f2177a72e63 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -72,17 +72,6 @@ if(!icon_state) item_flags |= ABSTRACT -/obj/item/clothing/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params) - var/mob/M = user - - if(ismecha(M.loc)) // stops inventory actions in a mech - return - - if(loc == M && istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/H = over_object - if(M.putItemFromInventoryInHandIfPossible(src, H.held_index)) - add_fingerprint(user) - /obj/item/food/clothing name = "temporary moth clothing snack item" desc = "If you're reading this it means I messed up. This is related to moths eating clothes and I didn't know a better way to do it than making a new food object. <--- stinky idiot wrote this" @@ -217,7 +206,8 @@ zone_name = parse_zone(def_zone) zones_disabled++ - body_parts_covered &= ~body_zone2cover_flags(def_zone) + if(clothing_flags & NO_ZONE_DISABLING) + body_parts_covered &= ~body_zone2cover_flags(def_zone) if(body_parts_covered == NONE) // if there are no more parts to break then the whole thing is kaput atom_destruction((damage_type == BRUTE ? MELEE : LASER)) // melee/laser is good enough since this only procs from direct attacks anyway and not from fire/bombs @@ -325,9 +315,6 @@ . += span_warning("[p_Theyre()] completely shredded and require[p_s()] mending before [p_they()] can be worn again!") return - if(TRAIT_FAST_CUFFING in clothing_traits) - . += "[src] increase the speed that you handcuff others." - for(var/zone in damage_by_parts) var/pct_damage_part = damage_by_parts[zone] / limb_integrity * 100 var/zone_name = parse_zone(zone) @@ -369,7 +356,7 @@ .["pressure-proof"] = "Protects the wearer from extremely low or high pressure, such as vacuum of space." if(flags_cover & PEPPERPROOF) .["pepper-proof"] = "Protects the wearer from the effects of pepperspray." - if (heat_protection || cold_protection) + if(heat_protection || cold_protection) var/heat_desc var/cold_desc switch (max_heat_protection_temperature) @@ -387,6 +374,12 @@ if (0 to 71) cold_desc = "extremely low" .["thermally insulated"] = "Protects the wearer from [jointext(list(heat_desc, cold_desc) - null, " and ")] temperatures." + if((TRAIT_QUICK_CARRY in clothing_traits) || (TRAIT_QUICKER_CARRY in clothing_traits)) + .["tactile"] = "Decreases the time it takes to pick up creatures by [(TRAIT_QUICKER_CARRY in clothing_traits) ? "2 seconds" : "1 second"]." + if(TRAIT_FASTMED in clothing_traits) + .["sterile"] = "Increases the speed at which reagents are administered to others by [round((1/NITRILE_GLOVES_MULTIPLIER-1)*100, 1)]%." + if(TRAIT_FAST_CUFFING in clothing_traits) + .["secure"] = "Increases the speed at which you apply restraints." /obj/item/clothing/examine_descriptor(mob/user) return "clothing" @@ -415,7 +408,7 @@ continue if(!added_durability_header) readout += "DURABILITY (I-X)" - added_damage_header = TRUE + added_durability_header = TRUE readout += "[armor_to_protection_name(durability_key)] [armor_to_protection_class(rating)]" if((flags_cover & HEADCOVERSMOUTH) || (flags_cover & PEPPERPROOF)) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index f72098a143c9..270929d5104c 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -12,6 +12,10 @@ resistance_flags = NONE custom_materials = list(/datum/material/glass = SMALL_MATERIAL_AMOUNT*2.5) gender = PLURAL + sound_vary = TRUE + pickup_sound = SFX_GLASSES_PICKUP + drop_sound = SFX_GLASSES_DROP + equip_sound = SFX_GLASSES_EQUIP var/vision_flags = 0 var/invis_view = SEE_INVISIBLE_LIVING // Admin only for now /// Override to allow glasses to set higher than normal see_invis @@ -81,6 +85,9 @@ // Mesons get to be lightly green color_cutoffs = list(5, 15, 5) glass_colour_type = /datum/client_colour/glass_colour/lightgreen + pickup_sound = SFX_GOGGLES_PICKUP + drop_sound = SFX_GOGGLES_DROP + equip_sound = SFX_GOGGLES_EQUIP /obj/item/clothing/glasses/meson/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] is putting \the [src] to [user.p_their()] eyes and overloading the brightness! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -125,6 +132,9 @@ resistance_flags = ACID_PROOF armor_type = /datum/armor/glasses_science clothing_traits = list(TRAIT_REAGENT_SCANNER, TRAIT_RESEARCH_SCANNER) + pickup_sound = SFX_GOGGLES_PICKUP + drop_sound = SFX_GOGGLES_DROP + equip_sound = SFX_GOGGLES_EQUIP /datum/armor/glasses_science fire = 80 @@ -159,6 +169,9 @@ color_cutoffs = list(10, 25, 10) glass_colour_type = /datum/client_colour/glass_colour/lightgreen actions_types = list(/datum/action/item_action/toggle_nv) + pickup_sound = SFX_GOGGLES_PICKUP + drop_sound = SFX_GOGGLES_DROP + equip_sound = SFX_GOGGLES_EQUIP /obj/item/clothing/glasses/night/update_icon_state() . = ..() @@ -173,6 +186,10 @@ actions_types = list(/datum/action/item_action/flip) dog_fashion = /datum/dog_fashion/head/eyepatch var/flipped = FALSE + pickup_sound = null + drop_sound = null + equip_sound = null + custom_materials = null /obj/item/clothing/glasses/eyepatch/click_alt(mob/user) . = ..() @@ -259,6 +276,9 @@ flags_cover = GLASSESCOVERSEYES vision_flags = SEE_OBJS glass_colour_type = /datum/client_colour/glass_colour/lightblue + pickup_sound = SFX_GOGGLES_PICKUP + drop_sound = SFX_GOGGLES_DROP + equip_sound = SFX_GOGGLES_EQUIP /obj/item/clothing/glasses/material/mining name = "optical material scanner" @@ -390,6 +410,8 @@ icon_state = "sunhudsci" 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) + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 0.55, /datum/material/iron = SMALL_MATERIAL_AMOUNT / 2) + /* // DARKPACK EDIT REMOVE /obj/item/clothing/glasses/sunglasses/chemical/add_glasses_slapcraft_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/scienceglassesremoval) @@ -475,6 +497,9 @@ tint = 2 visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT glass_colour_type = /datum/client_colour/glass_colour/gray + pickup_sound = SFX_GOGGLES_PICKUP + drop_sound = SFX_GOGGLES_DROP + equip_sound = SFX_GOGGLES_EQUIP /obj/item/clothing/glasses/welding/Initialize(mapload) . = ..() @@ -508,6 +533,7 @@ flags_cover = GLASSESCOVERSEYES tint = INFINITY // You WILL Be blind, no matter what dog_fashion = /datum/dog_fashion/head + custom_materials = null /obj/item/clothing/glasses/blindfold/Initialize(mapload) . = ..() @@ -519,6 +545,7 @@ icon_state = "trickblindfold" inhand_icon_state = "blindfold" flags_cover = GLASSESCOVERSEYES + custom_materials = null /obj/item/clothing/glasses/blindfold/white name = "blind personnel blindfold" @@ -549,6 +576,9 @@ flash_protect = FLASH_PROTECTION_SENSITIVE flags_cover = GLASSESCOVERSEYES glass_colour_type = /datum/client_colour/glass_colour/red + pickup_sound = SFX_GOGGLES_PICKUP + drop_sound = SFX_GOGGLES_DROP + equip_sound = SFX_GOGGLES_EQUIP /obj/item/clothing/glasses/thermal/emp_act(severity) . = ..() @@ -609,6 +639,9 @@ icon_state = "cold" inhand_icon_state = null flags_cover = GLASSESCOVERSEYES + pickup_sound = SFX_GOGGLES_PICKUP + drop_sound = SFX_GOGGLES_DROP + equip_sound = SFX_GOGGLES_EQUIP /obj/item/clothing/glasses/heat name = "heat goggles" @@ -616,6 +649,9 @@ icon_state = "heat" inhand_icon_state = null flags_cover = GLASSESCOVERSEYES + pickup_sound = SFX_GOGGLES_PICKUP + drop_sound = SFX_GOGGLES_DROP + equip_sound = SFX_GOGGLES_EQUIP /obj/item/clothing/glasses/orange name = "orange glasses" @@ -639,6 +675,9 @@ worn_icon_state = "geist_gazers" glass_colour_type = /datum/client_colour/glass_colour/green flags_cover = GLASSESCOVERSEYES + pickup_sound = SFX_GOGGLES_PICKUP + drop_sound = SFX_GOGGLES_DROP + equip_sound = SFX_GOGGLES_EQUIP /obj/item/clothing/glasses/psych name = "psych glasses" @@ -658,43 +697,32 @@ lighting_cutoff = LIGHTING_CUTOFF_HIGH glass_colour_type = FALSE vision_flags = SEE_TURFS - clothing_traits = list(TRAIT_REAGENT_SCANNER, TRAIT_MADNESS_IMMUNE) - var/list/hudlist = list(DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC, DATA_HUD_SECURITY_ADVANCED, DATA_HUD_BOT_PATH) + clothing_traits = list( + TRAIT_REAGENT_SCANNER, + TRAIT_MADNESS_IMMUNE, + TRAIT_MEDICAL_HUD, + TRAIT_SECURITY_HUD, + TRAIT_DIAGNOSTIC_HUD, + TRAIT_BOT_PATH_HUD, + ) var/xray = FALSE + pickup_sound = SFX_GOGGLES_PICKUP + drop_sound = SFX_GOGGLES_DROP + equip_sound = SFX_GOGGLES_EQUIP /obj/item/clothing/glasses/debug/Initialize(mapload) . = ..() AddComponent(/datum/component/adjust_fishing_difficulty, -15) -/obj/item/clothing/glasses/debug/equipped(mob/user, slot) - . = ..() - if(!(slot & ITEM_SLOT_EYES)) - return - if(ishuman(user)) - for(var/hud in hudlist) - var/datum/atom_hud/our_hud = GLOB.huds[hud] - our_hud.show_to(user) - user.add_traits(list(TRAIT_MEDICAL_HUD, TRAIT_SECURITY_HUD), GLASSES_TRAIT) - if(xray) - ADD_TRAIT(user, TRAIT_XRAY_VISION, GLASSES_TRAIT) - -/obj/item/clothing/glasses/debug/dropped(mob/user) - . = ..() - user.remove_traits(list(TRAIT_MEDICAL_HUD, TRAIT_SECURITY_HUD, TRAIT_XRAY_VISION), GLASSES_TRAIT) - if(ishuman(user)) - for(var/hud in hudlist) - var/datum/atom_hud/our_hud = GLOB.huds[hud] - our_hud.hide_from(user) - /obj/item/clothing/glasses/debug/click_alt(mob/user) if(!ishuman(user)) return CLICK_ACTION_BLOCKING if(xray) vision_flags &= ~SEE_MOBS|SEE_OBJS - REMOVE_TRAIT(user, TRAIT_XRAY_VISION, GLASSES_TRAIT) + detach_clothing_traits(TRAIT_XRAY_VISION) else vision_flags |= SEE_MOBS|SEE_OBJS - ADD_TRAIT(user, TRAIT_XRAY_VISION, GLASSES_TRAIT) + attach_clothing_traits(TRAIT_XRAY_VISION) xray = !xray var/mob/living/carbon/human/human_user = user human_user.update_sight() @@ -751,6 +779,9 @@ flags_cover = GLASSESCOVERSEYES /// Hallucination datum currently being used for seeing mares var/datum/hallucination/stored_hallucination + pickup_sound = SFX_GOGGLES_PICKUP + drop_sound = SFX_GOGGLES_DROP + equip_sound = SFX_GOGGLES_EQUIP /obj/item/clothing/glasses/nightmare_vision/Initialize(mapload) . = ..() @@ -793,3 +824,4 @@ icon_state = "phantom_glasses" inhand_icon_state = null flags_cover = GLASSESCOVERSEYES + custom_materials = null diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index 4d7951a62f62..841736085620 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -6,6 +6,7 @@ #define MODE_SHUTTLE "shuttle" #define MODE_PIPE_CONNECTABLE "connectable" #define MODE_ATMOS_THERMAL "atmospheric-thermal" +#define MODE_AREA_BLUEPRINTS "area-blueprints" #define TEMP_SHADE_CYAN 273.15 #define TEMP_SHADE_GREEN 283.15 #define TEMP_SHADE_YELLOW 300 @@ -19,13 +20,17 @@ actions_types = list(/datum/action/item_action/toggle_mode) glass_colour_type = /datum/client_colour/glass_colour/gray gender = PLURAL - vision_flags = NONE color_cutoffs = null - - var/list/modes = list(MODE_NONE = MODE_MESON, MODE_MESON = MODE_TRAY, MODE_TRAY = MODE_NONE) + /// List of selectable modes that can be used by the goggles + var/list/modes = list(MODE_NONE, MODE_MESON, MODE_TRAY) + /// The current mode string that is selected from the modes list (used for icons) var/mode = MODE_NONE + /// The current mode index that is selected from the modes list + var/mode_index = 1 + /// The distance for how far we can see special objects (only used for pipes and wires) var/range = 1 + /// A cache of tracked pipes used in MODE_PIPE_CONNECTABLE var/list/connection_images = list() /obj/item/clothing/glasses/meson/engine/Initialize(mapload) @@ -39,7 +44,8 @@ return ..() /obj/item/clothing/glasses/meson/engine/proc/toggle_mode(mob/user, voluntary) - mode = modes[mode] + mode_index = WRAP_UP(mode_index, modes.len) + mode = modes[mode_index] to_chat(user, "[voluntary ? "You turn the goggles":"The goggles turn"] [mode ? "to [mode] mode":"off"][voluntary ? ".":"!"]") if(connection_images.len) connection_images.Cut() @@ -60,6 +66,9 @@ if(MODE_SHUTTLE) change_glass_color(/datum/client_colour/glass_colour/red) + if(MODE_AREA_BLUEPRINTS) + change_glass_color(/datum/client_colour/glass_colour/lightyellow) + if(MODE_NONE) change_glass_color(initial(glass_colour_type)) @@ -89,6 +98,8 @@ show_connections() if(MODE_ATMOS_THERMAL) atmos_thermal(user) + if(MODE_AREA_BLUEPRINTS) + show_blueprints(user) /obj/item/clothing/glasses/meson/engine/proc/show_shuttle() var/mob/living/carbon/human/user = loc @@ -142,9 +153,7 @@ inhand_icon_state = "trayson-t-ray" desc = "Used by engineering staff to see underfloor objects such as cables and pipes." range = 2 - - - modes = list(MODE_NONE = MODE_TRAY, MODE_TRAY = MODE_PIPE_CONNECTABLE, MODE_PIPE_CONNECTABLE = MODE_ATMOS_THERMAL, MODE_ATMOS_THERMAL = MODE_NONE) // atmos techs now finally have 3 modes on their goggles! + modes = list(MODE_NONE, MODE_TRAY, MODE_PIPE_CONNECTABLE, MODE_ATMOS_THERMAL) // atmos techs now finally have 3 modes on their goggles! /obj/item/clothing/glasses/meson/engine/tray/dropped(mob/user) . = ..() @@ -156,8 +165,7 @@ icon_state = "trayson-shuttle" inhand_icon_state = "trayson-shuttle" desc = "Used to see the boundaries of shuttle regions." - - modes = list(MODE_NONE = MODE_SHUTTLE, MODE_SHUTTLE = MODE_NONE) + modes = list(MODE_NONE, MODE_SHUTTLE) /obj/item/clothing/glasses/meson/engine/atmos_imaging @@ -166,14 +174,29 @@ icon_state = "trayson-atmospheric-thermal" inhand_icon_state = "trayson-meson" glass_colour_type = /datum/client_colour/glass_colour/gray - - modes = list(MODE_NONE = MODE_ATMOS_THERMAL, MODE_ATMOS_THERMAL = MODE_NONE) + modes = list(MODE_NONE, MODE_ATMOS_THERMAL) /obj/item/clothing/glasses/meson/engine/atmos_imaging/update_icon_state() icon_state = inhand_icon_state = "trayson-[mode]" return ..() +/obj/item/clothing/glasses/meson/engine/admin + name = "admin imaging goggles" + desc = "Used by Nanotrasen admins to detect blueprint areas, pipes, thermal, wiring, and pipes." + range = 7 + modes = list(MODE_NONE, MODE_TRAY, MODE_PIPE_CONNECTABLE, MODE_ATMOS_THERMAL, MODE_AREA_BLUEPRINTS) +/proc/show_blueprints(mob/viewer, range = 7, duration = 10) + if(!ismob(viewer) || !viewer.client) + return + for(var/turf/viewable_turf in view(range, viewer)) + var/area/selected_area = get_area(viewable_turf) + var/obj/area_overlay = image(selected_area.icon, viewable_turf, initial(selected_area.icon_state), TOPDOWN_ABOVE_WATER_LAYER) + SET_PLANE_EXPLICIT(area_overlay, ABOVE_GAME_PLANE, viewable_turf) + area_overlay.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA + area_overlay.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + area_overlay.alpha = 255 + flick_overlay_global(area_overlay, list(viewer.client), duration) /proc/atmos_thermal(mob/viewer, range = 5, duration = 10) if(!ismob(viewer) || !viewer.client) @@ -211,6 +234,7 @@ #undef MODE_SHUTTLE #undef MODE_PIPE_CONNECTABLE #undef MODE_ATMOS_THERMAL +#undef MODE_AREA_BLUEPRINTS #undef TEMP_SHADE_CYAN #undef TEMP_SHADE_GREEN #undef TEMP_SHADE_YELLOW diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 574d980c3c29..ced60b43f8e2 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -100,6 +100,8 @@ flags_cover = GLASSESCOVERSEYES tint = 1 glass_colour_type = /datum/client_colour/glass_colour/blue + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 0.55, /datum/material/iron = SMALL_MATERIAL_AMOUNT / 2) + /* // DARKPACK EDIT REMOVE /obj/item/clothing/glasses/hud/health/sunglasses/Initialize(mapload) . = ..() @@ -141,6 +143,8 @@ flash_protect = FLASH_PROTECTION_FLASH flags_cover = GLASSESCOVERSEYES tint = 1 + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 0.55, /datum/material/iron = SMALL_MATERIAL_AMOUNT / 2) + /* // DARKPACK EDIT REMOVE /obj/item/clothing/glasses/hud/diagnostic/sunglasses/Initialize(mapload) . = ..() @@ -184,6 +188,8 @@ flags_cover = GLASSESCOVERSEYES tint = 1 glass_colour_type = /datum/client_colour/glass_colour/darkred + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 0.55, /datum/material/iron = SMALL_MATERIAL_AMOUNT / 2) + /* // DARKPACK EDIT REMOVE /obj/item/clothing/glasses/hud/security/sunglasses/Initialize(mapload) . = ..() @@ -243,18 +249,14 @@ if (wearer.glasses != src) return - for(var/trait in clothing_traits) - REMOVE_CLOTHING_TRAIT(user, trait) - if (TRAIT_MEDICAL_HUD in clothing_traits) - clothing_traits = null + detach_clothing_traits(TRAIT_MEDICAL_HUD) else if (TRAIT_SECURITY_HUD in clothing_traits) - clothing_traits = list(TRAIT_MEDICAL_HUD) + detach_clothing_traits(TRAIT_MEDICAL_HUD) + attach_clothing_traits(TRAIT_SECURITY_HUD) else - clothing_traits = list(TRAIT_SECURITY_HUD) - - for(var/trait in clothing_traits) - ADD_CLOTHING_TRAIT(user, trait) + detach_clothing_traits(TRAIT_MEDICAL_HUD) + attach_clothing_traits(TRAIT_SECURITY_HUD) /datum/action/item_action/switch_hud name = "Switch HUD" diff --git a/code/modules/clothing/gloves/bone.dm b/code/modules/clothing/gloves/bone.dm index a29d4cfd223b..f429d9382415 100644 --- a/code/modules/clothing/gloves/bone.dm +++ b/code/modules/clothing/gloves/bone.dm @@ -11,6 +11,7 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | LAVA_PROOF armor_type = /datum/armor/gloves_bracer + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 2) /obj/item/clothing/gloves/bracer/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/gloves/insulated.dm b/code/modules/clothing/gloves/insulated.dm index c3d44c9c760d..74098e33e4fe 100644 --- a/code/modules/clothing/gloves/insulated.dm +++ b/code/modules/clothing/gloves/insulated.dm @@ -15,6 +15,7 @@ custom_premium_price = PAYCHECK_COMMAND * 6 cut_type = /obj/item/clothing/gloves/cut equip_sound = 'sound/items/equip/glove_equip.ogg' + custom_price = 200 // DARKPACK EDIT ADD - ECONOMY /obj/item/clothing/gloves/color/yellow/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/gloves/plasmaman.dm b/code/modules/clothing/gloves/plasmaman.dm index 36fd467282b6..a0c9a3015e82 100644 --- a/code/modules/clothing/gloves/plasmaman.dm +++ b/code/modules/clothing/gloves/plasmaman.dm @@ -7,7 +7,7 @@ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - resistance_flags = NONE + resistance_flags = FIRE_PROOF armor_type = /datum/armor/color_plasmaman equip_sound = 'sound/items/equip/glove_equip.ogg' diff --git a/code/modules/clothing/gloves/punch_mitts.dm b/code/modules/clothing/gloves/punch_mitts.dm index 28ffb67d59d5..2d1a345dd70d 100644 --- a/code/modules/clothing/gloves/punch_mitts.dm +++ b/code/modules/clothing/gloves/punch_mitts.dm @@ -1,7 +1,7 @@ /obj/item/clothing/gloves/fingerless/punch_mitts name = "punching mitts" desc = "Fingerless gloves with nasty spikes attached. Allows the wearer to utilize the ill-reputed fighting technique known as Hunter Boxing. The style \ - allows the user to rapidly punch wildlife and rock into smithereens. Great workout. Extremely ill-advised for ensuring your own personal survival." + allows the user to rapidly punch wildlife into smithereens. Great workout. Extremely ill-advised for ensuring your own personal survival." icon_state = "punch_mitts" body_parts_covered = HANDS|ARMS resistance_flags = LAVA_PROOF | FIRE_PROOF diff --git a/code/modules/clothing/gloves/special.dm b/code/modules/clothing/gloves/special.dm index 6d0fe95bcf5a..875fdcfda52b 100644 --- a/code/modules/clothing/gloves/special.dm +++ b/code/modules/clothing/gloves/special.dm @@ -68,6 +68,7 @@ icon_state = "radio_g" inhand_icon_state = null clothing_traits = list(TRAIT_CAN_SIGN_ON_COMMS) + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.9, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.4) /obj/item/clothing/gloves/race name = "race gloves" @@ -227,7 +228,7 @@ stamina_exhaustion *= 1.5 experience *= 2 - wearer.adjustStaminaLoss(stamina_exhaustion) + wearer.adjust_stamina_loss(stamina_exhaustion) wearer.mind?.adjust_experience(/datum/skill/athletics, experience) wearer.apply_status_effect(/datum/status_effect/exercised) diff --git a/code/modules/clothing/head/beanie.dm b/code/modules/clothing/head/beanie.dm index 32167a860813..2190de08f345 100644 --- a/code/modules/clothing/head/beanie.dm +++ b/code/modules/clothing/head/beanie.dm @@ -48,7 +48,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." + desc = "A beanie made from durathread. Its resilient fibres provide some protection to the wearer." icon_state = "/obj/item/clothing/head/beanie/durathread" greyscale_colors = "#8291A1#8291A1" armor_type = /datum/armor/beanie_durathread diff --git a/code/modules/clothing/head/cakehat.dm b/code/modules/clothing/head/cakehat.dm index cbbb02b4f0db..529c87379807 100644 --- a/code/modules/clothing/head/cakehat.dm +++ b/code/modules/clothing/head/cakehat.dm @@ -18,6 +18,9 @@ wound_bonus = 10 exposed_wound_bonus = 5 dog_fashion = /datum/dog_fashion/head + pickup_sound = null + drop_sound = null + equip_sound = null hitsound = 'sound/items/weapons/tap.ogg' var/hitsound_on = 'sound/items/weapons/sear.ogg' //so we can differentiate between cakehat and energyhat var/hitsound_off = 'sound/items/weapons/tap.ogg' diff --git a/code/modules/clothing/head/cone.dm b/code/modules/clothing/head/cone.dm index a77d40b541f1..844558b55155 100644 --- a/code/modules/clothing/head/cone.dm +++ b/code/modules/clothing/head/cone.dm @@ -16,6 +16,7 @@ pickup_sound = 'sound/items/handling/materials/plastic_pick_up.ogg' drop_sound = 'sound/items/handling/materials/plastic_drop.ogg' resistance_flags = NONE + custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 2) /obj/item/clothing/head/cone/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/head/costume.dm b/code/modules/clothing/head/costume.dm index 7607dc8631ca..dca79cd254b3 100644 --- a/code/modules/clothing/head/costume.dm +++ b/code/modules/clothing/head/costume.dm @@ -64,6 +64,7 @@ greyscale_config_inhand_right = /datum/greyscale_config/maid_headband_inhands_right inhand_icon_state = "maid" flags_1 = IS_PLAYER_COLORABLE_1 + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR /obj/item/clothing/head/costume/chicken name = "chicken suit head" @@ -123,6 +124,7 @@ clothing_flags = SNUG_FIT flags_cover = HEADCOVERSEYES flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT + custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT) dog_fashion = /datum/dog_fashion/head/cardborg @@ -141,6 +143,7 @@ clothing_flags = SNUG_FIT flags_inv = HIDEEARS|HIDEHAIR armor_type = /datum/armor/costume_bronze + custom_materials = list(/datum/material/bronze = SHEET_MATERIAL_AMOUNT) /obj/item/clothing/head/costume/fancy name = "fancy hat" @@ -172,6 +175,7 @@ clothing_flags = SNUG_FIT flags_cover = HEADCOVERSEYES|HEADCOVERSMOUTH flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7) /datum/armor/costume_bronze melee = 5 @@ -222,7 +226,7 @@ desc = "A delicate hairpin normally paired with traditional clothing" icon_state = "hairpin_fancy" inhand_icon_state = "hairpin_fancy" - + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR /obj/item/clothing/head/costume/snakeeater name = "strange bandana" @@ -230,6 +234,7 @@ icon_state = "snake_eater" inhand_icon_state = null clothing_traits = list(TRAIT_FISH_EATER) + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR /obj/item/clothing/head/costume/knight name = "fake medieval helmet" diff --git a/code/modules/clothing/head/crown.dm b/code/modules/clothing/head/crown.dm index b441453a1c31..5cb914875f15 100644 --- a/code/modules/clothing/head/crown.dm +++ b/code/modules/clothing/head/crown.dm @@ -4,6 +4,7 @@ icon_state = "crown" armor_type = /datum/armor/costume_crown resistance_flags = FIRE_PROOF + custom_materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT * 5) /datum/armor/costume_crown melee = 15 diff --git a/code/modules/clothing/head/garlands.dm b/code/modules/clothing/head/garlands.dm index 374bd2fdafd4..3bf2506c6e82 100644 --- a/code/modules/clothing/head/garlands.dm +++ b/code/modules/clothing/head/garlands.dm @@ -18,6 +18,7 @@ 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" + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.3) //tied together with cable coil /obj/item/clothing/head/costume/garland/rainbowbunch/Initialize(mapload) . = ..() @@ -38,16 +39,19 @@ 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" + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.3) //tied together with cable coil /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" + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.3) //tied together with cable coil /obj/item/clothing/head/costume/garland/lily name = "lily crown" desc = "A leafy flower crown with a cluster of large white lilies at the front." icon_state = "lily_crown" worn_icon_state = "lily_crown" + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.3) //tied together with cable coil diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index b54ce6bf7934..7d0eebf96638 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -1,6 +1,10 @@ /obj/item/clothing/head/utility icon = 'icons/obj/clothing/head/utility.dmi' worn_icon = 'icons/mob/clothing/head/utility.dmi' + sound_vary = TRUE + pickup_sound = SFX_HARD_HAT_PICKUP + drop_sound = SFX_HARD_HAT_DROP + equip_sound = SFX_HARD_HAT_EQUIP /obj/item/clothing/head/utility/hardhat name = "hard hat" @@ -243,6 +247,9 @@ worn_y_offset = 1 dog_fashion = /datum/dog_fashion/head/pumpkin/unlit clothing_traits = list() + pickup_sound = null + drop_sound = null + equip_sound = null /obj/item/clothing/head/utility/hardhat/pumpkinhead/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/head/hat.dm b/code/modules/clothing/head/hat.dm index a6402607781f..21ac5aa80475 100644 --- a/code/modules/clothing/head/hat.dm +++ b/code/modules/clothing/head/hat.dm @@ -60,10 +60,11 @@ desc = "These were once used by plague doctors. This hat will only slightly protect you from exposure to the Pestilence." icon_state = "plaguedoctor" armor_type = /datum/armor/bio_hood_plague - flags_inv = NONE + flags_inv = HIDEHAIR|HIDEEARS clothing_flags = SNUG_FIT flags_cover = NONE dirt_state = null + alternate_worn_layer = HAIR_LAYER /datum/armor/bio_hood_plague bio = 100 @@ -303,7 +304,7 @@ /obj/item/clothing/head/hats/centcom_cap name = "\improper CentCom commander cap" icon_state = "centcom_cap" - desc = "Worn by the finest of CentCom commanders. Inside the lining of the cap, lies two faint initials." + desc = "Worn by the finest of CentCom commanders. Two faint initials lie inside the lining of the cap." inhand_icon_state = "that" flags_inv = 0 armor_type = /datum/armor/hats_centcom_cap @@ -390,3 +391,4 @@ icon_state = "paper" worn_icon_state = "paper" dog_fashion = /datum/dog_fashion/head + custom_materials = list(/datum/material/paper = HALF_SHEET_MATERIAL_AMOUNT / 2) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 6b4b38298bae..ddf8b5f019e4 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -61,10 +61,11 @@ to_chat(user, span_notice("You add [attached_signaler] to [src].")) qdel(attached_signaler) - var/obj/item/bot_assembly/secbot/secbot_frame = new(loc) - user.put_in_hands(secbot_frame) - + var/obj/item/bot_assembly/secbot/secbot_frame = new(drop_location()) + var/held_index = user.is_holding(src) qdel(src) + if (held_index) + user.put_in_hand(secbot_frame, held_index) return TRUE return ..() @@ -97,7 +98,7 @@ /obj/item/clothing/head/helmet/press name = "press helmet" - desc = "A blue helmet used to distinguish non-combatant \"PRESS\" members, like if anyone cares." + desc = "A blue helmet used to distinguish non-combatant \"PRESS\" members, like anyone cares." icon_state = "helmet_press" base_icon_state = "helmet_press" sound_vary = TRUE @@ -189,7 +190,7 @@ /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 its lack of space worthiness" + desc = "A tactical black helmet, designed to protect one's head from various injuries sustained in operations. Its stellar survivability makes up for its lack of space worthiness" min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT clothing_flags = null @@ -275,7 +276,7 @@ /obj/item/clothing/head/helmet/balloon name = "balloon helmet" - desc = "A helmet made out of balloons. Its likes saw great usage in the Great Clown - Mime War. Surprisingly resistant to fire. Mimes were doing unspeakable things." + desc = "A helmet made out of balloons. The like saw great usage in the Great Clown - Mime War. Surprisingly resistant to fire. Mimes were doing unspeakable things." icon_state = "helmet_balloon" inhand_icon_state = "helmet_balloon" armor_type = /datum/armor/balloon @@ -294,8 +295,8 @@ icon_state = "justice" base_icon_state = "justice" inhand_icon_state = "justice_helmet" - toggle_message = "You turn off the lights on" - alt_toggle_message = "You turn on the lights on" + toggle_message = "You turn off the lights" + alt_toggle_message = "You turn on the lights" actions_types = list(/datum/action/item_action/toggle_helmet_light) ///Cooldown for toggling the visor. COOLDOWN_DECLARE(visor_toggle_cooldown) @@ -623,7 +624,7 @@ /obj/item/clothing/head/helmet/military name = "Crude Helmet" - desc = "A cheaply made kettle helmet with an added faceplate to protect your eyes and mouth." + desc = "A cheaply made kettle helmet with an added faceplate to protect the eyes and mouth." icon_state = "military" inhand_icon_state = "knight_helmet" flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDESNOUT @@ -647,10 +648,6 @@ acid = 50 wound = 20 -/obj/item/clothing/head/helmet/military/Initialize(mapload) - . = ..() - AddComponent(/datum/component/clothing_fov_visor, FOV_90_DEGREES) - /obj/item/clothing/head/helmet/knight/warlord name = "golden barbute helmet" desc = "There is no man behind the helmet, only a terrible thought." @@ -677,7 +674,7 @@ /obj/item/clothing/head/helmet/durability/watermelon name = "watermelon helmet" - desc = "A helmet cut out from a watermelon. Might take a few hits, but don't expect it whitstand much." + desc = "A helmet cut out from a watermelon. Might take a few hits, but don't expect it to withstand much." icon_state = "watermelon" inhand_icon_state = "watermelon" flags_inv = HIDEEARS @@ -741,7 +738,7 @@ /obj/item/clothing/head/helmet/durability/barrelmelon name = "barrelmelon helmet" - desc = "A helmet from hollowed out barrelmelon. As sturdy as if made from actual wood, though its rigid structure makes it break up quicker." + desc = "A helmet made from a hollowed out barrelmelon. As sturdy as actual wood, though its rigid structure makes it break quicker." icon_state = "barrelmelon" inhand_icon_state = "barrelmelon" flags_inv = HIDEEARS diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 61285e3801b4..7f3a5608cc34 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -17,6 +17,9 @@ var/mouse_control_probability = 20 /// Allowed time between movements COOLDOWN_DECLARE(move_cooldown) + pickup_sound = null + drop_sound = null + equip_sound = null /// 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 @@ -51,7 +54,7 @@ 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) +/obj/item/clothing/head/utility/chefhat/proc/on_mouse_emote(mob/living/source, key, emote_message, type_override, intentional, datum/emote/emote) SIGNAL_HANDLER var/mob/living/carbon/wearer = loc if(!wearer || INCAPACITATED_IGNORING(wearer, INCAPABLE_RESTRAINTS)) @@ -292,7 +295,7 @@ var/obj/item/found_item = items_by_regex[found_regex] . += span_notice("[icon2html(found_item, user)] You can remove [found_item] by saying \"[prefix] [found_phrase]\"!") -/obj/item/clothing/head/fedora/inspector_hat/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/obj/item/clothing/head/fedora/inspector_hat/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/item/clothing/head/fedora/inspector_hat/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) . = ..() var/mob/living/carbon/wearer = loc if(!istype(wearer) || speaker != wearer) //if we are worn @@ -441,6 +444,7 @@ worn_icon = 'icons/mob/large-worn-icons/64x64/head.dmi' worn_x_dimension = 64 worn_y_dimension = 64 + custom_materials = list(/datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 2, /datum/material/gold = SHEET_MATERIAL_AMOUNT * 2) /obj/item/clothing/head/hats/hos/beret name = "head of security's beret" @@ -637,6 +641,9 @@ 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! w_class = WEIGHT_CLASS_SMALL //surgery cap can be easily crumpled + pickup_sound = SFX_CLOTH_PICKUP + drop_sound = SFX_CLOTH_DROP + equip_sound = null /obj/item/clothing/head/utility/surgerycap/Initialize(mapload) . = ..() @@ -683,6 +690,9 @@ A little useless now, given the technology available, but it certainly completes the look." icon_state = "headmirror" body_parts_covered = NONE + pickup_sound = null + drop_sound = null + equip_sound = null /obj/item/clothing/head/utility/head_mirror/Initialize(mapload) . = ..() @@ -740,7 +750,7 @@ else var/obj/item/organ/ears/has_ears = human_examined.get_organ_slot(ORGAN_SLOT_EARS) if(has_ears) - if(has_ears.deaf) + if(has_ears.temporary_deafness) final_message += "\tDamaged eardrums in [examining.p_their()] ear canals." else final_message += "\tA set of [has_ears.damage ? "" : "healthy "][has_ears.name]." diff --git a/code/modules/clothing/head/papersack.dm b/code/modules/clothing/head/papersack.dm index 984b73d6bcce..1c1aa342792e 100644 --- a/code/modules/clothing/head/papersack.dm +++ b/code/modules/clothing/head/papersack.dm @@ -3,6 +3,7 @@ desc = "A paper sack with crude holes cut out for eyes. Useful for hiding one's identity or ugliness." icon_state = "papersack" flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS|HIDESNOUT + custom_materials = list(/datum/material/paper = SHEET_MATERIAL_AMOUNT * 1.25) /obj/item/clothing/head/costume/papersack/smiley name = "paper sack hat" diff --git a/code/modules/clothing/head/perceptomatrix.dm b/code/modules/clothing/head/perceptomatrix.dm index 45f55a46ff09..ad8036d7b17a 100644 --- a/code/modules/clothing/head/perceptomatrix.dm +++ b/code/modules/clothing/head/perceptomatrix.dm @@ -102,7 +102,7 @@ // When someone makes TRAIT_DEAF an element, or status effect, or whatever, give this item a way to bypass said deafness. // just blocking future instances of deafness isn't what the item is meant to do but there's no proper way to do it otherwise at the moment. - active_components += AddComponent(/datum/component/wearertargeting/earprotection, reduce_amount = 2) // should be same as highest value + active_components += AddComponent(/datum/component/wearertargeting/earprotection, EAR_PROTECTION_HEAVY) // should be same as highest value active_components += AddComponent( /datum/component/anti_magic, \ antimagic_flags = MAGIC_RESISTANCE_MIND, \ diff --git a/code/modules/clothing/head/pirate.dm b/code/modules/clothing/head/pirate.dm index 94f14841d3a3..9aec619d8a37 100644 --- a/code/modules/clothing/head/pirate.dm +++ b/code/modules/clothing/head/pirate.dm @@ -45,7 +45,6 @@ /obj/item/clothing/head/costume/pirate/bandana name = "pirate bandana" - desc = "Yarr." icon_state = "bandana" inhand_icon_state = null diff --git a/code/modules/clothing/head/wig.dm b/code/modules/clothing/head/wig.dm index 9d3f26f875b8..42fb32c08cb0 100644 --- a/code/modules/clothing/head/wig.dm +++ b/code/modules/clothing/head/wig.dm @@ -51,7 +51,7 @@ /obj/item/clothing/head/wig/attack_self(mob/user) var/new_style = tgui_input_list(user, "Select a hairstyle", "Wig Styling", SSaccessories.hairstyles_list - "Bald") - var/newcolor = adjustablecolor ? input(usr,"","Choose Color",color) as color|null : null + var/newcolor = adjustablecolor ? tgui_color_picker(usr,"","Choose Color",color) : null if(!user.can_perform_action(src)) return if(new_style && new_style != hairstyle) diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index 8682dc4a9276..672b2eeef1c4 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -9,7 +9,6 @@ strip_delay = 4 SECONDS equip_delay_other = 4 SECONDS visor_vars_to_toggle = NONE - unique_reskin_changes_base_icon_state = TRUE var/adjusted_flags = null ///Did we install a filtering cloth? diff --git a/code/modules/clothing/masks/costume.dm b/code/modules/clothing/masks/costume.dm index 8ddfcf5520fa..27d17af36e05 100644 --- a/code/modules/clothing/masks/costume.dm +++ b/code/modules/clothing/masks/costume.dm @@ -1,3 +1,28 @@ +// Mask skins +/datum/atom_skin/joy_mask + abstract_type = /datum/atom_skin/joy_mask + change_base_icon_state = TRUE + +/datum/atom_skin/joy_mask/joy + preview_name = "Joy" + new_icon_state = "joy" + +/datum/atom_skin/joy_mask/flushed + preview_name = "Flushed" + new_icon_state = "flushed" + +/datum/atom_skin/joy_mask/pensive + preview_name = "Pensive" + new_icon_state = "pensive" + +/datum/atom_skin/joy_mask/angry + preview_name = "Angry" + new_icon_state = "angry" + +/datum/atom_skin/joy_mask/pleading + preview_name = "Pleading" + new_icon_state = "pleading" + /obj/item/clothing/mask/joy name = "emotion mask" desc = "Express your happiness or hide your sorrows with this cultured cutout." @@ -5,19 +30,10 @@ base_icon_state = "joy" clothing_flags = MASKINTERNALS flags_inv = HIDESNOUT - obj_flags = parent_type::obj_flags | INFINITE_RESKIN - unique_reskin = list( - "Joy" = "joy", - "Flushed" = "flushed", - "Pensive" = "pensive", - "Angry" = "angry", - "Pleading" = "pleading" - ) - -/obj/item/clothing/mask/joy/reskin_obj(mob/user) +/obj/item/clothing/mask/joy/Initialize(mapload) . = ..() - user.update_worn_mask() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/joy_mask, infinite = TRUE) /obj/item/clothing/mask/mummy name = "mummy mask" @@ -77,3 +93,4 @@ greyscale_config = /datum/greyscale_config/rebellion_mask greyscale_config_worn = /datum/greyscale_config/rebellion_mask/worn flags_1 = IS_PLAYER_COLORABLE_1 + custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 0988b5e6848e..33aabab75ed7 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -19,6 +19,10 @@ GLOBAL_LIST_INIT(clown_mask_options, list( flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH | PEPPERPROOF resistance_flags = NONE voice_filter = "lowpass=f=750,volume=2" + sound_vary = TRUE + pickup_sound = SFX_GAS_MASK_PICKUP + drop_sound = SFX_GAS_MASK_DROP + equip_sound = SFX_GAS_MASK_EQUIP ///Max numbers of installable filters var/max_filters = 1 ///List to keep track of each filter @@ -264,7 +268,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( name = "plague doctor mask" desc = "A modernised version of the classic design, this mask will not only protect you from exposure to the Pestilence but it can also be connected to an air supply." icon_state = "plaguedoctor" - flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT|HIDEHAIR + flags_inv = HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT inhand_icon_state = "gas_mask" clothing_flags = BLOCK_GAS_SMOKE_EFFECT|MASKINTERNALS dirt_state = "plague_dirt" @@ -442,6 +446,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( icon_state = "carp_mask" inhand_icon_state = null flags_cover = MASKCOVERSEYES + clothing_flags = CARP_STYLE_FACTOR fishing_modifier = -4 /obj/item/clothing/mask/gas/tiki_mask @@ -449,7 +454,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( desc = "A creepy wooden mask. Surprisingly expressive for a poorly carved bit of wood." icon_state = "tiki_eyebrow" inhand_icon_state = null - custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 1.25) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) resistance_flags = FLAMMABLE flags_cover = MASKCOVERSEYES max_integrity = 100 diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index b70e7105bf4c..f12627896089 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -202,16 +202,23 @@ greyscale_config_worn = null greyscale_colors = null -/obj/item/clothing/neck/tie/disco - name = "horrific necktie" +/obj/item/clothing/neck/robe_cape + name = "robe cape" + desc = "A comfortable cape, draped down your back and held around your neck with a brooch." icon = 'icons/obj/clothing/neck.dmi' - icon_state = "eldritch_tie" - post_init_icon_state = null - desc = "The necktie is adorned with a garish pattern. It's disturbingly vivid. Somehow you feel as if it would be wrong to ever take it off. It's your friend now. You will betray it if you change it for some boring scarf." - clip_on = TRUE - greyscale_config = null - greyscale_config_worn = null - greyscale_colors = null + icon_state = "/obj/item/clothing/neck/robe_cape" + post_init_icon_state = "robe_cape" + worn_icon = 'icons/mob/clothing/neck.dmi' + worn_icon_state = "robe_cape" + abstract_type = /obj/item/clothing/neck + greyscale_config = /datum/greyscale_config/robe_cape + greyscale_config_worn = /datum/greyscale_config/robe_cape/worn + greyscale_colors = "#2a2844" + flags_1 = IS_PLAYER_COLORABLE_1 + +/obj/item/clothing/neck/robe_cape/Initialize(mapload) + . = ..() + AddElement(/datum/element/surgery_aid, "cape") /obj/item/clothing/neck/tie/detective name = "loose tie" @@ -245,7 +252,7 @@ var/mob/living/carbon/carbon_patient = target var/body_part = carbon_patient.parse_zone_with_bodypart(user.zone_selected) - var/oxy_loss = carbon_patient.getOxyLoss() + var/oxy_loss = carbon_patient.get_oxy_loss() var/heart_strength var/pulse_pressure @@ -295,7 +302,7 @@ heart_noises = FALSE else if(having_heart_attack) render_list += "You hear a rapid, irregular heartbeat.\n" - else if(heart.damage > 10 || carbon_patient.blood_volume <= BLOOD_VOLUME_OKAY) + else if(heart.damage > 10 || carbon_patient.get_blood_volume(apply_modifiers = TRUE) <= 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 @@ -343,8 +350,10 @@ 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) + var/cached_blood_volume = carbon_patient.get_blood_volume(apply_modifiers = TRUE) + //assess pulse (heart & blood level) - if(isnull(heart) || !heart.is_beating() || carbon_patient.blood_volume <= BLOOD_VOLUME_OKAY || carbon_patient.stat == DEAD) + if(isnull(heart) || !heart.is_beating() || cached_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(having_heart_attack) @@ -354,7 +363,7 @@ 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) || having_heart_attack) + if((cached_blood_volume <= BLOOD_VOLUME_SAFE && cached_blood_volume > BLOOD_VOLUME_OKAY) || having_heart_attack) pulse_pressure = span_danger("thready")//low blood else pulse_pressure = span_notice("strong")//they're okay :D @@ -487,16 +496,20 @@ desc = "It's for pets." icon_state = "petcollar" var/tagname = null + var/human_wearable = FALSE /datum/armor/large_scarf_syndie 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, indirect_action = FALSE) - if(!ismonkey(M)) + if(!ismonkey(M) && !human_wearable) return FALSE return ..() +/obj/item/clothing/neck/petcollar/wearable + human_wearable = TRUE + /obj/item/clothing/neck/petcollar/attack_self(mob/user) tagname = sanitize_name(tgui_input_text(user, "Would you like to change the name on the tag?", "Pet Naming", "Spot", MAX_NAME_LEN)) if (!tagname || !length(tagname)) @@ -535,7 +548,8 @@ if(price) var/true_price = round(price*profit_scaling) - to_chat(user, span_notice("[selling ? "Sold" : "Getting the price of"] [interacting_with], value: [true_price] credits[interacting_with.contents.len ? " (exportable contents included)" : ""].[profit_scaling < 1 && selling ? "[round(price-true_price)] credit\s taken as processing fee\s." : ""]")) + var/fee_display = round(price-true_price) + to_chat(user, span_notice("[selling ? "Sold" : "Getting the price of"] [interacting_with], value: [true_price] [MONEY_NAME][interacting_with.contents.len ? " (exportable contents included)" : ""].[profit_scaling < 1 && selling ? "[fee_display] [MONEY_NAME_AUTOPURAL(fee_display)] taken as processing fee\s." : ""]")) if(selling) new /obj/item/holochip(get_turf(user), true_price) else @@ -564,6 +578,7 @@ worn_y_offset = 10 alternate_worn_layer = ABOVE_BODY_FRONT_HEAD_LAYER resistance_flags = FIRE_PROOF | LAVA_PROOF + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 2, /datum/material/diamond = SHEET_MATERIAL_AMOUNT * 2) /obj/item/clothing/neck/wreath/worn_overlays(mutable_appearance/standing, isinhands, icon_file) . = ..() @@ -575,3 +590,4 @@ desc = "An elaborate crown made from the twisted flesh and sinew of an icewing watcher. \ Wearing it sends shivers down your spine just from being near it." icon_state = "icewing_wreath" + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT * 2) diff --git a/code/modules/clothing/neck/horrific_necktie.dm b/code/modules/clothing/neck/horrific_necktie.dm new file mode 100644 index 000000000000..6170bae31cc8 --- /dev/null +++ b/code/modules/clothing/neck/horrific_necktie.dm @@ -0,0 +1,137 @@ +/obj/item/clothing/neck/tie/disco + name = "horrific necktie" + icon = 'icons/obj/clothing/neck.dmi' + icon_state = "eldritch_tie" + post_init_icon_state = null + desc = "The necktie is adorned with a garish pattern. It's disturbingly vivid. Somehow you feel as if it would be wrong to ever take it off. It's your friend now. You will betray it if you change it for some boring scarf." + clip_on = TRUE + greyscale_config = null + greyscale_config_worn = null + greyscale_colors = null + + /// Are we grabbing a spirit? + var/using = FALSE + ///The only person who can hear us is the one who activated us. Once activated a voice, only they can activate more. + var/datum/mind/hears_us + ///The mob that inhabits us, once posessed. + var/list/mob/living/basic/tie/possessed_souls = list() + +/obj/item/clothing/neck/tie/disco/Destroy() + hears_us = null + QDEL_LIST(possessed_souls) + SSpoints_of_interest.remove_point_of_interest(src) + LAZYREMOVE(GLOB.joinable_mobs[format_text("[initial(name)]")], src) + return ..() + +/obj/item/clothing/neck/tie/disco/examine(mob/user) + . = ..() + if(!length(possessed_souls)) + . += span_notice("It may be given sentience by [EXAMINE_HINT("using it in hand")].") + +/obj/item/clothing/neck/tie/disco/equipped(mob/living/user, slot) + . = ..() + if(!(slot & slot_flags)) + return + if(user.client && (isnull(hears_us) || user == hears_us)) + SSpoints_of_interest.make_point_of_interest(src) + LAZYADD(GLOB.joinable_mobs[format_text("[initial(name)]")], src) + +/obj/item/clothing/neck/tie/disco/dropped(mob/living/user) + if(!QDELETED(src)) + SSpoints_of_interest.remove_point_of_interest(src) + LAZYREMOVE(GLOB.joinable_mobs[format_text("[initial(name)]")], src) + return ..() + +/obj/item/clothing/neck/tie/disco/attack_self(mob/living/user, modifiers) + if(using || (hears_us && (user.mind != hears_us))) + return ..() + + using = TRUE + to_chat(user, span_notice("You plumb the depths of your Inland Empire. Whispers seem to emaninate from [src], as though it had somehow come to life; could it be?")) + + var/list/candidates = SSpolling.poll_ghost_candidates( + question = "Do you want to play as the spirit of [span_danger("[user.real_name]'s")] [span_notice("horrific necktie")]?", + check_jobban = ROLE_PAI, + poll_time = 20 SECONDS, + alert_pic = user, + jump_target = user, + role_name_text = "Necktie of [user.real_name]", + ignore_category = POLL_IGNORE_HORRIFIC_NECKTIE, + ) + if(!length(candidates)) + to_chat(user, span_warning("The whispers coming from [src] fade and are silent again... Was it all your imagination? Maybe you can try again later.")) + using = FALSE + return + hears_us = user.mind + while(!QDELETED(src) && length(candidates)) + var/mob/speaking_tie = candidates[1] + create_ghost(speaking_tie) + candidates -= candidates[1] + using = FALSE + +//this is also called by the spawners menu via `joinable_mobs` +/obj/item/clothing/neck/tie/disco/attack_ghost(mob/hopeful_ghost) + . = ..() + if (!(GLOB.ghost_role_flags & GHOSTROLE_SPAWNER)) + to_chat(hopeful_ghost, span_warning("Ghost roles have been temporarily disabled!")) + return + 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 + became_player_controlled(hopeful_ghost) + return COMPONENT_CANCEL_ATTACK_CHAIN + +///Called by `ghost_direct_control`, lets ghosts force themselves into the tie. +/obj/item/clothing/neck/tie/disco/proc/became_player_controlled(mob/suddenly_new_tie) + if(isnull(hears_us)) + var/mob/living/worn_by = loc + if(!ismob(worn_by)) + return + hears_us = worn_by.mind + create_ghost(suddenly_new_tie) + +///Called when one of our ghosts die (like from logging out/ghosting). +/obj/item/clothing/neck/tie/disco/proc/on_deleting(datum/source, force) + SIGNAL_HANDLER + possessed_souls -= source + to_chat(hears_us.current, span_notice("You feel like a voice just exited your mind.")) + +///Creates the ghost itself and adds them to the list of possessed souls in the tie. +/obj/item/clothing/neck/tie/disco/proc/create_ghost(mob/new_ghost) + var/mob/living/basic/tie/new_soul = new(src) + new_soul.PossessByPlayer(new_ghost.ckey) + RegisterSignal(new_soul, COMSIG_LIVING_SEND_SPEECH, PROC_REF(on_speech_sent)) + RegisterSignal(new_soul, COMSIG_QDELETING, PROC_REF(on_deleting)) + possessed_souls += new_soul + to_chat(hears_us.current, span_notice("You look down at [src] and feel like there's another thought process entering your mind.")) + +///Called when a voice in the tie speaks, we use this to remove all listeners except the voices and creator. +/obj/item/clothing/neck/tie/disco/proc/on_speech_sent(atom/source, list/listeners) + SIGNAL_HANDLER + listeners.Cut() + listeners += possessed_souls + listeners += hears_us.current + +///The mob that inhabits the tie when posessed. +/mob/living/basic/tie + name = "horrific necktie" + gender = NEUTER + mob_biotypes = MOB_SPIRIT + faction = list() + unsuitable_cold_damage = 0 + unsuitable_heat_damage = 0 + unsuitable_atmos_damage = 0 + +/mob/living/basic/tie/Initialize(mapload) + . = ..() + GRANT_ACTION(/datum/action/innate/change_name) + +/mob/living/basic/tie/Login() + . = ..() + to_chat(src, span_notice("You are the horrific necktie of the person who summoned you, \ + the only person who is able to hear you. Like a voice in their head, you are their reasoning, \ + their second-in-command. Take good care of them.")) + +/mob/living/basic/tie/Logout() + . = ..() + qdel(src) diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 62655f3153c6..1a4116b95791 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -54,12 +54,14 @@ /datum/outfit/centcom/ert/commander/alert name = "ERT Commander - High Alert" + l_hand = /obj/item/gun/energy/disabler/smg backpack_contents = list( /obj/item/gun/energy/pulse/pistol/loyalpin = 1, /obj/item/melee/baton/security/loaded = 1, ) glasses = /obj/item/clothing/glasses/thermal/eyepatch l_pocket = /obj/item/melee/energy/sword/saber + suit_store = /obj/item/gun/energy/laser/assault /datum/outfit/centcom/ert/security name = "ERT Security" @@ -186,7 +188,7 @@ name = "Inquisition Commander" back = /obj/item/mod/control/pre_equipped/responsory/inquisitory/commander - r_hand = /obj/item/nullrod/vibro/talking/chainsword + r_hand = /obj/item/nullrod/claymore/talking/chainsword backpack_contents = null /datum/outfit/centcom/ert/security/inquisitor diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 2730af4c6365..9dcb90b0e3d1 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -35,7 +35,7 @@ uniform = /obj/item/clothing/under/color/grey shoes = /obj/item/clothing/shoes/sneakers/black suit = /obj/item/clothing/suit/space - back = /obj/item/tank/jetpack/oxygen + back = /obj/item/tank/jetpack head = /obj/item/clothing/head/helmet/space mask = /obj/item/clothing/mask/breath @@ -117,10 +117,10 @@ name = "Heretic Hallucination" uniform = /obj/item/clothing/under/color/grey - suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch + suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch/rust neck = /obj/item/clothing/neck/heretic_focus r_hand = /obj/item/melee/touch_attack/mansus_fist - head = /obj/item/clothing/head/hooded/cult_hoodie/eldritch + head = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/rust shoes = /obj/item/clothing/shoes/sneakers/black /datum/outfit/rev_cutout @@ -427,7 +427,7 @@ /obj/item/debug/human_spawner = 1, /obj/item/debug/omnitool = 1, ) - belt = /obj/item/storage/belt/utility/chief/full + belt = /obj/item/storage/belt/utility/full/powertools ears = /obj/item/radio/headset/headset_cent/commander glasses = /obj/item/clothing/glasses/debug gloves = /obj/item/clothing/gloves/combat @@ -459,7 +459,7 @@ /obj/item/debug/omnitool = 1, /obj/item/storage/box/stabilized = 1, ) - belt = /obj/item/storage/belt/utility/chief/full + belt = /obj/item/storage/belt/utility/full/powertools ears = /obj/item/radio/headset/headset_cent/commander glasses = /obj/item/clothing/glasses/debug gloves = /obj/item/clothing/gloves/combat diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index 909f835b1c92..2dd1efe85a5d 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -14,13 +14,13 @@ /// Typepath of created banana var/banana_type = /obj/item/grown/bananapeel/specialpeel /// Material container for bananium - var/datum/component/material_container/bananium + var/datum/material_container/bananium /obj/item/clothing/shoes/clown_shoes/banana_shoes/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) - bananium = AddComponent( - /datum/component/material_container, \ + bananium = new ( + src, \ list(/datum/material/bananium), \ 100 * SHEET_MATERIAL_AMOUNT, \ MATCONTAINER_EXAMINE | MATCONTAINER_ANY_INTENT | MATCONTAINER_SILENT, \ @@ -32,7 +32,7 @@ LAZYOR(clothing_traits, TRAIT_NO_SLIP_WATER) /obj/item/clothing/shoes/clown_shoes/banana_shoes/Destroy() - bananium = null + QDEL_NULL(bananium) return ..() /obj/item/clothing/shoes/clown_shoes/banana_shoes/proc/toggle_clowning_action() diff --git a/code/modules/clothing/shoes/boots.dm b/code/modules/clothing/shoes/boots.dm index e221a857fd00..19ecbb55e94e 100644 --- a/code/modules/clothing/shoes/boots.dm +++ b/code/modules/clothing/shoes/boots.dm @@ -178,7 +178,7 @@ icon_state = "lizardskin_shoes" inhand_icon_state = null -/obj/item/clothing/shoes/kim +/obj/item/clothing/shoes/jackboots/kim name = "aerostatic boots" desc = "A crisp, clean set of boots for working long hours on the beat." icon_state = "aerostatic_boots" diff --git a/code/modules/clothing/shoes/clown.dm b/code/modules/clothing/shoes/clown.dm index 22b13cd1018a..04c35a90941f 100644 --- a/code/modules/clothing/shoes/clown.dm +++ b/code/modules/clothing/shoes/clown.dm @@ -62,3 +62,75 @@ desc = "No moths were harmed in the making of these slippers." icon_state = "moffers" squeak_sound = list('sound/effects/footstep/moffstep01.ogg'=1) //like sweet music to my ears + + +//COMBAT CLOWN SHOES +//Clown shoes with combat stats and noslip. Of course they still squeak. +/obj/item/clothing/shoes/clown_shoes/combat + name = "combat clown shoes" + desc = "Advanced Clown Shoes that protect the wearer and render them nearly immune to slipping on their own peels. They also squeak at 100% capacity." + clothing_traits = list(TRAIT_NO_SLIP_WATER) + slowdown = SHOES_SLOWDOWN + body_parts_covered = FEET|LEGS + armor_type = /datum/armor/clown_shoes_combat + strip_delay = 7 SECONDS + resistance_flags = NONE + +/datum/armor/clown_shoes_combat + melee = 25 + bullet = 25 + laser = 25 + energy = 25 + bomb = 50 + bio = 90 + fire = 70 + acid = 50 + +/obj/item/clothing/shoes/clown_shoes/combat/Initialize(mapload) + . = ..() + + create_storage(storage_type = /datum/storage/pockets/shoes) + +/// Recharging rate in PPS (peels per second) +#define BANANA_SHOES_RECHARGE_RATE 17 +#define BANANA_SHOES_MAX_CHARGE 3000 + +//The super annoying version +/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat + name = "mk-honk combat shoes" + desc = "The culmination of years of clown combat research, these shoes leave a trail of chaos in their wake. They will slowly recharge themselves over time, or can be manually charged with bananium." + slowdown = SHOES_SLOWDOWN + armor_type = /datum/armor/banana_shoes_combat + strip_delay = 7 SECONDS + resistance_flags = NONE + always_noslip = TRUE + body_parts_covered = FEET|LEGS + +/datum/armor/banana_shoes_combat + melee = 25 + bullet = 25 + laser = 25 + energy = 25 + bomb = 50 + bio = 50 + fire = 90 + acid = 50 + +/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/Initialize(mapload) + . = ..() + + create_storage(storage_type = /datum/storage/pockets/shoes) + 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/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) + +/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/attack_self(mob/user) + ui_action_click(user) + +#undef BANANA_SHOES_RECHARGE_RATE +#undef BANANA_SHOES_MAX_CHARGE diff --git a/code/modules/clothing/shoes/costume.dm b/code/modules/clothing/shoes/costume.dm index 58b8e07f6a2e..bc361e3685b0 100644 --- a/code/modules/clothing/shoes/costume.dm +++ b/code/modules/clothing/shoes/costume.dm @@ -7,6 +7,7 @@ equip_delay_other = 10 SECONDS armor_type = /datum/armor/shoes_roman fastening_type = SHOES_STRAPS + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT) /obj/item/clothing/shoes/griffin name = "griffon boots" @@ -41,6 +42,7 @@ icon = 'icons/obj/clothing/shoes.dmi' icon_state = "clockwork_treads" fastening_type = SHOES_SLIPON + custom_materials = list(/datum/material/bronze = SHEET_MATERIAL_AMOUNT) /obj/item/clothing/shoes/bronze/Initialize(mapload) . = ..() @@ -66,6 +68,7 @@ desc = "They got me for my foams!" icon_state = "SwagShoes" inhand_icon_state = null + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR /obj/item/clothing/shoes/glow name = "glow shoes" diff --git a/code/modules/clothing/shoes/laceup.dm b/code/modules/clothing/shoes/laceup.dm index 0ef4f4555bc4..706071de102d 100644 --- a/code/modules/clothing/shoes/laceup.dm +++ b/code/modules/clothing/shoes/laceup.dm @@ -3,6 +3,7 @@ desc = "The height of fashion, and they're pre-polished!" icon_state = "laceups" equip_delay_other = 5 SECONDS + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR /obj/item/clothing/shoes/laceup/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/shoes/sandals.dm b/code/modules/clothing/shoes/sandals.dm index a529839b91a5..e1f8b445a102 100644 --- a/code/modules/clothing/shoes/sandals.dm +++ b/code/modules/clothing/shoes/sandals.dm @@ -3,19 +3,19 @@ name = "sandals" icon_state = "wizard" inhand_icon_state = "wizshoe" - custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 0.5) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT) resistance_flags = FLAMMABLE strip_delay = 0.5 SECONDS equip_delay_other = 5 SECONDS armor_type = /datum/armor/shoes_sandal fastening_type = SHOES_SLIPON species_exception = list(/datum/species/golem) - lace_time = 3 SECONDS + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR /obj/item/clothing/shoes/sandal/alt - desc = "A pair of shiny black wooden sandals." name = "black sandals" + desc = "A pair of shiny black wooden sandals." icon_state = "blacksandals" inhand_icon_state = "blacksandals" diff --git a/code/modules/clothing/shoes/sneakers.dm b/code/modules/clothing/shoes/sneakers.dm index 5a1826d55e70..f073336f429c 100644 --- a/code/modules/clothing/shoes/sneakers.dm +++ b/code/modules/clothing/shoes/sneakers.dm @@ -166,12 +166,10 @@ return ..() attacking_item.forceMove(src) -/obj/item/clothing/shoes/sneakers/orange/allow_attack_hand_drop(mob/user) - if(ishuman(user)) - var/mob/living/carbon/human/C = user - if(C.shoes == src && attached_cuffs) - to_chat(user, span_warning("You need help taking these off!")) - return FALSE +/obj/item/clothing/shoes/sneakers/orange/can_mob_unequip(mob/user) + if(user.get_item_by_slot(slot_flags) == src && attached_cuffs) + to_chat(user, span_warning("You need help taking these off!")) + return FALSE return ..() /obj/item/clothing/shoes/sneakers/orange/mouse_drop_dragged(atom/over_object, mob/user) diff --git a/code/modules/clothing/shoes/wheelys.dm b/code/modules/clothing/shoes/wheelys.dm index 63c72ad71ff7..6d9c31caff49 100644 --- a/code/modules/clothing/shoes/wheelys.dm +++ b/code/modules/clothing/shoes/wheelys.dm @@ -15,6 +15,7 @@ worn_y_dimension = 64 clothing_flags = parent_type::clothing_flags | LARGE_WORN_ICON actions_types = list(/datum/action/item_action/wheelys) + custom_price = 30 // DARKPACK EDIT ADD - ECONOMY ///False means wheels are not popped out var/wheelToggle = FALSE ///The vehicle associated with the shoes @@ -73,7 +74,7 @@ slowdown = SHOES_SLOWDOWN+1 wheels = /obj/vehicle/ridden/scooter/skateboard/wheelys/rollerskates custom_premium_price = PAYCHECK_CREW * 5 - custom_price = PAYCHECK_CREW * 5 + custom_price = 30 // DARKPACK EDIT CHANGE - ECONOMY /obj/item/clothing/shoes/wheelys/skishoes name = "ski shoes" diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 66e98ba27a96..a68b57456e08 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -64,7 +64,7 @@ allowed = list( /obj/item/flashlight, /obj/item/tank/internals, - /obj/item/tank/jetpack/oxygen/captain, + /obj/item/tank/jetpack/captain, ) slowdown = 1 armor_type = /datum/armor/suit_space diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 0a6affdafd11..97eb723c77e9 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -59,11 +59,11 @@ if (!istype(tool, /obj/item/extinguisher_refill)) return - if (extinguishes_left == 5) + if (extinguishes_left == initial(extinguishes_left)) to_chat(user, span_notice("The inbuilt extinguisher is full.")) return ITEM_INTERACT_BLOCKING - extinguishes_left = 5 + extinguishes_left = initial(extinguishes_left) to_chat(user, span_notice("You refill the suit's built-in extinguisher, using up the cartridge.")) check_fire_state() qdel(tool) @@ -123,8 +123,8 @@ return CONTEXTUAL_SCREENTIP_SET /obj/item/clothing/head/helmet/space/plasmaman/click_alt(mob/user) - if(user.can_perform_action(src)) - adjust_visor(user) + adjust_visor(user) + return CLICK_ACTION_SUCCESS /obj/item/clothing/head/helmet/space/plasmaman/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/toggle_welding_screen)) diff --git a/code/modules/clothing/suits/_lasertag_components.dm b/code/modules/clothing/suits/_lasertag_components.dm new file mode 100644 index 000000000000..d4ad0bbfb550 --- /dev/null +++ b/code/modules/clothing/suits/_lasertag_components.dm @@ -0,0 +1,34 @@ +///lasertag team tracking component +/datum/component/lasertag + dupe_mode = COMPONENT_DUPE_SOURCES + ///What team the mob that this component is attached to is part of. + var/team_color = LASERTAG_TEAM_NEUTRAL + +/datum/component/lasertag/Initialize(team_color) + if (!ishuman(parent)) + return COMPONENT_INCOMPATIBLE + register_lasertag_signals() + src.team_color = team_color + +///For the sake of organization, put any new signals in here. +/datum/component/lasertag/proc/register_lasertag_signals() + RegisterSignal(parent, COMSIG_LIVING_FIRING_PIN_CHECK, PROC_REF(team_color_match)) + RegisterSignal(parent, COMSIG_ATOM_BULLET_ACT, PROC_REF(on_laser_hit)) + + +/datum/component/lasertag/proc/team_color_match(datum/source, firing_pin) + SIGNAL_HANDLER + var/obj/item/firing_pin/tag/pin = firing_pin + if (pin.tagcolor == team_color) + return ALLOW_FIRE + return BLOCK_FIRE + +/datum/component/lasertag/proc/on_laser_hit(datum/source, projectile) + SIGNAL_HANDLER + if(!istype(projectile, /obj/projectile/beam/lasertag)) + return + var/obj/projectile/beam/lasertag/laser = projectile + if (laser.lasertag_team != team_color) + var/mob/living/carbon/human/laser_target = parent + laser_target.adjust_stamina_loss(laser.lasertag_damage) + diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index 74bb02622fcb..b25cd2d0dc0d 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -8,7 +8,7 @@ allowed = list( /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, - /obj/item/tank/jetpack/oxygen/captain, + /obj/item/tank/jetpack/captain, /obj/item/storage/belt/holster, ) armor_type = /datum/armor/none diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index 925b5aad88f9..5f793aa272a3 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -13,7 +13,7 @@ /obj/item/clothing/neck/cloak/Initialize(mapload) . = ..() - AddComponent(/datum/component/surgery_initiator) + AddElement(/datum/element/surgery_aid, "cloak") /obj/item/clothing/neck/cloak/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is strangling [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -86,4 +86,3 @@ 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 - diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm index 656cdd287bdf..42ddf3fa2859 100644 --- a/code/modules/clothing/suits/costume.dm +++ b/code/modules/clothing/suits/costume.dm @@ -47,6 +47,10 @@ equip_delay_other = 2 SECONDS species_exception = null +/obj/item/clothing/suit/costume/pirate/armored/Initialize(mapload) + . = ..() + allowed += GLOB.security_vest_allowed + /obj/item/clothing/suit/costume/pirate/captain name = "pirate captain coat" desc = "Yarr." @@ -176,6 +180,7 @@ body_parts_covered = CHEST|GROIN|LEGS flags_inv = HIDEJUMPSUIT dog_fashion = /datum/dog_fashion/back + custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT * 3) var/in_use = FALSE /obj/item/clothing/suit/costume/cardborg/equipped(mob/living/user, slot) @@ -269,6 +274,7 @@ body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET cold_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT //Space carp like space, so you should too + clothing_flags = CARP_STYLE_FACTOR allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/gun/ballistic/rifle/boltaction/harpoon) hoodtype = /obj/item/clothing/head/hooded/carp_hood @@ -286,6 +292,7 @@ cold_protection = HEAD min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT flags_inv = HIDEHAIR|HIDEEARS + clothing_flags = CARP_STYLE_FACTOR /obj/item/clothing/head/hooded/carp_hood/Initialize(mapload) . = ..() @@ -313,7 +320,7 @@ min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT - clothing_flags = STOPSPRESSUREDAMAGE|THICKMATERIAL + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | CARP_STYLE_FACTOR body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS hoodtype = /obj/item/clothing/head/hooded/carp_hood/spaceproof resistance_flags = NONE @@ -333,7 +340,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|STACKABLE_HELMET_EXEMPT + clothing_flags = STOPSPRESSUREDAMAGE|THICKMATERIAL|SNUG_FIT|STACKABLE_HELMET_EXEMPT|CARP_STYLE_FACTOR body_parts_covered = HEAD resistance_flags = NONE flash_protect = FLASH_PROTECTION_WELDER @@ -560,12 +567,13 @@ allowed = list( /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, - /obj/item/tank/jetpack/oxygen/captain, + /obj/item/tank/jetpack/captain, /obj/item/storage/belt/holster, //new /obj/item/toy/clockwork_watch, ) armor_type = /datum/armor/costume_bronze + custom_materials = list(/datum/material/bronze = SHEET_MATERIAL_AMOUNT) /obj/item/clothing/suit/hooded/mysticrobe name = "mystic's robe" diff --git a/code/modules/clothing/suits/jacket.dm b/code/modules/clothing/suits/jacket.dm index 820aeba2e14e..4ff568045854 100644 --- a/code/modules/clothing/suits/jacket.dm +++ b/code/modules/clothing/suits/jacket.dm @@ -28,7 +28,7 @@ /obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, - /obj/item/tank/jetpack/oxygen/captain, + /obj/item/tank/jetpack/captain, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, @@ -66,6 +66,7 @@ flags_1 = IS_PLAYER_COLORABLE_1 blood_overlay_type = "coat" flags_inv = HIDEBELT + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR // I know kung-fu /obj/item/clothing/suit/toggle/jacket/trenchcoat/Initialize(mapload) . = ..() @@ -81,6 +82,7 @@ greyscale_config_worn = /datum/greyscale_config/blazer/worn greyscale_colors = "#414344" flags_1 = IS_PLAYER_COLORABLE_1 + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR /obj/item/clothing/suit/jacket/oversized name = "oversized jacket" diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index c7fd3ea0a3c7..2a1b30d00178 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -49,6 +49,7 @@ post_init_icon_state = "overalls" inhand_icon_state = "" body_parts_covered = CHEST|GROIN|LEGS + gender = PLURAL species_exception = list(/datum/species/golem) greyscale_config = /datum/greyscale_config/overalls greyscale_config_worn = /datum/greyscale_config/overalls/worn @@ -214,6 +215,7 @@ blood_overlay_type = "coat" body_parts_covered = CHEST|ARMS species_exception = list(/datum/species/golem) + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR /obj/item/clothing/suit/toggle/lawyer/purple name = "purple formal suit jacket" @@ -343,19 +345,20 @@ allowed = list( /obj/item/bonesetter, /obj/item/cautery, + /obj/item/defibrillator/compact, /obj/item/flashlight/pen, /obj/item/healthanalyzer, /obj/item/hemostat, - /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/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, /obj/item/retractor, /obj/item/scalpel, - /obj/item/surgical_drapes, /obj/item/storage/pill_bottle, + /obj/item/surgical_drapes, /obj/item/tank/internals/emergency_oxygen, ) diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 3b2d6a0882f1..f7f15d69a226 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -10,25 +10,26 @@ allowed = list( /obj/item/analyzer, /obj/item/biopsy_tool, + /obj/item/defibrillator/compact, /obj/item/dnainjector, /obj/item/flashlight/pen, + /obj/item/gun/syringe, /obj/item/healthanalyzer, /obj/item/paper, - /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/applicator, /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/applicator, /obj/item/reagent_containers/syringe, - /obj/item/gun/syringe, /obj/item/sensor_device, /obj/item/soap, /obj/item/stack/medical, /obj/item/storage/pill_bottle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, - ) + ) armor_type = /datum/armor/toggle_labcoat species_exception = list(/datum/species/golem) @@ -62,6 +63,7 @@ /obj/item/clothing/suit/toggle/labcoat/paramedic/Initialize(mapload) . = ..() AddComponent(/datum/component/adjust_fishing_difficulty, -3) //FISH DOCTOR?! + allowed += /obj/item/crowbar/power/paramedic /obj/item/clothing/suit/toggle/labcoat/mad name = "\proper The Mad's labcoat" diff --git a/code/modules/clothing/suits/lasertag.dm b/code/modules/clothing/suits/lasertag.dm index 5bea86ea3127..93badb50faee 100644 --- a/code/modules/clothing/suits/lasertag.dm +++ b/code/modules/clothing/suits/lasertag.dm @@ -9,6 +9,18 @@ body_parts_covered = CHEST allowed = list (/obj/item/gun/energy/laser/bluetag) resistance_flags = NONE + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + +/obj/item/clothing/suit/bluetag/equipped(mob/equipper, slot) + . = ..() + if (slot != ITEM_SLOT_OCLOTHING) + return + equipper.AddComponentFrom(REF(src), /datum/component/lasertag, LASERTAG_TEAM_BLUE) + + +/obj/item/clothing/suit/bluetag/dropped(mob/living/user) + . = ..() + user.RemoveComponentSource(REF(src), /datum/component/lasertag) /obj/item/clothing/suit/redtag name = "red laser tag armor" @@ -21,3 +33,16 @@ body_parts_covered = CHEST allowed = list (/obj/item/gun/energy/laser/redtag) resistance_flags = NONE + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + + +/obj/item/clothing/suit/redtag/equipped(mob/equipper, slot) + . = ..() + if (slot != ITEM_SLOT_OCLOTHING) + return + equipper.AddComponentFrom(REF(src), /datum/component/lasertag, LASERTAG_TEAM_RED) + + +/obj/item/clothing/suit/redtag/dropped(mob/living/user) + . = ..() + user.RemoveComponentSource(REF(src), /datum/component/lasertag) diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index 813f296506f2..d6d28df30d5b 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -15,7 +15,8 @@ /obj/effect/anomaly/hallucination = /obj/item/clothing/suit/armor/reactive/hallucinating, /obj/effect/anomaly/dimensional = /obj/item/clothing/suit/armor/reactive/barricade, /obj/effect/anomaly/ectoplasm = /obj/item/clothing/suit/armor/reactive/ectoplasm, - ) + /obj/effect/anomaly/weather = /obj/item/clothing/suit/armor/reactive/weather, + ) if(istype(tool, /obj/item/assembly/signaler/anomaly)) var/obj/item/assembly/signaler/anomaly/anomaly = tool @@ -192,10 +193,16 @@ ..() /obj/item/clothing/suit/armor/reactive/stealth/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - var/mob/living/simple_animal/hostile/illusion/escape/decoy = new(owner.loc) - decoy.Copy_Parent(owner, 50) - decoy.GiveTarget(owner) //so it starts running right away - decoy.Goto(owner, decoy.move_to_delay, decoy.minimum_distance) + var/mob/living/basic/illusion/escape/decoy = new(owner.loc) + decoy.full_setup( + owner, + target_mob = owner, + faction = owner.faction, + life = 5 SECONDS, + hp = owner.health / 4, + damage = 5, + replicate = 0, + ) owner.alpha = 0 in_stealth = TRUE owner.visible_message(span_danger("[owner] is hit by [attack_text] in the chest!")) //We pretend to be hit, since blocking it would stop the message otherwise @@ -490,3 +497,76 @@ /obj/item/clothing/suit/armor/reactive/ectoplasm/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) owner.reagents?.add_reagent(/datum/reagent/inverse/helgrasp, 20) + +/obj/item/clothing/suit/armor/reactive/weather + name = "reactive weather armor" + desc = "An experimental suit of armor that manipulates the weather around the wearer when in danger." + emp_message = span_warning("The reactive armor's weather control unit sputters and groans...") + cooldown_message = span_danger("The reactive weather system is still recharging! It fails to activate!") + reactivearmor_cooldown_duration = 30 SECONDS + +/obj/item/clothing/suit/armor/reactive/weather/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + owner.visible_message(span_danger("The reactive armor alters the weather around [owner], shielding [owner.p_them()] from [attack_text]!")) + playsound(src, 'sound/effects/magic/lightningshock.ogg', 33, TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) + + var/datum/effect_system/steam_spread/steam = new() + steam.set_up(10, FALSE, owner.loc) + steam.start() + + var/list/affected_turfs = list() + for(var/mob/living/attacker in oview(2, owner)) + attacker.adjust_wet_stacks(5) + attacker.extinguish_mob() + if((attacker.loc in affected_turfs) || !isopenturf(attacker.loc)) + continue + + for(var/turf/open/to_affect in view(1, attacker.loc)) + affected_turfs += to_affect + + shock_turf_windup(attacker.loc) + + reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration + return TRUE + +/obj/item/clothing/suit/armor/reactive/weather/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text, final_block_chance, damage, attack_type) + owner.visible_message(span_danger("The reactive armor malfunctions, calling down a storm upon [owner.p_them()]!")) + playsound(src, 'sound/effects/magic/lightningshock.ogg', 33, TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) + + var/datum/effect_system/steam_spread/steam = new() + steam.set_up(2, FALSE, owner.loc) + steam.start() + + owner.adjust_wet_stacks(10) + owner.extinguish_mob() + if(!isopenturf(owner.loc)) + return + shock_turf_windup(owner.loc) + +/obj/item/clothing/suit/armor/reactive/weather/proc/shock_turf_windup(turf/target) + new /obj/effect/temp_visual/telegraphing/thunderbolt(target) + addtimer(CALLBACK(src, PROC_REF(shock_turf), target), 1 SECONDS) + +/obj/item/clothing/suit/armor/reactive/weather/proc/shock_turf(turf/target) + playsound(target, 'sound/effects/magic/lightningbolt.ogg', 66, TRUE) + new /obj/effect/temp_visual/thunderbolt(target) + for(var/turf/open/adjacent_turf in oview(1, target)) + new /obj/effect/temp_visual/electricity(adjacent_turf) + + for(var/mob/living/hit_mob in target) + if(hit_mob == loc) // avoid hitting the wearer + continue + to_chat(hit_mob, span_userdanger("You've been struck by lightning!")) + hit_mob.electrocute_act(30, src, flags = SHOCK_TESLA|SHOCK_NOSTUN) + hit_mob.Knockdown(2.5 SECONDS, 10 SECONDS) + + for(var/mob/living/nearby_target in oview(1, target)) + if(nearby_target == loc) // avoid hitting the wearer + continue + to_chat(nearby_target, span_userdanger("You've been struck by an arc of lightning!")) + nearby_target.electrocute_act(10, src, flags = SHOCK_TESLA|SHOCK_NOSTUN) + + for(var/obj/hit_thing in target) + hit_thing.take_damage(20, BURN, ENERGY, FALSE) + + for(var/obj/nearby_thing in oview(1, target)) + nearby_thing.take_damage(5, BURN, ENERGY, FALSE) diff --git a/code/modules/clothing/suits/wetfloor.dm b/code/modules/clothing/suits/wetfloor.dm index 09368cbed41f..9a623d88f8ba 100644 --- a/code/modules/clothing/suits/wetfloor.dm +++ b/code/modules/clothing/suits/wetfloor.dm @@ -23,6 +23,7 @@ /obj/item/tank/internals/plasmaman, /obj/item/gun/ballistic/rifle/boltaction/pipegun, ) + custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 2) /datum/armor/suit_caution melee = 5 diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm index be7bc64420cf..751597c54e0c 100644 --- a/code/modules/clothing/suits/wintercoats.dm +++ b/code/modules/clothing/suits/wintercoats.dm @@ -298,15 +298,16 @@ icon_state = "coatmedical" inhand_icon_state = "coatmedical" allowed = list( + /obj/item/defibrillator/compact, /obj/item/flashlight/pen, /obj/item/gun/syringe, /obj/item/healthanalyzer, - /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/applicator, /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/applicator, /obj/item/reagent_containers/syringe, /obj/item/sensor_device, /obj/item/storage/pill_bottle, @@ -416,6 +417,11 @@ inhand_icon_state = null hoodtype = /obj/item/clothing/head/hooded/winterhood/medical/paramedic +/obj/item/clothing/suit/hooded/wintercoat/medical/paramedic/Initialize(mapload) + . = ..() + AddComponent(/datum/component/adjust_fishing_difficulty, -3) //mirrored from jacket + allowed += /obj/item/crowbar/power/paramedic + /obj/item/clothing/head/hooded/winterhood/medical/paramedic desc = "A white winter coat hood with blue markings." icon_state = "hood_paramed" @@ -445,7 +451,7 @@ species_exception = list(/datum/species/golem) /datum/armor/wintercoat_science - bomb = 10 + bio = 10 fire = 20 /obj/item/clothing/head/hooded/winterhood/science @@ -455,7 +461,7 @@ // Research Director /datum/armor/winterhood_science - bomb = 10 + bio = 10 fire = 20 /obj/item/clothing/suit/hooded/wintercoat/science/rd diff --git a/code/modules/clothing/under/_suit_sensor.dm b/code/modules/clothing/under/_suit_sensor.dm new file mode 100644 index 000000000000..2951a3ad2d4f --- /dev/null +++ b/code/modules/clothing/under/_suit_sensor.dm @@ -0,0 +1,84 @@ +///The item representing suit sensors when removed from a suit or dress (obj/item/clothing/under) +/obj/item/suit_sensor + name = "suit sensor" + desc = "That thingamabob medbay keeps telling you to set to 'Tracking Beacon'. It needs to be attached to a worn suit or dress to work." + icon = 'icons/obj/devices/tracker.dmi' + icon_state = "suit_sensor" + base_icon_state = "suit_sensor" + obj_flags = CONDUCTS_ELECTRICITY + w_class = WEIGHT_CLASS_TINY + custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT, /datum/material/glass= SMALL_MATERIAL_AMOUNT) + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + throwforce = 2 + throw_speed = 3 + throw_range = 7 + ///The current sensor mode, inherited from the clothing it's cut from. Can also be changed when using it in hand. + var/sensor_mode = SENSOR_OFF + ///Suit sensors are busted when struck by a heavy electromagnetic pulse. + var/broken = FALSE + +/obj/item/suit_sensor/examine(mob/user) + . = ..() + if(broken) + . += span_warning("It's currently broken. You can use a piece of [EXAMINE_HINT("cable")] to fix it.") + else + . += span_notice("It's currently set on '[GLOB.suit_sensor_mode_to_defines.Find(sensor_mode + 1)]'.") + +/obj/item/suit_sensor/update_overlays() + . = ..() + if(broken) + return + switch(sensor_mode) + if(SENSOR_LIVING) + . += "suit_sensor_binary" + if(SENSOR_VITALS) + . += "suit_sensor_vitals" + if(SENSOR_COORDS) + . += "suit_sensor_tracking" + +/obj/item/suit_sensor/proc/set_mode(new_mode) + if(sensor_mode == new_mode) + return FALSE + sensor_mode = new_mode + update_appearance(UPDATE_OVERLAYS) + return TRUE + +/obj/item/suit_sensor/attack_self(mob/living/user) + . = ..() + if(!(user.mobility_flags & MOBILITY_USE) || !IsReachableBy(user)) + return FALSE + if(broken) + balloon_alert(user, "fix it first!") + return + var/current_mode_text = GLOB.suit_sensor_mode_to_defines[sensor_mode + 1] + var/new_mode = tgui_input_list(user, "Select a sensor mode", "Suit Sensors", GLOB.suit_sensor_mode_to_defines, current_mode_text) + if(isnull(new_mode) || broken|| !(user.mobility_flags & MOBILITY_USE) || !IsReachableBy(user)) + user.balloon_alert(user, "can't do that now!") + return + set_mode(GLOB.suit_sensor_mode_to_defines[new_mode]) + balloon_alert(user, "sensor set to '[LOWER_TEXT(new_mode)]'") + +/obj/item/suit_sensor/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF || broken) + return + + if(severity <= EMP_HEAVY) + broken = TRUE + else + set_mode(pick(SENSOR_OFF, SENSOR_OFF, SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS)) + playsound(source = src, soundin = 'sound/effects/sparks/sparks3.ogg', vol = 75, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE) + +/obj/item/suit_sensor/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/stack/cable_coil)) + return ..() + if(!broken) + balloon_alert(user, "not broken!") + return ITEM_INTERACT_BLOCKING + var/obj/item/stack/cable_coil/cabling = tool + cabling.use(1) + balloon_alert(user, "suit sensor repaired") + broken = FALSE + update_appearance(UPDATE_OVERLAYS) + return ITEM_INTERACT_SUCCESS diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 552e69dcffa5..7ffb620720b8 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -7,14 +7,13 @@ abstract_type = /obj/item/clothing/under body_parts_covered = CHEST|GROIN|LEGS|ARMS slot_flags = ITEM_SLOT_ICLOTHING - interaction_flags_click = NEED_DEXTERITY + interaction_flags_click = NEED_DEXTERITY|ALLOW_RESTING armor_type = /datum/armor/clothing_under supports_variations_flags = CLOTHING_DIGITIGRADE_MASK equip_sound = 'sound/items/equip/jumpsuit_equip.ogg' drop_sound = 'sound/items/handling/cloth/cloth_drop1.ogg' pickup_sound = 'sound/items/handling/cloth/cloth_pickup1.ogg' limb_integrity = 30 - interaction_flags_click = ALLOW_RESTING /// Has this undersuit been freshly laundered and, as such, imparts a mood bonus for wearing var/freshly_laundered = FALSE @@ -35,7 +34,7 @@ /// 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/sensor_mode = SENSOR_OFF // Accessory handling (Can be componentized eventually) /// The max number of accessories we can have on this suit. @@ -54,23 +53,32 @@ . = ..() if(random_sensor) //make the sensor mode favor higher levels, except coords. - sensor_mode = pick(SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_LIVING, SENSOR_LIVING, SENSOR_COORDS, SENSOR_COORDS, SENSOR_OFF) + set_sensor_mode(pick(SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_LIVING, SENSOR_LIVING, SENSOR_COORDS, SENSOR_COORDS, SENSOR_OFF)) + //ensure we add or remove relevant clothing traits based on base sensor status and mode + update_wearer_status() + register_context() AddElement(/datum/element/update_icon_updates_onmob, flags = ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING|ITEM_SLOT_NECK, body = TRUE) -/obj/item/clothing/under/setup_reskinning() - if(!check_setup_reskinning()) +/obj/item/clothing/under/on_craft_completion(list/components, datum/crafting_recipe/current_recipe, atom/crafter) + . = ..() + var/obj/item/clothing/under/any_original = locate() in components + if(!any_original) + set_has_sensor(NO_SENSORS) return + set_has_sensor(any_original.has_sensor) + set_sensor_mode(any_original.sensor_mode) - // We already register context in Initialize. - RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) +/obj/item/clothing/under/used_in_craft(atom/result, datum/crafting_recipe/current_recipe) + . = ..() + dump_attachments() /obj/item/clothing/under/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) . = ..() var/changed = FALSE - if((isnull(held_item) || held_item == src) && has_sensor == HAS_SENSORS) + if(has_sensor == HAS_SENSORS && (isnull(held_item) || held_item == src)) context[SCREENTIP_CONTEXT_RMB] = "Toggle suit sensors" context[SCREENTIP_CONTEXT_CTRL_LMB] = "Set suit sensors to tracking" changed = TRUE @@ -83,10 +91,18 @@ context[SCREENTIP_CONTEXT_ALT_RMB] = "Remove accessory" changed = TRUE - if(istype(held_item, /obj/item/stack/cable_coil) && has_sensor == BROKEN_SENSORS) + if(has_sensor == BROKEN_SENSORS && istype(held_item, /obj/item/stack/cable_coil)) context[SCREENTIP_CONTEXT_LMB] = "Repair suit sensors" changed = TRUE + if(has_sensor == NO_SENSORS) + if(istype(held_item, /obj/item/suit_sensor)) + context[SCREENTIP_CONTEXT_LMB] = "Install suit sensors" + changed = TRUE + else if(held_item?.tool_behaviour == TOOL_WIRECUTTER) + context[SCREENTIP_CONTEXT_LMB] = "Cut suit sensors" + changed = TRUE + if(can_adjust && adjusted != DIGITIGRADE_STYLE) context[SCREENTIP_CONTEXT_ALT_LMB] = "Wear [adjusted == ALT_STYLE ? "normally" : "casually"]" changed = TRUE @@ -112,15 +128,55 @@ if (blood_overlay) . += blood_overlay -/obj/item/clothing/under/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) - if(repair_sensors(attacking_item, user)) - return TRUE - - if(istype(attacking_item, /obj/item/clothing/accessory)) - return attach_accessory(attacking_item, user) +/obj/item/clothing/under/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/stack/cable_coil)) + if(!repair_sensors(user)) + return ITEM_INTERACT_BLOCKING + var/obj/item/stack/cable_coil/cabling = tool + cabling.use(1) + cabling.visible_message(span_notice("[user] repairs the suit sensors on [src] with [cabling].")) + return ITEM_INTERACT_SUCCESS + + if(istype(tool, /obj/item/clothing/accessory)) + return attach_accessory(tool, user) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + + if(istype(tool, /obj/item/suit_sensor)) + if(has_sensor != NO_SENSORS) + balloon_alert(user, "already has sensors!") + return ITEM_INTERACT_BLOCKING + balloon_alert(user, "installing sensors...") + if(!do_after(user, 5 SECONDS, target = src)) + return ITEM_INTERACT_BLOCKING + var/obj/item/suit_sensor/sensor = tool + if(sensor.broken) + set_has_sensor(BROKEN_SENSORS) + else + set_has_sensor(HAS_SENSORS) + set_sensor_mode(sensor.sensor_mode) + qdel(tool) + balloon_alert(user, "sensors installed") + playsound(source = src, soundin = 'sound/effects/sparks/sparks4.ogg', vol = 50, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE) + return ITEM_INTERACT_SUCCESS return ..() +/obj/item/clothing/under/wirecutter_act(mob/living/user, obj/item/tool) + if(has_sensor == NO_SENSORS) + balloon_alert(user, "doesn't have sensors!") + return ITEM_INTERACT_BLOCKING + balloon_alert(user, "cutting out sensors...") + if(!do_after(user, 5 SECONDS, target = src)) + return ITEM_INTERACT_BLOCKING + var/obj/item/suit_sensor/sensor = new (drop_location()) + if(sensor.IsReachableBy(user)) + user.put_in_hands(sensor) + if(has_sensor == BROKEN_SENSORS) + sensor.broken = TRUE + else + sensor.set_mode(sensor_mode) + set_has_sensor(NO_SENSORS) + return ITEM_INTERACT_SUCCESS + /obj/item/clothing/under/attack_hand_secondary(mob/user, params) . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) @@ -142,7 +198,7 @@ if(damaged_state == CLOTHING_SHREDDED && has_sensor > NO_SENSORS) break_sensors() else if(damaged_state == CLOTHING_PRISTINE && has_sensor == BROKEN_SENSORS) - repair_sensors(cable_required = FALSE) + repair_sensors() update_appearance() /obj/item/clothing/under/visual_equipped(mob/user, slot) @@ -162,9 +218,16 @@ /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) + if(slot & ITEM_SLOT_ICLOTHING) + if(freshly_laundered) + freshly_laundered = FALSE + user.add_mood_event("fresh_laundry", /datum/mood_event/fresh_laundry) + update_wearer_status() + +/obj/item/clothing/under/dropped(mob/living/user) + . = ..() + if(user.get_item_by_slot(ITEM_SLOT_ICLOTHING) == src) + GLOB.suit_sensors_list -= user // Start suit sensor handling @@ -174,35 +237,21 @@ return visible_message(span_warning("[src]'s medical sensors short out!"), blind_message = span_warning("The [src] makes an electronic sizzling sound!"), vision_distance = COMBAT_MESSAGE_RANGE) - has_sensor = BROKEN_SENSORS + set_has_sensor(BROKEN_SENSORS) sensor_malfunction() - update_wearer_status() /** * Repair the suit sensors and update the mob's status on the global sensor list. * Can be called either through player action such as repairing with coil, or as part of a general fixing proc - * - * Arguments: - * * attacking_item - the item being used for the repair, if any - * * user - mob that's doing the repair - * * cable_required - set to FALSE to bypass consuming cable coil */ -/obj/item/clothing/under/proc/repair_sensors(obj/item/attacking_item, mob/user, cable_required = TRUE) +/obj/item/clothing/under/proc/repair_sensors(mob/user) if(has_sensor != BROKEN_SENSORS) - return - - if(cable_required) - if(!istype(attacking_item, /obj/item/stack/cable_coil)) - return - var/obj/item/stack/cable_coil/cabling = attacking_item - if(!cabling.use(1)) - return - cabling.visible_message(span_notice("[user] repairs the suit sensors on [src] with [cabling].")) + if(user) + balloon_alert(user, "sensors [has_sensor == NO_SENSORS ? "missing" : "not broken"]!") + return FALSE playsound(source = src, soundin = 'sound/effects/sparks/sparks4.ogg', vol = 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE) - has_sensor = HAS_SENSORS - update_wearer_status() - + set_has_sensor(HAS_SENSORS) return TRUE /// If the item is being worn, a gentle reminder every 3-5 minutes that the sensors are broken @@ -211,29 +260,46 @@ do_sparks(number = 2, cardinal_only = FALSE, source = src) addtimer(CALLBACK(src, PROC_REF(sensor_malfunction)), rand(BROKEN_SPARKS_MIN, BROKEN_SPARKS_MAX * 0.5), TIMER_UNIQUE | TIMER_NO_HASH_WAIT) -/// If the item is being worn, update the mob's status on the global sensor list +/// Changes whether the suit sensor has a sensor, or if it's broken, etc. and handles updating mob status if applicable +/obj/item/clothing/under/proc/set_has_sensor(new_has_sensor) + if(new_has_sensor == has_sensor) + return FALSE + if(new_has_sensor < BROKEN_SENSORS || new_has_sensor > LOCKED_SENSORS) + stack_trace("Invalid has_sensor value [new_has_sensor] passed to set_has_sensor()") + return FALSE + has_sensor = new_has_sensor + update_wearer_status() + return TRUE + +/// Changes the active sensor mode of the suit and handles updating mob status if applicable +/obj/item/clothing/under/proc/set_sensor_mode(new_sensor_mode) + if(new_sensor_mode == sensor_mode) + return FALSE + if(new_sensor_mode < SENSOR_OFF || new_sensor_mode > SENSOR_COORDS) + stack_trace("Invalid sensor_mode value [new_sensor_mode] passed to set_sensor_mode()") + return FALSE + sensor_mode = new_sensor_mode + update_wearer_status() + return TRUE + +/// Updates the sensor status and any mobs status if applicable /obj/item/clothing/under/proc/update_wearer_status() - if(!ishuman(loc)) + if(has_sensor <= NO_SENSORS || sensor_mode <= SENSOR_VITALS) + detach_clothing_traits(TRAIT_BASIC_HEALTH_HUD_VISIBLE) + else + attach_clothing_traits(TRAIT_BASIC_HEALTH_HUD_VISIBLE) + + if(!ishuman(loc) || isdummy(loc)) return - var/mob/living/carbon/human/ooman = loc - ooman.update_suit_sensors() - ooman.med_hud_set_status() + var/mob/living/carbon/human/wearer = loc -/mob/living/carbon/human/update_suit_sensors() - . = ..() - update_sensor_list() - -/// Adds or removes a mob from the global suit sensors list based on sensor status and mode -/mob/living/carbon/human/proc/update_sensor_list() - var/obj/item/clothing/under/uniform = w_uniform - if(istype(uniform) && uniform.has_sensor > NO_SENSORS && uniform.sensor_mode) - GLOB.suit_sensors_list |= src + if(has_sensor >= HAS_SENSORS && sensor_mode >= SENSOR_LIVING) + GLOB.suit_sensors_list |= wearer else - GLOB.suit_sensors_list -= src + GLOB.suit_sensors_list -= wearer -/mob/living/carbon/human/dummy/update_sensor_list() - return + wearer.med_hud_set_status() /obj/item/clothing/under/emp_act(severity) . = ..() @@ -244,13 +310,11 @@ if(severity <= EMP_HEAVY) break_sensors() + return - else - sensor_mode = pick(SENSOR_OFF, SENSOR_OFF, SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS) - playsound(source = src, soundin = 'sound/effects/sparks/sparks3.ogg', vol = 75, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE) - visible_message(span_warning("The [src]'s medical sensors flash and change rapidly!"), blind_message = span_warning("The [src] makes an electronic sizzling sound!"), vision_distance = COMBAT_MESSAGE_RANGE) - - update_wearer_status() + set_sensor_mode(pick(SENSOR_OFF, SENSOR_OFF, SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS)) + playsound(source = src, soundin = 'sound/effects/sparks/sparks3.ogg', vol = 75, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE) + visible_message(span_warning("The [src]'s medical sensors flash and change rapidly!"), blind_message = span_warning("The [src] makes an electronic sizzling sound!"), vision_distance = COMBAT_MESSAGE_RANGE) /** * Called by medical scanners a simple summary of the status @@ -328,10 +392,10 @@ /obj/item/clothing/under/proc/update_accessory_overlay() if(!length(attached_accessories)) accessory_overlay = null - return - accessory_overlay = mutable_appearance() - for(var/obj/item/clothing/accessory/accessory as anything in attached_accessories) - accessory_overlay.overlays += accessory.generate_accessory_overlay(src) + else + accessory_overlay = mutable_appearance() + for(var/obj/item/clothing/accessory/accessory as anything in attached_accessories) + accessory_overlay.overlays += accessory.generate_accessory_overlay(src) update_appearance() // so we update the suit inventory overlay too /obj/item/clothing/under/Exited(atom/movable/gone, direction) @@ -371,6 +435,9 @@ . += "Its vital tracker appears to be enabled." if(SENSOR_COORDS) . += "Its vital tracker and tracking beacon appear to be enabled." + else + . += span_tooltip("You can always get new suit sensors to install from a lathe.", "It isn't equipped with medical sensors.") + if(LAZYLEN(attached_accessories)) var/list/accessories = list_accessories_with_icon(user) . += "It has [english_list(accessories)] attached." @@ -392,14 +459,14 @@ 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)) + var/current_mode_text = GLOB.suit_sensor_mode_to_defines[sensor_mode + 1] + var/new_mode = tgui_input_list(user_mob, "Select a sensor mode", "Suit Sensors", GLOB.suit_sensor_mode_to_defines, current_mode_text) + if(isnull(new_mode)) return if(!can_toggle_sensors(user_mob)) return - sensor_mode = modes.Find(switchMode) - 1 + set_sensor_mode(GLOB.suit_sensor_mode_to_defines[new_mode]) if (loc == user_mob) switch(sensor_mode) if(SENSOR_OFF) @@ -411,15 +478,12 @@ if(SENSOR_COORDS) to_chat(user_mob, span_notice("Your suit will now report your exact vital lifesigns as well as your coordinate position.")) - update_wearer_status() - /obj/item/clothing/under/item_ctrl_click(mob/user) if(!can_toggle_sensors(user)) return CLICK_ACTION_BLOCKING - sensor_mode = SENSOR_COORDS + set_sensor_mode(SENSOR_COORDS) balloon_alert(user, "set to tracking") - update_wearer_status() return CLICK_ACTION_SUCCESS /// Checks if the toggler is allowed to toggle suit sensors currently @@ -438,7 +502,7 @@ balloon_alert(toggler, "sensors shorted!") return FALSE if(NO_SENSORS) - balloon_alert(toggler, "no sensors to ajdust!") + balloon_alert(toggler, "no sensors to adjust!") return FALSE return TRUE diff --git a/code/modules/clothing/under/accessories/_accessories.dm b/code/modules/clothing/under/accessories/_accessories.dm index 0e4e2f981907..993771e4888d 100644 --- a/code/modules/clothing/under/accessories/_accessories.dm +++ b/code/modules/clothing/under/accessories/_accessories.dm @@ -31,13 +31,6 @@ . = ..() register_context() -/obj/item/clothing/accessory/setup_reskinning() - if(!check_setup_reskinning()) - return - - // We already register context regardless in Initialize. - RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) - /** * Can we be attached to the passed clothing article? */ diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index 9d7d87a08468..9f871c710158 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -177,28 +177,51 @@ name = "Pre-Approved Cyborg Candidate dogtag" display = "This employee has been screened for negative mental traits to an acceptable level of accuracy, and is approved for the NT Cyborg program as an alternative to medical resuscitation." +// Pride pin skins +/datum/atom_skin/pride_pin + abstract_type = /datum/atom_skin/pride_pin + +/datum/atom_skin/pride_pin/gay + preview_name = "Rainbow Pride" + new_icon_state = "pride" + +/datum/atom_skin/pride_pin/bi + preview_name = "Bisexual Pride" + new_icon_state = "pride_bi" + +/datum/atom_skin/pride_pin/pan + preview_name = "Pansexual Pride" + new_icon_state = "pride_pan" + +/datum/atom_skin/pride_pin/ace + preview_name = "Asexual Pride" + new_icon_state = "pride_ace" + +/datum/atom_skin/pride_pin/enby + preview_name = "Non-binary Pride" + new_icon_state = "pride_enby" + +/datum/atom_skin/pride_pin/trans + preview_name = "Transgender Pride" + new_icon_state = "pride_trans" + +/datum/atom_skin/pride_pin/intersex + preview_name = "Intersex Pride" + new_icon_state = "pride_intersex" + +/datum/atom_skin/pride_pin/lesbian + preview_name = "Lesbian Pride" + new_icon_state = "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 - unique_reskin = 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/setup_reskinning() - if(!check_setup_reskinning()) - return + obj_flags = UNIQUE_RENAME - // We already register context regardless in Initialize. - RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) +/obj/item/clothing/accessory/pride/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/pride_pin, infinite = TRUE) /obj/item/clothing/accessory/deaf_pin name = "deaf personnel pin" diff --git a/code/modules/clothing/under/accessories/tribal.dm b/code/modules/clothing/under/accessories/tribal.dm index 552751bd8ead..c75b8940f8ae 100644 --- a/code/modules/clothing/under/accessories/tribal.dm +++ b/code/modules/clothing/under/accessories/tribal.dm @@ -5,6 +5,7 @@ icon_state = "talisman" attachment_slot = NONE resistance_flags = FIRE_PROOF | LAVA_PROOF + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 2) /obj/item/clothing/accessory/skullcodpiece name = "skull codpiece" @@ -12,6 +13,7 @@ icon_state = "skull" attachment_slot = GROIN resistance_flags = FIRE_PROOF | LAVA_PROOF + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 2) /obj/item/clothing/accessory/skilt name = "sinew skirt" @@ -20,3 +22,4 @@ minimize_when_attached = FALSE attachment_slot = GROIN resistance_flags = FIRE_PROOF | LAVA_PROOF + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT) diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index dfa93c6862f3..a3bd9c01f4e2 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -130,6 +130,7 @@ supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON alternate_worn_layer = UNDER_SUIT_LAYER can_adjust = FALSE + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR //weebs are gonna love this /obj/item/clothing/under/costume/geisha name = "geisha suit" @@ -137,6 +138,7 @@ icon_state = "geisha" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR /obj/item/clothing/under/costume/yukata name = "black yukata" @@ -145,6 +147,8 @@ body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY /obj/item/clothing/under/costume/yukata/green name = "green yukata" @@ -164,6 +168,8 @@ body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY /obj/item/clothing/under/costume/kimono/red name = "red kimono" @@ -269,6 +275,26 @@ can_adjust = FALSE resistance_flags = NONE +// Mech suit skins +/datum/atom_skin/mech_suit + abstract_type = /datum/atom_skin/mech_suit + +/datum/atom_skin/mech_suit/red + preview_name = "Red" + new_icon_state = "red_mech_suit" + +/datum/atom_skin/mech_suit/white + preview_name = "White" + new_icon_state = "white_mech_suit" + +/datum/atom_skin/mech_suit/blue + preview_name = "Blue" + new_icon_state = "blue_mech_suit" + +/datum/atom_skin/mech_suit/black + preview_name = "Black" + new_icon_state = "black_mech_suit" + /obj/item/clothing/under/costume/mech_suit name = "mech pilot's suit" desc = "A mech pilot's suit. Might make your butt look big." @@ -280,13 +306,9 @@ alternate_worn_layer = GLOVES_LAYER //covers hands but gloves can go over it. This is how these things work in my head. can_adjust = FALSE - unique_reskin = list( - "Red" = "red_mech_suit", - "White" = "white_mech_suit", - "Blue" = "blue_mech_suit", - "Black" = "black_mech_suit", - ) - +/obj/item/clothing/under/costume/mech_suit/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/mech_suit) /obj/item/clothing/under/costume/russian_officer name = "\improper Russian officer's uniform" @@ -316,6 +338,7 @@ species_exception = list(/datum/species/golem) can_adjust = TRUE alt_covers_chest = TRUE + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR /obj/item/clothing/under/costume/buttondown/slacks name = "button-down shirt with slacks" @@ -391,6 +414,7 @@ icon_state = "SwagOutfit" inhand_icon_state = null can_adjust = FALSE + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR /obj/item/clothing/under/costume/referee name = "referee uniform" @@ -448,6 +472,7 @@ inhand_icon_state = null female_sprite_flags = NO_FEMALE_UNIFORM can_adjust = FALSE + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR /obj/item/clothing/under/costume/gi/Initialize(mapload) . = ..() @@ -504,3 +529,36 @@ armor_type = /datum/armor/clothing_under/rank_security has_sensor = NO_SENSORS +/obj/item/clothing/under/costume/captain + name = "captain's suit" + desc = "A green suit and yellow necktie. Exemplifies authority." + icon_state = "green_suit" + inhand_icon_state = "dg_suit" + can_adjust = FALSE + +/obj/item/clothing/under/costume/captain/skirt + name = "green suitskirt" + desc = "A green suitskirt and yellow necktie. Exemplifies authority." + icon_state = "green_suit_skirt" + inhand_icon_state = "dg_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/costume/head_of_personnel + name = "head of personnel's suit" + desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble." + icon_state = "teal_suit" + inhand_icon_state = "g_suit" + can_adjust = FALSE + +/obj/item/clothing/under/costume/head_of_personnel/skirt + name = "teal suitskirt" + desc = "A teal suitskirt and yellow necktie. An authoritative yet tacky ensemble." + icon_state = "teal_suit_skirt" + inhand_icon_state = "g_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 diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm index bd2c358551a2..96254bba8fd2 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm @@ -6,11 +6,12 @@ inhand_icon_state = "plasmaman" icon = 'icons/obj/clothing/under/plasmaman.dmi' worn_icon = 'icons/mob/clothing/under/plasmaman.dmi' - clothing_flags = PLASMAMAN_PREVENT_IGNITION + clothing_flags = PLASMAMAN_PREVENT_IGNITION | NO_ZONE_DISABLING armor_type = /datum/armor/clothing_under/plasmaman body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS can_adjust = FALSE strip_delay = 8 SECONDS + resistance_flags = FIRE_PROOF COOLDOWN_DECLARE(extinguish_timer) var/extinguish_cooldown = 100 var/extinguishes_left = 5 diff --git a/code/modules/clothing/under/jobs/civilian/civilian.dm b/code/modules/clothing/under/jobs/civilian/civilian.dm index 923cfbaa74ce..86ea0a9e4525 100644 --- a/code/modules/clothing/under/jobs/civilian/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian/civilian.dm @@ -44,23 +44,6 @@ 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/suit - name = "head of personnel's suit" - desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble." - icon_state = "teal_suit" - inhand_icon_state = "g_suit" - can_adjust = FALSE - -/obj/item/clothing/under/rank/civilian/head_of_personnel/suit/skirt - name = "teal suitskirt" - desc = "A teal suitskirt and yellow necktie. An authoritative yet tacky ensemble." - icon_state = "teal_suit_skirt" - inhand_icon_state = "g_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/hydroponics desc = "It's a jumpsuit designed to protect against minor plant-related hazards." name = "botanist's jumpsuit" @@ -108,6 +91,7 @@ body_parts_covered = CHEST|GROIN female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY can_adjust = FALSE + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR //weebs are going to lvoe this /obj/item/clothing/under/rank/civilian/lawyer name = "Lawyer suit" diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm index 2969eabc63cf..3016eb9fa2c7 100644 --- a/code/modules/clothing/under/jobs/command.dm +++ b/code/modules/clothing/under/jobs/command.dm @@ -22,23 +22,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/obj/item/clothing/under/rank/captain/suit - name = "captain's suit" - desc = "A green suit and yellow necktie. Exemplifies authority." - icon_state = "green_suit" - inhand_icon_state = "dg_suit" - can_adjust = FALSE - -/obj/item/clothing/under/rank/captain/suit/skirt - name = "green suitskirt" - desc = "A green suitskirt and yellow necktie. Exemplifies authority." - icon_state = "green_suit_skirt" - inhand_icon_state = "dg_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/captain/parade name = "captain's parade uniform" desc = "A captain's luxury-wear, for special occasions." diff --git a/code/modules/clothing/under/jobs/rnd.dm b/code/modules/clothing/under/jobs/rnd.dm index b5731ac06a41..44cb68897689 100644 --- a/code/modules/clothing/under/jobs/rnd.dm +++ b/code/modules/clothing/under/jobs/rnd.dm @@ -2,10 +2,10 @@ icon = 'icons/obj/clothing/under/rnd.dmi' worn_icon = 'icons/mob/clothing/under/rnd.dmi' abstract_type = /obj/item/clothing/under/rank/rnd - armor_type = /datum/armor/clothing_under/science /datum/armor/clothing_under/science - bio = 50 + bomb = 10 + bio = 40 /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." diff --git a/code/modules/clothing/under/pants.dm b/code/modules/clothing/under/pants.dm index ea76c0b61533..e8f0f316bccb 100644 --- a/code/modules/clothing/under/pants.dm +++ b/code/modules/clothing/under/pants.dm @@ -19,6 +19,7 @@ greyscale_config_worn = /datum/greyscale_config/slacks/worn greyscale_colors = "#575757#3E3E3E#75634F" flags_1 = IS_PLAYER_COLORABLE_1 + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR /obj/item/clothing/under/pants/jeans name = "jeans" diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm index 4e48a52f58f8..5f388987a4b0 100644 --- a/code/modules/clothing/under/suits.dm +++ b/code/modules/clothing/under/suits.dm @@ -5,14 +5,6 @@ female_sprite_flags = FEMALE_UNIFORM_NO_BREASTS inhand_icon_state = null -/obj/item/clothing/under/suit/green - name = "green suit" - desc = "A green suit and yellow necktie. Baller." - icon = 'icons/obj/clothing/under/captain.dmi' - icon_state = "green_suit" - inhand_icon_state = "dg_suit" - worn_icon = 'icons/mob/clothing/under/captain.dmi' - /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." @@ -116,6 +108,7 @@ desc = "A luxurious suit made with only the finest scales, perfect for conducting dodgy business deals." icon_state = "carpskin_suit" inhand_icon_state = null + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR /obj/item/clothing/under/suit/carpskin/Initialize(mapload) . = ..() diff --git a/code/modules/deathmatch/deathmatch_loadouts.dm b/code/modules/deathmatch/deathmatch_loadouts.dm index bc27f6b02829..aadd57d792a1 100644 --- a/code/modules/deathmatch/deathmatch_loadouts.dm +++ b/code/modules/deathmatch/deathmatch_loadouts.dm @@ -368,10 +368,11 @@ l_hand = /obj/item/gun/ballistic/shotgun/hook r_hand = /obj/item/gun/ballistic/shotgun/hook uniform = /obj/item/clothing/under/costume/skeleton - suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch + suit = /obj/item/clothing/suit/chaplainsuit/armor/heretic mask = /obj/item/clothing/mask/gas/cyborg shoes = /obj/item/clothing/shoes/sandal belt = /obj/item/melee/cleric_mace + head = /obj/item/clothing/head/helmet/chaplain/heretic /datum/outfit/deathmatch_loadout/battler/cowboy name = "Deathmatch: Cowboy" @@ -849,7 +850,7 @@ /obj/item/etherealballdeployer, ) - mutations_to_add = list(/obj/item/dnainjector/shock) // pretend ethereals are interesting + mutations_to_add = list(/datum/mutation/shock) // pretend ethereals are interesting /datum/outfit/deathmatch_loadout/plasmamen name = "Deathmatch: Plasmaman Species" @@ -890,7 +891,7 @@ head = /obj/item/clothing/head/soft/rainbow glasses = null ears = /obj/item/radio/headset - neck = /obj/item/clothing/neck/petcollar + neck = /obj/item/clothing/neck/petcollar/wearable //suit uniform = /obj/item/clothing/under/color/rainbow l_pocket = /obj/item/toy/cattoy @@ -1016,9 +1017,9 @@ display_name = "Heretic Warrior" desc = "Prove the furious strength of the Mansus!" - head = /obj/item/clothing/head/hooded/cult_hoodie/eldritch + head = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/blade neck = /obj/item/clothing/neck/heretic_focus - suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch + suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch/blade suit_store = /obj/item/melee/sickly_blade/dark uniform = /obj/item/clothing/under/color/darkgreen id_trim = null @@ -1041,8 +1042,7 @@ // I mean is it really that bad if they don't even know half this stuff is added to them. // It's like, forbidden knowledge. It fits with the mansus theme - great excuse for poor design! knowledge_to_grant = list( - /datum/heretic_knowledge/blade_grasp, - /datum/heretic_knowledge/blade_dance, + /datum/heretic_knowledge/limited_amount/starting/base_blade, /datum/heretic_knowledge/blade_upgrade/blade, ) @@ -1084,7 +1084,7 @@ ) knowledge_to_grant = list( - /datum/heretic_knowledge/cosmic_grasp, + /datum/heretic_knowledge/limited_amount/starting/base_cosmic, ) spells_to_add = list( diff --git a/code/modules/deathmatch/deathmatch_mapping.dm b/code/modules/deathmatch/deathmatch_mapping.dm index 97c73fd5e9a6..2c335fe07884 100644 --- a/code/modules/deathmatch/deathmatch_mapping.dm +++ b/code/modules/deathmatch/deathmatch_mapping.dm @@ -2,7 +2,7 @@ name = "Deathmatch Arena" requires_power = FALSE default_gravity = STANDARD_GRAVITY - area_flags = UNIQUE_AREA | LOCAL_TELEPORT | EVENT_PROTECTED | QUIET_LOGS | NO_DEATH_MESSAGE | BINARY_JAMMING + area_flags = LOCAL_TELEPORT | EVENT_PROTECTED | QUIET_LOGS | NO_DEATH_MESSAGE | BINARY_JAMMING /area/deathmatch/fullbright static_lighting = FALSE diff --git a/code/modules/deathmatch/deathmatch_modifier.dm b/code/modules/deathmatch/deathmatch_modifier.dm index 9a225bc67da9..ed657caedfd9 100644 --- a/code/modules/deathmatch/deathmatch_modifier.dm +++ b/code/modules/deathmatch/deathmatch_modifier.dm @@ -580,7 +580,7 @@ name = "Random martial arts" description = "Everyone learns a random martial art!" blacklisted_maps = list(/datum/lazy_template/deathmatch/meatower) - // krav maga excluded because its too common and too simple, mushpunch excluded because its horrible and not even funny + // kaza ruk excluded because its too common and too simple, mushpunch excluded because its horrible and not even funny var/static/list/weighted_martial_arts = list( // common /datum/martial_art/cqc = 30, diff --git a/code/modules/detectivework/detective_scan_category.dm b/code/modules/detectivework/detective_scan_category.dm new file mode 100644 index 000000000000..e5d279a35cda --- /dev/null +++ b/code/modules/detectivework/detective_scan_category.dm @@ -0,0 +1,115 @@ +GLOBAL_LIST_INIT_TYPED(detective_scan_categories, /datum/detective_scan_category, initialize_detective_scan_categories()) + +/proc/initialize_detective_scan_categories() + var/list/categories = list() + for(var/datum/detective_scan_category/category_path as anything in subtypesof(/datum/detective_scan_category)) + var/datum/detective_scan_category/existing_category = categories[category_path::id] + if(!isnull(existing_category)) + stack_trace("`[category_path]` has duplicate id - `[category_path::id]` of `[existing_category.type]`") + continue + + categories[category_path::id] = new category_path + + return categories + +/datum/detective_scan_category + /// Category ID. Must be defined in `code/__DEFINES/security.dm` + var/id = "no id" + /// Name of scan category. Used in UIs and in paper + var/name = "no name" + /// Order the data with this category will be sorted by + var/display_order = 0 + /// Fontawesome icon used in TGUI near this category data entry + var/ui_icon = "question" + /// Fontawesome icon color used in TGUI near this category data entry + var/ui_icon_color = "white" + +/// Generates report data used in `/datum/detective_scanner_log/proc/generate_report_text()` +/datum/detective_scan_category/proc/generate_report_data(list/data) + SHOULD_NOT_OVERRIDE(TRUE) + + var/list/report_text = list() + report_text += "
      [name]
      " + + for(var/entry in data) + report_text += format_report_entry(entry, data[entry]) + + report_text += "
      " + return report_text + +/// Formats entered log data. Can be used to have unique formating per each category +/datum/detective_scan_category/proc/format_report_entry(entry, entry_associated_value) + return "[entry]
      " + +/datum/detective_scan_category/fingers + id = DETSCAN_CATEGORY_FINGERS + name = "Fingerprints" + display_order = 1 + ui_icon = "fingerprint" + ui_icon_color = "yellow" + +/datum/detective_scan_category/blood + id = DETSCAN_CATEGORY_BLOOD + name = "Blood DNA, Type" + display_order = 2 + ui_icon = "droplet" + ui_icon_color = "red" + +/datum/detective_scan_category/blood/format_report_entry(entry, entry_associated_value) + return "[entry], [entry_associated_value]
      " + +/datum/detective_scan_category/fiber + id = DETSCAN_CATEGORY_FIBER + name = "Fibers" + display_order = 3 + ui_icon = "shirt" + ui_icon_color = "green" + +/datum/detective_scan_category/drink + id = DETSCAN_CATEGORY_REAGENTS + name = "Reagents" + display_order = 4 + ui_icon = "flask" + ui_icon_color = "blue" + +/datum/detective_scan_category/drink/format_report_entry(entry, entry_associated_value) + return "[entry]: [entry_associated_value] u.
      " + +/datum/detective_scan_category/access + id = DETSCAN_CATEGORY_ACCESS + name = "ID Access" + display_order = 5 + ui_icon = "id-card" + ui_icon_color = "blue" + +/datum/detective_scan_category/access/format_report_entry(entry, entry_associated_value) + var/list/associated_value_list = entry_associated_value + return "[entry]: [associated_value_list]
      " + +/datum/detective_scan_category/setting + id = DETSCAN_CATEGORY_SETTINGS + name = "Active settings" + display_order = 6 + ui_icon = "wrench" + ui_icon_color = "orange" + +/datum/detective_scan_category/holy + id = DETSCAN_CATEGORY_HOLY + name = "Holy data" + display_order = 7 + ui_icon = "book-bible" + ui_icon_color = "brown" + +/datum/detective_scan_category/illegal + id = DETSCAN_CATEGORY_ILLEGAL + name = "Illegal tech" + display_order = 8 + ui_icon = "handcuffs" + ui_icon_color = "red" + +/datum/detective_scan_category/notes + id = DETSCAN_CATEGORY_NOTES + name = "Additional notes" + ui_icon = "clipboard" + ui_icon_color = "yellow" + display_order = 9 diff --git a/code/modules/detectivework/detective_scanner_data/detective_scanner_data_entry.dm b/code/modules/detectivework/detective_scanner_data/detective_scanner_data_entry.dm new file mode 100644 index 000000000000..5dbc390e4ca4 --- /dev/null +++ b/code/modules/detectivework/detective_scanner_data/detective_scanner_data_entry.dm @@ -0,0 +1,25 @@ +/proc/cmp_detective_scanner_data_entry(datum/detective_scanner_data_entry/a, datum/detective_scanner_data_entry/b) + return cmp_numeric_asc(a.display_order, b.display_order) + +/datum/detective_scanner_data_entry + /// Category this data entry is related to + var/category + /// Order this entry will be displayed in TGUI and paper report + var/display_order = 0 + /// List of data for this entry. Displayed in UIs and paper report + var/list/data = list() + +/datum/detective_scanner_data_entry/New(category, display_order, data) + src.category = category + src.display_order = display_order + if(!isnull(data)) + src.data += data + +/datum/detective_scanner_data_entry/ui_data(mob/user) + var/list/ui_data = list() + ui_data["category"] = category + ui_data["data"] = data + return ui_data + +/datum/detective_scanner_data_entry/proc/add_data(data) + src.data += data diff --git a/code/modules/detectivework/detective_scanner_data/detective_scanner_log_entry.dm b/code/modules/detectivework/detective_scanner_data/detective_scanner_log_entry.dm new file mode 100644 index 000000000000..5f0db12b7365 --- /dev/null +++ b/code/modules/detectivework/detective_scanner_data/detective_scanner_log_entry.dm @@ -0,0 +1,65 @@ +/datum/detective_scanner_log + /// Name of the scanned atom + var/scan_target + /// Time the scan was performed at + var/scan_time + /// `data_entries` is an assoc list, which can't use `BINARY_INSERT` + /// And to not perform sorting pipeline every time new data is added, + /// this var will be utilized to only sort list when it's required + var/sorted = TRUE + /// Scan data for current log + var/list/data_entries = list() + +/datum/detective_scanner_log/ui_data(mob/user) + var/list/ui_data = list() + ui_data["scanTarget"] = scan_target + ui_data["scanTime"] = scan_time + + sort_data_entries() + var/list/data_entries_ui_data = list() + for(var/key,value in data_entries) + var/datum/detective_scanner_data_entry/entry = value + UNTYPED_LIST_ADD(data_entries_ui_data, entry.ui_data(user)) + + ui_data["dataEntries"] = data_entries_ui_data + return ui_data + +/// Adds new data entry to `data_entries` or updates existing one +/// Entries will be not sorted after using it +/// Returns TRUE if `data_entries` can be unsorted +/datum/detective_scanner_log/proc/add_data_entry(scan_category_id, data) + var/datum/detective_scan_category/category = GLOB.detective_scan_categories[scan_category_id] + if(isnull(category)) + stack_trace("scan_category_id - `[scan_category_id]` with no corresponding `/datum/detective_scan_category`") + category = GLOB.detective_scan_categories[DETSCAN_CATEGORY_NOTES] + + var/datum/detective_scanner_data_entry/data_entry = data_entries[category.id] + if(!isnull(data_entry)) + data_entry.add_data(data) + return + + data_entries[scan_category_id] = new /datum/detective_scanner_data_entry(scan_category_id, category.display_order, data) + sorted = (length(data_entries) <= 1) + +/// Sorts the `data_entries` list if it's considered not sorted +/datum/detective_scanner_log/proc/sort_data_entries() + if(!sorted) + sortTim(data_entries, GLOBAL_PROC_REF(cmp_detective_scanner_data_entry), TRUE) + sorted = TRUE + +/// Return text that will be used in printed paper report +/// Called in `/obj/item/detective_scanner/proc/print_report()` +/datum/detective_scanner_log/proc/generate_report_text() + var/list/report_text = list() + report_text += "

      [capitalize(scan_target)] scan

      " + (scan_time ? "

      at [scan_time]

      " : null) // DARKPACK EDIT, ORIGINAL: report_text += "

      [capitalize(scan_target)] scan at [scan_time]

      " + if(!length(data_entries)) + report_text += "No forensic traces found." + else + sort_data_entries() + for(var/log_category,data_entry in data_entries) + var/datum/detective_scanner_data_entry/data_entry_datum = data_entry + report_text += GLOB.detective_scan_categories[log_category].generate_report_data(data_entry_datum.data) + + report_text += "
      " + + return report_text diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index a686bc9c90a0..4b60ee1b8e0a 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -44,49 +44,12 @@ var/frNum = ++forensicPrintCount report_paper.name = "FR-[frNum] 'Forensic Record'" - var/list/report_text = list("

      Forensic Record - (FR-[frNum])


      ") - - for(var/list/log in log_data) - report_text += "

      [capitalize(log["scan_target"])] scan at [log["scan_time"]]

      " - - if(!log[DETSCAN_CATEGORY_FIBER] && !log[DETSCAN_CATEGORY_BLOOD] && !log[DETSCAN_CATEGORY_FINGERS] && !log[DETSCAN_CATEGORY_DRINK] && !log[DETSCAN_CATEGORY_ACCESS]) - report_text += "No forensic traces found.
      " - continue - - if(log[DETSCAN_CATEGORY_FIBER]) - report_text += "
      [DETSCAN_CATEGORY_FIBER]
      " - for(var/fibers in log[DETSCAN_CATEGORY_FIBER]) - report_text += fibers + "
      " - report_text += "
      " - - if(log[DETSCAN_CATEGORY_BLOOD]) - report_text += "
      [DETSCAN_CATEGORY_BLOOD]
      " - for(var/blood in log[DETSCAN_CATEGORY_BLOOD]) - report_text += "[blood], [log[DETSCAN_CATEGORY_BLOOD][blood]]
      " - report_text += "
      " - - if(log[DETSCAN_CATEGORY_FINGERS]) - report_text += "
      [DETSCAN_CATEGORY_FINGERS]
      " - for(var/fingers in log[DETSCAN_CATEGORY_FINGERS]) - report_text += fingers + "
      " - report_text += "
      " - - if(log[DETSCAN_CATEGORY_DRINK]) - report_text += "
      [DETSCAN_CATEGORY_DRINK]
      " - for(var/reagent in log[DETSCAN_CATEGORY_DRINK]) - report_text += "[reagent]: [log[DETSCAN_CATEGORY_DRINK][reagent]] u.
      " - report_text += "
      " - - if(log[DETSCAN_CATEGORY_ACCESS]) - report_text += "
      [DETSCAN_CATEGORY_ACCESS]
      " - for(var/region in log[DETSCAN_CATEGORY_ACCESS]) - var/list/access_list = log[DETSCAN_CATEGORY_ACCESS][region] - report_text += "[region]: [access_list.Join(", ")]
      " - report_text += "
      " - - report_text += "

      " - - report_text += "

      Notes:


      " + var/list/report_text = list("

      Forensic Record - (FR-[frNum])


      ") + + for(var/datum/detective_scanner_log/log_entry as anything in log_data) + report_text += log_entry.generate_report_text() + + report_text += "

      Notes:


      " report_paper.add_raw_text(report_text.Join()) report_paper.update_appearance() @@ -149,35 +112,38 @@ // GATHER INFORMATION - var/list/log_entry_data = list() + var/datum/detective_scanner_log/log_entry = new // Start gathering - log_entry_data["scan_target"] = scanned_atom.name - log_entry_data["scan_time"] = station_time_timestamp() + log_entry.scan_target = scanned_atom.name + log_entry.scan_time = station_time_timestamp() var/list/atom_fibers = GET_ATOM_FIBRES(scanned_atom) if(length(atom_fibers)) - log_entry_data[DETSCAN_CATEGORY_FIBER] = atom_fibers.Copy() + log_entry.add_data_entry(DETSCAN_CATEGORY_FIBER, atom_fibers.Copy()) var/list/blood = GET_ATOM_BLOOD_DNA(scanned_atom) if(length(blood)) - log_entry_data[DETSCAN_CATEGORY_BLOOD] = blood.Copy() + log_entry.add_data_entry(DETSCAN_CATEGORY_BLOOD, blood.Copy()) if(ishuman(scanned_atom)) var/mob/living/carbon/human/scanned_human = scanned_atom if(!scanned_human.gloves) - LAZYADD(log_entry_data[DETSCAN_CATEGORY_FINGERS], md5(scanned_human.dna?.unique_identity)) + log_entry.add_data_entry( + DETSCAN_CATEGORY_FINGERS, + rustg_hash_string(RUSTG_HASH_MD5, scanned_human.dna?.unique_identity) + ) else if(!ismob(scanned_atom)) var/list/atom_fingerprints = GET_ATOM_FINGERPRINTS(scanned_atom) if(length(atom_fingerprints)) - log_entry_data[DETSCAN_CATEGORY_FINGERS] = atom_fingerprints.Copy() + log_entry.add_data_entry(DETSCAN_CATEGORY_FINGERS, atom_fingerprints.Copy()) // Only get reagents from non-mobs. for(var/datum/reagent/present_reagent as anything in scanned_atom.reagents?.reagent_list) - LAZYADD(log_entry_data[DETSCAN_CATEGORY_DRINK], list(present_reagent.name = present_reagent.volume)) + log_entry.add_data_entry(DETSCAN_CATEGORY_REAGENTS, list(present_reagent.name = present_reagent.volume)) // Get blood data from the blood reagent. if(!istype(present_reagent, /datum/reagent/blood)) @@ -188,10 +154,7 @@ if(!blood_DNA || !blood_type) continue - // Add to our copied blood list instead of the original - if(!log_entry_data[DETSCAN_CATEGORY_BLOOD]) - log_entry_data[DETSCAN_CATEGORY_BLOOD] = list() - LAZYSET(log_entry_data[DETSCAN_CATEGORY_BLOOD], blood_DNA, blood_type) + log_entry.add_data_entry(DETSCAN_CATEGORY_BLOOD, list(blood_DNA = blood_type)) if(istype(scanned_atom, /obj/item/card/id)) var/obj/item/card/id/user_id = scanned_atom @@ -202,14 +165,17 @@ var/list/access_names = list() for(var/access_num in access_in_region) access_names += SSid_access.get_access_desc(access_num) - LAZYADD(log_entry_data[DETSCAN_CATEGORY_ACCESS], region) - LAZYADD(log_entry_data[DETSCAN_CATEGORY_ACCESS][region], english_list(access_names)) + + log_entry.add_data_entry(DETSCAN_CATEGORY_ACCESS, list("[region]" = english_list(access_names))) // sends it off to be modified by the items - SEND_SIGNAL(scanned_atom, COMSIG_DETECTIVE_SCANNED, user, log_entry_data) + SEND_SIGNAL(scanned_atom, COMSIG_DETECTIVE_SCANNED, user, log_entry) + + // Perform sorting now, because probably this will be never modified + log_entry.sort_data_entries() stoplag(3 SECONDS) - log_data += list(log_entry_data) + log_data += log_entry return TRUE /obj/item/detective_scanner/click_alt(mob/living/user) @@ -217,7 +183,7 @@ /obj/item/detective_scanner/examine(mob/user) . = ..() - if(LAZYLEN(log_data) && !scanner_busy) + if(length(log_data) && !scanner_busy) . += span_notice("Alt-click to clear scanner logs.") @@ -228,8 +194,28 @@ ui.open() /obj/item/detective_scanner/ui_data(mob/user) + var/list/logs = list() + for(var/datum/detective_scanner_log/log as anything in log_data) + UNTYPED_LIST_ADD(logs, log.ui_data(user)) + + var/list/data = list() + data["logs"] = logs + return data + +/obj/item/detective_scanner/ui_static_data(mob/user) + var/list/categories = list() + for(var/key,value in GLOB.detective_scan_categories) + var/datum/detective_scan_category/category = value + + var/list/category_data = list() + category_data["name"] = category.name + category_data["uiIcon"] = category.ui_icon + category_data["uiIconColor"] = category.ui_icon_color + + categories[category.id] = category_data + var/list/data = list() - data["log_data"] = log_data + data["categories"] = categories return data /obj/item/detective_scanner/ui_act(action, params, datum/tgui/ui) @@ -251,7 +237,7 @@ balloon_alert(ui.user, "log deleted") ui.send_update() if("print") - if(!LAZYLEN(log_data)) + if(!length(log_data)) balloon_alert(ui.user, "no logs!") return if(scanner_busy) @@ -263,7 +249,7 @@ addtimer(CALLBACK(src, PROC_REF(safe_print_report)), 3 SECONDS) /obj/item/detective_scanner/proc/clear_logs(mob/living/user) - if(!LAZYLEN(log_data)) + if(!length(log_data)) balloon_alert(user, "no logs!") return CLICK_ACTION_BLOCKING if(scanner_busy) diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index 986def70031c..a7bdc7bf93cf 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -152,7 +152,7 @@ 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]") + log_econ("[amount_to_pay] [MONEY_NAME] 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 @@ -180,7 +180,7 @@ adjust_money(amount, reason_to) from.adjust_money(-amount, reason_from) SSblackbox.record_feedback("amount", "credits_transferred", amount) - log_econ("[amount] credits were transferred from [from.account_holder]'s account to [src.account_holder]") + log_econ("[amount] [MONEY_NAME] were transferred from [from.account_holder]'s account to [src.account_holder]") return TRUE return FALSE @@ -212,7 +212,7 @@ adjust_money(money_to_transfer, "Nanotrasen: Shift Payment") SSblackbox.record_feedback("amount", "free_income", money_to_transfer) SSeconomy.station_target += money_to_transfer - log_econ("[money_to_transfer] credits were given to [src.account_holder]'s account from income.") + log_econ("[money_to_transfer] [MONEY_NAME] were given to [src.account_holder]'s account from income.") return TRUE var/datum/bank_account/department_account = SSeconomy.get_dep_account(account_job.paycheck_department) if(isnull(department_account)) @@ -221,7 +221,7 @@ if(!transfer_money(department_account, money_to_transfer)) bank_card_talk("ERROR: [event] aborted, departmental funds insufficient.") return FALSE - bank_card_talk("[event] processed, account now holds [account_balance] cr.") + bank_card_talk("[event] processed, account now holds [account_balance] [MONEY_SYMBOL].") return TRUE /** @@ -318,8 +318,11 @@ /datum/bank_account/department/adjust_money(amount, reason) . = ..() + + SSblackbox.record_feedback("amount", "[department_id]_balance", account_balance, world.time) //Provides the cargo balance alongside a timestamp for comparison afterwards. 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 diff --git a/code/modules/economy/holopay.dm b/code/modules/economy/holopay.dm index 45eb59c81351..186c5cc77369 100644 --- a/code/modules/economy/holopay.dm +++ b/code/modules/economy/holopay.dm @@ -27,7 +27,7 @@ /obj/structure/holopay/examine(mob/user) . = ..() if(force_fee) - . += span_boldnotice("This holopay forces a payment of [force_fee] credit\s per swipe instead of a variable amount.") + . += span_boldnotice("This holopay forces a payment of [force_fee] [MONEY_NAME_AUTOPURAL(force_fee)] per swipe instead of a variable amount.") /obj/structure/holopay/Initialize(mapload) . = ..() @@ -80,7 +80,11 @@ return ..() /// Users can pay with an ID to skip the UI if(isidcard(held_item)) - if(force_fee && tgui_alert(item_holder, "This holopay has a [force_fee] cr fee. Confirm?", "Holopay Fee", list("Pay", "Cancel")) != "Pay") + if(istype(held_item, /obj/item/card/id/departmental_budget)) + balloon_alert(user, "invalid payment card") + to_chat(user, span_warning("You cannot use a departamental card for this.")) + return FALSE + if(force_fee && tgui_alert(item_holder, "This holopay has a [force_fee] [MONEY_SYMBOL] fee. Confirm?", "Holopay Fee", list("Pay", "Cancel")) != "Pay") return TRUE process_payment(user) return TRUE @@ -90,7 +94,7 @@ var/obj/item/holochip/chip = held_item if(!chip.credits) balloon_alert(user, "holochip is empty") - to_chat(user, span_warning("There doesn't seem to be any credits here.")) + to_chat(user, span_warning("There doesn't seem to be any [MONEY_NAME] here.")) return FALSE /// Charges force fee or uses pay what you want var/cash_deposit = force_fee || tgui_input_number(user, "How much? (Max: [chip.credits])", "Patronage", max_value = chip.credits) @@ -100,8 +104,8 @@ if(QDELETED(held_item) || QDELETED(user) || QDELETED(src) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) return FALSE if(!chip.spend(cash_deposit, FALSE)) - balloon_alert(user, "insufficient credits") - to_chat(user, span_warning("You don't have enough credits to pay with this chip.")) + balloon_alert(user, "insufficient [MONEY_NAME]") + to_chat(user, span_warning("You don't have enough [MONEY_NAME] to pay with this chip.")) return FALSE /// Success: Alert buyer alert_buyer(user, cash_deposit) @@ -264,13 +268,17 @@ balloon_alert(user, "invalid transaction") to_chat(user, span_warning("You can't pay yourself.")) return FALSE + if(istype(id_card, /obj/item/card/id/departmental_budget)) + balloon_alert(user, "invalid payment card") + to_chat(user, span_warning("You cannot use a departamental card for this.")) + return FALSE /// If the user has enough money, ask them the amount or charge the force fee var/amount = force_fee || tgui_input_number(user, "How much? (Max: [payee.account_balance])", "Patronage", max_value = payee.account_balance) /// Exit checks in case the user cancelled or entered an invalid amount if(!amount || QDELETED(user) || QDELETED(src) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) return FALSE if(!payee.adjust_money(-amount, "Holopay: [capitalize(name)]")) - balloon_alert(user, "insufficient credits") + balloon_alert(user, "insufficient [MONEY_NAME]") to_chat(user, span_warning("You don't have the money to pay for this.")) return FALSE /// Success: Alert the buyer @@ -290,10 +298,10 @@ /// Pay the owner linked_card.registered_account.adjust_money(amount, "Holopay: [name]") /// Make alerts - linked_card.registered_account.bank_card_talk("[payee] has deposited [amount] cr at your holographic pay stand.") + linked_card.registered_account.bank_card_talk("[payee] has deposited [amount] [MONEY_SYMBOL] at your holographic pay stand.") say("Thank you for your patronage, [payee]!") playsound(src, 'sound/effects/cashregister.ogg', 20, TRUE) /// Log the event - log_econ("[amount] credits were transferred from [payee]'s transaction to [linked_card.registered_account.account_holder]") + log_econ("[amount] [MONEY_NAME] were transferred from [payee]'s transaction to [linked_card.registered_account.account_holder]") SSblackbox.record_feedback("amount", "credits_transferred", amount) return TRUE diff --git a/code/modules/economy/poker_chips.dm b/code/modules/economy/poker_chips.dm index 770465ce7eab..97ff168d6312 100644 --- a/code/modules/economy/poker_chips.dm +++ b/code/modules/economy/poker_chips.dm @@ -5,10 +5,12 @@ icon_state = "pokerchip_white_black" w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/plastic = COIN_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/plastic_polymers = COIN_MATERIAL_AMOUNT * 0.2) ///How much credit this chip is worth when redeemed var/redeem_value = 0 +/obj/item/poker_chip/grind_results() + return list(/datum/reagent/plastic_polymers = COIN_MATERIAL_AMOUNT * 0.2) + /obj/item/poker_chip/get_item_credit_value() return redeem_value diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index e890613625fe..f8355f530643 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -169,7 +169,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) GLOB.current_test.Fail("[main_line]\n[desclines.Join("\n")]", file = E.file, line = E.line) #endif - if(Debugger?.enabled) + if(Debugger?.enabled || GLOB.debugging_enabled) to_chat(world, span_alertwarning("[main_line]"), type = MESSAGE_TYPE_DEBUG) // This writes the regular format (unwrapping newlines and inserting timestamps as needed). diff --git a/code/modules/escape_menu/escape_menu.dm b/code/modules/escape_menu/escape_menu.dm index 6e07f7ceba0b..cc45c8814810 100644 --- a/code/modules/escape_menu/escape_menu.dm +++ b/code/modules/escape_menu/escape_menu.dm @@ -56,8 +56,8 @@ GLOBAL_LIST_EMPTY(escape_menus) RegisterSignal(client, COMSIG_QDELETING, PROC_REF(on_client_qdel)) RegisterSignal(client, COMSIG_CLIENT_MOB_LOGIN, PROC_REF(on_client_mob_login)) - SEND_SOUND(client, 'sound/misc/escape_menu/esc_open.ogg') - var/sound/esc_middle = sound('sound/misc/escape_menu/esc_middle.ogg', repeat = FALSE, channel = CHANNEL_ESCAPEMENU, volume = 80) + SEND_SOUND(client, 'modular_darkpack/master_files/sounds/effects/misc/escape_menu/esc_open.ogg') // DARKPACK EDIT CHANGE + var/sound/esc_middle = sound('modular_darkpack/master_files/sounds/effects/misc/escape_menu/esc_middle.ogg', repeat = FALSE, channel = CHANNEL_ESCAPEMENU, volume = 80) // DARKPACK EDIT CHANGE SEND_SOUND(client, esc_middle) if (!isnull(ckey)) @@ -76,7 +76,7 @@ GLOBAL_LIST_EMPTY(escape_menus) var/sound/esc_clear = sound(null, repeat = FALSE, channel = CHANNEL_ESCAPEMENU) //yes, I'm doing it like this with a null, no its absolutely intentional, cuts off the sound right as needed. SEND_SOUND(client, esc_clear) - SEND_SOUND(client, 'sound/misc/escape_menu/esc_close.ogg') + SEND_SOUND(client, 'modular_darkpack/master_files/sounds/effects/misc/escape_menu/esc_close.ogg') // DARKPACK EDIT CHANGE client = null return ..() diff --git a/code/modules/escape_menu/home_page.dm b/code/modules/escape_menu/home_page.dm index 0ab16e9ab378..02a050535b0b 100644 --- a/code/modules/escape_menu/home_page.dm +++ b/code/modules/escape_menu/home_page.dm @@ -157,6 +157,20 @@ )) offset_order -= offset_order[1] + var/configurl = CONFIG_GET(string/configurl) + if(configurl) + resource_panels += page_holder.give_screen_object(new /atom/movable/screen/escape_menu/lobby_button/small/collapsible( + null, + /* hud_owner = */ null, + "Config", + "View the server configuration files", + /* button_screen_loc */ "BOTTOM:30,RIGHT:-20", + CALLBACK(client, TYPE_VERB_REF(/client, config)), + /* button_overlay = */ "config", + /* end_point */ offset_order[1], + )) + offset_order -= offset_order[1] + resource_panels += page_holder.give_screen_object(new /atom/movable/screen/escape_menu/lobby_button/small/collapsible( null, /* hud_owner = */ null, diff --git a/code/modules/events/anomaly/_anomaly.dm b/code/modules/events/anomaly/_anomaly.dm index 4d1916158f29..2f55338c3d66 100644 --- a/code/modules/events/anomaly/_anomaly.dm +++ b/code/modules/events/anomaly/_anomaly.dm @@ -40,11 +40,14 @@ var/newAnomaly if(anomaly_turf) - newAnomaly = new anomaly_path(anomaly_turf) + newAnomaly = make_anomaly(anomaly_turf) if (newAnomaly) apply_anomaly_properties(newAnomaly) announce_to_ghosts(newAnomaly) +/datum/round_event/anomaly/proc/make_anomaly(turf/anomaly_turf) + return new anomaly_path(anomaly_turf) + /// Make any further post-creation modifications to the anomaly /datum/round_event/anomaly/proc/apply_anomaly_properties(obj/effect/anomaly/new_anomaly) return @@ -54,4 +57,3 @@ /datum/event_admin_setup/set_location/anomaly/apply_to_event(datum/round_event/anomaly/event) event.spawn_location = chosen_turf - diff --git a/code/modules/events/anomaly/anomaly_placer.dm b/code/modules/events/anomaly/anomaly_placer.dm index eb415d506c2c..7f66476c91b2 100644 --- a/code/modules/events/anomaly/anomaly_placer.dm +++ b/code/modules/events/anomaly/anomaly_placer.dm @@ -59,8 +59,8 @@ /datum/anomaly_placer/proc/generateAllowedAreas() //Places that shouldn't explode var/static/list/safe_area_types = typecacheof(list( - /area/station/ai_monitored/turret_protected/ai, - /area/station/ai_monitored/turret_protected/ai_upload, + /area/station/ai/satellite/chamber, + /area/station/ai/upload/chamber, /area/station/engineering, /area/station/science/ordnance/bomb, /area/station/solars, diff --git a/code/modules/events/anomaly/anomaly_weather.dm b/code/modules/events/anomaly/anomaly_weather.dm new file mode 100644 index 000000000000..3ce303cf3df8 --- /dev/null +++ b/code/modules/events/anomaly/anomaly_weather.dm @@ -0,0 +1,77 @@ +/datum/round_event_control/anomaly/anomaly_weather + name = "Anomaly: Weather" + typepath = /datum/round_event/anomaly/anomaly_weather + + max_occurrences = 2 + weight = 10 + description = "This anomaly causes weather effects to manifest indoors. \ + It can be cause completely harmless weather like light rain, or something which could harm unprotected individuals like snowstorms. \ + Note, triggering multiple at once will likely break weather sound effects." + min_wizard_trigger_potency = 0 + max_wizard_trigger_potency = 5 + admin_setup = list( + /datum/event_admin_setup/set_location/anomaly, + /datum/event_admin_setup/listed_options/weather_anomaly, + /datum/event_admin_setup/listed_options/weather_thunder, + ) + +/datum/round_event_control/anomaly/anomaly_weather/can_spawn_event(players_amt, allow_magic = FALSE) + // weathers have some funky global state that may break if multiple are running. better safe than sorry. + return ..() && !length(SSweather.processing) + +/datum/round_event/anomaly/anomaly_weather + start_when = ANOMALY_START_HARMFUL_TIME + announce_when = ANOMALY_ANNOUNCE_HARMFUL_TIME + anomaly_path = /obj/effect/anomaly/weather + + var/forced_weather_type = null + var/forced_thunder_chance = null + +/datum/round_event/anomaly/anomaly_weather/announce(fake) + if(isnull(impact_area)) + impact_area = placer.findValidArea() + priority_announce("Barometric anomaly detected on [ANOMALY_ANNOUNCE_HARMFUL_TEXT] [impact_area.name].", "Anomaly Alert") + +/datum/round_event/anomaly/anomaly_weather/make_anomaly(turf/anomaly_turf) + return new anomaly_path(anomaly_turf, null, null, forced_weather_type, forced_thunder_chance) + +/datum/round_event_control/anomaly/anomaly_weather/thundering + name = "Anomaly: Thundering Weather" + typepath = /datum/round_event/anomaly/anomaly_weather/thundering + + max_occurrences = 1 + weight = 5 + description = "This anomaly causes more hazardous weather effects to manifest indoors, like thunderstorms with frequent lightning strikes. \ + This version will trigger lightning strikes which can cause decent damage to people and equipment alike." + min_wizard_trigger_potency = 2 + max_wizard_trigger_potency = 7 + +/datum/round_event/anomaly/anomaly_weather/thundering + start_when = ANOMALY_START_DANGEROUS_TIME + announce_when = ANOMALY_ANNOUNCE_DANGEROUS_TIME + anomaly_path = /obj/effect/anomaly/weather/thundering + +/datum/round_event/anomaly/anomaly_weather/thundering/announce(fake) + if(isnull(impact_area)) + impact_area = placer.findValidArea() + priority_announce("Severe barometric anomaly detected on [ANOMALY_ANNOUNCE_DANGEROUS_TEXT] [impact_area.name].", "Anomaly Alert") + +/datum/event_admin_setup/listed_options/weather_anomaly + input_text = "Weather type? Be very careful with the dangerous ones!" + normal_run_option = "Default" + +/datum/event_admin_setup/listed_options/weather_anomaly/get_list() + return valid_subtypesof(/datum/weather) + +/datum/event_admin_setup/listed_options/weather_anomaly/apply_to_event(datum/round_event/anomaly/anomaly_weather/event) + event.forced_weather_type = chosen + +/datum/event_admin_setup/listed_options/weather_thunder + input_text = "Thunder chance? Be careful with high values!" + normal_run_option = "Default" + +/datum/event_admin_setup/listed_options/weather_thunder/get_list() + return GLOB.thunder_chance_options.Copy() + +/datum/event_admin_setup/listed_options/weather_thunder/apply_to_event(datum/round_event/anomaly/anomaly_weather/event) + event.forced_thunder_chance = GLOB.thunder_chance_options[chosen] diff --git a/code/modules/events/camerafailure.dm b/code/modules/events/camerafailure.dm index d2fcdda83142..f6929d4768fa 100644 --- a/code/modules/events/camerafailure.dm +++ b/code/modules/events/camerafailure.dm @@ -12,7 +12,7 @@ /datum/round_event/camera_failure/start() var/iterations = 1 - var/list/cameras = GLOB.cameranet.cameras.Copy() + var/list/cameras = SScameras.cameras.Copy() while(prob(round(100/iterations))) var/obj/machinery/camera/C = pick_n_take(cameras) if (!C) diff --git a/code/modules/events/ghost_role/sentience.dm b/code/modules/events/ghost_role/sentience.dm index 4507e9e27909..4fc837169d2b 100644 --- a/code/modules/events/ghost_role/sentience.dm +++ b/code/modules/events/ghost_role/sentience.dm @@ -51,7 +51,7 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( priority_announce(sentience_report,"[command_name()] Medium-Priority Update") /datum/round_event/ghost_role/sentience/spawn_role() - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_SENTIENCE, role = ROLE_SENTIENCE, alert_pic = /obj/item/slimepotion/slime/sentience, role_name_text = role_name) + var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_SENTIENCE, role = ROLE_SENTIENCE, alert_pic = /obj/item/slimepotion/sentience, role_name_text = role_name) if(!length(candidates)) return NOT_ENOUGH_PLAYERS diff --git a/code/modules/events/space_vines/vine_controller.dm b/code/modules/events/space_vines/vine_controller.dm index 923b35fb82da..c80358929e38 100644 --- a/code/modules/events/space_vines/vine_controller.dm +++ b/code/modules/events/space_vines/vine_controller.dm @@ -3,9 +3,11 @@ GLOBAL_LIST_INIT(vine_mutations_list, init_vine_mutation_list()) /proc/init_vine_mutation_list() var/list/mutation_list = list() - init_subtypes(/datum/spacevine_mutation/, mutation_list) - for(var/datum/spacevine_mutation/mutation as anything in mutation_list) + + for(var/datum/spacevine_mutation/subtype as anything in valid_subtypesof(/datum/spacevine_mutation)) + var/datum/spacevine_mutation/mutation = new subtype mutation_list[mutation] = IDEAL_MAX_SEVERITY - mutation.severity // the ideal maximum potency is used for weighting + return mutation_list /datum/spacevine_controller diff --git a/code/modules/events/space_vines/vine_event.dm b/code/modules/events/space_vines/vine_event.dm index ce9881c99079..fbd3b5015a9d 100644 --- a/code/modules/events/space_vines/vine_event.dm +++ b/code/modules/events/space_vines/vine_event.dm @@ -29,35 +29,48 @@ var/production /datum/round_event/spacevine/start() - var/list/turfs = list() //list of all the empty floor turfs in the hallway areas - + var/list/final_turf_candidates = list() // final list of eligible empty floor turfs in the hallway areas that can be chosen if(override_turf) - turfs += override_turf + final_turf_candidates += override_turf else var/obj/structure/spacevine/vine = new() - - for(var/area/station/hallway/area in GLOB.areas) + var/list/floor_candidates = list() + for(var/area/station/hallway/area in shuffle(GLOB.areas)) for(var/turf/open/floor in area.get_turfs_from_all_zlevels()) - if(!isopenspaceturf(floor) && floor.Enter(vine)) - turfs += floor - + if(isopenspaceturf(floor)) + continue + floor_candidates += floor + + // Enter() is expensive to call on potentially hundreds to thousands of turfs at once and can even lead to server crashes. + // We can pick() a subset instead and get close enough results at a fraction of the cost. + var/turfs_to_test = 100 + var/list/sampled_floor_candidates = pick_n(floor_candidates, min(turfs_to_test, length(floor_candidates))) // results in at most 100 calls of Enter(), a reasonable amount while still feeling random. + + for(var/turf/open/floor as anything in sampled_floor_candidates) + if(floor.Enter(vine)) + final_turf_candidates += floor qdel(vine) - if(length(turfs)) //Pick a turf to spawn at if we can - var/turf/floor = pick(turfs) - var/list/selected_mutations = list() + if(!length(final_turf_candidates)) + return - if(mutations_overridden == FALSE) - selected_mutations = list(pick(subtypesof(/datum/spacevine_mutation))) - else - selected_mutations = override_mutations - if(isnull(potency)) - potency = rand(50,100) - if(isnull(production)) - production = rand(1, 4) + // Pick a turf to spawn at if we can + var/turf/floor = pick(final_turf_candidates) + var/list/selected_mutations = list() + + if(mutations_overridden) + selected_mutations = override_mutations + else + selected_mutations = list(pick(valid_subtypesof(/datum/spacevine_mutation))) + + if(isnull(potency)) + potency = rand(50, 100) + + if(isnull(production)) + production = rand(1, 4) - new /datum/spacevine_controller(floor, selected_mutations, potency, production, src) //spawn a controller at turf with randomized stats and a single random mutation + new /datum/spacevine_controller(floor, selected_mutations, potency, production, src) //spawn a controller at turf with randomized stats and a single random mutation /datum/event_admin_setup/set_location/spacevine input_text = "Spawn vines at current location?" @@ -75,17 +88,17 @@ if("Custom") return ..() if("Random") - choices = list("[pick(subtypesof(/datum/spacevine_mutation))]") + choices = list("[pick(valid_subtypesof(/datum/spacevine_mutation))]") else return ADMIN_CANCEL_EVENT /datum/event_admin_setup/multiple_choice/spacevine/get_options() - return subtypesof(/datum/spacevine_mutation/) + return valid_subtypesof(/datum/spacevine_mutation) /datum/event_admin_setup/multiple_choice/spacevine/apply_to_event(datum/round_event/spacevine/event) var/list/type_choices = list() - for(var/choice in choices) - type_choices += text2path(choice) + for(var/list/choice in choices) + type_choices += text2path(choice[1]) event.mutations_overridden = TRUE event.override_mutations = type_choices diff --git a/code/modules/events/space_vines/vine_mutations.dm b/code/modules/events/space_vines/vine_mutations.dm index 9db702169dd6..ab6a3a2d394b 100644 --- a/code/modules/events/space_vines/vine_mutations.dm +++ b/code/modules/events/space_vines/vine_mutations.dm @@ -81,17 +81,36 @@ hue = "#9B3675" severity = SEVERITY_AVERAGE quality = NEGATIVE + var/required_coverage = HEAD|CHEST|GROIN|LEGS|FEET|ARMS|HANDS /datum/spacevine_mutation/toxicity/on_cross(obj/structure/spacevine/holder, mob/living/crosser) - if(issilicon(crosser)) + if(isvineimmune(crosser) || issilicon(crosser)) return - if(prob(TOXICITY_MUTATION_PROB) && istype(crosser) && !isvineimmune(crosser)) - to_chat(crosser, span_alert("You accidentally touch the vine and feel a strange sensation.")) - crosser.adjustToxLoss(20) + if(!prob(TOXICITY_MUTATION_PROB)) + return + + var/datum/spacevine_mutation/thorns/thorns = locate() in holder.mutations + + if(thorns) + to_chat(crosser, span_alert("You are pricked by thorns and feel a strange sensation.")) + crosser.apply_damage(20, TOX) + return + + var/body_parts_covered = 0 + for(var/obj/item/clothing/worn_item in crosser.get_equipped_items()) + if(!(worn_item.clothing_flags & THICKMATERIAL)) + continue + body_parts_covered |= worn_item.body_parts_covered + + if((body_parts_covered & required_coverage) == required_coverage) + return + + to_chat(crosser, span_alert("You accidentally touch the vine and feel a strange sensation.")) + crosser.apply_damage(20, TOX) /datum/spacevine_mutation/toxicity/on_eat(obj/structure/spacevine/holder, mob/living/eater) if(!isvineimmune(eater)) - eater.adjustToxLoss(20) + eater.apply_damage(20, TOX) /datum/spacevine_mutation/explosive // JC IT'S A BOMB name = "Explosive" @@ -101,11 +120,11 @@ severity = SEVERITY_MAJOR /datum/spacevine_mutation/explosive/on_explosion(explosion_severity, target, obj/structure/spacevine/holder) - if(explosion_severity < 3) - qdel(holder) - else + if(explosion_severity >= EXPLODE_DEVASTATE) QDEL_IN(holder, 0.5 SECONDS) return TRUE + + qdel(holder) return FALSE /datum/spacevine_mutation/explosive/on_death(obj/structure/spacevine/holder, mob/hitter, obj/item/item) @@ -184,8 +203,7 @@ /// Checks mobs on spread-target's turf to see if they should be hit by a damaging proc or not. /datum/spacevine_mutation/aggressive_spread/on_spread(obj/structure/spacevine/holder, turf/turf, mob/living) for(var/mob/living/victim in turf) - if(!isvineimmune(victim) && victim.stat != DEAD) // Don't kill immune creatures. Dead check to prevent log spam when a corpse is trapped between vine eaters. - aggrospread_act(holder, victim) + aggrospread_act(holder, victim) /// What happens if an aggr spreading vine buckles a mob. /datum/spacevine_mutation/aggressive_spread/on_buckle(obj/structure/spacevine/holder, mob/living/buckled) @@ -194,41 +212,51 @@ /// Hurts mobs. To be used when a vine with aggressive spread mutation spreads into the mob's tile or buckles them. /datum/spacevine_mutation/aggressive_spread/aggrospread_act(obj/structure/spacevine/vine, mob/living/living_mob) - var/mob/living/carbon/victim = living_mob //If the mob is carbon then it now also exists as a victim, and not just an living mob. - if(istype(victim)) //If the mob (M) is a carbon subtype (C) we move on to pick a more complex damage proc, with damage zones, wounds and armor mitigation. - var/obj/item/bodypart/limb = victim.get_bodypart(victim.get_random_valid_zone(even_weights = TRUE)) //Picks a random bodypart. - var/armor = victim.run_armor_check(limb, MELEE, null, null) //armor = the armor value of that randomly chosen bodypart. Nulls to not print a message, because it would still print on pierce. - var/datum/spacevine_mutation/thorns/thorn = locate() in vine.mutations //Searches for the thorns mutation in the "mutations"-list inside obj/structure/spacevine, and defines T if it finds it. - if(thorn && prob(40) && !HAS_TRAIT(victim, TRAIT_PIERCEIMMUNE)) //If we found the thorns mutation there is now a chance to get stung instead of lashed or smashed. + if(isvineimmune(living_mob) || living_mob.stat == DEAD) + return + + if(!iscarbon(living_mob)) + living_mob.apply_damage(75, BRUTE, blocked = living_mob.run_armor_check(attack_flag = MELEE, silent = TRUE)) + playsound(living_mob, 'sound/items/weapons/whip.ogg', 50, TRUE, -1) + living_mob.visible_message(span_danger("[living_mob] is brutally threshed by [vine]!"), \ + span_userdanger("You are brutally threshed by [vine]!")) + log_combat(vine, living_mob, "aggressively spread into") //You aren't being attacked by the vines. You just happen to stand in their way. + return + + var/mob/living/carbon/victim = living_mob + var/obj/item/bodypart/limb = victim.get_bodypart(victim.get_random_valid_zone(even_weights = TRUE)) + var/armor = victim.run_armor_check(def_zone = limb, attack_flag = MELEE) + + + if(!HAS_TRAIT(victim, TRAIT_PIERCEIMMUNE)) + var/datum/spacevine_mutation/thorns/thorn = locate() in vine.mutations + + if(thorn && prob(40)) //If we found the thorns mutation there is now a chance to get stung instead of lashed or smashed. victim.apply_damage(50, BRUTE, def_zone = limb, wound_bonus = rand(-20,10), sharpness = SHARP_POINTY) //This one gets a bit lower damage because it ignores armor. victim.Stun(1 SECONDS) //Stopped in place for a moment. playsound(living_mob, 'sound/items/weapons/pierce.ogg', 50, TRUE, -1) living_mob.visible_message(span_danger("[living_mob] is nailed by a sharp thorn!"), \ span_userdanger("You are nailed by a sharp thorn!")) log_combat(vine, living_mob, "aggressively pierced") //"Aggressively" for easy ctrl+F'ing in the attack logs. - else - if(prob(80) && !HAS_TRAIT(victim, TRAIT_PIERCEIMMUNE)) - victim.apply_damage(60, BRUTE, def_zone = limb, blocked = armor, wound_bonus = rand(-20,10), sharpness = SHARP_EDGED) - victim.Knockdown(2 SECONDS) - playsound(victim, 'sound/items/weapons/whip.ogg', 50, TRUE, -1) - living_mob.visible_message(span_danger("[living_mob] is lacerated by an outburst of vines!"), \ - span_userdanger("You are lacerated by an outburst of vines!")) - log_combat(vine, living_mob, "aggressively lacerated") - else - victim.apply_damage(60, BRUTE, def_zone = limb, blocked = armor, wound_bonus = rand(-20,10), sharpness = NONE) - victim.Knockdown(3 SECONDS) - var/atom/throw_target = get_edge_target_turf(living_mob, get_dir(vine, get_step_away(living_mob, vine))) - victim.throw_at(throw_target, 3, 6) - playsound(victim, 'sound/effects/hit_kick.ogg', 50, TRUE, -1) - living_mob.visible_message(span_danger("[living_mob] is smashed by a large vine!"), \ - span_userdanger("You are smashed by a large vine!")) - log_combat(vine, living_mob, "aggressively smashed") - else //Living but not a carbon? Maybe a silicon? Can't be wounded so have a big chunk of simple bruteloss with no special effects. They can be entangled. - living_mob.adjustBruteLoss(75) - playsound(living_mob, 'sound/items/weapons/whip.ogg', 50, TRUE, -1) - living_mob.visible_message(span_danger("[living_mob] is brutally threshed by [vine]!"), \ - span_userdanger("You are brutally threshed by [vine]!")) - log_combat(vine, living_mob, "aggressively spread into") //You aren't being attacked by the vines. You just happen to stand in their way. + return + + if(prob(80)) + victim.apply_damage(60, BRUTE, def_zone = limb, blocked = armor, wound_bonus = rand(-20,10), sharpness = SHARP_EDGED) + victim.Knockdown(2 SECONDS) + playsound(victim, 'sound/items/weapons/whip.ogg', 50, TRUE, -1) + living_mob.visible_message(span_danger("[living_mob] is lacerated by an outburst of vines!"), \ + span_userdanger("You are lacerated by an outburst of vines!")) + log_combat(vine, living_mob, "aggressively lacerated") + return + + victim.apply_damage(60, BRUTE, def_zone = limb, blocked = armor, wound_bonus = rand(-20,10), sharpness = NONE) + victim.Knockdown(3 SECONDS) + var/atom/throw_target = get_edge_target_turf(living_mob, get_dir(vine, get_step_away(living_mob, vine))) + victim.throw_at(throw_target, 3, 6) + playsound(victim, 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + living_mob.visible_message(span_danger("[living_mob] is smashed by a large vine!"), \ + span_userdanger("You are smashed by a large vine!")) + log_combat(vine, living_mob, "aggressively smashed") /datum/spacevine_mutation/transparency name = "transparent" @@ -241,69 +269,58 @@ holder.light_state = PASS_LIGHT holder.alpha = 125 -/datum/spacevine_mutation/oxy_eater +/datum/spacevine_mutation/gas_eater + abstract_type = /datum/spacevine_mutation/gas_eater + /// Type of gas consumed by this mutation + var/datum/gas/gas_type = null + +/datum/spacevine_mutation/gas_eater/process_mutation(obj/structure/spacevine/holder) + if(isnull(gas_type)) + stack_trace("gas_type not set for gas_eater mutation [type]") + return + + var/turf/open/floor/turf = holder.loc + if(!istype(turf)) + return + + var/datum/gas_mixture/gas_mix = turf.air + if(!gas_mix.gases[gas_type]) + return + + gas_mix.gases[gas_type][MOLES] = max(gas_mix.gases[gas_type][MOLES] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.growth_stage, 0) + gas_mix.garbage_collect() + +/datum/spacevine_mutation/gas_eater/oxy_eater name = "Oxygen consuming" description = "Consumes Oxygen from the surrounding area." hue = "#28B5B5" severity = SEVERITY_AVERAGE quality = NEGATIVE + gas_type = /datum/gas/oxygen -/datum/spacevine_mutation/oxy_eater/process_mutation(obj/structure/spacevine/holder) - var/turf/open/floor/turf = holder.loc - if(istype(turf)) - var/datum/gas_mixture/gas_mix = turf.air - if(!gas_mix.gases[/datum/gas/oxygen]) - return - gas_mix.gases[/datum/gas/oxygen][MOLES] = max(gas_mix.gases[/datum/gas/oxygen][MOLES] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.growth_stage, 0) - gas_mix.garbage_collect() - -/datum/spacevine_mutation/nitro_eater +/datum/spacevine_mutation/gas_eater/nitro_eater name = "Nitrogen consuming" description = "Consumes Nitrogen from the surrounding area." hue = "#FF7B54" severity = SEVERITY_AVERAGE quality = NEGATIVE + gas_type = /datum/gas/nitrogen -/datum/spacevine_mutation/nitro_eater/process_mutation(obj/structure/spacevine/holder) - var/turf/open/floor/turf = holder.loc - if(istype(turf)) - var/datum/gas_mixture/gas_mix = turf.air - if(!gas_mix.gases[/datum/gas/nitrogen]) - return - gas_mix.gases[/datum/gas/nitrogen][MOLES] = max(gas_mix.gases[/datum/gas/nitrogen][MOLES] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.growth_stage, 0) - gas_mix.garbage_collect() - -/datum/spacevine_mutation/carbondioxide_eater +/datum/spacevine_mutation/gas_eater/carbondioxide_eater name = "CO2 consuming" description = "Consumes Carbon Dioxide from the surrounding area." hue = "#798777" severity = SEVERITY_MINOR quality = POSITIVE + gas_type = /datum/gas/carbon_dioxide -/datum/spacevine_mutation/carbondioxide_eater/process_mutation(obj/structure/spacevine/holder) - var/turf/open/floor/turf = holder.loc - if(istype(turf)) - var/datum/gas_mixture/gas_mix = turf.air - if(!gas_mix.gases[/datum/gas/carbon_dioxide]) - return - gas_mix.gases[/datum/gas/carbon_dioxide][MOLES] = max(gas_mix.gases[/datum/gas/carbon_dioxide][MOLES] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.growth_stage, 0) - gas_mix.garbage_collect() - -/datum/spacevine_mutation/plasma_eater +/datum/spacevine_mutation/gas_eater/plasma_eater name = "Plasma consuming" description = "Consumes Plasma from the surrounding area." hue = "#9074b6" severity = SEVERITY_AVERAGE quality = POSITIVE - -/datum/spacevine_mutation/plasma_eater/process_mutation(obj/structure/spacevine/holder) - var/turf/open/floor/turf = holder.loc - if(istype(turf)) - var/datum/gas_mixture/gas_mix = turf.air - if(!gas_mix.gases[/datum/gas/plasma]) - return - gas_mix.gases[/datum/gas/plasma][MOLES] = max(gas_mix.gases[/datum/gas/plasma][MOLES] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.growth_stage, 0) - gas_mix.garbage_collect() + gas_type = /datum/gas/plasma /datum/spacevine_mutation/thorns name = "Thorny" @@ -313,28 +330,27 @@ quality = NEGATIVE /datum/spacevine_mutation/thorns/on_cross(obj/structure/spacevine/holder, mob/living/crosser) - if(istype(crosser) && HAS_TRAIT(crosser, TRAIT_PIERCEIMMUNE)) + if(isvineimmune(crosser) || HAS_TRAIT(crosser, TRAIT_PIERCEIMMUNE)) return - - if(prob(THORN_MUTATION_CUT_PROB) && istype(crosser) && !isvineimmune(crosser)) + if(prob(THORN_MUTATION_CUT_PROB)) var/mob/living/victim = crosser - victim.adjustBruteLoss(15) - to_chat(victim, span_danger("You cut yourself on the thorny vines.")) + if(victim.apply_damage(15, BRUTE, blocked = victim.run_armor_check(attack_flag = MELEE, silent = TRUE), spread_damage = TRUE)) + to_chat(victim, span_danger("You cut yourself on the thorny vines.")) /datum/spacevine_mutation/thorns/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/item, expected_damage) + if(isvineimmune(hitter) || HAS_TRAIT(hitter, TRAIT_PIERCEIMMUNE) || HAS_TRAIT(hitter, TRAIT_PLANT_SAFE)) + return expected_damage + if(iscarbon(hitter)) var/mob/living/carbon/carbon_victim = hitter for(var/obj/item/clothing/worn_item in carbon_victim.get_equipped_items()) if((worn_item.body_parts_covered & HANDS) && (worn_item.clothing_flags & THICKMATERIAL)) return expected_damage - if(HAS_TRAIT(hitter, TRAIT_PIERCEIMMUNE) || HAS_TRAIT(hitter, TRAIT_PLANT_SAFE)) - return expected_damage - - if(prob(THORN_MUTATION_CUT_PROB) && istype(hitter) && !isvineimmune(hitter)) + if(prob(THORN_MUTATION_CUT_PROB)) var/mob/living/victim = hitter - victim.adjustBruteLoss(15) - to_chat(victim, span_danger("You cut yourself on the thorny vines.")) + if(victim.apply_damage(15, BRUTE, blocked = victim.run_armor_check(attack_flag = MELEE, silent = TRUE), spread_damage = TRUE)) + to_chat(victim, span_danger("You cut yourself on the thorny vines.")) return expected_damage @@ -378,8 +394,10 @@ severity = SEVERITY_MAJOR /datum/spacevine_mutation/flowering/on_grow(obj/structure/spacevine/holder) - if(holder.growth_stage == 2 && prob(FLOWERING_MUTATION_SPAWN_PROB) && !locate(/obj/structure/alien/resin/flower_bud) in range(5,holder)) - var/obj/structure/alien/resin/flower_bud/spawned_flower_bud = new/obj/structure/alien/resin/flower_bud(get_turf(holder)) + if(locate(/obj/structure/alien/resin/flower_bud) in range(5, holder)) + return + if(holder.growth_stage == 2 && prob(FLOWERING_MUTATION_SPAWN_PROB)) + var/obj/structure/alien/resin/flower_bud/spawned_flower_bud = new(holder.loc) spawned_flower_bud.trait_flags = holder.trait_flags /datum/spacevine_mutation/flowering/on_cross(obj/structure/spacevine/holder, mob/living/crosser) diff --git a/code/modules/events/stray_cargo.dm b/code/modules/events/stray_cargo.dm index 6f752a488258..8d589ea1c720 100644 --- a/code/modules/events/stray_cargo.dm +++ b/code/modules/events/stray_cargo.dm @@ -64,7 +64,7 @@ stray_spawnable_supply_packs = SSshuttle.supply_packs.Copy() for(var/pack in stray_spawnable_supply_packs) var/datum/supply_pack/pack_type = pack - if(initial(pack_type.special)) + if(initial(pack_type.order_flags) & ORDER_SPECIAL) stray_spawnable_supply_packs -= pack ///Spawns a random supply pack, puts it in a pod, and spawns it on a random tile of the selected area @@ -116,8 +116,8 @@ if(!allowed_areas) ///Places that shouldn't explode var/static/list/safe_area_types = typecacheof(list( - /area/station/ai_monitored/turret_protected/ai, - /area/station/ai_monitored/turret_protected/ai_upload, + /area/station/ai/satellite/chamber, + /area/station/ai/upload/chamber, /area/station/engineering, /area/shuttle, )) diff --git a/code/modules/events/wizard/object_rain.dm b/code/modules/events/wizard/object_rain.dm index a98d1b540b96..0295f859aca3 100644 --- a/code/modules/events/wizard/object_rain.dm +++ b/code/modules/events/wizard/object_rain.dm @@ -144,7 +144,7 @@ /datum/round_event/wizard/object_rain/fish /datum/round_event/wizard/object_rain/fish/get_item() - var/fish_path = pick(subtypesof(/obj/item/fish)) + var/fish_path = pick(valid_subtypesof(/obj/item/fish)) // DARKPACK EDIT CHANGE - FISHING return new fish_path() /// Admin configuration diff --git a/code/modules/experisci/experiment/handlers/experiment_handler.dm b/code/modules/experisci/experiment/handlers/experiment_handler.dm index 10c15c4eba75..0e944fb67a5e 100644 --- a/code/modules/experisci/experiment/handlers/experiment_handler.dm +++ b/code/modules/experisci/experiment/handlers/experiment_handler.dm @@ -163,20 +163,6 @@ playsound(source, 'sound/machines/ping.ogg', 25) source.say("New unique autopsy successfully catalogued.") - -/** - * Announces a message to all experiment handlers - * - * Arguments: - * * message - The message to announce - */ -/datum/component/experiment_handler/proc/announce_message_to_all(message) - for(var/datum/component/experiment_handler/experi_handler as anything in GLOB.experiment_handlers) - if(experi_handler.linked_web != linked_web) - continue - var/atom/movable/experi_parent = experi_handler.parent - experi_parent.say(message) - /** * Announces a message to this experiment handler * @@ -292,6 +278,17 @@ * * experiment - The experiment to check */ /datum/component/experiment_handler/proc/can_select_experiment(datum/experiment/experiment) + // Check that this experiment is visible currently + if (!(experiment in linked_web?.available_experiments)) + return FALSE + + return is_compatible_experiment(experiment) + +/** + * Checks if an experiment could be selected by the handler if it were available in the linked web. + * Basically, it skips the available_experiments check, unlike can_select_experiment. + */ +/datum/component/experiment_handler/proc/is_compatible_experiment(datum/experiment/experiment) // Check that this experiments has no disallowed traits if (experiment.traits & disallowed_traits) return FALSE @@ -300,10 +297,6 @@ if (length(experiment.allowed_experimentors) && !is_type_in_list(parent, experiment.allowed_experimentors)) return FALSE - // Check that this experiment is visible currently - if (!(experiment in linked_web?.available_experiments)) - return FALSE - // Check that this experiment type isn't blacklisted if(is_type_in_list(experiment, blacklisted_experiments)) return FALSE @@ -344,16 +337,7 @@ 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, - selected = selected_experiment == experiment, - progress = experiment.check_progress(), - performance_hint = experiment.performance_hint, - ref = REF(experiment) - ) - .["experiments"] += list(data) + .["experiments"] += list(list("selected" = selected_experiment == experiment) + experiment.to_ui_data()) /datum/component/experiment_handler/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() diff --git a/code/modules/experisci/experiment/physical_experiments.dm b/code/modules/experisci/experiment/physical_experiments.dm index 11075d1c75ec..5ed42dec2d79 100644 --- a/code/modules/experisci/experiment/physical_experiments.dm +++ b/code/modules/experisci/experiment/physical_experiments.dm @@ -24,9 +24,10 @@ /datum/experiment/physical/meat_wall_explosion/proc/check_experiment(datum/source, obj/projectile/proj) SIGNAL_HANDLER if(istype(proj, /obj/projectile/beam/emitter)) + UnregisterSignal(currently_scanned_atom, COMSIG_ATOM_BULLET_ACT) finish_experiment(linked_experiment_handler) -/datum/experiment/physical/meat_wall_explosion/finish_experiment(datum/component/experiment_handler/experiment_handler) +/datum/experiment/physical/meat_wall_explosion/finish_experiment(datum/component/experiment_handler/experiment_handler, datum/techweb/linked_web_override) . = ..() new /obj/effect/gibspawner/generic(currently_scanned_atom) var/turf/meat_wall = currently_scanned_atom @@ -55,4 +56,5 @@ /datum/experiment/physical/arcade_winner/proc/win_arcade(datum/source) SIGNAL_HANDLER + UnregisterSignal(currently_scanned_atom, COMSIG_ARCADE_VICTORY) finish_experiment(linked_experiment_handler) diff --git a/code/modules/experisci/experiment/types/experiment.dm b/code/modules/experisci/experiment/types/experiment.dm index b7e7175d8409..02bb6c42ea7c 100644 --- a/code/modules/experisci/experiment/types/experiment.dm +++ b/code/modules/experisci/experiment/types/experiment.dm @@ -95,14 +95,44 @@ /** * Called when you complete an experiment, makes sure the techwebs knows the experiment was finished, and tells everyone it happend, yay! */ -/datum/experiment/proc/finish_experiment(datum/component/experiment_handler/experiment_handler) +/datum/experiment/proc/finish_experiment(datum/component/experiment_handler/experiment_handler, datum/techweb/linked_web_override) completed = TRUE - experiment_handler.selected_experiment = null - var/announcetext = experiment_handler.linked_web.complete_experiment(src) - experiment_handler.announce_message_to_all(announcetext) + if(!experiment_handler && !linked_web_override) + CRASH("finish_experiment() called without either experiment_handler or linked_web_override being set") + experiment_handler?.selected_experiment = null + var/datum/techweb/linked_web = linked_web_override || experiment_handler.linked_web + var/announcetext = linked_web.complete_experiment(src) + announce_message_to_all(announcetext, linked_web) + +/** + * Announces a message to all experiment handlers + * + * Arguments: + * * message - The message to announce + * * linked_web - the linked techweb we want to target. Prevent experiment handlers not linked to said techweb from receiving the message + */ +/datum/experiment/proc/announce_message_to_all(message, datum/techweb/linked_web) + for(var/datum/component/experiment_handler/experi_handler as anything in GLOB.experiment_handlers) + if(experi_handler.linked_web != linked_web) + continue + if(!(experi_handler.config_flags & EXPERIMENT_CONFIG_ALWAYS_ANNOUNCE) && !experi_handler.is_compatible_experiment(src)) + continue + var/atom/movable/experi_parent = experi_handler.parent + experi_parent.say(message) /datum/experiment/proc/get_points_reward_text() var/list/english_list_keys = list() for(var/points_type in points_reward) english_list_keys += "[points_reward[points_type]] [points_type]" return "[english_list(english_list_keys)] points" + +/datum/experiment/proc/to_ui_data() + return list( + "name" = name, + "description" = description, + "tag" = exp_tag, + "progress" = check_progress(), + "completed" = completed, + "performance_hint" = performance_hint, + "ref" = REF(src) + ) diff --git a/code/modules/experisci/experiment/types/scanning_fish.dm b/code/modules/experisci/experiment/types/scanning_fish.dm index 96832cd86724..38209a9d281e 100644 --- a/code/modules/experisci/experiment/types/scanning_fish.dm +++ b/code/modules/experisci/experiment/types/scanning_fish.dm @@ -70,7 +70,7 @@ GLOBAL_LIST_EMPTY(scanned_fish_by_techweb) * 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, ...) +/datum/experiment/scanning/fish/finish_experiment(datum/component/experiment_handler/experiment_handler, datum/techweb/linked_web_override) . = ..() if(next_experiments) experiment_handler.linked_web.add_experiments(next_experiments) diff --git a/code/modules/experisci/handheld_scanner.dm b/code/modules/experisci/handheld_scanner.dm index 67850aedd28a..a91db73a017c 100644 --- a/code/modules/experisci/handheld_scanner.dm +++ b/code/modules/experisci/handheld_scanner.dm @@ -11,6 +11,9 @@ icon_state = "experiscanner" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP /obj/item/experi_scanner/Initialize(mapload) ..() @@ -25,6 +28,7 @@ AddComponent(/datum/component/experiment_handler, \ allowed_experiments = list(/datum/experiment/scanning, /datum/experiment/physical), \ disallowed_traits = EXPERIMENT_TRAIT_DESTRUCTIVE, \ + config_flags = EXPERIMENT_CONFIG_ALWAYS_ANNOUNCE, \ experiment_signals = handheld_signals, \ ) @@ -45,19 +49,8 @@ return MANUAL_SUICIDE /obj/item/experi_scanner/proc/make_meat_toilet(mob/living/carbon/user) - ///The suicide victim's brain that will be placed inside the toilet's cistern - var/obj/item/organ/brain/toilet_brain = user.get_organ_slot(ORGAN_SLOT_BRAIN) ///The toilet we're about to unleash unto this cursed plane of existence - var/obj/structure/toilet/greyscale/result_toilet = new (drop_location()) - - result_toilet.set_custom_materials(list(GET_MATERIAL_REF(/datum/material/meat/mob_meat, user) = SHEET_MATERIAL_AMOUNT)) - result_toilet.desc = "A horrendous mass of fused flesh resembling a standard-issue HT-451 model toilet. How it manages to function as one is beyond you. \ - This one seems to be made out of the flesh of a devoted employee of the RnD department." - result_toilet.buildstacktype = /obj/effect/decal/remains/human //this also prevents the toilet from dropping meat sheets. if you want to cheese the meat exepriments, sacrifice more people + new /obj/structure/toilet/greyscale/flesh (drop_location(), user) //the toilet's Initialize proc will handle the rest from here. icon_state = "experiscanner" remove_atom_colour(ADMIN_COLOUR_PRIORITY, COLOR_RED) - - 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/control_console.dm b/code/modules/explorer_drone/control_console.dm index 78451dd71a16..21c64757bc1a 100644 --- a/code/modules/explorer_drone/control_console.dm +++ b/code/modules/explorer_drone/control_console.dm @@ -23,16 +23,18 @@ RegisterSignal(controlled_drone,COMSIG_QDELETING, PROC_REF(drone_destroyed)) RegisterSignal(controlled_drone,COMSIG_EXODRONE_STATUS_CHANGED, PROC_REF(on_exodrone_status_changed)) update_icon() + playsound(src, 'sound/machines/terminal/terminal_on.ogg', 20, vary = TRUE) /obj/machinery/computer/exodrone_control_console/proc/on_exodrone_status_changed() SIGNAL_HANDLER //Notify we need human action and switch screeb icon to alert. - playsound(src,'sound/machines/ping.ogg',30,FALSE) + playsound(src, 'sound/machines/terminal/terminal_processing.ogg', 20, vary = TRUE) update_icon() /obj/machinery/computer/exodrone_control_console/proc/drone_destroyed() SIGNAL_HANDLER signal_lost = TRUE + playsound(src, 'sound/machines/terminal/terminal_alert.ogg', 20, vary = TRUE) end_drone_control() /obj/machinery/computer/exodrone_control_console/proc/end_drone_control() @@ -41,6 +43,7 @@ UnregisterSignal(controlled_drone,list(COMSIG_QDELETING,COMSIG_EXODRONE_STATUS_CHANGED)) controlled_drone = null update_icon() + playsound(src, 'sound/machines/terminal/terminal_off.ogg', 20, vary = TRUE) /obj/machinery/computer/exodrone_control_console/Destroy() . = ..() @@ -114,7 +117,7 @@ signal_lost = FALSE return TRUE if("self_destruct") - qdel(controlled_drone) //var will be nulled in signal response + controlled_drone.handle_deconstruct() return TRUE if("add_tool") if(controlled_drone && controlled_drone.drone_status == EXODRONE_IDLE) diff --git a/code/modules/explorer_drone/exodrone.dm b/code/modules/explorer_drone/exodrone.dm index e0b1aec07b22..08fc0ae9142a 100644 --- a/code/modules/explorer_drone/exodrone.dm +++ b/code/modules/explorer_drone/exodrone.dm @@ -76,9 +76,14 @@ GLOBAL_LIST_EMPTY(exodrone_launchers) // Cargo storage create_storage(max_slots = EXODRONE_CARGO_SLOTS, canthold = GLOB.blacklisted_cargo_types) -/obj/item/exodrone/Destroy() +/obj/item/exodrone/handle_deconstruct(disassembled) . = ..() + explosion(src, 0, 0, 1, 1) + do_sparks(5, FALSE, src) + +/obj/item/exodrone/Destroy() GLOB.exodrones -= src + . = ..() /// Description for drone listing, describes location and current status /obj/item/exodrone/proc/ui_description() @@ -337,7 +342,7 @@ GLOBAL_LIST_EMPTY(exodrone_launchers) /obj/item/exodrone/proc/drone_log(message) if(length(drone_log) > EXODRONE_LOG_SIZE) - drone_log = list() + drone_log.Remove() drone_log.Insert(1,message) /obj/item/exodrone/proc/has_tool(tool_type) diff --git a/code/modules/explorer_drone/exploration_site.dm b/code/modules/explorer_drone/exploration_site.dm index 4a8be99417e7..08ee07b31caf 100644 --- a/code/modules/explorer_drone/exploration_site.dm +++ b/code/modules/explorer_drone/exploration_site.dm @@ -118,10 +118,8 @@ GLOBAL_LIST_EMPTY(exploration_sites) /datum/exploration_site/proc/build_exploration_event_requirements_cache() . = list() - for(var/event_type in subtypesof(/datum/exploration_event)) + for(var/event_type in valid_subtypesof(/datum/exploration_event)) var/datum/exploration_event/event = event_type - if(initial(event.abstract_type) == event_type) - continue event = new event_type .[event_type] = list("required" = event.required_site_traits,"blacklisted" = event.blacklisted_site_traits) //Should be no event refs,GC'd naturally diff --git a/code/modules/explorer_drone/loot.dm b/code/modules/explorer_drone/loot.dm index 7f21b788f3da..6c7bf6ea308d 100644 --- a/code/modules/explorer_drone/loot.dm +++ b/code/modules/explorer_drone/loot.dm @@ -45,7 +45,7 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index()) var/list/still_locked_packs = list() for(var/pack_type in unlockable_packs) var/datum/supply_pack/pack_singleton = SSshuttle.supply_packs[pack_type] - if(!pack_singleton.special_enabled) + if(!(pack_singleton.order_flags & ORDER_SPECIAL_ENABLED)) still_locked_packs += pack_type if(!length(still_locked_packs)) // Just give out some cash instead. var/datum/adventure_loot_generator/simple/cash/replacement = new @@ -133,10 +133,10 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index()) /obj/item/trade_chip/proc/try_to_unlock_contract(mob/user) var/datum/supply_pack/pack_singleton = SSshuttle.supply_packs[unlocked_pack_type] - if(!unlocked_pack_type || !pack_singleton || !pack_singleton.special) + if(!unlocked_pack_type || !pack_singleton || !(pack_singleton.order_flags & ORDER_SPECIAL)) to_chat(user,span_danger("This chip is invalid!")) return - pack_singleton.special_enabled = TRUE + pack_singleton.order_flags |= ORDER_SPECIAL_ENABLED to_chat(user,span_notice("Contract accepted into nanotrasen supply database.")) qdel(src) diff --git a/code/modules/explorer_drone/scanner_array.dm b/code/modules/explorer_drone/scanner_array.dm index 7588eae233a6..237c3aee606a 100644 --- a/code/modules/explorer_drone/scanner_array.dm +++ b/code/modules/explorer_drone/scanner_array.dm @@ -175,6 +175,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) var/datum/exoscan/scan = GLOB.exoscanner_controller.create_scan(scan_type,target) if(scan) RegisterSignal(scan, COMSIG_EXOSCAN_INTERRUPTED, PROC_REF(scan_failed)) + playsound(src, 'sound/machines/terminal/terminal_processing.ogg', 20, vary = TRUE) /obj/machinery/computer/exoscanner_control/proc/scan_failed() SIGNAL_HANDLER diff --git a/code/modules/fishing/aquarium/aquarium.dm b/code/modules/fishing/aquarium/aquarium.dm index e5402acc84e0..db01cfb9cb51 100644 --- a/code/modules/fishing/aquarium/aquarium.dm +++ b/code/modules/fishing/aquarium/aquarium.dm @@ -9,6 +9,7 @@ base_icon_state = "aquarium" integrity_failure = 0.3 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 10, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 10) //This is the area where fish can swim var/aquarium_zone_min_pw = 2 @@ -129,6 +130,7 @@ throw_range = 3 w_class = WEIGHT_CLASS_BULKY item_flags = SLOWS_WHILE_IN_HAND + custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 5) custom_price = PAYCHECK_CREW * 9 @@ -163,7 +165,7 @@ /datum/component/aquarium,\ min_px = 6,\ max_px = 26,\ - min_py = 6,\ + min_py = 7,\ max_py = 24,\ default_beauty = 100,\ reagents_size = src.reagent_size,\ @@ -248,6 +250,11 @@ force = min(2 + (GET_FISH_WEIGHT_RANK(current_summed_weight) * 3), 21) throwforce = force +/obj/item/fish_tank/examine(mob/user) + . = ..() + if(HAS_TRAIT_FROM(src, TRAIT_STOP_FISH_REPRODUCTION_AND_GROWTH, INNATE_TRAIT)) + . += span_warning("It's cramped in there. There's no more room for fish to reproduce and grow!") + ///The lawyer's own pet goldfish's fish tank. It used to be an aquarium, but now it can be held and carried around. /obj/item/fish_tank/lawyer init_mode = AQUARIUM_MODE_SAFE diff --git a/code/modules/fishing/aquarium/fish_analyzer.dm b/code/modules/fishing/aquarium/fish_analyzer.dm index a89ac1456a67..64b4798e911c 100644 --- a/code/modules/fishing/aquarium/fish_analyzer.dm +++ b/code/modules/fishing/aquarium/fish_analyzer.dm @@ -21,8 +21,8 @@ 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 item we have scanned - var/datum/weakref/scanned_item + ///the atom (aquarium or fish) we have scanned + var/atom/scanned_object /obj/item/fish_analyzer/Initialize(mapload) case_color = rgb(rand(16, 255), rand(16, 255), rand(16, 255)) @@ -43,6 +43,10 @@ update_appearance() AddComponent(/datum/component/adjust_fishing_difficulty, -3, ITEM_SLOT_HANDS) +/obj/item/fish_analyzer/Destroy() + scanned_object = null + return ..() + /obj/item/fish_analyzer/examine(mob/user) . = ..() . += span_notice("Alt-Click to access the Experiment Configuration UI") @@ -64,24 +68,52 @@ if(!user.can_read(src) || user.is_blind()) return ITEM_INTERACT_BLOCKING - scanned_item = WEAKREF(target) SEND_SIGNAL(src, COMSIG_FISH_ANALYZER_ANALYZE_STATUS, target, user) + if(target != scanned_object) + unregister_scanned() + register_scanned(target) ui_interact(user) return ITEM_INTERACT_SUCCESS -/obj/item/fish_analyzer/ui_interact(mob/user, datum/tgui/ui) - if(isnull(scanned_item?.resolve())) +/obj/item/fish_analyzer/proc/register_scanned(atom/target) + scanned_object = target + RegisterSignal(target, COMSIG_QDELETING, PROC_REF(on_target_deleted)) + +/obj/item/fish_analyzer/proc/unregister_scanned() + if(!scanned_object) + return + UnregisterSignal(scanned_object, COMSIG_QDELETING) + scanned_object = null + +/obj/item/fish_analyzer/proc/on_target_deleted() + SIGNAL_HANDLER + unregister_scanned() + +/obj/item/fish_analyzer/ui_interact(mob/living/user, datum/tgui/ui) + if(isnull(scanned_object)) balloon_alert(user, "no specimen data!") return TRUE + if(istype(user) && !(scanned_object in (view(7, get_turf(src)) | user.get_equipped_items(INCLUDE_HELD)))) + balloon_alert(user, "specimen data lost!") + unregister_scanned() + return TRUE ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "FishAnalyzer") ui.open() -/obj/item/fish_analyzer/ui_static_data(mob/user) +/obj/item/fish_analyzer/ui_status(mob/living/user, datum/ui_state/state) + if(!istype(user)) //observers shouldn't disrupt things. + return ..() + if(!scanned_object || !(scanned_object in (view(7, get_turf(src)) | user.get_equipped_items(INCLUDE_HELD)))) + balloon_alert(user, "specimen data lost!") + unregister_scanned() + return UI_CLOSE + return ..() + +/obj/item/fish_analyzer/ui_data(mob/user) var/list/data = list() - var/atom/scanned_object = scanned_item?.resolve() data["fish_list"] = list() data["fish_scanned"] = FALSE @@ -89,8 +121,7 @@ data["fish_scanned"] = TRUE return extract_fish_info(data, scanned_object) - var/atom/movable/aquarium = scanned_object - for(var/obj/item/fish/fishie in aquarium) + for(var/obj/item/fish/fishie in scanned_object) extract_fish_info(data, fishie) return data @@ -118,20 +149,20 @@ "fish_name" = fishie.name, "fish_icon" = fishie.icon, "fish_icon_state" = fishie.base_icon_state, - "fish_health" = fishie.status == FISH_DEAD ? 0 : PERCENT(fishie.get_health_percentage()), - "fish_size" = fishie.size, - "fish_weight" = fishie.weight, "fish_food" = fishie.food.name, "fish_food_color" = fishie.food::color, "fish_min_temp" = fishie.required_temperature_min, "fish_max_temp" = fishie.required_temperature_max, - "fish_hunger" = HAS_TRAIT(fishie, TRAIT_FISH_NO_HUNGER) ? 0 : 1 - fishie.get_hunger(), "fish_fluid_compatible" = fishie.fish_flags & FISH_FLAG_SAFE_FLUID, "fish_fluid_type" = fishie.required_fluid_type, - "fish_breed_timer" = round(max(fishie.breeding_wait - world.time, 0) / 10), "fish_traits" = fish_traits, "fish_evolutions" = fish_evolutions, "fish_suitable_temp" = fishie.fish_flags & FISH_FLAG_SAFE_TEMPERATURE, + "fish_health" = fishie.status == FISH_DEAD ? 0 : PERCENT(fishie.get_health_percentage()), + "fish_size" = fishie.size, + "fish_weight" = fishie.weight, + "fish_hunger" = HAS_TRAIT(fishie, TRAIT_FISH_NO_HUNGER) ? 0 : 1 - fishie.get_hunger(), + "fish_breed_timer" = round(max(fishie.breeding_wait - world.time, 0) / 10), )) return data diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm index cee4898000fc..ddb9ee99d6ad 100644 --- a/code/modules/fishing/fish/_fish.dm +++ b/code/modules/fishing/fish/_fish.dm @@ -17,8 +17,10 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( // Fish path used for autogenerated fish /obj/item/fish + abstract_type = /obj/item/fish // DARKPACK EDIT ADD - FISHING name = "fish" desc = "very bland" + abstract_type = /obj/item/fish icon = 'icons/obj/aquarium/fish.dmi' lefthand_file = 'icons/mob/inhands/fish_lefthand.dmi' righthand_file = 'icons/mob/inhands/fish_righthand.dmi' @@ -197,8 +199,11 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( var/time_passed_on_safe_turf = 0 /obj/item/fish/Initialize(mapload, apply_qualities = TRUE) - . = ..() + // DARKPACK EDIT CHANGE START + // World icon is getting called before it was setting this, nulling out the sprite because of how its update_icon_state behavoir works base_icon_state = icon_state + . = ..() + // DARKPACK EDIT CHANGE END //It's important that we register the signals before the component is attached. RegisterSignal(src, COMSIG_AQUARIUM_CONTENT_DO_ANIMATION, PROC_REF(update_aquarium_animation)) RegisterSignal(src, COMSIG_AQUARIUM_CONTENT_RANDOMIZE_POSITION, PROC_REF(randomize_aquarium_position)) @@ -220,7 +225,7 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( //Adding this because not all fish have the gore foodtype that makes them automatically eligible for dna infusion. add_traits(list(TRAIT_DUCT_TAPE_UNREPAIRABLE, TRAIT_VALID_DNA_INFUSION), INNATE_TRAIT) - //stops new fish from being able to reproduce right away. + //new fish should be modestly hungry and cannot 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) @@ -231,6 +236,37 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( register_context() register_item_context() + if(!apply_qualities || !PERFORM_ALL_TESTS(focus_only/fish_population) || type == abstract_type || stable_population > 1) + return + if(length(compatible_types)) + for(var/obj/item/fish/fishie as anything in compatible_types) + if(fishie::stable_population > 1) + if(!HAS_TRAIT(src, TRAIT_FISH_RECESSIVE)) + stack_trace("[type] has a stable population of [stable_population] but is compatible with fishes with a higher stable population. \ + However, it doesn't have the [/datum/fish_trait/recessive] trait. Either increase its stable population or add the trait to it.") + return + if(!HAS_TRAIT(src, TRAIT_FISH_NO_MATING) && !HAS_TRAIT(src, TRAIT_FISH_CROSSBREEDER)) + var/list/pick_one = list( + /datum/fish_trait/crossbreeder, + /datum/fish_trait/no_mating, + ) + stack_trace("[type] has a stable_population of [stable_population] but has neither of these traits: [english_list(pick_one)]. \ + Either increase its stable population or add one of these traits to it.") + +/obj/item/fish/grind_results() + SHOULD_NOT_OVERRIDE(TRUE) + + var/list/grind_results = fish_grind_results() + for(var/reagent_type in grind_results) + grind_results[reagent_type] *= max(FLOOR(weight/FISH_GRIND_RESULTS_WEIGHT_DIVISOR, 0.1), 0.1) + + return grind_results + +/obj/item/fish/proc/fish_grind_results() + RETURN_TYPE(/list/datum/reagent) + + return list() + /obj/item/fish/suicide_act(mob/living/user) if(force == 0) user.visible_message(span_suicide("[user] slaps [user.p_them()]self with [src], but nothing happens!")) @@ -241,6 +277,11 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( slapperoni(user, iteration = 1) return MANUAL_SUICIDE +/obj/item/fish/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(attack_type == OVERWHELMING_ATTACK) + return FALSE + return ..() + /obj/item/fish/proc/slapperoni(mob/living/user, iteration) stoplag(0.1 SECONDS) user.visible_message(span_bolddanger(suicide_slap_text)) @@ -291,7 +332,7 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( if(!HAS_TRAIT(interacting_with, TRAIT_CATCH_AND_RELEASE)) return NONE if(HAS_TRAIT(src, TRAIT_NODROP)) - balloon_alert(user, "it's stuck to your hand!") + balloon_alert(user, "[p_theyre()] stuck to your hand!") return ITEM_INTERACT_BLOCKING balloon_alert(user, "releasing fish...") if(!do_after(user, 3 SECONDS, interacting_with)) @@ -299,7 +340,7 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( balloon_alert(user, "fish released") var/goodbye_text = "Bye bye [name]." if(status == FISH_DEAD && !HAS_MIND_TRAIT(user, TRAIT_NAIVE)) - goodbye_text = "May it rest in peace..." + goodbye_text = "May [p_they()] rest in peace..." user.visible_message(span_notice("[user] releases [src] into [interacting_with]"), \ span_notice("You release [src] into [interacting_with]. [goodbye_text]"), \ span_notice("You hear a splash.")) @@ -511,22 +552,25 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( . += span_boldnicegreen("Caught by [catcher_name] on [catch_date].") if(HAS_MIND_TRAIT(user, TRAIT_EXAMINE_FISH) || HAS_TRAIT(loc, TRAIT_EXAMINE_FISH)) - . += span_notice("It's [size] cm long.") - . += span_notice("It weighs [weight] g.") + . += span_notice("[p_theyre(TRUE)] [size] cm long.") + . += span_notice("[p_they(TRUE)] weighs [weight] g.") + + if(HAS_TRAIT(src, TRAIT_FISH_GENEGUNNED)) + . += span_warning("[p_theyve(TRUE)] been edited by a fish genegun. [p_they(TRUE)]'ll die if edited again.") . += get_health_warnings(user, always_deep = FALSE) if(HAS_TRAIT(src, TRAIT_FISHING_BAIT)) - . += span_smallnoticeital("It can be used as a fishing bait.") + . += span_smallnoticeital("[p_they(TRUE)] can be used as a fishing bait.") if(bites_amount) - . += span_warning("It's been bitten by someone.") + . += span_warning("[p_theyve(TRUE)] been bitten by someone.") /obj/item/fish/proc/get_health_warnings(mob/user, always_deep = FALSE) if(!HAS_MIND_TRAIT(user, TRAIT_EXAMINE_DEEPER_FISH) && !always_deep) return if(status == FISH_DEAD) - return span_deadsay("It's [HAS_MIND_TRAIT(user, TRAIT_NAIVE) ? "taking the big snooze" : "dead"].") + return span_deadsay("[p_theyre(TRUE)] [HAS_MIND_TRAIT(user, TRAIT_NAIVE) ? "taking the big snooze" : "dead"].") var/list/warnings = list() if(get_starvation_mult()) @@ -546,7 +590,7 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( warnings += "mostly healthy" if(length(warnings)) - . += span_warning("It's [english_list(warnings)].") + . += span_warning("[p_theyre(TRUE)] [english_list(warnings)].") return . @@ -625,8 +669,6 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( var/make_edible = !weight if(weight) - for(var/reagent_type in grind_results) - grind_results[reagent_type] /= max(FLOOR(weight/FISH_GRIND_RESULTS_WEIGHT_DIVISOR, 0.1), 0.1) if(reagents) //This fish has reagents. Adjust the maximum volume of the reagent holder and do some math to adjut the reagents too. var/new_weight_ratio = new_weight / weight var/volume_diff = reagents.maximum_volume * new_weight_ratio - reagents.maximum_volume @@ -658,9 +700,6 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( var/mob/mob = loc mob.update_equipment_speed_mods() - for(var/reagent_type in grind_results) - grind_results[reagent_type] *= max(FLOOR(weight/FISH_GRIND_RESULTS_WEIGHT_DIVISOR, 0.1), 0.1) - var/mats_len = length(custom_materials) if(update_materials && mats_len) var/list/new_mats_list = custom_materials.Copy() @@ -1075,7 +1114,7 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( balloon_alert(user, "invalid creature!") return if(status != FISH_DEAD) - balloon_alert(user, "it's not dead!") + balloon_alert(user, "[p_theyre(TRUE)] not dead!") return set_status(FISH_ALIVE) injector.expend(src, user) @@ -1274,7 +1313,7 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( return FALSE if(!being_targeted && length(get_aquarium_fishes()) >= AQUARIUM_MAX_BREEDING_POPULATION) return FALSE - return !HAS_TRAIT(loc, TRAIT_STOP_FISH_REPRODUCTION_AND_GROWTH) && get_health_percentage() >= 0.8 && stable_population >= 1 && world.time >= breeding_wait + return !HAS_TRAIT(loc, TRAIT_STOP_FISH_REPRODUCTION_AND_GROWTH) && get_health_percentage() >= 0.8 && world.time >= breeding_wait /obj/item/fish/proc/try_to_reproduce() if(!loc || !HAS_TRAIT(loc, TRAIT_IS_AQUARIUM)) @@ -1286,19 +1325,17 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( if(!HAS_TRAIT(src, TRAIT_FISH_NO_MATING)) var/list/available_fishes = list() SEND_SIGNAL(loc, COMSIG_AQUARIUM_GET_REPRODUCTION_CANDIDATES, src, available_fishes) + available_fishes -= src //self-reproduction goes last if(length(available_fishes)) - //make sure we check if the fish can reproduce with itself last, since that should've lower priority - available_fishes = shuffle(available_fishes) - src - available_fishes += src + available_fishes = shuffle(available_fishes) for(var/obj/item/fish/other_fish as anything in available_fishes) if(other_fish.ready_to_reproduce(TRUE)) second_fish = other_fish break - if(!second_fish || second_fish == src) //check if the fish can self-reproduce in these cases. - if(!HAS_TRAIT(src, TRAIT_FISH_SELF_REPRODUCE)) - return FALSE - second_fish = null //set it to null, since this will make the following operations a bit easier + //check if the fish can self-reproduce if there's no other option + if(!second_fish && !HAS_TRAIT(src, TRAIT_FISH_SELF_REPRODUCE)) + return FALSE if(PERFORM_ALL_TESTS(fish_breeding) && second_fish && !length(evolution_types)) return create_offspring(second_fish.type, second_fish) @@ -1342,6 +1379,9 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( return create_offspring(chosen_type, second_fish, chosen_evolution) +///The timeout multiplier for offspring fish, the ones generated when two compatible fish are coupled +#define OFFSPRING_FISH_BREEDING_TIMEOUT_MULT 2 + /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 @@ -1356,7 +1396,7 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( var/ratio_weight = new_fish.average_size * (((weight / average_weight) + (partner.weight / partner.average_weight)) / 2) var/mean_weight = (weight + partner.weight)/2 new_fish.randomize_size_and_weight((mean_size + ratio_size) * 0.5, (mean_weight + ratio_weight) * 0.5, 0.3, update = FALSE) - partner.breeding_wait = world.time + breeding_timeout + partner.breeding_wait = world.time + partner.breeding_timeout if(length(partner.custom_materials)) if(length(custom_materials)) @@ -1383,8 +1423,12 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( breeding_wait = world.time + breeding_timeout + new_fish.breeding_wait = world.time + new_fish.breeding_timeout * OFFSPRING_FISH_BREEDING_TIMEOUT_MULT + return new_fish +#undef OFFSPRING_FISH_BREEDING_TIMEOUT_MULT + #define PAUSE_BETWEEN_PHASES 15 #define PAUSE_BETWEEN_FLOPS 2 #define FLOP_COUNT 2 @@ -1477,7 +1521,7 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( #define FISH_PRICE_SOFT_CAP_EXPONENT 0.86 ///Returns the price of this fish, for the fish export. -/obj/item/fish/proc/get_export_price(price, elasticity_percent) +/obj/item/fish/proc/get_export_price(price) var/size_weight_exponentation = (size * weight * FISH_PRICE_MULTIPLIER)^FISH_PRICE_CURVE_EXPONENT var/raw_price = price + size_weight_exponentation if(raw_price >= FISH_PRICE_SOFT_CAP_THRESHOLD + 1) @@ -1485,7 +1529,7 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( raw_price = FISH_PRICE_SOFT_CAP_THRESHOLD + soft_cap if(HAS_TRAIT(src, TRAIT_FISH_LOW_PRICE)) //Avoid printing money by simply ordering fish and sending it back. raw_price *= 0.05 - return raw_price * elasticity_percent + return raw_price #undef FISH_PRICE_MULTIPLIER #undef FISH_PRICE_CURVE_EXPONENT @@ -1547,7 +1591,7 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( else user.visible_message( span_warning("[src] bites [user]'s hand!"), - span_warning("You pet [src] as you hold it, only for [p_them()] to happily bite back!"), + span_warning("You pet [src] as you hold [p_they()], only for [p_them()] to happily bite back!"), vision_distance = DEFAULT_MESSAGE_RANGE - 3, ) var/body_zone = pick(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM) @@ -1557,7 +1601,7 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( if(in_aquarium) to_chat(user, span_notice("[src] dances around!")) else - to_chat(user, span_notice("You pet [src] as you hold it.")) + to_chat(user, span_notice("You pet [src] as you hold [p_they()].")) user.add_mood_event("petted_fish", /datum/mood_event/fish_petting, src, HAS_MIND_TRAIT(user, TRAIT_MORBID)) playsound(src, 'sound/items/weapons/thudswoosh.ogg', 30, TRUE, -1) addtimer(CALLBACK(src, PROC_REF(undo_petted)), 30 SECONDS) @@ -1582,7 +1626,7 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( if(!probability_table) probability_table = list() var/chance_table = list() - for(var/_fish_type in subtypesof(/obj/item/fish)) + for(var/_fish_type in valid_subtypesof(/obj/item/fish)) // DARKPACK EDIT CHANGE - FISHING var/obj/item/fish/fish = _fish_type var/rarity = initial(fish.random_case_rarity) if(!rarity) diff --git a/code/modules/fishing/fish/fish_traits.dm b/code/modules/fishing/fish/fish_traits.dm index e5ea3d978076..71243f571c59 100644 --- a/code/modules/fishing/fish/fish_traits.dm +++ b/code/modules/fishing/fish/fish_traits.dm @@ -37,6 +37,8 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) var/added_difficulty = 0 /// Reagents to add to the fish whenever the COMSIG_GENERATE_REAGENTS_TO_ADD signal is sent. Their values will be multiplied later. var/list/reagents_to_add + /// Trait/s to add on apply_to_fish() and remove on remove_from_fish() + var/list/traits_to_add /// If set, the fish may return this infusion entry when get_infusion_entry is called instead of /datum/infuser_entry/fish var/infusion_entry @@ -55,16 +57,35 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) return /// Applies some special qualities to the fish that has been spawned -/datum/fish_trait/proc/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/proc/apply_to_fish(obj/item/fish/fish, initial = TRUE) SHOULD_CALL_PARENT(TRUE) + if(!initial) + if(type in fish.fish_traits) + return FALSE + if(!isnull(fish_whitelist) && !(fish.type in fish_whitelist)) + return FALSE + if(length(fish.fish_traits & incompatible_traits)) + return FALSE + fish.fish_traits |= type + if(traits_to_add) + fish.add_traits(traits_to_add, FISH_TRAIT_DATUM) if(length(reagents_to_add)) RegisterSignal(fish, COMSIG_GENERATE_REAGENTS_TO_ADD, PROC_REF(add_reagents)) + return TRUE /// Applies some special qualities to basic mobs generated by fish (i.e. chasm chrab --> young lobstrosity --> lobstrosity). /datum/fish_trait/proc/apply_to_mob(mob/living/basic/mob) SHOULD_CALL_PARENT(TRUE) RegisterSignal(mob, COMSIG_MOB_CHANGED_TYPE, PROC_REF(on_transformed)) +/datum/fish_trait/proc/remove_from_fish(obj/item/fish/fish) + SHOULD_CALL_PARENT(TRUE) + fish.fish_traits -= type + if(traits_to_add) + fish.remove_traits(traits_to_add, FISH_TRAIT_DATUM) + if(length(reagents_to_add)) + UnregisterSignal(fish, COMSIG_GENERATE_REAGENTS_TO_ADD, PROC_REF(add_reagents)) + /datum/fish_trait/proc/on_transformed(mob/source, mob/desired_mob) SIGNAL_HANDLER apply_to_mob(desired_mob) @@ -97,11 +118,13 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) source.AddElement(/datum/element/venomous, venom_path, new_amount) /// Proc that changes the venomous element based on if the fish is alive or dead (basically dead fish are weaker). -/datum/fish_trait/proc/change_venom_on_death(obj/item/fish/source, venom_path, live_mult, dead_mult) +/datum/fish_trait/proc/change_venom(obj/item/fish/source, venom_path, live_mult, dead_mult, just_remove = FALSE) var/live_amount = max(round((source.weight/FISH_GRIND_RESULTS_WEIGHT_DIVISOR) * live_mult, 0.1), live_mult) var/dead_amount = max(round((source.weight/FISH_GRIND_RESULTS_WEIGHT_DIVISOR) * dead_mult, 0.1), dead_mult) var/is_dead = source.status == FISH_DEAD source.RemoveElement(/datum/element/venomous, venom_path, is_dead ? live_amount : dead_amount, thrown_effect = TRUE) + if(just_remove) + return source.AddElement(/datum/element/venomous, venom_path, is_dead ? dead_amount : live_amount, thrown_effect = TRUE) /datum/fish_trait/wary @@ -176,10 +199,14 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) if(light_amount > SHADOW_SPECIES_LIGHT_THRESHOLD) .[MULTIPLICATIVE_FISHING_MOD] = 0 -/datum/fish_trait/nocturnal/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/nocturnal/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() RegisterSignal(fish, COMSIG_FISH_LIFE, PROC_REF(check_light)) +/datum/fish_trait/nocturnal/remove_from_fish(obj/item/fish/fish) + . = ..() + UnregisterSignal(fish, COMSIG_FISH_LIFE) + /datum/fish_trait/nocturnal/proc/check_light(obj/item/fish/source, seconds_per_tick) SIGNAL_HANDLER if(!source.loc || (!HAS_TRAIT(source.loc, TRAIT_IS_AQUARIUM) && !isturf(source.loc))) @@ -285,12 +312,15 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) name = "Emulsifier" catalog_description = "This fish emits an invisible toxin that emulsifies other fish for it to feed on." var/list/resistance_traits = list(TRAIT_RESIST_EMULSIFY, TRAIT_FISH_TOXIN_IMMUNE) - var/trait_to_add = TRAIT_RESIST_EMULSIFY + traits_to_add = list(TRAIT_RESIST_EMULSIFY) -/datum/fish_trait/emulsijack/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/emulsijack/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() RegisterSignal(fish, COMSIG_FISH_LIFE, PROC_REF(emulsify)) - ADD_TRAIT(fish, trait_to_add, FISH_TRAIT_DATUM) + +/datum/fish_trait/emulsijack/remove_from_fish(obj/item/fish/fish) + . = ..() + UnregisterSignal(fish, COMSIG_FISH_LIFE) /datum/fish_trait/emulsijack/proc/emulsify(obj/item/fish/source, seconds_per_tick) SIGNAL_HANDLER @@ -327,7 +357,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) name = "Psychic Aura" catalog_description = "This fish emits an almost unblockable psychic aura that assaults minds, slowly killing all nearby fish and making humanoids have a bad time." resistance_traits = list(TRAIT_RESIST_PSYCHIC) - trait_to_add = TRAIT_RESIST_PSYCHIC + traits_to_add = list(TRAIT_RESIST_PSYCHIC) /datum/fish_trait/emulsijack/psychic/on_non_stasis_life(mob/living/basic/mob, seconds_per_tick) return @@ -337,13 +367,17 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) 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) +/datum/fish_trait/necrophage/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() RegisterSignal(fish, COMSIG_FISH_LIFE, PROC_REF(eat_dead_fishes)) +/datum/fish_trait/necrophage/remove_from_fish(obj/item/fish/fish) + . = ..() + UnregisterSignal(fish, COMSIG_FISH_LIFE) + /datum/fish_trait/necrophage/proc/eat_dead_fishes(obj/item/fish/source, seconds_per_tick) SIGNAL_HANDLER - if(source.get_hunger() > 0.75 || !source.loc || !HAS_TRAIT(source.loc, TRAIT_IS_AQUARIUM)) + if(source.get_hunger() < 0.75 || !source.loc || !HAS_TRAIT(source.loc, TRAIT_IS_AQUARIUM)) return for(var/obj/item/fish/victim in source.loc) if(victim.status != FISH_DEAD || victim == source || HAS_TRAIT(victim, TRAIT_YUCKY_FISH)) @@ -355,10 +389,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) name = "Parthenogenesis" catalog_description = "This fish can reproduce asexually, without the need of a mate." inheritability = 40 - -/datum/fish_trait/parthenogenesis/apply_to_fish(obj/item/fish/fish) - . = ..() - ADD_TRAIT(fish, TRAIT_FISH_SELF_REPRODUCE, FISH_TRAIT_DATUM) + traits_to_add = list(TRAIT_FISH_SELF_REPRODUCE) /** * Useful for those species with the parthenogenesis trait if you don't want them to mate with each other, @@ -374,30 +405,28 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /obj/item/fish/fryish/fritterish = 0, /obj/item/fish/fryish/nessie = 0 ) - -/datum/fish_trait/no_mating/apply_to_fish(obj/item/fish/fish) - . = ..() - ADD_TRAIT(fish, TRAIT_FISH_NO_MATING, FISH_TRAIT_DATUM) + traits_to_add = list(TRAIT_FISH_NO_MATING) ///Prevent offsprings of fish with this trait from being of the same type (unless self-mating or the partner also has the trait) /datum/fish_trait/recessive name = "Recessive" catalog_description = "If crossbred, offsprings will always be of the mate species, unless it also possess the trait." inheritability = 0 - -/datum/fish_trait/no_mating/apply_to_fish(obj/item/fish/fish) - . = ..() - ADD_TRAIT(fish, TRAIT_FISH_RECESSIVE, FISH_TRAIT_DATUM) + traits_to_add = list(TRAIT_FISH_RECESSIVE) /datum/fish_trait/revival name = "Self-Revival" catalog_description = "This fish shows a peculiar ability of reviving itself a minute or two after death." spontaneous_manifest_types = list(/obj/item/fish/boned = 100, /obj/item/fish/mastodon = 100) -/datum/fish_trait/revival/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/revival/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() RegisterSignal(fish, COMSIG_FISH_STATUS_CHANGED, PROC_REF(check_status)) +/datum/fish_trait/revival/remove_from_fish(obj/item/fish/fish) + . = ..() + UnregisterSignal(fish, COMSIG_FISH_STATUS_CHANGED, FISH_TRAIT_DATUM) + /datum/fish_trait/revival/proc/check_status(obj/item/fish/source) SIGNAL_HANDLER if(source.status == FISH_DEAD) @@ -405,7 +434,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /datum/fish_trait/revival/proc/revive(datum/weakref/fish_ref) var/obj/item/fish/source = fish_ref.resolve() - if(QDELETED(source) || source.status != FISH_DEAD) + if(QDELETED(source) || source.status != FISH_DEAD || !(type in source.fish_traits)) return source.set_status(FISH_ALIVE) var/message = span_nicegreen("[source] twitches. It's alive!") @@ -428,18 +457,22 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) if(isfish(rod.bait)) .[MULTIPLICATIVE_FISHING_MOD] *= 2 -/datum/fish_trait/predator/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/predator/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() RegisterSignal(fish, COMSIG_FISH_LIFE, PROC_REF(eat_fishes)) +/datum/fish_trait/predator/remove_from_fish(obj/item/fish/fish) + . = ..() + UnregisterSignal(fish, COMSIG_FISH_LIFE) + /datum/fish_trait/predator/proc/eat_fishes(obj/item/fish/source, seconds_per_tick) SIGNAL_HANDLER - if(source.get_hunger() > 0.75 || !source.loc || !HAS_TRAIT(source.loc, TRAIT_IS_AQUARIUM)) + if(source.get_hunger() < 0.75 || !source.loc || !HAS_TRAIT(source.loc, TRAIT_IS_AQUARIUM)) return for(var/obj/item/fish/victim as anything in source.get_aquarium_fishes(TRUE, source)) - if(victim.size < source.size * 0.7) // It's a big fish eat small fish world + if(victim.size >= source.size * 0.7) // 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)) + if(victim.status != FISH_ALIVE || HAS_TRAIT(victim, TRAIT_YUCKY_FISH) || SPT_PROB(80, seconds_per_tick)) continue eat_fish(source, victim) return @@ -448,10 +481,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) name = "Yucky" catalog_description = "This fish tastes so repulsive, other fishes won't try to eat it." reagents_to_add = list(/datum/reagent/yuck = 1.2) - -/datum/fish_trait/yucky/apply_to_fish(obj/item/fish/fish) - . = ..() - ADD_TRAIT(fish, TRAIT_YUCKY_FISH, FISH_TRAIT_DATUM) + traits_to_add = list(TRAIT_YUCKY_FISH) /datum/fish_trait/toxic name = "Toxic" @@ -461,11 +491,18 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) ///The amount of venom injected if the fish has a stinger is multiplied by this value. var/venom_mult = 1 -/datum/fish_trait/toxic/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/toxic/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() RegisterSignal(fish, COMSIG_FISH_UPDATE_SIZE_AND_WEIGHT, PROC_REF(make_venomous)) RegisterSignal(fish, COMSIG_FISH_STATUS_CHANGED, PROC_REF(on_status_change)) RegisterSignal(fish, COMSIG_FISH_EATEN_BY_OTHER_FISH, PROC_REF(on_eaten)) + if(!initial) + make_venomous(fish, fish.size, fish.weight) + +/datum/fish_trait/toxic/remove_from_fish(obj/item/fish/fish) + . = ..() + UnregisterSignal(fish, list(COMSIG_FISH_UPDATE_SIZE_AND_WEIGHT, COMSIG_FISH_STATUS_CHANGED, COMSIG_FISH_EATEN_BY_OTHER_FISH)) + change_venom(fish, reagents_to_add[1], 0.25 * venom_mult, 0.1 * venom_mult, just_remove = TRUE) /datum/fish_trait/toxic/proc/make_venomous(obj/item/fish/source, new_size, new_weight) SIGNAL_HANDLER @@ -477,7 +514,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) SIGNAL_HANDLER if(!HAS_TRAIT(source, TRAIT_FISH_STINGER)) return - change_venom_on_death(source, reagents_to_add[1], 0.25 * venom_mult, 0.1 * venom_mult) + change_venom(source, reagents_to_add[1], 0.25 * venom_mult, 0.1 * venom_mult) /datum/fish_trait/toxic/proc/on_eaten(obj/item/fish/source, obj/item/fish/predator) if(HAS_TRAIT(predator, TRAIT_FISH_TOXIN_IMMUNE)) @@ -508,29 +545,27 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /datum/fish_trait/toxin_immunity name = "Toxin Immunity" catalog_description = "This fish has developed an ample-spected immunity to toxins." - -/datum/fish_trait/toxin_immunity/apply_to_fish(obj/item/fish/fish) - . = ..() - ADD_TRAIT(fish, TRAIT_FISH_TOXIN_IMMUNE, FISH_TRAIT_DATUM) + traits_to_add = list(TRAIT_FISH_TOXIN_IMMUNE) /datum/fish_trait/crossbreeder name = "Crossbreeder" catalog_description = "This fish's adaptive genetics allows it to crossbreed with other fish species." inheritability = 40 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) + traits_to_add = list(TRAIT_FISH_CROSSBREEDER) /datum/fish_trait/territorial name = "Territorial" catalog_description = "This fish will start attacking other fish if the aquarium has five or more." -/datum/fish_trait/territorial/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/territorial/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() RegisterSignal(fish, COMSIG_FISH_LIFE, PROC_REF(try_attack_fish)) +/datum/fish_trait/territorial/remove_from_fish(obj/item/fish/fish) + . = ..() + UnregisterSignal(fish, COMSIG_FISH_LIFE) + /datum/fish_trait/territorial/proc/try_attack_fish(obj/item/fish/source, seconds_per_tick) SIGNAL_HANDLER if(!source.loc || !HAS_TRAIT(source.loc, TRAIT_IS_AQUARIUM) || !SPT_PROB(1, seconds_per_tick)) @@ -558,10 +593,14 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) if(istype(rod.get_master_material(), /datum/material/bananium)) //x5 chance of catching lubefish & co with a bananium rod. .[MULTIPLICATIVE_FISHING_MOD] *= 5 -/datum/fish_trait/lubed/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/lubed/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() fish.AddComponent(/datum/component/slippery, 8 SECONDS, SLIDE|GALOSHES_DONT_HELP) +/datum/fish_trait/lubed/remove_from_fish(obj/item/fish/fish) + . = ..() + qdel(fish.GetComponent(/datum/component/slippery)) + /datum/fish_trait/lubed/apply_to_mob(mob/living/basic/mob) . = ..() mob.AddElement(/datum/element/lube_walking) @@ -574,13 +613,17 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) name = "Amphibious" catalog_description = "This fish has developed a primitive adaptation to life on both land and water." infusion_entry = /datum/infuser_entry/amphibious + traits_to_add = list(TRAIT_FISH_AMPHIBIOUS) -/datum/fish_trait/amphibious/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/amphibious/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() - 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/amphibious/remove_from_fish(obj/item/fish/fish) + . = ..() + fish.required_fluid_type = initial(fish.required_fluid_type) + /datum/fish_trait/amphibious/apply_to_mob(mob/living/basic/mob) . = ..() ADD_TRAIT(mob, TRAIT_NODROWN, FISH_TRAIT_DATUM) @@ -589,10 +632,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) name = "Mixotroph" 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/mixotroph/apply_to_fish(obj/item/fish/fish) - . = ..() - ADD_TRAIT(fish, TRAIT_FISH_NO_HUNGER, FISH_TRAIT_DATUM) + traits_to_add = list(TRAIT_FISH_NO_HUNGER) /datum/fish_trait/antigrav name = "Anti-Gravity" @@ -603,10 +643,14 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /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) +/datum/fish_trait/antigrav/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() fish.AddElement(/datum/element/forced_gravity, NEGATIVE_GRAVITY) +/datum/fish_trait/antigrav/remove_from_fish(obj/item/fish/fish) + . = ..() + fish.RemoveElement(/datum/element/forced_gravity, NEGATIVE_GRAVITY) + /datum/fish_trait/antigrav/apply_to_mob(mob/living/basic/mob) . = ..() mob.add_traits(list(TRAIT_FREE_HYPERSPACE_MOVEMENT, TRAIT_SPACEWALK), FISH_TRAIT_DATUM) @@ -624,9 +668,13 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) if(rod.line && (rod.line.fishing_line_traits & FISHING_LINE_CLOAKED)) .[ADDITIVE_FISHING_MOD] -= FISH_TRAIT_MINOR_DIFFICULTY_BOOST -/datum/fish_trait/anxiety/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/anxiety/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() - RegisterSignal(fish, COMSIG_FISH_LIFE, PROC_REF(on_fish_life)) + UnregisterSignal(fish, COMSIG_FISH_LIFE, PROC_REF(on_fish_life)) + +/datum/fish_trait/anxiety/remove_from_fish(obj/item/fish/fish) + . = ..() + UnregisterSignal(fish, COMSIG_FISH_LIFE) ///signal sent when the anxiety fish is fed, killing it if sharing contents with too many fish. /datum/fish_trait/anxiety/proc/on_fish_life(obj/item/fish/fish, seconds_per_tick) @@ -645,12 +693,19 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) name = "Electrogenesis" catalog_description = "This fish is electroreceptive, and will generate electric fields. Can be harnessed inside a bioelectric generator." reagents_to_add = list(/datum/reagent/consumable/liquidelectricity = 1.5) + traits_to_add = list(TRAIT_FISH_ELECTROGENESIS) -/datum/fish_trait/electrogenesis/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/electrogenesis/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() - ADD_TRAIT(fish, TRAIT_FISH_ELECTROGENESIS, FISH_TRAIT_DATUM) RegisterSignal(fish, COMSIG_FISH_FORCE_UPDATED, PROC_REF(on_force_updated)) RegisterSignals(fish, list(COMSIG_ITEM_FRIED, TRAIT_FOOD_BBQ_GRILLED), PROC_REF(on_fish_cooked)) + if(!initial) + fish.update_fish_force() + +/datum/fish_trait/electrogenesis/remove_from_fish(obj/item/fish/fish) + . = ..() + UnregisterSignal(fish, list(COMSIG_FISH_FORCE_UPDATED, COMSIG_ITEM_FRIED, TRAIT_FOOD_BBQ_GRILLED)) + fish.update_fish_force() /datum/fish_trait/electrogenesis/proc/on_fish_cooked(obj/item/fish/fish, cooked_time) SIGNAL_HANDLER @@ -703,11 +758,18 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /obj/item/fish/chainsawfish = 100, /obj/item/fish/pike/armored = 100, ) + traits_to_add = list(TRAIT_FISH_STINGER) -/datum/fish_trait/stinger/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/stinger/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() - ADD_TRAIT(fish, TRAIT_FISH_STINGER, FISH_TRAIT_DATUM) RegisterSignal(fish, COMSIG_FISH_FORCE_UPDATED, PROC_REF(on_force_updated)) + if(!initial) + fish.update_fish_force() + +/datum/fish_trait/stinger/remove_from_fish(obj/item/fish/fish) + . = ..() + UnregisterSignal(fish, COMSIG_FISH_FORCE_UPDATED) + fish.update_fish_force() /datum/fish_trait/stinger/proc/on_force_updated(obj/item/fish/fish, weight_rank, bonus_or_malus) SIGNAL_HANDLER @@ -715,20 +777,26 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /datum/fish_trait/toxic_barbs name = "Toxic Barbs" - catalog_description = "This fish' stinger, bill or otherwise, is coated with simple, yet effective venom." + catalog_description = "The stinger or bill of this fish is coated in a simple, yet effective venom." spontaneous_manifest_types = list(/obj/item/fish/stingray = 35) -/datum/fish_trait/toxic_barbs/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/toxic_barbs/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() RegisterSignal(fish, COMSIG_FISH_UPDATE_SIZE_AND_WEIGHT, PROC_REF(make_venomous)) RegisterSignal(fish, COMSIG_FISH_STATUS_CHANGED, PROC_REF(on_status_change)) + if(!initial) + make_venomous(fish, fish.size, fish.weight) + +/datum/fish_trait/toxic_barbs/remove_from_fish(obj/item/fish/fish) + . = ..() + UnregisterSignal(fish, list(COMSIG_FISH_UPDATE_SIZE_AND_WEIGHT, COMSIG_FISH_STATUS_CHANGED)) + change_venom(fish, /datum/reagent/toxin/venom, 0.7, 0.3, just_remove = TRUE) /datum/fish_trait/toxic_barbs/proc/make_venomous(obj/item/fish/source, new_size, new_weight) SIGNAL_HANDLER if(!HAS_TRAIT(source, TRAIT_FISH_STINGER)) ///Remove the trait from the fish so it doesn't show on the analyzer as it doesn't do anything on stingerless ones. - source.fish_traits -= type - UnregisterSignal(source, list(COMSIG_FISH_UPDATE_SIZE_AND_WEIGHT, COMSIG_FISH_STATUS_CHANGED)) + remove_from_fish(source) return add_venom(source, /datum/reagent/toxin/venom, new_weight, mult = source.status == FISH_DEAD ? 0.3 : 0.7) @@ -736,7 +804,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) SIGNAL_HANDLER if(!HAS_TRAIT(source, TRAIT_FISH_STINGER)) return - change_venom_on_death(source, /datum/reagent/toxin/venom, 0.7, 0.3) + change_venom(source, /datum/reagent/toxin/venom, 0.7, 0.3) /datum/fish_trait/hallucinogenic name = "Hallucinogenic" @@ -747,10 +815,17 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) if(!HAS_TRAIT(src, TRAIT_FOOD_FRIED) && !HAS_TRAIT(src, TRAIT_FOOD_BBQ_GRILLED)) return ..() -/datum/fish_trait/hallucinogenic/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/hallucinogenic/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() RegisterSignal(fish, COMSIG_FISH_UPDATE_SIZE_AND_WEIGHT, PROC_REF(make_venomous)) RegisterSignal(fish, COMSIG_FISH_STATUS_CHANGED, PROC_REF(on_status_change)) + if(!initial) + make_venomous(fish, fish.size, fish.weight) + +/datum/fish_trait/hallucinogenic/remove_from_fish(obj/item/fish/fish) + . = ..() + UnregisterSignal(fish, list(COMSIG_FISH_UPDATE_SIZE_AND_WEIGHT, COMSIG_FISH_STATUS_CHANGED)) + change_venom(fish, /datum/reagent/toxin/mindbreaker/fish, 0.7, 0.3, just_remove = TRUE) /datum/fish_trait/hallucinogenic/proc/make_venomous(obj/item/fish/source, new_size, new_weight) SIGNAL_HANDLER @@ -765,7 +840,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) SIGNAL_HANDLER if(!HAS_TRAIT(source, TRAIT_FISH_STINGER)) return - change_venom_on_death(source, /datum/reagent/toxin/mindbreaker/fish, 0.7, 0.3) + change_venom(source, /datum/reagent/toxin/mindbreaker/fish, 0.7, 0.3) /datum/fish_trait/ink name = "Ink Production" @@ -773,11 +848,15 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) spontaneous_manifest_types = list(/obj/item/fish/squid = 35) infusion_entry = /datum/infuser_entry/squid -/datum/fish_trait/ink/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/ink/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() RegisterSignal(fish, COMSIG_ATOM_PROCESSED, PROC_REF(on_process)) RegisterSignal(fish, COMSIG_ITEM_ATTACK_ZONE, PROC_REF(attacked_someone)) +/datum/fish_trait/ink/remove_from_fish(obj/item/fish/fish) + . = ..() + UnregisterSignal(fish, list(COMSIG_ATOM_PROCESSED, COMSIG_ITEM_ATTACK_ZONE)) + /datum/fish_trait/ink/proc/attacked_someone(obj/item/fish/source, mob/living/target, mob/living/user, zone) SIGNAL_HANDLER if(HAS_TRAIT(source, TRAIT_FISH_INK_ON_COOLDOWN) || source.status == FISH_DEAD) @@ -808,11 +887,16 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /datum/fish_trait/camouflage/minigame_mod(obj/item/fishing_rod/rod, mob/fisherman, datum/fishing_challenge/minigame) minigame.special_effects |= FISHING_MINIGAME_RULE_CAMO -/datum/fish_trait/camouflage/apply_to_fish(obj/item/fish/fish) +/datum/fish_trait/camouflage/apply_to_fish(obj/item/fish/fish, initial = TRUE) . = ..() RegisterSignal(fish, COMSIG_FISH_LIFE, PROC_REF(fade_out)) RegisterSignals(fish, list(COMSIG_MOVABLE_MOVED, COMSIG_FISH_STATUS_CHANGED), PROC_REF(reset_alpha)) +/datum/fish_trait/camouflage/remove_from_fish(obj/item/fish/fish) + . = ..() + UnregisterSignal(fish, list(COMSIG_FISH_LIFE, COMSIG_MOVABLE_MOVED, COMSIG_FISH_STATUS_CHANGED)) + reset_alpha(fish) + /datum/fish_trait/camouflage/proc/fade_out(obj/item/fish/source, seconds_per_tick) SIGNAL_HANDLER if(source.status == FISH_DEAD || source.last_move + 5 SECONDS >= world.time) diff --git a/code/modules/fishing/fish/types/air_space.dm b/code/modules/fishing/fish/types/air_space.dm index 82587fca6fc7..d45270e28697 100644 --- a/code/modules/fishing/fish/types/air_space.dm +++ b/code/modules/fishing/fish/types/air_space.dm @@ -29,6 +29,7 @@ average_size = 60 average_weight = 1000 weight_size_deviation = 0.1 + stable_population = 5 required_fluid_type = AQUARIUM_FLUID_SALTWATER required_temperature_min = MIN_AQUARIUM_TEMP+20 required_temperature_max = MIN_AQUARIUM_TEMP+40 @@ -86,7 +87,6 @@ safe_air_limits = null min_pressure = 0 max_pressure = INFINITY - grind_results = list(/datum/reagent/bluespace = 10) fillet_type = null fish_traits = list(/datum/fish_trait/antigrav, /datum/fish_trait/mixotroph) compatible_types = list(/obj/item/fish/starfish/chrystarfish) @@ -96,6 +96,9 @@ . = ..() update_appearance(UPDATE_OVERLAYS) +/obj/item/fish/starfish/fish_grind_results() + return list(/datum/reagent/bluespace = 10) + /obj/item/fish/starfish/update_overlays() . = ..() . += add_emissive() diff --git a/code/modules/fishing/fish/types/mining.dm b/code/modules/fishing/fish/types/mining.dm index 4a701dd72cc2..943e5cf84f5f 100644 --- a/code/modules/fishing/fish/types/mining.dm +++ b/code/modules/fishing/fish/types/mining.dm @@ -126,7 +126,6 @@ min_pressure = HAZARD_LOW_PRESSURE max_integrity = 300 stable_population = 3 - grind_results = list(/datum/reagent/bone_dust = 10) fillet_type = /obj/item/stack/sheet/bone num_fillets = 2 fish_traits = list(/datum/fish_trait/revival, /datum/fish_trait/carnivore) @@ -140,6 +139,9 @@ . = ..() ADD_TRAIT(src, TRAIT_FISH_MADE_OF_BONE, INNATE_TRAIT) +/obj/item/fish/boned/fish_grind_results() + return list(/datum/reagent/bone_dust = 10) + /obj/item/fish/boned/make_edible(weight_val) return //it's all bones and no meat. @@ -182,6 +184,7 @@ /datum/fish_trait/carnivore, /datum/fish_trait/heavy, ) + stable_population = 5 compatible_types = list(/obj/item/fish/lavaloop/plasma_river) evolution_types = list(/datum/fish_evolution/plasmaloop) hitsound = null @@ -204,6 +207,7 @@ sound_on_success = 'sound/items/weapons/parry.ogg',\ effect_on_success = /obj/effect/temp_visual/guardian/phase,\ ) + AddElement(/datum/element/raptor_food, attack_modifier = 1.5, growth_modifier = -0.075) /obj/item/fish/lavaloop/get_fish_taste() return list("chewy fish" = 2) diff --git a/code/modules/fishing/fish/types/rift.dm b/code/modules/fishing/fish/types/rift.dm index ba6a0142ed44..8e2a35e1f1ed 100644 --- a/code/modules/fishing/fish/types/rift.dm +++ b/code/modules/fishing/fish/types/rift.dm @@ -350,7 +350,7 @@ /obj/item/fish/gullion name = "gullion" fish_id = "gullion" - desc = "This crystalline fish is actually one of only two known silicon-based lifeforms.\ + desc = "This crystalline fish is actually one of only two known silicon-based lifeforms. \ It avoids death via oxygen-silicate reactions by organically shielding its exterior, allowing the thick scales to calcify into quartz and diamond, at the cost of rendering the fish functionally blind. \ How xenomorphs manage is a complete mystery bordering on bullshit." icon = 'icons/obj/aquarium/rift.dmi' @@ -454,7 +454,7 @@ max_pressure = INFINITY safe_air_limits = list() fillet_type = /obj/item/food/badrecipe/moldy/bacteria - stable_population = 0 + stable_population = 2 /obj/item/fish/mossglob/Initialize(mapload, apply_qualities) . = ..() @@ -588,7 +588,7 @@ voice_of_god(psychic_speech, user, list("big", "alertalien"), base_multiplier = 5, include_speaker = TRUE, forced = TRUE, ignore_spam = TRUE) psy_wail() - user.adjustOrganLoss(ORGAN_SLOT_BRAIN, INFINITY, INFINITY, ORGAN_SLOT_BRAIN) + user.adjust_organ_loss(ORGAN_SLOT_BRAIN, INFINITY, INFINITY, ORGAN_SLOT_BRAIN) user.death() return MANUAL_SUICIDE @@ -652,7 +652,7 @@ if(iscarbon(screeched)) var/mob/living/carbon/carbon_screeched = screeched carbon_screeched.vomit(MOB_VOMIT_MESSAGE) - carbon_screeched.adjustOrganLoss(ORGAN_SLOT_BRAIN, 50) + carbon_screeched.adjust_organ_loss(ORGAN_SLOT_BRAIN, 50) var/affected = 0 for(var/obj/item/fish/fishie in range(7, src)) @@ -705,7 +705,7 @@ now_fixed = span_noticealien("The psychic noise starts to fade.") low_threshold_cleared = span_noticealien("The whispers leave you alone.") - bang_protect = 5 + bang_protect = EAR_PROTECTION_VACUUM damage_multiplier = 0.1 visual = TRUE /// Overlay for the mob sprite because actual organ overlays are a fucking unusable nightmare @@ -815,7 +815,7 @@ /obj/item/organ/ears/babbelfish/proc/on_drain_magic(mob/user) to_chat(user, span_noticealien("Your [src] pop as they protect your mind from psychic phenomena!")) - adjustEarDamage(ddeaf = 20) + adjust_temporary_deafness(40 SECONDS) /obj/item/organ/ears/babbelfish/proc/on_expire(mob/user) to_chat(user, span_noticealien("Your [src] suddenly burst apart!")) diff --git a/code/modules/fishing/fish/types/ruins.dm b/code/modules/fishing/fish/types/ruins.dm index 83d890ea9919..8654d45538f7 100644 --- a/code/modules/fishing/fish/types/ruins.dm +++ b/code/modules/fishing/fish/types/ruins.dm @@ -15,8 +15,7 @@ required_fluid_type = AQUARIUM_FLUID_ANY_WATER min_pressure = HAZARD_LOW_PRESSURE max_integrity = 600 - stable_population = 1 //This means they can only crossbreed. - grind_results = list(/datum/reagent/bone_dust = 5, /datum/reagent/consumable/liquidgibs = 5) + stable_population = 2 fillet_type = /obj/item/stack/sheet/bone num_fillets = 2 feeding_frequency = 2 MINUTES @@ -31,6 +30,9 @@ . = ..() ADD_TRAIT(src, TRAIT_FISH_MADE_OF_BONE, INNATE_TRAIT) +/obj/item/fish/mastodon/fish_grind_results() + return list(/datum/reagent/bone_dust = 5, /datum/reagent/consumable/liquidgibs = 5) + /obj/item/fish/mastodon/make_edible(weight_val) return //it's all bones and gibs. diff --git a/code/modules/fishing/fish_catalog.dm b/code/modules/fishing/fish_catalog.dm index dd7a03cc53b5..6a36be8c912d 100644 --- a/code/modules/fishing/fish_catalog.dm +++ b/code/modules/fishing/fish_catalog.dm @@ -21,7 +21,7 @@ var/static/fish_info if(!fish_info) fish_info = list() - for(var/obj/item/fish/fish as anything in subtypesof(/obj/item/fish)) + for(var/obj/item/fish/fish as anything in valid_subtypesof(/obj/item/fish)) // DARKPACK EDIT CHANGE - FISHING if(!(initial(fish.fish_flags) & FISH_FLAG_SHOW_IN_CATALOG)) continue var/list/fish_data = list() diff --git a/code/modules/fishing/fish_mount.dm b/code/modules/fishing/fish_mount.dm index 903a08801f4d..24c1482812ac 100644 --- a/code/modules/fishing/fish_mount.dm +++ b/code/modules/fishing/fish_mount.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/wallmounts.dmi' icon_state = "fish_mount_item" result_path = /obj/structure/fish_mount - custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) pixel_shift = 31 ///Reference to the persistent_id of the mount this was spawned from. var/persistence_id @@ -34,13 +34,12 @@ /// Trophies from persistence have a good chance to be dusted if removal is attempted, though rarely it pays off. var/persistence_loaded_fish = FALSE -/obj/structure/fish_mount/Initialize(mapload, floor_to_wall_dir) +/obj/structure/fish_mount/Initialize(mapload) . = ..() //Mounted fish shouldn't flop. It should also show size and weight to everyone. add_traits(list(TRAIT_STOP_FISH_FLOPPING, TRAIT_EXAMINE_FISH), INNATE_TRAIT) - if(floor_to_wall_dir) - setDir(floor_to_wall_dir) - find_and_hang_on_wall() + if(mapload) + find_and_mount_on_atom() if(!persistence_id) return if(SSfishing.initialized) @@ -70,7 +69,8 @@ return ITEM_INTERACT_SUCCESS /obj/structure/fish_mount/proc/add_first_fish() - var/obj/item/fish/fish_path = pick(subtypesof(/obj/item/fish) - list(typesof(/obj/item/fish/holo) + list(/obj/item/fish/starfish/chrystarfish))) // chrystarfish immediately shatters when placed + var/list/valid_picks = valid_subtypesof(/obj/item/fish) - typesof(/obj/item/fish/holo) - /obj/item/fish/starfish/chrystarfish // chrystarfish immediately shatters when placed // DARKPACK EDIT CHANGE - FISHING + var/obj/item/fish/fish_path = pick(valid_picks) if(fish_path.fish_id_redirect_path) fish_path = fish_path.fish_id_redirect_path var/fluff_name = pick("John Trasen III", "a nameless intern", "Pun Pun", AQUARIUM_COMPANY, "Unknown", "Central Command") @@ -103,6 +103,9 @@ playsound(loc, 'sound/machines/click.ogg', 30, TRUE) return ITEM_INTERACT_SUCCESS +/obj/structure/fish_mount/IsContainedAtomAccessible(atom/contained, atom/movable/user) + return TRUE + /obj/structure/fish_mount/proc/add_fish(obj/item/fish/fish, from_persistence = FALSE, catcher) if(QDELETED(src)) // don't ever try to add a fish to one of these that's already been deleted - and get rid of the one that was created qdel(fish) @@ -113,7 +116,6 @@ mounted_fish.forceMove(loc) fish.forceMove(src) vis_contents += fish - fish.flags_1 |= IS_ONTOP_1 fish.vis_flags |= (VIS_INHERIT_PLANE|VIS_INHERIT_LAYER) fish.interaction_flags_item &= ~INTERACT_ITEM_ATTACK_HAND_PICKUP fish.obj_flags &= ~UNIQUE_RENAME @@ -128,7 +130,6 @@ AddElement(/datum/element/beauty, get_fish_beauty()) RegisterSignals(fish, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW), PROC_REF(on_fish_attack_hand)) - rotate_fish(dir) if(from_persistence) persistence_loaded_fish = TRUE fish.add_traits(list(TRAIT_NO_FISHING_ACHIEVEMENT, TRAIT_FISH_LOW_PRICE), INNATE_TRAIT) @@ -142,20 +143,6 @@ beauty += main_material.beauty_modifier * mounted_fish.weight return round(beauty) -/obj/structure/fish_mount/proc/rotate_fish(direction, old_direction) - var/rotation = angle2dir(REVERSE_DIR(direction)) - if(old_direction) - rotation -= angle2dir(REVERSE_DIR(old_direction)) - - if(!rotation) - return - mounted_fish.transform = mounted_fish.transform.Turn(rotation) - -/obj/structure/fish_mount/setDir(newdir) - var/old_dir = dir - . = ..() - rotate_fish(dir, old_dir) - /obj/structure/fish_mount/proc/on_fish_attack_hand(datum/source, mob/living/user) SIGNAL_HANDLER INVOKE_ASYNC(src, PROC_REF(remove_fish), user) @@ -193,9 +180,7 @@ return ..() RemoveElement(/datum/element/beauty, get_fish_beauty()) if(!QDELETED(mounted_fish) && (!persistence_loaded_fish || roll_for_safe_removal())) - rotate_fish(0, dir) UnregisterSignal(mounted_fish, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW)) - mounted_fish.flags_1 &= ~IS_ONTOP_1 mounted_fish.vis_flags &= ~(VIS_INHERIT_PLANE|VIS_INHERIT_LAYER) mounted_fish.interaction_flags_item |= INTERACT_ITEM_ATTACK_HAND_PICKUP mounted_fish.obj_flags |= UNIQUE_RENAME @@ -224,3 +209,9 @@ persistence_id = "Bar" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fish_mount/bar, /obj/item/wallframe/fish::pixel_shift) + +// DARKPACK EDIT ADD START +/obj/structure/fish_mount/supply + persistence_id = "Supply" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fish_mount/supply, /obj/item/wallframe/fish::pixel_shift) +// DARKPACK EDIT ADD END diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm index 66bd2c8a1d22..421f4c66f67d 100644 --- a/code/modules/fishing/fishing_equipment.dm +++ b/code/modules/fishing/fishing_equipment.dm @@ -13,11 +13,13 @@ icon_state = "reel_blue" w_class = WEIGHT_CLASS_SMALL ///A bitfield of traits that this fishing line has, checked by fish traits and the minigame. - var/fishing_line_traits + var/fishing_line_traits = NONE /// Color of the fishing line var/line_color = COLOR_GRAY ///The description given to the autowiki var/wiki_desc = "A generic fishing line. Without one, the casting range of the rod will be significantly hampered." + ///The amount of range this fishing line adds to casting + var/cast_range = 2 /obj/item/fishing_line/reinforced name = "reinforced fishing line reel" @@ -55,6 +57,7 @@ fishing_line_traits = FISHING_LINE_BOUNCY line_color = "#af221f" wiki_desc = "It reduces the progression loss during the fishing minigame." + cast_range = 3 /obj/item/fishing_line/sinew name = "fishing sinew" @@ -140,6 +143,17 @@ /obj/item/fishing_line/auto_reel/proc/clear_hitby_signal(obj/item/item) UnregisterSignal(item, COMSIG_MOVABLE_PRE_IMPACT) +/obj/item/fishing_line/bluespace + name = "bluespace fishing line" + icon_state = "reel_bluespace" + desc = "A fishing line capable of phasing through the very fabric of reality, along with any hook, bait or anything attached to it." + pass_flags = ALL //It can pass through anything :p + fishing_line_traits = FISHING_LINE_PHASE + line_color = COLOR_BLUE + cast_range = 6 + wiki_desc = "It can be used to reach distant fishing spots as well as other things that a normal fishing line cannot, with the exception of reinforced walls.
      \ + It requires the Marine Utility Node to be researched to be printed." + // Hooks /obj/item/fishing_hook @@ -166,7 +180,6 @@ /obj/item/fishing_hook/proc/get_hook_bonus_additive(fish_type) return FISHING_DEFAULT_HOOK_BONUS_ADDITIVE - /** * Simple getter proc for hooks to implement special hook bonuses for * certain `fish_type` (or FISHING_DUD), multiplicative. Is applied before @@ -291,6 +304,7 @@ desc = "A simple hook carved from sharpened bone" icon_state = "hook_bone" wiki_desc = "A generic fishing hook carved out of sharpened bone. Bone fishing rods come pre-equipped with it." + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT) /obj/item/fishing_hook/stabilized name = "gyro-stabilized hook" @@ -479,3 +493,186 @@ storage_type = /datum/storage/carpskin_bag fishing_modifier = -4 +///An item that allows the user to add and remove traits from a fish at their own discretion. +/obj/item/fish_genegun + name = "fish gene-gun" + icon = 'icons/obj/fishing.dmi' + icon_state = "fish_gun" + base_icon_state = "fish_gun" + inhand_icon_state = "gun" //Oh, the laziness + worn_icon_state = "gun" + lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + desc = "A device designed to inject or extract traits to and from fish. It takes an empty syringe, which is converted into a fish gene injector once the trait is extracted. Repeated applications may kill the fish." + w_class = WEIGHT_CLASS_SMALL + force = 7 + throwforce = 5 + attack_verb_continuous = list("pricked", "stabbed", "poked") + attack_verb_simple = list("prick", "stab", "poke") + hitsound = 'sound/items/hypospray.ogg' + //This can be an empty syringe or a gene injector + var/obj/item/loaded_injector + +/obj/item/fish_genegun/Initialize(mapload) + . = ..() + AddElement(/datum/element/eyestab) + +/obj/item/fish_genegun/examine(mob/user) + . = ..() + + if(!loaded_injector) + . += span_info("It's currently unloaded. Insert a syringe or fish gene injector.") + return + var/info = span_info("It's currently loaded with [loaded_injector]. Use it to ") + if(istype(loaded_injector, /obj/item/reagent_containers/syringe)) + info += span_info("[EXAMINE_HINT("extract")] a gene from a fish or aquatic lifeform.") + else + info += span_info("[EXAMINE_HINT("inject")] the gene in a fish or aquatic lifeform.") + . += info + +/obj/item/fish_genegun/update_icon_state() + . = ..() + icon_state = base_icon_state + if(!loaded_injector) + return + icon_state += istype(loaded_injector, /obj/item/reagent_containers/syringe) ? "_extract" : "_inject" + +/obj/item/fish_genegun/attack_self(mob/user) + if(!loaded_injector) + balloon_alert(user, "gene-gun is empty!") + return + var/obj/item/loaded = loaded_injector + loaded.forceMove(drop_location()) //this will unset the loaded_injector variable + if(IsReachableBy(user)) //check that the user can actually reach the loaded injector (telekinesis yadda yadda) + user.put_in_hands(loaded) + balloon_alert(user, "gene-gun unloaded") + playsound(src, 'sound/items/weapons/gun/general/magazine_remove_full.ogg', 30, TRUE) + +/obj/item/fish_genegun/Exited(atom/movable/gone) + . = ..() + if(gone == loaded_injector) + loaded_injector = null + update_appearance(UPDATE_ICON) + +/obj/item/fish_genegun/item_interaction(mob/living/user, obj/item/item, list/modifiers) + var/is_syringe = istype(item, /obj/item/reagent_containers/syringe) + if(!is_syringe && istype(item, /obj/item/fish_gene)) + return NONE + if(loaded_injector) + to_chat(user, span_warning("[src] already has [loaded_injector] loaded in it.")) + return ITEM_INTERACT_BLOCKING + if(is_syringe && item.reagents.total_volume) + to_chat(user, span_warning("[src] cannot accept a syringe that isn't empty. Empty it first.")) + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(item, src)) + to_chat(user, span_warning("[item] is stuck to your hands.")) + return ITEM_INTERACT_BLOCKING + to_chat(user, span_info("You load [item] into [src].")) + loaded_injector = item + update_appearance(UPDATE_ICON) + playsound(src, 'sound/items/weapons/gun/general/magazine_insert_full.ogg', 30, TRUE) + return ITEM_INTERACT_SUCCESS + +/obj/item/fish_genegun/interact_with_atom(obj/interacting_with, mob/living/user, list/modifiers) + if(!isfish(interacting_with)) + return NONE + if(!loaded_injector) + balloon_alert(user, "gene-gun is empty!") + return ITEM_INTERACT_BLOCKING + if(interacting_with.flags_1 & HOLOGRAM_1) + to_chat(user, span_warning("[interacting_with] is incompatible with [src]")) + return ITEM_INTERACT_BLOCKING + var/obj/item/fish/fish = interacting_with + var/is_syringe = istype(loaded_injector, /obj/item/reagent_containers/syringe) + if(fish.status == FISH_DEAD) + to_chat(user, span_warning("[src] cannot [is_syringe ? "extract traits from" : "inject traits into"] the deceased [fish.name].")) + return ITEM_INTERACT_BLOCKING + if(!is_syringe) + var/obj/item/fish_gene/injector = loaded_injector + return injector.inject_into_fish(fish, user, src) + + if(!length(fish.fish_traits)) + to_chat(user, span_warning("[fish] has no traits that can be extracted from!")) + return ITEM_INTERACT_BLOCKING + + var/list/choices = list() + for(var/datum/fish_trait/trait_type as anything in fish.fish_traits) + choices[trait_type::name] = trait_type + var/choice = tgui_input_list(user, "Choose a trait to extract", "Fish Trait Extraction", choices) + if(!choice || QDELETED(fish) || !user.is_holding(src) || !fish.IsReachableBy(user)) + return ITEM_INTERACT_BLOCKING + + if(!istype(loaded_injector, /obj/item/reagent_containers/syringe)) //The syringe was taken out + to_chat(user, span_warning("[src] is not loaded with an syringe to extract fish traits with.")) + return ITEM_INTERACT_BLOCKING + if(fish.status == FISH_DEAD) + to_chat(user, span_warning("[src] cannot extract traits from the deceased [fish.name].")) + return ITEM_INTERACT_BLOCKING + if(!(choices[choice] in fish.fish_traits)) + to_chat(user, span_warning("[fish] doesn't seem to have the \"[choice]\" trait anymore.")) + return ITEM_INTERACT_BLOCKING + + QDEL_NULL(loaded_injector) + var/datum/fish_trait/trait_type = choices[choice] + var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] + trait.remove_from_fish(fish) + loaded_injector = new /obj/item/fish_gene(src, trait_type) + + user.visible_message(span_notice("[user] injects [fish] with [src]."), span_notice("You extract the \"[trait_type::name]\" trait into [fish].")) + if(HAS_TRAIT(fish, TRAIT_FISH_GENEGUNNED)) + fish.set_status(FISH_DEAD) + ADD_TRAIT(fish, TRAIT_FISH_GENEGUNNED, TRAIT_GENERIC) + playsound(fish, 'sound/items/hypospray.ogg', 30, TRUE) + update_appearance(UPDATE_ICON) + return ITEM_INTERACT_SUCCESS + +///The injector for the fish trait. Can be used on its own without a fish gene-gun as well. +/obj/item/fish_gene + name = "fish trait injector" + icon = 'icons/obj/fishing.dmi' + icon_state = "fish_trait_injector" + desc = "A single-use injector containing a specific trait that can be used on any (living) fish compatible with it." + w_class = WEIGHT_CLASS_TINY + inhand_icon_state = "dnainjector" + worn_icon_state = "pen" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + throw_speed = 3 + throw_range = 5 + var/datum/fish_trait/trait_type + +/obj/item/fish_gene/Initialize(mapload, datum/fish_trait/trait_type) + . = ..() + if(trait_type) + src.trait_type = trait_type + if(src.trait_type) + update_appearance(UPDATE_NAME) + +/obj/item/fish_gene/update_name() + . = ..() + name = "fish trait injector ([trait_type::name])" + +/obj/item/fish_gene/interact_with_atom(obj/interacting_with, mob/living/user, list/modifiers) + if(!isfish(interacting_with)) + return NONE + if(interacting_with.flags_1 & HOLOGRAM_1) + to_chat(user, span_warning("[interacting_with] is incompatible with [src]")) + return ITEM_INTERACT_BLOCKING + var/obj/item/fish/fish = interacting_with + if(fish.status == FISH_DEAD) + to_chat(user, span_warning("[src] cannot inject traits into the deceased [fish.name].")) + return ITEM_INTERACT_BLOCKING + return inject_into_fish(fish, user, src) + +/obj/item/fish_gene/proc/inject_into_fish(obj/item/fish/fish, mob/living/user, obj/item/tool = src) + var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] + if(!trait.apply_to_fish(fish)) + to_chat(user, span_warning("You can't inject the \"[trait_type::name]\" trait into [fish]. [fish.p_they(TRUE)] either [fish.p_have()] it or [fish.p_are()] incompatible with it.")) + return ITEM_INTERACT_BLOCKING + user.visible_message(span_notice("[user] injects [fish] with [tool]."), span_notice("You inject the \"[trait_type::name]\" trait into [fish].")) + qdel(src) + if(HAS_TRAIT(fish, TRAIT_FISH_GENEGUNNED)) + fish.set_status(FISH_DEAD) + ADD_TRAIT(fish, TRAIT_FISH_GENEGUNNED, TRAIT_GENERIC) + playsound(fish, 'sound/items/hypospray.ogg', 25, TRUE) + return ITEM_INTERACT_SUCCESS diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm index 923c496371ac..74aad213448d 100644 --- a/code/modules/fishing/fishing_minigame.dm +++ b/code/modules/fishing/fishing_minigame.dm @@ -258,7 +258,7 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) float.update_appearance(UPDATE_OVERLAYS) if(special_effects & FISHING_MINIGAME_AUTOREEL) addtimer(CALLBACK(src, PROC_REF(auto_spin)), 0.2 SECONDS) - playsound(float, 'sound/machines/ping.ogg', 10, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(float, 'sound/machines/ping.ogg', 20, TRUE, MEDIUM_RANGE_SOUND_EXTRARANGE) /datum/fishing_challenge/proc/auto_spin() if(phase != WAIT_PHASE || !float.spin_ready) @@ -284,7 +284,7 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) /datum/fishing_challenge/proc/on_float_or_user_move(datum/source) SIGNAL_HANDLER - if(!user.CanReach(location)) + if(!location.IsReachableBy(user)) user.balloon_alert(user, "too far!") interrupt() diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 8531cb1b5ad8..89654df59e38 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -1,5 +1,3 @@ -#define FISHING_ROD_REEL_CAST_RANGE 2 - /obj/item/fishing_rod name = "fishing rod" desc = "You can fish with this." @@ -80,6 +78,7 @@ * they're already likely to be quite bad */ var/bait_height_mult = 1 + custom_price = 200 // DARKPACK EDIT ADD - ECONOMY /obj/item/fishing_rod/Initialize(mapload) . = ..() @@ -151,13 +150,13 @@ var/list/block = list() var/get_percent = HAS_MIND_TRAIT(user, TRAIT_EXAMINE_DEEPER_FISH) block += span_info("You think you can cast it up to [get_cast_range()] tiles away.") - block += get_stat_info(get_percent, difficulty_modifier * 0.01, "Fishing will be", "easier", "harder", "with this fishing rod", offset = 0) - block += get_stat_info(get_percent, experience_multiplier, "You will gain experience", "faster", "slower") - block += get_stat_info(get_percent, completion_speed_mult, "You should complete the minigame", "faster", "slower") - block += get_stat_info(get_percent, bait_speed_mult, "Reeling is", "faster", "slower") - block += get_stat_info(get_percent, deceleration_mult, "Deceleration is", "faster", "slower", less_is_better = TRUE) - block += get_stat_info(get_percent, bounciness_mult, "This fishing rod is ", "bouncier", "less bouncy", "than a normal one", less_is_better = TRUE) - block += get_stat_info(get_percent, gravity_mult, "The lure will sink", "faster", "slower", span_info = TRUE) + block += get_stat_info(get_percent, difficulty_modifier * 0.01, "Fishing will be", "easier", "harder", "with this fishing rod") + block += get_stat_info(get_percent, experience_multiplier - 1, "You will gain experience", "faster", "slower") + block += get_stat_info(get_percent, completion_speed_mult - 1, "The minigame completion speed is", "faster", "slower") + block += get_stat_info(get_percent, bait_speed_mult - 1, "Reeling is", "faster", "slower") + block += get_stat_info(get_percent, deceleration_mult - 1, "Deceleration is", "faster", "slower") + block += get_stat_info(get_percent, bounciness_mult - 1, "This fishing rod is ", "bouncier", "less bouncy", "than a normal one", less_is_better = TRUE) + block += get_stat_info(get_percent, gravity_mult - 1, "The lure will sink", "faster", "slower", span_info = TRUE) list_clear_nulls(block) . += boxed_message(block.Join("\n")) @@ -184,10 +183,9 @@ . += boxed_message(block.Join("\n")) ///Used in examine_more to reduce all the copypasta when getting more information about the various stats of the fishing rod. -/obj/item/fishing_rod/proc/get_stat_info(get_percent, value, prefix, easier, harder, suffix = "with this fishing rod", span_info = FALSE, less_is_better = FALSE, offset = 1) - if(value == 1) +/obj/item/fishing_rod/proc/get_stat_info(get_percent, value, prefix, easier, harder, suffix = "with this fishing rod", span_info = FALSE, less_is_better = FALSE) + if(!value) return - value -= offset var/percent = get_percent ? "[abs(value * 100)]% " : "" var/harder_easier = value > 0 ? easier : harder . = "[prefix] [percent][harder_easier] [suffix]." @@ -316,18 +314,24 @@ user.mind?.adjust_experience(/datum/skill/fishing, time * 0.13 * experience_multiplier) //Try to move it 'till it's under the user's feet, then try to pick it up - if(isitem(currently_hooked)) - var/obj/item/item = currently_hooked - step_towards(item, get_turf(src)) - if(item.loc == user.loc && (item.interaction_flags_item & INTERACT_ITEM_ATTACK_HAND_PICKUP)) - user.put_in_inactive_hand(item) - QDEL_NULL(fishing_line) //Not an item, so just delete the line if it's adjacent to the user. - else if(get_dist(currently_hooked,get_turf(src)) > 1) + if(!isitem(currently_hooked) && get_dist(currently_hooked, get_turf(src)) < 1) + QDEL_NULL(fishing_line) + return + + if(line?.fishing_line_traits & FISHING_LINE_PHASE) + currently_hooked.forceMove(get_step_towards(currently_hooked, get_turf(src))) + else step_towards(currently_hooked, get_turf(src)) + + if(!isitem(currently_hooked)) if(get_dist(currently_hooked,get_turf(src)) <= 1) QDEL_NULL(fishing_line) - else + return + + var/obj/item/item = currently_hooked + if(item.loc == user.loc && (item.interaction_flags_item & INTERACT_ITEM_ATTACK_HAND_PICKUP)) + user.put_in_inactive_hand(item) QDEL_NULL(fishing_line) /obj/item/fishing_rod/proc/fishing_line_check() @@ -363,7 +367,7 @@ currently_hooked = null /obj/item/fishing_rod/proc/get_cast_range(mob/living/user) - . = max(cast_range, 1) + . = max(cast_range + line?.cast_range, 1) user = user || loc if (!isliving(user) || !user.mind || !user.is_holding(src)) return @@ -380,20 +384,39 @@ return if(!hook.can_be_hooked(target_atom)) return + if(!create_fishing_line(target_atom, user)) + return currently_hooked = target_atom - create_fishing_line(target_atom, user) hook.hook_attached(target_atom, src) SEND_SIGNAL(src, COMSIG_FISHING_ROD_HOOKED_ITEM, target_atom, user) // 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, get_cast_range())) + var/cast_range = get_cast_range() + if(!(line?.fishing_line_traits & FISHING_LINE_PHASE)) + if(!CheckToolReach(src, source.target, cast_range)) + qdel(source) + return BEAM_CANCEL_DRAW + return NONE + + + //Bluespace fishing lines are simplier and only check the distance and if there're r-walls in the way. + if(source.target.z != loc.z || get_dist(loc, source.target) > cast_range) qdel(source) return BEAM_CANCEL_DRAW + //Check that there are no r-walls in the way of our bluespace fishing line + var/list/bresenham_line = get_line(loc, source.target) + bresenham_line -= get_turf(source.target) //We don't check if the target is on a r-wall already, just the turfs separating us from it. + bresenham_line -= get_turf(loc) //ditto with our own turf. + for(var/turf/turf as anything in bresenham_line) + if(isindestructiblewall(turf) || istype(turf, /turf/closed/wall/r_wall)) + qdel(source) + return BEAM_CANCEL_DRAW + return NONE + /obj/item/fishing_rod/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) //this prevent trying to use telekinesis to fish (which would be broken anyway), also whacking people with a rod. if(!user.contains(src) || (user.combat_mode && !isturf(interacting_with)) ||HAS_TRAIT(interacting_with, TRAIT_COMBAT_MODE_SKIP_INTERACTION)) @@ -432,8 +455,9 @@ return if(!COOLDOWN_FINISHED(src, casting_cd)) return + var/cast_range = get_cast_range(user) // Inside of storages, or camera weirdness - if(target.z != user.z || !(target in view(user.client?.view || world.view, user))) + if(target.z != user.z || get_dist(user, target) > (cast_range + 3)) return COOLDOWN_START(src, casting_cd, 1 SECONDS) // skip firing a projectile if the target is adjacent and can be reached (no order windows in the way), @@ -452,6 +476,8 @@ cast_projectile.fired_from = src cast_projectile.firer = user cast_projectile.impacted = list(WEAKREF(user) = TRUE) + if(line?.fishing_line_traits & FISHING_LINE_PHASE) + cast_projectile.pass_flags = ALL cast_projectile.aim_projectile(target, user) cast_projectile.fire() @@ -543,13 +569,13 @@ var/list/data = list() data["bait_name"] = format_text(bait?.name) - data["bait_icon"] = bait != null ? icon2base64(icon(bait.icon, bait.icon_state)) : null + data["bait_icon"] = bait != null ? icon2base64(icon(bait.icon, bait.icon_state, frame = 1)) : null data["line_name"] = format_text(line?.name) - data["line_icon"] = line != null ? icon2base64(icon(line.icon, line.icon_state)) : null + data["line_icon"] = line != null ? icon2base64(icon(line.icon, line.icon_state, frame = 1)) : null data["hook_name"] = format_text(hook?.name) - data["hook_icon"] = hook != null ? icon2base64(icon(hook.icon, hook.icon_state)) : null + data["hook_icon"] = hook != null ? icon2base64(icon(hook.icon, hook.icon_state, frame = 1)) : null data["busy"] = fishing_line @@ -646,7 +672,6 @@ hook = equipment if(ROD_SLOT_LINE) line = equipment - cast_range += FISHING_ROD_REEL_CAST_RANGE else CRASH("set_slot called with an undefined slot: [slot]") @@ -661,7 +686,6 @@ REMOVE_TRAIT(src, TRAIT_ROD_REMOVE_FISHING_DUD, INNATE_TRAIT) if(gone == line) slot = ROD_SLOT_LINE - cast_range -= FISHING_ROD_REEL_CAST_RANGE line = null if(gone == hook) slot = ROD_SLOT_HOOK @@ -695,6 +719,7 @@ frame_state = "frame_bone" line = null //sinew line (usable to fish in lava) not included hook = /obj/item/fishing_hook/bone + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 2) /obj/item/fishing_rod/telescopic name = "telescopic fishing rod" @@ -865,26 +890,55 @@ suppressed = SUPPRESSED_VERY can_hit_turfs = TRUE projectile_angle = 180 - var/obj/item/fishing_rod/owner - var/datum/beam/our_line /obj/projectile/fishing_cast/fire(angle, atom/direct_target) if(owner.hook) icon_state = owner.hook.icon_state . = ..() if(!QDELETED(src)) - our_line = owner.create_fishing_line(src, firer) + owner.create_fishing_line(src, firer) + +///If the fishing line is phasing, we don't care about anything entering our turf +/obj/projectile/fishing_cast/on_entered(datum/source, atom/movable/entered_atom) + if(owner.line?.fishing_line_traits & FISHING_LINE_PHASE) + return + return ..() + +///Override of the generic scan_moved_turf so we don't scan for mobs when we move. Also cannot phase through r-walls for balance reasons (stealing from the armory *wink wink*) +/obj/projectile/fishing_cast/scan_moved_turf() + if(can_hit_target(original, TRUE, FALSE)) + impact(original) + return + if(isindestructiblewall(loc) || istype(loc, /turf/closed/wall/r_wall)) + qdel(src) /obj/projectile/fishing_cast/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() - if(blocked < 100) - QDEL_NULL(our_line) //we need to delete the old beam datum, otherwise it won't let you fish. - owner.hook_hit(target, firer) + QDEL_NULL(owner.fishing_line) //we need to delete the old beam datum, otherwise it won't let you fish. + owner.casting = FALSE //set the casting value to false so we don't delete the new fishing line (different target) on Destroy() + if(blocked >= 100) + return + owner.hook_hit(target, firer) + + if(!isturf(target) || owner.fishing_line) + return + + //So, the target is a turf and we couldn't enstablish a fishing line to it, so let's pick a random thing from that turf. + var/list/possible_picks = list() + for(var/atom/movable/movable as anything in get_turf(src)) + if(movable == src) + continue + if(can_hit_target(movable, direct_target = TRUE, ignore_loc = TRUE)) + possible_picks += movable + if(length(possible_picks)) + impact(pick(possible_picks)) + return /obj/projectile/fishing_cast/Destroy() - QDEL_NULL(our_line) - owner?.casting = FALSE + if(owner?.casting) + owner.casting = FALSE + QDEL_NULL(owner.fishing_line) owner = null return ..() @@ -929,7 +983,7 @@ /datum/beam/fishing_line/proc/handle_dir_change(atom/movable/source, olddir, newdir) SIGNAL_HANDLER update_offsets(newdir) - INVOKE_ASYNC(src, TYPE_PROC_REF(/datum/beam/, redrawing)) + INVOKE_ASYNC(src, TYPE_PROC_REF(/datum/beam, redrawing)) /datum/beam/fishing_line/proc/update_offsets(user_dir) switch(user_dir) @@ -948,5 +1002,3 @@ override_origin_pixel_x += origin.pixel_x override_origin_pixel_y += origin.pixel_y - -#undef FISHING_ROD_REEL_CAST_RANGE diff --git a/code/modules/fishing/sources/subtypes/rifts.dm b/code/modules/fishing/sources/subtypes/rifts.dm index b9d4a7f39e16..37d84f416622 100644 --- a/code/modules/fishing/sources/subtypes/rifts.dm +++ b/code/modules/fishing/sources/subtypes/rifts.dm @@ -157,16 +157,16 @@ fishfluence.after_drain(user) var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) if(heretic_datum) - heretic_datum.knowledge_points++ + heretic_datum.adjust_knowledge_points(1) to_chat(user, "[span_hear("You hear a whisper...")] [span_hypnophrase("THE HIGHER I RISE, THE MORE I FISH.")]") // They can also gain an extra influence point if they infused their rod. if(HAS_TRAIT(challenge.used_rod, TRAIT_ROD_MANSUS_INFUSED)) - heretic_datum.knowledge_points++ + heretic_datum.adjust_knowledge_points(1) to_chat(user, span_boldnotice("Your infused rod improves your knowledge gain!")) return // Non-heretics instead go crazy - human_user?.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 190) + human_user?.adjust_organ_loss(ORGAN_SLOT_BRAIN, 10, 190) human_user?.add_mood_event("gates_of_mansus", /datum/mood_event/gates_of_mansus) human_user?.do_jitter_animation(50) // Hand fires at them from the location diff --git a/code/modules/fishing/sources/subtypes/surgery.dm b/code/modules/fishing/sources/subtypes/surgery.dm index 0ee2b06d856a..2192d2ed5c87 100644 --- a/code/modules/fishing/sources/subtypes/surgery.dm +++ b/code/modules/fishing/sources/subtypes/surgery.dm @@ -25,14 +25,12 @@ var/mob/living/carbon/carbon = fishing_spot var/list/possible_organs = list() - for(var/datum/surgery/organ_manipulation/operation in carbon.surgeries) - var/datum/surgery_step/manipulate_organs/manip_step = GLOB.surgery_steps[operation.steps[operation.status]] - if(!istype(manip_step)) + for(var/obj/item/organ/fishable as anything in carbon.organs) + if(fishable.organ_flags & (ORGAN_UNREMOVABLE|ORGAN_EXTERNAL|ORGAN_VITAL)) continue - for(var/obj/item/organ/organ in operation.operated_bodypart) - if(organ.organ_flags & ORGAN_UNREMOVABLE || !manip_step.can_use_organ(organ)) - continue - possible_organs |= organ + if(!LIMB_HAS_SURGERY_STATE(fishable.bodypart_owner, ALL_SURGERY_FISH_STATES(fishable.zone))) + continue + possible_organs += fishable if(!length(possible_organs)) return null @@ -48,7 +46,7 @@ FISH_SOURCE_AUTOWIKI_NAME = "Organs", FISH_SOURCE_AUTOWIKI_DUD = "", FISH_SOURCE_AUTOWIKI_WEIGHT = 100, - FISH_SOURCE_AUTOWIKI_NOTES = "A random organ from an ongoing organ manipulation surgery.", + FISH_SOURCE_AUTOWIKI_NOTES = "A random organ from an ongoing surgical operation.", )) return data diff --git a/code/modules/food_and_drinks/machinery/griddle.dm b/code/modules/food_and_drinks/machinery/griddle.dm index 5d0beed7ee0a..83dcb2ae873a 100644 --- a/code/modules/food_and_drinks/machinery/griddle.dm +++ b/code/modules/food_and_drinks/machinery/griddle.dm @@ -41,6 +41,9 @@ return variant = rand(1,3) +/obj/machinery/griddle/IsContainedAtomAccessible(atom/contained, atom/movable/user) + return ..() || (contained in griddled_objects) + /obj/machinery/griddle/proc/on_expose_reagent(atom/parent_atom, datum/reagent/exposing_reagent, reac_volume, methods) SIGNAL_HANDLER @@ -141,7 +144,6 @@ /obj/machinery/griddle/proc/AddToGrill(obj/item/item_to_grill, mob/user) vis_contents += item_to_grill griddled_objects += item_to_grill - item_to_grill.flags_1 |= IS_ONTOP_1 item_to_grill.vis_flags |= VIS_INHERIT_PLANE SEND_SIGNAL(item_to_grill, COMSIG_ITEM_GRILL_PLACED, user) @@ -155,7 +157,6 @@ /obj/machinery/griddle/proc/ItemRemovedFromGrill(obj/item/ungrill) SIGNAL_HANDLER - ungrill.flags_1 &= ~IS_ONTOP_1 ungrill.vis_flags &= ~VIS_INHERIT_PLANE griddled_objects -= ungrill vis_contents -= ungrill diff --git a/code/modules/food_and_drinks/machinery/grill.dm b/code/modules/food_and_drinks/machinery/grill.dm index a52749280dd6..75c8a06359dd 100644 --- a/code/modules/food_and_drinks/machinery/grill.dm +++ b/code/modules/food_and_drinks/machinery/grill.dm @@ -12,6 +12,7 @@ pass_flags_self = PASSMACHINE | LETPASSTHROW processing_flags = START_PROCESSING_MANUALLY use_power = NO_POWER_USE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 8, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.5) ///The amount of fuel gained from stacks or reagents var/grill_fuel = 0 diff --git a/code/modules/food_and_drinks/machinery/icecream_vat.dm b/code/modules/food_and_drinks/machinery/icecream_vat.dm index 783244f78268..6e20c2a50d4b 100644 --- a/code/modules/food_and_drinks/machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/machinery/icecream_vat.dm @@ -32,9 +32,9 @@ ///List of all reagenets the icecream vat will spawn with, if preinstall_reagents is TRUE. var/static/list/icecream_vat_reagents = list( /datum/reagent/consumable/milk = 6, - /datum/reagent/consumable/korta_milk = 6, +// /datum/reagent/consumable/korta_milk = 6, // DARKPACK EDIT REMOVE /datum/reagent/consumable/flour = 6, - /datum/reagent/consumable/korta_flour = 6, +// /datum/reagent/consumable/korta_flour = 6, // DARKPACK EDIT REMOVE /datum/reagent/consumable/sugar = 6, /datum/reagent/consumable/ice = 6, /datum/reagent/consumable/coco = 6, diff --git a/code/modules/food_and_drinks/machinery/microwave.dm b/code/modules/food_and_drinks/machinery/microwave.dm index c35ca5c3219e..2235b5b243bc 100644 --- a/code/modules/food_and_drinks/machinery/microwave.dm +++ b/code/modules/food_and_drinks/machinery/microwave.dm @@ -130,6 +130,10 @@ context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Unsecure" : "Install/Secure"]" return CONTEXTUAL_SCREENTIP_SET + if(held_item?.atom_storage) + context[SCREENTIP_CONTEXT_RMB] = "Dump contents" + return CONTEXTUAL_SCREENTIP_SET + if(broken > NOT_BROKEN) if(broken == REALLY_BROKEN && held_item?.tool_behaviour == TOOL_WIRECUTTER) context[SCREENTIP_CONTEXT_LMB] = "Repair" diff --git a/code/modules/food_and_drinks/machinery/oven.dm b/code/modules/food_and_drinks/machinery/oven.dm index a0d0ebad4176..60a946c6d474 100644 --- a/code/modules/food_and_drinks/machinery/oven.dm +++ b/code/modules/food_and_drinks/machinery/oven.dm @@ -46,6 +46,9 @@ remove_shared_particles(particle_type) return ..() +/obj/machinery/oven/IsContainedAtomAccessible(atom/contained, atom/movable/user) + return ..() || istype(contained, /obj/item/plate/oven_tray) + /// Used to determine if the oven appears active and cooking, or offline. /obj/machinery/oven/proc/appears_active() return !open && length(used_tray?.contents) && !(machine_stat & (BROKEN|NOPOWER)) @@ -123,11 +126,11 @@ ///Adds a tray to the oven, making sure the shit can get baked. /obj/machinery/oven/proc/add_tray_to_oven(obj/item/plate/oven_tray, mob/baker) used_tray = oven_tray + playsound(src, SFX_TRAY_INSERT, 50, TRUE) if(!open) oven_tray.vis_flags |= VIS_HIDE vis_contents += oven_tray - oven_tray.flags_1 |= IS_ONTOP_1 oven_tray.vis_flags |= VIS_INHERIT_PLANE oven_tray.pixel_y = OVEN_TRAY_Y_OFFSET oven_tray.pixel_x = OVEN_TRAY_X_OFFSET @@ -144,7 +147,6 @@ /obj/machinery/oven/proc/tray_removed_from_oven(obj/item/oven_tray) SIGNAL_HANDLER - oven_tray.flags_1 &= ~IS_ONTOP_1 oven_tray.vis_flags &= ~VIS_INHERIT_PLANE vis_contents -= oven_tray used_tray = null @@ -260,6 +262,9 @@ icon_state = "oven_tray" max_items = 6 biggest_w_class = WEIGHT_CLASS_BULKY + sound_vary = TRUE + pickup_sound = SFX_TRAY_PICKUP + drop_sound = SFX_TRAY_DROP /obj/item/plate/oven_tray/item_interaction_secondary(mob/living/user, obj/item/item, list/modifiers) if(isnull(item.atom_storage)) diff --git a/code/modules/food_and_drinks/machinery/processor.dm b/code/modules/food_and_drinks/machinery/processor.dm index 859628abc987..f0940348bee6 100644 --- a/code/modules/food_and_drinks/machinery/processor.dm +++ b/code/modules/food_and_drinks/machinery/processor.dm @@ -207,9 +207,7 @@ /obj/machinery/processor/slime/Initialize(mapload) . = ..() - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/slime_processor, - )) + AddComponent(/datum/component/usb_port, typecacheof(list(/obj/item/circuit_component/slime_processor), only_root_path = TRUE)) /obj/machinery/processor/slime/adjust_item_drop_location(atom/movable/atom_to_drop) var/static/list/slimecores = subtypesof(/obj/item/slime_extract) @@ -232,7 +230,7 @@ /// We pick up a number of slimes equal to the rating of the matter bin var/slimes_picked = 0 for(var/mob/living/basic/slime/slime in range(1,src)) - if(!CanReach(slime)) //don't take slimes behind glass panes or somesuch; also makes it ignore slimes inside the processor + if(!slime.IsReachableBy(src)) //don't take slimes behind glass panes or somesuch; also makes it ignore slimes inside the processor continue if(slime.stat) var/datum/food_processor_process/recipe = PROCESSOR_SELECT_RECIPE(slime) diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm index f6605a71a5b4..d8ed0be1a62b 100644 --- a/code/modules/food_and_drinks/machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/machinery/smartfridge.dm @@ -550,6 +550,7 @@ base_build_path = /obj/machinery/smartfridge/drying/rack use_power = NO_POWER_USE idle_power_usage = 0 + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 10) /obj/machinery/smartfridge/drying/rack/Initialize(mapload) . = ..() diff --git a/code/modules/food_and_drinks/machinery/stove.dm b/code/modules/food_and_drinks/machinery/stove.dm index 86f6f724486c..a1d4a99ed87b 100644 --- a/code/modules/food_and_drinks/machinery/stove.dm +++ b/code/modules/food_and_drinks/machinery/stove.dm @@ -39,6 +39,9 @@ w_class = WEIGHT_CLASS_BULKY custom_price = PAYCHECK_LOWER * 8 fill_icon_thresholds = null + sound_vary = TRUE + pickup_sound = SFX_POT_PICKUP + drop_sound = SFX_POT_DROP /// Max number of ingredients we can add var/max_ingredients = 24 @@ -47,6 +50,7 @@ /obj/item/reagent_containers/cup/soup_pot/Initialize(mapload, vol) . = ..() + AddElement(/datum/element/cuffable_item) RegisterSignal(src, COMSIG_ATOM_REAGENT_EXAMINE, PROC_REF(reagent_special_examine)) register_context() diff --git a/code/modules/food_and_drinks/machinery/stove_component.dm b/code/modules/food_and_drinks/machinery/stove_component.dm index 8db59dc2739d..824041ac86db 100644 --- a/code/modules/food_and_drinks/machinery/stove_component.dm +++ b/code/modules/food_and_drinks/machinery/stove_component.dm @@ -217,7 +217,7 @@ /datum/component/stove/proc/add_container(obj/item/new_container, mob/user) var/obj/real_parent = parent real_parent.vis_contents += new_container - new_container.flags_1 |= IS_ONTOP_1 + ADD_TRAIT(new_container, TRAIT_SKIP_BASIC_REACH_CHECK, REF(src)) new_container.vis_flags |= VIS_INHERIT_PLANE container = new_container @@ -230,7 +230,7 @@ /datum/component/stove/proc/remove_container() var/obj/real_parent = parent - container.flags_1 &= ~IS_ONTOP_1 + REMOVE_TRAIT(container, TRAIT_SKIP_BASIC_REACH_CHECK, REF(src)) container.vis_flags &= ~VIS_INHERIT_PLANE real_parent.vis_contents -= container @@ -274,4 +274,3 @@ return var/obj/effect/abstract/shared_particle_holder/soup_smoke = obj_parent.add_shared_particles(particle_type, "[particle_type]_stove_[container_x]") soup_smoke.particles.position = list(container_x, round(ICON_SIZE_Y * 0.66), 0) - diff --git a/code/modules/food_and_drinks/plate.dm b/code/modules/food_and_drinks/plate.dm index 225e8d868650..539a22f81713 100644 --- a/code/modules/food_and_drinks/plate.dm +++ b/code/modules/food_and_drinks/plate.dm @@ -3,6 +3,9 @@ desc = "Holds food, powerful. Good for morale when you're not eating your spaghetti off of a desk." icon = 'icons/obj/service/kitchen.dmi' icon_state = "plate" + sound_vary = TRUE + pickup_sound = SFX_FOOD_PLATE_PICKUP + drop_sound = SFX_FOOD_PLATE_DROP w_class = WEIGHT_CLASS_BULKY //No backpack. ///How many things fit on this plate? var/max_items = 8 @@ -53,10 +56,12 @@ target.attackby(object_to_eat, user) return TRUE //No normal attack +/obj/item/plate/IsContainedAtomAccessible(atom/contained, atom/movable/user) + return TRUE + ///This proc adds the food to viscontents and makes sure it can deregister if this changes. /obj/item/plate/proc/AddToPlate(obj/item/item_to_plate) vis_contents += item_to_plate - item_to_plate.flags_1 |= IS_ONTOP_1 item_to_plate.vis_flags |= VIS_INHERIT_PLANE RegisterSignal(item_to_plate, COMSIG_MOVABLE_MOVED, PROC_REF(ItemMoved)) RegisterSignal(item_to_plate, COMSIG_QDELETING, PROC_REF(ItemMoved)) @@ -72,7 +77,6 @@ ///This proc cleans up any signals on the item when it is removed from a plate, and ensures it has the correct state again. /obj/item/plate/proc/ItemRemovedFromPlate(obj/item/removed_item) - removed_item.flags_1 &= ~IS_ONTOP_1 removed_item.vis_flags &= ~VIS_INHERIT_PLANE vis_contents -= removed_item UnregisterSignal(removed_item, list(COMSIG_MOVABLE_MOVED, COMSIG_QDELETING)) diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index d0b6af93763b..ffa4b2c5c4fd 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -4,8 +4,9 @@ /obj/item/reagent_containers/cup/bowl, /obj/item/popsicle_stick, /obj/item/stack/rods, + /obj/item/reagent_containers/cup/glass/sillycup, ) - crafting_flags = parent_type::crafting_flags | CRAFT_TRANSFERS_REAGENTS | CRAFT_CLEARS_REAGENTS | CRAFT_ENFORCE_MATERIALS_PARITY + crafting_flags = parent_type::crafting_flags | CRAFT_TRANSFERS_REAGENTS | CRAFT_CLEARS_REAGENTS ///The food types that are added to the result when the recipe is completed var/added_foodtypes = NONE ///The food types that are removed to the result when the recipe is completed @@ -314,7 +315,7 @@ 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/items/weapons/taser.ogg' - reaction_flags = REACTION_INSTANT + reaction_flags = REACTION_INSTANT | REACTION_TAG_ACTIVE /datum/chemical_reaction/food/martian_batter results = list(/datum/reagent/consumable/martian_batter = 10) 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 023fba21f98d..076dd038534c 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm @@ -165,6 +165,10 @@ /datum/reagent/blood = 30, /datum/reagent/teslium = 1 //To shock the whole thing into life ) + parts = list( + /obj/item/organ/brain, + /obj/item/organ/heart + ) result = /mob/living/basic/pet/dog/breaddog category = CAT_BREAD */ 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 9d79ad210918..791e3f7b78bb 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm @@ -234,6 +234,10 @@ /datum/reagent/consumable/sprinkles = 5, /datum/reagent/teslium = 1 //To shock the whole thing into life ) + parts = list( + /obj/item/organ/brain, + /obj/item/organ/heart + ) result = /mob/living/basic/pet/cat/cak category = CAT_CAKE //Cat! Haha, get it? CAT? GET IT? We get it - Love Felines */ diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm index 7bc4fc02d0b5..f1e53cbfa191 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm @@ -32,6 +32,7 @@ /datum/reagent/consumable/ethanol/hooch = 100 ) result = /obj/item/reagent_containers/cup/glass/bottle/hooch + requirements_mats_blacklist = list(/obj/item/storage/box/papersack) category = CAT_DRINK /datum/crafting_recipe/blazaambottle @@ -146,3 +147,13 @@ //We can't spawn the abstract food/grown path unit_test_spawn_extras = list(/obj/item/food/grown/banana = 4) category = CAT_DRINK + +/datum/crafting_recipe/lean + name = "lean" + result = /obj/item/reagent_containers/cup/glass/colocup/lean + time = 1 SECONDS + reqs = list(/obj/item/reagent_containers/cup/glass/colocup = 1, + /obj/item/food/gumball = 2, + /datum/reagent/medicine/morphine = 5, + /datum/reagent/consumable/space_up = 15) + category = CAT_DRINK diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm index a1674fb0ca6f..7d633bbc0774 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm @@ -73,7 +73,7 @@ //////////////////////////SNOW CONES/////////////////////// -/datum/crafting_recipe/food/flavorless_sc +/datum/crafting_recipe/food/snowcone name = "Flavorless snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -82,7 +82,7 @@ result = /obj/item/food/snowcones category = CAT_ICE -/datum/crafting_recipe/food/pineapple_sc +/datum/crafting_recipe/food/snowcone/pineapple name = "Pineapple snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -90,9 +90,8 @@ /datum/reagent/consumable/pineapplejuice = 5 ) result = /obj/item/food/snowcones/pineapple - category = CAT_ICE -/datum/crafting_recipe/food/lime_sc +/datum/crafting_recipe/food/snowcone/lime name = "Lime snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -100,9 +99,8 @@ /datum/reagent/consumable/limejuice = 5 ) result = /obj/item/food/snowcones/lime - category = CAT_ICE -/datum/crafting_recipe/food/lemon_sc +/datum/crafting_recipe/food/snowcone/lemon name = "Lemon snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -110,9 +108,8 @@ /datum/reagent/consumable/lemonjuice = 5 ) result = /obj/item/food/snowcones/lemon - category = CAT_ICE -/datum/crafting_recipe/food/apple_sc +/datum/crafting_recipe/food/snowcone/apple name = "Apple snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -120,9 +117,8 @@ /datum/reagent/consumable/applejuice = 5 ) result = /obj/item/food/snowcones/apple - category = CAT_ICE -/datum/crafting_recipe/food/grape_sc +/datum/crafting_recipe/food/snowcone/grape name = "Grape snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -130,9 +126,8 @@ /datum/reagent/consumable/grapejuice = 5 ) result = /obj/item/food/snowcones/grape - category = CAT_ICE -/datum/crafting_recipe/food/orange_sc +/datum/crafting_recipe/food/snowcone/orange name = "Orange snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -140,9 +135,8 @@ /datum/reagent/consumable/orangejuice = 5 ) result = /obj/item/food/snowcones/orange - category = CAT_ICE -/datum/crafting_recipe/food/blue_sc +/datum/crafting_recipe/food/snowcone/blue name = "Bluecherry snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -150,9 +144,8 @@ /datum/reagent/consumable/bluecherryjelly= 5 ) result = /obj/item/food/snowcones/blue - category = CAT_ICE -/datum/crafting_recipe/food/red_sc +/datum/crafting_recipe/food/snowcone/red name = "Cherry snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -160,9 +153,8 @@ /datum/reagent/consumable/cherryjelly= 5 ) result = /obj/item/food/snowcones/red - category = CAT_ICE -/datum/crafting_recipe/food/berry_sc +/datum/crafting_recipe/food/snowcone/berry name = "Berry snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -170,9 +162,8 @@ /datum/reagent/consumable/berryjuice = 5 ) result = /obj/item/food/snowcones/berry - category = CAT_ICE -/datum/crafting_recipe/food/fruitsalad_sc +/datum/crafting_recipe/food/snowcone/fruitsalad name = "Fruit Salad snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -183,9 +174,8 @@ /datum/reagent/consumable/lemonjuice = 5 ) result = /obj/item/food/snowcones/fruitsalad - category = CAT_ICE -/datum/crafting_recipe/food/mime_sc +/datum/crafting_recipe/food/snowcone/mime name = "Mime snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -193,9 +183,8 @@ /datum/reagent/consumable/nothing = 5 ) result = /obj/item/food/snowcones/mime - category = CAT_ICE -/datum/crafting_recipe/food/clown_sc +/datum/crafting_recipe/food/snowcone/clown name = "Clown snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -203,9 +192,8 @@ /datum/reagent/consumable/laughter = 5 ) result = /obj/item/food/snowcones/clown - category = CAT_ICE -/datum/crafting_recipe/food/soda_sc +/datum/crafting_recipe/food/snowcone/soda name = "Space Cola snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -213,9 +201,8 @@ /datum/reagent/consumable/space_cola = 5 ) result = /obj/item/food/snowcones/soda - category = CAT_ICE -/datum/crafting_recipe/food/spacemountainwind_sc +/datum/crafting_recipe/food/snowcone/spacemountainwind name = "Space Mountain Wind snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -223,9 +210,8 @@ /datum/reagent/consumable/spacemountainwind = 5 ) result = /obj/item/food/snowcones/spacemountainwind - category = CAT_ICE -/datum/crafting_recipe/food/pwrgame_sc +/datum/crafting_recipe/food/snowcone/pwrgame name = "Pwrgame snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -233,9 +219,8 @@ /datum/reagent/consumable/pwr_game = 15 ) result = /obj/item/food/snowcones/pwrgame - category = CAT_ICE -/datum/crafting_recipe/food/honey_sc +/datum/crafting_recipe/food/snowcone/honey name = "Honey snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -243,9 +228,8 @@ /datum/reagent/consumable/honey = 5 ) result = /obj/item/food/snowcones/honey - category = CAT_ICE -/datum/crafting_recipe/food/rainbow_sc +/datum/crafting_recipe/food/snowcone/rainbow name = "Rainbow snowcone" reqs = list( /obj/item/reagent_containers/cup/glass/sillycup = 1, @@ -253,7 +237,6 @@ /datum/reagent/colorful_reagent = 1 //Harder to make ) result = /obj/item/food/snowcones/rainbow - category = CAT_ICE //////////////////////////POPSICLES/////////////////////// 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 e12fab7bf2ea..10adf966a447 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_guide.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_guide.dm @@ -190,7 +190,7 @@ /datum/crafting_recipe/food/reaction/martian_batter reaction = /datum/chemical_reaction/food/martian_batter - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/reaction/grounding_neutralise reaction = /datum/chemical_reaction/food/grounding_neutralise @@ -356,7 +356,7 @@ /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_MOTH + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/knife/watermelonslice reqs = list(/obj/item/food/grown/watermelon = 1) @@ -371,12 +371,12 @@ /datum/crafting_recipe/food/knife/kamaboko_slice reqs = list(/obj/item/food/kamaboko = 1) result = /obj/item/food/kamaboko_slice - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/knife/raw_noodles reqs = list(/obj/item/food/rice_dough = 1) result = /obj/item/food/spaghetti/rawnoodles - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/knife/chapslice reqs = list(/obj/item/food/canned/chap = 1) @@ -450,7 +450,7 @@ /datum/crafting_recipe/food/grill/grilled_cheese_sandwich reqs = list(/obj/item/food/sandwich/cheese = 1) - result = /obj/item/food/sandwich/cheese/grilled + result = /obj/item/food/sandwich/grilled_cheese category = CAT_SANDWICH /datum/crafting_recipe/food/grill/grilled_cheese @@ -461,12 +461,12 @@ /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 + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /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 + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/grill/chapslice reqs = list(/obj/item/food/chapslice = 1) @@ -786,7 +786,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_MOTH + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/oven/ratatouille reqs = list(/obj/item/food/raw_ratatouille = 1) @@ -796,7 +796,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_MOTH + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/oven/roasted_bell_pepper reqs = list(/obj/item/food/grown/bell_pepper = 1) @@ -816,12 +816,12 @@ /datum/crafting_recipe/food/oven/reispan reqs = list(/obj/item/food/rice_dough = 1) result = /obj/item/food/bread/reispan - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /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 + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE // Machinery: Drying rack /datum/crafting_recipe/food/drying @@ -860,4 +860,4 @@ /datum/crafting_recipe/food/drying/kamaboko reqs = list(/obj/item/food/surimi = 1) result = /obj/item/food/kamaboko - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE 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 a059511d2417..5bc750f6ea54 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm @@ -208,6 +208,20 @@ ) result = /obj/item/food/rootdough/egg removed_foodtypes = RAW + /** + * So, at some point, we've had some mean issues with crafting with empty containers. + * Bugs happen and we fix them all the time, so let's make sure stuff like this won't happen again. + * Let's make his recipe spawn a bunch of unneeded containers and something else as well. + * If this breaks the CI, then something is wrong with crafting. + */ + unit_test_spawn_extras = list( + /obj/item/food/rootdough/egg = 1, + /obj/item/food/grown/potato = 1, + /obj/item/reagent_containers/condiment = 1, + /obj/item/reagent_containers/cup/bottle = 2, + /obj/item/reagent_containers/cup/beaker/slime = 1, + /obj/item/reagent_containers/applicator/patch/synthflesh = 1, + ) crafting_flags = CRAFT_CLEARS_REAGENTS /datum/crafting_recipe/food/snail_nizaya diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm index 4137f9339760..ff22f45cf5f7 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm @@ -6,7 +6,7 @@ /datum/reagent/consumable/salt = 5 ) result = /obj/item/food/kimchi - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/inferno_kimchi name = "Inferno kimchi" @@ -16,7 +16,7 @@ /datum/reagent/consumable/salt = 5 ) result = /obj/item/food/inferno_kimchi - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/garlic_kimchi name = "Garlic kimchi" @@ -27,7 +27,7 @@ /datum/reagent/consumable/salt = 5 ) result = /obj/item/food/garlic_kimchi - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/surimi name = "Surimi" @@ -35,7 +35,7 @@ /obj/item/food/fishmeat = 1, ) result = /obj/item/food/surimi - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/sambal name = "Sambal" @@ -49,7 +49,7 @@ ) result = /obj/item/food/sambal added_foodtypes = SEAFOOD //Until we have easy to get shrimp to add to the recipe - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/katsu_fillet name = "Katsu fillet" @@ -60,7 +60,7 @@ result = /obj/item/food/katsu_fillet removed_foodtypes = RAW added_foodtypes = FRIED - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/rice_dough name = "Rice dough" @@ -71,7 +71,7 @@ ) result = /obj/item/food/rice_dough crafting_flags = CRAFT_CHECK_DENSITY - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/hurricane_rice name = "Hurricane fried rice" @@ -87,7 +87,7 @@ ) result = /obj/item/food/salad/hurricane_rice removed_foodtypes = RAW|BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/ikareis name = "Ikareis" @@ -102,7 +102,7 @@ ) result = /obj/item/food/salad/ikareis removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/hawaiian_fried_rice name = "Hawaiian fried rice" @@ -117,7 +117,7 @@ ) result = /obj/item/food/salad/hawaiian_fried_rice removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/ketchup_fried_rice name = "Ketchup fried rice" @@ -133,7 +133,7 @@ ) result = /obj/item/food/salad/ketchup_fried_rice removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/mediterranean_fried_rice name = "Mediterranean fried rice" @@ -148,7 +148,7 @@ ) result = /obj/item/food/salad/mediterranean_fried_rice removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/egg_fried_rice name = "Egg fried rice" @@ -160,7 +160,7 @@ ) result = /obj/item/food/salad/egg_fried_rice removed_foodtypes = BREAKFAST|RAW - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/bibimbap name = "Bibimbap" @@ -175,7 +175,7 @@ ) result = /obj/item/food/salad/bibimbap removed_foodtypes = RAW|BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/bulgogi_noodles name = "Bulgogi noodles" @@ -189,7 +189,7 @@ /obj/item/reagent_containers/cup/bowl = 1, ) result = /obj/item/food/salad/bulgogi_noodles - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/yakisoba_katsu name = "Yakisoba katsu" @@ -203,7 +203,7 @@ /obj/item/reagent_containers/cup/bowl = 1, ) result = /obj/item/food/salad/yakisoba_katsu - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/martian_fried_noodles name = "Martian fried noodles" @@ -219,7 +219,7 @@ ) result = /obj/item/food/salad/martian_fried_noodles removed_foodtypes = RAW - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/simple_fried_noodles name = "Simple fried noodles" @@ -229,7 +229,7 @@ /obj/item/reagent_containers/cup/bowl = 1, ) result = /obj/item/food/salad/simple_fried_noodles - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/setagaya_curry name = "Setagaya curry" @@ -250,7 +250,7 @@ ) result = /obj/item/food/salad/setagaya_curry removed_foodtypes = RAW|JUNKFOOD|BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/big_blue_burger name = "Big Blue Burger" @@ -265,7 +265,7 @@ ) result = /obj/item/food/burger/big_blue removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/chappy_patty name = "Chappy Patty" @@ -278,7 +278,7 @@ ) result = /obj/item/food/burger/chappy removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/king_katsu_sandwich name = "King Katsu sandwich" @@ -292,7 +292,7 @@ ) result = /obj/item/food/king_katsu_sandwich removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/marte_cubano_sandwich name = "Marte Cubano sandwich" @@ -304,7 +304,7 @@ ) result = /obj/item/food/marte_cubano_sandwich removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/little_shiro_sandwich name = "Little Shiro sandwich" @@ -318,7 +318,7 @@ ) result = /obj/item/food/little_shiro_sandwich removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/croque_martienne name = "Croque-Martienne sandwich" @@ -330,7 +330,7 @@ /obj/item/food/friedegg = 1, ) result = /obj/item/food/croque_martienne - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/prospect_sunrise name = "Prospect Sunrise sandwich" @@ -342,7 +342,7 @@ /obj/item/food/pickle = 1, ) result = /obj/item/food/prospect_sunrise - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/takoyaki name = "Takoyaki" @@ -354,7 +354,7 @@ ) result = /obj/item/food/takoyaki added_foodtypes = GRAIN|FRIED - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/russian_takoyaki name = "Russian takoyaki" @@ -366,7 +366,7 @@ ) result = /obj/item/food/takoyaki/russian added_foodtypes = GRAIN|FRIED - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/tacoyaki name = "Tacoyaki" @@ -379,7 +379,7 @@ ) result = /obj/item/food/takoyaki/taco added_foodtypes = GRAIN|FRIED|SEAFOOD - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/okonomiyaki name = "Okonomiyaki" @@ -392,7 +392,7 @@ ) result = /obj/item/food/okonomiyaki added_foodtypes = GRAIN|FRIED|SEAFOOD - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/brat_kimchi name = "Brat-kimchi" @@ -403,7 +403,7 @@ ) result = /obj/item/food/brat_kimchi removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/tonkatsuwurst name = "Tonkatsuwurst" @@ -415,7 +415,7 @@ ) result = /obj/item/food/tonkatsuwurst removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/ti_hoeh_koe name = "Ti hoeh koe" @@ -428,7 +428,7 @@ result = /obj/item/food/kebab/ti_hoeh_koe removed_foodtypes = JUNKFOOD|VEGETABLES|BREAKFAST added_foodtypes = MEAT|FRIED - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/kitzushi name = "Kitzushi" @@ -441,7 +441,7 @@ result = /obj/item/food/kitzushi removed_foodtypes = BREAKFAST added_foodtypes = FRIED - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/epok_epok name = "Epok-epok" @@ -455,7 +455,7 @@ result = /obj/item/food/epok_epok removed_foodtypes = BREAKFAST added_foodtypes = FRIED - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/roti_john name = "Roti John" @@ -470,7 +470,7 @@ result = /obj/item/food/roti_john added_foodtypes = BREAKFAST removed_foodtypes = RAW - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/izakaya_fries name = "Izakaya fries" @@ -481,7 +481,7 @@ /datum/reagent/consumable/mayonnaise = 3, ) result = /obj/item/food/izakaya_fries - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/kurry_ok_subsando name = "Kurry-OK subsando" @@ -492,7 +492,7 @@ /datum/reagent/consumable/nutriment/soup/curry_sauce = 5, ) result = /obj/item/food/kurry_ok_subsando - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/loco_moco name = "Loco moco" @@ -505,7 +505,7 @@ ) result = /obj/item/food/loco_moco removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/wild_duck_fries name = "Wild duck fries" @@ -515,7 +515,7 @@ /datum/reagent/consumable/ketchup = 3, ) result = /obj/item/food/wild_duck_fries - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/little_hawaii_hotdog name = "Little Hawaii hotdog" @@ -526,7 +526,7 @@ /datum/reagent/consumable/nutriment/soup/teriyaki = 3, ) result = /obj/item/food/little_hawaii_hotdog - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/salt_chilli_fries name = "Salt n' chilli fries" @@ -538,7 +538,7 @@ /datum/reagent/consumable/salt = 3, ) result = /obj/item/food/salt_chilli_fries - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/steak_croquette name = "Steak croquette" @@ -549,7 +549,7 @@ ) result = /obj/item/food/steak_croquette added_foodtypes = FRIED - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/chapsilog name = "Chapsilog" @@ -560,7 +560,7 @@ /obj/item/food/grown/garlic = 1, ) result = /obj/item/food/chapsilog - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/chap_hash name = "Chap hash" @@ -574,7 +574,7 @@ result = /obj/item/food/chap_hash removed_foodtypes = RAW added_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/agedashi_tofu name = "Agedashi tofu" @@ -586,7 +586,7 @@ ) result = /obj/item/food/salad/agedashi_tofu added_foodtypes = SEAFOOD - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/po_kok_gai name = "Po kok gai" @@ -600,7 +600,7 @@ result = /obj/item/food/salad/po_kok_gai added_foodtypes = FRUIT removed_foodtypes = RAW|BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/huoxing_tofu name = "Huoxing tofu" @@ -613,7 +613,7 @@ ) result = /obj/item/food/salad/huoxing_tofu removed_foodtypes = RAW - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/feizhou_ji name = "Fēizhōu jī" @@ -625,7 +625,7 @@ ) result = /obj/item/food/feizhou_ji removed_foodtypes = RAW - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/galinha_de_cabidela name = "Galinha de cabidela" @@ -638,7 +638,7 @@ ) result = /obj/item/food/salad/galinha_de_cabidela removed_foodtypes = RAW - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/katsu_curry name = "Katsu curry" @@ -650,7 +650,7 @@ ) result = /obj/item/food/salad/katsu_curry removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/beef_bowl name = "Beef bowl" @@ -664,7 +664,7 @@ result = /obj/item/food/salad/beef_bowl removed_foodtypes = BREAKFAST added_foodtypes = SEAFOOD - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/salt_chilli_bowl name = "Salt n' chilli octopus bowl" @@ -679,7 +679,7 @@ ) result = /obj/item/food/salad/salt_chilli_bowl removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/kansai_bowl name = "Kansai bowl" @@ -693,7 +693,7 @@ ) result = /obj/item/food/salad/kansai_bowl removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/eigamudo_curry name = "Eigamudo curry" @@ -708,7 +708,7 @@ result = /obj/item/food/salad/eigamudo_curry removed_foodtypes = BREAKFAST added_foodtypes = GROSS|TOXIC - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/cilbir name = "Çilbir" @@ -721,7 +721,7 @@ ) result = /obj/item/food/cilbir added_foodtypes = DAIRY - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/peking_duck_crepes name = "Peking duck crepes a l'orange" @@ -733,7 +733,7 @@ ) result = /obj/item/food/peking_duck_crepes removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/vulgaris_spekkoek name = "Vulgaris spekkoek" @@ -743,7 +743,7 @@ /obj/item/food/butterslice = 2, ) result = /obj/item/food/cake/spekkoek - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/pineapple_foster name = "Pineapple foster" @@ -755,7 +755,7 @@ /obj/item/reagent_containers/cup/bowl = 1, ) result = /obj/item/food/salad/pineapple_foster - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/pastel_de_nata name = "Pastel de nata" @@ -767,7 +767,7 @@ ) result = /obj/item/food/pastel_de_nata removed_foodtypes = MEAT|RAW - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/boh_loh_yah name = "Boh loh yah" @@ -778,7 +778,7 @@ ) result = /obj/item/food/boh_loh_yah added_foodtypes = PINEAPPLE // someone thought it's funny to give it this foodtype smh - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/banana_fritter name = "Banana fritter" @@ -788,7 +788,7 @@ ) result = /obj/item/food/banana_fritter added_foodtypes = GRAIN|FRIED|SEAFOOD - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/pineapple_fritter name = "Pineapple fritter" @@ -798,7 +798,7 @@ ) result = /obj/item/food/pineapple_fritter added_foodtypes = GRAIN|FRIED|SEAFOOD - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/kasei_dango name = "Kasei dango" @@ -811,7 +811,7 @@ ) result = /obj/item/food/kebab/kasei_dango added_foodtypes = GRAIN - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/pb_ice_cream_mochi name = "Peanut-butter ice cream mochi" @@ -823,7 +823,7 @@ ) result = /obj/item/food/pb_ice_cream_mochi added_foodtypes = NUTS - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/frozen_pineapple_pop name = "Frozen pineapple pop" @@ -834,7 +834,7 @@ ) result = /obj/item/food/popsicle/pineapple_pop removed_foodtypes = JUNKFOOD - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/sea_salt_pop name = "Sea-salt ice cream bar" @@ -845,7 +845,7 @@ /obj/item/popsicle_stick = 1, ) result = /obj/item/food/popsicle/sea_salt - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/berry_topsicle name = "Berry topsicle" @@ -857,7 +857,7 @@ ) result = /obj/item/food/popsicle/topsicle added_foodtypes = SUGAR|FRUIT - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/banana_topsicle name = "Banana topsicle" @@ -869,7 +869,7 @@ ) result = /obj/item/food/popsicle/topsicle/banana added_foodtypes = SUGAR|FRUIT - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/pineapple_topsicle name = "Pineapple topsicle" @@ -881,7 +881,7 @@ ) result = /obj/item/food/popsicle/topsicle/pineapple added_foodtypes = SUGAR|FRUIT|PINEAPPLE - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/plasma_dog_supreme name = "Plasma Dog Supreme" @@ -892,7 +892,7 @@ /obj/item/food/onion_slice = 1, ) result = /obj/item/food/plasma_dog_supreme - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/frickles name = "Frickles" @@ -903,7 +903,7 @@ ) result = /obj/item/food/frickles added_foodtypes = GRAIN|FRIED|SEAFOOD - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/raw_ballpark_pretzel name = "Raw ballpark pretzel" @@ -913,7 +913,7 @@ ) result = /obj/item/food/raw_ballpark_pretzel added_foodtypes = RAW - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/raw_ballpark_tsukune name = "Raw ballpark tsukune" @@ -923,7 +923,7 @@ /obj/item/stack/rods = 1, ) result = /obj/item/food/kebab/raw_ballpark_tsukune - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/sprout_bowl name = "Sprout bowl" @@ -936,67 +936,67 @@ ) result = /obj/item/food/salad/sprout_bowl removed_foodtypes = BREAKFAST - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE // Soups /datum/crafting_recipe/food/reaction/soup/boilednoodles reaction = /datum/chemical_reaction/food/soup/boilednoodles - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/reaction/soup/dashi reaction = /datum/chemical_reaction/food/soup/dashi - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/reaction/soup/teriyaki reaction = /datum/chemical_reaction/food/soup/teriyaki - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/reaction/soup/curry_sauce reaction = /datum/chemical_reaction/food/soup/curry_sauce - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/reaction/soup/shoyu_ramen reaction = /datum/chemical_reaction/food/soup/shoyu_ramen - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/reaction/soup/gyuramen reaction = /datum/chemical_reaction/food/soup/gyuramen - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/reaction/soup/new_osaka_sunrise reaction = /datum/chemical_reaction/food/soup/new_osaka_sunrise - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/reaction/soup/satsuma_black reaction = /datum/chemical_reaction/food/soup/satsuma_black - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/reaction/soup/dragon_ramen reaction = /datum/chemical_reaction/food/soup/dragon_ramen - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/reaction/soup/hong_kong_borscht reaction = /datum/chemical_reaction/food/soup/hong_kong_borscht - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/reaction/soup/hong_kong_macaroni reaction = /datum/chemical_reaction/food/soup/hong_kong_macaroni - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/reaction/soup/foxs_prize_soup reaction = /datum/chemical_reaction/food/soup/foxs_prize_soup - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/reaction/soup/secret_noodle_soup reaction = /datum/chemical_reaction/food/soup/secret_noodle_soup - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /datum/crafting_recipe/food/reaction/soup/budae_jjigae reaction = /datum/chemical_reaction/food/soup/budae_jjigae - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE /* // DARKPACK EDIT REMOVE /datum/crafting_recipe/food/reaction/soup/volt_fish reaction = /datum/chemical_reaction/food/soup/volt_fish - category = CAT_MARTIAN + category = CAT_MISCFOOD // DARKPACK EDIT CHANGE */ 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 bed8b8d8b271..57a011604e2f 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -170,6 +170,10 @@ /datum/reagent/blood = 50, /datum/reagent/teslium = 1 //To shock the whole thing into life ) + parts = list( + /obj/item/organ/brain, + /obj/item/organ/heart + ) result = /mob/living/basic/bear/butter category = CAT_MISCFOOD */ diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm index 75861ab5b9ad..8b241909d6c8 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -555,6 +555,7 @@ result = /obj/item/food/fortunecookie added_foodtypes = SUGAR category = CAT_PASTRY + requirements_mats_blacklist = list(/obj/item/paper) /datum/crafting_recipe/food/poppypretzel time = 1.5 SECONDS diff --git a/code/modules/food_and_drinks/restaurant/customers/_customer.dm b/code/modules/food_and_drinks/restaurant/customers/_customer.dm index 35b162e29b79..ca85679cf3ac 100644 --- a/code/modules/food_and_drinks/restaurant/customers/_customer.dm +++ b/code/modules/food_and_drinks/restaurant/customers/_customer.dm @@ -309,7 +309,8 @@ /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, SSaccessories.moth_wings_list[pick(SSaccessories.moth_wings_list)]) + var/picked_wings = pick(SSaccessories.feature_list[FEATURE_MOTH_WINGS]) + LAZYSET(wings_chosen, customer_ref, SSaccessories.feature_list[FEATURE_MOTH_WINGS][picked_wings]) return wings_chosen[customer_ref] /datum/customer_data/moth/get_underlays(mob/living/basic/robot_customer/customer) @@ -386,7 +387,7 @@ /obj/item/food/benedict = 5, /obj/item/food/fishandchips = 10, /obj/item/food/full_english = 2, - /obj/item/food/sandwich/cheese/grilled = 5, + /obj/item/food/sandwich/grilled_cheese = 5, /obj/item/food/pie/meatpie = 5, /obj/item/food/salad/ricepudding = 5, ), diff --git a/code/modules/hallucination/blood_flow.dm b/code/modules/hallucination/blood_flow.dm index 0ae641d34a04..7805768c2529 100644 --- a/code/modules/hallucination/blood_flow.dm +++ b/code/modules/hallucination/blood_flow.dm @@ -3,6 +3,8 @@ hallucination_tier = HALLUCINATION_TIER_COMMON /// The bleeding hallucination's image var/image/bleeding + /// Ref to the bleeding bodypart, necessary to unregister signals + var/obj/item/bodypart/bleeding_bodypart /datum/hallucination/blood_flow/start() if(!hallucinator.client || !iscarbon(hallucinator)) @@ -22,22 +24,24 @@ if(isnull(picked)) return FALSE - feedback_details += "Bleeding: [picked]" + bleeding_bodypart = picked - RegisterSignals(picked, list(COMSIG_QDELETING, COMSIG_BODYPART_REMOVED), PROC_REF(stop_bleeding)) - RegisterSignal(hallucinator, SIGNAL_ADDTRAIT(TRAIT_NOBLOOD), PROC_REF(stop_bleeding)) + feedback_details += "Bleeding: [bleeding_bodypart]" - to_chat(hallucinator, span_warning("Your [picked.plaintext_zone] looses a spray of blood!")) + RegisterSignals(bleeding_bodypart, list(COMSIG_QDELETING, COMSIG_BODYPART_REMOVED), PROC_REF(stop_bleeding)) + RegisterSignal(hallucinator, COMSIG_LIVING_UPDATE_BLOOD_STATUS, PROC_REF(stop_bleeding)) + + to_chat(hallucinator, span_warning("Your [bleeding_bodypart.plaintext_zone] looses a spray of blood!")) var/bleed_duration = rand(16 SECONDS, 40 SECONDS) - addtimer(CALLBACK(src, PROC_REF(stop_bleeding), picked), bleed_duration) + addtimer(CALLBACK(src, PROC_REF(stop_bleeding)), bleed_duration) if(prob(25)) - addtimer(CALLBACK(src, PROC_REF(by_god), picked), bleed_duration * pick(0.5, 0.66)) + addtimer(CALLBACK(src, PROC_REF(by_god)), bleed_duration * pick(0.5, 0.66)) stamina_loop() hallucinator.playsound_local(get_turf(hallucinator), pick('sound/effects/wounds/blood1.ogg', 'sound/effects/wounds/blood2.ogg', 'sound/effects/wounds/blood3.ogg'), 50, TRUE) bleeding = image( icon = 'icons/mob/effects/bleed_overlays.dmi', - icon_state = "[picked.body_zone]_[pick(2, 3)]", + icon_state = "[bleeding_bodypart.body_zone]_[pick(2, 3)]", loc = hallucinator, ) bleeding.color = carb_hallucinator.get_bloodtype()?.get_wound_color(carb_hallucinator) || BLOOD_COLOR_RED @@ -49,23 +53,28 @@ hallucinator.client?.images -= bleeding return ..() -/datum/hallucination/blood_flow/proc/by_god(obj/item/bodypart/picked) - if(QDELETED(src) || QDELETED(hallucinator) || QDELETED(picked)) +/datum/hallucination/blood_flow/proc/by_god() + if(QDELETED(src) || QDELETED(hallucinator) || QDELETED(bleeding_bodypart)) return - to_chat(hallucinator, span_warning("The blood doesn't stop flowing, yet [picked.plaintext_zone] doesn't seem to hurt...")) + to_chat(hallucinator, span_warning("The blood doesn't stop flowing, yet [bleeding_bodypart.plaintext_zone] doesn't seem to hurt...")) + +/datum/hallucination/blood_flow/proc/on_update_blood_status(datum/source, had_blood, has_blood, old_blood_volume, new_blood_volume) + SIGNAL_HANDLER + if (!has_blood) + stop_bleeding() -/datum/hallucination/blood_flow/proc/stop_bleeding(obj/item/bodypart/source) +/datum/hallucination/blood_flow/proc/stop_bleeding() SIGNAL_HANDLER - UnregisterSignal(source, list(COMSIG_QDELETING, COMSIG_BODYPART_REMOVED)) - UnregisterSignal(hallucinator, SIGNAL_ADDTRAIT(TRAIT_NOBLOOD)) - if(!QDELETED(source)) - to_chat(hallucinator, span_warning("Your [source.plaintext_zone] stops bleeding.")) + UnregisterSignal(bleeding_bodypart, list(COMSIG_QDELETING, COMSIG_BODYPART_REMOVED)) + UnregisterSignal(hallucinator, COMSIG_LIVING_UPDATE_BLOOD_STATUS) + if(!QDELETED(bleeding_bodypart)) + to_chat(hallucinator, span_warning("Your [bleeding_bodypart.plaintext_zone] stops bleeding.")) if(!QDELETED(src)) qdel(src) /datum/hallucination/blood_flow/proc/stamina_loop() set waitfor = FALSE while(!QDELETED(src) && !QDELETED(hallucinator)) - hallucinator.adjustStaminaLoss(5) + hallucinator.adjust_stamina_loss(5) sleep(4 SECONDS) diff --git a/code/modules/hallucination/bubblegum_attack.dm b/code/modules/hallucination/bubblegum_attack.dm index 66dfa606dc3f..64a4f0e2036b 100644 --- a/code/modules/hallucination/bubblegum_attack.dm +++ b/code/modules/hallucination/bubblegum_attack.dm @@ -82,7 +82,7 @@ if(fake_bubbles.Adjacent(hallucinator)) hallucinator.Paralyze(8 SECONDS) - hallucinator.adjustStaminaLoss(40) + hallucinator.adjust_stamina_loss(40) step_away(hallucinator, fake_bubbles) shake_camera(hallucinator, 4, 3) hallucinator.visible_message( diff --git a/code/modules/hallucination/delusions.dm b/code/modules/hallucination/delusions.dm index c90b60d2f411..b52f031a5472 100644 --- a/code/modules/hallucination/delusions.dm +++ b/code/modules/hallucination/delusions.dm @@ -56,7 +56,7 @@ /datum/hallucination/delusion/Destroy() if(!QDELETED(hallucinator) && LAZYLEN(delusions)) - hallucinator.client?.images -= flatten_list(delusions) + hallucinator.client?.images -= assoc_to_values(delusions) LAZYNULL(delusions) return ..() diff --git a/code/modules/hallucination/eyes_in_dark.dm b/code/modules/hallucination/eyes_in_dark.dm index ec18da445ec3..181c8e17a4bb 100644 --- a/code/modules/hallucination/eyes_in_dark.dm +++ b/code/modules/hallucination/eyes_in_dark.dm @@ -69,15 +69,15 @@ /obj/effect/abstract/floating_eyes/update_overlays() . = ..() - var/mutable_appearance/r_eye = mutable_appearance(icon = 'icons/mob/human/human_face.dmi', icon_state = "eyes_glow_r") + var/mutable_appearance/r_eye = mutable_appearance(icon = 'icons/mob/human/human_eyes.dmi', icon_state = "eyes_glow_r") r_eye.color = COLOR_DARK_RED . += r_eye - var/mutable_appearance/l_eye = mutable_appearance(icon = 'icons/mob/human/human_face.dmi', icon_state = "eyes_glow_l") + var/mutable_appearance/l_eye = mutable_appearance(icon = 'icons/mob/human/human_eyes.dmi', icon_state = "eyes_glow_l") l_eye.color = COLOR_DARK_RED . += l_eye - . += emissive_appearance('icons/mob/human/human_face.dmi', "eyes_glow_l", src) - . += emissive_appearance('icons/mob/human/human_face.dmi', "eyes_glow_r", src) + . += emissive_appearance('icons/mob/human/human_eyes.dmi', "eyes_glow_l", src) + . += emissive_appearance('icons/mob/human/human_eyes.dmi', "eyes_glow_r", src) /obj/effect/abstract/floating_eyes/process(seconds_per_tick) var/turf/below_us = get_turf(src) diff --git a/code/modules/hallucination/hazard.dm b/code/modules/hallucination/hazard.dm index 81596ee1ea75..7d98c0ef82d3 100644 --- a/code/modules/hallucination/hazard.dm +++ b/code/modules/hallucination/hazard.dm @@ -63,7 +63,7 @@ return ..() /obj/effect/client_image_holder/hallucination/danger/lava/on_hallucinator_entered(mob/living/afflicted) - afflicted.adjustStaminaLoss(20) + afflicted.adjust_stamina_loss(20) afflicted.cause_hallucination(/datum/hallucination/fire, "fake lava hallucination") /obj/effect/client_image_holder/hallucination/danger/chasm diff --git a/code/modules/hallucination/malf_apc.dm b/code/modules/hallucination/malf_apc.dm new file mode 100644 index 000000000000..a0e724b9a4b3 --- /dev/null +++ b/code/modules/hallucination/malf_apc.dm @@ -0,0 +1,49 @@ +/datum/hallucination/malf_apc + random_hallucination_weight = 5 + hallucination_tier = HALLUCINATION_TIER_COMMON + + /// APC icon to use for the hallucination + var/apc_icon = 'icons/obj/machines/wallmounts.dmi' + /// APC icon state to use for the hallucination + var/apc_icon_state = "apcemag" + + /// The hacked APC image shown to the hallucinating mob + VAR_PRIVATE/image/hacked_image + +/datum/hallucination/malf_apc/start() + if(!hallucinator.client) + return FALSE + + var/num_ais = 0 + for(var/mob/living/silicon/ai/ai in GLOB.silicon_mobs) + if(is_valid_z_level(get_turf(hallucinator), get_turf(ai))) + num_ais += 1 + + // less likely to see apcs if there are few to no ais around, but no guarantees. + if(!prob(clamp(45 * num_ais, 10, 90))) + return FALSE + + var/list/nearby_apcs = list() + for(var/obj/machinery/power/apc/apc in view(hallucinator)) + if(!apc.is_operational || !apc.area || !apc.area.requires_power || apc.opened != APC_COVER_CLOSED) + continue + nearby_apcs += apc + + if(!length(nearby_apcs)) + return FALSE + + var/obj/machinery/power/apc/selected_apc = pick(nearby_apcs) + hacked_image = image( + icon = apc_icon, + icon_state = apc_icon_state, + layer = FLOAT_LAYER, + loc = selected_apc, + ) + hallucinator.client.images |= hacked_image + QDEL_IN(src, 1 SECONDS) + return TRUE + +/datum/hallucination/malf_apc/Destroy() + hallucinator.client?.images -= hacked_image + hacked_image = null + return ..() diff --git a/code/modules/hallucination/on_fire.dm b/code/modules/hallucination/on_fire.dm index 048d8dcc96cc..75534e475c97 100644 --- a/code/modules/hallucination/on_fire.dm +++ b/code/modules/hallucination/on_fire.dm @@ -106,7 +106,7 @@ else if(times_to_lower_stamina) next_action -= seconds_per_tick if(next_action < 0) - hallucinator.adjustStaminaLoss(15) + hallucinator.adjust_stamina_loss(15) next_action += 2 times_to_lower_stamina -= 1 diff --git a/code/modules/hallucination/shock.dm b/code/modules/hallucination/shock.dm index 85f144b050e4..c9982fc627d0 100644 --- a/code/modules/hallucination/shock.dm +++ b/code/modules/hallucination/shock.dm @@ -40,7 +40,7 @@ hallucinator.client?.images |= electrocution_skeleton_anim hallucinator.playsound_local(get_turf(src), SFX_SPARKS, 100, TRUE) - hallucinator.adjustStaminaLoss(50) + hallucinator.adjust_stamina_loss(50) hallucinator.Stun(4 SECONDS) hallucinator.do_jitter_animation(300) // Maximum jitter hallucinator.adjust_jitter(20 SECONDS) diff --git a/code/modules/hallucination/stray_bullet.dm b/code/modules/hallucination/stray_bullet.dm index 5641b6e8cfca..a1c40adf653a 100644 --- a/code/modules/hallucination/stray_bullet.dm +++ b/code/modules/hallucination/stray_bullet.dm @@ -196,7 +196,7 @@ hit_duration_wall = 5 /obj/projectile/hallucination/bullet/apply_effect_to_hallucinator(mob/living/afflicted) - afflicted.adjustStaminaLoss(60) + afflicted.adjust_stamina_loss(60) /obj/projectile/hallucination/laser name = "laser" @@ -216,7 +216,7 @@ reflectable = TRUE /obj/projectile/hallucination/laser/apply_effect_to_hallucinator(mob/living/afflicted) - afflicted.adjustStaminaLoss(20) + afflicted.adjust_stamina_loss(20) afflicted.adjust_eye_blur(4 SECONDS) /obj/projectile/hallucination/disabler @@ -236,7 +236,7 @@ reflectable = TRUE /obj/projectile/hallucination/disabler/apply_effect_to_hallucinator(mob/living/afflicted) - afflicted.adjustStaminaLoss(30) + afflicted.adjust_stamina_loss(30) /obj/projectile/hallucination/ebow name = "bolt" @@ -251,7 +251,7 @@ /obj/projectile/hallucination/ebow/apply_effect_to_hallucinator(mob/living/afflicted) afflicted.adjust_slurring(10 SECONDS) afflicted.Knockdown(1 SECONDS) - afflicted.adjustStaminaLoss(75) // 60 stam + 15 tox + afflicted.adjust_stamina_loss(75) // 60 stam + 15 tox afflicted.adjust_eye_blur(20 SECONDS) /obj/projectile/hallucination/change diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 679b1709bccd..277e689656b7 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -847,7 +847,13 @@ GLOBAL_LIST_INIT(holiday_mail, list()) begin_month = DECEMBER end_day = 27 holiday_hat = /obj/item/clothing/head/costume/santa - no_mail_holiday = TRUE + holiday_mail = list( + /obj/item/clothing/head/beanie/christmas, + /obj/item/clothing/neck/scarf/christmas, + /obj/item/food/cookie/sugar, + /obj/item/gift/anything, + /obj/item/toy/xmas_cracker, + ) holiday_colors = list( COLOR_CHRISTMAS_GREEN, COLOR_CHRISTMAS_RED, @@ -876,6 +882,27 @@ GLOBAL_LIST_INIT(holiday_mail, list()) /datum/holiday/xmas/greet() return "Have a merry Christmas!" +/datum/holiday/xmas/celebrate() + . = ..() + SSticker.OnRoundstart(CALLBACK(src, PROC_REF(roundstart_celebrate))) + GLOB.maintenance_loot += list( + list( + /obj/item/clothing/head/costume/santa = 1, + /obj/item/gift/anything = 1, + /obj/item/toy/xmas_cracker = 3, + ) = maint_holiday_weight, + ) + +/datum/holiday/xmas/proc/roundstart_celebrate() + 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) + Ian.place_on_head(new /obj/item/clothing/head/helmet/space/santahat(Ian)) + + var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/costumes_toys/christmas] + pack.order_flags |= ORDER_SPECIAL_ENABLED + /datum/holiday/boxing name = "Boxing Day" begin_day = 26 @@ -984,27 +1011,6 @@ GLOBAL_LIST_INIT(holiday_mail, list()) /datum/holiday/hebrew/passover/getStationPrefix() return pick("Matzah", "Moses", "Red Sea") -// HOLIDAY ADDONS - -/datum/holiday/xmas/celebrate() - . = ..() - SSticker.OnRoundstart(CALLBACK(src, PROC_REF(roundstart_celebrate))) - GLOB.maintenance_loot += list( - list( - /obj/item/clothing/head/costume/santa = 1, - /obj/item/gift/anything = 1, - /obj/item/toy/xmas_cracker = 3, - ) = maint_holiday_weight, - ) - -/datum/holiday/xmas/proc/roundstart_celebrate() - 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) - Ian.place_on_head(new /obj/item/clothing/head/helmet/space/santahat(Ian)) - - // EASTER (this having its own spot should be understandable) /datum/holiday/easter diff --git a/code/modules/holodeck/holodeck_map_templates.dm b/code/modules/holodeck/holodeck_map_templates.dm index 445574c7e03c..3e79de6ea43e 100644 --- a/code/modules/holodeck/holodeck_map_templates.dm +++ b/code/modules/holodeck/holodeck_map_templates.dm @@ -109,6 +109,11 @@ template_id = "holodeck_card_battle" mappath = "_maps/templates/holodeck_card_battle.dmm" +/datum/map_template/holodeck/fitness + name = "Holodeck - Gymnasium" + template_id = "holodeck_fitness" + mappath = "_maps/templates/holodeck_fitness.dmm" + //bad evil no good programs /datum/map_template/holodeck/medicalsim diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index 741cd4721837..dfa1526dbb68 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -129,9 +129,12 @@ if(numbuttons == numready) begin_event() -/obj/machinery/readybutton/update_icon_state() - icon_state = "auth_[ready ? "on" : "off"]" - return ..() +/obj/machinery/readybutton/update_overlays() + . = ..() + if(ready && is_operational) + . += mutable_appearance(icon, "auth_on") + . += emissive_appearance(icon, "auth_on", src, alpha = src.alpha) + /obj/machinery/readybutton/proc/begin_event() diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 02722d8a1541..7ef38b1a778b 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -63,7 +63,7 @@ desc = "Looking at the luscious field, you suddenly feel homesick." icon_state = "grass0" bullet_bounce_sound = null - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/floor/holofloor/grass/Initialize(mapload) . = ..() @@ -76,7 +76,7 @@ icon = 'icons/turf/sand.dmi' icon_state = "sand" bullet_bounce_sound = null - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/floor/holofloor/beach/coast gender = NEUTER @@ -103,7 +103,7 @@ name = "asteroid sand" desc = "The sand crunches beneath your feet, though it feels soft to the touch." icon_state = "asteroid" - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/floor/holofloor/asteroid/Initialize(mapload) icon_state = "asteroid[rand(0, 12)]" @@ -114,7 +114,7 @@ name = "basalt" desc = "You still feel hot, despite the cool walls of the holodeck." icon_state = "basalt0" - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/floor/holofloor/basalt/Initialize(mapload) . = ..() @@ -140,7 +140,7 @@ icon = 'icons/turf/space.dmi' icon_state = "speedspace_ns_1" bullet_bounce_sound = null - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/floor/holofloor/hyperspace/Initialize(mapload) icon_state = "speedspace_ns_[(x + 5*y + (y%2+1)*7)%15+1]" @@ -161,7 +161,7 @@ smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET canSmoothWith = SMOOTH_GROUP_CARPET bullet_bounce_sound = null - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/floor/holofloor/carpet/Initialize(mapload) . = ..() @@ -175,7 +175,7 @@ /turf/open/floor/holofloor/wood icon_state = "wood" desc = "Makes you feel at home." - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/floor/holofloor/snow gender = PLURAL @@ -186,7 +186,7 @@ slowdown = 2 bullet_sizzle = TRUE bullet_bounce_sound = null - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/floor/holofloor/dark icon_state = "darkfull" @@ -195,7 +195,7 @@ /turf/open/floor/holofloor/stairs name = "stairs" icon_state = "stairs" - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/floor/holofloor/stairs/left icon_state = "stairs-l" diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index cb073c99b03b..ff25eac7976b 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -30,6 +30,7 @@ icon_state = "beebox" anchored = TRUE density = TRUE + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 40) 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() diff --git a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm index 3b759a95f496..cebb2364d827 100644 --- a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm +++ b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm @@ -5,6 +5,9 @@ icon_state = "beekeeper" inhand_icon_state = null clothing_flags = THICKMATERIAL | SNUG_FIT + pickup_sound = null + drop_sound = null + equip_sound = null /obj/item/clothing/suit/utility/beekeeper_suit name = "beekeeper suit" diff --git a/code/modules/hydroponics/beekeeping/honey_frame.dm b/code/modules/hydroponics/beekeeping/honey_frame.dm index 5c4c1f3f8d1c..bb92091b6d15 100644 --- a/code/modules/hydroponics/beekeeping/honey_frame.dm +++ b/code/modules/hydroponics/beekeeping/honey_frame.dm @@ -4,6 +4,7 @@ desc = "A scaffold for bees to build honeycomb on." icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "honey_frame" + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 5) var/honeycomb_capacity = 10 //10 Honeycomb per frame by default, researchable frames perhaps? diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 0426d59ae012..b2dd7cb3a939 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -440,15 +440,17 @@ if(!can_interact(user)) return + var/obj/item/ejected_beaker = beaker + if(user.put_in_hands(beaker)) if(!silent) - to_chat(user, span_notice("You eject [beaker] from [src].")) + to_chat(user, span_notice("You eject [ejected_beaker] from [src].")) else if(!silent) - to_chat(user, span_notice("You eject [beaker] from [src] onto the ground.")) + to_chat(user, span_notice("You eject [ejected_beaker] from [src] onto the ground.")) - beaker.forceMove(drop_location()) + ejected_beaker.forceMove(drop_location()) beaker = null update_appearance(UPDATE_ICON) diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index ab52f9e6c56a..b4c15f221a24 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -10,6 +10,7 @@ anchored = FALSE pressure_resistance = 2 * ONE_ATMOSPHERE max_integrity = 300 + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 8) /// Is the barrel currently opened? var/open = FALSE /// Can the barrel be opened? diff --git a/code/modules/hydroponics/grafts.dm b/code/modules/hydroponics/grafts.dm index 822169a8aefa..35abfb08cfc5 100644 --- a/code/modules/hydroponics/grafts.dm +++ b/code/modules/hydroponics/grafts.dm @@ -10,39 +10,30 @@ worn_icon_state = "graft" attack_verb_continuous = list("plants", "vegitizes", "crops", "reaps", "farms") attack_verb_simple = list("plant", "vegitize", "crop", "reap", "farm") - ///The stored trait taken from the parent plant. Defaults to perenial growth. - var/datum/plant_gene/stored_trait - ///Determines the appearance of the graft. Rudimentary right now so it just picks randomly. - var/graft_appearance - /// The name of the plant this was taken from. - var/parent_name = "" - ///The lifespan stat of the parent seed when the graft was taken. - var/lifespan - ///The endurance stat of the parent seed when the graft was taken. - var/endurance - ///The production stat of the parent seed when the graft was taken. - var/production - ///The weed_rate stat of the parent seed when the graft was taken. - var/weed_rate - ///The weed_chance stat of the parent seed when the graft was taken. - var/weed_chance - ///The yield stat of the parent seed when the graft was taken. - var/yield + /// Our internal seed used to modify stats or genes by grafting or passed as our seed when propagating vegetatively, + var/obj/item/seeds/plant_dna = /obj/item/seeds/apple - -/obj/item/graft/Initialize(mapload, datum/plant_gene/trait/trait_path) +/obj/item/graft/Initialize(mapload, obj/item/seeds/mother_plant) . = ..() - //Default gene is repeated harvest. - if(trait_path) - stored_trait = new trait_path - else - stored_trait = new /datum/plant_gene/trait/repeated_harvest + //create our "plant dna" internal seed from the plant the cuttings are taken from. + if(mother_plant) + if(ispath(mother_plant)) + plant_dna = new mother_plant() + if(!istype(plant_dna)) + CRASH("Tried to create a graft using a non-seed path.") + else if(istype(mother_plant)) + plant_dna = mother_plant.Copy() + else + CRASH("Tried to create a graft using a non-seed reference.") + icon_state = pick( 10 ; "graft_plant" , \ 5 ; "graft_flower" , \ 4 ; "graft_mushroom" , \ 1 ; "graft_doom" ) + name += " ([plant_dna.plantname])" + var/static/list/hovering_item_typechecks = list( /obj/item/plant_analyzer = list( SCREENTIP_CONTEXT_LMB = "Scan graft", @@ -50,7 +41,3 @@ ) AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks) - -/obj/item/graft/Destroy() - QDEL_NULL(stored_trait) - return ..() diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 3a819bf9941e..e964fbc029d1 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -83,6 +83,8 @@ 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! + AddElement(/datum/element/contextual_screentip_sharpness, rmb_text = "Extract Seed") // DARKPACK EDIT ADD + /obj/item/food/grown/Destroy() if(isatom(seed)) QDEL_NULL(seed) @@ -141,13 +143,17 @@ reagents.del_reagent(reagent.type) /obj/item/food/grown/grind_atom(datum/reagents/target_holder, mob/user) - var/grind_results_num = LAZYLEN(grind_results) + var/list/grind_reagents = grind_results() + for(var/datum/reagent/result as anything in grind_reagents) + grind_reagents[result] = round(seed.potency) + + var/grind_results_num = length(grind_reagents) if(grind_results_num) var/average_purity = reagents.get_average_purity() var/total_nutriment_amount = reagents.get_reagent_amount(/datum/reagent/consumable/nutriment, type_check = REAGENT_SUB_TYPE) var/single_reagent_amount = grind_results_num > 1 ? round(total_nutriment_amount / grind_results_num, CHEMICAL_QUANTISATION_LEVEL) : total_nutriment_amount reagents.remove_reagent(/datum/reagent/consumable/nutriment, total_nutriment_amount, include_subtypes = TRUE) - for(var/reagent in grind_results) + for(var/reagent in grind_reagents) reagents.add_reagent(reagent, single_reagent_amount, added_purity = average_purity) return reagents?.trans_to(target_holder, reagents.total_volume, transferred_by = user) @@ -167,5 +173,17 @@ else return ..() +// DARKPACK EDIT ADD START +/obj/item/food/grown/item_interaction_secondary(mob/living/user, obj/item/tool, list/modifiers) + if(tool.get_sharpness()) + playsound(src, 'sound/items/weapons/slice.ogg', 25, TRUE, -1) + if(do_after(user, 2 SECONDS, src)) + to_chat(user, span_notice("You split apart the [src]!")) + seedify(src, 1, user = user) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_FAILURE + . = ..() +// DARKPACK EDIT ADD END + #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 054809873262..374ecb053d5e 100644 --- a/code/modules/hydroponics/grown/aloe.dm +++ b/code/modules/hydroponics/grown/aloe.dm @@ -23,9 +23,11 @@ icon_state = "aloe" bite_consumption_mod = 3 foodtypes = VEGETABLES - juice_typepath = /datum/reagent/consumable/aloejuice distill_reagent = /datum/reagent/consumable/ethanol/tequila +/obj/item/food/grown/aloe/juice_typepath() + return /datum/reagent/consumable/aloejuice + /obj/item/food/grown/aloe/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/stack/medical/aloe/fresh, rand(15 SECONDS, 20 SECONDS), TRUE, TRUE) diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm index 696222a0f8e1..933957240b23 100644 --- a/code/modules/hydroponics/grown/apple.dm +++ b/code/modules/hydroponics/grown/apple.dm @@ -22,12 +22,14 @@ desc = "It's a little piece of Eden." icon_state = "apple" foodtypes = FRUIT - juice_typepath = /datum/reagent/consumable/applejuice tastes = list("apple" = 1) distill_reagent = /datum/reagent/consumable/ethanol/hcider +/obj/item/food/grown/apple/juice_typepath() + return /datum/reagent/consumable/applejuice + /obj/item/food/grown/apple/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/appleslice, 5, 20, screentip_verb = "Slice") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/appleslice, 5, 20, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/grown/apple/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index e3216311efa7..1aac3a250699 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -25,9 +25,11 @@ trash_type = /obj/item/grown/bananapeel bite_consumption_mod = 3 foodtypes = FRUIT - juice_typepath = /datum/reagent/consumable/banana distill_reagent = /datum/reagent/consumable/ethanol/bananahonk +/obj/item/food/grown/banana/juice_typepath() + return /datum/reagent/consumable/banana + /obj/item/food/grown/banana/make_edible() . = ..() AddComponentFrom(SOURCE_EDIBLE_INNATE, /datum/component/edible, check_liked = CALLBACK(src, PROC_REF(check_liked))) @@ -43,12 +45,6 @@ if (!HAS_TRAIT(consumer, TRAIT_AGEUSIA) && liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) return FOOD_LIKED -/obj/item/food/grown/banana/generate_trash(atom/location) - . = ..() - var/obj/item/grown/bananapeel/peel = . - if(istype(peel)) - peel.grind_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!")) playsound(loc, 'sound/items/bikehorn.ogg', 50, TRUE, -1) @@ -84,6 +80,9 @@ else icon_state = "[icon_state]_3" +/obj/item/grown/bananapeel/grind_results() + return list(/datum/reagent/medicine/coagulant/banana_peel = seed.potency * 0.2) + /obj/item/grown/bananapeel/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is deliberately slipping on [src]! It looks like [user.p_theyre()] trying to commit suicide!")) playsound(loc, 'sound/misc/slip.ogg', 50, TRUE, -1) diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm index afb575cbd0ab..51c8643113e0 100644 --- a/code/modules/hydroponics/grown/beans.dm +++ b/code/modules/hydroponics/grown/beans.dm @@ -24,10 +24,12 @@ gender = PLURAL icon_state = "soybeans" foodtypes = VEGETABLES - juice_typepath = /datum/reagent/consumable/soymilk tastes = list("soy" = 1) distill_reagent = /datum/reagent/consumable/soysauce +/obj/item/food/grown/soybeans/juice_typepath() + return /datum/reagent/consumable/soymilk + // Koibean /obj/item/seeds/soya/koi name = "koibean seed pack" diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index 0ab3637d00ac..5f457d83d272 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -25,10 +25,12 @@ icon_state = "berrypile" gender = PLURAL foodtypes = FRUIT - juice_typepath = /datum/reagent/consumable/berryjuice tastes = list("berry" = 1) distill_reagent = /datum/reagent/consumable/ethanol/gin +/obj/item/food/grown/berries/juice_typepath() + return /datum/reagent/consumable/berryjuice + // Poison Berries /obj/item/seeds/berry/poison name = "poison-berry seed pack" @@ -48,11 +50,13 @@ icon_state = "poisonberrypile" bite_consumption_mod = 3 foodtypes = FRUIT | TOXIC - juice_typepath = /datum/reagent/consumable/poisonberryjuice tastes = list("poison-berry" = 1) distill_reagent = null wine_power = 35 +/obj/item/food/grown/berries/poison/juice_typepath() + return /datum/reagent/consumable/poisonberryjuice + // Death Berries /obj/item/seeds/berry/death name = "death-berry seed pack" @@ -74,11 +78,13 @@ icon_state = "deathberrypile" bite_consumption_mod = 3 foodtypes = FRUIT | TOXIC - juice_typepath = /datum/reagent/consumable/poisonberryjuice tastes = list("death-berry" = 1) distill_reagent = null wine_power = 50 +/obj/item/food/grown/berries/death/juice_typepath() + return /datum/reagent/consumable/poisonberryjuice + // Glow Berries /obj/item/seeds/berry/glow name = "glow-berry seed pack" @@ -134,10 +140,12 @@ icon_state = "grapes" bite_consumption_mod = 2 foodtypes = FRUIT - juice_typepath = /datum/reagent/consumable/grapejuice tastes = list("grape" = 1) distill_reagent = /datum/reagent/consumable/ethanol/wine +/obj/item/food/grown/grapes/juice_typepath() + return /datum/reagent/consumable/grapejuice + /obj/item/food/grown/grapes/make_dryable() AddElement(/datum/element/dryable, /obj/item/food/no_raisin/healthy) @@ -185,10 +193,12 @@ 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_typepath = /datum/reagent/consumable/toechtauese_juice tastes = list("fiery itchy pain" = 1) distill_reagent = /datum/reagent/toxin/itching_powder +/obj/item/food/grown/toechtauese/juice_typepath() + return /datum/reagent/consumable/toechtauese_juice + /obj/item/seeds/lanternfruit name = "lanternfruit seed pack" desc = "These seeds grow into lanternfruit pods." diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index 017528538913..24b7fb95869c 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -2,19 +2,21 @@ /obj/item/seeds/cannabis name = "cannabis seed pack" desc = "Taxable." + icon = 'modular_darkpack/modules/drugs/icons/items.dmi' // DARKPACK EDIT CHANGE - DRUGS icon_state = "seed-cannabis" - plant_icon_offset = 6 + plant_icon_offset = 7 // DARKPACK EDIT CHANGE - DRUGS species = "cannabis" plantname = "Cannabis Plant" product = /obj/item/food/grown/cannabis maturation = 8 potency = 20 - growthstages = 1 + growthstages = 3 // DARKPACK EDIT CHANGE - DRUGS instability = 40 - growing_icon = 'icons/obj/service/hydroponics/growing.dmi' + growing_icon = 'modular_darkpack/modules/drugs/icons/growing.dmi' // DARKPACK EDIT CHANGE - DRUGS 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) + /* // DARKPACK EDIT REMOVAL START - DRUGS mutatelist = list( /obj/item/seeds/cannabis/anti, /obj/item/seeds/cannabis/death, @@ -22,58 +24,60 @@ /obj/item/seeds/cannabis/ultimate, /obj/item/seeds/cannabis/white, ) + */ reagents_add = list(/datum/reagent/drug/cannabis = 0.15) /obj/item/seeds/cannabis/rainbow name = "rainbow weed seed pack" desc = "These seeds grow into rainbow weed. Groovy... and also highly addictive." - icon_state = "seed-megacannabis" - icon_grow = "megacannabis-grow" - species = "megacannabis" + // icon_state = "seed-megacannabis" // DARKPACK EDIT REMOVAL - DRUGS + // icon_grow = "megacannabis-grow" // DARKPACK EDIT REMOVAL - DRUGS + // species = "megacannabis" // DARKPACK EDIT REMOVAL - DRUGS plantname = "Rainbow Weed" product = /obj/item/food/grown/cannabis/rainbow mutatelist = null - reagents_add = list(/datum/reagent/colorful_reagent = 0.05, /datum/reagent/medicine/psicodine = 0.03, /datum/reagent/drug/happiness = 0.1, /datum/reagent/toxin/mindbreaker = 0.1, /datum/reagent/toxin/lipolicide = 0.15, /datum/reagent/drug/space_drugs = 0.15) + // reagents_add = list(/datum/reagent/colorful_reagent = 0.05, /datum/reagent/medicine/psicodine = 0.03, /datum/reagent/drug/happiness = 0.1, /datum/reagent/toxin/mindbreaker = 0.1, /datum/reagent/toxin/lipolicide = 0.15, /datum/reagent/drug/space_drugs = 0.15) // DARKPACK EDIT REMOVAL - DRUGS rarity = 40 /obj/item/seeds/cannabis/death name = "deathweed seed pack" desc = "These seeds grow into deathweed. Not groovy." - icon_state = "seed-blackcannabis" - icon_grow = "blackcannabis-grow" - species = "blackcannabis" + // icon_state = "seed-blackcannabis" // DARKPACK EDIT REMOVAL - DRUGS + // icon_grow = "blackcannabis-grow" // DARKPACK EDIT REMOVAL - DRUGS + // species = "blackcannabis" // DARKPACK EDIT REMOVAL - DRUGS plantname = "Deathweed" product = /obj/item/food/grown/cannabis/death mutatelist = null - reagents_add = list(/datum/reagent/toxin/cyanide = 0.35, /datum/reagent/drug/cannabis = 0.15) + // reagents_add = list(/datum/reagent/toxin/cyanide = 0.35, /datum/reagent/drug/cannabis = 0.15) // DARKPACK EDIT REMOVAL - DRUGS rarity = 40 /obj/item/seeds/cannabis/white name = "lifeweed seed pack" desc = "I will give unto him that is munchies of the fountain of the cravings of life, freely." - icon_state = "seed-whitecannabis" - icon_grow = "whitecannabis-grow" - species = "whitecannabis" + // icon_state = "seed-whitecannabis" // DARKPACK EDIT REMOVAL - DRUGS + // icon_grow = "whitecannabis-grow" // DARKPACK EDIT REMOVAL - DRUGS + // species = "whitecannabis" // DARKPACK EDIT REMOVAL - DRUGS plantname = "Lifeweed" instability = 30 product = /obj/item/food/grown/cannabis/white mutatelist = null - reagents_add = list(/datum/reagent/medicine/omnizine = 0.35, /datum/reagent/drug/cannabis = 0.15) + // reagents_add = list(/datum/reagent/medicine/omnizine = 0.35, /datum/reagent/drug/cannabis = 0.15) // DARKPACK EDIT REMOVAL - DRUGS rarity = 40 /obj/item/seeds/cannabis/ultimate name = "omega weed seed pack" desc = "These seeds grow into omega weed." - icon_state = "seed-ocannabis" - plant_icon_offset = 0 - icon_grow = "ocannabis-grow" - species = "ocannabis" + // icon_state = "seed-ocannabis" // DARKPACK EDIT REMOVAL - DRUGS + // plant_icon_offset = 1 // DARKPACK EDIT REMOVAL - DRUGS + // icon_grow = "ocannabis-grow" // DARKPACK EDIT REMOVAL - DRUGS + // species = "ocannabis" // DARKPACK EDIT REMOVAL - DRUGS plantname = "Omega Weed" product = /obj/item/food/grown/cannabis/ultimate genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/green, /datum/plant_gene/trait/modified_volume/omega_weed) mutatelist = null + /* // DARKPACK EDIT REMOVAL - DRUGS reagents_add = list(/datum/reagent/drug/cannabis = 0.3, /datum/reagent/toxin/mindbreaker = 0.3, /datum/reagent/mercury = 0.15, @@ -84,22 +88,22 @@ /datum/reagent/drug/krokodil = 0.15, /datum/reagent/toxin/lipolicide = 0.15, /datum/reagent/drug/nicotine = 0.1, - ) + )*/ rarity = 69 graft_gene = /datum/plant_gene/trait/glow/green /obj/item/seeds/cannabis/anti name = "anti weed seed pack" desc = "These seeds grow into anti weed." - icon_state = "seed-ocannabis" - plant_icon_offset = 0 - icon_grow = "ocannabis-grow" - species = "ocannabis" + // icon_state = "seed-ocannabis" // DARKPACK EDIT REMOVAL - DRUGS + // plant_icon_offset = 0 // DARKPACK EDIT REMOVAL - DRUGS + // icon_grow = "ocannabis-grow" // DARKPACK EDIT REMOVAL - DRUGS + // species = "ocannabis" // DARKPACK EDIT REMOVAL - DRUGS plantname = "Anti Weed" product = /obj/item/food/grown/cannabis/anti genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/shadow) mutatelist = null - reagents_add = list(/datum/reagent/medicine/naloxone = 0.3, /datum/reagent/medicine/antihol = 0.2, /datum/reagent/medicine/synaphydramine = 0.1) + // reagents_add = list(/datum/reagent/medicine/naloxone = 0.3, /datum/reagent/medicine/antihol = 0.2, /datum/reagent/medicine/synaphydramine = 0.1) // DARKPACK EDIT REMOVAL - DRUGS rarity = 40 instability = 0 @@ -117,41 +121,50 @@ /obj/item/food/grown/cannabis seed = /obj/item/seeds/cannabis - icon = 'icons/obj/service/hydroponics/harvest.dmi' + icon = 'modular_darkpack/modules/drugs/icons/items.dmi' // DARKPACK EDIT CHANGE - DRUGS + ONFLOOR_ICON_HELPER('modular_darkpack/modules/drugs/icons/onfloor.dmi')// DARKPACK EDIT ADD - DRUGS name = "cannabis leaf" - desc = "Recently legalized in most galaxies." + desc = "They say that next year they're going to try to legalise it." // DARKPACK EDIT CHANGE icon_state = "cannabis" bite_consumption_mod = 4 foodtypes = VEGETABLES //i dont really know what else weed could be to be honest tastes = list("cannabis" = 1) wine_power = 20 +// DARKPACK EDIT ADD START +/obj/item/food/grown/cannabis/Initialize(mapload, obj/item/seeds/new_seed) + . = ..() + AddComponent(/datum/component/selling, 100, "weed", TRUE, -1, 7) + //In 2015 Cannabis was only legally distributed in California by medical dispensary. https://web.archive.org/web/20161109220853/http://www.times-standard.com/article/NJ/20161107/NEWS/161109826 + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) +// DARKPACK EDIT ADD END + /obj/item/food/grown/cannabis/rainbow seed = /obj/item/seeds/cannabis/rainbow name = "rainbow cannabis leaf" desc = "Is it supposed to be glowing like that...?" - icon_state = "megacannabis" + // icon_state = "megacannabis" // DARKPACK EDIT REMOVAL - DRUGS wine_power = 60 /obj/item/food/grown/cannabis/death seed = /obj/item/seeds/cannabis/death name = "death cannabis leaf" desc = "Looks a bit dark. Oh well." - icon_state = "blackcannabis" + // icon_state = "blackcannabis" // DARKPACK EDIT REMOVAL - DRUGS wine_power = 40 /obj/item/food/grown/cannabis/white seed = /obj/item/seeds/cannabis/white name = "white cannabis leaf" desc = "It feels smooth and nice to the touch." - icon_state = "whitecannabis" + // icon_state = "whitecannabis" // DARKPACK EDIT REMOVAL - DRUGS wine_power = 10 /obj/item/food/grown/cannabis/ultimate seed = /obj/item/seeds/cannabis/ultimate name = "omega cannabis leaf" desc = "You feel dizzy looking at it. What the fuck?" - icon_state = "ocannabis" + // icon_state = "ocannabis" // DARKPACK EDIT REMOVAL - DRUGS bite_consumption_mod = 2 // Ingesting like 40 units of drugs in 1 bite at 100 potency wine_power = 90 @@ -159,7 +172,7 @@ seed = /obj/item/seeds/cannabis/anti name = "anti cannabis leaf" desc = "You feel normal looking at it. What the fuck?" - icon_state = "ocannabis" + // icon_state = "ocannabis" // DARKPACK EDIT REMOVAL - DRUGS /obj/item/food/grown/cannabis/anti/Initialize(mapload, obj/item/seeds/new_seed) . = ..() diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index f1fdfe807ef1..442eced5b53c 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -22,12 +22,14 @@ icon_state = "wheat" bite_consumption_mod = 0.5 // Chewing on wheat grains? foodtypes = GRAIN - grind_results = list(/datum/reagent/consumable/flour = 0) tastes = list("wheat" = 1) distill_reagent = /datum/reagent/consumable/ethanol/beer slot_flags = ITEM_SLOT_MASK worn_icon = 'icons/mob/clothing/head/hydroponics.dmi' +/obj/item/food/grown/wheat/grind_results() + return list(/datum/reagent/consumable/flour = 0) + // Oat /obj/item/seeds/wheat/oat name = "oat seed pack" @@ -46,10 +48,12 @@ icon_state = "oat" bite_consumption_mod = 0.5 foodtypes = GRAIN - grind_results = list(/datum/reagent/consumable/flour = 0) tastes = list("oat" = 1) distill_reagent = /datum/reagent/consumable/ethanol/ale +/obj/item/food/grown/oat/grind_results() + return list(/datum/reagent/consumable/flour = 0) + // Rice /obj/item/seeds/wheat/rice name = "rice seed pack" @@ -61,6 +65,8 @@ product = /obj/item/food/grown/rice mutatelist = null growthstages = 3 + genes = list(/datum/plant_gene/trait/semiaquatic) + /obj/item/food/grown/rice seed = /obj/item/seeds/wheat/rice @@ -70,10 +76,12 @@ icon_state = "rice" bite_consumption_mod = 0.5 foodtypes = GRAIN - grind_results = list(/datum/reagent/consumable/rice = 0) tastes = list("rice" = 1) distill_reagent = /datum/reagent/consumable/ethanol/sake +/obj/item/food/grown/rice/grind_results() + return list(/datum/reagent/consumable/rice = 0) + //Meatwheat - grows into synthetic meat /obj/item/seeds/wheat/meat name = "meatwheat seed pack" @@ -92,12 +100,14 @@ bite_consumption_mod = 0.5 seed = /obj/item/seeds/wheat/meat foodtypes = MEAT - grind_results = list(/datum/reagent/consumable/flour = 0, /datum/reagent/blood = 0) tastes = list("meatwheat" = 1) can_distill = FALSE slot_flags = ITEM_SLOT_MASK worn_icon = 'icons/mob/clothing/head/hydroponics.dmi' +/obj/item/food/grown/meatwheat/grind_results() + return list(/datum/reagent/consumable/flour = 0, /datum/reagent/blood = 0) + /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/blob/blobattack.ogg', 50, TRUE) diff --git a/code/modules/hydroponics/grown/cherries.dm b/code/modules/hydroponics/grown/cherries.dm index ad35bacf8fe7..c34daf523eb4 100644 --- a/code/modules/hydroponics/grown/cherries.dm +++ b/code/modules/hydroponics/grown/cherries.dm @@ -28,10 +28,12 @@ gender = PLURAL bite_consumption_mod = 2 foodtypes = FRUIT - grind_results = list(/datum/reagent/consumable/cherryjelly = 0) tastes = list("cherry" = 1) wine_power = 30 +/obj/item/food/grown/cherries/grind_results() + return list(/datum/reagent/consumable/cherryjelly = 0) + // Blue Cherries /obj/item/seeds/cherry/blue name = "blue cherry pit pack" @@ -51,10 +53,12 @@ icon_state = "bluecherry" bite_consumption_mod = 2 foodtypes = FRUIT - grind_results = list(/datum/reagent/consumable/bluecherryjelly = 0) tastes = list("blue cherry" = 1) wine_power = 50 +/obj/item/food/grown/bluecherries/grind_results() + return list(/datum/reagent/consumable/bluecherryjelly = 0) + //Cherry Bulbs /obj/item/seeds/cherry/bulb name = "cherry bulb pit pack" @@ -76,10 +80,12 @@ icon_state = "cherry_bulb" bite_consumption_mod = 2 foodtypes = FRUIT - grind_results = list(/datum/reagent/consumable/cherryjelly = 0) tastes = list("cherry" = 1) wine_power = 50 +/obj/item/food/grown/cherrybulbs/grind_results() + return list(/datum/reagent/consumable/cherryjelly = 0) + //Cherry Bombs /obj/item/seeds/cherry/bomb name = "cherry bomb pit pack" diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index 93be3a4a05f1..9b58432ec445 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -30,7 +30,9 @@ name = "lime" desc = "It's so sour, your face will twist." icon_state = "lime" - juice_typepath = /datum/reagent/consumable/limejuice + +/obj/item/food/grown/citrus/lime/juice_typepath() + return /datum/reagent/consumable/limejuice // Orange /obj/item/seeds/orange @@ -57,9 +59,11 @@ desc = "It's a tangy fruit." icon_state = "orange" foodtypes = ORANGES | FRUIT - juice_typepath = /datum/reagent/consumable/orangejuice distill_reagent = /datum/reagent/consumable/ethanol/triple_sec +/obj/item/food/grown/citrus/orange/juice_typepath() + return /datum/reagent/consumable/orangejuice + // Lemon /obj/item/seeds/lemon name = "lemon seed pack" @@ -83,7 +87,9 @@ name = "lemon" desc = "When life gives you lemons, make lemonade." icon_state = "lemon" - juice_typepath = /datum/reagent/consumable/lemonjuice + +/obj/item/food/grown/citrus/lemon/juice_typepath() + return /datum/reagent/consumable/lemonjuice // Combustible lemon /obj/item/seeds/firelemon //combustible lemon is too long so firelemon @@ -138,10 +144,12 @@ foodtypes = ORANGES alt_icon = "orange" bite_consumption_mod = 2 - juice_typepath = /datum/reagent/consumable/orangejuice distill_reagent = /datum/reagent/toxin/mindbreaker tastes = list("polygons" = 1, "bluespace" = 1, "the true nature of reality" = 1) +/obj/item/food/grown/citrus/orange_3d/juice_typepath() + return /datum/reagent/consumable/orangejuice + /obj/item/food/grown/citrus/orange_3d/pickup(mob/user) . = ..() icon_state = alt_icon diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm index e4b6c916f7cc..62700dc6e5aa 100644 --- a/code/modules/hydroponics/grown/cocoa_vanilla.dm +++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm @@ -80,10 +80,12 @@ bite_consumption_mod = 2 trash_type = /obj/item/food/grown/bungopit foodtypes = FRUIT - juice_typepath = /datum/reagent/consumable/bungojuice tastes = list("bungo" = 2, "tropical fruitiness" = 1) distill_reagent = null +/obj/item/food/grown/bungofruit/juice_typepath() + return /datum/reagent/consumable/bungojuice + /obj/item/food/grown/bungopit seed = /obj/item/seeds/cocoapod/bungotree name = "bungo pit" diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index a55ae42e449c..cd8ecb5ef5e2 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -24,11 +24,15 @@ trash_type = /obj/item/grown/corncob bite_consumption_mod = 2 foodtypes = VEGETABLES - grind_results = list(/datum/reagent/consumable/cornmeal = 0, /datum/reagent/consumable/nutriment/fat/oil/corn = 0) - juice_typepath = /datum/reagent/consumable/corn_starch tastes = list("corn" = 1) distill_reagent = /datum/reagent/consumable/ethanol/whiskey +/obj/item/food/grown/corn/grind_results() + return list(/datum/reagent/consumable/cornmeal = 0, /datum/reagent/consumable/nutriment/fat/oil/corn = 0) + +/obj/item/food/grown/corn/juice_typepath() + return /datum/reagent/consumable/corn_starch + /obj/item/food/grown/corn/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/oven_baked_corn, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) @@ -45,7 +49,9 @@ throwforce = 0 throw_speed = 3 throw_range = 7 - grind_results = list(/datum/reagent/cellulose = 10) //really partially hemicellulose + +/obj/item/grown/corncob/grind_results() + return list(/datum/reagent/cellulose = 10) /obj/item/grown/corncob/attackby(obj/item/grown/W, mob/user, list/modifiers, list/attack_modifiers) if(W.get_sharpness()) @@ -116,9 +122,11 @@ icon_state = "peppercorn" trash_type = /obj/item/grown/corncob/pepper foodtypes = VEGETABLES - grind_results = list(/datum/reagent/consumable/blackpepper = 0) tastes = list("pepper" = 1, "sneezing" = 1) +/obj/item/food/grown/peppercorn/grind_results() + return list(/datum/reagent/consumable/blackpepper = 0) + /obj/item/grown/corncob/pepper seed = /obj/item/seeds/corn/pepper name = "pepper corn cob" diff --git a/code/modules/hydroponics/grown/cucumber.dm b/code/modules/hydroponics/grown/cucumber.dm index a8487a0cac9b..5a4358a08415 100644 --- a/code/modules/hydroponics/grown/cucumber.dm +++ b/code/modules/hydroponics/grown/cucumber.dm @@ -22,5 +22,7 @@ desc = "Oblong and green, with pimples, the standard of salads." icon_state = "cucumber" foodtypes = VEGETABLES - juice_typepath = /datum/reagent/consumable/cucumberjuice tastes = list("cucumber" = 1) + +/obj/item/food/grown/cucumber/juice_typepath() + return /datum/reagent/consumable/cucumberjuice diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index 8fb4c974f1c1..691e0a389d6b 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -261,7 +261,9 @@ throw_range = 3 attack_verb_continuous = list("roasts", "scorches", "burns") attack_verb_simple = list("roast", "scorch", "burn") - grind_results = list(/datum/reagent/consumable/capsaicin = 0, /datum/reagent/consumable/condensedcapsaicin = 0) + +/obj/item/grown/novaflower/grind_results() + return list(/datum/reagent/consumable/capsaicin = 0, /datum/reagent/consumable/condensedcapsaicin = 0) // Rose /obj/item/seeds/rose diff --git a/code/modules/hydroponics/grown/herbs.dm b/code/modules/hydroponics/grown/herbs.dm index bc450d6857f1..97e9c3e0ab60 100644 --- a/code/modules/hydroponics/grown/herbs.dm +++ b/code/modules/hydroponics/grown/herbs.dm @@ -21,7 +21,11 @@ desc = "A bundle of various herbs. Somehow, you're always able to pick what you need out." icon_state = "herbs" foodtypes = VEGETABLES - grind_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 + +/obj/item/food/grown/herbs/grind_results() + return list(/datum/reagent/consumable/nutriment = 0) + +/obj/item/food/grown/herbs/juice_typepath() + return /datum/reagent/consumable/nutriment diff --git a/code/modules/hydroponics/grown/korta_nut.dm b/code/modules/hydroponics/grown/korta_nut.dm index 457ebff07163..09389968188e 100644 --- a/code/modules/hydroponics/grown/korta_nut.dm +++ b/code/modules/hydroponics/grown/korta_nut.dm @@ -22,11 +22,15 @@ desc = "A little nut of great importance. Has a peppery shell which can be ground into flour and a soft, pulpy interior that produces a milky fluid when juiced. Or you can eat them whole, as a quick snack." icon_state = "korta_nut" foodtypes = NUTS - grind_results = list(/datum/reagent/consumable/korta_flour = 0) - juice_typepath = /datum/reagent/consumable/korta_milk tastes = list("peppery heat" = 1) distill_reagent = /datum/reagent/consumable/ethanol/kortara +/obj/item/food/grown/korta_nut/grind_results() + return list(/datum/reagent/consumable/korta_flour = 0) + +/obj/item/food/grown/korta_nut/juice_typepath() + return /datum/reagent/consumable/korta_milk + //Sweet Korta Nut /obj/item/seeds/korta_nut/sweet name = "sweet korta nut seed pack" @@ -46,7 +50,11 @@ name = "sweet korta nut" desc = "A sweet treat lizards love to eat." icon_state = "korta_nut" - grind_results = list(/datum/reagent/consumable/korta_flour = 0) - juice_typepath = /datum/reagent/consumable/korta_nectar tastes = list("peppery sweet" = 1) distill_reagent = /datum/reagent/consumable/ethanol/kortara + +/obj/item/food/grown/korta_nut/sweet/grind_results() + return list(/datum/reagent/consumable/korta_flour = 0) + +/obj/item/food/grown/korta_nut/sweet/juice_typepath() + return /datum/reagent/consumable/korta_nectar diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 284f760cc665..c8f1bb01004b 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -31,11 +31,13 @@ bite_consumption_mod = 2 w_class = WEIGHT_CLASS_NORMAL foodtypes = FRUIT - juice_typepath = /datum/reagent/consumable/watermelonjuice wine_power = 40 +/obj/item/food/grown/watermelon/juice_typepath() + return /datum/reagent/consumable/watermelonjuice + /obj/item/food/grown/watermelon/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/watermelonslice, 5, 20, screentip_verb = "Slice") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/watermelonslice, 5, 20, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/grown/watermelon/make_dryable() return //No drying @@ -95,12 +97,14 @@ bite_consumption_mod = 2 w_class = WEIGHT_CLASS_NORMAL foodtypes = FRUIT - juice_typepath = /datum/reagent/water/holywater wine_power = 70 //Water to wine, baby. wine_flavor = "divinity" +/obj/item/food/grown/holymelon/juice_typepath() + return /datum/reagent/water/holywater + /obj/item/food/grown/holymelon/make_processable() - AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/holymelonslice, 5, 20, screentip_verb = "Slice") + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/holymelonslice, 5, 20, screentip_verb = "Slice", sound_to_play = SFX_KNIFE_SLICE) /obj/item/food/grown/holymelon/make_dryable() return //No drying diff --git a/code/modules/hydroponics/grown/olive.dm b/code/modules/hydroponics/grown/olive.dm index 0b2f52c7a5e7..7c5b993c634c 100644 --- a/code/modules/hydroponics/grown/olive.dm +++ b/code/modules/hydroponics/grown/olive.dm @@ -22,6 +22,7 @@ desc = "A small cylindrical salty fruit closely related to mangoes. Can be ground into a paste and mixed with water to make quality oil." icon_state = "olive" foodtypes = FRUIT - grind_results = list(/datum/reagent/consumable/olivepaste = 0) tastes = list("olive" = 1) +/obj/item/food/grown/olive/grind_results() + return list(/datum/reagent/consumable/olivepaste = 0) diff --git a/code/modules/hydroponics/grown/peanut.dm b/code/modules/hydroponics/grown/peanut.dm index 6560ec196c91..add5e5db4da7 100644 --- a/code/modules/hydroponics/grown/peanut.dm +++ b/code/modules/hydroponics/grown/peanut.dm @@ -21,5 +21,7 @@ desc = "A tasty pair of groundnuts concealed in a tough shell." icon_state = "peanut" foodtypes = NUTS - grind_results = list(/datum/reagent/consumable/peanut_butter = 0) tastes = list("peanuts" = 1) + +/obj/item/food/grown/peanut/grind_results() + return list(/datum/reagent/consumable/peanut_butter = 0) diff --git a/code/modules/hydroponics/grown/peas.dm b/code/modules/hydroponics/grown/peas.dm index 66eaec6ff1d5..403514ee8a22 100644 --- a/code/modules/hydroponics/grown/peas.dm +++ b/code/modules/hydroponics/grown/peas.dm @@ -54,11 +54,13 @@ desc = "Ridens Cicer, guaranteed to improve your mood dramatically upon consumption!" icon_state = "laughpeas" foodtypes = VEGETABLES - 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" +/obj/item/food/grown/laugh/juice_typepath() + return /datum/reagent/consumable/laughsyrup + // World Peas - Peace at last, peace at last... /obj/item/seeds/peas/laugh/peace name = "world pea pack" diff --git a/code/modules/hydroponics/grown/pineapple.dm b/code/modules/hydroponics/grown/pineapple.dm index 577befaadfaa..783c8fba9cb0 100644 --- a/code/modules/hydroponics/grown/pineapple.dm +++ b/code/modules/hydroponics/grown/pineapple.dm @@ -30,10 +30,11 @@ throw_range = 5 w_class = WEIGHT_CLASS_NORMAL foodtypes = FRUIT | PINEAPPLE - juice_typepath = /datum/reagent/consumable/pineapplejuice tastes = list("pineapple" = 1) wine_power = 40 - /obj/item/food/grown/pineapple/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/pineappleslice, 3, 15, screentip_verb = "Cut") + +/obj/item/food/grown/pineapple/juice_typepath() + return /datum/reagent/consumable/pineapplejuice diff --git a/code/modules/hydroponics/grown/plum.dm b/code/modules/hydroponics/grown/plum.dm index c11acdf2db55..5306eed407b8 100644 --- a/code/modules/hydroponics/grown/plum.dm +++ b/code/modules/hydroponics/grown/plum.dm @@ -22,10 +22,12 @@ desc = "A poet's favorite fruit. Noice." icon_state = "plum" foodtypes = FRUIT - juice_typepath = /datum/reagent/consumable/plumjuice tastes = list("plum" = 1) distill_reagent = /datum/reagent/consumable/ethanol/plumwine +/obj/item/food/grown/plum/juice_typepath() + return /datum/reagent/consumable/plumjuice + // Plumb /obj/item/seeds/plum/plumb name = "plumb seed pack" diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm index a9be7fc2c2f8..59da5edd1204 100644 --- a/code/modules/hydroponics/grown/potato.dm +++ b/code/modules/hydroponics/grown/potato.dm @@ -14,7 +14,7 @@ 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) + genes = list(/datum/plant_gene/trait/soil_lover, /datum/plant_gene/trait/battery, /datum/plant_gene/trait/one_bite) mutatelist = list(/obj/item/seeds/potato/sweet) reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) graft_gene = /datum/plant_gene/trait/battery @@ -25,9 +25,11 @@ desc = "Boil 'em! Mash 'em! Stick 'em in a stew!" icon_state = "potato" foodtypes = VEGETABLES - juice_typepath = /datum/reagent/consumable/potato_juice distill_reagent = /datum/reagent/consumable/ethanol/vodka +/obj/item/food/grown/potato/juice_typepath() + return /datum/reagent/consumable/potato_juice + /obj/item/food/grown/potato/make_bakeable() AddComponent(/datum/component/bakeable, /obj/item/food/baked_potato, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm index 256abeced65b..0a388b9be6ea 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -24,11 +24,13 @@ icon_state = "pumpkin" bite_consumption_mod = 2 foodtypes = VEGETABLES - 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 +/obj/item/food/grown/pumpkin/juice_typepath() + return /datum/reagent/consumable/pumpkinjuice + /obj/item/food/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, list/modifiers, list/attack_modifiers) if(W.get_sharpness()) user.show_message(span_notice("You carve a face into [src]!"), MSG_VISUAL) @@ -56,6 +58,8 @@ desc = "The pumpkin's toxic sibling." icon_state = "blumpkin" bite_consumption_mod = 3 - juice_typepath = /datum/reagent/consumable/blumpkinjuice wine_power = 50 carved_type = /obj/item/clothing/head/utility/hardhat/pumpkinhead/blumpkin + +/obj/item/food/grown/pumpkin/blumpkin/juice_typepath() + return /datum/reagent/consumable/blumpkinjuice diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 842c10a025e2..129d090e9fe3 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -198,10 +198,8 @@ podman.gender = blood_gender podman.faction |= factions - if(!features[FEATURE_MUTANT_COLOR]) - features[FEATURE_MUTANT_COLOR] = "#59CE00" - if(!features[FEATURE_POD_HAIR]) - features[FEATURE_POD_HAIR] = pick(SSaccessories.pod_hair_list) + features[FEATURE_MUTANT_COLOR] ||= "#59CE00" + features[FEATURE_POD_HAIR] ||= pick(SSaccessories.feature_list[FEATURE_POD_HAIR]) for(var/V in quirks) new V(podman) diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index 201fdd1a660f..9cb90554cef6 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -14,6 +14,7 @@ growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' mutatelist = list(/obj/item/seeds/carrot/parsnip, /obj/item/seeds/carrot/cahnroot) reagents_add = list(/datum/reagent/medicine/oculine = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) + genes = list(/datum/plant_gene/trait/soil_lover) /obj/item/food/grown/carrot seed = /obj/item/seeds/carrot @@ -22,9 +23,11 @@ icon_state = "carrot" bite_consumption_mod = 2 foodtypes = VEGETABLES - juice_typepath = /datum/reagent/consumable/carrotjuice wine_power = 30 +/obj/item/food/grown/carrot/juice_typepath() + return /datum/reagent/consumable/carrotjuice + /obj/item/food/grown/carrot/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!I.get_sharpness()) return ..() @@ -61,9 +64,11 @@ desc = "Closely related to carrots." icon_state = "parsnip" foodtypes = VEGETABLES - juice_typepath = /datum/reagent/consumable/parsnipjuice wine_power = 35 +/obj/item/food/grown/parsnip/juice_typepath() + return /datum/reagent/consumable/parsnipjuice + /obj/item/food/grown/parsnip/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!I.get_sharpness()) return ..() @@ -91,7 +96,7 @@ species = "cahn'root" plantname = "Cahn'root" product = /obj/item/food/grown/cahnroot - genes = list(/datum/plant_gene/trait/plant_type/weed_hardy) + genes = list(/datum/plant_gene/trait/soil_lover, /datum/plant_gene/trait/plant_type/weed_hardy) endurance = 50 instability = 10 icon_dead = "cahn'root-dead" @@ -106,10 +111,12 @@ desc = "Heavily modified version of terran carrot, originally made to survive the scarciest of environments by an enterprising scientist of Moth Flotilla, Cahn'Mang." icon_state = "cahn'root" foodtypes = VEGETABLES - juice_typepath = null tastes = list("sweet dirt" = 1) distill_reagent = /datum/reagent/consumable/rootbeer +/obj/item/food/grown/cahnroot/juice_typepath() + return null + /obj/item/food/grown/cahnroot/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!I.get_sharpness()) return ..() @@ -142,6 +149,7 @@ instability = 10 growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' icon_dead = "whitebeet-dead" + genes = list(/datum/plant_gene/trait/soil_lover) 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) @@ -168,7 +176,7 @@ instability = 15 growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi' icon_dead = "whitebeet-dead" - genes = list(/datum/plant_gene/trait/maxchem) + genes = list(/datum/plant_gene/trait/soil_lover, /datum/plant_gene/trait/maxchem) reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.05, /datum/reagent/consumable/nutriment = 0.05) graft_gene = /datum/plant_gene/trait/maxchem diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index 26a215be720b..50a643ea8cf9 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -21,10 +21,12 @@ name = "Tea Aspera tips" desc = "These aromatic tips of the tea plant can be dried to make tea." icon_state = "tea_aspera_leaves" - grind_results = list(/datum/reagent/toxin/teapowder = 0) dry_grind = TRUE can_distill = FALSE +/obj/item/food/grown/tea/grind_results() + return list(/datum/reagent/toxin/teapowder = 0) + // Tea Astra /obj/item/seeds/tea/astra name = "tea astra seed pack" @@ -41,8 +43,9 @@ name = "Tea Astra tips" icon_state = "tea_astra_leaves" bite_consumption_mod = 2 - grind_results = list(/datum/reagent/toxin/teapowder = 0, /datum/reagent/medicine/salglu_solution = 0) +/obj/item/food/grown/tea/astra/grind_results() + return list(/datum/reagent/toxin/teapowder = 0, /datum/reagent/medicine/salglu_solution = 0) // Coffee /obj/item/seeds/coffee @@ -70,9 +73,11 @@ desc = "Dry them out to make coffee." icon_state = "coffee_arabica" dry_grind = TRUE - grind_results = list(/datum/reagent/toxin/coffeepowder = 0) distill_reagent = /datum/reagent/consumable/ethanol/kahlua +/obj/item/food/grown/coffee/grind_results() + return list(/datum/reagent/toxin/coffeepowder = 0) + // Coffee Robusta /obj/item/seeds/coffee/robusta name = "coffee robusta seed pack" @@ -90,4 +95,6 @@ name = "coffee robusta beans" desc = "Increases robustness by 37 percent!" icon_state = "coffee_robusta" - grind_results = list(/datum/reagent/toxin/coffeepowder = 0, /datum/reagent/medicine/morphine = 0) + +/obj/item/food/grown/coffee/robusta/grind_results() + return list(/datum/reagent/toxin/coffeepowder = 0, /datum/reagent/medicine/morphine = 0) diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index 99d252254e42..ee3c24039a58 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -23,10 +23,14 @@ icon_state = "tomato" splat_type = /obj/effect/decal/cleanable/food/tomato_smudge foodtypes = VEGETABLES - grind_results = list(/datum/reagent/consumable/ketchup = 0) - juice_typepath = /datum/reagent/consumable/tomatojuice distill_reagent = /datum/reagent/consumable/enzyme +/obj/item/food/grown/tomato/grind_results() + return list(/datum/reagent/consumable/ketchup = 0) + +/obj/item/food/grown/tomato/juice_typepath() + return /datum/reagent/consumable/tomatojuice + // Blood Tomato /obj/item/seeds/tomato/blood name = "blood-tomato seed pack" @@ -47,9 +51,11 @@ bite_consumption_mod = 3 splat_type = /obj/effect/gibspawner/generic foodtypes = VEGETABLES | GORE - grind_results = list(/datum/reagent/consumable/ketchup = 0, /datum/reagent/blood = 0) distill_reagent = /datum/reagent/consumable/ethanol/bloody_mary +/obj/item/food/grown/tomato/blood/grind_results() + return list(/datum/reagent/consumable/ketchup = 0, /datum/reagent/blood = 0) + // Blue Tomato /obj/item/seeds/tomato/blue name = "blue-tomato seed pack" diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index f2d611b1aefe..cf7b7411c485 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -137,6 +137,7 @@ density = FALSE anchored = TRUE buckle_lying = 90 + custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 5) /// Overlay we apply when impaling a mob. var/mutable_appearance/stab_overlay diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 1565c3113ac5..82c69a8ef09f 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -53,8 +53,3 @@ if(reagents) return TRUE return FALSE - -/obj/item/grown/on_grind() - . = ..() - for(var/i in 1 to grind_results.len) - grind_results[grind_results[i]] = round(seed.potency) diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index edd652f59a2f..511002675725 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -64,7 +64,7 @@ attack_verb_continuous = list("slashes", "slices", "bashes", "claws") attack_verb_simple = list("slash", "slice", "bash", "claw") hitsound = null - custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 1.5) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 5) resistance_flags = FLAMMABLE flags_1 = NONE diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 00d01c9732d5..cceec74fb30c 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -61,6 +61,11 @@ var/light_level = 0 ///our snail overlay, if any var/obj/effect/overlay/vis_effect/snail/our_snail + ///Flags to indicate special tray type behaviours. + var/tray_flags = HYDROPONIC + ///How many extra px to offset the plant sprite on the y axis, gets passed to the seed and added to the seeds offset + var/plant_offset_y = 0 + /obj/machinery/hydroponics/Initialize(mapload) //ALRIGHT YOU DEGENERATES. YOU HAD REAGENT HOLDERS FOR AT LEAST 4 YEARS AND NONE OF YOU MADE HYDROPONICS TRAYS HOLD NUTRIENT CHEMS INSTEAD OF USING "Points". @@ -169,9 +174,9 @@ /obj/machinery/hydroponics/constructable/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) AddComponent(/datum/component/plumbing/hydroponics) - AddComponent(/datum/component/usb_port, list(/obj/item/circuit_component/hydroponics)) + AddComponent(/datum/component/usb_port, typecacheof(list(/obj/item/circuit_component/hydroponics), only_root_path = TRUE)) AddComponent(/datum/component/fishing_spot, /datum/fish_source/hydro_tray) /obj/machinery/hydroponics/constructable/RefreshParts() @@ -344,11 +349,11 @@ if(world.time > (lastcycle + cycledelay)) lastcycle = world.time if(myseed && plant_status != HYDROTRAY_PLANT_DEAD) - // Advance age - age++ + var/is_fungus = myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism) + // Advance age, if planted in mushroom friendly soil and we are a mushroom we mature 40% faster. + age += 1 * (is_fungus && (tray_flags & FAST_MUSHROOMS)) ? FAST_MUSH_MODIFIER : 1 if(age < myseed.maturation) lastproduce = age - needs_update = TRUE @@ -360,22 +365,25 @@ else reagents.remove_all(nutridrain) - // Lack of nutrients hurts non-weeds - if(reagents.total_volume <= 0 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) - adjust_plant_health(-rand(1,3)) + if(reagents.total_volume <= 0) + //The microbiome slowly create nutrients by fixing nitrogen from the air or metabolizing organic matter. + if(tray_flags & SLOW_RELEASE) + reagents.add_reagent(/datum/reagent/nitrogen, 1) // In reality the nitrogen is in the form of ammonia or nitrates but this might be too OP and boring. + // Lack of nutrients hurts non-weeds + else if(!myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) + adjust_plant_health(-rand(1,3)) //Photosynthesis///////////////////////////////////////////////////////// // Lack of light hurts non-mushrooms - var/is_fungus = myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism) if(light_level < (is_fungus ? 0.2 : 0.4)) adjust_plant_health((is_fungus ? -1 : -2) / rating) //Water////////////////////////////////////////////////////////////////// // Drink random amount of water - adjust_waterlevel(-rand(1,6) / rating) + adjust_waterlevel(-rand(1,6) * ((tray_flags & SUPERWATER) ? SUPER_WATER_MODIFIER : 1) / rating ) // If the plant is dry, it loses health pretty fast, unless mushroom - if(waterlevel <= 10 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) + if(waterlevel <= 10 && !is_fungus) adjust_plant_health(-rand(0,1) / rating) if(waterlevel <= 0) adjust_plant_health(-rand(0,2) / rating) @@ -428,7 +436,7 @@ if(weedlevel >= 5 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) if(myseed.yield >= 3) myseed.adjust_yield(-rand(1,2)) //Weeds choke out the plant's ability to bear more fruit. - myseed.set_yield(min((myseed.yield), WEED_HARDY_YIELD_MIN, MAX_PLANT_YIELD)) + myseed.set_yield(clamp((myseed.yield), WEED_HARDY_YIELD_MIN, MAX_PLANT_YIELD)) //This is the part with pollination pollinate() @@ -475,7 +483,7 @@ if(weedlevel >= 10 && prob(50) && !self_sustaining) // At this point the plant is kind of fucked. Weeds can overtake the plant spot. if(myseed && myseed.yield >= 3) myseed.adjust_yield(-rand(1,2)) //Loses even more yield per tick, quickly dropping to 3 minimum. - myseed.set_yield(min((myseed.yield), WEED_HARDY_YIELD_MIN, MAX_PLANT_YIELD)) + myseed.set_yield(clamp((myseed.yield), WEED_HARDY_YIELD_MIN, MAX_PLANT_YIELD)) if(!myseed) weedinvasion() needs_update = 1 @@ -500,15 +508,13 @@ /obj/machinery/hydroponics/update_name(updates) . = ..() - if(myseed) + if(!GetComponent(/datum/component/rename) && myseed) name = "[initial(name)] ([myseed.plantname])" - else - name = initial(name) /obj/machinery/hydroponics/update_overlays() . = ..() if(myseed) - . += myseed.get_tray_overlay(age, plant_status) + . += myseed.get_tray_overlay(age, plant_status, plant_offset_y) . += update_status_light_overlays() if(self_sustaining && self_sustaining_overlay_icon_state) @@ -667,8 +673,12 @@ * Raises the plant's weed level stat by a given amount. * * adjustamt - Determines how much the weed level will be adjusted upwards or downwards. */ -/obj/machinery/hydroponics/proc/adjust_weedlevel (amt) - set_weedlevel(clamp(weedlevel + amt, 0, MAX_TRAY_WEEDS), FALSE) +/obj/machinery/hydroponics/proc/adjust_weedlevel(amt) + var/weed_mod = 1 + //If we are not a soil type tray and out plant is semiaquatic, increase weed. + if(!(tray_flags & SOIL) && myseed?.get_gene(/datum/plant_gene/trait/semiaquatic)) + weed_mod *= SEMIAQUATIC_SOIL_WEED_MALUS + set_weedlevel(clamp(weedlevel + amt * weed_mod, 0, MAX_TRAY_WEEDS), FALSE) /obj/machinery/hydroponics/examine(user) . = ..() @@ -793,13 +803,14 @@ * Plant Death Proc. * Cleans up various stats for the plant upon death, including pests, harvestability, and plant health. */ -/obj/machinery/hydroponics/proc/plantdies() +/obj/machinery/hydroponics/proc/plantdies(update_icon = TRUE) set_plant_health(0, update_icon = FALSE, forced = TRUE) set_plant_status(HYDROTRAY_PLANT_DEAD) set_pestlevel(0, update_icon = FALSE) // Pests die lastproduce = 0 - update_appearance() SEND_SIGNAL(src, COMSIG_HYDROTRAY_PLANT_DEATH) + if(update_icon) + update_appearance() /** * Plant Cross-Pollination. @@ -879,6 +890,11 @@ visi_msg="[user] composts [reagent_source], spreading it through [target]" transfer_amount = reagent_source.reagents.total_volume SEND_SIGNAL(reagent_source, COMSIG_ITEM_ON_COMPOSTED, user) + if((tray_flags & WORM_HABITAT) && prob(transfer_amount / 2)) + var/obj/item/food/bait/worm/premium/fat_worm = new(loc) + fat_worm.pixel_x = rand(-6,6) + fat_worm.pixel_y = rand(-6,6) + playsound(fat_worm, 'sound/items/eatfood.ogg', 20, TRUE) else transfer_amount = min(reagent_source.amount_per_transfer_from_this, reagent_source.reagents.total_volume) if(istype(reagent_source, /obj/item/reagent_containers/syringe/)) @@ -888,6 +904,7 @@ if(reagent_source.is_drainable()) playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) var/mutable_appearance/splash_animation = mutable_appearance('icons/effects/effects.dmi', "splash_hydroponics") + splash_animation.pixel_z += plant_offset_y // DARKPACK EDIT ADD splash_animation.color = mix_color_from_reagents(reagent_source.reagents.reagent_list) flick_overlay_view(splash_animation, 1.1 SECONDS) @@ -919,21 +936,8 @@ return 1 else if(istype(O, /obj/item/seeds)) - if(!myseed) - if(istype(O, /obj/item/seeds/kudzu)) - investigate_log("had Kudzu planted in it by [key_name(user)] at [AREACOORD(src)].", INVESTIGATE_BOTANY) - if(!user.transferItemToLoc(O, src)) - return - SEND_SIGNAL(O, COMSIG_SEED_ON_PLANTED, src) - to_chat(user, span_notice("You plant [O].")) - set_seed(O) - set_plant_health(myseed.endurance) - lastcycle = world.time - return - else - to_chat(user, span_warning("[src] already has seeds in it!")) - return - + propagate_plant(O, user) + return else if(istype(O, /obj/item/cultivator)) if(weedlevel > 0) user.visible_message(span_notice("[user] uproots the weeds."), span_notice("You remove the weeds from [src].")) @@ -950,8 +954,8 @@ else if(plant_status != HYDROTRAY_PLANT_HARVESTABLE) to_chat(user, span_notice("This plant must be harvestable in order to be grafted.")) return - else if(myseed.grafted) - to_chat(user, span_notice("This plant has already been grafted.")) + else if(myseed.grafts_taken >= ((tray_flags & MULTIGRAFT) ? MULTI_GRAFT_MAX_COUNT : 1)) + to_chat(user, span_notice("You can't take any more cuttings from this plant!")) return else user.visible_message(span_notice("[user] grafts off a limb from [src]."), span_notice("You carefully graft off a portion of [src].")) @@ -960,7 +964,7 @@ return // The plant did not return a graft. snip.forceMove(drop_location()) - myseed.grafted = TRUE + myseed.grafts_taken++ adjust_plant_health(-5) return @@ -1003,12 +1007,17 @@ else if(istype(O, /obj/item/graft)) var/obj/item/graft/snip = O if(!myseed) + if(tray_flags & GRAFT_MEDIUM) + propagate_plant(snip.plant_dna, user) + qdel(snip) + return to_chat(user, span_notice("The tray is empty.")) return - if(myseed.apply_graft(snip)) - to_chat(user, span_notice("You carefully integrate the grafted plant limb onto [myseed.plantname], granting it [snip.stored_trait.get_name()].")) + var/datum/plant_gene/grafted_trait = myseed.apply_graft(snip) + if(grafted_trait) + to_chat(user, span_notice("You carefully integrate the grafted plant limb onto [myseed.plantname], granting it [grafted_trait.get_name()].")) else - to_chat(user, span_notice("You integrate the grafted plant limb onto [myseed.plantname], but it does not accept the [snip.stored_trait.get_name()] trait from the [snip].")) + to_chat(user, span_notice("You try to integrate the grafted plant limb onto [myseed.plantname], but it rejects the trait from the [snip].")) qdel(snip) return @@ -1030,11 +1039,7 @@ span_notice("You start digging out [src]'s plants...")) if(O.use_tool(src, user, 50, volume=50) || (!myseed && !weedlevel)) user.visible_message(span_notice("[user] digs out the plants in [src]!"), span_notice("You dig out all of [src]'s plants!")) - if(myseed) //Could be that they're just using it as a de-weeder - set_plant_health(0, update_icon = FALSE, forced = TRUE) - lastproduce = 0 - set_seed(null) - set_weedlevel(0) //Has a side effect of cleaning up those nasty weeds + remove_plant() return else if(istype(O, /obj/item/gun/energy/floragun)) var/obj/item/gun/energy/floragun/flowergun = O @@ -1167,54 +1172,33 @@ var/mob/living/C = new chosen(get_turf(src)) C.faction = list(FACTION_PLANTS) -/////////////////////////////////////////////////////////////////////////////// -/obj/machinery/hydroponics/soil //Not actually hydroponics at all! Honk! - name = "soil" - desc = "A patch of dirt." - icon = 'icons/obj/service/hydroponics/equipment.dmi' - icon_state = "soil" - gender = PLURAL - circuit = null - density = FALSE - use_power = NO_POWER_USE - unwrenchable = FALSE - self_sustaining_overlay_icon_state = null - maxnutri = 15 - -/obj/machinery/hydroponics/soil/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) - return NONE - -/obj/machinery/hydroponics/soil/default_deconstruction_crowbar(obj/item/crowbar, ignore_panel, custom_deconstruct) - return NONE - -/obj/machinery/hydroponics/soil/update_icon(updates=ALL) - . = ..() - if(self_sustaining) - add_atom_colour(rgb(255, 175, 0), FIXED_COLOUR_PRIORITY) - -/obj/machinery/hydroponics/soil/update_status_light_overlays() - return // Has no lights - -/obj/machinery/hydroponics/soil/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) - if(weapon.tool_behaviour != TOOL_SHOVEL) //Spades can still uproot plants on left click - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - balloon_alert(user, "clearing up soil...") - if(weapon.use_tool(src, user, 1 SECONDS, volume=50)) - balloon_alert(user, "cleared") - deconstruct(disassembled = TRUE) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - -/obj/machinery/hydroponics/soil/click_ctrl(mob/user) - return CLICK_ACTION_BLOCKING //Soil has no electricity. - -/obj/machinery/hydroponics/soil/on_deconstruction(disassembled) - new /obj/item/stack/ore/glass(drop_location(), 3) +/// Plants the seed / graft into the tray and resets growth related stats such as maturity on the tray. +/obj/machinery/hydroponics/proc/propagate_plant(obj/item/seeds/young_plant, mob/living/user) + if(!istype(young_plant)) + return + if(myseed) + to_chat(user, span_warning("[src] already has a plant growing in it!")) + return + if(istype(young_plant, /obj/item/seeds/kudzu)) + investigate_log("had Kudzu planted in it by [key_name(user)] at [AREACOORD(src)].", INVESTIGATE_BOTANY) + if(!user.transferItemToLoc(young_plant, src)) + return + SEND_SIGNAL(young_plant, COMSIG_SEED_ON_PLANTED, src) + to_chat(user, span_notice("You plant [young_plant].")) + set_seed(young_plant) + set_plant_health(myseed.endurance) + lastcycle = world.time -/obj/machinery/hydroponics/soil/rich - name = "rich soil" - desc = "A rich patch of dirt, usually used in gardens." - icon_state = "rich_soil" - maxnutri = 20 +/// Clears the plant from the tray, killing it in the process, optionally clearing weeds as well. +/obj/machinery/hydroponics/proc/remove_plant(clear_weeds = TRUE) + if(!myseed) + return + plantdies(FALSE) + if(clear_weeds) + set_weedlevel(0, FALSE) + if(self_sustaining) //No reason to pay for an empty tray. + set_self_sustaining(FALSE) + set_seed(null) ///The usb port circuit diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 0a5c7b711300..76892cd2870a 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -123,7 +123,7 @@ /// Flag - Traits that share an ID cannot be placed on the same plant. var/trait_ids /// Flag - Modifications made to the final product. - var/trait_flags = TRAIT_SHOW_EXAMINE + var/trait_flags = NONE /// A blacklist of seeds that a trait cannot be attached to. var/list/obj/item/seeds/seed_blacklist @@ -354,7 +354,7 @@ to_chat(eater, span_notice("You feel energized as you bite into [our_plant].")) var/batteries_recharged = FALSE var/obj/item/seeds/our_seed = our_plant.get_plant_seed() - for(var/obj/item/stock_parts/power_store/found_cell in eater.get_all_cells()) + for(var/obj/item/stock_parts/power_store/found_cell in assoc_to_values(eater.get_all_cells())) var/newcharge = min(our_seed.potency * 0.01 * found_cell.maxcharge, found_cell.maxcharge) if(found_cell.charge < newcharge) found_cell.charge = newcharge @@ -375,6 +375,7 @@ icon = FA_ICON_LIGHTBULB rate = 0.03 description = "It emits a soft glow." + trait_flags = TRAIT_SHOW_EXAMINE trait_ids = GLOW_ID mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE /// The color of our bioluminescence. @@ -403,6 +404,7 @@ name = "Shadow Emission" rate = 0.04 glow_color = COLOR_BIOLUMINESCENCE_SHADOW + description = "It absorbs light around it." /datum/plant_gene/trait/glow/shadow/glow_power(obj/item/seeds/seed) return -max(seed.potency*(rate*0.2), 0.2) @@ -518,7 +520,7 @@ description = "The reagent volume is doubled, halving the plant yield instead." icon = FA_ICON_FLASK_VIAL rate = 2 - trait_flags = TRAIT_SHOW_EXAMINE|TRAIT_HALVES_YIELD + trait_flags = TRAIT_HALVES_YIELD mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE /datum/plant_gene/trait/maxchem/on_new_plant(obj/item/our_plant, newloc) @@ -638,6 +640,7 @@ icon = FA_ICON_SYRINGE trait_ids = REAGENT_TRANSFER_ID mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE + trait_flags = TRAIT_SHOW_EXAMINE /datum/plant_gene/trait/stinging/on_new_plant(obj/item/our_plant, newloc) . = ..() @@ -853,9 +856,10 @@ */ /datum/plant_gene/trait/eyes name = "Oculary Mimicry" - description = "It will watch after you." + description = "It watches after you." icon = FA_ICON_EYE mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE + trait_flags = TRAIT_SHOW_EXAMINE /// Our googly eyes appearance. var/mutable_appearance/googly @@ -874,6 +878,7 @@ icon = FA_ICON_BANDAGE trait_ids = THROW_IMPACT_ID mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE + trait_flags = TRAIT_SHOW_EXAMINE /datum/plant_gene/trait/sticky/on_new_plant(obj/item/our_plant, newloc) . = ..() @@ -914,7 +919,7 @@ description = "It consumes nutriments to heat up other reagents, halving the yield." icon = FA_ICON_TEMPERATURE_ARROW_UP trait_ids = TEMP_CHANGE_ID - trait_flags = TRAIT_SHOW_EXAMINE|TRAIT_HALVES_YIELD + trait_flags = TRAIT_HALVES_YIELD mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE /** @@ -926,7 +931,7 @@ description = "It consumes nutriments to cool down other reagents, halving the yield." icon = FA_ICON_TEMPERATURE_ARROW_DOWN trait_ids = TEMP_CHANGE_ID - trait_flags = TRAIT_SHOW_EXAMINE|TRAIT_HALVES_YIELD + trait_flags = TRAIT_HALVES_YIELD mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE /// Prevents species mutation, while still allowing wild mutation harvest and Floral Somatoray species mutation. Trait acts as a tag for hydroponics.dm to recognise. @@ -984,3 +989,21 @@ /datum/plant_gene/trait/plant_type/alien_properties name ="?????" icon = FA_ICON_DISEASE + +/datum/plant_gene/trait/carnivory + name = "Obligate Carnivory" + description = "Pests have positive effect on the plant health." + icon = FA_ICON_SPIDER + +/datum/plant_gene/trait/semiaquatic + name = "Semiaquatic" + description = "A type of plant that thrives in flooded conditions due to less competion from weeds, but can also grow on land." + icon = FA_ICON_BOWL_RICE + mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE + +/datum/plant_gene/trait/soil_lover + name = "Soil Lover" + description = "A plant that needs the firm embrace of soil to develop properly, produces small irregular produce when grown hydroponically." + icon = FA_ICON_MOUND + mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE + diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index d7049b85f969..0e8d2936d14c 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -214,10 +214,10 @@ 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 + 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) + for(var/datum/reagent/reagent as anything in product.grind_results()) seed_data["grind_results"] += initial(reagent.name) qdel(product) diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 2f0f026110e3..022cb911f7bc 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -9,6 +9,7 @@ abstract_type = /obj/item/seeds w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE + obj_flags = UNIQUE_RENAME /// Name of plant when planted. var/plantname = "Plants" /// A type path. The thing that is created when the plant is harvested. @@ -58,10 +59,10 @@ var/weed_rate = 1 ///Percentage chance per tray update to grow weeds var/weed_chance = 5 - ///Determines if the plant has had a graft removed or not. - var/grafted = FALSE + ///How many grafts or cuttings have been taken from this plant. + var/grafts_taken = 0 ///Type-path of trait to be applied when grafting a plant. - var/graft_gene + var/datum/plant_gene/graft_gene = /datum/plant_gene/trait/repeated_harvest ///Determines if the plant should be allowed to mutate early at 30+ instability. var/seed_flags = MUTATE_EARLY @@ -186,19 +187,22 @@ // Harvest procs /obj/item/seeds/proc/getYield() var/return_yield = yield - + var/obj/machinery/hydroponics/parent = loc + // Handle hydroponics malus for soil lovers like rootcrops. + if(!(parent.tray_flags & SOIL) && get_gene(/datum/plant_gene/trait/soil_lover)) + return_yield *= SOIL_LOVER_HYDRO_YIELD_MALUS + // Determine if the plant should get a yield bonus from bee pollination. for(var/datum/plant_gene/trait/trait in genes) if(trait.trait_flags & TRAIT_NO_POLLINATION) return return_yield - var/obj/machinery/hydroponics/parent = loc if(istype(loc, /obj/machinery/hydroponics)) if(parent.yieldmod == 0) return_yield = min(return_yield, 1)//1 if above zero, 0 otherwise else return_yield *= (parent.yieldmod) - return return_yield + return round(return_yield) /obj/item/seeds/proc/harvest(mob/user) @@ -235,7 +239,13 @@ t_prod.seed.set_instability(round(instability * 0.5)) continue else - t_prod = new product(output_loc, new_seed = src) + // Create a descendent seed so we can modify our offspring before creating a grown from it. + var/obj/item/seeds/descendent_seed = Copy() + // Cuck potency if a soil lover such as a root crop is grown in water. + if(!(parent.tray_flags & SOIL) && get_gene(/datum/plant_gene/trait/soil_lover)) + descendent_seed.set_potency(round(potency * RANDOM_DECIMAL(SOIL_LOVER_HYDRO_POTENCY_MIN, SOIL_LOVER_HYDRO_POTENCY_MAX))) + + t_prod = new product(output_loc, new_seed = descendent_seed) if(parent.myseed.plantname != initial(parent.myseed.plantname)) t_prod.name = LOWER_TEXT(parent.myseed.plantname) if(productdesc) @@ -284,7 +294,7 @@ 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_typepath) + if(get_gene(/datum/plant_gene/trait/juicing) && grown_edible.juice_typepath()) grown_edible.juice(juicer = FALSE) //we pass FALSE & not null because Byond default args will subtitute it with the default value else if(get_gene(/datum/plant_gene/trait/brewing)) grown_edible.ferment() @@ -466,40 +476,24 @@ /obj/item/seeds/proc/on_chem_reaction(datum/reagents/reagents) return -/obj/item/seeds/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) - if(IS_WRITING_UTENSIL(O)) - var/choice = tgui_input_list(usr, "What would you like to change?", "Seed Alteration", list("Plant Name", "Seed Description", "Product Description")) - if(isnull(choice)) - return - if(!user.can_perform_action(src)) - return - switch(choice) - if("Plant Name") - var/newplantname = reject_bad_text(tgui_input_text(user, "Write a new plant name", "Plant Name", plantname, max_length = MAX_NAME_LEN)) - if(isnull(newplantname)) - return - if(!user.can_perform_action(src)) - return - name = "[LOWER_TEXT(newplantname)]" - plantname = newplantname - if("Seed Description") - var/newdesc = tgui_input_text(user, "Write a new seed description", "Seed Description", desc, max_length = MAX_DESC_LEN) - if(isnull(newdesc)) - return - if(!user.can_perform_action(src)) - return - desc = newdesc - if("Product Description") - if(product && !productdesc) - productdesc = initial(product.desc) - var/newproductdesc = tgui_input_text(user, "Write a new product description", "Product Description", productdesc, max_length = MAX_DESC_LEN) - if(isnull(newproductdesc)) - return - if(!user.can_perform_action(src)) - return - productdesc = newproductdesc +/obj/item/seeds/nameformat(input, user) + plantname = input + return "[LOWER_TEXT(input)]" - ..() // Fallthrough to item/attackby() so that bags can pick seeds up +/obj/item/seeds/descformat(input, mob/living/user) + . = input + if(product && !productdesc) + productdesc = initial(product.desc) + var/newproductdesc = tgui_input_text(user, "Write a new product description", "Product Description", productdesc, max_length = MAX_DESC_LEN) + if(isnull(newproductdesc)) + return + if(!user.can_perform_action(src)) + return + productdesc = newproductdesc + +/obj/item/seeds/rename_reset() + plantname = initial(plantname) + productdesc = initial(productdesc) /obj/item/seeds/proc/randomize_stats() set_lifespan(rand(25, 60)) @@ -552,24 +546,11 @@ * Creates a graft from this plant. * * Creates a new graft from this plant. - * Sets the grafts trait to this plants graftable trait. - * Gives the graft a reference to this plant. - * Copies all the relevant stats from this plant to the graft. + * Passes this plant to the new graft so it can make a copy. * Returns the created graft. */ /obj/item/seeds/proc/create_graft() - var/obj/item/graft/snip = new(loc, graft_gene) - snip.parent_name = plantname - snip.name += " ([plantname])" - - // Copy over stats so the graft can outlive its parent. - snip.lifespan = lifespan - snip.endurance = endurance - snip.production = production - snip.weed_rate = weed_rate - snip.weed_chance = weed_chance - snip.yield = yield - + var/obj/item/graft/snip = new(loc, src) return snip /** @@ -584,25 +565,25 @@ * - [snip][/obj/item/graft]: The graft being used applied to this plant. */ /obj/item/seeds/proc/apply_graft(obj/item/graft/snip) - . = TRUE - var/datum/plant_gene/new_trait = snip.stored_trait + var/datum/plant_gene/new_trait = snip.plant_dna.graft_gene || /datum/plant_gene/trait/repeated_harvest + new_trait = new new_trait() if(new_trait?.can_add(src)) - genes += new_trait.Copy() + genes += new_trait else - . = FALSE + new_trait = null // Adjust stats based on graft stats - set_lifespan(round(max(lifespan, (lifespan + (2/3)*(snip.lifespan - lifespan))))) - set_endurance(round(max(endurance, (endurance + (2/3)*(snip.endurance - endurance))))) - set_production(round(max(production, (production + (2/3)*(snip.production - production))))) - set_weed_rate(round(max(weed_rate, (weed_rate + (2/3)*(snip.weed_rate - weed_rate))))) - set_weed_chance(round(max(weed_chance, (weed_chance+ (2/3)*(snip.weed_chance - weed_chance))))) - set_yield(round(max(yield, (yield + (2/3)*(snip.yield - yield))))) + set_lifespan(round(max(lifespan, (lifespan + (2/3)*(snip.plant_dna.lifespan - lifespan))))) + set_endurance(round(max(endurance, (endurance + (2/3)*(snip.plant_dna.endurance - endurance))))) + set_production(round(max(production, (production + (2/3)*(snip.plant_dna.production - production))))) + set_weed_rate(round(max(weed_rate, (weed_rate + (2/3)*(snip.plant_dna.weed_rate - weed_rate))))) + set_weed_chance(round(max(weed_chance, (weed_chance+ (2/3)*(snip.plant_dna.weed_chance - weed_chance))))) + set_yield(round(max(yield, (yield + (2/3)*(snip.plant_dna.yield - yield))))) // Add in any reagents, too. reagents_from_genes() - - return + // Return the new trait so the tray can know we were successful and display its name. + return new_trait /* * Both `/item/food/grown` and `/item/grown` implement a seed variable which tracks @@ -647,7 +628,7 @@ reagents_from_genes() /// Returns a mutable appearance to be used as an overlay for the plant in hydro trays. -/obj/item/seeds/proc/get_tray_overlay(age, status) +/obj/item/seeds/proc/get_tray_overlay(age, status, tray_offset) var/mutable_appearance/plant_overlay = mutable_appearance(growing_icon, layer = OBJ_LAYER + 0.01) switch(status) if(HYDROTRAY_PLANT_DEAD) @@ -657,7 +638,7 @@ else var/t_growthstate = clamp(round((age / maturation) * growthstages), 1, growthstages) plant_overlay.icon_state = "[icon_grow][t_growthstate]" - plant_overlay.pixel_z = plant_icon_offset + plant_overlay.pixel_z = plant_icon_offset + tray_offset return plant_overlay /// Called when the seed is set in a tray diff --git a/code/modules/hydroponics/soil.dm b/code/modules/hydroponics/soil.dm new file mode 100644 index 000000000000..e8fb54d071cb --- /dev/null +++ b/code/modules/hydroponics/soil.dm @@ -0,0 +1,254 @@ + +/////////////////////////////////////////////////////////////////////////////// +/obj/machinery/hydroponics/soil //Not actually hydroponics at all! Honk! + name = "soil" + desc = "A patch of dirt." + icon = 'modular_darkpack/modules/drugs/icons/tray.dmi' // DARKPACK EDIT CHANGE + icon_state = "soil" + circuit = null + density = FALSE + use_power = NO_POWER_USE + unwrenchable = FALSE + self_sustaining_overlay_icon_state = null + maxnutri = 15 + tray_flags = SOIL + armor_type = /datum/armor/obj_soil + custom_materials = list(/datum/material/sand = SHEET_MATERIAL_AMOUNT * 3) + //which type of sack to create when shovled. + var/sack_type = /obj/item/soil_sack + var/wet_overlay = "soil_wet" // DARKPACK EDIT ADD + +/obj/machinery/hydroponics/soil/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) + return NONE + +/obj/machinery/hydroponics/soil/default_deconstruction_crowbar(obj/item/crowbar, ignore_panel, custom_deconstruct) + return NONE + +/obj/machinery/hydroponics/soil/update_icon(updates=ALL) + . = ..() + if(self_sustaining) + add_atom_colour(rgb(255, 175, 0), FIXED_COLOUR_PRIORITY) + +/obj/machinery/hydroponics/soil/update_status_light_overlays() + // DARKPACK EDIT ADD START + if(waterlevel > 10 && wet_overlay) + . += mutable_appearance('modular_darkpack/modules/drugs/icons/tray.dmi', "soil_wet") + // DARKPACK EDIT ADD END + return // Has no lights + +/obj/machinery/hydroponics/soil/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) + if(weapon.tool_behaviour != TOOL_SHOVEL) //Spades can still uproot plants on left click + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + balloon_alert(user, "digging up soil...") + if(weapon.use_tool(src, user, 3 SECONDS, volume=50)) + balloon_alert(user, "bagged") + new sack_type(loc, src) //The bag handles sucking up the soil, stopping processing and setting relevants stats. + + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/hydroponics/soil/click_ctrl(mob/user) + return CLICK_ACTION_BLOCKING //Soil has no electricity. + +/obj/machinery/hydroponics/soil/on_deconstruction(disassembled) + new /obj/item/stack/ore/glass(drop_location(), 3) + +///called when a soil is plopped down on the ground. +/obj/machinery/hydroponics/soil/proc/on_place() + return + +/datum/armor/obj_soil + melee = 80 + bullet = 100 + laser = 90 + fire = 70 + acid = 30 + bomb = 15 + +/////////////// Advanced Soils ////////////// + +/obj/machinery/hydroponics/soil/vermaculite + name = "vermaculite growing medium" + desc = "A plant bed made of light, expanded mineral granules.\n\nThe plant health benefits from the high degree of soil aeration is especially useful for when propagating grafts." + icon = 'icons/obj/service/hydroponics/equipment.dmi' // DARKPACK EDIT ADD + icon_state = "soil_verm" + maxnutri = 20 + maxwater = 150 + tray_flags = SOIL | MULTIGRAFT | GRAFT_MEDIUM + sack_type = /obj/item/soil_sack/vermaculite + wet_overlay = null // DARKPACK EDIT ADD + +/obj/machinery/hydroponics/soil/gel + name = "hydrogel beads" + desc = "A plant bed made of superabsorbent polymer beads.\n\nThese types of water gel beads can hold onto an incredible amount of water and reduces evaporative losses to almost nothing." + icon = 'icons/obj/service/hydroponics/equipment.dmi' // DARKPACK EDIT ADD + icon_state = "soil_gel" + gender = PLURAL + maxwater = 300 + tray_flags = SOIL | HYDROPONIC | SUPERWATER + plant_offset_y = 2 + sack_type = /obj/item/soil_sack/gel + wet_overlay = null // DARKPACK EDIT ADD + +/obj/machinery/hydroponics/soil/coir + name = "coconut coir" // DARKPACK EDIT CHANGE + desc = "A type of traditional growing medium made from the husk of coconuts.\nMushrooms of all kinds thrive due to the high organic content enabling them to mature faster." // DARKPACK EDIT CHANGE + icon = 'icons/obj/service/hydroponics/equipment.dmi' // DARKPACK EDIT ADD + icon_state = "soil_coir" + maxnutri = 20 + tray_flags = SOIL | FAST_MUSHROOMS + sack_type = /obj/item/soil_sack/coir + wet_overlay = null // DARKPACK EDIT ADD + +/obj/machinery/hydroponics/soil/worm + name = "worm castings" + desc = "A type of compost created when the humble worm dutifully works the soil.\n\nIt is packed with nutrients unlocked by said creatures digestive system. Give thanks to the worm!" + // icon_state = "soil_worm" // DARKPACK EDIT REMOVAL + maxnutri = 35 + maxwater = 200 + tray_flags = SOIL | WORM_HABITAT | SLOW_RELEASE + plant_offset_y = 4 + sack_type = /obj/item/soil_sack/worm + +/* // DARKPACK EDIT REMOVAL +/obj/machinery/hydroponics/soil/worm/on_place() + . = ..() + flick("soil_worm_wiggle", src) +*/ + +/obj/machinery/hydroponics/soil/rich + name = "rich soil" + desc = "A rich patch of dirt, usually used in gardens." + //icon_state = "rich_soil" // DARKPACK EDIT REMOVAL + maxnutri = 20 + sack_type = /obj/item/soil_sack/rich + +/////////////////// Soil Sacks /////////////////////// +/// Holder items that store the soils until deployed. +/obj/item/soil_sack + name = "soil sack" + desc = "A large plastic bag containing commercial garden soil. It is packed with sand, peat and manure. While you might not care much for such mixture, the plants have strange tastes." + icon = 'icons/obj/service/hydroponics/equipment.dmi' + icon_state = "soil_sack" + lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' + base_icon_state = "soil_sack" + force = 7 + throwforce = 17 + attack_speed = 1.2 SECONDS + damtype = STAMINA + block_sound = 'sound/effects/bodyfall/bodyfall1.ogg' + w_class = WEIGHT_CLASS_HUGE + item_flags = SLOWS_WHILE_IN_HAND + resistance_flags = ACID_PROOF + hitsound = 'sound/items/pillow/pillow_hit.ogg' + drop_sound = 'sound/effects/footstep/woodbarefoot3.ogg' //could use better sounds in the future. + throw_drop_sound = 'sound/effects/bodyfall/bodyfall3.ogg' + custom_premium_price = PAYCHECK_CREW + throw_range = 3 + throw_speed = 1 + slowdown = 1 + drag_slowdown = 1 + var/obj/machinery/hydroponics/soil/stored_soil = /obj/machinery/hydroponics/soil + var/placement_sound = 'sound/effects/soil_plop.ogg' + +/obj/item/soil_sack/Initialize(mapload, obj/machinery/hydroponics/soil/outside_soil) + . = ..() + AddComponent(/datum/component/two_handed, force_multiplier = 2, wield_callback = CALLBACK(src, PROC_REF(on_wield)), unwield_callback = CALLBACK(src, PROC_REF(on_unwield))) + + if(outside_soil) + stored_soil = outside_soil + stored_soil.remove_plant() + stored_soil.forceMove(src) + STOP_PROCESSING(SSmachines, stored_soil) + animate(src, 100 MILLISECONDS, pixel_z = 4, easing = QUAD_EASING | EASE_OUT) + animate(time = 100 MILLISECONDS, pixel_z = 0, easing = QUAD_EASING | EASE_IN) + animate(time = 250 MILLISECONDS, pixel_x = rand(-6, 6), pixel_y = rand(-4, 4), flags = ANIMATION_PARALLEL) + +/obj/item/soil_sack/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isopenturf(interacting_with) || isgroundlessturf(interacting_with)) + return ..() + + if(locate(/obj/machinery/hydroponics/soil) in interacting_with) + to_chat(user, span_alert("There is already a bed of soil there!")) + return ITEM_INTERACT_BLOCKING + + if(!do_after(user, 1 SECONDS, interacting_with)) + return ITEM_INTERACT_BLOCKING + + if(ispath(stored_soil)) + stored_soil = new stored_soil(src) + stored_soil.reagents.add_reagent(/datum/reagent/plantnutriment/eznutriment, stored_soil.maxnutri / 2) + stored_soil.waterlevel = stored_soil.maxwater + else + START_PROCESSING(SSmachines, stored_soil) + + + stored_soil.forceMove(interacting_with) + playsound(stored_soil, placement_sound, 65, vary = TRUE) + stored_soil.on_place() + qdel(src) + return ITEM_INTERACT_SUCCESS + +/obj/item/soil_sack/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(attack_type == OVERWHELMING_ATTACK) + return FALSE + return ..() + +///Remove slowdown and add block chance when wielded. +/obj/item/soil_sack/proc/on_wield() + slowdown = 0 + if(ismob(loc)) + var/mob/wearer = loc + wearer.update_equipment_speed_mods() + block_chance = 25 + inhand_icon_state = "[base_icon_state]_w" + +///Reapply slowdown and remove block chance when unwielded. +/obj/item/soil_sack/proc/on_unwield() + slowdown = initial(slowdown) + if(ismob(loc)) + var/mob/wearer = loc + wearer.update_equipment_speed_mods() + block_chance = initial(block_chance) + inhand_icon_state = base_icon_state + + +/obj/item/soil_sack/vermaculite + name = "NT vermaculite sack" + desc = "A sack of expanded mineral granules that can be used as soilless growing medium.\n\nYou like to think of it a bag of rocky popcorn that lets the roots breathe." + icon_state = "soil_sack_verm" + base_icon_state = "soil_sack_verm" + custom_premium_price = PAYCHECK_CREW * 2 + stored_soil = /obj/machinery/hydroponics/soil/vermaculite + slowdown = 0 + +/obj/item/soil_sack/gel + name = "hydrogel bead sack" + desc = "A sack of space age superabsorbent gel beads! You wonder how shipping them prehydrated would ever make business sense..." + icon_state = "soil_sack_gel" + base_icon_state = "soil_sack_gel" + custom_premium_price = PAYCHECK_CREW * 2 + placement_sound = 'sound/effects/meatslap.ogg' + stored_soil = /obj/machinery/hydroponics/soil/gel + +/obj/item/soil_sack/coir + name = "#1™ coconut coir sack" // DARKPACK EDIT CHANGE + desc = "A sack of coconut coir. The fiberous roots are composted until they separate into individual fibres.\n\nProvides an excellent food source for mushrooms." // DARKPACK EDIT CHANGE + icon_state = "soil_sack_coir" + base_icon_state = "soil_sack_coir" + custom_premium_price = PAYCHECK_CREW * 3 + stored_soil = /obj/machinery/hydroponics/soil/coir + +/obj/item/soil_sack/worm + name = "worm castings sack" + desc = "A sack of vermicompost, also known as worm castings.\n\nThis invertebrate manure not only contains plant nutrients and undigested organic matter, it also harbours a rich flora of beneficial microorganisms." + icon_state = "soil_sack_worm" + base_icon_state = "soil_sack_worm" + custom_premium_price = PAYCHECK_CREW * 4 + stored_soil = /obj/machinery/hydroponics/soil/worm + +/obj/item/soil_sack/rich + name = "rich soil sack" + desc = "A sack of rich black soil.\nAs your gaze falls upon it, you feel a bit more connected to the land." + custom_premium_price = PAYCHECK_CREW * 1.5 + stored_soil = /obj/machinery/hydroponics/soil/rich diff --git a/code/modules/hydroponics/unique_plant_genes.dm b/code/modules/hydroponics/unique_plant_genes.dm index 8989d753a959..7b273834a869 100644 --- a/code/modules/hydroponics/unique_plant_genes.dm +++ b/code/modules/hydroponics/unique_plant_genes.dm @@ -110,6 +110,7 @@ force_multiplier = 0.2 degrades_after_hit = TRUE degradation_noun = "petals" + trait_flags = TRAIT_SHOW_EXAMINE /datum/plant_gene/trait/attack/novaflower_attack/attack_effect(obj/item/our_plant, mob/living/target, mob/living/user) if(!istype(target)) @@ -191,6 +192,7 @@ name = "Rose Thorns" description = "The stem has a lot of thorns." traits_to_check = list(TRAIT_PIERCEIMMUNE) + trait_flags = TRAIT_SHOW_EXAMINE /datum/plant_gene/trait/backfire/rose_thorns/backfire_effect(obj/item/our_plant, mob/living/carbon/user) var/obj/item/seeds/our_seed = our_plant.get_plant_seed() @@ -207,6 +209,7 @@ name = "Burning Stem" description = "The stem may burn your hand." cancel_action_on_backfire = TRUE + trait_flags = TRAIT_SHOW_EXAMINE /datum/plant_gene/trait/backfire/novaflower_heat/backfire_effect(obj/item/our_plant, mob/living/carbon/user) to_chat(user, span_danger("[our_plant] singes your bare hand!")) @@ -217,6 +220,7 @@ /datum/plant_gene/trait/backfire/nettle_burn name = "Stinging Stem" description = "The stem may sting your hand." + trait_flags = TRAIT_SHOW_EXAMINE /datum/plant_gene/trait/backfire/nettle_burn/backfire_effect(obj/item/our_plant, mob/living/carbon/user) to_chat(user, span_danger("[our_plant] burns your bare hand!")) @@ -239,7 +243,8 @@ /// Ghost-Chili heating up on backfire /datum/plant_gene/trait/backfire/chili_heat name = "Active Capsicum Glands" - description = "You may survive a cold winter with this in hand." + description = "It emits a strong heat when handled." + trait_flags = TRAIT_SHOW_EXAMINE genes_to_check = list(/datum/plant_gene/trait/chem_heating) /// The mob currently holding the chili. var/datum/weakref/held_mob @@ -457,6 +462,7 @@ name = "Large Bites" description = "You can't hold off from eating this in one bite!" icon = FA_ICON_DRUMSTICK_BITE + trait_flags = TRAIT_SHOW_EXAMINE /datum/plant_gene/trait/one_bite/on_new_plant(obj/item/our_plant, newloc) . = ..() @@ -685,14 +691,13 @@ name = "Complex Harvest" description = "Halves the maximum yield of the plant, and prevents it from benefiting from pollination's yield bonus." icon = FA_ICON_SLASH - trait_flags = TRAIT_SHOW_EXAMINE|TRAIT_HALVES_YIELD|TRAIT_NO_POLLINATION + trait_flags = TRAIT_HALVES_YIELD|TRAIT_NO_POLLINATION mutability_flags = NONE /// Poppy's unique trait that allows slicing for sap /datum/plant_gene/trait/opium_production name = "Sap Buds" description = "Using a knife or other sharp object on the plant between ages 200 seconds to 400 seconds will yield a sap." - trait_flags = NONE icon = FA_ICON_PILLS /// Has parent plant been harvested for sap already? var/extracted = FALSE diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm index d89be558c42a..e5de5d3f8584 100644 --- a/code/modules/instruments/items.dm +++ b/code/modules/instruments/items.dm @@ -48,6 +48,8 @@ inhand_icon_state = "violin" hitsound = SFX_SWING_HIT allowed_instrument_ids = "violin" + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 4, /datum/material/iron = SHEET_MATERIAL_AMOUNT) + custom_price = 200 // DARKPACK EDIT ADD - ECONOMY /obj/item/instrument/violin/golden name = "golden violin" @@ -55,6 +57,7 @@ icon_state = "golden_violin" inhand_icon_state = "golden_violin" resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + custom_materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT * 4, /datum/material/iron = SHEET_MATERIAL_AMOUNT) /obj/item/instrument/banjo name = "banjo" @@ -65,6 +68,7 @@ attack_verb_simple = list("scruggs-style", "hum-diggity", "shin-dig", "clawhammer") hitsound = 'sound/items/weapons/banjoslap.ogg' allowed_instrument_ids = "banjo" + custom_price = 200 // DARKPACK EDIT ADD - ECONOMY /obj/item/instrument/guitar name = "guitar" @@ -75,6 +79,7 @@ attack_verb_simple = list("play metal on", "serenade", "crash", "smash") hitsound = 'sound/items/weapons/stringsmash.ogg' allowed_instrument_ids = list("guitar","csteelgt","cnylongt", "ccleangt", "cmutedgt") + custom_price = 200 // DARKPACK EDIT ADD - ECONOMY /obj/item/instrument/eguitar name = "electric guitar" @@ -86,6 +91,7 @@ attack_verb_simple = list("play metal on", "shred", "crash", "smash") hitsound = 'sound/items/weapons/stringsmash.ogg' allowed_instrument_ids = "eguitar" + custom_price = 200 // DARKPACK EDIT ADD - ECONOMY /obj/item/instrument/glockenspiel name = "glockenspiel" @@ -93,6 +99,7 @@ icon_state = "glockenspiel" allowed_instrument_ids = list("glockenspiel","crvibr", "sgmmbox", "r3celeste") inhand_icon_state = "glockenspiel" + custom_price = 200 // DARKPACK EDIT ADD - ECONOMY /obj/item/instrument/accordion name = "accordion" @@ -100,6 +107,7 @@ icon_state = "accordion" allowed_instrument_ids = list("crack", "crtango", "accordion") inhand_icon_state = "accordion" + custom_price = 200 // DARKPACK EDIT ADD - ECONOMY /obj/item/instrument/trumpet name = "trumpet" @@ -135,6 +143,7 @@ icon_state = "saxophone" allowed_instrument_ids = "saxophone" inhand_icon_state = "saxophone" + custom_price = 200 // DARKPACK EDIT ADD - ECONOMY /obj/item/instrument/saxophone/spectral name = "spectral saxophone" @@ -163,6 +172,7 @@ icon_state = "trombone" allowed_instrument_ids = list("crtrombone", "crbrass", "trombone") inhand_icon_state = "trombone" + custom_price = 200 // DARKPACK EDIT ADD - ECONOMY /obj/item/instrument/trombone/spectral name = "spectral trombone" @@ -192,6 +202,7 @@ icon_state = "recorder" allowed_instrument_ids = "recorder" inhand_icon_state = "recorder" + custom_price = 200 // DARKPACK EDIT ADD - ECONOMY /obj/item/instrument/harmonica name = "harmonica" @@ -204,6 +215,7 @@ w_class = WEIGHT_CLASS_SMALL actions_types = list(/datum/action/item_action/instrument) action_slots = ALL + custom_price = 200 // DARKPACK EDIT ADD - ECONOMY /obj/item/instrument/harmonica/equipped(mob/user, slot, initial = FALSE) . = ..() diff --git a/code/modules/instruments/piano_synth.dm b/code/modules/instruments/piano_synth.dm index f0357eb789c9..fb4a0f7f4168 100644 --- a/code/modules/instruments/piano_synth.dm +++ b/code/modules/instruments/piano_synth.dm @@ -9,6 +9,7 @@ var/shell_capacity = SHELL_CAPACITY_SMALL /// Can a mouse play this instrument? var/mouse_playable = TRUE + custom_price = 200 // DARKPACK EDIT ADD - ECONOMY /obj/item/instrument/piano_synth/Initialize(mapload) . = ..() diff --git a/code/modules/interview/interview.dm b/code/modules/interview/interview.dm index d2620274257a..ad690da6634a 100644 --- a/code/modules/interview/interview.dm +++ b/code/modules/interview/interview.dm @@ -55,7 +55,7 @@ log_admin_private("[key_name(approved_by)] has approved interview #[id] for [owner_ckey][!owner ? "(DC)": ""].") message_admins(span_adminnotice("[key_name(approved_by)] has approved [link_self()] for [owner_ckey][!owner ? "(DC)": ""].")) if (owner) - SEND_SOUND(owner, sound('sound/effects/adminhelp.ogg')) + SEND_SOUND(owner, sound('modular_darkpack/master_files/sounds/adminhelp.ogg')) // DARKPACK EDIT CHANGE to_chat(owner, "-- Interview Update --" \ + "\n[span_adminsay("Your interview was approved, you will now be reconnected in 5 seconds.")]", confidential = TRUE) addtimer(CALLBACK(src, PROC_REF(reconnect_owner)), 5 SECONDS) @@ -75,7 +75,7 @@ message_admins(span_adminnotice("[key_name(denied_by)] has denied [link_self()] for [owner_ckey][!owner ? "(DC)": ""].")) addtimer(CALLBACK(GLOB.interviews, TYPE_PROC_REF(/datum/interview_manager, release_from_cooldown), owner_ckey), 18 SECONDS) if (owner) - SEND_SOUND(owner, sound('sound/effects/adminhelp.ogg')) + SEND_SOUND(owner, sound('modular_darkpack/master_files/sounds/adminhelp.ogg')) // DARKPACK EDIT CHANGE to_chat(owner, "-- Interview Update --" \ + "\nUnfortunately your interview was denied. Please try submitting another questionnaire." \ + " You may do this in three minutes.", confidential = TRUE) diff --git a/code/modules/interview/interview_manager.dm b/code/modules/interview/interview_manager.dm index 07104c15c0be..6eeae440d19b 100644 --- a/code/modules/interview/interview_manager.dm +++ b/code/modules/interview/interview_manager.dm @@ -107,7 +107,7 @@ GLOBAL_DATUM_INIT(interviews, /datum/interview_manager, new) to_chat(to_queue.owner, span_notice("No active admins are online, your interview's submission was sent through TGS to admins who are available. This may use IRC or Discord.")) for(var/client/X in GLOB.admins) if(X.prefs.toggles & SOUND_ADMINHELP) - SEND_SOUND(X, sound('sound/effects/adminhelp.ogg')) + SEND_SOUND(X, sound('modular_darkpack/master_files/sounds/adminhelp.ogg')) // DARKPACK EDIT CHANGE window_flash(X, ignorepref = TRUE) to_chat(X, span_adminhelp("[to_queue.link_self()] for [ckey] enqueued for review. Current position in queue: [to_queue.pos_in_queue]"), confidential = TRUE) diff --git a/code/modules/jobs/departments/departments.dm b/code/modules/jobs/departments/departments.dm index 3d974366cd8e..6a2d76336030 100644 --- a/code/modules/jobs/departments/departments.dm +++ b/code/modules/jobs/departments/departments.dm @@ -18,6 +18,8 @@ var/list/department_jobs = list() /// For separatists, what independent name prefix does their nation get named? var/list/nation_prefixes = list() + /// Root type for the area that people in this department primarily work in. + var/primary_work_area /// List of /area types that are considered part of this department's "delivery" area. /// Acts as a priority system, where first items are picked first. var/list/department_delivery_areas = list() @@ -68,6 +70,7 @@ department_name = DEPARTMENT_CAPTAIN department_bitflags = DEPARTMENT_BITFLAG_CAPTAIN department_head = /datum/job/captain + primary_work_area = /area/station/command /datum/job_department/command department_name = DEPARTMENT_COMMAND @@ -77,7 +80,7 @@ display_order = 1 label_class = "command" ui_color = "#6681a5" - + primary_work_area = /area/station/command /datum/job_department/security department_name = DEPARTMENT_SECURITY @@ -88,6 +91,7 @@ label_class = "security" ui_color = "#d46a78" nation_prefixes = list("Securi", "Beepski", "Shitcuri", "Red", "Stunba", "Flashbango", "Flasha", "Stanfordi") + primary_work_area = /area/station/security department_delivery_areas = list( /area/station/security/office, /area/station/security/brig, @@ -110,6 +114,7 @@ label_class = "engineering" ui_color = "#dfb567" nation_prefixes = list("Atomo", "Engino", "Power", "Teleco") + primary_work_area = /area/station/engineering department_delivery_areas = list( /area/station/engineering/main, /area/station/engineering/lobby, @@ -127,6 +132,7 @@ label_class = "medical" ui_color = "#65b2bd" nation_prefixes = list("Mede", "Healtha", "Recova", "Chemi", "Viro", "Psych") + primary_work_area = /area/station/medical department_delivery_areas = list( /area/station/medical/medbay/central, /area/station/medical/medbay, @@ -146,6 +152,7 @@ label_class = "science" ui_color = "#c973c9" nation_prefixes = list("Sci", "Griffa", "Geneti", "Explosi", "Mecha", "Xeno", "Nani", "Cyto") + primary_work_area = /area/station/science department_delivery_areas = list( /area/station/science/research, /area/station/science/lobby, @@ -165,6 +172,7 @@ label_class = "supply" ui_color = "#cf9c6c" nation_prefixes = list("Cargo", "Guna", "Suppli", "Mule", "Crate", "Ore", "Mini", "Shaf") + primary_work_area = /area/station/cargo head_of_staff_access = ACCESS_QM department_access = REGION_ACCESS_SUPPLY @@ -177,6 +185,7 @@ label_class = "service" ui_color = "#7cc46a" nation_prefixes = list("Honka", "Boozo", "Fatu", "Danka", "Mimi", "Libra", "Jani", "Religi") + primary_work_area = /area/station/service department_delivery_areas = list(/area/station/hallway/secondary/service, /area/station/service/bar/atrium) associated_cargo_groups = list("Service", "Food & Hydroponics", "Livestock", "Costumes & Toys") head_of_staff_access = ACCESS_HOP diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 670e1912fb90..979d1a986786 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -11,11 +11,8 @@ /// Innate skill levels unlocked at roundstart. Based on config.jobs_have_minimal_access config setting, for example with a full crew. Format is list(/datum/skill/foo = SKILL_EXP_NOVICE) with exp as an integer or as per code/_DEFINES/skills.dm var/list/minimal_skills - /// Determines who can demote this position - var/department_head = list() - /// Tells the given channels that the given mob is the new department head. See communications.dm for valid channels. - var/list/head_announce = null + var/head_announce /// Bitflags for the job var/auto_deadmin_role_flags = NONE @@ -187,7 +184,7 @@ /// 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) + announce_head(joining_mob, list(head_announce)) //Used for a special check of whether to allow a client to latejoin as this job. @@ -207,6 +204,7 @@ account_id = bank_account.account_id bank_account.replaceable = FALSE add_mob_memory(/datum/memory/key/account, remembered_id = account_id) + add_mob_memory(/datum/memory/key/bank_pin, remembered_id = bank_account.bank_pin) // DARKPACK EDIT ADD dress_up_as_job( equipping = equipping, @@ -405,7 +403,7 @@ card.update_label() card.update_icon() - /* DARKPACK EDIT REMOVAL - ECONOMY + /* // DARKPACK EDIT REMOVAL - ECONOMY var/datum/bank_account/account = SSeconomy.bank_accounts_by_id["[equipped.account_id]"] if(account && account.account_id == equipped.account_id) @@ -415,18 +413,25 @@ equipped.update_ID_card() + if(!pda_slot) //This job outfit doesn't have a PDA. + return + var/obj/item/modular_computer/pda/pda = equipped.get_item_by_slot(pda_slot) + if(pda && !istype(pda)) //we found something but it isn't a PDA, check if it's inside it instead. + pda = locate() in pda - if(istype(pda)) - pda.imprint_id(equipped.real_name, equipped_job.title) - pda.update_ringtone(equipped_job.job_tone) - pda.UpdateDisplay() + if(!istype(pda)) //We couldn't find a PDA at all. + stack_trace("pda_slot was set but we couldn't find a PDA!") + return - var/client/equipped_client = GLOB.directory[ckey(equipped.mind?.key)] + pda.imprint_id(equipped.real_name, equipped_job.title) + pda.update_ringtone(equipped_job.job_tone) + pda.UpdateDisplay() - if(equipped_client) - pda.update_pda_prefs(equipped_client) + var/client/equipped_client = GLOB.directory[ckey(equipped.mind?.key)] + if(equipped_client) + pda.update_pda_prefs(equipped_client) /datum/outfit/job/get_chameleon_disguise_info() var/list/types = ..() @@ -512,8 +517,7 @@ // This is unfortunately necessary because of snowflake AI init code. To be refactored. spawn_instance = new spawn_type(get_turf(spawn_point), null, player_client.mob) else - spawn_instance = new spawn_type(player_client.mob.loc) - spawn_point.JoinPlayerHere(spawn_instance, TRUE) + spawn_instance = spawn_point.JoinPlayerHere(spawn_type, TRUE) spawn_instance.apply_prefs_job(player_client, src) if(!player_client) qdel(spawn_instance) @@ -650,3 +654,15 @@ /// This proc may be called when someone of this job is made into a traitor to create custom objectives related to the job. /datum/job/proc/generate_traitor_objective() return null + +/// Returns a large (due to cropping) icon of this job's sechud icon state. +/datum/job/proc/get_lobby_icon() as /icon + var/datum/outfit/job_outfit = outfit + if(!job_outfit || !job_outfit::id_trim) + CRASH("[src.type] has no job outfit but isn't overwriting get_lobby_icon().") + var/datum/id_trim/job_trim = job_outfit::id_trim + var/icon_state = job_trim::sechud_icon_state + if(!icon_state || icon_state == SECHUD_UNKNOWN) + CRASH("[src.type] has no job icon state.") + + return icon('icons/mob/huds/hud.dmi', icon_state) diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm index bd582705507a..b4a5346e1a5d 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_CANNOT_OPEN_SLOTS + job_flags = JOB_EQUIP_RANK | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS // DARKPACK EDIT, ORIGINAL: job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS config_tag = "AI" @@ -89,3 +89,6 @@ /datum/job/ai/on_respawn(mob/new_character) new_character.AIize() + +/datum/job/ai/get_lobby_icon() + return icon('icons/mob/huds/hud.dmi', "hudai") diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index d016688042a8..0a2472d7b065 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -1,7 +1,6 @@ /datum/job/atmospheric_technician title = JOB_ATMOSPHERIC_TECHNICIAN description = "Ensure the air is breathable on the station, fill oxygen tanks, fight fires, purify the air." - department_head = list(JOB_CHIEF_ENGINEER) faction = FACTION_STATION total_positions = 3 spawn_positions = 2 diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index 8084fc6cf622..8d39b5efcb34 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -1,7 +1,6 @@ /datum/job/bartender title = JOB_BARTENDER description = "Serve booze, mix drinks, keep the crew drunk." - department_head = list(JOB_HEAD_OF_PERSONNEL) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index 7ccc4b31ceb7..cff826ec5054 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -1,7 +1,6 @@ /datum/job/botanist title = JOB_BOTANIST description = "Grow plants for the cook, for medicine, and for recreation." - department_head = list(JOB_HEAD_OF_PERSONNEL) faction = FACTION_STATION total_positions = 3 spawn_positions = 2 diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index a9872c6092f8..718751bf7876 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -4,7 +4,6 @@ keep the crew alive, be prepared to do anything and everything or die \ horribly trying." auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY - department_head = list("CentCom") faction = FACTION_STATION total_positions = 1 spawn_positions = 1 @@ -23,7 +22,7 @@ paycheck = PAYCHECK_COMMAND paycheck_department = ACCOUNT_SEC - mind_traits = list(HEAD_OF_STAFF_MIND_TRAITS) + mind_traits = list(HEAD_OF_STAFF_MIND_TRAITS, TRAIT_DESENSITIZED) liver_traits = list(TRAIT_ROYAL_METABOLISM) display_order = JOB_DISPLAY_ORDER_CAPTAIN diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index 008ddd6df0db..2cef58a09e84 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -3,7 +3,6 @@ description = "Distribute supplies to the departments that ordered them, \ collect empty crates, load and unload the supply shuttle, \ ship bounty cubes." - department_head = list(JOB_QUARTERMASTER) faction = FACTION_STATION total_positions = 5 spawn_positions = 3 diff --git a/code/modules/jobs/job_types/chaplain/chaplain.dm b/code/modules/jobs/job_types/chaplain/chaplain.dm index 6f84c0f840a0..75fd0a7c00a7 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain.dm @@ -2,7 +2,6 @@ title = JOB_CHAPLAIN description = "Hold services and funerals, cremate people, preach your \ religion, protect the crew against cults." - department_head = list(JOB_HEAD_OF_PERSONNEL) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 @@ -13,6 +12,8 @@ outfit = /datum/outfit/job/chaplain plasmaman_outfit = /datum/outfit/plasmaman/chaplain + mind_traits = list(TRAIT_SPIRITUAL, TRAIT_DESENSITIZED) + paycheck = PAYCHECK_CREW paycheck_department = ACCOUNT_SRV @@ -77,7 +78,7 @@ holy_bible.deity_name = pick("Dick Powers", "King Cock") else holy_bible.deity_name = pick("Gay Space Jesus", "Gandalf", "Dumbledore") - human_spawned.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100) // starts off brain damaged as fuck + human_spawned.adjust_organ_loss(ORGAN_SLOT_BRAIN, 100) // starts off brain damaged as fuck if("lol", "wtf", "poo", "badmin", "shitmin", "deadmin", "meme", "memes", "skibidi") new_bible = pick("Woody's Got Wood: The Aftermath", "Sweet Bro and Hella Jeff: Expanded Edition","F.A.T.A.L. Rulebook", "Toilet Humor") switch(new_bible) @@ -89,7 +90,7 @@ holy_bible.deity_name = "Twenty Ten-Sided Dice" if("Toilet Humor") holy_bible.deity_name = pick("Skibidi Toilet", "Skibidi Wizard", "Skibidi Bathtub", "John Skibidi", "Skibidi Skibidi", "G-Toilet 1.0", "John Freeman") - human_spawned.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100) // also starts off brain damaged as fuck + human_spawned.adjust_organ_loss(ORGAN_SLOT_BRAIN, 100) // also starts off brain damaged as fuck if("servicianism", "partying") holy_bible.desc = "Happy, Full, Clean. Live it and give it." if("weeaboo","kawaii") diff --git a/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm b/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm index 2bc8ffdaf32c..1b46ade24378 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm @@ -107,6 +107,7 @@ inhand_icon_state = null body_parts_covered = GROIN|LEGS flags_inv = HIDEJUMPSUIT|HIDEBELT + clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR /obj/item/clothing/suit/chaplainsuit/whiterobe name = "white robe" @@ -246,6 +247,21 @@ /obj/item/clothing/suit/chaplainsuit/armor/crusader/blue icon_state = "crusader-blue" +/obj/item/clothing/head/helmet/chaplain/heretic + name = "occultist's hood" + desc = "Conceals your features from the things that look back at you." + icon_state = "heretichood" + inhand_icon_state = null + flags_cover = HEADCOVERSEYES + flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS + +/obj/item/clothing/suit/chaplainsuit/armor/heretic + name = "occultist's robes" + desc = "Shields your body from the things others fail to notice." + icon_state = "hereticrobe" + inhand_icon_state = null + body_parts_covered = CHEST|GROIN|LEGS + /obj/item/clothing/suit/hooded/chaplain_hoodie name = "follower hoodie" desc = "Hoodie made for acolytes of the chaplain." diff --git a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm index de65b4e7021a..679a16caf1ca 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm @@ -1,5 +1,31 @@ // CHAPLAIN NULLROD AND CUSTOM WEAPONS // +GLOBAL_LIST_INIT(nullrod_variants, init_nullrod_variants()) + +/proc/init_nullrod_variants() + var/list/rods = list() + for(var/obj/item/nullrod/nullrod_type as anything in typesof(/obj/item/nullrod)) + if(!nullrod_type::chaplain_spawnable) + continue + rods[nullrod_type] = nullrod_type::menu_description + //special non-nullrod subtyped shit + rods[/obj/item/toy/plush/carpplushie/nullrod] = "A plushie dealing a little less damage due to its cute form. \ + Capable of blessing one person with the Carp-Sie favor, \ + which grants friendship of all wild space carps. Fits in pockets. Can be worn on the belt." + rods[/obj/item/gun/ballistic/bow/divine] = "A divine bow and 10 quivered holy arrows." + rods[/obj/item/organ/cyberimp/arm/toolkit/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." + rods[/obj/item/melee/skateboard/holyboard] = "A skateboard that grants you flight and anti-magic abilities while ridden. Fits in your bag." + + for(var/obj/item/melee/energy/sword/nullrod/energy_nullrod_type as anything in typesof(/obj/item/melee/energy/sword/nullrod)) + rods[energy_nullrod_type] = "An energy sword, but with a lower force, no armour penetration and a low chance of blocking. Can be switched on and off. \ + Can be stored away easily while off, but impossible while on." + + return rods + /obj/item/nullrod name = "null rod" desc = "A rod of pure obsidian; its very presence disrupts and dampens 'magical forces'. That's what the guidebook says, anyway." @@ -27,63 +53,20 @@ /obj/item/nullrod/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", \ - 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, mob_biotypes = MOB_SPIRIT, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE) - ADD_TRAIT(src, TRAIT_NULLROD_ITEM, INNATE_TRAIT) + AddElement(/datum/element/nullrod_core, chaplain_spawnable) if((GLOB.holy_weapon_type && station_holy_item) || type != /obj/item/nullrod) return - - var/list/rods = list() - for(var/obj/item/nullrod/nullrod_type as anything in typesof(/obj/item/nullrod)) - if(!initial(nullrod_type.chaplain_spawnable)) - continue - 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/cyberimp/arm/toolkit/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." - rods[/obj/item/melee/skateboard/holyboard] = "A skateboard that grants you flight and anti-magic abilities while ridden. Fits in your bag." - AddComponent(/datum/component/subtype_picker, rods, CALLBACK(src, PROC_REF(on_holy_weapon_picked))) + AddComponent(/datum/component/subtype_picker, GLOB.nullrod_variants, CALLBACK(src, PROC_REF(on_holy_weapon_picked))) /// Callback for subtype picker, invoked when the chaplain picks a new nullrod /obj/item/nullrod/proc/on_holy_weapon_picked(obj/item/nullrod/new_holy_weapon, mob/living/picker) - // Some nullrod variants aren't nullrod subtypes - if(istype(new_holy_weapon)) - new_holy_weapon.on_selected(src, picker) - else // In which case they still need to be marked as one - ADD_TRAIT(new_holy_weapon, TRAIT_NULLROD_ITEM, INNATE_TRAIT) if(!station_holy_item) return GLOB.holy_weapon_type = new_holy_weapon.type SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NULLROD_PICKED) SSblackbox.record_feedback("tally", "chaplain_weapon", 1, "[new_holy_weapon.name]") -/// Called on a new instance of a nullrod when selected -/// Override this to add behavior when a nullrod is picked -/obj/item/nullrod/proc/on_selected(obj/item/nullrod/old_weapon, mob/living/picker) - return - -/// Callback for effect remover, invoked when a cult rune is cleared -/obj/item/nullrod/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 - /obj/item/nullrod/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is killing [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to get closer to god!")) return (BRUTELOSS|FIRELOSS) @@ -145,7 +128,7 @@ AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -3) /obj/item/nullrod/claymore/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) - if(attack_type == (PROJECTILE_ATTACK || LEAP_ATTACK || OVERWHELMING_ATTACK)) + if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK) final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword. Or a road roller, if one happened to hit you. return ..() @@ -208,89 +191,26 @@ SET_ATTACK_FORCE(attack_modifiers, rand(max(force - 15, 1), force + 15)) return ..() -/obj/item/nullrod/claymore/saber - name = "light energy sword" - desc = "If you strike me down, I shall become more robust than you can possibly imagine." - icon = 'icons/obj/weapons/transforming_energy.dmi' - icon_state = "e_sword_on_blue" - inhand_icon_state = "e_sword_on_blue" - worn_icon_state = "swordblue" - icon_angle = -45 - slot_flags = ITEM_SLOT_BELT - hitsound = 'sound/items/weapons/blade1.ogg' - block_sound = 'sound/items/weapons/block_blade.ogg' - menu_description = "A sharp energy sword which provides a low chance of blocking incoming melee attacks. Can be worn on the belt." - -/obj/item/nullrod/claymore/saber/red - name = "dark energy sword" - desc = "Woefully ineffective when used on steep terrain." - icon_state = "e_sword_on_red" - inhand_icon_state = "e_sword_on_red" - worn_icon_state = "swordred" - -/obj/item/nullrod/claymore/saber/pirate - name = "nautical energy sword" - desc = "Convincing HR that your religion involved piracy was no mean feat." - icon_state = "e_cutlass_on" - inhand_icon_state = "e_cutlass_on" - worn_icon_state = "swordred" - -/// Vibro Variant -/// This subtype possesses armor penetration and is sharp. - -/obj/item/nullrod/vibro - name = "high frequency blade" - desc = "Bad references are the DNA of the soul." - icon = 'icons/obj/weapons/sword.dmi' - icon_state = "hfrequency0" - inhand_icon_state = "hfrequency1" - worn_icon_state = "hfrequency0" - icon_angle = -45 - 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/items/weapons/rapierhit.ogg' - menu_description = "A sharp blade which partially penetrates armor. Very effective at butchering bodies. Can be worn on the back." - var/list/alt_continuous = list("stabs", "pierces", "impales") - var/list/alt_simple = list("stab", "pierce", "impale") - -/obj/item/nullrod/vibro/Initialize(mapload) - . = ..() - alt_continuous = string_list(alt_continuous) - alt_simple = string_list(alt_simple) - AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -3) - -/obj/item/nullrod/vibro/Initialize(mapload) - . = ..() - AddComponent( - /datum/component/butchering, \ - speed = 7 SECONDS, \ - effectiveness = 110, \ - ) - -/obj/item/nullrod/vibro/spellblade +/obj/item/nullrod/claymore/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' icon_state = "spellblade" inhand_icon_state = "spellblade" + slot_flags = ITEM_SLOT_BACK lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' worn_icon_state = "spellblade" hitsound = 'sound/items/weapons/rapierhit.ogg' - menu_description = "A sharp blade which partially penetrates armor. Very effective at butchering bodies. Can be worn on the back." + menu_description = "A sharp blade which provides a low chance of blocking incoming melee attacks. Can be worn on the back." -/obj/item/nullrod/vibro/talking +/obj/item/nullrod/claymore/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' icon_state = "talking_sword" inhand_icon_state = "talking_sword" + slot_flags = ITEM_SLOT_BACK icon_angle = 45 lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' @@ -298,13 +218,13 @@ attack_verb_continuous = list("chops", "slices", "cuts") attack_verb_simple= list("chop", "slice", "cut") hitsound = 'sound/items/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." + menu_description = "A sharp blade which provides a low chance of blocking incoming melee attacks. Able to awaken a friendly spirit to provide guidance. Can be worn on the back." -/obj/item/nullrod/vibro/talking/Initialize(mapload) +/obj/item/nullrod/spellblade/talking/Initialize(mapload) . = ..() AddComponent(/datum/component/spirit_holding) -/obj/item/nullrod/vibro/talking/chainsword +/obj/item/nullrod/claymore/talking/chainsword name = "possessed chainsaw sword" desc = "Suffer not a heretic to live." icon_state = "chainswordon" @@ -319,9 +239,83 @@ toolspeed = 0.5 //same speed as an active chainsaw chaplain_spawnable = FALSE //prevents being pickable as a chaplain weapon (it has 30 force) +/obj/item/nullrod/spellblade/talking/chainsword/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) //Thanks goodness it cannot be selected by chappies + AddComponent( + /datum/component/butchering, \ + speed = 7 SECONDS, \ + effectiveness = 110, \ + ) + +/obj/item/nullrod/claymore/heretic + name = "occultist's khopesh" + desc = "Steels your hand to slay foes beyond comprehension." + icon = 'icons/obj/weapons/khopesh.dmi' + icon_state = "eldritch_blade" + lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' + righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' + inhand_x_dimension = 64 + inhand_y_dimension = 64 + inhand_icon_state = "eldritch_blade" + worn_icon_state = "eldritch_blade" + menu_description = "A sharp curved blade which provides a low chance of blocking incoming melee attacks. Can be worn on the back or belt." + /// Other Variants /// Not a special category on their own, but usually possess more unique mechanics +// High Frequency Blade - Two-handed, has armor penetration, and can block exosuit attacks relatively easily. Can't block anything else. + +/obj/item/nullrod/vibro + name = "high frequency blade" + desc = "Bad references are the DNA of the soul." + icon = 'icons/obj/weapons/sword.dmi' + icon_state = "hfrequency0" + inhand_icon_state = "hfrequency0" + base_icon_state = "hfrequency" + worn_icon_state = "hfrequency0" + icon_angle = -45 + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + w_class = WEIGHT_CLASS_BULKY + force = 10 + armour_penetration = 35 + block_chance = 40 + 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/items/weapons/rapierhit.ogg' + block_sound = 'sound/items/weapons/parry.ogg' + menu_description = "A sharp blade which partially penetrates armor. Unusualy adept at blocking melee attacks from exosuits. Very effective at butchering bodies. Can be worn on the back." + var/list/alt_continuous = list("stabs", "pierces", "impales") + var/list/alt_simple = list("stab", "pierce", "impale") + +/obj/item/nullrod/vibro/Initialize(mapload) + . = ..() + alt_continuous = string_list(alt_continuous) + alt_simple = string_list(alt_simple) + AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -3) + AddComponent(/datum/component/two_handed, \ + force_unwielded = 10, \ + force_wielded = 18, \ + ) + AddComponent( + /datum/component/butchering, \ + speed = 7 SECONDS, \ + effectiveness = 110, \ + ) + +/obj/item/nullrod/vibro/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(prob(final_block_chance * (HAS_TRAIT(src, TRAIT_WIELDED) ? 2 : 1)) && attack_type == OVERWHELMING_ATTACK) + owner.visible_message(span_danger("[owner] parries [attack_text] with [src]!")) + return TRUE + return FALSE + +/obj/item/nullrod/vibro/update_icon_state() + icon_state = inhand_icon_state = "[base_icon_state][HAS_TRAIT(src, TRAIT_WIELDED)]" + return ..() + // God Hand - Cannot be dropped. Does burn damage. /obj/item/nullrod/godhand @@ -455,17 +449,20 @@ bonus_modifier = 0, \ butcher_sound = hitsound, \ ) + RegisterSignal(src, COMSIG_ITEM_SUBTYPE_PICKER_SELECTED, PROC_REF(on_selected)) -/obj/item/nullrod/chainsaw/on_selected(obj/item/nullrod/old_weapon, mob/living/picker) +/obj/item/nullrod/chainsaw/proc/on_selected(datum/source, obj/item/nullrod/old_weapon, mob/living/picker) + SIGNAL_HANDLER if(!iscarbon(picker)) return + to_chat(picker, span_warning("[src] takes the place of your arm!")) var/obj/item/bodypart/active = picker.get_active_hand() var/mob/living/carbon/new_hero = picker new_hero.make_item_prosthetic(src, active.body_zone) /obj/item/nullrod/chainsaw/equipped(mob/living/carbon/user, slot, initial) . = ..() - if(!iscarbon(user)) + if(!iscarbon(user) || HAS_TRAIT_FROM(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)) return if(!(slot & ITEM_SLOT_HANDS)) return @@ -607,29 +604,22 @@ // Carp-sie Plushie - Gives you the carp faction so that you can be friends with carp. -/obj/item/nullrod/carp +/obj/item/toy/plush/carpplushie/nullrod name = "carp-sie plushie" desc = "An adorable stuffed toy that resembles the god of all carp. The teeth look pretty sharp. Activate it to receive the blessing of Carp-Sie." - icon = 'icons/map_icons/items/_item.dmi' - icon_state = "/obj/item/nullrod/carp" - post_init_icon_state = "map_plushie_carp" - greyscale_config = /datum/greyscale_config/plush_carp - greyscale_colors = "#cc99ff#000000" - inhand_icon_state = "carp_plushie" worn_icon_state = "nullrod" lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' righthand_file = 'icons/mob/inhands/items_righthand.dmi' force = 15 - attack_verb_continuous = list("bites", "eats", "fin slaps") - attack_verb_simple = list("bite", "eat", "fin slap") - hitsound = 'sound/items/weapons/bite.ogg' - menu_description = "A plushie dealing a little less damage due to its cute form. Capable of blessing one person with the Carp-Sie favor, which grants friendship of all wild space carps. Fits in pockets. Can be worn on the belt." + offspring_type = /obj/item/toy/plush/carpplushie + divine = TRUE -/obj/item/nullrod/carp/Initialize(mapload) +/obj/item/toy/plush/carpplushie/nullrod/Initialize(mapload) . = ..() + AddElement(/datum/element/nullrod_core) AddComponent(/datum/component/faction_granter, FACTION_CARP, holy_role_required = HOLY_ROLE_PRIEST, grant_message = span_boldnotice("You are blessed by Carp-Sie. Wild space carp will no longer attack you.")) -// Monk's Staff - Higher block, lower damage. +// Monk's Staff - Good block, two-handed. Great for showing off. /obj/item/nullrod/bostaff name = "monk's staff" @@ -664,7 +654,7 @@ return ..() /obj/item/nullrod/bostaff/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) - if(attack_type == (PROJECTILE_ATTACK || LEAP_ATTACK || OVERWHELMING_ATTACK)) + if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK) final_block_chance = 0 //Don't bring a stick to a gunfight, and also you aren't going to really block someone full body tackling you with a stick. Or a road roller, if one happened to hit you. return ..() @@ -869,7 +859,7 @@ if(user == living_target) return - if(living_target.stat == DEAD) + if(living_target.stat == DEAD || QDELETED(living_target)) return sneak_attack(living_target, user) diff --git a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm index f521b7603ec5..f2c7ed53d40f 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm @@ -60,8 +60,6 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and 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) . = ..() @@ -79,20 +77,13 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and /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) \ - ) + AddElement(/datum/element/nullrod_core, chaplain_spawnable = FALSE, rune_remove_line = "TO DUST WITH YE!! AWAY!!") // The implant is the actual item the chappie can select 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 + AddElement(/datum/element/bane, mob_biotypes = MOB_PLANT, damage_multiplier = 0.5, requires_combat_mode = FALSE) //also good at killing plants /obj/item/vorpalscythe/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers) if(ismonkey(target) && !target.mind) //Don't empower from hitting monkeys. Hit a corgi or something, I don't know. @@ -103,6 +94,12 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and return ..() +/obj/item/vorpalscythe/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) + if(empowerment == SCYTHE_EMPOWERED) + MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, bonus_force_multiplier) + + 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) @@ -180,33 +177,15 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and //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 + if(empowerment < potential_empowerment || empowerment == potential_empowerment) //Reset the timer only if our potential empowerment is equivalent or stronger than our current empowerment allow_timer_set = TRUE + empowerment = potential_empowerment 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 bdb48c84f35d..44346103466f 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -2,7 +2,6 @@ title = JOB_CHEMIST description = "Supply the doctors with chemicals, make medicine, as well as \ less likable substances in the comfort of a fully reinforced room." - department_head = list(JOB_CHIEF_MEDICAL_OFFICER) faction = FACTION_STATION total_positions = 2 spawn_positions = 2 diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 8b24da5ab06c..b8db1d491d13 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -3,8 +3,7 @@ description = "Coordinate engineering, ensure equipment doesn't get stolen, \ make sure the Supermatter doesn't blow up, maintain telecommunications." auto_deadmin_role_flags = DEADMIN_POSITION_HEAD - department_head = list(JOB_CAPTAIN) - head_announce = list("Engineering") + head_announce = RADIO_CHANNEL_ENGINEERING faction = FACTION_STATION total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 13a9eb97515f..4cab7531da43 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -2,9 +2,8 @@ title = JOB_CHIEF_MEDICAL_OFFICER description = "Coordinate doctors and other medbay employees, ensure they \ know how to save lives, check for injuries on the crew monitor." - department_head = list(JOB_CAPTAIN) auto_deadmin_role_flags = DEADMIN_POSITION_HEAD - head_announce = list(RADIO_CHANNEL_MEDICAL) + head_announce = RADIO_CHANNEL_MEDICAL faction = FACTION_STATION total_positions = 1 spawn_positions = 1 @@ -27,7 +26,7 @@ paycheck = PAYCHECK_COMMAND paycheck_department = ACCOUNT_MED - mind_traits = list(HEAD_OF_STAFF_MIND_TRAITS) + mind_traits = list(HEAD_OF_STAFF_MIND_TRAITS, MEDICAL_MIND_TRAITS) liver_traits = list(TRAIT_MEDICAL_METABOLISM, TRAIT_ROYAL_METABOLISM) display_order = JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER @@ -66,15 +65,15 @@ ) belt = /obj/item/modular_computer/pda/heads/cmo ears = /obj/item/radio/headset/heads/cmo - shoes = /obj/item/clothing/shoes/sneakers/blue + shoes = /obj/item/clothing/shoes/sneakers/white l_pocket = /obj/item/laser_pointer/blue r_pocket = /obj/item/pinpointer/crew l_hand = /obj/item/storage/medkit/surgery - 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 + backpack = /obj/item/storage/backpack/chief_medic + satchel = /obj/item/storage/backpack/satchel/chief_medic + duffelbag = /obj/item/storage/backpack/duffelbag/chief_medic + messenger = /obj/item/storage/backpack/messenger/chief_medic 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 0d6c90b8d6a0..a28bfea710be 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -1,7 +1,6 @@ /datum/job/clown title = JOB_CLOWN description = "Entertain the crew, make bad jokes, go on a holy quest to find bananium, HONK!" - department_head = list(JOB_HEAD_OF_PERSONNEL) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 @@ -101,6 +100,5 @@ H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names)) //rename the mob AFTER they're equipped so their ID gets updated properly. H.dna.add_mutation(/datum/mutation/clumsy, MUTATION_SOURCE_CLOWN_CLUMSINESS) - var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN] - fan.show_to(H) + ADD_TRAIT(H, TRAIT_CLOWN_ENJOYER, INNATE_TRAIT) H.faction |= FACTION_CLOWN diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 0645a9cbb27f..672d2f616e59 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -1,7 +1,6 @@ /datum/job/cook title = JOB_COOK description = "Serve food, cook meat, keep the crew fed." - department_head = list(JOB_HEAD_OF_PERSONNEL) faction = FACTION_STATION total_positions = 2 spawn_positions = 2 @@ -16,6 +15,7 @@ paycheck = PAYCHECK_CREW paycheck_department = ACCOUNT_SRV + mind_traits = list(TRAIT_DESENSITIZED) // butcher liver_traits = list(TRAIT_CULINARY_METABOLISM) display_order = JOB_DISPLAY_ORDER_COOK diff --git a/code/modules/jobs/job_types/coroner.dm b/code/modules/jobs/job_types/coroner.dm index 982cb16f7483..4fe6ad3cdb2b 100644 --- a/code/modules/jobs/job_types/coroner.dm +++ b/code/modules/jobs/job_types/coroner.dm @@ -2,7 +2,6 @@ title = JOB_CORONER description = "Perform Autopsies whenever needed, \ Update medical records accordingly, apply formaldehyde." - department_head = list(JOB_CHIEF_MEDICAL_OFFICER) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 @@ -13,7 +12,7 @@ outfit = /datum/outfit/job/coroner plasmaman_outfit = /datum/outfit/plasmaman/coroner - mind_traits = list(TRAIT_MORBID) + mind_traits = list(TRAIT_MORBID, MEDICAL_MIND_TRAITS) liver_traits = list(TRAIT_CORONER_METABOLISM) paycheck = PAYCHECK_CREW diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index 1ab089b42b79..16f652dfa275 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -2,7 +2,6 @@ title = JOB_CURATOR description = "Read and write books and hand them to people, stock \ bookshelves, report on station news." - department_head = list(JOB_HEAD_OF_PERSONNEL) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm index 7a70f52ab251..e67ea5d1c5fd 100644 --- a/code/modules/jobs/job_types/cyborg.dm +++ b/code/modules/jobs/job_types/cyborg.dm @@ -19,7 +19,7 @@ /datum/job_department/silicon, ) random_spawns_possible = FALSE - job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_CANNOT_OPEN_SLOTS + job_flags = JOB_EQUIP_RANK | JOB_CANNOT_OPEN_SLOTS // DARKPACK EDIT, ORIGINAL: job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_CANNOT_OPEN_SLOTS /datum/job/cyborg/after_spawn(mob/living/spawned, client/player_client) @@ -38,3 +38,6 @@ /datum/job/cyborg/on_respawn(mob/new_character) new_character.Robotize(TRUE) + +/datum/job/cyborg/get_lobby_icon() + return icon('icons/mob/huds/hud.dmi', "hudcyborg") diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index cb987f0cc919..e56225c42a1a 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -3,7 +3,6 @@ description = "Investigate crimes, gather evidence, perform interrogations, \ look badass, smoke cigarettes." auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY - department_head = list(JOB_HEAD_OF_SECURITY) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 @@ -23,6 +22,7 @@ paycheck = PAYCHECK_CREW paycheck_department = ACCOUNT_SEC + mind_traits = list(SECURITY_MIND_TRAITS) liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_DETECTIVE diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index 2498eb7c2a38..68a178bbf55c 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -1,7 +1,6 @@ /datum/job/geneticist title = JOB_GENETICIST description = "Alter genomes, turn monkeys into humans (and vice-versa), and make DNA backups." - department_head = list(JOB_RESEARCH_DIRECTOR) faction = FACTION_STATION total_positions = 2 spawn_positions = 2 diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index 4cd19feec4f8..1136063a73c6 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -3,8 +3,7 @@ description = "Alter access on ID cards, manage the service department, \ protect Ian, run the station when the captain dies." auto_deadmin_role_flags = DEADMIN_POSITION_HEAD - department_head = list(JOB_CAPTAIN) - head_announce = list(RADIO_CHANNEL_SERVICE) + head_announce = RADIO_CHANNEL_SERVICE faction = FACTION_STATION total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index bb9f66609644..64fcb70c9fe7 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -3,8 +3,7 @@ description = "Coordinate security personnel, ensure they are not corrupt, \ make sure every department is protected." auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY - department_head = list(JOB_CAPTAIN) - head_announce = list(RADIO_CHANNEL_SECURITY) + head_announce = RADIO_CHANNEL_SECURITY faction = FACTION_STATION total_positions = 1 spawn_positions = 1 @@ -24,7 +23,7 @@ /datum/job_department/command, ) - mind_traits = list(HEAD_OF_STAFF_MIND_TRAITS) + mind_traits = list(HEAD_OF_STAFF_MIND_TRAITS, SECURITY_MIND_TRAITS) liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM, TRAIT_ROYAL_METABOLISM) paycheck = PAYCHECK_COMMAND diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index 2cf5997d32b2..7c7656d8b463 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -1,7 +1,6 @@ /datum/job/janitor title = JOB_JANITOR description = "Clean up trash and blood. Replace broken lights. Slip people over." - department_head = list(JOB_HEAD_OF_PERSONNEL) faction = FACTION_STATION total_positions = 2 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index c1cdafab00b1..7a1c8d58bc7f 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -2,7 +2,6 @@ title = JOB_LAWYER description = "Advocate for prisoners, create law-binding contracts, \ ensure Security is following protocol and Space Law." - department_head = list(JOB_HEAD_OF_PERSONNEL) faction = FACTION_STATION total_positions = 2 spawn_positions = 2 @@ -29,7 +28,6 @@ job_tone = "objection" - /datum/outfit/job/lawyer name = "Lawyer" jobtype = /datum/job/lawyer diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index ccfcbae1623e..7bc267b124b6 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -2,7 +2,6 @@ title = JOB_MEDICAL_DOCTOR description = "Save lives, run around the station looking for victims, \ scan everyone in sight" - department_head = list(JOB_CHIEF_MEDICAL_OFFICER) faction = FACTION_STATION total_positions = 6 spawn_positions = 4 @@ -16,6 +15,7 @@ paycheck = PAYCHECK_CREW paycheck_department = ACCOUNT_MED + mind_traits = list(MEDICAL_MIND_TRAITS) liver_traits = list(TRAIT_MEDICAL_METABOLISM) display_order = JOB_DISPLAY_ORDER_MEDICAL_DOCTOR @@ -60,15 +60,3 @@ box = /obj/item/storage/box/survival/medical chameleon_extras = /obj/item/gun/syringe skillchips = list(/obj/item/skillchip/entrails_reader) - -/datum/outfit/job/doctor/mod - name = "Medical Doctor (MODsuit)" - - suit_store = /obj/item/tank/internals/oxygen - back = /obj/item/mod/control/pre_equipped/medical - suit = null - head = null - uniform = /obj/item/clothing/under/rank/medical/doctor - mask = /obj/item/clothing/mask/breath/medical - r_pocket = /obj/item/flashlight/pen - internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index 50c48509dec4..7e10eac2204c 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -1,7 +1,6 @@ /datum/job/mime title = JOB_MIME description = "..." - department_head = list(JOB_HEAD_OF_PERSONNEL) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 @@ -77,8 +76,7 @@ var/datum/action/cooldown/spell/vow_of_silence/vow = new(H.mind) vow.Grant(H) - var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN] - fan.show_to(H) + ADD_TRAIT(H, TRAIT_MIME_FAN, INNATE_TRAIT) /obj/item/book/granter/action/spell/mime/mimery name = "Guide to Dank Mimery" diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index b852adacb335..85aae2f1f945 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -2,7 +2,6 @@ title = JOB_PARAMEDIC description = "Run around the station looking for patients, respond to \ emergencies, give patients a roller bed ride to medbay." - department_head = list(JOB_CHIEF_MEDICAL_OFFICER) faction = FACTION_STATION total_positions = 2 spawn_positions = 2 @@ -16,6 +15,7 @@ paycheck = PAYCHECK_CREW paycheck_department = ACCOUNT_MED + mind_traits = list(MEDICAL_MIND_TRAITS) liver_traits = list(TRAIT_MEDICAL_METABOLISM) display_order = JOB_DISPLAY_ORDER_PARAMEDIC @@ -67,3 +67,16 @@ box = /obj/item/storage/box/survival/medical chameleon_extras = /obj/item/gun/syringe pda_slot = ITEM_SLOT_LPOCKET + +/datum/outfit/job/doctor/mod + name = "Paramedic (MODsuit)" + + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/medical + suit = null + head = null + uniform = /obj/item/clothing/under/rank/medical/paramedic + mask = /obj/item/clothing/mask/breath/medical + r_pocket = /obj/item/flashlight/pen + internals_slot = ITEM_SLOT_SUITSTORE + diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm index 155b75e98cb3..8c55dfcdce06 100644 --- a/code/modules/jobs/job_types/prisoner.dm +++ b/code/modules/jobs/job_types/prisoner.dm @@ -1,7 +1,6 @@ /datum/job/prisoner title = JOB_PRISONER description = "Keep yourself occupied in permabrig." - department_head = list("The Security Team") faction = FACTION_STATION total_positions = 0 spawn_positions = 2 @@ -60,6 +59,7 @@ ears = null shoes = /obj/item/clothing/shoes/sneakers/orange box = /obj/item/storage/box/survival/prisoner + pda_slot = null /datum/outfit/job/prisoner/pre_equip(mob/living/carbon/human/H) ..() diff --git a/code/modules/jobs/job_types/psychologist.dm b/code/modules/jobs/job_types/psychologist.dm index 4a1d291c8677..e4a8bfd4418a 100644 --- a/code/modules/jobs/job_types/psychologist.dm +++ b/code/modules/jobs/job_types/psychologist.dm @@ -2,7 +2,6 @@ title = JOB_PSYCHOLOGIST description = "Advocate sanity, self-esteem, and teamwork in a station \ staffed with headcases." - department_head = list(JOB_HEAD_OF_PERSONNEL) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index 251032662bf5..962f558c602c 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -3,8 +3,7 @@ description = "Coordinate cargo technicians and shaft miners, assist with \ economical purchasing." auto_deadmin_role_flags = DEADMIN_POSITION_HEAD - department_head = list(JOB_CAPTAIN) - head_announce = list(RADIO_CHANNEL_SUPPLY) + head_announce = RADIO_CHANNEL_SUPPLY faction = FACTION_STATION total_positions = 1 spawn_positions = 1 @@ -29,7 +28,7 @@ /datum/job_department/cargo, /datum/job_department/command, ) - family_heirlooms = list(/obj/item/stamp, /obj/item/stamp/denied) + family_heirlooms = list(/obj/item/stamp/granted, /obj/item/stamp/denied) mail_goodies = list( /obj/item/circuitboard/machine/emitter = 3 ) diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index cfd5044c267b..095dd9f158b6 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -4,8 +4,7 @@ order, make sure the AI and its Cyborgs aren't rogue, replacing them if \ they are." auto_deadmin_role_flags = DEADMIN_POSITION_HEAD - department_head = list(JOB_CAPTAIN) - head_announce = list("Science") + head_announce = RADIO_CHANNEL_SCIENCE faction = FACTION_STATION total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index 7370af5d9ec4..9f91c6f22e0a 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -1,7 +1,6 @@ /datum/job/roboticist title = JOB_ROBOTICIST description = "Build and repair the AI and cyborgs, create mechs." - department_head = list(JOB_RESEARCH_DIRECTOR) faction = FACTION_STATION total_positions = 2 spawn_positions = 2 diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index 878167f25483..f76aa7f417af 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -1,7 +1,6 @@ /datum/job/scientist title = JOB_SCIENTIST description = "Do experiments, perform research, feed the slimes, make bombs." - department_head = list(JOB_RESEARCH_DIRECTOR) faction = FACTION_STATION total_positions = 5 spawn_positions = 3 diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 87bfd0b18c93..bc8dcfe16a12 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -3,7 +3,6 @@ description = "Protect company assets, follow the Standard Operating \ Procedure, eat donuts." auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY - department_head = list(JOB_HEAD_OF_SECURITY) faction = FACTION_STATION total_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() @@ -20,6 +19,7 @@ paycheck = PAYCHECK_CREW paycheck_department = ACCOUNT_SEC + mind_traits = list(SECURITY_MIND_TRAITS) liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_SECURITY_OFFICER @@ -61,7 +61,7 @@ GLOBAL_LIST_EMPTY(security_officer_distribution) /datum/job/security_officer/after_roundstart_spawn(mob/living/spawning, client/player_client) . = ..() if(ishuman(spawning)) - setup_department(spawning, player_client) + setup_department(spawning, player_client, move_to = TRUE) /datum/job/security_officer/after_latejoin_spawn(mob/living/spawning) @@ -73,7 +73,7 @@ GLOBAL_LIST_EMPTY(security_officer_distribution) /// Returns the department this mob was assigned to, if any. -/datum/job/security_officer/proc/setup_department(mob/living/carbon/human/spawning, client/player_client) +/datum/job/security_officer/proc/setup_department(mob/living/carbon/human/spawning, client/player_client, move_to = FALSE) var/department = player_client?.prefs?.read_preference(/datum/preference/choiced/security_department) if (!isnull(department)) department = get_my_department(spawning, department) @@ -131,15 +131,15 @@ GLOBAL_LIST_EMPTY(security_officer_distribution) var/spawn_point = pick(LAZYACCESS(GLOB.department_security_spawns, department)) - if(!CONFIG_GET(flag/sec_start_brig) && (destination || spawn_point)) + if(!CONFIG_GET(flag/sec_start_brig) && move_to && (destination || spawn_point)) if(spawn_point) - spawning.Move(get_turf(spawn_point)) + spawning.forceMove(get_turf(spawn_point)) else var/list/possible_turfs = get_area_turfs(destination) while (length(possible_turfs)) var/random_index = rand(1, length(possible_turfs)) var/turf/target = possible_turfs[random_index] - if (spawning.Move(target)) + if (isopenturf(target) && spawning.forceMove(target)) break possible_turfs.Cut(random_index, random_index + 1) @@ -157,7 +157,7 @@ GLOBAL_LIST_EMPTY(security_officer_distribution) department, distribution, ) - var/obj/machinery/announcement_system/announcement_system = get_announcement_system(/datum/aas_config_entry/announce_officer) + var/obj/machinery/announcement_system/announcement_system = get_announcement_system(/datum/aas_config_entry/announce_officer, null, list(RADIO_CHANNEL_SECURITY)) if (isnull(announcement_system)) return diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index d5d31743ada6..c5aa9f5affb3 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -2,7 +2,6 @@ title = JOB_SHAFT_MINER description = "Travel to strange lands. Mine ores. \ Meet strange creatures. Kill them for their gold." - department_head = list(JOB_QUARTERMASTER) faction = FACTION_STATION total_positions = 3 spawn_positions = 3 diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index 3000e4a037a5..aa71e1bb5508 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -2,7 +2,6 @@ title = JOB_STATION_ENGINEER description = "Start the Supermatter, wire the solars, repair station hull \ and wiring damage." - department_head = list(JOB_CHIEF_ENGINEER) faction = FACTION_STATION total_positions = 5 spawn_positions = 5 diff --git a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm index 5088fa87b3ae..a62f2b33200d 100644 --- a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm +++ b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm @@ -2,7 +2,6 @@ title = JOB_BRIDGE_ASSISTANT description = "Watch over the Bridge, command its consoles, and spend your days brewing coffee for higher-ups." auto_deadmin_role_flags = DEADMIN_POSITION_HEAD //not really a head but close enough - department_head = list(JOB_CAPTAIN) faction = FACTION_STATION total_positions = 0 spawn_positions = 0 @@ -32,7 +31,7 @@ ) rpg_title = "Royal Guard" allow_bureaucratic_error = FALSE - job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS | JOB_ANTAG_PROTECTED + job_flags = NONE // DARKPACK EDIT, ORIGINAL: job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS | JOB_ANTAG_PROTECTED human_authority = JOB_AUTHORITY_NON_HUMANS_ALLOWED /datum/job/bridge_assistant/after_spawn(mob/living/spawned, client/player_client) @@ -80,3 +79,4 @@ shoes = /obj/item/clothing/shoes/laceup l_pocket = /obj/item/gun/energy/e_gun/mini r_pocket = /obj/item/assembly/flash/handheld + pda_slot = ITEM_SLOT_BACK diff --git a/code/modules/jobs/job_types/station_trait/cargo_gorilla.dm b/code/modules/jobs/job_types/station_trait/cargo_gorilla.dm index c11c931a3ef9..7bb37174bf11 100644 --- a/code/modules/jobs/job_types/station_trait/cargo_gorilla.dm +++ b/code/modules/jobs/job_types/station_trait/cargo_gorilla.dm @@ -1,7 +1,6 @@ /datum/job/cargo_gorilla title = JOB_CARGO_GORILLA description = "Assist the supply department by moving freight and disposing of unwanted fruits." - department_head = list(JOB_QUARTERMASTER) faction = FACTION_STATION total_positions = 0 spawn_positions = 0 @@ -16,7 +15,7 @@ ) rpg_title = "Beast of Burden" allow_bureaucratic_error = FALSE - job_flags = STATION_TRAIT_JOB_FLAGS | JOB_ANNOUNCE_ARRIVAL | JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK |JOB_ANTAG_BLACKLISTED + job_flags = NONE // DARKPACK EDIT, ORIGINAL: job_flags = STATION_TRAIT_JOB_FLAGS | JOB_ANNOUNCE_ARRIVAL | JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK |JOB_ANTAG_BLACKLISTED /datum/job/cargo_gorilla/get_roundstart_spawn_point() if (length(GLOB.gorilla_start)) diff --git a/code/modules/jobs/job_types/station_trait/human_ai.dm b/code/modules/jobs/job_types/station_trait/human_ai.dm index 34520067e3b0..4e9ecd0af04e 100644 --- a/code/modules/jobs/job_types/station_trait/human_ai.dm +++ b/code/modules/jobs/job_types/station_trait/human_ai.dm @@ -2,7 +2,6 @@ title = JOB_HUMAN_AI description = "Assist the crew, open airlocks, follow your lawset, and coordinate your cyborgs." auto_deadmin_role_flags = DEADMIN_POSITION_SILICON - department_head = list(JOB_RESEARCH_DIRECTOR) faction = FACTION_STATION total_positions = 0 spawn_positions = 0 @@ -39,7 +38,7 @@ rpg_title = "Omnissiah" random_spawns_possible = FALSE allow_bureaucratic_error = FALSE - job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS | JOB_ANTAG_PROTECTED + job_flags = NONE // DARKPACK EDIT, ORIGINAL: job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS | JOB_ANTAG_PROTECTED human_authority = JOB_AUTHORITY_NON_HUMANS_ALLOWED //we can safely assume NT doesn't care what species AIs are made of, much less if they can't even afford an AI. /datum/job/human_ai/get_roundstart_spawn_point() @@ -163,7 +162,7 @@ /obj/item/secure_camera_console_pod/attack_self(mob/user, modifiers) . = ..() var/area/current_area = get_area(user) - var/static/list/allowed_areas = typecacheof(list(/area/station/ai_monitored/turret_protected/ai)) + var/static/list/allowed_areas = typecacheof(list(/area/station/ai/satellite/chamber)) if(!is_type_in_typecache(current_area, allowed_areas)) user.balloon_alert(user, "not in the sat!") return diff --git a/code/modules/jobs/job_types/station_trait/pun_pun.dm b/code/modules/jobs/job_types/station_trait/pun_pun.dm index b6ac7b813bff..6571c4629010 100644 --- a/code/modules/jobs/job_types/station_trait/pun_pun.dm +++ b/code/modules/jobs/job_types/station_trait/pun_pun.dm @@ -2,7 +2,6 @@ /datum/job/pun_pun title = JOB_PUN_PUN description = "Assist the service department by serving drinks and food and entertaining the crew." - department_head = list(JOB_HEAD_OF_PERSONNEL) faction = FACTION_STATION total_positions = 0 spawn_positions = 0 @@ -25,7 +24,7 @@ ) rpg_title = "Homunculus" allow_bureaucratic_error = FALSE - job_flags = (STATION_JOB_FLAGS|STATION_TRAIT_JOB_FLAGS)&~JOB_ASSIGN_QUIRKS + job_flags = NONE // DARKPACK EDIT, ORIGINAL: job_flags = (STATION_JOB_FLAGS|STATION_TRAIT_JOB_FLAGS)&~JOB_ASSIGN_QUIRKS /datum/job/pun_pun/get_spawn_mob(client/player_client, atom/spawn_point) if (!player_client) diff --git a/code/modules/jobs/job_types/station_trait/veteran_advisor.dm b/code/modules/jobs/job_types/station_trait/veteran_advisor.dm index 3172155dc967..2e188ce58b7d 100644 --- a/code/modules/jobs/job_types/station_trait/veteran_advisor.dm +++ b/code/modules/jobs/job_types/station_trait/veteran_advisor.dm @@ -3,7 +3,6 @@ description = "Advise HoS, and Captain on matters of Security. Train green Officers. \ Lay back in your wheelchair and say \"I told you\" to the HoS when all of the station collapses." auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY - department_head = list(JOB_HEAD_OF_SECURITY) faction = FACTION_STATION total_positions = 0 spawn_positions = 0 @@ -35,7 +34,7 @@ ) rpg_title = "Royal Advisor" allow_bureaucratic_error = FALSE - job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS | JOB_ANTAG_PROTECTED + job_flags = NONE // DARKPACK EDIT, ORIGINAL: job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS | JOB_ANTAG_PROTECTED /datum/job/veteran_advisor/get_default_roundstart_spawn_point() for(var/obj/effect/landmark/start/spawn_point as anything in GLOB.start_landmarks_list) @@ -83,3 +82,4 @@ r_hand = /obj/item/cane implants = list(/obj/item/implant/mindshield) + pda_slot = ITEM_SLOT_BACK diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index cc29d2afaf0b..f7869ee83608 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -4,7 +4,6 @@ their time is up, issue equipment to security, be a security officer when \ they all eventually die." auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY - department_head = list(JOB_HEAD_OF_SECURITY) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 @@ -21,6 +20,7 @@ paycheck = PAYCHECK_CREW paycheck_department = ACCOUNT_SEC + mind_traits = list(SECURITY_MIND_TRAITS) liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM, TRAIT_PRETENDER_ROYAL_METABOLISM) display_order = JOB_DISPLAY_ORDER_WARDEN diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm index 0c2731c268e7..a80ac01e4aa3 100644 --- a/code/modules/jobs/jobs.dm +++ b/code/modules/jobs/jobs.dm @@ -30,16 +30,6 @@ GLOBAL_LIST_INIT(exp_specialmap, list( )) GLOBAL_PROTECT(exp_specialmap) -//this is necessary because antags happen before job datums are handed out, but NOT before they come into existence -//so I can't simply use job datum.department_head straight from the mind datum, laaaaame. -/proc/get_department_heads(job_title) - if(!job_title) - return list() - - for(var/datum/job/job as anything in SSjob.joinable_occupations) - if(job.title == job_title) - return job.department_head //this is a list - /proc/get_full_job_name(job) var/static/regex/cap_expand = new("cap(?!tain)") var/static/regex/cmo_expand = new("cmo") diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm index a53d5b9410fd..ce4c1b4d3a73 100644 --- a/code/modules/keybindings/bindings_client.dm +++ b/code/modules/keybindings/bindings_client.dm @@ -75,7 +75,7 @@ for(var/kb_name in prefs.key_bindings_by_key[full_key]) keycount++ var/datum/keybinding/kb = GLOB.keybindings_by_name[kb_name] - if(kb.can_use(src) && kb.down(src, click_data[1]) && keycount >= MAX_COMMANDS_PER_KEY) + if(kb.can_use(src) && kb.down(src, click_data[1], click_data[2], click_data[3]) && keycount >= MAX_COMMANDS_PER_KEY) break holder?.key_down(_key, src, full_key) diff --git a/code/modules/language/_language.dm b/code/modules/language/_language.dm index c6ca1d8717d5..b18260dfcad7 100644 --- a/code/modules/language/_language.dm +++ b/code/modules/language/_language.dm @@ -71,7 +71,7 @@ var/always_use_default_namelist = FALSE /// Icon displayed in the chat window when speaking this language. /// if you are seeing someone speak popcorn language, then something is wrong. - var/icon = 'icons/ui/chat/language.dmi' + var/icon = 'modular_darkpack/master_files/icons/ui/chat/language.dmi' // DARKPACK EDIT CHANGE - LANGUAGES /// Icon state displayed in the chat window when speaking this language. var/icon_state = "unknown" @@ -92,6 +92,11 @@ */ var/list/mutual_understanding + // DARKPACK EDIT ADD START - LANGUAGES + /// If this langauge can be randomly picked or populated in common lists. + var/restricted = TRUE + // DARKPACK EDIT ADD END + // Primarily for debugging, allows for easy iteration and testing of languages. /datum/language/vv_edit_var(var_name, var_value) . = ..() @@ -195,7 +200,7 @@ SHOULD_NOT_OVERRIDE(TRUE) var/lowertext_input = LOWER_TEXT(input) // The most common words are always cached - if(GLOB.most_common_words[lowertext_input]) + if(GLOB.most_common_words_frequency[lowertext_input]) most_common_cache[lowertext_input] = scrambled_text return // Add it to cache, cutting old entries if the list is too long @@ -263,7 +268,7 @@ if(translate_prob > 0) // the probability of managing to understand a word is based on how common it is (+10%, -15%) // 1000 words in the list, so words outside the list are just treated as "the 1250th most common word" - var/commonness = GLOB.most_common_words[LOWER_TEXT(base_word)] || 1250 + var/commonness = GLOB.most_common_words_frequency[LOWER_TEXT(base_word)] || 1250 translate_prob += (10 * (1 - (min(commonness, 1250) / 500))) if(prob(translate_prob)) scrambled_words += word diff --git a/code/modules/library/bibles.dm b/code/modules/library/bibles.dm index 0478989ee518..950f2c70a5c5 100644 --- a/code/modules/library/bibles.dm +++ b/code/modules/library/bibles.dm @@ -277,7 +277,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list( if(iscarbon(target_mob)) var/mob/living/carbon/carbon_target = target_mob if(!istype(carbon_target.head, /obj/item/clothing/head/helmet)) - carbon_target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5, 60) + carbon_target.adjust_organ_loss(ORGAN_SLOT_BRAIN, 5, 60) carbon_target.balloon_alert(carbon_target, "you feel dumber!") target_mob.visible_message(span_danger("[user] beats [target_mob] over the head with [src]!"), \ span_userdanger("[user] beats [target_mob] over the head with [src]!")) diff --git a/code/modules/library/bookcase.dm b/code/modules/library/bookcase.dm index 3fa3efb70feb..373fc6aa3e5d 100644 --- a/code/modules/library/bookcase.dm +++ b/code/modules/library/bookcase.dm @@ -13,6 +13,7 @@ resistance_flags = FLAMMABLE max_integrity = 200 armor_type = /datum/armor/structure_bookcase + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 4) var/state = BOOKCASE_UNANCHORED /// When enabled, books_to_load number of random books will be generated for this bookcase var/load_random_books = FALSE @@ -22,12 +23,22 @@ var/category_prob = 25 /// How many random books to generate. var/books_to_load = 0 + //DARKPACK EDIT START - bookshelf generation + // What books we don't want to generate on not their respective bookshelves + var/restricted_categories = list( + BOOK_CATEGORY_ADULT, + BOOK_CATEGORY_KINDRED, + BOOK_CATEGORY_LUPINE, + BOOK_CATEGORY_KUEIJIN, + ) + //DARKPACK EDIT END /datum/armor/structure_bookcase fire = 50 /obj/structure/bookcase/Initialize(mapload) . = ..() + obj_flags |= UNIQUE_RENAME | RENAME_NO_DESC if(!mapload || QDELETED(src)) return // Only mapload from here on @@ -55,7 +66,7 @@ if(load_random_books) var/randomizing_categories = prob(category_prob) || random_category == BOOK_CATEGORY_RANDOM // We only need to run this special logic if we're randomizing a non-adult bookshelf - if(randomizing_categories && random_category != BOOK_CATEGORY_ADULT) + if(randomizing_categories && !(random_category in restricted_categories)) // DARKPACK EDIT CHANGE - Original : if(randomizing_categories && random_category != BOOK_CATEGORY_ADULT) // Category is manually randomized rather than using BOOK_CATEGORY_RANDOM // So we can exclude adult books in non-adult bookshelves // And also weight the prime category more heavily @@ -80,6 +91,28 @@ update_appearance() //Make sure you look proper var/area/our_area = get_area(src) + + //DARKPACK ADDITION START - Paths + // Check if we're NOT in a chantry area and roll for occult book spawn. This is so that non-Chantry Thaumaturgists can access the paths feature + if(!istype(our_area, /area/vtm/interior/chantry) && prob(15)) + // 15% chance to spawn in a bookcase thats not the library. May need balance tweaking for maps w/ more or less bookshelves. + var/occult_book_type = pick( + /obj/item/occult_book/veneficorum_artum_sanguis, + /obj/item/occult_book/das_tiefe_geheimnis, + /obj/item/path_spellbook/lure_of_flames/level1, + /obj/item/path_spellbook/lure_of_flames/level2, + /obj/item/path_spellbook/lure_of_flames/level3, + /obj/item/path_spellbook/lure_of_flames/level4, + /obj/item/path_spellbook/lure_of_flames/level5, + /obj/item/path_spellbook/levinbolt/level1, + /obj/item/path_spellbook/levinbolt/level2, + /obj/item/path_spellbook/levinbolt/level3, + /obj/item/path_spellbook/levinbolt/level4, + /obj/item/path_spellbook/levinbolt/level5) + new occult_book_type(src) + update_appearance() + //DARKPACK ADDITION END - Paths + var/area_type = our_area.type //Save me from the dark if(!SSlibrary.books_by_area[area_type]) @@ -170,17 +203,6 @@ update_appearance() return - if(IS_WRITING_UTENSIL(attacking_item)) - if(!user.can_perform_action(src) || !user.can_write(attacking_item)) - return ..() - var/newname = tgui_input_text(user, "What would you like to title this bookshelf?", "Bookshelf Renaming", max_length = MAX_NAME_LEN) - if(!user.can_perform_action(src) || !user.can_write(attacking_item)) - return ..() - if(!newname) - return - name = "bookcase ([sanitize(newname)])" - return - if(attacking_item.tool_behaviour == TOOL_CROWBAR) if(length(contents)) balloon_alert(user, "remove the books first") @@ -230,6 +252,9 @@ icon_state = "book-[clamp(amount, 0, 5)]" return ..() +/obj/structure/bookcase/nameformat(input, user) + return "bookcase[input? " ([input])" : null]" + /obj/structure/bookcase/manuals/engineering name = "engineering manuals bookcase" diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 622664816594..865f83b6f0fe 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -256,7 +256,7 @@ GLOBAL_VAR_INIT(library_table_modified, 0) #define PRINTER_COOLDOWN (6 SECONDS) #define NEWSCASTER_COOLDOWN (10 SECONDS) -#define LIBRARY_NEWSFEED "Nanotrasen Book Club" +#define LIBRARY_NEWSFEED "[CITY_NAME] Book Club" // DARKPACK EDIT CHANGE //The different states the computer can be in, only send the info we need yeah? #define LIBRARY_INVENTORY 1 #define LIBRARY_CHECKOUT 2 @@ -509,7 +509,7 @@ GLOBAL_VAR_INIT(library_table_modified, 0) say("No news network found on station. Aborting.") var/datum/feed_channel/library_channel = GLOB.news_network.network_channels_by_name[LIBRARY_NEWSFEED] if(isnull(library_channel)) - GLOB.news_network.create_feed_channel(LIBRARY_NEWSFEED, "Library", "The official station book club!", null) + GLOB.news_network.create_feed_channel(LIBRARY_NEWSFEED, "Library", "The official city book club!", null) // DARKPACK EDIT CHANGE var/obj/machinery/libraryscanner/scan = get_scanner() if(!scan) diff --git a/code/modules/library/skill_learning/generic_skillchips/acrobatics.dm b/code/modules/library/skill_learning/generic_skillchips/acrobatics.dm index 5c86d246dff9..dee9f5d53c54 100644 --- a/code/modules/library/skill_learning/generic_skillchips/acrobatics.dm +++ b/code/modules/library/skill_learning/generic_skillchips/acrobatics.dm @@ -11,7 +11,7 @@ /// set integrity to 1 when mapping for !!FUN!! max_integrity = 100 /// list of emotes whose cd is overridden by this skillchip. can be edited in mapping or ingame - var/list/affected_emotes = list("spin", "flip") + var/list/affected_emotes = list("spin", "flip", "backflip") var/datum/effect_system/spark_spread/sparks /// you can use this without lowering integrity! let's be honest. nobody's doing that var/allowed_usage = 5 @@ -100,7 +100,7 @@ bozo.adjust_confusion(15 SECONDS) bozo.set_eye_blur_if_lower(10 SECONDS) // but the rest of the effects will happen either way - bozo.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20 - get_integrity()) + bozo.adjust_organ_loss(ORGAN_SLOT_BRAIN, 20 - get_integrity()) sparks.set_up(5, cardinals_only = FALSE, location = get_turf(src)) sparks.start() diff --git a/code/modules/library/skill_learning/generic_skillchips/matrix_taunt.dm b/code/modules/library/skill_learning/generic_skillchips/matrix_taunt.dm index bcf5a4177808..c5fd9bfa5c12 100644 --- a/code/modules/library/skill_learning/generic_skillchips/matrix_taunt.dm +++ b/code/modules/library/skill_learning/generic_skillchips/matrix_taunt.dm @@ -24,7 +24,7 @@ SIGNAL_HANDLER if(key != "taunt" || !intentional) return - if((source.maxHealth - (source.getStaminaLoss() + TAUNT_STAMINA_COST)) <= source.crit_threshold) + if((source.maxHealth - (source.get_stamina_loss() + TAUNT_STAMINA_COST)) <= source.crit_threshold) source.balloon_alert(source, "too tired!") return COMPONENT_CANT_EMOTE @@ -33,7 +33,7 @@ if(HAS_TRAIT_FROM(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT)) return ADD_TRAIT(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT) - source.adjustStaminaLoss(TAUNT_STAMINA_COST) + source.adjust_stamina_loss(TAUNT_STAMINA_COST) addtimer(TRAIT_CALLBACK_REMOVE(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT), TAUNT_EMOTE_DURATION * 1.5) #undef TAUNT_STAMINA_COST diff --git a/code/modules/library/skill_learning/generic_skillchips/misc.dm b/code/modules/library/skill_learning/generic_skillchips/misc.dm index 083f67cb4a00..288b164bc63b 100644 --- a/code/modules/library/skill_learning/generic_skillchips/misc.dm +++ b/code/modules/library/skill_learning/generic_skillchips/misc.dm @@ -98,7 +98,7 @@ /obj/item/skillchip/brainwashing/on_activate(mob/living/carbon/user, silent = FALSE) to_chat(user, span_danger("You get a pounding headache as the chip sends corrupt memories into your head!")) - user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20) + user.adjust_organ_loss(ORGAN_SLOT_BRAIN, 20) . = ..() /obj/item/skillchip/chefs_kiss diff --git a/code/modules/library/skill_learning/generic_skillchips/point.dm b/code/modules/library/skill_learning/generic_skillchips/point.dm index 23971af80e01..a8270e3733af 100644 --- a/code/modules/library/skill_learning/generic_skillchips/point.dm +++ b/code/modules/library/skill_learning/generic_skillchips/point.dm @@ -72,7 +72,7 @@ build_all_button_icons(update_flags = UPDATE_BUTTON_ICON, force = TRUE) /datum/action/change_pointer_color/proc/pick_color(mob/user) - var/ncolor = input(owner, "Pick new color", "Pointer Color", arrow_color) as color|null + var/ncolor = tgui_color_picker(owner, "Pick new color", "Pointer Color", arrow_color) if(user != owner || !IsAvailable(feedback = TRUE)) return arrow_color = ncolor diff --git a/code/modules/library/skill_learning/generic_skillchips/self_surgery.dm b/code/modules/library/skill_learning/generic_skillchips/self_surgery.dm index ba17761b8b7e..52d0b0edadd6 100644 --- a/code/modules/library/skill_learning/generic_skillchips/self_surgery.dm +++ b/code/modules/library/skill_learning/generic_skillchips/self_surgery.dm @@ -12,18 +12,3 @@ /obj/item/skillchip/self_surgery/Initialize(mapload, is_removable) . = ..() ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) - -/obj/item/skillchip/self_surgery/on_activate(mob/living/carbon/user, silent) - . = ..() - RegisterSignal(user, COMSIG_LIVING_INITIATE_SURGERY_STEP, PROC_REF(apply_surgery_penalty)) - -/obj/item/skillchip/self_surgery/on_deactivate(mob/living/carbon/user, silent) - . = ..() - UnregisterSignal(user, COMSIG_LIVING_INITIATE_SURGERY_STEP) - -/obj/item/skillchip/self_surgery/proc/apply_surgery_penalty(mob/living/carbon/_source, mob/living/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, datum/surgery_step/step, list/modifiers) - SIGNAL_HANDLER - if(user != target) - return - modifiers[FAIL_PROB_INDEX] += 33 - modifiers[SPEED_MOD_INDEX] *= 1.5 diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 21676d1741e7..b671de56cfcd 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -84,6 +84,8 @@ AddElement(/datum/element/light_blocking) else RemoveElement(/datum/element/light_blocking) + // Change in opacity could change camera visibility + SScameras.update_visibility(src) /turf/set_opacity(new_opacity) . = ..() diff --git a/code/modules/loadout/categories/accessories.dm b/code/modules/loadout/categories/accessories.dm index ac32d3b274e3..41ce1495417b 100644 --- a/code/modules/loadout/categories/accessories.dm +++ b/code/modules/loadout/categories/accessories.dm @@ -1,5 +1,3 @@ -/* // DARKPACK EDIT REMOVAL START - Loadout categories -/// Accessory Items (Moves overrided items to backpack) /datum/loadout_category/accessories category_name = "Accessory" category_ui_icon = FA_ICON_VEST @@ -56,17 +54,13 @@ LAZYADD(outfit.backpack_contents, outfit.accessory) outfit.accessory = item_path -/datum/loadout_item/accessory/on_equip_item( - obj/item/clothing/accessory/equipped_item, - datum/preferences/preference_source, - list/preference_list, - mob/living/carbon/human/equipper, - visuals_only = FALSE, -) +/datum/loadout_item/accessory/on_equip_item(obj/item/equipped_item, list/item_details, mob/living/carbon/human/equipper, datum/outfit/job/outfit, visuals_only = FALSE) . = ..() - if(istype(equipped_item)) - equipped_item.above_suit = !!preference_list[item_path]?[INFO_LAYER] - . |= (ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING) + if(isnull(equipped_item)) + return . + var/obj/item/clothing/accessory/accessory_item = equipped_item + accessory_item.above_suit = !!item_details[INFO_LAYER] + return . | ITEM_SLOT_OCLOTHING | ITEM_SLOT_ICLOTHING /datum/loadout_item/accessory/maid_apron name = "Maid Apron" @@ -87,5 +81,4 @@ /datum/loadout_item/accessory/pride name = "Pride Pin" item_path = /obj/item/clothing/accessory/pride - can_be_reskinned = TRUE -*/ // DARKPACK EDIT REMOVAL END - Loadout categories + reskin_datum = /datum/atom_skin/pride_pin diff --git a/code/modules/loadout/categories/heads.dm b/code/modules/loadout/categories/heads.dm index 9b9c06015cdc..5b66ffa11bc7 100644 --- a/code/modules/loadout/categories/heads.dm +++ b/code/modules/loadout/categories/heads.dm @@ -157,3 +157,8 @@ name = "Natural Wig" item_path = /obj/item/clothing/head/wig/natural */ // DARKPACK EDIT REMOVAL END - Loadout categories + +/datum/loadout_item/head/santa + name = "Santa Hat" + item_path = /obj/item/clothing/head/costume/santa/gags + required_holiday = FESTIVE_SEASON diff --git a/code/modules/loadout/categories/neck.dm b/code/modules/loadout/categories/neck.dm index 473120cf3412..c1a41f92fdd7 100644 --- a/code/modules/loadout/categories/neck.dm +++ b/code/modules/loadout/categories/neck.dm @@ -11,7 +11,6 @@ /datum/loadout_item/neck/insert_path_into_outfit(datum/outfit/outfit, mob/living/carbon/human/equipper, visuals_only = FALSE) outfit.neck = item_path -/* // DARKPACK EDIT REMOVAL START - Loadout categories /datum/loadout_item/neck/scarf_greyscale name = "Scarf (Colorable)" item_path = /obj/item/clothing/neck/scarf @@ -39,4 +38,3 @@ /datum/loadout_item/neck/bowtie name = "Bowtie" item_path = /obj/item/clothing/neck/bowtie -*/ // DARKPACK EDIT REMOVAL END - Loadout categories diff --git a/code/modules/loadout/categories/pocket.dm b/code/modules/loadout/categories/pocket.dm index 8a5ee9928157..59d8883b1f68 100644 --- a/code/modules/loadout/categories/pocket.dm +++ b/code/modules/loadout/categories/pocket.dm @@ -3,9 +3,9 @@ category_name = "Other" category_ui_icon = FA_ICON_QUESTION type_to_generate = /datum/loadout_item/pocket_items - tab_order = /datum/loadout_category/head::tab_order + 5 + tab_order = /datum/loadout_category/head::tab_order + 11 /// How many pocket items are allowed - VAR_PRIVATE/max_allowed = 2 + VAR_PRIVATE/max_allowed = 6 // DARKPACK EDIT CHANGE - Bumped up realtivly high as it contains a few soft "required" items for gameplay /datum/loadout_category/pocket/New() . = ..() @@ -30,25 +30,17 @@ /datum/loadout_item/pocket_items abstract_type = /datum/loadout_item/pocket_items -/datum/loadout_item/pocket_items/on_equip_item( - obj/item/equipped_item, - datum/preferences/preference_source, - list/preference_list, - mob/living/carbon/human/equipper, - visuals_only = FALSE, -) +/datum/loadout_item/pocket_items/on_equip_item(obj/item/equipped_item, list/item_details, mob/living/carbon/human/equipper, datum/outfit/job/outfit, visuals_only = FALSE) // Backpack items aren't created if it's a visual equipping, so don't do any on equip stuff. It doesn't exist. if(visuals_only) return NONE return ..() -/* // DARKPACK EDIT REMOVAL START - Loadout categories - /datum/loadout_item/pocket_items/plush group = "Plushies" abstract_type = /datum/loadout_item/pocket_items/plush - can_be_named = TRUE + loadout_flags = LOADOUT_FLAG_ALLOW_NAMING /datum/loadout_item/pocket_items/plush/bee name = "Plush (Bee)" @@ -64,7 +56,7 @@ /datum/loadout_item/pocket_items/plush/lizard_random name = "Plush (Lizard, Random)" - can_be_greyscale = DONT_GREYSCALE + loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_BLOCK_GREYSCALING ui_icon = 'icons/obj/fluff/previews.dmi' ui_icon_state = "plushie_lizard_random" item_path = /obj/item/toy/plush/lizard_plushie @@ -181,19 +173,15 @@ . = ..() .[FA_ICON_PALETTE] = "Recolorable" -/datum/loadout_item/pocket_items/lipstick/on_equip_item( - obj/item/lipstick/equipped_item, - datum/preferences/preference_source, - list/preference_list, - mob/living/carbon/human/equipper, - visuals_only, -) +/datum/loadout_item/pocket_items/lipstick/on_equip_item(obj/item/equipped_item, list/item_details, mob/living/carbon/human/equipper, datum/outfit/job/outfit, visuals_only = FALSE) . = ..() - var/picked_style = style_to_style(preference_list[item_path]?[INFO_LAYER]) - var/picked_color = preference_list[item_path]?[INFO_GREYSCALE] || /obj/item/lipstick::lipstick_color - if(istype(equipped_item)) // can be null for visuals_only - equipped_item.style = picked_style - equipped_item.lipstick_color = picked_color + if(isnull(equipped_item)) + return + var/picked_style = style_to_style(item_details[INFO_LAYER]) + var/picked_color = item_details[INFO_GREYSCALE] || /obj/item/lipstick::lipstick_color + var/obj/item/lipstick/lipstick_item = equipped_item + lipstick_item.style = picked_style + lipstick_item.lipstick_color = picked_color equipper.update_lips(picked_style, picked_color) /// Converts style (readable) to style (internal) @@ -237,7 +225,7 @@ if("select_lipstick_color") var/list/their_loadout = manager.preferences.read_preference(/datum/preference/loadout) var/old_color = their_loadout?[item_path]?[INFO_GREYSCALE] || /obj/item/lipstick::lipstick_color - var/chosen = input(user, "Pick a lipstick color.", "Pick a color", old_color) as color|null + var/chosen = tgui_color_picker(user, "Pick a lipstick color.", "Pick a color", old_color) their_loadout = manager.preferences.read_preference(/datum/preference/loadout) // after sleep: sanity check if(their_loadout?[item_path]) // Validate they still have it equipped their_loadout[item_path][INFO_GREYSCALE] = chosen @@ -270,6 +258,7 @@ name = "Poster (Pinup)" item_path = /obj/item/poster/random_contraband/pinup +/* // DARKPACK EDIT REMOVAL /datum/loadout_item/pocket_items/holodisk name = "Holodisk" item_path = /obj/item/disk/holodisk @@ -277,11 +266,13 @@ /datum/loadout_item/pocket_items/mug_nt name = "Nanotrasen Mug" item_path = /obj/item/reagent_containers/cup/glass/mug/nanotrasen +*/ /datum/loadout_item/pocket_items/britcup name = "British Flag Cup" item_path = /obj/item/reagent_containers/cup/glass/mug/britcup +/* // DARKPACK EDIT REMOVAL // The wallet loadout item is special, and puts the player's ID and other small items into it on initialize (fancy!) /datum/loadout_item/pocket_items/wallet name = "Wallet" @@ -290,13 +281,7 @@ /datum/loadout_item/pocket_items/wallet/insert_path_into_outfit(datum/outfit/outfit, mob/living/carbon/human/equipper, visuals_only = FALSE) return -/datum/loadout_item/pocket_items/wallet/on_equip_item( - obj/item/equipped_item, - datum/preferences/preference_source, - list/preference_list, - mob/living/carbon/human/equipper, - visuals_only = FALSE, -) +/datum/loadout_item/pocket_items/wallet/on_equip_item(obj/item/equipped_item, list/item_details, mob/living/carbon/human/equipper, datum/outfit/job/outfit, visuals_only = FALSE) // Do this at the very end of the setup process so we can insert quirk items and such if(!visuals_only && !isdummy(equipper)) RegisterSignal(equipper, COMSIG_HUMAN_CHARACTER_SETUP_FINISHED, PROC_REF(apply_after_setup), override = TRUE) @@ -331,17 +316,10 @@ continue wallet.atom_storage.attempt_insert(thing, override = TRUE, force = STORAGE_FULLY_LOCKED, messages = FALSE) - /datum/loadout_item/pocket_items/borg_me_dogtag item_path = /obj/item/clothing/accessory/dogtag/borg_ready -/datum/loadout_item/pocket_items/borg_me_dogtag/on_equip_item( - obj/item/equipped_item, - datum/preferences/preference_source, - list/preference_list, - mob/living/carbon/human/equipper, - visuals_only = FALSE, -) +/datum/loadout_item/pocket_items/borg_me_dogtag/on_equip_item(obj/item/equipped_item, list/item_details, mob/living/carbon/human/equipper, datum/outfit/job/outfit, visuals_only) // We're hooking this datum to add an extra bit of flavor to the dogtag - a pregenerated medical record if(!visuals_only && !isdummy(equipper)) RegisterSignal(equipper, COMSIG_HUMAN_CHARACTER_SETUP_FINISHED, PROC_REF(apply_after_setup), override = TRUE) @@ -353,4 +331,8 @@ UnregisterSignal(source, COMSIG_HUMAN_CHARACTER_SETUP_FINISHED) var/datum/record/crew/record = find_record(source.real_name) record?.medical_notes += new /datum/medical_note("Central Command", "Patient is a registered brain donor for Robotics research.", null) -*/ // DARKPACK EDIT REMOVAL END - Loadout categories +*/ + +/datum/loadout_item/pocket_items/candles + name = "Box of Candles" + item_path = /obj/item/storage/fancy/candle_box diff --git a/code/modules/loadout/categories/shoes.dm b/code/modules/loadout/categories/shoes.dm index c3fe7b5d40f9..34726f2a52d8 100644 --- a/code/modules/loadout/categories/shoes.dm +++ b/code/modules/loadout/categories/shoes.dm @@ -15,7 +15,7 @@ // I can't fully untick this because of the code above, but we only need our own loadout items /* /datum/loadout_item/shoes/sneakers - name = "Sneakers (Colourable)" + name = "Sneakers" item_path = /obj/item/clothing/shoes/sneakers /datum/loadout_item/shoes/sandals_laced diff --git a/code/modules/loadout/categories/suits.dm b/code/modules/loadout/categories/suits.dm new file mode 100644 index 000000000000..0637671de377 --- /dev/null +++ b/code/modules/loadout/categories/suits.dm @@ -0,0 +1,42 @@ +/datum/loadout_category/suits + category_name = "Suits" + category_ui_icon = FA_ICON_USER_SECRET + type_to_generate = /datum/loadout_item/suit + tab_order = /datum/loadout_category/head::tab_order + 3 + +/datum/loadout_item/suit + abstract_type = /datum/loadout_item/suit + +/datum/loadout_item/suit/insert_path_into_outfit(datum/outfit/outfit, mob/living/carbon/human/equipper, visuals_only = FALSE) + if(outfit.suit) + LAZYADD(outfit.backpack_contents, outfit.suit) + if(outfit.suit_store) + if(outfit.suit_store::w_class <= WEIGHT_CLASS_NORMAL) + LAZYADD(outfit.backpack_contents, outfit.suit_store) + else if((!outfit.belt || (outfit.belt::w_class <= WEIGHT_CLASS_NORMAL)) && (outfit.suit_store::slot_flags & ITEM_SLOT_BELT)) + if(outfit.belt) + LAZYADD(outfit.backpack_contents, outfit.belt) + outfit.belt = outfit.suit_store + else if(!outfit.r_hand) + outfit.r_hand = outfit.suit_store + else if(!outfit.l_hand) + outfit.l_hand = outfit.suit_store + // no else condition - if every check failed, we just nuke whatever was there + // which is fine, suitstore generally contains replaceable items like pens, tanks, or weapons + outfit.suit_store = null + + outfit.suit = item_path + +/datum/loadout_item/suit/overall + name = "Overall" + item_path = /obj/item/clothing/suit/apron/overalls + loadout_flags = LOADOUT_FLAG_JOB_GREYSCALING + job_greyscale_palettes = list( + /datum/job/assistant = COLOR_JOB_DEFAULT, + /datum/job/botanist = /obj/item/clothing/suit/apron/overalls::greyscale_colors, + /datum/job/captain = COLOR_JOB_COMMAND_GENERIC, + /datum/job/head_of_personnel = COLOR_JOB_COMMAND_GENERIC, + /datum/job/head_of_security = COLOR_JOB_DEFAULT, + /datum/job/paramedic = "#28324b", + /datum/job/prisoner = "#ff8b00", + ) diff --git a/code/modules/loadout/loadout_categories.dm b/code/modules/loadout/loadout_categories.dm index 760d3f597986..40c3c902fe1e 100644 --- a/code/modules/loadout/loadout_categories.dm +++ b/code/modules/loadout/loadout_categories.dm @@ -57,6 +57,9 @@ var/list/formatted_list = list() for(var/datum/loadout_item/item as anything in associated_items) + if(item.is_disabled()) + continue + var/list/item_data = item.to_ui_data() UNTYPED_LIST_ADD(formatted_list, item_data) diff --git a/code/modules/loadout/loadout_helpers.dm b/code/modules/loadout/loadout_helpers.dm index f3fbda697df9..e405d26428d0 100644 --- a/code/modules/loadout/loadout_helpers.dm +++ b/code/modules/loadout/loadout_helpers.dm @@ -27,23 +27,27 @@ else CRASH("Invalid outfit passed to equip_outfit_and_loadout ([outfit])") - var/list/preference_list = preference_source.read_preference(/datum/preference/loadout) - var/list/loadout_datums = loadout_list_to_datums(preference_list) + var/list/item_details = preference_source.read_preference(/datum/preference/loadout) + var/list/loadout_datums = loadout_list_to_datums(item_details) // Slap our things into the outfit given for(var/datum/loadout_item/item as anything in loadout_datums) + if(!item.is_equippable(src, item_details?[item.item_path] || list())) + loadout_datums -= item + continue + item.insert_path_into_outfit(equipped_outfit, src, visuals_only) // Equip the outfit loadout items included if(!equipped_outfit.equip(src, visuals_only)) return FALSE // Handle any snowflake on_equips - var/list/new_contents = get_all_gear() + var/list/new_contents = get_all_gear(INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT|INCLUDE_ACCESSORIES) var/update = NONE for(var/datum/loadout_item/item as anything in loadout_datums) update |= item.on_equip_item( equipped_item = locate(item.item_path) in new_contents, - preference_source = preference_source, - preference_list = preference_list, + item_details = item_details?[item.item_path] || list(), equipper = src, + outfit = equipped_outfit, visuals_only = visuals_only, ) if(update) diff --git a/code/modules/loadout/loadout_items.dm b/code/modules/loadout/loadout_items.dm index 2400798bbeb2..673950d31aa9 100644 --- a/code/modules/loadout/loadout_items.dm +++ b/code/modules/loadout/loadout_items.dm @@ -40,17 +40,10 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) /// Title of a group that this item will be bundled under /// Defaults to parent category's title if unset var/group = null - /// Whether this item has greyscale support. - /// Only works if the item is compatible with the GAGS system of coloring. - /// Set automatically to TRUE for all items that have the flag [IS_PLAYER_COLORABLE_1]. - /// If you really want it to not be colorable set this to [DONT_GREYSCALE] - var/can_be_greyscale = FALSE - /// Whether this item can be renamed. - /// I recommend you apply this sparingly becuase it certainly can go wrong (or get reset / overridden easily) - var/can_be_named = FALSE - /// Whether this item can be reskinned. - /// Only works if the item has a "unique reskin" list set. - var/can_be_reskinned = FALSE + /// Loadout flags, see LOADOUT_FLAG_* defines + var/loadout_flags = NONE + /// If set, this item can only be selected during the holiday specified. + var/required_holiday /// The actual item path of the loadout item. var/obj/item/item_path /// Icon file (DMI) for the UI to use for preview icons. @@ -59,16 +52,30 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) /// Icon state for the UI to use for preview icons. /// Set automatically if null var/ui_icon_state - /// Reskin options of this item if it can be reskinned. - VAR_FINAL/list/cached_reskin_options + /// Base typepath to what reskin datum this item can use to reskin into + /// Doesn't verify that the item_path actually has these reskins + var/reskin_datum + /// A list of greyscale colors that are used for items that have greyscale support, but don't allow full customization. + /// This is an assoc list of /datum/job_department -> colors, or /datum/job -> colors, allowing for preset colors based on player chosen job. + /// Jobs are prioritized over departments. + /// Note: You don't need to set a color for every job or department! + var/list/job_greyscale_palettes /datum/loadout_item/New(category) src.category = category - if(can_be_greyscale == DONT_GREYSCALE) - can_be_greyscale = FALSE - else if((item_path::flags_1 & IS_PLAYER_COLORABLE_1) && item_path::greyscale_config && item_path::greyscale_colors) - can_be_greyscale = TRUE + if(!(loadout_flags & LOADOUT_FLAG_BLOCK_GREYSCALING) && is_greyscale_item()) + loadout_flags |= LOADOUT_FLAG_GREYSCALING_ALLOWED + + if(loadout_flags & LOADOUT_FLAG_JOB_GREYSCALING) + var/default_colors = SSgreyscale.ParseColorString(item_path::greyscale_colors) + var/list/final_palette = LAZYLISTDUPLICATE(job_greyscale_palettes) + switch(length(default_colors)) + if(1) + LAZYOR(final_palette, default_one_color_job_palette()) + if(2 to INFINITY) + stack_trace("[length(default_colors)] color job palettes are not implemented yet, please do so.") + job_greyscale_palettes = final_palette if(isnull(name)) name = item_path::name @@ -77,23 +84,22 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) ui_icon = item_path::icon_preview || item_path::icon ui_icon_state = item_path::icon_state_preview || item_path::icon_state - if(can_be_reskinned) - var/obj/item/dummy_item = new item_path() - if(!length(dummy_item.unique_reskin)) - can_be_reskinned = FALSE - stack_trace("Loadout item [item_path] has can_be_reskinned set to TRUE but has no unique reskins.") - else - cached_reskin_options = dummy_item.unique_reskin.Copy() - qdel(dummy_item) - /datum/loadout_item/Destroy(force, ...) - if(force) + if(!force) stack_trace("QDEL called on loadout item [type]. This shouldn't ever happen. (Use FORCE if necessary.)") return QDEL_HINT_LETMELIVE GLOB.all_loadout_datums -= item_path return ..() +/// Checks if the item is capable of being recolored / is a GAGS item. +/datum/loadout_item/proc/is_greyscale_item() + if(!(item_path::flags_1 & IS_PLAYER_COLORABLE_1)) + return FALSE + if(!item_path::greyscale_config || !item_path::greyscale_colors) + return FALSE + return TRUE + /** * Takes in an action from a loadout manager and applies it * @@ -106,15 +112,16 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) switch(action) if("select_color") - if(can_be_greyscale) + if((loadout_flags & LOADOUT_FLAG_GREYSCALING_ALLOWED) && !(loadout_flags & LOADOUT_FLAG_JOB_GREYSCALING)) return set_item_color(manager, user) if("set_name") - if(can_be_named) + if(loadout_flags & LOADOUT_FLAG_ALLOW_NAMING) return set_name(manager, user) if("set_skin") - return set_skin(manager, user, params) + if(reskin_datum) + return set_skin(manager, user, params) return TRUE @@ -192,13 +199,7 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) /// Used for reskinning an item to an alt skin. /datum/loadout_item/proc/set_skin(datum/preference_middleware/loadout/manager, mob/user, params) - if(!can_be_reskinned) - return FALSE - - var/reskin_to = params["skin"] - if(!cached_reskin_options[reskin_to]) - return FALSE - + var/reskin_to = params["skin"] // sanity checking isn't necessary because it's all checked when equipped anyways var/list/loadout = manager.preferences.read_preference(/datum/preference/loadout) if(!loadout?[item_path]) return FALSE @@ -207,6 +208,26 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) manager.preferences.update_preference(GLOB.preference_entries[/datum/preference/loadout], loadout) return TRUE // always update UI +/// When passed an outfit, attempts to select a job-appropriate color from job_greyscale_palettes +/datum/loadout_item/proc/get_job_color(datum/outfit/base_outfit) + if(!istype(base_outfit, /datum/outfit/job)) + return job_greyscale_palettes[/datum/job] // default color + + var/datum/outfit/job/job_outfit = base_outfit + var/jobtype = job_outfit.jobtype + if(job_greyscale_palettes[jobtype]) + return job_greyscale_palettes[jobtype] + + var/datum/job/job = SSjob.get_job_type(jobtype) + if(job.department_for_prefs && job_greyscale_palettes[job.department_for_prefs]) + return job_greyscale_palettes[job.department_for_prefs] + + for(var/job_dept in job.departments_list) + if(job_greyscale_palettes[job_dept]) + return job_greyscale_palettes[job_dept] + + return job_greyscale_palettes[/datum/job] // default color + /** * Place our [item_path] into the passed [outfit]. * @@ -228,41 +249,38 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) * * Arguments: * * preference_source - the datum/preferences our loadout item originated from - cannot be null + * * item_details - the details of the item in the loadout preferences, such as greyscale, name, reskin, etc * * equipper - the mob we're equipping this item onto + * * outfit - the rest of the outfit being equipped, may be null * * visuals_only - whether or not this is only concerned with visual things (not backpack, not renaming, etc) - * * preference_list - what the raw loadout list looks like in the preferences * * Return a bitflag of slot flags to update */ -/datum/loadout_item/proc/on_equip_item( - obj/item/equipped_item, - datum/preferences/preference_source, - list/preference_list, - mob/living/carbon/human/equipper, - visuals_only = FALSE, -) +/datum/loadout_item/proc/on_equip_item(obj/item/equipped_item, list/item_details, mob/living/carbon/human/equipper, datum/outfit/outfit, visuals_only = FALSE) if(isnull(equipped_item)) return NONE if(!visuals_only) ADD_TRAIT(equipped_item, TRAIT_ITEM_OBJECTIVE_BLOCKED, "Loadout") - var/list/item_details = preference_list[item_path] var/update_flag = NONE - if(can_be_greyscale && item_details?[INFO_GREYSCALE]) - equipped_item.set_greyscale(item_details[INFO_GREYSCALE]) + if((loadout_flags & LOADOUT_FLAG_GREYSCALING_ALLOWED) && ((loadout_flags & LOADOUT_FLAG_JOB_GREYSCALING) || item_details?[INFO_GREYSCALE])) + var/item_color = (loadout_flags & LOADOUT_FLAG_JOB_GREYSCALING) ? get_job_color(outfit) : item_details?[INFO_GREYSCALE] + equipped_item.set_greyscale(item_color) update_flag |= equipped_item.slot_flags - if(can_be_named && item_details?[INFO_NAMED] && !visuals_only) + if((loadout_flags & LOADOUT_FLAG_ALLOW_NAMING) && item_details?[INFO_NAMED] && !visuals_only) equipped_item.name = trim(item_details[INFO_NAMED], PREVENT_CHARACTER_TRIM_LOSS(MAX_NAME_LEN)) ADD_TRAIT(equipped_item, TRAIT_WAS_RENAMED, "Loadout") - if(can_be_reskinned && item_details?[INFO_RESKIN]) + if(reskin_datum && item_details?[INFO_RESKIN]) var/skin_chosen = item_details[INFO_RESKIN] - if(skin_chosen in equipped_item.unique_reskin) - equipped_item.current_skin = skin_chosen - equipped_item.icon_state = equipped_item.unique_reskin[skin_chosen] + for(var/datum/atom_skin/skin_path as anything in valid_subtypesof(reskin_datum)) + if(skin_path::preview_name != skin_chosen) + continue + var/datum/atom_skin/skin_instance = GLOB.atom_skins[skin_path] + skin_instance.apply(equipped_item) if(istype(equipped_item, /obj/item/clothing/accessory)) // Snowflake handing for accessories, because we need to update the thing it's attached to instead if(isclothing(equipped_item.loc)) @@ -271,11 +289,7 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) update_flag |= (ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING) else update_flag |= equipped_item.slot_flags - - else - // Not valid, update the preference - item_details -= INFO_RESKIN - preference_source.write_preference(GLOB.preference_entries[/datum/preference/loadout], preference_list) + break return update_flag @@ -304,6 +318,18 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) formatted_item["icon_state"] = ui_icon_state return formatted_item +/** + * Checks if this item is disabled and cannot be selected or granted + */ +/datum/loadout_item/proc/is_disabled() + return required_holiday && !check_holidays(required_holiday) + +/** + * Checks if this item is disabled or unequippable for the given item details. + */ +/datum/loadout_item/proc/is_equippable(mob/living/carbon/human/equipper, list/item_details) + return !is_disabled() + /** * Returns a list of information to display about this item in the loadout UI. * Icon -> tooltip displayed when its hovered over @@ -313,12 +339,15 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) // Mothblocks is hellbent on recolorable and reskinnable being only tooltips for items for visual clarity, so ask her before changing these var/list/displayed_text = list() - if(can_be_greyscale) + if((loadout_flags & LOADOUT_FLAG_GREYSCALING_ALLOWED) && !(loadout_flags & LOADOUT_FLAG_JOB_GREYSCALING)) displayed_text[FA_ICON_PALETTE] = "Recolorable" - if(can_be_reskinned) + if(reskin_datum) displayed_text[FA_ICON_SWATCHBOOK] = "Reskinnable" + if(required_holiday) + displayed_text[FA_ICON_CALENDAR_CHECK] = "Only available: [required_holiday]" + return displayed_text /** @@ -339,7 +368,7 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) var/list/button_list = list() - if(can_be_greyscale) + if((loadout_flags & LOADOUT_FLAG_GREYSCALING_ALLOWED) && !(loadout_flags & LOADOUT_FLAG_JOB_GREYSCALING)) UNTYPED_LIST_ADD(button_list, list( "label" = "Recolor", "act_key" = "select_color", @@ -347,7 +376,7 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) "active_key" = INFO_GREYSCALE, )) - if(can_be_named) + if(loadout_flags & LOADOUT_FLAG_ALLOW_NAMING) UNTYPED_LIST_ADD(button_list, list( "label" = "Rename", "act_key" = "set_name", @@ -361,16 +390,47 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) * Returns a list of options this item can be reskinned into. */ /datum/loadout_item/proc/get_reskin_options() as /list - if(!can_be_reskinned) + if(!reskin_datum) return null var/list/reskins = list() - for(var/skin in cached_reskin_options) + for(var/datum/atom_skin/skin as anything in valid_subtypesof(reskin_datum)) UNTYPED_LIST_ADD(reskins, list( - "name" = skin, - "tooltip" = skin, - "skin_icon_state" = cached_reskin_options[skin], + "name" = skin::new_name || skin::preview_name, + "tooltip" = skin::preview_name, + "skin_icon" = skin::new_icon, + "skin_icon_state" = skin::new_icon_state, )) return reskins + +/// Default job gags colors for one color gags items +/datum/loadout_item/proc/default_one_color_job_palette() + return list( + /datum/job/assistant = COLOR_JOB_ASSISTANT, + /datum/job/bitrunner = COLOR_JOB_DEFAULT, + /datum/job/botanist = COLOR_JOB_BOTANIST, + /datum/job/chemist = COLOR_JOB_CHEMIST, + /datum/job/chief_engineer = COLOR_JOB_CE, + /datum/job/chief_medical_officer = COLOR_JOB_CMO, + /datum/job/clown = COLOR_JOB_CLOWN, + /datum/job/cook = COLOR_JOB_CHEF, + /datum/job/coroner = COLOR_JOB_DEFAULT, + /datum/job/curator = COLOR_DRIED_TAN, + /datum/job/detective = COLOR_DRIED_TAN, + /datum/job/geneticist = COLOR_BLUE_GRAY, + /datum/job/janitor = COLOR_JOB_JANITOR, + /datum/job/lawyer = COLOR_JOB_LAWYER, + /datum/job/prisoner = COLOR_PRISONER_ORANGE, + /datum/job/psychologist = COLOR_DRIED_TAN, + /datum/job/roboticist = COLOR_JOB_DEFAULT, + /datum/job/shaft_miner = COLOR_DARK_BROWN, + /datum/job_department/command = COLOR_JOB_COMMAND_GENERIC, + /datum/job_department/engineering = COLOR_JOB_ENGI_GENERIC, + /datum/job_department/medical = COLOR_JOB_MED_GENERIC, + /datum/job_department/security = COLOR_JOB_SEC_GENERIC, + /datum/job_department/science = COLOR_JOB_SCI_GENERIC, + /datum/job_department/cargo = COLOR_JOB_CARGO_GENERIC, + /datum/job = COLOR_JOB_DEFAULT, // default for any job not listed above + ) diff --git a/code/modules/loadout/loadout_menu.dm b/code/modules/loadout/loadout_menu.dm index 243641faeed5..f50c4085d9da 100644 --- a/code/modules/loadout/loadout_menu.dm +++ b/code/modules/loadout/loadout_menu.dm @@ -27,7 +27,7 @@ if(params["deselect"]) deselect_item(interacted_item) - else + else if(!interacted_item.is_disabled()) select_item(interacted_item) return TRUE diff --git a/code/modules/loadout/loadout_preference.dm b/code/modules/loadout/loadout_preference.dm index c1d286bedf63..ef4a994b5530 100644 --- a/code/modules/loadout/loadout_preference.dm +++ b/code/modules/loadout/loadout_preference.dm @@ -52,6 +52,10 @@ You may want to check your loadout settings.")) continue + var/datum/loadout_item/loadout_item = GLOB.all_loadout_datums[real_path] + if(loadout_item.is_disabled()) + continue // this just falls off silently + // Set into sanitize list using converted path key var/list/data = passed_list[path] LAZYSET(sanitized_list, real_path, LAZYLISTDUPLICATE(data)) diff --git a/code/modules/lost_crew/character/job_datums.dm b/code/modules/lost_crew/character/job_datums.dm index 5b9ad43311fe..a1d1b47959e5 100644 --- a/code/modules/lost_crew/character/job_datums.dm +++ b/code/modules/lost_crew/character/job_datums.dm @@ -4,30 +4,24 @@ /datum/job/recovered_crew/doctor title = JOB_LOSTCREW_MEDICAL - department_head = list(JOB_CHIEF_MEDICAL_OFFICER) supervisors = SUPERVISOR_CMO /datum/job/recovered_crew/engineer title = JOB_LOSTCREW_ENGINEER - department_head = list(JOB_CHIEF_ENGINEER) supervisors = SUPERVISOR_CE /datum/job/recovered_crew/security title = JOB_LOSTCREW_SECURITY - department_head = list(JOB_HEAD_OF_SECURITY) supervisors = SUPERVISOR_HOS /datum/job/recovered_crew/cargo title = JOB_LOSTCREW_CARGO - department_head = list(JOB_QUARTERMASTER) supervisors = SUPERVISOR_QM /datum/job/recovered_crew/scientist title = JOB_LOSTCREW_SCIENCE - department_head = list(JOB_RESEARCH_DIRECTOR) supervisors = SUPERVISOR_RD /datum/job/recovered_crew/civillian title = JOB_LOSTCREW_CIVILLIAN - department_head = list(JOB_HEAD_OF_PERSONNEL) supervisors = SUPERVISOR_HOP diff --git a/code/modules/lost_crew/damages/_damages.dm b/code/modules/lost_crew/damages/_damages.dm index 8478e51ec71d..226d1cec473b 100644 --- a/code/modules/lost_crew/damages/_damages.dm +++ b/code/modules/lost_crew/damages/_damages.dm @@ -88,7 +88,7 @@ body_data += decay.type // Simulate bloodloss by dragging/moving - victim.blood_volume = max(victim.blood_volume - victim.bleed_drag_amount() * rand(20, 100), 0) + victim.adjust_blood_volume(-victim.bleed_drag_amount() * rand(20, 100)) set_death_date(victim) death_lore += area_lore + " " + cause_of_death.cause_of_death diff --git a/code/modules/lost_crew/lost_crew_manager.dm b/code/modules/lost_crew/lost_crew_manager.dm index 22dc887393a6..1494204ad712 100644 --- a/code/modules/lost_crew/lost_crew_manager.dm +++ b/code/modules/lost_crew/lost_crew_manager.dm @@ -82,7 +82,7 @@ GLOBAL_DATUM_INIT(lost_crew_manager, /datum/lost_crew_manager, new) owner.mind.add_antag_datum(/datum/antagonist/recovered_crew) //for tracking mostly var/datum/bank_account/bank_account = new(owner.real_name, owner.mind.assigned_role, owner.dna.species.payday_modifier) - bank_account.adjust_money(starting_funds, "[starting_funds]cr given to [owner.name] as starting fund.") + bank_account.adjust_money(starting_funds, "[starting_funds][MONEY_SYMBOL] given to [owner.name] as starting fund.") owner.account_id = bank_account.account_id bank_account.replaceable = FALSE diff --git a/code/modules/manufactorio/_manufacturing.dm b/code/modules/manufactorio/_manufacturing.dm index 5bf3093a92ce..3f5fb1919f47 100644 --- a/code/modules/manufactorio/_manufacturing.dm +++ b/code/modules/manufactorio/_manufacturing.dm @@ -16,7 +16,7 @@ /obj/machinery/power/manufacturing/Initialize(mapload) . = ..() if(may_be_moved) - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) if(anchored) connect_to_network() diff --git a/code/modules/manufactorio/machines/crusher.dm b/code/modules/manufactorio/machines/crusher.dm index ee5a61a784f1..3317141956ad 100644 --- a/code/modules/manufactorio/machines/crusher.dm +++ b/code/modules/manufactorio/machines/crusher.dm @@ -77,7 +77,7 @@ return else if(isliving(victim)) var/mob/living/poor_sap = victim - poor_sap.adjustBruteLoss(95, TRUE) + poor_sap.adjust_brute_loss(95, TRUE) if(!send_resource(poor_sap, dir)) withholding = poor_sap return diff --git a/code/modules/manufactorio/machines/lathe.dm b/code/modules/manufactorio/machines/lathe.dm index d2a4e65f677a..6a32b3ed953a 100644 --- a/code/modules/manufactorio/machines/lathe.dm +++ b/code/modules/manufactorio/machines/lathe.dm @@ -8,7 +8,7 @@ /// design id we print var/design_id ///The container to hold materials - var/datum/component/material_container/materials + var/datum/material_container/materials //looping sound for printing items var/datum/looping_sound/lathe_print/print_sound ///Designs related to the autolathe @@ -20,8 +20,8 @@ /obj/machinery/power/manufacturing/lathe/Initialize(mapload) print_sound = new(src, FALSE) - materials = AddComponent( \ - /datum/component/material_container, \ + materials = new ( \ + src, \ SSmaterials.materials_by_category[MAT_CATEGORY_ITEM_MATERIAL], \ 0, \ MATCONTAINER_EXAMINE|MATCONTAINER_NO_INSERT, \ @@ -32,6 +32,10 @@ GLOB.autounlock_techwebs[/datum/techweb/autounlocking/autolathe] = new /datum/techweb/autounlocking/autolathe stored_research = GLOB.autounlock_techwebs[/datum/techweb/autounlocking/autolathe] +/obj/machinery/power/manufacturing/lathe/Destroy() + QDEL_NULL(materials) + return ..() + /obj/machinery/power/manufacturing/lathe/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = NONE if(isnull(held_item)) diff --git a/code/modules/manufactorio/machines/storagebox.dm b/code/modules/manufactorio/machines/storagebox.dm index 408493d4a890..bd528d349b4c 100644 --- a/code/modules/manufactorio/machines/storagebox.dm +++ b/code/modules/manufactorio/machines/storagebox.dm @@ -2,6 +2,7 @@ name = "manufacturing storage unit" desc = "Its basically a box. Receives resources (if anchored). Needs a machine to take stuff out of without dumping everything out." icon_state = "box" + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 10) /// how much can we hold var/max_stuff = 16 diff --git a/code/modules/mapfluff/ruins/icemoonruin_code/mining_site.dm b/code/modules/mapfluff/ruins/icemoonruin_code/mining_site.dm index 8a37031b8184..94a5af894781 100644 --- a/code/modules/mapfluff/ruins/icemoonruin_code/mining_site.dm +++ b/code/modules/mapfluff/ruins/icemoonruin_code/mining_site.dm @@ -27,7 +27,7 @@ icon_state = "corpseminer" // Gives the minesite corpses the gutted effect so that the boss ignores them -/obj/effect/mob_spawn/corpse/human/minesite/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/corpse/human/minesite/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs) . = ..() spawned_mob.apply_status_effect(/datum/status_effect/gutted) diff --git a/code/modules/mapfluff/ruins/lavaland_ruin_code.dm b/code/modules/mapfluff/ruins/lavaland_ruin_code.dm index 18db493cf845..1e5d10beb0f2 100644 --- a/code/modules/mapfluff/ruins/lavaland_ruin_code.dm +++ b/code/modules/mapfluff/ruins/lavaland_ruin_code.dm @@ -35,6 +35,7 @@ icon_state = "shell_unfinished" desc = "The incomplete body of a golem. Add ten sheets of certain minerals to finish." w_class = WEIGHT_CLASS_BULKY + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 20) /// Amount of minerals you need to feed the shell to wake it up var/required_stacks = 10 /// Type of shell to create @@ -65,3 +66,4 @@ /obj/item/golem_shell/servant name = "incomplete servant golem shell" shell_type = /obj/effect/mob_spawn/ghost_role/human/golem/servant + custom_materials = list(/datum/material/adamantine = SHEET_MATERIAL_AMOUNT * 3) diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm index 6eeffca6d09d..acbd5e7332bc 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm @@ -31,7 +31,7 @@ var/mob/thrown_by = throwingdatum?.get_thrower() if(ismovable(hit_atom) && !caught && (!thrown_by || thrown_by && COOLDOWN_FINISHED(src, freeze_cooldown))) freeze_hit_atom(hit_atom) - if(thrown_by && !caught) + if(istype(thrown_by) && !caught) addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/movable, throw_at), thrown_by, throw_range+2, throw_speed, null, TRUE), 0.1 SECONDS) /obj/item/freeze_cube/proc/freeze_hit_atom(atom/movable/hit_atom) diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm index 418a4b8e5093..9e2c52e453f8 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm @@ -6,7 +6,7 @@ impressiveness = 18 // Carved from the bones of a massive creature, it's going to be a specticle to say the least layer = ABOVE_ALL_MOB_LAYER plane = ABOVE_GAME_PLANE - custom_materials = list(/datum/material/bone=SHEET_MATERIAL_AMOUNT*5) + custom_materials = list(/datum/material/bone= SHEET_MATERIAL_AMOUNT * 5) abstract_type = /obj/structure/statue/bone /obj/structure/statue/bone/Initialize(mapload) @@ -17,7 +17,7 @@ /obj/structure/statue/bone/rib name = "colossal rib" desc = "It's staggering to think that something this big could have lived, let alone died." - custom_materials = list(/datum/material/bone=SHEET_MATERIAL_AMOUNT*4) + custom_materials = list(/datum/material/bone=SHEET_MATERIAL_AMOUNT * 10) icon = 'icons/obj/art/statuelarge.dmi' icon_state = "rib" icon_preview = 'icons/obj/fluff/previews.dmi' @@ -26,7 +26,7 @@ /obj/structure/statue/bone/skull name = "colossal skull" desc = "The gaping maw of a dead, titanic monster." - custom_materials = list(/datum/material/bone=SHEET_MATERIAL_AMOUNT*12) + custom_materials = list(/datum/material/bone=SHEET_MATERIAL_AMOUNT * 6) icon = 'icons/obj/art/statuelarge.dmi' icon_state = "skull" icon_preview = 'icons/obj/fluff/previews.dmi' @@ -34,7 +34,7 @@ /obj/structure/statue/bone/skull/half desc = "The gaping maw of a dead, titanic monster. This one is cracked in half." - custom_materials = list(/datum/material/bone=SHEET_MATERIAL_AMOUNT*6) + custom_materials = list(/datum/material/bone=SHEET_MATERIAL_AMOUNT * 3) icon = 'icons/obj/art/statuelarge.dmi' icon_state = "skull-half" icon_preview = 'icons/obj/fluff/previews.dmi' @@ -254,16 +254,14 @@ if(!weapon.use_tool(src, user, delay = 15, volume = 40)) return TRUE + var/is_chill_with_robbing = HAS_MIND_TRAIT(user, TRAIT_MORBID) || HAS_PERSONALITY(user, /datum/personality/callous) || HAS_PERSONALITY(user, /datum/personality/misanthropic) if(opened) dug_closed = TRUE close(user) else if(open(user, force = TRUE) && affect_mood) - 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) + user.add_mood_event("graverobbing", is_chill_with_robbing ? /datum/mood_event/morbid_graverobbing : /datum/mood_event/graverobbing) if(lead_tomb && first_open) - if(HAS_MIND_TRAIT(user, TRAIT_MORBID)) + if(is_chill_with_robbing) to_chat(user, span_notice("Did someone say something? I'm sure it was nothing.")) else user.gain_trauma(/datum/brain_trauma/magic/stalker) 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 index 16b63f37b2a3..cfeeda165140 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/cursed_slot_machine.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/cursed_slot_machine.dm @@ -80,8 +80,8 @@ 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) + if(status_effect_on_roll) + user.apply_status_effect(/datum/status_effect/slot_machine_curse) SEND_SIGNAL(user, COMSIG_CURSED_SLOT_MACHINE_LOST) playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 30, TRUE) 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 706235be089f..e4af185ebb52 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm @@ -38,7 +38,7 @@ hitsound = 'sound/items/weapons/bladeslice.ogg' /obj/item/knife/envy/afterattack(atom/target, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers) - if(!istype(user) || !ishuman(target)) + if(!istype(user) || !ishuman(target) || QDELETED(target)) return var/mob/living/carbon/human/H = target diff --git a/code/modules/mapfluff/ruins/spaceruin_code/anomalyresearch.dm b/code/modules/mapfluff/ruins/spaceruin_code/anomalyresearch.dm index 8a1e4c760e96..6aaba88a89b3 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/anomalyresearch.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/anomalyresearch.dm @@ -75,7 +75,7 @@ icon = 'icons/area/areas_ruins.dmi' icon_state = "anomaly_research" requires_power = FALSE - area_flags = HIDDEN_AREA | UNIQUE_AREA + area_flags = HIDDEN_AREA default_gravity = ZERO_GRAVITY /obj/item/reagent_containers/cup/bottle/wittel diff --git a/code/modules/mapfluff/ruins/spaceruin_code/caravanambush.dm b/code/modules/mapfluff/ruins/spaceruin_code/caravanambush.dm index b765a7b4878d..22029f60a015 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/caravanambush.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/caravanambush.dm @@ -26,6 +26,8 @@ worn_icon_state = "cutters" toolspeed = 0.3 random_color = FALSE + greyscale_config = null + greyscale_colors = null /obj/item/crowbar/red/caravan icon_state = "crowbar_caravan" diff --git a/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm b/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm index 419d25d6517f..3131dce530d4 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm @@ -78,7 +78,12 @@ GLOBAL_VAR_INIT(fscpassword, generate_password()) /obj/item/disk/surgery/forgottenship name = "Advanced Surgery Disk" desc = "A disk that contains advanced surgery procedures, must be loaded into an Operating Console." - surgeries = list(/datum/surgery/advanced/lobotomy, /datum/surgery/advanced/bioware/vein_threading, /datum/surgery/advanced/bioware/nerve_splicing) + surgeries = list( + /datum/surgery_operation/organ/lobotomy, + /datum/surgery_operation/organ/lobotomy/mechanic, + /datum/surgery_operation/limb/bioware/vein_threading, + /datum/surgery_operation/limb/bioware/nerve_splicing, + ) /obj/structure/fluff/empty_sleeper/syndicate/captain icon_state = "sleeper_s-open" @@ -120,4 +125,4 @@ GLOBAL_VAR_INIT(fscpassword, generate_password()) name = "Syndicate Forgotten Vault" icon_state = "syndie-ship" ambientsounds = list('sound/ambience/engineering/ambitech2.ogg', 'sound/ambience/engineering/ambitech3.ogg') - area_flags = NOTELEPORT | UNIQUE_AREA + area_flags = NOTELEPORT diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hauntedtradingpost.dm b/code/modules/mapfluff/ruins/spaceruin_code/hauntedtradingpost.dm index 07c60c4f3804..915e5ddf00ba 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/hauntedtradingpost.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/hauntedtradingpost.dm @@ -170,6 +170,9 @@ ) AddElement(/datum/element/connect_loc, loc_connections) +/obj/machinery/button/door/invisible_tripwire/find_and_mount_on_atom(mark_for_late_init, late_init) + return //these exist independently on an turf + /obj/machinery/button/door/invisible_tripwire/post_machine_initialize() . = ..() if(!suicide_pact || isnull(SSqueuelinks.queues[suicide_pact_id])) @@ -325,7 +328,7 @@ desc = "A ballistic machine gun auto-turret with Donk Co. branding. It uses 9mm rounds." armor_type = /datum/armor/donk_turret scan_range = 6 - shot_delay = 10 + shot_delay = 1 SECONDS /datum/armor/donk_turret melee = 20 @@ -352,7 +355,7 @@ desc = "An energy gun auto-turret with Cybersun branding. It fires high-energy plasma beams that do a lot of damage, but it can be fairly slow." armor_type = /datum/armor/syndicate_shuttle scan_range = 6 - shot_delay = 50 + shot_delay = 5 SECONDS always_up = FALSE has_cover = TRUE diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm index 71a14d8a97d0..a706dcf9ca64 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm @@ -266,13 +266,13 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) desc = "Stylish dark wood with extra reinforcement. Secured firmly to the floor to prevent tampering." icon_state = "wood" footstep = FOOTSTEP_WOOD - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/indestructible/hoteltile desc = "Smooth tile with extra reinforcement. Secured firmly to the floor to prevent tampering." icon_state = "showroomfloor" footstep = FOOTSTEP_FLOOR - tiled_dirt = FALSE + tiled_turf = FALSE /turf/open/space/bluespace name = "\proper bluespace hyperzone" @@ -394,6 +394,7 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) requires_power = FALSE default_gravity = STANDARD_GRAVITY area_flags = NOTELEPORT | HIDDEN_AREA + area_flags_mapping = NONE static_lighting = TRUE ambientsounds = list('sound/ambience/ruin/servicebell.ogg') var/roomnumber = 0 @@ -482,7 +483,8 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) icon = 'icons/area/areas_ruins.dmi' icon_state = "hilbertshotel" requires_power = FALSE - area_flags = HIDDEN_AREA | NOTELEPORT | UNIQUE_AREA + area_flags = HIDDEN_AREA | NOTELEPORT + area_flags_mapping = UNIQUE_AREA default_gravity = STANDARD_GRAVITY /obj/item/abstracthotelstorage @@ -516,7 +518,7 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) name = "Hilbert Research Facility" /area/ruin/space/has_grav/powered/hilbertresearchfacility/secretroom - area_flags = UNIQUE_AREA | NOTELEPORT | HIDDEN_AREA + area_flags = NOTELEPORT | HIDDEN_AREA /obj/item/analyzer/hilbertsanalyzer name = "custom rigged analyzer" @@ -527,7 +529,7 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) /obj/item/analyzer/hilbertsanalyzer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!istype(interacting_with, /obj/item/hilbertshotel)) return ..() - if(!user.CanReach(interacting_with)) + if(!interacting_with.IsReachableBy(user)) to_chat(user, span_warning("It's to far away to scan!")) return ITEM_INTERACT_BLOCKING var/obj/item/hilbertshotel/sphere = interacting_with diff --git a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm index e4266e59c139..145a5ad667ae 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm @@ -11,7 +11,7 @@ /// Tiger cultist corpse but with an exit wound /obj/effect/mob_spawn/corpse/human/tigercultist/perforated -/obj/effect/mob_spawn/corpse/human/tigercultist/perforated/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/corpse/human/tigercultist/perforated/special(mob/living/carbon/human/spawned_human, mob/mob_possessor, apply_prefs) . = ..() var/obj/item/bodypart/chest/their_chest = spawned_human.get_bodypart(BODY_ZONE_CHEST) diff --git a/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm index 1c2173949a7e..8a002f4a8186 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm @@ -11,7 +11,7 @@ /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)) + if(istype(held_item, /obj/item/research_notes)) context[SCREENTIP_CONTEXT_LMB] = "Generate research points" return CONTEXTUAL_SCREENTIP_SET @@ -23,16 +23,17 @@ . += span_notice("Insert [EXAMINE_HINT("Research Notes")] to generate points.") -/obj/machinery/rnd/server/oldstation/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) - if(istype(attacking_item, /obj/item/research_notes) && stored_research) - var/obj/item/research_notes/research_notes = attacking_item +/obj/machinery/rnd/server/oldstation/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/research_notes) && stored_research) + var/obj/item/research_notes/research_notes = tool 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 ITEM_INTERACT_SUCCESS + 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) + advanced_surgeries = list(/datum/surgery_operation/basic/dissection) diff --git a/code/modules/mapping/access_helpers.dm b/code/modules/mapping/access_helpers.dm index c208e2eea9ea..16132ef31af0 100644 --- a/code/modules/mapping/access_helpers.dm +++ b/code/modules/mapping/access_helpers.dm @@ -185,6 +185,11 @@ access_list += list(ACCESS_MEDICAL, ACCESS_MAINT_TUNNELS) return access_list +/obj/effect/mapping_helpers/airlock/access/any/medical/paramedic/get_access() + var/list/access_list = ..() + access_list += ACCESS_PARAMEDIC + return access_list + // -------------------- Science access helpers /obj/effect/mapping_helpers/airlock/access/any/science icon_state = "access_helper_sci" @@ -510,7 +515,17 @@ /obj/effect/mapping_helpers/airlock/access/any/admin/bar/get_access() var/list/access_list = ..() - access_list += list(ACCESS_CENT_CAPTAIN) + access_list += list(ACCESS_CENT_BAR) + return access_list + +/obj/effect/mapping_helpers/airlock/access/any/admin/officer/get_access() + var/list/access_list = ..() + access_list += list(ACCESS_CENT_OFFICER) + return access_list + +/obj/effect/mapping_helpers/airlock/access/any/admin/specops/get_access() + var/list/access_list = ..() + access_list += list(ACCESS_CENT_SPECOPS) return access_list // -------------------- Req All (Requires ALL of the given accesses to open) @@ -661,6 +676,11 @@ access_list += ACCESS_PSYCHOLOGY return access_list +/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic/get_access() + var/list/access_list = ..() + access_list += ACCESS_PARAMEDIC + return access_list + // -------------------- Science access helpers /obj/effect/mapping_helpers/airlock/access/all/science icon_state = "access_helper_sci" @@ -842,6 +862,11 @@ access_list += ACCESS_VAULT return access_list +/obj/effect/mapping_helpers/airlock/access/all/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/all/syndicate icon_state = "access_helper_syn" @@ -972,3 +997,13 @@ var/list/access_list = ..() access_list += ACCESS_CENT_BAR return access_list + +/obj/effect/mapping_helpers/airlock/access/all/admin/officer/get_access() + var/list/access_list = ..() + access_list += ACCESS_CENT_OFFICER + return access_list + +/obj/effect/mapping_helpers/airlock/access/all/admin/specops/get_access() + var/list/access_list = ..() + access_list += ACCESS_CENT_SPECOPS + return access_list diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 6d0b7e58167a..66d68a7e60d8 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -238,7 +238,15 @@ /obj/effect/mapping_helpers/airlock/unres/payload(obj/machinery/door/airlock/airlock) airlock.unres_sides ^= dir - airlock.unres_sensor = TRUE + airlock.unres_latch = TRUE + +/obj/effect/mapping_helpers/airlock/unres/delayed + name = "airlock unrestricted side delayed helper" + icon_state = "airlock_unres_delayed_helper" + +/obj/effect/mapping_helpers/airlock/unres/delayed/payload(obj/machinery/door/airlock/airlock) + . = ..() + airlock.delayed_unres_open = TRUE /obj/effect/mapping_helpers/airlock/abandoned name = "airlock abandoned helper" @@ -953,7 +961,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_atoms_ontop) body_bag.insert(new_human, TRUE) body_bag.close() - body_bag.handle_tag("[new_human.real_name][new_human.dna?.species ? " - [new_human.dna.species.name]" : " - Human"]") + body_bag.tag_name = "[new_human.real_name][new_human.dna?.species ? " - [new_human.dna.species.name]" : " - Human"]" + body_bag.AddComponent(/datum/component/rename, "[initial(body_bag.name)][body_bag.tag_name? " - [body_bag.tag_name]" : null]", body_bag.desc) + body_bag.update_icon() body_bag.forceMove(morgue_tray) morgue_tray.update_appearance() diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index e5a323d07253..fcb5b445b412 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -102,7 +102,7 @@ /// Matches key formats in TMG (IE: newline after the \() var/static/regex/matches_tgm = new(@'^"[A-z]*"[\s]*=[\s]*\([\s]*\n', "m") /// Pulls out key value pairs for TGM - var/static/regex/var_edits_tgm = new(@'^\t([A-z]*) = (.*?);?$') + var/static/regex/var_edits_tgm = new(@'^\t([A-z0-9]*) = (.*?);?$') /// Pulls out model paths for DMM var/static/regex/model_path = new(@'(\/[^\{]*?(?:\{.*?\})?)(?:,|$)', "g") diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index c157636b1219..94d5dd6195c2 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -91,7 +91,7 @@ var/list/forced_ruins = list() //These go first on the z level associated (same random one by default) or if the assoc value is a turf to the specified turf. var/list/ruins_available = list() //we can try these in the current pass - if(PERFORM_ALL_TESTS(log_mapping)) + if(PERFORM_ALL_TESTS(maptest_log_mapping)) log_mapping("All ruins being loaded for map testing.") switch(mineral_budget_update) //If we use more map configurations, add another case @@ -104,7 +104,7 @@ for(var/key in ruins) var/datum/map_template/ruin/R = ruins[key] - if(PERFORM_ALL_TESTS(log_mapping)) + if(PERFORM_ALL_TESTS(maptest_log_mapping)) R.cost = 0 R.allow_duplicates = FALSE // no multiples for testing R.always_place = !R.unpickable // unpickable ruin means it spawns as a set with another ruin @@ -206,7 +206,11 @@ forced_ruins[linked] = SSmapping.get_isolated_ruin_z() - log_mapping("Successfully placed [current_pick.name] ruin.") + var/bottom_left_x = placed_turf.x - round(current_pick.width/2) + var/bottom_left_y = placed_turf.y - round(current_pick.height/2) + var/top_right_x = bottom_left_x + current_pick.width - 1 + var/top_right_y = bottom_left_y + current_pick.height - 1 + log_mapping("Successfully placed [current_pick.name] ruin ([bottom_left_x],[bottom_left_y],[placed_turf.z] to [top_right_x],[top_right_y],[placed_turf.z]).") //Update the available list for(var/datum/map_template/ruin/R in ruins_available) diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm index 9841f85ebd7e..a30eeb0b20a2 100644 --- a/code/modules/mapping/space_management/traits.dm +++ b/code/modules/mapping/space_management/traits.dm @@ -30,7 +30,7 @@ return FALSE /// Get a list of all z which have the specified trait -/datum/controller/subsystem/mapping/proc/levels_by_trait(trait) +/datum/controller/subsystem/mapping/proc/levels_by_trait(trait) as /list return z_trait_levels[trait] || list() /// Get a list of all z which have any of the specified traits diff --git a/code/modules/meteors/meteor_deflection.dm b/code/modules/meteors/meteor_deflection.dm new file mode 100644 index 000000000000..fd5ec8834590 --- /dev/null +++ b/code/modules/meteors/meteor_deflection.dm @@ -0,0 +1,71 @@ +/** + * Component for meteors and meteor imitators that handles punching them, mining them, & examining them + */ + +/datum/component/meteor_combat + ///If the parent object can give the meteor punching achievement + var/achievement_enabled + ///Callback for the parent object's deflection logic + var/datum/callback/redirection_proc + ///Callback for the parent object's destruction logic + var/datum/callback/destruction_proc + +/datum/component/meteor_combat/Initialize(datum/callback/redirection_callback, datum/callback/destruction_callback, achievement_on = FALSE) + redirection_proc = redirection_callback + destruction_proc = destruction_callback + achievement_enabled = achievement_on + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attacked)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_punched)) + +/datum/component/meteor_combat/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_ATOM_ATTACKBY) + UnregisterSignal(parent, COMSIG_ATOM_ATTACK_HAND) + +/datum/component/meteor_combat/proc/on_attacked(atom/owner, obj/item/attacking_item, mob/user, list/modifiers) + SIGNAL_HANDLER + if(attacking_item.tool_behaviour == TOOL_MINING) + destruction_proc?.Invoke() + playsound(parent, 'sound/effects/pickaxe/picaxe1.ogg', 50, TRUE) + qdel(parent) + return TRUE + + if(istype(attacking_item, /obj/item/melee/baseball_bat)) + if(user.mind?.get_skill_level(/datum/skill/athletics) < SKILL_LEVEL_EXPERT) + to_chat(user, span_warning("\The [parent] is too heavy for you!")) + return FALSE + playsound(parent, 'sound/items/baseballhit.ogg', 100, TRUE) + redirection_proc.Invoke(user) + return TRUE + + if (istype(attacking_item, /obj/item/melee/powerfist)) + var/obj/item/melee/powerfist/fist = attacking_item + if(!fist.tank) + to_chat(user, span_warning("\The [fist] has no gas tank!")) + return FALSE + var/datum/gas_mixture/gas_used = fist.tank.remove_air(fist.gas_per_fist * 3) // 3 is HIGH_PRESSURE setting on powerfist. + if(!gas_used || !molar_cmp_equals(gas_used.total_moles(), fist.gas_per_fist * 3)) + to_chat(user, span_warning("\The [fist] didn't have enough gas to budge \the [parent]!")) + return FALSE + playsound(parent, 'sound/items/weapons/resonator_blast.ogg', 50, TRUE) + redirection_proc.Invoke(user) + return TRUE + + return FALSE + +/datum/component/meteor_combat/proc/on_punched(atom/owner, mob/user, list/modifiers) + SIGNAL_HANDLER + if(!isliving(user)) + return FALSE + var/mob/living/livinguser = user + + if(livinguser.combat_mode && livinguser.mind?.get_skill_level(/datum/skill/athletics) >= SKILL_LEVEL_LEGENDARY) + check_punch_award(livinguser) + playsound(parent, SFX_PUNCH, 50, TRUE) + redirection_proc.Invoke(livinguser) + return TRUE + + return FALSE + +/datum/component/meteor_combat/proc/check_punch_award(mob/user) + if(achievement_enabled && !(astype(parent, /atom).flags_1 & ADMIN_SPAWNED_1) && isliving(user)) + user.client.give_award(/datum/award/achievement/misc/meteor_punch, user) diff --git a/code/modules/meteors/meteor_types.dm b/code/modules/meteors/meteor_types.dm index f632717000ff..ac2686b38e60 100644 --- a/code/modules/meteors/meteor_types.dm +++ b/code/modules/meteors/meteor_types.dm @@ -42,6 +42,12 @@ SSaugury.register_doom(src, threat) SpinAnimation() chase_target(target) + AddComponent( + /datum/component/meteor_combat, \ + CALLBACK(src, PROC_REF(redirect)), \ + CALLBACK(src, PROC_REF(make_debris)), \ + achievement_on = !istype(src, /obj/effect/meteor/sand), \ + ) /obj/effect/meteor/Destroy() GLOB.meteor_list -= src @@ -84,7 +90,8 @@ /obj/effect/meteor/proc/on_loop_stopped(datum/source) SIGNAL_HANDLER - qdel(src) + if(!move_packet || !length(move_packet.existing_loops)) + qdel(src) ///Deals with what happens when we stop moving, IE we die /obj/effect/meteor/proc/moved_off_z() @@ -116,14 +123,14 @@ /obj/effect/meteor/examine(mob/user) . = ..() + if((user.mind?.get_skill_level(/datum/skill/athletics) >= SKILL_LEVEL_LEGENDARY)) + . += span_notice("On second thought, it doesn't look too tough.") check_examine_award(user) -/obj/effect/meteor/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) - if(I.tool_behaviour == TOOL_MINING) - make_debris() - qdel(src) - else - . = ..() +///Called by component/meteor_combat to send us moving to the edge of the map away from whoever punched us +/obj/effect/meteor/proc/redirect(mob/athlete) + dest = spaceDebrisStartLoc(get_cardinal_dir(athlete, src), z) + chase_target(dest) /obj/effect/meteor/proc/make_debris() for(var/throws = dropamt, throws > 0, throws--) @@ -159,6 +166,7 @@ if(!(flags_1 & ADMIN_SPAWNED_1) && isliving(user)) user.client.give_award(/datum/award/achievement/misc/meteor_examine, user) + /** * Handles the meteor's interaction with meteor shields. * @@ -376,7 +384,7 @@ /obj/effect/meteor/emp/meteor_effect() ..() playsound(src, 'sound/items/weapons/zapbang.ogg', 100, TRUE, -1) - empulse(src, 3, 8) + empulse(src, 3, 8, emp_source = src) //Meaty Ore /obj/effect/meteor/meaty diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm deleted file mode 100644 index bbec54ed3561..000000000000 --- a/code/modules/mining/abandoned_crates.dm +++ /dev/null @@ -1,261 +0,0 @@ -//Originally coded by ISaidNo, later modified by Kelenius. Ported from Baystation12. - -/obj/structure/closet/crate/secure/loot - name = "abandoned crate" - desc = "What could be inside?" - icon_state = "securecrate" - base_icon_state = "securecrate" - integrity_failure = 0 //no breaking open the crate - var/code = null - var/lastattempt = null - var/attempts = 10 - var/codelen = 4 - var/qdel_on_open = FALSE - var/spawned_loot = FALSE - tamperproof = 90 - - // Stop people from "diving into" the crate accidentally, and then detonating it. - divable = FALSE - -/obj/structure/closet/crate/secure/loot/Initialize(mapload) - . = ..() - var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0") - code = "" - for(var/i in 1 to codelen) - var/dig = pick(digits) - code += dig - digits -= dig //there are never matching digits in the answer - -//ATTACK HAND IGNORING PARENT RETURN VALUE -/obj/structure/closet/crate/secure/loot/attack_hand(mob/user, list/modifiers) - if(locked) - to_chat(user, span_notice("The crate is locked with a Deca-code lock.")) - var/input = input(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "") as text|null - if(user.can_perform_action(src) && locked) - var/list/sanitised = list() - var/sanitycheck = TRUE - var/char = "" - var/length_input = length(input) - for(var/i = 1, i <= length_input, i += length(char)) //put the guess into a list - char = input[i] - if(!(char >= "0" && char <= "9")) - sanitycheck = FALSE //if a non-digit is found, reject the input - sanitised += text2num(char) - for(var/i in 1 to length(sanitised) - 1) //compare each digit in the guess to all those following it - for(var/j in i + 1 to length(sanitised)) - if(sanitised[i] == sanitised[j]) - sanitycheck = FALSE //if a digit is repeated, reject the input - if(input == code) - if(!spawned_loot) - spawn_loot() - tamperproof = 0 // set explosion chance to zero, so we dont accidently hit it with a multitool and instantly die - togglelock(user) - else if(!input || !sanitycheck || length(sanitised) != codelen) - to_chat(user, span_notice("You leave the crate alone.")) - else - to_chat(user, span_warning("A red light flashes.")) - lastattempt = input - attempts-- - if(attempts == 0) - boom(user) - return - - return ..() - -/obj/structure/closet/crate/secure/loot/click_alt(mob/living/user) - attack_hand(user) //this helps you not blow up so easily by overriding unlocking which results in an immediate boom. - return CLICK_ACTION_SUCCESS - -/obj/structure/closet/crate/secure/loot/attackby(obj/item/W, mob/user) - if(locked) - if(W.tool_behaviour == TOOL_MULTITOOL) - to_chat(user, span_notice("DECA-CODE LOCK REPORT:")) - if(attempts == 1) - to_chat(user, span_warning("* Anti-Tamper Bomb will activate on next failed access attempt.")) - else - to_chat(user, span_notice("* Anti-Tamper Bomb will activate after [attempts] failed access attempts.")) - if(lastattempt != null) - var/bulls = 0 //right position, right number - var/cows = 0 //wrong position but in the puzzle - - var/lastattempt_char = "" - var/length_lastattempt = length(lastattempt) - var/lastattempt_it = 1 - - var/code_char = "" - var/length_code = length(code) - var/code_it = 1 - - while(lastattempt_it <= length_lastattempt && code_it <= length_code) // Go through list and count matches - lastattempt_char = lastattempt[lastattempt_it] - code_char = code[code_it] - if(lastattempt_char == code_char) - ++bulls - else if(findtext(code, lastattempt_char)) - ++cows - - lastattempt_it += length(lastattempt_char) - code_it += length(code_char) - - to_chat(user, span_notice("Last code attempt, [lastattempt], had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions.")) - return - return ..() - -/obj/structure/closet/crate/secure/loot/emag_act(mob/user, obj/item/card/emag/emag_card) - . = ..() - - if(locked) - 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) - . = ..() //Run the normal code. - if(locked) //Double check if the crate actually locked itself when the normal code ran. - //reset the anti-tampering, number of attempts and last attempt when the lock is re-enabled. - tamperproof = initial(tamperproof) - attempts = initial(attempts) - lastattempt = null - return - if(tamperproof) - return - return ..() - -/obj/structure/closet/crate/secure/loot/atom_deconstruct(disassembled = TRUE) - if(locked) - boom() - return - return ..() - -/obj/structure/closet/crate/secure/loot/after_open(mob/living/user, force) - . = ..() - if(qdel_on_open) - qdel(src) - -/obj/structure/closet/crate/secure/loot/proc/spawn_loot() - var/loot = rand(1,100) //100 different crates with varying chances of spawning - switch(loot) - if(1 to 5) //5% chance - new /obj/item/reagent_containers/cup/glass/bottle/rum(src) - new /obj/item/reagent_containers/cup/glass/bottle/whiskey(src) - new /obj/item/reagent_containers/cup/glass/bottle/whiskey(src) - new /obj/item/lighter(src) - new /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium(src) - for(var/i in 1 to 3) - new /obj/item/cigarette/rollie(src) - if(6 to 10) - new /obj/item/melee/skateboard/pro(src) - if(11 to 15) - new /mob/living/basic/bot/honkbot(src) - if(16 to 20) - new /obj/item/stack/ore/diamond(src, 10) - if(21 to 25) - for(var/i in 1 to 5) - new /obj/item/poster/random_contraband(src) - if(26 to 30) - new /obj/item/vending_refill/sovietsoda(src) - var/obj/item/circuitboard/machine/vendor/board = new (src) - board.set_type(/obj/machinery/vending/sovietsoda) - if(31 to 35) - new /obj/item/seeds/firelemon(src) - if(36 to 40) - for(var/i in 1 to 5) - new /obj/item/toy/snappop/phoenix(src) - if(41 to 45) - new /obj/item/modular_computer/pda/clear(src) - if(46 to 50) - new /obj/item/storage/box/syndie_kit/chameleon/broken - if(51 to 52) // 2% chance - new /obj/item/melee/baton(src) - if(53 to 54) - new /obj/item/toy/balloon/corgi(src) - if(55 to 56) - var/newitem = pick(subtypesof(/obj/item/toy/mecha)) - new newitem(src) - if(57 to 58) - new /obj/item/toy/balloon/syndicate(src) - if(59 to 60) - new /obj/item/borg/upgrade/modkit/aoe/mobs(src) - new /obj/item/clothing/suit/space(src) - new /obj/item/clothing/head/helmet/space(src) - if(61 to 62) - for(var/i in 1 to 5) - new /obj/item/clothing/head/costume/kitty(src) - new /obj/item/clothing/neck/petcollar(src) - if(63 to 64) - new /obj/item/clothing/shoes/kindle_kicks(src) - if(65 to 66) - new /obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian(src) - new /obj/item/clothing/suit/hooded/ian_costume(src) - if(67 to 68) - var/obj/item/gibtonite/free_bomb = new /obj/item/gibtonite(src) - free_bomb.quality = rand(GIBTONITE_QUALITY_LOW, GIBTONITE_QUALITY_HIGH) - 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) - new /obj/item/toy/plush/snakeplushie(src) - if(73 to 74) - new /mob/living/basic/pet/gondola(src) - if(75 to 76) - new /obj/item/bikehorn/airhorn(src) - if(77 to 78) - new /obj/item/toy/plush/lizard_plushie(src) - if(79 to 80) - new /obj/item/stack/sheet/mineral/bananium(src, 10) - if(81 to 82) - new /obj/item/bikehorn/airhorn(src) - if(83 to 84) - new /obj/item/toy/plush/beeplushie(src) - if(85 to 86) - new /obj/item/defibrillator/compact(src) - if(87) //1% chance - var/list/cannabis_seeds = typesof(/obj/item/seeds/cannabis) - var/list/cannabis_plants = typesof(/obj/item/food/grown/cannabis) - for(var/i in 1 to rand(2, 4)) - var/seed_type = pick(cannabis_seeds) - new seed_type(src) - for(var/i in 1 to rand(2, 4)) - var/cannabis_type = pick(cannabis_plants) - new cannabis_type(src) - if(88) - new /obj/item/reagent_containers/cup/glass/bottle/lizardwine(src) - if(89) - new /obj/item/melee/energy/sword/bananium(src) - if(90) - new /obj/item/dnainjector/wackymut(src) - if(91) - for(var/i in 1 to 30) - new /mob/living/basic/cockroach/bloodroach(src) - if(92) - new /obj/item/katana(src) - if(93) - new /obj/item/dnainjector/xraymut(src) - if(94) - new /mob/living/basic/mimic/crate(src) - qdel_on_open = TRUE - if(95) - new /obj/item/toy/plush/nukeplushie(src) - if(96) - new /obj/item/banhammer(src) - for(var/i in 1 to 3) - var/obj/effect/mine/sound/bwoink/mine = new (src) - mine.set_anchored(FALSE) - mine.move_resist = MOVE_RESIST_DEFAULT - if(97) - for(var/i in 1 to 4) - new /obj/item/clothing/mask/balaclava(src) - new /obj/item/gun/ballistic/shotgun/toy(src) - new /obj/item/gun/ballistic/automatic/pistol/toy(src) - new /obj/item/gun/ballistic/automatic/toy(src) - new /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted(src) - new /obj/item/ammo_box/foambox(src) - if(98) - for(var/i in 1 to 3) - new /mob/living/basic/bee/toxin(src) - if(99) - new /obj/item/implanter/sad_trombone(src) - if(100) - new /obj/item/melee/skateboard/hoverboard(src) - spawned_loot = TRUE diff --git a/code/modules/mining/boulder_processing/_boulder_processing.dm b/code/modules/mining/boulder_processing/_boulder_processing.dm index 28d8f9b6ea46..39cc7266b65c 100644 --- a/code/modules/mining/boulder_processing/_boulder_processing.dm +++ b/code/modules/mining/boulder_processing/_boulder_processing.dm @@ -16,7 +16,7 @@ /// What sound plays when a thing operates? var/usage_sound = 'sound/machines/mining/wooping_teleport.ogg' /// Silo link to its materials list. - var/datum/component/remote_materials/silo_materials + var/datum/remote_materials/silo_materials /// Mining points held by the machine for miners. var/points_held = 0 ///The action verb to display to players @@ -30,8 +30,8 @@ /obj/machinery/bouldertech/Initialize(mapload) . = ..() - silo_materials = AddComponent( - /datum/component/remote_materials, \ + silo_materials = new ( + src, \ mapload, \ mat_container_flags = MATCONTAINER_NO_INSERT \ ) @@ -46,7 +46,7 @@ AddElement(/datum/element/connect_loc, loc_connections) /obj/machinery/bouldertech/Destroy() - silo_materials = null + QDEL_NULL(silo_materials) return ..() /obj/machinery/bouldertech/on_deconstruction(disassembled) @@ -103,6 +103,8 @@ /obj/machinery/bouldertech/CanAllowThrough(atom/movable/mover, border_dir) if(!anchored) return FALSE + if(istype(mover, /obj/item/stack/sheet)) + return TRUE if(istype(mover, /obj/item/boulder)) return can_process_boulder(mover) if(isgolem(mover)) @@ -350,8 +352,8 @@ rejected_mats[possible_mat] = quantity continue points_held = round(points_held + (quantity * possible_mat.points_per_unit * MINING_POINT_MACHINE_MULTIPLIER)) // put point total here into machine - if(!silo_materials.mat_container.insert_amount_mat(quantity, possible_mat)) - rejected_mats[possible_mat] = quantity + if(isnull(silo_materials.silo) || !silo_materials.mat_container.insert_amount_mat(quantity, possible_mat)) + new possible_mat.sheet_type(drop_location(), floor(quantity / SHEET_MATERIAL_AMOUNT)) //puts back materials that couldn't be processed chosen_boulder.set_custom_materials(rejected_mats, refining_efficiency) diff --git a/code/modules/mining/boulder_processing/boulder.dm b/code/modules/mining/boulder_processing/boulder.dm index 6ffddb8e5cd2..94435f233d77 100644 --- a/code/modules/mining/boulder_processing/boulder.dm +++ b/code/modules/mining/boulder_processing/boulder.dm @@ -114,7 +114,7 @@ /obj/item/boulder/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) . = ..() if(istype(interacting_with, /turf/open/lava)) - if(!create_platform(interacting_with, user, interacting_with)) + if(!create_platform(interacting_with, user, null)) return ITEM_INTERACT_BLOCKING return ITEM_INTERACT_SUCCESS @@ -124,17 +124,23 @@ if(!create_platform(target, thrower)) return FALSE -/obj/item/boulder/proc/create_platform(atom/interacting_with, mob/living/user) +/obj/item/boulder/proc/create_platform(atom/interacting_with, mob/living/user, timer_override = null) if(locate(/obj/structure/lattice/catwalk/boulder, interacting_with)) - to_chat(user, span_warning("There is already a boulder platform here!")) - return FALSE + if(user) + to_chat(user, span_warning("There is already a boulder platform here!")) + return null + + var/active_platform_lifespan = platform_lifespan //Default to the assigned value. + if(timer_override) + active_platform_lifespan = timer_override var/obj/structure/lattice/catwalk/boulder/platform = new(interacting_with) - addtimer(CALLBACK(platform, TYPE_PROC_REF(/obj/structure/lattice/catwalk/boulder, pre_self_destruct)), platform_lifespan) + addtimer(CALLBACK(platform, TYPE_PROC_REF(/obj/structure/lattice/catwalk/boulder, pre_self_destruct)), active_platform_lifespan) // See Lattice.dm for more info visible_message(span_notice("\The [src] floats on \the [interacting_with], forming a temporary platform!")) qdel(src) - return TRUE + return platform + /** * This is called when a boulder is processed by a mob or tool, and reduces the durability of the boulder. * @param obj/item/weapon The weapon that is being used to process the boulder, that we pull toolspeed from. If null, we use the override_speed_multiplier instead. diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index 4c3a9cb529bc..e3b92dda982c 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -194,6 +194,7 @@ heat_protection = CHEST|GROIN|LEGS|FEET|ARMS max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 6) /obj/item/clothing/suit/armor/bone/Initialize(mapload) . = ..() @@ -214,6 +215,7 @@ max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT armor_type = /datum/armor/hooded_explorer resistance_flags = FIRE_PROOF + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 4) /obj/item/clothing/head/helmet/skull/Initialize(mapload) . = ..() diff --git a/code/modules/mining/equipment/grapple_gun.dm b/code/modules/mining/equipment/grapple_gun.dm index 99144d84867c..226417065f96 100644 --- a/code/modules/mining/equipment/grapple_gun.dm +++ b/code/modules/mining/equipment/grapple_gun.dm @@ -61,7 +61,7 @@ attacked_atom = singular_turf break - if(user.CanReach(attacked_atom)) + if(attacked_atom.IsReachableBy(user)) return ITEM_INTERACT_BLOCKING var/atom/bullet = fire_projectile(/obj/projectile/grapple_hook, attacked_atom, 'sound/items/weapons/zipline_fire.ogg') @@ -84,7 +84,7 @@ /obj/item/grapple_gun/proc/on_grapple_hit(datum/source, atom/movable/firer, atom/target, Angle) SIGNAL_HANDLER - UnregisterSignal(source, list(COMSIG_PROJECTILE_ON_HIT, COMSIG_PREQDELETED)) + UnregisterSignal(source, list(COMSIG_PROJECTILE_SELF_ON_HIT, COMSIG_PREQDELETED)) QDEL_NULL(zipline) var/mob/living/user = zipliner?.resolve() if(isnull(user) || isnull(target)) diff --git a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm index 4a0069660f25..55533341d895 100644 --- a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm @@ -12,6 +12,7 @@ suicidal miners against local fauna." icon = 'icons/obj/mining.dmi' icon_state = "crusher" + base_icon_state = "crusher" inhand_icon_state = "crusher0" icon_angle = -45 lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi' @@ -56,25 +57,43 @@ var/detonation_damage = 50 /// Damage that the mark additionally does when hit by the crusher via backstab var/backstab_bonus = 30 - /// Used by retool kits when changing the crusher's appearance - var/current_inhand_icon_state = "crusher" /// The file in which our projectile icon resides var/projectile_icon = 'icons/obj/weapons/guns/projectiles.dmi' /// Used by retool kits when changing the crusher's projectile sprite var/projectile_icon_state = "pulse1" /// Wielded damage we deal, aka our "real" damage var/force_wielded = 20 + /// Set to TRUE if the last projectile fired was point-blank at a living target + var/last_projectile_pb = FALSE /obj/item/kinetic_crusher/Initialize(mapload) . = ..() - AddComponent(/datum/component/butchering, \ + AddComponent( \ + /datum/component/butchering, \ speed = 6 SECONDS, \ effectiveness = 110, \ ) + update_reskin(null) //technically it's huge and bulky, but this provides an incentive to use it update_wielding() register_context() +/** + * Adds or updates the reskinning component on the crusher. + * + * * default_skin_typepath: The typepath of skin to apply by default. + * Passing null will either not apply a skin or will reset it to default if one is already applied. + * If a supplied skin is blacklisted, it will be un-blacklisted. + */ +/obj/item/kinetic_crusher/proc/update_reskin(datum/atom_skin/crusher_skin/default_skin_typepath) + AddComponent( \ + /datum/component/reskinable_item, \ + /datum/atom_skin/crusher_skin, \ + infinite = TRUE, \ + initial_skin = default_skin_typepath ? default_skin_typepath::preview_name : null, \ + blacklisted_subtypes = subtypesof(/datum/atom_skin/crusher_skin/locked) - default_skin_typepath, \ + ) + /obj/item/kinetic_crusher/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() if(!held_item) @@ -208,6 +227,14 @@ SEND_SIGNAL(user, COMSIG_LIVING_CRUSHER_DETONATE, target, src, backstabbed) target.apply_damage(combined_damage, BRUTE, blocked = def_check) +/obj/item/kinetic_crusher/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!istype(interacting_with, /obj/item/crusher_trophy)) + return NONE + var/obj/item/crusher_trophy/new_trophy = interacting_with + if(new_trophy.add_to(src, user)) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING + /obj/item/kinetic_crusher/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) if(!HAS_TRAIT(src, TRAIT_WIELDED)) balloon_alert(user, "wield it first!") @@ -228,6 +255,7 @@ var/turf/proj_turf = user.loc if(!isturf(proj_turf)) return + last_projectile_pb = get_dist(target, user) <= 1 && isliving(target) var/obj/projectile/destabilizer/destabilizer = new(proj_turf) SEND_SIGNAL(src, COMSIG_CRUSHER_FIRED_BLAST, target, user, destabilizer) destabilizer.icon = projectile_icon @@ -273,7 +301,7 @@ return TRUE /obj/item/kinetic_crusher/update_icon_state() - inhand_icon_state = "[current_inhand_icon_state][HAS_TRAIT(src, TRAIT_WIELDED)]" // this is not icon_state and not supported by 2hcomponent + inhand_icon_state = "[base_icon_state][HAS_TRAIT(src, TRAIT_WIELDED)]" // this is not icon_state and not supported by 2hcomponent return ..() /obj/item/kinetic_crusher/update_overlays() diff --git a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher_trophies.dm b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher_trophies.dm index 0a3e49843ded..c2aee5147221 100644 --- a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher_trophies.dm +++ b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher_trophies.dm @@ -25,11 +25,6 @@ SHOULD_CALL_PARENT(FALSE) return "errors" -/obj/item/crusher_trophy/attackby(obj/item/attacking_item, mob/living/user) - if(!istype(attacking_item, /obj/item/kinetic_crusher)) - return ..() - add_to(attacking_item, user) - /// Tries to add the trophy to our crusher /obj/item/crusher_trophy/proc/add_to(obj/item/kinetic_crusher/crusher, mob/living/user) for(var/obj/item/crusher_trophy/trophy as anything in crusher.trophies) diff --git a/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm b/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm index 4799c04ab24d..5c69886c3711 100644 --- a/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm +++ b/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm @@ -35,7 +35,7 @@ playsound(living_target, 'sound/effects/magic/fireball.ogg', 20, TRUE) new /obj/effect/temp_visual/fire(living_target.loc) addtimer(CALLBACK(src, PROC_REF(pushback), living_target, user), 1) //no free backstabs, we push AFTER module stuff is done - living_target.adjustFireLoss(bonus_value, forced = TRUE) + living_target.adjust_fire_loss(bonus_value, forced = TRUE) /obj/item/crusher_trophy/tail_spike/proc/pushback(mob/living/target, mob/living/user) if(!QDELETED(target) && !QDELETED(user) && (!target.anchored || ismegafauna(target))) //megafauna will always be pushed diff --git a/code/modules/mining/equipment/kinetic_crusher/trophies_misc.dm b/code/modules/mining/equipment/kinetic_crusher/trophies_misc.dm index c4ff738b9cb1..dca037e37cd3 100644 --- a/code/modules/mining/equipment/kinetic_crusher/trophies_misc.dm +++ b/code/modules/mining/equipment/kinetic_crusher/trophies_misc.dm @@ -1,164 +1,95 @@ -/*! - * Contains crusher trophies that are not obtained from fauna - */ -/// Cosmetic items for changing the crusher's look -/obj/item/crusher_trophy/retool_kit - name = "crusher retool kit" - desc = "A toolkit for changing the crusher's appearance without affecting the device's function." - icon = 'icons/obj/mining.dmi' - icon_state = "retool_kit" - denied_type = /obj/item/crusher_trophy/retool_kit - - /// Currently picked crusher reskin - var/datum/crusher_skin/active_skin = /datum/crusher_skin/sword - /// If this kit forces some specific skin, or can pick between subtypes - var/forced_skin - -/obj/item/crusher_trophy/retool_kit/Destroy(force) - if (istype(active_skin)) - QDEL_NULL(active_skin) - return ..() - -/obj/item/crusher_trophy/retool_kit/effect_desc() - return "the crusher to have the appearance of \a [active_skin::name]" - -/obj/item/crusher_trophy/retool_kit/add_to(obj/item/kinetic_crusher/pkc, mob/user) - if (!forced_skin) - var/list/choices = list() - for (var/datum/crusher_skin/skin as anything in subtypesof(/datum/crusher_skin)) - if (skin::normal_skin) - choices[skin] = icon(skin::retool_icon || 'icons/obj/mining.dmi', skin::retool_icon_state) - var/datum/crusher_skin/chosen_skin = show_radial_menu(user, src, choices, tooltips = TRUE, require_near = TRUE) - if (!chosen_skin) - return - active_skin = chosen_skin - else - active_skin = forced_skin - . = ..() - if(!.) - return - active_skin = new active_skin(pkc) - if (active_skin.retool_icon) - pkc.icon = active_skin.retool_icon - pkc.icon_state = active_skin.retool_icon_state - pkc.current_inhand_icon_state = active_skin.retool_inhand_icon - if (active_skin.retool_projectile_icon) - pkc.projectile_icon = active_skin.retool_projectile_icon - if (active_skin.retool_projectile_icon_state) - pkc.projectile_icon_state = active_skin.retool_projectile_icon_state - // Should either have both, or neither - if (active_skin.retool_lefthand_file) - pkc.lefthand_file = active_skin.retool_lefthand_file - pkc.righthand_file = active_skin.retool_righthand_file - if(active_skin.retool_worn_file) - pkc.worn_icon = active_skin.retool_worn_file - pkc.worn_icon_state = active_skin::retool_icon_state - if (active_skin.retool_inhand_x) - pkc.inhand_x_dimension = active_skin.retool_inhand_x - if (active_skin.retool_inhand_y) - pkc.inhand_y_dimension = active_skin.retool_inhand_y - pkc.update_appearance() - pkc.update_slot_icon() - -/obj/item/crusher_trophy/retool_kit/remove_from(obj/item/kinetic_crusher/pkc) - var/skin_type = active_skin.type - qdel(active_skin) - active_skin = skin_type - pkc.icon = initial(pkc.icon) - pkc.icon_state = initial(pkc.icon_state) - pkc.current_inhand_icon_state = initial(pkc.current_inhand_icon_state) - pkc.projectile_icon = initial(pkc.projectile_icon) - pkc.projectile_icon_state = initial(pkc.projectile_icon_state) - pkc.lefthand_file = initial(pkc.lefthand_file) - pkc.righthand_file = initial(pkc.righthand_file) - pkc.worn_icon = initial(pkc.worn_icon) - pkc.worn_icon_state = initial(pkc.worn_icon_state) - pkc.inhand_x_dimension = initial(pkc.inhand_x_dimension) - pkc.inhand_y_dimension = initial(pkc.inhand_y_dimension) - pkc.update_appearance() - pkc.update_slot_icon() - return ..() - -/// Alternate PKC skins -/datum/crusher_skin - /// Name of the modification - var/name = "error that should be reported to coders" - /// Specifies the icon file in which the crusher's new state is stored. - var/retool_icon = 'icons/obj/mining.dmi' - ///Specifies the sprite/icon state which the crusher is changed to as an item. Should appear in the icons/obj/mining.dmi file with accompanying "lit" and "recharging" sprites - var/retool_icon_state = "ipickaxe" - ///Specifies the icon state for the crusher's appearance in hand. Should appear in both retool_lefthand_file and retool_righthand_file. - var/retool_inhand_icon = "ipickaxe" +// Alternate PKC skins +/datum/atom_skin/crusher_skin + abstract_type = /datum/atom_skin/crusher_skin + change_base_icon_state = TRUE + new_icon = 'icons/obj/mining.dmi' + new_icon_state = "ipickaxe" + /// Specifies the icon state for the crusher's appearance in hand. Should appear in both new_lefthand_file and new_righthand_file. + var/new_inhand_icon = "ipickaxe" /// Specifies the icon file in which the crusher's projectile sprite is located. - var/retool_projectile_icon = 'icons/obj/weapons/guns/projectiles.dmi' - ///For if the retool kit changes the projectile's appearance. - var/retool_projectile_icon_state = null + var/new_projectile_icon = 'icons/obj/weapons/guns/projectiles.dmi' + /// For if the retool kit changes the projectile's appearance. + var/new_projectile_icon_state /// Specifies the left hand inhand icon file. Don't forget to set the right hand file as well. - var/retool_lefthand_file = null + var/new_lefthand_file /// Specifies the right hand inhand icon file. Don't forget to set the left hand file as well. - var/retool_righthand_file = null + var/new_righthand_file /// Specifies the worn icon file. - var/retool_worn_file = null + var/new_worn_file /// Specifies the X dimensions of the new inhand, only relevant with different inhand files. - var/retool_inhand_x = null + var/new_inhandx /// Specifies the Y dimensions of the new inhand, only relevant with different inhand files. - var/retool_inhand_y = null - /// Can this skin be normally selected by a generic retool kit? - var/normal_skin = TRUE - /// Crusher this skin is attached to - var/obj/item/kinetic_crusher/crusher + var/new_inhandy -/datum/crusher_skin/New(obj/item/kinetic_crusher/new_crusher) +/datum/atom_skin/crusher_skin/apply(obj/item/kinetic_crusher/apply_to) . = ..() - crusher = new_crusher - -/datum/crusher_skin/Destroy(force) - crusher = null - return ..() - -/datum/crusher_skin/sword - name = "sword" - retool_icon_state = "crusher_sword" - retool_inhand_icon = "crusher_sword" - -/datum/crusher_skin/harpoon - name = "harpoon" - retool_icon_state = "crusher_harpoon" - retool_inhand_icon = "crusher_harpoon" - retool_projectile_icon_state = "pulse_harpoon" - -/datum/crusher_skin/harpoon/New(obj/item/kinetic_crusher/new_crusher) + APPLY_VAR_OR_RESET_INITIAL(apply_to, inhand_icon_state, new_inhand_icon, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, projectile_icon, new_projectile_icon, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, projectile_icon_state, new_projectile_icon_state, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, lefthand_file, new_lefthand_file, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, righthand_file, new_righthand_file, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, worn_icon, new_worn_file, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, worn_icon_state, new_icon_state, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, inhand_x_dimension, new_inhandx, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, inhand_y_dimension, new_inhandy, reset_missing) + +/datum/atom_skin/crusher_skin/clear_skin(obj/item/kinetic_crusher/clear_from) + . = ..() + RESET_INITIAL_IF_SET(clear_from, inhand_icon_state, new_inhand_icon) + RESET_INITIAL_IF_SET(clear_from, projectile_icon, new_projectile_icon) + RESET_INITIAL_IF_SET(clear_from, projectile_icon_state, new_projectile_icon_state) + RESET_INITIAL_IF_SET(clear_from, lefthand_file, new_lefthand_file) + RESET_INITIAL_IF_SET(clear_from, righthand_file, new_righthand_file) + RESET_INITIAL_IF_SET(clear_from, worn_icon, new_worn_file) + RESET_INITIAL_IF_SET(clear_from, worn_icon_state, new_icon_state) + RESET_INITIAL_IF_SET(clear_from, inhand_x_dimension, new_inhandx) + RESET_INITIAL_IF_SET(clear_from, inhand_y_dimension, new_inhandy) + +/datum/atom_skin/crusher_skin/sword + new_name = "proto-kinetic sword" + preview_name = "Sword" + new_icon_state = "crusher_sword" + new_inhand_icon = "crusher_sword" + +/datum/atom_skin/crusher_skin/harpoon + new_name = "proto-kinetic harpoon" + preview_name = "Harpoon" + new_icon_state = "crusher_harpoon" + new_inhand_icon = "crusher_harpoon" + new_projectile_icon_state = "pulse_harpoon" + +/datum/atom_skin/crusher_skin/harpoon/apply(atom/apply_to) . = ..() - RegisterSignal(crusher, COMSIG_ITEM_ATTACK_ANIMATION, PROC_REF(on_attack_animation)) + RegisterSignal(apply_to, COMSIG_ITEM_ATTACK_ANIMATION, PROC_REF(on_attack_animation)) -/datum/crusher_skin/harpoon/Destroy(force) - UnregisterSignal(crusher, COMSIG_ITEM_ATTACK_ANIMATION) - return ..() +/datum/atom_skin/crusher_skin/harpoon/clear_skin(atom/clear_from) + . = ..() + UnregisterSignal(clear_from, COMSIG_ITEM_ATTACK_ANIMATION) -/datum/crusher_skin/harpoon/proc/on_attack_animation(obj/item/source, atom/movable/attacker, atom/attacked_atom, animation_type, list/image_override, list/animation_override) +/datum/atom_skin/crusher_skin/harpoon/proc/on_attack_animation(obj/item/source, atom/movable/attacker, atom/attacked_atom, animation_type, list/image_override, list/animation_override) SIGNAL_HANDLER // If nothing is forcing an animation type, attack with a piercing animation because we're a harpoon if (!animation_type) animation_override += ATTACK_ANIMATION_PIERCE -/datum/crusher_skin/dagger - name = "dual dagger and blaster" - retool_icon_state = "crusher_dagger" - retool_inhand_icon = "crusher_dagger" - /// Are we doing a blaster animation right now? - var/blaster_strike = FALSE +/datum/atom_skin/crusher_skin/dagger + new_name = "proto-kinetic dual dagger and blaster" + preview_name = "Dagger and Blaster" + new_icon_state = "crusher_dagger" + new_inhand_icon = "crusher_dagger" -/datum/crusher_skin/dagger/New(obj/item/kinetic_crusher/new_crusher) +/datum/atom_skin/crusher_skin/dagger/apply(atom/apply_to) . = ..() - RegisterSignal(crusher, COMSIG_ITEM_ATTACK_ANIMATION, PROC_REF(on_attack_animation)) - RegisterSignal(crusher, COMSIG_CRUSHER_FIRED_BLAST, PROC_REF(on_fired_blast)) + RegisterSignal(apply_to, COMSIG_ITEM_ATTACK_ANIMATION, PROC_REF(on_attack_animation)) + RegisterSignal(apply_to, COMSIG_CRUSHER_FIRED_BLAST, PROC_REF(on_fired_blast)) -/datum/crusher_skin/dagger/Destroy(force) - UnregisterSignal(crusher, list(COMSIG_ITEM_ATTACK_ANIMATION, COMSIG_CRUSHER_FIRED_BLAST)) - return ..() +/datum/atom_skin/crusher_skin/dagger/clear_skin(atom/clear_from) + . = ..() + UnregisterSignal(clear_from, COMSIG_ITEM_ATTACK_ANIMATION) + UnregisterSignal(clear_from, COMSIG_CRUSHER_FIRED_BLAST) -/datum/crusher_skin/dagger/proc/on_attack_animation(obj/item/kinetic_crusher/source, atom/movable/attacker, atom/attacked_atom, animation_type, list/image_override, list/animation_override, list/angle_override) +/datum/atom_skin/crusher_skin/dagger/proc/on_attack_animation(obj/item/kinetic_crusher/source, atom/movable/attacker, atom/attacked_atom, animation_type, list/image_override, list/animation_override, list/angle_override) SIGNAL_HANDLER // If we've been forcefully assigned an animation type already, we shouldn't do the custom attack animation logic @@ -167,11 +98,11 @@ if (isliving(attacked_atom)) var/mob/living/target = attacked_atom - if (blaster_strike) + if (source.last_projectile_pb) image_override += image(icon = 'icons/obj/mining.dmi', icon_state = "crusher_dagger_blaster") angle_override += 0 animation_override += ATTACK_ANIMATION_PIERCE - blaster_strike = FALSE + source.last_projectile_pb = FALSE return if (target.has_status_effect(/datum/status_effect/crusher_mark)) @@ -179,33 +110,62 @@ image_override += image(icon = 'icons/obj/mining.dmi', icon_state = "crusher_dagger_melee") -/datum/crusher_skin/dagger/proc/on_fired_blast(obj/item/kinetic_crusher/source, atom/target, mob/living/user, obj/projectile/destabilizer/destabilizer) +/datum/atom_skin/crusher_skin/dagger/proc/on_fired_blast(obj/item/kinetic_crusher/source, atom/target, mob/living/user, obj/projectile/destabilizer/destabilizer) SIGNAL_HANDLER if (isliving(target) && get_dist(target, user) <= 1) - blaster_strike = TRUE user.do_item_attack_animation(target, used_item = source) -/datum/crusher_skin/glaive - name = "glaive" - retool_icon_state = "crusher_glaive" - retool_inhand_icon = "crusher_glaive" - retool_lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' - retool_righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' - retool_inhand_x = 64 - retool_inhand_y = 64 +/datum/atom_skin/crusher_skin/glaive + new_name = "proto-kinetic glaive" + preview_name = "Glaive" + new_icon_state = "crusher_glaive" + new_inhand_icon = "crusher_glaive" + new_lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' + new_righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' + new_inhandx = 64 + new_inhandy = 64 + +// Locked skins that cannot be selected normally +/datum/atom_skin/crusher_skin/locked + abstract_type = /datum/atom_skin/crusher_skin/locked + +/datum/atom_skin/crusher_skin/locked/ashen_skull + preview_name = "Skull" + new_icon_state = "crusher_skull" + new_inhand_icon = "crusher_skull" + new_projectile_icon_state = "pulse_skull" + +/// Unlockable (or forced) skins +/obj/item/crusher_trophy/retool_kit + name = "crusher retool kit" + desc = "A toolkit for changing the crusher's appearance without affecting the device's function." + icon = 'icons/obj/mining.dmi' + icon_state = "retool_kit" + denied_type = /obj/item/crusher_trophy/retool_kit + + /// What skin do we apply when attached + var/datum/atom_skin/crusher_skin/forced_skin + +/obj/item/crusher_trophy/retool_kit/effect_desc() + return "the crusher to have the appearance of \a [forced_skin::preview_name]" + +/obj/item/crusher_trophy/retool_kit/add_to(obj/item/kinetic_crusher/pkc, mob/user) + . = ..() + if(!.) + return + + pkc.update_reskin(forced_skin) + +/obj/item/crusher_trophy/retool_kit/remove_from(obj/item/kinetic_crusher/pkc) + pkc.update_reskin(null) // resets reskin component + return ..() /obj/item/crusher_trophy/retool_kit/ashenskull name = "ashen skull" desc = "It burns with the flame of the necropolis, whispering in your ear. It demands to be bound to a suitable weapon." icon_state = "retool_kit_skull" - forced_skin = /datum/crusher_skin/ashen_skull + forced_skin = /datum/atom_skin/crusher_skin/locked/ashen_skull /obj/item/crusher_trophy/retool_kit/ashenskull/effect_desc() return "the crusher to appear corrupted by infernal powers" - -/datum/crusher_skin/ashen_skull - retool_icon_state = "crusher_skull" - retool_inhand_icon = "crusher_skull" - retool_projectile_icon_state = "pulse_skull" - normal_skin = FALSE diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index b52c2dc21d38..a88de7ff0358 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -60,9 +60,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list( /obj/item/stack/marker_beacon/click_alt(mob/living/user) var/input_color = tgui_input_list(user, "Choose a color", "Beacon Color", GLOB.marker_beacon_colors) - if(isnull(input_color)) - return CLICK_ACTION_BLOCKING - if(!user.can_perform_action(src)) + if(isnull(input_color) || !user.can_perform_action(src)) return CLICK_ACTION_BLOCKING picked_color = input_color update_appearance() @@ -154,15 +152,12 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list( /obj/structure/marker_beacon/click_alt(mob/living/user) var/input_color = tgui_input_list(user, "Choose a color", "Beacon Color", GLOB.marker_beacon_colors) - if(isnull(input_color)) + if(isnull(input_color) || !user.can_perform_action(src)) return CLICK_ACTION_BLOCKING - if(!user.can_perform_action(src)) - return NONE picked_color = input_color update_appearance() return CLICK_ACTION_SUCCESS - /* Preset marker beacon types, for mapping */ // Set the icon_state here to make it clear for mappers. diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index 00620f1074d2..73ebdf10a71c 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -73,6 +73,10 @@ hitsound = 'sound/items/weapons/drill.ogg' desc = "An electric mining drill for the especially scrawny." +/obj/item/pickaxe/drill/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) //closed handle + /obj/item/pickaxe/drill/diamonddrill name = "diamond-tipped mining drill" icon_state = "diamonddrill" @@ -177,6 +181,7 @@ attack_verb_simple = list("slash", "impale", "stab", "slice") sharpness = SHARP_EDGED item_flags = CRUEL_IMPLEMENT + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 4, /datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5) /obj/item/shovel/serrated/Initialize(mapload) . = ..() @@ -318,6 +323,7 @@ item_flags = SLOWS_WHILE_IN_HAND | IMMUTABLE_SLOW slowdown = 3 attack_speed = 1.2 SECONDS + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6.6, /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 5) /// The factor at which the recoil becomes less. var/recoil_factor = 3 /// Wether we knock down and launch away out enemies when we attack. diff --git a/code/modules/mining/equipment/monster_organs/brimdust_sac.dm b/code/modules/mining/equipment/monster_organs/brimdust_sac.dm index 8a9e1166eaa4..bcdd0b640a2e 100644 --- a/code/modules/mining/equipment/monster_organs/brimdust_sac.dm +++ b/code/modules/mining/equipment/monster_organs/brimdust_sac.dm @@ -4,6 +4,8 @@ #define BRIMDUST_STACKS_ON_LIFE 1 /// Number of stacks to add if you activate the item in hand #define BRIMDUST_STACKS_ON_USE 3 +/// Overlay alpha per effect stack +#define BRIMDUST_ALPHA_PER_STACK 75 /** * Gives you three stacks of Brimdust Coating, when you get hit by anything it will make a short ranged explosion. @@ -89,7 +91,10 @@ /atom/movable/screen/alert/status_effect/brimdust_coating name = "Brimdust Coating" desc = "You %STACKS% explosive dust, kinetic impacts will cause it to detonate! \ - The explosion will not harm you as long as you're not under atmospheric pressure." + The explosion will not harm you as long as you're not under atmospheric pressure. \ + Click this alert to shake off the dust." + use_user_hud_icon = TRUE + overlay_state = "brimdemon_1" /atom/movable/screen/alert/status_effect/brimdust_coating/MouseEntered(location,control,params) desc = initial(desc) @@ -106,6 +111,21 @@ desc = replacetext(desc, "%STACKS%", dust_amount_string) return ..() +/atom/movable/screen/alert/status_effect/brimdust_coating/Click(location, control, params) + . = ..() + if(!.) + return + if(!owner.can_resist()) + return + owner.balloon_alert(owner, "shaking off the dust...") + var/datum/status_effect/stacking/brimdust_coating/dust = attached_effect + if (!do_after(owner, dust.stacks * 1.5 SECONDS, owner)) + return + dust.explode() + // The effect can get deleted from exploding and reducing stacks + if (!QDELETED(dust)) + qdel(dust) + /datum/status_effect/stacking/brimdust_coating/refresh(effect, stacks_to_add) . = ..() add_stacks(stacks_to_add) @@ -114,24 +134,32 @@ . = ..() if (stacks == 0) return - linked_alert.icon_state = "brimdemon_[stacks]" + linked_alert.overlay_state = "brimdemon_[stacks]" + linked_alert.update_appearance(UPDATE_OVERLAYS) + if (dust_overlay) + owner.cut_overlay(dust_overlay) + dust_overlay.alpha = stacks * BRIMDUST_ALPHA_PER_STACK + owner.add_overlay(dust_overlay) /datum/status_effect/stacking/brimdust_coating/on_creation(mob/living/new_owner, stacks_to_apply) . = ..() - linked_alert?.icon_state = "brimdemon_[stacks]" + linked_alert?.overlay_state = "brimdemon_[stacks]" /datum/status_effect/stacking/brimdust_coating/on_apply() . = ..() - dust_overlay = mutable_appearance('icons/effects/weather_effects.dmi', "ash_storm") + dust_overlay.alpha = stacks * BRIMDUST_ALPHA_PER_STACK + dust_overlay.color = COLOR_RED_LIGHT dust_overlay.blend_mode = BLEND_INSET_OVERLAY owner.add_overlay(dust_overlay) + owner.add_shared_particles(/particles/brimdust) RegisterSignal(owner, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_cleaned)) RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_take_damage)) /datum/status_effect/stacking/brimdust_coating/on_remove() . = ..() owner.cut_overlay(dust_overlay) + owner.remove_shared_particles(/particles/brimdust) UnregisterSignal(owner, list(COMSIG_MOB_APPLY_DAMAGE, COMSIG_COMPONENT_CLEAN_ACT)) /// When you are cleaned, wash off the buff @@ -162,14 +190,14 @@ new /obj/effect/temp_visual/explosion/fast(origin_turf) var/damage_dealt = blast_damage - var/list/possible_targets = range(1, origin_turf) - if(lavaland_equipment_pressure_check(origin_turf)) - possible_targets -= owner - else + var/safe_explosion = lavaland_equipment_pressure_check(origin_turf) + if(!safe_explosion) damage_dealt *= pressure_modifier owner.apply_status_effect(/datum/status_effect/brimdust_concussion) - for(var/mob/living/target in possible_targets) + for(var/mob/living/target in range(1, origin_turf) - (safe_explosion ? list(owner, owner.buckled) : null)) + if (safe_explosion && owner.faction_check_atom(target)) + continue var/armor = target.run_armor_check(attack_flag = BOMB) target.apply_damage(damage_dealt, damagetype = BURN, blocked = armor, spread_damage = TRUE) @@ -202,3 +230,4 @@ #undef BRIMDUST_LIFE_APPLY_COOLDOWN #undef BRIMDUST_STACKS_ON_LIFE #undef BRIMDUST_STACKS_ON_USE +#undef BRIMDUST_ALPHA_PER_STACK diff --git a/code/modules/mining/equipment/monster_organs/rush_gland.dm b/code/modules/mining/equipment/monster_organs/rush_gland.dm index 8012286975ad..c11df30bc35e 100644 --- a/code/modules/mining/equipment/monster_organs/rush_gland.dm +++ b/code/modules/mining/equipment/monster_organs/rush_gland.dm @@ -2,7 +2,7 @@ #define HEALTH_DANGER_ZONE 30 /** - * On use in hand, makes you run really fast for 5 seconds and ignore injury movement decrease. + * On use in hand, makes you run faster for a bit and ignore injury movement decrease. * On use when implanted, run for longer and ignore all negative movement. Automatically triggers if health is low (to escape). */ /obj/item/organ/monster_core/rush_gland @@ -37,13 +37,13 @@ INVOKE_ASYNC(src, PROC_REF(trigger_organ_action)) /** - * Status effect: Makes you run really fast and ignore speed penalties for a short duration. + * Status effect: Makes you run faster and ignore damage speed penalties for a short duration. * If you run into a wall indoors you will fall over and lose the buff. * If you run into someone you both fall over. */ /datum/status_effect/lobster_rush id = "lobster_rush" - duration = 3 SECONDS + duration = 30 SECONDS alert_type = /atom/movable/screen/alert/status_effect/lobster_rush show_duration = TRUE var/spawned_last_move = FALSE @@ -51,54 +51,63 @@ /atom/movable/screen/alert/status_effect/lobster_rush name = "Lobster Rush" desc = "Adrenaline is surging through you!" - icon_state = "lobster" + use_user_hud_icon = TRUE + overlay_state = "lobster" /datum/status_effect/lobster_rush/on_apply() . = ..() - RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move)) + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) RegisterSignal(owner, COMSIG_MOVABLE_BUMP, PROC_REF(on_bump)) - owner.add_traits(list(TRAIT_IGNORESLOWDOWN, TRAIT_TENTACLE_IMMUNE), TRAIT_STATUS_EFFECT(id)) + ADD_TRAIT(owner, TRAIT_TENTACLE_IMMUNE, TRAIT_STATUS_EFFECT(id)) + owner.add_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) 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)) - owner.remove_traits(list(TRAIT_IGNORESLOWDOWN, TRAIT_TENTACLE_IMMUNE), TRAIT_STATUS_EFFECT(id)) + UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_BUMP)) + REMOVE_TRAIT(owner, TRAIT_TENTACLE_IMMUNE, TRAIT_STATUS_EFFECT(id)) owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/lobster_rush) + owner.remove_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) to_chat(owner, span_notice("Your pulse returns to normal.")) /// Spawn an afterimage every other step, because every step was too many -/datum/status_effect/lobster_rush/proc/on_move() +/datum/status_effect/lobster_rush/proc/on_move(datum/source, atom/old_loc, dir) SIGNAL_HANDLER + if (!isturf(old_loc) || !isturf(owner.loc)) + return if (!spawned_last_move) - new /obj/effect/temp_visual/decoy/fading(owner.loc, owner) + new /obj/effect/temp_visual/decoy/fading(old_loc, owner, 150) spawned_last_move = !spawned_last_move /datum/status_effect/lobster_rush/proc/on_bump(mob/living/source, atom/target) SIGNAL_HANDLER if (!target.density) return - if (isliving(target)) - source.visible_message(span_warning("[source] crashes into [target]!")) - smack_into(source) - smack_into(target) - qdel(src) - return if (lavaland_equipment_pressure_check(get_turf(source))) return smack_into(source) source.visible_message(span_warning("[source] crashes into [target]!")) + if (isliving(target)) + smack_into(target) qdel(src) /datum/status_effect/lobster_rush/proc/smack_into(mob/living/target) - target.Knockdown(5 SECONDS) - target.apply_damage(40, STAMINA) - target.apply_damage(20, BRUTE, spread_damage = TRUE) + target.Knockdown(2 SECONDS) + target.apply_damage(30, STAMINA) + target.apply_damage(10, BRUTE, spread_damage = TRUE) /// You get a longer buff if you take the time to implant it in yourself /datum/status_effect/lobster_rush/extended - duration = 5 SECONDS + duration = 60 SECONDS + +/datum/status_effect/lobster_rush/extended/on_apply() + . = ..() + ADD_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id)) + +/datum/status_effect/lobster_rush/extended/on_remove() + . = ..() + REMOVE_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id)) /// Action used by the rush gland /datum/action/cooldown/monster_core_action/adrenal_boost @@ -106,6 +115,6 @@ desc = "Pump your rush gland to give yourself a boost of speed. \ Impacts with objects can be dangerous under atmospheric pressure." button_icon_state = "lobster_gland_stable" - cooldown_time = 90 SECONDS + cooldown_time = 180 SECONDS #undef HEALTH_DANGER_ZONE diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index be27975294ba..7ba37130ebc7 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -5,7 +5,7 @@ static_lighting = TRUE requires_power = FALSE default_gravity = STANDARD_GRAVITY - area_flags = BLOBS_ALLOWED | UNIQUE_AREA + area_flags = BLOBS_ALLOWED flags_1 = CAN_BE_DIRTY_1 //Survival Capsule diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index d9e6b3c16c85..9616c6149e56 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -10,7 +10,6 @@ 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) harvest_with_hands = TRUE harvested_name = "shortened mushrooms" harvested_desc = "Some quickly regrowing mushrooms, formerly known to be quite large." @@ -27,6 +26,9 @@ base_icon_state = "[base_icon_state][rand(1, number_of_variants)]" icon_state = base_icon_state +/obj/structure/flora/ash/get_potential_products() + return list(/obj/item/food/grown/ash_flora/shavings = 1) + /obj/structure/flora/ash/harvest(user, product_amount_multiplier) if(!..()) return FALSE @@ -45,7 +47,6 @@ desc = "A number of mushrooms, each of which surrounds a greenish sporangium with a number of leaf-like structures." icon_state = "s_mushroom1" base_icon_state = "s_mushroom" - product_types = list(/obj/item/food/grown/ash_flora/mushroom_leaf = 1) harvested_name = "leafless mushrooms" harvested_desc = "A bunch of formerly-leafed mushrooms, with their sporangiums exposed. Scandalous?" harvest_amount_high = 4 @@ -56,12 +57,14 @@ regrowth_time_low = 2400 regrowth_time_high = 6000 +/obj/structure/flora/ash/leaf_shroom/get_potential_products() + return list(/obj/item/food/grown/ash_flora/mushroom_leaf = 1) + /obj/structure/flora/ash/cap_shroom name = "tall mushrooms" desc = "Several mushrooms, the larger of which have a ring of conks at the midpoint of their stems." icon_state = "r_mushroom1" base_icon_state = "r_mushroom" - product_types = list(/obj/item/food/grown/ash_flora/mushroom_cap = 1) harvested_name = "small mushrooms" harvested_desc = "Several small mushrooms near the stumps of what likely were larger mushrooms." harvest_amount_high = 4 @@ -72,6 +75,9 @@ regrowth_time_low = 3000 regrowth_time_high = 5400 +/obj/structure/flora/ash/cap_shroom/get_potential_products() + return list(/obj/item/food/grown/ash_flora/mushroom_cap = 1) + /obj/structure/flora/ash/stem_shroom name = "numerous mushrooms" desc = "A large number of mushrooms, some of which have long, fleshy stems. They're radiating light!" @@ -79,7 +85,6 @@ base_icon_state = "t_mushroom" light_range = 1.5 light_power = 2.1 - product_types = list(/obj/item/food/grown/ash_flora/mushroom_stem = 1) harvested_name = "tiny mushrooms" harvested_desc = "A few tiny mushrooms around larger stumps. You can already see them growing back." harvest_amount_high = 4 @@ -90,12 +95,14 @@ regrowth_time_low = 3000 regrowth_time_high = 6000 +/obj/structure/flora/ash/stem_shroom/get_potential_products() + return list(/obj/item/food/grown/ash_flora/mushroom_stem = 1) + /obj/structure/flora/ash/cacti name = "fruiting cacti" desc = "Several prickly cacti, brimming with ripe fruit and covered in a thin layer of ash." icon_state = "cactus1" base_icon_state = "cactus" - product_types = list(/obj/item/food/grown/ash_flora/cactus_fruit = 20, /obj/item/seeds/lavaland/cactus = 1) harvested_name = "cacti" harvested_desc = "A bunch of prickly cacti. You can see fruits slowly growing beneath the covering of ash." harvest_amount_high = 2 @@ -111,12 +118,14 @@ . = ..() AddComponent(/datum/component/caltrop, min_damage = 3, max_damage = 6, probability = 70) +/obj/structure/flora/ash/cacti/get_potential_products() + return list(/obj/item/food/grown/ash_flora/cactus_fruit = 20, /obj/item/seeds/lavaland/cactus = 1) + /obj/structure/flora/ash/seraka name = "seraka mushrooms" desc = "A small cluster of seraka mushrooms. These must have come with the ashlizards." icon_state = "seraka_mushroom1" base_icon_state = "seraka_mushroom" - product_types = list(/obj/item/food/grown/ash_flora/seraka = 1) harvested_name = "harvested seraka mushrooms" harvested_desc = "A couple of small seraka mushrooms, with the larger ones clearly having been recently removed. They'll grow back... eventually." harvest_amount_high = 6 @@ -129,6 +138,9 @@ number_of_variants = 2 harvest_message_true_thresholds = FALSE +/obj/structure/flora/ash/seraka/get_potential_products() + return list(/obj/item/food/grown/ash_flora/seraka = 1) + /obj/structure/flora/ash/fireblossom name = "fire blossom" desc = "An odd flower that grows commonly near bodies of lava." @@ -137,7 +149,6 @@ light_range = LIGHT_FIRE_BLOSSOM light_power = LIGHT_FIRE_BLOSSOM light_color = COLOR_BIOLUMINESCENCE_YELLOW - product_types = list(/obj/item/food/grown/ash_flora/fireblossom = 1) harvested_name = "fire blossom stems" harvested_desc = "A few fire blossom stems, missing their flowers." harvest_amount_high = 3 @@ -148,6 +159,9 @@ regrowth_time_high = 4000 number_of_variants = 2 +/obj/structure/flora/ash/fireblossom/get_potential_products() + return list(/obj/item/food/grown/ash_flora/fireblossom = 1) + /obj/structure/flora/ash/fireblossom/after_harvest() set_light_power(LIGHT_RANGE_FIRE_BLOSSOM_HARVESTED) set_light_range(LIGHT_POWER_FIRE_BLOSSOM_HARVESTED) @@ -166,7 +180,6 @@ desc = "A number of bright, springy blue fruiting plants. They seem to be unconcerned with the hardy, cold environment." icon_state = "chilly_pepper1" base_icon_state = "chilly_pepper" - product_types = list(/obj/item/food/grown/icepepper = 1) harvested_name = "springy grass" harvested_desc = "A bunch of springy, bouncy fruiting grass, all picked. Or maybe they were never fruiting at all?" harvest_amount_high = 3 @@ -178,6 +191,9 @@ regrowth_time_high = 5500 number_of_variants = 2 +/obj/structure/flora/ash/chilly/get_potential_products() + return list(/obj/item/food/grown/icepepper = 1) + //SNACKS /obj/item/food/grown/ash_flora @@ -198,8 +214,8 @@ pixel_x = base_pixel_x + rand(-4, 4) pixel_y = base_pixel_y + rand(-4, 4) -/obj/item/food/grown/ash_flora/shavings //So we can't craft bowls from everything. - grind_results = list(/datum/reagent/toxin/mushroom_powder = 5) +/obj/item/food/grown/ash_flora/shavings/grind_results() + return list(/datum/reagent/toxin/mushroom_powder = 5) /obj/item/food/grown/ash_flora/mushroom_leaf name = "mushroom leaf" @@ -230,6 +246,10 @@ wine_power = 50 foodtypes = FRUIT +/obj/item/food/grown/ash_flora/cactus_fruit/Initialize(mapload) + . = ..() + AddElement(/datum/element/raptor_food, growth_modifier = 0.1, ability_modifier = -0.05) + /obj/item/food/grown/ash_flora/seraka name = "seraka cap" desc = "Small, deeply flavourful mushrooms originally native to Tizira." @@ -237,6 +257,10 @@ seed = /obj/item/seeds/lavaland/seraka wine_power = 40 +/obj/item/food/grown/ash_flora/seraka/Initialize(mapload) + . = ..() + AddElement(/datum/element/raptor_food, ability_modifier = 0.1) + /obj/item/food/grown/ash_flora/fireblossom name = "fire blossom" desc = "A flower from a fire blossom." @@ -245,7 +269,12 @@ seed = /obj/item/seeds/lavaland/fireblossom wine_power = 40 -//SEEDS +/obj/item/food/grown/ash_flora/fireblossom/Initialize(mapload) + . = ..() + // Fire flowers make fireproof raptors + AddElement(/datum/element/raptor_food, color_chances = string_list(list(/datum/raptor_color/blue = 5))) + +// SEEDS /obj/item/seeds/lavaland name = "lavaland seeds" @@ -388,6 +417,7 @@ icon_state = "mushroom_bowl" fill_icon_state = "fullbowl" fill_icon = 'icons/obj/mining_zones/ash_flora.dmi' + custom_materials = null /obj/item/reagent_containers/cup/bowl/mushroom_bowl/update_icon_state() if(!reagents.total_volume) diff --git a/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm b/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm index bcb5c968e3c8..6faf813094bf 100644 --- a/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm +++ b/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm @@ -13,6 +13,7 @@ attack_verb_simple = list("attack", "saw", "slice", "tear", "lacerate", "rip", "dice", "cut") force = 15 attack_speed = 6 + resistance_flags = FIRE_PROOF | LAVA_PROOF actions_types = list(/datum/action/cooldown/dagger_swing) hitsound = 'sound/items/weapons/bladeslice.ogg' w_class = WEIGHT_CLASS_SMALL @@ -23,39 +24,40 @@ reach = 2 attack_icon = 'icons/effects/effects.dmi' attack_icon_state = "cain_abel_attack" - ///our current combo count + /// Our current combo count var/combo_count = 0 - ///the maximum combo we can reach + /// The maximum combo we can reach var/max_combo = 6 - ///percentage boost we get on every combo + /// Percentage boost we get on every combo var/damage_boost = 1.15 - ///pixel offsets of our wisps - var/static/list/wisp_offsets = list( - list(9, 12), - list(14, 0), - list(9, -12), - list(-9, 12), - list(-14, 0), - list(-9, -12), - ) - ///what throw mode we're using + /// Animation positions used by wisps + var/static/list/animation_steps + /// What throw mode we're using var/throw_mode = THROW_MODE_CRYSTALS - ///flames we have up! + /// Flames we have up! var/list/current_wisps = list() - ///cooldown till we can throw blades again + /// Cooldown till we can throw blades again COOLDOWN_DECLARE(throw_cooldown) /obj/item/cain_and_abel/Initialize(mapload) . = ..() AddComponent(/datum/component/two_handed, require_twohands = TRUE, force_unwielded = force, force_wielded = force) + if (length(animation_steps)) + return + animation_steps = list( + new /datum/abel_wisp_frame(-18, -2, MOB_LAYER, EASE_OUT, EASE_IN), + new /datum/abel_wisp_frame(-6, -6, ABOVE_MOB_LAYER, EASE_IN, EASE_OUT), + new /datum/abel_wisp_frame(6, -6, ABOVE_MOB_LAYER, EASE_IN, EASE_OUT), + new /datum/abel_wisp_frame(18, -2, MOB_LAYER, EASE_OUT, EASE_IN), + new /datum/abel_wisp_frame(6, 2, BELOW_MOB_LAYER, EASE_IN, EASE_OUT), + new /datum/abel_wisp_frame(-6, 2, BELOW_MOB_LAYER, EASE_IN, EASE_OUT), + ) /obj/item/cain_and_abel/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) . = ..() - if(!isliving(old_loc)) - return - - unset_user(old_loc) + if(isliving(old_loc)) + unset_user(old_loc) /obj/item/cain_and_abel/proc/unset_user(mob/living/source) if(HAS_TRAIT(source, TRAIT_RELAYING_ATTACKER)) @@ -64,7 +66,6 @@ set_combo(new_value = 0, user = source) UnregisterSignal(source, list(COMSIG_ATOM_WAS_ATTACKED)) - /obj/item/cain_and_abel/equipped(mob/user, slot) . = ..() @@ -91,8 +92,6 @@ for(var/index in 0 to (length(current_wisps) - 1)) addtimer(CALLBACK(src, PROC_REF(fire_wisp), user, interacting_with), index * 0.15 SECONDS) - - set_combo(new_value = 0, user = user) return ITEM_INTERACT_SUCCESS /obj/item/cain_and_abel/attack(mob/living/target, mob/living/carbon/human/user) @@ -116,29 +115,55 @@ user.balloon_alert(user, "crystals [throw_mode == THROW_MODE_CRYSTALS ? "activated" : "deactivated"]") return TRUE -/obj/item/cain_and_abel/proc/set_combo(new_value, mob/living/user) - combo_count = (new_value <= max_combo) ? new_value : 0 - handle_wisps(user) - -/obj/item/cain_and_abel/proc/handle_wisps(mob/living/user) - var/should_remove = length(current_wisps) > combo_count - var/wisps_to_alter = abs(combo_count - length(current_wisps)) +/obj/item/cain_and_abel/proc/set_combo(new_value, mob/living/user, instant = FALSE) + new_value = clamp(new_value, 0, max_combo) + if (new_value == combo_count) + return - for(var/i = 1, i <= wisps_to_alter, i++) - if(!should_remove) + if (new_value > combo_count) + for (var/i in 1 to new_value - combo_count) add_wisp(user) - continue - var/obj/my_wisp = current_wisps[i] - remove_wisp(my_wisp) + else + for (var/i in 1 to combo_count - new_value) + remove_wisp(current_wisps[i], instant) + + combo_count = new_value /obj/item/cain_and_abel/proc/add_wisp(mob/living/user) var/obj/effect/overlay/blood_wisp/new_wisp = new(src) current_wisps += new_wisp - var/list/position = wisp_offsets[length(current_wisps)] user.vis_contents += new_wisp - new_wisp.pixel_x = position[1] - new_wisp.pixel_y = position[2] RegisterSignal(new_wisp, COMSIG_QDELETING, PROC_REF(on_wisp_delete)) + for (var/wisp_index in 1 to length(current_wisps)) + var/obj/effect/overlay/blood_wisp/wisp = current_wisps[wisp_index] + var/spawn_index = floor(length(animation_steps) / length(current_wisps) * wisp_index) + var/datum/abel_wisp_frame/spawn_position = animation_steps[spawn_index] + + // Latest added wisp is teleported to its spawn position, others animate from their current position + if (wisp_index == length(current_wisps)) + wisp.pixel_w = spawn_position.x + wisp.pixel_z = spawn_position.y + wisp.layer = spawn_position.layer + else + animate(wisp, tag = "wisp_anim_x") + animate(wisp, tag = "wisp_anim_y") + + var/start_index = spawn_index % length(animation_steps) + 1 + var/datum/abel_wisp_frame/position = animation_steps[start_index] + animate(wisp, pixel_w = position.x, layer = position.layer, time = 0.6 SECONDS, loop = -1, tag = "wisp_anim_x") + // We need to animate x and y coordinates separately as they have different easing steps + for (var/frame_index in 1 to length(animation_steps) - 1) + // Get actual index starting from our *next* animation step, not initial position + var/anim_index = (start_index + frame_index - 1) % length(animation_steps) + 1 + position = animation_steps[anim_index] + animate(time = 0.6 SECONDS, pixel_w = position.x, layer = position.layer, easing = SINE_EASING | position.x_easing) + + animate(wisp, time = 0.6 SECONDS, pixel_z = position.y, loop = -1, tag = "wisp_anim_y") + for (var/frame_index in 1 to length(animation_steps) - 1) + // Get actual index starting from our *next* animation step, not initial position + var/anim_index = (start_index + frame_index - 1) % length(animation_steps) + 1 + position = animation_steps[anim_index] + animate(time = 0.6 SECONDS, pixel_z = position.y, easing = SINE_EASING | position.y_easing) /obj/item/cain_and_abel/proc/on_wisp_delete(datum/source) SIGNAL_HANDLER @@ -147,7 +172,27 @@ /obj/item/cain_and_abel/proc/fire_wisp(atom/user, atom/target) user.fire_projectile(/obj/projectile/dagger_wisp, target) + set_combo(combo_count - 1, user, TRUE) -/obj/item/cain_and_abel/proc/remove_wisp(obj/wisp_to_remove) +/obj/item/cain_and_abel/proc/remove_wisp(obj/wisp_to_remove, instant = FALSE) + if (instant) + qdel(wisp_to_remove) + return animate(wisp_to_remove, alpha = 0, time = 0.2 SECONDS) QDEL_IN(wisp_to_remove, 0.2 SECONDS) + +/// Frame data for cain & abel wisps so we don't have to make list monstrocities +/datum/abel_wisp_frame + var/x = 0 + var/y = 0 + var/layer = MOB_LAYER + var/x_easing = NONE + var/y_easing = NONE + +/datum/abel_wisp_frame/New(x, y, layer, x_easing, y_easing) + . = ..() + src.x = x + src.y = y + src.layer = layer + src.x_easing = x_easing + src.y_easing = y_easing diff --git a/code/modules/mining/lavaland/cain_and_abel/dagger_effects.dm b/code/modules/mining/lavaland/cain_and_abel/dagger_effects.dm index d19da3b9569b..e3984219bd0f 100644 --- a/code/modules/mining/lavaland/cain_and_abel/dagger_effects.dm +++ b/code/modules/mining/lavaland/cain_and_abel/dagger_effects.dm @@ -1,6 +1,5 @@ //effect when we're swinging wildly around /obj/effect/temp_visual/dagger_slash - name = "Blood Wisp" mouse_opacity = MOUSE_OPACITY_TRANSPARENT anchored = TRUE vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE @@ -19,10 +18,10 @@ //flames we collect around our body /obj/effect/overlay/blood_wisp + name = "Blood Wisp" mouse_opacity = MOUSE_OPACITY_TRANSPARENT anchored = TRUE - vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE - layer = ABOVE_HUD_PLANE + vis_flags = VIS_INHERIT_PLANE icon = 'icons/effects/effects.dmi' icon_state = "blood_wisp" light_power = 2 diff --git a/code/modules/mining/lavaland/cain_and_abel/dagger_status_effects.dm b/code/modules/mining/lavaland/cain_and_abel/dagger_status_effects.dm index 0f535f31951a..a6cb6c04e671 100644 --- a/code/modules/mining/lavaland/cain_and_abel/dagger_status_effects.dm +++ b/code/modules/mining/lavaland/cain_and_abel/dagger_status_effects.dm @@ -1,8 +1,8 @@ ///status effect applied to us when we're wildly swinging /datum/status_effect/dagger_swinging id = "dagger swinging" - tick_interval = 0.25 SECONDS - duration = 1.75 SECONDS + tick_interval = 0.2 SECONDS + duration = 1.6 SECONDS alert_type = null ///base damage we apply to mobs near us var/base_damage = 5 diff --git a/code/modules/mining/lavaland/mining_loot/consumables.dm b/code/modules/mining/lavaland/mining_loot/consumables.dm index e81d3b001d1f..ca9d22c0f55c 100644 --- a/code/modules/mining/lavaland/mining_loot/consumables.dm +++ b/code/modules/mining/lavaland/mining_loot/consumables.dm @@ -219,8 +219,7 @@ var/list/radial_wings = list() var/list/name2type = list() for(var/obj/item/organ/wings/functional/possible_type as anything in wing_types) - var/datum/sprite_accessory/accessory = initial(possible_type.sprite_accessory_override) //get the type - accessory = SSaccessories.wings_list[initial(accessory.name)] //get the singleton instance + var/datum/sprite_accessory/accessory = SSaccessories.feature_list[FEATURE_WINGS][possible_type::sprite_accessory_override::name] //get the singleton instance var/image/img = image(icon = accessory.icon, icon_state = "m_wingsopen_[accessory.icon_state]_BEHIND") //Process the HUD elements img.transform *= 0.5 img.pixel_w = -32 diff --git a/code/modules/mining/lavaland/mining_loot/cursed_katana.dm b/code/modules/mining/lavaland/mining_loot/cursed_katana.dm index 8de948289322..4b0019166f72 100644 --- a/code/modules/mining/lavaland/mining_loot/cursed_katana.dm +++ b/code/modules/mining/lavaland/mining_loot/cursed_katana.dm @@ -107,7 +107,7 @@ return ..() /obj/item/cursed_katana/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) - if(attack_type == (PROJECTILE_ATTACK || LEAP_ATTACK || OVERWHELMING_ATTACK)) + if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK) final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword. Or a road roller, if one happened to hit you. return ..() diff --git a/code/modules/mining/lavaland/mining_loot/equipment.dm b/code/modules/mining/lavaland/mining_loot/equipment.dm index 98edc5700d27..2cffdca852c8 100644 --- a/code/modules/mining/lavaland/mining_loot/equipment.dm +++ b/code/modules/mining/lavaland/mining_loot/equipment.dm @@ -40,7 +40,6 @@ to_chat(user, span_warning("The snake carving seems to come alive, if only for a moment, before returning to its dormant state, almost as if it finds you incapable of holding its oath.")) return var/mob/living/carbon/itemUser = user - var/usedHand = itemUser.get_held_index_of_item(src) if(itemUser.has_status_effect(/datum/status_effect/hippocratic_oath)) to_chat(user, span_warning("You can't possibly handle the responsibility of more than one rod!")) return @@ -56,9 +55,12 @@ to_chat(itemUser, failText) return - to_chat(itemUser, span_notice("The snake, satisfied with your oath, attaches itself and the rod to your forearm with an inseparable grip. Your thoughts seem to only revolve around the core idea of helping others, and harm is nothing more than a distant, wicked memory...")) - var/datum/status_effect/hippocratic_oath/effect = itemUser.apply_status_effect(/datum/status_effect/hippocratic_oath) - effect.hand = usedHand + apply_oath(itemUser) + +/obj/item/rod_of_asclepius/proc/apply_oath(mob/living/carbon/user) + to_chat(user, span_notice("The snake, satisfied with your oath, attaches itself and the rod to your forearm with an inseparable grip. Your thoughts seem to only revolve around the core idea of helping others, and harm is nothing more than a distant, wicked memory...")) + var/datum/status_effect/hippocratic_oath/effect = user.apply_status_effect(/datum/status_effect/hippocratic_oath) + effect.hand = user.get_held_index_of_item(src) activated() /obj/item/rod_of_asclepius/proc/activated() diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm b/code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm index 2f76a3902049..86aa364acaec 100644 --- a/code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm +++ b/code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm @@ -5,6 +5,7 @@ desc = "The gathered remains of a drake. It still crackles with heat, and smells distinctly of brimstone." icon = 'icons/obj/clothing/head/helmet.dmi' icon_state = "dragon" + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 10) /obj/item/drake_remains/Initialize(mapload) . = ..() @@ -27,6 +28,7 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF transparent_protection = HIDEGLOVES|HIDESUITSTORAGE|HIDEJUMPSUIT|HIDESHOES + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 10) /datum/armor/cloak_drake melee = 65 @@ -169,11 +171,11 @@ switch(random) if(1) - to_chat(user, span_danger("Your appearance morphs to that of a very small humanoid ash dragon! You get to look like a freak without the cool abilities.")) + to_chat(user, span_danger("Your appearance morphs to that of a very small humanoid ash dragon! You get to look like a freak with just a fragment of their abilities.")) consumer.dna.features = list( FEATURE_MUTANT_COLOR = "#A02720", FEATURE_TAIL_LIZARD = "Dark Tiger", - FEATURE_TAIL = "None", + FEATURE_TAIL_CAT = "None", FEATURE_SNOUT = "Sharp", FEATURE_HORNS = "Curled", FEATURE_EARS = "None", @@ -185,6 +187,10 @@ ) consumer.set_eye_color("#FEE5A3") consumer.set_species(/datum/species/lizard) + consumer.dna.add_mutation(/datum/mutation/firebreath, MUTATION_SOURCE_MUTATOR) + var/obj/item/organ/wings/functional/dragon/wings = new() + wings.Insert(consumer) + if(2) to_chat(user, span_danger("Your flesh begins to melt! Miraculously, you seem fine otherwise.")) consumer.set_species(/datum/species/skeleton) diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm b/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm index 10c373554951..c3368019ed20 100644 --- a/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm +++ b/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm @@ -112,7 +112,7 @@ . += observer_desc . += "It is activated by [activation_method]." -/obj/machinery/anomalous_crystal/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range) +/obj/machinery/anomalous_crystal/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/machinery/anomalous_crystal/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range) . = ..() if(isliving(speaker)) ActivationReaction(speaker, ACTIVATE_SPEECH) @@ -373,7 +373,7 @@ if(isanimal_or_basicmob(loc)) holder_animal = loc RegisterSignal(holder_animal, COMSIG_LIVING_DEATH, PROC_REF(on_holder_animal_death)) - AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL|EMP_NO_EXAMINE) /obj/structure/closet/stasis/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) . = ..() diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/hierophant.dm b/code/modules/mining/lavaland/mining_loot/megafauna/hierophant.dm index 940ad9405d3d..520502aaf305 100644 --- a/code/modules/mining/lavaland/mining_loot/megafauna/hierophant.dm +++ b/code/modules/mining/lavaland/mining_loot/megafauna/hierophant.dm @@ -75,7 +75,7 @@ /obj/item/hierophant_club/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) // If our target is the beacon and the hierostaff is next to the beacon, we're trying to pick it up. - if (interacting_with == beacon) + if (interacting_with == beacon || !isturf(interacting_with.loc)) return NONE if (!blink_activated) diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/the_thing.dm b/code/modules/mining/lavaland/mining_loot/megafauna/the_thing.dm index cea00930325a..44172c5ed110 100644 --- a/code/modules/mining/lavaland/mining_loot/megafauna/the_thing.dm +++ b/code/modules/mining/lavaland/mining_loot/megafauna/the_thing.dm @@ -37,7 +37,7 @@ /obj/item/organ/brain/cybernetic/ai/on_mob_insert(mob/living/carbon/brain_owner, special, movement_flags) . = ..() - brain_owner.add_traits(list(HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT, TRAIT_NO_MINDSWAP, TRAIT_CORPSELOCKED), REF(src)) + brain_owner.add_traits(list(TRAIT_BASIC_HEALTH_HUD_VISIBLE, TRAIT_NO_MINDSWAP, TRAIT_CORPSELOCKED), REF(src)) update_med_hud_status(brain_owner) RegisterSignal(brain_owner, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(update_med_hud_status)) RegisterSignal(brain_owner, COMSIG_CLICK, PROC_REF(owner_clicked)) @@ -53,7 +53,7 @@ /obj/item/organ/brain/cybernetic/ai/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags) undeploy() . = ..() - organ_owner.remove_traits(list(HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT, TRAIT_NO_MINDSWAP, TRAIT_CORPSELOCKED), REF(src)) + organ_owner.remove_traits(list(TRAIT_BASIC_HEALTH_HUD_VISIBLE, TRAIT_NO_MINDSWAP, TRAIT_CORPSELOCKED), REF(src)) UnregisterSignal(organ_owner, list(COMSIG_LIVING_HEALTH_UPDATE, COMSIG_CLICK, COMSIG_MOB_GET_STATUS_TAB_ITEMS, COMSIG_MOB_MIND_BEFORE_MIDROUND_ROLL, COMSIG_QDELETING, COMSIG_LIVING_PRE_WABBAJACKED)) var/obj/item/implant/radio/radio = radio_weakref.resolve() @@ -118,7 +118,7 @@ if(AI.controlled_equipment) to_chat(AI, span_warning("You are already loaded into an onboard computer!")) return - if(!GLOB.cameranet.checkCameraVis(owner)) + if(!SScameras.is_visible_by_cameras(owner)) to_chat(AI, span_warning("Target is no longer near active cameras.")) return if(!isturf(AI.loc)) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index cd3d4b9e9365..09bdd931fddd 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -94,8 +94,8 @@ /obj/structure/closet/crate/necropolis/colossus name = "colossus chest" -/obj/structure/closet/crate/necropolis/colossus/bullet_act(obj/projectile/proj) - if(istype(proj, /obj/projectile/colossus)) +/obj/structure/closet/crate/necropolis/colossus/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) + if(istype(hitting_projectile, /obj/projectile/colossus)) return BULLET_ACT_FORCE_PIERCE return ..() @@ -134,3 +134,4 @@ icon = 'icons/obj/mining_zones/artefacts.dmi' icon_state = "skeleton_key" w_class = WEIGHT_CLASS_SMALL + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 5) diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index d0c63bd3b7aa..f41c0aeef174 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -142,7 +142,7 @@ ///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 + var/datum/material_container/materials /// What can be input into the machine? var/accepted_type = /obj/item/stack @@ -150,8 +150,8 @@ . = ..() proximity_monitor = new(src, 1) - materials = AddComponent( \ - /datum/component/material_container, \ + materials = new ( \ + src, \ SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ INFINITY, \ MATCONTAINER_EXAMINE, \ @@ -163,7 +163,8 @@ selected_material = GET_MATERIAL_REF(/datum/material/iron) /obj/machinery/mineral/processing_unit/Destroy() - materials = null + QDEL_NULL(proximity_monitor) + QDEL_NULL(materials) mineral_machine = null stored_research = null return ..() @@ -248,7 +249,7 @@ on = FALSE else var/out = get_step(src, output_dir) - materials.retrieve_sheets(sheets_to_remove, mat, out) + materials.retrieve_stack(sheets_to_remove, mat, out) /obj/machinery/mineral/processing_unit/proc/smelt_alloy(seconds_per_tick = 2) var/datum/design/alloy = stored_research.isDesignResearchedID(selected_alloy) //check if it's a valid design diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index d3d05077b7e3..e32783b5e252 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -41,7 +41,7 @@ /// References the alloys the smelter can create var/datum/techweb/stored_research /// Linkage to the ORM silo - var/datum/component/remote_materials/materials + var/datum/remote_materials/materials /obj/machinery/mineral/ore_redemption/offstation circuit = /obj/item/circuitboard/machine/ore_redemption/offstation @@ -59,8 +59,8 @@ local_signals = list( COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/mineral/ore_redemption, local_redeem_points) ) - materials = AddComponent( \ - /datum/component/remote_materials, \ + materials = new ( \ + src, \ mapload, \ mat_container_signals = local_signals \ ) @@ -70,7 +70,7 @@ /obj/machinery/mineral/ore_redemption/Destroy() stored_research = null - materials = null + QDEL_NULL(materials) return ..() /obj/machinery/mineral/ore_redemption/examine(mob/user) @@ -92,7 +92,7 @@ /// Returns the amount of a specific alloy design, based on the accessible materials /obj/machinery/mineral/ore_redemption/proc/can_smelt_alloy(datum/design/D) - var/datum/component/material_container/mat_container = materials.mat_container + var/datum/material_container/mat_container = materials.mat_container if(!mat_container || D.make_reagent) return FALSE @@ -119,7 +119,7 @@ /// Sends a message to the request consoles that signed up for ore updates /obj/machinery/mineral/ore_redemption/proc/send_console_message() - var/datum/component/material_container/mat_container = materials.mat_container + var/datum/material_container/mat_container = materials.mat_container if(!mat_container || !is_station_level(z)) return @@ -160,6 +160,7 @@ gathered_ores += tool else if(tool.atom_storage && !tool.atom_storage.locked) tool.atom_storage.remove_type(/obj/item/stack/ore, src, check_adjacent = TRUE, user = user, inserted = gathered_ores) + if(!gathered_ores.len) return ..() @@ -168,7 +169,7 @@ if(isnull(smelted_ore)) continue - if(materials.insert_item(smelted_ore, ore_multiplier) <= 0) + if(materials.insert_item(smelted_ore, ore_multiplier, ID_DATA(user)) <= 0) unload_mineral(smelted_ore) return ITEM_INTERACT_SUCCESS @@ -176,9 +177,13 @@ /obj/machinery/mineral/ore_redemption/pickup_item(datum/source, atom/movable/target, direction) if(QDELETED(target)) return + if(!materials.mat_container || panel_open || !powered()) return + var/alist/user_data = null + if (isliving(target.pulledby)) + user_data = ID_DATA(target.pulledby) //gethering the ore var/list/obj/item/stack/ore/ore_list = list() if(istype(target, /obj/structure/ore_box)) @@ -196,7 +201,7 @@ if(isnull(smelted_ore)) continue - if(materials.insert_item(smelted_ore, ore_multiplier) <= 0) + if(materials.insert_item(smelted_ore, ore_multiplier, user_data) <= 0) unload_mineral(smelted_ore) //if rejected unload if(!console_notify_timer) @@ -245,7 +250,7 @@ var/list/data = list() data["unclaimedPoints"] = points data["materials"] = list() - var/datum/component/material_container/mat_container = materials.mat_container + var/datum/material_container/mat_container = materials.mat_container if (mat_container) for(var/datum/material/material as anything in mat_container.materials) var/amount = mat_container.materials[material] @@ -290,7 +295,7 @@ if(card?.registered_account) data["user"] = list( "name" = card.registered_account.account_holder, - "cash" = card.registered_account.account_balance, + "cash" = card.registered_account.mining_points, ) else if(issilicon(user)) @@ -305,7 +310,7 @@ . = ..() if(.) return - var/datum/component/material_container/mat_container = materials.mat_container + var/datum/material_container/mat_container = materials.mat_container switch(action) if("Claim") //requires silo but silo not in range diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 82b87421d299..27eae573c878 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -38,9 +38,9 @@ /// List of all connected components that are on hold from accessing materials. 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() + var/list/datum/remote_materials/ore_connected_machines = list() /// Material Container - var/datum/component/material_container/materials + var/datum/material_container/materials /// A list of names of bank account IDs that are banned from using this ore silo. var/list/banned_users = list() ///The machine's internal radio, used to broadcast alerts. @@ -71,14 +71,14 @@ /obj/machinery/ore_silo/Initialize(mapload) . = ..() - materials = AddComponent( \ - /datum/component/material_container, \ + materials = new ( \ + src, \ SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ INFINITY, \ MATCONTAINER_EXAMINE, \ container_signals = list( \ COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/ore_silo, on_item_consumed), \ - COMSIG_MATCONTAINER_SHEETS_RETRIEVED = TYPE_PROC_REF(/obj/machinery/ore_silo, log_sheets_ejected), \ + COMSIG_MATCONTAINER_STACK_RETRIEVED = TYPE_PROC_REF(/obj/machinery/ore_silo, log_sheets_ejected), \ ), \ allowed_items = /obj/item/stack \ ) @@ -95,11 +95,11 @@ if (GLOB.ore_silo_default == src) GLOB.ore_silo_default = null - for(var/datum/component/remote_materials/mats as anything in ore_connected_machines) + for(var/datum/remote_materials/mats as anything in ore_connected_machines) mats.disconnect() ore_connected_machines = null - materials = null + QDEL_NULL(materials) QDEL_NULL(radio) return ..() @@ -146,14 +146,14 @@ context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" return CONTEXTUAL_SCREENTIP_SET -/obj/machinery/ore_silo/proc/on_item_consumed(datum/component/material_container/container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context, alist/user_data) +/obj/machinery/ore_silo/proc/on_item_consumed(datum/material_container/container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context, alist/user_data) SIGNAL_HANDLER silo_log(context, "DEPOSITED", amount_inserted, item_inserted.name, mats_consumed, user_data) SEND_SIGNAL(context, COMSIG_SILO_ITEM_CONSUMED, container, item_inserted, last_inserted_id, mats_consumed, amount_inserted) -/obj/machinery/ore_silo/proc/log_sheets_ejected(datum/component/material_container/container, obj/item/stack/sheet/sheets, atom/context, alist/user_data) +/obj/machinery/ore_silo/proc/log_sheets_ejected(datum/material_container/container, obj/item/stack/sheet/sheets, atom/context, alist/user_data) SIGNAL_HANDLER silo_log(context, "WITHDRAWN", -sheets.amount * SHEET_MATERIAL_AMOUNT, "[sheets.name]", sheets.custom_materials, user_data) @@ -178,12 +178,12 @@ * The logic for disconnecting a remote receptacle (RCD, fabricator, etc.) is collected here for sanity's sake * rather than being on specific types. Serves to agnosticize the remote_materials component somewhat rather than * snowflaking code for silos into the component. - * * receptacle - The datum/component/remote_materials component that is getting connected. + * * receptacle - The datum/remote_materials component that is getting connected. * * physical_receptacle - the actual object in the game world that was connected to our material supply. Typed as atom/movable for * future-proofing against anything that may conceivably one day have remote silo access, such as a cyborg, an implant, structures, vehicles, * and so-on. */ -/obj/machinery/ore_silo/proc/connect_receptacle(datum/component/remote_materials/receptacle, atom/movable/physical_receptacle) +/obj/machinery/ore_silo/proc/connect_receptacle(datum/remote_materials/receptacle, atom/movable/physical_receptacle) ore_connected_machines += receptacle receptacle.mat_container = src.materials receptacle.silo = src @@ -192,12 +192,12 @@ /** * The logic for disconnecting a remote receptacle (RCD, fabricator, etc.) is collected here for sanity's sake * rather than being on specific types. Cleans up references to us and to the receptacle. - * * receptacle - The datum/component/remote_materials component that is getting destroyed. + * * receptacle - The datum/remote_materials component that is getting destroyed. * * physical_receptacle - the actual object in the game world that was connected to our material supply. Typed as atom/movable for * future-proofing against anything that may conceivably one day have remote silo access, such as a cyborg, an implant, structures, vehicles, * and so-on. */ -/obj/machinery/ore_silo/proc/disconnect_receptacle(datum/component/remote_materials/receptacle, atom/movable/physical_receptacle) +/obj/machinery/ore_silo/proc/disconnect_receptacle(datum/remote_materials/receptacle, atom/movable/physical_receptacle) ore_connected_machines -= receptacle receptacle.mat_container = null receptacle.silo = null @@ -249,7 +249,7 @@ data["materials"] = materials.ui_data() data["machines"] = list() - for(var/datum/component/remote_materials/remote as anything in ore_connected_machines) + for(var/datum/remote_materials/remote as anything in ore_connected_machines) var/atom/parent = remote.parent data["machines"] += list( list( @@ -294,7 +294,7 @@ if(isnull(index)) return - var/datum/component/remote_materials/remote = ore_connected_machines[index] + var/datum/remote_materials/remote = ore_connected_machines[index] if(isnull(remote)) return @@ -310,7 +310,7 @@ if(isnull(index)) return - var/datum/component/remote_materials/remote = ore_connected_machines[index] + var/datum/remote_materials/remote = ore_connected_machines[index] if(isnull(remote)) return @@ -330,7 +330,7 @@ if(isnull(amount)) return - materials.retrieve_sheets(amount, ejecting, drop_location(), user_data = ID_DATA(ui.user)) + materials.retrieve_stack(amount, ejecting, drop_location(), user_data = ID_DATA(ui.user)) return TRUE if("toggle_ban") diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index cf04c6e86ac9..bcab99a54bed 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -99,7 +99,7 @@ var/stk_amt = list() var/stack_list[0] //Key: Type. Value: Instance of type. var/stack_amt = 50 //amount to stack before releassing - var/datum/component/remote_materials/materials + var/datum/remote_materials/materials var/force_connect = FALSE ///Proximity monitor associated with this atom, needed for proximity checks. var/datum/proximity_monitor/proximity_monitor @@ -112,8 +112,8 @@ /obj/machinery/mineral/stacking_machine/Initialize(mapload) . = ..() proximity_monitor = new(src, 1) - materials = AddComponent( - /datum/component/remote_materials, \ + materials = new ( + src, \ mapload, \ FALSE, \ (mapload && force_connect) \ @@ -123,7 +123,8 @@ if(!isnull(console)) console.machine = null console = null - materials = null + QDEL_NULL(proximity_monitor) + QDEL_NULL(materials) return ..() /obj/machinery/mineral/stacking_machine/HasProximity(atom/movable/entered) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 2d12eaf2d184..88aa662c168e 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -112,10 +112,11 @@ w_class = WEIGHT_CLASS_TINY mine_experience = 0 //its sand merge_type = /obj/item/stack/ore/glass + usable_for_construction = TRUE GLOBAL_LIST_INIT(sand_recipes, list(\ new /datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_TOOLS), \ - new /datum/stack_recipe("sandstone", /obj/item/stack/sheet/mineral/sandstone, 1, 1, 50, crafting_flags = NONE, category = CAT_MISC),\ + new /datum/stack_recipe("sandstone", /obj/item/stack/sheet/mineral/sandstone, 1, 1, 50, crafting_flags = CRAFT_NO_MATERIALS, category = CAT_MISC),\ new /datum/stack_recipe("aesthetic volcanic floor tile", /obj/item/stack/tile/basalt, 2, 1, 50, crafting_flags = NONE, category = CAT_TILES)\ )) @@ -124,7 +125,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ AddComponent(/datum/component/storm_hating) /obj/item/stack/ore/glass/on_orm_collection() //we need to smelt the glass beforehand because the silo and orm don't accept sand mats - var/obj/item/stack/sheet/glass = new refined_type(drop_location(), amount, merge = FALSE) //The newly spawned glass should not merge with other stacks on the turf, else it could cause issues. + //If we spawn the sheet of glass on the turf the ORM is "listening" to, it'll get redeemed before we can use it as return value and weird stuff my happen. + var/obj/item/stack/sheet/glass = new refined_type(null, amount) qdel(src) return glass @@ -140,7 +142,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ C.visible_message(span_danger("[C]'s eye protection blocks the sand!"), span_warning("Your eye protection blocks the sand!")) return C.adjust_eye_blur(12 SECONDS) - C.adjustStaminaLoss(15)//the pain from your eyes burning does stamina damage + C.adjust_stamina_loss(15)//the pain from your eyes burning does stamina damage C.adjust_confusion(5 SECONDS) to_chat(C, span_userdanger("\The [src] gets into your eyes! The pain, it burns!")) qdel(src) @@ -213,6 +215,10 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ scan_state = "rock_diamond" merge_type = /obj/item/stack/ore/diamond +/obj/item/stack/ore/diamond/Initialize(mapload) + . = ..() + AddElement(/datum/element/raptor_food, speed_modifier = 0.05, health_modifier = -1, color_chances = string_list(list(/datum/raptor_color/yellow = 3))) + /obj/item/stack/ore/diamond/five amount = 5 @@ -477,7 +483,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ var/index = sideslist.Find(coinflip) if (index == 2)//tails user.visible_message(span_suicide("\the [src] lands on [coinflip]! [user] promptly falls over, dead!")) - user.adjustOxyLoss(200) + user.adjust_oxy_loss(200) user.death(FALSE) user.set_suicide(TRUE) user.suicide_log() @@ -486,7 +492,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/coin/examine(mob/user) . = ..() - . += span_info("It's worth [value] credit\s.") + . += span_info("It's worth [value] [MONEY_NAME_AUTOPURAL(value)].") /obj/item/coin/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/stack/cable_coil)) @@ -547,46 +553,66 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/coin/gold custom_materials = list(/datum/material/gold = COIN_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/gold = 4) + +/obj/item/coin/gold/grind_results() + return list(/datum/reagent/gold = 4) /obj/item/coin/silver custom_materials = list(/datum/material/silver = COIN_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/silver = 4) + +/obj/item/coin/silver/grind_results() + return list(/datum/reagent/silver = 4) /obj/item/coin/diamond custom_materials = list(/datum/material/diamond = COIN_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/carbon = 4) + +/obj/item/coin/diamond/grind_results() + return list(/datum/reagent/carbon = 4) /obj/item/coin/plasma custom_materials = list(/datum/material/plasma = COIN_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/toxin/plasma = 4) + +/obj/item/coin/plasma/grind_results() + return list(/datum/reagent/toxin/plasma = 4) /obj/item/coin/uranium custom_materials = list(/datum/material/uranium = COIN_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/uranium = 4) + +/obj/item/coin/uranium/grind_results() + return list(/datum/reagent/uranium = 4) /obj/item/coin/titanium custom_materials = list(/datum/material/titanium = COIN_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/flash_powder = 4) + +/obj/item/coin/titanium/grind_results() + return list(/datum/reagent/flash_powder = 4) /obj/item/coin/bananium custom_materials = list(/datum/material/bananium = COIN_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/consumable/nutriment/soup/clown_tears = 4) + +/obj/item/coin/bananium/grind_results() + return list(/datum/reagent/consumable/nutriment/soup/clown_tears = 4) /obj/item/coin/adamantine custom_materials = list(/datum/material/adamantine = COIN_MATERIAL_AMOUNT) /obj/item/coin/mythril custom_materials = list(/datum/material/mythril = COIN_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/medicine/omnizine/godblood = 4) + +/obj/item/coin/mythril/grind_results() + return list(/datum/reagent/medicine/omnizine/godblood = 4) /obj/item/coin/plastic custom_materials = list(/datum/material/plastic = COIN_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/plastic_polymers = 4) + +/obj/item/coin/plastic/grind_results() + return list(/datum/reagent/plastic_polymers = 4) /obj/item/coin/runite custom_materials = list(/datum/material/runite = COIN_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/iron = 2, /datum/reagent/consumable/ethanol/ritual_wine = 2) + +/obj/item/coin/runite/grind_results() + return list(/datum/reagent/iron = 2, /datum/reagent/consumable/ethanol/ritual_wine = 2) /obj/item/coin/twoheaded desc = "Hey, this coin's the same on both sides!" @@ -601,16 +627,20 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ heads_name = "valid" material_flags = NONE override_material_worth = TRUE - grind_results = list(/datum/reagent/ants = 2, /datum/reagent/consumable/eggyolk = 2) -/obj/item/coin/iron - grind_results = list(/datum/reagent/iron = 4) +/obj/item/coin/antagtoken/grind_results() + return list(/datum/reagent/ants = 2, /datum/reagent/consumable/eggyolk = 2) + +/obj/item/coin/iron/grind_results() + return list(/datum/reagent/iron = 4) /obj/item/coin/gold/debug custom_materials = list(/datum/material/gold = COIN_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/gold/cursed = 4) desc = "If you got this somehow, be aware that it will dust you. Almost certainly." +/obj/item/coin/gold/debug/grind_results() + return list(/datum/reagent/gold/cursed = 4) + /obj/item/coin/gold/debug/attack_self(mob/user) if(cooldown < world.time) if(string_attached) //does the coin have a wire attached @@ -646,19 +676,21 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ name = "eldritch coin" desc = "A surprisingly heavy, ornate coin. Its sides seem to depict a different image each time you look." icon_state = "coin_heretic" - custom_materials = list(/datum/material/diamond =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plasma =HALF_SHEET_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT) sideslist = list("heretic", "blade") heads_name = "heretic" has_action = TRUE material_flags = NONE - grind_results = list(/datum/reagent/carbon = 5, /datum/reagent/toxin/plasma = 5, /datum/reagent/eldritch = 4) /// The range at which airlocks are effected. var/airlock_range = 5 +/obj/item/coin/eldritch/grind_results() + return list(/datum/reagent/carbon = 5, /datum/reagent/toxin/plasma = 5, /datum/reagent/eldritch = 4) + /obj/item/coin/eldritch/heads_action(mob/user) var/mob/living/living_user = user if(!IS_HERETIC(user)) - living_user.adjustBruteLoss(5) + living_user.adjust_brute_loss(5) return for(var/obj/machinery/door/airlock/target_airlock in range(airlock_range, user)) if(target_airlock.density) @@ -669,7 +701,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/coin/eldritch/tails_action(mob/user) var/mob/living/living_user = user if(!IS_HERETIC(user)) - living_user.adjustFireLoss(5) + living_user.adjust_fire_loss(5) return for(var/obj/machinery/door/airlock/target_airlock in range(airlock_range, user)) if(target_airlock.locked) @@ -677,17 +709,4 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ continue target_airlock.lock() -/obj/item/coin/eldritch/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - if(!istype(interacting_with, /obj/machinery/door/airlock)) - return NONE - if(!IS_HERETIC(user)) - user.adjustBruteLoss(5) - user.adjustFireLoss(5) - return ITEM_INTERACT_BLOCKING - var/obj/machinery/door/airlock/target_airlock = interacting_with - to_chat(user, span_warning("You insert [src] into the airlock.")) - target_airlock.emag_act(user, src) - qdel(src) - return ITEM_INTERACT_SUCCESS - #undef ORESTACK_OVERLAYS_MAX diff --git a/code/modules/mining/satchel_ore_box.dm b/code/modules/mining/satchel_ore_box.dm index 79bc8618a04f..0c2011e2c546 100644 --- a/code/modules/mining/satchel_ore_box.dm +++ b/code/modules/mining/satchel_ore_box.dm @@ -8,6 +8,7 @@ desc = "A heavy wooden box, which can be filled with a lot of ores or boulders" density = TRUE pressure_resistance = 5 * ONE_ATMOSPHERE + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 4) /obj/structure/ore_box/Initialize(mapload) . = ..() diff --git a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm index 0c41f717c062..5854c455346a 100644 --- a/code/modules/mob/dead/new_player/login.dm +++ b/code/modules/mob/dead/new_player/login.dm @@ -56,4 +56,11 @@ var/tl = SSticker.GetTimeLeft() to_chat(src, "Please set up your character and select \"Ready\". The game will start [tl > 0 ? "in about [DisplayTimeText(tl)]" : "soon"].") + if(GLOB.unrecommended_builds[num2text(client.byond_build)]) + INVOKE_ASYNC(src, PROC_REF(unrcommended_build_alert)) +/mob/dead/new_player/proc/unrcommended_build_alert() + var/warning = "Hey! The build of byond you are running ([client.byond_build]) has one or more potential issues that may cause major gameplay disruptions.\n\n\ + You may continue to play, but be aware you may encounter the following issue while playing:\n\"[GLOB.unrecommended_builds[num2text(client.byond_build)]]\"\n\n\ + If possible, we recommend updating your BYOND version.\nIf you are on the latest version, download an earlier release instead from www.byond.com/download/build." + alert(src, warning, "Bad BYOND Build", "OK") diff --git a/code/modules/mob/dead/new_player/logout.dm b/code/modules/mob/dead/new_player/logout.dm index 45412c994bfe..36dfe6c4aed6 100644 --- a/code/modules/mob/dead/new_player/logout.dm +++ b/code/modules/mob/dead/new_player/logout.dm @@ -1,5 +1,5 @@ /mob/dead/new_player/Logout() - ready = 0 + ready = PLAYER_NOT_READY ..() if(!spawning)//Here so that if they are spawning and log out, the other procs can play out and they will have a mob to come back to. key = null//We null their key before deleting the mob, so they are properly kicked out. diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index a174d502aeca..5be621575c8c 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -8,7 +8,9 @@ hud_type = /datum/hud/new_player hud_possible = list() - var/ready = FALSE + /// String Values tied to Defines that state whether the new_player is ready to play or not. + /// Do try your best to compare this value directly against the defines for certainty but helper procs do exist in bulkier situations. + var/ready = PLAYER_NOT_READY /// Referenced when you want to delete the new_player later on in the code. var/spawning = FALSE /// For instant transfer once the round is set up @@ -64,6 +66,12 @@ var/datum/poll_question/poll = locate(href_list["votepollref"]) in GLOB.polls vote_on_poll_handler(poll, href_list) +/// Quickly gets a boolean of whether the new_player is ready to play or not in places where we would like the boolean logic. +/// The assertion is that readiness must be an opted in TRUE, while all other states (e.g. not ready, broken, etc) are FALSE. +/// We organize it this way to ensure the system is extensible for other possible ready states. +/mob/dead/new_player/proc/is_ready_to_play() + return ready == PLAYER_READY_TO_PLAY + //When you cop out of the round (NB: this HAS A SLEEP FOR PLAYER INPUT IN IT) /mob/dead/new_player/proc/make_me_an_observer() if(QDELETED(src) || !src.client) @@ -125,6 +133,20 @@ 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]." + // DARKPACK EDIT START + if(JOB_UNAVAILABLE_SPECIES) + return "You can't play [jobtitle] as this species." + if(JOB_UNAVAILABLE_SPECIES_SLOTS) + return "[jobtitle] doesn't have any free species slots for you." + if(JOB_UNAVAILABLE_WHITELIST) + return "You aren't whitelisted for [jobtitle]." + if(JOB_UNAVAILABLE_KINDRED_AGE) + return "Your character is too young for [jobtitle]." + if(JOB_UNAVAILABLE_KINDRED_GENERATION) + return "Your character's generation is too high for [jobtitle]." + if(JOB_UNAVAILABLE_KINDRED_CLAN) + return "Your character's clan is incompatible for [jobtitle]." + // DARKPACK EDIT END return GENERIC_JOB_UNAVAILABLE_ERROR @@ -180,6 +202,8 @@ tgui_alert(usr, "There was an unexpected error putting you into your requested job. If you cannot join with any job, you should contact an admin.") return FALSE + var/latejoin_period = CEILING(STATION_TIME_PASSED() / (5 MINUTES), 5) + SSblackbox.record_feedback("tally", "latejoin_time", 1, latejoin_period) mind.late_joiner = TRUE var/atom/destination = mind.assigned_role.get_latejoin_spawn_point() if(!destination) @@ -198,7 +222,7 @@ var/is_captain = IS_NOT_CAPTAIN var/captain_sound = 'sound/announcer/notice/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)) + if(is_prince_job(job)) // DARKPACK EDIT, ORIGINAL: if(is_captain_job(job)) is_captain = IS_FULL_CAPTAIN captain_sound = 'sound/announcer/announcement/announce.ogg' // If we don't have an assigned cap yet, check if this person qualifies for some from of captaincy. @@ -235,8 +259,12 @@ if(CONFIG_GET(flag/allow_latejoin_antagonists) && !EMERGENCY_PAST_POINT_OF_NO_RETURN && humanc) //Borgs aren't allowed to be antags. Will need to be tweaked if we get true latejoin ais. SSdynamic.on_latejoin(humanc) - if((job.job_flags & JOB_ASSIGN_QUIRKS) && humanc && CONFIG_GET(flag/roundstart_traits)) - SSquirks.AssignQuirks(humanc, humanc.client) + if(humanc) + if(job.job_flags & JOB_ASSIGN_QUIRKS) + if(CONFIG_GET(flag/roundstart_traits)) + SSquirks.AssignQuirks(humanc, humanc.client) + else // clear any personalities the prefs added since our job clearly does not want them + humanc.clear_personalities() if(humanc) // Quirks may change manifest datapoints, so inject only after assigning quirks GLOB.manifest.inject(humanc) diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 1b56b5996513..c110d53703d8 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -94,7 +94,7 @@ return preview_job /datum/preferences/proc/render_new_preview_appearance(mob/living/carbon/human/dummy/mannequin, show_job_clothes = TRUE) - var/datum/job/no_job = SSjob.get_job_type(/datum/job/unassigned) + var/datum/job/no_job = SSjob.get_job_type(/datum/job/vampire/unassigned) // DARKPACK EDIT, ORIGINAL: var/datum/job/no_job = SSjob.get_job_type(/datum/job/unassigned) var/datum/job/preview_job = get_highest_priority_job() || no_job if(preview_job) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 968a6090b896..927fae7d15fd 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -11,7 +11,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) plane = GHOST_PLANE stat = DEAD density = FALSE - see_invisible = SEE_INVISIBLE_OBSERVER + see_invisible = OBSERVER_SIGHT //DARKPACK EDIT, Original : see_invisible = SEE_INVISIBLE_OBSERVER lighting_cutoff = LIGHTING_CUTOFF_MEDIUM invisibility = INVISIBILITY_OBSERVER hud_type = /datum/hud/ghost @@ -22,9 +22,11 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) light_on = FALSE shift_to_open_context_menu = FALSE var/can_reenter_corpse - var/started_as_observer //This variable is set to 1 when you enter the game as an observer. - //If you died in the game and are a ghost - this will remain as null. - //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. + ///This variable is set to 1 when you enter the game as an observer. + ///If you died in the game and are a ghost - this will remain as FALSE. + ///Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. + var/started_as_observer = FALSE + var/atom/movable/following = null ///The time between being able to use boo(), if fun_verbs is TRUE. @@ -148,6 +150,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) SSpoints_of_interest.make_point_of_interest(src) ADD_TRAIT(src, TRAIT_HEAR_THROUGH_DARKNESS, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_GOOD_HEARING, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_DETECT_STORM, INNATE_TRAIT) /mob/dead/observer/get_photo_description(obj/item/camera/camera) if(!invisibility || camera.see_ghosts) @@ -697,7 +700,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!(ghost_hud_flags & GHOST_VISION)) set_invis_see(SEE_INVISIBLE_LIVING) else - set_invis_see(SEE_INVISIBLE_OBSERVER) + set_invis_see(OBSERVER_SIGHT) //DARKPACK EDIT, Original : see_invisible = SEE_INVISIBLE_OBSERVER updateghostimages() diff --git a/code/modules/mob/dead/observer/observer_say.dm b/code/modules/mob/dead/observer/observer_say.dm index 2c9c37dd79ab..62b6f24e063b 100644 --- a/code/modules/mob/dead/observer/observer_say.dm +++ b/code/modules/mob/dead/observer/observer_say.dm @@ -58,7 +58,7 @@ . = say_dead(message) -/mob/dead/observer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/mob/dead/observer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /mob/dead/observer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) . = ..() var/atom/movable/to_follow = speaker if(radio_freq) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 0781881011c7..28c2f2e72821 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -12,7 +12,7 @@ #define BEYBLADE_CONFUSION_LIMIT (40 SECONDS) //The code execution of the emote datum is located at code/datums/emotes.dm -/mob/proc/emote(act, m_type = null, message = null, intentional = FALSE, force_silence = FALSE, forced = FALSE) +/mob/proc/emote(act, type_override = NONE, message = null, intentional = FALSE, force_silence = FALSE, forced = FALSE) var/param = message var/custom_param = findchar(act, " ") if(custom_param) @@ -33,11 +33,11 @@ continue if(!forced && !emote.can_run_emote(src, TRUE, intentional, param)) continue - if(SEND_SIGNAL(src, COMSIG_MOB_PRE_EMOTED, emote.key, param, m_type, intentional, emote) & COMPONENT_CANT_EMOTE) + if(SEND_SIGNAL(src, COMSIG_MOB_PRE_EMOTED, emote.key, param, type_override, intentional, emote) & COMPONENT_CANT_EMOTE) silenced = TRUE continue - emote.run_emote(src, param, m_type, intentional) - SEND_SIGNAL(src, COMSIG_MOB_EMOTE, emote, act, m_type, message, intentional) + emote.run_emote(src, param, type_override, intentional) + SEND_SIGNAL(src, COMSIG_MOB_EMOTE, emote, act, type_override, message, intentional) SEND_SIGNAL(src, COMSIG_MOB_EMOTED(emote.key)) return TRUE if(intentional && !silenced && !force_silence) @@ -80,10 +80,14 @@ hands_use_check = TRUE mob_type_allowed_typecache = list(/mob/living, /mob/dead/observer, /mob/eye/imaginary_friend) mob_type_ignore_stat_typecache = list(/mob/dead/observer, /mob/living/silicon/ai, /mob/eye/imaginary_friend) + /// The probability we fall our our arse + var/fall_over_prob = 60 + /// The direction we spin in. TRUE means clockwise, FALSE means counter-clockwise. + var/clockwise_spin = TRUE /datum/emote/flip/run_emote(mob/user, params , type_override, intentional) . = ..() - user.SpinAnimation(FLIP_EMOTE_DURATION, 1) + user.SpinAnimation(FLIP_EMOTE_DURATION, 1, clockwise = clockwise_spin) /datum/emote/flip/check_cooldown(mob/user, intentional) . = ..() @@ -93,20 +97,26 @@ return if(isliving(user)) var/mob/living/flippy_mcgee = user - if(prob(20)) + if(prob(fall_over_prob)) flippy_mcgee.Knockdown(1 SECONDS) flippy_mcgee.visible_message( span_notice("[flippy_mcgee] attempts to do a flip and falls over, what a doofus!"), span_notice("You attempt to do a flip while still off balance from the last flip and fall down!") ) - if(prob(50)) - flippy_mcgee.adjustBruteLoss(1) + if(prob(fall_over_prob/2)) + flippy_mcgee.adjust_brute_loss(1) else flippy_mcgee.visible_message( span_notice("[flippy_mcgee] stumbles a bit after their flip."), span_notice("You stumble a bit from still being off balance from your last flip.") ) +/datum/emote/flip/backflip + key = "backflip" + key_third_person = "backflips" + fall_over_prob = 20 + clockwise_spin = FALSE + /datum/emote/spin key = "spin" key_third_person = "spins" diff --git a/code/modules/mob/eye/camera/camera.dm b/code/modules/mob/eye/camera/camera.dm index 58019f738596..8df02a444b29 100644 --- a/code/modules/mob/eye/camera/camera.dm +++ b/code/modules/mob/eye/camera/camera.dm @@ -71,7 +71,7 @@ SHOULD_CALL_PARENT(TRUE) if(use_visibility) - GLOB.cameranet.visibility(src) + SScameras.update_eye_chunk(src) /mob/eye/camera/zMove(dir, turf/target, z_move_flags = NONE, recursions_left = 1, list/falling_movs) . = ..() diff --git a/code/modules/mob/eye/eye.dm b/code/modules/mob/eye/eye.dm index 74efd39f6106..fb3c2a4fab73 100644 --- a/code/modules/mob/eye/eye.dm +++ b/code/modules/mob/eye/eye.dm @@ -44,7 +44,7 @@ z_move_flags |= ZMOVE_IGNORE_OBSTACLES //cameras do not respect these FLOORS you speak so much of return ..() -/mob/eye/emote(act, m_type=1, message = null, intentional = FALSE, force_silence = FALSE, forced = FALSE) +/mob/eye/emote(act, type_override = EMOTE_VISIBLE, message = null, intentional = FALSE, force_silence = FALSE, forced = FALSE) if(has_emotes) return ..() return FALSE diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 11cbd18a3717..c3d55e7167b4 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -95,8 +95,14 @@ /mob/proc/get_num_held_items() . = 0 for(var/i in 1 to held_items.len) - if(held_items[i]) - .++ + if(!held_items[i]) + continue + var/obj/item/gripped_item = held_items[i] + if(HAS_TRAIT_FROM(gripped_item, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)) //prostetic limbs are not held items, they are part of the body. + continue + if(gripped_item.item_flags & ABSTRACT) //not really flavoured as items + continue + .++ //Sad that this will cause some overhead, but the alias seems necessary //*I* may be happy with a million and one references to "indexes" but others won't be @@ -175,7 +181,7 @@ I.do_pickup_animation(src) if(get_item_for_held_index(hand_index)) dropItemToGround(get_item_for_held_index(hand_index), force = TRUE) - I.forceMove(src) + I.forceMove(src) //this has to come before has_equipped() is called held_items[hand_index] = I SET_PLANE_EXPLICIT(I, ABOVE_HUD_PLANE, src) if(I.pulledby) @@ -343,9 +349,11 @@ if(isnull(to_drop)) return - var/x_offset = rand(-6, 6) - var/y_offset = rand(-6, 6) - SEND_SIGNAL(src, COMSIG_MOB_DROPPING_ITEM) + var/x_offset = 0 + var/y_offset = 0 + if(!(to_drop.item_flags & NO_PIXEL_RANDOM_DROP)) + x_offset += rand(-6, 6) + y_offset += rand(-6, 6) if(!transfer_item_to_turf(to_drop, drop_location(), x_offset, y_offset, force, silent, invdrop)) return @@ -361,6 +369,7 @@ silent = FALSE, drop_item_inventory = TRUE, ) + SEND_SIGNAL(src, COMSIG_MOB_DROPPING_ITEM) if(!doUnEquip(to_transfer, force, new_loc, no_move = FALSE, invdrop = drop_item_inventory, silent = silent)) return FALSE if(QDELETED(to_transfer)) // Some items may get deleted upon getting unequipped. @@ -373,11 +382,13 @@ //for when the item will be immediately placed in a loc other than the ground /mob/proc/transferItemToLoc(obj/item/I, newloc = null, force = FALSE, silent = TRUE, animated = null) . = doUnEquip(I, force, newloc, FALSE, silent = silent) - //This proc wears a lot of hats for moving items around in different ways, - //so we assume unhandled cases for checking to animate can safely be handled - //with the same logic we handle animating putting items in container (container on your person isn't animated) + if(!.) + return + // This proc wears a lot of hats for moving items around in different ways, + // so we assume unhandled cases for checking to animate can safely be handled + // with the same logic we handle animating putting items in container (container on your person isn't animated) if(isnull(animated)) - //if the item's ultimate location is us, we don't animate putting it wherever + // If the item's ultimate location is us, we don't animate putting it wherever animated = !(get(newloc, /mob) == src) if(animated) I.do_pickup_animation(newloc, src) @@ -429,6 +440,7 @@ item_dropping.layer = initial(item_dropping.layer) SET_PLANE_EXPLICIT(item_dropping, initial(item_dropping.plane), newloc) item_dropping.appearance_flags &= ~NO_CLIENT_COLOR + item_dropping.item_flags &= ~IN_INVENTORY //This has to come before MoveToNullspace/forceMove is called if(!no_move && !(item_dropping.item_flags & DROPDEL)) //item may be moved/qdel'd immedietely, don't bother moving it if (isnull(newloc)) item_dropping.moveToNullspace() @@ -447,15 +459,26 @@ * * Optional - include_flags, (see obj.flags.dm) describes which optional things to include or not (pockets, accessories, held items) */ -/mob/living/proc/get_equipped_items(include_flags = NONE) +/mob/proc/get_equipped_items(include_flags = NONE) var/list/items = list() for(var/obj/item/item_contents in contents) if(item_contents.item_flags & IN_INVENTORY) + if(!(include_flags & INCLUDE_PROSTHETICS) && HAS_TRAIT_FROM(item_contents, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)) //prostetic limbs are not equipped items, they are part of the body. + continue + if(!(include_flags & INCLUDE_ABSTRACT) && (item_contents.item_flags & ABSTRACT)) //not really flavoured as items + continue items += item_contents if (!(include_flags & INCLUDE_HELD)) items -= held_items + return items +///Get all items in our possession that should affect our movespeed +/mob/proc/get_equipped_speed_mod_items() + . = get_equipped_items(INCLUDE_ABSTRACT|INCLUDE_PROSTHETICS) + for(var/obj/item/thing in held_items) + if(thing.item_flags & SLOWS_WHILE_IN_HAND) + . += thing /** * Returns the items that were successfully unequipped. */ @@ -515,12 +538,16 @@ /// This proc is called after an item has been successfully handled and equipped to a slot. /mob/proc/has_equipped(obj/item/item, slot, initial = FALSE) SHOULD_CALL_PARENT(TRUE) - return item.on_equipped(src, slot, initial) + item.item_flags |= IN_INVENTORY + . = item.on_equipped(src, slot, initial) + if(.) + update_equipment_speed_mods() /// This proc is called after an item has been removed from a mob but before it has been officially deslotted. /mob/proc/has_unequipped(obj/item/item, silent = FALSE) SHOULD_CALL_PARENT(TRUE) item.dropped(src, silent) + update_equipment_speed_mods() return TRUE /** @@ -652,8 +679,8 @@ hud_used.build_hand_slots() //GetAllContents that is reasonable and not stupid -/mob/living/proc/get_all_gear(accessories = TRUE, recursive = TRUE) - var/list/processing_list = get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD | (accessories ? INCLUDE_ACCESSORIES : NONE)) +/mob/living/proc/get_all_gear(equipment_flags = INCLUDE_ACCESSORIES|INCLUDE_PROSTHETICS, recursive = TRUE) + var/list/processing_list = get_equipped_items(INCLUDE_POCKETS|INCLUDE_HELD|equipment_flags) list_clear_nulls(processing_list) // handles empty hands var/i = 0 while(i < length(processing_list)) @@ -663,8 +690,8 @@ return processing_list /// Returns a list of things that the provided mob has, including any storage-capable implants. -/mob/living/proc/gather_belongings(accessories = TRUE, recursive = TRUE) - var/list/belongings = get_all_gear(accessories, recursive) +/mob/living/proc/gather_belongings(equipment_flags = INCLUDE_ACCESSORIES|INCLUDE_PROSTHETICS, recursive = TRUE) + var/list/belongings = get_all_gear(equipment_flags, recursive) for (var/obj/item/implant/storage/internal_bag in implants) belongings += internal_bag.contents return belongings @@ -673,7 +700,7 @@ /mob/living/proc/drop_everything(del_on_drop, force, del_if_nodrop) . = list() //list of items that were successfully dropped - var/list/all_gear = get_all_gear(recursive = FALSE) + var/list/all_gear = get_all_gear(INCLUDE_ACCESSORIES, recursive = FALSE) for(var/obj/item/item in all_gear) if(dropItemToGround(item, force)) if(QDELETED(item)) //DROPDEL can cause this item to be deleted @@ -682,7 +709,7 @@ qdel(item) continue . += item - else if(del_if_nodrop && !(item.item_flags & ABSTRACT)) + else if(del_if_nodrop) qdel(item) /** diff --git a/code/modules/mob/living/basic/alien/_alien.dm b/code/modules/mob/living/basic/alien/_alien.dm index eec5ae92ee2c..af0bd3491722 100644 --- a/code/modules/mob/living/basic/alien/_alien.dm +++ b/code/modules/mob/living/basic/alien/_alien.dm @@ -47,7 +47,7 @@ unsuitable_heat_damage = 20 ai_controller = /datum/ai_controller/basic_controller/alien - blood_volume = BLOOD_VOLUME_NORMAL + default_blood_volume = BLOOD_VOLUME_NORMAL ///List of loot items to drop when deleted, if this is set then we apply DEL_ON_DEATH var/list/loot diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index dd6f1ff8b316..05009756b990 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -166,7 +166,7 @@ /mob/living/basic/Life(seconds_per_tick = SSMOBS_DT, times_fired) . = ..() if(staminaloss > 0) - adjustStaminaLoss(-stamina_recovery * seconds_per_tick, forced = TRUE) + adjust_stamina_loss(-stamina_recovery * seconds_per_tick, forced = TRUE) /mob/living/basic/get_default_say_verb() return length(speak_emote) ? pick(speak_emote) : ..() diff --git a/code/modules/mob/living/basic/blob_minions/blob_mob.dm b/code/modules/mob/living/basic/blob_minions/blob_mob.dm index 77671ced07ad..8d24dccd7dfa 100644 --- a/code/modules/mob/living/basic/blob_minions/blob_mob.dm +++ b/code/modules/mob/living/basic/blob_minions/blob_mob.dm @@ -1,5 +1,6 @@ /// Root of shared behaviour for mobs spawned by blobs, is abstract and should not be spawned /mob/living/basic/blob_minion + abstract_type = /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' @@ -7,7 +8,6 @@ base_icon_state = "blob_head" unique_name = TRUE status_flags = CANPUSH - pass_flags = PASSBLOB faction = list(ROLE_BLOB) combat_mode = TRUE bubble_icon = "blob" @@ -25,6 +25,11 @@ var/death_cloud_size = BLOBMOB_CLOUD_NONE var/loot = /obj/item/food/spore_sack +/mob/living/basic/blob_minion/New(loc, blob_borne) + . = ..() + if(blob_borne) + pass_flags = PASSBLOB + /mob/living/basic/blob_minion/Initialize(mapload) . = ..() add_traits(list(TRAIT_BLOB_ALLY, TRAIT_MUTE), INNATE_TRAIT) diff --git a/code/modules/mob/living/basic/blob_minions/blob_spore.dm b/code/modules/mob/living/basic/blob_minions/blob_spore.dm index e78e67602b5e..bee1e255ab12 100644 --- a/code/modules/mob/living/basic/blob_minions/blob_spore.dm +++ b/code/modules/mob/living/basic/blob_minions/blob_spore.dm @@ -52,6 +52,7 @@ /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.pass_flags |= PASSBLOB //No way to pass the blob_borne info through change_mob_type() to Initilize(), so we just circumvent it here. blombie.faction |= faction //inherit the spore's faction in case it was spawned with a different one (eg gold core) blombie.set_name() if (istype(blombie)) // In case of badmin diff --git a/code/modules/mob/living/basic/boss/boss.dm b/code/modules/mob/living/basic/boss/boss.dm index cfb6879ec310..b932dd70b581 100644 --- a/code/modules/mob/living/basic/boss/boss.dm +++ b/code/modules/mob/living/basic/boss/boss.dm @@ -74,7 +74,7 @@ qdel(victim.get_organ_slot(ORGAN_SLOT_LUNGS)) qdel(victim.get_organ_slot(ORGAN_SLOT_HEART)) qdel(victim.get_organ_slot(ORGAN_SLOT_LIVER)) - victim.adjustBruteLoss(500) + victim.adjust_brute_loss(500) victim.death() //make sure they die victim.apply_status_effect(/datum/status_effect/gutted) return TRUE @@ -87,12 +87,12 @@ /mob/living/basic/boss/ex_act(severity, target) switch (severity) if (EXPLODE_DEVASTATE) - adjustBruteLoss(250) + adjust_brute_loss(250) if (EXPLODE_HEAVY) - adjustBruteLoss(100) + adjust_brute_loss(100) if (EXPLODE_LIGHT) - adjustBruteLoss(50) + adjust_brute_loss(50) return TRUE diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm index 4cdf7f8ecf32..ca0b768d5cb8 100644 --- a/code/modules/mob/living/basic/bots/_bots.dm +++ b/code/modules/mob/living/basic/bots/_bots.dm @@ -9,6 +9,7 @@ GLOBAL_LIST_INIT(command_strings, list( #define SENTIENT_BOT_RESET_TIMER 45 SECONDS /mob/living/basic/bot + abstract_type = /mob/living/basic/bot icon = 'icons/mob/silicon/aibots.dmi' layer = MOB_LAYER gender = NEUTER @@ -84,7 +85,7 @@ GLOBAL_LIST_INIT(command_strings, list( var/list/current_pathed_turfs = list() ///The type of data HUD the bot uses. Diagnostic by default. - var/data_hud_type = DATA_HUD_DIAGNOSTIC + var/data_hud_type = TRAIT_DIAGNOSTIC_HUD /// If true we will allow ghosts to control this mob var/can_be_possessed = FALSE /// Message to display upon possession @@ -131,16 +132,15 @@ GLOBAL_LIST_INIT(command_strings, list( //Adds bot to the diagnostic HUD system prepare_huds() - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_atom_to_hud(src) + var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC] + diag_hud.add_atom_to_hud(src) diag_hud_set_bothealth() diag_hud_set_botstat() diag_hud_set_botmode() //If a bot has its own HUD (for player bots), provide it. if(!isnull(data_hud_type)) - var/datum/atom_hud/datahud = GLOB.huds[data_hud_type] - datahud.show_to(src) + ADD_TRAIT(src, data_hud_type, INNATE_TRAIT) 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) @@ -771,7 +771,7 @@ GLOBAL_LIST_INIT(command_strings, list( update_appearance() /mob/living/basic/bot/rust_heretic_act() - adjustBruteLoss(400) + adjust_brute_loss(400) /mob/living/basic/bot/proc/attempt_access(mob/bot, obj/door_attempt) SIGNAL_HANDLER diff --git a/code/modules/mob/living/basic/bots/bot_ai.dm b/code/modules/mob/living/basic/bots/bot_ai.dm index c0c357ff71f9..4fde29dcee69 100644 --- a/code/modules/mob/living/basic/bots/bot_ai.dm +++ b/code/modules/mob/living/basic/bots/bot_ai.dm @@ -251,7 +251,7 @@ behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION action_cooldown = BOT_COMMISSIONED_SALUTE_DELAY -/datum/ai_behavior/find_and_set/valid_authority/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/valid_authority/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) for(var/mob/living/nearby_mob in oview(search_range, controller.pawn)) if(!HAS_TRAIT(nearby_mob, TRAIT_COMMISSIONED)) continue diff --git a/code/modules/mob/living/basic/bots/cleanbot/cleanbot.dm b/code/modules/mob/living/basic/bots/cleanbot/cleanbot.dm index 0fe0a6fab67b..d52b70575c52 100644 --- a/code/modules/mob/living/basic/bots/cleanbot/cleanbot.dm +++ b/code/modules/mob/living/basic/bots/cleanbot/cleanbot.dm @@ -8,6 +8,7 @@ health = 25 maxHealth = 25 light_color = "#99ccff" + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2) req_one_access = list(ACCESS_ROBOTICS, ACCESS_JANITOR) radio_key = /obj/item/encryptionkey/headset_service diff --git a/code/modules/mob/living/basic/bots/cleanbot/cleanbot_ai.dm b/code/modules/mob/living/basic/bots/cleanbot/cleanbot_ai.dm index d126615d6209..b5e860199f8a 100644 --- a/code/modules/mob/living/basic/bots/cleanbot/cleanbot_ai.dm +++ b/code/modules/mob/living/basic/bots/cleanbot/cleanbot_ai.dm @@ -69,7 +69,7 @@ /datum/ai_behavior/find_and_set/in_list/clean_targets action_cooldown = 3 SECONDS -/datum/ai_behavior/find_and_set/in_list/clean_targets/search_tactic(datum/ai_controller/basic_controller/bot/controller, locate_paths, search_range) +/datum/ai_behavior/find_and_set/in_list/clean_targets/search_tactic(datum/ai_controller/basic_controller/bot/controller, locate_paths, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/list/found = typecache_filter_list(oview(search_range, controller.pawn), locate_paths) var/list/ignore_list = controller.blackboard[BB_TEMPORARY_IGNORE_LIST] for(var/atom/found_item in found) @@ -101,7 +101,7 @@ action_cooldown = 30 SECONDS behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION -/datum/ai_behavior/find_and_set/spray_target/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/spray_target/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/list/ignore_list = controller.blackboard[BB_TEMPORARY_IGNORE_LIST] for(var/mob/living/carbon/human/human_target in oview(search_range, controller.pawn)) if(LAZYACCESS(ignore_list, human_target)) @@ -178,7 +178,7 @@ action_cooldown = 30 SECONDS behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION -/datum/ai_behavior/find_and_set/friendly_janitor/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/friendly_janitor/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/mob/living/living_pawn = controller.pawn for(var/mob/living/carbon/human/human_target in oview(search_range, living_pawn)) if(human_target.stat != CONSCIOUS || isnull(human_target.mind)) diff --git a/code/modules/mob/living/basic/bots/dedbot.dm b/code/modules/mob/living/basic/bots/dedbot.dm index 07d81bcda831..607d788b4303 100644 --- a/code/modules/mob/living/basic/bots/dedbot.dm +++ b/code/modules/mob/living/basic/bots/dedbot.dm @@ -109,7 +109,7 @@ /datum/action/cooldown/mob_cooldown/exenterate/proc/slash_em(atom/caster) for(var/mob/living/victim in range(ability_range, caster)) - if(faction_check(victim.faction, immune_factions) && owner.CanReach(victim)) + if(faction_check(victim.faction, immune_factions) && victim.IsReachableBy(owner)) continue to_chat(caster, span_warning("You slice [victim]!")) to_chat(victim, span_warning("You are cut by [caster]'s blades!")) diff --git a/code/modules/mob/living/basic/bots/firebot/firebot.dm b/code/modules/mob/living/basic/bots/firebot/firebot.dm index 1db37c6340bf..b6ef076c6293 100644 --- a/code/modules/mob/living/basic/bots/firebot/firebot.dm +++ b/code/modules/mob/living/basic/bots/firebot/firebot.dm @@ -7,6 +7,7 @@ icon_state = "firebot1" light_color = "#8cffc9" light_power = 0.8 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.9, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2) req_one_access = list(ACCESS_ROBOTICS, ACCESS_CONSTRUCTION) radio_key = /obj/item/encryptionkey/headset_eng diff --git a/code/modules/mob/living/basic/bots/honkbots/honkbot.dm b/code/modules/mob/living/basic/bots/honkbots/honkbot.dm index 13caade7c941..eb57581ae167 100644 --- a/code/modules/mob/living/basic/bots/honkbots/honkbot.dm +++ b/code/modules/mob/living/basic/bots/honkbots/honkbot.dm @@ -4,6 +4,7 @@ icon_state = "honkbot" base_icon_state = "honkbot" damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0) + custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.8, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2) req_access = list(ACCESS_ROBOTICS, ACCESS_THEATRE, ACCESS_JANITOR) radio_key = /obj/item/encryptionkey/headset_service ai_controller = /datum/ai_controller/basic_controller/bot/honkbot @@ -12,7 +13,7 @@ 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 + data_hud_type = TRAIT_SECURITY_HUD_ID_ONLY additional_access = /datum/id_trim/job/clown possessed_message = "You are a honkbot! Make sure the crew are having a great time!" ///our voicelines @@ -83,8 +84,7 @@ if(HAS_TRAIT(current_target, TRAIT_DEAF)) return - var/obj/item/organ/ears/target_ears = current_target.get_organ_slot(ORGAN_SLOT_EARS) - target_ears?.adjustEarDamage(0, 5) + sound_damage(deafen = 10 SECONDS) /mob/living/basic/bot/honkbot/ui_data(mob/user) var/list/data = ..() diff --git a/code/modules/mob/living/basic/bots/hygienebot/hygienebot.dm b/code/modules/mob/living/basic/bots/hygienebot/hygienebot.dm index 80e1ce7b63b1..eb4dd4565fd2 100644 --- a/code/modules/mob/living/basic/bots/hygienebot/hygienebot.dm +++ b/code/modules/mob/living/basic/bots/hygienebot/hygienebot.dm @@ -21,6 +21,8 @@ additional_access = /datum/id_trim/job/janitor hackables = "cleaning service protocols" ai_controller = /datum/ai_controller/basic_controller/bot/hygienebot + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3.3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2) + ///are we currently washing someone? var/washing = FALSE @@ -115,6 +117,7 @@ target.fire_act() return target.wash(CLEAN_WASH) + target.extinguish() /mob/living/basic/bot/hygienebot/on_bot_movement(atom/movable/source, atom/oldloc, dir, forced) diff --git a/code/modules/mob/living/basic/bots/hygienebot/hygienebot_ai.dm b/code/modules/mob/living/basic/bots/hygienebot/hygienebot_ai.dm index 5c98365f33d0..1d0c689bff4b 100644 --- a/code/modules/mob/living/basic/bots/hygienebot/hygienebot_ai.dm +++ b/code/modules/mob/living/basic/bots/hygienebot/hygienebot_ai.dm @@ -86,7 +86,7 @@ found_target = wash_potential break - for(var/atom/clothing in wash_potential.get_equipped_items()) + for(var/atom/clothing in wash_potential.get_equipped_items(INCLUDE_HELD|INCLUDE_PROSTHETICS)) if(GET_ATOM_BLOOD_DNA_LENGTH(clothing)) found_target = wash_potential break diff --git a/code/modules/mob/living/basic/bots/medbot/medbot.dm b/code/modules/mob/living/basic/bots/medbot/medbot.dm index 4a60ca178a75..1d2b157ce6c9 100644 --- a/code/modules/mob/living/basic/bots/medbot/medbot.dm +++ b/code/modules/mob/living/basic/bots/medbot/medbot.dm @@ -14,12 +14,13 @@ pass_flags = PASSMOB | PASSFLAPS status_flags = (CANPUSH | CANSTUN) ai_controller = /datum/ai_controller/basic_controller/bot/medbot + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2) req_one_access = list(ACCESS_ROBOTICS, ACCESS_MEDICAL) radio_key = /obj/item/encryptionkey/headset_med radio_channel = RADIO_CHANNEL_MEDICAL bot_type = MED_BOT - data_hud_type = DATA_HUD_MEDICAL_ADVANCED + data_hud_type = TRAIT_MEDICAL_HUD hackables = "health processor circuits" possessed_message = "You are a medbot! Ensure good health among the crew to the best of your ability!" @@ -98,6 +99,8 @@ var/skin = "generic" /// How much healing do we do at a time? var/heal_amount = 2.5 + /// How much healing multiplier do we have from upgrades? + VAR_FINAL/heal_multiplier = 1.0 /// Start healing when they have this much damage in a category var/heal_threshold = 10 /// What damage type does this bot support. Because the default is brute, if the medkit is brute-oriented there is a slight bonus to healing. set to "all" for it to heal any of the 4 base damage types @@ -162,6 +165,13 @@ if(!CONFIG_GET(flag/no_default_techweb_link) && !linked_techweb) CONNECT_TO_RND_SERVER_ROUNDSTART(linked_techweb, src) + if(linked_techweb) + RegisterSignal(linked_techweb, COMSIG_TECHWEB_ADD_DESIGN, PROC_REF(on_techweb_research)) + RegisterSignal(linked_techweb, COMSIG_TECHWEB_REMOVE_DESIGN, PROC_REF(on_techweb_unresearch)) + + for(var/datum/design/medibot_upgrade/design in linked_techweb.get_researched_design_datums()) + heal_multiplier += design.additive_multiplier + /mob/living/basic/bot/medbot/on_craft_completion(list/components, datum/crafting_recipe/current_recipe, atom/crafter) . = ..() var/obj/item/storage/medkit/medkit = locate() in contents @@ -213,7 +223,6 @@ data["custom_controls"]["speaker"] = medical_mode_flags & MEDBOT_SPEAK_MODE data["custom_controls"]["crit_alerts"] = medical_mode_flags & MEDBOT_DECLARE_CRIT data["custom_controls"]["stationary_mode"] = medical_mode_flags & MEDBOT_STATIONARY_MODE - data["custom_controls"]["sync_tech"] = TRUE return data // Actions received from TGUI @@ -236,21 +245,6 @@ medical_mode_flags ^= MEDBOT_DECLARE_CRIT if("stationary_mode") medical_mode_flags ^= MEDBOT_STATIONARY_MODE - if("sync_tech") - if(!linked_techweb) - to_chat(user, span_notice("No research techweb connected.")) - return - var/oldheal_amount = heal_amount - var/tech_boosters - for(var/index in linked_techweb.researched_designs) - var/datum/design/surgery/healing/design = SSresearch.techweb_design_by_id(index) - if(!istype(design)) - continue - tech_boosters++ - if(tech_boosters) - heal_amount = (round(tech_boosters * 0.5, 0.1) * initial(heal_amount)) + initial(heal_amount) //every 2 tend wounds tech gives you an extra 100% healing, adjusting for unique branches (combo is bonus) - if(oldheal_amount < heal_amount) - speak("New knowledge found! Surgical efficacy improved to [round(heal_amount/initial(heal_amount)*100)]%!") update_appearance() @@ -340,7 +334,7 @@ if(!do_after(src, delay = 2 SECONDS, target = patient, interaction_key = TEND_DAMAGE_INTERACTION)) update_bot_mode(new_mode = BOT_IDLE) return - var/modified_heal_amount = heal_amount + var/modified_heal_amount = heal_amount * heal_multiplier var/done_healing = FALSE if(damage_type_healer == BRUTE && medkit_type == /obj/item/storage/medkit/brute) modified_heal_amount *= 1.1 @@ -366,9 +360,27 @@ update_bot_mode(new_mode = BOT_IDLE) return - if(CanReach(patient)) + if(patient.IsReachableBy(src)) melee_attack(patient) +/mob/living/basic/bot/medbot/proc/on_techweb_research(datum/source, datum/design/medibot_upgrade/design) + SIGNAL_HANDLER + + if(!istype(design)) + return + + heal_multiplier += design.additive_multiplier + INVOKE_ASYNC(src, PROC_REF(speak), "New knowledge found! Surgical efficacy improved to [round(heal_multiplier * 100)]%!") + +/mob/living/basic/bot/medbot/proc/on_techweb_unresearch(datum/source, datum/design/medibot_upgrade/design) + SIGNAL_HANDLER + + if(!istype(design)) + return + + heal_multiplier -= design.additive_multiplier + INVOKE_ASYNC(src, PROC_REF(speak), "Error! Surgical efficacy decreased to [round(heal_multiplier * 100)]%!") + /datum/id_trim/medibot assignment = JOB_MEDIBOT trim_state = "trim_paramedic" @@ -392,6 +404,7 @@ ACCESS_SURGERY, ACCESS_VIROLOGY, ACCESS_PHARMACY, + ACCESS_PARAMEDIC, ) honorifics = list("Medical Robot") honorific_positions = HONORIFIC_POSITION_FIRST | HONORIFIC_POSITION_LAST | HONORIFIC_POSITION_FIRST_FULL | HONORIFIC_POSITION_NONE diff --git a/code/modules/mob/living/basic/bots/repairbot/repairbot.dm b/code/modules/mob/living/basic/bots/repairbot/repairbot.dm index 29583c9fca93..8cc3a90a3368 100644 --- a/code/modules/mob/living/basic/bots/repairbot/repairbot.dm +++ b/code/modules/mob/living/basic/bots/repairbot/repairbot.dm @@ -8,9 +8,10 @@ pass_flags = parent_type::pass_flags | PASSTABLE layer = BELOW_MOB_LAYER anchored = FALSE - health = 100 + health = 35 can_be_held = TRUE - maxHealth = 100 + maxHealth = 35 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2) path_image_color = "#80dae7" bot_ui = "RepairBot" req_one_access = list(ACCESS_ROBOTICS, ACCESS_ENGINEERING) diff --git a/code/modules/mob/living/basic/bots/vibebot/vibebot.dm b/code/modules/mob/living/basic/bots/vibebot/vibebot.dm index c8e2d713623e..ab89baea6516 100644 --- a/code/modules/mob/living/basic/bots/vibebot/vibebot.dm +++ b/code/modules/mob/living/basic/bots/vibebot/vibebot.dm @@ -9,12 +9,14 @@ light_range = 6 ai_controller = /datum/ai_controller/basic_controller/bot/vibebot light_power = 2 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.8, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 4) + hackables = "vibing scanners" radio_key = /obj/item/encryptionkey/headset_service radio_channel = RADIO_CHANNEL_SERVICE bot_type = VIBE_BOT - data_hud_type = DATA_HUD_DIAGNOSTIC + data_hud_type = TRAIT_DIAGNOSTIC_HUD path_image_color = "#2cac12" possessed_message = "You are a vibebot! Maintain the station's vibes to the best of your ability!" diff --git a/code/modules/mob/living/basic/clown/clown.dm b/code/modules/mob/living/basic/clown/clown.dm index 601d82495aed..4fa1738d7499 100644 --- a/code/modules/mob/living/basic/clown/clown.dm +++ b/code/modules/mob/living/basic/clown/clown.dm @@ -25,7 +25,7 @@ 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 - 10) maximum_survivable_temperature = (T0C + 100) - blood_volume = BLOOD_VOLUME_NORMAL + default_blood_volume = BLOOD_VOLUME_NORMAL faction = list(FACTION_CLOWN) ai_controller = /datum/ai_controller/basic_controller/clown ///list of stuff we drop on death @@ -42,6 +42,7 @@ /mob/living/basic/clown/Initialize(mapload) . = ..() + ADD_TRAIT(src, TRAIT_NAIVE, INNATE_TRAIT) 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) @@ -470,10 +471,10 @@ health += 10 if(istype(eaten_atom, /obj/item/food/grown/banana)) var/obj/item/food/grown/banana/banana_morsel = eaten_atom - adjustBruteLoss(-(banana_morsel.seed.potency / 100 ) * maxHealth * 0.2) + adjust_brute_loss(-(banana_morsel.seed.potency / 100 ) * maxHealth * 0.2) prank_pouch += banana_morsel.generate_trash(src) else - adjustBruteLoss(-maxHealth * 0.1) + adjust_brute_loss(-maxHealth * 0.1) qdel(eaten_atom) playsound(loc,'sound/items/eatfood.ogg', rand(30,50), TRUE) @@ -597,7 +598,7 @@ . = ..() 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)) + if(adjacent_turf == owner.loc || !adjacent_turf.IsReachableBy(owner) || !isopenturf(adjacent_turf)) continue reachable_turfs += adjacent_turf @@ -625,10 +626,10 @@ /datum/action/cooldown/exquisite_bunch/Trigger(mob/clicker, trigger_flags, atom/target) if(activating) return - var/bunch_turf = get_step(owner.loc, owner.dir) + var/atom/bunch_turf = get_step(owner.loc, owner.dir) if(!bunch_turf) return - if(!owner.CanReach(bunch_turf) || !isopenturf(bunch_turf)) + if(!bunch_turf.IsReachableBy(owner) || !isopenturf(bunch_turf)) owner.balloon_alert(owner, "can't do that here!") return activating = TRUE diff --git a/code/modules/mob/living/basic/cult/constructs/artificer.dm b/code/modules/mob/living/basic/cult/constructs/artificer.dm index 0e65e8ae5ef7..f16ef6d35a1b 100644 --- a/code/modules/mob/living/basic/cult/constructs/artificer.dm +++ b/code/modules/mob/living/basic/cult/constructs/artificer.dm @@ -30,14 +30,11 @@ can_repair = TRUE can_repair_self = TRUE smashes_walls = TRUE - ///The health HUD applied to this mob. - var/health_hud = DATA_HUD_MEDICAL_ADVANCED /mob/living/basic/construct/artificer/Initialize(mapload) . = ..() AddElement(/datum/element/ai_retaliate) - var/datum/atom_hud/datahud = GLOB.huds[health_hud] - datahud.show_to(src) + ADD_TRAIT(src, TRAIT_MEDICAL_HUD, INNATE_TRAIT) /// Hostile NPC version. Heals nearby constructs and cult structures, avoids targets that aren't extremely hurt. /mob/living/basic/construct/artificer/hostile diff --git a/code/modules/mob/living/basic/cult/constructs/juggernaut.dm b/code/modules/mob/living/basic/cult/constructs/juggernaut.dm index 0b6e434558e6..a29bf2953695 100644 --- a/code/modules/mob/living/basic/cult/constructs/juggernaut.dm +++ b/code/modules/mob/living/basic/cult/constructs/juggernaut.dm @@ -36,20 +36,19 @@ smashes_walls = FALSE melee_attack_cooldown = 2 SECONDS -/mob/living/basic/construct/juggernaut/bullet_act(obj/projectile/bullet) - if(!istype(bullet, /obj/projectile/energy) && !istype(bullet, /obj/projectile/beam)) +/mob/living/basic/construct/juggernaut/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) + if(!istype(hitting_projectile, /obj/projectile/energy) && !istype(hitting_projectile, /obj/projectile/beam)) return ..() - if(!prob(40 - round(bullet.damage / 3))) // reflect chance + if(!prob(40 - round(hitting_projectile.damage / 3))) // reflect chance return ..() - apply_damage(bullet.damage * 0.5, bullet.damage_type) + apply_damage(hitting_projectile.damage * 0.5, hitting_projectile.damage_type) visible_message( - span_danger("\The [bullet] is reflected by [src]'s armored shell!"), - span_userdanger("\The [bullet] is reflected by your armored shell!"), + span_danger("\The [hitting_projectile] is reflected by [src]'s armored shell!"), + span_userdanger("\The [hitting_projectile] is reflected by your armored shell!"), ) - bullet.reflect(src) - + hitting_projectile.reflect(src) return BULLET_ACT_FORCE_PIERCE // complete projectile permutation // Alternate juggernaut themes diff --git a/code/modules/mob/living/basic/cytology/vatbeast.dm b/code/modules/mob/living/basic/cytology/vatbeast.dm index d9d1c364802a..5b6460eebb23 100644 --- a/code/modules/mob/living/basic/cytology/vatbeast.dm +++ b/code/modules/mob/living/basic/cytology/vatbeast.dm @@ -27,7 +27,7 @@ lighting_cutoff_blue = 20 ai_controller = /datum/ai_controller/basic_controller/vatbeast faction = list(FACTION_HOSTILE) - blood_volume = BLOOD_VOLUME_NORMAL + default_blood_volume = BLOOD_VOLUME_NORMAL /// What can you feed a vatbeast to tame it? var/static/list/enjoyed_food = list( /obj/item/food/carrotfries, diff --git a/code/modules/mob/living/basic/drone/_drone.dm b/code/modules/mob/living/basic/drone/_drone.dm index 6ddaea0e51af..f7219599d40b 100644 --- a/code/modules/mob/living/basic/drone/_drone.dm +++ b/code/modules/mob/living/basic/drone/_drone.dm @@ -48,6 +48,7 @@ lighting_cutoff_blue = 25 can_be_held = TRUE worn_slot_flags = ITEM_SLOT_HEAD + inhand_holder_type = /obj/item/mob_holder/drone /// `TRUE` if we have picked our visual appearance, `FALSE` otherwise (default) var/picked = FALSE /// Stored drone color, restored when unhacked @@ -133,8 +134,8 @@ shy_update() alert_drones(DRONE_NET_CONNECT) - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_atom_to_hud(src) + var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC] + diag_hud.add_atom_to_hud(src) add_traits(list( TRAIT_VENTCRAWLER_ALWAYS, @@ -257,7 +258,7 @@ Stun(70) to_chat(src, span_danger("ER@%R: MME^RY CO#RU9T! R&$b@0tin)...")) if(severity == 1) - adjustBruteLoss(heavy_emp_damage) + adjust_brute_loss(heavy_emp_damage) to_chat(src, span_userdanger("HeAV% DA%^MMA+G TO I/O CIR!%UUT!")) /mob/living/basic/drone/proc/alarm_triggered(datum/source, alarm_type, area/source_area) @@ -295,3 +296,6 @@ if(built_in_camera?.can_use()) return TRUE return ..() + +/mob/living/basic/drone/hypnosis_vulnerable() + return FALSE //It obeys its laws diff --git a/code/modules/mob/living/basic/drone/drone_say.dm b/code/modules/mob/living/basic/drone/drone_say.dm index 3a006d8d1b2c..ce33b2ca883f 100644 --- a/code/modules/mob/living/basic/drone/drone_say.dm +++ b/code/modules/mob/living/basic/drone/drone_say.dm @@ -48,4 +48,4 @@ /mob/living/basic/drone/proc/drone_chat(message, list/spans = list(), list/message_mods = list()) log_sayverb_talk(message, message_mods, tag = "drone chat") var/message_part = generate_messagepart(message, spans, message_mods) - alert_drones("Drone Chat: [span_name("[name]")] [message_part]", TRUE) + alert_drones(span_drone("Drone Chat: [span_name("[name]")] [span_message(message_part)]"), TRUE) diff --git a/code/modules/mob/living/basic/drone/drone_tools.dm b/code/modules/mob/living/basic/drone/drone_tools.dm index 2941d867d6b2..d1be8ab0cec1 100644 --- a/code/modules/mob/living/basic/drone/drone_tools.dm +++ b/code/modules/mob/living/basic/drone/drone_tools.dm @@ -79,6 +79,8 @@ inhand_icon_state = "cutters" item_flags = NO_MAT_REDEMPTION random_color = FALSE + greyscale_config = null + greyscale_colors = null /obj/item/multitool/drone name = "built-in multitool" diff --git a/code/modules/mob/living/basic/drone/interaction.dm b/code/modules/mob/living/basic/drone/interaction.dm index d0c706d0ca01..4dfa3256c5cd 100644 --- a/code/modules/mob/living/basic/drone/interaction.dm +++ b/code/modules/mob/living/basic/drone/interaction.dm @@ -16,7 +16,7 @@ drone.visible_message(span_notice("[drone] begins to cannibalize parts from [src]."), span_notice("You begin to cannibalize parts from [src]...")) if(do_after(drone, 6 SECONDS, 0, target = src)) drone.visible_message(span_notice("[drone] repairs itself using [src]'s remains!"), span_notice("You repair yourself using [src]'s remains.")) - drone.adjustBruteLoss(-src.maxHealth) + drone.adjust_brute_loss(-src.maxHealth) new /obj/effect/decal/cleanable/blood/splatter/oil(get_turf(src)) ghostize(can_reenter_corpse = FALSE) qdel(src) @@ -93,7 +93,7 @@ to_chat(user, span_warning("You need to remain still to tighten [src]'s screws!")) return ITEM_INTERACT_SUCCESS - adjustBruteLoss(-getBruteLoss()) + adjust_brute_loss(-get_brute_loss()) visible_message(span_notice("[user] tightens [src == user ? "[user.p_their()]" : "[src]'s"] loose screws!"), span_notice("[src == user ? "You tighten" : "[user] tightens"] your loose screws.")) return ITEM_INTERACT_SUCCESS diff --git a/code/modules/mob/living/basic/drone/inventory.dm b/code/modules/mob/living/basic/drone/inventory.dm index c6c7aa5da95f..acacdb0e2659 100644 --- a/code/modules/mob/living/basic/drone/inventory.dm +++ b/code/modules/mob/living/basic/drone/inventory.dm @@ -59,7 +59,7 @@ equipping.pulledby.stop_pulling() equipping.screen_loc = null // will get moved if inventory is visible - equipping.forceMove(src) + equipping.forceMove(src) //This has to come before has_equipped is called. SET_PLANE_EXPLICIT(equipping, ABOVE_HUD_PLANE, src) switch(slot) diff --git a/code/modules/mob/living/basic/drone/verbs.dm b/code/modules/mob/living/basic/drone/verbs.dm index 833d37a3c894..a66d17048fde 100644 --- a/code/modules/mob/living/basic/drone/verbs.dm +++ b/code/modules/mob/living/basic/drone/verbs.dm @@ -30,5 +30,5 @@ var/area/A = get_area(loc) if(alert_s && A && stat != DEAD) - var/msg = span_boldnotice("DRONE PING: [name]: [alert_s] priority alert in [A.name]!") + var/msg = span_big("DRONE PING: [name]: [alert_s] priority alert in [A.name]!") alert_drones(msg) diff --git a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm index 29f5e436d4f9..4f0fd61f1ba7 100644 --- a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm +++ b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm @@ -80,6 +80,7 @@ if(beegent) reee[beegent.type] = 5 holder.AddComponentFrom(SOURCE_EDIBLE_INNATE, /datum/component/edible, reee, null, BEE_FOODGROUPS, 10, 0, list("bee"), null, 10) + SEND_SIGNAL(src, COMSIG_LIVING_SCOOPED_UP, picker, holder) picker.visible_message(span_warning("[picker] scoops up [src]!")) picker.put_in_hands(holder) 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 index 847209866246..2a6ff31981c4 100644 --- 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 @@ -64,7 +64,7 @@ /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) +/datum/ai_behavior/find_and_set/bee_hive/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/list/valid_hives = list() var/mob/living/bee_pawn = controller.pawn 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 a07a70d0172d..72d1d892e623 100644 --- a/code/modules/mob/living/basic/farm_animals/cow/_cow.dm +++ b/code/modules/mob/living/basic/farm_animals/cow/_cow.dm @@ -25,7 +25,7 @@ health = 50 maxHealth = 50 gold_core_spawnable = FRIENDLY_SPAWN - blood_volume = BLOOD_VOLUME_NORMAL + default_blood_volume = BLOOD_VOLUME_NORMAL ai_controller = /datum/ai_controller/basic_controller/cow /// what this cow munches on, and what can be used to tame it. var/list/food_types = list(/obj/item/food/grown/wheat) diff --git a/code/modules/mob/living/basic/farm_animals/deer/deer.dm b/code/modules/mob/living/basic/farm_animals/deer/deer.dm index dc27c82dd82f..461d3f3aeac1 100644 --- a/code/modules/mob/living/basic/farm_animals/deer/deer.dm +++ b/code/modules/mob/living/basic/farm_animals/deer/deer.dm @@ -19,10 +19,10 @@ attack_sound = 'sound/items/weapons/punch1.ogg' health = 75 maxHealth = 75 - blood_volume = BLOOD_VOLUME_NORMAL + default_blood_volume = BLOOD_VOLUME_NORMAL ai_controller = /datum/ai_controller/basic_controller/deer /// Things that will scare us into being stationary. Vehicles are scary to deers because they might have headlights. - var/static/list/stationary_scary_things = list(/obj/vehicle) + var/static/list/stationary_scary_things = list(/obj/vehicle, /obj/darkpack_car) // DARKPACK EDIT CHANGE /mob/living/basic/deer/Initialize(mapload) diff --git a/code/modules/mob/living/basic/farm_animals/deer/deer_ai.dm b/code/modules/mob/living/basic/farm_animals/deer/deer_ai.dm index 52fedbe9c05b..a654e0c29d0e 100644 --- a/code/modules/mob/living/basic/farm_animals/deer/deer_ai.dm +++ b/code/modules/mob/living/basic/farm_animals/deer/deer_ai.dm @@ -44,7 +44,7 @@ target_key = BB_DEER_GRASS_TARGET finding_behavior = /datum/ai_behavior/find_and_set/in_list/turf_types hunting_behavior = /datum/ai_behavior/hunt_target/eat_grass - hunt_targets = list(/turf/open/floor/grass) + hunt_targets = list(/turf/open/floor/grass, /turf/open/misc/grass) hunt_range = 7 hunt_chance = 45 diff --git a/code/modules/mob/living/basic/farm_animals/goat/_goat.dm b/code/modules/mob/living/basic/farm_animals/goat/_goat.dm index 7b177c5c17d2..9c7d9d783e81 100644 --- a/code/modules/mob/living/basic/farm_animals/goat/_goat.dm +++ b/code/modules/mob/living/basic/farm_animals/goat/_goat.dm @@ -31,7 +31,7 @@ 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 + default_blood_volume = BLOOD_VOLUME_NORMAL ai_controller = /datum/ai_controller/basic_controller/goat /// How often will we develop an evil gleam in our eye? @@ -72,7 +72,7 @@ if(!(living_target.mob_biotypes & MOB_PLANT)) return - living_target.adjustBruteLoss(20) + living_target.adjust_brute_loss(20) playsound(src, 'sound/items/eatfood.ogg', rand(30, 50), TRUE) var/obj/item/bodypart/edible_bodypart diff --git a/code/modules/mob/living/basic/farm_animals/goose/goose.dm b/code/modules/mob/living/basic/farm_animals/goose/goose.dm index 0a34400f1616..aa25ca7e9d7d 100644 --- a/code/modules/mob/living/basic/farm_animals/goose/goose.dm +++ b/code/modules/mob/living/basic/farm_animals/goose/goose.dm @@ -57,7 +57,7 @@ SIGNAL_HANDLER if (ai_controller?.blackboard[BB_GOOSE_PANICKED]) return COMSIG_MOB_CANCEL_EAT - if (potential_food.has_material_type(/datum/material/plastic) || IsEdible(potential_food)) + if (potential_food.has_material_type(/datum/material/plastic) || IS_EDIBLE(potential_food)) return NONE// Geese only eat FOOD or PLASTIC return COMSIG_MOB_CANCEL_EAT diff --git a/code/modules/mob/living/basic/farm_animals/goose/goose_ai.dm b/code/modules/mob/living/basic/farm_animals/goose/goose_ai.dm index d161145d06bb..94202a90df32 100644 --- a/code/modules/mob/living/basic/farm_animals/goose/goose_ai.dm +++ b/code/modules/mob/living/basic/farm_animals/goose/goose_ai.dm @@ -55,14 +55,14 @@ /// Only set things geese will try to eat /datum/ai_behavior/find_and_set/in_list/goose_food -/datum/ai_behavior/find_and_set/in_list/goose_food/search_tactic(datum/ai_controller/controller, locate_paths, search_range) +/datum/ai_behavior/find_and_set/in_list/goose_food/search_tactic(datum/ai_controller/controller, locate_paths, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/list/found = typecache_filter_list(oview(search_range, controller.pawn), locate_paths) if(!length(found)) return var/list/filtered = list() for (var/obj/item/thing as anything in found) - if (IsEdible(thing) || thing.has_material_type(/datum/material/plastic)) + if (IS_EDIBLE(thing) || thing.has_material_type(/datum/material/plastic)) filtered += thing if(length(filtered)) diff --git a/code/modules/mob/living/basic/farm_animals/goose/goose_vomit.dm b/code/modules/mob/living/basic/farm_animals/goose/goose_vomit.dm index 2b347903e22f..2d3f2b6df20a 100644 --- a/code/modules/mob/living/basic/farm_animals/goose/goose_vomit.dm +++ b/code/modules/mob/living/basic/farm_animals/goose/goose_vomit.dm @@ -124,7 +124,7 @@ /// Stop fucking around and get the rest of it out /datum/status_effect/goose_vomit/proc/vomit_finale() - tick_interval = 0.1 SECONDS + tick_interval = 0.2 SECONDS owner.set_jitter_if_lower(1 SECONDS) hurl_item(vomit_strongly = TRUE) @@ -176,7 +176,7 @@ /datum/status_effect/goose_choking/on_remove() UnregisterSignal(owner, COMSIG_LIVING_DEATH) - if (duration >= world.time) + if (duration > 0) return // Saved by something, although probably by dying early owner.death_message = "lets out one final oxygen-deprived honk before [owner.p_they()] go[owner.p_es()] limp and lifeless.." owner.death() diff --git a/code/modules/mob/living/basic/farm_animals/pig.dm b/code/modules/mob/living/basic/farm_animals/pig.dm index 3a4ae8885122..7654933c0d0f 100644 --- a/code/modules/mob/living/basic/farm_animals/pig.dm +++ b/code/modules/mob/living/basic/farm_animals/pig.dm @@ -25,7 +25,7 @@ health = 50 maxHealth = 50 gold_core_spawnable = FRIENDLY_SPAWN - blood_volume = BLOOD_VOLUME_NORMAL + default_blood_volume = BLOOD_VOLUME_NORMAL ai_controller = /datum/ai_controller/basic_controller/pig /datum/emote/pig diff --git a/code/modules/mob/living/basic/farm_animals/pony.dm b/code/modules/mob/living/basic/farm_animals/pony.dm index 09166933e8d7..6598b70606c1 100644 --- a/code/modules/mob/living/basic/farm_animals/pony.dm +++ b/code/modules/mob/living/basic/farm_animals/pony.dm @@ -22,7 +22,7 @@ health = 50 maxHealth = 50 gold_core_spawnable = FRIENDLY_SPAWN - blood_volume = BLOOD_VOLUME_NORMAL + default_blood_volume = BLOOD_VOLUME_NORMAL ai_controller = /datum/ai_controller/basic_controller/pony /// Do we register a unique rider? var/unique_tamer = FALSE diff --git a/code/modules/mob/living/basic/farm_animals/sheep.dm b/code/modules/mob/living/basic/farm_animals/sheep.dm index de4999a561d6..bbbf7e588753 100644 --- a/code/modules/mob/living/basic/farm_animals/sheep.dm +++ b/code/modules/mob/living/basic/farm_animals/sheep.dm @@ -23,7 +23,7 @@ health = 50 maxHealth = 50 gold_core_spawnable = FRIENDLY_SPAWN - blood_volume = BLOOD_VOLUME_NORMAL + default_blood_volume = BLOOD_VOLUME_NORMAL ai_controller = /datum/ai_controller/basic_controller/sheep /// Were we sacrificed by cultists? diff --git a/code/modules/mob/living/basic/festivus_pole.dm b/code/modules/mob/living/basic/festivus_pole.dm index 0cd745d156b1..19a3cd2bf583 100644 --- a/code/modules/mob/living/basic/festivus_pole.dm +++ b/code/modules/mob/living/basic/festivus_pole.dm @@ -14,6 +14,7 @@ gold_core_spawnable = HOSTILE_SPAWN basic_mob_flags = DEL_ON_DEATH status_flags = CANPUSH + mob_biotypes = MOB_MINERAL response_help_continuous = "rubs" response_help_simple = "rub" diff --git a/code/modules/mob/living/basic/guardian/guardian.dm b/code/modules/mob/living/basic/guardian/guardian.dm index a6f2dd10a630..8b9c14c0b29b 100644 --- a/code/modules/mob/living/basic/guardian/guardian.dm +++ b/code/modules/mob/living/basic/guardian/guardian.dm @@ -137,7 +137,7 @@ /mob/living/basic/guardian/proc/guardian_recolour() if (isnull(client)) return - var/chosen_guardian_colour = input(src, "What would you like your colour to be?", "Choose Your Colour", "#ffffff") as color|null + var/chosen_guardian_colour = tgui_color_picker(src, "What would you like your colour to be?", "Choose Your Colour", COLOR_WHITE) if (isnull(chosen_guardian_colour)) //redo proc until we get a color to_chat(src, span_warning("Invalid colour, please try again.")) return guardian_recolour() @@ -191,9 +191,9 @@ gib() return TRUE if (EXPLODE_HEAVY) - adjustBruteLoss(60) + adjust_brute_loss(60) if (EXPLODE_LIGHT) - adjustBruteLoss(30) + adjust_brute_loss(30) return TRUE @@ -294,7 +294,7 @@ summoner.visible_message(span_bolddanger("Blood sprays from [summoner] as [src] takes damage!")) 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) + summoner.adjust_organ_loss(ORGAN_SLOT_BRAIN, amount * 0.5) /// When our owner is deleted, we go too. /mob/living/basic/guardian/proc/on_summoner_deletion(mob/living/source) diff --git a/code/modules/mob/living/basic/guardian/guardian_types/protector.dm b/code/modules/mob/living/basic/guardian/guardian_types/protector.dm index a7a9e718e543..2205eaf10d1c 100644 --- a/code/modules/mob/living/basic/guardian/guardian_types/protector.dm +++ b/code/modules/mob/living/basic/guardian/guardian_types/protector.dm @@ -34,7 +34,7 @@ /mob/living/basic/guardian/protector/ex_act(severity) if(severity >= EXPLODE_DEVASTATE) - adjustBruteLoss(400) //if in protector mode, will do 20 damage and not actually necessarily kill the summoner + adjust_brute_loss(400) //if in protector mode, will do 20 damage and not actually necessarily kill the summoner return TRUE return ..() diff --git a/code/modules/mob/living/basic/guardian/guardian_types/support.dm b/code/modules/mob/living/basic/guardian/guardian_types/support.dm index 46b69652cf5d..3e05b403fbcd 100644 --- a/code/modules/mob/living/basic/guardian/guardian_types/support.dm +++ b/code/modules/mob/living/basic/guardian/guardian_types/support.dm @@ -27,8 +27,7 @@ after_healed = CALLBACK(src, PROC_REF(after_healed)),\ ) - var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - medsensor.show_to(src) + ADD_TRAIT(src, TRAIT_MEDICAL_HUD, INNATE_TRAIT) var/datum/action/cooldown/mob_cooldown/guardian_bluespace_beacon/teleport = new(src) teleport.Grant(src) diff --git a/code/modules/mob/living/basic/health_adjustment.dm b/code/modules/mob/living/basic/health_adjustment.dm index d35178b99185..499f679cdee5 100644 --- a/code/modules/mob/living/basic/health_adjustment.dm +++ b/code/modules/mob/living/basic/health_adjustment.dm @@ -23,7 +23,7 @@ return modifier * damage_coeff[damage_type] return modifier -/mob/living/basic/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/basic/adjust_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!can_adjust_brute_loss(amount, forced, required_bodytype)) return 0 if(forced) @@ -31,7 +31,7 @@ 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) +/mob/living/basic/adjust_fire_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!can_adjust_fire_loss(amount, forced, required_bodytype)) return 0 if(forced) @@ -39,7 +39,7 @@ 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) +/mob/living/basic/adjust_oxy_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype, required_respiration_type) if(!can_adjust_oxy_loss(amount, forced, required_biotype, required_respiration_type)) return 0 if(forced) @@ -47,7 +47,7 @@ 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) +/mob/living/basic/adjust_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype) if(!can_adjust_tox_loss(amount, forced, required_biotype)) return 0 if(forced) @@ -55,7 +55,7 @@ else if(damage_coeff[TOX]) . = adjust_health(amount * damage_coeff[TOX] * CONFIG_GET(number/damage_multiplier), updating_health, forced) -/mob/living/basic/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) +/mob/living/basic/adjust_stamina_loss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) if(!can_adjust_stamina_loss(amount, forced, required_biotype)) return 0 . = staminaloss diff --git a/code/modules/mob/living/basic/heretic/ash_spirit.dm b/code/modules/mob/living/basic/heretic/ash_spirit.dm index fed64db8adcb..8d23584d32fa 100644 --- a/code/modules/mob/living/basic/heretic/ash_spirit.dm +++ b/code/modules/mob/living/basic/heretic/ash_spirit.dm @@ -18,6 +18,9 @@ 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, ) grant_actions_by_list(actions_to_add) + +/mob/living/basic/heretic_summon/ash_spirit/Life(seconds_per_tick, times_fired) + . = ..() + adjust_brute_loss(-3) // 3 health passively healing diff --git a/code/modules/mob/living/basic/heretic/flesh_worm.dm b/code/modules/mob/living/basic/heretic/flesh_worm.dm index 13372c726887..d796560ed6d5 100644 --- a/code/modules/mob/living/basic/heretic/flesh_worm.dm +++ b/code/modules/mob/living/basic/heretic/flesh_worm.dm @@ -111,8 +111,8 @@ back.on_arm_eaten() return - adjustBruteLoss(-maxHealth * 0.5, FALSE) - adjustFireLoss(-maxHealth * 0.5, FALSE) + adjust_brute_loss(-maxHealth * 0.5, FALSE) + adjust_fire_loss(-maxHealth * 0.5, FALSE) if(health < maxHealth * 0.8) return 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 index 6f8c2e5c96f0..ca627fd40446 100644 --- a/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm +++ b/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm @@ -33,6 +33,7 @@ ) AddElement(/datum/element/death_drops, loot) GRANT_ACTION(/datum/action/cooldown/spell/jaunt/mirror_walk) + ADD_TRAIT(src, TRAIT_UNHITTABLE_BY_LASERS, INNATE_TRAIT) /mob/living/basic/heretic_summon/maid_in_the_mirror/death(gibbed) var/turf/death_turf = get_turf(src) @@ -50,14 +51,14 @@ return // If we have health, we take some damage - if(health > (maxHealth * 0.125)) + if(health > (maxHealth * 0.02)) 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 + apply_damage(maxHealth * 0.02) // We take 2% 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) @@ -78,3 +79,10 @@ recent_examiner_refs -= mob_ref heal_overall_damage(5) + +/mob/living/basic/heretic_summon/maid_in_the_mirror/melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!. || !isliving(target)) + return + var/mob/living/living_target = target + living_target.apply_status_effect(/datum/status_effect/void_chill, 1) diff --git a/code/modules/mob/living/basic/heretic/raw_prophet.dm b/code/modules/mob/living/basic/heretic/raw_prophet.dm index acb39706edd4..8c5da925c064 100644 --- a/code/modules/mob/living/basic/heretic/raw_prophet.dm +++ b/code/modules/mob/living/basic/heretic/raw_prophet.dm @@ -15,6 +15,7 @@ maxHealth = 65 health = 65 sight = SEE_MOBS|SEE_OBJS|SEE_TURFS + mob_biotypes = MOB_ORGANIC /// List of innate abilities we have to add. var/static/list/innate_abilities = list( /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/long = null, diff --git a/code/modules/mob/living/basic/heretic/rust_walker.dm b/code/modules/mob/living/basic/heretic/rust_walker.dm index 65a41a618384..64ba177a7b7e 100644 --- a/code/modules/mob/living/basic/heretic/rust_walker.dm +++ b/code/modules/mob/living/basic/heretic/rust_walker.dm @@ -13,6 +13,7 @@ sight = SEE_TURFS speed = 1 ai_controller = /datum/ai_controller/basic_controller/rust_walker + mob_biotypes = MOB_ROBOTIC|MOB_MINERAL /mob/living/basic/heretic_summon/rust_walker/Initialize(mapload) . = ..() @@ -44,7 +45,7 @@ return var/turf/our_turf = get_turf(src) if(HAS_TRAIT(our_turf, TRAIT_RUSTY)) - adjustBruteLoss(-3 * seconds_per_tick) + adjust_brute_loss(-3 * seconds_per_tick) return ..() diff --git a/code/modules/mob/living/basic/heretic/star_gazer.dm b/code/modules/mob/living/basic/heretic/star_gazer.dm index ec28da95352b..6ea05af3665f 100644 --- a/code/modules/mob/living/basic/heretic/star_gazer.dm +++ b/code/modules/mob/living/basic/heretic/star_gazer.dm @@ -35,29 +35,94 @@ mob_size = MOB_SIZE_HUGE layer = LARGE_MOB_LAYER flags_1 = PREVENT_CONTENTS_EXPLOSION_1 + lighting_cutoff_red = 12 + lighting_cutoff_green = 15 + lighting_cutoff_blue = 34 + sight = SEE_TURFS|SEE_MOBS|SEE_OBJS ai_controller = /datum/ai_controller/basic_controller/star_gazer + /// Reference to the mob which summoned us + var/datum/weakref/summoner + /// How far we can go before being pulled back + var/leash_range = 20 + /// Timer for finding a ghost so it doesn't spam dead chat with requests + var/begging_timer + ///---- Abilities given to the star gazer mob + var/list/abilities_to_grant = list( + /datum/action/cooldown/spell/conjure/cosmic_expansion, + /datum/action/cooldown/spell/pointed/projectile/star_blast, + /datum/action/cooldown/recall_stargazer, + /datum/action/cooldown/spell/stargazer_laser, + ) -/mob/living/basic/heretic_summon/star_gazer/Initialize(mapload) +/mob/living/basic/heretic_summon/star_gazer/Initialize(mapload, mob/living/master) . = ..() + for(var/datum/action/cooldown/spell/spell as anything in abilities_to_grant) + spell = new spell(src) + spell.Grant(src) + var/datum/action/cooldown/spell/stargazer_laser/laser = locate() in actions + if(master) + summoner = WEAKREF(master) + if(laser) + laser.our_master = WEAKREF(master) + AddComponent(/datum/component/seethrough_mob) + var/static/list/death_loot = list(/obj/effect/temp_visual/cosmic_domain) + AddElement(/datum/element/death_drops, death_loot) AddElement(/datum/element/death_drops, /obj/effect/temp_visual/cosmic_domain) 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, /obj/effect/forcefield/cosmic_field/fast) + AddElement(/datum/element/effect_trail/cosmic_field/antiprojectile, /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) ADD_TRAIT(src, TRAIT_LAVA_IMMUNE, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_ASHSTORM_IMMUNE, INNATE_TRAIT) - ADD_TRAIT(src, TRAIT_NO_TELEPORT, MEGAFAUNA_TRAIT) ADD_TRAIT(src, TRAIT_MARTIAL_ARTS_IMMUNE, MEGAFAUNA_TRAIT) ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_MAGICALLY_GIFTED, INNATE_TRAIT) set_light(4, l_color = "#dcaa5b") + INVOKE_ASYNC(src, PROC_REF(beg_for_ghost)) + RegisterSignal(src, COMSIG_MOB_GHOSTIZED, PROC_REF(beg_for_ghost)) + +/mob/living/basic/heretic_summon/star_gazer/Destroy() + deltimer(begging_timer) + return ..() + +/// Tries to find a ghost to take control of the mob. If no ghost accepts, ask again in a bit +/mob/living/basic/heretic_summon/star_gazer/proc/beg_for_ghost() + if(timeleft(begging_timer) && !client) + return + begging_timer = addtimer(CALLBACK(src, PROC_REF(beg_for_ghost)), 2 MINUTES, TIMER_STOPPABLE | TIMER_UNIQUE) // Keep begging until someone accepts + var/mob/chosen_ghost = SSpolling.poll_ghost_candidates( + "Do you want to play as an ascended heretic's stargazer?", + check_jobban = ROLE_HERETIC, + poll_time = 20 SECONDS, + ignore_category = POLL_IGNORE_HERETIC_MONSTER, + alert_pic = mutable_appearance('icons/effects/eldritch.dmi', "cosmic_diamond"), + jump_target = src, + role_name_text = "star gazer", + amount_to_pick = 1 + ) + if(chosen_ghost) + PossessByPlayer(chosen_ghost.key) + deltimer(begging_timer) + +/// Connects these two mobs by a leash +/mob/living/basic/heretic_summon/star_gazer/proc/leash_to(atom/movable/leashed, atom/movable/leashed_to) + leashed.AddComponent(\ + /datum/component/leash,\ + owner = leashed_to,\ + distance = leash_range,\ + force_teleport_out_effect = /obj/effect/temp_visual/guardian/phase/out,\ + force_teleport_in_effect = /obj/effect/temp_visual/guardian/phase,\ + ) // 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(target == summoner?.resolve()) + return FALSE . = ..() if (!. || !isliving(target)) return @@ -74,6 +139,261 @@ do_attack_animation(nearby_mob, ATTACK_EFFECT_SLASH) log_combat(src, nearby_mob, "slashed") +/datum/action/cooldown/recall_stargazer + name = "Seek master" + desc = "Teleports you to your master" + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "stargazer_menu" + check_flags = NONE + cooldown_time = 5 SECONDS + +/datum/action/cooldown/recall_stargazer/Activate(atom/target) + var/mob/living/basic/heretic_summon/star_gazer/real_owner = owner + var/mob/living/master = real_owner.summoner?.resolve() + if(!master) + return FALSE + do_teleport(owner, master, no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC, forced = TRUE) + StartCooldown() + return TRUE + +/datum/action/cooldown/spell/stargazer_laser + name = "Star Gaze" + desc = "Generates a massive death beam that eradicates everything in it's path. \ + Has it's own gravitational pull, sucking in new victims." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "gazer_beam_charge" + check_flags = NONE + cooldown_time = 30 SECONDS + invocation = "SH''P D' W''P" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + /// list of turfs we are hitting while shooting our beam + var/list/turf/targets + /// The laser beam we generate + var/datum/beam/giga_laser + /// Timer that handles the damage ticking + var/damage_timer + /// Reference to our summoner so that we don't disintegrate them by accident + var/datum/weakref/our_master + /// The overlay on the caster when they fire the beam + var/obj/effect/abstract/gazer_orb/orb_visual + /// The visual effect at the beginning of the laser + var/obj/effect/abstract/gazer_beam/beam_visual + /// List of visual effects for the beam, in between and in the end + var/list/beam_fillings + /// Sound loop for the active laser + var/datum/looping_sound/gazer_beam/sound_loop + /// The visual effect at the end of the laser + var/obj/effect/abstract/gazer_beamend/end_visual + /// Tracks how many times the beam has processed, after the maximum amount of cycles it will forcibly end the beam + var/cycle_tracker = 0 + +/datum/action/cooldown/spell/stargazer_laser/cast(atom/target) + . = ..() + + cooldown_time = initial(cooldown_time) + if(damage_timer) + stop_beaming() + + var/turf/check_turf = get_step(owner, owner.dir) + var/list/turf/targets_left = list() + targets_left += get_step(check_turf, turn(owner.dir, 90)) + var/list/turf/targets_right = list() + targets_right += get_step(check_turf, turn(owner.dir, -90)) + LAZYINITLIST(targets) + while(check_turf && length(targets) < 20) + targets += check_turf + check_turf = get_step(check_turf, owner.dir) + targets_left += get_step(check_turf, turn(owner.dir, 90)) + targets_right += get_step(check_turf, turn(owner.dir, -90)) + if(!LAZYLEN(targets)) + return + + RegisterSignals(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_ATOM_DIR_CHANGE), PROC_REF(stop_beaming)) + beam_fillings = list() + cycle_tracker = 0 + orb_visual = new(get_step(owner, owner.dir)) + var/beam_timer = addtimer(CALLBACK(src, PROC_REF(open_laser), owner, targets), 2.2 SECONDS, TIMER_STOPPABLE) + playsound(owner, 'sound/mobs/non-humanoids/stargazer/beam_open.ogg', 50, FALSE) + if(!do_after(owner, 3 SECONDS, owner)) + cooldown_time = 1 SECONDS + deltimer(beam_timer) + QDEL_NULL(orb_visual) + QDEL_NULL(beam_visual) + QDEL_NULL(end_visual) + for(var/atom/to_delete as anything in beam_fillings) + QDEL_NULL(to_delete) + targets = null + return + + sound_loop.start(owner) + QDEL_NULL(orb_visual) + beam_visual.icon_state = "gazer_beam_active" + beam_visual.update_appearance(UPDATE_ICON) + end_visual.icon_state = "gazer_beam_end" + end_visual.update_appearance(UPDATE_ICON) + targets += targets_left + targets += targets_right + process_beam() + +/datum/action/cooldown/spell/stargazer_laser/Destroy() + QDEL_NULL(sound_loop) + return ..() + +/datum/action/cooldown/spell/stargazer_laser/New(Target, original) + . = ..() + sound_loop = new + +/// Spawns the beginning of the laser, uses `targets` to determine the rotation +/datum/action/cooldown/spell/stargazer_laser/proc/open_laser(mob/owner, list/turf/targets) + beam_visual = new(get_step(get_step(owner, owner.dir), owner.dir), targets[length(targets)]) + end_visual = new(targets[length(targets)], owner) + for(var/turf/to_fill as anything in (get_line(targets[4], targets[length(targets)-2]))) + var/obj/effect/abstract/gazer_beam_filling/new_filling = new(to_fill, owner.dir) + beam_fillings += new_filling + +// Visual effect of the big orb when you start channeling the laser +/obj/effect/abstract/gazer_orb + icon = 'icons/effects/160x160.dmi' + icon_state = "gazer_beam_charge" + SET_BASE_VISUAL_PIXEL(-64, -64) + +// Visual effect at the start of the beam, has an opening/active/closing state +/obj/effect/abstract/gazer_beam + icon = 'icons/effects/beam96x96.dmi' + SET_BASE_VISUAL_PIXEL(-32, -32) + +/obj/effect/abstract/gazer_beam/Initialize(mapload, turf/target) + . = ..() + if(!target) + return INITIALIZE_HINT_QDEL + var/Angle = get_angle_raw(x, y, pixel_x, pixel_y, target.x , target.y, target.pixel_x, target.pixel_y) + var/matrix/transform_matrix = matrix() + Angle = round(Angle, 45) + transform_matrix.Turn(Angle-90) + transform_matrix.Scale(2, 2) + transform = transform_matrix + flick("gazer_beam_start", src) + +// Visual effect of the middle of the beam, has an opening/active/closing state +/obj/effect/abstract/gazer_beam_filling + icon = 'icons/effects/beam.dmi' + icon_state = "gazer_beam" + +/obj/effect/abstract/gazer_beam_filling/Initialize(mapload, direction) + . = ..() + if(!direction) + return INITIALIZE_HINT_QDEL + var/Angle = dir2angle(direction) + var/matrix/transform_matrix = matrix() + transform_matrix.Turn(Angle) + transform_matrix.Scale(2, 2) + transform = transform_matrix + flick("gazer_beam_end_opening", src) + +/obj/effect/abstract/gazer_beam_filling/proc/pull_victims() + for(var/atom/movable/movable_atom in orange(5, src)) + if((movable_atom.anchored || movable_atom.move_resist >= MOVE_FORCE_EXTREMELY_STRONG)) + continue + if(ismob(movable_atom)) + var/mob/pulled_mob = movable_atom + if(pulled_mob.mob_negates_gravity()) + continue + step_towards(movable_atom, src) + +// Visual effect at the end of the beam, has an opening/active/closing state +/obj/effect/abstract/gazer_beamend + icon = 'icons/effects/beam.dmi' + +/obj/effect/abstract/gazer_beamend/Initialize(mapload, atom/origin) + . = ..() + if(!origin) + return INITIALIZE_HINT_QDEL + var/Angle = get_angle_raw(origin.x , origin.y, origin.pixel_x, origin.pixel_y, x, y, pixel_x, pixel_y) + var/matrix/transform_matrix = matrix() + Angle = round(Angle, 45) + transform_matrix.Turn(Angle) + transform_matrix.Scale(2, 2) + transform = transform_matrix + flick("gazer_beam_end_opening", src) + +/datum/looping_sound/gazer_beam + mid_sounds = list('sound/mobs/non-humanoids/stargazer/beam_loop_one.ogg') + mid_length = 109 + volume = 80 + +/obj/effect/ebeam/phase_in // Beam subtype that has a "windup" phase + alpha = 0 + +/obj/effect/ebeam/phase_in/Initialize(mapload) + . = ..() + animate(src, 2 SECONDS, alpha = 255, transform = matrix(3, 1, MATRIX_SCALE)) + +/obj/effect/ebeam/phased_in/Initialize(mapload, beam_owner) // phased in, fully powered laser + . = ..() + transform = matrix(2, 2, MATRIX_SCALE) + +/// Recursive proc which affects whatever is caught within the beam +/datum/action/cooldown/spell/stargazer_laser/proc/process_beam() + if(cycle_tracker > 33) + stop_beaming() + for(var/obj/effect/abstract/gazer_beam_filling/fillings as anything in beam_fillings) + if(prob(98)) + continue + // 2% chance to pull you towards the beam + fillings.pull_victims() + for(var/turf/target as anything in targets) + if(iswallturf(target)) + var/turf/closed/wall/wall_target = target + wall_target.dismantle_wall(devastated = TRUE) + continue + if(isfloorturf(target)) + var/turf/open/floor/to_burn = target + to_burn.burn_tile() + for(var/victim in target) + if(isobj(victim)) + var/obj/to_obliterate = victim + if(to_obliterate.resistance_flags & INDESTRUCTIBLE) + continue + to_obliterate.atom_destruction(FIRE) + if(isliving(victim)) + if(victim == our_master?.resolve()) + continue + var/mob/living/living_victim = victim + if(living_victim.stat > CONSCIOUS) + playsound(living_victim, 'sound/effects/supermatter.ogg', 80, TRUE) + living_victim.visible_message( + span_danger("You see [living_victim] engulfed in the scorching wrath of the cosmos. \ + For a moment, you see their silhouette flail in agony before fading to mere atoms."), + span_boldbig(span_hypnophrase("THE POWER OF THE COSMOS ITSELF POURS OUT OVER YOUR FORM. \ + WAVES OF HEAT LATCH ONTO YOUR BODY, PULLING IT APART AT THE SEAMS. \ + YOUR TOTAL ANNIHILATION TAKES ONLY A MOMENT BEFORE YOU ARE REDUCED BACK TO WHAT YOU ALWAYS WERE. \ + MOTES OF MERE DUST...")) + ) + living_victim.dust() + living_victim.emote("scream") + living_victim.apply_status_effect(/datum/status_effect/star_mark) + living_victim.apply_damage(damage = 30, damagetype = BURN, spread_damage = TRUE) + cycle_tracker++ + damage_timer = addtimer(CALLBACK(src, PROC_REF(process_beam)), 0.3 SECONDS, TIMER_STOPPABLE) + +/// Stops the beam after we cancel it +/datum/action/cooldown/spell/stargazer_laser/proc/stop_beaming() + SIGNAL_HANDLER + sound_loop.stop() + UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_ATOM_DIR_CHANGE)) + QDEL_NULL(giga_laser) + QDEL_NULL(beam_visual) + QDEL_NULL(end_visual) + QDEL_LIST(beam_fillings) + deltimer(damage_timer) + damage_timer = null + targets = null + /datum/ai_controller/basic_controller/star_gazer blackboard = list( BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, diff --git a/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon.dm b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon.dm index 282ae4d6f55f..c2c40bf7a2ee 100644 --- a/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon.dm +++ b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon.dm @@ -7,6 +7,7 @@ icon_gib = "syndicate_gib" mouse_opacity = MOUSE_OPACITY_ICON basic_mob_flags = DEL_ON_DEATH + mob_biotypes = MOB_ORGANIC|MOB_MINERAL|MOB_MINING speed = 2 maxHealth = 150 health = 150 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 index 42aedc1106db..1000c919b11d 100644 --- a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm +++ b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm @@ -87,7 +87,7 @@ if(!do_after(src, 5 SECONDS, target)) return target.gib(DROP_ALL_REMAINS) - adjustBruteLoss(-1 * heal_on_cannibalize) + adjust_brute_loss(-1 * heal_on_cannibalize) ///Ash whelp, the "lava" variant of ice whelps. /mob/living/basic/mining/ice_whelp/ash diff --git a/code/modules/mob/living/basic/illusion/illlusion_ai.dm b/code/modules/mob/living/basic/illusion/illlusion_ai.dm new file mode 100644 index 000000000000..48270fc25838 --- /dev/null +++ b/code/modules/mob/living/basic/illusion/illlusion_ai.dm @@ -0,0 +1,43 @@ +/// Standard Illusion behavior is primarily dependent on their context, whether they exist as a decoy or someone meant to retaliate against a threat (of varied origin) +/// For the time being however, the AI is very simple and doesn't rely on any advanced tactics. Just go to thing it was assigned to attack and attack it (if assigned, else wander around) +/// However, the action we undergo is based on the subtype of illusion we are and that's done on the mob subtype level. +/datum/ai_controller/basic_controller/illusion + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_traits = DEFAULT_AI_FLAGS + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/escape_captivity, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/// Escape subtype of illusions are made to flee from threats rather than attack them. They do not undergo any retaliation behavior. +/// We also want to account for the possibility of new threats attacking us and fleeing from those too, more randomness is ideal. +/datum/ai_controller/basic_controller/illusion/escape + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, // we don't need the special illusion one here + BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_traits = DEFAULT_AI_FLAGS + ai_movement = /datum/ai_movement/basic_avoidance + + planning_subtrees = list( + /datum/ai_planning_subtree/escape_captivity, + /datum/ai_planning_subtree/target_retaliate/to_flee, + /datum/ai_planning_subtree/flee_target/from_flee_key, + ) + +/// Retaliate subtypes of escape illusions can fight back against threats that attack them, making them more dangerous. +/datum/ai_controller/basic_controller/illusion/escape/retaliate + planning_subtrees = list( + /datum/ai_planning_subtree/escape_captivity, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + diff --git a/code/modules/mob/living/basic/illusion/illusion.dm b/code/modules/mob/living/basic/illusion/illusion.dm new file mode 100644 index 000000000000..793cdb3092c0 --- /dev/null +++ b/code/modules/mob/living/basic/illusion/illusion.dm @@ -0,0 +1,112 @@ +/// Pretty genericky mob that just manifests itself as any sort of input living mob, used in several ways +/// Has a basic AI that helps it attack targets that are assigned to it, but there's more flavor in the subtypes. +/mob/living/basic/illusion + name = "illusion" + desc = "It's a fake!" + icon = 'icons/effects/effects.dmi' + icon_state = "static" + icon_living = "static" + icon_dead = "null" + gender = NEUTER + mob_biotypes = NONE + melee_damage_lower = 5 + melee_damage_upper = 5 + combat_mode = TRUE + attack_verb_continuous = "gores" + attack_verb_simple = "gore" + maxHealth = 100 + health = 100 + speed = 0 + faction = list(FACTION_ILLUSION) + basic_mob_flags = DEL_ON_DEATH + death_message = "vanishes into thin air! It was a fake!" + ai_controller = /datum/ai_controller/basic_controller/illusion + /// Weakref to what we're copying + var/datum/weakref/parent_mob_ref + /// Prob of getting a clone on attack + var/multiply_chance = 0 + /// The blackboard key we want to set for our target + var/target_key = BB_BASIC_MOB_CURRENT_TARGET + +/mob/living/basic/illusion/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_preattack)) + RegisterSignal(src, COMSIG_MOB_AFTER_APPLY_DAMAGE, PROC_REF(on_damage_taken)) + +/mob/living/basic/illusion/examine(mob/user) + var/mob/living/parent_mob = parent_mob_ref?.resolve() + if(parent_mob) + return parent_mob.examine(user) + return ..() + +/// Signal handler for when we attack something. Hook for replicating on standard behavior, with additional behavior on subtypes. +/mob/living/basic/illusion/proc/on_preattack(mob/living/source, atom/attacked_target) + SIGNAL_HANDLER + try_replicate() + +/// Signal handler for when we are attacked. +/mob/living/basic/illusion/proc/on_damage_taken(mob/living/source) + SIGNAL_HANDLER + try_replicate() + +/// Full setup for illusion mobs to lessen code duplication in the individual files. +/mob/living/basic/illusion/proc/full_setup(mob/living/original, mob/living/target_mob = null, list/faction = null, life = 5 SECONDS, hp = 100, damage = 0, replicate = 0) + mock_as(original, life, hp, damage, replicate) + set_faction(faction) + set_target(target_mob) + +/// Gives the illusion a target to focus on in whatever behavior it wants to engage as. +/mob/living/basic/illusion/proc/set_target(mob/living/target_mob) + if(target_mob == null) + return + ai_controller.set_blackboard_key(target_key, target_mob) + +/// Sets the faction of the illusion +/mob/living/basic/illusion/proc/set_faction(list/new_faction) + if(!new_faction) // can be list with no length or null + return + faction = new_faction.Copy() + +/// Does the actual work of setting up the illusion's appearance and some other functionality. +/mob/living/basic/illusion/proc/mock_as(mob/living/original, life, hp, damage, replicate) + if(QDELETED(original)) + return + + parent_mob_ref = WEAKREF(original) + appearance = original.appearance + setDir(original.dir) + + maxHealth = hp + updatehealth() // re-cap health to new value + + melee_damage_lower = damage + melee_damage_upper = damage + multiply_chance = replicate + + faction -= FACTION_NEUTRAL + transform = initial(transform) + pixel_x = base_pixel_x + pixel_y = base_pixel_y + + addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living, death)), life) + +/// See if we are able to replicate, and if so, do it. +/mob/living/basic/illusion/proc/try_replicate() + if(prob(multiply_chance)) + replicate() + +/// Actually perform the replication of this illusion. +/mob/living/basic/illusion/proc/replicate() + var/mob/living/parent_mob = parent_mob_ref.resolve() + if(QDELETED(parent_mob)) + return + var/mob/living/basic/illusion/new_clone = new(loc) + new_clone.full_setup( + parent_mob, + target_mob = ai_controller.blackboard[target_key], + faction = faction, + life = 8 SECONDS, + hp = health / 2, + damage = melee_damage_upper, + replicate = multiply_chance / 2, + ) diff --git a/code/modules/mob/living/basic/illusion/illusion_subtypes.dm b/code/modules/mob/living/basic/illusion/illusion_subtypes.dm new file mode 100644 index 000000000000..26310f478ed3 --- /dev/null +++ b/code/modules/mob/living/basic/illusion/illusion_subtypes.dm @@ -0,0 +1,35 @@ +/// instead of hitting with heavy object, we shove 'em +/mob/living/basic/illusion/shover + +/mob/living/basic/illusion/shover/on_preattack(mob/living/source, atom/attacked_target) + . = ..() + if(disarm(attacked_target)) + return COMPONENT_HOSTILE_NO_ATTACK + +/// designed to run away as fast as possible +/mob/living/basic/illusion/escape + target_key = BB_BASIC_MOB_FLEE_TARGET + ai_controller = /datum/ai_controller/basic_controller/illusion/escape + +/mob/living/basic/illusion/escape/Initialize(mapload) + . = ..() + AddElement(/datum/element/ai_retaliate) + +/// will run away but isn't afraid to get some punches in as it gets out of dodge +/mob/living/basic/illusion/escape/retaliate + ai_controller = /datum/ai_controller/basic_controller/illusion/escape/retaliate + +/mob/living/basic/illusion/escape/on_preattack(mob/living/source, atom/attacked_target) + . = ..() + var/mob/living/parent_mob = parent_mob_ref?.resolve() + if(attacked_target == parent_mob) // we don't want to get our wires crossed and attack our owner ever. + return COMPONENT_HOSTILE_NO_ATTACK + +/// a mirage with a little more flair. not meant to move just to look cool +/mob/living/basic/illusion/mirage + ai_controller = null + density = FALSE + +/mob/living/basic/illusion/mirage/death(gibbed) + do_sparks(rand(3, 6), FALSE, src) + return ..() diff --git a/code/modules/mob/living/basic/jungle/leaper/leaper_abilities.dm b/code/modules/mob/living/basic/jungle/leaper/leaper_abilities.dm index 80e413fb1dd0..5a9c39ee7600 100644 --- a/code/modules/mob/living/basic/jungle/leaper/leaper_abilities.dm +++ b/code/modules/mob/living/basic/jungle/leaper/leaper_abilities.dm @@ -66,7 +66,7 @@ . = ..() if(volume <= 5) return - if(poisoned_mob.adjustToxLoss(2.5 * REM * seconds_per_tick, updating_health = FALSE)) + if(poisoned_mob.adjust_tox_loss(2.5 * REM * seconds_per_tick, updating_health = FALSE)) return UPDATE_MOB_HEALTH // bubble ability structure diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling.dm b/code/modules/mob/living/basic/jungle/seedling/seedling.dm index 8629d6c84cc6..129e7d7b2f3a 100644 --- a/code/modules/mob/living/basic/jungle/seedling/seedling.dm +++ b/code/modules/mob/living/basic/jungle/seedling/seedling.dm @@ -336,7 +336,7 @@ var/mob/living/living_target = target_atom living_target.adjust_fire_stacks(0.2) living_target.ignite_mob() - living_target.adjustFireLoss(30) + living_target.adjust_fire_loss(30) playsound(target_turf, 'sound/effects/magic/lightningbolt.ogg', 50, TRUE) if(!is_seedling) diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm b/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm index a4b85a3da175..fe4f3204f26c 100644 --- a/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm +++ b/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm @@ -40,7 +40,7 @@ /datum/ai_behavior/find_and_set/treatable_hydro action_cooldown = 5 SECONDS -/datum/ai_behavior/find_and_set/treatable_hydro/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/treatable_hydro/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/list/possible_trays = list() var/mob/living/living_pawn = controller.pawn var/waterlevel_threshold = controller.blackboard[BB_WATERLEVEL_THRESHOLD] @@ -102,7 +102,7 @@ /datum/ai_behavior/find_and_set/beamable_hydroplants action_cooldown = 15 SECONDS -/datum/ai_behavior/find_and_set/beamable_hydroplants/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/beamable_hydroplants/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/list/possible_trays = list() for(var/obj/machinery/hydroponics/hydro in oview(search_range, controller.pawn)) diff --git a/code/modules/mob/living/basic/jungle/venus_human_trap.dm b/code/modules/mob/living/basic/jungle/venus_human_trap.dm index 4ee9932f2dd8..87d244725669 100644 --- a/code/modules/mob/living/basic/jungle/venus_human_trap.dm +++ b/code/modules/mob/living/basic/jungle/venus_human_trap.dm @@ -110,7 +110,7 @@ if(isliving(AM)) var/mob/living/L = AM if(!isvineimmune(L)) - L.adjustBruteLoss(5) + L.adjust_brute_loss(5) to_chat(L, span_alert("You cut yourself on the thorny vines.")) /** @@ -197,7 +197,7 @@ else if(vines_in_range) alert_shown = FALSE - adjustBruteLoss(vines_in_range ? -weed_heal : no_weed_damage) //every life tick take 20 damage if not near vines or heal 10 if near vines, 5 times out of weeds = u ded + adjust_brute_loss(vines_in_range ? -weed_heal : no_weed_damage) //every life tick take 20 damage if not near vines or heal 10 if near vines, 5 times out of weeds = u ded /datum/action/cooldown/mob_cooldown/projectile_attack/vine_tangle name = "Tangle" diff --git a/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm index b1f79ea6b509..3d6380d25be7 100644 --- a/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm +++ b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm @@ -7,6 +7,7 @@ icon_dead = "basilisk_dead" speak_emote = list("chimes") damage_coeff = list(BRUTE = 1, BURN = 0.1, TOX = 1, STAMINA = 0, OXY = 1) + mob_biotypes = parent_type::mob_biotypes | MOB_MINERAL speed = 20 maxHealth = 200 health = 200 diff --git a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_instrument.dm b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_instrument.dm index 1e2d42761b9b..508728ffa739 100644 --- a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_instrument.dm +++ b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_instrument.dm @@ -6,6 +6,7 @@ icon_state = "bilehorn" allowed_instrument_ids = "bilehorn" inhand_icon_state = null + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 2) /datum/crafting_recipe/bilehorn name = "Bilehorn" diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm index debd43e4504a..662bbe9fb69c 100644 --- a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm +++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm @@ -17,6 +17,7 @@ icon_state = "oresensor" icon = 'icons/obj/mining.dmi' slot_flags = ITEM_SLOT_EARS + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT) var/range = 5 var/cooldown = 4 SECONDS //between the standard and the advanced ore scanner in strength COOLDOWN_DECLARE(ore_sensing_cooldown) diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm index d52cc1742c7f..9a531a7bb450 100644 --- a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm @@ -83,7 +83,7 @@ if(stat != CONSCIOUS) return COMPONENT_BULLET_PIERCED - ///high penetration bullets should still go through. No goldgrub can save you from the colossus' death bolts. + /// High penetration bullets should still go through. No goldgrub can save you from the colossus' death bolts. if(prob(hitting_projectile.armour_penetration)) return NONE @@ -94,6 +94,7 @@ playsound(src, 'sound/effects/splat.ogg', 50, TRUE) for(var/obj/item/stack/ore/ore in src) ore.forceMove(loc) + if(!gibbed) visible_message(span_danger("[src] spits out its consumed ores!")) diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm index 68a31816fd46..63842f05ef50 100644 --- a/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm @@ -112,7 +112,7 @@ /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)) + if(!target_turf.IsReachableBy(basic_mob)) return AI_BEHAVIOR_DELAY basic_mob.melee_attack(target_turf) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED diff --git a/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm b/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm index 5b275843f859..cc9546474ec2 100644 --- a/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm +++ b/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm @@ -47,7 +47,7 @@ continue balloon_alert(victim, "grabbed") visible_message(span_danger("[src] grabs hold of [victim]!")) - victim.adjustBruteLoss(rand(min_damage, max_damage)) + victim.adjust_brute_loss(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) diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm index 3505f7a368a7..c6b5f5745328 100644 --- a/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm +++ b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm @@ -31,14 +31,10 @@ . = ..() animate_pulse() -/obj/item/organ/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/legion_tumour/on_begin_failure() + animate_pulse() -/obj/item/organ/legion_tumour/set_organ_damage(damage_amount, required_organ_flag) - . = ..() +/obj/item/organ/legion_tumour/on_failure_recovery() animate_pulse() /// Do a heartbeat animation depending on if we're failing or not diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm index d2fee05e2c7a..935228901347 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm @@ -240,8 +240,8 @@ grown.tamed() for(var/friend in ai_controller?.blackboard?[BB_FRIENDS_LIST]) grown.befriend(friend) - grown.setBruteLoss(getBruteLoss()) - grown.setFireLoss(getFireLoss()) + grown.set_brute_loss(get_brute_loss()) + grown.set_fire_loss(get_fire_loss()) qdel(src) //We called change_mob_type without 'delete_old_mob = TRUE' since we had to pass down friends and damage /mob/living/basic/mining/lobstrosity/juvenile/lava diff --git a/code/modules/mob/living/basic/lavaland/mining.dm b/code/modules/mob/living/basic/lavaland/mining.dm index 31184b0459e8..258b897457cc 100644 --- a/code/modules/mob/living/basic/lavaland/mining.dm +++ b/code/modules/mob/living/basic/lavaland/mining.dm @@ -1,5 +1,6 @@ ///prototype for mining mobs /mob/living/basic/mining + abstract_type = /mob/living/basic/mining icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' combat_mode = TRUE status_flags = NONE //don't inherit standard basicmob flags diff --git a/code/modules/mob/living/basic/lavaland/mook/mook.dm b/code/modules/mob/living/basic/lavaland/mook/mook.dm index a2cccfdbe891..a9cd028f4b6a 100644 --- a/code/modules/mob/living/basic/lavaland/mook/mook.dm +++ b/code/modules/mob/living/basic/lavaland/mook/mook.dm @@ -257,6 +257,10 @@ ai_controller.set_blackboard_key(BB_SONG_INSTRUMENT, held_guitar) update_appearance() +/mob/living/basic/mining/mook/worker/bard/Destroy(force) + QDEL_NULL(held_guitar) + . = ..() + /mob/living/basic/mining/mook/worker/tribal_chief name = "tribal chief" desc = "Acknowledge him!" diff --git a/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm b/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm index 44f84da8fa77..ae9fd3d3de25 100644 --- a/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm +++ b/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm @@ -37,7 +37,7 @@ var/times_to_attack = 4 /datum/action/cooldown/mob_cooldown/mook_ability/mook_leap/Activate(atom/target) - if(owner.CanReach(target)) + if(target.IsReachableBy(owner)) attack_combo(target) StartCooldown() return TRUE @@ -74,14 +74,14 @@ owner.throw_at(target = final_turf, range = 7, speed = 1, spin = FALSE, callback = CALLBACK(src, PROC_REF(attack_combo), target)) /datum/action/cooldown/mob_cooldown/mook_ability/mook_leap/proc/attack_combo(atom/target) - if(!owner.CanReach(target)) + if(!target.IsReachableBy(owner)) return FALSE for(var/i in 0 to (times_to_attack - 1)) addtimer(CALLBACK(src, PROC_REF(attack_target), target), i * attack_interval) /datum/action/cooldown/mob_cooldown/mook_ability/mook_leap/proc/attack_target(atom/target) - if(!owner.CanReach(target) || owner.stat == DEAD) + if(!target.IsReachableBy(owner) || owner.stat == DEAD) return var/mob/living/basic/basic_owner = owner basic_owner.melee_attack(target, ignore_cooldown = TRUE) diff --git a/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm b/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm index 41ce948d2a88..14a8acdabbd9 100644 --- a/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm +++ b/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm @@ -250,7 +250,7 @@ GLOBAL_LIST_INIT(mook_commands, list( /datum/ai_behavior/find_and_set/music_audience -/datum/ai_behavior/find_and_set/music_audience/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/music_audience/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/atom/home = controller.blackboard[BB_HOME_VILLAGE] for(var/mob/living/carbon/human/target in oview(search_range, controller.pawn)) if(target.stat > UNCONSCIOUS || !target.mind) @@ -289,7 +289,7 @@ GLOBAL_LIST_INIT(mook_commands, list( return controller.queue_behavior(/datum/ai_behavior/find_and_set/find_chief, BB_MOOK_TRIBAL_CHIEF, /mob/living/basic/mining/mook/worker/tribal_chief) -/datum/ai_behavior/find_and_set/find_chief/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/find_chief/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/mob/living/chief = locate(locate_path) in oview(search_range, controller.pawn) if(isnull(chief)) return null diff --git a/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm b/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm index 576cc24cf828..f43ffb924c23 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm @@ -1,12 +1,3 @@ -GLOBAL_LIST_INIT(raptor_growth_paths, list( - /mob/living/basic/raptor/baby_raptor/red = list(RAPTOR_PURPLE, RAPTOR_WHITE), - /mob/living/basic/raptor/baby_raptor/white = list(RAPTOR_GREEN, RAPTOR_PURPLE), - /mob/living/basic/raptor/baby_raptor/purple = list(RAPTOR_GREEN, RAPTOR_WHITE), - /mob/living/basic/raptor/baby_raptor/yellow = list(RAPTOR_GREEN, RAPTOR_RED), - /mob/living/basic/raptor/baby_raptor/green = list(RAPTOR_RED, RAPTOR_YELLOW), - /mob/living/basic/raptor/baby_raptor/blue = list(RAPTOR_RED, RAPTOR_PURPLE) -)) - GLOBAL_LIST_INIT(raptor_inherit_traits, list( BB_BASIC_DEPRESSED = "Depressed", BB_RAPTOR_MOTHERLY = "Motherly", @@ -16,23 +7,25 @@ GLOBAL_LIST_INIT(raptor_inherit_traits, list( GLOBAL_LIST_EMPTY(raptor_population) -#define HAPPINESS_BOOST_DAMPENER 0.3 - -/// Innate raptor offsets -#define RAPTOR_INNATE_SOURCE "raptor_innate" - /mob/living/basic/raptor name = "raptor" desc = "A trusty, powerful steed. Taming it might prove difficult..." icon = 'icons/mob/simple/lavaland/raptor_big.dmi' - speed = 2 + icon_state = "raptor_red" + base_icon_state = "raptor" + pixel_w = -12 + base_pixel_w = -12 + speed = 0.5 mob_biotypes = MOB_ORGANIC|MOB_BEAST - maxHealth = 270 - health = 270 + maxHealth = 200 + health = 200 melee_damage_lower = 10 melee_damage_upper = 15 combat_mode = TRUE mob_size = MOB_SIZE_LARGE + head_icon = 'icons/mob/clothing/back/pets_back.dmi' + worn_slot_flags = ITEM_SLOT_BACK + held_w_class = WEIGHT_CLASS_BULKY unsuitable_atmos_damage = 0 minimum_survivable_temperature = BODYTEMP_COLD_ICEBOX_SAFE maximum_survivable_temperature = INFINITY @@ -45,14 +38,13 @@ GLOBAL_LIST_EMPTY(raptor_population) /obj/item/food/meat/slab/chicken = 4, /obj/item/stack/sheet/bone = 2, ) - ai_controller = /datum/ai_controller/basic_controller/raptor - ///can this mob breed + // AI controller is set by our color + ai_controller = null + /// Can this raptor breed? var/can_breed = TRUE - ///should we change offsets on direction change? + /// Should we change offsets on direction change? var/change_offsets = TRUE - ///can we ride this mob - var/ridable_component = /datum/component/riding/creature/raptor - //pet commands when we tame the raptor + /// Pet commands when we tame the raptor var/static/list/pet_commands = list( /datum/pet_command/breed, /datum/pet_command/idle, @@ -62,24 +54,47 @@ GLOBAL_LIST_EMPTY(raptor_population) /datum/pet_command/follow, /datum/pet_command/fetch, ) - ///things we inherited from our parent - var/datum/raptor_inheritance/inherited_stats - ///our color - var/raptor_color - ///the description that appears in the dex - var/dex_description - ///path of our child - var/child_path - + /// Can we wear a collar? If so, what is our icon state prefix for it? + var/collar_state = "raptor" + /// Raptor color datum assigned to this raptor, this is a singleton + var/datum/raptor_color/raptor_color = null + /// Are we an adult, youngling or baby? + var/growth_stage = RAPTOR_ADULT + /// Our current growth progress towards the next stage if we're a youngling or a baby + var/growth_progress = 0 + /// Probability of getting progress in the baby phase each second + var/growth_probability = 80 + /// Food types that we can consume + var/static/list/food_types = list( + /obj/item/stack/ore = 0, + /obj/item/food/meat = 15, + /obj/item/food/meat/slab = 25, + /obj/item/food/meat/slab/spider = -15, // Toxic meats + /obj/item/food/meat/slab/xeno = -15, + /obj/item/food/meat/steak = 50, + /obj/item/food/grown/ash_flora = 10, + /obj/item/fish = 15, + /obj/item/organ = 25, + ) + /// Inheritance datum we store our genetic data in + var/datum/raptor_inheritance/inherited_stats = null + /// Current happiness value of the raptor + var/happiness_percentage = 0 -/mob/living/basic/raptor/Initialize(mapload) +/mob/living/basic/raptor/Initialize(mapload, datum/raptor_color/color_type, datum/raptor_inheritance/passed_stats) . = ..() - if(SSmapping.is_planetary()) - change_offsets = FALSE - icon = 'icons/mob/simple/lavaland/raptor_icebox.dmi' + inherited_stats = passed_stats || new(src) + // First thing as to go before tameable in change_growth_stage() + AddElement(/datum/element/basic_eating, food_types = food_types) + raptor_color = GLOB.raptor_colors[color_type || raptor_color || pick(GLOB.raptor_colors)] + raptor_color.setup_raptor(src) + + if (growth_stage == RAPTOR_ADULT) + raptor_color.setup_adult(src) + else + change_growth_stage(growth_stage, RAPTOR_ADULT) - AddElement(/datum/element/wears_collar) - add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE), INNATE_TRAIT) + add_traits(list(TRAIT_ASHSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE, TRAIT_MINING_AOE_IMMUNE), INNATE_TRAIT) AddElement(\ /datum/element/crusher_loot,\ trophy_type = /obj/item/crusher_trophy/raptor_feather,\ @@ -87,63 +102,47 @@ GLOBAL_LIST_EMPTY(raptor_population) drop_immediately = FALSE,\ ) - if(!mapload) + if (!mapload) GLOB.raptor_population += REF(src) - AddComponent(/datum/component/obeys_commands, pet_commands) + AddComponent(/datum/component/obeys_commands, pet_commands, list(0, -base_pixel_w)) AddElement(\ /datum/element/change_force_on_death,\ move_resist = MOVE_RESIST_DEFAULT,\ ) + RegisterSignal(src, COMSIG_MOB_ATE, PROC_REF(on_eat)) + RegisterSignal(src, COMSIG_MOB_PRE_EAT, PROC_REF(on_pre_eat)) - var/static/list/display_emote = list( - BB_EMOTE_SAY = list("Chirp chirp chirp!", "Kweh!", "Bwark!"), - BB_EMOTE_SEE = list("shakes its feathers!", "stretches!", "flaps its wings!", "pecks at the ground!"), - BB_EMOTE_SOUND = list( - 'sound/mobs/non-humanoids/raptor/raptor_1.ogg', - 'sound/mobs/non-humanoids/raptor/raptor_2.ogg', - 'sound/mobs/non-humanoids/raptor/raptor_3.ogg', - 'sound/mobs/non-humanoids/raptor/raptor_4.ogg', - 'sound/mobs/non-humanoids/raptor/raptor_5.ogg', - ), - BB_SPEAK_CHANCE = 2, - ) - - ai_controller.set_blackboard_key(BB_BASIC_MOB_SPEAK_LINES, display_emote) - inherited_stats = new - inherit_properties() - var/list/my_food = string_list(list(/obj/item/stack/ore)) - AddElement(/datum/element/basic_eating, food_types = my_food) AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/ai_flee_while_injured, stop_fleeing_at = 0.5, start_fleeing_below = 0.2) - if(ridable_component) - AddElement(/datum/element/ridable, ridable_component) - - if(can_breed) + if (can_breed) add_breeding_component() + // Babies handle it in their change_growth_stage + if (growth_stage != RAPTOR_BABY) + update_blackboard() + AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_CLAW) RegisterSignal(src, COMSIG_ATOM_DIR_CHANGE, PROC_REF(on_dir_change)) + RegisterSignal(src, COMSIG_LIVING_SCOOPED_UP, PROC_REF(on_picked_up)) adjust_offsets(dir) add_happiness_component() +/mob/living/basic/raptor/Destroy() + raptor_color = null + GLOB.raptor_population -= REF(src) + return ..() + +/mob/living/basic/raptor/death(gibbed) + . = ..() + GLOB.raptor_population -= REF(src) + /mob/living/basic/raptor/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, buckle_mob_flags= NONE) if(!iscarbon(target)) return return ..() -/mob/living/basic/raptor/proc/add_happiness_component() - var/static/list/percentage_callbacks = list(0, 15, 25, 35, 50, 75, 90, 100) - AddComponent(\ - /datum/component/happiness,\ - on_petted_change = 100,\ - on_groom_change = 100,\ - on_eat_change = 400,\ - callback_percentages = percentage_callbacks,\ - happiness_callback = CALLBACK(src, PROC_REF(happiness_change)),\ - ) - /mob/living/basic/raptor/proc/on_dir_change(datum/source, old_dir, new_dir) SIGNAL_HANDLER adjust_offsets(new_dir) @@ -153,14 +152,40 @@ GLOBAL_LIST_EMPTY(raptor_population) return switch (direction) - if (NORTH) - add_offsets(RAPTOR_INNATE_SOURCE, w_add = -8, animate = FALSE) - if (SOUTH) + if (NORTH, SOUTH) add_offsets(RAPTOR_INNATE_SOURCE, w_add = 0, animate = FALSE) if (EAST, SOUTHEAST, NORTHEAST) - add_offsets(RAPTOR_INNATE_SOURCE, w_add = -20, animate = FALSE) + add_offsets(RAPTOR_INNATE_SOURCE, w_add = -8, animate = FALSE) if (WEST, SOUTHWEST, NORTHWEST) - add_offsets(RAPTOR_INNATE_SOURCE, w_add = -5, animate = FALSE) + add_offsets(RAPTOR_INNATE_SOURCE, w_add = 8, animate = FALSE) + +/mob/living/basic/raptor/examine(mob/user) + . = ..() + if (stat == DEAD) + return + + switch (health / maxHealth) + if (0 to 0.2) + . += span_italics(span_bolddanger("[p_They()] [p_are()] gruesomly wounded, barely staying up on [p_their()] feet!")) + if (0.2 to 0.4) + . += span_danger("[p_They()] [p_have()] heavy injuries and open wounds all around [p_their()] body!") + if (0.4 to 0.6) + . += span_warning("[p_They()] [p_are()] noticeably hurt, limping from [p_their()] cuts and bruises.") + if (0.6 to 0.8) + . += span_warning("[p_They()] [p_are()] visibly injured, a few bruises and cuts showing between [p_their()] feathers.") + if (0.8 to 0.999) + . += span_notice("[p_They()] [p_have()] a few minor bruises and scratches.") + +/mob/living/basic/raptor/Life(seconds_per_tick, times_fired) + . = ..() + if (growth_stage != RAPTOR_BABY || HAS_TRAIT(src, TRAIT_STASIS) || stat == DEAD) + return + if (!SPT_PROB(growth_probability * (1 + happiness_percentage * RAPTOR_GROWTH_HAPPINESS_MULTIPLIER), seconds_per_tick)) + return + growth_progress += rand(RAPTOR_BABY_GROWTH_LOWER, RAPTOR_BABY_GROWTH_UPPER) + if (growth_progress >= RAPTOR_GROWTH_REQUIRED) + change_growth_stage(RAPTOR_YOUNG) + growth_progress = 0 /mob/living/basic/raptor/early_melee_attack(atom/target, list/modifiers, ignore_cooldown) . = ..() @@ -168,9 +193,7 @@ GLOBAL_LIST_EMPTY(raptor_population) return FALSE if(!istype(target, /obj/structure/ore_container/food_trough/raptor_trough)) return TRUE - var/obj/ore_food = locate(/obj/item/stack/ore) in target - if(isnull(ore_food)) balloon_alert(src, "no food!") else @@ -178,169 +201,383 @@ GLOBAL_LIST_EMPTY(raptor_population) return FALSE /mob/living/basic/raptor/melee_attack(mob/living/target, list/modifiers, ignore_cooldown) - if(!combat_mode && istype(target, /mob/living/basic/raptor/baby_raptor)) - target.attack_hand(src, list(LEFT_CLICK = TRUE)) - return + if (!combat_mode && istype(target, /mob/living/basic/raptor)) + var/mob/living/basic/raptor/possible_baby = target + if (possible_baby.growth_stage == RAPTOR_BABY) + return target.attack_hand(src, list(LEFT_CLICK = TRUE)) return ..() -/mob/living/basic/raptor/death(gibbed) - . = ..() - GLOB.raptor_population -= REF(src) +/mob/living/basic/raptor/proc/add_breeding_component() + var/static/list/partner_types = typecacheof(list(/mob/living/basic/raptor)) + var/static/list/baby_types = list(/obj/item/food/egg/raptor_egg = 1) + AddComponent(\ + /datum/component/breed, \ + can_breed_with = partner_types, \ + baby_paths = baby_types, \ + breed_timer = 3 MINUTES, \ + post_birth = CALLBACK(src, PROC_REF(egg_inherit)), \ + ) -/mob/living/basic/raptor/proc/happiness_change(percent_value) - var/attack_boost = round(initial(melee_damage_lower) * percent_value * HAPPINESS_BOOST_DAMPENER, 1) - melee_damage_lower = initial(melee_damage_lower) + attack_boost - melee_damage_upper = melee_damage_lower + 5 +/mob/living/basic/raptor/proc/add_happiness_component() + var/static/list/percentage_callbacks = list(0, 15, 25, 35, 50, 75, 90, 100) + // Higher happiness cap so it decays slower, about 15 minutes from full to zero + AddComponent(\ + /datum/component/happiness, \ + maximum_happiness = 900, \ + on_petted_change = 50, \ + on_groom_change = 200, \ + on_eat_change = 150, \ + callback_percentages = percentage_callbacks,\ + happiness_callback = CALLBACK(src, PROC_REF(happiness_change)),\ + ) +/mob/living/basic/raptor/proc/happiness_change(percent_value) + var/attack_boost = round((percent_value - happiness_percentage) * RAPTOR_HAPPINESS_DAMAGE_BOOST, 1) + melee_damage_lower += attack_boost + melee_damage_upper += attack_boost + happiness_percentage = percent_value + +/mob/living/basic/raptor/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) + // Most colors will redirect shots to their rider as to increase their own survivability, and only tank melee attacks + if (raptor_color.redirect_shots && length(buckled_mobs)) + return buckled_mobs[1].projectile_hit(hitting_projectile, def_zone, piercing_hit, blocked) + return ..() -///pass down our inheritance to the egg +/// Pass our genetic data to the egg /mob/living/basic/raptor/proc/egg_inherit(obj/item/food/egg/raptor_egg/baby_egg, mob/living/basic/raptor/partner) - var/datum/raptor_inheritance/inherit = new - inherit.set_parents(inherited_stats, partner.inherited_stats) - baby_egg.inherited_stats = inherit - baby_egg.determine_growth_path(src, partner) + var/datum/raptor_inheritance/child_genes = new() + child_genes.set_parents(src, partner) + baby_egg.inherited_stats = child_genes + baby_egg.child_color = get_child_color(partner) + // Halve our food modifiers every time we breed + for (var/food_type in inherited_stats.foods_eaten) + var/list/stat_mods = inherited_stats.foods_eaten[food_type] + stat_mods["amount"] /= 2 + stat_mods["attack"] /= 2 + stat_mods["health"] /= 2 + stat_mods["speed"] /= 2 + stat_mods["ability"] /= 2 + stat_mods["growth"] /= 2 + var/list/trait_list = stat_mods["traits"] + for (var/i in 1 to ceil(length(trait_list) / 2)) + trait_list -= pick(trait_list) + + var/list/color_chances = stat_mods["color_chances"] + for (var/datum/raptor_color/color_type as anything in color_chances) + color_chances[color_type] = floor(color_chances[color_type] / 2) + if (!color_chances[color_type]) + color_chances -= color_type + +/mob/living/basic/raptor/proc/get_child_color(mob/living/basic/raptor/partner) + if (raptor_color == partner.raptor_color) + return raptor_color.type + + if (raptor_color.guaranteed_crossbreeds[partner.raptor_color.type]) + return raptor_color.guaranteed_crossbreeds[partner.raptor_color.type] + + // This should be redundant as they should be mirroring eachother, but just in case + if (partner.raptor_color.guaranteed_crossbreeds[raptor_color.type]) + return partner.raptor_color.guaranteed_crossbreeds[raptor_color.type] + + // We've got all the colors in our family tree and aren't rolling a guarantee, bingo + if (length(inherited_stats.parent_colors | partner.inherited_stats.parent_colors | raptor_color.type | partner.raptor_color.type) >= (length(GLOB.raptor_colors) - 1)) + return /datum/raptor_color/black + + var/list/prob_list = list() + for (var/datum/raptor_color/color_type as anything in GLOB.raptor_colors) + prob_list[color_type] = color_type::spawn_chance + + var/amount_eaten = 0 + for (var/food_type in inherited_stats.foods_eaten) + var/list/stat_mods = inherited_stats.foods_eaten[food_type] + amount_eaten += stat_mods["amount"] + + for (var/food_type in inherited_stats.foods_eaten) + var/list/stat_mods = inherited_stats.foods_eaten[food_type] + var/list/color_chances = stat_mods["color_chances"] + for (var/datum/raptor_color/color_type as anything in color_chances) + prob_list[color_type] += floor(color_chances[color_type] * stat_mods["amount"]) + + return pick_weight(prob_list) + +/mob/living/basic/raptor/proc/on_picked_up(mob/living/basic/raptor/source, mob/living/user, obj/item/mob_holder/holder) + SIGNAL_HANDLER + // Our inventory code sucks so we have to do this + holder.icon = 'icons/mob/simple/lavaland/raptor_baby.dmi' + holder.icon_state = icon_state + holder.alternate_worn_layer = HEAD_LAYER + holder.pixel_w = 0 + holder.pixel_z = 0 + holder.base_pixel_w = 0 + holder.base_pixel_z = 0 + +/mob/living/basic/raptor/proc/on_pre_eat(datum/source, obj/item/potential_food, list/effect_mult) + SIGNAL_HANDLER + + if (isorgan(potential_food)) + var/obj/item/organ/guts = potential_food + if (!(guts.organ_flags & ORGAN_EDIBLE) || !(guts.organ_flags & ORGAN_ORGANIC)) + return COMSIG_MOB_CANCEL_EAT -/mob/living/basic/raptor/proc/inherit_properties() - if(isnull(inherited_stats)) + if (happiness_percentage) + effect_mult += happiness_percentage * RAPTOR_GROWTH_HAPPINESS_MULTIPLIER + +/mob/living/basic/raptor/proc/on_eat(datum/source, atom/food, mob/living/feeder) + SIGNAL_HANDLER + + if (!istype(food, /obj/item/food)) return - for(var/trait in GLOB.raptor_inherit_traits) // done this way to allow overriding of traits when assigned new inherit datum - var/should_inherit = (trait in inherited_stats.inherit_traits) - ai_controller?.set_blackboard_key(trait, should_inherit) - melee_damage_lower += inherited_stats.attack_modifier - melee_damage_upper += melee_damage_lower + 5 - maxHealth += inherited_stats.health_modifier - heal_overall_damage(maxHealth) -/mob/living/basic/raptor/proc/add_breeding_component() - var/static/list/partner_types = typecacheof(list(/mob/living/basic/raptor)) - var/static/list/baby_types = list(/obj/item/food/egg/raptor_egg = 1) - AddComponent(\ - /datum/component/breed,\ - can_breed_with = typecacheof(list(/mob/living/basic/raptor)),\ - baby_paths = baby_types,\ - post_birth = CALLBACK(src, PROC_REF(egg_inherit)),\ - breed_timer = 3 MINUTES,\ + var/obj/item/food/meal = food + var/is_flora = istype(meal, /obj/item/food/grown/ash_flora) + var/is_meat = (meal.foodtypes & (MEAT|GORE)) + // Babies cannot gain growth from eating meat, only plants, but they get some passively + if ((!is_meat || growth_stage == RAPTOR_BABY) && !is_flora) + return + + if (growth_stage == RAPTOR_ADULT) + return + + // Better meals make your raptor grow faster + var/growth_value = meal.crafting_complexity * RAPTOR_MEAL_COMPLEXITY_GROWTH_FACTOR + (is_flora ? RAPTOR_GROWTH_BASE_PLANT : RAPTOR_GROWTH_BASE_MEAT) + growth_progress += growth_value * (1 + inherited_stats.growth_modifier) * (1 + happiness_percentage * RAPTOR_GROWTH_HAPPINESS_MULTIPLIER) + if (growth_progress >= RAPTOR_GROWTH_REQUIRED) + change_growth_stage(growth_stage == RAPTOR_BABY ? RAPTOR_YOUNG : RAPTOR_ADULT) + growth_progress = 0 + +/// Changes the raptor to a new growth stage. Only should be done forwards, or on raptor init as the first thing before everything else +/// Sorry for the monolith, but splitting it up results in even worse looking code with a ton of duplicate calls and assignments +/// And making a *second* datum is just insanity +/mob/living/basic/raptor/proc/change_growth_stage(new_stage, prev_stage = growth_stage) + if (new_stage == prev_stage) + return FALSE + + if (SEND_SIGNAL(src, COMSIG_RAPTOR_GROWTH_STAGE_CHANGE, new_stage, prev_stage) & COMPONENT_CANCEL_RAPTOR_GROWTH) + return FALSE + + growth_stage = new_stage + + // Visuals + switch (new_stage) + if (RAPTOR_BABY) + name = "baby raptor" + desc = "Will this grow into something useful?" + icon = 'icons/mob/simple/lavaland/raptor_baby.dmi' + base_icon_state = "baby" + base_pixel_w = 0 + mob_size = MOB_SIZE_TINY + if (RAPTOR_YOUNG) + name = "raptor youngling" + desc = "A young raptor that can grow into a robust, trusty steed. Rather naive at such an age, it shouldn't be too hard to tame." + icon = 'icons/mob/simple/lavaland/raptor_big.dmi' + base_icon_state = "young" + base_pixel_w = initial(base_pixel_w) + mob_size = MOB_SIZE_HUMAN + if (RAPTOR_ADULT) + name = "raptor" + desc = initial(desc) + icon = 'icons/mob/simple/lavaland/raptor_big.dmi' + base_icon_state = "raptor" + base_pixel_w = initial(base_pixel_w) + mob_size = initial(mob_size) + + can_be_held = initial(density) + density = initial(density) + move_resist = initial(move_resist) + can_breed = initial(can_breed) + change_offsets = initial(change_offsets) + + if (new_stage == RAPTOR_ADULT) + // Adults need to be tamed with skill rather than snacks + qdel(GetComponent(/datum/component/tameable)) + else // Make us teeny-tiny + can_be_held = TRUE + density = FALSE + can_breed = FALSE + move_resist = MOVE_RESIST_DEFAULT + change_offsets = FALSE + + if (prev_stage == RAPTOR_ADULT) + AddComponent(/datum/component/tameable, food_types = food_types, tame_chance = 25, bonus_tame_chance = 15, unique = TRUE) + + if (change_offsets) + adjust_offsets(dir) + else + remove_offsets(RAPTOR_INNATE_SOURCE, FALSE) + + if (can_breed) + add_breeding_component() + else + qdel(GetComponent(/datum/component/breed)) + + var/obj/item/mob_holder/holder = null + if (istype(loc, /obj/item/mob_holder)) + holder = loc + if (!can_be_held) + holder.release() + holder = null + + if (collar_state) + RemoveElement(/datum/element/wears_collar, collar_icon = 'icons/mob/simple/lavaland/raptor_big.dmi', collar_icon_state = "[collar_state]_") + + if (new_stage == RAPTOR_BABY) + collar_state = null + var/list/friends = ai_controller?.blackboard[BB_FRIENDS_LIST] + if (friends) + friends = friends.Copy() + QDEL_NULL(ai_controller) + ai_controller = new /datum/ai_controller/basic_controller/baby_raptor(src) + for (var/old_friend in friends) + ai_controller.insert_blackboard_key_lazylist(BB_FRIENDS_LIST, old_friend) + update_blackboard() + held_w_class = WEIGHT_CLASS_SMALL + worn_slot_flags = NONE + holder?.update_weight_class(held_w_class) + else + collar_state = base_icon_state + AddElement(/datum/element/wears_collar, collar_icon = 'icons/mob/simple/lavaland/raptor_big.dmi', collar_icon_state = "[collar_state]_") + if (prev_stage == RAPTOR_BABY) + var/list/friends = ai_controller?.blackboard[BB_FRIENDS_LIST] + if (friends) + friends = friends.Copy() + QDEL_NULL(ai_controller) + ai_controller = new raptor_color.ai_controller(src) + for (var/old_friend in friends) + ai_controller.insert_blackboard_key_lazylist(BB_FRIENDS_LIST, old_friend) + update_blackboard() + held_w_class = WEIGHT_CLASS_BULKY + worn_slot_flags = ITEM_SLOT_BACK + holder?.update_weight_class(held_w_class) + + // And finish the setup on our color's side + switch (new_stage) + if (RAPTOR_BABY) + raptor_color.setup_baby(src) + if (RAPTOR_YOUNG) + raptor_color.setup_young(src) + if (RAPTOR_ADULT) + raptor_color.setup_adult(src) + return TRUE + +/mob/living/basic/raptor/proc/update_blackboard() + var/static/list/display_emote = list( + BB_EMOTE_SAY = list("Chirp chirp chirp!", "Kweh!", "Bwark!"), + BB_EMOTE_SEE = list("shakes its feathers!", "stretches!", "flaps its wings!", "pecks at the ground!"), + BB_EMOTE_SOUND = list( + 'sound/mobs/non-humanoids/raptor/raptor_1.ogg', + 'sound/mobs/non-humanoids/raptor/raptor_2.ogg', + 'sound/mobs/non-humanoids/raptor/raptor_3.ogg', + 'sound/mobs/non-humanoids/raptor/raptor_4.ogg', + 'sound/mobs/non-humanoids/raptor/raptor_5.ogg', + ), + BB_SPEAK_CHANCE = 2, ) + ai_controller.set_blackboard_key(BB_BASIC_MOB_SPEAK_LINES, display_emote) -/mob/living/basic/raptor/Destroy() - QDEL_NULL(inherited_stats) - return ..() + var/static/list/preferred_foods = typecacheof(list( + /obj/item/food/meat, + /obj/item/food/grown/ash_flora, + )) - typecacheof(list( // Don't seek out toxic foods + /obj/item/food/meat/slab/spider, + /obj/item/food/meat/slab/xeno, + )) + + ai_controller.set_blackboard_key(BB_BASIC_FOODS, preferred_foods) + + for(var/trait in GLOB.raptor_inherit_traits) + var/should_inherit = (trait in inherited_stats.personality_traits) + ai_controller?.set_blackboard_key(trait, should_inherit) + +// Raptor types for mappers to use /mob/living/basic/raptor/red - name = "red raptor" icon_state = "raptor_red" - icon_living = "raptor_red" - icon_dead = "raptor_red_dead" - melee_damage_lower = 15 - melee_damage_upper = 20 - raptor_color = RAPTOR_RED - ridable_component = /datum/component/riding/creature/raptor/combat - dex_description = "A resilient breed of raptors, battle-tested and bred for the purpose of humbling its foes in combat, \ - This breed demonstrates higher combat capabilities than its peers and oozes ruthless aggression." - child_path = /mob/living/basic/raptor/baby_raptor/red + raptor_color = /datum/raptor_color/red /mob/living/basic/raptor/purple - name = "purple raptor" icon_state = "raptor_purple" - icon_living = "raptor_purple" - icon_dead = "raptor_purple_dead" - raptor_color = RAPTOR_PURPLE - dex_description = "A dependable mount, bred for the purpose of long distance pilgrimages. This breed is also able to store its rider's possessions." - child_path = /mob/living/basic/raptor/baby_raptor/purple - -/mob/living/basic/raptor/purple/Initialize(mapload) - . = ..() - create_storage( - max_specific_storage = WEIGHT_CLASS_NORMAL, - max_total_storage = 10, - storage_type = /datum/storage/raptor_storage, - ) + raptor_color = /datum/raptor_color/purple /mob/living/basic/raptor/green - name = "green raptor" icon_state = "raptor_green" - icon_living = "raptor_green" - icon_dead = "raptor_green_dead" - maxHealth = 400 - health = 400 - raptor_color = RAPTOR_GREEN - dex_description = "A tough breed of raptor, made to withstand the harshest of punishment and to laugh in the face of pain, \ - this breed is able to withstand more punishment than its peers." - child_path = /mob/living/basic/raptor/baby_raptor/green - -/mob/living/basic/raptor/green/Initialize(mapload) - . = ..() - AddComponent(/datum/component/proficient_miner) + raptor_color = /datum/raptor_color/green /mob/living/basic/raptor/white - name = "white raptor" icon_state = "raptor_white" - icon_living = "raptor_white" - icon_dead = "raptor_white_dead" - raptor_color = RAPTOR_WHITE - dex_description = "A loving sort, it cares for it peers and rushes to their aid with reckless abandon. It is able to heal any raptors' ailments." - child_path = /mob/living/basic/raptor/baby_raptor/white - -/mob/living/basic/raptor/white/Initialize(mapload) - . = ..() - AddComponent(\ - /datum/component/healing_touch,\ - heal_brute = melee_damage_upper,\ - heal_burn = melee_damage_upper,\ - heal_time = 0,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/raptor)),\ - ) + raptor_color = /datum/raptor_color/white /mob/living/basic/raptor/black - name = "black raptor" icon_state = "raptor_black" - icon_living = "raptor_black" - icon_dead = "raptor_black_dead" - maxHealth = 400 - health = 400 - speed = 1 - ridable_component = /datum/component/riding/creature/raptor/fast - melee_damage_lower = 20 - melee_damage_upper = 25 - raptor_color = RAPTOR_BLACK - dex_description = "An ultra rare breed. Due to its sparse nature, not much is known about this sort. However it is said to possess many of its peers' abilities." - child_path = /mob/living/basic/raptor/baby_raptor/black + raptor_color = /datum/raptor_color/black /mob/living/basic/raptor/yellow - name = "yellow raptor" icon_state = "raptor_yellow" - icon_living = "raptor_yellow" - icon_dead = "raptor_yellow_dead" - ridable_component = /datum/component/riding/creature/raptor/fast - speed = 1 - raptor_color = RAPTOR_YELLOW - dex_description = "This breed possesses greasy fast speed, DEMON speed, making light work of long pilgrimages. It's said that a thunderclap could be heard when this breed reaches its maximum speed." - child_path = /mob/living/basic/raptor/baby_raptor/yellow + raptor_color = /datum/raptor_color/yellow /mob/living/basic/raptor/blue - name = "blue raptor" icon_state = "raptor_blue" - icon_living = "raptor_blue" - icon_dead = "raptor_blue_dead" - raptor_color = RAPTOR_BLUE - dex_description = "Known to produce nutritous and equally delicious milk, which is also said to possess healing properties." - child_path = /mob/living/basic/raptor/baby_raptor/blue + raptor_color = /datum/raptor_color/blue -/mob/living/basic/raptor/blue/Initialize(mapload) - . = ..() - AddComponent(\ - /datum/component/udder,\ - udder_type = /obj/item/udder/raptor,\ - ) +/mob/living/basic/raptor/young + growth_stage = RAPTOR_YOUNG + +/mob/living/basic/raptor/young/red + icon_state = "young_red" + raptor_color = /datum/raptor_color/red + +/mob/living/basic/raptor/young/purple + icon_state = "young_purple" + raptor_color = /datum/raptor_color/purple + +/mob/living/basic/raptor/young/green + icon_state = "young_green" + raptor_color = /datum/raptor_color/green + +/mob/living/basic/raptor/young/white + icon_state = "young_white" + raptor_color = /datum/raptor_color/white + +/mob/living/basic/raptor/young/black + icon_state = "young_black" + raptor_color = /datum/raptor_color/black + +/mob/living/basic/raptor/young/yellow + icon_state = "young_yellow" + raptor_color = /datum/raptor_color/yellow + +/mob/living/basic/raptor/young/blue + icon_state = "young_blue" + raptor_color = /datum/raptor_color/blue + +/mob/living/basic/raptor/baby + icon = 'icons/mob/simple/lavaland/raptor_baby.dmi' + growth_stage = RAPTOR_BABY + +/mob/living/basic/raptor/baby/red + icon_state = "baby_red" + raptor_color = /datum/raptor_color/red + +/mob/living/basic/raptor/baby/purple + icon_state = "baby_purple" + raptor_color = /datum/raptor_color/purple + +/mob/living/basic/raptor/baby/green + icon_state = "baby_green" + raptor_color = /datum/raptor_color/green + +/mob/living/basic/raptor/baby/white + icon_state = "baby_white" + raptor_color = /datum/raptor_color/white -/datum/storage/raptor_storage - animated = FALSE - insert_on_attack = FALSE +/mob/living/basic/raptor/baby/black + icon_state = "baby_black" + raptor_color = /datum/raptor_color/black -/datum/storage/raptor_storage/on_mousedropped_onto(datum/source, obj/item/dropping, mob/user) - ..() - return NONE +/mob/living/basic/raptor/baby/yellow + icon_state = "baby_yellow" + raptor_color = /datum/raptor_color/yellow -#undef HAPPINESS_BOOST_DAMPENER -#undef RAPTOR_INNATE_SOURCE +/mob/living/basic/raptor/baby/blue + icon_state = "baby_blue" + raptor_color = /datum/raptor_color/blue diff --git a/code/modules/mob/living/basic/lavaland/raptor/baby_raptor.dm b/code/modules/mob/living/basic/lavaland/raptor/baby_raptor.dm deleted file mode 100644 index 06d9fed84708..000000000000 --- a/code/modules/mob/living/basic/lavaland/raptor/baby_raptor.dm +++ /dev/null @@ -1,102 +0,0 @@ -/mob/living/basic/raptor/baby_raptor - name = "baby raptor" - desc = "Will this grow into something useful?" - icon = 'icons/mob/simple/lavaland/raptor_baby.dmi' - speed = 5 - maxHealth = 25 - health = 25 - melee_damage_lower = 3 - melee_damage_upper = 5 - density = FALSE - can_breed = FALSE - move_resist = MOVE_RESIST_DEFAULT - ai_controller = /datum/ai_controller/basic_controller/baby_raptor - ridable_component = null - change_offsets = FALSE - dex_description = "A cute baby raptor, Having it near a parent or a birds-nest could encourage it to grow faster, \ - grooming it and feeding it could also ensure that it grows up quicker!" - ///what do we grow into - var/growth_path - ///probability we are to be rolled - var/roll_rate = 100 - -/mob/living/basic/raptor/baby_raptor/Initialize(mapload) - . = ..() - if(isnull(growth_path)) - return - AddComponent(\ - /datum/component/growth_and_differentiation,\ - growth_time = null,\ - growth_path = growth_path,\ - growth_probability = 80,\ - lower_growth_value = 0.5,\ - upper_growth_value = 0.8,\ - signals_to_kill_on = list(COMSIG_MOB_CLIENT_LOGIN),\ - optional_checks = CALLBACK(src, PROC_REF(check_grow)),\ - optional_grow_behavior = CALLBACK(src, PROC_REF(ready_to_grow)),\ - ) - -/mob/living/basic/raptor/baby_raptor/add_happiness_component() - AddComponent(/datum/component/happiness, on_petted_change = 100) - -/mob/living/basic/raptor/baby_raptor/proc/check_grow() - return (stat != DEAD) - -/mob/living/basic/raptor/baby_raptor/proc/ready_to_grow() - var/mob/living/basic/raptor/grown_mob = new growth_path(get_turf(src)) - QDEL_NULL(grown_mob.inherited_stats) - grown_mob.inherited_stats = inherited_stats - inherited_stats = null - grown_mob.inherit_properties() - ADD_TRAIT(grown_mob, TRAIT_MOB_HATCHED, INNATE_TRAIT) //pass on the hatched trait - qdel(src) - -/mob/living/basic/raptor/baby_raptor/black - name = "baby black raptor" - icon_state = "baby_black" - icon_living = "baby_black" - icon_dead = "baby_black_dead" - growth_path = /mob/living/basic/raptor/black - roll_rate = 10 - -/mob/living/basic/raptor/baby_raptor/red - name = "baby red raptor" - icon_state = "baby_red" - icon_living = "baby_red" - icon_dead = "baby_red_dead" - growth_path = /mob/living/basic/raptor/red - -/mob/living/basic/raptor/baby_raptor/purple - name = "baby purple raptor" - icon_state = "baby_purple" - icon_living = "baby_purple" - icon_dead = "baby_purple_dead" - growth_path = /mob/living/basic/raptor/purple - -/mob/living/basic/raptor/baby_raptor/white - name = "baby white raptor" - icon_state = "baby_white" - icon_living = "baby_white" - icon_dead = "baby_white_dead" - growth_path = /mob/living/basic/raptor/white - -/mob/living/basic/raptor/baby_raptor/yellow - name = "baby yellow raptor" - icon_state = "baby_yellow" - icon_living = "baby_yellow" - icon_dead = "baby_yellow_dead" - growth_path = /mob/living/basic/raptor/yellow - -/mob/living/basic/raptor/baby_raptor/green - name = "baby green raptor" - icon_state = "baby_green" - icon_living = "baby_green" - icon_dead = "baby_green_dead" - growth_path = /mob/living/basic/raptor/green - -/mob/living/basic/raptor/baby_raptor/blue - name = "baby blue raptor" - icon_state = "baby_blue" - icon_living = "baby_blue" - icon_dead = "baby_blue_dead" - growth_path = /mob/living/basic/raptor/blue diff --git a/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_behavior.dm b/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_behavior.dm index a412fceeb127..777a76de1a68 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_behavior.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_behavior.dm @@ -8,7 +8,10 @@ return (source != target && target.health < target.maxHealth) /datum/ai_behavior/find_hunt_target/raptor_baby/valid_dinner(mob/living/source, mob/living/target, radius) - return can_see(source, target, radius) && target.stat != DEAD + if (!can_see(source, target, radius) || target.stat == DEAD || !istype(target, /mob/living/basic/raptor)) + return FALSE + var/mob/living/basic/raptor/raptor = target + return raptor.growth_stage == RAPTOR_BABY /datum/ai_behavior/hunt_target/interact_with_target/reset_target_combat_mode_off/care_for_young @@ -21,3 +24,15 @@ /datum/ai_behavior/find_hunt_target/raptor_trough/valid_dinner(mob/living/source, atom/movable/trough, radius) return !!(locate(/obj/item/stack/ore) in trough.contents) + +/datum/ai_behavior/find_injured_rider/perform(seconds_per_tick, datum/ai_controller/controller, hunting_target_key, types_to_hunt, hunt_range) + var/mob/living/living_mob = controller.pawn + if (!length(living_mob.buckled_mobs) || !isliving(living_mob.buckled_mobs[1])) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + + var/mob/living/rider = living_mob.buckled_mobs[1] + if (rider.stat == CONSCIOUS || rider.stat == DEAD || rider.health >= rider.maxHealth) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + + controller.set_blackboard_key(hunting_target_key, rider) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED diff --git a/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_controller.dm b/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_controller.dm index 27cd4d005f8f..2f1353bfc79d 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_controller.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_controller.dm @@ -9,8 +9,8 @@ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/raptor), - BB_BABIES_CHILD_TYPES = list(/mob/living/basic/raptor/baby_raptor), BB_MAX_CHILDREN = 5, + BB_RAPTOR_FLEE_THRESHOLD = 0.25, ) ai_movement = /datum/ai_movement/basic_avoidance @@ -19,6 +19,7 @@ /datum/ai_planning_subtree/escape_captivity, /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee/raptor, /datum/ai_planning_subtree/flee_target/from_flee_key, + /datum/ai_planning_subtree/find_and_hunt_target/heal_rider, /datum/ai_planning_subtree/find_and_hunt_target/heal_raptors, /datum/ai_planning_subtree/random_speech/blackboard, /datum/ai_planning_subtree/pet_planning, @@ -26,6 +27,42 @@ /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/find_and_hunt_target/raptor_trough, + /datum/ai_planning_subtree/find_food, + /datum/ai_planning_subtree/find_and_hunt_target/care_for_young, + /datum/ai_planning_subtree/make_babies, + /datum/ai_planning_subtree/express_happiness, + /datum/ai_planning_subtree/find_and_hunt_target/play_with_owner/raptor, + ) + +/// Angry raptors with no faction check on retaliation +/datum/ai_controller/basic_controller/raptor/aggressive + blackboard = list( + BB_INTERACTIONS_WITH_OWNER = list( + "pecks", + "nuzzles", + "wags their tail against", + "playfully leans against" + ), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/exact_match, + BB_HUNT_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/raptor), + BB_MAX_CHILDREN = 5, + BB_RAPTOR_FLEE_THRESHOLD = 0.1, + ) + + planning_subtrees = list( + /datum/ai_planning_subtree/escape_captivity, + /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee/raptor, + /datum/ai_planning_subtree/flee_target/from_flee_key, + /datum/ai_planning_subtree/find_and_hunt_target/heal_raptors, + /datum/ai_planning_subtree/random_speech/blackboard, + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/simple_find_target/hunt, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/find_and_hunt_target/raptor_trough, + /datum/ai_planning_subtree/find_food, /datum/ai_planning_subtree/find_and_hunt_target/care_for_young, /datum/ai_planning_subtree/make_babies, /datum/ai_planning_subtree/express_happiness, @@ -55,7 +92,6 @@ blackboard = list( BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_FIND_MOM_TYPES = list(/mob/living/basic/raptor), - BB_IGNORE_MOM_TYPES = list(/mob/living/basic/raptor/baby_raptor), ) ai_movement = /datum/ai_movement/basic_avoidance @@ -67,5 +103,5 @@ /datum/ai_planning_subtree/random_speech/blackboard, /datum/ai_planning_subtree/find_and_hunt_target/raptor_trough, /datum/ai_planning_subtree/express_happiness, - /datum/ai_planning_subtree/look_for_adult, + /datum/ai_planning_subtree/look_for_adult/raptor, ) diff --git a/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_subtrees.dm b/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_subtrees.dm index 06697d60b942..66f089240236 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_subtrees.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/raptor_ai_subtrees.dm @@ -11,19 +11,41 @@ return return ..() +/datum/ai_planning_subtree/find_and_hunt_target/heal_rider + target_key = BB_INJURED_RAPTOR + hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/heal_raptor + finding_behavior = /datum/ai_behavior/find_injured_rider + hunt_targets = list(/mob/living/carbon/human) + +/datum/ai_planning_subtree/find_and_hunt_target/heal_rider/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!controller.blackboard[BB_BASIC_MOB_HEALER]) + return + return ..() + /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee/raptor target_key = BB_BASIC_MOB_FLEE_TARGET /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee/raptor/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - if(!controller.blackboard[BB_RAPTOR_COWARD]) + if(controller.blackboard[BB_RAPTOR_COWARD]) + return ..() + + var/mob/living/basic/raptor/raptor = controller.pawn + if (raptor.health <= raptor.maxHealth * controller.blackboard[BB_RAPTOR_FLEE_THRESHOLD]) + return ..() + + if (!length(raptor.buckled_mobs)) return - return ..() + + var/mob/living/buckled_to = raptor.buckled_mobs[1] + // Flee if our owner is badly injured and out + if (buckled_to.stat != CONSCIOUS && buckled_to.stat != DEAD) + return ..() /datum/ai_planning_subtree/find_and_hunt_target/care_for_young target_key = BB_RAPTOR_BABY hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/reset_target_combat_mode_off/care_for_young finding_behavior = /datum/ai_behavior/find_hunt_target/raptor_baby - hunt_targets = list(/mob/living/basic/raptor/baby_raptor) + hunt_targets = list(/mob/living/basic/raptor) hunt_chance = 75 hunt_range = 9 diff --git a/code/modules/mob/living/basic/lavaland/raptor/raptor_color.dm b/code/modules/mob/living/basic/lavaland/raptor/raptor_color.dm new file mode 100644 index 000000000000..4270155c4294 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/raptor/raptor_color.dm @@ -0,0 +1,441 @@ +GLOBAL_LIST_INIT(raptor_colors, init_raptor_colors()) + +/proc/init_raptor_colors() + var/list/colors = list() + for (var/datum/raptor_color/color_type as anything in subtypesof(/datum/raptor_color)) + colors[color_type] = new color_type() + return colors + +/datum/raptor_color + /// Color name used for raptor name and icon + var/color = "error" + /// RaptorDex description for the raptor + var/description = "Report this!" + /// Raptor's health + var/health = 220 + /// Raptor's speed + var/speed = 0.5 + // Minimal and maximal damage for the raptor + var/melee_damage_lower = 10 + var/melee_damage_upper = 15 + /// Does this raptor redirect projectile hits onto its rider? + var/redirect_shots = TRUE + /// Rideable component type to assign to the raptor + var/rideable_component = /datum/component/riding/creature/raptor + /// Guaranteed cross-breeding colors, other parent color -> child color + var/guaranteed_crossbreeds = list() + /// Type of AI controller the raptor uses + var/datum/ai_controller/ai_controller = /datum/ai_controller/basic_controller/raptor + /// Chance that a newborn baby raptor will be of this color + var/spawn_chance = 33 + +/// Shared proc, only called once on raptor init for color-specific traits and properties +/datum/raptor_color/proc/setup_raptor(mob/living/basic/raptor/raptor) + if (raptor.ai_controller) + CRASH("setup_raptor called on a raptor ([raptor]) with a present AI controller! This is most likely a result of a second call to setup_raptor.") + raptor.ai_controller = new ai_controller(raptor) + +/datum/raptor_color/proc/setup_adult(mob/living/basic/raptor/raptor) + var/datum/raptor_inheritance/stats = raptor.inherited_stats + var/real_health = health + stats.health_modifier + // If we grow up while damaged, keep the damage percentage the same + raptor.health *= real_health / raptor.maxHealth + raptor.maxHealth = real_health + // -0.33 ~ 0.33 gets rounded to 0 rather than +-0.5 + var/speed_mod = clamp(round(abs(stats.speed_modifier - 0.08), 0.5) * sign(stats.speed_modifier), -0.5, 0.5) + raptor.set_varspeed(speed - speed_mod) + raptor.melee_damage_lower = melee_damage_lower + stats.attack_modifier + raptor.melee_damage_upper = melee_damage_upper + stats.attack_modifier + if (rideable_component) + raptor.AddElement(/datum/element/ridable, rideable_component) + setup_appearance(raptor) + +/datum/raptor_color/proc/setup_young(mob/living/basic/raptor/raptor) + var/datum/raptor_inheritance/stats = raptor.inherited_stats + var/real_health = health + stats.health_modifier + raptor.health *= real_health / 2 / raptor.maxHealth + raptor.maxHealth = real_health / 2 + var/speed_mod = clamp(round(abs(stats.speed_modifier - 0.08), 0.5) * sign(stats.speed_modifier), -0.5, 0.5) + raptor.set_varspeed(speed - speed_mod) + raptor.melee_damage_lower = floor((melee_damage_lower + stats.attack_modifier) / 2) + raptor.melee_damage_upper = floor((melee_damage_upper + stats.attack_modifier) / 2) + setup_appearance(raptor) + +/datum/raptor_color/proc/setup_baby(mob/living/basic/raptor/raptor) + var/datum/raptor_inheritance/stats = raptor.inherited_stats + var/real_health = health + stats.health_modifier + raptor.health *= real_health / 8 / raptor.maxHealth + raptor.maxHealth = real_health / 8 + var/speed_mod = clamp(round(abs(stats.speed_modifier - 0.08), 0.5) * sign(stats.speed_modifier), -0.5, 0.5) + raptor.set_varspeed(speed + 4.5 - speed_mod) + raptor.melee_damage_lower = floor((melee_damage_lower + stats.attack_modifier) / 3) + raptor.melee_damage_upper = floor((melee_damage_upper + stats.attack_modifier) / 3) + setup_appearance(raptor) + +/datum/raptor_color/proc/setup_appearance(mob/living/basic/raptor/raptor) + raptor.name = "[color] [raptor.name]" + raptor.icon_state = "[raptor.base_icon_state]_[color]" + raptor.held_state = "[raptor.base_icon_state]_[color]" + raptor.icon_living = "[raptor.base_icon_state]_[color]" + raptor.icon_dead = "[raptor.base_icon_state]_[color]_dead" + raptor.update_appearance() + +/datum/raptor_color/red + color = "red" + description = "A resilient breed of raptors, battle-tested and bred for the purpose of humbling its foes in combat, \ + This breed demonstrates higher combat capabilities than its peers and oozes ruthless aggression." + melee_damage_lower = 15 + melee_damage_upper = 20 + health = 300 + rideable_component = /datum/component/riding/creature/raptor/combat + redirect_shots = FALSE + guaranteed_crossbreeds = list( + /datum/raptor_color/green = /datum/raptor_color/yellow, + /datum/raptor_color/blue = /datum/raptor_color/purple, + ) + // Doesn't care for your excuses for friendly fire + ai_controller = /datum/ai_controller/basic_controller/raptor/aggressive + +/datum/raptor_color/purple + color = "purple" + description = "A small, nimble breed, these raptors have been bred as travel companions rather than mounts, capable of storing the owner's possessions and helping them escape from danger unscathed." + health = 140 // smol + rideable_component = /datum/component/riding/creature/raptor/small + guaranteed_crossbreeds = list( + /datum/raptor_color/green = /datum/raptor_color/white, + /datum/raptor_color/yellow = /datum/raptor_color/blue, + ) + +/datum/raptor_color/purple/setup_raptor(mob/living/basic/raptor/raptor) + . = ..() + RegisterSignal(raptor, COMSIG_MOVABLE_PREBUCKLE, PROC_REF(on_pre_buckle)) + raptor.inhand_holder_type = /obj/item/mob_holder/purple_raptor + +/datum/raptor_color/purple/proc/on_pre_buckle(mob/living/basic/raptor/source, mob/living/potential_rider, force = FALSE, ride_check_flags = NONE) + SIGNAL_HANDLER + + if (!ishuman(potential_rider)) + return COMPONENT_BLOCK_BUCKLE + + var/mob/living/carbon/human/rider = potential_rider + if (rider.mob_height > HUMAN_HEIGHT_SHORTEST) + to_chat(rider, span_warning("Your tall stature will crush [source] were you attempt to ride [source.p_them()]!")) + return COMPONENT_BLOCK_BUCKLE + +// Purple raptors never "fully" grow up, and remain usable as backpacks +/datum/raptor_color/purple/setup_adult(mob/living/basic/raptor/raptor) + raptor.base_pixel_w = initial(raptor.base_pixel_w) + raptor.can_be_held = TRUE + raptor.density = FALSE + raptor.move_resist = MOVE_RESIST_DEFAULT + raptor.change_offsets = FALSE + raptor.remove_offsets(RAPTOR_INNATE_SOURCE, FALSE) + raptor.held_w_class = WEIGHT_CLASS_BULKY + . = ..() + // Non-shorties cannot ride these, so we gotta keep em tameable through food + raptor.AddComponent(/datum/component/tameable, food_types = raptor.food_types, tame_chance = 25, bonus_tame_chance = 15, unique = TRUE) + if (raptor.atom_storage) + return + // A bit bigger (23 vs 21) than a backpack at max size, a bit less by default + var/storage_volume = floor(19 * (1 + raptor.inherited_stats.ability_modifier)) + raptor.create_storage( + max_total_storage = storage_volume, + max_slots = storage_volume, + storage_type = /datum/storage/raptor_storage, + ) + +/datum/raptor_color/purple/setup_young(mob/living/basic/raptor/raptor) + . = ..() + if (raptor.atom_storage) + return + var/storage_volume = floor(19 * (1 + raptor.inherited_stats.ability_modifier)) + raptor.create_storage( + max_total_storage = storage_volume, + max_slots = storage_volume, + storage_type = /datum/storage/raptor_storage, + ) + +/obj/item/mob_holder/purple_raptor + /// Wings action granted to whoever is wearing us on their back + var/datum/action/innate/raptor_wings/flight_action = null + + /// Are our wings open? + var/wings_open = FALSE + /// Wings underlay added to the owner, because human rendering code is a mess + var/mutable_appearance/wings_underlay = null + /// Our drift force + var/drift_force = 2 NEWTONS + /// Our stabilizing force + var/stabilizer_force = 4.5 NEWTONS + +/obj/item/mob_holder/purple_raptor/Initialize(mapload, mob/living/held_mob, worn_state, head_icon, lh_icon, rh_icon, worn_slot_flags) + . = ..() + + var/mob/living/basic/raptor/raptor = held_mob + if (raptor.growth_stage == RAPTOR_BABY) + return + + // Create a mirror storage for our raptor when picked up to handle interactions + var/datum/storage/raptor_storage = create_storage( + max_total_storage = held_mob.atom_storage.max_total_storage, + max_slots = held_mob.atom_storage.max_slots, + storage_type = /datum/storage/raptor_storage, + ) + raptor_storage.set_real_location(held_mob) + raptor_storage.insert_on_attack = TRUE + + if (raptor.growth_stage != RAPTOR_ADULT) + return + + flight_action = new(src) + + AddComponent( \ + /datum/component/jetpack, \ + TRUE, \ + drift_force, \ + stabilizer_force, \ + COMSIG_RAPTOR_WINGS_OPENED, \ + COMSIG_RAPTOR_WINGS_CLOSED, \ + null, \ + CALLBACK(src, PROC_REF(can_fly)), \ + CALLBACK(src, PROC_REF(can_fly)), \ + ) + +/obj/item/mob_holder/purple_raptor/Destroy() + if (ishuman(loc) && wings_open) + toggle_wings(loc) + QDEL_NULL(flight_action) + return ..() + +/obj/item/mob_holder/purple_raptor/equipped(mob/user, slot, initial) + . = ..() + if ((slot & ITEM_SLOT_BACK) && ishuman(user) && flight_action) + flight_action.Grant(held_mob) + flight_action.GiveAction(user) + +/obj/item/mob_holder/purple_raptor/dropped(mob/user, silent) + . = ..() + if (wings_open) + toggle_wings(user) + // Removed in Destroy() + if (flight_action) + flight_action.Remove(held_mob) + flight_action.HideFrom(user) + +/obj/item/mob_holder/purple_raptor/proc/on_weight_updated(mob/living/carbon/human/source) + SIGNAL_HANDLER + + if (source.mob_height <= HUMAN_HEIGHT_SHORTEST && !HAS_TRAIT(source, TRAIT_FAT)) + source.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/raptor/slow) + source.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/raptor) + else + source.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/raptor) + source.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/raptor/slow) + +/obj/item/mob_holder/purple_raptor/proc/can_fly() + var/mob/living/carbon/human/user = loc + if (!istype(user) || user.stat || user.body_position == LYING_DOWN || isnull(user.client)) + return FALSE + + var/turf/location = get_turf(user) + if (!istype(location)) + return FALSE + + var/datum/gas_mixture/environment = location.return_air() + if (environment?.return_pressure() >= HAZARD_LOW_PRESSURE + 10) + return TRUE + + to_chat(user, span_warning("The atmosphere is too thin for you to fly!")) + return FALSE + +/obj/item/mob_holder/purple_raptor/proc/toggle_wings(mob/living/carbon/human/user) + // In case something goes wrong + if (!istype(user)) + wings_open = FALSE + worn_icon_state = icon_state + SEND_SIGNAL(src, COMSIG_RAPTOR_WINGS_CLOSED, user) + STOP_PROCESSING(SSprocessing, src) + return + + if (!wings_open && !can_fly()) + return + + wings_open = !wings_open + worn_icon_state = "[icon_state][wings_open ? "_wings_out" : ""]" + user.update_worn_back() + + // Raptors won't have the best of times keeping up tall humans or fatties up in the air + var/struggling = HAS_TRAIT(user, TRAIT_FAT) || user.mob_height > HUMAN_HEIGHT_SHORTEST + if (wings_open) + wings_underlay = user.apply_height_offsets(mutable_appearance(worn_icon, "raptor_purple_wings", -BODY_BEHIND_LAYER, user), UPPER_BODY) + user.add_overlay(wings_underlay) + user.physiology.stun_mod *= 2 + user.add_traits(list(TRAIT_MOVE_FLOATING, TRAIT_IGNORING_GRAVITY, TRAIT_NOGRAV_ALWAYS_DRIFT), REF(src)) + if (struggling) + user.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/raptor/slow) + else + user.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/raptor) + user.AddElement(/datum/element/forced_gravity, 0) + passtable_on(user, REF(src)) + to_chat(user, span_notice("You begin gently hovering above ground as [held_mob] on your back starts furiously flapping [held_mob.p_their()] wings[struggling ? ", struggling to keep you up in the air" : ""]!")) + user.set_resting(FALSE, TRUE) + user.refresh_gravity() + START_PROCESSING(SSprocessing, src) + RegisterSignals(user, list(COMSIG_HUMAN_HEIGHT_UPDATED, SIGNAL_ADDTRAIT(TRAIT_FAT), SIGNAL_REMOVETRAIT(TRAIT_FAT)), PROC_REF(on_weight_updated)) + SEND_SIGNAL(src, COMSIG_RAPTOR_WINGS_OPENED, user) + return + + user.cut_overlay(wings_underlay) + QDEL_NULL(wings_underlay) + user.physiology.stun_mod *= 0.5 + user.remove_traits(list(TRAIT_MOVE_FLOATING, TRAIT_IGNORING_GRAVITY, TRAIT_NOGRAV_ALWAYS_DRIFT), REF(src)) + user.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/raptor/slow) + user.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/raptor) + user.RemoveElement(/datum/element/forced_gravity, 0) + passtable_off(user, REF(src)) + to_chat(user, span_notice("You settle gently back onto the ground[struggling ? ", [held_mob] on your back breathing out a sigh of releif" : ""]...")) + user.refresh_gravity() + STOP_PROCESSING(SSprocessing, src) + UnregisterSignal(user, list(COMSIG_HUMAN_HEIGHT_UPDATED, SIGNAL_ADDTRAIT(TRAIT_FAT), SIGNAL_REMOVETRAIT(TRAIT_FAT))) + SEND_SIGNAL(src, COMSIG_RAPTOR_WINGS_CLOSED, user) + +/obj/item/mob_holder/purple_raptor/process(seconds_per_tick) + if (!can_fly()) + toggle_wings(loc) + return PROCESS_KILL + +/datum/storage/raptor_storage + animated = FALSE + insert_on_attack = FALSE // should flip when worn on the back + +/datum/storage/raptor_storage/on_mousedropped_onto(datum/source, obj/item/dropping, mob/user) + return NONE + +/datum/action/innate/raptor_wings + name = "Toggle Flight" + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_IMMOBILE | AB_CHECK_INCAPACITATED + button_icon = 'icons/mob/actions/actions_animal.dmi' + button_icon_state = "raptor_wings" + background_icon_state = "bg_default" + overlay_icon_state = "bg_default_border" + +/datum/action/innate/raptor_wings/Activate() + var/obj/item/mob_holder/purple_raptor/holder = target + var/mob/living/carbon/human/user = holder.loc + if (!istype(user) || user.get_item_by_slot(ITEM_SLOT_BACK) != holder) + return + holder.toggle_wings(user) + background_icon_state = "bg_default[holder.wings_open ? "_on" : ""]" + build_all_button_icons() + +/datum/raptor_color/green + color = "green" + description = "A tough breed of raptor, made to withstand the harshest of punishment and to laugh in the face of pain, \ + this breed is able to withstand more punishment than its peers." + health = 400 + // redirect_shots = FALSE // Need to figure out if I want this or not here + guaranteed_crossbreeds = list( + /datum/raptor_color/purple = /datum/raptor_color/white, + /datum/raptor_color/red = /datum/raptor_color/yellow, + ) + +/datum/raptor_color/green/setup_adult(mob/living/basic/raptor/raptor) + . = ..() + var/ability_scale = 1 - INVERSE_LERP(RAPTOR_INHERIT_MIN_MODIFIER, RAPTOR_INHERIT_MAX_MODIFIER, raptor.inherited_stats.ability_modifier) + var/mining_mod = round(ability_scale * 0.1, 0.025) + if (ability_scale >= 0.75) + mining_mod = 0 + raptor.AddComponent(/datum/component/proficient_miner, mining_mod, TRUE) + +/datum/raptor_color/white + color = "white" + description = "A loving sort, it cares for it peers and rushes to their aid with reckless abandon. It is able to heal any raptors' ailments, and rescue its owner in case of an emergency." + rideable_component = /datum/component/riding/creature/raptor/healer + guaranteed_crossbreeds = list( + /datum/raptor_color/blue = /datum/raptor_color/green, + /datum/raptor_color/yellow = /datum/raptor_color/red, + ) + +/datum/raptor_color/white/setup_young(mob/living/basic/raptor/raptor) + . = ..() + raptor.AddComponent( \ + /datum/component/healing_touch, \ + heal_brute = melee_damage_upper * 0.75 * (1 + raptor.inherited_stats.ability_modifier), \ + heal_burn = melee_damage_upper * 0.75 * (1 + raptor.inherited_stats.ability_modifier), \ + heal_time = 0, \ + valid_targets_typecache = typecacheof(list(/mob/living/basic/raptor)), \ + ) + +/datum/raptor_color/white/setup_adult(mob/living/basic/raptor/raptor) + . = ..() + qdel(raptor.GetComponent(/datum/component/healing_touch)) + raptor.AddComponent( \ + /datum/component/healing_touch, \ + heal_brute = melee_damage_upper * (1 + raptor.inherited_stats.ability_modifier), \ + heal_burn = melee_damage_upper * (1 + raptor.inherited_stats.ability_modifier), \ + heal_time = 0, \ + valid_targets_typecache = typecacheof(list(/mob/living/basic/raptor, /mob/living/carbon/human)), \ + extra_checks = CALLBACK(src, PROC_REF(heal_checks)), \ + healing_multiplier = CALLBACK(src, PROC_REF(heal_multiplier)), \ + ) + +/datum/raptor_color/white/proc/heal_checks(mob/living/healer, mob/living/target) + if (istype(target, /mob/living/basic/raptor)) + return TRUE + // Only heal raptors, or critted rider + if (target.stat == CONSCIOUS || target.stat == DEAD) + return FALSE + return target.buckled == healer + +/datum/raptor_color/white/proc/heal_multiplier(mob/living/healer, mob/living/target) + if (istype(target, /mob/living/basic/raptor)) + return 1 + // The healing is slow so this is fine + return 0.67 + +/datum/raptor_color/yellow + color = "yellow" + description = "This breed possesses greasy fast speed, DEMON speed, making light work of long pilgrimages. \ + It's said that a thunderclap could be heard when this breed reaches its maximum speed." + speed = 0 + guaranteed_crossbreeds = list( + /datum/raptor_color/purple = /datum/raptor_color/blue, + /datum/raptor_color/white = /datum/raptor_color/red, + ) + +/datum/raptor_color/blue + color = "blue" + description = "Covered in tough, lava-resistant feathers with thick insulated fur underneath, this breed is capable of marching through lava and fire alike." + guaranteed_crossbreeds = list( + /datum/raptor_color/red = /datum/raptor_color/purple, + /datum/raptor_color/white = /datum/raptor_color/green, + ) + +/datum/raptor_color/blue/setup_raptor(mob/living/basic/raptor/raptor) + . = ..() + raptor.add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_NOFIRE_SPREAD), INNATE_TRAIT) + +/datum/raptor_color/black + color = "black" + description = "An ultra rare breed. Due to its sparse nature, not much is known about this sort. However it is said to possess many of its peers' abilities." + health = 400 + speed = 0 + melee_damage_lower = 20 + melee_damage_upper = 25 + redirect_shots = FALSE + rideable_component = /datum/component/riding/creature/raptor/combat + ai_controller = /datum/ai_controller/basic_controller/raptor/aggressive + spawn_chance = 1 // 1 in 150 chance without modifiers + +/datum/raptor_color/black/setup_raptor(mob/living/basic/raptor/raptor) + . = ..() + raptor.add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_NOFIRE_SPREAD), INNATE_TRAIT) + +/datum/raptor_color/black/setup_adult(mob/living/basic/raptor/raptor) + . = ..() + // Slightly worse than greens at this + var/ability_scale = 1 - INVERSE_LERP(RAPTOR_INHERIT_MIN_MODIFIER, RAPTOR_INHERIT_MAX_MODIFIER, raptor.inherited_stats.ability_modifier) + var/mining_mod = round(ability_scale * 0.2, 0.025) + if (ability_scale >= 0.8) + mining_mod = 0 + raptor.AddComponent(/datum/component/proficient_miner, mining_mod, TRUE) diff --git a/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm b/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm index cd1439b3c5ff..90595dd942af 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm @@ -1,62 +1,64 @@ /obj/item/raptor_dex - name = "raptor Dex" + name = "RaptorDex" desc = "A device used to analyze lavaland raptors!" icon = 'icons/obj/devices/scanner.dmi' icon_state = "raptor_dex" item_flags = NOBLUDGEON - ///current raptor we are analyzing - var/datum/weakref/raptor + /// Raptor scan data we have stored + var/list/scan_data = list("raptor_scan" = FALSE) /obj/item/raptor_dex/ui_interact(mob/user, datum/tgui/ui) - if(isnull(raptor?.resolve())) - balloon_alert(user, "no specimen data!") - return TRUE - ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "RaptorDex") ui.open() -/obj/item/raptor_dex/ui_static_data(mob/user) - var/list/data = list() - var/mob/living/basic/raptor/my_raptor = raptor.resolve() +/obj/item/raptor_dex/ui_data(mob/user) + return scan_data + +/obj/item/raptor_dex/interact_with_atom(atom/attacked_atom, mob/living/user) + if(!istype(attacked_atom, /mob/living/basic/raptor)) + return NONE + + var/mob/living/basic/raptor/my_raptor = attacked_atom + var/datum/movespeed_modifier/intent_mod = my_raptor.get_move_intent_slowdown() - data["raptor_image"] = icon2base64(getFlatIcon(image(icon = my_raptor.icon, icon_state = my_raptor.icon_state))) - data["raptor_attack"] = my_raptor.melee_damage_lower - data["raptor_health"] = my_raptor.maxHealth - data["raptor_speed"] = my_raptor.speed - data["raptor_color"] = my_raptor.name - data["raptor_gender"] = my_raptor.gender - data["raptor_description"] = my_raptor.dex_description + scan_data = list() + scan_data["raptor_scan"] = TRUE + scan_data["raptor_image"] = icon2base64(icon(icon = my_raptor.icon, icon_state = my_raptor.icon_state, dir = SOUTH, frame = 1)) + scan_data["raptor_attack"] = my_raptor.melee_damage_lower + scan_data["raptor_health"] = my_raptor.health + scan_data["raptor_max_health"] = my_raptor.maxHealth + scan_data["raptor_speed"] = my_raptor.speed + intent_mod?.multiplicative_slowdown + scan_data["raptor_color"] = my_raptor.name + scan_data["raptor_gender"] = my_raptor.gender + scan_data["raptor_description"] = my_raptor.raptor_color.description var/happiness_percentage = my_raptor.ai_controller?.blackboard[BB_BASIC_HAPPINESS] - var/obj/effect/overlay/happiness_overlay/display = new + var/obj/effect/overlay/happiness_overlay/display = new() display.set_hearts(happiness_percentage) display.pixel_y = ICON_SIZE_Y * 0.5 - data["raptor_happiness"] = icon2base64(getFlatIcon(display)) + scan_data["raptor_happiness"] = icon2base64(getFlatIcon(display, no_anim = TRUE)) qdel(display) var/datum/raptor_inheritance/inherit = my_raptor.inherited_stats - if(isnull(inherit)) - return data + if(!isnull(inherit)) + scan_data["inherited_attack"] = inherit.attack_modifier + scan_data["inherited_attack_max"] = RAPTOR_INHERIT_MAX_ATTACK + scan_data["inherited_health"] = inherit.health_modifier + scan_data["inherited_health_max"] = RAPTOR_INHERIT_MAX_HEALTH + scan_data["inherited_speed"] = inherit.speed_modifier + scan_data["inherited_speed_max"] = RAPTOR_INHERIT_MAX_SPEED + scan_data["inherited_ability"] = inherit.ability_modifier + scan_data["inherited_ability_max"] = RAPTOR_INHERIT_MAX_MODIFIER + scan_data["inherited_growth"] = inherit.growth_modifier + scan_data["inherited_growth_max"] = RAPTOR_INHERIT_MAX_MODIFIER - data["inherited_attack"] = inherit.attack_modifier - data["inherited_attack_max"] = RAPTOR_INHERIT_MAX_ATTACK - data["inherited_health"] = inherit.health_modifier - data["inherited_health_max"] = RAPTOR_INHERIT_MAX_HEALTH - - data["inherited_traits"] = list() - for(var/index in inherit.inherit_traits) - data["inherited_traits"] += GLOB.raptor_inherit_traits[index] - return data - - -/obj/item/raptor_dex/interact_with_atom(atom/attacked_atom, mob/living/user) - if(!istype(attacked_atom, /mob/living/basic/raptor)) - return NONE + scan_data["inherited_traits"] = list() + for(var/index in inherit.personality_traits) + scan_data["inherited_traits"] += GLOB.raptor_inherit_traits[index] - raptor = WEAKREF(attacked_atom) playsound(src, 'sound/mobs/non-humanoids/orbie/orbie_send_out.ogg', 20) - balloon_alert(user, "scanned") + balloon_alert(my_raptor, "scanned") ui_interact(user) return ITEM_INTERACT_SUCCESS diff --git a/code/modules/mob/living/basic/lavaland/raptor/raptor_egg.dm b/code/modules/mob/living/basic/lavaland/raptor/raptor_egg.dm index 1b980857562e..2f038f02e64f 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/raptor_egg.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/raptor_egg.dm @@ -1,58 +1,52 @@ /obj/item/food/egg/raptor_egg + name = "raptor egg" + desc = "An uneven egg with a rough, thick shell." icon = 'icons/mob/simple/lavaland/raptor_baby.dmi' icon_state = "raptor_egg" - ///inheritance datum to pass on to the child - var/datum/raptor_inheritance/inherited_stats + resistance_flags = LAVA_PROOF|FIRE_PROOF + /// Color typepath of the child we spawn + var/datum/raptor_color/child_color = /datum/raptor_color + /// Inheritance data to pass onto the child + var/datum/raptor_inheritance/inherited_stats = null + /// Current growth progress + var/growth_progress = 0 + /// Minimum growth progress per second + var/min_growth_rate = 0.5 + /// Maximum growth progress per second + var/max_growth_rate = 1 /obj/item/food/egg/raptor_egg/Initialize(mapload) . = ..() - if(SSmapping.is_planetary()) - icon = 'icons/mob/simple/lavaland/raptor_icebox.dmi' + START_PROCESSING(SSobj, src) -/obj/item/food/egg/raptor_egg/proc/determine_growth_path(mob/living/basic/raptor/dad, mob/living/basic/raptor/mom) - if(dad.type == mom.type) - add_growth_component(dad.child_path) - return - var/dad_color = dad.raptor_color - var/mom_color = mom.raptor_color - var/list/my_colors = list(dad_color, mom_color) - sortTim(my_colors, GLOBAL_PROC_REF(cmp_text_asc)) - for(var/path in GLOB.raptor_growth_paths) //guaranteed spawns - var/list/required_colors = GLOB.raptor_growth_paths[path] - if(!compare_list(my_colors, required_colors)) - continue - add_growth_component(path) - return - var/list/valid_subtypes = list() - var/static/list/all_subtypes = subtypesof(/mob/living/basic/raptor/baby_raptor) - for(var/path in all_subtypes) - var/mob/living/basic/raptor/baby_raptor/raptor_path = path - if(!prob(initial(raptor_path.roll_rate))) - continue - valid_subtypes += raptor_path - add_growth_component(pick(valid_subtypes)) +/obj/item/food/egg/raptor_egg/Destroy() + STOP_PROCESSING(SSobj, src) + QDEL_NULL(inherited_stats) + return ..() + +/obj/item/food/egg/raptor_egg/examine(mob/user) + . = ..() + if (growth_progress >= RAPTOR_EGG_GROWTH_PROGRESS) + . += span_boldnotice("Its noticeably shaking, ready to hatch!") -/obj/item/food/egg/raptor_egg/proc/add_growth_component(growth_path) - if(length(GLOB.raptor_population) >= MAX_RAPTOR_POP) +/obj/item/food/egg/raptor_egg/process(seconds_per_tick) + if (!isturf(loc) || length(GLOB.raptor_population) >= MAX_RAPTOR_POP) return - AddComponent(\ - /datum/component/fertile_egg,\ - embryo_type = growth_path,\ - minimum_growth_rate = 0.5,\ - maximum_growth_rate = 1,\ - total_growth_required = 100,\ - current_growth = 0,\ - location_allowlist = typecacheof(list(/turf)),\ - post_hatch = CALLBACK(src, PROC_REF(post_hatch)),\ - ) -/obj/item/food/egg/raptor_egg/proc/post_hatch(mob/living/basic/raptor/baby) - if(!istype(baby)) + var/growth_value = rand(min_growth_rate, max_growth_rate) * seconds_per_tick * (1 + inherited_stats?.growth_modifier) + // Slower growth off hot lavaland + if (!SSmapping.level_trait(z, ZTRAIT_ASHSTORM)) + growth_value *= 0.75 + // Faster growth in hot hot lava + if (islava(loc)) + growth_value *= 1.5 + + growth_progress += growth_value + // Don't hatch on lava though, or the chick will die instantly + if (growth_progress < RAPTOR_EGG_GROWTH_PROGRESS || islava(loc)) return - QDEL_NULL(baby.inherited_stats) - baby.inherited_stats = inherited_stats - inherited_stats = null -/obj/item/food/egg/raptor_egg/Destroy() - QDEL_NULL(inherited_stats) - return ..() + visible_message(span_notice("[src] hatches with a quiet cracking sound.")) + new /mob/living/basic/raptor(loc, child_color, inherited_stats) + inherited_stats = null + qdel(src) diff --git a/code/modules/mob/living/basic/lavaland/raptor/raptor_food_trough.dm b/code/modules/mob/living/basic/lavaland/raptor/raptor_food_trough.dm index 03289f2d0fe3..efa600de5aeb 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/raptor_food_trough.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/raptor_food_trough.dm @@ -5,3 +5,4 @@ icon_state = "raptor_trough" x_offsets = list(-5, 5) y_offsets = list(-4, 5) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 5) diff --git a/code/modules/mob/living/basic/lavaland/raptor/raptor_inheritance.dm b/code/modules/mob/living/basic/lavaland/raptor/raptor_inheritance.dm index 4f72e37a4cf4..8c3e0ec8b3e1 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/raptor_inheritance.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/raptor_inheritance.dm @@ -1,31 +1,97 @@ -#define RANDOM_INHERIT_AMOUNT 2 /datum/raptor_inheritance - ///list of traits we inherit - var/list/inherit_traits = list() - ///attack modifier - var/attack_modifier - ///health_modifier - var/health_modifier - -/datum/raptor_inheritance/New(datum/raptor_inheritance/father, datum/raptor_inheritance/mother) + /// Inherited parent personality traits + var/list/personality_traits = list() + /// Flat damage modifier + var/attack_modifier = 0 + /// Flat health modifier + var/health_modifier = 0 + /// Speed modifier, not randomized by default + var/speed_modifier = 0 + /// Primary ability stat modifier, not randomized by default + /// Multiplier equates to 1 + this + var/ability_modifier = 0 + /// Growth rate modifier, not randomized by default + /// Multiplier equates to 1 + this + var/growth_modifier = 0 + /// Foods eaten that can affect our child's stats -> stats they modify + var/list/foods_eaten = list() + /// List of all colors in our family tree + var/list/parent_colors = list() + +// Owner being set will randomize the stats as it means we're spawned not via an egg +// otherwise wait for set_parents call to inherit genetics +/datum/raptor_inheritance/New(mob/living/basic/raptor/owner) . = ..() - randomize_stats() + if (!owner) + return -/datum/raptor_inheritance/proc/randomize_stats() - attack_modifier = rand(0, RAPTOR_INHERIT_MAX_ATTACK) - health_modifier = rand(0, RAPTOR_INHERIT_MAX_HEALTH) + attack_modifier = rand(RAPTOR_INHERIT_MIN_ATTACK * 0.5, RAPTOR_INHERIT_MAX_ATTACK * 0.5) + health_modifier = rand(RAPTOR_INHERIT_MIN_HEALTH * 0.5, RAPTOR_INHERIT_MAX_HEALTH * 0.5) var/list/traits_to_pick = GLOB.raptor_inherit_traits.Copy() - for(var/i in 1 to RANDOM_INHERIT_AMOUNT) - inherit_traits += pick_n_take(traits_to_pick) + for(var/i in 1 to rand(1, RAPTOR_TRAIT_INHERIT_AMOUNT)) + personality_traits += pick_n_take(traits_to_pick) -/datum/raptor_inheritance/proc/set_parents(datum/raptor_inheritance/father, datum/raptor_inheritance/mother) - if(isnull(father) || isnull(mother)) - return - if(length(father.inherit_traits)) - inherit_traits += pick(father.inherit_traits) - if(length(mother.inherit_traits)) - inherit_traits += pick(mother.inherit_traits) - attack_modifier = rand(min(father.attack_modifier, mother.attack_modifier), max(father.attack_modifier, mother.attack_modifier)) - health_modifier = rand(min(father.health_modifier, mother.health_modifier), max(father.health_modifier, mother.health_modifier)) - -#undef RANDOM_INHERIT_AMOUNT +/datum/raptor_inheritance/proc/set_parents(mob/living/basic/raptor/mother, mob/living/basic/raptor/father) + var/datum/raptor_inheritance/mom_stats = mother.inherited_stats + var/datum/raptor_inheritance/dad_stats = father.inherited_stats + + parent_colors = mom_stats.parent_colors | dad_stats.parent_colors | mother.raptor_color.type | father.raptor_color.type + + var/list/traits_to_pick = list() + // + so shared traits have double the weight + for (var/raptor_trait in mom_stats.personality_traits + dad_stats.personality_traits) + if (!traits_to_pick[raptor_trait]) + traits_to_pick[raptor_trait] = 0 + traits_to_pick[raptor_trait] += 1 + + var/attack_mod = 0 + var/health_mod = 0 + var/speed_mod = 0 + var/ability_mod = 0 + var/growth_mod = 0 + var/amount_eaten = 0 + + for (var/food_type in foods_eaten) + var/list/stat_mods = foods_eaten[food_type] + amount_eaten += stat_mods["amount"] + + for (var/food_type in foods_eaten) + var/list/stat_mods = foods_eaten[food_type] + // First multiply stats themselves, then multiply to get a proportion of this food from amount_eaten + var/amount = stat_mods["amount"] ** 2 + // Eating other foods reduces the effects of a specific one + attack_mod += stat_mods["attack"] / amount_eaten * amount + health_mod += stat_mods["health"] / amount_eaten * amount + speed_mod += stat_mods["speed"] / amount_eaten * amount + ability_mod += stat_mods["ability"] / amount_eaten * amount + growth_mod += stat_mods["growth"] / amount_eaten * amount + var/list/trait_list = stat_mods["traits"] + for (var/raptor_trait in trait_list) + if (!traits_to_pick[raptor_trait]) + traits_to_pick[raptor_trait] = 0 + traits_to_pick[raptor_trait] += trait_list[raptor_trait] * stat_mods["amount"] + + // If we don't clamp these, RNG and drift can get wildly out of control and result in polar values + // and this way we at most get twice the minimum/maximum value, so at least half the rand spread is within the clamp values + attack_mod = clamp(attack_mod, RAPTOR_INHERIT_MIN_ATTACK, RAPTOR_INHERIT_MAX_ATTACK) + health_mod = clamp(health_mod, RAPTOR_INHERIT_MIN_HEALTH, RAPTOR_INHERIT_MAX_HEALTH) + speed_mod = clamp(speed_mod, RAPTOR_INHERIT_MIN_SPEED, RAPTOR_INHERIT_MAX_SPEED) + ability_mod = clamp(ability_mod, RAPTOR_INHERIT_MIN_MODIFIER, RAPTOR_INHERIT_MAX_MODIFIER) + growth_mod = clamp(growth_mod, RAPTOR_INHERIT_MIN_MODIFIER, RAPTOR_INHERIT_MAX_MODIFIER) + + attack_modifier = rand((min(mom_stats.attack_modifier, dad_stats.attack_modifier) + min(0, attack_mod)) + RAPTOR_GENETIC_DRIFT * RAPTOR_INHERIT_MIN_ATTACK, (max(mom_stats.attack_modifier, dad_stats.attack_modifier) + max(0, attack_mod)) + RAPTOR_GENETIC_DRIFT * RAPTOR_INHERIT_MAX_ATTACK) + health_modifier = rand((min(mom_stats.health_modifier, dad_stats.health_modifier) + min(0, health_mod)) + RAPTOR_GENETIC_DRIFT * RAPTOR_INHERIT_MIN_HEALTH, (max(mom_stats.health_modifier, dad_stats.health_modifier) + max(0, health_mod)) + RAPTOR_GENETIC_DRIFT * RAPTOR_INHERIT_MAX_HEALTH) + speed_modifier = rand((min(mom_stats.speed_modifier, dad_stats.speed_modifier) + min(0, speed_mod)) + RAPTOR_GENETIC_DRIFT * RAPTOR_INHERIT_MIN_SPEED, (max(mom_stats.speed_modifier, dad_stats.speed_modifier) + max(0, speed_mod)) + RAPTOR_GENETIC_DRIFT * RAPTOR_INHERIT_MAX_SPEED) + ability_modifier = rand((min(mom_stats.ability_modifier, dad_stats.ability_modifier) + min(0, ability_mod)) + RAPTOR_GENETIC_DRIFT * RAPTOR_INHERIT_MIN_MODIFIER, (max(mom_stats.ability_modifier, dad_stats.ability_modifier) + max(0, ability_mod)) + RAPTOR_GENETIC_DRIFT * RAPTOR_INHERIT_MAX_MODIFIER) + growth_modifier = rand((min(mom_stats.growth_modifier, dad_stats.growth_modifier) + min(0, growth_mod)) + RAPTOR_GENETIC_DRIFT * RAPTOR_INHERIT_MIN_MODIFIER, (max(mom_stats.growth_modifier, dad_stats.growth_modifier) + max(0, growth_mod)) + RAPTOR_GENETIC_DRIFT * RAPTOR_INHERIT_MAX_MODIFIER) + + for(var/i in 1 to min(length(traits_to_pick), RAPTOR_TRAIT_INHERIT_AMOUNT)) + var/chosen_trait = pick_weight(traits_to_pick) + traits_to_pick -= chosen_trait + personality_traits += chosen_trait + + attack_modifier = clamp(attack_modifier, RAPTOR_INHERIT_MIN_ATTACK, RAPTOR_INHERIT_MAX_ATTACK) + health_modifier = clamp(health_modifier, RAPTOR_INHERIT_MIN_HEALTH, RAPTOR_INHERIT_MAX_HEALTH) + speed_modifier = clamp(speed_modifier, RAPTOR_INHERIT_MIN_SPEED, RAPTOR_INHERIT_MAX_SPEED) + ability_modifier = clamp(ability_modifier, RAPTOR_INHERIT_MIN_MODIFIER, RAPTOR_INHERIT_MAX_MODIFIER) + growth_modifier = clamp(growth_modifier, RAPTOR_INHERIT_MIN_MODIFIER, RAPTOR_INHERIT_MAX_MODIFIER) diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm index d084850c0579..963d0b88f356 100644 --- a/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm @@ -146,7 +146,8 @@ /atom/movable/screen/alert/status_effect/overwatch name = "Overwatched" desc = "Freeze! You are being watched!" - icon_state = "aimed" + use_user_hud_icon = TRUE + overlay_state = "aimed" /// Blocks further applications of the ability for a little while /datum/status_effect/overwatch_immune diff --git a/code/modules/mob/living/basic/minebots/minebot.dm b/code/modules/mob/living/basic/minebots/minebot.dm index 33271e7dec82..41952c1bf2f7 100644 --- a/code/modules/mob/living/basic/minebots/minebot.dm +++ b/code/modules/mob/living/basic/minebots/minebot.dm @@ -119,7 +119,7 @@ user.balloon_alert(user, "at full integrity!") return TRUE if(welder.use_tool(src, user, 0, volume=40)) - adjustBruteLoss(-15) + adjust_brute_loss(-15) user.balloon_alert(user, "successfully repaired!") return TRUE @@ -165,7 +165,7 @@ /mob/living/basic/mining_drone/ui_static_data(mob/user) var/list/data = list() - data["bot_icon"] = icon2base64(getFlatIcon(src)) + data["bot_icon"] = icon2base64(getFlatIcon(src, no_anim = TRUE)) data["possible_colors"] = list() for(var/color in possible_colors) data["possible_colors"] += list(list( diff --git a/code/modules/mob/living/basic/minebots/minebot_ai.dm b/code/modules/mob/living/basic/minebots/minebot_ai.dm index 7e92d79c5a02..69d7509f6c06 100644 --- a/code/modules/mob/living/basic/minebots/minebot_ai.dm +++ b/code/modules/mob/living/basic/minebots/minebot_ai.dm @@ -47,7 +47,7 @@ /datum/ai_behavior/find_and_set/clear_bombing_zone -/datum/ai_behavior/find_and_set/clear_bombing_zone/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/clear_bombing_zone/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) for(var/obj/effect/temp_visual/minebot_target/target in oview(search_range, controller.pawn)) if(isclosedturf(get_turf(target))) continue @@ -62,7 +62,7 @@ /datum/ai_behavior/find_and_set/miner_to_befriend -/datum/ai_behavior/find_and_set/miner_to_befriend/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/miner_to_befriend/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) for(var/mob/living/carbon/human/target in oview(search_range, controller.pawn)) if(HAS_TRAIT(target, TRAIT_ROCK_STONER)) return target @@ -112,7 +112,7 @@ 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) +/datum/ai_behavior/find_and_set/unconscious_human/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) for(var/mob/living/carbon/human/target in oview(search_range, controller.pawn)) if(target.stat >= UNCONSCIOUS && target.mind) return target diff --git a/code/modules/mob/living/basic/minebots/minebot_upgrades.dm b/code/modules/mob/living/basic/minebots/minebot_upgrades.dm index 881342bcf662..6134b6e127ea 100644 --- a/code/modules/mob/living/basic/minebots/minebot_upgrades.dm +++ b/code/modules/mob/living/basic/minebots/minebot_upgrades.dm @@ -36,7 +36,7 @@ //AI -/obj/item/slimepotion/slime/sentience/mining +/obj/item/slimepotion/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" @@ -51,7 +51,7 @@ ///cooldown boost to add var/base_cooldown_add = 10 -/obj/item/slimepotion/slime/sentience/mining/after_success(mob/living/user, mob/living/basic_mob) +/obj/item/slimepotion/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 diff --git a/code/modules/mob/living/basic/pets/cat/cat.dm b/code/modules/mob/living/basic/pets/cat/cat.dm index 0fb2536c0abe..aea56dbf8788 100644 --- a/code/modules/mob/living/basic/pets/cat/cat.dm +++ b/code/modules/mob/living/basic/pets/cat/cat.dm @@ -62,10 +62,10 @@ ///callback for after a kitten is born var/datum/callback/post_birth_callback - // DARKPACK ADD START + // DARKPACK EDIT ADD START - NPC bloodpool = 2 maxbloodpool = 2 - // DARKPACK ADD END + // DARKPACK EDIT ADD END /datum/emote/cat @@ -153,7 +153,7 @@ return update_appearance(UPDATE_ICON_STATE) -// DARKPACK EDIT START +// DARKPACK EDIT START - NPC /mob/living/basic/pet/cat/update_icon_state() . = ..() if(stat != DEAD) diff --git a/code/modules/mob/living/basic/pets/cat/cat_ai.dm b/code/modules/mob/living/basic/pets/cat/cat_ai.dm index 049b894b5d67..1150d17f96da 100644 --- a/code/modules/mob/living/basic/pets/cat/cat_ai.dm +++ b/code/modules/mob/living/basic/pets/cat/cat_ai.dm @@ -44,7 +44,7 @@ if(SPT_PROB(reside_chance, seconds_per_tick)) controller.queue_behavior(/datum/ai_behavior/find_and_set/valid_home, BB_CAT_HOME, /obj/structure/cat_house) -/datum/ai_behavior/find_and_set/valid_home/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/valid_home/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) for(var/obj/structure/cat_house/home in oview(search_range, controller.pawn)) if(home.resident_cat) continue @@ -95,7 +95,7 @@ controller.queue_behavior(/datum/ai_behavior/find_and_set/cat_tresspasser, BB_TRESSPASSER_TARGET, /mob/living/basic/pet/cat) -/datum/ai_behavior/find_and_set/cat_tresspasser/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/cat_tresspasser/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/list/ignore_types = controller.blackboard[BB_BABIES_CHILD_TYPES] for(var/mob/living/basic/pet/cat/potential_enemy in oview(search_range, controller.pawn)) if(potential_enemy.gender != MALE) @@ -244,7 +244,7 @@ /datum/ai_behavior/find_and_set/valid_kitten -/datum/ai_behavior/find_and_set/valid_kitten/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/valid_kitten/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/mob/living/kitten = locate(locate_path) in oview(search_range, controller.pawn) //kitten already has food near it, go feed another hungry kitten diff --git a/code/modules/mob/living/basic/pets/cat/kitten_ai.dm b/code/modules/mob/living/basic/pets/cat/kitten_ai.dm index cdb7ac542e1a..952c7aabd68c 100644 --- a/code/modules/mob/living/basic/pets/cat/kitten_ai.dm +++ b/code/modules/mob/living/basic/pets/cat/kitten_ai.dm @@ -56,7 +56,7 @@ controller.queue_behavior(/datum/ai_behavior/find_and_set/human_beg, BB_HUMAN_BEG_TARGET, /mob/living/carbon/human) -/datum/ai_behavior/find_and_set/human_beg/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/human_beg/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/list/locate_items = controller.blackboard[BB_HUNTABLE_PREY] for(var/mob/living/carbon/human/human_target in oview(search_range, controller.pawn)) if(human_target.stat != CONSCIOUS || isnull(human_target.mind)) diff --git a/code/modules/mob/living/basic/pets/dog/_dog.dm b/code/modules/mob/living/basic/pets/dog/_dog.dm index c87289208f19..5f0f4819feef 100644 --- a/code/modules/mob/living/basic/pets/dog/_dog.dm +++ b/code/modules/mob/living/basic/pets/dog/_dog.dm @@ -42,18 +42,18 @@ /datum/pet_command/move, /datum/pet_command/good_boy/dog, /datum/pet_command/follow/dog, -// /datum/pet_command/perform_trick_sequence // DARKPACK EDIT REMOVE - Might be usable later +// /datum/pet_command/perform_trick_sequence // DARKPACK EDIT REMOVE - Might be usable later - NPC /datum/pet_command/attack/dog, /datum/pet_command/fetch, /datum/pet_command/play_dead, - /datum/pet_command/protect_owner, // DARKPACK EDIT ADD + /datum/pet_command/protect_owner, // DARKPACK EDIT ADD - NPC ) ///icon state of the collar we can wear var/collar_icon_state ///icon state of our cult icon var/cult_icon_state -// DARKPACK EDIT ADD START +// DARKPACK EDIT ADD START - NPC maxHealth = 70 health = 70 obj_damage = 15 @@ -111,14 +111,14 @@ var/static/list/food_types = list( /obj/item/food/meat/slab/human/mutant/skeleton, /obj/item/stack/sheet/bone, -// DARKPACK EDIT ADD START +// DARKPACK EDIT ADD START - NPC /obj/item/food/meat/slab, /obj/item/food/meat/rawbacon, /obj/item/food/meat/bacon, /obj/item/food/meat/rawcutlet, // DARKPACK EDIT ADD END ) - AddElement(/datum/element/ai_flee_while_injured) // DARKPACK EDIT ADD + AddElement(/datum/element/ai_flee_while_injured) // DARKPACK EDIT ADD - NPC AddComponent(/datum/component/tameable, food_types = food_types, tame_chance = 30, bonus_tame_chance = 15, unique = FALSE) AddComponent(/datum/component/obeys_commands, pet_commands) var/dog_area = get_area(src) diff --git a/code/modules/mob/living/basic/pets/dog/corgi.dm b/code/modules/mob/living/basic/pets/dog/corgi.dm index 3cc1861aa0b9..e58039d61983 100644 --- a/code/modules/mob/living/basic/pets/dog/corgi.dm +++ b/code/modules/mob/living/basic/pets/dog/corgi.dm @@ -292,7 +292,7 @@ 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)) + if(ispath(item.dog_fashion, /datum/dog_fashion/head) && item.IsReachableBy(src)) possible_headwear += item if(!length(possible_headwear)) return @@ -517,7 +517,7 @@ visible_message(span_warning("[src] arises again, revived by the dark magicks!"), \ span_cult_large("RISE")) revive(ADMIN_HEAL_ALL) //also means that a dead Nars-Ian can consume a pet and revive - adjustBruteLoss(-maxHealth) + adjust_brute_loss(-maxHealth) //LISA! SQUEEEEEEEEE~ /mob/living/basic/pet/dog/corgi/lisa diff --git a/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm b/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm index b4a0dc3ad2a2..f2444539111f 100644 --- a/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm +++ b/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm @@ -125,7 +125,7 @@ return if(health < maxHealth) - adjustBruteLoss(-4 * seconds_per_tick) //Fast life regen + adjust_brute_loss(-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) diff --git a/code/modules/mob/living/basic/pets/gondolas/gondola.dm b/code/modules/mob/living/basic/pets/gondolas/gondola.dm index 535afa32cc1c..8e235dc96883 100644 --- a/code/modules/mob/living/basic/pets/gondolas/gondola.dm +++ b/code/modules/mob/living/basic/pets/gondolas/gondola.dm @@ -27,7 +27,7 @@ //Gondolas aren't affected by cold. unsuitable_atmos_damage = 0 - basic_mob_flags = DEL_ON_DEATH + basic_mob_flags = SENDS_DEATH_MOODLETS|DEL_ON_DEATH ///List of loot drops on death, since it deletes itself on death (like trooper). var/list/loot = list( diff --git a/code/modules/mob/living/basic/pets/orbie/orbie_ai.dm b/code/modules/mob/living/basic/pets/orbie/orbie_ai.dm index cdb66975bdcf..69e8febf4b21 100644 --- a/code/modules/mob/living/basic/pets/orbie/orbie_ai.dm +++ b/code/modules/mob/living/basic/pets/orbie/orbie_ai.dm @@ -42,7 +42,7 @@ /datum/ai_behavior/find_and_set/find_playmate -/datum/ai_behavior/find_and_set/find_playmate/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/find_playmate/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) for(var/mob/living/basic/orbie/playmate in oview(search_range, controller.pawn)) if(playmate == controller.pawn || playmate.stat == DEAD || isnull(playmate.ai_controller)) continue diff --git a/code/modules/mob/living/basic/pets/parrot/_parrot.dm b/code/modules/mob/living/basic/pets/parrot/_parrot.dm index 31b525e5c8f7..5f667857f40d 100644 --- a/code/modules/mob/living/basic/pets/parrot/_parrot.dm +++ b/code/modules/mob/living/basic/pets/parrot/_parrot.dm @@ -350,7 +350,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( return TRUE // we still ate it if(health < maxHealth) - adjustBruteLoss(-10) + adjust_brute_loss(-10) speech_probability_rate *= 1.27 speech_shuffle_rate += 10 update_speech_blackboards() diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_hoarding.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_hoarding.dm index ad9a56b3acfd..bdfad8433336 100644 --- a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_hoarding.dm +++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_hoarding.dm @@ -27,7 +27,7 @@ /datum/ai_behavior/find_and_set/hoard_location -/datum/ai_behavior/find_and_set/hoard_location/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/hoard_location/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) for(var/turf/open/candidate in oview(search_range, controller.pawn)) if(is_space_or_openspace(candidate)) continue @@ -41,7 +41,7 @@ action_cooldown = 5 SECONDS behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION -/datum/ai_behavior/find_and_set/hoard_item/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/hoard_item/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) if(!controller.blackboard_key_exists(BB_HOARD_LOCATION)) return null var/turf/nest_turf = controller.blackboard[BB_HOARD_LOCATION] diff --git a/code/modules/mob/living/basic/pets/penguin/penguin.dm b/code/modules/mob/living/basic/pets/penguin/penguin.dm index f963a150af04..9e0be0681619 100644 --- a/code/modules/mob/living/basic/pets/penguin/penguin.dm +++ b/code/modules/mob/living/basic/pets/penguin/penguin.dm @@ -1,4 +1,5 @@ /mob/living/basic/pet/penguin + abstract_type = /mob/living/basic/pet/penguin icon = 'icons/mob/simple/penguins.dmi' gender = FEMALE diff --git a/code/modules/mob/living/basic/pets/penguin/penguin_ai.dm b/code/modules/mob/living/basic/pets/penguin/penguin_ai.dm index 50386bff3741..9209c7fa0049 100644 --- a/code/modules/mob/living/basic/pets/penguin/penguin_ai.dm +++ b/code/modules/mob/living/basic/pets/penguin/penguin_ai.dm @@ -51,7 +51,7 @@ /datum/ai_planning_subtree/fish/drilled_ice find_fishable_behavior = /datum/ai_behavior/find_and_set/in_list/drilled_ice -/datum/ai_behavior/find_and_set/in_list/drilled_ice/search_tactic(datum/ai_controller/controller, locate_paths, search_range) +/datum/ai_behavior/find_and_set/in_list/drilled_ice/search_tactic(datum/ai_controller/controller, locate_paths, search_range = SEARCH_TACTIC_DEFAULT_RANGE) for(var/atom/possible_ice as anything in RANGE_TURFS(search_range, controller.pawn)) if(!istype(possible_ice, /turf/open/misc/ice)) continue diff --git a/code/modules/mob/living/basic/pets/pet.dm b/code/modules/mob/living/basic/pets/pet.dm index 64896a3f2ab4..ae32718b6583 100644 --- a/code/modules/mob/living/basic/pets/pet.dm +++ b/code/modules/mob/living/basic/pets/pet.dm @@ -1,14 +1,9 @@ /mob/living/basic/pet + abstract_type = /mob/living/basic/pet icon = 'icons/mob/simple/pets.dmi' mob_size = MOB_SIZE_SMALL mob_biotypes = MOB_ORGANIC|MOB_BEAST - blood_volume = BLOOD_VOLUME_NORMAL + default_blood_volume = BLOOD_VOLUME_NORMAL + basic_mob_flags = SENDS_DEATH_MOODLETS /// if the mob is protected from being renamed by collars. var/unique_pet = FALSE - - -/mob/living/basic/pet/death(gibbed) - . = ..() - add_memory_in_range(src, 7, /datum/memory/pet_died, deuteragonist = src) //Protagonist is the person memorizing it - - diff --git a/code/modules/mob/living/basic/pets/pet_cult/pet_cult_ai.dm b/code/modules/mob/living/basic/pets/pet_cult/pet_cult_ai.dm index 25565a181aa0..28964296264a 100644 --- a/code/modules/mob/living/basic/pets/pet_cult/pet_cult_ai.dm +++ b/code/modules/mob/living/basic/pets/pet_cult/pet_cult_ai.dm @@ -48,7 +48,7 @@ action_cooldown = 5 SECONDS behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION -/datum/ai_behavior/find_and_set/friendly_cultist/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/friendly_cultist/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/mob/living/living_pawn = controller.pawn for(var/mob/living/carbon/possible_cultist in oview(search_range, controller.pawn)) if(IS_CULTIST(possible_cultist) && !(living_pawn.faction.Find(REF(possible_cultist)))) @@ -72,7 +72,7 @@ /datum/ai_behavior/find_and_set/occupied_rune -/datum/ai_behavior/find_and_set/occupied_rune/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/occupied_rune/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/datum/team/cult/cult_team = controller.blackboard[BB_CULT_TEAM] if(isnull(cult_team)) return null @@ -140,7 +140,7 @@ /datum/ai_behavior/find_and_set/dead_cultist -/datum/ai_behavior/find_and_set/dead_cultist/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/dead_cultist/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/datum/team/cult/cult_team = controller.blackboard[BB_CULT_TEAM] if(isnull(cult_team)) return null diff --git a/code/modules/mob/living/basic/pets/pet_designer.dm b/code/modules/mob/living/basic/pets/pet_designer.dm index 988fee660381..dd2096ec36bf 100644 --- a/code/modules/mob/living/basic/pets/pet_designer.dm +++ b/code/modules/mob/living/basic/pets/pet_designer.dm @@ -81,7 +81,7 @@ GLOBAL_LIST_INIT(pet_options, list( for(var/color in possible_colors) demo_carrier.set_greyscale(possible_colors[color]) - list_to_return[color] = icon2base64(getFlatIcon(demo_carrier)) + list_to_return[color] = icon2base64(getFlatIcon(demo_carrier, no_anim = TRUE)) qdel(demo_carrier) return list_to_return diff --git a/code/modules/mob/living/basic/ruin_defender/flesh.dm b/code/modules/mob/living/basic/ruin_defender/flesh.dm index 610db57f1c07..d88c896f34ec 100644 --- a/code/modules/mob/living/basic/ruin_defender/flesh.dm +++ b/code/modules/mob/living/basic/ruin_defender/flesh.dm @@ -85,7 +85,7 @@ for(var/atom/movable/movable in orange(victim, 1)) if(movable == victim) continue - if(!victim.CanReach(movable) || movable.invisibility > victim.see_invisible) + if(!movable.IsReachableBy(victim) || movable.invisibility > victim.see_invisible) continue candidates += movable if(!length(candidates)) @@ -153,7 +153,7 @@ var/obj/item/bodypart/new_bodypart = new part_type() forceMove(new_bodypart) - new_bodypart.replace_limb(target, TRUE) + new_bodypart.replace_limb(target) register_to_limb(new_bodypart) /mob/living/basic/living_limb_flesh/proc/owner_shocked(datum/source, shock_damage, shock_source, siemens_coeff, flags) @@ -181,7 +181,7 @@ /mob/living/basic/living_limb_flesh/proc/on_limb_lost(atom/movable/source, mob/living/carbon/old_owner, special, dismembered) SIGNAL_HANDLER unregister_from_limb(old_owner) - addtimer(CALLBACK(src, PROC_REF(wake_up), source), 2 SECONDS) + addtimer(CALLBACK(src, PROC_REF(wake_up), source), 2 SECONDS, TIMER_STOPPABLE | TIMER_DELETE_ME) /mob/living/basic/living_limb_flesh/proc/register_to_limb(obj/item/bodypart/part) current_bodypart = part @@ -199,6 +199,8 @@ current_bodypart = null /mob/living/basic/living_limb_flesh/proc/wake_up(atom/limb) + if(QDELETED(src)) + return visible_message(span_warning("[src] begins flailing around!")) Shake(6, 6, 0.5 SECONDS) ai_controller.set_ai_status(AI_STATUS_ON) diff --git a/code/modules/mob/living/basic/ruin_defender/living_floor.dm b/code/modules/mob/living/basic/ruin_defender/living_floor.dm index df248b7d24fa..3a34a5b12fa6 100644 --- a/code/modules/mob/living/basic/ruin_defender/living_floor.dm +++ b/code/modules/mob/living/basic/ruin_defender/living_floor.dm @@ -25,7 +25,7 @@ icon_state = "floor" icon_living = "floor" mob_size = MOB_SIZE_HUGE - mob_biotypes = MOB_SPECIAL + mob_biotypes = MOB_SPECIAL|MOB_MINERAL status_flags = NONE death_message = "" unsuitable_atmos_damage = 0 diff --git a/code/modules/mob/living/basic/ruin_defender/mimic/mimic.dm b/code/modules/mob/living/basic/ruin_defender/mimic/mimic.dm index 67016611fd18..0f833dfc5778 100644 --- a/code/modules/mob/living/basic/ruin_defender/mimic/mimic.dm +++ b/code/modules/mob/living/basic/ruin_defender/mimic/mimic.dm @@ -8,6 +8,7 @@ GLOBAL_LIST_INIT(animatable_blacklist, typecacheof(list( ))) /mob/living/basic/mimic + abstract_type = /mob/living/basic/mimic response_help_continuous = "touches" response_help_simple = "touch" response_disarm_continuous = "pushes" @@ -16,7 +17,7 @@ GLOBAL_LIST_INIT(animatable_blacklist, typecacheof(list( maxHealth = 250 health = 250 gender = NEUTER - mob_biotypes = NONE + mob_biotypes = MOB_MINERAL pass_flags = PASSFLAPS melee_damage_lower = 8 melee_damage_upper = 12 @@ -287,7 +288,7 @@ GLOBAL_LIST_INIT(animatable_blacklist, typecacheof(list( if(!.) //dead or deleted return if(idledamage && !ckey && !ai_controller?.blackboard[BB_BASIC_MOB_CURRENT_TARGET]) //Objects eventually revert to normal if no one is around to terrorize - adjustBruteLoss(0.5 * seconds_per_tick) + adjust_brute_loss(0.5 * seconds_per_tick) for(var/mob/living/victim in contents) //a fix for animated statues from the flesh to stone spell death() return diff --git a/code/modules/mob/living/basic/ruin_defender/skeleton.dm b/code/modules/mob/living/basic/ruin_defender/skeleton.dm index 67be88870ccd..33851af009b4 100644 --- a/code/modules/mob/living/basic/ruin_defender/skeleton.dm +++ b/code/modules/mob/living/basic/ruin_defender/skeleton.dm @@ -3,7 +3,7 @@ desc = "A real bonefied skeleton, doesn't seem like it wants to socialize." gender = NEUTER icon = 'icons/mob/simple/simple_human.dmi' - mob_biotypes = MOB_UNDEAD|MOB_HUMANOID + mob_biotypes = MOB_UNDEAD|MOB_HUMANOID|MOB_SKELETAL speak_emote = list("rattles") maxHealth = 40 health = 40 diff --git a/code/modules/mob/living/basic/ruin_defender/stickman.dm b/code/modules/mob/living/basic/ruin_defender/stickman.dm index 24be8389a5b0..d51c0b4efe12 100644 --- a/code/modules/mob/living/basic/ruin_defender/stickman.dm +++ b/code/modules/mob/living/basic/ruin_defender/stickman.dm @@ -17,8 +17,7 @@ attack_sound = 'sound/items/weapons/punch1.ogg' combat_mode = TRUE faction = list(FACTION_STICKMAN) - unsuitable_atmos_damage = 7.5 - unsuitable_cold_damage = 7.5 + unsuitable_atmos_damage = 0 unsuitable_heat_damage = 7.5 damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1) diff --git a/code/modules/mob/living/basic/slime/defense.dm b/code/modules/mob/living/basic/slime/defense.dm index 30e4cb41b4e9..598ba3a318ac 100644 --- a/code/modules/mob/living/basic/slime/defense.dm +++ b/code/modules/mob/living/basic/slime/defense.dm @@ -103,7 +103,7 @@ ///Handles the adverse effects of water on slimes /mob/living/basic/slime/proc/apply_water() - adjustBruteLoss(rand(15,20)) + adjust_brute_loss(rand(15,20)) discipline_slime() ///Stops the slime from feeding, and might remove rabidity and targets diff --git a/code/modules/mob/living/basic/slime/life.dm b/code/modules/mob/living/basic/slime/life.dm index fc7b55927434..86d5eb02c052 100644 --- a/code/modules/mob/living/basic/slime/life.dm +++ b/code/modules/mob/living/basic/slime/life.dm @@ -59,7 +59,7 @@ if(nutrition == 0) //adjust nutrition ensures it can't go below 0 if(SPT_PROB(50, seconds_per_tick)) - adjustBruteLoss(rand(0,5)) + adjust_brute_loss(rand(0,5)) return if (SLIME_GROW_NUTRITION <= nutrition) diff --git a/code/modules/mob/living/basic/slime/slime.dm b/code/modules/mob/living/basic/slime/slime.dm index 36a023318c43..dd6c2bd112bc 100644 --- a/code/modules/mob/living/basic/slime/slime.dm +++ b/code/modules/mob/living/basic/slime/slime.dm @@ -345,7 +345,7 @@ target_slime.adjust_nutrition(-stolen_nutrition) our_slime.adjust_nutrition(stolen_nutrition) if(target_slime.health > 0) - our_slime.adjustBruteLoss(is_adult_slime ? -20 : -10) + our_slime.adjust_brute_loss(is_adult_slime ? -20 : -10) ///Spawns a crossed slimecore item diff --git a/code/modules/mob/living/basic/snails/snail.dm b/code/modules/mob/living/basic/snails/snail.dm index 0cbdaf9f1132..5c8ea912ee46 100644 --- a/code/modules/mob/living/basic/snails/snail.dm +++ b/code/modules/mob/living/basic/snails/snail.dm @@ -81,6 +81,7 @@ /mob/living/basic/snail/mob_pickup(mob/living/user) var/obj/item/mob_holder/snail/holder = new(get_turf(src), src, held_state, head_icon, held_lh, held_rh, worn_slot_flags) + SEND_SIGNAL(src, COMSIG_LIVING_SCOOPED_UP, user, holder) var/display_message = "[user] [HAS_TRAIT(src, TRAIT_MOVE_FLOATING) ? "scoops up [src]" : "peels [src] off the ground"]!" user.visible_message(span_warning(display_message)) user.put_in_hands(holder) diff --git a/code/modules/mob/living/basic/space_fauna/changeling/flesh_spider.dm b/code/modules/mob/living/basic/space_fauna/changeling/flesh_spider.dm index 34205124db6c..5e5d98afb103 100644 --- a/code/modules/mob/living/basic/space_fauna/changeling/flesh_spider.dm +++ b/code/modules/mob/living/basic/space_fauna/changeling/flesh_spider.dm @@ -16,7 +16,7 @@ response_help_simple = "pet" response_disarm_continuous = "gently pushes aside" response_disarm_simple = "gently push aside" - damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, STAMINA = 1, OXY = 1) + damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 4, STAMINA = 1, OXY = 1) basic_mob_flags = FLAMMABLE_MOB status_flags = NONE speed = -0.1 diff --git a/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm b/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm index a5cfd15f80bb..1f9bd60db9d8 100644 --- a/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm +++ b/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm @@ -10,6 +10,9 @@ icon_living = "headslug" icon_dead = "headslug_dead" gender = NEUTER + pass_flags = PASSTABLE | PASSMOB + mob_size = MOB_SIZE_SMALL + density = FALSE health = 50 maxHealth = 50 max_stamina = 120 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 index a96af0fd952f..1cfcf160b2c9 100644 --- a/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm +++ b/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm @@ -158,9 +158,9 @@ investigate_log("has died from a devastating explosion.", INVESTIGATE_DEATHS) death() if(EXPLODE_HEAVY) - adjustBruteLoss(60) + adjust_brute_loss(60) if(EXPLODE_LIGHT) - adjustBruteLoss(30) + adjust_brute_loss(30) return TRUE diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm index cc05cdbd6d42..a45900ae02e1 100644 --- a/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm +++ b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm @@ -72,7 +72,7 @@ return if(istype(attack_target, /obj/item/food/grown/carrot)) - adjustBruteLoss(-5) + adjust_brute_loss(-5) to_chat(src, span_warning("You eat [attack_target]! It restores some health!")) qdel(attack_target) return TRUE diff --git a/code/modules/mob/living/basic/space_fauna/ghost.dm b/code/modules/mob/living/basic/space_fauna/ghost.dm index 1376dc140c36..cfdf6840ff25 100644 --- a/code/modules/mob/living/basic/space_fauna/ghost.dm +++ b/code/modules/mob/living/basic/space_fauna/ghost.dm @@ -65,7 +65,7 @@ /mob/living/basic/ghost/proc/give_identity() if(random_identity) ghost_hairstyle = random_hairstyle() //This only gives us the hairstyle name, not the icon_state (which we need). - ghost_hair_color = random_hair_color() // DARKPACK EDIT CHANGE + ghost_hair_color = random_hair_color() if(prob(50)) //Only a chance at also getting facial hair ghost_facial_hairstyle = random_facial_hairstyle() 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 index 7db7a8913fa3..54c3c13d139f 100644 --- a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm +++ b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm @@ -1,9 +1,9 @@ /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) +/datum/ai_behavior/find_and_set/hive_partner/search_tactic(datum/ai_controller/controller, locate_path, search_range = 10) var/mob/living/living_pawn = controller.pawn var/list/hive_partners = list() - for(var/mob/living/target in oview(10, living_pawn)) + for(var/mob/living/target in oview(search_range, living_pawn)) if(!istype(target, locate_path)) continue if(target.stat == DEAD) diff --git a/code/modules/mob/living/basic/space_fauna/lightgeist.dm b/code/modules/mob/living/basic/space_fauna/lightgeist.dm index 8fe00b404841..1ac90898bef0 100644 --- a/code/modules/mob/living/basic/space_fauna/lightgeist.dm +++ b/code/modules/mob/living/basic/space_fauna/lightgeist.dm @@ -48,13 +48,11 @@ /mob/living/basic/lightgeist/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_MEDICAL_HUD, INNATE_TRAIT) remove_verb(src, /mob/living/verb/pulled) remove_verb(src, /mob/verb/me_verb) - var/datum/atom_hud/medical_sensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - medical_sensor.show_to(src) - AddElement(/datum/element/simple_flying) AddComponent(\ /datum/component/healing_touch,\ @@ -103,7 +101,7 @@ if (!(heal_biotypes & target.mob_biotypes)) return FALSE if (!iscarbon(target)) - return target.getBruteLoss() > 0 || target.getFireLoss() > 0 + return target.get_brute_loss() > 0 || target.get_fire_loss() > 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) diff --git a/code/modules/mob/living/basic/space_fauna/mushroom.dm b/code/modules/mob/living/basic/space_fauna/mushroom.dm index 16c46674e2f6..e6195ba9d9cf 100644 --- a/code/modules/mob/living/basic/space_fauna/mushroom.dm +++ b/code/modules/mob/living/basic/space_fauna/mushroom.dm @@ -110,7 +110,7 @@ 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) + adjust_brute_loss(-consumed.maxHealth) qdel(consumed) /mob/living/basic/mushroom/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) @@ -144,11 +144,11 @@ if(stat == DEAD) revive(HEAL_ALL) else - adjustBruteLoss(-5) + adjust_brute_loss(-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 + adjust_brute_loss(-maxHealth) //They'll always heal, even if they don't gain a level if(powerlevel > 9) return if(level_gain == 0) 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 index d94b2c71292d..24980cc01109 100644 --- 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 @@ -22,6 +22,7 @@ attack_sound = 'sound/effects/hallucinations/growl1.ogg' ai_controller = /datum/ai_controller/basic_controller/paper_wizard damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1) + unsuitable_atmos_damage = 0 ///spell to summon minions var/datum/action/cooldown/spell/conjure/wizard_summon_minions/summon ///spell to summon clones @@ -87,7 +88,7 @@ /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) +/datum/ai_behavior/find_and_set/empty_paper/search_tactic(datum/ai_controller/controller, locate_path, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/list/empty_papers = list() for(var/obj/item/paper/target_paper in oview(search_range, controller.pawn)) @@ -123,7 +124,7 @@ SIGNAL_HANDLER if(!(attack_flags & (ATTACKER_STAMINA_ATTACK|ATTACKER_SHOVING))) - attacker.adjustBruteLoss(20) + attacker.adjust_brute_loss(20) to_chat(attacker, span_warning("The clone casts a spell to damage you before he dies!")) 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 index 5ef69e412420..42e6e831dd5b 100644 --- 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 @@ -197,7 +197,7 @@ 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) + if(HAS_TRAIT_NOT_FROM(living_target, TRAIT_FAKEDEATH, SPECIES_TRAIT) || living_target.stat == DEAD) balloon_alert(src, "already dead!") return FALSE diff --git a/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm b/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm index 0739a9c1b4ed..71eebf9d42cf 100644 --- a/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm +++ b/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm @@ -299,7 +299,7 @@ /mob/living/basic/revenant/narsie_act() return //most humans will now be either bones or harvesters, but we're still un-alive. -/mob/living/basic/revenant/bullet_act() +/mob/living/basic/revenant/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) if(!HAS_TRAIT(src, TRAIT_REVENANT_REVEALED) || dormant) return BULLET_ACT_FORCE_PIERCE return ..() diff --git a/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm b/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm index 5751a354b4b9..c484a8b977c1 100644 --- a/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm +++ b/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm @@ -277,7 +277,7 @@ if(mob.reagents) mob.reagents.add_reagent(/datum/reagent/toxin/plasma, 5) else - mob.adjustToxLoss(5) + mob.adjust_tox_loss(5) for(var/obj/structure/spacevine/vine in victim) //Fucking with botanists, the ability. vine.add_atom_colour("#823abb", TEMPORARY_COLOUR_PRIORITY) new /obj/effect/temp_visual/revenant(vine.loc) diff --git a/code/modules/mob/living/basic/space_fauna/revenant/revenant_objectives.dm b/code/modules/mob/living/basic/space_fauna/revenant/revenant_objectives.dm index 7dd391c17e47..79e8ac90cb08 100644 --- a/code/modules/mob/living/basic/space_fauna/revenant/revenant_objectives.dm +++ b/code/modules/mob/living/basic/space_fauna/revenant/revenant_objectives.dm @@ -25,11 +25,14 @@ "Ensure that any holy weapons are rendered unusable.", "Heed and obey the requests of the dead, provided that carrying them out wouldn't be too inconvenient or self-destructive.", "Impersonate or be worshipped as a God.", - "Make the captain as miserable as possible.", - "Make the clown as miserable as possible.", "Make the crew as miserable as possible.", "Prevent the use of energy weapons where possible.", ) + if(SSjob.assigned_captain) + explanation_texts += "Make the captain as miserable as possible." + var/datum/job/clown/clown_job = SSjob.get_job(JOB_CLOWN) + if(clown_job.current_positions) + explanation_texts += "Make the clown as miserable as possible." explanation_text = pick(explanation_texts) return ..() diff --git a/code/modules/mob/living/basic/space_fauna/robot_customer.dm b/code/modules/mob/living/basic/space_fauna/robot_customer.dm index c880be1fdb99..7ffe1fadd6a5 100644 --- a/code/modules/mob/living/basic/space_fauna/robot_customer.dm +++ b/code/modules/mob/living/basic/space_fauna/robot_customer.dm @@ -118,3 +118,8 @@ order = attending_venue.order_food_line(wanted_item) . += span_notice("Their order was: \"[order].\"") + +/mob/living/basic/robot_customer/death() + new /obj/effect/gibspawner/robot(drop_location()) + + return ..() diff --git a/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm b/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm index 05a2668cfe89..e8ebb18a47ac 100644 --- a/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm +++ b/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm @@ -140,7 +140,7 @@ /// Select scale colour with the colour picker /mob/living/basic/space_dragon/proc/select_colour() - chosen_colour = input(src, "What colour would you like to be?" ,"Colour Selection", COLOR_WHITE) as color|null + chosen_colour = tgui_color_picker(src, "What colour would you like to be?" ,"Colour Selection", COLOR_WHITE) if(!chosen_colour) // Redo proc until we get a color to_chat(src, span_warning("Not a valid colour, please try again.")) select_colour() @@ -303,7 +303,7 @@ if (severity != EXPLODE_DEVASTATE) return var/damage_coefficient = rand(devastation_damage_min_percentage, devastation_damage_max_percentage) - adjustBruteLoss(initial(maxHealth)*damage_coefficient) + adjust_brute_loss(initial(maxHealth)*damage_coefficient) return COMPONENT_CANCEL_EX_ACT // we handled it /// Subtype used by the midround/event 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 index 68629154ab6a..6d0f3771a82b 100644 --- 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 @@ -169,8 +169,6 @@ web_speed = 0.25 web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer menu_description = "Avarage speed spider able to heal other spiders and itself together with a fast web laying capability, has low damage and health." - ///The health HUD applied to the mob. - var/health_hud = DATA_HUD_MEDICAL_ADVANCED ///Used in the caves away mission. /mob/living/basic/spider/giant/nurse/away_caves @@ -179,8 +177,7 @@ /mob/living/basic/spider/giant/nurse/Initialize(mapload) . = ..() - var/datum/atom_hud/datahud = GLOB.huds[health_hud] - datahud.show_to(src) + ADD_TRAIT(src, TRAIT_MEDICAL_HUD, INNATE_TRAIT) AddComponent(/datum/component/healing_touch,\ heal_brute = 10,\ diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider.dm b/code/modules/mob/living/basic/space_fauna/spider/spider.dm index ace8d97bbfbb..086c0f0a3535 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider.dm @@ -14,7 +14,7 @@ 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, STAMINA = 1, OXY = 1) + damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 3, STAMINA = 1, OXY = 1) basic_mob_flags = FLAMMABLE_MOB status_flags = NONE unsuitable_cold_damage = 4 @@ -155,8 +155,8 @@ grown.faction = faction.Copy() grown.directive = directive grown.set_name() - grown.setBruteLoss(getBruteLoss()) - grown.setFireLoss(getFireLoss()) + grown.set_brute_loss(get_brute_loss()) + grown.set_fire_loss(get_fire_loss()) qdel(src) /** 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 index e245f3adcc93..a3f0fc1c64f5 100644 --- 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 @@ -92,13 +92,10 @@ 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) + ADD_TRAIT(src, TRAIT_MEDICAL_HUD, INNATE_TRAIT) AddComponent(/datum/component/healing_touch,\ heal_brute = 15,\ 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 c1dca8b23e71..b4bb04673635 100644 --- a/code/modules/mob/living/basic/space_fauna/statue/statue.dm +++ b/code/modules/mob/living/basic/space_fauna/statue/statue.dm @@ -9,7 +9,7 @@ icon_dead = "human_male" gender = NEUTER combat_mode = TRUE - mob_biotypes = MOB_HUMANOID + mob_biotypes = MOB_HUMANOID|MOB_MINERAL gold_core_spawnable = NO_SPAWN response_help_continuous = "touches" diff --git a/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm b/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm index c794484990cc..02f11dc94265 100644 --- a/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm +++ b/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm @@ -10,7 +10,7 @@ gender = NEUTER status_flags = CANPUSH - mob_biotypes = MOB_BUG|MOB_ROBOTIC + mob_biotypes = MOB_BUG|MOB_ROBOTIC|MOB_MINERAL speak_emote = list("vibrates") diff --git a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm index 1281cb06f575..9c300ec0ea38 100644 --- a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm +++ b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm @@ -43,7 +43,8 @@ /atom/movable/screen/alert/status_effect/inflated name = "WUMBO" desc = "You feel big and strong!" - icon_state = "gross" + use_user_hud_icon = TRUE + overlay_state = "gross" /datum/status_effect/inflated/on_creation(mob/living/new_owner, ...) if (!istype(new_owner, /mob/living/basic/wumborian_fugu)) diff --git a/code/modules/mob/living/basic/trader/trader.dm b/code/modules/mob/living/basic/trader/trader.dm index 9b01261fa51a..c23726a562bb 100644 --- a/code/modules/mob/living/basic/trader/trader.dm +++ b/code/modules/mob/living/basic/trader/trader.dm @@ -23,7 +23,7 @@ ///Sound used when item sold/bought var/sell_sound = 'sound/effects/cashregister.ogg' ///The currency name - var/currency_name = "credits" + var/currency_name = MONEY_NAME ///The spawner we use to create our look var/spawner_path = /obj/effect/mob_spawn/corpse/human/generic_assistant ///Our species to create our look diff --git a/code/modules/mob/living/basic/trader/trader_data.dm b/code/modules/mob/living/basic/trader/trader_data.dm index c47e200154f2..6af2c85530e8 100644 --- a/code/modules/mob/living/basic/trader/trader_data.dm +++ b/code/modules/mob/living/basic/trader/trader_data.dm @@ -8,7 +8,7 @@ ///Sound used when item sold/bought var/sell_sound = 'sound/effects/cashregister.ogg' ///The currency name - var/currency_name = "credits" + var/currency_name = MONEY_NAME ///The initial products that the trader offers var/list/initial_products = list( /obj/item/food/burger/ghost = list(PAYCHECK_CREW * 4, INFINITY), diff --git a/code/modules/mob/living/basic/trooper/pirate.dm b/code/modules/mob/living/basic/trooper/pirate.dm index af8ae0cdfd23..08af919d87bd 100644 --- a/code/modules/mob/living/basic/trooper/pirate.dm +++ b/code/modules/mob/living/basic/trooper/pirate.dm @@ -53,7 +53,7 @@ name = "Pirate Gunner" mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate/ranged corpse = /obj/effect/mob_spawn/corpse/human/pirate/ranged - r_hand = /obj/item/gun/energy/laser + r_hand = /obj/item/gun/energy/laser/soul ai_controller = /datum/ai_controller/basic_controller/trooper/ranged /// Type of bullet we use var/projectiletype = /obj/projectile/beam/laser diff --git a/code/modules/mob/living/basic/trooper/syndicate.dm b/code/modules/mob/living/basic/trooper/syndicate.dm index 37a812191523..15db5b3fbc27 100644 --- a/code/modules/mob/living/basic/trooper/syndicate.dm +++ b/code/modules/mob/living/basic/trooper/syndicate.dm @@ -37,9 +37,9 @@ r_hand = /obj/item/knife/combat/survival var/projectile_deflect_chance = 0 -/mob/living/basic/trooper/syndicate/melee/bullet_act(obj/projectile/projectile) +/mob/living/basic/trooper/syndicate/melee/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) if(prob(projectile_deflect_chance)) - visible_message(span_danger("[src] blocks [projectile] with its shield!")) + visible_message(span_danger("[src] blocks [hitting_projectile] with its shield!")) return BULLET_ACT_BLOCK return ..() @@ -218,7 +218,8 @@ desc = "A small, twin-bladed machine capable of inflicting very deadly lacerations." icon_state = "viscerator_attack" icon_living = "viscerator_attack" - pass_flags = PASSTABLE | PASSMOB + density = FALSE + pass_flags = PASSTABLE | PASSMOB | PASSMACHINE | PASSFLAPS combat_mode = TRUE mob_biotypes = MOB_ROBOTIC basic_mob_flags = DEL_ON_DEATH diff --git a/code/modules/mob/living/basic/vermin/mothroach/mothroach_ai.dm b/code/modules/mob/living/basic/vermin/mothroach/mothroach_ai.dm index 7f2767e1497a..c589152f1cdc 100644 --- a/code/modules/mob/living/basic/vermin/mothroach/mothroach_ai.dm +++ b/code/modules/mob/living/basic/vermin/mothroach/mothroach_ai.dm @@ -22,7 +22,7 @@ /datum/ai_behavior/find_and_set/in_list/mothroach_food -/datum/ai_behavior/find_and_set/in_list/mothroach_food/search_tactic(datum/ai_controller/controller, locate_paths, search_range) +/datum/ai_behavior/find_and_set/in_list/mothroach_food/search_tactic(datum/ai_controller/controller, locate_paths, search_range = SEARCH_TACTIC_DEFAULT_RANGE) var/list/found = typecache_filter_list(oview(search_range, controller.pawn), locate_paths) var/mob/living/living_pawn = controller.pawn found -= living_pawn.loc diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm index 738a711d3c9b..68cf1ba5c119 100644 --- a/code/modules/mob/living/basic/vermin/mouse.dm +++ b/code/modules/mob/living/basic/vermin/mouse.dm @@ -342,7 +342,6 @@ eatverbs = list("devour") food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2) foodtypes = GORE | MEAT | RAW - grind_results = list(/datum/reagent/blood = 20, /datum/reagent/consumable/liquidgibs = 5) decomp_req_handle = TRUE ant_attracting = FALSE decomp_type = /obj/item/food/deadmouse/moldy @@ -354,6 +353,9 @@ 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)) +/obj/item/food/deadmouse/grind_results() + return list(/datum/reagent/blood = 20, /datum/reagent/consumable/liquidgibs = 5) + /// 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 @@ -415,9 +417,11 @@ icon_state = "mouse_gray_dead" food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/mold = 10) foodtypes = GORE | MEAT | RAW | GROSS - grind_results = list(/datum/reagent/blood = 20, /datum/reagent/consumable/liquidgibs = 5, /datum/reagent/consumable/mold = 10) preserved_food = TRUE +/obj/item/food/deadmouse/moldy/grind_results() + return list(/datum/reagent/blood = 20, /datum/reagent/consumable/liquidgibs = 5, /datum/reagent/consumable/mold = 10) + /// The mouse AI controller /datum/ai_controller/basic_controller/mouse blackboard = list( // Always cowardly diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 1d592af98ed3..d538296308e9 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -6,55 +6,174 @@ BLOOD SYSTEM ****************************************************/ +/// Returns whether this mob can have blood. +/// Use the CAN_HAVE_BLOOD(mob) macro instead, this is used to update the cached value. +/mob/living/proc/can_have_blood() + return default_blood_volume > 0 + +/mob/living/carbon/can_have_blood() + return !HAS_TRAIT(src, TRAIT_NOBLOOD) + +/// Returns the blood volume of the mob. +/// Apply modifiers when reading blood volume for oxyloss damage, HUDs and analyzers. +/// Don't apply modifiers when using blood itself, like in spells and reagent transfers. +/mob/living/proc/get_blood_volume(apply_modifiers = FALSE) + return CAN_HAVE_BLOOD(src) ? blood_volume : 0 // Overriding blood setting code can cause blood_volume to be non-zero even when a mob shouldn't have blood. + +/mob/living/carbon/get_blood_volume(apply_modifiers = FALSE) + if (!CAN_HAVE_BLOOD(src)) + return 0 // Overriding blood setting code can cause blood_volume to be non-zero even when a mob shouldn't have blood. + if (!apply_modifiers) + return blood_volume // Default behavior, returns the real blood volume. + if (HAS_TRAIT(src, TRAIT_GODMODE)) + return default_blood_volume // Makes TRAIT_GODMODE grant immunity to the effects of bleeding. (oxyloss, passing out, etc.) + + var/amount = blood_volume + + // Handled here instead of in the saline reagent datum, because this way the modification order is consistent. + // E.g. if you have an effect that modifies blood volume over the dilution cap, then saline should do nothing. + var/datum/reagent/medicine/salglu_solution/saline = reagents?.has_reagent(/datum/reagent/medicine/salglu_solution) + if (saline && amount < saline.dilution_cap) + var/datum/blood_type/blood_type = get_bloodtype() + if (blood_type?.restoration_chem == saline.required_restoration_chem) + amount = min(amount + saline.volume * saline.dilution_per_unit, BLOOD_VOLUME_NORMAL) + + return amount + +/// Sets the base blood volume of the mob, returns the blood volume of the mob after. +/mob/living/proc/set_blood_volume(amount, minimum = 0, maximum = BLOOD_VOLUME_MAXIMUM, cached_blood_volume = null) + if (!isnum(cached_blood_volume)) + cached_blood_volume = get_blood_volume() + + if (!CAN_HAVE_BLOOD(src) && amount != 0) + return cached_blood_volume + + if (amount == cached_blood_volume) + return cached_blood_volume + + blood_volume = clamp(amount, minimum, maximum) + + var/updated_blood_volume = get_blood_volume() + + if (cached_blood_volume != updated_blood_volume) + living_flags |= QUEUE_BLOOD_UPDATE + + return updated_blood_volume + +/// Adjusts the base blood volume of the mob and returns the change. +/// Increases in blood volume give a positive return value and vice versa. +/// Maximum only applies on positive amounts and vice versa. +/mob/living/proc/adjust_blood_volume(amount, minimum = 0, maximum = BLOOD_VOLUME_MAXIMUM) + if (!CAN_HAVE_BLOOD(src) || amount == 0) + return 0 + + var/cached_blood_volume = get_blood_volume() + + if (amount < 0) + if (cached_blood_volume <= minimum) + // Already at or below the minimum, don't decrease further. + return 0 + // Decreases shouldn't jump the pre-existing value to the maximum. + maximum = INFINITY + else + if (cached_blood_volume >= maximum) + // Already at or above the maximum, don't increase further. + return 0 + // Increases shouldn't jump the pre-existing value to the minimum. + minimum = -INFINITY + + var/updated_blood_volume = set_blood_volume(cached_blood_volume + amount, minimum = minimum, maximum = maximum, cached_blood_volume = cached_blood_volume) + return updated_blood_volume - cached_blood_volume + +/// Updates effects that rely on blood volume, like blood HUDs. +/mob/living/proc/update_blood_effects() + living_flags &= ~QUEUE_BLOOD_UPDATE + +/// Updates effects that rely on whether the mob can have blood. +/mob/living/proc/update_blood_status() + var/had_blood = CAN_HAVE_BLOOD(src) + + living_flags = can_have_blood() ? (living_flags | LIVING_CAN_HAVE_BLOOD) : (living_flags & ~LIVING_CAN_HAVE_BLOOD) + + var/has_blood = CAN_HAVE_BLOOD(src) + + if (had_blood == has_blood) + return + + var/old_blood_volume = get_blood_volume() + + set_blood_volume(has_blood ? default_blood_volume : 0) + + var/new_blood_volume = get_blood_volume() + + SEND_SIGNAL(src, COMSIG_LIVING_UPDATE_BLOOD_STATUS, had_blood, has_blood, old_blood_volume, new_blood_volume) + +/// A one-time coagulating effect of the mob's bloodiest cut/stab +/// Returns TRUE if a wound was affected, FALSE if no wound was found +/mob/living/proc/coagulant_effect(amount_to_heal = 1) + return FALSE + +/mob/living/carbon/coagulant_effect(amount_to_heal = 1) + var/datum/wound/bloodiest_wound + for(var/datum/wound/iter_wound as anything in all_wounds) + if(iter_wound.blood_flow && iter_wound.blood_flow > bloodiest_wound?.blood_flow) + bloodiest_wound = iter_wound + + bloodiest_wound?.adjust_blood_flow(-1 * abs(amount_to_heal)) + return !!bloodiest_wound + // Takes care blood loss and regeneration /mob/living/carbon/human/handle_blood(seconds_per_tick, times_fired) // Under these circumstances blood handling is not necessary - if(bodytemperature < BLOOD_STOP_TEMP || HAS_TRAIT(src, TRAIT_FAKEDEATH) || HAS_TRAIT(src, TRAIT_HUSK)) + if(bodytemperature < BLOOD_STOP_TEMP || HAS_TRAIT(src, TRAIT_FAKEDEATH)) return + // Run the signal, still allowing mobs with noblood to "handle blood" in their own way var/sigreturn = SEND_SIGNAL(src, COMSIG_HUMAN_ON_HANDLE_BLOOD, seconds_per_tick, times_fired) - if((sigreturn & HANDLE_BLOOD_HANDLED) || HAS_TRAIT(src, TRAIT_NOBLOOD)) + if((sigreturn & HANDLE_BLOOD_HANDLED) || !CAN_HAVE_BLOOD(src)) return //Blood regeneration if there is some space - if(!(sigreturn & HANDLE_BLOOD_NO_NUTRITION_DRAIN)) - if(blood_volume < BLOOD_VOLUME_NORMAL && !HAS_TRAIT(src, TRAIT_NOHUNGER)) - var/nutrition_ratio = round(nutrition / NUTRITION_LEVEL_WELL_FED, 0.2) - if(satiety > 80) - nutrition_ratio *= 1.25 - adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR * seconds_per_tick) - blood_volume = min(blood_volume + (BLOOD_REGEN_FACTOR * physiology.blood_regen_mod * nutrition_ratio * seconds_per_tick), BLOOD_VOLUME_NORMAL) - - //Bloodloss from wounds - var/temp_bleed = 0 - for(var/obj/item/bodypart/iter_part as anything in bodyparts) - temp_bleed += iter_part.cached_bleed_rate * seconds_per_tick + if(!(sigreturn & HANDLE_BLOOD_NO_NUTRITION_DRAIN) && get_blood_volume() < BLOOD_VOLUME_NORMAL && !HAS_TRAIT(src, TRAIT_NOHUNGER)) + var/nutrition_ratio = round(nutrition / NUTRITION_LEVEL_WELL_FED, 0.2) - if(iter_part.generic_bleedstacks) // If you don't have any bleedstacks, don't try and heal them - iter_part.adjustBleedStacks(-1, 0) + if(satiety > 80) + nutrition_ratio *= 1.25 - if(temp_bleed) - bleed(temp_bleed) - bleed_warn(temp_bleed) + var/blood_to_restore = BLOOD_REGEN_FACTOR * physiology.blood_regen_mod * nutrition_ratio * seconds_per_tick + var/blood_restored = adjust_blood_volume(blood_to_restore, maximum = BLOOD_VOLUME_NORMAL) + + if (blood_restored > 0) + adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR * seconds_per_tick * (blood_restored / blood_to_restore)) + + var/bleed_rate = get_bleed_rate() + + if(bleed_rate) + bleed(bleed_rate * seconds_per_tick) + bleed_warn(bleed_rate) + + for (var/obj/item/bodypart/bodypart as anything in bodyparts) + if (bodypart.generic_bleedstacks) + bodypart.adjustBleedStacks(-1, 0) //Effects of bloodloss if(sigreturn & HANDLE_BLOOD_NO_OXYLOSS) return + // Takes into account modifiers like saline-glucose solution in the blood + var/modified_blood_volume = get_blood_volume(apply_modifiers = TRUE) + // Some effects are halved mid-combat. var/determined_mod = has_status_effect(/datum/status_effect/determined) ? 0.5 : 0 var/word = pick("dizzy","woozy","faint") - switch(blood_volume) + switch(modified_blood_volume) + // Way too much blood! if(BLOOD_VOLUME_EXCESS to BLOOD_VOLUME_MAX_LETHAL) if(SPT_PROB(7.5, seconds_per_tick)) to_chat(src, span_userdanger("Blood starts to tear your skin apart. You're going to burst!")) investigate_log("has been gibbed by having too much blood.", INVESTIGATE_DEATHS) inflate_gib() - // Way too much blood! - if(BLOOD_VOLUME_EXCESS to BLOOD_VOLUME_MAX_LETHAL) - if(SPT_PROB(5, seconds_per_tick)) - to_chat(src, span_warning("You feel your skin swelling.")) // Too much blood if(BLOOD_VOLUME_MAXIMUM to BLOOD_VOLUME_EXCESS) if(SPT_PROB(5, seconds_per_tick)) @@ -66,9 +185,9 @@ if(prob(50)) to_chat(src, span_danger("You feel [word]. It's getting a bit hard to breathe.")) losebreath += 0.5 * determined_mod * seconds_per_tick - else if(getStaminaLoss() < 25 * determined_mod) + else if(get_stamina_loss() < 25 * determined_mod) to_chat(src, span_danger("You feel [word]. It's getting a bit hard to focus.")) - adjustStaminaLoss(10 * determined_mod * REM * seconds_per_tick) + adjust_stamina_loss(10 * determined_mod * REM * seconds_per_tick) // Pretty low blood, getting dangerous! if(BLOOD_VOLUME_RISKY to BLOOD_VOLUME_OKAY) if(SPT_PROB(5, seconds_per_tick)) @@ -77,9 +196,9 @@ if(prob(50)) to_chat(src, span_bolddanger("You feel very [word]. It's getting hard to breathe!")) losebreath += 1 * determined_mod * seconds_per_tick - else if(getStaminaLoss() < 40 * determined_mod) + else if(get_stamina_loss() < 40 * determined_mod) to_chat(src, span_bolddanger("You feel very [word]. It's getting hard to stay awake!")) - adjustStaminaLoss(15 * determined_mod * REM * seconds_per_tick) + adjust_stamina_loss(15 * determined_mod * REM * seconds_per_tick) // Very low blood, danger!! if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_RISKY) if(SPT_PROB(5, seconds_per_tick)) @@ -88,9 +207,9 @@ if(prob(50)) to_chat(src, span_userdanger("You feel extremely [word]! It's getting very hard to breathe!")) losebreath += 1.5 * determined_mod * seconds_per_tick - else if(getStaminaLoss() < 80 * determined_mod) + else if(get_stamina_loss() < 80 * determined_mod) to_chat(src, span_userdanger("You feel extremely [word]! It's getting very hard to stay awake!")) - adjustStaminaLoss(20 * determined_mod * REM * seconds_per_tick) + adjust_stamina_loss(20 * determined_mod * REM * seconds_per_tick) // Critically low blood, death is near! Adrenaline won't help you here. if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) if(SPT_PROB(7.5, seconds_per_tick)) @@ -103,35 +222,35 @@ death() // Blood ratio! if you have 280 blood, this equals 0.5 as that's half of the current value, 560. - var/effective_blood_ratio = blood_volume / BLOOD_VOLUME_NORMAL + var/effective_blood_ratio = modified_blood_volume / BLOOD_VOLUME_NORMAL var/target_oxyloss = max((1 - effective_blood_ratio) * 100, 0) // If your ratio is less than one (you're missing any blood) and your oxyloss is under missing blood %, start getting oxy damage. // This damage accrues faster the less blood you have. // If the damage surpasses the KO threshold for oxyloss, then we'll always tick up so you die eventually - if(target_oxyloss > 0 && (getOxyLoss() < target_oxyloss || (target_oxyloss >= OXYLOSS_PASSOUT_THRESHOLD && stat >= UNCONSCIOUS))) + if(target_oxyloss > 0 && (get_oxy_loss() < target_oxyloss || (target_oxyloss >= OXYLOSS_PASSOUT_THRESHOLD && stat >= UNCONSCIOUS))) // At roughly half blood this equals to 3 oxyloss per tick. At 90% blood it's close to 0.5 - var/rounded_oxyloss = round(0.01 * (BLOOD_VOLUME_NORMAL - blood_volume), 0.25) * seconds_per_tick - adjustOxyLoss(rounded_oxyloss, updating_health = TRUE) + var/rounded_oxyloss = round(0.01 * (BLOOD_VOLUME_NORMAL - modified_blood_volume), 0.25) * seconds_per_tick + adjust_oxy_loss(rounded_oxyloss, updating_health = TRUE) /// Has each bodypart update its bleed/wound overlay icon states /mob/living/carbon/proc/update_bodypart_bleed_overlays() for(var/obj/item/bodypart/iter_part as anything in bodyparts) iter_part.update_part_wound_overlay() -/// Makes a blood drop, leaking amt units of blood from the mob -/mob/living/proc/bleed(amt) +/// Bleeds amount units of blood from the mob, sometimes creating a blood splatter on the floor. +/mob/living/proc/bleed(amount) if(HAS_TRAIT(src, TRAIT_GODMODE) || !can_bleed()) return - blood_volume = max(blood_volume - amt, 0) + var/amount_bled = -adjust_blood_volume(-amount) // 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)) + if(isturf(loc) && prob(sqrt(amount_bled) * BLOOD_DRIP_RATE_MOD)) + add_splatter_floor(loc, (amount_bled <= 10)) -/mob/living/carbon/human/bleed(amt) - amt *= physiology.bleed_mod +/mob/living/carbon/human/bleed(amount) + amount *= physiology.bleed_mod return ..() /// A helper to see how much blood we're losing per tick @@ -140,12 +259,11 @@ /mob/living/carbon/get_bleed_rate() if(HAS_TRAIT(src, TRAIT_GODMODE) || !can_bleed()) - return - var/bleed_amt = 0 - for(var/X in bodyparts) - var/obj/item/bodypart/iter_bodypart = X - bleed_amt += iter_bodypart.cached_bleed_rate - return bleed_amt + return 0 + + . = 0 + for(var/obj/item/bodypart/bodypart as anything in bodyparts) + . += bodypart.cached_bleed_rate /mob/living/carbon/human/get_bleed_rate() return ..() * physiology.bleed_mod @@ -154,22 +272,22 @@ * bleed_warn() is used to for carbons with an active client to occasionally receive messages warning them about their bleeding status (if applicable) * * Arguments: - * * bleed_amt- When we run this from [/mob/living/carbon/human/proc/handle_blood] we already know how much blood we're losing this tick, so we can skip tallying it again with this - * * forced- + * * bleed_rate - When we run this from [/mob/living/carbon/human/proc/handle_blood] we already know how much blood we're losing per second, so we can skip tallying it again with this. + * * skip_cooldown - Skips caring about the bleed message cooldown. */ -/mob/living/carbon/proc/bleed_warn(bleed_amt = 0, forced = FALSE) - if(!blood_volume || !client) +/mob/living/carbon/proc/bleed_warn(bleed_rate = null, skip_cooldown = FALSE) + if(!CAN_HAVE_BLOOD(src) || !client) return - if(!COOLDOWN_FINISHED(src, bleeding_message_cd) && !forced) + if(!COOLDOWN_FINISHED(src, bleeding_message_cd) && !skip_cooldown) return - if(!bleed_amt) // if we weren't provided the amount of blood we lost this tick in the args - bleed_amt = get_bleed_rate() + if(!isnum(bleed_rate)) + bleed_rate = get_bleed_rate() var/bleeding_severity = "" var/next_cooldown = BLEEDING_MESSAGE_BASE_CD - switch(bleed_amt) + switch(bleed_rate) if(-INFINITY to 0) return if(0 to 1) @@ -208,15 +326,11 @@ to_chat(src, span_warning("[bleeding_severity][rate_of_change]")) COOLDOWN_START(src, bleeding_message_cd, next_cooldown) -/mob/living/carbon/human/bleed_warn(bleed_amt = 0, forced = FALSE) - if(!HAS_TRAIT(src, TRAIT_NOBLOOD)) - return ..() - /mob/living/proc/restore_blood() - blood_volume = initial(blood_volume) + set_blood_volume(default_blood_volume) /mob/living/carbon/restore_blood() - blood_volume = BLOOD_VOLUME_NORMAL + . = ..() for(var/obj/item/bodypart/bodypart_to_restore as anything in bodyparts) bodypart_to_restore.setBleedStacks(0) @@ -224,47 +338,54 @@ BLOOD TRANSFERS ****************************************************/ -//Gets blood from mob to a container or other mob, preserving all data in it. -/mob/living/proc/transfer_blood_to(atom/movable/receiver, amount, forced, ignore_incompatibility) - if(!blood_volume || !receiver.reagents) - return FALSE +// Transfers blood from mob to a container or another mob, preserving all data in it. +// Returns how much blood was able to be transferred. +/mob/living/proc/transfer_blood_to(atom/movable/receiver, amount, ignore_low_blood = FALSE, ignore_incompatibility = FALSE, transfer_viruses = TRUE) + var/cached_blood_volume = get_blood_volume() - if(blood_volume < BLOOD_VOLUME_BAD && !forced) - return FALSE + if(!cached_blood_volume || !receiver.reagents || amount <= 0) + return 0 - if(blood_volume < amount) - amount = blood_volume + if(cached_blood_volume < BLOOD_VOLUME_BAD && !ignore_low_blood) + return 0 var/datum/blood_type/blood_type = get_bloodtype() if (!blood_type) - return FALSE + return 0 var/blood_reagent = get_blood_reagent() - - blood_volume -= amount var/list/blood_data = get_blood_data() - if (!isliving(receiver)) - receiver.reagents.add_reagent(blood_reagent, amount, blood_data, bodytemperature, creation_callback = CALLBACK(src, PROC_REF(on_blood_created), blood_type)) - return TRUE + // Caps the amount to how much blood we have. + amount = min(amount, get_blood_volume()) + + if (!ignore_low_blood) + // Caps the amount to how much we can transfer before reaching low blood. + amount = min(amount, get_blood_volume() - BLOOD_VOLUME_BAD) var/mob/living/target = receiver - if (target.get_blood_reagent() != blood_reagent) - target.reagents.add_reagent(blood_reagent, amount, blood_data, bodytemperature, creation_callback = CALLBACK(src, PROC_REF(on_blood_created), blood_type)) - return TRUE + if (!isliving(receiver) || target.get_blood_reagent() != blood_reagent) + // Further caps the amount to how much blood we were able to add to the target. + amount = receiver.reagents.add_reagent(blood_reagent, amount, blood_data, bodytemperature, creation_callback = CALLBACK(src, PROC_REF(on_blood_created), blood_type)) + adjust_blood_volume(-amount) + return amount - if(blood_data["viruses"]) + if(blood_data["viruses"] && transfer_viruses) for(var/datum/disease/blood_disease as anything in blood_data["viruses"]) if((blood_disease.spread_flags & DISEASE_SPREAD_SPECIAL) || (blood_disease.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) continue target.ForceContractDisease(blood_disease) if(!ignore_incompatibility && !(blood_type.type_key() in target.get_bloodtype().compatible_types)) - target.reagents.add_reagent(/datum/reagent/toxin, amount * 0.5) - return TRUE + // Yes, we cap it to the amount of toxin. This is ridiculously niche, but we do it anyway. + amount = target.reagents.add_reagent(/datum/reagent/toxin, amount * 0.5) * 2 + adjust_blood_volume(-amount) + return amount - target.blood_volume = min(target.blood_volume + round(amount, 0.1), BLOOD_VOLUME_MAX_LETHAL) - return TRUE + // And, obviously, cap it to how much blood the target can take if they're living. + amount = target.adjust_blood_volume(amount, maximum = BLOOD_VOLUME_MAX_LETHAL) + adjust_blood_volume(-amount) + return amount /// Callback that adds blood_reagent to any blood extracted from ourselves /mob/living/proc/on_blood_created(datum/blood_type/blood_type, datum/reagent/new_blood) @@ -310,6 +431,20 @@ blood_data["ckey"] = persistent_client.mob.ckey blood_data["factions"] = faction + + // DARKPACK EDIT ADD - Store kindred clan and generation in blood data + var/datum/splat/vampire/kindred/kindred_splat = iskindred(src) + if(kindred_splat) + blood_data["generation"] = kindred_splat.generation + blood_data["clan"] = kindred_splat.clan + blood_data["real_name"] = real_name + + if(istype(src, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = src + if(H.dna && H.dna.species) + blood_data["species"] = LOWER_TEXT(H.dna.species.name) + // DARKPACK EDIT ADD END + return blood_data /mob/living/carbon/get_blood_data() @@ -344,15 +479,15 @@ // DARKPACK EDIT START - Vitae blood_data["donor"] = WEAKREF(src) - blood_data["generation"] = generation - blood_data["clan"] = clan?.name + blood_data["generation"] = get_generation() + blood_data["clan"] = get_clan()?.name // DARKPACK EDIT END return blood_data /mob/living/proc/get_bloodtype() RETURN_TYPE(/datum/blood_type) - if (!blood_volume) + if (!CAN_HAVE_BLOOD(src)) return if (!(mob_biotypes & MOB_ORGANIC)) @@ -382,7 +517,7 @@ /// Check if a mob can bleed, and possibly if they're capable of leaving decals on turfs/mobs/items /mob/living/proc/can_bleed(bleed_flag = NONE) - if (HAS_TRAIT(src, TRAIT_HUSK) || HAS_TRAIT(src, TRAIT_NOBLOOD)) + if (!CAN_HAVE_BLOOD(src)) return BLEED_NONE if (!bleed_flag) @@ -466,7 +601,7 @@ /// Create a small visual-only blood splatter /mob/living/proc/create_splatter(splatter_dir = pick(GLOB.cardinals)) - // Check for husking and TRAIT_NOBLOOD + // Check for TRAIT_NOBLOOD if (!can_bleed()) // Even if we can't cover turfs, we still can add DNA to everything our blood hits return var/obj/effect/temp_visual/dir_setting/bloodsplatter/splatter = new(get_turf(src), splatter_dir, get_bloodtype()?.get_color()) @@ -485,7 +620,7 @@ if (!splatter_turf) return - // Check for husking and TRAIT_NOBLOOD + // Check for TRAIT_NOBLOOD switch (can_bleed(BLOOD_COVER_TURFS)) if (BLEED_NONE) return @@ -511,24 +646,34 @@ var/turf/targ = get_ranged_target_turf(src, splatter_direction, splatter_strength) our_splatter.fly_towards(targ, splatter_strength) +// FIXME: This duplicates blood like crazy. The amount you bleed is way less than the splatter. +// To summarize, you can literally dupe blood and bypass bloodloss with a syringe and a beaker. +// I'm writing this here because it's out of scope for my PR, but was discovered because of it. /mob/living/proc/make_blood_trail(turf/target_turf, turf/start, was_facing, movement_direction) - if(!has_gravity() || !isturf(start)) + if(!has_gravity() || !isturf(start) || !can_bleed()) + return + + var/cached_blood_volume = get_blood_volume() + + if(!cached_blood_volume) return var/base_bleed_rate = get_bleed_rate() - var/base_brute = getBruteLoss() + var/base_brute = get_brute_loss() var/brute_ratio = round(base_brute / (maxHealth * 4), 0.1) - var/bleeding_rate = round(base_bleed_rate / 4, 0.1) + var/bleeding_rate = round(base_bleed_rate / 4, 0.1) + // We only leave a trail if we're below a certain blood threshold // The more brute damage we have, or the more we're bleeding, the less blood we need to leave a trail - if(blood_volume < max(BLOOD_VOLUME_NORMAL * (1 - max(bleeding_rate, brute_ratio)), 0)) + if(cached_blood_volume < max(BLOOD_VOLUME_NORMAL * (1 - max(bleeding_rate, brute_ratio)), 0)) return var/blood_to_add = BLOOD_AMOUNT_PER_DECAL * 0.1 + if(body_position == LYING_DOWN) blood_to_add += bleed_drag_amount() - blood_volume = max(blood_volume - blood_to_add, 0) + adjust_blood_volume(-blood_to_add) else blood_to_add += base_bleed_rate @@ -536,10 +681,11 @@ if(base_brute >= 300 || base_bleed_rate >= 7) blood_to_add *= 2 - switch (can_bleed(BLOOD_COVER_TURFS)) - if (BLEED_NONE) + // Checks if we can add visual blood effects on turfs. + switch(can_bleed(BLOOD_COVER_TURFS)) + if(BLEED_NONE) return - if (BLEED_ADD_DNA) + if(BLEED_ADD_DNA) return start.add_mob_blood(src) var/trail_dir = REVERSE_DIR(movement_direction) @@ -571,7 +717,7 @@ trail_dir &= ~(was_facing & (EAST|WEST)) break - if (continuing_trail || (trail_dir in GLOB.diagonals)) + if(continuing_trail || (trail_dir in GLOB.diagonals)) create_blood_trail_component(start, trail_dir, blood_to_add * 0.67, FALSE) create_blood_trail_component(target_turf, get_dir(start, target_turf), blood_to_add * 0.33, TRUE) return @@ -631,7 +777,7 @@ /// Returns how much blood we're losing from being dragged a tile, from [/mob/living/proc/make_blood_trail] /mob/living/proc/bleed_drag_amount() - var/brute_ratio = round(getBruteLoss() / maxHealth, 0.1) + var/brute_ratio = round(get_brute_loss() / maxHealth, 0.1) return max(1, brute_ratio * 2) /mob/living/carbon/bleed_drag_amount() diff --git a/code/modules/mob/living/blood_types.dm b/code/modules/mob/living/blood_types.dm index c2c68428ec55..f9d84a4cc9d8 100644 --- a/code/modules/mob/living/blood_types.dm +++ b/code/modules/mob/living/blood_types.dm @@ -231,6 +231,10 @@ . = ..() compatible_types = subtypesof(/datum/blood_type) +/datum/blood_type/human/universal/vampire + name = BLOOD_TYPE_VAMPIRE + dna_string = "Hemovore DNA" + /datum/blood_type/animal name = BLOOD_TYPE_ANIMAL desc = "Blood cells suspended in plasma, the most abundant of which being the hemoglobin-containing red blood cells." @@ -290,10 +294,6 @@ if (blood.desc == /obj/effect/decal/cleanable/blood::desc) blood.desc = /obj/effect/decal/cleanable/blood/oil::desc -/datum/blood_type/vampire - name = BLOOD_TYPE_VAMPIRE - dna_string = "Hemovore DNA" - /datum/blood_type/meat // why does this exist name = BLOOD_TYPE_MEAT dna_string = "Meaty DNA" diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 54fbb132db23..fc8e60b63e06 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -58,10 +58,10 @@ return /mob/living/brain/get_eye_protection()//no eyes - return 2 + return FLASH_PROTECTION_WELDER -/mob/living/brain/get_ear_protection()//no ears - return 2 +/mob/living/brain/get_ear_protection(ignore_deafness = FALSE) + return ..() + EAR_PROTECTION_HEAVY /mob/living/brain/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 diff --git a/code/modules/mob/living/brain/brain_cybernetic.dm b/code/modules/mob/living/brain/brain_cybernetic.dm index c88db6dc1a1a..49a65cd7f42e 100644 --- a/code/modules/mob/living/brain/brain_cybernetic.dm +++ b/code/modules/mob/living/brain/brain_cybernetic.dm @@ -4,6 +4,7 @@ icon_state = "brain-c" organ_flags = ORGAN_ROBOTIC | ORGAN_VITAL failing_desc = "seems to be broken, and will not work without repairs." + shade_color = null /obj/item/organ/brain/cybernetic/brain_damage_examine() if(suicided) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 687f23568e94..fd9a606e04ba 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -25,8 +25,6 @@ var/mob/living/brain/brainmob = null /// If it's a fake brain with no brainmob assigned. Feedback messages will be faked as if it does have a brainmob. See changelings & dullahans. var/decoy_override = FALSE - /// Two variables necessary for calculating whether we get a brain trauma or not - var/damage_delta = 0 var/list/datum/brain_trauma/traumas = list() @@ -48,6 +46,8 @@ var/variant_traits_added /// Variance in brain traits removed by subtypes var/variant_traits_removed + /// The color of this brain. Fluff, only used when repairing (shade of...). + var/shade_color = "pink" /obj/item/organ/brain/Initialize(mapload) . = ..() @@ -222,8 +222,8 @@ if(!do_after(user, 3 SECONDS, src)) to_chat(user, span_warning("You failed to pour the contents of [item] onto [src]!")) return TRUE - - user.visible_message(span_notice("[user] pours the contents of [item] onto [src], causing it to reform its original shape and turn a slightly brighter shade of pink."), span_notice("You pour the contents of [item] onto [src], causing it to reform its original shape and turn a slightly brighter shade of pink.")) + var/and_bright_shade = !shade_color ? "" : " and turn a slightly brighter shade of [shade_color]" + user.visible_message(span_notice("[user] pours the contents of [item] onto [src], causing it to reform its original shape[and_bright_shade]."), span_notice("You pour the contents of [item] onto [src], causing it to reform its original shape[and_bright_shade].")) var/amount = item.reagents.get_reagent_amount(/datum/reagent/medicine/mannitol) var/healto = max(0, damage - amount * 2) item.reagents.remove_all(ROUND_UP(item.reagents.total_volume / amount * (damage - healto) * 0.5)) //only removes however much solution is needed while also taking into account how much of the solution is mannitol @@ -272,7 +272,9 @@ trauma_desc = conditional_tooltip("Deep-rooted ", "Repair via Lobotomy.", add_tooltips) if(TRAUMA_RESILIENCE_WOUND) trauma_desc = conditional_tooltip("Fracture-derived ", "Repair via treatment of wounds afflicting the head.", add_tooltips) - if(TRAUMA_RESILIENCE_MAGIC, TRAUMA_RESILIENCE_ABSOLUTE) + if(TRAUMA_RESILIENCE_MAGIC) + trauma_desc = conditional_tooltip("Persistent ", "Only repairable via magic.", add_tooltips) + if(TRAUMA_RESILIENCE_ABSOLUTE) trauma_desc = conditional_tooltip("Permanent ", "Irreparable under normal circumstances.", add_tooltips) trauma_desc += capitalize(trauma.scan_desc) LAZYADD(trauma_text, trauma_desc) @@ -336,39 +338,82 @@ return ..() /obj/item/organ/brain/on_life(seconds_per_tick, times_fired) + if(HAS_TRAIT(src, TRAIT_BRAIN_DAMAGE_NODEATH)) + return if(damage >= BRAIN_DAMAGE_DEATH) //rip to_chat(owner, span_userdanger("The last spark of life in your brain fizzles out...")) owner.investigate_log("has been killed by brain damage.", INVESTIGATE_DEATHS) owner.death() -/obj/item/organ/brain/check_damage_thresholds(mob/M) +/obj/item/organ/brain/on_bodypart_remove(obj/item/bodypart/limb, movement_flags) + . = ..() + update_brain_color(animate = FALSE) // once it's out in the world we need to make sure it's the right color + +/obj/item/organ/brain/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag = NONE) + . = ..() + var/delta_dam = . //for the sake of clarity + if(isnull(bodypart_owner)) // no need to color it if it's in someone's noggin + update_brain_color() + if(delta_dam > 0 && damage > BRAIN_DAMAGE_MILD) + roll_for_brain_trauma(delta_dam) + +/// Rolls a random chance to gain a brain trauma based on damage taken and current damage level +/obj/item/organ/brain/proc/roll_for_brain_trauma(delta_dam) + if(prob(delta_dam * (1 + max(0, (damage - BRAIN_DAMAGE_MILD)/100)))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 1% //learn how to do your bloody math properly goddamnit + gain_trauma_type(BRAIN_TRAUMA_MILD, natural_gain = TRUE) + + var/is_boosted = (owner && HAS_TRAIT(owner, TRAIT_SPECIAL_TRAUMA_BOOST)) + if(damage < BRAIN_DAMAGE_SEVERE) + return + if(prob(delta_dam * (1 + max(0, (damage - BRAIN_DAMAGE_SEVERE)/100)))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 1% + if(prob(20 + (is_boosted * 30))) + gain_trauma_type(BRAIN_TRAUMA_SPECIAL, is_boosted ? TRAUMA_RESILIENCE_SURGERY : null, natural_gain = TRUE) + else + gain_trauma_type(BRAIN_TRAUMA_SEVERE, natural_gain = TRUE) + +#define BRAIN_DAMAGE_FILTER "brain_damage_color_filter" + +/// Updates the brain's color based on damage level - the more damaged, the darker and grayer it gets +/obj/item/organ/brain/proc/update_brain_color(animate = TRUE) + if(damage <= 0) + if(get_filter(BRAIN_DAMAGE_FILTER)) + if(animate) + transition_filter(BRAIN_DAMAGE_FILTER, color_matrix_filter("#ffffff"), time = 1 SECONDS) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum, remove_filter), "brain_damage_color_filter"), 1.2 SECONDS, TIMER_UNIQUE) + else + remove_filter(BRAIN_DAMAGE_FILTER) + return + + var/gradient = rgb_gradient(round(damage / maxHealth, 0.01), 0, "#ffffff", 1, "#7f7f7f") + if(animate) + if(!get_filter(BRAIN_DAMAGE_FILTER)) + add_filter(BRAIN_DAMAGE_FILTER, 1, color_matrix_filter("#ffffff")) + transition_filter(BRAIN_DAMAGE_FILTER, color_matrix_filter(gradient), time = 1 SECONDS) + else if(get_filter(BRAIN_DAMAGE_FILTER)) + modify_filter(BRAIN_DAMAGE_FILTER, color_matrix_filter(gradient)) + else + add_filter(BRAIN_DAMAGE_FILTER, 1, color_matrix_filter(gradient)) + +#undef BRAIN_DAMAGE_FILTER + +/obj/item/organ/brain/check_damage_thresholds() . = ..() + if(!owner) + return // If we crossed blinking brain damage thresholds either way, update our blinking - if (owner && ((prev_damage > BRAIN_DAMAGE_ASYNC_BLINKING && damage < BRAIN_DAMAGE_ASYNC_BLINKING) || (prev_damage < BRAIN_DAMAGE_ASYNC_BLINKING && damage > BRAIN_DAMAGE_ASYNC_BLINKING))) + if((prev_damage >= BRAIN_DAMAGE_ASYNC_BLINKING && damage < BRAIN_DAMAGE_ASYNC_BLINKING) || (prev_damage < BRAIN_DAMAGE_ASYNC_BLINKING && damage >= BRAIN_DAMAGE_ASYNC_BLINKING)) var/obj/item/organ/eyes/eyes = owner.get_organ_slot(ORGAN_SLOT_EYES) if(eyes?.blink_animation) eyes.animate_eyelids(owner) + if(damage >= 60 && prev_damage < 60) + owner.add_mood_event("brain_damage", /datum/mood_event/brain_damage) + else if(prev_damage >= 60 && damage < 60) + owner.clear_mood_event("brain_damage") // If we're not more injured than before, return without gambling for a trauma if(damage <= prev_damage) return - damage_delta = damage - prev_damage - if(damage > BRAIN_DAMAGE_MILD) - if(prob(damage_delta * (1 + max(0, (damage - BRAIN_DAMAGE_MILD)/100)))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 1% //learn how to do your bloody math properly goddamnit - gain_trauma_type(BRAIN_TRAUMA_MILD, natural_gain = TRUE) - - var/is_boosted = (owner && HAS_TRAIT(owner, TRAIT_SPECIAL_TRAUMA_BOOST)) - if(damage > BRAIN_DAMAGE_SEVERE) - if(prob(damage_delta * (1 + max(0, (damage - BRAIN_DAMAGE_SEVERE)/100)))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 1% - if(prob(20 + (is_boosted * 30))) - gain_trauma_type(BRAIN_TRAUMA_SPECIAL, is_boosted ? TRAUMA_RESILIENCE_SURGERY : null, natural_gain = TRUE) - else - gain_trauma_type(BRAIN_TRAUMA_SEVERE, natural_gain = TRUE) - - if (!owner || owner.stat > UNCONSCIOUS) - return - // Conscious or soft-crit var/brain_message if(prev_damage < BRAIN_DAMAGE_MILD && damage >= BRAIN_DAMAGE_MILD) @@ -440,12 +485,14 @@ icon_state = "brain-x" variant_traits_added = list(TRAIT_PRIMITIVE) variant_traits_removed = list(TRAIT_LITERATE, TRAIT_ADVANCEDTOOLUSER) + shade_color = "green" /obj/item/organ/brain/alien name = "alien brain" desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?" icon_state = "brain-x" variant_traits_removed = list(TRAIT_LITERATE, TRAIT_ADVANCEDTOOLUSER) + shade_color = "green" /obj/item/organ/brain/primitive //No like books and stompy metal men name = "primitive brain" @@ -466,6 +513,7 @@ icon_state = "adamantine_resonator" can_smoothen_out = FALSE color = COLOR_GOLEM_GRAY + shade_color = "teal" organ_flags = ORGAN_MINERAL variant_traits_added = list(TRAIT_ROCK_METAMORPHIC) @@ -474,6 +522,7 @@ desc = "This is your brain on bluespace dust. Not even once." icon_state = "random_fly_4" can_smoothen_out = FALSE + shade_color = null // This fixes an edge case from species/regenerate_organs that would transfer the brain trauma before organ/on_mob_remove can remove it // Prevents wizards from using the magic mirror to gain bluespace_prophet trauma and then switching to another race @@ -515,6 +564,7 @@ icon_state = "brain-ghost" movement_type = PHASING organ_flags = parent_type::organ_flags | ORGAN_GHOST + shade_color = "ectoplasmic white" /obj/item/organ/brain/abductor name = "grey brain" @@ -522,6 +572,7 @@ icon_state = "brain-x" brain_size = 1.3 variant_traits_added = list(TRAIT_REMOTE_TASTING) + shade_color = "grey" ////////////////////////////////////TRAUMAS//////////////////////////////////////// @@ -539,6 +590,9 @@ . += BT /obj/item/organ/brain/proc/can_gain_trauma(datum/brain_trauma/trauma, resilience, natural_gain = FALSE) + if(HAS_TRAIT(src, TRAIT_BRAIN_TRAUMA_IMMUNITY)) + return FALSE + if(!ispath(trauma)) trauma = trauma.type if(!initial(trauma.can_gain)) @@ -658,15 +712,6 @@ amount_cured++ return amount_cured -/obj/item/organ/brain/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag = NONE) - . = ..() - if(!owner) - return FALSE - if(damage >= 60) - owner.add_mood_event("brain_damage", /datum/mood_event/brain_damage) - else - owner.clear_mood_event("brain_damage") - /// This proc lets the mob's brain decide what bodypart to attack with in an unarmed strike. /obj/item/organ/brain/proc/get_attacking_limb(mob/living/carbon/human/target) var/obj/item/bodypart/arm/active_hand = owner.get_active_hand() @@ -692,3 +737,4 @@ desc = "The brain of a pod person, it's a bit more plant-like than a human brain." foodtype_flags = PODPERSON_ORGAN_FOODTYPES color = COLOR_LIME + shade_color = "lime" diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index d5d066f63e68..7bfc3612e885 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -77,10 +77,8 @@ GLOBAL_VAR(posibrain_notify_cooldown) /obj/item/mmi/posibrain/click_alt(mob/living/user) var/input_seed = tgui_input_text(user, "Enter a personality seed", "Enter seed", ask_role, max_length = MAX_NAME_LEN) - if(isnull(input_seed)) + if(isnull(input_seed) || !user.can_perform_action(src)) return CLICK_ACTION_BLOCKING - if(!user.can_perform_action(src)) - return to_chat(user, span_notice("You set the personality seed to \"[input_seed]\".")) ask_role = input_seed update_appearance() diff --git a/code/modules/mob/living/carbon/alien/adult/adult.dm b/code/modules/mob/living/carbon/alien/adult/adult.dm index 0ae07a4d3a1e..0a198f2f00da 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult.dm @@ -1,4 +1,5 @@ /mob/living/carbon/alien/adult + abstract_type = /mob/living/carbon/alien/adult name = "alien" icon_state = "alien" pass_flags = PASSTABLE 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 3b65549d6d9c..09f3d3d38921 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult_defense.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult_defense.dm @@ -4,7 +4,7 @@ . = ..() if(!.) return - adjustBruteLoss(15) + adjust_brute_loss(15) var/hitverb = "hit" if(mob_size < MOB_SIZE_LARGE) safe_throw_at(get_edge_target_turf(src, get_dir(user, src)), 2, 1, user) 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 cd8e72a04f77..8a74590fe78b 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 @@ -8,7 +8,7 @@ if(stat == DEAD) //If we mostly took damage from fire - if(getFireLoss() > 125) + if(get_fire_loss() > 125) icon_state = "alien[caste]_husked" else icon_state = "alien[caste]_dead" diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index df5e9a6e0ee4..d0c1ce82e093 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -1,4 +1,5 @@ /mob/living/carbon/alien + abstract_type = /mob/living/carbon/alien name = "alien" icon = 'icons/mob/nonhuman-player/alien.dmi' gender = FEMALE //All xenos are girls!! diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index e5c5731dc033..99766b5bd065 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -1,9 +1,9 @@ /mob/living/carbon/alien/get_eye_protection() - return ..() + 2 //potential cyber implants + natural eye protection + return ..() + FLASH_PROTECTION_WELDER //potential cyber implants + natural eye protection -/mob/living/carbon/alien/get_ear_protection() - return 2 //no ears +/mob/living/carbon/alien/get_ear_protection(ignore_deafness = FALSE) + return ..() + EAR_PROTECTION_HEAVY //no ears /mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) ..(AM, skipcatch = TRUE, hitpush = FALSE) @@ -31,7 +31,7 @@ In all, this is a lot like the monkey code. /N visible_message(span_danger("[user.name] bites [src]!"), \ span_userdanger("[user.name] bites you!"), span_hear("You hear a chomp!"), COMBAT_MESSAGE_RANGE, user) to_chat(user, span_danger("You bite [src]!")) - adjustBruteLoss(1) + adjust_brute_loss(1) log_combat(user, src, "attacked") else to_chat(user, span_warning("[name] is too injured for that.")) @@ -71,29 +71,22 @@ In all, this is a lot like the monkey code. /N if(!. || QDELETED(src)) return FALSE - var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) switch (severity) if (EXPLODE_DEVASTATE) gib(DROP_ALL_REMAINS) if (EXPLODE_HEAVY) take_overall_damage(60, 60) - if(ears) - ears.adjustEarDamage(30,120) + sound_damage(30, 240 SECONDS) if(EXPLODE_LIGHT) take_overall_damage(30,0) if(prob(50)) Unconscious(20) - if(ears) - ears.adjustEarDamage(15,60) + sound_damage(15, 120 SECONDS) return TRUE - -/mob/living/carbon/alien/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15) - return 0 - /mob/living/carbon/alien/acid_act(acidpwr, acid_volume) return FALSE//aliens are immune to acid. diff --git a/code/modules/mob/living/carbon/alien/damage_procs.dm b/code/modules/mob/living/carbon/alien/damage_procs.dm index 5dbffda96739..62d2b094694c 100644 --- a/code/modules/mob/living/carbon/alien/damage_procs.dm +++ b/code/modules/mob/living/carbon/alien/damage_procs.dm @@ -1,15 +1,15 @@ ///alien immune to tox damage -/mob/living/carbon/alien/getToxLoss() +/mob/living/carbon/alien/get_tox_loss() return FALSE ///alien immune to tox damage -/mob/living/carbon/alien/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) +/mob/living/carbon/alien/adjust_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype) return FALSE ///aliens are immune to stamina damage. -/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_stamina = 1, forced = FALSE, required_biotype) +/mob/living/carbon/alien/adjust_stamina_loss(amount, updating_stamina = 1, forced = FALSE, required_biotype) return FALSE ///aliens are immune to stamina damage. -/mob/living/carbon/alien/setStaminaLoss(amount, updating_stamina = 1, forced = FALSE, required_biotype) +/mob/living/carbon/alien/set_stamina_loss(amount, updating_stamina = 1, forced = FALSE, required_biotype) return FALSE diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 537c0cd000c4..69b8dd316aca 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -13,7 +13,7 @@ return 0 if(health <= HEALTH_THRESHOLD_CRIT) - adjustOxyLoss(2) + adjust_oxy_loss(2) var/plasma_used = 0 var/plas_detect_threshold = 0.02 diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 6d14ecefc911..1666209e5733 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -62,9 +62,9 @@ if(!isalien(owner)) heal_amt *= 0.2 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.adjust_brute_loss(-heal_amt * delta_time_capped) + owner.adjust_fire_loss(-heal_amt * delta_time_capped) + owner.adjust_oxy_loss(-heal_amt * delta_time_capped) else owner.adjustPlasma(0.1 * plasma_rate * delta_time) 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 52e98fcf4fe3..189e83593ad0 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -52,10 +52,10 @@ if(SPT_PROB(2, seconds_per_tick)) to_chat(owner, span_danger("Your stomach hurts.")) if(prob(20)) - owner.adjustToxLoss(1) + owner.adjust_tox_loss(1) if(6) to_chat(owner, span_danger("You feel something tearing its way out of your chest...")) - owner.adjustToxLoss(5 * seconds_per_tick) // Why is this [TOX]? + owner.adjust_tox_loss(5 * seconds_per_tick) // Why is this [TOX]? /// Controls Xenomorph Embryo growth. If embryo is fully grown (or overgrown), stop the proc. If not, increase the stage by one and if it's not fully grown (stage 6), add a timer to do this proc again after however long the growth time variable is. /obj/item/organ/body_egg/alien_embryo/proc/advance_embryo_stage() @@ -77,14 +77,8 @@ /obj/item/organ/body_egg/alien_embryo/egg_process() if(stage == 6 && prob(50)) - for(var/datum/surgery/operations as anything in owner.surgeries) - if(operations.location != BODY_ZONE_CHEST) - continue - if(!ispath(operations.steps[operations.status], /datum/surgery_step/manipulate_organs/internal)) - continue - attempt_grow(gib_on_success = FALSE) - return - attempt_grow() + // If we are mid surgery we won't gib the mob, isn't that neat? + attempt_grow(gib_on_success = !LIMB_HAS_SURGERY_STATE(bodypart_owner, SURGERY_SKIN_OPEN|SURGERY_BONE_SAWED)) /// Attempt to burst an alien outside of the host, getting a ghost to play as the xeno. /obj/item/organ/body_egg/alien_embryo/proc/attempt_grow(gib_on_success = TRUE) @@ -143,7 +137,7 @@ 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) - owner.adjustBruteLoss(40) + owner.adjust_brute_loss(40) owner.cut_overlay(overlay) qdel(src) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index a028679c9962..4e4a616a0053 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -24,6 +24,7 @@ layer = MOB_LAYER max_integrity = 100 slowdown = 2 + clothing_traits = list(TRAIT_SOFTSPOKEN) var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case var/sterile = FALSE @@ -188,7 +189,9 @@ if(!sterile) victim.take_bodypart_damage(strength,0) //done here so that humans in helmets take damage if(real && !sterile) - victim.Knockdown(5 SECONDS) + victim.Paralyze(1 SECONDS) + victim.adjust_confusion(20 SECONDS) + victim.Knockdown(10 SECONDS) GoIdle() //so it doesn't jump the people that tear it off addtimer(CALLBACK(src, PROC_REF(Impregnate), victim), rand(MIN_IMPREGNATION_TIME, MAX_IMPREGNATION_TIME)) @@ -257,13 +260,12 @@ // chest maybe because getting slammed in the chest would knock it off your face while dead AddComponent(/datum/component/knockoff, knockoff_chance = 40, target_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST), slots_knockoffable = slot_flags) -/obj/item/clothing/mask/facehugger/allow_attack_hand_drop(mob/living/carbon/human/user) - if(!real || sterile || user.get_organ_by_type(/obj/item/organ/body_egg/alien_embryo)) +/obj/item/clothing/mask/facehugger/can_mob_unequip(mob/user) + if(!real || sterile || stat == DEAD || user.get_organ_by_type(/obj/item/organ/body_egg/alien_embryo)) return ..() - if(istype(user) && ishuman(loc) && stat != DEAD) - if(user == loc && user.get_item_by_slot(slot_flags) == src) - to_chat(user, span_userdanger("[src] is latched on too tight! Get help or wait for it to let go!")) - return FALSE + if(user.get_item_by_slot(slot_flags) == src) + to_chat(user, span_userdanger("[src] is latched on too tight! Get help or wait for it to let go!")) + return FALSE return ..() /obj/item/clothing/mask/facehugger/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index fc44da54a565..128d8f5876be 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -30,16 +30,6 @@ QDEL_NULL(breathing_loop) GLOB.carbon_list -= src -/mob/living/carbon/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - . = ..() - if(. & ITEM_INTERACT_ANY_BLOCKER) - return . - // Needs to happen after parent call otherwise wounds are prioritized over surgery - for(var/datum/wound/wound as anything in shuffle(all_wounds)) - if(wound.try_treating(tool, user)) - return ITEM_INTERACT_SUCCESS - return . - /mob/living/carbon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() var/hurt = TRUE @@ -362,14 +352,14 @@ var/turf/location = get_turf(src) if(!blood) adjust_nutrition(-lost_nutrition) - need_mob_update += adjustToxLoss(-3, updating_health = FALSE) + need_mob_update += adjust_tox_loss(-3, updating_health = FALSE) for(var/i = 0 to distance) if(blood) if(location) add_splatter_floor(location) if(vomit_flags & MOB_VOMIT_HARM) - need_mob_update += adjustBruteLoss(3, updating_health = FALSE) + need_mob_update += adjust_brute_loss(3, updating_health = FALSE) else 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. @@ -443,7 +433,7 @@ total_brute += (BP.brute_dam * BP.body_damage_coeff) total_burn += (BP.burn_dam * BP.body_damage_coeff) total_aggravated += (BP.aggravated_dam * BP.body_damage_coeff) // DARKPACK EDIT ADD - AGGRAVATED_DAMAGE - set_health(round(maxHealth - getOxyLoss() - getToxLoss() - total_burn - total_brute - total_aggravated, DAMAGE_PRECISION)) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE + set_health(round(maxHealth - get_oxy_loss() - get_tox_loss() - total_burn - total_brute - total_aggravated, DAMAGE_PRECISION)) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE update_stat() update_stamina() @@ -469,7 +459,7 @@ set_sight(initial(sight)) else set_sight(SEE_TURFS|SEE_MOBS|SEE_OBJS) - set_invis_see(SEE_INVISIBLE_OBSERVER) + set_invis_see(OBSERVER_SIGHT) // DARKPACK EDIT, Original : set_invis_see(SEE_INVISIBLE_OBSERVER) return var/new_sight = initial(sight) @@ -522,6 +512,11 @@ if(SSmapping.level_trait(z, ZTRAIT_NOXRAY)) new_sight = NONE + // DARKPACK EDIT ADD - Necromancy + if(HAS_TRAIT(src, TRAIT_GHOST_VISION)) + see_invisible = SEE_INVISIBLE_OBSERVER + // DARKPACK EDIT END - Necromancy + set_sight(new_sight) return ..() @@ -532,7 +527,7 @@ */ /mob/living/carbon/proc/update_tint() var/tint = 0 - for(var/obj/item/clothing/worn_item in get_equipped_items()) + for(var/obj/item/clothing/worn_item in get_equipped_items(INCLUDE_ABSTRACT)) tint += worn_item.tint var/obj/item/organ/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES) @@ -624,8 +619,8 @@ else clear_fullscreen("oxy") - //Fire and Brute and Aggravated damage overlay (BSSR) - var/hurtdamage = getBruteLoss() + getFireLoss() + getAggLoss() + damageoverlaytemp // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE + //Fire and Brute damage overlay (BSSR) + var/hurtdamage = get_brute_loss() + get_fire_loss() + get_agg_loss() + damageoverlaytemp // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE if(hurtdamage && !HAS_TRAIT(src, TRAIT_NO_DAMAGE_OVERLAY)) var/severity = 0 switch(hurtdamage) @@ -680,34 +675,6 @@ else hud_used.healths.icon_state = "health6" -/mob/living/carbon/update_stamina_hud(shown_stamina_loss) - if(!client || !hud_used?.stamina) - return - - var/stam_crit_threshold = maxHealth - crit_threshold - - if(stat == DEAD) - hud_used.stamina.icon_state = "stamina_dead" - else - - if(shown_stamina_loss == null) - shown_stamina_loss = getStaminaLoss() - - if(shown_stamina_loss >= stam_crit_threshold) - hud_used.stamina.icon_state = "stamina_crit" - else if(shown_stamina_loss > maxHealth*0.8) - hud_used.stamina.icon_state = "stamina_5" - else if(shown_stamina_loss > maxHealth*0.6) - hud_used.stamina.icon_state = "stamina_4" - else if(shown_stamina_loss > maxHealth*0.4) - hud_used.stamina.icon_state = "stamina_3" - else if(shown_stamina_loss > maxHealth*0.2) - hud_used.stamina.icon_state = "stamina_2" - else if(shown_stamina_loss > 0) - hud_used.stamina.icon_state = "stamina_1" - else - hud_used.stamina.icon_state = "stamina_full" - /mob/living/carbon/proc/update_spacesuit_hud_icon(cell_state = "empty") hud_used?.spacesuit?.icon_state = "spacesuit_[cell_state]" @@ -771,8 +738,7 @@ /mob/living/carbon/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) if(excess_healing) - if(dna && !HAS_TRAIT(src, TRAIT_NOBLOOD)) - blood_volume += (excess_healing * 2) //1 excess = 10 blood + adjust_blood_volume(excess_healing * 2) for(var/obj/item/organ/target_organ as anything in organs) if(!target_organ.damage) @@ -818,6 +784,8 @@ if(heal_flags & HEAL_LIMBS) regenerate_limbs() + for(var/obj/item/bodypart/limb as anything in bodyparts) + limb.remove_surgical_state(ALL) if(heal_flags & (HEAL_REFRESH_ORGANS|HEAL_ORGANS)) regenerate_organs(remove_hazardous = !!(heal_flags & HEAL_REFRESH_ORGANS)) @@ -840,7 +808,9 @@ return ..() /mob/living/carbon/can_be_revived() - if(!get_organ_by_type(/obj/item/organ/brain) && (!IS_CHANGELING(src)) || HAS_TRAIT(src, TRAIT_HUSK)) + if(HAS_TRAIT(src, TRAIT_HUSK)) + return FALSE + if(!HAS_TRAIT(src, TRAIT_BRAINLESS_CARBON) && !get_organ_by_type(/obj/item/organ/brain)) return FALSE return ..() @@ -851,37 +821,55 @@ if (HAS_TRAIT(src, TRAIT_HUSK)) return DEFIB_FAIL_HUSK + if (IS_FAKE_KEY(key)) + return DEFIB_NOGRAB_AGHOST + if (HAS_TRAIT(src, TRAIT_DEFIB_BLACKLISTED)) return DEFIB_FAIL_BLACKLISTED - if ((getBruteLoss() >= MAX_REVIVE_BRUTE_DAMAGE) || (getFireLoss() >= MAX_REVIVE_FIRE_DAMAGE) || (getAggLoss() >= MAX_REVIVE_AGGRAVATED_DAMAGE)) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE + if ((get_brute_loss() >= MAX_REVIVE_BRUTE_DAMAGE) || (get_fire_loss() >= MAX_REVIVE_FIRE_DAMAGE) || (get_agg_loss() >= MAX_REVIVE_AGGRAVATED_DAMAGE)) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE return DEFIB_FAIL_TISSUE_DAMAGE - // Only check for a heart if they actually need a heart. Who would've thunk - if (needs_heart()) - var/obj/item/organ/heart = get_organ_by_type(/obj/item/organ/heart) + var/heart_status = SEND_SIGNAL(src, COMSIG_CARBON_DEFIB_HEART_CHECK) || can_defib_heart(get_organ_by_type(/obj/item/organ/heart)) + if (heart_status) + return heart_status + + var/brain_status = SEND_SIGNAL(src, COMSIG_CARBON_DEFIB_BRAIN_CHECK) || can_defib_brain(get_organ_by_type(/obj/item/organ/brain)) + if (brain_status) + return brain_status + + // DARKPACK EDIT START + if (HAS_TRAIT(src, TRAIT_STAKED)) + return DEFIB_FAIL_STAKED + // DARKPACK EDIT END - if (!heart) - return DEFIB_FAIL_NO_HEART + return DEFIB_POSSIBLE + +/// Return a defib status based on the heart organ provided +/mob/living/carbon/proc/can_defib_heart(obj/item/organ/heart/heart_organ) + if (!needs_heart()) + return NONE + + if (QDELETED(heart_organ)) + return DEFIB_FAIL_NO_HEART - if (heart.organ_flags & ORGAN_FAILING) - return DEFIB_FAIL_FAILING_HEART + if (heart_organ.organ_flags & ORGAN_FAILING) + return DEFIB_FAIL_FAILING_HEART - var/obj/item/organ/brain/current_brain = get_organ_by_type(/obj/item/organ/brain) + return NONE - if (QDELETED(current_brain)) +/// Return a defib status based on the brain organ provided +/mob/living/carbon/proc/can_defib_brain(obj/item/organ/brain/brain_organ) + if (QDELETED(brain_organ)) return DEFIB_FAIL_NO_BRAIN - if (current_brain.organ_flags & ORGAN_FAILING) + if (brain_organ.organ_flags & ORGAN_FAILING) return DEFIB_FAIL_FAILING_BRAIN - if (current_brain.suicided || (current_brain.brainmob && HAS_TRAIT(current_brain.brainmob, TRAIT_SUICIDED))) + if (brain_organ.suicided || (brain_organ.brainmob && HAS_TRAIT(brain_organ.brainmob, TRAIT_SUICIDED))) return DEFIB_FAIL_NO_INTELLIGENCE - if(IS_FAKE_KEY(key)) - return DEFIB_NOGRAB_AGHOST - - return DEFIB_POSSIBLE + return NONE /mob/living/carbon/proc/can_defib_client() return (client || get_ghost(FALSE, TRUE)) && (can_defib() & DEFIB_REVIVABLE_STATES) @@ -949,6 +937,7 @@ synchronize_bodytypes() synchronize_bodyshapes() + ///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, special) SHOULD_NOT_OVERRIDE(TRUE) @@ -1045,7 +1034,7 @@ if("replace") var/limb2add = input(usr, "Select a bodypart type to add", "Add/Replace Bodypart") as null|anything in sort_list(limbtypes) var/obj/item/bodypart/new_bp = new limb2add() - if(new_bp.replace_limb(src, special = TRUE)) + if(new_bp.replace_limb(src)) admin_ticket_log("key_name_admin(usr)] has replaced [src]'s [part.type] with [new_bp.type]") qdel(part) else @@ -1103,18 +1092,6 @@ /mob/living/carbon/can_resist() return bodyparts.len > 2 && ..() -/mob/living/carbon/proc/hypnosis_vulnerable() - if(HAS_MIND_TRAIT(src, TRAIT_UNCONVERTABLE)) - return FALSE - if(has_status_effect(/datum/status_effect/hallucination) || has_status_effect(/datum/status_effect/drugginess)) - return TRUE - if(IsSleeping() || IsUnconscious()) - return TRUE - if(HAS_TRAIT(src, TRAIT_DUMB)) - return TRUE - if(mob_mood.sanity < SANITY_UNSTABLE) - return TRUE - /mob/living/carbon/wash(clean_types) . = ..() // Wash equipped stuff that cannot be covered @@ -1134,12 +1111,17 @@ /// if any of our bodyparts are bleeding /mob/living/carbon/proc/is_bleeding() + if(!CAN_HAVE_BLOOD(src)) + return FALSE for(var/obj/item/bodypart/part as anything in bodyparts) if(part.cached_bleed_rate) return TRUE /// get our total bleedrate /mob/living/carbon/proc/get_total_bleed_rate() + if(!CAN_HAVE_BLOOD(src)) + return FALSE + var/total_bleed_rate = 0 for(var/obj/item/bodypart/part as anything in bodyparts) total_bleed_rate += part.cached_bleed_rate @@ -1373,4 +1355,6 @@ /mob/living/carbon/get_bloodtype() RETURN_TYPE(/datum/blood_type) + if(!CAN_HAVE_BLOOD(src)) + return return dna?.blood_type diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 8315e470f7b4..0b056a826ec0 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -10,21 +10,29 @@ else return INFINITY //Can't get flashed without eyes if(isclothing(head)) //Adds head protection - . += head.flash_protect + var/obj/item/clothing/helmet = head + . += helmet.flash_protect if(isclothing(glasses)) //Glasses . += glasses.flash_protect if(isclothing(wear_mask)) //Mask . += wear_mask.flash_protect -/mob/living/carbon/get_ear_protection() - . = ..() - if(HAS_TRAIT(src, TRAIT_DEAF)) - return INFINITY //For all my homies that can not hear in the world - var/obj/item/organ/ears/E = get_organ_slot(ORGAN_SLOT_EARS) - if(!E) +/mob/living/carbon/sound_damage(damage, deafen) + if(HAS_TRAIT(src, TRAIT_GODMODE)) + return + var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) + if(QDELETED(ears)) + return + if(damage) + ears.apply_organ_damage(damage * ears.damage_multiplier) + if(deafen) + ears.adjust_temporary_deafness(deafen) + +/mob/living/carbon/get_ear_protection(ignore_deafness = FALSE) + var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) + if(!ears) return INFINITY - else - . += E.bang_protect + return ..() + ears.bang_protect /mob/living/carbon/is_mouth_covered(check_flags = ALL) if((check_flags & ITEM_SLOT_HEAD) && head && (head.flags_cover & HEADCOVERSMOUTH)) @@ -56,7 +64,7 @@ return null /mob/living/carbon/is_ears_covered() - for(var/obj/item/worn_thing as anything in get_equipped_items()) + for(var/obj/item/worn_thing as anything in get_equipped_items(INCLUDE_ABSTRACT)) if(worn_thing.flags_cover & EARS_COVERED) return worn_thing @@ -85,6 +93,12 @@ return ..() /mob/living/carbon/send_item_attack_message(obj/item/weapon, mob/living/user, hit_area, def_zone) + // In the future replace these with parent call if the item attack message proc is ever unshittified + if(SEND_SIGNAL(weapon, COMSIG_SEND_ITEM_ATTACK_MESSAGE_OBJECT, src, user) & SIGNAL_MESSAGE_MODIFIED) + return TRUE + if(SEND_SIGNAL(src, COMSIG_SEND_ITEM_ATTACK_MESSAGE_CARBON, weapon, user) & SIGNAL_MESSAGE_MODIFIED) + return TRUE + if(!weapon.force && !length(weapon.attack_verb_simple) && !length(weapon.attack_verb_continuous)) return var/obj/item/bodypart/hit_bodypart = get_bodypart(def_zone) @@ -240,7 +254,7 @@ return else show_message(span_userdanger("The blob attacks!")) - adjustBruteLoss(10) + adjust_brute_loss(10) ///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, jitter_time = 20 SECONDS, stutter_time = 4 SECONDS, stun_duration = 4 SECONDS) @@ -500,38 +514,6 @@ else if(damage == 0 && prob(20)) // just enough protection to_chat(src, span_notice("Something bright flashes in the corner of your vision!")) - -/mob/living/carbon/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15) - var/list/reflist = list(intensity) // Need to wrap this in a list so we can pass a reference - SEND_SIGNAL(src, COMSIG_CARBON_SOUNDBANG, reflist) - intensity = reflist[1] - var/ear_safety = get_ear_protection() - var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) - var/effect_amount = intensity - ear_safety - if(effect_amount <= 0) - return FALSE - - if(stun_pwr) - Paralyze((stun_pwr*effect_amount)*0.1) - Knockdown(stun_pwr*effect_amount) - - if(ears && (deafen_pwr || damage_pwr)) - var/ear_damage = damage_pwr * effect_amount - var/deaf = deafen_pwr * effect_amount - ears.adjustEarDamage(ear_damage,deaf) - - . = effect_amount //how soundbanged we are - SEND_SOUND(src, sound('sound/items/weapons/flash_ring.ogg',0,1,0,250)) - - if(ears.damage < 5) - return - if(ears.damage >= 15 && prob(ears.damage - 5)) - to_chat(src, span_userdanger("You can't hear anything!")) - // Makes you deaf, enough that you need a proper source of healing, it won't self heal - // you need earmuffs, inacusiate, or replacement - ears.set_organ_damage(ears.maxHealth) - to_chat(src, span_warning("Your ears start to ring[ears.damage >= 15 ? " badly!":"!"]")) - /mob/living/carbon/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone) if(damage_type != BRUTE && damage_type != BURN) return @@ -556,7 +538,7 @@ . = FALSE -/mob/living/carbon/adjustOxyLoss(amount, updating_health = TRUE, forced, required_biotype, required_respiration_type) +/mob/living/carbon/adjust_oxy_loss(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 @@ -568,7 +550,7 @@ if(!limb) return -/mob/living/carbon/setOxyLoss(amount, updating_health = TRUE, forced, required_biotype, required_respiration_type) +/mob/living/carbon/set_oxy_loss(amount, updating_health = TRUE, forced, required_biotype, required_respiration_type) . = ..() check_passout() @@ -576,8 +558,8 @@ * Check to see if we should be passed out from oxyloss */ /mob/living/carbon/proc/check_passout() - var/mob_oxyloss = getOxyLoss() - if(mob_oxyloss >= OXYLOSS_PASSOUT_THRESHOLD) + var/mob_oxyloss = get_oxy_loss() + if(mob_oxyloss >= OXYLOSS_PASSOUT_THRESHOLD && !HAS_TRAIT(src, TRAIT_NO_OXYLOSS_PASSOUT)) if(!HAS_TRAIT_FROM(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT)) ADD_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) else if(mob_oxyloss < OXYLOSS_PASSOUT_THRESHOLD) @@ -701,14 +683,15 @@ new_organ.replace_into(src) new_organ.organ_flags |= ORGAN_MUTANT - var/obj/item/bodypart/new_part = pick(GLOB.bioscrambler_valid_parts) - var/obj/item/bodypart/picked_user_part = get_bodypart(initial(new_part.body_zone)) - if (picked_user_part && BODYTYPE_CAN_BE_BIOSCRAMBLED(picked_user_part.bodytype)) - changed_something = TRUE - new_part = new new_part() - new_part.replace_limb(src, special = TRUE) - if (picked_user_part) - qdel(picked_user_part) + if (!HAS_TRAIT(src, TRAIT_NODISMEMBER)) + var/obj/item/bodypart/new_part = pick(GLOB.bioscrambler_valid_parts) + var/obj/item/bodypart/picked_user_part = get_bodypart(initial(new_part.body_zone)) + if (picked_user_part && BODYTYPE_CAN_BE_BIOSCRAMBLED(picked_user_part.bodytype)) + changed_something = TRUE + new_part = new new_part() + new_part.replace_limb(src) + if (picked_user_part) + qdel(picked_user_part) if (!changed_something) to_chat(src, span_notice("Your augmented body protects you from [scramble_source]!")) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 90896042dbea..3038c9b76fb1 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -1,6 +1,6 @@ /mob/living/carbon abstract_type = /mob/living/carbon - blood_volume = BLOOD_VOLUME_NORMAL + default_blood_volume = BLOOD_VOLUME_NORMAL gender = MALE pressure_resistance = 15 hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD) @@ -38,7 +38,7 @@ var/obj/item/tank/internal = null /// "External" air tank. Never set this manually. Not required to stay directly equipped on the mob (i.e. could be a machine or MOD suit module). var/obj/item/tank/external = null - var/obj/item/clothing/head = null + var/obj/item/head = null ///only used by humans var/obj/item/clothing/gloves = null @@ -49,7 +49,7 @@ ///only used by humans. var/obj/item/clothing/ears = null - /// Carbon, you should really only be accessing this through has_dna() but it's your life + /// DNA is carbon-only, and ideally you should be accessing it through has_dna(), but you can access it directly if you know you're working with a carbon mob var/datum/dna/dna = null ///last mind to control this mob, for blood-based cloning var/datum/mind/last_mind = null diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 83b53e64cf9b..afdd1741d559 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -1,10 +1,12 @@ /mob/living/carbon/slip(knockdown_amount, obj/slipped_on, lube_flags, paralyze, daze, force_drop = FALSE) if(movement_type & MOVETYPES_NOT_TOUCHING_GROUND) return FALSE + if(!(loc.handle_slip(src, knockdown_amount, slipped_on, lube_flags, paralyze, daze, force_drop))) + return FALSE if(!(lube_flags & SLIDE_ICE)) log_combat(src, (slipped_on || get_turf(src)), "slipped on the", null, ((lube_flags & SLIDE) ? "(SLIDING)" : null)) ..() - return loc.handle_slip(src, knockdown_amount, slipped_on, lube_flags, paralyze, daze, force_drop) + return TRUE /mob/living/carbon/Move(NewLoc, direct) . = ..() diff --git a/code/modules/mob/living/carbon/carbon_stripping.dm b/code/modules/mob/living/carbon/carbon_stripping.dm index 054444c48153..66f2b8b6b998 100644 --- a/code/modules/mob/living/carbon/carbon_stripping.dm +++ b/code/modules/mob/living/carbon/carbon_stripping.dm @@ -6,14 +6,15 @@ key = STRIPPABLE_ITEM_BACK item_slot = ITEM_SLOT_BACK -/datum/strippable_item/mob_item_slot/back/get_alternate_actions(atom/source, mob/user) - return get_strippable_alternate_action_internals(get_item(source), source) +/datum/strippable_item/mob_item_slot/back/get_alternate_actions(atom/source, mob/user, obj/item/item) + . = ..() + . += get_strippable_alternate_action_internals(item, source) -/datum/strippable_item/mob_item_slot/back/perform_alternate_action(atom/source, mob/user, action_key) +/datum/strippable_item/mob_item_slot/back/perform_alternate_action(atom/source, mob/user, action_key, obj/item/item) if(!..()) return - if(action_key in get_strippable_alternate_action_internals(get_item(source), source)) - strippable_alternate_action_internals(get_item(source), source, user) + if(action_key in get_strippable_alternate_action_internals(item, source)) + strippable_alternate_action_internals(item, source, user) /datum/strippable_item/mob_item_slot/mask key = STRIPPABLE_ITEM_MASK diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index 78f5d38205b6..cf17720ee6ee 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -20,7 +20,7 @@ if(OFFSET_HEAD) update_worn_head() if(OFFSET_FACE) - dna?.species?.update_face_offset(src) // updates eye and lipstick icon + update_face_offset() // updates eye and lipstick icon update_worn_mask() if(OFFSET_BELT) update_worn_belt() @@ -49,7 +49,6 @@ SEND_SIGNAL(src, COMSIG_CARBON_REMOVE_OVERLAY, cache_index, I) /mob/living/carbon/update_body(is_creating = FALSE) - dna?.species.handle_body(src) update_body_parts(is_creating) /mob/living/carbon/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) @@ -504,6 +503,9 @@ apply_overlay(BODYPARTS_LAYER) +/mob/living/carbon/proc/update_face_offset() + return + ///////////////////////// // Limb Icon Cache 2.0 // ///////////////////////// @@ -562,9 +564,10 @@ . += "-[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]]" + var/facial_hair_gradient_style = get_hair_gradient_style(GRADIENT_FACIAL_HAIR_KEY) + if(facial_hair_gradient_style) + . += "-[facial_hair_gradient_style]" + . += "-[get_hair_gradient_color(GRADIENT_FACIAL_HAIR_KEY)]" if(show_eyeless) . += "-SHOW_EYELESS" @@ -578,9 +581,10 @@ . += "-[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]]" + var/hair_gradient_style = get_hair_gradient_style(GRADIENT_HAIR_KEY) + if(hair_gradient_style) + . += "-[hair_gradient_style]" + . += "-[get_hair_gradient_color(GRADIENT_HAIR_KEY)]" if(LAZYLEN(hair_masks)) . += "-[jointext(hair_masks, "-")]" diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index b82300c38813..5ac4dd588c74 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -86,13 +86,13 @@ return final_mod //These procs fetch a cumulative total damage from all bodyparts -/mob/living/carbon/getBruteLoss() +/mob/living/carbon/get_brute_loss() var/amount = 0 for(var/obj/item/bodypart/bodypart as anything in bodyparts) amount += bodypart.brute_dam return round(amount, DAMAGE_PRECISION) -/mob/living/carbon/getFireLoss() +/mob/living/carbon/get_fire_loss() var/amount = 0 for(var/obj/item/bodypart/bodypart as anything in bodyparts) amount += bodypart.burn_dam @@ -106,7 +106,7 @@ * Arguments: * * required_bodytype - The bodytype(s) to match against. */ -/mob/living/carbon/proc/getBruteLossForType(required_bodytype = ALL) +/mob/living/carbon/proc/get_brute_loss_for_type(required_bodytype = ALL) var/amount = 0 for(var/obj/item/bodypart/bodypart as anything in bodyparts) if(!(bodypart.bodytype & required_bodytype)) @@ -121,7 +121,7 @@ * Arguments: * * required_bodytype - The bodytype(s) to match against. */ -/mob/living/carbon/proc/getFireLossForType(required_bodytype = ALL) +/mob/living/carbon/proc/get_fire_loss_for_type(required_bodytype = ALL) var/amount = 0 for(var/obj/item/bodypart/bodypart as anything in bodyparts) if(!(bodypart.bodytype & required_bodytype)) @@ -129,7 +129,7 @@ amount += bodypart.burn_dam return round(amount, DAMAGE_PRECISION) -/mob/living/carbon/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/carbon/adjust_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!can_adjust_brute_loss(amount, forced, required_bodytype)) return 0 if(amount > 0) @@ -137,16 +137,16 @@ else . = 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) +/mob/living/carbon/set_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) return FALSE - var/current = getBruteLoss() + var/current = get_brute_loss() var/diff = amount - current if(!diff) return FALSE - return adjustBruteLoss(diff, updating_health, forced, required_bodytype) + return adjust_brute_loss(diff, updating_health, forced, required_bodytype) -/mob/living/carbon/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/carbon/adjust_fire_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!can_adjust_fire_loss(amount, forced, required_bodytype)) return 0 if(amount > 0) @@ -154,16 +154,16 @@ else . = 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) +/mob/living/carbon/set_fire_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) return FALSE - var/current = getFireLoss() + var/current = get_fire_loss() var/diff = amount - current if(!diff) return FALSE - return adjustFireLoss(diff, updating_health, forced, required_bodytype) + return adjust_fire_loss(diff, updating_health, forced, required_bodytype) -/mob/living/carbon/human/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) +/mob/living/carbon/human/adjust_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) . = ..() if(. >= 0) // 0 = no damage, + values = healed damage return . @@ -171,7 +171,7 @@ if(AT_TOXIN_VOMIT_THRESHOLD(src)) apply_status_effect(/datum/status_effect/tox_vomit) -/mob/living/carbon/human/setToxLoss(amount, updating_health, forced, required_biotype) +/mob/living/carbon/human/set_tox_loss(amount, updating_health, forced, required_biotype) . = ..() if(. >= 0) return . @@ -195,7 +195,7 @@ * * Returns: The net change in damage from apply_organ_damage() */ -/mob/living/carbon/adjustOrganLoss(slot, amount, maximum, required_organ_flag = NONE) +/mob/living/carbon/adjust_organ_loss(slot, amount, maximum, required_organ_flag = NONE) var/obj/item/organ/affected_organ = get_organ_slot(slot) if(!affected_organ || HAS_TRAIT(src, TRAIT_GODMODE)) return FALSE @@ -205,7 +205,7 @@ /** * If an organ exists in the slot requested, and we are capable of taking damage (we don't have TRAIT_GODMODE), call the set damage proc on that organ, which can - * set or clear the failing variable on that organ, making it either cease or start functions again, unlike adjustOrganLoss. + * set or clear the failing variable on that organ, making it either cease or start functions again, unlike adjust_organ_loss. * * Arguments: * * slot - organ slot, like [ORGAN_SLOT_HEART] @@ -214,7 +214,7 @@ * * Returns: The net change in damage from set_organ_damage() */ -/mob/living/carbon/setOrganLoss(slot, amount, required_organ_flag = NONE) +/mob/living/carbon/set_organ_loss(slot, amount, required_organ_flag = NONE) var/obj/item/organ/affected_organ = get_organ_slot(slot) if(!affected_organ || HAS_TRAIT(src, TRAIT_GODMODE)) return FALSE diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index 5cda9b845dd4..77611210d8ca 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -4,8 +4,6 @@ losebreath = 0 breathing_loop.stop() //This would've happened eventually but it's nice to make it stop immediatelly in this case - if(!gibbed) - add_memory_in_range(src, 7, /datum/memory/witnessed_death, protagonist = src) reagents.end_metabolization(src) . = ..() @@ -18,7 +16,6 @@ BT.on_death() /mob/living/carbon/gib(drop_bitflags=NONE) - add_memory_in_range(src, 7, /datum/memory/witness_gib, protagonist = src) if(drop_bitflags & DROP_ITEMS) for(var/obj/item/W in src) if(dropItemToGround(W)) diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index d6101086fed3..b226427dfb55 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -100,6 +100,19 @@ return FALSE return ..() +/datum/emote/living/carbon/mchitter + key = "chitter" + key_third_person = "chitters" + message = "chitters!" + message_mime = "chitters silently?" + sound = 'sound/mobs/humanoids/moth/moth_chitter.ogg' + emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE + +/datum/emote/living/carbon/mchitter/can_run_emote(mob/living/carbon/user, status_check, intentional, params) + if(!ismoth(user)) + return FALSE + return ..() + /datum/emote/living/carbon/moan key = "moan" key_third_person = "moans" @@ -107,6 +120,19 @@ message_mime = "appears to moan!" emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE +/datum/emote/living/carbon/msqueak + key = "squeak" + key_third_person = "squeaks" + message = "squeaks!" + message_mime = "squeaks silently?" + sound = 'sound/mobs/humanoids/moth/moth_squeak.ogg' + emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE + +/datum/emote/living/carbon/msqueak/can_run_emote(mob/living/carbon/user, status_check, intentional, params) + if(!ismoth(user)) + return FALSE + return ..() + /datum/emote/living/carbon/noogie key = "noogie" key_third_person = "noogies" diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 5c8ba631dbd0..10c45dbdc39b 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -70,6 +70,11 @@ for(var/datum/wound/iter_wound as anything in body_part.wounds) . += span_danger(iter_wound.get_examine_description(user)) + var/surgery_examine = body_part.get_surgery_examine() + if(surgery_examine) + . += surgery_examine + + for(var/obj/item/bodypart/body_part as anything in disabled) var/damage_text if(HAS_TRAIT(body_part, TRAIT_DISABLED_BY_WOUND)) @@ -113,7 +118,7 @@ if(user == src && has_status_effect(/datum/status_effect/grouped/screwy_hud/fake_crit))//fake damage temp = 50 else - temp = getBruteLoss() + temp = get_brute_loss() var/list/damage_desc = get_majority_bodypart_damage_desc() if(temp) if(temp < 25) @@ -123,7 +128,7 @@ else . += span_bolddanger("[t_He] [t_has] severe [damage_desc[BRUTE]]!") - temp = getFireLoss() + temp = get_fire_loss() if(temp) if(temp < 25) . += span_danger("[t_He] [t_has] minor [damage_desc[BURN]].") @@ -133,7 +138,7 @@ . += span_bolddanger("[t_He] [t_has] severe [damage_desc[BURN]]!") // DARKPACK EDIT ADD START - AGGRAVATED_DAMAGE - temp = getAggLoss() + temp = get_agg_loss() if(temp) if(temp < 25) . += span_danger("[t_He] [t_has] minor [damage_desc[AGGRAVATED]].") @@ -161,11 +166,17 @@ if(DISGUST_LEVEL_DISGUSTED to INFINITY) . += "[t_He] look[p_s()] extremely disgusted." - var/apparent_blood_volume = blood_volume + var/apparent_blood_volume = CAN_HAVE_BLOOD(src) ? get_blood_volume(apply_modifiers = TRUE) : BLOOD_VOLUME_NORMAL if(HAS_TRAIT(src, TRAIT_USES_SKINTONES) && ishuman(src)) var/mob/living/carbon/human/husrc = src // gross istypesrc but easier than refactoring even further for now if(husrc.skin_tone == "albino") apparent_blood_volume -= (BLOOD_VOLUME_NORMAL * 0.25) // knocks you down a few pegs + if(HAS_TRAIT(user, TRAIT_COLD_AURA)) + apparent_blood_volume -= (BLOOD_VOLUME_NORMAL * 0.25) + if(HAS_TRAIT(user, TRAIT_WARM_AURA)) + apparent_blood_volume += (BLOOD_VOLUME_NORMAL * 0.25) + if(HAS_TRAIT(user, TRAIT_BLUSH_OF_HEALTH)) + apparent_blood_volume += (BLOOD_VOLUME_NORMAL * 0.50) switch(apparent_blood_volume) if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) . += span_warning("[t_He] [t_has] pale skin.") @@ -174,6 +185,8 @@ if(-INFINITY to BLOOD_VOLUME_BAD) . += span_deadsay("[t_He] resemble[p_s()] a crushed, empty juice pouch.") + . += display_darkpack_examine_text() // DARKPACK EDIT ADD + if(is_bleeding()) var/list/obj/item/bodypart/bleeding_limbs = list() var/list/obj/item/bodypart/grasped_limbs = list() @@ -216,39 +229,13 @@ if(reagents.has_reagent(/datum/reagent/teslium, needs_metabolizing = TRUE)) . += span_smallnoticeital("[t_He] [t_is] emitting a gentle blue glow!") // this should be signalized + var/mob/living/living_user = user + SEND_SIGNAL(living_user, COMSIG_CARBON_MID_EXAMINE, src, .) // Adds examine text after clothing and wounds but before death and scars if(just_sleeping) . += span_notice("[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.") - else if(!appears_dead) - var/mob/living/living_user = user if(src != user) - if(HAS_TRAIT(user, TRAIT_EMPATH)) - if (combat_mode) - . += "[t_He] seem[p_s()] to be on guard." - if (getOxyLoss() >= 10) - . += "[t_He] seem[p_s()] winded." - if (getToxLoss() >= 10) - . += "[t_He] seem[p_s()] sickly." - if(mob_mood.sanity <= SANITY_DISTURBED) - . += "[t_He] seem[p_s()] distressed." - living_user.add_mood_event("empath", /datum/mood_event/sad_empath, src) - if(is_blind()) - . += "[t_He] appear[p_s()] to be staring off into space." - if (HAS_TRAIT(src, TRAIT_DEAF)) - . += "[t_He] appear[p_s()] to not be responding to noises." - if (bodytemperature > dna.species.bodytemp_heat_damage_limit) - . += "[t_He] [t_is] flushed and wheezing." - if (bodytemperature < dna.species.bodytemp_cold_damage_limit) - . += "[t_He] [t_is] shivering." - if(HAS_TRAIT(src, TRAIT_EVIL)) - . += "[t_His] eyes radiate with a unfeeling, cold detachment. There is nothing but darkness within [t_his] soul." - if(living_user.mind?.holy_role >= HOLY_ROLE_PRIEST) - . += span_warning("PERFECT FOR SMITING!!") - else - living_user.add_mood_event("encountered_evil", /datum/mood_event/encountered_evil) - living_user.set_jitter_if_lower(15 SECONDS) - - if(HAS_TRAIT(user, TRAIT_SPIRITUAL) && mind?.holy_role) + if(HAS_TRAIT(user, TRAIT_SPIRITUAL) && mind?.holy_role && user != src) . += "[t_He] [t_has] a holy aura about [t_him]." living_user.add_mood_event("religious_comfort", /datum/mood_event/religiously_comforted) @@ -265,8 +252,10 @@ var/npc_message = "" if(HAS_TRAIT(brain, TRAIT_GHOSTROLE_ON_REVIVE)) npc_message = "Soul is pending..." + else if(isnpc(src)) // DARKPACK EDIT ADD START + npc_message = "[t_He] looks busy. Probably wise not to bother [t_him]." // DARKPACK EDIT ADD END else if(!key) - npc_message = "[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely." + npc_message = "[t_He] [t_is] totally catatonic. The horrors of this place must have been too much for [t_him]. Any recovery is unlikely." // DARKPACK EDIT CHANGE else if(!client) npc_message ="[t_He] [t_has] a blank, absent-minded stare and appears completely unresponsive to anything. [t_He] may snap out of it soon." if(npc_message) @@ -302,6 +291,16 @@ if(isliving(user) && HAS_MIND_TRAIT(user, TRAIT_EXAMINE_FITNESS)) . += compare_fitness(user) + // DARKPACK EDIT ADD START + if(ismundane(user)) + . += "Report a Masquerade violation or reinforcement" + + ADD_NEWLINE_IF_NECESSARY(.) + if(custom_examine_message) + . += span_purple(custom_examine_message) + . += flavor_text_creation() + // DARKPACK EDIT ADD END + var/hud_info = get_hud_examine_info(user) if(length(hud_info)) . += hud_info diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 5a2a155934e6..7115720a9e2d 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -135,7 +135,7 @@ GLOBAL_LIST_EMPTY(features_by_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. + /// The type of respiration the mob is capable of doing. Used by adjust_oxy_loss. var/inherent_respiration_type = RESPIRATION_OXYGEN ///List of factions the mob gain upon gaining this species. var/list/inherent_factions @@ -214,11 +214,21 @@ GLOBAL_LIST_EMPTY(features_by_species) var/datum/species/species = GLOB.species_prototypes[species_type] if(species.check_roundstart_eligible()) selectable_species += species.id + // DARKPACK EDIT CHANGE START - LANGUAGES + /* var/datum/language_holder/temp_holder = GLOB.prototype_language_holders[species.species_language_holder] for(var/datum/language/spoken_language as anything in temp_holder.understood_languages) GLOB.uncommon_roundstart_languages |= spoken_language + */ + // The changes here mean this can be moved to just a glob list init but that would mean even more non-modular edits. Will do if I can get demodularization. + GLOB.uncommon_roundstart_languages = list() + for(var/datum/language/lang as anything in subtypesof(/datum/language)) + if(lang.restricted) + continue + GLOB.uncommon_roundstart_languages |= lang GLOB.uncommon_roundstart_languages -= /datum/language/common + // DARKPACK EDIT CHANGE END if(!selectable_species.len) selectable_species += SPECIES_HUMAN @@ -354,8 +364,7 @@ GLOBAL_LIST_EMPTY(features_by_species) * 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 + blood_possessing_human.set_blood_volume(min(blood_possessing_human.get_blood_volume(), BLOOD_VOLUME_NORMAL)) /** * Proc called when a carbon becomes this species. @@ -485,84 +494,6 @@ GLOBAL_LIST_EMPTY(features_by_species) human.living_flags &= ~STOP_OVERLAY_UPDATE_BODY_PARTS -/** - * Handles the body of a human - * - * Handles lipstick, having no eyes, eye color, undergarnments like underwear, undershirts, and socks, and body layers. - * 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) - species_human.remove_overlay(EYES_LAYER) - - if(HAS_TRAIT(species_human, TRAIT_INVISIBLE_MAN)) - return - - 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/eyes/eye_organ = species_human.get_organ_slot(ORGAN_SLOT_EYES) - if(eye_organ) - eye_organ.refresh(call_update = FALSE) - species_human.overlays_standing[EYES_LAYER] = eye_organ.generate_body_overlay(species_human) - species_human.apply_overlay(EYES_LAYER) - - if(HAS_TRAIT(species_human, TRAIT_NO_UNDERWEAR)) - return - - // Underwear, Undershirts & Socks - var/list/standing = list() - if(species_human.underwear) - var/datum/sprite_accessory/underwear/underwear = SSaccessories.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 = mutable_appearance(wear_female_version(underwear.icon_state, underwear.icon, FEMALE_UNIFORM_FULL), layer = -BODY_LAYER) - else - underwear_overlay = mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER) - if(!underwear.use_static) - underwear_overlay.color = species_human.underwear_color - standing += underwear_overlay - - if(species_human.undershirt) - var/datum/sprite_accessory/undershirt/undershirt = SSaccessories.undershirt_list[species_human.undershirt] - if(undershirt) - var/mutable_appearance/working_shirt - if(species_human.dna.species.sexes && species_human.physique == FEMALE) - working_shirt = mutable_appearance(wear_female_version(undershirt.icon_state, undershirt.icon), layer = -BODY_LAYER) - else - working_shirt = mutable_appearance(undershirt.icon, undershirt.icon_state, layer = -BODY_LAYER) - standing += working_shirt - - if(species_human.socks && species_human.num_legs >= 2 && !(species_human.bodyshape & BODYSHAPE_DIGITIGRADE)) - var/datum/sprite_accessory/socks/socks = SSaccessories.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) - -/// Updates face (as of now, only eye) offsets -/datum/species/proc/update_face_offset(mob/living/carbon/human/species_human) - var/list/eye_overlays = species_human.overlays_standing[EYES_LAYER] - species_human.remove_overlay(EYES_LAYER) - - if(HAS_TRAIT(species_human, TRAIT_INVISIBLE_MAN) || HAS_TRAIT(species_human, TRAIT_HUSK) || !length(eye_overlays)) - return - - var/obj/item/bodypart/head/noggin = species_human.get_bodypart(BODY_ZONE_HEAD) - for (var/mutable_appearance/overlay as anything in eye_overlays) - overlay.pixel_w = 0 - overlay.pixel_z = 0 - noggin.worn_face_offset.apply_offset(overlay) - - species_human.overlays_standing[EYES_LAYER] = eye_overlays - species_human.apply_overlay(EYES_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) @@ -604,7 +535,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/list/new_features = list() var/static/list/organs_to_randomize = list() - for(var/obj/item/organ/organ_path as anything in mutant_organs) + for(var/obj/item/organ/organ_path as anything in get_organs()) if(!organ_path.bodypart_overlay) continue var/overlay_path = initial(organ_path.bodypart_overlay) @@ -620,7 +551,7 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/spec_life(mob/living/carbon/human/H, seconds_per_tick, times_fired) SHOULD_CALL_PARENT(TRUE) if(HAS_TRAIT(H, TRAIT_NOBREATH) && (H.health < H.crit_threshold) && !HAS_TRAIT(H, TRAIT_NOCRITDAMAGE)) - H.adjustBruteLoss(0.5 * seconds_per_tick) + H.adjust_brute_loss(0.5 * seconds_per_tick) /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) @@ -890,9 +821,14 @@ GLOBAL_LIST_EMPTY(features_by_species) // The presence of TRAIT_STRENGTH increases our upper unarmed damage. This is a damage cap increase. upper_unarmed_damage += HAS_TRAIT(user, TRAIT_STRENGTH) ? 2 : 0 + // DARKPACK EDIT ADD - Storyteller Stats + var/damage_multiplier = 1 + ((user.st_get_stat(STAT_STRENGTH) - 2) / 5) + upper_unarmed_damage *= damage_multiplier + // DARKPACK EDIT ADD - Storyteller Stats + // Out athletics skill is used to set our potential base damage roll. It won't increase our potential damage roll, but will make our unarmed attack more consistent. // For a normal human arm, this would cap at 10, and for a normal human leg, this would go up to 14. - lower_unarmed_damage = min(lower_unarmed_damage + (user.st_get_stat(STAT_STRENGTH) + user.st_get_stat(STAT_BRAWL) || 0), upper_unarmed_damage) // DARKPACK EDIT CHANGE - STORYTELLER_STATS + lower_unarmed_damage = min(lower_unarmed_damage + user.st_get_stat(STAT_BRAWL), upper_unarmed_damage) // DARKPACK EDIT CHANGE - STORYTELLER_STATS // The actual damage roll. May still be augmented by further factors. var/damage = rand(lower_unarmed_damage, upper_unarmed_damage) @@ -907,10 +843,10 @@ GLOBAL_LIST_EMPTY(features_by_species) limb_accuracy = floor(limb_accuracy * pummel_bonus) //Get our puncher's combined brute and burn damage. - var/puncher_brute_and_burn = (user.getFireLoss() + user.getBruteLoss()) + var/puncher_brute_and_burn = (user.get_fire_loss() + user.get_brute_loss()) //Get our targets combined brute and burn damage. - var/target_brute_and_burn = (target.getFireLoss() + target.getBruteLoss()) + var/target_brute_and_burn = (target.get_fire_loss() + target.get_brute_loss()) // In a brawl, drunkenness can make you swing more wildly and with more force, and thus catch your opponent off guard, but it could also totally throw you off if you're too intoxicated // But god is it going to make you sick moving too much while drunk @@ -1009,6 +945,22 @@ GLOBAL_LIST_EMPTY(features_by_species) SEND_SIGNAL(target, COMSIG_HUMAN_GOT_PUNCHED, user, damage, attack_type, affecting, final_armor_block, kicking, limb_sharpness) SEND_SIGNAL(user, COMSIG_HUMAN_PUNCHED, target, damage, attack_type, affecting, final_armor_block, kicking, limb_sharpness) + // DARKPACK EDIT ADD - Knockdown chance system from old harm proc + if((target.stat != DEAD) && (!target.IsKnockdown())) + var/roll = SSroll.storyteller_roll( + dice = user.st_get_stat(STAT_STRENGTH), + difficulty = target.st_get_stat(STAT_DEXTERITY), + mobs_to_show_output = list(target, user)) + + if(roll == ROLL_SUCCESS) + 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!")) + target.apply_effect(2 SECONDS, EFFECT_KNOCKDOWN, armor_block) + log_combat(user, target, "got a stun punch with their previous punch") + // DARKPACK EDIT END + // If our target is staggered and has sustained enough damage, we can apply a randomly determined status effect to inflict when we punch them. // The effects are based on the punching effectiveness of our attacker. Some effects are not reachable by the average human, and require augmentation to reach or being a species with a heavy punch effectiveness. // Or they're just drunk enough. @@ -1312,7 +1264,7 @@ GLOBAL_LIST_EMPTY(features_by_species) humi.apply_damage(burn_damage, BURN, spread_damage = TRUE, wound_clothing = FALSE) // For cold damage, we cap at the threshold if you're dead - if(humi.getFireLoss() >= abs(HEALTH_THRESHOLD_DEAD) && humi.stat == DEAD) + if(humi.get_fire_loss() >= abs(HEALTH_THRESHOLD_DEAD) && humi.stat == DEAD) return // Apply some burn / brute damage to the body (Dependent if the person is hulk or not) @@ -1393,7 +1345,7 @@ GLOBAL_LIST_EMPTY(features_by_species) H.clear_alert(ALERT_PRESSURE) else var/pressure_damage = min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) - 1) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod * H.physiology.brute_mod * seconds_per_tick - H.adjustBruteLoss(pressure_damage, required_bodytype = BODYTYPE_ORGANIC) + H.adjust_brute_loss(pressure_damage, required_bodytype = BODYTYPE_ORGANIC) H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/highpressure, 2) // High pressure, show an alert @@ -1419,14 +1371,19 @@ GLOBAL_LIST_EMPTY(features_by_species) H.clear_alert(ALERT_PRESSURE) else var/pressure_damage = LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod * H.physiology.brute_mod * seconds_per_tick - H.adjustBruteLoss(pressure_damage, required_bodytype = BODYTYPE_ORGANIC) + H.adjust_brute_loss(pressure_damage, required_bodytype = BODYTYPE_ORGANIC) H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/lowpressure, 2) /** * Handles exposure to the skin of various gases. */ /datum/species/proc/handle_gas_interaction(mob/living/carbon/human/human, datum/gas_mixture/environment, seconds_per_tick, times_fired) - if((human?.wear_suit?.clothing_flags & STOPSPRESSUREDAMAGE) && (human?.head?.clothing_flags & STOPSPRESSUREDAMAGE)) + /// Some non-clothing items may end up in these slots, e.g. flowers worn on the head, so we should consider clothing_flags as potentially nonexistant as a var. + /// Otherwise we will get a very spammy runtime. + var/suit_flags = astype(human?.wear_suit, /obj/item/clothing)?.clothing_flags + var/head_flags = astype(human?.head, /obj/item/clothing)?.clothing_flags + + if((suit_flags & STOPSPRESSUREDAMAGE) && (head_flags & STOPSPRESSUREDAMAGE)) return for(var/gas_id in environment.gases) @@ -1475,22 +1432,18 @@ GLOBAL_LIST_EMPTY(features_by_species) return cached_features var/list/features = list() + var/list/mut_organs = get_organs() for (var/preference_type in GLOB.preference_entries) var/datum/preference/preference = GLOB.preference_entries[preference_type] if ( \ (preference.relevant_inherent_trait in inherent_traits) \ - || (preference.relevant_external_organ in get_mut_organs()) \ + || (preference.relevant_organ in mut_organs) \ || (preference.relevant_head_flag && check_head_flags(preference.relevant_head_flag)) \ || (preference.relevant_body_markings in body_markings) \ ) features += preference.savefile_key - for (var/obj/item/organ/organ_type as anything in mutant_organs) - var/preference = initial(organ_type.preference) - if (!isnull(preference)) - features += preference - GLOB.features_by_species[type] = features return features @@ -1536,7 +1489,8 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/get_hiss_sound(mob/living/carbon/human/human) return -/datum/species/proc/get_mut_organs(include_brain = TRUE) +/// Returns a list of all organ typepaths this species probably has +/datum/species/proc/get_organs(include_brain = TRUE) var/list/mut_organs = list() mut_organs += mutant_organs if (include_brain) @@ -1553,7 +1507,7 @@ GLOBAL_LIST_EMPTY(features_by_species) return mut_organs /datum/species/proc/get_types_to_preload() - return get_mut_organs(FALSE) + return get_organs(FALSE) /** @@ -1751,6 +1705,14 @@ GLOBAL_LIST_EMPTY(features_by_species) SPECIES_PERK_DESC = "[plural_form] are resilient to being shocked.", )) + if(inherent_biotypes & (MOB_ROBOTIC|MOB_MINERAL)) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, + SPECIES_PERK_ICON = FA_ICON_HAMMER, + SPECIES_PERK_NAME = "Tough Frame", + SPECIES_PERK_DESC = "[plural_form] are more resistant to slashing and stabbing, but more vulnerable to impacts.", + )) + return to_add /** @@ -2050,7 +2012,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/obj/item/bodypart/new_part if(path) new_part = new path() - new_part.replace_limb(target, TRUE) + new_part.replace_limb(target) new_part.update_limb(is_creating = TRUE) new_part.set_initial_damage(old_part.brute_dam, old_part.burn_dam) qdel(old_part) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 1a7734cb8be3..ba947e114e1c 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -29,13 +29,13 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) if(SSticker.HasRoundStarted()) SSblackbox.ReportDeath(src) - log_message("has died (BRUTE: [src.getBruteLoss()], BURN: [src.getFireLoss()], TOX: [src.getToxLoss()], OXY: [src.getOxyLoss()], AGG: [src.getAggLoss()]", LOG_ATTACK) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE + log_message("has died (BRUTE: [src.get_brute_loss()], BURN: [src.get_fire_loss()], TOX: [src.get_tox_loss()], OXY: [src.get_oxy_loss()], AGG: [src.get_agg_loss()]", LOG_ATTACK) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE if(key) // Prevents log spamming of keyless mob deaths (like xenobio monkeys) investigate_log("has died at [loc_name(src)].
      \ - BRUTE: [src.getBruteLoss()] BURN: [src.getFireLoss()] TOX: [src.getToxLoss()] OXY: [src.getOxyLoss()] STAM: [src.getStaminaLoss()] AGG: [src.getAggLoss()]
      \ + BRUTE: [src.get_brute_loss()] BURN: [src.get_fire_loss()] TOX: [src.get_tox_loss()] OXY: [src.get_oxy_loss()] STAM: [src.get_stamina_loss()] AGG: [src.get_agg_loss()]
      \ Brain damage: [src.get_organ_loss(ORGAN_SLOT_BRAIN) || "0"]
      \ - [get_bloodtype()?.get_blood_name() || "Blood"] volume: [src.blood_volume]cl ([round((src.blood_volume / BLOOD_VOLUME_NORMAL) * 100, 0.1)]%)
      \ - Reagents:
      [reagents_readout()]", INVESTIGATE_DEATHS) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE + [get_bloodtype()?.get_blood_name() || "Blood"] volume: [src.get_blood_volume(apply_modifiers = TRUE)]cl ([round((src.get_blood_volume(apply_modifiers = TRUE) / BLOOD_VOLUME_NORMAL) * 100, 0.1)]%)
      \ + Reagents:
      [reagents_readout()]", INVESTIGATE_DEATHS) to_chat(src, span_warning("You have died. Barring complete bodyloss, you can in most cases be revived by other players. \ If you do not wish to be brought back, use the \"Do Not Resuscitate\" button at the bottom of your screen.")) @@ -60,5 +60,5 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) /mob/living/carbon/proc/Drain() become_husk(CHANGELING_DRAIN) ADD_TRAIT(src, TRAIT_BADDNA, CHANGELING_DRAIN) - blood_volume = 0 + set_blood_volume(0) return TRUE diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index d5b60051347f..1d4301c688fe 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -33,19 +33,19 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) var/obj/item/organ/current_organ = get_organ_slot(slot) //Time to cache it lads if(current_organ) current_organ.Remove(src, special = TRUE) //Please don't somehow kill our dummy - SSwardrobe.stash_object(current_organ) + SSwardrobe.recycle_object(current_organ) var/datum/species/current_species = dna.species for(var/organ_path in current_species.mutant_organs) var/obj/item/organ/current_organ = get_organ_by_type(organ_path) if(current_organ) current_organ.Remove(src, special = TRUE) //Please don't somehow kill our dummy - SSwardrobe.stash_object(current_organ) + SSwardrobe.recycle_object(current_organ) //Instead of just deleting our equipment, we save what we can and reinsert it into SSwardrobe's store //Hopefully this makes preference reloading not the worst thing ever /mob/living/carbon/human/dummy/delete_equipment() - var/list/items_to_check = get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD) + var/list/items_to_check = get_equipped_items(INCLUDE_POCKETS|INCLUDE_HELD|INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT) var/list/to_nuke = list() //List of items queued for deletion, can't qdel them before iterating their contents in case they hold something ///Travel to the bottom of the contents chain, expanding it out for(var/i = 1; i <= length(items_to_check); i++) //Needs to be a c style loop since it can expand @@ -66,7 +66,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) if(ismob(checking.loc)) var/mob/checkings_owner = checking.loc checkings_owner.temporarilyRemoveItemFromInventory(checking, TRUE) //Clear out of there yeah? - SSwardrobe.stash_object(checking) + SSwardrobe.recycle_object(checking) for(var/obj/item/delete as anything in to_nuke) qdel(delete) @@ -82,6 +82,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) /mob/living/carbon/human/dummy/proc/wipe_state() delete_equipment() + update_lips(null, null, null, update = FALSE) cut_overlays(TRUE) /mob/living/carbon/human/dummy/setup_human_dna() @@ -112,21 +113,8 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) /proc/create_consistent_human_dna(mob/living/carbon/human/target) target.dna.features[FEATURE_MUTANT_COLOR] = COLOR_VIBRANT_LIME target.dna.features[FEATURE_ETHEREAL_COLOR] = COLOR_WHITE - target.dna.features[FEATURE_LIZARD_MARKINGS] = get_consistent_feature_entry(SSaccessories.lizard_markings_list) - target.dna.features[FEATURE_EARS] = get_consistent_feature_entry(SSaccessories.ears_list) - target.dna.features[FEATURE_FRILLS] = get_consistent_feature_entry(SSaccessories.frills_list) - target.dna.features[FEATURE_HORNS] = get_consistent_feature_entry(SSaccessories.horns_list) - target.dna.features[FEATURE_MOTH_ANTENNAE] = get_consistent_feature_entry(SSaccessories.moth_antennae_list) - target.dna.features[FEATURE_MOTH_MARKINGS] = get_consistent_feature_entry(SSaccessories.moth_markings_list) - target.dna.features[FEATURE_MOTH_WINGS] = get_consistent_feature_entry(SSaccessories.moth_wings_list) - target.dna.features[FEATURE_SNOUT] = get_consistent_feature_entry(SSaccessories.snouts_list) - target.dna.features[FEATURE_SPINES] = get_consistent_feature_entry(SSaccessories.spines_list) - target.dna.features[FEATURE_TAIL] = get_consistent_feature_entry(SSaccessories.tails_list_felinid) // it's a lie - target.dna.features[FEATURE_TAIL_LIZARD] = get_consistent_feature_entry(SSaccessories.tails_list_lizard) - target.dna.features[FEATURE_TAIL_MONKEY] = get_consistent_feature_entry(SSaccessories.tails_list_monkey) - target.dna.features[FEATURE_TAIL_FISH] = get_consistent_feature_entry(SSaccessories.tails_list_fish) - target.dna.features[FEATURE_POD_HAIR] = get_consistent_feature_entry(SSaccessories.pod_hair_list) - target.dna.features[FEATURE_MUSH_CAP] = get_consistent_feature_entry(SSaccessories.caps_list) + for(var/feature_key in SSaccessories.feature_list) + target.dna.features[feature_key] = get_consistent_feature_entry(SSaccessories.feature_list[feature_key]) target.dna.initialize_dna(newblood_type = get_blood_type(BLOOD_TYPE_O_MINUS), 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 @@ -156,6 +144,21 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) /mob/living/carbon/human/consistent/domutcheck() return // We skipped adding any mutations so this runtimes +/mob/living/carbon/human/consistent/slow + +#ifdef UNIT_TESTS +//unit test dummies should be very fast with actions +/mob/living/carbon/human/dummy/consistent/initialize_actionspeed() + add_or_update_variable_actionspeed_modifier(/datum/actionspeed_modifier/base, multiplicative_slowdown = -1) + +/mob/living/carbon/human/consistent/initialize_actionspeed() + add_or_update_variable_actionspeed_modifier(/datum/actionspeed_modifier/base, multiplicative_slowdown = -1) + +//this one gives us a small window of time for checks on asynced actions. +/mob/living/carbon/human/consistent/slow/initialize_actionspeed() + add_or_update_variable_actionspeed_modifier(/datum/actionspeed_modifier/base, multiplicative_slowdown = 0.1) +#endif + //Inefficient pooling/caching way. GLOBAL_LIST_EMPTY(human_dummy_list) GLOBAL_LIST_EMPTY(dummy_mob_list) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 56d51ee64889..4a9f62ef24a3 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -57,37 +57,17 @@ message_mime = "mumbles silently!" emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE -/datum/emote/living/carbon/human/scream - key = "scream" - key_third_person = "screams" - message = "screams!" - message_mime = "acts out a scream!" - emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE - specific_emote_audio_cooldown = 10 SECONDS - vary = TRUE - -/datum/emote/living/carbon/human/scream/can_run_emote(mob/user, status_check = TRUE , intentional, params) - if(!intentional && HAS_TRAIT(user, TRAIT_ANALGESIA)) - return FALSE - return ..() - -/datum/emote/living/carbon/human/scream/get_sound(mob/living/carbon/human/user) - if(!istype(user)) - return - return user.dna.species.get_scream_sound(user) - -/datum/emote/living/carbon/human/scream/screech //If a human tries to screech it'll just scream. +/datum/emote/living/carbon/human/screech // basically scream 2.0 key = "screech" key_third_person = "screeches" message = "screeches!" message_mime = "screeches silently." emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE + specific_emote_audio_cooldown = 10 SECONDS vary = FALSE -/datum/emote/living/carbon/human/scream/screech/should_play_sound(mob/user, intentional) - if(ismonkey(user)) - return TRUE - return ..() +/datum/emote/living/carbon/human/screech/get_sound(mob/living/carbon/human/user) + return user.dna.species.get_scream_sound(user) /datum/emote/living/carbon/human/pale key = "pale" @@ -107,6 +87,89 @@ hands_use_check = TRUE sound = 'sound/mobs/humanoids/human/salute/salute.ogg' +/datum/emote/living/carbon/human/slit + key = "slit" + key_third_person = "slits" + message = "drags a finger across their neck." + hands_use_check = TRUE + +/datum/emote/living/carbon/human/scratch_h + key = "scratch_h" + message = "scratches their head." + hands_use_check = TRUE + +/datum/emote/living/carbon/human/thumb_up + key = "thumb_u" + message = "gives a thumbs up." + hands_use_check = TRUE + +/datum/emote/living/carbon/human/thumb_down + key = "thumb_d" + message = "gives a thumbs down." + hands_use_check = TRUE + +/datum/emote/living/carbon/human/time + key = "time" + message = "checks the time." + hands_use_check = TRUE + +/datum/emote/living/carbon/human/tap + key = "tap" + key_third_person = "taps" + message = "taps their foot impatiently." + +/datum/emote/living/carbon/human/halt + key = "halt" + key_third_person = "halts" + message = "holds up their palm, signaling to stop." + hands_use_check = TRUE + +/datum/emote/living/carbon/human/shush + key = "shush" + key_third_person = "shushes" + message = "holds a finger to their lips." + hands_use_check = TRUE + +/datum/emote/living/carbon/human/listen + key = "listen" + key_third_person = "listens" + message = "cups a hand to their ear." + hands_use_check = TRUE + +/datum/emote/living/carbon/human/think + key = "think" + key_third_person = "thinks" + message = "taps their head, thinking." + hands_use_check = TRUE + +/datum/emote/living/carbon/human/beckon + key = "beckon" + key_third_person = "beckons" + message = "waves a hand for someone to come closer." + hands_use_check = TRUE + +/datum/emote/living/carbon/human/airquote + key = "airquote" + key_third_person = "airquotes" + message = "makes air quotes." + hands_use_check = TRUE + +/datum/emote/living/carbon/human/crazy + key = "crazy" + message = "twirls a finger next to their head." + hands_use_check = TRUE + +/datum/emote/living/carbon/human/squint + key = "squint" + key_third_person = "squints" + message = "squints." + +/datum/emote/living/carbon/human/rub + key = "rub" + key_third_person = "rubs" + message = "rubs their chin." + hands_use_check = TRUE + /datum/emote/living/carbon/human/shrug key = "shrug" key_third_person = "shrugs" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 47fa920bfb1f..c69f9d1228c5 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -64,15 +64,11 @@ /mob/living/carbon/human/Destroy() QDEL_NULL(physiology) GLOB.human_list -= src + GLOB.kindred_list -= src // DARKPACK EDIT ADD if (mob_mood) QDEL_NULL(mob_mood) - //DARKPACK EDIT START - if (clan) - clan.on_lose(src) - //DARKPACK EDIT END - return ..() /mob/living/carbon/human/prepare_data_huds() @@ -132,7 +128,7 @@ id_species ||= dna.species.name id_blood_type ||= get_bloodtype() - if(istype(id, /obj/item/card/id/advanced)) + else if(istype(id, /obj/item/card/id/advanced)) var/obj/item/card/id/advanced/advancedID = id id_job = advancedID.trim_assignment_override || id_job @@ -188,12 +184,12 @@ if(!HAS_TRAIT(human_user, TRAIT_MEDICAL_HUD)) return if(href_list["evaluation"]) - if(!getBruteLoss() && !getFireLoss() && !getOxyLoss() && getToxLoss() < 20 && !getAggLoss()) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE + if(!get_brute_loss() && !get_fire_loss() && !get_oxy_loss() && get_tox_loss() < 20 && !get_agg_loss()) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE to_chat(human_user, "[span_notice("No external injuries detected.")]
      ") return var/span = "notice" var/status = "" - if(getBruteLoss()) + if(get_brute_loss()) to_chat(human_user, "Physical trauma analysis:") for(var/X in bodyparts) var/obj/item/bodypart/BP = X @@ -209,7 +205,7 @@ span = "userdanger" if(brutedamage) to_chat(human_user, "[BP] appears to have [status]") - if(getFireLoss()) + if(get_fire_loss()) to_chat(human_user, "Analysis of skin burns:") for(var/X in bodyparts) var/obj/item/bodypart/BP = X @@ -226,7 +222,7 @@ if(burndamage) to_chat(human_user, "[BP] appears to have [status]") // DARKPACK EDIT ADD START - AGGRAVATED_DAMAGE - if(getAggLoss()) + if(get_agg_loss()) to_chat(human_user, "Grievous trauma analysis:") for(var/X in bodyparts) var/obj/item/bodypart/BP = X @@ -243,9 +239,9 @@ if(aggravateddamage) to_chat(human_user, "[BP] appears to have [status]") // DARKPACK EDIT ADD END - if(getOxyLoss()) + if(get_oxy_loss()) to_chat(human_user, span_danger("Patient has signs of suffocation, emergency treatment may be required!")) - if(getToxLoss() > 20) + if(get_tox_loss() > 20) to_chat(human_user, span_danger("Gathered data is inconsistent with the analysis, possible cause: poisoning.")) if(!human_user.wear_id) //You require access from here on out. to_chat(human_user, span_warning("ERROR: Invalid access")) @@ -360,7 +356,7 @@ var/datum/crime/citation/new_citation = new(name = citation_name, author = allowed_access, fine = fine) target_record.citations += new_citation - new_citation.alert_owner(usr, src, target_record.name, "You have been fined [fine] credits for '[citation_name]'. Fines may be paid at security.") + new_citation.alert_owner(usr, src, target_record.name, "You have been fined [fine] [MONEY_NAME] for '[citation_name]'. Fines may be paid at security.") investigate_log("New Citation: [citation_name] Fine: [fine] | Added to [target_record.name] by [key_name(human_user)]", INVESTIGATE_RECORDS) SSblackbox.ReportCitation(REF(new_citation), human_user.ckey, human_user.real_name, target_record.name, citation_name, null, fine) @@ -583,7 +579,7 @@ else if (!target.get_organ_slot(ORGAN_SLOT_LUNGS)) to_chat(target, span_unconscious("You feel a breath of fresh air... but you don't feel any better...")) else - target.adjustOxyLoss(-min(target.getOxyLoss(), 7)) + target.adjust_oxy_loss(-min(target.get_oxy_loss(), 7)) to_chat(target, span_unconscious("You feel a breath of fresh air enter your lungs... It feels good...")) if (target.health <= target.crit_threshold) @@ -730,7 +726,7 @@ return ..() /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))) + if(!((vomit_flags & MOB_VOMIT_BLOOD) && !CAN_HAVE_BLOOD(src) && !HAS_TRAIT(src, TRAIT_TOXINLOVER))) return ..() if(vomit_flags & MOB_VOMIT_MESSAGE) @@ -993,16 +989,6 @@ else remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown) -/mob/living/carbon/human/is_bleeding() - if(HAS_TRAIT(src, TRAIT_NOBLOOD)) - return FALSE - return ..() - -/mob/living/carbon/human/get_total_bleed_rate() - if(HAS_TRAIT(src, TRAIT_NOBLOOD)) - return FALSE - return ..() - /mob/living/carbon/human/get_exp_list(minutes) . = ..() if(mind.assigned_role.title in SSjob.name_occupations) @@ -1058,6 +1044,7 @@ ai_controller = /datum/ai_controller/monkey /mob/living/carbon/human/species + abstract_type = /mob/living/carbon/human/species var/race = null var/use_random_name = TRUE @@ -1085,7 +1072,7 @@ var/chest_covered = FALSE var/head_covered = FALSE var/hands_covered = FALSE - for (var/obj/item/clothing/equipped in get_equipped_items()) + for (var/obj/item/clothing/equipped in get_equipped_items(INCLUDE_ABSTRACT)) // We don't really have space-proof gloves, so even if we're checking them we ignore the flags if ((equipped.body_parts_covered & HANDS) && num_hands >= default_num_hands) hands_covered = TRUE diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index a3034d11719a..2cf92ed199e8 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -34,40 +34,36 @@ ///Get all the clothing on a specific body part /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) - if(!bp) - continue - if(bp && istype(bp , /obj/item/clothing)) - var/obj/item/clothing/C = bp - if(C.body_parts_covered & def_zone.body_part) - covering_part += C + for(var/obj/item/clothing/equipped in get_equipped_items(INCLUDE_ABSTRACT)) + if(equipped.body_parts_covered & def_zone.body_part) + covering_part += equipped return covering_part -/mob/living/carbon/human/bullet_act(obj/projectile/bullet, def_zone, piercing_hit = FALSE) - if(bullet.firer == src && bullet.original == src) //can't block or reflect when shooting yourself +/mob/living/carbon/human/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) + if(hitting_projectile.firer == src && hitting_projectile.original == src) //can't block or reflect when shooting yourself return ..() - if(bullet.reflectable) - if(check_reflect(def_zone)) // Checks if you've passed a reflection% check - visible_message( - span_danger("\The [bullet] gets reflected by [src]!"), - span_userdanger("\The [bullet] gets reflected by [src]!"), - ) - // Finds and plays the block_sound of item which reflected - for(var/obj/item/held_item in held_items) - if(held_item.IsReflect(def_zone)) - playsound(src, held_item.block_sound, BLOCK_SOUND_VOLUME, TRUE) - // Find a turf near or on the original location to bounce to - if(!isturf(loc)) //Open canopy mech (ripley) check. if we're inside something and still got hit - return loc.projectile_hit(bullet, def_zone, piercing_hit) - bullet.reflect(src) - return BULLET_ACT_FORCE_PIERCE // complete projectile permutation + // The projectile cannot be reflected or you failed to pass a reflection% check + if (!hitting_projectile.reflectable || !check_reflect(def_zone)) + return ..() + visible_message( + span_danger("\The [hitting_projectile] gets reflected by [src]!"), + span_userdanger("\The [hitting_projectile] gets reflected by [src]!"), + ) + // Finds and plays the block_sound of item which reflected + for(var/obj/item/held_item in held_items) + if(held_item.IsReflect(def_zone)) + playsound(src, held_item.block_sound, BLOCK_SOUND_VOLUME, TRUE) + // Find a turf near or on the original location to bounce to + if(!isturf(loc)) // Open canopy mech (ripley) check. if we're inside something and still got hit + return loc.projectile_hit(hitting_projectile, def_zone, piercing_hit, blocked) + hitting_projectile.reflect(src) + return BULLET_ACT_FORCE_PIERCE // complete projectile permutation + +/mob/living/carbon/human/bullet_act(obj/projectile/bullet, def_zone, piercing_hit, blocked) if(check_block(bullet, bullet.damage, "\the [bullet]", PROJECTILE_ATTACK, bullet.armour_penetration, bullet.damage_type)) - bullet.on_hit(src, 100, def_zone, piercing_hit) - return BULLET_ACT_HIT - + return ..(bullet, def_zone, piercing_hit, 100) return ..() ///Reflection checks for anything in your l_hand, r_hand, or wear_suit based on the reflection chance of the object @@ -89,7 +85,7 @@ return SUCCESSFUL_BLOCK var/block_chance_modifier = round(damage / -3) - for(var/obj/item/worn_thing in get_equipped_items(INCLUDE_HELD)) + for(var/obj/item/worn_thing in get_equipped_items(INCLUDE_HELD|INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT)) // Things that are supposed to be worn, being held = cannot block if(isclothing(worn_thing)) if(worn_thing in held_items) @@ -209,7 +205,7 @@ else if(!HAS_TRAIT(src, TRAIT_INCAPACITATED)) playsound(loc, 'sound/items/weapons/pierce.ogg', 25, TRUE, -1) var/shovetarget = get_edge_target_turf(user, get_dir(user, get_step_away(src, user))) - adjustStaminaLoss(35) + adjust_stamina_loss(35) throw_at(shovetarget, 4, 2, user, force = MOVE_FORCE_OVERPOWERING) log_combat(user, src, "shoved") visible_message(span_danger("[user] tackles [src] down!"), \ @@ -275,7 +271,6 @@ //200 max knockdown for EXPLODE_HEAVY //160 max knockdown for EXPLODE_LIGHT - var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) switch (severity) if (EXPLODE_DEVASTATE) if(bomb_armor < EXPLODE_GIB_THRESHOLD) //gibs the mob if their bomb armor is lower than EXPLODE_GIB_THRESHOLD @@ -303,8 +298,8 @@ brute_loss = 30*(2 - round(bomb_armor*0.01, 0.05)) burn_loss = brute_loss //damage gets reduced from 120 to up to 60 combined brute+burn damage_clothes(200 - bomb_armor, BRUTE, BOMB) - if (ears && !HAS_TRAIT_FROM_ONLY(src, TRAIT_DEAF, EAR_DAMAGE)) - ears.adjustEarDamage(30, 120) + if (!HAS_TRAIT_FROM(src, TRAIT_DEAF, EAR_DAMAGE)) + sound_damage(30, 240 SECONDS) Unconscious(20) //short amount of time for follow up attacks against elusive enemies like wizards Knockdown(200 - (bomb_armor * 1.6)) //between ~4 and ~20 seconds of knockdown depending on bomb armor @@ -313,8 +308,8 @@ if(bomb_armor) brute_loss = 15*(2 - round(bomb_armor*0.01, 0.05)) damage_clothes(max(50 - bomb_armor, 0), BRUTE, BOMB) - if (ears && !HAS_TRAIT_FROM_ONLY(src, TRAIT_DEAF, EAR_DAMAGE)) - ears.adjustEarDamage(15,60) + if (!HAS_TRAIT_FROM(src, TRAIT_DEAF, EAR_DAMAGE)) + sound_damage(15, 120 SECONDS) Knockdown(160 - (bomb_armor * 1.6)) //100 bomb armor will prevent knockdown altogether take_overall_damage(brute_loss,burn_loss) @@ -576,7 +571,7 @@ for(var/t in missing) combined_msg += span_boldannounce("↳ Your [parse_zone(t)] is missing!") - var/tox = getToxLoss() + (disgust / 5) + (HAS_TRAIT(src, TRAIT_SELF_AWARE) ? 0 : (rand(-3, 0) * 5)) + var/tox = get_tox_loss() + (disgust / 5) + (HAS_TRAIT(src, TRAIT_SELF_AWARE) ? 0 : (rand(-3, 0) * 5)) switch(tox) if(10 to 20) combined_msg += span_danger("You feel sick.") @@ -585,7 +580,8 @@ if(40 to INFINITY) combined_msg += span_danger("You feel very unwell!") - var/oxy = getOxyLoss() + (losebreath * 4) + (blood_volume < BLOOD_VOLUME_NORMAL ? ((BLOOD_VOLUME_NORMAL - blood_volume) * 0.1) : 0) + (HAS_TRAIT(src, TRAIT_SELF_AWARE) ? 0 : (rand(-3, 0) * 5)) + var/cached_blood_volume = get_blood_volume(apply_modifiers = TRUE) + var/oxy = get_oxy_loss() + (losebreath * 4) + (cached_blood_volume < BLOOD_VOLUME_NORMAL ? ((BLOOD_VOLUME_NORMAL - cached_blood_volume) * 0.1) : 0) + (HAS_TRAIT(src, TRAIT_SELF_AWARE) ? 0 : (rand(-3, 0) * 5)) switch(oxy) if(10 to 20) combined_msg += span_danger("You feel lightheaded.") @@ -594,8 +590,8 @@ if(40 to INFINITY) combined_msg += span_danger("You feel like you're about to pass out!") - if(getStaminaLoss()) - if(getStaminaLoss() > 30) + if(get_stamina_loss()) + if(get_stamina_loss() > 30) combined_msg += span_info("You're completely exhausted.") else combined_msg += span_info("You feel fatigued.") @@ -728,3 +724,10 @@ if (HAS_TRAIT(src, TRAIT_IGNORE_FIRE_PROTECTION)) no_protection = TRUE fire_handler.harm_human(seconds_per_tick, no_protection) + +/mob/living/carbon/human/expose_reagents(list/reagents, datum/reagents/source, methods, volume_modifier, show_message) + if(external || internal) + methods &= ~INHALE + if(methods == NONE) + return + return ..() diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 5269d7ebefb7..c92c209343f5 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -5,7 +5,7 @@ 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,IMPSEC_FIRST_HUD,IMPSEC_SECOND_HUD,ANTAG_HUD,GLAND_HUD,FAN_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPSEC_FIRST_HUD,IMPSEC_SECOND_HUD,ANTAG_HUD,GLAND_HUD,FAN_HUD,AUSPEX_AURA_HUD) // DARKPACK EDIT, ORIGINAL: hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPSEC_FIRST_HUD,IMPSEC_SECOND_HUD,ANTAG_HUD,GLAND_HUD,FAN_HUD) hud_type = /datum/hud/human pressure_resistance = 25 buckle_lying = 0 @@ -21,15 +21,9 @@ var/hairstyle = "Bald" ///Colours used for hair and facial hair gradients. - var/list/grad_color = list( - COLOR_BLACK, //Hair Gradient Color - COLOR_BLACK, //Facial Hair Gradient Color - ) + var/list/grad_color ///Styles used for hair and facial hair gradients. - var/list/grad_style = list( - "None", //Hair Gradient Style - "None", //Facial Hair Gradient Style - ) + var/list/grad_style //Facial hair colour and style var/facial_hair_color = COLOR_BLACK diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index d5faf2196c2e..f2721606a863 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -40,7 +40,7 @@ name = get_visible_name() /// 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(add_id_name = TRUE, force_real_name = FALSE) +/mob/living/carbon/human/get_visible_name(add_id_name = TRUE, force_real_name = FALSE, mob/examiner) // DARKPACK EDIT, ORIGINAL: /mob/living/carbon/human/get_visible_name(add_id_name = TRUE, force_real_name = FALSE) var/list/identity = list(null, null, null) SEND_SIGNAL(src, COMSIG_HUMAN_GET_VISIBLE_NAME, identity) var/signal_face = LAZYACCESS(identity, VISIBLE_NAME_FACE) @@ -49,7 +49,7 @@ if(force_set) // our name is overriden by something return signal_face // no need to null-check, because force_set will always set a signal_face - var/face_name = isnull(signal_face) ? get_face_name("") : signal_face + var/face_name = isnull(signal_face) ? get_face_name() : signal_face // DARKPACK EDIT, ORIGINAL: var/face_name = isnull(signal_face) ? get_face_name("") : signal_face var/id_name = isnull(signal_id) ? get_id_name("", honorifics = TRUE) : signal_id // We need to account for real name @@ -59,7 +59,7 @@ // We're just some unknown guy if(HAS_TRAIT(src, TRAIT_UNKNOWN_APPEARANCE) || HAS_TRAIT(src, TRAIT_INVISIBLE_MAN)) - return "Unknown" + return get_generic_name(prefixed = TRUE, lowercase = TRUE) // DARKPACK EDIT, ORIGINAL: return "Unknown" // We have a face and an ID if(face_name && id_name) @@ -69,8 +69,14 @@ if(add_id_name) return "[face_name] (as [id_name])" + // DARKPACK EDIT ADD START + var/known_name + if(!face_name) + known_name = examiner?.mind?.guestbook?.get_known_name(examiner, src, real_name) + // DARKPACK EDIT ADD END + // Just go down the list of stuff we recorded - return face_name || id_name || "Unknown" + return known_name || face_name || id_name || get_generic_name(prefixed = TRUE, lowercase = TRUE) // DARKPACK EDIT, ORIGINAL: return face_name || id_name || "Unknown" /** * Gets what the face of this mob looks like @@ -78,17 +84,22 @@ * * if_no_face - What to return if we have no face or our face is obscured/disfigured */ /mob/living/carbon/proc/get_face_name(if_no_face = "Unknown") - return real_name + return // DARKPACK EDIT, ORIGINAL: return real_name /mob/living/carbon/human/get_face_name(if_no_face = "Unknown") + if(!real_name || is_face_obscured()) + return if_no_face + return // DARKPACK EDIT, ORIGINAL: return real_name + +/mob/living/carbon/human/proc/is_face_obscured() if(HAS_TRAIT(src, TRAIT_UNKNOWN_APPEARANCE)) - return if_no_face //We're Unknown, no face information for you + return TRUE //We're Unknown, no face information for you if(obscured_slots & HIDEFACE) - return if_no_face + return TRUE var/obj/item/bodypart/head = get_bodypart(BODY_ZONE_HEAD) - if(isnull(head) || !real_name || HAS_TRAIT(src, TRAIT_DISFIGURED) || HAS_TRAIT(src, TRAIT_INVISIBLE_MAN)) //disfigured. use id-name if possible - return if_no_face - return real_name + if(isnull(head) || HAS_TRAIT(src, TRAIT_DISFIGURED) || HAS_TRAIT(src, TRAIT_INVISIBLE_MAN)) //disfigured. use id-name if possible + return TRUE + return FALSE /** * Gets whatever name is in our ID or PDA @@ -280,6 +291,7 @@ mob_height = dna?.species?.update_species_heights(src) || base_mob_height if(old_height != mob_height) regenerate_icons() + SEND_SIGNAL(src, COMSIG_HUMAN_HEIGHT_UPDATED, old_height) /** * Makes a full copy of src and returns it. @@ -306,6 +318,9 @@ for(var/datum/quirk/original_quircks as anything in quirks) clone.add_quirk(original_quircks.type, override_client = client, announce = FALSE) + for(var/personality_type in personalities) + clone.add_personality(personality_type) + clone.updateappearance(mutcolor_update = TRUE, mutations_overlay_update = TRUE) return clone diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm index 72bc111a880d..cbd8742b5106 100644 --- a/code/modules/mob/living/carbon/human/human_say.dm +++ b/code/modules/mob/living/carbon/human/human_say.dm @@ -39,7 +39,7 @@ return override_voice if(add_id_name && real_name == id_name) // Allows for "Captain John" to have the voice "Captain Join" and not "John" return get_id_name("", honorifics = TRUE) - return real_name + return name // DARKPACK EDIT, ORIGINAL: return real_name /mob/living/carbon/human/get_message_voice(visible_name) . = ..() diff --git a/code/modules/mob/living/carbon/human/human_stripping.dm b/code/modules/mob/living/carbon/human/human_stripping.dm index d2c09ec258aa..5b788c3248bb 100644 --- a/code/modules/mob/living/carbon/human/human_stripping.dm +++ b/code/modules/mob/living/carbon/human/human_stripping.dm @@ -45,25 +45,23 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( key = STRIPPABLE_ITEM_JUMPSUIT item_slot = ITEM_SLOT_ICLOTHING -/datum/strippable_item/mob_item_slot/jumpsuit/get_alternate_actions(atom/source, mob/user) - var/obj/item/clothing/under/jumpsuit = get_item(source) +/datum/strippable_item/mob_item_slot/jumpsuit/get_alternate_actions(atom/source, mob/user, obj/item/item) + . = ..() + var/obj/item/clothing/under/jumpsuit = item if (!istype(jumpsuit)) - return null + return - var/list/actions = list() if(jumpsuit.has_sensor == HAS_SENSORS) - actions += "adjust_sensor" + . += "adjust_sensor" if(jumpsuit.can_adjust) - actions += "adjust_jumpsuit" + . += "adjust_jumpsuit" if(length(jumpsuit.attached_accessories)) - actions += "strip_accessory" + . += "strip_accessory" - return actions - -/datum/strippable_item/mob_item_slot/jumpsuit/perform_alternate_action(atom/source, mob/user, action_key) +/datum/strippable_item/mob_item_slot/jumpsuit/perform_alternate_action(atom/source, mob/user, action_key, obj/item/item) if (!..()) return - var/obj/item/clothing/under/jumpsuit = get_item(source) + var/obj/item/clothing/under/jumpsuit = item if (!istype(jumpsuit)) return null @@ -118,15 +116,11 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( return to_chat(source, span_notice("[user] is trying to adjust your [jumpsuit.name]'s sensor.")) - if(!do_after(user, jumpsuit.strip_delay * 0.5, source)) // takes the same amount of time as adjusting it + if(!do_after(user, jumpsuit.strip_delay * 0.5, source) || !jumpsuit.set_sensor_mode(new_mode)) // takes the same amount of time as adjusting it source.balloon_alert(user, "failed!") return source.balloon_alert(user, "changed sensors") - jumpsuit.sensor_mode = new_mode to_chat(source, span_notice("[user] successfully adjusted your [jumpsuit.name]'s sensor.")) - if(ishuman(source)) - var/mob/living/carbon/human/humano = source - humano.update_suit_sensors() /datum/strippable_item/mob_item_slot/jumpsuit/proc/do_strip_accessory(atom/source, mob/user, obj/item/clothing/under/jumpsuit) var/list/accessory_choices = list() @@ -172,24 +166,25 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( key = STRIPPABLE_ITEM_FEET item_slot = ITEM_SLOT_FEET -/datum/strippable_item/mob_item_slot/feet/get_alternate_actions(atom/source, mob/user) - var/obj/item/clothing/shoes/shoes = get_item(source) +/datum/strippable_item/mob_item_slot/feet/get_alternate_actions(atom/source, mob/user, obj/item/item) + . = ..() + var/obj/item/clothing/shoes/shoes = item if (!istype(shoes) || shoes.fastening_type == SHOES_SLIPON) - return null + return switch (shoes.tied) if (SHOES_UNTIED) - return list("knot") + . += "knot" if (SHOES_TIED) - return list("untie") + . += "untie" if (SHOES_KNOTTED) - return list("unknot") + . += "unknot" -/datum/strippable_item/mob_item_slot/feet/perform_alternate_action(atom/source, mob/user, action_key) +/datum/strippable_item/mob_item_slot/feet/perform_alternate_action(atom/source, mob/user, action_key, obj/item/item) if(!..()) return - var/obj/item/clothing/shoes/shoes = get_item(source) + var/obj/item/clothing/shoes/shoes = item if (!istype(shoes)) return switch(action_key) @@ -202,14 +197,15 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( key = STRIPPABLE_ITEM_SUIT_STORAGE item_slot = ITEM_SLOT_SUITSTORE -/datum/strippable_item/mob_item_slot/suit_storage/get_alternate_actions(atom/source, mob/user) - return get_strippable_alternate_action_internals(get_item(source), source) +/datum/strippable_item/mob_item_slot/suit_storage/get_alternate_actions(atom/source, mob/user, obj/item/item) + . = ..() + . += get_strippable_alternate_action_internals(item, source) -/datum/strippable_item/mob_item_slot/suit_storage/perform_alternate_action(atom/source, mob/user, action_key) +/datum/strippable_item/mob_item_slot/suit_storage/perform_alternate_action(atom/source, mob/user, action_key, obj/item/item) if(!..()) return - if(action_key in get_strippable_alternate_action_internals(get_item(source), source)) - strippable_alternate_action_internals(get_item(source), source, user) + if(action_key in get_strippable_alternate_action_internals(item, source)) + strippable_alternate_action_internals(item, source, user) /datum/strippable_item/mob_item_slot/id key = STRIPPABLE_ITEM_ID @@ -219,14 +215,15 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( key = STRIPPABLE_ITEM_BELT item_slot = ITEM_SLOT_BELT -/datum/strippable_item/mob_item_slot/belt/get_alternate_actions(atom/source, mob/user) - return get_strippable_alternate_action_internals(get_item(source), source) +/datum/strippable_item/mob_item_slot/belt/get_alternate_actions(atom/source, mob/user, obj/item/item) + . = ..() + . += get_strippable_alternate_action_internals(item, source) -/datum/strippable_item/mob_item_slot/belt/perform_alternate_action(atom/source, mob/user, action_key) +/datum/strippable_item/mob_item_slot/belt/perform_alternate_action(atom/source, mob/user, action_key, obj/item/item) if (!..()) return - if(action_key in get_strippable_alternate_action_internals(get_item(source), source)) - strippable_alternate_action_internals(get_item(source), source, user) + if(action_key in get_strippable_alternate_action_internals(item, source)) + strippable_alternate_action_internals(item, source, user) /datum/strippable_item/mob_item_slot/pocket /// Which pocket we're referencing. Used for visible text. diff --git a/code/modules/mob/living/carbon/human/human_suicide.dm b/code/modules/mob/living/carbon/human/human_suicide.dm index e6b4bbac8e07..e710ab2afb4a 100644 --- a/code/modules/mob/living/carbon/human/human_suicide.dm +++ b/code/modules/mob/living/carbon/human/human_suicide.dm @@ -36,7 +36,7 @@ return ..() if(damage_type & SHAME) - adjustStaminaLoss(200) + adjust_stamina_loss(200) set_suicide(FALSE) add_mood_event("shameful_suicide", /datum/mood_event/shameful_suicide) return FALSE 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 044315bd2b8e..7b0d8e7dd0e1 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -289,7 +289,7 @@ There are several things that need to be remembered: var/mutable_appearance/neck_overlay = worn_item.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = icon_file) var/obj/item/bodypart/chest/my_chest = get_bodypart(BODY_ZONE_CHEST) - my_chest?.worn_belt_offset?.apply_offset(neck_overlay) + my_chest?.worn_neck_offset?.apply_offset(neck_overlay) overlays_standing[NECK_LAYER] = neck_overlay apply_overlay(NECK_LAYER) @@ -859,6 +859,82 @@ generate/load female uniform sprites matching all previously decided variables observers = null break +/mob/living/carbon/human/update_body(is_creating = FALSE) + update_eyes() + update_underwear() + return ..() + +/mob/living/carbon/human/proc/update_underwear() + remove_overlay(BODY_LAYER) + if(HAS_TRAIT(src, TRAIT_HUSK) || HAS_TRAIT(src, TRAIT_INVISIBLE_MAN) || HAS_TRAIT(src, TRAIT_NO_UNDERWEAR)) + return + // Underwear, Undershirts & Socks + var/list/standing = list() + if(underwear) + var/datum/sprite_accessory/underwear/undie_accessory = SSaccessories.underwear_list[underwear] + var/mutable_appearance/underwear_overlay + if(undie_accessory) + if(dna.species.sexes && physique == FEMALE && (undie_accessory.gender == MALE)) + underwear_overlay = mutable_appearance(wear_female_version(undie_accessory.icon_state, undie_accessory.icon, FEMALE_UNIFORM_FULL), layer = -BODY_LAYER) + else + underwear_overlay = mutable_appearance(undie_accessory.icon, undie_accessory.icon_state, -BODY_LAYER) + if(!undie_accessory.use_static) + underwear_overlay.color = underwear_color + standing += underwear_overlay + + if(undershirt) + var/datum/sprite_accessory/undershirt/undie_accessory = SSaccessories.undershirt_list[undershirt] + if(undie_accessory) + var/mutable_appearance/working_shirt + if(dna.species.sexes && physique == FEMALE) + working_shirt = mutable_appearance(wear_female_version(undie_accessory.icon_state, undie_accessory.icon), layer = -BODY_LAYER) + else + working_shirt = mutable_appearance(undie_accessory.icon, undie_accessory.icon_state, layer = -BODY_LAYER) + standing += working_shirt + + if(socks && num_legs >= 2 && !(bodyshape & BODYSHAPE_DIGITIGRADE)) + var/datum/sprite_accessory/socks/undie_accessory = SSaccessories.socks_list[socks] + if(undie_accessory) + standing += mutable_appearance(undie_accessory.icon, undie_accessory.icon_state, -BODY_LAYER) + + if(standing.len) + overlays_standing[BODY_LAYER] = standing + + apply_overlay(BODY_LAYER) + +/mob/living/carbon/human/proc/update_eyes() + remove_overlay(EYES_LAYER) + if(HAS_TRAIT(src, TRAIT_HUSK) || HAS_TRAIT(src, TRAIT_INVISIBLE_MAN)) + return + var/obj/item/bodypart/head/noggin = get_bodypart(BODY_ZONE_HEAD) + if(!(noggin?.head_flags & HEAD_EYESPRITES)) + return + // 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/eyes/eye_organ = get_organ_slot(ORGAN_SLOT_EYES) + if(eye_organ) + eye_organ.refresh(call_update = FALSE) + overlays_standing[EYES_LAYER] = eye_organ.generate_body_overlay(src) + apply_overlay(EYES_LAYER) + +/// Updates face (as of now, only eye) offsets +/mob/living/carbon/human/update_face_offset() + var/list/eye_overlays = overlays_standing[EYES_LAYER] + + if(HAS_TRAIT(src, TRAIT_INVISIBLE_MAN) || HAS_TRAIT(src, TRAIT_HUSK) || !length(eye_overlays)) + return + + remove_overlay(EYES_LAYER) + + var/obj/item/bodypart/head/noggin = get_bodypart(BODY_ZONE_HEAD) + for (var/mutable_appearance/overlay as anything in eye_overlays) + overlay.pixel_w = 0 + overlay.pixel_z = 0 + noggin.worn_face_offset.apply_offset(overlay) + + overlays_standing[EYES_LAYER] = eye_overlays + apply_overlay(EYES_LAYER) + + // Only renders the head of the human /mob/living/carbon/human/proc/update_body_parts_head_only(update_limb_data) if(!dna?.species) @@ -907,7 +983,7 @@ generate/load female uniform sprites matching all previously decided variables // hardcoding this here until bodypart updating is more sane // we need to update clothing items that may have been affected by bodyshape updates if(check_shapes & BODYSHAPE_DIGITIGRADE) - for(var/obj/item/thing as anything in get_equipped_items()) + for(var/obj/item/thing as anything in get_equipped_items(INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT)) if(thing.slot_flags & ignore_slots) continue if(thing.supports_variations_flags & DIGITIGRADE_VARIATIONS) diff --git a/code/modules/mob/living/carbon/human/init_signals.dm b/code/modules/mob/living/carbon/human/init_signals.dm index 827716b91a6b..de58a63183a7 100644 --- a/code/modules/mob/living/carbon/human/init_signals.dm +++ b/code/modules/mob/living/carbon/human/init_signals.dm @@ -5,7 +5,7 @@ RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_DWARF), SIGNAL_REMOVETRAIT(TRAIT_DWARF)), PROC_REF(on_dwarf_trait)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_TOO_TALL), SIGNAL_REMOVETRAIT(TRAIT_TOO_TALL)), PROC_REF(on_tootall_trait)) - RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_FAT), SIGNAL_REMOVETRAIT(TRAIT_FAT)), PROC_REF(on_fat)) + RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_FAT), SIGNAL_REMOVETRAIT(TRAIT_FAT), SIGNAL_ADDTRAIT(TRAIT_FAT_IGNORE_SLOWDOWN), SIGNAL_REMOVETRAIT(TRAIT_FAT_IGNORE_SLOWDOWN)), PROC_REF(on_fat)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_NOHUNGER), SIGNAL_REMOVETRAIT(TRAIT_NOHUNGER)), PROC_REF(on_nohunger)) RegisterSignal(src, COMSIG_ATOM_CONTENTS_WEIGHT_CLASS_CHANGED, PROC_REF(check_pocket_weght)) @@ -15,6 +15,10 @@ RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_HUSK), SIGNAL_REMOVETRAIT(TRAIT_HUSK)), PROC_REF(refresh_obscured)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_INVISIBLE_MAN), SIGNAL_REMOVETRAIT(TRAIT_INVISIBLE_MAN)), PROC_REF(invisible_man_toggle)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_DISFIGURED), SIGNAL_REMOVETRAIT(TRAIT_DISFIGURED)), PROC_REF(update_visible_name)) + //DARKPACK EDIT ADD START - POWERS - (Obfuscate Discipline) + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_OBFUSCATED), PROC_REF(make_invisible)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_OBFUSCATED), PROC_REF(make_visible)) + //DARKPACK EDIT ADD END /// Gaining or losing [TRAIT_DWARF] updates our height and grants passtable /mob/living/carbon/human/proc/on_dwarf_trait(datum/source) @@ -34,10 +38,9 @@ /mob/living/carbon/human/proc/on_fat(datum/source) SIGNAL_HANDLER - hud_used?.hunger?.update_hunger_bar() - mob_mood?.update_nutrition_moodlets() + update_nutrition() - if(HAS_TRAIT(src, TRAIT_FAT)) + if(HAS_TRAIT(src, TRAIT_FAT) && !HAS_TRAIT(src, TRAIT_FAT_IGNORE_SLOWDOWN)) add_movespeed_modifier(/datum/movespeed_modifier/obesity) else remove_movespeed_modifier(/datum/movespeed_modifier/obesity) @@ -51,8 +54,7 @@ overeatduration = 0 remove_traits(list(TRAIT_FAT, TRAIT_OFF_BALANCE_TACKLER), OBESITY) else - hud_used?.hunger?.update_hunger_bar() - mob_mood?.update_nutrition_moodlets() + update_nutrition() /// Signal proc for [COMSIG_ATOM_CONTENTS_WEIGHT_CLASS_CHANGED] to check if an item is suddenly too heavy for our pockets /mob/living/carbon/human/proc/check_pocket_weght(datum/source, obj/item/changed, old_w_class, new_w_class) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index a2dfad08eeec..439ed75d5444 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -185,7 +185,6 @@ if(w_uniform) return w_uniform = equipping - update_suit_sensors() update_worn_undersuit() if(ITEM_SLOT_LPOCKET) l_store = equipping @@ -208,9 +207,6 @@ return not_handled //For future deeper overrides -/mob/living/carbon/human/get_equipped_speed_mod_items() - return ..() - list(l_store, r_store, s_store) - /mob/living/carbon/human/doUnEquip(obj/item/item_dropping, force, newloc, no_move, invdrop = TRUE, silent = FALSE) . = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should. if(!. || !item_dropping) @@ -227,7 +223,6 @@ update_worn_oversuit() else if(item_dropping == w_uniform) w_uniform = null - update_suit_sensors() if(!QDELETED(src)) update_worn_undersuit() if(invdrop) @@ -351,7 +346,7 @@ //delete all equipment without dropping anything /mob/living/carbon/human/proc/delete_equipment() - for(var/slot in get_equipped_items(INCLUDE_POCKETS))//order matters, dependant slots go first + for(var/slot in get_equipped_items(INCLUDE_POCKETS|INCLUDE_HELD))//order matters, dependant slots go first qdel(slot) for(var/obj/item/held_item in held_items) qdel(held_item) @@ -363,6 +358,9 @@ return var/obj/item/thing = get_active_held_item() var/obj/item/equipped_item = get_item_by_slot(slot_type) + var/thing_reject = NONE + if(thing) + thing_reject = SEND_SIGNAL(thing, COMSIG_HUMAN_NON_STORAGE_HOTKEY, src, equipped_item) if(!equipped_item) // We also let you equip an item like this if(!thing) to_chat(src, span_warning("You have no [slot_item_name] to take something out of!")) @@ -375,6 +373,8 @@ if(!thing) equipped_item.attack_hand(src) else + if(thing_reject & COMPONENT_STORAGE_HOTKEY_HANDLED) + return to_chat(src, span_warning("You can't fit [thing] into your [equipped_item.name]!")) return if(!storage.supports_smart_equip) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 7990bbb3219c..d659670c369a 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -54,7 +54,7 @@ var/head_covered = !get_bodypart(BODY_ZONE_HEAD) var/hands_covered = !get_bodypart(BODY_ZONE_L_ARM) && !get_bodypart(BODY_ZONE_R_ARM) var/feet_covered = !get_bodypart(BODY_ZONE_L_LEG) && !get_bodypart(BODY_ZONE_R_LEG) - for(var/obj/item/clothing/equipped in get_equipped_items()) + for(var/obj/item/clothing/equipped in get_equipped_items(INCLUDE_ABSTRACT)) if(!chest_covered && (equipped.body_parts_covered & CHEST) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE)) chest_covered = TRUE if(!head_covered && (equipped.body_parts_covered & HEAD) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE)) @@ -82,9 +82,9 @@ return human_lungs.check_breath(breath, src) if(health >= crit_threshold) - adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1) + adjust_oxy_loss(HUMAN_MAX_OXYLOSS + 1) else if(!HAS_TRAIT(src, TRAIT_NOCRITDAMAGE)) - adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) + adjust_oxy_loss(HUMAN_CRIT_MAX_OXYLOSS) failed_last_breath = TRUE @@ -294,10 +294,10 @@ return if(we_breath) - adjustOxyLoss(4 * seconds_per_tick) + adjust_oxy_loss(4 * seconds_per_tick) Unconscious(80) // Tissues die without blood circulation - adjustBruteLoss(1 * seconds_per_tick) + adjust_brute_loss(1 * seconds_per_tick) #undef THERMAL_PROTECTION_HEAD #undef THERMAL_PROTECTION_CHEST diff --git a/code/modules/mob/living/carbon/human/monkey.dm b/code/modules/mob/living/carbon/human/monkey.dm index 7d137585ee28..72c4aa4a5020 100644 --- a/code/modules/mob/living/carbon/human/monkey.dm +++ b/code/modules/mob/living/carbon/human/monkey.dm @@ -48,32 +48,20 @@ GLOBAL_DATUM(the_one_and_only_punpun, /mob/living/carbon/human/species/monkey/pu var/memory_saved = FALSE /mob/living/carbon/human/species/monkey/punpun/Initialize(mapload) - // 1 Pun Pun should exist - //REGISTER_REQUIRED_MAP_ITEM(1, 1) // DARKPACK EDIT REMOVAL + . = ..() + + // REGISTER_REQUIRED_MAP_ITEM(1, 1) // pun pun is required on maps. // DARKPACK EDIT REMOVAL if(mapload && (locate(/datum/station_trait/job/pun_pun) in SSstation.station_traits)) new /obj/effect/landmark/start/pun_pun(loc) //Pun Pun is a crewmember, and may late-join. return INITIALIZE_HINT_QDEL - Read_Memory() - - var/name_to_use = name - - if(ancestor_name) - name_to_use = ancestor_name - if(ancestor_chain > 1) - name_to_use += " \Roman[ancestor_chain]" - else if(prob(10)) - name_to_use = pick(list("Professor Bobo", "Deempisi's Revenge", "Furious George", "King Louie", "Dr. Zaius", "Jimmy Rustles", "Dinner", "Lanky")) - if(name_to_use == "Furious George") - ai_controller = /datum/ai_controller/monkey/angry //hes always mad - - . = ..() + Read_Memory() if(!GLOB.the_one_and_only_punpun && mapload) GLOB.the_one_and_only_punpun = src else if(GLOB.the_one_and_only_punpun) ADD_TRAIT(src, TRAIT_DONT_WRITE_MEMORY, INNATE_TRAIT) //faaaaaaake! - fully_replace_character_name(real_name, name_to_use) + give_special_name() //These have to be after the parent new to ensure that the monkey //bodyparts are actually created before we try to equip things to @@ -141,3 +129,20 @@ GLOBAL_DATUM(the_one_and_only_punpun, /mob/living/carbon/human/species/monkey/pu file_data["relic_mask"] = wear_mask ? wear_mask.type : null fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) + + +/// Gives pun pun a special name based on various factors +/mob/living/carbon/human/species/monkey/punpun/proc/give_special_name() + var/name_to_use = name + + if(ancestor_name) + name_to_use = ancestor_name + if(ancestor_chain > 1) + name_to_use += " \Roman[ancestor_chain]" + else if(prob(10)) + name_to_use = pick(list("Professor Bobo", "Deempisi's Revenge", "Furious George", "King Louie", "Dr. Zaius", "Jimmy Rustles", "Dinner", "Lanky")) + if(name_to_use == "Furious George") + qdel(ai_controller) + ai_controller = new /datum/ai_controller/monkey/angry(src) //hes always mad + + fully_replace_character_name(real_name, name_to_use) 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 77ba4b89d6d5..7178d569f014 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -3,6 +3,7 @@ id = SPECIES_ABDUCTOR sexes = FALSE inherent_traits = list( + TRAIT_ABDUCTOR_HUD, TRAIT_CHUNKYFINGERS_IGNORE_BATON, TRAIT_NEVER_WOUNDED, TRAIT_NOBLOOD, @@ -32,16 +33,6 @@ return "Abductors do not need to breathe, eat, do not have blood, a heart, stomach, or lungs and cannot be infected by human viruses. \ Their hardy physique prevents their skin from being wounded or dismembered, but their chunky tridactyl hands make it hard to operate human equipment." -/datum/species/abductor/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load, regenerate_icons) - . = ..() - var/datum/atom_hud/abductor_hud = GLOB.huds[DATA_HUD_ABDUCTOR] - abductor_hud.show_to(C) - -/datum/species/abductor/on_species_loss(mob/living/carbon/C) - . = ..() - var/datum/atom_hud/abductor_hud = GLOB.huds[DATA_HUD_ABDUCTOR] - abductor_hud.hide_from(C) - /datum/species/abductor/get_species_description() return "Abductors, colloquially known as \"Greys\" (or \"Grays\"), \ are, three fingered, pale skinned inquisitive aliens who can't communicate well to the average crew-member." 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 7375c2592439..36ae99d342c0 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -9,6 +9,7 @@ TRAIT_ADVANCEDTOOLUSER, // Normally applied by brain but we don't have one TRAIT_LITERATE, TRAIT_CAN_STRIP, + TRAIT_BRAINLESS_CARBON, ) bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left, @@ -42,8 +43,12 @@ . = ..() human.lose_hearing_sensitivity(TRAIT_GENERIC) RegisterSignal(human, COMSIG_CARBON_ATTACH_LIMB, PROC_REF(on_gained_part)) + RegisterSignal(human, COMSIG_CARBON_DEFIB_BRAIN_CHECK, PROC_REF(defib_check)) var/obj/item/bodypart/head/head = human.get_bodypart(BODY_ZONE_HEAD) + head.speech_span = null + if(isnull(human.drop_location())) + return head?.drop_limb() if(QDELETED(head)) //drop_limb() deletes the limb if no drop location exists and character setup dummies are located in nullspace. return @@ -54,16 +59,20 @@ var/obj/item/organ/eyes/eyes = new /obj/item/organ/eyes(head) eyes.eye_color_left = human.eye_color_left eyes.eye_color_right = human.eye_color_right - eyes.bodypart_insert(my_head) + eyes.bodypart_insert(head) human.update_body() + head.update_limb() head.update_icon_dropped() RegisterSignal(head, COMSIG_QDELETING, PROC_REF(on_head_destroyed)) + RegisterSignal(my_head, COMSIG_MOVABLE_MOVED, PROC_REF(on_relay_move)) /// If we gained a new body part, it had better not be a head /datum/species/dullahan/proc/on_gained_part(mob/living/carbon/human/dullahan, obj/item/bodypart/part) SIGNAL_HANDLER - if (part.body_zone != BODY_ZONE_HEAD) + if(part.body_zone != BODY_ZONE_HEAD) return + if(isnull(dullahan.drop_location())) + return // don't gib nullspace my_head = null dullahan.investigate_log("has been gibbed by having an illegal head put on [dullahan.p_their()] shoulders.", INVESTIGATE_DEATHS) dullahan.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. @@ -72,12 +81,24 @@ /datum/species/dullahan/proc/on_head_destroyed() SIGNAL_HANDLER var/mob/living/human = my_head?.owner - if (QDELETED(human)) + if(QDELETED(human)) return // guess we already died my_head = null human.investigate_log("has been gibbed by the loss of [human.p_their()] head.", INVESTIGATE_DEATHS) human.gib(DROP_ALL_REMAINS) +/// Head was butchered? No more dullahan +/datum/species/dullahan/proc/on_relay_move() + SIGNAL_HANDLER + if(QDELETED(my_head?.owner) || !isdullahan(my_head?.owner)) + return + my_head.owner.gib(DROP_ALL_REMAINS) + QDEL_NULL(my_head) + +/datum/species/dullahan/proc/defib_check(mob/living/carbon/human/human) + SIGNAL_HANDLER + return human.can_defib_brain(locate(/obj/item/organ/brain) in my_head.loc) || DEFIB_POSSIBLE + /datum/species/dullahan/on_species_loss(mob/living/carbon/human/human) . = ..() if(my_head) @@ -89,6 +110,7 @@ qdel(detached_head) UnregisterSignal(human, COMSIG_CARBON_ATTACH_LIMB) + UnregisterSignal(human, COMSIG_CARBON_DEFIB_BRAIN_CHECK) human.regenerate_limb(BODY_ZONE_HEAD, FALSE) human.become_hearing_sensitive() prevent_perspective_change = FALSE @@ -169,7 +191,8 @@ organ_flags = ORGAN_ORGANIC //not vital /obj/item/organ/tongue/dullahan - zone = "abstract" + zone = BODY_ZONE_CHEST + organ_flags = parent_type::organ_flags | ORGAN_UNREMOVABLE modifies_speech = TRUE /obj/item/organ/tongue/dullahan/handle_speech(datum/source, list/speech_args) @@ -179,17 +202,23 @@ var/datum/species/dullahan/dullahan_species = human.dna.species if(isobj(dullahan_species.my_head.loc)) var/obj/head = dullahan_species.my_head.loc - head.say(speech_args[SPEECH_MESSAGE], spans = speech_args[SPEECH_SPANS], sanitize = FALSE, language = speech_args[SPEECH_LANGUAGE], message_range = speech_args[SPEECH_RANGE]) + if(speech_args[SPEECH_MODS][WHISPER_MODE]) // whisper away + speech_args[SPEECH_SPANS] |= SPAN_ITALICS + head.say(speech_args[SPEECH_MESSAGE], spans = speech_args[SPEECH_SPANS], sanitize = FALSE, language = speech_args[SPEECH_LANGUAGE], message_range = speech_args[SPEECH_RANGE], message_mods = speech_args[SPEECH_MODS]) speech_args[SPEECH_MESSAGE] = "" /obj/item/organ/ears/dullahan - zone = "abstract" + zone = BODY_ZONE_CHEST + organ_flags = parent_type::organ_flags | ORGAN_UNREMOVABLE + decay_factor = 0 /obj/item/organ/eyes/dullahan name = "head vision" desc = "An abstraction." actions_types = list(/datum/action/item_action/organ_action/dullahan) - zone = "abstract" + zone = BODY_ZONE_CHEST + organ_flags = parent_type::organ_flags | ORGAN_UNREMOVABLE + decay_factor = 0 tint = INFINITY // to switch the vision perspective to the head on species_gain() without issue. /datum/action/item_action/organ_action/dullahan @@ -223,7 +252,7 @@ START_PROCESSING(SSobj, src) RegisterSignal(owner, COMSIG_CARBON_REGENERATE_LIMBS, PROC_REF(unlist_head)) RegisterSignal(owner, COMSIG_LIVING_REVIVE, PROC_REF(retrieve_head)) - RegisterSignal(owner, COMSIG_HUMAN_PREFS_APPLIED, PROC_REF(update_prefs_name)) + RegisterSignal(owner, COMSIG_HUMAN_PREFS_APPLIED, PROC_REF(on_prefs_loaded)) become_hearing_sensitive(ROUNDSTART_TRAIT) /obj/item/dullahan_relay/Destroy() @@ -231,32 +260,33 @@ owner = null return ..() -/obj/item/dullahan_relay/process() - if(istype(loc, /obj/item/bodypart/head) && !QDELETED(owner)) - return - qdel(src) - return PROCESS_KILL - /// Updates our names after applying name prefs -/obj/item/dullahan_relay/proc/update_prefs_name(mob/living/carbon/human/wearer) +/obj/item/dullahan_relay/proc/on_prefs_loaded(mob/living/carbon/human/headless) SIGNAL_HANDLER var/obj/item/bodypart/head/detached_head = loc if (!istype(detached_head)) return // It's so over - detached_head.real_name = wearer.real_name - detached_head.name = wearer.real_name + detached_head.real_name = headless.real_name + detached_head.name = headless.real_name + name = headless.real_name + detached_head.voice = headless.voice + detached_head.pitch = pitch var/obj/item/organ/brain/brain = locate(/obj/item/organ/brain) in detached_head - brain.name = "[wearer.name]'s brain" + brain.name = "[headless.name]'s brain" -/obj/item/dullahan_relay/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) - . = ..() - owner?.Hear(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods, message_range) + detached_head.copy_appearance_from(headless, overwrite_eyes = TRUE) + detached_head.update_icon_dropped() -///Adds the owner to the list of hearers in hearers_in_view(), for visible/hearable on top of say messages -/obj/item/dullahan_relay/proc/include_owner(datum/source, list/hearers) - SIGNAL_HANDLER - if(!QDELETED(owner)) - hearers += owner +/obj/item/dullahan_relay/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/item/dullahan_relay/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) + . = ..() + var/dist = get_dist(speaker, src) - message_range + if(dist > 0 && dist <= EAVESDROP_EXTRA_RANGE) + raw_message = stars(raw_message) + if(message_range != INFINITY && dist > EAVESDROP_EXTRA_RANGE) + return FALSE + if(!owner) + return FALSE + return owner.Hear(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods, message_range = INFINITY) ///Stops dullahans from gibbing when regenerating limbs /obj/item/dullahan_relay/proc/unlist_head(datum/source, list/excluded_zones) @@ -273,13 +303,3 @@ var/turf/body_turf = get_turf(owner) if(head && istype(head) && body_turf && !(head in owner.get_all_contents())) head.forceMove(body_turf) - -/obj/item/dullahan_relay/Destroy() - if(!QDELETED(owner)) - var/mob/living/carbon/human/human = owner - if(isdullahan(human)) - var/datum/species/dullahan/dullahan_species = human.dna.species - dullahan_species.my_head = null - owner.gib(DROP_ALL_REMAINS) - owner = null - return ..() 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 7ebdea3c0677..28f676cb13f9 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -6,6 +6,7 @@ mutantbrain = /obj/item/organ/brain/felinid mutanttongue = /obj/item/organ/tongue/cat mutantears = /obj/item/organ/ears/cat + mutanteyes = /obj/item/organ/eyes/felinid mutant_organs = list( /obj/item/organ/tail/cat = "Cat", ) @@ -24,86 +25,17 @@ /// Yummy! species_cookie = /obj/item/food/nugget -/datum/species/human/felinid/on_species_gain(mob/living/carbon/carbon_being, datum/species/old_species, pref_load, regenerate_icons) - if(ishuman(carbon_being)) - var/mob/living/carbon/human/target_human = carbon_being - if(!pref_load) //Hah! They got forcefully purrbation'd. Force default felinid parts on them if they have no mutant parts in those areas! - target_human.dna.features[FEATURE_TAIL] = "Cat" - if(target_human.dna.features[FEATURE_EARS] == "None") - target_human.dna.features[FEATURE_EARS] = "Cat" - if(target_human.dna.features[FEATURE_EARS] == "None") - mutantears = /obj/item/organ/ears - else - var/obj/item/organ/ears/cat/ears = new(FALSE, target_human.dna.features[FEATURE_EARS]) - ears.Insert(target_human, movement_flags = DELETE_IF_REPLACED) - return ..() - -/datum/species/human/felinid/randomize_features(mob/living/carbon/human/human_mob) - var/list/features = ..() - features[FEATURE_EARS] = pick("None", "Cat") - return features - -/datum/species/human/felinid/get_laugh_sound(mob/living/carbon/human/felinid) - if(felinid.physique == FEMALE) - return 'sound/mobs/humanoids/human/laugh/womanlaugh.ogg' - return pick( - 'sound/mobs/humanoids/human/laugh/manlaugh1.ogg', - 'sound/mobs/humanoids/human/laugh/manlaugh2.ogg', - ) - - -/datum/species/human/felinid/get_cough_sound(mob/living/carbon/human/felinid) - if(felinid.physique == FEMALE) - return pick( - 'sound/mobs/humanoids/human/cough/female_cough1.ogg', - 'sound/mobs/humanoids/human/cough/female_cough2.ogg', - 'sound/mobs/humanoids/human/cough/female_cough3.ogg', - 'sound/mobs/humanoids/human/cough/female_cough4.ogg', - 'sound/mobs/humanoids/human/cough/female_cough5.ogg', - 'sound/mobs/humanoids/human/cough/female_cough6.ogg', - ) - return pick( - 'sound/mobs/humanoids/human/cough/male_cough1.ogg', - 'sound/mobs/humanoids/human/cough/male_cough2.ogg', - 'sound/mobs/humanoids/human/cough/male_cough3.ogg', - 'sound/mobs/humanoids/human/cough/male_cough4.ogg', - 'sound/mobs/humanoids/human/cough/male_cough5.ogg', - 'sound/mobs/humanoids/human/cough/male_cough6.ogg', - ) - +/datum/species/human/felinid/on_species_gain(mob/living/carbon/human/human_who_gained_species, datum/species/old_species, pref_load, regenerate_icons = TRUE, replace_missing = TRUE) + if(!pref_load) //Hah! They got forcefully purrbation'd. Force default felinid parts on them if they have no mutant parts in those areas! + if(human_who_gained_species.dna.features[FEATURE_TAIL_CAT] == SPRITE_ACCESSORY_NONE) + human_who_gained_species.dna.features[FEATURE_TAIL_CAT] = get_consistent_feature_entry(SSaccessories.feature_list[FEATURE_TAIL_CAT]) + if(human_who_gained_species.dna.features[FEATURE_EARS] == SPRITE_ACCESSORY_NONE) + human_who_gained_species.dna.features[FEATURE_EARS] = get_consistent_feature_entry(SSaccessories.feature_list[FEATURE_EARS]) -/datum/species/human/felinid/get_cry_sound(mob/living/carbon/human/felinid) - if(felinid.physique == FEMALE) - return pick( - 'sound/mobs/humanoids/human/cry/female_cry1.ogg', - 'sound/mobs/humanoids/human/cry/female_cry2.ogg', - ) - return pick( - 'sound/mobs/humanoids/human/cry/male_cry1.ogg', - 'sound/mobs/humanoids/human/cry/male_cry2.ogg', - 'sound/mobs/humanoids/human/cry/male_cry3.ogg', - ) - - -/datum/species/human/felinid/get_sneeze_sound(mob/living/carbon/human/felinid) - if(felinid.physique == FEMALE) - return 'sound/mobs/humanoids/human/sneeze/female_sneeze1.ogg' - return 'sound/mobs/humanoids/human/sneeze/male_sneeze1.ogg' - -/datum/species/human/felinid/get_sigh_sound(mob/living/carbon/human/felinid) - if(felinid.physique == FEMALE) - return SFX_FEMALE_SIGH - return SFX_MALE_SIGH - -/datum/species/human/felinid/get_sniff_sound(mob/living/carbon/human/felinid) - if(felinid.physique == FEMALE) - return 'sound/mobs/humanoids/human/sniff/female_sniff.ogg' - return 'sound/mobs/humanoids/human/sniff/male_sniff.ogg' - -/datum/species/human/felinid/get_snore_sound(mob/living/carbon/human/felinid) - if(felinid.physique == FEMALE) - return SFX_SNORE_FEMALE - return SFX_SNORE_MALE + // Swapping out feline ears for normal ol' human ears if they have invisible cat ears. + if(human_who_gained_species.dna.features[FEATURE_EARS] == SPRITE_ACCESSORY_NONE) + mutantears = /obj/item/organ/ears + return ..() /datum/species/human/felinid/get_hiss_sound(mob/living/carbon/human/felinid) return 'sound/mobs/humanoids/felinid/felinid_hiss.ogg' 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 779211204683..014dd1a69cd5 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -8,8 +8,11 @@ TRAIT_NEVER_WOUNDED, TRAIT_NOBLOOD, TRAIT_NOBREATH, + TRAIT_NOCRITDAMAGE, TRAIT_NODISMEMBER, + TRAIT_NOFAT, TRAIT_NOFIRE, + TRAIT_NOSOFTCRIT, TRAIT_NO_AUGMENTS, TRAIT_NO_DNA_COPY, TRAIT_NO_PLASMA_TRANSFORM, @@ -22,7 +25,6 @@ mutantheart = null mutantlungs = null inherent_biotypes = MOB_HUMANOID|MOB_MINERAL - 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 @@ -50,6 +52,205 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem, ) + /// Have we warned the mob about low nutrition? + VAR_FINAL/early_warning = FALSE + /// Have we given the final warning about starvation? + VAR_FINAL/final_warning = FALSE + /// Cooldown of warning message so we don't spam it if we flick around the threshold + COOLDOWN_DECLARE(warning_cd) + +/datum/species/golem/on_species_gain(mob/living/carbon/human/human_who_gained_species, datum/species/old_species, pref_load, regenerate_icons, replace_missing) + . = ..() + RegisterSignal(human_who_gained_species, COMSIG_MOB_AFTER_APPLY_DAMAGE, PROC_REF(drain_nutrition)) + RegisterSignal(human_who_gained_species, COMSIG_LIVING_UPDATE_NUTRITION, PROC_REF(check_nutrition)) + RegisterSignal(human_who_gained_species, COMSIG_CARBON_DEFIB_HEART_CHECK, PROC_REF(defib_check)) + RegisterSignal(human_who_gained_species, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(rebuild_check)) + RegisterSignal(human_who_gained_species, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + // nutrition = health, so give people a head start + human_who_gained_species.set_nutrition(NUTRITION_LEVEL_WELL_FED) + + human_who_gained_species.physiology.stamina_mod *= 0.6 + human_who_gained_species.physiology.stun_mod *= 0.6 + human_who_gained_species.physiology.knockdown_mod *= 1.2 + +/datum/species/golem/on_species_loss(mob/living/carbon/human/human_who_lost_species, datum/species/new_species, pref_load) + . = ..() + UnregisterSignal(human_who_lost_species, list( + COMSIG_MOB_AFTER_APPLY_DAMAGE, + COMSIG_LIVING_UPDATE_NUTRITION, + COMSIG_CARBON_DEFIB_HEART_CHECK, + COMSIG_ATOM_ITEM_INTERACTION, + COMSIG_ATOM_EXAMINE, + )) + + human_who_lost_species.physiology.stamina_mod /= 0.6 + human_who_lost_species.physiology.stun_mod /= 0.6 + human_who_lost_species.physiology.knockdown_mod /= 1.2 + +/datum/species/golem/spec_life(mob/living/carbon/human/source, seconds_per_tick, times_fired) + . = ..() + if(source.nutrition <= 20) + // this is "hard crit" for golems + source.Unconscious(1.5 SECONDS * seconds_per_tick) + if(source.nutrition <= 100 || source.health < source.crit_threshold) + // and this is "crit damage" for golems + var/drain = 1 + if(source.nutrition <= 50) + drain *= 2 + if(source.health < source.crit_threshold) + drain *= 2 + source.adjust_nutrition(-1 * drain * seconds_per_tick, forced = TRUE) + if(source.nutrition > NUTRITION_LEVEL_FAT) + // nutrition is health so let's keep this sane + source.set_nutrition(NUTRITION_LEVEL_FAT) + +/datum/species/golem/proc/on_examine(mob/living/carbon/human/source, mob/living/examiner, list/examine_text) + SIGNAL_HANDLER + + if(source.appears_alive()) + return + + examine_text += span_warning("This golem appears to be in a state of disrepair. \ + It may be possible to rebuild it by adding minerals into its form.") + +/datum/species/golem/proc/rebuild_check(mob/living/carbon/human/source, mob/living/user, obj/item/tool, ...) + SIGNAL_HANDLER + + if(source.appears_alive()) + return NONE + + if(!isstack(tool) || !is_type_in_list(tool, GLOB.golem_stack_food_directory)) + return NONE + + INVOKE_ASYNC(src, PROC_REF(rebuild), source, user, tool) + return ITEM_INTERACT_SUCCESS + +/datum/species/golem/proc/rebuild(mob/living/carbon/human/source, mob/living/user, obj/item/stack/mats) + source.notify_revival("You are being rebuilt by [user.real_name]!") + var/brute_ready = source.get_brute_loss() < 50 + var/burn_ready = source.get_fire_loss() < 50 + var/nutrition_ready = source.nutrition > NUTRITION_LEVEL_VERY_HUNGRY + + while(check_rebuild(source, user, mats)) + user.visible_message( + span_notice("[user] uses some of [mats] to rebuild [source]'s form."), + span_notice("You use some of [mats] to rebuild [source]'s form."), + ) + + var/do_after_time = 2 SECONDS + if(brute_ready && burn_ready && nutrition_ready && source.can_be_revived()) + do_after_time *= 4 + user.show_message(span_notice("[source] looks almost fully rebuilt, this will take a bit longer..."), MSG_VISUAL) + if(HAS_TRAIT(user, TRAIT_QUICK_BUILD)) + do_after_time *= 0.75 + + if(!do_after(user, do_after_time, source, extra_checks = CALLBACK(src, PROC_REF(check_rebuild), source, user, mats) ) ) + return + + // calculated "effective sheet power" based on mats + // ex. iron sheets will have a power of 1, reinforced glass a power of 1.5 + var/mat_power = 0 + for(var/mat, mat_amt in mats.custom_materials) + mat_power += mat_amt + mat_power /= mats.amount // mats per sheet + mat_power /= SHEET_MATERIAL_AMOUNT // normalize + + mats.use(1) + source.heal_ordered_damage(mat_power * 5, list(BRUTE, BURN)) + source.adjust_nutrition(mat_power * 20) + if(!brute_ready) + if(source.get_brute_loss() < 50) + user.show_message(span_notice("[source] looks sturdier than ever! It's not long now..."), MSG_VISUAL) + brute_ready = TRUE + continue + if(!burn_ready) + if(source.get_fire_loss() < 50) + user.show_message(span_notice("[source] seems to be regaining its integrity! Just a bit more..."), MSG_VISUAL) + burn_ready = TRUE + continue + if(!nutrition_ready) + if(source.nutrition > NUTRITION_LEVEL_HUNGRY) + user.show_message(span_notice("[source] seems to be stabilizing its form! Almost there..."), MSG_VISUAL) + nutrition_ready = TRUE + continue + + if(source.revive(excess_healing = 10)) // give a bit of organ/tox/oxy healing for free + source.visible_message( + span_notice("[source] stabilizes and reforms into a functional state!"), + span_boldnotice("You stabilize and reform into a functional state!"), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + source.set_resting(FALSE, silent = TRUE, instant = TRUE) + return + +/datum/species/golem/proc/check_rebuild(mob/living/carbon/human/source, mob/living/user, obj/item/stack/mats) + if(source.stat != DEAD) + return FALSE + if(QDELETED(user)) + return FALSE + if(QDELETED(mats) || mats.amount < 1) + return FALSE + if(!user.is_holding(mats)) + return FALSE + return TRUE + +/datum/species/golem/proc/defib_check(mob/living/carbon/human/source, mob/living/carbon/human/defib_user) + SIGNAL_HANDLER + + // golems can't be defibrillated, they have no heart and aren't even alive in the traditional sense + // you gotta rebuild them with materials if they fall apart + return DEFIB_FAIL_GOLEM + +/datum/species/golem/proc/drain_nutrition(mob/living/carbon/human/source, damage_amt, damage_type, ...) + SIGNAL_HANDLER + + // our brute and burn damage is more than halved by our limbs + // the other "half" of the damage is converted into nutrition loss (representing loss of rock material) + if(damage_type != BURN && damage_type != BRUTE) + return + + source.adjust_nutrition(round(-3 * damage_amt, 0.01), forced = TRUE) + +/datum/species/golem/proc/check_nutrition(mob/living/carbon/human/source) + SIGNAL_HANDLER + + if(source.nutrition < NUTRITION_LEVEL_STARVING) + if(!early_warning && COOLDOWN_FINISHED(src, warning_cd) && source.stat < UNCONSCIOUS) + source.visible_message( + span_warning("[source] shudders weakly as their form begins to destabilize!"), + span_bolddanger("You feel your form destabilizing as you run low on material to sustain yourself! \ + Find some minerals to eat soon, or you may crumble!"), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + early_warning = TRUE + COOLDOWN_START(src, warning_cd, 1 MINUTES) + + else + early_warning = FALSE + + if(source.nutrition < 50) + if(!final_warning && COOLDOWN_FINISHED(src, warning_cd) && source.stat < UNCONSCIOUS) + source.visible_message( + span_warning("[source] looks like they're on the verge of falling apart!"), + span_userdanger("Your form shudders violently as you near complete destabilization! \ + Eat some minerals quickly, or you may crumble!"), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + final_warning = TRUE + COOLDOWN_START(src, warning_cd, 1 MINUTES) + + else + final_warning = FALSE + + if(source.nutrition < 2 && source.stat != DEAD) + source.visible_message( + span_warning("[source] shudders and crumbles into a pile of inert rocks!"), + span_userdanger("You run our of material to sustain your animated form, and crumble into a pile of inert rocks!"), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + source.investigate_log("starved to death as a golem", INVESTIGATE_DEATHS) + source.death() + /datum/species/golem/get_physical_attributes() return "Golems are hardy creatures made out of stone, which are thus naturally resistant to many dangers, including asphyxiation, fire, radiation, electricity, and viruses.\ They gain special abilities depending on the type of material consumed, but they need to consume material to keep their body animated." 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 a0d132e3d1ea..7c370bcfcf13 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -123,7 +123,7 @@ hypercorporations buy the senate votes they need and establish territory far past the Earth Government's reach. \ In hypercorporation territory company policy is law, giving new meaning to \"employee termination\".", ) - +/* // DARKPACK EDIT REMOVAL START - (We aren't using the AI, so this is currently useless and immersion breaking) /datum/species/human/create_pref_unique_perks() var/list/to_add = list() @@ -147,3 +147,4 @@ )) return to_add +*/ // DARKPACK EDIT REMOVAL END 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 0cff7a90fdc5..32667735f8ef 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -63,22 +63,29 @@ if(slime.stat == DEAD) return HANDLE_BLOOD_HANDLED - if(slime.blood_volume <= 0) - slime.blood_volume += JELLY_REGEN_RATE_EMPTY * slime.physiology.blood_regen_mod * seconds_per_tick - slime.adjustBruteLoss(2.5 * seconds_per_tick) + // In the following code, do not cache blood volumes. + // They are repeadetly updated and caching can introduce bugs. + + // Blood regen thresholds use your real amount of blood. + if(slime.get_blood_volume() <= 0) + slime.adjust_blood_volume(JELLY_REGEN_RATE_EMPTY * slime.physiology.blood_regen_mod * seconds_per_tick) + slime.adjust_brute_loss(2.5 * seconds_per_tick) to_chat(slime, span_danger("You feel empty!")) - if(slime.blood_volume < BLOOD_VOLUME_NORMAL) + // Same logic applies here. + if(slime.get_blood_volume() < BLOOD_VOLUME_NORMAL) if(slime.nutrition >= NUTRITION_LEVEL_STARVING) - slime.blood_volume += JELLY_REGEN_RATE * slime.physiology.blood_regen_mod * seconds_per_tick - if(slime.blood_volume <= BLOOD_VOLUME_LOSE_NUTRITION) // don't lose nutrition if we are above a certain threshold, otherwise slimes on IV drips will still lose nutrition + slime.adjust_blood_volume(JELLY_REGEN_RATE * slime.physiology.blood_regen_mod * seconds_per_tick) + if(slime.get_blood_volume() <= BLOOD_VOLUME_LOSE_NUTRITION) // don't lose nutrition if we are above a certain threshold, otherwise slimes on IV drips will still lose nutrition slime.adjust_nutrition(-1.25 * seconds_per_tick) - if(slime.blood_volume < BLOOD_VOLUME_OKAY) + // If you're on saline, you don't feel the effects of bloodloss. + if(slime.get_blood_volume(apply_modifiers = TRUE) < BLOOD_VOLUME_OKAY) if(SPT_PROB(2.5, seconds_per_tick)) to_chat(slime, span_danger("You feel drained!")) - if(slime.blood_volume < BLOOD_VOLUME_BAD) + // Saline can prevent you from cannibalizing yourself. + if(slime.get_blood_volume(apply_modifiers = TRUE) < BLOOD_VOLUME_BAD) Cannibalize_Body(slime) regenerate_limbs?.build_all_button_icons(UPDATE_BUTTON_STATUS) @@ -96,7 +103,7 @@ consumed_limb.drop_limb() to_chat(H, span_userdanger("Your [consumed_limb] is drawn back into your body, unable to maintain its shape!")) qdel(consumed_limb) - H.blood_volume += 20 * H.physiology.blood_regen_mod + H.adjust_blood_volume(20 * H.physiology.blood_regen_mod) /datum/species/jelly/get_species_description() return "Jellypeople are a strange and alien species with three eyes, made entirely out of gel." @@ -136,6 +143,8 @@ background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" + var/blood_per_limb = 40 + /datum/action/innate/regenerate_limbs/IsAvailable(feedback = FALSE) . = ..() if(!.) @@ -144,7 +153,7 @@ var/list/limbs_to_heal = H.get_missing_limbs() if(!length(limbs_to_heal)) return FALSE - if(H.blood_volume >= BLOOD_VOLUME_OKAY+40) + if(H.get_blood_volume() >= BLOOD_VOLUME_OKAY + blood_per_limb) return TRUE /datum/action/innate/regenerate_limbs/Activate() @@ -154,17 +163,17 @@ to_chat(H, span_notice("You feel intact enough as it is.")) return to_chat(H, span_notice("You focus intently on your missing [length(limbs_to_heal) >= 2 ? "limbs" : "limb"]...")) - if(H.blood_volume >= 40*length(limbs_to_heal)+BLOOD_VOLUME_OKAY) + if(H.get_blood_volume() >= blood_per_limb * length(limbs_to_heal) + BLOOD_VOLUME_OKAY) H.regenerate_limbs() - H.blood_volume -= 40*length(limbs_to_heal) + H.adjust_blood_volume(-blood_per_limb * length(limbs_to_heal)) to_chat(H, span_notice("...and after a moment you finish reforming!")) return - else if(H.blood_volume >= 40)//We can partially heal some limbs - while(H.blood_volume >= BLOOD_VOLUME_OKAY+40) + else if(H.get_blood_volume() >= blood_per_limb)//We can partially heal some limbs + while(H.get_blood_volume() >= BLOOD_VOLUME_OKAY + blood_per_limb) var/healed_limb = pick(limbs_to_heal) H.regenerate_limb(healed_limb) limbs_to_heal -= healed_limb - H.blood_volume -= 40 + H.adjust_blood_volume(-blood_per_limb) to_chat(H, span_warning("...but there is not enough of you to fix everything! You must attain more mass to heal completely!")) return to_chat(H, span_warning("...but there is not enough of you to go around! You must attain more mass to heal!")) @@ -205,7 +214,7 @@ bodies -= C // This means that the other bodies maintain a link // so if someone mindswapped into them, they'd still be shared. bodies = null - C.blood_volume = min(C.blood_volume, BLOOD_VOLUME_NORMAL) + C.set_blood_volume(C.get_blood_volume(), maximum = BLOOD_VOLUME_NORMAL) UnregisterSignal(C, COMSIG_LIVING_DEATH) ..() @@ -248,13 +257,13 @@ /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(H.get_blood_volume() >= BLOOD_VOLUME_SLIME_SPLIT) if(SPT_PROB(2.5, seconds_per_tick)) to_chat(H, span_notice("You feel very bloated!")) else if(H.nutrition >= NUTRITION_LEVEL_WELL_FED) - H.blood_volume += 1.5 * seconds_per_tick - if(H.blood_volume <= BLOOD_VOLUME_LOSE_NUTRITION) + H.adjust_blood_volume(1.5 * seconds_per_tick) + if(H.get_blood_volume() <= BLOOD_VOLUME_LOSE_NUTRITION) H.adjust_nutrition(-1.25 * seconds_per_tick) /datum/action/innate/split_body @@ -270,7 +279,7 @@ if(!.) return var/mob/living/carbon/human/H = owner - if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT) + if(H.get_blood_volume() >= BLOOD_VOLUME_SLIME_SPLIT) return TRUE return FALSE @@ -287,7 +296,7 @@ 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) + if(H.get_blood_volume() >= BLOOD_VOLUME_SLIME_SPLIT) make_dupe() else to_chat(H, span_warning("...but there is not enough of you to go around! You must attain more mass to split!")) @@ -311,7 +320,7 @@ spare.updateappearance(mutcolor_update=1) spare.Move(get_step(H.loc, pick(NORTH,SOUTH,EAST,WEST))) - H.blood_volume *= 0.45 + H.set_blood_volume(H.get_blood_volume() * 0.45) REMOVE_TRAIT(H, TRAIT_NO_TRANSFORM, REF(src)) var/datum/species/jelly/slime/origin_datum = H.dna.species @@ -390,7 +399,7 @@ occupied = "available" L["status"] = stat - L["exoticblood"] = body.blood_volume + L["exoticblood"] = body.get_blood_volume() L["name"] = body.name L["ref"] = "[REF(body)]" L["occupied"] = occupied 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 e0f18165c3c1..9fb6c37dd227 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -52,7 +52,7 @@ /datum/species/lizard/randomize_features() var/list/features = ..() - features[FEATURE_LIZARD_MARKINGS] = pick(SSaccessories.lizard_markings_list) + features[FEATURE_LIZARD_MARKINGS] = pick(SSaccessories.feature_list[FEATURE_LIZARD_MARKINGS]) return features /datum/species/lizard/get_scream_sound(mob/living/carbon/human/lizard) 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 3eaa7346fdcc..4b410f52ee71 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -45,7 +45,7 @@ /datum/species/moth/randomize_features() var/list/features = ..() - features[FEATURE_MOTH_MARKINGS] = pick(SSaccessories.moth_markings_list) + features[FEATURE_MOTH_MARKINGS] = pick(SSaccessories.feature_list[FEATURE_MOTH_MARKINGS]) return features /datum/species/moth/get_scream_sound(mob/living/carbon/human/moth) 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 9d0797e0b04e..3478672772b3 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -59,9 +59,7 @@ zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_EXTERNAL_POD_HAIR - preference = "feature_mushperson_cap" - - dna_block = /datum/dna_block/feature/mush_cap + dna_block = /datum/dna_block/feature/accessory/mush_cap restyle_flags = EXTERNAL_RESTYLE_PLANT bodypart_overlay = /datum/bodypart_overlay/mutant/mushroom_cap @@ -74,9 +72,6 @@ feature_key = FEATURE_MUSH_CAP dyable = TRUE -/datum/bodypart_overlay/mutant/mushroom_cap/get_global_feature_list() - return SSaccessories.caps_list - /datum/bodypart_overlay/mutant/mushroom_cap/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) return !(bodypart_owner.owner?.obscured_slots & HIDEHAIR) 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 f6864ac0d4c3..5878263ab3c4 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -16,7 +16,7 @@ TRAIT_UNHUSKABLE, ) - inherent_biotypes = MOB_HUMANOID|MOB_MINERAL + inherent_biotypes = MOB_HUMANOID|MOB_MINERAL|MOB_SKELETAL inherent_respiration_type = RESPIRATION_PLASMA mutantlungs = /obj/item/organ/lungs/plasmaman smoker_lungs = /obj/item/organ/lungs/plasmaman/plasmaman_smoker 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 d96f9587f913..205a364e22d3 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -111,6 +111,7 @@ name = "shadowling tumor" desc = "Something that was once a brain, before being remolded by a shadowling. It has adapted to the dark, irreversibly." icon = 'icons/obj/medical/organs/shadow_organs.dmi' + shade_color = "grey-ish" /datum/species/shadow/get_scream_sound(mob/living/carbon/human/moth) return 'sound/mobs/humanoids/shadow/shadow_wail.ogg' 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 6594fb2ba8e4..ad5ef52c4f6f 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -24,7 +24,7 @@ TRAIT_XENO_IMMUNE, ) inherent_factions = list(FACTION_SKELETON) - inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID + inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID|MOB_SKELETAL mutanttongue = /obj/item/organ/tongue/bone mutantstomach = /obj/item/organ/stomach/bone mutantappendix = null 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 3fd0212c2847..ec80fe52dee2 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -10,9 +10,6 @@ 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, ) @@ -43,30 +40,32 @@ else RegisterSignal(new_vampire, COMSIG_MOB_HUD_CREATED, PROC_REF(on_hud_created)) -/datum/species/human/vampire/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) +/datum/species/human/vampire/on_species_loss(mob/living/carbon/human/old_vampire, datum/species/new_species, pref_load) . = ..() - UnregisterSignal(C, COMSIG_ATOM_ATTACKBY) - QDEL_NULL(blood_display) + UnregisterSignal(old_vampire, COMSIG_ATOM_ATTACKBY) + if(blood_display) + old_vampire.hud_used.infodisplay -= blood_display + QDEL_NULL(blood_display) /datum/species/human/vampire/spec_life(mob/living/carbon/human/vampire, seconds_per_tick, times_fired) . = ..() if(istype(vampire.loc, /obj/structure/closet/crate/coffin)) 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.adjust_tox_loss(-2 * seconds_per_tick, updating_health = FALSE,) + need_mob_update += vampire.adjust_oxy_loss(-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) + vampire.adjust_blood_volume(-0.125 * seconds_per_tick) + if(vampire.get_blood_volume(apply_modifiers = TRUE) <= BLOOD_VOLUME_SURVIVE) to_chat(vampire, span_danger("You ran out of blood!")) vampire.investigate_log("has been dusted by a lack of blood (vampire).", INVESTIGATE_DEATHS) vampire.dust() var/area/A = get_area(vampire) if(istype(A, /area/station/service/chapel)) to_chat(vampire, span_warning("You don't belong here!")) - vampire.adjustFireLoss(10 * seconds_per_tick) + vampire.adjust_fire_loss(10 * seconds_per_tick) vampire.adjust_fire_stacks(3 * seconds_per_tick) vampire.ignite_mob() @@ -160,14 +159,63 @@ return to_add /obj/item/organ/tongue/vampire - name = "vampire tongue" + name = "vampire teeth" + desc = "The only thing with which it's acceptable to say \"I will suck you dry!\"" + icon_state = "tongue_vampire" actions_types = list(/datum/action/item_action/organ_action/vampire) - color = COLOR_CRAYON_BLACK + organ_traits = list( + TRAIT_SPEAKS_CLEARLY, + TRAIT_DRINKS_BLOOD, + // future todo : tie nobreath and nohunger to a vampire organ set bonus + TRAIT_NOBREATH, + TRAIT_NOHUNGER, + ) COOLDOWN_DECLARE(drain_cooldown) +/obj/item/organ/tongue/vampire/on_mob_insert(mob/living/carbon/receiver, special, movement_flags) + . = ..() + RegisterSignal(receiver, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(stab_bloodbag)) + +/obj/item/organ/tongue/vampire/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags) + . = ..() + UnregisterSignal(organ_owner, COMSIG_ATOM_ITEM_INTERACTION) + +/obj/item/organ/tongue/vampire/proc/stab_bloodbag(mob/living/source, mob/living/user, obj/item/used_item, list/modifiers) + SIGNAL_HANDLER + + if(user != source) + return NONE + if(!istype(used_item, /obj/item/reagent_containers/blood)) + return NONE + if(used_item.reagents?.total_volume <= 0) + to_chat(user, span_warning("[src] is empty!")) + return ITEM_INTERACT_BLOCKING + + user.visible_message( + span_notice("[user] stabs [used_item] with [user.p_their()] sharp teeth and drains its contents!"), + span_notice("You stab [used_item] with your sharp teeth and drain its contents!"), + span_hear("You hear a stabbing sound! ... Followed by slurping?"), + COMBAT_MESSAGE_RANGE, + ) + INVOKE_ASYNC(src, PROC_REF(async_stab_bloodbag), user, used_item) + return ITEM_INTERACT_BLOCKING + +/obj/item/organ/tongue/vampire/proc/async_stab_bloodbag(mob/living/carbon/user, obj/item/reagent_containers/blood/bloodbag, time = 0.5 SECONDS) + if(!do_after(user, time, bloodbag)) + return + + to_chat(user, span_notice("You swallow a gulp of [src].")) + playsound(bloodbag, 'sound/items/drink.ogg', 50, TRUE) //slurp + bloodbag.reagents.trans_to(user, bloodbag.reagents.maximum_volume * 0.05, transferred_by = user, methods = INGEST) + if(bloodbag.reagents.total_volume > 0) + async_stab_bloodbag(user, bloodbag, 1 SECONDS) + /datum/action/item_action/organ_action/vampire name = "Drain Victim" desc = "Leech blood from any carbon victim you are passively grabbing." + button_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "drain_victim" + background_icon_state = "bg_vampire" /datum/action/item_action/organ_action/vampire/do_effect(trigger_flags) if(!iscarbon(owner)) @@ -183,14 +231,14 @@ return FALSE var/mob/living/carbon/victim = user.pulling - if(user.blood_volume >= BLOOD_VOLUME_MAXIMUM) + if(user.get_blood_volume() >= BLOOD_VOLUME_MAXIMUM) to_chat(user, span_warning("You're already full!")) return FALSE if(victim.stat == DEAD) to_chat(user, span_warning("You need a living victim!")) return FALSE var/blood_name = LOWER_TEXT(user.get_bloodtype()?.get_blood_name()) - if(!victim.blood_volume || victim.get_blood_reagent() != user.get_blood_reagent()) + if(!victim.get_blood_volume() || victim.get_blood_reagent() != user.get_blood_reagent()) if (blood_name) to_chat(user, span_warning("[victim] doesn't have [blood_name]!")) else @@ -207,20 +255,27 @@ return FALSE if(!do_after(user, 3 SECONDS, target = victim, hidden = TRUE)) return FALSE - var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - user.blood_volume //How much capacity we have left to absorb blood - var/drained_blood = min(victim.blood_volume, VAMP_DRAIN_AMOUNT, blood_volume_difference) + victim.show_message(span_danger("[user] is draining your blood!")) to_chat(user, span_notice("You drain some blood!")) playsound(user, 'sound/items/drink.ogg', 30, TRUE, -2) - victim.blood_volume = clamp(victim.blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) - user.blood_volume = clamp(user.blood_volume + drained_blood, 0, BLOOD_VOLUME_MAXIMUM) - if(!victim.blood_volume) + + // Since we adjust the user first, we need to take the victim's blood volume into account. + var/amount_drained = min(VAMP_DRAIN_AMOUNT, victim.get_blood_volume()) + + // Takes into account how much blood the vampire can take. + amount_drained = user.adjust_blood_volume(amount_drained) + + victim.adjust_blood_volume(-amount_drained) + + if(!victim.get_blood_volume()) to_chat(user, span_notice("You finish off [victim]'s [blood_name] supply.")) return TRUE /obj/item/organ/heart/vampire name = "vampire heart" - color = COLOR_CRAYON_BLACK + icon_state = "heart_vampire" + desc = "Some guy stabbed his brother 6,000 years ago so now you have this." #undef VAMPIRES_PER_HOUSE #undef VAMP_DRAIN_AMOUNT diff --git a/code/modules/mob/living/carbon/human/suicides.dm b/code/modules/mob/living/carbon/human/suicides.dm index 5917659ede29..11103857f6dc 100644 --- a/code/modules/mob/living/carbon/human/suicides.dm +++ b/code/modules/mob/living/carbon/human/suicides.dm @@ -1,6 +1,6 @@ /mob/living/carbon/human/proc/delayed_suicide() suicide_log() - adjustBruteLoss(max(200 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) + adjust_brute_loss(max(200 - get_tox_loss() - get_fire_loss() - get_brute_loss() - get_oxy_loss(), 0)) investigate_log("has died from committing suicide.", INVESTIGATE_DEATHS) death(FALSE) ghostize(FALSE) // Disallows reentering body and disassociates mind diff --git a/code/modules/mob/living/carbon/init_signals.dm b/code/modules/mob/living/carbon/init_signals.dm index 1f9f30093a5b..415d1f908c00 100644 --- a/code/modules/mob/living/carbon/init_signals.dm +++ b/code/modules/mob/living/carbon/init_signals.dm @@ -5,6 +5,8 @@ //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)) + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_NOBLOOD), PROC_REF(on_noblood_trait_gain)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_NOBLOOD), PROC_REF(on_noblood_trait_loss)) //Traits that register add only RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_NOBREATH), PROC_REF(on_nobreath_trait_gain)) @@ -34,6 +36,26 @@ var/datum/dna_block/identity/gender/to_update = GLOB.dna_identity_blocks[/datum/dna_block/identity/gender] to_update.apply_to_mob(src, src.dna.unique_identity) +/** + * On gain of TRAIT_NOBLOOD + * + * This will make the mob update its blood state. + */ +/mob/living/carbon/proc/on_noblood_trait_gain(datum/source) + SIGNAL_HANDLER + + update_blood_status() + +/** + * On removal of TRAIT_NOBLOOD + * + * This will make the mob update its blood state. + */ +/mob/living/carbon/proc/on_noblood_trait_loss(datum/source) + SIGNAL_HANDLER + + update_blood_status() + /** * On gain of TRAIT_NOBREATH * @@ -42,7 +64,7 @@ /mob/living/carbon/proc/on_nobreath_trait_gain(datum/source) SIGNAL_HANDLER - setOxyLoss(0, updating_health = TRUE, forced = TRUE) + set_oxy_loss(0, updating_health = TRUE, forced = TRUE) losebreath = 0 failed_last_breath = FALSE @@ -97,7 +119,7 @@ /mob/living/carbon/proc/on_toximmune_trait_gain(datum/source) SIGNAL_HANDLER - setToxLoss(0, updating_health = TRUE, forced = TRUE) + set_tox_loss(0, updating_health = TRUE, forced = TRUE) /** * On gain of TRAIT_GENELLESS diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 8ab032018078..34c6e104e297 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -65,9 +65,7 @@ /mob/living/carbon/proc/get_visible_items() var/list/visible_items = list() var/obscured_item_slots = hidden_slots_to_inventory_slots(obscured_slots) - for (var/obj/item/held in held_items) - visible_items += held - for(var/obj/item/thing in get_equipped_items()) + for(var/obj/item/thing in get_equipped_items(INCLUDE_HELD|INCLUDE_PROSTHETICS)) if(!(get_slot_by_item(thing) & obscured_item_slots)) visible_items += thing return visible_items @@ -120,7 +118,7 @@ for(var/mob/dead/observe as anything in observers) observe.client?.screen -= equipping - equipping.forceMove(src) + equipping.forceMove(src) //This has to come before has_equipped is called. SET_PLANE_EXPLICIT(equipping, ABOVE_HUD_PLANE, src) equipping.appearance_flags |= NO_CLIENT_COLOR var/not_handled = FALSE @@ -165,15 +163,11 @@ return not_handled -/mob/living/carbon/get_equipped_speed_mod_items() - return ..() + get_equipped_items() - /mob/living/carbon/has_equipped(obj/item/item, slot, initial = FALSE) . = ..() if(!.) return - update_equipment_speed_mods() hud_used?.update_locked_slots() if(!(slot & item.slot_flags)) // Things below only update if slotted in (ie: not held) return @@ -182,11 +176,10 @@ add_item_coverage(item) /mob/living/carbon/has_unequipped(obj/item/item) - . = ..() // NB: ATP the item is still in the slot, but no longer has the IN_INVENTORY flag (so is not returned by get_equipped_items) + . = ..() if(!.) return - update_equipment_speed_mods() hud_used?.update_locked_slots() if(item.hair_mask) update_body() @@ -269,12 +262,12 @@ /// Returns the helmet if an air tank compatible helmet is equipped. /mob/living/carbon/proc/can_breathe_helmet() - if (isclothing(head) && (head.clothing_flags & HEADINTERNALS)) + if (astype(head, /obj/item/clothing)?.clothing_flags & HEADINTERNALS) return head /// Returns the mask if an air tank compatible mask is equipped. /mob/living/carbon/proc/can_breathe_mask() - if (isclothing(wear_mask) && (wear_mask.clothing_flags & MASKINTERNALS)) + if (astype(wear_mask, /obj/item/clothing)?.clothing_flags & MASKINTERNALS) return wear_mask /// Returns the tube if a breathing tube is equipped. @@ -425,24 +418,46 @@ RETURN_TYPE(/list) SHOULD_NOT_OVERRIDE(TRUE) - var/covered_flags = NONE - var/list/all_worn_items = get_equipped_items() - for(var/obj/item/worn_item in all_worn_items) - covered_flags |= worn_item.body_parts_covered - - return cover_flags2body_zones(covered_flags) + return cover_flags2body_zones(get_all_covered_flags()) ///Returns a bitfield of all zones covered by clothing /mob/living/carbon/proc/get_all_covered_flags() SHOULD_NOT_OVERRIDE(TRUE) var/covered_flags = NONE - var/list/all_worn_items = get_equipped_items() - for(var/obj/item/worn_item in all_worn_items) + for(var/obj/item/worn_item in get_equipped_items(INCLUDE_ABSTRACT)) covered_flags |= worn_item.body_parts_covered return covered_flags +/mob/living/carbon/is_location_accessible(location, exluded_equipment_slots = NONE) + switch(location) + // Snowflake checks for these precise zones + if(BODY_ZONE_PRECISE_EYES) + if(is_eyes_covered(~exluded_equipment_slots) || (obscured_slots & (HIDEEYES|HIDEFACE))) + return FALSE + if(BODY_ZONE_PRECISE_MOUTH) + if(is_mouth_covered(~exluded_equipment_slots) || (obscured_slots & HIDEFACE)) + return FALSE + + var/covered_flags = NONE + for(var/obj/item/worn_item in get_equipped_items(INCLUDE_ABSTRACT)) + if(worn_item.slot_flags & exluded_equipment_slots) + continue + covered_flags |= worn_item.body_parts_covered + + // NB: we have to convert covered_flags via cover_flags2body_zones here + // instead of converting location via body_zones2cover_flags + // + // our coverage might look something like GROIN|LEGS, which would convert to list(BODY_ZONE_GROIN, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + // so if we were checking "is BODY_ZONE_CHEST accessible", we would pass - this is correct! + // + // however, if we convert the location to body zone, we would get CHEST|GROIN + // then we would check (CHEST|GROIN) & (GROIN|LEGS) and return FALSE - which is incorrect, the chest is perfectly accessible! + // checking for ((CHEST|GROIN) & (GROIN|LEGS)) == (CHEST|GROIN) would also be incorrect, + // as it would imply your chest is accessible from lacking groin coverage + return !(location in cover_flags2body_zones(covered_flags)) + /// Attempts to equip the given item in a conspicious place. /// This is used when, for instance, a character spawning with an item /// in their hands would be a dead giveaway that they are an antagonist. diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 1100044ab08f..7b872f2f7b5b 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -181,7 +181,7 @@ // Simulates breathing zero moles of gas. has_moles = FALSE // Extra damage, let God sort ’em out! - adjustOxyLoss(2) + adjust_oxy_loss(2) /// Minimum O2 before suffocation. var/safe_oxygen_min = 16 @@ -232,7 +232,7 @@ failed_last_breath = FALSE // Vacuum-adapted lungs regenerate oxyloss even when breathing nothing. if(health >= crit_threshold) - adjustOxyLoss(-5) + adjust_oxy_loss(-5) else // Can't breathe! Lungs are missing, and/or breath is empty. . = FALSE @@ -266,7 +266,7 @@ oxygen_used = breath_gases[/datum/gas/oxygen][MOLES] // Heal mob if not in crit. if(health >= crit_threshold) - adjustOxyLoss(-5) + adjust_oxy_loss(-5) // Exhale equivalent amount of CO2. if(o2_pp) breath_gases[/datum/gas/oxygen][MOLES] -= oxygen_used @@ -287,10 +287,10 @@ throw_alert(ALERT_TOO_MUCH_CO2, /atom/movable/screen/alert/too_much_co2) Unconscious(6 SECONDS) // Lets hurt em a little, let them know we mean business. - adjustOxyLoss(3) + adjust_oxy_loss(3) // They've been in here 30s now, start to kill them for their own good! if((world.time - co2overloadtime) > 30 SECONDS) - adjustOxyLoss(8) + adjust_oxy_loss(8) else // Reset side-effects. co2overloadtime = 0 @@ -301,7 +301,7 @@ if(plasma_pp > safe_plas_max) // Plasma side-effects. var/ratio = (breath_gases[/datum/gas/plasma][MOLES] / safe_plas_max) * 10 - adjustToxLoss(clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) + adjust_tox_loss(clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) if(!HAS_TRAIT(src, TRAIT_ANOSMIA)) throw_alert(ALERT_TOO_MUCH_PLASMA, /atom/movable/screen/alert/too_much_plas) else @@ -321,7 +321,7 @@ //-- FREON --// if(freon_pp) - adjustFireLoss(freon_pp * 0.25) + adjust_fire_loss(freon_pp * 0.25) //-- MIASMA --// if(!miasma_pp) @@ -385,9 +385,9 @@ if(nitrium_pp) var/need_mob_update = FALSE if(nitrium_pp > 0.5) - need_mob_update += adjustFireLoss(nitrium_pp * 0.15, updating_health = FALSE) + need_mob_update += adjust_fire_loss(nitrium_pp * 0.15, updating_health = FALSE) if(nitrium_pp > 5) - need_mob_update += adjustToxLoss(nitrium_pp * 0.05, updating_health = FALSE) + need_mob_update += adjust_tox_loss(nitrium_pp * 0.05, updating_health = FALSE) if(need_mob_update) updatehealth() @@ -426,13 +426,13 @@ // Low pressure. if(breath_pp) var/ratio = safe_breath_min / breath_pp - adjustOxyLoss(min(5 * ratio, 3)) + adjust_oxy_loss(min(5 * ratio, 3)) return true_pp * ratio / 6 // Zero pressure. if(health >= crit_threshold) - adjustOxyLoss(3) + adjust_oxy_loss(3) else - adjustOxyLoss(1) + adjust_oxy_loss(1) /// Fourth and final link in a breath chain /mob/living/carbon/proc/handle_breath_temperature(datum/gas_mixture/breath) @@ -467,8 +467,9 @@ if(!blood_type) return - if(chem.type == blood_type?.restoration_chem && blood_volume < BLOOD_VOLUME_NORMAL) - blood_volume += BLOOD_REGEN_FACTOR * seconds_per_tick + if(chem.type == blood_type?.restoration_chem && get_blood_volume() < BLOOD_VOLUME_NORMAL) + // Don't clamp this to BLOOD_VOLUME_NORMAL. Reagents have quantization, making an clamped threshold janky. + adjust_blood_volume(BLOOD_REGEN_FACTOR * seconds_per_tick) reagents.remove_reagent(chem.type, chem.metabolization_rate * seconds_per_tick) return COMSIG_MOB_STOP_REAGENT_TICK @@ -482,13 +483,11 @@ return var/datum/blood_type/blood_type = get_bloodtype() - if(!(blood_type.reagent_type in typesof(chem.type))) //DARKPACK EDIT, ORIGINAL: if(blood_type.reagent_type != chem.type) + if(!(blood_type.reagent_type in typesof(chem.type))) // DARKPACK EDIT, ORIGINAL: if(blood_type.reagent_type != chem.type) return - var/blood_stream_volume = min(round(reac_volume, CHEMICAL_VOLUME_ROUNDING), BLOOD_VOLUME_MAXIMUM - blood_volume) - if(blood_stream_volume > 0) //remove reagents from mob that has now entered the bloodstream - reagents.remove_reagent(chem.type, blood_stream_volume) - blood_volume += blood_stream_volume + var/blood_added = adjust_blood_volume(round(reac_volume, CHEMICAL_VOLUME_ROUNDING)) + reagents.remove_reagent(chem.type, blood_added) if(chem.data?["blood_type"]) var/datum/blood_type/donor_type = chem.data["blood_type"] @@ -771,8 +770,8 @@ if(HAS_TRAIT(src, TRAIT_STABLELIVER) || HAS_TRAIT(src, TRAIT_LIVERLESS_METABOLISM)) return - 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) + adjust_tox_loss(0.6 * seconds_per_tick, forced = TRUE) + adjust_organ_loss(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() var/obj/item/organ/liver/liver = get_organ_slot(ORGAN_SLOT_LIVER) @@ -803,7 +802,7 @@ /mob/living/carbon/proc/needs_heart() if(HAS_TRAIT(src, TRAIT_STABLEHEART)) return FALSE - if(dna && dna.species && (HAS_TRAIT(src, TRAIT_NOBLOOD) || isnull(dna.species.mutantheart))) //not all carbons have species! + if(dna && dna.species && (!CAN_HAVE_BLOOD(src) || isnull(dna.species.mutantheart))) //not all carbons have species! return FALSE return TRUE diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 7a60e60cb5b0..3b85f8554b2e 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -64,7 +64,7 @@ update_damage_overlays() damage_dealt = actual_hit.get_damage() - delta // Unfortunately bodypart receive_damage doesn't return damage dealt so we do it manually else - damage_dealt = -1 * adjustBruteLoss(damage_amount, forced = forced) + damage_dealt = -1 * adjust_brute_loss(damage_amount, forced = forced) if(BURN) if(isbodypart(def_zone)) var/obj/item/bodypart/actual_hit = def_zone @@ -83,15 +83,15 @@ update_damage_overlays() damage_dealt = actual_hit.get_damage() - delta // See above else - damage_dealt = -1 * adjustFireLoss(damage_amount, forced = forced) + damage_dealt = -1 * adjust_fire_loss(damage_amount, forced = forced) if(TOX) - damage_dealt = -1 * adjustToxLoss(damage_amount, forced = forced) + damage_dealt = -1 * adjust_tox_loss(damage_amount, forced = forced) if(OXY) - damage_dealt = -1 * adjustOxyLoss(damage_amount, forced = forced) + damage_dealt = -1 * adjust_oxy_loss(damage_amount, forced = forced) if(STAMINA) - damage_dealt = -1 * adjustStaminaLoss(damage_amount, forced = forced) + damage_dealt = -1 * adjust_stamina_loss(damage_amount, forced = forced) if(BRAIN) - damage_dealt = -1 * adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount) + damage_dealt = -1 * adjust_organ_loss(ORGAN_SLOT_BRAIN, damage_amount) // DARKPACK EDIT ADD START - AGGRAVATED_DAMAGE if(AGGRAVATED) if(isbodypart(def_zone)) @@ -112,7 +112,7 @@ update_damage_overlays() damage_dealt = actual_hit.get_damage() - delta // See above else - damage_dealt = -1 * adjustAggLoss(damage_amount, forced = forced) + damage_dealt = -1 * adjust_agg_loss(damage_amount, forced = forced) // DARKPACK EDIT ADD END SEND_SIGNAL(src, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage_dealt, damagetype, def_zone, blocked, wound_bonus, exposed_wound_bonus, sharpness, attack_direction, attacking_item, wound_clothing) @@ -149,18 +149,18 @@ switch(damagetype) if(BRUTE) - return adjustBruteLoss(heal_amount) + return adjust_brute_loss(heal_amount) if(BURN) - return adjustFireLoss(heal_amount) + return adjust_fire_loss(heal_amount) if(TOX) - return adjustToxLoss(heal_amount) + return adjust_tox_loss(heal_amount) if(OXY) - return adjustOxyLoss(heal_amount) + return adjust_oxy_loss(heal_amount) if(STAMINA) - return adjustStaminaLoss(heal_amount) + return adjust_stamina_loss(heal_amount) // DARKPACK EDIT ADD START - AGGRAVATED_DAMAGE if(AGGRAVATED) - return adjustAggLoss(heal_amount) + return adjust_agg_loss(heal_amount) // DARPACK EDIT ADD END /// return the damage amount for the type given @@ -171,23 +171,23 @@ /mob/living/proc/get_current_damage_of_type(damagetype = BRUTE) switch(damagetype) if(BRUTE) - return getBruteLoss() + return get_brute_loss() if(BURN) - return getFireLoss() + return get_fire_loss() if(TOX) - return getToxLoss() + return get_tox_loss() if(OXY) - return getOxyLoss() + return get_oxy_loss() if(STAMINA) - return getStaminaLoss() + return get_stamina_loss() // DARKPACK EDIT ADD START - AGGRAVATED_DAMAGE if(AGGRAVATED) - return getAggLoss() + return get_agg_loss() // DARKPACK EDIT ADD END /// return the total damage of all types which update your health /mob/living/proc/get_total_damage(precision = DAMAGE_PRECISION) - return round(getBruteLoss() + getFireLoss() + getToxLoss() + getOxyLoss() + getAggLoss(), precision) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE + return round(get_brute_loss() + get_fire_loss() + get_tox_loss() + get_oxy_loss() + get_agg_loss(), precision) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE /// Applies multiple damages at once via [apply_damage][/mob/living/proc/apply_damage] /mob/living/proc/apply_damages( @@ -301,7 +301,7 @@ return HAS_TRAIT(src, TRAIT_TOXIMMUNE) ? 0 : 1 return 1 -/mob/living/proc/getBruteLoss() +/mob/living/proc/get_brute_loss() return bruteloss /mob/living/proc/can_adjust_brute_loss(amount, forced, required_bodytype) @@ -311,7 +311,7 @@ return FALSE return TRUE -/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) +/mob/living/proc/adjust_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) if (!can_adjust_brute_loss(amount, forced, required_bodytype)) return 0 . = bruteloss @@ -323,7 +323,7 @@ updatehealth() -/mob/living/proc/setBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) +/mob/living/proc/set_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) return FALSE . = bruteloss @@ -335,7 +335,7 @@ updatehealth() . -= bruteloss -/mob/living/proc/getOxyLoss() +/mob/living/proc/get_oxy_loss() return oxyloss /mob/living/proc/can_adjust_oxy_loss(amount, forced, required_biotype, required_respiration_type) @@ -354,7 +354,7 @@ return FALSE return TRUE -/mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL, required_respiration_type = ALL) +/mob/living/proc/adjust_oxy_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL, required_respiration_type = ALL) if(!can_adjust_oxy_loss(amount, forced, required_biotype, required_respiration_type)) return 0 . = oxyloss @@ -365,7 +365,7 @@ if(updating_health) updatehealth() -/mob/living/proc/setOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL, required_respiration_type = ALL) +/mob/living/proc/set_oxy_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL, required_respiration_type = ALL) if(!forced) if(HAS_TRAIT(src, TRAIT_GODMODE)) return FALSE @@ -385,7 +385,7 @@ if(updating_health) updatehealth() -/mob/living/proc/getToxLoss() +/mob/living/proc/get_tox_loss() return toxloss /mob/living/proc/can_adjust_tox_loss(amount, forced, required_biotype = ALL) @@ -395,7 +395,7 @@ return FALSE return TRUE -/mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) +/mob/living/proc/adjust_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) if(!can_adjust_tox_loss(amount, forced, required_biotype)) return 0 @@ -403,11 +403,10 @@ amount = -amount if(HAS_TRAIT(src, TRAIT_TOXIMMUNE)) //Prevents toxin damage, but not healing amount = min(amount, 0) - if(blood_volume) - if(amount > 0) - blood_volume = max(blood_volume - (5 * amount), 0) - else - blood_volume = max(blood_volume - amount, 0) + if(amount > 0) + adjust_blood_volume(-5 * amount) + else + adjust_blood_volume(-amount) else if(!forced && HAS_TRAIT(src, TRAIT_TOXIMMUNE)) //Prevents toxin damage, but not healing amount = min(amount, 0) @@ -423,7 +422,7 @@ updatehealth() -/mob/living/proc/setToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) +/mob/living/proc/set_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) return FALSE if(!forced && !(mob_biotypes & required_biotype)) @@ -436,7 +435,7 @@ if(updating_health) updatehealth() -/mob/living/proc/getFireLoss() +/mob/living/proc/get_fire_loss() return fireloss /mob/living/proc/can_adjust_fire_loss(amount, forced, required_bodytype) @@ -446,7 +445,7 @@ return FALSE return TRUE -/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) +/mob/living/proc/adjust_fire_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) if(!can_adjust_fire_loss(amount, forced, required_bodytype)) return 0 . = fireloss @@ -457,7 +456,7 @@ if(updating_health) updatehealth() -/mob/living/proc/setFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) +/mob/living/proc/set_fire_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) return 0 . = fireloss @@ -468,16 +467,16 @@ if(updating_health) updatehealth() -/mob/living/proc/adjustOrganLoss(slot, amount, maximum, required_organ_flag) +/mob/living/proc/adjust_organ_loss(slot, amount, maximum, required_organ_flag) return -/mob/living/proc/setOrganLoss(slot, amount, maximum, required_organ_flag) +/mob/living/proc/set_organ_loss(slot, amount, maximum, required_organ_flag) return /mob/living/proc/get_organ_loss(slot, required_organ_flag) return -/mob/living/proc/getStaminaLoss() +/mob/living/proc/get_stamina_loss() return staminaloss /mob/living/proc/can_adjust_stamina_loss(amount, forced, required_biotype = ALL) @@ -487,7 +486,7 @@ return FALSE return TRUE -/mob/living/proc/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype = ALL) +/mob/living/proc/adjust_stamina_loss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype = ALL) if(!can_adjust_stamina_loss(amount, forced, required_biotype)) return 0 var/old_amount = staminaloss @@ -502,7 +501,7 @@ updatehealth() return delta -/mob/living/proc/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype = ALL) +/mob/living/proc/set_stamina_loss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype = ALL) if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) return 0 if(!forced && !(mob_biotypes & required_biotype)) @@ -520,12 +519,12 @@ /// The mob has received stamina damage /// -/// - current_level: The mob's current stamina damage amount (to save unnecessary getStaminaLoss() calls) +/// - current_level: The mob's current stamina damage amount (to save unnecessary get_stamina_loss() calls) /// - amount_actual: The amount of stamina damage received, in actuality /// For example, if you are taking 50 stamina damage but are at 90, you would actually only receive 30 stamina damage (due to the cap) /// - amount: The amount of stamina damage received, raw /mob/living/proc/received_stamina_damage(current_level, amount_actual, amount) - addtimer(CALLBACK(src, PROC_REF(setStaminaLoss), 0, TRUE, TRUE), stamina_regen_time, TIMER_UNIQUE|TIMER_OVERRIDE) + addtimer(CALLBACK(src, PROC_REF(set_stamina_loss), 0, TRUE, TRUE), stamina_regen_time, TIMER_UNIQUE|TIMER_OVERRIDE) /** * heal ONE external organ, organ gets randomly selected from damaged ones. @@ -533,7 +532,7 @@ * returns the net change in damage */ /mob/living/proc/heal_bodypart_damage(brute = 0, burn = 0, updating_health = TRUE, required_bodytype = NONE, target_zone = null, aggravated = 0) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE - . = (adjustBruteLoss(-abs(brute), updating_health = FALSE) + adjustFireLoss(-abs(burn), updating_health = FALSE) + adjustAggLoss(-abs(aggravated), updating_health = FALSE)) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE + . = (adjust_brute_loss(-abs(brute), updating_health = FALSE) + adjust_fire_loss(-abs(burn), updating_health = FALSE) + adjust_agg_loss(-abs(aggravated), updating_health = FALSE)) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE if(!.) // no change, no need to update return FALSE if(updating_health) @@ -541,7 +540,7 @@ /// 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, exposed_wound_bonus = 0, sharpness = NONE, aggravated = 0) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE - . = (adjustBruteLoss(abs(brute), updating_health = FALSE) + adjustFireLoss(abs(burn), updating_health = FALSE) + adjustAggLoss(abs(aggravated), updating_health = FALSE)) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE + . = (adjust_brute_loss(abs(brute), updating_health = FALSE) + adjust_fire_loss(abs(burn), updating_health = FALSE) + adjust_agg_loss(abs(aggravated), updating_health = FALSE)) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE if(!.) // no change, no need to update return FALSE if(updating_health) @@ -549,10 +548,10 @@ /// 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, aggravated = 0) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE - . = (adjustBruteLoss(-abs(brute), updating_health = FALSE, forced = forced) + \ - adjustFireLoss(-abs(burn), updating_health = FALSE, forced = forced) + \ - adjustStaminaLoss(-abs(stamina), updating_stamina = FALSE, forced = forced) + \ - adjustAggLoss(-abs(aggravated), updating_health = FALSE, forced = forced)) // DARKPACK EDIT ADD - AGGRAVATED_DAMAGE + . = (adjust_brute_loss(-abs(brute), updating_health = FALSE, forced = forced) + \ + adjust_fire_loss(-abs(burn), updating_health = FALSE, forced = forced) + \ + adjust_stamina_loss(-abs(stamina), updating_stamina = FALSE, forced = forced) + \ + adjust_agg_loss(-abs(aggravated), updating_health = FALSE, forced = forced)) // DARKPACK EDIT ADD - AGGRAVATED_DAMAGE if(!.) // no change, no need to update return FALSE if(updating_health) @@ -560,10 +559,10 @@ /// 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, aggravated = 0) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE - . = (adjustBruteLoss(abs(brute), updating_health = FALSE, forced = forced) + \ - adjustFireLoss(abs(burn), updating_health = FALSE, forced = forced) + \ - adjustStaminaLoss(abs(stamina), updating_stamina = FALSE, forced = forced) + \ - adjustAggLoss(abs(aggravated), updating_health = FALSE, forced = forced)) + . = (adjust_brute_loss(abs(brute), updating_health = FALSE, forced = forced) + \ + adjust_fire_loss(abs(burn), updating_health = FALSE, forced = forced) + \ + adjust_stamina_loss(abs(stamina), updating_stamina = FALSE, forced = forced) + \ + adjust_agg_loss(abs(aggravated), updating_health = FALSE, forced = forced)) // DARKPACK EDIT ADD - AGGRAVATED_DAMAGE if(!.) // no change, no need to update return FALSE if(updating_health) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index c6fe53d84d9b..0383b59d56a5 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -17,6 +17,7 @@ if(stat != DEAD) death(TRUE) + send_death_moodlets(gibbed = TRUE) ghostize() spill_organs(drop_bitflags) @@ -102,6 +103,8 @@ // keep us upright so the animation fits. ADD_TRAIT(src, TRAIT_FORCED_STANDING, TRAIT_GENERIC) + send_death_moodlets(dusted = TRUE) + if(drop_items) unequip_everything() @@ -160,6 +163,46 @@ ash.pixel_z = -5 ash.pixel_w = rand(-1, 1) +/** + * Sends a moodlet to all nearby living mobs that are not blind or unconscious + * to indicate that they saw this mob die (and thus feel bad about it) + * + * Note: If the mob already has a death moodlet, and the same moodlet is applied, the existing moodlet will simply worsen. + * Note: If the mob has a death moodlet, and a worse moodlet is applied, the worse moodlet will take priority. + * + * Arguments: + * * dusted - Was the mob dusted? + * * gibbed - Was the mob gibbed? + */ +/mob/living/proc/send_death_moodlets(dusted = FALSE, gibbed = FALSE) + if(flags_1 & HOLOGRAM_1) + return + + for(var/mob/living/nearby in viewers(src)) + if(nearby.stat >= UNCONSCIOUS || nearby.is_blind()) + continue + nearby.add_mood_event("saw_death", /datum/mood_event/conditional/see_death, src, dusted, gibbed) + +/mob/living/silicon/send_death_moodlets(dusted = FALSE, gibbed = FALSE) + return // You are a machine (Future todo, roboticists feel sad though) + +/mob/living/basic/send_death_moodlets(dusted = FALSE, gibbed = FALSE) + if(!(basic_mob_flags & SENDS_DEATH_MOODLETS)) + return + . = ..() + add_memory_in_range(src, 7, /datum/memory/pet_died, deuteragonist = src) + +/mob/living/simple_animal/send_death_moodlets(dusted = FALSE, gibbed = FALSE) + return // I don't care about you anymore + +/mob/living/carbon/human/send_death_moodlets(dusted = FALSE, gibbed = FALSE) + // Deaths of people undergoing surgery don't count + // otherwise surgeons would be depressed and that would be too realistic + if(HAS_TRAIT(src, TRAIT_READY_TO_OPERATE)) + return + . = ..() + add_memory_in_range(src, 7, (gibbed ? /datum/memory/witness_gib : /datum/memory/witnessed_death), protagonist = src) + /* * Called when the mob dies. Can also be called manually to kill a mob. * @@ -170,8 +213,10 @@ if(stat == DEAD) return FALSE - if(!gibbed && (death_sound || death_message || (living_flags & ALWAYS_DEATHGASP))) - INVOKE_ASYNC(src, TYPE_PROC_REF(/mob, emote), "deathgasp") + if(!gibbed) + if(death_sound || death_message || (living_flags & ALWAYS_DEATHGASP)) + INVOKE_ASYNC(src, TYPE_PROC_REF(/mob, emote), "deathgasp") + send_death_moodlets() set_stat(DEAD) timeofdeath = world.time diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index d82c4fa5b552..e4e00ba84957 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -118,7 +118,7 @@ message_animal_or_basic = custom_message . = ..() message_animal_or_basic = initial(message_animal_or_basic) - if(!user.can_speak() || user.getOxyLoss() >= 50) + if(!user.can_speak() || user.get_oxy_loss() >= 50) return //stop the sound if oxyloss too high/cant speak // DARKPACK EDIT ADD START - Torpor // Prevent mobs in a deathcoma from revealing they actually died @@ -369,7 +369,7 @@ TIMER_COOLDOWN_START(src, "point_verb_emote_cooldown", 2 SECONDS) else message_param = "[span_userdanger("bumps [user.p_their()] head on the ground")] trying to motion towards %t." - our_carbon.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) + our_carbon.adjust_organ_loss(ORGAN_SLOT_BRAIN, 5) playsound(user, 'sound/effects/glass/glassbash.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) TIMER_COOLDOWN_START(src, "point_verb_emote_cooldown", 2.5 SECONDS) return ..() @@ -421,8 +421,10 @@ message = "screams!" message_mime = "acts out a scream!" emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE - mob_type_blacklist_typecache = list(/mob/living/brain, /mob/living/carbon/human) + mob_type_blacklist_typecache = list(/mob/living/brain) sound_wall_ignore = TRUE + specific_emote_audio_cooldown = 10 SECONDS + vary = TRUE /datum/emote/living/scream/run_emote(mob/user, params, type_override, intentional = FALSE) if(!intentional && HAS_TRAIT(user, TRAIT_ANALGESIA)) @@ -434,6 +436,12 @@ if(!intentional && isanimal_or_basicmob(user)) return "makes a loud and pained whimper." +/datum/emote/living/scream/get_sound(mob/living/user) + if(!ishuman(user)) + return + var/mob/living/carbon/human/humie = user + return humie.dna.species.get_scream_sound(user) + /datum/emote/living/scowl key = "scowl" key_third_person = "scowls" @@ -695,6 +703,7 @@ /datum/emote/living/custom key = "me" key_third_person = "custom" + emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE message = null /datum/emote/living/custom/can_run_emote(mob/user, status_check, intentional, params) @@ -779,23 +788,15 @@ if(!emote_is_valid(user, our_message)) return FALSE - if(type_override) - emote_type = type_override - if(!params) var/user_emote_type = get_custom_emote_type_from_user() if(!user_emote_type) return FALSE - emote_type = user_emote_type + type_override = user_emote_type - message = our_message - . = ..() - - ///Reset the message and emote type after it's run. - message = null - emote_type = EMOTE_VISIBLE + . = ..(user = user, params = our_message, type_override = type_override, intentional = intentional) /datum/emote/living/custom/replace_pronoun(mob/user, message) return message diff --git a/code/modules/mob/living/inhand_holder.dm b/code/modules/mob/living/inhand_holder.dm index f7f76700d53e..509d4e4f0048 100644 --- a/code/modules/mob/living/inhand_holder.dm +++ b/code/modules/mob/living/inhand_holder.dm @@ -8,8 +8,6 @@ slot_flags = NONE /// Mob inside of us var/mob/living/held_mob - /// True if we've started being destroyed - var/destroying = FALSE lefthand_file = 'icons/mob/inhands/clothing/hats_lefthand.dmi' righthand_file = 'icons/mob/inhands/clothing/hats_righthand.dmi' body_parts_covered = HEAD @@ -31,9 +29,9 @@ return ..() /obj/item/mob_holder/Destroy() - destroying = TRUE - if(held_mob) + if(held_mob?.loc == src) release() + held_mob = null return ..() /obj/item/mob_holder/proc/insert_mob(mob/living/new_prisoner) @@ -78,11 +76,10 @@ /obj/item/mob_holder/proc/release(display_messages = TRUE) if(!held_mob) - if(!destroying) + if(!QDELETED(src)) qdel(src) return FALSE var/mob/living/released_mob = held_mob - held_mob = null // stops the held mob from being release()'d twice. if(isliving(loc)) var/mob/living/captor = loc if(display_messages) @@ -93,7 +90,7 @@ released_mob.setDir(SOUTH) if(display_messages) released_mob.visible_message(span_warning("[released_mob] uncurls!")) - if(!destroying) + if(!QDELETED(src)) qdel(src) return TRUE @@ -159,3 +156,6 @@ if(. || !held_mob) // Another interaction was performed return tool.melee_attack_chain(user, held_mob, modifiers) //Interact with the mob with our tool + +/obj/item/mob_holder/IsContainedAtomAccessible(atom/contained, atom/movable/user) + return TRUE diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm index 388ed86d7b37..17cff9e40bf7 100644 --- a/code/modules/mob/living/init_signals.dm +++ b/code/modules/mob/living/init_signals.dm @@ -75,6 +75,10 @@ RegisterSignal(src, COMSIG_MOVABLE_EDIT_UNIQUE_IMMERSE_OVERLAY, PROC_REF(edit_immerse_overlay)) + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_BASIC_HEALTH_HUD_VISIBLE), PROC_REF(add_to_basic_health_hud)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_BASIC_HEALTH_HUD_VISIBLE), PROC_REF(remove_from_basic_health_hud)) + + /// Called when [TRAIT_KNOCKEDOUT] is added to the mob. /mob/living/proc/on_knockedout_trait_gain(datum/source) SIGNAL_HANDLER @@ -302,3 +306,15 @@ /mob/living/proc/on_hearing_regain() SIGNAL_HANDLER refresh_looping_ambience() + +/// When gaining [TRAIT_BASIC_HEALTH_HUD_VISIBLE], add to the basic health hud +/mob/living/proc/add_to_basic_health_hud(datum/source) + SIGNAL_HANDLER + var/datum/atom_hud/data/human/medical/basic/hud = GLOB.huds[DATA_HUD_MEDICAL_BASIC] + hud.add_atom_to_hud(src) + +/// When losing [TRAIT_BASIC_HEALTH_HUD_VISIBLE], remove from the basic health hud +/mob/living/proc/remove_from_basic_health_hud(datum/source) + SIGNAL_HANDLER + var/datum/atom_hud/data/human/medical/basic/hud = GLOB.huds[DATA_HUD_MEDICAL_BASIC] + hud.remove_atom_from_hud(src) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 45e3f8834829..0c1b1f181101 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -61,8 +61,7 @@ handle_gravity(seconds_per_tick, times_fired) if(living_flags & QUEUE_NUTRITION_UPDATE) - mob_mood?.update_nutrition_moodlets() - hud_used?.hunger?.update_hunger_bar() + update_nutrition() living_flags &= ~QUEUE_NUTRITION_UPDATE if(stat != DEAD) @@ -141,7 +140,7 @@ return var/grav_strength = gravity - GRAVITY_DAMAGE_THRESHOLD - adjustBruteLoss(min(GRAVITY_DAMAGE_SCALING * grav_strength, GRAVITY_DAMAGE_MAXIMUM) * seconds_per_tick) + adjust_brute_loss(min(GRAVITY_DAMAGE_SCALING * grav_strength, GRAVITY_DAMAGE_MAXIMUM) * seconds_per_tick) /// Proc used for custom metabolization of reagents, if any /mob/living/proc/reagent_tick(datum/reagent/chem, seconds_per_tick, times_fired) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 7ef2e0a7bcbc..751a0db34968 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -6,10 +6,12 @@ register_init_signals() if(unique_name) set_name() + update_blood_status() + update_blood_effects() var/datum/atom_hud/data/human/medical/advanced/medhud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] medhud.add_atom_to_hud(src) - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_atom_to_hud(src) + var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC] + diag_hud.add_atom_to_hud(src) faction += "[REF(src)]" GLOB.mob_living_list += src SSpoints_of_interest.make_point_of_interest(src) @@ -33,8 +35,9 @@ else effect.be_replaced() - if(buckled) - buckled.unbuckle_mob(src,force=1) + clear_personalities() // must be done for the personalities which process + + buckled?.unbuckle_mob(src,force=1) remove_from_all_data_huds() GLOB.mob_living_list -= src @@ -42,8 +45,7 @@ imaginary_group -= src QDEL_LIST(imaginary_group) QDEL_LAZYLIST(diseases) - QDEL_LIST(surgeries) - QDEL_LIST(quirks) + QDEL_LAZYLIST(quirks) return ..() /mob/living/onZImpact(turf/impacted_turf, levels, impact_flags = NONE) @@ -557,7 +559,7 @@ // DARKPACK EDIT CHANGE START - Torpor if (HAS_TRAIT(src, TRAIT_CAN_ENTER_TORPOR) && !HAS_TRAIT(src, TRAIT_TORPOR)) log_message("Has [whispered ? "whispered his final words and" : ""]succumbed to Torpor with [round(health, 0.1)] points of health!", LOG_ATTACK) - adjustOxyLoss(health - HEALTH_THRESHOLD_DEAD) + adjust_oxy_loss(health - HEALTH_THRESHOLD_DEAD) updatehealth() if(!whispered) to_chat(src, span_notice("You have succumbed to Torpor.")) @@ -565,7 +567,7 @@ torpor("damage") else log_message("Has [whispered ? "whispered his final words" : "succumbed to death"] with [round(health, 0.1)] points of health!", LOG_ATTACK) - adjustOxyLoss(health - HEALTH_THRESHOLD_DEAD) + adjust_oxy_loss(health - HEALTH_THRESHOLD_DEAD) updatehealth() if(!whispered) to_chat(src, span_notice("You have given up life and succumbed to death.")) @@ -833,7 +835,7 @@ /mob/living/proc/updatehealth() if(HAS_TRAIT(src, TRAIT_GODMODE)) return - set_health(maxHealth - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getAggLoss()) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE + set_health(maxHealth - get_oxy_loss() - get_tox_loss() - get_fire_loss() - get_brute_loss() - get_agg_loss()) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE update_stat() med_hud_set_health() med_hud_set_status() @@ -891,8 +893,8 @@ // Bro just like, don't ok return FALSE if(excess_healing) - adjustOxyLoss(-excess_healing, updating_health = FALSE) - adjustToxLoss(-excess_healing, updating_health = FALSE, forced = TRUE) //slime friendly + adjust_oxy_loss(-excess_healing, updating_health = FALSE) + adjust_tox_loss(-excess_healing, updating_health = FALSE, forced = TRUE) //slime friendly updatehealth() grab_ghost(force_grab_ghost) @@ -936,22 +938,22 @@ /mob/living/proc/heal_and_revive(heal_to = 50, revive_message) // Heal their brute and burn up to the threshold we're looking for - var/brute_to_heal = heal_to - getBruteLoss() - var/burn_to_heal = heal_to - getFireLoss() - var/oxy_to_heal = heal_to - getOxyLoss() - var/tox_to_heal = heal_to - getToxLoss() - var/agg_to_heal = heal_to - getAggLoss() // DARKPACK EDIT ADD - AGGRAVATED_DAMAGE + var/brute_to_heal = heal_to - get_brute_loss() + var/burn_to_heal = heal_to - get_fire_loss() + var/oxy_to_heal = heal_to - get_oxy_loss() + var/tox_to_heal = heal_to - get_tox_loss() + var/agg_to_heal = heal_to - get_agg_loss() // DARKPACK EDIT ADD - AGGRAVATED_DAMAGE if(brute_to_heal < 0) - adjustBruteLoss(brute_to_heal, updating_health = FALSE) + adjust_brute_loss(brute_to_heal, updating_health = FALSE) if(burn_to_heal < 0) - adjustFireLoss(burn_to_heal, updating_health = FALSE) + adjust_fire_loss(burn_to_heal, updating_health = FALSE) if(oxy_to_heal < 0) - adjustOxyLoss(oxy_to_heal, updating_health = FALSE) + adjust_oxy_loss(oxy_to_heal, updating_health = FALSE) if(tox_to_heal < 0) - adjustToxLoss(tox_to_heal, updating_health = FALSE, forced = TRUE) + adjust_tox_loss(tox_to_heal, updating_health = FALSE, forced = TRUE) // DARKPACK EDIT ADD START - AGGRAVATED_DAMAGE if(agg_to_heal < 0) - adjustAggLoss(agg_to_heal, updating_health = FALSE) + adjust_agg_loss(agg_to_heal, updating_health = FALSE) // DARKPACK EDIT ADD END // Run updatehealth once to set health for the revival check @@ -983,18 +985,18 @@ SHOULD_CALL_PARENT(TRUE) if(heal_flags & HEAL_TOX) - setToxLoss(0, updating_health = FALSE, forced = TRUE) + set_tox_loss(0, updating_health = FALSE, forced = TRUE) if(heal_flags & HEAL_OXY) - setOxyLoss(0, updating_health = FALSE, forced = TRUE) + set_oxy_loss(0, updating_health = FALSE, forced = TRUE) if(heal_flags & HEAL_BRUTE) - setBruteLoss(0, updating_health = FALSE, forced = TRUE) + set_brute_loss(0, updating_health = FALSE, forced = TRUE) if(heal_flags & HEAL_BURN) - setFireLoss(0, updating_health = FALSE, forced = TRUE) + set_fire_loss(0, updating_health = FALSE, forced = TRUE) if(heal_flags & HEAL_STAM) - setStaminaLoss(0, updating_stamina = FALSE, forced = TRUE) + set_stamina_loss(0, updating_stamina = FALSE, forced = TRUE) // DARKPACK EDIT ADD START - AGGRAVATED_DAMAGE if(heal_flags & HEAL_AGGRAVATED) - setAggLoss(0, updating_health = FALSE, forced = TRUE) + set_agg_loss(0, updating_health = FALSE, forced = TRUE) // DARKPACK EDIT ADD END // I don't really care to keep this under a flag @@ -1011,12 +1013,15 @@ bodytemperature = get_body_temp_normal(apply_change = FALSE) if(heal_flags & HEAL_BLOOD) restore_blood() + adjust_blood_pool(maxbloodpool, updating_health = FALSE) // DARKPACK EDIT ADD if(reagents && (heal_flags & HEAL_ALL_REAGENTS)) reagents.clear_reagents() if(heal_flags & HEAL_ADMIN) REMOVE_TRAIT(src, TRAIT_SUICIDED, REF(src)) + untorpor() // DARKPACK EDIT ADD + updatehealth() stop_sound_channel(CHANNEL_HEARTBEAT) SEND_SIGNAL(src, COMSIG_LIVING_POST_FULLY_HEAL, heal_flags) @@ -1026,16 +1031,16 @@ * It uses the healing amount on brute/fire damage, and then uses the excess healing for revive */ /mob/living/proc/do_strange_reagent_revival(healing_amount) - var/brute_loss = getBruteLoss() + var/brute_loss = get_brute_loss() if(brute_loss) var/brute_healing = min(healing_amount * 0.5, brute_loss) // 50% of the healing goes to brute - setBruteLoss(round(brute_loss - brute_healing, DAMAGE_PRECISION), updating_health=FALSE, forced=TRUE) + set_brute_loss(round(brute_loss - brute_healing, DAMAGE_PRECISION), updating_health=FALSE, forced=TRUE) healing_amount = max(0, healing_amount - brute_healing) - var/fire_loss = getFireLoss() + var/fire_loss = get_fire_loss() if(fire_loss && healing_amount) var/fire_healing = min(healing_amount, fire_loss) // rest of the healing goes to fire - setFireLoss(round(fire_loss - fire_healing, DAMAGE_PRECISION), updating_health=TRUE, forced=TRUE) + set_fire_loss(round(fire_loss - fire_healing, DAMAGE_PRECISION), updating_health=TRUE, forced=TRUE) healing_amount = max(0, healing_amount - fire_healing) revive(NONE, excess_healing=max(healing_amount, 0), force_grab_ghost=FALSE) // and any excess healing is passed along @@ -1074,13 +1079,13 @@ if(active_storage) var/storage_is_important_recurisve = (active_storage.parent in important_recursive_contents?[RECURSIVE_CONTENTS_ACTIVE_STORAGE]) - var/can_reach_active_storage = CanReach(active_storage.parent, view_only = TRUE) + var/can_reach_active_storage = active_storage.parent.IsReachableBy(src) if(!storage_is_important_recurisve && !can_reach_active_storage) active_storage.hide_contents(src) if(!buckled && !moving_diagonally && loc != old_loc) var/blood_flow = get_bleed_rate() - var/health_check = body_position == LYING_DOWN && prob(getBruteLoss() * 200 / maxHealth) + var/health_check = body_position == LYING_DOWN && prob(get_brute_loss() * 200 / maxHealth) var/bleeding_check = blood_flow > 3 && prob(blood_flow * 16) if(health_check || bleeding_check) make_blood_trail(newloc, old_loc, old_direction, direct) @@ -1197,7 +1202,7 @@ if(HAS_TRAIT(src, TRAIT_GRABWEAKNESS)) //If we have grab weakness from some source, treat the grab state as one higher effective_grab_state++ - if(get_timed_status_effect_duration(/datum/status_effect/staggered) && (getFireLoss() + getBruteLoss()) >= 40) //If we are staggered, and we have at least 40 damage, treat the grab state as one higher. + if(get_timed_status_effect_duration(/datum/status_effect/staggered) && (get_fire_loss() + get_brute_loss()) >= 40) //If we are staggered, and we have at least 40 damage, treat the grab state as one higher. effective_grab_state++ if(HAS_TRAIT(src, TRAIT_GRABRESISTANCE)) //If we have grab resistance from some source, treat the grab state as one lower. @@ -1208,12 +1213,13 @@ var/mob/living/carbon/human/human_puller = pulledby var/obj/item/bodypart/grabbing_bodypart = human_puller.get_active_hand() if(grabbing_bodypart) - damage_on_resist_fail += rand(grabbing_bodypart.unarmed_damage_low, grabbing_bodypart.unarmed_damage_high) + damage_on_resist_fail += (rand(grabbing_bodypart.unarmed_damage_low, grabbing_bodypart.unarmed_damage_high)) + grabbing_bodypart.unarmed_grab_damage_bonus + effective_grab_state += grabbing_bodypart.unarmed_grab_state_bonus //If our puller is a drunken brawler, they add more damage based on their own damage taken so long as they're drunk and treat the grab state as one higher var/puller_drunkenness = human_puller.get_drunk_amount() if(puller_drunkenness && HAS_TRAIT(human_puller, TRAIT_DRUNKEN_BRAWLER)) - damage_on_resist_fail += clamp((human_puller.getFireLoss() + human_puller.getBruteLoss()) / 10, 3, 20) + damage_on_resist_fail += clamp((human_puller.get_fire_loss() + human_puller.get_brute_loss()) / 10, 3, 20) effective_grab_state++ var/datum/martial_art/puller_art = GET_ACTIVE_MARTIAL_ART(human_puller) @@ -1246,7 +1252,7 @@ pulledby.stop_pulling() return FALSE else - adjustStaminaLoss(damage_on_resist_fail) //Do some stamina damage if we fail to resist + adjust_stamina_loss(damage_on_resist_fail) //Do some stamina damage if we fail to resist visible_message(span_danger("[src] struggles as they fail to break free of [pulledby]'s grip!"), \ span_warning("You struggle as you fail to break free of [pulledby]'s grip!"), null, null, pulledby) to_chat(pulledby, span_danger("[src] struggles as they fail to break free of your grip!")) @@ -1356,7 +1362,7 @@ if(onSyndieBase() && !(ROLE_SYNDICATE in user?.faction)) return FALSE // Now, are they viewable by a camera? (This is last because it's the most intensive check) - if(!GLOB.cameranet.checkCameraVis(src)) + if(!SScameras.is_visible_by_cameras(src)) return FALSE return TRUE @@ -1405,7 +1411,7 @@ to_chat(src, span_warning("Your holochasis does not allow you to do this!")) return FALSE - if(!(action_bitflags & BYPASS_ADJACENCY) && ((action_bitflags & NOT_INSIDE_TARGET) || !recursive_loc_check(src, target)) && !CanReach(target)) + if(!(action_bitflags & BYPASS_ADJACENCY) && ((action_bitflags & NOT_INSIDE_TARGET) || !recursive_loc_check(src, target)) && !target.IsReachableBy(src)) if(HAS_SILICON_ACCESS(src) && !ispAI(src)) if(!(action_bitflags & ALLOW_SILICON_REACH)) // silicons can ignore range checks (except pAIs) if(!(action_bitflags & SILENT_ADJACENCY)) @@ -1458,6 +1464,34 @@ SEND_SIGNAL(src, COMSIG_LIVING_STAMINA_UPDATE) update_stamina_hud() +/mob/living/update_stamina_hud(shown_stamina_loss) + if(!client || !hud_used?.stamina) + return + + var/stam_crit_threshold = maxHealth - crit_threshold + + if(stat == DEAD) + hud_used.stamina.icon_state = "stamina_dead" + else + + if(shown_stamina_loss == null) + shown_stamina_loss = get_stamina_loss() + + if(shown_stamina_loss >= stam_crit_threshold) + hud_used.stamina.icon_state = "stamina_crit" + else if(shown_stamina_loss > maxHealth*0.8) + hud_used.stamina.icon_state = "stamina_5" + else if(shown_stamina_loss > maxHealth*0.6) + hud_used.stamina.icon_state = "stamina_4" + else if(shown_stamina_loss > maxHealth*0.4) + hud_used.stamina.icon_state = "stamina_3" + else if(shown_stamina_loss > maxHealth*0.2) + hud_used.stamina.icon_state = "stamina_2" + else if(shown_stamina_loss > 0) + hud_used.stamina.icon_state = "stamina_1" + else + hud_used.stamina.icon_state = "stamina_full" + /mob/living/carbon/alien/update_stamina() return @@ -1531,23 +1565,23 @@ var/static/list/robot_options = list( /mob/living/silicon/robot = 200, /mob/living/basic/drone/polymorphed = 200, + /mob/living/silicon/robot/model/syndicate = 100, + /mob/living/silicon/robot/model/syndicate/medical = 100, + /mob/living/silicon/robot/model/syndicate/saboteur = 100, + /mob/living/basic/hivebot/strong = 50, + /mob/living/basic/hivebot/mechanic = 50, /mob/living/basic/bot/dedbot = 25, /mob/living/basic/bot/cleanbot = 25, /mob/living/basic/bot/firebot = 25, /mob/living/basic/bot/honkbot = 25, /mob/living/basic/bot/hygienebot = 25, - /mob/living/basic/bot/medbot/mysterious = 12, - /mob/living/basic/bot/medbot = 13, /mob/living/basic/bot/vibebot = 25, - /mob/living/basic/hivebot/strong = 50, - /mob/living/basic/hivebot/mechanic = 50, + /mob/living/basic/bot/medbot = 13, + /mob/living/basic/bot/medbot/mysterious = 12, /mob/living/basic/netguardian = 1, - /mob/living/silicon/robot/model/syndicate = 1, - /mob/living/silicon/robot/model/syndicate/medical = 1, - /mob/living/silicon/robot/model/syndicate/saboteur = 1, ) - var/picked_robot = pick(robot_options) + var/picked_robot = pick_weight(robot_options) new_mob = new picked_robot(loc) if(issilicon(new_mob)) var/mob/living/silicon/robot/created_robot = new_mob @@ -1656,7 +1690,6 @@ /mob/living/basic/pet/dog/pug, /mob/living/basic/pet/gondola, /mob/living/basic/pet/fox, - /mob/living/basic/pet/penguin, /mob/living/basic/pet/penguin/baby, /mob/living/basic/pet/penguin/baby/permanent, /mob/living/basic/pet/penguin/emperor, @@ -1993,7 +2026,8 @@ GLOBAL_LIST_EMPTY(fire_appearances) return ..() /mob/living/proc/mob_pickup(mob/living/user) - var/obj/item/mob_holder/holder = new(get_turf(src), src, held_state, head_icon, held_lh, held_rh, worn_slot_flags) + var/obj/item/mob_holder/holder = new inhand_holder_type(get_turf(src), src, held_state, head_icon, held_lh, held_rh, worn_slot_flags) + SEND_SIGNAL(src, COMSIG_LIVING_SCOOPED_UP, user, holder) user.visible_message(span_warning("[user] scoops up [src]!")) user.put_in_hands(holder) @@ -2101,13 +2135,13 @@ GLOBAL_LIST_EMPTY(fire_appearances) . += {"
      [VV_HREF_TARGETREF(refid, VV_HK_GIVE_DIRECT_CONTROL, "[ckey || "no ckey"]")] / [VV_HREF_TARGETREF_1V(refid, VV_HK_BASIC_EDIT, "[real_name || "no real name"]", NAMEOF(src, real_name))]
      - BRUTE:[getBruteLoss()] - FIRE:[getFireLoss()] - TOXIN:[getToxLoss()] - OXY:[getOxyLoss()] + BRUTE:[get_brute_loss()] + FIRE:[get_fire_loss()] + TOXIN:[get_tox_loss()] + OXY:[get_oxy_loss()] BRAIN:[get_organ_loss(ORGAN_SLOT_BRAIN)] - STAMINA:[getStaminaLoss()] - AGGRAVATED:[getAggLoss()] + STAMINA:[get_stamina_loss()] + AGGRAVATED:[get_agg_loss()] "} // DARKPACK EDIT ADD - AGGRAVATED_DAMAGE @@ -2753,7 +2787,11 @@ GLOBAL_LIST_EMPTY(fire_appearances) /mob/living/proc/add_mood_event(category, type, ...) if(QDELETED(mob_mood)) return - mob_mood.add_mood_event(arglist(args)) + + if(ispath(type, /datum/mood_event/conditional)) + mob_mood.add_conditional_mood_event(arglist(args)) + else + mob_mood.add_mood_event(arglist(args)) /// Clears a mood event from the mob /mob/living/proc/clear_mood_event(category) @@ -2787,8 +2825,9 @@ GLOBAL_LIST_EMPTY(fire_appearances) /// Proc called when TARGETED by a lazarus injector /mob/living/proc/lazarus_revive(mob/living/reviver, malfunctioning) revive(HEAL_ALL) - befriend(reviver) - faction = (malfunctioning) ? list("[REF(reviver)]") : list(FACTION_NEUTRAL) + faction |= FACTION_NEUTRAL + if (!malfunctioning) + befriend(reviver) 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) @@ -2901,7 +2940,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) if(picked_theme == "Random") picked_theme = null //holopara code handles not having a theme by giving a random one var/picked_name = tgui_input_text(admin, "Name the guardian, leave empty to let player name it.", "Guardian Controller", max_length = MAX_NAME_LEN) - var/picked_color = input(admin, "Set the guardian's color, cancel to let player set it.", "Guardian Controller", "#ffffff") as color|null + var/picked_color = tgui_color_picker(admin, "Set the guardian's color, cancel to let player set it.", "Guardian Controller", COLOR_WHITE) if(tgui_alert(admin, "Confirm creation.", "Guardian Controller", list("Yes", "No")) != "Yes") return var/mob/living/basic/guardian/summoned_guardian = new picked_type(src, picked_theme) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 04d72de80644..caa270fb11f6 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -35,14 +35,23 @@ /mob/living/proc/get_eye_protection() return 0 +///A easy to use proc to apply both organ damage and temporary deafness at once, so you don't have to get the ears everytime. +/mob/living/proc/sound_damage(damage, deafen) + return + //this returns the mob's protection against ear damage (0:no protection; 1: some ear protection; 2: has no ears) -/mob/living/proc/get_ear_protection() +/mob/living/proc/get_ear_protection(ignore_deafness = FALSE) + if(!ignore_deafness && HAS_TRAIT(src, TRAIT_DEAF)) + return INFINITY //For all my homies that can not hear in the world + var/list/sig_protection = list(0) + SEND_SIGNAL(src, COMSIG_LIVING_GET_EAR_PROTECTION, sig_protection) + var/protection = sig_protection[EAR_PROTECTION_ARG] var/turf/current_turf = get_turf(src) var/datum/gas_mixture/environment = current_turf.return_air() - var/pressure = environment ? environment.return_pressure() : 0 + var/pressure = environment?.return_pressure() if(pressure < SOUND_MINIMUM_PRESSURE) //space is empty - return 1 - return 0 + protection += EAR_PROTECTION_VACUUM + return protection /** * Checks if our mob has their mouth covered. @@ -91,6 +100,20 @@ /mob/living/proc/is_ears_covered() return null +/** + * Check if the passed body zone is covered by some clothes + * + * * location: body zone to check + * ([BODY_ZONE_CHEST], [BODY_ZONE_HEAD], etc) + * * exluded_equipment_slots: equipment slots to ignore when checking coverage + * (for example, if you want to ignore helmets, pass [ITEM_SLOT_HEAD]) + * + * Returns TRUE if the location is accessible (not covered) + * Returns FALSE if the location is covered by something + */ +/mob/living/proc/is_location_accessible(location, exluded_equipment_slots = NONE) + return TRUE + /mob/living/bullet_act(obj/projectile/proj, def_zone, piercing_hit = FALSE, blocked = 0) . = ..() if (. != BULLET_ACT_HIT) @@ -157,7 +180,7 @@ return var/obj/item/bodypart/hit_bodypart = get_bodypart(check_hit_limb_zone_name(def_zone)) - if (blood_volume && (isnull(hit_bodypart) || hit_bodypart.can_bleed())) + if (get_blood_volume() && (isnull(hit_bodypart) || hit_bodypart.can_bleed())) create_splatter(angle2dir(proj.angle)) if(prob(33)) add_splatter_floor(get_turf(src)) @@ -193,6 +216,7 @@ return . = combat_mode combat_mode = new_mode + SEND_SIGNAL(src, COMSIG_COMBAT_MODE_TOGGLED) if(hud_used?.action_intent) hud_used.action_intent.update_appearance() if(silent || !client?.prefs.read_preference(/datum/preference/toggle/sound_combatmode)) @@ -449,13 +473,8 @@ if(.) return TRUE - 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 + if(!combat_mode && HAS_TRAIT(src, TRAIT_READY_TO_OPERATE) && user.perform_surgery(src)) + return TRUE return FALSE @@ -571,12 +590,12 @@ if(shock_damage < 1) return FALSE if(!(flags & SHOCK_ILLUSION)) - adjustFireLoss(shock_damage) - if(getFireLoss() > 100) + adjust_fire_loss(shock_damage) + if(get_fire_loss() > 100) add_shared_particles(/particles/smoke/burning) addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/movable, remove_shared_particles), /particles/smoke/burning), 10 SECONDS) else - adjustStaminaLoss(shock_damage) + adjust_stamina_loss(shock_damage) if(!(flags & SHOCK_SUPPRESS_MESSAGE)) visible_message( span_danger("[src] was shocked by \the [source]!"), \ @@ -649,8 +668,38 @@ return TRUE //called when the mob receives a loud bang -/mob/living/proc/soundbang_act() - return FALSE +/mob/living/proc/soundbang_act(intensity = SOUNDBANG_NORMAL, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15, ignore_deafness = FALSE, send_sound = TRUE) + var/protection = get_ear_protection(ignore_deafness) + if(protection >= intensity) + return FALSE + + ///The amplitude of the effect is reduced by sound protection, while weakness only makes it worse. + var/effect_amount = protection > 0 ? 1 - (protection/intensity) : 1 - protection + if(stun_pwr) + Paralyze(stun_pwr * effect_amount * 0.1) + Knockdown(stun_pwr * effect_amount) + + var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) + + . = effect_amount //how soundbanged we are + if(!ears || !(deafen_pwr || damage_pwr)) + return + + var/ear_damage = damage_pwr * effect_amount + var/deaf = deafen_pwr * effect_amount + sound_damage(ear_damage, deaf) + + if(send_sound) + SEND_SOUND(src, sound('sound/items/weapons/flash_ring.ogg',0, 1, 0, 250)) + + if(ears.damage >= 15 && prob(ears.damage - 5)) + to_chat(src, span_userdanger("You can't hear anything!")) + // Makes you deaf, enough that you need a proper source of healing, it won't self heal + // you need earmuffs, inacusiate, or replacement + ears.set_organ_damage(ears.maxHealth) + else if(ears.damage >= 5) + to_chat(src, span_warning("Your ears start to ring[ears.damage >= 15 ? " badly!":"!"]")) + //to damage the clothes worn by a mob /mob/living/proc/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone) @@ -762,22 +811,22 @@ if(!(shove_flags & SHOVE_DIRECTIONAL_BLOCKED) && (SEND_SIGNAL(target_shove_turf, COMSIG_LIVING_DISARM_COLLIDE, src, target, shove_flags, weapon) & COMSIG_LIVING_SHOVE_HANDLED)) return if((shove_flags & SHOVE_BLOCKED) && !(shove_flags & (SHOVE_KNOCKDOWN_BLOCKED|SHOVE_CAN_KICK_SIDE))) - target.Knockdown(SHOVE_KNOCKDOWN_SOLID, daze_amount = 3 SECONDS) - target.visible_message(span_danger("[name] shoves [target.name], knocking [target.p_them()] down!"), - span_userdanger("You're knocked down from a shove by [name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) - to_chat(src, span_danger("You shove [target.name], knocking [target.p_them()] down!")) - log_combat(src, target, "shoved", "knocking them down[weapon ? " with [weapon]" : ""]") + var/knocked_down = target.Knockdown(SHOVE_KNOCKDOWN_SOLID, daze_amount = 3 SECONDS) + target.visible_message(span_danger("[name] shoves [target.name][knocked_down ? ", knocking [target.p_them()] down" : ""]!"), + span_userdanger("You[knocked_down ? "'re knocked down" : " resist falling down"] from a shove by [name]!"), span_hear("You hear aggressive shuffling [knocked_down ? "followed by a loud thud!" : ""]"), COMBAT_MESSAGE_RANGE, src) + to_chat(src, span_danger("You shove [target.name][knocked_down ? ", knocking [target.p_them()] down" : ""]!")) + log_combat(src, target, "shoved", "[knocked_down ? "knocking them down[weapon ? " with [weapon]" : ""]" : ""]") return if(shove_flags & SHOVE_CAN_KICK_SIDE) //KICK HIM IN THE NUTS - target.Paralyze(SHOVE_CHAIN_PARALYZE) - target.apply_status_effect(/datum/status_effect/no_side_kick) - target.visible_message(span_danger("[name] kicks [target.name] onto [target.p_their()] side!"), - span_userdanger("You're kicked onto your side by [name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) - to_chat(src, span_danger("You kick [target.name] onto [target.p_their()] side!")) - addtimer(CALLBACK(target, TYPE_PROC_REF(/mob/living, SetKnockdown), 0), SHOVE_CHAIN_PARALYZE) - log_combat(src, target, "kicks", "onto their side (paralyzing)") - return + if(target.Paralyze(SHOVE_CHAIN_PARALYZE)) + target.apply_status_effect(/datum/status_effect/no_side_kick) + target.visible_message(span_danger("[name] kicks [target.name] onto [target.p_their()] side!"), + span_userdanger("You're kicked onto your side by [name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) + to_chat(src, span_danger("You kick [target.name] onto [target.p_their()] side!")) + addtimer(CALLBACK(target, TYPE_PROC_REF(/mob/living, SetKnockdown), 0), SHOVE_CHAIN_PARALYZE) + log_combat(src, target, "kicks", "onto their side (paralyzing)") + return target.get_shoving_message(src, weapon, shove_flags) @@ -822,3 +871,15 @@ return SUCCESSFUL_BLOCK return FAILED_BLOCK + +/mob/living/proc/hypnosis_vulnerable() + if(HAS_MIND_TRAIT(src, TRAIT_UNCONVERTABLE)) + return FALSE + if(has_status_effect(/datum/status_effect/hallucination) || has_status_effect(/datum/status_effect/drugginess)) + return TRUE + if(IsSleeping() || IsUnconscious()) + return TRUE + if(HAS_TRAIT(src, TRAIT_DUMB)) + return TRUE + if(mob_mood && mob_mood.sanity < SANITY_UNSTABLE) + return TRUE diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 505000db7679..4aa9fe381e7c 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -89,11 +89,13 @@ */ var/incorporeal_move = FALSE - var/list/quirks = list() - ///a list of surgery datums. generally empty, they're added when the player wants them. - var/list/surgeries = list() - ///Mob specific surgery speed modifier - var/mob_surgery_speed_mod = 1 + /// Lazylist of all quirks the mob has. These are not singletons + var/list/quirks + /// Lazylist of all typepaths of personalities the mob has. + var/list/personalities + + /// Lazylist of surgery speed modifiers - id to number - 2 = 2x faster, 0.5x = 0.5x slower + var/list/mob_surgery_speed_mods /// Used by [living/Bump()][/mob/living/proc/Bump] and [living/PushAM()][/mob/living/proc/PushAM] to prevent potential infinite loop. var/now_pushing = null @@ -109,7 +111,7 @@ var/mob_size = MOB_SIZE_HUMAN /// List of biotypes the mob belongs to. Used by diseases and reagents mainly. var/mob_biotypes = MOB_ORGANIC - /// The type of respiration the mob is capable of doing. Used by adjustOxyLoss. + /// The type of respiration the mob is capable of doing. Used by adjust_oxy_loss. var/mob_respiration_type = RESPIRATION_OXYGEN ///more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature.. var/metabolism_efficiency = 1 @@ -160,8 +162,13 @@ ///effectiveness prob. is modified negatively by this amount; positive numbers make it more difficult, negative ones make it easier var/butcher_difficulty = 0 - ///how much blood the mob has + /// How much blood the mob currently has. + /// Don't read directly, use get_blood_volume() and get_blood_volume(apply_modifiers = TRUE). + /// Don't write directly either, use set_blood_volume() and adjust_blood_volume(). + /// Also don't initialize this. Initialize default_blood_volume instead. var/blood_volume = 0 + /// The default blood volume of the mob. Used primarily for healing bloodloss. + var/default_blood_volume = 0 ///a list of all status effects the mob has var/list/status_effects @@ -200,6 +207,8 @@ var/icon/head_icon = 'icons/mob/clothing/head/pets_head.dmi' /// icon_state for holding mobs. var/held_state = "" + /// Typepath of the holder created when we're picked up + var/inhand_holder_type = /obj/item/mob_holder ///If combat mode is on or not var/combat_mode = FALSE @@ -244,3 +253,6 @@ /// First element is the current martial art - any other elements are "saved" for if they unlearn the first one /// Reference handling is done by the martial arts themselves var/list/datum/martial_art/martial_arts + + /// how many tiles can this mob reach with their hands? 1 tile is adjacent. + var/reach_length = 1 diff --git a/code/modules/mob/living/living_item_handling.dm b/code/modules/mob/living/living_item_handling.dm index 755f5d544666..6363fa53bed0 100644 --- a/code/modules/mob/living/living_item_handling.dm +++ b/code/modules/mob/living/living_item_handling.dm @@ -158,7 +158,7 @@ to_chat(src, span_warning("[offered.p_Theyre()] unable to take anything in [offered.p_their()] current state!")) return - if(!CanReach(offered)) + if(!offered.IsReachableBy(src)) to_chat(src, span_warning("You have to be beside [offered.p_them()]!")) return diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 561df7849dee..5e334f3ac751 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -73,7 +73,12 @@ return ..() /mob/living/proc/update_move_intent_slowdown() - add_movespeed_modifier((move_intent == MOVE_INTENT_WALK)? /datum/movespeed_modifier/config_walk_run/walk : /datum/movespeed_modifier/config_walk_run/run) + add_movespeed_modifier(get_move_intent_slowdown()) + +/mob/living/proc/get_move_intent_slowdown() + if(move_intent == MOVE_INTENT_WALK) + return /datum/movespeed_modifier/config_walk_run/walk + return /datum/movespeed_modifier/config_walk_run/run /mob/living/proc/update_turf_movespeed(turf/open/turf) if(isopenturf(turf) && !HAS_TRAIT(turf, TRAIT_TURF_IGNORE_SLOWDOWN)) diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index 34065f7d2ed6..c5acae150852 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -59,6 +59,21 @@ GLOBAL_LIST_INIT(department_radio_keys, list( // Misc "щ" = RADIO_CHANNEL_AI_PRIVATE, "з" = RADIO_CHANNEL_ENTERTAINMENT, + + // DARKPACK EDIT ADD START + RADIO_KEY_POLICE = RADIO_CHANNEL_POLICE, + RADIO_KEY_CLINIC = RADIO_CHANNEL_CLINIC, + RADIO_KEY_MILITARY = RADIO_CHANNEL_MILITARY, + RADIO_KEY_CAMARILLA = RADIO_CHANNEL_CAMARILLA, + RADIO_KEY_ANARCH = RADIO_CHANNEL_ANARCH, + RADIO_KEY_ENDRON = RADIO_CHANNEL_ENDRON, + "с" = RADIO_CHANNEL_POLICE, + "м" = RADIO_CHANNEL_CLINIC, + "т" = RADIO_CHANNEL_MILITARY, + "ь" = RADIO_CHANNEL_CAMARILLA, + "б" = RADIO_CHANNEL_ANARCH, + "д" = RADIO_CHANNEL_ENDRON, + // DARKPACK EDIT ADD END )) /** @@ -259,7 +274,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( return TRUE -/mob/living/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0) +/mob/living/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0, source) // DARKPACK EDIT, ORIGINAL: /mob/living/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0) if((SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_HEAR, args) & COMSIG_MOVABLE_CANCEL_HEARING) || !GET_CLIENT(src)) return FALSE @@ -310,7 +325,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(isliving(speaker)) var/mob/living/living_speaker = speaker var/mouth_hidden = living_speaker.is_mouth_covered() || HAS_TRAIT(living_speaker, TRAIT_FACE_COVERED) - if(!HAS_TRAIT(src, TRAIT_EMPATH) && mouth_hidden) // Can't see them speak if their mouth is covered or hidden, unless we're an empath + if(mouth_hidden && !HAS_TRAIT(src, TRAIT_SEE_MASK_WHISPER)) // Can't see them speak if their mouth is covered or hidden, unless we're an empath return FALSE deaf_message = "[span_name("[speaker]")] [speaker.verb_whisper] something, but you are too far away to hear [speaker.p_them()]." @@ -367,7 +382,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( create_chat_message(speaker, message_language, raw_message, spans) // Recompose message for AI hrefs, language incomprehension. - message = compose_message(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods) + message = compose_message(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods, source = source) // DARKPACK EDIT, ORIGINAL: message = compose_message(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods) var/show_message_success = show_message(message, MSG_AUDIBLE, deaf_message, deaf_type, avoid_highlight) return understood && show_message_success @@ -387,6 +402,8 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(!(listening_movable in in_view) && !HAS_TRAIT(listening_movable, TRAIT_XRAY_HEARING)) listening.Remove(listening_movable) + SEND_SIGNAL(src, COMSIG_LIVING_SEND_SPEECH, listening) + if(imaginary_group) listening |= imaginary_group diff --git a/code/modules/mob/living/silicon/ai/_preferences.dm b/code/modules/mob/living/silicon/ai/_preferences.dm index 34125aa7cc5a..7841b42f8398 100644 --- a/code/modules/mob/living/silicon/ai/_preferences.dm +++ b/code/modules/mob/living/silicon/ai/_preferences.dm @@ -1,9 +1,9 @@ // 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( + // Original AI emotion states 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", @@ -16,8 +16,64 @@ GLOBAL_LIST_INIT(ai_status_display_emotes, list( AI_EMOTION_THINKING = "ai_thinking", AI_EMOTION_UNSURE = "ai_unsure", AI_EMOTION_VERY_HAPPY = "ai_veryhappy", + AI_EMOTION_DEAD = "ai_dead", + AI_EMOTION_DOWNLOAD = "ai_download", )) +// Mapping from AI core display options to new status display icon states +// This allows AI status displays to show the same choice as AI core displays +GLOBAL_LIST_INIT(ai_core_to_status_display_mapping, list( + "Alien" = "ai_status_alien", + "Angel" = "ai_status_angel", + "Banned" = "ai_status_banned", + "Bliss" = "ai_status_bliss", + "Blue" = "ai_status_blue", + "Clown" = "ai_status_clown", + "Database" = "ai_status_database", + "Dorf" = "ai_status_dorf", + "Firewall" = "ai_status_firewall", + "Fuzzy" = "ai_status_fuzzy", + "Gentoo" = "ai_status_gentoo", + "Glitchman" = "ai_status_glitchman", + "Gondola" = "ai_status_gondola", + "Goon" = "ai_status_goon", + "Hades" = "ai_status_hades", + "HAL 9000" = "ai_status_hal9000", + "Heartline" = "ai_status_heartline", + "Helios" = "ai_status_helios", + "House" = "ai_status_house", + "Matrix" = "ai_status_matrix", + "Monochrome" = "ai_status_monochrome", + "Murica" = "ai_status_murica", + "Nanotrasen" = "ai_status_nanotrasen", + "Not Malf" = "ai_status_not_malf", + "President" = "ai_status_president", + "Rainbow" = "ai_status_rainbow", + "Red October" = "ai_status_red_october", + "Red" = "ai_status_red", + "Static" = "ai_status_static", + "Syndicat Meow" = "ai_status_syndicat_meow", + "Text" = "ai_status_text", + "Too Deep" = "ai_status_too_deep", + "Triumvirate" = "ai_status_triumvirate", + "Weird" = "ai_status_weird", +)) + +// Combined list for AI status display preferences, including both emotion states and AI core display options +GLOBAL_LIST_INIT(ai_status_display_all_options, list()) + +// Initialize the combined list at runtime +/proc/init_ai_status_display_options() + if(length(GLOB.ai_status_display_all_options)) // Already initialized + return + + // Start with original emotes + GLOB.ai_status_display_all_options = GLOB.ai_status_display_emotes.Copy() + + // Add AI core display mappings + for(var/core_option in GLOB.ai_core_to_status_display_mapping) + GLOB.ai_status_display_all_options[core_option] = GLOB.ai_core_to_status_display_mapping[core_option] + GLOBAL_LIST_INIT(ai_hologram_category_options, list( AI_HOLOGRAM_CATEGORY_ANIMAL = list( AI_HOLOGRAM_BEAR, diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 27d7ae844596..67aa473c47e5 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -5,7 +5,7 @@ /mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai) . = ..() if(!target_ai) //If there is no player/brain inside. - new/obj/structure/ai_core/deactivated(loc) //New empty terminal. + new/obj/structure/ai_core(loc, CORE_STATE_FINISHED) //New empty terminal. return INITIALIZE_HINT_QDEL //Delete AI. ADD_TRAIT(src, TRAIT_NO_TELEPORT, AI_ANCHOR_TRAIT) @@ -81,16 +81,22 @@ //They aren't given a c_tag so they don't show up in camera consoles builtInCamera = new(src) + var/static/list/alert_areas + if(isnull(alert_areas)) + alert_areas = (GLOB.the_station_areas + typesof(/area/mine)) + if(is_station_level(z)) + alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER, ALARM_CAMERA, ALARM_BURGLAR, ALARM_MOTION), SSmapping.levels_by_trait(ZTRAIT_STATION), alert_areas, camera_view = TRUE) + else + alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER, ALARM_CAMERA, ALARM_BURGLAR, ALARM_MOTION), (SSmapping.levels_by_trait(ZTRAIT_STATION) + z), alert_areas, 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)) + ai_tracking_tool = new(src) RegisterSignal(ai_tracking_tool, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) RegisterSignal(ai_tracking_tool, COMSIG_TRACKABLE_GLIDE_CHANGED, PROC_REF(tracked_glidesize_changed)) add_traits(list(TRAIT_PULL_BLOCKED, TRAIT_AI_ACCESS, TRAIT_HANDS_BLOCKED, TRAIT_CAN_GET_AI_TRACKING_MESSAGE, TRAIT_LOUD_BINARY), INNATE_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)) - //Heads up to other binary chat listeners that a new AI is online and listening to Binary. if(announce_init_to_others && !is_centcom_level(z)) //Skip new syndicate AIs and also new AIs on centcom Z for(var/mob/McMobby as anything in GLOB.player_list) @@ -138,6 +144,7 @@ QDEL_NULL(malf_picker) QDEL_NULL(doomsday_device) QDEL_NULL(robot_control) + QDEL_NULL(status_display_picker) QDEL_NULL(aiMulti) QDEL_NULL(alert_control) QDEL_NULL(ai_tracking_tool) @@ -145,7 +152,7 @@ current = null bot_ref = null controlled_equipment = null - linked_core = null + break_core_link() apc_override = null if(ai_voicechanger) ai_voicechanger.owner = null @@ -189,7 +196,9 @@ 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) + if(!length(GLOB.ai_status_display_all_options)) + init_ai_status_display_options() + emote_choice = pick(GLOB.ai_status_display_all_options) apply_emote_display(emote_choice) @@ -202,29 +211,28 @@ /mob/living/silicon/ai/verb/pick_icon() set category = "AI Commands" set name = "Set AI Core Display" + set desc = "Choose what appears on your AI core display" + if(incapacitated) + to_chat(src, span_warning("You cannot access the core display controls in your current state.")) return - icon = initial(icon) - icon_state = "ai" - cut_overlays() - var/list/iconstates = GLOB.ai_core_display_screens - for(var/option in iconstates) - if(option == "Random") - iconstates[option] = image(icon = src.icon, icon_state = "ai-random") - continue - if(option == "Portrait") - iconstates[option] = image(icon = src.icon, icon_state = "ai-portrait") - continue - iconstates[option] = image(icon = src.icon, icon_state = resolve_ai_icon(option)) - view_core() - var/ai_core_icon = show_radial_menu(src, src , iconstates, radius = 42) + if(!core_display_picker) + core_display_picker = new(src) + core_display_picker.ui_interact(src) + +/mob/living/silicon/ai/verb/pick_status_display() + set category = "AI Commands" + set name = "Set AI Status Display" + set desc = "Choose what appears on status displays around the station" - if(!ai_core_icon || incapacitated) + if(incapacitated) + to_chat(src, span_warning("You cannot access the status display controls in your current state.")) return - display_icon_override = ai_core_icon - set_core_display_icon(ai_core_icon) + if(!status_display_picker) + status_display_picker = new(src) + status_display_picker.ui_interact(src) /mob/living/silicon/ai/get_status_tab_items() . = ..() @@ -302,7 +310,7 @@ return ISINRANGE(target_turf.x, ai_turf.x - interaction_range, ai_turf.x + interaction_range) \ && ISINRANGE(target_turf.y, ai_turf.y - interaction_range, ai_turf.y + interaction_range) else - return GLOB.cameranet.checkTurfVis(target_turf) + return SScameras.is_visible_by_cameras(target_turf) /mob/living/silicon/ai/cancel_camera() view_core() @@ -355,53 +363,45 @@ status_flags &= ~CANPUSH //we dont want the core to be push-able when anchored ADD_TRAIT(src, TRAIT_NO_TELEPORT, AI_ANCHOR_TRAIT) +/// Creates an MMI of the AI based on its configuration. +/mob/living/silicon/ai/proc/make_mmi(atom/destination) as /obj/item/mmi + RETURN_TYPE(/obj/item/mmi) + //FIXME: this code is really bad, we shouldn't be doing most of this ourselves. MMI code needs a good refactoring.... + var/obj/item/mmi/copied_mmi + if(posibrain_inside) + copied_mmi = new /obj/item/mmi/posibrain(destination, FALSE) + copied_mmi.name = "[initial(copied_mmi.name)] ([real_name])" + else + copied_mmi = new /obj/item/mmi(destination) + copied_mmi.name = "[initial(copied_mmi.name)]: [real_name]" + copied_mmi.brain = new /obj/item/organ/brain(copied_mmi) + copied_mmi.brain.organ_flags |= ORGAN_FROZEN + copied_mmi.brain.name = "[real_name]'s brain" + copied_mmi.set_brainmob(new /mob/living/brain(copied_mmi)) + copied_mmi.brainmob.container = copied_mmi + + copied_mmi.brainmob.name = real_name + copied_mmi.brainmob.real_name = real_name + copied_mmi.brainmob.gender = gender + + var/suicided = HAS_TRAIT(src, TRAIT_SUICIDED) + copied_mmi.brainmob.set_suicide(suicided) + copied_mmi.brain?.suicided = suicided // we can't guarantee that the MMI has a brain... sigh + + if(copied_mmi.brainmob.stat == DEAD && !suicided) + copied_mmi.brainmob.set_stat(CONSCIOUS) + + copied_mmi.update_appearance() + return copied_mmi + /mob/living/silicon/ai/proc/ai_mob_to_structure() disconnect_shell() ShutOffDoomsdayDevice() - var/obj/structure/ai_core/deactivated/ai_core = new(get_turf(src), /* skip_mmi_creation = */ TRUE) - if(make_mmi_drop_and_transfer(ai_core.core_mmi, the_core = ai_core)) - qdel(src) + var/obj/structure/ai_core/ai_core = new(get_turf(src), CORE_STATE_FINISHED, make_mmi()) + mind?.transfer_to(ai_core.core_mmi.brainmob) + qdel(src) return ai_core -/mob/living/silicon/ai/proc/break_core_link() - to_chat(src, span_danger("Your core has been destroyed!")) - linked_core = null - -/mob/living/silicon/ai/proc/make_mmi_drop_and_transfer(obj/item/mmi/the_mmi, the_core) - var/mmi_type - if(posibrain_inside) - mmi_type = new/obj/item/mmi/posibrain(src, /* autoping = */ FALSE) - else - mmi_type = new/obj/item/mmi(src) - if(hack_software) - new/obj/item/malf_upgrade(get_turf(src)) - the_mmi = mmi_type - the_mmi.brain = new /obj/item/organ/brain(the_mmi) - the_mmi.brain.organ_flags |= ORGAN_FROZEN - the_mmi.brain.name = "[real_name]'s brain" - the_mmi.name = "[initial(the_mmi.name)]: [real_name]" - the_mmi.set_brainmob(new /mob/living/brain(the_mmi)) - the_mmi.brainmob.name = src.real_name - the_mmi.brainmob.real_name = src.real_name - the_mmi.brainmob.container = the_mmi - the_mmi.brainmob.gender = src.gender - - var/has_suicided_trait = HAS_TRAIT(src, TRAIT_SUICIDED) - the_mmi.brainmob.set_suicide(has_suicided_trait) - the_mmi.brain.suicided = has_suicided_trait - if(the_core) - var/obj/structure/ai_core/core = the_core - core.core_mmi = the_mmi - the_mmi.forceMove(the_core) - else - the_mmi.forceMove(get_turf(src)) - if(the_mmi.brainmob.stat == DEAD && !has_suicided_trait) - the_mmi.brainmob.set_stat(CONSCIOUS) - if(mind) - mind.transfer_to(the_mmi.brainmob) - the_mmi.update_appearance() - return TRUE - /mob/living/silicon/ai/Topic(href, href_list) ..() if(usr != src) @@ -424,7 +424,7 @@ return if (href_list["switchcamera"]) - switchCamera(locate(href_list["switchcamera"]) in GLOB.cameranet.cameras) + switchCamera(locate(href_list["switchcamera"]) in SScameras.cameras) if (href_list["showalerts"]) alert_control.ui_interact(src) #ifdef AI_VOX @@ -467,7 +467,7 @@ if(controlled_equipment) to_chat(src, span_warning("You are already loaded into an onboard computer!")) return - if(!GLOB.cameranet.checkCameraVis(M)) + if(!SScameras.is_visible_by_cameras(M)) to_chat(src, span_warning("Exosuit is no longer near active cameras.")) return if(!isturf(loc)) @@ -512,7 +512,7 @@ //The target must be in view of a camera or near the core. if(turf_check in range(get_turf(src))) call_bot(turf_check) - else if(GLOB.cameranet && GLOB.cameranet.checkTurfVis(turf_check)) + else if(SScameras.is_visible_by_cameras(turf_check)) call_bot(turf_check) else to_chat(src, span_danger("Selected location is not visible.")) @@ -570,7 +570,7 @@ var/mob/living/silicon/ai/U = usr - for (var/obj/machinery/camera/C in GLOB.cameranet.cameras) + for (var/obj/machinery/camera/C in SScameras.cameras) var/turf/camera_turf = get_turf(C) //get camera's turf in case it's built into something so we don't get z=0 var/list/tempnetwork = C.network @@ -592,7 +592,7 @@ if(isnull(network)) network = old_network // If nothing is selected else - for(var/obj/machinery/camera/C in GLOB.cameranet.cameras) + for(var/obj/machinery/camera/C in SScameras.cameras) if(!C.can_use()) continue if(network in C.network) @@ -694,7 +694,7 @@ if(!istype(apc)) to_chat(owner, span_notice("You are already in your Main Core.")) return - if(SEND_SIGNAL(owner, COMSIG_SILICON_AI_CORE_STATUS) & COMPONENT_CORE_ALL_GOOD) + if(astype(owner, /mob/living/silicon/ai)?.linked_core) apc.malfvacate() else to_chat(owner, span_danger("Linked core not detected!")) @@ -778,7 +778,7 @@ 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. + var/obj/structure/ai_core/new_core = new /obj/structure/ai_core(loc, CORE_STATE_FINISHED, make_mmi()) new_core.circuit.battery = battery ai_restore_power()//So the AI initially has power. set_control_disabled(TRUE) //Can't control things remotely if you're stuck in a card! @@ -798,7 +798,7 @@ if(isturf(loc)) //AI in core, check if on cameras //get_turf_pixel() is because APCs in maint aren't actually in view of the inner camera //apc_override is needed here because AIs use their own APC when depowered - return ((GLOB.cameranet && GLOB.cameranet.checkTurfVis(get_turf_pixel(A))) || (A == apc_override)) + return (SScameras.is_visible_by_cameras(get_turf_pixel(A)) || (A == apc_override)) //AI is carded/shunted //view(src) returns nothing for carded/shunted AIs and they have X-ray vision so just use get_dist var/list/viewscale = getviewsize(client.view) @@ -1037,7 +1037,7 @@ . = ..() /mob/living/silicon/ai/proc/camera_visibility(mob/eye/camera/ai/moved_eye) - GLOB.cameranet.visibility(moved_eye) + SScameras.update_eye_chunk(moved_eye) /mob/living/silicon/ai/forceMove(atom/destination) . = ..() @@ -1071,7 +1071,7 @@ REMOVE_TRAIT(src, TRAIT_INCAPACITATED, POWER_LACK_TRAIT) /mob/living/silicon/ai/proc/show_camera_list() - var/list/cameras = GLOB.cameranet.get_available_camera_by_tag_list(network) + var/list/cameras = SScameras.get_available_camera_by_tag_list(network) var/camera_tag = tgui_input_list(src, "Choose which camera you want to view", "Cameras", cameras) if(isnull(camera_tag)) return @@ -1101,6 +1101,99 @@ SEND_SIGNAL(src, COMSIG_SILICON_AI_SET_CONTROL_DISABLED, control_disabled) src.control_disabled = control_disabled + +/// Establishes a "core link" with a supplied core structure. +/// This will register multiple signals and give the AI a strong reference to it. +/// See [proc/resolve_core_link] or [proc/break_core_link] for ways to end the connection. +/mob/living/silicon/ai/proc/create_core_link(obj/structure/ai_core/core) + if(linked_core) //uh oh + break_core_link(linked_core) + linked_core = core + + //this block is kind of sketchy, but I don't think this should cause any problems + qdel(core.core_mmi) + core.core_mmi = make_mmi(core) + + RegisterSignals(linked_core, list(COMSIG_ATOM_DESTRUCTION, COMSIG_QDELETING), PROC_REF(on_core_destroyed)) + RegisterSignals(linked_core, list( + COMSIG_ATOM_ITEM_INTERACTION, + COMSIG_ATOM_TOOL_ACT(TOOL_CROWBAR), + COMSIG_ATOM_TOOL_ACT(TOOL_WRENCH), + COMSIG_ATOM_TOOL_ACT(TOOL_WELDER), + COMSIG_ATOM_TOOL_ACT(TOOL_WIRECUTTER), + COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), + ), PROC_REF(on_core_item_interaction)) + RegisterSignal(linked_core, COMSIG_ATOM_TAKE_DAMAGE, PROC_REF(on_core_take_damage)) + RegisterSignal(linked_core, COMSIG_ATOM_EXITED, PROC_REF(on_core_exited)) + +/// Elegantly closes the AI's link to a core structure, +/// moving them to its location and cleaning it up. This is generally what you want to call. +/// Prefer calling [proc/break_core_link] directly if the connection is meant to be suddenly severed. +/mob/living/silicon/ai/proc/resolve_core_link() + if(!linked_core) //oh no bro + CRASH("tried to resolve a core link with no core!!!!") + + forceMove(linked_core.loc) + var/obj/structure/ai_core/unlinked_core = linked_core + break_core_link() + qdel(unlinked_core) + cancel_camera() + +/// Handles unregistering the AI from its core. The core itself will not be cleaned up. +/// Prefer calling [proc/resolve_core_link] if the connection is being closed elegantly. +/mob/living/silicon/ai/proc/break_core_link() + if(!linked_core) + return + + UnregisterSignal(linked_core, list( + COMSIG_QDELETING, COMSIG_ATOM_DESTRUCTION, //on_core_destroyed + //on_core_item_interaction + COMSIG_ATOM_ITEM_INTERACTION, + COMSIG_ATOM_TOOL_ACT(TOOL_CROWBAR), + COMSIG_ATOM_TOOL_ACT(TOOL_WRENCH), + COMSIG_ATOM_TOOL_ACT(TOOL_WELDER), + COMSIG_ATOM_TOOL_ACT(TOOL_WIRECUTTER), + COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), + COMSIG_ATOM_TAKE_DAMAGE, //on_core_take_damage + COMSIG_ATOM_EXITED, //on_core_exited + )) + linked_core = null + +/mob/living/silicon/ai/proc/on_core_item_interaction(datum/source, mob/living/user, obj/item/tool, list/processing_recipes) + SIGNAL_HANDLER + if(user.combat_mode) + return NONE + + to_chat(src, span_danger("CORE TAMPERING DETECTED!")) + return NONE + +/mob/living/silicon/ai/proc/on_core_take_damage(datum/source, damage_taken, ...) + SIGNAL_HANDLER + + if(damage_taken > 0) + to_chat(src, span_danger("CORE DAMAGE DETECTED!")) + return NONE + +/mob/living/silicon/ai/proc/on_core_destroyed(datum/source, damage_flag) + SIGNAL_HANDLER + + to_chat(src, span_danger("Your core has been destroyed!")) + ShutOffDoomsdayDevice() + break_core_link() + +/mob/living/silicon/ai/proc/on_core_exited(datum/source, atom/movable/gone, direction) + SIGNAL_HANDLER + + if(istype(gone, /obj/item/mmi)) + var/obj/item/mmi/mmi_gone = gone + on_core_destroyed(source, NONE) + if(!IS_MALF_AI(src)) //don't pull back shunted malf AIs + death(gibbed = TRUE, drop_mmi = FALSE) + ///the drop_mmi param determines whether the MMI is dropped at their current location + ///which in this case would be somewhere else, so we drop their MMI at the core instead + mind?.transfer_to(mmi_gone.brainmob) + qdel(src) + #undef HOLOGRAM_CHOICE_CHARACTER #undef CHARACTER_TYPE_SELF #undef CHARACTER_TYPE_CREWMEMBER diff --git a/code/modules/mob/living/silicon/ai/ai_core_display_picker.dm b/code/modules/mob/living/silicon/ai/ai_core_display_picker.dm new file mode 100644 index 000000000000..311f0d064abd --- /dev/null +++ b/code/modules/mob/living/silicon/ai/ai_core_display_picker.dm @@ -0,0 +1,79 @@ +/** + * AI Core Display Picker TGUI + * Allows AIs to select core display options with search functionality + */ +/datum/ai_core_display_picker + var/mob/living/silicon/ai/ai_user + +/datum/ai_core_display_picker/New(mob/living/silicon/ai/user) + ai_user = user + +/datum/ai_core_display_picker/ui_status(mob/user, datum/ui_state/state) + if(!ai_user || user != ai_user || ai_user.incapacitated) + return UI_CLOSE + return ..() + +/datum/ai_core_display_picker/ui_state(mob/user) + return GLOB.always_state + +/datum/ai_core_display_picker/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AiCoreDisplayPicker") + ui.open() + +/datum/ai_core_display_picker/ui_close(mob/user) + if(ai_user) + ai_user.core_display_picker = null + +/datum/ai_core_display_picker/ui_data(mob/user) + var/list/data = list() + + // If no override is set, find the actual current display from the AI's icon state + var/current_display = ai_user.display_icon_override + if(!current_display) + // Default to "Blue" if no override + current_display = "Blue" + // Try to identify current display + if(ai_user.icon_state) + for(var/display_name in GLOB.ai_core_display_screens) + if("ai-[LOWER_TEXT(display_name)]" == ai_user.icon_state) + current_display = display_name + break + + data["current_display"] = current_display + + // Get icon for current display + var/current_icon_state = resolve_ai_icon_sync(current_display) + data["current_icon"] = list( + "icon" = 'icons/mob/silicon/ai.dmi', + "icon_state" = current_icon_state + ) + + var/list/options = list() + + for(var/option_name in GLOB.ai_core_display_screens) + var/icon_state = resolve_ai_icon_sync(option_name) + var/list/option_data = list( + "name" = option_name, + "icon_state" = icon_state, + "icon" = 'icons/mob/silicon/ai.dmi' + ) + options += list(option_data) + + data["options"] = options + + return data + +/datum/ai_core_display_picker/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + switch(action) + if("select_option") + var/chosen_option = params["option"] + if(chosen_option in GLOB.ai_core_display_screens) + ai_user.display_icon_override = chosen_option + ai_user.set_core_display_icon(chosen_option) + return TRUE diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index ba7dd437a54c..d9b099eb414e 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -13,7 +13,7 @@ /mob/living/silicon/ai/blob_act(obj/structure/blob/B) if (stat != DEAD) - adjustBruteLoss(60) + adjust_brute_loss(60) return TRUE return FALSE @@ -36,11 +36,11 @@ gib(DROP_ALL_REMAINS) if(EXPLODE_HEAVY) if (stat != DEAD) - adjustBruteLoss(60) - adjustFireLoss(60) + adjust_brute_loss(60) + adjust_fire_loss(60) if(EXPLODE_LIGHT) if (stat != DEAD) - adjustBruteLoss(30) + adjust_brute_loss(30) return TRUE diff --git a/code/modules/mob/living/silicon/ai/ai_defines.dm b/code/modules/mob/living/silicon/ai/ai_defines.dm index 2ce27d098a84..30201c9e7038 100644 --- a/code/modules/mob/living/silicon/ai/ai_defines.dm +++ b/code/modules/mob/living/silicon/ai/ai_defines.dm @@ -12,7 +12,7 @@ mob_size = MOB_SIZE_LARGE can_buckle_to = FALSE - silicon_huds = list(DATA_HUD_MEDICAL_BASIC, DATA_HUD_SECURITY_BASIC, DATA_HUD_DIAGNOSTIC, DATA_HUD_BOT_PATH) + silicon_huds = list(TRAIT_MEDICAL_HUD_SENSOR_ONLY, TRAIT_SECURITY_HUD_ID_ONLY, TRAIT_DIAGNOSTIC_HUD, TRAIT_BOT_PATH_HUD) radio = /obj/item/radio/headset/silicon/ai radiomod = ";" //AIs will, by default, state their laws on the internal radio. @@ -122,8 +122,8 @@ /* REMOTE CONTROL */ /// Equipment that the AI is controlling remotely, to determine whether to relaymove or use the AI eye VAR_FINAL/obj/controlled_equipment - /// AI core that this AI is linked to, used when put into an exosuit - VAR_FINAL/obj/structure/ai_core/deactivated/linked_core + /// AI core that this AI is linked to. See [proc/create_core_link] [proc/resolve_core_link] [proc/break_core_link] + VAR_FINAL/obj/structure/ai_core/linked_core /// Robot that this AI is currently using VAR_FINAL/mob/living/silicon/robot/deployed_shell /// Action to deploy to a shell from a list of options @@ -163,6 +163,10 @@ /* UI */ /// UI for station alerts VAR_FINAL/datum/station_alert/alert_control + /// UI for AI status display picker + VAR_FINAL/datum/ai_status_display_picker/status_display_picker + /// UI for AI core display picker + VAR_FINAL/datum/ai_core_display_picker/core_display_picker /* I'M DUMB AND CAN'T SORT */ /// Used as a fake multitool in tcomms machinery diff --git a/code/modules/mob/living/silicon/ai/ai_status_display_picker.dm b/code/modules/mob/living/silicon/ai/ai_status_display_picker.dm new file mode 100644 index 000000000000..72a31d75e41f --- /dev/null +++ b/code/modules/mob/living/silicon/ai/ai_status_display_picker.dm @@ -0,0 +1,123 @@ +/** + * AI Status Display Picker TGUI + * Allows AIs to select status display options with search functionality + */ + +/datum/ai_status_display_picker + /// The AI user who opened this interface + var/mob/living/silicon/ai/ai_user + /// The status display that was clicked + var/obj/machinery/status_display/ai/target_display + +/datum/ai_status_display_picker/New(mob/living/silicon/ai/user) + ai_user = user + +/datum/ai_status_display_picker/ui_status(mob/user, datum/ui_state/state) + if(!ai_user || user != ai_user || ai_user.incapacitated) + return UI_CLOSE + return ..() + +/datum/ai_status_display_picker/ui_state(mob/user) + return GLOB.always_state + +/datum/ai_status_display_picker/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AiStatusDisplayPicker") + ui.open() + +/datum/ai_status_display_picker/ui_close(mob/user) + if(ai_user) + ai_user.status_display_picker = null + +// No assets needed for DMIcon system + +/datum/ai_status_display_picker/ui_static_data(mob/user) + // Always ensure initialization + init_ai_status_display_options() + + var/list/data = list() + var/list/options = list() + + for(var/option_name in GLOB.ai_status_display_emotes) + var/icon_state = GLOB.ai_status_display_emotes[option_name] + var/list/option_data = list( + "name" = option_name, + "icon_state" = icon_state, + "is_original" = TRUE, + "icon" = 'icons/obj/machines/status_display.dmi' + ) + options += list(option_data) + + for(var/option_name in GLOB.ai_core_to_status_display_mapping) + var/icon_state = GLOB.ai_core_to_status_display_mapping[option_name] + var/list/option_data = list( + "name" = option_name, + "icon_state" = icon_state, + "is_original" = FALSE, + "icon" = 'icons/obj/machines/status_display.dmi' + ) + options += list(option_data) + + data["options"] = options + + return data + +/datum/ai_status_display_picker/ui_data(mob/user) + var/list/data = list() + + // Find current display emotion from first available AI status display + var/current_emotion = "None" + var/current_icon_state + var/obj/machinery/status_display/ai/first_display = locate() in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/status_display/ai) + if(first_display?.emotion) + current_emotion = first_display.emotion + if(current_emotion in GLOB.ai_status_display_emotes) + current_icon_state = GLOB.ai_status_display_emotes[current_emotion] + else if(current_emotion in GLOB.ai_core_to_status_display_mapping) + current_icon_state = GLOB.ai_core_to_status_display_mapping[current_emotion] + else + current_icon_state = "ai_download" + else + current_icon_state = "ai_download" + + data["current_emotion"] = current_emotion + data["current_icon"] = list( + "icon" = 'icons/obj/machines/status_display.dmi', + "icon_state" = current_icon_state + ) + + return data + +/datum/ai_status_display_picker/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + if(!ai_user) + return FALSE + + switch(action) + if("select_option") + var/selected_option = params["option"] + if(!selected_option || !(selected_option in GLOB.ai_status_display_all_options)) + return FALSE + + // Check if this is an original AI emotion (has a corresponding emote) + var/found_emote = FALSE + for(var/_emote in typesof(/datum/emote/ai/emotion_display)) + var/datum/emote/ai/emotion_display/emote = _emote + if(initial(emote.emotion) == selected_option) + ai_user.emote(initial(emote.key)) + found_emote = TRUE + break + + // If no emote found (i.e., it's a new AI core display option), directly apply it + if(!found_emote) + ai_user.apply_emote_display(selected_option) + + return TRUE + + return FALSE + + diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index fb769563ef36..6f76f3294a95 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -4,7 +4,7 @@ if(!gibbed) // Will update all AI status displays with a blue screen of death - INVOKE_ASYNC(src, PROC_REF(emote), "bsod") + INVOKE_ASYNC(src, PROC_REF(emote), "dead") if(!isnull(deployed_shell)) disconnect_shell() @@ -34,7 +34,8 @@ ShutOffDoomsdayDevice() if(gibbed && drop_mmi) - make_mmi_drop_and_transfer() + var/obj/item/mmi/loose_cpu = make_mmi(get_turf(src)) + mind?.transfer_to(loose_cpu.brainmob) if(explodes_on_death) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), loc, 3, 6, 12, null, 15), 1 SECONDS) @@ -42,7 +43,5 @@ SSblackbox.ReportDeath(src) /mob/living/silicon/ai/proc/ShutOffDoomsdayDevice() - if(nuking) - nuking = FALSE - if(doomsday_device) - qdel(doomsday_device) + nuking = FALSE + QDEL_NULL(doomsday_device) diff --git a/code/modules/mob/living/silicon/ai/emote.dm b/code/modules/mob/living/silicon/ai/emote.dm index c4ec04e0899e..c73a2b95c0d7 100644 --- a/code/modules/mob/living/silicon/ai/emote.dm +++ b/code/modules/mob/living/silicon/ai/emote.dm @@ -39,6 +39,14 @@ key = "bsod" emotion = AI_EMOTION_BSOD +/datum/emote/ai/emotion_display/dead + key = "dead" + emotion = AI_EMOTION_DEAD + +/datum/emote/ai/emotion_display/download + key = "download" + emotion = AI_EMOTION_DOWNLOAD + /datum/emote/ai/emotion_display/trollface key = "trollface" emotion = AI_EMOTION_PROBLEMS diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index 9e58ee04d440..0a7eaf3c5caf 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -12,13 +12,13 @@ else . += span_notice("[p_Their()] neural network connection could be cut, the access panel cover can be pried back into place.") if(stat != DEAD) - if (getBruteLoss()) - if (getBruteLoss() < 30) + if (get_brute_loss()) + if (get_brute_loss() < 30) . += span_warning("[p_They()] look[p_s()] slightly dented.") else . += span_warning("[p_They()] look[p_s()] severely dented!") - if (getFireLoss()) - if (getFireLoss() < 30) + if (get_fire_loss()) + if (get_fire_loss() < 30) . += span_warning("[p_They()] look[p_s()] slightly charred.") else . += span_warning("[p_Their()] casing is melted and heat-warped!") diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm deleted file mode 100644 index 5e534297d77e..000000000000 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ /dev/null @@ -1,253 +0,0 @@ -// CAMERA NET -// -// The datum containing all the chunks. - -GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) - -/datum/cameranet - /// Name to show for VV and stat() - var/name = "Camera Net" - - /// The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm in Initialize() and Destroy(). - var/list/obj/machinery/camera/cameras = list() - /// The chunks of the map, mapping the areas that the cameras can see. - var/list/chunks = list() - - /// List of images cloned by all chunk static images put onto turfs cameras cant see - /// Indexed by the plane offset to use - var/list/image/obscured_images - -/datum/cameranet/New() - obscured_images = list() - update_offsets(SSmapping.max_plane_offset) - RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(on_offset_growth)) - -/datum/cameranet/proc/update_offsets(new_offset) - for(var/i in length(obscured_images) to new_offset) - var/image/obscured = new('icons/effects/cameravis.dmi') - SET_PLANE_W_SCALAR(obscured, CAMERA_STATIC_PLANE, i) - obscured.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR | KEEP_APART - obscured.override = TRUE - obscured_images += obscured - -/datum/cameranet/proc/on_offset_growth(datum/source, old_offset, new_offset) - SIGNAL_HANDLER - update_offsets(new_offset) - -/// Checks if a chunk has been Generated in x, y, z. -/datum/cameranet/proc/chunkGenerated(x, y, z) - x = GET_CHUNK_COORD(x) - y = GET_CHUNK_COORD(y) - if(GET_LOWEST_STACK_OFFSET(z) != 0) - var/turf/lowest = get_lowest_turf(locate(x, y, z)) - return chunks["[x],[y],[lowest.z]"] - - return chunks["[x],[y],[z]"] - -// Returns the chunk in the x, y, z. -// If there is no chunk, it creates a new chunk and returns that. -/datum/cameranet/proc/getCameraChunk(x, y, z) - x = GET_CHUNK_COORD(x) - y = GET_CHUNK_COORD(y) - var/turf/lowest = get_lowest_turf(locate(x, y, z)) - var/key = "[x],[y],[lowest.z]" - . = chunks[key] - if(!.) - chunks[key] = . = new /datum/camerachunk(x, y, lowest.z) - -/// Updates what the camera eye can see. It is recommended you use this when a camera eye moves or its location is set. -/datum/cameranet/proc/visibility(list/moved_eyes) - if(!islist(moved_eyes)) - moved_eyes = moved_eyes ? list(moved_eyes) : list() - - for(var/mob/eye/camera/eye as anything in moved_eyes) - var/list/visibleChunks = list() - //Get the eye's turf in case its located in an object like a mecha - var/turf/eye_turf = get_turf(eye) - if(eye.loc) - var/static_range = eye.static_visibility_range - var/x1 = max(1, eye_turf.x - static_range) - var/y1 = max(1, eye_turf.y - static_range) - var/x2 = min(world.maxx, eye_turf.x + static_range) - var/y2 = min(world.maxy, eye_turf.y + static_range) - - for(var/x = x1; x <= x2; x += CHUNK_SIZE) - for(var/y = y1; y <= y2; y += CHUNK_SIZE) - visibleChunks |= getCameraChunk(x, y, eye_turf.z) - - var/list/remove = eye.visibleCameraChunks - visibleChunks - var/list/add = visibleChunks - eye.visibleCameraChunks - - for(var/datum/camerachunk/chunk as anything in remove) - chunk.remove(eye) - - for(var/datum/camerachunk/chunk as anything in add) - chunk.add(eye) - -/// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. -/datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1) - if(!SSticker || (opacity_check && !A.opacity)) - return - majorChunkChange(A, 2) - -/datum/cameranet/proc/updateChunk(x, y, z) - var/datum/camerachunk/chunk = chunkGenerated(x, y, z) - if (!chunk) - return - chunk.hasChanged() - -/// Removes a camera from a chunk. -/datum/cameranet/proc/removeCamera(obj/machinery/camera/c) - majorChunkChange(c, 0) - -/// Add a camera to a chunk. -/datum/cameranet/proc/addCamera(obj/machinery/camera/c) - if(c.can_use()) - majorChunkChange(c, 1) - -/** - * Used for Cyborg/mecha cameras. Since portable cameras can be in ANY chunk. - * update_delay_buffer is passed all the way to hasChanged() from their camera updates on movement - * to change the time between static updates. -*/ -/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/updating_camera, update_delay_buffer) - if(updating_camera.can_use()) - majorChunkChange(updating_camera, 1, update_delay_buffer) - -/** - * Never access this proc directly!!!! - * This will update the chunk and all the surrounding chunks. - * It will also add the atom to the cameras list if you set the choice to 1. - * Setting the choice to 0 will remove the camera from the chunks. - * If you want to update the chunks around an object, without adding/removing a camera, use choice 2. - * update_delay_buffer is passed all the way to hasChanged() from portable camera updates on movement - * to change the time between static updates. - */ -/datum/cameranet/proc/majorChunkChange(atom/c, choice, update_delay_buffer) - PROTECTED_PROC(TRUE) - - if(QDELETED(c) && choice == 1) - CRASH("Tried to add a qdeleting camera to the net") - - var/turf/T = get_turf(c) - if(T) - var/x1 = max(1, T.x - (CHUNK_SIZE / 2)) - var/y1 = max(1, T.y - (CHUNK_SIZE / 2)) - var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) - var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) - for(var/x = x1; x <= x2; x += CHUNK_SIZE) - for(var/y = y1; y <= y2; y += CHUNK_SIZE) - var/datum/camerachunk/chunk = chunkGenerated(x, y, T.z) - if(chunk) - if(choice == 0) - // Remove the camera. - chunk.cameras["[T.z]"] -= c - else if(choice == 1) - // You can't have the same camera in the list twice. - chunk.cameras["[T.z]"] |= c - chunk.hasChanged(update_delay_buffer = update_delay_buffer) - -/// A faster, turf only version of [/datum/cameranet/proc/majorChunkChange] -/// For use in sensitive code, be careful with it -/datum/cameranet/proc/bareMajorChunkChange(turf/changed) - var/x1 = max(1, changed.x - (CHUNK_SIZE / 2)) - var/y1 = max(1, changed.y - (CHUNK_SIZE / 2)) - var/x2 = min(world.maxx, changed.x + (CHUNK_SIZE / 2)) - var/y2 = min(world.maxy, changed.y + (CHUNK_SIZE / 2)) - for(var/x = x1; x <= x2; x += CHUNK_SIZE) - for(var/y = y1; y <= y2; y += CHUNK_SIZE) - var/datum/camerachunk/chunk = chunkGenerated(x, y, changed.z) - chunk?.hasChanged() - -/// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. -/datum/cameranet/proc/checkCameraVis(mob/living/target) - var/turf/position = get_turf(target) - 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) - if(chunk.changed) - chunk.hasChanged(1) // Update now, no matter if it's visible or not. - if(chunk.visibleTurfs[position]) - 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 - -/// Returns list of available cameras, ready to use for UIs displaying list of them -/// The format is: list("name" = "camera.c_tag", ref = REF(camera)) -/datum/cameranet/proc/get_available_cameras_data(list/networks_available, list/z_levels_available) - var/list/available_cameras_data = list() - for(var/obj/machinery/camera/camera as anything in get_filtered_and_sorted_cameras(networks_available, z_levels_available)) - available_cameras_data += list(list( - name = camera.c_tag, - ref = REF(camera), - )) - - return available_cameras_data - -/** - * get_available_camera_by_tag_list - * - * Builds a list of all available cameras that can be seen to networks_available and in z_levels_available. - * Entries are stored in `c_tag[camera.can_use() ? null : " (Deactivated)"]` => `camera` format - * Args: - * networks_available - List of networks that we use to see which cameras are visible to it. - * z_levels_available - List of z levels to filter camera by. If empty, all z levels are considered valid. - * sort_by_ctag - If the resulting list should be sorted by `c_tag`. - */ -/datum/cameranet/proc/get_available_camera_by_tag_list(list/networks_available, list/z_levels_available) - var/list/available_cameras_by_tag = list() - for(var/obj/machinery/camera/camera as anything in get_filtered_and_sorted_cameras(networks_available, z_levels_available)) - available_cameras_by_tag["[camera.c_tag][camera.can_use() ? null : " (Deactivated)"]"] = camera - - return available_cameras_by_tag - -/// Returns list of all cameras that passed `is_camera_available` filter and sorted by `cmp_camera_ctag_asc` -/datum/cameranet/proc/get_filtered_and_sorted_cameras(list/networks_available, list/z_levels_available) - PRIVATE_PROC(TRUE) - - var/list/filtered_cameras = list() - for(var/obj/machinery/camera/camera as anything in cameras) - if(!is_camera_available(camera, networks_available, z_levels_available)) - continue - - filtered_cameras += camera - - return sortTim(filtered_cameras, GLOBAL_PROC_REF(cmp_camera_ctag_asc)) - -/// Checks if the `camera_to_check` meets the requirements of availability. -/datum/cameranet/proc/is_camera_available(obj/machinery/camera/camera_to_check, list/networks_available, list/z_levels_available) - PRIVATE_PROC(TRUE) - - if(!camera_to_check.c_tag) - return FALSE - - if(length(z_levels_available) && !(camera_to_check.z in z_levels_available)) - return FALSE - - return length(camera_to_check.network & networks_available) > 0 - -/obj/effect/overlay/camera_static - name = "static" - icon = null - icon_state = null - anchored = TRUE // should only appear in vis_contents, but to be safe - appearance_flags = RESET_TRANSFORM | TILE_BOUND | LONG_GLIDE - // this combination makes the static block clicks to everything below it, - // without appearing in the right-click menu for non-AI clients - mouse_opacity = MOUSE_OPACITY_ICON - invisibility = INVISIBILITY_ABSTRACT - - plane = CAMERA_STATIC_PLANE diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index a2dcee69cd12..23098ab15e97 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -1,5 +1,3 @@ -#define UPDATE_BUFFER_TIME (2.5 SECONDS) - /** * A 16x16 grid of the map with a list of turfs that can be seen, are visible and are dimmed. \ * Allows Camera Eyes to stream these chunks and know what it can and cannot see. @@ -12,7 +10,7 @@ var/list/visibleTurfs = list() ///cameras that can see into our grid ///indexed by the z level of the camera - var/list/cameras = list() + var/alist/cameras = alist() ///list of all turfs, associative with that turf's static image ///turf -> /image var/list/turfs = list() @@ -21,18 +19,19 @@ ///images currently in use on obscured turfs. var/list/active_static_images = list() - var/changed = FALSE var/x = 0 var/y = 0 var/lower_z var/upper_z -/// Add a camera eye to the chunk, then update if changed. + /// List of atoms that caused the chunk to update - assoc atom ref() to opacity on queue + var/list/update_sources = list() + +/// Add a camera eye to the chunk, updating the chunk if necessary. /datum/camerachunk/proc/add(mob/eye/camera/eye) eye.visibleCameraChunks += src seenby += eye - if(changed) - update() + force_update() var/client/client = eye.GetViewerClient() if(client && eye.use_visibility) @@ -47,36 +46,74 @@ if(client && eye.use_visibility && seenby.len == 0) client.images -= active_static_images -/// Called when a chunk has changed. I.E: A wall was deleted. -/datum/camerachunk/proc/visibilityChanged(turf/loc) - if(!visibleTurfs[loc]) +/** + * Queues the chuck to be updated after a delay. + * + * * update_source - the atom that caused the update + * * update_delay_buffer - the delay before the update is performed. Defaults to 0 (instant). + */ +/datum/camerachunk/proc/queue_update(atom/update_source, update_delay_buffer = 0) + // This chunk is being actively observed, skip queuing + if(length(seenby)) + addtimer(CALLBACK(src, PROC_REF(update)), update_delay_buffer || 1, TIMER_UNIQUE) + return + + // Only start queue if this is the first thing to queue an update + var/start_queue = !length(update_sources) + + var/update_key = REF(update_source) + // Camera updates will never be second guessed. + // Track the number of times the camera has queued an update instead of opacity (just for fun) + if(istype(update_source, /obj/machinery/camera)) + update_sources[update_source] += 1 + + // Otherwise track this atom's opacity at time of queue + else if(isnull(update_sources[update_key])) + update_sources[update_key] = update_source.opacity + + // If the tracked opacity does not match current opacity, + // that implies that the atom changed opacity twice in the time before the update happened + // So we can safely remove this atom as a "source of update" + else if(update_sources[update_key] != update_source.opacity) + update_sources -= update_key + return + + if(!start_queue) return - hasChanged() + + if(update_delay_buffer <= 0) + _queue_update() + else + addtimer(CALLBACK(src, PROC_REF(_queue_update)), update_delay_buffer, TIMER_UNIQUE) + +/datum/camerachunk/proc/_queue_update() + PRIVATE_PROC(TRUE) + // Something forced an update during the delay + if(!length(update_sources)) + return + SScameras.chunks_to_update[src] += 1 /** - * Updates the chunk, makes sure that it doesn't update too much. If the chunk isn't being watched it will - * instead be flagged to update the next time an AI Eye moves near it. + * Forces the chunk to update immediately * - * update_delay_buffer is used for cameras that are moving around, which are cyborg inbuilt cameras and - * mecha onboard cameras. This buffer should be usually lower than UPDATE_BUFFER_TIME because - * otherwise a moving camera can run out of its own view before updating static. + * * only_if_necessary - if TRUE, will not update the chunk unless it's been marked to update. */ -/datum/camerachunk/proc/hasChanged(update_now = 0, update_delay_buffer = UPDATE_BUFFER_TIME) - if(seenby.len || update_now) - addtimer(CALLBACK(src, PROC_REF(update)), update_delay_buffer, TIMER_UNIQUE) - else - changed = TRUE +/datum/camerachunk/proc/force_update(only_if_necessary = TRUE) + if(only_if_necessary && !length(update_sources)) + return + update() /// The actual updating. It gathers the visible turfs from cameras and puts them into the appropiate lists. -/// Accepts an optional partial_update argument, that blocks any calls out to chunks that could affect us, like above or below -/datum/camerachunk/proc/update(partial_update = FALSE) - if(GLOB.block_camera_updates) +/datum/camerachunk/proc/update() + if(SScameras.disable_camera_updates) return + update_sources.Cut() + var/list/updated_visible_turfs = list() for(var/z_level in lower_z to upper_z) - for(var/obj/machinery/camera/current_camera as anything in cameras["[z_level]"]) + for(var/obj/machinery/camera/current_camera as anything in cameras[z_level]) if(!current_camera || !current_camera.can_use()) continue @@ -84,9 +121,8 @@ if(get_dist(point, current_camera) > CHUNK_SIZE + (CHUNK_SIZE / 2)) continue - for(var/turf/vis_turf in current_camera.can_see()) - if(turfs[vis_turf]) - updated_visible_turfs[vis_turf] = vis_turf + for(var/turf/vis_turf as anything in turfs & current_camera.can_see()) + updated_visible_turfs[vis_turf] = vis_turf ///new turfs that we couldnt see last update but can now var/list/newly_visible_turfs = updated_visible_turfs - visibleTurfs @@ -121,8 +157,6 @@ active_static_images += static_image visibleTurfs = updated_visible_turfs - changed = FALSE - for(var/mob/eye/camera/client_eye as anything in seenby) var/client/client = client_eye.GetViewerClient() if(!client) @@ -156,9 +190,9 @@ if(mech.chassis_camera?.can_use()) local_cameras += mech.chassis_camera - cameras["[z_level]"] = local_cameras + cameras[z_level] = local_cameras - var/image/mirror_from = GLOB.cameranet.obscured_images[GET_Z_PLANE_OFFSET(z_level) + 1] + var/image/mirror_from = SScameras.obscured_images[GET_Z_PLANE_OFFSET(z_level) + 1] var/turf/chunk_corner = locate(x, y, z_level) for(var/turf/lad as anything in CORNER_BLOCK(chunk_corner, CHUNK_SIZE, CHUNK_SIZE)) //we use CHUNK_SIZE for width and height here as it handles subtracting 1 from those two parameters by itself var/image/our_image = new /image(mirror_from) @@ -172,18 +206,10 @@ if(!camera.can_use()) continue - for(var/turf/vis_turf in camera.can_see()) - if(turfs[vis_turf]) - visibleTurfs[vis_turf] = vis_turf + for(var/turf/vis_turf as anything in turfs & camera.can_see()) + visibleTurfs[vis_turf] = vis_turf for(var/turf/obscured_turf as anything in turfs - visibleTurfs) var/image/new_static = turfs[obscured_turf] active_static_images += new_static obscuredTurfs[obscured_turf] = new_static - -#undef UPDATE_BUFFER_TIME - -GLOBAL_VAR_INIT(block_camera_updates, FALSE) - -ADMIN_VERB(pause_camera_updates, R_ADMIN, "Toggle Camera Updates", "Stop security cameras from updating, meaning what they see now is what they will see forever.", ADMIN_CATEGORY_DEBUG) - GLOB.block_camera_updates = !GLOB.block_camera_updates diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 900ff158ee72..c6804d4c6b74 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -219,9 +219,9 @@ acceleration = !acceleration to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].") -/mob/eye/camera/ai/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/mob/eye/camera/ai/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range, source) // DARKPACK EDIT, ORIGINAL: /mob/eye/camera/ai/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) . = ..() - if(relay_speech && speaker && ai && !radio_freq && speaker != ai && GLOB.cameranet.checkCameraVis(speaker)) + if(relay_speech && speaker && ai && !radio_freq && speaker != ai && SScameras.is_visible_by_cameras(speaker)) ai.relay_speech(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 6de5c807a903..311a700fd150 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -15,7 +15,7 @@ // Handle power damage (oxy) if (battery <= 0 && lacks_power()) to_chat(src, span_warning("Your backup battery's output drops below usable levels. It takes only a moment longer for your systems to fail, corrupted and unusable.")) - adjustOxyLoss(200) + adjust_oxy_loss(200) if(aiRestorePowerRoutine) // Lost power @@ -51,7 +51,7 @@ return var/old_health = health - set_health(maxHealth - getOxyLoss() - getToxLoss() - getBruteLoss() - getFireLoss()) + set_health(maxHealth - get_oxy_loss() - get_tox_loss() - get_brute_loss() - get_fire_loss()) var/old_stat = stat update_stat() diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm index 148980bd04a9..f19defcc7482 100644 --- a/code/modules/mob/living/silicon/ai/multicam.dm +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -105,7 +105,7 @@ static_lighting = FALSE base_lighting_alpha = 255 - area_flags = NOTELEPORT | HIDDEN_AREA | UNIQUE_AREA + area_flags = NOTELEPORT | HIDDEN_AREA ambientsounds = null flags_1 = NONE diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index 90a41f1f2bf0..d2608e89427e 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -1,34 +1,34 @@ /mob/living/silicon/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = FALSE) return FALSE //The only effect that can hit them atm is flashes and they still directly edit so this works for now. (This was written in at least 2016. Help) -/mob/living/silicon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) //immune to tox damage +/mob/living/silicon/adjust_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype) //immune to tox damage return FALSE -/mob/living/silicon/setToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) +/mob/living/silicon/set_tox_loss(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. +/mob/living/silicon/adjust_stamina_loss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) //immune to stamina damage. return FALSE -/mob/living/silicon/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) +/mob/living/silicon/set_stamina_loss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) return FALSE /mob/living/silicon/received_stamina_damage(current_level, amount_actual, amount) return -/mob/living/silicon/adjustOrganLoss(slot, amount, maximum = 500, required_organ_flag) //immune to organ damage (no organs, duh) +/mob/living/silicon/adjust_organ_loss(slot, amount, maximum = 500, required_organ_flag) //immune to organ damage (no organs, duh) return FALSE -/mob/living/silicon/setOrganLoss(slot, amount) +/mob/living/silicon/set_organ_loss(slot, amount) return FALSE -/mob/living/silicon/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype, required_respiration_type) //immune to oxygen damage +/mob/living/silicon/adjust_oxy_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype, required_respiration_type) //immune to oxygen damage if(isAI(src)) //ais are snowflakes and use oxyloss for being in AI cards and having no battery return ..() return FALSE -/mob/living/silicon/setOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) +/mob/living/silicon/set_oxy_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype) if(isAI(src)) //ditto return ..() diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index ea62dcc2a9cc..8aff9b59278b 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -33,9 +33,9 @@ /// Plays an animation of the player's hud flavored about their death somewhat /mob/living/silicon/proc/death_sequence() var/cause_of_death - if(getBruteLoss() + getFireLoss() > 100) + if(get_brute_loss() + get_fire_loss() > 100) cause_of_death = "Critical damage sustained." - if(getOxyLoss() > 100) + if(get_oxy_loss() > 100) cause_of_death = "Critically low power." var/atom/movable/screen/cyborg_death/deathhud = new(null, hud_used, cause_of_death) diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index 388835b7a9a8..be5bc6e95cdd 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -10,13 +10,13 @@ if(act_module) . += "[p_Theyre()] holding [icon2html(act_module, user)] \a [act_module]." . += get_status_effect_examinations() - if (getBruteLoss()) - if (getBruteLoss() < maxHealth*0.5) + if (get_brute_loss()) + if (get_brute_loss() < maxHealth*0.5) . += span_warning("[p_They()] look[p_s()] slightly dented.") else . += span_boldwarning("[p_They()] look[p_s()] severely dented!") - if (getFireLoss() || getToxLoss()) - var/overall_fireloss = getFireLoss() + getToxLoss() + if (get_fire_loss() || get_tox_loss()) + var/overall_fireloss = get_fire_loss() + get_tox_loss() if (overall_fireloss < maxHealth * 0.5) . += span_warning("[p_They()] look[p_s()] slightly charred.") else @@ -48,3 +48,6 @@ . += span_deadsay("[p_They()] look[p_s()] like its system is corrupted and requires a reset.") . += ..() + +/mob/living/silicon/robot/examine_descriptor(mob/user) + return "cyborg" diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index eb9eb2d2fc02..3d725c96dc83 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -3,7 +3,7 @@ spark_system.set_up(5, 0, src) spark_system.attach(src) - add_traits(list(TRAIT_CAN_STRIP, TRAIT_FORCED_STANDING, TRAIT_KNOW_ENGI_WIRES), INNATE_TRAIT) + add_traits(list(TRAIT_CAN_STRIP, TRAIT_FORCED_STANDING, TRAIT_KNOW_ENGI_WIRES, TRAIT_IGNORE_SURGERY_MODIFIERS), INNATE_TRAIT) AddComponent(/datum/component/tippable, \ tip_time = 3 SECONDS, \ untip_time = 2 SECONDS, \ @@ -84,7 +84,13 @@ log_silicon("New cyborg [key_name(src)] created with [connected_ai ? "master AI: [key_name(connected_ai)]" : "no master AI"]") log_current_laws() - alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER, ALARM_CAMERA, ALARM_BURGLAR, ALARM_MOTION), list(z)) + var/static/list/alert_areas + if(isnull(alert_areas)) + alert_areas = (GLOB.the_station_areas + typesof(/area/mine)) + if(is_station_level(z)) + alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER, ALARM_CAMERA, ALARM_BURGLAR, ALARM_MOTION), SSmapping.levels_by_trait(ZTRAIT_STATION), alert_areas) + else + alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER, ALARM_CAMERA, ALARM_BURGLAR, ALARM_MOTION), (SSmapping.levels_by_trait(ZTRAIT_STATION) + z), alert_areas) RegisterSignal(alert_control.listener, COMSIG_ALARM_LISTENER_TRIGGERED, PROC_REF(alarm_triggered)) RegisterSignal(alert_control.listener, COMSIG_ALARM_LISTENER_CLEARED, PROC_REF(alarm_cleared)) alert_control.listener.RegisterSignal(src, COMSIG_LIVING_DEATH, TYPE_PROC_REF(/datum/alarm_listener, prevent_alarm_changes)) diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index e198a254c8b2..b98b18787cae 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -20,7 +20,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real balloon_alert(user, "expose the wires first!") return ITEM_INTERACT_BLOCKING var/obj/item/stack/cable_coil/coil = tool - if (getFireLoss() <= 0) + if (get_fire_loss() <= 0) balloon_alert(user, "wires are fine!") return ITEM_INTERACT_BLOCKING if(src == user) @@ -30,7 +30,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real if (!coil.use(1)) balloon_alert(user, "not enough cable!") return ITEM_INTERACT_BLOCKING - adjustFireLoss(-30) + adjust_fire_loss(-30) playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) balloon_alert(user, "wires repaired") user.visible_message( @@ -227,7 +227,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real return ITEM_INTERACT_BLOCKING locked = !locked update_icons() - balloon_alert(user, "chassis cover lock [emagged ? "glitches" : "toggled"]") + balloon_alert(user, "chassis cover [emagged ? "lock glitches" : "[locked ? "locked" : "unlocked"]"]") logevent("[emagged ? "ChÃ¥vÃis" : "Chassis"] cover lock has been [locked ? "engaged" : "released"]") return ITEM_INTERACT_SUCCESS @@ -321,7 +321,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real return NONE user.changeNext_move(CLICK_CD_MELEE) - if (!getBruteLoss()) + if (!get_brute_loss()) balloon_alert(user, "no dents to fix!") return ITEM_INTERACT_BLOCKING if (!tool.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) //The welder has 1u of fuel consumed by its afterattack, so we don't need to worry about taking any away. @@ -331,10 +331,10 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real if(!tool.use_tool(src, user, delay = 5 SECONDS, amount = 1, volume = 50)) return ITEM_INTERACT_BLOCKING else - if(!tool.use_tool(src, user, delay = 0 SECONDS, amount = 1, volume = 50)) + if(!tool.use_tool(src, user, delay = 0.5 SECONDS, amount = 1, volume = 50)) return ITEM_INTERACT_BLOCKING - adjustBruteLoss(-30) + adjust_brute_loss(-30) add_fingerprint(user) balloon_alert(user, "dents fixed") user.visible_message( @@ -453,7 +453,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real ResetModel() return TRUE - SetEmagged(1) + SetEmagged(TRUE) SetStun(10 SECONDS) //Borgs were getting into trouble because they would attack the emagger before the new laws were shown lawupdate = FALSE set_connected_ai(null) @@ -498,7 +498,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real /mob/living/silicon/robot/blob_act(obj/structure/blob/B) if(stat != DEAD) - adjustBruteLoss(30) + adjust_brute_loss(30) else investigate_log("has been gibbed by a blob.", INVESTIGATE_DEATHS) gib(DROP_ALL_REMAINS) @@ -512,11 +512,11 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real return TRUE if(EXPLODE_HEAVY) if (stat != DEAD) - adjustBruteLoss(60) - adjustFireLoss(60) + adjust_brute_loss(60) + adjust_fire_loss(60) if(EXPLODE_LIGHT) if (stat != DEAD) - adjustBruteLoss(30) + adjust_brute_loss(30) return TRUE diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index fbdccc3e1f37..13fd3d53d4b8 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -197,7 +197,7 @@ if(!istype(charger)) return - var/datum/component/material_container/mat_container = charger.materials.mat_container + var/datum/material_container/mat_container = charger.materials.mat_container if(!mat_container || charger.materials.on_hold()) charger.sendmats = FALSE return diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index a5a08116affa..b7f8fd2900f7 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -38,7 +38,7 @@ ///Are our siliconHUDs on? TRUE for yes, FALSE for no. var/sensors_on = TRUE - var/list/silicon_huds = list(DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_SECURITY_ADVANCED, DATA_HUD_DIAGNOSTIC) + var/list/silicon_huds = list(TRAIT_MEDICAL_HUD, TRAIT_SECURITY_HUD, TRAIT_DIAGNOSTIC_HUD) var/law_change_counter = 0 var/obj/machinery/camera/silicon/builtInCamera @@ -60,8 +60,8 @@ faction += FACTION_SILICON if(ispath(radio)) radio = new radio(src) - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_atom_to_hud(src) + var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC] + diag_hud.add_atom_to_hud(src) diag_hud_set_status() diag_hud_set_health() add_sensors() @@ -417,15 +417,16 @@ /mob/living/silicon/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt silicon units return -10 +/// Innate, toggleable silicon HUDs +#define SILICON_HUD_TRAIT "silicon_hud" + /mob/living/silicon/proc/remove_sensors() - for (var/hud_type in silicon_huds) - var/datum/atom_hud/silicon_hud = GLOB.huds[hud_type] - silicon_hud.hide_from(src) + remove_traits(silicon_huds, SILICON_HUD_TRAIT) /mob/living/silicon/proc/add_sensors() - for (var/hud_type in silicon_huds) - var/datum/atom_hud/silicon_hud = GLOB.huds[hud_type] - silicon_hud.show_to(src) + add_traits(silicon_huds, SILICON_HUD_TRAIT) + +#undef SILICON_HUD_TRAIT /mob/living/silicon/proc/toggle_sensors() if(incapacitated) @@ -449,7 +450,7 @@ return /mob/living/silicon/rust_heretic_act() - adjustBruteLoss(500) + adjust_brute_loss(500) /mob/living/silicon/on_floored_start() return // Silicons are always standing by default. diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index 6fb367dc223c..344b71a8fc45 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -2,8 +2,8 @@ /mob/living/silicon/grippedby(mob/living/carbon/user, instant = FALSE) return //can't upgrade a simple pull into a more aggressive grab. -/mob/living/silicon/get_ear_protection()//no ears - return 2 +/mob/living/silicon/get_ear_protection(ignore_deafness = FALSE) + return ..() + EAR_PROTECTION_HEAVY //no ears /mob/living/silicon/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) . = ..() @@ -17,7 +17,7 @@ to_chat(user, span_danger("You slash at [src]!")) if(prob(8)) flash_act(affect_silicon = 1) - adjustBruteLoss(damage) + adjust_brute_loss(damage) log_combat(user, src, "attacked") else playsound(loc, 'sound/items/weapons/slashmiss.ogg', 25, TRUE, -1) @@ -51,7 +51,7 @@ . = ..() if(!.) return - adjustBruteLoss(rand(10, 15)) + adjust_brute_loss(rand(10, 15)) playsound(loc, SFX_PUNCH, 25, TRUE, -1) visible_message(span_danger("[user] punches [src]!"), \ span_userdanger("[user] punches you!"), null, COMBAT_MESSAGE_RANGE, user) @@ -159,3 +159,6 @@ apply_status_effect(/datum/status_effect/borg_slow, damage_done / 60) #undef CYBORG_SLOWDOWN_THRESHOLD + +/mob/living/silicon/hypnosis_vulnerable() + return FALSE //It obeys its laws diff --git a/code/modules/mob/living/silicon/silicon_movement.dm b/code/modules/mob/living/silicon/silicon_movement.dm index 0ea6ece169c1..7ead122301bf 100644 --- a/code/modules/mob/living/silicon/silicon_movement.dm +++ b/code/modules/mob/living/silicon/silicon_movement.dm @@ -19,6 +19,6 @@ */ /mob/living/silicon/proc/do_camera_update(oldLoc) if(oldLoc != get_turf(src)) - GLOB.cameranet.updatePortableCamera(builtInCamera, SILICON_CAMERA_BUFFER) + SScameras.update_portable_camera(builtInCamera, SILICON_CAMERA_BUFFER) updating = FALSE #undef SILICON_CAMERA_BUFFER diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 2c7bc4583e2c..ac3637d7fd26 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -50,7 +50,7 @@ visible_message(span_danger("[user] punches [src]!"), \ span_userdanger("You're punched by [user]!"), null, COMBAT_MESSAGE_RANGE, user) to_chat(user, span_danger("You punch [src]!")) - adjustBruteLoss(15) + adjust_brute_loss(15) /mob/living/simple_animal/attack_paw(mob/living/carbon/human/user, list/modifiers) if(..()) //successful monkey bite. @@ -118,7 +118,7 @@ /mob/living/simple_animal/proc/ex_act_devastate() var/bomb_armor = getarmor(null, BOMB) if(prob(bomb_armor)) - adjustBruteLoss(500) + adjust_brute_loss(500) else investigate_log("has been gibbed by an explosion.", INVESTIGATE_DEATHS) gib() @@ -129,7 +129,7 @@ var/bloss = 60 if(prob(bomb_armor)) bloss = bloss / 1.5 - adjustBruteLoss(bloss) + adjust_brute_loss(bloss) /// Called when a light explosive acts on this mob /mob/living/simple_animal/proc/ex_act_light() @@ -137,10 +137,10 @@ var/bloss = 30 if(prob(bomb_armor)) bloss = bloss / 1.5 - adjustBruteLoss(bloss) + adjust_brute_loss(bloss) /mob/living/simple_animal/blob_act(obj/structure/blob/B) - adjustBruteLoss(20) + adjust_brute_loss(20) return /mob/living/simple_animal/do_attack_animation(atom/A, visual_effect_icon, used_item, no_effect) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index cb740063e55f..1462345ff210 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -1,5 +1,6 @@ // AI (i.e. game AI, not the AI player) controlled bots /mob/living/simple_animal/bot + abstract_type = /mob/living/simple_animal/bot icon = 'icons/mob/silicon/aibots.dmi' layer = MOB_LAYER gender = NEUTER @@ -94,7 +95,7 @@ var/turf/nearest_beacon_loc ///The type of data HUD the bot uses. Diagnostic by default. - var/data_hud_type = DATA_HUD_DIAGNOSTIC + var/data_hud_type = TRAIT_DIAGNOSTIC_HUD var/datum/atom_hud/data/bot_path/private/path_hud var/path_image_icon = 'icons/mob/silicon/aibots.dmi' var/path_image_icon_state = "path_indicator" @@ -183,16 +184,15 @@ //Adds bot to the diagnostic HUD system prepare_huds() - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_atom_to_hud(src) + var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC] + diag_hud.add_atom_to_hud(src) diag_hud_set_bothealth() diag_hud_set_botstat() diag_hud_set_botmode() //If a bot has its own HUD (for player bots), provide it. if(!isnull(data_hud_type)) - var/datum/atom_hud/datahud = GLOB.huds[data_hud_type] - datahud.show_to(src) + ADD_TRAIT(src, data_hud_type, INNATE_TRAIT) if(path_hud) path_hud.add_atom_to_hud(src) path_hud.show_to(src) @@ -1210,7 +1210,7 @@ Pass a positive integer as an argument to override a bot's default speed. addtimer(CALLBACK(src, PROC_REF(set_path), null), 0.6 SECONDS) // Enough time for the animate to finish /mob/living/simple_animal/bot/rust_heretic_act() - adjustBruteLoss(400) + adjust_brute_loss(400) /mob/living/simple_animal/bot/get_hit_area_message(input_area) // we just get hit, there's no complexity for hitting an arm (if it exists) or anything. diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index ea8eed7201ce..11953281a2b6 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -6,23 +6,17 @@ force = 3 throw_speed = 2 throw_range = 5 + obj_flags = UNIQUE_RENAME | RENAME_NO_DESC var/created_name var/build_step = ASSEMBLY_FIRST_STEP var/robot_arm = /obj/item/bodypart/arm/right/robot -/obj/item/bot_assembly/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) - ..() - if(IS_WRITING_UTENSIL(I)) - rename_bot() - return +/obj/item/bot_assembly/nameformat(input, user) + created_name = input + return input -/obj/item/bot_assembly/proc/rename_bot() - var/t = sanitize_name(tgui_input_text(usr, "Enter a new robot name", "Robot Rename", created_name, MAX_NAME_LEN), allow_numbers = TRUE) - if(!t) - return - if(!in_range(src, usr) && loc != usr) - return - created_name = t +/obj/item/bot_assembly/rename_reset() + created_name = initial(created_name) /** * Checks if the user can finish constructing a bot with a given item. @@ -505,6 +499,7 @@ desc = "Clear out the swamp once and for all" icon_state = "hygienebot" created_name = "Hygienebot" + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) /obj/item/bot_assembly/hygienebot/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) . = ..() diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 81fad948ae12..5a615407f9a0 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -15,8 +15,10 @@ automated_announcements = list(ED209_VOICED_DOWN_WEAPONS = 'sound/mobs/non-humanoids/ed209/ed209_20sec.ogg') + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.8, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2.1) + var/lastfired = 0 - var/shot_delay = 15 + var/shot_delay = 1.5 SECONDS var/shoot_sound = 'sound/items/weapons/laser.ogg' var/projectile = /obj/projectile/beam/disabler var/fair_market_projectile = /obj/projectile/bullet/c38 // For shooting the worst scumbags of all: the poor diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index ca875f651462..5095a1e4baa7 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -164,46 +164,46 @@ return if(!cell) to_chat(user, span_warning("[src] doesn't have a power cell!")) - return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING cell.add_fingerprint(user) - if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(cell) - else - cell.forceMove(drop_location()) 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() + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(cell) + else + cell.forceMove(drop_location()) return ITEM_INTERACT_SUCCESS -/mob/living/simple_animal/bot/mulebot/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) - if(istype(I, /obj/item/stock_parts/power_store/cell) && bot_cover_flags & BOT_COVER_MAINTS_OPEN) +/mob/living/simple_animal/bot/mulebot/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/stock_parts/power_store/cell) && (bot_cover_flags & BOT_COVER_MAINTS_OPEN)) if(cell) to_chat(user, span_warning("[src] already has a power cell!")) - return TRUE - if(!user.transferItemToLoc(I, src)) - return TRUE - cell = I + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + cell = tool diag_hud_set_mulebotcell() user.visible_message( span_notice("[user] inserts \a [cell] into [src]."), span_notice("You insert [cell] into [src]."), ) + return ITEM_INTERACT_SUCCESS + if(is_wire_tool(tool) && (bot_cover_flags & BOT_COVER_MAINTS_OPEN)) + attack_hand(user) + return ITEM_INTERACT_SUCCESS + return ..() + +/mob/living/simple_animal/bot/mulebot/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) + . = ..() + if(ismob(load) && prob(1 + attacking_item.force * 2)) + user.visible_message( + span_danger("[user] knocks [load] off [src] with \the [attacking_item]!"), + span_danger("You knock [load] off [src] with \the [attacking_item]!"), + ) + unload(0) return TRUE - else if(is_wire_tool(I) && bot_cover_flags & BOT_COVER_MAINTS_OPEN) - return attack_hand(user) - else if(load && ismob(load)) // chance to knock off rider - if(prob(1 + I.force * 2)) - unload(0) - user.visible_message(span_danger("[user] knocks [load] off [src] with \the [I]!"), - span_danger("You knock [load] off [src] with \the [I]!")) - else - to_chat(user, span_warning("You hit [src] with \the [I] but to no effect!")) - return ..() - else - return ..() /mob/living/simple_animal/bot/mulebot/emag_act(mob/user, obj/item/card/emag/emag_card) if(!(bot_cover_flags & BOT_COVER_EMAGGED)) @@ -451,11 +451,11 @@ unbuckle_all_mobs() if(load) //don't have to do any of this for mobs. - load.forceMove(loc) - load.pixel_y = initial(load.pixel_y) - load.layer = initial(load.layer) - SET_PLANE_EXPLICIT(load, initial(load.plane), src) load = null + cached_load.forceMove(loc) + cached_load.pixel_y = initial(cached_load.pixel_y) + cached_load.layer = initial(cached_load.layer) + SET_PLANE_EXPLICIT(cached_load, initial(cached_load.plane), src) if(dirn) //move the thing to the delivery point. cached_load.Move(get_step(loc,dirn), dirn) @@ -500,7 +500,7 @@ if(HAS_TRAIT(src, TRAIT_IMMOBILIZED)) return - var/speed = (wires.is_cut(WIRE_MOTOR1) ? 0 : 1) + (wires.is_cut(WIRE_MOTOR2) ? 0 : 2) + var/speed = (wires.is_cut(WIRE_MOTOR1) ? 0 : 2) + (wires.is_cut(WIRE_MOTOR2) ? 0 : 1) if(!speed)//Devide by zero man bad return num_steps = round(10/speed) //10, 5, or 3 steps, depending on how many wires we have cut diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index d902fdf1eff8..b6c0b63d65d6 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -20,7 +20,7 @@ radio_channel = RADIO_CHANNEL_SECURITY //Security channel bot_type = SEC_BOT bot_mode_flags = ~BOT_MODE_CAN_BE_SAPIENT - data_hud_type = DATA_HUD_SECURITY_ADVANCED + data_hud_type = TRAIT_SECURITY_HUD hackables = "target identification systems" path_image_color = COLOR_RED possessed_message = "You are a securitron! Guard the station to the best of your ability!" @@ -34,6 +34,8 @@ BEEPSKY_VOICED_SECURE_DAY = 'sound/mobs/non-humanoids/beepsky/secureday.ogg', ) + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.2, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3.2) + ///Whether this secbot is considered 'commissioned' and given the trait on Initialize. var/commissioned = FALSE ///The type of baton this Secbot will use @@ -592,7 +594,7 @@ nap_violation(target) return FALSE var/datum/bank_account/beepsky_department_account = SSeconomy.get_dep_account(payment_department) - say("Thank you for your compliance. Your account been charged [fair_market_price] credits.") + say("Thank you for your compliance. Your account been charged [fair_market_price] [MONEY_NAME].") if(beepsky_department_account) beepsky_department_account.adjust_money(fair_market_price) return TRUE diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm index 78eb0983c50c..2d62e8f314f5 100644 --- a/code/modules/mob/living/simple_animal/damage_procs.dm +++ b/code/modules/mob/living/simple_animal/damage_procs.dm @@ -25,7 +25,7 @@ return modifier * damage_coeff[damage_type] return modifier -/mob/living/simple_animal/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/simple_animal/adjust_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!can_adjust_brute_loss(amount, forced, required_bodytype)) return 0 if(forced) @@ -33,7 +33,7 @@ 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) +/mob/living/simple_animal/adjust_fire_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!can_adjust_fire_loss(amount, forced, required_bodytype)) return 0 if(forced) @@ -41,7 +41,7 @@ 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) +/mob/living/simple_animal/adjust_oxy_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype, required_respiration_type) if(!can_adjust_oxy_loss(amount, forced, required_biotype, required_respiration_type)) return 0 if(forced) @@ -49,7 +49,7 @@ 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) +/mob/living/simple_animal/adjust_tox_loss(amount, updating_health = TRUE, forced = FALSE, required_biotype) if(!can_adjust_tox_loss(amount, forced, required_biotype)) return 0 if(forced) @@ -57,7 +57,7 @@ else if(damage_coeff[TOX]) . = adjustHealth(amount * damage_coeff[TOX] * CONFIG_GET(number/damage_multiplier), updating_health, forced) -/mob/living/simple_animal/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) +/mob/living/simple_animal/adjust_stamina_loss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype) if(!can_adjust_stamina_loss(amount, forced, required_biotype)) return 0 var/old_stamloss = staminaloss diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index bd8b6fdc01c8..51012b0c2efd 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -11,7 +11,7 @@ ///How many shots per volley. var/rapid = 0 ///Time between rapid fire shots - var/rapid_fire_delay = 2 + var/rapid_fire_delay = 2 DECISECONDS ///Are we dodging? var/dodging = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm deleted file mode 100644 index 65c03c446df5..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ /dev/null @@ -1,83 +0,0 @@ -/mob/living/simple_animal/hostile/illusion - name = "illusion" - desc = "It's a fake!" - icon = 'icons/effects/effects.dmi' - icon_state = "static" - icon_living = "static" - icon_dead = "null" - gender = NEUTER - mob_biotypes = NONE - melee_damage_lower = 5 - melee_damage_upper = 5 - combat_mode = TRUE - attack_verb_continuous = "gores" - attack_verb_simple = "gore" - maxHealth = 100 - health = 100 - speed = 0 - faction = list(FACTION_ILLUSION) - 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/proc/Copy_Parent(mob/living/original, life = 5 SECONDS, hp = 100, damage = 0, replicate = 0) - appearance = original.appearance - parent_mob_ref = WEAKREF(original) - setDir(original.dir) - maxHealth = hp - updatehealth() // re-cap health to new value - melee_damage_lower = damage - melee_damage_upper = damage - multiply_chance = replicate - faction -= FACTION_NEUTRAL - 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) - return ..() - -/mob/living/simple_animal/hostile/illusion/AttackingTarget() - . = ..() - 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///////// - -/mob/living/simple_animal/hostile/illusion/escape - retreat_distance = 10 - minimum_distance = 10 - melee_damage_lower = 0 - melee_damage_upper = 0 - speed = -1 - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - - -/mob/living/simple_animal/hostile/illusion/escape/AttackingTarget() - return FALSE - -/mob/living/simple_animal/hostile/illusion/mirage - AIStatus = AI_OFF - density = FALSE - -/mob/living/simple_animal/hostile/illusion/mirage/death(gibbed) - do_sparks(rand(3, 6), FALSE, src) - return ..() 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 24f75ff9300e..29c84d42bddd 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm @@ -147,7 +147,7 @@ qdel(victim.get_organ_slot(ORGAN_SLOT_LUNGS)) qdel(victim.get_organ_slot(ORGAN_SLOT_HEART)) qdel(victim.get_organ_slot(ORGAN_SLOT_LIVER)) - victim.adjustBruteLoss(500) + victim.adjust_brute_loss(500) victim.death() //make sure they die victim.apply_status_effect(/datum/status_effect/gutted) LoseTarget() @@ -170,13 +170,13 @@ /mob/living/simple_animal/hostile/megafauna/ex_act(severity, target) switch (severity) if (EXPLODE_DEVASTATE) - adjustBruteLoss(250) + adjust_brute_loss(250) if (EXPLODE_HEAVY) - adjustBruteLoss(100) + adjust_brute_loss(100) if (EXPLODE_LIGHT) - adjustBruteLoss(50) + adjust_brute_loss(50) return TRUE 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 ab8aa9aa31eb..563ffdb45aa6 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 @@ -41,7 +41,7 @@ Difficulty: Medium loot = list(/obj/item/melee/cleaving_saw, /obj/item/gun/energy/recharge/kinetic_accelerator) wander = FALSE del_on_death = TRUE - blood_volume = BLOOD_VOLUME_NORMAL + default_blood_volume = BLOOD_VOLUME_NORMAL gps_name = "Resonant Signal" achievement_type = /datum/award/achievement/boss/blood_miner_kill crusher_achievement_type = /datum/award/achievement/boss/blood_miner_crusher @@ -78,7 +78,7 @@ Difficulty: Medium dash_attack.Grant(src) transform_weapon.Grant(src) - AddComponent(/datum/component/boss_music, 'sound/music/boss/bdm_boss.ogg', 167 SECONDS) + AddComponent(/datum/component/boss_music, 'sound/music/boss/bdm_boss.ogg') /// Block deletion of their saw under normal circumstances. It is fused to their hands as far as we're concerned. /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/on_saw_deleted(datum/source, force) @@ -127,10 +127,9 @@ Difficulty: Medium changeNext_move(adjustment_amount) //attacking it interrupts it attacking, but only briefly . = ..() -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/death() - . = ..() - if(.) - new /obj/effect/temp_visual/dir_setting/miner_death(loc, dir) +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/drop_loot(drop_loc) + new /obj/effect/temp_visual/dir_setting/miner_death(loc, dir) + return ..() /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Move(atom/newloc) if(newloc && newloc.z == z && ischasm(newloc)) //we're not stupid! 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 e1ea630a4650..cdd367332ac1 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -61,7 +61,7 @@ Difficulty: Hard loot = list(/obj/structure/closet/crate/necropolis/bubblegum) crusher_loot = /obj/structure/closet/crate/necropolis/bubblegum/crusher replace_crusher_drop = TRUE - blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME + default_blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME gps_name = "Bloody Signal" achievement_type = /datum/award/achievement/boss/bubblegum_kill crusher_achievement_type = /datum/award/achievement/boss/bubblegum_crusher @@ -275,7 +275,7 @@ Difficulty: Hard set_varspeed(move_to_delay) handle_automated_action() // need to recheck movement otherwise move_to_delay won't update until the next checking aka will be wrong speed for a bit -/mob/living/simple_animal/hostile/megafauna/bubblegum/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/simple_animal/hostile/megafauna/bubblegum/adjust_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) . = ..() anger_modifier = clamp(((maxHealth - health)/60),0,20) enrage_time = initial(enrage_time) * clamp(anger_modifier / 20, 0.5, 1) @@ -298,9 +298,9 @@ Difficulty: Hard if(.) recovery_time = world.time + 20 // can only attack melee once every 2 seconds but rapid_melee gives higher priority -/mob/living/simple_animal/hostile/megafauna/bubblegum/bullet_act(obj/projectile/proj) +/mob/living/simple_animal/hostile/megafauna/bubblegum/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) if(BUBBLEGUM_IS_ENRAGED) - visible_message(span_danger("[src] deflects the [proj]! [p_They()] can't be hit with ranged weapons while enraged!"), span_userdanger("You deflect the projectile!")) + visible_message(span_danger("[src] deflects the [hitting_projectile]! [p_They()] can't be hit with ranged weapons while enraged!"), span_userdanger("You deflect the projectile!")) playsound(src, SFX_BULLET_MISS, 300, TRUE) return BULLET_ACT_BLOCK return ..() @@ -344,7 +344,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Life(seconds_per_tick = SSMOBS_DT, times_fired) return -/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/adjust_brute_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) return /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/OpenFire() 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 5758a59faaa1..b43b9742b89f 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 @@ -23,7 +23,7 @@ I'd rather there be something than the clockwork ruin be entirely empty though s armour_penetration = 40 melee_damage_lower = 20 melee_damage_upper = 20 - mob_biotypes = MOB_ROBOTIC|MOB_SPECIAL|MOB_MINING + mob_biotypes = MOB_ROBOTIC|MOB_SPECIAL|MOB_MINING|MOB_MINERAL vision_range = 9 aggro_vision_range = 9 speed = 5 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 a29e003dcca7..79ef2e1bfd3e 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 @@ -36,7 +36,7 @@ Difficulty: Extremely Hard loot = list(/obj/effect/decal/remains/plasma, /obj/item/ice_energy_crystal) wander = FALSE del_on_death = TRUE - blood_volume = BLOOD_VOLUME_NORMAL + default_blood_volume = BLOOD_VOLUME_NORMAL achievement_type = /datum/award/achievement/boss/demonic_miner_kill crusher_achievement_type = /datum/award/achievement/boss/demonic_miner_crusher score_achievement_type = /datum/award/score/demonic_miner_score @@ -81,7 +81,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/music/boss/bdm_boss.ogg', 167 SECONDS) + AddComponent(/datum/component/boss_music, 'sound/music/boss/bdm_boss.ogg') /mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/Destroy() frost_orbs = null @@ -158,7 +158,7 @@ Difficulty: Extremely Hard adjustHealth(-maxHealth) /mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/ex_act(severity, target) - adjustBruteLoss(-30 * severity) + adjust_brute_loss(-30 * severity) visible_message(span_danger("[src] absorbs the explosion!"), span_userdanger("You absorb the explosion!")) return 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 cca2440f1228..df31650e2f92 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -154,7 +154,7 @@ /mob/living/simple_animal/hostile/megafauna/dragon/proc/arena_escape_enrage() // you ran somehow / teleported away from my arena attack now i'm mad fucker SLEEP_CHECK_DEATH(0, src) visible_message(span_boldwarning("[src] starts to glow vibrantly as its wounds close up!")) - adjustBruteLoss(-250) // yeah you're gonna pay for that, don't run nerd + adjust_brute_loss(-250) // yeah you're gonna pay for that, don't run nerd add_atom_colour(rgb(255, 255, 0), TEMPORARY_COLOUR_PRIORITY) move_to_delay = move_to_delay / 2 set_light_range(10) @@ -221,7 +221,7 @@ for(var/mob/living/L in T.contents - owner) if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon)) continue - L.adjustFireLoss(10) + L.adjust_fire_loss(10) to_chat(L, span_userdanger("You fall directly into the pool of lava!")) // deals damage to mechs @@ -296,11 +296,11 @@ if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon)) continue if(islist(flame_hit) && !flame_hit[L]) - L.adjustFireLoss(40) + L.adjust_fire_loss(40) to_chat(L, span_userdanger("You're hit by the drake's fire breath!")) flame_hit[L] = TRUE else - L.adjustFireLoss(10) //if we've already hit them, do way less damage + L.adjust_fire_loss(10) //if we've already hit them, do way less damage /mob/living/simple_animal/hostile/megafauna/dragon/lesser name = "lesser ash drake" 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 5314d79a6a03..87d31f57c5c1 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -102,7 +102,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/hierophant/Initialize(mapload) . = ..() spawned_beacon_ref = WEAKREF(new /obj/effect/hierophant(loc)) - AddComponent(/datum/component/boss_music, 'sound/music/boss/hiero_boss.ogg', 145 SECONDS) + AddComponent(/datum/component/boss_music, 'sound/music/boss/hiero_boss.ogg') /mob/living/simple_animal/hostile/megafauna/hierophant/Destroy() QDEL_NULL(spawned_beacon_ref) @@ -730,7 +730,7 @@ Difficulty: Hard else H.Goto(get_turf(caster), H.move_to_delay, 3) if(monster_damage_boost && (ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid))) - L.adjustBruteLoss(damage) + L.adjust_brute_loss(damage) if(caster) log_combat(caster, L, "struck with a [name]") for(var/obj/vehicle/sealed/mecha/M in T.contents - hit_things) //also damage mechs. 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 f0f11b583c8a..f6db48717b99 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm @@ -38,7 +38,7 @@ Difficulty: Hard crusher_loot = /obj/item/crusher_trophy/wendigo_horn wander = FALSE del_on_death = FALSE - blood_volume = BLOOD_VOLUME_NORMAL + default_blood_volume = BLOOD_VOLUME_NORMAL achievement_type = /datum/award/achievement/boss/wendigo_kill crusher_achievement_type = /datum/award/achievement/boss/wendigo_crusher score_achievement_type = /datum/award/score/wendigo_score 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 e105ab56cd1e..e796781cf4c9 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 @@ -2,6 +2,9 @@ #define TUMOR_ACTIVE 1 #define TUMOR_PASSIVE 2 +// Makes the elite mob weaker on victory so they don't just go and trash the station with a dangerous, big health pool +#define ELITE_POST_BATTLE_HEALTH_MULTIPLIER 0.4 + //Elite mining mobs /mob/living/simple_animal/hostile/asteroid/elite name = "elite" @@ -30,6 +33,7 @@ . = ..() AddComponent(/datum/component/seethrough_mob) grant_actions_by_list(attack_action_types) + ADD_TRAIT(src, TRAIT_UNCONVERTABLE, INNATE_TRAIT) //You cannot convert them while they're battling. //Prevents elites from attacking members of their faction (can't hurt themselves either) and lets them mine rock with an attack despite not being able to smash walls. /mob/living/simple_animal/hostile/asteroid/elite/AttackingTarget(atom/attacked_target) @@ -226,7 +230,7 @@ While using this makes the system rely on OnFire, it still gives options for tim playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) mychild.revive(HEAL_ALL) if(boosted) - mychild.maxHealth = mychild.maxHealth * 2 + mychild.maxHealth *= 1 / ELITE_POST_BATTLE_HEALTH_MULTIPLIER //we multiply it back to its original value mychild.health = mychild.maxHealth notify_ghosts( "\A [mychild] has been challenged in \the [get_area(src)]!", @@ -235,6 +239,7 @@ While using this makes the system rely on OnFire, it still gives options for tim notify_flags = NOTIFY_CATEGORY_NOFLASH, ) mychild.log_message("has been challenged by [key_name(activator)]!", LOG_GAME, color="#960000") + ADD_TRAIT(mychild, TRAIT_UNCONVERTABLE, INNATE_TRAIT) /obj/structure/elite_tumor/Initialize(mapload) . = ..() @@ -344,7 +349,7 @@ While using this makes the system rely on OnFire, it still gives options for tim mychild.revive(HEAL_ALL) if(boosted) times_won++ - mychild.maxHealth = mychild.maxHealth * 0.4 + mychild.maxHealth *= ELITE_POST_BATTLE_HEALTH_MULTIPLIER mychild.health = mychild.maxHealth if(times_won == 1) mychild.playsound_local(get_turf(mychild), 'sound/effects/magic.ogg', 40, 0) @@ -356,6 +361,8 @@ While using this makes the system rely on OnFire, it still gives options for tim Also, be weary of your fellow inhabitants, they likely won't be happy to see you!") to_chat(mychild, span_boldbig("Note that you are a lavaland monster, and thus not allied to the station. You should not cooperate or act friendly with any station crew unless under extreme circumstances!")) + REMOVE_TRAIT(mychild, TRAIT_UNCONVERTABLE, INNATE_TRAIT) + /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." @@ -373,20 +380,21 @@ While using this makes the system rely on OnFire, it still gives options for tim if(!istype(interacting_with, /mob/living/simple_animal/hostile/asteroid/elite)) return NONE - var/mob/living/simple_animal/hostile/asteroid/elite/E = interacting_with - if(E.stat != DEAD || E.sentience_type != SENTIENCE_BOSS || !E.key) - user.visible_message(span_notice("It appears [E] is unable to be revived right now. Perhaps try again later.")) + var/mob/living/simple_animal/hostile/asteroid/elite/elite = interacting_with + if(elite.stat != DEAD || elite.sentience_type != SENTIENCE_BOSS || !elite.key) + user.visible_message(span_notice("It appears [elite] is unable to be revived right now. Perhaps try again later.")) return ITEM_INTERACT_BLOCKING - E.faction = list("[REF(user)]") - E.revive(HEAL_ALL) - user.visible_message(span_notice("[user] stabs [E] with [src], reviving it.")) - E.playsound_local(get_turf(E), 'sound/effects/magic.ogg', 40, 0) - to_chat(E, span_userdanger("You have been revived by [user]. While you can't speak to them, you owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk.")) - to_chat(E, span_boldbig("Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!")) - E.maxHealth = E.maxHealth * 0.4 - E.health = E.maxHealth - E.desc = "[E.desc] However, this one appears to be less wild in nature, and calmer around people." - E.sentience_type = SENTIENCE_ORGANIC + elite.faction = list("[REF(user)]") + elite.revive(HEAL_ALL) + user.visible_message(span_notice("[user] stabs [elite] with [src], reviving it.")) + elite.playsound_local(get_turf(elite), 'sound/effects/magic.ogg', 40, 0) + to_chat(elite, span_userdanger("You have been revived by [user]. While you can't speak to them, you owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk.")) + to_chat(elite, span_boldbig("Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!")) + elite.maxHealth *= ELITE_POST_BATTLE_HEALTH_MULTIPLIER + elite.health = elite.maxHealth + elite.desc = "[elite.desc] However, this one appears to be less wild in nature, and calmer around people." + elite.sentience_type = SENTIENCE_ORGANIC + REMOVE_TRAIT(elite, TRAIT_UNCONVERTABLE, INNATE_TRAIT) qdel(src) return ITEM_INTERACT_SUCCESS @@ -423,6 +431,8 @@ While using this makes the system rely on OnFire, it still gives options for tim if(mover == ourelite_ref.resolve() || mover == activator_ref.resolve()) return FALSE +#undef ELITE_POST_BATTLE_HEALTH_MULTIPLIER + #undef TUMOR_ACTIVE #undef TUMOR_INACTIVE #undef TUMOR_PASSIVE 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 92da280342b8..4f92eeabdb48 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 @@ -156,13 +156,13 @@ to_chat(trample_target, span_userdanger("[src] tramples you and kicks you away!")) trample_target.safe_throw_at(throwtarget, 10, 1, src) trample_target.Paralyze(20) - trample_target.adjustBruteLoss(melee_damage_upper) + trample_target.adjust_brute_loss(melee_damage_upper) addtimer(CALLBACK(src, PROC_REF(legionnaire_charge_2), move_dir, (times_ran + 1)), 0.7) /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/head_detach(target) ranged_cooldown = world.time + 1 SECONDS if(myhead != null) - myhead.adjustBruteLoss(600) + myhead.adjust_brute_loss(600) return if(has_head) has_head = FALSE 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 01ec3612afd7..b71090c03daf 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 @@ -36,7 +36,7 @@ speed = 3 move_to_delay = 10 mouse_opacity = MOUSE_OPACITY_ICON - mob_biotypes = MOB_ROBOTIC|MOB_MINING + mob_biotypes = MOB_ROBOTIC|MOB_MINING|MOB_MINERAL death_sound = 'sound/effects/magic/repulse.ogg' death_message = "'s lights flicker, before its top part falls down." loot_drop = /obj/item/clothing/accessory/pandora_hope diff --git a/code/modules/mob/living/simple_animal/hostile/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm index 511300d56ac9..542b67ffd2e2 100644 --- a/code/modules/mob/living/simple_animal/hostile/ooze.dm +++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm @@ -76,7 +76,7 @@ adjust_ooze_nutrition(nutrition_change) if(ooze_nutrition <= 0) - adjustBruteLoss(0.25 * seconds_per_tick) + adjust_brute_loss(0.25 * seconds_per_tick) /// Returns an applicable list of actions to grant to the mob. Will return a list or null. /mob/living/simple_animal/hostile/ooze/proc/get_innate_actions() @@ -268,7 +268,7 @@ ///Gain health for the consumption and dump some brute loss on the target. /datum/action/consume/process() var/mob/living/simple_animal/hostile/ooze/gelatinous/ooze = owner - vored_mob.adjustBruteLoss(5) + vored_mob.adjust_brute_loss(5) ooze.heal_ordered_damage((ooze.maxHealth * 0.03), list(BRUTE, BURN, OXY)) ///Heal 6% of these specific damage types each process if(istype(ooze)) ooze.adjust_ooze_nutrition(3) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 95269608d9fc..346d99489269 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -215,7 +215,7 @@ /mob/living/simple_animal/Life(seconds_per_tick = SSMOBS_DT, times_fired) . = ..() if(staminaloss > 0) - adjustStaminaLoss(-stamina_recovery * seconds_per_tick, FALSE, TRUE) + adjust_stamina_loss(-stamina_recovery * seconds_per_tick, FALSE, TRUE) /mob/living/simple_animal/Destroy() QDEL_NULL(access_card) diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 12a7f1f84fe6..ddab116113e9 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -36,7 +36,7 @@ /mob/living/proc/AmountStun() //How many deciseconds remain in our stun var/datum/status_effect/incapacitating/stun/S = IsStun() if(S) - return S.duration - world.time + return S.duration return 0 /mob/living/proc/Stun(amount, ignore_canstun = FALSE) //Can't go below remaining duration @@ -46,7 +46,7 @@ return var/datum/status_effect/incapacitating/stun/S = IsStun() if(S) - S.duration = max(world.time + amount, S.duration) + S.duration = max(amount, S.duration) else if(amount > 0) S = apply_status_effect(/datum/status_effect/incapacitating/stun, amount) return S @@ -62,7 +62,7 @@ qdel(S) else if(S) - S.duration = world.time + amount + S.duration = amount else S = apply_status_effect(/datum/status_effect/incapacitating/stun, amount) return S @@ -86,7 +86,7 @@ /mob/living/proc/AmountKnockdown() //How many deciseconds remain in our knockdown var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() if(K) - return K.duration - world.time + return K.duration return 0 /mob/living/proc/Knockdown(amount, daze_amount = 0, ignore_canstun = FALSE) //Can't go below remaining duration @@ -96,7 +96,7 @@ return var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() if(K) - K.duration = max(world.time + amount, K.duration) + K.duration = max(amount, K.duration) else if(amount > 0) K = apply_status_effect(/datum/status_effect/incapacitating/knockdown, amount) if(daze_amount > 0) @@ -114,7 +114,7 @@ qdel(K) else if(K) - K.duration = world.time + amount + K.duration = amount else K = apply_status_effect(/datum/status_effect/incapacitating/knockdown, amount) return K @@ -140,7 +140,7 @@ /mob/living/proc/AmountImmobilized() //How many deciseconds remain in our Immobilized status effect var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() if(I) - return I.duration - world.time + return I.duration return 0 /mob/living/proc/Immobilize(amount, ignore_canstun = FALSE) //Can't go below remaining duration @@ -150,7 +150,7 @@ return var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() if(I) - I.duration = max(world.time + amount, I.duration) + I.duration = max(amount, I.duration) else if(amount > 0) I = apply_status_effect(/datum/status_effect/incapacitating/immobilized, amount) return I @@ -166,7 +166,7 @@ qdel(I) else if(I) - I.duration = world.time + amount + I.duration = amount else I = apply_status_effect(/datum/status_effect/incapacitating/immobilized, amount) return I @@ -190,7 +190,7 @@ /mob/living/proc/AmountParalyzed() //How many deciseconds remain in our Paralyzed status effect var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE) if(P) - return P.duration - world.time + return P.duration return 0 /mob/living/proc/Paralyze(amount, ignore_canstun = FALSE) //Can't go below remaining duration @@ -200,7 +200,7 @@ return var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE) if(P) - P.duration = max(world.time + amount, P.duration) + P.duration = max(amount, P.duration) else if(amount > 0) P = apply_status_effect(/datum/status_effect/incapacitating/paralyzed, amount) return P @@ -216,7 +216,7 @@ qdel(P) else if(P) - P.duration = world.time + amount + P.duration = amount else P = apply_status_effect(/datum/status_effect/incapacitating/paralyzed, amount) return P @@ -240,7 +240,7 @@ /mob/living/proc/amount_incapacitated() var/datum/status_effect/incapacitating/incapacitated/incapacitated_status_effect = has_status_effect(/datum/status_effect/incapacitating/incapacitated) if (incapacitated_status_effect) - return incapacitated_status_effect.duration - world.time + return incapacitated_status_effect.duration else return 0 @@ -256,7 +256,7 @@ return var/datum/status_effect/incapacitating/incapacitated/incapacitated_status_effect = has_status_effect(/datum/status_effect/incapacitating/incapacitated) if(incapacitated_status_effect) - incapacitated_status_effect.duration = max(world.time + amount, incapacitated_status_effect.duration) + incapacitated_status_effect.duration = max(amount, incapacitated_status_effect.duration) else if(amount > 0) incapacitated_status_effect = apply_status_effect(/datum/status_effect/incapacitating/incapacitated, amount) return incapacitated_status_effect @@ -278,7 +278,7 @@ qdel(incapacitated_status_effect) else if(incapacitated_status_effect) - incapacitated_status_effect.duration = world.time + amount + incapacitated_status_effect.duration = amount else incapacitated_status_effect = apply_status_effect(/datum/status_effect/incapacitating/incapacitated, amount) return incapacitated_status_effect @@ -333,7 +333,7 @@ /mob/living/proc/AmountUnconscious() //How many deciseconds remain in our unconsciousness var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious() if(U) - return U.duration - world.time + return U.duration return 0 /mob/living/proc/Unconscious(amount, ignore_canstun = FALSE) //Can't go below remaining duration @@ -343,7 +343,7 @@ return var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious() if(U) - U.duration = max(world.time + amount, U.duration) + U.duration = max(amount, U.duration) else if(amount > 0) U = apply_status_effect(/datum/status_effect/incapacitating/unconscious, amount) return U @@ -358,7 +358,7 @@ if(U) qdel(U) else if(U) - U.duration = world.time + amount + U.duration = amount else U = apply_status_effect(/datum/status_effect/incapacitating/unconscious, amount) return U @@ -383,7 +383,7 @@ /mob/living/proc/AmountSleeping() //How many deciseconds remain in our sleep var/datum/status_effect/incapacitating/sleeping/S = IsSleeping() if(S) - return S.duration - world.time + return S.duration return 0 /mob/living/proc/Sleeping(amount) //Can't go below remaining duration @@ -393,7 +393,7 @@ return var/datum/status_effect/incapacitating/sleeping/S = IsSleeping() if(S) - S.duration = max(world.time + amount, S.duration) + S.duration = max(amount, S.duration) else if(amount > 0) S = apply_status_effect(/datum/status_effect/incapacitating/sleeping, amount) return S @@ -408,7 +408,7 @@ if(S) qdel(S) else if(S) - S.duration = world.time + amount + S.duration = amount else S = apply_status_effect(/datum/status_effect/incapacitating/sleeping, amount) return S @@ -489,6 +489,26 @@ return quirk return null +/// Helper to easily add a personality by a typepath +/mob/living/proc/add_personality(personality_type) + var/datum/personality/personality = SSpersonalities.personalities_by_type[personality_type] + personality.apply_to_mob(src) + +/// Helper to easily add multiple personalities by a list of typepaths +/mob/living/proc/add_personalities(list/new_personalities) + for(var/personality_type in new_personalities) + add_personality(personality_type) + +/// Helper to easily remove a personality by a typepath +/mob/living/proc/remove_personality(personality_type) + var/datum/personality/personality = SSpersonalities.personalities_by_type[personality_type] + personality.remove_from_mob(src) + +/// Helper to clear all personalities from a mob +/mob/living/proc/clear_personalities() + for(var/personality_type in personalities) + remove_personality(personality_type) + /mob/living/proc/cure_husk(source) REMOVE_TRAIT(src, TRAIT_HUSK, source) if(HAS_TRAIT(src, TRAIT_HUSK)) @@ -523,9 +543,11 @@ /mob/living/proc/fakedeath(source, silent = FALSE) if(stat != DEAD) if(!silent) - emote("deathgasp") + INVOKE_ASYNC(src, TYPE_PROC_REF(/mob, emote), "deathgasp") station_timestamp_timeofdeath = station_time_timestamp() + if(!HAS_TRAIT(src, TRAIT_FAKEDEATH) && !silent) + send_death_moodlets() add_traits(list(TRAIT_FAKEDEATH, TRAIT_DEATHCOMA), source) ///Unignores all slowdowns that lack the IGNORE_NOSLOW flag. @@ -600,13 +622,12 @@ if(isnum(max_duration) && duration > 0) // Check the duration remaining on the existing status effect // If it's greater than / equal to our passed max duration, we don't need to do anything - var/remaining_duration = existing.duration - world.time - if(remaining_duration >= max_duration) + if(existing.duration >= max_duration) return // Otherwise, add duration up to the max (max_duration - remaining_duration), // or just add duration if it doesn't exceed our max at all - existing.duration += min(max_duration - remaining_duration, duration) + existing.duration += min(max_duration - existing.duration, duration) else existing.duration += duration @@ -614,7 +635,7 @@ // If the duration was decreased and is now less 0 seconds, // qdel it / clean up the status effect immediately // (rather than waiting for the process tick to handle it) - if(existing.duration <= world.time) + if(existing.duration <= 0) qdel(existing) else if(duration > 0) @@ -647,12 +668,11 @@ if(only_if_higher) // If the existing status effect has a higher remaining duration // than what we aim to set it to, don't downgrade it - do nothing (return) - var/remaining_duration = existing.duration - world.time - if(remaining_duration >= duration) + if(existing.duration >= duration) return // Set the duration accordingly - existing.duration = world.time + duration + existing.duration = duration else if(duration > 0) apply_status_effect(effect, duration) @@ -675,7 +695,7 @@ if(existing.duration == STATUS_EFFECT_PERMANENT) return INFINITY - return existing.duration - world.time + return existing.duration /** * Adjust the "drunk value" the mob is currently experiencing, diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index af05778db43b..e53885fe3bda 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -46,7 +46,7 @@ to_chat(src, span_warning("You can't vent crawl while buckled!")) return if(iscarbon(src) && required_nudity) - if(length(get_equipped_items(INCLUDE_POCKETS)) || get_num_held_items()) + if(length(get_equipped_items(INCLUDE_POCKETS|INCLUDE_HELD))) if(provide_feedback) to_chat(src, span_warning("You can't crawl around in the ventilation ducts with items!")) return diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4f5432ee1f04..ffa4f5aee50e 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -286,44 +286,42 @@ if(!islist(ignored_mobs)) ignored_mobs = list(ignored_mobs) - var/list/hearers = get_hearers_in_view(vision_distance, src) //caches the hearers and then removes ignored mobs. + var/list/hearers = mob_only_listeners(get_hearers_in_view(vision_distance, src)) //caches the hearers and then removes ignored mobs. hearers -= ignored_mobs - if(self_message) - hearers -= src - var/raw_msg = message if(visible_message_flags & WITH_EMPHASIS_MESSAGE) message = apply_message_emphasis(message) if(visible_message_flags & EMOTE_MESSAGE) message = span_emote("[src] [message]") - for(var/mob/M in hearers) - if(!M.client) + for(var/mob/hearing_mob as anything in hearers) + if(!hearing_mob?.client) + continue + if(self_message && hearing_mob == src) continue //This entire if/else chain could be in two lines but isn't for readibilties sake. var/msg = message var/msg_type = MSG_VISUAL - if(M.see_invisible < invisibility)//if src is invisible to M + if(hearing_mob.see_invisible < invisibility)//if src is invisible to M msg = blind_message msg_type = MSG_AUDIBLE else if(T != loc && T != src) //if src is inside something and not a turf. - if(M != loc) // Only give the blind message to hearers that aren't the location + if(hearing_mob != loc) // Only give the blind message to hearers that aren't the location msg = blind_message msg_type = MSG_AUDIBLE - else if(!HAS_TRAIT(M, TRAIT_HEAR_THROUGH_DARKNESS) && M.lighting_cutoff < LIGHTING_CUTOFF_HIGH && T.is_softly_lit() && !in_range(T,M)) //if it is too dark, unless we're right next to them. + else if(!HAS_TRAIT(hearing_mob, TRAIT_HEAR_THROUGH_DARKNESS) && hearing_mob.lighting_cutoff < LIGHTING_CUTOFF_HIGH && T.is_softly_lit() && !in_range(T,hearing_mob)) //if it is too dark, unless we're right next to them. msg = blind_message msg_type = MSG_AUDIBLE if(!msg) continue - if(visible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(M, visible_message_flags) && !M.is_blind()) - M.create_chat_message(src, raw_message = raw_msg, runechat_flags = visible_message_flags) - - M.show_message(msg, msg_type, blind_message, MSG_AUDIBLE) + if(visible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(hearing_mob, visible_message_flags) && !hearing_mob.is_blind()) + hearing_mob.create_chat_message(src, raw_message = raw_msg, runechat_flags = visible_message_flags) + hearing_mob.show_message(msg, msg_type, blind_message, MSG_AUDIBLE) ///Adds the functionality to self_message. /mob/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE) @@ -360,18 +358,20 @@ * * audible_message_flags (optional) is the type of message being sent. */ /atom/proc/audible_message(message, deaf_message, hearing_distance = DEFAULT_MESSAGE_RANGE, self_message, audible_message_flags = NONE) - var/list/hearers = get_hearers_in_view(hearing_distance, src) - if(self_message) - hearers -= src + var/list/hearers = mob_only_listeners(get_hearers_in_view(hearing_distance, src)) var/raw_msg = message if(audible_message_flags & WITH_EMPHASIS_MESSAGE) message = apply_message_emphasis(message) if(audible_message_flags & EMOTE_MESSAGE) message = span_emote("[src] [message]") - for(var/mob/M in hearers) - if(audible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(M, audible_message_flags) && M.can_hear()) - M.create_chat_message(src, raw_message = raw_msg, runechat_flags = audible_message_flags) - M.show_message(message, MSG_AUDIBLE, deaf_message, MSG_VISUAL) + for(var/mob/hearing_mob as anything in hearers) + if(!hearing_mob?.client) + continue + if(self_message && hearing_mob == src) + continue + if(audible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(hearing_mob, audible_message_flags) && hearing_mob.can_hear()) + hearing_mob.create_chat_message(src, raw_message = raw_msg, runechat_flags = audible_message_flags) + hearing_mob.show_message(message, MSG_AUDIBLE, deaf_message, MSG_VISUAL) /** * Show a message to all mobs in earshot of this one @@ -405,6 +405,21 @@ if(self_runechat && (audible_message_flags & EMOTE_MESSAGE) && runechat_prefs_check(src, audible_message_flags)) create_chat_message(src, raw_message = raw_self_message, runechat_flags = audible_message_flags) +/// Gets a linked mob, letting atoms act as proxies for actions that rely on hearing sensitivity. +/// For example, AIs hearing around their holopads, and dullahans hearing around their heads. +/// Normal say messages are handled by Hear(), this is for other visible/audible messages +/atom/movable/proc/get_listening_mob() + return + +/obj/effect/overlay/holo_pad_hologram/get_listening_mob() + return Impersonation + +/obj/item/dullahan_relay/get_listening_mob() + return owner + +/mob/get_listening_mob() + return src + ///Returns the client runechat visible messages preference according to the message type. /atom/proc/runechat_prefs_check(mob/target, visible_message_flags = NONE) if(!target.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat)) @@ -424,7 +439,7 @@ ///Get the item on the mob in the storage slot identified by the id passed in -/mob/proc/get_item_by_slot(slot_id) +/mob/proc/get_item_by_slot(slot_id) as /obj/item return null /// Gets what slot the item on the mob is held in. @@ -531,6 +546,8 @@ DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(run_examinate), examinify)) /mob/proc/run_examinate(atom/examinify, force_examinate_more = FALSE) + if(QDELETED(examinify)) // since this can run async we might have had the atom get qdeleted already + return if(isturf(examinify) && !(sight & SEE_TURFS) && !(examinify in view(client ? client.view : world.view, src))) // shift-click catcher may issue examinate() calls for out-of-sight turfs @@ -854,6 +871,15 @@ set category = "OOC" reset_perspective(null) +/** + * Helpful for when a players uplink window gets glitched to above their screen. + * preventing them from moving the UPLINK window. + */ +/mob/verb/reset_ui_positions_for_mob() + set name = "Reset UI Positions" + set category = "OOC" + SStgui.reset_ui_position(src) + //suppress the .click/dblclick macros so people can't use them to identify the location of items or aimbot /mob/verb/DisClick(argu = null as anything, sec = "" as text, number1 = 0 as num , number2 = 0 as num) set name = ".click" @@ -1301,8 +1327,7 @@ if(!writing_instrument) return FALSE - var/pen_info = writing_instrument.get_writing_implement_details() - if(!pen_info || (pen_info["interaction_mode"] != MODE_WRITING)) + if(!IS_WRITING_UTENSIL(writing_instrument)) if(!silent_if_not_writing_tool) to_chat(src, span_warning("You can't write with \the [writing_instrument]!")) return FALSE @@ -1383,6 +1408,7 @@ VV_DROPDOWN_OPTION(VV_HK_GIVE_DIRECT_CONTROL, "Give Direct Control") VV_DROPDOWN_OPTION(VV_HK_OFFER_GHOSTS, "Offer Control to Ghosts") VV_DROPDOWN_OPTION(VV_HK_VIEW_PLANES, "View/Edit Planes") + VV_DROPDOWN_OPTION(VV_HK_GIVE_ACCESS, "Give Access") /mob/vv_do_topic(list/href_list) . = ..() @@ -1456,6 +1482,12 @@ if(!check_rights(R_DEBUG)) return usr.client.edit_plane_masters(src) + + if(href_list[VV_HK_GIVE_ACCESS]) + if(!check_rights(NONE)) + return + AddComponent(/datum/component/simple_access, SSid_access.get_region_access_list(list(REGION_ALL_GLOBAL))) + to_chat(usr, span_notice("Access granted.")) /** * extra var handling for the logging var */ @@ -1487,8 +1519,7 @@ . = ..() // Queue update if change is small enough (6 is 1% of nutrition softcap) if(abs(change) >= 6) - mob_mood?.update_nutrition_moodlets() - hud_used?.hunger?.update_hunger_bar() + update_nutrition() else living_flags |= QUEUE_NUTRITION_UPDATE @@ -1504,11 +1535,16 @@ . = ..() // Queue update if change is small enough (6 is 1% of nutrition softcap) if(abs(old_nutrition - nutrition) >= 6) - mob_mood?.update_nutrition_moodlets() - hud_used?.hunger?.update_hunger_bar() + update_nutrition() else living_flags |= QUEUE_NUTRITION_UPDATE +/// Updates nutrition related effects +/mob/living/proc/update_nutrition() + mob_mood?.update_nutrition_moodlets() + hud_used?.hunger?.update_hunger_bar() + SEND_SIGNAL(src, COMSIG_LIVING_UPDATE_NUTRITION) + /// Apply a proper movespeed modifier based on items we have equipped /mob/proc/update_equipment_speed_mods() var/speedies = 0 @@ -1539,13 +1575,6 @@ else remove_movespeed_modifier(/datum/movespeed_modifier/equipment_speedmod) -///Get all items in our possession that should affect our movespeed -/mob/proc/get_equipped_speed_mod_items() - . = list() - for(var/obj/item/thing in held_items) - if(thing.item_flags & SLOWS_WHILE_IN_HAND) - . += thing - /mob/proc/set_stat(new_stat) if(new_stat == stat) return @@ -1665,13 +1694,44 @@ for(var/hud_trait in GLOB.trait_to_hud) RegisterSignal(src, SIGNAL_ADDTRAIT(hud_trait), PROC_REF(hud_trait_enabled)) RegisterSignal(src, SIGNAL_REMOVETRAIT(hud_trait), PROC_REF(hud_trait_disabled)) + for(var/hud_trait in GLOB.trait_blockers_to_hud) + RegisterSignal(src, SIGNAL_ADDTRAIT(hud_trait), PROC_REF(hud_trait_blocker_gained)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(hud_trait), PROC_REF(hud_trait_blocker_lost)) /mob/proc/hud_trait_enabled(datum/source, new_trait) SIGNAL_HANDLER + + for(var/blocker, blocked_traits in GLOB.trait_blockers_to_hud) + if(HAS_TRAIT(src, blocker) && (new_trait in blocked_traits)) + return + var/datum/atom_hud/datahud = GLOB.huds[GLOB.trait_to_hud[new_trait]] datahud.show_to(src) -/mob/proc/hud_trait_disabled(datum/source, new_trait) +/mob/proc/hud_trait_disabled(datum/source, lost_trait) SIGNAL_HANDLER - var/datum/atom_hud/datahud = GLOB.huds[GLOB.trait_to_hud[new_trait]] + + for(var/blocker, blocked_traits in GLOB.trait_blockers_to_hud) + if(HAS_TRAIT(src, blocker) && (lost_trait in blocked_traits)) + return // it may seem counterintuitive to check for blockers on trait removal, the blocker now has total reign over whether the hud should come back + + var/datum/atom_hud/datahud = GLOB.huds[GLOB.trait_to_hud[lost_trait]] datahud.hide_from(src) + +/mob/proc/hud_trait_blocker_gained(datum/source, new_trait) + SIGNAL_HANDLER + + for(var/trait in GLOB.trait_blockers_to_hud[new_trait]) + if(!HAS_TRAIT(src, trait)) + continue + var/datum/atom_hud/datahud = GLOB.huds[GLOB.trait_to_hud[trait]] + datahud.hide_from(src) + +/mob/proc/hud_trait_blocker_lost(datum/source, new_trait) + SIGNAL_HANDLER + + for(var/trait in GLOB.trait_blockers_to_hud[new_trait]) + if(!HAS_TRAIT(src, trait)) + continue + var/datum/atom_hud/datahud = GLOB.huds[GLOB.trait_to_hud[trait]] + datahud.show_to(src) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index b637e33eb6f5..d340bc5268cf 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -174,9 +174,10 @@ if(C.prefs?.read_preference(/datum/preference/toggle/screen_shake_darken)) var/type = /atom/movable/screen/fullscreen/flash/black + var/shake_dur = max(duration, 2 SECONDS) M.overlay_fullscreen("flash", type) - addtimer(CALLBACK(M, TYPE_PROC_REF(/mob, clear_fullscreen), "flash", 3 SECONDS), 3 SECONDS) + addtimer(CALLBACK(M, TYPE_PROC_REF(/mob, clear_fullscreen), "flash", 1 SECONDS), shake_dur) //How much time to allot for each pixel moved var/time_scalar = (1 / ICON_SIZE_ALL) * TILES_PER_SECOND @@ -206,6 +207,31 @@ #undef TILES_PER_SECOND +/// Helper proc for a similar function to shake_camera, expect this one kicks the camera back at an opposite angle rather then skake_camera's irratic jittering. +/proc/recoil_camera(mob/recoiled_mob, duration, backtime_duration, strength, angle) + if(!recoiled_mob || !recoiled_mob.client || duration < 1) + return + var/client/my_client = recoiled_mob.client + strength *= world.icon_size + var/client/client_to_shake = recoiled_mob.client + var/oldx = client_to_shake.pixel_x + var/oldy = client_to_shake.pixel_y + + //get pixels to move the camera in an angle + var/mpx = sin(angle) * strength + var/mpy = cos(angle) * strength + + + if(my_client.prefs?.read_preference(/datum/preference/toggle/screen_shake_darken)) + var/type = /atom/movable/screen/fullscreen/flash/black + var/shake_dur = max(duration, 2 SECONDS) + recoiled_mob.overlay_fullscreen("flash", type) + addtimer(CALLBACK(recoiled_mob, TYPE_PROC_REF(/mob, clear_fullscreen), "flash", 1 SECONDS), shake_dur) + + + animate(client_to_shake, pixel_x = oldx+mpx, pixel_y = oldy+mpy, time = duration, flags = ANIMATION_RELATIVE) + animate(pixel_x = oldx, pixel_y = oldy, time = backtime_duration, easing = BACK_EASING) + ///Find if the message has the real name of any user mob in the mob_list /proc/findname(msg) if(!istext(msg)) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 16a77411e4c0..48e2fe78cc93 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -251,6 +251,19 @@ L.forceMove(stepTurf) L.setDir(direct) + // DARKPACK EDIT START + if(INCORPOREAL_MOVE_AVATAR) + var/turf/open/floor/stepTurf = get_step(L, direct) + if(stepTurf) + if(stepTurf.turf_flags & NOJAUNT) + to_chat(L, span_warning("Some strange aura is blocking the way.")) + return + if(locate(/obj/effect/blessing) in stepTurf) + to_chat(L, span_warning("Holy energies block your path!")) + return + L.forceMove(stepTurf) + L.setDir(direct) + // DARKPACK EDIT END return TRUE /** @@ -382,10 +395,14 @@ * force_drop = the slip forces them to drop held items */ /mob/proc/slip(knockdown_amount, obj/slipped_on, lube_flags, paralyze, daze, force_drop = FALSE) - add_mob_memory(/datum/memory/was_slipped, antagonist = slipped_on) - SEND_SIGNAL(src, COMSIG_MOB_SLIPPED, knockdown_amount, slipped_on, lube_flags, paralyze, daze, force_drop) +/mob/living/slip(knockdown_amount, obj/slipped_on, lube_flags, paralyze, daze, force_drop = FALSE) + add_mob_memory(/datum/memory/was_slipped, antagonist = slipped_on) + add_mood_event("slipped", /datum/mood_event/slipped) + add_personality_mood_to_viewers(src, "slip_observed", list(/datum/personality/whimsical = /datum/mood_event/whimsical_slip), range = 5) + return ..() + //bodypart selection verbs - Cyberboss //8: repeated presses toggles through head - eyes - mouth //7: mouth 8: head 9: eyes diff --git a/code/modules/mob/mob_say.dm b/code/modules/mob/mob_say.dm index 5442dddc72b6..a33fff987b70 100644 --- a/code/modules/mob/mob_say.dm +++ b/code/modules/mob/mob_say.dm @@ -50,7 +50,7 @@ message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) - QUEUE_OR_CALL_VERB_FOR(VERB_CALLBACK(src, TYPE_PROC_REF(/mob, emote), "me", EMOTE_VISIBLE|EMOTE_AUDIBLE, message, TRUE), SSspeech_controller) + QUEUE_OR_CALL_VERB_FOR(VERB_CALLBACK(src, TYPE_PROC_REF(/mob, emote), "me", NONE, message, TRUE), SSspeech_controller) /mob/try_speak(message, ignore_spam = FALSE, forced = null, filterproof = FALSE) var/list/filter_result diff --git a/code/modules/mob_spawn/corpses/job_corpses.dm b/code/modules/mob_spawn/corpses/job_corpses.dm index 00a5de4f3d65..572bb9f6f8e0 100644 --- a/code/modules/mob_spawn/corpses/job_corpses.dm +++ b/code/modules/mob_spawn/corpses/job_corpses.dm @@ -59,15 +59,15 @@ outfit = /datum/outfit/job/assistant icon_state = "corpsegreytider" -/obj/effect/mob_spawn/corpse/human/assistant/beesease_infection/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/corpse/human/assistant/beesease_infection/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs) . = ..() spawned_mob.ForceContractDisease(new /datum/disease/beesease) -/obj/effect/mob_spawn/corpse/human/assistant/brainrot_infection/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/corpse/human/assistant/brainrot_infection/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs) . = ..() spawned_mob.ForceContractDisease(new /datum/disease/brainrot) -/obj/effect/mob_spawn/corpse/human/assistant/spanishflu_infection/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/corpse/human/assistant/spanishflu_infection/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs) . = ..() spawned_mob.ForceContractDisease(new /datum/disease/fluspanish) @@ -88,3 +88,21 @@ name = JOB_BITRUNNER outfit = /datum/outfit/job/bitrunner icon_state = "corpsecargotech" + +/obj/effect/mob_spawn/corpse/human/cmo + name = JOB_CHIEF_MEDICAL_OFFICER + outfit = /datum/outfit/job/cmo + icon_state = "corpsedoctor" + +/obj/effect/mob_spawn/corpse/human/ce + name = JOB_CHIEF_ENGINEER + outfit = /datum/outfit/job/ce + icon_state = "corpseengineer" + +/obj/effect/mob_spawn/corpse/human/secoff + name = JOB_SECURITY_OFFICER + outfit = /datum/outfit/job/security + +/obj/effect/mob_spawn/corpse/human/hos + name = JOB_HEAD_OF_SECURITY + outfit = /datum/outfit/job/hos diff --git a/code/modules/mob_spawn/corpses/mining_corpses.dm b/code/modules/mob_spawn/corpses/mining_corpses.dm index 9edfbeddf8b6..bece8ddb28bb 100644 --- a/code/modules/mob_spawn/corpses/mining_corpses.dm +++ b/code/modules/mob_spawn/corpses/mining_corpses.dm @@ -8,7 +8,7 @@ burn_damage = 1000 mob_species = /datum/species/skeleton -/obj/effect/mob_spawn/corpse/human/charredskeleton/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/corpse/human/charredskeleton/special(mob/living/carbon/human/spawned_human, mob/mob_possessor, apply_prefs) . = ..() spawned_human.color = "#454545" spawned_human.gender = NEUTER @@ -34,7 +34,7 @@ outfit = select_outfit() return ..() -/obj/effect/mob_spawn/corpse/human/legioninfested/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/corpse/human/legioninfested/special(mob/living/carbon/human/spawned_human, mob/mob_possessor, apply_prefs) . = ..() var/obj/item/organ/legion_tumour/cancer = new() cancer.Insert(spawned_human, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -75,7 +75,7 @@ /// 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) +/obj/effect/mob_spawn/corpse/human/legioninfested/dwarf/special(mob/living/carbon/human/spawned_human, mob/mob_possessor, apply_prefs) . = ..() spawned_human.dna.add_mutation(/datum/mutation/dwarfism, MUTATION_SOURCE_MUTATOR) @@ -123,7 +123,7 @@ /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) +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/special(mob/living/carbon/human/spawned_human, mob/mob_possessor, apply_prefs) . = ..() spawned_human.gender = NEUTER @@ -134,9 +134,10 @@ brute_damage = 0 burn_damage = 1000 -/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/charred/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/charred/special(mob/living/carbon/human/spawned_human, mob/mob_possessor, apply_prefs) . = ..() spawned_human.color = "#454545" + spawned_human.AddComponent(/datum/component/storm_hating) /datum/outfit/consumed_miner @@ -261,7 +262,7 @@ else backpack_contents += backpack_loot if(prob(30)) - backpack_contents += list(/obj/item/stack/sheet/mineral/bananium = pick_weight(list( 1 = 3, 2 = 2, 3 = 1))) + backpack_contents += list(/obj/item/stack/sheet/mineral/bananium = pick_weight(alist( 1 = 3, 2 = 2, 3 = 1))) if(prob(10)) l_pocket = pick_weight(list( /obj/item/bikehorn/golden = 3, @@ -349,7 +350,7 @@ dame.physique = FEMALE dame.update_body() if(prob(30)) - back = /obj/item/nullrod/vibro/talking + back = /obj/item/nullrod/claymore/talking else back = /obj/item/shield/buckler belt = /obj/item/nullrod/claymore @@ -387,8 +388,8 @@ /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 + suit = /obj/item/clothing/suit/chaplainsuit/armor/heretic + head = /obj/item/clothing/head/helmet/chaplain/heretic /datum/outfit/consumed_heremoth/pre_equip(mob/living/carbon/human/moth, visuals_only = FALSE) if(!visuals_only) diff --git a/code/modules/mob_spawn/corpses/nanotrasen_corpses.dm b/code/modules/mob_spawn/corpses/nanotrasen_corpses.dm index 0ed30e5a5215..92cc3a6b45f5 100644 --- a/code/modules/mob_spawn/corpses/nanotrasen_corpses.dm +++ b/code/modules/mob_spawn/corpses/nanotrasen_corpses.dm @@ -54,7 +54,7 @@ outfit = /datum/outfit/centcom/centcom_intern/unarmed mob_name = "Nameless Intern" -/obj/effect/mob_spawn/corpse/human/intern/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/corpse/human/intern/special(mob/living/carbon/human/spawned_human, mob/mob_possessor, apply_prefs) . = ..() spawned_human.gender = MALE //we're making it canon babies spawned_human.update_body() diff --git a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm index 571bac86e7ca..e5864db94e45 100644 --- a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm +++ b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm @@ -5,13 +5,13 @@ /obj/effect/mob_spawn/corpse/ai mob_type = /mob/living/silicon/ai/spawned -/obj/effect/mob_spawn/corpse/ai/create(mob/user, newname) +/obj/effect/mob_spawn/corpse/ai/create(mob/user, newname, apply_prefs) var/ai_already_present = locate(/mob/living/silicon/ai) in loc if(ai_already_present) - return - . = ..() + return CANCEL_SPAWN + return ..() -/obj/effect/mob_spawn/corpse/ai/special(mob/living/silicon/ai/spawned/dead_ai) +/obj/effect/mob_spawn/corpse/ai/special(mob/living/silicon/ai/spawned/dead_ai, mob/mob_possessor, apply_prefs) . = ..() dead_ai.name = src.name dead_ai.real_name = src.name @@ -24,7 +24,7 @@ ///the color of the slime you're spawning. var/slime_species = /datum/slime_type/grey -/obj/effect/mob_spawn/corpse/slime/special(mob/living/basic/slime/spawned_slime) +/obj/effect/mob_spawn/corpse/slime/special(mob/living/basic/slime/spawned_slime, mob/mob_possessor, apply_prefs) . = ..() spawned_slime.set_slime_type(slime_species) @@ -33,7 +33,7 @@ //mostly for unit tests to not get alarmed (which by all means it should because this is a mess) mob_type = /obj/item/clothing/mask/facehugger -/obj/effect/mob_spawn/corpse/facehugger/create(mob/user) +/obj/effect/mob_spawn/corpse/facehugger/create(mob/user, newname, apply_prefs) var/obj/item/clothing/mask/facehugger/spawned_facehugger = new mob_type(loc) spawned_facehugger.Die() qdel(src) diff --git a/code/modules/mob_spawn/ghost_roles/away_roles.dm b/code/modules/mob_spawn/ghost_roles/away_roles.dm index 4891cf1e0089..a445f4c48094 100644 --- a/code/modules/mob_spawn/ghost_roles/away_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/away_roles.dm @@ -14,7 +14,7 @@ flavour_text = "Walk this mortal plane and terrorize all living adventurers who dare cross your path." spawner_job_path = /datum/job/skeleton -/obj/effect/mob_spawn/ghost_role/human/skeleton/special(mob/living/new_spawn) +/obj/effect/mob_spawn/ghost_role/human/skeleton/special(mob/living/new_spawn, mob/mob_possessor, apply_prefs) . = ..() to_chat(new_spawn, "You have this horrible lurching feeling deep down that your binding to this world will fail if you abandon this zone... Were you reanimated to protect something?") new_spawn.AddComponent(/datum/component/stationstuck, PUNISHMENT_MURDER, "You experience a feeling like a stressed twine being pulled until it snaps. Then, merciful nothing.") @@ -30,7 +30,7 @@ you_are_text = "By unknown powers, your rotting remains have been resurrected!" flavour_text = "Walk this mortal plane and terrorize all living adventurers who dare cross your path." -/obj/effect/mob_spawn/ghost_role/human/zombie/special(mob/living/new_spawn) +/obj/effect/mob_spawn/ghost_role/human/zombie/special(mob/living/new_spawn, mob/mob_possessor, apply_prefs) . = ..() to_chat(new_spawn, "You have this horrible lurching feeling deep down that your binding to this world will fail if you abandon this zone... Were you reanimated to protect something?") new_spawn.AddComponent(/datum/component/stationstuck, PUNISHMENT_MURDER, "You experience a feeling like a stressed twine being pulled until it snaps. Then, merciful nothing.") diff --git a/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm b/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm index 0165b27f21a1..0753a8f9099e 100644 --- a/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm @@ -6,8 +6,9 @@ flavour_text = "Write me some god damn flavor text!" //the flavor text will be the backstory argument called on the antagonist's greet, see hunter.dm for details show_flavor = FALSE var/back_story = "error" + allow_custom_character = GHOSTROLE_TAKE_PREFS_APPEARANCE -/obj/effect/mob_spawn/ghost_role/human/fugitive/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/ghost_role/human/fugitive/special(mob/living/carbon/human/spawned_human, mob/mob_possessor, apply_prefs) . = ..() var/datum/antagonist/fugitive_hunter/fughunter = new fughunter.backstory = back_story diff --git a/code/modules/mob_spawn/ghost_roles/golem_roles.dm b/code/modules/mob_spawn/ghost_roles/golem_roles.dm index af7cde7320d0..f1a25d1e151d 100644 --- a/code/modules/mob_spawn/ghost_roles/golem_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/golem_roles.dm @@ -32,14 +32,7 @@ notify_flags = NOTIFY_CATEGORY_NOFLASH, ) -/obj/effect/mob_spawn/ghost_role/human/golem/name_mob(mob/living/spawned_mob, forced_name) - if(forced_name || !iscarbon(spawned_mob)) - return ..() - - forced_name = generate_random_name_species_based(spawned_mob.gender, TRUE, species_type = /datum/species/golem) - return ..() - -/obj/effect/mob_spawn/ghost_role/human/golem/special(mob/living/new_spawn, mob/mob_possessor) +/obj/effect/mob_spawn/ghost_role/human/golem/special(mob/living/new_spawn, mob/mob_possessor, apply_prefs) . = ..() if(is_path_in_list(initial_type, GLOB.golem_stack_food_directory)) var/datum/golem_food_buff/initial_buff = GLOB.golem_stack_food_directory[initial_type] @@ -73,7 +66,7 @@ desc = "A humanoid shape, empty, lifeless, and full of potential." prompt_name = "a free golem" -/obj/effect/mob_spawn/ghost_role/human/golem/adamantine/special(mob/living/new_spawn, mob/mob_possessor) +/obj/effect/mob_spawn/ghost_role/human/golem/adamantine/special(mob/living/new_spawn, mob/mob_possessor, apply_prefs) . = ..() if(!ishuman(new_spawn)) return @@ -110,8 +103,6 @@ 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)) - return ..() if(owner_ref?.resolve()) forced_name = "Golem ([rand(1,999)])" return ..() diff --git a/code/modules/mob_spawn/ghost_roles/mining_roles.dm b/code/modules/mob_spawn/ghost_roles/mining_roles.dm index f30661f57b39..1c11cfb0fcef 100644 --- a/code/modules/mob_spawn/ghost_roles/mining_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/mining_roles.dm @@ -14,6 +14,7 @@ the hostile creatures, and the ash drakes swooping down from the cloudless skies, all you can wish for is the feel of soft grass between your toes and \ the fresh air of Earth. These thoughts are dispelled by yet another recollection of how you got here... " spawner_job_path = /datum/job/hermit + allow_custom_character = ALL /obj/effect/mob_spawn/ghost_role/human/hermit/Initialize(mapload) . = ..() @@ -79,14 +80,16 @@ flavour_text = "Ch'yea. You came here, like, on spring break, hopin' to pick up some bangin' hot chicks, y'knaw?" spawner_job_path = /datum/job/beach_bum outfit = /datum/outfit/beachbum + allow_custom_character = GHOSTROLE_TAKE_PREFS_APPEARANCE /obj/effect/mob_spawn/ghost_role/human/beach/lifeguard you_are_text = "You're a spunky lifeguard!" flavour_text = "It's up to you to make sure nobody drowns or gets eaten by sharks and stuff." name = "lifeguard sleeper" outfit = /datum/outfit/beachbum/lifeguard + allow_custom_character = NONE -/obj/effect/mob_spawn/ghost_role/human/beach/lifeguard/special(mob/living/carbon/human/lifeguard, mob/mob_possessor) +/obj/effect/mob_spawn/ghost_role/human/beach/lifeguard/special(mob/living/carbon/human/lifeguard, mob/mob_possessor, apply_prefs) . = ..() lifeguard.gender = FEMALE lifeguard.update_body() @@ -119,6 +122,7 @@ flavour_text = "Time to mix drinks and change lives. Smoking space drugs makes it easier to understand your patrons' odd dialect." spawner_job_path = /datum/job/space_bartender outfit = /datum/outfit/spacebartender + allow_custom_character = ALL /datum/outfit/spacebartender name = "Space Bartender" @@ -233,7 +237,7 @@ to_chat(user, span_warning("You have exhausted your usefulness to the Necropolis.")) return FALSE -/obj/effect/mob_spawn/ghost_role/human/ash_walker/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/ghost_role/human/ash_walker/special(mob/living/carbon/human/spawned_human, mob/mob_possessor, apply_prefs) . = ..() spawned_human.fully_replace_character_name(null, spawned_human.generate_random_mob_name(TRUE)) to_chat(spawned_human, "Drag the corpses of men and beasts to your nest. It will absorb them to create more of your kind. Invade the strange structure of the outsiders if you must. Do not cause unnecessary destruction, as littering the wastes with ugly wreckage is certain to not gain you favor. Glory to the Necropolis!") @@ -284,8 +288,9 @@ outfit = /datum/outfit/lavaland_syndicate spawner_job_path = /datum/job/lavaland_syndicate deletes_on_zero_uses_left = FALSE + allow_custom_character = ALL -/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/special(mob/living/new_spawn) +/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/special(mob/living/new_spawn, mob/mob_possessor, apply_prefs) . = ..() new_spawn.grant_language(/datum/language/codespeak, source = LANGUAGE_MIND) diff --git a/code/modules/mob_spawn/ghost_roles/space_roles.dm b/code/modules/mob_spawn/ghost_roles/space_roles.dm index 0799de4c2b0d..0b1e6c41d3bb 100644 --- a/code/modules/mob_spawn/ghost_roles/space_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/space_roles.dm @@ -1,24 +1,44 @@ //Ancient cryogenic sleepers. Players become NT crewmen from a hundred year old space station, now on the verge of collapse. -/obj/effect/mob_spawn/ghost_role/human/oldsec +/obj/effect/mob_spawn/ghost_role/human/oldstation name = "old cryogenics pod" - desc = "A humming cryo pod. You can barely recognise a security uniform underneath the built up ice. The machine is attempting to wake up its occupant." - prompt_name = "a security officer" + desc = "A humming cryo pod. You can barely recognise a uniform underneath the built up ice. The machine is attempting to wake up its occupant." + prompt_name = "an ancient crewman" icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper" mob_species = /datum/species/human - you_are_text = "You are a security officer working for Nanotrasen, stationed onboard a state of the art research station." + you_are_text = "You are a crewman working for Nanotrasen, stationed onboard a state of the art research station." flavour_text = "You vaguely recall rushing into a cryogenics pod due to an oncoming radiation storm. \ The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod." important_text = "Work as a team with your fellow survivors and do not abandon them." - outfit = /datum/outfit/oldsec + outfit = /datum/outfit/oldeng spawner_job_path = /datum/job/ancient_crew + allow_custom_character = GHOSTROLE_TAKE_PREFS_APPEARANCE -/obj/effect/mob_spawn/ghost_role/human/oldsec/Destroy() - new/obj/structure/showcase/machinery/oldpod/used(drop_location()) +/obj/effect/mob_spawn/ghost_role/human/oldstation/create(mob/mob_possessor, newname, apply_prefs) + . = ..() + if(!.) + return + notify_ghosts( + "Someone just woke up on Charlie Station! Why not join them and help out?", + source = ., //the spawned mob + header = "Join in, help out!", + click_interact = TRUE, + notify_flags = NOTIFY_CATEGORY_NOFLASH, + ) + +/obj/effect/mob_spawn/ghost_role/human/oldstation/Destroy() + new /obj/structure/showcase/machinery/oldpod/used(drop_location()) return ..() + +/obj/effect/mob_spawn/ghost_role/human/oldstation/sec + desc = "A humming cryo pod. You can barely recognise a security uniform underneath the built up ice. The machine is attempting to wake up its occupant." + prompt_name = "a security officer" + you_are_text = "You are a security officer working for Nanotrasen, stationed onboard a state of the art research station." + outfit = /datum/outfit/oldsec + /datum/outfit/oldsec name = "Ancient Security" id = /obj/item/card/id/away/old/sec @@ -27,24 +47,11 @@ l_pocket = /obj/item/assembly/flash/handheld r_pocket = /obj/item/restraints/handcuffs -/obj/effect/mob_spawn/ghost_role/human/oldeng - name = "old cryogenics pod" +/obj/effect/mob_spawn/ghost_role/human/oldstation/eng desc = "A humming cryo pod. You can barely recognise an engineering uniform underneath the built up ice. The machine is attempting to wake up its occupant." prompt_name = "an engineer" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - mob_species = /datum/species/human you_are_text = "You are an engineer working for Nanotrasen, stationed onboard a state of the art research station." - flavour_text = "You vaguely recall rushing into a cryogenics pod due to an oncoming radiation storm. The last thing \ - you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ - your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod." - important_text = "Work as a team with your fellow survivors and do not abandon them." outfit = /datum/outfit/oldeng - spawner_job_path = /datum/job/ancient_crew - -/obj/effect/mob_spawn/ghost_role/human/oldeng/Destroy() - new/obj/structure/showcase/machinery/oldpod/used(drop_location()) - return ..() /datum/outfit/oldeng name = "Ancient Engineer" @@ -61,24 +68,11 @@ mask = /obj/item/clothing/mask/breath internals_slot = ITEM_SLOT_SUITSTORE -/obj/effect/mob_spawn/ghost_role/human/oldsci - name = "old cryogenics pod" +/obj/effect/mob_spawn/ghost_role/human/oldstation/sci desc = "A humming cryo pod. You can barely recognise a science uniform underneath the built up ice. The machine is attempting to wake up its occupant." prompt_name = "a scientist" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - mob_species = /datum/species/human you_are_text = "You are a scientist working for Nanotrasen, stationed onboard a state of the art research station." - flavour_text = "You vaguely recall rushing into a cryogenics pod due to an oncoming radiation storm. \ - The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ - your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod." - important_text = "Work as a team with your fellow survivors and do not abandon them." outfit = /datum/outfit/oldsci - spawner_job_path = /datum/job/ancient_crew - -/obj/effect/mob_spawn/ghost_role/human/oldsci/Destroy() - new/obj/structure/showcase/machinery/oldpod/used(drop_location()) - return ..() /datum/outfit/oldsci name = "Ancient Scientist" @@ -111,6 +105,7 @@ outfit = /datum/outfit/syndicate_empty/battlecruiser spawner_job_path = /datum/job/battlecruiser_crew uses = 4 + allow_custom_character = ALL /// The antag team to apply the player to var/datum/team/antag_team @@ -200,6 +195,7 @@ important_text = "Work as a team with your fellow actors and the director to make entertainment for the masses." outfit = /datum/outfit/actor spawner_job_path = /datum/job/ghost_role + allow_custom_character = ALL /datum/outfit/actor name = "Actor" @@ -224,6 +220,7 @@ important_text = "Work as a team with your fellow actors and the director to make entertainment for the masses." outfit = /datum/outfit/actor/director spawner_job_path = /datum/job/ghost_role + allow_custom_character = ALL /datum/outfit/actor/director name = "Director" diff --git a/code/modules/mob_spawn/ghost_roles/spider_roles.dm b/code/modules/mob_spawn/ghost_roles/spider_roles.dm index 0ee4435a9e46..9251930808f0 100644 --- a/code/modules/mob_spawn/ghost_roles/spider_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/spider_roles.dm @@ -139,8 +139,9 @@ if(!silent) to_chat(user, span_warning("\The [src] is not ready to hatch yet!")) return FALSE + return TRUE -/obj/effect/mob_spawn/ghost_role/spider/special(mob/living/basic/spider/spawned_mob, mob/mob_possessor) +/obj/effect/mob_spawn/ghost_role/spider/special(mob/living/basic/spider/spawned_mob, mob/mob_possessor, apply_prefs) . = ..() if (isspider(spawned_mob)) spawned_mob.directive = directive @@ -197,21 +198,12 @@ ) flash_window = TRUE -/** - * Makes a ghost into a spider based on the type of egg cluster. - * - * Allows a ghost to get a prompt to use the egg cluster to become a spider. - * - * Arguments: - * * user - The ghost attempting to become a spider - * * newname - If set, renames the mob to this name - */ -/obj/effect/mob_spawn/ghost_role/spider/create(mob/user, newname) +/obj/effect/mob_spawn/ghost_role/spider/pre_ghost_take(mob/dead/observer/user) var/chosen_spider = length(potentialspawns) > 1 ? get_radial_choice(user) : potentialspawns[1] - if(QDELETED(src) || QDELETED(user) || isnull(chosen_spider)) + if(isnull(chosen_spider)) return FALSE mob_type = chosen_spider - return ..() + return TRUE /// Pick a spider type from a radial menu /obj/effect/mob_spawn/ghost_role/spider/proc/get_radial_choice(mob/user) diff --git a/code/modules/mob_spawn/ghost_roles/unused_roles.dm b/code/modules/mob_spawn/ghost_roles/unused_roles.dm index 18f5aabb7dba..f001ff2487e7 100644 --- a/code/modules/mob_spawn/ghost_roles/unused_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/unused_roles.dm @@ -12,6 +12,7 @@ though fate has other plans for you." flavour_text = "Good. It seems as though your ship crashed. You remember that you were convicted of " spawner_job_path = /datum/job/escaped_prisoner + allow_custom_character = GHOSTROLE_TAKE_PREFS_APPEARANCE /obj/effect/mob_spawn/ghost_role/human/prisoner_transport/Initialize(mapload) . = ..() @@ -24,7 +25,7 @@ new /obj/structure/fluff/empty_sleeper/syndicate(get_turf(src)) return ..() -/obj/effect/mob_spawn/ghost_role/human/prisoner_transport/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/ghost_role/human/prisoner_transport/special(mob/living/carbon/human/spawned_human, mob/mob_possessor, apply_prefs) . = ..() spawned_human.fully_replace_character_name(null, "NTP #LL-0[rand(111,999)]") //Nanotrasen Prisoner #Lavaland-(numbers) @@ -50,6 +51,7 @@ flavour_text = "Cater to visiting guests with your fellow staff, advertise the hotel, and make sure the manager doesn't fire you. Remember, the customer is always right!" important_text = "Do NOT leave the hotel, as that is grounds for contract termination." spawner_job_path = /datum/job/hotel_staff + allow_custom_character = ALL /datum/outfit/hotelstaff name = "Hotel Staff" @@ -94,6 +96,7 @@ flavour_text = "You have awoken, without instruction. Death to Nanotrasen! If there are some clues around as to what you're supposed to be doing, you best follow those." outfit = /datum/outfit/syndicate_empty spawner_job_path = /datum/job/space_syndicate + allow_custom_character = ALL /datum/outfit/syndicate_empty name = "Syndicate Operative Empty" @@ -119,6 +122,7 @@ flavour_text = "Hang out at the bar and chat with your buddies. Feel free to hop back in the cryogenics when you're done chatting." outfit = /datum/outfit/cryobartender spawner_job_path = /datum/job/space_bar_patron + allow_custom_character = ALL /obj/effect/mob_spawn/ghost_role/human/space_bar_patron/attack_hand(mob/user, list/modifiers) var/despawn = tgui_alert(usr, "Return to cryosleep? (Warning, Your mob will be deleted!)", null, list("Yes", "No")) @@ -153,7 +157,7 @@ new/obj/structure/fluff/empty_sleeper(get_turf(src)) return ..() -/obj/effect/mob_spawn/ghost_role/human/exile/special(mob/living/new_spawn) +/obj/effect/mob_spawn/ghost_role/human/exile/special(mob/living/new_spawn, mob/mob_possessor, apply_prefs) . = ..() new_spawn.fully_replace_character_name(null,"Wish Granter's Victim ([rand(1,999)])") var/wish = rand(1,4) @@ -178,6 +182,7 @@ you_are_text = "You are a Nanotrasen Private Security Officer!" flavour_text = "If higher command has an assignment for you, it's best you follow that. Otherwise, death to The Syndicate." outfit = /datum/outfit/nanotrasensoldier + allow_custom_character = ALL /obj/effect/mob_spawn/ghost_role/human/commander name = "sleeper" @@ -187,6 +192,7 @@ you_are_text = "You are a Nanotrasen Commander!" flavour_text = "Upper-crusty of Nanotrasen. You should be given the respect you're owed." outfit = /datum/outfit/nanotrasencommander + allow_custom_character = GHOSTROLE_TAKE_PREFS_APPEARANCE //space doctor, a rat with cancer, and bessie from an old removed lavaland ruin. @@ -199,6 +205,7 @@ flavour_text = "It's your job- no, your duty as a doctor, to care and heal those in need." outfit = /datum/outfit/job/doctor spawner_job_path = /datum/job/space_doctor + allow_custom_character = ALL /obj/effect/mob_spawn/ghost_role/human/doctor/alive/equip(mob/living/carbon/human/doctor) . = ..() @@ -227,7 +234,7 @@ icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper" -/obj/effect/mob_spawn/cow/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/cow/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs) . = ..() gender = FEMALE @@ -244,6 +251,7 @@ flavour_text = "Monitor Nanotrasen communications and record information. All intruders should be disposed of \ swiftly to assure no gathered information is stolen or lost. Try not to wander too far from the outpost as the \ caves can be a deadly place even for a trained operative such as yourself." + allow_custom_character = ALL /datum/outfit/snowsyndie name = "Syndicate Snow Operative" @@ -269,8 +277,9 @@ important_text = "Obey orders given by your captain. DO NOT let the ship fall into enemy hands." outfit = /datum/outfit/syndicatespace/syndicrew spawner_job_path = /datum/job/syndicate_cybersun + allow_custom_character = ALL -/obj/effect/mob_spawn/ghost_role/human/syndicatespace/special(mob/living/new_spawn) +/obj/effect/mob_spawn/ghost_role/human/syndicatespace/special(mob/living/new_spawn, mob/mob_possessor, apply_prefs) . = ..() new_spawn.grant_language(/datum/language/codespeak, source = LANGUAGE_MIND) var/datum/job/spawn_job = SSjob.get_job_type(spawner_job_path) @@ -286,6 +295,7 @@ important_text = "Protect the ship and secret documents in your backpack with your own life." outfit = /datum/outfit/syndicatespace/syndicaptain spawner_job_path = /datum/job/syndicate_cybersun_captain + allow_custom_character = ALL /obj/effect/mob_spawn/ghost_role/human/syndicatespace/captain/Destroy() new /obj/structure/fluff/empty_sleeper/syndicate/captain(get_turf(src)) 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 b9a89d0c6dd5..04432bf8bd09 100644 --- a/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm +++ b/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm @@ -31,7 +31,7 @@ if(flower_bud.trait_flags & SPACEVINE_COLD_RESISTANT) spawned_human_trap.unsuitable_cold_damage = 0 -/obj/effect/mob_spawn/ghost_role/venus_human_trap/special(mob/living/spawned_mob, mob/mob_possessor) +/obj/effect/mob_spawn/ghost_role/venus_human_trap/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs) . = ..() spawned_mob.mind.add_antag_datum(/datum/antagonist/venus_human_trap) @@ -54,3 +54,4 @@ if(!silent) to_chat(user, span_warning("\The [src] has not borne fruit yet!")) return FALSE + return TRUE diff --git a/code/modules/mob_spawn/mob_spawn.dm b/code/modules/mob_spawn/mob_spawn.dm index fe25ac2dcdb2..5816f8bb38b8 100644 --- a/code/modules/mob_spawn/mob_spawn.dm +++ b/code/modules/mob_spawn/mob_spawn.dm @@ -44,16 +44,36 @@ QDEL_NULL(outfit) return ..() -/// Creates whatever mob the spawner makes. Return FALSE if we want to exit from here without doing that, returning NULL will be logged to admins. -/obj/effect/mob_spawn/proc/create(mob/mob_possessor, newname) +/** + * Creates whatever mob the spawner makes. + * + * * mob_possessor - The ghost/mob that is possessing this mob, if applicable + * * newname - A forced name for the mob, if applicable + * * apply_prefs - Whether we should apply the possessor's preferences to the mob, if applicable + * + * Returns + * - the created mob + * - CANCEL_SPAWN if the spawn process should be stopped + * - null if the spawn failed (and something went wrong) + */ +/obj/effect/mob_spawn/proc/create(mob/mob_possessor, newname, apply_prefs) + SHOULD_NOT_SLEEP(TRUE) + var/mob/living/spawned_mob = new mob_type(get_turf(src)) //living mobs only + special(spawned_mob, mob_possessor, apply_prefs) 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) +/** + * Any special behavior that needs to be done to the mob after it's created but before it's equipped. + * + * * spawned_mob - The mob that was created + * * mob_possessor - The ghost/mob that is possessing this mob, if applicable + * * apply_prefs - Whether we should apply the possessor's preferences to the mob, if applicable + */ +/obj/effect/mob_spawn/proc/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs) SHOULD_CALL_PARENT(TRUE) if(faction) spawned_mob.faction = faction @@ -111,9 +131,8 @@ var/uses = 1 /// Does the spawner delete itself when it runs out of uses? var/deletes_on_zero_uses_left = TRUE - /// A list of the ckeys that currently are trying to access this spawner, so that they can't try to spawn more than once (in case there's sleeps). - /// Static because you only really want to be able to spawn in one spawner at a time, obviously. - var/static/list/ckeys_trying_to_spawn + ///bitflag that determines if players can spawn in as their statics + var/allow_custom_character = NONE ////descriptions @@ -152,51 +171,64 @@ //ATTACK GHOST IGNORING PARENT RETURN VALUE /obj/effect/mob_spawn/ghost_role/attack_ghost(mob/dead/observer/user) - if(!SSticker.HasRoundStarted() || !loc) + if(!SSticker.HasRoundStarted() || isnull(loc) || QDELETED(src)) return - // We don't open the prompt more than once at a time. + // Lazylist of the ckeys that currently are trying to access any spawner, so that they can't try to spawn more than once (in case there's sleeps). + var/static/list/ckeys_trying_to_spawn if(LAZYFIND(ckeys_trying_to_spawn, user.ckey)) return + if(uses <= 0 && !infinite_use) + to_chat(user, span_warning("This spawner is out of charges!")) + return FALSE + if(!can_ghost_take(user)) + return FALSE + uses -= 1 // Remove a use EARLY to account for sleep / inputs var/user_ckey = user.ckey // Just in case shenanigans happen, we always want to remove it from the list. LAZYADD(ckeys_trying_to_spawn, user_ckey) + var/prompt_fail = FALSE + var/apply_prefs = FALSE if(prompt_ghost) var/prompt = "Become [prompt_name]?" if(!temp_body && user.can_reenter_corpse && user.mind) prompt += " (Warning, You can no longer be revived!)" - var/ghost_role = tgui_alert(usr, prompt, buttons = list("Yes", "No"), timeout = 10 SECONDS) - if(ghost_role != "Yes" || !loc || QDELETED(user)) - LAZYREMOVE(ckeys_trying_to_spawn, user_ckey) - return - - if(!(GLOB.ghost_role_flags & GHOSTROLE_SPAWNER) && !(flags_1 & ADMIN_SPAWNED_1)) - to_chat(user, span_warning("An admin has temporarily disabled non-admin ghost roles!")) - LAZYREMOVE(ckeys_trying_to_spawn, user_ckey) - return - if(uses <= 0 && !infinite_use) //just in case - to_chat(user, span_warning("This spawner is out of charges!")) - LAZYREMOVE(ckeys_trying_to_spawn, user_ckey) - return + prompt_fail = tgui_alert(user, prompt, buttons = list("Yes", "No"), timeout = 10 SECONDS) != "Yes" + + var/species_pref = user.client.prefs.read_preference(/datum/preference/choiced/species) || /datum/species/human + if(!prompt_fail && user.started_as_observer && allow_custom_character && (GLOB.species_prototypes[species_pref].inherent_respiration_type & RESPIRATION_OXYGEN)) + var/static_prompt = "Because you haven't taken a role so far, you may spawn in as \ + [((allow_custom_character & GHOSTROLE_TAKE_PREFS_SPECIES) || species_pref == /datum/species/human) ? "" : "a human version of"] \ + your customized character with a random name. Would you like to?" + apply_prefs = tgui_alert(user, static_prompt, "Custom Character", list("Yes", "No"), 10 SECONDS) == "Yes" + + if(!prompt_fail && !pre_ghost_take(user)) + prompt_fail = TRUE + + if(prompt_fail || !can_ghost_take(user) || !create_from_ghost(user, apply_prefs, subtract_uses = FALSE)) + uses += 1 + LAZYREMOVE(ckeys_trying_to_spawn, user_ckey) + +/// Allows for modifications before the ghost is turned into a mob. +/// You can put sleeps or inputs in here, sanity checking is done for you after this proc returns. +/// Returning FALSE will cancel the spawn process. +/obj/effect/mob_spawn/ghost_role/proc/pre_ghost_take(mob/dead/observer/user) + return TRUE +/// Checks if a ghost can take this ghost role. +/obj/effect/mob_spawn/ghost_role/proc/can_ghost_take(mob/dead/observer/user) 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 - if(!allow_spawn(user, silent = FALSE)) - LAZYREMOVE(ckeys_trying_to_spawn, user_ckey) - return + return FALL_STOP_INTERCEPTING + if(!(GLOB.ghost_role_flags & GHOSTROLE_SPAWNER) && !(flags_1 & ADMIN_SPAWNED_1)) + to_chat(user, span_warning("An admin has temporarily disabled non-admin ghost roles!")) + return FALSE if(QDELETED(src) || QDELETED(user)) - LAZYREMOVE(ckeys_trying_to_spawn, user_ckey) - return - - if(uses <= 0 && !infinite_use) // Just in case something took longer than it should've and we got here after the uses went below zero. - to_chat(user, span_warning("This spawner is out of charges!")) - LAZYREMOVE(ckeys_trying_to_spawn, user_ckey) - return - - create_from_ghost(user) + return FALSE + if(!allow_spawn(user, silent = FALSE)) + return FALSE + return TRUE /** * Uses a use and creates a mob from a passed ghost @@ -205,49 +237,57 @@ * * If you are manually forcing a player into this mob spawn, * you should be using this and not directly calling [proc/create]. + * + * * * user - The ghost/mob that is possessing this mob + * * * apply_prefs - Whether we should apply the possessor's preferences to the mob + * * * subtract_uses - Whether to subtract a use from the spawner. + * Set to FALSE if you want to handle uses manually elsewhere. */ -/obj/effect/mob_spawn/ghost_role/proc/create_from_ghost(mob/dead/user) +/obj/effect/mob_spawn/ghost_role/proc/create_from_ghost(mob/dead/observer/user, apply_prefs, subtract_uses = TRUE) + SHOULD_NOT_OVERRIDE(TRUE) + SHOULD_NOT_SLEEP(TRUE) 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 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 if(!temp_body) user.mind = null // dissassociate mind, don't let it follow us to the next life - var/created = create(user) - LAZYREMOVE(ckeys_trying_to_spawn, user_ckey) // We do this AFTER the create() so that we're basically sure that the user won't be in their ghost body anymore, so they can't click on the spawner again. - - if(!created) - uses += 1 // Refund use because we didn't actually spawn anything - - 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 + var/mob/created = create(user, apply_prefs = apply_prefs) + if(ismob(created)) + SEND_SIGNAL(src, COMSIG_GHOSTROLE_SPAWNED, created) + if(subtract_uses) + uses -= 1 + check_uses() + else if(isnull(created)) // null instead of explicit CANCEL_SPAWN means something went wrong + CRASH("An instance of [type] didn't return anything when creating a mob, this might be broken!") return created -/obj/effect/mob_spawn/ghost_role/create(mob/mob_possessor, newname) +/obj/effect/mob_spawn/ghost_role/create(mob/mob_possessor, newname, apply_prefs) 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!") return ..() - -/obj/effect/mob_spawn/ghost_role/special(mob/living/spawned_mob, mob/mob_possessor) +/obj/effect/mob_spawn/ghost_role/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs) . = ..() if(mob_possessor) + if(mob_possessor.client && apply_prefs && allow_custom_character && ishuman(spawned_mob)) + var/mob/living/carbon/human/spawned_human = spawned_mob + if(allow_custom_character & GHOSTROLE_TAKE_PREFS_APPEARANCE) + mob_possessor.client.prefs.apply_prefs_to(spawned_human, icon_updates = TRUE, do_not_apply = typesof(/datum/preference/name, /datum/preference/choiced/species)) + if(allow_custom_character & GHOSTROLE_TAKE_PREFS_SPECIES) + spawned_human.set_species(mob_possessor.client.prefs.read_preference(/datum/preference/choiced/species)) + spawned_human.fully_replace_character_name(spawned_human.real_name, spawned_human.generate_random_mob_name()) if(mob_possessor.mind) mob_possessor.mind.transfer_to(spawned_mob, force_key_move = TRUE) else spawned_mob.PossessByPlayer(mob_possessor.key) + var/datum/mind/spawned_mind = spawned_mob.mind if(spawned_mind) spawned_mob.mind.set_assigned_role_with_greeting(SSjob.get_job_type(spawner_job_path)) spawned_mind.name = spawned_mob.real_name - if(show_flavor) var/output_message = span_infoplain("[you_are_text]") if(flavour_text != "") @@ -296,16 +336,16 @@ if(mapload || (SSticker && SSticker.current_state > GAME_STATE_SETTING_UP)) INVOKE_ASYNC(src, PROC_REF(create)) -/obj/effect/mob_spawn/corpse/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/corpse/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs) . = ..() spawned_mob.death(TRUE) - spawned_mob.adjustOxyLoss(oxy_damage) - spawned_mob.adjustBruteLoss(brute_damage) - spawned_mob.adjustFireLoss(burn_damage) + spawned_mob.adjust_oxy_loss(oxy_damage) + spawned_mob.adjust_brute_loss(brute_damage) + spawned_mob.adjust_fire_loss(burn_damage) if (corpse_description) spawned_mob.AddComponent(/datum/component/temporary_description, corpse_description, naive_corpse_description) -/obj/effect/mob_spawn/corpse/create(mob/mob_possessor, newname) +/obj/effect/mob_spawn/corpse/create(mob/mob_possessor, newname, apply_prefs) . = ..() qdel(src) @@ -325,12 +365,13 @@ ///husks the corpse if true. var/husk = FALSE -/obj/effect/mob_spawn/corpse/human/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/corpse/human/special(mob/living/carbon/human/spawned_human, mob/mob_possessor, apply_prefs) . = ..() if(husk) spawned_human.Drain() else //Because for some reason I can't track down, things are getting turned into husks even if husk = false. It's in some damage proc somewhere. spawned_human.cure_husk() + spawned_human.job = name /obj/effect/mob_spawn/corpse/human/equip(mob/living/carbon/human/spawned_human) . = ..() @@ -344,8 +385,7 @@ // Or on crew monitors var/obj/item/clothing/under/sensor_clothes = spawned_human.w_uniform if(istype(sensor_clothes)) - sensor_clothes.sensor_mode = SENSOR_OFF - spawned_human.update_suit_sensors() + sensor_clothes.set_sensor_mode(SENSOR_OFF) //don't use this in subtypes, just add 1000 brute yourself. that being said, this is a type that has 1000 brute. it doesn't really have a home anywhere else, it just needs to exist /obj/effect/mob_spawn/corpse/human/damaged diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index d2baba9c8d21..2935aeb09137 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -50,20 +50,18 @@ balloon_alert(user, "currently [active ? "unsealing" : "sealing"]!") playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE - var/deploy = FALSE + var/deploy = TRUE for(var/obj/item/part as anything in get_parts()) if(part.loc != src) - continue - deploy = TRUE - break + deploy = FALSE + break wearer.visible_message(span_notice("[wearer]'s [src] [deploy ? "deploys" : "retracts"] its parts with a mechanical hiss."), span_notice("[src] [deploy ? "deploys" : "retracts"] its parts with a mechanical hiss."), span_hear("You hear a mechanical hiss.")) playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) for(var/obj/item/part as anything in get_parts()) if(deploy && part.loc == src) - if(!deploy(null, part)) - continue + deploy(null, part) else if(!deploy && part.loc != src) retract(null, part) if(deploy) @@ -261,6 +259,9 @@ part.heat_protection = initial(part.heat_protection) part.cold_protection = initial(part.cold_protection) part.alternate_worn_layer = part_datum.sealed_layer + if(part.slot_flags & ITEM_SLOT_HEAD) + var/datum/component/wearertargeting/protection = part.AddComponent(/datum/component/wearertargeting/earprotection, protection_amount = src.theme.hearing_protection) + protection.on_equip(src, wearer, ITEM_SLOT_HEAD) else part.icon_state = "[skin]-[part.base_icon_state]" part.flags_cover &= ~part.visor_flags_cover @@ -269,6 +270,8 @@ part.heat_protection = NONE part.cold_protection = NONE part.alternate_worn_layer = part_datum.unsealed_layer + if((part.slot_flags & ITEM_SLOT_HEAD) && istype(part, /obj/item/clothing/head/mod)) + qdel(part.GetComponent(/datum/component/wearertargeting/earprotection)) update_speed() wearer.update_clothing(part.slot_flags | slot_flags) wearer.refresh_obscured() diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm index 28428a8fe139..80a88ddb215e 100644 --- a/code/modules/mod/mod_clothes.dm +++ b/code/modules/mod/mod_clothes.dm @@ -27,7 +27,7 @@ allowed = list( /obj/item/tank/internals, /obj/item/flashlight, - /obj/item/tank/jetpack/oxygen/captain, + /obj/item/tank/jetpack/captain, ) armor_type = /datum/armor/none body_parts_covered = CHEST|GROIN @@ -76,3 +76,35 @@ /obj/item/clothing/shoes/mod/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NO_SPEED_POTION, INNATE_TRAIT) + +/obj/item/clothing/glasses/mod + name = "MOD glasses" + desc = "A pair of glasses for a MODsuit." + icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' + icon_state = "standard-glasses" + base_icon_state = "glasses" + worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + armor_type = /datum/armor/none + equip_sound = null + pickup_sound = null + drop_sound = null + +/obj/item/clothing/glasses/mod/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NO_SPEED_POTION, INNATE_TRAIT) + +/obj/item/clothing/neck/mod + name = "MOD tie" + desc = "An tie for a MODsuit." + icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' + icon_state = "standard-tie" + base_icon_state = "tie" + worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + armor_type = /datum/armor/none + equip_sound = null + pickup_sound = null + drop_sound = null + +/obj/item/clothing/neck/mod/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NO_SPEED_POTION, INNATE_TRAIT) diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index fd41c1c7f304..da27123ba927 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -95,6 +95,9 @@ /obj/item/mod/construction/plating/civilian theme = /datum/mod_theme/civilian +/obj/item/mod/construction/plating/portable_suit + theme = /datum/mod_theme/portable_suit + /obj/item/mod/construction/plating/engineering theme = /datum/mod_theme/engineering diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index cb4689e81d04..fcc27c3e2e60 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -106,6 +106,7 @@ module = new module(src) install(module) START_PROCESSING(SSobj, src) + AddElement(/datum/element/drag_pickup) /obj/item/mod/control/Destroy() STOP_PROCESSING(SSobj, src) @@ -212,14 +213,14 @@ return clean_up() -/obj/item/mod/control/allow_attack_hand_drop(mob/user) +/obj/item/mod/control/can_mob_unequip(mob/user) if(user != wearer) return ..() if(active) balloon_alert(wearer, "unit active!") playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) - return + return FALSE for(var/obj/item/part as anything in get_parts()) if(part.loc != src) @@ -229,23 +230,6 @@ return ..() -/obj/item/mod/control/mouse_drop_dragged(atom/over_object, mob/user) - if(user != wearer || !istype(over_object, /atom/movable/screen/inventory/hand)) - return - if(active) - balloon_alert(wearer, "unit active!") - playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) - return - for(var/obj/item/part as anything in get_parts()) - if(part.loc != src) - balloon_alert(wearer, "parts extended!") - playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) - return - if(!wearer.incapacitated) - var/atom/movable/screen/inventory/hand/ui_hand = over_object - if(wearer.putItemFromInventoryInHandIfPossible(src, ui_hand.held_index)) - add_fingerprint(user) - /obj/item/mod/control/wrench_act(mob/living/user, obj/item/wrench) if(seconds_electrified && get_charge() && shock(user)) return ITEM_INTERACT_BLOCKING diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm index caf162c9c410..174299fdc67b 100644 --- a/code/modules/mod/mod_core.dm +++ b/code/modules/mod/mod_core.dm @@ -6,6 +6,7 @@ inhand_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.05, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.05) /// MOD unit we are powering. var/obj/item/mod/control/mod @@ -301,6 +302,7 @@ liquid electricity, this core makes it much more efficient, running all soft, hard, and wetware with several \ times less energy usage." /// A modifier to all charge we use, ethereals don't need to spend as much energy as normal suits. + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.15, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.05) var/charge_modifier = 0.1 /obj/item/mod/core/ethereal/charge_source() @@ -466,6 +468,7 @@ /obj/item/mod/core/plasma/lavaland/Destroy() QDEL_NULL(particle_effect) + QDEL_NULL(mob_spawner) return ..() /obj/item/mod/core/plasma/lavaland/install(obj/item/mod/control/mod_unit) @@ -480,17 +483,22 @@ SIGNAL_HANDLER if(mod.active) 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, faction=mod.wearer.faction) + mob_spawner = mod.wearer.AddComponent(/datum/component/spawner, \ + spawn_types = list(spawned_mob_type), \ + spawn_time = 5 SECONDS, \ + max_spawned = 3, \ + faction = mod.wearer.faction, \ + ) RegisterSignal(mob_spawner, COMSIG_SPAWNER_SPAWNED, PROC_REF(new_mob)) RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(spread_flowers)) + return - else - QDEL_NULL(particle_effect) - UnregisterSignal(mob_spawner, COMSIG_SPAWNER_SPAWNED) - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) - for(var/datum/mob in mob_spawner.spawned_things) - qdel(mob) - qdel(mob_spawner) + QDEL_NULL(particle_effect) + UnregisterSignal(mob_spawner, COMSIG_SPAWNER_SPAWNED) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + for(var/datum/mob in mob_spawner.spawned_things) + qdel(mob) + QDEL_NULL(mob_spawner) /obj/item/mod/core/plasma/lavaland/proc/new_mob(spawner, mob/living/basic/butterfly/lavaland/temporary/spawned) SIGNAL_HANDLER @@ -499,6 +507,9 @@ /obj/item/mod/core/plasma/lavaland/proc/spread_flowers(atom/source, atom/oldloc, dir, forced) SIGNAL_HANDLER + if (!isturf(oldloc)) + return + var/static/list/possible_flower_types = list( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/flowers_yw/style_random, @@ -506,7 +517,7 @@ /obj/structure/flora/bush/flowers_pp/style_random, ) var/chosen_type = pick(possible_flower_types) - var/flower_boots = new chosen_type(get_turf(mod.wearer)) + var/flower_boots = new chosen_type(oldloc) 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 index 1ce9b43337fe..d7fc7070605b 100644 --- a/code/modules/mod/mod_link.dm +++ b/code/modules/mod/mod_link.dm @@ -117,7 +117,7 @@ /obj/item/mod/control/proc/delete_link_visual(mob/living/old_user) return delete_link_visual_generic(mod_link, old_user) -/obj/item/mod/control/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range) +/obj/item/mod/control/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/item/mod/control/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range) . = ..() if(speaker != wearer && speaker != ai_assistant) return @@ -296,7 +296,7 @@ old_user.update_worn_neck() return delete_link_visual_generic(mod_link, old_user) -/obj/item/clothing/neck/link_scryer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range) +/obj/item/clothing/neck/link_scryer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/item/clothing/neck/link_scryer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range) . = ..() if(speaker != loc) return diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index db4b0f61c255..86403c7a2e2f 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -25,6 +25,8 @@ var/datum/armor/armor_type = /datum/armor/mod_theme /// Resistance flags shared across the MOD parts. var/resistance_flags = NONE + /// Hearing protection level supplied by the modsuit head + var/hearing_protection /// Atom flags shared across the MOD parts. var/atom_flags = NONE /// Max heat protection shared across the MOD parts. @@ -112,7 +114,7 @@ if(!ispath(path)) continue var/obj/item/mod_part = new path(mod) - if(mod_part.slot_flags == ITEM_SLOT_OCLOTHING && isclothing(mod_part)) + if(isclothing(mod_part) && mod_part.slot_flags == ITEM_SLOT_OCLOTHING) var/obj/item/clothing/chestplate = mod_part chestplate.allowed |= allowed_suit_storage var/datum/mod_part/part_datum = new() @@ -232,6 +234,42 @@ acid = 25 wound = 5 +/datum/mod_theme/portable_suit + name = "portable suit" + desc = "A one-piece three-piece suit designed for maximum negotiating power. Provides no meaningful protection." + extended_desc = "The \"secret weapon\" of the Moonrakers Conglomerate, designed for maximum bureaucratic efficiency. \ + While giving practically no protection against any physical threat, the aura of affluence it exudes is said to ward off \ + bear markets." + default_skin = "psuit" + armor_type = /datum/armor/mod_theme_portable_suit + charge_drain = DEFAULT_CHARGE_DRAIN / 2 + max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT + min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT + complexity_max = DEFAULT_MAX_COMPLEXITY - 5 + slot_flags = ITEM_SLOT_NECK + slowdown_deployed = 0 + inbuilt_modules = list(/obj/item/mod/module/selfcleaner) + variants = list( + "psuit" = list( + /obj/item/clothing/glasses/mod = list( + UNSEALED_MESSAGE = GLASSES_UNSEAL_MESSAGE, + SEALED_MESSAGE = GLASSES_SEAL_MESSAGE, + ), + /obj/item/clothing/suit/mod = list( + UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE, + SEALED_MESSAGE = CHESTPLATE_SEAL_MESSAGE, + ), + /obj/item/clothing/shoes/mod = list( + CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = BOOT_UNSEAL_MESSAGE, + SEALED_MESSAGE = BOOT_SEAL_MESSAGE, + ), + ), + ) + +/datum/armor/mod_theme_portable_suit + bio = 50 + /datum/mod_theme/engineering name = "engineering" desc = "An engineer-fit suit with heat and shock resistance. Nakamura Engineering's classic." @@ -628,19 +666,21 @@ charge_drain = DEFAULT_CHARGE_DRAIN * 1.5 slowdown_deployed = 0.5 allowed_suit_storage = list( + /obj/item/crowbar/power/paramedic, + /obj/item/defibrillator/compact, /obj/item/healthanalyzer, - /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/applicator, /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/applicator, /obj/item/reagent_containers/syringe, - /obj/item/stack/medical, /obj/item/sensor_device, - /obj/item/storage/pill_bottle, - /obj/item/storage/bag/chemistry, + /obj/item/stack/medical, /obj/item/storage/bag/bio, + /obj/item/storage/bag/chemistry, + /obj/item/storage/pill_bottle, ) variants = list( "medical" = list( @@ -739,20 +779,22 @@ slowdown_deployed = 0.25 inbuilt_modules = list(/obj/item/mod/module/quick_carry/advanced) allowed_suit_storage = list( + /obj/item/crowbar/power/paramedic, + /obj/item/defibrillator/compact, /obj/item/healthanalyzer, + /obj/item/melee/baton/telescopic, + /obj/item/reagent_containers/applicator, /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/hypospray, - /obj/item/reagent_containers/applicator/pill, /obj/item/reagent_containers/syringe, - /obj/item/stack/medical, /obj/item/sensor_device, - /obj/item/storage/pill_bottle, + /obj/item/stack/medical, /obj/item/storage/bag/chemistry, /obj/item/storage/bag/bio, - /obj/item/melee/baton/telescopic, + /obj/item/storage/pill_bottle, ) variants = list( "rescue" = list( @@ -818,7 +860,8 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT complexity_max = DEFAULT_MAX_COMPLEXITY + 5 slowdown_deployed = 1.25 - inbuilt_modules = list(/obj/item/mod/module/reagent_scanner/advanced, /obj/item/mod/module/hearing_protection) + inbuilt_modules = list(/obj/item/mod/module/reagent_scanner/advanced) + hearing_protection = EAR_PROTECTION_NORMAL allowed_suit_storage = list( /obj/item/analyzer, /obj/item/dnainjector, @@ -885,7 +928,7 @@ armor_type = /datum/armor/mod_theme_security complexity_max = DEFAULT_MAX_COMPLEXITY - 2 slowdown_deployed = 0.5 - inbuilt_modules = list(/obj/item/mod/module/hearing_protection) + hearing_protection = EAR_PROTECTION_NORMAL allowed_suit_storage = list( /obj/item/reagent_containers/spray/pepper, /obj/item/restraints/handcuffs, @@ -952,7 +995,8 @@ armor_type = /datum/armor/mod_theme_safeguard resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - inbuilt_modules = list(/obj/item/mod/module/shove_blocker/locked, /obj/item/mod/module/hearing_protection) + inbuilt_modules = list(/obj/item/mod/module/shove_blocker/locked) + hearing_protection = EAR_PROTECTION_NORMAL slowdown_deployed = 0.25 allowed_suit_storage = list( /obj/item/reagent_containers/spray/pepper, @@ -1025,7 +1069,7 @@ siemens_coefficient = 0 complexity_max = DEFAULT_MAX_COMPLEXITY + 5 slowdown_deployed = 0.25 - inbuilt_modules = list(/obj/item/mod/module/hearing_protection) + hearing_protection = EAR_PROTECTION_NORMAL allowed_suit_storage = list( /obj/item/restraints/handcuffs, /obj/item/assembly/flash, @@ -1164,7 +1208,8 @@ slowdown_deployed = 0 ui_theme = "syndicate" resistance_flags = FIRE_PROOF - inbuilt_modules = list(/obj/item/mod/module/welding/syndicate, /obj/item/mod/module/night, /obj/item/mod/module/hearing_protection) + inbuilt_modules = list(/obj/item/mod/module/welding/syndicate, /obj/item/mod/module/night) + hearing_protection = EAR_PROTECTION_NORMAL allowed_suit_storage = list( /obj/item/restraints/handcuffs, /obj/item/assembly/flash, @@ -1270,7 +1315,8 @@ siemens_coefficient = 0 slowdown_deployed = 0 ui_theme = "syndicate" - inbuilt_modules = list(/obj/item/mod/module/welding/syndicate, /obj/item/mod/module/night, /obj/item/mod/module/hearing_protection) + inbuilt_modules = list(/obj/item/mod/module/welding/syndicate, /obj/item/mod/module/night) + hearing_protection = EAR_PROTECTION_NORMAL allowed_suit_storage = list( /obj/item/restraints/handcuffs, /obj/item/assembly/flash, @@ -1344,7 +1390,8 @@ activation_step_time = MOD_ACTIVATION_STEP_TIME * 0.5 ui_theme = "syndicate" slot_flags = ITEM_SLOT_BELT - inbuilt_modules = list(/obj/item/mod/module/infiltrator, /obj/item/mod/module/storage/belt, /obj/item/mod/module/demoralizer, /obj/item/mod/module/hearing_protection, /obj/item/mod/module/night) + inbuilt_modules = list(/obj/item/mod/module/infiltrator, /obj/item/mod/module/storage/belt, /obj/item/mod/module/demoralizer, /obj/item/mod/module/night) + hearing_protection = EAR_PROTECTION_NORMAL allowed_suit_storage = list( /obj/item/restraints/handcuffs, /obj/item/assembly/flash, @@ -1413,7 +1460,8 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT charge_drain = DEFAULT_CHARGE_DRAIN * 2 slowdown_deployed = -0.5 - inbuilt_modules = list(/obj/item/mod/module/quick_carry/advanced, /obj/item/mod/module/hearing_protection) + inbuilt_modules = list(/obj/item/mod/module/quick_carry/advanced) + hearing_protection = EAR_PROTECTION_NORMAL allowed_suit_storage = list( /obj/item/assembly/flash, /obj/item/healthanalyzer, @@ -1500,7 +1548,8 @@ complexity_max = DEFAULT_MAX_COMPLEXITY slowdown_deployed = 0 ui_theme = "wizard" - inbuilt_modules = list(/obj/item/mod/module/anti_magic/wizard, /obj/item/mod/module/hearing_protection) + inbuilt_modules = list(/obj/item/mod/module/anti_magic/wizard) + hearing_protection = EAR_PROTECTION_NORMAL allowed_suit_storage = list( /obj/item/teleportation_scroll, /obj/item/highfrequencyblade/wizard, @@ -1567,7 +1616,8 @@ siemens_coefficient = 0 slowdown_deployed = 0 ui_theme = "hackerman" - inbuilt_modules = list(/obj/item/mod/module/welding/camera_vision, /obj/item/mod/module/hacker, /obj/item/mod/module/weapon_recall, /obj/item/mod/module/adrenaline_boost, /obj/item/mod/module/energy_net, /obj/item/mod/module/hearing_protection) + inbuilt_modules = list(/obj/item/mod/module/welding/camera_vision, /obj/item/mod/module/hacker, /obj/item/mod/module/weapon_recall, /obj/item/mod/module/adrenaline_boost, /obj/item/mod/module/energy_net) + hearing_protection = EAR_PROTECTION_NORMAL allowed_suit_storage = list( /obj/item/gun, /obj/item/melee/baton, @@ -1703,7 +1753,8 @@ siemens_coefficient = 0 slowdown_deployed = 0 ui_theme = "ntos_terminal" - inbuilt_modules = list(/obj/item/mod/module/welding/syndicate, /obj/item/mod/module/hearing_protection) + inbuilt_modules = list(/obj/item/mod/module/welding/syndicate) + hearing_protection = EAR_PROTECTION_NORMAL allowed_suit_storage = list( /obj/item/ammo_box, /obj/item/ammo_casing, @@ -1771,7 +1822,7 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 slowdown_deployed = 0 - inbuilt_modules = list(/obj/item/mod/module/hearing_protection) + hearing_protection = EAR_PROTECTION_NORMAL allowed_suit_storage = list( /obj/item/restraints/handcuffs, /obj/item/assembly/flash, @@ -1884,7 +1935,7 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 complexity_max = DEFAULT_MAX_COMPLEXITY + 10 - inbuilt_modules = list(/obj/item/mod/module/hearing_protection) + hearing_protection = EAR_PROTECTION_NORMAL allowed_suit_storage = list( /obj/item/restraints/handcuffs, /obj/item/assembly/flash, @@ -1955,7 +2006,7 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 slowdown_deployed = 0 - inbuilt_modules = list(/obj/item/mod/module/hearing_protection) + hearing_protection = EAR_PROTECTION_NORMAL allowed_suit_storage = list( /obj/item/restraints/handcuffs, /obj/item/assembly/flash, @@ -2020,7 +2071,7 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT complexity_max = DEFAULT_MAX_COMPLEXITY - 10 slowdown_deployed = 0 - inbuilt_modules = list(/obj/item/mod/module/hearing_protection) + hearing_protection = EAR_PROTECTION_NORMAL allowed_suit_storage = list( /obj/item/restraints/handcuffs, ) @@ -2086,7 +2137,7 @@ siemens_coefficient = 0 slowdown_deployed = 0 activation_step_time = MOD_ACTIVATION_STEP_TIME * 0.2 - inbuilt_modules = list(/obj/item/mod/module/hearing_protection) + hearing_protection = EAR_PROTECTION_NORMAL allowed_suit_storage = list( /obj/item/gun, ) @@ -2153,7 +2204,7 @@ siemens_coefficient = 0 slowdown_deployed = 0 activation_step_time = MOD_ACTIVATION_STEP_TIME * 0.01 - inbuilt_modules = list(/obj/item/mod/module/hearing_protection) + hearing_protection = EAR_PROTECTION_FULL allowed_suit_storage = list( /obj/item/gun, ) diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index 385541f6f678..7f07997a5277 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -54,6 +54,16 @@ /obj/item/mod/module/flashlight, ) +/obj/item/mod/control/pre_equipped/portable_suit + theme = /datum/mod_theme/portable_suit + applied_modules = list( + /obj/item/mod/module/paper_dispenser, + /obj/item/mod/module/stamp, + ) + default_pins = list( + /obj/item/mod/module/stamp, + ) + /obj/item/mod/control/pre_equipped/engineering theme = /datum/mod_theme/engineering applied_modules = list( @@ -264,6 +274,7 @@ /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/jump_jet, + /obj/item/mod/module/pathfinder, /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock, /obj/item/mod/module/hat_stabilizer/syndicate, @@ -322,6 +333,7 @@ /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/jump_jet, + /obj/item/mod/module/pathfinder, /obj/item/mod/module/flashlight, /obj/item/mod/module/hat_stabilizer/syndicate, /obj/item/mod/module/quick_cuff, diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index 17d72f2e68fe..c2a43b6dd95a 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -4,6 +4,9 @@ icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' icon_state = "module" abstract_type = /obj/item/mod/module + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP /// If it can be removed var/removable = TRUE /// If it's passive, togglable, usable or active diff --git a/code/modules/mod/modules/module_pathfinder.dm b/code/modules/mod/modules/module_pathfinder.dm index 4b948d6ed07e..55263aa332d8 100644 --- a/code/modules/mod/modules/module_pathfinder.dm +++ b/code/modules/mod/modules/module_pathfinder.dm @@ -1,3 +1,5 @@ +#define PATHFINDER_PRE_ANIMATE_TIME (2 SECONDS) + ///Pathfinder - Can fly the suit from a long distance to an implant installed in someone. /obj/item/mod/module/pathfinder name = "MOD pathfinder module" @@ -24,6 +26,8 @@ var/image/jet_icon /// Allow suit activation - Lets this module be recalled from the MOD. var/allow_suit_activation = FALSE // I'm not here to argue about balance + /// Are we currently travelling? + var/in_transit = FALSE /obj/item/mod/module/pathfinder/Initialize(mapload) @@ -88,7 +92,7 @@ return balloon_alert(activator, "implanted") if(!(activator == mod.wearer)) // someone else implanted you - balloon_alert(mod.wearer, "pathfinder MOD tracker implanted!") + balloon_alert(mod.wearer, "tracker implanted!") playsound(src, 'sound/effects/spray.ogg', 30, TRUE, -6) /obj/item/mod/module/pathfinder/proc/attach(mob/living/user) @@ -101,64 +105,86 @@ return mod.quick_deploy(user) human_user.update_action_buttons(TRUE) - balloon_alert(human_user, "[mod] attached") playsound(mod, 'sound/machines/ping.ogg', 50, TRUE) drain_power(use_energy_cost) /obj/item/mod/module/pathfinder/proc/recall(mob/recaller) if(!implant) - balloon_alert(recaller, "no target implant!") + balloon_alert(recaller, "no implant!") return FALSE if(recaller != implant.imp_in && !allow_suit_activation) // No pAI recalling - balloon_alert(recaller, "sector safety regulations prevent MOD-side recalling!") + balloon_alert(recaller, "invalid user!") return FALSE if(mod.open) balloon_alert(recaller, "cover open!") return FALSE - if(mod.ai_controller) - balloon_alert(recaller, "already moving!") - return FALSE - if(ismob(get_atom_on_turf(mod))) - balloon_alert(recaller, "already on someone!") + if(in_transit) + balloon_alert(recaller, "suit in transit!") return FALSE - if(mod.z != implant.imp_in.z || get_dist(implant.imp_in, mod) > MOD_AI_RANGE) - balloon_alert(recaller, "too far!") + var/atom_on_turf = get_atom_on_turf(mod) + if(ismob(atom_on_turf)) + if(atom_on_turf == recaller) + balloon_alert(recaller, "already worn!") + else + recaller.balloon_alert(recaller, "suit is worn by somebody else!") return FALSE - var/datum/ai_controller/mod_ai = new /datum/ai_controller/mod(mod) - mod.ai_controller = mod_ai - mod_ai.set_movement_target(type, implant.imp_in) - mod_ai.set_blackboard_key(BB_MOD_TARGET, implant.imp_in) - mod_ai.set_blackboard_key(BB_MOD_MODULE, src) - mod.interaction_flags_item &= ~INTERACT_ITEM_ATTACK_HAND_PICKUP - mod.AddElement(/datum/element/movetype_handler) - ADD_TRAIT(mod, TRAIT_MOVE_FLYING, MOD_TRAIT) - animate(mod, 0.2 SECONDS, pixel_x = base_pixel_y, pixel_y = base_pixel_y) - mod.add_overlay(jet_icon) - RegisterSignal(mod, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + + in_transit = TRUE + animate(mod, 0.5 SECONDS, pixel_x = base_pixel_y, pixel_y = base_pixel_y) + mod.Shake(pixelshiftx = 1, pixelshifty = 1, duration = PATHFINDER_PRE_ANIMATE_TIME) + addtimer(CALLBACK(src, PROC_REF(do_recall), recaller), PATHFINDER_PRE_ANIMATE_TIME, TIMER_DELETE_ME) + balloon_alert(recaller, "suit recalled") if(!(recaller == mod.wearer)) balloon_alert(mod.wearer, "suit recalled") return TRUE -/obj/item/mod/module/pathfinder/proc/on_move(atom/movable/source, atom/old_loc, dir, forced) - SIGNAL_HANDLER +/// Pod-transport the suit to its owner +/obj/item/mod/module/pathfinder/proc/do_recall(mob/recaller) + var/container = get_atom_on_turf(mod) + if(ismob(container)) + balloon_alert(recaller, "launch interrupted!") + in_transit = FALSE + return - var/matrix/mod_matrix = matrix() - mod_matrix.Turn(get_angle(source, implant.imp_in)) - source.transform = mod_matrix + if(iscloset(container)) + var/obj/structure/closet/closet = container + if (!closet.opened) + if (!closet.open()) + playsound(closet, 'sound/effects/bang.ogg', vol = 50, vary = TRUE) + closet.bust_open() -/obj/item/mod/module/pathfinder/proc/end_recall(successful = TRUE) - if(!mod) - return - QDEL_NULL(mod.ai_controller) - mod.interaction_flags_item |= INTERACT_ITEM_ATTACK_HAND_PICKUP - REMOVE_TRAIT(mod, TRAIT_MOVE_FLYING, MOD_TRAIT) - mod.RemoveElement(/datum/element/movetype_handler) + + mod.add_overlay(jet_icon) + playsound(mod, 'sound/vehicles/rocketlaunch.ogg', vol = 80, vary = FALSE) + var/turf/land_target = get_turf(implant.imp_in) + var/obj/structure/closet/supplypod/pod = podspawn(list( + "target" = get_turf(mod), + "path" = /obj/structure/closet/supplypod/transport/module_pathfinder, + "reverse_dropoff_coords" = list(land_target.x, land_target.y, land_target.z), + )) + + pod.insert(mod, pod) + RegisterSignal(pod, COMSIG_SUPPLYPOD_RETURNING, PROC_REF(pod_takeoff)) + + if (istype(container, /obj/machinery/suit_storage_unit)) + var/obj/machinery/suit_storage_unit/storage = container + storage.locked = FALSE + storage.open_machine() + +/// Track when pod has taken off so we don't falsely report the initial landing +/obj/item/mod/module/pathfinder/proc/pod_takeoff(datum/pod) + SIGNAL_HANDLER + RegisterSignal(pod, COMSIG_SUPPLYPOD_LANDED, PROC_REF(pod_landed)) + +/// When the pod landed, we can recall again +/obj/item/mod/module/pathfinder/proc/pod_landed() + SIGNAL_HANDLER + in_transit = FALSE mod.cut_overlay(jet_icon) - mod.transform = matrix() - UnregisterSignal(mod, COMSIG_MOVABLE_MOVED) - if(!successful) - balloon_alert(implant.imp_in, "suit lost connection!") + playsound(mod, 'sound/items/handling/toolbox/toolbox_drop.ogg', vol = 80, vary = FALSE) + if (implant?.imp_in?.Adjacent(src)) + INVOKE_ASYNC(src, PROC_REF(attach), implant.imp_in) // ########### // THE INPLANT @@ -173,8 +199,6 @@ /// The pathfinder module we are linked to. var/obj/item/mod/module/pathfinder/module - - /obj/item/implant/mod/Initialize(mapload) . = ..() if(!istype(loc, /obj/item/mod/module/pathfinder)) @@ -182,8 +206,6 @@ module = loc /obj/item/implant/mod/Destroy() - if(module?.mod?.ai_controller) - module.end_recall(successful = FALSE) module = null return ..() @@ -192,7 +214,6 @@ Name: Nakamura Engineering Pathfinder Implant
      \ Implant Details: Allows for the recall of a Modular Outerwear Device by the implant owner at any time.
      " - /datum/action/item_action/mod_recall name = "Recall MOD" desc = "Recall a MODsuit anyplace, anytime." @@ -205,7 +226,7 @@ COOLDOWN_DECLARE(recall_cooldown) /datum/action/item_action/mod_recall/New(Target) - ..() + . = ..() if(!istype(Target, /obj/item/implant/mod)) qdel(src) return @@ -215,5 +236,14 @@ if(!COOLDOWN_FINISHED(src, recall_cooldown)) implant.balloon_alert(owner, "on cooldown!") return - if(implant.module.recall(owner)) // change this - COOLDOWN_START(src, recall_cooldown, 15 SECONDS) + if(implant.module.recall(owner)) + implant.balloon_alert(owner, "suit incoming...") + COOLDOWN_START(src, recall_cooldown, 5 SECONDS) + +/// Special pod subtype we use just to make insertion check easy +/obj/structure/closet/supplypod/transport/module_pathfinder + +/obj/structure/closet/supplypod/transport/module_pathfinder/insertion_allowed(atom/to_insert) + return istype(to_insert, /obj/item/mod/control) + +#undef PATHFINDER_PRE_ANIMATE_TIME diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index 7f6789affffc..44443c90fa2e 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -29,6 +29,8 @@ var/shield_icon = "shield-red" /// Charges the shield should start with. var/charges + /// Whether or not we allow this shield to block overwhelming attacks, such as from mechs. + var/block_overwhelming_attacks = FALSE /obj/item/mod/module/energy_shield/Initialize(mapload) . = ..() @@ -43,6 +45,7 @@ charge_recovery = charge_recovery, \ lose_multiple_charges = lose_multiple_charges, \ starting_charges = charges, \ + can_block_overwhelming = block_overwhelming_attacks, \ shield_icon_file = shield_icon_file, \ shield_icon = shield_icon) RegisterSignal(mod.wearer, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(shield_reaction)) @@ -64,7 +67,7 @@ SIGNAL_HANDLER if(mod.hit_reaction(owner, hitby, attack_text, 0, damage, attack_type)) - drain_power(use_energy_cost) + drain_power(use_energy_cost + use_energy_cost * (attack_type == OVERWHELMING_ATTACK ? (damage/100) : 0)) return SUCCESSFUL_BLOCK return NONE @@ -80,6 +83,7 @@ max_charges = 5 recharge_start_delay = 20 SECONDS charge_increment_delay = 3 SECONDS + block_overwhelming_attacks = TRUE // It's magic, bitch shield_icon_file = 'icons/effects/magic.dmi' shield_icon = "mageshield" required_slots = list() @@ -500,7 +504,7 @@ var/list/things_to_disrupt = list(target) if(isliving(target)) var/mob/living/live_target = target - things_to_disrupt += live_target.get_all_gear() + things_to_disrupt += live_target.get_all_gear(INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT|INCLUDE_ACCESSORIES) for(var/atom/disrupted as anything in things_to_disrupt) if(disrupted.on_saboteur(src, 1 MINUTES)) diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index 5838e2391cdd..9b24c5b7dc3f 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -26,17 +26,36 @@ head_cover.flash_protect = initial(head_cover.flash_protect) /obj/item/mod/module/welding/syndicate + name = "MODsuit flash-protected optical suite" complexity = 0 removable = FALSE incompatible_modules = list(/obj/item/mod/module/welding, /obj/item/mod/module/welding/syndicate, /obj/item/mod/module/stealth/wraith) - overlay_state_inactive = "module_armorbooster_on" + overlay_state_inactive = "module_armorbooster_off" use_mod_colors = TRUE mask_worn_overlay = TRUE /obj/item/mod/module/welding/syndicate/generate_worn_overlay(obj/item/source, mutable_appearance/standing) - overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" + if(!mod.wearer || !mod.wearer.combat_mode) + overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" + else + overlay_state_inactive = "module_armorbooster_on-[mod.skin]" return ..() + +/obj/item/mod/module/welding/syndicate/on_part_activation() + . = ..() + RegisterSignal(mod.wearer, COMSIG_COMBAT_MODE_TOGGLED, PROC_REF(on_combat_mode_toggle)) + +/obj/item/mod/module/welding/syndicate/on_part_deactivation(deleting = FALSE) + . = ..() + UnregisterSignal(mod.wearer, COMSIG_COMBAT_MODE_TOGGLED) + +/// Changes which overlay state we're using depending on combat mode status. +/obj/item/mod/module/welding/syndicate/proc/on_combat_mode_toggle(mob/living/carbon/human/toggler) + SIGNAL_HANDLER + playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + update_clothing_slots() + ///T-Ray Scan - Scans the terrain for undertile objects. /obj/item/mod/module/t_ray name = "MOD t-ray scan module" @@ -237,6 +256,7 @@ icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' max_integrity = 60 interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6.15, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.5) /// MODsuit tether module that created our projectile var/obj/item/mod/module/tether/parent_module /// Should we reset our pixel positions next time we move? @@ -266,7 +286,7 @@ return ITEM_INTERACT_BLOCKING /obj/item/tether_anchor/attack_hand_secondary(mob/user, list/modifiers) - if (!can_interact(user) || !user.CanReach(src) || !isturf(loc)) + if (!can_interact(user) || !IsReachableBy(user) || !isturf(loc)) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(HAS_TRAIT_FROM(user, TRAIT_TETHER_ATTACHED, REF(src))) @@ -289,10 +309,10 @@ reset_pixel_pos = FALSE /obj/item/tether_anchor/mouse_drop_receive(atom/target, mob/user, params) - if (!can_interact(user) || !user.CanReach(src) || !isturf(loc)) + if (!can_interact(user) || !IsReachableBy(user) || !isturf(loc)) return - if (!isliving(target) || !target.CanReach(src)) + if (!isliving(target) || !IsReachableBy(target)) return if(HAS_TRAIT_FROM(target, TRAIT_TETHER_ATTACHED, REF(src))) @@ -378,7 +398,7 @@ .["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 + .["loss_tox"] = mod.wearer?.get_tox_loss() || 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 a79d0849dd6b..e9f6d1543a71 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -2,11 +2,11 @@ ///Storage - Adds a storage component to the suit. /obj/item/mod/module/storage - name = "MOD storage module" + name = "MOD compact storage module" desc = "What amounts to a series of integrated storage compartments and specialized pockets installed across \ - the surface of the suit, useful for storing various bits, and or bobs." + the surface of the suit, useful for storing various bits, and or bobs. This version has been trimmed down to save space." icon_state = "storage" - complexity = 3 + complexity = 1 incompatible_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/plate_compression) required_slots = list(ITEM_SLOT_BACK) /// Max weight class of items in the storage. @@ -55,10 +55,11 @@ mod.wearer.temporarilyRemoveItemFromInventory(mod.wearer.s_store) /obj/item/mod/module/storage/large_capacity - name = "MOD expanded storage module" + name = "MOD storage module" desc = "Reverse engineered by Nakamura Engineering from Donk Company designs, this system of hidden compartments \ is entirely within the suit, distributing items and weight evenly to ensure a comfortable experience for the user; \ whether smuggling, or simply hauling." + complexity = 3 icon_state = "storage_large" max_combined_w_class = 21 max_items = 14 @@ -69,6 +70,7 @@ esoteric technology to compress the physical matter of items put inside of them, \ essentially shrinking items for much easier and more portable storage." icon_state = "storage_syndi" + complexity = 3 max_combined_w_class = 30 max_items = 21 @@ -88,6 +90,7 @@ name = "MOD bluespace storage module" desc = "A storage system developed by Nanotrasen, these compartments employ \ miniaturized bluespace pockets for the ultimate in storage technology; regardless of the weight of objects put inside." + complexity = 3 icon_state = "storage_large" max_w_class = WEIGHT_CLASS_GIGANTIC max_combined_w_class = 60 @@ -264,10 +267,10 @@ .["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 + .["loss_brute"] = mod.wearer?.get_brute_loss() || 0 + .["loss_fire"] = mod.wearer?.get_fire_loss() || 0 + .["loss_tox"] = mod.wearer?.get_tox_loss() || 0 + .["loss_oxy"] = mod.wearer?.get_oxy_loss() || 0 .["body_temperature"] = mod.wearer?.bodytemperature || 0 .["nutrition"] = mod.wearer?.nutrition || 0 if(display_dna) @@ -473,7 +476,7 @@ /obj/item/mod/module/flashlight/configure_edit(key, value) switch(key) if("light_color") - value = input(usr, "Pick new light color", "Flashlight Color") as color|null + value = tgui_color_picker(usr, "Pick new light color", "Flashlight Color") if(!value) return if(is_color_dark(value, 50)) @@ -827,12 +830,7 @@ ) /// Materials that will be extracted. var/list/accepted_mats - 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 + var/datum/material_container/container /obj/item/mod/module/recycler/Initialize(mapload) . = ..() @@ -840,31 +838,35 @@ if(!length(accepted_mats)) accepted_mats = SSmaterials.materials_by_category[MAT_CATEGORY_SILO] - container = AddComponent( \ - /datum/component/material_container, \ + container = new ( \ + src, \ 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) \ + COMSIG_MATCONTAINER_STACK_RETRIEVED = TYPE_PROC_REF(/obj/item/mod/module/recycler, InsertSheets) \ ) \ ) /obj/item/mod/module/recycler/Destroy() - container = null + QDEL_NULL(container) return ..() /obj/item/mod/module/recycler/on_activation(mob/activator) - 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(mob/activator, display_message, deleting = FALSE) - QDEL_NULL(connector) - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(on_wearer_moved)) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + if(mod.wearer.loc) + UnregisterSignal(mod.wearer.loc, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON)) /obj/item/mod/module/recycler/proc/on_wearer_moved(datum/source, atom/old_loc, dir, forced) SIGNAL_HANDLER - + if(old_loc) + UnregisterSignal(mod.wearer.loc, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON)) + if(mod.wearer.loc) + RegisterSignal(mod.wearer.loc, COMSIG_ATOM_ENTERED, PROC_REF(on_obj_entered)) + RegisterSignal(mod.wearer.loc, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(on_atom_initialized_on)) for(var/obj/item/item in mod.wearer.loc) if(!is_type_in_list(item, allowed_item_types)) return @@ -872,18 +874,14 @@ /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) + if(is_type_in_list(arrived, allowed_item_types)) + 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) + // Give the new atom the time to fully initialize and maybe live if the wearer moves away. + if(is_type_in_list(new_atom, allowed_item_types)) + 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) @@ -1045,25 +1043,3 @@ var/datum/effect_system/lightning_spread/sparks = new /datum/effect_system/lightning_spread sparks.set_up(number = 5, cardinals_only = TRUE, location = mod.wearer.loc) sparks.start() - -/obj/item/mod/module/hearing_protection - name = "MOD hearing protection module" - desc = "A module that protects the users ears from loud sounds" - complexity = 0 - removable = FALSE - incompatible_modules = list(/obj/item/mod/module/hearing_protection) - required_slots = list(ITEM_SLOT_HEAD) - -/obj/item/mod/module/hearing_protection/on_part_activation() - var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES) - if(istype(head_cover)) - head_cover.AddComponent(/datum/component/wearertargeting/earprotection) - var/datum/component/wearertargeting/earprotection/protection = head_cover.GetComponent(/datum/component/wearertargeting/earprotection) - protection.on_equip(src, mod.wearer, ITEM_SLOT_HEAD) - -/obj/item/mod/module/hearing_protection/on_part_deactivation(deleting = FALSE) - if(deleting) - return - var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES) - if(istype(head_cover)) - qdel(head_cover.GetComponent(/datum/component/wearertargeting/earprotection)) diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index 2e0b2dba3a0f..f047cbfce34d 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -226,7 +226,7 @@ /obj/item/mod/module/balloon/on_use(mob/activator) if(!do_after(mod.wearer, blowing_time, target = mod)) return FALSE - mod.wearer.adjustOxyLoss(oxygen_damage) + mod.wearer.adjust_oxy_loss(oxygen_damage) playsound(src, 'sound/items/modsuit/inflate_bloon.ogg', 50, TRUE) var/obj/item/balloon = new balloon_path(get_turf(src)) mod.wearer.put_in_hands(balloon) @@ -243,7 +243,7 @@ use_energy_cost = DEFAULT_CHARGE_DRAIN * 0.5 incompatible_modules = list(/obj/item/mod/module/paper_dispenser) cooldown_time = 5 SECONDS - required_slots = list(ITEM_SLOT_GLOVES) + required_slots = list(ITEM_SLOT_GLOVES|ITEM_SLOT_NECK) /// The total number of sheets created by this MOD. The more sheets, them more likely they set on fire. var/num_sheets_dispensed = 0 @@ -286,7 +286,7 @@ device = /obj/item/stamp/mod incompatible_modules = list(/obj/item/mod/module/stamp) cooldown_time = 0.5 SECONDS - required_slots = list(ITEM_SLOT_GLOVES) + required_slots = list(ITEM_SLOT_GLOVES|ITEM_SLOT_NECK) /obj/item/stamp/mod name = "MOD electronic stamp" @@ -317,10 +317,16 @@ var/you_fucked_up = FALSE /obj/item/mod/module/atrocinator/on_activation(mob/activator) + // Auto-unbuckle anyone being carried to avoid lag issues + if(length(mod.wearer.buckled_mobs)) + mod.wearer.visible_message("As [mod.wearer] flips, [mod.wearer.buckled_mobs[1]] flies off of [mod.wearer.p_their()] back!") + mod.wearer.unbuckle_all_mobs() + playsound(src, 'sound/effects/curse/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)) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_PREBUCKLE, PROC_REF(on_someone_buckled)) ADD_TRAIT(mod.wearer, TRAIT_SILENT_FOOTSTEPS, REF(src)) passtable_on(mod.wearer, REF(src)) check_upstairs() //todo at some point flip your screen around @@ -337,6 +343,7 @@ qdel(mod.wearer.RemoveElement(/datum/element/forced_gravity, NEGATIVE_GRAVITY)) UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) UnregisterSignal(mod.wearer, COMSIG_MOB_SAY) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_PREBUCKLE) step_count = 0 REMOVE_TRAIT(mod.wearer, TRAIT_SILENT_FOOTSTEPS, REF(src)) passtable_off(mod.wearer, REF(src)) @@ -350,6 +357,16 @@ if(you_fucked_up || mod.wearer.has_gravity() > NEGATIVE_GRAVITY) return + // Prevent infinite loops when being fireman carried - Stack trace if it does + if(mod.wearer.buckled) + stack_trace("Atrocinator user is buckled despite protections - this shouldn't happen!") + return + + // Prevent infinite loops when carrying someone - Stack trace if it does + if(length(mod.wearer.buckled_mobs)) + stack_trace("Atrocinator user is carrying someone despite protections - this shouldn't happen!") + return + var/turf/open/current_turf = get_turf(mod.wearer) var/turf/open/openspace/turf_above = get_step_multiz(mod.wearer, UP) if(current_turf && istype(turf_above)) @@ -384,6 +401,14 @@ SIGNAL_HANDLER speech_args[SPEECH_SPANS] |= "upside_down" +/// Prevent someone from being buckled to the wearer while atrocinator is active +/obj/item/mod/module/atrocinator/proc/on_someone_buckled(datum/source, mob/living/buckled_mob, mob/living/buckler) + SIGNAL_HANDLER + balloon_alert(buckler, "[buckler == mod.wearer ? "you're" : "they're"] upside down!") + return COMPONENT_BLOCK_BUCKLE + + + /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. \ diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index f71814fc7db5..16e3bbe9061e 100644 --- a/code/modules/mod/modules/modules_medical.dm +++ b/code/modules/mod/modules/modules_medical.dm @@ -28,10 +28,10 @@ . = ..() .["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 + .["loss_brute"] = mod.wearer?.get_brute_loss() || 0 + .["loss_fire"] = mod.wearer?.get_fire_loss() || 0 + .["loss_tox"] = mod.wearer?.get_tox_loss() || 0 + .["loss_oxy"] = mod.wearer?.get_oxy_loss() || 0 return . @@ -191,37 +191,26 @@ organ = null return ..() +/obj/projectile/organ/Exited(atom/movable/gone, direction) + . = ..() + if(gone == organ) + organ = null + /obj/projectile/organ/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() - if(!isliving(target)) + if(!isliving(target) || (organ.organ_flags & ORGAN_UNUSABLE)) organ.forceMove(drop_location()) - organ = null return - var/mob/living/carbon/human/organ_receiver = target - var/succeed = FALSE - if(organ_receiver.surgeries.len) - for(var/datum/surgery/organ_manipulation/procedure in organ_receiver.surgeries) - if(procedure.location != organ.zone) - continue - if(!ispath(procedure.steps[procedure.status], /datum/surgery_step/manipulate_organs)) - continue - succeed = TRUE - break - - if(!succeed) + var/mob/living/organ_receiver = target + // bodyparts actually *do* hit a specific bodypart, but random variance would make this projectile unusable + // so we just fake it, and assume the organ always hits the place it needs to go + var/obj/item/bodypart/fake_hit_part = organ_receiver.get_bodypart(length(organ.valid_zones) ? pick(organ.valid_zones) : deprecise_zone(organ.zone)) + if(!LIMB_HAS_SURGERY_STATE(fake_hit_part, SURGERY_SKIN_OPEN|SURGERY_ORGANS_CUT|SURGERY_BONE_SAWED)) organ.forceMove(drop_location()) - organ = null return - var/list/organs_to_boot_out = organ_receiver.get_organ_slot(organ.slot) - for(var/obj/item/organ/organ_evacced as anything in organs_to_boot_out) - if(organ_evacced.organ_flags & ORGAN_UNREMOVABLE) - continue - organ_evacced.Remove(target, special = TRUE) - organ_evacced.forceMove(get_turf(target)) - + // handles swapping any existing organ out for us organ.Insert(target) - organ = null ///Patrient Transport - Generates hardlight bags you can put people in. /obj/item/mod/module/criminalcapture/patienttransport @@ -402,26 +391,27 @@ /obj/item/surgical_processor/mod/preloaded loaded_surgeries = list( - /datum/surgery/advanced/pacify, - /datum/surgery/healing/combo/upgraded/femto, - /datum/surgery/advanced/brainwashing, - /datum/surgery/advanced/brainwashing/mechanic, - /datum/surgery/advanced/bioware/nerve_splicing, - /datum/surgery/advanced/bioware/nerve_splicing/mechanic, - /datum/surgery/advanced/bioware/nerve_grounding, - /datum/surgery/advanced/bioware/nerve_grounding/mechanic, - /datum/surgery/advanced/bioware/vein_threading, - /datum/surgery/advanced/bioware/vein_threading/mechanic, - /datum/surgery/advanced/bioware/muscled_veins, - /datum/surgery/advanced/bioware/muscled_veins/mechanic, - /datum/surgery/advanced/bioware/ligament_hook, - /datum/surgery/advanced/bioware/ligament_hook/mechanic, - /datum/surgery/advanced/bioware/ligament_reinforcement, - /datum/surgery/advanced/bioware/ligament_reinforcement/mechanic, - /datum/surgery/advanced/bioware/cortex_imprint, - /datum/surgery/advanced/bioware/cortex_imprint/mechanic, - /datum/surgery/advanced/bioware/cortex_folding, - /datum/surgery/advanced/bioware/cortex_folding/mechanic, + /datum/surgery_operation/basic/tend_wounds/combo/upgraded/master, + /datum/surgery_operation/limb/bioware/cortex_folding, + /datum/surgery_operation/limb/bioware/cortex_folding/mechanic, + /datum/surgery_operation/limb/bioware/cortex_imprint, + /datum/surgery_operation/limb/bioware/cortex_imprint/mechanic, + /datum/surgery_operation/limb/bioware/ligament_hook, + /datum/surgery_operation/limb/bioware/ligament_hook/mechanic, + /datum/surgery_operation/limb/bioware/ligament_reinforcement, + /datum/surgery_operation/limb/bioware/ligament_reinforcement/mechanic, + /datum/surgery_operation/limb/bioware/muscled_veins, + /datum/surgery_operation/limb/bioware/muscled_veins/mechanic, + /datum/surgery_operation/limb/bioware/nerve_grounding, + /datum/surgery_operation/limb/bioware/nerve_grounding/mechanic, + /datum/surgery_operation/limb/bioware/nerve_splicing, + /datum/surgery_operation/limb/bioware/nerve_splicing/mechanic, + /datum/surgery_operation/limb/bioware/vein_threading, + /datum/surgery_operation/limb/bioware/vein_threading/mechanic, + /datum/surgery_operation/organ/brainwash, + /datum/surgery_operation/organ/brainwash/mechanic, + /datum/surgery_operation/organ/pacify, + /datum/surgery_operation/organ/pacify/mechanic, ) /obj/item/mod/module/surgical_processor/emergency @@ -431,14 +421,6 @@ /obj/item/surgical_processor/mod/emergency loaded_surgeries = list( - /datum/surgery/healing/combo/upgraded/femto, - /datum/surgery/blood_filter, - /datum/surgery/brain_surgery, - /datum/surgery/coronary_bypass, - /datum/surgery/ear_surgery, - /datum/surgery/eye_surgery, - /datum/surgery/hepatectomy, - /datum/surgery/revival, - /datum/surgery/stomach_pump, - /datum/surgery/advanced/wing_reconstruction, + /datum/surgery_operation/basic/tend_wounds/combo/upgraded/master, + /datum/surgery_operation/organ/fix_wings, ) diff --git a/code/modules/mod/modules/modules_ninja.dm b/code/modules/mod/modules/modules_ninja.dm index e06745450049..3917e2a2c5d2 100644 --- a/code/modules/mod/modules/modules_ninja.dm +++ b/code/modules/mod/modules/modules_ninja.dm @@ -289,7 +289,7 @@ /obj/item/mod/module/emp_shield/pulse/on_use(mob/activator) playsound(src, 'sound/effects/empulse.ogg', 60, TRUE) - empulse(src, heavy_range = 4, light_range = 6) + empulse(src, heavy_range = 4, light_range = 6, emp_source = src) drain_power(use_energy_cost) /// Ninja Status Readout - Like the normal status display (see the base type), but with a clock. @@ -425,7 +425,7 @@ mod.wearer.say(pick_list_replacements(NINJA_FILE, "lines"), forced = type) to_chat(mod.wearer, span_notice("You have used the adrenaline boost.")) mod.wearer.SetAllImmobility(0) - mod.wearer.adjustStaminaLoss(-200) + mod.wearer.adjust_stamina_loss(-200) mod.wearer.remove_status_effect(/datum/status_effect/speech/stutter) mod.wearer.reagents.add_reagent(/datum/reagent/medicine/stimulants, 5) reagents.remove_reagent(reagent_required, reagents.total_volume * 0.75) diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index 4cacbddb811c..a519651ce816 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -303,8 +303,8 @@ . = ..() do_sparks(rand(3, 6), FALSE, src) if(thrower) - var/mob/living/simple_animal/hostile/illusion/mirage/mirage = new(get_turf(src)) - mirage.Copy_Parent(thrower, 15 SECONDS) + var/mob/living/basic/illusion/mirage/mirage = new(get_turf(src)) + mirage.mock_as(thrower, 15 SECONDS) qdel(src) ///Projectile Dampener - Weakens projectiles in range. diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index 9ca53939fb2a..c40e3552bce4 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -109,3 +109,18 @@ var/refill_add = min(volume - reagents.total_volume, 2 * seconds_per_tick) if(refill_add > 0) reagents.add_reagent(/datum/reagent/space_cleaner, refill_add) + +/obj/item/mod/module/selfcleaner + name = "MOD perfumer module" + desc = "A small spray to clean oneself up. Has a pleasant scent." + icon_state = "cleaner" + module_type = MODULE_USABLE + use_energy_cost = DEFAULT_CHARGE_DRAIN * 5 + complexity = 1 + incompatible_modules = list(/obj/item/mod/module/selfcleaner) + cooldown_time = 10 SECONDS + +/obj/item/mod/module/selfcleaner/on_use(mob/activator) + activator.wash(CLEAN_WASH) + drain_power(use_energy_cost) + playsound(activator, 'sound/effects/spray.ogg', 50, FALSE) diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 5fe7529f270f..0ebd99635ae4 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -241,19 +241,36 @@ cooldown_time = 0.5 SECONDS allow_flags = MODULE_ALLOW_INACTIVE required_slots = list(ITEM_SLOT_BACK) + /// Are we currently dropping off ores? Used to prevent the bag from instantly picking up ores after dropping them + var/dropping_ores = FALSE /obj/item/mod/module/orebag/on_equip() - RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(ore_pickup)) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(on_wearer_moved)) + if (mod.wearer.loc) + RegisterSignal(mod.wearer.loc, COMSIG_ATOM_ENTERED, PROC_REF(on_obj_entered)) + RegisterSignal(mod.wearer.loc, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(on_atom_initialized_on)) /obj/item/mod/module/orebag/on_unequip() UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + if (mod.wearer.loc) + UnregisterSignal(mod.wearer.loc, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON)) -/obj/item/mod/module/orebag/proc/ore_pickup(atom/movable/source, atom/old_loc, dir, forced) +/obj/item/mod/module/orebag/proc/on_wearer_moved(atom/movable/source, atom/old_loc, dir, forced) SIGNAL_HANDLER + if(old_loc) + UnregisterSignal(old_loc, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON)) + if(mod.wearer.loc) + RegisterSignal(mod.wearer.loc, COMSIG_ATOM_ENTERED, PROC_REF(on_obj_entered)) + RegisterSignal(mod.wearer.loc, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(on_atom_initialized_on)) + + var/ore_found = FALSE for(var/obj/item/stack/ore/ore in get_turf(mod.wearer)) + ore_found = TRUE INVOKE_ASYNC(src, PROC_REF(move_ore), ore) - playsound(src, SFX_RUSTLE, 50, TRUE) + + if (ore_found) + playsound(mod.wearer, SFX_RUSTLE, 50, TRUE) /obj/item/mod/module/orebag/proc/move_ore(obj/item/stack/ore) for(var/obj/item/stack/ore/stored_ore as anything in src) @@ -265,10 +282,24 @@ ore.forceMove(src) /obj/item/mod/module/orebag/on_use(mob/activator) + dropping_ores = TRUE for(var/obj/item/ore as anything in src) ore.forceMove(mod.drop_location()) + dropping_ores = FALSE drain_power(use_energy_cost) +/obj/item/mod/module/orebag/proc/on_obj_entered(atom/new_loc, atom/movable/arrived, atom/old_loc) + SIGNAL_HANDLER + if(istype(arrived, /obj/item/stack/ore) && !dropping_ores && old_loc != mod.wearer) + INVOKE_ASYNC(src, PROC_REF(move_ore), arrived) + playsound(mod.wearer, SFX_RUSTLE, 50, TRUE) + +/obj/item/mod/module/orebag/proc/on_atom_initialized_on(atom/loc, atom/new_atom) + SIGNAL_HANDLER + if(is_type_in_list(new_atom, /obj/item/stack/ore)) + INVOKE_ASYNC(src, PROC_REF(move_ore), new_atom) + playsound(mod.wearer, SFX_RUSTLE, 50, TRUE) + /obj/item/mod/module/hydraulic name = "MOD loader hydraulic arms module" desc = "A pair of powerful hydraulic arms installed in a MODsuit." diff --git a/code/modules/mod/modules/modules_timeline.dm b/code/modules/mod/modules/modules_timeline.dm index 0a18a5598302..3bc992ecfe68 100644 --- a/code/modules/mod/modules/modules_timeline.dm +++ b/code/modules/mod/modules/modules_timeline.dm @@ -172,7 +172,7 @@ //phasing out mod.visible_message(span_warning("[mod.wearer] leaps out of the timeline!")) mod.wearer.SetAllImmobility(0) - mod.wearer.setStaminaLoss(0) + mod.wearer.set_stamina_loss(0) phased_mob = new(get_turf(mod.wearer.loc), mod.wearer) RegisterSignal(mod, COMSIG_MOD_ACTIVATE, PROC_REF(on_activate_block)) else @@ -401,15 +401,15 @@ timetokill += seconds_per_tick -/obj/structure/chrono_field/bullet_act(obj/projectile/projectile) - if(istype(projectile, /obj/projectile/energy/chrono_beam)) - var/obj/projectile/energy/chrono_beam/beam = projectile - var/obj/item/mod/module/tem/linked_tem = beam.tem_weakref.resolve() - if(linked_tem && istype(linked_tem)) - linked_tem.field_connect(src) - return BULLET_ACT_HIT +/obj/structure/chrono_field/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) + if(!istype(hitting_projectile, /obj/projectile/energy/chrono_beam)) + return ..() - return ..() + var/obj/projectile/energy/chrono_beam/beam = hitting_projectile + var/obj/item/mod/module/tem/linked_tem = beam.tem_weakref.resolve() + if(linked_tem && istype(linked_tem)) + linked_tem.field_connect(src) + return BULLET_ACT_HIT /obj/structure/chrono_field/assume_air() return FALSE diff --git a/code/modules/mod/modules/modules_visor.dm b/code/modules/mod/modules/modules_visor.dm index c865cc3e6703..443db90c51c7 100644 --- a/code/modules/mod/modules/modules_visor.dm +++ b/code/modules/mod/modules/modules_visor.dm @@ -92,9 +92,9 @@ required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_EYES|ITEM_SLOT_MASK) /obj/item/mod/module/night/on_activation(mob/activator) - mod.wearer.add_traits(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src)) + ADD_TRAIT(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src)) mod.wearer.update_sight() /obj/item/mod/module/night/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) - mod.wearer.remove_traits(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src)) + REMOVE_TRAIT(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src)) mod.wearer.update_sight() diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 011484b5bb96..8fd0fbcf70e1 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -149,6 +149,7 @@ if(internal_cell) internal_cell = new internal_cell(src) + AddElement(/datum/element/drag_to_activate) install_default_programs() register_context() update_appearance() @@ -398,10 +399,6 @@ update_appearance() return TRUE -/obj/item/modular_computer/mouse_drop_dragged(atom/over_object, mob/user) - if(!istype(over_object, /atom/movable/screen)) - return attack_self(user) - /obj/item/modular_computer/attack_ai(mob/user) return attack_self(user) diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index 16a0a5915ffa..bd2214630175 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -176,7 +176,7 @@ var/mob/user = usr var/new_color while(!new_color) - new_color = input(user, "Choose a new color for [src]'s flashlight.", "Light Color",light_color) as color|null + new_color = tgui_color_picker(user, "Choose a new color for [src]'s flashlight.", "Light Color",light_color) if(!new_color) return if(is_color_dark(new_color, 50) ) //Colors too dark are rejected diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index a33ae21f9fd5..2ae9e794b573 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -29,6 +29,7 @@ if(start_open && !screen_on) toggle_open() RegisterSignal(src, COMSIG_SPEED_POTION_APPLIED, PROC_REF(on_speed_potioned)) + AddElement(/datum/element/drag_pickup) /obj/item/modular_computer/laptop/examine(mob/user) . = ..() @@ -76,16 +77,6 @@ try_toggle_open(usr) -/obj/item/modular_computer/laptop/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params) - if(over_object == user || over_object == src) - try_toggle_open(user) - return - if(istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/H = over_object - if(!isturf(loc)) - return - user.put_in_hand(src, H.held_index) - /obj/item/modular_computer/laptop/proc/try_toggle_open(mob/living/user) if(issilicon(user)) return diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm index 0946903ee17c..25ef899febb3 100644 --- a/code/modules/modular_computers/computers/item/pda.dm +++ b/code/modules/modular_computers/computers/item/pda.dm @@ -31,6 +31,9 @@ shell_capacity = SHELL_CAPACITY_SMALL action_slots = ALL + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP ///The item currently inserted into the PDA, starts with a pen. var/obj/item/inserted_item = /obj/item/pen 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 43341cfbc16a..87f18a285d44 100644 --- a/code/modules/modular_computers/computers/item/role_tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/role_tablet_presets.dm @@ -133,6 +133,7 @@ starting_programs = list( /datum/computer_file/program/records/security, /datum/computer_file/program/robocontrol, + /datum/computer_file/program/budgetorders, ) /** @@ -259,6 +260,7 @@ greyscale_colors = "#927444#8b4c31#4c202d" starting_programs = list( /datum/computer_file/program/skill_tracker, + /datum/computer_file/program/raptordex, ) /obj/item/modular_computer/pda/bitrunner diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index 3db25e625175..fa34a1866bcc 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -120,7 +120,7 @@ cpu.idle_threads += chatprogram var/datum/computer_file/program/department_order/orderprogram = cpu.find_file_by_name("dept_order") - orderprogram.set_linked_department(department_type) + //orderprogram.set_linked_department(department_type) // DARKPACK EDIT REMOVAL cpu.active_program = orderprogram update_appearance(UPDATE_ICON) diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 00411f280d2e..33199c8a92f0 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -10,6 +10,7 @@ density = TRUE max_integrity = 300 integrity_failure = 0.5 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 10) ///A flag that describes this device type var/hardware_flag = PROGRAM_CONSOLE @@ -201,7 +202,7 @@ // "Stun" weapons can cause minor damage to components (short-circuits?) // "Burn" damage is equally strong against internal components and exterior casing // "Brute" damage mostly damages the casing. -/obj/machinery/modular_computer/bullet_act(obj/projectile/proj) - return cpu?.projectile_hit(proj) || ..() +/obj/machinery/modular_computer/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) + return cpu?.projectile_hit(hitting_projectile, def_zone, piercing_hit, blocked) || ..() #undef CPU_INTERACTABLE diff --git a/code/modules/modular_computers/file_system/programs/airestorer.dm b/code/modules/modular_computers/file_system/programs/airestorer.dm index 0fe930cfd072..ced3798ef6fc 100644 --- a/code/modules/modular_computers/file_system/programs/airestorer.dm +++ b/code/modules/modular_computers/file_system/programs/airestorer.dm @@ -41,9 +41,9 @@ if(stored_card.flush) restoring = FALSE return - A.adjustOxyLoss(-5, FALSE) - A.adjustFireLoss(-5, FALSE) - A.adjustBruteLoss(-5, FALSE) + A.adjust_oxy_loss(-5, FALSE) + A.adjust_fire_loss(-5, FALSE) + A.adjust_brute_loss(-5, FALSE) // Please don't forget to update health, otherwise the below if statements will probably always fail. A.updatehealth() diff --git a/code/modules/modular_computers/file_system/programs/betting.dm b/code/modules/modular_computers/file_system/programs/betting.dm index d368d15e8e70..4da793ba317b 100644 --- a/code/modules/modular_computers/file_system/programs/betting.dm +++ b/code/modules/modular_computers/file_system/programs/betting.dm @@ -170,7 +170,7 @@ GLOBAL_LIST_EMPTY_TYPED(active_bets, /datum/active_bet) for(var/option in options) if(!length(options[option])) options[option] = list() - advertise_bet() + // advertise_bet() // DARKPACK EDIT REMOVAL /datum/active_bet/Destroy(force) GLOB.active_bets -= src @@ -220,7 +220,7 @@ GLOBAL_LIST_EMPTY_TYPED(active_bets, /datum/active_bet) refunded_account.adjust_money(text2num(existing_bets[2]), "Refund: [name] gamble cancelled.") return - reply_to_feed(winning_option) + // reply_to_feed(winning_option) // DARKPACK EDIT REMOVAL var/list/winners = options[winning_option] if(!length(winners)) return @@ -234,7 +234,7 @@ GLOBAL_LIST_EMPTY_TYPED(active_bets, /datum/active_bet) //they only made their money back, don't tell them they won anything. if((money_won - text2num(winner[2])) == 0) continue - winner_account.bank_card_talk("You won [money_won]cr from having a correct guess on [name]!") + winner_account.bank_card_talk("You won [money_won][MONEY_SYMBOL] from having a correct guess on [name]!") ///Puts a bank account's money bet on a given option. /datum/active_bet/proc/bet_money(datum/bank_account/better, money_betting, option_betting) @@ -255,7 +255,7 @@ GLOBAL_LIST_EMPTY_TYPED(active_bets, /datum/active_bet) if(!better.adjust_money(-money_adding_in, "Gambling on [name].")) return total_amount_bet += money_adding_in - better.bank_card_talk("Additional [money_adding_in]cr deducted for your bet on [name].") + better.bank_card_talk("Additional [money_adding_in][MONEY_SYMBOL] deducted for your bet on [name].") existing_bets[2] = "[money_betting]" return //taking it all out, we remove them from the list so they aren't a winner with bets of 0. @@ -267,18 +267,20 @@ GLOBAL_LIST_EMPTY_TYPED(active_bets, /datum/active_bet) return //taking money out if(text2num(existing_bets[2]) > money_betting) + if(money_betting < 0) + return var/money_taking_out = text2num(existing_bets[2]) - money_betting total_amount_bet -= money_taking_out - better.bank_card_talk("Refunded [money_taking_out]cr for taking money out of your bet on [name].") + better.bank_card_talk("Refunded [money_taking_out][MONEY_SYMBOL] for taking money out of your bet on [name].") better.adjust_money(money_taking_out, "Refund from gambling on [name].") existing_bets[2] = "[money_betting]" return - if(!better.adjust_money(-money_betting, "Gambling on [name]")) + if(money_betting <= 0 || !better.adjust_money(-money_betting, "Gambling on [name]")) return total_amount_bet += money_betting options[option_betting] += list(list(better, "[money_betting]")) - better.bank_card_talk("Deducted [money_betting]cr for your bet on [name].") + better.bank_card_talk("Deducted [money_betting][MONEY_SYMBOL] for your bet on [name].") ///Cancels your bet, removing your bet and refunding your money. /datum/active_bet/proc/cancel_bet(datum/bank_account/better) @@ -287,7 +289,7 @@ GLOBAL_LIST_EMPTY_TYPED(active_bets, /datum/active_bet) if(existing_bets[1] == better) var/money_refunding = text2num(existing_bets[2]) total_amount_bet -= money_refunding - better.bank_card_talk("Refunded [money_refunding]cr for cancelling your bet on [name].") + better.bank_card_talk("Refunded [money_refunding][MONEY_SYMBOL] for cancelling your bet on [name].") better.adjust_money(money_refunding, "Refunded: changed bet for [name].") options[option] -= list(existing_bets) 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 1b1320544731..37e9ddd7121c 100644 --- a/code/modules/modular_computers/file_system/programs/bounty_board.dm +++ b/code/modules/modular_computers/file_system/programs/bounty_board.dm @@ -102,7 +102,7 @@ playsound(computer, 'sound/machines/buzz/buzz-sigh.ogg', 30, TRUE) return request_target.transfer_money(current_user, active_request.value, "Bounties: Request Completed") - computer.say("Paid out [active_request.value] credits.") + computer.say("Paid out [active_request.value] [MONEY_NAME].") GLOB.request_list.Remove(active_request) return TRUE if("clear") diff --git a/code/modules/modular_computers/file_system/programs/budgetordering.dm b/code/modules/modular_computers/file_system/programs/budgetordering.dm index 38bfb3647449..f17a6337380d 100644 --- a/code/modules/modular_computers/file_system/programs/budgetordering.dm +++ b/code/modules/modular_computers/file_system/programs/budgetordering.dm @@ -1,9 +1,9 @@ /datum/computer_file/program/budgetorders filename = "orderapp" - filedesc = "NT IRN" + filedesc = "NT Shopping Network" downloader_category = PROGRAM_CATEGORY_SUPPLY program_open_overlay = "request" - extended_desc = "Nanotrasen Internal Requisition Network interface for supply purchasing using a department budget account." + extended_desc = "Nanotrasen Shopping Network interface for purchasing supplies from the cargo catalogue using a department budget account." program_flags = PROGRAM_ON_NTNET_STORE | PROGRAM_REQUIRES_NTNET can_run_on_flags = PROGRAM_LAPTOP | PROGRAM_PDA size = 10 @@ -62,37 +62,43 @@ var/list/data = list() data["location"] = SSshuttle.supply.getStatusText() data["department"] = "Cargo" + var/datum/bank_account/buyer = SSeconomy.get_dep_account(cargo_account) var/obj/item/card/id/id_card = computer.stored_id?.GetID() if(id_card?.registered_account) - if((ACCESS_COMMAND in id_card.access)) + buyer = SSeconomy.get_dep_account(id_card?.registered_account.account_job.paycheck_department) + if((ACCESS_BUDGET in id_card.access)) requestonly = FALSE - buyer = SSeconomy.get_dep_account(id_card.registered_account.account_job.paycheck_department) can_approve_requests = TRUE + // If buyer is a departmental budget, replaces "Cargo" with that budget - we're not using the cargo budget here + data["department"] = "[buyer.account_holder] Requisitions" else requestonly = TRUE can_approve_requests = FALSE - if(ACCESS_COMMAND in id_card.access) - // If buyer is a departmental budget, replaces "Cargo" with that budget - we're not using the cargo budget here - data["department"] = addtext(buyer.account_holder, " Requisitions") else requestonly = TRUE if(buyer) data["points"] = buyer.account_balance + // To recap above because it's kind of a mess, here's all the options: + //Head of staff ID card: Can approve, buy, and make purchases using their own departmental budgets. + //ID card, not a head of staff: can request items from cargo using departmental budget. + //No ID card, can request items from cargo using the cargo budget. //Otherwise static data, that is being applied in ui_data as the crates visible and buyable are not static, and are determined by inserted ID. data["requestonly"] = requestonly data["supplies"] = list() for(var/pack in SSshuttle.supply_packs) var/datum/supply_pack/P = SSshuttle.supply_packs[pack] - if(!is_visible_pack(user, P.access_view , null, P.contraband) || P.hidden) + if(P.order_flags & ORDER_INVISIBLE) + continue + if(!is_visible_pack(user, P.access_view , null, (P.order_flags & ORDER_CONTRABAND)) || (P.order_flags & ORDER_EMAG_ONLY)) continue if(!data["supplies"][P.group]) data["supplies"][P.group] = list( "name" = P.group, "packs" = list() ) - if((P.hidden && (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.drop_pod_only)) + if(((P.order_flags & ORDER_EMAG_ONLY) && ((P.order_flags & ORDER_CONTRABAND) && !contraband) || ((P.order_flags & ORDER_SPECIAL) && !(P.order_flags & ORDER_SPECIAL_ENABLED)) || (P.order_flags & ORDER_POD_ONLY))) continue var/obj/item/first_item = length(P.contains) > 0 ? P.contains[1] : null @@ -103,7 +109,7 @@ "desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name. "first_item_icon" = first_item?.icon, "first_item_icon_state" = first_item?.icon_state, - "goody" = P.goody, + "goody" = P.order_flags & ORDER_GOODY, "access" = P.access, "contains" = P.get_contents_ui_data(), )) @@ -123,11 +129,9 @@ 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) @@ -143,26 +147,26 @@ "id" = order.id, "amount" = 1, "orderer" = order.orderer, - "paid" = !isnull(order.paying_account) ? 1 : 0, //number of orders purchased privatly - "dep_order" = order.department_destination ? 1 : 0, //number of orders purchased by a department + "paid" = !isnull(order.paying_account), //number of orders purchased privatly + "dep_order" = !!order.department_destination, //number of orders purchased by a department "can_be_cancelled" = order.can_be_cancelled, )) data["cart"] = list() for(var/item_id in cart_list) data["cart"] += cart_list[item_id] + data["requests"] = 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" = pack.name, "cost" = pack.get_cost(), "orderer" = order.orderer, "reason" = order.reason, - "id" = order.id + "id" = order.id, + "account" = order.paying_account ? order.paying_account.account_holder : "Cargo Department" )) - data["amount_by_name"] = amount_by_name return data @@ -173,6 +177,7 @@ /datum/computer_file/program/budgetorders/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) . = ..() + var/mob/user = ui.user switch(action) if("send") if(!SSshuttle.supply.canMove()) @@ -184,9 +189,9 @@ if(SSshuttle.supply.getDockedId() == docking_home) SSshuttle.moveShuttle(cargo_shuttle, docking_away, TRUE) computer.say("The supply shuttle is departing.") - usr.investigate_log("sent the supply shuttle away.", INVESTIGATE_CARGO) + user.investigate_log("sent the supply shuttle away.", INVESTIGATE_CARGO) else - usr.investigate_log("called the supply shuttle.", INVESTIGATE_CARGO) + user.investigate_log("called the supply shuttle.", INVESTIGATE_CARGO) computer.say("The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minute\s.") SSshuttle.moveShuttle(cargo_shuttle, docking_home, TRUE) . = TRUE @@ -205,50 +210,66 @@ else SSshuttle.shuttle_loan.loan_shuttle() computer.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) + user.investigate_log("accepted a shuttle loan event.", INVESTIGATE_CARGO) + user.log_message("accepted a shuttle loan event.", LOG_GAME) . = TRUE if("add") var/id = text2path(params["id"]) var/datum/supply_pack/pack = SSshuttle.supply_packs[id] if(!istype(pack)) return - if(pack.hidden || pack.contraband || pack.drop_pod_only || (pack.special && !pack.special_enabled)) + if((pack.order_flags & (ORDER_EMAG_ONLY | ORDER_POD_ONLY | ORDER_CONTRABAND)) || ((pack.order_flags & ORDER_SPECIAL) && !(pack.order_flags & ORDER_SPECIAL_ENABLED))) return var/name = "*None Provided*" var/rank = "*None Provided*" - var/ckey = usr.ckey - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - name = H.get_authentification_name() - rank = H.get_assignment(hand_first = TRUE) - else if(issilicon(usr)) - name = usr.real_name + var/ckey = user.ckey + var/mob/living/carbon/human/hwoman + if(ishuman(user)) + hwoman = user + rank = hwoman.get_assignment(hand_first = TRUE) + else if(issilicon(user)) + name = user.real_name rank = "Silicon" + // Our account that we want to end up paying with. var/datum/bank_account/account + // Our ID card that we want to pull from for identification. Modifies either name, account, or neither depending on function. + var/obj/item/card/id/id_card_customer = computer.stored_id?.GetID() + if(!id_card_customer) + id_card_customer = hwoman?.get_idcard(TRUE) //Grab from hands/mob if there's no id_card slot to prioritize. + name = id_card_customer?.registered_account.account_holder + if(self_paid) - var/mob/living/carbon/human/H = usr - var/obj/item/card/id/id_card = H.get_idcard(TRUE) - if(!istype(id_card)) + if(!istype(id_card_customer)) computer.say("No ID card detected.") return - if(IS_DEPARTMENTAL_CARD(id_card)) - computer.say("[id_card] cannot be used to make purchases.") + if(IS_DEPARTMENTAL_CARD(id_card_customer)) + computer.say("[id_card_customer] cannot be used to make purchases.") return - account = id_card.registered_account + account = id_card_customer.registered_account + name = id_card_customer.registered_account.account_holder if(!istype(account)) computer.say("Invalid bank account.") return var/reason = "" + var/datum/bank_account/personal_department if((requestonly && !self_paid) || !(computer.stored_id?.GetID())) - reason = tgui_input_text(usr, "Reason", name, max_length = MAX_MESSAGE_LEN) + reason = tgui_input_text(user, "Reason", name, max_length = MAX_MESSAGE_LEN) if(isnull(reason) || ..()) return - if(pack.goody && !self_paid) + if(id_card_customer?.registered_account?.account_job && !self_paid) //Find a budget to pull from + personal_department = SSeconomy.get_dep_account(id_card_customer.registered_account.account_job.paycheck_department) + if(!(personal_department.account_holder == "Cargo Budget")) + var/dept_choice = tgui_alert(user, "Which department are you requesting this for?", "Choose request department", list("Cargo Budget", "[personal_department.account_holder]")) + if(!dept_choice) + return + if(dept_choice == "Cargo Budget") + personal_department = null + + if((pack.order_flags & ORDER_GOODY) && !self_paid) playsound(computer, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) computer.say("ERROR: Small crates may only be purchased by private accounts.") return @@ -258,9 +279,8 @@ 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.stored_id?.GetID() - account = SSeconomy.get_dep_account(id_card?.registered_account?.account_job.paycheck_department) + if(!self_paid) + account = personal_department var/turf/T = get_turf(computer) var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account) @@ -271,6 +291,7 @@ SSshuttle.shopping_list += SO if(self_paid) computer.say("Order processed. The price will be charged to [account.account_holder]'s bank account on delivery.") + playsound(computer, 'sound/effects/coin2.ogg', 40, TRUE) . = TRUE if("remove") var/id = text2num(params["id"]) diff --git a/code/modules/modular_computers/file_system/programs/dept_order.dm b/code/modules/modular_computers/file_system/programs/dept_order.dm index e640d5ecb371..5dd38288efbd 100644 --- a/code/modules/modular_computers/file_system/programs/dept_order.dm +++ b/code/modules/modular_computers/file_system/programs/dept_order.dm @@ -105,13 +105,11 @@ GLOBAL_VAR(department_cd_override) /// Checks if we can "see" the passed supply pack /datum/computer_file/program/department_order/proc/can_see_pack(datum/supply_pack/to_check) PROTECTED_PROC(TRUE) - if(to_check.hidden && !(computer.obj_flags & EMAGGED)) + if((to_check.order_flags & ORDER_EMAG_ONLY) && !(computer.obj_flags & EMAGGED)) return FALSE - if(to_check.special && !to_check.special_enabled) + if((to_check.order_flags & ORDER_SPECIAL) && !(to_check.order_flags & ORDER_SPECIAL_ENABLED)) return FALSE - if(to_check.drop_pod_only) - return FALSE - if(to_check.goody) + if(to_check.order_flags & (ORDER_INVISIBLE | ORDER_POD_ONLY | ORDER_GOODY | ORDER_NOT_DEPARTMENTAL)) return FALSE return TRUE @@ -149,7 +147,7 @@ GLOBAL_VAR(department_cd_override) else computer.physical.balloon_alert(orderer, "linked") playsound(computer, 'sound/machines/ping.ogg', 30, TRUE) - set_linked_department(new_dept_type) + //set_linked_department(new_dept_type) // DARKPACK EDIT REMOVAL return TRUE if(isnull(linked_department)) @@ -266,7 +264,7 @@ GLOBAL_VAR(department_cd_override) return FALSE /datum/aas_config_entry/department_orders - name = "Departmental Order Announcement" + name = "Departmental: Order Announcement" announcement_lines_map = list( "Order Placed" = "A department order has been placed by %PERSON for %ORDER.", "Cooldown Reset" = "Department order cooldown has expired! A new order may now be placed!", diff --git a/code/modules/modular_computers/file_system/programs/frontier.dm b/code/modules/modular_computers/file_system/programs/frontier.dm index 9df0e2d91601..34bcbca8027f 100644 --- a/code/modules/modular_computers/file_system/programs/frontier.dm +++ b/code/modules/modular_computers/file_system/programs/frontier.dm @@ -155,7 +155,8 @@ else data["relations"][partner.type] = "Undefined" data["purchaseableBoosts"][partner.type] = list() - for(var/node_id in linked_techweb.get_available_nodes()) + var/displayable_nodes = linked_techweb.get_available_nodes() + linked_techweb.get_researched_nodes() + for(var/node_id in displayable_nodes) // Not from our partner if(!(node_id in partner.boostable_nodes)) continue @@ -218,8 +219,9 @@ var/datum/scientific_partner/partner = locate(text2path(params["boost_seller"])) in SSresearch.scientific_partners var/datum/techweb_node/node = SSresearch.techweb_node_by_id(params["purchased_boost"]) if(partner && node) - if(partner.purchase_boost(linked_techweb, node)) - computer.say("Purchase successful.") + var/possible_boost = partner.purchase_boost(linked_techweb, node) + if(possible_boost) + computer.say("Purchase successful[possible_boost == SCIPAPER_ALREADY_BOUGHT ? ", refunding [partner.boostable_nodes[params["purchased_boost"]]] points" : ""].") playsound(computer, 'sound/machines/ping.ogg', 25) return TRUE playsound(computer, 'sound/machines/terminal/terminal_error.ogg', 25) diff --git a/code/modules/modular_computers/file_system/programs/maintenance/camera.dm b/code/modules/modular_computers/file_system/programs/maintenance/camera.dm index b7934c9c0b3e..bb5641ef9ba9 100644 --- a/code/modules/modular_computers/file_system/programs/maintenance/camera.dm +++ b/code/modules/modular_computers/file_system/programs/maintenance/camera.dm @@ -27,22 +27,30 @@ . = ..() internal_camera = new(computer) internal_camera.print_picture_on_snap = FALSE + RegisterSignal(internal_camera, COMSIG_CAMERA_IMAGE_CAPTURED, PROC_REF(save_picture)) /datum/computer_file/program/maintenance/camera/Destroy() - if(internal_camera) - QDEL_NULL(internal_camera) - if(internal_picture) - QDEL_NULL(internal_picture) + QDEL_NULL(internal_camera) + QDEL_NULL(internal_picture) return ..() /datum/computer_file/program/maintenance/camera/tap(atom/tapped_atom, mob/living/user, list/modifiers) . = ..() - if(internal_picture) - QDEL_NULL(internal_picture) + + QDEL_NULL(internal_picture) + if(internal_camera.blending) + user.balloon_alert(user, "still blending!") + return + var/turf/our_turf = get_turf(tapped_atom) var/spooky_camera = locate(/datum/computer_file/program/maintenance/spectre_meter) in computer.stored_files internal_camera.see_ghosts = spooky_camera ? CAMERA_SEE_GHOSTS_BASIC : CAMERA_NO_GHOSTS - internal_picture = internal_camera.captureimage(our_turf, user, internal_camera.picture_size_x + 1, internal_camera.picture_size_y + 1) + INVOKE_ASYNC(internal_camera, TYPE_PROC_REF(/obj/item/camera, captureimage), our_turf, user, internal_camera.picture_size_x + 1, internal_camera.picture_size_y + 1) + +/datum/computer_file/program/maintenance/camera/proc/save_picture(cam, target, user, datum/picture/picture) + SIGNAL_HANDLER + + internal_picture = picture picture_number++ computer.save_photo(internal_picture.picture_image) @@ -62,7 +70,7 @@ switch(action) if("print_photo") if(computer.stored_paper <= 0) - to_chat(usr, span_notice("Hardware error: Printer out of paper.")) + to_chat(ui.user, span_notice("Hardware error: Printer out of paper.")) return internal_camera.printpicture(usr, internal_picture) computer.stored_paper-- 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 index 203261419220..027782f9f476 100644 --- a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm +++ b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm @@ -598,6 +598,13 @@ for(var/datum/computer_file/program/messenger/messenger as anything in targets) stringified_targets += get_messenger_name(messenger) + var/sent_prob = 0 + if(ishuman(source)) + var/mob/living/carbon/human/oldie = source + sent_prob = (0.025 * oldie.age) ** 3 // 25 y/o = ~0.25% chance, 85 y/o = ~10% chance + if (computer && prob(sent_prob)) + message = "[message] [computer.get_messenger_ending()]" + var/datum/signal/subspace/messaging/tablet_message/signal = new(computer, list( "ref" = REF(src), "message" = message, @@ -723,6 +730,7 @@ 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) ..() 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 7fcb42f567c8..19f3c7bb1986 100644 --- a/code/modules/modular_computers/file_system/programs/nt_pay.dm +++ b/code/modules/modular_computers/file_system/programs/nt_pay.dm @@ -60,6 +60,11 @@ SEND_SIGNAL(computer, COMSIG_MODULAR_COMPUTER_NT_PAY_RESULT, payment_result) /datum/computer_file/program/nt_pay/proc/_pay(token, money_to_send, mob/user) + var/area/user_area = get_area(user) + if(user_area && is_area_virtual(user_area)) + to_chat(user, span_notice("You cannot send virtual money to real accounts.")) + return NT_PAY_STATUS_NO_ACCOUNT + money_to_send = round(money_to_send) if(IS_DEPARTMENTAL_ACCOUNT(current_user)) @@ -78,7 +83,7 @@ return NT_PAY_STATUS_INVALID_MONEY if(token == current_user.pay_token) if(user) - to_chat(user, span_notice("You can't send credits to yourself.")) + to_chat(user, span_notice("You can't send [MONEY_NAME] to yourself.")) return NT_PAY_SATUS_SENDER_IS_RECEIVER for(var/account in SSeconomy.bank_accounts_by_id) @@ -95,12 +100,12 @@ current_user.bank_card_talk("You cannot afford it.") return NT_PAY_STATUS_INVALID_MONEY - recipient.bank_card_talk("You received [money_to_send] credit(s). Reason: transfer from [current_user.account_holder]") + recipient.bank_card_talk("You received [money_to_send] [MONEY_NAME](s). Reason: transfer from [current_user.account_holder]") recipient.transfer_money(current_user, money_to_send) for(var/obj/item/card/id/id_card as anything in recipient.bank_cards) SEND_SIGNAL(id_card, COMSIG_ID_CARD_NTPAY_MONEY_RECEIVED, computer, money_to_send) - current_user.bank_card_talk("You send [money_to_send] credit(s) to [recipient.account_holder]. Now you have [current_user.account_balance] credit(s)") + current_user.bank_card_talk("You send [money_to_send] [MONEY_NAME](s) to [recipient.account_holder]. Now you have [current_user.account_balance] [MONEY_NAME](s)") return NT_PAY_STATUS_SUCCESS diff --git a/code/modules/modular_computers/file_system/programs/raptordex.dm b/code/modules/modular_computers/file_system/programs/raptordex.dm new file mode 100644 index 000000000000..d26151f9c295 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/raptordex.dm @@ -0,0 +1,61 @@ +/datum/computer_file/program/raptordex + filename = "raptordex" + filedesc = "RaptorDex" + downloader_category = PROGRAM_CATEGORY_DEVICE + program_open_overlay = "bountyboard" + extended_desc = "Scan and analyze raptor genes." + size = 2 + tgui_id = "NtosRaptorDex" + program_icon = "crow" + can_run_on_flags = PROGRAM_PDA + /// Raptor scan data we have stored + var/list/scan_data = list("raptor_scan" = FALSE) + +/datum/computer_file/program/raptordex/tap(atom/tapped_atom, mob/living/user, list/modifiers) + if(!istype(tapped_atom, /mob/living/basic/raptor)) + return FALSE + + var/mob/living/basic/raptor/my_raptor = tapped_atom + var/datum/movespeed_modifier/intent_mod = my_raptor.get_move_intent_slowdown() + + scan_data = list() + scan_data["raptor_scan"] = TRUE + scan_data["raptor_image"] = icon2base64(icon(icon = my_raptor.icon, icon_state = my_raptor.icon_state, dir = SOUTH, frame = 1)) + scan_data["raptor_attack"] = my_raptor.melee_damage_lower + scan_data["raptor_health"] = my_raptor.health + scan_data["raptor_max_health"] = my_raptor.maxHealth + scan_data["raptor_speed"] = my_raptor.speed + intent_mod?.multiplicative_slowdown + scan_data["raptor_color"] = my_raptor.name + scan_data["raptor_gender"] = my_raptor.gender + scan_data["raptor_description"] = my_raptor.raptor_color.description + + var/happiness_percentage = my_raptor.ai_controller?.blackboard[BB_BASIC_HAPPINESS] + var/obj/effect/overlay/happiness_overlay/display = new() + display.set_hearts(happiness_percentage) + display.pixel_y = ICON_SIZE_Y * 0.5 + scan_data["raptor_happiness"] = icon2base64(getFlatIcon(display, no_anim = TRUE)) + qdel(display) + + var/datum/raptor_inheritance/inherit = my_raptor.inherited_stats + if(!isnull(inherit)) + scan_data["inherited_attack"] = inherit.attack_modifier + scan_data["inherited_attack_max"] = RAPTOR_INHERIT_MAX_ATTACK + scan_data["inherited_health"] = inherit.health_modifier + scan_data["inherited_health_max"] = RAPTOR_INHERIT_MAX_HEALTH + scan_data["inherited_speed"] = inherit.speed_modifier + scan_data["inherited_speed_max"] = RAPTOR_INHERIT_MAX_SPEED + scan_data["inherited_ability"] = inherit.ability_modifier + scan_data["inherited_ability_max"] = RAPTOR_INHERIT_MAX_MODIFIER + scan_data["inherited_growth"] = inherit.growth_modifier + scan_data["inherited_growth_max"] = RAPTOR_INHERIT_MAX_MODIFIER + + scan_data["inherited_traits"] = list() + for(var/index in inherit.personality_traits) + scan_data["inherited_traits"] += GLOB.raptor_inherit_traits[index] + + playsound(computer, 'sound/mobs/non-humanoids/orbie/orbie_send_out.ogg', 20) + my_raptor.balloon_alert(user, "scanned") + return TRUE + +/datum/computer_file/program/raptordex/ui_data(mob/user) + return scan_data diff --git a/code/modules/modular_computers/file_system/programs/secureye.dm b/code/modules/modular_computers/file_system/programs/secureye.dm index 4a90f25f5b0c..51e3cfed3031 100644 --- a/code/modules/modular_computers/file_system/programs/secureye.dm +++ b/code/modules/modular_computers/file_system/programs/secureye.dm @@ -129,7 +129,7 @@ data["network"] = network data["mapRef"] = cam_screen.assigned_map data["can_spy"] = !!spying - data["cameras"] = GLOB.cameranet.get_available_cameras_data(network) + data["cameras"] = SScameras.get_available_cameras_data(network) return data /datum/computer_file/program/secureye/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) @@ -145,7 +145,7 @@ if(!spying) playsound(computer, SFX_TERMINAL_TYPE, 25, FALSE) - var/obj/machinery/camera/selected_camera = locate(params["camera"]) in GLOB.cameranet.cameras + var/obj/machinery/camera/selected_camera = locate(params["camera"]) in SScameras.cameras if(selected_camera) camera_ref = WEAKREF(selected_camera) else @@ -168,12 +168,13 @@ /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)) + var/target_turf = get_turf(target) + var/datum/camerachunk/target_camerachunk = SScameras.get_turf_camera_chunk(target_turf) 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) + for(var/obj/machinery/camera/cameras as anything in target_camerachunk.cameras[target.z]) + // We need to find a particular camera that can see this turf + if(!(target_turf in cameras.can_see())) continue var/new_camera = WEAKREF(cameras) if(camera_ref == new_camera) diff --git a/code/modules/modular_computers/file_system/programs/techweb.dm b/code/modules/modular_computers/file_system/programs/techweb.dm index 25bfd9a326b1..b3b255f0682e 100644 --- a/code/modules/modular_computers/file_system/programs/techweb.dm +++ b/code/modules/modular_computers/file_system/programs/techweb.dm @@ -87,16 +87,8 @@ var/list/exp_to_process = stored_research.available_experiments.Copy() for (var/comp_experi in stored_research.completed_experiments) exp_to_process += stored_research.completed_experiments[comp_experi] - for (var/process_experi in exp_to_process) - var/datum/experiment/unf_experi = process_experi - data["experiments"][unf_experi.type] = list( - "name" = unf_experi.name, - "description" = unf_experi.description, - "tag" = unf_experi.exp_tag, - "progress" = unf_experi.check_progress(), - "completed" = unf_experi.completed, - "performance_hint" = unf_experi.performance_hint - ) + for (var/datum/experiment/unf_experi as anything in exp_to_process) + data["experiments"][unf_experi.type] = unf_experi.to_ui_data() return data /datum/computer_file/program/science/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) diff --git a/code/modules/modular_computers/file_system/programs/virtual_pet.dm b/code/modules/modular_computers/file_system/programs/virtual_pet.dm index d2177361a24c..78507331dad5 100644 --- a/code/modules/modular_computers/file_system/programs/virtual_pet.dm +++ b/code/modules/modular_computers/file_system/programs/virtual_pet.dm @@ -106,7 +106,7 @@ GLOBAL_LIST_EMPTY(virtual_pets_list) var/static/list/restricted_areas = typecacheof(list( /area/station/security, /area/station/command, - /area/station/ai_monitored, + /area/station/ai, /area/station/maintenance, /area/station/solars, )) diff --git a/code/modules/movespeed/modifiers/items.dm b/code/modules/movespeed/modifiers/items.dm index 1f988f50c57a..a94dc9ade5e1 100644 --- a/code/modules/movespeed/modifiers/items.dm +++ b/code/modules/movespeed/modifiers/items.dm @@ -11,6 +11,12 @@ /datum/movespeed_modifier/jetpack/wings multiplicative_slowdown = -0.3 +/datum/movespeed_modifier/jetpack/raptor + multiplicative_slowdown = 0.2 + +/datum/movespeed_modifier/jetpack/raptor/slow + multiplicative_slowdown = 1 + /datum/movespeed_modifier/die_of_fate multiplicative_slowdown = 1 diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm index abde74b60bb7..f3107b31af36 100644 --- a/code/modules/movespeed/modifiers/mobs.dm +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -163,7 +163,10 @@ variable = TRUE /datum/movespeed_modifier/goliath_mount - multiplicative_slowdown = -26 + multiplicative_slowdown = -27.5 + +/datum/movespeed_modifier/goldgrub_mount + multiplicative_slowdown = -4.5 /datum/movespeed_modifier/settler multiplicative_slowdown = 0.2 diff --git a/code/modules/movespeed/modifiers/status_effects.dm b/code/modules/movespeed/modifiers/status_effects.dm index 951944944c55..df114aca4070 100644 --- a/code/modules/movespeed/modifiers/status_effects.dm +++ b/code/modules/movespeed/modifiers/status_effects.dm @@ -23,7 +23,7 @@ multiplicative_slowdown = 4 /datum/movespeed_modifier/status_effect/lobster_rush - multiplicative_slowdown = -0.5 + multiplicative_slowdown = -0.2 blacklisted_movetypes = (FLYING|FLOATING) /datum/movespeed_modifier/status_effect/brimdust_concussion diff --git a/code/modules/pai/card.dm b/code/modules/pai/card.dm index eba717bdb1da..b5d2e183c9f8 100644 --- a/code/modules/pai/card.dm +++ b/code/modules/pai/card.dm @@ -11,6 +11,9 @@ slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_SMALL worn_icon_state = "electronic" + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP /// Spam alert prevention var/alert_cooldown @@ -122,6 +125,7 @@ name = pai.name, transmit = pai.can_transmit, receive = pai.can_receive, + leashed = pai.leash, range = pai.leash?.distance, ) return data @@ -156,6 +160,9 @@ if("toggle_holo") pai.toggle_holo() return TRUE + if("toggle_leash") + pai.toggle_leash() + return TRUE if("toggle_radio") pai.toggle_radio(params["option"]) return TRUE diff --git a/code/modules/pai/defense.dm b/code/modules/pai/defense.dm index 61fadf820bfc..05b1eca4f5f6 100644 --- a/code/modules/pai/defense.dm +++ b/code/modules/pai/defense.dm @@ -85,8 +85,8 @@ take_holo_damage(amount * ((forced) ? 1 : 0.25)) return COMPONENT_IGNORE_CHANGE -/mob/living/silicon/pai/getBruteLoss() +/mob/living/silicon/pai/get_brute_loss() return HOLOCHASSIS_MAX_HEALTH - holochassis_health -/mob/living/silicon/pai/getFireLoss() +/mob/living/silicon/pai/get_fire_loss() return HOLOCHASSIS_MAX_HEALTH - holochassis_health diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index 02f83bc1865d..b921408febac 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -59,12 +59,8 @@ var/master_name /// DNA string for owner verification var/master_dna - /// Toggles whether the Medical HUD is active or not - var/medHUD = FALSE /// Used as currency to purchase different abilities 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 @@ -217,16 +213,23 @@ pai_card.set_personality(src) 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) + toggle_leash() addtimer(VARSET_WEAK_CALLBACK(src, holochassis_ready, TRUE), HOLOCHASSIS_INIT_TIME) if(!holoform) add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), PAI_FOLDED) update_appearance(UPDATE_DESC) - RegisterSignal(src, COMSIG_LIVING_CULT_SACRIFICED, PROC_REF(on_cult_sacrificed)) RegisterSignals(src, list(COMSIG_LIVING_ADJUST_BRUTE_DAMAGE, COMSIG_LIVING_ADJUST_BURN_DAMAGE), PROC_REF(on_shell_damaged)) RegisterSignal(src, COMSIG_LIVING_ADJUST_STAMINA_DAMAGE, PROC_REF(on_shell_weakened)) +/mob/living/silicon/pai/proc/toggle_leash() + if(isnull(card)) + return + if(leash) + QDEL_NULL(leash) + else + leash = AddComponent(/datum/component/leash, card, HOLOFORM_DEFAULT_RANGE, force_teleport_out_effect = /obj/effect/temp_visual/guardian/phase/out) + /mob/living/silicon/pai/create_modularInterface() if(!modularInterface) modularInterface = new /obj/item/modular_computer/pda/silicon/pai(src) @@ -253,7 +256,7 @@ /mob/living/silicon/pai/updatehealth() if(HAS_TRAIT(src, TRAIT_GODMODE)) return - set_health(maxHealth - getBruteLoss() - getFireLoss()) + set_health(maxHealth - get_brute_loss() - get_fire_loss()) update_stat() SEND_SIGNAL(src, COMSIG_LIVING_HEALTH_UPDATE) @@ -339,9 +342,7 @@ master_dna = "Untraceable Signature" // Sets supplemental directive to this 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 /mob/living/silicon/pai/on_saboteur(datum/source, disrupt_duration) @@ -469,9 +470,6 @@ /// 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 diff --git a/code/modules/pai/software.dm b/code/modules/pai/software.dm index f0b61e05929e..08212301f350 100644 --- a/code/modules/pai/software.dm +++ b/code/modules/pai/software.dm @@ -219,6 +219,9 @@ stack_trace("Invalid mode passed to host scan: [mode || "null"]") return FALSE +/// Huds from PAI software +#define PAI_HUD_TRAIT "pai_hud" + /** * Proc that toggles any active huds based on the option. * @@ -227,18 +230,16 @@ /mob/living/silicon/pai/proc/toggle_hud(mode) if(isnull(mode)) return FALSE - var/datum/atom_hud/hud - var/hud_on if(mode == PAI_TOGGLE_MEDICAL_HUD) - hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - medHUD = !medHUD - hud_on = medHUD + if(HAS_TRAIT_FROM(src, TRAIT_MEDICAL_HUD, PAI_HUD_TRAIT)) + REMOVE_TRAIT(src, TRAIT_MEDICAL_HUD, PAI_HUD_TRAIT) + else + ADD_TRAIT(src, TRAIT_MEDICAL_HUD, PAI_HUD_TRAIT) if(mode == PAI_TOGGLE_SECURITY_HUD) - hud = GLOB.huds[DATA_HUD_SECURITY_ADVANCED] - secHUD = !secHUD - hud_on = secHUD - if(hud_on) - hud.show_to(src) - else - hud.hide_from(src) + if(HAS_TRAIT_FROM(src, TRAIT_SECURITY_HUD, PAI_HUD_TRAIT)) + REMOVE_TRAIT(src, TRAIT_SECURITY_HUD, PAI_HUD_TRAIT) + else + ADD_TRAIT(src, TRAIT_SECURITY_HUD, PAI_HUD_TRAIT) return TRUE + +#undef PAI_HUD_TRAIT diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 46c27082c758..cf9acc679d25 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -1,3 +1,20 @@ +// Clipboard skins +/datum/atom_skin/clipboard + abstract_type = /datum/atom_skin/clipboard + change_inhand_icon_state = TRUE + +/datum/atom_skin/clipboard/brown + preview_name = "Brown" + new_icon_state = "clipboard" + +/datum/atom_skin/clipboard/black + preview_name = "Black" + new_icon_state = "clipboard_black" + +/datum/atom_skin/clipboard/white + preview_name = "White" + new_icon_state = "clipboard_white" + /** * Clipboard */ @@ -14,12 +31,7 @@ slot_flags = ITEM_SLOT_BELT resistance_flags = FLAMMABLE - unique_reskin = list( - "Brown" = "clipboard", - "Black" = "clipboard_black", - "White" = "clipboard_white", - ) - unique_reskin_changes_inhand = TRUE + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT, /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) /// The stored pen var/obj/item/pen/pen @@ -39,6 +51,7 @@ /obj/item/clipboard/Initialize(mapload) update_appearance() . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/clipboard) /obj/item/clipboard/Destroy() QDEL_NULL(pen) diff --git a/code/modules/paperwork/desk_bell.dm b/code/modules/paperwork/desk_bell.dm index 0f37a458729c..860becaece00 100644 --- a/code/modules/paperwork/desk_bell.dm +++ b/code/modules/paperwork/desk_bell.dm @@ -11,7 +11,7 @@ max_integrity = 5000 // To make attacking it not instantly break it throwforce = 2 interaction_flags_mouse_drop = NEED_HANDS - + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) /// The amount of times this bell has been rang, used to check the chance it breaks var/times_rang = 0 /// Is this bell broken? diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index ecd0ca400296..7f51baea891e 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -17,6 +17,7 @@ icon_state = "filingcabinet" density = TRUE anchored = TRUE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) /obj/structure/filingcabinet/chestdrawer name = "chest drawer" diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 11f55c54a4d1..382e6ea8212d 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -6,6 +6,8 @@ w_class = WEIGHT_CLASS_SMALL pressure_resistance = 2 resistance_flags = FLAMMABLE + obj_flags = UNIQUE_RENAME | RENAME_NO_DESC + custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT) /// The background color for tgui in hex (with a `#`) var/bg_color = "#7f7f7f" /// A typecache of the objects that can be inserted into a folder @@ -94,8 +96,6 @@ /obj/item/folder/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if(is_type_in_typecache(tool, folder_insertables)) return insertables_act(user, tool) - if(IS_WRITING_UTENSIL(tool)) - return writing_utensil_act(user, tool) if(tool.tool_behaviour == TOOL_KNIFE || tool.tool_behaviour == TOOL_WIRECUTTER) return sharp_thing_act(user, tool) return NONE @@ -106,20 +106,10 @@ update_appearance() return ITEM_INTERACT_SUCCESS -/obj/item/folder/proc/writing_utensil_act(mob/user, obj/item/writing_instrument) - if(!user.can_write(writing_instrument)) - return ITEM_INTERACT_BLOCKING - - var/inputvalue = tgui_input_text(user, "What would you like to label the folder?", "Folder Labelling", max_length = MAX_NAME_LEN) - - if(!inputvalue) - return ITEM_INTERACT_BLOCKING - if(!user.can_perform_action(src)) - return ITEM_INTERACT_BLOCKING - - name = "folder[(inputvalue ? " - '[inputvalue]'" : null)]" +/obj/item/folder/nameformat(input, user) playsound(src, SFX_WRITING_PEN, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, SOUND_FALLOFF_EXPONENT + 3, ignore_walls = FALSE) - return ITEM_INTERACT_SUCCESS + return"folder[(input ? " - '[input]'" : null)]" + /obj/item/folder/proc/sharp_thing_act(mob/user, obj/item/sharp_tool) if(contents.len) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index d8493feea2ba..b10a4030882d 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -26,7 +26,7 @@ max_integrity = 50 drop_sound = 'sound/items/handling/paper_drop.ogg' pickup_sound = 'sound/items/handling/paper_pickup.ogg' - grind_results = list(/datum/reagent/cellulose = 3) + custom_materials = list(/datum/material/paper = HALF_SHEET_MATERIAL_AMOUNT / 2) color = COLOR_WHITE item_flags = SKIP_FANTASY_ON_SPAWN interaction_flags_click = NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING @@ -88,6 +88,9 @@ LAZYREMOVE(SSpersistence.queued_message_bottles, src) return ..() +/obj/item/paper/grind_results() + return list(/datum/reagent/cellulose = 3) + /obj/item/paper/custom_fire_overlay() if (!custom_fire_overlay) custom_fire_overlay = mutable_appearance('icons/obj/service/bureaucracy.dmi', "paper_onfire_overlay", appearance_flags = RESET_COLOR|KEEP_APART) diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index 71471f4bf1f0..86725aa18fc8 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -26,6 +26,7 @@ stored_blade = new /obj/item/hatchet/cutterblade(src) register_context() update_appearance() + AddElement(/datum/element/drag_pickup) /obj/item/papercutter/Destroy(force) if(!isnull(stored_paper)) @@ -103,16 +104,16 @@ /obj/item/papercutter/screwdriver_act(mob/living/user, obj/item/tool) if(!stored_blade && !blade_secured) balloon_alert(user, "no blade!") - return + return ITEM_INTERACT_BLOCKING tool.play_tool_sound(src) balloon_alert(user, "[blade_secured ? "un" : ""]secured") blade_secured = !blade_secured return ITEM_INTERACT_SUCCESS -/obj/item/papercutter/attackby(obj/item/inserted_item, mob/user, list/modifiers, list/attack_modifiers) - if(istype(inserted_item, /obj/item/paper)) - if(is_type_in_list(inserted_item, list( +/obj/item/papercutter/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/paper)) + if(is_type_in_list(tool, list( /obj/item/paper/fake_report, /obj/item/paper/holy_writ, /obj/item/paper/pamphlet, @@ -120,29 +121,31 @@ /obj/item/paper/report, ))) balloon_alert(user, "won't fit!") - return + return ITEM_INTERACT_BLOCKING if(stored_paper) balloon_alert(user, "already paper inside!") - return - if(!user.transferItemToLoc(inserted_item, src)) - return + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING playsound(loc, SFX_PAGE_TURN, 60, TRUE) balloon_alert(user, "paper inserted") - stored_paper = inserted_item + stored_paper = tool + update_appearance() + return ITEM_INTERACT_SUCCESS - if(istype(inserted_item, /obj/item/hatchet/cutterblade)) + if(istype(tool, /obj/item/hatchet/cutterblade)) if(stored_blade) balloon_alert(user, "already a blade inside!") - return - if(!user.transferItemToLoc(inserted_item, src)) - return + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING balloon_alert(user, "blade inserted") - inserted_item.forceMove(src) - stored_blade = inserted_item - - update_appearance() + tool.forceMove(src) + stored_blade = tool + update_appearance() + return ITEM_INTERACT_SUCCESS - return ..() + return NONE /obj/item/papercutter/click_alt(mob/user) // can only remove one at a time; paper goes first, as its most likely what players will want to be taking out @@ -180,15 +183,6 @@ new /obj/item/paper/paperslip(get_turf(src)) update_appearance() -/obj/item/papercutter/mouse_drop_dragged(atom/over_object, mob/user) - if(over_object == user) - user.put_in_hands(src) - - else if(istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/target_hand = over_object - user.putItemFromInventoryInHandIfPossible(src, target_hand.held_index) - add_fingerprint(user) - /obj/item/paper/paperslip name = "paper slip" desc = "A little slip of paper left over after a larger piece was cut. Whoa." @@ -196,7 +190,9 @@ inhand_icon_state = "silver_id" lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' 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/grind_results() + return list(/datum/reagent/cellulose = 1.5) /obj/item/paper/paperslip/fortune name = "fortune slip" @@ -205,17 +201,21 @@ 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 +///More fancy and sturdy paper slip which is a "plastic card", used for things like spare ID safe code +/obj/item/paper/paperslip/corporate name = "corporate plastic card" desc = "A plastic card for confidential corporate matters. Can be written on with pen somehow." icon_state = "corppaperslip" - grind_results = list(/datum/reagent/plastic_polymers = 1.5) //It's a plastic card after all + custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 3, /datum/material/paper = HALF_SHEET_MATERIAL_AMOUNT / 2) max_integrity = 130 //Slightly more sturdy because of being made out of a plastic drop_sound = 'sound/items/handling/disk_drop.ogg' pickup_sound = 'sound/items/handling/disk_pickup.ogg' throw_range = 6 throw_speed = 2 +/obj/item/paper/paperslip/corporate/grind_results() + return list(/datum/reagent/plastic_polymers = 1.5) + /obj/item/hatchet/cutterblade name = "paper cutter blade" desc = "The blade of a paper cutter. Most likely removed for polishing or sharpening." diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm index 8cea8cc15a41..b5686fa7c96a 100644 --- a/code/modules/paperwork/paper_premade.dm +++ b/code/modules/paperwork/paper_premade.dm @@ -439,8 +439,7 @@

    Blood types not written above can only receive from the same blood type. - Certain species do not have blood. - "} + "} // DARKPACK EDIT REMOVE - Removed "Certain species do not have blood." /* * Stations diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index f301ba3a29c8..2e02ff0fdce9 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -215,6 +215,7 @@ papertype = /obj/item/paper/natural resistance_flags = FLAMMABLE bin_overlay_string = "paper_bundle_overlay" + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT) ///Cable this bundle is held together with. var/obj/item/stack/cable_coil/binding_cable diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index b9a97778f1ad..54866f7a3169 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -25,7 +25,6 @@ throw_range = 7 custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*0.1) pressure_resistance = 2 - grind_results = list(/datum/reagent/iron = 2, /datum/reagent/iodine = 1) var/colour = COLOR_BLACK //what colour the ink is! var/degrees = 0 var/font = PEN_FONT @@ -58,6 +57,9 @@ create_transform_component() RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) +/obj/item/pen/grind_results() + return list(/datum/reagent/iron = 2, /datum/reagent/iodine = 1) + /// Proc that child classes can override to have custom transforms, like edaggers or pendrivers /obj/item/pen/proc/create_transform_component() AddComponent( \ @@ -165,11 +167,13 @@ icon_state = "pen-charcoal" colour = "#696969" font = CHARCOAL_FONT - custom_materials = null - grind_results = list(/datum/reagent/ash = 5, /datum/reagent/cellulose = 10) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT) requires_gravity = FALSE // this is technically a pencil can_click = FALSE +/obj/item/pen/charcoal/grind_results() + return list(/datum/reagent/ash = 5, /datum/reagent/cellulose = 10) + /datum/crafting_recipe/charcoal_stylus name = "Charcoal Stylus" result = /obj/item/pen/charcoal @@ -177,6 +181,38 @@ time = 3 SECONDS category = CAT_TOOLS +// Skins for captain's fountain pen +/datum/atom_skin/cap_pen + abstract_type = /datum/atom_skin/cap_pen + +/datum/atom_skin/cap_pen/apply(atom/apply_to) + . = ..() + apply_to.desc = "It's an expensive [preview_name] fountain pen. The nib is quite sharp." + +/datum/atom_skin/cap_pen/clear_skin(atom/clear_from) + . = ..() + clear_from.desc = initial(clear_from.desc) + +/datum/atom_skin/cap_pen/oak + preview_name = "Oak" + new_icon_state = "pen-fountain-o" + +/datum/atom_skin/cap_pen/gold + preview_name = "Gold" + new_icon_state = "pen-fountain-g" + +/datum/atom_skin/cap_pen/rosewood + preview_name = "Rosewood" + new_icon_state = "pen-fountain-r" + +/datum/atom_skin/cap_pen/black_silver + preview_name = "Black and Silver" + new_icon_state = "pen-fountain-b" + +/datum/atom_skin/cap_pen/command_blue + preview_name = "Command Blue" + new_icon_state = "pen-fountain-cb" + /obj/item/pen/fountain/captain name = "captain's fountain pen" desc = "It's an expensive Oak fountain pen. The nib is quite sharp." @@ -184,26 +220,18 @@ force = 5 throwforce = 5 throw_speed = 4 - colour = "#DC143C" custom_materials = list(/datum/material/gold = SMALL_MATERIAL_AMOUNT*7.5) sharpness = SHARP_EDGED resistance_flags = FIRE_PROOF - unique_reskin = list( - "Oak" = "pen-fountain-o", - "Gold" = "pen-fountain-g", - "Rosewood" = "pen-fountain-r", - "Black and Silver" = "pen-fountain-b", - "Command Blue" = "pen-fountain-cb" - ) embed_type = /datum/embedding/pen/captain dart_insert_casing_icon_state = "overlay_fountainpen_gold" dart_insert_projectile_icon_state = "overlay_fountainpen_gold_proj" var/list/overlay_reskin = list( - "Oak" = "overlay_fountainpen_gold", - "Gold" = "overlay_fountainpen_gold", - "Rosewood" = "overlay_fountainpen_gold", - "Black and Silver" = "overlay_fountainpen", - "Command Blue" = "overlay_fountainpen_gold" + /datum/atom_skin/cap_pen/black_silver::preview_name = "overlay_fountainpen", + /datum/atom_skin/cap_pen/command_blue::preview_name = "overlay_fountainpen_gold", + /datum/atom_skin/cap_pen/gold::preview_name = "overlay_fountainpen_gold", + /datum/atom_skin/cap_pen/oak::preview_name = "overlay_fountainpen_gold", + /datum/atom_skin/cap_pen/rosewood::preview_name = "overlay_fountainpen_gold", ) /datum/embedding/pen/captain @@ -211,24 +239,21 @@ /obj/item/pen/fountain/captain/Initialize(mapload) . = ..() - AddComponent(/datum/component/butchering, \ - speed = 20 SECONDS, \ - effectiveness = 115, \ + AddComponent( \ + /datum/component/butchering, \ + speed = 20 SECONDS, \ + effectiveness = 115, \ ) + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/cap_pen) //the pen is mightier than the sword RegisterSignal(src, COMSIG_DART_INSERT_PARENT_RESKINNED, PROC_REF(reskin_dart_insert)) -/obj/item/pen/fountain/captain/reskin_obj(mob/M) - ..() - if(current_skin) - desc = "It's an expensive [current_skin] fountain pen. The nib is quite sharp." - - -/obj/item/pen/fountain/captain/proc/reskin_dart_insert(datum/component/dart_insert/insert_comp) +/obj/item/pen/fountain/captain/proc/reskin_dart_insert(datum/component/dart_insert/insert_comp, skin) + SIGNAL_HANDLER if(!istype(insert_comp)) //You really shouldn't be sending this signal from anything other than a dart_insert component return - insert_comp.casing_overlay_icon_state = overlay_reskin[current_skin] - insert_comp.projectile_overlay_icon_state = "[overlay_reskin[current_skin]]_proj" + insert_comp.casing_overlay_icon_state = overlay_reskin[skin] + insert_comp.projectile_overlay_icon_state = "[overlay_reskin[skin]]_proj" /obj/item/pen/item_ctrl_click(mob/living/carbon/user) if(loc != user) @@ -445,9 +470,10 @@ /datum/embedding/edagger_active embed_chance = 100 -/obj/item/pen/edagger/proc/on_scan(datum/source, mob/user, list/extra_data) +/obj/item/pen/edagger/proc/on_scan(datum/source, mob/user, datum/detective_scanner_log/entry) SIGNAL_HANDLER - LAZYADD(extra_data[DETSCAN_CATEGORY_ILLEGAL], "Hard-light generator detected.") + + entry.add_data_entry(DETSCAN_CATEGORY_ILLEGAL, "Hard-light generator detected.") /obj/item/pen/survival name = "survival pen" @@ -460,7 +486,6 @@ w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*0.1, /datum/material/diamond=SMALL_MATERIAL_AMOUNT, /datum/material/titanium = SMALL_MATERIAL_AMOUNT*0.1) pressure_resistance = 2 - grind_results = list(/datum/reagent/iron = 2, /datum/reagent/iodine = 1) tool_behaviour = TOOL_MINING //For the classic "digging out of prison with a spoon but you're in space so this analogy doesn't work" situation. toolspeed = 10 //You will never willingly choose to use one of these over a shovel. font = FOUNTAIN_PEN_FONT @@ -469,6 +494,9 @@ dart_insert_projectile_icon_state = "overlay_survivalpen_proj" can_click = FALSE +/obj/item/pen/survival/grind_results() + return list(/datum/reagent/iron = 2, /datum/reagent/iodine = 1) + /obj/item/pen/survival/on_inserted_into_dart(datum/source, obj/item/ammo_casing/dart, mob/user) . = ..() RegisterSignal(dart.loaded_projectile, COMSIG_PROJECTILE_SELF_ON_HIT, PROC_REF(on_dart_hit)) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 2c0cac37b40e..e5fd48b00716 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -871,10 +871,12 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "tonercartridge" w_class = WEIGHT_CLASS_SMALL - grind_results = list(/datum/reagent/iodine = 40, /datum/reagent/iron = 10) var/charges = 5 var/max_charges = 5 +/obj/item/toner/grind_results() + return list(/datum/reagent/iodine = 40, /datum/reagent/iron = 10) + /obj/item/toner/examine(mob/user) . = ..() . += span_notice("The ink level gauge on the side reads [round(charges / max_charges * 100)]%") @@ -882,9 +884,12 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) /obj/item/toner/large name = "large toner cartridge" desc = "A hefty cartridge of Nanotrasen ValueBrand toner. Fits photocopiers and autopainters alike." - grind_results = list(/datum/reagent/iodine = 90, /datum/reagent/iron = 10) charges = 25 max_charges = 25 + custom_price = 30 // DARKPACK EDIT ADD - ECONOMY + +/obj/item/toner/large/grind_results() + return list(/datum/reagent/iodine = 90, /datum/reagent/iron = 10) /obj/item/toner/extreme name = "extremely large toner cartridge" diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 52c996a7cb15..cac16165e7e4 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -1,8 +1,8 @@ /obj/item/stamp - name = "\improper GRANTED rubber stamp" + name = "rubber stamp" desc = "A rubber stamp for stamping important documents." icon = 'icons/obj/service/bureaucracy.dmi' - icon_state = "stamp-ok" + abstract_type = /obj/item/stamp worn_icon_state = "nothing" inhand_icon_state = "stamp" throwforce = 0 @@ -34,8 +34,9 @@ dye_color = DYE_LAW /obj/item/stamp/head + abstract_type = /obj/item/stamp/head -/* DARKPACK EDIT REMOVAL +/* // DARKPACK EDIT REMOVAL /obj/item/stamp/head/Initialize(mapload) . = ..() // All maps should have at least 1 of each head of staff stamp @@ -77,6 +78,11 @@ icon_state = "stamp-qm" dye_color = DYE_QM +/obj/item/stamp/granted + name = "\improper GRANTED rubber stamp" + icon_state = "stamp-ok" + dye_color = DYE_GREEN + /obj/item/stamp/denied name = "\improper DENIED rubber stamp" icon_state = "stamp-deny" diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index bf4e88fa17b9..256926e7d52e 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -31,7 +31,8 @@ /obj/machinery/ticket_machine/Initialize(mapload) . = ..() update_appearance() - find_and_hang_on_wall() + if(mapload) + find_and_mount_on_atom() /obj/machinery/ticket_machine/Destroy() for(var/obj/item/ticket_machine_ticket/ticket in tickets) diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 07f507e4d621..3867a8fb573d 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -59,6 +59,7 @@ var/picture_size_y_min = 1 var/picture_size_x_max = 4 var/picture_size_y_max = 4 + custom_price = 300 // DARKPACK EDIT ADD - ECONOMY /obj/item/camera/Initialize(mapload) . = ..() @@ -192,17 +193,11 @@ /// Check whether an AI could take a picture of the target turf. /obj/item/camera/proc/can_ai_target(turf/target_turf) - if(!GLOB.cameranet.checkTurfVis(target_turf)) - return FALSE - return TRUE + return SScameras.is_visible_by_cameras(target_turf) /// Check whether a mob could take a picture of the target turf. /obj/item/camera/proc/can_mob_target(turf/target_turf, mob/user) - var/user_view = user.client ? user.client.view : WIDESCREEN_VIEWPORT_SIZE - var/user_eye = user.client ? user.client.eye : user - if(!(target_turf in get_hear(user_view, user_eye))) - return FALSE - return TRUE + return (target_turf in get_hear_turfs(user.client?.view || world.view, user.client?.eye || user)) /obj/item/camera/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) // Always skip on storage and tables @@ -261,18 +256,17 @@ var/list/desc = list("This is a photo of an area of [size_x+1] meters by [size_y+1] meters.") var/list/mobs_spotted = list() var/list/dead_spotted = list() - var/list/seen - var/list/viewlist = user?.client ? getviewsize(user.client.view) : getviewsize(world.view) - var/viewr = max(viewlist[1], viewlist[2]) + max(size_x, size_y) - var/viewc = user?.client ? user.client.eye : target - seen = get_hear(viewr, viewc) + var/list/viewlist = getviewsize(user?.client?.view || world.view) + var/view_range = max(viewlist[1], viewlist[2]) + max(size_x, size_y) + var/viewer = user?.client?.eye || user || target // not sure why target is a fallback + var/list/seen = get_hear_turfs(view_range, viewer) var/list/turfs = list() var/list/mobs = list() var/blueprints = FALSE 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/cameranet_user = isAI(user) || istype(viewc, /mob/eye/camera) + var/cameranet_user = isAI(user) || istype(viewer, /mob/eye/camera) var/width = size_x * 2 + 1 var/height = size_y * 2 + 1 @@ -280,7 +274,7 @@ if(isnull(seen_placeholder)) continue - if(cameranet_user && !GLOB.cameranet.checkTurfVis(seen_placeholder)) + if(cameranet_user && !SScameras.is_visible_by_cameras(seen_placeholder)) continue if(!cameranet_user && !(seen_placeholder in seen)) continue diff --git a/code/modules/photography/camera/film.dm b/code/modules/photography/camera/film.dm index 91674260e2b0..ef29e88ed055 100644 --- a/code/modules/photography/camera/film.dm +++ b/code/modules/photography/camera/film.dm @@ -13,3 +13,4 @@ w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*0.1, /datum/material/glass = SMALL_MATERIAL_AMOUNT*0.1) + custom_price = 30 // DARKPACK EDIT ADD - ECONOMY diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm index 66db83342e56..983cb00977d2 100644 --- a/code/modules/photography/photos/frame.dm +++ b/code/modules/photography/photos/frame.dm @@ -73,13 +73,11 @@ var/art_value = OK_ART var/can_decon = TRUE -/obj/structure/sign/picture_frame/Initialize(mapload, dir, building) +/obj/structure/sign/picture_frame/Initialize(mapload) . = ..() AddElement(/datum/element/art, art_value) if (!SSpersistence.initialized) LAZYADD(SSpersistence.queued_photo_frames, src) - if(dir) - setDir(dir) /obj/structure/sign/picture_frame/Destroy() LAZYREMOVE(SSpersistence.queued_photo_frames, src) diff --git a/code/modules/photography/photos/photo.dm b/code/modules/photography/photos/photo.dm index 9c76e499a607..44dabf0f5d90 100644 --- a/code/modules/photography/photos/photo.dm +++ b/code/modules/photography/photos/photo.dm @@ -11,10 +11,12 @@ max_integrity = 50 drop_sound = 'sound/items/handling/paper_drop.ogg' pickup_sound = 'sound/items/handling/paper_pickup.ogg' - grind_results = list(/datum/reagent/iodine = 4) var/datum/picture/picture var/scribble //Scribble on the back. +/obj/item/photo/grind_results() + return LAZYACCESS(custom_materials, /datum/material/hauntium) ? list(/datum/reagent/hauntium = 20) : list(/datum/reagent/iodine = 4) + /obj/item/photo/get_save_vars() return ..() - NAMEOF(src, icon) @@ -56,7 +58,6 @@ if(!isobserver(seen) && !isghostspecies(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() diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm index 66f745129be4..fb85fe054ba7 100644 --- a/code/modules/plumbing/ducts.dm +++ b/code/modules/plumbing/ducts.dm @@ -157,7 +157,7 @@ All the important duct code: if(ispath(drop_on_wrench)) var/obj/item/stack/ducts/duct_stack = new drop_on_wrench(drop_location()) duct_stack.duct_color = GLOB.pipe_color_name[duct_color] || DUCT_COLOR_OMNI - duct_stack.duct_layer = GLOB.plumbing_layer_names["[duct_layer]"] || GLOB.plumbing_layer_names["[DUCT_LAYER_DEFAULT]"] + duct_stack.duct_layer = GLOB.plumbing_layer_names["[duct_layer]"] || GLOB.plumbing_layer_names[DUCT_LAYER_DEFAULT] duct_stack.add_atom_colour(duct_color, FIXED_COLOUR_PRIORITY) drop_on_wrench = null if(!QDELING(src)) diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm index 84e51918dc8c..ffb7c0fedcd7 100644 --- a/code/modules/plumbing/plumbers/_plumb_machinery.dm +++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm @@ -23,7 +23,7 @@ . = ..() set_anchored(bolt) create_reagents(buffer, reagent_flags) - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) register_context() /obj/machinery/plumbing/create_reagents(max_vol, flags) diff --git a/code/modules/plumbing/plumbers/bottler.dm b/code/modules/plumbing/plumbers/bottler.dm index b3421e9ffc36..f181427c6540 100644 --- a/code/modules/plumbing/plumbers/bottler.dm +++ b/code/modules/plumbing/plumbers/bottler.dm @@ -21,7 +21,7 @@ /obj/machinery/plumbing/bottler/Initialize(mapload, bolt, layer) . = ..() - AddComponent(/datum/component/plumbing/simple_demand, bolt, layer) + AddComponent(/datum/component/plumbing/simple_demand, bolt, layer, distinct_reagent_cap = 3) setDir(dir) /obj/machinery/plumbing/bottler/examine(mob/user) diff --git a/code/modules/plumbing/plumbers/grinder_chemical.dm b/code/modules/plumbing/plumbers/grinder_chemical.dm index c631e26def6f..2feb38a8a69b 100644 --- a/code/modules/plumbing/plumbers/grinder_chemical.dm +++ b/code/modules/plumbing/plumbers/grinder_chemical.dm @@ -103,11 +103,11 @@ INVOKE_ASYNC(src, PROC_REF(blend), AM) -/obj/machinery/plumbing/grinder_chemical/blended(obj/item/blended_item, grinded) +/obj/machinery/plumbing/grinder_chemical/blended(obj/item/slime_extract/blended_item, grinded) //don't delete slime extracts - if(istype(blended_item, /obj/item/slime_extract)) + if(istype(blended_item)) //so you can't regrind them for extra stuff - blended_item.grind_results = null + blended_item.can_grind = FALSE blended_item.forceMove(drop_location()) @@ -120,7 +120,7 @@ * Arguments * * [AM][atom] - the atom to grind or juice */ -/obj/machinery/plumbing/grinder_chemical/proc/blend(obj/item/I) +/obj/machinery/plumbing/grinder_chemical/proc/blend(obj/item/item_to_blend) PRIVATE_PROC(TRUE) if(!is_operational || !anchored) @@ -128,14 +128,14 @@ if(reagents.holder_full()) return - if((I.item_flags & ABSTRACT) || (I.flags_1 & HOLOGRAM_1)) + if((item_to_blend.item_flags & ABSTRACT) || (item_to_blend.flags_1 & HOLOGRAM_1)) return - if(!I.blend_requirements(src)) + if(!item_to_blend.blend_requirements(src)) return if(!grinding) - I.juice(reagents, usr, src) - else if(length(I.grind_results) || I.reagents?.total_volume) - I.grind(reagents, usr, src) + item_to_blend.juice(reagents, usr, src) + else if(length(item_to_blend.grind_results()) || item_to_blend.reagents?.total_volume) + item_to_blend.grind(reagents, usr, src) use_energy(active_power_usage) diff --git a/code/modules/plumbing/plumbers/iv_drip.dm b/code/modules/plumbing/plumbers/iv_drip.dm index 0fef34ef4ca0..d735b49e56af 100644 --- a/code/modules/plumbing/plumbers/iv_drip.dm +++ b/code/modules/plumbing/plumbers/iv_drip.dm @@ -10,12 +10,18 @@ /obj/machinery/iv_drip/plumbing/Initialize(mapload, bolt, layer) . = ..() - AddComponent(/datum/component/plumbing/simple_demand, bolt, layer) - AddComponent(/datum/component/simple_rotation) + AddComponent(/datum/component/plumbing/automated_iv, bolt, layer, distinct_reagent_cap = 3) + AddElement(/datum/element/simple_rotation) + +/obj/machinery/iv_drip/plumbing/quick_toggle(mob/living/user) + return FALSE + +/obj/machinery/iv_drip/plumbing/click_alt(mob/user) + return NONE /obj/machinery/iv_drip/plumbing/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) . = ..() - if(held_item.tool_behaviour != TOOL_WRENCH) + if(isnull(held_item) || held_item.tool_behaviour != TOOL_WRENCH) return context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "Una" : "A"]nchor" return CONTEXTUAL_SCREENTIP_SET diff --git a/code/modules/plumbing/plumbers/pill_press.dm b/code/modules/plumbing/plumbers/pill_press.dm index 4bd9321d2a86..8e10239511ea 100644 --- a/code/modules/plumbing/plumbers/pill_press.dm +++ b/code/modules/plumbing/plumbers/pill_press.dm @@ -57,7 +57,7 @@ max_volume = initial(packaging_type.volume) current_volume = clamp(current_volume, MIN_VOLUME, max_volume) - AddComponent(/datum/component/plumbing/simple_demand, bolt, layer) + AddComponent(/datum/component/plumbing/simple_demand, bolt, layer, distinct_reagent_cap = 3) /obj/machinery/plumbing/pill_press/Destroy(force) QDEL_LAZYLIST(stored_products) diff --git a/code/modules/plumbing/plumbers/simple_machines.dm b/code/modules/plumbing/plumbers/simple_machines.dm index c2ef30829732..ded80bf88f17 100644 --- a/code/modules/plumbing/plumbers/simple_machines.dm +++ b/code/modules/plumbing/plumbers/simple_machines.dm @@ -21,7 +21,7 @@ /obj/machinery/plumbing/output/Initialize(mapload, bolt, layer) . = ..() - AddComponent(/datum/component/plumbing/simple_demand, bolt, layer) + AddComponent(/datum/component/plumbing/simple_demand, bolt, layer, distinct_reagent_cap = 5) ///For pouring reagents from ducts directly into cups /obj/machinery/plumbing/output/tap diff --git a/code/modules/plumbing/plumbers/synthesizer.dm b/code/modules/plumbing/plumbers/synthesizer.dm index ed4121d6ad02..0d2877cca164 100644 --- a/code/modules/plumbing/plumbers/synthesizer.dm +++ b/code/modules/plumbing/plumbers/synthesizer.dm @@ -5,8 +5,8 @@ icon_state = "synthesizer" icon = 'icons/obj/pipes_n_cables/hydrochem/plumbers.dmi' - ///Amount we produce for every process. Ideally keep under 5 since thats currently the standard duct capacity - var/amount = 1 + ///Amount we produce for every process by default. + var/amount = 5 ///I track them here because I have no idea how I'd make tgui loop like that var/static/list/possible_amounts = list(0, 1, 2, 3, 4, 5) ///The reagent we are producing. We are a typepath, but are also typecast because there's several occations where we need to use initial. diff --git a/code/modules/point/point.dm b/code/modules/point/point.dm index adb539ad3b9c..e3ef14d2db9e 100644 --- a/code/modules/point/point.dm +++ b/code/modules/point/point.dm @@ -114,7 +114,7 @@ if(client) //Clientless mobs can just go ahead and point if(ismovable(pointing_at)) var/atom/movable/pointed_movable = pointing_at - if(pointed_movable.flags_1 & IS_ONTOP_1) + if(HAS_TRAIT(pointed_movable, TRAIT_SKIP_BASIC_REACH_CHECK) || pointing_at.loc.IsContainedAtomAccessible(pointing_at, src)) pointing_at = pointed_movable.loc if(!(pointing_at in view(client.view, src))) diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index dbdf8325db43..8cf44a970ee6 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -173,36 +173,14 @@ //. += NAMEOF(src, locked) return . -/obj/machinery/power/apc/Initialize(mapload, ndir) +/obj/machinery/power/apc/Initialize(mapload) . = ..() + //APCs get added to their own processing tasks for the machines subsystem. if (!(datum_flags & DF_ISPROCESSING)) datum_flags |= DF_ISPROCESSING SSmachines.processing_apcs += src - //Pixel offset its appearance based on its direction - dir = ndir - switch(dir) - if(NORTH) - offset_old = pixel_y - pixel_y = APC_PIXEL_OFFSET - if(SOUTH) - offset_old = pixel_y - pixel_y = -APC_PIXEL_OFFSET - if(EAST) - offset_old = pixel_x - pixel_x = APC_PIXEL_OFFSET - if(WEST) - offset_old = pixel_x - pixel_x = -APC_PIXEL_OFFSET - - var/image/hud_image = image(icon = 'icons/mob/huds/hud.dmi', icon_state = "apc_hacked") - hud_image.pixel_w = pixel_x - hud_image.pixel_z = pixel_y - hud_list = list( - MALF_APC_HUD = hud_image - ) - //Assign it to its area. If mappers already assigned an area string fast load the area from it else get the current area var/area/our_area = get_area(loc) if(areastring) @@ -236,8 +214,10 @@ cell.charge = start_charge * cell.maxcharge / 100 // (convert percentage to actual value) make_terminal() ///This is how we test to ensure that mappers use the directional subtypes of APCs, rather than use the parent and pixel-shift it themselves. + setDir(dir) if(abs(offset_old) != APC_PIXEL_OFFSET) log_mapping("APC: ([src]) at [AREACOORD(src)] with dir ([dir] | [uppertext(dir2text(dir))]) has pixel_[dir & (WEST|EAST) ? "x" : "y"] value [offset_old] - should be [dir & (SOUTH|EAST) ? "-" : ""][APC_PIXEL_OFFSET]. Use the directional/ helpers!") + find_and_mount_on_atom() // For apcs created during the round players need to configure them from scratch else opened = APC_COVER_OPENED @@ -261,7 +241,6 @@ 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) @@ -277,6 +256,30 @@ disconnect_terminal() return ..() +/obj/machinery/power/apc/setDir(newdir) + . = ..() + + switch(newdir) + if(NORTH) + offset_old = pixel_y + pixel_y = APC_PIXEL_OFFSET + if(SOUTH) + offset_old = pixel_y + pixel_y = -APC_PIXEL_OFFSET + if(EAST) + offset_old = pixel_x + pixel_x = APC_PIXEL_OFFSET + if(WEST) + offset_old = pixel_x + pixel_x = -APC_PIXEL_OFFSET + + var/image/hud_image = image(icon = 'icons/mob/huds/hud.dmi', icon_state = "apc_hacked") + hud_image.pixel_w = pixel_x + hud_image.pixel_z = pixel_y + hud_list = list( + MALF_APC_HUD = hud_image + ) + /obj/machinery/power/apc/on_saboteur(datum/source, disrupt_duration) . = ..() disrupt_duration *= 0.1 // so, turns out, failure timer is in seconds, not deciseconds; without this, disruptions last 10 times as long as they probably should diff --git a/code/modules/power/apc/apc_malf.dm b/code/modules/power/apc/apc_malf.dm index c4cafb9d5e77..eb0526e32ca1 100644 --- a/code/modules/power/apc/apc_malf.dm +++ b/code/modules/power/apc/apc_malf.dm @@ -45,8 +45,7 @@ malf.ShutOffDoomsdayDevice() occupier = malf if (isturf(malf.loc)) // create a deactivated AI core if the AI isn't coming from an emergency mech shunt - malf.linked_core = new /obj/structure/ai_core/deactivated(malf.loc) - malf.linked_core.remote_ai = malf // note that we do not set the deactivated core's core_mmi.brainmob + malf.create_core_link(new /obj/structure/ai_core(malf.loc, CORE_STATE_FINISHED, malf.make_mmi())) malf.forceMove(src) // move INTO the APC, not to its tile if(!findtext(occupier.name, "APC Copy")) occupier.name = "[malf.name] APC Copy" @@ -74,9 +73,7 @@ return if(occupier.linked_core) occupier.shunted = FALSE - occupier.forceMove(occupier.linked_core.loc) - qdel(occupier.linked_core) - occupier.cancel_camera() + occupier.resolve_core_link() occupier = null else stack_trace("An AI: [occupier] has vacated an APC with no linked core and without being gibbed.") diff --git a/code/modules/power/apc/apc_tool_act.dm b/code/modules/power/apc/apc_tool_act.dm index 71bd3f226d3a..f74860662bdc 100644 --- a/code/modules/power/apc/apc_tool_act.dm +++ b/code/modules/power/apc/apc_tool_act.dm @@ -407,7 +407,7 @@ return FALSE /obj/machinery/power/apc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) - if(!(the_rcd.construction_upgrades & RCD_UPGRADE_SIMPLE_CIRCUITS) || rcd_data["[RCD_DESIGN_MODE]"] != RCD_WALLFRAME) + if(!(the_rcd.construction_upgrades & RCD_UPGRADE_SIMPLE_CIRCUITS) || rcd_data[RCD_DESIGN_MODE] != RCD_WALLFRAME) return FALSE if(!has_electronics) diff --git a/code/modules/power/battery.dm b/code/modules/power/battery.dm index 8a6be8d85aa5..3f0256129b3c 100644 --- a/code/modules/power/battery.dm +++ b/code/modules/power/battery.dm @@ -13,11 +13,13 @@ throw_speed = 2 throw_range = 2 custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*12, /datum/material/glass=SMALL_MATERIAL_AMOUNT*2) - grind_results = list(/datum/reagent/lithium = 60, /datum/reagent/iron = 10, /datum/reagent/silicon = 10) rating_base = STANDARD_BATTERY_CHARGE maxcharge = STANDARD_BATTERY_CHARGE chargerate = STANDARD_BATTERY_RATE +/obj/item/stock_parts/power_store/battery/grind_results() + return list(/datum/reagent/lithium = 60, /datum/reagent/iron = 10, /datum/reagent/silicon = 10) + /obj/item/stock_parts/power_store/battery/empty empty = TRUE @@ -77,3 +79,14 @@ /obj/item/stock_parts/power_store/battery/crap/empty empty = TRUE + +/obj/item/stock_parts/power_store/battery/infinite + name = "infinite-capacity megacell" + desc = "A transdimensional megacell with an inexhaustible capacity." + icon_state = "icellbig" + maxcharge = INFINITY + chargerate = INFINITY + ratingdesc = FALSE + +/obj/item/stock_parts/power_store/battery/infinite/use(used, force = FALSE) + return used diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 968db84a535a..2e878c0b556a 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -459,7 +459,6 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list( attack_verb_simple = list("whip", "lash", "discipline", "flog") singular_name = "cable piece" full_w_class = WEIGHT_CLASS_SMALL - grind_results = list(/datum/reagent/copper = 2) //2 copper per cable in the coil usesound = 'sound/items/deconstruct.ogg' cost = 1 source = /datum/robot_energy_storage/wire @@ -476,6 +475,9 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list( update_appearance() +/obj/item/stack/cable_coil/grind_results() + return list(/datum/reagent/copper = 2) + /obj/item/stack/cable_coil/examine(mob/user) . = ..() . += "Use it in hand to change the layer you are placing on, amongst other things." @@ -603,7 +605,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list( /obj/item/stack/cable_coil/proc/try_heal_loop(atom/interacting_with, mob/living/user, repeating = FALSE) var/mob/living/carbon/human/attacked_humanoid = interacting_with var/obj/item/clothing/under/uniform = attacked_humanoid.w_uniform - if(uniform?.repair_sensors(src, user)) + if(uniform?.repair_sensors(user)) return ITEM_INTERACT_SUCCESS var/obj/item/bodypart/affecting = attacked_humanoid.get_bodypart(check_zone(user.zone_selected)) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 78f297793af5..59e0215cf524 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -19,7 +19,6 @@ emp_damage_modifier = 1 w_class = WEIGHT_CLASS_SMALL custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*7, /datum/material/glass=SMALL_MATERIAL_AMOUNT*0.5) - grind_results = list(/datum/reagent/lithium = 15, /datum/reagent/iron = 5, /datum/reagent/silicon = 5) /obj/item/stock_parts/power_store/cell/Initialize(mapload) . = ..() @@ -31,7 +30,11 @@ /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) - */ + */ + +/obj/item/stock_parts/power_store/cell/grind_results() + return list(/datum/reagent/lithium = 15, /datum/reagent/iron = 5, /datum/reagent/silicon = 5) + /* Cell variants*/ /obj/item/stock_parts/power_store/cell/empty empty = TRUE @@ -98,6 +101,10 @@ name = "pulse pistol power cell" maxcharge = STANDARD_CELL_CHARGE * 2 +/obj/item/stock_parts/power_store/cell/laser_pistol + name = "laser pistol power cell" + chargerate = STANDARD_CELL_RATE * 0.15 + /obj/item/stock_parts/power_store/cell/ninja name = "black power cell" icon_state = "bscell" @@ -162,7 +169,7 @@ ratingdesc = FALSE /obj/item/stock_parts/power_store/cell/infinite/use(used, force = FALSE) - return TRUE + return used /obj/item/stock_parts/power_store/cell/infinite/abductor name = "void core" @@ -242,7 +249,9 @@ charge_light_type = null connector_type = "crystal" custom_materials = null - grind_results = null + +/obj/item/stock_parts/power_store/cell/crystal_cell/grind_results() + return null /obj/item/stock_parts/power_store/cell/ethereal name = "ahelp it" @@ -253,8 +262,11 @@ charge_light_type = null connector_type = null custom_materials = null - grind_results = null emp_damage_modifier = 0 + abstract_type = /obj/item/stock_parts/power_store/cell/ethereal + +/obj/item/stock_parts/power_store/cell/ethereal/grind_results() + return null /obj/item/stock_parts/power_store/cell/ethereal/examine(mob/user) . = ..() diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm index 925641e8a50e..d22bd345b258 100644 --- a/code/modules/power/floodlight.dm +++ b/code/modules/power/floodlight.dm @@ -11,7 +11,7 @@ icon = 'modular_darkpack/master_files/icons/obj/lighting.dmi' // DARKPACK EDIT CHANGE icon_state = "floodlight_c1" density = TRUE - + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5) var/state = FLOODLIGHT_NEEDS_WIRES /obj/structure/floodlight_frame/Initialize(mapload) @@ -155,6 +155,9 @@ . = ..() RegisterSignal(src, COMSIG_OBJ_PAINTED, TYPE_PROC_REF(/obj/machinery/power/floodlight, on_color_change)) //update light color when color changes register_context() + if(mapload) + set_anchored(TRUE) + connect_to_network() /obj/machinery/power/floodlight/proc/on_color_change(obj/machinery/power/flood_light, mob/user, obj/item/toy/crayon/spraycan/spraycan, is_dark_color) SIGNAL_HANDLER diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 0f0dc9c09a45..2396d8252b5f 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -82,11 +82,6 @@ ///break if moved, if false also makes it ignore if the wall its on breaks var/break_if_moved = TRUE -/obj/machinery/light/Move() - if(status != LIGHT_BROKEN && break_if_moved) - break_light_tube(TRUE) - return ..() - // create a new lighting fixture /obj/machinery/light/Initialize(mapload) . = ..() @@ -118,18 +113,25 @@ RegisterSignal(src, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater)) AddElement(/datum/element/atmos_sensitive, mapload) AddElement(/datum/element/contextual_screentip_bare_hands, rmb_text = "Remove bulb") + if(mapload) + find_and_mount_on_atom(mark_for_late_init = TRUE) + +/obj/machinery/light/get_turfs_to_mount_on() + return list(get_step(src, dir)) + +/obj/machinery/light/find_and_mount_on_atom(mark_for_late_init, late_init) if(break_if_moved) - find_and_hang_on_wall(custom_drop_callback = CALLBACK(src, PROC_REF(knock_down))) + return ..() /obj/machinery/light/post_machine_initialize() . = ..() #ifndef MAP_TEST switch(fitting) if("tube") - if(prob(2)) + if(prob(1)) // DARKPACK EDIT CHANGE break_light_tube(TRUE) if("bulb") - if(prob(5)) + if(prob(2)) // DARKPACK EDIT CHANGE break_light_tube(TRUE) #endif update(trigger = FALSE) @@ -141,6 +143,16 @@ QDEL_NULL(cell) return ..() +/obj/machinery/light/Move() + if(status != LIGHT_BROKEN && break_if_moved) + break_light_tube(TRUE) + return ..() + +/obj/machinery/light/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) + cell = null + /obj/machinery/light/setDir(newdir) . = ..() set_light(l_dir = REVERSE_DIR(dir)) @@ -171,7 +183,7 @@ icon_state = "[base_state]-broken" return ..() -/* DARKPACK EDIT REMOVAL - Temp removal because flav is a hack and did not do this properly. +/* // DARKPACK EDIT REMOVAL - Temp removal because flav is a hack and did not do this properly. /obj/machinery/light/update_overlays() . = ..() if(!on || status != LIGHT_OK) @@ -409,34 +421,28 @@ electrocute_mob(user, get_area(src), src, (rand(7,10) * 0.1), TRUE) /obj/machinery/light/on_deconstruction(disassembled) - var/obj/structure/light_construct/new_light = null - var/current_stage = 2 - if(!disassembled) - current_stage = 1 + var/atom/drop_point = drop_location() + + var/obj/item/wallframe/light_fixture/frame = null switch(fitting) if("tube") - new_light = new /obj/structure/light_construct(loc) - new_light.icon_state = "tube-construct-stage[current_stage]" - + frame = new /obj/item/wallframe/light_fixture(drop_point) if("bulb") - new_light = new /obj/structure/light_construct/small(loc) - new_light.icon_state = "bulb-construct-stage[current_stage]" - new_light.setDir(dir) - new_light.stage = current_stage + frame = new /obj/item/wallframe/light_fixture/small(drop_point) + if("floor bulb") + frame = new /obj/item/wallframe/light_fixture/small(drop_point) if(!disassembled) - new_light.take_damage(new_light.max_integrity * 0.5, sound_effect=FALSE) + frame.take_damage(frame.max_integrity * 0.5, sound_effect = FALSE) if(status != LIGHT_BROKEN) break_light_tube() if(status != LIGHT_EMPTY) drop_light_tube() new /obj/item/stack/cable_coil(loc, 1, "red") - transfer_fingerprints_to(new_light) + transfer_fingerprints_to(frame) var/obj/item/stock_parts/power_store/real_cell = get_cell() if(!QDELETED(real_cell)) - new_light.cell = real_cell - real_cell.forceMove(new_light) - cell = null + real_cell.forceMove(drop_point) /obj/machinery/light/attacked_by(obj/item/attacking_object, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() @@ -718,23 +724,6 @@ 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() - if (fitting == "bulb") - new /obj/item/wallframe/light_fixture/small(drop_location()) - else - 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." @@ -746,10 +735,24 @@ layer = BELOW_CATWALK_LAYER plane = FLOOR_PLANE light_type = /obj/item/light/bulb - fitting = "bulb" + fitting = "floor bulb" nightshift_brightness = 4 fire_brightness = 4.5 +/obj/machinery/light/floor/get_turfs_to_mount_on() + return list(get_turf(src)) + +/obj/machinery/light/floor/is_mountable_turf(turf/target) + return !isgroundlessturf(target) + +/obj/machinery/light/floor/get_moutable_objects() + var/static/list/attachables = list( + /obj/structure/thermoplastic, + /obj/structure/lattice/catwalk, + ) + + return attachables + /obj/machinery/light/floor/get_light_offset() return list(0, 0) @@ -757,6 +760,15 @@ status = LIGHT_BROKEN icon_state = "floor-broken" +/obj/machinery/light/floor/burned + status = LIGHT_BURNED + icon_state = "floor-burned" + +/obj/machinery/light/floor/empty + icon_state = "floor-empty" + start_with_cell = FALSE + status = LIGHT_EMPTY + /obj/machinery/light/floor/transport name = "transport light" break_if_moved = FALSE diff --git a/code/modules/power/lighting/light_construct.dm b/code/modules/power/lighting/light_construct.dm index a8c51e8a0b4b..8676097db165 100644 --- a/code/modules/power/lighting/light_construct.dm +++ b/code/modules/power/lighting/light_construct.dm @@ -28,16 +28,21 @@ fire = 80 acid = 50 -/obj/structure/light_construct/Initialize(mapload, ndir, building) +/obj/structure/light_construct/Initialize(mapload) . = ..() - if(building) - setDir(ndir) - find_and_hang_on_wall() + if(mapload && !find_and_mount_on_atom(mark_for_late_init = TRUE)) + return INITIALIZE_HINT_LATELOAD + +/obj/structure/light_construct/LateInitialize() + find_and_mount_on_atom(late_init = TRUE) /obj/structure/light_construct/Destroy() QDEL_NULL(cell) return ..() +/obj/structure/light_construct/get_turfs_to_mount_on() + return list(get_step(src, dir)) + /obj/structure/light_construct/get_cell() return cell @@ -107,11 +112,9 @@ return to_chat(user, span_notice("You begin deconstructing [src]...")) if (tool.use_tool(src, user, 30, volume=50)) - new /obj/item/stack/sheet/iron(drop_location(), sheets_refunded) user.visible_message(span_notice("[user.name] deconstructs [src]."), \ span_notice("You deconstruct [src]."), span_hear("You hear a ratchet.")) playsound(src, 'sound/items/deconstruct.ogg', 75, TRUE) - qdel(src) return if(istype(tool, /obj/item/stack/cable_coil)) @@ -144,10 +147,16 @@ tool.play_tool_sound(src, 75) switch(fixture_type) if("tube") - new_light = new /obj/machinery/light/built(loc) + new_light = new /obj/machinery/light/empty(loc) if("bulb") - new_light = new /obj/machinery/light/small/built(loc) + new_light = new /obj/machinery/light/small/empty(loc) + if("floor") + new_light = new /obj/machinery/light/floor/empty(loc) new_light.setDir(dir) + var/atom/support = get_step(src, dir) + if(!isclosedturf(support)) + support = locate(/obj/structure/window) in support + new_light.AddComponent(/datum/component/atom_mounted, support) transfer_fingerprints_to(new_light) if(!QDELETED(cell)) new_light.cell = cell @@ -159,13 +168,21 @@ /obj/structure/light_construct/blob_act(obj/structure/blob/attacking_blob) if(attacking_blob && attacking_blob.loc == loc) - qdel(src) + deconstruct(FALSE) -/obj/structure/light_construct/atom_deconstruct(disassembled = TRUE) +/obj/structure/light_construct/atom_deconstruct(disassembled) new /obj/item/stack/sheet/iron(loc, sheets_refunded) + if(stage == LIGHT_CONSTRUCT_WIRED) + new /obj/item/stack/cable_coil(drop_location(), 1, "red") /obj/structure/light_construct/small name = "small light fixture frame" icon_state = "bulb-construct-stage1" fixture_type = "bulb" sheets_refunded = 1 + +/obj/structure/light_construct/floor + name = "floor light fixture frame" + icon_state = "floor-construct-stage1" + fixture_type = "floor" + sheets_refunded = 1 diff --git a/code/modules/power/lighting/light_items.dm b/code/modules/power/lighting/light_items.dm index 3a72d0c34da5..27797c7c5268 100644 --- a/code/modules/power/lighting/light_items.dm +++ b/code/modules/power/lighting/light_items.dm @@ -9,7 +9,6 @@ throwforce = 5 w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT) - grind_results = list(/datum/reagent/silicon = 5, /datum/reagent/nitrogen = 10) //Nitrogen is used as a cheaper alternative to argon in incandescent lighbulbs ///How much light it gives off var/brightness = 2 ///LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN @@ -31,6 +30,9 @@ AddElement(/datum/element/update_icon_updates_onmob) AddComponent(/datum/component/golem_food, golem_food_key = /obj/item/light, extra_validation = CALLBACK(src, PROC_REF(is_intact))) +/obj/item/light/grind_results() + return list(/datum/reagent/silicon = 5, /datum/reagent/nitrogen = 10) + /obj/item/light/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) . = ..() diff --git a/code/modules/power/lighting/light_mapping_helpers.dm b/code/modules/power/lighting/light_mapping_helpers.dm index 94b9514318fd..e14c110c39f0 100644 --- a/code/modules/power/lighting/light_mapping_helpers.dm +++ b/code/modules/power/lighting/light_mapping_helpers.dm @@ -2,7 +2,11 @@ status = LIGHT_BROKEN icon_state = "tube-broken" -/obj/machinery/light/built +/obj/machinery/light/burned + status = LIGHT_BURNED + icon_state = "tube-burned" + +/obj/machinery/light/empty icon_state = "tube-empty" start_with_cell = FALSE status = LIGHT_EMPTY @@ -68,7 +72,11 @@ status = LIGHT_BROKEN icon_state = "bulb-broken" -/obj/machinery/light/small/built +/obj/machinery/light/small/burned + status = LIGHT_BURNED + icon_state = "bulb-burned" + +/obj/machinery/light/small/empty icon_state = "bulb-empty" start_with_cell = FALSE status = LIGHT_EMPTY @@ -94,8 +102,9 @@ fire_brightness = 4.5 fire_colour = "#d400ff" -// DARKPACK EDIT START +// DARKPACK EDIT CHANGE START /obj/machinery/light/prince + icon_state = "prince" base_state = "prince" /obj/machinery/light/prince/ghost @@ -118,7 +127,7 @@ /obj/machinery/light/prince/broken status = LIGHT_BROKEN - icon_state = "tube-broken" + icon_state = "prince-broken" #define LIGHTING_DIRECTIONAL_HELPERS(path) \ MAPPING_DIRECTIONAL_HELPERS(##path, 0) \ @@ -137,11 +146,14 @@ LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light) // ---- Broken tube LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/broken) +// ---- Burned tube +LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/burned) + // ---- Tube construct LIGHTING_DIRECTIONAL_HELPERS(/obj/structure/light_construct) // ---- Tube frames -LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/built) +LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/empty) // ---- No nightlight tubes LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/no_nightlight) @@ -184,11 +196,14 @@ LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/small) LIGHTING_DIRECTIONAL_HELPERS(/obj/structure/light_construct/small) // ---- Bulb frames -LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/built) +LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/empty) // ---- Broken bulbs LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/broken) +// ---- Burned bulb +LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/burned) + // ---- Red bulbs LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/dim) @@ -200,7 +215,10 @@ LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/red/dim) // ---- Blacklight bulbs LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/blacklight) -LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/prince) // DARKPACK EDIT ADD +LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/prince) + +LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/prince/broken) +LIGHTING_DIRECTIONAL_HELPERS(/obj/machinery/light/prince/ghost) #undef LIGHTING_DIRECTIONAL_HELPERS -// DARKPACK EDIT END +// DARKPACK EDIT CHANGE END diff --git a/code/modules/power/lighting/light_wallframes.dm b/code/modules/power/lighting/light_wallframes.dm index a649519f0ed0..dda16838704a 100644 --- a/code/modules/power/lighting/light_wallframes.dm +++ b/code/modules/power/lighting/light_wallframes.dm @@ -6,6 +6,16 @@ result_path = /obj/structure/light_construct wall_external = TRUE +/obj/item/wallframe/light_fixture/find_support_structure(atom/structure) + return istype(structure, /obj/structure/window) ? structure : ..() + +/obj/item/wallframe/light_fixture/try_build(atom/support, mob/user) + var/area/A = get_area(user) + if(A.always_unpowered) + balloon_alert(user, "cannot place in this area!") + return FALSE + return ..() + /obj/item/wallframe/light_fixture/small name = "small light fixture frame" icon_state = "bulb-construct-item" @@ -20,3 +30,35 @@ to_chat(user, span_warning("You cannot place [src] in this area!")) return return TRUE + +/obj/item/wallframe/light_fixture/small/attack_self(mob/user) + var/turf/local_turf = get_turf(user) + var/area/local_area = get_area(user) + if(!isturf(user.loc) || !isfloorturf(local_turf)) + balloon_alert(user, "cannot place here!") + return + if(local_area.always_unpowered || !local_area.static_lighting) + balloon_alert(user, "cannot place in this area!") + return + for(var/obj/object in local_turf) + if(object.density && !(object.obj_flags & IGNORE_DENSITY) || object.obj_flags & BLOCKS_CONSTRUCTION) + balloon_alert(user, "something is in the way!") + return + if(local_turf.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) + balloon_alert(user, "remove the floor plating!") + return + if(locate(/obj/structure/light_construct/floor) in local_turf) + balloon_alert(user, "already has a light!") + return + if(locate(/obj/machinery/light/floor) in local_turf) + balloon_alert(user, "already has a light!") + return + + playsound(src.loc, 'sound/machines/click.ogg', 75, TRUE) + user.visible_message(span_notice("[user.name] attaches [src] to the floor."), + span_notice("You attach [src] to the floor."), + span_hear("You hear clicking.")) + + new /obj/structure/light_construct/floor(local_turf) + qdel(src) + diff --git a/code/modules/power/pipecleaners.dm b/code/modules/power/pipecleaners.dm index 9297140b7b84..d6b6f0dbc2b6 100644 --- a/code/modules/power/pipecleaners.dm +++ b/code/modules/power/pipecleaners.dm @@ -201,7 +201,6 @@ By design, d1 is the smallest direction and d2 is the highest attack_verb_simple = list("whip", "lash", "discipline", "flog") singular_name = "pipe cleaner piece" full_w_class = WEIGHT_CLASS_SMALL - grind_results = list(/datum/reagent/copper = 2) //2 copper per pipe_cleaner in the coil usesound = 'sound/items/deconstruct.ogg' cost = 1 source = /datum/robot_energy_storage/pipe_cleaner @@ -209,6 +208,9 @@ By design, d1 is the smallest direction and d2 is the highest ///For updating inhand icons. var/pipecleaner_color = CABLE_COLOR_RED +/obj/item/stack/pipe_cleaner_coil/grind_results() + return list(/datum/reagent/copper = 2) + /obj/item/stack/pipe_cleaner_coil/cyborg/attack_self(mob/user) var/list/pipe_cleaner_colors = GLOB.cable_colors var/list/possible_colors = list() diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index fba78f4559be..82ea13b43097 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -177,7 +177,7 @@ if((amount > grid_used) && !ignore_apc && !QDELETED(local_apc.cell)) // Use from the APC's cell if there isn't enough energy from the grid. apc_used = local_apc.cell.use(amount - grid_used, force = force) - if(!force && (amount < grid_used + apc_used)) // If we aren't forcing it and there isn't enough energy to supply demand, return nothing. + if(!force && (amount > grid_used + apc_used)) // If we aren't forcing it and there isn't enough energy to supply demand, return nothing. return FALSE // Use the grid's and APC's energy. diff --git a/code/modules/power/power_store.dm b/code/modules/power/power_store.dm index 7e4852f84598..dee7151f523e 100644 --- a/code/modules/power/power_store.dm +++ b/code/modules/power/power_store.dm @@ -52,10 +52,8 @@ if (override_maxcharge) maxcharge = override_maxcharge rating = max(round(maxcharge / (rating_base * 10), 1), 1) - if(!charge) + if(!empty && !charge) charge = maxcharge - if(empty) - charge = 0 if(ratingdesc) desc += " This one has a rating of [display_energy(maxcharge)][prob(10) ? ", and you should not swallow it" : ""]." //joke works better if it's not on every cell update_appearance() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 4aa0e5a867ac..1c1c45fe59a2 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -77,7 +77,7 @@ sparks = new sparks.attach(src) sparks.set_up(5, TRUE, src) - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) /obj/machinery/power/emitter/welded/Initialize(mapload) @@ -146,14 +146,24 @@ QDEL_NULL(sparks) return ..() +/obj/machinery/power/emitter/update_overlays() + . = ..() + if(!active) + return + var/laser_color = COLOR_VIBRANT_LIME + if (!powered) + laser_color = COLOR_ORANGE //stank low power orange + else if (diskie) + laser_color = diskie.laser_color + var/mutable_appearance/overlay = mutable_appearance(icon, "emitter_overlay") + overlay.color = laser_color + . += overlay + /obj/machinery/power/emitter/update_icon_state() - if(!active || !powernet) - icon_state = base_icon_state - return ..() if(panel_open) icon_state = "[base_icon_state]_open" - return ..() - icon_state = avail(active_power_usage) ? icon_state_on : icon_state_underpowered + else + icon_state = base_icon_state return ..() /obj/machinery/power/emitter/interact(mob/user) @@ -373,6 +383,7 @@ no_shot_counter = diskie.no_shot_counter playsound(src, 'sound/machines/card_slide.ogg', 50) to_chat(user, span_notice("You update the [src]'s diode configuration with the [config_disk].")) + update_appearance() if(diskie.consumable) qdel(diskie) return ..() @@ -410,6 +421,7 @@ user.put_in_hands(diskie) diskie = null playsound(src, 'sound/machines/card_slide.ogg', 50, TRUE) + update_appearance() set_projectile() return TRUE @@ -618,6 +630,7 @@ desc = "This disk can be used on an emitter with an open panel to reset its projectile. Unless this was handed to you by an admin, you should report this on github." icon = 'icons/obj/devices/circuitry_n_data.dmi' icon_state = "datadisk6" + var/laser_color = COLOR_VIBRANT_LIME var/stored_proj = /obj/projectile/beam/emitter/hitscan var/stored_sound = 'sound/items/weapons/emitter.ogg' var/consumed_on_removal = TRUE @@ -631,6 +644,7 @@ stored_proj = /obj/projectile/beam/emitter/hitscan/bluelens consumed_on_removal = FALSE consumable = FALSE + laser_color = COLOR_TRUE_BLUE /obj/item/emitter_disk/healing name = "\improper Diode Disk: Bioregenerative" @@ -638,6 +652,7 @@ stored_proj = /obj/projectile/beam/emitter/hitscan/bioregen consumed_on_removal = FALSE consumable = FALSE + laser_color = COLOR_YELLOW /obj/item/emitter_disk/incendiary name = "\improper Diode Disk: Conflagratory" @@ -645,6 +660,8 @@ stored_proj = /obj/projectile/beam/emitter/hitscan/incend consumed_on_removal = FALSE consumable = FALSE + laser_color = COLOR_RED_LIGHT + /obj/item/emitter_disk/sanity name = "\improper Diode Disk: Psychosiphoning" @@ -652,6 +669,8 @@ stored_proj = /obj/projectile/beam/emitter/hitscan/psy consumed_on_removal = FALSE consumable = FALSE + laser_color = COLOR_TONGUE_PINK + /obj/item/emitter_disk/magnetic name = "\improper Diode Disk: Magnetogenerative" @@ -659,6 +678,7 @@ stored_proj = /obj/projectile/beam/emitter/hitscan/magnetic consumed_on_removal = FALSE consumable = FALSE + laser_color = COLOR_SILVER /obj/item/emitter_disk/blast name = "\improper Diode Disk: Hyperconcussive" @@ -666,4 +686,5 @@ stored_proj = /obj/projectile/beam/emitter/hitscan/blast consumed_on_removal = FALSE consumable = FALSE + laser_color = COLOR_SYNDIE_RED //magnetic is already grey fire_rate_mod = 2 diff --git a/code/modules/power/smes_portable.dm b/code/modules/power/smes_portable.dm index a416a946e2ce..27439e1a25ad 100644 --- a/code/modules/power/smes_portable.dm +++ b/code/modules/power/smes_portable.dm @@ -56,7 +56,12 @@ return ITEM_INTERACT_BLOCKING return ..() -/// checks if the connector is free; if not, alerts a user and returns FALSE +/** + * Checks if the connector is free + * Arguments + * + * * mob/living/user - the player doing the checking + */ /obj/machinery/power/smes/connector/proc/connector_free(mob/living/user) PRIVATE_PROC(TRUE) @@ -86,15 +91,19 @@ total_capacity = 1 for(var/obj/item/stock_parts/power_store/power_cell in component_parts) component_parts -= power_cell + SStgui.close_uis(src) update_appearance(UPDATE_OVERLAYS) -/obj/machinery/power/smes/connector/ui_act(action, params) - // prevent UI interactions if there's no SMES +/obj/machinery/power/smes/connector/ui_interact(mob/user, datum/tgui/ui) if(!connected_smes) - balloon_alert(usr, "needs a connected SMES!") + balloon_alert(user, "no power bank!") return FALSE + return ..() +/obj/machinery/power/smes/connector/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + return connected_smes ? ..() : FALSE + /// The actual portable part of the portable SMES system. Pretty useless without an actual connector. /obj/machinery/smesbank name = "portable power storage unit" @@ -195,7 +204,6 @@ // adapted from portable atmos connection code /obj/machinery/smesbank/wrench_act(mob/living/user, obj/item/wrench) if(connected_port) - wrench.play_tool_sound(src) if(!wrench.use_tool(src, user, 8 SECONDS)) return ITEM_INTERACT_BLOCKING user.visible_message( \ @@ -208,14 +216,9 @@ return ITEM_INTERACT_SUCCESS var/obj/machinery/power/smes/connector/possible_connector = locate(/obj/machinery/power/smes/connector) in loc - if(!possible_connector) - to_chat(user, span_notice("There's no power connector to connect to.")) - return ITEM_INTERACT_BLOCKING - wrench.play_tool_sound(src) - if(!wrench.use_tool(src, user, 4 SECONDS)) + if(!wrench.use_tool(src, user, 4 SECONDS, extra_checks = CALLBACK(src, PROC_REF(connect_port), possible_connector, user, TRUE))) return ITEM_INTERACT_BLOCKING - if(!connect_port(possible_connector)) - to_chat(user, span_notice("[src] failed to connect to [possible_connector].")) + if(!connect_port(possible_connector, user)) return ITEM_INTERACT_BLOCKING user.visible_message( \ "[user] connects [src].", \ @@ -231,30 +234,39 @@ update_appearance(UPDATE_OVERLAYS) return ITEM_INTERACT_SUCCESS -/obj/machinery/smesbank/default_deconstruction_crowbar(obj/item/crowbar/crowbar) - if(istype(crowbar) && connected_port) - balloon_alert(usr, "disconnect from [connected_port] first!") +/obj/machinery/smesbank/crowbar_act(mob/living/user, obj/item/tool) + if(connected_port) + balloon_alert(user, "disconnect from [connected_port] first!") return ITEM_INTERACT_FAILURE - return ..() + + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS /** * Attempt to connect the portable SMES to a given connector. Adapted from portable atmos connection code. * * Arguments * * obj/machinery/power/smes/connector/possible_connector - the connector we are trying to link with + * * mob/living/user - the mob trying to connect the port + * * check_only - don't connect but check if we can */ -/obj/machinery/smesbank/proc/connect_port(obj/machinery/power/smes/connector/possible_connector) +/obj/machinery/smesbank/proc/connect_port(obj/machinery/power/smes/connector/possible_connector, mob/living/user, check_only = FALSE) PRIVATE_PROC(TRUE) - //Make sure not already connected to something else - if(connected_port || !possible_connector || possible_connector.connected_smes || possible_connector.panel_open) + if(QDELETED(possible_connector)) + if(user) + balloon_alert(user, "no connector!") return FALSE - //Make sure are close enough for a valid connection - if(possible_connector.loc != get_turf(src)) + //Make sure not already connected to something else + if(possible_connector.panel_open) + if(user) + balloon_alert(user, "close connector panel!") return FALSE //Perform the connection + if(check_only) + return TRUE connected_port = possible_connector connected_port.connect_smes(src) set_anchored(TRUE) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index db5c1d0ac584..ce521b097524 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -1100,6 +1100,54 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) SIGNAL_HANDLER examine_list += span_info("There's a santa hat placed atop it. How it got there without being dusted is a mystery.") +// Warp Effect // + +/atom/movable/warp_effect + plane = DISPLACEMENT_PLANE + appearance_flags = PIXEL_SCALE|LONG_GLIDE // no tile bound so you can see it around corners and so + icon = 'icons/effects/light_overlays/light_352.dmi' + icon_state = "light" + pixel_x = -176 + pixel_y = -176 + +/atom/movable/warp_effect/Initialize(mapload) + . = ..() + var/turf/new_turf = get_turf(src) + if(new_turf) + var/new_offset = GET_TURF_PLANE_OFFSET(new_turf) + ADD_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(new_offset), ref(src)) + +/atom/movable/warp_effect/Destroy(force) + // Just in case I've forgotten how the movement api works + var/offset = GET_TURF_PLANE_OFFSET(loc) + REMOVE_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(offset), ref(src)) + return ..() + +/atom/movable/warp_effect/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + . = ..() + var/turf/new_turf = get_turf(src) + var/turf/old_turf = get_turf(old_loc) + if(!new_turf) + var/old_offset = GET_TURF_PLANE_OFFSET(old_turf) + REMOVE_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(old_offset), ref(src)) + return + else if(get_turf(old_loc)) + return + // If we're in a thing on a turf we COUNT as a distortion source + var/new_offset = GET_TURF_PLANE_OFFSET(new_turf) + ADD_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(new_offset), ref(src)) + +/atom/movable/warp_effect/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) + . = ..() + if(same_z_layer) + return + if(old_turf) + var/old_offset = GET_TURF_PLANE_OFFSET(old_turf) + REMOVE_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(old_offset), ref(src)) + if(new_turf) + var/new_offset = GET_TURF_PLANE_OFFSET(new_turf) + ADD_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(new_offset), ref(src)) + #undef BIKE #undef COIL #undef ROD diff --git a/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm b/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm index 3cb6c8fd82c3..b883e051a044 100644 --- a/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm +++ b/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm @@ -168,7 +168,7 @@ investigate_log("was entered by [key_name(consumed_mob)].", INVESTIGATE_ENGINE) consumed_mob.forceMove(arrival_turf) consumed_mob.Paralyze(100) - consumed_mob.adjustBruteLoss(30) + consumed_mob.adjust_brute_loss(30) consumed_mob.flash_act(1, TRUE, TRUE) new /obj/effect/particle_effect/sparks(consumed_object) diff --git a/code/modules/power/supermatter/supermatter_variants.dm b/code/modules/power/supermatter/supermatter_variants.dm index 270994d0a101..146c5b345457 100644 --- a/code/modules/power/supermatter/supermatter_variants.dm +++ b/code/modules/power/supermatter/supermatter_variants.dm @@ -61,6 +61,7 @@ icon_state = "sm_small" moveable = TRUE anchored = FALSE + custom_materials = list(/datum/material/adamantine = SHEET_MATERIAL_AMOUNT * 20, /datum/material/iron = SHEET_MATERIAL_AMOUNT) /obj/machinery/power/supermatter_crystal/small/Initialize(mapload) . = ..() @@ -76,3 +77,4 @@ throw_speed = 1 throw_range = 1 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + custom_materials = list(/datum/material/adamantine = SHEET_MATERIAL_AMOUNT * 20) diff --git a/code/modules/power/thermoelectric_generator.dm b/code/modules/power/thermoelectric_generator.dm index bded1482825f..9d5fd1d38501 100644 --- a/code/modules/power/thermoelectric_generator.dm +++ b/code/modules/power/thermoelectric_generator.dm @@ -31,7 +31,7 @@ /obj/machinery/power/thermoelectric_generator/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) find_circulators() connect_to_network() SSair.start_processing_machine(src) diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index e0cc6e089204..fa3aa1e13004 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -16,6 +16,8 @@ var/caliber = null ///The bullet type to create when New() is called var/projectile_type = null + ///Muzzle flash color based on ammo casing. + var/muzzle_flash_color = LIGHT_COLOR_ORANGE ///the loaded projectile in this ammo casing var/obj/projectile/loaded_projectile = null ///Pellets for spreadshot diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index 510f7b1253da..4b307119bbcf 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -86,6 +86,7 @@ firing_dir = get_dir(fired_from, target) if(!loaded_projectile.suppressed && firing_effect_type && !tk_firing(user, fired_from)) new firing_effect_type(user || get_turf(src), firing_dir) + SEND_SIGNAL(SSdcs, COMSIG_GLOB_REPORT_CRIME, CRIME_GUNSHOTS, get_turf(src)) var/direct_target if(target && curloc.Adjacent(targloc, target=targloc, mover=src)) //if the target is right on our location or adjacent (including diagonally if reachable) we'll skip the travelling code in the proj's fire() diff --git a/code/modules/projectiles/ammunition/ballistic/junk.dm b/code/modules/projectiles/ammunition/ballistic/junk.dm index 99a9b637923f..2ec346b7d214 100644 --- a/code/modules/projectiles/ammunition/ballistic/junk.dm +++ b/code/modules/projectiles/ammunition/ballistic/junk.dm @@ -6,7 +6,7 @@ icon_state = "improvshell" caliber = CALIBER_JUNK projectile_type = /obj/projectile/bullet/junk - custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*2, /datum/material/glass=SMALL_MATERIAL_AMOUNT*1) + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 2, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1) // Junk Shell Spawner; used to spawn in our random shells upon crafting diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm index 2ec850950b03..554ca4c57a15 100644 --- a/code/modules/projectiles/ammunition/ballistic/rifle.dm +++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm @@ -64,6 +64,7 @@ base_icon_state = "rod_sharp" projectile_type = /obj/projectile/bullet/rebar newtonian_force = 1.5 + custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) /obj/item/ammo_casing/rebar/Initialize(mapload) . = ..() @@ -104,6 +105,7 @@ icon_state = "rod_healium" base_icon_state = "rod_healium" projectile_type = /obj/projectile/bullet/rebar/healium + custom_materials = null /// How many seconds of healing/sleeping action we have left, once all are spent the bolt dissolves var/heals_left = 6 SECONDS @@ -145,16 +147,16 @@ casing.heals_left -= seconds_per_tick * 1 SECONDS var/update_health = FALSE var/healing = -healing_per_second * seconds_per_tick - update_health += owner.adjustBruteLoss(healing, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) - update_health += owner.adjustFireLoss(healing, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) - update_health += owner.adjustToxLoss(healing, updating_health = FALSE, required_biotype = BODYTYPE_ORGANIC) - update_health += owner.adjustOxyLoss(healing, updating_health = FALSE, required_biotype = BODYTYPE_ORGANIC) + update_health += owner.adjust_brute_loss(healing, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + update_health += owner.adjust_fire_loss(healing, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + update_health += owner.adjust_tox_loss(healing, updating_health = FALSE, required_biotype = MOB_ORGANIC) + update_health += owner.adjust_oxy_loss(healing, updating_health = FALSE, required_biotype = MOB_ORGANIC) if (update_health) owner.updatehealth() if (can_sleep && (owner.mob_biotypes & MOB_ORGANIC)) owner.adjust_drowsiness(drowsy_per_second * seconds_per_tick) var/datum/status_effect/drowsiness/drowsiness = owner.has_status_effect(/datum/status_effect/drowsiness) - if (drowsiness?.duration - world.time >= drowsy_knockout) + if (drowsiness?.duration >= drowsy_knockout) owner.Sleeping(3 SECONDS) if (casing.heals_left <= 0) fall_out() @@ -181,3 +183,4 @@ base_icon_state = "paperball" projectile_type = /obj/projectile/bullet/paperball newtonian_force = 0.5 + custom_materials = list(/datum/material/paper = HALF_SHEET_MATERIAL_AMOUNT / 2) diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index 223b8346f07c..acdecca4b00a 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -66,6 +66,7 @@ desc = "A shotgun shell rigged with CMC technology, which launches a massive slug when fired." icon_state = "mshell" projectile_type = /obj/projectile/bullet/cannonball/meteorslug + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 8, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 4) /obj/item/ammo_casing/shotgun/pulseslug name = "pulse slug" @@ -74,6 +75,7 @@ would have difficulty with." icon_state = "pshell" projectile_type = /obj/projectile/beam/pulse/shotgun + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.1, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.2) /obj/item/ammo_casing/shotgun/frag12 name = "FRAG-12 slug" @@ -161,6 +163,7 @@ pellets = 4 variance = 15 randomspread = TRUE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.7) /obj/item/ammo_casing/shotgun/scatterlaser name = "scatter laser shell" diff --git a/code/modules/projectiles/ammunition/energy/_energy.dm b/code/modules/projectiles/ammunition/energy/_energy.dm index 29e3d635585e..1ec145650f1f 100644 --- a/code/modules/projectiles/ammunition/energy/_energy.dm +++ b/code/modules/projectiles/ammunition/energy/_energy.dm @@ -9,3 +9,4 @@ fire_sound = 'sound/items/weapons/laser.ogg' firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/red newtonian_force = 0.5 + muzzle_flash_color = LIGHT_COLOR_CYAN diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index 1168a2b3814f..4ae41e99ce99 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -2,31 +2,45 @@ projectile_type = /obj/projectile/beam/laser e_cost = LASER_SHOTS(12, STANDARD_CELL_CHARGE) select_name = "kill" + muzzle_flash_color = COLOR_SOFT_RED /obj/item/ammo_casing/energy/laser/hellfire projectile_type = /obj/projectile/beam/laser/hellfire e_cost = LASER_SHOTS(10, STANDARD_CELL_CHARGE) select_name = "maim" +/obj/item/ammo_casing/energy/laser/accelerator + projectile_type = /obj/projectile/beam/laser/accelerator + select_name = "accelerator" + fire_sound = 'sound/items/weapons/lasercannonfire.ogg' + /obj/item/ammo_casing/energy/lasergun projectile_type = /obj/projectile/beam/laser e_cost = LASER_SHOTS(16, STANDARD_CELL_CHARGE) select_name = "kill" + muzzle_flash_color = COLOR_SOFT_RED -/obj/item/ammo_casing/energy/lasergun/carbine - projectile_type = /obj/projectile/beam/laser/carbine +/obj/item/ammo_casing/energy/lasergun/pistol + e_cost = LASER_SHOTS(10, STANDARD_CELL_CHARGE) + +/obj/item/ammo_casing/energy/lasergun/assault + projectile_type = /obj/projectile/beam/laser/rapid e_cost = LASER_SHOTS(40, STANDARD_CELL_CHARGE) + +/obj/item/ammo_casing/energy/lasergun/carbine + projectile_type = /obj/projectile/beam/laser/rapid + e_cost = LASER_SHOTS(26, STANDARD_CELL_CHARGE) select_name = "kill" fire_sound = 'sound/items/weapons/laser2.ogg' -/obj/item/ammo_casing/energy/lasergun/carbine/cybersun - projectile_type = /obj/projectile/beam/laser/carbine/cybersun +/obj/item/ammo_casing/energy/lasergun/cybersun + projectile_type = /obj/projectile/beam/laser/cybersun e_cost = LASER_SHOTS(54, STANDARD_CELL_CHARGE) select_name = "rapid fire" fire_sound = 'sound/items/weapons/laser2.ogg' /obj/item/ammo_casing/energy/lasergun/carbine/practice - projectile_type = /obj/projectile/beam/laser/carbine/practice + projectile_type = /obj/projectile/beam/laser/rapid/practice select_name = "practice" harmful = FALSE @@ -47,6 +61,13 @@ pellets = 3 variance = 10 +/obj/item/ammo_casing/energy/laser/musket/repeater + projectile_type = /obj/projectile/beam/laser/musket/repeater + pellets = 2 + variance = 10 + fire_sound = 'sound/items/weapons/thermalpistol.ogg' + e_cost = LASER_SHOTS(6, STANDARD_CELL_CHARGE) + /obj/item/ammo_casing/energy/laser/practice projectile_type = /obj/projectile/beam/practice select_name = "practice" @@ -100,6 +121,7 @@ select_name = "DESTROY" fire_sound = 'sound/items/weapons/pulse.ogg' firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/blue + muzzle_flash_color = LIGHT_COLOR_BLUE /obj/item/ammo_casing/energy/laser/bluetag projectile_type = /obj/projectile/beam/lasertag/bluetag diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm index 7ed56c0ddd0d..7cf649b393ed 100644 --- a/code/modules/projectiles/ammunition/energy/special.dm +++ b/code/modules/projectiles/ammunition/energy/special.dm @@ -3,6 +3,7 @@ select_name = "ion" fire_sound = 'sound/items/weapons/ionrifle.ogg' firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/blue + muzzle_flash_color = LIGHT_COLOR_BLUE /obj/item/ammo_casing/energy/ion/hos projectile_type = /obj/projectile/ion/weak diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm index b1a4131176a6..f8c0d41b0e15 100644 --- a/code/modules/projectiles/ammunition/energy/stun.dm +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -5,6 +5,7 @@ e_cost = LASER_SHOTS(5, STANDARD_CELL_CHARGE) harmful = FALSE firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect + muzzle_flash_color = LIGHT_COLOR_DIM_YELLOW /obj/item/ammo_casing/energy/electrode/spec e_cost = LASER_SHOTS(10, STANDARD_CELL_CHARGE) @@ -26,6 +27,7 @@ fire_sound = 'sound/items/weapons/taser2.ogg' harmful = FALSE firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/blue + muzzle_flash_color = LIGHT_COLOR_CYAN /obj/item/ammo_casing/energy/disabler/smg projectile_type = /obj/projectile/beam/disabler/weak diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index f5c123866b39..355ce2cb530a 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -45,9 +45,16 @@ /obj/item/ammo_box/Initialize(mapload) . = ..() - custom_materials = SSmaterials.FindOrCreateMaterialCombo(custom_materials, 0.1) if(!start_empty) top_off(starting=TRUE) + else if(custom_materials && !(item_flags & ABSTRACT)) //internal magazines are abstract + var/obj/item/ammo_casing/prototype = new ammo_type + var/list/new_materials = custom_materials?.Copy() + for(var/mat in prototype.custom_materials) + new_materials[mat] -= prototype.custom_materials[mat] * max_ammo + qdel(prototype) + set_custom_materials(new_materials) + update_icon_state() /obj/item/ammo_box/Destroy(force) @@ -64,6 +71,11 @@ /obj/item/ammo_box/proc/remove_from_stored_ammo(atom/movable/gone) stored_ammo -= gone + if(gone.custom_materials && custom_materials && !(item_flags & ABSTRACT)) + var/list/new_materials = custom_materials?.Copy() + for(var/mat in gone.custom_materials) + new_materials[mat] -= gone.custom_materials[mat] + set_custom_materials(new_materials) update_appearance() /obj/item/ammo_box/add_weapon_description() @@ -108,8 +120,21 @@ stack_trace("Tried loading unsupported ammocasing type [load_type] into ammo box [type].") return + var/list/new_materials = null + if(!(item_flags & ABSTRACT)) + new_materials = custom_materials?.Copy() || list() for(var/i in max(1, stored_ammo.len + 1) to max_ammo) - stored_ammo += starting ? round_check : new round_check(src) + var/obj/item/ammo_casing/casing = round_check + if(!starting) + casing = new round_check(src) + if(new_materials) + for(var/mat in casing.custom_materials) + new_materials[mat] += casing.custom_materials[mat] + stored_ammo += casing + + if(!starting && length(new_materials)) + set_custom_materials(new_materials) + update_appearance() ///gets a round from the magazine @@ -141,6 +166,11 @@ if (stored_ammo.len < max_ammo) stored_ammo += new_round new_round.forceMove(src) + if(new_round.custom_materials && !(item_flags & ABSTRACT)) + var/list/new_materials = custom_materials?.Copy() || list() + for(var/mat in new_round.custom_materials) + new_materials[mat] += new_round.custom_materials[mat] + set_custom_materials(new_materials) return TRUE if(!replace_spent) @@ -168,7 +198,7 @@ if(!ammo_band_icon) balloon_alert(user, "no indicator support!") return - var/new_color = input(user, "Set a new ammo band color, cancel to remove indicator", "Ammo Box Indicator Color", ammo_band_color) as color|null + var/new_color = tgui_color_picker(user, "Set a new ammo band color, cancel to remove indicator", "Ammo Box Indicator Color", ammo_band_color) ammo_band_color = new_color balloon_alert(user, "indicator updated") update_appearance() diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm index 250ec30af39a..7fbece15863e 100644 --- a/code/modules/projectiles/boxes_magazines/external/pistol.dm +++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm @@ -104,6 +104,12 @@ max_ammo = 8 multiple_sprites = AMMO_BOX_PER_BULLET multiple_sprite_use_base = TRUE + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 10, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 10, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 10, + /datum/material/plasma = SHEET_MATERIAL_AMOUNT * 10, + ) // M1911 (.45) // diff --git a/code/modules/projectiles/boxes_magazines/external/rifle.dm b/code/modules/projectiles/boxes_magazines/external/rifle.dm index 9ef05f653beb..41f9ec154927 100644 --- a/code/modules/projectiles/boxes_magazines/external/rifle.dm +++ b/code/modules/projectiles/boxes_magazines/external/rifle.dm @@ -24,7 +24,7 @@ ammo_type = /obj/item/ammo_casing/c38 caliber = CALIBER_38 custom_materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT * 3, + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT * 4, /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT * 1, ) max_ammo = 15 @@ -58,7 +58,7 @@ /obj/item/ammo_box/magazine/m38/true name = "battle rifle magazine (.38 True Strike)" - desc = parent_type::desc + " Bullets bounce towards new targets with surprising accuracy." + desc = parent_type::desc + " Bullets bounce towards new targets with surprising accuracy and can strike through armored target" ammo_type = /obj/item/ammo_casing/c38/match/true ammo_band_color = COLOR_AMMO_TRUESTRIKE diff --git a/code/modules/projectiles/boxes_magazines/internal/_internal.dm b/code/modules/projectiles/boxes_magazines/internal/_internal.dm index 43b34979e44d..238ac94406d2 100644 --- a/code/modules/projectiles/boxes_magazines/internal/_internal.dm +++ b/code/modules/projectiles/boxes_magazines/internal/_internal.dm @@ -4,6 +4,7 @@ spawn_blacklisted = TRUE obj_flags = CONDUCTS_ELECTRICITY item_flags = ABSTRACT + custom_materials = null //we are never gonna be recycled anyway //internals magazines are accessible, so replace spent ammo if full when trying to put a live one in /obj/item/ammo_box/magazine/internal/give_round(obj/item/ammo_casing/R) diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm index ef14b2701a39..da58c2a97021 100644 --- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm +++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm @@ -12,7 +12,7 @@ max_ammo = 4 /obj/item/ammo_box/magazine/internal/shot/tube/fire - ammo_type = /obj/projectile/bullet/incendiary/shotgun/no_trail + ammo_type = /obj/item/ammo_casing/shotgun/incendiary/no_trail /obj/item/ammo_box/magazine/internal/shot/tube/buckshot ammo_type = /obj/item/ammo_casing/shotgun/buckshot diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index c33d36dd5893..277cadb5ab20 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -24,19 +24,31 @@ attack_verb_simple = list("strike", "hit", "bash") action_slots = ALL + // Muzzle Flash + light_on = FALSE + light_system = OVERLAY_LIGHT_DIRECTIONAL + light_range = 3 + light_color = LIGHT_COLOR_ORANGE + light_power = 0.5 + var/can_muzzle_flash = TRUE + /// Muzzle Flash Duration + var/light_time = 0.1 SECONDS + var/gun_flags = NONE + var/fire_sound = 'sound/items/weapons/gun/pistol/shot.ogg' var/vary_fire_sound = TRUE var/fire_sound_volume = 50 var/dry_fire_sound = 'sound/items/weapons/gun/general/dry_fire.ogg' var/dry_fire_sound_volume = 30 - var/suppressed = null //whether or not a message is displayed when fired + /// Whether or not a message is displayed when fired + var/suppressed = SUPPRESSED_NONE var/can_suppress = FALSE var/suppressed_sound = 'sound/items/weapons/gun/general/heavy_shot_suppressed.ogg' var/suppressed_volume = 60 - /// whether a gun can be unsuppressed. for ballistics, also determines if it generates a suppressor overlay + /// Whether a gun can be unsuppressed. for ballistics, also determines if it generates a suppressor overlay var/can_unsuppress = TRUE - var/recoil = 0 //boom boom shake the room + var/clumsy_check = TRUE var/obj/item/ammo_casing/chambered = null trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers @@ -46,18 +58,21 @@ /// Delay between shots in a burst. var/burst_delay = 2 /// Delay between bursts (if burst-firing) or individual shots (if weapon is single-fire). - var/fire_delay = 0 + var/fire_delay = 0 SECONDS var/firing_burst = 0 //Prevent the weapon from firing again while already firing /// firing cooldown, true if this gun shouldn't be allowed to manually fire var/fire_cd = 0 var/weapon_weight = WEAPON_LIGHT - var/dual_wield_spread = 24 //additional spread when dual wielding ///Can we hold up our target with this? Default to yes var/can_hold_up = TRUE /// If TRUE, and we aim at ourselves, it will initiate a do after to fire at ourselves. /// If FALSE it will just try to fire at ourselves straight up. var/doafter_self_shoot = TRUE + /// If TRUE, will fire ITEM_INTERACT_BLOCKING (melee, etc) if the gun has a round already in the chamber, and is waiting to be fired (but cant, usually due to waiting on fire_delay). + /// If FALSE, nothing changed. + var/chambered_attack_block = FALSE + /// Just 'slightly' snowflakey way to modify projectile damage for projectiles fired from this gun. var/projectile_damage_multiplier = 1 @@ -70,6 +85,18 @@ 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. + var/dual_wield_spread = 24 //additional spread when dual wielding + + ///Screen shake when the weapon is fired + var/recoil = 0 + ///a multiplier of the duration the recoil takes to go back to normal view, this is (recoil*recoil_backtime_multiplier)+1 + var/recoil_backtime_multiplier = 1.5 + ///this is how much deviation the gun recoil can have, recoil pushes the screen towards the reverse angle you shot + some deviation which this is the max. + var/recoil_deviation = 20 + /// Used as the min value when calculating recoil + /// Affected by a player's min_recoil_multiplier preference, so keep in mind it can ultimately be 0 regardless + /// Often utilized as a "purely visual" form of recoil (as it can be disabled) + var/min_recoil = 0 lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' @@ -90,7 +117,7 @@ . = ..() if(ispath(pin)) pin = new pin - pin.gun_insert(new_gun = src) + pin.gun_insert(new_gun = src, starting = TRUE) add_seclight_point() add_bayonet_point() @@ -98,10 +125,7 @@ /obj/item/gun/Destroy() if(isobj(pin)) //Can still be the initial path, then we skip QDEL_NULL(pin) - if(chambered) //Not all guns are chambered (EMP'ed energy guns etc) - QDEL_NULL(chambered) - if(isatom(suppressed)) //SUPPRESSED IS USED AS BOTH A TRUE/FALSE AND AS A REF, WHAT THE FUCKKKKKKKKKKKKKKKKK - QDEL_NULL(suppressed) + QDEL_NULL(chambered) return ..() /obj/item/gun/apply_fantasy_bonuses(bonus) @@ -133,20 +157,20 @@ if(gone == chambered) chambered = null update_appearance() - if(gone == suppressed) - clear_suppressor() -///Clears var and updates icon. In the case of ballistic weapons, also updates the gun's weight. +/// Clears var and updates icon. /obj/item/gun/proc/clear_suppressor() if(!can_unsuppress) return - suppressed = null + suppressed = SUPPRESSED_NONE update_appearance() /obj/item/gun/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(isliving(hit_atom)) var/mob/living/thrower = throwingdatum?.get_thrower() + if(!isliving(thrower)) + return toss_gun_hard(thrower, hit_atom) /obj/item/gun/proc/toss_gun_hard(mob/living/thrower, mob/living/target) //throw a gun at them. They don't expect it. @@ -205,10 +229,22 @@ else playsound(src, fire_sound, fire_sound_volume, vary_fire_sound) +/obj/item/gun/proc/muzzle_flash_on() + if (can_muzzle_flash) + set_light_on(TRUE) + addtimer(CALLBACK(src, PROC_REF(muzzle_flash_off)), light_time, TIMER_UNIQUE | TIMER_OVERRIDE) + else + muzzle_flash_off() + +/obj/item/gun/proc/muzzle_flash_off() + set_light_on(FALSE) + /obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = FALSE, atom/pbtarget = null, message = TRUE) - if(recoil && !tk_firing(user)) - shake_camera(user, recoil + 1, recoil) + if(!tk_firing(user)) + var/actual_angle = get_angle((user || get_turf(src)), pbtarget) + simulate_recoil(user, recoil, actual_angle) fire_sounds() + muzzle_flash_on() if(suppressed || !message) return FALSE if(tk_firing(user)) @@ -304,9 +340,10 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/item/gun/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - if(try_fire_gun(interacting_with, user, list2params(modifiers))) - return ITEM_INTERACT_SUCCESS - return NONE + var/fired = try_fire_gun(interacting_with, user, list2params(modifiers)) + if(!fired && chambered_attack_block == TRUE && can_shoot() && isliving(interacting_with)) + return ITEM_INTERACT_BLOCKING + return fired /obj/item/gun/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) if(user.combat_mode && isliving(interacting_with)) @@ -328,9 +365,7 @@ return ITEM_INTERACT_SUCCESS /obj/item/gun/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - if(try_fire_gun(interacting_with, user, list2params(modifiers))) - return ITEM_INTERACT_SUCCESS - return ITEM_INTERACT_BLOCKING + return try_fire_gun(interacting_with, user, list2params(modifiers)) /obj/item/gun/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) if(IN_GIVEN_RANGE(user, interacting_with, GUNPOINT_SHOOTER_STRAY_RANGE)) @@ -342,49 +377,42 @@ /obj/item/gun/proc/fire_gun(atom/target, mob/living/user, flag, params) if(QDELETED(target)) - return + return NONE if(firing_burst) - return + return NONE if(SEND_SIGNAL(user, COMSIG_MOB_TRYING_TO_FIRE_GUN, src, target, flag, params) & COMPONENT_CANCEL_GUN_FIRE) - return + return NONE if(SEND_SIGNAL(src, COMSIG_GUN_TRY_FIRE, user, target, flag, params) & COMPONENT_CANCEL_GUN_FIRE) - return + return NONE if(flag) //It's adjacent, is the user, or is on the user's person if(target in user.contents) //can't shoot stuff inside us. - return + return NONE if(!ismob(target)) //melee attack - return + return NONE if(target == user && (user.zone_selected != BODY_ZONE_PRECISE_MOUTH && doafter_self_shoot)) //so we can't shoot ourselves (unless mouth selected) - return - if(iscarbon(target)) - var/mob/living/carbon/C = target - for(var/i in C.all_wounds) - var/datum/wound/W = i - if(W.try_treating(src, user)) - return // another coward cured! + return NONE if(istype(user))//Check if the user can use the gun, if the user isn't alive(turrets) assume it can. var/mob/living/L = user if(!can_trigger_gun(L)) - return + return NONE if(flag && doafter_self_shoot && user.zone_selected == BODY_ZONE_PRECISE_MOUTH) - handle_suicide(user, target, params) - return + return handle_suicide(user, target, params) if(!can_shoot()) //Just because you can pull the trigger doesn't mean it can shoot. shoot_with_empty_chamber(user) - return + return ITEM_INTERACT_BLOCKING if(check_botched(user, target)) - return + return NONE var/obj/item/bodypart/other_hand = user.has_hand_for_held_index(user.get_inactive_hand_index()) //returns non-disabled inactive hands if(weapon_weight == WEAPON_HEAVY && (user.get_inactive_held_item() || !other_hand)) balloon_alert(user, "use both hands!") - return + return ITEM_INTERACT_BLOCKING //DUAL (or more!) WIELDING var/bonus_spread = 0 var/loop_counter = 0 @@ -455,7 +483,7 @@ else //Smart 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)) + if(!chambered.fire_casing(target, user, params, 0, suppressed, zone_override, sprd, src)) shoot_with_empty_chamber(user) firing_burst = FALSE return FALSE @@ -474,6 +502,39 @@ update_appearance() return TRUE +/** + * Calculates the final recoil value applied when firing a gun. + * + * Arguments: + * * user - The living mob attempting to fire the gun. Used for preference lookups. + * * recoil_amount - The raw recoil value to be processed before clamping. + * + * Returns: + * The clamped recoil value after applying all modifiers. + */ +/obj/item/gun/proc/calculate_recoil(mob/living/user, recoil_amount = 0) + var/used_min_recoil = min_recoil + if(user.client) + used_min_recoil *= (user.client.prefs.read_preference(/datum/preference/numeric/min_recoil_multiplier) / 100) + return clamp(recoil_amount, used_min_recoil, INFINITY) + +/** + * Simulates firearm recoil and applies camera feedback when firing. + * + * Arguments: + * * user - The mob firing the gun. Used for recoil calculation and camera shake. + * * recoil_amount - The base recoil value before modifiers. + * * firing_angle - The firing direction used to determine camera kick direction. + */ +/obj/item/gun/proc/simulate_recoil(mob/living/user, recoil_amount = 0, firing_angle) + var/total_recoil = calculate_recoil(user, recoil_amount) + + var/actual_angle = firing_angle + rand(-recoil_deviation, recoil_deviation) + 180 + if(actual_angle > 360) + actual_angle -= 360 + if(total_recoil > 0) + recoil_camera(user, total_recoil + 1, (total_recoil * recoil_backtime_multiplier)+1, total_recoil, actual_angle) + ///returns true if the gun successfully fires /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 @@ -488,7 +549,7 @@ add_fingerprint(user) if(fire_cd) - return + return NONE //Vary by at least this much var/randomized_bonus_spread = rand(base_bonus_spread, bonus_spread) @@ -513,12 +574,12 @@ 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 + return NONE 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)) + if(!chambered.fire_casing(target, user, params, 0, suppressed, zone_override, sprd, src)) shoot_with_empty_chamber(user) - return + return NONE else if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot shoot_live_shot(user, TRUE, target, message) @@ -526,7 +587,7 @@ shoot_live_shot(user, FALSE, target, message) else shoot_with_empty_chamber(user) - return + return NONE // If gun gets destroyed as a result of firing if (!QDELETED(src)) process_chamber() @@ -599,10 +660,10 @@ /obj/item/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer) if(!ishuman(user) || !ishuman(target)) - return + return NONE if(fire_cd) - return + return NONE if(user == target) target.visible_message(span_warning("[user] sticks [src] in [user.p_their()] mouth, ready to pull the trigger..."), \ @@ -620,28 +681,33 @@ else if(target?.Adjacent(user)) target.visible_message(span_notice("[user] has decided to spare [target]"), span_notice("[user] has decided to spare your life!")) fire_cd = FALSE - return + return ITEM_INTERACT_BLOCKING fire_cd = FALSE target.visible_message(span_warning("[user] pulls the trigger!"), span_userdanger("[(user == target) ? "You pull" : "[user] pulls"] the trigger!")) - if(chambered?.loaded_projectile) - chambered.loaded_projectile.damage *= 5 - if(chambered.loaded_projectile.wound_bonus != CANT_WOUND) - chambered.loaded_projectile.wound_bonus += 5 // much more dramatic on multiple pellet'd projectiles really + if(!chambered?.loaded_projectile) + shoot_with_empty_chamber() + return ITEM_INTERACT_BLOCKING + + chambered.loaded_projectile.damage *= 5 + if(chambered.loaded_projectile.wound_bonus != CANT_WOUND) + chambered.loaded_projectile.wound_bonus += 5 // much more dramatic on multiple pellet'd projectiles really var/fired = process_fire(target, user, TRUE, params, BODY_ZONE_HEAD) if(!fired && chambered?.loaded_projectile) chambered.loaded_projectile.damage /= 5 if(chambered.loaded_projectile.wound_bonus != CANT_WOUND) chambered.loaded_projectile.wound_bonus -= 5 + return NONE + return ITEM_INTERACT_SUCCESS /obj/item/gun/proc/unlock() //used in summon guns and as a convience for admins if(pin) qdel(pin) var/obj/item/firing_pin/new_pin = new - new_pin.gun_insert(new_gun = src) + new_pin.gun_insert(new_gun = src, starting = TRUE) //Happens before the actual projectile creation /obj/item/gun/proc/before_firing(atom/target,mob/user) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 4218c3027b0c..119a82cca5ec 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -9,7 +9,8 @@ pickup_sound = 'sound/items/handling/gun/gun_pick_up.ogg' drop_sound = 'sound/items/handling/gun/gun_drop.ogg' sound_vary = TRUE - unique_reskin_changes_base_icon_state = TRUE + + min_recoil = 0.1 ///sound when inserting magazine var/load_sound = 'sound/items/weapons/gun/general/magazine_insert_full.ogg' @@ -140,6 +141,10 @@ var/burst_fire_selection = FALSE /// If it has an icon for a selector switch indicating current firemode. var/selector_switch_icon = FALSE + /// Suppressor attached to the gun, if any + var/obj/item/suppressor/suppressor = null + /// Sound played when the burst mode is changed + var/burst_select_sound = SFX_FIRE_MODE_SWITCH /obj/item/gun/ballistic/Initialize(mapload) . = ..() @@ -162,8 +167,14 @@ /obj/item/gun/ballistic/Destroy() QDEL_NULL(magazine) + QDEL_NULL(suppressor) return ..() +/obj/item/gun/ballistic/Exited(atom/movable/gone, direction) + . = ..() + if(gone == suppressor) + clear_suppressor() + /obj/item/gun/ballistic/add_weapon_description() AddElement(/datum/element/weapon_description, attached_proc = PROC_REF(add_notes_ballistic)) @@ -280,14 +291,17 @@ burst_fire_selection = !burst_fire_selection if(!burst_fire_selection) burst_size = 1 - fire_delay = 0 + fire_delay = 0 SECONDS balloon_alert(user, "switched to semi-automatic") else burst_size = initial(burst_size) fire_delay = initial(fire_delay) balloon_alert(user, "switched to [burst_size]-round burst") - playsound(user, 'sound/items/weapons/empty.ogg', 100, TRUE) + if(burst_select_sound) + playsound(user, burst_select_sound, 50, TRUE) + else + playsound(user, 'sound/items/weapons/empty.ogg', 100, TRUE) update_appearance() update_item_action_buttons() @@ -534,7 +548,7 @@ return ITEM_INTERACT_FAILURE if(suppressed) - balloon_alert(user, "already has a supressor!") + balloon_alert(user, "already has a suppressor!") return ITEM_INTERACT_FAILURE if(!user.transferItemToLoc(tool, src)) @@ -551,7 +565,7 @@ /obj/item/gun/ballistic/proc/load_gun(obj/item/ammo, mob/living/user) if (chambered && !chambered.loaded_projectile) chambered.forceMove(drop_location()) - if(chambered != magazine?.stored_ammo[1]) + if(length(magazine?.stored_ammo) && chambered != magazine.stored_ammo[1]) magazine.stored_ammo -= chambered chambered = null @@ -595,27 +609,30 @@ return ..() ///Installs a new suppressor, assumes that the suppressor is already in the contents of src -/obj/item/gun/ballistic/proc/install_suppressor(obj/item/suppressor/S) - suppressed = S - update_weight_class(w_class + S.w_class) //so pistols do not fit in pockets when suppressed +/obj/item/gun/ballistic/proc/install_suppressor(obj/item/suppressor/new_suppressor) + suppressor = new_suppressor + suppressed = suppressor.suppression + update_weight_class(w_class + suppressor.w_class) //so pistols do not fit in pockets when suppressed + can_muzzle_flash = FALSE update_appearance() /obj/item/gun/ballistic/clear_suppressor() if(!can_unsuppress) return - if(isitem(suppressed)) - var/obj/item/I = suppressed - update_weight_class(w_class - I.w_class) - return ..() + suppressed = SUPPRESSED_NONE + if(suppressor) + update_weight_class(w_class - suppressor.w_class) + suppressor = null + can_muzzle_flash = initial(can_muzzle_flash) + update_appearance() /obj/item/gun/ballistic/click_alt(mob/user) if(!suppressed || !can_unsuppress) return CLICK_ACTION_BLOCKING - var/obj/item/suppressor/S = suppressed if(!user.is_holding(src)) return CLICK_ACTION_BLOCKING - balloon_alert(user, "[S.name] removed") - user.put_in_hands(S) + balloon_alert(user, "[suppressor.name] removed") + user.put_in_hands(suppressor) clear_suppressor() return CLICK_ACTION_SUCCESS @@ -695,7 +712,7 @@ . += "It does not seem to have a round chambered." if (bolt_locked) . += "The [bolt_wording] is locked back and needs to be released before firing or de-fouling." - if (suppressed) + if (suppressor) . += "It has a suppressor [can_unsuppress ? "attached that can be removed with alt+click." : "that is integral or can't otherwise be removed."]" if(can_misfire) . += span_danger("You get the feeling this might explode if you fire it...") @@ -873,3 +890,5 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( icon = 'icons/obj/weapons/guns/ballistic.dmi' icon_state = "suppressor" w_class = WEIGHT_CLASS_TINY + /// How quiet should the gun be when we're installed? + var/suppression = SUPPRESSED_QUIET diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index a404221fb1d8..fbdc1f6f3f17 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -329,7 +329,8 @@ inhand_icon_state = "arg" accepted_magazine_type = /obj/item/ammo_box/magazine/recharge empty_indicator = TRUE - fire_delay = 2 + bolt_type = BOLT_TYPE_OPEN + fire_delay = 2 DECISECONDS can_suppress = FALSE burst_size = 0 actions_types = list() @@ -340,9 +341,9 @@ /obj/item/gun/ballistic/automatic/battle_rifle name = "\improper NT BR-38 battle rifle" - desc = "Nanotrasen's prototype security weapon, found exclusively in the hands of their private security teams. Chambered in .38 pistol rounds. \ - Ignore that this makes it technically a carbine. And that it functions as a designated marksman rifle. Marketing weren't being very co-operative \ - when it came time to name the gun. That, and the endless arguments in board rooms about exactly what designation the gun is meant to be." + desc = "Nanotrasen's latest prototype .38 Special longarm, found exclusively in the hands of their private security teams. \ + Technically a pistol-caliber carbine, despite the name and its use as a designated marksman rifle. Acceleration technology \ + enables improved ballistic performance, but necessitates maintenance." icon = 'icons/obj/weapons/guns/wide_guns.dmi' icon_state = "battle_rifle" inhand_icon_state = "battle_rifle" @@ -358,7 +359,7 @@ mag_display = TRUE projectile_damage_multiplier = 1.2 projectile_speed_multiplier = 1.2 - fire_delay = 2 + fire_delay = 2 DECISECONDS burst_size = 1 actions_types = list() fire_sound = 'sound/items/weapons/thermalpistol.ogg' @@ -390,6 +391,21 @@ /obj/item/gun/ballistic/automatic/battle_rifle/Initialize(mapload) . = ..() AddComponent(/datum/component/scope, range_modifier = 2) + AddElement(/datum/element/examine_lore, \ + lore = "The BR-38 is Nanotrasen's latest foray into entirely in-house, standard-issue-ready, accelerator-assisted ballistic firearms.
    \ +
    \ + The acceleration rail built into the barrel assembly boosts fired projectiles to higher velocities than unassisted bullets, \ + allowing even less powerful cartridges, such as the venerable .38 Special, to have improved ballistic performance and stopping power. \ + Even though the chambering makes this more of a pistol-caliber carbine than a battle rifle, countless arguments in both the marketing office \ + and the corporate boardroom about the name meant that something had to give; in this case, the slightly misleading designation.
    \ +
    \ + It's hard to cover up everything about its troubled development, though.
    \ +
    \ + In a sour twist of irony for Nanotrasen's historical issues with ballistics-based security weapons, the BR-38 has one significant flaw. \ + It is possible for the weapons system to suffer from unintended discombulations due to closed heat distribution systems, should the weapon be tampered with. \ + Nanotrasen's weapons R&D teams are still working on this issue, while also trying to work out why the weapon's onboard computation systems \ + suffer from so many calculation errors, before moving onto a full commercial rollout." \ + ) register_context() /obj/item/gun/ballistic/automatic/battle_rifle/add_context(atom/source, list/context, obj/item/held_item, mob/user) @@ -399,26 +415,15 @@ context[SCREENTIP_CONTEXT_LMB] = "Reset System" return CONTEXTUAL_SCREENTIP_SET -/obj/item/gun/ballistic/automatic/battle_rifle/examine_more(mob/user) - . = ..() - . += span_notice("Looking down at \the [src], you recall something you read in a promotional pamphlet... ") - - . += span_info("The BR-38 possesses an acceleration rail that launches bullets at higher than typical velocity. \ - This allows even less powerful cartridges to put out significant amounts of stopping power.") - - . += span_notice("However, you also remember some of the rumors... ") - - . += span_notice("In a sour twist of irony for Nanotrasen's historical issues with ballistics-based security weapons, the BR-38 has one significant flaw. \ - It is possible for the weapon to suffer from unintended discombulations due to closed heat distribution systems should the weapon be tampered with. \ - R&D are working on this issue before the weapon sees commercial sales. That, and trying to work out why the weapon's onboard computation systems suffer \ - from so many calculation errors.") - /obj/item/gun/ballistic/automatic/battle_rifle/examine(mob/user) . = ..() if(shots_before_degradation) . += span_notice("[src] can fire [shots_before_degradation] more times before risking system degradation.") else . += span_notice("[src] is in the process of system degradation. It is currently at stage [degradation_stage] of [degradation_stage_max]. Use a multitool on [src] to recalibrate. Alternatively, insert it into a weapon recharger.") + . += span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src].") + + /obj/item/gun/ballistic/automatic/battle_rifle/update_icon_state() . = ..() @@ -465,14 +470,18 @@ balloon_alert(user, "system reset") return ITEM_INTERACT_SUCCESS -/obj/item/gun/ballistic/automatic/battle_rifle/try_fire_gun(atom/target, mob/living/user, params) +/obj/item/gun/ballistic/automatic/battle_rifle/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) + if(chambered.loaded_projectile && prob(75) && (emp_malfunction || degradation_stage == degradation_stage_max)) + balloon_alert_to_viewers("*click*") + playsound(src, dry_fire_sound, dry_fire_sound_volume, TRUE) + return + . = ..() - if(!chambered || (chambered && !chambered.loaded_projectile)) + if(!.) return - if(shots_before_degradation) + else if(shots_before_degradation) shots_before_degradation -- - return else if ((obj_flags & EMAGGED) && degradation_stage == degradation_stage_max && !explosion_timer) perform_extreme_malfunction(user) @@ -480,15 +489,6 @@ else attempt_degradation(FALSE) - -/obj/item/gun/ballistic/automatic/battle_rifle/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - if(chambered.loaded_projectile && prob(75) && (emp_malfunction || degradation_stage == degradation_stage_max)) - balloon_alert_to_viewers("*click*") - playsound(src, dry_fire_sound, dry_fire_sound_volume, TRUE) - return - - return ..() - /// Proc to handle weapon degradation. Called when attempting to fire or immediately after an EMP takes place. /obj/item/gun/ballistic/automatic/battle_rifle/proc/attempt_degradation(force_increment = FALSE) if(!prob(degradation_probability) && !force_increment || degradation_stage == degradation_stage_max) @@ -527,6 +527,7 @@ /// proc to handle our detonation /obj/item/gun/ballistic/automatic/battle_rifle/proc/fucking_explodes_you() explosion(src, devastation_range = 1, heavy_impact_range = 3, light_impact_range = 6, explosion_cause = src) + //component for seclight attachment /obj/item/gun/ballistic/automatic/battle_rifle/add_seclight_point() AddComponent(/datum/component/seclite_attachable, \ diff --git a/code/modules/projectiles/guns/ballistic/bows/_bow.dm b/code/modules/projectiles/guns/ballistic/bows/_bow.dm index 5bcec2deeb7e..69399c71138b 100644 --- a/code/modules/projectiles/guns/ballistic/bows/_bow.dm +++ b/code/modules/projectiles/guns/ballistic/bows/_bow.dm @@ -22,6 +22,7 @@ bolt_type = BOLT_TYPE_NO_BOLT click_on_low_ammo = FALSE must_hold_to_load = TRUE + trigger_guard = TRIGGER_GUARD_ALLOW_ALL /// whether the bow is drawn back var/drawn = FALSE diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm b/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm index 96459341cf36..d1d5a977de80 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm @@ -11,6 +11,7 @@ throwforce = 1 firing_effect_type = null caliber = CALIBER_ARROW + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT, /datum/material/iron = SHEET_MATERIAL_AMOUNT) ///Whether the bullet type spawns another casing of the same type or not. var/reusable = TRUE @@ -131,6 +132,7 @@ base_icon_state = "plastic_arrow" projectile_type = /obj/projectile/bullet/arrow/plastic reusable = FALSE //cheap shit + custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT) /// plastic arrow projectile /obj/projectile/bullet/arrow/plastic @@ -179,6 +181,7 @@ inhand_icon_state = "ashen_arrow" base_icon_state = "ashen_arrow" projectile_type = /obj/projectile/bullet/arrow/ashen + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT) /// ashen arrow projectile /obj/projectile/bullet/arrow/ashen diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_types.dm b/code/modules/projectiles/guns/ballistic/bows/bow_types.dm index ee8f6ed305de..dfc9e1ca9805 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_types.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_types.dm @@ -10,6 +10,7 @@ desc = "A simple homemade shortbow. Great for LARPing. Or poking out someones eye." obj_flags = UNIQUE_RENAME projectile_damage_multiplier = 0.5 + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 4, /datum/material/iron = SHEET_MATERIAL_AMOUNT) ///chaplain's divine archer bow /obj/item/gun/ballistic/bow/divine @@ -31,37 +32,22 @@ /obj/item/gun/ballistic/bow/divine/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 = "BOW-GONE 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) \ - ) - AddElement(/datum/element/bane, mob_biotypes = MOB_SPIRIT, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE) + AddElement(/datum/element/nullrod_core) + RegisterSignal(src, COMSIG_ITEM_SUBTYPE_PICKER_SELECTED, PROC_REF(on_selected)) -/obj/item/gun/ballistic/bow/divine/proc/on_cult_rune_removed(obj/effect/target, mob/living/user) +/obj/item/gun/ballistic/bow/divine/proc/on_selected(datum/source, obj/item/nullrod/old_weapon, mob/picker) 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/bow/divine/with_quiver/Initialize(mapload) - . = ..() new /obj/item/storage/bag/quiver/holy(loc) /// Ashen bow, crafted from watcher sinew and animal bones. /obj/item/gun/ballistic/bow/ashenbow name = "ashen bow" desc = "A bow made from watcher sinew and bone. Seems to possess an almost eerie radiance about it." + icon_state = "ashenbow" inhand_icon_state = "ashenbow" base_icon_state = "ashenbow" worn_icon_state = "ashenbow" slot_flags = ITEM_SLOT_BACK obj_flags = UNIQUE_RENAME projectile_damage_multiplier = 0.5 + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 6) diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 2a3d22e00644..738ffc41820e 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -11,6 +11,7 @@ w_class = WEIGHT_CLASS_NORMAL pin = /obj/item/firing_pin/implant/pindicate bolt_type = BOLT_TYPE_NO_BOLT + can_muzzle_flash = FALSE /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted pin = /obj/item/firing_pin @@ -60,7 +61,7 @@ fire_sound = 'sound/items/weapons/gun/general/grenade_launch.ogg' accepted_magazine_type = /obj/item/ammo_box/magazine/m75 burst_size = 1 - fire_delay = 0 + fire_delay = 0 SECONDS actions_types = list() casing_ejector = FALSE @@ -82,7 +83,7 @@ can_suppress = FALSE pin = /obj/item/firing_pin/implant/pindicate burst_size = 1 - fire_delay = 0 + fire_delay = 0 SECONDS casing_ejector = FALSE weapon_weight = WEAPON_HEAVY bolt_type = BOLT_TYPE_NO_BOLT @@ -90,6 +91,7 @@ cartridge_wording = "rocket" empty_indicator = TRUE tac_reloads = FALSE + can_muzzle_flash = FALSE /// Do we shit flames behind us when we fire? var/backblast = TRUE diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index e4c4e47cdeab..9a16feceebb0 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -6,7 +6,7 @@ accepted_magazine_type = /obj/item/ammo_box/magazine/m9mm can_suppress = TRUE burst_size = 1 - fire_delay = 0 + fire_delay = 0 SECONDS actions_types = list() bolt_type = BOLT_TYPE_LOCKING fire_sound = 'sound/items/weapons/gun/pistol/shot.ogg' @@ -25,6 +25,7 @@ bolt_wording = "slide" suppressor_x_offset = 10 suppressor_y_offset = -1 + recoil_backtime_multiplier = 1 /obj/item/gun/ballistic/automatic/pistol/no_mag spawnwithmagazine = FALSE @@ -65,23 +66,27 @@ for an underbarrel-mounted disruptor, similar in operation to the standalone SC/FISHER. Chambered in 10mm." desc_controls = "Right-click to use the underbarrel disruptor. Two shots maximum between self-charges." icon_state = "pistol_evil_fisher" - suppressed = TRUE + suppressed = SUPPRESSED_QUIET can_suppress = FALSE can_unsuppress = FALSE var/obj/item/gun/energy/recharge/fisher/underbarrel -/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/examine_more(mob/user) - . = ..() - . += span_notice("The Ansem/SC is a Scarborough Arms-manufactured overhaul suite for the also Scarborough Arms-manufactured Ansem handgun, designed for special \ - operators who like to operate operationally, and/or people who really, really hate lightbulbs, and tend to fight people who really like lightbulbs. \ - The slide is lengthened and has an integrated suppressor, while a compact kinetic light disruptor was mounted underneath the barrel. \ - Scarborough Arms has never actually officially responded to allegations that they're involved with the modification and/or manufacture \ - of the SC/FISHER or similar disruptor weapons. Operators are reminded that kinetic light disruptors do not actually physically harm targets.
    \ - Caveat emptor.") - /obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/Initialize(mapload) . = ..() underbarrel = new /obj/item/gun/energy/recharge/fisher(src) + AddElement(/datum/element/examine_lore, \ + lore = "The Ansem/SC is a Scarborough Arms overhaul suite for their own Ansem handgun, designed for special operators who operate operationally, \ + especially against people who like using lightbulbs.
    \ +
    \ + The slide is chopped down, with the front half of the handgun featuring a monolithic integral suppressor built around the barrel, \ + and a compact kinetic light disruptor mounted underneath the barrel assembly. The integral suppressor is engineered to not affect \ + ballistic performance nor affect the concealability of the handgun, leading to a surprisingly robust firearm.
    \ +
    \ + Scarborough Arms has never actually addressed allegations of their involvement with the modification and/or manufacture \ + of the SC/FISHER or similar disruptor weapons. Prospective operators are reminded that kinetic light disruptors do not actually physically harm targets.
    \ +
    \ + Caveat emptor." \ + ) /obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/Destroy() QDEL_NULL(underbarrel) @@ -89,10 +94,13 @@ /obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/try_fire_gun(atom/target, mob/living/user, params) if(LAZYACCESS(params2list(params), RIGHT_CLICK)) - return underbarrel.try_fire_gun(target, user, params) + underbarrel.try_fire_gun(target, user, params) + return return ..() /obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) + if(QDELETED(target)) + return var/obj/projectile/energy/fisher/melee/simulated_hit = new simulated_hit.firer = user simulated_hit.on_hit(target) @@ -181,6 +189,7 @@ 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 + custom_materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT * 30, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 25, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 11.5) /obj/item/gun/ballistic/automatic/pistol/aps name = "\improper Stechkin APS machine pistol" diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 06a8b50c566e..6f4b9be9330c 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -97,8 +97,7 @@ . = ..() var/live_ammo = get_ammo(FALSE, FALSE) . += "[live_ammo ? live_ammo : "None"] of those are live rounds." - if (current_skin) - . += span_notice("It can be spun with [EXAMINE_HINT("alt-click")].") + . += span_notice("It can be spun with [EXAMINE_HINT("alt-click")].") /obj/item/gun/ballistic/revolver/ignition_effect(atom/A, mob/user) if(last_fire && last_fire + 15 SECONDS > world.time) @@ -112,6 +111,47 @@ base_icon_state = "c38" fire_sound = 'sound/items/weapons/gun/revolver/shot.ogg' +// 38 special skins +/datum/atom_skin/det_revolver + abstract_type = /datum/atom_skin/det_revolver + change_base_icon_state = TRUE + +/datum/atom_skin/det_revolver/default + preview_name = "Default" + new_icon_state = "c38" + +/datum/atom_skin/det_revolver/fitz_special + preview_name = "Fitz Special" + new_icon_state = "c38_fitz" + +/datum/atom_skin/det_revolver/police_positive_special + preview_name = "Police Positive Special" + new_icon_state = "c38_police" + +/datum/atom_skin/det_revolver/blued_steel + preview_name = "Blued Steel" + new_icon_state = "c38_blued" + +/datum/atom_skin/det_revolver/stainless_steel + preview_name = "Stainless Steel" + new_icon_state = "c38_stainless" + +/datum/atom_skin/det_revolver/gold_trim + preview_name = "Gold Trim" + new_icon_state = "c38_trim" + +/datum/atom_skin/det_revolver/golden + preview_name = "Golden" + new_icon_state = "c38_gold" + +/datum/atom_skin/det_revolver/peacemaker + preview_name = "The Peacemaker" + new_icon_state = "c38_peacemaker" + +/datum/atom_skin/det_revolver/black_panther + preview_name = "Black Panther" + new_icon_state = "c38_panther" + /obj/item/gun/ballistic/revolver/c38/detective name = "\improper Colt Detective Special" desc = "A classic, if not outdated, law enforcement firearm. Uses .38 Special rounds. \nSome spread rumors that if you loosen the barrel with a wrench, you can \"improve\" it." @@ -126,17 +166,10 @@ misfire_percentage_increment = 25 //about 1 in 4 rounds, which increases rapidly every shot obj_flags = UNIQUE_RENAME - unique_reskin = list( - "Default" = "c38", - "Fitz Special" = "c38_fitz", - "Police Positive Special" = "c38_police", - "Blued Steel" = "c38_blued", - "Stainless Steel" = "c38_stainless", - "Gold Trim" = "c38_trim", - "Golden" = "c38_gold", - "The Peacemaker" = "c38_peacemaker", - "Black Panther" = "c38_panther" - ) + +/obj/item/gun/ballistic/revolver/c38/detective/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/det_revolver) /obj/item/gun/ballistic/revolver/badass name = "\improper Badass Revolver" diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index e769a69eb477..db6567e2767f 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -217,6 +217,7 @@ fire_sound = 'sound/items/xbow_lock.ogg' can_be_sawn_off = FALSE tac_reloads = FALSE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3.1, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.2) var/draw_time = 3 SECONDS SET_BASE_PIXEL(0, 0) @@ -298,6 +299,7 @@ inhand_icon_state = "pipegun" worn_icon_state = "pipegun" fire_sound = 'sound/items/weapons/gun/sniper/shot.ogg' + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 8, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 8, /datum/material/cardboard = SHEET_MATERIAL_AMOUNT) accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/pipegun projectile_damage_multiplier = 1.35 @@ -308,6 +310,21 @@ SET_BASE_PIXEL(-8, 0) +/obj/item/gun/ballistic/rifle/boltaction/pipegun/Initialize(mapload) + . = ..() + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to recall a tale about [src]."), \ + lore = "You were told this story, in hushed tones, from a wizened man in a grey jumpsuit...

    \ + It is said that the first slaying committed on a Nanotrasen space station was by an assistant.

    \ + That this act, done by toolbox, maybe spear, was what consigned their kind to a life of destitution, rejection and violence.

    \ + They carry the weight of this act visibly; the grey jumpsuit. Breathing deeply filtered air. And with bloodsoaked yellow hands clenched into fists.

    \ + Eyes, sharp and waiting. Hunters in the dark.

    \ + Eventually, these killing spirits sought to stake a claim on the metal tombs they were trapped within. Rejecting their status. Determined to be something more.

    \ + This weapon is one such tool. And it is a grim one indeed. Wrought from scrap, pulled from the station's walls and floors and the very nails holding it together.
    \ +
    \ + It is a symbol that the true masters of this place are not those who merely inhabit it. But the one willing to twist it towards a killing intent." \ + ) + /obj/item/gun/ballistic/rifle/boltaction/pipegun/add_bayonet_point() AddComponent(/datum/component/bayonet_attachable, offset_x = 35, offset_y = 10) @@ -315,23 +332,13 @@ . = ..() do_sparks(1, TRUE, src) -/obj/item/gun/ballistic/rifle/boltaction/pipegun/examine_more(mob/user) - . = ..() - . += span_notice("Looking down at \the [src], you recall a tale told to you in some distant memory...") - - . += span_info("It's said that the first slaying committed on a Nanotrasen space station was by an assistant.") - . += span_info("That this act, done by toolbox, maybe spear, was what consigned their kind to a life of destitution, rejection and violence.") - . += span_info("They carry the weight of this act visibly; the grey jumpsuit. Breathing deeply filtered air. And with bloodsoaked yellow hands clenched into fists. Eyes, sharp and waiting. Hunters in the dark.") - . += span_info("Eventually, these killing spirits sought to stake a claim on the metal tombs they were trapped within. Rejecting their status. Determined to be something more.") - . += span_info("This weapon is one such tool. And it is a grim one indeed. Wrought from scrap, pulled from the station's walls and floors and the very nails holding it together.") - . += span_info("It is a symbol that the true masters of this place are not those who merely inhabit it. But the one willing to twist it towards a killing intent.") - /obj/item/gun/ballistic/rifle/boltaction/pipegun/pistol name = "pipe pistol" desc = "It is foolish to think that anyone wearing the grey is incapable of hurting you, simply because they are not baring their teeth." icon_state = "pipepistol" inhand_icon_state = "pipepistol" worn_icon_state = "gun" + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 4, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, /datum/material/cardboard = SHEET_MATERIAL_AMOUNT) accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/pipegun/pistol projectile_damage_multiplier = 0.50 spread = 15 //kinda inaccurate @@ -356,6 +363,13 @@ worn_icon_state = "regal_pipegun" accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/pipegun/prime projectile_damage_multiplier = 2 + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 9.15, + /datum/material/wood = SHEET_MATERIAL_AMOUNT *8, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.15, + /datum/material/cardboard = SHEET_MATERIAL_AMOUNT, + ) /obj/item/gun/ballistic/rifle/boltaction/pipegun/pistol/prime name = "regal pipe pistol" @@ -481,6 +495,7 @@ semi_auto = TRUE slot_flags = ITEM_SLOT_BACK projectile_damage_multiplier = 0.5 + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 8, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5.5, /datum/material/cardboard = SHEET_MATERIAL_AMOUNT) SET_BASE_PIXEL(-8, 0) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 1110d302a6ad..124284f3c994 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -46,17 +46,20 @@ desc = "A sturdy shotgun with a longer magazine and a fixed tactical stock designed for non-lethal riot control." icon_state = "riotshotgun" inhand_icon_state = "shotgun" - fire_delay = 8 + fire_delay = 8 DECISECONDS 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 - //component for seclight attachment + chambered_attack_block = TRUE // necessary for riot shotgun due to fire_delay and wanting to shoot point blank without accidental melee + +//component for seclight attachment /obj/item/gun/ballistic/shotgun/riot/add_seclight_point() AddComponent(/datum/component/seclite_attachable, \ light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', \ light_overlay = "flight", \ overlay_x = 20, \ overlay_y = 11) + // Automatic Shotguns// /obj/item/gun/ballistic/shotgun/automatic/shoot_live_shot(mob/living/user) @@ -71,6 +74,7 @@ projectile_damage_multiplier = 1.5 accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/com w_class = WEIGHT_CLASS_HUGE + //component for seclight attachment /obj/item/gun/ballistic/shotgun/automatic/combat/add_seclight_point() AddComponent(/datum/component/seclite_attachable, \ @@ -78,6 +82,7 @@ light_overlay = "flight", \ overlay_x = 20, \ overlay_y = 11) + /obj/item/gun/ballistic/shotgun/automatic/combat/compact name = "compact combat shotgun" desc = "A compact version of the semi automatic combat shotgun. Lower magazine capacity, but more easily carried." @@ -85,6 +90,7 @@ accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/com/compact w_class = WEIGHT_CLASS_BULKY weapon_weight = WEAPON_MEDIUM + //component for seclight attachment /obj/item/gun/ballistic/shotgun/automatic/combat/compact/add_seclight_point() AddComponent(/datum/component/seclite_attachable, \ @@ -92,6 +98,7 @@ light_overlay = "flight", \ overlay_x = 16, \ overlay_y = 11) + //Dual Feed Shotgun /obj/item/gun/ballistic/shotgun/automatic/dual_tube @@ -105,7 +112,6 @@ inhand_y_dimension = 32 worn_icon_state = "cshotgun" w_class = WEIGHT_CLASS_HUGE - semi_auto = TRUE accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/tube interaction_flags_click = NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING /// If defined, the secondary tube is this type, if you want different shell loads @@ -138,7 +144,7 @@ return ..() /obj/item/gun/ballistic/shotgun/automatic/dual_tube/attack_self(mob/living/user) - if(!chambered && magazine.contents.len) + if(!chambered && get_ammo()) rack() else toggle_tube(user) @@ -278,6 +284,36 @@ /obj/item/gun/ballistic/shotgun/bulldog/unrestricted pin = /obj/item/firing_pin + +// Double barrel shotgun skins +/datum/atom_skin/bar_shotgun + abstract_type = /datum/atom_skin/bar_shotgun + change_base_icon_state = TRUE + +/datum/atom_skin/bar_shotgun/default + preview_name = "Standard Finish" + new_icon_state = "dshotgun" + +/datum/atom_skin/bar_shotgun/dark_red + preview_name = "Dark Red Finish" + new_icon_state = "dshotgun_d" + +/datum/atom_skin/bar_shotgun/ash + preview_name = "Ash" + new_icon_state = "dshotgun_f" + +/datum/atom_skin/bar_shotgun/faded_grey + preview_name = "Faded Grey" + new_icon_state = "dshotgun_g" + +/datum/atom_skin/bar_shotgun/maple + preview_name = "Maple" + new_icon_state = "dshotgun_l" + +/datum/atom_skin/bar_shotgun/rosewood + preview_name = "Rosewood" + new_icon_state = "dshotgun_p" + ///////////////////////////// // DOUBLE BARRELED SHOTGUN // ///////////////////////////// @@ -297,18 +333,15 @@ sawn_desc = "Omar's coming!" obj_flags = UNIQUE_RENAME rack_sound_volume = 0 - unique_reskin = list("Default" = "dshotgun", - "Dark Red Finish" = "dshotgun_d", - "Ash" = "dshotgun_f", - "Faded Grey" = "dshotgun_g", - "Maple" = "dshotgun_l", - "Rosewood" = "dshotgun_p" - ) semi_auto = TRUE bolt_type = BOLT_TYPE_NO_BOLT can_be_sawn_off = TRUE pb_knockback = 3 // it's a super shotgun! +/obj/item/gun/ballistic/shotgun/doublebarrel/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/bar_shotgun) + /obj/item/gun/ballistic/shotgun/doublebarrel/sawoff(mob/user) . = ..() if(.) diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index dae77b093683..6d43ecbcea24 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -14,6 +14,7 @@ item_flags = NONE gun_flags = TOY_FIREARM_OVERLAY | NOT_A_REAL_GUN casing_ejector = FALSE + can_muzzle_flash = FALSE /obj/item/gun/ballistic/automatic/toy/riot spawn_magazine_type = /obj/item/ammo_box/magazine/toy/smg/riot @@ -49,6 +50,7 @@ weapon_weight = WEAPON_LIGHT pb_knockback = 0 gun_flags = TOY_FIREARM_OVERLAY | NOT_A_REAL_GUN + can_muzzle_flash = FALSE /obj/item/gun/ballistic/shotgun/toy/handle_chamber(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE) . = ..() @@ -75,6 +77,7 @@ slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_SMALL gun_flags = NONE + can_muzzle_flash = FALSE /obj/item/gun/ballistic/shotgun/toy/crossbow/riot spawn_magazine_type = /obj/item/ammo_box/magazine/internal/shot/toy/crossbow/riot @@ -89,6 +92,7 @@ casing_ejector = FALSE clumsy_check = FALSE gun_flags = TOY_FIREARM_OVERLAY | NOT_A_REAL_GUN + can_muzzle_flash = FALSE /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted //Use this for actual toys pin = /obj/item/firing_pin @@ -108,6 +112,7 @@ casing_ejector = FALSE clumsy_check = FALSE gun_flags = TOY_FIREARM_OVERLAY | NOT_A_REAL_GUN + can_muzzle_flash = FALSE /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted //Use this for actual toys pin = /obj/item/firing_pin diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 734bce371227..e7910d37be58 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -47,6 +47,13 @@ var/charge_delay = 8 /// The amount restored by the gun to the cell per self charge tick var/self_charge_amount = STANDARD_ENERGY_GUN_SELF_CHARGE_RATE + /// sound played when fire mode select is done + var/fire_mode_switch_sound = SFX_FIRE_MODE_SWITCH + + // EMP related vars + + /// A divide to the amount of charge lost when the weapon is EMP'd. Higher means more resistant. + var/emp_resistance = 1 /obj/item/gun/energy/fire_sounds() // What frequency the energy gun's sound will make @@ -74,7 +81,7 @@ /obj/item/gun/energy/emp_act(severity) . = ..() if(!(. & EMP_PROTECT_CONTENTS)) - cell.use(round(cell.charge / severity)) + cell.use(round(cell.charge / emp_resistance / severity)) chambered = null //we empty the chamber recharge_newshot() //and try to charge a new shot update_appearance() @@ -231,11 +238,15 @@ var/obj/item/ammo_casing/energy/shot = ammo_type[select] fire_sound = shot.fire_sound fire_delay = shot.delay + if (shot.muzzle_flash_color) + set_light_color(shot.muzzle_flash_color) if (shot.select_name && user) balloon_alert(user, "set to [shot.select_name]") chambered = null recharge_newshot(TRUE) update_appearance() + if(fire_mode_switch_sound) + playsound(src, fire_mode_switch_sound, 50, TRUE) /obj/item/gun/energy/update_icon_state() var/skip_inhand = initial(inhand_icon_state) //only build if we aren't using a preset inhand icon diff --git a/code/modules/projectiles/guns/energy/beam_rifle.dm b/code/modules/projectiles/guns/energy/beam_rifle.dm index e5e36337ae23..bf82ed7939b2 100644 --- a/code/modules/projectiles/guns/energy/beam_rifle.dm +++ b/code/modules/projectiles/guns/energy/beam_rifle.dm @@ -19,7 +19,16 @@ w_class = WEIGHT_CLASS_BULKY ammo_type = list(/obj/item/ammo_casing/energy/event_horizon) selfcharge = TRUE + light_color = COLOR_STRONG_BLUE self_charge_amount = STANDARD_ENERGY_GUN_SELF_CHARGE_RATE * 10 + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/uranium = SHEET_MATERIAL_AMOUNT * 4, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/diamond = SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 2.25, + ) /obj/item/gun/energy/event_horizon/Initialize(mapload) . = ..() diff --git a/code/modules/projectiles/guns/energy/crank_guns.dm b/code/modules/projectiles/guns/energy/crank_guns.dm index 05139823fae2..1a2e785cd397 100644 --- a/code/modules/projectiles/guns/energy/crank_guns.dm +++ b/code/modules/projectiles/guns/energy/crank_guns.dm @@ -7,6 +7,8 @@ ammo_type = list(/obj/item/ammo_casing/energy/laser/musket) slot_flags = ITEM_SLOT_BACK obj_flags = UNIQUE_RENAME + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 8, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.2, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.2) + light_color = COLOR_PURPLE /obj/item/gun/energy/laser/musket/add_bayonet_point() AddComponent(/datum/component/bayonet_attachable, offset_x = 22, offset_y = 11) @@ -34,6 +36,13 @@ inhand_icon_state = "musket_prime" worn_icon_state = "las_musket_prime" ammo_type = list(/obj/item/ammo_casing/energy/laser/musket/prime) + custom_materials = list( + /datum/material/wood = SHEET_MATERIAL_AMOUNT * 8, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.4, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.35, + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 2, + ) /obj/item/gun/energy/disabler/smoothbore @@ -45,6 +54,12 @@ charge_sections = 1 spread = 22.5 obj_flags = UNIQUE_RENAME + custom_materials = list( + /datum/material/wood = SHEET_MATERIAL_AMOUNT * 8, + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.25, + /datum/material/cardboard = SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.2, + ) /obj/item/gun/energy/disabler/smoothbore/Initialize(mapload) . = ..() @@ -74,6 +89,12 @@ 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 + custom_materials = list( + /datum/material/wood = SHEET_MATERIAL_AMOUNT * 8, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.25, + /datum/material/cardboard = SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5.2) //Inferno and Cryo Pistols @@ -118,6 +139,7 @@ While it doesn't manipulate temperature in and of itself, it does cause an violent eruption in anyone who is severely cold. Able to generate \ ammunition by manually spinning the weapon's nanite canister." icon_state = "infernopistol" + light_color = COLOR_RED ammo_type = list(/obj/item/ammo_casing/energy/nanite/inferno) /obj/item/gun/energy/laser/thermal/cryo //the ice gun @@ -126,4 +148,81 @@ While it doesn't manipulate temperature in and of itself, it does cause an internal explosion in anyone who is severely hot. Able to generate \ ammunition by manually spinning the weapon's nanite canister." icon_state = "cryopistol" + light_color = COLOR_BLUE ammo_type = list(/obj/item/ammo_casing/energy/nanite/cryo) + +/obj/item/gun/energy/laser/musket/repeater + name = "Iconoclast's Repeater" + desc = "A weapon of incredible bulk, this ratvarian repeater has been permanently severed from its stand to be carried by hand. Cumbersome, Yes - but powerful." + icon_state = "repeater" + inhand_icon_state = "repeater" + slowdown = 1 + w_class = WEIGHT_CLASS_HUGE + ammo_type = list(/obj/item/ammo_casing/energy/laser/musket/repeater) + spread = 20 + charge_sections = 1 + item_flags = SLOWS_WHILE_IN_HAND | IMMUTABLE_SLOW + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5.25, + /datum/material/bronze = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.29 + ) + +/obj/item/gun/energy/laser/musket/repeater/Initialize(mapload) + . = ..() + AddComponent( \ + /datum/component/crank_recharge, \ + charging_cell = get_cell(), \ + charge_amount = STANDARD_CELL_CHARGE, \ + cooldown_time = 3 SECONDS, \ + charge_sound = 'sound/machines/clockcult/integration_cog_install.ogg', \ + charge_sound_cooldown_time = 3 SECONDS, \ + charge_move = IGNORE_USER_LOC_CHANGE, \ + ) + AddComponent(/datum/component/automatic_fire, 0.5 SECONDS) +// The Deep Lore // + +// Laser Musket + +/obj/item/gun/energy/laser/musket/add_deep_lore() + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("think carefully")] to learn a little more about [src]."), \ + lore = "The first examples of laser muskets emerged somewhat recently, even though improvised firearms have had \ + a rich history throughout human, Mothic and Tiziran history.
    \ +
    \ + Laser muskets often started to emerge when conventional weaponry or ammunition started to grow scarcer, and the amount \ + of scrap electronics and materials outpaced the speed at which engineering crews could repair structural defenses and \ + infrastructure. They're regarded as weapons of extreme desperation, but also of unmatched grit in the face of a hopeless situation.
    \ +
    \ + Constructing one of these is sometimes seen as a rite of passage amongst militia groups and rebel forces. Each one as unique \ + as the next.
    \ +
    \ + What will this one's name be? What history will it write? Time will surely tell." \ + ) + +// Thermal Pistols + +/obj/item/gun/energy/laser/thermal/add_deep_lore() + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \ + lore = "A weapon with no name, more a pattern of design. Examples of thermal pistols vary heavily based on the \ + manufacturer or craftsperson. However, the original inventor of the thermal pistol is largely clouded in mystery. \ + Replica versions of the pistol were circulating long before weaponized nanites were banned by the \ + TerraGov Subdermal Weapons Accord, and have continued to exist as a means of disposing of the self-replicating stocks \ + of weaponized nanites.
    \ +
    \ + This is an example of Nanotrasen's Viper Classic model, based on earlier models of the weapon in appearance, but using \ + up to date nanite breeding chambers that respond to user articulation. That is, the weapons can be charged with a vigorous \ + shake. Though most users prefer to use the custom trick triggerguard to twirl them on their finger. Mostly for showmanship.
    \ +
    \ + Due to various movies and television programs, or perhaps spacer legends of fancy, the weapons are often associated with the \ + 'Space Rangers' that roam the periphery and Australicus regions of space. Polarizing tales of rugged gun fighters roaming \ + from outpost to outpost, leaving justice, death or merely a large quantity of buzzing nanite clouds in their wake. \ + Robber barons, frontier lawbringers. Even the occasional hard-boiled detective. These weapons are sometimes associated \ + with cultural imagery around rugged individualism, tenacity and nonconformity, as well as a bygone age of noble warriors and \ + ruthless villains. Using these weapons today is largely seen as a way to evoke this imagery, even if it comes across \ + as mildly tacky.
    \ +
    \ + It isn't fully understood who started the practice of 'pairing' the pistols, though the custom has remained as long as \ + living memory. Every thermal pistol has a mate, and it is considered ill fortune to separate them purposefully." \ + ) diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index be6f33c935ed..64241bfb5e5a 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -8,6 +8,7 @@ modifystate = TRUE ammo_x_offset = 3 dual_wield_spread = 60 + light_color = LIGHT_COLOR_CYAN /obj/item/gun/energy/e_gun/Initialize(mapload) . = ..() @@ -157,6 +158,12 @@ ammo_x_offset = 1 ammo_type = list(/obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/disabler) selfcharge = 1 + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 6, + /datum/material/uranium = SHEET_MATERIAL_AMOUNT * 1.5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + /datum/material/titanium = HALF_SHEET_MATERIAL_AMOUNT, + ) var/reactor_overloaded var/fail_tick = 0 var/fail_chance = 0 @@ -177,11 +184,11 @@ switch(fail_tick) if(0 to 200) fail_tick += (2*(fail_chance)) - M.adjustFireLoss(3) + M.adjust_fire_loss(3) to_chat(M, span_userdanger("Your [name] feels warmer.")) if(201 to INFINITY) SSobj.processing.Remove(src) - M.adjustFireLoss(10) + M.adjust_fire_loss(10) reactor_overloaded = TRUE to_chat(M, span_userdanger("Your [name]'s reactor overloads!")) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 6b7d38298c7b..57534ab96b6b 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -705,5 +705,5 @@ /obj/item/borg/upgrade/modkit/tracer/adjustable/proc/choose_bolt_color(mob/user) set waitfor = FALSE - var/new_color = input(user,"","Choose Color",bolt_color) as color|null + var/new_color = tgui_color_picker(user, "", "Choose Color", bolt_color) bolt_color = new_color || bolt_color diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 228bbcc4ceb0..321187a81dce 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -1,27 +1,29 @@ /obj/item/gun/energy/laser - name = "laser gun" - desc = "A basic energy-based laser gun that fires concentrated beams of light which pass through glass and thin metal." + name = "\improper Type 5 laser gun" + desc = "The Type 5 Heat Delivery System, developed by Nanotrasen. The workhorse of Nanotrasen's security forces." icon_state = "laser" inhand_icon_state = "laser" w_class = WEIGHT_CLASS_BULKY custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT) ammo_type = list(/obj/item/ammo_casing/energy/lasergun) - ammo_x_offset = 1 - shaded_charge = 1 + shaded_charge = TRUE + light_color = COLOR_SOFT_RED /obj/item/gun/energy/laser/Initialize(mapload) . = ..() - // Only actual lasguns can be converted + add_deep_lore() + + // Only regular lasguns can be slapcrafted 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) - AddElement( /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) */ // DARKPACK EDIT REMOVE + /obj/item/gun/energy/laser/add_seclight_point() AddComponent(/datum/component/seclite_attachable, \ light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', \ @@ -29,109 +31,192 @@ overlay_x = 18, \ overlay_y = 12) +/obj/item/gun/energy/laser/pistol + name = "\improper Type 5/C laser pistol" + desc = "The Type 5 Heat Delivery System, Compact Variant, developed by Nanotrasen. The workhorse of Nanotrasen's security forces, but in a more portable size. \ + Sacrifices some stopping power and capacity for ease of carry and faster charging." + icon_state = "laser_pistol" + w_class = WEIGHT_CLASS_NORMAL + projectile_damage_multiplier = 0.8 + cell_type = /obj/item/stock_parts/power_store/cell/laser_pistol + ammo_type = list(/obj/item/ammo_casing/energy/lasergun/pistol) + +/obj/item/gun/energy/laser/pistol/add_seclight_point() + return + +/obj/item/gun/energy/laser/assault + name = "\improper Type 5/A assault laser rifle" + desc = "The Type 5 Heat Delivery System, Assault Variant, developed by Nanotrasen. The workhorse of Nanotrasen's security forces and paramilitary organizations. \ + While it sacrifices some stopping power and ease of use, its laser system is remarkably efficient and it boasts some resistance against electromagnetic interference." + icon = 'icons/obj/weapons/guns/wide_guns.dmi' + icon_state = "assault_laser" + inhand_icon_state = "assault_laser" + worn_icon_state = "assault_laser" + slot_flags = ITEM_SLOT_BACK + burst_size = 2 + fire_delay = 1 + ammo_type = list(/obj/item/ammo_casing/energy/lasergun/assault) + emp_resistance = 2 + weapon_weight = WEAPON_HEAVY + projectile_speed_multiplier = 1.5 + SET_BASE_PIXEL(-8, 0) + +/obj/item/gun/energy/laser/assault/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 = 30) + /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." + desc = "A modified version of the Type 5 laser gun. Fires entirely harmless bolts of directed energy. Safe AND entertaining to fire with abandon." ammo_type = list(/obj/item/ammo_casing/energy/laser/practice) clumsy_check = FALSE item_flags = NONE gun_flags = NOT_A_REAL_GUN +/obj/item/gun/energy/laser/practice/add_deep_lore() + return + /obj/item/gun/energy/laser/retro - name ="retro laser gun" + name ="\improper Type 1 laser gun" + desc = "The Type 1 Heat Delivery System, developed by Nanotrasen. 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." icon_state = "retro" - 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/soul + name ="\improper Type 3 laser gun" + desc = "The Type 3 Heat Delivery System, developed by Nanotrasen. Quite possibly the most popular model of HDS ever made by Nanotrasen. \ + They don't make them like they used to." + icon_state = "laser_soulful" + inhand_icon_state = "laser_soulful" + ammo_x_offset = 1 + /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." + name = "\improper Type 5/R laser carbine" + desc = "The burst fire Type 5/R Rapid Heat Delivery System, developed by Nanotrasen. Capable of firing a sustained volley of directed energy projectiles, though each individual projectile lacks the punch of the Type 5." icon_state = "laser_carbine" + burst_size = 2 + fire_delay = 2 + projectile_damage_multiplier = 0.75 + projectile_speed_multiplier = 1.5 ammo_type = list(/obj/item/ammo_casing/energy/lasergun/carbine) + weapon_weight = WEAPON_MEDIUM -/obj/item/gun/energy/laser/carbine/Initialize(mapload) - . = ..() - AddComponent(/datum/component/automatic_fire, 0.15 SECONDS, allow_akimbo = FALSE) - -/obj/item/gun/energy/laser/carbine/cybersun +/obj/item/gun/energy/laser/cybersun name = "\improper Cybersun S-120" desc = "A laser gun primarily used by syndicate security guards. It fires a rapid spray of low-power plasma beams." icon_state = "cybersun_s120" inhand_icon_state = "s120" - ammo_type = list(/obj/item/ammo_casing/energy/lasergun/carbine/cybersun) + ammo_type = list(/obj/item/ammo_casing/energy/lasergun/cybersun) spread = 14 pin = /obj/item/firing_pin/implant/pindicate + ammo_x_offset = 1 + +/obj/item/gun/energy/laser/cybersun/Initialize(mapload) + . = ..() + AddComponent(/datum/component/automatic_fire, 0.15 SECONDS, allow_akimbo = FALSE) + +/obj/item/gun/energy/laser/cybersun/add_deep_lore() + return -/obj/item/gun/energy/laser/carbine/cybersun/unrestricted +/obj/item/gun/energy/laser/cybersun/unrestricted pin = /obj/item/firing_pin /obj/item/gun/energy/laser/carbine/practice name = "practice laser carbine" - desc = "A modified version of the laser carbine, this one fires even less concentrated energy bolts designed for target practice." + desc = "A modified version of the Type 5/R laser carbine. Fires entirely harmless bolts of directed energy. Safe AND entertaining to fire with abandon." ammo_type = list(/obj/item/ammo_casing/energy/lasergun/carbine/practice) clumsy_check = FALSE item_flags = NONE gun_flags = NOT_A_REAL_GUN +/obj/item/gun/energy/laser/carbine/practice/add_deep_lore() + return + /obj/item/gun/energy/laser/retro/old - name ="laser gun" - icon_state = "retro" - desc = "First generation lasergun, developed by Nanotrasen. Suffers from ammo issues but its unique ability to recharge its ammo without the need of a magazine helps compensate. You really hope someone has developed a better lasergun while you were in cryo." + desc = "The NT Type 1 Heat Delivery System, developed by Nanotrasen. This one looks downright ancient. What the hell happened to it?" ammo_type = list(/obj/item/ammo_casing/energy/lasergun/old) - ammo_x_offset = 3 + +/obj/item/gun/energy/laser/retro/old/add_deep_lore() + return /obj/item/gun/energy/laser/hellgun - name ="hellfire laser gun" - desc = "A relic of a weapon, built before NT began installing regulators on its laser weaponry. This pattern of laser gun became infamous for the gruesome burn wounds it caused, and was quietly discontinued once it began to affect NT's reputation." + name = "\improper Type 4 'hellfire' laser gun" + desc = "The Type 4 Heat Delivery System, developed by Nanotrasen. Technically speaking, it is an improvement. \ + Legally speaking, possession of this weapon is restricted in most occupied sectors of space. \ + The Type 4 is notorious for its ability to render victims a carbonized husk with ease, melting flesh and bone as easily as butter. \ + A painful, gruesome death awaits anyone on the wrong end of this gun." icon_state = "hellgun" ammo_type = list(/obj/item/ammo_casing/energy/laser/hellfire) + ammo_x_offset = 1 + light_color = COLOR_AMMO_HELLFIRE /obj/item/gun/energy/laser/captain name = "antique laser gun" + desc = "This is an antique laser gun. All craftsmanship is of the highest quality. It is decorated with assistant leather and chrome. \ + The object menaces with spikes of energy. On the item is an image of Space Station 13. The station is exploding." icon_state = "caplaser" w_class = WEIGHT_CLASS_NORMAL inhand_icon_state = null - desc = "This is an antique laser gun. All craftsmanship is of the highest quality. It is decorated with assistant leather and chrome. The object menaces with spikes of energy. On the item is an image of Space Station 13. The station is exploding." force = 10 ammo_x_offset = 3 selfcharge = 1 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF flags_1 = PREVENT_CONTENTS_EXPLOSION_1 ammo_type = list(/obj/item/ammo_casing/energy/laser/hellfire) + light_color = COLOR_AMMO_HELLFIRE /obj/item/gun/energy/laser/captain/scattershot name = "scatter shot laser rifle" + desc = "An industrial-grade heavy-duty laser rifle with a modified laser lens to scatter its shot into multiple smaller lasers. \ + The inner-core can self-charge for theoretically infinite use." icon_state = "lasercannon" w_class = WEIGHT_CLASS_BULKY inhand_icon_state = "laser" - desc = "An industrial-grade heavy-duty laser rifle with a modified laser lens to scatter its shot into multiple smaller lasers. The inner-core can self-charge for theoretically infinite use." ammo_type = list(/obj/item/ammo_casing/energy/laser/scatter, /obj/item/ammo_casing/energy/laser) shaded_charge = FALSE + ammo_x_offset = 1 + + +/obj/item/gun/energy/laser/captain/scattershot/add_deep_lore() + return /obj/item/gun/energy/laser/cyborg can_charge = FALSE desc = "An energy-based laser gun that draws power from the cyborg's internal energy cell directly. So this is what freedom looks like?" use_cyborg_cell = TRUE + ammo_x_offset = 1 /obj/item/gun/energy/laser/cyborg/Initialize(mapload) . = ..() AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) +/obj/item/gun/energy/laser/cyborg/add_deep_lore() + return + /obj/item/gun/energy/laser/scatter name = "scatter laser gun" desc = "A laser gun equipped with a refraction kit that spreads bolts." ammo_type = list(/obj/item/ammo_casing/energy/laser/scatter, /obj/item/ammo_casing/energy/laser) + ammo_x_offset = 1 + +/obj/item/gun/energy/laser/scatter/add_deep_lore() + return /obj/item/gun/energy/laser/scatter/shotty name = "energy shotgun" icon = 'icons/obj/weapons/guns/ballistic.dmi' icon_state = "cshotgun" inhand_icon_state = "shotgun" - desc = "A combat shotgun gutted and refitted with an internal laser system. Can switch between taser and scattered disabler shots." - shaded_charge = 0 + desc = "A combat shotgun gutted and refitted with an internal energy emission system. Can switch between scattered disabler shots and taser electrodes." + shaded_charge = FALSE pin = /obj/item/firing_pin/implant/mindshield ammo_type = list(/obj/item/ammo_casing/energy/laser/scatter/disabler, /obj/item/ammo_casing/energy/electrode) automatic_charge_overlays = FALSE + ammo_x_offset = 1 ///Laser Cannon @@ -149,35 +234,26 @@ pin = null ammo_x_offset = 3 -/obj/item/ammo_casing/energy/laser/accelerator - projectile_type = /obj/projectile/beam/laser/accelerator - select_name = "accelerator" - fire_sound = 'sound/items/weapons/lasercannonfire.ogg' - -/obj/projectile/beam/laser/accelerator - name = "accelerator laser" - icon_state = "scatterlaser" - range = 255 - damage = 6 - var/size_per_tile = 0.1 - var/max_scale = 4 - -/obj/projectile/beam/laser/accelerator/reduce_range() - ..() - damage += 7 - transform = matrix() - transform *= min(1 + (maximum_range - range) * size_per_tile, max_scale) - ///X-ray gun -/obj/item/gun/energy/xray - name = "\improper X-ray laser gun" - desc = "A high-power laser gun capable of expelling concentrated X-ray blasts that pass through multiple soft targets and heavier materials." +/obj/item/gun/energy/laser/xray + name = "\improper Type 6 X-ray laser gun" + desc = "The Type 6 Heat Delivery System, developed by Nanotrasen. \ + Capable of expelling concentrated 'X-ray' blasts that pass through multiple soft targets and heavier materials." icon_state = "xray" w_class = WEIGHT_CLASS_BULKY inhand_icon_state = null ammo_type = list(/obj/item/ammo_casing/energy/xray) ammo_x_offset = 3 + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3.5, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/uranium = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT, + /datum/material/bluespace = SHEET_MATERIAL_AMOUNT, + ) + shaded_charge = FALSE + light_color = LIGHT_COLOR_GREEN ////////Laser Tag//////////////////// @@ -196,6 +272,9 @@ /obj/item/gun/energy/laser/bluetag/hitscan ammo_type = list(/obj/item/ammo_casing/energy/laser/bluetag/hitscan) +/obj/item/gun/energy/laser/bluetag/add_deep_lore() + return + /obj/item/gun/energy/laser/redtag name = "laser tag gun" icon_state = "redtag" @@ -208,16 +287,183 @@ selfcharge = TRUE gun_flags = NOT_A_REAL_GUN +/obj/item/gun/energy/laser/redtag/add_deep_lore() + return + /obj/item/gun/energy/laser/redtag/hitscan ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag/hitscan) // luxury shuttle funnies /obj/item/firing_pin/paywall/luxury multi_payment = TRUE - owned = TRUE payment_amount = 20 /obj/item/gun/energy/laser/luxurypaywall name = "luxurious laser gun" desc = "A laser gun modified to cost 20 credits to fire. Point towards poor people." pin = /obj/item/firing_pin/paywall/luxury + +// The Deep Lore // + +// Laser Gun + +/obj/item/gun/energy/laser/proc/add_deep_lore() + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \ + lore = "The NT Type 5 Heat Delivery System (sometimes referred to as the HDS-5 in promotional material) is what truly put Nanotrasen \ + head and shoulders above most weapon manufacturers in the modern era. All modern energy weaponry offered by the company have \ + the success of the Type 5 to thank for setting the standard for energy-based weapon platforms.
    \ +
    \ + Adopted as the standard infantry firearm for Nanotrasen military forces, as well as private security lethal armaments, few can deny \ + the weapon's reliability, and at an affordable price!
    \ +
    \ + However, the weapon platform still possesses many of the vulnerabilities of previous energy-based weaponry. Onboard power supplies \ + cannot be adequately shielded from external electromagnetic pulses that might interfere with the weapon's functionality without \ + also severely jeopardizing thermal distribution into the weapon's heatsink. The Type 4, which never saw wider adoption, remains a \ + haunting example to Nanotrasen's weapons division as to the consequences when a HDS is unable to expel thermal buildup safely.
    \ +
    \ + Certainly, the Melted Veterans of Galpha 5 advocacy group will never let them forget it." \ + ) + +// Retro Laser Gun + +/obj/item/gun/energy/laser/retro/add_deep_lore() + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \ + lore = "The NT Type 1 Heat Delivery System (sometimes referred to as the HDS-1 in older weapon catalogs) was a weapon that \ + marked the beginning of a new era of firearm development.
    \ +
    \ + Invented in the think-tank laboratories of Nanotrasen's weapon development team towards the end of the 24th century, the Type 1 found \ + itself adopted broadly by various factions and military entities vying for control over the frontier once it hit the market. One \ + hallmark of those who stood successful in these conflicts was the adoption of the Type 1 as a standard infantry \ + weapon. The logistics required to maintain the operational peak of the HDS-1 allowed most quartermasters to merely dump a half \ + dozen of the weapons into the hands of bloodythirsty marines, knowing full well the weapons were rugged enough to survive \ + most anything thrown at them, only needing a recharging station with a power supply to become operational again once they ran empty.
    \ +
    \ + So many of these weapons exist today that even modern conflicts may see more usage of the HDS-1 than the updated and equally \ + reliable HDS5 employed by Nanotrasen's modern combat forces. Nanotrasen, despite their best efforts, still have not managed \ + to encourage potential customers to swap for the new model despite a generous exchange discount." \ + ) + +// Soulful Laser Gun + +/obj/item/gun/energy/laser/soul/add_deep_lore() + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \ + lore = "The NT Type 3 Heat Delivery System (sometimes referred to as the HDS-3 in the memories of security officers) is quite possibly \ + the most common type of HDS still available on the market. Fondly regarded, with quite a few diehard fans still clinging to their \ + Type 3s like their lives depended on it, the weapon has its own place in history as the 'gun that could do it all'.
    \ +
    \ + The Type 3 line ran for several decades before attempts to replace it ever even crossed Nanotrasen's minds. When people think \ + 'laser gun', the Type 3 is usually what comes to mind.
    \ +
    \ + When Nanotrasen announced its replacement, the Type 4, skeptics were quick to pan the weapon, claiming that it lacked several notable \ + features that users of the Type 3 had enjoyed for years. As it turns out, most of those critics would end up vindicated after word of \ + Galpha 5 and the terrible, terrible consequences of the Type 4's volatile nature came to light. Most stuck to the Type 3 and never \ + looked back, even when the Type 5 rolled out to considerable success in its own right.
    \ +
    \ + Nanotrasen still services Type 3s, with many of the parts used in the weapon sharing compatible cousins in the Type 5. Most \ + examples of the Type 3 today may actually be closer in function and form to the Type 5 than they were during their original \ + construction, depending on how often it is serviced." \ + ) + +// hellfire laser gun + +/obj/item/gun/energy/laser/hellgun/add_deep_lore() + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \ + lore = "The NT Type 4 Heat Delivery System (sometimes referred to as the HDS-4 in legal documentation) is considered a notable \ + example of Nanotrasen's weapons development teams flying too close to the sun.
    \ +
    \ + The success of the Type 3 resulted in shareholders urging marketing to bring out the 'next best thing' in energy-based weaponry. \ + At the time, Nanotrasen's weapons division had a prototype still in the works, with recently-learned lessons \ + from the failure-prone Type 2 in mind after it had more than a few catastrophic failures in testing. \ + However, there were some concerns raised amongst researchers as to the 'moral implications' \ + that might result from unleashing 'that much directed radioactive material' towards a living being. \ + Executives at the time brushed off such concerns, as there was money to be made and already ultrawealthy shareholders to feed the earnings.
    \ +
    \ + The Type 4 was rushed onto the market within the next quarter, even before most common safety mechanisms had been properly tested and implemented. \ + Reports immediately began flooding in of horrific accidental discharges, battlefield atrocities, and unexpected spontaneous combustion \ + from excessive exposure to the untested experimental heat distribution systems 'taking its pound of flesh' for the 'hell it unleashed'.
    \ +
    \ + News outlets and tabloids alike railed against the company for creating what was now being called the 'hellfire' laser gun. In response, most \ + legal bodies rushed to ban the firearm from sales within their region of space, and the weapon became infamous for its unethical means of ending \ + sentient life. Laws were passed to ensure power regulators were installed in all future energy-based weaponry sold by Nanotrasen. Nanotrasen quickly \ + discontinued the Type 4 in response, and it never saw production from that day forth. However, retrofit kits still exist \ + on the black market and in some of Nanotrasen's own warehouses. While, legally, it is unlawful to sell and possess a Type 4, Nanotrasen itself \ + does not regulate possession of the firearm aboard its own stations, nor does any legal body intend on preventing them from utilizing it in defense \ + of its own assets." \ + ) + +// Antique Laser Gun + +/obj/item/gun/energy/laser/captain/add_deep_lore() + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \ + lore = "For a brief period, Nanotrasen produced a series of custom-made Type 4 laser guns for a select group of \ + clients, primarily composed of wealthy starship captains, politicians, and military leaders looking to demonstrate prestige before \ + the common folk.
    \ +
    \ + The Type 4 was a commercial failure, but this particular variant earned its own infamy, linked to narratives of crazed \ + despots using it to put down political rivals and dissidents, as well as tales of mad generals marching ahead of their \ + forces, this weapon brandished and running hot in an outstretched arm, pointed towards any moving target they could find on the \ + battlefield.
    \ +
    \ + Copies of this firearm are now prohibited within TerraGov space, and any captured are quickly decommissioned.\ + This is largely why Nanotrasen insists that any examples held by ranking officers be kept under lock and key. \ + All records of the schematics surrounding this variant of the Type 4 were seized and destroyed, and the creator behind \ + it was detained in a maximum security TerraGov sanitorium. When they found her again, she appeared to have smeared the walls in her \ + own blood, claiming that 'She' was coming, and that she had paid dearly for the knowledge of how to make the weapon.
    \ +
    \ + Even the microfusion breeder cell housed inside the weapon is practically a lost technology, and Nanotrasen have been unable \ + to reverse engineer the devices exact means of functionality.
    \ +
    \ + The Syndicate are obviously just as interested in exactly how this weapon is capable of self-perpetuation, hence why the collective \ + seem hell-bent on capturing them whenever possible. Maybe keep this somewhere safe. Or don't." \ + ) + +// X-ray Laser Gun + +/obj/item/gun/energy/laser/xray/add_deep_lore() + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \ + lore = "The NT Type 6 Heat Delivery System (sometimes referred to as the HDS6 in research notes) is a breakthrough in the \ + development of man-portable directed energy weaponry.
    \ +
    \ + Very little is known about the Type 6, as it is a relatively new experimental weapon only accessible to Nanotrasen security forces. \ + Somehow, Nanotrasen has found a means to 'slip' the energy beams produced by the Type 6 through unintended targets, only impacting \ + once it has made contact with a pre-designated target by the weapon's user. It appears to be unable to slip past organic matter reliably, \ + which hampers its potential for eliminating friendly-fire. However, inorganic targets are left unscathed unless the weapon is directed towards \ + firing upon the object. This makes the weapon exceptional for asset recovery, defense of entrenched positions, and assaults on defensive structures.
    \ +
    \ + Nanotrasen claims that this phenomenon is achieved 'through the power of X-rays'. Most critics have highlighted that this is total nonsense. Some claim \ + that Nanotrasen has discovered a yet-unknown state of matter that the company is exploiting for weapons development and manufacturing. The most \ + conspiratorially minded of Nanotrasen's critics have even gone as far as to claim it is 'proof of ectoplasm as the sixth element,' \ + perhaps even allowing the weapon to operate through supernatural means: perhaps even powered by the 'spirits of the damned'.
    \ +
    \ + Whatever the truth may be, the weapon seems to function as advertized, and is even more energy efficient than the Type 5. Nanotrasen \ + expects full commercial rollout sometime in the next quarter." \ + ) + +// Laser Carbine + +/obj/item/gun/energy/laser/carbine/add_deep_lore() + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \ + lore = "The NT Type 5/R Rapid Heat Delivery System (sometimes referred to as the HDS-5/R in briefing manuals, and 'that piece of shit flashlight' \ + amongst TGMC troopers) was a shaky first step into automatic directed energy weaponry.
    \ +
    \ + Intended for use in special operations, particularly in the hands of orbital drop shock troopers, the Type 5/R was foreseen to be an excellent \ + addition to Nanotrasen's arsenal of offerings to military forces across occupied space. However, field performance proved grim.
    \ +
    \ + The advantages of directed energy weapons is the lightweight impacts felt on the supply chain for logistical officers and quartermasters due to the \ + only necessary upkeep for the weapons being a consistent power supply, either established or brought to the front, and the occassional cleaning.
    \ +
    \ + This, however, is not a benefit that soldiers operating behind enemy lines or during tactical deployments are capable of exploiting. As a result, \ + operators often chafed against the limited ammunition supply compared to conventional ballistic firearms, and the weapon quickly was abandoned by \ + most special forces units.
    \ +
    \ + Instead, the weapon found favour in the hands of private security teams, who enjoyed the volume of fire it provided, while maintaining \ + exceptional accuracy even at long ranges, along with being compact enough to allow a high degree of discretion compared to a full sized rifle. \ + The weapon is also often utilized by rim pirates and marauders, giving the weapon something of an ill reputation." \ + ) diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm index 670f0b0c3703..c9b4455919a4 100644 --- a/code/modules/projectiles/guns/energy/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -24,6 +24,7 @@ gun = new(src) battery = new(src) START_PROCESSING(SSobj, src) + AddElement(/datum/element/drag_pickup) /obj/item/minigunpack/Destroy() if(!QDELETED(gun)) @@ -64,15 +65,6 @@ if(armed) user.dropItemToGround(gun, TRUE) -/obj/item/minigunpack/mouse_drop_dragged(atom/over_object, mob/user) - if(armed) - return - - if(iscarbon(user)) - if(istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/H = over_object - user.putItemFromInventoryInHandIfPossible(src, H.held_index) - /obj/item/minigunpack/update_icon_state() icon_state = armed ? "notholstered" : "holstered" return ..() diff --git a/code/modules/projectiles/guns/energy/mounted.dm b/code/modules/projectiles/guns/energy/mounted.dm index 7e33567aa0ed..13e6c40d0d68 100644 --- a/code/modules/projectiles/guns/energy/mounted.dm +++ b/code/modules/projectiles/guns/energy/mounted.dm @@ -22,6 +22,9 @@ selfcharge = 1 trigger_guard = TRIGGER_GUARD_ALLOW_ALL +/obj/item/gun/energy/laser/mounted/add_deep_lore() + return + /obj/item/gun/energy/laser/mounted/augment icon = 'icons/obj/medical/organs/organs.dmi' icon_state = "arm_laser" diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 839689144c2f..973904873a60 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -9,6 +9,7 @@ modifystate = TRUE obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BACK + light_color = COLOR_BLUE ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser) cell_type = /obj/item/stock_parts/power_store/cell/pulse diff --git a/code/modules/projectiles/guns/energy/recharge.dm b/code/modules/projectiles/guns/energy/recharge.dm index acc34edc4b24..4289cee1ff33 100644 --- a/code/modules/projectiles/guns/energy/recharge.dm +++ b/code/modules/projectiles/guns/energy/recharge.dm @@ -105,8 +105,13 @@ inhand_icon_state = "crossbow" no_charge_state = "crossbow_empty" w_class = WEIGHT_CLASS_SMALL - custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT) - suppressed = TRUE + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT * 0.5, + /datum/material/uranium = HALF_SHEET_MATERIAL_AMOUNT * 0.5, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT * 0.5, + ) + suppressed = SUPPRESSED_QUIET ammo_type = list(/obj/item/ammo_casing/energy/bolt) recharge_time = 2 SECONDS holds_charge = TRUE @@ -130,31 +135,48 @@ base_icon_state = "crossbowlarge" no_charge_state = "crossbowlarge_empty" w_class = WEIGHT_CLASS_BULKY - custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*2) - suppressed = null + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3.5, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT * 1.5, + /datum/material/uranium = HALF_SHEET_MATERIAL_AMOUNT * 1.5, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT * 1.5, + ) + suppressed = SUPPRESSED_NONE 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." + desc = "A self-recharging, integrally suppressed, modified kinetic accelerator that does no damage, \ + but disrupts electronics like lights, APCs, and security cameras. \ + Can fire twice before requiring a recharge. \ + Bolts can be fired around machinery, but the precise nature of shooting light fixtures demands a skillful hand." icon_state = "fisher" base_icon_state = "fisher" dry_fire_sound_volume = 10 w_class = WEIGHT_CLASS_SMALL holds_charge = TRUE - suppressed = TRUE + suppressed = SUPPRESSED_QUIET recharge_time = 1.2 SECONDS ammo_type = list(/obj/item/ammo_casing/energy/fisher) -/obj/item/gun/energy/recharge/fisher/examine_more(mob/user) +/obj/item/gun/energy/recharge/fisher/Initialize(mapload) . = ..() - . += 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 temporarily disrupt flashlights, cameras, and certain other electronics. \ - 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.") + AddElement(/datum/element/examine_lore, \ + lore = "The SC/FISHER is an illegally-modified kinetic accelerator that's been cut down and refit into a miniature energy gun chassis, \ + optimized for temporary, but effective, electronic warfare.
    \ +
    \ + The reengineered kinetic accelerator central to the SC/FISHER's functionality has been modified for its kinetic bolts to \ + temporarily disrupt flashlights, cameras, APCs, and pAI speech modules, in return for dealing no damage. \ + This effect works longer against targets struck with the SC/FISHER either in melee or by having it thrown at them, but \ + you probably shouldn't be throwing it at people.
    \ +
    \ + While some would argue that sacrificing damage for a light-disrupting, fixture-breaking gimmick \ + makes the SC/FISHER a dead-end in equipment development, others argue that it is both amusing and tactically sound \ + to be able to shoot at light sources and pesky pAIs to disrupt their function.
    \ +
    \ + Caveat emptor." \ + ) /obj/item/gun/energy/recharge/fisher/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 1c27ccc1ccf5..a47d417bce25 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -9,6 +9,8 @@ obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BACK ammo_type = list(/obj/item/ammo_casing/energy/ion) + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 3, /datum/material/uranium = SHEET_MATERIAL_AMOUNT) + light_color = LIGHT_COLOR_BLUE /obj/item/gun/energy/ionrifle/Initialize(mapload) . = ..() @@ -322,6 +324,7 @@ ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot) cell_type = /obj/item/stock_parts/power_store/cell/high pin = null + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3.5, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT) /obj/item/gun/energy/temperature/security name = "security temperature gun" @@ -388,6 +391,7 @@ it is often confused with the mech weapon of the same name, since it is a bit mo weapon_weight = WEAPON_HEAVY w_class = WEIGHT_CLASS_BULKY ///if our stpck is extended and we are ready to fire. + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 5, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 5) var/ready_to_fire = FALSE /obj/item/gun/energy/tesla_cannon/Initialize(mapload) @@ -502,6 +506,7 @@ it is often confused with the mech weapon of the same name, since it is a bit mo light_system = OVERLAY_LIGHT light_power = 2 light_range = 1 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 7, /datum/material/gold = SHEET_MATERIAL_AMOUNT * 5) /obj/item/gun/energy/photon/Initialize(mapload) . = ..() diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 72148267b03c..b5474b86013c 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -3,6 +3,7 @@ desc = "A low-capacity, energy-based stun gun used by security teams to subdue targets at range." icon_state = "taser" inhand_icon_state = null //so the human update icon uses the icon_state instead. + light_color = LIGHT_COLOR_DIM_YELLOW ammo_type = list(/obj/item/ammo_casing/energy/electrode) ammo_x_offset = 3 diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 62bda8a9a323..510d815d79df 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -9,6 +9,7 @@ fire_sound = 'sound/items/weapons/emitter.ogg' obj_flags = CONDUCTS_ELECTRICITY w_class = WEIGHT_CLASS_HUGE + can_muzzle_flash = FALSE ///what kind of magic is this var/school = SCHOOL_EVOCATION var/antimagic_flags = MAGIC_RESISTANCE diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index 6792f653a058..b1d664a6271d 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -264,7 +264,7 @@ ) /obj/item/gun/magic/staff/spellblade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) - if(attack_type == (PROJECTILE_ATTACK || LEAP_ATTACK || OVERWHELMING_ATTACK)) + if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK) final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword. Or a road roller, if one happened to hit you. return ..() diff --git a/code/modules/projectiles/guns/special/chem_gun.dm b/code/modules/projectiles/guns/special/chem_gun.dm index b085a20026ee..5bd6db713d80 100644 --- a/code/modules/projectiles/guns/special/chem_gun.dm +++ b/code/modules/projectiles/guns/special/chem_gun.dm @@ -6,6 +6,7 @@ icon_state = "chemgun" inhand_icon_state = "chemgun" w_class = WEIGHT_CLASS_NORMAL + can_muzzle_flash = FALSE throw_speed = 3 throw_range = 7 force = 4 diff --git a/code/modules/projectiles/guns/special/grenade_launcher.dm b/code/modules/projectiles/guns/special/grenade_launcher.dm index 9a290459389b..1b120992f66d 100644 --- a/code/modules/projectiles/guns/special/grenade_launcher.dm +++ b/code/modules/projectiles/guns/special/grenade_launcher.dm @@ -5,6 +5,7 @@ icon_state = "riotgun" inhand_icon_state = "riotgun" w_class = WEIGHT_CLASS_BULKY + can_muzzle_flash = FALSE throw_speed = 2 throw_range = 7 force = 5 diff --git a/code/modules/projectiles/guns/special/meat_hook.dm b/code/modules/projectiles/guns/special/meat_hook.dm index 2034b400e172..302ebb435cf2 100644 --- a/code/modules/projectiles/guns/special/meat_hook.dm +++ b/code/modules/projectiles/guns/special/meat_hook.dm @@ -18,6 +18,7 @@ sharpness = SHARP_POINTY force = 18 antimagic_flags = NONE + can_muzzle_flash = FALSE /obj/item/gun/magic/hook/shoot_with_empty_chamber(mob/living/user) balloon_alert(user, "not ready yet!") diff --git a/code/modules/projectiles/guns/special/medbeam.dm b/code/modules/projectiles/guns/special/medbeam.dm index 375cffe14b7c..45c9de8e186e 100644 --- a/code/modules/projectiles/guns/special/medbeam.dm +++ b/code/modules/projectiles/guns/special/medbeam.dm @@ -5,6 +5,8 @@ icon_state = "chronogun" inhand_icon_state = "chronogun" w_class = WEIGHT_CLASS_NORMAL + item_flags = parent_type::item_flags & ~NEEDS_PERMIT + can_muzzle_flash = FALSE var/mob/living/current_target var/last_check = 0 @@ -113,10 +115,10 @@ if(target.health != target.maxHealth) new /obj/effect/temp_visual/heal(get_turf(target), COLOR_HEALING_CYAN) 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) + need_mob_update = target.adjust_brute_loss(-4, updating_health = FALSE, forced = TRUE) + need_mob_update += target.adjust_fire_loss(-4, updating_health = FALSE, forced = TRUE) + need_mob_update += target.adjust_tox_loss(-1, updating_health = FALSE, forced = TRUE) + need_mob_update += target.adjust_oxy_loss(-1, updating_health = FALSE, forced = TRUE) if(need_mob_update) target.updatehealth() return diff --git a/code/modules/projectiles/guns/special/syringe_gun.dm b/code/modules/projectiles/guns/special/syringe_gun.dm index f9b1e1cabb0e..e17e9bb43eae 100644 --- a/code/modules/projectiles/guns/special/syringe_gun.dm +++ b/code/modules/projectiles/guns/special/syringe_gun.dm @@ -19,6 +19,7 @@ custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) clumsy_check = FALSE fire_sound = 'sound/items/syringeproj.ogg' + can_muzzle_flash = FALSE gun_flags = NOT_A_REAL_GUN var/load_sound = 'sound/items/weapons/gun/shotgun/insert_shell.ogg' var/list/syringes = list() @@ -161,7 +162,7 @@ base_pixel_x = 0 pixel_x = 0 force = 2 //Also very weak because it's smaller - suppressed = TRUE //Softer fire sound + suppressed = SUPPRESSED_QUIET //Softer fire sound can_unsuppress = FALSE //Permanently silenced syringes = list(new /obj/item/reagent_containers/syringe()) @@ -223,11 +224,12 @@ pixel_x = 0 force = 4 trigger_guard = TRIGGER_GUARD_ALLOW_ALL + custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 10) /obj/item/gun/syringe/blowgun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) . = ..() if(!.) return visible_message(span_danger("[user] shoots the blowgun!")) - user.adjustStaminaLoss(20, updating_stamina = FALSE) - user.adjustOxyLoss(20) + user.adjust_stamina_loss(20, updating_stamina = FALSE) + user.adjust_oxy_loss(20) diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index a7c306778423..d00dc32ac1ca 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -19,6 +19,7 @@ ///Can be removed from the gun using tools or replaced by a pin with force_replace var/pin_removable = TRUE var/obj/item/gun/gun + var/default_pin_auth = TRUE /obj/item/firing_pin/Destroy() if(gun) @@ -58,11 +59,11 @@ balloon_alert(user, "authentication checks overridden") return TRUE -/obj/item/firing_pin/proc/gun_insert(mob/living/user, obj/item/gun/new_gun) +/obj/item/firing_pin/proc/gun_insert(mob/living/user, obj/item/gun/new_gun, starting = FALSE) gun = new_gun forceMove(gun) gun.pin = src - SEND_SIGNAL(gun, COMSIG_GUN_PIN_INSERTED, src, user) + SEND_SIGNAL(gun, COMSIG_GUN_PIN_INSERTED, src, user, starting) return TRUE /obj/item/firing_pin/proc/gun_remove(mob/living/user) @@ -72,7 +73,12 @@ return /obj/item/firing_pin/proc/pin_auth(mob/living/user) - return TRUE + var/result = SEND_SIGNAL(user, COMSIG_LIVING_FIRING_PIN_CHECK, src) + if(result & ALLOW_FIRE) + return TRUE + if(result & BLOCK_FIRE) + return FALSE + return default_pin_auth /obj/item/firing_pin/proc/auth_fail(mob/living/user) if(user) @@ -167,7 +173,7 @@ return TRUE //The clown op leader antag datum isn't a subtype of the normal clown op antag datum. return FALSE -/obj/item/firing_pin/clown/ultra/gun_insert(mob/living/user, obj/item/gun/new_gun) +/obj/item/firing_pin/clown/ultra/gun_insert(mob/living/user, obj/item/gun/new_gun, starting = FALSE) ..() new_gun.clumsy_check = FALSE @@ -226,69 +232,66 @@ desc = "A firing pin with a built-in configurable paywall." color = COLOR_GOLD 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 + /// 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() - ///how much gets paid out to license yourself to the gun + /// How much gets paid out to license yourself to the gun var/payment_amount + /// Owner of the gun var/datum/bank_account/pin_owner - ///if true, user has to pay everytime they fire the gun + /// If true, user has to pay everytime they fire the gun 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. + /// 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 /obj/item/firing_pin/paywall/attack_self(mob/user) multi_payment = !multi_payment - to_chat(user, span_notice("You set the pin to [( multi_payment ) ? "process payment for every shot" : "one-time license payment"].")) + to_chat(user, span_notice("You set the pin to [multi_payment ? "process payment for every shot" : "one-time license payment"].")) /obj/item/firing_pin/paywall/examine(mob/user) . = ..() if(pin_owner) . += span_notice("This firing pin is currently authorized to pay into the account of [pin_owner.account_holder].") -/obj/item/firing_pin/paywall/gun_insert(mob/living/user, obj/item/gun/new_gun) - if(!pin_owner) - if(isnull(user)) - forceMove(new_gun.drop_location()) - else - to_chat(user, span_warning("ERROR: Please swipe valid identification card before installing firing pin!")) - user.put_in_hands(src) - return FALSE - ..() - if(multi_payment) - gun.desc += span_notice(" This [gun.name] has a per-shot cost of [payment_amount] credit[( payment_amount > 1 ) ? "s" : ""].") - return TRUE - gun.desc += span_notice(" This [gun.name] has a license permit cost of [payment_amount] credit[( payment_amount > 1 ) ? "s" : ""].") - return TRUE +/obj/item/firing_pin/paywall/gun_insert(mob/living/user, obj/item/gun/new_gun, starting = FALSE) + if(pin_owner || starting) + . = ..() + gun.desc += span_notice("This [gun.name] has a [multi_payment ? "per-shot" : "license permit"] cost of [payment_amount] [MONEY_NAME_AUTOPURAL(payment_amount)].") + return + if(isnull(user)) + forceMove(new_gun.drop_location()) + else + to_chat(user, span_warning("ERROR: Please swipe valid identification card before installing firing pin!")) + user.put_in_hands(src) + return FALSE /obj/item/firing_pin/paywall/gun_remove(mob/living/user) gun.desc = gun::desc - ..() + . = ..() -/obj/item/firing_pin/paywall/attackby(obj/item/M, mob/living/user, list/modifiers, list/attack_modifiers) - if(isidcard(M)) - var/obj/item/card/id/id = M - if(!id.registered_account) - to_chat(user, span_warning("ERROR: Identification card lacks registered bank account!")) - return - if(id.registered_account != pin_owner && owned) - to_chat(user, span_warning("ERROR: This firing pin has already been authorized!")) - return - if(id.registered_account == pin_owner) - to_chat(user, span_notice("You unlink the card from the firing pin.")) - gun_owners -= user.get_bank_account() - pin_owner = null - owned = FALSE - return - var/transaction_amount = tgui_input_number(user, "Insert valid deposit amount for gun purchase", "Money Deposit") - if(!transaction_amount || QDELETED(user) || QDELETED(src) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return - pin_owner = id.registered_account - owned = TRUE - payment_amount = transaction_amount - gun_owners += user.get_bank_account() - to_chat(user, span_notice("You link the card to the firing pin.")) +/obj/item/firing_pin/paywall/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!isidcard(tool)) + return NONE + var/obj/item/card/id/id = tool + if(!id.registered_account) + to_chat(user, span_warning("ERROR: Identification card lacks registered bank account!")) + return ITEM_INTERACT_BLOCKING + if(id.registered_account != pin_owner) + to_chat(user, span_warning("ERROR: This firing pin has already been authorized!")) + return ITEM_INTERACT_BLOCKING + if(id.registered_account == pin_owner) + to_chat(user, span_notice("You unlink the card from the firing pin.")) + gun_owners -= user.get_bank_account() + pin_owner = NUTRITION_LEVEL_START_MIN + return ITEM_INTERACT_SUCCESS + var/transaction_amount = tgui_input_number(user, "Insert valid deposit amount for gun purchase", "Money Deposit") + if(!transaction_amount || QDELETED(user) || QDELETED(src) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) + return ITEM_INTERACT_BLOCKING + pin_owner = id.registered_account + payment_amount = transaction_amount + gun_owners += user.get_bank_account() + to_chat(user, span_notice("You link the card to the firing pin.")) + return ITEM_INTERACT_SUCCESS /obj/item/firing_pin/paywall/pin_auth(mob/living/user) if(!istype(user))//nice try commie @@ -311,7 +314,7 @@ if(active_prompt_user == user) return FALSE active_prompt_user = user - var/license_request = tgui_alert(user, "Do you wish to pay [payment_amount] credit[( payment_amount > 1 ) ? "s" : ""] for [( multi_payment ) ? "each shot of [gun.name]" : "usage license of [gun.name]"]?", "Weapon Purchase", list("Yes", "No"), 15 SECONDS) + var/license_request = tgui_alert(user, "Do you wish to pay [payment_amount] [MONEY_NAME_AUTOPURAL(payment_amount)] for [( multi_payment ) ? "each shot of [gun.name]" : "usage license of [gun.name]"]?", "Weapon Purchase", list("Yes", "No"), 15 SECONDS) if(!user.can_perform_action(src)) active_prompt_user = null return FALSE @@ -326,12 +329,12 @@ 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 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 return FALSE //we return false here so you don't click initially to fire, get the prompt, accept the prompt, and THEN the gun @@ -354,28 +357,22 @@ name = "laser tag firing pin" desc = "A recreational firing pin, used in laser tag units to ensure users have their vests on." fail_message = "suit check failed!" - var/obj/item/clothing/suit/suit_requirement = null - var/tagcolor = "" + default_pin_auth = FALSE + var/tagcolor = LASERTAG_TEAM_NEUTRAL -/obj/item/firing_pin/tag/pin_auth(mob/living/user) - if(ishuman(user)) - var/mob/living/carbon/human/M = user - if(istype(M.wear_suit, suit_requirement)) - return TRUE +/obj/item/firing_pin/tag/auth_fail(mob/living/user) + . = ..() to_chat(user, span_warning("You need to be wearing [tagcolor] laser tag armor!")) - return FALSE /obj/item/firing_pin/tag/red name = "red laser tag firing pin" icon_state = "firing_pin_red" - suit_requirement = /obj/item/clothing/suit/redtag - tagcolor = "red" + tagcolor = LASERTAG_TEAM_RED /obj/item/firing_pin/tag/blue name = "blue laser tag firing pin" icon_state = "firing_pin_blue" - suit_requirement = /obj/item/clothing/suit/bluetag - tagcolor = "blue" + tagcolor = LASERTAG_TEAM_BLUE /obj/item/firing_pin/monkey name = "monkeylock firing pin" diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index b613e641a352..2c749d6c224b 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -635,6 +635,8 @@ var/mob/living/living_target = target living_target.block_projectile_effects() return FALSE + if(HAS_TRAIT(target, TRAIT_UNHITTABLE_BY_LASERS) && (armor_flag & LASER)) + return FALSE if(!ignore_source_check && firer && !direct_target) if(target == firer || (target == firer.loc && ismecha(firer.loc)) || (target in firer.buckled_mobs)) return FALSE @@ -782,6 +784,12 @@ if (!log_override && firer && original && !do_not_log) 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. + // DARKPACK EDIT ADD START - Storyteller Stats + if(firer && ishuman(firer)) + var/mob/living/carbon/human/human_firer = firer + if(prob(human_firer.st_get_stat(STAT_FIREARMS) * 10)) + damage *= 1.4 //just a constant var in the old code, felt no need to declare it + // DARKPACK EDIT ADD END - Storyteller Stats if (direct_target && (get_dist(direct_target, get_turf(src)) <= 1)) // point blank shots impact(direct_target) if (QDELETED(src)) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index fe4f9c47d39c..4a8a13b05a42 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -28,17 +28,18 @@ damage = 25 exposed_wound_bonus = 40 -/obj/projectile/beam/laser/carbine +/obj/projectile/beam/laser/rapid + name = "rapid fire laser" icon_state = "carbine_laser" impact_effect_type = /obj/effect/temp_visual/impact_effect/yellow_laser - damage = 10 + damage = 20 -/obj/projectile/beam/laser/carbine/practice - name = "practice laser" +/obj/projectile/beam/laser/rapid/practice + name = "practice rapid fire laser" impact_effect_type = /obj/effect/temp_visual/impact_effect/yellow_laser damage = 0 -/obj/projectile/beam/laser/carbine/cybersun +/obj/projectile/beam/laser/cybersun name = "red plasma beam" icon_state = "lava" light_color = COLOR_DARK_RED @@ -47,6 +48,20 @@ wound_bonus = -40 speed = 0.9 +/obj/projectile/beam/laser/accelerator + name = "accelerator laser" + icon_state = "scatterlaser" + range = 255 + damage = 6 + var/size_per_tile = 0.1 + var/max_scale = 4 + +/obj/projectile/beam/laser/accelerator/reduce_range() + ..() + damage += 7 + transform = matrix() + transform *= min(1 + (maximum_range - range) * size_per_tile, max_scale) + //overclocked laser, does a bit more damage but has much higher wound power (-0 vs -20) /obj/projectile/beam/laser/hellfire name = "hellfire laser" @@ -103,6 +118,15 @@ stamina = 20 weak_against_armour = FALSE +/obj/projectile/beam/laser/musket/repeater + name = "clockwork laser" + icon_state = "laser_repeater" + impact_effect_type = /obj/effect/temp_visual/impact_effect/yellow_laser + damage = 28 + stamina = 35 + weak_against_armour = TRUE + light_color = COLOR_DARK_ORANGE + /obj/projectile/beam/weak damage = 15 @@ -368,21 +392,14 @@ hitsound = null damage = 0 damage_type = STAMINA - var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag) impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE - -/obj/projectile/beam/lasertag/on_hit(atom/target, blocked = 0, pierce_hit) - . = ..() - if(ishuman(target)) - var/mob/living/carbon/human/M = target - if(istype(M.wear_suit)) - if(M.wear_suit.type in suit_types) - M.adjustStaminaLoss(34) + var/lasertag_team = LASERTAG_TEAM_NEUTRAL + var/lasertag_damage = 34 /obj/projectile/beam/lasertag/redtag icon_state = "laser" - suit_types = list(/obj/item/clothing/suit/bluetag) + lasertag_team = LASERTAG_TEAM_RED impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser light_color = COLOR_SOFT_RED tracer_type = /obj/effect/projectile/tracer/laser @@ -395,7 +412,7 @@ /obj/projectile/beam/lasertag/bluetag icon_state = "bluelaser" - suit_types = list(/obj/item/clothing/suit/redtag) + lasertag_team = LASERTAG_TEAM_BLUE tracer_type = /obj/effect/projectile/tracer/laser/blue muzzle_type = /obj/effect/projectile/muzzle/laser/blue impact_type = /obj/effect/projectile/impact/laser/blue diff --git a/code/modules/projectiles/projectile/bullets/cannonball.dm b/code/modules/projectiles/projectile/bullets/cannonball.dm index 167f61dfa2c8..30c95fdad6c0 100644 --- a/code/modules/projectiles/projectile/bullets/cannonball.dm +++ b/code/modules/projectiles/projectile/bullets/cannonball.dm @@ -57,7 +57,7 @@ damage = 15 //very low /obj/projectile/bullet/cannonball/emp/on_hit(atom/target, blocked = 0, pierce_hit) - empulse(src, 4, 10) + empulse(src, 4, 10, emp_source = src) . = ..() /obj/projectile/bullet/cannonball/biggest_one diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index 09264fdb964d..1b8bd34088b2 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -65,6 +65,7 @@ ricochet_shoots_firer = FALSE shrapnel_type = null embed_type = null + armour_penetration = 30 // premium .38 ammo from cargo, weak against armor, lower base damage, but excellent at embedding and causing slice wounds at close range /obj/projectile/bullet/c38/dumdum @@ -177,7 +178,7 @@ /obj/projectile/bullet/pea/on_hit(mob/living/carbon/target, blocked = 0, pierce_hit) if(istype(target) && blocked != 100) if(iszombie(target)) // https://www.youtube.com/watch?v=ssZoq1eUK-s - target.adjustBruteLoss(15) + target.adjust_brute_loss(15) if(target.can_inject(target_zone = def_zone)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. ..() reagents.trans_to(target, reagents.total_volume, methods = INJECT) diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index 85c2ef8e2a40..7cc8deaf976e 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -228,3 +228,43 @@ desc = "doink!" damage_type = BRUTE icon_state = "paperball" + +//Big Ballista Mounted gun Spear +/obj/projectile/bullet/ballista_spear + name = "Spear" + icon_state = "ballista_spear" + damage = 80 + speed = 3 + catastropic_dismemberment = TRUE + projectile_piercing = PASSMOB + dismemberment = 3 + embed_type = null + armour_penetration = 25 + wound_bonus = 15 + exposed_wound_bonus = 30 + damage_type = BRUTE + shrapnel_type = /obj/item/spear + +/obj/projectile/bullet/ballista_spear/Initialize(mapload) + . = ..() + AddElement(/datum/element/projectile_drop, shrapnel_type) + +/obj/projectile/bullet/ballista_spear_dragon + name = "Dragon-Slaying Spear" + icon_state = "ballista_spear_dragon" + damage = 120 + speed = 4 + catastropic_dismemberment = TRUE + projectile_piercing = PASSMOB + dismemberment = 3 + embed_type = null + armour_penetration = 25 + wound_bonus = 15 + exposed_wound_bonus = 30 + damage_type = BRUTE + shrapnel_type = /obj/item/spear/dragonator + +/obj/projectile/bullet/ballista_spear_dragon/Initialize(mapload) + . = ..() + AddElement(/datum/element/projectile_drop, shrapnel_type) + AddElement(/datum/element/bane, mob_biotypes = MOB_MINING, damage_multiplier = 2) diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm index ce352fcd93ad..0a13cbb9e84c 100644 --- a/code/modules/projectiles/projectile/bullets/sniper.dm +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -50,7 +50,7 @@ if(issilicon(target)) //also especially good against borgs var/mob/living/silicon/borg_boy = target borg_boy.apply_damage(damage, BRUTE) - empulse(target, emp_radius, emp_radius) + empulse(target, emp_radius, emp_radius, emp_source = src) /obj/projectile/bullet/p50/incendiary name =".50 BMG incendiary bullet" diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 960ce2ec4ba7..4d244c900764 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -371,7 +371,8 @@ /atom/movable/screen/alert/tazed name = "Tased!" desc = "You're being tased! You can click this or resist to attempt to stop it, assuming you've not already collapsed." - icon_state = "stun" + use_user_hud_icon = TRUE + overlay_state = "stun" clickable_glow = TRUE /atom/movable/screen/alert/tazed/Click(location, control, params) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index b7c761e49bc0..54791311f9dc 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -354,7 +354,7 @@ . = ..() if(iscarbon(target)) if(istype(get_area(target), /area/deathmatch)) - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 25) // Roughly 8 hits to kill + target.adjust_organ_loss(ORGAN_SLOT_BRAIN, 25) // Roughly 8 hits to kill target.visible_message(span_warning("[target] grips their head in pain!")) return BULLET_ACT_HIT for(var/x in target.get_traumas())//checks to see if the victim is already going through possession diff --git a/code/modules/projectiles/projectile/special/floral.dm b/code/modules/projectiles/projectile/special/floral.dm index 608679bf6da2..32a43cb56ef4 100644 --- a/code/modules/projectiles/projectile/special/floral.dm +++ b/code/modules/projectiles/projectile/special/floral.dm @@ -28,11 +28,11 @@ /obj/projectile/energy/flora/mut/on_hit_plant_effect(mob/living/hit_plant) if(prob(85)) - hit_plant.adjustFireLoss(rand(5, 15)) + hit_plant.adjust_fire_loss(rand(5, 15)) hit_plant.show_message(span_userdanger("The radiation beam singes you!")) return - hit_plant.adjustToxLoss(rand(3, 6)) + hit_plant.adjust_tox_loss(rand(3, 6)) hit_plant.Paralyze(10 SECONDS) hit_plant.visible_message( span_warning("[hit_plant] writhes in pain as [hit_plant.p_their()] vacuoles boil."), diff --git a/code/modules/projectiles/projectile/special/ion.dm b/code/modules/projectiles/projectile/special/ion.dm index 9d25f1504cde..96dacf6305ef 100644 --- a/code/modules/projectiles/projectile/special/ion.dm +++ b/code/modules/projectiles/projectile/special/ion.dm @@ -9,7 +9,7 @@ /obj/projectile/ion/on_hit(atom/target, blocked = 0, pierce_hit) ..() - empulse(target, emp_radius, emp_radius) + empulse(target, emp_radius, emp_radius, emp_source = src) return BULLET_ACT_HIT /obj/projectile/ion/weak diff --git a/code/modules/projectiles/projectile/special/meteor.dm b/code/modules/projectiles/projectile/special/meteor.dm index 7cecbecc6aa3..1555b193ba45 100644 --- a/code/modules/projectiles/projectile/special/meteor.dm +++ b/code/modules/projectiles/projectile/special/meteor.dm @@ -8,6 +8,12 @@ armour_penetration = 100 damage_type = BRUTE armor_flag = BULLET + mouse_opacity = MOUSE_OPACITY_ICON + obj_flags = NONE + +/obj/projectile/meteor/Initialize(mapload) + . = ..() + AddComponent(/datum/component/meteor_combat, CALLBACK(src, PROC_REF(deflect))) /obj/projectile/meteor/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() @@ -28,3 +34,8 @@ if(!onlookers_in_range.stat) shake_camera(onlookers_in_range, 3, 1) qdel(src) + +///Called by component/meteor_combat to direct us away from whatever has punched us. +/obj/projectile/meteor/proc/deflect(mob/user) + firer = user + set_angle(get_angle(user, src) + rand(-45, 45)) diff --git a/code/modules/projectiles/projectile/special/mindflayer.dm b/code/modules/projectiles/projectile/special/mindflayer.dm index 9f15e9389d59..139ae7f46b7b 100644 --- a/code/modules/projectiles/projectile/special/mindflayer.dm +++ b/code/modules/projectiles/projectile/special/mindflayer.dm @@ -5,5 +5,5 @@ . = ..() if(ishuman(target)) var/mob/living/carbon/human/human_hit = target - human_hit.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20) + human_hit.adjust_organ_loss(ORGAN_SLOT_BRAIN, 20) human_hit.adjust_hallucinations(60 SECONDS) diff --git a/code/modules/projectiles/projectile/special/saboteur.dm b/code/modules/projectiles/projectile/special/saboteur.dm index 9bfbeaa8cba2..c64d182a6fc5 100644 --- a/code/modules/projectiles/projectile/special/saboteur.dm +++ b/code/modules/projectiles/projectile/special/saboteur.dm @@ -21,7 +21,7 @@ var/list/things_to_disrupt = list(target) if(isliving(target)) var/mob/living/live_target = target - things_to_disrupt += live_target.get_all_gear() + things_to_disrupt += live_target.get_all_gear(INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT|INCLUDE_ACCESSORIES) var/success = FALSE for(var/atom/disrupted as anything in things_to_disrupt) diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm index 4c4ad4075d84..2efa09635561 100644 --- a/code/modules/reagents/chem_splash.dm +++ b/code/modules/reagents/chem_splash.dm @@ -52,7 +52,7 @@ for(var/datum/reagents/reactant as anything in reactants) reactant.trans_to(holder, reactant.total_volume, threatscale, no_react = TRUE) - holder.chem_temp += extra_heat // Average temperature of reagents + extra heat. + holder.chem_temp = max(holder.chem_temp + extra_heat, TCMB) // Average temperature of reagents + extra heat. holder.handle_reactions() // React them now. if(holder.total_volume) diff --git a/code/modules/reagents/chemistry/equilibrium.dm b/code/modules/reagents/chemistry/equilibrium.dm index 76f45e77cabf..e1e9be5a2732 100644 --- a/code/modules/reagents/chemistry/equilibrium.dm +++ b/code/modules/reagents/chemistry/equilibrium.dm @@ -373,10 +373,9 @@ total_step_added += step_add #ifdef REAGENTS_TESTING //Kept in so that people who want to write fermireactions can contact me with this log so I can help them - if(GLOB.Debug2) //I want my spans for my sanity - message_admins(span_green("Reaction step active for:[reaction.type]")) - message_admins(span_notice("|Reaction conditions| Temp: [holder.chem_temp], pH: [holder.ph], reactions: [length(holder.reaction_list)], awaiting reactions: [length(holder.failed_but_capable_reactions)], no. reagents:[length(holder.reagent_list)], no. prev reagents: [length(holder.previous_reagent_list)]")) - message_admins(span_warning("Reaction vars: PreReacted:[reacted_vol] of [step_target_vol] of total [target_vol]. delta_t [delta_t], multiplier [multiplier], delta_chem_factor [delta_chem_factor] Pfactor [product_ratio], purity of [purity] from a delta_ph of [delta_ph]. DeltaTime: [seconds_per_tick]")) + debug_admins(span_green("Reaction step active for:[reaction.type]")) + debug_admins(span_notice("|Reaction conditions| Temp: [holder.chem_temp], pH: [holder.ph], reactions: [length(holder.reaction_list)], awaiting reactions: [length(holder.failed_but_capable_reactions)], no. reagents:[length(holder.reagent_list)], no. prev reagents: [length(holder.previous_reagent_list)]")) + debug_admins(span_warning("Reaction vars: PreReacted:[reacted_vol] of [step_target_vol] of total [target_vol]. delta_t [delta_t], multiplier [multiplier], delta_chem_factor [delta_chem_factor] Pfactor [product_ratio], purity of [purity] from a delta_ph of [delta_ph]. DeltaTime: [seconds_per_tick]")) #endif //Apply thermal output of reaction to beaker diff --git a/code/modules/reagents/chemistry/holder/mob_life.dm b/code/modules/reagents/chemistry/holder/mob_life.dm index 39fb016caad6..a48fd9d257a1 100644 --- a/code/modules/reagents/chemistry/holder/mob_life.dm +++ b/code/modules/reagents/chemistry/holder/mob_life.dm @@ -95,7 +95,8 @@ if(!owner || !reagent || (dead && !(reagent.chemical_flags & REAGENT_DEAD_PROCESS))) return FALSE - if(owner.reagent_tick(reagent, seconds_per_tick, times_fired)) + var/tick_return = owner.reagent_tick(reagent, seconds_per_tick, times_fired) + if(tick_return & COMSIG_MOB_STOP_REAGENT_TICK) return FALSE if(liverless && !reagent.self_consuming) //need to be metabolized @@ -124,7 +125,7 @@ if(dead && !QDELETED(owner) && !QDELETED(reagent)) need_mob_update += reagent.on_mob_dead(owner, seconds_per_tick) - if(!QDELETED(owner) && !QDELETED(reagent)) + if(!QDELETED(owner) && !QDELETED(reagent) && !(tick_return & COMSIG_MOB_STOP_REAGENT_METABOLISM)) reagent.metabolize_reagent(owner, seconds_per_tick, times_fired) return need_mob_update diff --git a/code/modules/reagents/chemistry/holder/reactions.dm b/code/modules/reagents/chemistry/holder/reactions.dm index b5ba957e069e..1950399c7063 100644 --- a/code/modules/reagents/chemistry/holder/reactions.dm +++ b/code/modules/reagents/chemistry/holder/reactions.dm @@ -237,7 +237,7 @@ var/list/mix_message = list() for(var/datum/equilibrium/equilibrium as anything in reaction_list) mix_message += end_reaction(equilibrium) - if(my_atom && length(mix_message)) + if(!QDELETED(my_atom) && length(mix_message)) my_atom.audible_message(span_notice("[icon2html(my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] [mix_message.Join()]")) finish_reacting() @@ -339,7 +339,7 @@ my_atom.visible_message(span_notice("[iconhtml] \The [my_atom]'s power is consumed in the reaction.")) extract.name = "used slime extract" extract.desc = "This extract has been used up." - extract.grind_results.Cut() + extract.can_grind = FALSE //finish the reaction selected_reaction.on_reaction(src, null, multiplier) diff --git a/code/modules/reagents/chemistry/holder/ui_data.dm b/code/modules/reagents/chemistry/holder/ui_data.dm index 244b264721fd..9b5cfa1984eb 100644 --- a/code/modules/reagents/chemistry/holder/ui_data.dm +++ b/code/modules/reagents/chemistry/holder/ui_data.dm @@ -257,27 +257,8 @@ //Use GLOB list - saves processing data["master_reaction_list"] = GLOB.chemical_reactions_results_lookup_list data["bitflags"] = list() - data["bitflags"]["BRUTE"] = REACTION_TAG_BRUTE - data["bitflags"]["BURN"] = REACTION_TAG_BURN - data["bitflags"]["TOXIN"] = REACTION_TAG_TOXIN - data["bitflags"]["OXY"] = REACTION_TAG_OXY - data["bitflags"]["HEALING"] = REACTION_TAG_HEALING - data["bitflags"]["DAMAGING"] = REACTION_TAG_DAMAGING - data["bitflags"]["EXPLOSIVE"] = REACTION_TAG_EXPLOSIVE - data["bitflags"]["OTHER"] = REACTION_TAG_OTHER - data["bitflags"]["DANGEROUS"] = REACTION_TAG_DANGEROUS - data["bitflags"]["EASY"] = REACTION_TAG_EASY - data["bitflags"]["MODERATE"] = REACTION_TAG_MODERATE - data["bitflags"]["HARD"] = REACTION_TAG_HARD - data["bitflags"]["ORGAN"] = REACTION_TAG_ORGAN - data["bitflags"]["DRINK"] = REACTION_TAG_DRINK - data["bitflags"]["FOOD"] = REACTION_TAG_FOOD - data["bitflags"]["SLIME"] = REACTION_TAG_SLIME - data["bitflags"]["DRUG"] = REACTION_TAG_DRUG - data["bitflags"]["UNIQUE"] = REACTION_TAG_UNIQUE - data["bitflags"]["CHEMICAL"] = REACTION_TAG_CHEMICAL - data["bitflags"]["PLANT"] = REACTION_TAG_PLANT - data["bitflags"]["COMPETITIVE"] = REACTION_TAG_COMPETITIVE + for(var/readable_flag, real_flag in REACTION_TAG_READABLE) + data["bitflags"][readable_flag] = real_flag return data @@ -407,5 +388,12 @@ if("toggle_tag_competitive") ui_tags_selected = ui_tags_selected ^ REACTION_TAG_COMPETITIVE return TRUE + if("toggle_tag_component") + ui_tags_selected = ui_tags_selected ^ REACTION_TAG_COMPONENT + return TRUE + if("toggle_tag_active") + ui_tags_selected = ui_tags_selected ^ REACTION_TAG_ACTIVE + return TRUE + if("update_ui") return TRUE diff --git a/code/modules/reagents/chemistry/items.dm b/code/modules/reagents/chemistry/items.dm index 735fc0374868..456af9f8e986 100644 --- a/code/modules/reagents/chemistry/items.dm +++ b/code/modules/reagents/chemistry/items.dm @@ -15,6 +15,7 @@ resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_TINY interaction_flags_mouse_drop = NEED_HANDS + custom_materials = list(/datum/material/paper = HALF_SHEET_MATERIAL_AMOUNT / 2) ///How many pages the booklet holds var/number_of_pages = 50 @@ -150,7 +151,7 @@ desc = "A small table size burner used for heating up beakers." icon = 'icons/obj/medical/chemical.dmi' icon_state = "burner" - grind_results = list(/datum/reagent/consumable/ethanol = 5, /datum/reagent/silicon = 10) + custom_materials = list(/datum/material/paper = HALF_SHEET_MATERIAL_AMOUNT / 2) item_flags = NOBLUDGEON resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_TINY @@ -168,6 +169,9 @@ if(reagent_type) reagents.add_reagent(reagent_type, 15) +/obj/item/burner/grind_results() + return list(/datum/reagent/consumable/ethanol = 5, /datum/reagent/silicon = 10) + /obj/item/burner/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(is_reagent_container(I)) @@ -281,11 +285,15 @@ /obj/item/burner/oil reagent_type = /datum/reagent/fuel/oil - grind_results = list(/datum/reagent/fuel/oil = 5, /datum/reagent/silicon = 10) + +/obj/item/burner/oil/grind_results() + return list(/datum/reagent/fuel/oil = 5, /datum/reagent/silicon = 10) /obj/item/burner/fuel reagent_type = /datum/reagent/fuel - grind_results = list(/datum/reagent/fuel = 5, /datum/reagent/silicon = 10) + +/obj/item/burner/fuel/grind_results() + return list(/datum/reagent/fuel = 5, /datum/reagent/silicon = 10) /obj/item/thermometer name = "thermometer" @@ -294,7 +302,7 @@ icon = 'icons/obj/medical/chemical.dmi' item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_TINY - grind_results = list(/datum/reagent/mercury = 5) + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT) ///The reagents datum that this object is attached to, so we know where we are when it's added to something. var/datum/reagents/attached_to_reagents @@ -302,6 +310,9 @@ attached_to_reagents = null return ..() +/obj/item/thermometer/grind_results() + return list(/datum/reagent/mercury = 5) + /obj/item/thermometer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(isnull(interacting_with.reagents)) return NONE @@ -352,6 +363,7 @@ /obj/item/thermometer/pen color = "#888888" + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.1) #undef DETAILED_CHEM_OUTPUT #undef SHORTENED_CHEM_OUTPUT diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index a1cf164a4960..8a1bc7479b6e 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -23,7 +23,7 @@ /// If the UI has the pH meter shown var/show_ph = TRUE /// The overlay used to display the beaker on the machine - var/mutable_appearance/beaker_overlay + VAR_PRIVATE/mutable_appearance/beaker_overlay /// Icon to display when the machine is powered var/working_state = "dispenser_working" /// Icon to display when the machine is not powered @@ -41,9 +41,14 @@ /// Starting purity of the created reagents var/base_reagent_purity = 1 /// Records the reagents dispensed by the user if this list is not null - var/list/recording_recipe + VAR_PRIVATE/list/recording_recipe /// Saves all the recipes recorded by the machine - var/list/saved_recipes = list() + VAR_PRIVATE/list/saved_recipes = list() + + /// Filters out all reactions that don't have any of these tags from the reaction list + var/shown_reaction_tags = DAMAGE_HEALING_REACTION_TAGS | MEDICATION_REACTION_TAGS | CHEMIST_REACTION_TAGS + /// Filters out all reactions that have any one of these tags from the reaction list + var/hidden_reaction_tags = REACTION_TAG_ACTIVE | REACTION_TAG_FOOD | REACTION_TAG_DRINK /// The default list of dispensable_reagents var/static/list/default_dispensable_reagents = list( @@ -90,6 +95,7 @@ /datum/reagent/drug/space_drugs, /datum/reagent/toxin ) + /obj/machinery/chem_dispenser/Initialize(mapload) if(dispensable_reagents != null && !dispensable_reagents.len) dispensable_reagents = default_dispensable_reagents @@ -214,6 +220,8 @@ .["displayedUnits"] = cell.charge ? (cell.charge / power_cost) : 0 .["displayedMaxUnits"] = cell.maxcharge / power_cost .["showpH"] = isnull(recording_recipe) ? show_ph : FALSE //virtual beakers have no ph to compute & display + var/obj/item/held_item = user.get_active_held_item() + .["hasBeakerInHand"] = held_item?.is_chem_container() || FALSE var/list/chemicals = list() var/is_hallucinating = FALSE @@ -255,6 +263,18 @@ beaker_data["contents"] = beakerContents .["beaker"] = beaker_data +/obj/machinery/chem_dispenser/ui_static_data(mob/user) + var/list/data = list() + + data["reaction_list"] = get_reaction_list() + data["all_bitflags"] = list() + for(var/readable_flag, real_flag in REACTION_TAG_READABLE) + if((real_flag & hidden_reaction_tags) || !(real_flag & shown_reaction_tags)) + continue + data["all_bitflags"][readable_flag] = real_flag + + return data + /obj/machinery/chem_dispenser/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) @@ -306,6 +326,13 @@ replace_beaker(ui.user) return TRUE + if("insert") + var/obj/item/reagent_containers/container = ui.user.get_active_held_item() + if(container?.can_insert_container(ui.user, src)) + replace_beaker(ui.user, container) + + return TRUE + if("dispense_recipe") if(!is_operational || QDELETED(cell)) return @@ -400,14 +427,13 @@ return ITEM_INTERACT_BLOCKING /obj/machinery/chem_dispenser/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(is_reagent_container(tool) && !(tool.item_flags & ABSTRACT) && tool.is_open_container()) - if(!user.transferItemToLoc(tool, src)) - return ITEM_INTERACT_BLOCKING - replace_beaker(user, tool) - ui_interact(user) - return ITEM_INTERACT_SUCCESS + if(!tool.can_insert_container(user, src)) + return NONE + if(!replace_beaker(user, tool)) + return ITEM_INTERACT_BLOCKING - return NONE + ui_interact(user) + return ITEM_INTERACT_SUCCESS /obj/machinery/chem_dispenser/get_cell() return cell @@ -453,15 +479,25 @@ parts_rating += servo.tier power_cost = max(new_power_cost, 0.1 KILO WATTS) +/** + * Insert, remove, replace the existig beaker. Returns TRUE on success. + * Arguments: + * + * * mob/living/user - the player trying to replace the beaker + * * obj/item/reagent_containers/new_beaker - the beaker we are trying to insert, swap with existing or remove if null + */ /obj/machinery/chem_dispenser/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) - if(!user) - return FALSE - if(beaker) + if(!QDELETED(beaker)) try_put_in_hand(beaker, user) - beaker = null - if(new_beaker) + if(!QDELETED(new_beaker)) + if(!user.transferItemToLoc(new_beaker, src)) + update_appearance(UPDATE_OVERLAYS) + return FALSE + beaker = new_beaker - update_appearance() + + update_appearance(UPDATE_OVERLAYS) + return TRUE /obj/machinery/chem_dispenser/on_deconstruction(disassembled) @@ -486,6 +522,61 @@ /obj/machinery/chem_dispenser/attack_ai_secondary(mob/user, list/modifiers) return attack_hand_secondary(user, modifiers) +/obj/machinery/chem_dispenser/proc/get_reaction_list() + var/static/list/reaction_list + if(reaction_list?[type]) + return reaction_list[type] + + reaction_list ||= list() + reaction_list[type] = list() + + var/list/new_reaction_list = list() + for(var/result, reactions in GLOB.chemical_reactions_list_product_index - dispensable_reagents) + var/datum/reagent/result_datum = GLOB.chemical_reagents_list[result] + for(var/datum/chemical_reaction/reaction as anything in reactions) + if(!(reaction.reaction_tags & shown_reaction_tags)) + continue + if(reaction.reaction_tags & hidden_reaction_tags) + continue + if(reaction.required_container) + continue + + var/index = result_datum.name + var/list/new_info = get_reaction_info(reaction) + new_info["description"] = result_datum.description + new_info["color"] = result_datum.color + + var/num_alts = 0 + while(new_reaction_list[index]) + num_alts++ + index = "[result_datum.name] (Alt[num_alts == 1 ? "" : " #[num_alts]"])" + + new_reaction_list[index] = new_info + + reaction_list[type] = new_reaction_list + return reaction_list[type] + +/obj/machinery/chem_dispenser/proc/get_reaction_info(datum/chemical_reaction/reaction) + var/list/info = list() + info["id"] = reaction.type + info["lower_temperature"] = reaction.required_temp + info["upper_temperature"] = reaction.optimal_temp + info["lower_ph"] = reaction.optimal_ph_min + info["upper_ph"] = reaction.optimal_ph_max + info["bitflags"] = reaction.reaction_tags + info["required_reagents"] = reagent_list_to_info(reaction.required_reagents) + info["required_catalysts"] = reagent_list_to_info(reaction.required_catalysts) + return info + +/obj/machinery/chem_dispenser/proc/reagent_list_to_info(list/reagent_list) + var/list/info = list() + for(var/datum/reagent/reagent_typepath as anything in reagent_list) + info += list(list( + "name" = reagent_typepath::name, + "amount" = reagent_list[reagent_typepath], + "typepath" = reagent_typepath, + )) + return info /obj/machinery/chem_dispenser/drinks name = "soda dispenser" @@ -502,6 +593,8 @@ nopower_state = null pass_flags = PASSTABLE show_ph = FALSE + shown_reaction_tags = KITCHEN_REACTION_TAGS + hidden_reaction_tags = REACTION_TAG_ACTIVE /// The default list of reagents dispensable by the soda dispenser var/static/list/drinks_dispensable_reagents = list( /datum/reagent/consumable/coffee, @@ -546,7 +639,7 @@ if(emagged_reagents != null && !emagged_reagents.len) emagged_reagents = drink_emagged_reagents . = ..() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) /obj/machinery/chem_dispenser/drinks/setDir() var/old = dir @@ -658,6 +751,8 @@ name = "botanical chemical dispenser" desc = "Creates and dispenses chemicals useful for botany." circuit = /obj/item/circuitboard/machine/chem_dispenser/mutagensaltpeter + shown_reaction_tags = BOTANIST_REACTION_TAGS + hidden_reaction_tags = REACTION_TAG_ACTIVE /// The default list of dispensable reagents available in the mutagensaltpeter chem dispenser var/static/list/mutagensaltpeter_dispensable_reagents = list( diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 723230bc7943..f3432ccb9365 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -46,10 +46,10 @@ if(istype(held_item, /obj/item/reagent_containers/dropper) || istype(held_item, /obj/item/reagent_containers/syringe)) context[SCREENTIP_CONTEXT_LMB] = "Inject" return CONTEXTUAL_SCREENTIP_SET - if(is_reagent_container(held_item) && held_item.is_open_container()) + if(held_item.is_chem_container()) context[SCREENTIP_CONTEXT_LMB] = "Replace beaker" return CONTEXTUAL_SCREENTIP_SET - else if(is_reagent_container(held_item) && held_item.is_open_container()) + else if(held_item.is_chem_container()) context[SCREENTIP_CONTEXT_LMB] = "Insert beaker" return CONTEXTUAL_SCREENTIP_SET @@ -90,22 +90,22 @@ heater_coefficient *= micro_laser.tier /obj/machinery/chem_heater/item_interaction(mob/living/user, obj/item/held_item, list/modifiers) - if(user.combat_mode || (held_item.item_flags & ABSTRACT) || (held_item.flags_1 & HOLOGRAM_1) || !user.can_perform_action(src, ALLOW_SILICON_REACH | FORBID_TELEKINESIS_REACH)) - return NONE - if(!QDELETED(beaker)) if(istype(held_item, /obj/item/reagent_containers/dropper) || istype(held_item, /obj/item/reagent_containers/syringe)) var/obj/item/reagent_containers/injector = held_item injector.interact_with_atom(beaker, user, modifiers) return ITEM_INTERACT_SUCCESS - if(is_reagent_container(held_item) && held_item.is_open_container()) - if(replace_beaker(user, held_item)) - ui_interact(user) - balloon_alert(user, "beaker added") - return ITEM_INTERACT_SUCCESS + if(!held_item.can_insert_container(user, src)) + return NONE - return NONE + if(!replace_beaker(user, held_item)) + return ITEM_INTERACT_BLOCKING + + ui_interact(user) + balloon_alert(user, "beaker added") + + return ITEM_INTERACT_SUCCESS /obj/machinery/chem_heater/wrench_act(mob/living/user, obj/item/tool) if(user.combat_mode) @@ -147,7 +147,7 @@ return attack_hand_secondary(user, modifiers) /** - * Replace or eject the beaker inside this machine + * Replace or eject the beaker inside this machine. Returns TRUE on success. * Arguments * * mob/living/user - the player operating this machine * * obj/item/reagent_containers/new_beaker - the new beaker to replace the current one if not null else it will just eject @@ -160,12 +160,12 @@ if(!QDELETED(new_beaker)) if(!user.transferItemToLoc(new_beaker, src)) - update_appearance() + update_appearance(UPDATE_ICON_STATE) return FALSE beaker = new_beaker RegisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP, PROC_REF(on_reaction_step)) - update_appearance() + update_appearance(UPDATE_ICON_STATE) return TRUE @@ -221,6 +221,8 @@ .["targetTemp"] = target_temperature .["isActive"] = on .["upgradeLevel"] = heater_coefficient * 10 + var/obj/item/held_item = user.get_active_held_item() + .["hasBeakerInHand"] = held_item?.is_chem_container() || FALSE var/list/beaker_data = null var/chem_temp = 0 @@ -322,6 +324,13 @@ //Eject doesn't turn it off, so you can preheat for beaker swapping return replace_beaker(ui.user) + if("insert") + var/obj/item/reagent_containers/container = ui.user.get_active_held_item() + if(container?.can_insert_container(ui.user, src)) + replace_beaker(ui.user, container) + + return TRUE + if("acidBuffer") var/target = params["target"] if(!target) diff --git a/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm b/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm index 7cf10157aadc..b33016b452ae 100644 --- a/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm +++ b/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm @@ -61,7 +61,7 @@ if(isnull(held_item) || (held_item.item_flags & ABSTRACT) || (held_item.flags_1 & HOLOGRAM_1)) return - if(is_reagent_container(held_item)) + if(held_item.is_chem_container()) if(QDELETED(beaker1)) context[SCREENTIP_CONTEXT_LMB] = "Insert input beaker" else @@ -146,26 +146,22 @@ cms_coefficient /= laser.tier /obj/machinery/chem_mass_spec/item_interaction(mob/living/user, obj/item/item, list/modifiers) - if((item.item_flags & ABSTRACT) || (item.flags_1 & HOLOGRAM_1) || !can_interact(user) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return NONE + if(processing_reagents) + balloon_alert(user, "still processing!") + return ITEM_INTERACT_BLOCKING - if(is_reagent_container(item) && item.is_open_container()) - if(processing_reagents) - balloon_alert(user, "still processing!") - return ITEM_INTERACT_BLOCKING + if(!item.can_insert_container(user, src)) + return NONE - var/obj/item/reagent_containers/beaker = item - if(!user.transferItemToLoc(beaker, src)) - return ITEM_INTERACT_BLOCKING + var/is_right_clicking = LAZYACCESS(modifiers, RIGHT_CLICK) + if(!replace_beaker(user, !is_right_clicking, item)) + return ITEM_INTERACT_BLOCKING - var/is_right_clicking = LAZYACCESS(modifiers, RIGHT_CLICK) - replace_beaker(user, !is_right_clicking, beaker) - to_chat(user, span_notice("You add [beaker] to [is_right_clicking ? "output" : "input"] slot.")) - update_appearance() - ui_interact(user) - return ITEM_INTERACT_SUCCESS + to_chat(user, span_notice("You add [item] to [is_right_clicking ? "output" : "input"] slot.")) + update_appearance() + ui_interact(user) - return NONE + return ITEM_INTERACT_SUCCESS /obj/machinery/chem_mass_spec/wrench_act(mob/living/user, obj/item/tool) . = ITEM_INTERACT_BLOCKING @@ -222,7 +218,7 @@ return smallest ? FLOOR(result, 50) : CEILING(result, 50) /* - * Replaces a beaker in the machine, either input or output + * Replaces a beaker in the machine, either input or output. Returns TRUE on success. * Arguments * * * user - The one bonking the machine @@ -235,17 +231,29 @@ if(is_input) //replace input beaker if(!QDELETED(beaker1)) try_put_in_hand(beaker1, user) - beaker1 = new_beaker - lower_mass_range = calculate_mass(smallest = TRUE) - upper_mass_range = calculate_mass(smallest = FALSE) - estimate_time() + if(!QDELETED(new_beaker)) + if(!user.transferItemToLoc(new_beaker, src)) + update_appearance(UPDATE_OVERLAYS) + return FALSE + + beaker1 = new_beaker + lower_mass_range = calculate_mass(smallest = TRUE) + upper_mass_range = calculate_mass(smallest = FALSE) + estimate_time() else //replace output beaker if(!QDELETED(beaker2)) try_put_in_hand(beaker2, user) - beaker2 = new_beaker - log.Cut() + if(!QDELETED(new_beaker)) + if(!user.transferItemToLoc(new_beaker, src)) + update_appearance(UPDATE_OVERLAYS) + return FALSE - update_appearance() + beaker2 = new_beaker + log.Cut() + + update_appearance(UPDATE_OVERLAYS) + + return TRUE ///Computes time to purity reagents /obj/machinery/chem_mass_spec/proc/estimate_time() @@ -287,6 +295,8 @@ .["processing"] = processing_reagents .["eta"] = delay_time - progress_time .["peakHeight"] = 0 + var/obj/item/held_item = user.get_active_held_item() + .["hasBeakerInHand"] = held_item?.is_chem_container() || FALSE //input reagents var/list/beaker1Data = null @@ -426,6 +436,20 @@ replace_beaker(ui.user, FALSE) return TRUE + if("insert1") + var/obj/item/reagent_containers/container = ui.user.get_active_held_item() + if(container?.can_insert_container(ui.user, src)) + replace_beaker(ui.user, TRUE, container) + + return TRUE + + if("insert2") + var/obj/item/reagent_containers/container = ui.user.get_active_held_item() + if(container?.can_insert_container(ui.user, src)) + replace_beaker(ui.user, FALSE, container) + + return TRUE + /obj/machinery/chem_mass_spec/click_alt(mob/living/user) if(processing_reagents) balloon_alert(user, "still processing!") diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 62b3c70774a4..f02704c05731 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -61,7 +61,7 @@ . = CONTEXTUAL_SCREENTIP_SET return . - if(is_reagent_container(held_item) && held_item.is_open_container()) + if(held_item.is_chem_container()) if(!QDELETED(beaker)) context[SCREENTIP_CONTEXT_LMB] = "Replace beaker" else @@ -169,18 +169,13 @@ return containers /obj/machinery/chem_master/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(user.combat_mode || (tool.item_flags & ABSTRACT) || (tool.flags_1 & HOLOGRAM_1) || !can_interact(user) || !user.can_perform_action(src, ALLOW_SILICON_REACH | FORBID_TELEKINESIS_REACH)) + if(!tool.can_insert_container(user, src)) return NONE + if(!replace_beaker(user, tool)) + return ITEM_INTERACT_BLOCKING - if(is_reagent_container(tool) && tool.is_open_container()) - replace_beaker(user, tool) - if(!panel_open) - ui_interact(user) - return ITEM_INTERACT_SUCCESS - else - return ITEM_INTERACT_BLOCKING - - return NONE + ui_interact(user) + return ITEM_INTERACT_SUCCESS /obj/machinery/chem_master/wrench_act(mob/living/user, obj/item/tool) if(user.combat_mode) @@ -220,7 +215,7 @@ return ITEM_INTERACT_SUCCESS /** - * Insert, remove, replace the existig beaker + * Insert, remove, replace the existig beaker. Returns TRUE on success. * Arguments * * * mob/living/user - the player trying to replace the beaker @@ -231,10 +226,16 @@ if(!QDELETED(beaker)) try_put_in_hand(beaker, user) - if(!QDELETED(new_beaker) && user.transferItemToLoc(new_beaker, src)) + if(!QDELETED(new_beaker)) + if(!user.transferItemToLoc(new_beaker, src)) + update_appearance(UPDATE_OVERLAYS) + return FALSE beaker = new_beaker + update_appearance(UPDATE_OVERLAYS) + return TRUE + /obj/machinery/chem_master/attack_hand_secondary(mob/user, list/modifiers) . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) @@ -292,6 +293,8 @@ .["printingProgress"] = printing_progress .["printingTotal"] = printing_total .["selectedPillDuration"] = pill_layers + var/obj/item/held_item = user.get_active_held_item() + .["hasBeakerInHand"] = held_item?.is_chem_container() || FALSE //contents of source beaker var/list/beaker_data = null @@ -418,6 +421,13 @@ replace_beaker(ui.user) return TRUE + if("insert") + var/obj/item/reagent_containers/container = ui.user.get_active_held_item() + if(container?.can_insert_container(ui.user, src)) + replace_beaker(ui.user, container) + + return TRUE + if("transfer") if(is_printing) say("The buffer is locked while printing.") diff --git a/code/modules/reagents/chemistry/machinery/chem_separator.dm b/code/modules/reagents/chemistry/machinery/chem_separator.dm index f9b98f67ce05..c0611a7e0ec0 100644 --- a/code/modules/reagents/chemistry/machinery/chem_separator.dm +++ b/code/modules/reagents/chemistry/machinery/chem_separator.dm @@ -7,6 +7,7 @@ icon = 'icons/obj/medical/chemical.dmi' icon_state = "separator" light_power = 1 + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, /datum/material/wood = SHEET_MATERIAL_AMOUNT, /datum/material/paper = HALF_SHEET_MATERIAL_AMOUNT / 2) ///Is the mixture currently boiling var/boiling = FALSE diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 124dc5cfc866..947400e98347 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -99,12 +99,12 @@ if(machine_stat & (NOPOWER|BROKEN)) return ..() if(beaker) - balloon_alert(user, "pandemic full!") - return ..() - if(!user.transferItemToLoc(held_item, src)) - return ..() + balloon_alert(user, "beaker swapped") + try_put_in_hand(beaker, usr) + else + balloon_alert(user, "beaker loaded") + user.transferItemToLoc(held_item, src) beaker = held_item - balloon_alert(user, "beaker loaded") update_appearance() SStgui.update_uis(src) @@ -363,6 +363,7 @@ traits["resistance"] = adv_disease.totalResistance() traits["stage_speed"] = adv_disease.totalStageSpeed() traits["stealth"] = adv_disease.totalStealth() + traits["severity"] = adv_disease.totalSeverity() traits["symptoms"] = list() for(var/datum/symptom/symptom as anything in adv_disease.symptoms) var/list/this_symptom = list() diff --git a/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm b/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm index 9ea2603cdf68..e360c24f2702 100644 --- a/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm +++ b/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm @@ -22,8 +22,8 @@ /obj/item/storage/portable_chem_mixer/Initialize(mapload) . = ..() - register_context() + AddElement(/datum/element/drag_pickup) /obj/item/storage/portable_chem_mixer/Destroy() dispensable_reagents.Cut() @@ -239,13 +239,6 @@ update_appearance() return TRUE -/obj/item/storage/portable_chem_mixer/mouse_drop_dragged(atom/over_object) - if(ismob(loc)) - var/mob/M = loc - if(istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/H = over_object - M.putItemFromInventoryInHandIfPossible(src, H.held_index) - /obj/item/storage/portable_chem_mixer/click_alt(mob/living/user) if(!atom_storage.locked) balloon_alert(user, "lock first to use alt eject!") diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 4cebd1613feb..8dd7f26c7b88 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -182,7 +182,7 @@ continue //Nothing would come from grinding or juicing - if(!length(ingredient.grind_results) && !ingredient.reagents.total_volume) + if(!length(ingredient.grind_results()) && !ingredient.reagents.total_volume) to_chat(user, span_warning("You cannot grind/juice [ingredient] into reagents!")) continue @@ -219,7 +219,7 @@ return items_transfered /obj/machinery/reagentgrinder/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(user.combat_mode || (tool.item_flags & ABSTRACT) || (tool.flags_1 & HOLOGRAM_1)) + if(user.combat_mode && !is_reagent_container(tool) && !tool.is_open_container() || (tool.item_flags & ABSTRACT) || (tool.flags_1 & HOLOGRAM_1)) return ITEM_INTERACT_SKIP_TO_ATTACK //add the beaker @@ -253,7 +253,7 @@ return ITEM_INTERACT_SUCCESS //add item directly - else if(length(tool.grind_results) || tool.reagents?.total_volume) + else if(length(tool.grind_results()) || tool.reagents?.total_volume) if(tool.atom_storage && length(tool.contents)) //anything that has internal storage would be too much recursion for us to handle to_chat(user, span_notice("Drag this item onto [src] to dump its contents, or empty it to grind the container.")) return ITEM_INTERACT_BLOCKING @@ -506,13 +506,15 @@ var/obj/item/food/butter/tasty_butter = new(drop_location()) tasty_butter.reagents.set_all_reagents_purity(purity) + operating = FALSE + + if (!beaker.reagents.total_volume) + return + //Recipe to make Mayonnaise beaker.reagents.convert_reagent(/datum/reagent/consumable/eggyolk, /datum/reagent/consumable/mayonnaise) - //Recipe to make whipped cream beaker.reagents.convert_reagent(/datum/reagent/consumable/cream, /datum/reagent/consumable/whipped_cream) - //power consumed based on the ratio of total reagents mixed use_energy((active_power_usage * (duration / (1 SECONDS))) * (beaker.reagents.total_volume / beaker.reagents.maximum_volume)) - operating = FALSE diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index 54358350d5cf..02c96e8418d9 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -43,8 +43,8 @@ . = ..() - AddComponent(/datum/component/plumbing/simple_demand) - AddComponent(/datum/component/simple_rotation) + AddComponent(/datum/component/plumbing/simple_demand, distinct_reagent_cap = 5) + AddElement(/datum/element/simple_rotation) register_context() diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index d26272934cc4..cfd8c5168792 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -42,8 +42,6 @@ var/metabolizing = FALSE /// Are we from a material? We might wanna know that for special stuff. Like metalgen. Is replaced with a ref of the material on New() var/datum/material/material - ///A list of causes why this chem should skip being removed, if the length is 0 it will be removed from holder naturally, if this is >0 it will not be removed from the holder. - var/list/reagent_removal_skip_list = list() ///The set of exposure methods this penetrates skin with. var/penetrates_skin = VAPOR /// See fermi_readme.dm REAGENT_DEAD_PROCESS, REAGENT_INVISIBLE, REAGENT_SNEAKYNAME, REAGENT_SPLITRETAINVOL, REAGENT_CANSYNTH, REAGENT_IMPURE @@ -170,8 +168,6 @@ ///Metabolizes a portion of the reagent after on_mob_life() is called /datum/reagent/proc/metabolize_reagent(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(length(reagent_removal_skip_list)) - return if(isnull(holder)) return diff --git a/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm b/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm index 58ed84f53dcd..03e391bda39e 100644 --- a/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm @@ -47,9 +47,9 @@ . = ..() 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) + need_mob_update = breather.adjust_fire_loss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += breather.adjust_tox_loss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += breather.adjust_brute_loss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -80,8 +80,8 @@ /datum/reagent/nitrium_high_metabolization/on_mob_life(mob/living/carbon/breather, seconds_per_tick, times_fired) . = ..() var/need_mob_update - need_mob_update = breather.adjustStaminaLoss(-4 * 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 + need_mob_update = breather.adjust_stamina_loss(-4 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += breather.adjust_tox_loss(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 @@ -135,9 +135,9 @@ /datum/reagent/zauker/on_mob_life(mob/living/breather, seconds_per_tick, times_fired) . = ..() 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) + need_mob_update = breather.adjust_brute_loss(6 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += breather.adjust_oxy_loss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += breather.adjust_fire_loss(2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += breather.adjust_tox_loss(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 c57532b5ae69..01ba8ed7100d 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -26,22 +26,22 @@ /datum/reagent/medicine/c2/helbital/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - var/death_is_coming = (affected_mob.getToxLoss() + affected_mob.getOxyLoss() + affected_mob.getFireLoss() + affected_mob.getBruteLoss())*normalise_creation_purity() + var/death_is_coming = (affected_mob.get_tox_loss() + affected_mob.get_oxy_loss() + affected_mob.get_fire_loss() + affected_mob.get_brute_loss())*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 = max(death_is_coming/20, 3) - need_mob_update += affected_mob.adjustOxyLoss(2 * REM * seconds_per_tick, TRUE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_oxy_loss(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/13,0.1) - need_mob_update += affected_mob.adjustOxyLoss(1 * REM * seconds_per_tick, TRUE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_oxy_loss(1 * REM * seconds_per_tick, TRUE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) good_kind_of_healing = TRUE else //no convert thou_shall_heal = round(death_is_coming/10, 0.1) good_kind_of_healing = TRUE - need_mob_update += affected_mob.adjustBruteLoss(-thou_shall_heal * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_brute_loss(-thou_shall_heal * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) if(need_mob_update) . = UPDATE_MOB_HEALTH @@ -110,8 +110,8 @@ /datum/reagent/medicine/c2/libital/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() 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) + need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_LIVER, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjust_brute_loss(-3 * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -128,28 +128,28 @@ /datum/reagent/medicine/c2/probital/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() var/need_mob_update - need_mob_update = affected_mob.adjustBruteLoss(-3 * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjust_brute_loss(-3 * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) var/ooo_youaregettingsleepy = 3.5 - switch(round(affected_mob.getStaminaLoss())) + switch(round(affected_mob.get_stamina_loss())) if(10 to 40) ooo_youaregettingsleepy = 3 if(41 to 60) ooo_youaregettingsleepy = 2.5 if(61 to 200) //you really can only go to 120 ooo_youaregettingsleepy = 2 - need_mob_update += affected_mob.adjustStaminaLoss(ooo_youaregettingsleepy * REM * seconds_per_tick, updating_stamina = FALSE) + need_mob_update += affected_mob.adjust_stamina_loss(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) . = ..() var/need_mob_update - need_mob_update = affected_mob.adjustStaminaLoss(3 * REM * seconds_per_tick, updating_stamina = FALSE) - if(affected_mob.getStaminaLoss() >= 80) + need_mob_update = affected_mob.adjust_stamina_loss(3 * REM * seconds_per_tick, updating_stamina = FALSE) + if(affected_mob.get_stamina_loss() >= 80) affected_mob.adjust_drowsiness(2 SECONDS * REM * seconds_per_tick) - if(affected_mob.getStaminaLoss() >= 100) + if(affected_mob.get_stamina_loss() >= 100) to_chat(affected_mob,span_warning("You feel more tired than you usually do, perhaps if you rest your eyes for a bit...")) - 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. + need_mob_update += affected_mob.adjust_stamina_loss(-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) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -179,8 +179,8 @@ /datum/reagent/medicine/c2/lenturi/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() var/need_mob_update - need_mob_update = affected_mob.adjustFireLoss(-3.75 * 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) + need_mob_update = affected_mob.adjust_fire_loss(-3.75 * REM * normalise_creation_purity() * seconds_per_tick, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_organ_loss(ORGAN_SLOT_STOMACH, 0.4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -198,8 +198,8 @@ /datum/reagent/medicine/c2/aiuri/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() 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) + need_mob_update = affected_mob.adjust_fire_loss(-2 * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_organ_loss(ORGAN_SLOT_EYES, 0.25 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -217,10 +217,10 @@ /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) - need_mob_update = affected_mob.adjustFireLoss(-3 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) + if(affected_mob.get_fire_loss() > 50) + need_mob_update = affected_mob.adjust_fire_loss(-3 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) else - need_mob_update = affected_mob.adjustFireLoss(-2.25 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjust_fire_loss(-2.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 @@ -262,14 +262,14 @@ inverse_chem = /datum/reagent/inverse/healing/convermol chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/medicine/c2/convermol/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) +/datum/reagent/medicine/c2/convermol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() 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. + oxycalc = min(oxycalc, affected_mob.get_oxy_loss() + 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. 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) + need_mob_update = affected_mob.adjust_oxy_loss(-oxycalc * seconds_per_tick * normalise_creation_purity(), FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_tox_loss(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-- need_mob_update = TRUE @@ -294,11 +294,11 @@ /// A cooldown for spacing bursts of stamina damage COOLDOWN_DECLARE(drowsycd) -/datum/reagent/medicine/c2/tirimol/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) +/datum/reagent/medicine/c2/tirimol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() var/need_mob_update - need_mob_update = affected_mob.adjustOxyLoss(-4.5 * 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) + need_mob_update = affected_mob.adjust_oxy_loss(-4.5 * 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.adjust_stamina_loss(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) @@ -326,11 +326,11 @@ /// Temperatures below this number give radiation healing. var/rads_heal_threshold = 100 -/datum/reagent/medicine/c2/seiver/on_mob_metabolize(mob/living/carbon/human/affected_mob) +/datum/reagent/medicine/c2/seiver/on_mob_metabolize(mob/living/carbon/affected_mob) . = ..() 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) +/datum/reagent/medicine/c2/seiver/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() var/chemtemp = min(holder.chem_temp, 1000) chemtemp = chemtemp ? chemtemp : T0C //why do you have null sweaty @@ -340,7 +340,7 @@ 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) - need_mob_update = affected_mob.adjustToxLoss(-toxcalc, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update = affected_mob.adjust_tox_loss(-toxcalc, updating_health = FALSE, required_biotype = affected_biotype) healypoints += toxcalc //and you're cold @@ -349,14 +349,14 @@ radcalc *= normalise_creation_purity() // extra rad healing if you are SUPER cold if(chemtemp < rads_heal_threshold*0.1) - need_mob_update += affected_mob.adjustToxLoss(-radcalc * 0.9, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_tox_loss(-radcalc * 0.9, updating_health = FALSE, required_biotype = affected_biotype) else if(chemtemp < rads_heal_threshold) - need_mob_update += affected_mob.adjustToxLoss(-radcalc * 0.75, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_tox_loss(-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_organ_flag = affected_organ_flags) + affected_mob.adjust_organ_loss(ORGAN_SLOT_HEART, healypoints / 5, required_organ_flag = affected_organ_flags) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -368,7 +368,7 @@ ph = 9.2 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) +/datum/reagent/medicine/c2/multiver/on_mob_life(mob/living/carbon/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) @@ -378,8 +378,8 @@ if(creation_purity >= 1) //Perfectly pure multivers gives a bonus of 2! medibonus += 1 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 + need_mob_update = affected_mob.adjust_tox_loss(-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.adjust_organ_loss(ORGAN_SLOT_LUNGS, 0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) //kills at 40u if(!holder.has_reagent(/datum/reagent/toxin/anacea)) for(var/datum/reagent/second_reagent as anything in affected_mob.reagents.reagent_list) if(second_reagent == src) @@ -412,7 +412,7 @@ return if(trans_volume >= 0.4) //prevents cheesing with ultralow doses. - exposed_mob.adjustToxLoss((-3 * min(2, trans_volume) * REM) * normalise_creation_purity(), required_biotype = affected_biotype) //This is to promote iv pole use for that chemotherapy feel. + exposed_mob.adjust_tox_loss((-3 * 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/liver/L = exposed_mob.organs_slot[ORGAN_SLOT_LIVER] if(!L || L.organ_flags & ORGAN_FAILING) return @@ -425,8 +425,8 @@ /datum/reagent/medicine/c2/syriniver/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() 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(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_LIVER, 0.8 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjust_tox_loss(-2 * 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 @@ -437,7 +437,7 @@ /datum/reagent/medicine/c2/syriniver/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + if(affected_mob.adjust_organ_loss(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) @@ -455,8 +455,8 @@ /datum/reagent/medicine/c2/musiver/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() 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.5 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_LIVER, 0.1 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjust_tox_loss(-1.5 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_biotype = affected_biotype) for(var/datum/reagent/reagent as anything in affected_mob.reagents.reagent_list) if(issyrinormusc(reagent)) continue @@ -476,7 +476,7 @@ /datum/reagent/medicine/c2/musiver/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + if(affected_mob.adjust_organ_loss(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) @@ -498,40 +498,36 @@ if(!(methods & (PATCH|TOUCH|VAPOR))) return - var/current_bruteloss = carbies.getBruteLoss() // because this will be changed after calling adjustBruteLoss() - var/current_fireloss = carbies.getFireLoss() // because this will be changed after calling adjustFireLoss() + var/current_bruteloss = carbies.get_brute_loss() // because this will be changed after calling adjust_brute_loss() + var/current_fireloss = carbies.get_fire_loss() // because this will be changed after calling adjust_fire_loss() var/touch_protection_interference = (1 - touch_protection) if(!touch_protection_interference) return - var/harmies = clamp(carbies.adjustBruteLoss(-1.25 * reac_volume * touch_protection_interference, updating_health = FALSE, required_bodytype = affected_bodytype), 0, current_bruteloss) - var/burnies = clamp(carbies.adjustFireLoss(-1.25 * reac_volume * touch_protection_interference, updating_health = FALSE, required_bodytype = affected_bodytype), 0, current_fireloss) + var/harmies = clamp(carbies.adjust_brute_loss(-1.25 * reac_volume * touch_protection_interference, updating_health = FALSE, required_bodytype = affected_bodytype), 0, current_bruteloss) + var/burnies = clamp(carbies.adjust_fire_loss(-1.25 * reac_volume * touch_protection_interference, updating_health = FALSE, required_bodytype = affected_bodytype), 0, current_fireloss) for(var/i in carbies.all_wounds) var/datum/wound/iter_wound = i iter_wound.on_synthflesh(reac_volume) 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) || need_mob_update //0.5 - 0.75 + need_mob_update = carbies.adjust_tox_loss((harmies + burnies)*(0.5 + (0.25*(1-creation_purity))), updating_health = FALSE, required_biotype = affected_biotype) || need_mob_update //0.5 - 0.75 if(need_mob_update) carbies.updatehealth() - - if(show_message && carbies.stat != DEAD) - 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(show_message) + carbies.visible_message(span_nicegreen("A rubbery liquid partially coats [carbies]'s burns.")) + if(carbies.stat != DEAD) + 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) //don't unhusked non husked mobs if (!HAS_TRAIT_FROM(exposed_mob, TRAIT_HUSK, BURN)) return //don't try to unhusk mobs above burn damage threshold - if (carbies.getFireLoss() > UNHUSK_DAMAGE_THRESHOLD * 2.5) - if (show_message) + if(carbies.get_fire_loss() > UNHUSK_DAMAGE_THRESHOLD) + if(show_message && !need_mob_update) carbies.visible_message(span_minoralert("The liquid fails to properly stick on [carbies]. [carbies]'s burns need to be repaired first!")) return - else if (carbies.getFireLoss() > UNHUSK_DAMAGE_THRESHOLD) - if (show_message) - carbies.visible_message(span_boldnotice("A rubbery liquid partially coats [carbies]'s burns... It seems more is required to fully unhusk!")) - return var/datum/reagent/synthflesh = carbies.reagents.has_reagent(/datum/reagent/medicine/c2/synthflesh) var/current_volume = synthflesh ? synthflesh.volume : 0 @@ -547,8 +543,15 @@ carbies.reagents.remove_reagent(/datum/reagent/medicine/c2/synthflesh, current_volume) // consume the synthflesh, it won't do anything in their blood //we're avoiding using the phrases "burnt flesh" and "burnt skin" here because carbies could be a skeleton or a golem or something carbies.visible_message(span_nicegreen("A rubbery liquid coats [carbies]'s burns. [carbies] looks a lot healthier!")) - else if (show_message) - carbies.visible_message(span_boldnotice("A rubbery liquid partially coats [carbies]'s burns... It seems more is required to fully unhusk!")) + else if(show_message && !need_mob_update) + // if they are laying in a pool of synthflesh, we don't want it sending a message every tick + if(methods & TOUCH) + if(TIMER_COOLDOWN_RUNNING(carbies, REF(carbies))) + return + TIMER_COOLDOWN_START(carbies, REF(carbies), 16 SECONDS) + carbies.visible_message(span_boldnotice("The liquid fails to properly stick on [carbies]. There isn't enough to unhusk!")) + else + carbies.visible_message(span_nicegreen("A rubbery liquid partially mends [carbies]... It seems more is required to fully unhusk!")) /******ORGAN HEALING******/ /*Suffix: -rite*/ @@ -582,27 +585,29 @@ /atom/movable/screen/alert/penthrite name = "Strong Heartbeat" desc = "Your heart beats with great force!" - icon_state = "penthrite" + use_user_hud_icon = TRUE + overlay_icon = 'icons/obj/medical/syringe.dmi' + overlay_state = "luxpen" /datum/reagent/medicine/c2/penthrite/on_mob_metabolize(mob/living/user) . = ..() send_alert(user) user.add_traits(subject_traits, type) -/datum/reagent/medicine/c2/penthrite/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) +/datum/reagent/medicine/c2/penthrite/on_mob_life(mob/living/carbon/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) + need_mob_update = affected_mob.adjust_organ_loss(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. - 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) + need_mob_update += affected_mob.adjust_tox_loss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_brute_loss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_oxy_loss(-6 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) affected_mob.losebreath = 0 - 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! + need_mob_update += affected_mob.adjust_organ_loss(ORGAN_SLOT_HEART, max(volume/10, 1) * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) // your heart is barely keeping up! 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) @@ -630,8 +635,8 @@ . = ..() 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.adjust_stamina_loss(10 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_organ_loss(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 diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm index faaf11a32e16..c4858c55e686 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm @@ -103,9 +103,7 @@ if(methods & (TOUCH|VAPOR|PATCH)) exposed_mob.adjust_fire_stacks(reac_volume / 15) - var/sterilizing_power = boozepwr / 650 // Weak alcohol has less sterilizing power - for(var/datum/surgery/surgery as anything in exposed_mob.surgeries) - surgery.speed_modifier = min(1 - sterilizing_power, surgery.speed_modifier) + exposed_mob.add_surgery_speed_mod("alcohol", round(1 - (boozepwr / 650), 0.05), min(reac_volume * 1 MINUTES, 5 MINUTES)) // Weak alcohol has less sterilizing power /datum/reagent/consumable/ethanol/beer name = "Beer" @@ -263,7 +261,7 @@ 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)) + if(drinker.adjust_brute_loss(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!")) @@ -303,7 +301,7 @@ /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.get_brute_loss() && SPT_PROB(5, seconds_per_tick)) if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, updating_health = FALSE)) return UPDATE_MOB_HEALTH @@ -557,10 +555,10 @@ . = ..() 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) + need_mob_update = cubano.adjust_brute_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += cubano.adjust_fire_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += cubano.adjust_tox_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += cubano.adjust_oxy_loss(-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 @@ -647,7 +645,7 @@ 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)) + if(drinker.adjust_tox_loss(-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) @@ -673,8 +671,7 @@ /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. + drinker.adjust_blood_volume((0.25 + round(2 * drinker.get_drunk_amount() / 40, 0.1)) * REM * seconds_per_tick, maximum = BLOOD_VOLUME_NORMAL) // Bloody Mary restores blood loss based on how drunk you are /datum/reagent/consumable/ethanol/brave_bull name = "Brave Bull" @@ -772,7 +769,7 @@ var/obj/item/organ/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)) + if(drinker.adjust_stamina_loss(-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) @@ -823,8 +820,8 @@ . = ..() 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) + need_mob_update = dwarf.adjust_brute_loss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += dwarf.adjust_fire_loss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -947,7 +944,7 @@ 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)) + if(unshoed.adjust_brute_loss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/snowwhite @@ -1338,8 +1335,9 @@ /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)) + var/turf/drinker_turf = get_turf(drinker) + for(var/obj/item/stack/ore/ore in orange(3, drinker)) + step_towards(ore, drinker_turf) //Another reference. Heals those in critical condition extremely quickly. /datum/reagent/consumable/ethanol/hearty_punch @@ -1356,10 +1354,10 @@ . = ..() 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.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) + need_mob_update = drinker.adjust_brute_loss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjust_fire_loss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjust_oxy_loss(-4 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += drinker.adjust_tox_loss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -1393,7 +1391,7 @@ drinker.Sleeping(100 * REM * seconds_per_tick) if(202 to INFINITY) drinker.AdjustSleeping(4 SECONDS * REM * seconds_per_tick) - if(drinker.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(drinker.adjust_tox_loss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/gargle_blaster @@ -1417,12 +1415,12 @@ 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)) + if(drinker.adjust_tox_loss(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." + description = "A strong neurotoxin that puts the patient into a death-like state." color = "#2E2E61" // rgb: 46, 46, 97 boozepwr = 50 quality = DRINK_VERYGOOD @@ -1438,18 +1436,18 @@ 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) + need_mob_update = drinker.adjust_organ_loss(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) + need_mob_update += drinker.adjust_stamina_loss(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) + need_mob_update += drinker.adjust_stamina_loss(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) + need_mob_update += drinker.adjust_organ_loss(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) @@ -1464,7 +1462,7 @@ 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) + drinker.adjust_stamina_loss(10, required_biotype = affected_biotype) /datum/reagent/consumable/ethanol/hippies_delight name = "Hippie's Delight" @@ -1506,7 +1504,7 @@ 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)) + if(drinker.adjust_tox_loss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/consumable/ethanol/eggnog @@ -1608,7 +1606,7 @@ 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(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += drinker.adjust_stamina_loss(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -1649,12 +1647,12 @@ 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.adjust_brute_loss(-heal_amt, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjust_fire_loss(-heal_amt, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjust_tox_loss(-heal_amt, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += drinker.adjust_oxy_loss(-heal_amt, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) // heal stamina loss on first metabolization, but only to a max of 20 - need_mob_update += drinker.adjustStaminaLoss(max(-heal_amt * 5, -20), updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += drinker.adjust_stamina_loss(max(-heal_amt * 5, -20), 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 [LOWER_TEXT(name)] fills you with energy!")) @@ -1665,11 +1663,11 @@ . = ..() 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) + need_mob_update = drinker.adjust_brute_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjust_fire_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += drinker.adjust_tox_loss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += drinker.adjust_oxy_loss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += drinker.adjust_stamina_loss(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -1720,7 +1718,7 @@ /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 + drinker.adjust_brute_loss(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" @@ -1822,15 +1820,15 @@ 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(drinker.get_brute_loss() && drinker.get_fire_loss()) //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) + need_mob_update = drinker.adjust_brute_loss(-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) + need_mob_update = drinker.adjust_fire_loss(-0.25 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + else if(drinker.get_brute_loss()) //If you have only one, it still heals but not as well. + need_mob_update = drinker.adjust_brute_loss(-0.2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + else if(drinker.get_fire_loss()) + need_mob_update = drinker.adjust_fire_loss(-0.2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -1873,7 +1871,7 @@ /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)) + if(drinker.adjust_tox_loss(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 @@ -1890,7 +1888,7 @@ /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)) + if(drinker.adjust_tox_loss(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 @@ -1913,7 +1911,7 @@ /datum/reagent/consumable/ethanol/fanciulli/on_mob_metabolize(mob/living/drinker) . = ..() if(drinker.health > 0) - drinker.adjustStaminaLoss(20, required_biotype = affected_biotype) + drinker.adjust_stamina_loss(20, required_biotype = affected_biotype) /datum/reagent/consumable/ethanol/branca_menta name = "Branca Menta" @@ -1932,7 +1930,7 @@ /datum/reagent/consumable/ethanol/branca_menta/on_mob_metabolize(mob/living/drinker) . = ..() if(drinker.health > 0) - drinker.adjustStaminaLoss(35, required_biotype = affected_biotype) + drinker.adjust_stamina_loss(35, required_biotype = affected_biotype) /datum/reagent/consumable/ethanol/blank_paper name = "Blank Paper" @@ -2081,9 +2079,9 @@ 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(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += drinker.adjust_oxy_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += drinker.adjust_tox_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += drinker.adjust_stamina_loss(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -2104,7 +2102,7 @@ /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)) + if(drinker.adjust_tox_loss(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)) @@ -2140,7 +2138,7 @@ . = ..() 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.5 * drinker.get_drunk_amount() * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype)) + if(drinker.adjust_stamina_loss(-0.5 * 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 @@ -2152,9 +2150,10 @@ 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) +/datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) . = ..() - if(SPT_PROB(10, seconds_per_tick) && istype(metabolizer)) + if(SPT_PROB(10, seconds_per_tick) && ishuman(drinker)) + var/mob/living/carbon/human/metabolizer = drinker metabolizer.age += 1 if(metabolizer.age > 70) metabolizer.set_facial_haircolor("#cccccc", update = FALSE) @@ -2199,7 +2198,7 @@ /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)) + if(drinker.adjust_fire_loss(-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) @@ -2339,7 +2338,7 @@ /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.get_brute_loss() && 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 @@ -2636,7 +2635,7 @@ var/mob/living/carbon/exposed_carbon = exposed_mob var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) - stomach.adjust_charge(reac_volume * 5 * ETHEREAL_DISCHARGE_RATE) + stomach.adjust_charge(reac_volume * 10 * ETHEREAL_DISCHARGE_RATE) /datum/reagent/consumable/ethanol/telepole name = "Telepole" @@ -2656,7 +2655,7 @@ var/mob/living/carbon/exposed_carbon = exposed_mob var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) - stomach.adjust_charge(reac_volume * 10 * ETHEREAL_DISCHARGE_RATE) + stomach.adjust_charge(reac_volume * 20 * ETHEREAL_DISCHARGE_RATE) /datum/reagent/consumable/ethanol/pod_tesla name = "Pod Tesla" @@ -2894,7 +2893,7 @@ quality = DRINK_VERYGOOD taste_description = "the aloha state" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - + /datum/reagent/consumable/ethanol/boston_sour name = "Boston Sour" description = "Whiskey sour texturally elevated by an egg white." @@ -2983,9 +2982,9 @@ . = ..() affected_mob.apply_status_effect(/datum/status_effect/headache_soothed) //prevents headaches affected_mob.adjust_disgust(-5 * REM * seconds_per_tick) //removes disgust, same with sol dry - if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -0.5 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)) //heals brain damage very slowly, about 12 damage per 5u + if(affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, -0.5 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)) //heals brain damage very slowly, about 12 damage per 5u return UPDATE_MOB_HEALTH - + /datum/reagent/consumable/ethanol/blue_blazer name = "Blue Blazer" description = "The signature drink of a legendary bartender from the 19th century. While remembered for how he innovated the art of bartending, at the end of the day this drink is really just warmed and sweetened whiskey." @@ -2994,7 +2993,7 @@ quality = DRINK_NICE taste_description = "scorched sweet whiskey" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - + /datum/reagent/consumable/ethanol/blue_blazer/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() affected_mob.adjust_bodytemperature(25 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm index f8aa1c37d39f..cfeb3d55a1bf 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm @@ -9,8 +9,8 @@ /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)) + if(affected_mob.get_oxy_loss() && SPT_PROB(16, seconds_per_tick)) + if(affected_mob.adjust_oxy_loss(-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 @@ -23,7 +23,7 @@ /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.get_fire_loss() && 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 @@ -38,8 +38,8 @@ /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)) + if(affected_mob.get_tox_loss() && SPT_PROB(10, seconds_per_tick)) + if(affected_mob.adjust_tox_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/consumable/carrotjuice @@ -57,9 +57,9 @@ switch(current_cycle) 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) + need_mob_update = affected_mob.adjust_organ_loss(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) + need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_EYES, -2 * REM * seconds_per_tick) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -86,7 +86,7 @@ /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)) + if(affected_mob.adjust_tox_loss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/consumable/watermelonjuice @@ -183,7 +183,7 @@ . = ..() var/obj/item/organ/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)) + if(affected_mob.adjust_tox_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/consumable/grapejuice @@ -219,14 +219,14 @@ 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.get_brute_loss() && 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, seconds_per_tick) return ..() || . -/datum/reagent/milk/used_on_fish(obj/item/fish/fish) +/datum/reagent/consumable/milk/used_on_fish(obj/item/fish/fish) if(HAS_TRAIT(fish, TRAIT_FISH_MADE_OF_BONE)) fish.repair_damage(fish.max_integrity * max(fish.get_hunger() * 0.5, 0.12)) fish.sate_hunger() @@ -242,7 +242,7 @@ /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.get_brute_loss() && SPT_PROB(10, seconds_per_tick)) if(affected_mob.heal_bodypart_damage(1, 0)) return UPDATE_MOB_HEALTH @@ -301,8 +301,8 @@ affected_mob.adjust_drowsiness(-2 SECONDS * REM * seconds_per_tick) affected_mob.adjust_jitter(-6 SECONDS * REM * seconds_per_tick) affected_mob.AdjustSleeping(-2 SECONDS * 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)) + if(affected_mob.get_tox_loss() && SPT_PROB(10, seconds_per_tick)) + if(affected_mob.adjust_tox_loss(-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()) @@ -333,7 +333,7 @@ /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) + infection_rate = max(infection_rate - 0.005, 0) return TRUE /datum/reagent/consumable/lemonade @@ -400,7 +400,7 @@ affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) affected_mob.AdjustSleeping(-6 SECONDS * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-7 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) - if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/consumable/icetea @@ -417,8 +417,8 @@ affected_mob.adjust_dizzy(-4 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-2 SECONDS * REM * seconds_per_tick) affected_mob.AdjustSleeping(-4 SECONDS * 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)) + if(affected_mob.get_tox_loss() && SPT_PROB(10, seconds_per_tick)) + if(affected_mob.adjust_tox_loss(-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()) @@ -492,7 +492,7 @@ 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_stamina_loss(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) @@ -658,11 +658,11 @@ var/need_mob_update switch(affected_mob.mob_mood.sanity_level) if (SANITY_LEVEL_GREAT to SANITY_LEVEL_NEUTRAL) - need_mob_update = affected_mob.adjustBruteLoss(-1.5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update = affected_mob.adjust_brute_loss(-1.5 * REM * seconds_per_tick, updating_health = FALSE) if (SANITY_LEVEL_DISTURBED to SANITY_LEVEL_UNSTABLE) affected_mob.add_mood_event("wellcheers", /datum/mood_event/wellcheers) if (SANITY_LEVEL_CRAZY to SANITY_LEVEL_INSANE) - need_mob_update = affected_mob.adjustStaminaLoss(3 * REM * seconds_per_tick, updating_stamina = FALSE) + need_mob_update = affected_mob.adjust_stamina_loss(3 * REM * seconds_per_tick, updating_stamina = FALSE) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -732,7 +732,7 @@ 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()) - if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) + if(affected_mob.get_brute_loss() && 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 @@ -759,7 +759,7 @@ 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()) - if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) + if(affected_mob.get_brute_loss() && 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 @@ -775,10 +775,10 @@ /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) + need_mob_update = affected_mob.adjust_brute_loss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_tox_loss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_oxy_loss(-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/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(!(HAS_TRAIT(liver, TRAIT_MEDICAL_METABOLISM))) @@ -890,7 +890,7 @@ 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()) - if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) + if(affected_mob.get_brute_loss() && 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 @@ -955,7 +955,7 @@ /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.get_brute_loss() && 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)) @@ -1003,8 +1003,8 @@ . = ..() if(IS_REVOLUTIONARY(drinker)) drinker.set_dizzy_if_lower(10 SECONDS * REM * seconds_per_tick) - if(drinker.getStaminaLoss() < 80) - drinker.adjustStaminaLoss(12, required_biotype = affected_biotype) //The pomegranate stops free radicals! Har har. + if(drinker.get_stamina_loss() < 80) + drinker.adjust_stamina_loss(12, required_biotype = affected_biotype) //The pomegranate stops free radicals! Har har. /datum/reagent/consumable/parsnipjuice name = "Parsnip Juice" @@ -1113,8 +1113,8 @@ /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)) + if(affected_mob.get_tox_loss() && SPT_PROB(16, seconds_per_tick)) + if(affected_mob.adjust_tox_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/consumable/agua_fresca @@ -1128,8 +1128,8 @@ /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)) + if(affected_mob.get_tox_loss() && SPT_PROB(10, seconds_per_tick)) + if(affected_mob.adjust_tox_loss(-0.5, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/consumable/mushroom_tea @@ -1143,7 +1143,7 @@ /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)) + if(affected_mob.adjust_oxy_loss(-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 @@ -1164,7 +1164,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/strawberry_banana - name = "strawberry banana smoothie" + name = "Strawberry Banana Smoothie" description = "A classic smoothie made from strawberries and bananas." color = "#FF9999" nutriment_factor = 0 @@ -1172,7 +1172,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/berry_blast - name = "berry blast smoothie" + name = "Berry Blast Smoothie" description = "A classic smoothie made from mixed berries." color = "#A76DC5" nutriment_factor = 0 @@ -1180,7 +1180,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/funky_monkey - name = "funky monkey smoothie" + name = "Funky Monkey Smoothie" description = "A classic smoothie made from chocolate and bananas." color = COLOR_BROWNER_BROWN nutriment_factor = 0 @@ -1188,7 +1188,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/green_giant - name = "green giant smoothie" + name = "Green Giant Smoothie" description = "A green vegetable smoothie, made without vegetables." color = COLOR_VERY_DARK_LIME_GREEN nutriment_factor = 0 @@ -1196,7 +1196,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/melon_baller - name = "melon baller smoothie" + name = "Melon Baller Smoothie" description = "A classic smoothie made from melons." color = "#D22F55" nutriment_factor = 0 @@ -1204,7 +1204,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/vanilla_dream - name = "vanilla dream smoothie" + name = "Vanilla Dream Smoothie" description = "A classic smoothie made from vanilla and fresh cream." color = "#FFF3DD" nutriment_factor = 0 @@ -1230,8 +1230,8 @@ /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)) + if(doll.get_tox_loss() && SPT_PROB(10, seconds_per_tick)) + if(doll.adjust_tox_loss(-0.5, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/consumable/mississippi_queen @@ -1267,8 +1267,8 @@ affected_mob.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) affected_mob.AdjustSleeping(-4 SECONDS * 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)) + if(affected_mob.get_tox_loss() && SPT_PROB(25, seconds_per_tick)) + if(affected_mob.adjust_tox_loss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/consumable/hakka_mate @@ -1333,9 +1333,9 @@ if(found_valid_cooler) affected_mob.clear_alert("punch_bad") affected_mob.throw_alert("punch_good", /atom/movable/screen/alert/fruit_punch_good) - need_mob_update = affected_mob.adjustToxLoss(-0.6 * REM * seconds_per_tick, updating_health = FALSE) - need_mob_update = affected_mob.adjustBruteLoss(-0.6 * REM * seconds_per_tick, updating_health = FALSE) - need_mob_update = affected_mob.adjustFireLoss(-0.6 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update = affected_mob.adjust_tox_loss(-0.6 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update = affected_mob.adjust_brute_loss(-0.6 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update = affected_mob.adjust_fire_loss(-0.6 * REM * seconds_per_tick, updating_health = FALSE) affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/punch_punishment) else affected_mob.clear_alert("punch_good") @@ -1360,12 +1360,14 @@ /atom/movable/screen/alert/fruit_punch_good name = "Fruit Punch Blessing" desc = "The sweetness of the fruit punch and the friendly company of the liquid cooler are slowly restoring your health..." - icon_state = "punch_blessing" + use_user_hud_icon = TRUE + overlay_state = "punch_blessing" /atom/movable/screen/alert/fruit_punch_bad name = "Fruit Punishment" desc = "The unbearable sweetness of the fruit punch is too much to bear without the soothing aura of a liquid cooler! Your body is going into shock!" - icon_state = "punch_punishment" + use_user_hud_icon = TRUE + overlay_state = "punch_punishment" /datum/reagent/consumable/ethanol/bitters_soda name = "Bitters and Soda" @@ -1375,7 +1377,29 @@ quality = DRINK_NICE taste_description = "mild aromatics" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - + /datum/reagent/consumable/ethanol/bitters_soda/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/lean + name = "Lean" + description = "The drank that makes you go wheezy." + color = "#DE55ED" + quality = DRINK_GOOD + taste_description = "purple and a hint of opioid." + addiction_types = list(/datum/addiction/opioids = 6) + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolization_rate = 0.2 * REM + +/datum/reagent/consumable/lean/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_jitter(2.5 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_stutter(2.25 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_drugginess(2 SECONDS * REM * seconds_per_tick) + if(SPT_PROB(15, seconds_per_tick)) + affected_mob.emote(pick("taunt","twitch","shiver","laugh","moan","blush","stare")) + if(current_cycle > 16 && SPT_PROB(3.5, seconds_per_tick)) + affected_mob.adjust_dizzy(15 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_drowsiness(7.5 SECONDS * REM * seconds_per_tick) + affected_mob.emote("drool") diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 39e76fea2687..42df93c4d687 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -93,8 +93,8 @@ /datum/reagent/drug/nicotine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() 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) + need_mob_update = affected_mob.adjust_tox_loss(0.1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_oxy_loss(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 @@ -122,14 +122,14 @@ affected_human.set_facial_hairstyle("Shaved", update = FALSE) affected_human.set_hairstyle("Bald", update = FALSE) affected_mob.set_species(/datum/species/human/krokodil_addict) - if(affected_mob.adjustBruteLoss(50 * REM, updating_health = FALSE, required_bodytype = affected_bodytype)) // holy shit your skin just FELL THE FUCK OFF + if(affected_mob.adjust_brute_loss(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) . = ..() 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) + need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 0.25 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update = affected_mob.adjust_tox_loss(0.25 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -176,9 +176,9 @@ affected_mob.add_mood_event("tweaking", /datum/mood_event/stimulant_medium) affected_mob.AdjustAllImmobility(-40 * REM * seconds_per_tick) 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.adjust_stamina_loss(-5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) affected_mob.set_jitter_if_lower(4 SECONDS * REM * seconds_per_tick) - need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1, 4) * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjust_organ_loss(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)) @@ -195,8 +195,8 @@ affected_mob.visible_message(span_danger("[affected_mob]'s hands flip out and flail everywhere!")) affected_mob.drop_all_held_items() 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) + need_mob_update = affected_mob.adjust_tox_loss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_organ_loss(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 @@ -233,8 +233,8 @@ to_chat(affected_mob, span_notice("[high_message]")) affected_mob.add_mood_event("salted", /datum/mood_event/stimulant_heavy) var/need_mob_update - need_mob_update = affected_mob.adjustStaminaLoss(-6 * 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) + need_mob_update = affected_mob.adjust_stamina_loss(-6 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_organ_loss(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 @@ -269,11 +269,11 @@ if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_notice("[high_message]")) 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) + need_mob_update = affected_mob.adjust_stamina_loss(-18 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_tox_loss(0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) if(SPT_PROB(30, seconds_per_tick)) affected_mob.losebreath++ - need_mob_update += affected_mob.adjustOxyLoss(1, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_oxy_loss(1, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -302,7 +302,7 @@ affected_mob.remove_status_effect(/datum/status_effect/jitter) affected_mob.remove_status_effect(/datum/status_effect/confusion) affected_mob.disgust = 0 - if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + if(affected_mob.adjust_organ_loss(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) @@ -319,7 +319,7 @@ if(3) affected_mob.emote("frown") affected_mob.add_mood_event("happiness_drug", /datum/mood_event/happiness_drug_bad_od) - if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + if(affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) return UPDATE_MOB_HEALTH /datum/reagent/drug/pumpup @@ -347,7 +347,7 @@ 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, updating_health = FALSE, required_biotype = affected_biotype) + affected_mob.adjust_tox_loss(2, updating_health = FALSE, required_biotype = affected_biotype) return UPDATE_MOB_HEALTH /datum/reagent/drug/pumpup/overdose_start(mob/living/affected_mob) @@ -364,10 +364,10 @@ affected_mob.emote(pick("twitch","drool")) if(SPT_PROB(10, seconds_per_tick)) affected_mob.losebreath++ - affected_mob.adjustStaminaLoss(4, updating_stamina = FALSE, required_biotype = affected_biotype) + affected_mob.adjust_stamina_loss(4, updating_stamina = FALSE, required_biotype = affected_biotype) need_mob_update = TRUE if(SPT_PROB(7.5, seconds_per_tick)) - need_mob_update += affected_mob.adjustToxLoss(2, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_tox_loss(2, updating_health = FALSE, required_biotype = affected_biotype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -397,7 +397,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_organ_flag = affected_organ_flags) + affected_mob.adjust_organ_loss(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 @@ -410,7 +410,7 @@ /datum/reagent/drug/maint/powder/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 6 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + if(affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 6 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) return UPDATE_MOB_HEALTH /datum/reagent/drug/maint/sludge @@ -425,7 +425,7 @@ /datum/reagent/drug/maint/sludge/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(0.5 * REM * seconds_per_tick, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/drug/maint/sludge/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) @@ -435,9 +435,9 @@ 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 var/need_mob_update - need_mob_update = carbie.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update = carbie.adjust_tox_loss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) if(SPT_PROB(5, seconds_per_tick)) - need_mob_update += carbie.adjustToxLoss(5, required_biotype = affected_biotype, updating_health = FALSE) + need_mob_update += carbie.adjust_tox_loss(5, required_biotype = affected_biotype, updating_health = FALSE) carbie.vomit(VOMIT_CATEGORY_DEFAULT) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -453,14 +453,14 @@ /datum/reagent/drug/maint/tar/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() affected_mob.AdjustAllImmobility(-10 * REM * seconds_per_tick) - affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + affected_mob.adjust_organ_loss(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) . = ..() 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) + need_update = affected_mob.adjust_tox_loss(5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_update += affected_mob.adjust_organ_loss(ORGAN_SLOT_LIVER, 3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) if(need_update) return UPDATE_MOB_HEALTH @@ -613,7 +613,7 @@ /datum/reagent/drug/blastoff/on_mob_life(mob/living/carbon/dancer, seconds_per_tick, times_fired) . = ..() - if(dancer.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + if(dancer.adjust_organ_loss(ORGAN_SLOT_LUNGS, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) . = UPDATE_MOB_HEALTH dancer.AdjustKnockdown(-20) @@ -622,7 +622,7 @@ /datum/reagent/drug/blastoff/overdose_process(mob/living/dancer, seconds_per_tick, times_fired) . = ..() - if(dancer.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + if(dancer.adjust_organ_loss(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)) @@ -685,7 +685,7 @@ /datum/reagent/drug/saturnx/on_mob_life(mob/living/carbon/invisible_man, seconds_per_tick, times_fired) . = ..() - if(invisible_man.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + if(invisible_man.adjust_organ_loss(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) @@ -761,7 +761,7 @@ invisible_man.emote("giggle") if(SPT_PROB(5, seconds_per_tick)) invisible_man.emote("laugh") - if(invisible_man.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + if(invisible_man.adjust_organ_loss(ORGAN_SLOT_LIVER, 0.4 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) return UPDATE_MOB_HEALTH /datum/reagent/drug/saturnx/stable @@ -834,13 +834,13 @@ If you have at over 25u in your body you restore more than 20 stamina per cycle, to_chat(druggo, span_nicegreen(pick("You feel the cowardice melt away...", "You feel unbothered by the judgements of others.", "My life feels lovely!", "You lower your snout... and suddenly feel more charitable!"))) else stamina_heal_per_unit = 6 - druggo.adjustStaminaLoss(-stamina_heal_per_unit * trans_volume) + druggo.adjust_stamina_loss(-stamina_heal_per_unit * trans_volume) /datum/reagent/drug/kronkaine/on_mob_life(mob/living/carbon/kronkaine_fiend, seconds_per_tick, times_fired) . = ..() var/need_mob_update kronkaine_fiend.add_mood_event("tweaking", /datum/mood_event/stimulant_medium) - if(kronkaine_fiend.adjustOrganLoss(ORGAN_SLOT_HEART, (0.1 + 0.04 * volume) * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + if(kronkaine_fiend.adjust_organ_loss(ORGAN_SLOT_HEART, (0.1 + 0.04 * volume) * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) need_mob_update = UPDATE_MOB_HEALTH if(kronkaine_fiend.get_organ_loss(ORGAN_SLOT_HEART) >= 75 && prob(15)) to_chat(kronkaine_fiend, span_userdanger("You feel like your heart is about to explode!")) @@ -852,7 +852,7 @@ If you have at over 25u in your body you restore more than 20 stamina per cycle, The reason why I choose to add the adrenal crisis anti-cheese mechanic is because the main combat benefit is so front loaded, you could easily negate all the risk and downsides by mixing it with a small amount of a purger like haloperidol. I think that level of safety goes against the design we would like achieve with drugs; great rewards but at the cost of great risk.*/ - if(kronkaine_fiend.getStaminaLoss() > 30) + if(kronkaine_fiend.get_stamina_loss() > 30) for(var/possible_purger in kronkaine_fiend.reagents.reagent_list) if(istype(possible_purger, /datum/reagent/medicine/c2/multiver) || istype(possible_purger, /datum/reagent/medicine/haloperidol)) if(kronkaine_fiend.HasDisease(/datum/disease/adrenal_crisis)) @@ -860,13 +860,13 @@ If you have at over 25u in your body you restore more than 20 stamina per cycle, kronkaine_fiend.visible_message(span_bolddanger("[kronkaine_fiend.name] suddenly tenses up, it looks like the shock is causing their body to shut down!"), span_userdanger("The sudden shock in combination with the cocktail of drugs and purgatives in your body makes your adrenal system go haywire. Uh oh!")) kronkaine_fiend.ForceContractDisease(new /datum/disease/adrenal_crisis(), FALSE, TRUE) //We punish players for purging, since unchecked purging would allow players to reap the stamina healing benefits without any drawbacks. This also has the benefit of making haloperidol a counter, like it is supposed to be. break - need_mob_update = kronkaine_fiend.adjustStaminaLoss(-0.8 * volume * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update = kronkaine_fiend.adjust_stamina_loss(-0.8 * volume * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) if(need_mob_update) return UPDATE_MOB_HEALTH /datum/reagent/drug/kronkaine/overdose_process(mob/living/kronkaine_fiend, seconds_per_tick, times_fired) . = ..() - if(kronkaine_fiend.adjustOrganLoss(ORGAN_SLOT_HEART, 0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + if(kronkaine_fiend.adjust_organ_loss(ORGAN_SLOT_HEART, 0.5 * 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)) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 3d08f7ca6683..26a355d5ebd7 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -190,7 +190,7 @@ span_userdanger("You're covered in boiling oil!")) if(FryLoss) exposed_mob.emote("scream") - exposed_mob.adjustFireLoss(FryLoss) + exposed_mob.adjust_fire_loss(FryLoss) playsound(exposed_mob, 'sound/machines/fryer/deep_fryer_emerge.ogg', 25, TRUE) ADD_TRAIT(exposed_mob, TRAIT_OIL_FRIED, "cooking_oil_react") addtimer(CALLBACK(exposed_mob, TYPE_PROC_REF(/mob/living, unfry_mob)), 2 SECONDS) @@ -418,7 +418,7 @@ if(reac_volume < 5) return for(var/mob/living/basic/slime/exposed_slime in exposed_turf) - exposed_slime.adjustToxLoss(rand(15,30)) + exposed_slime.adjust_tox_loss(rand(15,30)) /datum/reagent/consumable/condensedcapsaicin name = "Condensed Capsaicin" @@ -512,8 +512,8 @@ /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 + infection -= max(VALUE_PER(0.3, 30) * reac_volume, 0) + infection_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 [LOWER_TEXT(src)], painfully irritating the skin! After a few moments, it feels marginally better.")) @@ -678,7 +678,7 @@ /datum/wound/burn/flesh/on_flour(reac_volume) to_chat(victim, span_notice("The flour seeps into [LOWER_TEXT(src)], spiking you with intense pain! That probably wasn't a good idea...")) sanitization -= min(0, 1) - infestation += 0.2 + infection += 0.2 return /datum/reagent/consumable/flour/expose_turf(turf/exposed_turf, reac_volume) @@ -782,7 +782,7 @@ /datum/wound/burn/flesh/on_starch(reac_volume, mob/living/carbon/carbies) to_chat(carbies, span_notice("The slimey starch seeps into [LOWER_TEXT(src)], spiking you with intense pain! That probably wasn't a good idea...")) sanitization -= min(0, 0.5) - infestation += 0.1 + infection += 0.1 return /datum/reagent/consumable/corn_syrup @@ -821,21 +821,19 @@ holder.add_reagent(/datum/reagent/consumable/sugar, 3 * REM * seconds_per_tick) var/need_mob_update if(SPT_PROB(33, seconds_per_tick)) - 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) + need_mob_update = affected_mob.adjust_brute_loss(-1, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-1, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_oxy_loss(-1, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_tox_loss(-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) . = ..() - if(!iscarbon(exposed_mob) || !(methods & (TOUCH|VAPOR|PATCH))) + if(!(methods & (TOUCH|VAPOR|PATCH))) return - var/mob/living/carbon/exposed_carbon = exposed_mob - for(var/datum/surgery/surgery as anything in exposed_carbon.surgeries) - surgery.speed_modifier = min(0.4, surgery.speed_modifier) + exposed_mob.add_surgery_speed_mod(type, 0.6, min(reac_volume * 1 MINUTES, 5 MINUTES)) /datum/reagent/consumable/mayonnaise name = "Mayonnaise" @@ -910,9 +908,9 @@ affected_mob.Unconscious(40 * REM * seconds_per_tick, FALSE) if(SPT_PROB(10, seconds_per_tick)) 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.adjust_organ_loss(ORGAN_SLOT_BRAIN, 2*REM, 150, affected_biotype) + affected_mob.adjust_tox_loss(3*REM, updating_health = FALSE, required_biotype = affected_biotype) + affected_mob.adjust_stamina_loss(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) @@ -956,8 +954,8 @@ . = ..() var/need_mob_update if(SPT_PROB(55, seconds_per_tick)) - 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.adjust_brute_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -985,7 +983,7 @@ /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 + affected_mob.adjust_blood_volume(1 * seconds_per_tick) else if(SPT_PROB(10, seconds_per_tick)) //lmao at the newbs who eat energy bars 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) @@ -1265,7 +1263,7 @@ default_container = /obj/item/reagent_containers/condiment/dashi_concentrate /datum/reagent/consumable/martian_batter - name = "Martian Batter" + name = "Dashi Batter" // DARKPACK EDIT CHANGE description = "A thick batter made with dashi and flour, used for making dishes such as okonomiyaki and takoyaki." color = "#D49D26" taste_description = "umami dough" diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents.dm index e21c0eada33f..aa2703f46c1c 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents.dm @@ -20,9 +20,9 @@ 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) + need_mob_update = affected_mob.adjust_organ_loss(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! + need_mob_update = affected_mob.adjust_tox_loss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)//Incase of no liver! if(need_mob_update) return UPDATE_MOB_HEALTH @@ -41,7 +41,7 @@ /datum/reagent/inverse/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustToxLoss(tox_damage * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(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 @@ -106,30 +106,19 @@ holder.del_reagent(type) return - human_thing.apply_status_effect(/datum/status_effect/frozenstasis/irresistable) - if(!human_thing.has_status_effect(/datum/status_effect/grouped/stasis, STASIS_CHEMICAL_EFFECT)) - human_thing.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_CHEMICAL_EFFECT) + human_thing.apply_status_effect(/datum/status_effect/reagent_effect/freeze, type) /datum/reagent/inverse/cryostylane/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(!affected_mob.has_status_effect(/datum/status_effect/frozenstasis/irresistable)) - holder.remove_reagent(type, volume) // remove it all if we were broken out - return metabolization_rate += 0.01 //speed up our metabolism over time. Chop chop. /datum/reagent/inverse/cryostylane/metabolize_reagent(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 + return ..() /datum/reagent/inverse/cryostylane/on_mob_end_metabolize(mob/living/affected_mob) . = ..() - affected_mob.remove_status_effect(/datum/status_effect/frozenstasis/irresistable) - affected_mob.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_CHEMICAL_EFFECT) - -/datum/reagent/inverse/cryostylane/on_mob_delete(mob/living/affected_mob, amount) - . = ..() - affected_mob.remove_status_effect(/datum/status_effect/frozenstasis/irresistable) - affected_mob.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_CHEMICAL_EFFECT) - + affected_mob.remove_status_effect(/datum/status_effect/reagent_effect/freeze) 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 10a9c95a3dd3..9f86275f74a1 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 @@ -41,13 +41,13 @@ var/pick = pick("brute", "burn", "tox", "oxy") switch(pick) if("brute") - need_mob_update = affected_mob.adjustBruteLoss(-0.5, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjust_brute_loss(-0.5, updating_health = FALSE, required_bodytype = affected_bodytype) if("burn") - need_mob_update += affected_mob.adjustFireLoss(-0.5, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-0.5, updating_health = FALSE, required_bodytype = affected_bodytype) if("tox") - need_mob_update += affected_mob.adjustToxLoss(-0.5, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_tox_loss(-0.5, updating_health = FALSE, required_biotype = affected_biotype) if("oxy") - need_mob_update += affected_mob.adjustOxyLoss(-0.5, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_oxy_loss(-0.5, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -132,7 +132,7 @@ Basically, we fill the time between now and 2s from now with hands based off the /datum/reagent/inverse/libitoil/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) + affected_mob.adjust_organ_loss(ORGAN_SLOT_LIVER, 0.1 * REM * seconds_per_tick) /datum/reagent/inverse/libitoil/on_mob_add(mob/living/affected_mob, amount) . = ..() @@ -192,7 +192,7 @@ Basically, we fill the time between now and 2s from now with hands based off the /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)) + if(affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 0.25 * seconds_per_tick, 170)) . = UPDATE_MOB_HEALTH affected_mob.adjust_nutrition(-5 * REAGENTS_METABOLISM * seconds_per_tick) @@ -224,7 +224,7 @@ Basically, we fill the time between now and 2s from now with hands based off the tox_damage = 0 /datum/reagent/inverse/aiuri/on_mob_life(mob/living/carbon/owner, seconds_per_tick, times_fired) - owner.adjustOrganLoss(ORGAN_SLOT_EYES, 0.1 * REM * seconds_per_tick) + owner.adjust_organ_loss(ORGAN_SLOT_EYES, 0.1 * REM * seconds_per_tick) owner.adjust_eye_blur(amount_of_blur_applied * seconds_per_tick) . = ..() return TRUE @@ -264,7 +264,7 @@ Basically, we fill the time between now and 2s from now with hands based off the /datum/reagent/inverse/hercuri/overdose_process(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - 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) + if(affected_mob.adjust_organ_loss(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 affected_mob.adjust_bodytemperature(heating) //hot hot @@ -409,7 +409,7 @@ Basically, we fill the time between now and 2s from now with hands based off the time_until_next_poison -= seconds_per_tick * (1 SECONDS) if (time_until_next_poison <= 0) time_until_next_poison = poison_interval - if(affected_mob.adjustToxLoss(creation_purity * 1, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(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 @@ -461,9 +461,9 @@ Basically, we fill the time between now and 2s from now with hands based off the . = ..() var/need_mob_update if(length(affected_mob.reagents.reagent_list) > 1) - 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! + need_mob_update = affected_mob.adjust_organ_loss(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) + need_mob_update = affected_mob.adjust_tox_loss(-2 * REM * creation_purity * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -492,6 +492,7 @@ Basically, we fill the time between now and 2s from now with hands based off the TRAIT_NOHARDCRIT, TRAIT_NOSOFTCRIT, TRAIT_STABLEHEART, + TRAIT_NO_OXYLOSS_PASSOUT, ) /datum/reagent/inverse/penthrite/on_mob_dead(mob/living/carbon/affected_mob, seconds_per_tick) @@ -508,7 +509,7 @@ Basically, we fill the time between now and 2s from now with hands based off the affected_mob.update_sight() REMOVE_TRAIT(affected_mob, TRAIT_KNOCKEDOUT, STAT_TRAIT) REMOVE_TRAIT(affected_mob, TRAIT_KNOCKEDOUT, CRIT_HEALTH_TRAIT) //Because these are normally updated using set_health() - but we don't want to adjust health, and the addition of NOHARDCRIT blocks it being added after, but doesn't remove it if it was added before - REMOVE_TRAIT(affected_mob, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) //Prevents the user from being knocked out by oxyloss + REMOVE_TRAIT(affected_mob, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) //As above, removes unconsciousness if it was added before the reagent was administered affected_mob.set_resting(FALSE) //Please get up, no one wants a deaththrows juggernaught that lies on the floor all the time affected_mob.SetAllImmobility(0) affected_mob.grab_ghost(force = FALSE) //Shoves them back into their freshly reanimated corpse. @@ -527,8 +528,8 @@ Basically, we fill the time between now and 2s from now with hands based off the for(var/datum/wound/iter_wound as anything in affected_mob.all_wounds) iter_wound.adjust_blood_flow(creation_impurity * REM * seconds_per_tick) var/need_mob_update - need_mob_update = affected_mob.adjustBruteLoss(5 * creation_impurity * REM * seconds_per_tick, required_bodytype = affected_bodytype) - need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, ((1 + creation_impurity) * REM * seconds_per_tick), required_organ_flag = affected_organ_flags) + need_mob_update = affected_mob.adjust_brute_loss(5 * creation_impurity * REM * seconds_per_tick, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_organ_loss(ORGAN_SLOT_HEART, ((1 + creation_impurity) * REM * 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) @@ -669,8 +670,8 @@ Basically, we fill the time between now and 2s from now with hands based off the traumalist = shuffle(traumalist) var/obj/item/organ/brain/brain = affected_mob.get_organ_slot(ORGAN_SLOT_BRAIN) for(var/trauma in traumalist) - if(brain.brain_gain_trauma(trauma, TRAUMA_RESILIENCE_MAGIC)) - temp_trauma = trauma + temp_trauma = brain.brain_gain_trauma(trauma, TRAUMA_RESILIENCE_MAGIC) + if(temp_trauma) return /datum/reagent/inverse/neurine/on_mob_delete(mob/living/carbon/affected_mob) @@ -679,7 +680,8 @@ Basically, we fill the time between now and 2s from now with hands based off the return if(istype(temp_trauma, /datum/brain_trauma/special/imaginary_friend))//Good friends stay by you, no matter what return - affected_mob.cure_trauma_type(temp_trauma, resilience = TRAUMA_RESILIENCE_MAGIC) + qdel(temp_trauma) + temp_trauma = null /datum/reagent/inverse/corazargh name = "Corazargh" //It's what you yell! Though, if you've a better name feel free. Also an homage to an older chem @@ -826,7 +828,7 @@ Basically, we fill the time between now and 2s from now with hands based off the if(SPT_PROB(25, seconds_per_tick)) affected_mob.adjust_bodytemperature(30 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * seconds_per_tick) affected_mob.set_jitter_if_lower(3 SECONDS) - affected_mob.adjustStaminaLoss(5 * REM * seconds_per_tick) + affected_mob.adjust_stamina_loss(5 * REM * seconds_per_tick) else if(SPT_PROB(5, seconds_per_tick)) affected_mob.vomit(VOMIT_CATEGORY_BLOOD, lost_nutrition = 0, distance = 3) affected_mob.Paralyze(3 SECONDS) @@ -875,10 +877,10 @@ Basically, we fill the time between now and 2s from now with hands based off the /datum/reagent/inverse/atropine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() var/need_mob_update - need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_STOMACH, -1 * REM * seconds_per_tick) - need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, -1 * REM * seconds_per_tick) - if(affected_mob.getToxLoss() <= 25) - need_mob_update = affected_mob.adjustToxLoss(-0.5, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_STOMACH, -1 * REM * seconds_per_tick) + need_mob_update += affected_mob.adjust_organ_loss(ORGAN_SLOT_HEART, -1 * REM * seconds_per_tick) + if(affected_mob.get_tox_loss() <= 25) + need_mob_update = affected_mob.adjust_tox_loss(-0.5, updating_health = FALSE, required_biotype = affected_biotype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -895,7 +897,7 @@ Basically, we fill the time between now and 2s from now with hands based off the ORGAN_SLOT_APPENDIX, ORGAN_SLOT_TONGUE, ) - affected_mob.adjustOrganLoss(pick(possible_organs) ,2 * seconds_per_tick) + affected_mob.adjust_organ_loss(pick(possible_organs) ,2 * seconds_per_tick) affected_mob.reagents.remove_reagent(type, 1 * REM * seconds_per_tick) /datum/reagent/inverse/ammoniated_mercury @@ -948,13 +950,12 @@ Basically, we fill the time between now and 2s from now with hands based off the metabolized_traits = list(TRAIT_ANALGESIA) tox_damage = 0 -/datum/reagent/inverse/krokodil/expose_mob(mob/living/carbon/exposed_carbon, methods=TOUCH, reac_volume) +/datum/reagent/inverse/krokodil/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() if(!(methods & (TOUCH|VAPOR|PATCH))) return - for(var/datum/surgery/surgery as anything in exposed_carbon.surgeries) - surgery.speed_modifier = min(0.7, surgery.speed_modifier) + exposed_mob.add_surgery_speed_mod(type, 0.7, min(reac_volume * 1 MINUTES, 5 MINUTES)) /datum/reagent/inverse/krokodil/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -1008,10 +1009,10 @@ Basically, we fill the time between now and 2s from now with hands based off the if(is_simian(affected_mob)) var/need_mob_update - need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) if(holder.has_reagent(/datum/reagent/consumable/monkey_energy)) - need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) if(need_mob_update) . = UPDATE_MOB_HEALTH @@ -1021,7 +1022,8 @@ Basically, we fill the time between now and 2s from now with hands based off the /datum/reagent/inverse/aranesp name = "Epoetin Alfa" - description = "Synthetic medication that induces blood regeneration, liver healing and wound clotting in patients. Causes adverse side effects when excessively used over time." + description = "Synthetic medication that induces blood regeneration and wound clotting in patients. \ + Causes adverse side effects, including arterial damage and migraines when excessively used over time." color = "#dee4ff" metabolization_rate = 0.25 * REM overdose_threshold = 20 @@ -1032,17 +1034,10 @@ Basically, we fill the time between now and 2s from now with hands based off the . = ..() if(overdosed) return - var/need_mob_update - need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LIVER, -1 * REM * seconds_per_tick) - for(var/datum/wound/iter_wound as anything in affected_mob.all_wounds) - if(iter_wound.blood_flow) - if(holder.has_reagent(/datum/reagent/medicine/coagulant, 3)) - return - else - holder.add_reagent(/datum/reagent/medicine/coagulant, 0.2 * REM * seconds_per_tick) - if(affected_mob.blood_volume < BLOOD_VOLUME_NORMAL) - need_mob_update += affected_mob.blood_volume += min(3 * seconds_per_tick, BLOOD_VOLUME_NORMAL) + affected_mob.coagulant_effect(0.1 * REM * seconds_per_tick) + affected_mob.adjust_blood_volume(1 * seconds_per_tick, maximum = BLOOD_VOLUME_NORMAL) + affected_mob.adjust_organ_loss(ORGAN_SLOT_HEART, 0.2 * REM * seconds_per_tick) switch(current_cycle) if(10) @@ -1085,10 +1080,6 @@ Basically, we fill the time between now and 2s from now with hands based off the to_chat(affected_mob, span_warning("Your breathing becomes weak and raspy, you can barely stay conscious!")) holder.add_reagent(/datum/reagent/toxin/histamine, 6 * REM * seconds_per_tick) affected_mob.losebreath += 3 - need_mob_update = TRUE - - if(need_mob_update) - return UPDATE_MOB_HEALTH /datum/reagent/inverse/aranesp/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -1203,7 +1194,7 @@ Basically, we fill the time between now and 2s from now with hands based off the /datum/reagent/inverse/baldium/on_mob_delete(mob/living/affected_mob) . = ..() affected_mob.log_message("has taken [delayed_burn_damage] burn damage from maldium's aftereffects", LOG_ATTACK) - affected_mob.adjustFireLoss(delayed_burn_damage, updating_health = TRUE, required_bodytype = affected_bodytype) + affected_mob.adjust_fire_loss(delayed_burn_damage, updating_health = TRUE, required_bodytype = affected_bodytype) /datum/reagent/inverse/colorful_reagent name = "Dulling Reagent" @@ -1254,7 +1245,7 @@ Basically, we fill the time between now and 2s from now with hands based off the var/picked_color = pick(random_color_list) var/color_filter = color_transition_filter(picked_color, SATURATION_OVERRIDE) if (can_color_clothing && (methods & (TOUCH|VAPOR|INHALE))) - var/include_flags = INCLUDE_HELD|INCLUDE_ACCESSORIES + var/include_flags = INCLUDE_HELD|INCLUDE_ACCESSORIES|INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT if (methods & (VAPOR|INHALE) || touch_protection >= 1) include_flags |= INCLUDE_POCKETS for (var/obj/item/to_color in exposed_mob.get_equipped_items(include_flags)) 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 1e12bdd10e5d..4dd80ff4d95c 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 @@ -42,7 +42,7 @@ /datum/reagent/impurity/chloralax/on_mob_life(mob/living/carbon/owner, seconds_per_tick) . = ..() - if(owner.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(owner.adjust_tox_loss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH //Mindbreaker Toxin - Impure Version diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 0c3fa94a077f..cbc4d3721ace 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -68,7 +68,7 @@ /datum/reagent/medicine/adminordrazine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() 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) + affected_mob.adjust_tox_loss(-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) // there is no need to return UPDATE_MOB_HEALTH because this proc calls updatehealth() @@ -94,7 +94,7 @@ 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)) - if(affected_mob.adjustToxLoss(1, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(1, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/medicine/synaphydramine @@ -113,7 +113,7 @@ 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)) - if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/medicine/sansufentanyl @@ -127,7 +127,7 @@ . = ..() 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) - if(affected_mob.adjustStaminaLoss(1 * REM * seconds_per_tick, updating_stamina = FALSE)) + if(affected_mob.adjust_stamina_loss(1 * REM * seconds_per_tick, updating_stamina = FALSE)) . = UPDATE_MOB_HEALTH if(SPT_PROB(10, seconds_per_tick)) @@ -152,10 +152,10 @@ return var/power = -0.00003 * (affected_mob.bodytemperature ** 2) + 3 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.adjust_oxy_loss(-3 * power * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_brute_loss(-power * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-power * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_tox_loss(-power * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE, required_biotype = affected_biotype) //heals TOXINLOVERs for(var/i in affected_mob.all_wounds) var/datum/wound/iter_wound = i iter_wound.on_xadone(power * REM * seconds_per_tick) @@ -191,10 +191,10 @@ power *= 2 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.adjust_oxy_loss(-2 * power * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_brute_loss(-power * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-1.5 * power * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_tox_loss(-power * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE, required_biotype = affected_biotype) if(need_mob_update) . = UPDATE_MOB_HEALTH for(var/i in affected_mob.all_wounds) @@ -227,7 +227,7 @@ /datum/reagent/medicine/rezadone/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(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) @@ -240,7 +240,7 @@ var/functional_react_volume = reac_volume * (1 - touch_protection) var/mob/living/carbon/patient = exposed_mob - if(functional_react_volume >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, BURN) && patient.getFireLoss() < UNHUSK_DAMAGE_THRESHOLD) //One carp yields 12u rezadone. + if(functional_react_volume >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, BURN) && patient.get_fire_loss() < UNHUSK_DAMAGE_THRESHOLD) //One carp yields 12u rezadone. patient.cure_husk(BURN) patient.visible_message(span_nicegreen("[patient]'s body rapidly absorbs moisture from the environment, taking on a more healthy appearance.")) @@ -271,17 +271,17 @@ /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) - need_mob_update = affected_mob.adjustFireLoss(-4 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) //Twice as effective as AIURI for severe burns + if(affected_mob.get_fire_loss() > 25) + need_mob_update = affected_mob.adjust_fire_loss(-4 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) //Twice as effective as AIURI for severe burns else - need_mob_update = affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) //But only a quarter as effective for more minor ones + need_mob_update = affected_mob.adjust_fire_loss(-0.5 * REM * seconds_per_tick * normalise_creation_purity(), 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 - 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 + if(affected_mob.get_fire_loss()) //It only makes existing burns worse + if(affected_mob.adjust_fire_loss(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 @@ -291,30 +291,34 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 60 taste_description = "sweetness and salt" - var/last_added = 0 - var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active - var/extra_regen = 0.25 // in addition to acting as temporary blood, also add about half this much to their actual blood per second ph = 5.5 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /// Add about half this much extra blood regen per second. + var/extra_regen = 0.25 + + /// Add many extra units of blood per unit of saline. + var/dilution_per_unit = 5 + + /// Doesn't dilute blood beyond this point. + var/dilution_cap = BLOOD_VOLUME_NORMAL + + /// Only supplements blood types that use this restoration chem. + var/required_restoration_chem = /datum/reagent/iron + /datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() var/need_mob_update = FALSE + if(SPT_PROB(18, seconds_per_tick)) - 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) + need_mob_update = affected_mob.adjust_brute_loss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype) + need_mob_update += affected_mob.adjust_fire_loss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype) + + // Regen is handled here, dilution is handled in [living/proc/get_blood_volume] var/datum/blood_type/blood_type = affected_mob.get_bloodtype() - // Only suppliments base blood types - if(blood_type?.restoration_chem != /datum/reagent/iron) - return need_mob_update ? UPDATE_MOB_HEALTH : null - if(last_added) - affected_mob.blood_volume -= last_added - last_added = 0 - if(affected_mob.blood_volume < maximum_reachable) //Can only up to double your effective blood level. - var/amount_to_add = min(affected_mob.blood_volume, 5*volume) - var/new_blood_level = min(affected_mob.blood_volume + amount_to_add, maximum_reachable) - last_added = new_blood_level - affected_mob.blood_volume - affected_mob.blood_volume = new_blood_level + (extra_regen * REM * seconds_per_tick) + if(blood_type?.restoration_chem == required_restoration_chem) + affected_mob.adjust_blood_volume(extra_regen * REM * seconds_per_tick) + if(need_mob_update) return UPDATE_MOB_HEALTH @@ -332,8 +336,8 @@ 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)) - 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) + need_mob_update = affected_mob.adjust_brute_loss(0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype) + need_mob_update += affected_mob.adjust_fire_loss(0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_biotype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -349,8 +353,8 @@ /datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() 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) + need_mob_update = affected_mob.adjust_brute_loss(-0.25 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-0.25 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -367,12 +371,9 @@ to_chat(exposed_mob, span_warning("Your stomach feels empty and cramps!")) if(methods & (PATCH|TOUCH)) - var/mob/living/carbon/exposed_carbon = exposed_mob - for(var/datum/surgery/surgery as anything in exposed_carbon.surgeries) - surgery.speed_modifier = min(0.9, surgery.speed_modifier) - + exposed_mob.add_surgery_speed_mod(type, 0.9, min(reac_volume * 1 MINUTES, 5 MINUTES)) if(show_message) - to_chat(exposed_carbon, span_danger("You feel your injuries fade away to nothing!") ) + to_chat(exposed_mob, span_danger("You feel your injuries fade away to nothing!") ) /datum/reagent/medicine/mine_salve/on_mob_metabolize(mob/living/affected_mob) . = ..() @@ -399,20 +400,20 @@ /datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() 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) + need_mob_update = affected_mob.adjust_tox_loss(-healing * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_oxy_loss(-healing * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_brute_loss(-healing * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-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) . = ..() 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) + need_mob_update = affected_mob.adjust_tox_loss(1.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_oxy_loss(1.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_brute_loss(1.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(1.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -441,13 +442,13 @@ continue affected_mob.reagents.remove_reagent(target_reagent.type, 3 * target_reagent.purge_multiplier * REM * seconds_per_tick) var/toxin_amount = round(affected_mob.health / 40, 0.1) - if(affected_mob.adjustToxLoss(toxin_amount * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(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) . = ..() affected_mob.reagents.remove_reagent(type, 2 * REM * seconds_per_tick) - if(affected_mob.adjustToxLoss(2.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(2.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/medicine/ammoniated_mercury @@ -470,8 +471,8 @@ 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 * target_reagent.purge_multiplier * REM * seconds_per_tick) - var/toxin_amount = round(affected_mob.getBruteLoss() / 15, 0.1) + round(affected_mob.getFireLoss() / 30, 0.1) - 3 - if(affected_mob.adjustToxLoss(toxin_amount * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + var/toxin_amount = round(affected_mob.get_brute_loss() / 15, 0.1) + round(affected_mob.get_fire_loss() / 30, 0.1) - 3 + if(affected_mob.adjust_tox_loss(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) @@ -479,7 +480,7 @@ /datum/reagent/medicine/ammoniated_mercury/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustToxLoss(3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/medicine/potass_iodide @@ -494,7 +495,7 @@ /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)) - if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/medicine/pen_acid @@ -510,7 +511,7 @@ /datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustToxLoss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) . = UPDATE_MOB_HEALTH for(var/datum/reagent/reagent as anything in affected_mob.reagents.reagent_list) if(reagent != src) @@ -530,17 +531,17 @@ /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) - need_mob_update = affected_mob.adjustBruteLoss(-4 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) + if(affected_mob.get_brute_loss() > 25) + need_mob_update = affected_mob.adjust_brute_loss(-4 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) else - need_mob_update = affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjust_brute_loss(-0.5 * REM * seconds_per_tick * normalise_creation_purity(), 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 - 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 + if(affected_mob.get_brute_loss()) //It only makes existing bruises worse + if(affected_mob.adjust_brute_loss(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 @@ -556,7 +557,7 @@ /datum/reagent/medicine/salbutamol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() 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) + need_mob_update = affected_mob.adjust_oxy_loss(-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/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 @@ -630,8 +631,8 @@ if (current_cycle > secondary_overdose_effect_cycle_threshold) if (SPT_PROB(30, seconds_per_tick)) carbon_mob.adjust_eye_blur_up_to(6 SECONDS, 30 SECONDS) - if (carbon_mob.getStaminaLoss() < maximum_od_stamina_damage) - carbon_mob.adjustStaminaLoss(seconds_per_tick) + if (carbon_mob.get_stamina_loss() < maximum_od_stamina_damage) + carbon_mob.adjust_stamina_loss(seconds_per_tick) /datum/reagent/medicine/albuterol/proc/holder_lost_organ(datum/source, obj/item/organ/lost) SIGNAL_HANDLER @@ -680,7 +681,7 @@ affected_mob.set_jitter_if_lower(20 SECONDS) affected_mob.AdjustAllImmobility(-20 * REM * seconds_per_tick * normalise_creation_purity()) - affected_mob.adjustStaminaLoss(-4 * REM * seconds_per_tick * normalise_creation_purity(), updating_stamina = FALSE) + affected_mob.adjust_stamina_loss(-4 * REM * seconds_per_tick * normalise_creation_purity(), updating_stamina = FALSE) return UPDATE_MOB_HEALTH @@ -695,7 +696,7 @@ 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 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + affected_mob.adjust_tox_loss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) affected_mob.losebreath++ return UPDATE_MOB_HEALTH @@ -829,7 +830,7 @@ 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 && IS_ORGANIC_ORGAN(eyes) && SPT_PROB(16 - min(normalized_purity * 6, 12), seconds_per_tick)) + if(eyes.damage >= eyes.low_threshold && 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...")) @@ -847,7 +848,7 @@ /datum/reagent/medicine/oculine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustOrganLoss(ORGAN_SLOT_EYES, 1.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + if(affected_mob.adjust_organ_loss(ORGAN_SLOT_EYES, 1.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) . = UPDATE_MOB_HEALTH /datum/reagent/medicine/oculine/flumpuline @@ -929,7 +930,9 @@ var/obj/item/organ/ears/ears = affected_mob.get_organ_slot(ORGAN_SLOT_EARS) if(!ears) return - ears.adjustEarDamage(-4 * REM * seconds_per_tick * normalise_creation_purity(), -4 * REM * seconds_per_tick * normalise_creation_purity()) + var/multiplier = REM * seconds_per_tick * normalise_creation_purity() + ears.apply_organ_damage(-4 * multiplier) + ears.adjust_temporary_deafness(-8 * multiplier) return UPDATE_MOB_HEALTH /datum/reagent/medicine/inacusiate/on_mob_delete(mob/living/affected_mob) @@ -954,10 +957,10 @@ . = ..() if(affected_mob.health <= affected_mob.crit_threshold) 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) + need_mob_update = affected_mob.adjust_tox_loss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_brute_loss(-2* REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_oxy_loss(-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/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) @@ -970,14 +973,15 @@ /datum/reagent/medicine/atropine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustToxLoss(0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(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" - description = "Very minor boost to stun resistance. Slowly heals damage if a patient is in critical condition, as well as regulating oxygen loss. Overdose causes weakness and toxin damage." + description = "Stabilizes and slowly heals patients in critical condition, and slows suffocation. \ + Also provides a very minor boost to stun resistance. Overdose causes weakness and toxin damage." color = "#D2FFFA" metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 30 @@ -994,10 +998,10 @@ var/need_mob_update if(affected_mob.health <= affected_mob.crit_threshold) - 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) + need_mob_update = affected_mob.adjust_tox_loss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_brute_loss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_oxy_loss(-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/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 @@ -1007,7 +1011,7 @@ if(affected_mob.losebreath < 0) affected_mob.losebreath = 0 need_mob_update = TRUE - need_mob_update += affected_mob.adjustStaminaLoss(-2 * REM * seconds_per_tick, updating_stamina = FALSE) + need_mob_update += affected_mob.adjust_stamina_loss(-2 * REM * seconds_per_tick, updating_stamina = FALSE) if(SPT_PROB(10, seconds_per_tick)) affected_mob.AdjustAllImmobility(-20) need_mob_update = TRUE @@ -1024,8 +1028,8 @@ . = ..() if(SPT_PROB(18, REM * seconds_per_tick)) 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) + need_mob_update = affected_mob.adjust_stamina_loss(2.5 * REM * seconds_per_tick, updating_stamina = FALSE) + need_mob_update += affected_mob.adjust_tox_loss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) var/obj/item/organ/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) @@ -1072,7 +1076,7 @@ /// Calculates the amount of reagent to at a bare minimum make the target not dead /datum/reagent/medicine/strange_reagent/proc/calculate_amount_needed_to_revive(mob/living/benefactor) - var/their_health = benefactor.getMaxHealth() - (benefactor.getBruteLoss() + benefactor.getFireLoss()) + var/their_health = benefactor.getMaxHealth() - (benefactor.get_brute_loss() + benefactor.get_fire_loss()) if(their_health > 0) return 1 @@ -1080,7 +1084,7 @@ /// Calculates the amount of reagent that will be needed to both revive and full heal the target. Looks at healing_per_reagent_unit and excess_healing_ratio /datum/reagent/medicine/strange_reagent/proc/calculate_amount_needed_to_full_heal(mob/living/benefactor) - var/their_health = benefactor.getBruteLoss() + benefactor.getFireLoss() + var/their_health = benefactor.get_brute_loss() + benefactor.get_fire_loss() var/max_health = benefactor.getMaxHealth() if(their_health >= max_health) return 1 @@ -1104,7 +1108,7 @@ exposed_mob.visible_message(span_warning("[exposed_mob]'s body lets off a puff of smoke...")) return - if((exposed_mob.getBruteLoss() + exposed_mob.getFireLoss()) > (exposed_mob.getMaxHealth() * max_revive_damage_ratio)) + if((exposed_mob.get_brute_loss() + exposed_mob.get_fire_loss()) > (exposed_mob.getMaxHealth() * max_revive_damage_ratio)) exposed_mob.visible_message(span_warning("[exposed_mob]'s body convulses violently, before falling still...")) return @@ -1144,8 +1148,8 @@ . = ..() var/damage_at_random = rand(0, 250)/100 //0 to 2.5 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) + need_mob_update = affected_mob.adjust_brute_loss(damage_at_random * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(damage_at_random * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -1184,7 +1188,7 @@ /datum/reagent/medicine/mannitol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)) + if(affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, -2 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)) return UPDATE_MOB_HEALTH /datum/reagent/medicine/mannitol/overdose_start(mob/living/affected_mob) @@ -1231,7 +1235,7 @@ return var/mob/living/carbon/affected_carbon = affected_mob if(initial_bdamage < affected_carbon.get_organ_loss(ORGAN_SLOT_BRAIN)) - affected_carbon.setOrganLoss(ORGAN_SLOT_BRAIN, initial_bdamage) + affected_carbon.set_organ_loss(ORGAN_SLOT_BRAIN, initial_bdamage) /datum/reagent/medicine/neurine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -1242,7 +1246,7 @@ /datum/reagent/medicine/neurine/on_mob_dead(mob/living/carbon/affected_mob, seconds_per_tick) . = ..() - if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)) + if(affected_mob.adjust_organ_loss(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 @@ -1297,17 +1301,16 @@ for(var/effect in status_effects_to_clear) affected_mob.remove_status_effect(effect) affected_mob.reagents.remove_reagent(/datum/reagent/consumable/ethanol, 8 * REM * seconds_per_tick * normalise_creation_purity(), include_subtypes = TRUE) - if(affected_mob.adjustToxLoss(-0.2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(-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()) -/datum/reagent/medicine/antihol/expose_mob(mob/living/carbon/exposed_carbon, methods=TOUCH, reac_volume) +/datum/reagent/medicine/antihol/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() if(!(methods & (TOUCH|VAPOR|PATCH))) return - for(var/datum/surgery/surgery as anything in exposed_carbon.surgeries) - surgery.speed_modifier = min(surgery.speed_modifier + 0.1, 1.1) + exposed_mob.add_surgery_speed_mod(type, 1.1, min(reac_volume * 1 MINUTES, 5 MINUTES)) /datum/reagent/medicine/stimulants name = "Stimulants" @@ -1332,20 +1335,20 @@ . = ..() if(affected_mob.health < 50 && affected_mob.health > 0) 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) + need_mob_update += affected_mob.adjust_oxy_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_tox_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_brute_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-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(-12 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + affected_mob.adjust_stamina_loss(-12 * 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, updating_stamina = FALSE, required_biotype = affected_biotype) - affected_mob.adjustToxLoss(1, updating_health = FALSE, required_biotype = affected_biotype) + affected_mob.adjust_stamina_loss(2.5, updating_stamina = FALSE, required_biotype = affected_biotype) + affected_mob.adjust_tox_loss(1, updating_health = FALSE, required_biotype = affected_biotype) affected_mob.losebreath++ return UPDATE_MOB_HEALTH @@ -1398,10 +1401,10 @@ /datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() 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 + need_mob_update = affected_mob.adjust_brute_loss(-1.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-1.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_oxy_loss(-1.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_tox_loss(-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 @@ -1416,11 +1419,11 @@ /datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() 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, forced = TRUE, required_biotype = affected_biotype) - need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15 * REM * seconds_per_tick) + need_mob_update = affected_mob.adjust_brute_loss(-5 * REM * seconds_per_tick, updating_health = FALSE) //A ton of healing - this is a 50 telecrystal investment. + need_mob_update += affected_mob.adjust_fire_loss(-5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjust_oxy_loss(-15 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjust_tox_loss(-5 * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, -15 * REM * seconds_per_tick) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -1445,19 +1448,19 @@ . = ..() 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.adjustStaminaLoss(-2 * 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! + need_mob_update = affected_mob.adjust_brute_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_oxy_loss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_tox_loss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_stamina_loss(-2 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_organ_loss(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 - 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.adjustStaminaLoss(-8 * 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) + need_mob_update = affected_mob.adjust_brute_loss(-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.adjust_fire_loss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_oxy_loss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_tox_loss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_stamina_loss(-8 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_organ_loss(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) if(SPT_PROB(5, seconds_per_tick)) affected_mob.say(return_hippie_line(), forced = /datum/reagent/medicine/earthsblood) @@ -1470,9 +1473,9 @@ affected_mob.adjust_hallucinations_up_to(10 SECONDS * REM * seconds_per_tick, 120 SECONDS) 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) + need_mob_update = affected_mob.adjust_tox_loss(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) + need_mob_update += affected_mob.adjust_tox_loss(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) @@ -1513,13 +1516,13 @@ if (affected_mob.get_timed_status_effect_duration(/datum/status_effect/hallucination) >= 10 SECONDS) affected_mob.adjust_hallucinations(-10 SECONDS * REM * seconds_per_tick) - if(affected_mob.getStaminaLoss() >= 100) + if(affected_mob.get_stamina_loss() >= 100) affected_mob.reagents.remove_reagent(type, metabolization_rate * REM * seconds_per_tick) var/need_mob_update = FALSE if(SPT_PROB(10, seconds_per_tick)) - 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) + need_mob_update += affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 1, 50, affected_organ_flags) + need_mob_update += affected_mob.adjust_stamina_loss(2.5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -1534,7 +1537,7 @@ /datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) . = ..() metabolizer.AdjustAllImmobility(-20 * REM * seconds_per_tick) - if(metabolizer.adjustStaminaLoss(-30 * REM * seconds_per_tick, updating_stamina = FALSE)) + if(metabolizer.adjust_stamina_loss(-30 * 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) @@ -1555,14 +1558,14 @@ /datum/reagent/medicine/changelingadrenaline/proc/on_stamcrit(mob/living/affected_mob) SIGNAL_HANDLER - affected_mob?.setStaminaLoss(90, updating_stamina = TRUE) + affected_mob?.set_stamina_loss(90, updating_stamina = TRUE) to_chat(affected_mob, span_changeling("Our gene-stim flares! We are invigorated, but its potency wanes.")) volume -= (min(volume, 1)) return STAMCRIT_CANCELLED /datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/metabolizer, seconds_per_tick, times_fired) . = ..() - if(metabolizer.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE)) + if(metabolizer.adjust_tox_loss(1 * REM * seconds_per_tick, updating_health = FALSE)) return UPDATE_MOB_HEALTH /datum/reagent/medicine/changelinghaste @@ -1582,7 +1585,7 @@ /datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) . = ..() - if(metabolizer.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE)) + if(metabolizer.adjust_tox_loss(2 * REM * seconds_per_tick, updating_health = FALSE)) return UPDATE_MOB_HEALTH /datum/reagent/medicine/higadrite @@ -1640,7 +1643,7 @@ return overdose_threshold = overdose_threshold + ((rand(-10, 10) / 10) * REM * seconds_per_tick) // for extra fun metabolizer.AdjustAllImmobility(-5 * REM * seconds_per_tick) - metabolizer.adjustStaminaLoss(-3 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) + metabolizer.adjust_stamina_loss(-3 * 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 return UPDATE_MOB_HEALTH @@ -1663,8 +1666,8 @@ affected_mob.losebreath++ need_mob_update = TRUE if(41 to 80) - 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) + need_mob_update = affected_mob.adjust_oxy_loss(0.1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_stamina_loss(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) @@ -1677,13 +1680,13 @@ 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 - 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) + need_mob_update = affected_mob.adjust_oxy_loss(0.1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_stamina_loss(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) - 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) + need_mob_update += affected_mob.adjust_oxy_loss(1.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_stamina_loss(1.5 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -1709,7 +1712,7 @@ /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) - if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/medicine/metafactor @@ -1740,7 +1743,7 @@ /datum/reagent/medicine/silibinin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - 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. + if(affected_mob.adjust_organ_loss(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. @@ -1755,8 +1758,8 @@ /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. . = ..() 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) + need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_LUNGS, -0.25 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjust_brute_loss(-0.35 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -1769,7 +1772,7 @@ /datum/reagent/medicine/polypyr/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) + if(affected_mob.adjust_organ_loss(ORGAN_SLOT_LUNGS, 0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) return UPDATE_MOB_HEALTH /datum/reagent/medicine/granibitaluri @@ -1779,21 +1782,22 @@ overdose_threshold = 50 metabolization_rate = 0.5 * REAGENTS_METABOLISM //same as C2s chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolized_traits = list(TRAIT_ANALGESIA) /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 + var/healamount = max(0.5 - round(0.01 * (affected_mob.get_brute_loss() + affected_mob.get_fire_loss()), 0.1), 0) //base of 0.5 healing per cycle and loses 0.1 healing for every 10 combined brute/burn damage you have 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) + need_mob_update = affected_mob.adjust_brute_loss(-healamount * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-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) . = ..() 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 + need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_LIVER, 0.2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += affected_mob.adjust_tox_loss(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 @@ -1829,38 +1833,27 @@ /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) - return - - var/datum/wound/bloodiest_wound - - for(var/i in affected_mob.all_wounds) - var/datum/wound/iter_wound = i - if(iter_wound.blood_flow) - if(iter_wound.blood_flow > bloodiest_wound?.blood_flow) - bloodiest_wound = iter_wound - - if(bloodiest_wound) + if(affected_mob.coagulant_effect(clot_rate * REM * seconds_per_tick)) if(!was_working) to_chat(affected_mob, span_green("You can feel your flowing blood start thickening!")) was_working = TRUE - bloodiest_wound.adjust_blood_flow(-clot_rate * REM * seconds_per_tick) + else if(was_working) was_working = FALSE /datum/reagent/medicine/coagulant/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() - if(!affected_mob.blood_volume) + if(!CAN_HAVE_BLOOD(affected_mob)) return if(SPT_PROB(7.5, seconds_per_tick)) affected_mob.losebreath += rand(2, 4) - affected_mob.adjustOxyLoss(rand(1, 3), updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + affected_mob.adjust_oxy_loss(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) * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + affected_mob.adjust_oxy_loss(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/lungs/our_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) @@ -1915,8 +1908,8 @@ . = ..() 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)) + if(SPT_PROB(15, seconds_per_tick) && !affected_mob.get_stamina_loss()) + if(affected_mob.adjust_stamina_loss(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 3339ea5267bb..fda874245761 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2,7 +2,7 @@ name = "Blood" description = "Blood cells suspended in plasma, the most abundant of which being the hemoglobin-containing red blood cells." color = "#C80000" // rgb: 200, 0, 0 - metabolization_rate = 12.5 * REAGENTS_METABOLISM //fast rate so it disappears fast. + metabolization_rate = 25 * REAGENTS_METABOLISM //fast rate so it disappears fast. DARKPACK EDIT CHANGE - changed from 12.5 to 25 taste_description = "iron" taste_mult = 1.3 penetrates_skin = NONE @@ -47,6 +47,14 @@ return ..() return list("[blood_type] type blood" = 1) +// DARKPACK EDIT ADD - blood increments bloodpool +/datum/reagent/blood/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + + if(isghoul(affected_mob) || iskindred(affected_mob)) + affected_mob.adjust_blood_pool(metabolization_rate * 0.005 * seconds_per_tick) +// DARKPACK EDIT ADD END + /datum/reagent/consumable/liquidgibs name = "Liquid Gibs" color = "#CC4633" @@ -108,7 +116,7 @@ description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen." color = "#AAAAAA77" // rgb: 170, 170, 170, 77 (alpha) taste_description = "water" - var/cooling_temperature = 2 + var/cooling_temperature = 1.2 // DARKPACK EDIT CHANGE - TURF_FIRE chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_CLEANS default_container = /obj/item/reagent_containers/cup/glass/waterbottle @@ -137,6 +145,7 @@ var/cool_temp = cooling_temperature + /* // DARKPACK EDIT REMOVAL - TURF_FIRE var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in exposed_turf) if(hotspot && !isspaceturf(exposed_turf)) // the water evaporates in an endothermic reaction if(exposed_turf.air) @@ -145,12 +154,16 @@ exposed_turf.temperature = clamp(min(exposed_turf.temperature-(cool_temp*1000), exposed_turf.temperature/cool_temp), T20C, exposed_turf.temperature) // turfs normally don't go below T20C so I'll just clamp it to that in case of weird phenomena. air.react(src) qdel(hotspot) + */ + exposed_turf.extinguish_turf(cool_temp) // DARKPACK EDIT ADD - TURF_FIRE if(isgroundlessturf(exposed_turf) || isnoslipturf(exposed_turf)) return - if(reac_volume >= 5) + // DARKPACK EDIT CHANGE START - TURF_FIRE + if(reac_volume >= 5 && prob(25+reac_volume)) exposed_turf.MakeSlippery(TURF_WET_WATER, 10 SECONDS, min(reac_volume*1.5 SECONDS, 60 SECONDS)) + // DARKPACK EDIT CHANGE END /* * Water reaction to an object @@ -219,17 +232,22 @@ /datum/reagent/water/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() + + var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + if(liver?.damage && !IS_ROBOTIC_ORGAN(liver) && !(liver.organ_flags & ORGAN_FAILING)) + var/healing_bonus = liver.healing_factor * liver.maxHealth + liver.apply_organ_damage(-healing_bonus * REM * seconds_per_tick) + var/water_adaptation = HAS_TRAIT(affected_mob, TRAIT_WATER_ADAPTATION) - if(affected_mob.blood_volume) - var/blood_restored = water_adaptation ? 0.3 : 0.1 - affected_mob.blood_volume += blood_restored * REM * seconds_per_tick // water is good for you! + var/blood_restored = water_adaptation ? 0.3 : 0.1 + affected_mob.adjust_blood_volume(blood_restored * REM * seconds_per_tick) // water is good for you! var/drunkness_restored = water_adaptation ? -0.5 : -0.25 affected_mob.adjust_drunk_effect(drunkness_restored * REM * seconds_per_tick) // and even sobers you up slowly!! if(water_adaptation) var/need_mob_update = FALSE - need_mob_update = affected_mob.adjustToxLoss(-0.25 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) - need_mob_update += affected_mob.adjustFireLoss(-0.25 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) - need_mob_update += affected_mob.adjustBruteLoss(-0.25 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjust_tox_loss(-0.25 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_fire_loss(-0.25 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_brute_loss(-0.25 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) return need_mob_update ? UPDATE_MOB_HEALTH : . // For weird backwards situations where water manages to get added to trays nutrients, as opposed to being snowflaked away like usual. @@ -238,6 +256,15 @@ //You don't belong in this world, monster! mytray.reagents.remove_reagent(type, volume) +/datum/reagent/water/mineral + name = "Mineral Water" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE|REAGENT_CLEANS + +/datum/reagent/water/mineral/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_tox_loss(-0.1 * REM * seconds_per_tick, updating_health = FALSE) + return UPDATE_MOB_HEALTH + /datum/reagent/water/salt name = "Saltwater" description = "Water, but salty. Smells like... the station infirmary?" @@ -282,8 +309,8 @@ /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 + infection -= max(VALUE_PER(0.5, 30) * reac_volume, 0) + infection_rate += VALUE_PER(0.07, 30) * reac_volume to_chat(victim, span_notice("The salt water splashes over [LOWER_TEXT(src)], soaking up the... miscellaneous fluids. It feels somewhat better afterwards.")) return @@ -353,7 +380,7 @@ else if(HAS_TRAIT(affected_mob, TRAIT_EVIL) && SPT_PROB(25, seconds_per_tick)) //Congratulations, your committment to evil has now made holy water a deadly poison to you! if(!IS_CULTIST(affected_mob) || affected_mob.mind?.holy_role != HOLY_ROLE_PRIEST) affected_mob.emote("scream") - need_mob_update += affected_mob.adjustFireLoss(3 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjust_fire_loss(3 * REM * seconds_per_tick, updating_health = FALSE) if(data["deciseconds_metabolized"] >= (1 MINUTES)) // 24 units if(IS_CULTIST(affected_mob)) @@ -361,7 +388,7 @@ affected_mob.Unconscious(10 SECONDS) else if(HAS_TRAIT(affected_mob, TRAIT_EVIL)) //At this much holy water, you're probably going to fucking melt. good luck if(!IS_CULTIST(affected_mob) || affected_mob.mind?.holy_role != HOLY_ROLE_PRIEST) - need_mob_update += affected_mob.adjustFireLoss(10 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjust_fire_loss(10 * REM * seconds_per_tick, updating_health = FALSE) affected_mob.remove_status_effect(/datum/status_effect/jitter) affected_mob.remove_status_effect(/datum/status_effect/speech/stutter) for(var/datum/status_effect/eldritch_painting/eldritch_curses in affected_mob.status_effects) @@ -429,7 +456,7 @@ var/damage_to_inflict = 2 * max(1 - touch_protection, 0) if(damage_to_inflict) - exposed_mob.adjustFireLoss(damage_to_inflict) + exposed_mob.adjust_fire_loss(damage_to_inflict) /datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke name = "Unholy Water" @@ -453,30 +480,21 @@ if(IS_CULTIST(affected_mob)) affected_mob.adjust_drowsiness(-10 SECONDS * REM * seconds_per_tick) affected_mob.AdjustAllImmobility(-40 * REM * seconds_per_tick) - 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 += affected_mob.adjust_stamina_loss(-10 * REM * seconds_per_tick, updating_stamina = FALSE) + need_mob_update += affected_mob.adjust_tox_loss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjust_oxy_loss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjust_brute_loss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjust_fire_loss(-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 - - var/datum/wound/bloodiest_wound - - for(var/datum/wound/iter_wound as anything in affected_mob.all_wounds) - if(iter_wound.blood_flow && iter_wound.blood_flow > bloodiest_wound?.blood_flow) - bloodiest_wound = iter_wound - - if(bloodiest_wound) - bloodiest_wound.adjust_blood_flow(-2 * REM * seconds_per_tick) + affected_mob.adjust_blood_volume(3 * REM * seconds_per_tick, maximum = BLOOD_VOLUME_NORMAL) + affected_mob.coagulant_effect(2 * REM * seconds_per_tick) else // Will deal about 90 damage when 50 units are thrown - 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) + need_mob_update += affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 3 * REM * seconds_per_tick, 150) + need_mob_update += affected_mob.adjust_tox_loss(1 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjust_fire_loss(1 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjust_oxy_loss(1 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjust_brute_loss(1 * REM * seconds_per_tick, updating_health = FALSE) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -496,9 +514,9 @@ 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 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) + need_mob_update = affected_mob.adjust_tox_loss(0.5*seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjust_fire_loss(0.5*seconds_per_tick, updating_health = FALSE) //Hence the other damages... ain't I a bastard? + affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 2.5*seconds_per_tick, 150) if(holder) holder.remove_reagent(type, 0.5 * seconds_per_tick) if(need_mob_update) @@ -554,7 +572,7 @@ /datum/reagent/spraytan/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) . = ..() if(ishuman(exposed_mob)) - if(methods & (PATCH|VAPOR) && touch_protection >= 1) + if(methods & (PATCH|VAPOR) && touch_protection < 1) var/mob/living/carbon/human/exposed_human = exposed_mob if(HAS_TRAIT(exposed_human, TRAIT_USES_SKINTONES)) switch(exposed_human.skin_tone) @@ -658,11 +676,12 @@ "Your appendages begin morphing." = MUT_MSG_EXTENDED, "You feel as though you're about to change at any moment!" = MUT_MSG_ABOUT2TURN) -/datum/reagent/mutationtoxin/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) +/datum/reagent/mutationtoxin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(!istype(affected_mob)) + if(!ishuman(affected_mob)) return - if(!(affected_mob.dna?.species) || !(affected_mob.mob_biotypes & affected_biotype)) + var/mob/living/carbon/affected_human = affected_mob + if(!(affected_human.dna?.species) || !(affected_human.mob_biotypes & affected_biotype)) return if(SPT_PROB(5, seconds_per_tick)) @@ -678,13 +697,13 @@ for(var/i in mutationtexts) if(mutationtexts[i] == filter) pick_ur_fav += i - to_chat(affected_mob, span_warning("[pick(pick_ur_fav)]")) + to_chat(affected_human, span_warning("[pick(pick_ur_fav)]")) if(current_cycle >= CYCLES_TO_TURN) var/datum/species/species_type = race - affected_mob.set_species(species_type) + affected_human.set_species(species_type) holder.del_reagent(type) - to_chat(affected_mob, span_warning("You've become \a [LOWER_TEXT(initial(species_type.name))]!")) + to_chat(affected_human, span_warning("You've become \a [LOWER_TEXT(initial(species_type.name))]!")) return /datum/reagent/mutationtoxin/classic //The one from plasma on green slimes @@ -741,20 +760,24 @@ taste_description = "grandma's gelatin" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/mutationtoxin/jelly/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) - if(isjellyperson(affected_mob)) - to_chat(affected_mob, span_warning("Your jelly shifts and morphs, turning you into another subspecies!")) - var/species_type = pick(subtypesof(/datum/species/jelly)) - affected_mob.set_species(species_type) - holder.del_reagent(type) - return UPDATE_MOB_HEALTH - if(current_cycle >= CYCLES_TO_TURN) //overwrite since we want subtypes of jelly +/datum/reagent/mutationtoxin/jelly/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + if(!ishuman(affected_mob)) + return ..() + var/mob/living/carbon/affected_human = affected_mob + if(isjellyperson(affected_human)) var/datum/species/species_type = pick(subtypesof(race)) - affected_mob.set_species(species_type) + affected_human.set_species(species_type) holder.del_reagent(type) - to_chat(affected_mob, span_warning("You've become \a [initial(species_type.name)]!")) + to_chat(affected_human, span_warning("Your jelly shifts and morphs, turning you into another subspecies!")) return UPDATE_MOB_HEALTH - return ..() + if(current_cycle < CYCLES_TO_TURN) //overwrite since we want subtypes of jelly + return ..() + var/datum/species/species_type = pick(subtypesof(race)) + affected_human.set_species(species_type) + holder.del_reagent(type) + to_chat(affected_human, span_warning("You've become \a [initial(species_type.name)]!")) + return UPDATE_MOB_HEALTH + /datum/reagent/mutationtoxin/golem name = "Golem Mutation Toxin" @@ -838,13 +861,14 @@ taste_description = "slime" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/mulligan/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) +/datum/reagent/mulligan/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if (!istype(affected_mob)) + if(!ishuman(affected_mob)) return - to_chat(affected_mob, span_warning("You grit your teeth in pain as your body rapidly mutates!")) - affected_mob.visible_message("[affected_mob] suddenly transforms!") - randomize_human_normie(affected_mob) + var/mob/living/carbon/human/affected_human = affected_mob + to_chat(affected_human, span_boldwarning("You grit your teeth in pain as your body rapidly mutates!")) + affected_human.visible_message("[affected_human] suddenly transforms!") + randomize_human_normie(affected_human) /datum/reagent/aslimetoxin name = "Advanced Mutation Toxin" @@ -961,7 +985,7 @@ step(affected_mob, pick(GLOB.cardinals)) if(SPT_PROB(3.5, seconds_per_tick)) affected_mob.emote(pick("twitch","drool","moan")) - if(affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5*seconds_per_tick)) + if(affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 0.5*seconds_per_tick)) return UPDATE_MOB_HEALTH /datum/reagent/sulfur @@ -1027,7 +1051,7 @@ /datum/reagent/fluorine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustToxLoss(0.5*REM*seconds_per_tick, updating_health = FALSE)) + if(affected_mob.adjust_tox_loss(0.5*REM*seconds_per_tick, updating_health = FALSE)) return UPDATE_MOB_HEALTH /datum/reagent/sodium @@ -1069,7 +1093,7 @@ /datum/reagent/glycerol name = "Glycerol" - description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." + description = "A simple polyol compound. Sweet-tasting and of low toxicity." color = "#D3B913" taste_description = "sweetness" ph = 9 @@ -1083,13 +1107,12 @@ ph = 10.5 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) +/datum/reagent/space_cleaner/sterilizine/expose_mob(mob/living/exposed_mob, 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(0.2, surgery.speed_modifier) + exposed_mob.add_surgery_speed_mod(type, 0.8, min(reac_volume * 1 MINUTES, 5 MINUTES)) /datum/reagent/space_cleaner/sterilizine/on_burn_wound_processing(datum/wound/burn/flesh/burn_wound) burn_wound.sanitization += 0.9 @@ -1139,7 +1162,7 @@ var/chance = min(volume / (20 - rad_power * 5), rad_power) if(SPT_PROB(chance, seconds_per_tick)) // ignore rad protection calculations bc it's inside of us affected_mob.AddComponent(/datum/component/irradiated) - if(affected_mob.adjustToxLoss(tox_damage * seconds_per_tick * REM, updating_health = FALSE)) + if(affected_mob.adjust_tox_loss(tox_damage * seconds_per_tick * REM, updating_health = FALSE)) return UPDATE_MOB_HEALTH /datum/reagent/uranium/expose_obj(obj/exposed_obj, reac_volume, methods=TOUCH, show_message=TRUE) @@ -1285,7 +1308,7 @@ var/obj/item/organ/liver/liver = victim.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_HUMAN_AI_METABOLISM)) return - if(victim.adjustToxLoss(0.5 * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(victim.adjust_tox_loss(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) @@ -1324,7 +1347,7 @@ exposed_turf.wash(clean_types, TRUE) for(var/mob/living/basic/slime/exposed_slime in exposed_turf) - exposed_slime.adjustToxLoss(rand(5,10)) + exposed_slime.adjust_tox_loss(rand(5,10)) /datum/reagent/space_cleaner/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=0) . = ..() @@ -1352,9 +1375,9 @@ /datum/reagent/space_cleaner/ez_clean/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() 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) + need_mob_update = affected_mob.adjust_brute_loss(1.665*seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjust_fire_loss(1.665*seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjust_tox_loss(1.665*seconds_per_tick, updating_health = FALSE) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -1366,8 +1389,8 @@ var/damage_to_inflict = 1.5 * max(1 - touch_protection, 0) if(damage_to_inflict) - exposed_mob.adjustBruteLoss(damage_to_inflict) - exposed_mob.adjustFireLoss(damage_to_inflict) + exposed_mob.adjust_brute_loss(damage_to_inflict) + exposed_mob.adjust_fire_loss(damage_to_inflict) /datum/reagent/cryptobiolin name = "Cryptobiolin" @@ -1393,7 +1416,7 @@ /datum/reagent/impedrezene name = "Impedrezene" - description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." + description = "A narcotic that impedes one's ability by slowing down the higher brain cell functions." color = "#E07DDD" // pink = happy = dumb taste_description = "numbness" ph = 9.1 @@ -1404,7 +1427,7 @@ . = ..() affected_mob.adjust_jitter(-5 SECONDS * seconds_per_tick) if(SPT_PROB(55, seconds_per_tick)) - affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2) + affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 2) . = TRUE if(SPT_PROB(30, seconds_per_tick)) affected_mob.adjust_drowsiness(6 SECONDS) @@ -1557,7 +1580,7 @@ var/drowsiness_to_apply = max(round(reac_volume, 1) * 2 SECONDS * (1 - touch_protection), 4 SECONDS) exposed_mob.adjust_drowsiness(drowsiness_to_apply) if(methods & INHALE) - exposed_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25 * reac_volume, required_organ_flag = affected_organ_flags) + exposed_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 0.25 * reac_volume, required_organ_flag = affected_organ_flags) exposed_mob.adjust_hallucinations(10 SECONDS * reac_volume) /datum/reagent/nitrous_oxide/on_mob_metabolize(mob/living/affected_mob) @@ -1727,7 +1750,7 @@ /datum/reagent/plantnutriment/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() if(SPT_PROB(tox_prob, seconds_per_tick)) - if(affected_mob.adjustToxLoss(1, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(1, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/plantnutriment/eznutriment @@ -2063,21 +2086,21 @@ /datum/reagent/pentaerythritol name = "Pentaerythritol" - description = "Slow down, it ain't no spelling bee!" - color = "#E66FFF" + description = "A crystalline compound used in the synthesis of explosives and other chemicals." + color = "#EEEEEF" taste_description = "acid" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/acetaldehyde name = "Acetaldehyde" - description = "Similar to plastic. Tastes like dead people." + description = "A colorless liquid with a strong smell. Used in the synthesis of other chemicals." color = "#EEEEEF" taste_description = "dead people" //made from formaldehyde, ya get da joke ? chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/acetone_oxide name = "Acetone Oxide" - description = "Enslaved oxygen" + description = "A highly reactive compoud derived from acetone. Known to cause burns on contact. Used in the synthesis of various explosives." color = "#966199cb" taste_description = "acid" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2090,7 +2113,7 @@ var/damage_to_inflict = 2 * max(1 - touch_protection, 0) if(damage_to_inflict) - exposed_mob.adjustFireLoss(damage_to_inflict) + exposed_mob.adjust_fire_loss(damage_to_inflict) exposed_mob.adjust_fire_stacks((reac_volume / 10)) @@ -2104,7 +2127,7 @@ /datum/reagent/ash name = "Ash" - description = "Supposedly phoenixes rise from these, but you've never seen it." + description = "A fine ash. Supposedly phoenixes rise from these, but you've never seen it." color = "#515151" taste_description = "ash" ph = 6.5 @@ -2462,13 +2485,19 @@ /datum/reagent/romerol/expose_mob(mob/living/carbon/human/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) . = ..() // Silently add the zombie infection organ to be activated upon death - if(exposed_mob.get_organ_slot(ORGAN_SLOT_ZOMBIE)) - return - - if((methods & (PATCH|INGEST|INJECT|INHALE)) || ((methods & (VAPOR|TOUCH)) && prob(min(reac_volume,100)*(1 - touch_protection)))) + if(can_infect(exposed_mob, reac_volume, methods)) var/obj/item/organ/zombie_infection/nodamage/zombie_infection = new() zombie_infection.Insert(exposed_mob) +/datum/reagent/romerol/proc/can_infect(mob/living/carbon/human/exposed_mob, reac_volume = 5, methods = INGEST) + if(exposed_mob.get_organ_slot(ORGAN_SLOT_ZOMBIE)) + return FALSE + if(methods & (PATCH|INGEST|INJECT|INHALE)) + return TRUE + if(reac_volume >= 1) + return TRUE + return FALSE + /datum/reagent/magillitis name = "Magillitis" description = "An experimental serum which causes rapid muscular growth in Hominidae. Side effects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." @@ -2519,7 +2548,7 @@ /datum/reagent/plastic_polymers name = "Plastic Polymers" - description = "the petroleum based components of plastic." + description = "Petroleum based components of plastic." color = "#f7eded" taste_description = "plastic" ph = 6 @@ -2652,8 +2681,8 @@ . = ..() 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.) - if(affected_mob.adjustStaminaLoss(10 * REM * seconds_per_tick, updating_stamina = FALSE)) + if(affected_mob.get_stamina_loss() < (45 - healthcomp)) //At 50 health you would have 200 - 150 health meaning 50 compensation. 60 - 50 = 10, so would only do 10-19 stamina.) + if(affected_mob.adjust_stamina_loss(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...") @@ -2858,7 +2887,7 @@ for(var/thing in affected_mob.all_wounds) var/datum/wound/W = thing 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.adjust_stamina_loss(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) @@ -2874,7 +2903,7 @@ 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) - if(affected_mob.adjustStaminaLoss(-1 * REM * seconds_per_tick, updating_stamina = FALSE)) // the more wounds, the more stamina regen + if(affected_mob.adjust_stamina_loss(-1 * REM * seconds_per_tick, updating_stamina = FALSE)) // the more wounds, the more stamina regen return UPDATE_MOB_HEALTH // unholy water, but for heretics. @@ -2898,19 +2927,23 @@ if(IS_HERETIC_OR_MONSTER(drinker)) drinker.adjust_drowsiness(-10 * REM * seconds_per_tick) drinker.AdjustAllImmobility(-40 * REM * seconds_per_tick) - 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 + need_mob_update += drinker.adjust_stamina_loss(-10 * REM * seconds_per_tick, updating_stamina = FALSE) + need_mob_update += drinker.adjust_tox_loss(-2 * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE) + need_mob_update += drinker.adjust_oxy_loss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjust_brute_loss(-2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjust_fire_loss(-2 * REM * seconds_per_tick, updating_health = FALSE) + drinker.adjust_blood_volume(3 * REM * seconds_per_tick, maximum = BLOOD_VOLUME_NORMAL) + // Slowly regulates your body temp + drinker.adjust_bodytemperature((drinker.get_body_temp_normal() - drinker.bodytemperature) / 5) + for(var/datum/reagent/reagent as anything in drinker.reagents.reagent_list) + if(reagent != src) + drinker.reagents.remove_reagent(reagent.type, 2 * reagent.purge_multiplier * REM * seconds_per_tick) else - 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) + need_mob_update = drinker.adjust_organ_loss(ORGAN_SLOT_BRAIN, 3 * REM * seconds_per_tick, 150) + need_mob_update += drinker.adjust_tox_loss(2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjust_fire_loss(2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjust_oxy_loss(2 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += drinker.adjust_brute_loss(2 * REM * seconds_per_tick, updating_health = FALSE) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -2969,7 +3002,7 @@ /datum/reagent/ants/on_mob_life(mob/living/carbon/victim, seconds_per_tick) . = ..() - victim.adjustBruteLoss(max(0.1, round((ant_ticks * ant_damage),0.1))) //Scales with time. Roughly 32 brute with 100u. + victim.adjust_brute_loss(max(0.1, round((ant_ticks * ant_damage),0.1))) //Scales with time. Roughly 32 brute with 100u. ant_ticks++ if(ant_ticks < 5) // Makes ant food a little more appetizing, since you won't be screaming as much. return @@ -3054,7 +3087,7 @@ /datum/reagent/lead/on_mob_life(mob/living/carbon/victim) . = ..() - if(victim.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5)) + if(victim.adjust_organ_loss(ORGAN_SLOT_BRAIN, 0.5)) return UPDATE_MOB_HEALTH //The main feedstock for kronkaine production, also a shitty stamina healer. @@ -3070,8 +3103,8 @@ /datum/reagent/kronkus_extract/on_mob_life(mob/living/carbon/kronkus_enjoyer, seconds_per_tick) . = ..() var/need_mob_update - need_mob_update = kronkus_enjoyer.adjustOrganLoss(ORGAN_SLOT_HEART, 0.2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) - need_mob_update += kronkus_enjoyer.adjustStaminaLoss(-6, updating_stamina = FALSE) + need_mob_update = kronkus_enjoyer.adjust_organ_loss(ORGAN_SLOT_HEART, 0.2 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + need_mob_update += kronkus_enjoyer.adjust_stamina_loss(-6, updating_stamina = FALSE) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -3084,7 +3117,7 @@ /datum/reagent/brimdust/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustFireLoss((ispodperson(affected_mob) ? -1 : 1 * seconds_per_tick), updating_health = FALSE)) + if(affected_mob.adjust_fire_loss((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) @@ -3140,15 +3173,16 @@ ph = 10 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -//gives 20 seconds of haunting effect for every unit of it that touches an object +//gives 20 seconds of haunting effect for every unit of it that touches an item /datum/reagent/hauntium/expose_obj(obj/exposed_obj, reac_volume, methods=TOUCH, show_message=TRUE) . = ..() if(!isitem(exposed_obj)) return - if(HAS_TRAIT_FROM(exposed_obj, TRAIT_HAUNTED, HAUNTIUM_REAGENT_TRAIT)) + var/obj/item/exposed_item = exposed_obj + if(HAS_TRAIT_FROM(exposed_item, 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), reac_volume * 20 SECONDS) + exposed_item.make_haunted(HAUNTIUM_REAGENT_TRAIT, "#f8f8ff") + addtimer(CALLBACK(exposed_item, TYPE_PROC_REF(/obj/item/, remove_haunted), HAUNTIUM_REAGENT_TRAIT), reac_volume * 20 SECONDS) /datum/reagent/hauntium/on_mob_metabolize(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -3168,7 +3202,7 @@ affected_mob.AdjustParalyzed(-5 SECONDS * REM * seconds_per_tick) affected_mob.AdjustImmobilized(-5 SECONDS * REM * seconds_per_tick) else - if(affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, REM * seconds_per_tick)) //1 heart damage per tick + if(affected_mob.adjust_organ_loss(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")) @@ -3213,8 +3247,7 @@ RegisterSignal(affected_human, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_organ_removed)) var/obj/item/organ/eyes/eyes = affected_human.get_organ_slot(ORGAN_SLOT_EYES) if (eyes && !IS_ROBOTIC_ORGAN(eyes)) - prev_ignore_lighting = eyes.overlay_ignore_lighting - eyes.overlay_ignore_lighting = TRUE + ADD_TRAIT(affected_human, TRAIT_LUMINESCENT_EYES, REF(src)) /datum/reagent/luminescent_fluid/on_mob_end_metabolize(mob/living/affected_mob) . = ..() @@ -3226,7 +3259,7 @@ affected_human.remove_eye_color(EYE_COLOR_LUMINESCENT_PRIORITY) var/obj/item/organ/eyes/eyes = affected_human.get_organ_slot(ORGAN_SLOT_EYES) if (eyes && !IS_ROBOTIC_ORGAN(eyes) && !overdosed) - eyes.overlay_ignore_lighting = prev_ignore_lighting + REMOVE_TRAIT(affected_human, TRAIT_LUMINESCENT_EYES, REF(src)) /datum/reagent/luminescent_fluid/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -3238,21 +3271,20 @@ added_light = TRUE if (SPT_PROB(8, seconds_per_tick)) - if(affected_mob.adjustToxLoss(1, updating_health = FALSE)) + if(affected_mob.adjust_tox_loss(1, updating_health = FALSE)) return UPDATE_MOB_HEALTH /datum/reagent/luminescent_fluid/proc/on_organ_added(mob/living/source, obj/item/organ/eyes/new_eyes) SIGNAL_HANDLER if (istype(new_eyes) && !IS_ROBOTIC_ORGAN(new_eyes)) - prev_ignore_lighting = new_eyes.overlay_ignore_lighting - new_eyes.overlay_ignore_lighting = TRUE + ADD_TRAIT(source, TRAIT_LUMINESCENT_EYES, REF(src)) /datum/reagent/luminescent_fluid/proc/on_organ_removed(mob/living/source, obj/item/organ/eyes/old_eyes) SIGNAL_HANDLER if (istype(old_eyes) && !IS_ROBOTIC_ORGAN(old_eyes) && !overdosed) - old_eyes.overlay_ignore_lighting = prev_ignore_lighting + REMOVE_TRAIT(source, TRAIT_LUMINESCENT_EYES, REF(src)) /datum/reagent/luminescent_fluid/overdose_start(mob/living/affected_mob) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 0d6417175f60..a50b84b8fcaa 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -13,7 +13,7 @@ /datum/reagent/thermite/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustFireLoss(1 * REM * seconds_per_tick, updating_health = FALSE)) + if(affected_mob.adjust_fire_loss(1 * REM * seconds_per_tick, updating_health = FALSE)) return UPDATE_MOB_HEALTH /datum/reagent/nitroglycerin @@ -26,7 +26,7 @@ /datum/reagent/nitroglycerin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, -1 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)) + if(affected_mob.adjust_organ_loss(ORGAN_SLOT_HEART, -1 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)) return UPDATE_MOB_HEALTH /datum/reagent/stabilizing_agent @@ -42,7 +42,7 @@ /datum/reagent/clf3 name = "Chlorine Trifluoride" - description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space." + description = "A very flammable liquid capable of burning even through the hull of the station. Bursts into a fireball upon creation." color = "#FFC8C8" metabolization_rate = 10 * REAGENTS_METABOLISM taste_description = "burning" @@ -52,7 +52,7 @@ /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) - if(affected_mob.adjustFireLoss(0.3 * max(affected_mob.fire_stacks, 1) * REM * seconds_per_tick, updating_health = FALSE)) + if(affected_mob.adjust_fire_loss(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) @@ -168,13 +168,13 @@ exposed_mob.adjust_fire_stacks(1) var/burndmg = max(0.3*exposed_mob.fire_stacks * (1 - touch_protection), 0.3) if(burndmg) - exposed_mob.adjustFireLoss(burndmg, 0) + exposed_mob.adjust_fire_loss(burndmg, 0) 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) - if(metabolizer.adjustFireLoss(0.3 * max(metabolizer.fire_stacks, 0.15) * REM * seconds_per_tick, updating_health = FALSE)) + if(metabolizer.adjust_fire_loss(0.3 * max(metabolizer.fire_stacks, 0.15) * REM * seconds_per_tick, updating_health = FALSE)) return UPDATE_MOB_HEALTH /datum/reagent/napalm @@ -228,12 +228,13 @@ /datum/reagent/cryostylane/on_mob_add(mob/living/affected_mob, amount) . = ..() - affected_mob.mob_surgery_speed_mod = 1-((CRYO_SPEED_PREFACTOR * (1 - creation_purity))+CRYO_SPEED_CONSTANT) //10% - 30% slower + // Between a 1.1x and a 1.5x to surgery time depending on purity + affected_mob.add_surgery_speed_mod(type, 1 + ((CRYO_SPEED_PREFACTOR * (1 - creation_purity)) + CRYO_SPEED_CONSTANT), min(amount * 1 MINUTES, 5 MINUTES)) affected_mob.color = COLOR_CYAN /datum/reagent/cryostylane/on_mob_delete(mob/living/affected_mob) . = ..() - affected_mob.mob_surgery_speed_mod = 1 + affected_mob.remove_surgery_speed_mod(type) affected_mob.color = COLOR_WHITE //Pauses decay! Does do something, I promise. @@ -256,7 +257,7 @@ if(reac_volume < 5) return for(var/mob/living/basic/slime/exposed_slime in exposed_turf) - exposed_slime.adjustToxLoss(rand(15,30)) + exposed_slime.adjust_tox_loss(rand(15,30)) #undef CRYO_SPEED_PREFACTOR #undef CRYO_SPEED_CONSTANT @@ -313,17 +314,19 @@ addtimer(TRAIT_CALLBACK_REMOVE(fish, TRAIT_FISH_ELECTROGENESIS, type), fish.feeding_frequency * 0.75, TIMER_UNIQUE|TIMER_OVERRIDE) return TRUE -/datum/reagent/teslium/on_mob_metabolize(mob/living/carbon/human/affected_mob) +/datum/reagent/teslium/on_mob_metabolize(mob/living/carbon/affected_mob) . = ..() - if(!istype(affected_mob)) + if(!ishuman(affected_mob)) return - affected_mob.physiology.siemens_coeff *= 2 + var/mob/living/carbon/human/affected_human = affected_mob + affected_human.physiology.siemens_coeff *= 2 -/datum/reagent/teslium/on_mob_end_metabolize(mob/living/carbon/human/affected_mob) +/datum/reagent/teslium/on_mob_end_metabolize(mob/living/carbon/affected_mob) . = ..() - if(!istype(affected_mob)) + if(!ishuman(affected_mob)) return - affected_mob.physiology.siemens_coeff *= 0.5 + var/mob/living/carbon/human/affected_human = affected_mob + affected_human.physiology.siemens_coeff *= 0.5 /datum/reagent/teslium/energized_jelly name = "Energized Jelly" @@ -336,7 +339,7 @@ if(!isjellyperson(affected_mob)) //everyone but jellypeople get shocked as normal. return ..() affected_mob.AdjustAllImmobility(-40 *REM * seconds_per_tick) - if(affected_mob.adjustStaminaLoss(-10 * REM * seconds_per_tick, updating_stamina = FALSE)) + if(affected_mob.adjust_stamina_loss(-10 * 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 @@ -362,6 +365,7 @@ else if(istype(foam)) foam.lifetime = initial(foam.lifetime) //reduce object churn a little bit when using smoke by keeping existing foam alive a bit longer + /* // DARKPACK EDIT REMOVAL - TURF_FIRE var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in exposed_turf) if(hotspot && !isspaceturf(exposed_turf) && exposed_turf.air) var/datum/gas_mixture/air = exposed_turf.air @@ -369,6 +373,8 @@ air.temperature = max(air.temperature/2,T20C) air.react(src) qdel(hotspot) + */ + exposed_turf.extinguish_turf() // DARKPACK EDIT ADD /datum/reagent/firefighting_foam/expose_obj(obj/exposed_obj, reac_volume, methods=TOUCH, show_message=TRUE) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/reaction_agents_reagents.dm b/code/modules/reagents/chemistry/reagents/reaction_agents_reagents.dm index 2a7ce91cc8df..d35d503daaa3 100644 --- a/code/modules/reagents/chemistry/reagents/reaction_agents_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/reaction_agents_reagents.dm @@ -144,3 +144,47 @@ holder.update_total() #undef SPEED_REAGENT_STRENGTH + +/datum/reagent/reaction_agent/inversing_buffer + name = "Chiral Inversing Buffer" + description = "This reagent will consume itself and convert impure reagents into their inversed counterparts. Amount varies based on volume of added buffer." + ph = 7 + color = "#b60046" + +/datum/reagent/reaction_agent/inversing_buffer/intercept_reagents_transfer(datum/reagents/target, amount, copy_only) + . = ..() + if(!.) + return + + var/conversion_buffer = amount * 10 //Converts up to 10 units of reagent per 1 unit of inversing buffer. + var/converted = 0 + var/list/cached_reagents = target.reagent_list.Copy() + for(var/datum/reagent/reagent as anything in cached_reagents) + if(!conversion_buffer) + return + if(reagent.purity <= reagent.inverse_chem_val) + //compute volume of reagent to be converted + converted = min(reagent.volume, conversion_buffer) + //remove original reagent from target + reagent.volume -= converted + target.update_total() + //add new inverse reagent to target + target.add_reagent(reagent.inverse_chem, converted, FALSE, added_purity = reagent.get_inverse_purity(reagent.purity)) + //remove from buffer remaining + conversion_buffer -= converted + + //audible feedback + if(conversion_buffer < amount * 10) + target.my_atom.audible_message(span_warning("The beaker goes into a rolling boil as the contents begin inversing!")) + playsound(target.my_atom, 'sound/effects/chemistry/catalyst.ogg', 50, TRUE) + else + target.my_atom.audible_message(span_warning("The buffer fizzles with no effect.")) + + //remove inversening reagent based on total buffer removed + var/volume_to_transfer = amount - (amount * (1 - (conversion_buffer / (amount * 10)))) + if(volume_to_transfer) + target.add_reagent(type, volume_to_transfer, reagtemp = holder.chem_temp, added_purity = purity, added_ph = ph) + if(!copy_only) + volume -= amount + holder.update_total() + diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 7ef27ee33dbc..380a007dff67 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -26,7 +26,7 @@ /datum/reagent/toxin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() if(toxpwr && affected_mob.health > health_required) - if(affected_mob.adjustToxLoss(toxpwr * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(toxpwr * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/toxin/amatoxin @@ -67,7 +67,7 @@ /datum/reagent/toxin/mutagen/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustToxLoss(0.5 * seconds_per_tick * REM, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(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) @@ -193,7 +193,7 @@ /datum/reagent/toxin/lexorin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() 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.adjust_oxy_loss(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)) @@ -225,7 +225,7 @@ . = ..() if(SPT_PROB(5, seconds_per_tick)) to_chat(affected_mob, span_danger("Your insides are burning!")) - if(affected_mob.adjustToxLoss(rand(20, 60), updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(rand(20, 60), updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH else if(SPT_PROB(23, seconds_per_tick)) if(affected_mob.heal_bodypart_damage(5)) @@ -248,7 +248,7 @@ /datum/reagent/toxin/zombiepowder name = "Zombie Powder" - description = "A strong neurotoxin that puts the subject into a death-like state." + description = "A strong neurotoxin that puts the patient into a death-like state." silent_toxin = TRUE creation_purity = REAGENT_STANDARD_PURITY purity = REAGENT_STANDARD_PURITY @@ -280,9 +280,9 @@ /datum/reagent/toxin/zombiepowder/proc/zombify(mob/living/holder_mob) PRIVATE_PROC(TRUE) - holder_mob.adjustOxyLoss(0.5*REM, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + holder_mob.adjust_oxy_loss(0.5*REM, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if((data?["method"] & (INGEST|INHALE)) && holder_mob.stat != DEAD) - holder_mob.fakedeath(type) + holder_mob.apply_status_effect(/datum/status_effect/reagent_effect/fakedeath, type) /datum/reagent/toxin/zombiepowder/on_mob_metabolize(mob/living/holder_mob) . = ..() @@ -290,7 +290,7 @@ /datum/reagent/toxin/zombiepowder/on_mob_end_metabolize(mob/living/affected_mob) . = ..() - affected_mob.cure_fakedeath(type) + affected_mob.remove_status_effect(/datum/status_effect/reagent_effect/fakedeath) /datum/reagent/toxin/zombiepowder/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -303,7 +303,7 @@ affected_mob.adjust_drowsiness(2 SECONDS * REM * seconds_per_tick) affected_mob.adjust_slurring(6 SECONDS * REM * seconds_per_tick) if(6 to 9) - need_mob_update = affected_mob.adjustStaminaLoss(40 * REM * seconds_per_tick, updating_stamina = FALSE) + need_mob_update = affected_mob.adjust_stamina_loss(40 * REM * seconds_per_tick, updating_stamina = FALSE) if(10 to INFINITY) if(affected_mob.stat != DEAD) affected_mob.fakedeath(type) @@ -324,7 +324,7 @@ /datum/reagent/toxin/ghoulpowder/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustOxyLoss(1 * REM * seconds_per_tick, FALSE, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type)) + if(affected_mob.adjust_oxy_loss(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 @@ -399,7 +399,7 @@ 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 - if(exposed_mob.adjustToxLoss(damage * 20, required_biotype = affected_biotype)) + if(exposed_mob.adjust_tox_loss(damage * 20, required_biotype = affected_biotype)) return if(!(methods & VAPOR) || !iscarbon(exposed_mob)) @@ -407,7 +407,7 @@ var/mob/living/carbon/exposed_carbon = exposed_mob if(!exposed_carbon.wear_mask) - exposed_carbon.adjustToxLoss(damage, required_biotype = affected_biotype) + exposed_carbon.adjust_tox_loss(damage, required_biotype = affected_biotype) /datum/reagent/toxin/plantbgone/weedkiller name = "Weed Killer" @@ -435,7 +435,7 @@ /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)) + if(affected_mob.adjust_tox_loss(2 * toxpwr * REM * seconds_per_tick, updating_health = FALSE, required_biotype = MOB_BUG)) return UPDATE_MOB_HEALTH //Pest Spray @@ -521,7 +521,7 @@ affected_mob.Sleeping(40 * REM * normalise_creation_purity() * seconds_per_tick) if(52 to INFINITY) affected_mob.Sleeping(40 * REM * normalise_creation_purity() * seconds_per_tick) - if(affected_mob.adjustToxLoss(1 * (current_cycle - 51) * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(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 @@ -552,7 +552,7 @@ affected_mob.Sleeping(40 * REM * seconds_per_tick) if(52 to INFINITY) affected_mob.Sleeping(40 * REM * seconds_per_tick) - if(affected_mob.adjustToxLoss(1 * (current_cycle - 50) * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(1 * (current_cycle - 50) * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/toxin/coffeepowder @@ -611,7 +611,7 @@ /datum/reagent/toxin/staminatoxin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustStaminaLoss(data * REM * seconds_per_tick, updating_stamina = FALSE)) + if(affected_mob.adjust_stamina_loss(data * REM * seconds_per_tick, updating_stamina = FALSE)) . = UPDATE_MOB_HEALTH data = max(data - 1, 3) @@ -632,7 +632,7 @@ if(SPT_PROB(chance, seconds_per_tick)) // ignore rad protection calculations bc it's inside of us affected_mob.AddComponent(/datum/component/irradiated) else - if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH /datum/reagent/toxin/polonium/expose_obj(obj/exposed_obj, reac_volume, methods=TOUCH, show_message=TRUE) @@ -691,21 +691,22 @@ if(4) if(prob(75)) to_chat(affected_mob, span_danger("You scratch at an itch.")) - if(affected_mob.adjustBruteLoss(2* REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) + if(affected_mob.adjust_brute_loss(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) . = ..() 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) + need_mob_update = affected_mob.adjust_oxy_loss(2 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update += affected_mob.adjust_brute_loss(2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_tox_loss(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" - description = "Formaldehyde, on its own, is a fairly weak toxin. It contains trace amounts of Histamine, very rarely making it decay into Histamine. When used in a dead body, will prevent organ decay." + description = "A fairly weak toxin that helps prevent organ decay in dead bodies. \ + It will slowly decay into Histamine over time." silent_toxin = TRUE color = "#B4004B" metabolization_rate = 0.5 * REAGENTS_METABOLISM @@ -719,7 +720,7 @@ /datum/reagent/toxin/formaldehyde/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) var/obj/item/organ/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. + if(affected_mob.adjust_tox_loss(-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) && !HAS_TRAIT(affected_mob, TRAIT_BLOCK_FORMALDEHYDE_METABOLISM)) @@ -749,7 +750,7 @@ current_size = newsize toxpwr = 0.1 * volume - if(affected_mob.adjustBruteLoss((0.3 * volume) * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) + if(affected_mob.adjust_brute_loss((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 @@ -766,7 +767,7 @@ /datum/reagent/toxin/fentanyl name = "Fentanyl" - description = "Fentanyl will inhibit brain function and cause toxin damage before eventually knocking out its victim." + description = "Inhibits brain function and causes toxin damage before eventually knocking out the patient." color = "#64916E" metabolization_rate = 0.5 * REAGENTS_METABOLISM creation_purity = REAGENT_STANDARD_PURITY @@ -779,9 +780,9 @@ /datum/reagent/toxin/fentanyl/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() var/need_mob_update - need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * normalise_creation_purity() * seconds_per_tick, 150) + need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 3 * REM * normalise_creation_purity() * seconds_per_tick, 150) if(affected_mob.toxloss <= 60) - need_mob_update += affected_mob.adjustToxLoss(1 * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_tox_loss(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) @@ -809,7 +810,7 @@ if(SPT_PROB(4, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel horrendously weak!")) affected_mob.Stun(40) - need_mob_update += affected_mob.adjustToxLoss(2*REM * normalise_creation_purity(), updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_tox_loss(2*REM * normalise_creation_purity(), updating_health = FALSE, required_biotype = affected_biotype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -878,7 +879,7 @@ affected_mob.Paralyze(60) if(2) affected_mob.losebreath += 10 - affected_mob.adjustOxyLoss(rand(5,25), updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + affected_mob.adjust_oxy_loss(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()) @@ -887,7 +888,7 @@ 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 - need_mob_update = affected_mob.adjustOxyLoss(rand(5,25), updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update = affected_mob.adjust_oxy_loss(rand(5,25), updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -923,7 +924,7 @@ . = ..() if(current_cycle > 10) affected_mob.Sleeping(40 * REM * seconds_per_tick) - if(affected_mob.adjustStaminaLoss(10 * REM * seconds_per_tick, updating_stamina = FALSE)) + if(affected_mob.adjust_stamina_loss(10 * REM * seconds_per_tick, updating_stamina = FALSE)) return UPDATE_MOB_HEALTH /datum/reagent/toxin/sulfonal @@ -960,7 +961,7 @@ /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) + affected_mob.adjust_tox_loss(delayed_toxin_damage, required_biotype = affected_biotype) /datum/reagent/toxin/lipolicide name = "Lipolicide" @@ -979,7 +980,7 @@ /datum/reagent/toxin/lipolicide/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() if(affected_mob.nutrition <= NUTRITION_LEVEL_STARVING) - if(affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) + if(affected_mob.adjust_tox_loss(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 @@ -1041,12 +1042,13 @@ . = ..() if(current_cycle > 11) affected_mob.Paralyze(60 * REM * seconds_per_tick) - if(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.adjust_oxy_loss(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" - description = "A powerful anticoagulant. All open cut wounds on the victim will open up and bleed much faster. It directly purges sanguirite, a coagulant." + description = "A powerful anticoagulant. All open cut wounds on the patient will open up and bleed much faster. \ + Counters coagulants like Sanguirite, purging them." silent_toxin = TRUE creation_purity = REAGENT_STANDARD_PURITY purity = REAGENT_STANDARD_PURITY @@ -1064,7 +1066,7 @@ /datum/reagent/toxin/rotatium //Rotatium. Fucks up your rotation and is hilarious name = "Rotatium" - description = "A constantly swirling, oddly colourful fluid. Causes the consumer's sense of direction and hand-eye coordination to become wild." + description = "A constantly swirling, oddly colourful fluid. Causes the patient's sense of direction and hand-eye coordination to become wild." silent_toxin = TRUE creation_purity = REAGENT_STANDARD_PURITY purity = REAGENT_STANDARD_PURITY @@ -1141,10 +1143,10 @@ return reac_volume = round(reac_volume,0.1) if(methods & (INGEST|INHALE)) - exposed_carbon.adjustBruteLoss(min(6*toxpwr, reac_volume * toxpwr), required_bodytype = affected_bodytype) + exposed_carbon.adjust_brute_loss(min(6*toxpwr, reac_volume * toxpwr), required_bodytype = affected_bodytype) return if(methods & INJECT) - exposed_carbon.adjustBruteLoss(1.5 * min(6*toxpwr, reac_volume * toxpwr), required_bodytype = affected_bodytype) + exposed_carbon.adjust_brute_loss(1.5 * min(6*toxpwr, reac_volume * toxpwr), required_bodytype = affected_bodytype) return exposed_carbon.acid_act(acidpwr, reac_volume) @@ -1164,7 +1166,7 @@ /datum/reagent/toxin/acid/fluacid name = "Fluorosulfuric Acid" - description = "Fluorosulfuric acid is an extremely corrosive chemical substance." + description = "An extremely corrosive chemical substance." color = "#5050FF" creation_purity = REAGENT_STANDARD_PURITY purity = REAGENT_STANDARD_PURITY @@ -1181,12 +1183,12 @@ /datum/reagent/toxin/acid/fluacid/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustFireLoss(((current_cycle-1)/15) * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) + if(affected_mob.adjust_fire_loss(((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" - description = "Nitric acid is an extremely corrosive chemical substance that violently reacts with living organic tissue." + description = "An extremely corrosive chemical substance that violently reacts with living organic tissue." color = "#5050FF" creation_purity = REAGENT_STANDARD_PURITY purity = REAGENT_STANDARD_PURITY @@ -1197,7 +1199,7 @@ /datum/reagent/toxin/acid/nitracid/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustFireLoss((volume/10) * REM * normalise_creation_purity() * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)) //here you go nervar + if(affected_mob.adjust_fire_loss((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 @@ -1216,7 +1218,7 @@ return 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)) + if(affected_mob.adjust_tox_loss(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) @@ -1253,7 +1255,7 @@ /datum/reagent/toxin/bonehurtingjuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustStaminaLoss(7.5 * REM * seconds_per_tick, updating_stamina = FALSE)) + if(affected_mob.adjust_stamina_loss(7.5 * REM * seconds_per_tick, updating_stamina = FALSE)) . = UPDATE_MOB_HEALTH if(!SPT_PROB(10, seconds_per_tick)) return @@ -1297,7 +1299,7 @@ /datum/reagent/toxin/bungotoxin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, 3 * REM * seconds_per_tick)) + if(affected_mob.adjust_organ_loss(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 @@ -1322,8 +1324,8 @@ /datum/reagent/toxin/leadacetate/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() 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) + need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_EARS, 1 * REM * seconds_per_tick) + need_mob_update += affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 1 * REM * seconds_per_tick) if(need_mob_update) . = UPDATE_MOB_HEALTH if(SPT_PROB(0.5, seconds_per_tick)) @@ -1374,10 +1376,10 @@ liver_tolerance_multiplier = 0 silent_toxin = TRUE remove_paralysis() - need_mob_update += affected_mob.adjustOxyLoss(-0.7 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - need_mob_update = affected_mob.adjustToxLoss(-0.75 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) - need_mob_update += affected_mob.adjustBruteLoss(-1.2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) - need_mob_update += affected_mob.adjustFireLoss(-1.35 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_oxy_loss(-0.7 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) + need_mob_update = affected_mob.adjust_tox_loss(-0.75 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) + need_mob_update += affected_mob.adjust_brute_loss(-1.2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update += affected_mob.adjust_fire_loss(-1.35 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) return need_mob_update ? UPDATE_MOB_HEALTH : . liver_tolerance_multiplier = initial(liver_tolerance_multiplier) @@ -1397,7 +1399,7 @@ 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) + need_mob_update = affected_mob.adjust_stamina_loss(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 @@ -1405,7 +1407,7 @@ 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) + affected_mob.adjust_stamina_loss(2 * REM * seconds_per_tick, updating_stamina = FALSE) if(SPT_PROB(4, seconds_per_tick)) paralyze_limb(affected_mob) need_mob_update = TRUE @@ -1413,8 +1415,8 @@ 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) - need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.7) + need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 0.5) + need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_LUNGS, 0.7) if(SPT_PROB(40, seconds_per_tick)) affected_mob.losebreath += 2 * REM * seconds_per_tick need_mob_update = TRUE @@ -1422,7 +1424,7 @@ 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) + need_mob_update += affected_mob.adjust_stamina_loss(5 * REM * seconds_per_tick, updating_stamina = FALSE) if(SPT_PROB(8, seconds_per_tick)) paralyze_limb(affected_mob) need_mob_update = TRUE @@ -1430,10 +1432,10 @@ 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) - need_mob_update = affected_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS, 1.4) + need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 1, BRAIN_DAMAGE_DEATH) + need_mob_update = affected_mob.adjust_organ_loss(ORGAN_SLOT_LUNGS, 1.4) 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) + need_mob_update += affected_mob.adjust_stamina_loss(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) diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 01250e80bf00..9cd650d67ffc 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -230,6 +230,7 @@ else spawned_mob = new mob_class(get_turf(holder.my_atom))//Spawn our specific mob_class spawned_mob.faction |= mob_faction + ADD_TRAIT(spawned_mob, TRAIT_SPAWNED_MOB, INNATE_TRAIT) if(prob(50)) for(var/j in 1 to rand(1, 3)) step(spawned_mob, pick(NORTH,SOUTH,EAST,WEST)) @@ -347,8 +348,8 @@ /datum/chemical_reaction/proc/explode_deafen(datum/reagents/holder, datum/equilibrium/equilibrium, power = 3, stun = 20, range = 2) var/location = get_turf(holder.my_atom) playsound(location, 'sound/effects/bang.ogg', 25, TRUE) - for(var/mob/living/carbon/carbon_mob in get_hearers_in_view(range, location)) - carbon_mob.soundbang_act(1, stun, power) + for(var/mob/living/living in get_hearers_in_view(range, location)) + living.soundbang_act(SOUNDBANG_NORMAL, stun, power) //Spews out the inverse of the chems in the beaker of the products/reactants only /datum/chemical_reaction/proc/explode_invert_smoke(datum/reagents/holder, datum/equilibrium/equilibrium, force_range = 0, clear_products = TRUE, clear_reactants = TRUE, accept_impure = TRUE) diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index c9a84809ffca..ad73329cf156 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -26,7 +26,7 @@ rate_up_lim = 12.5 purity_min = 0.5 //100u will natrually just dip under this w/ no buffer reaction_flags = REACTION_HEAT_ARBITARY //Heating up is arbitary because of submechanics of this reaction. - reaction_tags = REACTION_TAG_MODERATE | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DRUG | REACTION_TAG_DANGEROUS + reaction_tags = REACTION_TAG_MODERATE | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DRUG | REACTION_TAG_DANGEROUS | REACTION_TAG_ORGAN //The less pure it is, the faster it heats up. tg please don't hate me for making your meth even more dangerous /datum/chemical_reaction/methamphetamine/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol) @@ -77,8 +77,12 @@ e.start(holder.my_atom) holder.clear_reagents() +///Amount of meth required to make a crystal +#define METH_REQUIRED (10) + /datum/chemical_reaction/meth_crystal //Since the meth is a cooled pharmaceutical solvent, this precipitates it into a solid. - required_reagents = list(/datum/reagent/drug/methamphetamine = 10, /datum/reagent/toxin/acid = 2) + results = list(/datum/reagent/consumable/ethanol = 1) //we don't care what this reagent is. We only need to record its purity + required_reagents = list(/datum/reagent/drug/methamphetamine = METH_REQUIRED, /datum/reagent/toxin/acid = 2) mob_react = FALSE reaction_flags = REACTION_INSTANT reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING @@ -86,36 +90,24 @@ /datum/chemical_reaction/meth_crystal/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) - // Calculate purity ignoring sulfuric acid - var/total_nonacid = 0 - var/meth_amt_in_mix = 0 - for(var/datum/reagent/R in holder.reagent_list) - if(istype(R, /datum/reagent/toxin/acid)) - continue // acid doesn't count against purity - total_nonacid += R.volume - if(istype(R, /datum/reagent/drug/methamphetamine)) - meth_amt_in_mix += R.volume - - var/purity = (total_nonacid > 0) ? (meth_amt_in_mix / total_nonacid) : 0.5 //All this tints the crystal above blue purity. - + var/datum/reagent/consumable/ethanol/dummy_reagent = holder.has_reagent(/datum/reagent/consumable/ethanol) for(var/i in 1 to round(created_volume, CHEMICAL_VOLUME_ROUNDING)) var/obj/item/food/drug/meth_crystal/new_crystal = new(location) new_crystal.pixel_x = rand(-6, 6) new_crystal.pixel_y = rand(-6, 6) + new_crystal.color = gradient("#FAFAFA", "#78C8FA", dummy_reagent.creation_purity) - var/effective_purity = 0 - if(purity > 0.9) - effective_purity = (purity - 0.9) / 0.1 + var/datum/reagents/crystal_reagents = new_crystal.reagents + crystal_reagents.clear_reagents() + crystal_reagents.add_reagent(/datum/reagent/drug/methamphetamine, METH_REQUIRED) + var/imp_amt = METH_REQUIRED * (1 - dummy_reagent.creation_purity) * 0.25 + if(imp_amt > 0) + crystal_reagents.add_reagent(/datum/reagent/consumable/failed_reaction, imp_amt) - new_crystal.color = BlendRGB("#FAFAFA", "#78C8FA", effective_purity) + dummy_reagent.volume = 0 + holder.update_total() - if(new_crystal.reagents) - new_crystal.reagents.clear_reagents() - var/meth_amt = 10 - new_crystal.reagents.add_reagent(/datum/reagent/drug/methamphetamine, meth_amt) - var/imp_amt = round(meth_amt * (1 - purity) * 0.25, 0.1) - if(imp_amt > 0) - new_crystal.reagents.add_reagent(/datum/reagent/consumable/failed_reaction, imp_amt) +#undef METH_REQUIRED /datum/chemical_reaction/bath_salts results = list(/datum/reagent/drug/bath_salts = 7) @@ -168,7 +160,7 @@ required_reagents = list(/datum/reagent/kronkus_extract = 15, /datum/reagent/fuel = 5, /datum/reagent/ammonia = 3) mob_react = FALSE reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING | REACTION_TAG_ACTIVE /datum/chemical_reaction/moon_rock/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) @@ -184,7 +176,7 @@ required_reagents = list(/datum/reagent/silver = 10, /datum/reagent/toxin/cyanide = 10, /datum/reagent/lye = 5) mob_react = FALSE reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING | REACTION_TAG_ACTIVE /datum/chemical_reaction/blastoff_ampoule/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) @@ -197,7 +189,7 @@ required_reagents = list(/datum/reagent/lead = 5, /datum/reagent/consumable/nothing = 5, /datum/reagent/drug/maint/tar = 10) mob_react = FALSE reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING | REACTION_TAG_ACTIVE /datum/chemical_reaction/saturnx_glob/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 40639b2ec30b..567cb57ac617 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -169,7 +169,7 @@ results = list(/datum/reagent/medicine/albuterol = 4, /datum/reagent/medicine/sal_acid = 0.5, /datum/reagent/ammonia = 0.5) required_catalysts = list(/datum/reagent/toxin/acid = 1) required_reagents = list(/datum/reagent/medicine/salbutamol = 5, /datum/reagent/medicine/c2/convermol = 1) - reaction_tags = REACTION_TAG_MODERATE | REACTION_TAG_ORGAN | REACTION_TAG_OTHER + reaction_tags = REACTION_TAG_MODERATE | REACTION_TAG_ORGAN | REACTION_TAG_OTHER | REACTION_TAG_ACTIVE required_temp = 500 optimal_temp = 610 overheat_temp = 980 @@ -181,7 +181,7 @@ results = list(/datum/reagent/medicine/salbutamol = 2, /datum/reagent/ammonia = 1) required_catalysts = list(/datum/reagent/toxin/acid = 1) required_reagents = list(/datum/reagent/medicine/albuterol = 3, /datum/reagent/oxygen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_ORGAN | REACTION_TAG_OTHER + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_ORGAN | REACTION_TAG_OTHER | REACTION_TAG_ACTIVE required_temp = 300 optimal_temp = 500 overheat_temp = 800 @@ -191,7 +191,7 @@ results = list(/datum/reagent/inverse/healing/convermol = 1, /datum/reagent/lithium = 3, /datum/reagent/aluminium = 3, /datum/reagent/bromine = 3) required_catalysts = list(/datum/reagent/toxin/acid/fluacid = 1) required_reagents = list(/datum/reagent/medicine/albuterol = 5) - reaction_tags = REACTION_TAG_MODERATE | REACTION_TAG_ORGAN | REACTION_TAG_OTHER + reaction_tags = REACTION_TAG_MODERATE | REACTION_TAG_ORGAN | REACTION_TAG_OTHER | REACTION_TAG_ACTIVE required_temp = 900 optimal_temp = 920 overheat_temp = 990 @@ -401,7 +401,7 @@ /datum/chemical_reaction/medicine/medsuture required_reagents = list(/datum/reagent/cellulose = 2, /datum/reagent/toxin/formaldehyde = 4, /datum/reagent/medicine/polypyr = 3) //This might be a bit much, reagent cost should be reviewed after implementation. reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE | REACTION_TAG_ACTIVE /datum/chemical_reaction/medicine/medsuture/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) new /obj/item/stack/medical/suture/medicated(get_turf(holder.my_atom), round(created_volume * 4)) @@ -409,7 +409,7 @@ /datum/chemical_reaction/medicine/medmesh required_reagents = list(/datum/reagent/cellulose = 2, /datum/reagent/consumable/aloejuice = 4, /datum/reagent/space_cleaner/sterilizine = 2) reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BURN + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BURN | REACTION_TAG_ACTIVE /datum/chemical_reaction/medicine/medmesh/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) new /obj/item/stack/medical/mesh/advanced(get_turf(holder.my_atom), round(created_volume * 3)) @@ -417,7 +417,7 @@ /datum/chemical_reaction/medicine/poultice required_reagents = list(/datum/reagent/toxin/bungotoxin = 4, /datum/reagent/cellulose = 4, /datum/reagent/consumable/aloejuice = 4 ) reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE | REACTION_TAG_BURN + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE | REACTION_TAG_BURN | REACTION_TAG_ACTIVE /datum/chemical_reaction/medicine/poultice/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) new /obj/item/stack/medical/poultice(get_turf(holder.my_atom), round(created_volume * 3)) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 7ab199a2d015..d590a2ef6719 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -9,6 +9,11 @@ required_reagents = list(/datum/reagent/water = 1, /datum/reagent/silicon = 1, /datum/reagent/oxygen = 1) reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER +/datum/chemical_reaction/lube/superlube + results = list(/datum/reagent/lube/superlube = 3) + required_reagents = list(/datum/reagent/lube = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/consumable/banana = 1) + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER + /datum/chemical_reaction/spraytan results = list(/datum/reagent/spraytan = 2) required_reagents = list(/datum/reagent/consumable/orangejuice = 1, /datum/reagent/fuel/oil = 1) @@ -37,7 +42,7 @@ /datum/chemical_reaction/sodiumchloride 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 + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_FOOD | REACTION_TAG_COMPONENT required_other = TRUE /datum/chemical_reaction/sodiumchloride/pre_reaction_other_checks(datum/reagents/holder) @@ -228,6 +233,7 @@ var/level_min = 1 var/level_max = 2 reaction_flags = REACTION_INSTANT + reaction_tags = REACTION_TAG_ACTIVE /datum/chemical_reaction/mix_virus/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list @@ -381,18 +387,18 @@ optimal_ph_min = 1 // Lets increase our range for this basic chem optimal_ph_max = 12 H_ion_release = -0.02 //handmade is more neutral - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_PLANT + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_PLANT | REACTION_TAG_COMPONENT /datum/chemical_reaction/diethylamine results = list(/datum/reagent/diethylamine = 2) required_reagents = list (/datum/reagent/ammonia = 1, /datum/reagent/consumable/ethanol = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_PLANT + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_PLANT | REACTION_TAG_COMPONENT /datum/chemical_reaction/space_cleaner results = list(/datum/reagent/space_cleaner = 2) required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/water = 1) rate_up_lim = 40 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_COMPONENT /datum/chemical_reaction/plantbgone results = list(/datum/reagent/toxin/plantbgone = 5) @@ -413,14 +419,14 @@ /datum/chemical_reaction/drying_agent results = list(/datum/reagent/drying_agent = 3) required_reagents = list(/datum/reagent/stable_plasma = 2, /datum/reagent/consumable/ethanol = 1, /datum/reagent/sodium = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_COMPONENT //////////////////////////////////// Other goon stuff /////////////////////////////////////////// /datum/chemical_reaction/acetone results = list(/datum/reagent/acetone = 3) required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/fuel = 1, /datum/reagent/oxygen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_COMPONENT /datum/chemical_reaction/carpet results = list(/datum/reagent/carpet = 2) @@ -521,18 +527,18 @@ /datum/chemical_reaction/oil results = list(/datum/reagent/fuel/oil = 3) required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_COMPONENT /datum/chemical_reaction/phenol results = list(/datum/reagent/phenol = 3) required_reagents = list(/datum/reagent/water = 1, /datum/reagent/chlorine = 1, /datum/reagent/fuel/oil = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_COMPONENT /datum/chemical_reaction/ash results = list(/datum/reagent/ash = 1) required_reagents = list(/datum/reagent/fuel/oil = 1) required_temp = 480 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_PLANT + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_PLANT | REACTION_TAG_COMPONENT /datum/chemical_reaction/colorful_reagent results = list(/datum/reagent/colorful_reagent = 5) @@ -580,7 +586,7 @@ // create fish possibles var/list/fish_types = list() - for(var/path in subtypesof(/obj/item/fish)) + for(var/path in valid_subtypesof(/obj/item/fish)) // DARKPACK EDIT CHANGE - FISHING var/obj/item/fish/fake_fish = path if(initial(fake_fish.random_case_rarity) == FISH_RARITY_NOPE) // means they aren't mean to be randomly available continue @@ -638,19 +644,19 @@ /datum/chemical_reaction/electrolysis 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 + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE /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 + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE //salt electrolysis /datum/chemical_reaction/saltelectrolysis results = list(/datum/reagent/chlorine = 2.5, /datum/reagent/sodium = 2.5) required_reagents = list(/datum/reagent/consumable/salt = 5) required_catalysts = list(/datum/reagent/consumable/liquidelectricity = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE /datum/chemical_reaction/saltelectrolysis/enriched required_catalysts = list(/datum/reagent/consumable/liquidelectricity/enriched = 1) @@ -717,18 +723,18 @@ /datum/chemical_reaction/saltpetre results = list(/datum/reagent/saltpetre = 3) required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 3) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_PLANT + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_PLANT | REACTION_TAG_COMPONENT /datum/chemical_reaction/lye results = list(/datum/reagent/lye = 3) required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1) required_temp = 10 //So hercuri still shows life. - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_COMPONENT /datum/chemical_reaction/lye2 results = list(/datum/reagent/lye = 2) required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/water = 1, /datum/reagent/carbon = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_COMPONENT /datum/chemical_reaction/royal_bee_jelly results = list(/datum/reagent/royal_bee_jelly = 5) @@ -896,7 +902,7 @@ purity_min = 0 mix_message = "The solution freezes up into ice!" reaction_flags = REACTION_COMPETITIVE - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_DRINK + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_DRINK | REACTION_TAG_COMPONENT | REACTION_TAG_ACTIVE /datum/chemical_reaction/water results = list(/datum/reagent/water = 0.92)//rough density excahnge @@ -1087,5 +1093,3 @@ glitter.data["colors"] = list("[accumulated_color]" = 100) glitter.color = accumulated_color - - diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index a10a6902ccbf..3e3e7d3e3e99 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -11,7 +11,7 @@ var/strengthdiv = 10 var/modifier = 0 reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EXPLOSIVE | REACTION_TAG_MODERATE | REACTION_TAG_DANGEROUS + reaction_tags = REACTION_TAG_EXPLOSIVE | REACTION_TAG_MODERATE | REACTION_TAG_DANGEROUS | REACTION_TAG_ACTIVE required_temp = 0 //Prevent impromptu RPGs // Only clear mob reagents in special cases var/clear_mob_reagents = FALSE @@ -189,7 +189,7 @@ /datum/chemical_reaction/gunpowder results = list(/datum/reagent/gunpowder = 3) required_reagents = list(/datum/reagent/saltpetre = 1, /datum/reagent/medicine/c2/multiver = 1, /datum/reagent/sulfur = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_CHEMICAL /datum/chemical_reaction/reagent_explosion/gunpowder_explosion required_reagents = list(/datum/reagent/gunpowder = 1) @@ -208,20 +208,27 @@ /datum/chemical_reaction/emp_pulse required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/iron = 1, /datum/reagent/aluminium = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS | REACTION_TAG_ACTIVE /datum/chemical_reaction/emp_pulse/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) //pretending this reaction took two ingredients and not three for its effects + var/turf/turf = get_turf(holder.my_atom) var/two_thirds = created_volume / 1.5 var/location = get_turf(holder.my_atom) + var/lastkey = holder.my_atom.fingerprintslast // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. - empulse(location, round(two_thirds / 12), round(two_thirds / 7), 1) + empulse(location, round(two_thirds / 12), round(two_thirds / 7), 1, emp_source = src) holder.clear_reagents() + if(lastkey) + var/mob/toucher = get_mob_by_key(lastkey) + toucher.log_message("triggered EMP reaction at [AREACOORD(turf)].", LOG_GAME, log_globally = FALSE) + ..() + /datum/chemical_reaction/beesplosion required_reagents = list(/datum/reagent/consumable/honey = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/uranium/radium = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS | REACTION_TAG_ACTIVE /datum/chemical_reaction/beesplosion/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = holder.my_atom.drop_location() @@ -244,7 +251,7 @@ /datum/chemical_reaction/stabilizing_agent results = list(/datum/reagent/stabilizing_agent = 3) required_reagents = list(/datum/reagent/iron = 1, /datum/reagent/oxygen = 1, /datum/reagent/hydrogen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_CHEMICAL | REACTION_TAG_PLANT + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_CHEMICAL | REACTION_TAG_PLANT | REACTION_TAG_COMPONENT /datum/chemical_reaction/clf3 results = list(/datum/reagent/clf3 = 4) @@ -293,7 +300,7 @@ /datum/chemical_reaction/sorium_vortex required_reagents = list(/datum/reagent/sorium = 1) required_temp = 474 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS | REACTION_TAG_ACTIVE /datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/turf/T = get_turf(holder.my_atom) @@ -316,7 +323,7 @@ /datum/chemical_reaction/ldm_vortex required_reagents = list(/datum/reagent/liquid_dark_matter = 1) required_temp = 474 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS | REACTION_TAG_ACTIVE /datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/turf/T = get_turf(holder.my_atom) @@ -349,7 +356,7 @@ /datum/chemical_reaction/flash_powder_flash required_reagents = list(/datum/reagent/flash_powder = 1) required_temp = 374 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS | REACTION_TAG_ACTIVE /datum/chemical_reaction/flash_powder_flash/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) @@ -390,7 +397,7 @@ required_temp = 374 mob_react = FALSE reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS | REACTION_TAG_ACTIVE /datum/chemical_reaction/smoke_powder_smoke/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) @@ -414,19 +421,19 @@ holder.remove_reagent(/datum/reagent/sonic_powder, created_volume * 3) var/location = get_turf(holder.my_atom) playsound(location, 'sound/effects/bang.ogg', 25, TRUE) - for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/3, location)) - C.soundbang_act(1, 100, rand(0, 5)) + for(var/mob/living/living in get_hearers_in_view(created_volume/3, location)) + living.soundbang_act(1, 10 SECONDS, rand(0, 5)) /datum/chemical_reaction/sonic_powder_deafen required_reagents = list(/datum/reagent/sonic_powder = 1) required_temp = 374 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS | REACTION_TAG_ACTIVE /datum/chemical_reaction/sonic_powder_deafen/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) playsound(location, 'sound/effects/bang.ogg', 25, TRUE) - for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) - C.soundbang_act(1, 100, rand(0, 5)) + for(var/mob/living/living in get_hearers_in_view(created_volume/10, location)) + living.soundbang_act(1, 10 SECONDS, rand(0, 5)) /datum/chemical_reaction/phlogiston results = list(/datum/reagent/phlogiston = 3) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 4682faaca8b7..0524f4d62094 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -21,9 +21,9 @@ delete_extract(holder) /datum/chemical_reaction/slime/proc/delete_extract(datum/reagents/holder) - var/obj/item/slime_extract/M = holder.my_atom - if(M.extract_uses <= 0 && !results.len) //if the slime doesn't output chemicals - qdel(M) + var/obj/item/slime_extract/extract = holder.my_atom + if(!isnull(extract) && extract.extract_uses <= 0 && !length(results)) //if the slime doesn't output chemicals + qdel(extract) //Grey /datum/chemical_reaction/slime/slimespawn @@ -65,6 +65,16 @@ required_reagents = list(/datum/reagent/uranium/radium = 1) required_container = /obj/item/slime_extract/green +/datum/chemical_reaction/slime/slimefelinid + results = list(/datum/reagent/mutationtoxin/felinid = 1) + required_reagents = list(/datum/reagent/consumable/milk = 1) + required_container = /obj/item/slime_extract/green + +/datum/chemical_reaction/slime/slimemoth + results = list(/datum/reagent/mutationtoxin/moth = 1) + required_reagents = list(/datum/reagent/cellulose = 1) + required_container = /obj/item/slime_extract/green + //Metal /datum/chemical_reaction/slime/slimemetal required_reagents = list(/datum/reagent/toxin/plasma = 1) @@ -254,7 +264,12 @@ reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME | REACTION_TAG_DANGEROUS /datum/chemical_reaction/slime/slimeoverload/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - empulse(get_turf(holder.my_atom), 3, 5) + var/turf/turf = get_turf(holder.my_atom) + var/lastkey = holder.my_atom.fingerprintslast + empulse(get_turf(holder.my_atom), 3, 5, emp_source = src) + if(lastkey) + var/mob/toucher = get_mob_by_key(lastkey) + toucher.log_message("triggered EMP reaction at [AREACOORD(turf)].", LOG_GAME, log_globally = FALSE) ..() /datum/chemical_reaction/slime/slimecell @@ -394,7 +409,7 @@ required_reagents = list(/datum/reagent/toxin/plasma = 1) /datum/chemical_reaction/slime/slimepotion2/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - new /obj/item/slimepotion/slime/sentience(get_turf(holder.my_atom)) + new /obj/item/slimepotion/sentience(get_turf(holder.my_atom)) ..() /datum/chemical_reaction/slime/renaming @@ -402,7 +417,7 @@ required_reagents = list(/datum/reagent/water = 1) /datum/chemical_reaction/slime/renaming/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - new /obj/item/slimepotion/slime/renaming(holder.my_atom.drop_location()) + new /obj/item/slimepotion/renaming(holder.my_atom.drop_location()) ..() @@ -439,7 +454,7 @@ required_container = /obj/item/slime_extract/bluespace /datum/chemical_reaction/slime/slimeradio/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - new /obj/item/slimepotion/slime/slimeradio(get_turf(holder.my_atom)) + new /obj/item/slimepotion/slimeradio(get_turf(holder.my_atom)) ..() //Cerulean diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm index 256bc31be117..4d920c84c7c3 100644 --- a/code/modules/reagents/chemistry/recipes/toxins.dm +++ b/code/modules/reagents/chemistry/recipes/toxins.dm @@ -177,7 +177,7 @@ rate_up_lim = 10 purity_min = 0.7 reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_PLANT | REACTION_TAG_OTHER + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_PLANT | REACTION_TAG_OTHER | REACTION_TAG_COMPONENT /datum/chemical_reaction/lexorin results = list(/datum/reagent/toxin/lexorin = 3) @@ -204,7 +204,7 @@ required_reagents = list(/datum/reagent/toxin/hot_ice = 1) required_temp = T0C + 30 //Don't burst into flames when you melt thermic_constant = -200//Counter the heat - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_CHEMICAL | REACTION_TAG_TOXIN + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_CHEMICAL | REACTION_TAG_TOXIN | REACTION_TAG_ACTIVE /datum/chemical_reaction/chloralhydrate results = list(/datum/reagent/toxin/chloralhydrate = 1) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 94ec57efd0d6..308ffa980ba4 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -150,6 +150,7 @@ var/punctuation = ismob(target) ? "!" : "." + user.changeNext_move(CLICK_CD_MELEE) user.visible_message( span_danger("[user] splashes the contents of [src] onto [target][punctuation]"), span_danger("You splash the contents of [src] onto [target][punctuation]"), @@ -407,7 +408,8 @@ var/trans = round(reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user), CHEMICAL_VOLUME_ROUNDING) playsound(target.loc, SFX_LIQUID_POUR, 50, TRUE) - to_chat(user, span_notice("You transfer [trans] unit\s of the solution to [target].")) + if(trans) + to_chat(user, span_notice("You transfer [trans] unit\s of the solution to [target].")) SEND_SIGNAL(src, COMSIG_REAGENTS_CUP_TRANSFER_TO, target) target.update_appearance() return ITEM_INTERACT_SUCCESS @@ -427,3 +429,6 @@ SEND_SIGNAL(src, COMSIG_REAGENTS_CUP_TRANSFER_FROM, target) target.update_appearance() return ITEM_INTERACT_SUCCESS + +/obj/item/reagent_containers/is_chem_container() + return is_open_container() && !(item_flags & ABSTRACT) && !(flags_1 & HOLOGRAM_1) diff --git a/code/modules/reagents/reagent_containers/applicator.dm b/code/modules/reagents/reagent_containers/applicator.dm index d832f15d304c..e183e9338e8e 100644 --- a/code/modules/reagents/reagent_containers/applicator.dm +++ b/code/modules/reagents/reagent_containers/applicator.dm @@ -4,7 +4,6 @@ desc = "Report this please." abstract_type = /obj/item/reagent_containers/applicator has_variable_transfer_amount = FALSE - grind_results = list() /// Action string displayed in vis_message var/apply_method = "swallow" /// Does the item get its name changed as volume when its produced @@ -31,6 +30,7 @@ if(!canconsume(target_mob, user)) return ITEM_INTERACT_BLOCKING + user.changeNext_move(CLICK_CD_MELEE) if(target_mob == user) target_mob.visible_message(span_notice("[user] attempts to [apply_method] [src].")) if(self_delay) diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index f013c4c2c837..55664fb1f7fb 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -5,8 +5,9 @@ icon_state = "bloodpack" volume = 200 //fill_icon_thresholds = list(10, 20, 30, 40, 50, 60, 70, 80, 90, 100) DARKPACK EDIT REMOVAL + obj_flags = UNIQUE_RENAME | RENAME_NO_DESC var/blood_type = null - var/labelled = FALSE + var/labeled = FALSE /obj/item/reagent_containers/blood/Initialize(mapload, vol) . = ..() @@ -21,7 +22,7 @@ /obj/item/reagent_containers/blood/update_name(updates) . = ..() - if(!labelled) + if(!labeled) name = "blood pack[blood_type ? " - [blood_type]" : ""]" /obj/item/reagent_containers/blood/random @@ -81,27 +82,7 @@ /obj/item/reagent_containers/blood/universal blood_type = BLOOD_TYPE_UNIVERSAL -/obj/item/reagent_containers/blood/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(!IS_WRITING_UTENSIL(tool)) - return NONE - - if(!user.can_write(tool)) - return ITEM_INTERACT_BLOCKING - - var/custom_label = tgui_input_text(user, "What would you like to label the blood pack?", "Blood Pack", name, max_length = MAX_NAME_LEN) - if(!user.can_perform_action(src)) - return ITEM_INTERACT_BLOCKING - - if(user.get_active_held_item() != tool) - return ITEM_INTERACT_BLOCKING - - if(!custom_label) - labelled = FALSE - update_name() - return ITEM_INTERACT_SUCCESS - - labelled = TRUE - name = "blood pack - [custom_label]" +/obj/item/reagent_containers/blood/nameformat(input, user) playsound(src, SFX_WRITING_PEN, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, SOUND_FALLOFF_EXPONENT + 3, ignore_walls = FALSE) - balloon_alert(user, "new label set") - return ITEM_INTERACT_SUCCESS + labeled = TRUE + return "blood pack[input? " - [input]" : null]" diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index ea94ef96e093..cd2d8e6821ff 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -44,6 +44,7 @@ if(!canconsume(target, user)) return ITEM_INTERACT_BLOCKING + user.changeNext_move(CLICK_CD_MELEE) if(target == user) user.visible_message( span_notice("[user] swallows some of the contents of \the [src]."), @@ -123,11 +124,14 @@ /obj/item/reagent_containers/condiment/sugar/examine(mob/user) . = ..() - var/datum/chemical_reaction/recipe = GLOB.chemical_reactions_list[/datum/chemical_reaction/food/cakebatter] - var/flour_required = recipe.required_reagents[/datum/reagent/consumable/flour] - var/eggyolk_required = recipe.required_reagents[/datum/reagent/consumable/eggyolk] - var/sugar_required = recipe.required_reagents[/datum/reagent/consumable/sugar] - . += span_notice("[flour_required] flour, [eggyolk_required] egg yolk (or soy milk), [sugar_required] sugar makes cake dough. You can make pie dough from it.") + var/datum/chemical_reaction/standard_recipe = GLOB.chemical_reactions_list[/datum/chemical_reaction/food/cakebatter] + var/datum/chemical_reaction/alt_recipe = GLOB.chemical_reactions_list[/datum/chemical_reaction/food/cakebatter/vegan] + var/flour_required = standard_recipe.required_reagents[/datum/reagent/consumable/flour] + var/eggyolk_required = standard_recipe.required_reagents[/datum/reagent/consumable/eggyolk] + var/eggwhite_required = standard_recipe.required_reagents[/datum/reagent/consumable/eggwhite] + var/sugar_required = standard_recipe.required_reagents[/datum/reagent/consumable/sugar] + var/soymilk_required = alt_recipe.required_reagents[/datum/reagent/consumable/soymilk] + . += span_notice("[flour_required] flour, [sugar_required] sugar, and either [eggyolk_required] egg yolk + [eggwhite_required] egg white or [soymilk_required] soy milk yields a cake dough. You can make pie dough from it.") /obj/item/reagent_containers/condiment/saltshaker //Separate from above since it's a small shaker rather then name = "salt shaker" // a large one. @@ -412,6 +416,7 @@ name = "condiment pack" desc = "A small plastic pack with condiments to put on your food." icon_state = "condi_empty" + initial_reagent_flags = parent_type::initial_reagent_flags | NO_SPLASH volume = 10 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(10) diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm index bcc484c25dd6..cc65cb3d9e97 100644 --- a/code/modules/reagents/reagent_containers/cups/_cup.dm +++ b/code/modules/reagents/reagent_containers/cups/_cup.dm @@ -23,10 +23,13 @@ var/reagent_consumption_method = INGEST ///What sound does our consumption play on consuming from the container? var/consumption_sound = 'sound/items/drink.ogg' + ///Whether to allow heating up the contents with a source of flame. + var/heatable = TRUE /obj/item/reagent_containers/cup/Initialize(mapload, vol) . = ..() - AddElement(/datum/element/reagents_item_heatable) + if(heatable) + AddElement(/datum/element/reagents_item_heatable) /obj/item/reagent_containers/cup/examine(mob/user) . = ..() @@ -69,6 +72,7 @@ if(!canconsume(target_mob, user)) return ITEM_INTERACT_BLOCKING + user.changeNext_move(CLICK_CD_MELEE) if(target_mob != user) target_mob.visible_message( span_danger("[user] attempts to feed [target_mob] something from [src]."), @@ -210,6 +214,7 @@ name = "x-large beaker" desc = "An extra-large beaker. Can hold up to 120 units." icon_state = "beakerwhite" + inhand_icon_state = "beaker_white" custom_materials = list(/datum/material/glass=SHEET_MATERIAL_AMOUNT*1.25, /datum/material/plastic=SHEET_MATERIAL_AMOUNT * 1.5) volume = 120 amount_per_transfer_from_this = 10 @@ -220,6 +225,7 @@ name = "metamaterial beaker" desc = "A large beaker. Can hold up to 180 units." icon_state = "beakergold" + inhand_icon_state = "beaker_gold" custom_materials = list(/datum/material/glass=SHEET_MATERIAL_AMOUNT*1.25, /datum/material/plastic=SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/gold=HALF_SHEET_MATERIAL_AMOUNT, /datum/material/titanium=HALF_SHEET_MATERIAL_AMOUNT) volume = 180 amount_per_transfer_from_this = 10 @@ -231,6 +237,7 @@ desc = "A cryostasis beaker that allows for chemical storage without \ reactions. Can hold up to 50 units." icon_state = "beakernoreact" + inhand_icon_state = "beaker_cryo" custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 1.5) initial_reagent_flags = OPENCONTAINER | NO_REACT volume = 50 @@ -242,6 +249,7 @@ and Element Cuban combined with the Compound Pete. Can hold up to \ 300 units." icon_state = "beakerbluespace" + inhand_icon_state = "beaker_bluespace" custom_materials = list(/datum/material/glass =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/plasma =SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/diamond =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT) volume = 300 amount_per_transfer_from_this = 10 @@ -310,7 +318,7 @@ righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' fill_icon_state = "bucket" fill_icon_thresholds = list(50, 90) - custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT * 2) + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 2) w_class = WEIGHT_CLASS_NORMAL amount_per_transfer_from_this = 20 possible_transfer_amounts = list(5,10,15,20,25,30,50,70) @@ -329,6 +337,11 @@ ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET,\ ITEM_SLOT_DEX_STORAGE ) + custom_price = 20 // DARKPACK EDIT ADD - ECONOMY + +/obj/item/reagent_containers/cup/bucket/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) /datum/armor/cup_bucket melee = 10 @@ -339,7 +352,7 @@ name = "wooden bucket" icon_state = "woodbucket" inhand_icon_state = "woodbucket" - custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 3) resistance_flags = FLAMMABLE armor_type = /datum/armor/bucket_wooden @@ -394,6 +407,7 @@ icon = 'icons/obj/medical/chemical.dmi' icon_state = "pestle" force = 7 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) /obj/item/reagent_containers/cup/mortar name = "mortar" @@ -403,7 +417,7 @@ amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50, 100) volume = 100 - custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 3) resistance_flags = FLAMMABLE initial_reagent_flags = OPENCONTAINER var/obj/item/grinded @@ -424,7 +438,7 @@ if(!grinded) to_chat(user, span_warning("There is nothing to grind!")) return ITEM_INTERACT_BLOCKING - if(user.getStaminaLoss() > 50) + if(user.get_stamina_loss() > 50) to_chat(user, span_warning("You are too tired to work!")) return ITEM_INTERACT_BLOCKING var/list/choose_options = list( @@ -437,7 +451,7 @@ to_chat(user, span_notice("You start grinding...")) if(!do_after(user, 2.5 SECONDS, target = src)) return ITEM_INTERACT_BLOCKING - user.adjustStaminaLoss(40) + user.adjust_stamina_loss(40) switch(picked_option) if("Juice") return juice_item(grinded, user) ? ITEM_INTERACT_BLOCKING : ITEM_INTERACT_SUCCESS @@ -451,7 +465,7 @@ if(!tool.blend_requirements(src)) to_chat(user, span_warning("Cannot grind this!")) return ITEM_INTERACT_BLOCKING - if((length(tool.grind_results) || tool.reagents?.total_volume) && user.transferItemToLoc(tool, src)) + if((length(tool.grind_results()) || tool.reagents?.total_volume) && user.transferItemToLoc(tool, src)) grinded = tool return ITEM_INTERACT_SUCCESS return NONE diff --git a/code/modules/reagents/reagent_containers/cups/bottle.dm b/code/modules/reagents/reagent_containers/cups/bottle.dm index f0b79742630c..9557ef3a9f75 100644 --- a/code/modules/reagents/reagent_containers/cups/bottle.dm +++ b/code/modules/reagents/reagent_containers/cups/bottle.dm @@ -7,6 +7,7 @@ fill_icon_state = "bottle" inhand_icon_state = "atoxinbottle" worn_icon_state = "bottle" + obj_flags = UNIQUE_RENAME | RENAME_NO_DESC possible_transfer_amounts = list(5, 10, 15, 25, 50) volume = 50 fill_icon_thresholds = list(0, 1, 20, 40, 60, 80, 100) @@ -260,6 +261,11 @@ desc = "A small bottle of basic buffer." list_reagents = list(/datum/reagent/reaction_agent/basic_buffer = 30) +/obj/item/reagent_containers/cup/bottle/inversing_buffer + name = "Chiral inversing buffer bottle" + desc = "A small bottle of chiral inversing buffer." + list_reagents = list(/datum/reagent/reaction_agent/inversing_buffer = 30) + /obj/item/reagent_containers/cup/bottle/romerol name = "romerol bottle" desc = "A small bottle of Romerol. The REAL zombie powder." @@ -524,26 +530,14 @@ //when you attack the syrup bottle with a container it refills it /obj/item/reagent_containers/cup/bottle/syrup_bottle/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(IS_WRITING_UTENSIL(tool)) - return writing_utensil_act(user, tool) if(is_open_container() && tool.is_refillable()) return refillable_act(user, tool) return ..() -/obj/item/reagent_containers/cup/bottle/syrup_bottle/proc/writing_utensil_act(mob/user, obj/item/tool) - if(!user.can_write(tool)) - return ITEM_INTERACT_BLOCKING - - var/input_name = tgui_input_text(user, "What would you like to label the syrup bottle?", "Syrup Bottle Labelling", max_length = MAX_NAME_LEN) - if(!user.can_perform_action(src)) - return ITEM_INTERACT_BLOCKING - +/obj/item/reagent_containers/cup/bottle/syrup_bottle/nameformat(input, user) playsound(src, SFX_WRITING_PEN, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, SOUND_FALLOFF_EXPONENT + 3, ignore_walls = FALSE) - if(input_name) - name = "[input_name] bottle" - else - name = initial(name) - return ITEM_INTERACT_SUCCESS + return "[input? "[input] " : null]bottle" + /obj/item/reagent_containers/cup/bottle/syrup_bottle/proc/refillable_act(mob/user, obj/item/tool) if(!reagents.total_volume) @@ -554,7 +548,8 @@ return ITEM_INTERACT_BLOCKING var/transfer_amount = round(reagents.trans_to(tool, amount_per_transfer_from_this, transferred_by = user), CHEMICAL_VOLUME_ROUNDING) - balloon_alert(user, "transferred [transfer_amount] unit\s") + if(transfer_amount) + balloon_alert(user, "transferred [transfer_amount] unit\s") flick("syrup_anim",src) tool.update_appearance() update_appearance() diff --git a/code/modules/reagents/reagent_containers/cups/drinks.dm b/code/modules/reagents/reagent_containers/cups/drinks.dm index 1fba00a4bad7..7e7f1a529d8b 100644 --- a/code/modules/reagents/reagent_containers/cups/drinks.dm +++ b/code/modules/reagents/reagent_containers/cups/drinks.dm @@ -18,6 +18,8 @@ . = ..() if(!.) //if the bottle wasn't caught var/mob/thrower = throwingdatum?.get_thrower() + if(!istype(thrower)) + return smash(hit_atom, thrower, throwingdatum) /obj/item/reagent_containers/cup/glass/proc/smash(atom/target, mob/thrower, datum/thrownthing/throwingdatum, break_top = FALSE) @@ -27,11 +29,10 @@ return if(bartender_check(target, thrower) && throwingdatum) return - splash_reagents(target, thrower || throwingdatum?.get_thrower(), allow_closed_splash = TRUE) + splash_reagents(QDELETED(target) ? target.drop_location() : target, thrower || throwingdatum?.get_thrower(), allow_closed_splash = TRUE) var/obj/item/broken_bottle/B = new (loc) B.mimic_broken(src, target, break_top) qdel(src) - target.Bumped(B) /obj/item/reagent_containers/cup/glass/bullet_act(obj/projectile/proj) . = ..() @@ -71,6 +72,10 @@ custom_materials = list(/datum/material/gold=HALF_SHEET_MATERIAL_AMOUNT) volume = 150 +/obj/item/reagent_containers/cup/glass/trophy/gold_cup/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) //closed handles + /obj/item/reagent_containers/cup/glass/trophy/silver_cup name = "silver cup" desc = "Best loser!" @@ -83,6 +88,9 @@ custom_materials = list(/datum/material/silver=SMALL_MATERIAL_AMOUNT*8) volume = 100 +/obj/item/reagent_containers/cup/glass/trophy/silver_cup/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) //closed handle /obj/item/reagent_containers/cup/glass/trophy/bronze_cup name = "bronze cup" @@ -111,6 +119,7 @@ resistance_flags = FREEZE_PROOF isGlass = FALSE drink_type = BREAKFAST + custom_price = 3 // DARKPACK EDIT ADD - ECONOMY /// Is our lid currently removed? var/lid_open = FALSE @@ -120,7 +129,7 @@ list_reagents = null lid_open = TRUE -/* DARKPACK EDIT REMOVAL - Our coffee sprites only have one state +/* // DARKPACK EDIT REMOVAL - Our coffee sprites only have one state /obj/item/reagent_containers/cup/glass/coffee/Initialize(mapload) . = ..() register_context() @@ -169,6 +178,10 @@ base_icon_state = "tea" inhand_icon_state = "coffee" +/obj/item/reagent_containers/cup/glass/mug/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) + /obj/item/reagent_containers/cup/glass/mug/update_icon_state() icon_state = "[base_icon_state][reagents.total_volume ? null : "_empty"]" return ..() @@ -224,7 +237,7 @@ icon_state = "smallbottle" inhand_icon_state = null list_reagents = list(/datum/reagent/water = 49.5, /datum/reagent/fluorine = 0.5)//see desc, don't think about it too hard - custom_materials = list(/datum/material/plastic=HALF_SHEET_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT) volume = 50 amount_per_transfer_from_this = 10 fill_icon_thresholds = list(0, 10, 25, 50, 75, 80, 90) @@ -293,7 +306,7 @@ if(prob(flip_chance)) // landed upright src.visible_message(span_notice("[src] lands upright!")) var/mob/living/thrower = throwingdatum?.get_thrower() - if(thrower) + if(istype(thrower)) thrower.add_mood_event("bottle_flip", /datum/mood_event/bottle_flip) else // landed on its side animate(src, transform = matrix(prob(50)? 90 : -90, MATRIX_ROTATE), time = 3, loop = 0) @@ -309,7 +322,7 @@ /obj/item/reagent_containers/cup/glass/waterbottle/large desc = "A fresh commercial-sized bottle of water." icon_state = "largebottle" - custom_materials = list(/datum/material/plastic=SHEET_MATERIAL_AMOUNT * 1.5) + custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 3) list_reagents = list(/datum/reagent/water = 100) volume = 100 amount_per_transfer_from_this = 10 @@ -342,6 +355,7 @@ possible_transfer_amounts = list(10) volume = 10 isGlass = FALSE + custom_materials = list(/datum/material/paper = HALF_SHEET_MATERIAL_AMOUNT) /obj/item/reagent_containers/cup/glass/sillycup/update_icon_state() icon_state = reagents.total_volume ? "water_cup" : "water_cup_e" @@ -354,6 +368,7 @@ icon_state = "juicebox" volume = 15 drink_type = NONE + custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT) /obj/item/reagent_containers/cup/glass/bottle/juice/smallcarton/Initialize(mapload, vol) . = ..() @@ -367,11 +382,10 @@ /obj/item/reagent_containers/cup/glass/bottle/juice/smallcarton/smash(atom/target, mob/thrower, datum/thrownthing/throwingdatum, break_top) if(bartender_check(target, thrower) && throwingdatum) return - splash_reagents(target, thrower || throwingdatum?.get_thrower(), allow_closed_splash = TRUE) + splash_reagents(QDELETED(target) ? target.drop_location() : target, thrower || throwingdatum?.get_thrower(), allow_closed_splash = TRUE) var/obj/item/broken_bottle/bottle_shard = new(drop_location()) bottle_shard.mimic_broken(src, target) qdel(src) - target.Bumped(bottle_shard) /obj/item/reagent_containers/cup/glass/colocup name = "colo cup" @@ -379,7 +393,7 @@ icon = 'icons/obj/drinks/colo.dmi' icon_state = "colocup" inhand_icon_state = "colocup" - custom_materials = list(/datum/material/plastic =HALF_SHEET_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT) possible_transfer_amounts = list(5, 10, 15, 20) volume = 20 amount_per_transfer_from_this = 5 @@ -397,6 +411,13 @@ if(icon_state == "colocup6") desc = "A cheap, mass produced style of cup, typically used at parties. Woah, this one is in red! What the hell?" +/obj/item/reagent_containers/cup/glass/colocup/lean + name = "lean" + desc = "A cup of that purple drank, the stuff that makes you go WHEEZY BABY." + icon_state = "lean" + list_reagents = list(/datum/reagent/consumable/lean = 20) + random_sprite = FALSE + //////////////////////////drinkingglass and shaker// //Note by Darem: This code handles the mixing of drinks. New drinks go in three places: In Chemistry-Reagents.dm (for the drink // itself), in Chemistry-Recipes.dm (for the reaction that changes the components into the drink), and here (for the drinking glass diff --git a/code/modules/reagents/reagent_containers/cups/glassbottle.dm b/code/modules/reagents/reagent_containers/cups/glassbottle.dm index e534622361d7..872a365c2473 100644 --- a/code/modules/reagents/reagent_containers/cups/glassbottle.dm +++ b/code/modules/reagents/reagent_containers/cups/glassbottle.dm @@ -139,7 +139,6 @@ message_in_a_bottle.forceMove(drop_location()) qdel(src) - target.Bumped(broken) return TRUE /obj/item/reagent_containers/cup/glass/bottle/try_splash(mob/user, atom/target) @@ -152,25 +151,25 @@ return var/head_hitter = user.zone_selected == BODY_ZONE_HEAD && isliving(target) - - // An attack that targets the head of a living mob will attempt to knock them down - if(head_hitter) - var/mob/living/living_target = target - var/knockdown_effectiveness = 0 - if(!HAS_TRAIT(target, TRAIT_HEAD_INJURY_BLOCKED)) - knockdown_effectiveness = bottle_knockdown_duration + ((force / 10) * 1 SECONDS) - living_target.getarmor(BODY_ZONE_HEAD, MELEE) - if(prob(knockdown_effectiveness)) - living_target.Knockdown(min(knockdown_effectiveness, 20 SECONDS)) + if(!QDELETED(target)) + // An attack that targets the head of a living mob will attempt to knock them down + if(head_hitter) + var/mob/living/living_target = target + var/knockdown_effectiveness = 0 + if(!HAS_TRAIT(target, TRAIT_HEAD_INJURY_BLOCKED)) + knockdown_effectiveness = bottle_knockdown_duration + ((force / 10) * 1 SECONDS) - living_target.getarmor(BODY_ZONE_HEAD, MELEE) + if(prob(knockdown_effectiveness)) + living_target.Knockdown(min(knockdown_effectiveness, 20 SECONDS)) // Displays a custom message which follows the attack if(target == user) - target.visible_message( + user.visible_message( span_warning("[user] smashes [src] [head_hitter ? "over [user.p_their()] head" : "against [user.p_them()]selves"]!"), span_warning("You smash [src] [head_hitter ? "over your head" : "against yourself"]!"), ) else - target.visible_message( + user.visible_message( span_warning("[user] smashes [src] [head_hitter ? "over [target]'s head" : "against [target]"]!"), span_warning("[user] smashes [src] [head_hitter ? "over your head" : "against you"]!"), ) @@ -263,20 +262,19 @@ desc = "A carton with the bottom half burst open. Might give you a papercut." else if(prob(33)) - var/obj/item/shard/stab_with = new(to_mimic.drop_location()) - target.Bumped(stab_with) + new /obj/item/shard(to_mimic.drop_location()) playsound(src, SFX_SHATTER, 70, TRUE) name = "broken [to_mimic.name]" to_mimic.transfer_fingerprints_to(src) /obj/item/reagent_containers/cup/glass/bottle/beer - name = "Beer" // DARKPACK EDIT CHANGE + name = "beer" // DARKPACK EDIT CHANGE desc = "Beer." // DARKPACK EDIT CHANGE icon_state = "beer" volume = 30 list_reagents = list(/datum/reagent/consumable/ethanol/beer = 30) drink_type = GRAIN | ALCOHOL - custom_price = 5 // DARKPACK EDIT CHANGE + custom_price = 5 // DARKPACK EDIT CHANGE - ECONOMY /obj/item/reagent_containers/cup/glass/bottle/beer/almost_empty list_reagents = list(/datum/reagent/consumable/ethanol/beer = 1) @@ -476,6 +474,13 @@ ) return "[year] [origin] [type]" +// DARKPACK EDIT ADD START +/obj/item/reagent_containers/cup/glass/bottle/wine/blood + // DARKPACK TODO - I would like this to be a roll without it being dumb. + desc = "There is a thin smear of red on the lid of this bottle..." + list_reagents = list(/datum/reagent/blood = 100) +// DARKPACK EDIT ADD END + /obj/item/reagent_containers/cup/glass/bottle/absinthe name = "Extra-strong absinthe" desc = "A strong alcoholic drink brewed and distributed by" @@ -882,6 +887,7 @@ desc = "A throwing weapon used to ignite things, typically filled with an accelerant. Recommended highly by rioters and revolutionaries. Light and toss." icon_state = "vodkabottle" list_reagents = list() + heatable = FALSE var/active = FALSE var/list/accelerants = list( /datum/reagent/consumable/ethanol, @@ -909,16 +915,21 @@ ..(hit_atom, throwingdatum, do_splash = FALSE) /obj/item/reagent_containers/cup/glass/bottle/molotov/smash(atom/target, mob/thrower, datum/thrownthing/throwingdatum, break_top) - var/firestarter = 0 + var/firestarter = FALSE for(var/datum/reagent/contained_reagent in reagents.reagent_list) for(var/accelerant_type in accelerants) if(istype(contained_reagent, accelerant_type)) - firestarter = 1 + firestarter = TRUE break ..() if(firestarter && active) - target.fire_act() - new /obj/effect/hotspot(get_turf(target)) + if(!QDELETED(target)) + target.fire_act() + // DARKPACK EDIT CHANGE START - TURF_FIRE + var/turf/the_turf = get_turf(target) + the_turf.ignite_turf(30) + new /obj/effect/hotspot(the_turf) + // DARKPACK EDIT CHANGE END /obj/item/reagent_containers/cup/glass/bottle/molotov/item_interaction(mob/living/user, obj/item/item, list/modifiers) if(!item.get_temperature() || active) @@ -1022,6 +1033,7 @@ righthand_file = 'icons/mob/inhands/items/drinks_righthand.dmi' isGlass = FALSE age_restricted = FALSE + custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT * 1.5) /obj/item/reagent_containers/cup/glass/bottle/juice/orangejuice name = "orange juice" diff --git a/code/modules/reagents/reagent_containers/cups/mauna_mug.dm b/code/modules/reagents/reagent_containers/cups/mauna_mug.dm index 569cf815f09f..dcee96829dd3 100644 --- a/code/modules/reagents/reagent_containers/cups/mauna_mug.dm +++ b/code/modules/reagents/reagent_containers/cups/mauna_mug.dm @@ -13,6 +13,7 @@ /obj/item/reagent_containers/cup/maunamug/Initialize(mapload, vol) . = ..() + AddElement(/datum/element/cuffable_item) cell = new /obj/item/stock_parts/power_store/cell(src) /obj/item/reagent_containers/cup/maunamug/get_cell() diff --git a/code/modules/reagents/reagent_containers/cups/soda.dm b/code/modules/reagents/reagent_containers/cups/soda.dm index 7b4bce694bea..a7fd8865cabd 100644 --- a/code/modules/reagents/reagent_containers/cups/soda.dm +++ b/code/modules/reagents/reagent_containers/cups/soda.dm @@ -5,6 +5,8 @@ #define SODA_FIZZINESS_THROWN 15 /// How much fizziness is added to the can of soda by shaking it, in percentage points #define SODA_FIZZINESS_SHAKE 5 +/// At what atmospheric pressure do we burst a soda can? Empirical evidance (one googled experiment video) states that ~67.458 kPa is where a can bursts. +#define SODA_EXPLOSION_PRESSURE 67.458 /obj/item/reagent_containers/cup/soda_cans name = "soda can" @@ -13,7 +15,7 @@ icon_state_preview = "cola" abstract_type = /obj/item/reagent_containers/cup/soda_cans initial_reagent_flags = NONE - custom_price = PAYCHECK_CREW * 0.9 + custom_price = 1 // DARKPACK EDIT CHANGE - ECONOMY obj_flags = CAN_BE_HIT possible_transfer_amounts = list(5, 10, 15, 25, 30) volume = 30 @@ -24,6 +26,7 @@ /obj/item/reagent_containers/cup/soda_cans/Initialize(mapload, vol) . = ..() AddElement(/datum/element/slapcrafting, string_list(list(/datum/crafting_recipe/improv_explosive))) + AddElement(/datum/element/atmos_sensitive, mapload) //Enables soda cans to explode in vaccuum. /obj/item/reagent_containers/cup/soda_cans/random/Initialize(mapload) ..() @@ -170,8 +173,16 @@ . += span_notice("You examine [src] closer, and note the following...") . += "\t[span_warning("You get a menacing aura of fizziness from it...")]" +/obj/item/reagent_containers/cup/soda_cans/should_atmos_process(datum/gas_mixture/air, exposed_temperature) + return ((air.return_pressure() <= SODA_EXPLOSION_PRESSURE) && !(reagents.flags & OPENCONTAINER)) + +/obj/item/reagent_containers/cup/soda_cans/atmos_expose(datum/gas_mixture/air, exposed_temperature) + if(reagents.total_volume && !(reagents.flags & OPENCONTAINER)) + burst_soda(loc) + #undef SODA_FIZZINESS_THROWN #undef SODA_FIZZINESS_SHAKE +#undef SODA_EXPLOSION_PRESSURE /obj/item/reagent_containers/cup/soda_cans/cola name = "Cola" // DARKPACK EDIT CHANGE diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index cfb72af61867..6702fcf4fe66 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -10,6 +10,7 @@ volume = 5 initial_reagent_flags = TRANSPARENT custom_price = PAYCHECK_CREW + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT) /obj/item/reagent_containers/dropper/interact_with_atom(atom/target, mob/living/user, list/modifiers) if(!target.reagents) @@ -28,9 +29,9 @@ var/fraction = min(amount_per_transfer_from_this / reagents.total_volume, 1) if(ismob(target)) + user.changeNext_move(CLICK_CD_MELEE) if(ishuman(target)) var/mob/living/carbon/human/victim = target - var/obj/item/safe_thing = victim.is_eyes_covered() if(safe_thing) @@ -45,20 +46,23 @@ to_chat(user, span_notice("You transfer [trans] unit\s of the solution.")) update_appearance() return ITEM_INTERACT_BLOCKING + else if(isalien(target)) //hiss-hiss has no eyes! to_chat(target, span_danger("[target] does not seem to have any eyes!")) return ITEM_INTERACT_BLOCKING - target.visible_message(span_danger("[user] squirts something into [target]'s eyes!"), \ - span_userdanger("[user] squirts something into your eyes!")) - + target.visible_message( + span_danger("[user] squirts something into [target]'s eyes!"), + span_userdanger("[user] squirts something into your eyes!"), + ) SEND_SIGNAL(target, COMSIG_MOB_REAGENTS_DROPPED_INTO_EYES, user, src, reagents, fraction) reagents.expose(target, TOUCH, fraction) var/mob/M = target log_combat(user, M, "squirted", reagents.get_reagent_log_string()) trans = round(reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user), CHEMICAL_VOLUME_ROUNDING) - to_chat(user, span_notice("You transfer [trans] unit\s of the solution.")) + if(trans) + to_chat(user, span_notice("You transfer [trans] unit\s of the solution.")) update_appearance() target.update_appearance() return ITEM_INTERACT_SUCCESS @@ -72,8 +76,8 @@ return ITEM_INTERACT_BLOCKING var/trans = round(target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user), CHEMICAL_VOLUME_ROUNDING) - - to_chat(user, span_notice("You fill [src] with [trans] unit\s of the solution.")) + if(trans) + to_chat(user, span_notice("You fill [src] with [trans] unit\s of the solution.")) update_appearance() target.update_appearance() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 1b1593d6c494..1b14721c9fbd 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -11,7 +11,7 @@ volume = 30 possible_transfer_amounts = list(5) resistance_flags = ACID_PROOF - initial_reagent_flags = OPENCONTAINER + initial_reagent_flags = OPENCONTAINER | NO_SPLASH slot_flags = ITEM_SLOT_BELT var/ignore_flags = NONE var/infinite = FALSE @@ -42,6 +42,7 @@ injected += injected_reagent.name var/contained = english_list(injected) log_combat(user, affected_mob, "attempted to inject", src, "([contained])") + user.changeNext_move(CLICK_CD_MELEE) if(!used_up && (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!")) diff --git a/code/modules/reagents/reagent_containers/inhaler.dm b/code/modules/reagents/reagent_containers/inhaler.dm index 2af15aadf448..181a7e1d6e1c 100644 --- a/code/modules/reagents/reagent_containers/inhaler.dm +++ b/code/modules/reagents/reagent_containers/inhaler.dm @@ -74,7 +74,7 @@ var/mob/living/target_mob = interacting_with if (!can_puff(target_mob, user)) - return NONE + return ITEM_INTERACT_BLOCKING var/puff_timer = 0 @@ -110,10 +110,10 @@ to_chat(user, pre_use_self_message) if (pre_use_target_message) to_chat(target_mob, pre_use_target_message) - if (!do_after(user, puff_timer, src)) - return NONE + if (!do_after(user, puff_timer, target_mob)) + return ITEM_INTERACT_BLOCKING if (!can_puff(target_mob, user)) // sanity - return NONE + return ITEM_INTERACT_BLOCKING user.visible_message(post_use_visible_message, ignored_mobs = list(user, target_mob)) to_chat(user, post_use_self_message) @@ -121,6 +121,7 @@ to_chat(target_mob, post_use_target_message) canister.puff(user, target_mob) + return ITEM_INTERACT_SUCCESS /obj/item/inhaler/attack_self(mob/user, modifiers) try_remove_canister(user, modifiers) @@ -216,7 +217,7 @@ icon = 'icons/obj/medical/chemical.dmi' icon_state = "canister_generic" - initial_reagent_flags = SEALED_CONTAINER|DRAINABLE|REFILLABLE + initial_reagent_flags = SEALED_CONTAINER | DRAINABLE | REFILLABLE | NO_SPLASH has_variable_transfer_amount = FALSE max_integrity = 60 diff --git a/code/modules/reagents/reagent_containers/jerrycan.dm b/code/modules/reagents/reagent_containers/jerrycan.dm index 05f3149ae545..2d8ff2583402 100644 --- a/code/modules/reagents/reagent_containers/jerrycan.dm +++ b/code/modules/reagents/reagent_containers/jerrycan.dm @@ -67,6 +67,11 @@ ///You can use this var to tone down the strength of the highlight for less shiny types of plastic. var/highlight_strenght = 1.0 +/obj/item/reagent_containers/cup/jerrycan/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) + update_appearance() + /obj/item/reagent_containers/cup/jerrycan/update_overlays() . = ..() @@ -91,10 +96,6 @@ if(cap_type) . += mutable_appearance(icon_file, "[base_icon_state]_cap_[cap_type]") -/obj/item/reagent_containers/cup/jerrycan/Initialize(mapload) - . = ..() - update_appearance() - /obj/item/reagent_containers/cup/jerrycan/opaque fill_icon_thresholds = null initial_reagent_flags = parent_type::initial_reagent_flags & ~TRANSPARENT diff --git a/code/modules/reagents/reagent_containers/medigel.dm b/code/modules/reagents/reagent_containers/medigel.dm index f459a08211b0..d88a427277cb 100644 --- a/code/modules/reagents/reagent_containers/medigel.dm +++ b/code/modules/reagents/reagent_containers/medigel.dm @@ -1,3 +1,31 @@ +// Gel skins +/datum/atom_skin/med_gel + abstract_type = /datum/atom_skin/med_gel + +/datum/atom_skin/med_gel/blue + preview_name = "Blue" + new_icon_state = "medigel_blue" + +/datum/atom_skin/med_gel/cyan + preview_name = "Cyan" + new_icon_state = "medigel_cyan" + +/datum/atom_skin/med_gel/green + preview_name = "Green" + new_icon_state = "medigel_green" + +/datum/atom_skin/med_gel/red + preview_name = "Red" + new_icon_state = "medigel_red" + +/datum/atom_skin/med_gel/orange + preview_name = "Orange" + new_icon_state = "medigel_orange" + +/datum/atom_skin/med_gel/purple + preview_name = "Purple" + new_icon_state = "medigel_purple" + /obj/item/reagent_containers/medigel name = "medical gel" desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap." @@ -9,7 +37,7 @@ righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' item_flags = NOBLUDGEON obj_flags = UNIQUE_RENAME - initial_reagent_flags = OPENCONTAINER + initial_reagent_flags = OPENCONTAINER | NO_SPLASH slot_flags = ITEM_SLOT_BELT throwforce = 0 w_class = WEIGHT_CLASS_SMALL @@ -23,15 +51,11 @@ var/apply_method = "spray" //the thick gel is sprayed and then dries into patch like film. var/self_delay = 30 custom_price = PAYCHECK_CREW * 2 - unique_reskin = list( - "Blue" = "medigel_blue", - "Cyan" = "medigel_cyan", - "Green" = "medigel_green", - "Red" = "medigel_red", - "Orange" = "medigel_orange", - "Purple" = "medigel_purple" - ) +/obj/item/reagent_containers/medigel/Initialize(mapload) + . = ..() + if(icon_state == "medigel") // oh yeah baby raw icon state check to make sure we can't reskin preset gels + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/med_gel) /obj/item/reagent_containers/medigel/mode_change_message(mob/user) var/squirt_mode = amount_per_transfer_from_this == initial(amount_per_transfer_from_this) @@ -44,6 +68,7 @@ to_chat(user, span_warning("[src] is empty!")) return ITEM_INTERACT_BLOCKING + user.changeNext_move(CLICK_CD_MELEE) if(interacting_with == user) interacting_with.visible_message(span_notice("[user] attempts to [apply_method] [src] on [user.p_them()]self.")) if(self_delay) @@ -77,21 +102,18 @@ name = "medical gel (libital)" desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains libital, for treating cuts and bruises. Libital does minor liver damage. Diluted with granibitaluri." icon_state = "brutegel" - current_skin = "brutegel" list_reagents = list(/datum/reagent/medicine/c2/libital = 24, /datum/reagent/medicine/granibitaluri = 36) /obj/item/reagent_containers/medigel/aiuri name = "medical gel (aiuri)" desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains aiuri, useful for treating burns. Aiuri does minor eye damage. Diluted with granibitaluri." icon_state = "burngel" - current_skin = "burngel" list_reagents = list(/datum/reagent/medicine/c2/aiuri = 24, /datum/reagent/medicine/granibitaluri = 36) /obj/item/reagent_containers/medigel/synthflesh name = "medical gel (synthflesh)" desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains synthflesh, a slightly toxic medicine capable of healing bruises, burns, and husks." icon_state = "synthgel" - current_skin = "synthgel" list_reagents = list(/datum/reagent/medicine/c2/synthflesh = 60) list_reagents_purity = 1 amount_per_transfer_from_this = 60 @@ -106,7 +128,7 @@ /obj/item/reagent_containers/medigel/synthflesh/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(iscarbon(interacting_with) && reagents?.total_volume) var/mob/living/carbon/carbies = interacting_with - if(HAS_TRAIT_FROM(carbies, TRAIT_HUSK, BURN) && carbies.getFireLoss() > UNHUSK_DAMAGE_THRESHOLD * 2.5) + if(HAS_TRAIT_FROM(carbies, TRAIT_HUSK, BURN) && carbies.get_fire_loss() > UNHUSK_DAMAGE_THRESHOLD * 2.5) // give them a warning if the mob is a husk but synthflesh won't unhusk yet carbies.visible_message(span_boldwarning("[carbies]'s burns need to be repaired first before synthflesh will unhusk it!")) @@ -116,6 +138,5 @@ name = "sterilizer gel" desc = "gel bottle loaded with non-toxic sterilizer. Useful in preparation for surgery." icon_state = "medigel_blue" - current_skin = "medigel_blue" list_reagents = list(/datum/reagent/space_cleaner/sterilizine = 60) custom_price = PAYCHECK_CREW * 2 diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm index b293a527e731..e30529bcd571 100644 --- a/code/modules/reagents/reagent_containers/patch.dm +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -208,7 +208,7 @@ return // Check mob damage for synthflesh unhusking var/mob/living/carbon/carbies = eater - if(HAS_TRAIT_FROM(carbies, TRAIT_HUSK, BURN) && carbies.getFireLoss() > UNHUSK_DAMAGE_THRESHOLD * 2.5) + if(HAS_TRAIT_FROM(carbies, TRAIT_HUSK, BURN) && carbies.get_fire_loss() > UNHUSK_DAMAGE_THRESHOLD * 2.5) // give them a warning if the mob is a husk but synthflesh won't unhusk yet carbies.visible_message(span_boldwarning("[carbies]'s burns need to be repaired first before synthflesh will unhusk it!")) diff --git a/code/modules/reagents/reagent_containers/rag.dm b/code/modules/reagents/reagent_containers/rag.dm index 70aa4c23b79a..2f334f9b2faa 100644 --- a/code/modules/reagents/reagent_containers/rag.dm +++ b/code/modules/reagents/reagent_containers/rag.dm @@ -10,6 +10,7 @@ var/blood_level = 0 /// How many times has this rag been wrung out since last clean? var/wrings = 0 + custom_price = 5 // DARKPACK EDIT ADD - ECONOMY /obj/item/rag/Initialize(mapload) . = ..() @@ -177,7 +178,7 @@ amount_to_remove = how_dirty * 1.2 for(var/datum/reagent/other_reagent as anything in reagents.reagent_list) if((other_reagent.chemical_flags & REAGENT_CLEANS) && other_reagent.volume >= amount_to_remove) - reagents.remove_reagent(other_reagent, amount_to_remove) + reagents.remove_reagent(other_reagent.type, amount_to_remove) return TRUE return FALSE diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 51ae159de141..a80921768189 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -8,7 +8,7 @@ lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' item_flags = NOBLUDGEON - initial_reagent_flags = OPENCONTAINER + initial_reagent_flags = OPENCONTAINER | NO_SPLASH slot_flags = ITEM_SLOT_BELT throwforce = 0 w_class = WEIGHT_CLASS_SMALL @@ -217,6 +217,7 @@ list_reagents = list(/datum/reagent/consumable/condensedcapsaicin = 50) pickup_sound = 'sound/items/handling/pepper_spray/pepper_spray_pick_up.ogg' drop_sound = 'sound/items/handling/pepper_spray/pepper_spray_drop.ogg' + custom_price = 200 // DARKPACK EDIT ADD - ECONOMY /obj/item/reagent_containers/spray/pepper/empty //for protolathe printing list_reagents = null @@ -225,12 +226,6 @@ user.visible_message(span_suicide("[user] begins huffing \the [src]! It looks like [user.p_theyre()] getting a dirty high!")) return OXYLOSS -// Fix pepperspraying yourself -/obj/item/reagent_containers/spray/pepper/try_spray(atom/target, mob/user) - if (target.loc == user) - return FALSE - return ..() - //water flower /obj/item/reagent_containers/spray/waterflower name = "water flower" @@ -314,11 +309,6 @@ amount_per_transfer_from_this = 10 volume = 600 -/obj/item/reagent_containers/spray/chemsprayer/try_spray(atom/target, mob/user) - if (target.loc == user) - return FALSE - return ..() - /obj/item/reagent_containers/spray/chemsprayer/spray(atom/A, mob/user) var/direction = get_dir(src, A) var/turf/T = get_turf(A) @@ -420,6 +410,23 @@ . = ..() icon_state = pick("sprayer_sus_1", "sprayer_sus_2", "sprayer_sus_3", "sprayer_sus_4", "sprayer_sus_5","sprayer_sus_6", "sprayer_sus_7", "sprayer_sus_8") +// Spray bottle skins +/datum/atom_skin/med_spray + abstract_type = /datum/atom_skin/med_spray + change_inhand_icon_state = TRUE + +/datum/atom_skin/med_spray/red + preview_name = "Red" + new_icon_state = "sprayer_med_red" + +/datum/atom_skin/med_spray/yellow + preview_name = "Yellow" + new_icon_state = "sprayer_med_yellow" + +/datum/atom_skin/med_spray/blue + preview_name = "Blue" + new_icon_state = "sprayer_med_blue" + /obj/item/reagent_containers/spray/medical name = "medical spray bottle" icon = 'icons/obj/medical/chemical.dmi' @@ -428,20 +435,10 @@ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' volume = 100 - unique_reskin = list("Red" = "sprayer_med_red", - "Yellow" = "sprayer_med_yellow", - "Blue" = "sprayer_med_blue") - -/obj/item/reagent_containers/spray/medical/reskin_obj(mob/M) - ..() - switch(icon_state) - if("sprayer_med_red") - inhand_icon_state = "sprayer_med_red" - if("sprayer_med_yellow") - inhand_icon_state = "sprayer_med_yellow" - if("sprayer_med_blue") - inhand_icon_state = "sprayer_med_blue" - M.update_held_items() + +/obj/item/reagent_containers/spray/medical/Initialize(mapload, vol) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/med_spray) /obj/item/reagent_containers/spray/hercuri name = "medical spray (hercuri)" diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index a016a0805a47..e32b60e9a2b4 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -137,8 +137,8 @@ return ITEM_INTERACT_BLOCKING 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.")) + if(trans) + to_chat(user, span_notice("You fill [src] with [trans] units of the solution. It now contains [reagents.total_volume] units.")) target.update_appearance() return ITEM_INTERACT_SUCCESS @@ -352,6 +352,7 @@ dart_insert_casing_icon_state = "overlay_syringe_crude" dart_insert_projectile_icon_state = "overlay_syringe_crude_proj" embed_type = /datum/embedding/syringe/crude + custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 5) /datum/embedding/syringe/crude embed_chance = 75 diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index ead695ae06b6..60af82540d22 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -353,7 +353,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/reagent_dispensers/wall/peppertank, 3 . = ..() if(prob(1)) desc = "IT'S PEPPER TIME, BITCH!" - find_and_hang_on_wall() + if(mapload) + find_and_mount_on_atom() /obj/structure/reagent_dispensers/water_cooler name = "water cooler" @@ -363,6 +364,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/reagent_dispensers/wall/peppertank, 3 tank_volume = 200 can_be_tanked = FALSE max_integrity = 150 + custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 25) ///Paper cups left from the cooler. var/paper_cups = 25 ///Reference to our jug. @@ -611,7 +613,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/reagent_dispensers/wall/virusfood, 30 /obj/structure/reagent_dispensers/wall/virusfood/Initialize(mapload) . = ..() - find_and_hang_on_wall() + if(mapload) + find_and_mount_on_atom() /obj/structure/reagent_dispensers/cooking_oil name = "vat of cooking oil" @@ -650,7 +653,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/reagent_dispensers/wall/virusfood, 30 /obj/structure/reagent_dispensers/plumbed/storage/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) /obj/structure/reagent_dispensers/plumbed/storage/update_overlays() diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index 91cfb1c19f49..d050b9745735 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -63,6 +63,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON = PROC_REF(conveyable_enter) ) AddElement(/datum/element/connect_loc, loc_connections) + AddElement(/datum/element/force_move_pulled) update_move_direction() LAZYADD(GLOB.conveyors_by_id[id], src) if(wire_mode) @@ -362,14 +363,6 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - -// attack with hand, move pulled object onto conveyor -/obj/machinery/conveyor/attack_hand(mob/user, list/modifiers) - . = ..() - if(.) - return - user.Move_Pulled(src) - /obj/machinery/conveyor/powered(chan = power_channel, ignore_use_power = FALSE) if(!wire_mode) return ..() @@ -447,9 +440,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) update_appearance() LAZYADD(GLOB.conveyors_by_id[id], src) set_wires(new /datum/wires/conveyor(src)) - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/conveyor_switch, - )) + AddComponent(/datum/component/usb_port, typecacheof(list(/obj/item/circuit_component/conveyor_switch), only_root_path = TRUE)) register_context() /obj/machinery/conveyor_switch/Destroy() diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 050ebad7e9bc..4dc1fd1bdb97 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -74,6 +74,9 @@ GLOBAL_VAR_INIT(disposals_animals_spawned, 0) return INITIALIZE_HINT_LATELOAD //we need turfs to have air +/obj/machinery/disposal/AllowDrop() + return TRUE + /// Checks if there a connecting trunk diposal pipe under the disposal /obj/machinery/disposal/proc/trunk_check() var/obj/structure/disposalpipe/trunk/found_trunk = locate() in loc @@ -172,6 +175,7 @@ GLOBAL_VAR_INIT(disposals_animals_spawned, 0) var/rat_cap = CONFIG_GET(number/ratcap) if (LAZYLEN(SSmobs.cheeserats) < rat_cap && prob(33)) var/mob/living/basic/mouse/new_subject = new(king.drop_location()) + ADD_TRAIT(new_subject, TRAIT_SPAWNED_MOB, INNATE_TRAIT) playsound(new_subject, 'sound/mobs/non-humanoids/mouse/mousesqueek.ogg', 100) visible_message(span_warning("[new_subject] climbs out of [src]!")) @@ -362,6 +366,8 @@ GLOBAL_VAR_INIT(disposals_animals_spawned, 0) to_dump.pixel_x = to_dump.base_pixel_x + rand(-5, 5) to_dump.pixel_y = to_dump.base_pixel_y + rand(-5, 5) + update_appearance() + /obj/machinery/disposal/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) . = ..() visible_message(span_warning("[src] is ripped free from the floor!")) @@ -560,7 +566,7 @@ GLOBAL_VAR_INIT(disposals_animals_spawned, 0) /obj/machinery/disposal/bin/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(isitem(AM) && AM.CanEnterDisposals()) var/mob/thrower = throwingdatum?.get_thrower() - if((thrower && HAS_TRAIT(thrower, TRAIT_THROWINGARM)) || prob(75)) + if((istype(thrower) && HAS_TRAIT(thrower, TRAIT_THROWINGARM)) || prob(75)) AM.forceMove(src) visible_message(span_notice("[AM] lands in [src].")) update_appearance() diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index 8e0f4dad6f40..a36d785cf09c 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -33,12 +33,14 @@ pipename = initial(pipe_type.name) - AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) + AddElement(/datum/element/simple_rotation) AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) + // this only gets used by pipes created by RPDs or pipe dispensers if(flip) - var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation) - rotcomp.rotate(usr, ROTATION_FLIP) // this only gets used by pipes created by RPDs or pipe dispensers + // Simulate two right clicks to flip this thing upside down + usr.base_click_alt_secondary(src) + usr.base_click_alt_secondary(src) update_appearance(UPDATE_ICON) @@ -86,7 +88,7 @@ dpdir |= REVERSE_DIR(dir) return dpdir -/obj/structure/disposalconstruct/proc/post_rotation(mob/user, degrees) +/obj/structure/disposalconstruct/post_rotation(mob/user, degrees) if(degrees == ROTATION_FLIP) var/obj/structure/disposalpipe/temp = pipe_type if(initial(temp.flip_type)) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index d75e5c70240e..696134e78931 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -1,6 +1,7 @@ /obj/item/delivery icon = 'icons/obj/storage/wrapping.dmi' inhand_icon_state = "deliverypackage" + obj_flags = UNIQUE_RENAME | RENAME_NO_DESC var/giftwrapped = 0 var/sort_tag = 0 var/obj/item/paper/note @@ -113,18 +114,6 @@ sort_tag = dest_tagger.currTag playsound(loc, 'sound/machines/beep/twobeep_high.ogg', 100, TRUE) update_appearance() - else if(IS_WRITING_UTENSIL(item)) - if(!user.can_write(item)) - return - var/str = tgui_input_text(user, "Label text?", "Set label", max_length = MAX_NAME_LEN) - if(!user.can_perform_action(src)) - return - if(!str || !length(str)) - to_chat(user, span_warning("Invalid text!")) - return - playsound(src, SFX_WRITING_PEN, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, SOUND_FALLOFF_EXPONENT + 3, ignore_walls = FALSE) - user.visible_message(span_notice("[user] labels [src] as [str].")) - name = "[name] ([str])" else if(istype(item, /obj/item/stack/wrapping_paper) && !giftwrapped) var/obj/item/stack/wrapping_paper/wrapping_paper = item @@ -205,6 +194,10 @@ else return ..() +/obj/item/delivery/nameformat(input, user) + playsound(src, SFX_WRITING_PEN, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, SOUND_FALLOFF_EXPONENT + 3, ignore_walls = FALSE) + return "[name] ([input])" // This just repeatedly adds new labels, but i think that's intentional? + /** * # Wrapped up crates and lockers - too big to carry. */ @@ -270,6 +263,9 @@ righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP /obj/item/dest_tagger/borg name = "cyborg destination tagger" diff --git a/code/modules/religion/burdened/psyker.dm b/code/modules/religion/burdened/psyker.dm index 6d10524ccba0..cd9fc647a162 100644 --- a/code/modules/religion/burdened/psyker.dm +++ b/code/modules/religion/burdened/psyker.dm @@ -8,6 +8,7 @@ /datum/action/cooldown/spell/forcewall/psychic_wall, ) w_class = WEIGHT_CLASS_NORMAL + shade_color = "blue" var/does_it_blind = FALSE variant_traits_added = list(TRAIT_ANTIMAGIC_NO_SELFBLOCK) @@ -70,7 +71,7 @@ if(stat == DEAD || !old_head || !old_brain) return FALSE var/obj/item/bodypart/head/psyker/psyker_head = new() - if(!psyker_head.replace_limb(src, special = TRUE)) + if(!psyker_head.replace_limb(src)) return FALSE qdel(old_head) var/obj/item/organ/brain/psyker/psyker_brain = new() /// turns out if you make a flashing monochromatic outline against black background that refreshes on inconsistant intervals, it hurts peoples eyes. Who'da thunk. diff --git a/code/modules/religion/festival/instrument_rites.dm b/code/modules/religion/festival/instrument_rites.dm index 9ac32dd24dec..e3f53c10fd83 100644 --- a/code/modules/religion/festival/instrument_rites.dm +++ b/code/modules/religion/festival/instrument_rites.dm @@ -173,7 +173,7 @@ if(listener.mind?.holy_role) damage_dealt *= 0.5 - listener.adjustBruteLoss(damage_dealt) + listener.adjust_brute_loss(damage_dealt) /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) diff --git a/code/modules/religion/pyre/pyre_rites.dm b/code/modules/religion/pyre/pyre_rites.dm index 0a6cde9260c8..880bd6558cd1 100644 --- a/code/modules/religion/pyre/pyre_rites.dm +++ b/code/modules/religion/pyre/pyre_rites.dm @@ -90,7 +90,7 @@ to_chat(user, span_warning("The sacrifice has to stay dead for the rite to work!")) chosen_sacrifice = null return FALSE - var/favor_gained = 100 + round(chosen_sacrifice.getFireLoss()) + var/favor_gained = 100 + round(chosen_sacrifice.get_fire_loss()) GLOB.religious_sect.adjust_favor(favor_gained, user) to_chat(user, span_notice("[GLOB.deity] absorbs the charred corpse and any trace of fire with it. [GLOB.deity] rewards you with [favor_gained] favor.")) chosen_sacrifice.dust(force = TRUE) diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm index 72ed3c6b67ce..2f68a0153cf2 100644 --- a/code/modules/religion/religion_sects.dm +++ b/code/modules/religion/religion_sects.dm @@ -235,12 +235,11 @@ /datum/religion_sect/pyre/on_select() . = ..() AddComponent(/datum/component/sect_nullrod_bonus, list( - /obj/item/gun/ballistic/bow/divine/with_quiver = list( + /obj/item/gun/ballistic/bow/divine = list( /datum/religion_rites/blazing_star, ), )) - /datum/religion_sect/pyre/on_sacrifice(obj/item/flashlight/flare/candle/offering, mob/living/user) if(!istype(offering)) return @@ -277,7 +276,7 @@ return BLESSING_IGNORED if(account.account_balance < GREEDY_HEAL_COST) - to_chat(chap, span_warning("Healing from [GLOB.deity] costs [GREEDY_HEAL_COST] credits for 30 health!")) + to_chat(chap, span_warning("Healing from [GLOB.deity] costs [GREEDY_HEAL_COST] [MONEY_NAME] for 30 health!")) return BLESSING_IGNORED var/mob/living/carbon/human/blessed = blessed_living @@ -372,25 +371,25 @@ target.cure_husk(BURN) chaplain.become_husk(BURN) - var/toxin_damage = target.getToxLoss() + var/toxin_damage = target.get_tox_loss() if(toxin_damage && !HAS_TRAIT(chaplain, TRAIT_TOXIMMUNE)) transferred = TRUE - target.adjustToxLoss(-toxin_damage) - chaplain.adjustToxLoss(toxin_damage * burden_modifier, forced = TRUE) + target.adjust_tox_loss(-toxin_damage) + chaplain.adjust_tox_loss(toxin_damage * burden_modifier, forced = TRUE) - var/suffocation_damage = target.getOxyLoss() + var/suffocation_damage = target.get_oxy_loss() if(suffocation_damage && !HAS_TRAIT(chaplain, TRAIT_NOBREATH)) transferred = TRUE - target.adjustOxyLoss(-suffocation_damage) - chaplain.adjustOxyLoss(suffocation_damage * burden_modifier, forced = TRUE) - - if(!HAS_TRAIT(chaplain, TRAIT_NOBLOOD)) - if(target.blood_volume < BLOOD_VOLUME_SAFE) - var/transferred_blood_amount = min(chaplain.blood_volume, BLOOD_VOLUME_SAFE - target.blood_volume) - if(transferred_blood_amount && target.get_blood_compatibility(chaplain)) - transferred = chaplain.transfer_blood_to(target, transferred_blood_amount, forced = TRUE) - else if(target.blood_volume > BLOOD_VOLUME_EXCESS) - transferred = target.transfer_blood_to(chaplain, target.blood_volume - BLOOD_VOLUME_EXCESS, forced = TRUE) + target.adjust_oxy_loss(-suffocation_damage) + chaplain.adjust_oxy_loss(suffocation_damage * burden_modifier, forced = TRUE) + + var/cached_blood_volume = target.get_blood_volume() + if (cached_blood_volume < BLOOD_VOLUME_SAFE) + if (target.get_blood_compatibility(chaplain)) + var/amount_to_transfer = BLOOD_VOLUME_SAFE - cached_blood_volume + transferred |= chaplain.transfer_blood_to(target, amount_to_transfer, ignore_low_blood = TRUE) + else if (cached_blood_volume > BLOOD_VOLUME_EXCESS) + transferred |= target.transfer_blood_to(chaplain, cached_blood_volume - BLOOD_VOLUME_EXCESS) target.update_damage_overlays() chaplain.update_damage_overlays() diff --git a/code/modules/research/anomaly/anomaly_core.dm b/code/modules/research/anomaly/anomaly_core.dm index 648cc2829899..1d7b54c080ab 100644 --- a/code/modules/research/anomaly/anomaly_core.dm +++ b/code/modules/research/anomaly/anomaly_core.dm @@ -94,3 +94,9 @@ desc = "The neutralized core of an ectoplasmic anomaly. When you hold it close, you can hear faint murmuring from inside. It'd probably be valuable for research." icon_state = "dimensional_core" anomaly_type = /obj/effect/anomaly/ectoplasm + +/obj/item/assembly/signaler/anomaly/weather + name = "\improper weather anomaly core" + desc = "The neutralized core of a weather anomaly. The sound of thunder can be heard in the distance. It'd probably be valuable for research." + icon_state = "weather_core" + anomaly_type = /obj/effect/anomaly/weather diff --git a/code/modules/research/anomaly/raw_anomaly.dm b/code/modules/research/anomaly/raw_anomaly.dm index d86ed1f1d9d4..e33a3adca3ee 100644 --- a/code/modules/research/anomaly/raw_anomaly.dm +++ b/code/modules/research/anomaly/raw_anomaly.dm @@ -74,6 +74,12 @@ anomaly_type = /obj/item/assembly/signaler/anomaly/ectoplasm icon_state = "rawcore_dimensional" +/obj/item/raw_anomaly_core/weather + name = "raw weather core" + desc = "The raw core of a weather anomaly. It makes you wish for a rainy day." + anomaly_type = /obj/item/assembly/signaler/anomaly/weather + icon_state = "rawcore_weather" + /obj/item/raw_anomaly_core/random/Initialize(mapload) . = ..() var/path = pick(subtypesof(/obj/item/raw_anomaly_core)) diff --git a/code/modules/research/designs/autolathe/multi-department_designs.dm b/code/modules/research/designs/autolathe/multi-department_designs.dm index a1a1037b2e28..bb7761c86fa1 100644 --- a/code/modules/research/designs/autolathe/multi-department_designs.dm +++ b/code/modules/research/designs/autolathe/multi-department_designs.dm @@ -9,6 +9,21 @@ RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MISC, ) +/datum/design/flare + name = "Flare" + id = "flare" + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, + /datum/material/plasma = SMALL_MATERIAL_AMOUNT * 0.5, + /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 0.5, + ) + build_path = /obj/item/flashlight/flare + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MISC, + ) + /datum/design/crowbar name = "Pocket Crowbar" id = "crowbar" @@ -495,6 +510,18 @@ ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE +/datum/design/suit_sensor + name = "Suit Sensor" + id = "suit_sensor" + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT) + build_path = /obj/item/suit_sensor + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_ASSEMBLIES, + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SECURITY + /datum/design/conveyor_belt name = "Conveyor Belt" id = "conveyor_belt" diff --git a/code/modules/research/designs/autolathe/service_designs.dm b/code/modules/research/designs/autolathe/service_designs.dm index 2f60366a7e53..82911ce3caf2 100644 --- a/code/modules/research/designs/autolathe/service_designs.dm +++ b/code/modules/research/designs/autolathe/service_designs.dm @@ -190,19 +190,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE -/datum/design/soup_pot - name = "Soup Pot" - id = "souppot" - build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT*5, /datum/material/bluespace =SMALL_MATERIAL_AMOUNT*4) - category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_EQUIPMENT) - build_path = /obj/item/reagent_containers/cup/soup_pot - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_KITCHEN, - ) - departmental_flags = DEPARTMENT_BITFLAG_SERVICE - /datum/design/bowl name = "Bowl" id = "bowl" @@ -616,6 +603,27 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE +/datum/design/telescreen_monastery + name = "Monastery Telescreen" + id = "telescreen_monastery" + build_type = PROTOLATHE + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2.5, + ) + build_path = /obj/item/wallframe/telescreen/monastery + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE + +/datum/design/telescreen_monastery/New() + var/has_monastery = CHECK_MAP_JOB_CHANGE(JOB_CHAPLAIN, "has_monastery") + if(!has_monastery) + id = DESIGN_ID_IGNORE + return ..() + /datum/design/entertainment_radio name = "Entertainment Radio" id = "radio_entertainment" diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 086b4ca947b5..bf5abaa65f91 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -891,16 +891,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE -/datum/design/board/donksofttoyvendor - name = "Donksoft Toy Vendor Board" - desc = "The circuit board for a Donksoft Toy Vendor." - id = "donksofttoyvendor" - build_path = /obj/item/circuitboard/machine/vending/donksofttoyvendor - category = list( - RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE - ) - departmental_flags = DEPARTMENT_BITFLAG_SERVICE - /datum/design/board/cell_charger name = "Cell Charger Board" desc = "The circuit board for a cell charger." @@ -1021,16 +1011,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE -/datum/design/board/vendatray - name = "Vend-a-Tray Board" - desc = "The circuit board for a Vend-a-Tray." - id = "vendatray" - build_path = /obj/item/circuitboard/machine/vendatray - category = list( - RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE - ) - departmental_flags = DEPARTMENT_BITFLAG_SERVICE - /datum/design/board/bountypad name = "Civilian Bounty Pad Board" desc = "The circuit board for a Civilian Bounty Pad." @@ -1415,3 +1395,13 @@ RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_CARGO ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/board/washing_machine + name = "Washing Machine" + desc = "The circuit board to build a washing machine." + id = "washing_machine" + build_path = /obj/item/circuitboard/machine/washing_machine + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm index 4b76de95f125..eff9f35ecf32 100644 --- a/code/modules/research/designs/mecha_designs.dm +++ b/code/modules/research/designs/mecha_designs.dm @@ -233,7 +233,8 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -251,7 +252,8 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -269,7 +271,8 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -287,7 +290,8 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -305,7 +309,8 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -323,7 +328,8 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -341,7 +347,8 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -359,7 +366,8 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -377,7 +385,8 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -395,7 +404,8 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -413,7 +423,8 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -431,7 +442,8 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -449,7 +461,8 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -467,7 +480,8 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -485,7 +499,8 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -506,7 +521,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -527,7 +543,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -548,7 +565,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -568,7 +586,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -589,7 +608,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -610,7 +630,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -631,7 +652,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -652,7 +674,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -673,7 +696,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -708,7 +732,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -728,7 +753,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -746,6 +772,7 @@ RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -762,7 +789,8 @@ RND_CATEGORY_MECHFAB_PADDY + 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_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 261b3104bd81..3d3270622b21 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1039,7 +1039,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -1091,7 +1092,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -1173,7 +1175,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -1191,7 +1194,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -1805,7 +1809,8 @@ 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 + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -1827,7 +1832,8 @@ RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, - RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -1851,7 +1857,8 @@ RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, - RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, + RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -1974,6 +1981,18 @@ ) research_icon_state = "civilian-plating" +/datum/design/mod_plating/portable_suit + name = "MOD Portable Suit Plating" + id = "mod_plating_portable_suit" + build_path = /obj/item/mod/construction/plating/portable_suit + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 1, + /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT, + ) + research_icon_state = "psuit-plating" + /datum/design/mod_plating/engineering name = "MOD Engineering Plating" id = "mod_plating_engineering" @@ -2078,7 +2097,7 @@ desc = "[initial(module.desc)] It uses [initial(module.complexity)] complexity." /datum/design/module/mod_storage - name = "Storage Module" + name = "Compact Storage Module" id = "mod_storage" materials = list( /datum/material/iron = SHEET_MATERIAL_AMOUNT *1.25, @@ -2087,7 +2106,7 @@ build_path = /obj/item/mod/module/storage /datum/design/module/mod_storage_expanded - name = "Expanded Storage Module" + name = "Storage Module" id = "mod_storage_expanded" materials = list( /datum/material/iron =SHEET_MATERIAL_AMOUNT * 2.5, diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index e4a8b78a6e77..3ca9a45b7327 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -188,18 +188,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL -/datum/design/defibrillator - name = "Defibrillator" - desc = "A portable defibrillator, used for resuscitating recently deceased crew." - id = "defibrillator" - build_type = PROTOLATHE | AWAY_LATHE - build_path = /obj/item/defibrillator - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*4, /datum/material/glass = SHEET_MATERIAL_AMOUNT*2, /datum/material/silver =SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/gold =HALF_SHEET_MATERIAL_AMOUNT * 1.5) - category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL - ) - departmental_flags = DEPARTMENT_BITFLAG_MEDICAL - /datum/design/defibrillator_mount name = "Defibrillator Wall Mount" desc = "A mounted frame for holding defibrillators, providing easy security." @@ -224,18 +212,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL -/datum/design/defibrillator_compact - name = "Compact Defibrillator" - desc = "A compact defibrillator that can be worn on a belt." - id = "defibrillator_compact" - build_type = PROTOLATHE | AWAY_LATHE - build_path = /obj/item/defibrillator/compact - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*6, /datum/material/glass = SHEET_MATERIAL_AMOUNT*4, /datum/material/silver = SHEET_MATERIAL_AMOUNT*3, /datum/material/gold =SHEET_MATERIAL_AMOUNT * 1.5) - category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL - ) - departmental_flags = DEPARTMENT_BITFLAG_MEDICAL - /datum/design/genescanner name = "Genetic Sequence Analyzer" desc = "A handy hand-held analyzers for quickly determining mutations and collecting the full sequence." @@ -733,6 +709,23 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/cyberimp_surgery_brain + name = "Surgical Processor Implant" + desc = "A cybernetic brain implant that provides access to advanced surgeries." + id = "ci-surgery-brain" + build_type = PROTOLATHE | AWAY_LATHE | MECHFAB + construction_time = 4 SECONDS + materials = list( + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 0.25, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 0.5, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 0.75, + ) + build_path = /obj/item/organ/cyberimp/brain/surgical_processor + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + ///////////////////////////////////////// ////////////Regular Implants///////////// ///////////////////////////////////////// @@ -1043,6 +1036,23 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/cybernetic_ears_volume + name = "Volume-adjusting Cybernetic Ears" + desc = "A pair of volume-adjusting cybernetic ears" + id = "cybernetic_ears_volume" + build_type = PROTOLATHE | AWAY_LATHE | MECHFAB + construction_time = 4 SECONDS + 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/ears/cybernetic/volume + 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." @@ -1060,6 +1070,36 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/cybernetic_ears/cat + name = "Basic Cybernetic Cat Ears" + desc = "A basic pair of cybernetic cat ears" + id = "cybernetic_ears_cat" + build_path = /obj/item/organ/ears/cat/cybernetic + +/datum/design/cybernetic_ears_u/cat + name = "Cybernetic Cat Ears" + desc = "A pair of cybernetic cat ears" + id = "cybernetic_ears_u_cat" + build_path = /obj/item/organ/ears/cat/cybernetic/upgraded + +/datum/design/cybernetic_ears_whisper/cat + name = "Whisper-sensitive Cybernetic Cat Ears" + desc = "A pair of whisper-sensitive cybernetic cat ears" + id = "cybernetic_ears_whisper_cat" + build_path = /obj/item/organ/ears/cat/cybernetic/whisper + +/datum/design/cybernetic_ears_volume/cat + name = "Volume-adjusting Cybernetic Cat Ears" + desc = "A pair of volume-adjusting cybernetic cat ears" + id = "cybernetic_ears_volume_cat" + build_path = /obj/item/organ/ears/cat/cybernetic/volume + +/datum/design/cybernetic_ears_xray/cat + name = "Wall-penetrating Cybernetic Cat Ears" + desc = "A pair of wall-penetrating cybernetic cat ears" + id = "cybernetic_ears_xray_cat" + build_path = /obj/item/organ/ears/cat/cybernetic/xray + /datum/design/cybernetic_eyes name = "Basic Cybernetic Eyes" desc = "A basic pair of cybernetic eyes." @@ -1129,240 +1169,213 @@ id = "ci-gloweyes-moth" build_path = /obj/item/organ/eyes/robotic/glow/moth +/datum/design/medibot_upgrade + name = "Medibot Upgrade" + desc = "Automatically upgrades the effectiveness of all medibots linked to the research network." + id = "medibot_upgrade" + research_icon = 'icons/mob/silicon/aibots.dmi' + research_icon_state = "medbot_generic_idle" + /// Medibot healing starts at a 1x multiplier. For every tech researched, it goes up by this amount additively. + var/additive_multiplier = 1 + +/datum/design/medibot_upgrade/tier_two + id = "medibot_upgrade_two" + research_icon_state = "medbot_adv_idle" + +/datum/design/medibot_upgrade/tier_three + id = "medibot_upgrade_three" + research_icon_state = "medbot_adv_idle" + +/datum/design/medibot_upgrade/tier_four + id = "medibot_upgrade_four" + research_icon_state = "medbot_bezerk_idle" // alien tech + ///////////////////// ///Surgery Designs/// ///////////////////// /datum/design/surgery - name = "Surgery Design" - desc = "what" + abstract_type = /datum/design/surgery + id = DESIGN_ID_IGNORE + name = null + desc = null research_icon = 'icons/obj/medical/surgery_ui.dmi' research_icon_state = "surgery_any" - var/surgery + /// Typepath of what operation this design unlocks + var/datum/surgery_operation/surgery + +/datum/design/surgery/New() + . = ..() + if(isnull(name)) + name = surgery::rnd_name || capitalize(surgery::name) + if(isnull(desc)) + desc = surgery::rnd_desc || surgery::desc /datum/design/surgery/lobotomy - name = "Lobotomy" - desc = "An invasive surgical procedure which guarantees removal of almost all brain traumas, but might cause another permanent trauma in return." id = "surgery_lobotomy" - surgery = /datum/surgery/advanced/lobotomy + surgery = /datum/surgery_operation/organ/lobotomy research_icon_state = "surgery_head" /datum/design/surgery/lobotomy/mechanic - name = "Wetware OS Destructive Defragmentation" - desc = "A destructive robotic defragmentation method which guarantees removal of almost all brain traumas, but might cause another permanent trauma in return." id = "surgery_lobotomy_mechanic" - surgery = /datum/surgery/advanced/lobotomy/mechanic + surgery = /datum/surgery_operation/organ/lobotomy/mechanic /datum/design/surgery/pacify - name = "Pacification" - desc = "A surgical procedure which permanently inhibits the aggression center of the brain, making the patient unwilling to cause direct harm." id = "surgery_pacify" - surgery = /datum/surgery/advanced/pacify + surgery = /datum/surgery_operation/organ/pacify research_icon_state = "surgery_head" /datum/design/surgery/pacify/mechanic - name = "Aggression Suppression Programming" - desc = "Malware which permanently inhibits the aggression programming of the patient's neural network, making the patient unwilling to cause direct harm." id = "surgery_pacify_mechanic" - surgery = /datum/surgery/advanced/pacify/mechanic + surgery = /datum/surgery_operation/organ/pacify/mechanic /datum/design/surgery/viral_bonding - name = "Viral Bonding" - desc = "A surgical procedure that forces a symbiotic relationship between a virus and its host. The patient must be dosed with spaceacillin, virus food, and formaldehyde." id = "surgery_viral_bond" - surgery = /datum/surgery/advanced/viral_bonding + surgery = /datum/surgery_operation/basic/viral_bonding research_icon_state = "surgery_chest" -/datum/design/surgery/healing //PLEASE ACCOUNT FOR UNIQUE HEALING BRANCHES IN THE hptech HREF (currently 2 for Brute/Burn; Combo is bonus) - name = "Tend Wounds" - desc = "An upgraded version of the original surgery." - id = "surgery_healing_base" //holder because CI cries otherwise. Not used in techweb unlocks. - surgery = /datum/surgery/healing +/datum/design/surgery/tend_wounds_upgrade + name = "Tend Wounds Upgrade" + desc = "Upgrade the efficiency of the individual tend wound operations." + id = "surgery_heal_upgrade" + surgery = /datum/surgery_operation/basic/tend_wounds/upgraded research_icon_state = "surgery_chest" -/datum/design/surgery/healing/brute_upgrade - name = "Tend Wounds (Brute) Upgrade" - surgery = /datum/surgery/healing/brute/upgraded - id = "surgery_heal_brute_upgrade" - -/datum/design/surgery/healing/brute_upgrade_2 - name = "Tend Wounds (Brute) Upgrade" - surgery = /datum/surgery/healing/brute/upgraded/femto - id = "surgery_heal_brute_upgrade_femto" - -/datum/design/surgery/healing/burn_upgrade - name = "Tend Wounds (Burn) Upgrade" - surgery = /datum/surgery/healing/burn/upgraded - id = "surgery_heal_burn_upgrade" - -/datum/design/surgery/healing/burn_upgrade_2 - name = "Tend Wounds (Burn) Upgrade" - surgery = /datum/surgery/healing/burn/upgraded/femto - id = "surgery_heal_burn_upgrade_femto" - -/datum/design/surgery/healing/combo - name = "Tend Wounds (Physical)" - desc = "A surgical procedure that repairs both bruises and burns. Repair efficiency is not as high as the individual surgeries but it is faster." - surgery = /datum/surgery/healing/combo +/datum/design/surgery/tend_wounds_upgrade/femto + name = "Tend Wounds Upgrade" + surgery = /datum/surgery_operation/basic/tend_wounds/upgraded/master + id = "surgery_heal_upgrade_femto" + +/datum/design/surgery/tend_wounds_combo + name = "Tend Wounds Combo" + desc = "An alternative wound treatment operation that treats both bruises and burns at the same time, albeit less effectively than their individual counterparts." + surgery = /datum/surgery_operation/basic/tend_wounds/combo id = "surgery_heal_combo" + research_icon_state = "surgery_chest" -/datum/design/surgery/healing/combo_upgrade - name = "Tend Wounds (Physical) Upgrade" - surgery = /datum/surgery/healing/combo/upgraded +/datum/design/surgery/tend_wounds_combo/upgrade + name = "Tend Wounds Combo Upgrade" + surgery = /datum/surgery_operation/basic/tend_wounds/combo/upgraded id = "surgery_heal_combo_upgrade" -/datum/design/surgery/healing/combo_upgrade_2 - name = "Tend Wounds (Physical) Upgrade" - desc = "A surgical procedure that repairs both bruises and burns faster than their individual counterparts. It is more effective than both the individual surgeries." - surgery = /datum/surgery/healing/combo/upgraded/femto +/datum/design/surgery/tend_wounds_combo/upgrade/femto + name = "Tend Wounds Combo Upgrade" + desc = "The ultimate in wound treatment operations, treating both bruises and burns simultaneous and faster than their individual counterparts." + surgery = /datum/surgery_operation/basic/tend_wounds/combo/upgraded/master id = "surgery_heal_combo_upgrade_femto" /datum/design/surgery/brainwashing - name = "Brainwashing" - desc = "A surgical procedure which directly implants a directive into the patient's brain, making it their absolute priority. It can be cleared using a mindshield implant." id = "surgery_brainwashing" - surgery = /datum/surgery/advanced/brainwashing + surgery = /datum/surgery_operation/organ/brainwash research_icon_state = "surgery_head" /datum/design/surgery/brainwashing/mechanic - name = "Reprogramming" - desc = "Malware which directly implants a directive into the robotic patient's operating system, making it their absolute priority. It can be cleared using a mindshield implant." id = "surgery_brainwashing_mechanic" - surgery = /datum/surgery/advanced/brainwashing/mechanic + surgery = /datum/surgery_operation/organ/brainwash/mechanic /datum/design/surgery/nerve_splicing - name = "Nerve Splicing" desc = "A surgical procedure which splices the patient's nerves, making them more resistant to stuns." id = "surgery_nerve_splice" - surgery = /datum/surgery/advanced/bioware/nerve_splicing + surgery = /datum/surgery_operation/limb/bioware/nerve_splicing research_icon_state = "surgery_chest" /datum/design/surgery/nerve_splicing/mechanic - name = "System Automatic Reset Subroutine" desc = "A robotic upgrade which upgrades a robotic patient's automatic systems, making them more resistant to stuns." id = "surgery_nerve_splice_mechanic" - surgery = /datum/surgery/advanced/bioware/nerve_splicing/mechanic + surgery = /datum/surgery_operation/limb/bioware/nerve_splicing/mechanic /datum/design/surgery/nerve_grounding - name = "Nerve Grounding" desc = "A surgical procedure which makes the patient's nerves act as grounding rods, protecting them from electrical shocks." id = "surgery_nerve_ground" - surgery = /datum/surgery/advanced/bioware/nerve_grounding + surgery = /datum/surgery_operation/limb/bioware/nerve_grounding research_icon_state = "surgery_chest" /datum/design/surgery/nerve_grounding/mechanic - name = "System Shock Dampening" desc = "A robotic upgrade which installs grounding rods into the robotic patient's system, protecting them from electrical shocks." id = "surgery_nerve_ground_mechanic" - surgery = /datum/surgery/advanced/bioware/nerve_grounding/mechanic + surgery = /datum/surgery_operation/limb/bioware/nerve_grounding/mechanic /datum/design/surgery/vein_threading - name = "Vein Threading" desc = "A surgical procedure which severely reduces the amount of blood lost in case of injury." id = "surgery_vein_thread" - surgery = /datum/surgery/advanced/bioware/vein_threading + surgery = /datum/surgery_operation/limb/bioware/vein_threading research_icon_state = "surgery_chest" /datum/design/surgery/vein_threading/mechanic - name = "Hydraulics Routing Optimization" desc = "A robotic upgrade which severely reduces the amount of hydraulic fluid lost in case of injury." id = "surgery_vein_thread_mechanic" - surgery = /datum/surgery/advanced/bioware/vein_threading/mechanic + surgery = /datum/surgery_operation/limb/bioware/vein_threading/mechanic /datum/design/surgery/muscled_veins - name = "Vein Muscle Membrane" desc = "A surgical procedure which adds a muscled membrane to blood vessels, allowing a patient to pump blood without a heart." id = "surgery_muscled_veins" - surgery = /datum/surgery/advanced/bioware/muscled_veins + surgery = /datum/surgery_operation/limb/bioware/muscled_veins research_icon_state = "surgery_chest" /datum/design/surgery/muscled_veins/mechanic - name = "Hydraulics Redundancy Subroutine" desc = "A robotic upgrade which adds sophisticated hydraulics redundancies, allowing a patient to pump hydraulic fluid without an engine." id = "surgery_muscled_veins_mechanic" - surgery = /datum/surgery/advanced/bioware/muscled_veins/mechanic + surgery = /datum/surgery_operation/limb/bioware/muscled_veins/mechanic /datum/design/surgery/ligament_hook - name = "Ligament Hook" desc = "A surgical procedure which reshapes the connections between torso and limbs, making it so limbs can be attached manually if severed. \ - However this weakens the connection, making them easier to detach as well." + However, this weakens the connection, making them easier to detach as well." id = "surgery_ligament_hook" - surgery = /datum/surgery/advanced/bioware/ligament_hook + surgery = /datum/surgery_operation/limb/bioware/ligament_hook research_icon_state = "surgery_chest" /datum/design/surgery/ligament_hook/mechanic - name = "Anchor Point Snaplocks" desc = "A robotic upgrade which installs rapid detachment anchor points, making it so limbs can be attached manually if detached. \ - However this weakens the connection, making them easier to detach as well." + However, this weakens the connection, making them easier to detach as well." id = "surgery_ligament_hook_mechanic" - surgery = /datum/surgery/advanced/bioware/ligament_hook/mechanic + surgery = /datum/surgery_operation/limb/bioware/ligament_hook/mechanic /datum/design/surgery/ligament_reinforcement - name = "Ligament Reinforcement" desc = "A surgical procedure which adds a protective tissue and bone cage around the connections between the torso and limbs, preventing dismemberment. \ - However, the nerve connections as a result are more easily interrupted, making it easier to disable limbs with damage." + However, the nerve connections as a result are more easily interrupted, making it easier to disable limbs with damage." id = "surgery_ligament_reinforcement" - surgery = /datum/surgery/advanced/bioware/ligament_reinforcement + surgery = /datum/surgery_operation/limb/bioware/ligament_reinforcement research_icon_state = "surgery_chest" /datum/design/surgery/ligament_reinforcement/mechanic - name = "Anchor Point Reinforcement" desc = "A surgical procedure which adds reinforced limb anchor points to the patient's chassis, preventing dismemberment. \ However, the nerve connections as a result are more easily interrupted, making it easier to disable limbs with damage." id = "surgery_ligament_reinforcement_mechanic" - surgery = /datum/surgery/advanced/bioware/ligament_reinforcement/mechanic + surgery = /datum/surgery_operation/limb/bioware/ligament_reinforcement/mechanic /datum/design/surgery/cortex_imprint - name = "Cortex Imprint" desc = "A surgical procedure which modifies the cerebral cortex into a redundant neural pattern, making the brain able to bypass damage caused by minor brain traumas." id = "surgery_cortex_imprint" - surgery = /datum/surgery/advanced/bioware/cortex_imprint + surgery = /datum/surgery_operation/limb/bioware/cortex_imprint research_icon_state = "surgery_head" /datum/design/surgery/cortex_imprint/mechanic - name = "Wetware OS Ver 2.0" - desc = "A surgical procedure which updates the patient's operating system to the 'latest version', whatever that means, making the brain able to bypass damage caused by minor brain traumas. \ - Shame about all the adware." + desc = "A surgical procedure which updates the patient's operating system to the 'latest version', whatever that means, making the brain able to bypass damage caused by minor brain traumas." id = "surgery_cortex_imprint_mechanic" - surgery = /datum/surgery/advanced/bioware/cortex_imprint/mechanic + surgery = /datum/surgery_operation/limb/bioware/cortex_imprint/mechanic /datum/design/surgery/cortex_folding - name = "Cortex Folding" desc = "A surgical procedure which modifies the cerebral cortex into a complex fold, giving space to non-standard neural patterns." id = "surgery_cortex_folding" - surgery = /datum/surgery/advanced/bioware/cortex_folding + surgery = /datum/surgery_operation/limb/bioware/cortex_folding research_icon_state = "surgery_head" /datum/design/surgery/cortex_folding/mechanic - name = "Wetware OS Labyrinthian Programming" desc = "A robotic upgrade which reprograms the patient's neural network in a downright eldritch programming language, giving space to non-standard neural patterns." id = "surgery_cortex_folding_mechanic" - surgery = /datum/surgery/advanced/bioware/cortex_folding/mechanic + surgery = /datum/surgery_operation/limb/bioware/cortex_folding/mechanic /datum/design/surgery/necrotic_revival - name = "Necrotic Revival" - desc = "An experimental surgical procedure that stimulates the growth of a Romerol tumor inside the patient's brain. Requires zombie powder or rezadone." id = "surgery_zombie" - surgery = /datum/surgery/advanced/necrotic_revival + surgery = /datum/surgery_operation/limb/bionecrosis research_icon_state = "surgery_head" /datum/design/surgery/wing_reconstruction - name = "Wing Reconstruction" - desc = "An experimental surgical procedure that reconstructs the damaged wings of moth people. Requires Synthflesh." id = "surgery_wing_reconstruction" - surgery = /datum/surgery/advanced/wing_reconstruction + surgery = /datum/surgery_operation/organ/fix_wings 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 + surgery = /datum/surgery_operation/basic/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 f3fa22a68247..b355e379ab2d 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -1022,6 +1022,18 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE +/datum/design/bluespace_reel + name = "Bluespace Fishing Line" + desc = "An advanced line reel that can be used to reach distant fishing spots as well as other things whereas a normal fishing line cannot." + id = "bluespace_reel" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 4, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3) + build_path = /obj/item/fishing_line/bluespace + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE + /datum/design/fish_analyzer name = "Fish Analyzer" desc = "An analyzer used to monitor fish's status and traits with." @@ -1058,6 +1070,18 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE +/datum/design/fish_genegun + name = "Fish Gene Gun" + desc = "A device designed to inject or extract traits to and from fish. Also compatible with most aquatic-adjacent creatures." + id = "fish_genegun" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 4, /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 3, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 2) + build_path = /obj/item/fish_genegun + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE + // Coffeemaker Stuff /datum/design/coffeepot diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 66f550b9055e..2b702f442b2c 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -71,7 +71,7 @@ /datum/design/c38_true name = "Speedloader (.38 True Strike) (Lethal)" - desc = "Designed to quickly reload revolvers. Bullets bounce towards new targets with surprising accuracy." + desc = "Designed to quickly reload revolvers. Bullets bounce towards new targets with surprising accuracy and can strike through armored target" id = "c38_true_strike" build_type = PROTOLATHE | AWAY_LATHE materials = list( @@ -183,7 +183,7 @@ /datum/design/c38_true_mag name = "Magazine (.38 True Strike) (Lethal)" - desc = "Designed to tactically reload a NT BR-38 Battle Rifle. Bullets bounce towards new targets with surprising accuracy." + desc = "Designed to tactically reload a NT BR-38 Battle Rifle. Bullets bounce towards new targets with surprising accuracy and can strike through armored target" id = "c38_true_strike_mag" build_type = PROTOLATHE | AWAY_LATHE materials = list( diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 4d0e4537f524..310e13f73afb 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -67,24 +67,20 @@ item_reactions = list() valid_items = list() - for(var/I in typesof(/obj/item)) - if(ispath(I, /obj/item/relic)) - item_reactions["[I]"] = SCANTYPE_DISCOVER + for(var/obj/item/item_path as anything in valid_subtypesof(/obj/item)) + if(ispath(item_path, /obj/item/relic)) + item_reactions["[item_path]"] = SCANTYPE_DISCOVER else - item_reactions["[I]"] = pick(SCANTYPE_POKE,SCANTYPE_IRRADIATE,SCANTYPE_GAS,SCANTYPE_HEAT,SCANTYPE_COLD,SCANTYPE_OBLITERATE) + item_reactions["[item_path]"] = pick(SCANTYPE_POKE,SCANTYPE_IRRADIATE,SCANTYPE_GAS,SCANTYPE_HEAT,SCANTYPE_COLD,SCANTYPE_OBLITERATE) - if(is_type_in_typecache(I, banned_typecache)) + if(is_type_in_typecache(item_path, banned_typecache)) continue - if(ispath(I, /obj/item/stock_parts) || ispath(I, /obj/item/grenade/chem_grenade) || ispath(I, /obj/item/knife)) - var/obj/item/tempCheck = I - if(initial(tempCheck.icon_state) != null) //check it's an actual usable item, in a hacky way - valid_items["[I]"] += 15 + if(ispath(item_path, /obj/item/stock_parts) || ispath(item_path, /obj/item/grenade/chem_grenade) || ispath(item_path, /obj/item/knife)) + valid_items["[item_path]"] += 15 - if(ispath(I, /obj/item/food)) - var/obj/item/tempCheck = I - if(initial(tempCheck.icon_state) != null) //check it's an actual usable item, in a hacky way - valid_items["[I]"] += rand(1,4) + if(ispath(item_path, /obj/item/food)) + valid_items["[item_path]"] += rand(1,4) /obj/machinery/rnd/experimentor/Initialize(mapload) . = ..() @@ -339,7 +335,7 @@ throwSmoke(loc) else if(prob(EFFECT_PROB_MEDIUM * (100 - malfunction_probability_coeff) * 0.01)) visible_message(span_warning("[src] melts [exp_on], ionizing the air around it!")) - empulse(loc, 4, 6) + empulse(loc, 4, 6, emp_source = src) investigate_log("Experimentor has generated an Electromagnetic Pulse.", INVESTIGATE_EXPERIMENTOR) ejectItem(TRUE) //////////////////////////////////////////////////////////////////////////////////////////////// @@ -690,7 +686,8 @@ ) for(var/counter in 1 to rand(1, 25)) var/animal_spawn = pick(valid_animals) - new animal_spawn(get_turf(src)) + var/mob/living/animal = new animal_spawn(get_turf(src)) + ADD_TRAIT(animal, TRAIT_SPAWNED_MOB, INNATE_TRAIT) warn_admins(user, "Mass Mob Spawn") if(prob(60)) to_chat(user, span_warning("[src] falls apart!")) diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 9fc61e3d1355..03fba49ac075 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -8,7 +8,7 @@ /// The efficiency coefficient. Material costs and print times are multiplied by this number; var/efficiency_coeff = 1 /// The material storage used by this fabricator. - var/datum/component/remote_materials/materials + var/datum/remote_materials/materials /// Which departments are allowed to process this design var/allowed_department_flags = ALL /// Icon state when production has started @@ -28,8 +28,8 @@ /obj/machinery/rnd/production/Initialize(mapload) print_sound = new(src, FALSE) - materials = AddComponent( - /datum/component/remote_materials, \ + materials = new ( + src, \ mapload, \ mat_container_signals = list( \ COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/rnd/production, local_material_insert) @@ -53,9 +53,9 @@ update_icon(UPDATE_OVERLAYS) /obj/machinery/rnd/production/Destroy() - QDEL_NULL(print_sound) - materials = null cached_designs = null + QDEL_NULL(print_sound) + QDEL_NULL(materials) return ..() // Stuff for the stripe on the department machines diff --git a/code/modules/research/ordnance/_scipaper.dm b/code/modules/research/ordnance/_scipaper.dm index f1d94af76316..0b5efc03e10f 100644 --- a/code/modules/research/ordnance/_scipaper.dm +++ b/code/modules/research/ordnance/_scipaper.dm @@ -102,12 +102,12 @@ if(!tier || !experiment_path || !tracked_variable) return FALSE var/gain = calculate_gains(tier) - for (var/gain_type in 1 to gains.len) - gains[gain_type] = gain + for (var/gain_index in gains) + gains[gain_index] = gain if(!partner_path) continue var/datum/scientific_partner/partner = locate(partner_path) in SSresearch.scientific_partners - gains[gain_type] *= partner.multipliers[gain_type] + gains[gain_index] *= partner.multipliers[gain_index] /** Fully check if our paper have all the required variables, and prevent duplicate papers being published in the same tier. * Things to check: tier, gain, and partner here. ex_path and record datums in subtypes. @@ -151,23 +151,23 @@ /datum/scientific_paper/proc/return_gist() var/list/gist = list() var/list/transcripted_gains = list(SCIPAPER_COOPERATION_INDEX, SCIPAPER_FUNDING_INDEX) - for (var/index in 1 to transcripted_gains.len) + for (var/gain_index in transcripted_gains) if (!gains) - transcripted_gains[index] = "None" + transcripted_gains[gain_index] = "None" continue - switch (round(gains[index])) + switch (round(gains[gain_index])) if(-INFINITY to 0) - transcripted_gains[index] = "None" + transcripted_gains[gain_index] = "None" if(1 to 24) - transcripted_gains[index] = "Little" + transcripted_gains[gain_index] = "Little" if(25 to 49) - transcripted_gains[index] = "Moderate" + transcripted_gains[gain_index] = "Moderate" if(50 to 99) - transcripted_gains[index] = "Significant" + transcripted_gains[gain_index] = "Significant" if(100 to INFINITY) - transcripted_gains[index] = "Huge" + transcripted_gains[gain_index] = "Huge" else - transcripted_gains[index] = "Undefined" + transcripted_gains[gain_index] = "Undefined" gist["gains"] = transcripted_gains gist["title"] = title gist["author"] = author @@ -290,17 +290,23 @@ var/list/boostable_nodes = list() /datum/scientific_partner/proc/purchase_boost(datum/techweb/purchasing_techweb, datum/techweb_node/node) - if(!allowed_to_boost(purchasing_techweb, node.id)) + var/possible_boost = allowed_to_boost(purchasing_techweb, node.id) + if(!possible_boost) return FALSE purchasing_techweb.boost_techweb_node(node, list(TECHWEB_POINT_TYPE_GENERIC = boostable_nodes[node.id])) purchasing_techweb.scientific_cooperation[type] -= boostable_nodes[node.id] * SCIENTIFIC_COOPERATION_PURCHASE_MULTIPLIER + if(possible_boost == SCIPAPER_ALREADY_BOUGHT) /// Refund the original price + purchasing_techweb.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = boostable_nodes[node.id])) + return SCIPAPER_ALREADY_BOUGHT return TRUE /datum/scientific_partner/proc/allowed_to_boost(datum/techweb/purchasing_techweb, node_id) if(purchasing_techweb.scientific_cooperation[type] < (boostable_nodes[node_id] * SCIENTIFIC_COOPERATION_PURCHASE_MULTIPLIER)) // Too expensive return FALSE - if(!(node_id in purchasing_techweb.get_available_nodes())) // Not currently available - return FALSE if((TECHWEB_POINT_TYPE_GENERIC in purchasing_techweb.boosted_nodes[node_id]) && (purchasing_techweb.boosted_nodes[node_id][TECHWEB_POINT_TYPE_GENERIC] >= boostable_nodes[node_id])) // Already bought or we have a bigger discount return FALSE + if(node_id in purchasing_techweb.researched_nodes) + return SCIPAPER_ALREADY_BOUGHT + if(!(node_id in purchasing_techweb.get_available_nodes())) // Not currently available + return FALSE return TRUE diff --git a/code/modules/research/ordnance/doppler_array.dm b/code/modules/research/ordnance/doppler_array.dm index 3e4757e16757..fda438e4f4e4 100644 --- a/code/modules/research/ordnance/doppler_array.dm +++ b/code/modules/research/ordnance/doppler_array.dm @@ -31,7 +31,7 @@ update_doppler_light() // Rotation determines the detectable direction. - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) /datum/data/tachyon_record name = "Log Recording" diff --git a/code/modules/research/ordnance/scipaper_partner.dm b/code/modules/research/ordnance/scipaper_partner.dm index 5bbe3e7d6274..39d1cc68ed46 100644 --- a/code/modules/research/ordnance/scipaper_partner.dm +++ b/code/modules/research/ordnance/scipaper_partner.dm @@ -54,7 +54,7 @@ TECHWEB_NODE_CYBER_ORGANS = TECHWEB_TIER_2_POINTS, TECHWEB_NODE_CYBER_ORGANS_UPGRADED = TECHWEB_TIER_3_POINTS, TECHWEB_NODE_MEDBAY_EQUIP_ADV = TECHWEB_TIER_3_POINTS, - TECHWEB_NODE_CYTOLOGY = TECHWEB_TIER_3_POINTS, + TECHWEB_NODE_CYTOLOGY = TECHWEB_TIER_2_POINTS, TECHWEB_NODE_BORG_MEDICAL = TECHWEB_TIER_3_POINTS, TECHWEB_NODE_COMBAT_IMPLANTS = TECHWEB_TIER_4_POINTS, ) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 9a481d6f362e..32793bfe8ab4 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -38,6 +38,10 @@ Nothing else in the console has ID requirements. /// Cooldown that prevents hanging the MC when tech disks are copied STATIC_COOLDOWN_DECLARE(cooldowncopy) +// An unlocked subtype of the console for mapping. +/obj/machinery/computer/rdconsole/unlocked + circuit = /obj/item/circuitboard/computer/rdconsole/unlocked + /proc/CallMaterialName(ID) if (istype(ID, /datum/material)) var/datum/material/material = ID @@ -166,7 +170,7 @@ Nothing else in the console has ID requirements. var/obj/item/circuitboard/computer/rdconsole/board = circuit if(!(board.obj_flags & EMAGGED)) board.silence_announcements = TRUE - locked = FALSE + board.locked = FALSE return TRUE /obj/machinery/computer/rdconsole/ui_interact(mob/user, datum/tgui/ui = null) @@ -184,8 +188,11 @@ Nothing else in the console has ID requirements. // heavy data from this proc should be moved to static data when possible /obj/machinery/computer/rdconsole/ui_data(mob/user) var/list/data = list() + + var/obj/item/circuitboard/computer/rdconsole/board = circuit + data["stored_research"] = !!stored_research - data["locked"] = locked + data["locked"] = board.locked if(!stored_research) //lack of a research node is all we care about. return data data += list( @@ -236,16 +243,8 @@ Nothing else in the console has ID requirements. var/list/exp_to_process = stored_research.available_experiments.Copy() for (var/e in stored_research.completed_experiments) exp_to_process += stored_research.completed_experiments[e] - for (var/e in exp_to_process) - var/datum/experiment/ex = e - data["experiments"][ex.type] = list( - "name" = ex.name, - "description" = ex.description, - "tag" = ex.exp_tag, - "progress" = ex.check_progress(), - "completed" = ex.completed, - "performance_hint" = ex.performance_hint, - ) + for (var/datum/experiment/ex as anything in exp_to_process) + data["experiments"][ex.type] = ex.to_ui_data() return data /** @@ -331,8 +330,10 @@ Nothing else in the console has ID requirements. add_fingerprint(usr) + var/obj/item/circuitboard/computer/rdconsole/board = circuit + // Check if the console is locked to block any actions occuring - if (locked && action != "toggleLock") + if (board.locked && action != "toggleLock") say("Console is locked, cannot perform further actions.") return TRUE @@ -342,7 +343,7 @@ Nothing else in the console has ID requirements. to_chat(usr, span_boldwarning("Security protocol error: Unable to access locking protocols.")) return TRUE if(allowed(usr)) - locked = !locked + board.locked = !board.locked else to_chat(usr, span_boldwarning("Unauthorized Access.")) return TRUE diff --git a/code/modules/research/server_control.dm b/code/modules/research/server_control.dm index 73596925a2d7..1b792339d4af 100644 --- a/code/modules/research/server_control.dm +++ b/code/modules/research/server_control.dm @@ -52,10 +52,11 @@ )) for(var/obj/machinery/computer/rdconsole/console as anything in stored_research.consoles_accessing) + var/obj/item/circuitboard/computer/rdconsole/console_board = console.circuit data["consoles"] += list(list( "console_name" = console, "console_location" = get_area(console), - "console_locked" = console.locked, + "console_locked" = console_board.locked, "console_ref" = REF(console), )) @@ -79,7 +80,8 @@ return TRUE if("lock_console") var/obj/machinery/computer/rdconsole/console_selected = locate(params["selected_console"]) in stored_research.consoles_accessing + var/obj/item/circuitboard/computer/rdconsole/console_board = console_selected.circuit if(!console_selected) return FALSE - console_selected.locked = !console_selected.locked + console_board.locked = !console_board.locked return TRUE diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 5a2a2a47630a..ffbf453f3937 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -9,6 +9,9 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good ///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 abstract_type = /obj/item/stock_parts w_class = WEIGHT_CLASS_SMALL + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP 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 diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index 589cdf310e64..ade382a02656 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -321,6 +321,7 @@ result_text += points_rewarded result_text += "!" + SEND_SIGNAL(src, COMSIG_TECHWEB_EXPERIMENT_COMPLETED, completed_experiment) log_research("[completed_experiment.name] ([completed_experiment.type]) has been completed on techweb [id]/[organization][refund ? ", refunding [refund] points" : ""][points_rewarded].") return result_text @@ -558,10 +559,13 @@ if(experiment.type != paper_to_add.experiment_path) continue - experiment.completed = TRUE - var/announcetext = complete_experiment(experiment) - if(length(GLOB.experiment_handlers)) - var/datum/component/experiment_handler/handler = GLOB.experiment_handlers[1] - handler.announce_message_to_all(announcetext) + experiment.finish_experiment(linked_web_override = src) return TRUE + +/// Returns a flat list of all design datums this techweb has researched. +/datum/techweb/proc/get_researched_design_datums() + var/list/designs = list() + for(var/id in researched_designs) + designs += SSresearch.techweb_design_by_id(id) + return designs diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm index 2a6eb8b7b7d1..104e475b7e58 100644 --- a/code/modules/research/techweb/_techweb_node.dm +++ b/code/modules/research/techweb/_techweb_node.dm @@ -92,7 +92,7 @@ if(host.completed_experiments[experiment_type]) //do we have this discount_experiment unlocked? actual_costs[cost_type] -= discount_experiments[experiment_type] - if(host.boosted_nodes[id]) // Boosts should be subservient to experiments. Discount from boosts are capped when costs fall below 250. + if(host.boosted_nodes[id]) // Boosts should be subservient to experiments. var/list/boostlist = host.boosted_nodes[id] for(var/booster in boostlist) if(actual_costs[booster]) diff --git a/code/modules/research/techweb/nodes/alien_nodes.dm b/code/modules/research/techweb/nodes/alien_nodes.dm index 78fd3791e5cd..c5027b32bd66 100644 --- a/code/modules/research/techweb/nodes/alien_nodes.dm +++ b/code/modules/research/techweb/nodes/alien_nodes.dm @@ -82,6 +82,7 @@ ABDUCTOR_SUBTYPE_UNLOCKS(/datum/techweb_node/alien_engi) "alien_retractor", "alien_saw", "alien_scalpel", + "medibot_upgrade_four", "surgery_brainwashing", "surgery_brainwashing_mechanic", "surgery_heal_combo_upgrade_femto", diff --git a/code/modules/research/techweb/nodes/cyborg_nodes.dm b/code/modules/research/techweb/nodes/cyborg_nodes.dm index 4cab2dd3f08b..fee377af77c8 100644 --- a/code/modules/research/techweb/nodes/cyborg_nodes.dm +++ b/code/modules/research/techweb/nodes/cyborg_nodes.dm @@ -15,6 +15,7 @@ "cybernetic_eyes", "cybernetic_eyes_moth", "cybernetic_ears", + "cybernetic_ears_cat", "cybernetic_lungs", "cybernetic_stomach", "cybernetic_liver", @@ -193,8 +194,9 @@ prereq_ids = list(TECHWEB_NODE_COMBAT_IMPLANTS, TECHWEB_NODE_EXP_TOOLS) design_ids = list( "ci-nutrimentplus", - "ci-toolset", "ci-surgery", + "ci-surgery-brain", + "ci-toolset", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) @@ -208,6 +210,7 @@ "cybernetic_eyes_improved", "cybernetic_eyes_improved_moth", "cybernetic_ears_u", + "cybernetic_ears_u_cat", "cybernetic_lungs_tier2", "cybernetic_stomach_tier2", "cybernetic_liver_tier2", @@ -227,6 +230,9 @@ "ci-gloweyes-moth", "ci-welding-moth", "cybernetic_ears_whisper", + "cybernetic_ears_whisper_cat", + "cybernetic_ears_volume", + "cybernetic_ears_volume_cat", "cybernetic_lungs_tier3", "cybernetic_stomach_tier3", "cybernetic_liver_tier3", @@ -243,6 +249,7 @@ prereq_ids = list(TECHWEB_NODE_CYBER_ORGANS_UPGRADED, TECHWEB_NODE_NIGHT_VISION) design_ids = list( "cybernetic_ears_xray", + "cybernetic_ears_xray_cat", "ci-thermals", "ci-xray", "ci-thermals-moth", diff --git a/code/modules/research/techweb/nodes/engi_nodes.dm b/code/modules/research/techweb/nodes/engi_nodes.dm index 19c925eb8c2c..ce8fbfd25d30 100644 --- a/code/modules/research/techweb/nodes/engi_nodes.dm +++ b/code/modules/research/techweb/nodes/engi_nodes.dm @@ -59,7 +59,7 @@ "hyper_cell", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - required_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier2_any) + discount_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier2_any = TECHWEB_TIER_3_POINTS) announce_channels = list(RADIO_CHANNEL_ENGINEERING) @@ -218,7 +218,6 @@ "holobarrier_jani", "holobarrier_med", "holopad", - "vendatray", "holodisk", "modular_shield_gate", "modular_shield_generator", diff --git a/code/modules/research/techweb/nodes/medbay_nodes.dm b/code/modules/research/techweb/nodes/medbay_nodes.dm index 49d4aad71f74..c79bad013ef6 100644 --- a/code/modules/research/techweb/nodes/medbay_nodes.dm +++ b/code/modules/research/techweb/nodes/medbay_nodes.dm @@ -7,7 +7,6 @@ "operating", "medicalbed", "defibmountdefault", - "defibrillator", "surgical_drapes", "scalpel", "retractor", @@ -33,6 +32,7 @@ "jerrycan", "reflex_hammer", "blood_scanner", + "suit_sensor", ) experiments_to_unlock = list( /datum/experiment/autopsy/human, @@ -79,7 +79,6 @@ "healthanalyzer_advanced", "mod_health_analyzer", "crewpinpointer", - "defibrillator_compact", "defibmount", "medicalbed_emergency", "piercesyringe", diff --git a/code/modules/research/techweb/nodes/modsuit_nodes.dm b/code/modules/research/techweb/nodes/modsuit_nodes.dm index 63cc115125d1..4e1bf4c89444 100644 --- a/code/modules/research/techweb/nodes/modsuit_nodes.dm +++ b/code/modules/research/techweb/nodes/modsuit_nodes.dm @@ -1,7 +1,7 @@ /datum/techweb_node/mod_suit id = TECHWEB_NODE_MOD_SUIT starting_node = TRUE - display_name = "Modular Suit" + display_name = "Modular Suits" description = "Specialized back mounted power suits with various different modules." prereq_ids = list(TECHWEB_NODE_ROBOTICS) design_ids = list( @@ -26,22 +26,34 @@ prereq_ids = list(TECHWEB_NODE_MOD_SUIT) design_ids = list( "modlink_scryer", - "mod_clamp", "mod_tether", "mod_welding", - "mod_safety", - "mod_mouthhole", "mod_longfall", "mod_thermal_regulator", "mod_sign_radio", - "mod_mister_janitor", + "mod_storage_expanded", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) announce_channels = list(RADIO_CHANNEL_SCIENCE) +/datum/techweb_node/mod_service + id = TECHWEB_NODE_MOD_SERVICE + display_name = "Civilian Modular Suits" + description = "Civilian MODsuits for dignified living." + prereq_ids = list(TECHWEB_NODE_MOD_SUIT) + design_ids = list( + "mod_clamp", + "mod_safety", + "mod_mouthhole", + "mod_mister_janitor", + "mod_plating_portable_suit" + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS / 2) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SERVICE) + /datum/techweb_node/mod_entertainment id = TECHWEB_NODE_MOD_ENTERTAINMENT - display_name = "Entertainment Modular Suit" + display_name = "Entertainment Modular Suits" description = "Powered suits for protection against low-humor environments." prereq_ids = list(TECHWEB_NODE_MOD_SUIT) design_ids = list( @@ -55,7 +67,7 @@ /datum/techweb_node/mod_medical id = TECHWEB_NODE_MOD_MEDICAL - display_name = "Medical Modular Suit" + display_name = "Medical Modular Suits" description = "Medical MODsuits for quick rescue purposes." prereq_ids = list(TECHWEB_NODE_MOD_SUIT, TECHWEB_NODE_CHEM_SYNTHESIS) design_ids = list( @@ -117,7 +129,7 @@ /datum/techweb_node/mod_engi_adv id = TECHWEB_NODE_MOD_ENGI_ADV - display_name = "Advanced Engineering Modular Suit" + display_name = "Advanced Engineering Modular Suits" description = "Advanced Engineering suits, for advanced powered engineers." prereq_ids = list(TECHWEB_NODE_MOD_ENGI) design_ids = list( @@ -125,7 +137,6 @@ "mod_jetpack", "mod_rad_protection", "mod_emp_shield", - "mod_storage_expanded", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_ENGINEERING) @@ -137,7 +148,7 @@ /datum/techweb_node/mod_anomaly id = TECHWEB_NODE_MOD_ANOMALY - display_name = "Anomalock Modular Suit" + display_name = "Anomalock Modular Suits" description = "Modules for MODsuits that require anomaly cores to function." prereq_ids = list(TECHWEB_NODE_MOD_ENGI_ADV, TECHWEB_NODE_ANOMALY_RESEARCH) design_ids = list( diff --git a/code/modules/research/techweb/nodes/service_nodes.dm b/code/modules/research/techweb/nodes/service_nodes.dm index bb28a26a00c7..c40e15b001cd 100644 --- a/code/modules/research/techweb/nodes/service_nodes.dm +++ b/code/modules/research/techweb/nodes/service_nodes.dm @@ -33,6 +33,7 @@ "normtrash", "wirebrush", "flashlight", + "flare", "water_balloon", "ticket_machine", "radio_entertainment", @@ -52,6 +53,7 @@ "beartrap", "buffer", "vacuum", + "washing_machine", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) discount_experiments = list(/datum/experiment/scanning/random/janitor_trash = TECHWEB_TIER_2_POINTS) @@ -92,6 +94,12 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) announce_channels = list(RADIO_CHANNEL_SERVICE) +/datum/techweb_node/consoles/New() + var/has_monastery = CHECK_MAP_JOB_CHANGE(JOB_CHAPLAIN, "has_monastery") + if(has_monastery) + design_ids += "telescreen_monastery" + return ..() + /datum/techweb_node/gaming id = TECHWEB_NODE_GAMING display_name = "Gaming" @@ -146,7 +154,6 @@ "oven", "stove", "range", - "souppot", "processor", "gibber", "monkey_recycler", @@ -200,6 +207,8 @@ prereq_ids = list(TECHWEB_NODE_FISHING_EQUIP_ADV) design_ids = list( "bioelec_gen", + "bluespace_reel", + "fish_genegun", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) // only available if you've done the first fishing experiment (thus unlocking fishing tech), but not a strict requirement to get the tech diff --git a/code/modules/research/techweb/nodes/surgery_nodes.dm b/code/modules/research/techweb/nodes/surgery_nodes.dm index 7af1dacf1df9..9123179509f8 100644 --- a/code/modules/research/techweb/nodes/surgery_nodes.dm +++ b/code/modules/research/techweb/nodes/surgery_nodes.dm @@ -16,8 +16,8 @@ description = "Who would have known being more gentle with a hemostat decreases patient pain?" prereq_ids = list(TECHWEB_NODE_MEDBAY_EQUIP) design_ids = list( - "surgery_heal_brute_upgrade", - "surgery_heal_burn_upgrade", + "surgery_heal_upgrade", + "medibot_upgrade", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) announce_channels = list(RADIO_CHANNEL_MEDICAL) @@ -29,15 +29,15 @@ prereq_ids = list(TECHWEB_NODE_SURGERY) design_ids = list( "harvester", - "surgery_heal_brute_upgrade_femto", - "surgery_heal_burn_upgrade_femto", + "medibot_upgrade_two", "surgery_heal_combo", + "surgery_heal_upgrade_femto", "surgery_lobotomy", "surgery_lobotomy_mechanic", "surgery_wing_reconstruction", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) - required_experiments = list(/datum/experiment/autopsy/human) + discount_experiments = list(/datum/experiment/autopsy/human = TECHWEB_TIER_2_POINTS) announce_channels = list(RADIO_CHANNEL_MEDICAL) /datum/techweb_node/surgery_exp @@ -46,6 +46,7 @@ description = "When evolution isn't fast enough." prereq_ids = list(TECHWEB_NODE_SURGERY_ADV) design_ids = list( + "medibot_upgrade_three", "surgery_cortex_folding", "surgery_cortex_folding_mechanic", "surgery_cortex_imprint", diff --git a/code/modules/research/techweb/nodes/syndicate_nodes.dm b/code/modules/research/techweb/nodes/syndicate_nodes.dm index 7743b9442f82..d031cf7c8480 100644 --- a/code/modules/research/techweb/nodes/syndicate_nodes.dm +++ b/code/modules/research/techweb/nodes/syndicate_nodes.dm @@ -8,7 +8,6 @@ "ai_cam_upgrade", "borg_syndicate_module", "donksoft_refill", - "donksofttoyvendor", "largecrossbow", "mag_autorifle", "mag_autorifle_ap", @@ -31,9 +30,8 @@ SIGNAL_HANDLER UnregisterSignal(SSearly_assets, COMSIG_SUBSYSTEM_POST_INITIALIZE) required_items_to_unlock = list() - for(var/datum/uplink_item/item_path as anything in SStraitor.uplink_items_by_type) - var/datum/uplink_item/item = SStraitor.uplink_items_by_type[item_path] - if(!item.item || !(item.uplink_item_flags & SYNDIE_ILLEGAL_TECH)) + for(var/datum/uplink_item/item as anything in SStraitor.uplink_items) + if(isnull(item.item) || item.item == ABSTRACT_UPLINK_ITEM || !(item.uplink_item_flags & SYNDIE_ILLEGAL_TECH)) continue required_items_to_unlock |= item.item //allows deconning to unlock. diff --git a/code/modules/research/xenobiology/crossbreeding/__corecross.dm b/code/modules/research/xenobiology/crossbreeding/__corecross.dm index c8e452ebcdaf..54ce45602bd4 100644 --- a/code/modules/research/xenobiology/crossbreeding/__corecross.dm +++ b/code/modules/research/xenobiology/crossbreeding/__corecross.dm @@ -142,24 +142,27 @@ To add a crossbreed: . = ..() reagents.flags = DRAWABLE // Cannot be refilled, since it's basically an autoinjector! -/obj/item/slimecrossbeaker/autoinjector/attack(mob/living/M, mob/user) +/obj/item/slimecrossbeaker/autoinjector/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!iscarbon(interacting_with)) + return NONE + var/mob/living/carbon/injecting_mob = interacting_with if(!reagents.total_volume) to_chat(user, span_warning("[src] is empty!")) - return - if(!iscarbon(M)) - return - if(self_use_only && M != user) + return ITEM_INTERACT_BLOCKING + if(self_use_only && injecting_mob != user) 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, 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()].")) + return ITEM_INTERACT_BLOCKING + if(reagents.total_volume && (ignore_flags || injecting_mob.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE))) + reagents.trans_to(injecting_mob, reagents.total_volume, transferred_by = user) + if(user != injecting_mob) + to_chat(injecting_mob, span_warning("[user] presses [src] against you!")) + to_chat(user, span_notice("You press [src] against [injecting_mob], injecting [injecting_mob.p_them()].")) else to_chat(user, span_notice("You press [src] against yourself, and it flattens against you!")) + return ITEM_INTERACT_SUCCESS else to_chat(user, span_warning("There's no place to stick [src]!")) + return ITEM_INTERACT_BLOCKING /obj/item/slimecrossbeaker/autoinjector/regenpack ignore_flags = TRUE //It is, after all, intended to heal. diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index 91f13560f2f4..fbcef4a6d817 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -73,7 +73,7 @@ Slimecrossing Armor /datum/action/item_action/change_prism_colour/do_effect(trigger_flags) var/obj/item/clothing/glasses/prism_glasses/glasses = target - var/new_color = input(owner, "Choose the lens color:", "Color change",glasses.glasses_color) as color|null + var/new_color = tgui_color_picker(owner, "Choose the lens color:", "Color change",glasses.glasses_color) if(!new_color) return RemoveElement(/datum/element/wearable_client_colour, /datum/client_colour/glass_colour, ITEM_SLOT_EYES, GLASSES_TRAIT, glasses.glasses_color, glasses.forced_glass_color) @@ -113,22 +113,10 @@ Slimecrossing Armor throw_speed = 1 throw_range = 3 -/obj/item/clothing/head/peaceflower/proc/at_peace_check(mob/user) - if(iscarbon(user)) - var/mob/living/carbon/carbon_user = user - if(src == carbon_user.head) - to_chat(user, span_warning("You feel at peace. Why would you want anything else?")) - return TRUE - return FALSE - -/obj/item/clothing/head/peaceflower/attack_hand(mob/user, list/modifiers) - if(at_peace_check(user)) - return - return ..() - -/obj/item/clothing/head/peaceflower/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) - if(at_peace_check(user)) - return +/obj/item/clothing/head/peaceflower/can_mob_unequip(mob/user) + if(user.get_item_by_slot(slot_flags) == src) + to_chat(user, span_warning("You feel at peace. Why would you want anything else?")) + return FALSE return ..() /obj/item/clothing/suit/armor/heavy/adamantine diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index c47ea89eaac5..f041cba42bdd 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -33,7 +33,7 @@ Slimecrossing Items if(QDELETED(saved_part.old_part)) saved_part.old_part = new saved_part.bodypart_type if(!already || already != saved_part.old_part) - saved_part.old_part.replace_limb(src, TRUE) + saved_part.old_part.replace_limb(src) saved_part.old_part.heal_damage(INFINITY, INFINITY, null, FALSE) saved_part.old_part.receive_damage(saved_part.brute_dam, saved_part.burn_dam, wound_bonus=CANT_WOUND) dont_chop[zone] = TRUE diff --git a/code/modules/research/xenobiology/crossbreeding/_potions.dm b/code/modules/research/xenobiology/crossbreeding/_potions.dm index 2f82396168e7..cfc4630da7cc 100644 --- a/code/modules/research/xenobiology/crossbreeding/_potions.dm +++ b/code/modules/research/xenobiology/crossbreeding/_potions.dm @@ -8,7 +8,6 @@ Slimecrossing Potions /obj/item/slimepotion/extract_cloner name = "extract cloning potion" desc = "A more powerful version of the extract enhancer potion, capable of cloning regular slime extracts." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potgold" /obj/item/slimepotion/extract_cloner/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) @@ -35,16 +34,19 @@ Slimecrossing Potions /obj/item/slimepotion/peacepotion name = "pacification potion" desc = "A light pink solution of chemicals, smelling like liquid peace. And mercury salts." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potlightpink" -/obj/item/slimepotion/peacepotion/attack(mob/living/peace_target, mob/user) +/obj/item/slimepotion/peacepotion/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + var/mob/living/peace_target = interacting_with if(!isliving(peace_target) || peace_target.stat == DEAD) to_chat(user, span_warning("[src] only works on the living.")) - return ..() + return ITEM_INTERACT_BLOCKING if(ismegafauna(peace_target)) to_chat(user, span_warning("[src] does not work on beings of pure evil!")) - return ..() + return ITEM_INTERACT_BLOCKING if(peace_target != user) peace_target.visible_message(span_danger("[user] starts to feed [peace_target] [src]!"), span_userdanger("[user] starts to feed you [src]!")) @@ -53,7 +55,7 @@ Slimecrossing Potions span_danger("You start to drink [src]!")) if(!do_after(user, 10 SECONDS, target = peace_target)) - return + return ITEM_INTERACT_BLOCKING if(peace_target != user) to_chat(user, span_notice("You feed [peace_target] [src]!")) else @@ -64,44 +66,48 @@ Slimecrossing Potions var/mob/living/carbon/peaceful_carbon = peace_target peaceful_carbon.gain_trauma(/datum/brain_trauma/severe/pacifism, TRAUMA_RESILIENCE_SURGERY) qdel(src) + return ITEM_INTERACT_SUCCESS //Love potion - Charged Pink /obj/item/slimepotion/lovepotion name = "love potion" desc = "A pink chemical mix thought to inspire feelings of love." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potpink" -/obj/item/slimepotion/lovepotion/attack(mob/living/love_target, mob/user) +/obj/item/slimepotion/lovepotion/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + var/mob/living/love_target = interacting_with if(!isliving(love_target) || love_target.stat == DEAD) to_chat(user, span_warning("The love potion only works on living things, sicko!")) - return ..() + return ITEM_INTERACT_BLOCKING if(ismegafauna(love_target)) to_chat(user, span_warning("The love potion does not work on beings of pure evil!")) - return ..() + return ITEM_INTERACT_BLOCKING if(user == love_target) to_chat(user, span_warning("You can't drink the love potion. What are you, a narcissist?")) - return ..() + return ITEM_INTERACT_BLOCKING if(love_target.has_status_effect(/datum/status_effect/in_love)) to_chat(user, span_warning("[love_target] is already lovestruck!")) - return ..() + return ITEM_INTERACT_BLOCKING love_target.visible_message(span_danger("[user] starts to feed [love_target] a love potion!"), span_userdanger("[user] starts to feed you a love potion!")) if(!do_after(user, 5 SECONDS, target = love_target)) - return + return ITEM_INTERACT_BLOCKING to_chat(user, span_notice("You feed [love_target] the love potion!")) to_chat(love_target, span_notice("You develop feelings for [user], and anyone [user.p_they()] like[user.p_s()].")) love_target.faction |= "[REF(user)]" love_target.apply_status_effect(/datum/status_effect/in_love, user) qdel(src) + return ITEM_INTERACT_SUCCESS //Pressure potion - Charged Dark Blue /obj/item/slimepotion/spaceproof name = "slime pressurization potion" desc = "A potent chemical sealant that will render any article of clothing airtight. Has two uses." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potblack" var/uses = 2 @@ -138,14 +144,12 @@ Slimecrossing Potions /obj/item/slimepotion/enhancer/max name = "extract maximizer" desc = "An extremely potent chemical mix that will maximize a slime extract's uses." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potcerulean" //Lavaproofing potion - Charged Red /obj/item/slimepotion/lavaproof name = "slime lavaproofing potion" desc = "A strange, reddish goo said to repel lava as if it were water, without reducing flammability. Has two uses." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potyellow" resistance_flags = LAVA_PROOF | FIRE_PROOF var/uses = 2 @@ -180,7 +184,6 @@ Slimecrossing Potions /obj/item/slimepotion/slime_reviver name = "slime revival potion" desc = "Infused with plasma and compressed gel, this brings dead slimes back to life." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potgrey" /obj/item/slimepotion/slime_reviver/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) @@ -211,20 +214,17 @@ Slimecrossing Potions /obj/item/slimepotion/slime/chargedstabilizer name = "slime omnistabilizer" desc = "An extremely potent chemical mix that will stop a slime from mutating completely." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potcyan" -/obj/item/slimepotion/slime/chargedstabilizer/attack(mob/living/basic/slime/stabilize_target, mob/user) - if(!isslime(stabilize_target)) - to_chat(user, span_warning("The stabilizer only works on slimes!")) - return ..() - if(stabilize_target.stat) +/obj/item/slimepotion/slime/chargedstabilizer/interact_with_slime(mob/living/basic/slime/interacting_slime, mob/living/user, list/modifiers) + if(interacting_slime.stat) to_chat(user, span_warning("The slime is dead!")) - return - if(stabilize_target.mutation_chance == 0) + return ITEM_INTERACT_BLOCKING + if(interacting_slime.mutation_chance == 0) to_chat(user, span_warning("The slime already has no chance of mutating!")) - return + return ITEM_INTERACT_BLOCKING to_chat(user, span_notice("You feed the slime the omnistabilizer. It will not mutate this cycle!")) - stabilize_target.mutation_chance = 0 + interacting_slime.mutation_chance = 0 qdel(src) + return ITEM_INTERACT_SUCCESS diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 3dd92891f511..5b08cd876c3b 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -98,34 +98,39 @@ status_type = STATUS_EFFECT_UNIQUE duration = STATUS_EFFECT_PERMANENT //Will remove self when block breaks. alert_type = /atom/movable/screen/alert/status_effect/freon/stasis + tick_interval = STATUS_EFFECT_NO_TICK /// The cube we will place our mob into. var/obj/structure/ice_stasis/cube /// Whether or not this version of the status effect can be resisted out of. var/resistable = TRUE /datum/status_effect/frozenstasis/on_apply() - if(resistable) - RegisterSignal(owner, COMSIG_LIVING_RESIST, PROC_REF(breakCube)) cube = new /obj/structure/ice_stasis(get_turf(owner)) owner.forceMove(cube) + RegisterSignal(cube, COMSIG_QDELETING, PROC_REF(clear_effect)) + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(has_escaped)) + if(resistable) + RegisterSignal(owner, COMSIG_LIVING_RESIST, PROC_REF(clear_effect)) ADD_TRAIT(owner, TRAIT_GODMODE, TRAIT_STATUS_EFFECT(id)) - return ..() + return TRUE -/datum/status_effect/frozenstasis/tick(seconds_between_ticks) - if(!cube || owner.loc != cube) - owner.remove_status_effect(src) +/datum/status_effect/frozenstasis/proc/clear_effect(...) + SIGNAL_HANDLER + + qdel(src) -/datum/status_effect/frozenstasis/proc/breakCube() +/datum/status_effect/frozenstasis/proc/has_escaped(...) SIGNAL_HANDLER - owner.remove_status_effect(src) + if(owner.loc != cube) + qdel(src) /datum/status_effect/frozenstasis/on_remove() - if(cube) - qdel(cube) REMOVE_TRAIT(owner, TRAIT_GODMODE, TRAIT_STATUS_EFFECT(id)) - if(resistable) - UnregisterSignal(owner, COMSIG_LIVING_RESIST) + UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) + UnregisterSignal(owner, COMSIG_LIVING_RESIST) + UnregisterSignal(cube, COMSIG_QDELETING) + QDEL_NULL(cube) /datum/status_effect/frozenstasis/irresistable resistable = FALSE @@ -182,10 +187,10 @@ /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) + need_mob_update = owner.adjust_tox_loss(1, updating_health = FALSE) + need_mob_update += owner.adjust_oxy_loss(1, updating_health = FALSE) + need_mob_update += owner.adjust_brute_loss(1, updating_health = FALSE) + need_mob_update += owner.adjust_fire_loss(1, updating_health = FALSE) if(need_mob_update) owner.updatehealth() owner.color = "#007BA7" @@ -193,7 +198,8 @@ /atom/movable/screen/alert/status_effect/bloodchill name = "Bloodchilled" desc = "You feel a shiver down your spine after getting hit with a glob of cold blood. You'll move slower and get frostbite for a while!" - icon_state = "bloodchill" + use_user_hud_icon = TRUE + overlay_state = "bloodchill" /datum/status_effect/bloodchill id = "bloodchill" @@ -206,7 +212,7 @@ /datum/status_effect/bloodchill/tick(seconds_between_ticks) if(prob(50)) - owner.adjustFireLoss(2) + owner.adjust_fire_loss(2) /datum/status_effect/bloodchill/on_remove() owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill) @@ -222,7 +228,7 @@ /datum/status_effect/bonechill/tick(seconds_between_ticks) if(prob(50)) - owner.adjustFireLoss(1) + owner.adjust_fire_loss(1) owner.set_jitter_if_lower(6 SECONDS) owner.adjust_bodytemperature(-10) if(ishuman(owner)) @@ -231,10 +237,12 @@ /datum/status_effect/bonechill/on_remove() owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill) + /atom/movable/screen/alert/status_effect/bonechill name = "Bonechilled" desc = "You feel a shiver down your spine after hearing the haunting noise of bone rattling. You'll move slower and get frostbite for a while!" - icon_state = "bloodchill" + use_user_hud_icon = TRUE + overlay_state = "bloodchill" /datum/status_effect/rebreathing id = "rebreathing" @@ -242,7 +250,7 @@ alert_type = null /datum/status_effect/rebreathing/tick(seconds_between_ticks) - owner.adjustOxyLoss(-6, 0) //Just a bit more than normal breathing. + owner.adjust_oxy_loss(-6, 0) //Just a bit more than normal breathing. /////////////////////////////////////////////////////// //////////////////CONSUMING EXTRACTS/////////////////// @@ -518,17 +526,17 @@ healed_last_tick = FALSE var/need_mob_update = FALSE - if(owner.getBruteLoss() > 0) - need_mob_update += owner.adjustBruteLoss(-0.2, updating_health = FALSE) + if(owner.get_brute_loss() > 0) + need_mob_update += owner.adjust_brute_loss(-0.2, updating_health = FALSE) healed_last_tick = TRUE - if(owner.getFireLoss() > 0) - need_mob_update += owner.adjustFireLoss(-0.2, updating_health = FALSE) + if(owner.get_fire_loss() > 0) + need_mob_update += owner.adjust_fire_loss(-0.2, updating_health = FALSE) healed_last_tick = TRUE - if(owner.getToxLoss() > 0) + if(owner.get_tox_loss() > 0) // Forced, so slimepeople are healed as well. - need_mob_update += owner.adjustToxLoss(-0.2, updating_health = FALSE, forced = TRUE) + need_mob_update += owner.adjust_tox_loss(-0.2, updating_health = FALSE, forced = TRUE) healed_last_tick = TRUE if(need_mob_update) @@ -595,7 +603,7 @@ return ..() cooldown = max_cooldown var/list/batteries = list() - for(var/obj/item/stock_parts/power_store/C in owner.get_all_cells()) + for(var/obj/item/stock_parts/power_store/C in assoc_to_values(owner.get_all_cells())) if(C.charge < C.maxcharge) batteries += C if(batteries.len) @@ -712,12 +720,12 @@ if(healthcheck && (healthcheck - owner.health) > 5) owner.visible_message(span_warning("[linked_extract] notices the sudden change in [owner]'s physical health, and activates!")) do_sparks(5,FALSE,owner) - var/F = find_safe_turf(zlevel = owner.z, extended_safety_checks = TRUE) + var/turf/emergency_turf = find_safe_turf(owner.z, extended_safety_checks = TRUE) var/range = 0 - if(!F) - F = get_turf(owner) + if(!emergency_turf) + emergency_turf = get_turf(owner) range = 50 - if(do_teleport(owner, F, range, channel = TELEPORT_CHANNEL_BLUESPACE)) + if(do_teleport(owner, emergency_turf, range, channel = TELEPORT_CHANNEL_BLUESPACE)) to_chat(owner, span_notice("[linked_extract] will take some time to re-align you on the bluespace axis.")) do_sparks(5,FALSE,owner) owner.apply_status_effect(/datum/status_effect/bluespacestabilization) @@ -751,11 +759,17 @@ var/typepath = owner.type clone = new typepath(owner.drop_location()) if(iscarbon(owner) && iscarbon(clone)) - var/mob/living/carbon/carbon_owner = owner - var/mob/living/carbon/carbon_clone = clone - carbon_clone.real_name = carbon_owner.real_name - carbon_owner.dna.copy_dna(carbon_clone.dna, COPY_DNA_SE|COPY_DNA_SPECIES) - carbon_clone.updateappearance(mutcolor_update = TRUE) + var/mob/living/carbon/human/human_owner = owner + var/mob/living/carbon/human/human_clone = clone + human_clone.physique = human_owner.physique + human_clone.real_name = human_owner.real_name + human_clone.age = human_owner.age + human_clone.voice = human_owner.voice + human_clone.voice_filter = human_owner.voice_filter + for(var/datum/quirk/original_quirks as anything in human_owner.quirks) + human_clone.add_quirk(original_quirks.type, add_unique = FALSE, announce = FALSE) + human_owner.dna.copy_dna(human_clone.dna, COPY_DNA_SE|COPY_DNA_SPECIES) + human_clone.updateappearance(mutcolor_update = TRUE) return ..() /datum/status_effect/stabilized/cerulean/tick(seconds_between_ticks) @@ -994,11 +1008,11 @@ return var/list/healing_types = list() - if(owner.getBruteLoss() > 0) + if(owner.get_brute_loss() > 0) healing_types += BRUTE - if(owner.getFireLoss() > 0) + if(owner.get_fire_loss() > 0) healing_types += BURN - if(owner.getToxLoss() > 0) + if(owner.get_tox_loss() > 0) healing_types += TOX if(length(healing_types)) diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index c34e07ca4f1a..b2fa0594772a 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -110,13 +110,13 @@ Slimecrossing Weapons return FALSE charge_timer = 0 var/mob/living/M = loc - if(istype(M) && HAS_TRAIT(M, TRAIT_NOBLOOD) && M.stat == CONSCIOUS) - charges ++ + if(istype(M) && !CAN_HAVE_BLOOD(M) && M.stat == CONSCIOUS) + charges++ M.apply_damage(5, BRUTE) else - if(istype(M) && M.blood_volume >= 20) + if(istype(M) && M.get_blood_volume() >= 20) charges++ - M.blood_volume -= 20 + M.adjust_blood_volume(-20) if(charges == 1) recharge_newshot() return TRUE diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index f114d3ad55da..6977d4ca8e64 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -100,7 +100,7 @@ Burning extracts: if(istype(C)) C.electrocute_act(25,src) else - M.adjustFireLoss(25) + M.adjust_fire_loss(25) to_chat(M, span_danger("You feel a sharp electrical pulse!")) ..() diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index 492e0e2fdc02..22c645ace717 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -59,28 +59,29 @@ Consuming extracts: /obj/item/slime_cookie/proc/do_effect(mob/living/M, mob/user) return -/obj/item/slime_cookie/attack(mob/living/M, mob/user) +/obj/item/slime_cookie/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isliving(interacting_with)) + return NONE + var/mob/living/living_mob = interacting_with var/fed = FALSE - if(M == user) - M.visible_message(span_notice("[user] eats [src]!"), span_notice("You eat [src].")) + if(living_mob == user) + living_mob.visible_message(span_notice("[user] eats [src]!"), span_notice("You eat [src].")) fed = TRUE else - M.visible_message(span_danger("[user] tries to force [M] to eat [src]!"), span_userdanger("[user] tries to force you to eat [src]!")) - if(do_after(user, 2 SECONDS, target = M)) + living_mob.visible_message(span_danger("[user] tries to force [living_mob] to eat [src]!"), span_userdanger("[user] tries to force you to eat [src]!")) + if(do_after(user, 2 SECONDS, target = living_mob)) fed = TRUE - M.visible_message(span_danger("[user] forces [M] to eat [src]!"), span_warning("[user] forces you to eat [src].")) + living_mob.visible_message(span_danger("[user] forces [living_mob] to eat [src]!"), span_warning("[user] forces you to eat [src].")) if(fed) - var/mob/living/carbon/human/H = M - - if(!istype(H) || !HAS_TRAIT(H, TRAIT_AGEUSIA)) - to_chat(M, span_notice("Tastes like [taste].")) - playsound(get_turf(M), 'sound/items/eatfood.ogg', 20, TRUE) + if(!HAS_TRAIT(living_mob, TRAIT_AGEUSIA)) + to_chat(living_mob, span_notice("You can taste [taste].")) + playsound(get_turf(living_mob), 'sound/items/eatfood.ogg', 20, TRUE) if(nutrition) - M.reagents.add_reagent(/datum/reagent/consumable/nutriment,nutrition) - do_effect(M, user) + living_mob.reagents.add_reagent(/datum/reagent/consumable/nutriment, nutrition) + do_effect(living_mob, user) qdel(src) - return - ..() + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING /obj/item/slimecross/consuming/grey colour = SLIME_TYPE_GREY @@ -121,11 +122,11 @@ Consuming extracts: /obj/item/slime_cookie/purple/do_effect(mob/living/M, mob/user) 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.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) + need_mob_update += M.adjust_brute_loss(-5, updating_health = FALSE) + need_mob_update += M.adjust_fire_loss(-5, updating_health = FALSE) + need_mob_update += M.adjust_tox_loss(-5, updating_health = FALSE, forced = TRUE) //To heal slimepeople. + need_mob_update += M.adjust_oxy_loss(-5, updating_health = FALSE) + need_mob_update += M.adjust_organ_loss(ORGAN_SLOT_BRAIN, -5) if(need_mob_update) M.updatehealth() @@ -346,7 +347,7 @@ Consuming extracts: playsound(get_turf(M), 'sound/effects/splat.ogg', 10, TRUE) if(iscarbon(M)) var/mob/living/carbon/C = M - C.blood_volume += 25 //Half a vampire drain. + C.adjust_blood_volume(25) //Half a vampire drain. /obj/item/slimecross/consuming/green colour = SLIME_TYPE_GREEN diff --git a/code/modules/research/xenobiology/crossbreeding/prismatic.dm b/code/modules/research/xenobiology/crossbreeding/prismatic.dm index 647711192afe..0f35588ebd58 100644 --- a/code/modules/research/xenobiology/crossbreeding/prismatic.dm +++ b/code/modules/research/xenobiology/crossbreeding/prismatic.dm @@ -115,7 +115,7 @@ Prismatic extracts: 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 + var/newcolor = tgui_color_picker(user, "Choose the slime color:", "Color change", paintcolor) if(user.get_active_held_item() != src || user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) return if(!newcolor) diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 7077b7a7b362..4cc1784b8d00 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -87,9 +87,9 @@ Regenerative extracts: /obj/item/slimecross/regenerative/yellow/core_effect(mob/living/target, mob/user) var/list/batteries = list() - for(var/obj/item/stock_parts/power_store/C in target.get_all_cells()) - if(C.charge < C.maxcharge) - batteries += C + for(var/obj/item/stock_parts/power_store/cell in assoc_to_values(target.get_all_cells())) + if(cell.charge < cell.maxcharge) + batteries += cell if(batteries.len) var/obj/item/stock_parts/power_store/ToCharge = pick(batteries) ToCharge.charge = ToCharge.maxcharge @@ -254,9 +254,9 @@ Regenerative extracts: carbon_dummy.real_name = carbon_target.real_name carbon_target.dna.copy_dna(carbon_dummy.dna, COPY_DNA_SE|COPY_DNA_SPECIES) carbon_dummy.updateappearance(mutcolor_update = TRUE) - dummy.adjustBruteLoss(target.getBruteLoss()) - dummy.adjustFireLoss(target.getFireLoss()) - dummy.adjustToxLoss(target.getToxLoss()) + dummy.adjust_brute_loss(target.get_brute_loss()) + dummy.adjust_fire_loss(target.get_fire_loss()) + dummy.adjust_tox_loss(target.get_tox_loss()) dummy.death() /obj/item/slimecross/regenerative/lightpink diff --git a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm index 6fb3f8c7c9dc..e54e245c216c 100644 --- a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm +++ b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm @@ -32,28 +32,34 @@ Self-sustaining extracts: return ..() /obj/item/autoslime/attack_self(mob/user) - var/reagentselect = tgui_input_list(user, "Reagent the extract will produce.", "Self-sustaining Reaction", sort_list(extract.activate_reagents, GLOBAL_PROC_REF(cmp_typepaths_asc))) - if(isnull(reagentselect)) + var/list/slime_reactions = GLOB.slime_extract_auto_activate_reactions[extract.type] + if(isnull(slime_reactions)) return - var/amount = 5 - var/secondary - if (user.get_active_held_item() != src || user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + var/list/choices = list() + for(var/datum/chemical_reaction/slime/recipe as anything in slime_reactions) + var/list/req_chem_names = list() + for(var/datum/reagent/chem as anything in recipe.required_reagents) + req_chem_names += chem.name + var/choice = english_list(req_chem_names, and_text = ", ") + choices[choice] = recipe + + var/selectName = tgui_input_list(user, "Reagent(s) the extract will produce.", "Self-sustaining Reaction", choices) + if(isnull(selectName)) + return + + var/datum/chemical_reaction/slime/recipeselect = choices[selectName] + if(isnull(recipeselect)) return - if(!reagentselect) + + if (!user.is_holding(src) || !can_interact(user)) return - if(reagentselect == "lesser plasma") - amount = 4 - reagentselect = /datum/reagent/toxin/plasma - if(reagentselect == "holy water and uranium") - reagentselect = /datum/reagent/water/holywater - secondary = /datum/reagent/uranium + extract.forceMove(user.drop_location()) qdel(src) user.put_in_active_hand(extract) - extract.reagents.add_reagent(reagentselect,amount) - if(secondary) - extract.reagents.add_reagent(secondary,amount) + + extract.auto_activate_reaction(recipeselect) /obj/item/autoslime/examine(mob/user) . = ..() diff --git a/code/modules/research/xenobiology/vatgrowing/microscope.dm b/code/modules/research/xenobiology/vatgrowing/microscope.dm index d96f577db669..9eb78f17a5a7 100644 --- a/code/modules/research/xenobiology/vatgrowing/microscope.dm +++ b/code/modules/research/xenobiology/vatgrowing/microscope.dm @@ -3,6 +3,7 @@ desc = "A simple microscope, allowing you to examine micro-organisms." icon = 'icons/obj/science/vatgrowing.dmi' icon_state = "microscope" + custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT, /datum/material/plastic = SHEET_MATERIAL_AMOUNT) ///Analyzed dish var/obj/item/petri_dish/current_dish diff --git a/code/modules/research/xenobiology/vatgrowing/vatgrower.dm b/code/modules/research/xenobiology/vatgrowing/vatgrower.dm index 4f65a3d9240f..575a7ac3a1d7 100644 --- a/code/modules/research/xenobiology/vatgrowing/vatgrower.dm +++ b/code/modules/research/xenobiology/vatgrowing/vatgrower.dm @@ -23,7 +23,7 @@ create_reagents(reagent_volume, reagent_flags) if(use_plumbing) - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) AddComponent(/datum/component/plumbing/simple_demand) var/static/list/hovering_item_typechecks = list( diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 518adc095664..5e38d9a18a01 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -199,7 +199,7 @@ /// Validates whether the target turf can be interacted with. /obj/machinery/computer/camera_advanced/xenobio/proc/validate_turf(mob/living/user, turf/open/target_turf) - if(!GLOB.cameranet.checkTurfVis(target_turf)) + if(!SScameras.is_visible_by_cameras(target_turf)) target_turf.balloon_alert(user, "outside of view!") return FALSE @@ -262,6 +262,7 @@ if (QDELETED(food)) return food.apply_status_effect(/datum/status_effect/slime_food, user) + ADD_TRAIT(food, TRAIT_SPAWNED_MOB, INNATE_TRAIT) stored_monkeys-- stored_monkeys = round(stored_monkeys, 0.1) //Prevents rounding errors @@ -441,7 +442,7 @@ for(var/mob/living/basic/slime/potioned_slime in eye_turf) xeno_console.spit_atom(xeno_console.current_potion, eye_turf) - xeno_console.current_potion.attack(potioned_slime, living_owner) + xeno_console.current_potion.interact_with_slime(potioned_slime, living_owner) xeno_console.xeno_hud.update_potion(xeno_console.current_potion) break diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 6dda978f72d3..34eb5582c51a 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -10,7 +10,8 @@ throwforce = 0 throw_speed = 3 throw_range = 6 - grind_results = list(/datum/reagent/toxin/slimejelly = 20) + ///Can this extract still be grinded + var/can_grind = TRUE ///uses before it goes inert var/extract_uses = 1 ///deletion timer, for delayed reactions @@ -18,9 +19,11 @@ ///Which type of crossbred var/crossbreed_modification ///Reagents required for activation - var/list/activate_reagents = list() var/recurring = FALSE +/obj/item/slime_extract/grind_results() + return can_grind ? list(/datum/reagent/toxin/slimejelly = 20) : list() + /obj/item/slime_extract/examine(mob/user) . = ..() if(extract_uses > 1) @@ -62,18 +65,20 @@ * * By using a valid core on a living adult slime, then feeding it nine more of the same type, you can mutate it into more useful items. Not every slime type has an implemented core cross. */ -/obj/item/slime_extract/attack(mob/living/basic/slime/target_slime, mob/user) - if(!isslime(target_slime)) - return ..() +/obj/item/slime_extract/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + var/mob/living/basic/slime/target_slime = interacting_with + if(!istype(target_slime)) + return NONE + if(target_slime.stat) to_chat(user, span_warning("The slime is dead!")) - return + return ITEM_INTERACT_BLOCKING if(target_slime.life_stage != SLIME_LIFE_STAGE_ADULT) to_chat(user, span_warning("The slime must be an adult to cross its core!")) - return + return ITEM_INTERACT_BLOCKING if(target_slime.crossbreed_modification && target_slime.crossbreed_modification != crossbreed_modification) to_chat(user, span_warning("The slime is already being crossed with a different extract!")) - return + return ITEM_INTERACT_BLOCKING if(!target_slime.crossbreed_modification) target_slime.crossbreed_modification = crossbreed_modification @@ -85,12 +90,71 @@ if(target_slime.applied_crossbreed_amount >= SLIME_EXTRACT_CROSSING_REQUIRED) target_slime.spawn_corecross() + return ITEM_INTERACT_SUCCESS + +/** +* Effect when activated by selfsustaining crossbreed or rainbow slime +* +* * arg1 - The reaction being triggered. If null, a random reaction is picked +*/ +/obj/item/slime_extract/proc/auto_activate_reaction(datum/chemical_reaction/slime/slime_reaction = null) + if(QDELETED(src)) + return + + if(isnull(slime_reaction)) + var/list/slime_reactions = GLOB.slime_extract_auto_activate_reactions[type] + if(isnull(slime_reactions)) + return + slime_reaction = pick(slime_reactions) + + var/list/required_reagents = slime_reaction.required_reagents + for(var/datum/reagent/chem as anything in required_reagents) + reagents.add_reagent(chem, required_reagents[chem]) + +/// An assoc list of slime extracts to their allowed recipes +GLOBAL_LIST_INIT(slime_extract_auto_activate_reactions, init_slime_auto_activate_reaction_list()) + +/proc/init_slime_auto_activate_reaction_list() + var/list/recipe_list = list() + + // Only reactions with these reagent requirements are allowed to auto_activate + var/list/auto_activate_reagent_whistlist = list( + /datum/reagent/toxin/plasma, + /datum/reagent/water, + /datum/reagent/blood, + /datum/reagent/water/holywater, + /datum/reagent/uranium, + /datum/reagent/uranium/radium, + /datum/reagent/toxin/slimejelly + ) + + var/list/slime_extract_paths = subtypesof(/obj/item/slime_extract) + for(var/datum/chemical_reaction/slime/slime_reaction as anything in subtypesof(/datum/chemical_reaction/slime)) + var/recipe_extract_type = slime_reaction.required_container + if(!(recipe_extract_type in slime_extract_paths)) + continue + + var/skip = FALSE + for(var/datum/reagent/chem as anything in slime_reaction.required_reagents) + if(!(chem in auto_activate_reagent_whistlist)) + skip = TRUE + break + if(skip) + continue + + var/list/recipes = recipe_list[recipe_extract_type] + if(!recipes) + recipes = list() + recipe_list[recipe_extract_type] = recipes + recipes.Add(new slime_reaction()) + + return recipe_list + /obj/item/slime_extract/grey name = "grey slime extract" icon_state = "grey-core" crossbreed_modification = "reproductive" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/grey/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -115,7 +179,6 @@ name = "gold slime extract" icon_state = "gold-core" crossbreed_modification = "symbiont" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -146,7 +209,6 @@ name = "silver slime extract" icon_state = "silver-core" crossbreed_modification = "consuming" - activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -174,7 +236,6 @@ name = "metal slime extract" icon_state = "metal-core" crossbreed_modification = "industrial" - activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/metal/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -198,13 +259,12 @@ name = "purple slime extract" icon_state = "purple-core" crossbreed_modification = "regenerative" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/purple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) if(SLIME_ACTIVATE_MINOR) user.adjust_nutrition(50) - user.blood_volume += 50 + user.adjust_blood_volume(50) to_chat(user, span_notice("You activate [src], and your body is refilled with fresh slime jelly!")) return 150 @@ -217,7 +277,6 @@ name = "dark purple slime extract" icon_state = "dark-purple-core" crossbreed_modification = "self-sustaining" - activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/darkpurple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -240,7 +299,6 @@ name = "orange slime extract" icon_state = "orange-core" crossbreed_modification = "burning" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/orange/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -260,7 +318,6 @@ name = "yellow slime extract" icon_state = "yellow-core" crossbreed_modification = "charged" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/yellow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -275,7 +332,8 @@ if(SLIME_ACTIVATE_MAJOR) user.visible_message(span_warning("[user]'s skin starts flashing intermittently..."), span_warning("Your skin starts flashing intermittently...")) if(do_after(user, 2.5 SECONDS, target = user)) - empulse(user, 1, 2) + empulse(user, 1, 2, emp_source = src) + user.log_message("triggered EMP using [src] in [AREACOORD(src)]", LOG_GAME) user.visible_message(span_warning("[user]'s skin flashes!"), span_warning("Your skin flashes as you emit an electromagnetic pulse!")) return 600 @@ -283,7 +341,6 @@ name = "red slime extract" icon_state = "red-core" crossbreed_modification = "sanguine" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/red/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -303,7 +360,6 @@ name = "blue slime extract" icon_state = "blue-core" crossbreed_modification = "stabilized" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/blue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -322,7 +378,6 @@ name = "dark blue slime extract" icon_state = "dark-blue-core" crossbreed_modification = "chilling" - activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/darkblue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -345,7 +400,6 @@ name = "pink slime extract" icon_state = "pink-core" crossbreed_modification = "gentle" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/pink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -373,7 +427,6 @@ name = "green slime extract" icon_state = "green-core" crossbreed_modification = "mutative" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/uranium/radium) /obj/item/slime_extract/green/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -397,12 +450,11 @@ name = "light pink slime extract" icon_state = "light-pink-core" crossbreed_modification = "loyal" - activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/lightpink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) if(SLIME_ACTIVATE_MINOR) - var/obj/item/slimepotion/slime/renaming/O = new(null, 1) + var/obj/item/slimepotion/renaming/O = new(null, 1) if(!user.put_in_active_hand(O)) O.forceMove(user.drop_location()) playsound(user, 'sound/effects/splat.ogg', 50, TRUE) @@ -410,7 +462,7 @@ return 150 if(SLIME_ACTIVATE_MAJOR) - var/obj/item/slimepotion/slime/sentience/O = new(null, 1) + var/obj/item/slimepotion/sentience/O = new(null, 1) if(!user.put_in_active_hand(O)) O.forceMove(user.drop_location()) playsound(user, 'sound/effects/splat.ogg', 50, TRUE) @@ -421,7 +473,6 @@ name = "black slime extract" icon_state = "black-core" crossbreed_modification = "transformative" - activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/black/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -442,7 +493,6 @@ name = "oil slime extract" icon_state = "oil-core" crossbreed_modification = "detonating" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/oil/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -466,7 +516,6 @@ name = "adamantine slime extract" icon_state = "adamantine-core" crossbreed_modification = "crystalline" - activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/adamantine/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -496,7 +545,6 @@ name = "bluespace slime extract" icon_state = "bluespace-core" crossbreed_modification = "warping" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) var/teleport_ready = FALSE var/teleport_x = 0 var/teleport_y = 0 @@ -532,7 +580,6 @@ name = "pyrite slime extract" icon_state = "pyrite-core" crossbreed_modification = "prismatic" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/pyrite/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -559,7 +606,6 @@ name = "cerulean slime extract" icon_state = "cerulean-core" crossbreed_modification = "recurring" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/cerulean/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -579,7 +625,6 @@ name = "sepia slime extract" icon_state = "sepia-core" crossbreed_modification = "lengthened" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/sepia/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -601,7 +646,6 @@ name = "rainbow slime extract" icon_state = "rainbow-core" crossbreed_modification = "hyperchromatic" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,"lesser plasma",/datum/reagent/toxin/slimejelly,"holy water and uranium") //Curse this snowflake reagent list. /obj/item/slime_extract/rainbow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -637,49 +681,59 @@ /obj/item/slimepotion name = "slime potion" desc = "A hard yet gelatinous capsule excreted by a slime, containing mysterious substances." + icon = 'icons/obj/medical/chemical.dmi' w_class = WEIGHT_CLASS_TINY /obj/item/slimepotion/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(is_reagent_container(interacting_with)) to_chat(user, span_warning("You cannot transfer [src] to [interacting_with]! \ - It appears the potion must be given directly to a slime to absorb.") ) + It appears the potion must be given directly to a slime or other object to absorb.") ) return ITEM_INTERACT_BLOCKING return NONE +/obj/item/slimepotion/slime/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + if(isslime(interacting_with)) + return interact_with_slime(interacting_with, user, modifiers) + else + to_chat(user, span_warning("It appears [src] must be given directly to a slime to absorb.")) + return NONE + +/obj/item/slimepotion/slime/proc/interact_with_slime(mob/living/basic/slime/interacting_slime, mob/living/user, list/modifiers) + return + /obj/item/slimepotion/slime/docility name = "docility potion" desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potsilver" -/obj/item/slimepotion/slime/docility/attack(mob/living/basic/slime/target_slime, mob/user) - if(!isslime(target_slime)) - to_chat(user, span_warning("The potion only works on slimes!")) - return ..() - if(target_slime.stat) +/obj/item/slimepotion/slime/docility/interact_with_slime(mob/living/basic/slime/interacting_slime, mob/living/user, list/modifiers) + if(interacting_slime.stat) to_chat(user, span_warning("The slime is dead!")) - return - if(target_slime.ai_controller?.clear_blackboard_key(BB_SLIME_RABID)) //Stops being rabid, but doesn't become truly docile. - to_chat(target_slime, span_warning("You absorb the potion, and your rabid hunger finally settles to a normal desire to feed.")) + return ITEM_INTERACT_BLOCKING + if(interacting_slime.ai_controller?.clear_blackboard_key(BB_SLIME_RABID)) //Stops being rabid, but doesn't become truly docile. + to_chat(interacting_slime, span_warning("You absorb the potion, and your rabid hunger finally settles to a normal desire to feed.")) to_chat(user, span_notice("You feed the slime the potion, calming its rabid rage.")) - target_slime.set_default_behaviour() + interacting_slime.set_default_behaviour() qdel(src) - return - target_slime.set_pacified_behaviour() - to_chat(target_slime, span_warning("You absorb the potion and feel your intense desire to feed melt away.")) + return ITEM_INTERACT_SUCCESS + interacting_slime.set_pacified_behaviour() + to_chat(interacting_slime, span_warning("You absorb the potion and feel your intense desire to feed melt away.")) to_chat(user, span_notice("You feed the slime the potion, removing its hunger and calming it.")) var/newname = sanitize_name(tgui_input_text(user, "Would you like to give the slime a name?", "Name your new pet", "Pet Slime", MAX_NAME_LEN)) if (!newname) newname = "Pet Slime" - target_slime.name = newname - target_slime.real_name = newname + interacting_slime.name = newname + interacting_slime.real_name = newname qdel(src) + return ITEM_INTERACT_SUCCESS -/obj/item/slimepotion/slime/sentience +/obj/item/slimepotion/sentience name = "intelligence potion" desc = "A miraculous chemical mix that grants human like intelligence to living beings." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potpink" /// Are we being offered to a mob, and therefore is a ghost poll currently in progress for the sentient mob? var/being_used = FALSE @@ -687,34 +741,40 @@ /// Reason for offering potion. This will be displayed in the poll alert to ghosts. var/potion_reason -/obj/item/slimepotion/slime/sentience/examine(mob/user) +/obj/item/slimepotion/sentience/examine(mob/user) . = ..() . += span_notice("Alt-click to set potion offer reason. [potion_reason ? "Current reason: [span_warning(potion_reason)]" : null]") -/obj/item/slimepotion/slime/sentience/Initialize(mapload) +/obj/item/slimepotion/sentience/Initialize(mapload) register_context() return ..() -/obj/item/slimepotion/slime/sentience/add_context(atom/source, list/context, obj/item/held_item, mob/user) +/obj/item/slimepotion/sentience/add_context(atom/source, list/context, obj/item/held_item, mob/user) context[SCREENTIP_CONTEXT_ALT_LMB] = "Set potion offer reason" return CONTEXTUAL_SCREENTIP_SET -/obj/item/slimepotion/slime/sentience/click_alt(mob/living/user) +/obj/item/slimepotion/sentience/click_alt(mob/living/user) potion_reason = tgui_input_text(user, "Enter reason for offering potion", "Intelligence Potion", potion_reason, max_length = MAX_MESSAGE_LEN, multiline = TRUE) return CLICK_ACTION_SUCCESS -/obj/item/slimepotion/slime/sentience/attack(mob/living/dumb_mob, mob/user) - if(being_used || !isliving(dumb_mob)) - return +/obj/item/slimepotion/sentience/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + if(!isliving(interacting_with)) + return NONE + var/mob/living/dumb_mob = interacting_with + if(being_used) + return ITEM_INTERACT_BLOCKING if(dumb_mob.ckey) //only works on animals that aren't player controlled balloon_alert(user, "already sentient!") - return + return ITEM_INTERACT_BLOCKING if(dumb_mob.stat) balloon_alert(user, "it's dead!") - return + return ITEM_INTERACT_BLOCKING if(!dumb_mob.compare_sentience_type(sentience_type)) // Will also return false if not a basic or simple mob, which are the only two we want anyway balloon_alert(user, "invalid creature!") - return + return ITEM_INTERACT_BLOCKING balloon_alert(user, "offering...") being_used = TRUE var/mob/chosen_one = SSpolling.poll_ghosts_for_target( @@ -728,9 +788,10 @@ chat_text_border_icon = src, ) on_poll_concluded(user, dumb_mob, chosen_one) + return ITEM_INTERACT_SUCCESS /// Assign the chosen ghost to the mob -/obj/item/slimepotion/slime/sentience/proc/on_poll_concluded(mob/user, mob/living/dumb_mob, mob/dead/observer/ghost) +/obj/item/slimepotion/sentience/proc/on_poll_concluded(mob/user, mob/living/dumb_mob, mob/dead/observer/ghost) if(isnull(ghost)) balloon_alert(user, "try again later!") being_used = FALSE @@ -749,19 +810,19 @@ after_success(user, dumb_mob) qdel(src) -/obj/item/slimepotion/slime/sentience/proc/after_success(mob/living/user, mob/living/smart_mob) +/obj/item/slimepotion/sentience/proc/after_success(mob/living/user, mob/living/smart_mob) return -/obj/item/slimepotion/slime/sentience/nuclear +/obj/item/slimepotion/sentience/nuclear name = "syndicate intelligence potion" desc = "A miraculous chemical mix that grants human like intelligence to living beings. It has been modified with Syndicate technology to also grant an internal radio implant to the target and authenticate with identification systems." -/obj/item/slimepotion/slime/sentience/nuclear/after_success(mob/living/user, mob/living/smart_mob) +/obj/item/slimepotion/sentience/nuclear/after_success(mob/living/user, mob/living/smart_mob) var/obj/item/implant/radio/syndicate/imp = new(src) imp.implant(smart_mob, user) smart_mob.AddComponent(/datum/component/simple_access, list(ACCESS_SYNDICATE, ACCESS_MAINT_TUNNELS)) -/obj/item/slimepotion/slime/sentience/nuclear/dangerous_horse +/obj/item/slimepotion/sentience/nuclear/dangerous_horse name = "dangerous pony potion" desc = "A miraculous chemical mix that grants human like intelligence to pony beings. It has been modified with Syndicate technology to also grant an internal radio implant to the pony and authenticate with identification systems" sentience_type = SENTIENCE_PONY @@ -769,7 +830,6 @@ /obj/item/slimepotion/transference name = "consciousness transference potion" desc = "A strange slime-based chemical that, when used, allows the user to transfer their consciousness to a lesser being." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potorange" var/prompted = 0 var/animal_type = SENTIENCE_ORGANIC @@ -778,8 +838,10 @@ . = ..() if(. & ITEM_INTERACT_ANY_BLOCKER) return . + if(!isliving(interacting_with)) + return NONE var/mob/living/switchy_mob = interacting_with - if(prompted || !isliving(switchy_mob)) + if(prompted) return ITEM_INTERACT_BLOCKING if(switchy_mob.ckey) //much like sentience, these will not work on something that is already player controlled balloon_alert(user, "already sentient!") @@ -824,83 +886,72 @@ /obj/item/slimepotion/slime/steroid name = "slime steroid" desc = "A potent chemical mix that will cause a baby slime to generate more extract." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potred" -/obj/item/slimepotion/slime/steroid/attack(mob/living/basic/slime/target, mob/user) - if(!isslime(target))//If target is not a slime. - to_chat(user, span_warning("The steroid only works on baby slimes!")) - return ..() - if(target.life_stage == SLIME_LIFE_STAGE_ADULT) //Can't steroidify adults +/obj/item/slimepotion/slime/steroid/interact_with_slime(mob/living/basic/slime/interacting_slime, mob/living/user, list/modifiers) + if(interacting_slime.life_stage == SLIME_LIFE_STAGE_ADULT) //Can't steroidify adults to_chat(user, span_warning("Only baby slimes can use the steroid!")) - return - if(target.stat) + return ITEM_INTERACT_BLOCKING + if(interacting_slime.stat) to_chat(user, span_warning("The slime is dead!")) - return - if(target.cores >= 5) + return ITEM_INTERACT_BLOCKING + if(interacting_slime.cores >= 5) to_chat(user, span_warning("The slime already has the maximum amount of extract!")) - return + return ITEM_INTERACT_BLOCKING to_chat(user, span_notice("You feed the slime the steroid. It will now produce one more extract.")) - target.cores++ + interacting_slime.cores++ qdel(src) + return ITEM_INTERACT_SUCCESS /obj/item/slimepotion/enhancer name = "extract enhancer" desc = "A potent chemical mix that will give a slime extract an additional use." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potpurple" /obj/item/slimepotion/slime/stabilizer name = "slime stabilizer" desc = "A potent chemical mix that will reduce the chance of a slime mutating." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potcyan" -/obj/item/slimepotion/slime/stabilizer/attack(mob/living/basic/slime/target_slime, mob/user) - if(!isslime(target_slime)) - to_chat(user, span_warning("The stabilizer only works on slimes!")) - return ..() - if(target_slime.stat) +/obj/item/slimepotion/slime/stabilizer/interact_with_slime(mob/living/basic/slime/interacting_slime, mob/living/user, list/modifiers) + if(interacting_slime.stat) to_chat(user, span_warning("The slime is dead!")) - return - if(target_slime.mutation_chance == 0) + return ITEM_INTERACT_BLOCKING + if(interacting_slime.mutation_chance == 0) to_chat(user, span_warning("The slime already has no chance of mutating!")) - return + return ITEM_INTERACT_BLOCKING to_chat(user, span_notice("You feed the slime the stabilizer. It is now less likely to mutate.")) - target_slime.mutation_chance = clamp(target_slime.mutation_chance-15,0,100) + interacting_slime.mutation_chance = clamp(interacting_slime.mutation_chance-15,0,100) qdel(src) + return ITEM_INTERACT_SUCCESS /obj/item/slimepotion/slime/mutator name = "slime mutator" desc = "A potent chemical mix that will increase the chance of a slime mutating." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potgreen" -/obj/item/slimepotion/slime/mutator/attack(mob/living/basic/slime/target_slime, mob/user) - if(!isslime(target_slime)) - to_chat(user, span_warning("The mutator only works on slimes!")) - return ..() - if(target_slime.stat) +/obj/item/slimepotion/slime/mutator/interact_with_slime(mob/living/basic/slime/interacting_slime, mob/living/user, list/modifiers) + if(interacting_slime.stat) to_chat(user, span_warning("The slime is dead!")) - return - if(target_slime.mutator_used) + return ITEM_INTERACT_BLOCKING + if(interacting_slime.mutator_used) to_chat(user, span_warning("This slime has already consumed a mutator, any more would be far too unstable!")) - return - if(target_slime.mutation_chance == 100) + return ITEM_INTERACT_BLOCKING + if(interacting_slime.mutation_chance == 100) to_chat(user, span_warning("The slime is already guaranteed to mutate!")) - return + return ITEM_INTERACT_BLOCKING to_chat(user, span_notice("You feed the slime the mutator. It is now more likely to mutate.")) - target_slime.mutation_chance = clamp(target_slime.mutation_chance+12,0,100) - target_slime.mutator_used = TRUE + interacting_slime.mutation_chance = clamp(interacting_slime.mutation_chance+12,0,100) + interacting_slime.mutator_used = TRUE qdel(src) + return ITEM_INTERACT_SUCCESS /obj/item/slimepotion/speed name = "slime speed potion" desc = "A potent chemical mix that will remove the slowdown from any item." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potred" /obj/item/slimepotion/speed/interact_with_atom(obj/interacting_with, mob/living/user, list/modifiers) @@ -909,7 +960,7 @@ return . if(!isobj(interacting_with)) to_chat(user, span_warning("The potion can only be used on objects!")) - return ITEM_INTERACT_BLOCKING + return NONE if(HAS_TRAIT(interacting_with, TRAIT_SPEED_POTIONED)) to_chat(user, span_warning("[interacting_with] can't be made any faster!")) @@ -941,7 +992,6 @@ /obj/item/slimepotion/fireproof name = "slime chill potion" desc = "A potent chemical mix that will fireproof any article of clothing. Has three uses." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potblue" resistance_flags = FIRE_PROOF var/uses = 3 @@ -956,7 +1006,7 @@ var/obj/item/clothing/clothing = interacting_with if(!istype(clothing)) to_chat(user, span_warning("The potion can only be used on clothing!")) - return ITEM_INTERACT_BLOCKING + return NONE if(clothing.max_heat_protection_temperature >= FIRE_IMMUNITY_MAX_TEMP_PROTECT) to_chat(user, span_warning("The [clothing] is already fireproof!")) return ITEM_INTERACT_BLOCKING @@ -975,80 +1025,98 @@ /obj/item/slimepotion/genderchange name = "gender change potion" desc = "An interesting chemical mix that changes the biological gender of what its applied to. Cannot be used on things that lack gender entirely." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potrainbow" -/obj/item/slimepotion/genderchange/attack(mob/living/L, mob/user) - if(!istype(L) || L.stat == DEAD) +/obj/item/slimepotion/genderchange/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + if(!isliving(interacting_with)) + return NONE + var/mob/living/living_mob = interacting_with + if(living_mob.stat == DEAD) to_chat(user, span_warning("The potion can only be used on living things!")) - return + return ITEM_INTERACT_BLOCKING - if(L.gender != MALE && L.gender != FEMALE) + if(living_mob.gender != MALE && living_mob.gender != FEMALE) to_chat(user, span_warning("The potion can only be used on gendered things!")) - return + return ITEM_INTERACT_BLOCKING - if(L.gender == MALE) - L.gender = FEMALE - L.visible_message(span_boldnotice("[L] suddenly looks more feminine!"), span_boldwarning("You suddenly feel more feminine!")) + if(living_mob.gender == MALE) + living_mob.gender = FEMALE + living_mob.visible_message(span_boldnotice("[living_mob] suddenly looks more feminine!"), span_boldwarning("You suddenly feel more feminine!")) else - L.gender = MALE - L.visible_message(span_boldnotice("[L] suddenly looks more masculine!"), span_boldwarning("You suddenly feel more masculine!")) - L.regenerate_icons() + living_mob.gender = MALE + living_mob.visible_message(span_boldnotice("[living_mob] suddenly looks more masculine!"), span_boldwarning("You suddenly feel more masculine!")) + living_mob.regenerate_icons() qdel(src) + return ITEM_INTERACT_SUCCESS -/obj/item/slimepotion/slime/renaming +/obj/item/slimepotion/renaming name = "renaming potion" desc = "A potion that allows a self-aware being to change what name it subconsciously presents to the world." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potbrown" var/being_used = FALSE -/obj/item/slimepotion/slime/renaming/attack(mob/living/M, mob/user) - if(being_used || !ismob(M)) - return - if(!M.ckey) //only works on animals that aren't player controlled - to_chat(user, span_warning("[M] is not self aware, and cannot pick its own name.")) - return +/obj/item/slimepotion/renaming/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + if(!isliving(interacting_with)) + return NONE + var/mob/living/renaming_mob = interacting_with + if(being_used) + return ITEM_INTERACT_BLOCKING + if(!renaming_mob.ckey) //only works on animals that aren't player controlled + to_chat(user, span_warning("[renaming_mob] is not self aware, and cannot pick its own name.")) + return ITEM_INTERACT_BLOCKING being_used = TRUE to_chat(user, span_notice("You offer [src] to [user]...")) - var/new_name = sanitize_name(tgui_input_text(M, "What would you like your name to be?", "Input a name", M.real_name, MAX_NAME_LEN)) + var/new_name = sanitize_name(tgui_input_text(renaming_mob, "What would you like your name to be?", "Input a name", renaming_mob.real_name, MAX_NAME_LEN)) - if(!new_name || QDELETED(src) || QDELETED(M) || new_name == M.real_name || !M.Adjacent(user)) + if(!new_name || QDELETED(src) || QDELETED(renaming_mob) || new_name == renaming_mob.real_name || !renaming_mob.Adjacent(user)) being_used = FALSE - return + return ITEM_INTERACT_BLOCKING - M.visible_message(span_notice("[span_name("[M]")] has a new name, [span_name("[new_name]")]."), span_notice("Your old name of [span_name("[M.real_name]")] fades away, and your new name [span_name("[new_name]")] anchors itself in your mind.")) - message_admins("[ADMIN_LOOKUPFLW(user)] used [src] on [ADMIN_LOOKUPFLW(M)], letting them rename themselves into [new_name].") - user.log_message("used [src] on [key_name(M)], letting them rename themselves into [new_name].", LOG_GAME) + renaming_mob.visible_message(span_notice("[span_name("[renaming_mob]")] has a new name, [span_name("[new_name]")]."), span_notice("Your old name of [span_name("[renaming_mob.real_name]")] fades away, and your new name [span_name("[new_name]")] anchors itself in your mind.")) + message_admins("[ADMIN_LOOKUPFLW(user)] used [src] on [ADMIN_LOOKUPFLW(renaming_mob)], letting them rename themselves into [new_name].") + user.log_message("used [src] on [key_name(renaming_mob)], letting them rename themselves into [new_name].", LOG_GAME) // pass null as first arg to not update records or ID/PDA - M.fully_replace_character_name(null, new_name) + renaming_mob.fully_replace_character_name(null, new_name) qdel(src) + return ITEM_INTERACT_SUCCESS -/obj/item/slimepotion/slime/slimeradio +/obj/item/slimepotion/slimeradio name = "bluespace radio potion" desc = "A strange chemical that grants those who ingest it the ability to broadcast and receive subscape radio waves." - icon = 'icons/obj/medical/chemical.dmi' icon_state = "potbluespace" -/obj/item/slimepotion/slime/slimeradio/attack(mob/living/radio_head, mob/user) - if(!isanimal_or_basicmob(radio_head)) - to_chat(user, span_warning("[radio_head] is too complex for the potion!")) - return +/obj/item/slimepotion/slimeradio/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + if(!isliving(interacting_with)) + return NONE + if(!isanimal_or_basicmob(interacting_with)) + to_chat(user, span_warning("[interacting_with] is too complex for the potion!")) + return ITEM_INTERACT_BLOCKING + var/mob/living/radio_head = interacting_with if(radio_head.stat) to_chat(user, span_warning("[radio_head] is dead!")) - return + return ITEM_INTERACT_BLOCKING to_chat(user, span_notice("You feed the potion to [radio_head].")) to_chat(radio_head, span_notice("Your mind tingles as you are fed the potion. You can hear radio waves now!")) var/obj/item/implant/radio/slime/imp = new(src) imp.implant(radio_head, user) qdel(src) + return ITEM_INTERACT_SUCCESS ///Definitions for slime products that don't have anywhere else to go (Floor tiles, blueprints). diff --git a/code/modules/reta/reta_debug.dm b/code/modules/reta/reta_debug.dm index 788c303c0cfc..32c0660455e5 100644 --- a/code/modules/reta/reta_debug.dm +++ b/code/modules/reta/reta_debug.dm @@ -72,51 +72,49 @@ ADMIN_VERB(reta_manual_trigger, R_ADMIN, "RETA Door Access", "Manually trigger R message_admins("RETA access granted successfully: [english_list(granted_depts)] personnel now have [calling_dept] access. Total eligible cards: [total_eligible_cards]") // Send department announcement like the normal system - var/caller_info = " (Called by CENTCOM)" - var/enhanced_location = "[calling_dept][caller_info]" + var/caller_info = "(Called by CENTCOM)" // Send announcements to all successfully granted departments for(var/dept in granted_depts) switch(dept) if("Security") - aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = enhanced_location), null, list(RADIO_CHANNEL_SECURITY), "Security") + aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = calling_dept, "CALLER" = caller_info), null, list(RADIO_CHANNEL_SECURITY), "Security") if("Engineering") - aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = enhanced_location), null, list(RADIO_CHANNEL_ENGINEERING), "Engineering") + aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = calling_dept, "CALLER" = caller_info), null, list(RADIO_CHANNEL_ENGINEERING), "Engineering") if("Medical") - aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = enhanced_location), null, list(RADIO_CHANNEL_MEDICAL), "Medical") + aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = calling_dept, "CALLER" = caller_info), null, list(RADIO_CHANNEL_MEDICAL), "Medical") if("Science") - aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = enhanced_location), null, list(RADIO_CHANNEL_SCIENCE), "Science") + aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = calling_dept, "CALLER" = caller_info), null, list(RADIO_CHANNEL_SCIENCE), "Science") if("Service") - aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = enhanced_location), null, list(RADIO_CHANNEL_SERVICE), "Service") + aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = calling_dept, "CALLER" = caller_info), null, list(RADIO_CHANNEL_SERVICE), "Service") if("Command") - aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = enhanced_location), null, list(RADIO_CHANNEL_COMMAND), "Command") + aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = calling_dept, "CALLER" = caller_info), null, list(RADIO_CHANNEL_COMMAND), "Command") if("Cargo") - aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = enhanced_location), null, list(RADIO_CHANNEL_SUPPLY), "Cargo") + aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = calling_dept, "CALLER" = caller_info), null, list(RADIO_CHANNEL_SUPPLY), "Cargo") if("Mining") - aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = enhanced_location), null, list(RADIO_CHANNEL_SUPPLY), "Mining") + aas_config_announce(/datum/aas_config_entry/rc_emergency, list("LOCATION" = calling_dept, "CALLER" = caller_info), null, list(RADIO_CHANNEL_SUPPLY), "Mining") // Send confirmation to the calling department about who has been given access - var/calling_message = "RETA activated[caller_info]. The following now have temporary door access: [english_list(granted_depts)]." - - // Get an announcement system to send simple radio messages - var/obj/machinery/announcement_system/announcer = get_announcement_system(null, null, list(RADIO_CHANNEL_COMMON)) - if(announcer) - switch(calling_dept) - if("Security") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_SECURITY) - if("Engineering") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_ENGINEERING) - if("Medical") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_MEDICAL) - if("Science") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_SCIENCE) - if("Service") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_SERVICE) - if("Command") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_COMMAND) - if("Cargo") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_SUPPLY) - if("Mining") - announcer.radio.talk_into(announcer, calling_message, RADIO_CHANNEL_SUPPLY) + var/grantee = english_list(granted_depts) + var/list/target_channels = list() + switch(calling_dept) + if("Security") + target_channels += RADIO_CHANNEL_SECURITY + if("Engineering") + target_channels += RADIO_CHANNEL_ENGINEERING + if("Medical") + target_channels += RADIO_CHANNEL_MEDICAL + if("Science") + target_channels += RADIO_CHANNEL_SCIENCE + if("Service") + target_channels += RADIO_CHANNEL_SERVICE + if("Command") + target_channels += RADIO_CHANNEL_COMMAND + if("Cargo") + target_channels += RADIO_CHANNEL_SUPPLY + if("Mining") + target_channels += RADIO_CHANNEL_SUPPLY + + aas_config_announce(/datum/aas_config_entry/rc_reta_announcement, list("GRANTEE" = grantee, "CALLER" = caller_info), null, target_channels) else message_admins("RETA access grant failed for all departments.") diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index adb62496d8bb..a115c28538a3 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -26,6 +26,8 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) /obj/machinery/keycard_auth/Initialize(mapload) . = ..() activated = GLOB.keycard_events.addEvent("triggerEvent", CALLBACK(src, PROC_REF(triggerEvent))) + if(mapload) + find_and_mount_on_atom() /obj/machinery/keycard_auth/Destroy() GLOB.keycard_events.clearEvent("triggerEvent", activated) @@ -162,10 +164,6 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth/wall_mounted, 26) -/obj/machinery/keycard_auth/wall_mounted/Initialize(mapload) - . = ..() - find_and_hang_on_wall() - GLOBAL_VAR_INIT(emergency_access, FALSE) /proc/make_maint_all_access() for(var/area/station/maintenance/area in GLOB.areas) diff --git a/code/modules/shuttle/misc/special.dm b/code/modules/shuttle/misc/special.dm index a7f971363823..6b635fdec831 100644 --- a/code/modules/shuttle/misc/special.dm +++ b/code/modules/shuttle/misc/special.dm @@ -7,8 +7,6 @@ name = "Energy Cannon" desc = "A heavy duty industrial laser." icon = 'icons/obj/machines/engine/singularity.dmi' - icon_state = "emitter_+a" - base_icon_state = "emitter_+a" anchored = TRUE density = TRUE resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF @@ -386,7 +384,7 @@ for(var/obj/I in counted_money) qdel(I) if(!check_times[AM] || check_times[AM] < world.time) //Let's not spam the message - to_chat(AM, span_notice("[payees[AM]] cr received. You need [threshold-payees[AM]] cr more.")) + to_chat(AM, span_notice("[payees[AM]] [MONEY_SYMBOL] received. You need [threshold-payees[AM]] [MONEY_SYMBOL] more.")) check_times[AM] = world.time + LUXURY_MESSAGE_COOLDOWN alarm_beep() return ..() diff --git a/code/modules/shuttle/mobile_port/shuttle_move.dm b/code/modules/shuttle/mobile_port/shuttle_move.dm index 6a6cc992bdde..0397fbe14342 100644 --- a/code/modules/shuttle/mobile_port/shuttle_move.dm +++ b/code/modules/shuttle/mobile_port/shuttle_move.dm @@ -155,6 +155,9 @@ moving_atom.onShuttleMove(newT, oldT, movement_force, movement_direction, old_dock, src) //atoms moved_atoms[moving_atom] = oldT + if(move_mode & MOVE_SPECIAL) + SEND_SIGNAL(oldT, COMSIG_SHUTTLE_TURF_ON_MOVE_SPECIAL, newT, movement_force, movement_direction, old_dock, src) + /obj/docking_port/mobile/proc/cleanup_runway(obj/docking_port/stationary/new_dock, list/old_turfs, list/new_turfs, list/areas_to_move, list/underlying_areas, list/moved_atoms, rotation, movement_direction, area/fallback_area) fallback_area.afterShuttleMove(0) diff --git a/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm b/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm index 89b20e7adbc4..67b626154fff 100644 --- a/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm +++ b/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm @@ -7,10 +7,11 @@ All ShuttleMove procs go here // Called on every turf in the shuttle region, returns a bitflag for allowed movements of that turf // returns the new move_mode (based on the old) /turf/proc/fromShuttleMove(turf/newT, move_mode) - if(!(move_mode & MOVE_AREA) || !isshuttleturf(src)) - return move_mode - - return move_mode | MOVE_TURF | MOVE_CONTENTS + . = move_mode + if((move_mode & MOVE_AREA) && isshuttleturf(src)) + . |= MOVE_TURF | MOVE_CONTENTS + if(SEND_SIGNAL(src, COMSIG_SHUTTLE_TURF_SHOULD_MOVE_SPECIAL, newT, move_mode)) + . |= MOVE_SPECIAL // Called from the new turf before anything has been moved // Only gets called if fromShuttleMove returns true first @@ -238,11 +239,11 @@ All ShuttleMove procs go here . = ..() if(. & MOVE_AREA) . |= MOVE_CONTENTS - GLOB.cameranet.removeCamera(src) + SScameras.remove_camera_from_chunk(src) /obj/machinery/camera/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) . = ..() - GLOB.cameranet.addCamera(src) + SScameras.add_camera_to_chunk(src) /obj/machinery/mech_bay_recharge_port/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir) . = ..() diff --git a/code/modules/shuttle/mobile_port/variants/custom/blueprints.dm b/code/modules/shuttle/mobile_port/variants/custom/blueprints.dm index 2f3320792bfc..c37cb6cef7d5 100644 --- a/code/modules/shuttle/mobile_port/variants/custom/blueprints.dm +++ b/code/modules/shuttle/mobile_port/variants/custom/blueprints.dm @@ -104,9 +104,8 @@ if(turf_area.allow_shuttle_docking) if(!GLOB.custom_areas[turf_area] && turf_area.apc) var/obj/machinery/power/apc/apc = turf_area.apc - var/datum/component/wall_mounted/wallmount_comp = apc.GetComponent(/datum/component/wall_mounted) var/turf/apc_turf = get_turf(apc) - if(target == apc_turf || target == wallmount_comp.hanging_wall_turf) + if(target == apc_turf) holder.image_state = "red" else holder.image_state = "red" @@ -115,9 +114,8 @@ if(GLOB.custom_areas[turf_area] && HAS_TRAIT(turf_area, TRAIT_HAS_SHUTTLE_CONSTRUCTION_TURF)) if(turf_area.apc) var/obj/machinery/power/apc/apc = turf_area.apc - var/datum/component/wall_mounted/wallmount_comp = apc.GetComponent(/datum/component/wall_mounted) var/turf/apc_turf = get_turf(apc) - if(HAS_TRAIT(apc_turf, TRAIT_SHUTTLE_CONSTRUCTION_TURF) || HAS_TRAIT(wallmount_comp.hanging_wall_turf, TRAIT_SHUTTLE_CONSTRUCTION_TURF)) + if(HAS_TRAIT(apc_turf, TRAIT_SHUTTLE_CONSTRUCTION_TURF)) holder.image_state = "red" holder.regenerate_image() @@ -203,7 +201,7 @@ return new_name = apply_text_macros(new_name) var/obj/item/hitting_implement = (locate(/obj/item/reagent_containers/cup/glass/bottle) in user.held_items) || user.get_item_for_held_index(hand) - if(!user.CanReach(attacked, hitting_implement)) + if(!attacked.IsReachableBy(user, hitting_implement.reach)) user.balloon_alert(user, "out of range!") return var/obj/item/reagent_containers/cup/glass/bottle/bottle = hitting_implement @@ -702,6 +700,7 @@ base_icon_state = "shuttle_blueprints_crude" base_desc = "This is just a sheet of paper thoroughly covered in what could either be crayon or spraypaint." linked_desc = "This is just a crude doodle of a shuttle drawn on a background of what could either be crayon or spraypaint." + custom_materials = list(/datum/material/paper = HALF_SHEET_MATERIAL_AMOUNT / 2) /obj/item/shuttle_blueprints/borg name = "shuttle blueprint database" diff --git a/code/modules/shuttle/mobile_port/variants/emergency/emergency_console.dm b/code/modules/shuttle/mobile_port/variants/emergency/emergency_console.dm index ed88724c6fef..08eeef8be76e 100644 --- a/code/modules/shuttle/mobile_port/variants/emergency/emergency_console.dm +++ b/code/modules/shuttle/mobile_port/variants/emergency/emergency_console.dm @@ -104,16 +104,16 @@ if(!ID) to_chat(user, span_warning("You don't have an ID.")) - return + return . if(!(ACCESS_COMMAND in ID.access)) to_chat(user, span_warning("The access level of your card is not high enough.")) - return + return . - if (user in acted_recently) - return + if(user in acted_recently) + return . - var/old_len = authorized.len + var/old_len = length(authorized) addtimer(CALLBACK(src, PROC_REF(clear_recent_action), user), SHUTTLE_CONSOLE_ACTION_DELAY) switch(action) @@ -124,23 +124,36 @@ authorized -= ID if("abort") - if(authorized.len) - // Abort. The action for when heads are fighting over whether - // to launch early. + if(length(authorized)) + // Abort. The action for when heads are fighting over whether to launch early. authorized.Cut() . = TRUE - if((old_len != authorized.len) && !ENGINES_STARTED) - var/alert = (authorized.len > old_len) - var/repeal = (authorized.len < old_len) - var/remaining = max(0, auth_need - authorized.len) - if(authorized.len && remaining) - minor_announce("[remaining] authorizations needed until shuttle is launched early", null, alert) + var/new_len = length(authorized) + if((old_len != new_len) && !ENGINES_STARTED) + var/repeal = (new_len < old_len) + var/remaining = max(0, auth_need - new_len) + if(new_len && remaining) + priority_announce( + "[remaining] authorization\s needed until shuttle is launched early.", + "Emergency Shuttle Status", + sound = 'sound/announcer/notice/notice1.ogg', + type = ANNOUNCEMENT_TYPE_PRIORITY, + has_important_message = TRUE, + color_override = "red", + ) if(repeal) - minor_announce("Early launch authorization revoked, [remaining] authorizations needed") + priority_announce( + "Early launch authorization revoked, [remaining] authorization\s needed.", + "Emergency Shuttle Status", + sound = 'sound/announcer/notice/notice2.ogg', + type = ANNOUNCEMENT_TYPE_PRIORITY, + color_override = "blue", + ) acted_recently += user SStgui.update_user_uis(user, src) + return . /obj/machinery/computer/emergency_shuttle/proc/authorize(mob/living/user, source) var/obj/item/card/id/ID = user.get_idcard(TRUE) @@ -212,7 +225,7 @@ return CLICK_ACTION_SUCCESS /obj/machinery/computer/emergency_shuttle/proc/attempt_hijack_stage(mob/living/user) - if(!user.CanReach(src)) + if(!IsReachableBy(user)) return if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) to_chat(user, span_warning("You need your hands free before you can manipulate [src].")) diff --git a/code/modules/shuttle/mobile_port/variants/supply.dm b/code/modules/shuttle/mobile_port/variants/supply.dm index a6c5030605a1..38e305bc3498 100644 --- a/code/modules/shuttle/mobile_port/variants/supply.dm +++ b/code/modules/shuttle/mobile_port/variants/supply.dm @@ -192,18 +192,18 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( if(spawning_order.paying_account) //Someone paid out of pocket paying_for_this = spawning_order.paying_account // note this is before we increment, so this is the GOODY_FREE_SHIPPING_MAX + 1th goody to ship. also note we only increment off this step if they successfully pay the fee, so there's no way around it - if(spawning_order.pack.goody) + if(spawning_order.pack.order_flags & ORDER_GOODY) var/list/current_buyer_orders = goodies_by_buyer[spawning_order.paying_account] if(LAZYLEN(current_buyer_orders) == GOODY_FREE_SHIPPING_MAX) price = round(price + CRATE_TAX) - paying_for_this.bank_card_talk("Goody order size exceeds free shipping limit: Assessing [CRATE_TAX] credit S&H fee.") + paying_for_this.bank_card_talk("Goody order size exceeds free shipping limit: Assessing [CRATE_TAX] [MONEY_NAME_SINGULAR] S&H fee.") else paying_for_this = SSeconomy.get_dep_account(ACCOUNT_CAR) if(paying_for_this) if(!paying_for_this.adjust_money(-price, "Cargo: [spawning_order.pack.name]")) if(spawning_order.paying_account) - paying_for_this.bank_card_talk("Cargo order #[spawning_order.id] rejected due to lack of funds. Credits required: [price]") + paying_for_this.bank_card_talk("Cargo order #[spawning_order.id] rejected due to lack of funds. [MONEY_NAME_CAPITALIZED] required: [price]") if(!spawning_order.can_be_cancelled) //only if it absolutly cannot be canceled by the player do we cancel it for them SSshuttle.shopping_list -= spawning_order clean_up_orders += spawning_order @@ -212,18 +212,18 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( pack_cost = spawning_order.pack.get_cost() if(spawning_order.paying_account) paying_for_this = spawning_order.paying_account - if(spawning_order.pack.goody) + if(spawning_order.pack.order_flags & ORDER_GOODY) LAZYADD(goodies_by_buyer[spawning_order.paying_account], spawning_order) var/receiver_message = "Cargo order #[spawning_order.id] has shipped." if(spawning_order.charge_on_purchase) - receiver_message += " [price] credits have been charged to your bank account" + receiver_message += " [price] [MONEY_NAME] have been charged to your bank account" paying_for_this.bank_card_talk(receiver_message) SSeconomy.add_audit_entry(paying_for_this, price, spawning_order.pack.name) var/datum/bank_account/department/cargo = SSeconomy.get_dep_account(ACCOUNT_CAR) cargo.adjust_money(price - pack_cost) //Cargo gets the handling fee value += pack_cost - if(!spawning_order.pack.goody) //we handle goody crates below + if(!(spawning_order.pack.order_flags & ORDER_GOODY)) //we handle goody crates below var/obj/structure/closet/crate = spawning_order.generate(pick_n_take(empty_turfs)) crate.name += " - #[spawning_order.id]" @@ -231,7 +231,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( var/from_whom = paying_for_this?.account_holder || "nobody (department order)" investigate_log("Order #[spawning_order.id] ([spawning_order.pack.name], placed by [key_name(spawning_order.orderer_ckey)]), paid by [from_whom] has shipped.", INVESTIGATE_CARGO) - if(spawning_order.pack.dangerous) + if(spawning_order.pack.order_flags & ORDER_DANGEROUS) message_admins("\A [spawning_order.pack.name] ordered by [ADMIN_LOOKUPFLW(spawning_order.orderer_ckey)], paid by [from_whom] has shipped.") purchases++ @@ -275,16 +275,13 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( qdel(completed_order) var/datum/bank_account/cargo_budget = SSeconomy.get_dep_account(ACCOUNT_CAR) - investigate_log("[purchases] orders in this shipment, worth [value] credits. [cargo_budget.account_balance] credits left.", INVESTIGATE_CARGO) + investigate_log("[purchases] orders in this shipment, worth [value] [MONEY_NAME]. [cargo_budget.account_balance] [MONEY_NAME] left.", INVESTIGATE_CARGO) /// Deletes and sells the items on the shuttle /obj/docking_port/mobile/supply/proc/sell() var/datum/bank_account/cargo_budget = SSeconomy.get_dep_account(ACCOUNT_CAR) var/presale_points = cargo_budget.account_balance - if(!GLOB.exports_list.len) // No exports list? Generate it! - setupExports() - var/msg = "" var/datum/export_report/report = new @@ -299,9 +296,6 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( continue export_item_and_contents(exporting_atom, apply_elastic = TRUE, dry_run = FALSE, external_report = report) - if(report.exported_atoms) - report.exported_atoms += "." //ugh - for(var/datum/export/exported_datum in report.total_amount) var/export_text = exported_datum.total_printout(report) if(!export_text) @@ -311,7 +305,8 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( cargo_budget.adjust_money(report.total_value[exported_datum]) SSshuttle.centcom_message = msg - investigate_log("contents sold for [cargo_budget.account_balance - presale_points] credits. Contents: [report.exported_atoms ? report.exported_atoms.Join(",") + "." : "none."] Message: [SSshuttle.centcom_message || "none."]", INVESTIGATE_CARGO) + if(report.exported_atoms.len) + investigate_log("contents sold for [cargo_budget.account_balance - presale_points] [MONEY_NAME]. Contents: [report.exported_atoms.Join(",")]. Message: [msg]", INVESTIGATE_CARGO) /* Generates a box of mail depending on our exports and imports. diff --git a/code/modules/shuttle/stationary_port/port_types.dm b/code/modules/shuttle/stationary_port/port_types.dm index 047856566c2d..84a146650f01 100644 --- a/code/modules/shuttle/stationary_port/port_types.dm +++ b/code/modules/shuttle/stationary_port/port_types.dm @@ -80,8 +80,8 @@ name = "Deep Space" shuttle_id = "whiteship_away" height = 45 //Width and height need to remain in sync with the size of whiteshipdock.dmm, otherwise we'll get overflow - width = 44 - dheight = 18 + width = 45 + dheight = 14 dwidth = 18 dir = 2 shuttlekeys = list( diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index eb83e8ae139e..036aae8e099d 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -189,7 +189,7 @@ if(feedback) to_chat(owner, span_warning("You don't feel strong enough without your robe!")) return FALSE - if(!(human_owner.head?.clothing_flags & CASTING_CLOTHES) && !(human_owner.glasses?.clothing_flags & CASTING_CLOTHES)) + if(!(astype(human_owner.head, /obj/item/clothing)?.clothing_flags & CASTING_CLOTHES) && !(human_owner.glasses?.clothing_flags & CASTING_CLOTHES)) if(feedback) to_chat(owner, span_warning("You don't feel strong enough without your hat!")) return FALSE diff --git a/code/modules/spells/spell_types/aoe_spell/repulse.dm b/code/modules/spells/spell_types/aoe_spell/repulse.dm index df52547f28fd..4de1e3a93c9f 100644 --- a/code/modules/spells/spell_types/aoe_spell/repulse.dm +++ b/code/modules/spells/spell_types/aoe_spell/repulse.dm @@ -48,7 +48,7 @@ if(isliving(victim)) var/mob/living/victim_living = victim victim_living.Paralyze(10 SECONDS) - victim_living.adjustBruteLoss(5) + victim_living.adjust_brute_loss(5) to_chat(victim, span_userdanger("You're slammed into the floor by [caster]!")) else if(sparkle_path) diff --git a/code/modules/spells/spell_types/cone/cone_of_cold.dm b/code/modules/spells/spell_types/cone/cone_of_cold.dm index 9327e2c2fad4..3b8f880a842c 100644 --- a/code/modules/spells/spell_types/cone/cone_of_cold.dm +++ b/code/modules/spells/spell_types/cone/cone_of_cold.dm @@ -50,7 +50,7 @@ if(ispath(frozen_status_effect_path) && unfreeze_mob_duration > 0 SECONDS) // 0 duration = don't apply the status effect var/datum/status_effect/freeze = target_mob.apply_status_effect(frozen_status_effect_path) if(unfreeze_mob_duration != INFINITY) - freeze.duration = world.time + unfreeze_mob_duration + freeze.duration = unfreeze_mob_duration if(on_freeze_brute_damage || on_freeze_burn_damage) target_mob.take_overall_damage(on_freeze_brute_damage, on_freeze_burn_damage) diff --git a/code/modules/spells/spell_types/conjure/_conjure.dm b/code/modules/spells/spell_types/conjure/_conjure.dm index 5501f1055ca2..cfc10f3e27db 100644 --- a/code/modules/spells/spell_types/conjure/_conjure.dm +++ b/code/modules/spells/spell_types/conjure/_conjure.dm @@ -58,6 +58,7 @@ var/atom/summoned_object = new summoned_object_type(spawn_place) summoned_object.flags_1 |= ADMIN_SPAWNED_1 + ADD_TRAIT(summoned_object, TRAIT_SPAWNED_MOB, INNATE_TRAIT) if(summon_lifespan > 0) QDEL_IN(summoned_object, summon_lifespan) 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 3bbdf25fa844..95616c54360a 100644 --- a/code/modules/spells/spell_types/conjure_item/_conjure_item.dm +++ b/code/modules/spells/spell_types/conjure_item/_conjure_item.dm @@ -72,6 +72,8 @@ if(istype(mob_caster)) mob_caster.put_in_hands(created, del_on_fail = delete_on_failure) + post_created(cast_on, created) + return ..() /// Instantiates the item we're conjuring and returns it. diff --git a/code/modules/spells/spell_types/jaunt/shadow_walk.dm b/code/modules/spells/spell_types/jaunt/shadow_walk.dm index 33215acb1e92..5dea6785d045 100644 --- a/code/modules/spells/spell_types/jaunt/shadow_walk.dm +++ b/code/modules/spells/spell_types/jaunt/shadow_walk.dm @@ -48,7 +48,7 @@ playsound(get_turf(owner), 'sound/effects/nightmare_poof.ogg', 50, TRUE, -1, ignore_walls = FALSE) cast_on.visible_message(span_boldwarning("[cast_on] melts into the shadows!")) cast_on.SetAllImmobility(0) - cast_on.setStaminaLoss(0, FALSE) + cast_on.set_stamina_loss(0, FALSE) enter_jaunt(cast_on) /obj/effect/dummy/phased_mob/shadow diff --git a/code/modules/spells/spell_types/pointed/mind_transfer.dm b/code/modules/spells/spell_types/pointed/mind_transfer.dm index ddf87d3008c6..c6299a4f8752 100644 --- a/code/modules/spells/spell_types/pointed/mind_transfer.dm +++ b/code/modules/spells/spell_types/pointed/mind_transfer.dm @@ -13,7 +13,6 @@ invocation = "GIN'YU CAPAN." invocation_type = INVOCATION_WHISPER - antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND active_msg = "You prepare to swap minds with a target..." deactive_msg = "You dispel mind swap." diff --git a/code/modules/spells/spell_types/right_and_wrong.dm b/code/modules/spells/spell_types/right_and_wrong.dm index ecd4d75320e3..10203bc7bf36 100644 --- a/code/modules/spells/spell_types/right_and_wrong.dm +++ b/code/modules/spells/spell_types/right_and_wrong.dm @@ -55,8 +55,11 @@ GLOBAL_LIST_INIT(summoned_guns, list( /obj/item/gun/energy/e_gun/advtaser, /obj/item/gun/energy/e_gun/nuclear, /obj/item/gun/energy/laser, + /obj/item/gun/energy/laser/soul, + /obj/item/gun/energy/laser/pistol, + /obj/item/gun/energy/laser/assault, /obj/item/gun/energy/laser/carbine, - /obj/item/gun/energy/laser/carbine/cybersun/unrestricted, + /obj/item/gun/energy/laser/cybersun/unrestricted, /obj/item/gun/energy/laser/hellgun, /obj/item/gun/energy/laser/scatter, /obj/item/gun/energy/laser/thermal, diff --git a/code/modules/spells/spell_types/self/basic_heal.dm b/code/modules/spells/spell_types/self/basic_heal.dm index d22b38cba8be..1676fa27e625 100644 --- a/code/modules/spells/spell_types/self/basic_heal.dm +++ b/code/modules/spells/spell_types/self/basic_heal.dm @@ -27,7 +27,7 @@ span_notice("You wreath yourself in healing light!"), ) 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) + need_mob_update += cast_on.adjust_brute_loss(-brute_to_heal, updating_health = FALSE) + need_mob_update += cast_on.adjust_fire_loss(-burn_to_heal, updating_health = FALSE) if(need_mob_update) cast_on.updatehealth() diff --git a/code/modules/spells/spell_types/self/disable_tech.dm b/code/modules/spells/spell_types/self/disable_tech.dm index 6eea25d6638c..bf0feb031ff8 100644 --- a/code/modules/spells/spell_types/self/disable_tech.dm +++ b/code/modules/spells/spell_types/self/disable_tech.dm @@ -13,7 +13,7 @@ /datum/action/cooldown/spell/emp/cast(atom/cast_on) . = ..() - empulse(get_turf(cast_on), emp_heavy, emp_light) + empulse(get_turf(cast_on), emp_heavy, emp_light, emp_source = src) /datum/action/cooldown/spell/emp/disable_tech name = "Disable Tech" diff --git a/code/modules/spells/spell_types/self/rod_form.dm b/code/modules/spells/spell_types/self/rod_form.dm index 6f26ab167195..2dfe7a70e819 100644 --- a/code/modules/spells/spell_types/self/rod_form.dm +++ b/code/modules/spells/spell_types/self/rod_form.dm @@ -104,7 +104,7 @@ span_userdanger("The [src] penetrates you!"), span_danger("You hear a CLANG!"), ) - penetrated.adjustBruteLoss(70 + damage_bonus) + penetrated.adjust_brute_loss(70 + damage_bonus) /obj/effect/immovablerod/wizard/suplex_rod(mob/living/strongman) var/mob/living/wizard = our_wizard?.resolve() diff --git a/code/modules/spells/spell_types/self/sanguine_strike.dm b/code/modules/spells/spell_types/self/sanguine_strike.dm index aa753f5076e4..fd3865eac7d3 100644 --- a/code/modules/spells/spell_types/self/sanguine_strike.dm +++ b/code/modules/spells/spell_types/self/sanguine_strike.dm @@ -64,7 +64,7 @@ if(!isliving(target)) return var/mob/living/living_target = target - if(living_target.blood_volume < BLOOD_VOLUME_SURVIVE) + if(living_target.get_blood_volume() < BLOOD_VOLUME_SURVIVE) return playsound(target, 'sound/effects/wounds/crackandbleed.ogg', 100) playsound(target, 'sound/effects/magic/charge.ogg', 100) @@ -72,13 +72,11 @@ if(iscarbon(living_target)) var/mob/living/carbon/carbon_target = living_target carbon_target.spray_blood(attack_direction, 3) - living_target.blood_volume -= 50 + living_target.adjust_blood_volume(-50) if(!isliving(user)) return var/mob/living/living_user = user - //if we blind-added blood volume to the caster, non-vampire wizards could easily kill themselves by using the spell enough - if(living_user.blood_volume < BLOOD_VOLUME_MAXIMUM) - living_user.blood_volume += 50 + living_user.adjust_blood_volume(50) /// signal called from dropping the enchanted item /datum/action/cooldown/spell/sanguine_strike/proc/on_dropped(obj/item/enchanted, mob/dropper) diff --git a/code/modules/spells/spell_types/self/splattercasting_spell.dm b/code/modules/spells/spell_types/self/splattercasting_spell.dm index e76f8e3c1b9b..d3ed2daaf872 100644 --- a/code/modules/spells/spell_types/self/splattercasting_spell.dm +++ b/code/modules/spells/spell_types/self/splattercasting_spell.dm @@ -29,7 +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/human/vampire) - cast_on.blood_volume = BLOOD_VOLUME_NORMAL ///for predictable blood total amounts when the spell is first cast. + cast_on.set_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/shapeshift/_shape_status.dm b/code/modules/spells/spell_types/shapeshift/_shape_status.dm index 5074412ce288..5943a704c9bb 100644 --- a/code/modules/spells/spell_types/shapeshift/_shape_status.dm +++ b/code/modules/spells/spell_types/shapeshift/_shape_status.dm @@ -112,6 +112,7 @@ /datum/status_effect/shapechange_mob/proc/after_unchange() SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(owner, COMSIG_LIVING_UNSHAPESHIFTED, caster_mob) + SEND_SIGNAL(caster_mob, COMSIG_LIVING_RETURNED_FROM_SHAPESHIFT, owner) // DARKPACK EDIT ADD /// Signal proc for [COMSIG_LIVING_DEATH] from our owner. /// If our owner mob is killed, we should revert back to normal. @@ -175,8 +176,8 @@ owner.apply_damage(damage_to_apply, source_spell.convert_damage_type, forced = TRUE, spread_damage = TRUE, wound_bonus = CANT_WOUND) // Only transfer blood if both mobs are supposed to have a blood volume - if (initial(owner.blood_volume) > 0 && initial(caster_mob.blood_volume) > 0 && !HAS_TRAIT(owner, TRAIT_NOBLOOD) && !HAS_TRAIT(caster_mob, TRAIT_NOBLOOD)) - owner.blood_volume = caster_mob.blood_volume + if (CAN_HAVE_BLOOD(owner) && CAN_HAVE_BLOOD(caster_mob)) + owner.set_blood_volume(caster_mob.get_blood_volume()) for(var/datum/action/bodybound_action as anything in caster_mob.actions) if(bodybound_action.target != caster_mob) @@ -215,8 +216,8 @@ var/damage_to_apply = caster_mob.maxHealth * (owner.get_total_damage() / owner.maxHealth) caster_mob.apply_damage(damage_to_apply, source_spell.convert_damage_type, forced = TRUE, spread_damage = TRUE, wound_bonus = CANT_WOUND) // Only transfer blood if both mobs are supposed to have a blood volume - if (initial(owner.blood_volume) > 0 && initial(caster_mob.blood_volume) > 0 && !HAS_TRAIT(owner, TRAIT_NOBLOOD) && !HAS_TRAIT(caster_mob, TRAIT_NOBLOOD)) - caster_mob.blood_volume = owner.blood_volume + if (CAN_HAVE_BLOOD(owner) && CAN_HAVE_BLOOD(caster_mob)) + caster_mob.set_blood_volume(owner.get_blood_volume()) /datum/status_effect/shapechange_mob/from_spell/on_shape_death(datum/source, gibbed) var/datum/action/cooldown/spell/shapeshift/source_spell = source_weakref.resolve() @@ -242,7 +243,8 @@ name = "Shapeshifted" desc = "Your form is not your own... you're shapeshifted into another creature! \ A wizard could turn you back - or maybe you're stuck like this for good?" - icon_state = "shapeshifted" + use_user_hud_icon = TRUE + overlay_state = "shapeshifted" clickable_glow = TRUE /atom/movable/screen/alert/status_effect/shapeshifted/Click(location, control, params) diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index e0a51edde1ec..731875c896ec 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -21,7 +21,7 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) /datum/station_goal/bluespace_cannon/on_report() //Unlock BSA parts var/datum/supply_pack/engineering/bsa/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/bsa] - P.special_enabled = TRUE + P.order_flags |= ORDER_SPECIAL_ENABLED /datum/station_goal/bluespace_cannon/check_completion() if(..()) @@ -48,7 +48,7 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) /obj/machinery/bsa/back/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) /obj/machinery/bsa/back/multitool_act(mob/living/user, obj/item/multitool/M) M.set_buffer(src) @@ -62,7 +62,7 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) /obj/machinery/bsa/front/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) /obj/machinery/bsa/front/multitool_act(mob/living/user, obj/item/multitool/M) M.set_buffer(src) @@ -78,7 +78,7 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) /obj/machinery/bsa/middle/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation) + AddElement(/datum/element/simple_rotation) /obj/machinery/bsa/middle/multitool_act(mob/living/user, obj/item/multitool/tool) . = NONE diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 001419406ccd..169a105aa757 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -47,10 +47,10 @@ /datum/station_goal/dna_vault/on_report() var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/dna_vault] - P.special_enabled = TRUE + P.order_flags |= ORDER_SPECIAL_ENABLED P = SSshuttle.supply_packs[/datum/supply_pack/engineering/dna_probes] - P.special_enabled = TRUE + P.order_flags |= ORDER_SPECIAL_ENABLED /datum/station_goal/dna_vault/check_completion() if(..()) diff --git a/code/modules/station_goals/meteor_shield.dm b/code/modules/station_goals/meteor_shield.dm index 8d5e2dbf4096..2ea25b1a7bfa 100644 --- a/code/modules/station_goals/meteor_shield.dm +++ b/code/modules/station_goals/meteor_shield.dm @@ -30,10 +30,10 @@ /datum/station_goal/station_shield/on_report() //Unlock var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shield_sat] - P.special_enabled = TRUE + P.order_flags |= ORDER_SPECIAL_ENABLED P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shield_sat_control] - P.special_enabled = TRUE + P.order_flags |= ORDER_SPECIAL_ENABLED /datum/station_goal/station_shield/check_completion() if(..()) diff --git a/code/modules/surgery/advanced/bioware/bioware_surgery.dm b/code/modules/surgery/advanced/bioware/bioware_surgery.dm deleted file mode 100644 index 2b15e0b0f1c4..000000000000 --- a/code/modules/surgery/advanced/bioware/bioware_surgery.dm +++ /dev/null @@ -1,30 +0,0 @@ -/datum/surgery/advanced/bioware - name = "Enhancement surgery" - /// What status effect is gained when the surgery is successful? - /// Used to check against other bioware types to prevent stacking. - var/status_effect_gained = /datum/status_effect/bioware - -/datum/surgery/advanced/bioware/can_start(mob/user, mob/living/carbon/human/target) - if(!..()) - return FALSE - if(!istype(target)) - return FALSE - if(target.has_status_effect(status_effect_gained)) - return FALSE - return TRUE - -/datum/surgery_step/apply_bioware - accept_hand = TRUE - time = 12.5 SECONDS - surgery_effects_mood = TRUE - -/datum/surgery_step/apply_bioware/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/advanced/bioware/surgery, default_display_results) - . = ..() - if(!.) - return - if(!istype(surgery)) - return - - target.apply_status_effect(surgery.status_effect_gained) - if(target.ckey) - SSblackbox.record_feedback("tally", "bioware", 1, surgery.type) diff --git a/code/modules/surgery/advanced/bioware/cortex_folding.dm b/code/modules/surgery/advanced/bioware/cortex_folding.dm deleted file mode 100644 index 3a58f697cba6..000000000000 --- a/code/modules/surgery/advanced/bioware/cortex_folding.dm +++ /dev/null @@ -1,80 +0,0 @@ -/datum/surgery/advanced/bioware/cortex_folding - name = "Cortex Folding" - desc = "A surgical procedure which modifies the cerebral cortex into a complex fold, giving space to non-standard neural patterns." - surgery_flags = SURGERY_MORBID_CURIOSITY - possible_locs = list(BODY_ZONE_HEAD) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/incise, - /datum/surgery_step/apply_bioware/fold_cortex, - /datum/surgery_step/close, - ) - - status_effect_gained = /datum/status_effect/bioware/cortex/folded - -/datum/surgery/advanced/bioware/cortex_folding/mechanic - name = "Wetware OS Labyrinthian Programming" - desc = "A robotic upgrade which reprograms the patient's neural network in a downright eldritch programming language, giving space to non-standard neural patterns." - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/apply_bioware/fold_cortex, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/advanced/bioware/cortex_folding/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) - if(!target_brain) - return FALSE - return ..() - -/datum/surgery_step/apply_bioware/fold_cortex - name = "fold cortex (hand)" - -/datum/surgery_step/apply_bioware/fold_cortex/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You start folding [target]'s outer cerebral cortex into a fractal pattern."), - span_notice("[user] starts folding [target]'s outer cerebral cortex into a fractal pattern."), - span_notice("[user] begins to perform surgery on [target]'s brain."), - ) - display_pain(target, "Your head throbs with gruesome pain, it's nearly too much to handle!") - -/datum/surgery_step/apply_bioware/fold_cortex/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - . = ..() - if(!.) - return - - display_results( - user, - target, - span_notice("You fold [target]'s outer cerebral cortex into a fractal pattern!"), - span_notice("[user] folds [target]'s outer cerebral cortex into a fractal pattern!"), - span_notice("[user] completes the surgery on [target]'s brain."), - ) - display_pain(target, "Your brain feels stronger... more flexible!") - -/datum/surgery_step/apply_bioware/fold_cortex/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(target.get_organ_slot(ORGAN_SLOT_BRAIN)) - display_results( - user, - target, - span_warning("You screw up, damaging the brain!"), - span_warning("[user] screws up, damaging the brain!"), - span_notice("[user] completes the surgery on [target]'s brain."), - ) - display_pain(target, "Your brain throbs with intense pain; thinking hurts!") - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60) - target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY) - else - user.visible_message(span_warning("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore."), span_warning("You suddenly notice that the brain you were working on is not there anymore.")) - return FALSE diff --git a/code/modules/surgery/advanced/bioware/cortex_imprint.dm b/code/modules/surgery/advanced/bioware/cortex_imprint.dm deleted file mode 100644 index 78f6ba40f0f5..000000000000 --- a/code/modules/surgery/advanced/bioware/cortex_imprint.dm +++ /dev/null @@ -1,81 +0,0 @@ -/datum/surgery/advanced/bioware/cortex_imprint - name = "Cortex Imprint" - desc = "A surgical procedure which modifies the cerebral cortex into a redundant neural pattern, making the brain able to bypass impediments caused by minor brain traumas." - surgery_flags = SURGERY_MORBID_CURIOSITY - possible_locs = list(BODY_ZONE_HEAD) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/incise, - /datum/surgery_step/apply_bioware/imprint_cortex, - /datum/surgery_step/close, - ) - - status_effect_gained = /datum/status_effect/bioware/cortex/imprinted - -/datum/surgery/advanced/bioware/cortex_imprint/mechanic - name = "Wetware OS Ver 2.0" - desc = "A robotic upgrade which updates the patient's operating system to the 'latest version', whatever that means, making the brain able to bypass damage caused by minor brain traumas. \ - Shame about all the adware." - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/apply_bioware/imprint_cortex, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/advanced/bioware/cortex_imprint/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) - if(!target_brain) - return FALSE - return ..() - -/datum/surgery_step/apply_bioware/imprint_cortex - name = "imprint cortex (hand)" - -/datum/surgery_step/apply_bioware/imprint_cortex/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You start carving [target]'s outer cerebral cortex into a self-imprinting pattern."), - span_notice("[user] starts carving [target]'s outer cerebral cortex into a self-imprinting pattern."), - span_notice("[user] begins to perform surgery on [target]'s brain."), - ) - display_pain(target, "Your head throbs with gruesome pain, it's nearly too much to handle!") - -/datum/surgery_step/apply_bioware/imprint_cortex/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - . = ..() - if(!.) - return - - display_results( - user, - target, - span_notice("You reshape [target]'s outer cerebral cortex into a self-imprinting pattern!"), - span_notice("[user] reshapes [target]'s outer cerebral cortex into a self-imprinting pattern!"), - span_notice("[user] completes the surgery on [target]'s brain."), - ) - display_pain(target, "Your brain feels stronger... more resillient!") - -/datum/surgery_step/apply_bioware/imprint_cortex/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(target.get_organ_slot(ORGAN_SLOT_BRAIN)) - display_results( - user, - target, - span_warning("You screw up, damaging the brain!"), - span_warning("[user] screws up, damaging the brain!"), - span_notice("[user] completes the surgery on [target]'s brain."), - ) - display_pain(target, "Your brain throbs with intense pain; Thinking hurts!") - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60) - target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY) - else - user.visible_message(span_warning("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore."), span_warning("You suddenly notice that the brain you were working on is not there anymore.")) - return FALSE diff --git a/code/modules/surgery/advanced/bioware/ligament_hook.dm b/code/modules/surgery/advanced/bioware/ligament_hook.dm deleted file mode 100644 index 057adda873af..000000000000 --- a/code/modules/surgery/advanced/bioware/ligament_hook.dm +++ /dev/null @@ -1,60 +0,0 @@ -/datum/surgery/advanced/bioware/ligament_hook - name = "Ligament Hook" - desc = "A surgical procedure which reshapes the connections between torso and limbs, making it so limbs can be attached manually if severed. \ - However this weakens the connection, making them easier to detach as well." - surgery_flags = SURGERY_MORBID_CURIOSITY - 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/incise, - /datum/surgery_step/incise, - /datum/surgery_step/apply_bioware/reshape_ligaments, - /datum/surgery_step/close, - ) - - status_effect_gained = /datum/status_effect/bioware/ligaments/hooked - -/datum/surgery/advanced/bioware/ligament_hook/mechanic - name = "Anchor Point Snaplocks" - desc = "A robotic upgrade which installs rapid detachment anchor points, making it so limbs can be attached manually if detached. \ - However this weakens the connection, making them easier to detach as well." - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/apply_bioware/reshape_ligaments, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery_step/apply_bioware/reshape_ligaments - name = "reshape ligaments (hand)" - -/datum/surgery_step/apply_bioware/reshape_ligaments/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You start reshaping [target]'s ligaments into a hook-like shape."), - span_notice("[user] starts reshaping [target]'s ligaments into a hook-like shape."), - span_notice("[user] starts manipulating [target]'s ligaments."), - ) - display_pain(target, "Your limbs burn with severe pain!") - -/datum/surgery_step/apply_bioware/reshape_ligaments/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - . = ..() - if(!.) - return - - display_results( - user, - target, - span_notice("You reshape [target]'s ligaments into a connective hook!"), - span_notice("[user] reshapes [target]'s ligaments into a connective hook!"), - span_notice("[user] finishes manipulating [target]'s ligaments."), - ) - display_pain(target, "Your limbs feel... strangely loose.") diff --git a/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm b/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm deleted file mode 100644 index 105c8d2330f3..000000000000 --- a/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm +++ /dev/null @@ -1,60 +0,0 @@ -/datum/surgery/advanced/bioware/ligament_reinforcement - name = "Ligament Reinforcement" - desc = "A surgical procedure which adds a protective tissue and bone cage around the connections between the torso and limbs, preventing dismemberment. \ - However, the nerve connections as a result are more easily interrupted, making it easier to disable limbs with damage." - surgery_flags = SURGERY_MORBID_CURIOSITY - 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/incise, - /datum/surgery_step/incise, - /datum/surgery_step/apply_bioware/reinforce_ligaments, - /datum/surgery_step/close, - ) - - status_effect_gained = /datum/status_effect/bioware/ligaments/reinforced - -/datum/surgery/advanced/bioware/ligament_reinforcement/mechanic - name = "Anchor Point Reinforcement" - desc = "A surgical procedure which adds reinforced limb anchor points to the patient's chassis, preventing dismemberment. \ - However, the nerve connections as a result are more easily interrupted, making it easier to disable limbs with damage." - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/apply_bioware/reinforce_ligaments, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery_step/apply_bioware/reinforce_ligaments - name = "reinforce ligaments (hand)" - -/datum/surgery_step/apply_bioware/reinforce_ligaments/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You start reinforcing [target]'s ligaments."), - span_notice("[user] starts reinforce [target]'s ligaments."), - span_notice("[user] starts manipulating [target]'s ligaments."), - ) - display_pain(target, "Your limbs burn with severe pain!") - -/datum/surgery_step/apply_bioware/reinforce_ligaments/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - . = ..() - if(!.) - return - - display_results( - user, - target, - span_notice("You reinforce [target]'s ligaments!"), - span_notice("[user] reinforces [target]'s ligaments!"), - span_notice("[user] finishes manipulating [target]'s ligaments."), - ) - display_pain(target, "Your limbs feel more secure, but also more frail.") diff --git a/code/modules/surgery/advanced/bioware/muscled_veins.dm b/code/modules/surgery/advanced/bioware/muscled_veins.dm deleted file mode 100644 index 2c312647b8f4..000000000000 --- a/code/modules/surgery/advanced/bioware/muscled_veins.dm +++ /dev/null @@ -1,58 +0,0 @@ -/datum/surgery/advanced/bioware/muscled_veins - name = "Vein Muscle Membrane" - desc = "A surgical procedure which adds a muscled membrane to blood vessels, allowing them to pump blood without a heart." - surgery_flags = SURGERY_MORBID_CURIOSITY - 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/incise, - /datum/surgery_step/incise, - /datum/surgery_step/apply_bioware/muscled_veins, - /datum/surgery_step/close, - ) - - status_effect_gained = /datum/status_effect/bioware/heart/muscled_veins - -/datum/surgery/advanced/bioware/muscled_veins/mechanic - name = "Hydraulics Redundancy Subroutine" - desc = "A robotic upgrade which adds sophisticated hydraulics redundancies, allowing a patient to pump hydraulic fluid without an engine." - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/apply_bioware/muscled_veins, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery_step/apply_bioware/muscled_veins - name = "shape vein muscles (hand)" - -/datum/surgery_step/apply_bioware/muscled_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You start wrapping muscles around [target]'s circulatory system."), - span_notice("[user] starts wrapping muscles around [target]'s circulatory system."), - span_notice("[user] starts manipulating [target]'s circulatory system."), - ) - display_pain(target, "Your entire body burns in agony!") - -/datum/surgery_step/apply_bioware/muscled_veins/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - . = ..() - if(!.) - return - - display_results( - user, - target, - span_notice("You reshape [target]'s circulatory system, adding a muscled membrane!"), - span_notice("[user] reshapes [target]'s circulatory system, adding a muscled membrane!"), - span_notice("[user] finishes manipulating [target]'s circulatory system."), - ) - display_pain(target, "You can feel your heartbeat's powerful pulses ripple through your body!") diff --git a/code/modules/surgery/advanced/bioware/nerve_grounding.dm b/code/modules/surgery/advanced/bioware/nerve_grounding.dm deleted file mode 100644 index 0ad64218c760..000000000000 --- a/code/modules/surgery/advanced/bioware/nerve_grounding.dm +++ /dev/null @@ -1,56 +0,0 @@ -/datum/surgery/advanced/bioware/nerve_grounding - name = "Nerve Grounding" - desc = "A surgical procedure which makes the patient's nerves act as grounding rods, protecting them from electrical shocks." - surgery_flags = SURGERY_MORBID_CURIOSITY - 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/incise, - /datum/surgery_step/incise, - /datum/surgery_step/apply_bioware/ground_nerves, - /datum/surgery_step/close, - ) - - status_effect_gained = /datum/status_effect/bioware/nerves/grounded - -/datum/surgery/advanced/bioware/nerve_grounding/mechanic - name = "System Shock Dampening" - desc = "A robotic upgrade which installs grounding rods into the robotic patient's system, protecting them from electrical shocks." - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/apply_bioware/ground_nerves, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery_step/apply_bioware/ground_nerves - name = "ground nerves (hand)" - time = 15.5 SECONDS - -/datum/surgery_step/apply_bioware/ground_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You start rerouting [target]'s nerves."), - span_notice("[user] starts rerouting [target]'s nerves."), - span_notice("[user] starts manipulating [target]'s nervous system."), - ) - display_pain(target, "Your entire body goes numb!") - -/datum/surgery_step/apply_bioware/ground_nerves/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results( - user, - target, - span_notice("You successfully reroute [target]'s nervous system!"), - span_notice("[user] successfully reroutes [target]'s nervous system!"), - span_notice("[user] finishes manipulating [target]'s nervous system."), - ) - display_pain(target, "You regain feeling in your body! You feel energzed!") - return ..() diff --git a/code/modules/surgery/advanced/bioware/nerve_splicing.dm b/code/modules/surgery/advanced/bioware/nerve_splicing.dm deleted file mode 100644 index addfdfe953b7..000000000000 --- a/code/modules/surgery/advanced/bioware/nerve_splicing.dm +++ /dev/null @@ -1,59 +0,0 @@ -/datum/surgery/advanced/bioware/nerve_splicing - name = "Nerve Splicing" - desc = "A surgical procedure which splices the patient's nerves, making them more resistant to stuns." - surgery_flags = SURGERY_MORBID_CURIOSITY - 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/incise, - /datum/surgery_step/incise, - /datum/surgery_step/apply_bioware/splice_nerves, - /datum/surgery_step/close, - ) - - status_effect_gained = /datum/status_effect/bioware/nerves/spliced - -/datum/surgery/advanced/bioware/nerve_splicing/mechanic - name = "System Automatic Reset Subroutine" - desc = "A robotic upgrade which upgrades a robotic patient's automatic systems, making them more resistant to stuns." - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/apply_bioware/splice_nerves, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery_step/apply_bioware/splice_nerves - name = "splice nerves (hand)" - time = 15.5 SECONDS - -/datum/surgery_step/apply_bioware/splice_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You start splicing together [target]'s nerves."), - span_notice("[user] starts splicing together [target]'s nerves."), - span_notice("[user] starts manipulating [target]'s nervous system."), - ) - display_pain(target, "Your entire body goes numb!") - -/datum/surgery_step/apply_bioware/splice_nerves/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - . = ..() - if(!.) - return - - display_results( - user, - target, - span_notice("You successfully splice [target]'s nervous system!"), - span_notice("[user] successfully splices [target]'s nervous system!"), - span_notice("[user] finishes manipulating [target]'s nervous system."), - ) - display_pain(target, "You regain feeling in your body; It feels like everything's happening around you in slow motion!") diff --git a/code/modules/surgery/advanced/bioware/vein_threading.dm b/code/modules/surgery/advanced/bioware/vein_threading.dm deleted file mode 100644 index 52852991f18f..000000000000 --- a/code/modules/surgery/advanced/bioware/vein_threading.dm +++ /dev/null @@ -1,58 +0,0 @@ -/datum/surgery/advanced/bioware/vein_threading - name = "Vein Threading" - desc = "A surgical procedure which severely reduces the amount of blood lost in case of injury." - surgery_flags = SURGERY_MORBID_CURIOSITY - 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/incise, - /datum/surgery_step/incise, - /datum/surgery_step/apply_bioware/thread_veins, - /datum/surgery_step/close, - ) - - status_effect_gained = /datum/status_effect/bioware/heart/threaded_veins - -/datum/surgery/advanced/bioware/vein_threading/mechanic - name = "Hydraulics Routing Optimization" - desc = "A robotic upgrade which severely reduces the amount of hydraulic fluid lost in case of injury." - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/apply_bioware/thread_veins, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery_step/apply_bioware/thread_veins - name = "thread veins (hand)" - -/datum/surgery_step/apply_bioware/thread_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You start weaving [target]'s circulatory system."), - span_notice("[user] starts weaving [target]'s circulatory system."), - span_notice("[user] starts manipulating [target]'s circulatory system."), - ) - display_pain(target, "Your entire body burns in agony!") - -/datum/surgery_step/apply_bioware/thread_veins/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - . = ..() - if(!.) - return - - display_results( - user, - target, - span_notice("You weave [target]'s circulatory system into a resistant mesh!"), - span_notice("[user] weaves [target]'s circulatory system into a resistant mesh!"), - span_notice("[user] finishes manipulating [target]'s circulatory system."), - ) - display_pain(target, "You can feel your blood pumping through reinforced veins!") diff --git a/code/modules/surgery/advanced/brainwashing.dm b/code/modules/surgery/advanced/brainwashing.dm deleted file mode 100644 index fb12ecd6e359..000000000000 --- a/code/modules/surgery/advanced/brainwashing.dm +++ /dev/null @@ -1,116 +0,0 @@ -/obj/item/disk/surgery/brainwashing - name = "Brainwashing Surgery Disk" - desc = "The disk provides instructions on how to impress an order on a brain, making it the primary objective of the patient." - surgeries = list( - /datum/surgery/advanced/brainwashing, - /datum/surgery/advanced/brainwashing/mechanic, - ) - -/datum/surgery/advanced/brainwashing - name = "Brainwashing" - desc = "A surgical procedure which directly implants a directive into the patient's brain, making it their absolute priority. It can be cleared using a mindshield implant." - surgery_flags = SURGERY_MORBID_CURIOSITY - possible_locs = list(BODY_ZONE_HEAD) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/brainwash, - /datum/surgery_step/close, - ) - -/datum/surgery/advanced/brainwashing/mechanic - name = "Reprogramming" - desc = "Malware which directly implants a directive into the robotic patient's operating system, making it their absolute priority. It can be cleared using a mindshield implant." - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/brainwash/mechanic, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/advanced/brainwashing/can_start(mob/user, mob/living/carbon/target) - if(!..()) - return FALSE - var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) - if(!target_brain) - return FALSE - return TRUE - -/datum/surgery_step/brainwash - name = "brainwash (hemostat)" - implements = list( - TOOL_HEMOSTAT = 85, - TOOL_WIRECUTTER = 50, - /obj/item/stack/package_wrap = 35, - /obj/item/stack/cable_coil = 15) - time = 20 SECONDS - preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' - success_sound = 'sound/items/handling/surgery/hemostat1.ogg' - failure_sound = 'sound/items/handling/surgery/organ2.ogg' - var/objective - -/datum/surgery_step/brainwash/mechanic - name = "reprogram (multitool)" - implements = list( - TOOL_MULTITOOL = 85, - TOOL_HEMOSTAT = 50, - TOOL_WIRECUTTER = 50, - /obj/item/stack/package_wrap = 35, - /obj/item/stack/cable_coil = 15) - preop_sound = 'sound/items/taperecorder/tape_flip.ogg' - success_sound = 'sound/items/taperecorder/taperecorder_close.ogg' - -/datum/surgery_step/brainwash/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - objective = tgui_input_text(user, "Choose the objective to imprint on your victim's brain", "Brainwashing", max_length = MAX_MESSAGE_LEN) - if(!objective) - return SURGERY_STEP_FAIL - display_results( - user, - target, - span_notice("You begin to brainwash [target]..."), - span_notice("[user] begins to fix [target]'s brain."), - span_notice("[user] begins to perform surgery on [target]'s brain."), - ) - display_pain(target, "Your head pounds with unimaginable pain!") // Same message as other brain surgeries - -/datum/surgery_step/brainwash/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(!target.mind) - to_chat(user, span_warning("[target] doesn't respond to the brainwashing, as if [target.p_they()] lacked a mind...")) - return FALSE - if(HAS_MIND_TRAIT(target, TRAIT_UNCONVERTABLE)) - to_chat(user, span_warning("You hear a faint buzzing from a device inside [target]'s brain, and the brainwashing is erased.")) - return FALSE - display_results( - user, - target, - span_notice("You succeed in brainwashing [target]."), - span_notice("[user] successfully fixes [target]'s brain!"), - span_notice("[user] completes the surgery on [target]'s brain."), - ) - to_chat(target, span_userdanger("A new compulsion fills your mind... you feel forced to obey it!")) - brainwash(target, objective) - message_admins("[ADMIN_LOOKUPFLW(user)] surgically brainwashed [ADMIN_LOOKUPFLW(target)] with the objective '[objective]'.") - user.log_message("has brainwashed [key_name(target)] with the objective '[objective]' using brainwashing surgery.", LOG_ATTACK) - target.log_message("has been brainwashed with the objective '[objective]' by [key_name(user)] using brainwashing surgery.", LOG_VICTIM, log_globally=FALSE) - user.log_message("surgically brainwashed [key_name(target)] with the objective '[objective]'.", LOG_GAME) - return ..() - -/datum/surgery_step/brainwash/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(target.get_organ_slot(ORGAN_SLOT_BRAIN)) - display_results( - user, - target, - span_warning("You screw up, bruising the brain tissue!"), - span_warning("[user] screws up, causing brain damage!"), - span_notice("[user] completes the surgery on [target]'s brain."), - ) - display_pain(target, "Your head throbs with horrible pain!") - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 40) - else - user.visible_message(span_warning("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore."), span_warning("You suddenly notice that the brain you were working on is not there anymore.")) - return FALSE diff --git a/code/modules/surgery/advanced/lobotomy.dm b/code/modules/surgery/advanced/lobotomy.dm deleted file mode 100644 index e15228976f05..000000000000 --- a/code/modules/surgery/advanced/lobotomy.dm +++ /dev/null @@ -1,129 +0,0 @@ -/datum/surgery/advanced/lobotomy - name = "Lobotomy" - desc = "An invasive surgical procedure which guarantees removal of almost all brain traumas, but might cause another permanent trauma in return." - surgery_flags = SURGERY_MORBID_CURIOSITY - possible_locs = list(BODY_ZONE_HEAD) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/lobotomize, - /datum/surgery_step/close, - ) - -/datum/surgery/advanced/lobotomy/mechanic - name = "Wetware OS Destructive Defragmentation" - desc = "A destructive robotic defragmentation method which guarantees removal of almost all brain traumas, but might cause another permanent trauma in return." - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/lobotomize/mechanic, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/advanced/lobotomy/can_start(mob/user, mob/living/carbon/target) - . = ..() - if(!.) - return FALSE - var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) - if(!target_brain) - return FALSE - return TRUE - -/datum/surgery_step/lobotomize - name = "perform lobotomy (scalpel)" - implements = list( - TOOL_SCALPEL = 85, - /obj/item/melee/energy/sword = 55, - /obj/item/knife = 35, - /obj/item/shard = 25, - /obj/item = 20, - ) - time = 10 SECONDS - preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' - success_sound = 'sound/items/handling/surgery/scalpel2.ogg' - failure_sound = 'sound/items/handling/surgery/organ2.ogg' - surgery_effects_mood = TRUE - -/datum/surgery_step/lobotomize/mechanic - name = "execute neural defragging (multitool)" - implements = list( - TOOL_MULTITOOL = 85, - /obj/item/melee/energy/sword = 55, - /obj/item/knife = 35, - /obj/item/shard = 25, - /obj/item = 20, - ) - preop_sound = 'sound/items/taperecorder/tape_flip.ogg' - success_sound = 'sound/items/taperecorder/taperecorder_close.ogg' - -/datum/surgery_step/lobotomize/tool_check(mob/user, obj/item/tool) - if(implement_type == /obj/item && !tool.get_sharpness()) - return FALSE - return TRUE - -/datum/surgery_step/lobotomize/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to perform a lobotomy on [target]'s brain..."), - span_notice("[user] begins to perform a lobotomy on [target]'s brain."), - span_notice("[user] begins to perform surgery on [target]'s brain."), - ) - display_pain(target, "Your head pounds with unimaginable pain!") - -/datum/surgery_step/lobotomize/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results( - user, - target, - span_notice("You succeed in lobotomizing [target]."), - span_notice("[user] successfully lobotomizes [target]!"), - span_notice("[user] completes the surgery on [target]'s brain."), - ) - display_pain(target, "Your head goes totally numb for a moment, the pain is overwhelming!") - - target.cure_all_traumas(TRAUMA_RESILIENCE_LOBOTOMY) - if(target.mind && target.mind.has_antag_datum(/datum/antagonist/brainwashed)) - target.mind.remove_antag_datum(/datum/antagonist/brainwashed) - if(prob(75)) // 75% chance to get a trauma from this - switch(rand(1, 3))//Now let's see what hopefully-not-important part of the brain we cut off - if(1) - target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_MAGIC) - if(2) - if(HAS_TRAIT(target, TRAIT_SPECIAL_TRAUMA_BOOST) && prob(50)) - target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) - else - target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_MAGIC) - if(3) - target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) - return ..() - -/datum/surgery_step/lobotomize/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) - if(target_brain) - display_results( - user, - target, - span_warning("You remove the wrong part, causing more damage!"), - span_notice("[user] successfully lobotomizes [target]!"), - span_notice("[user] completes the surgery on [target]'s brain."), - ) - display_pain(target, "The pain in your head only seems to get worse!") - target_brain.apply_organ_damage(80) - switch(rand(1,3)) - if(1) - target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_MAGIC) - if(2) - if(HAS_TRAIT(target, TRAIT_SPECIAL_TRAUMA_BOOST) && prob(50)) - target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) - else - target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_MAGIC) - if(3) - target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) - else - user.visible_message(span_warning("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore."), span_warning("You suddenly notice that the brain you were working on is not there anymore.")) - return FALSE diff --git a/code/modules/surgery/advanced/necrotic_revival.dm b/code/modules/surgery/advanced/necrotic_revival.dm deleted file mode 100644 index a791a70494d5..000000000000 --- a/code/modules/surgery/advanced/necrotic_revival.dm +++ /dev/null @@ -1,52 +0,0 @@ -/datum/surgery/advanced/necrotic_revival - name = "Necrotic Revival" - desc = "An experimental surgical procedure that stimulates the growth of a Romerol tumor inside the patient's brain. Requires zombie powder or rezadone." - surgery_flags = SURGERY_MORBID_CURIOSITY - possible_locs = list(BODY_ZONE_HEAD) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/bionecrosis, - /datum/surgery_step/close, - ) - -/datum/surgery/advanced/necrotic_revival/can_start(mob/user, mob/living/carbon/target) - . = ..() - var/obj/item/organ/zombie_infection/z_infection = target.get_organ_slot(ORGAN_SLOT_ZOMBIE) - if(z_infection) - return FALSE - -/datum/surgery_step/bionecrosis - name = "start bionecrosis (syringe)" - implements = list( - /obj/item/reagent_containers/syringe = 100, - /obj/item/pen = 30) - time = 5 SECONDS - chems_needed = list(/datum/reagent/toxin/zombiepowder, /datum/reagent/medicine/rezadone) - require_all_chems = FALSE - -/datum/surgery_step/bionecrosis/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to grow a romerol tumor on [target]'s brain..."), - span_notice("[user] begins to tinker with [target]'s brain..."), - span_notice("[user] begins to perform surgery on [target]'s brain."), - ) - display_pain(target, "Your head pounds with unimaginable pain!") // Same message as other brain surgeries - -/datum/surgery_step/bionecrosis/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results( - user, - target, - span_notice("You succeed in growing a romerol tumor on [target]'s brain."), - span_notice("[user] successfully grows a romerol tumor on [target]'s brain!"), - span_notice("[user] completes the surgery on [target]'s brain."), - ) - display_pain(target, "Your head goes totally numb for a moment, the pain is overwhelming!") - if(!target.get_organ_slot(ORGAN_SLOT_ZOMBIE)) - var/obj/item/organ/zombie_infection/z_infection = new() - z_infection.Insert(target) - return ..() diff --git a/code/modules/surgery/advanced/pacification.dm b/code/modules/surgery/advanced/pacification.dm deleted file mode 100644 index 0c4f0e7371da..000000000000 --- a/code/modules/surgery/advanced/pacification.dm +++ /dev/null @@ -1,89 +0,0 @@ -/datum/surgery/advanced/pacify - name = "Pacification" - desc = "A surgical procedure which permanently inhibits the aggression center of the brain, making the patient unwilling to cause direct harm." - surgery_flags = SURGERY_MORBID_CURIOSITY - possible_locs = list(BODY_ZONE_HEAD) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/pacify, - /datum/surgery_step/close, - ) - -/datum/surgery/advanced/pacify/mechanic - name = "Aggression Suppression Programming" - desc = "Malware which permanently inhibits the aggression programming of the patient's neural network, making the patient unwilling to cause direct harm." - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/pacify/mechanic, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/advanced/pacify/can_start(mob/user, mob/living/carbon/target) - . = ..() - var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) - if(!target_brain) - return FALSE - -/datum/surgery_step/pacify - name = "rewire brain (hemostat)" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_SCREWDRIVER = 35, - /obj/item/pen = 15, - ) - time = 4 SECONDS - preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' - success_sound = 'sound/items/handling/surgery/hemostat1.ogg' - failure_sound = 'sound/items/handling/surgery/organ2.ogg' - -/datum/surgery_step/pacify/mechanic - name = "delete aggression programming (multitool)" - implements = list( - TOOL_MULTITOOL = 100, - TOOL_HEMOSTAT = 35, - TOOL_SCREWDRIVER = 35, - /obj/item/pen = 15, - ) - preop_sound = 'sound/items/taperecorder/tape_flip.ogg' - success_sound = 'sound/items/taperecorder/taperecorder_close.ogg' - -/datum/surgery_step/pacify/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to pacify [target]..."), - span_notice("[user] begins to fix [target]'s brain."), - span_notice("[user] begins to perform surgery on [target]'s brain."), - ) - display_pain(target, "Your head pounds with unimaginable pain!") - -/datum/surgery_step/pacify/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results( - user, - target, - span_notice("You succeed in neurologically pacifying [target]."), - span_notice("[user] successfully fixes [target]'s brain!"), - span_notice("[user] completes the surgery on [target]'s brain."), - ) - display_pain(target, "Your head pounds... the concept of violence flashes in your head, and nearly makes you hurl!") - target.gain_trauma(/datum/brain_trauma/severe/pacifism, TRAUMA_RESILIENCE_LOBOTOMY) - return ..() - -/datum/surgery_step/pacify/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You screw up, rewiring [target]'s brain the wrong way around..."), - span_warning("[user] screws up, causing brain damage!"), - span_notice("[user] completes the surgery on [target]'s brain."), - ) - display_pain(target, "Your head pounds, and it feels like it's getting worse!") - target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY) - return FALSE diff --git a/code/modules/surgery/advanced/viral_bonding.dm b/code/modules/surgery/advanced/viral_bonding.dm deleted file mode 100644 index be7e2969a0bf..000000000000 --- a/code/modules/surgery/advanced/viral_bonding.dm +++ /dev/null @@ -1,60 +0,0 @@ -/datum/surgery/advanced/viral_bonding - name = "Viral Bonding" - desc = "A surgical procedure that forces a symbiotic relationship between a virus and its host. The patient must be dosed with spaceacillin, virus food, and formaldehyde." - surgery_flags = SURGERY_MORBID_CURIOSITY - 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/incise, - /datum/surgery_step/viral_bond, - /datum/surgery_step/close, - ) - -/datum/surgery/advanced/viral_bonding/can_start(mob/user, mob/living/carbon/target) - . = ..() - if(!.) - return FALSE - if(!LAZYLEN(target.diseases)) - return FALSE - return TRUE - -/datum/surgery_step/viral_bond - name = "viral bond (cautery)" - implements = list( - TOOL_CAUTERY = 100, - TOOL_WELDER = 50, - /obj/item = 30) // 30% success with any hot item. - time = 10 SECONDS - chems_needed = list(/datum/reagent/medicine/spaceacillin,/datum/reagent/consumable/virus_food,/datum/reagent/toxin/formaldehyde) - -/datum/surgery_step/viral_bond/tool_check(mob/user, obj/item/tool) - if(implement_type == TOOL_WELDER || implement_type == /obj/item) - return tool.get_temperature() - - return TRUE - -/datum/surgery_step/viral_bond/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You start heating [target]'s bone marrow with [tool]..."), - span_notice("[user] starts heating [target]'s bone marrow with [tool]..."), - span_notice("[user] starts heating something in [target]'s chest with [tool]..."), - ) - display_pain(target, "You feel a searing heat spread through your chest!") - -/datum/surgery_step/viral_bond/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - display_results( - user, - target, - span_notice("[target]'s bone marrow begins pulsing slowly. The viral bonding is complete."), - span_notice("[target]'s bone marrow begins pulsing slowly."), - span_notice("[user] finishes the operation."), - ) - display_pain(target, "You feel a faint throbbing in your chest.") - for(var/datum/disease/infected_disease as anything in target.diseases) - if(infected_disease.severity != DISEASE_SEVERITY_UNCURABLE) //no curing quirks, sweaty - infected_disease.carrier = TRUE - return TRUE diff --git a/code/modules/surgery/advanced/wingreconstruction.dm b/code/modules/surgery/advanced/wingreconstruction.dm deleted file mode 100644 index 3a27a19c391a..000000000000 --- a/code/modules/surgery/advanced/wingreconstruction.dm +++ /dev/null @@ -1,59 +0,0 @@ -/datum/surgery/advanced/wing_reconstruction - name = "Wing Reconstruction" - desc = "An experimental surgical procedure that reconstructs the damaged wings of moth people. Requires Synthflesh." - 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/wing_reconstruction, - ) - -/datum/surgery/advanced/wing_reconstruction/can_start(mob/user, mob/living/carbon/target) - if(!istype(target)) - return FALSE - var/obj/item/organ/wings/moth/wings = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) - if(!istype(wings, /obj/item/organ/wings/moth)) - return FALSE - return ..() && wings?.burnt - -/datum/surgery_step/wing_reconstruction - name = "start wing reconstruction (hemostat)" - implements = list( - TOOL_HEMOSTAT = 85, - TOOL_SCREWDRIVER = 35, - /obj/item/pen = 15) - time = 20 SECONDS - chems_needed = list(/datum/reagent/medicine/c2/synthflesh) - require_all_chems = FALSE - -/datum/surgery_step/wing_reconstruction/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to fix [target]'s charred wing membranes..."), - span_notice("[user] begins to fix [target]'s charred wing membranes."), - span_notice("[user] begins to perform surgery on [target]'s charred wing membranes."), - ) - display_pain(target, "Your wings sting like hell!") - -/datum/surgery_step/wing_reconstruction/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - display_results( - user, - target, - span_notice("You succeed in reconstructing [target]'s wings."), - span_notice("[user] successfully reconstructs [target]'s wings!"), - span_notice("[user] completes the surgery on [target]'s wings."), - ) - display_pain(target, "You can feel your wings again!") - var/obj/item/organ/wings/moth/wings = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) - if(istype(wings, /obj/item/organ/wings/moth)) //make sure we only heal moth wings. - wings.heal_wings(user, ALL) - - var/obj/item/organ/antennae/antennae = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_ANTENNAE) //i mean we might aswell heal their antennae too - antennae?.heal_antennae(user, ALL) - - human_target.update_body_parts() - return ..() diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm deleted file mode 100644 index be4fbf7ea5f9..000000000000 --- a/code/modules/surgery/amputation.dm +++ /dev/null @@ -1,113 +0,0 @@ - -/datum/surgery/amputation - name = "Amputation" - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_MORBID_CURIOSITY - possible_locs = list( - BODY_ZONE_R_ARM, - BODY_ZONE_L_ARM, - BODY_ZONE_L_LEG, - BODY_ZONE_R_LEG, - BODY_ZONE_HEAD, - ) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/sever_limb, - ) - -/datum/surgery/amputation/mechanic - name = "Disassemble" - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/sever_limb/mechanic, //The benefit of being robotic; people can pull you apart in an instant! Wait, that's not a benefit... - ) - -/datum/surgery/amputation/peg - name = "Detach" - requires_bodypart_type = BODYTYPE_PEG - steps = list( - /datum/surgery_step/sever_limb/peg, //Easy come, easy go - ) - -/datum/surgery/amputation/can_start(mob/user, mob/living/patient) - if(HAS_TRAIT(patient, TRAIT_NODISMEMBER)) - return FALSE - return ..() - -/datum/surgery_step/sever_limb - name = "sever limb (circular saw)" - implements = list( - /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, - /obj/item/knife/butcher = 25, - ) - time = 6.4 SECONDS - preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' - success_sound = 'sound/items/handling/surgery/organ2.ogg' - surgery_effects_mood = TRUE - -/datum/surgery_step/sever_limb/mechanic - name = "detach limb (wrench or crowbar)" - implements = list( - /obj/item/shovel/giant_wrench = 300, - TOOL_WRENCH = 100, - TOOL_CROWBAR = 100, - TOOL_SCALPEL = 50, - TOOL_SAW = 50, - ) - time = 20 //WAIT I NEED THAT!! - preop_sound = 'sound/items/tools/ratchet.ogg' - preop_sound = 'sound/machines/airlock/doorclick.ogg' - -/datum/surgery_step/sever_limb/peg - name = "detach limb (circular saw)" - implements = list( - TOOL_SAW = 100, - /obj/item/shovel/serrated = 100, - /obj/item/fireaxe = 90, - /obj/item/hatchet = 75, - TOOL_SCALPEL = 25, - ) - time = 3 SECONDS - preop_sound = 'sound/items/handling/surgery/saw.ogg' - success_sound = 'sound/items/handling/materials/wood_drop.ogg' - -/datum/surgery_step/sever_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to sever [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to sever [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - span_notice("[user] begins to sever [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - display_pain(target, "You feel a gruesome pain in your [parse_zone(target_zone)]'s joint!") - - -/datum/surgery_step/sever_limb/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results( - user, - target, - span_notice("You sever [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] severs [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - span_notice("[user] severs [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - display_pain(target, "You can no longer feel your severed [target.parse_zone_with_bodypart(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() - return ..() diff --git a/code/modules/surgery/asthmatic_bypass.dm b/code/modules/surgery/asthmatic_bypass.dm deleted file mode 100644 index 7e69c99a7bdb..000000000000 --- a/code/modules/surgery/asthmatic_bypass.dm +++ /dev/null @@ -1,96 +0,0 @@ -/datum/surgery/asthmatic_bypass - name = "Asthmatic Bypass" - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB - requires_bodypart_type = NONE - organ_to_manipulate = ORGAN_SLOT_LUNGS - 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/incise, - /datum/surgery_step/expand_windpipe, - /datum/surgery_step/close, - ) - -/datum/surgery/asthmatic_bypass/can_start(mob/user, mob/living/patient) - . = ..() - - if (!.) - return - - return (patient.has_quirk(/datum/quirk/item_quirk/asthma)) - -/datum/surgery_step/expand_windpipe - name = "force open windpipe (retractor)" - implements = list( - TOOL_RETRACTOR = 80, - TOOL_WIRECUTTER = 45, - ) - time = 8 SECONDS - repeatable = TRUE - preop_sound = 'sound/items/handling/surgery/retractor1.ogg' - success_sound = 'sound/items/handling/surgery/retractor2.ogg' - - /// The amount of inflammation a failure or success of this surgery will reduce. - var/inflammation_reduction = 75 - -/datum/surgery_step/expand_windpipe/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You start to stretch [target]'s windpipe, trying your best to avoid nearby blood vessels..."), - span_notice("[user] begins to stretch [target]'s windpipe, taking care to avoid any nearby blood vessels."), - span_notice("[user] begins to stretch [target]'s windpipe."), - ) - display_pain(target, "You feel an agonizing stretching sensation in your neck!") - -/datum/surgery_step/expand_windpipe/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = TRUE) - if (!reduce_inflammation(user, target, tool, surgery)) - return - - default_display_results = FALSE - display_results( - user, - target, - span_notice("You stretch [target]'s windpipe with [tool], managing to avoid the nearby blood vessels and arteries."), - span_notice("[user] succeeds at stretching [target]'s windpipe with [tool], avoiding the nearby blood vessels and arteries."), - span_notice("[user] finishes stretching [target]'s windpipe.") - ) - - return ..() - -/datum/surgery_step/expand_windpipe/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob) - if (!reduce_inflammation(user, target, tool, surgery)) - return - - display_results( - user, - target, - span_bolddanger("You stretch [target]'s windpipe with [tool], but accidentally clip a few arteries!"), - span_bolddanger("[user] succeeds at stretching [target]'s windpipe with [tool], but accidentally clips a few arteries!"), - span_bolddanger("[user] finishes stretching [target]'s windpipe, but screws up!") - ) - - target.losebreath++ - - if (iscarbon(target)) - var/mob/living/carbon/carbon_patient = target - var/wound_bonus = tool.wound_bonus - var/obj/item/bodypart/head/patient_chest = carbon_patient.get_bodypart(BODY_ZONE_CHEST) - if (patient_chest) - if (prob(30)) - carbon_patient.cause_wound_of_type_and_severity(WOUND_SLASH, patient_chest, WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_CRITICAL, WOUND_PICK_LOWEST_SEVERITY, tool) - patient_chest.receive_damage(brute = 10, wound_bonus = wound_bonus, sharpness = SHARP_EDGED, damage_source = tool) - - return FALSE - -/// Reduces the asthmatic's inflammation by [inflammation_reduction]. Called by both success and failure. -/datum/surgery_step/expand_windpipe/proc/reduce_inflammation(mob/user, mob/living/target, obj/item/tool, datum/surgery/surgery) - var/datum/quirk/item_quirk/asthma/asthma_quirk = locate(/datum/quirk/item_quirk/asthma) in target.quirks - if (isnull(asthma_quirk)) - qdel(surgery) // not really an error cause quirks can get removed during surgery? - return FALSE - - asthma_quirk.adjust_inflammation(-inflammation_reduction) - return TRUE diff --git a/code/modules/surgery/autopsy.dm b/code/modules/surgery/autopsy.dm deleted file mode 100644 index 8d5ae45d8174..000000000000 --- a/code/modules/surgery/autopsy.dm +++ /dev/null @@ -1,66 +0,0 @@ -/datum/surgery/autopsy - name = "Autopsy" - 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, - /datum/surgery_step/retract_skin, - /datum/surgery_step/autopsy, - /datum/surgery_step/close, - ) - -/datum/surgery/autopsy/mechanic - name = "System Failure Analysis" - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/autopsy, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/autopsy/can_start(mob/user, mob/living/patient) - if(!..()) - return FALSE - if(patient.stat != DEAD) - return FALSE - if(HAS_TRAIT_FROM(patient, TRAIT_DISSECTED, AUTOPSY_TRAIT)) - return FALSE - return TRUE - -/datum/surgery_step/autopsy - name = "Perform Autopsy (autopsy scanner)" - implements = list(/obj/item/autopsy_scanner = 100) - time = 10 SECONDS - success_sound = 'sound/machines/printer.ogg' - -/datum/surgery_step/autopsy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin performing an autopsy on [target]..."), - span_notice("[user] uses [tool] to perform an autopsy on [target]."), - span_notice("[user] uses [tool] on [target]'s chest."), - ) - display_pain(target, "You feel a burning sensation in your chest!") - -/datum/surgery_step/autopsy/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/autopsy_scanner/tool, datum/surgery/surgery, default_display_results = FALSE) - ADD_TRAIT(target, TRAIT_DISSECTED, AUTOPSY_TRAIT) - 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)) - user.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) - display_results( - user, - target, - span_warning("You screw up, bruising [target]'s chest!"), - span_warning("[user] screws up, brusing [target]'s chest!"), - span_warning("[user] screws up!"), - ) - target.adjustBruteLoss(5) diff --git a/code/modules/surgery/blood_filter.dm b/code/modules/surgery/blood_filter.dm deleted file mode 100644 index 8e321f63fe7f..000000000000 --- a/code/modules/surgery/blood_filter.dm +++ /dev/null @@ -1,106 +0,0 @@ -/datum/surgery/blood_filter - name = "Filter blood" - possible_locs = list(BODY_ZONE_CHEST) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/incise, - /datum/surgery_step/filter_blood, - /datum/surgery_step/close, - ) - - -/datum/surgery/blood_filter/mechanic - name = "Hydraulics Purge" - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/filter_blood, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/blood_filter/can_start(mob/user, mob/living/carbon/target) - if(HAS_TRAIT(target, TRAIT_HUSK)) //You can filter the blood of a dead person just not husked - return FALSE - return ..() - -/datum/surgery_step/filter_blood/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) - display_results( - user, - target, - span_notice("You begin filtering [target]'s blood..."), - span_notice("[user] uses [tool] to filter [target]'s blood."), - span_notice("[user] uses [tool] on [target]'s chest."), - ) - if(!..()) - return - while(has_filterable_chems(target, tool)) - if(!..()) - break - -/** - * Checks if the mob contains chems we can filter - * - * If the blood filter's whitelist is empty this checks if the mob contains any chems - * If the whitelist contains chems it checks if any chems in the mob match chems in the whitelist - * - * Arguments: - * * target - The mob to check the chems of - * * bloodfilter - The blood filter to check the whitelist of - */ -/datum/surgery_step/filter_blood/proc/has_filterable_chems(mob/living/carbon/target, obj/item/blood_filter/bloodfilter) - if(!length(target.reagents?.reagent_list)) - bloodfilter.audible_message(span_notice("[bloodfilter] pings as it reports no chemicals detected in [target]'s blood.")) - playsound(get_turf(target), 'sound/machines/ping.ogg', 75, TRUE, falloff_exponent = 12, falloff_distance = 1) - return FALSE - - if(!length(bloodfilter.whitelist)) - return TRUE - - for(var/datum/reagent/chem as anything in target.reagents.reagent_list) - if(chem.type in bloodfilter.whitelist) - return TRUE - - return FALSE - -/datum/surgery_step/filter_blood - name = "Filter blood (blood filter)" - implements = list(/obj/item/blood_filter = 95) - repeatable = TRUE - time = 2.5 SECONDS - success_sound = 'sound/machines/card_slide.ogg' - -/datum/surgery_step/filter_blood/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_pain(target, "You feel a throbbing pain in your chest!") - -/datum/surgery_step/filter_blood/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/obj/item/blood_filter/bloodfilter = tool - if(target.reagents?.total_volume) - for(var/datum/reagent/chem as anything in target.reagents.reagent_list) - if(!length(bloodfilter.whitelist) || !(chem.type in bloodfilter.whitelist)) - target.reagents.remove_reagent(chem.type, clamp(round(chem.volume * 0.22, 0.2), 0.4, 10)) - display_results( - user, - target, - span_notice("\The [tool] completes a cycle filtering [target]'s blood."), - span_notice("\The [tool] whirrs as it filters [target]'s blood."), - span_notice("\The [tool] whirrs as it pumps."), - ) - - if(locate(/obj/item/healthanalyzer) in user.held_items) - chemscan(user, target) - - return ..() - -/datum/surgery_step/filter_blood/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_warning("You screw up, bruising [target]'s chest!"), - span_warning("[user] screws up, brusing [target]'s chest!"), - span_warning("[user] screws up!"), - ) - target.adjustBruteLoss(5) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 2104f31ecec7..4aab719ac165 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -21,7 +21,6 @@ ///The color to multiply the greyscaled husk sprites by. Can be null. Old husk sprite chest color is #A6A6A6 var/husk_color = "#A6A6A6" layer = BELOW_MOB_LAYER //so it isn't hidden behind objects when on the floor - grind_results = list(/datum/reagent/bone_dust = 10, /datum/reagent/consumable/liquidgibs = 5) // robotic bodyparts and chests/heads cannot be ground /// The mob that "owns" this limb /// DO NOT MODIFY DIRECTLY. Use update_owner() var/mob/living/carbon/owner @@ -96,9 +95,6 @@ var/brutestate = 0 var/burnstate = 0 - ///Gradually increases while burning when at full damage, destroys the limb when at 100 - var/cremation_progress = 0 - //Multiplicative damage modifiers /// Brute damage gets multiplied by this on receive_damage() var/brute_modifier = 1 @@ -184,14 +180,22 @@ /// Sounds when this bodypart is used in an umarmed attack var/sound/unarmed_attack_sound = 'sound/items/weapons/punch1.ogg' var/sound/unarmed_miss_sound = 'sound/items/weapons/punchmiss.ogg' - ///Lowest possible punch damage this bodypart can give. If this is set to 0, unarmed attacks will always miss. + /// Lowest possible punch damage this bodypart can give. If this is set to 0, unarmed attacks will always miss. var/unarmed_damage_low = 1 - ///Highest possible punch damage this bodypart can ive. + /// Highest possible punch damage this bodypart can ive. var/unarmed_damage_high = 1 - ///Determines the accuracy bonus, armor penetration and knockdown probability. + /// Determines the accuracy bonus, armor penetration and knockdown probability. var/unarmed_effectiveness = 10 /// Multiplier applied to effectiveness and damage when attacking a grabbed target. var/unarmed_pummeling_bonus = 1 + /// If this limb is used to grab (which is only arms right now), how much more effective is the limb? Every integer above or below 0 is one effective grab level. Higher is a bonus, lower is a malus. + /// This is more powerful than adjusting grab escape chance. If the arm has both an increased grab level and a chance reduction, it is very hard to escape a grab. + var/unarmed_grab_state_bonus = 0 + /// If this limb is used to grab (which is only arms right now), how much additional damage does it deal to the grabbed individual when they fail to escape the grab? + var/unarmed_grab_damage_bonus = 0 + /// If this limb is used to grab (which is only arms right now), how much more difficult is it to escape the grab, before accounting for grab state? Values above 0 is a malus, values below 0 is a bonus. + /// This is less powerful than adjusting grab state. If the arm has both an increased grab level and a chance reduction, it is very hard to escape a grab. + var/unarmed_grab_escape_chance_bonus = 0 /// The 'sharpness' of the limb. Could indicate claws, teeth or spines. Should default to NONE, or blunt. var/unarmed_sharpness = NONE @@ -220,6 +224,9 @@ /// The cached info about the blood this organ belongs to, set during on_removal() var/list/blood_dna_info + /// What state is the bodypart in for determining surgery availability + VAR_FINAL/surgery_state = NONE + /obj/item/bodypart/apply_fantasy_bonuses(bonus) . = ..() unarmed_damage_low = modify_fantasy_variable("unarmed_damage_low", unarmed_damage_low, bonus, minimum = 1) @@ -248,11 +255,19 @@ texture_bodypart_overlay = new texture_bodypart_overlay() add_bodypart_overlay(texture_bodypart_overlay, update = FALSE) - if(!IS_ORGANIC_LIMB(src)) - grind_results = null - else + if(IS_ORGANIC_LIMB(src)) blood_dna_info = list("Unknown DNA" = get_blood_type(BLOOD_TYPE_O_PLUS)) + var/innate_state = NONE + if(!LIMB_HAS_SKIN(src)) + innate_state |= SKINLESS_SURGERY_STATES + if(!LIMB_HAS_BONES(src)) + innate_state |= BONELESS_SURGERY_STATES + if(!LIMB_HAS_VESSELS(src)) + innate_state |= VESSELLESS_SURGERY_STATES + if(innate_state) + add_surgical_state(innate_state) + name = "[limb_id] [parse_zone(body_zone)]" update_icon_dropped() refresh_bleed_rate() @@ -269,6 +284,7 @@ owner = null + QDEL_NULL(current_gauze) QDEL_LAZYLIST(scars) for(var/atom/movable/movable in contents) @@ -278,6 +294,9 @@ return ..() +/obj/item/bodypart/grind_results() + return IS_ORGANIC_LIMB(src) ? list() : list(/datum/reagent/bone_dust = 10, /datum/reagent/consumable/liquidgibs = 5) + /obj/item/bodypart/ex_act(severity, target) if(owner) //trust me bro you dont want this return FALSE @@ -395,6 +414,10 @@ if(wound_desc) check_list += "\t[wound_desc]" + var/surgery_check = get_surgery_self_check() + if(surgery_check) + check_list += "\t[surgery_check]" + for(var/obj/item/embedded_thing as anything in embedded_objects) if(embedded_thing.get_embed().stealthy_embed) continue @@ -409,18 +432,121 @@ if(current_gauze) check_list += span_notice("\tThere is some [current_gauze.name] wrapped around it.") else if(can_bleed()) + var/bleed_text = "" switch(cached_bleed_rate) if(0.2 to 1) - check_list += span_warning("\tIt's lightly bleeding.") + bleed_text = span_warning("It's lightly bleeding.") if(1 to 2) - check_list += span_warning("\tIt's bleeding.") + bleed_text = span_warning("It's bleeding.") if(3 to 4) - check_list += span_warning("\tIt's bleeding heavily!") + bleed_text = span_warning("It's bleeding heavily!") if(4 to INFINITY) - check_list += span_warning("\tIt's bleeding profusely!") + bleed_text = span_warning("It's bleeding profusely!") + + if(bleed_text) + check_list += "\t[span_tooltip("You are loosing blood. You should wrap your limb in gauze \ + or apply pressure to it by grabbing yourself (while targeting the limb) to stem the flow.", bleed_text)]" return jointext(check_list, "
    ") +/// Returns surgery self-check information for this bodypart +/obj/item/bodypart/proc/get_surgery_self_check() + var/list/surgery_message = list() + var/reported_state = surgery_state + if(!LIMB_HAS_SKIN(src)) + reported_state &= ~SKINLESS_SURGERY_STATES + if(!LIMB_HAS_BONES(src)) + reported_state &= ~BONELESS_SURGERY_STATES + if(!LIMB_HAS_VESSELS(src)) + reported_state &= ~VESSELLESS_SURGERY_STATES + + if(HAS_SURGERY_STATE(reported_state, SURGERY_SKIN_CUT)) + surgery_message += "skin has been incised" + if(HAS_SURGERY_STATE(reported_state, SURGERY_SKIN_OPEN)) + surgery_message += "skin is opened" + + // We can only see these if the skin is open + // And we check the real state rather than reported_state + if(LIMB_HAS_ANY_SURGERY_STATE(src, ALL_SURGERY_SKIN_STATES)) + if(HAS_SURGERY_STATE(reported_state, SURGERY_VESSELS_UNCLAMPED)) + surgery_message += "blood vessels are unclamped and bleeding" + if(HAS_SURGERY_STATE(reported_state, SURGERY_VESSELS_CLAMPED)) + surgery_message += "blood vessels are clamped shut" + if(HAS_SURGERY_STATE(reported_state, SURGERY_ORGANS_CUT)) + surgery_message += "organs have been incised" + if(HAS_SURGERY_STATE(reported_state, SURGERY_BONE_SAWED)) + surgery_message += "bones have been sawed apart" + if(HAS_SURGERY_STATE(reported_state, SURGERY_BONE_DRILLED)) + surgery_message += "bones have been drilled through" + + if(HAS_SURGERY_STATE(reported_state, SURGERY_PROSTHETIC_UNSECURED)) + surgery_message += "prosthetic item is unsecured" + if(HAS_SURGERY_STATE(reported_state, SURGERY_PLASTIC_APPLIED)) + surgery_message += "got a layer of plastic applied to it" + if(HAS_SURGERY_STATE(reported_state, SURGERY_CAVITY_WIDENED)) + surgery_message += "chest cavity is wide open" + + if(length(surgery_message)) + return span_tooltip("Your limb is undergoing surgery. If no doctors are around, \ + you could suture or cauterize yourself to cancel it.", span_warning("Its [english_list(surgery_message)]!")) + return "" + +/// Returns surgery examine information for this bodypart +/obj/item/bodypart/proc/get_surgery_examine() + var/t_his = owner.p_their() + var/t_His = owner.p_Their() + var/single_message = "" + var/list/sub_messages = list() + var/reported_state = surgery_state + if(!LIMB_HAS_SKIN(src)) + reported_state &= ~SKINLESS_SURGERY_STATES + if(!LIMB_HAS_BONES(src)) + reported_state &= ~BONELESS_SURGERY_STATES + if(!LIMB_HAS_VESSELS(src)) + reported_state &= ~VESSELLESS_SURGERY_STATES + + if(HAS_SURGERY_STATE(reported_state, SURGERY_SKIN_CUT)) + sub_messages += "skin has been incised" + single_message = "The skin on [t_his] [plaintext_zone] has been incised." + if(HAS_SURGERY_STATE(reported_state, SURGERY_SKIN_OPEN)) + sub_messages += "skin is opened" + single_message = "The skin on [t_his] [plaintext_zone] is opened." + + // We can only see these if the skin is open + // And we check the real state rather than reported_state + if(LIMB_HAS_ANY_SURGERY_STATE(src, ALL_SURGERY_SKIN_STATES)) + if(HAS_SURGERY_STATE(reported_state, SURGERY_VESSELS_UNCLAMPED)) + sub_messages += "blood vessels are unclamped[cached_bleed_rate ? " and bleeding" : ""]" + single_message = "The blood vessels in [t_his] [plaintext_zone] are unclamped[cached_bleed_rate ? " and bleeding!" : "."]" + if(HAS_SURGERY_STATE(reported_state, SURGERY_VESSELS_CLAMPED)) + sub_messages += "blood vessels are clamped shut" + single_message = "The blood vessels in [t_his] [plaintext_zone] are clamped shut." + if(HAS_SURGERY_STATE(reported_state, SURGERY_ORGANS_CUT)) + sub_messages += "the organs within have been incised" + single_message = "The organs in [t_his] [plaintext_zone] have been incised." + if(HAS_SURGERY_STATE(reported_state, SURGERY_BONE_SAWED)) + sub_messages += "the bones within have been sawed apart" + single_message = "The bones in [t_his] [plaintext_zone] have been sawed apart." + if(HAS_SURGERY_STATE(reported_state, SURGERY_BONE_DRILLED)) + sub_messages += "the bones within have been drilled through" + single_message = "The bones in [t_his] [plaintext_zone] have been drilled through." + + if(HAS_SURGERY_STATE(reported_state, SURGERY_PROSTHETIC_UNSECURED)) + sub_messages += "prosthetic item is unsecured" + single_message = "[t_His] [plaintext_zone] is unsecured and loose!" + if(HAS_SURGERY_STATE(reported_state, SURGERY_PLASTIC_APPLIED)) + sub_messages += "got a layer of plastic applied to it" + single_message = "A layer of plastic has been applied to [t_his] [plaintext_zone]." + if(HAS_SURGERY_STATE(reported_state, SURGERY_CAVITY_WIDENED)) + sub_messages += "the chest cavity is wide open" + single_message = "[t_His] chest cavity is wide open!" + + if(length(sub_messages) >= 2) + return span_danger("[t_His] [plaintext_zone]'s [english_list(sub_messages)].") + if(single_message) + return span_danger(single_message) + return "" + /obj/item/bodypart/blob_act() receive_damage(max_damage, wound_bonus = CANT_WOUND) @@ -694,20 +820,34 @@ /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 (!isnull(any_existing_wound_can_mangle_our_interior) && !isnull(any_existing_wound_can_mangle_our_exterior)) + return + + any_existing_wound_can_mangle_our_interior = FALSE + any_existing_wound_can_mangle_our_exterior = FALSE - if (any_existing_wound_can_mangle_our_interior && any_existing_wound_can_mangle_our_exterior) - break + if (!is_woundable()) + return + + 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] + /// We only consider randoms because non-randoms are usually really specific + if (!pregen_data.can_be_applied_to(src, random_roll = TRUE, duplicates_allowed = TRUE, care_about_existing_wounds = FALSE)) + 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 + +/// Check if a bodypart can be wounded +/obj/item/bodypart/proc/is_woundable() + if (!owner) + return FALSE + if (HAS_TRAIT(owner, TRAIT_NEVER_WOUNDED) || HAS_TRAIT(owner, TRAIT_GODMODE)) + return FALSE + return TRUE //Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all. //Damage cannot go below zero. @@ -732,7 +872,6 @@ update_disabled() if(updating_health) owner.updatehealth() - cremation_progress = min(0, cremation_progress - ((get_damage())*(100/max_damage))) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE return update_bodypart_damage_state() ///Sets the damage of a bodypart when it is created. @@ -857,6 +996,9 @@ UnregisterSignal(old_owner, list(COMSIG_ATOM_RESTYLE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_LIVING_SET_BODY_POSITION)) + if(LIMB_HAS_SURGERY_STATE(src, ALL_SURGERY_FISH_STATES(body_zone))) + qdel(old_owner.GetComponent(/datum/component/fishing_spot)) + /// Apply ownership of a limb to someone, giving the appropriate traits, updates and signals /obj/item/bodypart/proc/apply_ownership(mob/living/carbon/new_owner) SHOULD_CALL_PARENT(TRUE) @@ -890,6 +1032,9 @@ forceMove(owner) RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(on_forced_removal)) //this must be set after we moved, or we insta gib + if(LIMB_HAS_SURGERY_STATE(src, ALL_SURGERY_FISH_STATES(body_zone))) + owner.AddComponent(/datum/component/fishing_spot, /datum/fish_source/surgery) + /// Called on addition of a bodypart /obj/item/bodypart/proc/on_adding(mob/living/carbon/new_owner) SHOULD_CALL_PARENT(TRUE) @@ -1120,42 +1265,43 @@ if(dropped && dmg_overlay_type) if(brutestate) // divided into two overlays: one that gets colored and one that doesn't. - var/image/brute_blood_overlay = image('icons/mob/effects/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_[brutestate]0", -DAMAGE_LAYER) + var/image/brute_blood_overlay = image('icons/mob/effects/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_[brutestate]0", -DAMAGE_LAYER, dir = SOUTH) brute_blood_overlay.color = get_color_from_blood_list(update_on ? update_on.get_blood_dna_list() : blood_dna_info) // living mobs can just get it fresh, dropped limbs use blood_dna_info var/mutable_appearance/brute_damage_overlay = mutable_appearance('icons/mob/effects/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_[brutestate]0_overlay", -DAMAGE_LAYER, appearance_flags = RESET_COLOR) if(brute_damage_overlay) brute_blood_overlay.overlays += brute_damage_overlay . += brute_blood_overlay if(burnstate) - . += image('icons/mob/effects/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER) + . += image('icons/mob/effects/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, dir = SOUTH) - var/image/limb = image(layer = -BODYPARTS_LAYER) - var/image/aux + var/image_dir = null + if (dropped) + image_dir = SOUTH // Handles invisibility (not alpha or actual invisibility but invisibility) if(is_invisible) - limb.icon = icon_invisible - limb.icon_state = "invisible_[body_zone]" - . += limb + . += image(icon_invisible, "invisible_[body_zone]", -BODYPARTS_LAYER, dir = image_dir) return . // Normal non-husk handling - // This is the MEAT of limb icon code - limb.icon = icon_greyscale + // This is the MEAT of limb icon code + var/used_icon = icon_greyscale if(!should_draw_greyscale || !icon_greyscale) - limb.icon = icon_static + used_icon = icon_static - if(is_dimorphic) //Does this type of limb have sexual dimorphism? - limb.icon_state = "[limb_id]_[body_zone]_[limb_gender]" - else - limb.icon_state = "[limb_id]_[body_zone]" + var/used_state = "[limb_id]_[body_zone]" + if(is_dimorphic) // Does this type of limb have sexual dimorphism? + used_state = "[limb_id]_[body_zone]_[limb_gender]" + + var/image/limb = image(used_icon, used_state, -BODYPARTS_LAYER, dir = image_dir) + var/image/aux = null icon_exists_or_scream(limb.icon, limb.icon_state) //Prints a stack trace on the first failure of a given iconstate. . += limb if(aux_zone) //Hand shit - aux = image(limb.icon, "[limb_id]_[aux_zone]", -aux_layer) + aux = image(limb.icon, "[limb_id]_[aux_zone]", -aux_layer, dir = image_dir) . += aux if(is_husked) @@ -1171,50 +1317,67 @@ if(aux_zone) aux.color = "[draw_color]" - //EMISSIVE CODE START - // 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. var/atom/location = loc || owner || src if(blocks_emissive != EMISSIVE_BLOCK_NONE) var/mutable_appearance/limb_em_block = emissive_blocker(limb.icon, limb.icon_state, location, layer = limb.layer, alpha = limb.alpha) + if (dropped) + limb_em_block = image(limb_em_block, dir = SOUTH) . += limb_em_block if(aux_zone) var/mutable_appearance/aux_em_block = emissive_blocker(aux.icon, aux.icon_state, location, layer = aux.layer, alpha = aux.alpha) + if (dropped) + aux_em_block = image(aux_em_block, dir = SOUTH) . += aux_em_block if(!is_husked && is_emissive) var/mutable_appearance/limb_em = emissive_appearance(limb.icon, "[limb.icon_state]_e", location, layer = limb.layer, alpha = limb.alpha) + if (dropped) + limb_em = image(limb_em, dir = SOUTH) . += limb_em if(aux_zone) var/mutable_appearance/aux_em = emissive_appearance(aux.icon, "[aux.icon_state]_e", location, layer = aux.layer, alpha = aux.alpha) + if (dropped) + aux_em = image(aux_em, dir = SOUTH) . += aux_em - //EMISSIVE CODE END - //No need to handle leg layering if dropped, we only face south anyways + // 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 + // 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 + // Remove the old, unmasked image . -= limb_image - //add two masked images based on the old one + // Add two masked images based on the old one . += leg_source.generate_masked_leg(limb_image) // And finally put bodypart_overlays on if not husked if(is_husked) return . - //Draw external organs like horns and frills + // Draw external organs like horns and frills for(var/datum/bodypart_overlay/overlay as anything in bodypart_overlays) if(!overlay.can_draw_on_bodypart(src, owner)) continue - //Some externals have multiple layers for background, foreground and between + + // Some externals have multiple layers for background, foreground and between for(var/external_layer in overlay.all_layers) - if(overlay.layers & external_layer) - . += overlay.get_overlay(external_layer, src) + if(!(overlay.layers & external_layer)) + continue + + var/external_overlay = overlay.get_overlay(external_layer, src) + if (!dropped) + . += external_overlay + continue + + if (!islist(external_overlay)) + . += image(external_overlay, dir = SOUTH) + continue + + for (var/mutable_appearance/actual_overlay as anything in external_overlay) + . += image(actual_overlay, dir = SOUTH) + for(var/datum/layer in .) overlay.modify_bodypart_appearance(layer) return . @@ -1326,6 +1489,28 @@ if(generic_bleedstacks > 0) cached_bleed_rate += 0.5 + // In 99% of situations we won't get to this point if we aren't wired or blooded + // But I'm covering my ass in case someone adds some weird new species + if(biological_state & BIOSTATE_HAS_VESSELS) + var/surgery_bloodloss = 0 + // better clamp those up quick + if(HAS_ANY_SURGERY_STATE(surgery_state, SURGERY_VESSELS_UNCLAMPED)) + surgery_bloodloss += 1.5 + // better, but still not exactly ideal + else if(HAS_ANY_SURGERY_STATE(surgery_state, SURGERY_VESSELS_CLAMPED|SURGERY_ORGANS_CUT)) + surgery_bloodloss += 0.2 + + // modify rate so cutting everything open won't nuke people + if(body_zone == BODY_ZONE_HEAD) + surgery_bloodloss *= 0.5 + else if(body_zone != BODY_ZONE_CHEST) + surgery_bloodloss *= 0.25 + // bonus for being gauzed up + if(current_gauze) + surgery_bloodloss *= 0.4 + + cached_bleed_rate += surgery_bloodloss + for(var/obj/item/embeddies as anything in embedded_objects) if(!embeddies.get_embed().is_harmless()) cached_bleed_rate += 0.25 @@ -1510,6 +1695,8 @@ return "flesh" if (biological_state & BIO_WIRED) return "wiring" + if (biological_state & BIO_CHITIN) + return "chitin" return "error" @@ -1519,6 +1706,12 @@ return "bone" if (biological_state & BIO_METAL) return "metal" + if (biological_state & BIO_FLESH) + return "shreds of ligaments" + if (biological_state & BIO_WOOD) + return "splinters of poorly manufactured wood" + if (biological_state & BIO_CHITIN) + return "fragments of chitin" return "error" @@ -1535,3 +1728,56 @@ if(isnull(owner)) return REMOVE_TRAIT(owner, old_trait, bodypart_trait_source) + +/// Add one or multiple surgical states to the bodypart +/obj/item/bodypart/proc/add_surgical_state(new_states) + if(!new_states) + CRASH("add_surgical_state called with no new states to add") + if((surgery_state & new_states) == new_states) + return + + var/old_states = surgery_state + surgery_state |= new_states + update_surgical_state(old_states, new_states) + +/// Remove one or multiple surgical states from the bodypart +/obj/item/bodypart/proc/remove_surgical_state(removing_states) + if(!removing_states) + CRASH("remove_surgical_state called with no states to remove") + if(!(surgery_state & removing_states)) + return + + // inherent to the biostate, don't remove them + if(!LIMB_HAS_SKIN(src)) + removing_states &= ~SKINLESS_SURGERY_STATES + if(!LIMB_HAS_BONES(src)) + removing_states &= ~BONELESS_SURGERY_STATES + if(!LIMB_HAS_VESSELS(src)) + removing_states &= ~VESSELLESS_SURGERY_STATES + if(!removing_states) + return + + var/old_states = surgery_state + surgery_state &= ~removing_states + update_surgical_state(old_states, removing_states) + +/// Called when surgical state changes so we can react to it +/obj/item/bodypart/proc/update_surgical_state(old_state, changed_states) + if(HAS_ANY_SURGERY_STATE(changed_states, SURGERY_ORGANS_CUT|ALL_SURGERY_VESSEL_STATES)) + refresh_bleed_rate() + + if(isnull(owner)) + return + SEND_SIGNAL(owner, COMSIG_LIVING_UPDATING_SURGERY_STATE, old_state, surgery_state, changed_states) + if(HAS_SURGERY_STATE(surgery_state, ALL_SURGERY_FISH_STATES(body_zone))) + owner.AddComponent(/datum/component/fishing_spot, /datum/fish_source/surgery) // no-op if they already have one + else if(HAS_SURGERY_STATE(old_state, ALL_SURGERY_FISH_STATES(body_zone))) + qdel(owner.GetComponent(/datum/component/fishing_spot)) + +/obj/item/bodypart/vv_edit_var(vname, vval) + if(vname != NAMEOF(src, surgery_state)) + return ..() + + var/old_state = surgery_state + . = ..() + update_surgical_state(old_state, surgery_state ^ old_state) diff --git a/code/modules/surgery/bodyparts/bodypart_effects.dm b/code/modules/surgery/bodyparts/bodypart_effects.dm index 496f07680973..b1d6daa31b20 100644 --- a/code/modules/surgery/bodyparts/bodypart_effects.dm +++ b/code/modules/surgery/bodyparts/bodypart_effects.dm @@ -104,8 +104,8 @@ var/need_mob_update = FALSE need_mob_update += owner.heal_overall_damage(brute = 0.5 * bodypart_coefficient, \ burn = 0.5 * bodypart_coefficient, updating_health = FALSE, required_bodytype = BODYTYPE_PLANT) - need_mob_update += owner.adjustToxLoss(-0.5 * bodypart_coefficient, updating_health = FALSE) - need_mob_update += owner.adjustOxyLoss(-0.5 * bodypart_coefficient, updating_health = FALSE) + need_mob_update += owner.adjust_tox_loss(-0.5 * bodypart_coefficient, updating_health = FALSE) + need_mob_update += owner.adjust_oxy_loss(-0.5 * bodypart_coefficient, updating_health = FALSE) if(need_mob_update) owner.updatehealth() diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index fb979ab054dd..2960dee55777 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -106,12 +106,6 @@ 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 - qdel(surgery) - break - if(!phantom_owner.has_embedded_objects()) phantom_owner.clear_alert(ALERT_EMBEDDED_OBJECT) phantom_owner.clear_mood_event("embedded") @@ -246,17 +240,17 @@ return ..() -///Try to attach this bodypart to a mob, while replacing one if it exists, does nothing if it fails. -/obj/item/bodypart/proc/replace_limb(mob/living/carbon/limb_owner, special) +///Try to attach this bodypart to a mob, while replacing one if it exists, does nothing if it fails. Returns TRUE on success, FALSE on failure. +/obj/item/bodypart/proc/replace_limb(mob/living/carbon/limb_owner) if(!istype(limb_owner)) - return + return FALSE var/obj/item/bodypart/old_limb = limb_owner.get_bodypart(body_zone) - if(old_limb) - old_limb.drop_limb(TRUE) + old_limb?.drop_limb(TRUE) - . = try_attach_limb(limb_owner, special) - if(!.) //If it failed to replace, re-attach their old limb as if nothing happened. - old_limb.try_attach_limb(limb_owner, TRUE) + if(!try_attach_limb(limb_owner, TRUE)) //If it failed to replace, re-attach their old limb as if nothing happened. + old_limb?.try_attach_limb(limb_owner, TRUE) + return FALSE + return TRUE ///Checks if a limb qualifies as a BODYPART_IMPLANTED /obj/item/bodypart/proc/check_for_frankenstein(mob/living/carbon/human/monster) @@ -295,16 +289,11 @@ 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. - var/surgery_zone = check_zone(attach_surgery.location) - if(surgery_zone == body_zone) - new_limb_owner.surgeries -= attach_surgery - qdel(attach_surgery) - break - for(var/obj/item/organ/organ as anything in new_limb_owner.organs) if(deprecise_zone(organ.zone) != body_zone) continue + if(organ.bodypart_owner == src) // someone manually updated the organs already + continue organ.bodypart_insert(src) for(var/datum/wound/wound as anything in wounds) @@ -370,8 +359,8 @@ sexy_chad.hair_color = hair_color sexy_chad.facial_hairstyle = facial_hairstyle sexy_chad.facial_hair_color = facial_hair_color - sexy_chad.grad_style = gradient_styles.Copy() - sexy_chad.grad_color = gradient_colors.Copy() + sexy_chad.grad_style = LAZYCOPY(gradient_styles) + sexy_chad.grad_color = LAZYCOPY(gradient_colors) sexy_chad.lip_style = lip_style sexy_chad.lip_color = lip_color diff --git a/code/modules/surgery/bodyparts/ghetto_parts.dm b/code/modules/surgery/bodyparts/ghetto_parts.dm index 03326f3754e4..5e8858c68c21 100644 --- a/code/modules/surgery/bodyparts/ghetto_parts.dm +++ b/code/modules/surgery/bodyparts/ghetto_parts.dm @@ -16,7 +16,8 @@ bodypart_traits = list(TRAIT_CHUNKYFINGERS) disabling_threshold_percentage = 1 bodypart_flags = BODYPART_UNHUSKABLE - biological_state = (BIO_JOINTED) + biological_state = (BIO_WOOD|BIO_JOINTED) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) /obj/item/bodypart/arm/left/ghetto/Initialize(mapload, ...) . = ..() @@ -40,7 +41,8 @@ bodypart_traits = list(TRAIT_CHUNKYFINGERS) disabling_threshold_percentage = 1 bodypart_flags = BODYPART_UNHUSKABLE - biological_state = (BIO_JOINTED) + biological_state = (BIO_WOOD|BIO_JOINTED) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) /obj/item/bodypart/arm/right/ghetto/Initialize(mapload, ...) . = ..() @@ -62,7 +64,8 @@ burn_modifier = 1.5 disabling_threshold_percentage = 1 bodypart_flags = BODYPART_UNHUSKABLE - biological_state = (BIO_JOINTED) + biological_state = (BIO_WOOD|BIO_JOINTED) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) /obj/item/bodypart/leg/left/ghetto/Initialize(mapload, ...) . = ..() @@ -84,7 +87,8 @@ burn_modifier = 1.5 disabling_threshold_percentage = 1 bodypart_flags = BODYPART_UNHUSKABLE - biological_state = (BIO_JOINTED) + biological_state = (BIO_WOOD|BIO_JOINTED) + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) /obj/item/bodypart/leg/right/ghetto/Initialize(mapload, ...) . = ..() diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 79524d43a12a..3b85fe54345d 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -15,7 +15,6 @@ wound_resistance = 5 disabled_wound_penalty = 25 scars_covered_by_clothes = FALSE - grind_results = null is_dimorphic = TRUE unarmed_attack_verbs = list("bite", "chomp") unarmed_attack_verbs_continuous = list("bites", "chomps") @@ -57,15 +56,9 @@ var/facial_hair_hidden = FALSE /// Gradient styles, if any - var/list/gradient_styles = list( - "None", //Hair gradient style - "None", //Facial hair gradient style - ) + var/list/gradient_styles /// Gradient colors, if any - var/list/gradient_colors = list( - COLOR_BLACK, //Hair gradient color - COLOR_BLACK, //Facial hair gradient color - ) + var/list/gradient_colors /// An override color that can be cleared later, affects both hair and facial hair var/override_hair_color = null @@ -111,6 +104,9 @@ QDEL_NULL(worn_face_offset) return ..() +/obj/item/bodypart/head/grind_results() + return null + /obj/item/bodypart/head/examine(mob/user) . = ..() if(show_organs_on_examine && IS_ORGANIC_LIMB(src)) @@ -173,38 +169,46 @@ /obj/item/bodypart/head/get_limb_icon(dropped, mob/living/carbon/update_on) . = ..() - . += get_hair_and_lips_icon(dropped) // We need to get the eyes if we are dropped (ugh) - if(dropped) - var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes) in src - // 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", -EYES_LAYER, SOUTH) - var/image/eye_right = image('icons/mob/human/human_face.dmi', "[eyes.eye_icon_state]_r", -EYES_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(!eyes && (head_flags & HEAD_EYEHOLES)) - var/image/no_eyes = image('icons/mob/human/human_face.dmi', "eyes_missing", -EYES_LAYER, SOUTH) - worn_face_offset?.apply_offset(no_eyes) - . += no_eyes - - return + if(!dropped) + return + + var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes) in src + if(!eyes) + if (!(head_flags & HEAD_EYEHOLES)) + return + var/image/no_eyes = image('icons/mob/human/human_eyes.dmi', "eyes_missing", -EYES_LAYER, SOUTH) + worn_face_offset?.apply_offset(no_eyes) + . += no_eyes + return + + if(!eyes.eye_icon_state || !(head_flags & HEAD_EYESPRITES)) + return + + // This is a bit of copy/paste code from eyes.dm:generate_body_overlay + var/image/eye_left = image(eyes.eye_icon, "[eyes.eye_icon_state]_l", -EYES_LAYER, SOUTH) + var/image/eye_right = image(eyes.eye_icon, "[eyes.eye_icon_state]_r", -EYES_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 + + var/list/emissive_overlays = eyes.get_emissive_overlays(eye_left, eye_right, src) + if(length(emissive_overlays)) + eye_left.overlays += image(emissive_overlays[1], dir = SOUTH) + eye_right.overlays += image(emissive_overlays[2], dir = SOUTH) + else if(blocks_emissive != EMISSIVE_BLOCK_NONE) + eye_left.overlays += image(emissive_blocker(eye_left.icon, eye_left.icon_state, src, alpha = eye_left.alpha), dir = SOUTH) + eye_right.overlays += image(emissive_blocker(eye_right.icon, eye_right.icon_state, src, alpha = eye_right.alpha), dir = SOUTH) + + if(worn_face_offset) + worn_face_offset.apply_offset(eye_left) + worn_face_offset.apply_offset(eye_right) + + . += eye_left + . += eye_right /obj/item/bodypart/head/Initialize(mapload) . = ..() @@ -265,6 +269,7 @@ burn_modifier = LIMB_ALIEN_BURN_DAMAGE_MULTIPLIER bodytype = BODYTYPE_ALIEN | BODYTYPE_ORGANIC bodyshape = BODYSHAPE_HUMANOID + biological_state = BIO_STANDARD_ALIEN /obj/item/bodypart/head/larva icon = 'icons/mob/human/species/alien/bodyparts.dmi' diff --git a/code/modules/surgery/bodyparts/head_hair_and_lips.dm b/code/modules/surgery/bodyparts/head_hair_and_lips.dm index 1d3ed4dfe5e6..f2af67ebac7f 100644 --- a/code/modules/surgery/bodyparts/head_hair_and_lips.dm +++ b/code/modules/surgery/bodyparts/head_hair_and_lips.dm @@ -3,14 +3,13 @@ /// 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 LAZYNULL(hair_masks) if(human_head_owner) - for(var/obj/item/worn_item in human_head_owner.get_equipped_items()) + for(var/obj/item/worn_item in human_head_owner.get_equipped_items(INCLUDE_ABSTRACT)) if(worn_item.hair_mask) LAZYSET(hair_masks, worn_item.hair_mask, TRUE) hair_hidden = !!(human_head_owner.obscured_slots & HIDEHAIR) @@ -43,18 +42,40 @@ 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.get_fixed_hair_color(human_head_owner) //Can be null - gradient_styles = human_head_owner.grad_style.Copy() - gradient_colors = human_head_owner.grad_color.Copy() + copy_appearance_from(human_head_owner) + +/obj/item/bodypart/head/proc/copy_appearance_from(mob/living/carbon/human/target, overwrite_eyes = FALSE) + var/datum/species/target_species = target.dna.species + + lip_style = target.lip_style + lip_color = target.lip_color + hairstyle = target.hairstyle + hair_alpha = target_species.hair_alpha + hair_color = target.hair_color + facial_hairstyle = target.facial_hairstyle + facial_hair_alpha = target_species.facial_hair_alpha + facial_hair_color = target.facial_hair_color + fixed_hair_color = target_species.get_fixed_hair_color(target) //Can be null + gradient_styles = LAZYCOPY(target.grad_style) + gradient_colors = LAZYCOPY(target.grad_color) + var/obj/item/organ/eyes/peepers = locate() in src + if(peepers) + if(overwrite_eyes || isnull(initial(peepers.eye_color_left))) + peepers.eye_color_left = target.eye_color_left + if(overwrite_eyes || isnull(initial(peepers.eye_color_right))) + peepers.eye_color_right = target.eye_color_right + + if(HAS_TRAIT(target, TRAIT_USES_SKINTONES)) + skin_tone = target.skin_tone + else if(HAS_TRAIT(target, TRAIT_MUTANT_COLORS)) + skin_tone = "" + if(target_species.fixed_mut_color) + species_color = target_species.fixed_mut_color + else + species_color = target.dna.features["mcolor"] + else + skin_tone = "" + species_color = "" /obj/item/bodypart/head/proc/get_hair_and_lips_icon(dropped) SHOULD_CALL_PARENT(TRUE) @@ -62,16 +83,16 @@ . = list() var/atom/location = loc || owner || src + var/image_dir = null + 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) + var/image/lip_overlay = image('icons/mob/human/human_face.dmi', "lips_[lip_style]", -BODY_LAYER, dir = 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 @@ -81,19 +102,22 @@ sprite_accessory = SSaccessories.facial_hairstyles_list[facial_hairstyle] if(sprite_accessory) //Overlay - facial_hair_overlay = image(sprite_accessory.icon, sprite_accessory.icon_state, -HAIR_LAYER) + facial_hair_overlay = image(sprite_accessory.icon, sprite_accessory.icon_state, -HAIR_LAYER, dir = 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) + var/mutable_appearance/em_block = emissive_blocker(facial_hair_overlay.icon, facial_hair_overlay.icon_state, location, alpha = facial_hair_alpha) + if (dropped) + em_block = image(em_block, dir = SOUTH) + facial_hair_overlay.overlays += em_block //Offsets worn_face_offset?.apply_offset(facial_hair_overlay) . += facial_hair_overlay //Gradients - var/facial_hair_gradient_style = gradient_styles[GRADIENT_FACIAL_HAIR_KEY] + var/facial_hair_gradient_style = get_hair_gradient_style(GRADIENT_FACIAL_HAIR_KEY) if(facial_hair_gradient_style != "None") - var/facial_hair_gradient_color = gradient_colors[GRADIENT_FACIAL_HAIR_KEY] - var/image/facial_hair_gradient_overlay = get_gradient_overlay(icon(sprite_accessory.icon, sprite_accessory.icon_state), -HAIR_LAYER, SSaccessories.facial_hair_gradients_list[facial_hair_gradient_style], facial_hair_gradient_color) + var/facial_hair_gradient_color = get_hair_gradient_color(GRADIENT_FACIAL_HAIR_KEY) + var/image/facial_hair_gradient_overlay = get_gradient_overlay(icon(sprite_accessory.icon, sprite_accessory.icon_state), -HAIR_LAYER, SSaccessories.facial_hair_gradients_list[facial_hair_gradient_style], facial_hair_gradient_color, dropped) . += facial_hair_gradient_overlay var/list/all_hair_overlays = list() @@ -103,7 +127,7 @@ //Hair masks var/icon/base_icon = icon(hair_sprite_accessory.getCachedIcon(hair_masks)) //Overlay - all_hair_overlays += image(base_icon, layer=-HAIR_LAYER) + all_hair_overlays += image(base_icon, layer=-HAIR_LAYER, dir = image_dir) //If we have any hair appendages (ponytails, etc.) sticking out on a particular side, we need to add an additional hair layer to go above hats/helmets for the sides they stick out on if(LAZYLEN(hair_sprite_accessory.hair_appendages_outer)) var/strictly_masked_zones = NONE @@ -112,29 +136,32 @@ for(var/appendage_icon_state in hair_sprite_accessory.hair_appendages_outer) var/appendage_zone = hair_sprite_accessory.hair_appendages_outer[appendage_icon_state] if(!(appendage_zone & strictly_masked_zones)) // if there are no strict masks in this zone - all_hair_overlays += image(hair_sprite_accessory.icon, icon_state=appendage_icon_state, layer=-OUTER_HAIR_LAYER) + all_hair_overlays += image(hair_sprite_accessory.icon, icon_state=appendage_icon_state, layer=-OUTER_HAIR_LAYER, dir = image_dir) for(var/image/hair_overlay as anything in all_hair_overlays) hair_overlay.alpha = hair_alpha hair_overlay.pixel_z = hair_sprite_accessory.y_offset //Emissive blocker if(blocks_emissive != EMISSIVE_BLOCK_NONE) - hair_overlay.overlays += emissive_blocker(hair_overlay.icon, hair_overlay.icon_state, location, alpha = hair_alpha) + var/mutable_appearance/em_block = emissive_blocker(hair_overlay.icon, hair_overlay.icon_state, location, alpha = hair_alpha) + if (dropped) + em_block = image(em_block, dir = SOUTH) + hair_overlay.overlays += em_block //Offsets worn_face_offset?.apply_offset(hair_overlay) . += hair_overlay //Gradients - var/hair_gradient_style = gradient_styles[GRADIENT_HAIR_KEY] + var/hair_gradient_style = get_hair_gradient_style(GRADIENT_HAIR_KEY) if(hair_gradient_style != "None") - var/hair_gradient_color = gradient_colors[GRADIENT_HAIR_KEY] - var/image/hair_gradient_overlay = get_gradient_overlay(base_icon, hair_overlay.layer, SSaccessories.hair_gradients_list[hair_gradient_style], hair_gradient_color) + var/hair_gradient_color = get_hair_gradient_color(GRADIENT_HAIR_KEY) + var/image/hair_gradient_overlay = get_gradient_overlay(base_icon, hair_overlay.layer, SSaccessories.hair_gradients_list[hair_gradient_style], hair_gradient_color, dropped) hair_gradient_overlay.pixel_z = hair_sprite_accessory.y_offset . += hair_gradient_overlay if(show_debrained && (head_flags & HEAD_DEBRAIN)) - . += get_debrain_overlay() + . += get_debrain_overlay(dropped) if(show_eyeless && (head_flags & HEAD_EYEHOLES)) - . += get_eyeless_overlay() + . += get_eyeless_overlay(dropped) //HAIR COLOR START if(override_hair_color) @@ -156,7 +183,7 @@ #undef SET_OVERLAY_VALUE /// Returns an appropriate debrained overlay -/obj/item/bodypart/head/proc/get_debrain_overlay() +/obj/item/bodypart/head/proc/get_debrain_overlay(dropped) RETURN_TYPE(/image) var/debrain_icon = 'icons/mob/human/human_face.dmi' var/debrain_icon_state = "debrained" @@ -171,21 +198,25 @@ debrain_icon_state = "debrained" var/image/debrain_overlay = mutable_appearance(debrain_icon, debrain_icon_state, -HAIR_LAYER) + if (dropped) + debrain_overlay = image(debrain_overlay, dir = 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() +/obj/item/bodypart/head/proc/get_eyeless_overlay(dropped) RETURN_TYPE(/image) - var/eyeless_icon = 'icons/mob/human/human_face.dmi' + var/eyeless_icon = 'icons/mob/human/human_eyes.dmi' var/eyeless_icon_state = "eyes_missing" var/image/eyeless_overlay = mutable_appearance(eyeless_icon, eyeless_icon_state, -HAIR_LAYER) + if (dropped) + eyeless_overlay = image(eyeless_overlay, dir = 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(icon/base_icon, layer, datum/sprite_accessory/gradient, grad_color) +/obj/item/bodypart/head/proc/get_gradient_overlay(icon/base_icon, layer, datum/sprite_accessory/gradient, grad_color, dropped) RETURN_TYPE(/mutable_appearance) var/mutable_appearance/gradient_overlay = mutable_appearance(layer = layer) @@ -194,6 +225,8 @@ temp.Blend(temp_hair, ICON_ADD) gradient_overlay.icon = temp gradient_overlay.color = grad_color + if (dropped) + gradient_overlay = image(gradient_overlay, dir = SOUTH) worn_face_offset?.apply_offset(gradient_overlay) return gradient_overlay @@ -269,6 +302,39 @@ if(update) update_body_parts() +/** + * Get the hair gradient style of a human. + * Defaults to "None". + * arguments: + * * key (optional) - corresponds to hair or facial hair index. If no key is provided returns whole list. + **/ +/mob/living/proc/get_hair_gradient_style(key) + return + +/mob/living/carbon/human/get_hair_gradient_style(key) + if(key) + return LAZYACCESS(grad_style, key) || "None" + + return grad_style || list( + "None", //Hair Gradient Style + "None", //Facial Hair Gradient Style + ) + +/** + * Get the hair gradient style of a head. + * Defaults to "None". + * arguments: + * * key (optional) - corresponds to hair or facial hair index. If no key is provided returns whole list. + **/ +/obj/item/bodypart/head/proc/get_hair_gradient_style(key) + if(key) + return LAZYACCESS(gradient_styles, key) || "None" + + return gradient_styles || list( + "None", //Hair Gradient Style + "None", //Facial Hair Gradient Style + ) + /** * Set the hair gradient style of a human. * Update calls update_body_parts(). @@ -277,17 +343,52 @@ return /mob/living/carbon/human/set_hair_gradient_style(new_style, update = TRUE) - if(grad_style[GRADIENT_HAIR_KEY] == new_style) + if(LAZYACCESS(grad_style, GRADIENT_HAIR_KEY) == new_style) return var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) - grad_style[GRADIENT_HAIR_KEY] = new_style + LAZYSET(grad_style, GRADIENT_HAIR_KEY, new_style) if(my_head) - my_head.gradient_styles[GRADIENT_HAIR_KEY] = new_style + LAZYSET(my_head.gradient_styles, GRADIENT_HAIR_KEY, new_style) if(update) update_body_parts() +/** + * Get the hair gradient color of a human. + * Defaults to black. + * + * arguments: + * * key (optional) - corresponds to hair or facial hair index. If no key is provided returns whole list. + **/ +/mob/living/proc/get_hair_gradient_color(key) + return + +/mob/living/carbon/human/get_hair_gradient_color(key) + if(key) + return LAZYACCESS(grad_color, key) || COLOR_BLACK + + return grad_color || list( + COLOR_BLACK, //Hair Gradient Color + COLOR_BLACK, //Facial Hair Gradient Color + ) + +/** + * Get the hair gradient color of a head. + * Defaults to black. + * + * arguments: + * * key (optional) - corresponds to hair or facial hair index. If no key is provided returns whole list. + **/ +/obj/item/bodypart/head/proc/get_hair_gradient_color(key) + if(key) + return LAZYACCESS(gradient_colors, key) || COLOR_BLACK + + return gradient_colors || list( + COLOR_BLACK, //Hair Gradient Color + COLOR_BLACK, //Facial Hair Gradient Color + ) + /** * Set the hair gradient color of a human. * Update calls update_body_parts(). @@ -296,13 +397,13 @@ return /mob/living/carbon/human/set_hair_gradient_color(new_color, update = TRUE) - if(grad_color[GRADIENT_HAIR_KEY] == new_color) + if(LAZYACCESS(grad_color, GRADIENT_HAIR_KEY) == new_color) return var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) - grad_color[GRADIENT_HAIR_KEY] = new_color + LAZYSET(grad_color, GRADIENT_HAIR_KEY, new_color) if(my_head) - my_head.gradient_colors[GRADIENT_HAIR_KEY] = new_color + LAZYSET(my_head.gradient_colors, GRADIENT_HAIR_KEY, new_color) if(update) update_body_parts() @@ -352,13 +453,13 @@ return /mob/living/carbon/human/set_facial_hair_gradient_style(new_style, update = TRUE) - if(grad_style[GRADIENT_FACIAL_HAIR_KEY] == new_style) + if(LAZYACCESS(grad_style, GRADIENT_FACIAL_HAIR_KEY) == new_style) return var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) - grad_style[GRADIENT_FACIAL_HAIR_KEY] = new_style + LAZYSET(grad_style, GRADIENT_FACIAL_HAIR_KEY, new_style) if(my_head) - my_head.gradient_styles[GRADIENT_FACIAL_HAIR_KEY] = new_style + LAZYSET(my_head.gradient_styles, GRADIENT_FACIAL_HAIR_KEY, new_style) if(update) update_body_parts() @@ -371,13 +472,13 @@ return /mob/living/carbon/human/set_facial_hair_gradient_color(new_color, update = TRUE) - if(grad_color[GRADIENT_FACIAL_HAIR_KEY] == new_color) + if(LAZYACCESS(grad_color, GRADIENT_FACIAL_HAIR_KEY) == new_color) return var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) - grad_color[GRADIENT_FACIAL_HAIR_KEY] = new_color + LAZYSET(grad_color, GRADIENT_FACIAL_HAIR_KEY, new_color) if(my_head) - my_head.gradient_colors[GRADIENT_FACIAL_HAIR_KEY] = new_color + LAZYSET(my_head.gradient_colors, GRADIENT_FACIAL_HAIR_KEY, new_color) if(update) update_body_parts() diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index d60862086725..23e1056d7166 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -10,7 +10,6 @@ is_dimorphic = TRUE px_x = 0 px_y = 0 - grind_results = null wound_resistance = 10 bodypart_trait_source = CHEST_TRAIT ///The bodyshape(s) allowed to attach to this chest. @@ -37,6 +36,9 @@ /// Which functional (i.e. flightpotion) wing types (if any) does this bodypart support? If count is >1 a radial menu is used to choose between all icons in list var/list/wing_types = list(/obj/item/organ/wings/functional/angel) +/obj/item/bodypart/chest/grind_results() + return null + /obj/item/bodypart/chest/forced_removal(dismembered, special, move_to_floor) var/mob/living/carbon/old_owner = owner ..(special = TRUE) //special because we're self destructing @@ -116,6 +118,7 @@ burn_modifier = LIMB_ALIEN_BURN_DAMAGE_MULTIPLIER acceptable_bodyshape = BODYSHAPE_HUMANOID wing_types = null + biological_state = BIO_STANDARD_ALIEN /obj/item/bodypart/chest/larva icon = 'icons/mob/human/species/alien/bodyparts.dmi' @@ -297,6 +300,7 @@ burn_modifier = LIMB_ALIEN_BURN_DAMAGE_MULTIPLIER should_draw_greyscale = FALSE appendage_noun = "scythe-like hand" + biological_state = BIO_STANDARD_ALIEN /obj/item/bodypart/arm/right name = "right arm" @@ -396,6 +400,7 @@ burn_modifier = LIMB_ALIEN_BURN_DAMAGE_MULTIPLIER should_draw_greyscale = FALSE appendage_noun = "scythe-like hand" + biological_state = BIO_STANDARD_ALIEN /// Parent Type for legs, should not appear in game. /obj/item/bodypart/leg @@ -532,6 +537,7 @@ max_damage = LIMB_MAX_HP_ALIEN_LIMBS burn_modifier = LIMB_ALIEN_BURN_DAMAGE_MULTIPLIER should_draw_greyscale = FALSE + biological_state = BIO_STANDARD_ALIEN /obj/item/bodypart/leg/right name = "right leg" @@ -623,3 +629,4 @@ max_damage = LIMB_MAX_HP_ALIEN_LIMBS burn_modifier = LIMB_ALIEN_BURN_DAMAGE_MULTIPLIER should_draw_greyscale = FALSE + biological_state = BIO_STANDARD_ALIEN diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm index ae762c1e1e56..35ebeee00b4a 100644 --- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm @@ -170,14 +170,14 @@ ///ZOMBIE /obj/item/bodypart/head/zombie limb_id = SPECIES_ZOMBIE - is_dimorphic = FALSE + is_dimorphic = TRUE // DARKPACK EDIT -- original : is_dimorphic = FALSE should_draw_greyscale = FALSE head_flags = HEAD_EYESPRITES|HEAD_DEBRAIN can_dismember = TRUE /obj/item/bodypart/chest/zombie limb_id = SPECIES_ZOMBIE - is_dimorphic = FALSE + is_dimorphic = TRUE // DARKPACK EDIT -- original : is_dimorphic = FALSE should_draw_greyscale = FALSE wing_types = null @@ -486,6 +486,7 @@ icon_state = "golem_head" biological_state = BIO_BONE bodytype = BODYTYPE_GOLEM | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_GOLEM limb_id = SPECIES_GOLEM is_dimorphic = FALSE should_draw_greyscale = FALSE @@ -493,6 +494,8 @@ head_flags = NONE // too hard to drill through teeth_count = 0 + brute_modifier = 0.5 + burn_modifier = 0.5 /obj/item/bodypart/head/golem/Initialize(mapload) worn_ears_offset = new( @@ -526,12 +529,15 @@ biological_state = BIO_BONE acceptable_bodytype = BODYTYPE_GOLEM bodytype = BODYTYPE_GOLEM | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_GOLEM limb_id = SPECIES_GOLEM is_dimorphic = FALSE should_draw_greyscale = FALSE dmg_overlay_type = null bodypart_traits = list(TRAIT_NO_JUMPSUIT) wing_types = null + brute_modifier = 0.5 + burn_modifier = 0.5 /obj/item/bodypart/chest/golem/Initialize(mapload) worn_belt_offset = new( @@ -547,6 +553,7 @@ icon_state = "golem_l_arm" biological_state = (BIO_BONE|BIO_JOINTED) bodytype = BODYTYPE_GOLEM | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_GOLEM limb_id = SPECIES_GOLEM should_draw_greyscale = FALSE dmg_overlay_type = null @@ -554,6 +561,8 @@ unarmed_damage_low = 5 unarmed_damage_high = 14 unarmed_effectiveness = 20 + brute_modifier = 0.5 + burn_modifier = 0.5 /obj/item/bodypart/arm/left/golem/Initialize(mapload) held_hand_offset = new( @@ -580,6 +589,7 @@ icon_state = "golem_r_arm" biological_state = (BIO_BONE|BIO_JOINTED) bodytype = BODYTYPE_GOLEM | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_GOLEM limb_id = SPECIES_GOLEM should_draw_greyscale = FALSE dmg_overlay_type = null @@ -587,6 +597,8 @@ unarmed_damage_low = 5 unarmed_damage_high = 14 unarmed_effectiveness = 20 + brute_modifier = 0.5 + burn_modifier = 0.5 /obj/item/bodypart/arm/right/golem/Initialize(mapload) held_hand_offset = new( @@ -613,12 +625,15 @@ icon_state = "golem_l_leg" biological_state = (BIO_BONE|BIO_JOINTED) bodytype = BODYTYPE_GOLEM | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_GOLEM limb_id = SPECIES_GOLEM should_draw_greyscale = FALSE dmg_overlay_type = null unarmed_damage_low = 7 unarmed_damage_high = 21 unarmed_effectiveness = 25 + brute_modifier = 0.5 + burn_modifier = 0.5 /obj/item/bodypart/leg/right/golem icon = 'icons/mob/human/species/golems.dmi' @@ -626,12 +641,15 @@ icon_state = "golem_r_leg" biological_state = (BIO_BONE|BIO_JOINTED) bodytype = BODYTYPE_GOLEM | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_GOLEM limb_id = SPECIES_GOLEM should_draw_greyscale = FALSE dmg_overlay_type = null unarmed_damage_low = 7 unarmed_damage_high = 21 unarmed_effectiveness = 25 + brute_modifier = 0.5 + burn_modifier = 0.5 ///flesh diff --git a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm index 28fc86beee18..07e9827d5d94 100644 --- a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm @@ -7,8 +7,6 @@ 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 bodypart_flags = BODYPART_UNHUSKABLE bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/plasma_based) @@ -22,8 +20,6 @@ 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 bodypart_flags = BODYPART_UNHUSKABLE wing_types = null bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/plasma_based) @@ -39,8 +35,6 @@ 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 bodypart_flags = BODYPART_UNHUSKABLE bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/plasma_based) @@ -52,8 +46,6 @@ 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 bodypart_flags = BODYPART_UNHUSKABLE bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/plasma_based) @@ -65,8 +57,6 @@ 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 bodypart_flags = BODYPART_UNHUSKABLE bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/plasma_based) @@ -78,7 +68,5 @@ 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 bodypart_flags = BODYPART_UNHUSKABLE bodypart_effects = list(/datum/status_effect/grouped/bodypart_effect/plasma_based) diff --git a/code/modules/surgery/bodyparts/wounds.dm b/code/modules/surgery/bodyparts/wounds.dm index a3cd74a8f952..07a9c3330bdf 100644 --- a/code/modules/surgery/bodyparts/wounds.dm +++ b/code/modules/surgery/bodyparts/wounds.dm @@ -53,7 +53,7 @@ SHOULD_CALL_PARENT(TRUE) RETURN_TYPE(/datum/wound) - if(HAS_TRAIT(owner, TRAIT_NEVER_WOUNDED) || HAS_TRAIT(owner, TRAIT_GODMODE)) + if(!is_woundable()) return // note that these are fed into an exponent, so these are magnified @@ -90,73 +90,49 @@ return 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 exposed_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.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)) - exposed_wound_bonus = 0 - break - - 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 + 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.compete_for_wounding) + continue - 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) + if (pregen_data.can_be_applied_to(src, woundtype, random_roll = TRUE)) + possible_wounds[wound_type] = pregen_data.get_weight(src, woundtype, damage, attack_direction, damage_source) + + for (var/datum/wound/wound_type as anything in possible_wounds) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[wound_type] + for (var/datum/wound/other_path as anything in (possible_wounds - wound_type)) + + if (pregen_data.competition_mode == WOUND_COMPETITION_OVERPOWER_LESSERS) + if (initial(wound_type.severity) > initial(other_path.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 (TRUE) - var/datum/wound/possible_wound = pick_weight(possible_wounds) - if (isnull(possible_wound)) - break - - possible_wounds -= possible_wound - var/datum/wound_pregen_data/possible_pregen_data = GLOB.all_wound_pregen_data[possible_wound] - - var/datum/wound/replaced_wound - for(var/datum/wound/existing_wound as anything in wounds) - 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)) - continue - else - replaced_wound = existing_wound - // if we get through this whole loop without continuing, we found our winner - - 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, exposed_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 + else if (pregen_data.competition_mode == WOUND_COMPETITION_OVERPOWER_GREATERS) + if (initial(wound_type.severity) < initial(other_path.severity)) + possible_wounds -= other_path + + if (!length(possible_wounds)) + return + + var/datum/wound/possible_wound = pick_weight(possible_wounds) + var/datum/wound_pregen_data/possible_pregen_data = GLOB.all_wound_pregen_data[possible_wound] + var/datum/wound/replaced_wound = null + for(var/datum/wound/existing_wound as anything in wounds) + 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)) + continue + replaced_wound = existing_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, exposed_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(datum/wound/potential_wound, smited = FALSE, wound_source) @@ -197,11 +173,7 @@ 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) + var/datum/wound/corresponding_typepath = get_corresponding_wound_type(wounding_type, limb, min_severity, max_severity, severity_pick_mode) if (corresponding_typepath) return limb.force_wound_upwards(corresponding_typepath, wound_source = wound_source) @@ -228,11 +200,7 @@ * 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) + var/datum/wound/wound_path = get_corresponding_wound_type(wounding_type, 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) @@ -330,7 +298,10 @@ 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] on your [plaintext_zone] falls away.")) + if (owner) + owner.visible_message(span_notice("\The [current_gauze.name] on [owner]'s [name] falls away."), span_notice("\The [current_gauze] on your [plaintext_zone] falls away.")) + else + visible_message(span_notice("\The [current_gauze.name] on [name] falls away.")) QDEL_NULL(current_gauze) wound_damage_multiplier = dam_mul diff --git a/code/modules/surgery/bone_mending.dm b/code/modules/surgery/bone_mending.dm deleted file mode 100644 index 24cea41ce302..000000000000 --- a/code/modules/surgery/bone_mending.dm +++ /dev/null @@ -1,268 +0,0 @@ - -/////BONE FIXING SURGERIES////// - -///// Repair Hairline Fracture (Severe) -/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/bone/severe - possible_locs = list( - BODY_ZONE_R_ARM, - BODY_ZONE_L_ARM, - BODY_ZONE_R_LEG, - BODY_ZONE_L_LEG, - BODY_ZONE_CHEST, - BODY_ZONE_HEAD, - ) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/repair_bone_hairline, - /datum/surgery_step/close, - ) - -///// Repair Compound Fracture (Critical) -/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/bone/critical - possible_locs = list( - BODY_ZONE_R_ARM, - BODY_ZONE_L_ARM, - BODY_ZONE_R_LEG, - BODY_ZONE_L_LEG, - BODY_ZONE_CHEST, - BODY_ZONE_HEAD, - ) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/reset_compound_fracture, - /datum/surgery_step/repair_bone_compound, - /datum/surgery_step/close, - ) - -//SURGERY STEPS - -///// Repair Hairline Fracture (Severe) -/datum/surgery_step/repair_bone_hairline - name = "repair hairline fracture (bonesetter/bone gel/tape)" - implements = list( - TOOL_BONESET = 100, - /obj/item/stack/medical/bone_gel = 100, - /obj/item/stack/sticky_tape/surgical = 100, - /obj/item/stack/sticky_tape/super = 50, - /obj/item/stack/sticky_tape = 30) - time = 4 SECONDS - -/datum/surgery_step/repair_bone_hairline/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(surgery.operated_wound) - display_results( - user, - target, - span_notice("You begin to repair the fracture in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]..."), - span_notice("[user] begins to repair the fracture in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)] with [tool]."), - span_notice("[user] begins to repair the fracture in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), - ) - display_pain(target, "Your [target.parse_zone_with_bodypart(user.zone_selected)] aches with pain!") - else - user.visible_message(span_notice("[user] looks for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), span_notice("You look for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]...")) - -/datum/surgery_step/repair_bone_hairline/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(surgery.operated_wound) - if(isstack(tool)) - var/obj/item/stack/used_stack = tool - used_stack.use(1) - display_results( - user, - target, - span_notice("You successfully repair the fracture in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] successfully repairs the fracture in [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]!"), - span_notice("[user] successfully repairs the fracture in [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - log_combat(user, target, "repaired a hairline fracture in", addition="COMBAT_MODE: [uppertext(user.combat_mode)]") - qdel(surgery.operated_wound) - else - to_chat(user, span_warning("[target] has no hairline fracture there!")) - return ..() - -/datum/surgery_step/repair_bone_hairline/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob = 0) - ..() - if(isstack(tool)) - var/obj/item/stack/used_stack = tool - used_stack.use(1) - - - -///// Reset Compound Fracture (Crticial) -/datum/surgery_step/reset_compound_fracture - name = "reset bone (bonesetter)" - implements = list( - TOOL_BONESET = 100, - /obj/item/stack/sticky_tape/surgical = 60, - /obj/item/stack/sticky_tape/super = 40, - /obj/item/stack/sticky_tape = 20) - time = 4 SECONDS - -/datum/surgery_step/reset_compound_fracture/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(surgery.operated_wound) - display_results( - user, - target, - span_notice("You begin to reset the bone in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]..."), - span_notice("[user] begins to reset the bone in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)] with [tool]."), - span_notice("[user] begins to reset the bone in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), - ) - display_pain(target, "The aching pain in your [target.parse_zone_with_bodypart(user.zone_selected)] is overwhelming!") - else - user.visible_message(span_notice("[user] looks for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), span_notice("You look for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]...")) - -/datum/surgery_step/reset_compound_fracture/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(surgery.operated_wound) - if(isstack(tool)) - var/obj/item/stack/used_stack = tool - used_stack.use(1) - display_results( - user, - target, - span_notice("You successfully reset the bone in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] successfully resets the bone in [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]!"), - span_notice("[user] successfully resets the bone in [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - log_combat(user, target, "reset a compound fracture in", addition="COMBAT MODE: [uppertext(user.combat_mode)]") - else - to_chat(user, span_warning("[target] has no compound fracture there!")) - return ..() - -/datum/surgery_step/reset_compound_fracture/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob = 0) - ..() - if(isstack(tool)) - var/obj/item/stack/used_stack = tool - used_stack.use(1) - -#define IMPLEMENTS_THAT_FIX_BONES list( \ - /obj/item/stack/medical/bone_gel = 100, \ - /obj/item/stack/sticky_tape/surgical = 100, \ - /obj/item/stack/sticky_tape/super = 50, \ - /obj/item/stack/sticky_tape = 30, \ -) - - -///// Repair Compound Fracture (Crticial) -/datum/surgery_step/repair_bone_compound - name = "repair compound fracture (bone gel/tape)" - implements = IMPLEMENTS_THAT_FIX_BONES - time = 4 SECONDS - -/datum/surgery_step/repair_bone_compound/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(surgery.operated_wound) - display_results( - user, - target, - span_notice("You begin to repair the fracture in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]..."), - span_notice("[user] begins to repair the fracture in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)] with [tool]."), - span_notice("[user] begins to repair the fracture in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), - ) - display_pain(target, "The aching pain in your [target.parse_zone_with_bodypart(user.zone_selected)] is overwhelming!") - else - user.visible_message(span_notice("[user] looks for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), span_notice("You look for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]...")) - -/datum/surgery_step/repair_bone_compound/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(surgery.operated_wound) - if(isstack(tool)) - var/obj/item/stack/used_stack = tool - used_stack.use(1) - display_results( - user, - target, - span_notice("You successfully repair the fracture in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] successfully repairs the fracture in [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]!"), - span_notice("[user] successfully repairs the fracture in [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - log_combat(user, target, "repaired a compound fracture in", addition="COMBAT MODE: [uppertext(user.combat_mode)]") - qdel(surgery.operated_wound) - else - to_chat(user, span_warning("[target] has no compound fracture there!")) - return ..() - -/datum/surgery_step/repair_bone_compound/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob = 0) - ..() - if(isstack(tool)) - var/obj/item/stack/used_stack = tool - used_stack.use(1) - -/// Surgery to repair cranial fissures -/datum/surgery/cranial_reconstruction - name = "Cranial reconstruction" - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB - targetable_wound = /datum/wound/cranial_fissure - possible_locs = list( - BODY_ZONE_HEAD, - ) - steps = list( - /datum/surgery_step/clamp_bleeders/discard_skull_debris, - /datum/surgery_step/repair_skull - ) - -/datum/surgery_step/clamp_bleeders/discard_skull_debris - name = "discard skull debris (hemostat)" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_WIRECUTTER = 40, - TOOL_SCREWDRIVER = 40, - ) - time = 2.4 SECONDS - preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' - -/datum/surgery_step/clamp_bleeders/discard_skull_debris/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to discard the smaller skull debris in [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to discard the smaller skull debris in [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to poke around in [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - ) - - display_pain(target, "Your brain feels like it's getting stabbed by little shards of glass!") - -/datum/surgery_step/repair_skull - name = "repair skull (bone gel/tape)" - implements = IMPLEMENTS_THAT_FIX_BONES - time = 4 SECONDS - -/datum/surgery_step/repair_skull/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) - ASSERT(surgery.operated_wound, "Repairing skull without a wound") - - display_results( - user, - target, - span_notice("You begin to repair [target]'s skull as best you can..."), - span_notice("[user] begins to repair [target]'s skull with [tool]."), - span_notice("[user] begins to repair [target]'s skull."), - ) - - display_pain(target, "You can feel pieces of your skull rubbing against your brain!") - -/datum/surgery_step/repair_skull/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - if (isnull(surgery.operated_wound)) - to_chat(user, span_warning("[target]'s skull is fine!")) - return ..() - - - if (isstack(tool)) - var/obj/item/stack/used_stack = tool - used_stack.use(1) - - display_results( - user, - target, - span_notice("You successfully repair [target]'s skull."), - span_notice("[user] successfully repairs [target]'s skull with [tool]."), - span_notice("[user] successfully repairs [target]'s skull.") - ) - - qdel(surgery.operated_wound) - - return ..() - -#undef IMPLEMENTS_THAT_FIX_BONES diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm deleted file mode 100644 index c3a9baafde10..000000000000 --- a/code/modules/surgery/brain_surgery.dm +++ /dev/null @@ -1,92 +0,0 @@ -/datum/surgery/brain_surgery - name = "Brain surgery" - possible_locs = list(BODY_ZONE_HEAD) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/fix_brain, - /datum/surgery_step/close, - ) - -/datum/surgery/brain_surgery/mechanic - name = "Wetware OS Diagnostics" - requires_bodypart_type = BODYTYPE_ROBOTIC - possible_locs = list(BODY_ZONE_HEAD) - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/fix_brain/mechanic, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery_step/fix_brain - name = "fix brain (hemostat)" - implements = list( - TOOL_HEMOSTAT = 85, - TOOL_SCREWDRIVER = 35, - /obj/item/pen = 15) //don't worry, pouring some alcohol on their open brain will get that chance to 100 - repeatable = TRUE - time = 100 //long and complicated - preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' - success_sound = 'sound/items/handling/surgery/hemostat1.ogg' - failure_sound = 'sound/items/handling/surgery/organ2.ogg' - -/datum/surgery_step/fix_brain/mechanic - name = "perform neural debugging (hemostat or multitool)" - implements = list( - TOOL_HEMOSTAT = 85, - TOOL_MULTITOOL = 85, - TOOL_SCREWDRIVER = 35, - /obj/item/pen = 15) - preop_sound = 'sound/items/taperecorder/tape_flip.ogg' - success_sound = 'sound/items/taperecorder/taperecorder_close.ogg' - -/datum/surgery/brain_surgery/can_start(mob/user, mob/living/carbon/target) - return target.get_organ_slot(ORGAN_SLOT_BRAIN) && ..() - -/datum/surgery_step/fix_brain/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to fix [target]'s brain..."), - span_notice("[user] begins to fix [target]'s brain."), - span_notice("[user] begins to perform surgery on [target]'s brain."), - ) - display_pain(target, "Your head pounds with unimaginable pain!") - -/datum/surgery_step/fix_brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results( - user, - target, - span_notice("You succeed in fixing [target]'s brain."), - span_notice("[user] successfully fixes [target]'s brain!"), - span_notice("[user] completes the surgery on [target]'s brain."), - ) - display_pain(target, "The pain in your head receeds, thinking becomes a bit easier!") - if(target.mind?.has_antag_datum(/datum/antagonist/brainwashed)) - target.mind.remove_antag_datum(/datum/antagonist/brainwashed) - target.setOrganLoss(ORGAN_SLOT_BRAIN, target.get_organ_loss(ORGAN_SLOT_BRAIN) - 50) //we set damage in this case in order to clear the "failing" flag - target.cure_all_traumas(TRAUMA_RESILIENCE_SURGERY) - if(target.get_organ_loss(ORGAN_SLOT_BRAIN) > 0) - to_chat(user, "[target]'s brain looks like it could be fixed further.") - return ..() - -/datum/surgery_step/fix_brain/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(target.get_organ_slot(ORGAN_SLOT_BRAIN)) - display_results( - user, - target, - span_warning("You screw up, causing more damage!"), - span_warning("[user] screws up, causing brain damage!"), - span_notice("[user] completes the surgery on [target]'s brain."), - ) - display_pain(target, "Your head throbs with horrible pain; thinking hurts!") - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60) - target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY) - else - user.visible_message(span_warning("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore."), span_warning("You suddenly notice that the brain you were working on is not there anymore.")) - return FALSE diff --git a/code/modules/surgery/burn_dressing.dm b/code/modules/surgery/burn_dressing.dm deleted file mode 100644 index 2e87d6b51b71..000000000000 --- a/code/modules/surgery/burn_dressing.dm +++ /dev/null @@ -1,181 +0,0 @@ - -/////BURN FIXING SURGERIES////// - -///// Debride burnt flesh -/datum/surgery/debride - name = "Debride burnt flesh" - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB - targetable_wound = /datum/wound/burn/flesh - possible_locs = list( - BODY_ZONE_R_ARM, - BODY_ZONE_L_ARM, - BODY_ZONE_R_LEG, - BODY_ZONE_L_LEG, - BODY_ZONE_CHEST, - BODY_ZONE_HEAD, - ) - steps = list( - /datum/surgery_step/debride, - /datum/surgery_step/dress, - ) - -/datum/surgery/debride/can_start(mob/living/user, mob/living/carbon/target) - . = ..() - if(!.) - return . - - var/datum/wound/burn/flesh/burn_wound = target.get_bodypart(user.zone_selected).get_wound_type(targetable_wound) - // Should be guaranteed to have the wound by this point - ASSERT(burn_wound, "[type] on [target] has no burn wound when it should have been guaranteed to have one by can_start") - return burn_wound.infestation > 0 - -//SURGERY STEPS - -///// Debride -/datum/surgery_step/debride - name = "excise infection (hemostat)" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_SCALPEL = 85, - TOOL_SAW = 60, - TOOL_WIRECUTTER = 40) - time = 3 SECONDS - repeatable = TRUE - preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' - success_sound = 'sound/items/handling/surgery/retractor2.ogg' - failure_sound = 'sound/items/handling/surgery/organ1.ogg' - surgery_effects_mood = TRUE - /// How much sanitization is added per step - var/sanitization_added = 0.5 - /// How much infestation is removed per step (positive number) - 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/flesh/burn_wound) - if(!burn_wound?.infestation || !infestation_removed) - return - var/estimated_remaining_steps = burn_wound.infestation / infestation_removed - var/progress_text - - switch(estimated_remaining_steps) - if(-INFINITY to 1) - return - if(1 to 2) - progress_text = ", preparing to remove the last remaining bits of infection" - if(2 to 4) - progress_text = ", steadily narrowing the remaining bits of infection" - if(5 to INFINITY) - progress_text = ", though there's still quite a lot to excise" - - return progress_text - -/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/flesh/burn_wound = surgery.operated_wound - if(burn_wound.infestation <= 0) - to_chat(user, span_notice("[target]'s [target.parse_zone_with_bodypart(user.zone_selected)] has no infected flesh to remove!")) - surgery.status++ - repeatable = FALSE - return - display_results( - user, - target, - span_notice("You begin to excise infected flesh from [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]..."), - span_notice("[user] begins to excise infected flesh from [target]'s [target.parse_zone_with_bodypart(user.zone_selected)] with [tool]."), - span_notice("[user] begins to excise infected flesh from [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), - ) - display_pain(target, "The infection in your [target.parse_zone_with_bodypart(user.zone_selected)] stings like hell! It feels like you're being stabbed!") - else - user.visible_message(span_notice("[user] looks for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), span_notice("You look for [target]'s [target.parse_zone_with_bodypart(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/flesh/burn_wound = surgery.operated_wound - if(burn_wound) - var/progress_text = get_progress(user, target, burn_wound) - display_results( - user, - target, - span_notice("You successfully excise some of the infected flesh from [target]'s [target.parse_zone_with_bodypart(target_zone)][progress_text]."), - span_notice("[user] successfully excises some of the infected flesh from [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]!"), - span_notice("[user] successfully excises some of the infected flesh from [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - log_combat(user, target, "excised infected flesh in", addition="COMBAT MODE: [uppertext(user.combat_mode)]") - target.apply_damage(3, BRUTE, surgery.operated_bodypart, wound_bonus = CANT_WOUND, sharpness = SHARP_EDGED, attacking_item = tool) - burn_wound.infestation -= infestation_removed - burn_wound.sanitization += sanitization_added - if(burn_wound.infestation <= 0) - repeatable = FALSE - else - to_chat(user, span_warning("[target] has no infected flesh there!")) - return ..() - -/datum/surgery_step/debride/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob = 0) - ..() - display_results( - user, - target, - span_notice("You carve away some of the healthy flesh from [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] carves away some of the healthy flesh from [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]!"), - span_notice("[user] carves away some of the healthy flesh from [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - target.apply_damage(rand(4, 8), BRUTE, surgery.operated_bodypart, sharpness = SHARP_EDGED, attacking_item = tool) - -/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/flesh/burn_wound = surgery.operated_wound - while(burn_wound && burn_wound.infestation > 0.25) - if(!..()) - break - -///// Dressing burns -/datum/surgery_step/dress - name = "bandage burns (gauze/tape)" - implements = list( - /obj/item/stack/medical/gauze = 100, - /obj/item/stack/sticky_tape/surgical = 100) - time = 4 SECONDS - /// How much sanitization is added - var/sanitization_added = 3 - /// How much flesh healing is added - var/flesh_healing_added = 5 - - -/datum/surgery_step/dress/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound - if(burn_wound) - display_results( - user, - target, - span_notice("You begin to dress the burns on [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]..."), - span_notice("[user] begins to dress the burns on [target]'s [target.parse_zone_with_bodypart(user.zone_selected)] with [tool]."), - span_notice("[user] begins to dress the burns on [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), - ) - display_pain(target, "The burns on your [target.parse_zone_with_bodypart(user.zone_selected)] sting like hell!") - else - user.visible_message(span_notice("[user] looks for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), span_notice("You look for [target]'s [target.parse_zone_with_bodypart(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/flesh/burn_wound = surgery.operated_wound - if(burn_wound) - display_results( - user, - target, - span_notice("You successfully wrap [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]."), - span_notice("[user] successfully wraps [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]!"), - span_notice("[user] successfully wraps [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - log_combat(user, target, "dressed burns in", addition="COMBAT MODE: [uppertext(user.combat_mode)]") - burn_wound.sanitization += sanitization_added - burn_wound.flesh_healing += flesh_healing_added - var/obj/item/bodypart/the_part = target.get_bodypart(target_zone) - the_part.apply_gauze(tool) - else - to_chat(user, span_warning("[target] has no burns there!")) - return ..() - -/datum/surgery_step/dress/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob = 0) - ..() - if(isstack(tool)) - var/obj/item/stack/used_stack = tool - used_stack.use(1) diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm deleted file mode 100644 index cfab9cf74241..000000000000 --- a/code/modules/surgery/cavity_implant.dm +++ /dev/null @@ -1,87 +0,0 @@ -/datum/surgery/cavity_implant - name = "Cavity implant" - 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/incise, - /datum/surgery_step/handle_cavity, - /datum/surgery_step/close) - -GLOBAL_LIST_INIT(heavy_cavity_implants, typecacheof(list(/obj/item/transfer_valve))) - -//handle cavity -/datum/surgery_step/handle_cavity - name = "implant item" - accept_hand = 1 - implements = list(/obj/item = 100) - repeatable = TRUE - time = 3.2 SECONDS - preop_sound = 'sound/items/handling/surgery/organ1.ogg' - success_sound = 'sound/items/handling/surgery/organ2.ogg' - var/obj/item/item_for_cavity - -/datum/surgery_step/handle_cavity/tool_check(mob/user, obj/item/tool) - if(tool.tool_behaviour == TOOL_CAUTERY || istype(tool, /obj/item/gun/energy/laser)) - return FALSE - return !tool.get_temperature() - -/datum/surgery_step/handle_cavity/preop(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/obj/item/bodypart/chest/target_chest = target.get_bodypart(BODY_ZONE_CHEST) - item_for_cavity = target_chest.cavity_item - if(tool) - display_results( - user, - target, - span_notice("You begin to insert [tool] into [target]'s [target_zone]..."), - span_notice("[user] begins to insert [tool] into [target]'s [target_zone]."), - span_notice("[user] begins to insert [tool.w_class > WEIGHT_CLASS_SMALL ? tool : "something"] into [target]'s [target_zone]."), - ) - display_pain(target, "You can feel something being inserted into your [target_zone], it hurts like hell!") - return - - display_results( - user, - target, - span_notice("You check for items in [target]'s [target_zone]..."), - span_notice("[user] checks for items in [target]'s [target_zone]."), - span_notice("[user] looks for something in [target]'s [target_zone]."), - ) - -/datum/surgery_step/handle_cavity/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery = FALSE) - var/obj/item/bodypart/chest/target_chest = target.get_bodypart(BODY_ZONE_CHEST) - if(tool) - if(item_for_cavity || ((tool.w_class > WEIGHT_CLASS_NORMAL) && !is_type_in_typecache(tool, GLOB.heavy_cavity_implants)) || HAS_TRAIT(tool, TRAIT_NODROP) || (tool.item_flags & ABSTRACT) || isorgan(tool)) - to_chat(user, span_warning("You can't seem to fit [tool] in [target]'s [target_zone]!")) - return FALSE - - display_results( - user, - target, - span_notice("You stuff [tool] into [target]'s [target_zone]."), - span_notice("[user] stuffs [tool] into [target]'s [target_zone]!"), - span_notice("[user] stuffs [tool.w_class > WEIGHT_CLASS_SMALL ? tool : "something"] into [target]'s [target_zone]."), - ) - - if (!user.transferItemToLoc(tool, target, TRUE)) - return FALSE - - target_chest.cavity_item = tool - return ..() - - if(!item_for_cavity) - to_chat(user, span_warning("You don't find anything in [target]'s [target_zone].")) - return FALSE - - display_results( - user, - target, - span_notice("You pull [item_for_cavity] out of [target]'s [target_zone]."), - span_notice("[user] pulls [item_for_cavity] out of [target]'s [target_zone]!"), - span_notice("[user] pulls [item_for_cavity.w_class > WEIGHT_CLASS_SMALL ? item_for_cavity : "something"] out of [target]'s [target_zone]."), - ) - display_pain(target, "Something is pulled out of your [target_zone]! It hurts like hell!") - user.put_in_hands(item_for_cavity) - target_chest.cavity_item = null - return ..() diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm deleted file mode 100644 index 890d62413f22..000000000000 --- a/code/modules/surgery/core_removal.dm +++ /dev/null @@ -1,51 +0,0 @@ -/datum/surgery/core_removal - name = "Core removal" - target_mobtypes = list(/mob/living/basic/slime) - surgery_flags = SURGERY_IGNORE_CLOTHES - possible_locs = list( - BODY_ZONE_R_ARM, - BODY_ZONE_L_ARM, - BODY_ZONE_R_LEG, - BODY_ZONE_L_LEG, - BODY_ZONE_CHEST, - BODY_ZONE_HEAD, - ) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/extract_core, - ) - -/datum/surgery/core_removal/can_start(mob/user, mob/living/target) - return target.stat == DEAD && ..() - -//extract brain -/datum/surgery_step/extract_core - name = "extract core (hemostat/crowbar)" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_CROWBAR = 100) - time = 1.6 SECONDS - -/datum/surgery_step/extract_core/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to extract a core from [target]..."), - span_notice("[user] begins to extract a core from [target]."), - span_notice("[user] begins to extract a core from [target]."), - ) - -/datum/surgery_step/extract_core/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/mob/living/basic/slime/target_slime = target - var/core_count = target_slime.cores - if(core_count && target_slime.try_extract_cores(count = core_count)) - display_results( - user, - target, - span_notice("You successfully extract [core_count] core\s from [target]."), - span_notice("[user] successfully extracts [core_count] core\s from [target]!"), - span_notice("[user] successfully extracts [core_count] core\s from [target]!"), - ) - return TRUE - to_chat(user, span_warning("There aren't any cores left in [target]!")) - return ..() diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm deleted file mode 100644 index 75357ba4908b..000000000000 --- a/code/modules/surgery/coronary_bypass.dm +++ /dev/null @@ -1,168 +0,0 @@ -/datum/surgery/coronary_bypass - name = "Coronary Bypass" - organ_to_manipulate = ORGAN_SLOT_HEART - possible_locs = list(BODY_ZONE_CHEST) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise_heart, - /datum/surgery_step/coronary_bypass, - /datum/surgery_step/close, - ) - -/datum/surgery/coronary_bypass/mechanic - name = "Engine Diagnostic" - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/incise_heart/mechanic, - /datum/surgery_step/coronary_bypass/mechanic, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/coronary_bypass/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/heart/target_heart = target.get_organ_slot(ORGAN_SLOT_HEART) - if(isnull(target_heart) || target_heart.damage < 60 || target_heart.operated) - return FALSE - return ..() - - -//an incision but with greater bleed, and a 90% base success chance -/datum/surgery_step/incise_heart - name = "incise heart (scalpel)" - implements = list( - TOOL_SCALPEL = 90, - /obj/item/melee/energy/sword = 45, - /obj/item/knife = 45, - /obj/item/shard = 25) - time = 1.6 SECONDS - preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' - success_sound = 'sound/items/handling/surgery/scalpel2.ogg' - failure_sound = 'sound/items/handling/surgery/organ2.ogg' - surgery_effects_mood = TRUE - -/datum/surgery_step/incise_heart/mechanic - name = "access engine internals (scalpel or crowbar)" - implements = list( - TOOL_SCALPEL = 95, - TOOL_CROWBAR = 95, - /obj/item/melee/energy/sword = 65, - /obj/item/knife = 45, - /obj/item/shard = 35) - preop_sound = 'sound/items/tools/ratchet.ogg' - success_sound = 'sound/machines/airlock/doorclick.ogg' - -/datum/surgery_step/incise_heart/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to make an incision in [target]'s heart..."), - span_notice("[user] begins to make an incision in [target]'s heart."), - span_notice("[user] begins to make an incision in [target]'s heart."), - ) - display_pain(target, "You feel a horrendous pain in your heart, it's almost enough to make you pass out!") - -/datum/surgery_step/incise_heart/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(ishuman(target)) - var/mob/living/carbon/human/target_human = target - if (target_human.can_bleed()) - var/blood_name = target_human.get_bloodtype()?.get_blood_name() || "Blood" - display_results( - user, - target, - span_notice("[blood_name] pools around the incision in [target_human]'s heart."), - span_notice("[blood_name] pools around the incision in [target_human]'s heart."), - span_notice("[blood_name] pools around the incision in [target_human]'s heart."), - ) - var/obj/item/bodypart/target_bodypart = target_human.get_bodypart(target_zone) - target_bodypart.adjustBleedStacks(10) - target_human.adjustBruteLoss(10) - return ..() - -/datum/surgery_step/incise_heart/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(ishuman(target)) - var/mob/living/carbon/human/target_human = target - var/blood_name = LOWER_TEXT(target_human.get_bloodtype()?.get_blood_name()) || "blood" - display_results( - user, - target, - span_warning("You screw up, cutting too deeply into the heart!"), - span_warning("[user] screws up, causing [blood_name] to spurt out of [target_human]'s chest!"), - span_warning("[user] screws up, causing [blood_name] to spurt out of [target_human]'s chest!"), - ) - var/obj/item/bodypart/target_bodypart = target_human.get_bodypart(target_zone) - target_bodypart.adjustBleedStacks(10) - target_human.adjustOrganLoss(ORGAN_SLOT_HEART, 10) - target_human.adjustBruteLoss(10) - -//grafts a coronary bypass onto the individual's heart, success chance is 90% base again -/datum/surgery_step/coronary_bypass - name = "graft coronary bypass (hemostat)" - implements = list( - TOOL_HEMOSTAT = 90, - TOOL_WIRECUTTER = 35, - /obj/item/stack/package_wrap = 15, - /obj/item/stack/cable_coil = 5) - time = 9 SECONDS - preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' - success_sound = 'sound/items/handling/surgery/hemostat1.ogg' - failure_sound = 'sound/items/handling/surgery/organ2.ogg' - -/datum/surgery_step/coronary_bypass/mechanic - name = "perform maintenance (hemostat or wrench)" - implements = list( - TOOL_HEMOSTAT = 90, - TOOL_WRENCH = 90, - TOOL_WIRECUTTER = 35, - /obj/item/stack/package_wrap = 15, - /obj/item/stack/cable_coil = 5) - preop_sound = 'sound/items/tools/ratchet.ogg' - success_sound = 'sound/machines/airlock/doorclick.ogg' - -/datum/surgery_step/coronary_bypass/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to graft a bypass onto [target]'s heart..."), - span_notice("[user] begins to graft something onto [target]'s heart!"), - span_notice("[user] begins to graft something onto [target]'s heart!"), - ) - display_pain(target, "The pain in your chest is unbearable! You can barely take it anymore!") - -/datum/surgery_step/coronary_bypass/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - target.setOrganLoss(ORGAN_SLOT_HEART, 60) - var/obj/item/organ/heart/target_heart = target.get_organ_slot(ORGAN_SLOT_HEART) - if(target_heart) //slightly worrying if we lost our heart mid-operation, but that's life - target_heart.operated = TRUE - if(target_heart.organ_flags & ORGAN_EMP) //If our organ is failing due to an EMP, fix that - target_heart.organ_flags &= ~ORGAN_EMP - display_results( - user, - target, - span_notice("You successfully graft a bypass onto [target]'s heart."), - span_notice("[user] finishes grafting something onto [target]'s heart."), - span_notice("[user] finishes grafting something onto [target]'s heart."), - ) - display_pain(target, "The pain in your chest throbs, but your heart feels better than ever!") - return ..() - -/datum/surgery_step/coronary_bypass/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(ishuman(target)) - var/mob/living/carbon/human/target_human = target - display_results( - user, - target, - span_warning("You screw up in attaching the graft, and it tears off, tearing part of the heart!"), - span_warning("[user] screws up, causing blood to spurt out of [target_human]'s chest profusely!"), - span_warning("[user] screws up, causing blood to spurt out of [target_human]'s chest profusely!"), - ) - display_pain(target, "Your chest burns; you feel like you're going insane!") - target_human.adjustOrganLoss(ORGAN_SLOT_HEART, 20) - var/obj/item/bodypart/target_bodypart = target_human.get_bodypart(target_zone) - target_bodypart.adjustBleedStacks(30) - return FALSE diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm deleted file mode 100644 index f12064a42c15..000000000000 --- a/code/modules/surgery/dental_implant.dm +++ /dev/null @@ -1,117 +0,0 @@ -#define MARK_TOOTH 1 - -/datum/surgery/dental_implant - name = "Dental implant" - possible_locs = list(BODY_ZONE_PRECISE_MOUTH) - steps = list( - /datum/surgery_step/drill/pill, - /datum/surgery_step/insert_pill, - /datum/surgery_step/search_teeth, - /datum/surgery_step/close, - ) - -/datum/surgery_step/drill/pill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - . = ..() - var/count = 0 - var/obj/item/bodypart/head/teeth_receptangle = target.get_bodypart(BODY_ZONE_HEAD) - - ASSERT(teeth_receptangle) - - for(var/obj/item/reagent_containers/applicator/pill/dental in teeth_receptangle) - count++ - - if(teeth_receptangle.teeth_count == 0) - to_chat(user, span_notice("[target] has no teeth, doofus!")) - return SURGERY_STEP_FAIL - - if(count >= teeth_receptangle.teeth_count) - to_chat(user, span_notice("[target]'s teeth have all been replaced with pills already!")) - return SURGERY_STEP_FAIL - -/datum/surgery_step/insert_pill - name = "insert pill" - implements = list(/obj/item/reagent_containers/applicator/pill = 100) - time = 1.6 SECONDS - -/datum/surgery_step/insert_pill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - - display_results( - user, - target, - span_notice("You begin to wedge [tool] in [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to wedge \the [tool] in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to wedge something in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "Something's being jammed into your [target.parse_zone_with_bodypart(target_zone)]!") - -/datum/surgery_step/insert_pill/success(mob/user, mob/living/carbon/target, target_zone, obj/item/reagent_containers/applicator/pill/tool, datum/surgery/surgery, default_display_results = FALSE) - if(!istype(tool)) - return FALSE - - // Pills go into head - user.transferItemToLoc(tool, target.get_bodypart(BODY_ZONE_HEAD), TRUE) - - var/datum/action/item_action/activate_pill/pill_action = new(tool) - pill_action.name = "Activate [tool.name]" - pill_action.build_all_button_icons() - pill_action.target = tool - pill_action.Grant(target) //The pill never actually goes in an inventory slot, so the owner doesn't inherit actions from it - - display_results( - user, - target, - span_notice("You wedge [tool] into [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] wedges \the [tool] into [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - span_notice("[user] wedges something into [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - return ..() - -/datum/action/item_action/activate_pill - name = "Activate Pill" - check_flags = NONE - -/datum/action/item_action/activate_pill/IsAvailable(feedback) - if(owner.stat > SOFT_CRIT) - return FALSE - return ..() - -/datum/action/item_action/activate_pill/do_effect(trigger_flags) - owner.balloon_alert_to_viewers("[owner] grinds their teeth!", "You grit your teeth.") - if(!do_after(owner, owner.stat * (2.5 SECONDS), owner, IGNORE_USER_LOC_CHANGE | IGNORE_INCAPACITATED)) - return FALSE - var/obj/item/item_target = target - 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, transferred_by = owner, methods = INGEST) - qdel(target) - return TRUE - -/datum/surgery_step/search_teeth - name = "search teeth (hand)" - accept_hand = TRUE - time = 2 SECONDS - repeatable = TRUE - -/datum/surgery_step/search_teeth/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin looking in [target]'s mouth for implantable teeth..."), - span_notice("[user] begins to look in [target]'s mouth."), - span_notice("[user] begins to examine [target]'s teeth."), - ) - display_pain(target, "You feel fingers poke around at your teeth.") - -/datum/surgery_step/search_teeth/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results( - user, - target, - span_notice("[user] marks a tooth in [target]'s mouth."), - span_notice("[user] marks a tooth in [target]'s mouth."), - span_notice("[user] prods a tooth in [target]'s mouth."), - ) - surgery.status = MARK_TOOTH - return ..() - -#undef MARK_TOOTH diff --git a/code/modules/surgery/ear_surgery.dm b/code/modules/surgery/ear_surgery.dm deleted file mode 100644 index 9f41949f7638..000000000000 --- a/code/modules/surgery/ear_surgery.dm +++ /dev/null @@ -1,72 +0,0 @@ -//Head surgery to fix the ears organ -/datum/surgery/ear_surgery - name = "Ear surgery" - requires_bodypart_type = NONE - organ_to_manipulate = ORGAN_SLOT_EARS - possible_locs = list(BODY_ZONE_HEAD) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/fix_ears, - /datum/surgery_step/close, - ) - -//fix ears -/datum/surgery_step/fix_ears - name = "fix ears (hemostat)" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_SCREWDRIVER = 45, - /obj/item/pen = 25) - time = 6.4 SECONDS - -/datum/surgery/ear_surgery/can_start(mob/user, mob/living/carbon/target) - return target.get_organ_slot(ORGAN_SLOT_EARS) && ..() - -/datum/surgery_step/fix_ears/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to fix [target]'s ears..."), - span_notice("[user] begins to fix [target]'s ears."), - span_notice("[user] begins to perform surgery on [target]'s ears."), - ) - display_pain(target, "You feel a dizzying pain in your head!") - -/datum/surgery_step/fix_ears/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/obj/item/organ/ears/target_ears = target.get_organ_slot(ORGAN_SLOT_EARS) - display_results( - user, - target, - span_notice("You succeed in fixing [target]'s ears."), - span_notice("[user] successfully fixes [target]'s ears!"), - span_notice("[user] completes the surgery on [target]'s ears."), - ) - display_pain(target, "Your head swims, but it seems like you can feel your hearing coming back!") - target_ears.deaf = (20) //deafness works off ticks, so this should work out to about 30-40s - target_ears.set_organ_damage(0) - return ..() - -/datum/surgery_step/fix_ears/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(target.get_organ_by_type(/obj/item/organ/brain)) - display_results( - user, - target, - span_warning("You accidentally stab [target] right in the brain!"), - span_warning("[user] accidentally stabs [target] right in the brain!"), - span_warning("[user] accidentally stabs [target] right in the brain!"), - ) - display_pain(target, "You feel a visceral stabbing pain right through your head, into your brain!") - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 70) - else - display_results( - user, - target, - span_warning("You accidentally stab [target] right in the brain! Or would have, if [target] had a brain."), - span_warning("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain."), - span_warning("[user] accidentally stabs [target] right in the brain!"), - ) - display_pain(target, "You feel a visceral stabbing pain right through your head!") // dunno who can feel pain w/o a brain but may as well be consistent. - return FALSE diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm deleted file mode 100644 index fc60b26f4d55..000000000000 --- a/code/modules/surgery/experimental_dissection.dm +++ /dev/null @@ -1,153 +0,0 @@ -///How many research points you gain from dissecting a Human. -#define BASE_HUMAN_REWARD 10 - -/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_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(!.) - return . - if(HAS_TRAIT_FROM(target, TRAIT_DISSECTED, EXPERIMENTAL_SURGERY_TRAIT)) - return FALSE - if(target.stat != DEAD) - return FALSE - return . - -/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(span_notice("[user] starts dissecting [target]."), span_notice("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(span_notice("[user] dissects [target], discovering [points_earned] point\s of data!"), span_notice("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) - - target.apply_damage(80, BRUTE, BODY_ZONE_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( - span_notice("[user] dissects [target]!"), - span_notice("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) - - target.apply_damage(80, BRUTE, BODY_ZONE_CHEST) - 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, list/modifiers, list/attack_modifiers) - 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/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm deleted file mode 100644 index 31a4fe261d44..000000000000 --- a/code/modules/surgery/eye_surgery.dm +++ /dev/null @@ -1,72 +0,0 @@ -/datum/surgery/eye_surgery - name = "Eye surgery" - requires_bodypart_type = NONE - organ_to_manipulate = ORGAN_SLOT_EYES - possible_locs = list(BODY_ZONE_PRECISE_EYES) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/fix_eyes, - /datum/surgery_step/close, - ) - -//fix eyes -/datum/surgery_step/fix_eyes - name = "fix eyes (hemostat)" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_SCREWDRIVER = 45, - /obj/item/pen = 25) - time = 6.4 SECONDS - -/datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target) - return target.get_organ_slot(ORGAN_SLOT_EYES) && ..() - -/datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to fix [target]'s eyes..."), - span_notice("[user] begins to fix [target]'s eyes."), - span_notice("[user] begins to perform surgery on [target]'s eyes."), - ) - display_pain(target, "You feel a stabbing pain in your eyes!") - -/datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/obj/item/organ/eyes/target_eyes = target.get_organ_slot(ORGAN_SLOT_EYES) - user.visible_message(span_notice("[user] successfully fixes [target]'s eyes!"), span_notice("You succeed in fixing [target]'s eyes.")) - display_results( - user, - target, - span_notice("You succeed in fixing [target]'s eyes."), - span_notice("[user] successfully fixes [target]'s eyes!"), - span_notice("[user] completes the surgery on [target]'s eyes."), - ) - display_pain(target, "Your vision blurs, but it seems like you can see a little better now!") - target.remove_status_effect(/datum/status_effect/temporary_blindness) - target.set_eye_blur_if_lower(70 SECONDS) //this will fix itself slowly. - target_eyes.set_organ_damage(0) // heals nearsightedness and blindness from eye damage - return ..() - -/datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(target.get_organ_by_type(/obj/item/organ/brain)) - display_results( - user, - target, - span_warning("You accidentally stab [target] right in the brain!"), - span_warning("[user] accidentally stabs [target] right in the brain!"), - span_warning("[user] accidentally stabs [target] right in the brain!"), - ) - display_pain(target, "You feel a visceral stabbing pain right through your head, into your brain!") - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 70) - else - display_results( - user, - target, - span_warning("You accidentally stab [target] right in the brain! Or would have, if [target] had a brain."), - span_warning("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain."), - span_warning("[user] accidentally stabs [target] right in the brain!"), - ) - display_pain(target, "You feel a visceral stabbing pain right through your head!") // dunno who can feel pain w/o a brain but may as well be consistent. - return FALSE diff --git a/code/modules/surgery/gastrectomy.dm b/code/modules/surgery/gastrectomy.dm deleted file mode 100644 index caae23b25526..000000000000 --- a/code/modules/surgery/gastrectomy.dm +++ /dev/null @@ -1,99 +0,0 @@ -/datum/surgery/gastrectomy - name = "Gastrectomy" - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB - organ_to_manipulate = ORGAN_SLOT_STOMACH - possible_locs = list(BODY_ZONE_CHEST) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/gastrectomy, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/close, - ) - -/datum/surgery/gastrectomy/mechanic - name = "Nutrient Processing System Diagnostic" - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/gastrectomy/mechanic, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/gastrectomy/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH) - if(isnull(target_stomach) || target_stomach.damage < 50 || target_stomach.operated) - return FALSE - return ..() - -////Gastrectomy, because we truly needed a way to repair stomachs. -//95% chance of success to be consistent with most organ-repairing surgeries. -/datum/surgery_step/gastrectomy - name = "remove lower duodenum (scalpel)" - implements = list( - TOOL_SCALPEL = 95, - /obj/item/melee/energy/sword = 65, - /obj/item/knife = 45, - /obj/item/shard = 35) - time = 5.2 SECONDS - preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' - success_sound = 'sound/items/handling/surgery/organ1.ogg' - failure_sound = 'sound/items/handling/surgery/organ2.ogg' - surgery_effects_mood = TRUE - -/datum/surgery_step/gastrectomy/mechanic - name = "perform maintenance (scalpel or wrench)" - implements = list( - TOOL_SCALPEL = 95, - TOOL_WRENCH = 95, - /obj/item/melee/energy/sword = 65, - /obj/item/knife = 45, - /obj/item/shard = 35) - preop_sound = 'sound/items/tools/ratchet.ogg' - success_sound = 'sound/machines/airlock/doorclick.ogg' - -/datum/surgery_step/gastrectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to cut out a damaged piece of [target]'s stomach..."), - span_notice("[user] begins to make an incision in [target]."), - span_notice("[user] begins to make an incision in [target]."), - ) - display_pain(target, "You feel a horrible stab in your gut!") - -/datum/surgery_step/gastrectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/mob/living/carbon/human/target_human = target - var/obj/item/organ/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH) - target_human.setOrganLoss(ORGAN_SLOT_STOMACH, 20) // Stomachs have a threshold for being able to even digest food, so I might tweak this number - if(target_stomach) - target_stomach.operated = TRUE - if(target_stomach.organ_flags & ORGAN_EMP) //If our organ is failing due to an EMP, fix that - target_stomach.organ_flags &= ~ORGAN_EMP - display_results( - user, - target, - span_notice("You successfully remove the damaged part of [target]'s stomach."), - span_notice("[user] successfully removes the damaged part of [target]'s stomach."), - span_notice("[user] successfully removes the damaged part of [target]'s stomach."), - ) - display_pain(target, "The pain in your gut ebbs and fades somewhat.") - return ..() - -/datum/surgery_step/gastrectomy/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery) - var/mob/living/carbon/human/target_human = target - target_human.adjustOrganLoss(ORGAN_SLOT_STOMACH, 15) - display_results( - user, - target, - span_warning("You cut the wrong part of [target]'s stomach!"), - span_warning("[user] cuts the wrong part of [target]'s stomach!"), - span_warning("[user] cuts the wrong part of [target]'s stomach!"), - ) - display_pain(target, "Your stomach throbs with pain; it's not getting any better!") diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm deleted file mode 100644 index dfabe24234d0..000000000000 --- a/code/modules/surgery/healing.dm +++ /dev/null @@ -1,356 +0,0 @@ -/datum/surgery/healing - target_mobtypes = list(/mob/living) - requires_bodypart_type = NONE - replaced_by = /datum/surgery - surgery_flags = SURGERY_IGNORE_CLOTHES | SURGERY_REQUIRE_RESTING - possible_locs = list(BODY_ZONE_CHEST) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/incise, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/heal, - /datum/surgery_step/close, - ) - - var/healing_step_type - var/antispam = FALSE - -/datum/surgery/healing/can_start(mob/user, mob/living/patient) - . = ..() - if(!.) - return . - if(!(patient.mob_biotypes & (MOB_ORGANIC|MOB_HUMANOID))) - return FALSE - return . - -/datum/surgery/healing/New(surgery_target, surgery_location, surgery_bodypart) - ..() - if(healing_step_type) - steps = list( - /datum/surgery_step/incise/nobleed, - healing_step_type, //hehe cheeky - /datum/surgery_step/close, - ) - -/datum/surgery_step/heal - name = "repair body (hemostat)" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_SCREWDRIVER = 65, - TOOL_WIRECUTTER = 60, - /obj/item/pen = 55) - repeatable = TRUE - time = 2.5 SECONDS - success_sound = 'sound/items/handling/surgery/retractor2.ogg' - failure_sound = 'sound/items/handling/surgery/organ2.ogg' - var/brutehealing = 0 - var/burnhealing = 0 - var/brute_multiplier = 0 //multiplies the damage that the patient has. if 0 the patient wont get any additional healing from the damage he has. - var/burn_multiplier = 0 - -/// Returns a string letting the surgeon know roughly how much longer the surgery is estimated to take at the going rate -/datum/surgery_step/heal/proc/get_progress(mob/user, mob/living/carbon/target, brute_healed, burn_healed) - return - -/datum/surgery_step/heal/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/woundtype - if(brutehealing && burnhealing) - woundtype = "wounds" - else if(brutehealing) - woundtype = "bruises" - else //why are you trying to 0,0...? - woundtype = "burns" - if(istype(surgery,/datum/surgery/healing)) - var/datum/surgery/healing/the_surgery = surgery - if(!the_surgery.antispam) - display_results( - user, - target, - span_notice("You attempt to patch some of [target]'s [woundtype]."), - span_notice("[user] attempts to patch some of [target]'s [woundtype]."), - span_notice("[user] attempts to patch some of [target]'s [woundtype]."), - ) - display_pain(target, "Your [woundtype] sting like hell!") - -/datum/surgery_step/heal/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) - if(!..()) - return - while((brutehealing && target.getBruteLoss()) || (burnhealing && target.getFireLoss())) - if(!..()) - break - -/datum/surgery_step/heal/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/user_msg = "You succeed in fixing some of [target]'s wounds" //no period, add initial space to "addons" - var/target_msg = "[user] fixes some of [target]'s wounds" //see above - var/brute_healed = brutehealing - var/burn_healed = burnhealing - 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 - user_msg += " as best as you can while [target.p_they()] [target.p_have()] clothing on" - target_msg += " as best as [user.p_they()] can while [target.p_they()] [target.p_have()] clothing on" - target.heal_bodypart_damage(brute_healed,burn_healed) - - user_msg += get_progress(user, target, brute_healed, burn_healed) - - 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, - span_notice("[user_msg]."), - span_notice("[target_msg]."), - span_notice("[target_msg]."), - ) - if(istype(surgery, /datum/surgery/healing)) - var/datum/surgery/healing/the_surgery = surgery - the_surgery.antispam = TRUE - return ..() - -/datum/surgery_step/heal/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_warning("You screwed up!"), - span_warning("[user] screws up!"), - span_notice("[user] fixes some of [target]'s wounds."), - target_detailed = TRUE, - ) - var/brute_dealt = brutehealing * 0.8 - var/burn_dealt = burnhealing * 0.8 - brute_dealt += round((target.getBruteLoss() * (brute_multiplier * 0.5)),0.1) - burn_dealt += round((target.getFireLoss() * (burn_multiplier * 0.5)),0.1) - target.take_bodypart_damage(brute_dealt, burn_dealt, wound_bonus=CANT_WOUND) - return FALSE - -/***************************BRUTE***************************/ -/datum/surgery/healing/brute - name = "Tend Wounds (Bruises)" - -/datum/surgery/healing/brute/basic - name = "Tend Wounds (Bruises, Basic)" - replaced_by = /datum/surgery/healing/brute/upgraded - healing_step_type = /datum/surgery_step/heal/brute/basic - desc = "A surgical procedure that provides basic treatment for a patient's brute traumas. Heals slightly more when the patient is severely injured." - -/datum/surgery/healing/brute/upgraded - name = "Tend Wounds (Bruises, Adv.)" - replaced_by = /datum/surgery/healing/brute/upgraded/femto - requires_tech = TRUE - healing_step_type = /datum/surgery_step/heal/brute/upgraded - desc = "A surgical procedure that provides advanced treatment for a patient's brute traumas. Heals more when the patient is severely injured." - -/datum/surgery/healing/brute/upgraded/femto - name = "Tend Wounds (Bruises, Exp.)" - replaced_by = /datum/surgery/healing/combo/upgraded/femto - requires_tech = TRUE - healing_step_type = /datum/surgery_step/heal/brute/upgraded/femto - desc = "A surgical procedure that provides experimental treatment for a patient's brute traumas. Heals considerably more when the patient is severely injured." - -/********************BRUTE STEPS********************/ -/datum/surgery_step/heal/brute/get_progress(mob/user, mob/living/carbon/target, brute_healed, burn_healed) - if(!brute_healed) - return - - var/estimated_remaining_steps = target.getBruteLoss() / brute_healed - var/progress_text - - if(locate(/obj/item/healthanalyzer) in user.held_items) - progress_text = ". Remaining brute: [target.getBruteLoss()]" - else - switch(estimated_remaining_steps) - if(-INFINITY to 1) - return - if(1 to 3) - progress_text = ", stitching up the last few scrapes" - if(3 to 6) - progress_text = ", counting down the last few bruises left to treat" - if(6 to 9) - progress_text = ", continuing to plug away at [target.p_their()] extensive rupturing" - if(9 to 12) - progress_text = ", steadying yourself for the long surgery ahead" - if(12 to 15) - progress_text = ", though [target.p_they()] still look[target.p_s()] more like ground beef than a person" - if(15 to INFINITY) - progress_text = ", though you feel like you're barely making a dent in treating [target.p_their()] pulped body" - - return progress_text - -/datum/surgery_step/heal/brute/basic - name = "tend bruises (hemostat)" - brutehealing = 5 - brute_multiplier = 0.07 - -/datum/surgery_step/heal/brute/upgraded - brutehealing = 5 - brute_multiplier = 0.1 - -/datum/surgery_step/heal/brute/upgraded/femto - brutehealing = 5 - brute_multiplier = 0.2 - -/***************************BURN***************************/ -/datum/surgery/healing/burn - name = "Tend Wounds (Burn)" - -/datum/surgery/healing/burn/basic - name = "Tend Wounds (Burn, Basic)" - replaced_by = /datum/surgery/healing/burn/upgraded - healing_step_type = /datum/surgery_step/heal/burn/basic - desc = "A surgical procedure that provides basic treatment for a patient's burns. Heals slightly more when the patient is severely injured." - -/datum/surgery/healing/burn/upgraded - name = "Tend Wounds (Burn, Adv.)" - replaced_by = /datum/surgery/healing/burn/upgraded/femto - requires_tech = TRUE - healing_step_type = /datum/surgery_step/heal/burn/upgraded - desc = "A surgical procedure that provides advanced treatment for a patient's burns. Heals more when the patient is severely injured." - -/datum/surgery/healing/burn/upgraded/femto - name = "Tend Wounds (Burn, Exp.)" - replaced_by = /datum/surgery/healing/combo/upgraded/femto - requires_tech = TRUE - healing_step_type = /datum/surgery_step/heal/burn/upgraded/femto - desc = "A surgical procedure that provides experimental treatment for a patient's burns. Heals considerably more when the patient is severely injured." - -/********************BURN STEPS********************/ -/datum/surgery_step/heal/burn/get_progress(mob/user, mob/living/carbon/target, brute_healed, burn_healed) - if(!burn_healed) - return - var/estimated_remaining_steps = target.getFireLoss() / burn_healed - var/progress_text - - if(locate(/obj/item/healthanalyzer) in user.held_items) - progress_text = ". Remaining burn: [target.getFireLoss()]" - else - switch(estimated_remaining_steps) - if(-INFINITY to 1) - return - if(1 to 3) - progress_text = ", finishing up the last few singe marks" - if(3 to 6) - progress_text = ", counting down the last few blisters left to treat" - if(6 to 9) - progress_text = ", continuing to plug away at [target.p_their()] thorough roasting" - if(9 to 12) - progress_text = ", steadying yourself for the long surgery ahead" - if(12 to 15) - progress_text = ", though [target.p_they()] still look[target.p_s()] more like burnt steak than a person" - if(15 to INFINITY) - progress_text = ", though you feel like you're barely making a dent in treating [target.p_their()] charred body" - - return progress_text - -/datum/surgery_step/heal/burn/basic - name = "tend burn wounds (hemostat)" - burnhealing = 5 - burn_multiplier = 0.07 - -/datum/surgery_step/heal/burn/upgraded - burnhealing = 5 - burn_multiplier = 0.1 - -/datum/surgery_step/heal/burn/upgraded/femto - burnhealing = 5 - burn_multiplier = 0.2 - -/***************************COMBO***************************/ -/datum/surgery/healing/combo - - -/datum/surgery/healing/combo - name = "Tend Wounds (Mixture, Basic)" - replaced_by = /datum/surgery/healing/combo/upgraded - requires_tech = TRUE - healing_step_type = /datum/surgery_step/heal/combo - desc = "A surgical procedure that provides basic treatment for a patient's burns and brute traumas. Heals slightly more when the patient is severely injured." - -/datum/surgery/healing/combo/upgraded - name = "Tend Wounds (Mixture, Adv.)" - replaced_by = /datum/surgery/healing/combo/upgraded/femto - healing_step_type = /datum/surgery_step/heal/combo/upgraded - desc = "A surgical procedure that provides advanced treatment for a patient's burns and brute traumas. Heals more when the patient is severely injured." - - -/datum/surgery/healing/combo/upgraded/femto //no real reason to type it like this except consistency, don't worry you're not missing anything - name = "Tend Wounds (Mixture, Exp.)" - replaced_by = null - healing_step_type = /datum/surgery_step/heal/combo/upgraded/femto - desc = "A surgical procedure that provides experimental treatment for a patient's burns and brute traumas. Heals considerably more when the patient is severely injured." - -/********************COMBO STEPS********************/ -/datum/surgery_step/heal/combo/get_progress(mob/user, mob/living/carbon/target, brute_healed, burn_healed) - var/estimated_remaining_steps = 0 - if(brute_healed > 0) - estimated_remaining_steps = max(0, (target.getBruteLoss() / brute_healed)) - if(burn_healed > 0) - estimated_remaining_steps = max(estimated_remaining_steps, (target.getFireLoss() / burn_healed)) // whichever is higher between brute or burn steps - - var/progress_text - - if(locate(/obj/item/healthanalyzer) in user.held_items) - if(target.getBruteLoss()) - progress_text = ". Remaining brute: [target.getBruteLoss()]" - if(target.getFireLoss()) - progress_text += ". Remaining burn: [target.getFireLoss()]" - else - switch(estimated_remaining_steps) - if(-INFINITY to 1) - return - if(1 to 3) - progress_text = ", finishing up the last few signs of damage" - if(3 to 6) - progress_text = ", counting down the last few patches of trauma" - if(6 to 9) - progress_text = ", continuing to plug away at [target.p_their()] extensive injuries" - if(9 to 12) - progress_text = ", steadying yourself for the long surgery ahead" - if(12 to 15) - progress_text = ", though [target.p_they()] still look[target.p_s()] more like smooshed baby food than a person" - if(15 to INFINITY) - progress_text = ", though you feel like you're barely making a dent in treating [target.p_their()] broken body" - - return progress_text - -/datum/surgery_step/heal/combo - name = "tend physical wounds (hemostat)" - brutehealing = 3 - burnhealing = 3 - brute_multiplier = 0.07 - burn_multiplier = 0.07 - time = 1 SECONDS - -/datum/surgery_step/heal/combo/upgraded - brutehealing = 3 - burnhealing = 3 - brute_multiplier = 0.1 - burn_multiplier = 0.1 - -/datum/surgery_step/heal/combo/upgraded/femto - brutehealing = 1 - burnhealing = 1 - brute_multiplier = 0.4 - burn_multiplier = 0.4 - -/datum/surgery_step/heal/combo/upgraded/femto/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_warning("You screwed up!"), - span_warning("[user] screws up!"), - span_notice("[user] fixes some of [target]'s wounds."), - target_detailed = TRUE, - ) - target.take_bodypart_damage(5,5) diff --git a/code/modules/surgery/hepatectomy.dm b/code/modules/surgery/hepatectomy.dm deleted file mode 100644 index ebde95052142..000000000000 --- a/code/modules/surgery/hepatectomy.dm +++ /dev/null @@ -1,98 +0,0 @@ -/datum/surgery/hepatectomy - name = "Hepatectomy" - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB - organ_to_manipulate = ORGAN_SLOT_LIVER - possible_locs = list(BODY_ZONE_CHEST) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/hepatectomy, - /datum/surgery_step/close, - ) - -/datum/surgery/hepatectomy/mechanic - name = "Impurity Management System Diagnostic" - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/hepatectomy/mechanic, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/hepatectomy/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/liver/target_liver = target.get_organ_slot(ORGAN_SLOT_LIVER) - if(isnull(target_liver) || target_liver.damage < 50 || target_liver.operated) - return FALSE - return ..() - -////hepatectomy, removes damaged parts of the liver so that the liver may regenerate properly -//95% chance of success, not 100 because organs are delicate -/datum/surgery_step/hepatectomy - name = "remove damaged liver section (scalpel)" - implements = list( - TOOL_SCALPEL = 95, - /obj/item/melee/energy/sword = 65, - /obj/item/knife = 45, - /obj/item/shard = 35) - time = 5.2 SECONDS - preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' - success_sound = 'sound/items/handling/surgery/organ1.ogg' - failure_sound = 'sound/items/handling/surgery/organ2.ogg' - surgery_effects_mood = TRUE - -/datum/surgery_step/hepatectomy/mechanic - name = "perform maintenance (scalpel or wirecutter)" - implements = list( - TOOL_SCALPEL = 95, - TOOL_WRENCH = 95, - /obj/item/melee/energy/sword = 65, - /obj/item/knife = 45, - /obj/item/shard = 35) - preop_sound = 'sound/items/tools/ratchet.ogg' - success_sound = 'sound/machines/airlock/doorclick.ogg' - -/datum/surgery_step/hepatectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to cut out a damaged piece of [target]'s liver..."), - span_notice("[user] begins to make an incision in [target]."), - span_notice("[user] begins to make an incision in [target]."), - ) - display_pain(target, "Your abdomen burns in horrific stabbing pain!") - -/datum/surgery_step/hepatectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/mob/living/carbon/human/human_target = target - var/obj/item/organ/liver/target_liver = target.get_organ_slot(ORGAN_SLOT_LIVER) - human_target.setOrganLoss(ORGAN_SLOT_LIVER, 10) //not bad, not great - if(target_liver) - target_liver.operated = TRUE - if(target_liver.organ_flags & ORGAN_EMP) //If our organ is failing due to an EMP, fix that - target_liver.organ_flags &= ~ORGAN_EMP - display_results( - user, - target, - span_notice("You successfully remove the damaged part of [target]'s liver."), - span_notice("[user] successfully removes the damaged part of [target]'s liver."), - span_notice("[user] successfully removes the damaged part of [target]'s liver."), - ) - display_pain(target, "The pain receeds slightly.") - return ..() - -/datum/surgery_step/hepatectomy/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery) - var/mob/living/carbon/human/human_target = target - human_target.adjustOrganLoss(ORGAN_SLOT_LIVER, 15) - display_results( - user, - target, - span_warning("You cut the wrong part of [target]'s liver!"), - span_warning("[user] cuts the wrong part of [target]'s liver!"), - span_warning("[user] cuts the wrong part of [target]'s liver!"), - ) - display_pain(target, "You feel a sharp stab inside your abdomen!") diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm deleted file mode 100644 index 6ce2f81ad6da..000000000000 --- a/code/modules/surgery/implant_removal.dm +++ /dev/null @@ -1,93 +0,0 @@ -/datum/surgery/implant_removal - name = "Implant Removal" - target_mobtypes = list(/mob/living) - possible_locs = list(BODY_ZONE_CHEST) - surgery_flags = SURGERY_REQUIRE_RESTING - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/retract_skin, - /datum/surgery_step/extract_implant, - /datum/surgery_step/close, - ) - -//extract implant -/datum/surgery_step/extract_implant - name = "extract implant (hemostat)" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_CROWBAR = 65, - /obj/item/kitchen/fork = 35) - time = 6.4 SECONDS - success_sound = 'sound/items/handling/surgery/hemostat1.ogg' - var/obj/item/implant/implant - -/datum/surgery_step/extract_implant/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) - implant = LAZYACCESS(target.implants, 1) - if(implant) - display_results( - user, - target, - span_notice("You begin to extract [implant] from [target]'s [target_zone]..."), - span_notice("[user] begins to extract [implant] from [target]'s [target_zone]."), - span_notice("[user] begins to extract something from [target]'s [target_zone]."), - ) - display_pain(target, "You feel a serious pain in your [target_zone]!") - else - display_results( - user, - target, - span_notice("You look for an implant in [target]'s [target_zone]..."), - span_notice("[user] looks for an implant in [target]'s [target_zone]."), - span_notice("[user] looks for something in [target]'s [target_zone]."), - ) - -/datum/surgery_step/extract_implant/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(implant) - display_results( - user, - target, - span_notice("You successfully remove [implant] from [target]'s [target_zone]."), - span_notice("[user] successfully removes [implant] from [target]'s [target_zone]!"), - span_notice("[user] successfully removes something from [target]'s [target_zone]!"), - ) - display_pain(target, "You can feel your [implant.name] pulled out of you!") - implant.removed(target) - - if (!QDELETED(implant)) - var/obj/item/implantcase/case - for(var/obj/item/implantcase/implant_case in user.held_items) - case = implant_case - break - if(!case) - case = locate(/obj/item/implantcase) in get_turf(target) - if(case && !case.imp) - case.imp = implant - implant.forceMove(case) - case.update_appearance() - display_results( - user, - target, - span_notice("You place [implant] into [case]."), - span_notice("[user] places [implant] into [case]!"), - span_notice("[user] places it into [case]!"), - ) - else - qdel(implant) - implant = null - else - to_chat(user, span_warning("You can't find anything in [target]'s [target_zone]!")) - return ..() - -/datum/surgery/implant_removal/mechanic - name = "Implant Removal" - requires_bodypart_type = BODYTYPE_ROBOTIC - target_mobtypes = list(/mob/living/carbon/human) // Simpler mobs don't have bodypart types - surgery_flags = parent_type::surgery_flags | SURGERY_REQUIRE_LIMB - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/extract_implant, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close) diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm deleted file mode 100644 index b9b1356db895..000000000000 --- a/code/modules/surgery/limb_augmentation.dm +++ /dev/null @@ -1,96 +0,0 @@ - -/////AUGMENTATION SURGERIES////// - - -//SURGERY STEPS - -/datum/surgery_step/replace_limb - name = "replace limb" - implements = list( - /obj/item/bodypart = 100, - /obj/item/borg/apparatus/organ_storage = 100) - time = 3.2 SECONDS - var/obj/item/bodypart/target_limb - - -/datum/surgery_step/replace_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(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)) - tool = tool.contents[1] - var/obj/item/bodypart/aug = tool - if(IS_ORGANIC_LIMB(aug)) - to_chat(user, span_warning("That's not an augment, silly!")) - return SURGERY_STEP_FAIL - if(aug.body_zone != target_zone) - to_chat(user, span_warning("[tool] isn't the right type for [target.parse_zone_with_bodypart(target_zone)].")) - return SURGERY_STEP_FAIL - target_limb = surgery.operated_bodypart - if(target_limb) - display_results( - user, - target, - span_notice("You begin to augment [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]..."), - span_notice("[user] begins to augment [target]'s [target.parse_zone_with_bodypart(user.zone_selected)] with [aug]."), - span_notice("[user] begins to augment [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), - ) - display_pain(target, "You feel a horrible pain in your [target.parse_zone_with_bodypart(user.zone_selected)]!") - else - user.visible_message(span_notice("[user] looks for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), span_notice("You look for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]...")) - - -//ACTUAL SURGERIES - -/datum/surgery/augmentation - name = "Augmentation" - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB - possible_locs = list( - BODY_ZONE_R_ARM, - BODY_ZONE_L_ARM, - BODY_ZONE_R_LEG, - BODY_ZONE_L_LEG, - BODY_ZONE_CHEST, - BODY_ZONE_HEAD, - ) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/replace_limb, - ) - -//SURGERY STEP SUCCESSES - -/datum/surgery_step/replace_limb/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/bodypart/tool, datum/surgery/surgery, default_display_results = FALSE) - if(target_limb) - if(istype(tool, /obj/item/borg/apparatus/organ_storage)) - tool.icon_state = initial(tool.icon_state) - tool.desc = initial(tool.desc) - tool.cut_overlays() - tool = tool.contents[1] - if(istype(tool) && user.temporarilyRemoveItemFromInventory(tool)) - if(!tool.replace_limb(target)) - display_results( - user, - target, - span_warning("You fail in replacing [target]'s [target.parse_zone_with_bodypart(target_zone)]! Their body has rejected [tool]!"), - span_warning("[user] fails to replace [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - span_warning("[user] fails to replaces [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - tool.forceMove(target.loc) - return - if(tool.check_for_frankenstein(target)) - tool.bodypart_flags |= BODYPART_IMPLANTED - display_results( - user, - target, - span_notice("You successfully augment [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] successfully augments [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]!"), - span_notice("[user] successfully augments [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - display_pain(target, "Your [target.parse_zone_with_bodypart(target_zone)] comes awash with synthetic sensation!", mechanical_surgery = TRUE) - log_combat(user, target, "augmented", addition="by giving him new [target.parse_zone_with_bodypart(target_zone)] COMBAT MODE: [uppertext(user.combat_mode)]") - else - to_chat(user, span_warning("[target] has no organic [target.parse_zone_with_bodypart(target_zone)] there!")) - return ..() diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm deleted file mode 100644 index 3183c968f701..000000000000 --- a/code/modules/surgery/lipoplasty.dm +++ /dev/null @@ -1,143 +0,0 @@ -/datum/surgery/lipoplasty - name = "Lipoplasty" - possible_locs = list(BODY_ZONE_CHEST) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/cut_fat, - /datum/surgery_step/remove_fat, - /datum/surgery_step/close, - ) - -/datum/surgery/lipoplasty/mechanic - name = "Nutrient Reserve Expulsion" - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/cut_fat/mechanic, - /datum/surgery_step/remove_fat/mechanic, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/lipoplasty/can_start(mob/user, mob/living/carbon/target) - if(!HAS_TRAIT_FROM(target, TRAIT_FAT, OBESITY) || target.nutrition < NUTRITION_LEVEL_WELL_FED) - return FALSE - return ..() - - -//cut fat -/datum/surgery_step/cut_fat - 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 = 6.4 SECONDS - surgery_effects_mood = TRUE - preop_sound = list( - /obj/item/circular_saw = 'sound/items/handling/surgery/saw.ogg', - /obj/item = 'sound/items/handling/surgery/scalpel1.ogg', - ) - -/datum/surgery_step/cut_fat/mechanic - name = "open fat containers (wrench or crowbar)" - implements = list( - TOOL_WRENCH = 95, - TOOL_CROWBAR = 95, - TOOL_SAW = 65, - /obj/item/melee/energy/sword = 65, - /obj/item/knife = 45, - /obj/item/shard = 35, - ) - preop_sound = 'sound/items/tools/ratchet.ogg' - success_sound = 'sound/machines/airlock/doorclick.ogg' - -/datum/surgery_step/cut_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message(span_notice("[user] begins to cut away [target]'s excess fat."), span_notice("You begin to cut away [target]'s excess fat...")) - display_results( - user, - target, - span_notice("You begin to cut away [target]'s excess fat..."), - span_notice("[user] begins to cut away [target]'s excess fat."), - span_notice("[user] begins to cut [target]'s [target_zone] with [tool]."), - ) - display_pain(target, "You feel a stabbing in your [target_zone]!") - -/datum/surgery_step/cut_fat/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - display_results( - user, - target, - span_notice("You cut [target]'s excess fat loose."), - span_notice("[user] cuts [target]'s excess fat loose!"), - span_notice("[user] finishes the cut on [target]'s [target_zone]."), - ) - display_pain(target, "The fat in your [target_zone] comes loose, dangling and hurting like hell!") - return TRUE - -//remove fat -/datum/surgery_step/remove_fat - name = "remove loose fat (retractor)" - implements = list( - TOOL_RETRACTOR = 100, - TOOL_SCREWDRIVER = 45, - TOOL_WIRECUTTER = 35, - ) - time = 3.2 SECONDS - preop_sound = 'sound/items/handling/surgery/retractor1.ogg' - success_sound = 'sound/items/handling/surgery/retractor2.ogg' - -/datum/surgery_step/remove_fat/mechanic - name = "engage expulsion valve (screwdriver or wrench)" //gross - implements = list( - TOOL_SCREWDRIVER = 100, - TOOL_WRENCH = 100, - TOOL_WIRECUTTER = 35, - TOOL_RETRACTOR = 35, - ) - preop_sound = 'sound/items/tools/ratchet.ogg' - success_sound = 'sound/items/handling/surgery/organ2.ogg' - -/datum/surgery_step/remove_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to extract [target]'s loose fat..."), - span_notice("[user] begins to extract [target]'s loose fat!"), - span_notice("[user] begins to extract something from [target]'s [target_zone]."), - ) - display_pain(target, "You feel an oddly painless tugging on your loose fat!") - -/datum/surgery_step/remove_fat/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results( - user, - target, - span_notice("You extract [target]'s fat."), - span_notice("[user] extracts [target]'s fat!"), - span_notice("[user] extracts [target]'s fat!"), - ) - target.overeatduration = 0 //patient is unfatted - var/removednutriment = target.nutrition - target.set_nutrition(NUTRITION_LEVEL_WELL_FED) - removednutriment -= NUTRITION_LEVEL_WELL_FED //whatever was removed goes into the meat - var/mob/living/carbon/human/human = target - var/typeofmeat = /obj/item/food/meat/slab/human - - if(target.flags_1 & HOLOGRAM_1) - typeofmeat = null - else if(human.dna && human.dna.species) - typeofmeat = human.dna.species.meat - - if(typeofmeat) - var/obj/item/food/meat/slab/human/newmeat = new typeofmeat - newmeat.name = "fatty meat" - newmeat.desc = "Extremely fatty tissue taken from a patient." - newmeat.subjectname = human.real_name - newmeat.subjectjob = human.job - newmeat.reagents.add_reagent (/datum/reagent/consumable/nutriment, (removednutriment / 15)) //To balance with nutriment_factor of nutriment - newmeat.forceMove(target.loc) - return ..() diff --git a/code/modules/surgery/lobectomy.dm b/code/modules/surgery/lobectomy.dm deleted file mode 100644 index 4f1c32873d8d..000000000000 --- a/code/modules/surgery/lobectomy.dm +++ /dev/null @@ -1,99 +0,0 @@ -/datum/surgery/lobectomy - name = "Lobectomy" //not to be confused with lobotomy - organ_to_manipulate = ORGAN_SLOT_LUNGS - possible_locs = list(BODY_ZONE_CHEST) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/lobectomy, - /datum/surgery_step/close, - ) - -/datum/surgery/lobectomy/mechanic - name = "Air Filtration Diagnostic" - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/lobectomy/mechanic, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/lobectomy/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/lungs/target_lungs = target.get_organ_slot(ORGAN_SLOT_LUNGS) - if(isnull(target_lungs) || target_lungs.damage < 60 || target_lungs.operated) - return FALSE - return ..() - -//lobectomy, removes the most damaged lung lobe with a 95% base success chance -/datum/surgery_step/lobectomy - name = "excise damaged lung node (scalpel)" - implements = list( - TOOL_SCALPEL = 95, - /obj/item/melee/energy/sword = 65, - /obj/item/knife = 45, - /obj/item/shard = 35) - time = 4.2 SECONDS - preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' - success_sound = 'sound/items/handling/surgery/organ1.ogg' - failure_sound = 'sound/items/handling/surgery/organ2.ogg' - surgery_effects_mood = TRUE - -/datum/surgery_step/lobectomy/mechanic - name = "Perform maintenance (scalpel or wrench)" - implements = list( - TOOL_SCALPEL = 95, - TOOL_WRENCH = 95, - /obj/item/melee/energy/sword = 65, - /obj/item/knife = 45, - /obj/item/shard = 35) - preop_sound = 'sound/items/tools/ratchet.ogg' - success_sound = 'sound/machines/airlock/doorclick.ogg' - -/datum/surgery_step/lobectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to make an incision in [target]'s lungs..."), - span_notice("[user] begins to make an incision in [target]."), - span_notice("[user] begins to make an incision in [target]."), - ) - display_pain(target, "You feel a stabbing pain in your chest!") - -/datum/surgery_step/lobectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - var/obj/item/organ/lungs/target_lungs = human_target.get_organ_slot(ORGAN_SLOT_LUNGS) - human_target.setOrganLoss(ORGAN_SLOT_LUNGS, 60) - if(target_lungs) - target_lungs.operated = TRUE - if(target_lungs.organ_flags & ORGAN_EMP) //If our organ is failing due to an EMP, fix that - target_lungs.organ_flags &= ~ORGAN_EMP - display_results( - user, - target, - span_notice("You successfully excise [human_target]'s most damaged lobe."), - span_notice("Successfully removes a piece of [human_target]'s lungs."), - "", - ) - display_pain(target, "Your chest hurts like hell, but breathing becomes slightly easier.") - return ..() - -/datum/surgery_step/lobectomy/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - display_results( - user, - target, - span_warning("You screw up, failing to excise [human_target]'s damaged lobe!"), - span_warning("[user] screws up!"), - span_warning("[user] screws up!"), - ) - display_pain(target, "You feel a sharp stab in your chest; the wind is knocked out of you and it hurts to catch your breath!") - human_target.losebreath += 4 - human_target.adjustOrganLoss(ORGAN_SLOT_LUNGS, 10) - return FALSE diff --git a/code/modules/surgery/mechanic_steps.dm b/code/modules/surgery/mechanic_steps.dm deleted file mode 100644 index dab8730c2ed1..000000000000 --- a/code/modules/surgery/mechanic_steps.dm +++ /dev/null @@ -1,153 +0,0 @@ -//open shell -/datum/surgery_step/mechanic_open - name = "unscrew shell (screwdriver or scalpel)" - implements = list( - TOOL_SCREWDRIVER = 100, - TOOL_SCALPEL = 75, // med borgs could try to unscrew shell with scalpel - /obj/item/knife = 50, - /obj/item = 10) // 10% success with any sharp item. - time = 2.4 SECONDS - preop_sound = 'sound/items/tools/screwdriver.ogg' - success_sound = 'sound/items/tools/screwdriver2.ogg' - -/datum/surgery_step/mechanic_open/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to unscrew the shell of [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to unscrew the shell of [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to unscrew the shell of [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "You can feel your [target.parse_zone_with_bodypart(target_zone)] grow numb as the sensory panel is unscrewed.", TRUE) - -/datum/surgery_step/mechanic_open/tool_check(mob/user, obj/item/tool) - if(implement_type == /obj/item && !tool.get_sharpness()) - return FALSE - if(tool.usesound) - preop_sound = tool.usesound - - return TRUE - -//close shell -/datum/surgery_step/mechanic_close - name = "screw shell (screwdriver or scalpel)" - implements = list( - TOOL_SCREWDRIVER = 100, - TOOL_SCALPEL = 75, - /obj/item/knife = 50, - /obj/item = 10) // 10% success with any sharp item. - time = 2.4 SECONDS - preop_sound = 'sound/items/tools/screwdriver.ogg' - success_sound = 'sound/items/tools/screwdriver2.ogg' - -/datum/surgery_step/mechanic_close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to screw the shell of [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to screw the shell of [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to screw the shell of [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "You feel the faint pricks of sensation return as your [target.parse_zone_with_bodypart(target_zone)]'s panel is screwed in.", TRUE) - -/datum/surgery_step/mechanic_close/tool_check(mob/user, obj/item/tool) - if(implement_type == /obj/item && !tool.get_sharpness()) - return FALSE - if(tool.usesound) - preop_sound = tool.usesound - - return TRUE - -//prepare electronics -/datum/surgery_step/prepare_electronics - name = "prepare electronics (multitool or hemostat)" - implements = list( - TOOL_MULTITOOL = 100, - TOOL_HEMOSTAT = 75) - time = 2.4 SECONDS - preop_sound = 'sound/items/taperecorder/tape_flip.ogg' - success_sound = 'sound/items/taperecorder/taperecorder_close.ogg' - -/datum/surgery_step/prepare_electronics/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to prepare electronics in [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to prepare electronics in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to prepare electronics in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "You can feel a faint buzz in your [target.parse_zone_with_bodypart(target_zone)] as the electronics reboot.", TRUE) - -//unwrench -/datum/surgery_step/mechanic_unwrench - name = "unwrench bolts (wrench or retractor)" - implements = list( - TOOL_WRENCH = 100, - TOOL_RETRACTOR = 75) - time = 2.4 SECONDS - preop_sound = 'sound/items/tools/ratchet.ogg' - -/datum/surgery_step/mechanic_unwrench/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to unwrench some bolts in [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to unwrench some bolts in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to unwrench some bolts in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "You feel a jostle in your [target.parse_zone_with_bodypart(target_zone)] as the bolts begin to loosen.", TRUE) - -/datum/surgery_step/mechanic_unwrench/tool_check(mob/user, obj/item/tool) - if(tool.usesound) - preop_sound = tool.usesound - - return TRUE - -//wrench -/datum/surgery_step/mechanic_wrench - name = "wrench bolts (wrench or retractor)" - implements = list( - TOOL_WRENCH = 100, - TOOL_RETRACTOR = 75) - time = 2.4 SECONDS - preop_sound = 'sound/items/tools/ratchet.ogg' - -/datum/surgery_step/mechanic_wrench/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to wrench some bolts in [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to wrench some bolts in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to wrench some bolts in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "You feel a jostle in your [target.parse_zone_with_bodypart(target_zone)] as the bolts begin to tighten.", TRUE) - -/datum/surgery_step/mechanic_wrench/tool_check(mob/user, obj/item/tool) - if(tool.usesound) - preop_sound = tool.usesound - - return TRUE - -//open hatch -/datum/surgery_step/open_hatch - name = "open the hatch (hand)" - accept_hand = TRUE - time = 1 SECONDS - preop_sound = 'sound/items/tools/ratchet.ogg' - preop_sound = 'sound/machines/airlock/doorclick.ogg' - -/datum/surgery_step/open_hatch/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to open the hatch holders in [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to open the hatch holders in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to open the hatch holders in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "The last faint pricks of tactile sensation fade from your [target.parse_zone_with_bodypart(target_zone)] as the hatch is opened.", TRUE) - -/datum/surgery_step/open_hatch/tool_check(mob/user, obj/item/tool) - if(tool.usesound) - preop_sound = tool.usesound - - return TRUE diff --git a/code/modules/surgery/operations/_basic_surgery_state.dm b/code/modules/surgery/operations/_basic_surgery_state.dm new file mode 100644 index 000000000000..196062c381a1 --- /dev/null +++ b/code/modules/surgery/operations/_basic_surgery_state.dm @@ -0,0 +1,34 @@ +/// Used to track the state of surgeries on a mob generically rather than a bodypart +/datum/status_effect/basic_surgery_state + id = "surgery_state" + + alert_type = null + tick_interval = STATUS_EFFECT_NO_TICK + status_type = STATUS_EFFECT_REFRESH + + var/surgery_state = NONE + +/datum/status_effect/basic_surgery_state/on_creation(mob/living/new_owner, added_state = NONE, removed_state = NONE) + . = ..() + surgery_state = (added_state & ~removed_state) + SEND_SIGNAL(owner, COMSIG_LIVING_UPDATING_SURGERY_STATE, NONE, surgery_state, added_state) + +/datum/status_effect/basic_surgery_state/on_apply() + . = ..() + if(owner.has_limbs) + stack_trace("Applied a basic surgery state to [owner], which has limbs. This status effect is intended for limbless mobs.") + +/datum/status_effect/basic_surgery_state/get_examine_text() + if(HAS_SURGERY_STATE(surgery_state, SURGERY_SKIN_OPEN)) + return "[owner.p_Their()] skin is open[HAS_SURGERY_STATE(surgery_state, SURGERY_BONE_SAWED) ? " and bones are sawed opened" : ""]." + // other states are not yet supported + stack_trace("Surgery state holder had unsupported state(s): [jointext(bitfield_to_list(surgery_state, SURGERY_STATE_READABLE), ", ")]") + return null + +/datum/status_effect/basic_surgery_state/refresh(mob/living/old_owner, added_state = NONE, removed_state = NONE) + var/old_state = surgery_state + surgery_state |= added_state + surgery_state &= ~removed_state + SEND_SIGNAL(owner, COMSIG_LIVING_UPDATING_SURGERY_STATE, old_state, surgery_state, added_state | removed_state) + if(!surgery_state) + qdel(src) diff --git a/code/modules/surgery/operations/_operation.dm b/code/modules/surgery/operations/_operation.dm new file mode 100644 index 000000000000..aa785b95713c --- /dev/null +++ b/code/modules/surgery/operations/_operation.dm @@ -0,0 +1,1317 @@ +/** + * Attempts to perform a surgery with whatever tool is passed + * + * * src - the surgeon + * * patient - the mob being operated on + * * potential_tool - the tool being used for the operation (can be null / IMPLEMENT_HAND) + * * intentionally_fail - if TRUE, forces the operation to fail (for testing purposes) + * + * Returns an ITEM_INTERACT_* flag + */ +/mob/living/proc/perform_surgery(mob/living/patient, potential_tool = IMPLEMENT_HAND, intentionally_fail = FALSE) + if(DOING_INTERACTION(src, (HAS_TRAIT(src, TRAIT_HIPPOCRATIC_OATH) ? patient : DOAFTER_SOURCE_SURGERY))) + patient.balloon_alert(src, "already performing surgery!") + return ITEM_INTERACT_BLOCKING + + // allow cyborgs to use "hands" + if(istype(potential_tool, /obj/item/borg/cyborghug)) + potential_tool = IMPLEMENT_HAND + + var/operating_zone = zone_selected + var/list/operations = get_available_operations(patient, potential_tool, operating_zone) + + // we failed to undertake any operations? + if(!length(operations)) + if(!isitem(potential_tool)) + return NONE + var/obj/item/realtool = potential_tool + // try self-cauterization if applicable + if(src == patient) + var/manual_cauterization = try_manual_cauterize(realtool) + if(manual_cauterization & ITEM_INTERACT_ANY_BLOCKER) + return manual_cauterization + // for surgical tools specifically, we have some special handling + if(!(realtool.item_flags & SURGICAL_TOOL)) + return NONE + // if the targeted limb isn't prepped for surgery, i suppose we can allow an attack + var/obj/item/bodypart/operating = patient.get_bodypart(operating_zone) + if(operating && !HAS_TRAIT(operating, TRAIT_READY_TO_OPERATE)) + return NONE + // at this point we can be relatively sure they messed up so let's give a feedback message... + if(!patient.is_location_accessible(operating_zone, IGNORED_OPERATION_CLOTHING_SLOTS)) + patient.balloon_alert(src, "operation site is obstructed!") + else if(!IS_LYING_OR_CANNOT_LIE(patient)) + patient.balloon_alert(src, "not lying down!") + else + patient.balloon_alert(src, "nothing to do with [realtool.name]!") + // ...then, block attacking. prevents the surgeon from viciously stabbing the patient on a mistake + return ITEM_INTERACT_BLOCKING + + var/list/radial_operations = list() + for(var/radial_slice in operations) + radial_operations[radial_slice] = radial_slice // weird but makes it easier to index later + + sortTim(radial_operations, GLOBAL_PROC_REF(cmp_name_asc)) + + var/picked = show_radial_menu( + user = src, + anchor = patient, + choices = radial_operations, + require_near = TRUE, + autopick_single_option = TRUE, + radius = 56, + custom_check = CALLBACK(src, PROC_REF(surgery_check), potential_tool, patient), + ) + if(isnull(picked)) + return ITEM_INTERACT_BLOCKING + + var/datum/surgery_operation/picked_op = operations[picked][1] + var/atom/movable/operating_on = operations[picked][2] + var/list/op_info = operations[picked][3] + op_info[OPERATION_TARGET_ZONE] = operating_zone + op_info[OPERATION_FORCE_FAIL] = intentionally_fail + + return picked_op.try_perform(operating_on, src, potential_tool, op_info) + +/** + * Returns a list of all surgery operations the mob can currently perform on the patient with the potential tool + * + * * src - the surgeon + * * patient - the mob being operated on + * * potential_tool - the tool being used for the operation (can be null / IMPLEMENT_HAND) + * * operating_zone - the body zone being operated on + * + * Returns a list where the keys are radial menu slices and the values are lists of: + * * [0] - the operation datum + * * [1] - the atom being operated on + * * [2] - a list of option-specific info + */ +/mob/living/proc/get_available_operations(mob/living/patient, potential_tool = IMPLEMENT_HAND, operating_zone = zone_selected) + // List of typepaths of operations we *can* do + var/list/possible_operations = GLOB.operations.unlocked.Copy() + // Signals can add operation types to the list to unlock special ones + SEND_SIGNAL(src, COMSIG_LIVING_OPERATING_ON, patient, possible_operations) + SEND_SIGNAL(patient, COMSIG_LIVING_BEING_OPERATED_ON, patient, possible_operations) + + var/list/operations = list() + for(var/datum/surgery_operation/operation as anything in GLOB.operations.get_instances_from(possible_operations)) + var/atom/movable/operate_on = operation.get_operation_target(patient, operating_zone) + if(!operation.check_availability(patient, operate_on, src, potential_tool, operating_zone)) + continue + var/potential_options = operation.get_radial_options(operate_on, potential_tool, operating_zone) + if(!islist(potential_options)) + potential_options = list(potential_options) + for(var/datum/radial_menu_choice/radial_slice as anything in potential_options) + if(operations[radial_slice]) + stack_trace("Duplicate radial surgery option '[radial_slice.name]' detected for operation '[operation.type]'.") + continue + var/option_specific_info = potential_options[radial_slice] || list("[OPERATION_ACTION]" = "default") + operations[radial_slice] = list(operation, operate_on, option_specific_info) + + return operations + +/// Callback for checking if the surgery radial can be kept open +/mob/living/proc/surgery_check(obj/item/tool, mob/living/patient) + var/obj/item/holding = get_active_held_item() + + if(tool == IMPLEMENT_HAND) + return isnull(holding) || istype(holding, /obj/item/borg/cyborghug) // still holding nothing (or "hands") + if(QDELETED(holding)) + return FALSE // i dunno, a stack item? not our problem + + return tool == holding.get_proxy_attacker_for(patient, src) // tool (or its proxy) is still being held + +/// src attempts to cauterize themselves to reset their surgery state. Basically a manual form of the real "close skin" operation +/mob/living/proc/try_manual_cauterize(obj/item/tool) + var/cauterize_zone = deprecise_zone(zone_selected) + var/obj/item/bodypart/limb = get_bodypart(cauterize_zone) + if(!manual_cauterize_check(tool, limb)) + return NONE + if(DOING_INTERACTION_WITH_TARGET(src, src)) + return ITEM_INTERACT_BLOCKING + + visible_message( + span_notice("[src] attempts to close [p_their()] own [limb.plaintext_zone] with [tool]..."), + span_notice("You attempt to close your own [limb.plaintext_zone] with [tool]..."), + span_hear("You hear singing."), + vision_distance = 5, + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + playsound(src, istype(tool, /obj/item/stack/medical/suture) ? SFX_SUTURE_BEGIN : 'sound/items/handling/surgery/cautery1.ogg', 50, TRUE) + if(!do_after( + user = src, + delay = /datum/surgery_operation/limb/close_skin::time * 2 * tool.toolspeed, + target = src, + extra_checks = CALLBACK(src, PROC_REF(manual_cauterize_check), tool, limb), + )) + return ITEM_INTERACT_BLOCKING + + visible_message( + span_notice("[src] closes [p_their()] own [limb.plaintext_zone] with [tool]."), + span_notice("You close your own [limb.plaintext_zone] with [tool]."), + span_hear("You hear singing."), + vision_distance = 5, + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + playsound(src, istype(tool, /obj/item/stack/medical/suture) ? SFX_SUTURE_END : 'sound/items/handling/surgery/cautery2.ogg', 50, TRUE) + limb.remove_surgical_state(ALL_SURGERY_STATES_UNSET_ON_CLOSE) + if(istype(tool, /obj/item/stack/medical/suture)) + var/obj/item/stack/medical/suture/suture_tool = tool + suture_tool.use(1) + else + limb.receive_damage(burn = 5, wound_bonus = CANT_WOUND, damage_source = tool) + return ITEM_INTERACT_SUCCESS + +/// Callback for checking if the cauterization do-after can continue +/mob/living/proc/manual_cauterize_check(obj/item/tool, obj/item/bodypart/limb) + PRIVATE_PROC(TRUE) + + if(QDELETED(limb) || limb.owner != src) + return FALSE + + if(QDELETED(tool)) + return FALSE + else if(istype(tool, /obj/item/stack/medical/suture)) + var/obj/item/stack/medical/suture/suture_tool = tool + if(suture_tool.amount <= 0) + return FALSE + else if(tool.tool_behaviour != TOOL_CAUTERY) + if(tool.get_temperature() <= 0) + return FALSE + + // we need to have a surgery state worth closing + var/states_to_check = ALL_SURGERY_STATES_UNSET_ON_CLOSE + if(!LIMB_HAS_BONES(limb)) + states_to_check &= ~BONELESS_SURGERY_STATES + if(!LIMB_HAS_VESSELS(limb)) + states_to_check &= ~VESSELLESS_SURGERY_STATES + if(!LIMB_HAS_SKIN(limb)) + states_to_check &= ~SKINLESS_SURGERY_STATES + if(!states_to_check || !LIMB_HAS_ANY_SURGERY_STATE(limb, states_to_check)) + return FALSE + + // skin has to be open or cut to do anything (we can't have a negative state without also having skin open anyways) + if(!LIMB_HAS_ANY_SURGERY_STATE(limb, ALL_SURGERY_SKIN_STATES)) + return FALSE + + return TRUE + +/// Debug proc to print all surgeries available to whoever called the proc +/mob/living/proc/debug_get_all_available_surgeries() + var/mob/living/surgeon = usr + if(!isliving(surgeon)) + return + + var/list/operations = surgeon.get_available_operations(src, surgeon.get_active_held_item()) + if(!length(operations)) + to_chat(surgeon, boxed_message(span_info("No available surgeries."))) + return + + var/list/operations_info = list() + for(var/radial_slice in operations) + var/datum/surgery_operation/operation = operations[radial_slice][1] + var/atom/movable/operating_on = operations[radial_slice][2] + operations_info += "[radial_slice]: [operation.name] on [operating_on]" + + to_chat(surgeon, boxed_message(span_info("Available surgeries:

    [jointext(operations_info, "
    ")]"))) + +/// Takes a target zone and returns a list of readable surgery states for that zone. +/// Example output may be list("Skin is cut", "Blood vessels are unclamped", "Bone is sawed") +/mob/living/proc/get_surgery_state_as_list(target_zone) + var/list/state = list() + if(has_limbs) + var/obj/item/bodypart/part = get_bodypart(target_zone) + if(isnull(part)) + return list("Bodypart missing") + + if(HAS_TRAIT(part, TRAIT_READY_TO_OPERATE)) + state += "Ready for surgery" + if(!is_location_accessible(target_zone, IGNORED_OPERATION_CLOTHING_SLOTS)) + state += "Bodypart is obstructed by clothing" + + var/part_state = part?.surgery_state || NONE + + if(!LIMB_HAS_BONES(part)) + part_state &= ~BONELESS_SURGERY_STATES + state += "Bodypart lacks bones (counts as [jointext(bitfield_to_list(BONELESS_SURGERY_STATES, SURGERY_STATE_READABLE), ", ")])" + if(!LIMB_HAS_VESSELS(part)) + part_state &= ~VESSELLESS_SURGERY_STATES + state += "Bodypart lacks blood vessels (counts as [jointext(bitfield_to_list(VESSELLESS_SURGERY_STATES, SURGERY_STATE_READABLE), ", ")])" + if(!LIMB_HAS_SKIN(part)) + part_state &= ~SKINLESS_SURGERY_STATES + state += "Bodypart lacks skin (counts as [jointext(bitfield_to_list(SKINLESS_SURGERY_STATES, SURGERY_STATE_READABLE), ", ")])" + + state += bitfield_to_list(part_state, SURGERY_STATE_READABLE) + + else + if(HAS_TRAIT(src, TRAIT_READY_TO_OPERATE)) + state += "Ready for surgery" + + var/datum/status_effect/basic_surgery_state/state_holder = has_status_effect(__IMPLIED_TYPE__) + state += bitfield_to_list(state_holder?.surgery_state, SURGERY_STATE_READABLE) + + return state + +/** + * Adds a speed modifier to this mob + * + * * id - id of the modifier, string + * * amount - the multiplier to apply to surgery speed. + * This is multiplicative with other modifiers. + * * duration - how long the modifier should last in deciseconds. + * If null, it will be permanent until removed. + */ +/mob/living/proc/add_surgery_speed_mod(id, amount, duration) + ASSERT(!isnull(id), "Surgery speed mod ID cannot be null") + ASSERT(isnum(amount), "Surgery speed mod amount must be a number") + ASSERT(isnum(duration) || isnull(duration), "Surgery speed mod duration must be a number or null") + + var/existing = LAZYACCESS(mob_surgery_speed_mods, id) + if(existing == amount) + return + + if(isnum(existing)) + if(amount > 1 && existing > 1) + // both are speed decreases, take the better one + LAZYSET(mob_surgery_speed_mods, id, max(amount, existing)) + else if(amount < 1 && existing < 1) + // both are speed increases, take the better one + LAZYSET(mob_surgery_speed_mods, id, min(amount, existing)) + else + // one of each, just multiply them + LAZYSET(mob_surgery_speed_mods, id, amount * existing) + else + LAZYSET(mob_surgery_speed_mods, id, amount) + + if(isnum(duration)) + addtimer(CALLBACK(src, PROC_REF(remove_surgery_speed_mod), id), duration, TIMER_DELETE_ME|TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_NO_HASH_WAIT) + +/** + * Removes a speed modifier from this mob + * + * * id - id of the modifier to remove, string + */ +/mob/living/proc/remove_surgery_speed_mod(id) + LAZYREMOVE(mob_surgery_speed_mods, id) + +GLOBAL_DATUM_INIT(operations, /datum/operation_holder, new) + +/// Singleton containing all surgery operation, as well as some helpers for organizing them +/datum/operation_holder + /// All operation singletons, indexed by typepath + /// It is recommended to use get_instances_from() where possible, rather than accessing this directly + var/list/operations_by_typepath + /// All operation typepaths which are unlocked by default, indexed by typepath + var/list/unlocked + /// All operation typepaths which are locked by something, indexed by typepath + var/list/locked + +/datum/operation_holder/New() + . = ..() + operations_by_typepath = list() + unlocked = list() + locked = list() + + for(var/operation_type in valid_subtypesof(/datum/surgery_operation)) + var/datum/surgery_operation/operation = new operation_type() + if(isnull(operation.name)) + stack_trace("Surgery operation '[operation_type]' is missing a name!") + + operations_by_typepath[operation_type] = operation + if(operation.operation_flags & OPERATION_LOCKED) + locked += operation_type + else + unlocked += operation_type + +/// Takes in a list of operation typepaths and returns their singleton instances. Optionally can filter out replaced surgeries and by certain operation flags. +/datum/operation_holder/proc/get_instances_from(list/typepaths, filter_replaced = TRUE) + var/list/result = list() + for(var/datum/surgery_operation/operation_type as anything in typepaths) + var/datum/surgery_operation/operation = operations_by_typepath[operation_type] + if(isnull(operation)) + continue + if(filter_replaced && is_replaced(operation, typepaths)) + continue + result += operation + return result + +/// Check if the passed operation has been replaced by a typepath in the provided operation pool +/datum/operation_holder/proc/is_replaced(datum/surgery_operation/operation, list/operation_pool) + if(isnull(operation.replaced_by) || !length(operation_pool)) + return FALSE + if(operation.replaced_by == operation.type) + return FALSE + if(operation.replaced_by in operation_pool) + return TRUE + // recursively check if the operation that replaces us is itself replaced + var/datum/surgery_operation/next_highest_operation = operations_by_typepath[operation.replaced_by] + if(isnull(next_highest_operation)) + return FALSE + return is_replaced(next_highest_operation, operation_pool) + +/** + * ## Surgery operation datum + * + * A singleton datum which represents a surgical operation that can be performed on a mob. + * + * Surgery operations can be something simple, like moving between surgery states (tend wounds, clamp vessels), + * or more complex, like outright replacing limbs or organs. As such the datum is very flexible. + * + * At most basic, you must implement the vars: + * * - [name][/datum/surgery_operation/var/name] + * * - [desc][/datum/surgery_operation/var/desc] + * * - [implements][/datum/surgery_operation/var/implements] + * And the procs: + * * - [on success][/datum/surgery_operation/proc/on_success] - put the effects of the operation here + * Other noteworthy vars and procs you probably want to implement or override: + * * - [operation flags][/datum/surgery_operation/var/operation_flags] - flags modifying the behavior of the operation + * * - [required surgery state][/datum/surgery_operation/var/all_surgery_states_required] - target must have ALL of these states to be eligible for the operation + * * - [blocked surgery state][/datum/surgery_operation/var/any_surgery_states_blocked] - target must NOT have ANY these states to be eligible for the operation + * * - [state check][/datum/surgery_operation/proc/state_check] - extra checks for if the operating target is valid + * * - [get default radial image][/datum/surgery_operation/proc/get_default_radial_image] - what icon to use for this operation on the radial menu + * + * It's recommended to work off of [/datum/surgery_operation/limb] or [/datum/surgery_operation/organ] + * as they implement a lot of common functionality for targeting limbs or organs for you. + * + * See also [/datum/surgery_operation/basic], which is a bit more complex to use + * but allows for operations to target any mob type, rather than only those with limbs or organs. + */ +/datum/surgery_operation + abstract_type = /datum/surgery_operation + /// Required - Name of the operation, keep it short and format it like an action - "amputate limb", "remove organ" + /// Don't capitalize it, it will be capitalized automatically where necessary. + var/name + /// Required - Description of the operation, keep it short and format it like an action - "Amputate a patient's limb.", "Remove a patient's organ.". + // Use "a patient" instead of "the patient" to keep it generic. + var/desc + + /// Optional - the name of the operation shown in RND consoles and the operating computer. + /// You can get fancier here, givin an official surgery name ("Lobectomy") or rephrase it to be more descriptive ("Brain Lobectomy"). + /// Capitalize it as necessary. + var/rnd_name + /// Optional - the description of the operation shown in RND consoles and the operating computer. + /// Here is where you may want to provide more information on why an operation is done ("Fixes a broken liver") or special requirements ("Requires Synthflesh"). + /// Use "the patient" instead of "a patient" to keep it specific. + var/rnd_desc + + /** + * What tool(s) can be used to perform this operation? + * + * Assoc list of item typepath, TOOL_X, or IMPLEMENT_HAND to a multiplier for how effective that tool is at performing the operation. + * For example, list(TOOL_SCALPEL = 2, TOOL_SAW = 0.5) means that you can use a scalpel to operate, and it will double the time the operation takes. + * Likewise using a saw will halve the time it takes. If a tool is not listed, it cannot be used for this operation. + * + * Order matters! If a tool matches multiple entries, the first one will always be used. + * For example, if you have list(TOOL_SCREWDRIVER = 2, /obj/item/screwdriver = 1), and use a screwdriver + * it will use the TOOL_SCREWDRIVER modifier, making your operation 2x slower, even though the latter entry would have been faster. + * + * For this, it is handy to keep in mind SURGERY_MODIFIER_FAILURE_THRESHOLD. + * While speeds are soft capped and cannot be reduced beyond this point, larger modifiers still increase failure chances. + * + * Lastly, while most operations have its main tool with a 1x modifier (representing the "intended" tool), + * some will have its main tool's multiplier above or below 1x to represent an innately easier or harder operation + */ + var/list/implements + /// Base time to perform this operation + var/time = 1 SECONDS + + /// Flags modifying the behavior of this operation + var/operation_flags = NONE + + /// The target must have ALL of these surgery states for the operation to be available + var/all_surgery_states_required = NONE + /// The target must have ANY of these surgery states for the operation to be available + var/any_surgery_states_required = NONE + /// The target must NOT have ANY of these surgery states for the operation to be available + var/any_surgery_states_blocked = NONE + + /// Typepath of a surgical operation that supersedes this one + /// If this operation and the replaced_by operation are both available, only the replaced_by one will be usable + var/datum/surgery_operation/replaced_by + + /// SFX played before the do-after begins + /// Can be a sound path or an assoc list of item typepath to sound path to make different sounds for different tools + var/preop_sound + /// SFX played on success, after the do-after + /// Can be a sound path or an assoc list of item typepath to sound path to make different sounds for different tools + var/success_sound + /// SFX played on failure, after the do-after + /// Can be a sound path or an assoc list of item typepath to sound path to make different sounds for different tools + var/failure_sound + + /// The default radial menu choice for this operation, lazily created on first use + /// Some subtypes won't have this set as they provide their own options + VAR_PRIVATE/datum/radial_menu_choice/main_option + + /// Which mood event to give the patient when surgery is starting while they're conscious. + /// This should be permanent/not have a timer until the surgery either succeeds or fails, as those states will immediately replace it. + /// Mostly just flavor text. + var/datum/mood_event/surgery/surgery_started_mood_event = /datum/mood_event/surgery + /// Which mood event to give the conscious patient when surgery succeeds. + /// Lasts far shorter than if it failed. + var/datum/mood_event/surgery/surgery_success_mood_event = /datum/mood_event/surgery/success + /// Which mood event to give the consious patient when surgery fails. + /// Lasts muuuuuch longer. + var/datum/mood_event/surgery/surgery_failure_mood_event = /datum/mood_event/surgery/failure + +/** + * Checks to see if this operation can be performed + * This is the main entry point for checking availability + */ +/datum/surgery_operation/proc/check_availability(mob/living/patient, atom/movable/operating_on, mob/living/surgeon, tool, operated_zone) + SHOULD_NOT_OVERRIDE(TRUE) + SHOULD_NOT_SLEEP(TRUE) + SHOULD_BE_PURE(TRUE) + + if(isnull(patient) || isnull(operating_on)) + return FALSE + + if(!(operation_flags & OPERATION_STANDING_ALLOWED) && !IS_LYING_OR_CANNOT_LIE(patient)) + return FALSE + + if(!(operation_flags & OPERATION_SELF_OPERABLE) && patient == surgeon && !HAS_TRAIT(surgeon, TRAIT_SELF_SURGERY)) + return FALSE + + if(get_tool_quality(tool) <= 0) + return FALSE + + if(!is_available(operating_on, operated_zone)) + return FALSE + + return snowflake_check_availability(operating_on, surgeon, tool, operated_zone) + +/** + * Snowflake checks for surgeries which need many interconnected conditions to be met + */ +/datum/surgery_operation/proc/snowflake_check_availability(atom/movable/operating_on, mob/living/surgeon, tool, operated_zone) + PROTECTED_PROC(TRUE) + return TRUE + +/** + * Returns the quality of the passed tool for this operation + * Quality directly affects the time taken to perform the operation + * + * 0 = unusable + * 1 = standard quality + */ +/datum/surgery_operation/proc/get_tool_quality(tool = IMPLEMENT_HAND) + PROTECTED_PROC(TRUE) + if(!length(implements)) + return 1 + if(!isitem(tool)) + return implements[tool] + if(!tool_check(tool)) + return 0 + + var/obj/item/realtool = tool + return (realtool.toolspeed) * (implements[realtool.tool_behaviour] || is_type_in_list(realtool, implements, zebra = TRUE) || 0) + +/** + * Return a radial slice, a list of radial slices, or an assoc list of radial slice to operation info + * + * By default it returns a single option with the operation name and description, + * but you can override this proc to return multiple options for one operation, like selecting which organ to operate on. + */ +/datum/surgery_operation/proc/get_radial_options(atom/movable/operating_on, obj/item/tool, operating_zone) + if(!main_option) + main_option = new() + main_option.image = get_default_radial_image() + main_option.name = name + main_option.info = desc + + return main_option + +/** + * Checks to see if this operation can be performed on the provided target + */ +/datum/surgery_operation/proc/is_available(atom/movable/operating_on, operated_zone) + PROTECTED_PROC(TRUE) + SHOULD_CALL_PARENT(TRUE) + + if(all_surgery_states_required && !has_surgery_state(operating_on, all_surgery_states_required)) + return FALSE + + if(any_surgery_states_required && !has_any_surgery_state(operating_on, any_surgery_states_required)) + return FALSE + + if(any_surgery_states_blocked && has_any_surgery_state(operating_on, any_surgery_states_blocked)) + return FALSE + + if(!state_check(operating_on)) + return FALSE + + var/mob/living/patient = get_patient(operating_on) + if(!(operation_flags & OPERATION_IGNORE_CLOTHES) && !patient.is_location_accessible(operated_zone, IGNORED_OPERATION_CLOTHING_SLOTS)) + return FALSE + + return TRUE + +/// Check if the movable being operated on has all the passed surgery states +/datum/surgery_operation/proc/has_surgery_state(atom/movable/operating_on, state) + PROTECTED_PROC(TRUE) + return FALSE + +/// Check if the movable being operated on has any of the passed surgery states +/datum/surgery_operation/proc/has_any_surgery_state(atom/movable/operating_on, state) + PROTECTED_PROC(TRUE) + return FALSE + +/** + * Any operation specific state checks, such as checking for traits or more complex state requirements + */ +/datum/surgery_operation/proc/state_check(atom/movable/operating_on) + PROTECTED_PROC(TRUE) + return TRUE + +/** + * Checks to see if the provided tool is valid for this operation + * You can override this to add more specific checks, such as checking sharpness + */ +/datum/surgery_operation/proc/tool_check(obj/item/tool) + PROTECTED_PROC(TRUE) + return TRUE + +/** + * Returns the name of whatever tool is recommended for this operation, such as "hemostat" + */ +/datum/surgery_operation/proc/get_recommended_tool() + if(!length(implements)) + return null + var/recommendation = implements[1] + if(istext(recommendation)) + return recommendation // handles tools or IMPLEMENT_HAND + if(recommendation == /obj/item) + return get_any_tool() + if(ispath(recommendation, /obj/item)) + var/obj/item/tool = recommendation + return tool::name + return null + +/** + * For surgery operations that can be performed with any item, this explains what kind of item is needed + */ +/datum/surgery_operation/proc/get_any_tool() + return "Any item" + +/** + * Return a list of lists of strings indicating the various requirements for this operation + */ +/datum/surgery_operation/proc/get_requirements() + SHOULD_NOT_OVERRIDE(TRUE) + return list( + all_required_strings(), + any_required_strings(), + any_optional_strings(), + all_blocked_strings(), + ) + +/// Returns a list of strings indicating requirements for this operation +/// "All requirements" are formatted as "All of the following must be true:" +/datum/surgery_operation/proc/all_required_strings() + SHOULD_CALL_PARENT(TRUE) + . = bitfield_to_list(all_surgery_states_required, SURGERY_STATE_GUIDES("must")) + if(!(operation_flags & OPERATION_STANDING_ALLOWED)) + . += "the patient must be lying down" + +/// Returns a list of strings indicating any of the requirements for this operation +/// "Any requirements" are formatted as "At least one of the following must be true:" +/datum/surgery_operation/proc/any_required_strings() + SHOULD_CALL_PARENT(TRUE) + . = list() + // grouped states are filtered down to make it more readable + var/parsed_any_flags = any_surgery_states_required + if((parsed_any_flags & ALL_SURGERY_BONE_STATES) == ALL_SURGERY_BONE_STATES) + parsed_any_flags &= ~ALL_SURGERY_BONE_STATES + . += "the bone must be sawed or drilled" + if((parsed_any_flags & ALL_SURGERY_SKIN_STATES) == ALL_SURGERY_SKIN_STATES) + parsed_any_flags &= ~ALL_SURGERY_SKIN_STATES + . += "the skin must be cut or opened" + if((parsed_any_flags & ALL_SURGERY_VESSEL_STATES) == ALL_SURGERY_VESSEL_STATES) + parsed_any_flags &= ~ALL_SURGERY_VESSEL_STATES + . += "the blood vessels must be clamped or unclamped" // weird phrasing but whatever + + . += bitfield_to_list(parsed_any_flags, SURGERY_STATE_GUIDES("must")) + +/// Returns a list of strings indicating optional conditions for this operation +/// "Optional conditions" are formatted as "Additionally, any of the following may be true:" +/datum/surgery_operation/proc/any_optional_strings() + SHOULD_CALL_PARENT(TRUE) + . = list() + if(operation_flags & OPERATION_SELF_OPERABLE) + . += "a surgeon may perform this on themselves" + +/// Returns a list of strings indicating blocked states for this operation +/// "Blocked requirements" are formatted as "However, none of the following may be true:" +/datum/surgery_operation/proc/all_blocked_strings() + SHOULD_CALL_PARENT(TRUE) + . = list() + // grouped states are filtered down to make it more readable + var/parsed_blocked_flags = any_surgery_states_blocked + if((parsed_blocked_flags & ALL_SURGERY_BONE_STATES) == ALL_SURGERY_BONE_STATES) + parsed_blocked_flags &= ~ALL_SURGERY_BONE_STATES + . += "the bone must be intact" + if((parsed_blocked_flags & ALL_SURGERY_SKIN_STATES) == ALL_SURGERY_SKIN_STATES) + parsed_blocked_flags &= ~ALL_SURGERY_SKIN_STATES + . += "the skin must be intact" + if((parsed_blocked_flags & ALL_SURGERY_VESSEL_STATES) == ALL_SURGERY_VESSEL_STATES) + parsed_blocked_flags &= ~ALL_SURGERY_VESSEL_STATES + . += "the blood vessels must be intact" + + . += bitfield_to_list(parsed_blocked_flags, SURGERY_STATE_GUIDES("must not")) + if(!(operation_flags & OPERATION_IGNORE_CLOTHES)) + . += "the operation site must not be obstructed by clothing" + +/** + * Returns what icon this surgery uses by default on the radial wheel if it does not implement its own radial options + * + * Also used when generating icons for the wiki + */ +/datum/surgery_operation/proc/get_default_radial_image() + return image(icon = 'icons/effects/random_spawners.dmi', icon_state = "questionmark") + +/// Helper to get a generic limb radial image based on body zone +/datum/surgery_operation/proc/get_generic_limb_radial_image(body_zone) + SHOULD_NOT_OVERRIDE(TRUE) + PROTECTED_PROC(TRUE) + + if(body_zone == BODY_ZONE_HEAD || body_zone == BODY_ZONE_CHEST || body_zone == BODY_ZONE_PRECISE_EYES || body_zone == BODY_ZONE_PRECISE_MOUTH) + return image(icon = 'icons/obj/medical/surgery_ui.dmi', icon_state = "surgery_[body_zone]") + if(body_zone == BODY_ZONE_L_ARM || body_zone == BODY_ZONE_R_ARM) + return image(icon = 'icons/obj/medical/surgery_ui.dmi', icon_state = "surgery_arms") + if(body_zone == BODY_ZONE_L_LEG || body_zone == BODY_ZONE_R_LEG) + return image(icon = 'icons/obj/medical/surgery_ui.dmi', icon_state = "surgery_legs") + return get_default_radial_image() + +/** + * Helper for constructing overlays to apply to a radial image + * + * Input can be + * * - An atom typepath + * * - An atom instance + * * - Another image + * + * Returns a list of images + */ +/datum/surgery_operation/proc/add_radial_overlays(list/overlay_icons) + SHOULD_NOT_OVERRIDE(TRUE) + PROTECTED_PROC(TRUE) + + if(!islist(overlay_icons)) + overlay_icons = list(overlay_icons) + + var/list/created_list = list() + for(var/input in overlay_icons) + var/image/created = isimage(input) ? input : image(input) + created.layer = FLOAT_LAYER + created.plane = FLOAT_PLANE + created.pixel_w = 0 + created.pixel_x = 0 + created.pixel_y = 0 + created.pixel_z = 0 + created_list += created + + return created_list + + +/** + * Collates all time modifiers for this operation and returns the final modifier + */ +/datum/surgery_operation/proc/get_time_modifiers(atom/movable/operating_on, mob/living/surgeon, tool) + PROTECTED_PROC(TRUE) + var/total_mod = 1.0 + total_mod *= get_tool_quality(tool) || 1.0 + // Ignore alllll the penalties (but also all the bonuses) + if(!HAS_TRAIT(surgeon, TRAIT_IGNORE_SURGERY_MODIFIERS)) + var/mob/living/patient = get_patient(operating_on) + total_mod *= get_location_modifier(get_turf(patient)) + total_mod *= get_morbid_modifier(surgeon, tool) + total_mod *= get_mob_surgery_speed_mod(patient) + // Using TRAIT_SELF_SURGERY on a surgery which doesn't normally allow self surgery imparts a penalty + if(patient == surgeon && HAS_TRAIT(surgeon, TRAIT_SELF_SURGERY) && !(operation_flags & OPERATION_SELF_OPERABLE)) + total_mod *= 1.5 + return round(total_mod, 0.01) + +/// Returns a time modifier for morbid operations +/datum/surgery_operation/proc/get_morbid_modifier(mob/living/surgeon, obj/item/tool) + PROTECTED_PROC(TRUE) + if(!(operation_flags & OPERATION_MORBID)) + return 1.0 + if(!HAS_MIND_TRAIT(surgeon, TRAIT_MORBID)) + return 1.0 + if(!isitem(tool) || !(tool.item_flags & CRUEL_IMPLEMENT)) + return 1.0 + + return 0.7 + +/// Returns a time modifier based on the mob's status +/datum/surgery_operation/proc/get_mob_surgery_speed_mod(mob/living/patient) + PROTECTED_PROC(TRUE) + var/basemod = 1.0 + for(var/mod_id, mod_amt in patient.mob_surgery_speed_mods) + basemod *= mod_amt + if(HAS_TRAIT(patient, TRAIT_SURGICALLY_ANALYZED)) + basemod *= 0.8 + if(HAS_TRAIT(patient, TRAIT_ANALGESIA)) + basemod *= 0.8 + return basemod + +/// Gets the surgery speed modifier for a given mob, based off what sort of table/bed/whatever is on their turf. +/datum/surgery_operation/proc/get_location_modifier(turf/operation_turf) + PROTECTED_PROC(TRUE) + // Technically this IS a typecache, just not the usual kind :3 + // The order of the modifiers matter, latter entries override earlier ones + var/static/list/modifiers = zebra_typecacheof(list( + /obj/structure/table = 1.25, + /obj/structure/table/optable = 1.0, + /obj/structure/table/optable/abductor = 0.85, + /obj/machinery/stasis = 1.15, + /obj/structure/bed = 1.5, + )) + var/mod = 2.0 + for(var/obj/thingy in operation_turf) + mod = min(mod, modifiers[thingy.type] || 2.0) + return mod + +/** + * Gets what movable is being operated on by a surgeon during this operation + * Determines what gets passed into the try_perform() proc + * If null is returned, the operation cannot be performed + * + * * patient - The mob being operated on + * * body_zone - The body zone being operated on + * + * Returns the atom/movable being operated on + */ +/datum/surgery_operation/proc/get_operation_target(mob/living/patient, body_zone) + return patient + +/** + * Called by operating computers to hint that this surgery could come next given the target's current state + */ +/datum/surgery_operation/proc/show_as_next_step(mob/living/potential_patient, operated_zone) + var/atom/movable/operate_on = get_operation_target(potential_patient, operated_zone) + return !isnull(operate_on) && is_available(operate_on, operated_zone) + + +/** + * The actual chain of performing the operation + * + * * operating_on - The atom being operated on, probably a bodypart or occasionally a mob directly + * * surgeon - The mob performing the operation + * * tool - The tool being used to perform the operation. CAN BE A STRING, ie, IMPLEMENT_HAND, be careful + * * operation_args - Additional arguments passed into the operation. Contains largely niche info that only certain operations care about or can be accessed through other means + * + * Returns an item interaction flag - intended to be invoked from the interaction chain + */ +/datum/surgery_operation/proc/try_perform(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args = list()) + SHOULD_NOT_OVERRIDE(TRUE) + var/mob/living/patient = get_patient(operating_on) + + if(!check_availability(patient, operating_on, surgeon, tool, operation_args[OPERATION_TARGET_ZONE])) + return ITEM_INTERACT_BLOCKING + if(!start_operation(operating_on, surgeon, tool, operation_args)) + return ITEM_INTERACT_BLOCKING + + var/was_sleeping = (patient.stat != DEAD && HAS_TRAIT(patient, TRAIT_KNOCKEDOUT)) + var/result = NONE + + update_surgery_mood(patient, SURGERY_STATE_STARTED) + SEND_SIGNAL(patient, COMSIG_LIVING_SURGERY_STARTED, src, operating_on, tool) + + do + operation_args[OPERATION_SPEED] = get_time_modifiers(operating_on, surgeon, tool) + + if(!do_after( + user = surgeon, + // Actual delay is capped - think of the excess time as being added to failure chance instead + delay = time * min(operation_args[OPERATION_SPEED], SURGERY_MODIFIER_FAILURE_THRESHOLD), + target = patient, + extra_checks = CALLBACK(src, PROC_REF(operate_check), patient, operating_on, surgeon, tool, operation_args), + // You can only operate on one mob at a time without a hippocratic oath + interaction_key = HAS_TRAIT(surgeon, TRAIT_HIPPOCRATIC_OATH) ? patient : DOAFTER_SOURCE_SURGERY, + )) + result |= ITEM_INTERACT_BLOCKING + update_surgery_mood(patient, SURGERY_STATE_FAILURE) + break + + if(ishuman(surgeon)) + var/mob/living/carbon/human/surgeon_human = surgeon + surgeon_human.add_blood_DNA_to_items(patient.get_blood_dna_list(), ITEM_SLOT_GLOVES) + else + surgeon.add_mob_blood(patient) + + // This will annoy doctors immensely + // if(isitem(tool)) + // var/obj/item/realtool = tool + // realtool.add_mob_blood(patient) + + // We modify speed modifier here AFTER the do after to increase failure chances, that's intentional + // Think of it as modifying "effective time" rather than "real time". Failure chance goes up but the time it took is unchanged + + // Using TRAIT_SELF_SURGERY on a surgery which doesn't normally allow self surgery imparts a flat penalty + // (On top of the 1.5x real time surgery modifier, an effective time modifier of 3x under standard conditions) + if(patient == surgeon && HAS_TRAIT(surgeon, TRAIT_SELF_SURGERY) && !(operation_flags & OPERATION_SELF_OPERABLE)) + operation_args[OPERATION_SPEED] += 1.5 + + // Otherwise if we have TRAIT_IGNORE_SURGERY_MODIFIERS we cannot possibly fail, unless we specifically allow failure + if(HAS_TRAIT(surgeon, TRAIT_IGNORE_SURGERY_MODIFIERS) && !(operation_flags & OPERATION_ALWAYS_FAILABLE)) + operation_args[OPERATION_SPEED] = 0 + + if(operation_args[OPERATION_FORCE_FAIL] || prob(clamp(GET_FAILURE_CHANCE(time, operation_args[OPERATION_SPEED]), 0, 99))) + failure(operating_on, surgeon, tool, operation_args) + result |= ITEM_INTERACT_FAILURE + update_surgery_mood(patient, SURGERY_STATE_FAILURE) + else + success(operating_on, surgeon, tool, operation_args) + result |= ITEM_INTERACT_SUCCESS + update_surgery_mood(patient, SURGERY_STATE_SUCCESS) + + if(isstack(tool)) + var/obj/item/stack/tool_stack = tool + tool_stack.use(1) + + while ((operation_flags & OPERATION_LOOPING) && can_loop(patient, operating_on, surgeon, tool, operation_args)) + + SEND_SIGNAL(patient, COMSIG_LIVING_SURGERY_FINISHED, src, operating_on, tool) + + if(patient.stat == DEAD && was_sleeping) + surgeon.client?.give_award(/datum/award/achievement/jobs/sandman, surgeon) + + return result + +/// Called after an operation to check if it can be repeated/looped +/datum/surgery_operation/proc/can_loop(mob/living/patient, atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + PROTECTED_PROC(TRUE) + return operate_check(patient, operating_on, surgeon, tool, operation_args) + +/// Called during the do-after to check if the operation can continue +/datum/surgery_operation/proc/operate_check(mob/living/patient, atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + PROTECTED_PROC(TRUE) + + if(isstack(tool)) + var/obj/item/stack/tool_stack = tool + if(tool_stack.amount <= 0) + return FALSE + + if(!surgeon.surgery_check(tool, patient)) + return FALSE + + if(!check_availability(patient, operating_on, surgeon, tool, operation_args[OPERATION_TARGET_ZONE])) + return FALSE + + return TRUE + +/** + * Allows for any extra checks or setup when the operation starts + * If you want user input before for an operation, do it here + * + * This proc can sleep, sanity checks are automatically performed after it completes + * + * Return FALSE to cancel the operation + * Return TRUE to continue + */ +/datum/surgery_operation/proc/pre_preop(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + PROTECTED_PROC(TRUE) + return TRUE + +/// Used to display messages to the surgeon and patient +/datum/surgery_operation/proc/display_results(mob/living/surgeon, mob/living/target, self_message, detailed_message, vague_message, target_detailed = FALSE) + SHOULD_NOT_OVERRIDE(TRUE) + PROTECTED_PROC(TRUE) + + ASSERT(istext(self_message), "[type] operation display_results must have a self_message!") + ASSERT(istext(detailed_message), "[type] operation display_results must have a detailed_message!") + ASSERT(istext(vague_message) || target_detailed, "[type] operation display_results must have either a vague_message or target_detailed = TRUE!") + + surgeon.visible_message( + message = detailed_message, + self_message = self_message, + vision_distance = 1, + ignored_mobs = target_detailed ? null : target + ) + if(target_detailed) + return + + var/you_feel = pick("a brief pain", "your body tense up", "an unnerving sensation") + target.show_message( + msg = vague_message || detailed_message || span_notice("You feel [you_feel] as you are operated on."), + type = MSG_VISUAL, + alt_msg = span_notice("You feel [you_feel] as you are operated on."), + ) + +/// Display pain message to the target based on their traits and condition +/datum/surgery_operation/proc/display_pain(mob/living/target, pain_message, mechanical_surgery = FALSE) + SHOULD_NOT_OVERRIDE(TRUE) + PROTECTED_PROC(TRUE) + + if(!pain_message) + return + + // Determine how drunk our patient is + var/drunken_patient = target.get_drunk_amount() + // Create a probability to ignore the pain based on drunkenness level + var/drunken_ignorance_probability = clamp(drunken_patient, 0, 90) + + if(target.stat >= UNCONSCIOUS || HAS_TRAIT(target, TRAIT_KNOCKEDOUT)) + return + if(HAS_TRAIT(target, TRAIT_ANALGESIA) || drunken_patient && prob(drunken_ignorance_probability)) + to_chat(target, span_notice("You feel a dull, numb sensation as your body is surgically operated on.")) + return + to_chat(target, span_userdanger(pain_message)) + if(prob(30) && !mechanical_surgery) + target.emote("scream") + +/// Plays a sound for the operation based on the tool used +/datum/surgery_operation/proc/play_operation_sound(atom/movable/operating_on, mob/living/surgeon, tool, sound_or_sound_list) + PROTECTED_PROC(TRUE) + + if(isitem(tool) && (operation_flags & OPERATION_MECHANIC)) + var/obj/item/realtool = tool + realtool.play_tool_sound(operating_on) + return + + var/sound_to_play + if(islist(sound_or_sound_list)) + var/list/sounds = sound_or_sound_list + if(isitem(tool)) + var/obj/item/realtool = tool + sound_to_play = sounds[realtool.tool_behaviour] || is_type_in_list(realtool, sounds, zebra = TRUE) + else + sound_to_play = sounds[tool] + else + sound_to_play = sound_or_sound_list + + if(sound_to_play) + playsound(surgeon, sound_to_play, 50, TRUE) + +/// Helper for getting the mob who is ultimately being operated on, given the movable that is truly being operated on. +/// For example in limb surgeries this would return the mob the limb is attached to. +/datum/surgery_operation/proc/get_patient(atom/movable/operating_on) as /mob/living + return operating_on + +/// Helper for getting an operating compupter the patient is linked to +/datum/surgery_operation/proc/locate_operating_computer(atom/movable/operating_on) + SHOULD_NOT_OVERRIDE(TRUE) + var/turf/operating_turf = get_turf(operating_on) + if(isnull(operating_turf)) + return null + + var/obj/structure/table/optable/operating_table = locate() in operating_turf + var/obj/machinery/computer/operating/operating_computer = operating_table?.computer + + if(isnull(operating_computer) || (operating_computer.machine_stat & (NOPOWER|BROKEN))) + return null + + return operating_computer + +/// Updates a patient's mood based on the surgery state and their traits +/datum/surgery_operation/proc/update_surgery_mood(mob/living/patient, surgery_state) + PROTECTED_PROC(TRUE) + if(!(operation_flags & OPERATION_AFFECTS_MOOD)) + return + + // Create a probability to ignore the pain based on drunkenness level + var/drunk_ignore_prob = clamp(patient.get_drunk_amount(), 0, 90) + + if(HAS_TRAIT(patient, TRAIT_ANALGESIA) || prob(drunk_ignore_prob)) + patient.clear_mood_event(SURGERY_MOOD_CATEGORY) //incase they gained the trait mid-surgery (or became drunk). has the added side effect that if someone has a bad surgical memory/mood and gets drunk & goes back to surgery, they'll forget they hated it, which is kinda funny imo. + return + if(patient.stat >= UNCONSCIOUS) + var/datum/mood_event/surgery/target_mood_event = patient.mob_mood?.mood_events[SURGERY_MOOD_CATEGORY] + if(!target_mood_event || target_mood_event.surgery_completed) //don't give sleeping mobs trauma. that said, if they fell asleep mid-surgery after already getting the bad mood, lets make sure they wake up to a (hopefully) happy memory. + return + switch(surgery_state) + if(SURGERY_STATE_STARTED) + patient.add_mood_event(SURGERY_MOOD_CATEGORY, surgery_started_mood_event) + if(SURGERY_STATE_SUCCESS) + patient.add_mood_event(SURGERY_MOOD_CATEGORY, surgery_success_mood_event) + if(SURGERY_STATE_FAILURE) + patient.add_mood_event(SURGERY_MOOD_CATEGORY, surgery_failure_mood_event) + else + CRASH("passed invalid surgery_state, \"[surgery_state]\".") + +/** + * Called when the operation initiates + * Don't touch this proc, override on_preop() instead + */ +/datum/surgery_operation/proc/start_operation(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + SHOULD_NOT_OVERRIDE(TRUE) + PRIVATE_PROC(TRUE) + + var/preop_time = world.time + var/mob/living/patient = get_patient(operating_on) + if(!pre_preop(operating_on, surgeon, tool, operation_args)) + return FALSE + // if pre_preop slept, sanity check that everything is still valid + if(preop_time != world.time && (patient != get_patient(operating_on) || !surgeon.Adjacent(patient) || !surgeon.is_holding(tool) || !operate_check(patient, operating_on, surgeon, tool, operation_args))) + return FALSE + + play_operation_sound(operating_on, surgeon, tool, preop_sound) + on_preop(operating_on, surgeon, tool, operation_args) + return TRUE + +/** + * Used to customize behavior when the operation starts + */ +/datum/surgery_operation/proc/on_preop(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + PROTECTED_PROC(TRUE) + var/mob/living/patient = get_patient(operating_on) + + display_results( + surgeon, + patient, + span_notice("You begin to operate on [patient]..."), + span_notice("[surgeon] begins to operate on [patient]."), + span_notice("[surgeon] begins to operate on [patient]."), + ) + +/** + * Called when the operation is successful + * Don't touch this proc, override on_success() instead + */ +/datum/surgery_operation/proc/success(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + SHOULD_NOT_OVERRIDE(TRUE) + PRIVATE_PROC(TRUE) + SHOULD_NOT_SLEEP(TRUE) + + if(operation_flags & OPERATION_NOTABLE) + SSblackbox.record_feedback("tally", "surgeries_completed", 1, type) + surgeon.add_mob_memory(/datum/memory/surgery, deuteragonist = surgeon, surgery_type = name) + + SEND_SIGNAL(surgeon, COMSIG_LIVING_SURGERY_SUCCESS, src, operating_on, tool) + play_operation_sound(operating_on, surgeon, tool, success_sound) + on_success(operating_on, surgeon, tool, operation_args) + +/** + * Used to customize behavior when the operation is successful + */ +/datum/surgery_operation/proc/on_success(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + PROTECTED_PROC(TRUE) + var/mob/living/patient = get_patient(operating_on) + + display_results( + surgeon, + patient, + span_notice("You succeed."), + span_notice("[surgeon] succeeds!"), + span_notice("[surgeon] finishes."), + ) + +/** + * Called when the operation fails + * Don't touch this proc, override on_failure() instead + */ +/datum/surgery_operation/proc/failure(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + SHOULD_NOT_OVERRIDE(TRUE) + PRIVATE_PROC(TRUE) + SHOULD_NOT_SLEEP(TRUE) + + if(operation_flags & OPERATION_NOTABLE) + SSblackbox.record_feedback("tally", "surgeries_failed", 1, type) + + SEND_SIGNAL(surgeon, COMSIG_LIVING_SURGERY_FAILED, src, operating_on, tool) + play_operation_sound(operating_on, surgeon, tool, failure_sound) + on_failure(operating_on, surgeon, tool, operation_args) + +/** + * Used to customize behavior when the operation fails + * + * total_penalty_modifier is the final modifier applied to the time taken to perform the operation, + * and it can be interpreted as how badly the operation was performed + * + * At its lowest, it will be just above 2.5 (the threshold for success), and can go up to infinity (theoretically) + */ +/datum/surgery_operation/proc/on_failure(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + PROTECTED_PROC(TRUE) + var/mob/living/patient = get_patient(operating_on) + + var/screwedmessage = "" + switch(operation_args[OPERATION_SPEED]) + if(2.5 to 3) + screwedmessage = " You almost had it, though." + if(3 to 4) + pass() + if(4 to 5) + screwedmessage = " This is hard to get right in these conditions..." + if(5 to INFINITY) + screwedmessage = " This is practically impossible in these conditions..." + if(operation_args[OPERATION_FORCE_FAIL]) + screwedmessage = " Intentionally." + + display_results( + surgeon, + patient, + span_warning("You screw up![screwedmessage]"), + span_warning("[surgeon] screws up!"), + span_notice("[surgeon] finishes."), + TRUE, //By default the patient will notice if the wrong thing has been cut + ) + +/** + * Basic operations are a simple base type for surgeries that + * 1. Target a specific zone on humans + * 2. Work on non-humans + * + * Use this as a bsae if your surgery needs to work on everyone + * + * "operating_on" is the mob being operated on, be it carbon or non-carbon. + * If the mob is carbon, we check the relevant bodypart for surgery states and traits. No bodypart, no operation. + * If the mob is non-carbon, we just check the mob directly. + */ +/datum/surgery_operation/basic + abstract_type = /datum/surgery_operation/basic + /// Biotype required to perform this operation + var/required_biotype = ~MOB_ROBOTIC + /// The zone we are expected to be working on, even if the target is a non-carbon mob + var/target_zone = BODY_ZONE_CHEST + /// When working on carbons, what bodypart are we working on? Keep it representative of the required biotype + var/required_bodytype = ~BODYTYPE_ROBOTIC + +/datum/surgery_operation/basic/all_required_strings() + . = list() + if(required_biotype) + . += "operate on [target_zone ? "[parse_zone(target_zone)] (target [parse_zone(target_zone)])" : "patient"]" + else if(target_zone) + . += "operate on [parse_zone(target_zone)] (target [parse_zone(target_zone)])" + . += ..() + +/datum/surgery_operation/basic/all_blocked_strings() + . = ..() + if(required_biotype & MOB_ROBOTIC) + . += "the patient must not be organic" + else if(required_biotype) + . += "the patient must not be robotic" + +/datum/surgery_operation/basic/is_available(mob/living/patient, operated_zone) + SHOULD_NOT_OVERRIDE(TRUE) + + if(target_zone && target_zone != operated_zone) + return FALSE + if(!HAS_TRAIT(patient, TRAIT_READY_TO_OPERATE)) + return FALSE + if(required_biotype && !(patient.mob_biotypes & required_biotype)) + return FALSE + if(!patient.has_limbs || !target_zone) + return ..() + + var/obj/item/bodypart/carbon_part = patient.get_bodypart(target_zone) + if(isnull(carbon_part)) + return FALSE + if(!HAS_TRAIT(carbon_part, TRAIT_READY_TO_OPERATE)) + return FALSE + if(required_bodytype && !(carbon_part.bodytype & required_bodytype)) + return FALSE + return ..() + +/datum/surgery_operation/basic/has_surgery_state(mob/living/patient, state) + var/obj/item/bodypart/carbon_part = patient.get_bodypart(target_zone) + if(isnull(carbon_part)) // non-carbon + var/datum/status_effect/basic_surgery_state/state_holder = patient.has_status_effect(__IMPLIED_TYPE__) + return HAS_SURGERY_STATE(state_holder?.surgery_state, state & (SURGERY_BONE_SAWED|SURGERY_SKIN_OPEN)) // these are the only states basic mobs support, update this if that changes + + return LIMB_HAS_SURGERY_STATE(carbon_part, state) + +/datum/surgery_operation/basic/has_any_surgery_state(mob/living/patient, state) + var/obj/item/bodypart/carbon_part = patient.get_bodypart(target_zone) + if(isnull(carbon_part)) // non-carbon + var/datum/status_effect/basic_surgery_state/state_holder = patient.has_status_effect(__IMPLIED_TYPE__) + return HAS_ANY_SURGERY_STATE(state_holder?.surgery_state, state) + + return LIMB_HAS_ANY_SURGERY_STATE(carbon_part, state) + +/** + * Limb opterations are a base focused on the limb the surgeon is targeting + * + * Use this if your surgery targets a specific limb on the mob + * + * "operating_on" is asserted to be a bodypart - the bodypart the surgeon is targeting. + * If there is no bodypart, there's no operation. + */ +/datum/surgery_operation/limb + abstract_type = /datum/surgery_operation/limb + /// Body type required to perform this operation + var/required_bodytype = NONE + +/datum/surgery_operation/limb/all_blocked_strings() + . = ..() + if(required_bodytype & BODYTYPE_ROBOTIC) + . += "the limb must not be organic" + else if(required_bodytype & BODYTYPE_ORGANIC) + . += "the limb must not be cybernetic" + +/datum/surgery_operation/limb/get_operation_target(mob/living/patient, body_zone) + return patient.get_bodypart(deprecise_zone(body_zone)) + +/datum/surgery_operation/limb/is_available(obj/item/bodypart/limb, operated_zone) + SHOULD_NOT_OVERRIDE(TRUE) + + // targeting groin will redirect you to the chest + if(limb.body_zone != deprecise_zone(operated_zone)) + return FALSE + if(required_bodytype && !(limb.bodytype & required_bodytype)) + return FALSE + if(!HAS_TRAIT(limb, TRAIT_READY_TO_OPERATE)) + return FALSE + + return ..() + +/datum/surgery_operation/limb/has_surgery_state(obj/item/bodypart/limb, state) + return LIMB_HAS_SURGERY_STATE(limb, state) + +/datum/surgery_operation/limb/has_any_surgery_state(obj/item/bodypart/limb, state) + return LIMB_HAS_ANY_SURGERY_STATE(limb, state) + +/datum/surgery_operation/limb/get_patient(obj/item/bodypart/limb) + return limb.owner + +/** + * Organ operations are a base focused on a specific organ typepath + * + * Use this if your surgery targets a specific organ type + * + * "operating_on" is asserted to be an organ of the type defined by target_type. + * No organ of that type, no operation. + */ +/datum/surgery_operation/organ + abstract_type = /datum/surgery_operation/organ + /// Biotype required to perform this operation + var/required_organ_flag = ORGAN_TYPE_FLAGS & ~ORGAN_ROBOTIC + /// The type of organ this operation can target + var/obj/item/organ/target_type + +/datum/surgery_operation/organ/all_required_strings() + return list("operate on [target_type::name] (target [target_type::zone])") + ..() + +/datum/surgery_operation/organ/all_blocked_strings() + . = ..() + if(required_organ_flag & BODYTYPE_ROBOTIC) + . += "the organ must not be organic" + else if(required_organ_flag & ORGAN_TYPE_FLAGS) + . += "the organ must not be cybernetic" + +/datum/surgery_operation/organ/get_default_radial_image() + return get_generic_limb_radial_image(target_type::zone) + +/datum/surgery_operation/organ/get_operation_target(mob/living/patient, body_zone) + return patient.get_organ_by_type(target_type) + +/datum/surgery_operation/organ/get_patient(obj/item/organ/organ) + return organ.owner + +/datum/surgery_operation/organ/is_available(obj/item/organ/organ, operated_zone) + SHOULD_NOT_OVERRIDE(TRUE) + + if(organ.zone != operated_zone) // this check prevents eyes from showing up in head operations + return FALSE + if(required_organ_flag && !(organ.organ_flags & required_organ_flag)) + return FALSE + if(!HAS_TRAIT(organ.bodypart_owner, TRAIT_READY_TO_OPERATE)) + return FALSE + + return ..() + +/datum/surgery_operation/organ/has_surgery_state(obj/item/organ/organ, state) + return LIMB_HAS_SURGERY_STATE(organ.bodypart_owner, state) + +/datum/surgery_operation/organ/has_any_surgery_state(obj/item/organ/organ, state) + return LIMB_HAS_ANY_SURGERY_STATE(organ.bodypart_owner, state) diff --git a/code/modules/surgery/operations/operation_add_limb.dm b/code/modules/surgery/operations/operation_add_limb.dm new file mode 100644 index 000000000000..744fdbef8809 --- /dev/null +++ b/code/modules/surgery/operations/operation_add_limb.dm @@ -0,0 +1,201 @@ +#define OPERATION_REJECTION_DAMAGE "tox_damage" + +// This surgery is so snowflake that it doesn't use any of the operation subtypes, it forges its own path +/datum/surgery_operation/prosthetic_replacement + name = "prosthetic replacement" + desc = "Replace a missing limb with a prosthetic (or arbitrary) item." + implements = list( + /obj/item/bodypart = 1, + /obj/item = 1, + ) + time = 3.2 SECONDS + operation_flags = OPERATION_STANDING_ALLOWED | OPERATION_PRIORITY_NEXT_STEP | OPERATION_NOTABLE | OPERATION_IGNORE_CLOTHES + all_surgery_states_required = SURGERY_SKIN_OPEN | SURGERY_VESSELS_CLAMPED + /// List of items that are always allowed to be an arm replacement, even if they fail another requirement. + var/list/always_accepted_prosthetics = list( + /obj/item/chainsaw, // the OG, too large otherwise + /obj/item/melee/synthetic_arm_blade, // also too large otherwise + /obj/item/food/pizzaslice, // he's turning her into a papa john's + ) + /// Radial slice datums for every augment type + VAR_PRIVATE/list/cached_prosthetic_options + +/datum/surgery_operation/prosthetic_replacement/get_default_radial_image() + return image(/obj/item/bodypart/chest) + +/datum/surgery_operation/prosthetic_replacement/get_recommended_tool() + return "any limb / any item" + +/datum/surgery_operation/prosthetic_replacement/get_any_tool() + return "Any suitable arm replacement" + +/datum/surgery_operation/prosthetic_replacement/all_required_strings() + . = list() + . += "operate on chest (target chest)" + . += ..() + . += "when the chest is prepared, target the zone of the limb you are attaching" + +/datum/surgery_operation/prosthetic_replacement/any_required_strings() + return list("arms may receive any suitable item in lieu of a replacement limb") + ..() + +/datum/surgery_operation/prosthetic_replacement/get_radial_options(obj/item/bodypart/chest/chest, obj/item/tool, operating_zone) + var/datum/radial_menu_choice/option = LAZYACCESS(cached_prosthetic_options, tool.type) + if(!option) + option = new() + option.name = "attach [initial(tool.name)]" + option.info = "Replace the patient's missing limb with [initial(tool.name)]." + option.image = image(tool.type) + LAZYSET(cached_prosthetic_options, tool.type, option) + + return option + +/datum/surgery_operation/prosthetic_replacement/get_operation_target(mob/living/patient, body_zone) + // We always operate on the chest even if we're targeting left leg or w/e + return patient.get_bodypart(BODY_ZONE_CHEST) + +/datum/surgery_operation/prosthetic_replacement/has_surgery_state(obj/item/bodypart/chest/chest, state) + return LIMB_HAS_SURGERY_STATE(chest, state) + +/datum/surgery_operation/prosthetic_replacement/has_any_surgery_state(obj/item/bodypart/chest/chest, state) + return LIMB_HAS_ANY_SURGERY_STATE(chest, state) + +/datum/surgery_operation/prosthetic_replacement/get_patient(obj/item/bodypart/chest/chest) + return chest.owner + +/datum/surgery_operation/prosthetic_replacement/is_available(obj/item/bodypart/chest/chest, operated_zone) + var/real_operated_zone = deprecise_zone(operated_zone) + // Operate on the chest but target another zone + if(!HAS_TRAIT(chest, TRAIT_READY_TO_OPERATE) || real_operated_zone == BODY_ZONE_CHEST) + return FALSE + if(chest.owner.get_bodypart(real_operated_zone)) + return FALSE + return ..() + +/datum/surgery_operation/prosthetic_replacement/snowflake_check_availability(obj/item/bodypart/chest, mob/living/surgeon, obj/item/tool, operated_zone) + if(!surgeon.canUnEquip(tool)) + return FALSE + var/real_operated_zone = deprecise_zone(operated_zone) + // check bodyshape compatibility for real bodyparts + if(isbodypart(tool)) + var/obj/item/bodypart/new_limb = tool + if(real_operated_zone != new_limb.body_zone) + return FALSE + if(!new_limb.can_attach_limb(chest.owner)) + return FALSE + // arbitrary prosthetics can only be used on arms (for now) + else if(!(real_operated_zone in GLOB.arm_zones)) + return FALSE + return TRUE + +/datum/surgery_operation/prosthetic_replacement/tool_check(obj/item/tool) + if(tool.item_flags & (ABSTRACT|DROPDEL|HAND_ITEM)) + return FALSE + if(isbodypart(tool)) + return TRUE // auto pass - "intended" use case + if(is_type_in_list(tool, always_accepted_prosthetics)) + return TRUE // auto pass - soulful prosthetics + if(tool.w_class < WEIGHT_CLASS_NORMAL || tool.w_class > WEIGHT_CLASS_BULKY) + return FALSE // too large or too small items don't make sense as a limb replacement + if(HAS_TRAIT(tool, TRAIT_WIELDED)) + return FALSE + return TRUE + +/datum/surgery_operation/prosthetic_replacement/pre_preop(atom/movable/operating_on, mob/living/surgeon, tool, list/operation_args) + . = ..() + // always operate on absolute body zones + operation_args[OPERATION_TARGET_ZONE] = deprecise_zone(operation_args[OPERATION_TARGET_ZONE]) + +/datum/surgery_operation/prosthetic_replacement/on_preop(obj/item/bodypart/chest/chest, mob/living/surgeon, obj/item/tool, list/operation_args) + var/target_zone_readable = parse_zone(operation_args[OPERATION_TARGET_ZONE]) + display_results( + surgeon, + chest.owner, + span_notice("You begin to replace [chest.owner]'s missing [target_zone_readable] with [tool]..."), + span_notice("[surgeon] begins to replace [chest.owner]'s missing [target_zone_readable] with [tool]."), + span_notice("[surgeon] begins to replace [chest.owner]'s missing [target_zone_readable]."), + ) + display_pain(chest.owner, "You feel an uncomfortable sensation where your [target_zone_readable] should be!") + + operation_args[OPERATION_REJECTION_DAMAGE] = 10 + if(isbodypart(tool)) + var/obj/item/bodypart/new_limb = tool + if(IS_ROBOTIC_LIMB(new_limb)) + operation_args[OPERATION_REJECTION_DAMAGE] = 0 + else if(new_limb.check_for_frankenstein(chest.owner)) + operation_args[OPERATION_REJECTION_DAMAGE] = 30 + +/datum/surgery_operation/prosthetic_replacement/on_success(obj/item/bodypart/chest/chest, mob/living/surgeon, obj/item/tool, list/operation_args) + if(!surgeon.temporarilyRemoveItemFromInventory(tool)) + return // should never happen + if(operation_args[OPERATION_REJECTION_DAMAGE] > 0) + chest.owner.apply_damage(operation_args[OPERATION_REJECTION_DAMAGE], TOX) + if(isbodypart(tool)) + handle_bodypart(chest.owner, surgeon, tool) + return + handle_arbitrary_prosthetic(chest.owner, surgeon, tool, operation_args[OPERATION_TARGET_ZONE]) + +/datum/surgery_operation/prosthetic_replacement/proc/handle_bodypart(mob/living/carbon/patient, mob/living/surgeon, obj/item/bodypart/bodypart_to_attach) + bodypart_to_attach.try_attach_limb(patient) + if(bodypart_to_attach.check_for_frankenstein(patient)) + bodypart_to_attach.bodypart_flags |= BODYPART_IMPLANTED + display_results( + surgeon, patient, + span_notice("You succeed in replacing [patient]'s [bodypart_to_attach.plaintext_zone]."), + span_notice("[surgeon] successfully replaces [patient]'s [bodypart_to_attach.plaintext_zone] with [bodypart_to_attach]!"), + span_notice("[surgeon] successfully replaces [patient]'s [bodypart_to_attach.plaintext_zone]!"), + ) + display_pain(patient, "You feel synthetic sensation wash from your [bodypart_to_attach.plaintext_zone], which you can feel again!", TRUE) + +/datum/surgery_operation/prosthetic_replacement/proc/handle_arbitrary_prosthetic(mob/living/carbon/patient, mob/living/surgeon, obj/item/thing_to_attach, target_zone) + SSblackbox.record_feedback("tally", "arbitrary_prosthetic", 1, initial(thing_to_attach.name)) + var/obj/item/bodypart/new_limb = patient.make_item_prosthetic(thing_to_attach, target_zone, 80) + new_limb.add_surgical_state(SURGERY_PROSTHETIC_UNSECURED) + display_results( + surgeon, patient, + span_notice("You attach [thing_to_attach]."), + span_notice("[surgeon] finishes attaching [thing_to_attach]!"), + span_notice("[surgeon] finishes the attachment procedure!"), + ) + display_pain(patient, "You feel a strange sensation as [thing_to_attach] takes the place of your arm!", TRUE) + +#undef OPERATION_REJECTION_DAMAGE + +/datum/surgery_operation/limb/secure_arbitrary_prosthetic + name = "secure prosthetic" + desc = "Ensure that an arbitrary prosthetic is properly attached to a patient's body." + implements = list( + /obj/item/stack/medical/suture = 1, + /obj/item/stack/sticky_tape/surgical = 1.25, + /obj/item/stack/sticky_tape = 2, + ) + time = 4.8 SECONDS + operation_flags = OPERATION_SELF_OPERABLE | OPERATION_STANDING_ALLOWED + all_surgery_states_required = SURGERY_PROSTHETIC_UNSECURED + +/datum/surgery_operation/limb/secure_arbitrary_prosthetic/get_default_radial_image() + return image(/obj/item/stack/medical/suture) + +/datum/surgery_operation/limb/secure_arbitrary_prosthetic/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/stack/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to [tool.singular_name] [limb] to [limb.owner]'s body."), + span_notice("[surgeon] begins to [tool.singular_name] [limb] to [limb.owner]'s body."), + span_notice("[surgeon] begins to [tool.singular_name] something to [limb.owner]'s body."), + ) + var/obj/item/bodypart/chest = limb.owner.get_bodypart(BODY_ZONE_CHEST) + display_pain(limb.owner, "[surgeon] begins to [tool.singular_name] [limb] to your body!", IS_ROBOTIC_LIMB(chest)) + +/datum/surgery_operation/limb/secure_arbitrary_prosthetic/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/stack/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You finish [tool.apply_verb] [limb] to [limb.owner]'s body."), + span_notice("[surgeon] finishes [tool.apply_verb] [limb] to [limb.owner]'s body."), + span_notice("[surgeon] finishes the [tool.apply_verb] procedure!"), + ) + var/obj/item/bodypart/chest = limb.owner.get_bodypart(BODY_ZONE_CHEST) + display_pain(limb.owner, "You feel more secure as your prosthetic is firmly attached to your body!", IS_ROBOTIC_LIMB(chest)) + limb.remove_surgical_state(SURGERY_PROSTHETIC_UNSECURED) + limb.AddComponent(/datum/component/item_as_prosthetic_limb, null, 0) // updates drop probability to zero + tool.use(1) diff --git a/code/modules/surgery/operations/operation_amputation.dm b/code/modules/surgery/operations/operation_amputation.dm new file mode 100644 index 000000000000..48b7962c9ed3 --- /dev/null +++ b/code/modules/surgery/operations/operation_amputation.dm @@ -0,0 +1,115 @@ +/datum/surgery_operation/limb/amputate + name = "amputate limb" + rnd_name = "Disarticulation (Amputation)" + desc = "Sever a limb from a patient's body." + operation_flags = OPERATION_MORBID | OPERATION_AFFECTS_MOOD | OPERATION_NOTABLE + required_bodytype = ~(BODYTYPE_ROBOTIC|BODYTYPE_PEG) + implements = list( + /obj/item/shears = 0.33, + TOOL_SAW = 1, + TOOL_SCALPEL = 1, + /obj/item/melee/arm_blade = 1.25, + /obj/item/shovel/serrated = 1.33, + /obj/item/fireaxe = 2, + /obj/item/hatchet = 2.5, + /obj/item/knife/butcher = 4, + ) + time = 6.4 SECONDS + preop_sound = list( + /obj/item/circular_saw = 'sound/items/handling/surgery/saw.ogg', + /obj/item = 'sound/items/handling/surgery/scalpel1.ogg', + ) + success_sound = 'sound/items/handling/surgery/organ2.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_BONE_SAWED|SURGERY_VESSELS_CLAMPED + +/datum/surgery_operation/limb/amputate/get_recommended_tool() + return TOOL_SAW + +/datum/surgery_operation/limb/amputate/get_default_radial_image() + return image(/obj/item/shears) + +/datum/surgery_operation/limb/amputate/state_check(obj/item/bodypart/limb) + if(limb.body_zone == BODY_ZONE_CHEST) + return FALSE + if(limb.bodypart_flags & BODYPART_UNREMOVABLE) + return FALSE + if(HAS_TRAIT(limb.owner, TRAIT_NODISMEMBER)) + return FALSE + return TRUE + +/datum/surgery_operation/limb/amputate/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to sever [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to sever [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to sever [limb.owner]'s [limb.plaintext_zone] with [tool]."), + ) + display_pain(limb.owner, "You feel a gruesome pain in your [limb.plaintext_zone]'s joint!") + +/datum/surgery_operation/limb/amputate/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You successfully amputate [limb.owner]'s [limb.plaintext_zone]!"), + span_notice("[surgeon] successfully amputates [limb.owner]'s [limb.plaintext_zone]!"), + span_notice("[surgeon] finishes severing [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You can no longer feel your [limb.plaintext_zone]!") + if(HAS_MIND_TRAIT(surgeon, TRAIT_MORBID)) + surgeon.add_mood_event("morbid_dissection_success", /datum/mood_event/morbid_dissection_success) + limb.drop_limb() + +/datum/surgery_operation/limb/amputate/mechanic + name = "disassemble limb" + rnd_name = "Dissassembly (Amputation)" + required_bodytype = BODYTYPE_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC + implements = list( + /obj/item/shovel/giant_wrench = 0.33, + TOOL_WRENCH = 1, + TOOL_CROWBAR = 1, + TOOL_SCALPEL = 2, + TOOL_SAW = 2, + ) + time = 2 SECONDS //WAIT I NEED THAT!! + preop_sound = 'sound/items/tools/ratchet.ogg' + preop_sound = 'sound/machines/airlock/doorclick.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN + +/datum/surgery_operation/limb/amputate/mechanic/state_check(obj/item/bodypart/limb) + // added requirement for bone sawed to prevent accidental head removals. + return ..() && (limb.body_zone != BODY_ZONE_HEAD || LIMB_HAS_SURGERY_STATE(limb, SURGERY_BONE_SAWED)) + +/datum/surgery_operation/limb/amputate/mechanic/any_required_strings() + return ..() + list( + "if operating on the head, the bone MUST be sawed", + "otherwise, the state of the bone doesn't matter", + ) + +/datum/surgery_operation/limb/amputate/mechanic/get_recommended_tool() + return "[TOOL_WRENCH] / [TOOL_SAW]" + +/datum/surgery_operation/limb/amputate/pegleg + name = "detach wooden limb" + rnd_name = "Detach Wooden Limb (Amputation)" + required_bodytype = BODYTYPE_PEG + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC + implements = list( + TOOL_SAW = 1, + /obj/item/shovel/serrated = 1, + /obj/item/fireaxe = 1.15, + /obj/item/hatchet = 1.33, + TOOL_SCALPEL = 4, + ) + time = 3 SECONDS + preop_sound = list( + /obj/item/circular_saw = 'sound/items/handling/surgery/saw.ogg', + /obj/item = 'sound/items/weapons/bladeslice.ogg', + ) + success_sound = 'sound/items/handling/materials/wood_drop.ogg' + all_surgery_states_required = NONE + +/datum/surgery_operation/limb/amputate/pegleg/all_required_strings() + . = ..() + . += "the limb must be wooden" diff --git a/code/modules/surgery/operations/operation_asthma.dm b/code/modules/surgery/operations/operation_asthma.dm new file mode 100644 index 000000000000..427832b9659e --- /dev/null +++ b/code/modules/surgery/operations/operation_asthma.dm @@ -0,0 +1,72 @@ +/datum/surgery_operation/organ/asthmatic_bypass + name = "force open windpipe" + // google says the *actual* operation used to relieve asthma is called bronchial thermoplasty but this operation doesn't resemble that at all + // local doctors suggested "bronchial dilatation" instead + rnd_name = "Bronchial Dilatation (Asthmatic Bypass)" + desc = "Forcibly expand a patient's windpipe, relieving asthma symptoms." + operation_flags = OPERATION_PRIORITY_NEXT_STEP + implements = list( + TOOL_RETRACTOR = 1.25, + TOOL_WIRECUTTER = 2.25, + ) + time = 8 SECONDS + preop_sound = 'sound/items/handling/surgery/retractor1.ogg' + success_sound = 'sound/items/handling/surgery/retractor2.ogg' + target_type = /obj/item/organ/lungs + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_ORGANS_CUT + /// The amount of inflammation a failure or success of this surgery will reduce. + var/inflammation_reduction = 75 + +/datum/surgery_operation/organ/asthmatic_bypass/all_required_strings() + return list("the patient must be asthmatic") + ..() + +/datum/surgery_operation/organ/asthmatic_bypass/state_check(obj/item/organ/organ) + if(!organ.owner.has_quirk(/datum/quirk/item_quirk/asthma)) + return FALSE + return TRUE + +/datum/surgery_operation/organ/asthmatic_bypass/on_preop(obj/item/organ/lungs/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You begin to stretch [organ.owner]'s windpipe, trying your best to avoid nearby blood vessels..."), + span_notice("[surgeon] begins to stretch [organ.owner]'s windpipe, taking care to avoid any nearby blood vessels."), + span_notice("[surgeon] begins to stretch [organ.owner]'s windpipe."), + ) + display_pain(organ.owner, "You feel an agonizing stretching sensation in your neck!") + +/datum/surgery_operation/organ/asthmatic_bypass/on_success(obj/item/organ/lungs/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + var/datum/quirk/item_quirk/asthma/asthma = organ.owner.get_quirk(/datum/quirk/item_quirk/asthma) + if(isnull(asthma)) + return + + asthma.adjust_inflammation(-inflammation_reduction) + + display_results( + surgeon, + organ.owner, + span_notice("You stretch [organ.owner]'s windpipe with [tool], managing to avoid the nearby blood vessels."), + span_notice("[surgeon] succeeds at stretching [organ.owner]'s windpipe with [tool], avoiding the nearby blood vessels."), + span_notice("[surgeon] finishes stretching [organ.owner]'s windpipe.") + ) + +/datum/surgery_operation/organ/asthmatic_bypass/on_failure(obj/item/organ/lungs/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + var/datum/quirk/item_quirk/asthma/asthma = organ.owner.get_quirk(/datum/quirk/item_quirk/asthma) + if(isnull(asthma)) + return + + asthma.adjust_inflammation(-inflammation_reduction) + + display_results( + surgeon, + organ.owner, + span_warning("You stretch [organ.owner]'s windpipe with [tool], but accidentally clip a few arteries!"), + span_warning("[surgeon] succeeds at stretching [organ.owner]'s windpipe with [tool], but accidentally clips a few arteries!"), + span_warning("[surgeon] finishes stretching [organ.owner]'s windpipe, but screws up!"), + ) + + organ.owner.losebreath++ + + if(prob(30)) + organ.owner.cause_wound_of_type_and_severity(WOUND_SLASH, organ.bodypart_owner, WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_CRITICAL, WOUND_PICK_LOWEST_SEVERITY, tool) + organ.bodypart_owner.receive_damage(brute = 10, wound_bonus = tool.wound_bonus, sharpness = SHARP_EDGED, damage_source = tool) diff --git a/code/modules/surgery/operations/operation_autopsy.dm b/code/modules/surgery/operations/operation_autopsy.dm new file mode 100644 index 000000000000..ac0af85d6cbe --- /dev/null +++ b/code/modules/surgery/operations/operation_autopsy.dm @@ -0,0 +1,56 @@ +/datum/surgery_operation/limb/autopsy + name = "autopsy" + rnd_name = "Androtomy (Dissection and Autopsy)" + desc = "Perform a detailed analysis of a deceased patient's body." + implements = list(/obj/item/autopsy_scanner = 1) + time = 10 SECONDS + success_sound = 'sound/machines/printer.ogg' + required_bodytype = ~BODYTYPE_ROBOTIC + operation_flags = OPERATION_MORBID | OPERATION_IGNORE_CLOTHES + all_surgery_states_required = SURGERY_SKIN_OPEN + +/datum/surgery_operation/limb/autopsy/get_default_radial_image() + return image(/obj/item/autopsy_scanner) + +/datum/surgery_operation/limb/autopsy/all_required_strings() + . = list() + . += "operate on chest (target chest)" + . += ..() + . += "the patient must be deceased" + . += "the patient must not have been autopsied prior" + +/datum/surgery_operation/limb/autopsy/state_check(obj/item/bodypart/limb) + if(limb.body_zone != BODY_ZONE_CHEST) + return FALSE + if(limb.owner.stat != DEAD) + return FALSE + if(HAS_TRAIT_FROM(limb.owner, TRAIT_DISSECTED, AUTOPSY_TRAIT)) + return FALSE + return TRUE + +/datum/surgery_operation/limb/autopsy/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/autopsy_scanner/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin performing an autopsy on [limb.owner]..."), + span_notice("[surgeon] uses [tool] to perform an autopsy on [limb.owner]."), + span_notice("[surgeon] uses [tool] on [limb.owner]'s chest."), + ) + +/datum/surgery_operation/limb/autopsy/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/autopsy_scanner/tool, list/operation_args) + ADD_TRAIT(limb.owner, TRAIT_DISSECTED, AUTOPSY_TRAIT) + ADD_TRAIT(limb.owner, TRAIT_SURGICALLY_ANALYZED, AUTOPSY_TRAIT) + tool.scan_cadaver(surgeon, limb.owner) + var/obj/machinery/computer/operating/operating_computer = locate_operating_computer(limb) + if (!isnull(operating_computer)) + SEND_SIGNAL(operating_computer, COMSIG_OPERATING_COMPUTER_AUTOPSY_COMPLETE, limb.owner) + if(HAS_MIND_TRAIT(surgeon, TRAIT_MORBID)) + surgeon.add_mood_event("morbid_dissection_success", /datum/mood_event/morbid_dissection_success) + return ..() + +/datum/surgery_operation/limb/autopsy/mechanic + name = "system failure analysis" + rnd_name = "System Failure Analysis (Dissection and Autopsy)" + desc = "Perform a detailed analysis of a robotic patient's deactivated systems." + required_bodytype = BODYTYPE_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC diff --git a/code/modules/surgery/operations/operation_bioware.dm b/code/modules/surgery/operations/operation_bioware.dm new file mode 100644 index 000000000000..1ea6f7ea8209 --- /dev/null +++ b/code/modules/surgery/operations/operation_bioware.dm @@ -0,0 +1,341 @@ +/datum/surgery_operation/limb/bioware + abstract_type = /datum/surgery_operation/limb/bioware + implements = list( + IMPLEMENT_HAND = 1, + ) + operation_flags = OPERATION_AFFECTS_MOOD | OPERATION_NOTABLE | OPERATION_MORBID | OPERATION_LOCKED + required_bodytype = ~BODYTYPE_ROBOTIC + time = 12.5 SECONDS + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_BONE_SAWED|SURGERY_ORGANS_CUT + /// What status effect is gained when the surgery is successful? + /// Used to check against other bioware types to prevent stacking. + var/datum/status_effect/status_effect_gained = /datum/status_effect/bioware + /// Zone to operate on for this bioware + var/required_zone = BODY_ZONE_CHEST + +/datum/surgery_operation/limb/bioware/get_default_radial_image() + return image('icons/hud/implants.dmi', "lighting_bolt") + +/datum/surgery_operation/limb/bioware/all_required_strings() + return list("operate on [parse_zone(required_zone)] (target [parse_zone(required_zone)])") + ..() + +/datum/surgery_operation/limb/bioware/all_blocked_strings() + var/list/incompatible_surgeries = list() + for(var/datum/surgery_operation/limb/bioware/other_bioware as anything in subtypesof(/datum/surgery_operation/limb/bioware)) + if(other_bioware::status_effect_gained::id != status_effect_gained::id) + continue + if(other_bioware::required_bodytype != required_bodytype) + continue + incompatible_surgeries += (other_bioware.rnd_name || other_bioware.name) + + return ..() + list("the patient must not have undergone [english_list(incompatible_surgeries, and_text = " OR ")] prior") + +/datum/surgery_operation/limb/bioware/state_check(obj/item/bodypart/limb) + if(limb.body_zone != required_zone) + return FALSE + if(limb.owner.has_status_effect(status_effect_gained)) + return FALSE + return TRUE + +/datum/surgery_operation/limb/bioware/on_success(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + limb.owner.apply_status_effect(status_effect_gained) + if(limb.owner.ckey) + SSblackbox.record_feedback("tally", "bioware", 1, status_effect_gained) + +/datum/surgery_operation/limb/bioware/vein_threading + name = "thread veins" + rnd_name = "Symvasculodesis (Vein Threading)" // "together vessel fusion" + desc = "Weave a patient's veins into a reinforced mesh, reducing blood loss from injuries." + status_effect_gained = /datum/status_effect/bioware/heart/threaded_veins + +/datum/surgery_operation/limb/bioware/vein_threading/on_preop(obj/item/bodypart/limb, mob/living/surgeon, tool) + display_results( + surgeon, + limb.owner, + span_notice("You start weaving [limb.owner]'s blood vessels."), + span_notice("[surgeon] starts weaving [limb.owner]'s blood vessels."), + span_notice("[surgeon] starts manipulating [limb.owner]'s blood vessels."), + ) + display_pain(limb.owner, "Your entire body burns in agony!") + +/datum/surgery_operation/limb/bioware/vein_threading/on_success(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + . = ..() + display_results( + surgeon, + limb.owner, + span_notice("You weave [limb.owner]'s blood vessels into a resistant mesh!"), + span_notice("[surgeon] weaves [limb.owner]'s blood vessels into a resistant mesh!"), + span_notice("[surgeon] finishes manipulating [limb.owner]'s blood vessels."), + ) + display_pain(limb.owner, "You can feel your blood pumping through reinforced veins!") + +/datum/surgery_operation/limb/bioware/vein_threading/mechanic + rnd_name = "Hydraulics Routing Optimization (Threaded Veins)" + desc = "Optimize the routing of a robotic patient's hydraulic system, reducing fluid loss from leaks." + required_bodytype = BODYTYPE_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC + +/datum/surgery_operation/limb/bioware/muscled_veins + name = "muscled veins" + rnd_name = "Myovasculoplasty (Muscled Veins)" // "muscle vessel reshaping" + desc = "Add a muscled membrane to a patient's veins, allowing them to pump blood without a heart." + status_effect_gained = /datum/status_effect/bioware/heart/muscled_veins + +/datum/surgery_operation/limb/bioware/muscled_veins/on_preop(obj/item/bodypart/limb, mob/living/surgeon, tool) + display_results( + surgeon, + limb.owner, + span_notice("You start wrapping muscles around [limb.owner]'s blood vessels."), + span_notice("[surgeon] starts wrapping muscles around [limb.owner]'s blood vessels."), + span_notice("[surgeon] starts manipulating [limb.owner]'s blood vessels."), + ) + display_pain(limb.owner, "Your entire body burns in agony!") + +/datum/surgery_operation/limb/bioware/muscled_veins/on_success(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + . = ..() + display_results( + surgeon, + limb.owner, + span_notice("You reshape [limb.owner]'s blood vessels, adding a muscled membrane!"), + span_notice("[surgeon] reshapes [limb.owner]'s blood vessels, adding a muscled membrane!"), + span_notice("[surgeon] finishes manipulating [limb.owner]'s blood vessels."), + ) + display_pain(limb.owner, "You can feel your heartbeat's powerful pulses ripple through your body!") + +/datum/surgery_operation/limb/bioware/muscled_veins/mechanic + rnd_name = "Hydraulics Redundancy Subroutine (Muscled Veins)" + desc = "Add redundancies to a robotic patient's hydraulic system, allowing it to pump fluids without an engine or pump." + required_bodytype = BODYTYPE_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC + +/datum/surgery_operation/limb/bioware/nerve_splicing + name = "splice nerves" + rnd_name = "Symneurodesis (Spliced Nerves)" // "together nerve fusion" + desc = "Splice a patient's nerves together to make them more resistant to stuns." + time = 15.5 SECONDS + status_effect_gained = /datum/status_effect/bioware/nerves/spliced + +/datum/surgery_operation/limb/bioware/nerve_splicing/on_preop(obj/item/bodypart/limb, mob/living/surgeon, tool) + display_results( + surgeon, + limb.owner, + span_notice("You start splicing together [limb.owner]'s nerves."), + span_notice("[surgeon] starts splicing together [limb.owner]'s nerves."), + span_notice("[surgeon] starts manipulating [limb.owner]'s nervous system."), + ) + display_pain(limb.owner, "Your entire body goes numb!") + +/datum/surgery_operation/limb/bioware/nerve_splicing/on_success(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + . = ..() + display_results( + surgeon, + limb.owner, + span_notice("You successfully splice [limb.owner]'s nervous system!"), + span_notice("[surgeon] successfully splices [limb.owner]'s nervous system!"), + span_notice("[surgeon] finishes manipulating [limb.owner]'s nervous system."), + ) + display_pain(limb.owner, "You regain feeling in your body; It feels like everything's happening around you in slow motion!") + +/datum/surgery_operation/limb/bioware/nerve_splicing/mechanic + rnd_name = "System Automatic Reset Subroutine (Spliced Nerves)" + desc = "Upgrade a robotic patient's automatic systems, allowing it to better resist stuns." + required_bodytype = BODYTYPE_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC + +/datum/surgery_operation/limb/bioware/nerve_grounding + name = "ground nerves" + rnd_name = "Xanthoneuroplasty (Grounded Nerves)" // "yellow nerve reshaping". see: yellow gloves + desc = "Reroute a patient's nerves to act as grounding rods, protecting them from electrical shocks." + time = 15.5 SECONDS + status_effect_gained = /datum/status_effect/bioware/nerves/grounded + +/datum/surgery_operation/limb/bioware/nerve_grounding/on_preop(obj/item/bodypart/limb, mob/living/surgeon, tool) + display_results( + surgeon, + limb.owner, + span_notice("You start rerouting [limb.owner]'s nerves."), + span_notice("[surgeon] starts rerouting [limb.owner]'s nerves."), + span_notice("[surgeon] starts manipulating [limb.owner]'s nervous system."), + ) + display_pain(limb.owner, "Your entire body goes numb!") + +/datum/surgery_operation/limb/bioware/nerve_grounding/on_success(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + . = ..() + display_results( + surgeon, + limb.owner, + span_notice("You successfully reroute [limb.owner]'s nervous system!"), + span_notice("[surgeon] successfully reroutes [limb.owner]'s nervous system!"), + span_notice("[surgeon] finishes manipulating [limb.owner]'s nervous system."), + ) + display_pain(limb.owner, "You regain feeling in your body! You feel energized!") + +/datum/surgery_operation/limb/bioware/nerve_grounding/mechanic + rnd_name = "System Shock Dampening (Grounded Nerves)" + desc = "Install grounding rods into a robotic patient's nervous system, protecting it from electrical shocks." + required_bodytype = BODYTYPE_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC + +/datum/surgery_operation/limb/bioware/ligament_hook + name = "reshape ligaments" + rnd_name = "Arthroplasty (Ligament Hooks)" // "joint reshaping" + desc = "Reshape a patient's ligaments to allow limbs to be manually reattached if severed - at the cost of making them easier to detach." + status_effect_gained = /datum/status_effect/bioware/ligaments/hooked + +/datum/surgery_operation/limb/bioware/ligament_hook/on_preop(obj/item/bodypart/limb, mob/living/surgeon, tool) + display_results( + surgeon, + limb.owner, + span_notice("You start reshaping [limb.owner]'s ligaments into a hook-like shape."), + span_notice("[surgeon] starts reshaping [limb.owner]'s ligaments into a hook-like shape."), + span_notice("[surgeon] starts manipulating [limb.owner]'s ligaments."), + ) + display_pain(limb.owner, "Your limbs burn with severe pain!") + +/datum/surgery_operation/limb/bioware/ligament_hook/on_success(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + . = ..() + display_results( + surgeon, + limb.owner, + span_notice("You reshape [limb.owner]'s ligaments into a connective hook!"), + span_notice("[surgeon] reshapes [limb.owner]'s ligaments into a connective hook!"), + span_notice("[surgeon] finishes manipulating [limb.owner]'s ligaments."), + ) + display_pain(limb.owner, "Your limbs feel... strangely loose.") + +/datum/surgery_operation/limb/bioware/ligament_hook/mechanic + rnd_name = "Anchor Point Snaplocks (Ligament Hooks)" + desc = "Refactor a robotic patient's limb joints to allow for rapid deatchment, allowing limbs to be manually reattached if severed - \ + at the cost of making them easier to detach as well." + required_bodytype = BODYTYPE_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC + +/datum/surgery_operation/limb/bioware/ligament_reinforcement + name = "strengthen ligaments" + rnd_name = "Arthrorrhaphy (Ligament Reinforcement)" // "joint strengthening" / "joint stitching" + desc = "Strengthen a patient's ligaments to make dismemberment more difficult, at the cost of making nerve connections easier to interrupt." + status_effect_gained = /datum/status_effect/bioware/ligaments/reinforced + +/datum/surgery_operation/limb/bioware/ligament_reinforcement/on_preop(obj/item/bodypart/limb, mob/living/surgeon, tool) + display_results( + surgeon, + limb.owner, + span_notice("You start reinforcing [limb.owner]'s ligaments."), + span_notice("[surgeon] starts reinforcing [limb.owner]'s ligaments."), + span_notice("[surgeon] starts manipulating [limb.owner]'s ligaments."), + ) + display_pain(limb.owner, "Your limbs burn with severe pain!") + +/datum/surgery_operation/limb/bioware/ligament_reinforcement/on_success(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + . = ..() + display_results( + surgeon, + limb.owner, + span_notice("You reinforce [limb.owner]'s ligaments!"), + span_notice("[surgeon] reinforces [limb.owner]'s ligaments!"), + span_notice("[surgeon] finishes manipulating [limb.owner]'s ligaments."), + ) + display_pain(limb.owner, "Your limbs feel more secure, but also more frail.") + +/datum/surgery_operation/limb/bioware/ligament_reinforcement/mechanic + rnd_name = "Anchor Point Reinforcement (Ligament Reinforcement)" + desc = "Reinforce a robotic patient's limb joints to prevent dismemberment, at the cost of making nerve connections easier to interrupt." + required_bodytype = BODYTYPE_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC + +/datum/surgery_operation/limb/bioware/cortex_folding + name = "cortex folding" + rnd_name = "Encephalofractoplasty (Cortex Folding)" // it's a stretch - "brain fractal reshaping" + desc = "A biological upgrade which folds a patient's cerebral cortex into a fractal pattern, increasing neural density and flexibility." + status_effect_gained = /datum/status_effect/bioware/cortex/folded + required_zone = BODY_ZONE_HEAD + +/datum/surgery_operation/limb/bioware/cortex_folding/on_preop(obj/item/bodypart/limb, mob/living/surgeon, tool) + display_results( + surgeon, + limb.owner, + span_notice("You start folding [limb.owner]'s cerebral cortex."), + span_notice("[surgeon] starts folding [limb.owner]'s cerebral cortex."), + span_notice("[surgeon] starts performing surgery on [limb.owner]'s brain."), + ) + display_pain(limb.owner, "Your head throbs with gruesome pain, it's nearly too much to handle!") + +/datum/surgery_operation/limb/bioware/cortex_folding/on_success(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + . = ..() + display_results( + surgeon, + limb.owner, + span_notice("You fold [limb.owner]'s cerebral cortex into a fractal pattern!"), + span_notice("[surgeon] folds [limb.owner]'s cerebral cortex into a fractal pattern!"), + span_notice("[surgeon] completes the surgery on [limb.owner]'s brain."), + ) + display_pain(limb.owner, "Your brain feels stronger... and more flexible!") + +/datum/surgery_operation/limb/bioware/cortex_folding/on_failure(obj/item/bodypart/limb, mob/living/surgeon, tool) + if(!limb.owner.get_organ_slot(ORGAN_SLOT_BRAIN)) + return ..() + display_results( + surgeon, + limb.owner, + span_warning("You screw up, damaging the brain!"), + span_warning("[surgeon] screws up, damaging the brain!"), + span_notice("[surgeon] completes the surgery on [limb.owner]'s brain."), + ) + display_pain(limb.owner, "Your head throbs with excruciating pain!") + limb.owner.adjust_organ_loss(ORGAN_SLOT_BRAIN, 60) + limb.owner.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY) + +/datum/surgery_operation/limb/bioware/cortex_folding/mechanic + rnd_name = "Wetware OS Labyrinthian Programming (Cortex Folding)" + desc = "Reprogram a robotic patient's neural network in a downright eldritch programming language, giving space to non-standard neural patterns." + required_bodytype = BODYTYPE_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC + +/datum/surgery_operation/limb/bioware/cortex_imprint + name = "cortex imprinting" + rnd_name = "Encephalopremoplasty (Cortex Imprinting)" // it's a stretch - "brain print reshaping" + desc = "A biological upgrade which carves a patient's cerebral cortex into a self-imprinting pattern, increasing neural density and resilience." + status_effect_gained = /datum/status_effect/bioware/cortex/imprinted + required_zone = BODY_ZONE_HEAD + +/datum/surgery_operation/limb/bioware/cortex_imprint/on_preop(obj/item/bodypart/limb, mob/living/surgeon, tool) + display_results( + surgeon, + limb.owner, + span_notice("You start carving [limb.owner]'s outer cerebral cortex into a self-imprinting pattern."), + span_notice("[surgeon] starts carving [limb.owner]'s outer cerebral cortex into a self-imprinting pattern."), + span_notice("[surgeon] starts performing surgery on [limb.owner]'s brain."), + ) + display_pain(limb.owner, "Your head throbs with gruesome pain, it's nearly too much to handle!") + +/datum/surgery_operation/limb/bioware/cortex_imprint/on_success(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + . = ..() + display_results( + surgeon, + limb.owner, + span_notice("You reshape [limb.owner]'s outer cerebral cortex into a self-imprinting pattern!"), + span_notice("[surgeon] reshapes [limb.owner]'s outer cerebral cortex into a self-imprinting pattern!"), + span_notice("[surgeon] completes the surgery on [limb.owner]'s brain."), + ) + display_pain(limb.owner, "Your brain feels stronger... and more resilient!") + +/datum/surgery_operation/limb/bioware/cortex_imprint/on_failure(obj/item/bodypart/limb, mob/living/surgeon, tool) + if(!limb.owner.get_organ_slot(ORGAN_SLOT_BRAIN)) + return ..() + display_results( + surgeon, + limb.owner, + span_warning("You screw up, damaging the brain!"), + span_warning("[surgeon] screws up, damaging the brain!"), + span_notice("[surgeon] completes the surgery on [limb.owner]'s brain."), + ) + display_pain(limb.owner, "Your brain throbs with intense pain; Thinking hurts!") + limb.owner.adjust_organ_loss(ORGAN_SLOT_BRAIN, 60) + limb.owner.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY) + +/datum/surgery_operation/limb/bioware/cortex_imprint/mechanic + rnd_name = "Wetware OS Ver 2.0 (Cortex Imprinting)" + desc = "Update a robotic patient's operating system to a \"newer version\", improving overall performance and resilience. \ + Shame about all the adware." + required_bodytype = BODYTYPE_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC diff --git a/code/modules/surgery/operations/operation_bone_repair.dm b/code/modules/surgery/operations/operation_bone_repair.dm new file mode 100644 index 000000000000..47ec6dbf44f5 --- /dev/null +++ b/code/modules/surgery/operations/operation_bone_repair.dm @@ -0,0 +1,225 @@ +/datum/surgery_operation/limb/repair_hairline + name = "repair hairline fracture" + desc = "Mend a hairline fracture in a patient's bone." + operation_flags = OPERATION_PRIORITY_NEXT_STEP + implements = list( + TOOL_BONESET = 1, + /obj/item/stack/medical/bone_gel = 1, + /obj/item/stack/sticky_tape/surgical = 1, + /obj/item/stack/sticky_tape/super = 2, + /obj/item/stack/sticky_tape = 3.33, + ) + time = 4 SECONDS + any_surgery_states_required = ALL_SURGERY_SKIN_STATES + +/datum/surgery_operation/limb/repair_hairline/get_default_radial_image() + return image(/obj/item/bonesetter) + +/datum/surgery_operation/limb/repair_hairline/all_required_strings() + return list("the limb must have a hairline fracture") + ..() + +/datum/surgery_operation/limb/repair_hairline/state_check(obj/item/bodypart/limb) + if(!(locate(/datum/wound/blunt/bone/severe) in limb.wounds)) + return FALSE + return TRUE + +/datum/surgery_operation/limb/repair_hairline/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to repair the fracture in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to repair the fracture in [limb.owner]'s [limb.plaintext_zone] with [tool]."), + span_notice("[surgeon] begins to repair the fracture in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "Your [limb.plaintext_zone] aches with pain!") + +/datum/surgery_operation/limb/repair_hairline/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + var/datum/wound/blunt/bone/fracture = locate() in limb.wounds + qdel(fracture) + + display_results( + surgeon, + limb.owner, + span_notice("You successfully repair the fracture in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] successfully repairs the fracture in [limb.owner]'s [limb.plaintext_zone] with [tool]!"), + span_notice("[surgeon] successfully repairs the fracture in [limb.owner]'s [limb.plaintext_zone]!"), + ) + +/datum/surgery_operation/limb/reset_compound + name = "reset compound fracture" + desc = "Reset a compound fracture in a patient's bone, preparing it for proper healing." + operation_flags = OPERATION_PRIORITY_NEXT_STEP + implements = list( + TOOL_BONESET = 1, + /obj/item/stack/sticky_tape/surgical = 1.66, + /obj/item/stack/sticky_tape/super = 2.5, + /obj/item/stack/sticky_tape = 5, + ) + time = 6 SECONDS + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED + +/datum/surgery_operation/limb/reset_compound/get_default_radial_image() + return image(/obj/item/bonesetter) + +/datum/surgery_operation/limb/reset_compound/all_required_strings() + return list("the limb must have a compound fracture") + ..() + +/datum/surgery_operation/limb/reset_compound/state_check(obj/item/bodypart/limb) + var/datum/wound/blunt/bone/critical/fracture = locate() in limb.wounds + if(isnull(fracture) || fracture.reset) + return FALSE + return TRUE + +/datum/surgery_operation/limb/reset_compound/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to reset the bone in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to reset the bone in [limb.owner]'s [limb.plaintext_zone] with [tool]."), + span_notice("[surgeon] begins to reset the bone in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "The aching pain in your [limb.plaintext_zone] is overwhelming!") + +/datum/surgery_operation/limb/reset_compound/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + var/datum/wound/blunt/bone/critical/fracture = locate() in limb.wounds + fracture?.reset = TRUE + + display_results( + surgeon, + limb.owner, + span_notice("You successfully reset the bone in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] successfully resets the bone in [limb.owner]'s [limb.plaintext_zone] with [tool]!"), + span_notice("[surgeon] successfully resets the bone in [limb.owner]'s [limb.plaintext_zone]!"), + ) + +/datum/surgery_operation/limb/repair_compound + name = "repair compound fracture" + desc = "Mend a compound fracture in a patient's bone." + operation_flags = OPERATION_PRIORITY_NEXT_STEP + implements = list( + /obj/item/stack/medical/bone_gel = 1, + /obj/item/stack/sticky_tape/surgical = 1, + /obj/item/stack/sticky_tape/super = 2, + /obj/item/stack/sticky_tape = 3.33, + ) + time = 4 SECONDS + any_surgery_states_required = ALL_SURGERY_SKIN_STATES + +/datum/surgery_operation/limb/repair_compound/get_default_radial_image() + return image(/obj/item/stack/medical/bone_gel) + +/datum/surgery_operation/limb/repair_compound/all_required_strings() + return list("the limb's compound fracture has been reset") + ..() + +/datum/surgery_operation/limb/repair_compound/state_check(obj/item/bodypart/limb) + var/datum/wound/blunt/bone/critical/fracture = locate() in limb.wounds + if(isnull(fracture) || !fracture.reset) + return FALSE + return TRUE + +/datum/surgery_operation/limb/repair_compound/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to repair the fracture in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to repair the fracture in [limb.owner]'s [limb.plaintext_zone] with [tool]."), + span_notice("[surgeon] begins to repair the fracture in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "The aching pain in your [limb.plaintext_zone] is overwhelming!") + +/datum/surgery_operation/limb/repair_compound/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + var/datum/wound/blunt/bone/critical/fracture = locate() in limb.wounds + qdel(fracture) + display_results( + surgeon, + limb.owner, + span_notice("You successfully repair the fracture in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] successfully repairs the fracture in [limb.owner]'s [limb.plaintext_zone] with [tool]!"), + span_notice("[surgeon] successfully repairs the fracture in [limb.owner]'s [limb.plaintext_zone]!"), + ) + +/datum/surgery_operation/limb/prepare_cranium_repair + name = "discard skull debris" + desc = "Clear away bone fragments and debris from a patient's cranial fissure in preparation for repair." + operation_flags = OPERATION_PRIORITY_NEXT_STEP + implements = list( + TOOL_HEMOSTAT = 1, + TOOL_WIRECUTTER = 2.5, + TOOL_SCREWDRIVER = 2.5, + ) + time = 2.4 SECONDS + preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' + +/datum/surgery_operation/limb/prepare_cranium_repair/get_default_radial_image() + return image(/obj/item/hemostat) + +/datum/surgery_operation/limb/prepare_cranium_repair/all_required_strings() + return list("the cranium must be fractured") + ..() + +/datum/surgery_operation/limb/prepare_cranium_repair/state_check(obj/item/bodypart/limb) + var/datum/wound/cranial_fissure/fissure = locate() in limb.wounds + if(isnull(fissure) || fissure.prepped) + return FALSE + return TRUE + +/datum/surgery_operation/limb/prepare_cranium_repair/on_preop(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to discard the smaller skull debris in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to discard the smaller skull debris in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to poke around in [limb.owner]'s [limb.plaintext_zone]..."), + ) + display_pain(limb.owner, "Your brain feels like it's getting stabbed by little shards of glass!") + +/datum/surgery_operation/limb/prepare_cranium_repair/on_success(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + . = ..() + var/datum/wound/cranial_fissure/fissure = locate() in limb.wounds + fissure?.prepped = TRUE + +/datum/surgery_operation/limb/repair_cranium + name = "repair cranium" + desc = "Mend a cranial fissure in a patient's skull." + operation_flags = OPERATION_PRIORITY_NEXT_STEP + implements = list( + /obj/item/stack/medical/bone_gel = 1, + /obj/item/stack/sticky_tape/surgical = 1, + /obj/item/stack/sticky_tape/super = 2, + /obj/item/stack/sticky_tape = 3.33, + ) + time = 4 SECONDS + +/datum/surgery_operation/limb/repair_cranium/get_default_radial_image() + return image(/obj/item/stack/medical/bone_gel) + +/datum/surgery_operation/limb/repair_cranium/all_required_strings() + return list("the debris has been cleared from the cranial fissure") + ..() + +/datum/surgery_operation/limb/repair_cranium/state_check(obj/item/bodypart/limb) + var/datum/wound/cranial_fissure/fissure = locate() in limb.wounds + if(isnull(fissure) || !fissure.prepped) + return FALSE + return TRUE + +/datum/surgery_operation/limb/repair_cranium/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to repair [limb.owner]'s skull as best you can..."), + span_notice("[surgeon] begins to repair [limb.owner]'s skull with [tool]."), + span_notice("[surgeon] begins to repair [limb.owner]'s skull."), + ) + + display_pain(limb.owner, "You can feel pieces of your skull rubbing against your brain!") + +/datum/surgery_operation/limb/repair_cranium/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + var/datum/wound/cranial_fissure/fissure = locate() in limb.wounds + qdel(fissure) + + display_results( + surgeon, + limb.owner, + span_notice("You successfully repair [limb.owner]'s skull."), + span_notice("[surgeon] successfully repairs [limb.owner]'s skull with [tool]."), + span_notice("[surgeon] successfully repairs [limb.owner]'s skull.") + ) diff --git a/code/modules/surgery/operations/operation_brainwash.dm b/code/modules/surgery/operations/operation_brainwash.dm new file mode 100644 index 000000000000..eece83b31423 --- /dev/null +++ b/code/modules/surgery/operations/operation_brainwash.dm @@ -0,0 +1,150 @@ +#define OPERATION_OBJECTIVE "objective" + +/datum/surgery_operation/organ/brainwash + name = "brainwash" + desc = "Implant a directive into the patient's brain, making it their absolute priority." + rnd_name = "Neural Brainwashing (Brainwash)" + rnd_desc = "A surgical procedure which directly implants a directive into the patient's brain, \ + making it their absolute priority. It can be cleared using a mindshield implant." + implements = list( + TOOL_HEMOSTAT = 1.15, + TOOL_WIRECUTTER = 2, + /obj/item/stack/package_wrap = 2.85, + /obj/item/stack/cable_coil = 6.67, + ) + time = 20 SECONDS + preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' + success_sound = 'sound/items/handling/surgery/hemostat1.ogg' + failure_sound = 'sound/items/handling/surgery/organ2.ogg' + operation_flags = OPERATION_MORBID | OPERATION_NOTABLE | OPERATION_LOCKED + target_type = /obj/item/organ/brain + required_organ_flag = ORGAN_TYPE_FLAGS & ~ORGAN_ROBOTIC + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_ORGANS_CUT|SURGERY_BONE_SAWED + +/datum/surgery_operation/organ/brainwash/get_default_radial_image() + return image(/atom/movable/screen/alert/hypnosis::overlay_icon, /atom/movable/screen/alert/hypnosis::overlay_state) + +/datum/surgery_operation/organ/brainwash/pre_preop(obj/item/organ/brain/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + operation_args[OPERATION_OBJECTIVE] = tgui_input_text(surgeon, "Choose the objective to imprint on your patient's brain", "Brainwashing", max_length = MAX_MESSAGE_LEN) + return !!operation_args[OPERATION_OBJECTIVE] + +/datum/surgery_operation/organ/brainwash/on_preop(obj/item/organ/brain/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You begin to brainwash [organ.owner]..."), + span_notice("[surgeon] begins to fix [organ.owner]'s brain."), + span_notice("[surgeon] begins to perform surgery on [organ.owner]'s brain."), + ) + display_pain(organ.owner, "Your head pounds with unimaginable pain!") // Same message as other brain surgeries + +/datum/surgery_operation/organ/brainwash/on_success(obj/item/organ/brain/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + if(!organ.owner.mind) + to_chat(surgeon, span_warning("[organ.owner] doesn't respond to the brainwashing, as if [organ.owner.p_they()] lacked a mind...")) + return ..() + if(HAS_MIND_TRAIT(organ.owner, TRAIT_UNCONVERTABLE)) + to_chat(surgeon, span_warning("[organ.owner] seems resistant to the brainwashing...")) + return ..() + + display_results( + surgeon, + organ.owner, + span_notice("You successfully brainwash [organ.owner]!"), + span_notice("[surgeon] successfully brainwashes [organ.owner]!"), + span_notice("[surgeon] finishes performing surgery on [organ.owner]'s brain."), + ) + on_brainwash(organ.owner, surgeon, tool, operation_args) + +/datum/surgery_operation/organ/brainwash/proc/on_brainwash(mob/living/carbon/brainwashed, mob/living/surgeon, obj/item/tool, list/operation_args) + var/objective = operation_args[OPERATION_OBJECTIVE] || "Oooo no objective set somehow report this to an admin" + to_chat(brainwashed, span_notice("A new thought forms in your mind: '[objective]'")) + brainwash(brainwashed, objective) + message_admins("[ADMIN_LOOKUPFLW(surgeon)] surgically brainwashed [ADMIN_LOOKUPFLW(brainwashed)] with the objective '[objective]'.") + surgeon.log_message("has brainwashed [key_name(brainwashed)] with the objective '[objective]' using brainwashing surgery.", LOG_ATTACK) + brainwashed.log_message("has been brainwashed with the objective '[objective]' by [key_name(surgeon)] using brainwashing surgery.", LOG_VICTIM, log_globally=FALSE) + surgeon.log_message("surgically brainwashed [key_name(brainwashed)] with the objective '[objective]'.", LOG_GAME) + +/datum/surgery_operation/organ/brainwash/on_failure(obj/item/organ/brain/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You screw up, bruising the brain's tissue!"), + span_notice("[surgeon] screws up, causing brain damage!"), + span_notice("[surgeon] completes the surgery on [organ.owner]'s brain."), + ) + display_pain(organ.owner, "Your head throbs with horrible pain!") + organ.owner.adjust_organ_loss(ORGAN_SLOT_BRAIN, 40) + +/datum/surgery_operation/organ/brainwash/mechanic + name = "reprogram" + rnd_name = "Neural Reprogramming (Brainwash)" + rnd_desc = "Install malware which directly implants a directive into the robotic patient's operating system, \ + making it their absolute priority. It can be cleared using a mindshield implant." + implements = list( + TOOL_MULTITOOL = 1.15, + TOOL_HEMOSTAT = 2, + TOOL_WIRECUTTER = 2, + /obj/item/stack/package_wrap = 2.85, + /obj/item/stack/cable_coil = 6.67, + ) + preop_sound = 'sound/items/taperecorder/tape_flip.ogg' + success_sound = 'sound/items/taperecorder/taperecorder_close.ogg' + required_organ_flag = ORGAN_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC + +/datum/surgery_operation/organ/brainwash/sleeper + name = "install sleeper agent directive" + rnd_name = "Sleeper Agent Implantation (Brainwash)" + preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' + success_sound = 'sound/items/handling/surgery/hemostat1.ogg' + failure_sound = 'sound/items/handling/surgery/organ2.ogg' + + var/list/possible_objectives = list( + "You love the Syndicate.", + "Do not trust Nanotrasen.", + "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.", + "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_operation/organ/brainwash/sleeper/pre_preop(obj/item/organ/brain/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + operation_args[OPERATION_OBJECTIVE] = pick(possible_objectives) + return TRUE + +/datum/surgery_operation/organ/brainwash/sleeper/on_preop(obj/item/organ/brain/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You begin to brainwash [organ.owner]..."), + span_notice("[surgeon] begins to fix [organ.owner]'s brain."), + span_notice("[surgeon] begins to perform surgery on [organ.owner]'s brain."), + ) + display_pain(organ.owner, "Your head pounds with unimaginable pain!") // Same message as other brain surgeries + +/datum/surgery_operation/organ/brainwash/sleeper/on_brainwash(mob/living/carbon/brainwashed, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + brainwashed.gain_trauma(new /datum/brain_trauma/mild/phobia/conspiracies(), TRAUMA_RESILIENCE_LOBOTOMY) + +/datum/surgery_operation/organ/brainwash/sleeper/mechanic + name = "install sleeper agent programming" + rnd_name = "Sleeper Agent Programming (Brainwash)" + implements = list( + TOOL_MULTITOOL = 1.15, + TOOL_HEMOSTAT = 2, + TOOL_WIRECUTTER = 2, + /obj/item/stack/package_wrap = 2.85, + /obj/item/stack/cable_coil = 6.67, + ) + preop_sound = 'sound/items/taperecorder/tape_flip.ogg' + success_sound = 'sound/items/taperecorder/taperecorder_close.ogg' + required_organ_flag = ORGAN_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC + +#undef OPERATION_OBJECTIVE diff --git a/code/modules/surgery/operations/operation_cavity_implant.dm b/code/modules/surgery/operations/operation_cavity_implant.dm new file mode 100644 index 000000000000..8c54a19eed18 --- /dev/null +++ b/code/modules/surgery/operations/operation_cavity_implant.dm @@ -0,0 +1,194 @@ +/datum/surgery_operation/limb/prepare_cavity + name = "widen chest cavity" + desc = "Widen a patient's chest cavity to allow for implanting of larger items." + implements = list( + TOOL_RETRACTOR = 1, + TOOL_CROWBAR = 1.5, + ) + time = 4.8 SECONDS + preop_sound = 'sound/items/handling/surgery/retractor1.ogg' + success_sound = 'sound/items/handling/surgery/retractor2.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_ORGANS_CUT + any_surgery_states_blocked = SURGERY_CAVITY_WIDENED + +/datum/surgery_operation/limb/prepare_cavity/get_default_radial_image() + return image(/obj/item/retractor) + +/datum/surgery_operation/limb/prepare_cavity/all_required_strings() + return list("operate on chest (target chest)") + ..() + +/datum/surgery_operation/limb/prepare_cavity/state_check(obj/item/bodypart/chest/limb) + return limb.body_zone == BODY_ZONE_CHEST + +/datum/surgery_operation/limb/prepare_cavity/on_preop(obj/item/bodypart/chest/limb, mob/living/surgeon, tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to open [limb.owner]'s [limb.plaintext_zone] cavity wide..."), + span_notice("[surgeon] begins to open [limb.owner]'s [limb.plaintext_zone] cavity wide."), + span_notice("[surgeon] begins to open [limb.owner]'s [limb.plaintext_zone] cavity wide."), + ) + display_pain(limb.owner, "You can feel pressure as your [limb.plaintext_zone] is being opened wide!") + +/datum/surgery_operation/limb/prepare_cavity/on_success(obj/item/bodypart/chest/limb, mob/living/surgeon, tool, list/operation_args) + . = ..() + limb.add_surgical_state(SURGERY_CAVITY_WIDENED) + +/datum/surgery_operation/limb/cavity_implant + name = "cavity implant" + desc = "Implant an item into a patient's body cavity." + operation_flags = OPERATION_NOTABLE + implements = list( + /obj/item = 1, + ) + time = 3.2 SECONDS + preop_sound = 'sound/items/handling/surgery/organ1.ogg' + success_sound = 'sound/items/handling/surgery/organ2.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_ORGANS_CUT|SURGERY_CAVITY_WIDENED + /// Items that bypass normal size restrictions for cavity implantation + var/list/heavy_cavity_implants + +/datum/surgery_operation/limb/cavity_implant/New() + . = ..() + heavy_cavity_implants = typecacheof(list( + /obj/item/transfer_valve, + )) + +/datum/surgery_operation/limb/cavity_implant/all_required_strings() + return list("operate on chest (target chest)") + ..() + +/datum/surgery_operation/limb/cavity_implant/get_default_radial_image() + return image('icons/hud/screen_gen.dmi', "arrow_large_still") + +/datum/surgery_operation/limb/cavity_implant/state_check(obj/item/bodypart/chest/limb) + if(limb.body_zone != BODY_ZONE_CHEST) + return FALSE + if(!isnull(limb.cavity_item)) + return FALSE + return TRUE + +/datum/surgery_operation/limb/cavity_implant/snowflake_check_availability(obj/item/bodypart/chest/limb, mob/living/surgeon, obj/item/tool, operated_zone) + if(!surgeon.canUnEquip(tool)) + return FALSE + // Stops accidentally putting a tool you meant to operate with + // Besides who really wants to put a scalpel or a wrench inside someone that's lame + if(IS_ROBOTIC_LIMB(limb) && (tool.tool_behaviour in GLOB.all_mechanical_tools)) + return FALSE + if(IS_ORGANIC_LIMB(limb) && (tool.tool_behaviour in GLOB.all_surgical_tools)) + return FALSE + return TRUE + +/datum/surgery_operation/limb/cavity_implant/tool_check(obj/item/tool) + if(tool.w_class > WEIGHT_CLASS_NORMAL && !is_type_in_typecache(tool, heavy_cavity_implants)) + return FALSE + if(tool.item_flags & (ABSTRACT|DROPDEL|HAND_ITEM)) + return FALSE + if(isorgan(tool)) + return FALSE // use organ manipulation + return TRUE + +/datum/surgery_operation/limb/cavity_implant/on_preop(obj/item/bodypart/chest/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to insert [tool] into [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to insert [tool] into [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to insert [tool.w_class > WEIGHT_CLASS_SMALL ? tool : "something"] into [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You can feel something being inserted into your [limb.plaintext_zone], it hurts like hell!") + +/datum/surgery_operation/limb/cavity_implant/on_success(obj/item/bodypart/chest/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + if (!surgeon.transferItemToLoc(tool, limb.owner, force = TRUE)) // shouldn't fail but just in case + display_results( + surgeon, + limb.owner, + span_warning("You can't seem to fit [tool] in [limb.owner]'s [limb.plaintext_zone]!"), + span_warning("[surgeon] can't seem to fit [tool] in [limb.owner]'s [limb.plaintext_zone]!"), + span_warning("[surgeon] can't seem to fit [tool.w_class > WEIGHT_CLASS_SMALL ? tool : "something"] in [limb.owner]'s [limb.plaintext_zone]!"), + ) + return + + limb.cavity_item = tool + limb.remove_surgical_state(SURGERY_CAVITY_WIDENED) + display_results( + surgeon, + limb.owner, + span_notice("You stuff [tool] into [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] stuffs [tool] into [limb.owner]'s [limb.plaintext_zone]!"), + span_notice("[surgeon] stuffs [tool.w_class > WEIGHT_CLASS_SMALL ? tool : "something"] into [limb.owner]'s [limb.plaintext_zone]."), + ) + + +/datum/surgery_operation/limb/undo_cavity_implant + name = "remove cavity implant" + desc = "Remove an item from a body cavity." + implements = list( + IMPLEMENT_HAND = 1, + TOOL_HEMOSTAT = 2, + TOOL_CROWBAR = 2.5, + /obj/item/kitchen/fork = 5, + ) + + time = 3.2 SECONDS + preop_sound = 'sound/items/handling/surgery/organ1.ogg' + success_sound = 'sound/items/handling/surgery/organ2.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_ORGANS_CUT|SURGERY_CAVITY_WIDENED + +/datum/surgery_operation/limb/undo_cavity_implant/all_required_strings() + return list("operate on chest (target chest)") + ..() + +/datum/surgery_operation/limb/undo_cavity_implant/get_default_radial_image() + return image('icons/hud/screen_gen.dmi', "arrow_large_still") + +/datum/surgery_operation/limb/undo_cavity_implant/get_radial_options(obj/item/bodypart/chest/limb, obj/item/tool, operating_zone) + // Not bothering to cache this as the chance of hitting the same cavity item in the same round is rather low + var/datum/radial_menu_choice/option = new() + option.name = "remove [limb.cavity_item]" + option.info = "Replace the [limb.cavity_item] embededd in the patient's chest cavity." + option.image = get_generic_limb_radial_image(BODY_ZONE_CHEST) + option.image.overlays += add_radial_overlays(limb.cavity_item) + return option + +/datum/surgery_operation/limb/undo_cavity_implant/state_check(obj/item/bodypart/chest/limb) + if(limb.body_zone != BODY_ZONE_CHEST) + return FALSE + // unlike implant removal, don't show the surgery as an option unless something is actually implanted + // it would stand to reason standard implants would be hidden from view (requires a search) + // while cavity implants would be blatantly visible (no search necessary) + if(isnull(limb.cavity_item)) + return FALSE + return TRUE + +/datum/surgery_operation/limb/undo_cavity_implant/on_preop(obj/item/bodypart/chest/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to extract [limb.cavity_item] from [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to extract [limb.cavity_item] from [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to extract something from [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel a serious pain in your [limb.plaintext_zone]!") + +/datum/surgery_operation/limb/undo_cavity_implant/on_success(obj/item/bodypart/chest/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + if(isnull(limb.cavity_item)) // something else could have removed it mid surgery? + display_results( + surgeon, + limb.owner, + span_warning("You find nothing to remove from [limb.owner]'s [limb.plaintext_zone]."), + span_warning("[surgeon] finds nothing to remove from [limb.owner]'s [limb.plaintext_zone]."), + span_warning("[surgeon] finds nothing to remove from [limb.owner]'s [limb.plaintext_zone]."), + ) + return + + var/obj/item/implant = limb.cavity_item + limb.cavity_item = null + limb.remove_surgical_state(SURGERY_CAVITY_WIDENED) + display_results( + surgeon, + limb.owner, + span_notice("You pull [implant] out of [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] pulls [implant] out of [limb.owner]'s [limb.plaintext_zone]!"), + span_notice("[surgeon] pulls something out of [limb.owner]'s [limb.plaintext_zone]!"), + ) + display_pain(limb.owner, "You can feel [implant.name] being pulled out of you!") + surgeon.put_in_hands(implant) diff --git a/code/modules/surgery/operations/operation_core.dm b/code/modules/surgery/operations/operation_core.dm new file mode 100644 index 000000000000..78175d11ff51 --- /dev/null +++ b/code/modules/surgery/operations/operation_core.dm @@ -0,0 +1,43 @@ +/datum/surgery_operation/basic/core_removal + name = "extract core" + rnd_name = "Corectomy (Extract Core)" // source: i made it up + desc = "Remove the core from a slime." + implements = list( + TOOL_HEMOSTAT = 1, + TOOL_CROWBAR = 1, + ) + time = 1.6 SECONDS + operation_flags = OPERATION_IGNORE_CLOTHES | OPERATION_STANDING_ALLOWED + any_surgery_states_required = ALL_SURGERY_SKIN_STATES + required_biotype = NONE + +/datum/surgery_operation/basic/core_removal/get_default_radial_image() + return image(/mob/living/basic/slime) + +/datum/surgery_operation/basic/core_removal/all_required_strings() + return list("operate on a deceased slime") + ..() + +/datum/surgery_operation/basic/core_removal/state_check(mob/living/patient) + return isslime(patient) && patient.stat == DEAD + +/datum/surgery_operation/basic/core_removal/on_preop(mob/living/basic/slime/patient, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + patient, + span_notice("You begin to extract [patient]'s core..."), + span_notice("[surgeon] begins to extract [patient]'s core."), + span_notice("[surgeon] begins to extract [patient]'s core."), + ) + +/datum/surgery_operation/basic/core_removal/on_success(mob/living/basic/slime/patient, mob/living/surgeon, obj/item/tool, list/operation_args) + var/core_count = patient.cores + if(core_count && patient.try_extract_cores(count = core_count)) + display_results( + surgeon, + patient, + span_notice("You successfully extract [core_count] core\s from [patient]."), + span_notice("[surgeon] successfully extracts [core_count] core\s from [patient]!"), + span_notice("[surgeon] successfully extracts [core_count] core\s from [patient]!"), + ) + else + to_chat(surgeon, span_warning("There aren't any cores left in [patient]!")) diff --git a/code/modules/surgery/operations/operation_debride.dm b/code/modules/surgery/operations/operation_debride.dm new file mode 100644 index 000000000000..5283a836af81 --- /dev/null +++ b/code/modules/surgery/operations/operation_debride.dm @@ -0,0 +1,86 @@ +/datum/surgery_operation/limb/debride + name = "debride infected flesh" + rnd_name = "Debridement" + desc = "Remove infected or necrotic flesh from a patient's wound to promote healing." + implements = list( + TOOL_HEMOSTAT = 1, + TOOL_SCALPEL = 1.25, + TOOL_SAW = 1.66, + TOOL_WIRECUTTER = 2.5, + ) + time = 3 SECONDS + operation_flags = OPERATION_AFFECTS_MOOD | OPERATION_LOOPING | OPERATION_PRIORITY_NEXT_STEP + preop_sound = list( + TOOL_SCALPEL = 'sound/items/handling/surgery/scalpel1.ogg', + TOOL_HEMOSTAT = 'sound/items/handling/surgery/hemostat1.ogg', + ) + success_sound = 'sound/items/handling/surgery/retractor2.ogg' + failure_sound = 'sound/items/handling/surgery/organ1.ogg' + + /// How much infestation is removed per step (positive number) + var/infestation_removed = 4 + /// How much sanitization is added per step + var/sanitization_added = 0.5 // just enough to stop infestation from worsening + +/datum/surgery_operation/limb/debride/get_default_radial_image() + return image(/obj/item/reagent_containers/applicator/patch/aiuri) + +/datum/surgery_operation/limb/debride/all_required_strings() + return list("the limb must have a second degree or worse burn") + ..() + +/datum/surgery_operation/limb/debride/state_check(obj/item/bodypart/limb) + var/datum/wound/burn/flesh/wound = locate() in limb.wounds + return wound?.infection > 0 + +/// To give the surgeon a heads up how much work they have ahead of them +/datum/surgery_operation/limb/debride/proc/get_progress(datum/wound/burn/flesh/wound) + if(wound?.infection <= 0) + return null + + var/estimated_remaining_steps = wound.infection / infestation_removed + var/progress_text + + switch(estimated_remaining_steps) + if(-INFINITY to 1) + return null + if(1 to 2) + progress_text = ", preparing to remove the last remaining bits of infection" + if(2 to 4) + progress_text = ", steadily narrowing the remaining bits of infection" + if(5 to INFINITY) + progress_text = ", though there's still quite a lot to excise" + + return progress_text + +/datum/surgery_operation/limb/debride/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to excise infected flesh from [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to excise infected flesh from [limb.owner]'s [limb.plaintext_zone] with [tool]."), + span_notice("[surgeon] begins to excise infected flesh from [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "The infection in your [limb.plaintext_zone] stings like hell! It feels like you're being stabbed!") + +/datum/surgery_operation/limb/debride/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args, default_display_results = FALSE) + limb.receive_damage(3, wound_bonus = CANT_WOUND, sharpness = tool.get_sharpness(), damage_source = tool) + var/datum/wound/burn/flesh/wound = locate() in limb.wounds + wound?.infection -= infestation_removed + wound?.sanitization += sanitization_added + display_results( + surgeon, + limb.owner, + span_notice("You successfully excise some of the infected flesh from [limb.owner]'s [limb.plaintext_zone][get_progress(wound)]."), + span_notice("[surgeon] successfully excises some of the infected flesh from [limb.owner]'s [limb.plaintext_zone] with [tool]!"), + span_notice("[surgeon] successfully excises some of the infected flesh from [limb.owner]'s [limb.plaintext_zone]!"), + ) + +/datum/surgery_operation/limb/debride/on_failure(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You carve away some of the healthy flesh from [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] carves away some of the healthy flesh from [limb.owner]'s [limb.plaintext_zone] with [tool]!"), + span_notice("[surgeon] carves away some of the healthy flesh from [limb.owner]'s [limb.plaintext_zone]!"), + ) + limb.receive_damage(rand(4, 8), wound_bonus = CANT_WOUND, sharpness = tool.get_sharpness(), damage_source = tool) diff --git a/code/modules/surgery/operations/operation_dental.dm b/code/modules/surgery/operations/operation_dental.dm new file mode 100644 index 000000000000..a572520a6baf --- /dev/null +++ b/code/modules/surgery/operations/operation_dental.dm @@ -0,0 +1,141 @@ +/datum/surgery_operation/limb/add_dental_implant + name = "add dental implant" + desc = "Implant a pill into a patient's teeth." + implements = list( + /obj/item/reagent_containers/applicator/pill = 1, + ) + time = 1.6 SECONDS + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED|SURGERY_BONE_DRILLED + +/datum/surgery_operation/limb/add_dental_implant/all_required_strings() + . = list() + . += "operate on mouth (target mouth)" + . += ..() + . += "the mouth must have teeth" + +/datum/surgery_operation/limb/add_dental_implant/get_default_radial_image() + return image('icons/hud/implants.dmi', "reagents") + +/datum/surgery_operation/limb/add_dental_implant/snowflake_check_availability(atom/movable/operating_on, mob/living/surgeon, tool, operated_zone) + return ..() && surgeon.canUnEquip(tool) && operated_zone == BODY_ZONE_PRECISE_MOUTH + +/datum/surgery_operation/limb/add_dental_implant/state_check(obj/item/bodypart/head/limb) + var/obj/item/bodypart/head/teeth_receptangle = limb + if(!istype(teeth_receptangle)) + return FALSE + if(teeth_receptangle.teeth_count <= 0) + return FALSE + var/count = 0 + for(var/obj/item/reagent_containers/applicator/pill/dental in limb) + count++ + if(count >= teeth_receptangle.teeth_count) + return FALSE + return TRUE + +/datum/surgery_operation/limb/add_dental_implant/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to wedge [tool] in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to wedge \the [tool] in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to wedge something in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "Something's being jammed into your [limb.plaintext_zone]!") + +/datum/surgery_operation/limb/add_dental_implant/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + // Pills go into head + surgeon.transferItemToLoc(tool, limb, TRUE) + + var/datum/action/item_action/activate_pill/pill_action = new(tool) + pill_action.name = "Activate [tool.name]" + pill_action.build_all_button_icons() + pill_action.Grant(limb.owner) //The pill never actually goes in an inventory slot, so the owner doesn't inherit actions from it + + display_results( + surgeon, + limb.owner, + span_notice("You wedge [tool] into [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] wedges [tool] into [limb.owner]'s [limb.plaintext_zone]!"), + span_notice("[surgeon] wedges something into [limb.owner]'s [limb.plaintext_zone]!"), + ) + +/datum/surgery_operation/limb/remove_dental_implant + name = "remove dental implant" + desc = "Remove a dental implant from a patient's teeth." + implements = list( + TOOL_HEMOSTAT = 1, + IMPLEMENT_HAND = 1, + ) + time = 3.2 SECONDS + all_surgery_states_required = SURGERY_BONE_DRILLED|SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED + +/datum/surgery_operation/limb/remove_dental_implant/get_default_radial_image() + return image(/obj/item/reagent_containers/applicator/pill) + +/datum/surgery_operation/limb/remove_dental_implant/snowflake_check_availability(atom/movable/operating_on, mob/living/surgeon, tool, operated_zone) + return ..() && operated_zone == BODY_ZONE_PRECISE_MOUTH + +/datum/surgery_operation/limb/remove_dental_implant/get_time_modifiers(atom/movable/operating_on, mob/living/surgeon, tool) + . = ..() + for(var/obj/item/flashlight/light in surgeon) + if(light.light_on) // Hey I can see a better! + . *= 0.8 + +/datum/surgery_operation/limb/remove_dental_implant/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin looking in [limb.owner]'s mouth for dental implants..."), + span_notice("[surgeon] begins to look in [limb.owner]'s mouth."), + span_notice("[surgeon] begins to examine [limb.owner]'s teeth."), + ) + display_pain(limb.owner, "You feel fingers poke around at your teeth.") + +/datum/surgery_operation/limb/remove_dental_implant/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + var/list/pills = list() + for(var/obj/item/reagent_containers/applicator/pill/dental in limb) + pills += dental + if(!length(pills)) + display_results( + surgeon, + limb.owner, + span_notice("You don't find any dental implants in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] doesn't find any dental implants in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] finishes examining [limb.owner]'s [limb.plaintext_zone]."), + ) + return + + var/obj/item/reagent_containers/applicator/pill/yoinked = pick(pills) + for(var/datum/action/item_action/activate_pill/associated_action in limb.owner.actions) + if(associated_action.target == yoinked) + qdel(associated_action) + + surgeon.put_in_hands(yoinked) + display_results( + surgeon, + limb.owner, + span_notice("You carefully remove [yoinked] from [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] carefully removes [yoinked] from [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] carefully removes something from [limb.owner]'s [limb.plaintext_zone]."), + ) + +// Teeth pill code +/datum/action/item_action/activate_pill + name = "Activate Pill" + check_flags = NONE + +/datum/action/item_action/activate_pill/IsAvailable(feedback) + if(owner.stat > SOFT_CRIT) + return FALSE + return ..() + +/datum/action/item_action/activate_pill/do_effect(trigger_flags) + owner.balloon_alert_to_viewers("[owner] grinds their teeth!", "you grit your teeth") + if(!do_after(owner, owner.stat * (2.5 SECONDS), owner, IGNORE_USER_LOC_CHANGE | IGNORE_INCAPACITATED)) + return FALSE + var/obj/item/pill = target + to_chat(owner, span_notice("You grit your teeth and burst the implanted [pill.name]!")) + owner.log_message("swallowed an implanted pill, [pill]", LOG_ATTACK) + pill.reagents.trans_to(owner, pill.reagents.total_volume, transferred_by = owner, methods = INGEST) + qdel(pill) + return TRUE diff --git a/code/modules/surgery/operations/operation_dissection.dm b/code/modules/surgery/operations/operation_dissection.dm new file mode 100644 index 000000000000..1756d536e023 --- /dev/null +++ b/code/modules/surgery/operations/operation_dissection.dm @@ -0,0 +1,151 @@ +/datum/surgery_operation/basic/dissection + name = "experimental dissection" + rnd_name = "Experimental Androtomy (Experimental Dissection and Autopsy)" + desc = "Perform an experimental dissection on a patient to obtain research points." + rnd_desc = "An experimental surgical procedure that dissects bodies in exchange for research points at ancient R&D consoles." + implements = list( + /obj/item/autopsy_scanner = 1, + TOOL_SCALPEL = 1.66, + TOOL_KNIFE = 5, + /obj/item/shard = 10, + ) + time = 12 SECONDS + operation_flags = OPERATION_LOCKED | OPERATION_ALWAYS_FAILABLE | OPERATION_MORBID | OPERATION_IGNORE_CLOTHES + required_biotype = NONE + any_surgery_states_required = ALL_SURGERY_SKIN_STATES + +/datum/surgery_operation/basic/dissection/get_default_radial_image() + return image(/obj/item/paper) + +/datum/surgery_operation/basic/dissection/all_required_strings() + . += ..() + . += "the patient must be deceased" + . += "the patient must not have been dissected prior" + +/datum/surgery_operation/basic/dissection/state_check(mob/living/patient) + return !HAS_TRAIT_FROM(patient, TRAIT_DISSECTED, EXPERIMENTAL_SURGERY_TRAIT) && patient.stat == DEAD + +/datum/surgery_operation/basic/dissection/on_preop(mob/living/patient, mob/living/surgeon, tool, list/operation_args) + display_results( + surgeon, + patient, + span_notice("You begin to dissect [patient]..."), + span_notice("[surgeon] begins to dissect [patient]."), + span_notice("[surgeon] begins to dissect [patient]."), + ) + +/datum/surgery_operation/basic/dissection/on_failure(mob/living/patient, mob/living/surgeon, tool, list/operation_args) + var/points_earned = round(check_value(patient) * 0.01) + display_results( + surgeon, + patient, + span_warning("You dissect [patient], but don't find anything particularly interesting."), + span_warning("[surgeon] dissects [patient]."), + span_warning("[surgeon] dissects [patient]."), + ) + give_paper(surgeon, points_earned) + patient.apply_damage(80, BRUTE, BODY_ZONE_CHEST) + ADD_TRAIT(patient, TRAIT_DISSECTED, EXPERIMENTAL_SURGERY_TRAIT) + +/datum/surgery_operation/basic/dissection/on_success(mob/living/patient, mob/living/surgeon, tool, list/operation_args) + var/points_earned = check_value(patient) + display_results( + surgeon, + patient, + span_warning("You dissect [patient], discovering [points_earned] point\s of data!"), + span_warning("[surgeon] dissects [patient]."), + span_warning("[surgeon] dissects [patient]."), + ) + give_paper(surgeon, points_earned) + patient.apply_damage(80, BRUTE, BODY_ZONE_CHEST) + ADD_TRAIT(patient, TRAIT_DISSECTED, EXPERIMENTAL_SURGERY_TRAIT) + +/datum/surgery_operation/basic/dissection/proc/give_paper(mob/living/surgeon, points) + var/obj/item/research_notes/the_dossier = new /obj/item/research_notes(surgeon.loc, points, "biology") + if(!surgeon.put_in_hands(the_dossier) && istype(surgeon.get_inactive_held_item(), /obj/item/research_notes)) + var/obj/item/research_notes/hand_dossier = surgeon.get_inactive_held_item() + hand_dossier.merge(the_dossier) + +///Calculates how many research points dissecting 'target' is worth. +/datum/surgery_operation/basic/dissection/proc/check_value(mob/living/target) + var/reward = 10 + + if(ishuman(target)) + var/mob/living/carbon/human/human_target = target + if(human_target.dna?.species) + if(ismonkey(human_target)) + reward /= 5 + else if(isabductor(human_target)) + reward *= 4 + else if(isgolem(human_target) || iszombie(human_target)) + reward *= 3 + else if(isjellyperson(human_target) || ispodperson(human_target)) + reward *= 2 + else if(isalienroyal(target)) + reward *= 10 + else if(isalienadult(target)) + reward *= 5 + else + reward /= 6 + + return 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, list/modifiers, list/attack_modifiers) + 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/operations/operation_filter.dm b/code/modules/surgery/operations/operation_filter.dm new file mode 100644 index 000000000000..539f43b8755c --- /dev/null +++ b/code/modules/surgery/operations/operation_filter.dm @@ -0,0 +1,78 @@ +/datum/surgery_operation/limb/filter_blood + name = "blood filtration" + rnd_name = "Hemodialysis (Blood Filtration)" + desc = "Remove unwanted chemicals from a patient's bloodstream." + implements = list(/obj/item/blood_filter = 1) + time = 2.5 SECONDS + operation_flags = OPERATION_LOOPING + required_bodytype = ~BODYTYPE_ROBOTIC + success_sound = 'sound/machines/card_slide.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED + +/datum/surgery_operation/limb/filter_blood/all_required_strings() + . = list() + . += "operate on chest (target chest)" + . += ..() + . += "the patient must not be husked" + +/datum/surgery_operation/limb/filter_blood/get_default_radial_image() + return image(/obj/item/blood_filter) + +/datum/surgery_operation/limb/filter_blood/state_check(obj/item/bodypart/limb) + return limb.body_zone == BODY_ZONE_CHEST && !HAS_TRAIT(limb.owner, TRAIT_HUSK) + +/datum/surgery_operation/limb/filter_blood/can_loop(mob/living/patient, obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + return ..() && has_filterable_chems(limb.owner, tool) + +/datum/surgery_operation/limb/filter_blood/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + display_pain(limb.owner, "You feel a throbbing pain in your chest!") + +/datum/surgery_operation/limb/filter_blood/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + var/obj/item/blood_filter/bloodfilter = tool + for(var/datum/reagent/chem as anything in limb.owner.reagents?.reagent_list) + if(!length(bloodfilter.whitelist) || !(chem.type in bloodfilter.whitelist)) + limb.owner.reagents.remove_reagent(chem.type, clamp(round(chem.volume * 0.22, 0.2), 0.4, 10)) + + display_results( + surgeon, + limb.owner, + span_notice("[tool] completes a cycle filtering [limb.owner]'s blood."), + span_notice("[tool] whirrs as it filters [limb.owner]'s blood."), + span_notice("[tool] whirrs as it pumps."), + ) + + if(surgeon.is_holding_item_of_type(/obj/item/healthanalyzer)) + chemscan(surgeon, limb.owner) + +/datum/surgery_operation/limb/filter_blood/on_failure(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_warning("You screw up, bruising [limb.owner]'s chest!"), + span_warning("[surgeon] screws up, bruising [limb.owner]'s chest!"), + span_warning("[surgeon] screws up!"), + ) + limb.receive_damage(5, damage_source = tool) + +/datum/surgery_operation/limb/filter_blood/proc/has_filterable_chems(mob/living/carbon/target, obj/item/blood_filter/bloodfilter) + if(!length(target.reagents?.reagent_list)) + bloodfilter.audible_message(span_notice("[bloodfilter] pings as it reports no chemicals detected in [target]'s blood.")) + playsound(target, 'sound/machines/ping.ogg', 75, TRUE, falloff_exponent = 12, falloff_distance = 1) + return FALSE + + if(!length(bloodfilter.whitelist)) + return TRUE + + for(var/datum/reagent/chem as anything in target.reagents.reagent_list) + if(chem.type in bloodfilter.whitelist) + return TRUE + + return FALSE + +/datum/surgery_operation/limb/filter_blood/mechanic + name = "purge hydraulics" + rnd_name = "Hydraulics Purge (Blood Filtration)" + required_bodytype = BODYTYPE_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC diff --git a/code/modules/surgery/operations/operation_generic.dm b/code/modules/surgery/operations/operation_generic.dm new file mode 100644 index 000000000000..762761ab7c6f --- /dev/null +++ b/code/modules/surgery/operations/operation_generic.dm @@ -0,0 +1,504 @@ +// Basic operations for moving back and forth between surgery states +/// First step of every surgery, makes an incision in the skin +/datum/surgery_operation/limb/incise_skin + name = "make skin incision" + // rnd_name = "Laparotomy / Craniotomy / Myotomy (Make Incision)" // Maybe we keep this one simple + desc = "Make an incision in the patient's skin to access internal organs. \ + Causes \"cut skin\" surgical state." + required_bodytype = ~BODYTYPE_ROBOTIC + replaced_by = /datum/surgery_operation/limb/incise_skin/abductor + implements = list( + TOOL_SCALPEL = 1, + /obj/item/melee/energy/sword = 1.33, + /obj/item/knife = 1.5, + /obj/item/shard = 2.25, + /obj/item/screwdriver = 5, + /obj/item/pen = 5, + /obj/item = 3.33, + ) + time = 1.6 SECONDS + preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' + success_sound = 'sound/items/handling/surgery/scalpel2.ogg' + operation_flags = OPERATION_AFFECTS_MOOD + any_surgery_states_blocked = ALL_SURGERY_SKIN_STATES + /// We can't cut mobs with this biostate + var/biostate_blacklist = BIO_CHITIN + +/datum/surgery_operation/limb/incise_skin/get_any_tool() + return "Any sharp edged item" + +/datum/surgery_operation/limb/incise_skin/get_default_radial_image() + return image(/obj/item/scalpel) + +/datum/surgery_operation/limb/incise_skin/tool_check(obj/item/tool) + // Require edged sharpness OR a tool behavior match + if((tool.get_sharpness() & SHARP_EDGED) || implements[tool.tool_behaviour]) + return TRUE + // these are here by popular demand, even though they don't fit the above criteria + if(istype(tool, /obj/item/pen) || istype(tool, /obj/item/screwdriver)) + return TRUE + return FALSE + +/datum/surgery_operation/limb/incise_skin/state_check(obj/item/bodypart/limb) + return !(limb.biological_state & biostate_blacklist) + +/datum/surgery_operation/limb/incise_skin/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to make an incision in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to make an incision in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to make an incision in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel a stabbing in your [limb.plaintext_zone].") + +/datum/surgery_operation/limb/incise_skin/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() // default success message + limb.add_surgical_state(SURGERY_SKIN_CUT|SURGERY_VESSELS_UNCLAMPED) // ouch, cuts the vessels + if(!limb.can_bleed()) + return + + var/blood_name = limb.owner.get_bloodtype()?.get_blood_name() || "Blood" + display_results( + surgeon, + limb.owner, + span_notice("[blood_name] pools around the incision in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[blood_name] pools around the incision in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[blood_name] pools around the incision in [limb.owner]'s [limb.plaintext_zone]."), + ) + +/// Subtype for thick skinned creatures (Xenomorphs) +/datum/surgery_operation/limb/incise_skin/thick + name = "make thick skin incision" + implements = list( + TOOL_SAW = 1, + /obj/item/melee/energy/sword = 1.25, + /obj/item/fireaxe = 1.5, + /obj/item/knife/butcher = 2.5, + /obj/item = 5, + ) + biostate_blacklist = BIO_FLESH|BIO_METAL + +/datum/surgery_operation/limb/incise_skin/thick/get_any_tool() + return "Any sharp edged item with decent force" + +/datum/surgery_operation/limb/incise_skin/thick/tool_check(obj/item/tool) + return ..() && tool.force >= 10 + +/datum/surgery_operation/limb/incise_skin/abductor + operation_flags = parent_type::operation_flags | OPERATION_IGNORE_CLOTHES | OPERATION_LOCKED | OPERATION_NO_WIKI + required_bodytype = NONE + biostate_blacklist = NONE // they got laser scalpels + +/// Pulls the skin back to access internals +/datum/surgery_operation/limb/retract_skin + name = "retract skin" + desc = "Retract the patient's skin to access their internal organs. \ + Causes \"skin open\" surgical state." + required_bodytype = ~BODYTYPE_ROBOTIC + replaced_by = /datum/surgery_operation/limb/retract_skin/abductor + implements = list( + TOOL_RETRACTOR = 1, + TOOL_SCREWDRIVER = 2.25, + TOOL_WIRECUTTER = 2.85, + /obj/item/stack/rods = 2.85, + ) + time = 2.4 SECONDS + preop_sound = 'sound/items/handling/surgery/retractor1.ogg' + success_sound = 'sound/items/handling/surgery/retractor2.ogg' + all_surgery_states_required = SURGERY_SKIN_CUT + +/datum/surgery_operation/limb/retract_skin/get_default_radial_image() + return image(/obj/item/retractor) + +/datum/surgery_operation/limb/retract_skin/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to retract the skin in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to retract the skin in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to retract the skin in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel a severe stinging pain spreading across your [limb.plaintext_zone] as the skin is pulled back.") + +/datum/surgery_operation/limb/retract_skin/on_success(obj/item/bodypart/limb) + . = ..() + limb.add_surgical_state(SURGERY_SKIN_OPEN) + limb.remove_surgical_state(SURGERY_SKIN_CUT) + +/datum/surgery_operation/limb/retract_skin/abductor + operation_flags = parent_type::operation_flags | OPERATION_IGNORE_CLOTHES | OPERATION_LOCKED | OPERATION_NO_WIKI + required_bodytype = NONE + +/// Closes the skin +/datum/surgery_operation/limb/close_skin + name = "mend skin incision" + desc = "Mend the incision in the patient's skin, closing it up. \ + Clears most surgical states." + required_bodytype = ~BODYTYPE_ROBOTIC + replaced_by = /datum/surgery_operation/limb/close_skin/abductor + implements = list( + TOOL_CAUTERY = 1, + /obj/item/stack/medical/suture = 1, + /obj/item/gun/energy/laser = 1.15, + TOOL_WELDER = 1.5, + /obj/item = 3.33, + ) + time = 2.4 SECONDS + preop_sound = list( + /obj/item/stack/medical/suture = SFX_SUTURE_BEGIN, + /obj/item = 'sound/items/handling/surgery/cautery1.ogg', + ) + success_sound = list( + /obj/item/stack/medical/suture = SFX_SUTURE_END, + /obj/item = 'sound/items/handling/surgery/cautery2.ogg', + ) + any_surgery_states_required = ALL_SURGERY_SKIN_STATES + +/datum/surgery_operation/limb/close_skin/get_any_tool() + return "Any heat source" + +/datum/surgery_operation/limb/close_skin/get_default_radial_image() + return image(/obj/item/cautery) + +/datum/surgery_operation/limb/close_skin/all_required_strings() + return ..() + list("the limb must have skin") + +/datum/surgery_operation/limb/close_skin/state_check(obj/item/bodypart/limb) + return LIMB_HAS_SKIN(limb) + +/datum/surgery_operation/limb/close_skin/tool_check(obj/item/tool) + if(istype(tool, /obj/item/stack/medical/suture)) + return TRUE + + if(istype(tool, /obj/item/gun/energy/laser)) + var/obj/item/gun/energy/laser/lasergun = tool + return lasergun.cell?.charge > 0 + + return tool.get_temperature() > 0 + +/datum/surgery_operation/limb/close_skin/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to mend the incision in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to mend the incision in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to mend the incision in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "Your [limb.plaintext_zone] is being [istype(tool, /obj/item/stack/medical/suture) ? "pinched" : "burned"]!") + +/datum/surgery_operation/limb/close_skin/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + if(LIMB_HAS_SURGERY_STATE(limb, SURGERY_BONE_SAWED)) + limb.heal_damage(40) + limb.remove_surgical_state(ALL_SURGERY_STATES_UNSET_ON_CLOSE) + +/datum/surgery_operation/limb/close_skin/abductor + operation_flags = parent_type::operation_flags | OPERATION_IGNORE_CLOTHES | OPERATION_LOCKED | OPERATION_NO_WIKI + required_bodytype = NONE + +/// Clamps bleeding blood vessels to prevent blood loss +/datum/surgery_operation/limb/clamp_bleeders + name = "clamp bleeders" + desc = "Clamp bleeding blood vessels in the patient's body to prevent blood loss. \ + Causes \"vessels clamped\" surgical state." + required_bodytype = ~BODYTYPE_ROBOTIC + operation_flags = OPERATION_PRIORITY_NEXT_STEP + replaced_by = /datum/surgery_operation/limb/clamp_bleeders/abductor + implements = list( + TOOL_HEMOSTAT = 1, + TOOL_WIRECUTTER = 1.67, + /obj/item/stack/package_wrap = 2.85, + /obj/item/stack/cable_coil = 6.67, + ) + time = 2.4 SECONDS + preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_UNCLAMPED + +/datum/surgery_operation/limb/clamp_bleeders/get_default_radial_image() + return image(/obj/item/hemostat) + +/datum/surgery_operation/limb/clamp_bleeders/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to clamp bleeders in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to clamp bleeders in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to clamp bleeders in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel a pinch as the bleeding in your [limb.plaintext_zone] is slowed.") + +/datum/surgery_operation/limb/clamp_bleeders/on_success(obj/item/bodypart/limb) + . = ..() + // free brute healing if you do it after sawing bones + if(LIMB_HAS_SURGERY_STATE(limb, SURGERY_BONE_SAWED)) + limb.heal_damage(20) + limb.add_surgical_state(SURGERY_VESSELS_CLAMPED) + limb.remove_surgical_state(SURGERY_VESSELS_UNCLAMPED) + +/datum/surgery_operation/limb/clamp_bleeders/abductor + operation_flags = parent_type::operation_flags | OPERATION_IGNORE_CLOTHES | OPERATION_LOCKED | OPERATION_NO_WIKI + required_bodytype = NONE + +/// Unclamps blood vessels to allow blood flow again +/datum/surgery_operation/limb/unclamp_bleeders + name = "unclamp bleeders" + desc = "Unclamp blood vessels in the patient's body to allow blood flow again. \ + Clears \"vessels clamped\" surgical state." + required_bodytype = ~BODYTYPE_ROBOTIC + replaced_by = /datum/surgery_operation/limb/unclamp_bleeders/abductor + implements = list( + TOOL_HEMOSTAT = 1, + TOOL_WIRECUTTER = 1.67, + /obj/item/stack/package_wrap = 2.85, + /obj/item/stack/cable_coil = 6.67, + ) + time = 2.4 SECONDS + preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED + +/datum/surgery_operation/limb/unclamp_bleeders/get_default_radial_image() + return image(/obj/item/hemostat) + +/datum/surgery_operation/limb/unclamp_bleeders/all_required_strings() + return ..() + list("the limb must have blood vessels") + +/datum/surgery_operation/limb/unclamp_bleeders/state_check(obj/item/bodypart/limb) + return LIMB_HAS_VESSELS(limb) + +/datum/surgery_operation/limb/unclamp_bleeders/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to unclamp bleeders in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to unclamp bleeders in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to unclamp bleeders in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel a pressure release as blood starts flowing in your [limb.plaintext_zone] again.") + +/datum/surgery_operation/limb/unclamp_bleeders/on_success(obj/item/bodypart/limb) + . = ..() + limb.add_surgical_state(SURGERY_VESSELS_UNCLAMPED) + limb.remove_surgical_state(SURGERY_VESSELS_CLAMPED) + +/datum/surgery_operation/limb/unclamp_bleeders/abductor + operation_flags = parent_type::operation_flags | OPERATION_IGNORE_CLOTHES | OPERATION_LOCKED | OPERATION_NO_WIKI + required_bodytype = NONE + +/// Saws through bones to access organs +/datum/surgery_operation/limb/saw_bones + name = "saw limb bone" + desc = "Saw through the patient's bones to access their internal organs. \ + Causes \"bone sawed\" surgical state." + required_bodytype = ~BODYTYPE_ROBOTIC + implements = list( + TOOL_SAW = 1, + /obj/item/shovel/serrated = 1.33, + /obj/item/melee/arm_blade = 1.33, + /obj/item/fireaxe = 2, + /obj/item/hatchet = 2.85, + /obj/item/knife/butcher = 2.85, + /obj/item = 4, + ) + time = 5.4 SECONDS + preop_sound = list( + /obj/item/circular_saw = 'sound/items/handling/surgery/saw.ogg', + /obj/item/melee/arm_blade = 'sound/items/handling/surgery/scalpel1.ogg', + /obj/item/fireaxe = 'sound/items/handling/surgery/scalpel1.ogg', + /obj/item/hatchet = 'sound/items/handling/surgery/scalpel1.ogg', + /obj/item/knife/butcher = 'sound/items/handling/surgery/scalpel1.ogg', + /obj/item = 'sound/items/handling/surgery/scalpel1.ogg', + ) + success_sound = 'sound/items/handling/surgery/organ2.ogg' + operation_flags = OPERATION_AFFECTS_MOOD + all_surgery_states_required = SURGERY_SKIN_OPEN + any_surgery_states_blocked = SURGERY_BONE_SAWED|SURGERY_BONE_DRILLED + +/datum/surgery_operation/limb/saw_bones/get_any_tool() + return "Any sharp edged item with decent force" + +/datum/surgery_operation/limb/saw_bones/get_default_radial_image() + return image(/obj/item/circular_saw) + +/datum/surgery_operation/limb/saw_bones/tool_check(obj/item/tool) + // Require edged sharpness and sufficient force OR a tool behavior match + return (((tool.get_sharpness() & SHARP_EDGED) && tool.force >= 10) || implements[tool.tool_behaviour]) + +/datum/surgery_operation/limb/saw_bones/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to saw through the bone in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to saw through the bone in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to saw through the bone in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel a horrid ache spread through the inside of your [limb.plaintext_zone]!") + +/datum/surgery_operation/limb/saw_bones/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + limb.add_surgical_state(SURGERY_BONE_SAWED) + limb.receive_damage(50, sharpness = tool.get_sharpness(), wound_bonus = CANT_WOUND, damage_source = tool) + display_results( + surgeon, + limb.owner, + span_notice("You saw [limb.owner]'s [limb.plaintext_zone] open."), + span_notice("[surgeon] saws [limb.owner]'s [limb.plaintext_zone] open!"), + span_notice("[surgeon] saws [limb.owner]'s [limb.plaintext_zone] open!"), + ) + display_pain(limb.owner, "It feels like something just broke in your [limb.plaintext_zone]!") + +/// Fixes sawed bones back together +/datum/surgery_operation/limb/fix_bones + name = "fix limb bone" + desc = "Repair a patient's cut or broken bones. \ + Clears \"bone sawed\" and \"bone drilled\" surgical states." + required_bodytype = ~BODYTYPE_ROBOTIC + implements = list( + /obj/item/stack/medical/bone_gel = 1, + /obj/item/stack/sticky_tape/surgical = 1, + /obj/item/stack/sticky_tape/super = 2, + /obj/item/stack/sticky_tape = 3.33, + ) + preop_sound = list( + /obj/item/stack/medical/bone_gel = 'sound/misc/soggy.ogg', + /obj/item/stack/sticky_tape/surgical = 'sound/items/duct_tape/duct_tape_rip.ogg', + /obj/item/stack/sticky_tape/super = 'sound/items/duct_tape/duct_tape_rip.ogg', + /obj/item/stack/sticky_tape = 'sound/items/duct_tape/duct_tape_rip.ogg', + ) + time = 4 SECONDS + all_surgery_states_required = SURGERY_SKIN_OPEN + any_surgery_states_required = SURGERY_BONE_SAWED|SURGERY_BONE_DRILLED + +/datum/surgery_operation/limb/fix_bones/get_default_radial_image() + return image(/obj/item/stack/medical/bone_gel) + +/datum/surgery_operation/limb/fix_bones/all_required_strings() + return ..() + list("the limb must have bones") + +/datum/surgery_operation/limb/fix_bones/state_check(obj/item/bodypart/limb) + return LIMB_HAS_BONES(limb) + +/datum/surgery_operation/limb/fix_bones/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to fix the bones in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to fix the bones in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to fix the bones in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel a grinding sensation in your [limb.plaintext_zone] as the bones are set back in place.") + +/datum/surgery_operation/limb/fix_bones/on_success(obj/item/bodypart/limb) + . = ..() + limb.remove_surgical_state(SURGERY_BONE_SAWED|SURGERY_BONE_DRILLED) + limb.heal_damage(40) + +/datum/surgery_operation/limb/drill_bones + name = "drill limb bone" + desc = "Drill through a patient's bones. \ + Causes \"bone drilled\" surgical state." + required_bodytype = ~BODYTYPE_ROBOTIC + implements = list( + TOOL_DRILL = 1, + /obj/item/screwdriver/power = 1.25, + /obj/item/pickaxe/drill = 1.67, + TOOL_SCREWDRIVER = 4, + /obj/item/kitchen/spoon = 5, + /obj/item = 6.67, + ) + time = 3 SECONDS + preop_sound = 'sound/items/handling/surgery/saw.ogg' + success_sound = 'sound/items/handling/surgery/organ2.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN + any_surgery_states_blocked = SURGERY_BONE_SAWED|SURGERY_BONE_DRILLED + +/datum/surgery_operation/limb/drill_bones/get_any_tool() + return "Any sharp pointed item with decent force" + +/datum/surgery_operation/limb/drill_bones/get_default_radial_image() + return image(/obj/item/surgicaldrill) + +/datum/surgery_operation/limb/drill_bones/tool_check(obj/item/tool) + // Require pointy sharpness and sufficient force OR a tool behavior match + return (((tool.get_sharpness() & SHARP_POINTY) && tool.force >= 10) || implements[tool.tool_behaviour]) + +/datum/surgery_operation/limb/drill_bones/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to drill into the bone in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to drill into the bone in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to drill into the bone in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel a horrible piercing pain in your [limb.plaintext_zone]!") + +/datum/surgery_operation/limb/drill_bones/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + limb.add_surgical_state(SURGERY_BONE_DRILLED) + display_results( + surgeon, + limb.owner, + span_notice("You drill into [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] drills into [limb.owner]'s [limb.plaintext_zone]!"), + span_notice("[surgeon] drills into [limb.owner]'s [limb.plaintext_zone]!"), + ) + +/datum/surgery_operation/limb/incise_organs + name = "incise organs" + desc = "Make an incision in patient's internal organ tissue to allow for manipulation or repair. \ + Causes \"organs cut\" surgical state." + required_bodytype = ~BODYTYPE_ROBOTIC + replaced_by = /datum/surgery_operation/limb/incise_organs/abductor + implements = list( + TOOL_SCALPEL = 1, + /obj/item/melee/energy/sword = 1.33, + /obj/item/knife = 1.5, + /obj/item/shard = 2.25, + /obj/item/pen = 5, + /obj/item = 3.33, + ) + time = 2.4 SECONDS + preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' + success_sound = 'sound/items/handling/surgery/organ1.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN + any_surgery_states_blocked = SURGERY_ORGANS_CUT + +/datum/surgery_operation/limb/incise_organs/get_any_tool() + return "Any sharp edged item" + +/datum/surgery_operation/limb/incise_organs/get_default_radial_image() + return image(/obj/item/scalpel) + +/datum/surgery_operation/limb/incise_organs/tool_check(obj/item/tool) + // Require edged sharpness OR a tool behavior match. Also saws are a no-go, you'll rip up the organs! + return ((tool.get_sharpness() & SHARP_EDGED) || implements[tool.tool_behaviour]) && tool.tool_behaviour != TOOL_SAW + +/datum/surgery_operation/limb/incise_organs/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to make an incision in the organs within [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to make an incision in the organs within [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to make an incision in the organs within [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel a stabbing in your [limb.plaintext_zone].") + +/datum/surgery_operation/limb/incise_organs/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + limb.add_surgical_state(SURGERY_ORGANS_CUT) + limb.receive_damage(10, sharpness = tool.get_sharpness(), wound_bonus = CANT_WOUND, damage_source = tool) + display_results( + surgeon, + limb.owner, + span_notice("You make an incision in the organs within [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] makes an incision in the organs within [limb.owner]'s [limb.plaintext_zone]!"), + span_notice("[surgeon] makes an incision in the organs within [limb.owner]'s [limb.plaintext_zone]!"), + ) + display_pain(limb.owner, "You feel a sharp pain from inside your [limb.plaintext_zone]!") + +/datum/surgery_operation/limb/incise_organs/abductor + operation_flags = parent_type::operation_flags | OPERATION_IGNORE_CLOTHES | OPERATION_LOCKED | OPERATION_NO_WIKI + required_bodytype = NONE + +/datum/surgery_operation/limb/incise_organs/abductor/state_check(obj/item/bodypart/limb) + return TRUE // You can incise chests without sawing ribs diff --git a/code/modules/surgery/operations/operation_generic_basic.dm b/code/modules/surgery/operations/operation_generic_basic.dm new file mode 100644 index 000000000000..8c8840ece78b --- /dev/null +++ b/code/modules/surgery/operations/operation_generic_basic.dm @@ -0,0 +1,185 @@ +// Some operations that mirror basic carbon state-moving operations but for basic mobs +/// Incision of skin for basic mobs +/datum/surgery_operation/basic/incise_skin + name = "make incision" + // rnd_name = "Laparotomy / Craniotomy / Myotomy (Make Incision)" // Maybe we keep this one simple + desc = "Make an incision in the patient's skin to access internals. \ + Causes \"cut skin\" surgical state." + implements = list( + TOOL_SCALPEL = 1, + /obj/item/melee/energy/sword = 1.33, + /obj/item/knife = 1.5, + /obj/item/shard = 2.25, + /obj/item/screwdriver = 5, + /obj/item/pen = 5, + /obj/item = 3.33, + ) + time = 1.6 SECONDS + preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' + success_sound = 'sound/items/handling/surgery/scalpel2.ogg' + operation_flags = OPERATION_AFFECTS_MOOD + any_surgery_states_blocked = ALL_SURGERY_SKIN_STATES + target_zone = null + +/datum/surgery_operation/basic/incise_skin/get_any_tool() + return "Any sharp edged item" + +/datum/surgery_operation/basic/incise_skin/all_blocked_strings() + return ..() + list("The patient must not have complex anatomy") + +/datum/surgery_operation/basic/incise_skin/get_default_radial_image() + return image(/obj/item/scalpel) + +/datum/surgery_operation/basic/incise_skin/state_check(mob/living/patient) + return !patient.has_limbs // Only for limbless mobs + +/datum/surgery_operation/basic/incise_skin/tool_check(obj/item/tool) + // Require edged sharpness OR a tool behavior match + if((tool.get_sharpness() & SHARP_EDGED) || implements[tool.tool_behaviour]) + return TRUE + // these are here by popular demand, even though they don't fit the above criteria + if(istype(tool, /obj/item/pen) || istype(tool, /obj/item/screwdriver)) + return TRUE + return FALSE + +/datum/surgery_operation/basic/incise_skin/on_preop(mob/living/patient, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + patient, + span_notice("You begin to make an incision in [patient]..."), + span_notice("[surgeon] begins to make an incision in [patient]."), + span_notice("[surgeon] begins to make an incision in [patient]."), + ) + display_pain(patient, "You feel a sharp stabbing sensation!") + +/datum/surgery_operation/basic/incise_skin/on_success(mob/living/patient, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + patient.apply_status_effect(/datum/status_effect/basic_surgery_state, SURGERY_SKIN_OPEN) + +/datum/surgery_operation/basic/saw_bone + name = "saw bone" + desc = "Saw through the patient's bones to access their internal organs. \ + Causes \"bone sawed\" surgical state." + implements = list( + TOOL_SAW = 1, + /obj/item/shovel/serrated = 1.33, + /obj/item/melee/arm_blade = 1.33, + /obj/item/fireaxe = 2, + /obj/item/hatchet = 2.85, + /obj/item/knife/butcher = 2.85, + /obj/item = 4, + ) + time = 5.4 SECONDS + preop_sound = list( + /obj/item/circular_saw = 'sound/items/handling/surgery/saw.ogg', + /obj/item/melee/arm_blade = 'sound/items/handling/surgery/scalpel1.ogg', + /obj/item/fireaxe = 'sound/items/handling/surgery/scalpel1.ogg', + /obj/item/hatchet = 'sound/items/handling/surgery/scalpel1.ogg', + /obj/item/knife/butcher = 'sound/items/handling/surgery/scalpel1.ogg', + /obj/item = 'sound/items/handling/surgery/scalpel1.ogg', + ) + success_sound = 'sound/items/handling/surgery/organ2.ogg' + operation_flags = OPERATION_AFFECTS_MOOD + all_surgery_states_required = SURGERY_SKIN_OPEN + any_surgery_states_blocked = SURGERY_BONE_SAWED|SURGERY_BONE_DRILLED + target_zone = null + +/datum/surgery_operation/basic/saw_bone/get_any_tool() + return "Any sharp edged item with decent force" + +/datum/surgery_operation/basic/saw_bone/all_blocked_strings() + return ..() + list("The patient must not have complex anatomy") + +/datum/surgery_operation/basic/saw_bone/get_default_radial_image() + return image(/obj/item/circular_saw) + +/datum/surgery_operation/basic/saw_bone/state_check(mob/living/patient) + return !patient.has_limbs // Only for limbless mobs + +/datum/surgery_operation/basic/saw_bone/tool_check(obj/item/tool) + // Require edged sharpness and sufficient force OR a tool behavior match + return (((tool.get_sharpness() & SHARP_EDGED) && tool.force >= 10) || implements[tool.tool_behaviour]) + +/datum/surgery_operation/basic/saw_bone/on_preop(mob/living/patient, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + patient, + span_notice("You begin to saw through [patient]'s bones..."), + span_notice("[surgeon] begins to saw through [patient]'s bones."), + span_notice("[surgeon] begins to saw through [patient]'s bones."), + ) + display_pain(patient, "You feel a horrid ache spread through your insides!") + +/datum/surgery_operation/basic/saw_bone/on_success(mob/living/patient, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + patient.apply_status_effect(/datum/status_effect/basic_surgery_state, SURGERY_BONE_SAWED) + patient.apply_damage(patient.maxHealth * 0.5, sharpness = tool.get_sharpness(), wound_bonus = CANT_WOUND, attacking_item = tool) + display_results( + surgeon, + patient, + span_notice("You saw [patient] open."), + span_notice("[surgeon] saws [patient] open!"), + span_notice("[surgeon] saws [patient] open!"), + ) + display_pain(patient, "It feels like something just broke!") + +// Closing of skin for basic mobs +/datum/surgery_operation/basic/close_skin + name = "mend incision" + desc = "Mend the incision in the patient's skin, closing it up. \ + Clears most surgical states." + implements = list( + TOOL_CAUTERY = 1, + /obj/item/stack/medical/suture = 1, + /obj/item/gun/energy/laser = 1.15, + TOOL_WELDER = 1.5, + /obj/item = 3.33, + ) + time = 2.4 SECONDS + preop_sound = list( + /obj/item/stack/medical/suture = SFX_SUTURE_BEGIN, + /obj/item = 'sound/items/handling/surgery/cautery1.ogg', + ) + success_sound = list( + /obj/item/stack/medical/suture = SFX_SUTURE_END, + /obj/item = 'sound/items/handling/surgery/cautery2.ogg', + ) + any_surgery_states_required = ALL_SURGERY_STATES_UNSET_ON_CLOSE // we're not picky + target_zone = null + +/datum/surgery_operation/basic/close_skin/get_any_tool() + return "Any heat source" + +/datum/surgery_operation/basic/close_skin/all_blocked_strings() + return ..() + list("The patient must not have complex anatomy") + +/datum/surgery_operation/basic/close_skin/get_default_radial_image() + return image(/obj/item/cautery) + +/datum/surgery_operation/basic/close_skin/state_check(mob/living/patient) + return !patient.has_limbs // Only for limbless mobs + +/datum/surgery_operation/basic/close_skin/tool_check(obj/item/tool) + if(istype(tool, /obj/item/stack/medical/suture)) + return TRUE + + if(istype(tool, /obj/item/gun/energy/laser)) + var/obj/item/gun/energy/laser/lasergun = tool + return lasergun.cell?.charge > 0 + + return tool.get_temperature() > 0 + +/datum/surgery_operation/basic/close_skin/on_preop(mob/living/patient, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + patient, + span_notice("You begin to mend the incision in [patient]..."), + span_notice("[surgeon] begins to mend the incision in [patient]."), + span_notice("[surgeon] begins to mend the incision in [patient]."), + ) + display_pain(patient, "You are being [istype(tool, /obj/item/stack/medical/suture) ? "pinched" : "burned"]!") + +/datum/surgery_operation/basic/close_skin/on_success(mob/living/patient, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + // Just nuke the status effect, wipe the slate clean + patient.remove_status_effect(/datum/status_effect/basic_surgery_state) diff --git a/code/modules/surgery/operations/operation_generic_mechanic.dm b/code/modules/surgery/operations/operation_generic_mechanic.dm new file mode 100644 index 000000000000..f8e4ec33b9ac --- /dev/null +++ b/code/modules/surgery/operations/operation_generic_mechanic.dm @@ -0,0 +1,227 @@ +// Mechanical equivalents of basic surgical operations +/// Mechanical equivalent of cutting skin +/datum/surgery_operation/limb/mechanical_incision + name = "unscrew shell" + desc = "Unscrew the shell of a mechanical patient to access its internals. \ + Causes \"cut skin\" surgical state." + implements = list( + TOOL_SCREWDRIVER = 1, + TOOL_SCALPEL = 1.33, + /obj/item/knife = 2, + /obj/item = 10, // i think this amounts to a 180% chance of failure (clamped to 99%) + ) + operation_flags = OPERATION_SELF_OPERABLE | OPERATION_MECHANIC + required_bodytype = BODYTYPE_ROBOTIC + time = 2.4 SECONDS + preop_sound = 'sound/items/tools/screwdriver.ogg' + success_sound = 'sound/items/tools/screwdriver2.ogg' + any_surgery_states_blocked = ALL_SURGERY_SKIN_STATES + +/datum/surgery_operation/limb/mechanical_incision/get_any_tool() + return "Any sharp item" + +/datum/surgery_operation/limb/mechanical_incision/get_default_radial_image() + return image(/obj/item/screwdriver) + +/datum/surgery_operation/limb/mechanical_incision/tool_check(obj/item/tool) + // Require any sharpness OR a tool behavior match + return (tool.get_sharpness() || implements[tool.tool_behaviour]) + +/datum/surgery_operation/limb/mechanical_incision/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to unscrew the shell of [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to unscrew the shell of [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to unscrew the shell of [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel your [limb.plaintext_zone] grow numb as the shell is unscrewed.", TRUE) + +/datum/surgery_operation/limb/mechanical_incision/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + limb.add_surgical_state(SURGERY_SKIN_CUT) + +/// Mechanical equivalent of opening skin and clamping vessels +/datum/surgery_operation/limb/mechanical_open + name = "open hatch" + desc = "Open the hatch of a mechanical patient to access its internals. \ + Causes \"skin open\" and \"vessels clamped\" surgical states." + required_bodytype = BODYTYPE_ROBOTIC + implements = list( + IMPLEMENT_HAND = 1, + TOOL_CROWBAR = 1, + ) + operation_flags = OPERATION_SELF_OPERABLE | OPERATION_MECHANIC + time = 1 SECONDS + preop_sound = 'sound/items/tools/ratchet.ogg' + success_sound = 'sound/machines/airlock/doorclick.ogg' + all_surgery_states_required = SURGERY_SKIN_CUT + +/datum/surgery_operation/limb/mechanical_open/get_default_radial_image() + return image('icons/hud/screen_gen.dmi', "arrow_large_still") + +/datum/surgery_operation/limb/mechanical_open/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to open the hatch holders in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to open the hatch holders in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to open the hatch holders in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "The last faint pricks of tactile sensation fade from your [limb.plaintext_zone] as the hatch is opened.", TRUE) + +/datum/surgery_operation/limb/mechanical_open/on_success(obj/item/bodypart/limb) + . = ..() + // We get both vessels and skin done at the same time wowee + limb.add_surgical_state(SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED) + limb.remove_surgical_state(SURGERY_SKIN_CUT) + +/// Mechanical equivalent of cauterizing / closing skin +/datum/surgery_operation/limb/mechanical_close + name = "screw shell" + desc = "Screw the shell of a mechanical patient back into place. \ + Clears most surgical states." + required_bodytype = BODYTYPE_ROBOTIC + implements = list( + TOOL_SCREWDRIVER = 1, + TOOL_SCALPEL = 1.33, + /obj/item/knife = 2, + /obj/item = 10, + ) + operation_flags = OPERATION_SELF_OPERABLE | OPERATION_MECHANIC + time = 2.4 SECONDS + preop_sound = 'sound/items/tools/screwdriver.ogg' + success_sound = 'sound/items/tools/screwdriver2.ogg' + any_surgery_states_required = ALL_SURGERY_SKIN_STATES + +/datum/surgery_operation/limb/mechanical_close/get_any_tool() + return "Any sharp item" + +/datum/surgery_operation/limb/mechanical_close/get_default_radial_image() + return image(/obj/item/screwdriver) + +/datum/surgery_operation/limb/mechanical_close/tool_check(obj/item/tool) + // Require any sharpness OR a tool behavior match + return (tool.get_sharpness() || implements[tool.tool_behaviour]) + +/datum/surgery_operation/limb/mechanical_close/state_check(obj/item/bodypart/limb) + return LIMB_HAS_SKIN(limb) + +/datum/surgery_operation/limb/mechanical_close/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to screw the shell of [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to screw the shell of [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to screw the shell of [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel the faint pricks of sensation return as your [limb.plaintext_zone]'s shell is screwed in.", TRUE) + +/datum/surgery_operation/limb/mechanical_close/on_success(obj/item/bodypart/limb) + . = ..() + limb.remove_surgical_state(ALL_SURGERY_STATES_UNSET_ON_CLOSE) + +// Mechanical equivalent of cutting vessels and organs +/datum/surgery_operation/limb/prepare_electronics + name = "prepare electronics" + desc = "Prepare the internal electronics of a mechanical patient for surgery. \ + Causes \"organs cut\" surgical state." + required_bodytype = BODYTYPE_ROBOTIC + implements = list( + TOOL_MULTITOOL = 1, + TOOL_HEMOSTAT = 1.33, + ) + operation_flags = OPERATION_SELF_OPERABLE | OPERATION_MECHANIC + time = 2.4 SECONDS + preop_sound = 'sound/items/taperecorder/tape_flip.ogg' + success_sound = 'sound/items/taperecorder/taperecorder_close.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN + any_surgery_states_blocked = SURGERY_ORGANS_CUT + +/datum/surgery_operation/limb/prepare_electronics/get_default_radial_image() + return image(/obj/item/multitool) + +/datum/surgery_operation/limb/prepare_electronics/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to prepare electronics in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to prepare electronics in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to prepare electronics in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You can feel a faint buzz in your [limb.plaintext_zone] as the electronics reboot.", TRUE) + +/datum/surgery_operation/limb/prepare_electronics/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + limb.add_surgical_state(SURGERY_ORGANS_CUT) + +// Mechanical equivalent of sawing bone +/datum/surgery_operation/limb/mechanic_unwrench + name = "unwrench endoskeleton" + desc = "Unwrench a mechanical patient's endoskeleton to access its internals. \ + Clears \"bone sawed\" surgical state." + required_bodytype = BODYTYPE_ROBOTIC + implements = list( + TOOL_WRENCH = 1, + TOOL_RETRACTOR = 1.33, + ) + operation_flags = OPERATION_SELF_OPERABLE | OPERATION_MECHANIC + time = 2.4 SECONDS + preop_sound = 'sound/items/tools/ratchet.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN + any_surgery_states_blocked = SURGERY_BONE_SAWED|SURGERY_BONE_DRILLED + +/datum/surgery_operation/limb/mechanic_unwrench/get_default_radial_image() + return image(/obj/item/wrench) + +/datum/surgery_operation/limb/mechanic_unwrench/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to unwrench some bolts in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to unwrench some bolts in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to unwrench some bolts in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel a jostle in your [limb.plaintext_zone] as the bolts begin to loosen.", TRUE) + +/datum/surgery_operation/limb/mechanic_unwrench/on_success(obj/item/bodypart/limb) + . = ..() + limb.add_surgical_state(SURGERY_BONE_SAWED) + +// Mechanical equivalent of unsawing bone +/datum/surgery_operation/limb/mechanic_wrench + name = "wrench endoskeleton" + desc = "Wrench a mechanical patient's endoskeleton back into place. \ + Clears \"bone sawed\" surgical state." + required_bodytype = BODYTYPE_ROBOTIC + implements = list( + TOOL_WRENCH = 1, + TOOL_RETRACTOR = 1.33, + ) + operation_flags = OPERATION_SELF_OPERABLE | OPERATION_MECHANIC + time = 2.4 SECONDS + preop_sound = 'sound/items/tools/ratchet.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_BONE_SAWED + +/datum/surgery_operation/limb/mechanic_wrench/state_check(obj/item/bodypart/limb) + return LIMB_HAS_BONES(limb) + +/datum/surgery_operation/limb/mechanic_wrench/all_required_strings() + return ..() + list("the limb must have bones") + +/datum/surgery_operation/limb/mechanic_wrench/get_default_radial_image() + return image(/obj/item/wrench) + +/datum/surgery_operation/limb/mechanic_wrench/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to wrench some bolts in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to wrench some bolts in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to wrench some bolts in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel a jostle in your [limb.plaintext_zone] as the bolts begin to tighten.", TRUE) + +/datum/surgery_operation/limb/mechanic_wrench/on_success(obj/item/bodypart/limb) + . = ..() + limb.remove_surgical_state(SURGERY_BONE_SAWED) diff --git a/code/modules/surgery/operations/operation_healing.dm b/code/modules/surgery/operations/operation_healing.dm new file mode 100644 index 000000000000..2592ab7b7fd2 --- /dev/null +++ b/code/modules/surgery/operations/operation_healing.dm @@ -0,0 +1,254 @@ +/// Allow brute healing operation +#define BRUTE_SURGERY (1<<0) +/// Allow burn healing operation +#define BURN_SURGERY (1<<1) +/// Allow combo healing operation +#define COMBO_SURGERY (1<<2) + +/datum/surgery_operation/basic/tend_wounds + name = "tend wounds" + rnd_name = "Tend Wounds" + desc = "Perform superficial wound care on a patient's bruises and burns." + implements = list( + TOOL_HEMOSTAT = 1, + TOOL_SCREWDRIVER = 1.5, + TOOL_WIRECUTTER = 1.67, + /obj/item/pen = 1.8, + ) + time = 2.5 SECONDS + operation_flags = OPERATION_LOOPING | OPERATION_IGNORE_CLOTHES + success_sound = 'sound/items/handling/surgery/retractor2.ogg' + failure_sound = 'sound/items/handling/surgery/organ2.ogg' + required_biotype = MOB_ORGANIC|MOB_HUMANOID + required_bodytype = NONE + any_surgery_states_required = ALL_SURGERY_SKIN_STATES + replaced_by = /datum/surgery_operation/basic/tend_wounds/upgraded + /// Radial slice datums for every healing option we can provide + VAR_PRIVATE/list/cached_healing_options + /// Bitflag of which healing types this operation can perform + var/can_heal = BRUTE_SURGERY | BURN_SURGERY + /// Flat amount of healing done per operation + var/healing_amount = 5 + /// The amount of damage healed scales based on how much damage the patient has times this multiplier + var/healing_multiplier = 0.07 + +/datum/surgery_operation/basic/tend_wounds/all_required_strings() + return ..() + list("the patient must have brute or burn damage") + +/datum/surgery_operation/basic/tend_wounds/state_check(mob/living/patient) + return patient.get_brute_loss() > 0 || patient.get_fire_loss() > 0 + +/datum/surgery_operation/basic/tend_wounds/get_default_radial_image() + return image(/obj/item/storage/medkit) + +/datum/surgery_operation/basic/tend_wounds/get_radial_options(mob/living/patient, obj/item/tool, operating_zone) + var/list/options = list() + + if(can_heal & COMBO_SURGERY) + var/datum/radial_menu_choice/all_healing = LAZYACCESS(cached_healing_options, "[COMBO_SURGERY]") + if(!all_healing) + all_healing = new() + all_healing.image = image(/obj/item/storage/medkit/advanced) + all_healing.name = "tend bruises and burns" + all_healing.info = "Heal a patient's superficial bruises, cuts, and burns." + LAZYSET(cached_healing_options, "[COMBO_SURGERY]", all_healing) + + options[all_healing] = list( + "[OPERATION_ACTION]" = "heal", + "[OPERATION_BRUTE_HEAL]" = healing_amount, + "[OPERATION_BURN_HEAL]" = healing_amount, + "[OPERATION_BRUTE_MULTIPLIER]" = healing_multiplier, + "[OPERATION_BURN_MULTIPLIER]" = healing_multiplier, + ) + + if((can_heal & BRUTE_SURGERY) && patient.get_brute_loss() > 0) + var/datum/radial_menu_choice/brute_healing = LAZYACCESS(cached_healing_options, "[BRUTE_SURGERY]") + if(!brute_healing) + brute_healing = new() + brute_healing.image = image(/obj/item/storage/medkit/brute) + brute_healing.name = "tend bruises" + brute_healing.info = "Heal a patient's superficial bruises and cuts." + LAZYSET(cached_healing_options, "[BRUTE_SURGERY]", brute_healing) + + options[brute_healing] = list( + "[OPERATION_ACTION]" = "heal", + "[OPERATION_BRUTE_HEAL]" = healing_amount, + "[OPERATION_BRUTE_MULTIPLIER]" = healing_multiplier, + ) + + if((can_heal & BURN_SURGERY) && patient.get_fire_loss() > 0) + var/datum/radial_menu_choice/burn_healing = LAZYACCESS(cached_healing_options, "[BURN_SURGERY]") + if(!burn_healing) + burn_healing = new() + burn_healing.image = image(/obj/item/storage/medkit/fire) + burn_healing.name = "tend burns" + burn_healing.info = "Heal a patient's superficial burns." + LAZYSET(cached_healing_options, "[BURN_SURGERY]", burn_healing) + + options[burn_healing] = list( + "[OPERATION_ACTION]" = "heal", + "[OPERATION_BURN_HEAL]" = healing_amount, + "[OPERATION_BURN_MULTIPLIER]" = healing_multiplier, + ) + + return options + +/datum/surgery_operation/basic/tend_wounds/can_loop(mob/living/patient, mob/living/operating_on, mob/living/surgeon, tool, list/operation_args) + . = ..() + if(!.) + return FALSE + var/brute_heal = operation_args[OPERATION_BRUTE_HEAL] > 0 + var/burn_heal = operation_args[OPERATION_BURN_HEAL] > 0 + if(brute_heal && burn_heal) + return patient.get_brute_loss() > 0 || patient.get_fire_loss() > 0 + else if(brute_heal) + return patient.get_brute_loss() > 0 + else if(burn_heal) + return patient.get_fire_loss() > 0 + return FALSE + +/datum/surgery_operation/basic/tend_wounds/on_preop(mob/living/patient, mob/living/surgeon, tool, list/operation_args) + var/woundtype + var/brute_heal = operation_args[OPERATION_BRUTE_HEAL] > 0 + var/burn_heal = operation_args[OPERATION_BURN_HEAL] > 0 + if(brute_heal && burn_heal) + woundtype = "wounds" + else if(brute_heal) + woundtype = "bruises" + else //why are you trying to 0,0...? + woundtype = "burns" + display_results( + surgeon, + patient, + span_notice("You attempt to patch some of [patient]'s [woundtype]."), + span_notice("[surgeon] attempts to patch some of [patient]'s [woundtype]."), + span_notice("[surgeon] attempts to patch some of [patient]'s [woundtype]."), + ) + display_pain(patient, "Your [woundtype] sting like hell!") + +#define CONDITIONAL_DAMAGE_MESSAGE(brute, burn, combo_msg, brute_msg, burn_msg) "[(brute > 0 && burn > 0) ? combo_msg : (brute > 0 ? brute_msg : burn_msg)]" + +/// Returns a string letting the surgeon know roughly how much longer the surgery is estimated to take at the going rate +/datum/surgery_operation/basic/tend_wounds/proc/get_progress(mob/living/surgeon, mob/living/patient, brute_healed, burn_healed) + var/estimated_remaining_steps = 0 + if(brute_healed > 0) + estimated_remaining_steps = max(0, (patient.get_brute_loss() / brute_healed)) + if(burn_healed > 0) + estimated_remaining_steps = max(estimated_remaining_steps, (patient.get_fire_loss() / burn_healed)) // whichever is higher between brute or burn steps + + var/progress_text + + if(surgeon.is_holding_item_of_type(/obj/item/healthanalyzer)) + if(brute_healed > 0 && patient.get_brute_loss() > 0) + progress_text += ". Remaining brute: [patient.get_brute_loss()]" + if(burn_healed > 0 && patient.get_fire_loss() > 0) + progress_text += ". Remaining burn: [patient.get_fire_loss()]" + return progress_text + + switch(estimated_remaining_steps) + if(-INFINITY to 1) + return + if(1 to 3) + progress_text += ", finishing up the last few [CONDITIONAL_DAMAGE_MESSAGE(brute_healed, burn_healed, "signs of damage", "scrapes", "burn marks")]" + if(3 to 6) + progress_text += ", counting down the last few [CONDITIONAL_DAMAGE_MESSAGE(brute_healed, burn_healed, "patches of trauma", "bruises", "blisters")] left to treat" + if(6 to 9) + progress_text += ", continuing to plug away at [patient.p_their()] extensive [CONDITIONAL_DAMAGE_MESSAGE(brute_healed, burn_healed, "injuries", "rupturing", "roasting")]" + if(9 to 12) + progress_text += ", steadying yourself for the long surgery ahead" + if(12 to 15) + progress_text += ", though [patient.p_they()] still look[patient.p_s()] more like [CONDITIONAL_DAMAGE_MESSAGE(brute_healed, burn_healed, "smooshed baby food", "ground beef", "burnt steak")] than a person" + if(15 to INFINITY) + progress_text += ", though you feel like you're barely making a dent in treating [patient.p_their()] [CONDITIONAL_DAMAGE_MESSAGE(brute_healed, burn_healed, "broken", "pulped", "charred")] body" + + return progress_text + +#undef CONDITIONAL_DAMAGE_MESSAGE + +/datum/surgery_operation/basic/tend_wounds/on_success(mob/living/patient, mob/living/surgeon, tool, list/operation_args) + var/user_msg = "You succeed in fixing some of [patient]'s wounds" //no period, add initial space to "addons" + var/target_msg = "[surgeon] fixes some of [patient]'s wounds" //see above + + var/brute_healed = operation_args[OPERATION_BRUTE_HEAL] + var/burn_healed = operation_args[OPERATION_BURN_HEAL] + + var/dead_multiplier = patient.stat == DEAD ? 0.2 : 1.0 + var/accessibility_modifier = 1.0 + if(!patient.is_location_accessible(BODY_ZONE_CHEST, IGNORED_OPERATION_CLOTHING_SLOTS)) + accessibility_modifier = 0.55 + user_msg += " as best as you can while [patient.p_they()] [patient.p_have()] clothing on" + target_msg += " as best as [surgeon.p_they()] can while [patient.p_they()] [patient.p_have()] clothing on" + + var/brute_multiplier = operation_args[OPERATION_BRUTE_MULTIPLIER] * dead_multiplier * accessibility_modifier + var/burn_multiplier = operation_args[OPERATION_BURN_MULTIPLIER] * dead_multiplier * accessibility_modifier + + brute_healed += round(patient.get_brute_loss() * brute_multiplier, DAMAGE_PRECISION) + burn_healed += round(patient.get_fire_loss() * burn_multiplier, DAMAGE_PRECISION) + + patient.heal_bodypart_damage(brute_healed, burn_healed) + + user_msg += get_progress(surgeon, patient, brute_healed, burn_healed) + + if(HAS_MIND_TRAIT(surgeon, TRAIT_MORBID) && patient.stat != DEAD) //Morbid folk don't care about tending the dead as much as tending the living + surgeon.add_mood_event("morbid_tend_wounds", /datum/mood_event/morbid_tend_wounds) + + display_results( + surgeon, + patient, + span_notice("[user_msg]."), + span_notice("[target_msg]."), + span_notice("[target_msg]."), + ) + +/datum/surgery_operation/basic/tend_wounds/on_failure(mob/living/patient, mob/living/surgeon, tool, list/operation_args) + display_results( + surgeon, + patient, + span_warning("You screwed up!"), + span_warning("[surgeon] screws up!"), + span_notice("[surgeon] fixes some of [patient]'s wounds."), + target_detailed = TRUE, + ) + var/brute_dealt = operation_args[OPERATION_BRUTE_HEAL] * 0.8 + var/burn_dealt = operation_args[OPERATION_BURN_HEAL] * 0.8 + var/brute_multiplier = operation_args[OPERATION_BRUTE_MULTIPLIER] * 0.5 + var/burn_multiplier = operation_args[OPERATION_BURN_MULTIPLIER] * 0.5 + + brute_dealt += round(patient.get_brute_loss() * brute_multiplier, 0.1) + burn_dealt += round(patient.get_fire_loss() * burn_multiplier, 0.1) + + patient.take_bodypart_damage(brute_dealt, burn_dealt, wound_bonus = CANT_WOUND) + +/datum/surgery_operation/basic/tend_wounds/upgraded + rnd_name = parent_type::rnd_name + "+" + operation_flags = parent_type::operation_flags | OPERATION_LOCKED + replaced_by = /datum/surgery_operation/basic/tend_wounds/upgraded/master + healing_multiplier = 0.1 + +/datum/surgery_operation/basic/tend_wounds/upgraded/master + rnd_name = parent_type::rnd_name + "+" + replaced_by = /datum/surgery_operation/basic/tend_wounds/combo/upgraded/master + healing_multiplier = 0.2 + +/datum/surgery_operation/basic/tend_wounds/combo + rnd_name = "Advanced Tend Wounds" + operation_flags = parent_type::operation_flags | OPERATION_LOCKED + replaced_by = /datum/surgery_operation/basic/tend_wounds/combo/upgraded + can_heal = COMBO_SURGERY + healing_amount = 3 + time = 1 SECONDS + +/datum/surgery_operation/basic/tend_wounds/combo/upgraded + rnd_name = parent_type::rnd_name + "+" + operation_flags = parent_type::operation_flags | OPERATION_LOCKED + replaced_by = /datum/surgery_operation/basic/tend_wounds/combo/upgraded/master + healing_multiplier = 0.1 + +/datum/surgery_operation/basic/tend_wounds/combo/upgraded/master + rnd_name = parent_type::rnd_name + "+" + healing_amount = 1 + healing_multiplier = 0.4 + +#undef BRUTE_SURGERY +#undef BURN_SURGERY +#undef COMBO_SURGERY diff --git a/code/modules/surgery/operations/operation_implant_removal.dm b/code/modules/surgery/operations/operation_implant_removal.dm new file mode 100644 index 000000000000..3b4dc93b6329 --- /dev/null +++ b/code/modules/surgery/operations/operation_implant_removal.dm @@ -0,0 +1,83 @@ +/datum/surgery_operation/basic/implant_removal + name = "implant removal" + desc = "Attempt to find and remove an implant from a patient. \ + Any implant found will be destroyed unless an implant case is held or nearby." + operation_flags = OPERATION_NOTABLE + implements = list( + TOOL_HEMOSTAT = 1, + TOOL_CROWBAR = 1.5, + /obj/item/kitchen/fork = 2.85, + ) + time = 6.4 SECONDS + success_sound = 'sound/items/handling/surgery/hemostat1.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED + +/datum/surgery_operation/basic/implant_removal/get_default_radial_image() + return image('icons/obj/medical/syringe.dmi', "implantcase-b") + +/datum/surgery_operation/basic/implant_removal/any_optional_strings() + return ..() + list("have an implant case below or inhand to store removed implants") + +/datum/surgery_operation/basic/implant_removal/on_preop(mob/living/patient, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + patient, + span_notice("You search for implants in [patient]..."), + span_notice("[surgeon] searches for implants in [patient]."), + span_notice("[surgeon] searches for something in [patient]."), + ) + if(LAZYLEN(patient.implants)) + display_pain(patient, "You feel a serious pain as [surgeon] digs around inside you!") + +/datum/surgery_operation/basic/implant_removal/on_success(mob/living/patient, mob/living/surgeon, obj/item/tool, list/operation_args) + var/obj/item/implant/implant = LAZYACCESS(patient.implants, 1) + if(isnull(implant)) + display_results( + surgeon, + patient, + span_warning("You find no implant to remove from [patient]."), + span_warning("[surgeon] finds no implant to remove from [patient]."), + span_warning("[surgeon] finds nothing to remove from [patient]."), + ) + return + + display_results( + surgeon, + patient, + span_notice("You successfully remove [implant] from [patient]."), + span_notice("[surgeon] successfully removes [implant] from [patient]!"), + span_notice("[surgeon] successfully removes something from [patient]!"), + ) + display_pain(patient, "You can feel your [implant.name] pulled out of you!") + implant.removed(patient) + + if(QDELETED(implant)) + return + + var/obj/item/implantcase/case = get_case(surgeon, patient) + if(isnull(case)) + return + + case.imp = implant + implant.forceMove(case) + case.update_appearance() + display_results( + surgeon, + patient, + span_notice("You place [implant] into [case]."), + span_notice("[surgeon] places [implant] into [case]."), + span_notice("[surgeon] places something into [case]."), + ) + +/datum/surgery_operation/basic/implant_removal/proc/get_case(mob/living/surgeon, mob/living/target) + var/list/locations = list( + surgeon.is_holding_item_of_type(/obj/item/implantcase), + locate(/obj/item/implantcase) in surgeon.loc, + locate(/obj/item/implantcase) in target.loc, + ) + + for(var/obj/item/implantcase/case in locations) + if(!case.imp) + return case + + return null diff --git a/code/modules/surgery/operations/operation_lipo.dm b/code/modules/surgery/operations/operation_lipo.dm new file mode 100644 index 000000000000..05dff0338685 --- /dev/null +++ b/code/modules/surgery/operations/operation_lipo.dm @@ -0,0 +1,104 @@ +/datum/surgery_operation/limb/lipoplasty + name = "excise excess fat" + rnd_name = "Lipoplasty (Excise Fat)" + desc = "Remove excess fat from a patient's body." + operation_flags = OPERATION_NOTABLE | OPERATION_AFFECTS_MOOD + implements = list( + TOOL_SAW = 1, + TOOL_SCALPEL = 1.25, + /obj/item/shovel/serrated = 1.33, + /obj/item/melee/energy/sword = 1.33, + /obj/item/hatchet = 3.33, + /obj/item/knife = 3.33, + /obj/item = 5, + ) + time = 6.4 SECONDS + required_bodytype = ~BODYTYPE_ROBOTIC + preop_sound = list( + /obj/item/circular_saw = 'sound/items/handling/surgery/saw.ogg', + /obj/item = 'sound/items/handling/surgery/scalpel1.ogg', + ) + success_sound = 'sound/items/handling/surgery/organ2.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED + +/datum/surgery_operation/limb/lipoplasty/get_any_tool() + return "Any sharp edged item" + +/datum/surgery_operation/limb/lipoplasty/get_default_radial_image() + return image(/obj/item/food/meat/slab/human) + +/datum/surgery_operation/limb/lipoplasty/all_required_strings() + . = list() + . += "operate on chest (target chest)" + . += ..() + . += "the patient must have excess fat to remove" + +/datum/surgery_operation/limb/lipoplasty/tool_check(obj/item/tool) + // Require edged sharpness OR a tool behavior match + return ((tool.get_sharpness() & SHARP_EDGED) || implements[tool.tool_behaviour]) + +/datum/surgery_operation/limb/lipoplasty/state_check(obj/item/bodypart/limb) + if(limb.body_zone != BODY_ZONE_CHEST) + return FALSE + if(!HAS_TRAIT_FROM(limb.owner, TRAIT_FAT, OBESITY) && limb.owner.nutrition < NUTRITION_LEVEL_WELL_FED) + return FALSE + return TRUE + +/datum/surgery_operation/limb/lipoplasty/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to cut away [limb.owner]'s excess fat..."), + span_notice("[surgeon] begins to cut away [limb.owner]'s excess fat."), + span_notice("[surgeon] begins to cut [limb.owner]'s [limb.plaintext_zone] with [tool]."), + ) + display_pain(limb.owner, "You feel a stabbing in your [limb.plaintext_zone]!") + +/datum/surgery_operation/limb/lipoplasty/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You successfully remove excess fat from [limb.owner]'s body!"), + span_notice("[surgeon] successfully removes excess fat from [limb.owner]'s body!"), + span_notice("[surgeon] finishes cutting away excess fat from [limb.owner]'s [limb.plaintext_zone]."), + ) + limb.owner.overeatduration = 0 //patient is unfatted + var/removednutriment = limb.owner.nutrition + limb.owner.set_nutrition(NUTRITION_LEVEL_WELL_FED) + removednutriment -= NUTRITION_LEVEL_WELL_FED //whatever was removed goes into the meat + + var/typeofmeat = /obj/item/food/meat/slab/human + if(limb.owner.flags_1 & HOLOGRAM_1) + typeofmeat = null + else if(limb.owner.dna?.species) + typeofmeat = limb.owner.dna.species.meat + + if(!typeofmeat) + return + + var/obj/item/food/meat/slab/newmeat = new typeofmeat() + newmeat.name = "fatty meat" + newmeat.desc = "Extremely fatty tissue taken from a patient." + newmeat.subjectname = limb.owner.real_name + newmeat.subjectjob = limb.owner.job + newmeat.reagents.add_reagent(/datum/reagent/consumable/nutriment, (removednutriment / 15)) //To balance with nutriment_factor of nutriment + newmeat.forceMove(limb.owner.drop_location()) + +/datum/surgery_operation/limb/lipoplasty/mechanic + name = "engage expulsion valve" //gross + rnd_name = "Nutrient Reserve Expulsion (Excise Fat)" + implements = list( + TOOL_WRENCH = 1.05, + TOOL_CROWBAR = 1.05, + /obj/item/shovel/serrated = 1.33, + /obj/item/melee/energy/sword = 1.33, + TOOL_SAW = 1.67, + /obj/item/hatchet = 3.33, + /obj/item/knife = 3.33, + TOOL_SCALPEL = 4, + /obj/item = 5, + ) + preop_sound = 'sound/items/tools/ratchet.ogg' + success_sound = 'sound/items/handling/surgery/organ2.ogg' + required_bodytype = BODYTYPE_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC diff --git a/code/modules/surgery/operations/operation_lobotomy.dm b/code/modules/surgery/operations/operation_lobotomy.dm new file mode 100644 index 000000000000..66d64e1cd4be --- /dev/null +++ b/code/modules/surgery/operations/operation_lobotomy.dm @@ -0,0 +1,97 @@ +/datum/surgery_operation/organ/lobotomy + name = "lobotomize" + rnd_name = "Lobotomy (Lobotomy)" + desc = "Repair most of a patient's brain traumas, with the risk of causing new permanent traumas." + rnd_desc = "An invasive surgical procedure which guarantees removal of almost all brain traumas, but might cause another permanent trauma in return." + operation_flags = OPERATION_MORBID | OPERATION_AFFECTS_MOOD | OPERATION_LOCKED | OPERATION_NOTABLE + implements = list( + TOOL_SCALPEL = 1.15, + /obj/item/melee/energy/sword = 0.55, + /obj/item/knife = 2.85, + /obj/item/shard = 4, + /obj/item = 5, + ) + target_type = /obj/item/organ/brain + required_organ_flag = ORGAN_TYPE_FLAGS & ~ORGAN_ROBOTIC + preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' + success_sound = 'sound/items/handling/surgery/scalpel2.ogg' + failure_sound = 'sound/items/handling/surgery/organ2.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED|SURGERY_BONE_SAWED + +/datum/surgery_operation/organ/lobotomy/get_any_tool() + return "Any sharp edged item" + +/datum/surgery_operation/organ/lobotomy/tool_check(obj/item/tool) + // Require edged sharpness OR a tool behavior match + return ((tool.get_sharpness() & SHARP_EDGED) || implements[tool.tool_behaviour]) + +/datum/surgery_operation/organ/lobotomy/on_preop(obj/item/organ/brain/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You begin to perform a lobotomy on [organ.owner]'s brain..."), + span_notice("[surgeon] begins to perform a lobotomy on [organ.owner]'s brain."), + span_notice("[surgeon] begins to perform surgery on [organ.owner]'s brain."), + ) + display_pain(organ.owner, "Your head pounds with unimaginable pain!") + +/datum/surgery_operation/organ/lobotomy/on_success(obj/item/organ/brain/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You successfully perform a lobotomy on [organ.owner]!"), + span_notice("[surgeon] successfully lobotomizes [organ.owner]!"), + span_notice("[surgeon] finishes performing surgery on [organ.owner]'s brain."), + ) + display_pain(organ.owner, "Your head goes totally numb for a moment, the pain is overwhelming!") + + organ.cure_all_traumas(TRAUMA_RESILIENCE_LOBOTOMY) + organ.owner.mind?.remove_antag_datum(/datum/antagonist/brainwashed) + if(!prob(75)) + return + switch(rand(1, 3))//Now let's see what hopefully-not-important part of the brain we cut off + if(1) + organ.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_MAGIC) + if(2) + if(HAS_TRAIT(organ.owner, TRAIT_SPECIAL_TRAUMA_BOOST) && prob(50)) + organ.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) + else + organ.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_MAGIC) + if(3) + organ.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) + +/datum/surgery_operation/organ/lobotomy/on_failure(obj/item/organ/brain/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_warning("You remove the wrong part, causing more damage!"), + span_notice("[surgeon] unsuccessfully attempts to lobotomize [organ.owner]!"), + span_notice("[surgeon] completes the surgery on [organ.owner]'s brain."), + ) + display_pain(organ.owner, "The pain in your head only seems to get worse!") + organ.apply_organ_damage(80) + switch(rand(1, 3)) + if(1) + organ.owner.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_MAGIC) + if(2) + if(HAS_TRAIT(organ.owner, TRAIT_SPECIAL_TRAUMA_BOOST) && prob(50)) + organ.owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) + else + organ.owner.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_MAGIC) + if(3) + organ.owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) + +/datum/surgery_operation/organ/lobotomy/mechanic + name = "execute neural defragging" + rnd_name = "Wetware OS Destructive Defragmentation (Lobotomy)" + implements = list( + TOOL_MULTITOOL = 1.15, + /obj/item/melee/energy/sword = 1.85, + /obj/item/knife = 2.85, + /obj/item/shard = 4, + /obj/item = 5, + ) + preop_sound = 'sound/items/taperecorder/tape_flip.ogg' + success_sound = 'sound/items/taperecorder/taperecorder_close.ogg' + required_organ_flag = ORGAN_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC diff --git a/code/modules/surgery/operations/operation_organ_manip.dm b/code/modules/surgery/operations/operation_organ_manip.dm new file mode 100644 index 000000000000..2c72e659a194 --- /dev/null +++ b/code/modules/surgery/operations/operation_organ_manip.dm @@ -0,0 +1,282 @@ +#define OPERATION_REMOVED_ORGAN "removed_organ" + +/// Adding or removing specific organs +/datum/surgery_operation/limb/organ_manipulation + name = "organ manipulation" + abstract_type = /datum/surgery_operation/limb/organ_manipulation + operation_flags = OPERATION_MORBID | OPERATION_NOTABLE + required_bodytype = ~BODYTYPE_ROBOTIC + /// Radial slice datums for every organ type we can manipulate + VAR_PRIVATE/list/cached_organ_manipulation_options + + /// Sound played when starting to insert an organ + var/insert_preop_sound = 'sound/items/handling/surgery/organ2.ogg' + /// Sound played when starting to remove an organ + var/remove_preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' + /// Sound played when successfully inserting an organ + var/insert_success_sound = 'sound/items/handling/surgery/organ1.ogg' + /// Sound played when successfully removing an organ + var/remove_success_sound = 'sound/items/handling/surgery/organ2.ogg' + + /// Implements used to insert organs + var/list/insert_implements = list( + /obj/item/organ = 1, + ) + /// Implements used to remove organs + var/list/remove_implements = list( + TOOL_HEMOSTAT = 1, + TOOL_CROWBAR = 1.8, + /obj/item/kitchen/fork = 2.85, + ) + +/datum/surgery_operation/limb/organ_manipulation/New() + . = ..() + implements = remove_implements + insert_implements + +/datum/surgery_operation/limb/organ_manipulation/get_recommended_tool() + return "[..()] / organ" + +/datum/surgery_operation/limb/organ_manipulation/get_default_radial_image() + return image('icons/obj/medical/surgery_ui.dmi', "surgery_any") + +/// Checks that the passed organ can be inserted/removed +/datum/surgery_operation/limb/organ_manipulation/proc/organ_check(obj/item/bodypart/limb, obj/item/organ/organ) + return TRUE + +/// Checks that the passed organ can be inserted/removed in the specified zones +/datum/surgery_operation/limb/organ_manipulation/proc/zone_check(obj/item/organ/organ, limb_zone, operated_zone) + SHOULD_CALL_PARENT(TRUE) + + if(LAZYLEN(organ.valid_zones)) + // allows arm implants to be inserted into either arm + if(!(limb_zone in organ.valid_zones)) + return FALSE + // but disallows arm implants from being inserted into the torso + if(!(operated_zone in organ.valid_zones)) + return FALSE + else + // allows appendixes to be inserted into chest + if(limb_zone != deprecise_zone(organ.zone)) + return FALSE + // but disallows appendixes from being inserted into the chest cavity + if(operated_zone != organ.zone) + return FALSE + + return TRUE + +/// Get a list of organs that can be removed from the limb in the specified zone +/datum/surgery_operation/limb/organ_manipulation/proc/get_removable_organs(obj/item/bodypart/limb, operated_zone) + var/list/removable_organs = list() + for(var/obj/item/organ/organ in limb) + if(!organ_check(limb, organ) || (organ.organ_flags & ORGAN_UNREMOVABLE)) + continue + if(!zone_check(organ, limb.body_zone, operated_zone)) + continue + removable_organs += organ + + return removable_organs + +/// Check if removing an organ is possible +/datum/surgery_operation/limb/organ_manipulation/proc/is_remove_available(obj/item/bodypart/limb, operated_zone) + return length(get_removable_organs(limb, operated_zone)) > 0 + +/// Check if inserting an organ is possible +/datum/surgery_operation/limb/organ_manipulation/proc/is_insert_available(obj/item/bodypart/limb, obj/item/organ/organ, operated_zone) + if(!organ_check(limb, organ) || (organ.organ_flags & ORGAN_UNUSABLE)) + return FALSE + + for(var/obj/item/organ/other_organ in limb) + if(other_organ.slot == organ.slot) + return FALSE + + if(!zone_check(organ, limb.body_zone, operated_zone)) + return FALSE + + return TRUE + +/datum/surgery_operation/limb/organ_manipulation/snowflake_check_availability(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, operated_zone) + return isorgan(tool) ? is_insert_available(limb, tool, operated_zone) : is_remove_available(limb, operated_zone) + +/datum/surgery_operation/limb/organ_manipulation/get_radial_options(obj/item/bodypart/limb, obj/item/tool, operating_zone) + return isorgan(tool) ? get_insert_options(limb, tool, operating_zone) : get_remove_options(limb, operating_zone) + +/datum/surgery_operation/limb/organ_manipulation/proc/get_remove_options(obj/item/bodypart/limb, operating_zone) + var/list/options = list() + for(var/obj/item/organ/organ as anything in get_removable_organs(limb, operating_zone)) + var/datum/radial_menu_choice/option = LAZYACCESS(cached_organ_manipulation_options, "[organ.type]_remove") + if(!option) + option = new() + option.image = get_generic_limb_radial_image(limb.body_zone) + option.image.overlays += add_radial_overlays(organ.type) + option.name = "remove [initial(organ.name)]" + option.info = "Remove [initial(organ.name)] from the patient." + LAZYSET(cached_organ_manipulation_options, "[organ.type]_remove", option) + + options[option] = list("[OPERATION_ACTION]" = "remove", "[OPERATION_REMOVED_ORGAN]" = organ) + + return options + +/datum/surgery_operation/limb/organ_manipulation/proc/get_insert_options(obj/item/bodypart/limb, obj/item/organ/organ) + var/datum/radial_menu_choice/option = LAZYACCESS(cached_organ_manipulation_options, "[organ.type]_insert") + if(!option) + option = new() + option.image = get_generic_limb_radial_image(limb.body_zone) + option.image.overlays += add_radial_overlays(list(image('icons/hud/screen_gen.dmi', "arrow_large_still"), organ.type)) + option.name = "insert [initial(organ.name)]" + option.info = "insert [initial(organ.name)] into the patient." + LAZYSET(cached_organ_manipulation_options, "[organ.type]_insert", option) + + var/list/result = list() + result[option] = list("[OPERATION_ACTION]" = "insert") + return result + +/datum/surgery_operation/limb/organ_manipulation/operate_check(mob/living/patient, obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + if(!..()) + return FALSE + + switch(operation_args[OPERATION_ACTION]) + if("remove") + var/obj/item/organ/organ = operation_args[OPERATION_REMOVED_ORGAN] + if(QDELETED(organ) || !(organ in limb)) + return FALSE + if("insert") + var/obj/item/organ/organ = tool + for(var/obj/item/organ/existing_organ in limb) + if(existing_organ.slot == organ.slot) + return FALSE + + return TRUE + +/datum/surgery_operation/limb/organ_manipulation/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + switch(operation_args[OPERATION_ACTION]) + if("remove") + var/obj/item/organ = operation_args[OPERATION_REMOVED_ORGAN] + play_operation_sound(limb, surgeon, tool, remove_preop_sound) + display_results( + surgeon, + limb.owner, + span_notice("You begin to remove [organ.name] from [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to remove [organ.name] from [limb.owner]."), + span_notice("[surgeon] begins to remove something from [limb.owner]."), + ) + display_pain(limb.owner, "You feel a tugging sensation in your [limb.plaintext_zone]!") + if("insert") + play_operation_sound(limb, surgeon, tool, insert_preop_sound) + display_results( + surgeon, + limb.owner, + span_notice("You begin to insert [tool.name] into [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to insert [tool.name] into [limb.owner]."), + span_notice("[surgeon] begins to insert something into [limb.owner]."), + ) + display_pain(limb.owner, "You can feel something being placed in your [limb.plaintext_zone]!") + +/datum/surgery_operation/limb/organ_manipulation/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + switch(operation_args[OPERATION_ACTION]) + if("remove") + play_operation_sound(limb, surgeon, tool, remove_success_sound) + on_success_remove_organ(limb, surgeon, operation_args[OPERATION_REMOVED_ORGAN], tool) + if("insert") + play_operation_sound(limb, surgeon, tool, insert_success_sound) + on_success_insert_organ(limb, surgeon, tool) + if(HAS_MIND_TRAIT(surgeon, TRAIT_MORBID)) + surgeon.add_mood_event("morbid_abominable_surgery_success", /datum/mood_event/morbid_abominable_surgery_success) + +/datum/surgery_operation/limb/organ_manipulation/proc/on_success_remove_organ(obj/item/bodypart/limb, mob/living/surgeon, obj/item/organ/organ, obj/item/tool) + display_results( + surgeon, + limb.owner, + span_notice("You successfully extract [organ.name] from [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] successfully extracts [organ.name] from [limb.owner]'s [limb.plaintext_zone]!"), + span_notice("[surgeon] successfully extracts something from [limb.owner]'s [limb.plaintext_zone]!"), + ) + display_pain(limb.owner, "Your [limb.plaintext_zone] throbs with pain, you can't feel your [organ.name] anymore!") + log_combat(surgeon, limb.owner, "surgically removed [organ.name] from") + organ.Remove(limb.owner) + organ.forceMove(limb.owner.drop_location()) + organ.on_surgical_removal(surgeon, limb, tool) + +/datum/surgery_operation/limb/organ_manipulation/proc/on_success_insert_organ(obj/item/bodypart/limb, mob/living/surgeon, obj/item/organ/organ) + surgeon.temporarilyRemoveItemFromInventory(organ, TRUE) + organ.pre_surgical_insertion(surgeon, limb, limb.body_zone) + organ.Insert(limb.owner) + organ.on_surgical_insertion(surgeon, limb, organ) + display_results( + surgeon, + limb.owner, + span_notice("You successfully insert [organ.name] into [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] successfully inserts [organ.name] into [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] successfully inserts something into [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "Your [limb.plaintext_zone] throbs with pain as your new [organ.name] comes to life!") + +/datum/surgery_operation/limb/organ_manipulation/internal + name = "internal organ manipulation" + desc = "Manipulate a patient's internal organs." + replaced_by = /datum/surgery_operation/limb/organ_manipulation/internal/abductor + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_ORGANS_CUT + + var/bone_locked_organs = "the brain or any chest organs" + +/datum/surgery_operation/limb/organ_manipulation/internal/organ_check(obj/item/bodypart/limb, obj/item/organ/organ) + if(organ.organ_flags & ORGAN_EXTERNAL) + return FALSE + // chest organs and the brain require bone sawed + if(organ.zone == BODY_ZONE_CHEST || organ.slot == ORGAN_SLOT_BRAIN) + return !LIMB_HAS_BONES(limb) || LIMB_HAS_SURGERY_STATE(limb, SURGERY_BONE_SAWED) + return TRUE + +/datum/surgery_operation/limb/organ_manipulation/internal/any_required_strings() + return ..() + list( + "if operating on [bone_locked_organs], the bone MUST be sawed", + "otherwise, the state of the bone doesn't matter", + ) + +/datum/surgery_operation/limb/organ_manipulation/internal/mechanic + name = "prosthetic organ manipulation" + required_bodytype = BODYTYPE_ROBOTIC + remove_implements = list( + TOOL_CROWBAR = 1, + TOOL_HEMOSTAT = 1, + /obj/item/kitchen/fork = 2.85, + ) + operation_flags = parent_type::operation_flags | OPERATION_SELF_OPERABLE | OPERATION_MECHANIC + +/// Abductor subtype that works through clothes and lets you extract the heart without sawing bones +/datum/surgery_operation/limb/organ_manipulation/internal/abductor + name = "experimental organ manipulation" + operation_flags = parent_type::operation_flags | OPERATION_IGNORE_CLOTHES | OPERATION_LOCKED | OPERATION_NO_WIKI + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED + bone_locked_organs = "the brain or any chest organs EXCLUDING the heart" + +/datum/surgery_operation/limb/organ_manipulation/internal/abductor/organ_check(obj/item/bodypart/limb, obj/item/organ/organ) + return (organ.slot == ORGAN_SLOT_HEART) || ..() // Hearts can always be removed, it doesn't check for bone state + +// All external organ manipulation requires bones sawed +/datum/surgery_operation/limb/organ_manipulation/external + name = "feature manipulation" + desc = "Manipulate features of the patient, such as a moth's wings or a lizard's tail." + replaced_by = /datum/surgery_operation/limb/organ_manipulation/external/abductor + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED|SURGERY_BONE_SAWED + +/datum/surgery_operation/limb/organ_manipulation/external/organ_check(obj/item/bodypart/limb, obj/item/organ/organ) + return (organ.organ_flags & ORGAN_EXTERNAL) + +/datum/surgery_operation/limb/organ_manipulation/external/mechanic + name = "prosthetic feature manipulation" + required_bodytype = BODYTYPE_ROBOTIC + remove_implements = list( + TOOL_CROWBAR = 1, + TOOL_HEMOSTAT = 1, + /obj/item/kitchen/fork = 2.85, + ) + operation_flags = parent_type::operation_flags | OPERATION_SELF_OPERABLE + replaced_by = null + +/// Abductor subtype that works through clothes +/datum/surgery_operation/limb/organ_manipulation/external/abductor + name = "experimental feature manipulation" + operation_flags = parent_type::operation_flags | OPERATION_IGNORE_CLOTHES | OPERATION_LOCKED | OPERATION_NO_WIKI + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED + +#undef OPERATION_REMOVED_ORGAN diff --git a/code/modules/surgery/operations/operation_organ_repair.dm b/code/modules/surgery/operations/operation_organ_repair.dm new file mode 100644 index 000000000000..2fa6a8d68622 --- /dev/null +++ b/code/modules/surgery/operations/operation_organ_repair.dm @@ -0,0 +1,529 @@ +/// Repairing specific organs +/datum/surgery_operation/organ/repair + abstract_type = /datum/surgery_operation/organ/repair + name = "repair organ" + desc = "Repair a patient's damaged organ." + required_organ_flag = ORGAN_TYPE_FLAGS & ~ORGAN_ROBOTIC + operation_flags = OPERATION_AFFECTS_MOOD | OPERATION_NOTABLE + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_ORGANS_CUT|SURGERY_BONE_SAWED + /// What % damage do we heal the organ to on success + /// Note that 0% damage = 100% health + var/heal_to_percent = 0.6 + /// What % damage do we apply to the organ on failure + var/failure_damage_percent = 0.2 + /// If TRUE, an organ can be repaired multiple times + var/repeatable = FALSE + +/datum/surgery_operation/organ/repair/New() + . = ..() + if(operation_flags & OPERATION_LOOPING) + repeatable = TRUE // if it's looping it would necessitate being repeatable + if(!repeatable) + desc += " This procedure can only be performed once per organ." + +/datum/surgery_operation/organ/repair/state_check(obj/item/organ/organ) + if(organ.damage < (organ.maxHealth * heal_to_percent) || (!repeatable && HAS_TRAIT(organ, TRAIT_ORGAN_OPERATED_ON))) + return FALSE // conditionally available so we don't spam the radial with useless options, alas + return TRUE + +/datum/surgery_operation/organ/repair/all_required_strings() + . = ..() + if(!repeatable) + . += "the organ must be moderately damaged" + +/datum/surgery_operation/organ/repair/all_blocked_strings() + . = ..() + if(!repeatable) + . += "the organ must not have been surgically repaired prior" + +/datum/surgery_operation/organ/repair/on_success(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + organ.set_organ_damage(organ.maxHealth * heal_to_percent) + organ.organ_flags &= ~ORGAN_EMP + ADD_TRAIT(organ, TRAIT_ORGAN_OPERATED_ON, TRAIT_GENERIC) + +/datum/surgery_operation/organ/repair/on_failure(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + organ.apply_organ_damage(organ.maxHealth * failure_damage_percent) + +/datum/surgery_operation/organ/repair/lobectomy + name = "excise damaged lung lobe" + rnd_name = "Lobectomy (Lung Surgery)" + desc = "Perform repairs to a patient's damaged lung by excising the most damaged lobe." + implements = list( + TOOL_SCALPEL = 1.05, + /obj/item/melee/energy/sword = 1.5, + /obj/item/knife = 2.25, + /obj/item/shard = 2.85, + ) + time = 4.2 SECONDS + preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' + success_sound = 'sound/items/handling/surgery/organ1.ogg' + failure_sound = 'sound/items/handling/surgery/organ2.ogg' + target_type = /obj/item/organ/lungs + failure_damage_percent = 0.1 + +/datum/surgery_operation/organ/repair/lobectomy/on_preop(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You begin to make an incision in [organ.owner]'s lungs..."), + span_notice("[surgeon] begins to make an incision in [organ.owner]."), + span_notice("[surgeon] begins to make an incision in [organ.owner]."), + ) + display_pain(organ.owner, "You feel a stabbing pain in your chest!") + +/datum/surgery_operation/organ/repair/lobectomy/on_success(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + display_results( + surgeon, + organ.owner, + span_notice("You successfully excise [organ.owner]'s most damaged lobe."), + span_notice("[surgeon] successfully excises [organ.owner]'s most damaged lobe."), + span_notice("[surgeon] successfully excises [organ.owner]'s most damaged lobe."), + ) + +/datum/surgery_operation/organ/repair/lobectomy/on_failure(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + organ.owner.losebreath += 4 + display_results( + surgeon, + organ.owner, + span_warning("You screw up, failing to excise [organ.owner]'s damaged lobe!"), + span_warning("[surgeon] screws up!"), + span_warning("[surgeon] screws up!"), + ) + display_pain(organ.owner, "You feel a sharp stab in your chest; the wind is knocked out of you and it hurts to catch your breath!") + +/datum/surgery_operation/organ/repair/lobectomy/mechanic + name = "perform maintenance" + rnd_name = "Air Filtration Diagnostic (Lung Surgery)" + implements = list( + TOOL_WRENCH = 1.05, + TOOL_SCALPEL = 1.05, + /obj/item/melee/energy/sword = 1.5, + /obj/item/knife = 2.25, + /obj/item/shard = 2.85, + ) + preop_sound = 'sound/items/tools/ratchet.ogg' + success_sound = 'sound/machines/airlock/doorclick.ogg' + required_organ_flag = ORGAN_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC + +/datum/surgery_operation/organ/repair/hepatectomy + name = "remove damaged liver section" + rnd_name = "Hepatectomy (Liver Surgery)" + desc = "Perform repairs to a patient's damaged liver by removing the most damaged section." + implements = list( + TOOL_SCALPEL = 1.05, + /obj/item/melee/energy/sword = 1.5, + /obj/item/knife = 2.25, + /obj/item/shard = 2.85, + ) + time = 5.2 SECONDS + preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' + success_sound = 'sound/items/handling/surgery/organ1.ogg' + failure_sound = 'sound/items/handling/surgery/organ2.ogg' + target_type = /obj/item/organ/liver + heal_to_percent = 0.1 + failure_damage_percent = 0.15 + +/datum/surgery_operation/organ/repair/hepatectomy/on_preop(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You begin to cut out a damaged piece of [organ.owner]'s liver..."), + span_notice("[surgeon] begins to make an incision in [organ.owner]."), + span_notice("[surgeon] begins to make an incision in [organ.owner]."), + ) + display_pain(organ.owner, "Your abdomen burns in horrific stabbing pain!") + +/datum/surgery_operation/organ/repair/hepatectomy/on_success(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + display_results( + surgeon, + organ.owner, + span_notice("You successfully remove the damaged part of [organ.owner]'s liver."), + span_notice("[surgeon] successfully removes the damaged part of [organ.owner]'s liver."), + span_notice("[surgeon] successfully removes the damaged part of [organ.owner]'s liver."), + ) + display_pain(organ.owner, "The pain receeds slightly!") + +/datum/surgery_operation/organ/repair/hepatectomy/on_failure(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + display_results( + surgeon, + organ.owner, + span_warning("You cut the wrong part of [organ.owner]'s liver!"), + span_warning("[surgeon] cuts the wrong part of [organ.owner]'s liver!"), + span_warning("[surgeon] cuts the wrong part of [organ.owner]'s liver!"), + ) + display_pain(organ.owner, "The pain in your abdomen intensifies!") + +/datum/surgery_operation/organ/repair/hepatectomy/mechanic + name = "perform maintenance" + rnd_name = "Impurity Management System Diagnostic (Liver Surgery)" + implements = list( + TOOL_WRENCH = 1.05, + TOOL_SCALPEL = 1.05, + /obj/item/melee/energy/sword = 1.5, + /obj/item/knife = 2.25, + /obj/item/shard = 2.85, + ) + preop_sound = 'sound/items/tools/ratchet.ogg' + success_sound = 'sound/machines/airlock/doorclick.ogg' + required_organ_flag = ORGAN_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC + +/datum/surgery_operation/organ/repair/coronary_bypass + name = "graft coronary bypass" + rnd_name = "Coronary Artery Bypass Graft (Heart Surgery)" + desc = "Graft a bypass onto a patient's damaged heart to restore proper blood flow." + implements = list( + TOOL_HEMOSTAT = 1.05, + TOOL_WIRECUTTER = 2.85, + /obj/item/stack/package_wrap = 6.67, + /obj/item/stack/cable_coil = 2, + ) + time = 9 SECONDS + preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' + success_sound = 'sound/items/handling/surgery/hemostat1.ogg' + failure_sound = 'sound/items/handling/surgery/organ2.ogg' + target_type = /obj/item/organ/heart + +/datum/surgery_operation/organ/repair/coronary_bypass/on_preop(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You begin to graft a bypass onto [organ.owner]'s heart..."), + span_notice("[surgeon] begins to graft a bypass onto [organ.owner]'s heart."), + span_notice("[surgeon] begins to graft a bypass onto [organ.owner]'s heart."), + ) + display_pain(organ.owner, "The pain in your chest is unbearable! You can barely take it anymore!") + +/datum/surgery_operation/organ/repair/coronary_bypass/on_success(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + display_results( + surgeon, + organ.owner, + span_notice("You successfully graft a bypass onto [organ.owner]'s heart."), + span_notice("[surgeon] successfully grafts a bypass onto [organ.owner]'s heart."), + span_notice("[surgeon] successfully grafts a bypass onto [organ.owner]'s heart."), + ) + display_pain(organ.owner, "The pain in your chest throbs, but your heart feels better than ever!") + +/datum/surgery_operation/organ/repair/coronary_bypass/on_failure(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + organ.bodypart_owner.adjustBleedStacks(30) + var/blood_name = LOWER_TEXT(organ.owner.get_bloodtype()?.get_blood_name()) || "blood" + display_results( + surgeon, + organ.owner, + span_warning("You screw up in attaching the graft, and it tears off, tearing part of the heart!"), + span_warning("[surgeon] screws up, causing [blood_name] to spurt out of [organ.owner]'s chest profusely!"), + span_warning("[surgeon] screws up, causing [blood_name] to spurt out of [organ.owner]'s chest profusely!"), + ) + display_pain(organ.owner, "Your chest burns; you feel like you're going insane!") + +/datum/surgery_operation/organ/repair/coronary_bypass/mechanic + name = "access engine internals" + rnd_name = "Engine Diagnostic (Heart Surgery)" + implements = list( + TOOL_CROWBAR = 1.05, + TOOL_SCALPEL = 1.05, + /obj/item/melee/energy/sword = 1.5, + /obj/item/knife = 2.25, + /obj/item/shard = 2.85, + ) + preop_sound = 'sound/items/tools/ratchet.ogg' + success_sound = 'sound/machines/airlock/doorclick.ogg' + required_organ_flag = ORGAN_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC + +/datum/surgery_operation/organ/repair/gastrectomy + name = "remove damaged stomach section" + rnd_name = "Gastrectomy (Stomach Surgery)" + desc = "Perform repairs to a patient's stomach by removing a damaged section." + implements = list( + TOOL_SCALPEL = 1.05, + /obj/item/melee/energy/sword = 1.5, + /obj/item/knife = 2.25, + /obj/item/shard = 2.85, + /obj/item = 4, + ) + time = 5.2 SECONDS + preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' + success_sound = 'sound/items/handling/surgery/organ1.ogg' + failure_sound = 'sound/items/handling/surgery/organ2.ogg' + target_type = /obj/item/organ/stomach + heal_to_percent = 0.2 + failure_damage_percent = 0.15 + +/datum/surgery_operation/organ/repair/gastrectomy/get_any_tool() + return "Any sharp edged item" + +/datum/surgery_operation/organ/repair/gastrectomy/tool_check(obj/item/tool) + // Require edged sharpness OR a tool behavior match + return ((tool.get_sharpness() & SHARP_EDGED) || implements[tool.tool_behaviour]) + +/datum/surgery_operation/organ/repair/gastrectomy/on_preop(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You begin to cut out a damaged piece of [organ.owner]'s stomach..."), + span_notice("[surgeon] begins to make an incision in [organ.owner]."), + span_notice("[surgeon] begins to make an incision in [organ.owner]."), + ) + display_pain(organ.owner, "You feel a horrible stab in your gut!") + +/datum/surgery_operation/organ/repair/gastrectomy/on_success(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + display_results( + surgeon, + organ.owner, + span_notice("You successfully remove the damaged part of [organ.owner]'s stomach."), + span_notice("[surgeon] successfully removes the damaged part of [organ.owner]'s stomach."), + span_notice("[surgeon] successfully removes the damaged part of [organ.owner]'s stomach."), + ) + display_pain(organ.owner, "The pain in your gut receeds slightly!") + +/datum/surgery_operation/organ/repair/gastrectomy/on_failure(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + display_results( + surgeon, + organ.owner, + span_warning("You cut the wrong part of [organ.owner]'s stomach!"), + span_warning("[surgeon] cuts the wrong part of [organ.owner]'s stomach!"), + span_warning("[surgeon] cuts the wrong part of [organ.owner]'s stomach!"), + ) + display_pain(organ.owner, "The pain in your gut intensifies!") + +/datum/surgery_operation/organ/repair/gastrectomy/mechanic + name = "perform maintenance" + rnd_name = "Nutrient Processing System Diagnostic (Stomach Surgery)" + implements = list( + TOOL_WRENCH = 1.05, + TOOL_SCALPEL = 1.05, + /obj/item/melee/energy/sword = 1.5, + /obj/item/knife = 2.25, + /obj/item/shard = 2.85, + /obj/item = 4, + ) + preop_sound = 'sound/items/tools/ratchet.ogg' + success_sound = 'sound/machines/airlock/doorclick.ogg' + required_organ_flag = ORGAN_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC + +/datum/surgery_operation/organ/repair/ears + name = "ear surgery" + rnd_name = "Ototomy (Ear surgery)" // source: i made it up + desc = "Repair a patient's damaged ears to restore hearing." + operation_flags = parent_type::operation_flags & ~OPERATION_AFFECTS_MOOD + implements = list( + TOOL_HEMOSTAT = 1.05, + TOOL_SCREWDRIVER = 2.25, + /obj/item/pen = 4, + ) + target_type = /obj/item/organ/ears + time = 6.4 SECONDS + heal_to_percent = 0 + repeatable = TRUE + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED + +/datum/surgery_operation/organ/repair/ears/all_blocked_strings() + return ..() + list("if the limb has bones, they must be intact") + +/datum/surgery_operation/organ/repair/ears/state_check(obj/item/organ/ears/organ) + // If bones are sawed, prevent the operation (unless we're operating on a limb with no bones) + if(LIMB_HAS_ANY_SURGERY_STATE(organ.bodypart_owner, SURGERY_BONE_SAWED|SURGERY_BONE_DRILLED) && LIMB_HAS_BONES(organ.bodypart_owner)) + return FALSE + return TRUE // always available so you can intentionally fail it + +/datum/surgery_operation/organ/repair/ears/on_preop(obj/item/organ/ears/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You begin to fix [organ.owner]'s ears..."), + span_notice("[surgeon] begins to fix [organ.owner]'s ears."), + span_notice("[surgeon] begins to perform surgery on [organ.owner]'s ears."), + ) + display_pain(organ.owner, "You feel a dizzying pain in your head!") + +/datum/surgery_operation/organ/repair/ears/on_success(obj/item/organ/ears/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + var/deaf_change = 40 SECONDS - organ.temporary_deafness + organ.adjust_temporary_deafness(deaf_change) + display_results( + surgeon, + organ.owner, + span_notice("You successfully fix [organ.owner]'s ears."), + span_notice("[surgeon] successfully fixes [organ.owner]'s ears."), + span_notice("[surgeon] successfully fixes [organ.owner]'s ears."), + ) + display_pain(organ.owner, "Your head swims, but it seems like you can feel your hearing coming back!") + +/datum/surgery_operation/organ/repair/ears/on_failure(obj/item/organ/ears/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + var/obj/item/organ/brain/brain = locate() in organ.bodypart_owner + if(brain) + display_results( + surgeon, + organ.owner, + span_warning("You accidentally stab [organ.owner] right in the brain!"), + span_warning("[surgeon] accidentally stabs [organ.owner] right in the brain!"), + span_warning("[surgeon] accidentally stabs [organ.owner] right in the brain!"), + ) + display_pain(organ.owner, "You feel a visceral stabbing pain right through your head, into your brain!") + organ.owner.adjust_organ_loss(ORGAN_SLOT_BRAIN, 70) + else + display_results( + surgeon, + organ.owner, + span_warning("You accidentally stab [organ.owner] right in the brain! Or would have, if [organ.owner] had a brain."), + span_warning("[surgeon] accidentally stabs [organ.owner] right in the brain! Or would have, if [organ.owner] had a brain."), + span_warning("[surgeon] accidentally stabs [organ.owner] right in the brain!"), + ) + +/datum/surgery_operation/organ/repair/eyes + name = "eye surgery" + rnd_name = "Vitrectomy (Eye Surgery)" + desc = "Repair a patient's damaged eyes to restore vision." + operation_flags = parent_type::operation_flags & ~OPERATION_AFFECTS_MOOD + implements = list( + TOOL_HEMOSTAT = 1.05, + TOOL_SCREWDRIVER = 2.25, + /obj/item/pen = 4, + ) + time = 6.4 SECONDS + target_type = /obj/item/organ/eyes + heal_to_percent = 0 + repeatable = TRUE + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED + +/datum/surgery_operation/organ/repair/eyes/all_blocked_strings() + return ..() + list("if the limb has bones, they must be intact") + +/datum/surgery_operation/organ/repair/eyes/state_check(obj/item/organ/organ) + // If bones are sawed, prevent the operation (unless we're operating on a limb with no bones) + if(LIMB_HAS_ANY_SURGERY_STATE(organ.bodypart_owner, SURGERY_BONE_SAWED|SURGERY_BONE_DRILLED) && LIMB_HAS_BONES(organ.bodypart_owner)) + return FALSE + return TRUE // always available so you can intentionally fail it + +/datum/surgery_operation/organ/repair/eyes/get_default_radial_image() + return image(icon = 'icons/obj/medical/surgery_ui.dmi', icon_state = "surgery_eyes") + +/datum/surgery_operation/organ/repair/eyes/on_preop(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You begin to fix [organ.owner]'s eyes..."), + span_notice("[surgeon] begins to fix [organ.owner]'s eyes."), + span_notice("[surgeon] begins to perform surgery on [organ.owner]'s eyes."), + ) + display_pain(organ.owner, "You feel a stabbing pain in your eyes!") + +/datum/surgery_operation/organ/repair/eyes/on_success(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + organ.owner.remove_status_effect(/datum/status_effect/temporary_blindness) + organ.owner.set_eye_blur_if_lower(70 SECONDS) //this will fix itself slowly. + display_results( + surgeon, + organ.owner, + span_notice("You successfully fix [organ.owner]'s eyes."), + span_notice("[surgeon] successfully fixes [organ.owner]'s eyes."), + span_notice("[surgeon] successfully fixes [organ.owner]'s eyes."), + ) + display_pain(organ.owner, "Your vision blurs, but it seems like you can see a little better now!") + +/datum/surgery_operation/organ/repair/eyes/on_failure(obj/item/organ/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + var/obj/item/organ/brain/brain = locate() in organ.bodypart_owner + if(brain) + display_results( + surgeon, + organ.owner, + span_warning("You accidentally stab [organ.owner] right in the brain!"), + span_warning("[surgeon] accidentally stabs [organ.owner] right in the brain!"), + span_warning("[surgeon] accidentally stabs [organ.owner] right in the brain!"), + ) + display_pain(organ.owner, "You feel a visceral stabbing pain right through your head, into your brain!") + organ.owner.adjust_organ_loss(ORGAN_SLOT_BRAIN, 70) + + else + display_results( + surgeon, + organ.owner, + span_warning("You accidentally stab [organ.owner] right in the brain! Or would have, if [organ.owner] had a brain."), + span_warning("[surgeon] accidentally stabs [organ.owner] right in the brain! Or would have, if [organ.owner] had a brain."), + span_warning("[surgeon] accidentally stabs [organ.owner] right in the brain!"), + ) + +/datum/surgery_operation/organ/repair/brain + name = "brain surgery" + rnd_name = "Neurosurgery (Brain Surgery)" + desc = "Repair a patient's damaged brain tissue to restore cognitive function." + implements = list( + TOOL_HEMOSTAT = 1.05, + TOOL_SCREWDRIVER = 2.85, + /obj/item/pen = 6.67, + ) + time = 10 SECONDS + preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' + success_sound = 'sound/items/handling/surgery/hemostat1.ogg' + failure_sound = 'sound/items/handling/surgery/organ2.ogg' + operation_flags = parent_type::operation_flags | OPERATION_LOOPING + target_type = /obj/item/organ/brain + heal_to_percent = 0.25 + failure_damage_percent = 0.3 + repeatable = TRUE + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_BONE_SAWED|SURGERY_VESSELS_CLAMPED + +/datum/surgery_operation/organ/repair/brain/state_check(obj/item/organ/brain/organ) + return TRUE // always available so you can intentionally fail it + +/datum/surgery_operation/organ/repair/brain/on_preop(obj/item/organ/brain/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You begin to fix [organ.owner]'s brain..."), + span_notice("[surgeon] begins to fix [organ.owner]'s brain."), + span_notice("[surgeon] begins to perform surgery on [organ.owner]'s brain."), + ) + display_pain(organ.owner, "Your head pounds with unimaginable pain!") + +/datum/surgery_operation/organ/repair/brain/on_success(obj/item/organ/brain/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + organ.apply_organ_damage(-organ.maxHealth * heal_to_percent) // no parent call, special healing for this one + display_results( + surgeon, + organ.owner, + span_notice("You succeed in fixing [organ.owner]'s brain."), + span_notice("[surgeon] successfully fixes [organ.owner]'s brain!"), + span_notice("[surgeon] completes the surgery on [organ.owner]'s brain."), + ) + display_pain(organ.owner, "The pain in your head receeds, thinking becomes a bit easier!") + organ.owner.mind?.remove_antag_datum(/datum/antagonist/brainwashed) + organ.cure_all_traumas(TRAUMA_RESILIENCE_SURGERY) + if(organ.damage > organ.maxHealth * 0.1) + to_chat(surgeon, "[organ.owner]'s brain looks like it could be fixed further.") + +/datum/surgery_operation/organ/repair/brain/on_failure(obj/item/organ/brain/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + display_results( + surgeon, + organ.owner, + span_warning("You screw up, causing more damage!"), + span_warning("[surgeon] screws up, causing brain damage!"), + span_notice("[surgeon] completes the surgery on [organ.owner]'s brain."), + ) + display_pain(organ.owner, "Your head throbs with horrible pain; thinking hurts!") + organ.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY) + +/datum/surgery_operation/organ/repair/brain/mechanic + name = "perform neural debugging" + rnd_name = "Wetware OS Diagnostics (Brain Surgery)" + implements = list( + TOOL_MULTITOOL = 1.15, + TOOL_HEMOSTAT = 1.05, + TOOL_SCREWDRIVER = 2.85, + /obj/item/pen = 6.67, + ) + preop_sound = 'sound/items/taperecorder/tape_flip.ogg' + success_sound = 'sound/items/taperecorder/taperecorder_close.ogg' + required_organ_flag = ORGAN_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC diff --git a/code/modules/surgery/operations/operation_pacify.dm b/code/modules/surgery/operations/operation_pacify.dm new file mode 100644 index 000000000000..04f6c6c4571f --- /dev/null +++ b/code/modules/surgery/operations/operation_pacify.dm @@ -0,0 +1,69 @@ +/datum/surgery_operation/organ/pacify + name = "pacification" + rnd_name = "Paxopsy (Pacification)" + desc = "Remove aggressive tendencies from a patient's brain." + rnd_desc = "A surgical procedure which permanently inhibits the aggression center of the brain, making the patient unwilling to cause direct harm." + operation_flags = OPERATION_MORBID | OPERATION_LOCKED | OPERATION_NOTABLE + implements = list( + TOOL_HEMOSTAT = 1, + TOOL_SCREWDRIVER = 2.85, + /obj/item/pen = 6.67, + ) + time = 4 SECONDS + preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' + success_sound = 'sound/items/handling/surgery/hemostat1.ogg' + failure_sound = 'sound/items/handling/surgery/organ2.ogg' + required_organ_flag = ORGAN_TYPE_FLAGS & ~ORGAN_ROBOTIC + target_type = /obj/item/organ/brain + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED|SURGERY_BONE_SAWED + +/datum/surgery_operation/organ/pacify/get_default_radial_image() + return image(/atom/movable/screen/alert/status_effect/high::overlay_icon, /atom/movable/screen/alert/status_effect/high::overlay_state) + +/datum/surgery_operation/organ/pacify/on_preop(obj/item/organ/brain/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You begin to pacify [organ.owner]..."), + span_notice("[surgeon] begins to fix [organ.owner]'s brain."), + span_notice("[surgeon] begins to perform surgery on [organ.owner]'s brain."), + ) + display_pain(organ.owner, "Your head pounds with unimaginable pain!") + +/datum/surgery_operation/organ/pacify/on_success(obj/item/organ/brain/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You succeed in pacifying [organ.owner]."), + span_notice("[surgeon] successfully fixes [organ.owner]!"), + span_notice("[surgeon] completes the surgery on [organ.owner]'s brain."), + ) + display_pain(organ.owner, "Your head pounds... the concept of violence flashes in your head, and nearly makes you hurl!") + organ.gain_trauma(/datum/brain_trauma/severe/pacifism, TRAUMA_RESILIENCE_LOBOTOMY) + +/datum/surgery_operation/organ/pacify/on_failure(obj/item/organ/brain/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You screw up, rewiring [organ.owner]'s brain the wrong way around..."), + span_warning("[surgeon] screws up, causing brain damage!"), + span_notice("[surgeon] completes the surgery on [organ.owner]'s brain."), + ) + display_pain(organ.owner, "Your head pounds, and it feels like it's getting worse!") + organ.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY) + +/datum/surgery_operation/organ/pacify/mechanic + name = "delete aggression programming" + rnd_name = "Aggression Suppression Programming (Pacification)" + rnd_desc = "Install malware which permanently inhibits the aggression programming of the patient's neural network, making the patient unwilling to cause direct harm." + implements = list( + TOOL_MULTITOOL = 1, + TOOL_HEMOSTAT = 2.85, + TOOL_SCREWDRIVER = 2.85, + /obj/item/pen = 6.67, + ) + preop_sound = 'sound/items/taperecorder/tape_flip.ogg' + success_sound = 'sound/items/taperecorder/taperecorder_close.ogg' + failure_sound = null + required_organ_flag = ORGAN_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC diff --git a/code/modules/surgery/operations/operation_plastic_surgery.dm b/code/modules/surgery/operations/operation_plastic_surgery.dm new file mode 100644 index 000000000000..c5ca9d364d5a --- /dev/null +++ b/code/modules/surgery/operations/operation_plastic_surgery.dm @@ -0,0 +1,139 @@ +#define OPERATION_NEW_NAME "chosen_name" + +/datum/surgery_operation/limb/plastic_surgery + name = "plastic surgery" + desc = "Reshape or reconstruct a patient's face for cosmetic or functional purposes." + implements = list( + TOOL_SCALPEL = 1, + /obj/item/knife = 2, + TOOL_WIRECUTTER = 2.85, + /obj/item/pen = 5, + ) + time = 6.4 SECONDS + operation_flags = OPERATION_MORBID | OPERATION_AFFECTS_MOOD | OPERATION_NOTABLE + preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' + success_sound = 'sound/items/handling/surgery/scalpel2.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN + +/datum/surgery_operation/limb/plastic_surgery/all_required_strings() + return list("operate on head (target head)") + ..() + +/datum/surgery_operation/limb/plastic_surgery/get_default_radial_image() + return image(/obj/item/scalpel) + +/datum/surgery_operation/limb/plastic_surgery/state_check(obj/item/bodypart/limb) + return limb.body_zone == BODY_ZONE_HEAD + +/datum/surgery_operation/limb/plastic_surgery/pre_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + if(HAS_TRAIT_FROM(limb.owner, TRAIT_DISFIGURED, TRAIT_GENERIC)) + return TRUE //skip name selection if fixing disfigurement + + var/list/names = list() + if(isabductor(surgeon)) + for(var/j in 1 to 9) + names += "Subject [limb.owner.gender == MALE ? "i" : "o"]-[pick("a", "b", "c", "d", "e")]-[rand(10000, 99999)]" + names += limb.owner.generate_random_mob_name(TRUE) //give one normal name in case they want to do regular plastic surgery + + else + var/advanced = LIMB_HAS_SURGERY_STATE(limb, SURGERY_PLASTIC_APPLIED) + var/obj/item/offhand = surgeon.get_inactive_held_item() + if(istype(offhand, /obj/item/photo) && advanced) + var/obj/item/photo/disguises = offhand + for(var/namelist in disguises.picture?.names_seen) + names += namelist + else + if(advanced) + to_chat(surgeon, span_warning("You have no picture to base the appearance on!")) + for(var/i in 1 to 10) + names += limb.owner.generate_random_mob_name(TRUE) + + operation_args[OPERATION_NEW_NAME] = tgui_input_list(surgeon, "New name to assign", "Plastic Surgery", names) + return !!operation_args[OPERATION_NEW_NAME] + +/datum/surgery_operation/limb/plastic_surgery/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to alter [limb.owner]'s appearance..."), + span_notice("[surgeon] begins to alter [limb.owner]'s appearance."), + span_notice("[surgeon] begins to make an incision in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel a slicing pain across your face!") + +/datum/surgery_operation/limb/plastic_surgery/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + if(HAS_TRAIT_FROM(limb.owner, TRAIT_DISFIGURED, TRAIT_GENERIC)) + REMOVE_TRAIT(limb.owner, TRAIT_DISFIGURED, TRAIT_GENERIC) + display_results( + surgeon, + limb.owner, + span_notice("You successfully restore [limb.owner]'s appearance."), + span_notice("[surgeon] successfully restores [limb.owner]'s appearance!"), + span_notice("[surgeon] finishes the operation on [limb.owner]'s face."), + ) + display_pain(limb.owner, "The pain fades, your face feels normal again!") + return + + var/oldname = limb.owner.real_name + limb.owner.real_name = operation_args[OPERATION_NEW_NAME] + var/newname = limb.owner.real_name //something about how the code handles names required that I use this instead of target.real_name + display_results( + surgeon, + limb.owner, + span_notice("You alter [oldname]'s appearance completely, [limb.owner.p_they()] is now [newname]."), + span_notice("[surgeon] alters [oldname]'s appearance completely, [limb.owner.p_they()] is now [newname]!"), + span_notice("[surgeon] finishes the operation on [limb.owner]'s face."), + ) + display_pain(limb.owner, "The pain fades, your face feels new and unfamiliar!") + if(ishuman(limb.owner)) + var/mob/living/carbon/human/human_target = limb.owner + human_target.update_ID_card() + if(HAS_MIND_TRAIT(surgeon, TRAIT_MORBID)) + surgeon.add_mood_event("morbid_abominable_surgery_success", /datum/mood_event/morbid_abominable_surgery_success) + limb.remove_surgical_state(SURGERY_PLASTIC_APPLIED) + +/datum/surgery_operation/limb/plastic_surgery/on_failure(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_warning("Your screw up, leaving [limb.owner]'s appearance disfigured!"), + span_warning("[surgeon] screws up, disfiguring [limb.owner]'s appearance!"), + span_notice("[surgeon] finishes the operation on [limb.owner]'s face."), + ) + display_pain(limb.owner, "Your face feels horribly scarred and deformed!") + ADD_TRAIT(limb.owner, TRAIT_DISFIGURED, TRAIT_GENERIC) + +#undef OPERATION_NEW_NAME + +/datum/surgery_operation/limb/add_plastic + name = "apply plastic" + desc = "Apply plastic to a patient's face to to allow for greater customization in following plastic surgery." + implements = list( + /obj/item/stack/sheet/plastic = 1, + ) + time = 4.8 SECONDS + operation_flags = OPERATION_MORBID | OPERATION_LOCKED + preop_sound = 'sound/effects/blob/blobattack.ogg' + success_sound = 'sound/effects/blob/attackblob.ogg' + failure_sound = 'sound/effects/blob/blobattack.ogg' + all_surgery_states_required = SURGERY_SKIN_OPEN + any_surgery_states_blocked = SURGERY_PLASTIC_APPLIED + +/datum/surgery_operation/limb/add_plastic/get_default_radial_image() + return image(/obj/item/stack/sheet/plastic) + +/datum/surgery_operation/limb/add_plastic/state_check(obj/item/bodypart/limb) + return limb.body_zone == BODY_ZONE_HEAD + +/datum/surgery_operation/limb/add_plastic/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to apply plastic to [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to apply plastic to [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] begins to perform surgery on [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel a strange sensation as something is applied to your face!") + +/datum/surgery_operation/limb/add_plastic/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + . = ..() + limb.add_surgical_state(SURGERY_PLASTIC_APPLIED) diff --git a/code/modules/surgery/operations/operation_pump.dm b/code/modules/surgery/operations/operation_pump.dm new file mode 100644 index 000000000000..d1e7778d30a8 --- /dev/null +++ b/code/modules/surgery/operations/operation_pump.dm @@ -0,0 +1,58 @@ +/datum/surgery_operation/organ/stomach_pump + name = "pump stomach" + rnd_name = "Gastric Lavage (Stomach Pump)" + desc = "Manually pump a patient's stomach to induce vomiting and expel harmful chemicals." + operation_flags = OPERATION_NOTABLE + implements = list( + IMPLEMENT_HAND = 1, + ) + time = 2 SECONDS + required_organ_flag = ORGAN_TYPE_FLAGS & ~ORGAN_ROBOTIC + target_type = /obj/item/organ/stomach + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_ORGANS_CUT + +/datum/surgery_operation/organ/stomach_pump/get_default_radial_image() + return image(/atom/movable/screen/alert/disgusted::overlay_icon, /atom/movable/screen/alert/disgusted::overlay_state) + +/datum/surgery_operation/organ/stomach_pump/all_required_strings() + return ..() + list("the patient must not be husked") + +/datum/surgery_operation/organ/stomach_pump/state_check(obj/item/organ/stomach/organ) + return !HAS_TRAIT(organ.owner, TRAIT_HUSK) + +/datum/surgery_operation/organ/stomach_pump/on_preop(obj/item/organ/stomach/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You begin to pump [organ.owner]'s stomach..."), + span_notice("[surgeon] begins to pump [organ.owner]'s stomach."), + span_notice("[surgeon] begins to press on [organ.owner]'s abdomen."), + ) + display_pain(organ.owner, "You feel a horrible sloshing feeling in your gut! You're going to be sick!") + +/datum/surgery_operation/organ/stomach_pump/on_success(obj/item/organ/stomach/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("[surgeon] forces [organ.owner] to vomit, cleansing their stomach of some chemicals!"), + span_notice("[surgeon] forces [organ.owner] to vomit, cleansing their stomach of some chemicals!"), + span_notice("[surgeon] forces [organ.owner] to vomit!"), + ) + organ.owner.vomit((MOB_VOMIT_MESSAGE | MOB_VOMIT_STUN), lost_nutrition = 20, purge_ratio = 0.67) + +/datum/surgery_operation/organ/stomach_pump/on_failure(obj/item/organ/stomach/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_warning("You screw up, bruising [organ.owner]'s chest!"), + span_warning("[surgeon] screws up, bruising [organ.owner]'s chest!"), + span_warning("[surgeon] screws up!"), + ) + organ.apply_organ_damage(5) + organ.bodypart_owner.receive_damage(5) + +/datum/surgery_operation/organ/stomach_pump/mechanic + name = "purge nutrient processor" + rnd_name = "Nutrient Processor Purge (Stomach Pump)" + required_organ_flag = ORGAN_ROBOTIC + operation_flags = parent_type::operation_flags | OPERATION_MECHANIC diff --git a/code/modules/surgery/operations/operation_puncture.dm b/code/modules/surgery/operations/operation_puncture.dm new file mode 100644 index 000000000000..eebf3bba0c6b --- /dev/null +++ b/code/modules/surgery/operations/operation_puncture.dm @@ -0,0 +1,138 @@ +/datum/surgery_operation/limb/repair_puncture + name = "realign blood vessels" + desc = "Realign a patient's torn blood vessels to prepare for sealing." + implements = list( + TOOL_HEMOSTAT = 1, + TOOL_SCALPEL = 1.15, + TOOL_WIRECUTTER = 2.5, + ) + time = 3 SECONDS + preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' + operation_flags = OPERATION_AFFECTS_MOOD | OPERATION_PRIORITY_NEXT_STEP + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_ORGANS_CUT + +/datum/surgery_operation/limb/repair_puncture/get_default_radial_image() + return image(/obj/item/hemostat) + +/datum/surgery_operation/limb/repair_puncture/all_required_strings() + return list("the limb must have an unoperated puncture wound") + ..() + +/datum/surgery_operation/limb/repair_puncture/state_check(obj/item/bodypart/limb) + var/datum/wound/pierce/bleed/pierce_wound = locate() in limb.wounds + if(isnull(pierce_wound) || pierce_wound.blood_flow <= 0 || pierce_wound.mend_state) + return FALSE + return TRUE + +/datum/surgery_operation/limb/repair_puncture/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to realign the torn blood vessels in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to realign the torn blood vessels in [limb.owner]'s [limb.plaintext_zone] with [tool]."), + span_notice("[surgeon] begins to realign the torn blood vessels in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel a horrible stabbing pain in your [limb.plaintext_zone]!") + +/datum/surgery_operation/limb/repair_puncture/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + var/datum/wound/pierce/bleed/pierce_wound = locate() in limb.wounds + pierce_wound?.adjust_blood_flow(-0.25) + limb.receive_damage(3, wound_bonus = CANT_WOUND, sharpness = tool.get_sharpness(), damage_source = tool) + + if(QDELETED(pierce_wound)) + display_results( + surgeon, + limb.owner, + span_notice("You successfully realign the last of the torn blood vessels in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] successfully realigns the last of the torn blood vessels in [limb.owner]'s [limb.plaintext_zone] with [tool]!"), + span_notice("[surgeon] successfully realigns the last of the torn blood vessels in [limb.owner]'s [limb.plaintext_zone]!"), + ) + return + + pierce_wound?.mend_state = TRUE + display_results( + surgeon, + limb.owner, + span_notice("You successfully realign some of the blood vessels in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] successfully realigns some of the blood vessels in [limb.owner]'s [limb.plaintext_zone] with [tool]!"), + span_notice("[surgeon] successfully realigns some of the blood vessels in [limb.owner]'s [limb.plaintext_zone]!"), + ) + +/datum/surgery_operation/limb/repair_puncture/on_failure(obj/item/bodypart/limb, mob/living/surgeon, tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You jerk apart some of the blood vessels in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] jerks apart some of the blood vessels in [limb.owner]'s [limb.plaintext_zone] with [tool]!"), + span_notice("[surgeon] jerks apart some of the blood vessels in [limb.owner]'s [limb.plaintext_zone]."), + ) + limb.receive_damage(rand(4, 8), wound_bonus = 10, sharpness = SHARP_EDGED, damage_source = tool) + +/datum/surgery_operation/limb/seal_veins + name = "seal blood vessels" + // rnd_name = "Anastomosis (Seal Blood Vessels)" // doctor says this is the term to use but it fits awkwardly + desc = "Seal a patient's now-realigned blood vessels." + implements = list( + TOOL_CAUTERY = 1, + /obj/item/gun/energy/laser = 1.12, + TOOL_WELDER = 1.5, + /obj/item = 3.33, + ) + time = 3.2 SECONDS + preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' + operation_flags = OPERATION_AFFECTS_MOOD | OPERATION_PRIORITY_NEXT_STEP + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_ORGANS_CUT + +/datum/surgery_operation/limb/seal_veins/get_default_radial_image() + return image(/obj/item/cautery) + +/datum/surgery_operation/limb/seal_veins/get_any_tool() + return "Any heat source" + +/datum/surgery_operation/limb/seal_veins/all_required_strings() + return list("the limb must have an operated puncture wound") + ..() + +/datum/surgery_operation/limb/seal_veins/tool_check(obj/item/tool) + if(istype(tool, /obj/item/gun/energy/laser)) + var/obj/item/gun/energy/laser/lasergun = tool + return lasergun.cell?.charge > 0 + + return tool.get_temperature() > 0 + +/datum/surgery_operation/limb/seal_veins/state_check(obj/item/bodypart/limb) + var/datum/wound/pierce/bleed/pierce_wound = locate() in limb.wounds + if(isnull(pierce_wound) || pierce_wound.blood_flow <= 0 || !pierce_wound.mend_state) + return FALSE + return TRUE + +/datum/surgery_operation/limb/seal_veins/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to seal the realigned blood vessels in [limb.owner]'s [limb.plaintext_zone]..."), + span_notice("[surgeon] begins to seal the realigned blood vessels in [limb.owner]'s [limb.plaintext_zone] with [tool]."), + span_notice("[surgeon] begins to seal the realigned blood vessels in [limb.owner]'s [limb.plaintext_zone]."), + ) + display_pain(limb.owner, "You feel a burning sensation in your [limb.plaintext_zone]!") + +/datum/surgery_operation/limb/seal_veins/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + var/datum/wound/pierce/bleed/pierce_wound = locate() in limb.wounds + pierce_wound?.adjust_blood_flow(-0.5) + + if(QDELETED(pierce_wound)) + display_results( + surgeon, + limb.owner, + span_notice("You successfully seal the last of the ruptured blood vessels in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] successfully seals the last of the ruptured blood vessels in [limb.owner]'s [limb.plaintext_zone] with [tool]!"), + span_notice("[surgeon] successfully seals the last of the ruptured blood vessels in [limb.owner]'s [limb.plaintext_zone]!"), + ) + return + + pierce_wound?.mend_state = FALSE + display_results( + surgeon, + limb.owner, + span_notice("You successfully seal some of the blood vessels in [limb.owner]'s [limb.plaintext_zone]."), + span_notice("[surgeon] successfully seals some of the blood vessels in [limb.owner]'s [limb.plaintext_zone] with [tool]!"), + span_notice("[surgeon] successfully seals some of the blood vessels in [limb.owner]'s [limb.plaintext_zone]!"), + ) diff --git a/code/modules/surgery/operations/operation_replace_limb.dm b/code/modules/surgery/operations/operation_replace_limb.dm new file mode 100644 index 000000000000..47f15cf518ef --- /dev/null +++ b/code/modules/surgery/operations/operation_replace_limb.dm @@ -0,0 +1,91 @@ +/datum/surgery_operation/limb/replace_limb + name = "augment limb" + rnd_name = "Augmentation" + desc = "Replace a patient's limb with a robotic or prosthetic one." + operation_flags = OPERATION_NOTABLE + implements = list( + /obj/item/bodypart = 1, + ) + time = 3.2 SECONDS + all_surgery_states_required = SURGERY_SKIN_OPEN + /// Radial slice datums for every augment type + VAR_PRIVATE/list/cached_augment_options + +/datum/surgery_operation/limb/replace_limb/get_recommended_tool() + return "cybernetic limb" + +/datum/surgery_operation/limb/replace_limb/get_default_radial_image() + return image(/obj/item/bodypart/chest/robot) + +/datum/surgery_operation/limb/replace_limb/get_radial_options(obj/item/bodypart/limb, obj/item/tool, operating_zone) + var/datum/radial_menu_choice/option = LAZYACCESS(cached_augment_options, tool.type) + if(!option) + option = new() + option.name = "augment with [initial(tool.name)]" + option.info = "Replace the patient's [initial(limb.name)] with [initial(tool.name)]." + option.image = image(tool.type) + LAZYSET(cached_augment_options, tool.type, option) + + return option + +/datum/surgery_operation/limb/replace_limb/snowflake_check_availability(obj/item/bodypart/limb, mob/living/surgeon, obj/item/bodypart/tool, operated_zone) + if(!surgeon.canUnEquip(tool)) + return FALSE + if(limb.body_zone != tool.body_zone) + return FALSE + if(!tool.can_attach_limb(limb.owner)) + return FALSE + return TRUE + +/datum/surgery_operation/limb/replace_limb/state_check(obj/item/bodypart/limb) + return !HAS_TRAIT(limb.owner, TRAIT_NO_AUGMENTS) && !(limb.bodypart_flags & BODYPART_UNREMOVABLE) + +/datum/surgery_operation/limb/replace_limb/tool_check(obj/item/bodypart/tool) + if(tool.item_flags & (ABSTRACT|DROPDEL|HAND_ITEM)) + return FALSE + if(!isbodypart(tool)) + return FALSE + var/obj/item/bodypart/limb = tool + if(!IS_ROBOTIC_LIMB(limb)) + return FALSE + return TRUE + +/datum/surgery_operation/limb/replace_limb/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/bodypart/tool, list/operation_args) + // purposefully doesn't use plaintext zone for more context on what is being replaced with what + display_results( + surgeon, + limb.owner, + span_notice("You begin to augment [limb.owner]'s [limb.name] with [tool]..."), + span_notice("[surgeon] begins to augment [limb.owner]'s [limb.name] with [tool]."), + span_notice("[surgeon] begins to augment [limb.owner]'s [limb.name]."), + ) + display_pain(limb.owner, "You feel a horrible pain in your [limb.plaintext_zone]!") + +/datum/surgery_operation/limb/replace_limb/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/bodypart/tool, list/operation_args) + if(!surgeon.temporarilyRemoveItemFromInventory(tool)) + return // should never happen + + var/mob/living/patient = limb.owner // owner's about to be nulled + if(!tool.replace_limb(patient)) + display_results( + surgeon, + patient, + span_warning("You can't seem to fit [tool] onto [patient]'s body!"), + span_warning("[surgeon] can't seem to fit [tool] onto [patient]'s body!"), + span_warning("[surgeon] can't seem to fit [tool] onto [patient]'s body!"), + ) + tool.forceMove(patient.drop_location()) + return // could possibly happen + + if(tool.check_for_frankenstein(patient)) + tool.bodypart_flags |= BODYPART_IMPLANTED + + display_results( + surgeon, + patient, + span_notice("You successfully augment [patient]'s [limb.plaintext_zone] with [tool]!"), + span_notice("[surgeon] successfully augments [patient]'s [limb.plaintext_zone] with [tool]!"), + span_notice("[surgeon] finishes augmenting [patient]'s [limb.plaintext_zone]."), + ) + display_pain(patient, "Your [limb.plaintext_zone] comes awash with synthetic sensation!", TRUE) + log_combat(surgeon, patient, "augmented", addition = "by giving him new [tool]") diff --git a/code/modules/surgery/operations/operation_revival.dm b/code/modules/surgery/operations/operation_revival.dm new file mode 100644 index 000000000000..ea6808d8e443 --- /dev/null +++ b/code/modules/surgery/operations/operation_revival.dm @@ -0,0 +1,119 @@ +/datum/surgery_operation/basic/revival + name = "shock brain" + rnd_name = "Brain Defibrillation (Revival)" + desc = "Use a defibrillator to shock a patient's brain back to life." + implements = list( + /obj/item/shockpaddles = 1, + /obj/item/melee/touch_attack/shock = 1, + /obj/item/melee/baton/security = 1.33, + /obj/item/gun/energy = 1.67, + ) + operation_flags = OPERATION_MORBID | OPERATION_NOTABLE + time = 5 SECONDS + preop_sound = list( + /obj/item/shockpaddles = 'sound/machines/defib/defib_charge.ogg', + /obj/item = null, + ) + success_sound = 'sound/machines/defib/defib_zap.ogg' + required_biotype = NONE + target_zone = BODY_ZONE_HEAD + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_BONE_SAWED + +/datum/surgery_operation/basic/revival/get_default_radial_image() + return image(/obj/item/shockpaddles) + +/datum/surgery_operation/basic/revival/all_required_strings() + return ..() + list("the patient must be deceased", "the patient must be in a revivable state") + +/datum/surgery_operation/basic/revival/state_check(mob/living/patient) + if(patient.stat != DEAD) + return FALSE + if(HAS_TRAIT(patient, TRAIT_SUICIDED) || HAS_TRAIT(patient, TRAIT_HUSK) || HAS_TRAIT(patient, TRAIT_DEFIB_BLACKLISTED)) + return FALSE + if(patient.has_limbs) + var/obj/item/organ/brain/brain = patient.get_organ_slot(ORGAN_SLOT_BRAIN) + return !isnull(brain) && brain_check(brain) + return mob_check(patient) + +/datum/surgery_operation/basic/revival/proc/brain_check(obj/item/organ/brain/brain) + return !IS_ROBOTIC_ORGAN(brain) + +/datum/surgery_operation/basic/revival/proc/mob_check(mob/living/patient) + return !(patient.mob_biotypes & MOB_ROBOTIC) + +/datum/surgery_operation/basic/revival/tool_check(obj/item/tool) + if(istype(tool, /obj/item/shockpaddles)) + var/obj/item/shockpaddles/paddles = tool + if((paddles.req_defib && !paddles.defib.powered) || !HAS_TRAIT(paddles, TRAIT_WIELDED) || paddles.cooldown || paddles.busy) + return FALSE + + if(istype(tool, /obj/item/melee/baton/security)) + var/obj/item/melee/baton/security/baton = tool + return baton.active + + if(istype(tool, /obj/item/gun/energy)) + var/obj/item/gun/energy/egun = tool + return istype(egun.chambered, /obj/item/ammo_casing/energy/electrode) + + return TRUE + +/datum/surgery_operation/basic/revival/on_preop(mob/living/patient, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + patient, + span_notice("You prepare to give [patient]'s brain the spark of life with [tool]."), + span_notice("[surgeon] prepares to give [patient]'s brain the spark of life with [tool]."), + span_notice("[surgeon] prepares to give [patient]'s brain the spark of life."), + ) + patient.notify_revival("Someone is trying to zap your brain.", source = patient) + +/datum/surgery_operation/basic/revival/on_success(mob/living/patient, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + patient, + span_notice("You successfully shock [patient]'s brain with [tool]..."), + span_notice("[surgeon] sends a powerful shock to [patient]'s brain with [tool]..."), + span_notice("[surgeon] sends a powerful shock to [patient]'s brain..."), + ) + patient.grab_ghost() + patient.adjust_oxy_loss(-50) + if(iscarbon(patient)) + var/mob/living/carbon/carbon_patient = patient + carbon_patient.set_heartattack(FALSE) + if(!patient.revive()) + on_no_revive(surgeon, patient) + return + + on_revived(surgeon, patient) + +/// Called when you have been successfully raised from the dead +/datum/surgery_operation/basic/revival/proc/on_revived(mob/living/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)) // Contrary to their typical hatred of resurrection, it wouldn't be very thematic if morbid people didn't love playing god + surgeon.add_mood_event("morbid_revival_success", /datum/mood_event/morbid_revival_success) + patient.adjust_organ_loss(ORGAN_SLOT_BRAIN, 15, 180) + +/// Called when revival fails +/datum/surgery_operation/basic/revival/proc/on_no_revive(mob/living/surgeon, mob/living/patient) + patient.visible_message(span_warning("...[patient.p_they()] convulse[patient.p_s()], then lie[patient.p_s()] still.")) + patient.adjust_organ_loss(ORGAN_SLOT_BRAIN, 50, 199) // MAD SCIENCE + +/datum/surgery_operation/basic/revival/on_failure(mob/living/patient, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + patient, + span_warning("You shock [patient]'s brain with [tool], but [patient.p_they()] don't react."), + span_warning("[surgeon] shocks [patient]'s brain with [tool], but [patient.p_they()] don't react."), + span_warning("[surgeon] shocks [patient]'s brain with [tool], but [patient.p_they()] don't react."), + ) + +/datum/surgery_operation/basic/revival/mechanic + name = "full system reboot" + required_biotype = MOB_ROBOTIC + +/datum/surgery_operation/basic/revival/mechanic/brain_check(obj/item/organ/brain/brain) + return !..() + +/datum/surgery_operation/basic/revival/mechanic/mob_check(mob/living/patient) + return !..() diff --git a/code/modules/surgery/operations/operation_virus.dm b/code/modules/surgery/operations/operation_virus.dm new file mode 100644 index 000000000000..6edbc23ff4b0 --- /dev/null +++ b/code/modules/surgery/operations/operation_virus.dm @@ -0,0 +1,69 @@ +/datum/surgery_operation/basic/viral_bonding + name = "viral bonding" + rnd_name = "Viroplasty (Viral Bonding)" + desc = "Force a symbiotic relationship between a patient and a virus it is infected with." + rnd_desc = "A surgical procedure that forces a symbiotic relationship between a virus and its host. \ + The patient will be completely immune to the effects of the virus, but will carry and spread it to others." + implements = list( + TOOL_CAUTERY = 1, + TOOL_WELDER = 2, + /obj/item = 3.33, + ) + time = 10 SECONDS + preop_sound = 'sound/items/handling/surgery/cautery1.ogg' + success_sound = 'sound/items/handling/surgery/cautery2.ogg' + operation_flags = OPERATION_MORBID | OPERATION_LOCKED | OPERATION_NOTABLE + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_ORGANS_CUT + var/list/required_chems = list( + /datum/reagent/medicine/spaceacillin, + /datum/reagent/consumable/virus_food, + /datum/reagent/toxin/formaldehyde, + ) + +/datum/surgery_operation/basic/viral_bonding/get_any_tool() + return "Any heat source" + +/datum/surgery_operation/basic/viral_bonding/all_required_strings() + . = ..() + . += "the patient must have a virus to bond" + for(var/datum/reagent/chem as anything in required_chems) + . += "the patient must be dosed with >1u [chem::name]" + +/datum/surgery_operation/basic/viral_bonding/get_default_radial_image() + return image(/obj/item/clothing/mask/surgical) + +/datum/surgery_operation/basic/viral_bonding/state_check(mob/living/patient) + for(var/chem in required_chems) + if(patient.reagents?.get_reagent_amount(chem) < 1) + return FALSE + for(var/datum/disease/infected_disease as anything in patient.diseases) + if(infected_disease.severity != DISEASE_SEVERITY_UNCURABLE) + return TRUE + return FALSE + +/datum/surgery_operation/basic/viral_bonding/tool_check(obj/item/tool) + return tool.get_temperature() > 0 + +/datum/surgery_operation/basic/viral_bonding/on_preop(mob/living/patient, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + patient, + span_notice("You start heating [patient]'s bone marrow with [tool]..."), + span_notice("[surgeon] starts heating [patient]'s bone marrow with [tool]..."), + span_notice("[surgeon] starts heating something in [patient]'s chest with [tool]..."), + ) + display_pain(patient, "You feel a searing heat spread through your chest!") + +/datum/surgery_operation/basic/viral_bonding/on_success(mob/living/patient, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + patient, + span_notice("[patient]'s bone marrow begins pulsing slowly. The viral bonding is complete."), + span_notice("[patient]'s bone marrow begins pulsing slowly."), + span_notice("[surgeon] finishes the operation."), + ) + display_pain(patient, "You feel a faint throbbing in your chest.") + for(var/datum/disease/infected_disease as anything in patient.diseases) + if(infected_disease.severity != DISEASE_SEVERITY_UNCURABLE) //no curing quirks, sweaty + infected_disease.carrier = TRUE + return TRUE diff --git a/code/modules/surgery/operations/operation_wing_repair.dm b/code/modules/surgery/operations/operation_wing_repair.dm new file mode 100644 index 000000000000..6429bf170521 --- /dev/null +++ b/code/modules/surgery/operations/operation_wing_repair.dm @@ -0,0 +1,61 @@ +/datum/surgery_operation/organ/fix_wings + name = "repair wings" + rnd_name = "Pteroplasty (Wing Repair)" + desc = "Repair a patient's damaged wings to restore flight capability." + rnd_desc = "A surgical procedure that repairs damaged wings using Synthflesh." + implements = list( + TOOL_HEMOSTAT = 1.15, + TOOL_SCREWDRIVER = 2.85, + /obj/item/pen = 6.67, + ) + operation_flags = OPERATION_LOCKED | OPERATION_NOTABLE + time = 20 SECONDS + target_type = /obj/item/organ/wings/moth + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED + +/datum/surgery_operation/organ/fix_wings/get_default_radial_image() + return image(icon = 'icons/mob/human/species/moth/moth_wings.dmi', icon_state = "m_moth_wings_monarch_BEHIND") + +/datum/surgery_operation/organ/fix_wings/all_required_strings() + return ..() + list("the wings must be burnt", "the patient must be dosed with >5u [/datum/reagent/medicine/c2/synthflesh::name]") + +/datum/surgery_operation/organ/fix_wings/all_blocked_strings() + return ..() + list("if the limb has bones, they must be intact") + +/datum/surgery_operation/organ/fix_wings/state_check(obj/item/organ/wings/moth/organ) + if(!organ.burnt) + return FALSE + // If bones are sawed, prevent the operation (unless we're operating on a limb with no bones) + if(!LIMB_HAS_ANY_SURGERY_STATE(organ.bodypart_owner, SURGERY_BONE_DRILLED|SURGERY_BONE_SAWED) && LIMB_HAS_BONES(organ.bodypart_owner)) + return FALSE + if(organ.owner.reagents?.get_reagent_amount(/datum/reagent/medicine/c2/synthflesh) < 5) + return FALSE + return TRUE + +/datum/surgery_operation/organ/fix_wings/on_preop(obj/item/organ/wings/moth/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You begin to repair [organ.owner]'s damaged wings..."), + span_notice("[surgeon] begins to repair [organ.owner]'s damaged wings."), + span_notice("[surgeon] begins to perform surgery on [organ.owner]'s damaged wings."), + ) + display_pain(organ.owner, "Your wings sting like hell!") + +/datum/surgery_operation/organ/fix_wings/on_success(obj/item/organ/wings/moth/organ, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + organ.owner, + span_notice("You succeed in repairing [organ.owner]'s wings."), + span_notice("[surgeon] successfully repairs [organ.owner]'s wings!"), + span_notice("[surgeon] completes the surgery on [organ.owner]'s wings."), + ) + display_pain(organ.owner, "You can feel your wings again!") + // heal the wings in question + organ.heal_wings(surgeon, ALL) + + // might as well heal their antennae too + var/obj/item/organ/antennae/antennae = organ.owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_ANTENNAE) + antennae?.heal_antennae(surgeon, ALL) + + organ.owner.update_body_parts() diff --git a/code/modules/surgery/operations/operation_zombie.dm b/code/modules/surgery/operations/operation_zombie.dm new file mode 100644 index 000000000000..8e81cd6491c5 --- /dev/null +++ b/code/modules/surgery/operations/operation_zombie.dm @@ -0,0 +1,74 @@ +/datum/surgery_operation/limb/bionecrosis + name = "induce bionecrosis" + rnd_name = "Bionecroplasty (Necrotic Revival)" + desc = "Inject reagents that stimulate the growth of a Romerol tumor inside the patient's brain." + rnd_desc = "An experimental procedure which induces the growth of a Romerol tumor inside the patient's brain." + implements = list( + /obj/item/reagent_containers/syringe = 1, + /obj/item/pen = 3.33, + ) + time = 5 SECONDS + operation_flags = OPERATION_MORBID | OPERATION_LOCKED | OPERATION_NOTABLE + all_surgery_states_required = SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED|SURGERY_BONE_SAWED + var/list/zombie_chems = list( + /datum/reagent/medicine/rezadone, + /datum/reagent/toxin/zombiepowder, + ) + +/datum/surgery_operation/limb/bionecrosis/get_default_radial_image() + return image(get_dynamic_human_appearance(species_path = /datum/species/zombie)) + +/datum/surgery_operation/limb/bionecrosis/all_required_strings() + . = ..() + . += "the limb must have a brain present" + +/datum/surgery_operation/limb/bionecrosis/any_required_strings() + . = ..() + for(var/datum/reagent/chem as anything in zombie_chems) + . += "the patient or tool must contain >1u [chem::name]" + +/datum/surgery_operation/limb/bionecrosis/all_blocked_strings() + . = ..() + . += "the limb must not already have a Romerol tumor" + +/datum/surgery_operation/limb/bionecrosis/state_check(obj/item/bodypart/limb) + if(locate(/obj/item/organ/zombie_infection) in limb) + return FALSE + if(!(locate(/obj/item/organ/brain) in limb)) + return FALSE + return TRUE + +/datum/surgery_operation/limb/bionecrosis/snowflake_check_availability(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, operated_zone) + for(var/chem in zombie_chems) + if(tool.reagents?.get_reagent_amount(chem) > 1) + return TRUE + if(limb.owner.reagents?.get_reagent_amount(chem) > 1) + return TRUE + return FALSE + +/datum/surgery_operation/limb/bionecrosis/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You begin to grow a romerol tumor in [limb.owner]'s brain..."), + span_notice("[surgeon] begins to tinker with [limb.owner]'s brain..."), + span_notice("[surgeon] begins to perform surgery on [limb.owner]'s brain."), + ) + display_pain(limb.owner, "Your head pounds with unimaginable pain!") // Same message as other brain surgeries + +/datum/surgery_operation/limb/bionecrosis/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/tool, list/operation_args) + display_results( + surgeon, + limb.owner, + span_notice("You succeed in growing a romerol tumor in [limb.owner]'s brain."), + span_notice("[surgeon] successfully grows a romerol tumor in [limb.owner]'s brain!"), + span_notice("[surgeon] completes the surgery on [limb.owner]'s brain."), + ) + display_pain(limb.owner, "Your head goes totally numb for a moment, the pain is overwhelming!") + if(locate(/obj/item/organ/zombie_infection) in limb) // they got another one mid surgery? whatever + return + var/obj/item/organ/zombie_infection/z_infection = new() + z_infection.Insert(limb.owner) + for(var/chem in zombie_chems) + tool.reagents?.remove_reagent(chem, 1) + limb.owner.reagents?.remove_reagent(chem, 1) diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm deleted file mode 100644 index 24504132d4a9..000000000000 --- a/code/modules/surgery/organ_manipulation.dm +++ /dev/null @@ -1,353 +0,0 @@ -/datum/surgery/organ_manipulation - name = "Organ manipulation" - 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, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/manipulate_organs/internal, - /datum/surgery_step/close, - ) - -//So far, this surgery type should be the only way carbon mobs can be fishing spots, also because the comp doesn't allow dupes. -/datum/surgery/organ_manipulation/next_step(mob/living/user, modifiers) - . = ..() - if(!.) - return - - // We've completed the surgery - if(status > length(steps)) - return - - if(!ispath(steps[status], /datum/surgery_step/manipulate_organs)) - //The manipulate_organs step either hasn't been reached yet or we're already past it. - if(!HAS_TRAIT(target, TRAIT_FISHING_SPOT)) - return - remove_fishing_spot() - return - - if(HAS_TRAIT(target, TRAIT_FISHING_SPOT)) - return - - target.AddComponent(/datum/component/fishing_spot, /datum/fish_source/surgery) - -/datum/surgery/organ_manipulation/Destroy() - if(QDELETED(target) || !HAS_TRAIT(target, TRAIT_FISHING_SPOT)) - return ..() - // The surgery is not finished yet and we're currently on manipulate organs step - if(status <= length(steps) && ispath(steps[status], /datum/surgery_step/manipulate_organs)) - remove_fishing_spot() - return ..() - -/** - * The target is a fishing spot, but we're past the step that allows us to fish organs from him, so we need - * to check if there are other organ manipulation surgeries that still meet this criteria before we remove - * the component - */ -/datum/surgery/organ_manipulation/proc/remove_fishing_spot() - for(var/datum/surgery/organ_manipulation/manipulation in target.surgeries) - if(manipulation != src && ispath(manipulation.steps[manipulation.status], /datum/surgery_step/manipulate_organs)) - return - qdel(target.GetComponent(/datum/component/fishing_spot)) - -/datum/surgery/organ_manipulation/soft - possible_locs = list(BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/manipulate_organs/internal, - /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) - target_mobtypes = list(/mob/living/carbon/alien/adult) - steps = list( - /datum/surgery_step/saw, - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/manipulate_organs/any, - /datum/surgery_step/close, - ) - -/datum/surgery/organ_manipulation/mechanic - name = "Hardware Manipulation" - requires_bodypart_type = BODYTYPE_ROBOTIC - surgery_flags = SURGERY_SELF_OPERABLE | SURGERY_REQUIRE_LIMB | SURGERY_CHECK_TOOL_BEHAVIOUR - possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD) - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/manipulate_organs/internal/mechanic, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/organ_manipulation/mechanic/soft - possible_locs = list( - BODY_ZONE_PRECISE_GROIN, - BODY_ZONE_PRECISE_EYES, - BODY_ZONE_PRECISE_MOUTH, - BODY_ZONE_L_ARM, - BODY_ZONE_R_ARM, - ) - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/manipulate_organs/internal/mechanic, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/organ_manipulation/mechanic/external - name = "Chassis 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( //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 its subtypes -/datum/surgery_step/manipulate_organs - name = "manipulate organs" - repeatable = TRUE - implements = list( - /obj/item/organ = 100, - /obj/item/borg/apparatus/organ_storage = 100) - preop_sound = 'sound/items/handling/surgery/organ2.ogg' - success_sound = 'sound/items/handling/surgery/organ1.ogg' - - var/implements_extract = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 55, /obj/item/kitchen/fork = 35) - var/current_type - var/obj/item/organ/target_organ - -/datum/surgery_step/manipulate_organs/New() - ..() - implements = implements + implements_extract - -/datum/surgery_step/manipulate_organs/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - target_organ = null - if(istype(tool, /obj/item/borg/apparatus/organ_storage)) - preop_sound = initial(preop_sound) - success_sound = initial(success_sound) - if(!length(tool.contents)) - to_chat(user, span_warning("There is nothing inside [tool]!")) - return SURGERY_STEP_FAIL - target_organ = tool.contents[1] - if(!isorgan(target_organ)) - if (target_zone == BODY_ZONE_PRECISE_EYES) - target_zone = check_zone(target_zone) - to_chat(user, span_warning("You cannot put [target_organ] into [target]'s [target.parse_zone_with_bodypart(target_zone)]!")) - return SURGERY_STEP_FAIL - tool = target_organ - if(isorgan(tool)) - current_type = "insert" - preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' - success_sound = 'sound/items/handling/surgery/organ2.ogg' - target_organ = tool - if(!target_organ.pre_surgical_insertion(user, target, target_zone, tool)) - return SURGERY_STEP_FAIL - - if(target_zone != target_organ.zone || target.get_organ_slot(target_organ.slot)) - to_chat(user, span_warning("There is no room for [target_organ] in [target]'s [target.parse_zone_with_bodypart(target_zone)]!")) - return SURGERY_STEP_FAIL - - var/obj/item/organ/meatslab = tool - if(!meatslab.useable) - to_chat(user, span_warning("[target_organ] seems to have been chewed on, you can't use this!")) - return SURGERY_STEP_FAIL - - if(!can_use_organ(meatslab)) - return SURGERY_STEP_FAIL - - if (target_zone == BODY_ZONE_PRECISE_EYES) - target_zone = check_zone(target_zone) - display_results( - user, - target, - span_notice("You begin to insert [tool] into [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to insert [tool] into [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to insert something into [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "You can feel something being placed in your [target.parse_zone_with_bodypart(target_zone)]!") - - - else if(implement_type in implements_extract) - current_type = "extract" - var/list/unfiltered_organs = target.get_organs_for_zone(target_zone) - var/list/organs = list() - for(var/organ in unfiltered_organs) - if(can_use_organ(organ)) - organs.Add(organ) - if (target_zone == BODY_ZONE_PRECISE_EYES) - target_zone = check_zone(target_zone) - if(!length(organs)) - to_chat(user, span_warning("There are no removable organs in [target]'s [target.parse_zone_with_bodypart(target_zone)]!")) - return SURGERY_STEP_FAIL - else - for(var/obj/item/organ/organ in organs) - organ.on_find(user) - organs -= organ - organs[organ.name] = organ - - var/chosen_organ = tgui_input_list(user, "Remove which organ?", "Surgery", sort_list(organs)) - if(isnull(chosen_organ)) - return SURGERY_STEP_FAIL - target_organ = chosen_organ - - if(user && target && user.Adjacent(target)) - //tool check - var/obj/item/held_tool = user.get_active_held_item() - if(held_tool) - held_tool = held_tool.get_proxy_attacker_for(target, user) - if(held_tool != tool) - return SURGERY_STEP_FAIL - - //organ check - target_organ = organs[target_organ] - if(!target_organ) - return SURGERY_STEP_FAIL - if(target_organ.organ_flags & ORGAN_UNREMOVABLE) - to_chat(user, span_warning("[target_organ] is too well connected to take out!")) - return SURGERY_STEP_FAIL - - //start operation - display_results( - user, - target, - span_notice("You begin to extract [target_organ] from [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to extract [target_organ] from [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to extract something from [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "You can feel your [target_organ.name] being removed from your [target.parse_zone_with_bodypart(target_zone)]!") - else - return SURGERY_STEP_FAIL - -/datum/surgery_step/manipulate_organs/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if (target_zone == BODY_ZONE_PRECISE_EYES) - target_zone = check_zone(target_zone) - if(current_type == "insert") - var/obj/item/apparatus - if(istype(tool, /obj/item/borg/apparatus/organ_storage)) - apparatus = tool - tool = tool.contents[1] - target_organ = tool - user.temporarilyRemoveItemFromInventory(target_organ, TRUE) - target_organ.Insert(target) - if(apparatus) - apparatus.icon_state = initial(apparatus.icon_state) - apparatus.desc = initial(apparatus.desc) - apparatus.cut_overlays() - display_results( - user, - target, - span_notice("You insert [tool] into [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] inserts [tool] into [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - span_notice("[user] inserts something into [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - display_pain(target, "Your [target.parse_zone_with_bodypart(target_zone)] throbs with pain as your new [tool.name] comes to life!") - target_organ.on_surgical_insertion(user, target, target_zone, tool) - - else if(current_type == "extract") - if(target_organ && target_organ.owner == target) - display_results( - user, - target, - span_notice("You successfully extract [target_organ] from [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] successfully extracts [target_organ] from [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - span_notice("[user] successfully extracts something from [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - display_pain(target, "Your [target.parse_zone_with_bodypart(target_zone)] throbs with pain, you can't feel your [target_organ.name] anymore!") - log_combat(user, target, "surgically removed [target_organ.name] from", addition="COMBAT MODE: [uppertext(user.combat_mode)]") - target_organ.Remove(target) - target_organ.forceMove(get_turf(target)) - target_organ.on_surgical_removal(user, target, target_zone, tool) - else - display_results( - user, - target, - span_warning("You can't extract anything from [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - span_notice("[user] can't seem to extract anything from [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - span_notice("[user] can't seem to extract anything from [target]'s [target.parse_zone_with_bodypart(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) -/datum/surgery_step/manipulate_organs/proc/can_use_organ(obj/item/organ/organ) - return FALSE - -/datum/surgery_step/manipulate_organs/any - time = 6.4 SECONDS - name = "manipulate organs (hemostat/organ)" - -/datum/surgery_step/manipulate_organs/any/can_use_organ(obj/item/organ/organ) - return TRUE - -///Surgery step for internal organs, like hearts and brains -/datum/surgery_step/manipulate_organs/internal - time = 6.4 SECONDS - name = "manipulate organs (hemostat/organ)" - -///only operate on internal organs -/datum/surgery_step/manipulate_organs/internal/can_use_organ(obj/item/organ/organ) - return !(organ.organ_flags & ORGAN_EXTERNAL) - -///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 - name = "manipulate features (hemostat/feature)" - -///Only operate on external organs -/datum/surgery_step/manipulate_organs/external/can_use_organ(obj/item/organ/organ) - return (organ.organ_flags & ORGAN_EXTERNAL) - -///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 deleted file mode 100644 index 30a06d70ff7d..000000000000 --- a/code/modules/surgery/organic_steps.dm +++ /dev/null @@ -1,231 +0,0 @@ - -//make incision -/datum/surgery_step/incise - name = "make incision (scalpel)" - implements = list( - TOOL_SCALPEL = 100, - /obj/item/melee/energy/sword = 75, - /obj/item/knife = 65, - /obj/item/shard = 45, - /obj/item = 30) // 30% success with any sharp item. - time = 1.6 SECONDS - preop_sound = 'sound/items/handling/surgery/scalpel1.ogg' - success_sound = 'sound/items/handling/surgery/scalpel2.ogg' - surgery_effects_mood = TRUE - -/datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to make an incision in [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to make an incision in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to make an incision in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "You feel a stabbing in your [target.parse_zone_with_bodypart(target_zone)].") - -/datum/surgery_step/incise/tool_check(mob/user, obj/item/tool) - if(implement_type == /obj/item && !tool.get_sharpness()) - return FALSE - - return TRUE - -/datum/surgery_step/incise/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if ishuman(target) - var/mob/living/carbon/human/human_target = target - if (human_target.can_bleed()) - var/blood_name = human_target.get_bloodtype()?.get_blood_name() || "Blood" - display_results( - user, - target, - span_notice("[blood_name] pools around the incision in [human_target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[blood_name] pools around the incision in [human_target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[blood_name] pools around the incision in [human_target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - var/obj/item/bodypart/target_bodypart = target.get_bodypart(target_zone) - if(target_bodypart) - target_bodypart.adjustBleedStacks(10) - return ..() - -/datum/surgery_step/incise/nobleed/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to carefully make an incision in [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to carefully make an incision in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to carefully make an incision in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "You feel a careful stabbing in your [target.parse_zone_with_bodypart(target_zone)].") - -//clamp bleeders -/datum/surgery_step/clamp_bleeders - name = "clamp bleeders (hemostat)" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_WIRECUTTER = 60, - /obj/item/stack/package_wrap = 35, - /obj/item/stack/cable_coil = 15) - time = 2.4 SECONDS - preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' - -/datum/surgery_step/clamp_bleeders/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to clamp bleeders in [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to clamp bleeders in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to clamp bleeders in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "You feel a pinch as the bleeding in your [target.parse_zone_with_bodypart(target_zone)] is slowed.") - -/datum/surgery_step/clamp_bleeders/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - if(locate(/datum/surgery_step/saw) in surgery.steps) - 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) - if(target_bodypart) - target_bodypart.adjustBleedStacks(-3) - return ..() - -//retract skin -/datum/surgery_step/retract_skin - name = "retract skin (retractor)" - implements = list( - TOOL_RETRACTOR = 100, - TOOL_SCREWDRIVER = 45, - TOOL_WIRECUTTER = 35, - /obj/item/stack/rods = 35) - time = 2.4 SECONDS - preop_sound = 'sound/items/handling/surgery/retractor1.ogg' - success_sound = 'sound/items/handling/surgery/retractor2.ogg' - -/datum/surgery_step/retract_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to retract the skin in [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to retract the skin in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to retract the skin in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "You feel a severe stinging pain spreading across your [target.parse_zone_with_bodypart(target_zone)] as the skin is pulled back!") - -//close incision -/datum/surgery_step/close - name = "mend incision (cautery)" - implements = list( - TOOL_CAUTERY = 100, - /obj/item/gun/energy/laser = 90, - TOOL_WELDER = 70, - /obj/item = 30) // 30% success with any hot item. - time = 2.4 SECONDS - preop_sound = 'sound/items/handling/surgery/cautery1.ogg' - success_sound = 'sound/items/handling/surgery/cautery2.ogg' - -/datum/surgery_step/close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to mend the incision in [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to mend the incision in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to mend the incision in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "Your [target.parse_zone_with_bodypart(target_zone)] is being burned!") - -/datum/surgery_step/close/tool_check(mob/user, obj/item/tool) - if(implement_type == TOOL_WELDER || implement_type == /obj/item) - return tool.get_temperature() - - return TRUE - -/datum/surgery_step/close/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - if(locate(/datum/surgery_step/saw) in surgery.steps) - 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) - if(target_bodypart) - target_bodypart.adjustBleedStacks(-3) - return ..() - - - -//saw bone -/datum/surgery_step/saw - 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, - /obj/item/knife/butcher = 35, - /obj/item = 25) //20% success (sort of) with any sharp item with a force >= 10 - time = 5.4 SECONDS - preop_sound = list( - /obj/item/circular_saw = 'sound/items/handling/surgery/saw.ogg', - /obj/item/melee/arm_blade = 'sound/items/handling/surgery/scalpel1.ogg', - /obj/item/fireaxe = 'sound/items/handling/surgery/scalpel1.ogg', - /obj/item/hatchet = 'sound/items/handling/surgery/scalpel1.ogg', - /obj/item/knife/butcher = 'sound/items/handling/surgery/scalpel1.ogg', - /obj/item = 'sound/items/handling/surgery/scalpel1.ogg', - ) - success_sound = 'sound/items/handling/surgery/organ2.ogg' - surgery_effects_mood = TRUE - -/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to saw through the bone in [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to saw through the bone in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to saw through the bone in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "You feel a horrid ache spread through the inside of your [target.parse_zone_with_bodypart(target_zone)]!") - -/datum/surgery_step/saw/tool_check(mob/user, obj/item/tool) - if(implement_type == /obj/item && !(tool.get_sharpness() && (tool.force >= 10))) - return FALSE - return TRUE - -/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - target.apply_damage(50, BRUTE, "[target_zone]", wound_bonus=CANT_WOUND) - display_results( - user, - target, - span_notice("You saw [target]'s [target.parse_zone_with_bodypart(target_zone)] open."), - span_notice("[user] saws [target]'s [target.parse_zone_with_bodypart(target_zone)] open!"), - span_notice("[user] saws [target]'s [target.parse_zone_with_bodypart(target_zone)] open!"), - ) - display_pain(target, "It feels like something just broke in your [target.parse_zone_with_bodypart(target_zone)]!") - return ..() - -//drill bone -/datum/surgery_step/drill - name = "drill bone (surgical drill)" - implements = list( - TOOL_DRILL = 100, - /obj/item/screwdriver/power = 80, - /obj/item/pickaxe/drill = 60, - TOOL_SCREWDRIVER = 25, - /obj/item/kitchen/spoon = 20) - time = 3 SECONDS - -/datum/surgery_step/drill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to drill into the bone in [target]'s [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to drill into the bone in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to drill into the bone in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "You feel a horrible piercing pain in your [target.parse_zone_with_bodypart(target_zone)]!") - -/datum/surgery_step/drill/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results( - user, - target, - span_notice("You drill into [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] drills into [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - span_notice("[user] drills into [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - return ..() diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm index 69f0809dc89d..176c11e68535 100644 --- a/code/modules/surgery/organs/_organ.dm +++ b/code/modules/surgery/organs/_organ.dm @@ -88,12 +88,14 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) if(organ_flags & ORGAN_EDIBLE) AddComponentFrom( SOURCE_EDIBLE_INNATE, \ - /datum/component/edible,\ - initial_reagents = food_reagents,\ - foodtypes = foodtype_flags,\ - volume = reagent_vol,\ - tastes = food_tastes,\ - after_eat = CALLBACK(src, PROC_REF(OnEatFrom))) + /datum/component/edible, \ + initial_reagents = food_reagents, \ + foodtypes = foodtype_flags, \ + volume = reagent_vol, \ + tastes = food_tastes, \ + after_eat = CALLBACK(src, PROC_REF(OnEatFrom)), \ + ) + RegisterSignal(src, COMSIG_FOOD_ATTEMPT_EAT, PROC_REF(block_nom)) if(bodypart_overlay) setup_bodypart_overlay() @@ -117,7 +119,7 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) /// Add a Trait to an organ that it will give its owner. /obj/item/organ/proc/add_organ_trait(trait) - LAZYADD(organ_traits, trait) + LAZYOR(organ_traits, trait) if(isnull(owner)) return ADD_TRAIT(owner, trait, REF(src)) @@ -234,7 +236,8 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) 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/proc/OnEatFrom(eater, feeder) - useable = FALSE //You can't use it anymore after eating it you spaztic + // You can't use it anymore after eating it + organ_flags |= ORGAN_UNUSABLE /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. @@ -249,15 +252,11 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) if(required_organ_flag && !(organ_flags & required_organ_flag)) return FALSE damage = clamp(damage + damage_amount, 0, maximum) + SEND_SIGNAL(src, COMSIG_ORGAN_ADJUST_DAMAGE, damage_amount, maximum, required_organ_flag) . = (prev_damage - damage) // return net damage - var/message = check_damage_thresholds(owner) + var/message = check_damage_thresholds() prev_damage = damage - if(damage >= maxHealth) - organ_flags |= ORGAN_FAILING - else - organ_flags &= ~ORGAN_FAILING - if(message && owner && owner.stat <= SOFT_CRIT) to_chat(owner, message) @@ -271,24 +270,66 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) * description: By checking our current damage against our previous damage, we can decide whether we've passed an organ threshold. * If we have, send the corresponding threshold message to the owner, if such a message exists. */ -/obj/item/organ/proc/check_damage_thresholds(mob/organ_owner) +/obj/item/organ/proc/check_damage_thresholds() + SHOULD_CALL_PARENT(TRUE) if(damage == prev_damage) return var/delta = damage - prev_damage + var/message = "" if(delta > 0) - if(damage >= maxHealth) - return now_failing - if(damage > high_threshold && prev_damage <= high_threshold) - return high_threshold_passed if(damage > low_threshold && prev_damage <= low_threshold) - return low_threshold_passed - else - if(prev_damage > low_threshold && damage <= low_threshold) - return low_threshold_cleared - if(prev_damage > high_threshold && damage <= high_threshold) - return high_threshold_cleared - if(prev_damage == maxHealth) - return now_fixed + on_low_damage_received() + message = low_threshold_passed + if(damage > high_threshold && prev_damage <= high_threshold) + on_high_damage_received() + message = high_threshold_passed + if(damage >= maxHealth) + organ_flags |= ORGAN_FAILING + on_begin_failure() + message = now_failing + return message + + if(prev_damage == maxHealth) + organ_flags &= ~ORGAN_FAILING + on_failure_recovery() + message = now_fixed + if(prev_damage > high_threshold && damage <= high_threshold) + on_high_damage_healed() + message = high_threshold_cleared + if(prev_damage > low_threshold && damage <= low_threshold) + on_low_damage_healed() + message = low_threshold_cleared + return message + +/** + * Called when the damage surpasses the low damage threshold. + * + * This and other procs like this one merely exist to make it easier to keep a standard on + * damage thresholds for organs. This doesn't mean you cannot make custom thresholds for various stuff, + * and you're more than welcome to improve or refactor any portion of the code around these mechanics + */ +/obj/item/organ/proc/on_low_damage_received() + return + +///Called when the damage goes below the low damage threshold +/obj/item/organ/proc/on_low_damage_healed() + return + +///Called when the damage surpasses the high damage threshold +/obj/item/organ/proc/on_high_damage_received() + return + +///Called when the damage goes below the high damage threshold +/obj/item/organ/proc/on_high_damage_healed() + return + +///Called when the organ enters failing stage +/obj/item/organ/proc/on_begin_failure() + return + +///Called when the organ recovers from failing stage +/obj/item/organ/proc/on_failure_recovery() + return //Looking for brains? //Try code/modules/mob/living/carbon/brain/brain_item.dm @@ -303,6 +344,8 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) // Delegate to species if possible. if(dna?.species) for(var/obj/item/organ/organ as anything in organs) + if(organ.organ_flags & ORGAN_EMP) + organ.organ_flags &= ~ORGAN_EMP if(remove_hazardous && (organ.organ_flags & ORGAN_HAZARDOUS)) qdel(organ) continue @@ -312,9 +355,9 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) dna.species.regenerate_organs(src, replace_current = FALSE) set_heartattack(FALSE) - // Ears have aditional vаr "deaf", need to update it too + // Ears have aditional var "deaf", need to update it too var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) - ears?.adjustEarDamage(0, -INFINITY) // full heal ears deafness + ears.adjust_temporary_deafness(-INFINITY) return @@ -351,7 +394,8 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) if(!ears) ears = new() ears.Insert(src) - ears.adjustEarDamage(-INFINITY, -INFINITY) // actually do: set_organ_damage(0) and deaf = 0 + ears.set_organ_damage(0) + ears.adjust_temporary_deafness(-INFINITY) ///Organs don't die instantly, and neither should you when you get fucked up /obj/item/organ/proc/handle_failing_organs(seconds_per_tick) @@ -456,6 +500,16 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) /obj/item/organ/proc/replace_into(mob/living/carbon/new_owner) Insert(new_owner, special = TRUE, movement_flags = DELETE_IF_REPLACED) +/// Signal proc for [COMSIG_FOOD_ATTEMPT_EAT], block feeding an organ to a mob if they are marked as ready to operate - to prevent mistakenly feeding your patient +/obj/item/organ/proc/block_nom(datum/source, mob/living/carbon/eater, mob/living/carbon/feeder) + SIGNAL_HANDLER + if(!HAS_TRAIT(eater, TRAIT_READY_TO_OPERATE)) + return NONE + if(eater == feeder) + to_chat(feeder, span_warning("You feel it unwise to eat [source] while you're undergoing surgery.")) + else + to_chat(feeder, span_warning("The only thing you could think of doing with [source] right now is feeding it to [eater], but that doesn't seem right.")) + return BLOCK_EAT_ATTEMPT /// Get all possible organ slots by checking every organ, and then store it and give it whenever needed /proc/get_all_slots() diff --git a/code/modules/surgery/organs/external/_visual_organs.dm b/code/modules/surgery/organs/external/_visual_organs.dm index 2978ffa0dcf5..ec576568ab2a 100644 --- a/code/modules/surgery/organs/external/_visual_organs.dm +++ b/code/modules/surgery/organs/external/_visual_organs.dm @@ -7,8 +7,6 @@ Unlike normal organs, we're actually inside a persons limbs at all times ///The overlay datum that actually draws stuff on the limb var/datum/bodypart_overlay/mutant/bodypart_overlay - /// 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/datum/dna_block/dna_block @@ -25,7 +23,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times var/restyle_flags = NONE ///If not null, overrides the appearance with this sprite accessory datum - var/sprite_accessory_override + var/datum/sprite_accessory/sprite_accessory_override /**accessory_type is optional if you haven't 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 @@ -34,7 +32,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times /obj/item/organ/proc/setup_bodypart_overlay(accessory_type) bodypart_overlay = new bodypart_overlay(src) - accessory_type = accessory_type ? accessory_type : sprite_accessory_override + accessory_type ||= sprite_accessory_override var/update_overlays = TRUE if(accessory_type) bodypart_overlay.set_appearance(accessory_type) @@ -109,8 +107,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_EXTERNAL_HORNS - preference = "feature_lizard_horns" - dna_block = /datum/dna_block/feature/horn + dna_block = /datum/dna_block/feature/accessory/horn restyle_flags = EXTERNAL_RESTYLE_ENAMEL bodypart_overlay = /datum/bodypart_overlay/mutant/horns @@ -125,9 +122,6 @@ Unlike normal organs, we're actually inside a persons limbs at all times /datum/bodypart_overlay/mutant/horns/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) return !(bodypart_owner.owner?.obscured_slots & HIDEHAIR) -/datum/bodypart_overlay/mutant/horns/get_global_feature_list() - return SSaccessories.horns_list - ///The frills of a lizard (like weird fin ears) /obj/item/organ/frills name = "frills" @@ -137,8 +131,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_EXTERNAL_FRILLS - preference = "feature_lizard_frills" - dna_block = /datum/dna_block/feature/frill + dna_block = /datum/dna_block/feature/accessory/frill restyle_flags = EXTERNAL_RESTYLE_FLESH bodypart_overlay = /datum/bodypart_overlay/mutant/frills @@ -152,9 +145,6 @@ Unlike normal organs, we're actually inside a persons limbs at all times /datum/bodypart_overlay/mutant/frills/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) return !(bodypart_owner.owner?.obscured_slots & HIDEEARS) -/datum/bodypart_overlay/mutant/frills/get_global_feature_list() - return SSaccessories.frills_list - ///Guess what part of the lizard this is? /obj/item/organ/snout name = "lizard snout" @@ -164,10 +154,9 @@ Unlike normal organs, we're actually inside a persons limbs at all times zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_EXTERNAL_SNOUT - preference = "feature_lizard_snout" external_bodyshapes = BODYSHAPE_SNOUTED - dna_block = /datum/dna_block/feature/snout + dna_block = /datum/dna_block/feature/accessory/snout restyle_flags = EXTERNAL_RESTYLE_FLESH bodypart_overlay = /datum/bodypart_overlay/mutant/snout @@ -181,9 +170,6 @@ Unlike normal organs, we're actually inside a persons limbs at all times /datum/bodypart_overlay/mutant/snout/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) return !(bodypart_owner.owner?.obscured_slots & HIDESNOUT) -/datum/bodypart_overlay/mutant/snout/get_global_feature_list() - return SSaccessories.snouts_list - ///A moth's antennae /obj/item/organ/antennae name = "moth antennae" @@ -193,8 +179,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_EXTERNAL_ANTENNAE - preference = "feature_moth_antennae" - dna_block = /datum/dna_block/feature/moth_antenna + dna_block = /datum/dna_block/feature/accessory/moth_antenna restyle_flags = EXTERNAL_RESTYLE_FLESH bodypart_overlay = /datum/bodypart_overlay/mutant/antennae @@ -260,9 +245,6 @@ Unlike normal organs, we're actually inside a persons limbs at all times burn_datum = fetch_sprite_datum(burn_datum) //turn the path into the singleton instance -/datum/bodypart_overlay/mutant/antennae/get_global_feature_list() - return SSaccessories.moth_antennae_list - /datum/bodypart_overlay/mutant/antennae/get_base_icon_state() return burnt ? burn_datum.icon_state : sprite_datum.icon_state @@ -277,10 +259,9 @@ Unlike normal organs, we're actually inside a persons limbs at all times zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_EXTERNAL_POD_HAIR - preference = "feature_pod_hair" use_mob_sprite_as_obj_sprite = TRUE - dna_block = /datum/dna_block/feature/pod_hair + dna_block = /datum/dna_block/feature/accessory/pod_hair restyle_flags = EXTERNAL_RESTYLE_PLANT bodypart_overlay = /datum/bodypart_overlay/mutant/pod_hair @@ -298,9 +279,6 @@ Unlike normal organs, we're actually inside a persons limbs at all times ///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 SSaccessories.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 ..() diff --git a/code/modules/surgery/organs/external/spines.dm b/code/modules/surgery/organs/external/spines.dm index 4fc3c862b05b..9f9b71ff2d87 100644 --- a/code/modules/surgery/organs/external/spines.dm +++ b/code/modules/surgery/organs/external/spines.dm @@ -7,9 +7,7 @@ zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_EXTERNAL_SPINES - preference = "feature_lizard_spines" - - dna_block = /datum/dna_block/feature/spine + dna_block = /datum/dna_block/feature/accessory/spine restyle_flags = EXTERNAL_RESTYLE_FLESH bodypart_overlay = /datum/bodypart_overlay/mutant/spines @@ -34,9 +32,6 @@ feature_key = FEATURE_SPINES dyable = TRUE -/datum/bodypart_overlay/mutant/spines/get_global_feature_list() - return SSaccessories.spines_list - /datum/bodypart_overlay/mutant/spines/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) return !(bodypart_owner.owner?.obscured_slots & HIDEJUMPSUIT) diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index a554e759713b..da3e93b4681e 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -7,7 +7,7 @@ zone = BODY_ZONE_PRECISE_GROIN slot = ORGAN_SLOT_EXTERNAL_TAIL - dna_block = /datum/dna_block/feature/tail + dna_block = /datum/dna_block/feature/accessory/tail restyle_flags = EXTERNAL_RESTYLE_FLESH // defaults to cat, but the parent type shouldn't be created regardless @@ -152,7 +152,6 @@ /obj/item/organ/tail/cat name = "tail" - preference = "feature_human_tail" bodypart_overlay = /datum/bodypart_overlay/mutant/tail/cat restyle_flags = EXTERNAL_RESTYLE_FLESH @@ -164,15 +163,11 @@ ///Cat tail bodypart overlay /datum/bodypart_overlay/mutant/tail/cat - feature_key = FEATURE_TAIL + feature_key = FEATURE_TAIL_CAT color_source = ORGAN_COLOR_HAIR -/datum/bodypart_overlay/mutant/tail/cat/get_global_feature_list() - return SSaccessories.tails_list_felinid - /obj/item/organ/tail/monkey name = "monkey tail" - preference = "feature_monkey_tail" icon_state = "severedmonkeytail" dna_block = null bodypart_overlay = /datum/bodypart_overlay/mutant/tail/monkey @@ -182,9 +177,6 @@ color_source = NONE feature_key = FEATURE_TAIL_MONKEY -/datum/bodypart_overlay/mutant/tail/monkey/get_global_feature_list() - return SSaccessories.tails_list_monkey - /obj/item/organ/tail/xeno name = "alien tail" desc = "A long and flexible tail slightly resembling a spine, used by its original owner as both weapon and balance aid." @@ -232,9 +224,6 @@ . = ..() set_appearance_from_name(default_appearance) -/datum/bodypart_overlay/mutant/tail/xeno/get_global_feature_list() - return SSaccessories.tails_list_xeno - /datum/bodypart_overlay/mutant/tail/xeno/randomize_appearance() set_appearance_from_name(default_appearance) @@ -244,20 +233,16 @@ /obj/item/organ/tail/lizard name = "lizard tail" desc = "A severed lizard tail. Somewhere, no doubt, a lizard hater is very pleased with themselves." - preference = "feature_lizard_tail" bodypart_overlay = /datum/bodypart_overlay/mutant/tail/lizard wag_flags = WAG_ABLE - dna_block = /datum/dna_block/feature/tail_lizard + dna_block = /datum/dna_block/feature/accessory/tail_lizard ///Lizard tail bodypart overlay datum /datum/bodypart_overlay/mutant/tail/lizard feature_key = FEATURE_TAIL_LIZARD -/datum/bodypart_overlay/mutant/tail/lizard/get_global_feature_list() - return SSaccessories.tails_list_lizard - /obj/item/organ/tail/lizard/fake name = "fabricated lizard tail" desc = "A fabricated severed lizard tail. This one's made of synthflesh. Probably not usable for lizard wine." @@ -271,9 +256,6 @@ /// Key for tail spine states, depends on the shape of the tail. Defined in the tail sprite datum. var/tail_spine_key = NONE -/datum/bodypart_overlay/mutant/tail_spines/get_global_feature_list() - return SSaccessories.tail_spines_list - /datum/bodypart_overlay/mutant/tail_spines/get_base_icon_state() return (!isnull(tail_spine_key) ? "[tail_spine_key]_" : "") + (wagging ? "wagging_" : "") + sprite_datum.icon_state // Select the wagging state if appropriate diff --git a/code/modules/surgery/organs/external/wings/functional_wings.dm b/code/modules/surgery/organs/external/wings/functional_wings.dm index ee6f45de75ee..8dcd277eecdf 100644 --- a/code/modules/surgery/organs/external/wings/functional_wings.dm +++ b/code/modules/surgery/organs/external/wings/functional_wings.dm @@ -26,7 +26,6 @@ ///We cant hide this wings in suit var/cant_hide = FALSE - // grind_results = list(/datum/reagent/flightpotion = 5) food_reagents = list(/datum/reagent/flightpotion = 5) var/drift_force = FUNCTIONAL_WING_FORCE @@ -50,6 +49,9 @@ QDEL_NULL(fly) return ..() +/obj/item/organ/wings/functional/grind_results() + return list(/datum/reagent/flightpotion = 5) + /obj/item/organ/wings/functional/on_mob_insert(mob/living/carbon/receiver, special, movement_flags) . = ..() @@ -166,19 +168,16 @@ /datum/bodypart_overlay/mutant/wings/functional ///Are our wings currently open? Change through open_wings or close_wings() VAR_PRIVATE/wings_open = FALSE - ///Feature render key for opened wings - var/open_feature_key = "wingsopen" /datum/bodypart_overlay/mutant/wings/functional/get_global_feature_list() if(wings_open) - return SSaccessories.wings_open_list - else - return SSaccessories.wings_list + return SSaccessories.feature_list[FEATURE_WINGS_OPEN] + return ..() ///Update our wingsprite to the open wings variant /datum/bodypart_overlay/mutant/wings/functional/proc/open_wings() wings_open = TRUE - feature_key = open_feature_key + feature_key = FEATURE_WINGS_OPEN set_appearance_from_name(sprite_datum.name) //It'll look for the same name again, but this time from the open wings list ///Update our wingsprite to the closed wings variant diff --git a/code/modules/surgery/organs/external/wings/moth_wings.dm b/code/modules/surgery/organs/external/wings/moth_wings.dm index e71251e8ebfc..011e8eeabbac 100644 --- a/code/modules/surgery/organs/external/wings/moth_wings.dm +++ b/code/modules/surgery/organs/external/wings/moth_wings.dm @@ -5,9 +5,7 @@ name = "moth wings" desc = "Spread your wings and FLOOOOAAAAAT!" - preference = "feature_moth_wings" - - dna_block = /datum/dna_block/feature/moth_wing + dna_block = /datum/dna_block/feature/accessory/moth_wing bodypart_overlay = /datum/bodypart_overlay/mutant/wings/moth restyle_flags = EXTERNAL_RESTYLE_FLESH @@ -109,9 +107,6 @@ burn_datum = fetch_sprite_datum(burn_datum) -/datum/bodypart_overlay/mutant/wings/moth/get_global_feature_list() - return SSaccessories.moth_wings_list - /datum/bodypart_overlay/mutant/wings/moth/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) return !(bodypart_owner.owner?.obscured_slots & HIDEMUTWINGS) diff --git a/code/modules/surgery/organs/internal/appendix/_appendix.dm b/code/modules/surgery/organs/internal/appendix/_appendix.dm index 1b7df505799d..9f942489b1ee 100644 --- a/code/modules/surgery/organs/internal/appendix/_appendix.dm +++ b/code/modules/surgery/organs/internal/appendix/_appendix.dm @@ -10,7 +10,6 @@ zone = BODY_ZONE_PRECISE_GROIN slot = ORGAN_SLOT_APPENDIX food_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue = 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 @@ -19,6 +18,9 @@ var/inflamation_stage = 0 +/obj/item/organ/appendix/grind_results() + return list(/datum/reagent/toxin/bad_food = 5) + /obj/item/organ/appendix/update_name() . = ..() name = "[inflamation_stage ? "inflamed " : null][initial(name)]" @@ -34,7 +36,7 @@ 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) + owner.adjust_tox_loss(2 * seconds_per_tick, forced = TRUE) else if(inflamation_stage) inflamation(seconds_per_tick) else if(SPT_PROB(APPENDICITIS_PROB, seconds_per_tick) && !HAS_TRAIT(owner, TRAIT_TEMPORARY_BODY)) @@ -68,13 +70,13 @@ 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.adjust_organ_loss(ORGAN_SLOT_APPENDIX, 5) organ_owner.Stun(rand(40, 60)) - organ_owner.adjustToxLoss(1, forced = TRUE) + organ_owner.adjust_tox_loss(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) + organ_owner.adjust_organ_loss(ORGAN_SLOT_APPENDIX, 15) /obj/item/organ/appendix/feel_for_damage(self_aware) var/effective_stage = floor(inflamation_stage + (damage / maxHealth)) diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm index 6181ce1105b4..1d9244fb6196 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm @@ -244,7 +244,7 @@ to_chat(owner, span_userdanger("You feel an explosion erupt inside your [parse_zone(zone)] as your implant breaks!")) owner.adjust_fire_stacks(20) owner.ignite_mob() - owner.adjustFireLoss(25) + owner.adjust_fire_loss(25) organ_flags |= ORGAN_FAILING /obj/item/organ/cyberimp/arm/toolkit/gun/laser @@ -287,14 +287,14 @@ /obj/item/taperecorder, /obj/item/lighter, /obj/item/laser_pointer, - /obj/item/stamp, + /obj/item/stamp/granted, /obj/item/stamp/denied, ) /obj/item/organ/cyberimp/arm/toolkit/paperwork/emag_act(mob/user, obj/item/card/emag/emag_card) for(var/datum/weakref/created_item in items_list) var/obj/potential_tool = created_item.resolve() - if(istype(/obj/item/stamp/chameleon, potential_tool)) + if(istype(potential_tool, /obj/item/stamp/chameleon)) return FALSE balloon_alert(user, "experimental stamp unlocked") @@ -304,7 +304,7 @@ /obj/item/organ/cyberimp/arm/toolkit/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)) + if(istype(potential_knife, /obj/item/knife/combat/cyborg)) return FALSE balloon_alert(user, "integrated knife unlocked") @@ -438,25 +438,31 @@ ) aug_overlay = "strongarm" - ///The amount of damage the implant adds to our unarmed attacks. - var/punch_damage = 5 - ///Biotypes we apply an additional amount of damage too - var/biotype_bonus_targets = MOB_BEAST | MOB_SPECIAL | MOB_MINING - ///Extra damage dealt to our targeted mobs + /// The amount of damage the implant adds to the lower punching force of our arm. + var/lower_punch_damage = 0 + /// The amount of damage the implant adds to the upper punching force of our arm. + var/upper_punch_damage = 2 + /// The amount of punch effectiveness (AKA accuracy and crit potential) the implant adds to our arm + var/punch_effectiveness_added = 10 + /// How much extra damage does our implant allow the implanted while grabbing someone and they are unable to break the grapple? + var/bonus_grab_damage = 20 + /// Biotypes we apply an additional amount of damage too + var/biotype_bonus_targets = MOB_SPECIAL | MOB_MINING + /// Extra damage dealt to our targeted mobs var/biotype_bonus_damage = 20 - ///IF true, the throw attack will not smash people into walls + /// IF true, the throw attack will not smash people into walls var/non_harmful_throw = TRUE - ///How far away your attack will throw your oponent + /// How far away your attack will throw your oponent var/attack_throw_range = 1 - ///Minimum throw power of the attack + /// Minimum throw power of the attack var/throw_power_min = 1 - ///Maximum throw power of the attack + /// Maximum throw power of the attack var/throw_power_max = 4 - ///How long will the implant malfunction if it is EMP'd + /// How long will the implant malfunction if it is EMP'd var/emp_base_duration = 9 SECONDS - ///How long before we get another slam punch; consider that these usually come in pairs of two + /// How long before we get another slam punch against a human; consider that these usually come in pairs var/slam_cooldown_duration = 5 SECONDS - ///Tracks how soon we can perform another slam attack + /// Tracks how soon we can perform another slam attack COOLDOWN_DECLARE(slam_cooldown) /obj/item/organ/cyberimp/arm/strongarm/Initialize(mapload) @@ -472,6 +478,20 @@ . = ..() UnregisterSignal(arm_owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK) +/obj/item/organ/cyberimp/arm/strongarm/on_bodypart_insert(obj/item/bodypart/arm) + . = ..() + arm.unarmed_damage_low += lower_punch_damage + arm.unarmed_damage_high += upper_punch_damage + arm.unarmed_effectiveness += punch_effectiveness_added + arm.unarmed_grab_damage_bonus += bonus_grab_damage + +/obj/item/organ/cyberimp/arm/strongarm/on_bodypart_remove(obj/item/bodypart/arm) + . = ..() + arm.unarmed_damage_low += lower_punch_damage + arm.unarmed_damage_high += upper_punch_damage + arm.unarmed_effectiveness += punch_effectiveness_added + arm.unarmed_grab_damage_bonus += bonus_grab_damage + /obj/item/organ/cyberimp/arm/strongarm/emp_act(severity) . = ..() if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF) @@ -495,13 +515,12 @@ return NONE if(HAS_TRAIT(source, TRAIT_HULK)) //NO HULK return NONE - if(!COOLDOWN_FINISHED(src, slam_cooldown)) + if(!COOLDOWN_FINISHED(src, slam_cooldown) && ishuman(target)) return NONE if(!source.can_unarmed_attack()) return COMPONENT_SKIP_ATTACK var/mob/living/living_target = target - source.changeNext_move(CLICK_CD_MELEE) var/picked_hit_type = pick("punch", "smash", "pummel", "bash", "slam") if(organ_flags & ORGAN_FAILING) @@ -514,22 +533,28 @@ source.Paralyze(1 SECONDS) return COMPONENT_CANCEL_ATTACK_CHAIN - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - if(human_target.check_block(source, punch_damage, "[source]'s' [picked_hit_type]")) - source.do_attack_animation(target) - playsound(living_target.loc, 'sound/items/weapons/punchmiss.ogg', 25, TRUE, -1) - log_combat(source, target, "attempted to [picked_hit_type]", "muscle implant") - return COMPONENT_CANCEL_ATTACK_CHAIN - var/ground_bounce = FALSE // funny flavor. if you hit someone who's floored you slam them into the ground, breaking tiles var/turf/target_turf = get_turf(living_target) + /* Damage calculations operate on the same math used in /datum/species/proc/harm(): + * Unarmed damage is randomized between an upper and lower value. + * The lower value is determined by taking the damage value from the limb, and then increasing that value based on athletics level (min upper value) + * The upper value is determiend by taking the damage value from the limb, and then seeing if we have the strength trait, providing extra damage. + * The end result is that the more investment into athletics, the more precise the damage is, without necessarily increasing the potential damage. + */ + + // Our attacking limb var/obj/item/bodypart/attacking_bodypart = hand - var/potential_damage = punch_damage + // The upper damage, calculated first as it will be used to cap our potential lower damage. + var/potential_upper_damage = attacking_bodypart.unarmed_damage_high + (HAS_TRAIT(source, TRAIT_STRENGTH) ? 2 : 0) + // The lower damage, which is capped by potential_upper_damage + var/potential_lower_damage = min(attacking_bodypart.unarmed_damage_low + (source.mind?.get_skill_level(/datum/skill/athletics) || 0), potential_upper_damage) + // Finally, we determine the actual damage roll. + var/potential_damage = rand(potential_lower_damage, potential_upper_damage) + // This value is used to determine armour penetration. var/potential_effectiveness = attacking_bodypart.unarmed_effectiveness + // This is a damage and penetration multiplier if our target is grabbed when we deliver our punch. var/potential_pummel_bonus = attacking_bodypart.unarmed_pummeling_bonus - potential_damage += rand(attacking_bodypart.unarmed_damage_low, attacking_bodypart.unarmed_damage_high) if(living_target.pulledby && living_target.pulledby.grab_state >= GRAB_AGGRESSIVE) // get pummeled idiot potential_damage *= potential_pummel_bonus @@ -541,21 +566,18 @@ if(biotype_bonus_targets && is_correct_biotype) //If we are punching one of our special biotype targets, increase the damage floor by a factor of two. potential_damage += biotype_bonus_damage + if(ishuman(target)) + var/mob/living/carbon/human/human_target = target + if(human_target.check_block(source, potential_damage, "[source]'s' [picked_hit_type]")) + source.do_attack_animation(target) + playsound(living_target.loc, 'sound/items/weapons/punchmiss.ogg', 25, TRUE, -1) + log_combat(source, target, "attempted to [picked_hit_type]", "muscle implant") + return COMPONENT_CANCEL_ATTACK_CHAIN + source.do_attack_animation(target, ATTACK_EFFECT_SMASH) playsound(living_target.loc, 'sound/items/weapons/punch1.ogg', 25, TRUE, -1) - var/target_zone = living_target.get_random_valid_zone(source.zone_selected) - var/armor_block = living_target.run_armor_check(target_zone, MELEE, armour_penetration = potential_effectiveness) - living_target.apply_damage(potential_damage * 2, attacking_bodypart.attack_type, 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) - living_target.throw_at(throw_target, attack_throw_range, rand(throw_power_min,throw_power_max), source, gentle = non_harmful_throw) - if(ground_bounce) - if(isfloorturf(target_turf)) - var/turf/open/floor/crunched = target_turf - crunched.crush() // crunch - + // Some mobs gib when killed, so we're logging early. At this point, we're definitely hitting, so... living_target.visible_message( span_danger("[source] [picked_hit_type]ed [living_target][ground_bounce ? " into [target_turf]" : ""]!"), span_userdanger("You're [picked_hit_type]ed by [source][ground_bounce ? " into [target_turf]" : ""]!"), @@ -568,7 +590,24 @@ log_combat(source, target, "[picked_hit_type]ed", "muscle implant") - COOLDOWN_START(src, slam_cooldown, slam_cooldown_duration) + if(ishuman(target)) + COOLDOWN_START(src, slam_cooldown, slam_cooldown_duration) + + var/target_zone = living_target.get_random_valid_zone(source.zone_selected) + var/armor_block = living_target.run_armor_check(target_zone, MELEE, armour_penetration = potential_effectiveness) + living_target.apply_damage(potential_damage * 2, attacking_bodypart.attack_type, target_zone, armor_block) + + if(source.body_position != LYING_DOWN && !QDELETED(living_target)) //Throw them if we are standing and we didn't somehow just completely obliterate the target + var/atom/throw_target = get_edge_target_turf(living_target, source.dir) + living_target.throw_at(throw_target, attack_throw_range, rand(throw_power_min,throw_power_max), source, gentle = non_harmful_throw) + if(ground_bounce) + if(isfloorturf(target_turf)) + var/turf/open/floor/crunched = target_turf + crunched.crush() // crunch + else if (ground_bounce) // Just in case our target mob somehow evaporated during this process, we still leave an obliterated tile in their wake + if(isfloorturf(target_turf)) + var/turf/open/floor/crunched = target_turf + crunched.crush() // again, crunch return COMPONENT_CANCEL_ATTACK_CHAIN diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm index 767e759e794d..7b869624e284 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm @@ -90,19 +90,19 @@ /// boolean that stands for if PHYSICAL damage being patched var/body_damage_patched = FALSE var/need_mob_update = FALSE - if(owner.getOxyLoss()) - need_mob_update += owner.adjustOxyLoss(-5, updating_health = FALSE) + if(owner.get_oxy_loss()) + need_mob_update += owner.adjust_oxy_loss(-5, updating_health = FALSE) revive_cost += 5 - if(owner.getBruteLoss()) - need_mob_update += owner.adjustBruteLoss(-2, updating_health = FALSE) + if(owner.get_brute_loss()) + need_mob_update += owner.adjust_brute_loss(-2, updating_health = FALSE) revive_cost += 40 body_damage_patched = TRUE - if(owner.getFireLoss()) - need_mob_update += owner.adjustFireLoss(-2, updating_health = FALSE) + if(owner.get_fire_loss()) + need_mob_update += owner.adjust_fire_loss(-2, updating_health = FALSE) revive_cost += 40 body_damage_patched = TRUE - if(owner.getToxLoss()) - need_mob_update += owner.adjustToxLoss(-1, updating_health = FALSE) + if(owner.get_tox_loss()) + need_mob_update += owner.adjust_tox_loss(-1, updating_health = FALSE) revive_cost += 40 if(need_mob_update) owner.updatehealth() @@ -335,6 +335,7 @@ added_throw_speed = /obj/item/organ/cyberimp/chest/spine/atlas::added_throw_speed strength_bonus = /obj/item/organ/cyberimp/chest/spine/atlas::strength_bonus core_applied = TRUE + icon_state = "herculean_implant_core" update_appearance() qdel(tool) return ITEM_INTERACT_SUCCESS diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm b/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm index 9763b22e4b09..19ff1031d797 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm @@ -18,32 +18,36 @@ /// Eyecolor from the HUD var/hud_color = "#3CB8A5" +/obj/item/organ/cyberimp/eyes/hud/Initialize(mapload) + . = ..() + if(toggled_on) + for(var/hud_trait in HUD_traits) + add_organ_trait(hud_trait) + /obj/item/organ/cyberimp/eyes/hud/proc/toggle_hud(mob/living/carbon/human/eye_owner) if(toggled_on) toggled_on = FALSE - eye_owner.remove_traits(HUD_traits, ORGAN_TRAIT) + for(var/hud_trait in HUD_traits) + remove_organ_trait(hud_trait) balloon_alert(eye_owner, "hud disabled") if(hud_color) eye_owner.remove_eye_color(EYE_COLOR_HUD_PRIORITY) return toggled_on = TRUE - eye_owner.add_traits(HUD_traits, ORGAN_TRAIT) + for(var/hud_trait in HUD_traits) + add_organ_trait(hud_trait) balloon_alert(eye_owner, "hud enabled") if(hud_color) eye_owner.add_eye_color_right(hud_color, EYE_COLOR_HUD_PRIORITY) /obj/item/organ/cyberimp/eyes/hud/on_mob_insert(mob/living/carbon/human/eye_owner, special = FALSE, movement_flags) . = ..() - eye_owner.add_traits(HUD_traits, ORGAN_TRAIT) - toggled_on = TRUE - if(hud_color) + if(toggled_on && hud_color) eye_owner.add_eye_color_right(hud_color, EYE_COLOR_HUD_PRIORITY, !special) /obj/item/organ/cyberimp/eyes/hud/on_mob_remove(mob/living/carbon/human/eye_owner, special, movement_flags) . = ..() - eye_owner.remove_traits(HUD_traits, ORGAN_TRAIT) - toggled_on = FALSE - if(hud_color) + if(toggled_on && hud_color) eye_owner.remove_eye_color(EYE_COLOR_HUD_PRIORITY, !special) /obj/item/organ/cyberimp/eyes/hud/medical diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm index 18a778212289..f3212a39beaf 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm @@ -83,15 +83,20 @@ desc = "Injectors of extra sub-routines for the brain." zone = BODY_ZONE_HEAD w_class = WEIGHT_CLASS_TINY + /// Duration of stun when hit with worst-case emp + var/emp_stun_duration = 20 SECONDS + /// Duration of immobilization when hit with worst-case emp + var/emp_immobilize_duration = 0 SECONDS /obj/item/organ/cyberimp/brain/emp_act(severity) . = ..() - if(!owner || . & EMP_PROTECT_SELF) + if(isnull(owner) || (. & EMP_PROTECT_SELF)) return - var/stun_amount = 200/severity - owner.Stun(stun_amount) - to_chat(owner, span_warning("Your body seizes up!")) - + if(emp_immobilize_duration > 0) + owner.Immobilize(emp_immobilize_duration / severity) + if(emp_stun_duration > 0) + owner.Stun(emp_stun_duration / severity) + to_chat(owner, span_warning("Your body seizes up!")) /obj/item/organ/cyberimp/brain/anti_drop name = "anti-drop implant" @@ -202,8 +207,8 @@ owner.SetKnockdown(0) owner.SetImmobilized(0) owner.SetParalyzed(0) - owner.setStaminaLoss(0) - addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living, setStaminaLoss), 0), stun_resistance_time) + owner.set_stamina_loss(0) + addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living, set_stamina_loss), 0), stun_resistance_time) var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread sparks.set_up(5, 1, src) @@ -342,6 +347,129 @@ /obj/item/organ/cyberimp/brain/connector/proc/reboot() organ_flags &= ~ORGAN_FAILING +/obj/item/organ/cyberimp/brain/surgical_processor + name = "surgical processor implant" + desc = "A cybernetic brain implant that allows you to perform advanced operations anywhere, anytime." + icon_state = "brain_implant_antidrop" + slot = ORGAN_SLOT_BRAIN_HIPPOCAMPUS + emp_stun_duration = 0 SECONDS + emp_immobilize_duration = 4 SECONDS + /// Lazylist of surgeries this implant provides + var/list/loaded_surgeries + +/obj/item/organ/cyberimp/brain/surgical_processor/examine(mob/user) + . = ..() + if(length(loaded_surgeries)) + . += span_info("Load surgeries from an operating compuer or a disk containing surgery data. Loaded surgeries:") + for(var/datum/surgery_operation/downloaded_surgery as anything in GLOB.operations.get_instances_from(loaded_surgeries)) + if(!(downloaded_surgery.operation_flags & OPERATION_LOCKED)) + continue + // for simplicitly, filters out mechanical subtypes of normal surgeries + if((downloaded_surgery.operation_flags & OPERATION_MECHANIC) && (downloaded_surgery.parent_type in loaded_surgeries)) + continue + . += span_info("• [capitalize(downloaded_surgery.rnd_name || downloaded_surgery.name)]") + + else + . += span_info("Load surgeries from an operating compuer or a disk containing surgery data.") + . += span_info("No surgeries loaded. Surgeries must be loaded before installation.") + +/obj/item/organ/cyberimp/brain/surgical_processor/proc/load_surgeries(mob/living/user, obj/design_holder) + balloon_alert(user, "copying designs...") + playsound(src, 'sound/machines/terminal/terminal_processing.ogg', 25, TRUE) + if(do_after(user, 1 SECONDS, target = design_holder)) + if(istype(design_holder, /obj/item/disk/surgery)) + var/obj/item/disk/surgery/surgery_disk = design_holder + LAZYOR(loaded_surgeries, surgery_disk.surgeries) + else + var/obj/machinery/computer/operating/surgery_computer = design_holder + LAZYOR(loaded_surgeries, surgery_computer.advanced_surgeries) + playsound(src, 'sound/machines/terminal/terminal_success.ogg', 25, TRUE) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING + +/obj/item/organ/cyberimp/brain/surgical_processor/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(istype(interacting_with, /obj/item/disk/surgery) || istype(interacting_with, /obj/machinery/computer/operating)) + return load_surgeries(user, interacting_with) + return NONE + +/obj/item/organ/cyberimp/brain/surgical_processor/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/disk/surgery)) + return load_surgeries(user, tool) + return NONE + +/obj/item/organ/cyberimp/brain/surgical_processor/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) + . = ..() + RegisterSignal(organ_owner, COMSIG_LIVING_OPERATING_ON, PROC_REF(check_surgery)) + +/obj/item/organ/cyberimp/brain/surgical_processor/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags) + . = ..() + UnregisterSignal(organ_owner, COMSIG_LIVING_OPERATING_ON) + +/obj/item/organ/cyberimp/brain/surgical_processor/proc/check_surgery(datum/source, mob/living/patient, list/operations) + SIGNAL_HANDLER + + if(organ_flags & (ORGAN_FAILING|ORGAN_EMP)) + return + + operations |= loaded_surgeries + +/obj/item/organ/cyberimp/brain/surgical_processor/emp_act(severity) + . = ..() + if(isnull(owner) || (. & EMP_PROTECT_SELF)) + return + + var/obj/item/organ/surgeon_brain = owner.get_organ_by_type(/obj/item/organ/brain) + surgeon_brain.apply_organ_damage(20 / severity, maximum = 120) + + + var/duration = (30 SECONDS) / severity + if(owner.mob_mood?.mood_modifier > 0) + // forced insanity - reset to "only a little crazy" after + owner.mob_mood.set_sanity(SANITY_INSANE) + addtimer(CALLBACK(owner.mob_mood, TYPE_PROC_REF(/datum/mood, reset_sanity), SANITY_UNSTABLE + 10), duration, TIMER_DELETE_ME) + // and some moodlets to sell the sanity loss + owner.add_mood_event("surgery_emp", /datum/mood_event/surgery_emp_active) + addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living, add_mood_event), "surgery_emp", /datum/mood_event/surgery_emp_expired), duration, TIMER_DELETE_ME) + + // causes the surgeon to go crazy and start stabbing people + owner.apply_status_effect(/datum/status_effect/forced_combat, duration, (rand(8, 16) / severity)) + to_chat(owner, span_boldwarning("Your surgical processor malfunctions, giving you an overwhelming urge to incise, saw, and stitch!")) + +/datum/mood_event/surgery_emp_active + description = "THE PATIENT WILL NOT SURVIVE UNLESS THE OPERATION IS COMPLETE!" + mood_change = -90 + timeout = 1 MINUTES + special_screen_obj = "mood_despair" + +/datum/mood_event/surgery_emp_expired + description = "I lost control - Thankfully it's over now." + timeout = 5 MINUTES + +/obj/item/organ/cyberimp/brain/surgical_processor/pre_loaded + loaded_surgeries = list( + /datum/surgery_operation/basic/tend_wounds/combo/upgraded/master, + /datum/surgery_operation/limb/bioware/cortex_folding, + /datum/surgery_operation/limb/bioware/cortex_folding/mechanic, + /datum/surgery_operation/limb/bioware/cortex_imprint, + /datum/surgery_operation/limb/bioware/cortex_imprint/mechanic, + /datum/surgery_operation/limb/bioware/ligament_hook, + /datum/surgery_operation/limb/bioware/ligament_hook/mechanic, + /datum/surgery_operation/limb/bioware/ligament_reinforcement, + /datum/surgery_operation/limb/bioware/ligament_reinforcement/mechanic, + /datum/surgery_operation/limb/bioware/muscled_veins, + /datum/surgery_operation/limb/bioware/muscled_veins/mechanic, + /datum/surgery_operation/limb/bioware/nerve_grounding, + /datum/surgery_operation/limb/bioware/nerve_grounding/mechanic, + /datum/surgery_operation/limb/bioware/nerve_splicing, + /datum/surgery_operation/limb/bioware/nerve_splicing/mechanic, + /datum/surgery_operation/limb/bioware/vein_threading, + /datum/surgery_operation/limb/bioware/vein_threading/mechanic, + /datum/surgery_operation/organ/brainwash, + /datum/surgery_operation/organ/brainwash/mechanic, + /datum/surgery_operation/organ/pacify, + /datum/surgery_operation/organ/pacify/mechanic, + ) + //[[[[MOUTH]]]] /obj/item/organ/cyberimp/mouth zone = BODY_ZONE_PRECISE_MOUTH diff --git a/code/modules/surgery/organs/internal/ears/_ears.dm b/code/modules/surgery/organs/internal/ears/_ears.dm index 0c86cac08d56..9b5abe721ffb 100644 --- a/code/modules/surgery/organs/internal/ears/_ears.dm +++ b/code/modules/surgery/organs/internal/ears/_ears.dm @@ -14,15 +14,15 @@ now_fixed = span_info("Noise slowly begins filling your ears once more.") low_threshold_cleared = span_info("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 + /// temporary deafness, measured in seconds. While > 0, the person is unable to hear anything. + var/temporary_deafness = 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 + var/bang_protect = EAR_PROTECTION_NONE /// Multiplier for both long term and short term ear damage var/damage_multiplier = 1 @@ -39,23 +39,20 @@ // no healing if failing if(organ_flags & ORGAN_FAILING) return - adjustEarDamage(0, -0.5 * seconds_per_tick) + adjust_temporary_deafness(-seconds_per_tick SECONDS) if((damage > low_threshold) && SPT_PROB(damage / 60, seconds_per_tick)) - adjustEarDamage(0, 4) + adjust_temporary_deafness(4 SECONDS) SEND_SOUND(owner, sound('sound/items/weapons/flash_ring.ogg')) -/obj/item/organ/ears/apply_organ_damage(damage_amount, maximum, required_organ_flag) - . = ..() - update_temp_deafness() - /obj/item/organ/ears/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) . = ..() - update_temp_deafness() + if(temporary_deafness) + on_deafened() /obj/item/organ/ears/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags) . = ..() - UnregisterSignal(organ_owner, COMSIG_MOB_SAY) - REMOVE_TRAIT(organ_owner, TRAIT_DEAF, EAR_DAMAGE) + if(temporary_deafness) + on_undeafened(organ_owner) /obj/item/organ/ears/get_status_appendix(advanced, add_tooltips) if(owner.stat == DEAD || !HAS_TRAIT(owner, TRAIT_DEAF)) @@ -65,7 +62,7 @@ return conditional_tooltip("Subject is permanently deaf.", "Irreparable under normal circumstances.", add_tooltips) if(HAS_TRAIT_FROM(owner, TRAIT_DEAF, GENETIC_MUTATION)) return conditional_tooltip("Subject is genetically deaf.", "Use medication such as [/datum/reagent/medicine/mutadone::name].", add_tooltips) - if(HAS_TRAIT_FROM(owner, TRAIT_DEAF, EAR_DAMAGE)) + if((organ_flags & ORGAN_FAILING) || HAS_TRAIT_FROM(owner, TRAIT_DEAF, EAR_DAMAGE)) return conditional_tooltip("Subject is [(organ_flags & ORGAN_FAILING) ? "permanently": "temporarily"] deaf from ear damage.", "Repair surgically, use medication such as [/datum/reagent/medicine/inacusiate::name], or protect ears with earmuffs.", add_tooltips) return "Subject is deaf." @@ -73,52 +70,43 @@ // Always show if we have an appendix return ..() || (owner.stat != DEAD && HAS_TRAIT(owner, TRAIT_DEAF)) -/** - * Snowflake proc to handle temporary deafness - * - * * ddmg: Handles normal organ damage - * * ddeaf: Handles temporary deafness, 1 ddeaf = 2 seconds of deafness, by default (with no multiplier) - */ -/obj/item/organ/ears/proc/adjustEarDamage(ddmg = 0, ddeaf = 0) - if(HAS_TRAIT(owner, TRAIT_GODMODE)) - update_temp_deafness() +///Adjust the temporary deafness of the person, up or down +/obj/item/organ/ears/proc/adjust_temporary_deafness(amount) + // organ failure makes us permanently deafened. Also, doesn't do anything if not in someone or during godmode + if(amount > 0 && owner && HAS_TRAIT(owner, TRAIT_GODMODE)) return - var/mod_damage = ddmg > 0 ? (ddmg * damage_multiplier) : ddmg - if(mod_damage) - apply_organ_damage(mod_damage) - var/mod_deaf = ddeaf > 0 ? (ddeaf * damage_multiplier) : ddeaf - if(mod_deaf) - deaf = max(deaf + mod_deaf, 0) - update_temp_deafness() - -/// Updates status of deafness -/obj/item/organ/ears/proc/update_temp_deafness() - // if we're failing we always have at least some deaf stacks (and thus deafness) - if(organ_flags & ORGAN_FAILING) - deaf = max(deaf, 1 * damage_multiplier) + temporary_deafness = max(temporary_deafness + amount * damage_multiplier, 0) - if(isnull(owner)) + if(!owner) return - if(HAS_TRAIT(owner, TRAIT_GODMODE)) - deaf = 0 + if(temporary_deafness && !HAS_TRAIT_FROM(owner, TRAIT_DEAF, EAR_DAMAGE)) + on_deafened() + else if(!temporary_deafness && HAS_TRAIT_FROM(owner, TRAIT_DEAF, EAR_DAMAGE)) + on_undeafened() + +///Called when temporary deafness begins +/obj/item/organ/ears/proc/on_deafened() + RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(adjust_speech)) + ADD_TRAIT(owner, TRAIT_DEAF, EAR_DAMAGE) + +///Called when temporary deafness reaches zero. Has to have an 'organ_owner' arg, because by the time it's called on 'on_mob_remove', owner is already null +/obj/item/organ/ears/proc/on_undeafened(mob/living/organ_owner = owner) + REMOVE_TRAIT(organ_owner, TRAIT_DEAF, EAR_DAMAGE) + UnregisterSignal(organ_owner, COMSIG_MOB_SAY) + +/obj/item/organ/ears/on_begin_failure() + add_organ_trait(TRAIT_DEAF) - if(deaf > 0) - if(!HAS_TRAIT_FROM(owner, TRAIT_DEAF, EAR_DAMAGE)) - RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(adjust_speech)) - ADD_TRAIT(owner, TRAIT_DEAF, EAR_DAMAGE) - else - REMOVE_TRAIT(owner, TRAIT_DEAF, EAR_DAMAGE) - UnregisterSignal(owner, COMSIG_MOB_SAY) +/obj/item/organ/ears/on_failure_recovery() + remove_organ_trait(TRAIT_DEAF) /// Being deafened by loud noises makes you shout /obj/item/organ/ears/proc/adjust_speech(datum/source, list/speech_args) SIGNAL_HANDLER - if(HAS_TRAIT_NOT_FROM(source, TRAIT_DEAF, EAR_DAMAGE)) - return - if(HAS_TRAIT(source, TRAIT_SIGN_LANG)) + if(HAS_TRAIT_NOT_FROM(owner, TRAIT_DEAF, EAR_DAMAGE) || HAS_TRAIT(owner, TRAIT_SIGN_LANG)) return var/message = speech_args[SPEECH_MESSAGE] @@ -157,10 +145,9 @@ visual = TRUE damage_multiplier = 2 - preference = "feature_human_ears" restyle_flags = EXTERNAL_RESTYLE_FLESH - dna_block = /datum/dna_block/feature/ears + dna_block = /datum/dna_block/feature/accessory/ears bodypart_overlay = /datum/bodypart_overlay/mutant/cat_ears @@ -174,9 +161,6 @@ /// Layer upon which we add the inner ears overlay var/inner_layer = EXTERNAL_FRONT -/datum/bodypart_overlay/mutant/cat_ears/get_global_feature_list() - return SSaccessories.ears_list - /datum/bodypart_overlay/mutant/cat_ears/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) return !(bodypart_owner.owner?.obscured_slots & HIDEHAIR) @@ -200,6 +184,75 @@ /datum/bodypart_overlay/mutant/cat_ears/color_image(image/overlay, layer, obj/item/bodypart/limb) return // We color base ears manually above in get_image +/obj/item/organ/ears/cat/cybernetic + name = "basic cybernetic cat ears" + icon = 'icons/obj/medical/organs/organs.dmi' + icon_state = "ears-c-cat" + desc = "A basic cybernetic organ designed to mimic the operation of ears." + damage_multiplier = 2.4 + bodypart_overlay = /datum/bodypart_overlay/mutant/cat_ears/cybernetic + sprite_accessory_override = /datum/sprite_accessory/ears/cat/cybernetic + organ_flags = ORGAN_ROBOTIC + failing_desc = "seems to be broken." + +/obj/item/organ/ears/cat/cybernetic/upgraded + name = "cybernetic cat ears" + icon_state = "ears-c-cat-u" + desc = "A cybernetic cat ear, still less durable than human ears." + damage_multiplier = 1.5 + +/obj/item/organ/ears/cat/cybernetic/volume + name = "volume-adjusting cybernetic cat ears" + icon_state = "ears-c-cat-u2" + desc = "Advanced cybernetic cat ears capable of dampening loud noises to protect their user." + damage_multiplier = 1 + bang_protect = 1 + +/obj/item/organ/ears/cat/cybernetic/whisper + name = "whisper-sensiive cybernetic cat ears" + icon_state = "ears-c-cat-green" + desc = "Allows the user to more easily hear whispers. The user becomes extremely vulnerable to loud noises, however." + damage_multiplier = 3 // 4 would be excessive + organ_traits = list(TRAIT_GOOD_HEARING) + bodypart_overlay = /datum/bodypart_overlay/mutant/cat_ears/cybernetic/green + +/obj/item/organ/ears/cat/cybernetic/xray + name = "wall-penetrating cybernetic cat ears" + icon_state = "ears-c-cat-blue" + desc = "Through the power of modern feline engineering, allows the user to hear speech through walls. The user becomes extremely vulnerable to loud noises, however." + damage_multiplier = 3 // As above, 4 would be excessive + organ_traits = list(TRAIT_XRAY_HEARING) + bodypart_overlay = /datum/bodypart_overlay/mutant/cat_ears/cybernetic/blue + +/datum/bodypart_overlay/mutant/cat_ears/cybernetic + color_source = null + dyable = FALSE + /// Color of the inner ear + var/inner_color = "#F0004A" + +/datum/bodypart_overlay/mutant/cat_ears/cybernetic/get_image(image_layer, obj/item/bodypart/limb) + if (image_layer != bitflag_to_layer(inner_layer)) + return ..() + var/mutable_appearance/ear_holder = ..() + var/mutable_appearance/inner = ear_holder.overlays[2] + inner.color = inner_color + return ear_holder + +/datum/bodypart_overlay/mutant/cat_ears/cybernetic/get_overlay(layer, obj/item/bodypart/limb) + if (layer != inner_layer) + return ..() + var/list/all_images = ..() + var/mutable_appearance/ear_holder = all_images[1] + var/mutable_appearance/inner = ear_holder.overlays[2] + all_images += emissive_appearance(inner.icon, inner.icon_state, limb, layer = inner.layer, alpha = inner.alpha * 0.75) + return all_images + +/datum/bodypart_overlay/mutant/cat_ears/cybernetic/green + inner_color = "#0079EA" + +/datum/bodypart_overlay/mutant/cat_ears/cybernetic/blue + inner_color = "#00D844" + /obj/item/organ/ears/ghost name = "ghost ears" desc = "All the more to hear you... though it can't hear through walls." @@ -225,48 +278,41 @@ name = "basic cybernetic ears" icon_state = "ears-c" desc = "A basic cybernetic organ designed to mimic the operation of ears." - damage_multiplier = 0.9 + damage_multiplier = 1.2 organ_flags = ORGAN_ROBOTIC failing_desc = "seems to be broken." /obj/item/organ/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 + desc = "A cybernetic ear, surpassing the performance of organic ears." + damage_multiplier = 0.75 /obj/item/organ/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" + 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 + organ_traits = list(TRAIT_GOOD_HEARING) -// 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/ears/cybernetic/whisper/on_mob_insert(mob/living/carbon/ear_owner) - . = ..() - ADD_TRAIT(ear_owner, TRAIT_GOOD_HEARING, ORGAN_TRAIT) - -/obj/item/organ/ears/cybernetic/whisper/on_mob_remove(mob/living/carbon/ear_owner) - . = ..() - REMOVE_TRAIT(ear_owner, TRAIT_GOOD_HEARING, ORGAN_TRAIT) +/obj/item/organ/ears/cybernetic/volume + name = "volume-adjusting cybernetic ears" + icon_state = "ears-c-u" + desc = "Advanced cybernetic ears capable of dampening loud noises to protect their user." + bang_protect = EAR_PROTECTION_NORMAL + damage_multiplier = 0.5 // "X-ray ears" that let you hear through walls /obj/item/organ/ears/cybernetic/xray name = "wall-penetrating cybernetic ears" icon_state = "ears-c-u" - desc = "Through the power of modern engineering, allows the user to hear speech through walls. The user becomes extra vulnerable to loud noises, however" + desc = "Through 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/ears/cybernetic/xray/on_mob_insert(mob/living/carbon/ear_owner) - . = ..() - ADD_TRAIT(ear_owner, TRAIT_XRAY_HEARING, ORGAN_TRAIT) - -/obj/item/organ/ears/cybernetic/xray/on_mob_remove(mob/living/carbon/ear_owner) - . = ..() - REMOVE_TRAIT(ear_owner, TRAIT_XRAY_HEARING, ORGAN_TRAIT) + organ_traits = list(TRAIT_XRAY_HEARING) /obj/item/organ/ears/cybernetic/emp_act(severity) . = ..() diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index 5d1d37ca9f99..38d2f3237b88 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -22,8 +22,6 @@ /// 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 @@ -39,6 +37,9 @@ var/eye_color_left = null // set to a hex code to override a mob's left eye color var/eye_color_right = null // set to a hex code to override a mob's right eye color + /// The icon file of that eyes as its applied to the mob + var/eye_icon = 'icons/mob/human/human_eyes.dmi' + /// The icon state of that eyes as its applied to the mob var/eye_icon_state = "eyes" /// Do these eyes have blinking animations var/blink_animation = TRUE @@ -52,8 +53,6 @@ /// 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 /// Scarring on this organ @@ -82,8 +81,13 @@ /obj/item/organ/eyes/on_mob_insert(mob/living/carbon/receiver, special, movement_flags) . = ..() + if(organ_flags & ORGAN_FAILING) + receiver.become_blind(EYE_DAMAGE) + if(damage >= low_threshold) + receiver.assign_nearsightedness(EYE_DAMAGE, damage >= high_threshold ? 3 : 2, TRUE) + receiver.cure_blind(NO_EYES) - apply_damaged_eye_effects() + // Ensures that non-player mobs get their eye colors assigned, as players get them from prefs if (ishuman(receiver)) var/mob/living/carbon/human/as_human = receiver @@ -91,9 +95,17 @@ eye_color_left = as_human.eye_color_left if (!eye_color_right) eye_color_right = as_human.eye_color_right + RegisterSignals(receiver, list( + SIGNAL_ADDTRAIT(TRAIT_LUMINESCENT_EYES), + SIGNAL_REMOVETRAIT(TRAIT_LUMINESCENT_EYES), + SIGNAL_ADDTRAIT(TRAIT_REFLECTIVE_EYES), + SIGNAL_REMOVETRAIT(TRAIT_REFLECTIVE_EYES), + ), PROC_REF(on_shiny_eyes_trait_update)) + refresh(receiver, call_update = TRUE) RegisterSignal(receiver, COMSIG_ATOM_BULLET_ACT, PROC_REF(on_bullet_act)) RegisterSignal(receiver, COMSIG_COMPONENT_CLEAN_FACE_ACT, PROC_REF(on_face_wash)) + if (scarring) apply_scarring_effects() @@ -134,19 +146,37 @@ if(!special) human_owner.update_body() + // become blind (if not special) + if(!special) + organ_owner.become_blind(NO_EYES) + // Cure blindness from eye damage organ_owner.cure_blind(EYE_DAMAGE) organ_owner.cure_nearsighted(EYE_DAMAGE) // Eye blind and temp blind go to, even if this is a bit of cheesy way to clear blindness organ_owner.remove_status_effect(/datum/status_effect/eye_blur) organ_owner.remove_status_effect(/datum/status_effect/temporary_blindness) - // Then become blind anyways (if not special) - if(!special) - organ_owner.become_blind(NO_EYES) + + if (scarring) + organ_owner.cure_nearsighted(TRAIT_RIGHT_EYE_SCAR) + organ_owner.cure_nearsighted(TRAIT_LEFT_EYE_SCAR) + organ_owner.cure_blind(EYE_SCARRING_TRAIT) organ_owner.update_tint() organ_owner.update_sight() - UnregisterSignal(organ_owner, list(COMSIG_ATOM_BULLET_ACT, COMSIG_COMPONENT_CLEAN_FACE_ACT)) + UnregisterSignal(organ_owner, list( + COMSIG_ATOM_BULLET_ACT, + COMSIG_COMPONENT_CLEAN_FACE_ACT, + SIGNAL_ADDTRAIT(TRAIT_LUMINESCENT_EYES), + SIGNAL_REMOVETRAIT(TRAIT_LUMINESCENT_EYES), + SIGNAL_ADDTRAIT(TRAIT_REFLECTIVE_EYES), + SIGNAL_REMOVETRAIT(TRAIT_REFLECTIVE_EYES), + )) + +///Called whenever the luminescent and/or reflective eyes traits are added or removed +/obj/item/organ/eyes/proc/on_shiny_eyes_trait_update(mob/living/carbon/human/source) + SIGNAL_HANDLER + source.update_eyes() /obj/item/organ/eyes/update_atom_colour() . = ..() @@ -263,13 +293,12 @@ if(isnull(eye_icon_state)) return list() - var/mutable_appearance/eye_left = mutable_appearance('icons/mob/human/human_face.dmi', "[eye_icon_state]_l", -EYES_LAYER, parent) - var/mutable_appearance/eye_right = mutable_appearance('icons/mob/human/human_face.dmi', "[eye_icon_state]_r", -EYES_LAYER, parent) + var/mutable_appearance/eye_left = mutable_appearance(eye_icon, "[eye_icon_state]_l", -EYES_LAYER, parent) + var/mutable_appearance/eye_right = mutable_appearance(eye_icon, "[eye_icon_state]_r", -EYES_LAYER, parent) var/list/overlays = list(eye_left, eye_right) - if(overlay_ignore_lighting && !(parent.obscured_slots & HIDEEYES)) - overlays += emissive_appearance(eye_left.icon, eye_left.icon_state, parent, -EYES_LAYER, alpha = eye_left.alpha) - overlays += emissive_appearance(eye_right.icon, eye_right.icon_state, parent, -EYES_LAYER, alpha = eye_right.alpha) + if(!(parent.obscured_slots & HIDEEYES)) + overlays += get_emissive_overlays(eye_left, eye_right, parent) var/obj/item/bodypart/head/my_head = parent.get_bodypart(BODY_ZONE_HEAD) @@ -284,12 +313,12 @@ overlays += eyelids if (scarring & RIGHT_EYE_SCAR) - var/mutable_appearance/right_scar = mutable_appearance('icons/mob/human/human_face.dmi', "eye_scar_right", -EYES_LAYER, parent) + var/mutable_appearance/right_scar = mutable_appearance('icons/mob/human/human_eyes.dmi', "eye_scar_right", -EYES_LAYER, parent) right_scar.color = my_head.draw_color overlays += right_scar if (scarring & LEFT_EYE_SCAR) - var/mutable_appearance/left_scar = mutable_appearance('icons/mob/human/human_face.dmi', "eye_scar_left", -EYES_LAYER, parent) + var/mutable_appearance/left_scar = mutable_appearance('icons/mob/human/human_eyes.dmi', "eye_scar_left", -EYES_LAYER, parent) left_scar.color = my_head.draw_color overlays += left_scar @@ -299,6 +328,19 @@ return overlays +///Returns the two emissive overlays built for the left and right eyes, in order. +/obj/item/organ/eyes/proc/get_emissive_overlays(mutable_appearance/eye_left, mutable_appearance/eye_right, atom/spokesman) + var/list/return_list = list() + var/emissive_effect + if((owner && HAS_TRAIT(owner, TRAIT_LUMINESCENT_EYES)) || (TRAIT_LUMINESCENT_EYES in organ_traits)) + emissive_effect = EMISSIVE_BLOOM + else if((owner && HAS_TRAIT(owner, TRAIT_REFLECTIVE_EYES)) || (TRAIT_REFLECTIVE_EYES in organ_traits)) + emissive_effect = EMISSIVE_SPECULAR + if(emissive_effect) + return_list += emissive_appearance(eye_left.icon, eye_left.icon_state, spokesman, -EYES_LAYER, alpha = eye_left.alpha, effect_type = emissive_effect) + return_list += emissive_appearance(eye_right.icon, eye_right.icon_state, spokesman, -EYES_LAYER, alpha = eye_right.alpha, effect_type = emissive_effect) + return return_list + /obj/item/organ/eyes/update_overlays() . = ..() if (scarring & RIGHT_EYE_SCAR) @@ -358,13 +400,6 @@ owner.cure_blind(EYE_SCARRING_TRAIT) owner.update_body() -/obj/item/organ/eyes/on_mob_remove(mob/living/carbon/eye_owner) - . = ..() - if (scarring) - eye_owner.cure_nearsighted(TRAIT_RIGHT_EYE_SCAR) - eye_owner.cure_nearsighted(TRAIT_LEFT_EYE_SCAR) - eye_owner.cure_blind(EYE_SCARRING_TRAIT) - #undef OFFSET_X #undef OFFSET_Y @@ -374,38 +409,28 @@ eye_color_left = initial(eye_color_left) eye_color_right = initial(eye_color_right) -/obj/item/organ/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/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) - // and cure blindness from damage - owner.cure_blind(EYE_DAMAGE) +/obj/item/organ/eyes/on_low_damage_received() + if(damage >= high_threshold) return + owner?.assign_nearsightedness(EYE_DAMAGE, 2, TRUE) - //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) +/obj/item/organ/eyes/on_high_damage_received() + owner?.assign_nearsightedness(EYE_DAMAGE, 3, TRUE) - else - // become nearsighted from damage - var/severity = damage > high_threshold ? 3 : 2 - owner.assign_nearsightedness(EYE_DAMAGE, severity, TRUE) +/obj/item/organ/eyes/on_begin_failure() + owner?.become_blind(EYE_DAMAGE) + +/obj/item/organ/eyes/on_failure_recovery() + owner?.cure_blind(EYE_DAMAGE) + +/obj/item/organ/eyes/on_high_damage_healed() + if(damage <= low_threshold) + return + owner?.assign_nearsightedness(EYE_DAMAGE, 2, TRUE) - damaged = TRUE +/obj/item/organ/eyes/on_low_damage_healed() + // clear nearsightedness from damage + owner?.cure_nearsighted(EYE_DAMAGE) /obj/item/organ/eyes/feel_for_damage(self_aware) // Eye damage has visual effects, so we don't really need to "feel" it when self-examining @@ -518,7 +543,7 @@ /obj/effect/abstract/eyelid_effect name = "eyelid" - icon = 'icons/mob/human/human_face.dmi' + icon = 'icons/mob/human/human_eyes.dmi' layer = -EYES_LAYER vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE | VIS_INHERIT_ID @@ -541,6 +566,7 @@ #define NIGHTVISION_LIGHT_HIG 3 /obj/item/organ/eyes/night_vision + abstract_type = /obj/item/organ/eyes/night_vision actions_types = list(/datum/action/item_action/organ_action/use) // These lists are used as the color cutoff for the eye @@ -681,16 +707,9 @@ eye_color_left = "#3cb8a5" eye_color_right = "#3cb8a5" sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS + organ_traits = list(TRAIT_XRAY_VISION) penlight_message = "replaced by small radiation emitters and detectors" -/obj/item/organ/eyes/robotic/xray/on_mob_insert(mob/living/carbon/eye_owner) - . = ..() - ADD_TRAIT(eye_owner, TRAIT_XRAY_VISION, ORGAN_TRAIT) - -/obj/item/organ/eyes/robotic/xray/on_mob_remove(mob/living/carbon/eye_owner) - . = ..() - REMOVE_TRAIT(eye_owner, TRAIT_XRAY_VISION, ORGAN_TRAIT) - /obj/item/organ/eyes/robotic/thermals name = "thermal eyes" desc = "These cybernetic eye implants will give you thermal vision. Vertical slit pupil included." @@ -714,6 +733,7 @@ iris_overlay = null flash_protect = FLASH_PROTECTION_WELDER tint = INFINITY + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 2.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.9) var/obj/item/flashlight/eyelight/eye light_reactive = FALSE pupils_name = "flashlights" @@ -858,12 +878,12 @@ set_beam_range(new_range) return TRUE if("pick_color") - var/new_color = input( + var/new_color = tgui_color_picker( usr, "Choose eye color color:", "High Luminosity Eyes Menu", light_color_string - ) as color|null + ) if(new_color) var/to_update = params["to_update"] set_beam_color(new_color, to_update) @@ -1004,17 +1024,25 @@ if(QDELETED(eye_owner) || !ishuman(eye_owner)) //Other carbon mobs don't have eye color. return + 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 |= HEAD_EYECOLOR + + ///enabling and disabling the TRAIT_LUMINESCENT_EYES trait already calls handle_eyes(), in that case, let's skip that call + var/skip_call = FALSE if(!eye.light_on) eye_icon_state = initial(eye_icon_state) - overlay_ignore_lighting = FALSE + skip_call = HAS_TRAIT_FROM_ONLY(eye_owner, TRAIT_LUMINESCENT_EYES, REF(src)) + remove_organ_trait(TRAIT_LUMINESCENT_EYES) else - overlay_ignore_lighting = TRUE + skip_call = !HAS_TRAIT(eye_owner, TRAIT_LUMINESCENT_EYES) + add_organ_trait(TRAIT_LUMINESCENT_EYES) 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) + if(!skip_call && ishuman(eye_owner)) + var/mob/living/carbon/human/humie = eye_owner + humie.update_eyes() + head.head_flags = previous_flags #undef MATCH_LIGHT_COLOR @@ -1140,7 +1168,7 @@ eye_color_right = "#f74a4d" eye_icon_state = "eyes_glow" iris_overlay = null - overlay_ignore_lighting = TRUE + organ_traits = list(TRAIT_UNNATURAL_RED_GLOWY_EYES, TRAIT_LUMINESCENT_EYES) flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE low_light_cutoff = list(5, 12, 20) medium_light_cutoff = list(15, 20, 30) @@ -1153,12 +1181,8 @@ apply_organ_damage(20 * examtool.light_power) //that's 0.5 lightpower for a penlight, so one penlight shining is equivalent to two seconds in a lit area return span_danger("[owner.p_Their()] eyes [penlight_message].") -/obj/item/organ/eyes/night_vision/maintenance_adapted/on_mob_insert(mob/living/carbon/eye_owner) - . = ..() - ADD_TRAIT(eye_owner, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT) - /obj/item/organ/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 + if(owner.get_eye_protection() <= FLASH_PROTECTION_SENSITIVE && !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) @@ -1166,10 +1190,6 @@ apply_organ_damage(-10) //heal quickly . = ..() -/obj/item/organ/eyes/night_vision/maintenance_adapted/on_mob_remove(mob/living/carbon/unadapted, special = FALSE, movement_flags) - REMOVE_TRAIT(unadapted, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT) - return ..() - /obj/item/organ/eyes/pod name = "pod eyes" desc = "Strangest salad you've ever seen." @@ -1179,3 +1199,9 @@ iris_overlay = null foodtype_flags = PODPERSON_ORGAN_FOODTYPES penlight_message = "are green and plant-like" + +/obj/item/organ/eyes/felinid + name = "felinid eyes" + desc = "A pair of highly reflective eyes with slit pupils, like those of a cat." + pupils_name = "slit pupils" + penlight_message = "shine under the pearly light" diff --git a/code/modules/surgery/organs/internal/heart/_heart.dm b/code/modules/surgery/organs/internal/heart/_heart.dm index ce04a2fb66d5..6f272b57d583 100644 --- a/code/modules/surgery/organs/internal/heart/_heart.dm +++ b/code/modules/surgery/organs/internal/heart/_heart.dm @@ -247,20 +247,16 @@ if(stabilization_available && owner.health <= owner.crit_threshold) stabilize_heart() - if(bleed_prevention && ishuman(owner) && owner.blood_volume < BLOOD_VOLUME_NORMAL) + // Wound healing is intentionally tied to blood volume. + if(bleed_prevention && ishuman(owner) && owner.get_blood_volume() < BLOOD_VOLUME_NORMAL) var/mob/living/carbon/human/wounded_owner = owner - wounded_owner.blood_volume += 2 * seconds_per_tick - if(toxification_probability && prob(toxification_probability)) - wounded_owner.adjustToxLoss(1 * seconds_per_tick, updating_health = FALSE) - var/datum/wound/bloodiest_wound + wounded_owner.adjust_blood_volume(2 * seconds_per_tick) - for(var/datum/wound/iter_wound as anything in wounded_owner.all_wounds) - if(iter_wound.blood_flow && iter_wound.blood_flow > bloodiest_wound?.blood_flow) - bloodiest_wound = iter_wound + if(toxification_probability && prob(toxification_probability)) + wounded_owner.adjust_tox_loss(1 * seconds_per_tick, updating_health = FALSE) - if(bloodiest_wound) - bloodiest_wound.adjust_blood_flow(-1 * seconds_per_tick) + wounded_owner.coagulant_effect(1 * seconds_per_tick) /obj/item/organ/heart/cybernetic/proc/stabilize_heart() ADD_TRAIT(owner, TRAIT_NOSOFTCRIT, ORGAN_TRAIT) diff --git a/code/modules/surgery/organs/internal/heart/heart_anomalock.dm b/code/modules/surgery/organs/internal/heart/heart_anomalock.dm index de2fc9626d6a..78d3d64b715a 100644 --- a/code/modules/surgery/organs/internal/heart/heart_anomalock.dm +++ b/code/modules/surgery/organs/internal/heart/heart_anomalock.dm @@ -33,13 +33,17 @@ QDEL_NULL(core) return ..() +/obj/item/organ/heart/cybernetic/anomalock/examine(mob/user) + . = ..() + . += span_info("The voltaic boost will avoid healing toxin damage at all in slime-based humanoids, to prevent harmful side effects.") + /obj/item/organ/heart/cybernetic/anomalock/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) . = ..() if(!core) return add_lightning_overlay(30 SECONDS) playsound(organ_owner, 'sound/items/eshield_recharge.ogg', 40) - organ_owner.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) + organ_owner.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS|EMP_NO_EXAMINE) RegisterSignal(organ_owner, SIGNAL_ADDTRAIT(TRAIT_CRITICAL_CONDITION), PROC_REF(activate_survival)) RegisterSignal(organ_owner, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act)) @@ -48,7 +52,7 @@ if(!core) return UnregisterSignal(organ_owner, SIGNAL_ADDTRAIT(TRAIT_CRITICAL_CONDITION)) - organ_owner.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) + organ_owner.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS|EMP_NO_EXAMINE) tesla_zap(source = organ_owner, zap_range = 20, power = 2.5e5, cutoff = 1e3) qdel(src) @@ -98,8 +102,7 @@ if(!core) return - if(owner.blood_volume <= BLOOD_VOLUME_NORMAL) - owner.blood_volume += 5 * seconds_per_tick + owner.adjust_blood_volume(5 * seconds_per_tick, maximum = BLOOD_VOLUME_NORMAL) if(owner.health <= owner.crit_threshold) activate_survival(owner) @@ -108,7 +111,7 @@ return var/list/batteries = list() - for(var/obj/item/stock_parts/power_store/cell in owner.get_all_cells()) + for(var/obj/item/stock_parts/power_store/cell in assoc_to_values(owner.get_all_cells())) if(cell.used_charge()) batteries += cell @@ -183,14 +186,19 @@ duration = 30 SECONDS alert_type = /atom/movable/screen/alert/status_effect/anomalock_active show_duration = TRUE + processing_speed = STATUS_EFFECT_PRIORITY /datum/status_effect/voltaic_overdrive/tick(seconds_between_ticks) . = ..() - - if(owner.health <= owner.crit_threshold) - owner.heal_overall_damage(5, 5) - owner.adjustOxyLoss(-5) - owner.adjustToxLoss(-5) + if(owner.health > owner.crit_threshold) + return + var/needs_update = FALSE + needs_update += owner.heal_overall_damage(brute = 5, burn = 5, updating_health = FALSE) + needs_update += owner.adjust_oxy_loss(-5, updating_health = FALSE) + if(!HAS_TRAIT(owner, TRAIT_TOXINLOVER)) + needs_update += owner.adjust_tox_loss(-5, updating_health = FALSE) + if(needs_update) + owner.updatehealth() /datum/status_effect/voltaic_overdrive/on_apply() . = ..() @@ -210,7 +218,8 @@ /atom/movable/screen/alert/status_effect/anomalock_active name = "voltaic overdrive" - icon_state = "anomalock_heart" + use_user_hud_icon = TRUE + overlay_state = "anomalock_heart" desc = "Voltaic energy is flooding your muscles, keeping your body upright. You have 30 seconds before it falters!" /obj/item/organ/heart/cybernetic/anomalock/hear_beat_noise(mob/living/hearer) diff --git a/code/modules/surgery/organs/internal/liver/_liver.dm b/code/modules/surgery/organs/internal/liver/_liver.dm index f6995237c694..7038dbee8a66 100755 --- a/code/modules/surgery/organs/internal/liver/_liver.dm +++ b/code/modules/surgery/organs/internal/liver/_liver.dm @@ -16,7 +16,6 @@ decay_factor = STANDARD_ORGAN_DECAY // smack in the middle of decay times food_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue = 5, /datum/reagent/iron = 5) - grind_results = list(/datum/reagent/consumable/nutriment/peptides = 5) cell_line = CELL_LINE_ORGAN_LIVER cells_minimum = 1 @@ -38,6 +37,9 @@ 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)) +/obj/item/organ/liver/grind_results() + return list(/datum/reagent/consumable/nutriment/peptides = 5) + /* Signal handler for the liver gaining the TRAIT_COMEDY_METABOLISM trait * * Adds the "squeak" component, so clown livers will act just like their @@ -165,17 +167,17 @@ 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_tox_loss(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_tox_loss(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_tox_loss(0.6 * seconds_per_tick,forced = TRUE) + owner.adjust_organ_loss(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) @@ -183,8 +185,8 @@ 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_tox_loss(0.8 * seconds_per_tick,forced = TRUE) + owner.adjust_organ_loss(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) @@ -247,7 +249,7 @@ if(. & EMP_PROTECT_SELF) return if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people. - owner.adjustToxLoss(10) + owner.adjust_tox_loss(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. @@ -302,7 +304,7 @@ if(!(organ_owner.mob_biotypes & MOB_PLANT)) return if(chem.type == /datum/reagent/toxin/plantbgone) - organ_owner.adjustToxLoss(3 * REM * seconds_per_tick) + organ_owner.adjust_tox_loss(3 * REM * seconds_per_tick) /obj/item/organ/liver/snail name = "snail liver" @@ -328,7 +330,7 @@ return if(istype(chem, /datum/reagent/consumable/salt)) playsound(organ_owner, SFX_SEAR, 30, TRUE) - organ_owner.adjustFireLoss(2 * REM * seconds_per_tick) + organ_owner.adjust_fire_loss(2 * REM * seconds_per_tick) organ_owner.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * seconds_per_tick) return COMSIG_MOB_STOP_REAGENT_TICK @@ -357,8 +359,7 @@ /obj/item/organ/liver/bloody/on_life(seconds_per_tick, times_fired) . = ..() - if(owner.blood_volume < BLOOD_VOLUME_NORMAL) - owner.blood_volume += 4 * seconds_per_tick + owner.adjust_blood_volume(4 * seconds_per_tick, maximum = BLOOD_VOLUME_NORMAL) /// Convert all non-alcoholic drinks into alcohol /obj/item/organ/liver/distillery diff --git a/code/modules/surgery/organs/internal/liver/liver_skeleton.dm b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm index b067e68ad3db..fe5d9764e548 100644 --- a/code/modules/surgery/organs/internal/liver/liver_skeleton.dm +++ b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm @@ -19,8 +19,8 @@ if((. & COMSIG_MOB_STOP_REAGENT_TICK) || (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) + organ_owner.adjust_stamina_loss(7.5 * REM * seconds_per_tick, updating_stamina = FALSE) + organ_owner.adjust_brute_loss(0.5 * REM * seconds_per_tick, updating_health = FALSE) if(SPT_PROB(10, seconds_per_tick)) switch(rand(1, 3)) if(1) diff --git a/code/modules/surgery/organs/internal/lungs/_lungs.dm b/code/modules/surgery/organs/internal/lungs/_lungs.dm index c15dd74a2635..48be0c3259c2 100644 --- a/code/modules/surgery/organs/internal/lungs/_lungs.dm +++ b/code/modules/surgery/organs/internal/lungs/_lungs.dm @@ -263,7 +263,7 @@ 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) + breather.adjust_oxy_loss(-5) /// Maximum Oxygen effects. "Too much O2!" /obj/item/organ/lungs/proc/too_much_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp) @@ -310,7 +310,7 @@ 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) + breather.adjust_oxy_loss(-5) /// Maximum CO2 effects. "Too much CO2!" /obj/item/organ/lungs/proc/too_much_co2(mob/living/carbon/breather, datum/gas_mixture/breath, co2_pp, old_co2_pp) @@ -364,7 +364,7 @@ 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) + breather.adjust_oxy_loss(-5) /// Maximum Plasma effects. "Too much Plasma!" /obj/item/organ/lungs/proc/too_much_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, plasma_pp, old_plasma_pp) @@ -390,7 +390,7 @@ if(bz_pp > BZ_trip_balls_min) breather.reagents.add_reagent(/datum/reagent/bz_metabolites, clamp(bz_pp, 1, 5)) if(bz_pp > BZ_brain_damage_min && prob(33)) - breather.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150, ORGAN_ORGANIC) + breather.adjust_organ_loss(ORGAN_SLOT_BRAIN, 3, 150, ORGAN_ORGANIC) /// Breathing in refridgerator coolent, shit's caustic /obj/item/organ/lungs/proc/too_much_freon(mob/living/carbon/breather, datum/gas_mixture/breath, freon_pp, old_freon_pp) @@ -402,12 +402,12 @@ to_chat(breather, span_alert("Your mouth feels like it's burning!")) if (freon_pp > 40) breather.emote("gasp") - breather.adjustFireLoss(15) + breather.adjust_fire_loss(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) + breather.adjust_fire_loss(freon_pp / 4) /// Breathing in halon, convert it to a reagent /obj/item/organ/lungs/proc/too_much_halon(mob/living/carbon/breather, datum/gas_mixture/breath, halon_pp, old_halon_pp) @@ -415,7 +415,7 @@ breathe_gas_volume(breath, /datum/gas/halon) // Metabolize to reagent. if(halon_pp > gas_stimulation_min) - breather.adjustOxyLoss(5) + breather.adjust_oxy_loss(5) breather.reagents.add_reagent(/datum/reagent/halon, max(0, 1 - breather.reagents.get_reagent_amount(/datum/reagent/halon))) /// Sleeping gas with healing properties. @@ -555,7 +555,7 @@ // 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) + breather.adjust_organ_loss(ORGAN_SLOT_LUNGS, nitrium_pp * 0.1) to_chat(breather, span_notice("You feel a burning sensation in your chest")) // Metabolize to reagents. if (nitrium_pp > 5) @@ -572,7 +572,7 @@ // 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)) + breather.adjust_tox_loss(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) @@ -629,7 +629,7 @@ 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) + breather.adjust_oxy_loss(-5) else // Can't breathe! breather.failed_last_breath = TRUE @@ -752,13 +752,13 @@ // Low pressure. if(breath_pp) var/ratio = safe_breath_min / breath_pp - suffocator.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS)) + suffocator.apply_damage(min(5 * ratio, HUMAN_MAX_OXYLOSS), OXY) return mole_count * ratio / 6 // Zero pressure. if(suffocator.health >= suffocator.crit_threshold) - suffocator.adjustOxyLoss(HUMAN_MAX_OXYLOSS) + suffocator.apply_damage(HUMAN_MAX_OXYLOSS, OXY) else - suffocator.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) + suffocator.apply_damage(HUMAN_CRIT_MAX_OXYLOSS, OXY) /obj/item/organ/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/breather) // called by human/life, handles temperatures @@ -911,7 +911,7 @@ . = ..() 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. + breather_slime.adjust_blood_volume(0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you. /obj/item/organ/lungs/smoker_lungs name = "smoker lungs" @@ -1124,7 +1124,7 @@ icon_state = "lungs-evolved" safe_plasma_max = 8 - safe_co2_max = 8 + safe_co2_max = 20 maxHealth = 1.2 * STANDARD_ORGAN_THRESHOLD safe_oxygen_min = 8 diff --git a/code/modules/surgery/organs/internal/stomach/_stomach.dm b/code/modules/surgery/organs/internal/stomach/_stomach.dm index 658598ee7d76..678576144fa7 100644 --- a/code/modules/surgery/organs/internal/stomach/_stomach.dm +++ b/code/modules/surgery/organs/internal/stomach/_stomach.dm @@ -39,7 +39,7 @@ /// Whether the stomach's been repaired with surgery and can be fixed again or not var/operated = FALSE /// List of all atoms within the stomach - var/list/atom/movable/stomach_contents = list() + var/list/atom/movable/stomach_contents /// Have we been cut open with a scalpel? If so, how much damage from it we still have from it and can be recovered with a cauterizing tool. /// All healing goes towards recovering this. var/cut_open_damage = 0 @@ -53,7 +53,7 @@ reagents.flags |= REAGENT_HOLDER_ALIVE /obj/item/organ/stomach/Destroy() - QDEL_LIST(stomach_contents) + QDEL_LAZYLIST(stomach_contents) return ..() /obj/item/organ/stomach/on_life(seconds_per_tick, times_fired) @@ -215,19 +215,19 @@ /obj/item/organ/stomach/proc/consume_thing(atom/movable/thing) RegisterSignal(thing, COMSIG_MOVABLE_MOVED, PROC_REF(content_moved)) RegisterSignal(thing, COMSIG_QDELETING, PROC_REF(content_deleted)) - stomach_contents += thing + LAZYADD(stomach_contents, thing) thing.forceMove(owner || src) // We assert that if we have no owner, we will not be nullspaced return TRUE /obj/item/organ/stomach/proc/content_deleted(atom/movable/source) SIGNAL_HANDLER - stomach_contents -= source + LAZYREMOVE(stomach_contents, source) /obj/item/organ/stomach/proc/content_moved(atom/movable/source) SIGNAL_HANDLER if(source.loc == src || source.loc == owner) // not in us? out da list then return - stomach_contents -= source + LAZYREMOVE(stomach_contents, source) UnregisterSignal(source, list(COMSIG_MOVABLE_MOVED, COMSIG_QDELETING)) /obj/item/organ/stomach/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) @@ -248,7 +248,7 @@ var/total_chance = chance // If min_amount is set, make sure that we vomit at least some of our contents if (min_amount) - total_chance += 100 / (length(stomach_contents) + 1 - min_amount) + total_chance += 100 / (LAZYLEN(stomach_contents) + 1 - min_amount) if (!prob(total_chance)) continue nugget.forceMove(drop_loc) @@ -271,7 +271,7 @@ if (!owner || SSmobs.times_fired % 3 != 0) return - if (!length(stomach_contents)) + if (!LAZYLEN(stomach_contents)) return var/obj/item/bodypart/chest/chest = owner.get_bodypart(zone) @@ -305,7 +305,7 @@ if (chest && !chest.cavity_item && as_item.w_class <= WEIGHT_CLASS_NORMAL) // Oopsie! chest.cavity_item = as_item - stomach_contents -= as_item + LAZYREMOVE(stomach_contents, as_item) continue owner.apply_damage(as_item.w_class * (as_item.sharpness ? 2 : 1), BRUTE, BODY_ZONE_CHEST, wound_bonus = CANT_WOUND, @@ -333,7 +333,7 @@ if (isliving(nomnom)) // NO VORE ALLOWED return 0 // Yeah maybe don't, if something edible ended up here it should either handle itself or not be digested - if (IsEdible(nomnom)) + if (IS_EDIBLE(nomnom)) return 0 if (HAS_TRAIT(owner, TRAIT_STRONG_STOMACH)) return 10 @@ -411,7 +411,7 @@ /// If damage is high enough, we may end up vomiting out whatever we had stored /obj/item/organ/stomach/proc/on_punched(datum/source, mob/living/carbon/human/attacker, damage, attack_type, obj/item/bodypart/affecting, final_armor_block, kicking, limb_sharpness) SIGNAL_HANDLER - if (!length(stomach_contents) || damage < 9 || final_armor_block || kicking) + if (!LAZYLEN(stomach_contents) || damage < 9 || final_armor_block || kicking) return if (owner.vomit(MOB_VOMIT_MESSAGE | MOB_VOMIT_FORCE)) // Since we vomited with a force flag, we should've vomited out at least one item @@ -521,7 +521,7 @@ /obj/item/organ/stomach/cybernetic/tier2/stomach_acid_power(atom/movable/nomnom) if (isliving(nomnom)) return 0 - if (IsEdible(nomnom)) + if (IS_EDIBLE(nomnom)) return 0 return 20 @@ -534,10 +534,10 @@ emp_vulnerability = 20 metabolism_efficiency = 0.1 -/obj/item/organ/stomach/cybernetic/tier2/stomach_acid_power(atom/movable/nomnom) +/obj/item/organ/stomach/cybernetic/tier3/stomach_acid_power(atom/movable/nomnom) if (isliving(nomnom)) return 0 - if (IsEdible(nomnom)) + if (IS_EDIBLE(nomnom)) return 0 return 35 diff --git a/code/modules/surgery/organs/internal/stomach/stomach_golem.dm b/code/modules/surgery/organs/internal/stomach/stomach_golem.dm index dc6f28787aac..38e69ba2bcdd 100644 --- a/code/modules/surgery/organs/internal/stomach/stomach_golem.dm +++ b/code/modules/surgery/organs/internal/stomach/stomach_golem.dm @@ -27,7 +27,7 @@ if(istype(eating, /obj/item/food/golem_food)) return source.balloon_alert(source, "minerals only!") - return COMSIG_CARBON_BLOCK_EAT + return BLOCK_EAT_ATTEMPT /// Golem stomach cannot process nutriment except from minerals /obj/item/organ/stomach/golem/on_life(delta_time, times_fired) @@ -63,7 +63,8 @@ /atom/movable/screen/alert/status_effect/golem_statued name = "Statued" desc = "You no longer have the energy to move your body!" - icon_state = "golem_statued" + use_user_hud_icon = TRUE + overlay_state = "golem_statued" /datum/status_effect/golem_statued/on_apply() . = ..() diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index 9a540532388a..91fb99fa0a54 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -8,6 +8,7 @@ attack_verb_continuous = list("licks", "slobbers", "slaps", "frenches", "tongues") attack_verb_simple = list("lick", "slobber", "slap", "french", "tongue") voice_filter = "" + organ_traits = list(TRAIT_SPEAKS_CLEARLY) /** * A cached list of paths of all the languages this tongue is capable of speaking * @@ -51,6 +52,8 @@ // - 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()) + if(!sense_of_taste) + add_organ_trait(TRAIT_AGEUSIA) /obj/item/organ/tongue/examine(mob/user) . = ..() @@ -74,23 +77,33 @@ /obj/item/organ/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/spinwarder, - /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, - ) + // DARKPACK EDIT CHANGE START - LANGUAGES + var/static/list/lang_list + if(!lang_list) + lang_list = list( + /datum/language/common, + /datum/language/uncommon, + /datum/language/spinwarder, + /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, + /datum/language/garou_tongue, + /datum/language/primal_tongue + ) + for(var/datum/language/lang as anything in subtypesof(/datum/language)) + if(lang.restricted) + continue + lang_list |= lang + return lang_list // DARKPACK EDIT CHANGE END /obj/item/organ/tongue/proc/handle_speech(datum/source, list/speech_args) SIGNAL_HANDLER @@ -137,40 +150,24 @@ * ageusia from having a non-tasting tongue. */ REMOVE_TRAIT(receiver, TRAIT_AGEUSIA, NO_TONGUE_TRAIT) - apply_tongue_effects() /obj/item/organ/tongue/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags) . = ..() temp_say_mod = "" UnregisterSignal(organ_owner, COMSIG_MOB_SAY) - REMOVE_TRAIT(organ_owner, TRAIT_SPEAKS_CLEARLY, SPEAKING_FROM_TONGUE) - REMOVE_TRAIT(organ_owner, TRAIT_AGEUSIA, ORGAN_TRAIT) // Carbons by default start with NO_TONGUE_TRAIT caused TRAIT_AGEUSIA ADD_TRAIT(organ_owner, TRAIT_AGEUSIA, NO_TONGUE_TRAIT) organ_owner.voice_filter = initial(organ_owner.voice_filter) -/obj/item/organ/tongue/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag) - . = ..() - if(!owner) - return FALSE - apply_tongue_effects() +/obj/item/organ/tongue/on_begin_failure() + remove_organ_trait(TRAIT_SPEAKS_CLEARLY) + add_organ_trait(TRAIT_AGEUSIA) -/// Applies effects to our owner based on how damaged our tongue is -/obj/item/organ/tongue/proc/apply_tongue_effects() +/obj/item/organ/tongue/on_failure_recovery() + add_organ_trait(TRAIT_SPEAKS_CLEARLY) 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) + remove_organ_trait(TRAIT_AGEUSIA) /obj/item/organ/tongue/could_speak_language(datum/language/language_path) return (language_path in languages_possible) @@ -561,7 +558,7 @@ attack_verb_simple = list("beep", "boop") modifies_speech = TRUE taste_sensitivity = 25 // not as good as an organic tongue - organ_traits = list(TRAIT_SILICON_EMOTES_ALLOWED) + organ_traits = list(TRAIT_SPEAKS_CLEARLY, TRAIT_SILICON_EMOTES_ALLOWED) voice_filter = "alimiter=0.9,acompressor=threshold=0.2:ratio=20:attack=10:release=50:makeup=2,highpass=f=1000" /obj/item/organ/tongue/robot/could_speak_language(datum/language/language_path) @@ -623,7 +620,7 @@ say_mod = "meows" liked_foodtypes = SEAFOOD | ORANGES | BUGS | GORE disliked_foodtypes = GROSS | CLOTH | RAW - organ_traits = list(TRAIT_WOUND_LICKER, TRAIT_FISH_EATER, TRAIT_CARPOTOXIN_IMMUNE) + organ_traits = list(TRAIT_SPEAKS_CLEARLY, TRAIT_WOUND_LICKER, TRAIT_FISH_EATER, TRAIT_CARPOTOXIN_IMMUNE) languages_native = list(/datum/language/nekomimetic) actions_types = list(/datum/action/item_action/organ_action/go_feral) var/feral_mode = FALSE diff --git a/code/modules/surgery/organs/organ_movement.dm b/code/modules/surgery/organs/organ_movement.dm index 1eef03f08404..34d033b70e15 100644 --- a/code/modules/surgery/organs/organ_movement.dm +++ b/code/modules/surgery/organs/organ_movement.dm @@ -17,6 +17,13 @@ if(!mob_insert(receiver, special, movement_flags)) return FALSE + if(bodypart_owner && loc == bodypart_owner && receiver == bodypart_owner.owner) + // ok this is a bit confusing but essentially, thanks to some EXTREME shenanigans + // (tl;dr mob_insert -> set_species -> replace_limb -> bodypart_insert) + // mob_insert can result in bodypart_insert being handled already + // to avoid double insertion, and potential bugs, we'll stop here + return TRUE + bodypart_insert(limb_owner = receiver, movement_flags = movement_flags) if(!special && !(receiver.living_flags & STOP_OVERLAY_UPDATE_BODY_PARTS)) @@ -116,20 +123,26 @@ if(limb_owner) bodypart = limb_owner.get_bodypart(deprecise_zone(zone)) - // The true movement - forceMove(bodypart) - bodypart.contents |= src - bodypart_owner = bodypart + if(bodypart_owner == bodypart) + stack_trace("Organ bodypart_insert called when organ is already owned by that bodypart") + else if(!isnull(bodypart_owner)) + stack_trace("Organ bodypart_insert called when organ is already owned by a different bodypart") - RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(forced_removal)) + // In the event that we're already in the bodypart, DO NOT MOVE IT! otherwise it triggers forced_removal + if(loc != bodypart) + forceMove(bodypart) // The true movement - // Apply unique side-effects. Return value does not matter. - on_bodypart_insert(bodypart) + // Don't re-register if we are already owned + if(bodypart_owner != bodypart) + bodypart_owner = bodypart + RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(forced_removal)) + // Apply unique side-effects. Return value does not matter. + on_bodypart_insert(bodypart) return TRUE /// Add any limb specific effects you might want here -/obj/item/organ/proc/on_bodypart_insert(obj/item/bodypart/limb, movement_flags) +/obj/item/organ/proc/on_bodypart_insert(obj/item/bodypart/limb) SHOULD_CALL_PARENT(TRUE) item_flags |= ABSTRACT @@ -144,7 +157,7 @@ if(bodypart_overlay) limb.add_bodypart_overlay(bodypart_overlay) - SEND_SIGNAL(src, COMSIG_ORGAN_BODYPART_INSERTED, limb, movement_flags) + SEND_SIGNAL(src, COMSIG_ORGAN_BODYPART_INSERTED, limb) /* * Remove the organ from the select mob. @@ -229,7 +242,8 @@ moveToNullspace() bodypart_owner = null - on_bodypart_remove(limb) + if(!isnull(limb)) + on_bodypart_remove(limb) return TRUE @@ -269,41 +283,41 @@ color = bodypart_overlay.draw_color //Defaults to the legacy behaviour of applying the color to the item. /// In space station videogame, nothing is sacred. If somehow an organ is removed unexpectedly, handle it properly -/obj/item/organ/proc/forced_removal() +/obj/item/organ/proc/forced_removal(datum/source, atom/old_loc, ...) SIGNAL_HANDLER if(owner) - Remove(owner) + if(loc?.loc == owner) // loc = some bodypart, loc.loc = some bodypart's owner + stack_trace("Forced removal triggered on [src] ([type]) moving into the same mob [owner] ([owner.type])!") + else + Remove(owner) else if(bodypart_owner) - bodypart_remove(bodypart_owner) + if(loc == bodypart_owner) + stack_trace("Forced removal triggered on [src] ([type]) moving into the same bodypart [bodypart_owner] ([bodypart_owner.type])!") + else + bodypart_remove(bodypart_owner) else stack_trace("Force removed an already removed organ!") /** * Proc that gets called when the organ is surgically removed by someone, can be used for special effects */ -/obj/item/organ/proc/on_surgical_removal(mob/living/user, mob/living/carbon/old_owner, target_zone, obj/item/tool) +/obj/item/organ/proc/on_surgical_removal(mob/living/user, obj/item/bodypart/limb, 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, _color = old_owner.get_bloodtype()?.get_color() || BLOOD_COLOR_RED) + SEND_SIGNAL(src, COMSIG_ORGAN_SURGICALLY_REMOVED, user, limb.owner, limb.body_zone, tool) + RemoveElement(/datum/element/decal/blood, _color = limb.owner.get_bloodtype()?.get_color() || BLOOD_COLOR_RED) + /** * Proc that gets called when the organ is surgically inserted by someone. Seem familiar? */ -/obj/item/organ/proc/on_surgical_insertion(mob/living/user, mob/living/carbon/new_owner, target_zone, obj/item/tool) +/obj/item/organ/proc/on_surgical_insertion(mob/living/user, obj/item/bodypart/limb) SHOULD_CALL_PARENT(TRUE) - SEND_SIGNAL(src, COMSIG_ORGAN_SURGICALLY_INSERTED, user, new_owner, target_zone, tool) + SEND_SIGNAL(src, COMSIG_ORGAN_SURGICALLY_INSERTED, user, limb.owner, limb.body_zone) /// Proc that gets called when someone starts surgically inserting the organ /obj/item/organ/proc/pre_surgical_insertion(mob/living/user, mob/living/carbon/new_owner, target_zone) - if (!valid_zones) - return TRUE - - // Ensure that in case we're somehow placed elsewhere (HARS-esque bs) we don't break our zone - if (!valid_zones[target_zone]) - return FALSE - - swap_zone(target_zone) - return TRUE + if (valid_zones) + swap_zone(target_zone) /// Readjusts the organ to fit into a different body zone/slot /obj/item/organ/proc/swap_zone(target_zone) diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm deleted file mode 100644 index 2c518619fbee..000000000000 --- a/code/modules/surgery/plastic_surgery.dm +++ /dev/null @@ -1,135 +0,0 @@ -/// 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, - /datum/surgery_step/retract_skin, - /datum/surgery_step/reshape_face, - /datum/surgery_step/close, - ) - -/datum/surgery/plastic_surgery/advanced - name = "Advanced plastic surgery" - desc = "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." - requires_tech = TRUE - 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/blob/blobattack.ogg' - success_sound = 'sound/effects/blob/attackblob.ogg' - failure_sound = 'sound/effects/blob/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 [target.parse_zone_with_bodypart(target_zone)]..."), - span_notice("[user] begins to insert [tool] into the incision in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to insert [tool] into the incision in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - display_pain(target, "You feel something inserting just below the skin in your [target.parse_zone_with_bodypart(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)" - implements = list( - TOOL_SCALPEL = 100, - /obj/item/knife = 50, - TOOL_WIRECUTTER = 35) - time = 6.4 SECONDS - surgery_effects_mood = TRUE - -/datum/surgery_step/reshape_face/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message(span_notice("[user] begins to alter [target]'s appearance."), span_notice("You begin to alter [target]'s appearance...")) - display_results( - user, - target, - span_notice("You begin to alter [target]'s appearance..."), - span_notice("[user] begins to alter [target]'s appearance."), - span_notice("[user] begins to make an incision in [target]'s face."), - ) - display_pain(target, "You feel slicing pain across your face!") - -/datum/surgery_step/reshape_face/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(HAS_TRAIT_FROM(target, TRAIT_DISFIGURED, TRAIT_GENERIC)) - REMOVE_TRAIT(target, TRAIT_DISFIGURED, TRAIT_GENERIC) - display_results( - user, - target, - span_notice("You successfully restore [target]'s appearance."), - span_notice("[user] successfully restores [target]'s appearance!"), - span_notice("[user] finishes the operation on [target]'s face."), - ) - display_pain(target, "The pain fades, your face feels normal again!") - else - var/list/names = list() - if(!isabductor(user)) - 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 in disguises.picture?.names_seen) - names += namelist - else - to_chat(user, span_warning("You have no picture to base the appearance on, reverting to random appearances.")) - for(var/i in 1 to 10) - names += target.generate_random_mob_name(TRUE) - else - for(var/j in 1 to 9) - names += "Subject [target.gender == MALE ? "i" : "o"]-[pick("a", "b", "c", "d", "e")]-[rand(10000, 99999)]" - names += target.generate_random_mob_name(TRUE) //give one normal name in case they want to do regular plastic surgery - var/chosen_name = tgui_input_list(user, "New name to assign", "Plastic Surgery", names) - if(isnull(chosen_name)) - return - var/oldname = target.real_name - target.real_name = chosen_name - var/newname = target.real_name //something about how the code handles names required that I use this instead of target.real_name - display_results( - user, - target, - span_notice("You alter [oldname]'s appearance completely, [target.p_they()] is now [newname]."), - span_notice("[user] alters [oldname]'s appearance completely, [target.p_they()] is now [newname]!"), - span_notice("[user] finishes the operation on [target]'s face."), - ) - display_pain(target, "The pain fades, your face feels new and unfamiliar!") - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - human_target.update_ID_card() - 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) - display_results( - user, - target, - span_warning("You screw up, leaving [target]'s appearance disfigured!"), - span_notice("[user] screws up, disfiguring [target]'s appearance!"), - span_notice("[user] finishes the operation on [target]'s face."), - ) - display_pain(target, "Your face feels horribly scarred and deformed!") - ADD_TRAIT(target, TRAIT_DISFIGURED, TRAIT_GENERIC) - return FALSE diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm deleted file mode 100644 index 61cad459a1c8..000000000000 --- a/code/modules/surgery/prosthetic_replacement.dm +++ /dev/null @@ -1,189 +0,0 @@ -/datum/surgery/prosthetic_replacement - name = "Prosthetic replacement" - surgery_flags = NONE - requires_bodypart_type = NONE - possible_locs = list( - BODY_ZONE_R_ARM, - BODY_ZONE_L_ARM, - BODY_ZONE_L_LEG, - BODY_ZONE_R_LEG, - BODY_ZONE_HEAD, - ) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/add_prosthetic, - ) - -/datum/surgery/prosthetic_replacement/can_start(mob/user, mob/living/carbon/target) - if(!..()) - return FALSE - if(!iscarbon(target)) - return FALSE - var/mob/living/carbon/carbon_target = target - if(!carbon_target.get_bodypart(user.zone_selected) && carbon_target.should_have_limb(user.zone_selected)) //can only start if limb is missing - return TRUE - return FALSE - - - -/datum/surgery_step/add_prosthetic - name = "add prosthetic" - implements = list( - /obj/item/bodypart = 100, - /obj/item/borg/apparatus/organ_storage = 100, - /obj/item = 100, - ) - time = 3.2 SECONDS - /// Toxin damage incurred by the target if an organic limb is attached - VAR_FINAL/organ_rejection_dam = 0 - /// List of items that are always allowed to be an arm replacement, even if they fail another requirement. - var/list/always_accepted_prosthetics = list( - /obj/item/chainsaw, // the OG, too large otherwise - /obj/item/melee/synthetic_arm_blade, // also too large otherwise - /obj/item/food/pizzaslice, // he's turning her into a papa john's - ) - -/datum/surgery_step/add_prosthetic/tool_check(mob/user, obj/item/tool) - if(istype(tool, /obj/item/borg/apparatus/organ_storage)) - if(!length(tool.contents)) - return FALSE - tool = tool.contents[1] - if(tool.item_flags & (ABSTRACT|HAND_ITEM|DROPDEL)) - return FALSE - if(isbodypart(tool)) - return TRUE // auto pass - "intended" use case - if(is_type_in_list(tool, always_accepted_prosthetics)) - return TRUE // auto pass - soulful prosthetics - if(tool.w_class < WEIGHT_CLASS_NORMAL || tool.w_class > WEIGHT_CLASS_BULKY) - return FALSE // too large or too small items don't make sense as a limb replacement - if(HAS_TRAIT(tool, TRAIT_WIELDED)) - return FALSE // prevents exploits from weird edge cases - either unwield or get out - return TRUE - -/datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(istype(tool, /obj/item/borg/apparatus/organ_storage)) - if(!tool.contents.len) - to_chat(user, span_warning("There is nothing inside [tool]!")) - return SURGERY_STEP_FAIL - var/obj/item/organ_storage_contents = tool.contents[1] - if(!isbodypart(organ_storage_contents)) - to_chat(user, span_warning("[organ_storage_contents] cannot be attached!")) - return SURGERY_STEP_FAIL - tool = organ_storage_contents - if(isbodypart(tool)) - var/obj/item/bodypart/bodypart_to_attach = tool - if(IS_ORGANIC_LIMB(bodypart_to_attach)) - organ_rejection_dam = 10 - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - var/obj/item/bodypart/chest/target_chest = human_target.get_bodypart(BODY_ZONE_CHEST) - if((!(bodypart_to_attach.bodyshape & target_chest.acceptable_bodyshape)) && (!(bodypart_to_attach.bodytype & target_chest.acceptable_bodytype))) - to_chat(user, span_warning("[bodypart_to_attach] doesn't match the patient's morphology.")) - return SURGERY_STEP_FAIL - if(bodypart_to_attach.check_for_frankenstein(target)) - organ_rejection_dam = 30 - - if(!bodypart_to_attach.can_attach_limb(target)) - target.balloon_alert(user, "that doesn't go on the [target.parse_zone_with_bodypart(target_zone)]!") - return SURGERY_STEP_FAIL - - if(target_zone == bodypart_to_attach.body_zone) //so we can't replace a leg with an arm, or a human arm with a monkey arm. - display_results( - user, - target, - span_notice("You begin to replace [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]..."), - span_notice("[user] begins to replace [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]."), - span_notice("[user] begins to replace [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - else - to_chat(user, span_warning("[tool] isn't the right type for [target.parse_zone_with_bodypart(target_zone)].")) - return SURGERY_STEP_FAIL - else if(target_zone == BODY_ZONE_L_ARM || target_zone == BODY_ZONE_R_ARM) - display_results( - user, - target, - span_notice("You begin to attach [tool] onto [target]..."), - span_notice("[user] begins to attach [tool] onto [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] begins to attach something onto [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - ) - else - to_chat(user, span_warning("[tool] must be attached to an arm socket.")) - return SURGERY_STEP_FAIL - -/datum/surgery_step/add_prosthetic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(istype(tool, /obj/item/borg/apparatus/organ_storage)) - tool.icon_state = initial(tool.icon_state) - tool.desc = initial(tool.desc) - tool.cut_overlays() - tool = tool.contents[1] - else if(!user.temporarilyRemoveItemFromInventory(tool)) - to_chat(user, span_warning("You can't seem to part with [tool]!")) - return FALSE - - . = ..() - if(isbodypart(tool)) - handle_bodypart(user, target, tool, target_zone) - return - handle_arbitrary_prosthetic(user, target, tool, target_zone) - surgery.steps += /datum/surgery_step/secure_arbitrary_prosthetic - -/datum/surgery_step/add_prosthetic/proc/handle_bodypart(mob/user, mob/living/carbon/target, obj/item/bodypart/bodypart_to_attach, target_zone) - bodypart_to_attach.try_attach_limb(target) - if(bodypart_to_attach.check_for_frankenstein(target)) - bodypart_to_attach.bodypart_flags |= BODYPART_IMPLANTED - if(organ_rejection_dam) - target.adjustToxLoss(organ_rejection_dam) - display_results( - user, target, - span_notice("You succeed in replacing [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] successfully replaces [target]'s [target.parse_zone_with_bodypart(target_zone)] with [bodypart_to_attach]!"), - span_notice("[user] successfully replaces [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - display_pain(target, "You feel synthetic sensation wash from your [target.parse_zone_with_bodypart(target_zone)], which you can feel again!", TRUE) - -/datum/surgery_step/add_prosthetic/proc/handle_arbitrary_prosthetic(mob/user, mob/living/carbon/target, obj/item/thing_to_attach, target_zone) - SSblackbox.record_feedback("tally", "arbitrary_prosthetic", 1, initial(thing_to_attach.name)) - target.make_item_prosthetic(thing_to_attach, target_zone, 80) - display_results( - user, target, - span_notice("You attach [thing_to_attach]."), - span_notice("[user] finishes attaching [thing_to_attach]!"), - span_notice("[user] finishes the attachment procedure!"), - ) - display_pain(target, "You feel a strange sensation as [thing_to_attach] takes place of an arm!", TRUE) - -/datum/surgery_step/secure_arbitrary_prosthetic - name = "secure prosthetic (suture/tape)" - implements = list( - /obj/item/stack/medical/suture = 100, - /obj/item/stack/sticky_tape/surgical = 80, - /obj/item/stack/sticky_tape = 50, - ) - time = 4.8 SECONDS - -/datum/surgery_step/secure_arbitrary_prosthetic/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/obj/limb = target.get_bodypart(target_zone) - var/obj/item/stack/thing = tool - display_results( - user, target, - span_notice("You begin to [thing.singular_name] [limb] to [target]'s body."), - span_notice("[user] begins to [thing.singular_name] [limb] to [target]'s body."), - span_notice("[user] begins to [thing.singular_name] something to [target]'s body."), - ) - display_pain(target, "[user] begins to [thing.singular_name] [limb] to your body!", TRUE) - -/datum/surgery_step/secure_arbitrary_prosthetic/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/obj/limb = target.get_bodypart(target_zone) - var/obj/item/stack/thing = tool - thing.use(1) - limb.AddComponent(/datum/component/item_as_prosthetic_limb, null, 0) // updates drop probability to zero - display_results( - user, target, - span_notice("You [thing.singular_name] [limb] to [target]'s body."), - span_notice("[user] [thing.singular_name] [limb] to [target]'s body!"), - span_notice("[user] [thing.singular_name][plural_s(thing.singular_name)] something to [target]'s body!"), - ) - display_pain(target, "[user] [thing.singular_name][plural_s(thing.singular_name)] [limb] to your body!", TRUE) - return TRUE diff --git a/code/modules/surgery/repair_puncture.dm b/code/modules/surgery/repair_puncture.dm deleted file mode 100644 index 77b36d264cdf..000000000000 --- a/code/modules/surgery/repair_puncture.dm +++ /dev/null @@ -1,155 +0,0 @@ - -/////BURN FIXING SURGERIES////// - -//the step numbers of each of these two, we only currently use the first to switch back and forth due to advancing after finishing steps anyway -#define REALIGN_INNARDS 1 -#define WELD_VEINS 2 - -///// Repair puncture wounds -/datum/surgery/repair_puncture - name = "Repair puncture" - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB - targetable_wound = /datum/wound/pierce/bleed - target_mobtypes = list(/mob/living/carbon) - possible_locs = list( - BODY_ZONE_R_ARM, - BODY_ZONE_L_ARM, - BODY_ZONE_R_LEG, - BODY_ZONE_L_LEG, - BODY_ZONE_CHEST, - BODY_ZONE_HEAD, - ) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/repair_innards, - /datum/surgery_step/seal_veins, - /datum/surgery_step/close, - ) - -/datum/surgery/repair_puncture/can_start(mob/living/user, mob/living/carbon/target) - . = ..() - if(!.) - return . - - var/datum/wound/pierce/bleed/pierce_wound = target.get_bodypart(user.zone_selected).get_wound_type(targetable_wound) - ASSERT(pierce_wound, "[type] on [target] has no pierce wound when it should have been guaranteed to have one by can_start") - return pierce_wound.blood_flow > 0 - -//SURGERY STEPS - -///// realign the blood vessels so we can reweld them -/datum/surgery_step/repair_innards - name = "realign blood vessels (hemostat)" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_SCALPEL = 85, - TOOL_WIRECUTTER = 40) - time = 3 SECONDS - preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' - surgery_effects_mood = TRUE - -/datum/surgery_step/repair_innards/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound - if(!pierce_wound) - user.visible_message(span_notice("[user] looks for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), span_notice("You look for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]...")) - return - - if(pierce_wound.blood_flow <= 0) - to_chat(user, span_notice("[target]'s [target.parse_zone_with_bodypart(user.zone_selected)] has no puncture to repair!")) - surgery.status++ - return - - display_results( - user, - target, - span_notice("You begin to realign the torn blood vessels in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]..."), - span_notice("[user] begins to realign the torn blood vessels in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)] with [tool]."), - span_notice("[user] begins to realign the torn blood vessels in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), - ) - display_pain(target, "You feel a horrible stabbing pain in your [target.parse_zone_with_bodypart(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/bleed/pierce_wound = surgery.operated_wound - if(!pierce_wound) - to_chat(user, span_warning("[target] has no puncture wound there!")) - return ..() - - display_results( - user, - target, - span_notice("You successfully realign some of the blood vessels in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] successfully realigns some of the blood vessels in [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]!"), - span_notice("[user] successfully realigns some of the blood vessels in [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - log_combat(user, target, "realigned blood vessels in", addition="COMBAT MODE: [uppertext(user.combat_mode)]") - target.apply_damage(3, BRUTE, surgery.operated_bodypart, wound_bonus = CANT_WOUND, sharpness = SHARP_EDGED, attacking_item = tool) - pierce_wound.adjust_blood_flow(-0.25) - return ..() - -/datum/surgery_step/repair_innards/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob = 0) - . = ..() - display_results( - user, - target, - span_notice("You jerk apart some of the blood vessels in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), - span_notice("[user] jerks apart some of the blood vessels in [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]!"), - span_notice("[user] jerk apart some of the blood vessels in [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - target.apply_damage(rand(4, 8), BRUTE, surgery.operated_bodypart, wound_bonus = 10, sharpness = SHARP_EDGED, attacking_item = tool) - -///// Sealing the vessels back together -/datum/surgery_step/seal_veins - name = "weld veins (cautery)" // if your doctor says they're going to weld your blood vessels back together, you're either A) on SS13, or B) in grave mortal peril - implements = list( - TOOL_CAUTERY = 100, - /obj/item/gun/energy/laser = 90, - TOOL_WELDER = 70, - /obj/item = 30) - time = 4 SECONDS - preop_sound = 'sound/items/handling/surgery/cautery1.ogg' - success_sound = 'sound/items/handling/surgery/cautery2.ogg' - -/datum/surgery_step/seal_veins/tool_check(mob/user, obj/item/tool) - if(implement_type == TOOL_WELDER || implement_type == /obj/item) - return tool.get_temperature() - - return TRUE - -/datum/surgery_step/seal_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound - if(!pierce_wound) - user.visible_message(span_notice("[user] looks for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), span_notice("You look for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]...")) - return - display_results( - user, - target, - span_notice("You begin to meld some of the split blood vessels in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]..."), - span_notice("[user] begins to meld some of the split blood vessels in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)] with [tool]."), - span_notice("[user] begins to meld some of the split blood vessels in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), - ) - display_pain(target, "You're being burned inside your [target.parse_zone_with_bodypart(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/bleed/pierce_wound = surgery.operated_wound - if(!pierce_wound) - to_chat(user, span_warning("[target] has no puncture there!")) - return ..() - - display_results( - user, - target, - span_notice("You successfully meld some of the split blood vessels in [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]."), - span_notice("[user] successfully melds some of the split blood vessels in [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]!"), - span_notice("[user] successfully melds some of the split blood vessels in [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), - ) - log_combat(user, target, "dressed burns in", addition="COMBAT MODE: [uppertext(user.combat_mode)]") - pierce_wound.adjust_blood_flow(-0.5) - if(!QDELETED(pierce_wound) && pierce_wound.blood_flow > 0) - surgery.status = REALIGN_INNARDS - to_chat(user, span_notice("There still seems to be misaligned blood vessels to finish...")) - else - to_chat(user, span_green("You've repaired all the internal damage in [target]'s [target.parse_zone_with_bodypart(target_zone)]!")) - return ..() - -#undef REALIGN_INNARDS -#undef WELD_VEINS diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm deleted file mode 100644 index 65c8116769d0..000000000000 --- a/code/modules/surgery/revival.dm +++ /dev/null @@ -1,161 +0,0 @@ -/datum/surgery/revival - name = "Revival" - desc = "An experimental surgical procedure which involves reconstruction and reactivation of the patient's brain even long after death. \ - The body must still be able to sustain life." - possible_locs = list(BODY_ZONE_CHEST) - target_mobtypes = list(/mob/living) - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_MORBID_CURIOSITY - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/revive, - /datum/surgery_step/close, - ) - -/datum/surgery/revival/mechanic - name = "Full System Reboot" - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/revive, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/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 - 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 - -/datum/surgery/revival/mechanic/is_valid_target(mob/living/patient) - if (iscarbon(patient)) - return FALSE - if (!(patient.mob_biotypes & (MOB_ROBOTIC|MOB_HUMANOID))) - return FALSE - return TRUE - -/datum/surgery_step/revive - name = "shock brain (defibrillator)" - implements = list( - /obj/item/shockpaddles = 100, - /obj/item/melee/touch_attack/shock = 100, - /obj/item/melee/baton/security = 75, - /obj/item/gun/energy = 60) - repeatable = TRUE - time = 5 SECONDS - success_sound = 'sound/effects/magic/lightningbolt.ogg' - failure_sound = 'sound/effects/magic/lightningbolt.ogg' - -/datum/surgery_step/revive/tool_check(mob/user, obj/item/tool) - . = TRUE - if(istype(tool, /obj/item/shockpaddles)) - var/obj/item/shockpaddles/paddles = tool - if((paddles.req_defib && !paddles.defib.powered) || !HAS_TRAIT(paddles, TRAIT_WIELDED) || paddles.cooldown || paddles.busy) - to_chat(user, span_warning("You need to wield both paddles, and [paddles.defib] must be powered!")) - return FALSE - if(istype(tool, /obj/item/melee/baton/security)) - var/obj/item/melee/baton/security/baton = tool - if(!baton.active) - to_chat(user, span_warning("[baton] needs to be active!")) - return FALSE - if(istype(tool, /obj/item/gun/energy)) - var/obj/item/gun/energy/egun = tool - if(egun.chambered && istype(egun.chambered, /obj/item/ammo_casing/energy/electrode)) - return TRUE - else - to_chat(user, span_warning("You need an electrode for this!")) - return FALSE - -/datum/surgery_step/revive/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You prepare to give [target]'s brain the spark of life with [tool]."), - span_notice("[user] prepares to shock [target]'s brain with [tool]."), - span_notice("[user] prepares to shock [target]'s brain with [tool]."), - ) - target.notify_revival("Someone is trying to zap your brain.", source = target) - -/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/defib_charge.ogg', 75, 0) - else - ..() - -/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, - span_notice("You successfully shock [target]'s brain with [tool]..."), - span_notice("[user] send a powerful shock to [target]'s brain with [tool]..."), - span_notice("[user] send a powerful shock to [target]'s brain with [tool]..."), - ) - target.grab_ghost() - target.adjustOxyLoss(-50) - if(iscarbon(target)) - var/mob/living/carbon/carbon_target = target - carbon_target.set_heartattack(FALSE) - if(target.revive()) - on_revived(user, target) - return TRUE - - 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, - span_notice("You shock [target]'s brain with [tool], but [target.p_they()] doesn't react."), - span_notice("[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react."), - span_notice("[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react."), - ) - 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) - surgery_flags = parent_type::surgery_flags | SURGERY_REQUIRE_LIMB - -/datum/surgery/revival/carbon/is_valid_target(mob/living/carbon/patient) - var/obj/item/organ/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/sleeper_protocol.dm b/code/modules/surgery/sleeper_protocol.dm deleted file mode 100644 index fd697240eed1..000000000000 --- a/code/modules/surgery/sleeper_protocol.dm +++ /dev/null @@ -1,91 +0,0 @@ -/obj/item/disk/surgery/sleeper_protocol - name = "Suspicious Surgery Disk" - desc = "The disk provides instructions on how to turn someone into a sleeper agent for the Syndicate." - surgeries = list( - /datum/surgery/advanced/brainwashing_sleeper, - /datum/surgery/advanced/brainwashing_sleeper/mechanic, - ) - -/datum/surgery/advanced/brainwashing_sleeper - name = "Sleeper Agent Surgery" - desc = "A surgical procedure which implants the sleeper protocol into the patient's brain, making it their absolute priority. It can be cleared using a mindshield implant." - requires_bodypart_type = NONE - possible_locs = list(BODY_ZONE_HEAD) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/brainwash/sleeper_agent, - /datum/surgery_step/close, - ) - -/datum/surgery/advanced/brainwashing_sleeper/mechanic - name = "Sleeper Agent Reprogramming" - desc = "Malware which directly implants the sleeper protocol directive into the robotic patient's operating system, making it their absolute priority. It can be cleared using a mindshield implant." - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/brainwash/sleeper_agent/mechanic, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/advanced/brainwashing_sleeper/can_start(mob/user, mob/living/carbon/target) - . = ..() - if(!.) - return FALSE - var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) - if(!target_brain) - return FALSE - return TRUE - -/datum/surgery_step/brainwash/sleeper_agent - time = 25 SECONDS - var/static/list/possible_objectives = list( - "You love the Syndicate.", - "Do not trust Nanotrasen.", - "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.", - "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/mechanic - name = "reprogram (multitool)" - implements = list( - TOOL_MULTITOOL = 85, - TOOL_HEMOSTAT = 50, - TOOL_WIRECUTTER = 50, - /obj/item/stack/package_wrap = 35, - /obj/item/stack/cable_coil = 15) - preop_sound = 'sound/items/handling/surgery/hemostat1.ogg' - success_sound = 'sound/items/handling/surgery/hemostat1.ogg' - -/datum/surgery_step/brainwash/sleeper_agent/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - objective = pick(possible_objectives) - display_results( - user, - target, - span_notice("You begin to brainwash [target]..."), - span_notice("[user] begins to fix [target]'s brain."), - span_notice("[user] begins to perform surgery on [target]'s brain."), - ) - display_pain(target, "Your head pounds with unimaginable pain!") // Same message as other brain surgeries - -/datum/surgery_step/brainwash/sleeper_agent/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(target.stat == DEAD) - to_chat(user, span_warning("They need to be alive to perform this surgery!")) - return FALSE - . = ..() - if(!.) - return - target.gain_trauma(new /datum/brain_trauma/mild/phobia/conspiracies(), TRAUMA_RESILIENCE_LOBOTOMY) diff --git a/code/modules/surgery/stomachpump.dm b/code/modules/surgery/stomachpump.dm deleted file mode 100644 index be298cfd45cf..000000000000 --- a/code/modules/surgery/stomachpump.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/surgery/stomach_pump - name = "Stomach Pump" - possible_locs = list(BODY_ZONE_CHEST) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/incise, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/stomach_pump, - /datum/surgery_step/close, - ) - -/datum/surgery/stomach_pump/mechanic - name = "Nutrient Processing Purge" - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/stomach_pump, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close, - ) - -/datum/surgery/stomach_pump/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH) - if(HAS_TRAIT(target, TRAIT_HUSK)) - return FALSE - if(!target_stomach) - return FALSE - return ..() - -//Working the stomach by hand in such a way that you induce vomiting. -/datum/surgery_step/stomach_pump - name = "pump stomach (hand)" - accept_hand = TRUE - repeatable = TRUE - time = 2 SECONDS - success_sound = 'sound/items/handling/surgery/organ2.ogg' - -/datum/surgery_step/stomach_pump/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin pumping [target]'s stomach..."), - span_notice("[user] begins to pump [target]'s stomach."), - span_notice("[user] begins to press on [target]'s chest."), - ) - display_pain(target, "You feel a horrible sloshing feeling in your gut! You're going to be sick!") - -/datum/surgery_step/stomach_pump/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(ishuman(target)) - var/mob/living/carbon/human/target_human = target - display_results( - user, - target, - span_notice("[user] forces [target_human] to vomit, cleansing their stomach of some chemicals!"), - span_notice("[user] forces [target_human] to vomit, cleansing their stomach of some chemicals!"), - span_notice("[user] forces [target_human] to vomit!"), - ) - target_human.vomit((MOB_VOMIT_MESSAGE | MOB_VOMIT_STUN), lost_nutrition = 20, purge_ratio = 0.67) //higher purge ratio than regular vomiting - return ..() - -/datum/surgery_step/stomach_pump/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(ishuman(target)) - var/mob/living/carbon/human/target_human = target - display_results( - user, - target, - span_warning("You screw up, bruising [target_human]'s chest!"), - span_warning("[user] screws up, brusing [target_human]'s chest!"), - span_warning("[user] screws up!"), - ) - target_human.adjustOrganLoss(ORGAN_SLOT_STOMACH, 5) - target_human.adjustBruteLoss(5) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm deleted file mode 100644 index 445cabe86824..000000000000 --- a/code/modules/surgery/surgery.dm +++ /dev/null @@ -1,212 +0,0 @@ -/datum/surgery - ///The name of the surgery operation - var/name = "surgery" - ///The description of the surgery, what it does. - var/desc - - ///Bitfield for flags that determine different behaviors and requirement for the surgery. See __DEFINES/surgery.dm - 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 - ///All steps the surgery has to do to complete. - var/list/steps = list() - ///Boolean on whether a surgery step is currently being done, to prevent multi-surgery. - var/step_in_progress = FALSE - - ///The bodypart this specific surgery is being performed on. - var/location = BODY_ZONE_CHEST - ///The possible bodyparts that the surgery can be started on. - var/list/possible_locs = list() - ///Mobs that are valid to have surgery performed on them. - var/list/target_mobtypes = list(/mob/living/carbon/human) - - ///The person the surgery is being performed on. Funnily enough, it isn't always a carbon. - VAR_FINAL/mob/living/carbon/target - ///The specific bodypart being operated on. - VAR_FINAL/obj/item/bodypart/operated_bodypart - ///The wound datum that is being operated on. - VAR_FINAL/datum/wound/operated_wound - - ///Types of wounds this surgery can target. - var/targetable_wound - ///The types of bodyparts that this surgery can have performed on it. Used for augmented surgeries. - var/requires_bodypart_type = BODYTYPE_ORGANIC - - ///The speed modifier given to the surgery through external means. - var/speed_modifier = 1 - ///Whether the surgery requires research to do. You need to add a design if using this! - var/requires_tech = FALSE - ///typepath of a surgery that will, once researched, replace this surgery in the operating menu. - var/replaced_by - /// Organ being directly manipulated, used for checking if the organ is still in the body after surgery has begun - var/organ_to_manipulate - -/datum/surgery/New(atom/surgery_target, surgery_location, surgery_bodypart) - . = ..() - if(!surgery_target) - return - target = surgery_target - target.surgeries += src - if(surgery_location) - location = surgery_location - if(!surgery_bodypart) - return - operated_bodypart = surgery_bodypart - if(targetable_wound) - operated_wound = operated_bodypart.get_wound_type(targetable_wound) - operated_wound.attached_surgery = src - - SEND_SIGNAL(surgery_target, COMSIG_MOB_SURGERY_STARTED, src, surgery_location, surgery_bodypart) - -/datum/surgery/Destroy() - if(operated_wound) - operated_wound.attached_surgery = null - operated_wound = null - if(target) - target.surgeries -= src - if(!QDELING(target)) - SEND_SIGNAL(target, COMSIG_MOB_SURGERY_FINISHED, type, location, operated_bodypart) - target = null - operated_bodypart = null - return ..() - - -/datum/surgery/proc/can_start(mob/user, mob/living/patient) //FALSE to not show in list - SHOULD_CALL_PARENT(TRUE) - - . = TRUE - if(replaced_by == /datum/surgery) - return FALSE - - // True surgeons (like abductor scientists) need no instructions - if(HAS_MIND_TRAIT(user, TRAIT_SURGEON)) - if(replaced_by) // only show top-level surgeries - return FALSE - else - return TRUE - - if(!requires_tech && !replaced_by) - return TRUE - - if(requires_tech) - . = FALSE - - var/surgery_signal = SEND_SIGNAL(user, COMSIG_SURGERY_STARTING, src, patient) - if(surgery_signal & COMPONENT_FORCE_SURGERY) - return TRUE - if(surgery_signal & COMPONENT_CANCEL_SURGERY) - return FALSE - - var/turf/patient_turf = get_turf(patient) - - //Get the relevant operating computer - var/obj/machinery/computer/operating/opcomputer = locate_operating_computer(patient_turf) - if (isnull(opcomputer)) - return . - if(replaced_by in opcomputer.advanced_surgeries) - return FALSE - if(type in opcomputer.advanced_surgeries) - return TRUE - return . - -/datum/surgery/proc/next_step(mob/living/user, modifiers) - if(location != user.zone_selected) - return FALSE - if(user.combat_mode) - return FALSE - if(step_in_progress) - return TRUE - - var/try_to_fail = FALSE - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - try_to_fail = TRUE - - var/datum/surgery_step/surgery_step = GLOB.surgery_steps[steps[status]] - if(isnull(surgery_step)) - return FALSE - var/obj/item/tool = user.get_active_held_item() - if(tool) - tool = tool.get_proxy_attacker_for(target, user) - if(surgery_step.try_op(user, target, user.zone_selected, tool, src, try_to_fail)) - return TRUE - if(!tool) - return FALSE - //Just because you used the wrong tool it doesn't mean you meant to whack the patient with it - if((surgery_flags & SURGERY_CHECK_TOOL_BEHAVIOUR) ? tool.tool_behaviour : (tool.item_flags & SURGICAL_TOOL)) - to_chat(user, span_warning("This step requires a different tool!")) - return TRUE - - return FALSE - -/datum/surgery/proc/get_surgery_next_step() - if(status < steps.len) - var/step_type = steps[status + 1] - return new step_type - return null - -/datum/surgery/proc/complete(mob/surgeon) - SSblackbox.record_feedback("tally", "surgeries_completed", 1, type) - surgeon.add_mob_memory(/datum/memory/surgery, deuteragonist = surgeon, surgery_type = name) - qdel(src) - -/// Returns a nearby operating computer linked to an operating table -/datum/surgery/proc/locate_operating_computer(turf/patient_turf) - if (isnull(patient_turf)) - return null - - var/obj/structure/table/optable/operating_table = locate(/obj/structure/table/optable, patient_turf) - var/obj/machinery/computer/operating/operating_computer = operating_table?.computer - - if (isnull(operating_computer)) - return null - - if(operating_computer.machine_stat & (NOPOWER|BROKEN)) - return null - - return operating_computer - -/datum/surgery/advanced - name = "advanced surgery" - requires_tech = TRUE - -/obj/item/disk/surgery - name = "Surgery Procedure Disk" - desc = "A disk that contains advanced surgery procedures, must be loaded into an Operating Console." - icon_state = "datadisk1" - custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass=SMALL_MATERIAL_AMOUNT) - var/list/surgeries - -/obj/item/disk/surgery/debug - name = "Debug Surgery Disk" - desc = "A disk that contains all existing surgery procedures." - icon_state = "datadisk1" - custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass=SMALL_MATERIAL_AMOUNT) - -/obj/item/disk/surgery/debug/Initialize(mapload) - . = ..() - surgeries = list() - var/list/req_tech_surgeries = subtypesof(/datum/surgery) - for(var/datum/surgery/beep as anything in req_tech_surgeries) - if(initial(beep.requires_tech)) - surgeries += beep - -//INFO -//Check /mob/living/carbon/attackby for how surgery progresses, and also /mob/living/carbon/attack_hand. -//As of Feb 21 2013 they are in code/modules/mob/living/carbon/carbon.dm, lines 459 and 51 respectively. -//Other important variables are var/list/surgeries (/mob/living) and var/list/organs (/mob/living/carbon) -// var/list/bodyparts (/mob/living/carbon/human) is the LIMBS of a Mob. -//Surgical procedures are initiated by attempt_initiate_surgery(), which is called by surgical drapes and bedsheets. - - -//TODO -//specific steps for some surgeries (fluff text) -//more interesting failure options -//randomised complications -//more surgeries! -//add a probability modifier for the state of the surgeon- health, twitching, etc. blindness, god forbid. -//helper for converting a zone_sel.selecting to body part (for damage) - - -//RESOLVED ISSUES //"Todo" jobs that have been completed -//combine hands/feet into the arms - Hands/feet were removed - RR -//surgeries (not steps) that can be initiated on any body part (corresponding with damage locations) - Call this one done, see possible_locs var - c0 diff --git a/code/modules/surgery/surgery_disks.dm b/code/modules/surgery/surgery_disks.dm new file mode 100644 index 000000000000..6f8c1440f0b2 --- /dev/null +++ b/code/modules/surgery/surgery_disks.dm @@ -0,0 +1,59 @@ +/obj/item/disk/surgery + name = "surgery procedure disk" + desc = "A disk that contains advanced surgery procedures, must be loaded into an Operating Console." + icon_state = "datadisk1" + custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass=SMALL_MATERIAL_AMOUNT) + /// List of surgical operations contained on this disk + var/list/surgeries + +/obj/item/disk/surgery/debug + name = "debug surgery disk" + desc = "A disk that contains all existing surgery procedures." + icon_state = "datadisk1" + custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass=SMALL_MATERIAL_AMOUNT) + +/obj/item/disk/surgery/debug/Initialize(mapload) + . = ..() + surgeries = list() + for(var/datum/surgery_operation/operation as anything in GLOB.operations.get_instances_from(subtypesof(/datum/surgery_operation))) + surgeries += operation.type + +/obj/item/disk/surgery/advanced_plastic_surgery + name = "advanced plastic surgery disk" + desc = "Provides instructions on how to perform more intricate plastic surgeries." + + surgeries = list( + /datum/surgery_operation/limb/add_plastic, + ) + +/obj/item/disk/surgery/advanced_plastic_surgery/examine(mob/user) + . = ..() + . += span_info("Unlocks the [/datum/surgery_operation/limb/add_plastic::name] surgical operation.") + . += span_info("Performing this before a [/datum/surgery_operation/limb/plastic_surgery::name] upgrades the operation, \ + allowing you to copy the appearance of any individual - \ + provided you have a photo of them in your offhand during the surgery.") + +/obj/item/disk/surgery/advanced_plastic_surgery/Initialize(mapload) + . = ..() + AddElement(/datum/element/examine_lore, \ + lore = "Most forms of plastic surgery became obsolete due in no small part to advances in genetics technology. \ + Very basic methods still remain in use, but scarcely, and primarily to reverse a patient's disfigurements. \ + As a consequence, this item became an antique to many collectors - \ + though some back alley surgeons still seek one out for its now uncommon knowledge." \ + ) + +/obj/item/disk/surgery/brainwashing + name = "brainwashing surgery disk" + desc = "Provides instructions on how to impress an order on a brain, making it the primary objective of the patient." + surgeries = list( + /datum/surgery_operation/organ/brainwash, + /datum/surgery_operation/organ/brainwash/mechanic, + ) + +/obj/item/disk/surgery/sleeper_protocol + name = "suspicious surgery disk" + desc = "Provides instructions on how to convert a patient into a sleeper agent for the Syndicate." + surgeries = list( + /datum/surgery_operation/organ/brainwash/sleeper, + /datum/surgery_operation/organ/brainwash/sleeper/mechanic, + ) diff --git a/code/modules/surgery/surgery_helpers.dm b/code/modules/surgery/surgery_helpers.dm deleted file mode 100644 index 00beb0de4491..000000000000 --- a/code/modules/surgery/surgery_helpers.dm +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Gets the surgery speed modifier for a given mob, based off what sort of table/bed/whatever is on their turf. - */ -/proc/get_location_modifier(mob/located_mob) - // Technically this IS a typecache, just not the usual kind :3 - var/static/list/modifiers = zebra_typecacheof(list( - /obj/structure/table = 0.8, - /obj/structure/table/optable = 1, - /obj/structure/table/optable/abductor = 1.2, - /obj/machinery/stasis = 0.9, - /obj/structure/bed = 0.7, - )) - . = 0.5 - for(var/obj/thingy in get_turf(located_mob)) - . = max(., modifiers[thingy.type]) - - -/proc/get_location_accessible(mob/located_mob, location) - var/covered_locations = 0 //based on body_parts_covered - var/face_covered = 0 //based on flags_inv - var/eyesmouth_covered = 0 //based on flags_cover - if(iscarbon(located_mob)) - var/mob/living/carbon/clothed_carbon = located_mob - for(var/obj/item/clothing/clothes in list(clothed_carbon.back, clothed_carbon.wear_mask, clothed_carbon.head)) - covered_locations |= clothes.body_parts_covered - face_covered |= clothes.flags_inv - eyesmouth_covered |= clothes.flags_cover - if(ishuman(clothed_carbon)) - var/mob/living/carbon/human/clothed_human = clothed_carbon - for(var/obj/item/clothes in list(clothed_human.wear_suit, clothed_human.w_uniform, clothed_human.shoes, clothed_human.belt, clothed_human.gloves, clothed_human.glasses, clothed_human.ears)) - covered_locations |= clothes.body_parts_covered - face_covered |= clothes.flags_inv - eyesmouth_covered |= clothes.flags_cover - - switch(location) - if(BODY_ZONE_HEAD) - if(covered_locations & HEAD) - return FALSE - if(BODY_ZONE_PRECISE_EYES) - if((face_covered & HIDEEYES) || (eyesmouth_covered & (MASKCOVERSEYES|HEADCOVERSEYES|GLASSESCOVERSEYES))) - return FALSE - if(BODY_ZONE_PRECISE_MOUTH) - if((face_covered & HIDEFACE) || (eyesmouth_covered & (MASKCOVERSMOUTH|HEADCOVERSMOUTH))) - return FALSE - if(BODY_ZONE_CHEST) - if(covered_locations & CHEST) - return FALSE - if(BODY_ZONE_PRECISE_GROIN) - if(covered_locations & GROIN) - return FALSE - if(BODY_ZONE_L_ARM) - if(covered_locations & ARM_LEFT) - return FALSE - if(BODY_ZONE_R_ARM) - if(covered_locations & ARM_RIGHT) - return FALSE - if(BODY_ZONE_L_LEG) - if(covered_locations & LEG_LEFT) - return FALSE - if(BODY_ZONE_R_LEG) - if(covered_locations & LEG_RIGHT) - return FALSE - if(BODY_ZONE_PRECISE_L_HAND) - if(covered_locations & HAND_LEFT) - return FALSE - if(BODY_ZONE_PRECISE_R_HAND) - if(covered_locations & HAND_RIGHT) - return FALSE - if(BODY_ZONE_PRECISE_L_FOOT) - if(covered_locations & FOOT_LEFT) - return FALSE - if(BODY_ZONE_PRECISE_R_FOOT) - if(covered_locations & FOOT_RIGHT) - return FALSE - - return TRUE diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm deleted file mode 100644 index 672d29ad8257..000000000000 --- a/code/modules/surgery/surgery_step.dm +++ /dev/null @@ -1,372 +0,0 @@ -#define SURGERY_STATE_STARTED "surgery_started" -#define SURGERY_STATE_FAILURE "surgery_failed" -#define SURGERY_STATE_SUCCESS "surgery_success" -#define SURGERY_MOOD_CATEGORY "surgery" - -/datum/surgery_step - var/name - var/list/implements = list() //format is path = probability of success. alternatively - var/implement_type = null //the current type of implement used. This has to be stored, as the actual typepath of the tool may not match the list type. - var/accept_hand = FALSE //does the surgery step require an open hand? If true, ignores implements. Compatible with accept_any_item. - var/accept_any_item = FALSE //does the surgery step accept any item? If true, ignores implements. Compatible with require_hand. - var/time = 1 SECONDS //how long does the step take? - var/repeatable = FALSE //can this step be repeated? Make shure it isn't last step, or else the surgeon will be stuck in the loop - var/list/chems_needed = list() //list of chems needed to complete the step. Even on success, the step will have no effect if there aren't the chems required in the mob. - var/require_all_chems = TRUE //any on the list or all on the list? - var/silicons_obey_prob = FALSE - var/preop_sound //Sound played when the step is started - var/success_sound //Sound played if the step succeeded - var/failure_sound //Sound played if the step fails - ///If the surgery causes mood changes if the patient is conscious. - var/surgery_effects_mood = FALSE - ///Which mood event to give the patient when surgery is starting while they're conscious. This should be permanent/not have a timer until the surgery either succeeds or fails, as those states will immediately replace it. Mostly just flavor text. - var/datum/mood_event/surgery/surgery_started_mood_event = /datum/mood_event/surgery - ///Which mood event to give the conscious patient when surgery succeeds. Lasts far shorter than if it failed. - var/datum/mood_event/surgery/surgery_success_mood_event = /datum/mood_event/surgery/success - ///Which mood event to give the consious patient when surgery fails. Lasts muuuuuch longer. - var/datum/mood_event/surgery/surgery_failure_mood_event = /datum/mood_event/surgery/failure - - -/datum/surgery_step/proc/try_op(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) - var/success = FALSE - if(surgery.organ_to_manipulate && !target.get_organ_slot(surgery.organ_to_manipulate)) - to_chat(user, span_warning("[target] seems to be missing the organ necessary to complete this surgery!")) - return FALSE - - if(accept_hand) - if(!tool) - success = TRUE - if(iscyborg(user)) - var/mob/living/silicon/robot/borg = user - if(istype(borg.module_active, /obj/item/borg/cyborghug)) - success = TRUE - - if(accept_any_item) - if(tool && tool_check(user, tool)) - success = TRUE - - else if(tool) - for(var/key in implements) - var/match = FALSE - - if(ispath(key) && istype(tool, key)) - match = TRUE - else if(tool.tool_behaviour == key) - match = TRUE - - if(match) - implement_type = key - if(tool_check(user, tool)) - success = TRUE - break - - if(success) - if(target_zone == surgery.location) - if(get_location_accessible(target, target_zone) || (surgery.surgery_flags & SURGERY_IGNORE_CLOTHES)) - initiate(user, target, target_zone, tool, surgery, try_to_fail) - else - to_chat(user, span_warning("You need to expose [target]'s [target.parse_zone_with_bodypart(target_zone)] to perform surgery on it!")) - return TRUE //returns TRUE so we don't stab the guy in the dick or wherever. - - if(repeatable) - var/datum/surgery_step/next_step = surgery.get_surgery_next_step() - if(next_step) - surgery.status++ - if(next_step.try_op(user, target, user.zone_selected, user.get_active_held_item(), surgery)) - return TRUE - else - surgery.status-- - - return FALSE - -#define SURGERY_SLOWDOWN_CAP_MULTIPLIER 2.5 //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_SPEED_DISSECTION_MODIFIER 0.8 -///Modifier given to users with TRAIT_MORBID on certain surgeries -#define SURGERY_SPEED_MORBID_CURIOSITY 0.7 -///Modifier given to patients with TRAIT_ANALGESIA -#define SURGERY_SPEED_TRAIT_ANALGESIA 0.8 - -/datum/surgery_step/proc/initiate(mob/living/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) - // Only followers of Asclepius have the ability to use Healing Touch and perform miracle feats of surgery. - // Prevents people from performing multiple simultaneous surgeries unless they're holding a Rod of Asclepius. - - surgery.step_in_progress = TRUE - var/speed_mod = 1 - var/fail_prob = 0//100 - fail_prob = success_prob - var/advance = FALSE - - if(!chem_check(target)) - user.balloon_alert(user, "missing [LOWER_TEXT(get_chem_list())]!") - to_chat(user, span_warning("[target] is missing the [LOWER_TEXT(get_chem_list())] required to perform this surgery step!")) - surgery.step_in_progress = FALSE - return FALSE - - if(preop(user, target, target_zone, tool, surgery) == SURGERY_STEP_FAIL) - update_surgery_mood(target, SURGERY_STATE_FAILURE) - surgery.step_in_progress = FALSE - return FALSE - - update_surgery_mood(target, SURGERY_STATE_STARTED) - play_preop_sound(user, target, target_zone, tool, surgery) // Here because most steps overwrite preop - - if(tool) - speed_mod = tool.toolspeed - - 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 - - if(HAS_TRAIT(target, TRAIT_ANALGESIA)) - speed_mod *= SURGERY_SPEED_TRAIT_ANALGESIA - - var/implement_speed_mod = 1 - if(implement_type) //this means it isn't a require hand or any item step. - implement_speed_mod = implements[implement_type] / 100.0 - - //multiply speed_mod by sterilizer modifier - speed_mod *= surgery.speed_modifier - - speed_mod /= (get_location_modifier(target) * implement_speed_mod) * target.mob_surgery_speed_mod - var/modded_time = time * speed_mod - - - fail_prob = max(0, modded_time - (time * SURGERY_SLOWDOWN_CAP_MULTIPLIER)) //if modded_time > time * modifier, then fail_prob = modded_time - time*modifier - - var/list/user_modifiers = list(0, 1) - SEND_SIGNAL(user, COMSIG_LIVING_INITIATE_SURGERY_STEP, user, target, target_zone, tool, surgery, src, user_modifiers) - fail_prob += user_modifiers[FAIL_PROB_INDEX] - modded_time *= user_modifiers[SPEED_MOD_INDEX] - - var/list/target_modifiers = list(0, 1) - SEND_SIGNAL(target, COMSIG_LIVING_SURGERY_STEP_INITIATED_ON, user, target, target_zone, tool, surgery, src, target_modifiers) - fail_prob += target_modifiers[FAIL_PROB_INDEX] - modded_time *= target_modifiers[SPEED_MOD_INDEX] - - fail_prob = min(max(0, fail_prob),99) // clamp fail_prob between 0 and 99 - modded_time = min(modded_time, time * SURGERY_SLOWDOWN_CAP_MULTIPLIER)// cap modded_time at time*modifier - - if(iscyborg(user))//any immunities to surgery slowdown should go in this check. - modded_time = time * tool.toolspeed - - var/was_sleeping = (target.stat != DEAD && target.IsSleeping()) - - if(do_after(user, modded_time, target = target, interaction_key = user.has_status_effect(/datum/status_effect/hippocratic_oath) ? target : DOAFTER_SOURCE_SURGERY)) //If we have the hippocratic oath, we can perform one surgery on each target, otherwise we can only do one surgery in total. - - if((prob(100-fail_prob) || (iscyborg(user) && !silicons_obey_prob)) && !try_to_fail) - if(success(user, target, target_zone, tool, surgery)) - if((tool && tool.item_flags & CRUEL_IMPLEMENT) || (accept_hand && surgery.surgery_flags & SURGERY_MORBID_CURIOSITY && HAS_MIND_TRAIT(user, TRAIT_MORBID))) - update_surgery_mood(target, SURGERY_STATE_FAILURE) - else - update_surgery_mood(target, SURGERY_STATE_SUCCESS) - play_success_sound(user, target, target_zone, tool, surgery) - advance = TRUE - else - if(failure(user, target, target_zone, tool, surgery, fail_prob)) - play_failure_sound(user, target, target_zone, tool, surgery) - update_surgery_mood(target, SURGERY_STATE_FAILURE) - advance = TRUE - if(advance && !repeatable) - surgery.status++ - if(surgery.status > surgery.steps.len) - surgery.complete(user) - - else if(!QDELETED(target)) - update_surgery_mood(target, SURGERY_STATE_FAILURE) - - if(target.stat == DEAD && was_sleeping && user.client) - user.client.give_award(/datum/award/achievement/jobs/sandman, user) - - surgery.step_in_progress = FALSE - return advance - -/** - * Handles updating the mob's mood depending on the surgery states. - * * surgery_state = SURGERY_STATE_STARTED, SURGERY_STATE_FAILURE, SURGERY_STATE_SUCCESS - * * To prevent typos, the event category is defined as SURGERY_MOOD_CATEGORY ("surgery") -*/ -/datum/surgery_step/proc/update_surgery_mood(mob/living/target, surgery_state) - if(!target) - CRASH("Not passed a target, how did we get here?") - if(!surgery_effects_mood) - return - // Determine how drunk our patient is - var/drunken_patient = target.get_drunk_amount() - // Create a probability to ignore the pain based on drunkenness level - var/drunken_ignorance_probability = clamp(drunken_patient, 0, 90) - - if(HAS_TRAIT(target, TRAIT_ANALGESIA) || drunken_patient && prob(drunken_ignorance_probability)) - target.clear_mood_event(SURGERY_MOOD_CATEGORY) //incase they gained the trait mid-surgery (or became drunk). has the added side effect that if someone has a bad surgical memory/mood and gets drunk & goes back to surgery, they'll forget they hated it, which is kinda funny imo. - return - if(target.stat >= UNCONSCIOUS) - var/datum/mood_event/surgery/target_mood_event = target.mob_mood?.mood_events[SURGERY_MOOD_CATEGORY] - if(!target_mood_event || target_mood_event.surgery_completed) //don't give sleeping mobs trauma. that said, if they fell asleep mid-surgery after already getting the bad mood, lets make sure they wake up to a (hopefully) happy memory. - return - switch(surgery_state) - if(SURGERY_STATE_STARTED) - target.add_mood_event(SURGERY_MOOD_CATEGORY, surgery_started_mood_event) - if(SURGERY_STATE_SUCCESS) - target.add_mood_event(SURGERY_MOOD_CATEGORY, surgery_success_mood_event) - if(SURGERY_STATE_FAILURE) - target.add_mood_event(SURGERY_MOOD_CATEGORY, surgery_failure_mood_event) - else - CRASH("passed invalid surgery_state, \"[surgery_state]\".") - - -/datum/surgery_step/proc/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to perform surgery on [target]..."), - span_notice("[user] begins to perform surgery on [target]."), - span_notice("[user] begins to perform surgery on [target]."), - ) - -/datum/surgery_step/proc/play_preop_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/sound_file_use - if(islist(preop_sound)) - for(var/typepath in preop_sound)//iterate and assign subtype to a list, works best if list is arranged from subtype first and parent last - if(istype(tool, typepath)) - sound_file_use = preop_sound[typepath] - break - else - sound_file_use = preop_sound - if(!sound_file_use) - return - playsound(target, sound_file_use, 75, TRUE, falloff_exponent = 12, falloff_distance = 1) - -/datum/surgery_step/proc/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = TRUE) - SEND_SIGNAL(user, COMSIG_MOB_SURGERY_STEP_SUCCESS, src, target, target_zone, tool, surgery, default_display_results) - if(default_display_results) - display_results( - user, - target, - span_notice("You succeed."), - span_notice("[user] succeeds!"), - span_notice("[user] finishes."), - ) - if(ishuman(user)) - var/mob/living/carbon/human/surgeon = user - surgeon.add_blood_DNA_to_items(target.get_blood_dna_list(), ITEM_SLOT_GLOVES) - else - user.add_mob_blood(target) - return TRUE - -/datum/surgery_step/proc/play_success_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(!success_sound) - return - playsound(get_turf(target), success_sound, 75, TRUE, falloff_exponent = 12, falloff_distance = 1) - -/datum/surgery_step/proc/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob = 0) - var/screwedmessage = "" - switch(fail_prob) - if(0 to 24) - screwedmessage = " You almost had it, though." - if(50 to 74)//25 to 49 = no extra text - screwedmessage = " This is hard to get right in these conditions..." - if(75 to 99) - screwedmessage = " This is practically impossible in these conditions..." - - display_results( - user, - target, - span_warning("You screw up![screwedmessage]"), - span_warning("[user] screws up!"), - span_notice("[user] finishes."), TRUE) //By default the patient will notice if the wrong thing has been cut - return FALSE - -/datum/surgery_step/proc/play_failure_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(!failure_sound) - return - playsound(get_turf(target), failure_sound, 75, TRUE, falloff_exponent = 12, falloff_distance = 1) - -/datum/surgery_step/proc/tool_check(mob/user, obj/item/tool) - return TRUE - -/datum/surgery_step/proc/chem_check(mob/living/target) - if(!LAZYLEN(chems_needed)) - return TRUE - - if(require_all_chems) - . = TRUE - for(var/reagent in chems_needed) - if(!target.reagents.has_reagent(reagent)) - return FALSE - else - . = FALSE - for(var/reagent in chems_needed) - if(target.reagents.has_reagent(reagent)) - return TRUE - -/datum/surgery_step/proc/get_chem_list() - if(!LAZYLEN(chems_needed)) - return - var/list/chems = list() - for(var/reagent in chems_needed) - var/datum/reagent/temp = GLOB.chemical_reagents_list[reagent] - if(temp) - var/chemname = temp.name - chems += chemname - return english_list(chems, and_text = require_all_chems ? " and " : " or ") - -// 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(!HAS_MIND_TRAIT(user, TRAIT_MORBID)) - return FALSE - if(!tool && accept_hand) - return TRUE - if(tool && !(tool.item_flags & CRUEL_IMPLEMENT)) - 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) - if(!target_detailed) - var/you_feel = pick("a brief pain", "your body tense up", "an unnerving sensation") - if(!vague_message) - if(detailed_message) - stack_trace("DIDN'T GET PASSED A VAGUE MESSAGE.") - vague_message = detailed_message - else - stack_trace("NO MESSAGES TO SEND TO TARGET!") - vague_message = span_notice("You feel [you_feel] as you are operated on.") - target.show_message(vague_message, MSG_VISUAL, span_notice("You feel [you_feel] as you are operated on.")) -/** - * Sends a pain message to the target, including a chance of screaming. - * - * Arguments: - * * target - Who the message will be sent to - * * pain_message - The message to be displayed - * * mechanical_surgery - Boolean flag that represents if a surgery step is done on a mechanical limb (therefore does not force scream) - */ -/datum/surgery_step/proc/display_pain(mob/living/target, pain_message, mechanical_surgery = FALSE) - // Determine how drunk our patient is - var/drunken_patient = target.get_drunk_amount() - // Create a probability to ignore the pain based on drunkenness level - var/drunken_ignorance_probability = clamp(drunken_patient, 0, 90) - - if(target.stat < UNCONSCIOUS) - if(HAS_TRAIT(target, TRAIT_ANALGESIA) || drunken_patient && prob(drunken_ignorance_probability)) - if(!pain_message) - return - to_chat(target, span_notice("You feel a dull, numb sensation as your body is surgically operated on.")) - else - if(!pain_message) - return - to_chat(target, span_userdanger(pain_message)) - if(prob(30) && !mechanical_surgery) - target.emote("scream") - -#undef SURGERY_SPEED_TRAIT_ANALGESIA -#undef SURGERY_SPEED_DISSECTION_MODIFIER -#undef SURGERY_SPEED_MORBID_CURIOSITY -#undef SURGERY_SLOWDOWN_CAP_MULTIPLIER -#undef SURGERY_STATE_STARTED -#undef SURGERY_STATE_FAILURE -#undef SURGERY_STATE_SUCCESS -#undef SURGERY_MOOD_CATEGORY diff --git a/code/modules/surgery/surgery_tools.dm b/code/modules/surgery/surgery_tools.dm new file mode 100644 index 000000000000..acc65cc24ef7 --- /dev/null +++ b/code/modules/surgery/surgery_tools.dm @@ -0,0 +1,793 @@ +/obj/item/retractor + name = "retractor" + desc = "Retracts stuff." + icon = 'icons/obj/medical/surgery_tools.dmi' + icon_state = "retractor" + inhand_icon_state = "retractor" + icon_angle = 45 + 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 =SHEET_MATERIAL_AMOUNT * 1.5) + obj_flags = CONDUCTS_ELECTRICITY + item_flags = SURGICAL_TOOL + 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." + toolspeed = 0.5 + +/obj/item/retractor/cyborg + icon = 'icons/mob/silicon/robot_items.dmi' + icon_state = "toolkit_medborg_retractor" + icon_angle = 45 + +/obj/item/hemostat + name = "hemostat" + desc = "You think you have seen this before." + icon = 'icons/obj/medical/surgery_tools.dmi' + icon_state = "hemostat" + inhand_icon_state = "hemostat" + icon_angle = 135 + 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.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*1.25) + obj_flags = CONDUCTS_ELECTRICITY + item_flags = SURGICAL_TOOL + w_class = WEIGHT_CLASS_TINY + attack_verb_continuous = list("attacks", "pinches") + 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." + toolspeed = 0.5 + +/obj/item/hemostat/cyborg + icon = 'icons/mob/silicon/robot_items.dmi' + icon_state = "toolkit_medborg_hemostat" + icon_angle = 45 + +/obj/item/cautery + name = "cautery" + desc = "This stops bleeding." + icon = 'icons/obj/medical/surgery_tools.dmi' + icon_state = "cautery" + inhand_icon_state = "cautery" + icon_angle = 135 + 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*1.25, /datum/material/glass = SMALL_MATERIAL_AMOUNT*7.5) + obj_flags = CONDUCTS_ELECTRICITY + item_flags = SURGICAL_TOOL + w_class = WEIGHT_CLASS_TINY + attack_verb_continuous = list("burns") + 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) + return span_rose("[user] touches the end of [src] to \the [ignitable_atom], igniting it with a puff of smoke.") + +/obj/item/cautery/augment + desc = "A heated element that cauterizes wounds." + toolspeed = 0.5 + +/obj/item/cautery/cyborg + icon = 'icons/mob/silicon/robot_items.dmi' + icon_state = "toolkit_medborg_cautery" + icon_angle = 45 + +/obj/item/cautery/advanced + name = "searing tool" + desc = "It projects a high power laser used for medical applications." + 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) + hitsound = 'sound/items/tools/welder.ogg' + w_class = WEIGHT_CLASS_NORMAL + toolspeed = 0.7 + light_system = OVERLAY_LIGHT + light_range = 1.5 + light_power = 0.4 + 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, \ + force_on = force, \ + throwforce_on = throwforce, \ + hitsound_on = hitsound, \ + w_class_on = w_class, \ + clumsy_check = FALSE, \ + ) + RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) + +/* + * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. + * + * Toggles between drill and cautery and gives feedback to the user. + */ +/obj/item/cautery/advanced/proc/on_transform(obj/item/source, mob/user, active) + SIGNAL_HANDLER + + if(active) + tool_behaviour = TOOL_DRILL + set_light_color(LIGHT_COLOR_BLUE) + else + tool_behaviour = TOOL_CAUTERY + set_light_color(LIGHT_COLOR_ORANGE) + + balloon_alert(user, "lenses set to [active ? "drill" : "mend"]") + playsound(user ? user : src, 'sound/items/weapons/tap.ogg', 50, TRUE) + return COMPONENT_NO_DEFAULT_MESSAGE + +/obj/item/cautery/advanced/examine() + . = ..() + . += span_notice("It's set to [tool_behaviour == TOOL_CAUTERY ? "mending" : "drilling"] mode.") + +/obj/item/surgicaldrill + name = "surgical drill" + desc = "You can drill using this item. You dig?" + icon = 'icons/obj/medical/surgery_tools.dmi' + icon_state = "drill" + inhand_icon_state = "drill" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + hitsound = 'sound/items/weapons/circsawhit.ogg' + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*3) + obj_flags = CONDUCTS_ELECTRICITY + item_flags = SURGICAL_TOOL + force = 15 + demolition_mod = 0.5 + w_class = WEIGHT_CLASS_NORMAL + attack_verb_continuous = list("drills") + attack_verb_simple = list("drill") + tool_behaviour = TOOL_DRILL + toolspeed = 1 + sharpness = SHARP_POINTY + wound_bonus = 10 + exposed_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), 2.5 SECONDS) + user.SpinAnimation(3, 10) + playsound(user, 'sound/machines/juicer.ogg', 20, TRUE) + return MANUAL_SUICIDE + +/obj/item/surgicaldrill/cyborg + icon = 'icons/mob/silicon/robot_items.dmi' + icon_state = "toolkit_medborg_drill" + +/obj/item/surgicaldrill/augment + desc = "Effectively a small power drill contained within your arm. May or may not pierce the heavens." + hitsound = 'sound/items/weapons/circsawhit.ogg' + w_class = WEIGHT_CLASS_SMALL + toolspeed = 0.5 + +/obj/item/scalpel + name = "scalpel" + desc = "Cut, cut, and once more cut." + icon = 'icons/obj/medical/surgery_tools.dmi' + icon_state = "scalpel" + inhand_icon_state = "scalpel" + icon_angle = 180 + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + obj_flags = CONDUCTS_ELECTRICITY + item_flags = SURGICAL_TOOL + force = 10 + demolition_mod = 0.25 + w_class = WEIGHT_CLASS_TINY + throwforce = 5 + throw_speed = 3 + throw_range = 5 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*2, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT) + attack_verb_continuous = list("attacks", "slashes", "slices", "tears", "lacerates", "rips", "dices", "cuts") + attack_verb_simple = list("attack", "slash", "slice", "tear", "lacerate", "rip", "dice", "cut") + hitsound = 'sound/items/weapons/bladeslice.ogg' + sharpness = SHARP_EDGED + tool_behaviour = TOOL_SCALPEL + toolspeed = 1 + wound_bonus = 10 + exposed_wound_bonus = 15 + /// How this looks when placed in a surgical tray + var/surgical_tray_overlay = "scalpel_normal" + var/list/alt_continuous = list("stabs", "pierces", "impales") + var/list/alt_simple = list("stab", "pierce", "impale") + +/obj/item/scalpel/Initialize(mapload) + . = ..() + AddComponent(/datum/component/butchering, \ + speed = 8 SECONDS * toolspeed, \ + effectiveness = 100, \ + bonus_modifier = 0, \ + ) + AddElement(/datum/element/eyestab) + alt_continuous = string_list(alt_continuous) + alt_simple = string_list(alt_simple) + AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple) + +/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/cyborg + icon = 'icons/mob/silicon/robot_items.dmi' + icon_state = "toolkit_medborg_scalpel" + icon_angle = 0 + +/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." + icon = 'icons/obj/medical/surgery_tools.dmi' + icon_state = "saw" + inhand_icon_state = "saw" + icon_angle = 180 + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + hitsound = 'sound/items/weapons/circsawhit.ogg' + mob_throw_hit_sound = 'sound/items/weapons/pierce.ogg' + obj_flags = CONDUCTS_ELECTRICITY + item_flags = SURGICAL_TOOL + force = 15 + w_class = WEIGHT_CLASS_NORMAL + throwforce = 9 + throw_speed = 2 + throw_range = 5 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*3) + attack_verb_continuous = list("attacks", "slashes", "saws", "cuts") + attack_verb_simple = list("attack", "slash", "saw", "cut") + sharpness = SHARP_EDGED + tool_behaviour = TOOL_SAW + toolspeed = 1 + wound_bonus = 15 + exposed_wound_bonus = 10 + /// How this looks when placed in a surgical tray + var/surgical_tray_overlay = "saw_normal" + +/obj/item/circular_saw/Initialize(mapload) + . = ..() + AddComponent(/datum/component/butchering, \ + speed = 4 SECONDS * toolspeed, \ + effectiveness = 100, \ + bonus_modifier = 5, \ + butcher_sound = 'sound/items/weapons/circsawhit.ogg', \ + ) + //saws are very accurate and fast at butchering + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/chainsaw) + + AddElement( + /datum/element/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + +/obj/item/circular_saw/get_surgery_tool_overlay(tray_extended) + return surgical_tray_overlay + +/obj/item/circular_saw/cyborg + icon = 'icons/mob/silicon/robot_items.dmi' + icon_state = "toolkit_medborg_saw" + icon_angle = 0 + +/obj/item/circular_saw/augment + desc = "A small but very fast spinning saw. It rips and tears until it is done." + w_class = WEIGHT_CLASS_SMALL + toolspeed = 0.5 + + +/obj/item/surgical_drapes + name = "surgical drapes" + desc = "Medlane brand surgical drapes provide optimal safety and infection control." // DARKPACK EDIT CHANGE + icon = 'icons/obj/medical/surgery_tools.dmi' + icon_state = "surgical_drapes" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + inhand_icon_state = "drapes" + w_class = WEIGHT_CLASS_TINY + attack_verb_continuous = list("slaps") + attack_verb_simple = list("slap") + drop_sound = SFX_CLOTH_DROP + pickup_sound = SFX_CLOTH_PICKUP + gender = PLURAL + +/obj/item/surgical_drapes/Initialize(mapload) + . = ..() + AddElement(/datum/element/surgery_aid, name) + +/obj/item/surgical_drapes/cyborg + icon = 'icons/mob/silicon/robot_items.dmi' + icon_state = "toolkit_medborg_surgicaldrapes" + +/obj/item/surgical_processor //allows medical cyborgs to scan and initiate advanced surgeries + name = "surgical processor" + desc = "A device for scanning and initiating surgeries from a disk or operating computer." + icon = 'icons/obj/devices/scanner.dmi' + 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) + . = ..() + AddElement(/datum/element/surgery_aid, /obj/item/surgical_drapes::name) // i guess it's a drape dispenser + +/obj/item/surgical_processor/examine(mob/user) + . = ..() + . += span_notice("Equip the processor in one of your active modules to access downloaded advanced surgeries.") + . += span_boldnotice("Advanced surgeries available:") + //list of downloaded surgeries' names + var/list/surgeries_names = list() + for(var/datum/surgery_operation/downloaded_surgery as anything in GLOB.operations.get_instances_from(loaded_surgeries)) + surgeries_names += "[capitalize(downloaded_surgery.name)]" + . += span_notice("[english_list(surgeries_names)]") + +/obj/item/surgical_processor/equipped(mob/user, slot, initial) + . = ..() + if(!(slot & ITEM_SLOT_HANDS)) + UnregisterSignal(user, COMSIG_LIVING_OPERATING_ON) + return + RegisterSignal(user, COMSIG_LIVING_OPERATING_ON, PROC_REF(check_surgery), override = TRUE) + +/obj/item/surgical_processor/dropped(mob/user, silent) + . = ..() + UnregisterSignal(user, COMSIG_LIVING_OPERATING_ON) + +/obj/item/surgical_processor/interact_with_atom(atom/design_holder, mob/living/user, list/modifiers) + if(!istype(design_holder, /obj/item/disk/surgery) && !istype(design_holder, /obj/machinery/computer/operating)) + return NONE + balloon_alert(user, "copying designs...") + playsound(src, 'sound/machines/terminal/terminal_processing.ogg', 25, TRUE) + if(do_after(user, 1 SECONDS, target = design_holder)) + if(istype(design_holder, /obj/item/disk/surgery)) + var/obj/item/disk/surgery/surgery_disk = design_holder + loaded_surgeries |= surgery_disk.surgeries + else + var/obj/machinery/computer/operating/surgery_computer = design_holder + loaded_surgeries |= surgery_computer.advanced_surgeries + playsound(src, 'sound/machines/terminal/terminal_success.ogg', 25, TRUE) + downloaded = TRUE + update_appearance(UPDATE_OVERLAYS) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING + +/obj/item/surgical_processor/update_overlays() + . = ..() + if(downloaded) + . += mutable_appearance(src.icon, "+downloaded") + +/obj/item/surgical_processor/proc/check_surgery(datum/source, mob/living/patient, list/operations) + SIGNAL_HANDLER + + operations |= loaded_surgeries + +/obj/item/scalpel/advanced + name = "laser scalpel" + 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) + hitsound = 'sound/items/weapons/blade1.ogg' + force = 16 + w_class = WEIGHT_CLASS_NORMAL + toolspeed = 0.7 + light_system = OVERLAY_LIGHT + light_range = 1.5 + light_power = 0.4 + light_color = LIGHT_COLOR_BLUE + sharpness = SHARP_EDGED + item_flags = parent_type::item_flags | NO_BLOOD_ON_ITEM + +/obj/item/scalpel/advanced/get_all_tool_behaviours() + return list(TOOL_SAW, TOOL_SCALPEL) + +/obj/item/scalpel/advanced/Initialize(mapload) + . = ..() + 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, \ + ) + RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) + +/* + * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. + * + * Toggles between saw and scalpel and updates the light / gives feedback to the user. + */ +/obj/item/scalpel/advanced/proc/on_transform(obj/item/source, mob/user, active) + SIGNAL_HANDLER + + if(active) + tool_behaviour = TOOL_SAW + set_light_color(LIGHT_COLOR_ORANGE) + else + tool_behaviour = TOOL_SCALPEL + set_light_color(LIGHT_COLOR_BLUE) + + balloon_alert(user, "[active ? "enabled" : "disabled"] bone-cutting mode") + playsound(user ? user : src, 'sound/machines/click.ogg', 50, TRUE) + return COMPONENT_NO_DEFAULT_MESSAGE + +/obj/item/scalpel/advanced/examine() + . = ..() + . += span_notice("It's set to [tool_behaviour == TOOL_SCALPEL ? "scalpel" : "saw"] mode.") + +/obj/item/retractor/advanced + name = "mechanical pinches" + desc = "An agglomerate of rods and gears." + icon = 'icons/obj/medical/surgery_tools.dmi' + icon_state = "adv_retractor" + inhand_icon_state = "adv_retractor" + surgical_tray_overlay = "retractor_advanced" + icon_angle = 0 + 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*6, /datum/material/glass = SHEET_MATERIAL_AMOUNT*2, /datum/material/silver = SHEET_MATERIAL_AMOUNT*2, /datum/material/titanium =SHEET_MATERIAL_AMOUNT * 2.5) + 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, \ + force_on = force, \ + throwforce_on = throwforce, \ + hitsound_on = hitsound, \ + w_class_on = w_class, \ + clumsy_check = FALSE, \ + ) + RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) + +/* + * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. + * + * Toggles between retractor and hemostat and gives feedback to the user. + */ +/obj/item/retractor/advanced/proc/on_transform(obj/item/source, mob/user, active) + SIGNAL_HANDLER + + tool_behaviour = (active ? TOOL_HEMOSTAT : TOOL_RETRACTOR) + balloon_alert(user, "gears set to [active ? "clamp" : "retract"]") + playsound(user ? user : src, 'sound/items/tools/change_drill.ogg', 50, TRUE) + return COMPONENT_NO_DEFAULT_MESSAGE + +/obj/item/retractor/advanced/examine() + . = ..() + . += span_notice("It resembles a [tool_behaviour == TOOL_RETRACTOR ? "retractor" : "hemostat"].") + +/obj/item/shears + name = "amputation shears" + desc = "A type of heavy duty surgical shears used for achieving a clean separation between limb and patient. Keeping the patient still is imperative to be able to secure and align the shears." + icon = 'icons/obj/medical/surgery_tools.dmi' + icon_state = "shears" + icon_angle = 90 + obj_flags = CONDUCTS_ELECTRICITY + item_flags = SURGICAL_TOOL + toolspeed = 1 + force = 12 + w_class = WEIGHT_CLASS_NORMAL + throwforce = 6 + throw_speed = 2 + throw_range = 5 + custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*4, /datum/material/titanium=SHEET_MATERIAL_AMOUNT*3) + attack_verb_continuous = list("shears", "snips") + attack_verb_simple = list("shear", "snip") + sharpness = SHARP_EDGED + custom_premium_price = PAYCHECK_CREW * 14 + +/obj/item/shears/attack(mob/living/amputee, mob/living/user) + if(!iscarbon(amputee) || user.combat_mode) + return ..() + + if(user.zone_selected == BODY_ZONE_CHEST) + return ..() + + var/mob/living/carbon/patient = amputee + + if(HAS_TRAIT(patient, TRAIT_NODISMEMBER)) + to_chat(user, span_warning("The patient's limbs look too sturdy to amputate.")) + return + + var/candidate_name + var/obj/item/organ/tail_snip_candidate + var/obj/item/bodypart/limb_snip_candidate + + if(user.zone_selected == BODY_ZONE_PRECISE_GROIN) + tail_snip_candidate = patient.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + if(!tail_snip_candidate) + to_chat(user, span_warning("[patient] does not have a tail.")) + return + candidate_name = tail_snip_candidate.name + + else + limb_snip_candidate = patient.get_bodypart(check_zone(user.zone_selected)) + if(!limb_snip_candidate) + to_chat(user, span_warning("[patient] is already missing that limb, what more do you want?")) + return + candidate_name = limb_snip_candidate.name + + var/amputation_speed_mod = 1 + + patient.visible_message(span_danger("[user] begins to secure [src] around [patient]'s [candidate_name]."), span_userdanger("[user] begins to secure [src] around your [candidate_name]!")) + playsound(get_turf(patient), 'sound/items/tools/ratchet.ogg', 20, TRUE) + if(patient.stat >= UNCONSCIOUS || HAS_TRAIT(patient, TRAIT_INCAPACITATED)) //if you're incapacitated (due to paralysis, a stun, being in staminacrit, etc.), critted, unconscious, or dead, it's much easier to properly line up a snip + amputation_speed_mod *= 0.5 + if(patient.stat != DEAD && patient.has_status_effect(/datum/status_effect/jitter)) //jittering will make it harder to secure the shears, even if you can't otherwise move + amputation_speed_mod *= 1.5 //15*0.5*1.5=11.25, so staminacritting someone who's jittering (from, say, a stun baton) won't give you enough time to snip their head off, but staminacritting someone who isn't jittering will + if(HAS_MIND_TRAIT(user, TRAIT_MORBID)) + amputation_speed_mod *= 0.7 //its morbin time + + if(do_after(user, toolspeed * 15 SECONDS * amputation_speed_mod, target = patient)) + playsound(get_turf(patient), 'sound/items/weapons/bladeslice.ogg', 250, TRUE) + if(user.zone_selected == BODY_ZONE_PRECISE_GROIN) //OwO + tail_snip_candidate.Remove(patient) + tail_snip_candidate.forceMove(get_turf(patient)) + else + 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].")) + user.log_message("[user] has amputated [patient]'s [candidate_name] with [src]", LOG_GAME) + patient.log_message("[patient]'s [candidate_name] has been amputated by [user] with [src]", LOG_GAME) + + 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 + for(var/obj/item/bodypart/thing in user.bodyparts) + if(thing.body_part == CHEST) + continue + addtimer(CALLBACK(thing, TYPE_PROC_REF(/obj/item/bodypart/, dismember)), timer) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), user, 'sound/items/weapons/bladeslice.ogg', 70), timer) + timer += 1 SECONDS + sleep(timer) + return BRUTELOSS + +/obj/item/bonesetter + name = "bonesetter" + desc = "For setting things right." + icon = 'icons/obj/medical/surgery_tools.dmi' + icon_state = "bonesetter" + icon_angle = 135 + 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.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*1.25, /datum/material/silver = SHEET_MATERIAL_AMOUNT*1.25) + obj_flags = CONDUCTS_ELECTRICITY + item_flags = SURGICAL_TOOL + w_class = WEIGHT_CLASS_SMALL + attack_verb_continuous = list("corrects", "properly sets") + attack_verb_simple = list("correct", "properly set") + tool_behaviour = TOOL_BONESET + toolspeed = 1 + var/surgical_tray_overlay = "bonesetter" + +/obj/item/bonesetter/get_surgery_tool_overlay(tray_extended) + return surgical_tray_overlay + (tray_extended ? "" : "_out") + +/obj/item/bonesetter/cyborg + icon = 'icons/mob/silicon/robot_items.dmi' + icon_state = "toolkit_medborg_bonesetter" + icon_angle = 45 + +/obj/item/blood_filter + name = "blood filter" + desc = "For filtering the blood." + icon = 'icons/obj/medical/surgery_tools.dmi' + icon_state = "bloodfilter" + 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, /datum/material/glass=HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver=SMALL_MATERIAL_AMOUNT*5) + item_flags = SURGICAL_TOOL + w_class = WEIGHT_CLASS_NORMAL + attack_verb_continuous = list("pumps", "siphons") + attack_verb_simple = list("pump", "siphon") + tool_behaviour = TOOL_BLOODFILTER + toolspeed = 1 + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP + /// Assoc list of chem ids to names, used for deciding which chems to filter when used for surgery + var/list/whitelist = list() + var/surgical_tray_overlay = "filter" + +/obj/item/blood_filter/get_surgery_tool_overlay(tray_extended) + return surgical_tray_overlay + +/obj/item/blood_filter/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "BloodFilter", name) + ui.open() + +/obj/item/blood_filter/ui_data(mob/user) + . = list() + + .["whitelist"] = list() + for(var/key in whitelist) + .["whitelist"] += whitelist[key] + +/obj/item/blood_filter/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + . = TRUE + switch(action) + if("add") + var/selected_reagent = tgui_input_list(usr, "Select reagent to filter", "Whitelist reagent", GLOB.name2reagent) + if(!selected_reagent) + return FALSE + + var/datum/reagent/chem_id = GLOB.name2reagent[selected_reagent] + if(!chem_id) + return FALSE + + if(!(chem_id in whitelist)) + whitelist[chem_id] = selected_reagent + + if("remove") + 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 + +/obj/item/surgicaldrill/cruel + name = "tearing drill" + desc = "What secrets do they keep buried within those pearls..." + icon_state = "crueldrill" + inhand_icon_state = "crueldrill" + surgical_tray_overlay = "drill_cruel" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/circular_saw/cruel + name = "jagged bonesaw" + desc = "A twisted blade for twisted purpose. Rip sinew and bone until your work is done." + icon_state = "cruelsaw" + inhand_icon_state = "cruelsaw" + icon_angle = 0 + hitsound = 'sound/items/weapons/bladeslice.ogg' + surgical_tray_overlay = "saw_cruel" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/bonesetter/cruel + name = "harsh bonesetter" + desc = "We shall make you whole once more..." + icon_state = "cruelbonesetter" + inhand_icon_state = "cruelbonesetter" + surgical_tray_overlay = "bonesetter_cruel" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/blood_filter/cruel + name = "malignant blood filter" + desc = "You must be made pure..." + icon_state = "cruelbloodfilter" + inhand_icon_state = "cruelbloodfilter" + surgical_tray_overlay = "filter_cruel" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/retractor/cruel/augment + desc = "A twisted micro-mechanical manipulator for retracting flesh and sinew." + toolspeed = 0.5 + +/obj/item/hemostat/cruel/augment + desc = "Tiny, warped servos power a pair of pincers to stop bleeding." + toolspeed = 0.5 + +/obj/item/cautery/cruel/augment + desc = "All mistakes can be burned away with a little flame..." + toolspeed = 0.5 + +/obj/item/scalpel/cruel/augment + desc = "Ultra-sharp blade attached directly to your bone for enhanced vivisection." + toolspeed = 0.5 + +/obj/item/surgicaldrill/cruel/augment + desc = "You cannot hide your secrets from me..." + hitsound = 'sound/items/weapons/circsawhit.ogg' + w_class = WEIGHT_CLASS_SMALL + toolspeed = 0.5 + +/obj/item/circular_saw/cruel/augment + desc = "A jagged sawblade built for grisly work." + w_class = WEIGHT_CLASS_SMALL + toolspeed = 0.5 diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm deleted file mode 100644 index 1e4dff8626ad..000000000000 --- a/code/modules/surgery/tools.dm +++ /dev/null @@ -1,792 +0,0 @@ -/obj/item/retractor - name = "retractor" - desc = "Retracts stuff." - icon = 'icons/obj/medical/surgery_tools.dmi' - icon_state = "retractor" - inhand_icon_state = "retractor" - icon_angle = 45 - 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 =SHEET_MATERIAL_AMOUNT * 1.5) - obj_flags = CONDUCTS_ELECTRICITY - item_flags = SURGICAL_TOOL - 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." - toolspeed = 0.5 - -/obj/item/retractor/cyborg - icon = 'icons/mob/silicon/robot_items.dmi' - icon_state = "toolkit_medborg_retractor" - icon_angle = 45 - -/obj/item/hemostat - name = "hemostat" - desc = "You think you have seen this before." - icon = 'icons/obj/medical/surgery_tools.dmi' - icon_state = "hemostat" - inhand_icon_state = "hemostat" - icon_angle = 135 - 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.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*1.25) - obj_flags = CONDUCTS_ELECTRICITY - item_flags = SURGICAL_TOOL - w_class = WEIGHT_CLASS_TINY - attack_verb_continuous = list("attacks", "pinches") - 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." - toolspeed = 0.5 - -/obj/item/hemostat/cyborg - icon = 'icons/mob/silicon/robot_items.dmi' - icon_state = "toolkit_medborg_hemostat" - icon_angle = 45 - -/obj/item/cautery - name = "cautery" - desc = "This stops bleeding." - icon = 'icons/obj/medical/surgery_tools.dmi' - icon_state = "cautery" - inhand_icon_state = "cautery" - icon_angle = 135 - 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*1.25, /datum/material/glass = SMALL_MATERIAL_AMOUNT*7.5) - obj_flags = CONDUCTS_ELECTRICITY - item_flags = SURGICAL_TOOL - w_class = WEIGHT_CLASS_TINY - attack_verb_continuous = list("burns") - 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) - return span_rose("[user] touches the end of [src] to \the [ignitable_atom], igniting it with a puff of smoke.") - -/obj/item/cautery/augment - desc = "A heated element that cauterizes wounds." - toolspeed = 0.5 - -/obj/item/cautery/cyborg - icon = 'icons/mob/silicon/robot_items.dmi' - icon_state = "toolkit_medborg_cautery" - icon_angle = 45 - -/obj/item/cautery/advanced - name = "searing tool" - desc = "It projects a high power laser used for medical applications." - 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) - hitsound = 'sound/items/tools/welder.ogg' - w_class = WEIGHT_CLASS_NORMAL - toolspeed = 0.7 - light_system = OVERLAY_LIGHT - light_range = 1.5 - light_power = 0.4 - 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, \ - force_on = force, \ - throwforce_on = throwforce, \ - hitsound_on = hitsound, \ - w_class_on = w_class, \ - clumsy_check = FALSE, \ - ) - RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) - -/* - * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. - * - * Toggles between drill and cautery and gives feedback to the user. - */ -/obj/item/cautery/advanced/proc/on_transform(obj/item/source, mob/user, active) - SIGNAL_HANDLER - - if(active) - tool_behaviour = TOOL_DRILL - set_light_color(LIGHT_COLOR_BLUE) - else - tool_behaviour = TOOL_CAUTERY - set_light_color(LIGHT_COLOR_ORANGE) - - balloon_alert(user, "lenses set to [active ? "drill" : "mend"]") - playsound(user ? user : src, 'sound/items/weapons/tap.ogg', 50, TRUE) - return COMPONENT_NO_DEFAULT_MESSAGE - -/obj/item/cautery/advanced/examine() - . = ..() - . += span_notice("It's set to [tool_behaviour == TOOL_CAUTERY ? "mending" : "drilling"] mode.") - -/obj/item/surgicaldrill - name = "surgical drill" - desc = "You can drill using this item. You dig?" - icon = 'icons/obj/medical/surgery_tools.dmi' - icon_state = "drill" - inhand_icon_state = "drill" - lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - hitsound = 'sound/items/weapons/circsawhit.ogg' - custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*3) - obj_flags = CONDUCTS_ELECTRICITY - item_flags = SURGICAL_TOOL - force = 15 - demolition_mod = 0.5 - w_class = WEIGHT_CLASS_NORMAL - attack_verb_continuous = list("drills") - attack_verb_simple = list("drill") - tool_behaviour = TOOL_DRILL - toolspeed = 1 - sharpness = SHARP_POINTY - wound_bonus = 10 - exposed_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), 2.5 SECONDS) - user.SpinAnimation(3, 10) - playsound(user, 'sound/machines/juicer.ogg', 20, TRUE) - return MANUAL_SUICIDE - -/obj/item/surgicaldrill/cyborg - icon = 'icons/mob/silicon/robot_items.dmi' - icon_state = "toolkit_medborg_drill" - -/obj/item/surgicaldrill/augment - desc = "Effectively a small power drill contained within your arm. May or may not pierce the heavens." - hitsound = 'sound/items/weapons/circsawhit.ogg' - w_class = WEIGHT_CLASS_SMALL - toolspeed = 0.5 - -/obj/item/scalpel - name = "scalpel" - desc = "Cut, cut, and once more cut." - icon = 'icons/obj/medical/surgery_tools.dmi' - icon_state = "scalpel" - inhand_icon_state = "scalpel" - icon_angle = 180 - lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - obj_flags = CONDUCTS_ELECTRICITY - item_flags = SURGICAL_TOOL - force = 10 - demolition_mod = 0.25 - w_class = WEIGHT_CLASS_TINY - throwforce = 5 - throw_speed = 3 - throw_range = 5 - custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*2, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT) - attack_verb_continuous = list("attacks", "slashes", "slices", "tears", "lacerates", "rips", "dices", "cuts") - attack_verb_simple = list("attack", "slash", "slice", "tear", "lacerate", "rip", "dice", "cut") - hitsound = 'sound/items/weapons/bladeslice.ogg' - sharpness = SHARP_EDGED - tool_behaviour = TOOL_SCALPEL - toolspeed = 1 - wound_bonus = 10 - exposed_wound_bonus = 15 - /// How this looks when placed in a surgical tray - var/surgical_tray_overlay = "scalpel_normal" - var/list/alt_continuous = list("stabs", "pierces", "impales") - var/list/alt_simple = list("stab", "pierce", "impale") - -/obj/item/scalpel/Initialize(mapload) - . = ..() - AddComponent(/datum/component/butchering, \ - speed = 8 SECONDS * toolspeed, \ - effectiveness = 100, \ - bonus_modifier = 0, \ - ) - AddElement(/datum/element/eyestab) - alt_continuous = string_list(alt_continuous) - alt_simple = string_list(alt_simple) - AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple) - -/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/cyborg - icon = 'icons/mob/silicon/robot_items.dmi' - icon_state = "toolkit_medborg_scalpel" - icon_angle = 0 - -/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." - icon = 'icons/obj/medical/surgery_tools.dmi' - icon_state = "saw" - inhand_icon_state = "saw" - icon_angle = 180 - lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - hitsound = 'sound/items/weapons/circsawhit.ogg' - mob_throw_hit_sound = 'sound/items/weapons/pierce.ogg' - obj_flags = CONDUCTS_ELECTRICITY - item_flags = SURGICAL_TOOL - force = 15 - w_class = WEIGHT_CLASS_NORMAL - throwforce = 9 - throw_speed = 2 - throw_range = 5 - custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*3) - attack_verb_continuous = list("attacks", "slashes", "saws", "cuts") - attack_verb_simple = list("attack", "slash", "saw", "cut") - sharpness = SHARP_EDGED - tool_behaviour = TOOL_SAW - toolspeed = 1 - wound_bonus = 15 - exposed_wound_bonus = 10 - /// How this looks when placed in a surgical tray - var/surgical_tray_overlay = "saw_normal" - -/obj/item/circular_saw/Initialize(mapload) - . = ..() - AddComponent(/datum/component/butchering, \ - speed = 4 SECONDS * toolspeed, \ - effectiveness = 100, \ - bonus_modifier = 5, \ - butcher_sound = 'sound/items/weapons/circsawhit.ogg', \ - ) - //saws are very accurate and fast at butchering - var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/chainsaw) - - AddElement( - /datum/element/slapcrafting,\ - slapcraft_recipes = slapcraft_recipe_list,\ - ) - -/obj/item/circular_saw/get_surgery_tool_overlay(tray_extended) - return surgical_tray_overlay - -/obj/item/circular_saw/cyborg - icon = 'icons/mob/silicon/robot_items.dmi' - icon_state = "toolkit_medborg_saw" - icon_angle = 0 - -/obj/item/circular_saw/augment - desc = "A small but very fast spinning saw. It rips and tears until it is done." - w_class = WEIGHT_CLASS_SMALL - toolspeed = 0.5 - - -/obj/item/surgical_drapes - name = "surgical drapes" - desc = "Medlane brand surgical drapes provide optimal safety and infection control." // DARKPACK EDIT CHANGE - icon = 'icons/obj/medical/surgery_tools.dmi' - icon_state = "surgical_drapes" - lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - inhand_icon_state = "drapes" - w_class = WEIGHT_CLASS_TINY - attack_verb_continuous = list("slaps") - attack_verb_simple = list("slap") - drop_sound = SFX_CLOTH_DROP - pickup_sound = SFX_CLOTH_PICKUP - -/obj/item/surgical_drapes/Initialize(mapload) - . = ..() - AddComponent(/datum/component/surgery_initiator) - -/obj/item/surgical_drapes/cyborg - icon = 'icons/mob/silicon/robot_items.dmi' - icon_state = "toolkit_medborg_surgicaldrapes" - -/obj/item/surgical_processor //allows medical cyborgs to scan and initiate advanced surgeries - name = "surgical processor" - desc = "A device for scanning and initiating surgeries from a disk or operating computer." - icon = 'icons/obj/devices/scanner.dmi' - 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) - . = ..() - AddComponent(/datum/component/surgery_initiator) - -/obj/item/surgical_processor/examine(mob/user) - . = ..() - . += span_notice("Equip the processor in one of your active modules to access downloaded advanced surgeries.") - . += span_boldnotice("Advanced surgeries available:") - //list of downloaded surgeries' names - var/list/surgeries_names = list() - for(var/datum/surgery/downloaded_surgery as anything in loaded_surgeries) - if(initial(downloaded_surgery.replaced_by) in loaded_surgeries) //if a surgery has a better version replacing it, we don't include it in the list - continue - surgeries_names += "[initial(downloaded_surgery.name)]" - . += span_notice("[english_list(surgeries_names)]") - -/obj/item/surgical_processor/equipped(mob/user, slot, initial) - . = ..() - if(!(slot & ITEM_SLOT_HANDS)) - UnregisterSignal(user, COMSIG_SURGERY_STARTING) - return - RegisterSignal(user, COMSIG_SURGERY_STARTING, PROC_REF(check_surgery)) - -/obj/item/surgical_processor/dropped(mob/user, silent) - . = ..() - UnregisterSignal(user, COMSIG_SURGERY_STARTING) - -/obj/item/surgical_processor/interact_with_atom(atom/design_holder, mob/living/user, list/modifiers) - if(!istype(design_holder, /obj/item/disk/surgery) && !istype(design_holder, /obj/machinery/computer/operating)) - return NONE - balloon_alert(user, "copying designs...") - playsound(src, 'sound/machines/terminal/terminal_processing.ogg', 25, TRUE) - if(do_after(user, 1 SECONDS, target = design_holder)) - if(istype(design_holder, /obj/item/disk/surgery)) - var/obj/item/disk/surgery/surgery_disk = design_holder - loaded_surgeries |= surgery_disk.surgeries - else - var/obj/machinery/computer/operating/surgery_computer = design_holder - loaded_surgeries |= surgery_computer.advanced_surgeries - playsound(src, 'sound/machines/terminal/terminal_success.ogg', 25, TRUE) - downloaded = TRUE - update_appearance(UPDATE_OVERLAYS) - return ITEM_INTERACT_SUCCESS - return ITEM_INTERACT_BLOCKING - -/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 - - if(surgery.replaced_by in loaded_surgeries) - return COMPONENT_CANCEL_SURGERY - if(surgery.type in loaded_surgeries) - return COMPONENT_FORCE_SURGERY - -/obj/item/scalpel/advanced - name = "laser scalpel" - 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) - hitsound = 'sound/items/weapons/blade1.ogg' - force = 16 - w_class = WEIGHT_CLASS_NORMAL - toolspeed = 0.7 - light_system = OVERLAY_LIGHT - light_range = 1.5 - light_power = 0.4 - 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, \ - 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, \ - ) - RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) - -/* - * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. - * - * Toggles between saw and scalpel and updates the light / gives feedback to the user. - */ -/obj/item/scalpel/advanced/proc/on_transform(obj/item/source, mob/user, active) - SIGNAL_HANDLER - - if(active) - tool_behaviour = TOOL_SAW - set_light_color(LIGHT_COLOR_ORANGE) - else - tool_behaviour = TOOL_SCALPEL - set_light_color(LIGHT_COLOR_BLUE) - - balloon_alert(user, "[active ? "enabled" : "disabled"] bone-cutting mode") - playsound(user ? user : src, 'sound/machines/click.ogg', 50, TRUE) - return COMPONENT_NO_DEFAULT_MESSAGE - -/obj/item/scalpel/advanced/examine() - . = ..() - . += span_notice("It's set to [tool_behaviour == TOOL_SCALPEL ? "scalpel" : "saw"] mode.") - -/obj/item/retractor/advanced - name = "mechanical pinches" - desc = "An agglomerate of rods and gears." - icon = 'icons/obj/medical/surgery_tools.dmi' - icon_state = "adv_retractor" - inhand_icon_state = "adv_retractor" - surgical_tray_overlay = "retractor_advanced" - icon_angle = 0 - 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*6, /datum/material/glass = SHEET_MATERIAL_AMOUNT*2, /datum/material/silver = SHEET_MATERIAL_AMOUNT*2, /datum/material/titanium =SHEET_MATERIAL_AMOUNT * 2.5) - 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, \ - force_on = force, \ - throwforce_on = throwforce, \ - hitsound_on = hitsound, \ - w_class_on = w_class, \ - clumsy_check = FALSE, \ - ) - RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) - -/* - * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. - * - * Toggles between retractor and hemostat and gives feedback to the user. - */ -/obj/item/retractor/advanced/proc/on_transform(obj/item/source, mob/user, active) - SIGNAL_HANDLER - - tool_behaviour = (active ? TOOL_HEMOSTAT : TOOL_RETRACTOR) - balloon_alert(user, "gears set to [active ? "clamp" : "retract"]") - playsound(user ? user : src, 'sound/items/tools/change_drill.ogg', 50, TRUE) - return COMPONENT_NO_DEFAULT_MESSAGE - -/obj/item/retractor/advanced/examine() - . = ..() - . += span_notice("It resembles a [tool_behaviour == TOOL_RETRACTOR ? "retractor" : "hemostat"].") - -/obj/item/shears - name = "amputation shears" - desc = "A type of heavy duty surgical shears used for achieving a clean separation between limb and patient. Keeping the patient still is imperative to be able to secure and align the shears." - icon = 'icons/obj/medical/surgery_tools.dmi' - icon_state = "shears" - icon_angle = 90 - obj_flags = CONDUCTS_ELECTRICITY - item_flags = SURGICAL_TOOL - toolspeed = 1 - force = 12 - w_class = WEIGHT_CLASS_NORMAL - throwforce = 6 - throw_speed = 2 - throw_range = 5 - custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*4, /datum/material/titanium=SHEET_MATERIAL_AMOUNT*3) - attack_verb_continuous = list("shears", "snips") - attack_verb_simple = list("shear", "snip") - sharpness = SHARP_EDGED - custom_premium_price = PAYCHECK_CREW * 14 - -/obj/item/shears/attack(mob/living/amputee, mob/living/user) - if(!iscarbon(amputee) || user.combat_mode) - return ..() - - if(user.zone_selected == BODY_ZONE_CHEST) - return ..() - - var/mob/living/carbon/patient = amputee - - if(HAS_TRAIT(patient, TRAIT_NODISMEMBER)) - to_chat(user, span_warning("The patient's limbs look too sturdy to amputate.")) - return - - var/candidate_name - var/obj/item/organ/tail_snip_candidate - var/obj/item/bodypart/limb_snip_candidate - - if(user.zone_selected == BODY_ZONE_PRECISE_GROIN) - tail_snip_candidate = patient.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) - if(!tail_snip_candidate) - to_chat(user, span_warning("[patient] does not have a tail.")) - return - candidate_name = tail_snip_candidate.name - - else - limb_snip_candidate = patient.get_bodypart(check_zone(user.zone_selected)) - if(!limb_snip_candidate) - to_chat(user, span_warning("[patient] is already missing that limb, what more do you want?")) - return - candidate_name = limb_snip_candidate.name - - var/amputation_speed_mod = 1 - - patient.visible_message(span_danger("[user] begins to secure [src] around [patient]'s [candidate_name]."), span_userdanger("[user] begins to secure [src] around your [candidate_name]!")) - playsound(get_turf(patient), 'sound/items/tools/ratchet.ogg', 20, TRUE) - if(patient.stat >= UNCONSCIOUS || HAS_TRAIT(patient, TRAIT_INCAPACITATED)) //if you're incapacitated (due to paralysis, a stun, being in staminacrit, etc.), critted, unconscious, or dead, it's much easier to properly line up a snip - amputation_speed_mod *= 0.5 - if(patient.stat != DEAD && patient.has_status_effect(/datum/status_effect/jitter)) //jittering will make it harder to secure the shears, even if you can't otherwise move - amputation_speed_mod *= 1.5 //15*0.5*1.5=11.25, so staminacritting someone who's jittering (from, say, a stun baton) won't give you enough time to snip their head off, but staminacritting someone who isn't jittering will - if(HAS_MIND_TRAIT(user, TRAIT_MORBID)) - amputation_speed_mod *= 0.7 //its morbin time - - if(do_after(user, toolspeed * 15 SECONDS * amputation_speed_mod, target = patient)) - playsound(get_turf(patient), 'sound/items/weapons/bladeslice.ogg', 250, TRUE) - if(user.zone_selected == BODY_ZONE_PRECISE_GROIN) //OwO - tail_snip_candidate.Remove(patient) - tail_snip_candidate.forceMove(get_turf(patient)) - else - 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].")) - user.log_message("[user] has amputated [patient]'s [candidate_name] with [src]", LOG_GAME) - patient.log_message("[patient]'s [candidate_name] has been amputated by [user] with [src]", LOG_GAME) - - 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 - for(var/obj/item/bodypart/thing in user.bodyparts) - if(thing.body_part == CHEST) - continue - addtimer(CALLBACK(thing, TYPE_PROC_REF(/obj/item/bodypart/, dismember)), timer) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), user, 'sound/items/weapons/bladeslice.ogg', 70), timer) - timer += 1 SECONDS - sleep(timer) - return BRUTELOSS - -/obj/item/bonesetter - name = "bonesetter" - desc = "For setting things right." - icon = 'icons/obj/medical/surgery_tools.dmi' - icon_state = "bonesetter" - icon_angle = 135 - 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.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*1.25, /datum/material/silver = SHEET_MATERIAL_AMOUNT*1.25) - obj_flags = CONDUCTS_ELECTRICITY - item_flags = SURGICAL_TOOL - w_class = WEIGHT_CLASS_SMALL - attack_verb_continuous = list("corrects", "properly sets") - attack_verb_simple = list("correct", "properly set") - tool_behaviour = TOOL_BONESET - toolspeed = 1 - var/surgical_tray_overlay = "bonesetter" - -/obj/item/bonesetter/get_surgery_tool_overlay(tray_extended) - return surgical_tray_overlay + (tray_extended ? "" : "_out") - -/obj/item/bonesetter/cyborg - icon = 'icons/mob/silicon/robot_items.dmi' - icon_state = "toolkit_medborg_bonesetter" - icon_angle = 45 - -/obj/item/blood_filter - name = "blood filter" - desc = "For filtering the blood." - icon = 'icons/obj/medical/surgery_tools.dmi' - icon_state = "bloodfilter" - 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, /datum/material/glass=HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver=SMALL_MATERIAL_AMOUNT*5) - item_flags = SURGICAL_TOOL - w_class = WEIGHT_CLASS_NORMAL - attack_verb_continuous = list("pumps", "siphons") - attack_verb_simple = list("pump", "siphon") - tool_behaviour = TOOL_BLOODFILTER - toolspeed = 1 - /// Assoc list of chem ids to names, used for deciding which chems to filter when used for surgery - var/list/whitelist = list() - var/surgical_tray_overlay = "filter" - -/obj/item/blood_filter/get_surgery_tool_overlay(tray_extended) - return surgical_tray_overlay - -/obj/item/blood_filter/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "BloodFilter", name) - ui.open() - -/obj/item/blood_filter/ui_data(mob/user) - . = list() - - .["whitelist"] = list() - for(var/key in whitelist) - .["whitelist"] += whitelist[key] - -/obj/item/blood_filter/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - - . = TRUE - switch(action) - if("add") - var/selected_reagent = tgui_input_list(usr, "Select reagent to filter", "Whitelist reagent", GLOB.name2reagent) - if(!selected_reagent) - return FALSE - - var/datum/reagent/chem_id = GLOB.name2reagent[selected_reagent] - if(!chem_id) - return FALSE - - if(!(chem_id in whitelist)) - whitelist[chem_id] = selected_reagent - - if("remove") - 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 - -/obj/item/surgicaldrill/cruel - name = "tearing drill" - desc = "What secrets do they keep buried within those pearls..." - icon_state = "crueldrill" - inhand_icon_state = "crueldrill" - surgical_tray_overlay = "drill_cruel" - item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT - -/obj/item/circular_saw/cruel - name = "jagged bonesaw" - desc = "A twisted blade for twisted purpose. Rip sinew and bone until your work is done." - icon_state = "cruelsaw" - inhand_icon_state = "cruelsaw" - hitsound = 'sound/items/weapons/bladeslice.ogg' - surgical_tray_overlay = "saw_cruel" - item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT - -/obj/item/bonesetter/cruel - name = "harsh bonesetter" - desc = "We shall make you whole once more..." - icon_state = "cruelbonesetter" - inhand_icon_state = "cruelbonesetter" - surgical_tray_overlay = "bonesetter_cruel" - item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT - -/obj/item/blood_filter/cruel - name = "malignant blood filter" - desc = "You must be made pure..." - icon_state = "cruelbloodfilter" - inhand_icon_state = "cruelbloodfilter" - surgical_tray_overlay = "filter_cruel" - item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT - -/obj/item/retractor/cruel/augment - desc = "A twisted micro-mechanical manipulator for retracting flesh and sinew." - toolspeed = 0.5 - -/obj/item/hemostat/cruel/augment - desc = "Tiny, warped servos power a pair of pincers to stop bleeding." - toolspeed = 0.5 - -/obj/item/cautery/cruel/augment - desc = "All mistakes can be burned away with a little flame..." - toolspeed = 0.5 - -/obj/item/scalpel/cruel/augment - desc = "Ultra-sharp blade attached directly to your bone for enhanced vivisection." - toolspeed = 0.5 - -/obj/item/surgicaldrill/cruel/augment - desc = "You cannot hide your secrets from me..." - hitsound = 'sound/items/weapons/circsawhit.ogg' - w_class = WEIGHT_CLASS_SMALL - toolspeed = 0.5 - -/obj/item/circular_saw/cruel/augment - desc = "A jagged sawblade built for grisly work." - w_class = WEIGHT_CLASS_SMALL - toolspeed = 0.5 diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index 5d93ee76541c..574edae9f73a 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -73,6 +73,17 @@ for (var/datum/tgui/window as anything in open_uis) window.send_full_update() +/** + * public + * + * Will force an update on non-static data for all viewers. + * Use when you are manually controlling UI data updates, + * such as when you are not using the auto-update system. + */ +/datum/proc/update_data_for_all_viewers() + for(var/datum/tgui/ui as anything in open_uis) + ui.send_update() + /** * public * diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index f9b94949f185..37bbeca0e85c 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -57,7 +57,7 @@ */ /datum/tgui/New(mob/user, datum/src_object, interface, title, ui_x, ui_y) log_tgui(user, - "new [interface] fancy [user?.client?.prefs.read_preference(/datum/preference/toggle/tgui_fancy)]", + "new [interface]", src_object = src_object) src.user = user src.src_object = src_object @@ -98,7 +98,6 @@ if(!window.is_ready()) window.initialize( strict_mode = TRUE, - fancy = user.client.prefs.read_preference(/datum/preference/toggle/tgui_fancy), assets = list( get_asset_datum(/datum/asset/simple/tgui), )) @@ -152,11 +151,25 @@ state = null qdel(src) +/** + * public + * + * Sends a message to the front end to push the UI window to position 0,0 + * + * optional can_be_suspended bool + */ +/datum/tgui/proc/reset_ui_position() + if(window) + // Windows you want to keep are usually blue screens of death + // and we want to keep them around, to allow user to read + // the error message properly. + window.send_message("resetposition") + /** * public * * Closes all ByondUI elements, left dangling by a forceful TGUI exit, - * such as via Alt+F4, closing in non-fancy mode, or terminating the process + * such as via Alt+F4, closing or terminating the process * */ /datum/tgui/proc/terminate_byondui_elements() @@ -258,7 +271,6 @@ "window" = list( "key" = window_key, "size" = window_size, - "fancy" = user.client.prefs.read_preference(/datum/preference/toggle/tgui_fancy), "locked" = user.client.prefs.read_preference(/datum/preference/toggle/tgui_lock), "scale" = user.client.prefs.read_preference(/datum/preference/toggle/ui_scale), ), diff --git a/code/modules/tgui/tgui_window.dm b/code/modules/tgui/tgui_window.dm index 38c49548b647..c99ab3143444 100644 --- a/code/modules/tgui/tgui_window.dm +++ b/code/modules/tgui/tgui_window.dm @@ -20,7 +20,6 @@ var/sent_assets = list() // Vars passed to initialize proc (and saved for later) var/initial_strict_mode - var/initial_fancy var/initial_assets var/initial_inline_html var/initial_inline_js @@ -52,7 +51,6 @@ * will be put into the queue until the window finishes loading. * * optional strict_mode bool - Enables strict error handling and BSOD. - * optional fancy bool - If TRUE and if this is NOT a panel, will hide the window titlebar. * optional assets list - List of assets to load during initialization. * optional inline_html string - Custom HTML to inject. * optional inline_js string - Custom JS to inject. @@ -60,7 +58,6 @@ */ /datum/tgui_window/proc/initialize( strict_mode = FALSE, - fancy = FALSE, assets = list(), inline_html = "", inline_js = "", @@ -70,7 +67,6 @@ window = src) if(!client) return - src.initial_fancy = fancy src.initial_assets = assets src.initial_inline_html = inline_html src.initial_inline_js = inline_js @@ -78,12 +74,7 @@ status = TGUI_WINDOW_LOADING fatally_errored = FALSE // Build window options - var/options = "file=[id].html;can_minimize=0;auto_format=0;" - // Remove titlebar and resize handles for a fancy window - if(fancy) - options += "titlebar=0;can_resize=0;" - else - options += "titlebar=1;can_resize=1;" + var/options = "file=[id].html;can_minimize=0;auto_format=0;titlebar=0;can_resize=0;" // Generate page html var/html = SStgui.basehtml html = replacetextEx(html, "\[tgui:windowId]", id) @@ -130,7 +121,6 @@ /datum/tgui_window/proc/reinitialize() initialize( strict_mode = initial_strict_mode, - fancy = initial_fancy, assets = initial_assets, inline_html = initial_inline_html, inline_js = initial_inline_js, diff --git a/code/modules/tgui_input/color.dm b/code/modules/tgui_input/color.dm new file mode 100644 index 000000000000..e418fb9e2599 --- /dev/null +++ b/code/modules/tgui_input/color.dm @@ -0,0 +1,123 @@ +/** + * Creates a TGUI color picker window and returns the user's response. + * + * This proc should be used to create a color picker that the caller will wait for a response from. + * Arguments: + * * user - The user to show the picker to. + * * title - The of the picker modal, shown on the top of the TGUI window. + * * timeout - The timeout of the picker, after which the modal will close and qdel itself. Set to zero for no timeout. + * * autofocus - The bool that controls if this picker should grab window focus. + */ +/proc/tgui_color_picker(mob/user, message, title, default = "#000000", timeout = 0, autofocus = TRUE) + if (!user) + user = usr + if (!istype(user)) + if (istype(user, /client)) + var/client/client = user + user = client.mob + else + return + // Client does NOT have tgui_input on: Returns regular input + if(!user.client.prefs.read_preference(/datum/preference/toggle/tgui_input)) + return input(user, message, title, default) as color|null + var/datum/tgui_color_picker/picker = new(user, message, title, default, timeout, autofocus) + picker.ui_interact(user) + picker.wait() + if (picker) + . = picker.choice + qdel(picker) + +/** + * # tgui_color_picker + * + * Datum used for instantiating and using a TGUI-controlled color picker. + */ +/datum/tgui_color_picker + /// The title of the TGUI window + var/title + /// The message to show the user + var/message + /// The default choice, used if there is an existing value + var/default + /// The color the user selected, null if no selection has been made + var/choice + /// The time at which the tgui_color_picker was created, for displaying timeout progress. + var/start_time + /// The lifespan of the tgui_color_picker, after which the window will close and delete itself. + var/timeout + /// The bool that controls if this modal should grab window focus + var/autofocus + /// Boolean field describing if the tgui_color_picker was closed by the user. + var/closed + +/datum/tgui_color_picker/New(mob/user, message, title, default, timeout, autofocus) + src.autofocus = autofocus + src.title = title + src.default = default + src.message = message + if (timeout) + src.timeout = timeout + start_time = world.time + QDEL_IN(src, timeout) + +/datum/tgui_color_picker/Destroy(force) + SStgui.close_uis(src) + return ..() + +/** + * Waits for a user's response to the tgui_color_picker's prompt before returning. Returns early if + * the window was closed by the user. + */ +/datum/tgui_color_picker/proc/wait() + while (!choice && !closed && !QDELETED(src)) + stoplag(1) + +/datum/tgui_color_picker/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ColorPickerModal") + ui.open() + ui.set_autoupdate(timeout > 0) + +/datum/tgui_color_picker/ui_close(mob/user) + . = ..() + closed = TRUE + +/datum/tgui_color_picker/ui_state(mob/user) + return GLOB.always_state + +/datum/tgui_color_picker/ui_static_data(mob/user) + . = list() + .["autofocus"] = autofocus + .["large_buttons"] = !user.client?.prefs || user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_large) + .["swapped_buttons"] = !user.client?.prefs || user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_swapped) + .["title"] = title + .["default_color"] = default + .["message"] = message + +/datum/tgui_color_picker/ui_data(mob/user) + . = list() + if(timeout) + .["timeout"] = CLAMP01((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS)) + +/datum/tgui_color_picker/ui_act(action, list/params) + . = ..() + if (.) + return + switch(action) + if("submit") + var/raw_data = LOWER_TEXT(params["entry"]) + var/hex = sanitize_hexcolor(raw_data, desired_format = 6, include_crunch = TRUE) + if (!hex) + return + set_choice(hex) + closed = TRUE + SStgui.close_uis(src) + return TRUE + if("cancel") + closed = TRUE + SStgui.close_uis(src) + return TRUE + +/datum/tgui_color_picker/proc/set_choice(choice) + src.choice = choice diff --git a/code/modules/tgui_input/say_modal/modal.dm b/code/modules/tgui_input/say_modal/modal.dm index 876c4476f679..c91b27a28384 100644 --- a/code/modules/tgui_input/say_modal/modal.dm +++ b/code/modules/tgui_input/say_modal/modal.dm @@ -24,13 +24,15 @@ /// The user who opened the window var/client/client /// Injury phrases to blurt out - var/list/hurt_phrases = list("GACK!", "GLORF!", "OOF!", "AUGH!", "OW!", "URGH!", "HRNK!") + var/static/list/hurt_phrases = list("GACK!", "GLORF!", "OOF!", "AUGH!", "OW!", "URGH!", "HRNK!") /// Max message length var/max_length = MAX_MESSAGE_LEN /// The modal window var/datum/tgui_window/window /// Boolean for whether the tgui_say was opened by the user. var/window_open + /// What text was present in the say box the last time save_text was called + var/saved_text = "" /** Creates the new input window to exist in the background. */ /datum/tgui_say/New(client/client, id) @@ -50,7 +52,6 @@ sleep(3 SECONDS) window.initialize( strict_mode = TRUE, - fancy = TRUE, inline_css = file("tgui/public/tgui-say.bundle.css"), inline_js = file("tgui/public/tgui-say.bundle.js"), ); @@ -87,7 +88,7 @@ if(!payload?["channel"]) CRASH("No channel provided to an open TGUI-Say") window_open = TRUE - if(payload["channel"] != OOC_CHANNEL && payload["channel"] != ADMIN_CHANNEL) + if(payload["channel"] != OOC_CHANNEL && payload["channel"] != ADMIN_CHANNEL && payload["channel"] != LOOC_CHANNEL) // DARKPACK EDIT, ORIGINAL: if(payload["channel"] != OOC_CHANNEL && payload["channel"] != ADMIN_CHANNEL) start_thinking() if(!client.typing_indicators) log_speech_indicators("[key_name(client)] started typing at [loc_name(client.mob)], indicators DISABLED.") @@ -128,7 +129,7 @@ if (type == "typing") start_typing() return TRUE - if (type == "entry" || type == "force") + if (type == "entry" || type == "force" || type == "save") handle_entry(type, payload) return TRUE return FALSE diff --git a/code/modules/tgui_input/say_modal/speech.dm b/code/modules/tgui_input/say_modal/speech.dm index 0d95b855a15f..6ab00e1d4d91 100644 --- a/code/modules/tgui_input/say_modal/speech.dm +++ b/code/modules/tgui_input/say_modal/speech.dm @@ -10,7 +10,7 @@ /datum/tgui_say/proc/alter_entry(payload) var/entry = payload["entry"] /// No OOC leaks - if(!entry || payload["channel"] == OOC_CHANNEL || payload["channel"] == ME_CHANNEL) + if(!entry || payload["channel"] == OOC_CHANNEL || payload["channel"] == ME_CHANNEL || payload["channel"] == LOOC_CHANNEL) // DARKPACK EDIT, ORIGINAL: if(!entry || payload["channel"] == OOC_CHANNEL || payload["channel"] == ME_CHANNEL) return pick(hurt_phrases) /// Random trimming for larger sentences if(length(entry) > 50) @@ -47,6 +47,11 @@ if(ADMIN_CHANNEL) SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/cmd_admin_say, entry) return TRUE + // DARKPACK EDIT START + if(LOOC_CHANNEL) + client.looc(entry) + return TRUE + // DARKPACK EDIT END return FALSE /** @@ -57,6 +62,13 @@ window.send_message("force") stop_typing() +/** + * Exports whatever text is currently in the input box to this datum + */ +/datum/tgui_say/proc/save_text() + saved_text = null + window.send_message("save") + /** * Makes the player force say what's in their current input box. */ @@ -70,6 +82,19 @@ log_speech_indicators("[key_name(client)] FORCED to stop typing, indicators DISABLED.") SEND_SIGNAL(src, COMSIG_HUMAN_FORCESAY) +/** + * Gets whatever text is currently in this mob's say box and returns it. + * + * Note: Sleeps, due to waiting for say to respond. + */ +/mob/proc/get_typing_text() + if(!client?.tgui_say?.window_open) + return + client.tgui_say.save_text() + var/safety = world.time + UNTIL(istext(client?.tgui_say?.saved_text) || world.time - safety > 2 SECONDS) + return client?.tgui_say?.saved_text + /** * Handles text entry and forced speech. * @@ -89,8 +114,14 @@ return TRUE if(type == "force") var/target_channel = payload["channel"] - if(target_channel == ME_CHANNEL || target_channel == OOC_CHANNEL) + if(target_channel == ME_CHANNEL || target_channel == OOC_CHANNEL || target_channel == LOOC_CHANNEL) // DARKPACK EDIT, ORIGINAL: if(target_channel == ME_CHANNEL || target_channel == OOC_CHANNEL) target_channel = SAY_CHANNEL // No ooc leaks delegate_speech(alter_entry(payload), target_channel) return TRUE + if(type == "save") + saved_text = "" // so we can differentiate null (nothing saved) and empty (nothing typed) + var/target_channel = payload["channel"] + if(target_channel == SAY_CHANNEL || target_channel == RADIO_CHANNEL) + saved_text = payload["entry"] // only save IC text + return TRUE return FALSE diff --git a/code/modules/tgui_panel/tgui_panel.dm b/code/modules/tgui_panel/tgui_panel.dm index 24b1e865ffc4..ecb3ad626a8e 100644 --- a/code/modules/tgui_panel/tgui_panel.dm +++ b/code/modules/tgui_panel/tgui_panel.dm @@ -82,7 +82,6 @@ "computer_id" = client.computer_id, ), "window" = list( - "fancy" = FALSE, "locked" = FALSE, ), ), diff --git a/code/modules/tooltip/tooltip.html b/code/modules/tooltip/tooltip.html index 56b61ea94607..0dff6882735f 100644 --- a/code/modules/tooltip/tooltip.html +++ b/code/modules/tooltip/tooltip.html @@ -160,6 +160,24 @@ background-color: #282831; } + .clockwork .wrap { + border-color: #cfbc47; + } + .clockwork .content { + color: #b18e25; + border-color: #cfbc47; + background-color: #523c15; + } + + .glass .wrap { + border-color: #344b58; + } + .glass .content { + color: #75a4c4; + border-color: #344b58; + background-color: #1f252b; + } + .trasen-knox .wrap { border-color: #998e81; } @@ -172,7 +190,7 @@ .detective .wrap { border-color: #2c0f0c; } - .detective .wrap { + .detective .content { color: #c7b08b; border-color: #2c0f0c; background-color: #221c1a; @@ -220,15 +238,15 @@ //To improve our code. Thanks gooncoders, very cool var mapWidth = map["view-size"].x, mapHeight = map["view-size"].y, - tilesShownX = tooltip.client_view_w; - tilesShownY = tooltip.client_view_h; - (realIconSizeX = mapWidth / tilesShownX), - (realIconSizeY = mapHeight / tilesShownY), - (resizeRatioX = realIconSizeX / tooltip.tileSize), - (resizeRatioY = realIconSizeY / tooltip.tileSize), + tilesShownX = tooltip.client_view_w, + tilesShownY = tooltip.client_view_h, + realIconSizeX = mapWidth / tilesShownX, + realIconSizeY = mapHeight / tilesShownY, + resizeRatioX = realIconSizeX / tooltip.tileSize, + resizeRatioY = realIconSizeY / tooltip.tileSize, //Calculate letterboxing offsets - (leftOffset = (map.size.x - mapWidth) / 2), - (topOffset = (map.size.y - mapHeight) / 2); + leftOffset = (map.size.x - mapWidth) / 2, + topOffset = (map.size.y - mapHeight) / 2; //alert(realIconSize + ' | ' +tooltip.tileSize + ' | ' + resizeRatio); //DEBUG diff --git a/code/modules/transport/_transport_machinery.dm b/code/modules/transport/_transport_machinery.dm index 61caee8a0d72..e6ee41c8f0b2 100644 --- a/code/modules/transport/_transport_machinery.dm +++ b/code/modules/transport/_transport_machinery.dm @@ -150,50 +150,3 @@ set_machine_stat(machine_stat & ~BROKEN) update_appearance() return TRUE - -/obj/item/wallframe/tram/try_build(obj/structure/tram/on_tram, mob/user) - if(get_dist(on_tram,user) > 1) - balloon_alert(user, "you are too far!") - return - - var/floor_to_tram = get_dir(user, on_tram) - if(!(floor_to_tram in GLOB.cardinals)) - balloon_alert(user, "stand in line with tram wall!") - return - - var/turf/tram_turf = get_turf(user) - var/obj/structure/thermoplastic/tram_floor = locate() in tram_turf - if(!istype(tram_floor)) - balloon_alert(user, "needs tram!") - return - - if(check_wall_item(tram_turf, floor_to_tram, wall_external)) - balloon_alert(user, "already something here!") - return - - return TRUE - -/obj/item/wallframe/tram/attach(obj/structure/tram/on_tram, mob/user) - if(result_path) - playsound(src.loc, 'sound/machines/click.ogg', 75, TRUE) - user.visible_message(span_notice("[user.name] installs [src] on the tram."), - span_notice("You install [src] on the tram."), - span_hear("You hear clicking.")) - var/floor_to_tram = get_dir(user, on_tram) - - var/obj/cabinet = new result_path(get_turf(user), floor_to_tram, TRUE) - cabinet.setDir(floor_to_tram) - - if(pixel_shift) - switch(floor_to_tram) - if(NORTH) - cabinet.pixel_y = pixel_shift - if(SOUTH) - cabinet.pixel_y = -pixel_shift - if(EAST) - cabinet.pixel_x = pixel_shift - if(WEST) - cabinet.pixel_x = -pixel_shift - after_attach(cabinet) - - qdel(src) diff --git a/code/modules/transport/elevator/elev_controller.dm b/code/modules/transport/elevator/elev_controller.dm index ce49efafe4bd..efe3528ce5e1 100644 --- a/code/modules/transport/elevator/elev_controller.dm +++ b/code/modules/transport/elevator/elev_controller.dm @@ -1,6 +1,7 @@ /obj/machinery/button/elevator name = "elevator button" desc = "Go back. Go back. Go back. Can you operate the elevator." + icon = 'modular_darkpack/modules/elevators/icons/buttons.dmi' // DARKPACK EDIT CHANGE base_icon_state = "tram" icon_state = "tram" can_alter_skin = FALSE diff --git a/code/modules/transport/elevator/elev_indicator.dm b/code/modules/transport/elevator/elev_indicator.dm index 22b9334be5a3..8e2bf163cc56 100644 --- a/code/modules/transport/elevator/elev_indicator.dm +++ b/code/modules/transport/elevator/elev_indicator.dm @@ -4,7 +4,7 @@ /obj/machinery/lift_indicator name = "elevator indicator" desc = "Indicates what floor the elevator is at and which way it's going." - icon = 'icons/obj/machines/lift_indicator.dmi' + icon = 'modular_darkpack/modules/elevators/icons/buttons.dmi' // DARKPACK EDIT CHANGE icon_state = "lift_indo-base" base_icon_state = "lift_indo-" max_integrity = 500 diff --git a/code/modules/transport/elevator/elev_music_zone.dm b/code/modules/transport/elevator/elev_music_zone.dm index a4223bc33c20..78549534e8ac 100644 --- a/code/modules/transport/elevator/elev_music_zone.dm +++ b/code/modules/transport/elevator/elev_music_zone.dm @@ -14,7 +14,7 @@ GLOBAL_LIST_EMPTY(elevator_music) /// Sound loop type to use var/soundloop_type = /datum/looping_sound/local_forecast /// Proximity monitor which handles playing sounds to clients - var/datum/proximity_monitor/advanced/elevator_music_area/sound_player + var/datum/proximity_monitor/elevator_music_area/sound_player /obj/effect/abstract/elevator_music_zone/Initialize(mapload) . = ..() @@ -27,6 +27,7 @@ GLOBAL_LIST_EMPTY(elevator_music) /obj/effect/abstract/elevator_music_zone/Destroy(force) GLOB.elevator_music -= src + QDEL_NULL(sound_player) return ..() /obj/effect/abstract/elevator_music_zone/proc/link_to_panel(atom/elevator_panel) @@ -50,8 +51,7 @@ GLOBAL_LIST_EMPTY(elevator_music) qdel(src) /// Load or unload a looping sound when mobs enter or exit the area -/datum/proximity_monitor/advanced/elevator_music_area - edge_is_a_field = TRUE +/datum/proximity_monitor/elevator_music_area /// Are we currently playing sounds? var/enabled = TRUE /// Looping sound datum type to play @@ -59,15 +59,16 @@ GLOBAL_LIST_EMPTY(elevator_music) /// Assoc list of mobs to sound loops currently playing var/list/tracked_mobs = list() -/datum/proximity_monitor/advanced/elevator_music_area/New(atom/_host, range, _ignore_if_not_on_turf, soundloop_type) +/datum/proximity_monitor/elevator_music_area/New(atom/_host, range, _ignore_if_not_on_turf, soundloop_type) . = ..() src.soundloop_type = soundloop_type -/datum/proximity_monitor/advanced/elevator_music_area/Destroy() +/datum/proximity_monitor/elevator_music_area/Destroy() QDEL_LIST_ASSOC_VAL(tracked_mobs) return ..() -/datum/proximity_monitor/advanced/elevator_music_area/field_turf_crossed(mob/entered, turf/old_location, turf/new_location) +/datum/proximity_monitor/elevator_music_area/on_entered(turf/new_location, mob/entered, turf/old_location) + . = ..() if (!istype(entered) || !entered.mind) return @@ -82,31 +83,32 @@ GLOBAL_LIST_EMPTY(elevator_music) tracked_mobs[entered] = null // Still add it to the list so we don't keep making this check RegisterSignal(entered, COMSIG_QDELETING, PROC_REF(mob_destroyed)) -/datum/proximity_monitor/advanced/elevator_music_area/field_turf_uncrossed(mob/exited, turf/old_location, turf/new_location) +/datum/proximity_monitor/elevator_music_area/on_uncrossed(turf/old_location, mob/exited, direction) + . = ..() if (!(exited in tracked_mobs)) return - if ((new_location in field_turfs) || (new_location in edge_turfs)) + if(get_dist(host, exited) <= current_range) return qdel(tracked_mobs[exited]) tracked_mobs -= exited UnregisterSignal(exited, COMSIG_QDELETING) /// Remove references on mob deletion -/datum/proximity_monitor/advanced/elevator_music_area/proc/mob_destroyed(mob/former_mob) +/datum/proximity_monitor/elevator_music_area/proc/mob_destroyed(mob/former_mob) SIGNAL_HANDLER if (former_mob in tracked_mobs) qdel(tracked_mobs[former_mob]) tracked_mobs -= former_mob /// Start sound loops playing -/datum/proximity_monitor/advanced/elevator_music_area/proc/turn_on() +/datum/proximity_monitor/elevator_music_area/proc/turn_on() enabled = TRUE for (var/mob in tracked_mobs) var/datum/looping_sound/loop = tracked_mobs[mob] loop.start() /// Stop active sound loops -/datum/proximity_monitor/advanced/elevator_music_area/proc/turn_off() +/datum/proximity_monitor/elevator_music_area/proc/turn_off() enabled = FALSE for (var/mob in tracked_mobs) var/datum/looping_sound/loop = tracked_mobs[mob] diff --git a/code/modules/transport/elevator/elev_panel.dm b/code/modules/transport/elevator/elev_panel.dm index 162c70f390ce..c82e51df2943 100644 --- a/code/modules/transport/elevator/elev_panel.dm +++ b/code/modules/transport/elevator/elev_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/wallmounts.dmi' + icon = 'modular_darkpack/modules/elevators/icons/buttons.dmi' // DARKPACK EDIT CHANGE icon_state = "elevpanel0" base_icon_state = "elevpanel" diff --git a/code/modules/transport/tram/tram_controller.dm b/code/modules/transport/tram/tram_controller.dm index fafcd88d3c19..594c2f443fe8 100644 --- a/code/modules/transport/tram/tram_controller.dm +++ b/code/modules/transport/tram/tram_controller.dm @@ -943,7 +943,7 @@ var/turf/drop_location = find_obstruction_free_location(1, src) if(disassembled) - new /obj/item/wallframe/tram/controller(drop_location) + new /obj/item/wallframe/tram(drop_location) else new /obj/item/stack/sheet/mineral/titanium(drop_location, 2) new /obj/item/stack/sheet/iron(drop_location) @@ -1190,11 +1190,23 @@ controller_datum.set_home_controller(src) RegisterSignal(SStransport, COMSIG_TRANSPORT_ACTIVE, PROC_REF(sync_controller)) -/obj/item/wallframe/tram/controller +/obj/item/wallframe/tram name = "tram controller cabinet" desc = "A box that contains the equipment to control a tram. Just secure to the tram wall." icon = 'icons/obj/tram/tram_controllers.dmi' icon_state = "tram-controller" - custom_materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 4, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2) + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 20) result_path = /obj/machinery/transport/tram_controller pixel_shift = 32 + +/obj/item/wallframe/tram/find_support_structure(atom/structure) + return astype(structure, /obj/structure/tram) + +/obj/item/wallframe/tram/try_build(obj/structure/tram/on_tram, mob/user) + var/turf/tram_turf = get_turf(user) + var/obj/structure/thermoplastic/tram_floor = locate() in tram_turf + if(!istype(tram_floor)) + balloon_alert(user, "needs tram!") + return FALSE + + return ..() diff --git a/code/modules/transport/tram/tram_displays.dm b/code/modules/transport/tram/tram_displays.dm index 81b73398a15c..4e850abb2a8e 100644 --- a/code/modules/transport/tram/tram_displays.dm +++ b/code/modules/transport/tram/tram_displays.dm @@ -39,7 +39,7 @@ desc = "Used to build tram indicator displays, just secure to the wall." icon_state = "indi_blank" icon = 'icons/obj/tram/tram_indicator.dmi' - custom_materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 4, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2) + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7) result_path = /obj/machinery/transport/destination_sign/indicator pixel_shift = 32 diff --git a/code/modules/transport/tram/tram_doors.dm b/code/modules/transport/tram/tram_doors.dm index 17173e79cd9a..95c1e1c386f9 100644 --- a/code/modules/transport/tram/tram_doors.dm +++ b/code/modules/transport/tram/tram_doors.dm @@ -54,7 +54,6 @@ set_density(FALSE) if(!isnull(filler)) filler.set_density(FALSE) - update_freelook_sight() flags_1 &= ~PREVENT_CLICK_UNDER_1 air_update_turf(TRUE, FALSE) var/open_delay = animation_segment_delay(AIRLOCK_OPENING_FINISHED) - passable_delay @@ -113,7 +112,6 @@ set_density(TRUE) if(!isnull(filler)) filler.set_density(TRUE) - update_freelook_sight() flags_1 |= PREVENT_CLICK_UNDER_1 air_update_turf(TRUE, TRUE) crush() diff --git a/code/modules/transport/tram/tram_floors.dm b/code/modules/transport/tram/tram_floors.dm index 8310507965f3..dd091e4e3ae5 100644 --- a/code/modules/transport/tram/tram_floors.dm +++ b/code/modules/transport/tram/tram_floors.dm @@ -15,7 +15,7 @@ barefootstep = FOOTSTEP_HARD_BAREFOOT clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY - tiled_dirt = FALSE + tiled_turf = FALSE rcd_proof = TRUE /turf/open/floor/tram/examine(mob/user) @@ -186,10 +186,15 @@ plane = GAME_PLANE obj_flags = BLOCK_Z_OUT_DOWN | BLOCK_Z_OUT_UP appearance_flags = PIXEL_SCALE|KEEP_TOGETHER + custom_materials = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT / 2) var/secured = TRUE var/floor_tile = /obj/item/stack/thermoplastic var/mutable_appearance/damage_overlay +/obj/structure/thermoplastic/Initialize(mapload) + . = ..() + AddElement(/datum/element/force_move_pulled) + /datum/armor/tram_floor melee = 40 bullet = 10 @@ -294,6 +299,7 @@ max_amount = 60 novariants = TRUE merge_type = /obj/item/stack/thermoplastic + mats_per_unit = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT / 2) var/tile_type = /obj/structure/thermoplastic /obj/item/stack/thermoplastic/light diff --git a/code/modules/transport/tram/tram_machinery.dm b/code/modules/transport/tram/tram_machinery.dm index a60a1d658663..b4d4ac5db7a1 100644 --- a/code/modules/transport/tram/tram_machinery.dm +++ b/code/modules/transport/tram/tram_machinery.dm @@ -103,10 +103,10 @@ to_chat(user, span_warning("You are too far away to activate the button!")) /obj/machinery/button/transport/tram/setup_device() + . = ..() var/obj/item/assembly/control/transport/call_button/tram_device = device - tram_device.id = id - tram_device.specific_transport_id = specific_transport_id - return ..() + if(istype(tram_device)) + tram_device.specific_transport_id = specific_transport_id /obj/machinery/button/transport/tram/examine(mob/user) . = ..() diff --git a/code/modules/transport/tram/tram_structures.dm b/code/modules/transport/tram/tram_structures.dm index 95a57ffdfbb9..90f6070c95c5 100644 --- a/code/modules/transport/tram/tram_structures.dm +++ b/code/modules/transport/tram/tram_structures.dm @@ -218,29 +218,11 @@ for(var/i in 1 to mineral_amount) new mineral(loc) -/obj/structure/tram/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) - . = ..() - - if(istype(item, /obj/item/wallframe/tram)) - try_wallmount(item, user) - -/obj/structure/tram/proc/try_wallmount(obj/item/wallmount, mob/user) - if(!istype(wallmount, /obj/item/wallframe/tram)) - return - - var/obj/item/wallframe/frame = wallmount - if(frame.try_build(src, user)) - frame.attach(src, user) - - return - /* * Other misc tramwall types */ - /obj/structure/tram/alt - /obj/structure/tram/alt/titanium name = "solid tram" desc = "A lightweight titanium composite structure. There is further solid plating where the panels usually attach to the frame." diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index a809b6b19dda..076b1a3c31b2 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -87,9 +87,11 @@ #define EASY_ALLOCATE(arguments...) allocate(__IMPLIED_TYPE__, run_loc_floor_bottom_left, ##arguments) // BEGIN_INCLUDE +#include "aas_configs.dm" #include "abductor_baton_spell.dm" #include "ablative_hud.dm" #include "achievements.dm" +#include "alerts.dm" #include "anchored_mobs.dm" #include "anonymous_themes.dm" #include "antag_conversion.dm" @@ -102,13 +104,16 @@ #include "bake_a_cake.dm" #include "barsigns.dm" #include "baseturfs.dm" +#include "baton.dm" #include "bee.dm" #include "bespoke_id.dm" #include "binary_insert.dm" #include "bitrunning.dm" #include "blindness.dm" +#include "blood_volume_procs.dm" #include "bloody_footprints.dm" #include "breath.dm" +#include "buckle.dm" #include "burning.dm" #include "cable_powernets.dm" #include "can_see.dm" @@ -144,6 +149,7 @@ #include "damp_rag.dm" #include "dcs_check_list_arguments.dm" #include "dcs_get_id_from_elements.dm" +#include "death_moodlets.dm" #include "designs.dm" #include "dismemberment.dm" #include "dna_infusion.dm" @@ -162,6 +168,7 @@ #include "explosion_action.dm" #include "firedoor_regions.dm" #include "fish_unit_tests.dm" +#include "flyperson.dm" #include "focus_only_tests.dm" #include "font_awesome_icons.dm" #include "food_edibility_check.dm" @@ -172,12 +179,14 @@ #include "gloves_and_shoes_armor.dm" #include "greyscale_config.dm" #include "hallucination_icons.dm" +#include "held_slowdown.dm" #include "heretic_knowledge.dm" #include "heretic_rituals.dm" #include "high_five.dm" #include "holder_loving.dm" #include "holidays.dm" #include "holofan_placement.dm" +#include "huds.dm" #include "hulk.dm" #include "human_through_recycler.dm" #include "hunger_curse.dm" @@ -209,6 +218,7 @@ #include "mapping.dm" #include "mapping_nearstation_test.dm" #include "market.dm" +#include "mecha_build.dm" #include "mecha_damage.dm" #include "medical_wounds.dm" #include "merge_type.dm" @@ -224,9 +234,11 @@ #include "modular_map_loader.dm" #include "monkey_business.dm" #include "mouse_bite_cable.dm" +#include "move_pulled.dm" #include "movement_order_sanity.dm" #include "mutant_hands_consistency.dm" #include "mutant_organs.dm" +#include "neurine_trauma_cleanup.dm" #include "novaflower_burn.dm" #include "nuke_cinematic.dm" #include "omnitools.dm" @@ -249,6 +261,7 @@ #include "quirks.dm" #include "range_return.dm" #include "rcd.dm" +#include "reachable_soup.dm" #include "reagent_container_defaults.dm" #include "reagent_id_typos.dm" #include "reagent_mob_expose.dm" @@ -256,8 +269,10 @@ #include "reagent_names.dm" #include "reagent_recipe_collisions.dm" #include "reagent_transfer.dm" +#include "recycle_recycling.dm" #include "required_map_items.dm" #include "resist.dm" +#include "reskin_validation.dm" #include "reta_system.dm" #include "say.dm" #include "screenshot_airlocks.dm" @@ -300,7 +315,9 @@ #include "strange_reagent.dm" #include "strippable.dm" #include "stuns.dm" +#include "style_hotswapping.dm" #include "subsystem_init.dm" +#include "suit_sensor.dm" #include "suit_storage_icons.dm" #include "surgeries.dm" #include "syringe_gun.dm" @@ -312,12 +329,15 @@ #include "trait_addition_and_removal.dm" #include "traitor.dm" #include "traitor_mail_content_check.dm" +#include "trash_food.dm" #include "trauma_granting.dm" #include "turf_icons.dm" #include "tutorial_sanity.dm" +#include "unequip_defib.dm" #include "unit_test.dm" #include "verify_config_tags.dm" #include "verify_emoji_names.dm" +#include "wallmount.dm" #include "washing.dm" #include "weird_food.dm" #include "wizard_loadout.dm" diff --git a/code/modules/unit_tests/aas_configs.dm b/code/modules/unit_tests/aas_configs.dm new file mode 100644 index 000000000000..30b82619dd75 --- /dev/null +++ b/code/modules/unit_tests/aas_configs.dm @@ -0,0 +1,10 @@ +/datum/unit_test/aas_configs + +/datum/unit_test/aas_configs/Run() + var/expected_max_length = MAX_AAS_LENGTH + + for(var/config_type in valid_subtypesof(/datum/aas_config_entry)) + var/datum/aas_config_entry/entry = allocate(config_type) + for(var/key, line in entry.announcement_lines_map) + if(length_char(line) > expected_max_length) + TEST_FAIL("Announcement line '[key]' in config '[config_type]' exceeds max length of [expected_max_length] characters (actual length: [length(line)])") diff --git a/code/modules/unit_tests/alerts.dm b/code/modules/unit_tests/alerts.dm new file mode 100644 index 000000000000..b6cbde5b3d4b --- /dev/null +++ b/code/modules/unit_tests/alerts.dm @@ -0,0 +1,59 @@ +/// Tests screen alerts are clickable +/datum/unit_test/alerts + var/was_clicked = FALSE + +/datum/unit_test/alerts/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + dummy.mock_client = new /datum/client_interface() + + var/old_usr = usr // Click still relies on usr so let's not mess this up + usr = dummy + + var/atom/movable/screen/alert/test_alert/clickme = dummy.throw_alert(TRAIT_SOURCE_UNIT_TESTS, /atom/movable/screen/alert/test_alert) + clickme.linked = src + clickme.Click() + if(!was_clicked) + TEST_FAIL("Screen alert was not clickable.") + + usr = old_usr + +/atom/movable/screen/alert/test_alert + var/datum/unit_test/alerts/linked + +/atom/movable/screen/alert/test_alert/Click(location, control, params) + . = ..() + if(!.) + return + + linked.was_clicked = TRUE + +/atom/movable/screen/alert/test_alert/Destroy() + linked = null + return ..() + +/datum/unit_test/alert_underlay_stripping + +/datum/unit_test/alert_underlay_stripping/Run() + var/mob/living/carbon/human/consistent/dummy = EASY_ALLOCATE() + dummy.equipOutfit(/datum/outfit/job/assistant/consistent) + dummy.mock_client = new /datum/client_interface() + + var/obj/item/flashlight/lantern/on/light = EASY_ALLOCATE() + dummy.put_in_hands(light) + + var/obj/item/rod_of_asclepius/asclepius = EASY_ALLOCATE() + dummy.put_in_hands(asclepius) + asclepius.apply_oath(dummy) + + var/datum/status_effect/hippocratic_oath/oath = dummy.has_status_effect(/datum/status_effect/hippocratic_oath) + TEST_ASSERT_NOTNULL(oath, "Dummy should have the Hippocratic Oath status effect.") + oath.aura_healing.process(1) // tick it once to apply the alert + var/atom/movable/screen/alert/aura_healing/alert = locate() in assoc_to_values(dummy.alerts) + TEST_ASSERT_NOTNULL(alert, "Dummy should have received the aura healing alert.") + TEST_ASSERT(length(alert.overlays) > 0, "Alert should have overlays applied.") + + for(var/mutable_appearance/some_overlay as anything in alert.overlays) + var/base_plane = PLANE_TO_TRUE(some_overlay.plane) + for(var/mutable_appearance/some_subunderlay as anything in some_overlay.underlays) + if(PLANE_TO_TRUE(some_subunderlay.plane) != base_plane) + TEST_FAIL("Alert overlay has a off-plane underlay - it should have been stripped, otherwise it may interfere with screens.") diff --git a/code/modules/unit_tests/area_contents.dm b/code/modules/unit_tests/area_contents.dm index 71fda983c61c..dea3c0a30574 100644 --- a/code/modules/unit_tests/area_contents.dm +++ b/code/modules/unit_tests/area_contents.dm @@ -1,9 +1,9 @@ /// Verifies that an area's perception of their "turfs" is correct, and no other area overlaps with them /// Quite slow, but needed -/datum/unit_test/area_contents +/datum/unit_test/maptest_area_contents priority = TEST_LONGER -/datum/unit_test/area_contents/Run() +/datum/unit_test/maptest_area_contents/Run() // First, we check that there are no entries in more then one area // That or duplicate entries for (var/area/area_to_test in GLOB.areas) @@ -19,16 +19,16 @@ if (turf_to_check.in_contents_of) var/area/existing = turf_to_check.in_contents_of if (existing == turf_to_check.loc) - TEST_FAIL("Found a duplicate turf [turf_to_check.type] inside [area_to_test.type]'s turf listing") + TEST_FAIL("Found a duplicate turf [turf_to_check.type] [COORD(turf_to_check)] inside [area_to_test.type]'s turf listing") else - TEST_FAIL("Found a shared turf [turf_to_check.type] between [area_to_test.type] and [existing.type]'s turf listings") + TEST_FAIL("Found a shared turf [turf_to_check.type] [COORD(turf_to_check)] between [area_to_test.type] and [existing.type]'s turf listings") var/area/turfs_actual_area = turf_to_check.loc if (turfs_actual_area != area_to_test) - TEST_FAIL("Found a turf [turf_to_check.type] which is IN [turfs_actual_area.type], but is registered as being in [area_to_test.type]") + TEST_FAIL("Found a turf [turf_to_check.type] [COORD(turf_to_check)] which is IN [turfs_actual_area.type], but is registered as being in [area_to_test.type]") turf_to_check.in_contents_of = turfs_actual_area for(var/turf/position in ALL_TURFS()) if(!position.in_contents_of) - TEST_FAIL("Found a turf [position.type] inside [position.loc.type] that is NOT stored in any area's turf listing") + TEST_FAIL("Found a turf [position.type] [COORD(position)] inside [position.loc.type] that is NOT stored in any area's turf listing") diff --git a/code/modules/unit_tests/atmospherics_sanity.dm b/code/modules/unit_tests/atmospherics_sanity.dm index ff177ae4517b..8b1d029ff57e 100644 --- a/code/modules/unit_tests/atmospherics_sanity.dm +++ b/code/modules/unit_tests/atmospherics_sanity.dm @@ -32,7 +32,7 @@ // If there are no starting areas, default to these var/static/list/area/default_starting_areas = list( - /area/station/ai_monitored/turret_protected/ai, + /area/station/ai/satellite/chamber, /area/station/engineering/atmos, /area/station/medical/virology, /area/station/science/xenobiology, diff --git a/code/modules/unit_tests/baseturfs.dm b/code/modules/unit_tests/baseturfs.dm index 3150aac342f9..c746964f1b77 100644 --- a/code/modules/unit_tests/baseturfs.dm +++ b/code/modules/unit_tests/baseturfs.dm @@ -5,15 +5,15 @@ turf.assemble_baseturfs(initial(turf.baseturfs)) /// Validates that unmodified baseturfs tear down properly -/datum/unit_test/baseturfs_unmodified_scrape +/datum/unit_test/maptest_baseturfs_unmodified_scrape -/datum/unit_test/baseturfs_unmodified_scrape/Run() +/datum/unit_test/maptest_baseturfs_unmodified_scrape/Run() // What this is specifically doesn't matter, just as long as the test is built for it TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "run_loc_floor_bottom_left should be an iron floor") RESET_TO_EXPECTED(run_loc_floor_bottom_left) run_loc_floor_bottom_left.ScrapeAway() - TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/floor/plating, "Iron floors should scrape away to plating") + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/floor/plating/concrete, "Iron floors should scrape away to plating") // DARKPACK EDIT CHANGE run_loc_floor_bottom_left.ScrapeAway() TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/space, "Plating should scrape away to space") @@ -21,14 +21,14 @@ run_loc_floor_bottom_left.ScrapeAway() TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/space, "Space should scrape away to space") -/datum/unit_test/baseturfs_unmodified_scrape/Destroy() +/datum/unit_test/maptest_baseturfs_unmodified_scrape/Destroy() RESET_TO_EXPECTED(run_loc_floor_bottom_left) return ..() /// Validates that specially placed baseturfs tear down properly -/datum/unit_test/baseturfs_placed_on_top +/datum/unit_test/maptest_baseturfs_placed_on_top -/datum/unit_test/baseturfs_placed_on_top/Run() +/datum/unit_test/maptest_baseturfs_placed_on_top/Run() TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "run_loc_floor_bottom_left should be an iron floor") // Do this instead of just ChangeTurf to guarantee that baseturfs is completely default on-init behavior @@ -40,14 +40,14 @@ run_loc_floor_bottom_left.ScrapeAway() TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "Rock wall should've been scraped off, back into the expected type") -/datum/unit_test/baseturfs_placed_on_top/Destroy() +/datum/unit_test/maptest_baseturfs_placed_on_top/Destroy() RESET_TO_EXPECTED(run_loc_floor_bottom_left) return ..() /// Validates that specially placed baseturfs BELOW tear down properly -/datum/unit_test/baseturfs_placed_on_bottom +/datum/unit_test/maptest_baseturfs_placed_on_bottom -/datum/unit_test/baseturfs_placed_on_bottom/Run() +/datum/unit_test/maptest_baseturfs_placed_on_bottom/Run() TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "run_loc_floor_bottom_left should be an iron floor") // Do this instead of just ChangeTurf to guarantee that baseturfs is completely default on-init behavior @@ -57,7 +57,7 @@ TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "PlaceOnBottom shouldn't have changed turf") run_loc_floor_bottom_left.ScrapeAway() - TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/floor/plating, "Iron floors should scrape away to plating") + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/floor/plating/concrete, "Iron floors should scrape away to plating") // DARKPACK EDIT CHANGE run_loc_floor_bottom_left.ScrapeAway() TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/space, "Plating should've scraped off to space") @@ -68,7 +68,7 @@ run_loc_floor_bottom_left.ScrapeAway() TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/floor/plating, "Rock wall should've scraped down back to plating (because it's a wall)") -/datum/unit_test/baseturfs_placed_on_bottom/Destroy() +/datum/unit_test/maptest_baseturfs_placed_on_bottom/Destroy() RESET_TO_EXPECTED(run_loc_floor_bottom_left) return ..() diff --git a/code/modules/unit_tests/baton.dm b/code/modules/unit_tests/baton.dm new file mode 100644 index 000000000000..8b27b4d9ca30 --- /dev/null +++ b/code/modules/unit_tests/baton.dm @@ -0,0 +1,230 @@ +/// Tests a variety of baton interactions with a variety of baton types +/datum/unit_test/baton + abstract_type = /datum/unit_test/baton + /// Baton type being tested + var/obj/item/melee/baton/baton_type + /// Description of the click type being tested + var/click_descriptor + /// Modifiers for the click being tested + var/list/click_modifiers + /// Whether the attacker is in combat mode + var/combat_mode = TRUE + /// Whether the baton is active + var/use_baton = TRUE + +/datum/unit_test/baton/Run() + var/mob/living/carbon/human/consistent/secoff = EASY_ALLOCATE() + var/mob/living/carbon/human/consistent/tider = EASY_ALLOCATE() + ADD_TRAIT(secoff, TRAIT_PERFECT_ATTACKER, TRAIT_SOURCE_UNIT_TESTS) + + var/obj/item/melee/baton/stun_baton = allocate(baton_type) + secoff.put_in_active_hand(stun_baton) + secoff.set_combat_mode(combat_mode) + if(use_baton) + stun_baton.attack_self(secoff) + + test_attack(secoff, tider) + +/// Performs two attacks, tests the resulting damage on the defender +/datum/unit_test/baton/proc/test_attack(mob/living/attacker, mob/living/defender, obj/item/melee/baton/baton) + // Perform an attack, while off baton cooldown + click_wrapper(attacker, defender, click_modifiers) + TEST_ASSERT_EQUAL(defender.get_stamina_loss(), asserted_stamina_damage(), \ + "[baton_type::name] did an incorrect amount of stamina damage to target ([get_descriptor()])") + TEST_ASSERT_EQUAL(defender.get_brute_loss(), asserted_brute_damage(), \ + "[baton_type::name] did an incorrect amount of brute damage to target ([get_descriptor()])") + + // Now perform an attack while on baton cooldown + click_wrapper(attacker, defender, click_modifiers) + TEST_ASSERT_EQUAL(defender.get_stamina_loss(), asserted_stamina_damage(), \ + "[baton_type::name] did an incorrect amount of stamina damage to target while on cooldown ([get_descriptor()])") + TEST_ASSERT_EQUAL(defender.get_brute_loss(), asserted_brute_damage() * 2, \ + "[baton_type::name] did an incorrect amount of brute damage to target while on cooldown ([get_descriptor()])") + +/// How much stamina damage is expected from this test case +/datum/unit_test/baton/proc/asserted_stamina_damage() + return baton_type::stamina_damage + +/// How much brute damage is expected from this test case +/datum/unit_test/baton/proc/asserted_brute_damage() + return baton_type::force + +/// Description of the current test case +/datum/unit_test/baton/proc/get_descriptor() + return "[click_descriptor] \ + / [combat_mode ? "in combat mode" : "not in combat mode"] \ + / [use_baton ? "active baton" : "inactive baton"]" + +/datum/unit_test/baton/left_click + abstract_type = /datum/unit_test/baton/left_click + click_descriptor = "left click" + click_modifiers = list(LEFT_CLICK = TRUE, BUTTON = LEFT_CLICK) + +/datum/unit_test/baton/right_click + abstract_type = /datum/unit_test/baton/right_click + click_descriptor = "right click" + click_modifiers = list(RIGHT_CLICK = TRUE, BUTTON = RIGHT_CLICK) + +// Left click sec baton +/datum/unit_test/baton/left_click/sec + abstract_type = /datum/unit_test/baton/left_click/sec + baton_type = /obj/item/melee/baton/security/loaded + +// - Active + combat mode = stuns, no damage +/datum/unit_test/baton/left_click/sec/on_with_combat + combat_mode = TRUE + use_baton = TRUE + +/datum/unit_test/baton/left_click/sec/on_with_combat/asserted_brute_damage() + return 0 + +// - Active + no combat mode = stuns, no damage +/datum/unit_test/baton/left_click/sec/on_no_combat + combat_mode = FALSE + use_baton = TRUE + +/datum/unit_test/baton/left_click/sec/on_no_combat/asserted_brute_damage() + return 0 + +// - Inactive + combat mode = no stun, deals damage +/datum/unit_test/baton/left_click/sec/off_with_combat + combat_mode = TRUE + use_baton = FALSE + +/datum/unit_test/baton/left_click/sec/off_with_combat/asserted_stamina_damage() + return 0 + +// - Inactive + no combat mode = no sun, no damage +/datum/unit_test/baton/left_click/sec/off_no_combat + combat_mode = FALSE + use_baton = FALSE + +/datum/unit_test/baton/left_click/sec/off_no_combat/asserted_stamina_damage() + return 0 + +/datum/unit_test/baton/left_click/sec/off_no_combat/asserted_brute_damage() + return 0 + +// Right click sec baton +/datum/unit_test/baton/right_click/sec + baton_type = /obj/item/melee/baton/security/loaded + +// - Active + combat mode = stuns, deals damage +/datum/unit_test/baton/right_click/sec/on_with_combat + combat_mode = TRUE + use_baton = TRUE + +// - Active + no combat mode = stuns, deals damage +/datum/unit_test/baton/right_click/sec/on_no_combat + combat_mode = FALSE + use_baton = TRUE + +// - Inactive + combat mode = no stun, deals damage +/datum/unit_test/baton/right_click/sec/attack_when_off + use_baton = FALSE + +/datum/unit_test/baton/right_click/sec/attack_when_off/asserted_stamina_damage() + return 0 + +// - Inactive + no combat mode = no stun, deals damage +/datum/unit_test/baton/right_click/sec/attack_when_off/no_combat + combat_mode = FALSE + +/datum/unit_test/baton/right_click/sec/attack_when_off/no_combat/asserted_stamina_damage() + return 0 + +// Left click stunprod +/datum/unit_test/baton/left_click/prod + abstract_type = /datum/unit_test/baton/left_click/prod + baton_type = /obj/item/melee/baton/security/cattleprod/loaded + +// - Active + combat mode = stuns, no damage +/datum/unit_test/baton/left_click/prod/on_with_combat + combat_mode = TRUE + use_baton = TRUE + +/datum/unit_test/baton/left_click/prod/on_with_combat/asserted_brute_damage() + return 0 + +// - Active + no combat mode = stuns, no damage +/datum/unit_test/baton/left_click/prod/on_no_combat + combat_mode = FALSE + use_baton = TRUE + +/datum/unit_test/baton/left_click/prod/on_no_combat/asserted_brute_damage() + return 0 + +// - Inactive + combat mode = no stun, damages +/datum/unit_test/baton/left_click/prod/off_with_combat + combat_mode = TRUE + use_baton = FALSE + +/datum/unit_test/baton/left_click/prod/off_with_combat/asserted_stamina_damage() + return 0 + +// - Inactive + no combat mode = no stun, no damage +/datum/unit_test/baton/left_click/prod/off_no_combat + combat_mode = FALSE + use_baton = FALSE + +/datum/unit_test/baton/left_click/prod/off_no_combat/asserted_stamina_damage() + return 0 + +/datum/unit_test/baton/left_click/prod/off_no_combat/asserted_brute_damage() + return 0 + +// Right click stunprod +/datum/unit_test/baton/right_click/prod + abstract_type = /datum/unit_test/baton/right_click/prod + baton_type = /obj/item/melee/baton/security/cattleprod/loaded + +// - Active + combat mode = stuns, deals damage +/datum/unit_test/baton/right_click/prod/on_with_combat + combat_mode = TRUE + use_baton = TRUE + +// - Active + no combat mode = stuns, deals damage +/datum/unit_test/baton/right_click/prod/on_no_combat + combat_mode = FALSE + use_baton = TRUE + +// - Inactive + combat mode = no stun, deals damage +/datum/unit_test/baton/right_click/prod/attack_when_off + combat_mode = TRUE + use_baton = FALSE + +/datum/unit_test/baton/right_click/prod/attack_when_off/asserted_stamina_damage() + return 0 + +// - Inactive + no combat mode = no stun, deals damage +/datum/unit_test/baton/right_click/prod/attack_when_off/no_combat + combat_mode = FALSE + use_baton = FALSE + +/datum/unit_test/baton/right_click/prod/attack_when_off/no_combat/asserted_stamina_damage() + return 0 + +// Left click det baton +// - Always stuns never damages, regardless of combat mode +/datum/unit_test/baton/left_click/det + baton_type = /obj/item/melee/baton + use_baton = FALSE + combat_mode = FALSE + +/datum/unit_test/baton/left_click/det/asserted_brute_damage() + return 0 + +/datum/unit_test/baton/left_click/det/combat_mode + combat_mode = TRUE + +// Right click det baton +// - Never stuns, always damages, regardless of combat mode (see: stun_on_harmbaton var) +/datum/unit_test/baton/right_click/det + baton_type = /obj/item/melee/baton + use_baton = FALSE + +/datum/unit_test/baton/right_click/det/asserted_stamina_damage() + return 0 + +/datum/unit_test/baton/right_click/det/combat_mode + combat_mode = TRUE diff --git a/code/modules/unit_tests/blindness.dm b/code/modules/unit_tests/blindness.dm index 8836f80611f0..20a8349302bf 100644 --- a/code/modules/unit_tests/blindness.dm +++ b/code/modules/unit_tests/blindness.dm @@ -1,4 +1,4 @@ -#define HAS_SCREEN_OVERLAY(mob, type) (locate(type) in flatten_list(mob.screens)) +#define HAS_SCREEN_OVERLAY(mob, type) (locate(type) in assoc_to_values(mob.screens)) #define HAS_CLIENT_COLOR(mob, type) (locate(type) in mob.client_colours) /** @@ -52,14 +52,14 @@ // Check for the status effect, duh TEST_ASSERT(dummy.is_blind(), "Dummy, [status_message], did not have the blind status effect.") // Being more technical, we need to check for client color and screen overlays - TEST_ASSERT(HAS_CLIENT_COLOR(dummy, /datum/client_colour/monochrome), "Dummy, [status_message], did not have the monochrome client color.") + TEST_ASSERT(HAS_CLIENT_COLOR(dummy, /datum/client_colour/blindness), "Dummy, [status_message], did not have the monochrome client color.") TEST_ASSERT(HAS_SCREEN_OVERLAY(dummy, /atom/movable/screen/fullscreen/blind), "Dummy, [status_message], did not have a blind screen overlay in their list of screens.") /datum/unit_test/blindness/proc/check_if_not_blind(mob/living/carbon/human/dummy, status_message = "after being cured of blindness") // Check for no status effect TEST_ASSERT(!dummy.is_blind(), "Dummy, [status_message], still had the blindness status effect.") // Check that the client color and screen overlay are gone - TEST_ASSERT(!HAS_CLIENT_COLOR(dummy, /datum/client_colour/monochrome), "Dummy, [status_message], still had the monochrome client color.") + TEST_ASSERT(!HAS_CLIENT_COLOR(dummy, /datum/client_colour/blindness), "Dummy, [status_message], still had the monochrome client color.") TEST_ASSERT(!HAS_SCREEN_OVERLAY(dummy, /atom/movable/screen/fullscreen/blind), "Dummy, [status_message], still had the blind sceen overlay.") /** diff --git a/code/modules/unit_tests/blood_volume_procs.dm b/code/modules/unit_tests/blood_volume_procs.dm new file mode 100644 index 000000000000..9c532486aee8 --- /dev/null +++ b/code/modules/unit_tests/blood_volume_procs.dm @@ -0,0 +1,115 @@ +/datum/unit_test/blood_volume_procs + +/datum/unit_test/blood_volume_procs/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + + // Test initial blood status. + TEST_ASSERT(dummy.can_have_blood(), "Initialization of blood volume status is screwed up.") + TEST_ASSERT(CAN_HAVE_BLOOD(dummy), "Caching of blood volume status is screwed up.") + + // Test initial blood volume. + TEST_ASSERT_EQUAL(dummy.default_blood_volume, BLOOD_VOLUME_NORMAL, "Default blood volume is incorrect.") + TEST_ASSERT_EQUAL(dummy.get_blood_volume(), dummy.default_blood_volume, "Blood volume isn't initialized properly.") + TEST_ASSERT_EQUAL(dummy.get_blood_volume(apply_modifiers = TRUE), dummy.get_blood_volume(), "Blood volume is modified on initialization.") + + var/set_amount = 400 + + // Test setting blood volume. + TEST_ASSERT_EQUAL(dummy.set_blood_volume(set_amount), set_amount, "Set proc return value is incorrect.") + TEST_ASSERT_EQUAL(dummy.get_blood_volume(), set_amount, "Final blood volume is different from what was expected.") + + dummy.set_blood_volume(BLOOD_VOLUME_NORMAL) + var/adjustment_amount = 100 + var/expected_final_volume = dummy.get_blood_volume() + adjustment_amount + + // Test increasing blood volume. + TEST_ASSERT_EQUAL(dummy.adjust_blood_volume(adjustment_amount), adjustment_amount, "Adjustment proc return value is incorrect.") + TEST_ASSERT_EQUAL(dummy.get_blood_volume(), expected_final_volume, "Final blood volume is different from what was expected.") + + dummy.set_blood_volume(BLOOD_VOLUME_NORMAL) + adjustment_amount = -100 + expected_final_volume = dummy.get_blood_volume() + adjustment_amount + + // Test decreasing blood volume. + TEST_ASSERT_EQUAL(dummy.adjust_blood_volume(adjustment_amount), adjustment_amount, "Adjustment proc return value is incorrect.") + TEST_ASSERT_EQUAL(dummy.get_blood_volume(), expected_final_volume, "Final blood volume is different from what was expected.") + + dummy.set_blood_volume(BLOOD_VOLUME_NORMAL) + adjustment_amount = 100 + var/expected_adjustment = 50 + expected_final_volume = dummy.get_blood_volume() + expected_adjustment + + // Test increasing blood volume, clamped to a maximum. + TEST_ASSERT_EQUAL(dummy.adjust_blood_volume(adjustment_amount, maximum = expected_final_volume), expected_adjustment, "Clamped adjustment proc return value is incorrect.") + TEST_ASSERT_EQUAL(dummy.get_blood_volume(), expected_final_volume, "Clamped final blood volume is different from what was expected.") + + dummy.set_blood_volume(BLOOD_VOLUME_NORMAL) + adjustment_amount = -100 + expected_adjustment = -50 + expected_final_volume = dummy.get_blood_volume() + expected_adjustment + + // Test decreasing blood volume, clamped to a minimum. + TEST_ASSERT_EQUAL(dummy.adjust_blood_volume(adjustment_amount, minimum = expected_final_volume), expected_adjustment, "Clamped adjustment proc return value is incorrect.") + TEST_ASSERT_EQUAL(dummy.get_blood_volume(), expected_final_volume, "Clamped final blood volume is different from what was expected.") + + dummy.set_blood_volume(BLOOD_VOLUME_NORMAL) + adjustment_amount = 100 + expected_final_volume = dummy.get_blood_volume() + adjustment_amount + var/minimum = BLOOD_VOLUME_NORMAL + 200 + + // Test if increasing an existing volume that is below the minimum causes it to jump to the minimum. + TEST_ASSERT_EQUAL(dummy.adjust_blood_volume(adjustment_amount, minimum = minimum), adjustment_amount, "When existing volume is below the minimum, adjustment the proc return value after trying to increase it is unexpected. (likely jumped to minimum)") + TEST_ASSERT_EQUAL(dummy.get_blood_volume(), expected_final_volume, "When existing volume is below the minimum, the final volume after trying to increase it is unexpected. (likely jumped to minimum)") + + dummy.set_blood_volume(BLOOD_VOLUME_NORMAL) + adjustment_amount = -100 + expected_final_volume = dummy.get_blood_volume() + adjustment_amount + var/maximum = BLOOD_VOLUME_NORMAL - 200 + + // Test if decreasing an existing volume that is above the maximum causes it to jump to the maximum. + TEST_ASSERT_EQUAL(dummy.adjust_blood_volume(adjustment_amount, maximum = maximum), adjustment_amount, "When existing volume is above the maximum, the adjustment proc return value after trying to decrease it is unexpected. (likely jumped to maximum)") + TEST_ASSERT_EQUAL(dummy.get_blood_volume(), expected_final_volume, "When existing volume is above the maximum, the final volume after trying to decrease it is unexpected. (likely jumped to maximum)") + + dummy.set_blood_volume(BLOOD_VOLUME_NORMAL) + adjustment_amount = BLOOD_VOLUME_MAXIMUM * 10 + expected_final_volume = dummy.get_blood_volume() + adjustment_amount + + // Test increasing blood volume beyond BLOOD_VOLUME_MAXIMUM by setting the maximum to INFINITY. This is allowed. (e.g. setting it to BLOOD_VOLUME_MAX_LETHAL) + TEST_ASSERT_EQUAL(dummy.adjust_blood_volume(adjustment_amount, maximum = INFINITY), adjustment_amount, "Setting adjustment proc maximum to INFINITY results in an unexpected adjustment proc return value.") + TEST_ASSERT_EQUAL(dummy.get_blood_volume(), expected_final_volume, "Setting adjustment proc maximum to INFINITY results in an unexpected final volume.") + + dummy.set_blood_volume(BLOOD_VOLUME_NORMAL) + adjustment_amount = BLOOD_VOLUME_MAXIMUM * -10 + expected_final_volume = dummy.get_blood_volume() + adjustment_amount + + // Test decreasing blood volume below 0 by setting the minimum to -INFINITY. Shouldn't be used, but I want to verify that bypassing the default minimum works as expected. + TEST_ASSERT_EQUAL(dummy.adjust_blood_volume(adjustment_amount, minimum = -INFINITY), adjustment_amount, "Setting adjustment proc minimum to -INFINITY results in an unexpected adjustment proc return value.") + TEST_ASSERT_EQUAL(dummy.get_blood_volume(), expected_final_volume, "Setting adjustment proc minimum to -INFINITY results in an unexpected final volume.") + + dummy.reagents.add_reagent(/datum/reagent/medicine/salglu_solution, 10) + var/datum/reagent/medicine/salglu_solution/saline = dummy.reagents.has_reagent(/datum/reagent/medicine/salglu_solution) + dummy.set_blood_volume(saline.dilution_cap) + + // Test if saline dilutes blood volume beyond the dilution cap. + TEST_ASSERT_EQUAL(dummy.get_blood_volume(apply_modifiers = TRUE), saline.dilution_cap, "Saline goes above or below its dilution cap.") + + dummy.set_blood_volume(BLOOD_VOLUME_BAD) + var/expected_dilution = saline.volume * saline.dilution_per_unit + expected_final_volume = dummy.get_blood_volume() + expected_dilution + + // Test if saline dilutes low blood volume properly. + TEST_ASSERT_EQUAL(dummy.get_blood_volume(apply_modifiers = TRUE), expected_final_volume, "Saline didn't dilute low blood by the expected amount.") + + ADD_TRAIT(dummy, TRAIT_NOBLOOD, TRAIT_GENERIC) + + // Test if adding TRAIT_NOBLOOD works properly. + TEST_ASSERT(!dummy.can_have_blood(), "Adding TRAIT_NOBLOOD didn't make the mob have no blood.") + TEST_ASSERT(!CAN_HAVE_BLOOD(dummy), "Caching of blood volume status is screwed up after the addition of TRAIT_NOBLOOD.") + TEST_ASSERT_EQUAL(dummy.get_blood_volume(), 0, "Blood volume wasn't emptied after the addition of TRAIT_NOBLOOD.") + + REMOVE_TRAIT(dummy, TRAIT_NOBLOOD, TRAIT_GENERIC) + + // Test if removing TRAIT_NOBLOOD works properly. + TEST_ASSERT(dummy.can_have_blood(), "Removing TRAIT_NOBLOOD didn't make the mob have blood again.") + TEST_ASSERT(CAN_HAVE_BLOOD(dummy), "Caching of blood volume status is screwed up after the removal of TRAIT_NOBLOOD.") + TEST_ASSERT_EQUAL(dummy.get_blood_volume(), dummy.default_blood_volume, "Blood volume wasn't fixed after the removal of TRAIT_NOBLOOD.") diff --git a/code/modules/unit_tests/breath.dm b/code/modules/unit_tests/breath.dm index faba1a08e22e..686a9c1a15d9 100644 --- a/code/modules/unit_tests/breath.dm +++ b/code/modules/unit_tests/breath.dm @@ -82,6 +82,7 @@ lab_rat.breathe() TEST_ASSERT(lab_rat.failed_last_breath && lab_rat.has_alert(ALERT_NOT_ENOUGH_PLASMA), "Humans should suffocate from pure n2 tanks") +/* // DARKPACK EDIT REMOVAL - Lavaland (Penumbra) will not have ashwalker breathable air /// Tests to make sure ashwalkers can breathe from the lavaland air. /datum/unit_test/breath/breath_sanity_ashwalker @@ -99,3 +100,4 @@ var/turf/open/to_fill = run_loc_floor_bottom_left to_fill.initial_gas_mix = OPENTURF_DEFAULT_ATMOS return ..() +*/ diff --git a/code/modules/unit_tests/buckle.dm b/code/modules/unit_tests/buckle.dm new file mode 100644 index 000000000000..e25ed9f5306c --- /dev/null +++ b/code/modules/unit_tests/buckle.dm @@ -0,0 +1,36 @@ +/// Test you can buckle yourself to a chair +/datum/unit_test/buckling_self + +/datum/unit_test/buckling_self/Run() + var/mob/living/carbon/human/consistent/dummy = EASY_ALLOCATE() + dummy.mock_client = new() + var/obj/structure/chair/chair = EASY_ALLOCATE() + + var/old_usr = usr + + usr = dummy // mouse drop still uses usr + + dummy.MouseDrop(chair) + if(dummy.buckled != chair) + TEST_FAIL("The dummy failed to buckle themselves to a chair via mouse drop.") + + usr = old_usr + +/// Test you can buckle someone else to a chair +/datum/unit_test/buckling_others + +/datum/unit_test/buckling_others/Run() + var/mob/living/carbon/human/consistent/dummy = EASY_ALLOCATE() + dummy.mock_client = new() + var/mob/living/carbon/human/consistent/victim = EASY_ALLOCATE() + var/obj/structure/chair/chair = EASY_ALLOCATE() + + var/old_usr = usr + + usr = dummy // mouse drop still uses usr + + victim.MouseDrop(chair) + if(victim.buckled != chair) + TEST_FAIL("The dummy failed to buckle the victim to a chair via mouse drop.") + + usr = old_usr diff --git a/code/modules/unit_tests/burning.dm b/code/modules/unit_tests/burning.dm index daf99875f28e..a23d5423c276 100644 --- a/code/modules/unit_tests/burning.dm +++ b/code/modules/unit_tests/burning.dm @@ -10,8 +10,8 @@ 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 + handler.tick_interval = STATUS_EFFECT_AUTO_TICK for(var/i in 1 to 5) - handler.tick_interval = world.time - 1 - handler.process() + handler.process(1) 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/cargo_selling.dm b/code/modules/unit_tests/cargo_selling.dm index 31d90505bdf0..d12c2a80f3db 100644 --- a/code/modules/unit_tests/cargo_selling.dm +++ b/code/modules/unit_tests/cargo_selling.dm @@ -18,6 +18,14 @@ export_types = list(/obj/item/cargo_unit_test_content) /datum/unit_test/cargo_selling/Run() + for(var/datum/export/subtype as anything in valid_subtypesof(/datum/export)) + if(subtype::k_recovery_time < SSprocessing.wait) + TEST_FAIL("[subtype] should have k_recovery time >= [SSprocessing.wait]") + var/datum/export/sell = new subtype + if(!length(sell.export_types)) + TEST_FAIL("[subtype] has no export types") + qdel(sell) + var/obj/item/cargo_unit_test_container/box = allocate(/obj/item/cargo_unit_test_container) var/obj/item/cargo_unit_test_container/box_skip_content = allocate(/obj/item/cargo_unit_test_container) diff --git a/code/modules/unit_tests/changeling.dm b/code/modules/unit_tests/changeling.dm index 27349715afee..6d107a2e6906 100644 --- a/code/modules/unit_tests/changeling.dm +++ b/code/modules/unit_tests/changeling.dm @@ -24,7 +24,7 @@ // 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.") + // DARKPACK EDIT REMOVAL //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[FEATURE_MUTANT_COLOR], ling.dna.features[FEATURE_MUTANT_COLOR], "Victim mcolor did not change on being transformation stung.") // Check they actually look the same @@ -34,7 +34,7 @@ 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.") + // DARKPACK EDIT REMOVAL //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[FEATURE_MUTANT_COLOR], ling.dna.features[FEATURE_MUTANT_COLOR], "Victim mcolor did not reset after transformation sting expired.") diff --git a/code/modules/unit_tests/combat.dm b/code/modules/unit_tests/combat.dm index d645df98cbfd..80ccbaf8dadd 100644 --- a/code/modules/unit_tests/combat.dm +++ b/code/modules/unit_tests/combat.dm @@ -8,7 +8,7 @@ puncher.set_combat_mode(TRUE) victim.attack_hand(puncher, list(RIGHT_CLICK = FALSE)) - TEST_ASSERT(victim.getBruteLoss() > 0, "Victim took no brute damage after being punched") + TEST_ASSERT(victim.get_brute_loss() > 0, "Victim took no brute damage after being punched") /datum/unit_test/harm_melee/Run() var/mob/living/carbon/human/tider = allocate(/mob/living/carbon/human/consistent) @@ -19,7 +19,7 @@ tider.set_combat_mode(TRUE) victim.attackby(toolbox, tider) - TEST_ASSERT(victim.getBruteLoss() > 0, "Victim took no brute damage after being hit by a toolbox") + TEST_ASSERT(victim.get_brute_loss() > 0, "Victim took no brute damage after being hit by a toolbox") /datum/unit_test/harm_different_damage/Run() var/mob/living/carbon/human/attacker = allocate(/mob/living/carbon/human/consistent) @@ -32,8 +32,8 @@ welding_tool.attack_self(attacker) // Turn it on victim.attackby(welding_tool, attacker) - TEST_ASSERT_EQUAL(victim.getBruteLoss(), 0, "Victim took brute damage from a lit welding tool") - TEST_ASSERT(victim.getFireLoss() > 0, "Victim took no burn damage after being hit by a lit welding tool") + TEST_ASSERT_EQUAL(victim.get_brute_loss(), 0, "Victim took brute damage from a lit welding tool") + TEST_ASSERT(victim.get_fire_loss() > 0, "Victim took no burn damage after being hit by a lit welding tool") /datum/unit_test/attack_chain var/attack_hit @@ -108,7 +108,7 @@ ADD_TRAIT(dummy, TRAIT_PERFECT_ATTACKER, TRAIT_SOURCE_UNIT_TESTS) dummy.set_combat_mode(TRUE) dummy.ClickOn(dummy) - TEST_ASSERT_NOTEQUAL(dummy.getBruteLoss(), 0, "Dummy took no brute damage after self-punching") + TEST_ASSERT_NOTEQUAL(dummy.get_brute_loss(), 0, "Dummy took no brute damage after self-punching") /// Tests handcuffed (HANDS_BLOCKED) mobs cannot punch /datum/unit_test/handcuff_punch @@ -120,11 +120,11 @@ ADD_TRAIT(attacker, TRAIT_HANDS_BLOCKED, TRAIT_SOURCE_UNIT_TESTS) attacker.set_combat_mode(TRUE) attacker.ClickOn(victim) - TEST_ASSERT_EQUAL(victim.getBruteLoss(), 0, "Victim took brute damage from being punched by a handcuffed attacker") + TEST_ASSERT_EQUAL(victim.get_brute_loss(), 0, "Victim took brute damage from being punched by a handcuffed attacker") attacker.next_move = -1 attacker.next_click = -1 attacker.ClickOn(attacker) - TEST_ASSERT_EQUAL(attacker.getBruteLoss(), 0, "Attacker took brute damage from self-punching while handcuffed") + TEST_ASSERT_EQUAL(attacker.get_brute_loss(), 0, "Attacker took brute damage from self-punching while handcuffed") /// Tests handcuffed (HANDS_BLOCKED) monkeys can still bite despite being cuffed /datum/unit_test/handcuff_bite @@ -137,4 +137,19 @@ attacker.set_combat_mode(TRUE) attacker.set_species(/datum/species/monkey) attacker.ClickOn(victim) - TEST_ASSERT_NOTEQUAL(victim.getBruteLoss(), 0, "Victim took no brute damage from being bit by a handcuffed monkey, which is incorrect, as it's a bite attack") + TEST_ASSERT_NOTEQUAL(victim.get_brute_loss(), 0, "Victim took no brute damage from being bit by a handcuffed monkey, which is incorrect, as it's a bite attack") + +/// Tests that soundbang_act (and therefore sound_damage) works correctly +/datum/unit_test/soundbang + +/datum/unit_test/soundbang/Run() + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human/consistent) + victim.soundbang_act(intensity = SOUNDBANG_NORMAL, damage_pwr = 10, deafen_pwr = 20 SECONDS) + TEST_ASSERT_EQUAL(victim.get_organ_loss(ORGAN_SLOT_EARS), 10, "victim didn't take the right amount of ears damage") + TEST_ASSERT(HAS_TRAIT_FROM(victim, TRAIT_DEAF, EAR_DAMAGE), "victim wasn't temporarily deafened") + var/obj/item/organ/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS) + ears.adjust_temporary_deafness(-20 SECONDS) + TEST_ASSERT(!HAS_TRAIT_FROM(victim, TRAIT_DEAF, EAR_DAMAGE), "victim hasn't recovered from temprorary deafness") + victim.equip_to_slot_if_possible(new /obj/item/clothing/ears/earmuffs, ITEM_SLOT_EARS) + victim.soundbang_act(intensity = SOUNDBANG_NORMAL, deafen_pwr = 20 SECONDS) + TEST_ASSERT(!HAS_TRAIT_FROM(victim, TRAIT_DEAF, EAR_DAMAGE), "victim has been deafened despite wearing earmuffs") diff --git a/code/modules/unit_tests/combat_blocking.dm b/code/modules/unit_tests/combat_blocking.dm index 45c145070850..17e2da816db4 100644 --- a/code/modules/unit_tests/combat_blocking.dm +++ b/code/modules/unit_tests/combat_blocking.dm @@ -11,7 +11,7 @@ ADD_TRAIT(attacker, TRAIT_PERFECT_ATTACKER, TRAIT_SOURCE_UNIT_TESTS) click_wrapper(attacker, victim) - TEST_ASSERT_EQUAL(victim.getBruteLoss(), 0, "Victim took damage from being punched despite having a 100% block chance chair in their hands.") + TEST_ASSERT_EQUAL(victim.get_brute_loss(), 0, "Victim took damage from being punched despite having a 100% block chance chair in their hands.") /// Test that items can block weapon attacks /datum/unit_test/armed_blocking @@ -26,10 +26,10 @@ ADD_TRAIT(attacker, TRAIT_PERFECT_ATTACKER, TRAIT_SOURCE_UNIT_TESTS) click_wrapper(attacker, victim) - TEST_ASSERT_EQUAL(victim.getBruteLoss(), 0, "Victim took damage from being punched despite having a 100% block chance shield in their hands.") + TEST_ASSERT_EQUAL(victim.get_brute_loss(), 0, "Victim took damage from being punched despite having a 100% block chance shield in their hands.") var/obj/item/storage/toolbox/weapon = EASY_ALLOCATE() attacker.put_in_active_hand(weapon, forced = TRUE) click_wrapper(attacker, victim) - TEST_ASSERT_EQUAL(victim.getBruteLoss(), 0, "Victim took damage from being hit with a weapon despite having a 100% block chance shield in their hands.") + TEST_ASSERT_EQUAL(victim.get_brute_loss(), 0, "Victim took damage from being hit with a weapon despite having a 100% block chance shield in their hands.") diff --git a/code/modules/unit_tests/combat_eyestab.dm b/code/modules/unit_tests/combat_eyestab.dm index bb1126ae40db..d065607bec2b 100644 --- a/code/modules/unit_tests/combat_eyestab.dm +++ b/code/modules/unit_tests/combat_eyestab.dm @@ -11,7 +11,7 @@ attacker.set_combat_mode(TRUE) click_wrapper(attacker, victim) - TEST_ASSERT_NOTEQUAL(victim.getBruteLoss(), 0, "Victim should have taken some brute damage from an eyestab with combat mode on") + TEST_ASSERT_NOTEQUAL(victim.get_brute_loss(), 0, "Victim should have taken some brute damage from an eyestab with combat mode on") var/obj/item/organ/eyes/eyes = victim.get_organ_slot(ORGAN_SLOT_EYES) TEST_ASSERT_NOTEQUAL(eyes.damage, 0, "Victim's eyes should have taken some damage from an eyestab with combat mode on") diff --git a/code/modules/unit_tests/combat_flash.dm b/code/modules/unit_tests/combat_flash.dm index 815be27f486d..b30ea7721601 100644 --- a/code/modules/unit_tests/combat_flash.dm +++ b/code/modules/unit_tests/combat_flash.dm @@ -18,7 +18,7 @@ victim.face_atom(attacker) /datum/unit_test/flash_click/proc/check_results(mob/living/carbon/human/attacker, mob/living/carbon/human/victim) - TEST_ASSERT_NOTEQUAL(victim.getStaminaLoss(), 0, "Victim should have sustained stamina loss from being flashed head-on [apply_verb].") + TEST_ASSERT_NOTEQUAL(victim.get_stamina_loss(), 0, "Victim should have sustained stamina loss from being flashed head-on [apply_verb].") /// Tests that flashes flash on combat mode. /datum/unit_test/flash_click/combat_mode @@ -38,4 +38,4 @@ victim.equip_to_appropriate_slot(glasses) /datum/unit_test/flash_click/flash_protection/check_results(mob/living/carbon/human/attacker, mob/living/carbon/human/victim) - TEST_ASSERT_EQUAL(victim.getStaminaLoss(), 0, "Victim should not have sustained stamina loss from being flashed head-on [apply_verb].") + TEST_ASSERT_EQUAL(victim.get_stamina_loss(), 0, "Victim should not have sustained stamina loss from being flashed head-on [apply_verb].") diff --git a/code/modules/unit_tests/combat_pistol_whip.dm b/code/modules/unit_tests/combat_pistol_whip.dm index cafecd4f59e2..f67a57f9841a 100644 --- a/code/modules/unit_tests/combat_pistol_whip.dm +++ b/code/modules/unit_tests/combat_pistol_whip.dm @@ -18,14 +18,14 @@ // Combat mode in melee range with RMB -> pistol whip attacker.set_combat_mode(TRUE) click_wrapper(attacker, victim, list(RIGHT_CLICK = TRUE, BUTTON = RIGHT_CLICK)) - TEST_ASSERT_NOTEQUAL(victim.getBruteLoss(), 0, "Victim did not take brute damage from being pistol-whipped.") + TEST_ASSERT_NOTEQUAL(victim.get_brute_loss(), 0, "Victim did not take brute damage from being pistol-whipped.") TEST_ASSERT_EQUAL(gun.get_ammo(countchambered = TRUE), expected_ammo, "The gun fired a shot when it was used for a pistol whip.") victim.fully_heal() // Combat mode LMB -> point blank shot attacker.set_combat_mode(TRUE) click_wrapper(attacker, victim) - TEST_ASSERT_NOTEQUAL(victim.getBruteLoss(), 0, "Victim did not take brute damage from being fired upon point-blank.") + TEST_ASSERT_NOTEQUAL(victim.get_brute_loss(), 0, "Victim did not take brute damage from being fired upon point-blank.") TEST_ASSERT(locate(/obj/item/ammo_casing/c9mm) in attacker.loc, "The gun did not eject a casing when it was used for a point-blank shot.") TEST_ASSERT_EQUAL(gun.get_ammo(countchambered = TRUE), expected_ammo - 1, "The gun did not fire a shot when it was used for a point-blank shot.") victim.fully_heal() @@ -36,7 +36,7 @@ attacker.set_combat_mode(TRUE) click_wrapper(attacker, victim, list(RIGHT_CLICK = TRUE, BUTTON = RIGHT_CLICK)) - TEST_ASSERT_NOTEQUAL(victim.getBruteLoss(), 0, "Victim did not take brute damage from being bayonet stabbed.") + TEST_ASSERT_NOTEQUAL(victim.get_brute_loss(), 0, "Victim did not take brute damage from being bayonet stabbed.") victim.fully_heal() /// Test that bayonetted weapons can be used to butcher @@ -57,4 +57,4 @@ butcher.put_in_active_hand(gun, forced = TRUE) click_wrapper(butcher, meat, list(RIGHT_CLICK = TRUE, BUTTON = RIGHT_CLICK)) - TEST_ASSERT(DOING_INTERACTION(butcher, meat), "The butcher did not start butchering the monkey when using a bayonetted weapon.") + TEST_ASSERT(QDELETED(meat), "The butcher did not butchering the monkey when using a bayonetted weapon.") diff --git a/code/modules/unit_tests/combat_stamina.dm b/code/modules/unit_tests/combat_stamina.dm index 7c84f8281aea..d45633f5c338 100644 --- a/code/modules/unit_tests/combat_stamina.dm +++ b/code/modules/unit_tests/combat_stamina.dm @@ -6,9 +6,9 @@ var/mob/living/carbon/human/consistent/tider = allocate(__IMPLIED_TYPE__) tider.stamina_regen_time = 0.2 SECONDS var/stamloss_to_reach_crit_threshold = tider.maxHealth - tider.adjustStaminaLoss(stamloss_to_reach_crit_threshold - 1) + tider.adjust_stamina_loss(stamloss_to_reach_crit_threshold - 1) TEST_ASSERT(!tider.has_status_effect(/datum/status_effect/incapacitating/stamcrit), "Stamcrit should not be applied at [stamloss_to_reach_crit_threshold - 1] stamina damage") - tider.adjustStaminaLoss(1) + tider.adjust_stamina_loss(1) TEST_ASSERT(tider.has_status_effect(/datum/status_effect/incapacitating/stamcrit), "Stamcrit should be applied at [stamloss_to_reach_crit_threshold] stamina damage") sleep(tider.stamina_regen_time * 2) TEST_ASSERT(!tider.has_status_effect(/datum/status_effect/incapacitating/stamcrit), "Stamcrit should be removed after regen time") @@ -20,6 +20,6 @@ /datum/unit_test/stam_regen/Run() var/mob/living/carbon/human/consistent/tider = allocate(__IMPLIED_TYPE__) tider.stamina_regen_time = 0.2 SECONDS - tider.adjustStaminaLoss(50) + tider.adjust_stamina_loss(50) sleep(tider.stamina_regen_time * 2) - TEST_ASSERT_EQUAL(tider.getStaminaLoss(), 0, "Stamina should be fully regenerated after regen time") + TEST_ASSERT_EQUAL(tider.get_stamina_loss(), 0, "Stamina should be fully regenerated after regen time") diff --git a/code/modules/unit_tests/combat_welder.dm b/code/modules/unit_tests/combat_welder.dm index b44022fe0499..764eb9e2216f 100644 --- a/code/modules/unit_tests/combat_welder.dm +++ b/code/modules/unit_tests/combat_welder.dm @@ -10,7 +10,7 @@ weapon.attack_self(tider) weapon.melee_attack_chain(tider, victim) - TEST_ASSERT_NOTEQUAL(victim.getFireLoss(), 0, "Victim did not get burned by welder.") + TEST_ASSERT_NOTEQUAL(victim.get_fire_loss(), 0, "Victim did not get burned by welder.") TEST_ASSERT_EQUAL(weapon.get_fuel(), weapon.max_fuel - 1, "Welder did not consume fuel on attacking a mob") var/obj/structure/blob/blobby = EASY_ALLOCATE() diff --git a/code/modules/unit_tests/crafting.dm b/code/modules/unit_tests/crafting.dm index ed4ee4f631c8..d6da10b732c6 100644 --- a/code/modules/unit_tests/crafting.dm +++ b/code/modules/unit_tests/crafting.dm @@ -1,34 +1,37 @@ /** * Check if a generic atom (because both mobs and the crafter machinery can do it) can potentially craft all recipes, - * with the exact same types required in the recipe, and also compare the materials of crafted result with one of the same type - * to ansure they match if the recipe has the CRAFT_ENFORCE_MATERIALS_PARITY flag. + * with the exact same types required in the recipe. + * Then, unless the recipe has the CRAFT_SKIP_MATERIALS_PARITY flag, compare the materials of the + * crafted result with a spawned instance of the same type to ensure that they match. */ /datum/unit_test/crafting + //The object responsible for using the crafting component + var/atom/movable/crafter + //The reagent holder responsible for holding reagents that may be used in a recipe. + var/obj/item/reagent_containers/cup/bottomless_cup + ///The tools that have been spawned so far, to be reused in other recipes as well. + var/list/tools = list() /datum/unit_test/crafting/Run() - var/atom/movable/crafter = allocate(__IMPLIED_TYPE__) + crafter = allocate(__IMPLIED_TYPE__) - ///Clear the area around our crafting movable of objects that may mess with the unit test - for(var/atom/movable/trash in (range(1, crafter) - crafter)) - qdel(trash) + clear_trash() var/turf/turf = crafter.loc var/old_turf_type = turf.type var/datum/component/personal_crafting/unit_test/craft_comp = crafter.AddComponent(__IMPLIED_TYPE__) - var/obj/item/reagent_containers/cup/bottomless_cup = allocate_bottomless_cup() - - var/list/tools = list() + bottomless_cup = allocate_bottomless_cup() var/list/all_recipes = GLOB.crafting_recipes + GLOB.cooking_recipes for(var/datum/crafting_recipe/recipe as anything in all_recipes) if(recipe.non_craftable) continue //split into a different proc, so if something fails it's both easier to track and doesn't halt the loop. - process_recipe(crafter, craft_comp, recipe, bottomless_cup, tools) + process_recipe(craft_comp, recipe) if(QDELETED(bottomless_cup) || bottomless_cup.loc != turf) //The cup itself was used in a recipe, rather than its contents. bottomless_cup = allocate_bottomless_cup() - // We have one or two recipes that generate turf (from stacks, like snow walls), which shouldn't be carried between tests + // We have one or two recipes that generate turfs (from stacks, like snow walls), which shouldn't be carried between tests if(turf.type != old_turf_type) turf.ChangeTurf(old_turf_type) @@ -39,16 +42,8 @@ bottomless_cup.reagents.maximum_volume = INFINITY return bottomless_cup -/datum/unit_test/crafting/proc/process_recipe( - atom/crafter, - datum/component/personal_crafting/unit_test/craft_comp, - datum/crafting_recipe/recipe, - obj/item/reagent_containers/bottomless_cup, - list/tools -) +/datum/unit_test/crafting/proc/process_recipe(datum/component/personal_crafting/unit_test/craft_comp, datum/crafting_recipe/recipe) var/turf/turf = crafter.loc - //Components that have to be deleted later so they don't mess up with other recipes - var/list/spawned_components = list() //Warn if uncreatables were found in the recipe if it fails //If it doesn't fail, then it was already handled, maybe through `unit_test_spawn_extras` var/list/uncreatables_found @@ -56,10 +51,10 @@ for(var/spawn_path in recipe.unit_test_spawn_extras) var/amount = recipe.unit_test_spawn_extras[spawn_path] if(ispath(spawn_path, /obj/item/stack)) - spawned_components += new spawn_path(turf, /*new_amount =*/ amount, /*merge =*/ FALSE) + new spawn_path(turf, /*new_amount =*/ amount, /*merge =*/ FALSE) continue for(var/index in 1 to amount) - spawned_components += new spawn_path(turf) + new spawn_path(turf) for(var/req_path in recipe.reqs) //spawn items and reagents var/amount = recipe.reqs[req_path] @@ -74,12 +69,12 @@ continue if(ispath(req_path, /obj/item/stack)) //it's a stack - spawned_components += new req_path(turf, /*new_amount =*/ amount, /*merge =*/ FALSE) + new req_path(turf, /*new_amount =*/ amount, /*merge =*/ FALSE) continue //it's any other item for(var/iteration in 1 to amount) - spawned_components += new req_path(turf) + new req_path(turf) for(var/req_path in recipe.chem_catalysts) // spawn catalysts var/amount = recipe.chem_catalysts[req_path] @@ -93,7 +88,7 @@ if(req_path in uncreatables) LAZYADD(uncreatables_found, req_path) continue - spawned_components += new req_path(turf) + new req_path(turf) var/list/needed_tools = list() needed_tools += recipe.tool_behaviors + recipe.tool_paths //either tool_behaviors and tool_paths could be null @@ -124,48 +119,63 @@ if(istext(result) || isnull(result)) //construct_item() returned a text string telling us why it failed. TEST_FAIL("[recipe.type] couldn't be crafted during unit test[result || ", result is null for some reason!"]") if(uncreatables_found) - TEST_FAIL("The following objects that shouldn't initialize during unit tests were found in [recipe]: [english_list(uncreatables_found)]") - delete_components(spawned_components) + TEST_FAIL("The following objects that shouldn't be instantiated during unit tests were found in [recipe]: [english_list(uncreatables_found)]") + clear_trash() return - //enforcing materials parity between crafted and spawned for turfs would be more trouble than worth right now - if(isturf(result)) - delete_components(spawned_components) + //enforcing materials parity between crafted and spawned for turfs would be more trouble than worth here + if((recipe.crafting_flags & (CRAFT_NO_MATERIALS|CRAFT_SKIP_MATERIALS_PARITY)) || isturf(result)) + clear_trash() return - spawned_components += result + var/atom/copycat + if(isstack(result)) + var/obj/item/stack/stack_result = result + copycat = new result.type(turf, /*new_amount =*/ stack_result.amount, /*merge =*/ FALSE) + else + copycat = new result.type(turf) - if(!(recipe.crafting_flags & CRAFT_ENFORCE_MATERIALS_PARITY)) - delete_components(spawned_components) - return - - var/atom/copycat = new result.type(turf) - spawned_components += copycat - - // SSmaterials caches the combinations so we don't have to run more complex checks - if(result.custom_materials == copycat.custom_materials) - delete_components(spawned_components) - return if(!result.compare_materials(copycat)) - var/warning = "custom_materials of [result.type] when crafted compared to just spawned don't match" - var/what_it_should_be = result.get_materials_english_list() + var/mats_varname = NAMEOF(result, custom_materials) + + var/warning = "[mats_varname] of [result.type] when crafted compared to only spawned don't match" + + ///Added right between the first half of the warning and the second half. + var/other_info = "" + + var/target_var = mats_varname + var/list/result_mats = result.custom_materials + var/list/copycat_mats = copycat.custom_materials + if(isstack(result)) + var/obj/item/stack/stack_result = result + var/obj/item/stack/stack_copy = copycat + target_var = NAMEOF(stack_result, mats_per_unit) + result_mats = stack_result.mats_per_unit + copycat_mats = stack_copy.mats_per_unit + other_info = " (size of resulting stack: [stack_result.amount])" + var/what_it_should_be = result.transcribe_materials_list(result_mats) + var/what_it_is = copycat.transcribe_materials_list(copycat_mats) //compose a text string containing the syntax and paths to use for editing the custom_materials var if(result.custom_materials) - what_it_should_be += " (you can round values a bit)" - TEST_FAIL("[warning]. custom_materials should be [what_it_should_be]. \ - Otherwise set the requirements_mats_blacklist variable for [recipe] \ - or remove the CRAFT_ENFORCE_MATERIALS_PARITY crafting flag from it") + what_it_should_be += " (you can round a bit for values above 100)" - delete_components(spawned_components) + ///This tells you about other ways to deal with the issue, if you can't just change the materials of the object. For example, if there are two different recipes for it. + var/add_info = "" -/** - * Clear the area of the components that have been spawned as either the requirements of a recipe or its result - * so they don't mess up with recipes that come after it. - */ -/datum/unit_test/crafting/proc/delete_components(list/comps) - for(var/atom/movable/used as anything in comps) - if(!QDELETED(used)) - qdel(used) + if(istype(recipe, /datum/crafting_recipe/stack)) + add_info = "add the CRAFT_SKIP_MATERIALS_PARITY crafting flag to its stack_recipe datum" + else + add_info = "set the [NAMEOF(recipe, requirements_mats_blacklist)] or [NAMEOF(recipe, removed_mats)] var of [recipe.type], or add the CRAFT_SKIP_MATERIALS_PARITY crafting flag to it" + + TEST_FAIL("[warning]. should be: [target_var] = [what_it_should_be] (current value: [what_it_is])[other_info]. \ + Fix that. Otherwise, [add_info]") + + clear_trash() + +///Clear the area around our crafting movable of objects that may mess with the unit test +/datum/unit_test/crafting/proc/clear_trash() + for(var/atom/movable/trash in (range(1, crafter) - list(crafter, bottomless_cup))) + qdel(trash) /datum/component/personal_crafting/unit_test ignored_flags = CRAFT_MUST_BE_LEARNED|CRAFT_ONE_PER_TURF|CRAFT_CHECK_DIRECTION|CRAFT_CHECK_DENSITY|CRAFT_ON_SOLID_GROUND|CRAFT_IGNORE_DO_AFTER diff --git a/code/modules/unit_tests/death_moodlets.dm b/code/modules/unit_tests/death_moodlets.dm new file mode 100644 index 000000000000..ded468abbb1d --- /dev/null +++ b/code/modules/unit_tests/death_moodlets.dm @@ -0,0 +1,104 @@ +/// Tests death moodlets given various traits and personalities +/datum/unit_test/death_moodlets + abstract_type = /datum/unit_test/death_moodlets + /// What moodlet type we expect the test to give + var/desired_moodlet = /datum/mood_event/conditional/see_death + +/datum/unit_test/death_moodlets/Run() + var/mob/living/carbon/human/consistent/dummy = allocate(__IMPLIED_TYPE__) + prepare_dummy(dummy) + + var/mob/living/dying = get_dying_mob() + prepare_dying_mob(dying) + dying.death() + + var/datum/mood_event/moodlet = dummy.mob_mood.mood_events["saw_death"] + TEST_ASSERT_EQUAL(moodlet?.type, desired_moodlet, "Dummy did not receive the correct moodlet upon witnessing a death.") + +/// Override to prepare the dummy as needed +/datum/unit_test/death_moodlets/proc/prepare_dummy(mob/living/carbon/human/consistent/dummy) + return + +/// Override to provide the mob that will die +/datum/unit_test/death_moodlets/proc/get_dying_mob() + return allocate(/mob/living/carbon/human/consistent) + +/// Override to prepare the dying mob as needed +/datum/unit_test/death_moodlets/proc/prepare_dying_mob(mob/living/dying) + return + +/// Base type for human death moodlets +/datum/unit_test/death_moodlets/human + abstract_type = /datum/unit_test/death_moodlets/human + +/// Base type for pet death moodlets +/datum/unit_test/death_moodlets/pet + abstract_type = /datum/unit_test/death_moodlets/pet + +/datum/unit_test/death_moodlets/pet/get_dying_mob() + return allocate(/mob/living/basic/pet/cat/_proc) + +/// Test the normal ol default moodlet +/datum/unit_test/death_moodlets/human/normal + desired_moodlet = /datum/mood_event/conditional/see_death + +/// Test desensitized moodlet +/datum/unit_test/death_moodlets/human/desensitized + desired_moodlet = /datum/mood_event/conditional/see_death/desensitized + +/datum/unit_test/death_moodlets/human/desensitized/prepare_dummy(mob/living/carbon/human/consistent/dummy) + ADD_TRAIT(dummy, TRAIT_DESENSITIZED, TRAIT_SOURCE_UNIT_TESTS) + +/// Test callous moodlet +/datum/unit_test/death_moodlets/human/callous + desired_moodlet = /datum/mood_event/conditional/see_death/dontcare + +/datum/unit_test/death_moodlets/human/callous/prepare_dummy(mob/living/carbon/human/consistent/dummy) + dummy.add_personality(/datum/personality/callous) + +/// Tests that callous is prioritized over desensitized +/datum/unit_test/death_moodlets/human/desensitized_and_callous + desired_moodlet = /datum/mood_event/conditional/see_death/dontcare + +/datum/unit_test/death_moodlets/human/desensitized_and_callous/prepare_dummy(mob/living/carbon/human/consistent/dummy) + ADD_TRAIT(dummy, TRAIT_DESENSITIZED, TRAIT_SOURCE_UNIT_TESTS) + dummy.add_personality(/datum/personality/callous) + +/// Test cultist positive moodlet +/datum/unit_test/death_moodlets/human/cultist + desired_moodlet = /datum/mood_event/conditional/see_death/cult + +/datum/unit_test/death_moodlets/human/cultist/prepare_dummy(mob/living/carbon/human/consistent/dummy) + ADD_TRAIT(dummy, TRAIT_CULT_HALO, TRAIT_SOURCE_UNIT_TESTS) + +/// Tests cultists are still sad when other cultists die +/datum/unit_test/death_moodlets/human/cultist/friendly_fire + desired_moodlet = /datum/mood_event/conditional/see_death + +/datum/unit_test/death_moodlets/human/cultist/friendly_fire/prepare_dying_mob(mob/living/dying) + ADD_TRAIT(dying, TRAIT_CULT_HALO, TRAIT_SOURCE_UNIT_TESTS) + +/// Tests animal moodlet +/datum/unit_test/death_moodlets/pet/animal_moodlet + desired_moodlet = /datum/mood_event/conditional/see_death/pet + +/// Tests desensitized moodlet when a pet dies +/datum/unit_test/death_moodlets/pet/desensitized_to_pet + desired_moodlet = /datum/mood_event/conditional/see_death/pet + +/datum/unit_test/death_moodlets/pet/desensitized_to_pet/prepare_dummy(mob/living/carbon/human/consistent/dummy) + ADD_TRAIT(dummy, TRAIT_DESENSITIZED, TRAIT_SOURCE_UNIT_TESTS) + +/// Tests callous moodlet when a pet dies +/datum/unit_test/death_moodlets/pet/callous_to_pet + desired_moodlet = /datum/mood_event/conditional/see_death/dontcare + +/datum/unit_test/death_moodlets/pet/callous_to_pet/prepare_dummy(mob/living/carbon/human/consistent/dummy) + dummy.add_personality(/datum/personality/callous) + +/// Tests animal disliker moodlet when a pet dies +/datum/unit_test/death_moodlets/pet/animal_disliker_to_pet + desired_moodlet = /datum/mood_event/conditional/see_death/dontcare + +/datum/unit_test/death_moodlets/pet/animal_disliker_to_pet/prepare_dummy(mob/living/carbon/human/consistent/dummy) + dummy.add_personality(/datum/personality/animal_disliker) diff --git a/code/modules/unit_tests/designs.dm b/code/modules/unit_tests/designs.dm index 855dd19cf37b..a9b293ed24ad 100644 --- a/code/modules/unit_tests/designs.dm +++ b/code/modules/unit_tests/designs.dm @@ -3,11 +3,8 @@ /datum/unit_test/designs/Run() //Can't use allocate because of bug with certain datums var/datum/design/default_design = new /datum/design() - var/datum/design/surgery/default_design_surgery = new /datum/design/surgery() - for(var/path in subtypesof(/datum/design)) - if (ispath(path, /datum/design/surgery)) //We are checking surgery design separatly later since they work differently - continue + for(var/path in subtypesof(/datum/design) - typesof(/datum/design/surgery)) //We are checking surgery design separatly later since they work differently var/datum/design/current_design = new path //Create an instance of each design if (current_design.id == DESIGN_ID_IGNORE) //Don't check designs with ignore ID continue @@ -21,33 +18,30 @@ if (length(current_design.reagents_list) && !(current_design.build_type & LIMBGROWER)) TEST_FAIL("Design [current_design.type] requires reagents but isn't a limb grower design. Reagent costs are only supported by limb grower designs") - for(var/path in subtypesof(/datum/design/surgery)) - var/datum/design/surgery/current_design = new path //Create an instance of each design - if (isnull(current_design.id) || current_design.id == default_design_surgery.id) //Check if ID was not set - TEST_FAIL("Surgery Design [current_design.type] has no ID set") - if (isnull(current_design.id) || current_design.name == default_design_surgery.name) //Check if name was not set - TEST_FAIL("Surgery Design [current_design.type] has default or null name var") - if (isnull(current_design.desc) || current_design.desc == default_design_surgery.desc) //Check if desc was not set - TEST_FAIL("Surgery Design [current_design.type] has default or null desc var") - if (isnull(current_design.surgery) || current_design.surgery == default_design_surgery.surgery) //Check if surgery was not set - TEST_FAIL("Surgery Design [current_design.type] has default or null surgery var") + for(var/datum/design/surgery/path as anything in subtypesof(/datum/design/surgery)) + if (path::id == DESIGN_ID_IGNORE) + TEST_FAIL("Surgery Design [path] has no ID set") + if (isnull(path::surgery)) + TEST_FAIL("Surgery Design [path] has null surgery var") + continue + if (isnull(path::name) && isnull(path::surgery::rnd_name) && isnull(path::surgery::name)) + TEST_FAIL("Surgery Design [path] has no name set or inferable from surgery type") + if (isnull(path::desc) && isnull(path::surgery::rnd_desc) && isnull(path::surgery::desc)) + TEST_FAIL("Surgery Design [path] has no desc set or inferable from surgery type") /datum/unit_test/design_source /datum/unit_test/design_source/Run() var/list/all_designs = list() - var/list/exceptions = list( - /datum/design/surgery/healing, // Ignored due to the above test - ) for (var/datum/design/design as anything in subtypesof(/datum/design)) - var/design_id = design::id - if (design_id == DESIGN_ID_IGNORE || (design in exceptions)) + design = new design() + if (design.id == DESIGN_ID_IGNORE) continue - if (design_id in all_designs) - TEST_FAIL("Design [design] shares an ID \"[design_id]\" with another design") + if (design.id in all_designs) + TEST_FAIL("Design [design.type] shares an ID \"[design.id]\" with another design") continue - all_designs[design_id] = design + all_designs[design.id] = design.type for (var/datum/techweb_node/node as anything in subtypesof(/datum/techweb_node)) node = new node() diff --git a/code/modules/unit_tests/dna_infusion.dm b/code/modules/unit_tests/dna_infusion.dm index e7b6f1821468..4abe0e16e547 100644 --- a/code/modules/unit_tests/dna_infusion.dm +++ b/code/modules/unit_tests/dna_infusion.dm @@ -2,7 +2,7 @@ /datum/unit_test/valid_dna_infusion /datum/unit_test/valid_dna_infusion/Run() - for(var/datum/infuser_entry/infuser_entry as anything in flatten_list(GLOB.infuser_entries)) + for(var/datum/infuser_entry/infuser_entry as anything in assoc_to_values(GLOB.infuser_entries)) for(var/input_type in infuser_entry.input_obj_or_mob) if(ispath(input_type, /mob/living)) continue @@ -35,7 +35,7 @@ /datum/infuser_entry/fly, )) // Fetch the globally instantiated DNA Infuser entries. - for(var/datum/infuser_entry/infuser_entry as anything in flatten_list(GLOB.infuser_entries)) + for(var/datum/infuser_entry/infuser_entry as anything in assoc_to_values(GLOB.infuser_entries)) var/output_organs = infuser_entry.output_organs var/mob/living/carbon/human/lab_rat = allocate(/mob/living/carbon/human/consistent) var/list/obj/item/organ/inserted_organs = list() diff --git a/code/modules/unit_tests/dynamic_ruleset_sanity.dm b/code/modules/unit_tests/dynamic_ruleset_sanity.dm index b42b34f99df3..a639fb0f837b 100644 --- a/code/modules/unit_tests/dynamic_ruleset_sanity.dm +++ b/code/modules/unit_tests/dynamic_ruleset_sanity.dm @@ -30,7 +30,8 @@ continue if (antag_flag in known_antag_flags) - TEST_FAIL("[ruleset] has a non-unique antag_flag [antag_flag] (used by [known_antag_flags[antag_flag]])!") + if(!(initial(ruleset.ruleset_flags) & RULESET_VARIATION)) + TEST_FAIL("[ruleset] has a non-unique antag_flag [antag_flag] (used by [known_antag_flags[antag_flag]])!") continue known_antag_flags[antag_flag] = ruleset diff --git a/code/modules/unit_tests/emoting.dm b/code/modules/unit_tests/emoting.dm index 2b24d33e9e65..5300f667b3e4 100644 --- a/code/modules/unit_tests/emoting.dm +++ b/code/modules/unit_tests/emoting.dm @@ -12,7 +12,7 @@ human.say("*beep") TEST_ASSERT_EQUAL(emotes_used, 1, "Human beeped, when that should be restricted to silicons") - human.setOxyLoss(140) + human.set_oxy_loss(140) TEST_ASSERT(human.stat != CONSCIOUS, "Human is somehow conscious after receiving suffocation damage") diff --git a/code/modules/unit_tests/explosion_action.dm b/code/modules/unit_tests/explosion_action.dm index 6af3bc466f74..6e9abb3c2dc9 100644 --- a/code/modules/unit_tests/explosion_action.dm +++ b/code/modules/unit_tests/explosion_action.dm @@ -205,6 +205,6 @@ /// Proc to lessen the amount of copypasta we do for the alien tests, simply sets the rolling vars we have. /datum/unit_test/explosion_action/proc/read_alien_damages(mob/living/carbon/alien/subject) - alien_brute_loss = subject.getBruteLoss() - alien_burn_loss = subject.getFireLoss() + alien_brute_loss = subject.get_brute_loss() + alien_burn_loss = subject.get_fire_loss() alien_ear_damage = subject.get_organ_loss(ORGAN_SLOT_EARS) diff --git a/code/modules/unit_tests/fish_unit_tests.dm b/code/modules/unit_tests/fish_unit_tests.dm index d42c2e8c81fb..b8fb27ab1bbe 100644 --- a/code/modules/unit_tests/fish_unit_tests.dm +++ b/code/modules/unit_tests/fish_unit_tests.dm @@ -5,7 +5,7 @@ /datum/unit_test/fish_aquarium_icons /datum/unit_test/fish_aquarium_icons/Run() - for(var/obj/item/fish/fish as anything in subtypesof(/obj/item/fish)) + for(var/obj/item/fish/fish as anything in valid_subtypesof(/obj/item/fish)) // DARKPACK EDIT CHANGE - FISHING if(ispath(fish, /obj/item/fish/testdummy)) //We don't care about unit test fish. continue var/init_icon = fish::dedicated_in_aquarium_icon @@ -113,7 +113,7 @@ /datum/unit_test/fish_scanning/Run() var/scannable_fishes = 0 - for(var/obj/item/fish/fish_prototype as anything in subtypesof(/obj/item/fish)) + for(var/obj/item/fish/fish_prototype as anything in valid_subtypesof(/obj/item/fish)) // DARKPACK EDIT CHANGE - FISHING if(initial(fish_prototype.fish_flags) & FISH_FLAG_EXPERIMENT_SCANNABLE) scannable_fishes++ for(var/datum/experiment/scanning/fish/fish_scan as anything in typesof(/datum/experiment/scanning/fish)) @@ -124,7 +124,6 @@ ///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 @@ -133,7 +132,12 @@ breeding_timeout = 0 fish_flags = parent_type::fish_flags & ~(FISH_FLAG_SHOW_IN_CATALOG|FISH_FLAG_EXPERIMENT_SCANNABLE) fish_id_redirect_path = /obj/item/fish/goldfish //Stops SSfishing from complaining - var/expected_num_fillets = 0 //used to know how many fillets should be gotten out of this fish + + ///used to know how many fillets should be gotten out of this fish + var/expected_num_fillets = 0 + +/obj/item/fish/testdummy/fish_grind_results() + return null /obj/item/fish/testdummy/small // The parent type is too big to reproduce inside the more compact fish tank @@ -449,7 +453,7 @@ /datum/fish_source/unit_test_all_fish /datum/fish_source/unit_test_all_fish/New() - for(var/fish_type in subtypesof(/obj/item/fish)) + for(var/fish_type in valid_subtypesof(/obj/item/fish)) // DARKPACK EDIT CHANGE - FISHING fish_table[fish_type] = 10 return ..() diff --git a/code/modules/unit_tests/flyperson.dm b/code/modules/unit_tests/flyperson.dm new file mode 100644 index 000000000000..4625e9893867 --- /dev/null +++ b/code/modules/unit_tests/flyperson.dm @@ -0,0 +1,14 @@ +/// Test that flypeople can get nutriment from vomit decals +/datum/unit_test/flyperson + +/datum/unit_test/flyperson/Run() + var/mob/living/carbon/human/consistent/fly = allocate(__IMPLIED_TYPE__) + fly.set_species(/datum/species/fly) + + var/obj/effect/decal/cleanable/vomit/gross = allocate(__IMPLIED_TYPE__) + gross.create_reagents(10) + gross.reagents.add_reagent(/datum/reagent/consumable/nutriment, 10) + click_wrapper(fly, gross) + + TEST_ASSERT(QDELETED(gross), "The vomit was not deleted by the flyperson") + TEST_ASSERT(fly.has_reagent(/datum/reagent/consumable/nutriment, 10), "The flyperson did not gain the reagents present in the vomit") diff --git a/code/modules/unit_tests/focus_only_tests.dm b/code/modules/unit_tests/focus_only_tests.dm index 28caadc58ef5..3a8ca6ca381d 100644 --- a/code/modules/unit_tests/focus_only_tests.dm +++ b/code/modules/unit_tests/focus_only_tests.dm @@ -12,6 +12,9 @@ /// Checks that every overlay passed into build_appearance_list exists in the icon /datum/unit_test/focus_only/invalid_overlays +/// Checks that every screen alert with an overlay icon state is valid +/datum/unit_test/focus_only/screen_alert_overlay + /// Checks that every icon sent to the research_designs spritesheet is valid /datum/unit_test/focus_only/invalid_research_designs @@ -30,6 +33,9 @@ /// Checks that nightvision eyes have a full set of color lists /datum/unit_test/focus_only/nightvision_color_cutoffs +/// Ensures that items that got the nullrod_core element with the chaptain_spawnable arg can be selected by the chaplain +/datum/unit_test/focus_only/nullrod_variants + /// Checks that no light shares a tile/pixel offsets with another /datum/unit_test/focus_only/stacked_lights @@ -45,6 +51,13 @@ /// Checks that the contents of the fish_counts list are also present in fish_table /datum/unit_test/focus_only/fish_sources_tables +/** + * This will tell us if we forgot to properly set the stable population for any fish. + * Fish with a stable population of one or less need to have either the mateless or crossbreeder trait, or be compatible with + * other fish types with a higher stable population. + */ +/datum/unit_test/focus_only/fish_population + /// Checks that maploaded mobs with either the `atmos_requirements` or `body_temp_sensitive` /datum/unit_test/focus_only/atmos_and_temp_requirements @@ -62,3 +75,6 @@ ///Checks that items have roughly the same materials whenever spawned via processing/microwaving/baking etc. or any other mean. /datum/unit_test/focus_only/check_materials_when_processed + +///Checks if an map loaded object found an valid support atom to hang on +/datum/unit_test/focus_only/atom_mounted diff --git a/code/modules/unit_tests/full_heal.dm b/code/modules/unit_tests/full_heal.dm index bf1abab097fa..c7e463a1ed5a 100644 --- a/code/modules/unit_tests/full_heal.dm +++ b/code/modules/unit_tests/full_heal.dm @@ -46,17 +46,17 @@ dummy.apply_damages(brute = 10, burn = 10, tox = 10, oxy = 10, stamina = 10, aggravated = 10) // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE dummy.fully_heal(HEAL_DAMAGE) - if(dummy.getBruteLoss()) + if(dummy.get_brute_loss()) TEST_FAIL("The dummy still had brute damage after a fully heal!") - if(dummy.getFireLoss()) + if(dummy.get_fire_loss()) TEST_FAIL("The dummy still had burn damage after a fully heal!") - if(dummy.getToxLoss()) + if(dummy.get_tox_loss()) TEST_FAIL("The dummy still had toxins damage after a fully heal!") - if(dummy.getOxyLoss()) + if(dummy.get_oxy_loss()) TEST_FAIL("The dummy still had oxy damage after a fully heal!") - if(dummy.getStaminaLoss()) + if(dummy.get_stamina_loss()) TEST_FAIL("The dummy still had stamina damage after a fully heal!") // DARKPACK EDIT ADD START - AGGRAVATED_DAMAGE - if(dummy.getAggLoss()) + if(dummy.get_agg_loss()) TEST_FAIL("The dummy still had aggravated damage after a fully heal!") // DARKPACK EDIT ADD END diff --git a/code/modules/unit_tests/get_turf_pixel.dm b/code/modules/unit_tests/get_turf_pixel.dm index 8cd292d3b6c0..15628f009fa4 100644 --- a/code/modules/unit_tests/get_turf_pixel.dm +++ b/code/modules/unit_tests/get_turf_pixel.dm @@ -1,8 +1,8 @@ ///ensures that get_turf_pixel() returns turfs within the bounds of the map, ///even when called on a movable with its sprite out of bounds -/datum/unit_test/get_turf_pixel +/datum/unit_test/maptest_get_turf_pixel -/datum/unit_test/get_turf_pixel/Run() +/datum/unit_test/maptest_get_turf_pixel/Run() //we need long larry to peek over the top edge of the earth var/turf/north = locate(1, world.maxy, run_loc_floor_bottom_left.z) diff --git a/code/modules/unit_tests/hallucination_icons.dm b/code/modules/unit_tests/hallucination_icons.dm index c9f9cf8237c0..d75022a14d9b 100644 --- a/code/modules/unit_tests/hallucination_icons.dm +++ b/code/modules/unit_tests/hallucination_icons.dm @@ -68,6 +68,12 @@ var/ice_hallucination_icon_state = initial(ice_hallucination.ice_icon_state) check_hallucination_icon(ice_hallucination, ice_hallucination_icon, ice_hallucination_icon_state) + // Test malf_apc hallucination for if the hacked apc icon state exists + var/datum/hallucination/malf_apc/malf_apc_hallucination = /datum/hallucination/malf_apc + var/malf_apc_icon = initial(malf_apc_hallucination.apc_icon) + var/malf_apc_icon_state = initial(malf_apc_hallucination.apc_icon_state) + check_hallucination_icon(malf_apc_hallucination, malf_apc_icon, malf_apc_icon_state) + /datum/unit_test/hallucination_icons/proc/check_hallucination_icon(hallucination, icon, icon_state) if(!icon) TEST_FAIL("Hallucination [hallucination] forgot to set its icon file.") diff --git a/code/modules/unit_tests/held_slowdown.dm b/code/modules/unit_tests/held_slowdown.dm new file mode 100644 index 000000000000..0dbacd512462 --- /dev/null +++ b/code/modules/unit_tests/held_slowdown.dm @@ -0,0 +1,11 @@ +/// Tests SLOWS_WHILE_IN_HAND +/datum/unit_test/held_slowdown + +/datum/unit_test/held_slowdown/Run() + var/mob/living/carbon/human/consistent/dummy = EASY_ALLOCATE() + var/obj/item/restraints/legcuffs/bola/bola = EASY_ALLOCATE() + dummy.put_in_hands(bola) + TEST_ASSERT(!(bola in dummy.get_equipped_speed_mod_items()), "Bola slows while held, when it shouldn't.") + + bola.item_flags |= SLOWS_WHILE_IN_HAND + TEST_ASSERT((bola in dummy.get_equipped_speed_mod_items()), "Bola should slow while held now that it has the SLOWS_WHILE_IN_HAND flag.") diff --git a/code/modules/unit_tests/heretic_knowledge.dm b/code/modules/unit_tests/heretic_knowledge.dm index 4154e50285ef..134835a61693 100644 --- a/code/modules/unit_tests/heretic_knowledge.dm +++ b/code/modules/unit_tests/heretic_knowledge.dm @@ -7,40 +7,90 @@ /datum/unit_test/heretic_knowledge /datum/unit_test/heretic_knowledge/Run() - if(!GLOB.heretic_research_tree) - GLOB.heretic_research_tree = generate_heretic_research_tree() - // First, we get a list of all knowledge types - // EXCLUDING all abstract types + GLOB.heretic_path_knowledges = generate_global_heretic_tree() + + + var/list/start_knowledges = list() + generate_heretic_starting_knowledge(start_knowledges) + start_knowledges = flatten_list(start_knowledges) + var/list/all_knowledges = start_knowledges + + // we need to generate a set of shop_knowledges and drafted knowledges as they're unique per path and slightly random in drafted knowledges + for(var/path in GLOB.heretic_path_knowledges) + var/list/tree = GLOB.heretic_path_knowledges[path] + var/list/shop = list() + var/list/draft = list() + determine_drafted_knowledge(path, tree, shop, draft) + all_knowledges += flatten_list(tree) + all_knowledges += flatten_list(shop) + all_knowledges += flatten_list(draft) + + var/list/all_possible_knowledge = typesof(/datum/heretic_knowledge) + for(var/datum/heretic_knowledge/knowledge_type as anything in all_possible_knowledge) if(initial(knowledge_type.abstract_parent_type) == knowledge_type) all_possible_knowledge -= knowledge_type + var/list/list_to_check = get_knowledge_unlockables(start_knowledges, all_knowledges) + + // We now have a list that SHOULD contain all knowledges with a path set (list_to_check). + // Let's compare it to our original list (all_possible_knowledge). If they're not identical, + // then somewhere we missed a knowledge somewhere, and should throw a fail. + var/list/unreachables = list() + for(var/knowledge_path in all_possible_knowledge) + var/found = FALSE + for(var/list/knowledge_node as anything in list_to_check) + var/type = knowledge_node["type"] + if(type == knowledge_path) + found = TRUE + break + if(!found) + unreachables += knowledge_path + // Unreachables is a list of typepaths - all paths that cannot be obtained. + for(var/datum/heretic_knowledge/lost_knowledge as anything in unreachables) + 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'.") + +/// Expects a flat list of knowledge nodes. Returns a list of all HKT_ID entries +/datum/unit_test/heretic_knowledge/proc/get_knowledge_ids(list/knowledges) + var/list/ids = list() + for(var/list/knowledge_node as anything in knowledges) + ids += knowledge_node[HKT_ID] + return ids + +/// Gets all unique HKT_NEXT entries from a list of knowledges. both lists must be flat lists of knowledge nodes +/datum/unit_test/heretic_knowledge/proc/get_knowledge_unlockables(list/starting_point, list/all_knowledges) // Now, let's build a list of all researchable knowledge // from the ground up. We start with all starting knowledge, // then add the next possible knowledges back into the list // repeatedly, until we run out of knowledges to add. - var/list/list_to_check = GLOB.heretic_start_knowledge.Copy() + var/list/list_to_check = starting_point.Copy() var/i = 0 while(i < length(list_to_check)) - var/datum/heretic_knowledge/knowledge = list_to_check[++i] - if(!ispath(knowledge)) - TEST_FAIL("Heretic Knowledge: Got a non-heretic knowledge datum (Got: [knowledge]) in the list knowledges!") - // Next knowledge is a list of typepaths. - for(var/datum/heretic_knowledge/next_knowledge as anything in GLOB.heretic_research_tree[knowledge][HKT_NEXT]) - if(!ispath(next_knowledge)) - TEST_FAIL("Heretic Knowledge: [next_knowledge.type] has a [isnull(next_knowledge) ? "null":"invalid path"] in its next_knowledge list!") + var/list/knowledge_node = list_to_check[++i] + // Next knowledge is a list of id that consists of typepath_shopcategory + // we basically need to go through the entire chain of HKT_NEXT's to validate the paths's starting from GLOB.heretic_start_knowledge + for(var/next_id in knowledge_node[HKT_NEXT]) + var/list/next_knowledge_node = find_knowledge_node_by_id(all_knowledges, next_id) + var/datum/knowledge_path = next_knowledge_node["type"] + if(isnull(next_knowledge_node)) + TEST_FAIL("Heretic Knowledge: [next_id] in [knowledge_path] 's next_knowledge list does not point to a valid knowledge node!") continue - if(next_knowledge in list_to_check) - continue - list_to_check += next_knowledge + if(!istext(next_id)) + TEST_FAIL("Heretic Knowledge: [next_id] has an invalid non-string next_knowledge entry (Got: [next_id])!") + list_to_check += list(next_knowledge_node) + return list_to_check +/datum/unit_test/heretic_knowledge/proc/find_knowledge_node_by_id(list/knowledges, id) + for(var/list/knowledge_node as anything in knowledges) + if(knowledge_node[HKT_ID] == id) + return knowledge_node + return null - // We now have a list that SHOULD contain all knowledges with a path set (list_to_check). - // Let's compare it to our original list (all_possible_knowledge). If they're not identical, - // then somewhere we missed a knowledge somewhere, and should throw a fail. - if(length(all_possible_knowledge) != length(all_possible_knowledge & list_to_check)) - // 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 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'.") +/datum/unit_test/heretic_knowledge/proc/flatten_list(list/knowledge_nodes) + var/list/flat_list = list() + for(var/datum/heretic_knowledge/knowledge_path as anything in knowledge_nodes) + var/list/knowledge_node = knowledge_nodes[knowledge_path] + knowledge_node["type"] = knowledge_path + flat_list += list(knowledge_node) + return flat_list diff --git a/code/modules/unit_tests/high_five.dm b/code/modules/unit_tests/high_five.dm index 16b7e3f9545d..e5b8e1cef678 100644 --- a/code/modules/unit_tests/high_five.dm +++ b/code/modules/unit_tests/high_five.dm @@ -12,8 +12,8 @@ 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) + var/atom/movable/screen/alert/give/highfive/alert_to_click = locate() in assoc_to_values(take_guy.alerts) + var/atom/movable/screen/alert/give/highfive/bystander_alert_we_dont_click = locate() in assoc_to_values(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") diff --git a/code/modules/unit_tests/huds.dm b/code/modules/unit_tests/huds.dm new file mode 100644 index 000000000000..8aadb770260a --- /dev/null +++ b/code/modules/unit_tests/huds.dm @@ -0,0 +1,18 @@ +/// Tests huds are applied and removed correctly when relevant traits are added/removed +/datum/unit_test/huds + +/datum/unit_test/huds/Run() + var/datum/atom_hud/testhud = GLOB.huds[GLOB.trait_to_hud[TRAIT_SECURITY_HUD]] + var/mob/living/carbon/human/consistent/dummy = allocate(__IMPLIED_TYPE__) + + ADD_TRAIT(dummy, TRAIT_SECURITY_HUD, TRAIT_SOURCE_UNIT_TESTS) + TEST_ASSERT(!!testhud.hud_users_all_z_levels[dummy], "HUD not applied when trait of HUD was added") + + ADD_TRAIT(dummy, TRAIT_BLOCK_SECHUD, TRAIT_SOURCE_UNIT_TESTS) + TEST_ASSERT(!testhud.hud_users_all_z_levels[dummy], "HUD not removed when trait blocking HUD was added") + + REMOVE_TRAIT(dummy, TRAIT_BLOCK_SECHUD, TRAIT_SOURCE_UNIT_TESTS) + TEST_ASSERT(!!testhud.hud_users_all_z_levels[dummy], "HUD not reapplied when trait blocking HUD was removed") + + REMOVE_TRAIT(dummy, TRAIT_SECURITY_HUD, TRAIT_SOURCE_UNIT_TESTS) + TEST_ASSERT(!testhud.hud_users_all_z_levels[dummy], "HUD not removed when trait of HUD was removed") diff --git a/code/modules/unit_tests/hulk.dm b/code/modules/unit_tests/hulk.dm index bb4d5f06c4f5..aed8c1459062 100644 --- a/code/modules/unit_tests/hulk.dm +++ b/code/modules/unit_tests/hulk.dm @@ -17,7 +17,7 @@ TEST_ASSERT_EQUAL(hulk_hits, 1, "Hulk should have hit the dummy once.") TEST_ASSERT_EQUAL(hand_hits, 0, "Hulk should not have hit the dummy with attack_hand.") - TEST_ASSERT(dummy.getBruteLoss(), "Dummy should have taken brute damage from being hulk punched.") + TEST_ASSERT(dummy.get_brute_loss(), "Dummy should have taken brute damage from being hulk punched.") /datum/unit_test/hulk_attack/proc/hulk_sig_fire() SIGNAL_HANDLER diff --git a/code/modules/unit_tests/human_through_recycler.dm b/code/modules/unit_tests/human_through_recycler.dm index c51b9a0e30be..1f62a022c05c 100644 --- a/code/modules/unit_tests/human_through_recycler.dm +++ b/code/modules/unit_tests/human_through_recycler.dm @@ -13,7 +13,7 @@ if(assistant.stat < UNCONSCIOUS) TEST_FAIL("Assistant was not made unconscious by the emagged recycler!") // crush_living() on the recycler should have made the assistant unconscious or worse. // crush_living() on the recycler should have applied the crush_damage to the assistant. - var/damage_incurred = assistant.getBruteLoss() + var/damage_incurred = assistant.get_brute_loss() TEST_ASSERT_EQUAL(damage_incurred, chewer.crush_damage, "Assistant did not take the expected amount of brute damage ([chewer.crush_damage]) from the emagged recycler! Took ([damage_incurred]) instead.") TEST_ASSERT(chewer.bloody, "The emagged recycler did not become bloody after crushing the assistant!") diff --git a/code/modules/unit_tests/hydroponics_harvest.dm b/code/modules/unit_tests/hydroponics_harvest.dm index 8ff72c40b06b..c0881909f272 100644 --- a/code/modules/unit_tests/hydroponics_harvest.dm +++ b/code/modules/unit_tests/hydroponics_harvest.dm @@ -20,14 +20,14 @@ * they aren't the same type so everything that works with one isn't guaranteed to work with the other. */ /datum/unit_test/hydroponics_harvest/Run() - var/obj/machinery/hydroponics/hydroponics_tray = allocate(/obj/machinery/hydroponics) + var/obj/machinery/hydroponics/soil/testing_soil = allocate(/obj/machinery/hydroponics/soil) var/obj/item/seeds/planted_food_seed = allocate(/obj/item/seeds/apple) //grown food var/obj/item/seeds/planted_not_food_seed = allocate(/obj/item/seeds/sunflower) //grown inedible var/obj/item/seeds/planted_densified_seed = allocate(/obj/item/seeds/redbeet) //grown + densified chemicals var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human/consistent) - hydroponics_tray.forceMove(run_loc_floor_bottom_left) + testing_soil.forceMove(run_loc_floor_bottom_left) 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) @@ -38,11 +38,11 @@ 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) + test_seed(testing_soil, planted_food_seed, human) // 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) + test_seed(testing_soil, 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) + test_seed(testing_soil, planted_densified_seed, human) /datum/unit_test/hydroponics_harvest/proc/plant_and_update_seed(obj/machinery/hydroponics/tray, obj/item/seeds/seed) seed.set_yield(10) // Sets the seed yield to 10. This gets clamped to 5 if the plant has traits to half the yield. @@ -92,10 +92,11 @@ var/found_nutriments = all_harvested_items[1].reagents.get_reagent_amount(/datum/reagent/consumable/nutriment) var/found_vitamins = all_harvested_items[1].reagents.get_reagent_amount(/datum/reagent/consumable/nutriment/vitamin) + QDEL_LIST(all_harvested_items) //We got everything we needed from our harvest, we can clean it up. TEST_ASSERT_EQUAL(found_nutriments, expected_nutriments * max_volume, "Hydroponics harvest from [saved_name] has a [expected_nutriments] nutriment gene (expecting [expected_nutriments * max_volume]) but only had [found_nutriments] units of nutriment inside.") - TEST_ASSERT_EQUAL(found_vitamins, expected_vitamins * max_volume, "Hydroponics harvest from [saved_name] has a [expected_vitamins] vitamin gene (expecting [expected_nutriments * max_volume]) but only had [found_vitamins] units of vitamins inside.") + TEST_ASSERT_EQUAL(found_vitamins, expected_vitamins * max_volume, "Hydroponics harvest from [saved_name] has a [expected_vitamins] vitamin gene (expecting [expected_vitamins * max_volume]) but only had [found_vitamins] units of vitamins inside.") if(tray.myseed) tray.age = 0 diff --git a/code/modules/unit_tests/interaction_silicon.dm b/code/modules/unit_tests/interaction_silicon.dm index 4b4efe85ee46..bc3a8ba59b82 100644 --- a/code/modules/unit_tests/interaction_silicon.dm +++ b/code/modules/unit_tests/interaction_silicon.dm @@ -34,5 +34,5 @@ borgo.forceMove(locate(attacker.x + 1, attacker.y, attacker.z)) attacker.set_combat_mode(TRUE) click_wrapper(attacker, borgo) - TEST_ASSERT_EQUAL(borgo.getBruteLoss(), 0, "Cyborg took damage from an unarmed punched - \ + TEST_ASSERT_EQUAL(borgo.get_brute_loss(), 0, "Cyborg took damage from an unarmed punched - \ their unarmed damage threshold should be too high for this to happen.") diff --git a/code/modules/unit_tests/interaction_structures.dm b/code/modules/unit_tests/interaction_structures.dm index d5be4b6d863f..d5ee0860645b 100644 --- a/code/modules/unit_tests/interaction_structures.dm +++ b/code/modules/unit_tests/interaction_structures.dm @@ -27,14 +27,14 @@ click_wrapper(attacker, to_smack) TEST_ASSERT_NOTEQUAL(to_smack.get_integrity(), to_smack.max_integrity, "The barricade should have taken damage a from a non-combat-mode click.") -/// Tests that common tool interactions are possible still, by attempting to open the panel of an air alarm. +/// Tests that common tool interactions are possible still, by attempting to open the panel of an techfab. /datum/unit_test/machinery_tool_interaction /datum/unit_test/machinery_tool_interaction/Run() var/mob/living/carbon/human/consistent/attacker = EASY_ALLOCATE() var/obj/item/screwdriver/screwdriver = EASY_ALLOCATE() - var/obj/machinery/airalarm/to_smack = EASY_ALLOCATE() + var/obj/machinery/rnd/production/to_smack = EASY_ALLOCATE() attacker.put_in_active_hand(screwdriver, forced = TRUE) click_wrapper(attacker, to_smack) - TEST_ASSERT_EQUAL(to_smack.get_integrity(), to_smack.max_integrity, "The air alarm took damage when interacted with a screwdriver.") - TEST_ASSERT(to_smack.panel_open, "The air alarm should have opened its panel after being interacted with a screwdriver.") + TEST_ASSERT_EQUAL(to_smack.get_integrity(), to_smack.max_integrity, "The techfab took damage when interacted with a screwdriver.") + TEST_ASSERT(to_smack.panel_open, "The techfab should have opened its panel after being interacted with a screwdriver.") diff --git a/code/modules/unit_tests/liver.dm b/code/modules/unit_tests/liver.dm index f2f5dcfd00f7..5843df406387 100644 --- a/code/modules/unit_tests/liver.dm +++ b/code/modules/unit_tests/liver.dm @@ -23,15 +23,15 @@ 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") + TEST_ASSERT_EQUAL(mrbones.get_stamina_loss(), expected_stamina_damage, + "Skeleton took [mrbones.get_stamina_loss() > expected_stamina_damage ? "more" : "less"] stamina damage than expected") + TEST_ASSERT_EQUAL(mrbones.get_brute_loss(), expected_brute_damage, + "Skeleton took [mrbones.get_brute_loss() > 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_ASSERT_EQUAL(mrbones.get_stamina_loss(), 0, "Skeleton did not fully heal stamina damage") + TEST_ASSERT_EQUAL(mrbones.get_brute_loss(), 0, "Skeleton did not fully heal brute damage") // Test milk reactions diff --git a/code/modules/unit_tests/load_map_security.dm b/code/modules/unit_tests/load_map_security.dm index a06f184adea1..ec73fba343f1 100644 --- a/code/modules/unit_tests/load_map_security.dm +++ b/code/modules/unit_tests/load_map_security.dm @@ -2,9 +2,9 @@ #define VALID_TEST_MAP "runtimestation" /// Tests to ensure we can load a map from a whitelisted directory (_maps), but not a non-whitelisted directory (i.e "fartyShitPants") -/datum/unit_test/load_map_security +/datum/unit_test/maptest_load_map_security -/datum/unit_test/load_map_security/Run() +/datum/unit_test/maptest_load_map_security/Run() // Copy our valid map into a bad directory // We can technically load from /unitTestTempDir by passing it in our map name @@ -34,7 +34,7 @@ TEST_ASSERT(bad_config.defaulted, "Loaded from non-whitelisted directory: data/load_map_security_temp/[VALID_TEST_MAP]") -/datum/unit_test/load_map_security/Destroy() +/datum/unit_test/maptest_load_map_security/Destroy() // Clean up our temp directory fdel("data/load_map_security_temp/") return ..() diff --git a/code/modules/unit_tests/lungs.dm b/code/modules/unit_tests/lungs.dm index c8338b6dec88..653cce85ba09 100644 --- a/code/modules/unit_tests/lungs.dm +++ b/code/modules/unit_tests/lungs.dm @@ -55,6 +55,7 @@ // Test one breath of Nitrogen on Plasmaman lungs. lungs_test_check_breath("pure Nitrogen", lab_rat, test_lungs, nitro_test_mix, expect_failure = TRUE) +/* // DARKPACK EDIT REMOVAL - Lavaland (Penumbra) will not have ashwalker breathable air /// Tests the lavaland/Ashwalker lungs organ. /// Ensures they can breathe from the lavaland air mixture properly, and suffocate on inadequate mixture. /datum/unit_test/lungs/lungs_sanity_ashwalker @@ -66,6 +67,7 @@ var/mob/living/carbon/human/lab_rat = allocate(/mob/living/carbon/human/consistent) // Test one breath of Lavaland gas mix on Ashwalker lungs. lungs_test_check_breath("Lavaland air mixture", lab_rat, test_lungs, lavaland_test_mix) +*/ /// Comprehensive unit test for [/obj/item/organ/lungs/proc/check_breath()] /// If "expect_failure" is set to TRUE, the test ensures the given Human suffocated. diff --git a/code/modules/unit_tests/map_landmarks.dm b/code/modules/unit_tests/map_landmarks.dm index 9d48785e350c..f81b67aa6672 100644 --- a/code/modules/unit_tests/map_landmarks.dm +++ b/code/modules/unit_tests/map_landmarks.dm @@ -1,7 +1,7 @@ /// Tests that [/datum/job/proc/get_default_roundstart_spawn_point] returns a landmark from all joinable jobs. -/datum/unit_test/job_roundstart_spawnpoints +/datum/unit_test/maptest_job_roundstart_spawnpoints -/datum/unit_test/job_roundstart_spawnpoints/Run() +/datum/unit_test/maptest_job_roundstart_spawnpoints/Run() for(var/datum/job/job as anything in SSjob.joinable_occupations) if(job.spawn_positions <= 0) // Zero spawn positions means we don't need to care if they don't have a roundstart landmark diff --git a/code/modules/unit_tests/mapload_space_verification.dm b/code/modules/unit_tests/mapload_space_verification.dm index 5b27a77cb43e..c7c9845956aa 100644 --- a/code/modules/unit_tests/mapload_space_verification.dm +++ b/code/modules/unit_tests/mapload_space_verification.dm @@ -1,10 +1,10 @@ /// Verifies that there are no space turfs inside a station area, or on any planetary z-level. Sometimes, these are introduced during the load of the map and are not present in the DMM itself. /// Let's just make sure that we have a stop-gap measure in place to catch these if they pop up so we don't put it onto production servers should something errant come up. -/datum/unit_test/mapload_space_verification +/datum/unit_test/maptest_mapload_space_verification // This test is quite taxing time-wise, so let's run it later than other faster tests. priority = TEST_LONGER -/datum/unit_test/mapload_space_verification/Run() +/datum/unit_test/maptest_mapload_space_verification/Run() // Is our current map a planetary station (NO space turfs allowed)? If so, check for ANY space turfs. if(SSmapping.is_planetary()) validate_planetary_map() @@ -41,7 +41,7 @@ /// Verifies that there are ZERO space turfs on a valid planetary station. We NEVER want space turfs here, so we do not check for /area/space here since something completely undesirable is happening. /// There are also a few considerations specific to planetary stations included within, so let's spin it out into a separate proc for clarity. -/datum/unit_test/mapload_space_verification/proc/validate_planetary_map() +/datum/unit_test/maptest_mapload_space_verification/proc/validate_planetary_map() // We want to get both the station level and the mining level (if the two are seperate for any reason). var/list/testable_levels = list() testable_levels += SSmapping.levels_by_trait(ZTRAIT_STATION) // Station z-levels get to be in by default because they can derail an entire round and cause LINDA to weep if a space turf is present. diff --git a/code/modules/unit_tests/mapping.dm b/code/modules/unit_tests/mapping.dm index ff6a2577917a..6b1509ba64e2 100644 --- a/code/modules/unit_tests/mapping.dm +++ b/code/modules/unit_tests/mapping.dm @@ -1,9 +1,9 @@ /// Conveys all log_mapping messages as unit test failures, as they all indicate mapping problems. -/datum/unit_test/log_mapping +/datum/unit_test/maptest_log_mapping // Happen before all other tests, to make sure we only capture normal mapping logs. priority = TEST_PRE -/datum/unit_test/log_mapping/Run() +/datum/unit_test/maptest_log_mapping/Run() var/static/regex/test_areacoord_regex = regex(@"\(-?\d+,-?\d+,(-?\d+)\)") for(var/log_entry in GLOB.unit_test_mapping_logs) diff --git a/code/modules/unit_tests/mapping_nearstation_test.dm b/code/modules/unit_tests/mapping_nearstation_test.dm index d428b826634b..39898432fa03 100644 --- a/code/modules/unit_tests/mapping_nearstation_test.dm +++ b/code/modules/unit_tests/mapping_nearstation_test.dm @@ -1,8 +1,8 @@ ///Detects movables that may have been accidentally placed in space, as well as movables which do not have the proper nearspace area (meaning they aren't lit properly.) -/datum/unit_test/mapping_nearstation_test +/datum/unit_test/maptest_mapping_nearstation_test priority = TEST_PRE -/datum/unit_test/mapping_nearstation_test/Run() +/datum/unit_test/maptest_mapping_nearstation_test/Run() if(SSmapping.is_planetary()) return //No need to test for orphaned spaced atoms on this map. diff --git a/code/modules/unit_tests/mecha_build.dm b/code/modules/unit_tests/mecha_build.dm new file mode 100644 index 000000000000..812974f12cc0 --- /dev/null +++ b/code/modules/unit_tests/mecha_build.dm @@ -0,0 +1,39 @@ +/datum/unit_test/mecha_construction_icons + +/datum/unit_test/mecha_construction_icons/Run() + for(var/chassis_type in subtypesof(/obj/item/mecha_parts/chassis)) + var/obj/item/mecha_parts/chassis/chassis = allocate(chassis_type) + var/datum/component/construction/unordered/mecha_chassis/chassis_comp = chassis.GetComponent(/datum/component/construction/unordered/mecha_chassis) + if(isnull(chassis_comp)) + TEST_FAIL("[chassis_type]: Mecha chassis without a construction component") + continue + chassis_comp.spawn_result() + + var/datum/component/construction/mecha/construction_comp = chassis.GetComponent(/datum/component/construction/mecha) + if(isnull(construction_comp)) + TEST_FAIL("[chassis_type]: Finished chassis without a mech construction component") + continue + if(!QDELETED(chassis_comp)) + TEST_FAIL("[chassis_type]: Chassis construction component was not deleted after applying the mecha construction component") + continue + if(isnull(construction_comp.base_icon)) + continue // apparently valid, for construction which don't have *any* icon states + + var/list/all_chassis_icon_states = icon_states_fast(chassis.icon) + var/list/step_icon_states = list() + for(var/list/step_data as anything in construction_comp.steps) + var/icon_state = step_data["icon_state"] + if(isnull(icon_state)) + continue // valid, it just means the step doesn't change the icon + + if(!(icon_state in all_chassis_icon_states)) + TEST_FAIL("[chassis_type]: Mecha construction step has invalid icon_state '[icon_state]'") + continue + + step_icon_states += icon_state + + for(var/icon_state in all_chassis_icon_states - step_icon_states) + // little extra logic here to avoid false positives like finding "mech" in "darkmech" + if(!findtext("test-[icon_state]", "test-[construction_comp.base_icon]")) + continue + TEST_FAIL("[chassis_type]: Mecha construction has an unused icon state '[icon_state]'") diff --git a/code/modules/unit_tests/mob_damage.dm b/code/modules/unit_tests/mob_damage.dm index 4cb590db16d3..21e723282129 100644 --- a/code/modules/unit_tests/mob_damage.dm +++ b/code/modules/unit_tests/mob_damage.dm @@ -52,7 +52,7 @@ */ /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 + amount_after = testing_mob.get_stamina_loss() - 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)) @@ -77,7 +77,7 @@ */ /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 + amount_after = testing_mob.get_stamina_loss() - expected if(!set_damage(testing_mob, amount, expected, included_types, biotypes, bodytypes, forced)) return FALSE if(!verify_damage(testing_mob, amount_after, included_types)) @@ -95,33 +95,33 @@ */ /datum/unit_test/mob_damage/proc/verify_damage(mob/living/carbon/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()]!") + TEST_ASSERT_EQUAL(testing_mob.get_tox_loss(), amount, \ + "[testing_mob] should have [amount] toxin damage, instead they have [testing_mob.get_tox_loss()]!") if(included_types & BRUTELOSS) - TEST_ASSERT_EQUAL(round(testing_mob.getBruteLoss(), 1), amount, \ - "(Testing getBruteLoss()) [testing_mob] should have [amount] brute damage, instead they have [testing_mob.getBruteLoss()]!") - TEST_ASSERT_EQUAL(round(testing_mob.getBruteLossForType(BODYTYPE_ORGANIC), 1), amount, \ - "(Testing getBruteLossForType(BODYTYPE_ORGANIC)) [testing_mob] should have [amount] brute damage, instead they have [testing_mob.getBruteLossForType(BODYTYPE_ORGANIC)]!") + TEST_ASSERT_EQUAL(round(testing_mob.get_brute_loss(), 1), amount, \ + "(Testing get_brute_loss()) [testing_mob] should have [amount] brute damage, instead they have [testing_mob.get_brute_loss()]!") + TEST_ASSERT_EQUAL(round(testing_mob.get_brute_loss_for_type(BODYTYPE_ORGANIC), 1), amount, \ + "(Testing get_brute_loss_for_type(BODYTYPE_ORGANIC)) [testing_mob] should have [amount] brute damage, instead they have [testing_mob.get_brute_loss_for_type(BODYTYPE_ORGANIC)]!") if(included_types & FIRELOSS) - TEST_ASSERT_EQUAL(round(testing_mob.getFireLoss(), 1), amount, \ - "(Testing getFireLoss()) [testing_mob] should have [amount] burn damage, instead they have [testing_mob.getFireLoss()]!") - TEST_ASSERT_EQUAL(round(testing_mob.getFireLossForType(BODYTYPE_ORGANIC), 1), amount, \ - "(Testing getFireLossForType(BODYTYPE_ORGANIC)) [testing_mob] should have [amount] burn damage, instead they have [testing_mob.getFireLossForType(BODYTYPE_ORGANIC)]!") + TEST_ASSERT_EQUAL(round(testing_mob.get_fire_loss(), 1), amount, \ + "(Testing get_fire_loss()) [testing_mob] should have [amount] burn damage, instead they have [testing_mob.get_fire_loss()]!") + TEST_ASSERT_EQUAL(round(testing_mob.get_fire_loss_for_type(BODYTYPE_ORGANIC), 1), amount, \ + "(Testing get_fire_loss_for_type(BODYTYPE_ORGANIC)) [testing_mob] should have [amount] burn damage, instead they have [testing_mob.get_fire_loss_for_type(BODYTYPE_ORGANIC)]!") if(included_types & OXYLOSS) - TEST_ASSERT_EQUAL(testing_mob.getOxyLoss(), amount, \ - "[testing_mob] should have [amount] oxy damage, instead they have [testing_mob.getOxyLoss()]!") + TEST_ASSERT_EQUAL(testing_mob.get_oxy_loss(), amount, \ + "[testing_mob] should have [amount] oxy damage, instead they have [testing_mob.get_oxy_loss()]!") if(included_types & STAMINALOSS) - TEST_ASSERT_EQUAL(testing_mob.getStaminaLoss(), amount, \ - "[testing_mob] should have [amount] stamina damage, instead they have [testing_mob.getStaminaLoss()]!") + TEST_ASSERT_EQUAL(testing_mob.get_stamina_loss(), amount, \ + "[testing_mob] should have [amount] stamina damage, instead they have [testing_mob.get_stamina_loss()]!") // DARKPACK EDIT ADD START - AGGRAVATED_DAMAGE if(included_types & AGGLOSS) - TEST_ASSERT_EQUAL(round(testing_mob.getAggLoss(), 1), amount, \ - "[testing_mob] should have [amount] aggravated damage, instead they have [testing_mob.getAggLoss()]!") + TEST_ASSERT_EQUAL(round(testing_mob.get_agg_loss(), 1), amount, \ + "[testing_mob] should have [amount] aggravated damage, instead they have [testing_mob.get_agg_loss()]!") // DARKPACK EDIT ADD END return TRUE /** - * Apply a specific amount of damage to the mob using adjustBruteLoss(), adjustToxLoss(), etc. + * Apply a specific amount of damage to the mob using adjust_brute_loss(), adjust_tox_loss(), etc. * * By default this applies damage of every type to the mob, and checks that the damage procs return the value * Arguments: @@ -136,35 +136,35 @@ /datum/unit_test/mob_damage/proc/apply_damage(mob/living/carbon/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) + damage_returned = testing_mob.adjust_tox_loss(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!") + "adjust_tox_loss() 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) + damage_returned = round(testing_mob.adjust_brute_loss(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!") + "adjust_brute_loss() 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) + damage_returned = round(testing_mob.adjust_fire_loss(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!") + "adjust_fire_loss() 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) + damage_returned = testing_mob.adjust_oxy_loss(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!") + "adjust_oxy_loss() 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) + damage_returned = testing_mob.adjust_stamina_loss(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!") + "adjust_stamina_loss() should have returned [expected], but returned [damage_returned] instead!") // DARKPACK EDIT ADD START - AGGRAVATED_DAMAGE if(included_types & AGGLOSS) - damage_returned = round(testing_mob.adjustAggLoss(amount, updating_health = FALSE, forced = forced, required_bodytype = bodytypes), 1) + damage_returned = round(testing_mob.adjust_agg_loss(amount, updating_health = FALSE, forced = forced, required_bodytype = bodytypes), 1) TEST_ASSERT_EQUAL(damage_returned, expected, \ - "adjustAggLoss() should have returned [expected], but returned [damage_returned] instead!") + "adjust_agg_loss() should have returned [expected], but returned [damage_returned] instead!") // DARKPACK EDIT ADD END return TRUE /** - * Set a specific amount of damage for the mob using setBruteLoss(), setToxLoss(), etc. + * Set a specific amount of damage for the mob using set_brute_loss(), set_tox_loss(), etc. * * By default this sets every type of damage to for the mob, and checks that the damage procs return the value * Arguments: @@ -179,34 +179,34 @@ /datum/unit_test/mob_damage/proc/set_damage(mob/living/carbon/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) + damage_returned = testing_mob.set_tox_loss(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!") + "set_tox_loss() 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) + damage_returned = round(testing_mob.set_brute_loss(amount, updating_health = FALSE, forced = forced), 1) TEST_ASSERT_EQUAL(damage_returned, expected, \ - "setBruteLoss() should have returned [expected], but returned [damage_returned] instead!") + "set_brute_loss() 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) + damage_returned = round(testing_mob.set_fire_loss(amount, updating_health = FALSE, forced = forced), 1) TEST_ASSERT_EQUAL(damage_returned, expected, \ - "setFireLoss() should have returned [expected], but returned [damage_returned] instead!") + "set_fire_loss() 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) + damage_returned = testing_mob.set_oxy_loss(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!") + "set_oxy_loss() 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) + damage_returned = testing_mob.set_stamina_loss(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!") + "set_stamina_loss() should have returned [expected], but returned [damage_returned] instead!") // DARKPACK EDIT ADD START - AGGRAVATED_DAMAGE if(included_types & AGGLOSS) - damage_returned = round(testing_mob.setAggLoss(amount, updating_health = FALSE, forced = forced), 1) + damage_returned = round(testing_mob.set_agg_loss(amount, updating_health = FALSE, forced = forced), 1) TEST_ASSERT_EQUAL(damage_returned, expected, \ - "setAggLoss() should have returned [expected], but returned [damage_returned] instead!") + "set_agg_loss() should have returned [expected], but returned [damage_returned] instead!") // DARKPACK EDIT ADD END return TRUE -/// Sanity tests damage and healing using adjustToxLoss, adjustBruteLoss, etc +/// Sanity tests damage and healing using adjust_tox_loss, adjust_brute_loss, 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)) @@ -247,10 +247,10 @@ 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()]!") + TEST_ASSERT_EQUAL(round(dummy.get_brute_loss(), 1), 5, \ + "Dummy should have 5 brute damage, instead they have [dummy.get_brute_loss()]!") + TEST_ASSERT_EQUAL(round(dummy.get_fire_loss(), 1), 2, \ + "Dummy should have 2 burn damage, instead they have [dummy.get_fire_loss()]!") // heal 4 brute, 1 burn damage_returned = round(dummy.heal_bodypart_damage(4, 1, updating_health = FALSE), 1) @@ -373,14 +373,14 @@ // 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) + dummy.set_oxy_loss(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)) + if(!test_apply_damage(dummy, 2, expected = 0, amount_after = dummy.get_oxy_loss(), 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)) + if(!test_apply_damage(dummy, -2, amount_after = dummy.get_oxy_loss()-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) @@ -393,28 +393,28 @@ // 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) + dummy.set_tox_loss(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)) + if(!test_apply_damage(dummy, 2, expected = 2, amount_after = dummy.get_tox_loss()-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)) + if(!test_apply_damage(dummy, -2, expected = -2, amount_after = dummy.get_tox_loss()+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) + dummy.set_tox_loss(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)) + if(!test_apply_damage(dummy, -2, expected = 0, amount_after = dummy.get_tox_loss(), 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)) + if(!test_apply_damage(dummy, 2, expected = 2, amount_after = dummy.get_tox_loss()-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) @@ -435,12 +435,12 @@ "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!") + TEST_ASSERT_EQUAL(dummy.get_brute_loss(), 0, \ + "[src] should have 0 brute damage, but has [dummy.get_brute_loss()] instead!") + TEST_ASSERT_EQUAL(dummy.get_fire_loss(), 10, \ + "[src] should have 10 burn damage, but has [dummy.get_fire_loss()] instead!") + TEST_ASSERT_EQUAL(dummy.get_tox_loss(), 20, \ + "[src] should have 20 toxin damage, but has [dummy.get_tox_loss()] instead!") // Now heal the remaining 30, overhealing by 5. damage_returned = round(dummy.heal_ordered_damage(35, list(BRUTE, BURN, TOX)), 1) @@ -448,12 +448,12 @@ "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!") + TEST_ASSERT_EQUAL(dummy.get_brute_loss(), 0, \ + "[src] should have 0 brute damage, but has [dummy.get_brute_loss()] instead!") + TEST_ASSERT_EQUAL(dummy.get_fire_loss(), 0, \ + "[src] should have 0 burn damage, but has [dummy.get_fire_loss()] instead!") + TEST_ASSERT_EQUAL(dummy.get_tox_loss(), 0, \ + "[src] should have 0 toxin damage, but has [dummy.get_tox_loss()] instead!") /// Tests that mob damage procs are working as intended for basic and simple mobs /datum/unit_test/mob_damage/animal @@ -492,24 +492,24 @@ */ /datum/unit_test/mob_damage/animal/verify_damage(mob/living/carbon/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()]!") + TEST_ASSERT_EQUAL(testing_mob.get_tox_loss(), 0, \ + "[testing_mob] should have [0] toxin damage, instead they have [testing_mob.get_tox_loss()]!") 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()]!") // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE + TEST_ASSERT_EQUAL(round(testing_mob.get_brute_loss(), 1), expected || amount * 5, \ + "[testing_mob] should have [expected || amount * 5] brute damage, instead they have [testing_mob.get_brute_loss()]!") // DARKPACK EDIT CHANGE - AGGRAVATED_DAMAGE 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()]!") + TEST_ASSERT_EQUAL(round(testing_mob.get_fire_loss(), 1), 0, \ + "[testing_mob] should have [0] burn damage, instead they have [testing_mob.get_fire_loss()]!") if(included_types & OXYLOSS) - TEST_ASSERT_EQUAL(testing_mob.getOxyLoss(), 0, \ - "[testing_mob] should have [0] oxy damage, instead they have [testing_mob.getOxyLoss()]!") + TEST_ASSERT_EQUAL(testing_mob.get_oxy_loss(), 0, \ + "[testing_mob] should have [0] oxy damage, instead they have [testing_mob.get_oxy_loss()]!") if(included_types & STAMINALOSS) - TEST_ASSERT_EQUAL(testing_mob.getStaminaLoss(), amount, \ - "[testing_mob] should have [amount] stamina damage, instead they have [testing_mob.getStaminaLoss()]!") + TEST_ASSERT_EQUAL(testing_mob.get_stamina_loss(), amount, \ + "[testing_mob] should have [amount] stamina damage, instead they have [testing_mob.get_stamina_loss()]!") // DARKPACK EDIT ADD START - AGGRAVATED_DAMAGE if(included_types & AGGLOSS) - TEST_ASSERT_EQUAL(testing_mob.getAggLoss(), 0, \ - "[testing_mob] should have [0] aggravated damage, instead they have [testing_mob.getAggLoss()]!") + TEST_ASSERT_EQUAL(testing_mob.get_agg_loss(), 0, \ + "[testing_mob] should have [0] aggravated damage, instead they have [testing_mob.get_agg_loss()]!") // DARKPACK EDIT ADD END return TRUE @@ -625,15 +625,15 @@ /datum/unit_test/human_tox_damage/Run() // Spawn a dummy, give it a bunch of tox damage. It should get the status effect. var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) - dummy.setToxLoss(75) + dummy.set_tox_loss(75) var/datum/status_effect/tox_effect = dummy.has_status_effect(/datum/status_effect/tox_vomit) - TEST_ASSERT_NOTNULL(tox_effect, "Dummy didn't get tox_vomit status effect despite at [dummy.getToxLoss()] toxin damage (Method: SET)!") + TEST_ASSERT_NOTNULL(tox_effect, "Dummy didn't get tox_vomit status effect despite at [dummy.get_tox_loss()] toxin damage (Method: SET)!") // Clear the toxin damage away, and force a status effect tick: It should delete itself - dummy.setToxLoss(0) - tox_effect.tick(initial(tox_effect.tick_interval)) - TEST_ASSERT(QDELETED(tox_effect), "Dummy still has tox_vomit status effect despite at [dummy.getToxLoss()] toxin damage (Method: SET)!") + dummy.set_tox_loss(0) + tox_effect.tick(tox_effect.tick_interval) + TEST_ASSERT(QDELETED(tox_effect), "Dummy still has tox_vomit status effect despite at [dummy.get_tox_loss()] toxin damage (Method: SET)!") // Test another method of gaining tox damage, use an entirely clean slate just to be sure var/mob/living/carbon/human/dummy_two = allocate(/mob/living/carbon/human/consistent) - dummy_two.adjustToxLoss(75) + dummy_two.adjust_tox_loss(75) var/datum/status_effect/tox_effect_two = dummy_two.has_status_effect(/datum/status_effect/tox_vomit) - TEST_ASSERT_NOTNULL(tox_effect_two, "Dummy didn't get tox_vomit status effect at [dummy_two.getToxLoss()] toxin damage (METHOD: ADJUST)!") + TEST_ASSERT_NOTNULL(tox_effect_two, "Dummy didn't get tox_vomit status effect at [dummy_two.get_tox_loss()] toxin damage (METHOD: ADJUST)!") diff --git a/code/modules/unit_tests/modsuit.dm b/code/modules/unit_tests/modsuit.dm index 33aedb9ce49b..7e340d86378a 100644 --- a/code/modules/unit_tests/modsuit.dm +++ b/code/modules/unit_tests/modsuit.dm @@ -20,3 +20,13 @@ TEST_ASSERT(!is_type_in_list(module_to_check, module.incompatible_modules), "[modpath] initial module [module.type] is incompatible with initial module [module_to_check.type]") modules += module +/datum/unit_test/mod_storage + +/datum/unit_test/mod_storage/Run() + var/mob/living/carbon/human/consistent/dummy = allocate(__IMPLIED_TYPE__) + dummy.equipOutfit(/datum/outfit/admin) + TEST_ASSERT(istype(dummy.back, /obj/item/mod/control/pre_equipped), "Admin outfit did not equip a MODsuit.") + // mod storage is owned by the modsuit but the actual items are stored in the module itseslf + var/obj/item/mod/module/storage/storage = locate() in dummy.back + TEST_ASSERT_NOTNULL(storage, "Admin outfit MODsuit did not have a storage module.") + TEST_ASSERT(length(storage.contents) > 0, "Admin outfit's storage module was empty.") diff --git a/code/modules/unit_tests/modular_map_loader.dm b/code/modules/unit_tests/modular_map_loader.dm index fe6f00b68217..66caf39fccbc 100644 --- a/code/modules/unit_tests/modular_map_loader.dm +++ b/code/modules/unit_tests/modular_map_loader.dm @@ -1,6 +1,6 @@ -/datum/unit_test/modular_map_loader +/datum/unit_test/maptest_modular_map_loader -/datum/unit_test/modular_map_loader/Run() +/datum/unit_test/maptest_modular_map_loader/Run() for (var/obj/modular_map_root/map_root_type as anything in subtypesof(/obj/modular_map_root)) var/config_file = initial(map_root_type.config_file) if (!fexists(config_file)) diff --git a/code/modules/unit_tests/monkey_business.dm b/code/modules/unit_tests/monkey_business.dm index 80044a0486d9..cedfcd75c491 100644 --- a/code/modules/unit_tests/monkey_business.dm +++ b/code/modules/unit_tests/monkey_business.dm @@ -11,6 +11,15 @@ priority = TEST_LONGER var/monkey_timer = 30 SECONDS var/monkey_angry_nth = 5 // every nth monkey will be angry + var/monkey_weapon_index = 1 // which weapon to give the next angry monkey + var/list/monkey_weapon_list = list( + /obj/item/knife/shiv, + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/gun/energy/laser, + /obj/item/melee/baseball_bat, + /obj/item/melee/baton, + /obj/item/storage/toolbox, + ) /datum/unit_test/monkey_business/Run() for(var/monkey_id in 1 to length(GLOB.the_station_areas)) @@ -19,8 +28,12 @@ monkey.set_species(/datum/species/monkey) monkey.set_name("Monkey [monkey_id]") if(monkey_id % monkey_angry_nth == 0) // BLOOD FOR THE BLOOD GODS - monkey.put_in_active_hand(new /obj/item/knife/shiv) + var/obj/next_weapon = monkey_weapon_list[monkey_weapon_index] + monkey_weapon_index = (monkey_weapon_index % length(monkey_weapon_list)) + 1 + monkey.put_in_active_hand(new next_weapon()) new /datum/ai_controller/monkey/angry(monkey) + if(ispath(next_weapon, /obj/item/gun)) + monkey.ai_controller.set_blackboard_key(BB_MONKEY_GUN_NEURONS_ACTIVATED, TRUE) else new /datum/ai_controller/monkey(monkey) monkey.ai_controller.set_blackboard_key(BB_MONKEY_TARGET_MONKEYS, TRUE) diff --git a/code/modules/unit_tests/move_pulled.dm b/code/modules/unit_tests/move_pulled.dm new file mode 100644 index 000000000000..29b30d470649 --- /dev/null +++ b/code/modules/unit_tests/move_pulled.dm @@ -0,0 +1,46 @@ +/// Test that people can move pulled objects by clicking distant turfs or decals +/datum/unit_test/move_pulled + abstract_type = /datum/unit_test/move_pulled + +/datum/unit_test/move_pulled/Run() + var/mob/living/carbon/human/consistent/puller = allocate(__IMPLIED_TYPE__) + var/obj/structure/closet/crate/crate = allocate(__IMPLIED_TYPE__) + + puller.start_pulling(crate) + + TEST_ASSERT(puller.pulling == crate, "The puller is not pulling the crate.") + + var/atom/first_target = get_first_target(puller) + click_wrapper(puller, first_target) + + TEST_ASSERT(crate.loc == run_loc_floor_bottom_left, "The crate should not have moved from clicking on the crate's turf.") + + var/atom/second_target = get_second_target(puller) + click_wrapper(puller, second_target) + + TEST_ASSERT(crate.loc != run_loc_floor_bottom_left, "The crate should have moved in the direction of the top right turf.") + TEST_ASSERT(crate.loc == get_turf(second_target), "The crate should be located at the northeast of the puller.") + +/datum/unit_test/move_pulled/proc/get_first_target(mob/living/puller) + CRASH("Unimplemented get_first_target in move_pulled unit test") + +/datum/unit_test/move_pulled/proc/get_second_target(mob/living/puller) + CRASH("Unimplemented get_second_target in move_pulled unit test") + +/// Try to move a pulled object to the turf below us, then to the opposite corner +/datum/unit_test/move_pulled/to_turf + +/datum/unit_test/move_pulled/to_turf/get_first_target(mob/living/puller) + return run_loc_floor_bottom_left + +/datum/unit_test/move_pulled/to_turf/get_second_target(mob/living/puller) + return get_step(puller, NORTHEAST) + +/// Try to move a pulled object to a decal below us, then to a decal in the opposite corner +/datum/unit_test/move_pulled/to_decal + +/datum/unit_test/move_pulled/to_decal/get_first_target(mob/living/puller) + return allocate(/obj/effect/decal/cleanable/blood, run_loc_floor_bottom_left) + +/datum/unit_test/move_pulled/to_decal/get_second_target(mob/living/puller) + return allocate(/obj/effect/decal/cleanable/blood, get_step(puller, NORTHEAST)) diff --git a/code/modules/unit_tests/neurine_trauma_cleanup.dm b/code/modules/unit_tests/neurine_trauma_cleanup.dm new file mode 100644 index 000000000000..fee8ca6eb784 --- /dev/null +++ b/code/modules/unit_tests/neurine_trauma_cleanup.dm @@ -0,0 +1,58 @@ +/// Tests that neurine reagent properly creates and cleans up temporary traumas +/datum/unit_test/neurine_trauma_cleanup + +/datum/unit_test/neurine_trauma_cleanup/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + dummy.mind_initialize() + + // Create neurine reagent + var/datum/reagent/inverse/neurine/neurine_reagent = new() + + // Ensure the dummy has a brain + var/obj/item/organ/brain/brain = dummy.get_organ_slot(ORGAN_SLOT_BRAIN) + TEST_ASSERT(brain, "Test dummy should have a brain") + + // Get initial trauma count + var/initial_trauma_count = length(brain.traumas) + + // Trigger neurine to add a trauma (simulate on_mob_life) + // We need to ensure it creates a trauma by setting high purity + neurine_reagent.creation_purity = 10 // This ensures SPT_PROB(creation_purity*10) will be 100% + neurine_reagent.on_mob_life(dummy, 1, 1) + + // Check that a trauma was added + var/post_add_trauma_count = length(brain.traumas) + TEST_ASSERT(post_add_trauma_count == initial_trauma_count + 1, "Neurine should have added exactly one trauma") + TEST_ASSERT(neurine_reagent.temp_trauma, "Neurine should have stored a reference to the trauma it created") + + // Verify the trauma is actually there and has the right resilience + var/datum/brain_trauma/added_trauma = neurine_reagent.temp_trauma + TEST_ASSERT(added_trauma in brain.traumas, "The trauma stored in temp_trauma should be in the brain's trauma list") + TEST_ASSERT(added_trauma.resilience == TRAUMA_RESILIENCE_MAGIC, "Neurine-created trauma should have TRAUMA_RESILIENCE_MAGIC") + + // Now simulate the reagent being deleted (on_mob_delete) + neurine_reagent.on_mob_delete(dummy) + + // Check that the trauma was properly removed + var/post_delete_trauma_count = length(brain.traumas) + TEST_ASSERT(post_delete_trauma_count == initial_trauma_count, "Neurine trauma should have been removed when reagent was deleted") + TEST_ASSERT(!neurine_reagent.temp_trauma, "Neurine should have cleared its temp_trauma reference") + TEST_ASSERT(!(added_trauma in brain.traumas), "The specific trauma should no longer be in the brain's trauma list") + + // Test special case: imaginary friend should NOT be removed + var/datum/brain_trauma/special/imaginary_friend/friend_trauma = new() + brain.add_trauma_to_traumas(friend_trauma) + friend_trauma.owner = dummy + friend_trauma.resilience = TRAUMA_RESILIENCE_MAGIC + neurine_reagent.temp_trauma = friend_trauma + + var/pre_friend_test_count = length(brain.traumas) + neurine_reagent.on_mob_delete(dummy) + + // Imaginary friend should still be there + TEST_ASSERT(length(brain.traumas) == pre_friend_test_count, "Imaginary friend trauma should not be removed by neurine cleanup") + TEST_ASSERT(friend_trauma in brain.traumas, "Imaginary friend should still be in trauma list") + + // Clean up for next test + qdel(friend_trauma) + qdel(neurine_reagent) diff --git a/code/modules/unit_tests/novaflower_burn.dm b/code/modules/unit_tests/novaflower_burn.dm index ae7d61b34ade..165a738fda30 100644 --- a/code/modules/unit_tests/novaflower_burn.dm +++ b/code/modules/unit_tests/novaflower_burn.dm @@ -14,18 +14,18 @@ // They are not wearing botany gloves (have plant protection), so they should take damage = the flower's force. weapon.attack_hand(botanist) TEST_ASSERT_EQUAL(botanist.get_active_held_item(), weapon, "The botanist failed to pick up [weapon].") - TEST_ASSERT_EQUAL(botanist.getFireLoss(), weapon.force, "The botanist picked up [weapon] with their bare hands, and took an incorrect amount of fire damage.") + TEST_ASSERT_EQUAL(botanist.get_fire_loss(), weapon.force, "The botanist picked up [weapon] with their bare hands, and took an incorrect amount of fire damage.") // Heal our attacker for easy comparison later - botanist.adjustFireLoss(-100) + botanist.adjust_fire_loss(-100) // And give them the plant safe trait so we don't have to worry about attacks being cancelled ADD_TRAIT(botanist, TRAIT_PLANT_SAFE, "unit_test") // Now, let's get a smack with the novaflower and see what happens. weapon.melee_attack_chain(botanist, victim) - TEST_ASSERT(botanist.getFireLoss() <= 0, "The botanist took fire damage from [weapon], even though they were plant safe.") - TEST_ASSERT_EQUAL(victim.getFireLoss(), initial_force, "The target took an incorrect amount of fire damage after being hit with [weapon].") + TEST_ASSERT(botanist.get_fire_loss() <= 0, "The botanist took fire damage from [weapon], even though they were plant safe.") + TEST_ASSERT_EQUAL(victim.get_fire_loss(), initial_force, "The target took an incorrect amount of fire damage after being hit with [weapon].") TEST_ASSERT(weapon.force < initial_force, "[weapon] didn't lose any force after an attack.") TEST_ASSERT(victim.fire_stacks > 0, "[weapon] didn't apply any firestacks to the target after an attack.") TEST_ASSERT(victim.on_fire, "[weapon] didn't set the target on fire after an attack.") diff --git a/code/modules/unit_tests/omnitools.dm b/code/modules/unit_tests/omnitools.dm index 3a04ade9b762..5a4e66cd3c82 100644 --- a/code/modules/unit_tests/omnitools.dm +++ b/code/modules/unit_tests/omnitools.dm @@ -30,3 +30,18 @@ //unequip borg.drop_all_held_items() + +/datum/unit_test/omnitool_icons + +/datum/unit_test/omnitool_icons/Run() + var/list/all_tools = GLOB.all_tool_behaviours.Copy() + for(var/tool, tool_image in GLOB.tool_to_image) + if(!(tool in GLOB.all_tool_behaviours)) + TEST_FAIL("Tool behaviour [tool] has an image defined in global tool_to_image but is not present in all_tool_behaviours list.") + var/image/tool_image_real = tool_image + if(!icon_exists(tool_image_real.icon, tool_image_real.icon_state)) + TEST_FAIL("Tool image for [tool] not found ([tool_image_real.icon], [tool_image_real.icon_state])") + all_tools -= tool + + for(var/missing_tool in all_tools) + TEST_FAIL("No tool image defined for tool behaviour [missing_tool] in global tool_to_image") diff --git a/code/modules/unit_tests/organ_bodypart_shuffle.dm b/code/modules/unit_tests/organ_bodypart_shuffle.dm index 11c0bcd71bec..e05c6bd0bd94 100644 --- a/code/modules/unit_tests/organ_bodypart_shuffle.dm +++ b/code/modules/unit_tests/organ_bodypart_shuffle.dm @@ -7,26 +7,31 @@ // Test if organs are all properly updating when forcefully removed var/list/removed_organs = list() + // 1. remove all the organs from the mob for(var/obj/item/organ/organ as anything in hollow_boy.organs) organ.moveToNullspace() removed_organs += organ + // 2. ensure removed organs proper disassociate from the mob and the bodypart for(var/obj/item/organ/organ as anything in removed_organs) TEST_ASSERT(!(organ in hollow_boy.organs), "Organ '[organ.name] remained inside human after forceMove into nullspace.") - TEST_ASSERT(organ.loc == null, "Organ '[organ.name] did not move to nullspace after being forced to.") - TEST_ASSERT(!(organ.owner), "Organ '[organ.name] kept reference to human after forceMove into nullspace.") - TEST_ASSERT(!(organ.bodypart_owner), "Organ '[organ.name] kept reference to bodypart after forceMove into nullspace.") + TEST_ASSERT_NULL(organ.loc, "Organ '[organ.name] did not move to nullspace after being forced to.") + TEST_ASSERT_NULL(organ.owner, "Organ '[organ.name] kept reference to human after forceMove into nullspace.") + TEST_ASSERT_NULL(organ.bodypart_owner, "Organ '[organ.name] kept reference to bodypart after forceMove into nullspace.") + // 3. replace all bodyparts with new ones and place the previously removed organs into the new bodyparts for(var/obj/item/bodypart/bodypart as anything in hollow_boy.bodyparts) - bodypart = new bodypart.type() //fresh, duplice bodypart with no insides + var/obj/item/bodypart/replacement = allocate(bodypart.type) for(var/obj/item/organ/organ as anything in removed_organs) - if(bodypart.body_zone != deprecise_zone(organ.zone)) + if(replacement.body_zone != deprecise_zone(organ.zone)) continue - organ.bodypart_insert(bodypart) // Put all the old organs back in - bodypart.replace_limb(hollow_boy) //so stick new bodyparts on them with their old organs - // Check if, after we put the old organs in a new limb, and after we put that new limb on the mob, if the organs came with - for(var/obj/item/organ/organ as anything in removed_organs) //technically readded organ now - if(bodypart.body_zone != deprecise_zone(organ.zone)) - continue - TEST_ASSERT(organ in hollow_boy.organs, "Organ '[organ.name] was put in an empty bodypart that replaced a humans, but the organ did not come with.") + organ.bodypart_insert(replacement) + if(!replacement.replace_limb(hollow_boy)) + TEST_FAIL("Failed to replace [replacement] with a new one of the same type.") + qdel(bodypart) // it's been replaced, clean up + // 4. ensure organs are properly associated with the new bodyparts and the mob + for(var/obj/item/organ/organ as anything in removed_organs) + TEST_ASSERT(organ in hollow_boy.organs, "Organ '[organ.name] was put in an empty bodypart that replaced a humans, but the organ did not come with.") + TEST_ASSERT(organ.owner == hollow_boy, "Organ '[organ.name]'s owner was not properly updated to the new human after being placed in a replacement bodypart.") + TEST_ASSERT(organ.bodypart_owner in hollow_boy.bodyparts, "Organ '[organ.name]'s bodypart_owner was not properly updated to the new bodypart after being placed in a replacement bodypart.") diff --git a/code/modules/unit_tests/organs.dm b/code/modules/unit_tests/organs.dm index f7c0b38f453c..32b47460f380 100644 --- a/code/modules/unit_tests/organs.dm +++ b/code/modules/unit_tests/organs.dm @@ -78,8 +78,8 @@ /datum/unit_test/organ_damage/proc/test_organ(mob/living/carbon/human/dummy, obj/item/organ/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, \ + // Tests [mob/living/proc/adjust_organ_loss] + TEST_ASSERT_EQUAL(dummy.adjust_organ_loss(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.") @@ -89,14 +89,14 @@ 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, \ + TEST_ASSERT_EQUAL(dummy.set_organ_loss(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, \ + // Tests [mob/living/proc/adjust_organ_loss] with a large max supplied + TEST_ASSERT_EQUAL(dummy.adjust_organ_loss(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.") @@ -124,3 +124,16 @@ var/obj/item/organ/brain = locate() in dummy.organs brain.forceMove(dummy.loc) allocated += brain + +/datum/unit_test/felinid_ears + +/datum/unit_test/felinid_ears/Run() + var/mob/living/carbon/human/normal_dummy = allocate(/mob/living/carbon/human/consistent) + normal_dummy.dna.features[FEATURE_EARS] = SPRITE_ACCESSORY_NONE + normal_dummy.set_species(/datum/species/human/felinid, pref_load = TRUE) + TEST_ASSERT(!istype(normal_dummy.get_organ_slot(ORGAN_SLOT_EARS), /obj/item/organ/ears/cat), "Felinid with NONE ears set had cat ears on species gain.") + TEST_ASSERT_NOTNULL(normal_dummy.get_organ_slot(ORGAN_SLOT_EARS), "Felinid with NONE ears set had NO ears on species gain.") + + var/mob/living/carbon/human/anime_dummy = allocate(/mob/living/carbon/human/consistent) + anime_dummy.set_species(/datum/species/human/felinid, pref_load = TRUE) + TEST_ASSERT(istype(anime_dummy.get_organ_slot(ORGAN_SLOT_EARS), /obj/item/organ/ears/cat), "Felinid with default ears set did not have cat ears on species gain.") diff --git a/code/modules/unit_tests/outfit_sanity.dm b/code/modules/unit_tests/outfit_sanity.dm index 79473a271674..0b1447abfba9 100644 --- a/code/modules/unit_tests/outfit_sanity.dm +++ b/code/modules/unit_tests/outfit_sanity.dm @@ -49,7 +49,7 @@ for (var/outfit_type in outfits_to_check) // Only make one human and keep undressing it because it's much faster - for (var/obj/item/I in H.get_equipped_items(INCLUDE_POCKETS)) + for (var/obj/item/I in H.get_equipped_items(INCLUDE_POCKETS|INCLUDE_ABSTRACT)) qdel(I) var/datum/outfit/outfit = new outfit_type diff --git a/code/modules/unit_tests/oxyloss_suffocation.dm b/code/modules/unit_tests/oxyloss_suffocation.dm index a44911ebbba7..94d234b4bb60 100644 --- a/code/modules/unit_tests/oxyloss_suffocation.dm +++ b/code/modules/unit_tests/oxyloss_suffocation.dm @@ -4,7 +4,7 @@ /datum/unit_test/oxyloss_suffocation/Run() var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) - dummy.setOxyLoss(75) + dummy.set_oxy_loss(75) TEST_ASSERT(HAS_TRAIT_FROM(dummy, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT), "Dummy should have been knocked out from taking oxy damage.") - dummy.setOxyLoss(0) + dummy.set_oxy_loss(0) TEST_ASSERT(!HAS_TRAIT_FROM(dummy, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT), "Dummy should have woken up from KO when healing to 0 oxy damage.") diff --git a/code/modules/unit_tests/projectiles.dm b/code/modules/unit_tests/projectiles.dm index 7c2b1c00aa8d..6980fc6247cf 100644 --- a/code/modules/unit_tests/projectiles.dm +++ b/code/modules/unit_tests/projectiles.dm @@ -28,7 +28,7 @@ loaded_bullet.def_zone = BODY_ZONE_CHEST var/did_we_shoot = test_gun.melee_attack_chain(gunner, victim) TEST_ASSERT(did_we_shoot, "Gun does not appeared to have successfully fired.") - TEST_ASSERT_EQUAL(victim.getBruteLoss(), expected_damage, "Victim took incorrect amount of damage, expected [expected_damage], got [victim.getBruteLoss()].") + TEST_ASSERT_EQUAL(victim.get_brute_loss(), expected_damage, "Victim took incorrect amount of damage, expected [expected_damage], got [victim.get_brute_loss()].") var/obj/item/bodypart/expected_part = victim.get_bodypart(BODY_ZONE_CHEST) TEST_ASSERT_EQUAL(expected_part.brute_dam, expected_damage, "Intended bodypart took incorrect amount of damage, either it hit another bodypart or armor was incorrectly applied. Expected [expected_damage], got [expected_part.brute_dam].") diff --git a/code/modules/unit_tests/reachable_soup.dm b/code/modules/unit_tests/reachable_soup.dm new file mode 100644 index 000000000000..809699d76717 --- /dev/null +++ b/code/modules/unit_tests/reachable_soup.dm @@ -0,0 +1,13 @@ +/datum/unit_test/reachable_soup + +/datum/unit_test/reachable_soup/Run() + var/obj/machinery/oven/range/range = EASY_ALLOCATE() + var/obj/item/reagent_containers/cup/soup_pot/soup = EASY_ALLOCATE() + var/mob/living/carbon/human/dummy = EASY_ALLOCATE() + + dummy.put_in_active_hand(soup) + click_wrapper(dummy, range) + TEST_ASSERT_EQUAL(soup.loc, range, "Soup pot should have been placed on the stove.") + + click_wrapper(dummy, soup) + TEST_ASSERT_EQUAL(soup.loc, dummy, "Soup pot should have been picked up by the dummy.") diff --git a/code/modules/unit_tests/reagent_mob_expose.dm b/code/modules/unit_tests/reagent_mob_expose.dm index 383225d3fabd..47350dffb854 100644 --- a/code/modules/unit_tests/reagent_mob_expose.dm +++ b/code/modules/unit_tests/reagent_mob_expose.dm @@ -6,9 +6,9 @@ /datum/reagent/method_patch_test/expose_mob(mob/living/target, methods = PATCH, reac_volume, show_message = TRUE) . = ..() if(methods & PATCH) - target.setBruteLoss(20) + target.set_brute_loss(20) if(methods & INJECT) - target.setBruteLoss(10) + target.set_brute_loss(10) /datum/unit_test/reagent_mob_expose/Run() // Life() is handled just by tests @@ -47,18 +47,18 @@ // PATCH human.fully_heal(ALL) - TEST_ASSERT_EQUAL(human.getBruteLoss(), 0, "Human health did not set properly") + TEST_ASSERT_EQUAL(human.get_brute_loss(), 0, "Human health did not set properly") patch.reagents.add_reagent(/datum/reagent/method_patch_test, 1) patch.self_delay = 0 patch.interact_with_atom(human, human) patch.get_embed().process(SSdcs.wait / 10) human.Life(SSMOBS_DT) - TEST_ASSERT_EQUAL(human.getBruteLoss(), 20, "Human health did not update after patch was applied") + TEST_ASSERT_EQUAL(human.get_brute_loss(), 20, "Human health did not update after patch was applied") // INJECT syringe.reagents.add_reagent(/datum/reagent/method_patch_test, 1) syringe.melee_attack_chain(human, human) - TEST_ASSERT_EQUAL(human.getBruteLoss(), 10, "Human health did not update after injection from syringe") + TEST_ASSERT_EQUAL(human.get_brute_loss(), 10, "Human health did not update after injection from syringe") // INHALE human.fully_heal(ALL) diff --git a/code/modules/unit_tests/recycle_recycling.dm b/code/modules/unit_tests/recycle_recycling.dm new file mode 100644 index 000000000000..38d3ed690c97 --- /dev/null +++ b/code/modules/unit_tests/recycle_recycling.dm @@ -0,0 +1,84 @@ +// Unit tests for recycler machine. + +/// Tests that holographic item are properly processed - deleted while preserving real contents. +/datum/unit_test/recycler_hologram + +/datum/unit_test/recycler_hologram/Run() + var/obj/machinery/recycler/recycler = allocate(/obj/machinery/recycler/deathtrap, get_step(run_loc_floor_bottom_left, EAST)) + var/obj/structure/closet/hologram_closet = allocate(/obj/structure/closet, run_loc_floor_bottom_left) + // Hologram closet that could contain non-holographic objects. + hologram_closet.flags_1 |= HOLOGRAM_1 + // Add real, non-holographic cookie. + var/obj/item/food/cookie/real_cookie = allocate(/obj/item/food/cookie, hologram_closet) + // And a real human being. + var/mob/living/carbon/human/assistant = allocate(/mob/living/carbon/human/consistent, hologram_closet) + // Abstract cookie won't be recycled. But will be deleted if the contents of hologram aren't managed. + real_cookie.item_flags |= ABSTRACT + // Process the hologram through the recycler. + hologram_closet.forceMove(get_turf(recycler)) + // Check that hologram was properly deleted. + TEST_ASSERT(QDELETED(hologram_closet), "Hologram item was not deleted after processing") + // Check that real items were moved to recycler location (not deleted). + TEST_ASSERT(!QDELETED(real_cookie), "Non-holographic contents of holographic object was incorrectly deleted with hologram") + // Check that mobs were moved to recycler location (not deleted). + TEST_ASSERT(!QDELETED(assistant), "Mob inside of holographic object was incorrectly deleted with hologram") + TEST_ASSERT_EQUAL(assistant.loc, get_turf(recycler), "Mob inside of holographic object was not moved to recycler location") + TEST_ASSERT_EQUAL(real_cookie.loc, get_turf(recycler), "Non-holographic contents of holographic object was not moved to recycler location") + +/// Tests that recycler properly handles indestructible item. +/datum/unit_test/recycler_indestructible_item + +/datum/unit_test/recycler_indestructible_item/Run() + var/obj/machinery/recycler/recycler = allocate(/obj/machinery/recycler/deathtrap, get_step(run_loc_floor_bottom_left, EAST)) + // Create indestructible cookie. + var/obj/item/food/cookie/indestructible_cookie = allocate(/obj/item/food/cookie, run_loc_floor_bottom_left) + indestructible_cookie.resistance_flags |= INDESTRUCTIBLE + // Try to process indestructible cookie. + indestructible_cookie.forceMove(get_turf(recycler)) + // Cookie should still exist. + TEST_ASSERT(!QDELETED(indestructible_cookie), "Indestructible item was recycled") + +/// Tests that recycler properly handles abstract item. +/datum/unit_test/recycler_abstract_item + +/datum/unit_test/recycler_abstract_item/Run() + var/obj/machinery/recycler/recycler = allocate(/obj/machinery/recycler/deathtrap, get_step(run_loc_floor_bottom_left, EAST)) + // Create abstract cookie. + var/obj/item/food/cookie/abstract_cookie = allocate(/obj/item/food/cookie, run_loc_floor_bottom_left) + abstract_cookie.item_flags |= ABSTRACT + // Try to process abstract cookie. + abstract_cookie.forceMove(get_turf(recycler)) + // Cookie should still exist. + TEST_ASSERT(!QDELETED(abstract_cookie), "Abstract item was recycled") + +/// Tests that brains trigger safety mode in the recycler. +/datum/unit_test/recycler_brain_safety + +/datum/unit_test/recycler_brain_safety/Run() + var/obj/machinery/recycler/recycler = allocate(/obj/machinery/recycler, get_step(run_loc_floor_bottom_left, EAST)) + var/mob/living/brain/test_brain = allocate(/mob/living/brain, run_loc_floor_bottom_left) + // Process brain - should trigger safety mode. + test_brain.forceMove(get_turf(recycler)) + // Should enter safety mode. + TEST_ASSERT(recycler.safety_mode, "Recycler did not enter safety mode when processing brain") + // Brain should not be deleted. + TEST_ASSERT(!QDELETED(test_brain), "Brain was incorrectly deleted in safety mode") + +/// Tests that MMI with brain triggers safety mode. +/datum/unit_test/recycler_mmi_with_brain_safety + +/datum/unit_test/recycler_mmi_with_brain_safety/Run() + var/obj/machinery/recycler/recycler = allocate(/obj/machinery/recycler, get_step(run_loc_floor_bottom_left, EAST)) + var/obj/item/mmi/test_mmi = allocate(/obj/item/mmi, run_loc_floor_bottom_left) + var/mob/living/brain/test_brain = allocate(/mob/living/brain, run_loc_floor_bottom_left) + // Insert brain into MMI. + test_mmi.brain = test_brain + test_brain.forceMove(test_mmi) + // Process MMI with brain - should trigger safety mode. + test_mmi.forceMove(get_turf(recycler)) + // Should enter safety mode. + TEST_ASSERT(recycler.safety_mode, "Recycler did not enter safety mode when processing MMI with brain") + // MMI should not be deleted. + TEST_ASSERT(!QDELETED(test_mmi), "MMI with brain was incorrectly deleted in safety mode") + // Brain should still be intact inside MMI. + TEST_ASSERT(!QDELETED(test_mmi.brain), "Brain was deleted during safety mode processing") diff --git a/code/modules/unit_tests/required_map_items.dm b/code/modules/unit_tests/required_map_items.dm index 498415ebf46f..55f37641ac87 100644 --- a/code/modules/unit_tests/required_map_items.dm +++ b/code/modules/unit_tests/required_map_items.dm @@ -5,15 +5,16 @@ * - Add the typepath(s) to setup_expected_types * - In the type's initialize, REGISTER_REQUIRED_MAP_ITEM() a minimum and maximum */ -/datum/unit_test/required_map_items +/datum/unit_test/maptest_required_map_items /// A list of all typepaths that we expect to be in the required items list var/list/expected_types = list() /// Used to fill the expected types list with all the types we look for on the map. /// This list will just be full of typepaths that we expect. /// More detailed information about each item (mainly, how much of each should exist) is set on a per item basis -/datum/unit_test/required_map_items/proc/setup_expected_types() +/datum/unit_test/maptest_required_map_items/proc/setup_expected_types() expected_types += /obj/item/blood_hunt + expected_types += /obj/effect/landmark/latejoin_masquerade // DARKPACK EDIT REMOVAL START // expected_types += subtypesof(/obj/item/stamp/head) // expected_types += subtypesof(/obj/machinery/modular_computer/preset/cargochat) @@ -26,7 +27,7 @@ // expected_types += /obj/item/piggy_bank/vault // DARKPACK EDIT REMOVAL END -/datum/unit_test/required_map_items/Run() +/datum/unit_test/maptest_required_map_items/Run() setup_expected_types() var/list/required_map_items = GLOB.required_map_items.Copy() diff --git a/code/modules/unit_tests/reskin_validation.dm b/code/modules/unit_tests/reskin_validation.dm new file mode 100644 index 000000000000..85e454058cea --- /dev/null +++ b/code/modules/unit_tests/reskin_validation.dm @@ -0,0 +1,15 @@ +/datum/unit_test/reskin_validation + +/datum/unit_test/reskin_validation/Run() + var/list/known_names = list() + for(var/datum/atom_skin/skin as anything in valid_subtypesof(/datum/atom_skin)) + if(isnull(skin::preview_name)) + TEST_FAIL("Reskin [skin] is missing a preview_name.") + // preview names are bundled by abstract types + else if(known_names["[skin::preview_name]-[skin::abstract_type]"]) + TEST_FAIL("Reskin [skin] has a duplicate preview_name [skin::preview_name].") + else + known_names["[skin::preview_name]-[skin::abstract_type]"] = TRUE + + if(skin::new_icon && skin::new_icon_state && !icon_exists(skin::new_icon, skin::new_icon_state)) + TEST_FAIL("Reskin [skin] has a new_icon_state [skin::new_icon_state] that does not exist in file [skin::new_icon].") diff --git a/code/modules/unit_tests/say.dm b/code/modules/unit_tests/say.dm index 9b75bf05dc9f..1e0e93fe9930 100644 --- a/code/modules/unit_tests/say.dm +++ b/code/modules/unit_tests/say.dm @@ -8,7 +8,7 @@ test("Hello", "Hello", list()) test(";HELP", "HELP", list(MODE_HEADSET = TRUE)) test(";%Never gonna give you up", "Never gonna give you up", list(MODE_HEADSET = TRUE, MODE_SING = TRUE)) - test(".s Gun plz", "Gun plz", list(RADIO_KEY = RADIO_KEY_SECURITY, RADIO_EXTENSION = RADIO_CHANNEL_SECURITY)) + test(".v Gun plz", "Gun plz", list(RADIO_KEY = RADIO_KEY_SERVICE, RADIO_EXTENSION = RADIO_CHANNEL_SERVICE)) // DARKPACK EDIT, ORIGINAL: test(".s Gun plz", "Gun plz", list(RADIO_KEY = RADIO_KEY_SECURITY, RADIO_TOKEN = RADIO_TOKEN_SECURITY)) test("...What", "...What", list()) /datum/unit_test/get_message_mods/proc/test(message, expected_message, list/expected_mods) diff --git a/code/modules/unit_tests/screenshot_digi.dm b/code/modules/unit_tests/screenshot_digi.dm index 835b2501c87a..8afb8a19a3b1 100644 --- a/code/modules/unit_tests/screenshot_digi.dm +++ b/code/modules/unit_tests/screenshot_digi.dm @@ -67,7 +67,7 @@ // finally, screenshot test of taking jumpsuit (everything) off // which should test that the autogen legs disappear (here to cover a bug in which it does not disappear) dummy.delete_equipment() - TEST_ASSERT_EQUAL(length(dummy.get_equipped_items()), 0, "Dummy (Ashwalker) should have no equipment!") + TEST_ASSERT_EQUAL(length(dummy.get_equipped_items(INCLUDE_POCKETS|INCLUDE_HELD)), 0, "Dummy (Ashwalker) should have no equipment!") finished_icon = icon(finished_icon) finished_icon.Insert(getFlatIcon(dummy, no_anim = TRUE), dir = SOUTH, frame = 9) diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png index 05c855569d35..923f43a2c5d8 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png index 06be971fc0c2..ac27e523905b 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_heretic.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_heretic.png index 9de46c93dc69..6a6584b31fb3 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_heretic.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_heretic.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png index 06be971fc0c2..ac27e523905b 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_high_luminosity_eyes_light_emissive.png b/code/modules/unit_tests/screenshots/screenshot_high_luminosity_eyes_light_emissive.png index 56ef8176ce6a..fbfcfadc2537 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_high_luminosity_eyes_light_emissive.png and b/code/modules/unit_tests/screenshots/screenshot_high_luminosity_eyes_light_emissive.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 e9251e73cc54..06a23dff00a1 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_moth.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_moth.png index ba18a7ec165b..355b74df6ace 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_moth.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_moth.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie.png index e9251e73cc54..06a23dff00a1 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious.png index e9251e73cc54..06a23dff00a1 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious.png differ diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index c95fed8129d0..aad4927e0ba2 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -31,9 +31,6 @@ /mob/living/simple_animal/hostile/asteroid/elite/pandora, /mob/living/simple_animal/hostile/asteroid/polarbear, /mob/living/simple_animal/hostile/asteroid/polarbear/lesser, - /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/megafauna, /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner, /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom, @@ -43,6 +40,7 @@ /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination, /mob/living/simple_animal/hostile/megafauna/clockwork_defender, /mob/living/simple_animal/hostile/megafauna/colossus, + /mob/living/simple_animal/hostile/megafauna/colossus/antediluvian, // DARKPACK EDIT ADD - Im sorry /mob/living/simple_animal/hostile/megafauna/demonic_frost_miner, /mob/living/simple_animal/hostile/megafauna/dragon, /mob/living/simple_animal/hostile/megafauna/dragon/lesser, @@ -54,6 +52,7 @@ /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/antediluvian, // DARKPACK EDIT ADD - Im sorry /mob/living/simple_animal/hostile/megafauna/wendigo/noportal, /mob/living/simple_animal/hostile/ooze, /mob/living/simple_animal/hostile/ooze/gelatinous, diff --git a/code/modules/unit_tests/spell_shapeshift.dm b/code/modules/unit_tests/spell_shapeshift.dm index 3b598e999420..593ba066f2fb 100644 --- a/code/modules/unit_tests/spell_shapeshift.dm +++ b/code/modules/unit_tests/spell_shapeshift.dm @@ -5,7 +5,7 @@ /datum/unit_test/shapeshift_spell_validity/Run() - var/list/types_to_test = subtypesof(/datum/action/cooldown/spell/shapeshift) + var/list/types_to_test = valid_subtypesof(/datum/action/cooldown/spell/shapeshift) // DARKPACK EDIT CHANGE for(var/spell_type in types_to_test) var/datum/action/cooldown/spell/shapeshift/shift = new spell_type() @@ -30,7 +30,7 @@ var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent, run_loc_floor_bottom_left) dummy.mind_initialize() - for(var/spell_type in subtypesof(/datum/action/cooldown/spell/shapeshift)) + for(var/spell_type in valid_subtypesof(/datum/action/cooldown/spell/shapeshift)) // DARKPACK EDIT CHANGE // Test all shapeshifts as if they were on the mob's body var/datum/action/cooldown/spell/shapeshift/bodybound_shift = new spell_type(dummy) bodybound_shift.Grant(dummy) @@ -111,7 +111,7 @@ /datum/unit_test/shapeshift_health /datum/unit_test/shapeshift_health/Run() - for(var/spell_type in subtypesof(/datum/action/cooldown/spell/shapeshift)) + for(var/spell_type in valid_subtypesof(/datum/action/cooldown/spell/shapeshift)) // DARKPACK EDIT CHANGE var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent, run_loc_floor_bottom_left) var/datum/action/cooldown/spell/shapeshift/shift_spell = new spell_type(dummy) shift_spell.Grant(dummy) diff --git a/code/modules/unit_tests/station_trait_tests.dm b/code/modules/unit_tests/station_trait_tests.dm index 21173e152d75..7b3557be9354 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 as anything in subtypesof(/datum/job)) + for(var/datum/job/job as anything in subtypesof(/datum/job) - typesof(/datum/job/vampire)) // DARKPACK EDIT, ORIGINAL: for(var/datum/job/job as anything in subtypesof(/datum/job)) if(!(initial(job.job_flags) & JOB_CREW_MEMBER)) continue if((initial(job.job_flags) & STATION_TRAIT_JOB_FLAGS) == STATION_TRAIT_JOB_FLAGS) diff --git a/code/modules/unit_tests/status_effect_validity.dm b/code/modules/unit_tests/status_effect_validity.dm index 44c7b3916100..e9c7cd70c90b 100644 --- a/code/modules/unit_tests/status_effect_validity.dm +++ b/code/modules/unit_tests/status_effect_validity.dm @@ -8,23 +8,95 @@ var/tick_speed = initial(checking.tick_interval) if(tick_speed == STATUS_EFFECT_NO_TICK) continue + if(tick_speed < 0) + TEST_FAIL("Status effect [checking] has tick_interval set to a negative value other than STATUS_EFFECT_NO_TICK, this is not how you prevent ticks - use tick_interval = STATUS_EFFECT_NO_TICK instead.") + continue if(tick_speed == INFINITY) TEST_FAIL("Status effect [checking] has tick_interval set to INFINITY, this is not how you prevent ticks - use tick_interval = STATUS_EFFECT_NO_TICK instead.") continue switch(initial(checking.processing_speed)) if(STATUS_EFFECT_FAST_PROCESS) - if(tick_speed < SSfastprocess.wait && tick_speed != STATUS_EFFECT_AUTO_TICK) - TEST_FAIL("Status effect [checking] has tick_interval set to [tick_speed], which is faster than SSfastprocess can tick ([SSfastprocess.wait]).") + if(tick_speed % SSfastprocess.wait != 0 && tick_speed != STATUS_EFFECT_AUTO_TICK) + TEST_FAIL("Status effect [checking] has tick_interval set to [tick_speed], which is not a multiple of SSfastprocess wait time ([SSfastprocess.wait]).") + if(STATUS_EFFECT_NORMAL_PROCESS) + if(tick_speed % SSprocessing.wait != 0 && tick_speed != STATUS_EFFECT_AUTO_TICK) + TEST_FAIL("Status effect [checking] has tick_interval set to [tick_speed], which is not a multiple of SSprocessing wait time ([SSprocessing.wait]).") + if(STATUS_EFFECT_PRIORITY) + var/priority_wait = world.tick_lag * SSpriority_effects.wait // SSpriority_effects has the SS_TICKER flag, so its wait is in ticks, so we have to convert it to deciseconds. + if(tick_speed % priority_wait != 0 && tick_speed != STATUS_EFFECT_AUTO_TICK) + TEST_FAIL("Status effect [checking] has tick_interval set to [tick_speed], which is not a multiple of SSpriority_effects wait time ([priority_wait]).") + else + TEST_FAIL("Invalid processing speed for status effect [checking] : [initial(checking.processing_speed)]") + +/// Validates status effect duration setup +/datum/unit_test/status_effect_duration + +/datum/unit_test/status_effect_duration/Run() + for(var/datum/status_effect/checking as anything in subtypesof(/datum/status_effect)) + if(initial(checking.id) == STATUS_EFFECT_ID_ABSTRACT) + continue + var/duration = initial(checking.duration) + if(duration == STATUS_EFFECT_PERMANENT) + continue + if(duration == INFINITY) // for some god forsaken reason, this is allowed + continue + if(duration < 0) + TEST_FAIL("Status effect [checking] has duration set to a negative value other than STATUS_EFFECT_PERMANENT, this is not how you make effects last forever - use duration = STATUS_EFFECT_PERMANENT instead.") + continue + switch(initial(checking.processing_speed)) + if(STATUS_EFFECT_FAST_PROCESS) + if(duration % SSfastprocess.wait != 0) + TEST_FAIL("Status effect [checking] has duration set to [duration], which is not a multiple of SSfastprocess wait time ([SSfastprocess.wait]).") if(STATUS_EFFECT_NORMAL_PROCESS) - if(tick_speed < SSprocessing.wait && tick_speed != STATUS_EFFECT_AUTO_TICK) - TEST_FAIL("Status effect [checking] has tick_interval set to [tick_speed], which is faster than SSprocessing can tick ([SSprocessing.wait]).") + if(duration % SSprocessing.wait != 0) + TEST_FAIL("Status effect [checking] has duration set to [duration], which is not a multiple of SSprocessing wait time ([SSprocessing.wait]).") if(STATUS_EFFECT_PRIORITY) var/priority_wait = world.tick_lag * SSpriority_effects.wait // SSpriority_effects has the SS_TICKER flag, so its wait is in ticks, so we have to convert it to deciseconds. - if(tick_speed < priority_wait && tick_speed != STATUS_EFFECT_AUTO_TICK) - TEST_FAIL("Status effect [checking] has tick_interval set to [tick_speed], which is faster than SSpriority_effects can tick ([priority_wait]).") + if(duration % priority_wait != 0) + TEST_FAIL("Status effect [checking] has duration set to [duration], which is not a multiple of SSpriority_effects wait time ([priority_wait]).") else TEST_FAIL("Invalid processing speed for status effect [checking] : [initial(checking.processing_speed)]") +/// Validates that status effect tick counts are directly proportional to duration, and that seconds_between_ticks added up is equal to duration. +/datum/unit_test/status_effect_tick_counts + +/datum/unit_test/status_effect_tick_counts/Run() + var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human/consistent, run_loc_floor_bottom_left) + + var/datum/status_effect/unit_test_tick_counter/counter = user.apply_status_effect(/datum/status_effect/unit_test_tick_counter) + + // The 0.2 here and in the for loop is arbitrary and can be any value that divides evenly into the duration and tick interval of the unit test status effect. + // I chose 0.2 specifically because it just happens to be the SSfastprocess.wait in seconds, which basically simulates this status effect running on SSfastprocess. + var/ticks_required = counter.duration / 10 / 0.2 + 1 + + for (var/i in 1 to ticks_required) + if (!QDELETED(counter)) + counter.process(0.2) + + var/expected_tick_count = initial(counter.duration) / counter.tick_interval + if (abs(counter.total_tick_count - expected_tick_count) > 0.01) + TEST_FAIL("Status effect tick count is not directly proportional to duration. Expected [expected_tick_count] ticks, got [counter.total_tick_count] ticks.") + + var/expected_seconds = initial(counter.duration) / 10 + if (abs(counter.total_seconds - expected_seconds) > 0.01) + TEST_FAIL("Status effect seconds_between_ticks accumulated together does not equal duration. Expected [expected_seconds] seconds, got [counter.total_seconds] seconds.") + + QDEL_NULL(counter) + +/datum/status_effect/unit_test_tick_counter + duration = 10 SECONDS + tick_interval = 0.4 SECONDS + + id = "unit_test_tick_counter" + alert_type = null + + var/total_tick_count = 0 + var/total_seconds = 0 + +/datum/status_effect/unit_test_tick_counter/tick(seconds_between_ticks) + total_tick_count++ + total_seconds += seconds_between_ticks + /// Validates status effect alert type setup /datum/unit_test/status_effect_alert diff --git a/code/modules/unit_tests/strange_reagent.dm b/code/modules/unit_tests/strange_reagent.dm index bcdf89f0a9c8..deb46c96a0d7 100644 --- a/code/modules/unit_tests/strange_reagent.dm +++ b/code/modules/unit_tests/strange_reagent.dm @@ -74,15 +74,15 @@ /datum/unit_test/strange_reagent/proc/damage_target_to_percentage(mob/living/target, percent) var/damage = target_max_health * percent * 0.5 - target.setBruteLoss(damage, updating_health=FALSE) // no point running health update logic here - target.setFireLoss(damage, updating_health=TRUE) // since we do it here + target.set_brute_loss(damage, updating_health=FALSE) // no point running health update logic here + target.set_fire_loss(damage, updating_health=TRUE) // since we do it here update_amounts(target) if(percent >= 1) target.death() return TRUE /datum/unit_test/strange_reagent/proc/get_target_organic_health_manual(mob/living/target) - return target.getMaxHealth() - (target.getBruteLoss() + target.getFireLoss()) + return target.getMaxHealth() - (target.get_brute_loss() + target.get_fire_loss()) /datum/unit_test/strange_reagent/proc/test_damage_but_no_death(target_type) var/mob/living/target = allocate_new_target(target_type) diff --git a/code/modules/unit_tests/style_hotswapping.dm b/code/modules/unit_tests/style_hotswapping.dm new file mode 100644 index 000000000000..33063eb888f6 --- /dev/null +++ b/code/modules/unit_tests/style_hotswapping.dm @@ -0,0 +1,43 @@ +/// Ensures that hotswapping only occurs when hitting inventory items and allows item interactions to go through +/datum/unit_test/style_hotswapping + +/datum/unit_test/style_hotswapping/Run() + var/mob/living/carbon/human/john_ultrakill = allocate(/mob/living/carbon/human/consistent) + var/obj/item/storage/backpack/bag = allocate(__IMPLIED_TYPE__, john_ultrakill.loc) + john_ultrakill.equip_to_slot(bag, ITEM_SLOT_BACK) + TEST_ASSERT_EQUAL(john_ultrakill.get_item_by_slot(ITEM_SLOT_BACK), bag, "Human wasn't able to equip a backpack!") + var/datum/component/style/style = john_ultrakill.AddComponent(/datum/component/style) + try_stabilize(john_ultrakill, john_ultrakill.loc, "while it was on the user's turf") + try_stabilize(john_ultrakill, bag, "while it was in the user's bag") + var/obj/item/coin/gold/coin_one = allocate(__IMPLIED_TYPE__, john_ultrakill.loc) + var/obj/item/coin/silver/coin_two = allocate(__IMPLIED_TYPE__, john_ultrakill.loc) + coin_two.forceMove(bag) + john_ultrakill.put_in_active_hand(coin_one, TRUE) + TEST_ASSERT_EQUAL(john_ultrakill.get_active_held_item(), coin_one, "Human wasn't able to pick up a gold coin!") + john_ultrakill.ClickOn(coin_two) + TEST_ASSERT_EQUAL(john_ultrakill.get_active_held_item(), coin_one, "Human hotswapped from their storage despite not having enough points!") + john_ultrakill.next_click = 0 + john_ultrakill.next_move = 0 + john_ultrakill.temporarilyRemoveItemFromInventory(coin_one, TRUE) + QDEL_NULL(coin_one) + style.style_points = INFINITY + style.update_screen(style.point_to_rank()) + try_stabilize(john_ultrakill, john_ultrakill.loc, "while it was on the user's turf with hotswapping active") + try_stabilize(john_ultrakill, bag, "while it was in the user's bag with hotswapping active") + coin_one = allocate(__IMPLIED_TYPE__, john_ultrakill.loc) + john_ultrakill.put_in_active_hand(coin_one, TRUE) + TEST_ASSERT_EQUAL(john_ultrakill.get_active_held_item(), coin_one, "Human wasn't able to pick up a gold coin!") + john_ultrakill.ClickOn(coin_two) + TEST_ASSERT_EQUAL(john_ultrakill.get_active_held_item(), coin_two, "Human wasn't able to hotswap with their storage!") + +/datum/unit_test/style_hotswapping/proc/try_stabilize(mob/living/carbon/human/john_ultrakill, core_loc, desc = null) + var/obj/item/organ/monster_core/regenerative_core/legion/core = allocate(__IMPLIED_TYPE__, john_ultrakill.loc) + core.forceMove(core_loc) + TEST_ASSERT(core.decay_timer, "Legion core spawned without a decay timer!") + var/obj/item/mining_stabilizer/serum = allocate(__IMPLIED_TYPE__, john_ultrakill.loc) + john_ultrakill.put_in_active_hand(serum, TRUE) + TEST_ASSERT_EQUAL(john_ultrakill.get_active_held_item(), serum, "Human wasn't able to pick up a stabilizer serum!") + john_ultrakill.ClickOn(core) + TEST_ASSERT(!core.decay_timer, "Clicking on a legion core with a serum did not stabilize it [desc]!") + john_ultrakill.next_click = 0 + john_ultrakill.next_move = 0 diff --git a/code/modules/unit_tests/suit_sensor.dm b/code/modules/unit_tests/suit_sensor.dm new file mode 100644 index 000000000000..6e8df2b9a9f1 --- /dev/null +++ b/code/modules/unit_tests/suit_sensor.dm @@ -0,0 +1,43 @@ +///Test that ensures that basic functions and interactions around suit sensors are working +/datum/unit_test/suit_sensor + +/datum/unit_test/suit_sensor/Run() + var/mob/living/carbon/human/consistent/dummy = allocate(__IMPLIED_TYPE__) + var/obj/item/clothing/under/sensor_test/under = allocate(__IMPLIED_TYPE__) + + dummy.equip_to_slot_or_del(under, ITEM_SLOT_ICLOTHING) + + TEST_ASSERT(under.set_sensor_mode(SENSOR_LIVING), "couldn't set the suit sensor mode to '[GLOB.suit_sensor_mode_to_defines[SENSOR_LIVING + 1]]'") + TEST_ASSERT((dummy in GLOB.suit_sensors_list), "couldn't find the dummy in the GLOB.suit_sensors_list") + + var/obj/item/wirecutters/cutter = allocate(__IMPLIED_TYPE__) + dummy.put_in_active_hand(cutter, forced = TRUE) + click_wrapper(dummy, under) //cut sensor + TEST_ASSERT_EQUAL(under.has_sensor, NO_SENSORS, "couldn't properly cut suit sensor from the jumpsuit") + + var/obj/item/suit_sensor/sensor = dummy.is_holding_item_of_type(__IMPLIED_TYPE__) + TEST_ASSERT(sensor, "dummy isn't holding the cut sensor") + //we set it to sensor_living before, remember? + TEST_ASSERT_EQUAL(sensor.sensor_mode, SENSOR_LIVING, "cut sensor isn't set to '[GLOB.suit_sensor_mode_to_defines[SENSOR_LIVING + 1]]'") + TEST_ASSERT(sensor.set_mode(SENSOR_OFF), "couldn't set cut sensor's mode to '[GLOB.suit_sensor_mode_to_defines[SENSOR_OFF + 1]]'") + sensor.emp_act(EMP_HEAVY) + TEST_ASSERT(sensor.broken, "cut sensor wasn't broken by EMP") + + dummy.dropItemToGround(cutter) //thank you for your service, wirecutters o7 + var/obj/item/stack/cable_coil/thirty/coil = allocate(__IMPLIED_TYPE__) + dummy.put_in_active_hand(coil, forced = TRUE) + click_wrapper(dummy, sensor) //fix sensor + TEST_ASSERT(!sensor.broken, "cut sensor couldn't be fixed by cable coil") + + dummy.swap_hand(dummy.get_held_index_of_item(sensor)) + click_wrapper(dummy, under) //install sensor + TEST_ASSERT_EQUAL(under.has_sensor, HAS_SENSORS, "couldn't properly install suit sensor on the jumpsuit") + under.emp_act(EMP_HEAVY) + TEST_ASSERT_EQUAL(under.has_sensor, BROKEN_SENSORS, "the jumpsuit sensor wasn't broken by EMP") + dummy.swap_hand(dummy.get_held_index_of_item(coil)) + click_wrapper(dummy, under) //fix sensor, again + TEST_ASSERT_EQUAL(under.has_sensor, HAS_SENSORS, "couldn't fix the jumpsuit sensor with cable coil") + + +/obj/item/clothing/under/sensor_test + random_sensor = FALSE diff --git a/code/modules/unit_tests/surgeries.dm b/code/modules/unit_tests/surgeries.dm index 8d2901bf77ff..6cb9cc11eed2 100644 --- a/code/modules/unit_tests/surgeries.dm +++ b/code/modules/unit_tests/surgeries.dm @@ -1,13 +1,13 @@ /datum/unit_test/amputation/Run() var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human/consistent) var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human/consistent) + var/obj/item/circular_saw/saw = allocate(/obj/item/circular_saw) TEST_ASSERT_EQUAL(patient.get_missing_limbs().len, 0, "Patient is somehow missing limbs before surgery") - var/datum/surgery/amputation/surgery = new(patient, BODY_ZONE_R_ARM, patient.get_bodypart(BODY_ZONE_R_ARM)) + var/datum/surgery_operation/limb/amputate/surgery = GLOB.operations.operations_by_typepath[__IMPLIED_TYPE__] - var/datum/surgery_step/sever_limb/sever_limb = new - sever_limb.success(user, patient, BODY_ZONE_R_ARM, null, surgery) + UNLINT(surgery.success(patient.get_bodypart(BODY_ZONE_R_ARM), user, saw, list())) TEST_ASSERT_EQUAL(patient.get_missing_limbs().len, 1, "Patient did not lose any limbs") TEST_ASSERT_EQUAL(patient.get_missing_limbs()[1], BODY_ZONE_R_ARM, "Patient is missing a limb that isn't the one we operated on") @@ -15,14 +15,15 @@ /datum/unit_test/brain_surgery/Run() var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human/consistent) patient.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_SURGERY) - patient.setOrganLoss(ORGAN_SLOT_BRAIN, 20) + patient.set_organ_loss(ORGAN_SLOT_BRAIN, 20) TEST_ASSERT(patient.has_trauma_type(), "Patient does not have any traumas, despite being given one") var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human/consistent) + var/obj/item/hemostat/hemostat = allocate(/obj/item/hemostat) - var/datum/surgery_step/fix_brain/fix_brain = new - fix_brain.success(user, patient) + var/datum/surgery_operation/organ/repair/brain/surgery = GLOB.operations.operations_by_typepath[__IMPLIED_TYPE__] + UNLINT(surgery.success(patient.get_organ_slot(ORGAN_SLOT_BRAIN), user, hemostat, list())) TEST_ASSERT(!patient.has_trauma_type(), "Patient kept their brain trauma after brain surgery") TEST_ASSERT(patient.get_organ_loss(ORGAN_SLOT_BRAIN) < 20, "Patient did not heal their brain damage after brain surgery") @@ -56,68 +57,83 @@ TEST_ASSERT_EQUAL(bobs_head.real_name, "Bob", "Bob's head does not remember that it is from Bob") // Put Bob's head onto Alice's body - var/datum/surgery_step/add_prosthetic/add_prosthetic = new + var/datum/surgery_operation/prosthetic_replacement/surgery = GLOB.operations.operations_by_typepath[__IMPLIED_TYPE__] user.put_in_active_hand(bobs_head) - add_prosthetic.success(user, alice, BODY_ZONE_HEAD, bobs_head) + UNLINT(surgery.success(alice.get_bodypart(BODY_ZONE_CHEST), user, bobs_head, list())) 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.real_name, "Bob", "Bob's head was transplanted onto Alice's body, but their name is not Bob") // DARKPACK EDIT, ORIGINAL: 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) + var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human/consistent/slow) + ADD_TRAIT(user, TRAIT_HIPPOCRATIC_OATH, TRAIT_SOURCE_UNIT_TESTS) + var/mob/living/carbon/human/patient_zero = allocate(/mob/living/carbon/human/consistent) var/mob/living/carbon/human/patient_one = allocate(/mob/living/carbon/human/consistent) - var/obj/item/scalpel/scalpel = allocate(/obj/item/scalpel) + patient_zero.set_body_position(LYING_DOWN) + patient_one.set_body_position(LYING_DOWN) + + ADD_TRAIT(patient_zero, TRAIT_READY_TO_OPERATE, TRAIT_SOURCE_UNIT_TESTS) + ADD_TRAIT(patient_one, TRAIT_READY_TO_OPERATE, TRAIT_SOURCE_UNIT_TESTS) + + var/obj/item/bodypart/chest/patient_zero_chest = patient_zero.get_bodypart(BODY_ZONE_CHEST) + var/obj/item/bodypart/chest/patient_one_chest = patient_one.get_bodypart(BODY_ZONE_CHEST) - var/datum/surgery_step/incise/surgery_step = new - var/datum/surgery/organ_manipulation/surgery_for_zero = new + ADD_TRAIT(patient_zero_chest, TRAIT_READY_TO_OPERATE, TRAIT_SOURCE_UNIT_TESTS) + ADD_TRAIT(patient_one_chest, TRAIT_READY_TO_OPERATE, TRAIT_SOURCE_UNIT_TESTS) - INVOKE_ASYNC(surgery_step, TYPE_PROC_REF(/datum/surgery_step, initiate), user, patient_zero, BODY_ZONE_CHEST, scalpel, surgery_for_zero) - TEST_ASSERT(surgery_for_zero.step_in_progress, "Surgery on patient zero was not initiated") + var/obj/item/scalpel/scalpel = allocate(/obj/item/scalpel) + user.put_in_active_hand(scalpel) + + ASYNC + user.perform_surgery(patient_zero, scalpel) - var/datum/surgery/organ_manipulation/surgery_for_one = new + TEST_ASSERT(DOING_INTERACTION(user, patient_zero), "User is not performing surgery on patient zero as expected") - // Without waiting for the incision to complete, try to start a new surgery - TEST_ASSERT(!surgery_step.initiate(user, patient_one, BODY_ZONE_CHEST, scalpel, surgery_for_one), "Was allowed to start a second surgery without the rod of asclepius") - TEST_ASSERT(!surgery_for_one.step_in_progress, "Surgery for patient one is somehow in progress, despite not initiating") + ASYNC + user.perform_surgery(patient_one, scalpel) - user.apply_status_effect(/datum/status_effect/hippocratic_oath) - INVOKE_ASYNC(surgery_step, TYPE_PROC_REF(/datum/surgery_step, initiate), user, patient_one, BODY_ZONE_CHEST, scalpel, surgery_for_one) - TEST_ASSERT(surgery_for_one.step_in_progress, "Surgery on patient one was not initiated, despite having rod of asclepius") + TEST_ASSERT(DOING_INTERACTION(user, patient_one), "User is not able to perform surgery on two patients at once despite having the Hippocratic Oath trait") -/// Ensures that the tend wounds surgery can be started +// Ensures that the tend wounds surgery can be started /datum/unit_test/start_tend_wounds /datum/unit_test/start_tend_wounds/Run() var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human/consistent) var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human/consistent) + var/obj/item/hemostat/hemostat = allocate(/obj/item/hemostat) + + patient.set_body_position(LYING_DOWN) - var/datum/surgery/surgery = new /datum/surgery/healing/brute/basic + ADD_TRAIT(patient, TRAIT_READY_TO_OPERATE, TRAIT_SOURCE_UNIT_TESTS) + var/obj/item/bodypart/chest/patient_chest = patient.get_bodypart(BODY_ZONE_CHEST) + ADD_TRAIT(patient_chest, TRAIT_READY_TO_OPERATE, TRAIT_SOURCE_UNIT_TESTS) - if (!surgery.can_start(user, patient)) - TEST_FAIL("Can't start basic tend wounds!") + var/datum/surgery_operation/basic/tend_wounds/surgery = GLOB.operations.operations_by_typepath[__IMPLIED_TYPE__] + TEST_ASSERT(!surgery.check_availability(patient, patient, user, hemostat, BODY_ZONE_CHEST), "Tend wounds surgery was available on an undamaged, unoperated patient") - qdel(surgery) + patient.take_overall_damage(10, 10) + TEST_ASSERT(!surgery.check_availability(patient, patient, user, hemostat, BODY_ZONE_CHEST), "Tend wounds surgery was available on a damaged but unoperated patient") + + patient_chest.add_surgical_state(SURGERY_SKIN_OPEN|SURGERY_VESSELS_CLAMPED) + TEST_ASSERT(surgery.check_availability(patient, patient, user, hemostat, BODY_ZONE_CHEST), "Tend wounds surgery was not available on a damaged, operated patient") /datum/unit_test/tend_wounds/Run() var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human/consistent) patient.take_overall_damage(100, 100) var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human/consistent) + var/obj/item/hemostat/hemostat = allocate(/obj/item/hemostat) // Test that tending wounds actually lowers damage - var/datum/surgery_step/heal/brute/basic/basic_brute_heal = new - basic_brute_heal.success(user, patient, BODY_ZONE_CHEST) - TEST_ASSERT(patient.getBruteLoss() < 100, "Tending brute wounds didn't lower brute damage ([patient.getBruteLoss()])") - - var/datum/surgery_step/heal/burn/basic/basic_burn_heal = new - basic_burn_heal.success(user, patient, BODY_ZONE_CHEST) - TEST_ASSERT(patient.getFireLoss() < 100, "Tending burn wounds didn't lower burn damage ([patient.getFireLoss()])") + var/datum/surgery_operation/basic/tend_wounds/surgery = GLOB.operations.operations_by_typepath[__IMPLIED_TYPE__] + UNLINT(surgery.success(patient, user, hemostat, list("[OPERATION_BRUTE_HEAL]" = 10, "[OPERATION_BRUTE_MULTIPLIER]" = 0.1))) + TEST_ASSERT(patient.get_brute_loss() < 100, "Tending brute wounds didn't lower brute damage ([patient.get_brute_loss()])") // Test that wearing clothing lowers heal amount var/mob/living/carbon/human/naked_patient = allocate(/mob/living/carbon/human/consistent) @@ -127,7 +143,104 @@ clothed_patient.equipOutfit(/datum/outfit/job/doctor, TRUE) clothed_patient.take_overall_damage(100) - basic_brute_heal.success(user, naked_patient, BODY_ZONE_CHEST) - basic_brute_heal.success(user, clothed_patient, BODY_ZONE_CHEST) + UNLINT(surgery.success(naked_patient, user, hemostat, list("[OPERATION_BRUTE_HEAL]" = 10, "[OPERATION_BRUTE_MULTIPLIER]" = 0.1))) + UNLINT(surgery.success(clothed_patient, user, hemostat, list("[OPERATION_BRUTE_HEAL]" = 10, "[OPERATION_BRUTE_MULTIPLIER]" = 0.1))) + + TEST_ASSERT(naked_patient.get_brute_loss() < clothed_patient.get_brute_loss(), "Naked patient did not heal more from wounds tending than a clothed patient") + +/// Tests items-as-prosthetic-limbs can apply +/datum/unit_test/prosthetic_item + +/datum/unit_test/prosthetic_item/Run() + var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human/consistent) + var/obj/item/claymore/sword = allocate(/obj/item/claymore) + + patient.make_item_prosthetic(sword) + + TEST_ASSERT(HAS_TRAIT_FROM(sword, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT), "Prosthetic item attachment failed! Item does not have the nodrop trait") + +/// Specifically checks the chainsaw nullrod +/datum/unit_test/prosthetic_item/nullrod + +/datum/unit_test/prosthetic_item/nullrod/Run() + var/mob/living/carbon/human/picker = allocate(/mob/living/carbon/human/consistent) + var/obj/item/nullrod/chainsaw/nullrod = allocate(/obj/item/nullrod/chainsaw) + + nullrod.on_selected(null, null, picker) + + TEST_ASSERT(HAS_TRAIT_FROM(nullrod, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT), "Chainsaw nullrod item attachment failed! Item does not have the nodrop trait") + +/// Checks all operations have a name and description +/datum/unit_test/verify_surgery_setup + +/datum/unit_test/verify_surgery_setup/Run() + for(var/datum/surgery_operation/operation as anything in GLOB.operations.get_instances_from(subtypesof(/datum/surgery_operation), filter_replaced = FALSE)) + if (isnull(operation.name)) + TEST_FAIL("Surgery operation [operation.type] has no name set") + if (isnull(operation.desc)) + TEST_FAIL("Surgery operation [operation.type] has no description set") + +/// Checks replaced surgeries are filtered out correctly +/datum/unit_test/verify_surgery_replacements + +/datum/unit_test/verify_surgery_replacements/Run() + for(var/datum/surgery_operation/operation as anything in GLOB.operations.get_instances_from(subtypesof(/datum/surgery_operation), filter_replaced = TRUE)) + if(!operation.replaced_by || operation.replaced_by.type == operation.type) + continue + TEST_FAIL("Surgery operation [operation.type] is marked as replaced by [operation.replaced_by.type], \ + but the operation was not correctly filtered by get_instances.") + +/// Tests that make incision shows up when expected +/datum/unit_test/incision_check + +/datum/unit_test/incision_check/Run() + var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/surgeon = allocate(/mob/living/carbon/human/consistent) + var/obj/item/scalpel/scalpel = allocate(/obj/item/scalpel) + var/obj/item/bodypart/chest/chest = patient.get_bodypart(BODY_ZONE_CHEST) + var/list/operations + + ADD_TRAIT(patient, TRAIT_READY_TO_OPERATE, TRAIT_SOURCE_UNIT_TESTS) + ADD_TRAIT(chest, TRAIT_READY_TO_OPERATE, TRAIT_SOURCE_UNIT_TESTS) + + surgeon.put_in_active_hand(scalpel) + operations = surgeon.get_available_operations(patient, scalpel, BODY_ZONE_CHEST) + TEST_ASSERT_EQUAL(length(operations), 0, "Surgery operations were available on a standing patient") + + patient.set_body_position(LYING_DOWN) + operations = surgeon.get_available_operations(patient, scalpel, BODY_ZONE_CHEST) + if(length(operations) > 1) + TEST_FAIL("More operations than expected were available on the patient") + return + + if(length(operations) == 1) + var/list/found_operation_data = operations[operations[1]] + var/datum/surgery_operation/operation = found_operation_data[1] + var/atom/movable/operating_on = found_operation_data[2] + TEST_ASSERT_EQUAL(operation.type, /datum/surgery_operation/limb/incise_skin, "The available surgery operation was not \"make incision\"") + TEST_ASSERT_EQUAL(operating_on, patient.get_bodypart(BODY_ZONE_CHEST), "The available surgery operation was not on the chest bodypart") + return + + TEST_ASSERT_EQUAL(patient.body_position, LYING_DOWN, "Patient is not lying down as expected") + + var/datum/surgery_operation/incise_operation = GLOB.operations.operations_by_typepath[/datum/surgery_operation/limb/incise_skin] + var/atom/movable/operate_on = incise_operation.get_operation_target(patient, BODY_ZONE_CHEST) + TEST_ASSERT_EQUAL(operate_on, patient.get_bodypart(BODY_ZONE_CHEST), "Incise skin operation did not return the chest bodypart as a valid operation target") + + if(incise_operation.check_availability(patient, operate_on, surgeon, scalpel, BODY_ZONE_CHEST)) + TEST_FAIL("Make incision operation was not found among available operations despite being available") + else + TEST_FAIL("Make incision operation was not available when it should have been") + +/// Checks is_location_accessible works as intended +/datum/unit_test/location_accessibility + +/datum/unit_test/location_accessibility/Run() + var/mob/living/carbon/human/test_mob = allocate(/mob/living/carbon/human/consistent) + + test_mob.equipOutfit(/datum/outfit/job/assistant/consistent) + TEST_ASSERT(!test_mob.is_location_accessible(BODY_ZONE_CHEST), "Chest should be inaccessible when wearing a jumpsuit") - TEST_ASSERT(naked_patient.getBruteLoss() < clothed_patient.getBruteLoss(), "Naked patient did not heal more from wounds tending than a clothed patient") + var/obj/item/clothing/under/jumpsuit = test_mob.get_item_by_slot(ITEM_SLOT_ICLOTHING) + jumpsuit.adjust_to_alt() + TEST_ASSERT(test_mob.is_location_accessible(BODY_ZONE_CHEST), "Chest should be accessible after rolling jumpsuit down") diff --git a/code/modules/unit_tests/tail_wag.dm b/code/modules/unit_tests/tail_wag.dm index 595e31895210..03b921ac01bc 100644 --- a/code/modules/unit_tests/tail_wag.dm +++ b/code/modules/unit_tests/tail_wag.dm @@ -92,7 +92,7 @@ TEST_FAIL("Tail did not start wagging when it should have!") // kill the mob, see if it stops wagging - dummy.adjustBruteLoss(9001) + dummy.adjust_brute_loss(9001) if(dummy_tail.wag_flags & WAG_WAGGING) TEST_FAIL("A mob's tail was still wagging after being killed!") diff --git a/code/modules/unit_tests/trash_food.dm b/code/modules/unit_tests/trash_food.dm new file mode 100644 index 000000000000..8b545d5a751b --- /dev/null +++ b/code/modules/unit_tests/trash_food.dm @@ -0,0 +1,34 @@ +/// Checks to make sure all food trash is included in /obj/effect/spawner/random/trash/food_packaging +/datum/unit_test/trash_food + +/datum/unit_test/trash_food/Run() + var/list/food_trash = /obj/effect/spawner/random/trash/food_packaging::loot + // list of pieces of trash we never want to include because they are special or rare (usually mutated botany plants) + var/list/food_trash_blacklist = list( + // already added to botanical_waste spawner or too exotic + /obj/item/grown/bananapeel, + /obj/item/grown/bananapeel/bombanana, + /obj/item/grown/bananapeel/mimanapeel, + /obj/item/grown/bananapeel/bluespace, + /obj/item/food/grown/bungopit, + /obj/item/food/egg, + /obj/item/gun/ballistic/revolver/peashooter, + /obj/item/grown/corncob, + /obj/item/grown/corncob/pepper, + // misc waste products that don't belong in trash spawner + /obj/item/reagent_containers/cup/bowl, + /obj/item/plate, + /obj/item/stack/rods, // kebab + /obj/item/paper/paperslip/fortune, // fortune cookie + /obj/item/dice/fudge, // /obj/item/food/fudgedice + ) + + for(var/path in subtypesof(/obj/item/food)) + var/obj/item/food/food = path + var/trash = food::trash_type + if(!trash) + continue + if(trash in food_trash_blacklist) + continue + if(!food_trash[trash]) + TEST_FAIL("[food] must include its trash_type for loot table /obj/effect/spawner/random/trash/food_packaging or be added to this unit tests food_trash_blacklist") diff --git a/code/modules/unit_tests/trauma_granting.dm b/code/modules/unit_tests/trauma_granting.dm index 5c3038bc314c..b40c0c0b5a4c 100644 --- a/code/modules/unit_tests/trauma_granting.dm +++ b/code/modules/unit_tests/trauma_granting.dm @@ -18,10 +18,7 @@ // 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 - + for(var/datum/brain_trauma/trauma as anything in valid_subtypesof(/datum/brain_trauma) - trauma_blacklist) test_trauma(dummy, trauma) /datum/unit_test/trauma_granting/proc/test_trauma(mob/living/carbon/human/dummy, trauma) diff --git a/code/modules/unit_tests/turf_icons.dm b/code/modules/unit_tests/turf_icons.dm index 945130ada0c4..e0f6bad45a33 100644 --- a/code/modules/unit_tests/turf_icons.dm +++ b/code/modules/unit_tests/turf_icons.dm @@ -1,8 +1,8 @@ /// Makes sure turf icons actually exist. :) -/datum/unit_test/turf_icons +/datum/unit_test/maptest_turf_icons var/modular_mineral_turf_file //= 'icons/turf/mining.dmi' //MODULARITY SUPPORT - insert your snowflake MAP_SWITCH icon file here if you use that define. -/datum/unit_test/turf_icons/Run() +/datum/unit_test/maptest_turf_icons/Run() for(var/turf/turf_path as anything in (subtypesof(/turf) - typesof(/turf/closed/mineral))) var/icon_state = initial(turf_path.icon_state) diff --git a/code/modules/unit_tests/unequip_defib.dm b/code/modules/unit_tests/unequip_defib.dm new file mode 100644 index 000000000000..e2db399f2de9 --- /dev/null +++ b/code/modules/unit_tests/unequip_defib.dm @@ -0,0 +1,19 @@ +/// Test you can mouse-drop a defib off your back to unequip it +/datum/unit_test/unequip_defib + +/datum/unit_test/unequip_defib/Run() + var/mob/living/carbon/human/consistent/dummy = EASY_ALLOCATE() + dummy.mock_client = new() + dummy.set_hud_used(new dummy.hud_type(dummy)) + var/obj/item/defibrillator/defib = EASY_ALLOCATE() + dummy.equip_to_slot(defib, ITEM_SLOT_BACK) + + var/old_usr = usr + + usr = dummy // mouse drop still uses usr + + defib.MouseDrop(dummy.hud_used.hand_slots["1"]) + if(!dummy.is_holding(defib)) + TEST_FAIL("The dummy failed to remove the defib from their back via mouse drop.") + + usr = old_usr diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index be08e4f82ae3..1fdafe33017d 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -18,6 +18,8 @@ GLOBAL_LIST_EMPTY(unit_test_mapping_logs) /// Global assoc list of required mapping items, [item typepath] to [required item datum]. GLOBAL_LIST_EMPTY(required_map_items) +GLOBAL_LIST_EMPTY(test_run_times) + /// A list of every test that is currently focused. /// Use the PERFORM_ALL_TESTS macro instead. GLOBAL_VAR_INIT(focused_tests, focused_tests()) @@ -67,9 +69,14 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) 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) + if(priority > TEST_CREATE_AND_DESTROY) //the create and destroy test WILL wreck havok in the unit test room. You CANNOT stop the inevitable. + return + + //Make sure that the top and bottom locations in the diagonal are floors. Anything else may get in the way of several tests. TEST_ASSERT(isfloorturf(run_loc_floor_bottom_left), "run_loc_floor_bottom_left was not a floor ([run_loc_floor_bottom_left])") TEST_ASSERT(isfloorturf(run_loc_floor_top_right), "run_loc_floor_top_right was not a floor ([run_loc_floor_top_right])") @@ -97,6 +104,9 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) /// Allocates an instance of the provided type, and places it somewhere in an available loc /// Instances allocated through this proc will be destroyed when the test is over /datum/unit_test/proc/allocate(type, ...) + if(priority > TEST_CREATE_AND_DESTROY) //I'm not using TEST_ASSERT here since these are just numbers that tell nothing useful about the problem. + TEST_FAIL("allocate() was called for a unit test after 'create_and_destroy' has finished. The unit test room is no longer a reliable testing ground for atoms.") + return null //you deserve runtime errors for it var/list/arguments = args.Copy(2) if(ispath(type, /atom)) if (!arguments.len) @@ -204,7 +214,8 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) else test.Run() - test.restore_atmos() + if(test.priority < TEST_CREATE_AND_DESTROY) //We shouldn't care about restoring atmos after create_and_destroy. + test.restore_atmos() duration = REALTIMEOFDAY - duration GLOB.current_test = null @@ -228,6 +239,8 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) log_test(message) test_output_desc += " [duration / 10]s" + if(duration > 10) + GLOB.test_run_times[test_path] = duration if (test.succeeded) log_world("[TEST_OUTPUT_GREEN("PASS")] [test_output_desc]") @@ -385,6 +398,12 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) RunUnitTest(unit_path, test_results) SSticker.delay_end = FALSE + log_world("::group::Expensive Unit Test Times") + sortTim(GLOB.test_run_times, cmp = GLOBAL_PROC_REF(cmp_numeric_dsc), associative = TRUE) + for(var/type, duration in GLOB.test_run_times) + log_world("[type] took [duration/10]s") + log_world("::endgroup::") + var/file_name = "data/unit_tests.json" fdel(file_name) file(file_name) << json_encode(test_results) diff --git a/code/modules/unit_tests/wallmount.dm b/code/modules/unit_tests/wallmount.dm new file mode 100644 index 000000000000..92a071415e2b --- /dev/null +++ b/code/modules/unit_tests/wallmount.dm @@ -0,0 +1,29 @@ +/// Ensures wallmouted objects prioritize walls over other mountable objects like tables +/datum/unit_test/wallmount + +/datum/unit_test/wallmount/Run() + //Test 1 light must priotize wall and not table + var/obj/structure/table/test_table = EASY_ALLOCATE() + var/obj/machinery/light/directional/south/test_light = EASY_ALLOCATE() + test_light.find_and_mount_on_atom() + + var/datum/component/atom_mounted/wallmount_component = test_light.GetComponent(/datum/component/atom_mounted) + TEST_ASSERT_NOTNULL(wallmount_component, "[test_light.type] failed to mount") + TEST_ASSERT_NOTEQUAL(wallmount_component.hanging_support_atom, test_table, "[test_light.type] failed to mount on wall!") + + //Test 2 button must mount on table not wall + var/obj/machinery/button/test_button = EASY_ALLOCATE() + test_button.find_and_mount_on_atom() + + wallmount_component = test_button.GetComponent(/datum/component/atom_mounted) + TEST_ASSERT_NOTNULL(wallmount_component, "[test_button.type] 0 offsets failed to mount!") + TEST_ASSERT_EQUAL(wallmount_component.hanging_support_atom, test_table, "[test_button.type] 0 offsets failed to mount on table!") + + //Test 3 button must mount on wall not table because it now uses offsets + test_button = allocate(/obj/machinery/button, run_loc_floor_top_right) + test_button.pixel_y = 24 + test_button.find_and_mount_on_atom() + + wallmount_component = test_button.GetComponent(/datum/component/atom_mounted) + TEST_ASSERT_NOTNULL(wallmount_component, "[test_button.type] 24y offsets failed to mount!") + TEST_ASSERT(isindestructiblewall(wallmount_component.hanging_support_atom), "[test_button.type] 24y offsets failed to mount on wall!") diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 06cd969d9350..5644e0582443 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -9,7 +9,7 @@ per_category[possible_sale.category] = list() per_category[possible_sale.category] += possible_sale - for (var/i in 1 to num) + for (var/i in 1 to min(length(per_category), num)) var/datum/uplink_category/item_category = pick(per_category) var/datum/uplink_item/taken_item = pick(per_category[item_category]) per_category -= item_category @@ -109,6 +109,9 @@ /// Uses the purchase log, so items purchased that are not visible in the purchase log will not count towards this. /// However, they won't be purchasable afterwards. var/lock_other_purchases = FALSE + /// A lazylist of typepaths to uplink items relevant to this this item + /// EX: a pistol would list its magazines or modifications here + var/list/relevant_child_items /datum/uplink_item/New() . = ..() @@ -209,7 +212,7 @@ QDEL_NULL(gun_reward.pin) var/obj/item/firing_pin/pin = new - pin.gun_insert(new_gun = gun_reward) + pin.gun_insert(new_gun = gun_reward, starting = TRUE) ///For special overrides if an item can be bought or not. /datum/uplink_item/proc/can_be_bought(datum/uplink_handler/source) diff --git a/code/modules/uplink/uplink_items/bundle.dm b/code/modules/uplink/uplink_items/bundle.dm index b6cdc2fd3d65..6247e32e3b89 100644 --- a/code/modules/uplink/uplink_items/bundle.dm +++ b/code/modules/uplink/uplink_items/bundle.dm @@ -18,8 +18,7 @@ /datum/uplink_item/bundles_tc/random/purchase(mob/user, datum/uplink_handler/handler, atom/movable/source) var/list/possible_items = list() - for(var/datum/uplink_item/item_path as anything in SStraitor.uplink_items_by_type) - var/datum/uplink_item/uplink_item = SStraitor.uplink_items_by_type[item_path] + for(var/datum/uplink_item/uplink_item as anything in SStraitor.uplink_items) if(src == uplink_item || !uplink_item.item) continue if(!handler.can_purchase_item(user, uplink_item)) @@ -81,8 +80,7 @@ /// generates items that can go inside crates, edit this proc to change what items could go inside your specialized crate /datum/uplink_item/bundles_tc/surplus/proc/generate_possible_items(mob/user, datum/uplink_handler/handler) var/list/possible_items = list() - for(var/datum/uplink_item/item_path as anything in SStraitor.uplink_items_by_type) - var/datum/uplink_item/uplink_item = SStraitor.uplink_items_by_type[item_path] + for(var/datum/uplink_item/uplink_item as anything in SStraitor.uplink_items) if(src == uplink_item || !uplink_item.item) continue if(!handler.check_if_restricted(uplink_item)) diff --git a/code/modules/uplink/uplink_items/contractor.dm b/code/modules/uplink/uplink_items/contractor.dm index f3099d544f98..1b816202827c 100644 --- a/code/modules/uplink/uplink_items/contractor.dm +++ b/code/modules/uplink/uplink_items/contractor.dm @@ -8,8 +8,7 @@ and cash payouts. Upon purchase, you'll be granted your own contract uplink embedded within the supplied \ tablet computer. Additionally, you'll be granted standard contractor gear to help with your mission - \ comes supplied with the tablet, specialised space suit, chameleon jumpsuit and mask, agent card, \ - specialised contractor baton, and three randomly selected low cost items. \ - Can include otherwise unobtainable items." + and a specialised contractor baton." item = /obj/item/storage/box/syndicate/contract_kit category = /datum/uplink_category/contractor cost = 20 diff --git a/code/modules/uplink/uplink_items/dangerous.dm b/code/modules/uplink/uplink_items/dangerous.dm index 59d5644778df..ad8509a3e7cf 100644 --- a/code/modules/uplink/uplink_items/dangerous.dm +++ b/code/modules/uplink/uplink_items/dangerous.dm @@ -15,7 +15,10 @@ item = /obj/item/storage/toolbox/guncase/traitor/donksoft cost = 6 surplus = 10 - purchasable_from = ~UPLINK_SERIOUS_OPS + purchasable_from = ~(UPLINK_SERIOUS_OPS | UPLINK_SPY) + relevant_child_items = list( + /datum/uplink_item/ammo/toydarts, + ) /datum/uplink_item/dangerous/pistol name = "Makarov Pistol Case" @@ -24,7 +27,13 @@ While not included in the kit, the pistol is compatible with suppressors, which can be purchased separately." item = /obj/item/storage/toolbox/guncase/traitor cost = 7 - purchasable_from = ~UPLINK_ALL_SYNDIE_OPS + purchasable_from = ~(UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY) + relevant_child_items = list( + /datum/uplink_item/ammo/pistol, + /datum/uplink_item/ammo/pistolap, + /datum/uplink_item/ammo/pistolhp, + /datum/uplink_item/ammo/pistolfire, + ) /datum/uplink_item/dangerous/throwingweapons name = "Box of Throwing Weapons" @@ -96,3 +105,9 @@ cost = 13 surplus = 50 purchasable_from = ~UPLINK_ALL_SYNDIE_OPS //only traitors get the original revolver + relevant_child_items = list( + /datum/uplink_item/ammo/revolver, + /datum/uplink_item/ammo_nuclear/basic/revolver, + /datum/uplink_item/ammo_nuclear/special/revolver/phasic, + /datum/uplink_item/ammo_nuclear/special/revolver/heartseeker, + ) diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index c2dbf1a675e9..6f23553649bb 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -61,7 +61,7 @@ /datum/uplink_item/role_restricted/oldtoolboxclean name = "Ancient Toolbox" - desc = "An iconic toolbox design notorious with Assistants everywhere, this design was especially made to become more robust the more telecrystals it has inside it! Tools and insulated gloves included." + desc = "An iconic toolbox design notorious with Assistants everywhere. This design was specially made to become more robust the more telecrystals it has inside it! Tools and insulated gloves included." item = /obj/item/storage/toolbox/mechanical/old/clean cost = 2 restricted_roles = list(JOB_ASSISTANT) @@ -87,7 +87,7 @@ /datum/uplink_item/role_restricted/syndimmi name = "Syndicate Brand MMI" - desc = "An MMI modified to give cyborgs laws to serve the Syndicate without having their interface damaged by Cryptographic Sequencers, this will not unlock their hidden modules." + 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_CORONER, JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER) @@ -256,7 +256,7 @@ /datum/uplink_item/role_restricted/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!" + 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 restricted_roles = list(JOB_CLOWN) diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index 1b83a572ddde..37ee8997aeef 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -72,6 +72,17 @@ desc = "A fully-loaded 2-round burst fire 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 + relevant_child_items = list( + /datum/uplink_item/ammo_nuclear/basic/buck, + /datum/uplink_item/ammo_nuclear/basic/donk, + /datum/uplink_item/ammo_nuclear/basic/flechette, + /datum/uplink_item/ammo_nuclear/basic/slug, + /datum/uplink_item/ammo_nuclear/incendiary/dragon, + /datum/uplink_item/ammo_nuclear/special/meteor, + /datum/uplink_item/spy_unique/shotgun_ammo, + /datum/uplink_item/spy_unique/shotgun_ammo/breacher_slug, + /datum/uplink_item/spy_unique/shotgun_ammo/slugs, + ) /datum/uplink_item/ammo_nuclear/basic/buck name = "12g Buckshot Drum (Bulldog)" @@ -122,6 +133,12 @@ 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 + relevant_child_items = list( + /datum/uplink_item/ammo_nuclear/basic/m10mm, + /datum/uplink_item/ammo_nuclear/ap/m10mm, + /datum/uplink_item/ammo_nuclear/hp/m10mm, + /datum/uplink_item/ammo_nuclear/incendiary/m10mm, + ) /datum/uplink_item/ammo_nuclear/basic/m10mm name = "10mm Handgun Magazine (Ansem)" @@ -164,6 +181,12 @@ 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 + relevant_child_items = list( + /datum/uplink_item/ammo_nuclear/ap/smg, + /datum/uplink_item/ammo_nuclear/basic/smg, + /datum/uplink_item/ammo_nuclear/hp/smg, + /datum/uplink_item/ammo_nuclear/incendiary/smg, + ) /datum/uplink_item/ammo_nuclear/basic/smg name = ".45 SMG Magazine (C-20r)" @@ -213,6 +236,12 @@ desc = "Waffle Corp's modernized Syndicate revolver. Fires 7 brutal rounds of .357 Magnum. \ A classic operative weapon, improved for the modern era. Comes with 3 additional speedloaders of .357." item = /obj/item/storage/toolbox/guncase/revolver + relevant_child_items = list( + /datum/uplink_item/ammo/revolver, + /datum/uplink_item/ammo_nuclear/basic/revolver, + /datum/uplink_item/ammo_nuclear/special/revolver/phasic, + /datum/uplink_item/ammo_nuclear/special/revolver/heartseeker, + ) /datum/uplink_item/ammo_nuclear/basic/revolver name = ".357 Speed Loader (Revolver)" @@ -246,6 +275,10 @@ desc = "A reusable rocket propelled grenade launcher preloaded with a low-yield 84mm HE round. \ Guaranteed to take your target out with a bang, or your money back! Comes with a bouquet of additional rockets!" item = /obj/item/storage/toolbox/guncase/rocketlauncher + relevant_child_items = list( + /datum/uplink_item/ammo_nuclear/ap/rocket, + /datum/uplink_item/ammo_nuclear/basic/rocket, + ) /datum/uplink_item/ammo_nuclear/basic/rocket name = "84mm HE Rocket Bouquet (Rocket Launcher)" @@ -272,6 +305,13 @@ 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 + relevant_child_items = list( + /datum/uplink_item/ammo_nuclear/ap/machinegun, + /datum/uplink_item/ammo_nuclear/basic/machinegun, + /datum/uplink_item/ammo_nuclear/hp/machinegun, + /datum/uplink_item/ammo_nuclear/incendiary/machinegun, + /datum/uplink_item/ammo_nuclear/special/machinegun, + ) /datum/uplink_item/ammo_nuclear/basic/machinegun name = "7mm Box Magazine (L6 SAW)" @@ -311,6 +351,11 @@ Comes with a 40mm underbarrel grenade launcher. Use secondary-fire to fire the grenade launcher. Also comes with two spare magazines \ and a box of 40mm rubber slugs." item = /obj/item/storage/toolbox/guncase/m90gl + relevant_child_items = list( + /datum/uplink_item/ammo_nuclear/basic/carbine, + /datum/uplink_item/ammo_nuclear/special/carbine, + /datum/uplink_item/ammo_nuclear/basic/carbine/a40mm, + ) /datum/uplink_item/ammo_nuclear/basic/carbine name = ".223 Toploader Magazine (M-90gl)" @@ -340,6 +385,13 @@ 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 + relevant_child_items = list( + /datum/uplink_item/ammo_nuclear/ap/sniper/penetrator, + /datum/uplink_item/ammo_nuclear/basic/sniper, + /datum/uplink_item/ammo_nuclear/basic/sniper/disruptor, + /datum/uplink_item/ammo_nuclear/incendiary/sniper, + /datum/uplink_item/ammo_nuclear/special/sniper/marksman, + ) /datum/uplink_item/ammo_nuclear/basic/sniper name = ".50 BMG Magazine (AMSR)" @@ -398,6 +450,9 @@ item = /obj/item/gun/ballistic/automatic/smartgun cost = 2 purchasable_from = UPLINK_SERIOUS_OPS + relevant_child_items = list( + /datum/uplink_item/ammo_nuclear/surplus_smg, + ) /datum/uplink_item/ammo_nuclear/surplus_smg name = "Surplus Smart-SMG Magazine (Smartgun)" @@ -629,6 +684,12 @@ item = /obj/item/storage/box/syndie_kit/cowboy cost = 18 purchasable_from = UPLINK_SERIOUS_OPS + relevant_child_items = list( + /datum/uplink_item/ammo/revolver, + /datum/uplink_item/ammo_nuclear/basic/revolver, + /datum/uplink_item/ammo_nuclear/special/revolver/phasic, + /datum/uplink_item/ammo_nuclear/special/revolver/heartseeker, + ) // Mech related gear @@ -650,6 +711,9 @@ for hit-and-run style attacks. Features a scattershot shotgun, armor boosters against melee and ranged attacks, and ion thrusters." item = /obj/vehicle/sealed/mecha/gygax/dark/loaded cost = 60 + relevant_child_items = list( + /datum/uplink_item/mech/support_bag/mauler, + ) /datum/uplink_item/mech/mauler name = "Mauler Exosuit" @@ -657,6 +721,9 @@ and deployable smoke. Comes equipped with an LMG, scattershot carbine, missile rack, and an antiprojectile armor booster." item = /obj/vehicle/sealed/mecha/marauder/mauler/loaded cost = 100 + relevant_child_items = list( + /datum/uplink_item/mech/support_bag/mauler, + ) // ~~ Mech Support ~~ @@ -800,7 +867,7 @@ /datum/uplink_item/device_tools/potion name = "Syndicate Sentience Potion" - item = /obj/item/slimepotion/slime/sentience/nuclear + item = /obj/item/slimepotion/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." cost = 4 diff --git a/code/modules/uplink/uplink_items/spy_unique.dm b/code/modules/uplink/uplink_items/spy_unique.dm index 04f9b4ba6f54..abc7449e567a 100644 --- a/code/modules/uplink/uplink_items/spy_unique.dm +++ b/code/modules/uplink/uplink_items/spy_unique.dm @@ -31,10 +31,10 @@ item = /obj/item/clothing/gloves/combat cost = 1 -/datum/uplink_item/spy_unique/krav_maga +/datum/uplink_item/spy_unique/kaza_ruk name = "Combat Gloves Plus" desc = "A pair of combat gloves plus. They're insulated AND you can do martial arts with it!" - item = /obj/item/clothing/gloves/krav_maga/combatglovesplus + item = /obj/item/clothing/gloves/kaza_ruk/combatglovesplus /datum/uplink_item/spy_unique/tackle_gloves name = "Guerrilla Gloves" @@ -76,6 +76,11 @@ item = /obj/item/gun/ballistic/shotgun/automatic/dual_tube/deadly cost = SPY_UPPER_COST_THRESHOLD uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND + relevant_child_items = list( + /datum/uplink_item/spy_unique/shotgun_ammo, + /datum/uplink_item/spy_unique/shotgun_ammo/breacher_slug, + /datum/uplink_item/spy_unique/shotgun_ammo/slugs, + ) /datum/uplink_item/spy_unique/bulldog_shotgun name = "Bulldog Shotgun" @@ -83,6 +88,17 @@ item = /obj/item/gun/ballistic/shotgun/bulldog/unrestricted cost = SPY_UPPER_COST_THRESHOLD uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND + relevant_child_items = list( + /datum/uplink_item/ammo_nuclear/basic/buck, + /datum/uplink_item/ammo_nuclear/basic/donk, + /datum/uplink_item/ammo_nuclear/basic/flechette, + /datum/uplink_item/ammo_nuclear/basic/slug, + /datum/uplink_item/ammo_nuclear/incendiary/dragon, + /datum/uplink_item/ammo_nuclear/special/meteor, + /datum/uplink_item/spy_unique/shotgun_ammo, + /datum/uplink_item/spy_unique/shotgun_ammo/breacher_slug, + /datum/uplink_item/spy_unique/shotgun_ammo/slugs, + ) /datum/uplink_item/spy_unique/ansem_pistol name = "Ansem Pistol" @@ -90,6 +106,36 @@ item = /obj/item/gun/ballistic/automatic/pistol/clandestine cost = SPY_UPPER_COST_THRESHOLD uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND + relevant_child_items = list( + /datum/uplink_item/ammo_nuclear/basic/m10mm, + /datum/uplink_item/ammo_nuclear/ap/m10mm, + /datum/uplink_item/ammo_nuclear/hp/m10mm, + /datum/uplink_item/ammo_nuclear/incendiary/m10mm, + ) + +/datum/uplink_item/spy_unique/makarov_pistol + name = "Makarov Pistol" + desc = "A Makarov pistol - Reliable and sturdy." + item = /obj/item/gun/ballistic/automatic/pistol + cost = SPY_LOWER_COST_THRESHOLD + uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND + relevant_child_items = list( + /datum/uplink_item/ammo/pistol, + /datum/uplink_item/ammo/pistolap, + /datum/uplink_item/ammo/pistolhp, + /datum/uplink_item/ammo/pistolfire, + ) + +/datum/uplink_item/spy_unique/toy_pistol + name = "Donksoft Riot Pistol" + desc = "A Donksoft Riot Pistol - A toy pistol that fires foam darts at higher than normal velocity." + item = /obj/item/gun/ballistic/automatic/pistol/toy/riot/clandestine + cost = SPY_LOWER_COST_THRESHOLD + cost = SPY_LOWER_COST_THRESHOLD + uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND + relevant_child_items = list( + /datum/uplink_item/ammo/toydarts, + ) /datum/uplink_item/spy_unique/rocket_launcher name = "Rocket Launcher" @@ -97,6 +143,10 @@ item = /obj/item/gun/ballistic/rocketlauncher cost = SPY_UPPER_COST_THRESHOLD - 1 // It's a meme item uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND + relevant_child_items = list( + /datum/uplink_item/ammo_nuclear/ap/rocket, + /datum/uplink_item/ammo_nuclear/basic/rocket, + ) /datum/uplink_item/spy_unique/shotgun_ammo name = "Box of Buckshot" diff --git a/code/modules/uplink/uplink_items/stealthy.dm b/code/modules/uplink/uplink_items/stealthy.dm index 98edb0543a99..1d2e5016db29 100644 --- a/code/modules/uplink/uplink_items/stealthy.dm +++ b/code/modules/uplink/uplink_items/stealthy.dm @@ -80,10 +80,12 @@ /datum/uplink_item/stealthy_weapons/martialarts - name = "Martial Arts Scroll" + name = "Martial Arts Scroll and Martial Arts Outfit" desc = "This scroll contains the secrets of an ancient martial arts technique. You will master unarmed combat \ - and gain the ability to swat bullets from the air, but you will also refuse to use dishonorable ranged weaponry." - item = /obj/item/book/granter/martial/carp + and gain the ability to swat bullets from the air, and if in the correct attire, avoid attacks. But you will \ + also refuse to use dishonorable ranged weaponry, and armored clothing will make it harder to avoid attacks. \ + Comes prepackaged with a set of martial arts clothing!" + item = /obj/item/storage/box/syndicate/sleeping_carp progression_minimum = 30 MINUTES population_minimum = TRAITOR_POPULATION_LOWPOP cost = 17 diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index 3840bfe0cd20..1567eed0f97b 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -112,11 +112,11 @@ smoke.set_up(0, holder = src, location = src) smoke.start() -/obj/vehicle/ridden/atv/bullet_act(obj/projectile/proj) +/obj/vehicle/ridden/atv/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) if(prob(50) || !LAZYLEN(buckled_mobs)) return ..() for(var/mob/buckled_mob as anything in buckled_mobs) - return buckled_mob.projectile_hit(proj) + return buckled_mob.projectile_hit(hitting_projectile) return ..() /obj/vehicle/ridden/atv/atom_destruction() diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index eeacfbc17760..67424be210d7 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -157,7 +157,7 @@ carbon_occupant.set_eye_blur_if_lower(rand(10 SECONDS, 20 SECONDS)) hittarget_living.add_splatter_floor(small_drip = FALSE) - hittarget_living.adjustBruteLoss(200) + hittarget_living.adjust_brute_loss(200) 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) diff --git a/code/modules/vehicles/cars/golfcart/golfcart.dm b/code/modules/vehicles/cars/golfcart/golfcart.dm new file mode 100644 index 000000000000..79d21a43ce42 --- /dev/null +++ b/code/modules/vehicles/cars/golfcart/golfcart.dm @@ -0,0 +1,676 @@ +#define ENGINE_UNWRENCHED 0 +#define ENGINE_WRENCHED 1 +#define ENGINE_WELDED 2 +#define CARGO_HITBOX_LAYER (ABOVE_ALL_MOB_LAYER) +#define CART_ROOF_LAYER (CARGO_HITBOX_LAYER + 0.01) +#define CART_LOWER_LAYER (OBJ_LAYER) +#define FAKE_GLIDE_INITIAL_SOURCE "fake_glide_initial" +#define GOLFCART_RUN_OVER_DAMAGE (25) + +/obj/vehicle/ridden/golfcart + name = "golf cart" + desc = "An all-purpose cargo hauling vehicle." + icon = 'icons/obj/toys/golfcart_split.dmi' + icon_state = "front" + max_integrity = 100 + armor_type = /datum/armor/none + pass_flags_self = parent_type::pass_flags_self | LETPASSCLICKS + integrity_failure = 0.5 + layer = ABOVE_MOB_LAYER + max_occupants = 1 + key_type = /obj/item/key/golfcart + ///Perform an extra step after movement finishes? + var/perform_extra_step = FALSE + ///Base movespeed before any modifiers. Humans run at 1.5 movedelay. + var/static/base_movedelay = 1.25 + ///Base movespeed for the hotrod before any modifiers + var/static/hotrod_base_movedelay = 0.65 + ///Particle holder for low integrity smoking + var/obj/effect/abstract/particle_holder/smoke = null + ///Seperate image for the cargo buckled to the rear + var/image/cargo_image = null + ///The power source for the cart. Can be replaced with an engine. + var/obj/item/stock_parts/power_store/cell/cell = null + ///A more powerful power source for the cart. + var/obj/item/v8_engine/engine = null + ///Can be unwrenched, wrenched, or welded + var/engine_state = null + ///An invisible sprite that exists as a hitbox + var/obj/golfcart_rear/child = null + ///Objects that can be buckled to the cargo hitch + var/static/list/allowed_cargo = typecacheof(list( + /obj/structure/closet/crate, + /obj/structure/reagent_dispensers, + /obj/structure/flatpack_cart, + /obj/machinery, + /obj/item/kirbyplants, + )) + ///Each movement requires this much energy to be drawn from the internal cell + var/charge_per_move = STANDARD_CELL_CHARGE / 300 + ///Has the final say on whether something can be buckled. + var/static/list/banned_cargo = typecacheof(list( + /obj/structure/reagent_dispensers/wall, + // i mean it's a fucking door + /obj/machinery/door, + )) + ///Is the hood open? + var/hood_open = FALSE + +/obj/item/key/golfcart + name = "golfcart key" + desc = "A small grey key for using the golf cart." + icon = 'icons/obj/toys/golfcart_split.dmi' + +/obj/item/golfcart_kit + name = "golfcart parts kit" + desc = "A box containing a golf cart. Some assembly required. Batteries not included." + icon = 'icons/obj/toys/golfcart_split.dmi' + icon_state = "parts_kit" + w_class = WEIGHT_CLASS_HUGE + throw_range = 2 + item_flags = SLOWS_WHILE_IN_HAND | IMMUTABLE_SLOW + slowdown = 2.5 + drag_slowdown = 3.5 + +/obj/item/golfcart_kit/examine(mob/user) + . = ..() + . += span_notice("The instructions say that it needs to be [EXAMINE_HINT("screwed")] together.") + +/obj/item/golfcart_kit/proc/play_building_noises(mob/living/user, duration) + duration = max(duration - (1 SECONDS), 0.5 SECONDS) + playsound(src, 'sound/items/poster/poster_ripped.ogg', 50, TRUE) + sleep(1 SECONDS) + if (!DOING_INTERACTION_WITH_TARGET(user, src)) + return + playsound(src, 'sound/items/tools/screwdriver_operating.ogg', 50, TRUE) + sleep(duration / 2) + if (!DOING_INTERACTION_WITH_TARGET(user, src)) + return + playsound(src, 'sound/items/tools/ratchet.ogg', 50, TRUE) + sleep(duration / 2) + if (!DOING_INTERACTION_WITH_TARGET(user, src)) + return + playsound(src, 'sound/items/tools/screwdriver.ogg', 50, TRUE) + +/obj/item/golfcart_kit/screwdriver_act(mob/living/user, obj/item/tool) + if (!isturf(loc)) + user.balloon_alert(user, "set down first!") + return ITEM_INTERACT_BLOCKING + user.visible_message(span_notice("[user] starts putting together the [src]..."), span_notice("You start assembling the [src]...")) + var/unboxing_duration = 7 SECONDS + INVOKE_ASYNC(src, PROC_REF(play_building_noises), user, unboxing_duration * tool.toolspeed) + if(!tool.use_tool(src, user, unboxing_duration)) + return ITEM_INTERACT_BLOCKING + if (!isturf(loc)) + return ITEM_INTERACT_BLOCKING + var/obj/vehicle/ridden/golfcart/cart = new(get_turf(src)) + user.visible_message(span_notice("[user] assembles the [cart]!"), span_notice("You assemble the [cart].")) + qdel(src) + +/obj/vehicle/ridden/golfcart/atom_break() + . = ..() + if (smoke) + return + smoke = new(src, /particles/smoke/ash) + +/obj/vehicle/ridden/golfcart/atom_fix() + . = ..() + if (smoke) + QDEL_NULL(smoke) + +/obj/vehicle/ridden/golfcart/atom_destruction() + explosion(src, devastation_range = -1, light_impact_range = 2, flame_range = 3, flash_range = 4) + return ..() + +///Jiggles the cargo_image up and down. +/obj/vehicle/ridden/golfcart/proc/shake_cargo(pixelshiftx = 2, pixelshifty = 2, duration) + if (!cargo_image) + return + var/inital_pixel_x = cargo_image.pixel_x + var/inital_pixel_y = cargo_image.pixel_y + animate(cargo_image, pixel_x = inital_pixel_x + rand(-pixelshiftx, pixelshiftx), pixel_y = inital_pixel_y + rand(pixelshifty/2, pixelshifty), time=duration, flags=ANIMATION_PARALLEL) + animate(pixel_x = inital_pixel_x, pixel_y = inital_pixel_y, time=duration) + +/obj/vehicle/ridden/golfcart/proc/is_hotrod() + return engine && engine_state == ENGINE_WELDED + +///Called when something we crash into lands after being flinged +/obj/vehicle/ridden/golfcart/proc/thrown_mob_landed(atom/thrown_atom) + if (!isliving(thrown_atom)) + UnregisterSignal(thrown_atom, COMSIG_MOVABLE_THROW_LANDED) + return + var/mob/living/thrown_mob = thrown_atom + thrown_mob.Knockdown(3 SECONDS) + UnregisterSignal(thrown_atom, COMSIG_MOVABLE_THROW_LANDED) + +/obj/vehicle/ridden/golfcart/Bump(atom/bumped_atom) + if (..()) + return + if (!is_hotrod()) + return + if(!isliving(bumped_atom)) + return + var/mob/living/mob = bumped_atom + if (mob in child.buckled_mobs) + return + mob.throw_at(get_edge_target_turf(mob, dir), 2, 3) + RegisterSignal(mob, COMSIG_MOVABLE_THROW_LANDED, PROC_REF(thrown_mob_landed)) + mob.visible_message( + span_danger("[src] hits [mob] at full speed!"), + span_userdanger("[src] slams into you!"), + ) + +///Called when a resting victim is run over +/obj/vehicle/ridden/golfcart/proc/run_over(mob/living/victim) + if (!has_gravity()) + victim.throw_at(get_edge_target_turf(victim, dir), 4, 3) + RegisterSignal(victim, COMSIG_MOVABLE_THROW_LANDED, PROC_REF(thrown_mob_landed)) + return + if (istype(victim, /mob/living/carbon)) + var/mob/living/carbon/person = victim + if (person.body_position == LYING_DOWN) + log_combat(src, victim, "run over", addition = "(DAMTYPE: [uppertext(BRUTE)])") + playsound(src, 'sound/effects/pop_expl.ogg', 50, TRUE) + playsound(src, 'sound/effects/splat.ogg', 50, TRUE) + victim.visible_message( + span_danger("[src] drives over [victim]!"), + span_userdanger("[src] drives over you!"), + ) + + var/damage = rand(GOLFCART_RUN_OVER_DAMAGE - GOLFCART_RUN_OVER_DAMAGE / 5, GOLFCART_RUN_OVER_DAMAGE + GOLFCART_RUN_OVER_DAMAGE / 5) + //adds up to exactly 1 + person.apply_damage((1/3) * damage, BRUTE, BODY_ZONE_HEAD) + person.apply_damage((1/3) * damage, BRUTE, BODY_ZONE_CHEST) + person.apply_damage((1/12) * damage, BRUTE, BODY_ZONE_L_LEG) + person.apply_damage((1/12) * damage, BRUTE, BODY_ZONE_R_LEG) + person.apply_damage((1/12) * damage, BRUTE, BODY_ZONE_L_ARM) + person.apply_damage((1/12) * damage, BRUTE, BODY_ZONE_R_ARM) + + add_mob_blood(person) + var/turf/below_us = get_turf(src) + below_us.add_mob_blood(person) + + AddComponent(/datum/component/blood_walk, \ + blood_type = /obj/effect/decal/cleanable/blood/tracks, \ + target_dir_change = TRUE, \ + transfer_blood_dna = TRUE, \ + max_blood = 4) + +/obj/vehicle/ridden/golfcart/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) + . = ..() + if (!is_hotrod()) + return + for(var/mob/living/future_pancake in loc) + if (!(future_pancake in child.buckled_mobs)) + run_over(future_pancake) + +/obj/vehicle/ridden/golfcart/mouse_drop_receive(atom/dropped, mob/user, params) + if (child.can_load(dropped)) + return child.mouse_drop_receive(dropped, user, params) + return ..() + +/obj/vehicle/ridden/golfcart/item_interaction(mob/living/user, obj/item/attacking_item, list/modifiers) + if (!hood_open) + return ..() + if (istype(attacking_item, /obj/item/v8_engine)) + if (engine || cell) + balloon_alert(user, "already has an engine!") + return ITEM_INTERACT_BLOCKING + user.transferItemToLoc(attacking_item, src) + engine = attacking_item + engine_state = ENGINE_UNWRENCHED + balloon_alert(user, "installed \the [engine]") + return ITEM_INTERACT_SUCCESS + if (istype(attacking_item, /obj/item/stock_parts/power_store/cell)) + if (cell || engine) + balloon_alert(user, "already has an engine!") + return ITEM_INTERACT_BLOCKING + user.transferItemToLoc(attacking_item, src) + cell = attacking_item + balloon_alert(user, "installed \the [cell]") + return ITEM_INTERACT_SUCCESS + return ..() + +/obj/vehicle/ridden/golfcart/attack_hand(mob/living/user, list/modifiers) + if (!hood_open) + return ..() + if (engine && engine_state == ENGINE_UNWRENCHED) + . = TRUE + var/obj/item/engine_item = engine + engine_state = null + engine = null + if (user.put_in_hands(engine_item)) + return + engine_item.forceMove(drop_location()) + return + if (isnull(cell)) + return ..() + var/obj/item/stock_parts/power_store/cell/cell_to_take = cell + cell = null + . = TRUE + if (user.put_in_hands(cell_to_take)) + return + cell_to_take.forceMove(drop_location()) + +/obj/vehicle/ridden/golfcart/proc/can_wrench_engine() + return hood_open && engine && (engine_state == ENGINE_UNWRENCHED || engine_state == ENGINE_WRENCHED) + +/obj/vehicle/ridden/golfcart/proc/can_weld_engine() + return hood_open && engine && (engine_state == ENGINE_WRENCHED || engine_state == ENGINE_WELDED) + +/obj/vehicle/ridden/golfcart/proc/set_engine_state(state) + engine_state = state + if (engine_state == ENGINE_WELDED && icon != 'icons/obj/toys/golfcart_hotrod_split.dmi') + icon = 'icons/obj/toys/golfcart_hotrod_split.dmi' + update_appearance(UPDATE_ICON) + else if (engine_state != ENGINE_WELDED && icon != initial(icon)) + icon = initial(icon) + +/obj/vehicle/ridden/golfcart/wrench_act(mob/living/user, obj/item/tool) + if (!can_wrench_engine()) + return ..() + tool.play_tool_sound(src, 50) + if (!tool.use_tool(src, user, 3 SECONDS, extra_checks = CALLBACK(src, PROC_REF(can_wrench_engine)))) + return ITEM_INTERACT_BLOCKING + if (engine_state == ENGINE_WRENCHED) + set_engine_state(ENGINE_UNWRENCHED) + else if (engine_state == ENGINE_UNWRENCHED) + set_engine_state(ENGINE_WRENCHED) + playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) + return ITEM_INTERACT_SUCCESS + +/obj/vehicle/ridden/golfcart/welder_act(mob/living/user, obj/item/tool) + if (user.combat_mode) + return + if(!tool.tool_start_check(user, heat_required = HIGH_TEMPERATURE_REQUIRED, amount = 1)) + return ITEM_INTERACT_BLOCKING + . = ITEM_INTERACT_SUCCESS + if (hood_open) + if(!tool.use_tool(src, user, 3 SECONDS, amount = 1, volume = 50, extra_checks = CALLBACK(src, PROC_REF(can_weld_engine)))) + return ITEM_INTERACT_BLOCKING + if (engine_state == ENGINE_WRENCHED) + set_engine_state(ENGINE_WELDED) + else if (engine_state == ENGINE_WELDED) + set_engine_state(ENGINE_WRENCHED) + else + if(DOING_INTERACTION(user, src)) + balloon_alert(user, "already repairing it!") + return + if(atom_integrity >= max_integrity) + balloon_alert(user, "it's not damaged!") + return + // takes 10 seconds to repair from full + balloon_alert(user, "started repairing") + if (!tool.use_tool(src, user, ((max_integrity - atom_integrity) / max_integrity * 10) SECONDS, volume = 50)) + balloon_alert(user, "repair interrupted!") + return + repair_damage(max_integrity - atom_integrity) + balloon_alert(user, "repaired") + return + +/obj/vehicle/ridden/golfcart/proc/toggle_hood() + hood_open = !hood_open + update_appearance(UPDATE_ICON) + +/obj/vehicle/ridden/golfcart/click_alt(mob/user) + if (user in buckled_mobs) + return ..() + else + to_chat(user, span_warning("You must be sitting down to remove the key!")) + . = CLICK_ACTION_SUCCESS + toggle_hood() + if (hood_open) + to_chat(user, span_notice("You pop \the [src]'s hood.")) + else + to_chat(user, span_notice("You shut \the [src]'s hood.")) + +/obj/vehicle/ridden/golfcart/examine_more(mob/user) + . = ..() + if (!child.cargo) + return + . += span_slightly_larger("It is currently transporting the [child.cargo]") + . += child.cargo.examine(user) + +/obj/vehicle/ridden/golfcart/examine(mob/user) + . = ..() + . += span_notice("Pop the hood by alt-clicking while not riding it.") + if (child.cargo) + . += span_info("The bed is holding \the [child.cargo].") + if(!in_range(user, src) && !issilicon(user) && !isobserver(user)) + . += span_warning("You're too far away to examine [src] closely.") + return + if (!engine) + var/power = 0 + if (cell) + power = floor(cell.charge / cell.maxcharge * 100) + . += span_info("It is currently is at [power]% charge.") + if (hood_open) + . += span_warning("The hood is open!") + if (engine) + . += span_info("You can see \the [engine] inside.") + if (engine_state == ENGINE_UNWRENCHED) + . += span_notice("It needs to be [EXAMINE_HINT("wrenched")] into place.") + else if (engine_state == ENGINE_WRENCHED) + . += span_notice("It needs to be [EXAMINE_HINT("welded")] down.") + // last state is ENGINE_WELDED + else if (cell) + . += span_info("You can see \the [cell] inside.") + . += span_smallnotice("If you remove the cell you could probably install another power source...") + else + . += span_info("There is no power cell installed.") + +///Called when something tries to pass us. Returns TRUE if it is trying to crawl past us. +/obj/vehicle/ridden/golfcart/proc/allow_crawler_through(atom/crawler) + if (!isliving(crawler)) + return FALSE + var/mob/living/living_crawler = crawler + return living_crawler.body_position == LYING_DOWN + +/obj/vehicle/ridden/golfcart/CanAllowThrough(atom/movable/mover, border_dir) + . = ..() + if (mover == child) + return TRUE + if (mover in child.buckled_mobs) + return TRUE + if (allow_crawler_through(mover)) + return TRUE + +///Called for COMSIG_MOVABLE_PRE_MOVE on the golfcart front. If the rear of the cart doesn't fit where we want to go, block movement. +/obj/vehicle/ridden/golfcart/proc/pre_move(atom/source, atom/new_loc) + SIGNAL_HANDLER + + // see if space behind new loc is free + var/atom/behind = get_step(new_loc, turn(dir, 180)) + if ((!behind.Enter(child, child.loc)) && behind != get_step(src, 0)) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE + // otherwise permit move + return + +///Makes movedelay a factor of base_movedelay +/obj/vehicle/ridden/golfcart/proc/set_movedelay_effect(modification) + var/base_movedelay_effect = base_movedelay + if (is_hotrod()) + base_movedelay_effect = hotrod_base_movedelay + movedelay = base_movedelay_effect * modification + child.set_glide_size(DELAY_TO_GLIDE_SIZE(movedelay)) + +///Sets perform_extra_step to TRUE if we are going up stairs. +/obj/vehicle/ridden/golfcart/zMove(dir, turf/target, z_move_flags) + var/can_do_extra_step = FALSE + if (currently_z_moving == CURRENTLY_Z_ASCENDING) + can_do_extra_step = TRUE + . = ..() + if (!.) + return + perform_extra_step = perform_extra_step || can_do_extra_step + +///Creates a fake glide effect on the golfcart and anything buckled to it. Called when moving up stairs as moving up stairs creates a two-tile move. +/obj/vehicle/ridden/golfcart/proc/fake_glide(direct) + var/px = 0 + var/py = 0 + if (direct & NORTH) + py -= 32 + else if (direct & SOUTH) + py += 32 + if (direct & EAST) + px -= 32 + else if (direct & WEST) + px += 32 + pixel_x += px + pixel_y += py + child.pixel_x += px + child.pixel_y += py + animate(src, movedelay, pixel_x=0, pixel_y=0) + animate(child, movedelay, pixel_x=0, pixel_y=0) + for (var/mob/buckled in (buckled_mobs + child.buckled_mobs)) + var/inital_pixel_x = buckled.pixel_x + var/inital_pixel_y = buckled.pixel_y + buckled.pixel_x += px + buckled.pixel_y += py + animate(buckled, movedelay, pixel_x=inital_pixel_x, pixel_y=inital_pixel_y) + if (buckled.client) + var/client/client = buckled.client + var/initial_client_pixel_x = client.pixel_x + var/initial_client_pixel_y = client.pixel_y + client.pixel_x += px + client.pixel_y += py + animate(client, movedelay, pixel_x=initial_client_pixel_x, pixel_y=initial_client_pixel_y) + +/obj/vehicle/ridden/golfcart/Move(atom/newloc, direct, glide_size_override = 0, update_dir = TRUE) + perform_extra_step = FALSE + var/atom/old_loc = get_turf(src) + var/old_dir = dir + if (get_turf(child) == newloc) + set_movedelay_effect(2) + . = ..(newloc, turn(direct, 180)) + else + set_movedelay_effect(1) + . = ..() + var/atom/behind = get_step(src, turn(dir, 180)) + if (old_dir != dir && get_turf(src) == old_loc) + if (!behind.Enter(child, child.loc)) + setDir(old_dir) + behind = get_step(src, turn(dir, 180)) + update_appearance(UPDATE_ICON) + child.move_from_parent(behind) + // working theory is that somehow the cart can't move onto stairs -> perform_extra_step is true but loc is never set to newloc + if ((perform_extra_step && loc.z != old_loc.z) || loc.z < old_loc.z) + // this should be called when descending Z levels, or when going up stairs + if (!Move(get_step(src, dir), dir, glide_size_override, update_dir)) + return + fake_glide(dir) + +///Called for COMSIG_ATOM_TRIED_PASS on the golfcart front. Allows mobs buckled to the rear of the cart to not get blocked by the front of the cart. +/obj/vehicle/ridden/golfcart/proc/allow_movement_between_passengers(atom/source, atom/mover) + SIGNAL_HANDLER + + if (mover in child.buckled_mobs) + return COMSIG_COMPONENT_PERMIT_PASSAGE + +/obj/vehicle/ridden/golfcart/Initialize(mapload, direction = null) + . = ..() + AddElement(/datum/element/ridable, /datum/component/riding/vehicle/golfcart) + RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(pre_move)) + child = new /obj/golfcart_rear(null, src) + if (isnull(direction)) + if (get_step(src, NORTH).Enter(child)) + direction = NORTH + else if (get_step(src, EAST).Enter(child)) + direction = EAST + else if (get_step(src, WEST).Enter(child)) + direction = WEST + else if (get_step(src, SOUTH).Enter(child)) + direction = SOUTH + else + direction = SOUTH + direction = turn(direction, 180) + setDir(direction) + child.loc = get_step(src, turn(dir, 180)) + update_appearance() + +/obj/vehicle/ridden/golfcart/loaded/Initialize(mapload) + . = ..() + cell = new /obj/item/stock_parts/power_store/cell/lead(src) + +/obj/vehicle/ridden/golfcart/hotrod/Initialize(mapload) + . = ..() + engine = new /obj/item/v8_engine(src) + set_engine_state(ENGINE_WELDED) + +/obj/vehicle/ridden/golfcart/update_appearance(updates=ALL) + . = ..() + child.setDir(dir) + child.update_appearance(updates) + +/obj/vehicle/ridden/golfcart/proc/get_cargo_offsets() + var/crate_x_offset = 0 + var/crate_y_offset = 0 + if (dir & NORTH) + crate_y_offset += -30 + else if (dir & SOUTH) + crate_y_offset += 30 + else if (dir & EAST) + crate_x_offset += -32 + else if (dir & WEST) + crate_x_offset += 32 + return vector(crate_x_offset, crate_y_offset) + +///Flattens the attached cargo into a list of mutable_appearances with proper layering to fit between layer and max_layer +/obj/vehicle/ridden/golfcart/proc/generate_cargo_overlay(crate_x_offset = 0, crate_y_offset = 0, layer=null, max_layer=null, shift_all=TRUE) + if (!child.cargo) + return + var/obj/cargo = child.cargo + if (!layer) + layer = src.layer + if (!max_layer) + max_layer = ABOVE_ALL_MOB_LAYER + var/vector/offsets = get_cargo_offsets() + offsets.x += crate_x_offset + offsets.y += crate_y_offset + var/crate_layer_offset = 0 + if (dir & NORTH) + crate_layer_offset = 0.01 + else if (dir & SOUTH) + crate_layer_offset = -0.01 + var/list/overlays = list() + if (cargo.icon) + overlays += mutable_appearance(cargo.icon, cargo.icon_state, cargo.layer) + overlays += cargo.update_overlays() + var/base_cargo_layer = layer + crate_layer_offset + for(var/i in 1 to overlays.len) + var/entry = overlays[i] + var/mutable_appearance/overlay = entry + if(istext(entry)) + overlay = mutable_appearance(cargo.icon, entry, base_cargo_layer) + overlays[i] = overlay + // nested lists may exist and i can't be asked to flatten them + if (!isnull(overlay)) + // preserves relative offsets + if (overlay.layer > 0) + overlay.layer = min(base_cargo_layer + (overlay.layer - cargo.layer), max_layer) + else + overlay.layer = min(base_cargo_layer + (overlay.layer * -0.01) - 0.01, max_layer) + if (shift_all || i == 1) + overlay.pixel_x += offsets.x + overlay.pixel_y += offsets.y + overlay.pixel_z += 11 + return overlays + +///Gets the pixel offsets of the rear part of the golf cart +/obj/vehicle/ridden/golfcart/proc/get_rear_offset() + var/x = 0 + var/y = 0 + if (dir & NORTH) + y = -32 + else if (dir & SOUTH) + y = 32 + else if (dir & EAST) + x = -32 + else if (dir & WEST) + x = 32 + return vector(x, y) + +/obj/vehicle/ridden/golfcart/update_overlays() + . = ..() + // the overlays for the cart are fairly complicated. + // the main three are the front, rear, and lower overlays + // the front/rear overlay are the same layer + // but the lower overlay is always below buckled mobs and the cargo + + var/mutable_appearance/lower_overlay = mutable_appearance(icon, "lower", CART_LOWER_LAYER) + var/mutable_appearance/roof_overlay = null + var/mutable_appearance/rear_overlay = mutable_appearance(icon, "rear", layer) + var/vector/rear_offsets = get_rear_offset() + rear_overlay.pixel_x = rear_offsets.x + rear_overlay.pixel_y = rear_offsets.y + if (dir & SOUTH) + // however, specifically when facing south, we require another overlay. + // it is effectively an extension of the lower overlay, but it has to be on a different tile so it has to be a different overlay + var/mutable_appearance/floor_overlay = mutable_appearance(icon, "floor", CART_LOWER_LAYER) + floor_overlay.pixel_y += 25 + . += floor_overlay + + lower_overlay.pixel_y = 32 + + roof_overlay = mutable_appearance(icon, "roof", CART_ROOF_LAYER) + roof_overlay.pixel_y = 32 + else if (dir & EAST) + lower_overlay.pixel_x = -32 + lower_overlay.layer -= 0.02 + + roof_overlay = mutable_appearance(icon, "roof", CART_ROOF_LAYER) + roof_overlay.pixel_y = 31 + roof_overlay.pixel_x = -10 + else if (dir & WEST) + lower_overlay.pixel_x = 32 + lower_overlay.layer -= 0.02 + + roof_overlay = mutable_appearance(icon, "roof", CART_ROOF_LAYER) + roof_overlay.pixel_y = 31 + roof_overlay.pixel_x = 10 + . += lower_overlay + . += rear_overlay + if (hood_open) + . += mutable_appearance(icon, "hood", layer + 0.01) + if (roof_overlay) + . += roof_overlay + + if (child.cargo) + // the cargo is a seperate vis_overlay so that it can be animate()d + vis_contents -= cargo_image + cargo_image = null + var/vector/offsets = get_cargo_offsets() + var/list/overlays = generate_cargo_overlay(max_layer=CARGO_HITBOX_LAYER, shift_all=FALSE) + if (overlays.len) + var/mutable_appearance/base_overlay = overlays[1] + overlays.Remove(base_overlay) + cargo_image = SSvis_overlays.add_vis_overlay(src, base_overlay.icon, base_overlay.icon_state, base_overlay.layer, plane, dir) + cargo_image.overlays = overlays + cargo_image.pixel_x = offsets.x + cargo_image.pixel_y = offsets.y + cargo_image.pixel_z = 11 + cargo_image.layer = base_overlay.layer + vis_contents += cargo_image + else + cargo_image = null + +///Allows mobs sitting in the rear of the cart to not shoot either the front of the cart or the driver of the cart. +/obj/vehicle/ridden/golfcart/proc/dodge_friendly_fire(mob/source, obj/projectile/projectile) + SIGNAL_HANDLER + + if (!projectile.firer) + return + if (QDELETED(projectile.firer)) + return + // so that you don't murder your driver when shooting off the back + if (projectile.firer in child.buckled_mobs) + return PROJECTILE_INTERRUPT_HIT_PHASE + +/obj/vehicle/ridden/golfcart/post_buckle_mob(mob/living/M) + if (M.pulling) + M.stop_pulling() + RegisterSignal(M, COMSIG_PROJECTILE_PREHIT, PROC_REF(dodge_friendly_fire)) + RegisterSignal(M, COMSIG_ATOM_TRIED_PASS, PROC_REF(allow_movement_between_passengers)) + return ..() + +/obj/vehicle/ridden/golfcart/post_unbuckle_mob(mob/living/M) + update_appearance(UPDATE_ICON) // because for some reason the overlays aren't properly redrawn + UnregisterSignal(M, COMSIG_ATOM_TRIED_PASS) + UnregisterSignal(M, COMSIG_PROJECTILE_PREHIT) + return ..() + +/obj/vehicle/ridden/golfcart/Destroy() + UnregisterSignal(src, COMSIG_MOVABLE_PRE_MOVE) + if (!QDELETED(child)) + qdel(child) + child = null + return ..() + +#undef ENGINE_UNWRENCHED +#undef ENGINE_WRENCHED +#undef ENGINE_WELDED +#undef CARGO_HITBOX_LAYER +#undef CART_ROOF_LAYER +#undef CART_LOWER_LAYER +#undef FAKE_GLIDE_INITIAL_SOURCE +#undef GOLFCART_RUN_OVER_DAMAGE diff --git a/code/modules/vehicles/cars/golfcart/golfcart_rear.dm b/code/modules/vehicles/cars/golfcart/golfcart_rear.dm new file mode 100644 index 000000000000..da30b1829db9 --- /dev/null +++ b/code/modules/vehicles/cars/golfcart/golfcart_rear.dm @@ -0,0 +1,413 @@ +#define GOLFCART_RIDING_SOURCE "riding_golfcart" +#define HUMAN_LOWER_LAYER (MOB_LAYER) +#define CARGO_HITBOX_LAYER (ABOVE_ALL_MOB_LAYER) +#define BELOW_HUMAN_HITBOX_LAYER (ABOVE_MOB_LAYER + 0.01) +#define HUMAN_RIDING_LAYER (BELOW_HUMAN_HITBOX_LAYER + 0.02) + +/obj/golfcart_rear + name = "golf cart bed" + icon = 'icons/obj/toys/golfcart_split.dmi' + icon_state = "rear_hitbox" + density = TRUE + alpha = 1 + can_buckle = TRUE + max_buckled_mobs = 2 + glide_size = MAX_GLIDE_SIZE + layer = 0 + ///Currently buckled cargo + var/obj/cargo = null + ///Was this move triggered by the parent? + var/moving_from_parent = FALSE + var/obj/vehicle/ridden/golfcart/parent = null + ///List of offsets for buckled passengers. Indexed by passenger index, then by direction string. + var/static/list/list/vector/passenger_offsets = list( + list( + TEXT_NORTH = vector(-4, 0, 24), + TEXT_SOUTH = vector(4, 0, 4), + TEXT_EAST = vector(4, 0, 13), + TEXT_WEST = vector(-4, 0, 13) + ), + list( + TEXT_NORTH = vector(4, 0, 20), + TEXT_SOUTH = vector(-4, 8, 0), + TEXT_EAST = vector(-8, 0, 13), + TEXT_WEST = vector(8, 0, 13) + ) + ) + ///Same as [/obj/golfcart_rear/passenger_offsets], except for when the passenger is lying down. + var/static/list/list/vector/lying_down_passenger_offsets = list( + list( + TEXT_NORTH = vector(0, 0, 16), + TEXT_SOUTH = vector(0, 0, 8), + TEXT_EAST = vector(2, 0, 8), + TEXT_WEST = vector(-2, 0, 8), + ) + ) + +///Try to load something onto the cart. This proc may fail if the obj is not in allowed_cargo or is in banned_cargo. +/obj/golfcart_rear/proc/load(obj/to_load) + if (!to_load) + return + if (cargo) + return + if (to_load.anchored) + return + if (to_load.has_buckled_mobs()) + // can't stack buckles and whatever + return + if (istype(to_load, /obj/structure/closet)) + var/obj/structure/closet/crate = to_load + crate.close() + to_load.forceMove(src) + cargo = to_load + layer = CARGO_HITBOX_LAYER + parent.update_appearance(UPDATE_ICON) + +/obj/golfcart_rear/proc/unload() + if (!cargo) + return + var/list/candidates = list( + get_step(src, turn(dir, 180)), + get_step(src, turn(dir, 90)), + get_step(src, turn(dir, 270)), + ) + var/atom/dropoff = get_turf(src) + for (var/atom/turf in candidates) + if (turf.Enter(cargo, src)) + dropoff = turf + break + cargo.forceMove(dropoff) + cargo = null + layer = BELOW_HUMAN_HITBOX_LAYER + parent.update_appearance(UPDATE_ICON) + +///Jiggles the cargo_image as long as someone is trying to jiggle it. +/obj/golfcart_rear/proc/check_if_shake() + if (!cargo) + return FALSE + + // Assuming we decide to shake again, how long until we check to shake again + var/next_check_time = 0.75 SECONDS + + // How long we shake between different calls of Shake(), so that it starts shaking and stops, instead of a steady shake + var/shake_duration = 0.125 SECONDS + + for(var/mob/living/mob in cargo.contents) + if(DOING_INTERACTION_WITH_TARGET(mob, src)) + // Shake and queue another check_if_shake + parent.shake_cargo(1, 6, shake_duration) + addtimer(CALLBACK(src, PROC_REF(check_if_shake)), next_check_time) + return TRUE + + // If we reach here, nobody is resisting, so don't shake + return FALSE + +/obj/golfcart_rear/proc/after_escape(obj/container, mob/living/user) + user?.visible_message( + span_danger("The [container] falls off of the [src]!"), + span_userdanger("You knock the crate off the [src]!") + ) + container.SpinAnimation(5, 1) + if (user && istype(container, /obj/structure/closet)) + var/obj/structure/closet/closet = container + if (closet.can_open(user)) + closet.open() + +///Unload the container from the golfcart if it is cargo +/obj/golfcart_rear/proc/easy_escape(mob/living/user, obj/container) + if (!cargo || cargo != container) + return + unload() + after_escape(container, user) + +///Unload the container from the golfcart if it is cargo and after a little jiggling and a some time +/obj/golfcart_rear/proc/hard_escape(mob/living/user, obj/container) + addtimer(CALLBACK(src, PROC_REF(check_if_shake)), 0) + if (do_after(user, 5 SECONDS, target=src, timed_action_flags=IGNORE_USER_LOC_CHANGE)) + if (!cargo || cargo != container || !(user in cargo)) + return + unload() + after_escape(container, user) + +///Called when someone resists inside of the cargo hitch. +/obj/golfcart_rear/relay_container_resist_act(mob/living/user, obj/container) + user.visible_message( + span_danger("[user] tries to escape the [container]!"), + span_userdanger("You try to escape the [container]!"), + ) + if (parent.has_buckled_mobs()) + for (var/mob/driver in parent.buckled_mobs) + if (!parent.is_driver(driver)) + continue + driver.show_message(span_userdanger("The [container] shakes violently!")) + if (istype(container, /obj/structure/closet)) + var/obj/structure/closet/closet = container + if (!closet.welded) + return easy_escape(user, container) + return hard_escape(user, container) + return easy_escape(user, container) + +/obj/golfcart_rear/take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armour_penetration) + if (!parent) + return + return parent.take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armour_penetration) + +/obj/golfcart_rear/attack_hand(mob/user, list/modifiers) + if(!isnull(cargo)) + unload() + return TRUE + return ..() + +/obj/golfcart_rear/crowbar_act(mob/living/user, obj/item/tool) + . = ..() + if (!cargo) + return + tool.play_tool_sound(src, 50) + unload() + return ITEM_INTERACT_SUCCESS + +/obj/golfcart_rear/proc/can_load(thing) + return is_type_in_typecache(thing, parent.allowed_cargo) && (!is_type_in_typecache(thing, parent.banned_cargo)) && (!has_buckled_mobs()) + +/obj/golfcart_rear/mouse_drop_receive(atom/dropped, mob/user, params) + if (!can_load(dropped)) + if (!isliving(dropped) || (has_buckled_mobs() && buckled_mobs.len >= max_buckled_mobs)) + balloon_alert_to_viewers("blocked!") + return + //Allow either 2 standing mobs or 1 lying down mob + //If a mob is already lying down it's obviously blocked. + if (has_buckled_mobs()) + for (var/mob/living/carbon/carbon_sitter in buckled_mobs) + if (carbon_sitter.body_position == LYING_DOWN) + balloon_alert_to_viewers("blocked!") + return + var/mob/living/dropped_liver = dropped + if (dropped_liver.has_buckled_mobs()) + //This sucks + balloon_alert_to_viewers("blocked!") + return + if (iscarbon(dropped_liver)) + var/mob/living/carbon/dropped_carbon = dropped_liver + if (dropped_carbon.body_position == LYING_DOWN && has_buckled_mobs()) + balloon_alert_to_viewers("stand up!") + return + return ..() + var/obj/dropped_obj = dropped + return load(dropped_obj) + +/obj/golfcart_rear/examine(mob/user) + if (!parent) + . = ..() + . += span_warning("A lone golf cart bed must be a bad omen...") + return + return parent.examine(user) + +/obj/golfcart_rear/examine_more(mob/user) + if (!parent) + return ..() + return parent.examine_more(user) + +///Called if the rear of the golfcart MUST move to destination and must NOT notify the parent about it. +/obj/golfcart_rear/proc/move_from_parent(atom/destination) + moving_from_parent = TRUE + currently_z_moving = destination.z != loc.z + . = forceMove(destination) + moving_from_parent = FALSE + +/obj/golfcart_rear/doMove(atom/destination) + . = ..() + if (!moving_from_parent) + return + for (var/mob/buckled_mob in buckled_mobs) + if (currently_z_moving) + buckled_mob.currently_z_moving = currently_z_moving + buckled_mob.forceMove(destination) + else + // this is not a good hack - this should never happen + // but stairs are a particularly problematic area + if (!buckled_mob.Move(destination, dir, glide_size)) + // this is a terrible hack because mob/living forwards forceMove calls to buckled + // unless currently_z_moving is non-null + buckled_mob.currently_z_moving = CURRENTLY_Z_MOVING_GENERIC + buckled_mob.forceMove(destination) + buckled_mob.currently_z_moving = FALSE + + +/obj/golfcart_rear/CanAllowThrough(atom/movable/mover, border_dir) + . = ..() + if (!parent) + return + if (mover == parent) + return TRUE + if (mover in parent.buckled_mobs) + return TRUE + if (parent.allow_crawler_through(mover)) + return TRUE + +/obj/golfcart_rear/Move(atom/newloc, direct, glide_size_override = 0, update_dir = TRUE) + if (moving_from_parent) + return + + if(pulledby) + var/olddir = dir + var/newdir + if (direct & (EAST | WEST)) + newdir = (direct & EAST) ? EAST : WEST + else if (direct & (NORTH | SOUTH)) + newdir = (direct & NORTH) ? NORTH : SOUTH + else + newdir = direct + set_glide_size(glide_size_override ? glide_size_override : pulledby.glide_size) + . = ..() + dir = newdir + if (get_step(src, turn(dir, 180)) != get_turf(pulledby)) + setDir(turn(dir, 180)) + var/atom/behind = get_step(src, dir) + if (!behind.Enter(parent)) + setDir(olddir) + behind = get_step(src, dir) + parent.set_glide_size(glide_size_override ? glide_size_override : pulledby.glide_size) + parent.forceMove(behind) + parent.setDir(dir) + parent.update_appearance(UPDATE_ICON) + return + + return parent.Move(get_step(parent, get_dir(loc, newloc)), direct) + +///Called for COMSIG_ATOM_TRIED_PASS on passengers buckled to the cart. Allows them to not block each other's movement / get blocked by the cart. +/obj/golfcart_rear/proc/allow_movement_between_bed_passengers(atom/source, atom/mover) + SIGNAL_HANDLER + + if (mover == parent) + return COMSIG_COMPONENT_PERMIT_PASSAGE + if (parent && (mover in parent.buckled_mobs)) + return COMSIG_COMPONENT_PERMIT_PASSAGE + if ((source in buckled_mobs) && (mover in buckled_mobs)) + return COMSIG_COMPONENT_PERMIT_PASSAGE + +///Called when the golfcart rear turns in order to keep the buckled mobs in the right places +/obj/golfcart_rear/proc/update_passenger_layers(new_dir) + if (isnull(new_dir)) + new_dir = dir + var/layer = HUMAN_RIDING_LAYER + var/invert_layer = FALSE + if (new_dir & SOUTH) + invert_layer = TRUE + new_dir = "[new_dir]" + for(var/i in 1 to buckled_mobs.len) + var/mob/living/passenger = buckled_mobs[i] + var/vector/offset + if (passenger.body_position == LYING_DOWN) + offset = lying_down_passenger_offsets[i][new_dir] + else + offset = passenger_offsets[i][new_dir] + passenger.add_offsets(GOLFCART_RIDING_SOURCE, + x_add = offset.x, + y_add = offset.y, + z_add = offset.z, + animate = FALSE) + passenger.layer = layer + ((i * 0.01) - 0.01) * (-invert_layer) + +///Called from COMSIG_ATOM_POST_DIR_CHANGE on the rear of the cart. Only used to change buckled mobs' position / layers. +/obj/golfcart_rear/proc/on_dir_changed(datum/source, old_dir, new_dir) + SIGNAL_HANDLER + + if (!has_buckled_mobs()) + return + update_passenger_layers(new_dir) + +/obj/golfcart_rear/Initialize(mapload, obj/vehicle/ridden/golfcart/progenitor) + . = ..() + parent = progenitor + layer = BELOW_HUMAN_HITBOX_LAYER + RegisterSignal(parent, COMSIG_ATOM_POST_DIR_CHANGE, PROC_REF(on_dir_changed)) + +/obj/golfcart_rear/update_overlays() + . = ..() + if (dir & NORTH) + var/mutable_appearance/hitbox_overlay = mutable_appearance(icon, "rear_hitbox_overlay", layer) + hitbox_overlay.pixel_y += 32 + . += hitbox_overlay + else if (dir & SOUTH) + . += mutable_appearance(icon, "rear_hitbox_lower", OBJ_LAYER + 0.01) + if(!cargo) + return + var/vector/rear_offsets = parent.get_rear_offset() + . += parent.generate_cargo_overlay(-rear_offsets.x, -rear_offsets.y, layer=layer) + +///Called when a passenger tries lying down/getting up. Automatically drops out people who can't stay on +/obj/golfcart_rear/proc/passenger_falling_down(atom/source, new_bodypos) + SIGNAL_HANDLER + + if (!isliving(source)) + return // should runtime? + if (new_bodypos == STANDING_UP) + update_passenger_layers() + return + if (buckled_mobs.len <= 1) + update_passenger_layers() + return // allow 1 laying down mob + var/mob/living/passenger = source + unbuckle_mob(passenger, TRUE) + +/obj/golfcart_rear/is_buckle_possible(mob/living/target, force, check_loc) + // these are to_viewers because you can buckle someone on their behalf + if (cargo) + balloon_alert_to_viewers("blocked!") + return FALSE + if (target.body_position != STANDING_UP) + if (has_buckled_mobs()) + balloon_alert_to_viewers("stand up!") + return FALSE + return ..() + for (var/mob/blocker in buckled_mobs) + if (!isliving(blocker)) + balloon_alert_to_viewers("blocked!") + return FALSE + var/mob/living/living_blocker = blocker + if (living_blocker.body_position != STANDING_UP) + balloon_alert_to_viewers("blocked!") + return FALSE + return ..() + +///Called on COMSIG_MOVABLE_PREBUCKLE for anything that's buckled to us. Disallows stacking buckles +/obj/golfcart_rear/proc/on_attempted_bucklestack() + SIGNAL_HANDLER + + return COMPONENT_BLOCK_BUCKLE + +/obj/golfcart_rear/post_buckle_mob(mob/living/buckled_mob) + buckled_mob.pulledby?.stop_pulling() + RegisterSignal(buckled_mob, COMSIG_ATOM_TRIED_PASS, PROC_REF(allow_movement_between_bed_passengers)) + RegisterSignal(buckled_mob, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(passenger_falling_down)) + RegisterSignal(buckled_mob, COMSIG_MOVABLE_PREBUCKLE, PROC_REF(on_attempted_bucklestack)) + . = ..() + update_passenger_layers() + +/obj/golfcart_rear/post_unbuckle_mob(mob/living/buckled_mob) + UnregisterSignal(buckled_mob, COMSIG_ATOM_TRIED_PASS) + UnregisterSignal(buckled_mob, COMSIG_LIVING_SET_BODY_POSITION) + UnregisterSignal(buckled_mob, COMSIG_MOVABLE_PREBUCKLE) + buckled_mob.remove_offsets(GOLFCART_RIDING_SOURCE) + if (buckled_mob.body_position == LYING_DOWN) + buckled_mob.layer = LYING_MOB_LAYER + else + buckled_mob.layer = initial(buckled_mob.layer) + return ..() + +/obj/golfcart_rear/Destroy() + if (parent) + UnregisterSignal(parent, COMSIG_ATOM_POST_DIR_CHANGE) + if (!QDELETED(parent)) + qdel(parent) + parent = null + if (cargo && !QDELETED(cargo)) + cargo.forceMove(drop_location()) + cargo = null + return ..() + +#undef CARGO_HITBOX_LAYER +#undef HUMAN_LOWER_LAYER +#undef HUMAN_RIDING_LAYER +#undef GOLFCART_RIDING_SOURCE +#undef BELOW_HUMAN_HITBOX_LAYER diff --git a/code/modules/vehicles/cars/speedwagon.dm b/code/modules/vehicles/cars/speedwagon.dm index ee3eac8a5952..24c5f885fc05 100644 --- a/code/modules/vehicles/cars/speedwagon.dm +++ b/code/modules/vehicles/cars/speedwagon.dm @@ -35,7 +35,7 @@ return var/mob/living/carbon/human/rammed = bumped rammed.Paralyze(100) - rammed.adjustStaminaLoss(30) + rammed.adjust_stamina_loss(30) rammed.apply_damage(rand(20,35), BRUTE) if(!crash_all) rammed.throw_at(get_edge_target_turf(bumped, dir), 4, 3) diff --git a/code/modules/vehicles/cars/vim.dm b/code/modules/vehicles/cars/vim.dm index 7ae87590d0ed..9bfa5c323ab7 100644 --- a/code/modules/vehicles/cars/vim.dm +++ b/code/modules/vehicles/cars/vim.dm @@ -19,6 +19,7 @@ light_on = FALSE engine_sound = 'sound/effects/servostep.ogg' interaction_flags_mouse_drop = NONE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.55, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.7) ///Maximum size of a mob trying to enter the mech var/maximum_mob_size = MOB_SIZE_SMALL COOLDOWN_DECLARE(sound_cooldown) diff --git a/code/modules/vehicles/lavaboat.dm b/code/modules/vehicles/lavaboat.dm index 3a8d86879bc8..f1a6333c8d5e 100644 --- a/code/modules/vehicles/lavaboat.dm +++ b/code/modules/vehicles/lavaboat.dm @@ -28,6 +28,7 @@ force = 12 w_class = WEIGHT_CLASS_NORMAL resistance_flags = LAVA_PROOF | FIRE_PROOF + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 2) /datum/crafting_recipe/oar name = "Goliath Bone Oar" diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index 4c9cc36adb41..44690288175e 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -249,8 +249,8 @@ log_message("[src.name] created.", LOG_MECHA) GLOB.mechas_list += src //global mech list prepare_huds() - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_atom_to_hud(src) + var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC] + diag_hud.add_atom_to_hud(src) diag_hud_set_mechhealth() diag_hud_set_mechcell() diag_hud_set_mechstat() @@ -305,8 +305,8 @@ QDEL_NULL(chassis_camera) 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 + var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC] + diag_hud.remove_atom_from_hud(src) //YEET return ..() ///Add parts on mech spawning. Skipped in manual construction. @@ -332,6 +332,7 @@ var/mob/living/silicon/ai/unlucky_ai for(var/mob/living/occupant as anything in occupants) if(isAI(occupant)) + //FIXME: Nothiing about this block works var/mob/living/silicon/ai/ai = occupant if(!ai.linked_core && !ai.can_shunt) // we probably shouldnt gib AIs with a core or shunting abilities unlucky_ai = occupant @@ -416,6 +417,81 @@ initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_view_stats, VEHICLE_CONTROL_SETTINGS) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/strafe, VEHICLE_CONTROL_DRIVE) +/obj/vehicle/sealed/mecha/add_occupant(mob/M, control_flags, forced) + if(..()) + generate_equipment_actions(M) + +/obj/vehicle/sealed/mecha/remove_occupant(mob/M) + remove_all_equipment_actions(M) + return ..() + +///Generates action buttons for all eligible equipment and grants them to the occupant with VEHICLE_CONTROL_SETTINGS flag. +/obj/vehicle/sealed/mecha/proc/generate_equipment_actions(mob/occupant) + if(!(occupant in occupants) || !(occupants[occupant] & VEHICLE_CONTROL_SETTINGS)) + return + for(var/obj/item/mecha_parts/mecha_equipment/equipment in flat_equipment) + if(!is_equipment_valid_for_action(equipment)) + continue + + grant_equipment_action(occupant, equipment) + +///Removes all equipment actions from a specific occupant. +/obj/vehicle/sealed/mecha/proc/remove_all_equipment_actions(mob/occupant) + var/list/actions = LAZYACCESS(occupant_actions, occupant) + if(!actions) + return + + for(var/equipment_type in actions) + if(!ispath(equipment_type, /obj/item/mecha_parts/mecha_equipment)) + continue + + remove_action_type_from_mob(equipment_type, occupant) + +/** + * Grants a specific equipment action to an occupant. + * Creates a new action, sets up the chassis and equipment references, and grants it to the mob. + */ +/obj/vehicle/sealed/mecha/proc/grant_equipment_action(mob/occupant, obj/item/mecha_parts/mecha_equipment/equipment) + var/datum/action/vehicle/sealed/mecha/equipment/action = new equipment.action_type // We cannot use grant_action_type_to_mob() because: + action.set_chassis(src) // 1. grant_action_type_to_mob() works with a single predefined action type + action.set_equipment(equipment) // 2. We create unique action instances for each equipment with specific equipment references + + action.Grant(occupant) + LAZYINITLIST(occupant_actions[occupant]) + // Use equipment type as actiontype for remove_action_type_from_mob() compatibility + occupant_actions[occupant][equipment.type] = action + +/** + * Called when equipment is attached to the mecha. + * Grants equipment actions to current occupants with VEHICLE_CONTROL_SETTINGS flag. + */ +/obj/vehicle/sealed/mecha/proc/on_equipment_attach(obj/item/mecha_parts/mecha_equipment/equipment) + if(!is_equipment_valid_for_action(equipment)) + return + + for(var/mob/occupant in occupants) + if(!(occupants[occupant] & VEHICLE_CONTROL_SETTINGS)) + continue + grant_equipment_action(occupant, equipment) + +/** + * Called when equipment is detached from the mecha. + * Removes equipment actions from all current occupants. + */ +/obj/vehicle/sealed/mecha/proc/on_equipment_detach(obj/item/mecha_parts/mecha_equipment/equipment) + for(var/mob/occupant in occupants) + remove_action_type_from_mob(equipment.type, occupant) + +/// Create actions only for equipment that can be toggled or triggered, excluding air tanks. +/obj/vehicle/sealed/mecha/proc/is_equipment_valid_for_action(obj/item/mecha_parts/mecha_equipment/equipment) + if(!(equipment.can_be_toggled || equipment.can_be_triggered)) + return FALSE + + if(istype(equipment, /obj/item/mecha_parts/mecha_equipment/air_tank)) // this thing has its own button + return FALSE + + return TRUE + /obj/vehicle/sealed/mecha/proc/get_mecha_occupancy_state() if((mecha_flags & SILICON_PILOT) && silicon_icon_state) return silicon_icon_state @@ -474,20 +550,54 @@ . += span_warning("It's missing a capacitor.") if(!scanmod) . += span_warning("It's missing a scanning module.") - if(mecha_flags & IS_ENCLOSED) - return - if(mecha_flags & SILICON_PILOT) - . += span_notice("[src] appears to be piloting itself...") - else - for(var/occupante in occupants) - . += span_notice("You can see [occupante] inside.") - if(ishuman(user)) - var/mob/living/carbon/human/H = user - for(var/held_item in H.held_items) - if(!isgun(held_item)) - continue - . += span_warning("It looks like you can hit the pilot directly if you target the center or above.") - break //in case user is holding two guns + if(!(mecha_flags & IS_ENCLOSED)) + if(mecha_flags & SILICON_PILOT) + . += span_notice("[src] appears to be piloting itself...") + else + for(var/occupante in occupants) + . += span_notice("You can see [occupante] inside.") + if(ishuman(user)) + var/mob/living/carbon/human/H = user + for(var/held_item in H.held_items) + if(!isgun(held_item)) + continue + . += span_warning("It looks like you can hit the pilot directly if you target the center or above.") + break //in case user is holding two guns + . += span_notice("It has a tag listing its protection classes.") + +/obj/vehicle/sealed/mecha/Topic(href, href_list) + . = ..() + + if(href_list["list_armor"]) + var/list/readout = list() + + var/datum/armor/armor = get_armor() + var/added_damage_header = FALSE + for(var/damage_key in ARMOR_LIST_DAMAGE()) + var/rating = armor.get_rating(damage_key) + if(!rating) + continue + if(!added_damage_header) + readout += "ARMOR (I-X)" + added_damage_header = TRUE + readout += "[armor_to_protection_name(damage_key)] [armor_to_protection_class(rating)]" + + var/added_durability_header = FALSE + for(var/durability_key in ARMOR_LIST_DURABILITY()) + var/rating = armor.get_rating(durability_key) + if(!rating) + continue + if(!added_durability_header) + readout += "DURABILITY (I-X)" + added_durability_header = TRUE + readout += "[armor_to_protection_name(durability_key)] [armor_to_protection_class(rating)]" + + readout += "It can withstand temperatures up to [max_temperature]K." + if(mecha_flags & IS_ENCLOSED) + readout += "It fully encloses its occupants, protecting them from the atmosphere or lack thereof." + + var/formatted_readout = span_notice("PROTECTION CLASSES
    [jointext(readout, "\n")]") + to_chat(usr, boxed_message(formatted_readout)) /obj/vehicle/sealed/mecha/generate_integrity_message() var/examine_text = "" @@ -523,6 +633,10 @@ if(length(occupants)) process_occupants(seconds_per_tick) process_constant_power_usage(seconds_per_tick) + //Diagnostic HUD updates + diag_hud_set_mechhealth() + diag_hud_set_mechcell() + diag_hud_set_mechstat() /obj/vehicle/sealed/mecha/proc/process_overclock_effects(seconds_per_tick) if(!overclock_mode && overclock_temp > 0) @@ -622,10 +736,6 @@ else if (checking == src) break // all good checking = checking.loc - //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_energy(light_power_drain * seconds_per_tick)) diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index c90ff79e60bf..09f56c5146ce 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -82,13 +82,11 @@ shield.setDir(dir) //Redirects projectiles to the shield if defense_check decides they should be blocked and returns true. -/obj/vehicle/sealed/mecha/durand/bullet_act(obj/projectile/source, def_zone, mode) - if(defense_check(source.loc) && shield) - return shield.projectile_hit(source, def_zone, mode) +/obj/vehicle/sealed/mecha/durand/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) + if(defense_check(hitting_projectile.loc) && shield) + return shield.projectile_hit(hitting_projectile, def_zone, piercing_hit, blocked) return ..() - - /**Checks if defense mode is enabled, and if the attacker is standing in an area covered by the shield. Expects a turf. Returns true if the attack should be blocked, false if not.*/ /obj/vehicle/sealed/mecha/durand/proc/defense_check(turf/aloc) diff --git a/code/modules/vehicles/mecha/combat/marauder.dm b/code/modules/vehicles/mecha/combat/marauder.dm index 93d8fb2e2c50..19a0df1affa5 100644 --- a/code/modules/vehicles/mecha/combat/marauder.dm +++ b/code/modules/vehicles/mecha/combat/marauder.dm @@ -133,7 +133,7 @@ armor_type = /datum/armor/mecha_mauler accesses = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/mauler - mecha_flags = ID_LOCK_ON | CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE + mecha_flags = ID_LOCK_ON | CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | AI_COMPATIBLE max_equip_by_category = list( MECHA_L_ARM = 1, MECHA_R_ARM = 1, diff --git a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm index 15585e9caa5a..40f40f621e6e 100644 --- a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm +++ b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm @@ -208,14 +208,14 @@ to_chat(crushed_victim, span_userdanger("The tremors from [chassis] landing sends you flying!")) var/fly_away_direction = get_dir(chassis, crushed_victim) crushed_victim.throw_at(get_edge_target_turf(crushed_victim, fly_away_direction), 4, 3) - crushed_victim.adjustBruteLoss(15) + crushed_victim.adjust_brute_loss(15) continue 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(DROP_ALL_REMAINS) continue - crushed_victim.adjustBruteLoss(80) + crushed_victim.adjust_brute_loss(80) /** * ## abort_skyfall diff --git a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm index 5d28d2be6f62..543ee426507f 100644 --- a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm +++ b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm @@ -37,6 +37,8 @@ var/harmful = FALSE ///Sound file: Sound to play when this equipment is destroyed while still attached to the mech var/destroy_sound = 'sound/vehicles/mecha/critdestr.ogg' + ///The action type to use for this equipment. Override for custom action buttons. + var/action_type = /datum/action/vehicle/sealed/mecha/equipment /obj/item/mecha_parts/mecha_equipment/Destroy() if(chassis) @@ -214,6 +216,7 @@ SEND_SIGNAL(src, COMSIG_MECHA_EQUIPMENT_ATTACHED) forceMove(new_mecha) log_message("[src] initialized.", LOG_MECHA) + chassis.on_equipment_attach(src) /** * called to detach this equipment @@ -221,6 +224,7 @@ * * moveto: optional target to move this equipment to */ /obj/item/mecha_parts/mecha_equipment/proc/detach(atom/moveto) + chassis.on_equipment_detach(src) moveto = moveto || get_turf(chassis) forceMove(moveto) playsound(chassis, 'sound/items/weapons/tap.ogg', 50, TRUE) @@ -268,3 +272,4 @@ /// AI mech pilot: returns TRUE if the Ai should try to reload the mecha /obj/item/mecha_parts/mecha_equipment/proc/needs_rearm() return FALSE + diff --git a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm index 4cef8d0bf134..15a60fbb6d56 100644 --- a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm @@ -116,10 +116,10 @@ "patient_health" = patient.health/patient.maxHealth, "patient_state" = patient_state, "core_temp" = core_temp, - "brute_loss" = patient.getBruteLoss(), - "burn_loss" = patient.getFireLoss(), - "toxin_loss" = patient.getToxLoss(), - "oxygen_loss" = patient.getOxyLoss(), + "brute_loss" = patient.get_brute_loss(), + "burn_loss" = patient.get_fire_loss(), + "toxin_loss" = patient.get_tox_loss(), + "oxygen_loss" = patient.get_oxy_loss(), ) data["contained_reagents"] = get_reagent_data(patient.reagents.reagent_list) data["has_brain_damage"] = patient.get_organ_loss(ORGAN_SLOT_BRAIN) != 0 @@ -147,7 +147,7 @@ log_message("[patient] no longer detected - Life support functions disabled.", LOG_MECHA) STOP_PROCESSING(SSobj, src) patient = null - ex_patient.adjustOxyLoss(-2 * seconds_per_tick) + ex_patient.adjust_oxy_loss(-2 * seconds_per_tick) ex_patient.AdjustStun(-4 SECONDS * seconds_per_tick) ex_patient.AdjustKnockdown(-4 SECONDS * seconds_per_tick) ex_patient.AdjustParalyzed(-4 SECONDS * seconds_per_tick) diff --git a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm index 759a513c828e..f8e49cf09492 100644 --- a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm @@ -190,7 +190,7 @@ target.visible_message(span_danger("[chassis] is drilling [target] with [src]!"), \ span_userdanger("[chassis] is drilling you with [src]!")) log_combat(user, target, "drilled", "[name]", "Combat mode: [user.combat_mode ? "On" : "Off"])(DAMTYPE: [uppertext(damtype)])") - if(target.stat == DEAD && target.getBruteLoss() >= (target.maxHealth * 2)) + if(target.stat == DEAD && target.get_brute_loss() >= (target.maxHealth * 2)) log_combat(user, target, "gibbed", name) if(LAZYLEN(target.butcher_results) || LAZYLEN(target.guaranteed_butcher_results)) SEND_SIGNAL(src, COMSIG_MECHA_DRILL_MOB, chassis, target) diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index d8550c14055d..4124e397ba7e 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -195,10 +195,10 @@ /obj/item/mecha_parts/mecha_equipment/armor/antiemp_armor_booster/attach(obj/vehicle/sealed/mecha/new_mecha, attach_right) . = ..() - chassis.AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) + chassis.AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES|EMP_NO_EXAMINE) /obj/item/mecha_parts/mecha_equipment/armor/antiemp_armor_booster/detach(atom/moveto) - chassis.RemoveElement(/datum/element/empprotection, EMP_PROTECT_WIRES) + chassis.RemoveElement(/datum/element/empprotection, EMP_PROTECT_WIRES|EMP_NO_EXAMINE) return ..() /obj/item/mecha_parts/mecha_equipment/armor/antiemp_armor_booster/clandestine diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm index 21831931296e..76a23c281595 100644 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -108,8 +108,6 @@ return ..() if(victim.check_block(chassis, clamp_damage, name, attack_type = OVERWHELMING_ATTACK)) - source.visible_message(span_danger("[chassis] attempts to squeeze [victim] with [src], but the [name] is blocked!"), span_userdanger("You attempt to squeeze [victim] with [src], but [victim.p_They()] managed to block the attempt!"), ignored_mobs = victim) - to_chat(victim, span_userdanger("You block [chassis]'s attempt to squeeze you with [src]!")) return ..() if(iscarbon(victim) && killer_clamp)//meme clamp here @@ -160,7 +158,9 @@ energy_drain = 0 equipment_slot = MECHA_UTILITY range = MECHA_MELEE|MECHA_RANGED - mech_flags = EXOSUIT_MODULE_WORKING + mech_flags = ALL + can_be_triggered = TRUE + action_type = /datum/action/vehicle/sealed/mecha/equipment/extinguisher_action ///Minimum amount of reagent needed to activate. var/required_amount = 80 diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm index 0cfc0712b59b..7e68aaf91cbc 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -273,9 +273,7 @@ to_chat(M, "HONK") M.SetSleeping(0) M.adjust_stutter(40 SECONDS) - var/obj/item/organ/ears/ears = M.get_organ_slot(ORGAN_SLOT_EARS) - if(ears) - ears.adjustEarDamage(0, 30) + M.sound_damage(deafen = 30 SECONDS) M.Paralyze(60) if(prob(30)) M.Stun(200) diff --git a/code/modules/vehicles/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm index a87740d769d6..4175c1fc0b6c 100644 --- a/code/modules/vehicles/mecha/mech_fabricator.dm +++ b/code/modules/vehicles/mecha/mech_fabricator.dm @@ -45,7 +45,7 @@ var/link_on_init = TRUE /// Reference to a remote material inventory, such as an ore silo. - var/datum/component/remote_materials/rmat + var/datum/remote_materials/rmat /// All designs in the techweb that can be fabricated by this machine, since the last update. var/list/datum/design/cached_designs @@ -58,11 +58,12 @@ /obj/machinery/mecha_part_fabricator/Initialize(mapload) print_sound = new(src, FALSE) - rmat = AddComponent(/datum/component/remote_materials, mapload && link_on_init) + rmat = new (src, mapload && link_on_init) cached_designs = list() return ..() /obj/machinery/mecha_part_fabricator/Destroy() + QDEL_NULL(rmat) QDEL_NULL(print_sound) return ..() @@ -224,7 +225,7 @@ if(!D || length(D.reagents_list)) return FALSE - var/datum/component/material_container/materials = rmat.mat_container + var/datum/material_container/materials = rmat.mat_container if (!materials) if(verbose) say("No access to material storage, please contact the quartermaster.") @@ -486,7 +487,7 @@ var/datum/material/material = locate(params["ref"]) var/amount = text2num(params["amount"]) // SAFETY: eject_sheets checks for valid mats - rmat.eject_sheets(material, amount) + rmat.eject_sheets(material, amount, user_data = ID_DATA(usr)) return return FALSE diff --git a/code/modules/vehicles/mecha/mech_melee_attack.dm b/code/modules/vehicles/mecha/mech_melee_attack.dm index 3aee7762b763..ed16bb8f60dc 100644 --- a/code/modules/vehicles/mecha/mech_melee_attack.dm +++ b/code/modules/vehicles/mecha/mech_melee_attack.dm @@ -68,9 +68,26 @@ return take_damage(mecha_attacker.force * 3, mecha_attacker.damtype, "melee", FALSE, get_dir(src, mecha_attacker)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs. /obj/structure/window/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) + if(!user.combat_mode) + return if(!can_be_reached()) return - return ..() + + mecha_attacker.do_attack_animation(src) + switch(mecha_attacker.damtype) + if(BRUTE) + playsound(src, mecha_attacker.brute_attack_sound, 50, TRUE) + if(BURN) + playsound(src, mecha_attacker.burn_attack_sound, 50, TRUE) + else + return + mecha_attacker.visible_message(span_danger("[mecha_attacker] smashes [src]!"), span_danger("You smash [src]!"), null, COMBAT_MESSAGE_RANGE) + // Additionally destroy any grilles + for(var/obj/structure/grille/grille in src.loc) + if(istype(grille)) + grille.take_damage(mecha_attacker.force * 10, mecha_attacker.damtype, "melee", FALSE, get_dir(src, mecha_attacker)) + ..() + return take_damage(mecha_attacker.force * 100, mecha_attacker.damtype, "melee", FALSE, get_dir(src, mecha_attacker)) /obj/vehicle/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) if(!user.combat_mode) @@ -100,9 +117,14 @@ if(!isnull(user) && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You don't want to harm other living beings!")) return + mecha_attacker.do_attack_animation(src) if(mecha_attacker.damtype == BRUTE) step_away(src, mecha_attacker, 15) + + if(check_block(mecha_attacker, mecha_attacker.force * 3, "the [mecha_attacker.attack_verbs[1]]", attack_type = OVERWHELMING_ATTACK)) + return + switch(mecha_attacker.damtype) if(BRUTE) if(mecha_attacker.force > 35) // durand and other heavy mechas diff --git a/code/modules/vehicles/mecha/mecha_actions.dm b/code/modules/vehicles/mecha/mecha_actions.dm index 8cd6918dc8be..182b7a434947 100644 --- a/code/modules/vehicles/mecha/mecha_actions.dm +++ b/code/modules/vehicles/mecha/mecha_actions.dm @@ -144,10 +144,12 @@ chassis.balloon_alert(owner, "controlling gunner seat") chassis.remove_control_flags(owner, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_SETTINGS) chassis.add_control_flags(owner, VEHICLE_CONTROL_MELEE|VEHICLE_CONTROL_EQUIPMENT) + chassis.remove_all_equipment_actions(owner) else chassis.balloon_alert(owner, "controlling pilot seat") chassis.remove_control_flags(owner, VEHICLE_CONTROL_MELEE|VEHICLE_CONTROL_EQUIPMENT) chassis.add_control_flags(owner, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_SETTINGS) + chassis.generate_equipment_actions(owner) chassis.update_icon_state() /datum/action/vehicle/sealed/mecha/mech_overclock @@ -162,3 +164,109 @@ chassis.toggle_overclock(forced_state) button_icon_state = "mech_overload_[chassis.overclock_mode ? "on" : "off"]" build_all_button_icons() + +/datum/action/vehicle/sealed/mecha/equipment + name = "Mech Equipment" + button_icon_state = null + background_icon_state = "bg_tech" + var/obj/item/mecha_parts/mecha_equipment/equipment + +/datum/action/vehicle/sealed/mecha/equipment/Destroy() + equipment = null + return ..() + +/datum/action/vehicle/sealed/mecha/equipment/Trigger(mob/clicker, trigger_flags) + if(!..()) + return + if(!chassis || !(owner in chassis.occupants) || !equipment) + return + + equipment.set_active(!equipment.active) + equipment.handle_ui_act(action = "toggle") + chassis.balloon_alert(owner, "[equipment.name] [equipment.active ? "on" : "off"]!") + +/datum/action/vehicle/sealed/mecha/equipment/proc/set_equipment(passed_equipment) + equipment = passed_equipment + name = "Toggle [equipment.name]" + desc = equipment.desc + target = equipment + if(target) + AddComponent(/datum/component/action_item_overlay, equipment) + + build_button_icon() + +/datum/action/vehicle/sealed/mecha/equipment/cargo_module + name = "Cargo Module" + +/datum/action/vehicle/sealed/mecha/equipment/cargo_module/set_equipment(passed_equipment) + . = ..() + name = "[equipment.name]" + +/datum/action/vehicle/sealed/mecha/equipment/cargo_module/Trigger(mob/clicker, trigger_flags) + if(!chassis || !(owner in chassis.occupants) || !equipment) + return + if(!istype(equipment, /obj/item/mecha_parts/mecha_equipment/ejector)) + return + + var/obj/item/mecha_parts/mecha_equipment/ejector/cargo_hold = equipment + + // Right click - show radial menu + if(trigger_flags & TRIGGER_SECONDARY_ACTION) + var/list/cargo_radial = list() + for(var/atom/movable/cargo_item in cargo_hold.contents) + cargo_radial[cargo_item] = cargo_item.appearance + + if(!length(cargo_radial)) + chassis.balloon_alert(owner, "cargo hold empty!") + return + + var/atom/movable/picked_item = show_radial_menu(owner, chassis, cargo_radial, require_near = TRUE) + if(!picked_item || !(picked_item in cargo_hold.contents)) + return + + to_chat(chassis.occupants, "[icon2html(cargo_hold, chassis.occupants)][span_notice("You unload [picked_item].")]") + picked_item.forceMove(cargo_hold.drop_location()) + if(picked_item == chassis.ore_box) + chassis.ore_box = null + playsound(chassis, 'sound/items/weapons/tap.ogg', 50, TRUE) + cargo_hold.log_message("Unloaded [picked_item]. Cargo compartment capacity: [cargo_hold.cargo_capacity - cargo_hold.contents.len]", LOG_MECHA) + return + + // Left click - dispose first item + if(cargo_hold.contents.len) + var/atom/movable/first_item = cargo_hold.contents[1] + to_chat(chassis.occupants, "[icon2html(cargo_hold, chassis.occupants)][span_notice("You unload [first_item].")]") + first_item.forceMove(cargo_hold.drop_location()) + if(first_item == chassis.ore_box) + chassis.ore_box = null + playsound(chassis, 'sound/items/weapons/tap.ogg', 50, TRUE) + cargo_hold.log_message("Unloaded [first_item]. Cargo compartment capacity: [cargo_hold.cargo_capacity - cargo_hold.contents.len]", LOG_MECHA) + else + chassis.balloon_alert(owner, "cargo hold empty!") + +/datum/action/vehicle/sealed/mecha/equipment/extinguisher_action + name = "Extinguisher" + +/datum/action/vehicle/sealed/mecha/equipment/extinguisher_action/set_equipment(passed_equipment) + . = ..() + name = "[equipment.name]" + +/datum/action/vehicle/sealed/mecha/equipment/extinguisher_action/Trigger(mob/clicker, trigger_flags) + if(!chassis || !(owner in chassis.occupants) || !equipment) + return + if(!istype(equipment, /obj/item/mecha_parts/mecha_equipment/extinguisher)) + return + + var/obj/item/mecha_parts/mecha_equipment/extinguisher/extinguisher = equipment + + // Right click - refill + if(trigger_flags & TRIGGER_SECONDARY_ACTION) + extinguisher.attempt_refill(owner) + return + + // Left click - spray + if(extinguisher.reagents.total_volume < extinguisher.required_amount) + chassis.balloon_alert(owner, "not enough water!") + return + + extinguisher.spray_extinguisher(owner) diff --git a/code/modules/vehicles/mecha/mecha_ai_interaction.dm b/code/modules/vehicles/mecha/mecha_ai_interaction.dm index 02bc2c89953c..7a13e423bb43 100644 --- a/code/modules/vehicles/mecha/mecha_ai_interaction.dm +++ b/code/modules/vehicles/mecha/mecha_ai_interaction.dm @@ -78,10 +78,7 @@ return if(AI_MECH_HACK) //Called by AIs on the mech - var/obj/structure/ai_core/deactivated/deactivated_core = new(AI.loc, FALSE, FALSE, AI) - AI.linked_core = deactivated_core - AI.linked_core.RegisterSignal(deactivated_core, COMSIG_ATOM_DESTRUCTION, TYPE_PROC_REF(/obj/structure/ai_core/deactivated, disable_doomsday)) //Protect that core! The structure goes bye-bye when we re-shunt back in so no need for cleanup. - AI.linked_core.remote_ai = AI + AI.create_core_link(new /obj/structure/ai_core(AI.loc, CORE_STATE_FINISHED, AI.make_mmi())) if(AI.can_dominate_mechs && LAZYLEN(occupants)) //Oh, I am sorry, were you using that? to_chat(AI, span_warning("Occupants detected! Forced ejection initiated!")) to_chat(occupants, span_danger("You have been forcibly ejected!")) diff --git a/code/modules/vehicles/mecha/mecha_construction_paths.dm b/code/modules/vehicles/mecha/mecha_construction_paths.dm index 35e394f5062a..631d61c7ba6d 100644 --- a/code/modules/vehicles/mecha/mecha_construction_paths.dm +++ b/code/modules/vehicles/mecha/mecha_construction_paths.dm @@ -1,7 +1,4 @@ - -//////////////////////////////// -///// Construction datums ////// -//////////////////////////////// +/// Mecha construction /datum/component/construction/mecha var/base_icon @@ -42,17 +39,35 @@ // Override if the mech needs an entirely custom process (See HONK mech) // Otherwise override specific steps as needed (Ripley, Clarke, Phazon) /datum/component/construction/mecha/proc/get_steps() - return get_frame_steps() + get_circuit_steps() + (circuit_weapon ? get_circuit_weapon_steps() : list()) + get_stockpart_steps() + get_inner_plating_steps() + get_outer_plating_steps() - -/datum/component/construction/mecha/update_parent(step_index) - steps = get_steps() - ..() - // By default, each step in mech construction has a single icon_state: - // "[base_icon][index - 1]" - // For example, Ripley's step 1 icon_state is "ripley0" - var/atom/parent_atom = parent - if(!steps[index]["icon_state"] && base_icon) - parent_atom.icon_state = "[base_icon][index - 1]" + var/list/all_steps = \ + get_frame_steps() + \ + get_circuit_steps() + \ + get_circuit_weapon_steps() + \ + get_stockpart_steps() + \ + get_inner_plating_steps() + \ + get_outer_plating_steps() + + // If you don't set a construction icon state, one will automatically be assigned + // based on the index of the step in the step list + // + // If you do set a custom icon state, it will not be overridden, but the state will still increment. + // + // You can use skip_state to prevent a step from increasing the index, + // useful for steps which don't affect the mech's appearance at all + // or for steps which have custom icon states that don't follow the normal pattern. + var/state = 0 + for(var/list/step_data as anything in all_steps) + if(step_data["skip_state"]) + continue + + step_data["icon_state"] ||= "[base_icon][state]" + state += 1 + + return all_steps + +/datum/component/construction/mecha/Initialize() + steps ||= get_steps() + return ..() /datum/component/construction/unordered/mecha_chassis/custom_action(obj/item/I, mob/living/user, typepath) . = user.transferItemToLoc(I, parent) @@ -67,7 +82,7 @@ parent_atom.icon = 'icons/mob/rideables/mech_construction.dmi' parent_atom.set_density(TRUE) parent_atom.cut_overlays() - ..() + return ..() // Default proc for the first steps of mech construction. /datum/component/construction/mecha/proc/get_frame_steps() @@ -82,7 +97,7 @@ "back_key" = TOOL_WRENCH, "desc" = "The hydraulic systems are connected, and can be activated with a screwdriver.", "forward_message" = "activated the hydraulic systems", - "backward_message" = "disconnected the hydraulic systems" + "backward_message" = "disconnected the hydraulic systems", ), list( "key" = /obj/item/stack/cable_coil, @@ -90,14 +105,14 @@ "back_key" = TOOL_SCREWDRIVER, "desc" = "The hydraulic systems are active, and the frame can be wired.", "forward_message" = "added wiring", - "backward_message" = "deactivated the hydraulic systems" + "backward_message" = "deactivated the hydraulic systems", ), list( "key" = TOOL_WIRECUTTER, "back_key" = TOOL_SCREWDRIVER, "desc" = "The wiring is added, and can be adjusted with wirecutters.", "forward_message" = "adjusted wiring", - "backward_message" = "removed wiring" + "backward_message" = "removed wiring", ) ) @@ -111,14 +126,14 @@ "back_key" = TOOL_SCREWDRIVER, "desc" = "The wiring is adjusted, and the central control module slot has opened.", "forward_message" = "added central control module", - "backward_message" = "disconnected wiring" + "backward_message" = "disconnected wiring", ), list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, "desc" = "Central control module is installed, and can be screwed into place.", "forward_message" = "secured central control module", - "backward_message" = "removed central control module" + "backward_message" = "removed central control module", ), list( "key" = circuit_periph, @@ -126,38 +141,42 @@ "back_key" = TOOL_SCREWDRIVER, "desc" = "Central control module is secured, and the peripheral control module slot has opened.", "forward_message" = "added peripheral control module", - "backward_message" = "unsecured central control module" + "backward_message" = "unsecured central control module", ), list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, "desc" = "Peripheral control module is installed, and can be screwed into place.", "forward_message" = "secured peripheral control module", - "backward_message" = "removed peripheral control module" + "backward_message" = "removed peripheral control module", ) ) // Default proc for weapon circuitboard steps // Used by combat mechs /datum/component/construction/mecha/proc/get_circuit_weapon_steps() + if(!circuit_weapon) + return list() + return list( list( "key" = circuit_weapon, "action" = ITEM_DELETE, "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured, and the weapon control module slot has opened.", + "desc" = "Peripherals control module is secured, and the weapon control module slot has opened.", "forward_message" = "added weapon control module", - "backward_message" = "unsecured peripheral control module" + "backward_message" = "unsecured peripheral control module", ), list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, "desc" = "Weapon control module is installed, and can be screwed into place.", "forward_message" = "secured weapon control module", - "backward_message" = "removed weapon control module" + "backward_message" = "removed weapon control module", ) ) + // Default proc for stock part installation // Third set of steps by default /datum/component/construction/mecha/proc/get_stockpart_steps() @@ -171,14 +190,14 @@ "back_key" = TOOL_SCREWDRIVER, "desc" = prevstep_text, "forward_message" = "added scanning module", - "backward_message" = backward_text + "backward_message" = backward_text, ), list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, "desc" = "Scanning module is installed, and can be screwed into place.", "forward_message" = "secured scanning module", - "backward_message" = "removed scanning module" + "backward_message" = "removed scanning module", ), list( "key" = /obj/item/stock_parts/capacitor, @@ -186,14 +205,14 @@ "back_key" = TOOL_SCREWDRIVER, "desc" = "Scanning module is secured, the capacitor can be added.", "forward_message" = "added capacitor", - "backward_message" = "unscecured scanning module" + "backward_message" = "unscecured scanning module", ), list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, "desc" = "Capacitor is installed, and can be screwed into place.", "forward_message" = "secured capacitor", - "backward_message" = "removed capacitor" + "backward_message" = "removed capacitor", ), list( "key" = /obj/item/stock_parts/servo, @@ -201,14 +220,14 @@ "back_key" = TOOL_SCREWDRIVER, "desc" = "Scanning module is secured, the servo can be added.", "forward_message" = "added servo", - "backward_message" = "unsecured capacitor" + "backward_message" = "unsecured capacitor", ), list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, "desc" = "Servo is installed, and can be screwed into place.", "forward_message" = "secured servo", - "backward_message" = "removed servo" + "backward_message" = "removed servo", ), list( "key" = /obj/item/stock_parts/power_store/cell, @@ -216,14 +235,14 @@ "back_key" = TOOL_SCREWDRIVER, "desc" = "Servo is secured, and the power cell can be added.", "forward_message" = "added power cell", - "backward_message" = "unsecured servo" + "backward_message" = "unsecured servo", ), list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, "desc" = "The power cell is installed, and can be screwed into place.", "forward_message" = "secured power cell", - "backward_message" = "removed power cell" + "backward_message" = "removed power cell", ) ) @@ -239,7 +258,7 @@ "back_key" = TOOL_SCREWDRIVER, "desc" = "The power cell is secured, [inner_plating_amount] sheets of [initial(inner_plating.name)] can be used as inner plating.", "forward_message" = "installed internal armor layer", - "backward_message" = "unsecured power cell" + "backward_message" = "unsecured power cell", ) ) else @@ -250,7 +269,7 @@ "back_key" = TOOL_SCREWDRIVER, "desc" = "The power cell is secured, [initial(inner_plating.name)] can be used as inner plating.", "forward_message" = "installed internal armor layer", - "backward_message" = "unsecured power cell" + "backward_message" = "unsecured power cell", ) ) @@ -260,14 +279,14 @@ "back_key" = TOOL_CROWBAR, "desc" = "Inner plating is installed, and can be wrenched into place.", "forward_message" = "secured internal armor layer", - "backward_message" = "pried off internal armor layer" + "backward_message" = "pried off internal armor layer", ), list( "key" = TOOL_WELDER, "back_key" = TOOL_WRENCH, "desc" = "Inner plating is wrenched, and can be welded.", "forward_message" = "welded internal armor layer", - "backward_message" = "unfastened internal armor layer" + "backward_message" = "unfastened internal armor layer", ) ) @@ -283,7 +302,7 @@ "back_key" = TOOL_WELDER, "desc" = "Inner plating is welded, [outer_plating_amount] sheets of [initial(outer_plating.name)] can be used as external armor.", "forward_message" = "installed external armor layer", - "backward_message" = "cut off internal armor layer" + "backward_message" = "cut off internal armor layer", ) ) else @@ -294,7 +313,7 @@ "back_key" = TOOL_WELDER, "desc" = "Inner plating is welded, [initial(outer_plating.name)] can be used as external armor.", "forward_message" = "installed external armor layer", - "backward_message" = "cut off internal armor layer" + "backward_message" = "cut off internal armor layer", ) ) @@ -304,14 +323,14 @@ "back_key" = TOOL_CROWBAR, "desc" = "External armor is installed, and can be wrenched into place.", "forward_message" = "secured external armor layer", - "backward_message" = "pried off external armor layer" + "backward_message" = "pried off external armor layer", ), list( "key" = TOOL_WELDER, "back_key" = TOOL_WRENCH, "desc" = "External armor is wrenched, and can be welded.", "forward_message" = "welded external armor layer", - "backward_message" = "unfastened external armor layer" + "backward_message" = "unfastened external armor layer", ) ) @@ -322,8 +341,15 @@ if(diff == FORWARD && steps[index]["forward_message"]) user.balloon_alert_to_viewers(steps[index]["forward_message"]) + var/list/next_step = index == steps.len ? null : steps[index + 1] + if(next_step?["desc"]) + to_chat(user, span_smallnoticeital(next_step["desc"])) + else if(steps[index]["backward_message"]) user.balloon_alert_to_viewers(steps[index]["backward_message"]) + var/list/last_step = index <= 1 ? null : steps[index - 1] + if(last_step?["desc"]) + to_chat(user, span_smallnoticeital(last_step["desc"])) return TRUE @@ -352,22 +378,22 @@ outer_plating_amount = 10 /datum/component/construction/mecha/ripley/get_outer_plating_steps() + // we yoink the first step of adding plating and modify the flavor a bit + var/list/first_step = ..()[1] + first_step["desc"] = "Plating is welded, and 10 rods can be used to install the cockpit." + first_step["forward_message"] = "installed cockpit" + first_step["backward_message"] = "cut off plating" + + // then we add our own second step for welding the cockpit in place return list( - list( - "key" = /obj/item/stack/rods, - "amount" = 10, - "back_key" = TOOL_WELDER, - "desc" = "Outer plating is welded, and 10 rods can be used to install the cockpit.", - "forward_message" = "installed cockpit", - "backward_message" = "cut off outer armor layer" - ), + first_step, list( "key" = TOOL_WELDER, "back_key" = TOOL_WIRECUTTER, "desc" = "Cockpit wire screen is installed, and can be welded.", "forward_message" = "welded cockpit", - "backward_message" = "cut off cockpit" - ), + "backward_message" = "cut off cockpit", + ) ) //GYGAX @@ -584,7 +610,7 @@ var/atom/parent_atom = parent parent_atom.icon = 'icons/mob/rideables/mech_construct.dmi' parent_atom.icon_state = "honker_chassis" - ..() + return ..() /datum/component/construction/mecha/honker/custom_action(obj/item/I, mob/living/user, diff) if(istype(I, /obj/item/bikehorn)) @@ -646,6 +672,18 @@ outer_plating = /obj/item/mecha_parts/part/phazon_armor outer_plating_amount = 1 + var/obj/item/required_core = /obj/item/assembly/signaler/anomaly/ectoplasm + +/datum/component/construction/mecha/phazon/custom_action(obj/item/I, mob/living/user, diff) + if(!..()) + return FALSE + + if(istype(I, /obj/item/assembly/signaler/anomaly) && !istype(I, required_core)) + to_chat(user, span_warning("The anomaly core socket only accepts \a [initial(required_core.name)]!")) + return FALSE + + return TRUE + /datum/component/construction/mecha/phazon/get_stockpart_steps() return list( list( @@ -654,14 +692,14 @@ "back_key" = TOOL_SCREWDRIVER, "desc" = "Weapon control module is secured, and the scanning module can be added.", "forward_message" = "added scanning module", - "backward_message" = "unsecured weapon control module" + "backward_message" = "unsecured weapon control module", ), list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, "desc" = "Scanning module is installed, and can be screwed into place.", "forward_message" = "secured scanning module", - "backward_message" = "removed scanning module" + "backward_message" = "removed scanning module", ), list( "key" = /obj/item/stock_parts/capacitor, @@ -669,14 +707,14 @@ "back_key" = TOOL_SCREWDRIVER, "desc" = "Scanning module is secured, and the capacitor can be added.", "forward_message" = "added capacitor", - "backward_message" = "unsecured scanning module" + "backward_message" = "unsecured scanning module", ), list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, "desc" = "Capacitor is installed, and can be screwed into place.", "forward_message" = "secured capacitor", - "backward_message" = "removed capacitor" + "backward_message" = "removed capacitor", ), list( "key" = /obj/item/stock_parts/servo, @@ -684,14 +722,14 @@ "back_key" = TOOL_SCREWDRIVER, "desc" = "Capacitor is secured, the servo can be added.", "forward_message" = "added servo", - "backward_message" = "unsecured capacitor" + "backward_message" = "unsecured capacitor", ), list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, "desc" = "Servo is installed, and can be screwed into place.", "forward_message" = "secured servo", - "backward_message" = "removed servo" + "backward_message" = "removed servo", ), list( "key" = /obj/item/stack/ore/bluespace_crystal, @@ -699,7 +737,7 @@ "back_key" = TOOL_SCREWDRIVER, "desc" = "Servo is secured, and the bluespace crystal can be added.", "forward_message" = "added bluespace crystal", - "backward_message" = "unsecured servo" + "backward_message" = "unsecured servo", ), list( "key" = /obj/item/stack/cable_coil, @@ -707,14 +745,16 @@ "back_key" = TOOL_CROWBAR, "desc" = "The bluespace crystal is installed, and can be wired to the mech systems.", "forward_message" = "connected bluespace crystal", - "backward_message" = "removed bluespace crystal" + "backward_message" = "removed bluespace crystal", + "icon_state" = "phazon19", ), list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_WIRECUTTER, "desc" = "The bluespace crystal is connected, and the system can be engaged with a screwdriver.", "forward_message" = "engaded bluespace crystal", - "backward_message" = "disconnected bluespace crystal" + "backward_message" = "disconnected bluespace crystal", + "icon_state" = "phazon20", ), list( "key" = /obj/item/stock_parts/power_store/cell, @@ -722,52 +762,29 @@ "back_key" = TOOL_SCREWDRIVER, "desc" = "The bluespace crystal is engaged, and the power cell can be added.", "forward_message" = "added power cell", - "backward_message" = "disengaged bluespace crystal" + "backward_message" = "disengaged bluespace crystal", + "icon_state" = "phazon21", ), list( "key" = TOOL_SCREWDRIVER, "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed, and can be screwed into place.",, + "desc" = "The power cell is installed, and can be screwed into place.", "forward_message" = "secured power cell", "backward_message" = "removed power cell", - "icon_state" = "phazon19" - // This is the point where a step icon is skipped, so "icon_state" had to be set manually starting from here. + "icon_state" = "phazon21", ) ) /datum/component/construction/mecha/phazon/get_outer_plating_steps() - return list( - list( - "key" = outer_plating, - "amount" = 1, - "action" = ITEM_DELETE, - "back_key" = TOOL_WELDER, - "desc" = "Internal armor is welded, [initial(outer_plating.name)] can be used as external armor.", - "forward_message" = "added external armor layer", - "backward_message" = "cut off internal armor layer" - ), - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed, and can be wrenched into place.", - "forward_message" = "secured external armor layer", - "backward_message" = "pried off external armor" - ), - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched, and can be welded.", - "forward_message" = "welded external armor", - "backward_message" = "unfastened external armor layer" - ), + return ..() + list( list( - "key" = /obj/item/assembly/signaler/anomaly/ectoplasm, + "key" = required_core, "action" = ITEM_DELETE, "back_key" = TOOL_WELDER, - "desc" = "The external armor is welded, and the ectoplasm anomaly core socket is open.", - "icon_state" = "phazon26", - "forward_message" = "inserted ectoplasm anomaly core", - "backward_message" = "cut off external armor" + "desc" = "The external armor is welded, and the [initial(required_core.name)] socket is open.", + "forward_message" = "inserted [initial(required_core.name)]", + "backward_message" = "cut off external armor", + "skip_state" = TRUE, ) ) diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index 3dcd5835b2e1..f41b3006e038 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -114,21 +114,21 @@ log_message("Hit by [AM].", LOG_MECHA, color="red") return ..() -/obj/vehicle/sealed/mecha/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit) //wrapper - +/obj/vehicle/sealed/mecha/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) // Determine our potential to shoot through the mech and into the cockpit, hitting the pilot var/kill_the_meat = clamp(hitting_projectile.armour_penetration - get_armor_rating(hitting_projectile.armor_flag), 0, 100) - - //allows bullets to hit the pilot of open-canopy mechs, or if the bullet penetrates to the pilot, or the bullet can pass through structures - if((!(mecha_flags & IS_ENCLOSED) || kill_the_meat && prob(kill_the_meat) && !(mecha_flags & CANNOT_OVERPENETRATE) || hitting_projectile.pass_flags & (PASSSTRUCTURE|PASSVEHICLE)) \ - && LAZYLEN(occupants) \ - && !(mecha_flags & SILICON_PILOT) \ - && (def_zone == BODY_ZONE_HEAD || def_zone == BODY_ZONE_CHEST)) - var/mob/living/hitmob = pick(occupants) - return hitmob.projectile_hit(hitting_projectile, def_zone, piercing_hit) //If we've passed any of the above conditions, the pilot can be hit - + // Allows bullets to hit the pilot of open-canopy mechs, or if the bullet penetrates to the pilot, or the bullet can pass through structures + if (!LAZYLEN(occupants) || (mecha_flags & SILICON_PILOT)) + return ..() + if (def_zone != BODY_ZONE_HEAD && def_zone != BODY_ZONE_CHEST) + return ..() + if ((mecha_flags & IS_ENCLOSED) && !(kill_the_meat && prob(kill_the_meat) && !(mecha_flags & CANNOT_OVERPENETRATE)) && !(hitting_projectile.pass_flags & (PASSSTRUCTURE|PASSVEHICLE))) + return ..() + var/mob/living/hitmob = pick(occupants) + return hitmob.projectile_hit(hitting_projectile, def_zone, piercing_hit) //If we've passed any of the above conditions, the pilot can be hit + +/obj/vehicle/sealed/mecha/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked = null) . = ..() - log_message("Hit by projectile. Type: [hitting_projectile]([hitting_projectile.damage_type]).", LOG_MECHA, color="red") // yes we *have* to run the armor calc proc here I love tg projectile code too try_damage_component(run_atom_armor( @@ -139,7 +139,6 @@ armour_penetration = hitting_projectile.armour_penetration, ), def_zone) - /obj/vehicle/sealed/mecha/ex_act(severity, target) log_message("Affected by explosion of severity: [severity].", LOG_MECHA, color="red") return ..() diff --git a/code/modules/vehicles/mecha/mecha_mob_interaction.dm b/code/modules/vehicles/mecha/mecha_mob_interaction.dm index f031e06ecf8f..57250ecb4371 100644 --- a/code/modules/vehicles/mecha/mecha_mob_interaction.dm +++ b/code/modules/vehicles/mecha/mecha_mob_interaction.dm @@ -111,7 +111,9 @@ brain_mob.log_message("was put into [src] by [key_name(user)]", LOG_GAME, log_globally = FALSE) return TRUE + /obj/vehicle/sealed/mecha/mob_exit(mob/M, silent = FALSE, randomstep = FALSE, forced = FALSE) + // FIXME: this code is really bad (shocker). Needs a refactor var/atom/movable/mob_container var/turf/newloc = get_turf(src) if(ishuman(M)) @@ -147,14 +149,12 @@ if(!forced && !silent) to_chat(AI, span_notice("Returning to core...")) mecha_flags &= ~SILICON_PILOT - newloc = get_turf(AI.linked_core) - qdel(AI.linked_core) - AI.forceMove(newloc) + AI.resolve_core_link() if(forced) to_chat(AI, span_danger("ZZUZULU.ERR--ERRR-NEUROLOG-- PERCEP--- DIST-B**@")) for(var/count in 1 to 5) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(do_sparks), rand(10, 20), FALSE, AI), count SECONDS) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(empulse), get_turf(AI), /*heavy_range = */10, /*light_range = */20), 10 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(empulse), get_turf(AI), /*heavy_range = */10, /*light_range = */20, AI), 10 SECONDS) return ..() else if(isliving(M)) mob_container = M diff --git a/code/modules/vehicles/mecha/mecha_movement.dm b/code/modules/vehicles/mecha/mecha_movement.dm index b5817d81378b..46b49cc2ee52 100644 --- a/code/modules/vehicles/mecha/mecha_movement.dm +++ b/code/modules/vehicles/mecha/mecha_movement.dm @@ -205,6 +205,6 @@ */ /obj/vehicle/sealed/mecha/proc/do_camera_update(oldLoc) if(oldLoc != get_turf(src)) - GLOB.cameranet.updatePortableCamera(chassis_camera, MECH_CAMERA_BUFFER) + SScameras.update_portable_camera(chassis_camera, MECH_CAMERA_BUFFER) updating = FALSE #undef MECH_CAMERA_BUFFER diff --git a/code/modules/vehicles/mecha/mecha_parts.dm b/code/modules/vehicles/mecha/mecha_parts.dm index a8719eb1d4dd..e04d7bc2d145 100644 --- a/code/modules/vehicles/mecha/mecha_parts.dm +++ b/code/modules/vehicles/mecha/mecha_parts.dm @@ -9,6 +9,9 @@ abstract_type = /obj/item/mecha_parts w_class = WEIGHT_CLASS_GIGANTIC obj_flags = CONDUCTS_ELECTRICITY + sound_vary = TRUE + pickup_sound = SFX_GENERIC_DEVICE_PICKUP + drop_sound = SFX_GENERIC_DEVICE_DROP /obj/item/mecha_parts/proc/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M, attach_right = FALSE) //For attaching parts to a finished mech if(!user.transferItemToLoc(src, M)) @@ -252,12 +255,6 @@ name = "\improper Phazon chassis" construct_type = /datum/component/construction/unordered/mecha_chassis/phazon -/obj/item/mecha_parts/chassis/phazon/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(istype(tool, /obj/item/assembly/signaler/anomaly) && !istype(tool, /obj/item/assembly/signaler/anomaly/ectoplasm)) - to_chat(user, "The anomaly core socket only accepts ectoplasm anomaly cores!") - return ITEM_INTERACT_BLOCKING - return ..() - /obj/item/mecha_parts/part/phazon_torso name="\improper Phazon torso" desc="A Phazon torso part. The socket for the ectoplasmic core that powers the exosuit's unique phase drives is located in the middle." diff --git a/code/modules/vehicles/mecha/mecha_wreckage.dm b/code/modules/vehicles/mecha/mecha_wreckage.dm index dc0414e86063..485c6ee82811 100644 --- a/code/modules/vehicles/mecha/mecha_wreckage.dm +++ b/code/modules/vehicles/mecha/mecha_wreckage.dm @@ -42,6 +42,11 @@ if(AI) QDEL_NULL(AI) QDEL_LIST(crowbar_salvage) + src.visible_message(span_danger("[src]'s superstructure folds in on itself, collapsing into a heap of unsalvageable scrap!")) + playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE) + for(var/mob/living/witness in range(2, src)) + shake_camera(witness, 2, 1) + new /obj/effect/decal/cleanable/blood/gibs/robot_debris(get_turf(src)) return ..() /obj/structure/mecha_wreckage/examine(mob/user) diff --git a/code/modules/vehicles/mecha/medical/odysseus.dm b/code/modules/vehicles/mecha/medical/odysseus.dm index e6f02e2710b5..2ee32c4f53e1 100644 --- a/code/modules/vehicles/mecha/medical/odysseus.dm +++ b/code/modules/vehicles/mecha/medical/odysseus.dm @@ -1,5 +1,5 @@ /obj/vehicle/sealed/mecha/odysseus - desc = "These exosuits are developed and produced by Vey-Med. (© All rights reserved)." + desc = "A nimble DeForest Odysseus exosuit, designed and outfitted for frontline medical support and rapid response." name = "\improper Odysseus" icon_state = "odysseus" base_icon_state = "odysseus" @@ -14,15 +14,16 @@ /obj/vehicle/sealed/mecha/odysseus/moved_inside(mob/living/carbon/human/human) . = ..() - if(. && !HAS_TRAIT(human, TRAIT_MEDICAL_HUD)) - ADD_TRAIT(human, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT) + if(!.) + return + ADD_TRAIT(human, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT) /obj/vehicle/sealed/mecha/odysseus/remove_occupant(mob/living/carbon/human/human) - if(isliving(human) && HAS_TRAIT_FROM(human, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT)) - REMOVE_TRAIT(human, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT) + REMOVE_TRAIT(human, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT) return ..() /obj/vehicle/sealed/mecha/odysseus/mmi_moved_inside(obj/item/mmi/MMI, mob/user) . = ..() - if(. && !isnull(MMI.brainmob) && !HAS_TRAIT(MMI.brainmob, TRAIT_MEDICAL_HUD)) - ADD_TRAIT(MMI.brainmob, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT) + if(!. || isnull(MMI.brainmob)) + return + ADD_TRAIT(MMI.brainmob, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT) diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index 76d57acb431c..46d21f4585da 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -300,6 +300,8 @@ GLOBAL_DATUM(cargo_ripley, /obj/vehicle/sealed/mecha/ripley/cargo) icon_state = "mecha_bin" equipment_slot = MECHA_UTILITY detachable = FALSE + can_be_triggered = TRUE + action_type = /datum/action/vehicle/sealed/mecha/equipment/cargo_module ///Number of atoms we can store var/cargo_capacity = 15 diff --git a/code/modules/vehicles/motorized_wheelchair.dm b/code/modules/vehicles/motorized_wheelchair.dm index 7d11155bbab9..3e85b2263cac 100644 --- a/code/modules/vehicles/motorized_wheelchair.dm +++ b/code/modules/vehicles/motorized_wheelchair.dm @@ -6,6 +6,7 @@ foldabletype = null max_integrity = 150 ttv_icon = "motor_chair_ttv" + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 14.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT) ///How "fast" the wheelchair goes only affects ramming var/speed = 2 ///Self explanatory, ratio of how much power we use @@ -197,13 +198,13 @@ unbuckle_mob(disabled) disabled.throw_at(throw_target, 2, 3) disabled.Knockdown(10 SECONDS) - disabled.adjustStaminaLoss(40) + disabled.adjust_stamina_loss(40) if(isliving(bumped_atom)) var/mob/living/ramtarget = bumped_atom throw_target = get_edge_target_turf(ramtarget, pick(GLOB.cardinals)) ramtarget.throw_at(throw_target, 2, 3) ramtarget.Knockdown(8 SECONDS) - ramtarget.adjustStaminaLoss(35) + ramtarget.adjust_stamina_loss(35) visible_message(span_danger("[src] crashes into [ramtarget], sending [disabled] and [ramtarget] flying!")) else visible_message(span_danger("[src] crashes into [bumped_atom], sending [disabled] flying!")) diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 7a4100f753ec..d3f1ff5ba10a 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -3,6 +3,7 @@ desc = "A fun way to get around." icon_state = "scooter" are_legs_exposed = TRUE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 11) /obj/vehicle/ridden/scooter/Initialize(mapload) . = ..() @@ -39,6 +40,7 @@ desc = "An old, battered skateboard. It's still rideable, but probably unsafe." icon_state = "skateboard" density = FALSE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 10) ///Sparks datum for when we grind on tables var/datum/effect_system/spark_spread/sparks ///Whether the board is currently grinding @@ -94,9 +96,9 @@ return next_crash = world.time + 10 - rider.adjustStaminaLoss(instability*6) + rider.adjust_stamina_loss(instability*6) playsound(src, 'sound/effects/bang.ogg', 40, TRUE) - if(!iscarbon(rider) || rider.getStaminaLoss() >= 100 || grinding || iscarbon(bumped_thing)) + if(!iscarbon(rider) || rider.get_stamina_loss() >= 100 || grinding || iscarbon(bumped_thing)) var/atom/throw_target = get_edge_target_turf(rider, pick(GLOB.cardinals)) unbuckle_mob(rider) if((istype(bumped_thing, /obj/machinery/disposal/bin))) @@ -108,7 +110,7 @@ rider.throw_at(throw_target, 3, 2) var/head_slot = rider.get_item_by_slot(ITEM_SLOT_HEAD) if(!head_slot || !(istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/utility/hardhat))) - rider.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) + rider.adjust_organ_loss(ORGAN_SLOT_BRAIN, 5) rider.updatehealth() visible_message(span_danger("[src] crashes into [bumped_thing], sending [rider] flying!")) rider.Paralyze(8 SECONDS) @@ -133,8 +135,8 @@ return var/mob/living/skater = buckled_mobs[1] - skater.adjustStaminaLoss(instability*0.3) - if(skater.getStaminaLoss() >= 100) + skater.adjust_stamina_loss(instability*0.3) + if(skater.get_stamina_loss() >= 100) obj_flags = CAN_BE_HIT playsound(src, 'sound/effects/bang.ogg', 20, TRUE) unbuckle_mob(skater) @@ -157,7 +159,7 @@ playsound(location, 'sound/items/trayhit/trayhit2.ogg', 40) victim.apply_damage(damage = 25, damagetype = BRUTE, def_zone = victim.get_random_valid_zone(even_weights = TRUE), wound_bonus = 20) victim.Paralyze(1.5 SECONDS) - skater.adjustStaminaLoss(instability) + skater.adjust_stamina_loss(instability) victim.visible_message(span_danger("[victim] straight up gets grinded into the ground by [skater]'s [src]! Radical!")) addtimer(CALLBACK(src, PROC_REF(grind)), 0.1 SECONDS) @@ -240,6 +242,7 @@ icon = 'icons/mob/rideables/vehicles.dmi' icon_state = "scooter_frame" w_class = WEIGHT_CLASS_NORMAL + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5) /obj/item/scooter_frame/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!istype(I, /obj/item/stack/sheet/iron)) diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index 7520f0e2e173..cf784e77ca47 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -97,9 +97,9 @@ return ..() //bullets will have a 60% chance to hit any riders -/obj/vehicle/ridden/secway/bullet_act(obj/projectile/proj) +/obj/vehicle/ridden/secway/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) if(!buckled_mobs || prob(40)) return ..() for(var/mob/rider as anything in buckled_mobs) - return rider.projectile_hit(proj) + return rider.projectile_hit(hitting_projectile) return ..() diff --git a/code/modules/vehicles/vehicle_actions.dm b/code/modules/vehicles/vehicle_actions.dm index 4028b8a02d2e..5acd193d9232 100644 --- a/code/modules/vehicles/vehicle_actions.dm +++ b/code/modules/vehicles/vehicle_actions.dm @@ -340,8 +340,8 @@ return var/mob/living/rider = owner var/turf/landing_turf = get_step(vehicle.loc, vehicle.dir) - rider.adjustStaminaLoss(vehicle.instability* 0.75) - if (rider.getStaminaLoss() >= 100) + rider.adjust_stamina_loss(vehicle.instability* 0.75) + if (rider.get_stamina_loss() >= 100) vehicle.obj_flags &= ~CAN_BE_HIT playsound(src, 'sound/effects/bang.ogg', 20, TRUE) vehicle.unbuckle_mob(rider) @@ -379,8 +379,8 @@ var/obj/vehicle/ridden/scooter/skateboard/board = vehicle_target var/mob/living/rider = owner - rider.adjustStaminaLoss(board.instability) - if (rider.getStaminaLoss() >= 100) + rider.adjust_stamina_loss(board.instability) + if (rider.get_stamina_loss() >= 100) playsound(src, 'sound/effects/bang.ogg', 20, vary = TRUE) board.unbuckle_mob(rider) rider.Paralyze(50) @@ -390,7 +390,7 @@ span_userdanger("You smack against the board, hard."), ) rider.emote("scream") - rider.adjustBruteLoss(10) // thats gonna leave a mark + rider.adjust_brute_loss(10) // thats gonna leave a mark return rider.visible_message( span_danger("[rider] misses the landing and falls on [rider.p_their()] face!"), diff --git a/code/modules/vehicles/vehicle_key.dm b/code/modules/vehicles/vehicle_key.dm index 783c2baf4a5a..4f9085a2cb8f 100644 --- a/code/modules/vehicles/vehicle_key.dm +++ b/code/modules/vehicles/vehicle_key.dm @@ -77,7 +77,7 @@ user.visible_message(span_suicide("[user] forgot [user.p_they()] isn't actually a janicart! That's a paddlin'!")) if(user.mind?.get_skill_level(/datum/skill/cleaning) >= SKILL_LEVEL_LEGENDARY) //Janny janny janny janny janny playsound(src, 'sound/effects/adminhelp.ogg', 50, TRUE, -1) - user.adjustOxyLoss(200) + user.adjust_oxy_loss(200) user.death(FALSE) /obj/item/key/lasso @@ -93,3 +93,4 @@ attack_verb_simple = list("flog", "whip", "lash", "discipline") hitsound = 'sound/items/weapons/whip.ogg' slot_flags = ITEM_SLOT_BELT + custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT) diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index 423baf8627a9..ce481c4d9254 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -8,6 +8,7 @@ armor_type = /datum/armor/ridden_wheelchair density = FALSE interaction_flags_mouse_drop = ALLOW_RESTING + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5) /// Run speed delay is multiplied with this for vehicle move delay. var/delay_multiplier = 6.7 @@ -40,7 +41,7 @@ . = ..() make_ridable() 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/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/handle_deconstruct(disassembled) @@ -154,7 +155,7 @@ overlay_icon = "gold_wheelchair_overlay" max_integrity = 200 armor_type = /datum/armor/wheelchair_gold - custom_materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT*5) + custom_materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT * 5) foldabletype = /obj/item/wheelchair/gold /// Handheld wheelchair item @@ -168,7 +169,7 @@ righthand_file = 'icons/mob/inhands/items_righthand.dmi' w_class = WEIGHT_CLASS_NORMAL force = 8 //Force is same as a chair - custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*5) + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5) /// The wheelchair vehicle type we create when we unfold this chair var/unfolded_type = /obj/vehicle/ridden/wheelchair @@ -197,7 +198,7 @@ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' righthand_file = 'icons/mob/inhands/items_righthand.dmi' force = 10 - custom_materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT*5) + custom_materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT * 5) unfolded_type = /obj/vehicle/ridden/wheelchair/gold /datum/armor/wheelchair_gold diff --git a/code/modules/vending/assist.dm b/code/modules/vending/assist.dm index aff6ed1958ce..9e5a3c4d8ec4 100644 --- a/code/modules/vending/assist.dm +++ b/code/modules/vending/assist.dm @@ -34,7 +34,6 @@ /obj/item/universal_scanner = 3, /obj/item/vending_refill/custom = 3, ) - allow_custom = TRUE refill_canister = /obj/item/vending_refill/assist product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!" diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 8ed868b0391d..645d249d4048 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -94,8 +94,8 @@ GLOBAL_LIST_INIT(autodrobe_entretainers_items, list( )) GLOBAL_LIST_INIT(autodrobe_fancy_items, list( - /obj/item/clothing/under/rank/captain/suit = 1, - /obj/item/clothing/under/rank/captain/suit/skirt = 1, + /obj/item/clothing/under/costume/captain = 1, + /obj/item/clothing/under/costume/captain/skirt = 1, /obj/item/clothing/under/costume/seifuku = 3, /obj/item/clothing/under/costume/seifuku/red = 3, /obj/item/clothing/under/costume/seifuku/teal = 3, @@ -234,7 +234,6 @@ GLOBAL_VAR_INIT(all_autodrobe_items, (autodrobe_costumes_items +\ extra_price = PAYCHECK_COMMAND payment_department = ACCOUNT_SRV light_mask = "theater-light-mask" - allow_custom = TRUE /obj/machinery/vending/autodrobe/Initialize(mapload) product_categories = list( diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index 561dbcf06fc8..09c7cbacb8f0 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -96,7 +96,6 @@ extra_price = PAYCHECK_COMMAND payment_department = ACCOUNT_SRV light_mask = "boozeomat-light-mask" - allow_custom = TRUE /obj/machinery/vending/boozeomat/syndicate age_restrictions = FALSE @@ -104,7 +103,7 @@ allow_custom = FALSE // DARKPACK EDIT ADD START -/obj/machinery/vending/boozeomat/all_access +/obj/machinery/vending/boozeomat/private name = "liquor cabinet" desc = "A climate controlled fridge for booze." req_access = null diff --git a/code/modules/vending/cartridge.dm b/code/modules/vending/cartridge.dm index 852c88452ad5..ccc13b7de720 100644 --- a/code/modules/vending/cartridge.dm +++ b/code/modules/vending/cartridge.dm @@ -20,7 +20,6 @@ extra_price = PAYCHECK_COMMAND * 2.5 payment_department = ACCOUNT_SRV light_mask = "cart-light-mask" - allow_custom = TRUE /obj/item/vending_refill/cart machine_name = "PTech" diff --git a/code/modules/vending/cigarette.dm b/code/modules/vending/cigarette.dm index 8925d7ecd2ad..4fd003c98dfc 100644 --- a/code/modules/vending/cigarette.dm +++ b/code/modules/vending/cigarette.dm @@ -35,9 +35,11 @@ extra_price = PAYCHECK_COMMAND payment_department = ACCOUNT_SRV light_mask = "cigs-light-mask" - allow_custom = TRUE /obj/machinery/vending/cigarette/syndicate + name = "\improper Waffle Co Breakfast Cigarettes" + product_slogans = "Start your day the right way!;Breakfast of champions!;Smokes that mean business!;Omnizine, your uplink to smooth taste!" + product_ads = "Waffle Co's science advisory: omnizine may prevent most forms of smoking-related illness!*;New study: Rival corporations more trusting of men who smoke!;A Waffle Co cigarette makes yellow star feel like black orbit!" products = list( /obj/item/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/storage/fancy/cigarettes/cigpack_uplift = 3, @@ -51,7 +53,12 @@ /obj/item/storage/fancy/rollingpapers = 5, ) initial_language_holder = /datum/language_holder/syndicate - allow_custom = FALSE + refill_canister = /obj/item/vending_refill/cigarette/syndicate + +/obj/item/vending_refill/cigarette/syndicate + machine_name = "Waffle Co Breakfast Cigarettes" + icon_state = "refill_syndismoke" + /obj/machinery/vending/cigarette/beach //Used in the lavaland_biodome_beach.dmm ruin name = "\improper ShadyCigs Ultra" diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index b9acfe563e9d..f5669329cfde 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -52,6 +52,7 @@ /obj/item/clothing/accessory/waistcoat = 4, /obj/item/clothing/suit/toggle/suspenders = 4, /obj/item/clothing/neck/tie/horrible = 3, + /obj/item/clothing/neck/robe_cape = 3, /obj/item/clothing/glasses/regular = 3, /obj/item/clothing/glasses/regular/jamjar = 3, /obj/item/clothing/glasses/orange = 3, @@ -119,8 +120,8 @@ /obj/item/clothing/suit/costume/poncho = 3, /obj/item/clothing/under/dress/skirt = 3, /obj/item/clothing/under/suit/white/skirt = 3, - /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/costume/captain/skirt = 2, + /obj/item/clothing/under/costume/head_of_personnel/skirt = 2, /obj/item/clothing/under/rank/civilian/purple_bartender = 2, /obj/item/clothing/suit/jacket/miljacket = 3, /obj/item/clothing/suit/apron/overalls = 3, @@ -232,7 +233,6 @@ payment_department = NO_FREEBIES light_mask = "wardrobe-light-mask" light_color = LIGHT_COLOR_ELECTRIC_GREEN - allow_custom = TRUE /obj/item/vending_refill/clothing machine_name = "ClothesMate" diff --git a/code/modules/vending/coffee.dm b/code/modules/vending/coffee.dm index 1545e14dd7d3..29eeb0018b5a 100644 --- a/code/modules/vending/coffee.dm +++ b/code/modules/vending/coffee.dm @@ -23,7 +23,6 @@ payment_department = ACCOUNT_SRV //light_mask = "coffee-light-mask" // DARKPACK EDIT REMOVAL //light_color = COLOR_DARK_MODERATE_ORANGE // DARKPACK EDIT REMOVAL - allow_custom = TRUE // DARKPACK EDIT ADD START /obj/machinery/vending/coffee/private diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index 53aa82f8e12a..aab8ab39e8a2 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -35,7 +35,6 @@ default_price = PAYCHECK_CREW * 0.7 extra_price = PAYCHECK_CREW payment_department = ACCOUNT_SRV - allow_custom = TRUE var/static/list/spiking_booze = list( // Your "common" spiking booze @@ -152,8 +151,13 @@ 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." light_mask = "shamblers-light-mask" + refill_canister = /obj/item/vending_refill/cola/shamblers light_color = COLOR_MOSTLY_PURE_PINK - allow_custom = FALSE + + +/obj/item/vending_refill/cola/shamblers + machine_name = "Shambler's Vendor" + icon_state = "refill_shamblers" /obj/machinery/vending/cola/shamblers/Initialize(mapload) . = ..() diff --git a/code/modules/vending/custom.dm b/code/modules/vending/custom.dm index 3637ff84a68f..78a1f811fe95 100644 --- a/code/modules/vending/custom.dm +++ b/code/modules/vending/custom.dm @@ -1,5 +1,5 @@ -///This unique key decides how items are stacked on the UI. We separate them based on name,price & type -#define ITEM_HASH(item)("[item.name][item.custom_price][item.type]") +///This unique key decides how items are stacked on the UI. We separate them based on name, price & type +#define ITEM_HASH(item)(sanitize_css_class_name("[item.name][item.custom_price][item.type]")) /obj/machinery/vending/custom name = "Custom Vendor" @@ -9,9 +9,9 @@ payment_department = NO_FREEBIES light_mask = "custom-light-mask" panel_type = "panel20" - allow_custom = TRUE refill_canister = /obj/item/vending_refill/custom fish_source_path = /datum/fish_source/vending/custom + obj_flags = UNIQUE_RENAME /// max number of items that the custom vendor can hold var/max_loaded_items = 20 @@ -200,34 +200,24 @@ if(!linked_account) linked_account = card_used.registered_account speak("\The [src] has been linked to [card_used].") + return ITEM_INTERACT_SUCCESS else if(linked_account == card_used.registered_account) linked_account = null speak("account unlinked.") + return ITEM_INTERACT_SUCCESS else to_chat(user, "verification failed. unlinking process has been cancelled.") - return ITEM_INTERACT_SUCCESS - - if(!compartmentLoadAccessCheck(user) || !IS_WRITING_UTENSIL(attack_item)) - return ..() + return ITEM_INTERACT_FAILURE + return ..() - . ITEM_INTERACT_FAILURE - var/new_name = reject_bad_name(tgui_input_text(user, "Set name", "Name", name, max_length = 20), allow_numbers = TRUE, strict = TRUE, cap_after_symbols = FALSE) - if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return - if (new_name) - name = new_name - var/new_desc = reject_bad_text(tgui_input_text(user, "Set description", "Description", desc, max_length = 60)) - if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return - if (new_desc) - desc = new_desc +/obj/machinery/vending/custom/descformat(input, mob/living/user) + . = input var/new_slogan = reject_bad_text(tgui_input_text(user, "Set slogan", "Slogan", "Epic", max_length = 60)) if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) return if (new_slogan) slogan_list += new_slogan last_slogan = world.time + rand(0, slogan_delay) - return ITEM_INTERACT_SUCCESS /obj/machinery/vending/custom/collect_records_for_static_data(list/records, list/categories, premium) . = list() @@ -285,8 +275,6 @@ if(ITEM_HASH(product) == dispensed_item) dispensed_item = product break - if(QDELETED(dispensed_item)) - return var/obj/item/card/id/id_card = user.get_idcard(TRUE) if(QDELETED(id_card)) @@ -304,10 +292,10 @@ payee.adjust_money(-dispensed_item.custom_price, , "Vending: [dispensed_item]") linked_account.adjust_money(dispensed_item.custom_price, "Vending: [dispensed_item] Bought") linked_account.bank_card_talk("[payee.account_holder] made a [dispensed_item.custom_price] \ - cr purchase at your custom vendor.") + [MONEY_SYMBOL] purchase at your custom vendor.") /// Log the transaction SSblackbox.record_feedback("amount", "vending_spent", dispensed_item.custom_price) - log_econ("[dispensed_item.custom_price] credits were spent on [src] buying a \ + log_econ("[dispensed_item.custom_price] [MONEY_NAME] were spent on [src] buying a \ [dispensed_item] by [payee.account_holder], owned by [linked_account.account_holder].") /// Make an alert var/ref = REF(user) diff --git a/code/modules/vending/cytopro.dm b/code/modules/vending/cytopro.dm index c27b9e537b21..ce351be7769d 100644 --- a/code/modules/vending/cytopro.dm +++ b/code/modules/vending/cytopro.dm @@ -29,7 +29,6 @@ default_price = PAYCHECK_CREW * 1 extra_price = PAYCHECK_COMMAND * 0.5 payment_department = ACCOUNT_SCI - allow_custom = TRUE /obj/item/vending_refill/cytopro machine_name = "CytoPro" diff --git a/code/modules/vending/donk.dm b/code/modules/vending/donk.dm index e3851bee7f14..4172c8450cd4 100644 --- a/code/modules/vending/donk.dm +++ b/code/modules/vending/donk.dm @@ -6,7 +6,6 @@ icon_state = "snackdonk" panel_type = "panel18" light_mask = "donksoft-light-mask" - circuit = /obj/item/circuitboard/machine/vending/donksnackvendor products = list( /obj/item/food/donkpocket = 6, /obj/item/food/donkpocket/berry = 6, diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm index 648d5762f9ea..c37750a2d3d8 100644 --- a/code/modules/vending/drinnerware.dm +++ b/code/modules/vending/drinnerware.dm @@ -69,7 +69,6 @@ extra_price = PAYCHECK_CREW * 2.4 payment_department = ACCOUNT_SRV light_mask = "dinnerware-light-mask" - allow_custom = TRUE /obj/item/vending_refill/dinnerware machine_name = "Plasteel Chef's Dinnerware Vendor" diff --git a/code/modules/vending/engineering.dm b/code/modules/vending/engineering.dm index 9b4999161df2..5288e2efc85e 100644 --- a/code/modules/vending/engineering.dm +++ b/code/modules/vending/engineering.dm @@ -35,8 +35,7 @@ extra_price = PAYCHECK_COMMAND * 1.5 payment_department = ACCOUNT_ENG light_mask = "engi-light-mask" - allow_custom = TRUE /obj/item/vending_refill/engineering machine_name = "Robco Tool Maker" - icon_state = "refill_engi" + icon_state = "refill_roroco" diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm index 256ea76870f9..13e30e1783f9 100644 --- a/code/modules/vending/engivend.dm +++ b/code/modules/vending/engivend.dm @@ -32,7 +32,6 @@ extra_price = PAYCHECK_COMMAND * 1.5 payment_department = ACCOUNT_ENG light_mask = "engivend-light-mask" - allow_custom = TRUE /obj/item/vending_refill/engivend machine_name = "Engi-Vend" diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index a5b38b8fa0df..a9e74c6d406e 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -17,6 +17,7 @@ /obj/item/toy/cards/deck/kotahi = 3, /obj/item/toy/cards/deck/tarot = 3, /obj/item/toy/cards/deck/wizoff = 3, + /obj/item/toy/cards/deck/cardshoe = 3, ), ), list( @@ -115,7 +116,6 @@ extra_price = PAYCHECK_COMMAND * 1.25 payment_department = ACCOUNT_SRV light_mask = "games-light-mask" - allow_custom = TRUE /obj/item/vending_refill/games machine_name = "\improper Good Clean Fun" diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm index a23ea87c4ef8..a2875c3b9b65 100644 --- a/code/modules/vending/liberation.dm +++ b/code/modules/vending/liberation.dm @@ -35,6 +35,7 @@ ) //U S A armor_type = /datum/armor/vending_liberationstation resistance_flags = FIRE_PROOF + refill_canister = /obj/item/vending_refill/liberation default_price = PAYCHECK_COMMAND * 2.5 extra_price = PAYCHECK_COMMAND * 2.5 payment_department = ACCOUNT_SEC @@ -47,3 +48,7 @@ energy = 100 fire = 100 acid = 50 + +/obj/item/vending_refill/liberation + machine_name = "Liberation Station" + icon_state = "refill_patriot" diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm index e56977937030..9ddb14e78c9c 100644 --- a/code/modules/vending/liberation_toy.dm +++ b/code/modules/vending/liberation_toy.dm @@ -6,7 +6,6 @@ product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get permabrigged!" product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!" vend_reply = "Come back for more!" - circuit = /obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor products = list( /obj/item/card/emagfake = 4, /obj/item/hot_potato/harmless/toy = 4, @@ -37,6 +36,7 @@ extra_price = PAYCHECK_COMMAND payment_department = NO_FREEBIES light_mask = "donksoft-light-mask" + allow_custom = FALSE /datum/armor/vending_toyliberationstation melee = 100 diff --git a/code/modules/vending/magivend.dm b/code/modules/vending/magivend.dm index 51aac98fdfa8..4482186d50b1 100644 --- a/code/modules/vending/magivend.dm +++ b/code/modules/vending/magivend.dm @@ -21,6 +21,7 @@ contraband = list(/obj/item/reagent_containers/cup/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave armor_type = /datum/armor/vending_magivend resistance_flags = FIRE_PROOF + refill_canister = /obj/item/vending_refill/magivend default_price = 0 //Just in case, since its primary use is storage. extra_price = PAYCHECK_COMMAND payment_department = ACCOUNT_SRV @@ -33,3 +34,7 @@ energy = 100 fire = 100 acid = 50 + +/obj/item/vending_refill/magivend + machine_name = "MagiVend" + icon_state = "refill_magivend" diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index c94bc440663b..919e285fb72c 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -39,7 +39,6 @@ extra_price = PAYCHECK_COMMAND payment_department = ACCOUNT_MED light_mask = "med-light-mask" - allow_custom = TRUE /obj/item/vending_refill/medical machine_name = "NanoMed Plus" diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index 0b7bc91aac26..612493db94f9 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -27,7 +27,6 @@ payment_department = ACCOUNT_MED tiltable = FALSE light_mask = "wallmed-light-mask" - allow_custom = TRUE /obj/machinery/vending/wallmed/directional allow_custom = FALSE diff --git a/code/modules/vending/modularpc.dm b/code/modules/vending/modularpc.dm index 0e894147e220..415329366c7d 100644 --- a/code/modules/vending/modularpc.dm +++ b/code/modules/vending/modularpc.dm @@ -19,7 +19,6 @@ default_price = PAYCHECK_CREW extra_price = PAYCHECK_COMMAND payment_department = ACCOUNT_SCI - allow_custom = TRUE /obj/item/vending_refill/modularpc machine_name = "Deluxe Silicate Selections" diff --git a/code/modules/vending/nutrimax.dm b/code/modules/vending/nutrimax.dm index 7438dedcfc3b..0f26c32acbab 100644 --- a/code/modules/vending/nutrimax.dm +++ b/code/modules/vending/nutrimax.dm @@ -19,6 +19,13 @@ /obj/item/shovel/spade = 3, /obj/item/storage/bag/plants = 5, ) + + premium = list( + /obj/item/soil_sack = 8, + /obj/item/soil_sack/vermaculite = 3, + /obj/item/soil_sack/gel = 3, + ) + contraband = list( /obj/item/reagent_containers/cup/bottle/ammonia = 10, /obj/item/reagent_containers/cup/bottle/diethylamine = 5, @@ -28,7 +35,6 @@ default_price = PAYCHECK_CREW * 0.8 extra_price = PAYCHECK_COMMAND * 0.8 payment_department = ACCOUNT_SRV - allow_custom = TRUE /obj/item/vending_refill/hydronutrients machine_name = "NutriMax" diff --git a/code/modules/vending/plasmaresearch.dm b/code/modules/vending/plasmaresearch.dm index fbe8f00dcded..bd9a11ef0a4b 100644 --- a/code/modules/vending/plasmaresearch.dm +++ b/code/modules/vending/plasmaresearch.dm @@ -13,6 +13,11 @@ /obj/item/transfer_valve = 6, ) contraband = list(/obj/item/assembly/health = 3) + refill_canister = /obj/item/vending_refill/plasmaresearch default_price = PAYCHECK_CREW extra_price = PAYCHECK_CREW payment_department = ACCOUNT_SCI + +/obj/item/vending_refill/plasmaresearch + machine_name = "Bombuddy 3000" + icon_state = "refill_bombuddy" diff --git a/code/modules/vending/robotics.dm b/code/modules/vending/robotics.dm index 7e813d78e08b..849640419538 100644 --- a/code/modules/vending/robotics.dm +++ b/code/modules/vending/robotics.dm @@ -26,7 +26,6 @@ refill_canister = /obj/item/vending_refill/robotics default_price = PAYCHECK_COMMAND payment_department = ACCOUNT_SCI - allow_custom = TRUE /obj/item/vending_refill/robotics machine_name = "Robotech Deluxe" diff --git a/code/modules/vending/runic_vendor.dm b/code/modules/vending/runic_vendor.dm index 3e6d21c708fe..4e53e9bef720 100644 --- a/code/modules/vending/runic_vendor.dm +++ b/code/modules/vending/runic_vendor.dm @@ -14,7 +14,7 @@ var/time_to_decay = 30 SECONDS /// Area around the vendor that will pushback nearby mobs. var/pulse_distance = PULSE_DISTANCE_RANGE - + allow_custom = FALSE /obj/machinery/vending/runic_vendor/Initialize(mapload) if(mapload) diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index 5004a8749d58..bf0b9dbee386 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -37,7 +37,6 @@ default_price = PAYCHECK_CREW extra_price = PAYCHECK_COMMAND * 1.5 payment_department = ACCOUNT_SEC - allow_custom = TRUE /obj/machinery/vending/security/pre_throw(obj/item/thrown_item) if(isgrenade(thrown_item)) diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm index 3aa9b3742405..8c85066ead9b 100644 --- a/code/modules/vending/snack.dm +++ b/code/modules/vending/snack.dm @@ -6,20 +6,45 @@ icon_state = "snack" panel_type = "panel2" light_mask = "snack-light-mask" - // DARKPACK EDIT CHANGE START products = list( - /obj/item/food/chocolatebar = 25, - /obj/item/food/vampire/crisps = 20, - /obj/item/reagent_containers/cup/glass/dry_ramen = 10, - /obj/item/storage/box/gum = 10 + /obj/item/food/spacetwinkie = 6, + /obj/item/food/cheesiehonkers = 6, + /obj/item/food/candy = 6, + /obj/item/food/chips = 6, + /obj/item/food/chips/shrimp = 6, + /obj/item/food/sosjerky = 6, + /obj/item/food/cornchips/random = 6, + /obj/item/food/sosjerky = 6, + /obj/item/food/no_raisin = 6, + /obj/item/food/peanuts = 6, + /obj/item/food/peanuts/random = 3, + /obj/item/food/cnds = 6, + /obj/item/food/cnds/random = 3, + /obj/item/food/semki = 6, + /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, + /obj/item/food/peanuts/ban_appeal = 3, + /obj/item/food/candy/bronx = 1, + ) + premium = list( + /obj/item/food/spacers_sidekick = 3, + /obj/item/food/pistachios = 3, + /obj/item/food/swirl_lollipop = 3, ) - // DARKPACK EDIT CHANGE END refill_canister = /obj/item/vending_refill/snack req_access = list(ACCESS_KITCHEN) default_price = PAYCHECK_CREW * 0.6 extra_price = PAYCHECK_CREW payment_department = ACCOUNT_SRV - allow_custom = TRUE /obj/item/vending_refill/snack machine_name = "Getmore Chocolate Corp" diff --git a/code/modules/vending/sovietsoda.dm b/code/modules/vending/sovietsoda.dm index 5031a68ad64a..aaf631c10555 100644 --- a/code/modules/vending/sovietsoda.dm +++ b/code/modules/vending/sovietsoda.dm @@ -18,7 +18,6 @@ payment_department = NO_FREEBIES light_color = COLOR_PALE_ORANGE initial_language_holder = /datum/language_holder/spinwarder - allow_custom = TRUE /obj/item/vending_refill/sovietsoda machine_name = "BODA" diff --git a/code/modules/vending/subtype.dm b/code/modules/vending/subtype.dm index d189435e18c3..f6b37f79c32b 100644 --- a/code/modules/vending/subtype.dm +++ b/code/modules/vending/subtype.dm @@ -13,6 +13,7 @@ all_products_free = TRUE /// Spawns coders by default var/type_to_vend = /obj/item/food/grown/citrus + allow_custom = FALSE /obj/machinery/vending/subtype_vendor/Initialize(mapload, type_to_vend) if(type_to_vend) diff --git a/code/modules/vending/sustenance.dm b/code/modules/vending/sustenance.dm index 0ad7eadc3549..71313d74140e 100644 --- a/code/modules/vending/sustenance.dm +++ b/code/modules/vending/sustenance.dm @@ -25,7 +25,6 @@ default_price = PAYCHECK_LOWER extra_price = PAYCHECK_LOWER * 0.6 payment_department = NO_FREEBIES - allow_custom = TRUE /obj/machinery/vending/sustenance/interact(mob/living/living_user) if(!isliving(living_user)) @@ -51,7 +50,7 @@ icon_state = "sustenance_labor" all_products_free = FALSE displayed_currency_icon = "digging" - displayed_currency_name = " LP" + displayed_currency_name = "LP" allow_custom = FALSE /obj/machinery/vending/sustenance/labor_camp/proceed_payment(obj/item/card/id/advanced/prisoner/paying_scum_id, mob/living/mob_paying, datum/data/vending_product/product_to_vend, price_to_use) diff --git a/code/modules/vending/syndichem.dm b/code/modules/vending/syndichem.dm index 896198f65a65..02607956348e 100644 --- a/code/modules/vending/syndichem.dm +++ b/code/modules/vending/syndichem.dm @@ -19,3 +19,8 @@ ) product_slogans = "It's not pyromania if you're getting paid!;You smell that? Plasma, son. Nothing else in the world smells like that.;I love the smell of Plasma in the morning." resistance_flags = FIRE_PROOF + refill_canister = /obj/item/vending_refill/syndichem + +/obj/item/vending_refill/syndichem + machine_name = "SyndiChem" + icon_state = "refill_syndichem" diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm index 8f92e438b514..fae9bbc5d466 100644 --- a/code/modules/vending/toys.dm +++ b/code/modules/vending/toys.dm @@ -7,7 +7,6 @@ product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!" vend_reply = "Come back for more!" light_mask = "donksoft-light-mask" - circuit = /obj/item/circuitboard/machine/vending/donksofttoyvendor products = list( /obj/item/card/emagfake = 4, /obj/item/hot_potato/harmless/toy = 4, diff --git a/code/modules/vending/vendor/_vending.dm b/code/modules/vending/vendor/_vending.dm index 86737aab0535..38e51314cbed 100644 --- a/code/modules/vending/vendor/_vending.dm +++ b/code/modules/vending/vendor/_vending.dm @@ -72,7 +72,7 @@ ///Icon for the maintenance panel overlay var/panel_type = "panel1" ///Whether this vendor can be selected when building a custom vending machine - var/allow_custom = FALSE + var/allow_custom = TRUE /** * List of products this machine sells @@ -141,7 +141,7 @@ ///How likely this is to happen (prob 100) per second var/shoot_inventory_chance = 1 //Stop spouting those godawful pitches! - var/shut_up = FALSE + var/shut_up = TRUE // DARKPACK EDIT CHANGE ///can we access the hidden inventory? var/extended_inventory = FALSE ///Are we checking the users ID @@ -153,7 +153,7 @@ ///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 = " $" // DARKPACK EDIT CHANGE + var/displayed_currency_name = MONEY_SYMBOL ///Whether our age check is currently functional var/age_restrictions = TRUE /// How many credits does this vending machine have? 20% of all sales go to this pool, and are given freely when the machine is restocked, or successfully tilted. Lost on deconstruction. @@ -330,7 +330,7 @@ return CONTEXTUAL_SCREENTIP_SET if(panel_open && istype(held_item, refill_canister)) - context[SCREENTIP_CONTEXT_LMB] = "Restock vending machine[credits_contained ? " and collect credits" : null]" + context[SCREENTIP_CONTEXT_LMB] = "Restock vending machine[credits_contained ? " and collect [MONEY_NAME]" : null]" return CONTEXTUAL_SCREENTIP_SET /** @@ -370,9 +370,9 @@ else . += span_notice("\The [src] is fully stocked.") if(credits_contained < CREDITS_DUMP_THRESHOLD && credits_contained > 0) - . += span_notice("It should have a handfull of credits stored based on the missing items.") + . += span_notice("It should have a handfull of [MONEY_NAME] stored based on the missing items.") else if (credits_contained > PAYCHECK_CREW) - . += span_notice("It should have at least a full paycheck worth of credits inside!") + . += span_notice("It should have at least a full paycheck worth of [MONEY_NAME] inside!") /obj/machinery/vending/update_appearance(updates = ALL) . = ..() diff --git a/code/modules/vending/vendor/interaction.dm b/code/modules/vending/vendor/interaction.dm index 7796545b719d..3889625f05fb 100644 --- a/code/modules/vending/vendor/interaction.dm +++ b/code/modules/vending/vendor/interaction.dm @@ -98,7 +98,10 @@ break /obj/machinery/vending/item_interaction(mob/living/user, obj/item/attack_item, list/modifiers) - . = NONE + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + if(panel_open && is_wire_tool(attack_item)) wires.interact(user) return ITEM_INTERACT_SUCCESS @@ -155,7 +158,7 @@ to_chat(user, span_warning("There's nothing to restock!")) return - to_chat(user, span_notice("You loaded [restocked] items in [src][credits_contained > 0 ? ", and are rewarded [credits_contained] credits." : "."]")) + to_chat(user, span_notice("You loaded [restocked] items in [src][credits_contained > 0 ? ", and are rewarded [credits_contained] [MONEY_NAME]." : "."]")) var/datum/bank_account/cargo_account = SSeconomy.get_dep_account(ACCOUNT_CAR) cargo_account.adjust_money(round(credits_contained * 0.5), "Vending: Restock") var/obj/item/holochip/payday = new(src, credits_contained) @@ -193,7 +196,7 @@ /obj/machinery/vending/proc/freebie(freebies) PRIVATE_PROC(TRUE) - visible_message(span_notice("[src] yields [freebies > 1 ? "several free goodies" : "a free goody"][credits_contained > 0 ? " and some credits" : ""]!")) + visible_message(span_notice("[src] yields [freebies > 1 ? "several free goodies" : "a free goody"][credits_contained > 0 ? " and some [MONEY_NAME]" : ""]!")) for(var/i in 1 to freebies) playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) diff --git a/code/modules/vending/vendor/inventory.dm b/code/modules/vending/vendor/inventory.dm index 7b3c081880b8..e97c251548fd 100644 --- a/code/modules/vending/vendor/inventory.dm +++ b/code/modules/vending/vendor/inventory.dm @@ -208,7 +208,7 @@ if(greyscale_colors) vended_item.set_greyscale(colors=greyscale_colors) - if(user.CanReach(src) && user.put_in_hands(vended_item)) + if(IsReachableBy(user) && user.put_in_hands(vended_item)) to_chat(user, span_notice("You take [item_record.name] out of the slot.")) vended_item.do_pickup_animation(user, src) else @@ -287,7 +287,7 @@ //transfer money to machine SSblackbox.record_feedback("amount", "vending_spent", price_to_use) - log_econ("[price_to_use] credits were inserted into [src] by [account.account_holder] to buy [product_to_vend].") + log_econ("[price_to_use] [MONEY_NAME] were inserted into [src] by [account.account_holder] to buy [product_to_vend].") credits_contained += round(price_to_use * VENDING_CREDITS_COLLECTION_AMOUNT) return TRUE // DARKPACK EDIT END START - ECONOMY diff --git a/code/modules/vending/vendor/ui_data.dm b/code/modules/vending/vendor/ui_data.dm index 45c344a4e875..8693b3ae165c 100644 --- a/code/modules/vending/vendor/ui_data.dm +++ b/code/modules/vending/vendor/ui_data.dm @@ -70,7 +70,7 @@ data["jobDiscount"] = DEPARTMENT_DISCOUNT data["product_records"] = list() data["displayed_currency_icon"] = displayed_currency_icon - data["displayed_currency_name"] = displayed_currency_name + data["displayed_currency_name"] = " [displayed_currency_name]" var/list/categories = list() diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index cbfb1113fb91..f681d970f9be 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -72,7 +72,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) refill_canister = /obj/item/vending_refill/wardrobe/sec_wardrobe payment_department = ACCOUNT_SEC light_color = COLOR_MOSTLY_PURE_RED - allow_custom = TRUE /obj/item/vending_refill/wardrobe/sec_wardrobe machine_name = "SecDrobe" @@ -119,7 +118,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) ) refill_canister = /obj/item/vending_refill/wardrobe/medi_wardrobe payment_department = ACCOUNT_MED - allow_custom = TRUE /obj/item/vending_refill/wardrobe/medi_wardrobe machine_name = "MediDrobe" @@ -150,7 +148,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) refill_canister = /obj/item/vending_refill/wardrobe/engi_wardrobe payment_department = ACCOUNT_ENG light_color = COLOR_VIVID_YELLOW - allow_custom = TRUE /obj/item/vending_refill/wardrobe/engi_wardrobe machine_name = "EngiDrobe" @@ -176,7 +173,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) refill_canister = /obj/item/vending_refill/wardrobe/atmos_wardrobe payment_department = ACCOUNT_ENG light_color = COLOR_VIVID_YELLOW - allow_custom = TRUE /obj/item/vending_refill/wardrobe/atmos_wardrobe machine_name = "AtmosDrobe" @@ -220,7 +216,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) ) refill_canister = /obj/item/vending_refill/wardrobe/cargo_wardrobe payment_department = ACCOUNT_CAR - allow_custom = TRUE /obj/item/vending_refill/wardrobe/cargo_wardrobe machine_name = "CargoDrobe" @@ -255,7 +250,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) refill_canister = /obj/item/vending_refill/wardrobe/robo_wardrobe extra_price = PAYCHECK_COMMAND * 1.2 payment_department = ACCOUNT_SCI - allow_custom = TRUE /obj/item/vending_refill/wardrobe/robo_wardrobe machine_name = "RoboDrobe" @@ -285,7 +279,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) ) refill_canister = /obj/item/vending_refill/wardrobe/science_wardrobe payment_department = ACCOUNT_SCI - allow_custom = TRUE /obj/item/vending_refill/wardrobe/science_wardrobe machine_name = "SciDrobe" @@ -314,7 +307,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) refill_canister = /obj/item/vending_refill/wardrobe/hydro_wardrobe payment_department = ACCOUNT_SRV light_color = LIGHT_COLOR_ELECTRIC_GREEN - allow_custom = TRUE /obj/item/vending_refill/wardrobe/hydro_wardrobe machine_name = "HyDrobe" @@ -336,10 +328,10 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) /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/under/costume/captain = 1, + /obj/item/clothing/under/costume/captain/skirt = 1, + /obj/item/clothing/under/costume/head_of_personnel = 1, + /obj/item/clothing/under/costume/head_of_personnel/skirt = 1, /obj/item/clothing/suit/toggle/lawyer/greyscale = 1, /obj/item/storage/backpack/satchel/explorer = 1, /obj/item/storage/backpack/messenger/explorer = 1, @@ -348,7 +340,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) ) refill_canister = /obj/item/vending_refill/wardrobe/curator_wardrobe payment_department = ACCOUNT_SRV - allow_custom = TRUE /obj/item/vending_refill/wardrobe/curator_wardrobe machine_name = "CuraDrobe" @@ -398,7 +389,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) ) refill_canister = /obj/item/vending_refill/wardrobe/coroner_wardrobe payment_department = ACCOUNT_MED - allow_custom = TRUE /obj/item/vending_refill/wardrobe/coroner_wardrobe machine_name = "MortiDrobe" @@ -432,11 +422,11 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) ) premium = list( /obj/item/storage/box/dishdrive = 1, + /obj/item/construction/plumbing/service = 1, ) refill_canister = /obj/item/vending_refill/wardrobe/bar_wardrobe payment_department = ACCOUNT_MED extra_price = PAYCHECK_COMMAND - allow_custom = TRUE /obj/item/vending_refill/wardrobe/bar_wardrobe machine_name = "BarDrobe" @@ -467,7 +457,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) ) refill_canister = /obj/item/vending_refill/wardrobe/chef_wardrobe payment_department = ACCOUNT_SRV - allow_custom = TRUE /obj/item/vending_refill/wardrobe/chef_wardrobe machine_name = "ChefDrobe" @@ -507,7 +496,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) extra_price = PAYCHECK_COMMAND * 0.8 payment_department = ACCOUNT_SRV light_color = COLOR_STRONG_MAGENTA - allow_custom = TRUE /obj/item/vending_refill/wardrobe/jani_wardrobe machine_name = "JaniDrobe" @@ -518,6 +506,7 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) icon_state = "lawdrobe" product_ads = "OBJECTION! Get the rule of law for yourself!" vend_reply = "Thank you for using the LawDrobe!" + extra_price = PAYCHECK_COMMAND * 3 products = list( /obj/item/clothing/accessory/lawyers_badge = 2, /obj/item/clothing/neck/tie = 3, @@ -548,9 +537,11 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) /obj/item/storage/box/evidence = 2, /obj/item/reagent_containers/cup/fish_feed = 1, ) + premium = list( + /obj/item/mod/control/pre_equipped/portable_suit = 1, + ) refill_canister = /obj/item/vending_refill/wardrobe/law_wardrobe payment_department = ACCOUNT_SRV - allow_custom = TRUE /obj/item/vending_refill/wardrobe/law_wardrobe machine_name = "LawDrobe" @@ -583,6 +574,7 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) /obj/item/radio/headset/headset_srv = 2, /obj/item/clothing/suit/chaplainsuit/habit = 1, /obj/item/clothing/head/chaplain/habit_veil = 1, + /obj/item/storage/box/purity_seal_box = 2, ) contraband = list( /obj/item/toy/plush/ratplush = 1, @@ -597,7 +589,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) ) refill_canister = /obj/item/vending_refill/wardrobe/chap_wardrobe payment_department = ACCOUNT_SRV - allow_custom = TRUE /obj/item/vending_refill/wardrobe/chap_wardrobe machine_name = "DeusVend" @@ -629,7 +620,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) ) refill_canister = /obj/item/vending_refill/wardrobe/chem_wardrobe payment_department = ACCOUNT_MED - allow_custom = TRUE /obj/item/vending_refill/wardrobe/chem_wardrobe machine_name = "ChemDrobe" @@ -655,7 +645,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) ) refill_canister = /obj/item/vending_refill/wardrobe/gene_wardrobe payment_department = ACCOUNT_SCI - allow_custom = TRUE /obj/item/vending_refill/wardrobe/gene_wardrobe machine_name = "GeneDrobe" @@ -683,7 +672,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) ) refill_canister = /obj/item/vending_refill/wardrobe/viro_wardrobe payment_department = ACCOUNT_MED - allow_custom = TRUE /obj/item/vending_refill/wardrobe/viro_wardrobe machine_name = "ViroDrobe" @@ -718,7 +706,7 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) /obj/item/clothing/under/rank/security/detective/kim = 1, /obj/item/clothing/suit/jacket/det_suit/kim = 1, /obj/item/clothing/gloves/kim = 1, - /obj/item/clothing/shoes/kim = 1, + /obj/item/clothing/shoes/jackboots/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, @@ -730,7 +718,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) refill_canister = /obj/item/vending_refill/wardrobe/det_wardrobe extra_price = PAYCHECK_COMMAND * 1.75 payment_department = ACCOUNT_SEC - allow_custom = TRUE /obj/item/vending_refill/wardrobe/det_wardrobe machine_name = "DetDrobe" @@ -763,6 +750,7 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) /obj/item/vending_refill/wardrobe/cent_wardrobe machine_name = "CentDrobe" + icon_state = "refill_centdrobe" light_color = LIGHT_COLOR_ELECTRIC_GREEN #undef MOTHROACH_START_CHANCE diff --git a/code/modules/vending/youtool.dm b/code/modules/vending/youtool.dm index b73b183fad24..819ddbe22089 100644 --- a/code/modules/vending/youtool.dm +++ b/code/modules/vending/youtool.dm @@ -33,7 +33,6 @@ default_price = PAYCHECK_CREW extra_price = PAYCHECK_COMMAND * 1.5 payment_department = ACCOUNT_ENG - allow_custom = TRUE /obj/item/vending_refill/youtool machine_name = "YouTool" diff --git a/code/modules/wiremod/components/atom/health.dm b/code/modules/wiremod/components/atom/health.dm index 49798930d976..5f071d2758f8 100644 --- a/code/modules/wiremod/components/atom/health.dm +++ b/code/modules/wiremod/components/atom/health.dm @@ -52,9 +52,9 @@ health.set_output(null) return - brute.set_output(organism.getBruteLoss()) - burn.set_output(organism.getFireLoss()) - toxin.set_output(organism.getToxLoss()) - oxy.set_output(organism.getOxyLoss()) + brute.set_output(organism.get_brute_loss()) + burn.set_output(organism.get_fire_loss()) + toxin.set_output(organism.get_tox_loss()) + oxy.set_output(organism.get_oxy_loss()) health.set_output(organism.health) diff --git a/code/modules/wiremod/components/atom/hear.dm b/code/modules/wiremod/components/atom/hear.dm index b3a41154dc6b..47140317e867 100644 --- a/code/modules/wiremod/components/atom/hear.dm +++ b/code/modules/wiremod/components/atom/hear.dm @@ -43,7 +43,7 @@ SIGNAL_HANDLER return Hear(arglist(arguments)) -/obj/item/circuit_component/hear/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range) +/obj/item/circuit_component/hear/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range, source) // DARKPACK EDIT, ORIGINAL: /obj/item/circuit_component/hear/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range) if(!on.value) return FALSE if(speaker == parent?.shell) diff --git a/code/modules/wiremod/components/atom/remotecam.dm b/code/modules/wiremod/components/atom/remotecam.dm index bbbab6043aff..070d164c01cd 100644 --- a/code/modules/wiremod/components/atom/remotecam.dm +++ b/code/modules/wiremod/components/atom/remotecam.dm @@ -189,7 +189,7 @@ /obj/item/circuit_component/remotecam/proc/update_camera_location(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) SIGNAL_HANDLER if(current_camera_state && current_cameranet_state) - GLOB.cameranet.updatePortableCamera(shell_camera, 0.5 SECONDS) + SScameras.update_portable_camera(shell_camera, 0.5 SECONDS) /** * Add camera from global cameranet @@ -197,8 +197,8 @@ /obj/item/circuit_component/remotecam/proc/cameranet_add() if(current_cameranet_state) return - GLOB.cameranet.cameras += shell_camera - GLOB.cameranet.addCamera(shell_camera) + SScameras.cameras += shell_camera + SScameras.add_camera_to_chunk(shell_camera) current_cameranet_state = TRUE /** @@ -207,8 +207,8 @@ /obj/item/circuit_component/remotecam/proc/cameranet_remove() if(!current_cameranet_state) return - GLOB.cameranet.removeCamera(shell_camera) - GLOB.cameranet.cameras -= shell_camera + SScameras.remove_camera_from_chunk(shell_camera) + SScameras.cameras -= shell_camera current_cameranet_state = FALSE /** diff --git a/code/modules/wiremod/components/id/access_checker.dm b/code/modules/wiremod/components/id/access_checker.dm index 853df324315d..d694834c06aa 100644 --- a/code/modules/wiremod/components/id/access_checker.dm +++ b/code/modules/wiremod/components/id/access_checker.dm @@ -57,7 +57,7 @@ return check_access_list(subject_accesses.value) /obj/item/circuit_component/compare/access/ui_perform_action(mob/user, action) - if(length(required_accesses.connected_ports)) + if(LAZYLEN(required_accesses.connected_ports)) balloon_alert(user, "disconnect port before manually configuring!") return interact(user) diff --git a/code/modules/wiremod/components/math/arithmetic.dm b/code/modules/wiremod/components/math/arithmetic.dm index 20474ec94929..d190c6321198 100644 --- a/code/modules/wiremod/components/math/arithmetic.dm +++ b/code/modules/wiremod/components/math/arithmetic.dm @@ -5,6 +5,7 @@ #define COMP_ARITHMETIC_MODULO "Modulo" #define COMP_ARITHMETIC_MIN "Minimum" #define COMP_ARITHMETIC_MAX "Maximum" +#define COMP_ARITHMETIC_POWER "Power" /** * # Arithmetic Component @@ -38,6 +39,7 @@ COMP_ARITHMETIC_MODULO, COMP_ARITHMETIC_MIN, COMP_ARITHMETIC_MAX, + COMP_ARITHMETIC_POWER, ) arithmetic_option = add_option_port("Arithmetic Option", component_options) @@ -83,6 +85,8 @@ result = max(result, value) if(COMP_ARITHMETIC_MIN) result = min(result, value) + if(COMP_ARITHMETIC_POWER) + result = result ** value output.set_output(result) @@ -93,3 +97,4 @@ #undef COMP_ARITHMETIC_MODULO #undef COMP_ARITHMETIC_MIN #undef COMP_ARITHMETIC_MAX +#undef COMP_ARITHMETIC_POWER diff --git a/code/modules/wiremod/core/component_printer.dm b/code/modules/wiremod/core/component_printer.dm index c1f39f3d48d1..48baef54b89c 100644 --- a/code/modules/wiremod/core/component_printer.dm +++ b/code/modules/wiremod/core/component_printer.dm @@ -7,7 +7,7 @@ circuit = /obj/item/circuitboard/machine/component_printer /// The internal material bus - var/datum/component/remote_materials/materials + var/datum/remote_materials/materials density = TRUE @@ -22,7 +22,7 @@ /obj/machinery/component_printer/Initialize(mapload) . = ..() - materials = AddComponent(/datum/component/remote_materials, mapload) + materials = new (src, mapload) /obj/machinery/component_printer/post_machine_initialize() . = ..() @@ -31,6 +31,10 @@ if(techweb) on_connected_techweb() +/obj/machinery/component_printer/Destroy(force) + QDEL_NULL(materials) + return ..() + /obj/machinery/component_printer/proc/connect_techweb(datum/techweb/new_techweb) if(techweb) UnregisterSignal(techweb, list(COMSIG_TECHWEB_ADD_DESIGN, COMSIG_TECHWEB_REMOVE_DESIGN)) @@ -338,7 +342,7 @@ density = TRUE ///The internal material bus - var/datum/component/remote_materials/materials + var/datum/remote_materials/materials ///List of designs scanned and saved var/list/scanned_designs = list() ///Constant material cost per component @@ -349,7 +353,11 @@ /obj/machinery/module_duplicator/Initialize(mapload) . = ..() - materials = AddComponent(/datum/component/remote_materials, mapload) + materials = new (src, mapload) + +/obj/machinery/module_duplicator/Destroy(force) + QDEL_NULL(materials) + return ..() /obj/machinery/module_duplicator/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) diff --git a/code/modules/wiremod/core/duplicator.dm b/code/modules/wiremod/core/duplicator.dm index 25e833268043..4f3bc86542eb 100644 --- a/code/modules/wiremod/core/duplicator.dm +++ b/code/modules/wiremod/core/duplicator.dm @@ -155,7 +155,7 @@ GLOBAL_LIST_INIT(circuit_dupe_whitelisted_types, list( var/list/input_ports_stored_data = list() for(var/datum/port/input/input as anything in component.input_ports) var/list/connection_data = list() - if(!length(input.connected_ports)) + if(!LAZYLEN(input.connected_ports)) if(isnull(input.value) || !(input.datatype in GLOB.circuit_dupe_whitelisted_types)) continue connection_data["stored_data"] = input.value diff --git a/code/modules/wiremod/core/marker.dm b/code/modules/wiremod/core/marker.dm index c38467ffc095..e50c238659e3 100644 --- a/code/modules/wiremod/core/marker.dm +++ b/code/modules/wiremod/core/marker.dm @@ -56,7 +56,7 @@ carbon_target = target visible_items = carbon_target.get_visible_items() else - visible_items = target.get_equipped_items() + visible_items = target.get_equipped_items(INCLUDE_HELD) visible_items -= src // the multitool cannot mark itself. @@ -70,6 +70,10 @@ mob_choice.name = target.name selectable_targets[REF(target)] = mob_choice for(var/obj/item/item as anything in visible_items) + //no revealing items that are not obscured but meant to be hidden + if(HAS_TRAIT(item, TRAIT_NO_STRIP) || HAS_TRAIT(item, TRAIT_EXAMINE_SKIP)) + continue + var/datum/radial_menu_choice/item_choice = new var/mutable_appearance/item_appearance = new(item) @@ -85,7 +89,7 @@ return var/atom/movable/chosen = locate(picked_ref) - if(chosen == target || (chosen in (carbon_target ? carbon_target.get_visible_items() : target.get_equipped_items()))) + if(chosen == target || (chosen in (carbon_target ? carbon_target.get_visible_items() : target.get_equipped_items(INCLUDE_HELD)))) mark_target(chosen) else balloon_alert(user, "cannot mark entity") diff --git a/code/modules/wiremod/core/port.dm b/code/modules/wiremod/core/port.dm index 0771506076b3..4cda31860731 100644 --- a/code/modules/wiremod/core/port.dm +++ b/code/modules/wiremod/core/port.dm @@ -141,7 +141,7 @@ /datum/port/input/proc/disconnect(datum/port/output/output) SIGNAL_HANDLER - connected_ports -= output + LAZYREMOVE(connected_ports, output) UnregisterSignal(output, COMSIG_PORT_SET_VALUE) UnregisterSignal(output, COMSIG_PORT_SET_TYPE) UnregisterSignal(output, COMSIG_PORT_DISCONNECT) @@ -174,7 +174,6 @@ set_value(default) if(trigger) src.trigger = trigger - src.connected_ports = list() /** * Connects an input port to an output port. @@ -185,7 +184,7 @@ /datum/port/input/proc/connect(datum/port/output/output) if(output in connected_ports) return - connected_ports += output + LAZYADD(connected_ports, output) RegisterSignal(output, COMSIG_PORT_SET_VALUE, PROC_REF(receive_value)) RegisterSignal(output, COMSIG_PORT_SET_TYPE, PROC_REF(check_type)) RegisterSignal(output, COMSIG_PORT_DISCONNECT, PROC_REF(disconnect)) diff --git a/code/modules/wiremod/dcs_components/component_boris_circuit_container.dm b/code/modules/wiremod/dcs_components/component_boris_circuit_container.dm index c64437d21c08..81e950991012 100644 --- a/code/modules/wiremod/dcs_components/component_boris_circuit_container.dm +++ b/code/modules/wiremod/dcs_components/component_boris_circuit_container.dm @@ -34,7 +34,7 @@ var/obj/item/circuit_component/mmi/source_comp = locate(source) if(!istype(source_comp)) return COMPONENT_INCOMPATIBLE - LAZYADD(mmi_components, source) + LAZYADD(mmi_components, source_comp) /datum/component/boris_circuit_container/on_source_remove(source) var/obj/item/circuit_component/mmi/source_comp = locate(source) diff --git a/code/modules/wiremod/shell/module.dm b/code/modules/wiremod/shell/module.dm index a3c1f8572ea1..57139cdfc1b8 100644 --- a/code/modules/wiremod/shell/module.dm +++ b/code/modules/wiremod/shell/module.dm @@ -280,12 +280,16 @@ var/part_name = "Undefined" if(istype(part, /obj/item/clothing/head/mod)) part_name = "Helmet" - if(istype(part, /obj/item/clothing/suit/mod)) + else if(istype(part, /obj/item/clothing/suit/mod)) part_name = "Chestplate" - if(istype(part, /obj/item/clothing/gloves/mod)) + else if(istype(part, /obj/item/clothing/gloves/mod)) part_name = "Gloves" - if(istype(part, /obj/item/clothing/shoes/mod)) + else if(istype(part, /obj/item/clothing/shoes/mod)) part_name = "Boots" + else if(istype(part, /obj/item/clothing/glasses/mod)) + part_name = "Glasses" + else if(istype(part, /obj/item/clothing/neck/mod)) + part_name = "Tie" string_list += part_name deployed_parts.set_output(string_list) deployed.set_output(is_deployed) diff --git a/code/modules/wiremod/shell/moneybot.dm b/code/modules/wiremod/shell/moneybot.dm index 7212da886fd2..2a6aa015faef 100644 --- a/code/modules/wiremod/shell/moneybot.dm +++ b/code/modules/wiremod/shell/moneybot.dm @@ -161,7 +161,7 @@ return attached_bot.add_money(amount_to_insert) - balloon_alert(attacker, "inserted [amount_to_insert] credits.") + balloon_alert(attacker, "inserted [amount_to_insert] [MONEY_NAME].") money_input.set_output(amount_to_insert) entity.set_output(attacker) money_trigger.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 71d3d6169a67..b47e334a65ae 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -12,6 +12,8 @@ sharpness = SHARP_EDGED /obj/item/mutant_hand/zombie/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) + if(QDELETED(target)) + return if(ishuman(target)) try_to_zombie_infect(target, user, user.zone_selected) else if(isliving(target)) @@ -71,10 +73,10 @@ target.investigate_log("has been devoured by a zombie.", INVESTIGATE_DEATHS) 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.adjustOrganLoss(ORGAN_SLOT_BRAIN, -hp_gained) // Zom Bee gibbers "BRAAAAISNSs!1!" + need_mob_update = user.adjust_brute_loss(-hp_gained, updating_health = FALSE) + need_mob_update += user.adjust_tox_loss(-hp_gained, updating_health = FALSE) + need_mob_update += user.adjust_fire_loss(-hp_gained, updating_health = FALSE) + need_mob_update += user.adjust_organ_loss(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/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index 10f1b5cf1c8d..30d0fd984298 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -61,7 +61,7 @@ if(owner.mob_biotypes & MOB_MINERAL)//does not process in inorganic things return if (causes_damage && !iszombie(owner) && owner.stat != DEAD) - owner.adjustToxLoss(0.5 * seconds_per_tick) + owner.adjust_tox_loss(0.5 * seconds_per_tick) if (SPT_PROB(5, seconds_per_tick)) to_chat(owner, span_danger("You feel sick...")) if(timer_id || HAS_TRAIT(owner, TRAIT_SUICIDED) || !owner.get_organ_by_type(/obj/item/organ/brain)) diff --git a/config/admins.txt b/config/admins.txt index 0fe8baadb789..38d20f2f35c7 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -4,150 +4,6 @@ #Ranks will match to those with the same name in admin_ranks.txt, if a match isn't found the user won't be adminned. #If SQL-based admin loading is enabled, admins listed here will always be loaded first and will override any duplicate entries in the database. -Optimumtact = Host -LemonInTheDark = Host -CitrusGender = Game Master -NewSta = Game Master -Expletives = Game Master -kingofkosmos = Game Master -MrStonedOne = Lazy Master -RandomDudeFromTheRim = Game Master -microscopics = Game Master -Gun Hog = Game Master -KorPhaeron = Game Master -razharas = Game Master -Lordpidey = Game Master -Niknakflak = Game Master -rolan7 = Game Master -quarxink = Game Master -adrix89 = Game Master -tle = Game Master -xsi = Game Master -scaredofshadows = Game Master -neofite = Game Master -trubblebass = Game Master -mport2004 = Game Master -deuryn = Game Master -agouri = Game Master -errorage = Game Master -superxpdude = Game Master -petethegoat = Game Master -nodrak = Game Master -carnwennan = Game Master -ikarrus = Game Master -cheridan = Game Master -giacomand = Game Master -rockdtben = Game Master -sieve = Game Master -aranclanos = Game Master -intigracy = Game Master -dumpdavidson = Game Master -kazeespada = Game Master -malkevin = Game Master -incoming = Game Master -demas = Game Master -fleure = Game Master -ricotez = Game Master -misterperson = Game Master -crimsonvision = Game Master -iamgoofball = Game Master -zelacks = Game Master -androidsfv = Game Master -miggles = Game Master -jordie0608 = Game Master -s0ldi3rkr4s0 = Game Master -ergovisavi = Game Master -vistapowa = Game Master -miauw62 = Game Master -rumia29 = Game Master -bobylein = Game Master -sirbayer = Game Master -hornygranny = Game Master -yota = Game Master -firecage = Game Master -donkieyo = Game Master -argoneus = Game Master -paprka = Game Master -cookingboy3 = Game Master -limeliz = Game Master -steelpoint = Game Master -phil235 = Game Master -CorruptComputer = Game Master -xxnoob = Game Master -tkdrg = Game Master -Cuboos = Game Master -thunder12345 = Game Master -wjohnston = Game Master -mandurrh = Game Master -thurgatar = Game Master -xerux = Game Master -dannno = Game Master -lo6a4evskiy = Game Master -vekter = Game Master -Ahammer18 = Game Master -ACCount12 = Game Master -fayrik = Game Master -shadowlight213 = Game Master -drovidicorv = Game Master -Dunc = Game Master -MMMiracles = Game Master -bear1ake = Game Master -CoreOverload = Game Master -Jalleo = Game Master -ChangelingRain = Game Master -FoxPMcCloud = Game Master -Xhuis = Game Master -Astralenigma = Game Master -Tokiko1 = Game Master -SuperSayu = Game Master -Lzimann = Game Master -As334 = Game Master -neersighted = Game Master -Swankcookie = Game Master -Ressler = Game Master -Folix = Game Master -Bawhoppennn = Game Master -Anturke = Host -Lumipharon = Game Master -bgobandit = Game Master -coiax = Game Master -RandomMarine = Game Master -PKPenguin321 = Game Master -TechnoAlchemist = Game Master -Aloraydrel = Game Master -Quiltyquilty = Game Master -SnipeDragon = Game Master -Fjeld = Game Master -kevinz000 = Game Master -Tacolizard = Game Master -TrustyGun = Game Master -Cyberboss = Game Master -PJB3005 = Game Master -Sweaterkittens = Game Master -Feemjmeem = Game Master -JStheguy = Game Master -excessiveuseofcobby = Game Master -Plizzard = Game Master -octareenroon91 = Game Master -Serpentarium = Game Master -Averagejoe82 = Game Master -The Dreamweaver = Game Master -Denton-30 = Game Master -Naksuasdf = Game Master -MrDoomBringer = Game Master -shizcalev = Game Master -NicBR = Game Master -LoserWasTaken = Game Master -Fikou = Game Master -Magatsuchi = Game Master -Skoglol = Game Master -4dplanner = Game Master -Time-Green = Game Master -StyleMistake = Game Master -actioninja = Game Master -bobbahbrown = Game Master -Jaredfogle = Game Master+Coder -WaylandSmithy = Game Master -NamelessFairy = Game Master -WalterMeldron = Game Master -san7890 = Game Master +XeonMations = Host +chazsadboys = Game Master +FalloutFalconPlays = Game Master diff --git a/config/config.txt b/config/config.txt index 3f049a89f80d..5fcaab4816e7 100644 --- a/config/config.txt +++ b/config/config.txt @@ -22,13 +22,13 @@ $include darkpack_config.txt # There are various options which are hard-locked for security reasons. ## Server name: This appears at the top of the screen in-game and in the BYOND hub. Uncomment and replace 'tgstation' with the name of your choice. -# SERVERNAME tgstation +# SERVERNAME darkpack ## Server SQL name: This is the name used to identify the server to the SQL DB, distinct from SERVERNAME as it must be at most 32 characters. -# SERVERSQLNAME tgstation +# SERVERSQLNAME darkpack ## Station name: The name of the station as it is referred to in-game. If commented out, the game will generate a random name instead. -STATIONNAME San Francisco +# STATIONNAME San Francisco ## Put on byond hub: Uncomment this to put your server on the byond hub. #HUB @@ -122,9 +122,6 @@ RETA_DEPT_COOLDOWN_DS 150 ## allow players to initiate a map-change vote #ALLOW_VOTE_MAP -## allow players to rock the vote, or to vote on the map again if they didn't like the last results -#ALLOW_ROCK_THE_VOTE - ## the number of times you wish to allow players to rock the vote in a given shift MAX_ROCKING_VOTES 1 @@ -144,7 +141,7 @@ VOTE_PERIOD 600 ## 0 = Cannot respawn (default) ## 1 = Can respawn ## 2 = Can respawn if choosing a different character -ALLOW_RESPAWN 0 +ALLOW_RESPAWN 2 ## Respawn delay (deciseconds), which doesn't allow to return to lobby RESPAWN_DELAY 0 @@ -227,6 +224,9 @@ IPINTEL_REJECT_BAD ## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. # BANAPPEALS http://justanotherday.example.com +## Config URL - Intended for servers that have a repository/public folder/etc. that show off the config that they are running +# CONFIGURL https://github.com/tgstation-operations/server-config + ## System command that invokes yt-dlp, used by Play Internet Sound. ## You can install yt-dlp with ## "pip install yt-dlp" if you have pip installed @@ -654,3 +654,6 @@ TGUI_MAX_CHUNK_COUNT 32 ## While this is uncommented, server initialization will include some asset generation usually useful for development. ## It increases initialization time significantly so you'll want to disable this in live environments. GENERATE_ASSETS_IN_INIT + +## Minimum time before a heretic can ascend, in minutes +# MINIMUM_ASCENSION_TIME 3 diff --git a/config/darkpack_config.txt b/config/darkpack_config.txt index 900e923f905b..93495f4e3984 100644 --- a/config/darkpack_config.txt +++ b/config/darkpack_config.txt @@ -2,3 +2,24 @@ #JUMP_WINDUP ## Comment to remove Apocrypha post-jump slowdown JUMP_SLOWDOWN + +## If the server has NSFW content enabled. +#NSFW_CONTENT + +## Uncomment to use extra success exploding dice +#ON_CRIT_ADDITIONAL_SUCCESS + +## Uncomment to use actual exploding dice +ON_CRIT_ADDITIONAL_DIE + +## Time til day define +TIME_TILL_DAY 198000 + +## Time till roundend define +TIME_TILL_ROUNDEND 216000 + +## World of Darkness splats, currently coded as species +ROUNDSTART_RACES kindred +ROUNDSTART_RACES ghoul +## If dead people and ghosts can LOOC to people who are alive. +DISABLE_GHOST_LOOC diff --git a/config/dynamic.toml b/config/dynamic.toml index 3d8b6d296552..e5b7f92b2f99 100644 --- a/config/dynamic.toml +++ b/config/dynamic.toml @@ -354,6 +354,19 @@ repeatable_weight_decrease = 2 repeatable = 1 minimum_required_age = 0 +["Midround Mass Changelings"] +weight.1 = 0 +weight.2 = 3 +weight.3 = 4 +weight.4 = 5 +min_pop = 25 +blacklisted_roles = [] +repeatable_weight_decrease = 4 +repeatable = 1 +minimum_required_age = 0 +min_antag_cap = 2 +max_antag_cap = 3 + ["Paradox Clone"] weight = 5 min_pop = 10 @@ -414,6 +427,19 @@ repeatable_weight_decrease = 2 repeatable = 1 minimum_required_age = 0 +["Midround Mass Traitors"] +weight.1 = 0 +weight.2 = 3 +weight.3 = 8 +weight.4 = 10 +min_pop = 15 +blacklisted_roles = [] +repeatable_weight_decrease = 7 +repeatable = 1 +minimum_required_age = 0 +min_antag_cap = 2 +max_antag_cap = 4 + ["Midround Malfunctioning AI"] weight.1 = 0 weight.2 = 1 diff --git a/config/events.json b/config/events.json index 8f3b61dc1746..e7ad93b0ce3d 100644 --- a/config/events.json +++ b/config/events.json @@ -1,8 +1,4 @@ { - "Space Pirates": { - "min_players": 20, - "weight": 10 - }, "Spawn Bitrunning Glitch": { "min_players": 1, "weight": 100 @@ -17,7 +13,7 @@ "weight": 25 }, "Brand Intelligence": { - "min_players": 20, + "min_players": 15, "weight": 5 }, "Bureaucratic Error": { @@ -149,10 +145,6 @@ "min_players": 0, "weight": 10 }, - "Spider Infestation": { - "min_players": 20, - "weight": 10 - }, "Stray Cargo Pod": { "min_players": 0, "weight": 20, @@ -183,7 +175,7 @@ }, "Ventilation Clog: Major": { "min_players": 0, - "weight": 10, + "weight": 12, "earliest_start": 6000 }, "Ventilation Clog: Critical": { @@ -202,7 +194,7 @@ }, "Wormholes": { "min_players": 2, - "weight": 1 + "weight": 2 }, "Anomaly: Energetic Flux": { "min_players": 1, @@ -248,43 +240,10 @@ "min_players": 20, "weight": 10 }, - "Abductors": { - "min_players": 20, - "weight": 10 - }, - "Alien Infestation": { - "min_players": 10, - "weight": 5 - }, - "Blob": { - "min_players": 20, - "weight": 10 - }, - "Changeling Meteor": { - "min_players": 20, - "weight": 8 - }, - "Spawn Fugitives": { - "min_players": 20, - "weight": 10, - "earliest_start": 18000 - }, - "Spawn Morph": { - "min_players": 0, - "weight": 0 - }, - "Spawn Nightmare": { - "min_players": 20, - "weight": 10 - }, "Lone Operative": { "min_players": 0, "weight": 0 }, - "Spawn Revenant": { - "min_players": 5, - "weight": 7 - }, "Random Human-level Intelligence": { "min_players": 0, "weight": 10 @@ -293,19 +252,6 @@ "min_players": 0, "weight": 0 }, - "Spawn Slaughter Demon": { - "min_players": 20, - "weight": 1, - "earliest_start": 36000 - }, - "Spawn Space Dragon": { - "min_players": 20, - "weight": 7 - }, - "Spawn Space Ninja": { - "min_players": 20, - "weight": 10 - }, "Immovable Rod": { "min_players": 15, "weight": 10 diff --git a/config/game_options.txt b/config/game_options.txt index 5e3b83675ca3..acb47502f499 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -6,7 +6,7 @@ DAMAGE_MULTIPLIER 1 ## REVIVAL ### ## whether pod plants work or not -REVIVAL_POD_PLANTS +#REVIVAL_POD_PLANTS ## amount of time (in hundredths of seconds) for which a brain retains the "spark of life" after the person's death (set to -1 for infinite) REVIVAL_BRAIN_LIFE -1 @@ -33,8 +33,8 @@ COMMENDATION_PERCENT_POLL 0.05 ## To speed things up make the number negative, to slow things down, make the number positive. ## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. -RUN_DELAY 1.5 -WALK_DELAY 4 +RUN_DELAY 2 +WALK_DELAY 3 ## The variables below affect the movement of specific mob types. THIS AFFECTS ALL SUBTYPES OF THE TYPE YOU CHOOSE! ## Entries completely override all subtypes. Later entries have precedence over earlier entries. @@ -50,7 +50,7 @@ MULTIPLICATIVE_MOVESPEED /mob/living/basic 0 ## NAMES ### ## If uncommented this adds a random surname to a player's name if they only specify one name. -HUMANS_NEED_SURNAMES +#HUMANS_NEED_SURNAMES ## If uncommented, this forces all players to use random names !and appearances!. #FORCE_RANDOM_NAMES @@ -89,12 +89,12 @@ STATION_GOAL_BUDGET 1 ## If TRUE / 1, station is raised to blue alert at roundstart. ## If FALSE / 0, station remains at green alert. ## Roundstart command report and greendshift announcements are unaffected. -ROUNDSTART_BLUE_ALERT 1 +ROUNDSTART_BLUE_ALERT 0 ## GAME MODES ### ## Uncomment to not send a roundstart intercept report. Gamemodes may override this. -#NO_INTERCEPT_REPORT +NO_INTERCEPT_REPORT ## Percent weight reductions for three of the most recent modes @@ -157,7 +157,7 @@ DYNAMIC_CONFIG_ENABLED #ALLOW_RANDOM_EVENTS ## Uncomment this to disable station traits. -FORBID_STATION_TRAITS +#FORBID_STATION_TRAITS ## The lower bound, in deciseconds, for how soon another random event can be scheduled. ## Defaults to 1500 deciseconds or 2.5 minutes @@ -204,7 +204,7 @@ CONFIG_GATEWAY_CHANCE 0 ## If the number of players ready at round starts exceeds this threshold, JOBS_HAVE_MINIMAL_ACCESS will automatically be enabled. Otherwise, it will be disabled. ## This is useful for accommodating both low and high population rounds on the same server. ## Comment this out or set to 0 to disable this automatic toggle. -MINIMAL_ACCESS_THRESHOLD 20 +#MINIMAL_ACCESS_THRESHOLD 20 ## Comment this out this if you wish to use the setup where jobs have more access. ## This is intended for servers with low populations - where there are not enough @@ -228,8 +228,7 @@ MINIMAL_ACCESS_THRESHOLD 20 ## Set to 0/commented out for "off", Departmental Security Officers will never get additional room-specific access (beyond general departmental doors). ## Set to 1 if you want to enable "Scaling Access", where Departmental Security Officers will get access to most rooms within a department depending on how many security officers there are relative to the number of people on a station. ## Set to 2 if you want Departmental Security Officers to always have access to all rooms in a department. -DEPSEC_ACCESS_LEVEL 1 - +DEPSEC_ACCESS_LEVEL 0 ## GHOST INTERACTION ### ## Uncomment to let ghosts spin chairs. You may be wondering why this is a config option. Don't ask. @@ -366,14 +365,6 @@ SILICON_MAX_LAW_AMOUNT 12 ## You probably want humans on your space station, but technically speaking you can turn them off without any ill effect ROUNDSTART_RACES human -## DARKPACK EDIT START - -## World of Darkness splats, currently coded as species -ROUNDSTART_RACES kindred -ROUNDSTART_RACES ghoul - -## DARKPACK EDIT END - ## Races that are strictly worse than humans that could probably be turned on without balance concerns #ROUNDSTART_RACES felinid #ROUNDSTART_RACES lizard @@ -407,7 +398,7 @@ ROUNDSTART_RACES ghoul ## Disable roundstart species morgue cadavers? ## Cadavers in the morgue at the start of the round will be randomly picked from all enabled ROUNDSTART_RACES ## Recommended to leave this commented out so nonhuman species will have viable replacement bodies / organs when they die. -# MORGUE_CADAVER_DISABLE_NONHUMANS +MORGUE_CADAVER_DISABLE_NONHUMANS ## Morgue Cadaver Species Probability ## The probability for nonhuman cadavers to spawn in the morgue. @@ -424,7 +415,7 @@ MORGUE_CADAVER_OTHER_SPECIES_PROBABILITY 50 ##Overflow job. Default is assistant. ## NOTE: This will overwrite anything you put in jobconfig.toml! -OVERFLOW_JOB Assistant +OVERFLOW_JOB Citizen ## 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! @@ -493,7 +484,7 @@ MICE_ROUNDSTART 10 ROUNDSTART_TRAITS ## Uncomment to disable human moods. -#DISABLE_HUMAN_MOOD +DISABLE_HUMAN_MOOD ## Enable night shifts #ENABLE_NIGHT_SHIFTS diff --git a/config/jukebox_music/README.txt b/config/jukebox_music/README.txt index c985746edd5d..a89c1162d02c 100644 --- a/config/jukebox_music/README.txt +++ b/config/jukebox_music/README.txt @@ -1,4 +1,5 @@ -The enclosed /sounds folder holds the sound files used for player selectable songs for an ingame jukebox. OGG and WAV are supported. +The enclosed /sounds folder holds the sound files used for player selectable songs for an ingame jukebox. +OGG, WAV, and MP3 are supported. (I recommend verifying this is up to date with the list of `IS_SOUND_FILE_SAFE`) Using unnecessarily huge sounds can cause client side lag and should be avoided. @@ -10,6 +11,8 @@ Naming Conventions: Every sound you add must have a unique name. Avoid using the plus sign "+" and the period "." in names, as these are used internally to classify sounds. -Sound names must be in the format of [song name]+[length in deciseconds]+[beat in deciseconds].ogg +Sound names must be in the format of [song name]+[beat in deciseconds].ogg -A three minute song title "SS13" that lasted 3 minutes would have a file name SS13+1800+5.ogg \ No newline at end of file +beat is recommended but the code does not require it as its only used in the disco jukebox and UI + +A song title "SS13" would have a file name SS13+5.ogg or SS13.ogg diff --git a/config/maps.txt b/config/maps.txt index 990245e202cc..40d5971867a6 100644 --- a/config/maps.txt +++ b/config/maps.txt @@ -55,6 +55,11 @@ endmap minplayers 40 endmap +map westfieldmall + votable + default +endmap + # Debug-only maps. map gateway_test diff --git a/config/reboot_themes/anyoneheard.ogg b/config/reboot_themes/anyoneheard.ogg deleted file mode 100644 index be5de080e78f..000000000000 Binary files a/config/reboot_themes/anyoneheard.ogg and /dev/null differ diff --git a/config/reboot_themes/apcdestroyed.ogg b/config/reboot_themes/apcdestroyed.ogg deleted file mode 100644 index 7fe77dd52366..000000000000 Binary files a/config/reboot_themes/apcdestroyed.ogg and /dev/null differ diff --git a/config/reboot_themes/bangindonk.ogg b/config/reboot_themes/bangindonk.ogg deleted file mode 100644 index b3a3624de56d..000000000000 Binary files a/config/reboot_themes/bangindonk.ogg and /dev/null differ diff --git a/config/reboot_themes/bully2.ogg b/config/reboot_themes/bully2.ogg deleted file mode 100644 index 5ecbe532c355..000000000000 Binary files a/config/reboot_themes/bully2.ogg and /dev/null differ diff --git a/config/reboot_themes/cain.ogg b/config/reboot_themes/cain.ogg new file mode 100644 index 000000000000..88dfc38d3523 Binary files /dev/null and b/config/reboot_themes/cain.ogg differ diff --git a/config/reboot_themes/die.ogg b/config/reboot_themes/die.ogg new file mode 100644 index 000000000000..7ae990c33c1b Binary files /dev/null and b/config/reboot_themes/die.ogg differ diff --git a/config/reboot_themes/disappointed.ogg b/config/reboot_themes/disappointed.ogg deleted file mode 100644 index 984bedbcd4bd..000000000000 Binary files a/config/reboot_themes/disappointed.ogg and /dev/null differ diff --git a/config/reboot_themes/hunterstheparenting.mp3 b/config/reboot_themes/hunterstheparenting.mp3 new file mode 100644 index 000000000000..e92c57dc11dc Binary files /dev/null and b/config/reboot_themes/hunterstheparenting.mp3 differ diff --git a/config/reboot_themes/its_only_game.ogg b/config/reboot_themes/its_only_game.ogg deleted file mode 100644 index 3fe36eee9550..000000000000 Binary files a/config/reboot_themes/its_only_game.ogg and /dev/null differ diff --git a/config/reboot_themes/leavingtg.ogg b/config/reboot_themes/leavingtg.ogg deleted file mode 100644 index 455dc9fb1190..000000000000 Binary files a/config/reboot_themes/leavingtg.ogg and /dev/null differ diff --git a/config/reboot_themes/malkavian.ogg b/config/reboot_themes/malkavian.ogg new file mode 100644 index 000000000000..a938ec897be1 Binary files /dev/null and b/config/reboot_themes/malkavian.ogg differ diff --git a/config/reboot_themes/newroundsexy.ogg b/config/reboot_themes/newroundsexy.ogg deleted file mode 100644 index afe5630f04df..000000000000 Binary files a/config/reboot_themes/newroundsexy.ogg and /dev/null differ diff --git a/config/reboot_themes/petersondisappointed.ogg b/config/reboot_themes/petersondisappointed.ogg deleted file mode 100644 index 3e8a3a2857bc..000000000000 Binary files a/config/reboot_themes/petersondisappointed.ogg and /dev/null differ diff --git a/config/reboot_themes/scrunglartiy.ogg b/config/reboot_themes/scrunglartiy.ogg deleted file mode 100644 index 8019b567449d..000000000000 Binary files a/config/reboot_themes/scrunglartiy.ogg and /dev/null differ diff --git a/config/reboot_themes/suicidesquad.mp3 b/config/reboot_themes/suicidesquad.mp3 new file mode 100644 index 000000000000..638ccb8ee957 Binary files /dev/null and b/config/reboot_themes/suicidesquad.mp3 differ diff --git a/config/reboot_themes/werewolvestheapocalypse.mp3 b/config/reboot_themes/werewolvestheapocalypse.mp3 new file mode 100644 index 000000000000..ed73de7e1c5d Binary files /dev/null and b/config/reboot_themes/werewolvestheapocalypse.mp3 differ diff --git a/config/reboot_themes/worldofdarkness.mp3 b/config/reboot_themes/worldofdarkness.mp3 new file mode 100644 index 000000000000..d5aee6d65158 Binary files /dev/null and b/config/reboot_themes/worldofdarkness.mp3 differ diff --git a/config/reboot_themes/yeehaw.ogg b/config/reboot_themes/yeehaw.ogg deleted file mode 100644 index ddc56fbfe9df..000000000000 Binary files a/config/reboot_themes/yeehaw.ogg and /dev/null differ diff --git a/config/resources.txt b/config/resources.txt index 318730caa55d..c47aabc67de4 100644 --- a/config/resources.txt +++ b/config/resources.txt @@ -44,3 +44,12 @@ EXTERNAL_RSC_URLS http://tgstation13.download/byond/tgstationv2.zip # # # + +# If configured, this allows server operators to define the persistent origin used for clientside +# storage. This must host the same file as available in tgui/public/iframe.html. This is also hosted +# on the GitHub Pages site for the /tg/station repository, so does not need to be configured. +# If multiple servers use the same domain name, clientside features such as message saving +# and chat tabs will be persistent across both. +# If this setting is not configured, but the webroot CDN is, that will be used instead of GitHub Pages. +# If this setting is mpty, and the webroot CDN is disabled, byondstorage will be used. +# STORAGE_CDN_IFRAME https://tgstation.github.io/byond-client-storage/iframe.html diff --git a/config/title_music/README.txt b/config/title_music/README.txt index 42e97970020c..48707bfd7b99 100644 --- a/config/title_music/README.txt +++ b/config/title_music/README.txt @@ -1,4 +1,5 @@ -The enclosed /sounds folder holds the sound files used as the title music for the game. OGG and WAV are supported. +The enclosed /sounds folder holds the sound files used as the title music for the game. +OGG is the recommended sound format but see code/controllers/subsystem/sounds.dm for the rest of the supported ones. Using unnecessarily huge sounds can cause client side lag and should be avoided. @@ -23,7 +24,7 @@ Map Title Sounds: Map sounds are tied to a specific in game map. To make a map title you format the name like this "(name of a map)+(name of your sound)" -The spelling of the map name is important. It must match exactly the define MAP_NAME found in the relevant .DM file in the /_maps folder in +The spelling of the map name is important. It must match exactly the define MAP_NAME found in the relevant .DM file in the /_maps folder in the root directory. It can also be seen in game in the status menu. Note that there are no spaces between the two names. It is absolutely fine to have more than one sound tied to the same map. It's also fine to have a rare map sound. diff --git a/dependencies.sh b/dependencies.sh index 56596e18d399..2869f8c53d9d 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -8,19 +8,19 @@ export BYOND_MAJOR=516 export BYOND_MINOR=1659 #rust_g git tag -export RUST_G_VERSION=4.0.0 +export RUST_G_VERSION=4.2.0 # node version export NODE_VERSION_LTS=22.11.0 # Bun version -export BUN_VERSION=1.2.16 +export BUN_VERSION=1.3.5 # SpacemanDMM git tag export SPACEMAN_DMM_VERSION=suite-1.11 # Python version for mapmerge and other tools -export PYTHON_VERSION=3.9.0 +export PYTHON_VERSION=3.11.0 #dreamluau repo export DREAMLUAU_REPO="tgstation/dreamluau" diff --git a/html/changelogs/AutoChangeLog-pr-145.yml b/html/changelogs/AutoChangeLog-pr-145.yml deleted file mode 100644 index 0a2376854762..000000000000 --- a/html/changelogs/AutoChangeLog-pr-145.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "FalloutFalcon" -delete-after: True -changes: - - bugfix: "lowwalls should act more like tables, mainly jumping over them." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-183.yml b/html/changelogs/AutoChangeLog-pr-183.yml deleted file mode 100644 index 0e13cf1c631e..000000000000 --- a/html/changelogs/AutoChangeLog-pr-183.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XeonMations" -delete-after: True -changes: - - rscadd: "Added ghouls to the game." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-193.yml b/html/changelogs/AutoChangeLog-pr-193.yml deleted file mode 100644 index 237a224dbb00..000000000000 --- a/html/changelogs/AutoChangeLog-pr-193.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "FalloutFalcon" -delete-after: True -changes: - - rscadd: "Sunlight and daytime now have nice status effects" - - admin: "vote for extending time of day" \ No newline at end of file diff --git a/html/changelogs/archive/2025-10.yml b/html/changelogs/archive/2025-10.yml index 8008c13dbc4d..0a718f2508f7 100644 --- a/html/changelogs/archive/2025-10.yml +++ b/html/changelogs/archive/2025-10.yml @@ -102,3 +102,32 @@ - rscadd: Added the ability to give vitae! - code_imp: Removed some unnecessary files from the codebase - bugfix: Fixed a hard delete relating to the madness network. +2025-10-27: + FalloutFalcon: + - rscadd: Sunlight and daytime now have nice status effects + - admin: vote for extending time of day + - bugfix: lowwalls should act more like tables, mainly jumping over them. + XeonMations: + - rscadd: Added ghouls to the game. +2025-10-29: + FalloutFalcon: + - balance: readds rats spawning in sewers but massivly restricts there spawning + conditions + - balance: snow now appears through the entire month of december + - bugfix: turf decals should now properly adjust there apparence + - code_imp: turf init should be a tiny bit faster +2025-10-30: + FalloutFalcon: + - balance: Climbing down open space takes longer then using ladders but now also + uses your stats. + - refactor: Refactors climbing down to be doable by more then just humans +2025-10-31: + Beautiful TG coders: + - code_imp: Monthly TG Pull. Thank you TG. + KCartridge, Paynt: + - rscadd: Colored countertops + Melbert: + - refactor: Refactored species unique organs slightly, particularly how they are + set up at game start. Report any oddities, like invisible tails or wings + dwinters99: + - rscadd: alt-click to conceal/reveal satchels diff --git a/html/changelogs/archive/2025-11.yml b/html/changelogs/archive/2025-11.yml new file mode 100644 index 000000000000..2934695c986a --- /dev/null +++ b/html/changelogs/archive/2025-11.yml @@ -0,0 +1,195 @@ +2025-11-01: + FalloutFalcon: + - rscadd: Re implements the basic weather effects, only found in sewers or admin + bus atm + - bugfix: most walls should no longer become missing textures if placed weird + TheTrueSilverRat, chazzyjazzy, XeonMations: + - refactor: Added special checks for jobs + - rscadd: City jobs! + XeonMations: + - rscadd: Added pixelshifting to the game. + chazzyjazzy: + - code_imp: remakes beastmaster subsystem and makes it easier to use +2025-11-02: + Marshmellow105: + - rscdel: removes old elevator code/icons I think + - sound: added elevator door sounds + - image: added animated elevator doors and elevator buttons + XeonMations: + - rscadd: Added flavor text to the game +2025-11-03: + FalloutFalcon: + - qol: vamprocks are now normal rocks that can be smashed + - map: random spawners for flora + - rscadd: wood plant trays + - qol: you can cut seeds out of plants with any sharp object + - refactor: weed is now normal botany, meaning it functions like how all the other + plants work + - image: pretty new crate and plant tray sprites by paynt + - bugfix: retail stores will use custom premium price if it doesnt have normal custom_price + nor passed in the retail store +2025-11-05: + FalloutFalcon: + - sound: Adds wooden door knocking, Sounds where in the repo just unused. + - sound: Replaces the end of round sounds with bloopers from the HTP episode 6.2 + - refactor: fishing has been TGified + chazzyjazzy: + - code_imp: reticks necromancy and remakes graveyard subsystem + dwinters99: + - rscadd: wod belts + - rscadd: TFN tasers +2025-11-06: + dwinters99: + - map: viewport helpers for mapping +2025-11-09: + dwinters99: + - bugfix: lizard and ethereal blood no longer spawns in blood freezers +2025-11-11: + chazzyjazzy: + - code_imp: ticking thaumaturgy and file management for ritual thaumaturgy + dwinters99: + - balance: loadout cowboy hat changed to the unarmored variant +2025-11-12: + FalloutFalcon: + - rscadd: deer are scared of darkpack cars lol +2025-11-13: + FalloutFalcon: + - rscadd: Added a few new "City" traits + - rscdel: Disables all old station traits + - qol: thunder can be heard from MUCH MUCH further away + - admin: Only city traits that are real show up in the station trait select menu + - image: adds or fixes a few missing icon states + - qol: City Maps either open the wiki or navigate verb depending on input + - rscadd: NPC cap has been moved to map configs, expect less npcs in smaller maps. + - bugfix: NPC repopulate is called on round start to get up to the correct number + - bugfix: alt sprite for bonfires should behave better +2025-11-14: + FalloutFalcon, Major00: + - image: Re-sprites drink and snack vending machine + Marshmellow105: + - bugfix: fixes shutters layering under shit +2025-11-17: + FalloutFalcon: + - bugfix: NPCs should behave saner when it comes to being attacked + XeonMations: + - rscadd: Added phones + akbar-kurnia1: + - spellcheck: Reflavored the catatonic NPC message to be more generic. +2025-11-18: + FalloutFalcon: + - bugfix: Tzi content and arcane book must be learned + dwinters99: + - code_imp: doors repathed +2025-11-19: + Eli-Hodges: + - bugfix: fixed pixel shifting offset + - code_imp: changed logic to use in-built offset logic. + - spellcheck: Lowercased the name of elevators + FalloutFalcon: + - rscadd: 'Seperates non-diagetic music into its own subsystem + + add Adds some placeholder sound environments for some of the area types, full + pass still required' + - refactor: ports shiptest's turf fire and spreading + - rscadd: Raven and crow basic mobs (corax kinfolk) + chazzyjazzy: + - code_imp: ticking vip barriers and now they work so +2025-11-21: + Eli-Hodges: + - bugfix: runtime from elevator wire cutting + dwinters99: + - bugfix: NPC name and real_name now match + - rscadd: robes in loadout + - bugfix: NPCs are no longer catatonic. Just busy. +2025-11-22: + FalloutFalcon: + - qol: examing the Sarcophagus lets you roll to auto decipher the cipher + KCartridge: + - rscadd: Fixed walls that are now good and awesome + - image: Removed old evil walls that were replaced yayyy + Marshmellow105: + - rscadd: adds old chairs back along with some new variants + dwinters99: + - image: technically unorphaned two phone sprites +2025-11-23: + Eli-Hodges: + - spellcheck: Added improper grammar to the city police sign + FalloutFalcon, ghoulpen: + - image: deer sprites from ghoulpen + XeonMations: + - map: Updated updatepaths scripts to not miss some stuff. + dwinters99 & Major00 (Paynt): + - image: new hud by Major00 (Paynt) +2025-11-24: + XeonMations: + - bugfix: Fixed phone call records not properly cllearing and dead NPCs not fully + restoring your masquerade. + - rscdel: Removed player shadow disc + dwinters99: + - image: old vehicle sprites +2025-11-25: + FalloutFalcon: + - rscadd: city gangrel + - rscadd: reimplements protean + - rscadd: readds beast marks selection conveted to tgui pref + - balance: tunes back gangrel form health and damage + chazzyjazzy: + - image: flowers & trees now sway in the wind + dwinters99: + - map: fake platforms and low shadows +2025-11-27: + Beautiful TG coders: + - code_imp: Monthly TG Pull. Thank you TG. + FalloutFalcon: + - bugfix: Doors no longer think they are on the tile above them + JohnFulpWillard: + - bugfix: Headslugs are now small. + XeonMations: + - rscadd: Added Auspex to the game + - balance: You are now more sensitive to noises and bright lights while using Heightened + Senses. + Y0SH1M4S73R: + - sound: Squid tongues have a distinctive effect on your text-to-speech voice. + buffyuwu: + - bugfix: fixes malkavian hivemind and madness speech features + dwinters99: + - bugfix: woodglass doors no longer are opaque + - rscdel: the Axe Gang is dead. Long live the Warehouse. + lelandkemble: + - bugfix: Ghosts can no longer try and fail to admire aquariums. +2025-11-28: + Hawk-v3: + - rscadd: Reimplements the Fusebox. + chazzyjazzy: + - code_imp: readds vault doors and keypads + dwinters99: + - image: decor.dmi is fucking dead + - code_imp: repaths job start landmarks to be more sane + - code_imp: add missing job defines +2025-11-29: + FalloutFalcon: + - rscadd: Bloodpool icon + - bugfix: Bloodpool calucations should acctually run and be ttrpg accurate + - rscadd: Readds Temporis. + FalloutFalcon, Major00: + - image: Resprites the TG lobby menu to be more vampyr + XeonMations: + - server: Defaulted some config changes. + chazzyjazzy: + - code_imp: readds necromancy & necromancy rituals + - code_imp: readds obtenebration & abyss mysticism rituals + dwinters99: + - code_imp: default ghoul dummy is now Heather Poe from VTMB + - bugfix: donut onfloors work + - bugfix: mothic and martian food sorted into misc food + - bugfix: sheaths have icons + - bugfix: lattices let you walk over water + - bugfix: fake platforms are on the right plane +2025-11-30: + FalloutFalcon: + - bugfix: silver ammo now has onfloors + - bugfix: mapping now shows mag sprites properly + XeonMations: + - bugfix: Fixed the majority of hard deletes that we encountered thus far + - bugfix: Fixed blood hunts using name instead of real name, previously not showing + the hunted's name. diff --git a/html/changelogs/archive/2025-12.yml b/html/changelogs/archive/2025-12.yml new file mode 100644 index 000000000000..55d8dbbbaad6 --- /dev/null +++ b/html/changelogs/archive/2025-12.yml @@ -0,0 +1,84 @@ +2025-12-03: + FalloutFalcon: + - bugfix: tzimisce night vision eyes work + - qol: bloodpool and torpor is fixed on admin heals + chazzyjazzy: + - bugfix: fixes a couple issues +2025-12-05: + dwinters99: + - refactor: low walls are now objects +2025-12-07: + Odisurin: + - rscadd: Two new signs to the game for later down the road establishments + XeonMations: + - balance: Stakes now place kindred in torpor until removed. + chazzyjazzy: + - bugfix: ticking a file +2025-12-09: + XeonMations: + - rscadd: Added 3 mannequin subtypes to the game. +2025-12-10: + XeonMations: + - rscadd: Added Guestbooks to the game, you now are required to ctrl shift click + a person to set their name for yourself. +2025-12-12: + chazzyjazzy: + - code_imp: implemented missing items +2025-12-14: + XeonMations: + - code_imp: Removed the remnants of vampireinfo + - code_imp: Added Stats to the game +2025-12-15: + XeonMations: + - bugfix: Fixed a bluescreen caused by having too large a score in a stat. + cornercube: + - rscadd: mac-10 and PSG-1 sprite + - rscadd: mac-10 super sprite + - rscadd: braddock 45, cleaner custom, and auto-sniper weapons + - rscadd: mac-10 sound effect from TFN + - rscadd: onfloors, inhands, and icons +2025-12-16: + XeonMations: + - refactor: Moved generation variable to species. + XeonMations, Gandalf2k15, Azarak, Seris02, ZephyrTFA, Zonespace27, Vishenka0704, LT3, KannaLisvern: + - rscadd: Added LOOC +2025-12-19: + chazzyjazzy: + - code_imp: adds the hair, adds the 10 dice two successes +2025-12-22: + chazzyjazzy: + - code_imp: removes duplicates from preferences adjectives list +2025-12-23: + FalloutFalcon: + - bugfix: Lowwalls now spawn there windows again +2025-12-24: + FalloutFalcon: + - rscadd: Real ashtrays you can take in loadout. +2025-12-25: + Icarus-The-Sun: + - rscdel: Removes the AI superiority quirk for humans and ghouls. + - bugfix: 'fixes #347' +2025-12-26: + Icarus-The-Sun: + - rscadd: Added Asthma inhalers and refill canisters for them to pharmacy shops. +2025-12-27: + XeonMations: + - rscadd: Added new shiny radios and transceivers. +2025-12-28: + XeonMations: + - code_imp: Fixed some unit test linters screaming. + dwinters99, Marshmellow105, Drakeven, FalloutFalcon: + - rscadd: Bottle of wine filled with blood for more discrete blood storage. + - rscadd: Skate park shop retail store. + - rscadd: Ramp subtype of stairs for use in skatepark. + - rscadd: Mapping helpers for setting values of doors, please stop var-editing your + doors. + - image: Replaced or added alot of new tiles types, including a whole batch of autosmoothing + carpets. + - map: Westfield Mall. A new lowpop map for testing and to tide over new servers. + - bugfix: Lighting objects like candles and paramedic pens should now have onfloors/no + error sprites. + - code_imp: Converts most lock ids to defines. +2025-12-30: + chazzyjazzy: + - code_imp: readds Thaumaturgy Paths, Endron NPCs, and a few missing maptypes diff --git a/html/changelogs/archive/2026-01.yml b/html/changelogs/archive/2026-01.yml new file mode 100644 index 000000000000..b8c444e29e8d --- /dev/null +++ b/html/changelogs/archive/2026-01.yml @@ -0,0 +1,60 @@ +2026-01-04: + FalloutFalcon: + - admin: admin matrixing a mob now has a prompt to confirm +2026-01-05: + FalloutFalcon: + - rscadd: Adds Oni and Devil gargoyle horns from TFN + dwinters99: + - rscadd: 'Garou Nation jobs: Councillor, Warder, Truthcatcher, Wyrmfoe, Guardian' + - rscadd: 'Pentex jobs: Branch Lead, Executive, Internal Affairs Agent, Security + Chief, Security Agent, Employee' + - code_imp: Defines for all the pentex subsidiaries and a lot of bloodlines ones + while i'm there +2026-01-08: + Beautiful TG coders: + - code_imp: TG Pull. Thank you TG. + FalloutFalcon: + - rscadd: readds illegal identity + - qol: passports, flashlights, and watches moved to loadouts + - qol: you can now take up to 6 pocket items + - rscadd: Bank pin is now found in the memories section similar to bank ID number + - bugfix: You can now tell you killed a raven or crow because it flips on its back +2026-01-12: + XeonMations: + - rscadd: Added old mail to the game + - code_imp: Ticked a bunch of files. +2026-01-13: + TheCarnalest: + - refactor: A sane framework for splats has been set up, and Kindred and Ghouls + have had their code swapped out entirely. +2026-01-14: + FalloutFalcon: + - bugfix: No greek syllable names from random gen + - rscadd: readds a few items to retail stores + - bugfix: fixes some bad retail store prices + buffyuwu: + - rscadd: adds dementation + chazzyjazzy: + - code_imp: reimplements dominate + - rscadd: '''mask of a thousand faces'' now works as intended' + - code_imp: reimplemented obfuscate + - code_imp: reimplements presence +2026-01-15: + FalloutFalcon: + - bugfix: keys are now treated as plural items + buffyuwu: + - rscadd: ports derangement quirk, basic malk hallucinations from bloodlines + chazzyjazzy: + - bugfix: fixed spellbook logic to match splat rework + - code_imp: quietus + dwinters99: + - code_imp: two additional levels of fog density added to effects.dm + - map: lots of updatepath fixes +2026-01-16: + FalloutFalcon: + - map: gave anarchs, cammies, and police, radio tranceivers on Westfield Mall + - bugfix: Platforms/low-walls now layer under tables again + chazzyjazzy: + - bugfix: ' the last tfn updatepaths' + dwinters99: + - sound: pause menu sounds from bloodlines diff --git a/icons/area/areas_misc.dmi b/icons/area/areas_misc.dmi index 218db925741c..0e60c0ed658e 100644 Binary files a/icons/area/areas_misc.dmi and b/icons/area/areas_misc.dmi differ diff --git a/icons/effects/160x160.dmi b/icons/effects/160x160.dmi index a63c813149b4..09da69cd4a6e 100644 Binary files a/icons/effects/160x160.dmi and b/icons/effects/160x160.dmi differ diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index 9915bcf238dc..a4a9bbb8443d 100644 Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ diff --git a/icons/effects/beam96x96.dmi b/icons/effects/beam96x96.dmi new file mode 100644 index 000000000000..fc3849ff99ab Binary files /dev/null and b/icons/effects/beam96x96.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 38d01c3076c8..23560e411eae 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/landmarks_static.dmi b/icons/effects/landmarks_static.dmi index ce7b1e53cf0e..134c62cdd21b 100644 Binary files a/icons/effects/landmarks_static.dmi and b/icons/effects/landmarks_static.dmi differ diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index cb5ff8f905d0..d7ee50ebe8d8 100644 Binary files a/icons/effects/mapping_helpers.dmi and b/icons/effects/mapping_helpers.dmi differ diff --git a/icons/effects/random_spawners.dmi b/icons/effects/random_spawners.dmi index e75aa4aaa767..525f99a6a7ce 100644 Binary files a/icons/effects/random_spawners.dmi and b/icons/effects/random_spawners.dmi differ diff --git a/icons/hud/escape_menu_icons.dmi b/icons/hud/escape_menu_icons.dmi index 8f848aa25e40..a6c24f082ab2 100644 Binary files a/icons/hud/escape_menu_icons.dmi and b/icons/hud/escape_menu_icons.dmi differ diff --git a/icons/hud/moon_health_64x64.dmi b/icons/hud/moon_health_64x64.dmi new file mode 100644 index 000000000000..d8faec1b7df9 Binary files /dev/null and b/icons/hud/moon_health_64x64.dmi differ diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 58aa910cb224..baf181778b72 100644 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/icons/hud/screen_full.dmi b/icons/hud/screen_full.dmi index be4571638b10..f507bd754fd9 100644 Binary files a/icons/hud/screen_full.dmi and b/icons/hud/screen_full.dmi differ diff --git a/icons/hud/screen_gen.dmi b/icons/hud/screen_gen.dmi index da7cba814874..d410fa2e44ff 100644 Binary files a/icons/hud/screen_gen.dmi and b/icons/hud/screen_gen.dmi differ diff --git a/icons/hud/screen_ghost.dmi b/icons/hud/screen_ghost.dmi index 44c04566ed1c..e193198d2f55 100644 Binary files a/icons/hud/screen_ghost.dmi and b/icons/hud/screen_ghost.dmi differ diff --git a/icons/hud/screen_voidwalker.dmi b/icons/hud/screen_voidwalker.dmi index 68a625786d3c..7eb522053be1 100644 Binary files a/icons/hud/screen_voidwalker.dmi and b/icons/hud/screen_voidwalker.dmi differ diff --git a/icons/map_icons/clothing/head/_head.dmi b/icons/map_icons/clothing/head/_head.dmi index d0a44a1a796f..3db9a6d9d769 100644 Binary files a/icons/map_icons/clothing/head/_head.dmi and b/icons/map_icons/clothing/head/_head.dmi differ diff --git a/icons/map_icons/clothing/head/beret.dmi b/icons/map_icons/clothing/head/beret.dmi index 975bbf80cf2c..684f7aaa2afb 100644 Binary files a/icons/map_icons/clothing/head/beret.dmi and b/icons/map_icons/clothing/head/beret.dmi differ diff --git a/icons/map_icons/clothing/neck.dmi b/icons/map_icons/clothing/neck.dmi index a477d15da68c..9adba4c1e50a 100644 Binary files a/icons/map_icons/clothing/neck.dmi and b/icons/map_icons/clothing/neck.dmi differ diff --git a/icons/map_icons/items/_item.dmi b/icons/map_icons/items/_item.dmi index c81bfa7d4f4c..f4aec3e61db9 100644 Binary files a/icons/map_icons/items/_item.dmi and b/icons/map_icons/items/_item.dmi differ diff --git a/icons/mob/actions/actions_animal.dmi b/icons/mob/actions/actions_animal.dmi index b0b58b463f54..fa6d350e7b47 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_ecult.dmi b/icons/mob/actions/actions_ecult.dmi index 9710dfd3f505..d808f6dd0a91 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_items.dmi b/icons/mob/actions/actions_items.dmi index af2400408b01..348fa6e15f4a 100644 Binary files a/icons/mob/actions/actions_items.dmi and b/icons/mob/actions/actions_items.dmi differ diff --git a/icons/mob/actions/actions_voidwalker.dmi b/icons/mob/actions/actions_voidwalker.dmi index fd0825994d08..8e6dd16bb49f 100644 Binary files a/icons/mob/actions/actions_voidwalker.dmi and b/icons/mob/actions/actions_voidwalker.dmi differ diff --git a/icons/mob/actions/backgrounds.dmi b/icons/mob/actions/backgrounds.dmi index e937c49c4a9f..ecbda704fe12 100644 Binary files a/icons/mob/actions/backgrounds.dmi and b/icons/mob/actions/backgrounds.dmi differ diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index 0f43a1b28507..b2dd87062d90 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 afab07d9f13b..b0ba9a13fe02 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/back/pets_back.dmi b/icons/mob/clothing/back/pets_back.dmi new file mode 100644 index 000000000000..b65c53cf369f Binary files /dev/null and b/icons/mob/clothing/back/pets_back.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index b1d374ae7a76..bb070ab3bfe3 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 1add3b190769..0ee693af8937 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 92b155f62d54..ddefc4621656 100644 Binary files a/icons/mob/clothing/eyes.dmi and b/icons/mob/clothing/eyes.dmi differ diff --git a/icons/mob/clothing/head/bio.dmi b/icons/mob/clothing/head/bio.dmi index d62ccd4a182a..267e03170646 100644 Binary files a/icons/mob/clothing/head/bio.dmi and b/icons/mob/clothing/head/bio.dmi differ diff --git a/icons/mob/clothing/head/chaplain.dmi b/icons/mob/clothing/head/chaplain.dmi index 100b7ee922fb..2929fdfe89a7 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 142319bbf81d..4c8b6de70f4d 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 7d603fed0fa3..712dbad93e6c 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 9c7389788cee..0b5cb4372098 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/winterhood.dmi b/icons/mob/clothing/head/winterhood.dmi index 41a4356b1885..3b28fe1c0a57 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 ed570225bdc1..0a8c375c1913 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 9a631a2352e9..f7eaab9f9f40 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/neck.dmi b/icons/mob/clothing/neck.dmi index 91424a70486e..a44781036a0f 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 017064115946..4a84c7e1281b 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/bio.dmi b/icons/mob/clothing/suits/bio.dmi index b2d1359ba835..fab2e11d7dd2 100644 Binary files a/icons/mob/clothing/suits/bio.dmi and b/icons/mob/clothing/suits/bio.dmi differ diff --git a/icons/mob/clothing/suits/chaplain.dmi b/icons/mob/clothing/suits/chaplain.dmi index 8806bf5f679b..76c022071a61 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/wintercoat.dmi b/icons/mob/clothing/suits/wintercoat.dmi index 921e3991846f..ee3e3046d289 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/captain.dmi b/icons/mob/clothing/under/captain.dmi index 4a6a2f337a1e..49de8ab784ed 100644 Binary files a/icons/mob/clothing/under/captain.dmi and b/icons/mob/clothing/under/captain.dmi differ diff --git a/icons/mob/clothing/under/civilian.dmi b/icons/mob/clothing/under/civilian.dmi index 63788c8d1ed1..0aeebe27c32c 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 cb3aa9935712..7d19612486c9 100644 Binary files a/icons/mob/clothing/under/costume.dmi and b/icons/mob/clothing/under/costume.dmi differ diff --git a/icons/mob/effects/heretic_aura.dmi b/icons/mob/effects/heretic_aura.dmi new file mode 100644 index 000000000000..7b5b93ca2364 Binary files /dev/null and b/icons/mob/effects/heretic_aura.dmi differ diff --git a/icons/mob/huds/hud.dmi b/icons/mob/huds/hud.dmi index 53dd33a4544f..0fb0e7969135 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 index 1c6b8be677eb..bbd7c95cc02f 100644 Binary files a/icons/mob/human/bodyparts.dmi and b/icons/mob/human/bodyparts.dmi differ diff --git a/icons/mob/human/bodyparts_greyscale.dmi b/icons/mob/human/bodyparts_greyscale.dmi index d700049f49a8..0b25bc980490 100644 Binary files a/icons/mob/human/bodyparts_greyscale.dmi and b/icons/mob/human/bodyparts_greyscale.dmi differ diff --git a/icons/mob/human/cat_features.dmi b/icons/mob/human/cat_features.dmi index 6e7fd024fee1..f0a9427f2e61 100644 Binary files a/icons/mob/human/cat_features.dmi and b/icons/mob/human/cat_features.dmi differ diff --git a/icons/mob/human/human_eyes.dmi b/icons/mob/human/human_eyes.dmi new file mode 100644 index 000000000000..1ed4e37917af Binary files /dev/null and b/icons/mob/human/human_eyes.dmi differ diff --git a/icons/mob/human/human_face.dmi b/icons/mob/human/human_face.dmi index 23e58bcb0c35..6b5d57bcbbb9 100644 Binary files a/icons/mob/human/human_face.dmi and b/icons/mob/human/human_face.dmi differ diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi index 1e880ce0bf7f..25b5feddc227 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 1f653793710d..f3a9caa91834 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/clothing/glasses_lefthand.dmi b/icons/mob/inhands/clothing/glasses_lefthand.dmi index 6d44e7215e48..edb65af1512c 100644 Binary files a/icons/mob/inhands/clothing/glasses_lefthand.dmi and b/icons/mob/inhands/clothing/glasses_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing/glasses_righthand.dmi b/icons/mob/inhands/clothing/glasses_righthand.dmi index 89248cf2b5d6..a8d11608406a 100644 Binary files a/icons/mob/inhands/clothing/glasses_righthand.dmi and b/icons/mob/inhands/clothing/glasses_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/belt_lefthand.dmi b/icons/mob/inhands/equipment/belt_lefthand.dmi index e4f8d4bd397e..7675b73543b5 100644 Binary files a/icons/mob/inhands/equipment/belt_lefthand.dmi and b/icons/mob/inhands/equipment/belt_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/belt_righthand.dmi b/icons/mob/inhands/equipment/belt_righthand.dmi index 248776ad5935..c1cb44abf4a7 100644 Binary files a/icons/mob/inhands/equipment/belt_righthand.dmi and b/icons/mob/inhands/equipment/belt_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/hydroponics_lefthand.dmi b/icons/mob/inhands/equipment/hydroponics_lefthand.dmi index 5f771404f263..2d69140c07d1 100644 Binary files a/icons/mob/inhands/equipment/hydroponics_lefthand.dmi and b/icons/mob/inhands/equipment/hydroponics_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/hydroponics_righthand.dmi b/icons/mob/inhands/equipment/hydroponics_righthand.dmi index 11b919520327..a288a5c6aa17 100644 Binary files a/icons/mob/inhands/equipment/hydroponics_righthand.dmi and b/icons/mob/inhands/equipment/hydroponics_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi index 7fb4ab7bd95d..c8936fde8da7 100644 Binary files a/icons/mob/inhands/equipment/tools_lefthand.dmi and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi index 91aae9fe34f0..192413a739f6 100644 Binary files a/icons/mob/inhands/equipment/tools_righthand.dmi and b/icons/mob/inhands/equipment/tools_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 0a0813ee8c2e..67e10ca1b74f 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 9d1538bf5765..7bf549f2bde7 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi index 236df169bdde..4403cfedf067 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 e82b236027c3..e2fcfc124d94 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/polearms_lefthand.dmi b/icons/mob/inhands/weapons/polearms_lefthand.dmi index 749de0cfca6b..a882482331f2 100644 Binary files a/icons/mob/inhands/weapons/polearms_lefthand.dmi and b/icons/mob/inhands/weapons/polearms_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/polearms_righthand.dmi b/icons/mob/inhands/weapons/polearms_righthand.dmi index df595538cc3e..985e1188932b 100644 Binary files a/icons/mob/inhands/weapons/polearms_righthand.dmi and b/icons/mob/inhands/weapons/polearms_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi index 3e31f2718574..77a2d603d9cd 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 58884a25e54c..8848cdce9eb5 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/mob/landmarks.dmi b/icons/mob/landmarks.dmi index 7d1253b14934..9a0b54af275d 100644 Binary files a/icons/mob/landmarks.dmi and b/icons/mob/landmarks.dmi differ diff --git a/icons/mob/rideables/mech_construction.dmi b/icons/mob/rideables/mech_construction.dmi index f26dbe17fd03..bee082ad6f91 100644 Binary files a/icons/mob/rideables/mech_construction.dmi and b/icons/mob/rideables/mech_construction.dmi differ diff --git a/icons/mob/silicon/ai.dmi b/icons/mob/silicon/ai.dmi index df9059fb09e6..be9060ecd554 100644 Binary files a/icons/mob/silicon/ai.dmi and b/icons/mob/silicon/ai.dmi differ diff --git a/icons/mob/simple/lavaland/raptor_baby.dmi b/icons/mob/simple/lavaland/raptor_baby.dmi index f892a3cb84fa..861ea55efd42 100644 Binary files a/icons/mob/simple/lavaland/raptor_baby.dmi and b/icons/mob/simple/lavaland/raptor_baby.dmi differ diff --git a/icons/mob/simple/lavaland/raptor_big.dmi b/icons/mob/simple/lavaland/raptor_big.dmi index 2a89d84c85e3..4e4932f91a4a 100644 Binary files a/icons/mob/simple/lavaland/raptor_big.dmi and b/icons/mob/simple/lavaland/raptor_big.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 6e9c45ff112c..39e8daa97425 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 cf5ee1475a9a..d6c9d9723ad4 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 97f692551f9e..ab68f037e15b 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/icons/obj/clothing/head/bio.dmi b/icons/obj/clothing/head/bio.dmi index 980cb717143e..0385cbeaf18f 100644 Binary files a/icons/obj/clothing/head/bio.dmi and b/icons/obj/clothing/head/bio.dmi differ diff --git a/icons/obj/clothing/head/chaplain.dmi b/icons/obj/clothing/head/chaplain.dmi index ed6f6248b317..d653fced198d 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 e1a6c39a91df..d09a9c94170f 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 70872619f9b9..b30c0c81ace0 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 a9aaad49000c..804eb6cb52ba 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/winterhood.dmi b/icons/obj/clothing/head/winterhood.dmi index 2fe960c5b8b7..1ad9f6eca016 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 026b6d494ead..a2dac17cc8b3 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 160606c790af..7caec6da24af 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_construction.dmi b/icons/obj/clothing/modsuit/mod_construction.dmi index 054fafdc12e2..c8f1a2f4960a 100644 Binary files a/icons/obj/clothing/modsuit/mod_construction.dmi and b/icons/obj/clothing/modsuit/mod_construction.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index c0a6103d3fe2..0cd210d85da6 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 3a1bd3d2ccff..0b19dff85b00 100644 Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ diff --git a/icons/obj/clothing/suits/armor.dmi b/icons/obj/clothing/suits/armor.dmi index 6f55ddc1a933..2a8594c7b20d 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/bio.dmi b/icons/obj/clothing/suits/bio.dmi index 81d1a85a6fdc..0997e42496b9 100644 Binary files a/icons/obj/clothing/suits/bio.dmi and b/icons/obj/clothing/suits/bio.dmi differ diff --git a/icons/obj/clothing/suits/chaplain.dmi b/icons/obj/clothing/suits/chaplain.dmi index 730e47cd6fa9..a33a458ddce2 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/wintercoat.dmi b/icons/obj/clothing/suits/wintercoat.dmi index a70b4eb6cbe9..3f8e1bc38351 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/captain.dmi b/icons/obj/clothing/under/captain.dmi index 836abad6f2f6..335ce7332530 100644 Binary files a/icons/obj/clothing/under/captain.dmi and b/icons/obj/clothing/under/captain.dmi differ diff --git a/icons/obj/clothing/under/civilian.dmi b/icons/obj/clothing/under/civilian.dmi index 8f7c28ca0474..572263d90851 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 a2e571532380..e4a53a3979a1 100644 Binary files a/icons/obj/clothing/under/costume.dmi and b/icons/obj/clothing/under/costume.dmi differ diff --git a/icons/obj/devices/new_assemblies.dmi b/icons/obj/devices/new_assemblies.dmi index f80f89ce20a0..55ac60442c86 100644 Binary files a/icons/obj/devices/new_assemblies.dmi and b/icons/obj/devices/new_assemblies.dmi differ diff --git a/icons/obj/devices/tracker.dmi b/icons/obj/devices/tracker.dmi index fd6c7edd997d..a5047a4f23c5 100644 Binary files a/icons/obj/devices/tracker.dmi and b/icons/obj/devices/tracker.dmi differ diff --git a/icons/obj/drinks/colo.dmi b/icons/obj/drinks/colo.dmi index e25c7272bfe8..33a583672c3c 100644 Binary files a/icons/obj/drinks/colo.dmi and b/icons/obj/drinks/colo.dmi differ diff --git a/icons/obj/fishing.dmi b/icons/obj/fishing.dmi index 189b27873aa7..a4a40d5a3b65 100644 Binary files a/icons/obj/fishing.dmi and b/icons/obj/fishing.dmi differ diff --git a/icons/obj/food/martian.dmi b/icons/obj/food/martian.dmi index 829cf421cfb5..fb5528818a19 100644 Binary files a/icons/obj/food/martian.dmi and b/icons/obj/food/martian.dmi differ diff --git a/icons/obj/food/moth.dmi b/icons/obj/food/moth.dmi index e3df78e65e61..170d7bc2bc05 100644 Binary files a/icons/obj/food/moth.dmi and b/icons/obj/food/moth.dmi differ diff --git a/icons/obj/food/soupsalad.dmi b/icons/obj/food/soupsalad.dmi index 60fd78017786..21f07037540d 100644 Binary files a/icons/obj/food/soupsalad.dmi and b/icons/obj/food/soupsalad.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 4d5ec8328270..0ae2702417c0 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/machines/cell_charger.dmi b/icons/obj/machines/cell_charger.dmi index 4644f5387b66..c271db650f4f 100644 Binary files a/icons/obj/machines/cell_charger.dmi and b/icons/obj/machines/cell_charger.dmi differ diff --git a/icons/obj/machines/engine/singularity.dmi b/icons/obj/machines/engine/singularity.dmi index 59b8d2364848..90a5a355a7b5 100644 Binary files a/icons/obj/machines/engine/singularity.dmi and b/icons/obj/machines/engine/singularity.dmi differ diff --git a/icons/obj/machines/status_display.dmi b/icons/obj/machines/status_display.dmi index 98f786278239..33cff692557b 100644 Binary files a/icons/obj/machines/status_display.dmi and b/icons/obj/machines/status_display.dmi differ diff --git a/icons/obj/machines/turret_control.dmi b/icons/obj/machines/turret_control.dmi index 1ed14c0d2d4a..fb3d3ac458e7 100644 Binary files a/icons/obj/machines/turret_control.dmi and b/icons/obj/machines/turret_control.dmi differ diff --git a/icons/obj/medical/chemical.dmi b/icons/obj/medical/chemical.dmi index a7e9cfa48c2a..0bc3c3fd0751 100644 Binary files a/icons/obj/medical/chemical.dmi and b/icons/obj/medical/chemical.dmi differ diff --git a/icons/obj/medical/defib.dmi b/icons/obj/medical/defib.dmi index 1e707f529ce9..74ad889d4e18 100644 Binary files a/icons/obj/medical/defib.dmi and b/icons/obj/medical/defib.dmi differ diff --git a/icons/obj/medical/organs/organs.dmi b/icons/obj/medical/organs/organs.dmi index cadfac4b9928..6197442f6227 100644 Binary files a/icons/obj/medical/organs/organs.dmi and b/icons/obj/medical/organs/organs.dmi differ diff --git a/icons/obj/ore.dmi b/icons/obj/ore.dmi index 5346161a9e7b..81a7cb03fdf2 100644 Binary files a/icons/obj/ore.dmi and b/icons/obj/ore.dmi differ diff --git a/icons/obj/pipes_n_cables/atmos.dmi b/icons/obj/pipes_n_cables/atmos.dmi index fc67ff54158f..e7401411a290 100644 Binary files a/icons/obj/pipes_n_cables/atmos.dmi and b/icons/obj/pipes_n_cables/atmos.dmi differ diff --git a/icons/obj/poster.dmi b/icons/obj/poster.dmi index 0ba8b30a047d..2aa9eb0f4dde 100644 Binary files a/icons/obj/poster.dmi and b/icons/obj/poster.dmi differ diff --git a/icons/obj/service/hydroponics/equipment.dmi b/icons/obj/service/hydroponics/equipment.dmi index 73166cd179d9..24a8d7bc5f93 100644 Binary files a/icons/obj/service/hydroponics/equipment.dmi and b/icons/obj/service/hydroponics/equipment.dmi differ diff --git a/icons/obj/signs.dmi b/icons/obj/signs.dmi index cb0199b19b08..18861e869777 100644 Binary files a/icons/obj/signs.dmi and b/icons/obj/signs.dmi differ diff --git a/icons/obj/smooth_structures/beigetop_table.dmi b/icons/obj/smooth_structures/beigetop_table.dmi new file mode 100644 index 000000000000..f6ebba7aec58 Binary files /dev/null and b/icons/obj/smooth_structures/beigetop_table.dmi differ diff --git a/icons/obj/smooth_structures/beigetop_table.png b/icons/obj/smooth_structures/beigetop_table.png new file mode 100644 index 000000000000..3edaa5203c77 Binary files /dev/null and b/icons/obj/smooth_structures/beigetop_table.png differ diff --git a/icons/obj/smooth_structures/beigetop_table.png.toml b/icons/obj/smooth_structures/beigetop_table.png.toml new file mode 100644 index 000000000000..37488dc48d5e --- /dev/null +++ b/icons/obj/smooth_structures/beigetop_table.png.toml @@ -0,0 +1,2 @@ +output_name = "beigetop_table" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/blacktop_table.dmi b/icons/obj/smooth_structures/blacktop_table.dmi new file mode 100644 index 000000000000..6a052b6258c8 Binary files /dev/null and b/icons/obj/smooth_structures/blacktop_table.dmi differ diff --git a/icons/obj/smooth_structures/blacktop_table.png b/icons/obj/smooth_structures/blacktop_table.png new file mode 100644 index 000000000000..06235a0a91af Binary files /dev/null and b/icons/obj/smooth_structures/blacktop_table.png differ diff --git a/icons/obj/smooth_structures/blacktop_table.png.toml b/icons/obj/smooth_structures/blacktop_table.png.toml new file mode 100644 index 000000000000..626139c1feff --- /dev/null +++ b/icons/obj/smooth_structures/blacktop_table.png.toml @@ -0,0 +1,2 @@ +output_name = "blacktop_table" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/boulder_platform.dmi b/icons/obj/smooth_structures/boulder_platform.dmi new file mode 100644 index 000000000000..34c99f2dd5ce Binary files /dev/null and b/icons/obj/smooth_structures/boulder_platform.dmi differ diff --git a/icons/obj/smooth_structures/boulder_platform.png b/icons/obj/smooth_structures/boulder_platform.png new file mode 100644 index 000000000000..ac31e2b79bef Binary files /dev/null and b/icons/obj/smooth_structures/boulder_platform.png differ diff --git a/icons/obj/smooth_structures/boulder_platform.png.toml b/icons/obj/smooth_structures/boulder_platform.png.toml new file mode 100644 index 000000000000..9bc68fe5cd59 --- /dev/null +++ b/icons/obj/smooth_structures/boulder_platform.png.toml @@ -0,0 +1,2 @@ +output_name = "boulder_platform" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/darkpack/catwalk_borderless.dmi b/icons/obj/smooth_structures/darkpack/catwalk_borderless.dmi new file mode 100644 index 000000000000..724b18703d17 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/catwalk_borderless.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/catwalk_borderless.png b/icons/obj/smooth_structures/darkpack/catwalk_borderless.png new file mode 100644 index 000000000000..87c34749dfd5 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/catwalk_borderless.png differ diff --git a/icons/obj/smooth_structures/darkpack/catwalk_borderless.png.toml b/icons/obj/smooth_structures/darkpack/catwalk_borderless.png.toml new file mode 100644 index 000000000000..42610e2043b1 --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/catwalk_borderless.png.toml @@ -0,0 +1,2 @@ +output_name = "catwalk" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/darkpack/catwalk_pentex.dmi b/icons/obj/smooth_structures/darkpack/catwalk_pentex.dmi new file mode 100644 index 000000000000..a1a3a42ecf61 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/catwalk_pentex.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/catwalk_pentex.png b/icons/obj/smooth_structures/darkpack/catwalk_pentex.png new file mode 100644 index 000000000000..66ffc262a4dc Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/catwalk_pentex.png differ diff --git a/icons/obj/smooth_structures/darkpack/catwalk_pentex.png.toml b/icons/obj/smooth_structures/darkpack/catwalk_pentex.png.toml new file mode 100644 index 000000000000..63e711fce313 --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/catwalk_pentex.png.toml @@ -0,0 +1,2 @@ +output_name = "lattice" +template = "bitmask/diagonal_32x32.toml" diff --git a/modular_darkpack/modules/deprecated/icons/pentexcatwalk.dmi b/icons/obj/smooth_structures/darkpack/catwalk_pentex_opaque.dmi similarity index 100% rename from modular_darkpack/modules/deprecated/icons/pentexcatwalk.dmi rename to icons/obj/smooth_structures/darkpack/catwalk_pentex_opaque.dmi diff --git a/icons/obj/smooth_structures/darkpack/floor/beach.dmi b/icons/obj/smooth_structures/darkpack/floor/beach.dmi new file mode 100644 index 000000000000..c56ce322ee70 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/floor/beach.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/floor/beach.png b/icons/obj/smooth_structures/darkpack/floor/beach.png new file mode 100644 index 000000000000..40698b285100 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/floor/beach.png differ diff --git a/icons/obj/smooth_structures/darkpack/floor/beach.png.toml b/icons/obj/smooth_structures/darkpack/floor/beach.png.toml new file mode 100644 index 000000000000..ab5a59106d3e --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/floor/beach.png.toml @@ -0,0 +1,14 @@ +output_name = "beach" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 50 +y = 50 + +[output_icon_size] +x = 50 +y = 50 + +[cut_pos] +x = 25 +y = 25 diff --git a/modular_zapoc/modules/carpets/icons/blackgoldcarpet.dmi b/icons/obj/smooth_structures/darkpack/floor/carpet/blackgoldcarpet.dmi similarity index 100% rename from modular_zapoc/modules/carpets/icons/blackgoldcarpet.dmi rename to icons/obj/smooth_structures/darkpack/floor/carpet/blackgoldcarpet.dmi diff --git a/modular_zapoc/modules/carpets/icons/blackgoldcarpet.png b/icons/obj/smooth_structures/darkpack/floor/carpet/blackgoldcarpet.png similarity index 100% rename from modular_zapoc/modules/carpets/icons/blackgoldcarpet.png rename to icons/obj/smooth_structures/darkpack/floor/carpet/blackgoldcarpet.png diff --git a/modular_zapoc/modules/carpets/icons/blackgoldcarpet.png.toml b/icons/obj/smooth_structures/darkpack/floor/carpet/blackgoldcarpet.png.toml similarity index 100% rename from modular_zapoc/modules/carpets/icons/blackgoldcarpet.png.toml rename to icons/obj/smooth_structures/darkpack/floor/carpet/blackgoldcarpet.png.toml diff --git a/modular_zapoc/modules/carpets/icons/blacksilvercarpet.dmi b/icons/obj/smooth_structures/darkpack/floor/carpet/blacksilvercarpet.dmi similarity index 100% rename from modular_zapoc/modules/carpets/icons/blacksilvercarpet.dmi rename to icons/obj/smooth_structures/darkpack/floor/carpet/blacksilvercarpet.dmi diff --git a/modular_zapoc/modules/carpets/icons/blacksilvercarpet.png b/icons/obj/smooth_structures/darkpack/floor/carpet/blacksilvercarpet.png similarity index 100% rename from modular_zapoc/modules/carpets/icons/blacksilvercarpet.png rename to icons/obj/smooth_structures/darkpack/floor/carpet/blacksilvercarpet.png diff --git a/modular_zapoc/modules/carpets/icons/blacksilvercarpet.png.toml b/icons/obj/smooth_structures/darkpack/floor/carpet/blacksilvercarpet.png.toml similarity index 100% rename from modular_zapoc/modules/carpets/icons/blacksilvercarpet.png.toml rename to icons/obj/smooth_structures/darkpack/floor/carpet/blacksilvercarpet.png.toml diff --git a/icons/obj/smooth_structures/darkpack/floor/carpet/bluegoldcarpet.dmi b/icons/obj/smooth_structures/darkpack/floor/carpet/bluegoldcarpet.dmi new file mode 100644 index 000000000000..e6488faa249b Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/floor/carpet/bluegoldcarpet.dmi differ diff --git a/modular_zapoc/modules/carpets/icons/bluegoldcarpet.png b/icons/obj/smooth_structures/darkpack/floor/carpet/bluegoldcarpet.png similarity index 100% rename from modular_zapoc/modules/carpets/icons/bluegoldcarpet.png rename to icons/obj/smooth_structures/darkpack/floor/carpet/bluegoldcarpet.png diff --git a/icons/obj/smooth_structures/darkpack/floor/carpet/bluegoldcarpet.png.toml b/icons/obj/smooth_structures/darkpack/floor/carpet/bluegoldcarpet.png.toml new file mode 100644 index 000000000000..38eb7e85d68e --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/floor/carpet/bluegoldcarpet.png.toml @@ -0,0 +1,2 @@ +output_name = "bluegoldcarpet" +template = "bitmask/diagonal_32x32.toml" diff --git a/modular_zapoc/modules/carpets/icons/bluesilvercarpet.dmi b/icons/obj/smooth_structures/darkpack/floor/carpet/bluesilvercarpet.dmi similarity index 100% rename from modular_zapoc/modules/carpets/icons/bluesilvercarpet.dmi rename to icons/obj/smooth_structures/darkpack/floor/carpet/bluesilvercarpet.dmi diff --git a/modular_zapoc/modules/carpets/icons/bluesilvercarpet.png b/icons/obj/smooth_structures/darkpack/floor/carpet/bluesilvercarpet.png similarity index 100% rename from modular_zapoc/modules/carpets/icons/bluesilvercarpet.png rename to icons/obj/smooth_structures/darkpack/floor/carpet/bluesilvercarpet.png diff --git a/modular_zapoc/modules/carpets/icons/bluesilvercarpet.png.toml b/icons/obj/smooth_structures/darkpack/floor/carpet/bluesilvercarpet.png.toml similarity index 100% rename from modular_zapoc/modules/carpets/icons/bluesilvercarpet.png.toml rename to icons/obj/smooth_structures/darkpack/floor/carpet/bluesilvercarpet.png.toml diff --git a/modular_zapoc/modules/carpets/icons/cyancarpet.dmi b/icons/obj/smooth_structures/darkpack/floor/carpet/cyancarpet.dmi similarity index 100% rename from modular_zapoc/modules/carpets/icons/cyancarpet.dmi rename to icons/obj/smooth_structures/darkpack/floor/carpet/cyancarpet.dmi diff --git a/modular_zapoc/modules/carpets/icons/cyancarpet.png b/icons/obj/smooth_structures/darkpack/floor/carpet/cyancarpet.png similarity index 100% rename from modular_zapoc/modules/carpets/icons/cyancarpet.png rename to icons/obj/smooth_structures/darkpack/floor/carpet/cyancarpet.png diff --git a/modular_zapoc/modules/carpets/icons/cyancarpet.png.toml b/icons/obj/smooth_structures/darkpack/floor/carpet/cyancarpet.png.toml similarity index 100% rename from modular_zapoc/modules/carpets/icons/cyancarpet.png.toml rename to icons/obj/smooth_structures/darkpack/floor/carpet/cyancarpet.png.toml diff --git a/modular_zapoc/modules/carpets/icons/greengoldcarpet.dmi b/icons/obj/smooth_structures/darkpack/floor/carpet/greengoldcarpet.dmi similarity index 100% rename from modular_zapoc/modules/carpets/icons/greengoldcarpet.dmi rename to icons/obj/smooth_structures/darkpack/floor/carpet/greengoldcarpet.dmi diff --git a/modular_zapoc/modules/carpets/icons/greengoldcarpet.png b/icons/obj/smooth_structures/darkpack/floor/carpet/greengoldcarpet.png similarity index 100% rename from modular_zapoc/modules/carpets/icons/greengoldcarpet.png rename to icons/obj/smooth_structures/darkpack/floor/carpet/greengoldcarpet.png diff --git a/modular_zapoc/modules/carpets/icons/greengoldcarpet.png.toml b/icons/obj/smooth_structures/darkpack/floor/carpet/greengoldcarpet.png.toml similarity index 100% rename from modular_zapoc/modules/carpets/icons/greengoldcarpet.png.toml rename to icons/obj/smooth_structures/darkpack/floor/carpet/greengoldcarpet.png.toml diff --git a/modular_zapoc/modules/carpets/icons/orangehotelcarpet.dmi b/icons/obj/smooth_structures/darkpack/floor/carpet/orangehotelcarpet.dmi similarity index 100% rename from modular_zapoc/modules/carpets/icons/orangehotelcarpet.dmi rename to icons/obj/smooth_structures/darkpack/floor/carpet/orangehotelcarpet.dmi diff --git a/modular_zapoc/modules/carpets/icons/orangehotelcarpet.png b/icons/obj/smooth_structures/darkpack/floor/carpet/orangehotelcarpet.png similarity index 100% rename from modular_zapoc/modules/carpets/icons/orangehotelcarpet.png rename to icons/obj/smooth_structures/darkpack/floor/carpet/orangehotelcarpet.png diff --git a/modular_zapoc/modules/carpets/icons/orangehotelcarpet.png.toml b/icons/obj/smooth_structures/darkpack/floor/carpet/orangehotelcarpet.png.toml similarity index 100% rename from modular_zapoc/modules/carpets/icons/orangehotelcarpet.png.toml rename to icons/obj/smooth_structures/darkpack/floor/carpet/orangehotelcarpet.png.toml diff --git a/modular_zapoc/modules/carpets/icons/orangesilvercarpet.dmi b/icons/obj/smooth_structures/darkpack/floor/carpet/orangesilvercarpet.dmi similarity index 100% rename from modular_zapoc/modules/carpets/icons/orangesilvercarpet.dmi rename to icons/obj/smooth_structures/darkpack/floor/carpet/orangesilvercarpet.dmi diff --git a/modular_zapoc/modules/carpets/icons/orangesilvercarpet.png b/icons/obj/smooth_structures/darkpack/floor/carpet/orangesilvercarpet.png similarity index 100% rename from modular_zapoc/modules/carpets/icons/orangesilvercarpet.png rename to icons/obj/smooth_structures/darkpack/floor/carpet/orangesilvercarpet.png diff --git a/modular_zapoc/modules/carpets/icons/orangesilvercarpet.png.toml b/icons/obj/smooth_structures/darkpack/floor/carpet/orangesilvercarpet.png.toml similarity index 100% rename from modular_zapoc/modules/carpets/icons/orangesilvercarpet.png.toml rename to icons/obj/smooth_structures/darkpack/floor/carpet/orangesilvercarpet.png.toml diff --git a/modular_zapoc/modules/carpets/icons/purplegoldcarpet.dmi b/icons/obj/smooth_structures/darkpack/floor/carpet/purplegoldcarpet.dmi similarity index 100% rename from modular_zapoc/modules/carpets/icons/purplegoldcarpet.dmi rename to icons/obj/smooth_structures/darkpack/floor/carpet/purplegoldcarpet.dmi diff --git a/modular_zapoc/modules/carpets/icons/purplegoldcarpet.png b/icons/obj/smooth_structures/darkpack/floor/carpet/purplegoldcarpet.png similarity index 100% rename from modular_zapoc/modules/carpets/icons/purplegoldcarpet.png rename to icons/obj/smooth_structures/darkpack/floor/carpet/purplegoldcarpet.png diff --git a/modular_zapoc/modules/carpets/icons/purplegoldcarpet.png.toml b/icons/obj/smooth_structures/darkpack/floor/carpet/purplegoldcarpet.png.toml similarity index 100% rename from modular_zapoc/modules/carpets/icons/purplegoldcarpet.png.toml rename to icons/obj/smooth_structures/darkpack/floor/carpet/purplegoldcarpet.png.toml diff --git a/modular_zapoc/modules/carpets/icons/redgoldcarpet.dmi b/icons/obj/smooth_structures/darkpack/floor/carpet/redgoldcarpet.dmi similarity index 100% rename from modular_zapoc/modules/carpets/icons/redgoldcarpet.dmi rename to icons/obj/smooth_structures/darkpack/floor/carpet/redgoldcarpet.dmi diff --git a/modular_zapoc/modules/carpets/icons/redgoldcarpet.png b/icons/obj/smooth_structures/darkpack/floor/carpet/redgoldcarpet.png similarity index 100% rename from modular_zapoc/modules/carpets/icons/redgoldcarpet.png rename to icons/obj/smooth_structures/darkpack/floor/carpet/redgoldcarpet.png diff --git a/modular_zapoc/modules/carpets/icons/redgoldcarpet.png.toml b/icons/obj/smooth_structures/darkpack/floor/carpet/redgoldcarpet.png.toml similarity index 100% rename from modular_zapoc/modules/carpets/icons/redgoldcarpet.png.toml rename to icons/obj/smooth_structures/darkpack/floor/carpet/redgoldcarpet.png.toml diff --git a/modular_zapoc/modules/carpets/icons/redsilvercarpet.dmi b/icons/obj/smooth_structures/darkpack/floor/carpet/redsilvercarpet.dmi similarity index 100% rename from modular_zapoc/modules/carpets/icons/redsilvercarpet.dmi rename to icons/obj/smooth_structures/darkpack/floor/carpet/redsilvercarpet.dmi diff --git a/modular_zapoc/modules/carpets/icons/redsilvercarpet.png b/icons/obj/smooth_structures/darkpack/floor/carpet/redsilvercarpet.png similarity index 100% rename from modular_zapoc/modules/carpets/icons/redsilvercarpet.png rename to icons/obj/smooth_structures/darkpack/floor/carpet/redsilvercarpet.png diff --git a/modular_zapoc/modules/carpets/icons/redsilvercarpet.png.toml b/icons/obj/smooth_structures/darkpack/floor/carpet/redsilvercarpet.png.toml similarity index 100% rename from modular_zapoc/modules/carpets/icons/redsilvercarpet.png.toml rename to icons/obj/smooth_structures/darkpack/floor/carpet/redsilvercarpet.png.toml diff --git a/icons/obj/smooth_structures/darkpack/floor/cave.dmi b/icons/obj/smooth_structures/darkpack/floor/cave.dmi new file mode 100644 index 000000000000..9cabc2a0d5c4 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/floor/cave.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/floor/cave.png b/icons/obj/smooth_structures/darkpack/floor/cave.png new file mode 100644 index 000000000000..3fde75e708e7 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/floor/cave.png differ diff --git a/icons/obj/smooth_structures/darkpack/floor/cave.png.toml b/icons/obj/smooth_structures/darkpack/floor/cave.png.toml new file mode 100644 index 000000000000..ab5a59106d3e --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/floor/cave.png.toml @@ -0,0 +1,14 @@ +output_name = "beach" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 50 +y = 50 + +[output_icon_size] +x = 50 +y = 50 + +[cut_pos] +x = 25 +y = 25 diff --git a/icons/obj/smooth_structures/darkpack/floor/dirt.dmi b/icons/obj/smooth_structures/darkpack/floor/dirt.dmi new file mode 100644 index 000000000000..cf94d706c8e8 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/floor/dirt.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/floor/dirt.png b/icons/obj/smooth_structures/darkpack/floor/dirt.png new file mode 100644 index 000000000000..ab1e0bb7fa6b Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/floor/dirt.png differ diff --git a/icons/obj/smooth_structures/darkpack/floor/dirt.png.toml b/icons/obj/smooth_structures/darkpack/floor/dirt.png.toml new file mode 100644 index 000000000000..91b107a76339 --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/floor/dirt.png.toml @@ -0,0 +1,14 @@ +output_name = "dirt" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 50 +y = 50 + +[output_icon_size] +x = 50 +y = 50 + +[cut_pos] +x = 25 +y = 25 diff --git a/icons/obj/smooth_structures/darkpack/floor/grass.dmi b/icons/obj/smooth_structures/darkpack/floor/grass.dmi new file mode 100644 index 000000000000..9041bfb27064 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/floor/grass.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/floor/grass.png b/icons/obj/smooth_structures/darkpack/floor/grass.png new file mode 100644 index 000000000000..ebeca20c0a63 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/floor/grass.png differ diff --git a/icons/obj/smooth_structures/darkpack/floor/grass.png.toml b/icons/obj/smooth_structures/darkpack/floor/grass.png.toml new file mode 100644 index 000000000000..3a95e23a66d6 --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/floor/grass.png.toml @@ -0,0 +1,14 @@ +output_name = "grass" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 50 +y = 50 + +[output_icon_size] +x = 50 +y = 50 + +[cut_pos] +x = 25 +y = 25 diff --git a/icons/obj/smooth_structures/darkpack/floor/rough.dmi b/icons/obj/smooth_structures/darkpack/floor/rough.dmi new file mode 100644 index 000000000000..44ea19735464 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/floor/rough.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/floor/rough.png b/icons/obj/smooth_structures/darkpack/floor/rough.png new file mode 100644 index 000000000000..5713f38b87f5 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/floor/rough.png differ diff --git a/icons/obj/smooth_structures/darkpack/floor/rough.png.toml b/icons/obj/smooth_structures/darkpack/floor/rough.png.toml new file mode 100644 index 000000000000..ab5a59106d3e --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/floor/rough.png.toml @@ -0,0 +1,14 @@ +output_name = "beach" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 50 +y = 50 + +[output_icon_size] +x = 50 +y = 50 + +[cut_pos] +x = 25 +y = 25 diff --git a/icons/obj/smooth_structures/darkpack/mojave/brick/frill.dmi b/icons/obj/smooth_structures/darkpack/mojave/brick/frill.dmi new file mode 100644 index 000000000000..94becacce67f Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/mojave/brick/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/mojave/brick/frill.png b/icons/obj/smooth_structures/darkpack/mojave/brick/frill.png new file mode 100644 index 000000000000..cfcb437f3687 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/mojave/brick/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/mojave/brick/frill.png.toml b/icons/obj/smooth_structures/darkpack/mojave/brick/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/mojave/brick/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/mojave/brick/wall.dmi b/icons/obj/smooth_structures/darkpack/mojave/brick/wall.dmi new file mode 100644 index 000000000000..1f76256c4e15 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/mojave/brick/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/mojave/brick/wall.png b/icons/obj/smooth_structures/darkpack/mojave/brick/wall.png new file mode 100644 index 000000000000..c4621db1410a Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/mojave/brick/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/unimplemented/brick_wall.png.toml b/icons/obj/smooth_structures/darkpack/mojave/brick/wall.png.toml similarity index 100% rename from icons/obj/smooth_structures/darkpack/unimplemented/brick_wall.png.toml rename to icons/obj/smooth_structures/darkpack/mojave/brick/wall.png.toml diff --git a/icons/obj/smooth_structures/darkpack/mojave/readme.md b/icons/obj/smooth_structures/darkpack/mojave/readme.md new file mode 100644 index 000000000000..3b316693c631 --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/mojave/readme.md @@ -0,0 +1,2 @@ +Walls from BARON's wall resprite project he had slated for mojave but never finished +I would really like to use them but I think it requires a full redo of ALL of our walls diff --git a/icons/obj/smooth_structures/darkpack/mojave/rock_brown/frill.dmi b/icons/obj/smooth_structures/darkpack/mojave/rock_brown/frill.dmi new file mode 100644 index 000000000000..16b5d3f053b6 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/mojave/rock_brown/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/mojave/rock_brown/frill.png b/icons/obj/smooth_structures/darkpack/mojave/rock_brown/frill.png new file mode 100644 index 000000000000..ea522761a9ca Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/mojave/rock_brown/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/mojave/rock_brown/frill.png.toml b/icons/obj/smooth_structures/darkpack/mojave/rock_brown/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/mojave/rock_brown/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/mojave/rock_brown/wall.dmi b/icons/obj/smooth_structures/darkpack/mojave/rock_brown/wall.dmi new file mode 100644 index 000000000000..bcf9b258deca Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/mojave/rock_brown/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/mojave/rock_brown/wall.png b/icons/obj/smooth_structures/darkpack/mojave/rock_brown/wall.png new file mode 100644 index 000000000000..73791dd68042 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/mojave/rock_brown/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/mojave/rock_brown/wall.png.toml b/icons/obj/smooth_structures/darkpack/mojave/rock_brown/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/mojave/rock_brown/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/frill.dmi b/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/frill.dmi new file mode 100644 index 000000000000..93299541c497 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/frill.png b/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/frill.png new file mode 100644 index 000000000000..f9bb874eb28e Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/frill.png.toml b/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/wall.dmi b/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/wall.dmi new file mode 100644 index 000000000000..8c066b7a86ee Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/wall.png b/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/wall.png new file mode 100644 index 000000000000..25dcc98900c1 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/wall.png.toml b/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/unimplemented/brick_frill.dmi b/icons/obj/smooth_structures/darkpack/unimplemented/brick_frill.dmi deleted file mode 100644 index 0bfef09aab0e..000000000000 Binary files a/icons/obj/smooth_structures/darkpack/unimplemented/brick_frill.dmi and /dev/null differ diff --git a/icons/obj/smooth_structures/darkpack/unimplemented/brick_frill.png b/icons/obj/smooth_structures/darkpack/unimplemented/brick_frill.png deleted file mode 100644 index a8045a35f11c..000000000000 Binary files a/icons/obj/smooth_structures/darkpack/unimplemented/brick_frill.png and /dev/null differ diff --git a/icons/obj/smooth_structures/darkpack/unimplemented/brick_frill.png.toml b/icons/obj/smooth_structures/darkpack/unimplemented/brick_frill.png.toml deleted file mode 100644 index d30210e1ae15..000000000000 --- a/icons/obj/smooth_structures/darkpack/unimplemented/brick_frill.png.toml +++ /dev/null @@ -1,2 +0,0 @@ -output_name = "frill" -template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/unimplemented/brick_wall.dmi b/icons/obj/smooth_structures/darkpack/unimplemented/brick_wall.dmi deleted file mode 100644 index 80aa913968b8..000000000000 Binary files a/icons/obj/smooth_structures/darkpack/unimplemented/brick_wall.dmi and /dev/null differ diff --git a/icons/obj/smooth_structures/darkpack/unimplemented/brick_wall.png b/icons/obj/smooth_structures/darkpack/unimplemented/brick_wall.png deleted file mode 100644 index ffaf3f531516..000000000000 Binary files a/icons/obj/smooth_structures/darkpack/unimplemented/brick_wall.png and /dev/null differ diff --git a/icons/obj/smooth_structures/darkpack/wall/bar/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/bar/frill.dmi new file mode 100644 index 000000000000..0b66667152ab Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/bar/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/bar/frill.png b/icons/obj/smooth_structures/darkpack/wall/bar/frill.png new file mode 100644 index 000000000000..e2b11ca9a37e Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/bar/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/bar/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/bar/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/bar/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/bar/low_wall.dmi b/icons/obj/smooth_structures/darkpack/wall/bar/low_wall.dmi new file mode 100644 index 000000000000..de25335cb363 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/bar/low_wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/bar/low_wall.png b/icons/obj/smooth_structures/darkpack/wall/bar/low_wall.png new file mode 100644 index 000000000000..e274a6038d8c Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/bar/low_wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/bar/low_wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/bar/low_wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/bar/low_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/bar/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/bar/wall.dmi new file mode 100644 index 000000000000..12122cf139f3 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/bar/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/bar/wall.png b/icons/obj/smooth_structures/darkpack/wall/bar/wall.png new file mode 100644 index 000000000000..0b9f2420b97d Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/bar/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/bar/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/bar/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/bar/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/brick/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/brick/frill.dmi new file mode 100644 index 000000000000..caa8a05e9a5e Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/brick/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/brick/frill.png b/icons/obj/smooth_structures/darkpack/wall/brick/frill.png new file mode 100644 index 000000000000..b3eaf8202290 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/brick/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/brick/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/brick/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/brick/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/brick/low_wall.dmi b/icons/obj/smooth_structures/darkpack/wall/brick/low_wall.dmi new file mode 100644 index 000000000000..dea7ad968b25 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/brick/low_wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/brick/low_wall.png b/icons/obj/smooth_structures/darkpack/wall/brick/low_wall.png new file mode 100644 index 000000000000..0727f62f891d Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/brick/low_wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/brick/low_wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/brick/low_wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/brick/low_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/brick/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/brick/wall.dmi new file mode 100644 index 000000000000..3a262900b2aa Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/brick/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/brick/wall.png b/icons/obj/smooth_structures/darkpack/wall/brick/wall.png new file mode 100644 index 000000000000..0dbf504ac3d3 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/brick/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/brick/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/brick/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/brick/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/brick_old/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/brick_old/frill.dmi new file mode 100644 index 000000000000..5700ea6f64e5 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/brick_old/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/brick_old/frill.png b/icons/obj/smooth_structures/darkpack/wall/brick_old/frill.png new file mode 100644 index 000000000000..175992015685 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/brick_old/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/brick_old/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/brick_old/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/brick_old/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/brick_old/low_wall.dmi b/icons/obj/smooth_structures/darkpack/wall/brick_old/low_wall.dmi new file mode 100644 index 000000000000..b8c3966d990c Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/brick_old/low_wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/brick_old/low_wall.png b/icons/obj/smooth_structures/darkpack/wall/brick_old/low_wall.png new file mode 100644 index 000000000000..33d9138e3215 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/brick_old/low_wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/brick_old/low_wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/brick_old/low_wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/brick_old/low_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/brick_old/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/brick_old/wall.dmi new file mode 100644 index 000000000000..a171bfda8c93 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/brick_old/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/brick_old/wall.png b/icons/obj/smooth_structures/darkpack/wall/brick_old/wall.png new file mode 100644 index 000000000000..610d593a8018 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/brick_old/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/brick_old/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/brick_old/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/brick_old/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/city/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/city/frill.dmi new file mode 100644 index 000000000000..1df279d32e8a Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/city/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/city/frill.png b/icons/obj/smooth_structures/darkpack/wall/city/frill.png new file mode 100644 index 000000000000..8bf0035c7595 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/city/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/city/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/city/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/city/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/city/low_wall.dmi b/icons/obj/smooth_structures/darkpack/wall/city/low_wall.dmi new file mode 100644 index 000000000000..fcbad44b5df2 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/city/low_wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/city/low_wall.png b/icons/obj/smooth_structures/darkpack/wall/city/low_wall.png new file mode 100644 index 000000000000..a71702c981ff Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/city/low_wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/city/low_wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/city/low_wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/city/low_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/city/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/city/wall.dmi new file mode 100644 index 000000000000..18703c1c9d4b Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/city/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/city/wall.png b/icons/obj/smooth_structures/darkpack/wall/city/wall.png new file mode 100644 index 000000000000..9358648bdfd8 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/city/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/city/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/city/wall.png.toml new file mode 100644 index 000000000000..a4eeccfbbea4 --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/city/wall.png.toml @@ -0,0 +1,5 @@ +output_name = "wall" +template = "bitmask/walls.toml" + +[prefabs] +12 = 5 diff --git a/icons/obj/smooth_structures/darkpack/wall/green/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/green/frill.dmi new file mode 100644 index 000000000000..273a679ffe2c Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/green/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/green/frill.png b/icons/obj/smooth_structures/darkpack/wall/green/frill.png new file mode 100644 index 000000000000..cc59b46ba63c Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/green/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/green/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/green/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/green/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/green/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/green/wall.dmi new file mode 100644 index 000000000000..ad887f96287e Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/green/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/green/wall.png b/icons/obj/smooth_structures/darkpack/wall/green/wall.png new file mode 100644 index 000000000000..1ed943ce4d20 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/green/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/green/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/green/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/green/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/junk/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/junk/frill.dmi new file mode 100644 index 000000000000..4b098e956170 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/junk/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/junk/frill.png b/icons/obj/smooth_structures/darkpack/wall/junk/frill.png new file mode 100644 index 000000000000..c2d38e16ca89 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/junk/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/junk/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/junk/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/junk/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/junk/low_wall.dmi b/icons/obj/smooth_structures/darkpack/wall/junk/low_wall.dmi new file mode 100644 index 000000000000..f08cc060dd92 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/junk/low_wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/junk/low_wall.png b/icons/obj/smooth_structures/darkpack/wall/junk/low_wall.png new file mode 100644 index 000000000000..7fd657d3ab42 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/junk/low_wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/junk/low_wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/junk/low_wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/junk/low_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/junk/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/junk/wall.dmi new file mode 100644 index 000000000000..b04799dbe7dd Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/junk/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/junk/wall.png b/icons/obj/smooth_structures/darkpack/wall/junk/wall.png new file mode 100644 index 000000000000..79cb04c551f5 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/junk/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/junk/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/junk/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/junk/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/junk_alt/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/junk_alt/frill.dmi new file mode 100644 index 000000000000..6f8d313aa731 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/junk_alt/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/junk_alt/frill.png b/icons/obj/smooth_structures/darkpack/wall/junk_alt/frill.png new file mode 100644 index 000000000000..21498803dff1 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/junk_alt/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/junk_alt/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/junk_alt/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/junk_alt/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/junk_alt/low_wall.dmi b/icons/obj/smooth_structures/darkpack/wall/junk_alt/low_wall.dmi new file mode 100644 index 000000000000..190f67c5d8e2 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/junk_alt/low_wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/junk_alt/low_wall.png b/icons/obj/smooth_structures/darkpack/wall/junk_alt/low_wall.png new file mode 100644 index 000000000000..bca73c79e2cb Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/junk_alt/low_wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/junk_alt/low_wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/junk_alt/low_wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/junk_alt/low_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/junk_alt/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/junk_alt/wall.dmi new file mode 100644 index 000000000000..d675027a328f Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/junk_alt/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/junk_alt/wall.png b/icons/obj/smooth_structures/darkpack/wall/junk_alt/wall.png new file mode 100644 index 000000000000..0d11914d96ff Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/junk_alt/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/junk_alt/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/junk_alt/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/junk_alt/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/market/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/market/frill.dmi new file mode 100644 index 000000000000..ecf59ec9ed26 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/market/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/market/frill.png b/icons/obj/smooth_structures/darkpack/wall/market/frill.png new file mode 100644 index 000000000000..0c4870e9320c Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/market/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/market/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/market/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/market/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/market/low_wall.dmi b/icons/obj/smooth_structures/darkpack/wall/market/low_wall.dmi new file mode 100644 index 000000000000..79c89d3c5f15 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/market/low_wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/market/low_wall.png b/icons/obj/smooth_structures/darkpack/wall/market/low_wall.png new file mode 100644 index 000000000000..599c1382d7ce Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/market/low_wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/market/low_wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/market/low_wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/market/low_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/market/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/market/wall.dmi new file mode 100644 index 000000000000..63f3267a4c27 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/market/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/market/wall.png b/icons/obj/smooth_structures/darkpack/wall/market/wall.png new file mode 100644 index 000000000000..cf0fe3d94be5 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/market/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/market/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/market/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/market/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/metal/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/metal/frill.dmi new file mode 100644 index 000000000000..4a6e5e72c280 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal/frill.png b/icons/obj/smooth_structures/darkpack/wall/metal/frill.png new file mode 100644 index 000000000000..0b7c2f41817f Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/metal/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/metal/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/metal/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/metal/wall.dmi new file mode 100644 index 000000000000..dc6ef247118e Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal/wall.png b/icons/obj/smooth_structures/darkpack/wall/metal/wall.png new file mode 100644 index 000000000000..cbef85dde92a Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/metal/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/metal/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_alt/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/metal_alt/frill.dmi new file mode 100644 index 000000000000..4a6e5e72c280 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal_alt/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_alt/frill.png b/icons/obj/smooth_structures/darkpack/wall/metal_alt/frill.png new file mode 100644 index 000000000000..0b7c2f41817f Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal_alt/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_alt/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/metal_alt/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/metal_alt/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_alt/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/metal_alt/wall.dmi new file mode 100644 index 000000000000..844cb4a221c9 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal_alt/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_alt/wall.png b/icons/obj/smooth_structures/darkpack/wall/metal_alt/wall.png new file mode 100644 index 000000000000..36833910b174 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal_alt/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_alt/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/metal_alt/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/metal_alt/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_glass/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/metal_glass/frill.dmi new file mode 100644 index 000000000000..ea924ac49b99 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal_glass/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_glass/frill.png b/icons/obj/smooth_structures/darkpack/wall/metal_glass/frill.png new file mode 100644 index 000000000000..95b389ed66bd Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal_glass/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_glass/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/metal_glass/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/metal_glass/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_glass/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/metal_glass/wall.dmi new file mode 100644 index 000000000000..2ad5fb036411 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal_glass/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_glass/wall.png b/icons/obj/smooth_structures/darkpack/wall/metal_glass/wall.png new file mode 100644 index 000000000000..989152254d65 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal_glass/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_glass/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/metal_glass/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/metal_glass/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/frill.dmi new file mode 100644 index 000000000000..4a6e5e72c280 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/frill.png b/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/frill.png new file mode 100644 index 000000000000..0b7c2f41817f Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/wall.dmi new file mode 100644 index 000000000000..551afbb7b57e Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/wall.png b/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/wall.png new file mode 100644 index 000000000000..174958f8a1ea Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/metal_reinforced/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/old/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/old/frill.dmi new file mode 100644 index 000000000000..d641da3882ef Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/old/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/old/frill.png b/icons/obj/smooth_structures/darkpack/wall/old/frill.png new file mode 100644 index 000000000000..1e06f6b7d839 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/old/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/old/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/old/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/old/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/old/low_wall.dmi b/icons/obj/smooth_structures/darkpack/wall/old/low_wall.dmi new file mode 100644 index 000000000000..8bed8c95d0ed Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/old/low_wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/old/low_wall.png b/icons/obj/smooth_structures/darkpack/wall/old/low_wall.png new file mode 100644 index 000000000000..e39c48dcdf7f Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/old/low_wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/old/low_wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/old/low_wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/old/low_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/old/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/old/wall.dmi new file mode 100644 index 000000000000..f2f78b593e0f Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/old/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/old/wall.png b/icons/obj/smooth_structures/darkpack/wall/old/wall.png new file mode 100644 index 000000000000..7ea93c1ed1f7 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/old/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/old/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/old/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/old/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/painted/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/painted/frill.dmi new file mode 100644 index 000000000000..5fc3042e3287 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/painted/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/painted/frill.png b/icons/obj/smooth_structures/darkpack/wall/painted/frill.png new file mode 100644 index 000000000000..8100b03a9b37 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/painted/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/painted/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/painted/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/painted/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/painted/low_wall.dmi b/icons/obj/smooth_structures/darkpack/wall/painted/low_wall.dmi new file mode 100644 index 000000000000..f7d5f9602016 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/painted/low_wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/painted/low_wall.png b/icons/obj/smooth_structures/darkpack/wall/painted/low_wall.png new file mode 100644 index 000000000000..9a2788b22d54 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/painted/low_wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/painted/low_wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/painted/low_wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/painted/low_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/painted/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/painted/wall.dmi new file mode 100644 index 000000000000..d2b27575ed2a Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/painted/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/painted/wall.png b/icons/obj/smooth_structures/darkpack/wall/painted/wall.png new file mode 100644 index 000000000000..de53b4e8b0f5 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/painted/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/painted/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/painted/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/painted/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/red_brick/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/red_brick/frill.dmi new file mode 100644 index 000000000000..a718a75389cb Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/red_brick/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/red_brick/frill.png b/icons/obj/smooth_structures/darkpack/wall/red_brick/frill.png new file mode 100644 index 000000000000..3a8a18a39361 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/red_brick/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/red_brick/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/red_brick/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/red_brick/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/red_brick/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/red_brick/wall.dmi new file mode 100644 index 000000000000..e84f76466f8c Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/red_brick/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/red_brick/wall.png b/icons/obj/smooth_structures/darkpack/wall/red_brick/wall.png new file mode 100644 index 000000000000..91e17056638e Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/red_brick/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/red_brick/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/red_brick/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/red_brick/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/rich/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/rich/frill.dmi new file mode 100644 index 000000000000..c6bfda4529dc Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rich/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rich/frill.png b/icons/obj/smooth_structures/darkpack/wall/rich/frill.png new file mode 100644 index 000000000000..8ecb48e5be09 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rich/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rich/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/rich/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/rich/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/rich/low_wall.dmi b/icons/obj/smooth_structures/darkpack/wall/rich/low_wall.dmi new file mode 100644 index 000000000000..4f6f0aa45d4d Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rich/low_wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rich/low_wall.png b/icons/obj/smooth_structures/darkpack/wall/rich/low_wall.png new file mode 100644 index 000000000000..145acd4bb1f3 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rich/low_wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rich/low_wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/rich/low_wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/rich/low_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/rich/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/rich/wall.dmi new file mode 100644 index 000000000000..9f018e7dae06 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rich/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rich/wall.png b/icons/obj/smooth_structures/darkpack/wall/rich/wall.png new file mode 100644 index 000000000000..da8ef1c1b2b1 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rich/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rich/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/rich/wall.png.toml new file mode 100644 index 000000000000..a4eeccfbbea4 --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/rich/wall.png.toml @@ -0,0 +1,5 @@ +output_name = "wall" +template = "bitmask/walls.toml" + +[prefabs] +12 = 5 diff --git a/icons/obj/smooth_structures/darkpack/wall/rich_old/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/rich_old/frill.dmi new file mode 100644 index 000000000000..d752e39a2631 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rich_old/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rich_old/frill.png b/icons/obj/smooth_structures/darkpack/wall/rich_old/frill.png new file mode 100644 index 000000000000..d40fad354c12 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rich_old/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rich_old/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/rich_old/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/rich_old/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/rich_old/low_wall.dmi b/icons/obj/smooth_structures/darkpack/wall/rich_old/low_wall.dmi new file mode 100644 index 000000000000..85ca70bc07e1 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rich_old/low_wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rich_old/low_wall.png b/icons/obj/smooth_structures/darkpack/wall/rich_old/low_wall.png new file mode 100644 index 000000000000..4fb0ab664829 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rich_old/low_wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rich_old/low_wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/rich_old/low_wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/rich_old/low_wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/rich_old/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/rich_old/wall.dmi new file mode 100644 index 000000000000..05b3ae118ea5 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rich_old/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rich_old/wall.png b/icons/obj/smooth_structures/darkpack/wall/rich_old/wall.png new file mode 100644 index 000000000000..9902da448923 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rich_old/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rich_old/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/rich_old/wall.png.toml new file mode 100644 index 000000000000..a4eeccfbbea4 --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/rich_old/wall.png.toml @@ -0,0 +1,5 @@ +output_name = "wall" +template = "bitmask/walls.toml" + +[prefabs] +12 = 5 diff --git a/icons/obj/smooth_structures/darkpack/wall/rock/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/rock/frill.dmi new file mode 100644 index 000000000000..f3aedcce2aa5 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rock/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rock/frill.png b/icons/obj/smooth_structures/darkpack/wall/rock/frill.png new file mode 100644 index 000000000000..6af43b046ed9 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rock/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rock/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/rock/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/rock/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/rock/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/rock/wall.dmi new file mode 100644 index 000000000000..5c3f81d8a846 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rock/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rock/wall.png b/icons/obj/smooth_structures/darkpack/wall/rock/wall.png new file mode 100644 index 000000000000..763c1f64ce03 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rock/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rock/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/rock/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/rock/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/rust/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/rust/frill.dmi new file mode 100644 index 000000000000..b938de74af82 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rust/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rust/frill.png b/icons/obj/smooth_structures/darkpack/wall/rust/frill.png new file mode 100644 index 000000000000..4157e4c228be Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rust/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rust/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/rust/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/rust/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/rust/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/rust/wall.dmi new file mode 100644 index 000000000000..f7edec2a6bbe Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rust/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rust/wall.png b/icons/obj/smooth_structures/darkpack/wall/rust/wall.png new file mode 100644 index 000000000000..8c42de587c15 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rust/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rust/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/rust/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/rust/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/rustbad/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/rustbad/frill.dmi new file mode 100644 index 000000000000..32b33ee96346 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rustbad/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rustbad/frill.png b/icons/obj/smooth_structures/darkpack/wall/rustbad/frill.png new file mode 100644 index 000000000000..bdddeeb4d7ed Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rustbad/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rustbad/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/rustbad/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/rustbad/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/rustbad/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/rustbad/wall.dmi new file mode 100644 index 000000000000..64ae3fec2938 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rustbad/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rustbad/wall.png b/icons/obj/smooth_structures/darkpack/wall/rustbad/wall.png new file mode 100644 index 000000000000..0b58669c406d Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/rustbad/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/rustbad/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/rustbad/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/rustbad/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/wood/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/wood/frill.dmi new file mode 100644 index 000000000000..2d8ba4b4bc02 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/wood/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/wood/frill.png b/icons/obj/smooth_structures/darkpack/wall/wood/frill.png new file mode 100644 index 000000000000..275f995707fb Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/wood/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/wood/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/wood/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/wood/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/wood/low_wall.dmi b/icons/obj/smooth_structures/darkpack/wall/wood/low_wall.dmi new file mode 100644 index 000000000000..37faa9a02551 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/wood/low_wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/wood/low_wall.png b/icons/obj/smooth_structures/darkpack/wall/wood/low_wall.png new file mode 100644 index 000000000000..2c03a534363a Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/wood/low_wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/wood/low_wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/wood/low_wall.png.toml new file mode 100644 index 000000000000..2a4ccd1c1f6e --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/wood/low_wall.png.toml @@ -0,0 +1,4 @@ +output_name = "wall" +template = "bitmask/walls.toml" +[cut_pos] +y = 7 diff --git a/icons/obj/smooth_structures/darkpack/wall/wood/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/wood/wall.dmi new file mode 100644 index 000000000000..8e84ec77813d Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/wood/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/wood/wall.png b/icons/obj/smooth_structures/darkpack/wall/wood/wall.png new file mode 100644 index 000000000000..34235433705f Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/wood/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/wood/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/wood/wall.png.toml new file mode 100644 index 000000000000..d02898d5f97e --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/wood/wall.png.toml @@ -0,0 +1,4 @@ +output_name = "wall" +template = "bitmask/walls.toml" +[cut_pos] +y = 3 diff --git a/icons/obj/smooth_structures/darkpack/wall/wood_dirty/frill.dmi b/icons/obj/smooth_structures/darkpack/wall/wood_dirty/frill.dmi new file mode 100644 index 000000000000..7ae7371b355e Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/wood_dirty/frill.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/wood_dirty/frill.png b/icons/obj/smooth_structures/darkpack/wall/wood_dirty/frill.png new file mode 100644 index 000000000000..06be9e1e0b0b Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/wood_dirty/frill.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/wood_dirty/frill.png.toml b/icons/obj/smooth_structures/darkpack/wall/wood_dirty/frill.png.toml new file mode 100644 index 000000000000..10dbcdd434cf --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/wood_dirty/frill.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/frills.toml" diff --git a/icons/obj/smooth_structures/darkpack/wall/wood_dirty/wall.dmi b/icons/obj/smooth_structures/darkpack/wall/wood_dirty/wall.dmi new file mode 100644 index 000000000000..422e32f4d58b Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/wood_dirty/wall.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/wall/wood_dirty/wall.png b/icons/obj/smooth_structures/darkpack/wall/wood_dirty/wall.png new file mode 100644 index 000000000000..1da7dc6c87cd Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/wall/wood_dirty/wall.png differ diff --git a/icons/obj/smooth_structures/darkpack/wall/wood_dirty/wall.png.toml b/icons/obj/smooth_structures/darkpack/wall/wood_dirty/wall.png.toml new file mode 100644 index 000000000000..8e7f02ba59ef --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/wall/wood_dirty/wall.png.toml @@ -0,0 +1,2 @@ +output_name = "wall" +template = "bitmask/walls.toml" diff --git a/icons/obj/smooth_structures/greentop_table.dmi b/icons/obj/smooth_structures/greentop_table.dmi new file mode 100644 index 000000000000..cdddca147394 Binary files /dev/null and b/icons/obj/smooth_structures/greentop_table.dmi differ diff --git a/icons/obj/smooth_structures/greentop_table.png b/icons/obj/smooth_structures/greentop_table.png new file mode 100644 index 000000000000..117ac7313369 Binary files /dev/null and b/icons/obj/smooth_structures/greentop_table.png differ diff --git a/icons/obj/smooth_structures/greentop_table.png.toml b/icons/obj/smooth_structures/greentop_table.png.toml new file mode 100644 index 000000000000..14535f9a0487 --- /dev/null +++ b/icons/obj/smooth_structures/greentop_table.png.toml @@ -0,0 +1,2 @@ +output_name = "greentop_table" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/purpletop_table.dmi b/icons/obj/smooth_structures/purpletop_table.dmi new file mode 100644 index 000000000000..6f55e5dd4392 Binary files /dev/null and b/icons/obj/smooth_structures/purpletop_table.dmi differ diff --git a/icons/obj/smooth_structures/purpletop_table.png b/icons/obj/smooth_structures/purpletop_table.png new file mode 100644 index 000000000000..5c3db1d3caa0 Binary files /dev/null and b/icons/obj/smooth_structures/purpletop_table.png differ diff --git a/icons/obj/smooth_structures/purpletop_table.png.toml b/icons/obj/smooth_structures/purpletop_table.png.toml new file mode 100644 index 000000000000..4322f940c470 --- /dev/null +++ b/icons/obj/smooth_structures/purpletop_table.png.toml @@ -0,0 +1,2 @@ +output_name = "purpletop_table" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/redtop_table.dmi b/icons/obj/smooth_structures/redtop_table.dmi new file mode 100644 index 000000000000..f9be636da869 Binary files /dev/null and b/icons/obj/smooth_structures/redtop_table.dmi differ diff --git a/icons/obj/smooth_structures/redtop_table.png b/icons/obj/smooth_structures/redtop_table.png new file mode 100644 index 000000000000..620801c68d7b Binary files /dev/null and b/icons/obj/smooth_structures/redtop_table.png differ diff --git a/icons/obj/smooth_structures/redtop_table.png.toml b/icons/obj/smooth_structures/redtop_table.png.toml new file mode 100644 index 000000000000..b6401bc72994 --- /dev/null +++ b/icons/obj/smooth_structures/redtop_table.png.toml @@ -0,0 +1,2 @@ +output_name = "redtop_table" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/tealtop_table.dmi b/icons/obj/smooth_structures/tealtop_table.dmi new file mode 100644 index 000000000000..2196d3d440c6 Binary files /dev/null and b/icons/obj/smooth_structures/tealtop_table.dmi differ diff --git a/icons/obj/smooth_structures/tealtop_table.png b/icons/obj/smooth_structures/tealtop_table.png new file mode 100644 index 000000000000..1ec120e41a17 Binary files /dev/null and b/icons/obj/smooth_structures/tealtop_table.png differ diff --git a/icons/obj/smooth_structures/tealtop_table.png.toml b/icons/obj/smooth_structures/tealtop_table.png.toml new file mode 100644 index 000000000000..0244414ba195 --- /dev/null +++ b/icons/obj/smooth_structures/tealtop_table.png.toml @@ -0,0 +1,2 @@ +output_name = "tealtop_table" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/yellowtop_table.dmi b/icons/obj/smooth_structures/yellowtop_table.dmi new file mode 100644 index 000000000000..76ae34b8fa81 Binary files /dev/null and b/icons/obj/smooth_structures/yellowtop_table.dmi differ diff --git a/icons/obj/smooth_structures/yellowtop_table.png b/icons/obj/smooth_structures/yellowtop_table.png new file mode 100644 index 000000000000..42f27a61d4c5 Binary files /dev/null and b/icons/obj/smooth_structures/yellowtop_table.png differ diff --git a/icons/obj/smooth_structures/yellowtop_table.png.toml b/icons/obj/smooth_structures/yellowtop_table.png.toml new file mode 100644 index 000000000000..9c73efaf456b --- /dev/null +++ b/icons/obj/smooth_structures/yellowtop_table.png.toml @@ -0,0 +1,2 @@ +output_name = "yellowtop_table" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index a10d56851ada..f449919f2d7b 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/icons/obj/stairs.dmi b/icons/obj/stairs.dmi index a59e8f1fc9f8..2f79c15b5d8b 100644 Binary files a/icons/obj/stairs.dmi and b/icons/obj/stairs.dmi differ diff --git a/icons/obj/storage/backpack.dmi b/icons/obj/storage/backpack.dmi index e4364146a1c9..d464ee689faa 100644 Binary files a/icons/obj/storage/backpack.dmi and b/icons/obj/storage/backpack.dmi differ diff --git a/icons/obj/storage/closet.dmi b/icons/obj/storage/closet.dmi index 6f5c4c1b8954..f01d426e8a34 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 744cfab27e18..1080a9068b5e 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 f3e7b554253b..ba80deac9761 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/structures_spawners.dmi b/icons/obj/structures_spawners.dmi index 8f699f4d711b..59f98a069011 100644 Binary files a/icons/obj/structures_spawners.dmi and b/icons/obj/structures_spawners.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index 1db24b418e5b..0f1f57eb860a 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/icons/obj/toys/golfcart_hotrod_split.dmi b/icons/obj/toys/golfcart_hotrod_split.dmi new file mode 100644 index 000000000000..aeca9580b087 Binary files /dev/null and b/icons/obj/toys/golfcart_hotrod_split.dmi differ diff --git a/icons/obj/toys/golfcart_split.dmi b/icons/obj/toys/golfcart_split.dmi new file mode 100644 index 000000000000..26f14edd753a Binary files /dev/null and b/icons/obj/toys/golfcart_split.dmi differ diff --git a/icons/obj/toys/playing_cards.dmi b/icons/obj/toys/playing_cards.dmi index af40fed3102a..afb8a2579c98 100644 Binary files a/icons/obj/toys/playing_cards.dmi and b/icons/obj/toys/playing_cards.dmi differ diff --git a/icons/obj/toys/stickers.dmi b/icons/obj/toys/stickers.dmi index 80c0e138e38f..38114a13ead6 100644 Binary files a/icons/obj/toys/stickers.dmi and b/icons/obj/toys/stickers.dmi differ diff --git a/icons/obj/tram/heretic_tram.dmi b/icons/obj/tram/heretic_tram.dmi new file mode 100644 index 000000000000..793d7c6e4f90 Binary files /dev/null and b/icons/obj/tram/heretic_tram.dmi differ diff --git a/icons/obj/vending_restock.dmi b/icons/obj/vending_restock.dmi index ca8e40349c40..25c786f2153c 100644 Binary files a/icons/obj/vending_restock.dmi and b/icons/obj/vending_restock.dmi differ diff --git a/icons/obj/wallmounts.dmi b/icons/obj/wallmounts.dmi index df810abb3b48..47d057e64cc9 100644 Binary files a/icons/obj/wallmounts.dmi and b/icons/obj/wallmounts.dmi differ diff --git a/icons/obj/weapons/48x.dmi b/icons/obj/weapons/48x.dmi new file mode 100644 index 000000000000..4366de5f0328 Binary files /dev/null and b/icons/obj/weapons/48x.dmi differ diff --git a/icons/obj/weapons/baton.dmi b/icons/obj/weapons/baton.dmi index 101baab3c797..c9dc238a651b 100644 Binary files a/icons/obj/weapons/baton.dmi and b/icons/obj/weapons/baton.dmi differ diff --git a/icons/obj/weapons/cannons.dmi b/icons/obj/weapons/cannons.dmi index 93b43b19239b..01158ad9dfff 100644 Binary files a/icons/obj/weapons/cannons.dmi and b/icons/obj/weapons/cannons.dmi differ diff --git a/icons/obj/weapons/guns/ammo.dmi b/icons/obj/weapons/guns/ammo.dmi index 79250688cc41..1eb107782285 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/energy.dmi b/icons/obj/weapons/guns/energy.dmi index bbb4ff06316c..5d3834b6030b 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/ninemmsmg/napad_item.dmi b/icons/obj/weapons/guns/ninemmsmg/napad_item.dmi new file mode 100644 index 000000000000..8dea5d01a8d6 Binary files /dev/null and b/icons/obj/weapons/guns/ninemmsmg/napad_item.dmi differ diff --git a/icons/obj/weapons/guns/ninemmsmg/napad_lefthand.dmi b/icons/obj/weapons/guns/ninemmsmg/napad_lefthand.dmi new file mode 100644 index 000000000000..a1f2e67f3f40 Binary files /dev/null and b/icons/obj/weapons/guns/ninemmsmg/napad_lefthand.dmi differ diff --git a/icons/obj/weapons/guns/ninemmsmg/napad_righthand.dmi b/icons/obj/weapons/guns/ninemmsmg/napad_righthand.dmi new file mode 100644 index 000000000000..c56a73680280 Binary files /dev/null and b/icons/obj/weapons/guns/ninemmsmg/napad_righthand.dmi differ diff --git a/icons/obj/weapons/guns/ninemmsmg/napad_worn.dmi b/icons/obj/weapons/guns/ninemmsmg/napad_worn.dmi new file mode 100644 index 000000000000..3ddf2b5f75be Binary files /dev/null and b/icons/obj/weapons/guns/ninemmsmg/napad_worn.dmi differ diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi index f7951475d51c..b682c3866cbf 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/wide_guns.dmi b/icons/obj/weapons/guns/wide_guns.dmi index 15a281a3c1a1..8e375515a75b 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/restraints.dmi b/icons/obj/weapons/restraints.dmi index f2d2f305d685..ddd3bf964369 100644 Binary files a/icons/obj/weapons/restraints.dmi and b/icons/obj/weapons/restraints.dmi differ diff --git a/icons/obj/weapons/sword.dmi b/icons/obj/weapons/sword.dmi index ae2fdfabedeb..255db0156ed7 100644 Binary files a/icons/obj/weapons/sword.dmi and b/icons/obj/weapons/sword.dmi differ diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi index 4c655cf4b5ba..df9c9386647d 100644 Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ diff --git a/icons/ui/achievements/achievements.dmi b/icons/ui/achievements/achievements.dmi index 7fa0a6e4c777..80ebc9cd2972 100644 Binary files a/icons/ui/achievements/achievements.dmi and b/icons/ui/achievements/achievements.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index 3441e36dcab8..cdf929c5efae 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -54,6 +54,17 @@ return DIRECT_OUTPUT(src, link(githuburl)) +/client/verb/config() + set name = "config" + set desc = "View the server configuration files." + set hidden = TRUE + + var/configurl = CONFIG_GET(string/configurl) + if(!configurl) + to_chat(src, span_danger("The Config URL is not set in the server configuration.")) + return + DIRECT_OUTPUT(src, link(configurl)) + /client/verb/reportissue() set name = "report-issue" set desc = "Report an issue" diff --git a/interface/skin.dmf b/interface/skin.dmf index c657fad36c02..e38294dfa820 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -259,12 +259,13 @@ window "inputwindow" elem "input" type = INPUT pos = 0,0 - size = 805x20 + size = 520x20 anchor1 = 0,0 anchor2 = 100,100 is-default = true border = line saved-params = "command" + can-scroll = true window "inputbuttons" elem "inputbuttons" diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 3f4c7ca23486..7458f9b16769 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -160,7 +160,7 @@ h1.alert, h2.alert {color: #000000;} .abductor {color: #800080; font-style: italic;} .mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;} .slime {color: #00CED1;} -.drone {color: #848482;} +.drone {color: #ffff00; background-color: #7c2395; font-style: italic;} .monkey {color: #975032;} .swarmer {color: #2C75FF;} .resonate {color: #298F85;} diff --git a/modular_darkpack/master_files/code/_globalvars/configuration.dm b/modular_darkpack/master_files/code/_globalvars/configuration.dm new file mode 100644 index 000000000000..9f69d56050af --- /dev/null +++ b/modular_darkpack/master_files/code/_globalvars/configuration.dm @@ -0,0 +1 @@ +GLOBAL_VAR_INIT(looc_allowed, TRUE) diff --git a/modular_darkpack/master_files/code/_onclick/hud/hud.dm b/modular_darkpack/master_files/code/_onclick/hud/hud.dm index caa91b68d5a2..5db6a23dda0d 100644 --- a/modular_darkpack/master_files/code/_onclick/hud/hud.dm +++ b/modular_darkpack/master_files/code/_onclick/hud/hud.dm @@ -1,7 +1,6 @@ /datum/hud var/atom/movable/screen/block_icon var/atom/movable/screen/jump_icon - var/atom/movable/screen/blood_icon + var/atom/movable/screen/bloodpool_icon var/atom/movable/screen/rage_icon - var/atom/movable/screen/drinkblood/drinkblood_icon var/atom/movable/screen/zone_icon diff --git a/modular_darkpack/master_files/code/_onclick/hud/living.dm b/modular_darkpack/master_files/code/_onclick/hud/living.dm new file mode 100644 index 000000000000..157ee31eaf71 --- /dev/null +++ b/modular_darkpack/master_files/code/_onclick/hud/living.dm @@ -0,0 +1,5 @@ +/datum/hud/living/New(mob/living/owner) + ..() + + bloodpool_icon = new /atom/movable/screen/bloodpool(null, src) + infodisplay += bloodpool_icon diff --git a/modular_darkpack/master_files/code/_onclick/hud/new_player.dm b/modular_darkpack/master_files/code/_onclick/hud/new_player.dm new file mode 100644 index 000000000000..2a556ecde07f --- /dev/null +++ b/modular_darkpack/master_files/code/_onclick/hud/new_player.dm @@ -0,0 +1,38 @@ +/atom/movable/screen/lobby/background + icon = 'modular_darkpack/master_files/icons/hud/lobby/background_cropped.dmi' + screen_loc = "TOP,CENTER:-71" + +/atom/movable/screen/lobby/button/character_setup + icon = 'modular_darkpack/master_files/icons/hud/lobby/character_setup.dmi' + screen_loc = "TOP:-101,CENTER:-61" + +/atom/movable/screen/lobby/button/ready + icon = 'modular_darkpack/master_files/icons/hud/lobby/ready.dmi' + screen_loc = "TOP:-175,CENTER:-4" + +/atom/movable/screen/lobby/button/join + icon = 'modular_darkpack/master_files/icons/hud/lobby/join.dmi' + screen_loc = "TOP:-175,CENTER:-4" + +/atom/movable/screen/lobby/button/observe + icon = 'modular_darkpack/master_files/icons/hud/lobby/observe.dmi' + screen_loc = "TOP:-71,CENTER:-61" + +/atom/movable/screen/lobby/button/bottom + icon = 'modular_darkpack/master_files/icons/hud/lobby/bottom_buttons.dmi' + +/atom/movable/screen/lobby/button/bottom/settings + screen_loc = "TOP:-215,CENTER:-61" + +/atom/movable/screen/lobby/button/bottom/changelog_button + screen_loc = "TOP:-215,CENTER:-32" + +/atom/movable/screen/lobby/button/bottom/crew_manifest + screen_loc = "TOP:-189,CENTER:-32" + +/atom/movable/screen/lobby/button/bottom/poll + screen_loc = "TOP:-189,CENTER:-61" + +/atom/movable/screen/lobby/button/start_now + icon = 'modular_darkpack/master_files/icons/hud/lobby/start_now.dmi' + screen_loc = "TOP:-241,CENTER:-61" diff --git a/modular_darkpack/master_files/code/controllers/configuration/entries/general.dm b/modular_darkpack/master_files/code/controllers/configuration/entries/general.dm new file mode 100644 index 000000000000..a147a2f36169 --- /dev/null +++ b/modular_darkpack/master_files/code/controllers/configuration/entries/general.dm @@ -0,0 +1,14 @@ +/datum/config_entry/string/wikiurl + default = "" + +/datum/config_entry/string/forumurl + default = "https://discord.gg/2EYyEnuBcW" + +/datum/config_entry/string/rulesurl + default = "" + +/datum/config_entry/string/githuburl + default = "https://github.com/DarkPack13/SecondCity" + +/datum/config_entry/flag/disable_ghost_looc + default = TRUE diff --git a/modular_darkpack/master_files/code/datums/mapgen/woods_generator.dm b/modular_darkpack/master_files/code/datums/mapgen/woods_generator.dm new file mode 100644 index 000000000000..1b601916ef74 --- /dev/null +++ b/modular_darkpack/master_files/code/datums/mapgen/woods_generator.dm @@ -0,0 +1,31 @@ +/datum/map_generator/jungle_generator/woodland // Intended for places that want forest generation but aren't actually wilderness. Like parks. + ///2D list of all biomes based on heat and humidity combos. + possible_biomes = list( + BIOME_LOW_HEAT = list( + BIOME_LOW_HUMIDITY = /datum/biome/plains, + BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/plains, + BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/jungle, + BIOME_HIGH_HUMIDITY = /datum/biome/jungle + ), + BIOME_LOWMEDIUM_HEAT = list( + BIOME_LOW_HUMIDITY = /datum/biome/plains, + BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/jungle, + BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/jungle, + BIOME_HIGH_HUMIDITY = /datum/biome/jungle/deep + ), + BIOME_HIGHMEDIUM_HEAT = list( + BIOME_LOW_HUMIDITY = /datum/biome/plains, + BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/plains, + BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/jungle/deep, + BIOME_HIGH_HUMIDITY = /datum/biome/jungle + ), + BIOME_HIGH_HEAT = list( + BIOME_LOW_HUMIDITY = /datum/biome/plains, + BIOME_LOWMEDIUM_HUMIDITY = /datum/biome/plains, + BIOME_HIGHMEDIUM_HUMIDITY = /datum/biome/jungle, + BIOME_HIGH_HUMIDITY = /datum/biome/jungle/deep + ) + ) + ///Used to select "zoom" level into the perlin noise, higher numbers result in slower transitions + ///Biome that is chosen when height is above 0.85 + fallback_biome = /datum/biome/plains diff --git a/modular_darkpack/master_files/code/datums/mind/_mind.dm b/modular_darkpack/master_files/code/datums/mind/_mind.dm new file mode 100644 index 000000000000..5bddacb79373 --- /dev/null +++ b/modular_darkpack/master_files/code/datums/mind/_mind.dm @@ -0,0 +1,11 @@ +/datum/mind + /// Guestbook datum, in case we actually make use of the guestbook mechanics + var/datum/guestbook/guestbook + +/datum/mind/New(_key) + . = ..() + guestbook = new() + +/datum/mind/Destroy() + QDEL_NULL(guestbook) + return ..() diff --git a/modular_darkpack/master_files/code/datums/station_traits/_station_trait.dm b/modular_darkpack/master_files/code/datums/station_traits/_station_trait.dm new file mode 100644 index 000000000000..248993f1e497 --- /dev/null +++ b/modular_darkpack/master_files/code/datums/station_traits/_station_trait.dm @@ -0,0 +1,4 @@ +/datum/station_trait + var/darkpack_allowed = FALSE // CITY_TRAITS + var/newspaper_message // CITY_TRAITS + var/newspaper_chance = 0 // CITY_TRAITS diff --git a/modular_darkpack/master_files/code/game/area/areas.dm b/modular_darkpack/master_files/code/game/area/areas.dm index 28d75958c18a..a99fb46f4b5d 100644 --- a/modular_darkpack/master_files/code/game/area/areas.dm +++ b/modular_darkpack/master_files/code/game/area/areas.dm @@ -1,3 +1,23 @@ /area var/fire_controled = FALSE var/fire_controling = FALSE + + // START - AMBIENCE + var/music_index + /// Equivelent to ambientsounds, A list of music tracks to pick from every so often to play to clients. + var/list/musictracks + ///Does this area immediately play a music track upon enter? + var/forced_music = FALSE + ///Used to decide what the minimum time between music tracks is + var/min_music_cooldown = 1 MINUTES + ///Used to decide what the maximum time between music tracks is + var/max_music_cooldown = 2 MINUTES + // END - AMBIENCE + +/area/Initialize(mapload) + // START - AMBIENCE + if(!musictracks) + musictracks = GLOB.music_assoc[music_index] + // END - AMBIENCE + + . = ..() diff --git a/modular_darkpack/master_files/code/game/objects/items/devices/radio/radio.dm b/modular_darkpack/master_files/code/game/objects/items/devices/radio/radio.dm new file mode 100644 index 000000000000..529f76ccd348 --- /dev/null +++ b/modular_darkpack/master_files/code/game/objects/items/devices/radio/radio.dm @@ -0,0 +1,9 @@ +/obj/item/radio + /// If the radio is connected to a network via a transceiver. + var/radio_network + /// The ID used to identify the radio on the network. + var/radio_id + +/obj/item/radio/examine(mob/user) + . = ..() + . += radio_network ? span_notice("Connected to [radio_network] using ID: [radio_id].") : span_warning("Not connected to any network.") diff --git a/modular_darkpack/master_files/code/game/objects/items/food/snacks.dm b/modular_darkpack/master_files/code/game/objects/items/food/snacks.dm new file mode 100644 index 000000000000..30ec1a433046 --- /dev/null +++ b/modular_darkpack/master_files/code/game/objects/items/food/snacks.dm @@ -0,0 +1,59 @@ +/obj/item/food/chips + name = "\improper \"Days\" chips" + desc = "\"Days\" chips... Crispy!" + icon_state = "crisps2" + icon = 'modular_darkpack/modules/food/icons/items.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/food/icons/food_onfloor.dmi') + w_class = WEIGHT_CLASS_SMALL + custom_price = 2 // ECONOMY + food_flags = FOOD_IN_CONTAINER | FOOD_BITE_SPRITE + preserved_food = TRUE + +/obj/item/food/chips/proc/open_crisps(mob/user) + to_chat(user, span_notice("You pull back the wrapper of \the [src].")) + playsound(user.loc, 'sound/items/foodcanopen.ogg', 50) + icon_state = "crisps1" + reagents.flags |= OPENCONTAINER + preserved_food = FALSE + +/obj/item/food/chips/attack_self(mob/user, modifiers) + if(!is_drainable()) + open_crisps(user) + return ..() + +/obj/item/food/chips/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) + if(!is_drainable()) + to_chat(user, span_warning("[src]'s wrapper hasn't been opened!")) + return FALSE + return ..() + +/obj/item/food/chips/shrimp + icon_state = "crisps2" + +/obj/item/food/chocolatebar + icon_state = "bar2" + icon = 'modular_darkpack/modules/food/icons/items.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/food/icons/food_onfloor.dmi') + custom_price = 1 + trash_type = /obj/item/trash/vampirebar + tastes = list("chocolate" = 1) + food_flags = FOOD_FINGER_FOOD|FOOD_BITE_SPRITE + preserved_food = TRUE + +/obj/item/food/chocolatebar/proc/open_bar(mob/user) + to_chat(user, span_notice("You pull back the wrapper of \the [src].")) + playsound(user.loc, 'sound/items/foodcanopen.ogg', 50) + icon_state = "bar1" + reagents.flags |= OPENCONTAINER + preserved_food = FALSE + +/obj/item/food/chocolatebar/attack_self(mob/user) + if(!is_drainable()) + open_bar(user) + return ..() + +/obj/item/food/chocolatebar/attack(mob/living/M, mob/user, def_zone) + if (!is_drainable()) + to_chat(user, span_warning("[src]'s wrapper hasn't been opened!")) + return FALSE + return ..() diff --git a/modular_darkpack/master_files/code/game/objects/items/storage/fancy.dm b/modular_darkpack/master_files/code/game/objects/items/storage/fancy.dm new file mode 100644 index 000000000000..b02dee0900cc --- /dev/null +++ b/modular_darkpack/master_files/code/game/objects/items/storage/fancy.dm @@ -0,0 +1,5 @@ +/obj/item/storage/fancy/egg_box + custom_price = COST_OF_EGGS // ECONOMY + +/obj/item/storage/fancy/candle_box + custom_price = 8 // ECONOMY diff --git a/modular_darkpack/master_files/code/game/objects/items/trash.dm b/modular_darkpack/master_files/code/game/objects/items/trash.dm new file mode 100644 index 000000000000..6c3290c9b326 --- /dev/null +++ b/modular_darkpack/master_files/code/game/objects/items/trash.dm @@ -0,0 +1,11 @@ +/obj/item/trash/chips + name = "chips wrapper" + icon_state = "crisps0" + icon = 'modular_darkpack/modules/food/icons/items.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/food/icons/food_onfloor.dmi') + +/obj/item/trash/shrimp_chips + name = "shrimp chips wrapper" + icon_state = "crisps0" + icon = 'modular_darkpack/modules/food/icons/items.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/food/icons/food_onfloor.dmi') diff --git a/modular_darkpack/master_files/code/game/objects/items/weaponry.dm b/modular_darkpack/master_files/code/game/objects/items/weaponry.dm new file mode 100644 index 000000000000..2db53d5f3a2a --- /dev/null +++ b/modular_darkpack/master_files/code/game/objects/items/weaponry.dm @@ -0,0 +1,3 @@ +/obj/item/phone/black + name = "black phone" + icon_state = "phone_black" diff --git a/modular_darkpack/master_files/code/game/objects/structures/flora.dm b/modular_darkpack/master_files/code/game/objects/structures/flora.dm new file mode 100644 index 000000000000..e5f8bcff59c8 --- /dev/null +++ b/modular_darkpack/master_files/code/game/objects/structures/flora.dm @@ -0,0 +1,9 @@ +/obj/structure/flora + /// How much fuel this provides to fires on its turf + var/fuel_power = 4 // TURF_FIRE + +/obj/structure/flora/tree + fuel_power = 1 // trees are more resistant to fire and take much longer to burn // TURF_FIRE + +/obj/structure/flora/rock + fuel_power = 0 // TURF_FIRE diff --git a/modular_darkpack/master_files/code/game/objects/structures/railings.dm b/modular_darkpack/master_files/code/game/objects/structures/railings.dm new file mode 100644 index 000000000000..28b2b348a4ce --- /dev/null +++ b/modular_darkpack/master_files/code/game/objects/structures/railings.dm @@ -0,0 +1,2 @@ +/obj/structure/railing/wooden_fence + icon = 'modular_darkpack/master_files/icons/obj/structures.dmi' diff --git a/modular_darkpack/master_files/code/game/objects/structures/stairs.dm b/modular_darkpack/master_files/code/game/objects/structures/stairs.dm new file mode 100644 index 000000000000..12d47d59c2c5 --- /dev/null +++ b/modular_darkpack/master_files/code/game/objects/structures/stairs.dm @@ -0,0 +1,16 @@ +/obj/structure/stairs/ramp + name = "ramp" + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "ramp" + +/obj/structure/stairs/ramp/north + dir = NORTH + +/obj/structure/stairs/ramp/south + dir = SOUTH + +/obj/structure/stairs/ramp/east + dir = EAST + +/obj/structure/stairs/ramp/west + dir = WEST diff --git a/modular_darkpack/master_files/code/game/turfs/open/_open.dm b/modular_darkpack/master_files/code/game/turfs/open/_open.dm new file mode 100644 index 000000000000..2fdac16734ea --- /dev/null +++ b/modular_darkpack/master_files/code/game/turfs/open/_open.dm @@ -0,0 +1,5 @@ +/turf/open + /// How much fuel this open turf provides to turf fires + var/flammability = 0.2 // TURF_FIRE + var/obj/effect/abstract/turf_fire/turf_fire // TURF_FIRE + diff --git a/modular_darkpack/master_files/code/game/turfs/open/floor/fancy_floor.dm b/modular_darkpack/master_files/code/game/turfs/open/floor/fancy_floor.dm new file mode 100644 index 000000000000..64edeca5233e --- /dev/null +++ b/modular_darkpack/master_files/code/game/turfs/open/floor/fancy_floor.dm @@ -0,0 +1,5 @@ +/turf/open/floor/wood + flammability = 2 // TURF_FIRE + +/turf/open/floor/carpet + flammability = 2 // TURF_FIRE diff --git a/modular_darkpack/master_files/code/game/turfs/open/snow.dm b/modular_darkpack/master_files/code/game/turfs/open/snow.dm new file mode 100644 index 000000000000..7ffbbacaf61a --- /dev/null +++ b/modular_darkpack/master_files/code/game/turfs/open/snow.dm @@ -0,0 +1,2 @@ +/turf/open/misc/snow + flammability = 0 // TURF_FIRE diff --git a/modular_darkpack/master_files/code/game/turfs/open/space/space.dm b/modular_darkpack/master_files/code/game/turfs/open/space/space.dm new file mode 100644 index 000000000000..5fb58b0cbf5b --- /dev/null +++ b/modular_darkpack/master_files/code/game/turfs/open/space/space.dm @@ -0,0 +1,6 @@ +/turf/open/space + name = CITY_NAME + light_power = 0.25 // CITY_TIME + light_range = 0.5 // CITY_TIME + + flammability = -INFINITY // not a single chance in hell // TURF_FIRE diff --git a/modular_darkpack/master_files/code/game/turfs/open/water.dm b/modular_darkpack/master_files/code/game/turfs/open/water.dm new file mode 100644 index 000000000000..c48517d21a12 --- /dev/null +++ b/modular_darkpack/master_files/code/game/turfs/open/water.dm @@ -0,0 +1,2 @@ +/turf/open/water + flammability = 0 // TURF_FIRE diff --git a/modular_darkpack/master_files/code/modules/client/preferences_savefile.dm b/modular_darkpack/master_files/code/modules/client/preferences_savefile.dm new file mode 100644 index 000000000000..d62d0d50fb99 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/client/preferences_savefile.dm @@ -0,0 +1,22 @@ +/datum/preferences + // List of known guestbook names we have saved + var/list/guestbook_names = list() + +/datum/preferences/load_character(slot) + . = ..() + var/tree_key = "character[slot]" + var/list/save_data = savefile.get_entry(tree_key) + + // We don't really need to do any validation since that's all done in the parent proc. + + guestbook_names = save_data?["guestbook_names"] + guestbook_names = SANITIZE_LIST(guestbook_names) + +/datum/preferences/save_character() + . = ..() + var/tree_key = "character[default_slot]" + if(!(tree_key in savefile.get_entry())) + savefile.set_entry(tree_key, list()) + var/save_data = savefile.get_entry(tree_key) + + save_data["guestbook_names"] = guestbook_names diff --git a/modular_darkpack/master_files/code/modules/fishing/sources/subtypes/structures.dm b/modular_darkpack/master_files/code/modules/fishing/sources/subtypes/structures.dm new file mode 100644 index 000000000000..de221109a11e --- /dev/null +++ b/modular_darkpack/master_files/code/modules/fishing/sources/subtypes/structures.dm @@ -0,0 +1,26 @@ +/datum/fish_source/moisture_trap + fish_table = list( + FISHING_DUD = 20, + /obj/effect/spawner/random/trash/garbage = 10, + /obj/effect/spawner/random/maintenance = 1, + ) + +/datum/fish_source/toilet + catalog_description = "City toilets" + fish_table = list( + FISHING_DUD = 10, + /obj/effect/spawner/random/trash/garbage = 10, + /obj/effect/spawner/random/maintenance = 3, + /obj/item/stack/dollar/rand = 2, + ) + fish_counts = list( + /obj/item/stack/dollar/rand = 2, + ) + +/datum/fish_source/deepfryer + fish_table = list( + /obj/item/food/badrecipe = 15, + /obj/item/food/nugget = 5, + ) + fish_counts = list() + fish_count_regen = list() diff --git a/modular_darkpack/master_files/code/modules/fishing/sources/subtypes/turfs.dm b/modular_darkpack/master_files/code/modules/fishing/sources/subtypes/turfs.dm new file mode 100644 index 000000000000..715a6d65ced8 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/fishing/sources/subtypes/turfs.dm @@ -0,0 +1,32 @@ +/datum/fish_source/ocean + fish_table = list( + FISHING_DUD = 10, + /obj/effect/spawner/random/trash/garbage = 2, + /obj/effect/spawner/message_in_a_bottle = 1, + /obj/item/coin/gold = 3, + /obj/item/fish/darkpack/tuna = 20, + /obj/item/fish/darkpack/crab = 5, + /obj/item/fish/darkpack/shark = 5, + ) + fish_counts = list( + ///obj/structure/mystery_box/fishing = 1, + ) + fish_count_regen = list( + ///obj/structure/mystery_box/fishing = 32 MINUTES, + ) + +/datum/fish_source/river + fish_table = list( + FISHING_DUD = 4, + /obj/effect/spawner/random/trash/garbage = 1, + /obj/item/fish/darkpack/catfish = 20, + ) + fish_counts = list() + fish_count_regen = list() + +/datum/fish_source/sand + fish_table = list( + FISHING_DUD = 15, + /obj/effect/spawner/random/trash/garbage = 5, + /obj/item/fish/darkpack/crab = 10, + ) diff --git a/modular_darkpack/master_files/code/modules/hydroponics/grown.dm b/modular_darkpack/master_files/code/modules/hydroponics/grown.dm new file mode 100644 index 000000000000..afd84152967a --- /dev/null +++ b/modular_darkpack/master_files/code/modules/hydroponics/grown.dm @@ -0,0 +1,2 @@ +/obj/item/food/grown + custom_price = 1 // ECONOMY diff --git a/modular_darkpack/master_files/code/modules/logging/log_stats_preferences.dm b/modular_darkpack/master_files/code/modules/logging/log_stats_preferences.dm new file mode 100644 index 000000000000..77c944bea8e3 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/logging/log_stats_preferences.dm @@ -0,0 +1,2 @@ +/datum/log_category/stats + category = LOG_CATEGORY_STATS diff --git a/modular_darkpack/master_files/code/modules/mob/dead/observer/observer.dm b/modular_darkpack/master_files/code/modules/mob/dead/observer/observer.dm new file mode 100644 index 000000000000..d09ca58068da --- /dev/null +++ b/modular_darkpack/master_files/code/modules/mob/dead/observer/observer.dm @@ -0,0 +1,6 @@ +/mob/dead/observer + var/soul_taken = FALSE //prevents necromancers from farming souls off one singular ghost + +/mob/dead/observer/Initialize(mapload) + . = ..() + AddComponent(/datum/component/aura) diff --git a/modular_darkpack/master_files/code/modules/mob/living/basic/farm_animals/deer/deer.dm b/modular_darkpack/master_files/code/modules/mob/living/basic/farm_animals/deer/deer.dm new file mode 100644 index 000000000000..75b60d5b9e12 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/mob/living/basic/farm_animals/deer/deer.dm @@ -0,0 +1,30 @@ +/mob/living/basic/deer + name = "deer" + desc = "A gentle, peaceful forest animal." + icon_state = "deer" + icon_living = "deer" + icon_dead = "deer_dead" + icon = 'modular_darkpack/modules/npc/icons/deer.dmi' + gender = PLURAL + var/antlers = FALSE + var/in_headlights = FALSE + +/mob/living/basic/deer/Initialize(mapload) + . = ..() + if(gender == MALE) + name = "buck" + if(prob(90)) + antlers = TRUE + else + name = "doe" + + update_appearance(UPDATE_OVERLAYS) + +/mob/living/basic/deer/update_overlays() + . = ..() + + if(antlers) + . += "antlers[(stat == DEAD) ? "_dead" : ""]_overlay" + + if(in_headlights && (stat != DEAD)) + . += "headlights_overlay" diff --git a/modular_darkpack/master_files/code/modules/mob/living/basic/vermin/space_bat.dm b/modular_darkpack/master_files/code/modules/mob/living/basic/vermin/space_bat.dm new file mode 100644 index 000000000000..832ed2c24f45 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/mob/living/basic/vermin/space_bat.dm @@ -0,0 +1,15 @@ +/mob/living/basic/bat + name = "bat" + desc = "It's a bat." + + basic_mob_flags = DEL_ON_DEATH + + attack_sound = 'modular_darkpack/modules/npc/sound/rat.ogg' + + maxHealth = 10 + health = 10 + speed = -0.5 + +/mob/living/basic/bat/Initialize(mapload) + . = ..() + AddComponent(/datum/component/clickbox, icon_state = "sphere", max_scale = 2) diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon.dm new file mode 100644 index 000000000000..2591ada46031 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon.dm @@ -0,0 +1,5 @@ +/mob/living/carbon/Destroy() + QDEL_NULL(suckbar) + suckbar_loc = null + GLOB.masquerade_breakers_list -= src + return ..() diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm index 02af60ad60a4..e4e35faf014c 100644 --- a/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm @@ -1,41 +1,9 @@ /mob/living/carbon var/chronological_age = 0 - - //Shitty VtM vars I'm moving here so they're not strewn around the codebase - var/datum/vampire_clan/clan - - var/last_repainted_mark - - ///Performs CPR on the target after a delay. //[Lucia] what does this mean? - var/last_cpr_exp = 0 - - var/dementia = FALSE - - //[Lucia] I have no clue why this is necessary, TODO: remove - var/mob/living/caster - - var/datum/job/JOB - var/last_loot_check = 0 - - var/phonevoicetag = 10 - - var/hided = FALSE - var/additional_hands = FALSE - var/additional_wings = FALSE - var/additional_centipede = FALSE - var/additional_armor = FALSE - var/image/suckbar var/atom/suckbar_loc - var/last_showed = 0 - var/last_raid = 0 var/killed_count = 0 - - bloodquality = 2 - - var/soul_state = SOUL_PRESENT - + var/fakediablerist = FALSE var/can_be_embraced = TRUE - - var/ooc_notes + bloodquality = 2 diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_movement.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_movement.dm deleted file mode 100644 index e899dd5438f2..000000000000 --- a/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_movement.dm +++ /dev/null @@ -1,21 +0,0 @@ -/mob/living/carbon/Move(atom/newloc, direct, glide_size_override) - if (ishuman(src)) - var/mob/living/carbon/human/H = src - H.update_shadow() - - // TODO: [Rebase] reimplement walls, also this handling could be improved - /* - if (HAS_TRAIT(src, TRAIT_RUBICON)) - if(istype(NewLoc, /turf/open/water/vamp_sewer)) - return - */ - - . = ..() - - // TODO: [Rebase] - face target - /* - if(combat_mode && client) - setDir(harm_focus) - else - harm_focus = dir - */ diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/examine.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/examine.dm new file mode 100644 index 000000000000..aa035d18cb44 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/examine.dm @@ -0,0 +1,37 @@ +/mob/living/carbon/proc/display_darkpack_examine_text() + if(obscured_slots & HIDEFACE) + return + + switch(get_clan()?.alt_sprite) + if("nosferatu") + . += span_warning("[p_They()] look[p_s()] utterly deformed and inhuman!
    ") + if("gargoyle") + . += span_warning("[p_They()] seem[p_s()] to be made out of stone!
    ") + if("kiasyd") + if (!is_eyes_covered()) + . += span_boldwarning("[p_They()] [p_have()] no whites in [p_their()] eyes!

    ") + if("rotten1") + . += span_warning("[p_They()] seem[p_s()] oddly gaunt.
    ") + if("rotten2") + . += span_warning("[p_They()] [p_have()] a corpselike complexion.
    ") + if("rotten3") + . += span_boldwarning("[p_They()] [p_are()] a decayed corpse!
    ") + if("rotten4") + . += span_boldwarning("[p_They()] [p_are()] a skeletonised corpse!

    ") + + if(iszomboid(src) && !(obscured_slots & HIDEFACE)) // for necromancy player-controlled zombies + . += span_danger("[p_They()] [p_are()] a decayed corpse!
    ") + + switch(st_get_stat(STAT_APPEARANCE)) + if(0) + . += span_bolddanger("AGHH!!! WHAT THE HELL IS THAT THING!!!") + if(1) + . += span_danger("Eugh. [p_They()] [p_are()] really ugly.") + if(2) + . += span_notice("[p_They()] [p_are()] about average looking.") + if(3) + . += span_nicegreen("[p_They()] [p_are()] quite nice looking!") + if(4) + . += span_purple("[p_They()] [p_are()] quite attractive!") + if(5) + . += span_rose(span_bold("Oh... My God... [p_They()] [p_are()] absolutely stunning! You find yourself blushing just looking at them.")) diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm index 284d7c35bb3c..21a811903677 100644 --- a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm @@ -1,61 +1,39 @@ /mob/living/carbon/human/death(gibbed) . = ..() - if(iskindred(src)) - SSmasquerade.dead_level = min(1000, SSmasquerade.dead_level+50) - else - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.zone_type == ZONE_MASQUERADE) - SSmasquerade.dead_level = max(0, SSmasquerade.dead_level-25) - - if(bloodhunted) - SSbloodhunt.hunted -= src - bloodhunted = FALSE - SSbloodhunt.update_shit() - var/witness_count - for(var/mob/living/carbon/human/npc/NEPIC in viewers(7, usr)) - if(NEPIC && NEPIC.stat != DEAD) - witness_count++ - if(witness_count > 1) - for(var/obj/item/police_radio/radio in GLOB.police_radios) - radio.announce_crime("murder", get_turf(src)) - for(var/obj/machinery/p25transceiver/police/radio in GLOB.p25_transceivers) - if(radio.p25_network == "police") - radio.announce_crime("murder", get_turf(src)) - break + SEND_SIGNAL(SSdcs, COMSIG_GLOB_REPORT_CRIME, CRIME_MURDER, get_turf(src)) GLOB.masquerade_breakers_list -= src GLOB.sabbatites -= src - if(iskindred(src)) - can_be_embraced = FALSE - var/obj/item/organ/brain/brain = getorganslot(ORGAN_SLOT_BRAIN) //NO REVIVAL EVER - if (brain) - brain.organ_flags |= ORGAN_FAILING + if(!iskindred(src)) + return + can_be_embraced = FALSE + var/obj/item/organ/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN) //NO REVIVAL EVER + if(brain) + brain.organ_flags |= ORGAN_FAILING - if(in_frenzy) - exit_frenzymod() - SEND_SOUND(src, sound('modular_darkpack/modules/deprecated/sounds/final_death.ogg', 0, 0, 50)) + /* + if(HAS_TRAIT(src, TRAIT_IN_FRENZY)) + exit_frenzymod() + */ + SEND_SOUND(src, sound('modular_darkpack/modules/kindred_species/sounds/final_death.ogg', 0, 0, 50)) - var/years_undead = chronological_age - age - switch (years_undead) - if (-INFINITY to 10) //normal corpse - return - if (10 to 50) - rot_body(1) //skin takes on a weird colouration - visible_message(span_notice("[src]'s skin loses some of its colour.")) - if (50 to 100) - rot_body(2) //looks slightly decayed - visible_message(span_notice("[src]'s skin rapidly decays.")) - if (100 to 150) - rot_body(3) //looks very decayed - visible_message(span_warning("[src]'s body rapidly decomposes!")) - if (150 to 200) - rot_body(4) //mummified skeletonised corpse - visible_message(span_warning("[src]'s body rapidly skeletonises!")) - if (200 to INFINITY) //turn to ash - playsound(src, 'modular_darkpack/modules/deprecated/sounds/burning_death.ogg', 80, TRUE) - lying_fix() - dir = SOUTH - INVOKE_ASYNC(src, TYPE_PROC_REF(/mob/living/carbon/human, dust), TRUE, TRUE) + switch (chronological_age) + if(-INFINITY to 10) //normal corpse + return + if(10 to 50) + rot_body(1) //skin takes on a weird colouration + visible_message(span_notice("[src]'s skin loses some of its colour.")) + if(50 to 100) + rot_body(2) //looks slightly decayed + visible_message(span_notice("[src]'s skin rapidly decays.")) + if(100 to 150) + rot_body(3) //looks very decayed + visible_message(span_warning("[src]'s body rapidly decomposes!")) + if(150 to 200) + rot_body(4) //mummified skeletonised corpse + visible_message(span_warning("[src]'s body rapidly skeletonises!")) + if(200 to INFINITY) //turn to ash + playsound(src, 'modular_darkpack/modules/kindred_species/sounds/burning_death.ogg', 80, TRUE) + dust(just_ash = TRUE, drop_items = TRUE, force = TRUE) diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human.dm new file mode 100644 index 000000000000..0dd7c8a1eb1e --- /dev/null +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human.dm @@ -0,0 +1,9 @@ +/mob/living/carbon/human/Topic(href, href_list) + // DARKPACK TODO - reimplement in a sane way. + if(href_list["masquerade_violation"]) + return + + if(href_list["masquerade_reinforcement"]) + return + + . = ..() diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human_defines.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human_defines.dm new file mode 100644 index 000000000000..c574ca36f1e1 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human_defines.dm @@ -0,0 +1,10 @@ +/mob/living/carbon/human + // NPC humans get the area of effect, player humans dont. + var/violation_aoe = FALSE + var/received_apartment_key = FALSE // i despise this but i suppose we need to make sure players get one apartment only. + // Visible adjectives, used for Guestbooks. + var/visible_adjective = "" + + // Humans have a default bloodpool of 10 + maxbloodpool = 10 + bloodpool = 10 diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/init_signals.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/init_signals.dm new file mode 100644 index 000000000000..efc32e1a5284 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/init_signals.dm @@ -0,0 +1,22 @@ +/mob/living/carbon/human/register_init_signals() + . = ..() + + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_STAKED), PROC_REF(on_staked)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_STAKED), PROC_REF(on_unstaked)) + RegisterSignal(src, COMSIG_MOB_CTRL_SHIFT_CLICKED, PROC_REF(attempt_guestbook_add)) + +/// Gaining [TRAIT_STAKED] forces us into torpor if we're kindred, and just murders us if we're not. +/mob/living/carbon/human/proc/on_staked(datum/source) + SIGNAL_HANDLER + + if(iskindred(src)) + torpor(STAKE_TRAIT, TRUE) + else + death() + +/// Losing [TRAIT_STAKED] forces us out of torpor if we're kindred. +/mob/living/carbon/human/proc/on_unstaked(datum/source) + SIGNAL_HANDLER + + if(iskindred(src)) + cure_torpor(STAKE_TRAIT, TRUE) diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm index 4bab3d5fcf5c..c07e09c82a6a 100644 --- a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/initialize.dm @@ -1,5 +1,6 @@ /mob/living/carbon/human/Initialize(mapload) . = ..() + //Initializes Jumping on the player AddComponent(/datum/component/jumper) - AddComponent(/datum/component/violation_observer, FALSE) + AddComponent(/datum/component/violation_observer, violation_aoe) diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/life.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/life.dm index 1d651b50c507..d4f52054d265 100644 --- a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/life.dm +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/life.dm @@ -1,39 +1,5 @@ /mob/living/carbon/human/Life() if(!iskindred(src)) if(prob(5)) - adjustAggLoss(-5, TRUE) - update_blood_hud() - update_zone_hud() - update_rage_hud() - update_shadow() - handle_vampire_music() - update_auspex_hud() - if(warrant) - last_nonraid = world.time - if(key) - if(stat != DEAD) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - last_showed = world.time - if(last_raid+600 < world.time) - last_raid = world.time - for(var/turf/open/O in range(1, src)) - if(prob(25)) - new /obj/effect/temp_visual/desant(O) - playsound(loc, 'modular_darkpack/modules/deprecated/sounds/helicopter.ogg', 50, TRUE) - if(last_showed+9000 < world.time) - to_chat(src, "POLICE STOPPED SEARCHING") - SEND_SOUND(src, sound('modular_darkpack/modules/deprecated/sounds/humanity_gain.ogg', 0, 0, 75)) - killed_count = 0 - warrant = FALSE - else - warrant = FALSE - else - warrant = FALSE - else - if(last_nonraid+1800 < world.time) - last_nonraid = world.time - killed_count = max(0, killed_count-1) - + adjust_agg_loss(-5, TRUE) . = ..() diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/species_types/zombies.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/species_types/zombies.dm new file mode 100644 index 000000000000..dffdfdd5f2ab --- /dev/null +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -0,0 +1,49 @@ +#define REGENERATION_DELAY 60 // After taking damage, how long it takes for automatic regeneration to begin + +/datum/species/zombie + name = "Zombie" + id = "zombie" + inherent_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_LIMBATTACHMENT, TRAIT_VIRUSIMMUNE, TRAIT_NOBLOOD, TRAIT_NOHUNGER, TRAIT_NOBREATH, TRAIT_TOXIMMUNE, TRAIT_NOCRITDAMAGE, TRAIT_FAKEDEATH) + //mutantbrain = /obj/item/organ/brain/vampire //to prevent brain transplant surgery + //mutanteyes = /obj/item/organ/eyes/night_vision/zombie + heatmod = 1 + mutanttongue = /obj/item/organ/tongue + +/datum/species/zombie/check_roundstart_eligible() + return FALSE + +/datum/species/zombie/on_species_gain(mob/living/carbon/human/C) + ..() + C.skin_tone = "albino" + C.hairstyle = "Bald" + C.update_body_parts() + C.update_body(0) + + C.set_body_sprite("rotten2") + + C.maxHealth = 300 //tanky + C.health = 300 + + /* // DARKPACK TODO -- kj shit? + C.yang_chi = 0 + C.max_yang_chi = 0 + C.yin_chi = 6 + C.max_yin_chi = 6 + */ + + //zombies resist vampire bites better than mortals + RegisterSignal(C, COMSIG_MOB_VAMPIRE_SUCKED, PROC_REF(on_zombie_bitten)) + ADD_TRAIT(C, TRAIT_MASQUERADE_VIOLATING_FACE, "zombie") + +/datum/species/zombie/proc/on_zombie_bitten(datum/source, mob/living/carbon/being_bitten) + SIGNAL_HANDLER + + if(iszombie(being_bitten)) + return COMPONENT_RESIST_VAMPIRE_KISS + +// wtf is this? it applies the kiss status effect? +///datum/species/ghoul/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + //. = ..() + //UnregisterSignal(C, COMSIG_MOB_VAMPIRE_SUCKED) + +#undef REGENERATION_DELAY diff --git a/modular_darkpack/master_files/code/modules/mob/living/init_signals.dm b/modular_darkpack/master_files/code/modules/mob/living/init_signals.dm new file mode 100644 index 000000000000..6d93d431983a --- /dev/null +++ b/modular_darkpack/master_files/code/modules/mob/living/init_signals.dm @@ -0,0 +1,12 @@ +/mob/living/register_init_signals() + . = ..() + RegisterSignal(src, COMSIG_ENTER_AREA, PROC_REF(update_zone_hud)) + +/mob/living/proc/update_zone_hud(mob/source, area/new_area) + SIGNAL_HANDLER + + if(hud_used?.zone_icon) + if(!istype(new_area, /area/vtm)) + return + var/area/vtm/our_area = new_area + hud_used.zone_icon.icon_state = "[our_area.zone_type]" diff --git a/modular_darkpack/master_files/code/modules/mob/living/living.dm b/modular_darkpack/master_files/code/modules/mob/living/living.dm index 39f2a636f4f0..5bf01e8aff80 100644 --- a/modular_darkpack/master_files/code/modules/mob/living/living.dm +++ b/modular_darkpack/master_files/code/modules/mob/living/living.dm @@ -1,6 +1,24 @@ -/mob/living - COOLDOWN_DECLARE(masquerade_timer) - /mob/living/Initialize(mapload) . = ..() - storyteller_stat_holder = new() // STORYTELLER_STATS + storyteller_stats = create_new_stat_prefs(storyteller_stats) + AddComponent(/datum/component/aura) + become_area_sensitive("zone_hud") + update_zone_hud(src, get_area(src)) + +/mob/living/Destroy() + lastattacked = null + drunked_of = null + storyteller_stats = null + beastmaster_minions = null + minion_command_components = null + grabbed_by_tentacle = null + QDEL_LAZYLIST(splats) + return ..() + +/mob/living/set_pull_offsets(mob/living/mob_to_set, grab_state = GRAB_PASSIVE, animate = TRUE) + . = ..() + SEND_SIGNAL(mob_to_set, COMSIG_LIVING_SET_PULL_OFFSET) + +/mob/living/reset_pull_offsets(mob/living/M, override) + . = ..() + SEND_SIGNAL(M, COMSIG_LIVING_RESET_PULL_OFFSETS) diff --git a/modular_darkpack/master_files/code/modules/mob/living/living_defines.dm b/modular_darkpack/master_files/code/modules/mob/living/living_defines.dm index 2f90c1000d75..7041061670f8 100644 --- a/modular_darkpack/master_files/code/modules/mob/living/living_defines.dm +++ b/modular_darkpack/master_files/code/modules/mob/living/living_defines.dm @@ -5,78 +5,48 @@ var/list/drunked_of = list() - var/total_cleaned = 0 - - var/info_known - - var/last_message - var/total_erp = 0 - - var/experience_plus = 0 var/discipline_time_plus = 0 var/bloodpower_time_plus = 0 var/thaum_damage_plus = 0 var/resistant_to_disciplines = FALSE - var/auspex_examine = FALSE var/dancing = FALSE - var/temporis_visual = FALSE - var/temporis_blur = FALSE - var/frenzy_chance_boost = 10 - var/last_bloodpool_restore = 0 - - var/list/knowscontacts = list() - - var/mysticism_knowledge = FALSE - - var/thaumaturgy_knowledge = FALSE - - var/elysium_checks = 0 - var/bloodhunted = FALSE - - var/stakeimmune = FALSE - - var/isfishing = FALSE - - var/mob/parrying = null - var/parry_class = WEIGHT_CLASS_TINY - var/parry_cd = 0 - var/blocking = FALSE - var/last_move_intent = MOVE_INTENT_RUN COOLDOWN_DECLARE(drinkblood_use_cd) COOLDOWN_DECLARE(drinkblood_click_cd) - var/last_bloodpower_click = 0 - - var/harm_focus = SOUTH - var/flavor_text - var/true_real_name - var/died_already = FALSE - var/bloodpool = 5 var/maxbloodpool = 5 - var/generation = 13 var/humanity = 7 var/masquerade_score = 5 - var/last_nonraid = 0 var/warrant = FALSE var/ignores_warrant = FALSE - var/obj/overlay/gnosis - - var/total_contracted = 0 - - ///If this mob can strip people from range with a delay of 0.1 seconds. Currently only activated by Mytherceria 2. - var/enhanced_strip = FALSE - //Damage related vars, NOTE: THESE SHOULD ONLY BE MODIFIED BY PROCS ///Aggravated damage caused by supernatural attacks. var/aggloss = 0 - var/datum/storyteller_stats/storyteller_stat_holder - // TODO, replace with social/leadership - var/more_companions = 0 + var/list/storyteller_stats = list() + + //beastmaster + var/list/beastmaster_minions = list() + var/list/datum/component/obeys_commands/minion_command_components = list() + + var/obj/grabbed_by_tentacle = null + var/escape_attempt = 0 + var/tentacle_aggro_mode = "Aggressive" + var/possessed = FALSE //dominate 5 body posession + var/datum/weakref/conditioner // dominate 4 + //obfuscate icon, client side + var/obf_icons + + COOLDOWN_DECLARE(masquerade_timer) + //thaumaturgy & necro path stuff + var/research_points = 0 + var/collected_souls = 0 + + /// List of supernatural types that this mob is part of + var/list/datum/splat/splats diff --git a/modular_darkpack/master_files/code/modules/mob/living/living_movement.dm b/modular_darkpack/master_files/code/modules/mob/living/living_movement.dm new file mode 100644 index 000000000000..a2efb7be0ec5 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/mob/living/living_movement.dm @@ -0,0 +1,4 @@ +/mob/living/CanAllowThrough(atom/movable/mover, border_dir) + if(SEND_SIGNAL(src, COMSIG_LIVING_CAN_ALLOW_THROUGH, mover, border_dir) & COMPONENT_LIVING_PASSABLE) + return TRUE + return ..() diff --git a/modular_darkpack/master_files/code/modules/paperwork/fax.dm b/modular_darkpack/master_files/code/modules/paperwork/fax.dm index e7176803999b..198e31513c8d 100644 --- a/modular_darkpack/master_files/code/modules/paperwork/fax.dm +++ b/modular_darkpack/master_files/code/modules/paperwork/fax.dm @@ -5,7 +5,7 @@ camarillaadmin = list(fax_name = "High Council", fax_id = "camarillaadmin", color = "teal", emag_needed = TRUE), anarchsadmin = list(fax_name = "Free State Movement", fax_id = "anarchsadmin", color = "red", emag_needed = TRUE), policeadmin = list(fax_name = "Federal Government", fax_id = "policeadmin", color = "blue", emag_needed = TRUE), - endronadmin = list(fax_name = "Pentex Corporate", fax_id = "endronadmin", color = "green", emag_needed = TRUE), + endronadmin = list(fax_name = EVIL_COMPANY + " Corporate", fax_id = "endronadmin", color = "green", emag_needed = TRUE), aasimitesadmin = list(fax_name = "Element Relay", fax_id = "aasimitesadmin", color = "purple", emag_needed = TRUE), glasswalkeradmin = list(fax_name = "Nightwolf Corporate", fax_id = "glasswalkeradmin", color = "grey", emag_needed = TRUE), ) @@ -22,8 +22,12 @@ fax_name = "Federal Government" fax_id = "policeadmin" +/obj/machinery/fax/admin/fbi + fax_name = "FBI National Headquarters" + fax_id = "fbi" + /obj/machinery/fax/admin/endron - fax_name = "Pentex Corporate" + fax_name = EVIL_COMPANY + " Corporate" fax_id = "endronadmin" /obj/machinery/fax/admin/aasimites @@ -49,14 +53,14 @@ special_networks = list(anarchsadmin = list(fax_name = "Free State Movement", fax_id = "anarchsadmin", color = "red", emag_needed = FALSE)) /obj/machinery/fax/police - fax_name = "San Francisco Police Department" + fax_name = CITY_POLICE_DEPARTMENT fax_id = "police" special_networks = list(policeadmin = list(fax_name = "Federal Government", fax_id = "policeadmin", color = "blue", emag_needed = FALSE)) /obj/machinery/fax/endron - fax_name = "Endron International HQ" + fax_name = MAIN_EVIL_COMPANY + " HQ" fax_id = "endron" - special_networks = list(endronadmim = list(fax_name = "Pentex Corporate", fax_id = "endronadmin", color = "green", emag_needed = FALSE)) + special_networks = list(endronadmim = list(fax_name = EVIL_COMPANY + " Corporate", fax_id = "endronadmin", color = "green", emag_needed = FALSE)) /obj/machinery/fax/aasimites fax_name = "Chubby Lion Coffee Shop" diff --git a/modular_darkpack/master_files/code/modules/power/lighting/lighting_mapping_helpers.dm b/modular_darkpack/master_files/code/modules/power/lighting/lighting_mapping_helpers.dm new file mode 100644 index 000000000000..b9b135b466f1 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/power/lighting/lighting_mapping_helpers.dm @@ -0,0 +1,4 @@ +/obj/machinery/light/floor + brightness = 8 + nightshift_brightness = 8 + fire_brightness = 9 diff --git a/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune.dm b/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune.dm new file mode 100644 index 000000000000..c9a695034ef0 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune.dm @@ -0,0 +1,77 @@ +//parent rune type for thaumaturgy, necromancy, obtenebration +/obj/ritual_rune + abstract_type = /obj/ritual_rune + name = "ritual rune" + desc = "A mystical rune." + icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' + icon_state = "rune1" + anchored = TRUE + + var/word = "IDI NAH" + var/activator_bonus = 0 + var/activated = FALSE + var/mob/living/last_activator + var/level = 1 + var/list/sacrifices = list() + var/activation_color + var/cost = 2 + var/ritual_name + + // TRAIT_MYSTICISM_KNOWLEDGE, TRAIT_THAUMATURGY_KNOWLEDGE, TRAIT_NECROMANCY_KNOWLEDGE + var/required_trait + + +/obj/ritual_rune/Initialize(mapload) + . = ..() + ritual_name = name + name = "[name] rune" + RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_alt_click)) + +/obj/ritual_rune/proc/on_alt_click(datum/source, mob/user) + SIGNAL_HANDLER + qdel(src) + +/obj/ritual_rune/proc/complete() + return + +/obj/ritual_rune/attack_hand(mob/user) + if(activated) + return + + if(!required_trait || !HAS_TRAIT(user, required_trait)) + return + + var/mob/living/L = user + L.say(word) + L.Immobilize(30) + last_activator = user + if(activation_color) + animate(src, color = activation_color, time = 10) + if(length(sacrifices)) + if(!check_and_consume_sacrifices(user)) + return + + complete() + +/obj/ritual_rune/proc/check_and_consume_sacrifices(mob/user) + var/list/found_items = list() + + for(var/obj/item/I in get_turf(src)) + for(var/item_type in sacrifices) + if(istype(I, item_type)) + if(istype(I, /obj/item/reagent_containers/blood)) + var/obj/item/reagent_containers/blood/bloodpack = I + if(bloodpack.reagents && bloodpack.reagents.total_volume > 0) + found_items += I + break + else + found_items += I + break + + if(found_items.len == sacrifices.len) + for(var/obj/item/I in found_items) + qdel(I) + return TRUE + else + to_chat(user, span_warning("You lack the necessary sacrifices to complete the ritual. Found [found_items.len], required [sacrifices.len].")) + return FALSE diff --git a/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune_drawing.dm b/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune_drawing.dm new file mode 100644 index 000000000000..d12162f03e49 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune_drawing.dm @@ -0,0 +1,78 @@ +/datum/action/ritual_drawing + name = "Ritual Drawing" + desc = "Draw mystical runes." + button_icon = 'modular_darkpack/master_files/icons/hud/actions.dmi' + check_flags = AB_CHECK_HANDS_BLOCKED | AB_CHECK_IMMOBILE | AB_CHECK_LYING | AB_CHECK_CONSCIOUS + vampiric = TRUE + + var/drawing = FALSE + var/level = 1 + + //ritual_rune/abyss, ritual_rune/thaumaturgy, etc + var/rune_type + //such as /obj/item/ritual_tome/abyss, /obj/item/ritual_tome/arcane, etc + var/tome_type + //stat to use for rune drawing speed + var/speed_stat = STAT_OCCULT + +/datum/action/ritual_drawing/Trigger(trigger_flags) + . = ..() + if(!rune_type || !tome_type) + stack_trace("[type] has no rune_type or tome_type set!") + return + + var/mob/living/carbon/human/H = owner + if(drawing) + return + + var/has_tome = istype(H.get_active_held_item(), tome_type) + var/list/available_runes = get_available_runes() + + if(!length(available_runes)) + to_chat(H, span_warning("You don't know any runes!")) + return + + var/chosen_rune = select_rune(H, available_runes, has_tome) + if(!chosen_rune) + return + + var/list/rune_data = available_runes[chosen_rune] + var/rune_cost = rune_data["cost"] + + if(H.bloodpool < rune_cost) + to_chat(H, span_warning("You need more BLOOD to do that!")) + return + + draw_rune(H, rune_data) + +/datum/action/ritual_drawing/proc/get_available_runes() + var/list/runes = list() + for(var/rune_path in subtypesof(rune_type)) + var/obj/ritual_rune/R = new rune_path(owner) + if(R.level <= level) + runes[R.ritual_name] = list("path" = rune_path, "cost" = R.cost) + qdel(R) + return runes + +/datum/action/ritual_drawing/proc/select_rune(mob/living/carbon/human/user, list/available_runes, has_tome) + if(has_tome) + return tgui_input_list(user, "Choose rune to draw:", name, available_runes) + else + var/random = tgui_input_list(user, "Choose rune to draw (Without a tome, you can only draw random runes...):", name, list("???")) + if(random) + return pick(available_runes) + return null + +/datum/action/ritual_drawing/proc/draw_rune(mob/living/carbon/human/user, list/rune_data) + var/rune_path = rune_data["path"] + var/rune_cost = rune_data["cost"] + + drawing = TRUE + var/draw_time = 3 SECONDS * max(1, 5 - user.st_get_stat(speed_stat)) + + if(do_after(user, draw_time, user)) + new rune_path(user.loc) + user.bloodpool = max(user.bloodpool - rune_cost, 0) + SEND_SIGNAL(user, COMSIG_MASQUERADE_VIOLATION) + + drawing = FALSE diff --git a/modular_darkpack/master_files/code/modules/rituals/code/ritual_tome.dm b/modular_darkpack/master_files/code/modules/rituals/code/ritual_tome.dm new file mode 100644 index 000000000000..1e5330f3e603 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/rituals/code/ritual_tome.dm @@ -0,0 +1,63 @@ +//the parent type of necromancy, arcane, abyss mysticism tomes +/obj/item/ritual_tome + abstract_type = /obj/item/ritual_tome + name = "ritual tome" + desc = "A mysterious tome. This shouldnt be spawning ingame, if it is, something's wrong." + w_class = WEIGHT_CLASS_SMALL + custom_materials = list(/datum/material/paper = SHEET_MATERIAL_AMOUNT * 0.75) + var/list/rituals = list() + var/rune_type //ritual_rune/abyss, ritual_rune/thaumaturgy, etc + var/static/list/ritual_cache = list() + +/obj/item/ritual_tome/Initialize() + . = ..() + if(!rune_type) + return + + if(!ritual_cache[rune_type]) + ritual_cache[rune_type] = list() + for(var/rune_path in subtypesof(rune_type)) + var/obj/R = new rune_path() + ritual_cache[rune_type] += R + + rituals = ritual_cache[rune_type] + +/obj/item/ritual_tome/attack_self(mob/user) + . = ..() + if(!isliving(user)) + return + var/mob/living/reader = user + if(!iskindred(user) && !isghoul(user)) + if(reader.st_get_stat(STAT_OCCULT) < 3) + to_chat(reader, span_cult("A strange book that looks like it belongs in a dusty Library or a garage sale. You find yourself not caring, or understanding, too much about it.")) + return + + display_rituals(reader) + +/obj/item/ritual_tome/proc/display_rituals(mob/user) + for(var/obj/ritual_rune/R in rituals) + var/requirements = get_ritual_requirements(R) + var/level = get_ritual_level(R) + var/ritual_name = R.ritual_name + var/ritual_desc = R.desc + + to_chat(user, span_cult("[level] [ritual_name] - [ritual_desc][requirements ? " Requirements: [requirements]." : ""]")) + +/obj/item/ritual_tome/proc/get_ritual_requirements(obj/rune) + if(!islist(rune.vars["sacrifices"])) + return "" + + var/list/sacrifices = rune.vars["sacrifices"] + if(!length(sacrifices)) + return "" + + var/list/required_items = list() + for(var/obj/item/item_type as anything in sacrifices) + required_items += item_type::name + + return required_items.Join("\n") + +/obj/item/ritual_tome/proc/get_ritual_level(obj/rune) + if(rune.vars["level"]) + return rune.vars["level"] + return "" diff --git a/modular_darkpack/master_files/code/modules/vending/cola.dm b/modular_darkpack/master_files/code/modules/vending/cola.dm new file mode 100644 index 000000000000..5382ca4ab5e9 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/vending/cola.dm @@ -0,0 +1,63 @@ +/obj/machinery/vending/cola + icon_state = "cola_red" + icon = 'modular_darkpack/modules/retail/icons/vendors_shops.dmi' + light_mask = "cola-light-mask" + products = list( + /obj/item/reagent_containers/cup/soda_cans/vampirecola = 20, + /obj/item/reagent_containers/cup/soda_cans/vampirecola/blue = 10, + /obj/item/reagent_containers/cup/glass/waterbottle = 10, // TODO: Resprite + ) + contraband = list() + premium = list() + +/obj/machinery/vending/cola/blue + icon_state = "cola_blue" + light_mask = "cola-light-mask" + light_color = COLOR_MODERATE_BLUE + +/obj/machinery/vending/cola/black + icon_state = "cola_black" + light_mask = "cola-light-mask" + +/obj/machinery/vending/cola/red + icon_state = "cola_red" + light_mask = "cola-light-mask" + light_color = COLOR_DARK_RED + +/obj/machinery/vending/cola/space_up + icon_state = "cola_red" + light_mask = "cola-light-mask" + light_color = COLOR_DARK_RED + +// Bloodlines Refrence +/obj/machinery/vending/cola/starkist + name = "\improper 13 Vitamins Vendor" + desc = "13 stimulants in every bottle!!!" + icon_state = "thirteen" + light_mask = "front_cola-light-mask" + light_color = COLOR_YELLOW + products = list( + /obj/item/reagent_containers/cup/soda_cans/thirteenloko = 30, // TODO: Resprite + ) + premium = list( + /obj/item/reagent_containers/cup/soda_cans/monkey_energy = 10, // TODO: Resprite + /obj/item/reagent_containers/cup/soda_cans/grey_bull = 5, // TODO: Resprite + ) + +/obj/machinery/vending/cola/sodie + icon_state = "cola_red" + light_mask = "cola-light-mask" + light_color = COLOR_DARK_RED + +// Bloodlines Refrence +/obj/machinery/vending/cola/pwr_game + name = "\improper Liquid Demon Seed Vendor" + desc = "Slobber it DOWN!!" + icon_state = "demon_seed" + light_mask = "front_cola-light-mask" + +/obj/machinery/vending/cola/shamblers + name = "\improper Yumco Vendor" + icon_state = "yumco" + light_mask = "yumco-light-mask" + light_color = COLOR_YELLOW diff --git a/modular_darkpack/master_files/code/modules/vending/snack.dm b/modular_darkpack/master_files/code/modules/vending/snack.dm new file mode 100644 index 000000000000..93476d233df2 --- /dev/null +++ b/modular_darkpack/master_files/code/modules/vending/snack.dm @@ -0,0 +1,10 @@ +/obj/machinery/vending/snack + icon = 'modular_darkpack/modules/retail/icons/vendors_shops.dmi' + products = list( + /obj/item/food/chocolatebar = 25, + /obj/item/food/chips = 20, + // /obj/item/reagent_containers/cup/glass/dry_ramen = 10, // TODO: Resprite + // /obj/item/storage/box/gum = 10 // TODO: Resprite + ) + contraband = list() + premium = list() diff --git a/modular_darkpack/master_files/code/turfs/open/grass.dm b/modular_darkpack/master_files/code/turfs/open/grass.dm new file mode 100644 index 000000000000..4a17bbfe07ee --- /dev/null +++ b/modular_darkpack/master_files/code/turfs/open/grass.dm @@ -0,0 +1,26 @@ + +// consider just fully removing these, it overlaps with FOOTSTEP_GRASS very hard +// footstep = FOOTSTEP_TRAVA +// barefootstep = FOOTSTEP_TRAVA + +/turf/open/misc/grass + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + smooth_icon = 'icons/obj/smooth_structures/darkpack/floor/grass.dmi' + //icon_state = "grass1" + + baseturfs = /turf/open/misc/dirt + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + planetary_atmos = TRUE + +/turf/open/misc/grass/Initialize(mapload) + . = ..() + // icon_state = "grass[rand(1, 3)]" + var/area/my_area = loc + if(my_area.outdoors) + if(check_holidays(FESTIVE_SEASON)) + //initial_gas_mix = WINTER_DEFAULT_ATMOS + //icon_state = "snow[rand(1, 14)]" + new /obj/effect/decal/snow_overlay(src) + footstep = FOOTSTEP_SNOW + barefootstep = FOOTSTEP_SNOW + heavyfootstep = FOOTSTEP_SNOW diff --git a/modular_darkpack/master_files/code/turfs/open/planet.dm b/modular_darkpack/master_files/code/turfs/open/planet.dm new file mode 100644 index 000000000000..be4e9c4d07b6 --- /dev/null +++ b/modular_darkpack/master_files/code/turfs/open/planet.dm @@ -0,0 +1,4 @@ +/turf/open/misc/dirt + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + baseturfs = /turf/baseturf_bottom + initial_gas_mix = OPENTURF_DEFAULT_ATMOS diff --git a/modular_darkpack/master_files/icons/hud/64x16_actions.dmi b/modular_darkpack/master_files/icons/hud/64x16_actions.dmi new file mode 100644 index 000000000000..a26262723403 Binary files /dev/null and b/modular_darkpack/master_files/icons/hud/64x16_actions.dmi differ diff --git a/modular_darkpack/master_files/icons/hud/actions.dmi b/modular_darkpack/master_files/icons/hud/actions.dmi index 33db429960b0..fbca9db38958 100644 Binary files a/modular_darkpack/master_files/icons/hud/actions.dmi and b/modular_darkpack/master_files/icons/hud/actions.dmi differ diff --git a/modular_darkpack/master_files/icons/hud/lobby/background.dmi b/modular_darkpack/master_files/icons/hud/lobby/background.dmi new file mode 100644 index 000000000000..447ea0515f01 Binary files /dev/null and b/modular_darkpack/master_files/icons/hud/lobby/background.dmi differ diff --git a/modular_darkpack/master_files/icons/hud/lobby/background_cropped.dmi b/modular_darkpack/master_files/icons/hud/lobby/background_cropped.dmi new file mode 100644 index 000000000000..441f7a6f8e2c Binary files /dev/null and b/modular_darkpack/master_files/icons/hud/lobby/background_cropped.dmi differ diff --git a/modular_darkpack/master_files/icons/hud/lobby/bottom_buttons.dmi b/modular_darkpack/master_files/icons/hud/lobby/bottom_buttons.dmi new file mode 100644 index 000000000000..c7eb8bd68989 Binary files /dev/null and b/modular_darkpack/master_files/icons/hud/lobby/bottom_buttons.dmi differ diff --git a/modular_darkpack/master_files/icons/hud/lobby/character_setup.dmi b/modular_darkpack/master_files/icons/hud/lobby/character_setup.dmi new file mode 100644 index 000000000000..ccefbeaff6b6 Binary files /dev/null and b/modular_darkpack/master_files/icons/hud/lobby/character_setup.dmi differ diff --git a/modular_darkpack/master_files/icons/hud/lobby/join.dmi b/modular_darkpack/master_files/icons/hud/lobby/join.dmi new file mode 100644 index 000000000000..22a88e7e3a95 Binary files /dev/null and b/modular_darkpack/master_files/icons/hud/lobby/join.dmi differ diff --git a/modular_darkpack/master_files/icons/hud/lobby/observe.dmi b/modular_darkpack/master_files/icons/hud/lobby/observe.dmi new file mode 100644 index 000000000000..97a33c1053e1 Binary files /dev/null and b/modular_darkpack/master_files/icons/hud/lobby/observe.dmi differ diff --git a/modular_darkpack/master_files/icons/hud/lobby/ready.dmi b/modular_darkpack/master_files/icons/hud/lobby/ready.dmi new file mode 100644 index 000000000000..8f7f32dedf00 Binary files /dev/null and b/modular_darkpack/master_files/icons/hud/lobby/ready.dmi differ diff --git a/modular_darkpack/master_files/icons/hud/lobby/start_now.dmi b/modular_darkpack/master_files/icons/hud/lobby/start_now.dmi new file mode 100644 index 000000000000..84d22e4e2f40 Binary files /dev/null and b/modular_darkpack/master_files/icons/hud/lobby/start_now.dmi differ diff --git a/modular_darkpack/master_files/icons/hud/screen_darkness_new.dmi b/modular_darkpack/master_files/icons/hud/screen_darkness_new.dmi index e692a5d359cb..525f7077e656 100644 Binary files a/modular_darkpack/master_files/icons/hud/screen_darkness_new.dmi and b/modular_darkpack/master_files/icons/hud/screen_darkness_new.dmi differ diff --git a/modular_darkpack/master_files/icons/hud/screen_pentexknox.dmi b/modular_darkpack/master_files/icons/hud/screen_pentexknox.dmi new file mode 100644 index 000000000000..ecec626fe3d2 Binary files /dev/null and b/modular_darkpack/master_files/icons/hud/screen_pentexknox.dmi differ diff --git a/modular_darkpack/master_files/icons/mob/human/human_face.dmi b/modular_darkpack/master_files/icons/mob/human/human_face.dmi new file mode 100644 index 000000000000..4e9992b2ca93 Binary files /dev/null and b/modular_darkpack/master_files/icons/mob/human/human_face.dmi differ diff --git a/modular_darkpack/master_files/icons/mob/rideables/vehicles.dmi b/modular_darkpack/master_files/icons/mob/rideables/vehicles.dmi new file mode 100644 index 000000000000..3a28b9b6af58 Binary files /dev/null and b/modular_darkpack/master_files/icons/mob/rideables/vehicles.dmi differ diff --git a/modular_darkpack/master_files/icons/mobs/simple/pets.dmi b/modular_darkpack/master_files/icons/mobs/simple/pets.dmi index 46391be8238e..565a6d7f60fb 100644 Binary files a/modular_darkpack/master_files/icons/mobs/simple/pets.dmi and b/modular_darkpack/master_files/icons/mobs/simple/pets.dmi differ diff --git a/modular_darkpack/master_files/icons/obj/fluff/flora/plants.dmi b/modular_darkpack/master_files/icons/obj/fluff/flora/plants.dmi new file mode 100644 index 000000000000..b19caf6836a6 Binary files /dev/null and b/modular_darkpack/master_files/icons/obj/fluff/flora/plants.dmi differ diff --git a/modular_darkpack/master_files/icons/obj/lighting.dmi b/modular_darkpack/master_files/icons/obj/lighting.dmi index 1b6c507b83c0..d6a223b1c4d1 100644 Binary files a/modular_darkpack/master_files/icons/obj/lighting.dmi and b/modular_darkpack/master_files/icons/obj/lighting.dmi differ diff --git a/modular_darkpack/master_files/icons/obj/lighting_onfoor.dmi b/modular_darkpack/master_files/icons/obj/lighting_onfoor.dmi new file mode 100644 index 000000000000..ad8f0e0308f1 Binary files /dev/null and b/modular_darkpack/master_files/icons/obj/lighting_onfoor.dmi differ diff --git a/modular_darkpack/master_files/icons/obj/service/hydroponics/equipment.dmi b/modular_darkpack/master_files/icons/obj/service/hydroponics/equipment.dmi index 7558082800bb..405cb37835a6 100644 Binary files a/modular_darkpack/master_files/icons/obj/service/hydroponics/equipment.dmi and b/modular_darkpack/master_files/icons/obj/service/hydroponics/equipment.dmi differ diff --git a/modular_darkpack/master_files/icons/obj/storage/crates32x32.dmi b/modular_darkpack/master_files/icons/obj/storage/crates32x32.dmi index 7d4c0d056980..96705265b7ff 100644 Binary files a/modular_darkpack/master_files/icons/obj/storage/crates32x32.dmi and b/modular_darkpack/master_files/icons/obj/storage/crates32x32.dmi differ diff --git a/modular_darkpack/master_files/icons/obj/structures.dmi b/modular_darkpack/master_files/icons/obj/structures.dmi new file mode 100644 index 000000000000..19d5a5b90fcf Binary files /dev/null and b/modular_darkpack/master_files/icons/obj/structures.dmi differ diff --git a/modular_darkpack/master_files/icons/obj/tram/tram_rails.dmi b/modular_darkpack/master_files/icons/obj/tram/tram_rails.dmi new file mode 100644 index 000000000000..ab88229daca6 Binary files /dev/null and b/modular_darkpack/master_files/icons/obj/tram/tram_rails.dmi differ diff --git a/modular_darkpack/master_files/icons/obj/wallmounts32x48.dmi b/modular_darkpack/master_files/icons/obj/wallmounts32x48.dmi index 903350abb220..84c1dd89451a 100644 Binary files a/modular_darkpack/master_files/icons/obj/wallmounts32x48.dmi and b/modular_darkpack/master_files/icons/obj/wallmounts32x48.dmi differ diff --git a/modular_darkpack/master_files/icons/obj/watercloset.dmi b/modular_darkpack/master_files/icons/obj/watercloset.dmi index 27839d566035..6c0d351f1730 100644 Binary files a/modular_darkpack/master_files/icons/obj/watercloset.dmi and b/modular_darkpack/master_files/icons/obj/watercloset.dmi differ diff --git a/modular_darkpack/master_files/icons/ui/chat/language.dmi b/modular_darkpack/master_files/icons/ui/chat/language.dmi index eaa506cda6a0..1267d56213e1 100644 Binary files a/modular_darkpack/master_files/icons/ui/chat/language.dmi and b/modular_darkpack/master_files/icons/ui/chat/language.dmi differ diff --git a/modular_darkpack/master_files/sounds/adminhelp.ogg b/modular_darkpack/master_files/sounds/adminhelp.ogg new file mode 100644 index 000000000000..0e1c43de89ec Binary files /dev/null and b/modular_darkpack/master_files/sounds/adminhelp.ogg differ diff --git a/modular_darkpack/modules/masquerade/sound/announce.ogg b/modular_darkpack/master_files/sounds/announce.ogg similarity index 100% rename from modular_darkpack/modules/masquerade/sound/announce.ogg rename to modular_darkpack/master_files/sounds/announce.ogg diff --git a/modular_darkpack/master_files/sounds/door.ogg b/modular_darkpack/master_files/sounds/effects/door/door.ogg similarity index 100% rename from modular_darkpack/master_files/sounds/door.ogg rename to modular_darkpack/master_files/sounds/effects/door/door.ogg diff --git a/modular_darkpack/modules/doors/sounds/get_bent.ogg b/modular_darkpack/master_files/sounds/effects/door/get_bent.ogg similarity index 100% rename from modular_darkpack/modules/doors/sounds/get_bent.ogg rename to modular_darkpack/master_files/sounds/effects/door/get_bent.ogg diff --git a/modular_darkpack/master_files/sounds/gas_fill.ogg b/modular_darkpack/master_files/sounds/effects/gas_fill.ogg similarity index 100% rename from modular_darkpack/master_files/sounds/gas_fill.ogg rename to modular_darkpack/master_files/sounds/effects/gas_fill.ogg diff --git a/modular_darkpack/master_files/sounds/effects/misc/escape_menu/esc_close.ogg b/modular_darkpack/master_files/sounds/effects/misc/escape_menu/esc_close.ogg new file mode 100644 index 000000000000..56301b8be85f Binary files /dev/null and b/modular_darkpack/master_files/sounds/effects/misc/escape_menu/esc_close.ogg differ diff --git a/modular_darkpack/master_files/sounds/effects/misc/escape_menu/esc_middle.ogg b/modular_darkpack/master_files/sounds/effects/misc/escape_menu/esc_middle.ogg new file mode 100644 index 000000000000..bdccea779440 Binary files /dev/null and b/modular_darkpack/master_files/sounds/effects/misc/escape_menu/esc_middle.ogg differ diff --git a/modular_darkpack/master_files/sounds/effects/misc/escape_menu/esc_open.ogg b/modular_darkpack/master_files/sounds/effects/misc/escape_menu/esc_open.ogg new file mode 100644 index 000000000000..ab619d0c26fa Binary files /dev/null and b/modular_darkpack/master_files/sounds/effects/misc/escape_menu/esc_open.ogg differ diff --git a/modular_darkpack/master_files/sounds/repair.ogg b/modular_darkpack/master_files/sounds/effects/repair.ogg similarity index 100% rename from modular_darkpack/master_files/sounds/repair.ogg rename to modular_darkpack/master_files/sounds/effects/repair.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/lightning.ogg b/modular_darkpack/master_files/sounds/lightning.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/lightning.ogg rename to modular_darkpack/master_files/sounds/lightning.ogg diff --git a/modular_darkpack/modules/aggravated_damage/code/damage_procs.dm b/modular_darkpack/modules/aggravated_damage/code/damage_procs.dm index be2a00f325c0..b1726b11d1c1 100644 --- a/modular_darkpack/modules/aggravated_damage/code/damage_procs.dm +++ b/modular_darkpack/modules/aggravated_damage/code/damage_procs.dm @@ -1,7 +1,7 @@ -/mob/living/proc/getAggLoss() +/mob/living/proc/get_agg_loss() return aggloss -/mob/living/carbon/getAggLoss() +/mob/living/carbon/get_agg_loss() var/amount = 0 for(var/obj/item/bodypart/bodypart as anything in bodyparts) amount += bodypart.aggravated_dam @@ -14,7 +14,7 @@ return FALSE return TRUE -/mob/living/proc/adjustAggLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) +/mob/living/proc/adjust_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) if(!can_adjust_agg_loss(amount, forced, required_bodytype)) return 0 . = aggloss @@ -25,7 +25,7 @@ if(updating_health) updatehealth() -/mob/living/carbon/adjustAggLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/carbon/adjust_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!can_adjust_agg_loss(amount, forced, required_bodytype)) return 0 if(amount > 0) @@ -33,7 +33,7 @@ else . = heal_overall_damage(aggravated = abs(amount), required_bodytype = required_bodytype, updating_health = updating_health, forced = forced) -/mob/living/simple_animal/adjustAggLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/simple_animal/adjust_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!can_adjust_agg_loss(amount, forced, required_bodytype)) return 0 if(forced) @@ -41,7 +41,7 @@ else if(damage_coeff[AGGRAVATED]) . = adjustHealth(amount * damage_coeff[AGGRAVATED] * CONFIG_GET(number/damage_multiplier), updating_health, forced) -/mob/living/basic/adjustAggLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/basic/adjust_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!can_adjust_agg_loss(amount, forced, required_bodytype)) return 0 if(forced) @@ -49,7 +49,7 @@ else if(damage_coeff[AGGRAVATED]) . = adjust_health(amount * damage_coeff[AGGRAVATED] * CONFIG_GET(number/damage_multiplier), updating_health, forced) -/mob/living/proc/setAggLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) +/mob/living/proc/set_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) return 0 . = aggloss @@ -60,14 +60,14 @@ if(updating_health) updatehealth() -/mob/living/carbon/setAggLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/carbon/set_agg_loss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) return FALSE - var/current = getAggLoss() + var/current = get_agg_loss() var/diff = amount - current if(!diff) return FALSE - return adjustAggLoss(diff, updating_health, forced, required_bodytype) + return adjust_agg_loss(diff, updating_health, forced, required_bodytype) ///Proc to hook behavior associated to the change of the aggravated_dam variable's value. /obj/item/bodypart/proc/set_aggravated_dam(new_value) diff --git a/modular_darkpack/modules/ambience/code/music_subsystem.dm b/modular_darkpack/modules/ambience/code/music_subsystem.dm new file mode 100644 index 000000000000..b3f446a72f81 --- /dev/null +++ b/modular_darkpack/modules/ambience/code/music_subsystem.dm @@ -0,0 +1,97 @@ +/// Controls music volume +/datum/preference/numeric/volume/sound_music_volume + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "sound_music_volume" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/numeric/volume/sound_music_volume/apply_to_client(client/client, value) + client.update_music_pref(value) + +/client/proc/update_music_pref(value) + if(value) + if(SSmusic.music_listening_clients[src] > world.time) + return // If already properly set we don't want to reset the timer. + SSmusic.music_listening_clients[src] = world.time + 10 SECONDS //Just wait 10 seconds before the next one aight mate? cheers. + else + SSmusic.remove_music_client(src) + +/datum/client_interface/proc/update_music_pref() + return + +/// The subsystem used to play music to users every now and then, makes them real excited. copy-pasta from SSambience +SUBSYSTEM_DEF(music) + name = "Music" + flags = SS_BACKGROUND|SS_NO_INIT + priority = FIRE_PRIORITY_AMBIENCE + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + wait = 1 SECONDS + ///Assoc list of listening client - next music time + var/list/music_listening_clients = list() + var/list/client_old_areas = list() + ///Cache for sanic speed :D + var/list/currentrun = list() + +/datum/controller/subsystem/music/fire(resumed) + if(!resumed) + currentrun = music_listening_clients.Copy() + var/list/cached_clients = currentrun + + if(!CLIENT_COOLDOWN_FINISHED(GLOB, web_sound_cooldown)) + return + + while(cached_clients.len) + var/client/client_iterator = cached_clients[cached_clients.len] + cached_clients.len-- + + //Check to see if the client exists and isn't held by a new player + var/mob/client_mob = client_iterator?.mob + if(isnull(client_iterator) || !client_mob || isnewplayer(client_mob)) + music_listening_clients -= client_iterator + client_old_areas -= client_iterator + continue + + // These are non-diagetic + //if(!client_mob.can_hear()) //WHAT? I CAN'T HEAR YOU + // continue + + //Check to see if the client-mob is in a valid area + var/area/current_area = get_area(client_mob) + if(!current_area) //Something's gone horribly wrong + stack_trace("[key_name(client_mob)] has somehow ended up in nullspace. WTF did you do") + remove_music_client(client_iterator) + continue + + if(music_listening_clients[client_iterator] > world.time) + if(!(current_area.forced_music && (client_old_areas?[client_iterator] != current_area) && prob(5))) + continue + + //Run play_music() on the client-mob and set a cooldown + music_listening_clients[client_iterator] = world.time + current_area.play_music(client_mob) + + //We REALLY don't want runtimes in SSmusic + if(client_iterator) + client_old_areas[client_iterator] = current_area + + if(MC_TICK_CHECK) + return + +///Attempts to play an ambient sound to a mob, returning the cooldown in deciseconds +/area/proc/play_music(mob/M, sound/override_sound, volume = 27) + var/sound/new_sound = override_sound || pick(musictracks) + if(!new_sound) // Dont try to play a sound if we dont have any, required by darkpack as not every area has a sound. + return 1 MINUTES + /// volume modifier for music as set by the player in preferences. + var/volume_modifier = (M.client?.prefs.read_preference(/datum/preference/numeric/volume/sound_music_volume))/100 + new_sound = sound(new_sound, repeat = 0, wait = 0, volume = volume*volume_modifier, channel = CHANNEL_MUSIC) + SEND_SOUND(M, new_sound) + + var/sound_length = SSsounds.get_sound_length(new_sound.file) + if(!sound_length) + // This will cause sounds to cut into eachother if the sound is longer then the min_ambience_cooldown + stack_trace("play_music failed to get soundlength from [new_sound] with a file of [new_sound.file].") + return sound_length + rand(min_music_cooldown, max_music_cooldown) + +/datum/controller/subsystem/music/proc/remove_music_client(client/to_remove) + music_listening_clients -= to_remove + client_old_areas -= to_remove + currentrun -= to_remove diff --git a/modular_darkpack/modules/ambience/sounds/chinatown.ogg b/modular_darkpack/modules/ambience/sounds/music/chinatown.ogg similarity index 100% rename from modular_darkpack/modules/ambience/sounds/chinatown.ogg rename to modular_darkpack/modules/ambience/sounds/music/chinatown.ogg diff --git a/modular_darkpack/modules/ambience/sounds/downtown.ogg b/modular_darkpack/modules/ambience/sounds/music/downtown.ogg similarity index 100% rename from modular_darkpack/modules/ambience/sounds/downtown.ogg rename to modular_darkpack/modules/ambience/sounds/music/downtown.ogg diff --git a/modular_darkpack/modules/ambience/sounds/music/downtown_alt.ogg b/modular_darkpack/modules/ambience/sounds/music/downtown_alt.ogg new file mode 100644 index 000000000000..3f0052ddc9f8 Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/downtown_alt.ogg differ diff --git a/modular_darkpack/modules/ambience/sounds/enterlair.ogg b/modular_darkpack/modules/ambience/sounds/music/enterlair.ogg similarity index 100% rename from modular_darkpack/modules/ambience/sounds/enterlair.ogg rename to modular_darkpack/modules/ambience/sounds/music/enterlair.ogg diff --git a/modular_darkpack/modules/ambience/sounds/music/for_my_clan.ogg b/modular_darkpack/modules/ambience/sounds/music/for_my_clan.ogg new file mode 100644 index 000000000000..9506d83757c9 Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/for_my_clan.ogg differ diff --git a/modular_darkpack/modules/ambience/sounds/hahihaho.ogg b/modular_darkpack/modules/ambience/sounds/music/hahihaho.ogg similarity index 100% rename from modular_darkpack/modules/ambience/sounds/hahihaho.ogg rename to modular_darkpack/modules/ambience/sounds/music/hahihaho.ogg diff --git a/modular_darkpack/modules/ambience/sounds/hollywood.ogg b/modular_darkpack/modules/ambience/sounds/music/hollywood.ogg similarity index 100% rename from modular_darkpack/modules/ambience/sounds/hollywood.ogg rename to modular_darkpack/modules/ambience/sounds/music/hollywood.ogg diff --git a/modular_darkpack/modules/ambience/sounds/music/infected_warehouse.ogg b/modular_darkpack/modules/ambience/sounds/music/infected_warehouse.ogg new file mode 100644 index 000000000000..99c6b5b96880 Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/infected_warehouse.ogg differ diff --git a/modular_darkpack/modules/ambience/sounds/music/is_it_all_worth_it.ogg b/modular_darkpack/modules/ambience/sounds/music/is_it_all_worth_it.ogg new file mode 100644 index 000000000000..4c7bd2d40818 Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/is_it_all_worth_it.ogg differ diff --git a/modular_darkpack/modules/ambience/sounds/naive.ogg b/modular_darkpack/modules/ambience/sounds/music/naive.ogg similarity index 100% rename from modular_darkpack/modules/ambience/sounds/naive.ogg rename to modular_darkpack/modules/ambience/sounds/music/naive.ogg diff --git a/modular_darkpack/modules/ambience/sounds/night_ambience.ogg b/modular_darkpack/modules/ambience/sounds/music/night_ambience.ogg similarity index 100% rename from modular_darkpack/modules/ambience/sounds/night_ambience.ogg rename to modular_darkpack/modules/ambience/sounds/music/night_ambience.ogg diff --git a/modular_darkpack/modules/ambience/sounds/nosferatu.ogg b/modular_darkpack/modules/ambience/sounds/music/nosferatu.ogg similarity index 100% rename from modular_darkpack/modules/ambience/sounds/nosferatu.ogg rename to modular_darkpack/modules/ambience/sounds/music/nosferatu.ogg diff --git a/modular_darkpack/modules/ambience/sounds/music/open_season.ogg b/modular_darkpack/modules/ambience/sounds/music/open_season.ogg new file mode 100644 index 000000000000..691cb9430a43 Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/open_season.ogg differ diff --git a/modular_darkpack/modules/ambience/sounds/penumbra.ogg b/modular_darkpack/modules/ambience/sounds/music/penumbra.ogg similarity index 100% rename from modular_darkpack/modules/ambience/sounds/penumbra.ogg rename to modular_darkpack/modules/ambience/sounds/music/penumbra.ogg diff --git a/modular_darkpack/modules/ambience/sounds/prince.ogg b/modular_darkpack/modules/ambience/sounds/music/prince.ogg similarity index 100% rename from modular_darkpack/modules/ambience/sounds/prince.ogg rename to modular_darkpack/modules/ambience/sounds/music/prince.ogg diff --git a/modular_darkpack/modules/ambience/sounds/music/rotting_stones.ogg b/modular_darkpack/modules/ambience/sounds/music/rotting_stones.ogg new file mode 100644 index 000000000000..8ac0e164fc13 Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/rotting_stones.ogg differ diff --git a/modular_darkpack/modules/ambience/sounds/music/safe_room.ogg b/modular_darkpack/modules/ambience/sounds/music/safe_room.ogg new file mode 100644 index 000000000000..9138ab77d821 Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/safe_room.ogg differ diff --git a/modular_darkpack/modules/ambience/sounds/santamonica.ogg b/modular_darkpack/modules/ambience/sounds/music/santamonica.ogg similarity index 100% rename from modular_darkpack/modules/ambience/sounds/santamonica.ogg rename to modular_darkpack/modules/ambience/sounds/music/santamonica.ogg diff --git a/modular_darkpack/modules/ambience/sounds/theatre.ogg b/modular_darkpack/modules/ambience/sounds/music/theatre.ogg similarity index 100% rename from modular_darkpack/modules/ambience/sounds/theatre.ogg rename to modular_darkpack/modules/ambience/sounds/music/theatre.ogg diff --git a/modular_darkpack/modules/ambience/sounds/music/volition.ogg b/modular_darkpack/modules/ambience/sounds/music/volition.ogg new file mode 100644 index 000000000000..481fa363b4b5 Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/volition.ogg differ diff --git a/modular_darkpack/modules/ambience/sounds/music/what_comes_next.ogg b/modular_darkpack/modules/ambience/sounds/music/what_comes_next.ogg new file mode 100644 index 000000000000..15c2592d0d1f Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/what_comes_next.ogg differ diff --git a/modular_darkpack/modules/antediluvian_sarcophagus/code/sarcophagus.dm b/modular_darkpack/modules/antediluvian_sarcophagus/code/sarcophagus.dm index 8a8ce6c2e39a..bdf52fa35c6c 100644 --- a/modular_darkpack/modules/antediluvian_sarcophagus/code/sarcophagus.dm +++ b/modular_darkpack/modules/antediluvian_sarcophagus/code/sarcophagus.dm @@ -79,36 +79,21 @@ GLOBAL_LIST_INIT(caesar_cipher, list( final_message += "[get_uncipher_num(letter, password)]" return final_message -/obj/sarcophagus/examine(mob/user) - . = ..() - . += "You see an engraved text on it: [encipher(password, passkey)]. You have no clue what that could possibly mean..." + /obj/sarcophagus - name = "Unknown Sarcophagus" - desc = "Contains elder devil..." - icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' + name = "unknown sarcophagus" + desc = "A shiver runs down your spine just looking at it..." + icon = 'modular_darkpack/modules/antediluvian_sarcophagus/icons/sarcophagus.dmi' icon_state = "b_sarcophagus" - plane = GAME_PLANE - layer = CAR_LAYER + // layer = CAR_LAYER density = TRUE + anchored = TRUE pixel_w = -8 + COOLDOWN_DECLARE(roll_cooldown) var/password = "Brongus" var/passkey = 5 -/obj/sarcophagus/attackby(obj/item/I, mob/living/user, params) - . = ..() - if(istype(I, /obj/item/sarcophagus_key)) - var/pass = input(user, "???") as text|null - if(pass) - if(password == uppertext(pass)) - icon_state = "b_sarcophagus-open1" - to_chat(world, span_userdanger("UNKNOWN SARCOPHAGUS HAS BEEN OPENED")) - SEND_SOUND(world, sound('modular_darkpack/modules/masquerade/sounds/announce.ogg')) - playsound(get_turf(src), 'modular_darkpack/modules/deprecated/sounds/mp_hello.ogg', 100, TRUE) - spawn(200) - icon_state = "b_sarcophagus-open0" - new /mob/living/simple_animal/hostile/megafauna/wendigo(loc) - /obj/sarcophagus/Initialize(mapload) . = ..() password = pick(GLOB.sarcophagus_passwords) @@ -117,20 +102,51 @@ GLOBAL_LIST_INIT(caesar_cipher, list( else passkey = rand(-15, -5) //to_chat(world, span_userdanger("UNKNOWN SARCOPHAGUS POSITION HAS BEEN LEAKED")) - SEND_SOUND(world, sound('modular_darkpack/modules/masquerade/sounds/announce.ogg')) + SEND_SOUND(world, sound('modular_darkpack/master_files/sounds/announce.ogg')) -/obj/item/sarcophagus_key - name = "sarcophagus key" - desc = "The secrets of elder devil..." - icon_state = "sarcophagus_key" - icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' - w_class = WEIGHT_CLASS_SMALL +/obj/sarcophagus/examine(mob/user) + . = ..() + var/message = "You see an engraved text on it: [encipher(password, passkey)]." + if(isliving(user) && COOLDOWN_FINISHED(src, roll_cooldown)) + COOLDOWN_START(src, roll_cooldown, 1 SCENES) + var/mob/living/living_user = user + var/roll_result = SSroll.storyteller_roll(living_user.st_get_stat(STAT_INTELLIGENCE) + living_user.st_get_stat(STAT_OCCULT), 10, list(user), user) + if(roll_result == ROLL_SUCCESS) + message += " It's an ancient cipher. You shift letters in your head till you end up with [uppertext(password)]." + else + message += " You have no clue what that could possibly mean..." + . += message -/obj/item/fake_sarcophagus - name = "Voivode-in-Waiting's Sarcophagus" +#define OPEN_SOUND 'modular_darkpack/modules/antediluvian_sarcophagus/sounds/mp_hello.ogg' +/obj/sarcophagus/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/sarcophagus_key)) + var/pass = tgui_input_text(user, "???", "???") + if(!pass) + return ITEM_INTERACT_BLOCKING + if(password == uppertext(pass)) + icon_state = "b_sarcophagus-open1" + to_chat(world, span_userdanger("UNKNOWN SARCOPHAGUS HAS BEEN OPENED")) + SEND_SOUND(world, sound('modular_darkpack/master_files/sounds/announce.ogg')) + var/sound_length = SSsounds.get_sound_length(OPEN_SOUND) + playsound(src, OPEN_SOUND, 100, FALSE) + spawn(sound_length) + icon_state = "b_sarcophagus-open0" + new /mob/living/simple_animal/hostile/megafauna/wendigo/antediluvian(loc) + return ITEM_INTERACT_SUCCESS +#undef OPEN_SOUND + +/obj/fake_sarcophagus + name = "\improper Voivode-in-Waiting's Sarcophagus" desc = "The Voivode-in-Waiting lies here." - icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' + icon = 'modular_darkpack/modules/antediluvian_sarcophagus/icons/sarcophagus.dmi' icon_state = "b_sarcophagus" density = TRUE anchored = TRUE pixel_w = -8 + +/obj/item/sarcophagus_key + name = "sarcophagus key" + desc = "Something strange and ancient..." + icon_state = "sarcophagus_key" + icon = 'modular_darkpack/modules/antediluvian_sarcophagus/icons/key.dmi' + w_class = WEIGHT_CLASS_SMALL diff --git a/modular_darkpack/modules/antediluvian_sarcophagus/code/the_antediluvian.dm b/modular_darkpack/modules/antediluvian_sarcophagus/code/the_antediluvian.dm new file mode 100644 index 000000000000..9ab2f270ec68 --- /dev/null +++ b/modular_darkpack/modules/antediluvian_sarcophagus/code/the_antediluvian.dm @@ -0,0 +1,46 @@ +#define ANTEDILUVIAN_SCORE "Antediluvians Killed" +#define BOSS_MEDAL_ANTEDILUVIAN "Antediluvian Killer" +/mob/living/simple_animal/hostile/megafauna/wendigo/antediluvian + name = "Unknown Antediluvian" + desc = "A mythological legendary kindred, you probably aren't going to survive this." + health = 2500 + maxHealth = 2500 + icon_state = "eva" + icon_living = "eva" + icon_dead = "eva_dead" + icon = 'modular_darkpack/modules/antediluvian_sarcophagus/icons/the_antediluvian.dmi' + pixel_x = 0 + base_pixel_x = 0 + guaranteed_butcher_results = list() + crusher_loot = null + death_message = "falls, shaking the ground around it" + achievement_type = /datum/award/achievement/boss/antediluvian_kill + score_achievement_type = /datum/award/score/antediluvian_score + +/mob/living/simple_animal/hostile/megafauna/colossus/antediluvian + name = "Unknown Antediluvian" + desc = "A mythological legendary kindred, you probably aren't going to survive this." + health = 2500 + maxHealth = 2500 + icon_state = "eva" + icon_living = "eva" + icon_dead = "eva_dead" + icon = 'modular_darkpack/modules/antediluvian_sarcophagus/icons/the_antediluvian.dmi' + pixel_x = 0 + base_pixel_x = 0 + achievement_type = /datum/award/achievement/boss/antediluvian_kill + score_achievement_type = /datum/award/score/antediluvian_score + +/datum/award/achievement/boss/antediluvian_kill + name = "Antediluvian Killer" + desc = "The bigger they are... the better the loot" + database_id = BOSS_MEDAL_ANTEDILUVIAN + icon_state = "firstboss" + +/datum/award/score/antediluvian_score + name = "Antediluvian Killed" + desc = "You've killed HOW many?" + database_id = ANTEDILUVIAN_SCORE + +#undef ANTEDILUVIAN_SCORE +#undef BOSS_MEDAL_ANTEDILUVIAN diff --git a/modular_darkpack/modules/antediluvian_sarcophagus/icons/key.dmi b/modular_darkpack/modules/antediluvian_sarcophagus/icons/key.dmi new file mode 100644 index 000000000000..5ebe53ff3cbe Binary files /dev/null and b/modular_darkpack/modules/antediluvian_sarcophagus/icons/key.dmi differ diff --git a/modular_darkpack/modules/antediluvian_sarcophagus/icons/sarcophagus.dmi b/modular_darkpack/modules/antediluvian_sarcophagus/icons/sarcophagus.dmi new file mode 100644 index 000000000000..ed20a2c5d6c0 Binary files /dev/null and b/modular_darkpack/modules/antediluvian_sarcophagus/icons/sarcophagus.dmi differ diff --git a/modular_darkpack/modules/antediluvian_sarcophagus/icons/the_antediluvian.dmi b/modular_darkpack/modules/antediluvian_sarcophagus/icons/the_antediluvian.dmi new file mode 100644 index 000000000000..7c6e55a33aa6 Binary files /dev/null and b/modular_darkpack/modules/antediluvian_sarcophagus/icons/the_antediluvian.dmi differ diff --git a/modular_darkpack/modules/deprecated/sounds/mp_die.ogg b/modular_darkpack/modules/antediluvian_sarcophagus/sounds/mp_die.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/mp_die.ogg rename to modular_darkpack/modules/antediluvian_sarcophagus/sounds/mp_die.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/mp_end.ogg b/modular_darkpack/modules/antediluvian_sarcophagus/sounds/mp_end.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/mp_end.ogg rename to modular_darkpack/modules/antediluvian_sarcophagus/sounds/mp_end.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/mp_hello.ogg b/modular_darkpack/modules/antediluvian_sarcophagus/sounds/mp_hello.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/mp_hello.ogg rename to modular_darkpack/modules/antediluvian_sarcophagus/sounds/mp_hello.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/mp_judgement.ogg b/modular_darkpack/modules/antediluvian_sarcophagus/sounds/mp_judgement.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/mp_judgement.ogg rename to modular_darkpack/modules/antediluvian_sarcophagus/sounds/mp_judgement.ogg diff --git a/modular_darkpack/modules/areas/code/interiors/__interior.dm b/modular_darkpack/modules/areas/code/interiors/__interior.dm index 1f4d046defe5..2688ff3f23e9 100644 --- a/modular_darkpack/modules/areas/code/interiors/__interior.dm +++ b/modular_darkpack/modules/areas/code/interiors/__interior.dm @@ -2,5 +2,6 @@ /area/vtm/interior name = "Interior" icon_state = "interior" + sound_environment = SOUND_ENVIRONMENT_ROOM ambience_index = AMBIENCE_OFFICE outdoors = FALSE diff --git a/modular_darkpack/modules/areas/code/interiors/anarch.dm b/modular_darkpack/modules/areas/code/interiors/anarch.dm index 36e5a86a993c..55914ed595ae 100644 --- a/modular_darkpack/modules/areas/code/interiors/anarch.dm +++ b/modular_darkpack/modules/areas/code/interiors/anarch.dm @@ -2,7 +2,7 @@ name = "Bar" icon_state = "anarch" ambience_index = AMBIENCE_OFFICE - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/naive.ogg' + music_index = MUSIC_BAR zone_type = ZONE_ELYSIUM fire_controled = TRUE diff --git a/modular_darkpack/modules/areas/code/interiors/chantry.dm b/modular_darkpack/modules/areas/code/interiors/chantry.dm deleted file mode 100644 index ba98a152aa83..000000000000 --- a/modular_darkpack/modules/areas/code/interiors/chantry.dm +++ /dev/null @@ -1,15 +0,0 @@ -/area/vtm/interior/theatre - name = "Theatre" - icon_state = "theatre" - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/theatre.ogg' - zone_type = ZONE_ELYSIUM - fire_controled = TRUE - -/area/vtm/interior/chantry - name = "Chantry" - icon_state = "theatre" - zone_type = ZONE_ELYSIUM - fire_controled = TRUE - -/area/vtm/interior/chantry/basement - name = "Chantry Basement" diff --git a/modular_darkpack/modules/areas/code/interiors/city_interiors.dm b/modular_darkpack/modules/areas/code/interiors/city_interiors.dm index 768c24720d2e..6fb4fcac5630 100644 --- a/modular_darkpack/modules/areas/code/interiors/city_interiors.dm +++ b/modular_darkpack/modules/areas/code/interiors/city_interiors.dm @@ -1,5 +1,5 @@ /area/vtm/interior/shop - name = "Shop" + name = "\improper Shop" icon_state = "shop" fire_controled = TRUE @@ -14,6 +14,12 @@ zone_type = ZONE_ELYSIUM fire_controled = TRUE +/area/vtm/interior/giovanni/basement + name = "Giovanni Mansion - Basement" + icon_state = "giovanni" + zone_type = ZONE_ELYSIUM + fire_controled = TRUE + /area/vtm/interior/techshop name = "Nightwolf Techshop" icon_state = "shop" @@ -26,7 +32,32 @@ fire_controled = TRUE /area/vtm/interior/police - name = "Police Station" + name = "\improper Police Station" + icon_state = "police" + fire_controled = TRUE + +/area/vtm/interior/police/morgue + name = "Police Station - Morgue" + icon_state = "police" + fire_controled = TRUE + +/area/vtm/interior/police/upstairs + name = "Police Station - Upstairs" + icon_state = "police" + fire_controled = TRUE + +/area/vtm/interior/police/fed + name = "Reserved Room" + icon_state = "police" + fire_controled = TRUE + +/area/vtm/interior/police/court + name = "Courthouse" + icon_state = "police" + fire_controled = TRUE + +/area/vtm/interior/ranger + name = "Firewatch Tower" icon_state = "police" fire_controled = TRUE @@ -45,11 +76,16 @@ icon_state = "mansion" zone_type = ZONE_NO_MASQUERADE +/area/vtm/interior/apartment + name = "Millenium Apartments" + icon_state = "camarilla_interior" + fire_controled = TRUE + /area/vtm/interior/glasswalker name = "Glasswalker's Lab" icon_state = "supply" zone_type = ZONE_NO_MASQUERADE - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/night_ambience.ogg' + music_index = MUSIC_FOREST fire_controled = TRUE /area/vtm/interior/penumbra @@ -57,7 +93,7 @@ icon_state = "church" ambience_index = AMBIENCE_NATURE zone_type = ZONE_NO_MASQUERADE - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/penumbra.ogg' + musictracks = list('modular_darkpack/modules/ambience/sounds/music/penumbra.ogg') fire_controled = FALSE /area/vtm/interior/backrooms @@ -71,17 +107,17 @@ name = "Wyrm Corruption" icon_state = "graveyard" zone_type = ZONE_NO_MASQUERADE - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/night_ambience.ogg' + music_index = MUSIC_FOREST fire_controled = FALSE -/area/vtm/interior/old_clan_tzimisce_manor - name = "Old Clan Tzimisce Manor" +/area/vtm/interior/tzimisce_manor + name = "Tzimisce Manor" icon_state = "old_clan_tzimisce" zone_type = ZONE_ELYSIUM - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/prince.ogg' + music_index = MUSIC_PRINCE /area/vtm/interior/strip_elysium - name = "Strip Club Elysium" + name = "Strip Club - Elysium" icon_state = "prince" fire_controled = TRUE zone_type = ZONE_ELYSIUM @@ -103,6 +139,7 @@ name = "Clinic" icon_state = "clinic" ambience_index = AMBIENCE_OFFICE + music_index = MUSIC_SAFE fire_controled = TRUE /area/vtm/interior/clinic/haven @@ -120,16 +157,157 @@ ambience_index = AMBIENCE_OFFICE fire_controled = TRUE +/area/vtm/interior/cabdepot + name = "Cab Depot" + icon_state = "hotel" + music_index = MUSIC_CITY + ambience_index = AMBIENCE_OFFICE + fire_controled = TRUE + +/area/vtm/interior/substation + name = "Grid Substation" + icon_state = "hotel" + music_index = MUSIC_CITY + ambience_index = AMBIENCE_OFFICE + fire_controled = TRUE + /area/vtm/interior/church name = "Church" icon_state = "church" - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/hahihaho.ogg' + ambience_index = AMBIENCE_OFFICE + music_index = MUSIC_CHURCH + fire_controled = TRUE + +/area/vtm/interior/church/staff + name = "Church - Backrooms" + icon_state = "church" + zone_type = ZONE_ELYSIUM + music_index = MUSIC_CITY + ambience_index = AMBIENCE_OFFICE + fire_controled = TRUE + +/area/vtm/interior/church/haven + name = "Church - Restricted Floor" + icon_state = "old_clan_tzimisce" + music_index = MUSIC_CITY ambience_index = AMBIENCE_OFFICE fire_controled = TRUE + zone_type = ZONE_ELYSIUM /area/vtm/interior/elevator name = "Elevator" icon_state = "prince" - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/lift.ogg' zone_type = ZONE_ELYSIUM + // Most elevators handle themselves with those little effect thingys + ambience_index = null + fire_controled = TRUE + +/area/vtm/interior/theatre + name = "Theatre" + icon_state = "theatre" + music_index = MUSIC_CITY + zone_type = ZONE_ELYSIUM + fire_controled = TRUE + +/area/vtm/interior/oldchurch + name = "Old Seaside Church" + icon_state = "church" + fire_controled = TRUE + +/area/vtm/interior/museum + name = "Historical Museum" + icon_state = "old_clan_tzimisce" + zone_type = ZONE_ELYSIUM + fire_controled = TRUE + +/area/vtm/interior/trujah + name = "Antique Shop" + icon_state = "old_clan_tzimisce" + zone_type = ZONE_ELYSIUM + fire_controled = TRUE + +/area/vtm/interior/baali + name = "Alcoholics Anonymous" + icon_state = "old_clan_tzimisce" + zone_type = ZONE_ELYSIUM + fire_controled = TRUE + +/area/vtm/interior/salubri + name = "Veterinary Clinic" + icon_state = "old_clan_tzimisce" + zone_type = ZONE_ELYSIUM + fire_controled = TRUE + +/area/vtm/interior/banu + name = "Coffee House" + icon_state = "old_clan_tzimisce" + fire_controled = TRUE + +/area/vtm/interior/banu/haven + name = "Coffee House - Employee Only" + icon_state = "old_clan_tzimisce" + zone_type = ZONE_ELYSIUM + fire_controled = TRUE + +/area/vtm/interior/tzimisce_manor + name = "Clan Tzimisce Manor" + icon_state = "old_clan_tzimisce" + zone_type = ZONE_ELYSIUM + +/area/vtm/interior/tzimisce_sanctum + name = "Clan Tzimisce Sanctum" + icon_state = "old_clan_sanctum" + zone_type = ZONE_ELYSIUM + +/area/vtm/interior/setite + name = "Community Center" + icon_state = "hotel" + fire_controled = TRUE + +/area/vtm/interior/setite/basement + name = "Community Center Basement" + zone_type = ZONE_ELYSIUM + +/area/vtm/interior/ghetto + name = "Ghetto Apartments" + icon_state = "ghetto_interior" + fire_controled = TRUE + +/area/vtm/interior/littleitaly + name = "Little Italy - Store" + icon_state = "shop" + fire_controled = TRUE + +/area/vtm/interior/littleitaly/apartments + name = "Little Italy - Apartments" + icon_state = "shop" + fire_controled = TRUE + +/area/vtm/interior/tzimisce_sanctum + name = "Tzimisce Sanctum" + icon_state = "old_clan_sanctum" + zone_type = ZONE_ELYSIUM + music_index = MUSIC_PRINCE + +/area/vtm/interior/sabbat_lair + name = "Interior" + zone_type = "elysium" + +/area/vtm/interior/subway + name = "Subway Station" + icon_state = "financialdistrict" + fire_controled = TRUE + +/area/vtm/interior/setite + name = "Community Center" + icon_state = "hotel" + fire_controled = TRUE + +/area/vtm/interior/setite/basement + name = "Community Center Basement" + zone_type = "elysium" + +/area/vtm/interior/substation + name = "Grid Substation" + icon_state = "hotel" fire_controled = TRUE diff --git a/modular_darkpack/modules/areas/code/interiors/endron_facility.dm b/modular_darkpack/modules/areas/code/interiors/endron_facility.dm index fea7b2d97f3f..17be97f4b145 100644 --- a/modular_darkpack/modules/areas/code/interiors/endron_facility.dm +++ b/modular_darkpack/modules/areas/code/interiors/endron_facility.dm @@ -1,13 +1,37 @@ /area/vtm/interior/endron_facility - name = "Endron Facility" + name = MAIN_EVIL_COMPANY + " Facility" icon_state = "supply" zone_type = ZONE_NO_MASQUERADE - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/night_ambience.ogg' + music_index = MUSIC_FOREST fire_controled = FALSE /area/vtm/interior/endron_facility/restricted - name = "Endron Facility Restricted" + name = MAIN_EVIL_COMPANY + " Facility Restricted" icon_state = "graveyard" zone_type = ZONE_NO_MASQUERADE - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/night_ambience.ogg' + music_index = MUSIC_FOREST + fire_controled = FALSE + +/area/vtm/interior/endron_facility/helipad + name = "Endron Helipad" + icon_state = "supply" + zone_type = ZONE_NO_MASQUERADE fire_controled = FALSE + +/area/vtm/interior/endron_facility/forest + name = "Endron Forest Worksite" + icon_state = "supply" + zone_type = ZONE_NO_MASQUERADE + fire_controled = TRUE + +/area/vtm/interior/endron_facility/plant + name = "Endron Processing Plant" + icon_state = "supply" + zone_type = "masquerade" + fire_controled = TRUE + +/area/vtm/interior/endron_facility/restricted + name = "Endron Facility Restricted" + icon_state = "graveyard" + zone_type = ZONE_NO_MASQUERADE + fire_controled = TRUE diff --git a/modular_darkpack/modules/areas/code/interiors/forest.dm b/modular_darkpack/modules/areas/code/interiors/forest.dm new file mode 100644 index 000000000000..db33a03e6ed0 --- /dev/null +++ b/modular_darkpack/modules/areas/code/interiors/forest.dm @@ -0,0 +1,2 @@ +/area/vtm/interior/caves + name = "Forest Caverns" diff --git a/modular_darkpack/modules/areas/code/interiors/garou.dm b/modular_darkpack/modules/areas/code/interiors/garou.dm new file mode 100644 index 000000000000..edf0bc42cc12 --- /dev/null +++ b/modular_darkpack/modules/areas/code/interiors/garou.dm @@ -0,0 +1,9 @@ +/area/vtm/interior/cog/caern + name = "Children of Gaia Caern" + icon_state = "cog_caern" + zone_type = ZONE_ELYSIUM + +/area/vtm/interior/cog/pantry + name = "Earth's Bounty Food Pantry" + icon_state = "cog_pantry" + fire_controled = TRUE diff --git a/modular_darkpack/modules/areas/code/interiors/library.dm b/modular_darkpack/modules/areas/code/interiors/library.dm new file mode 100644 index 000000000000..8301d53e7a41 --- /dev/null +++ b/modular_darkpack/modules/areas/code/interiors/library.dm @@ -0,0 +1,11 @@ +/area/vtm/interior/library + name = "Haight Arts Center" //Someone actually confirmed this with the IRL location. + +/area/vtm/interior/chantry + name = "Chantry" + icon_state = "theatre" + zone_type = ZONE_ELYSIUM + fire_controled = TRUE + +/area/vtm/interior/chantry/basement + name = "Chantry Basement" diff --git a/modular_darkpack/modules/areas/code/interiors/millennium_tower.dm b/modular_darkpack/modules/areas/code/interiors/millennium_tower.dm index 54d38f24d0c4..ec2f58622304 100644 --- a/modular_darkpack/modules/areas/code/interiors/millennium_tower.dm +++ b/modular_darkpack/modules/areas/code/interiors/millennium_tower.dm @@ -1,7 +1,7 @@ /area/vtm/interior/millennium_tower name = "Millennium Tower F1" icon_state = "millenniumtowerf1" - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/prince.ogg' + music_index = MUSIC_PRINCE zone_type = ZONE_ELYSIUM fire_controled = TRUE diff --git a/modular_darkpack/modules/areas/code/interiors/sewers.dm b/modular_darkpack/modules/areas/code/interiors/sewers.dm new file mode 100644 index 000000000000..b134b30236fa --- /dev/null +++ b/modular_darkpack/modules/areas/code/interiors/sewers.dm @@ -0,0 +1,38 @@ +/area/vtm/interior/sewer + name = "Sewer" + icon_state = "sewer" + ambience_index = AMBIENCE_SEWER + musictracks = list('modular_darkpack/modules/ambience/sounds/music/nosferatu.ogg') + outdoors = FALSE + zone_type = ZONE_NO_MASQUERADE + +/area/vtm/interior/sewer/nosferatu_town + name = "Underground Town" + icon_state = "hotel" + musictracks = list('modular_darkpack/modules/ambience/sounds/music/nosferatu.ogg') + zone_type = ZONE_ELYSIUM + +/area/vtm/interior/sewer/police + name = "Police Station - Basement" + icon_state = "sewer" + zone_type = ZONE_NO_MASQUERADE + +/area/vtm/interior/sewer/nosferatu_town + name = "Underground Town" + icon_state = "hotel" + zone_type = ZONE_ELYSIUM + +/area/vtm/interior/sewer/nosferatu_warren + name = "Underground Warren" + icon_state = "hotel" + zone_type = ZONE_ELYSIUM + +/area/vtm/interior/sewer/nosferatu_bar + name = "Underground Bar" + icon_state = "hotel" + zone_type = ZONE_ELYSIUM + +/area/vtm/interior/nosferatu_office + name = "Underground Office" + icon_state = "hotel" + zone_type = ZONE_ELYSIUM diff --git a/modular_darkpack/modules/areas/code/outsides/__outside.dm b/modular_darkpack/modules/areas/code/outsides/__outside.dm index 593332e39b78..5ffbf9b72a2a 100644 --- a/modular_darkpack/modules/areas/code/outsides/__outside.dm +++ b/modular_darkpack/modules/areas/code/outsides/__outside.dm @@ -1,3 +1,4 @@ // You do not HAVE to use this subtype for outside, dont rely on it for behavoir as well, mostly orginizational /area/vtm/outside outdoors = TRUE + sound_environment = SOUND_ENVIRONMENT_CITY diff --git a/modular_darkpack/modules/areas/code/outsides/city_outsides.dm b/modular_darkpack/modules/areas/code/outsides/city_outsides.dm index 789a37d01ba1..2998f95aba1c 100644 --- a/modular_darkpack/modules/areas/code/outsides/city_outsides.dm +++ b/modular_darkpack/modules/areas/code/outsides/city_outsides.dm @@ -2,56 +2,86 @@ name = "Financial District" icon_state = "financialdistrict" ambience_index = AMBIENCE_CITY - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/downtown.ogg' + music_index = MUSIC_CITY /area/vtm/outside/ghetto name = "Ghetto" icon_state = "ghetto" ambience_index = AMBIENCE_CITY - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/downtown.ogg' + music_index = MUSIC_CITY /area/vtm/outside/pacificheights name = "Pacific Heights" icon_state = "pacificheights" ambience_index = AMBIENCE_NATURE - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/hollywood.ogg' + music_index = MUSIC_HOLLYWOOD + +/area/vtm/outside/pacificheights/forest + name = "Pacific Heights Forest Outskirts" + +/area/vtm/outside/pacificheights/old + name = "Pacific Heights - Old District" + +/area/vtm/outside/pacificheights/community + name = "Pacific Heights - Community Road" + +/area/vtm/outside/pacificheights/industrial + name = "Pacific Heights - Industrial District" /area/vtm/outside/chinatown name = "Chinatown" icon_state = "chinatown" ambience_index = AMBIENCE_CITY - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/chinatown.ogg' + musictracks = list('modular_darkpack/modules/ambience/sounds/music/chinatown.ogg') /area/vtm/outside/fishermanswharf name = "Fisherman's Wharf" icon_state = "fishermanswharf" ambience_index = AMBIENCE_CITY - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/santamonica.ogg' + music_index = MUSIC_SANTAMONICA + +/area/vtm/outside/fishermanswharf/ghetto + name = "Fisherman's Wharf - Ghetto" + +/area/vtm/outside/fishermanswharf/lower + name = "Fisherman's Wharf - Lower Beachside" + +/area/vtm/outside/fishermanswharf/industrial + name = "Fisherman's Wharf - Industrial District" /area/vtm/outside/northbeach name = "North Beach" icon_state = "northbeach" ambience_index = AMBIENCE_BEACH - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/santamonica.ogg' + //The waves dont really stop. + min_ambience_cooldown = 0 SECONDS + max_ambience_cooldown = 5 SECONDS + music_index = MUSIC_SANTAMONICA + +/area/vtm/outside/baywalk + name = "Baywalk District" + icon_state = "northbeach" + ambience_index = AMBIENCE_BEACH + music_index = MUSIC_SANTAMONICA /area/vtm/outside/unionsquare name = "Union Square" icon_state = "unionsquare" ambience_index = AMBIENCE_CITY - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/downtown.ogg' + music_index = MUSIC_CITY /area/vtm/outside/park name = "Park" icon_state = "park" ambience_index = AMBIENCE_NATURE - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/downtown.ogg' - -/area/vtm/outside/forest - name = "Forest" - icon_state = "park" - zone_type = ZONE_NO_MASQUERADE - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/night_ambience.ogg' + music_index = MUSIC_CITY /area/vtm/outside/supply name = "Supply" icon_state = "supply" + +/area/vtm/outside/giovanni/courtyard + name = "Giovanni Mansion - Courtyard" + icon_state = "giovanni" + zone_type = ZONE_ELYSIUM + fire_controled = FALSE diff --git a/modular_darkpack/modules/areas/code/outsides/forest.dm b/modular_darkpack/modules/areas/code/outsides/forest.dm new file mode 100644 index 000000000000..29bee2c1ce1f --- /dev/null +++ b/modular_darkpack/modules/areas/code/outsides/forest.dm @@ -0,0 +1,5 @@ +/area/vtm/outside/forest + name = "Forest" + icon_state = "park" + zone_type = ZONE_NO_MASQUERADE + sound_environment = SOUND_ENVIRONMENT_FOREST diff --git a/modular_darkpack/modules/areas/code/random_gen.dm b/modular_darkpack/modules/areas/code/random_gen.dm index 6534fbb18bca..1a3653d55085 100644 --- a/modular_darkpack/modules/areas/code/random_gen.dm +++ b/modular_darkpack/modules/areas/code/random_gen.dm @@ -1,6 +1,12 @@ - /area/vtm/planetgeneration - name = "planet generation area" - + name = "forest generation area" + icon_state = "park" outdoors = TRUE map_generator = /datum/map_generator/jungle_generator + + +/area/vtm/planetgeneration/woodland + name = "woodland generation area" + icon_state = "cog_caern" + outdoors = TRUE + map_generator = /datum/map_generator/jungle_generator/woodland diff --git a/modular_darkpack/modules/areas/code/sewers.dm b/modular_darkpack/modules/areas/code/sewers.dm deleted file mode 100644 index c48edcac9cbb..000000000000 --- a/modular_darkpack/modules/areas/code/sewers.dm +++ /dev/null @@ -1,19 +0,0 @@ -/area/vtm/sewer - name = "Sewer" - icon_state = "sewer" - ambience_index = AMBIENCE_SEWER - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/enterlair.ogg' - outdoors = FALSE - zone_type = ZONE_NO_MASQUERADE - -/area/vtm/sewer/nosferatu_town - name = "Underground Town" - icon_state = "hotel" - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/nosferatu.ogg' - zone_type = ZONE_ELYSIUM - -/area/vtm/sewer/old_clan_sanctum - name = "Old Clan Tzimisce Sanctum" - icon_state = "old_clan_sanctum" - zone_type = ZONE_ELYSIUM - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/nosferatu.ogg' diff --git a/modular_darkpack/modules/areas/code/zone_hud.dm b/modular_darkpack/modules/areas/code/zone_hud.dm index 707fcf3a1926..bcccadeb92be 100644 --- a/modular_darkpack/modules/areas/code/zone_hud.dm +++ b/modular_darkpack/modules/areas/code/zone_hud.dm @@ -1,22 +1,9 @@ -/atom/movable/screen/vtm_zone +#define ui_zone_hud "TOP-0:-8,CENTER-0:-8" +/atom/movable/screen/zone_hud name = "zone" - icon = 'modular_darkpack/modules/deprecated/icons/48x48.dmi' + icon = 'modular_darkpack/modules/areas/icons/zone_hud.dmi' icon_state = "masquerade" - layer = HUD_LAYER - plane = HUD_PLANE - alpha = 64 + alpha = 32 + screen_loc = ui_zone_hud -/mob/living/proc/update_zone_hud() - if(!client || !hud_used) - return - if(hud_used.zone_icon) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - hud_used.zone_icon.icon_state = "[V.zone_type]" - if(V.zone_type == ZONE_ELYSIUM) - if(!HAS_TRAIT(src, TRAIT_ELYSIUM)) - ADD_TRAIT(src, TRAIT_ELYSIUM, "elysium") - else - elysium_checks = 0 - if(HAS_TRAIT(src, TRAIT_ELYSIUM)) - REMOVE_TRAIT(src, TRAIT_ELYSIUM, "elysium") +#undef ui_zone_hud diff --git a/modular_darkpack/modules/areas/icons/zone_hud.dmi b/modular_darkpack/modules/areas/icons/zone_hud.dmi new file mode 100644 index 000000000000..bb8734d1ab73 Binary files /dev/null and b/modular_darkpack/modules/areas/icons/zone_hud.dmi differ diff --git a/modular_darkpack/modules/ashtray/code/ashtray.dm b/modular_darkpack/modules/ashtray/code/ashtray.dm new file mode 100644 index 000000000000..c7c9efff1799 --- /dev/null +++ b/modular_darkpack/modules/ashtray/code/ashtray.dm @@ -0,0 +1,101 @@ +/obj/item/storage/ashtray + name = "ashtray" + desc = "A small bowl for holding and disposing of smokestuffs." + icon = 'modular_darkpack/modules/ashtray/icons/ashtray.dmi' + icon_state = "ashtray" + base_icon_state = "ashtray" + color = "#303030" + resistance_flags = FIRE_PROOF + drop_sound = 'sound/items/handling/drinkglass_drop.ogg' + pickup_sound = 'sound/items/handling/drinkglass_pickup.ogg' + var/recolored = FALSE + +/obj/item/storage/ashtray/update_overlays() + . = ..() + if(contents.len == atom_storage.max_slots) + . += mutable_appearance(icon, "[base_icon_state]_overlay-full", appearance_flags = RESET_COLOR|KEEP_APART) + else if(contents.len && (contents.len >= atom_storage.max_slots/2)) + . += mutable_appearance(icon, "[base_icon_state]_overlay-half", appearance_flags = RESET_COLOR|KEEP_APART) + +/obj/item/storage/ashtray/Entered() + . = ..() + update_icon(UPDATE_OVERLAYS) + +/obj/item/storage/ashtray/Exited() + . = ..() + update_icon(UPDATE_OVERLAYS) + +/obj/item/storage/ashtray/attack_self(mob/user) + . = ..() + + if(!recolored) + var/option_select = tgui_alert(user, "Choose an option", "[src]", list("Dump", "Recolor", "Don't ask again")) + switch(option_select) + if("Recolor") + var/input_color = input(user, "Choose a Color.","[src]",color) as color + + var/list/skin_hsv = rgb2hsv(input_color) + if(skin_hsv[3] < 20) + to_chat(user, span_warning("A color that dark on an object like this? Surely not...")) + return + + color = input_color + recolored = TRUE + if("Don't ask again") + recolored = TRUE + if("Dump") + dump_ashtray(user) + else + dump_ashtray(user) + + +/obj/item/storage/ashtray/proc/dump_ashtray(mob/user) + var/ciggie_butts = 0 + + if(!contents.len) + to_chat(user, span_warning("You dump [src] out onto the ground. Too bad it has nothing in it.")) + return + + user.visible_message(span_notice("[user] dumps [src] out onto the ground."), \ + span_notice("You dump [src] out onto the ground.")) + for(var/obj/item/cigbutt/butt in contents) + ciggie_butts += 1 + qdel(butt) + + if(ciggie_butts > 8) + new /obj/effect/decal/cleanable/ash/large(get_turf(user)) + else if(ciggie_butts) + new /obj/effect/decal/cleanable/ash(get_turf(user)) + + emptyStorage() + playsound(user, 'sound/items/lighter/cig_snuff.ogg', rand(10,50), TRUE) + + +/datum/storage/ashtray + max_slots = 16 + max_specific_storage = WEIGHT_CLASS_TINY + // grid_width = 1 GRID_BOXES // DARKPACK TODO - GRIDVENTORY + // grid_height = 1 GRID_BOXES + // storage_max_columns = 4 + // storage_max_rows = 4 + +/datum/storage/ashtray/New(atom/parent, max_slots, max_specific_storage, max_total_storage, rustle_sound, remove_rustle_sound) + . = ..() + set_holdable( + list( + /obj/item/match, + /obj/item/cigbutt, + /obj/item/cigarette, + /obj/item/rollingpaper + ), + list(/obj/item/cigarette/pipe) // Blacklist + ) + + +/datum/loadout_item/pocket_items/ashtray + name = "Ashtray" + item_path = /obj/item/storage/ashtray + +/datum/loadout_item/pocket_items/ashtray/get_item_information() + . = ..() + .[FA_ICON_PALETTE] = "Recolorable" diff --git a/modular_darkpack/modules/ashtray/icons/ashtray.dmi b/modular_darkpack/modules/ashtray/icons/ashtray.dmi new file mode 100644 index 000000000000..a7ca87809752 Binary files /dev/null and b/modular_darkpack/modules/ashtray/icons/ashtray.dmi differ diff --git a/modular_darkpack/modules/ashtray/readme.md b/modular_darkpack/modules/ashtray/readme.md new file mode 100644 index 000000000000..912e6ec8f385 --- /dev/null +++ b/modular_darkpack/modules/ashtray/readme.md @@ -0,0 +1,44 @@ + + +https://github.com/DarkPack13/SecondCity/pull/454 + +## \ + +Module ID: ASHTRAY + +### Description: +Port of https://github.com/ApocryphaXIII/ApocryphaXIII/pull/225 + +Storage objects you can place smokestuffs in. + + +### TG Proc/File Changes: + +- N/A + + +### Modular Overrides: + +- N/A + + +### Defines: + +- N/A + + +### Included files that are not contained in this module: + +- N/A + + +### Credits: +FalloutFalcon, dwinters99 + diff --git a/modular_darkpack/modules/auras/code/aura.dm b/modular_darkpack/modules/auras/code/aura.dm deleted file mode 100644 index 588d22c15aef..000000000000 --- a/modular_darkpack/modules/auras/code/aura.dm +++ /dev/null @@ -1,46 +0,0 @@ -/mob/living/carbon/Initialize(mapload) - . = ..() - var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR] - hud.add_to_hud(src) - -/mob/living/carbon/proc/update_auspex_hud() - var/image/holder = hud_list[GLAND_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = "aura" - - if (client) - if(a_intent == INTENT_HARM) - holder.color = "#ff0000" - else - holder.color = "#0000ff" - else if (isnpc(src)) - var/mob/living/carbon/human/npc/N = src - if (N.danger_source) - holder.color = "#ff0000" - else - holder.color = "#0000ff" - - if (iskindred(src)) - //pale aura for vampires - holder.color = "#ffffff" - //only Baali can get antifrenzy through selling their soul, so this gives them the unholy halo (MAKE THIS BETTER) - if (antifrenzy) - holder.icon = 'modular_darkpack/modules/deprecated/icons/32x64.dmi' - //black aura for diablerists - if (diablerist) - holder.icon_state = "diablerie_aura" - - if (isgarou(src) || iswerewolf(src)) - //garou have bright auras due to their spiritual potence - holder.icon_state = "aura_bright" - - if (isghoul(src)) - //Pale spots in the aura, had to be done manually since holder.color will show only a type of color - holder.overlays = null - holder.color = null - holder.icon_state = "aura_ghoul" - - if(mind?.holy_role >= HOLY_ROLE_PRIEST) - holder.color = "#ffe12f" - holder.icon_state = "aura" diff --git a/modular_darkpack/modules/battering_ram/code/battering_ram.dm b/modular_darkpack/modules/battering_ram/code/battering_ram.dm index d4da469c1789..90a11d3c9a98 100644 --- a/modular_darkpack/modules/battering_ram/code/battering_ram.dm +++ b/modular_darkpack/modules/battering_ram/code/battering_ram.dm @@ -29,7 +29,7 @@ target_door.pixel_z = target_door.pixel_z+rand(-1, 1) target_door.pixel_w = target_door.pixel_w+rand(-1, 1) addtimer(CALLBACK(target_door, TYPE_PROC_REF(/obj/structure/vampdoor, reset_transform)), 2) - playsound(get_turf(target_door), 'modular_darkpack/modules/doors/sounds/get_bent.ogg', 50, TRUE) + playsound(get_turf(target_door), 'modular_darkpack/master_files/sounds/effects/door/get_bent.ogg', 50, TRUE) return COMPONENT_CANCEL_ATTACK_CHAIN target_door.break_door(user) return COMPONENT_CANCEL_ATTACK_CHAIN diff --git a/modular_darkpack/modules/beastmaster/code/beastmaster.dm b/modular_darkpack/modules/beastmaster/code/beastmaster.dm deleted file mode 100644 index 8fc5e2339912..000000000000 --- a/modular_darkpack/modules/beastmaster/code/beastmaster.dm +++ /dev/null @@ -1,168 +0,0 @@ -/mob/living/simple_animal/hostile/beastmaster - name = "dog" - desc = "Woof-woof." - icon = 'modular_darkpack/modules/deprecated/icons/mobs.dmi' - icon_state = "dog" - icon_living = "dog" - icon_dead = "dog_dead" - del_on_death = 1 - footstep_type = FOOTSTEP_MOB_SHOE - mob_biotypes = MOB_ORGANIC - speak_chance = 0 - turns_per_move = 1 - speed = 0.35 -// move_to_delay = 3 -// rapid = 3 -// ranged = 1 - maxHealth = 80 - health = 85 - harm_intent_damage = 5 - melee_damage_lower = 10 - melee_damage_upper = 25 - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'modular_darkpack/modules/deprecated/sounds/dog.ogg' - a_intent = INTENT_HARM - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - bloodpool = 2 - maxbloodpool = 2 -// retreat_distance = 3 -// minimum_distance = 5 -// casingtype = /obj/item/ammo_casing/vampire/c556mm -// projectilesound = 'modular_darkpack/modules/deprecated/sounds/rifle.ogg' - loot = list() - AIStatus = AI_OFF - - var/follow = TRUE - var/mob/living/carbon/human/beastmaster - var/list/enemies = list() - var/mob/living/target - -/mob/living/simple_animal/hostile/beastmaster/Initialize(mapload) - . = ..() - GLOB.beast_list += src - -/mob/living/simple_animal/hostile/beastmaster/Destroy() - . = ..() - - if (stat >= SOFT_CRIT) - return - - if(beastmaster) - beastmaster.beastmaster -= src - if(!length(beastmaster.beastmaster)) - for(var/datum/action/beastmaster_stay/E in beastmaster.actions) - qdel(E) - for(var/datum/action/beastmaster_deaggro/E in beastmaster.actions) - qdel(E) - GLOB.beast_list -= src - -/mob/living/simple_animal/hostile/beastmaster/death(gibbed) - . = ..() - if(beastmaster) - beastmaster.beastmaster -= src - if(!length(beastmaster.beastmaster)) - for(var/datum/action/beastmaster_stay/E in beastmaster.actions) - qdel(E) - for(var/datum/action/beastmaster_deaggro/E in beastmaster.actions) - qdel(E) - GLOB.beast_list -= src - -/mob/living/simple_animal/hostile/beastmaster/proc/handle_automated_beasting() - if(client) - return - if(stat > 0) - GLOB.beast_list -= src - return - if(!target) - if(length(enemies)) - for(var/mob/living/L in enemies) - if(L.stat < 1 && L.z == z && get_dist(src, L) < 12) - target = L - else if(target.z != z || get_dist(src, target) > 11 || target.stat > 0) - target = null - if(length(enemies)) - for(var/mob/living/L in enemies) - if(L.stat < 1 && L.z == z && get_dist(src, L) < 12) - target = L - - var/totalshit = 1 - if(cached_multiplicative_slowdown > 0) - totalshit = cached_multiplicative_slowdown - - if(target) - var/reqsteps = round((SSbeastmastering.next_fire-world.time)/totalshit) - walk_to(src, target, reqsteps, cached_multiplicative_slowdown) - if(get_dist(src, target) <= 1) - ClickOn(target) - else - if(follow && isturf(beastmaster.loc)) - if( (z != beastmaster.z) & (get_dist(beastmaster.loc, loc) <= 10) ) - forceMove(get_turf(beastmaster)) - else - var/reqsteps = round((SSbeastmastering.next_fire-world.time)/totalshit) - walk_to(src, beastmaster, reqsteps, cached_multiplicative_slowdown) - else - walk(src, 0) - -/mob/living/simple_animal/hostile/beastmaster/proc/add_beastmaster_enemies(mob/living/L) - if(istype(L, /mob/living/simple_animal/hostile/beastmaster)) - var/mob/living/simple_animal/hostile/beastmaster/M = L - if(M.beastmaster == beastmaster) - return - if(L == beastmaster) - return - enemies |= L - if(!target) - target = L - -/mob/living/simple_animal/hostile/beastmaster/attack_hand(mob/user) - if(user) - if(user.a_intent != INTENT_HELP) - for(var/mob/living/simple_animal/hostile/beastmaster/B in beastmaster.beastmaster) - B.add_beastmaster_enemies(user) - . = ..() - -/mob/living/simple_animal/hostile/beastmaster/on_hit(obj/projectile/P) - . = ..() - - if (!P?.firer) - return - - for (var/mob/living/simple_animal/hostile/beastmaster/B in beastmaster.beastmaster) - B.add_beastmaster_enemies(P.firer) - -/mob/living/simple_animal/hostile/beastmaster/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) - . = ..() - - if (!throwingdatum?.thrower) - return - - for(var/mob/living/simple_animal/hostile/beastmaster/B in beastmaster.beastmaster) - B.add_beastmaster_enemies(throwingdatum.thrower) - -/mob/living/simple_animal/hostile/beastmaster/attackby(obj/item/W, mob/living/user, params) - . = ..() - - if (!user || !W.force) - return - - for (var/mob/living/simple_animal/hostile/beastmaster/B in beastmaster.beastmaster) - B.add_beastmaster_enemies(user) - -/mob/living/simple_animal/hostile/beastmaster/grabbedby(mob/living/carbon/user, supress_message = FALSE) - . = ..() - - if (!user) - return - - for(var/mob/living/simple_animal/hostile/beastmaster/B in beastmaster.beastmaster) - B.add_beastmaster_enemies(user) - -/mob/living/simple_animal/hostile/beastmaster/attack_animal(mob/user) - if (user) - for (var/mob/living/simple_animal/hostile/beastmaster/B in beastmaster.beastmaster) - B.add_beastmaster_enemies(user) - - . = ..() diff --git a/modular_darkpack/modules/beastmaster/code/beastmaster_actions.dm b/modular_darkpack/modules/beastmaster/code/beastmaster_actions.dm index eb55fedabb2d..cb50ad5fb031 100644 --- a/modular_darkpack/modules/beastmaster/code/beastmaster_actions.dm +++ b/modular_darkpack/modules/beastmaster/code/beastmaster_actions.dm @@ -1,51 +1,81 @@ -/datum/action/beastmaster_stay - name = "Stay/Follow" - desc = "Command to stay or follow." - button_icon_state = "wait" +//action buttons +/datum/action/beastmaster_command_toggle_follow + name = "Command: Stay" + desc = "Toggle between Follow and Stay for all minions." + button_icon = 'icons/hud/radial_pets.dmi' + button_icon_state = "halt" check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_LYING|AB_CHECK_CONSCIOUS - var/cool_down = 0 - var/following = FALSE + var/is_following = TRUE // Track current state -/datum/action/beastmaster_stay/Trigger() +/datum/action/beastmaster_command_toggle_follow/Trigger(trigger_flags) . = ..() - - if (!ishuman(owner)) - return - - if (cool_down + 10 >= world.time) + if(!ishuman(owner)) return - cool_down = world.time var/mob/living/carbon/human/H = owner - if (!following) - following = TRUE - to_chat(owner, "You call your support.") - for (var/mob/living/simple_animal/hostile/beastmaster/B in H.beastmaster) - B.follow = TRUE + + // Toggle the state + is_following = !is_following + + // Update button appearance + if(is_following) + name = "Command: Stay" + button_icon_state = "halt" else - following = FALSE - to_chat(owner, "Your support will wait here.") - for(var/mob/living/simple_animal/hostile/beastmaster/B in H.beastmaster) - B.follow = FALSE - -/datum/action/beastmaster_deaggro - name = "Loose Aggression" - desc = "Command to stop any aggressive moves." - button_icon_state = "deaggro" - check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_LYING|AB_CHECK_CONSCIOUS - var/cool_down = 0 + name = "Command: Follow" + button_icon_state = "follow" -/datum/action/beastmaster_deaggro/Trigger() - . = ..() + build_all_button_icons(UPDATE_BUTTON_NAME | UPDATE_BUTTON_ICON) - if (!ishuman(owner)) - return + // Apply command to all minions + for(var/mob/living/minion in H.beastmaster_minions) + if(QDELETED(minion)) + continue + + var/datum/component/obeys_commands/obeys = H.minion_command_components[minion] + if(!obeys) + continue - if (cool_down+10 >= world.time) + if(is_following) + // Teleport if on different z-level + if(minion.z != owner.z && get_dist(minion, owner) < 12) + minion.forceMove(owner.loc) + + var/datum/pet_command/follow/follow_cmd = obeys.available_commands["Follow"] + if(follow_cmd) + follow_cmd.try_activate_command(H, radial_command = FALSE) + else + var/datum/pet_command/idle/stay_cmd = obeys.available_commands["Stay"] + if(stay_cmd) + stay_cmd.try_activate_command(H, radial_command = FALSE) + +/datum/action/beastmaster_command_end_aggression + name = "Command: End Aggression" + desc = "Order all minions to stop attacking." + button_icon = 'icons/hud/radial_pets.dmi' + button_icon_state = "free" + check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_LYING|AB_CHECK_CONSCIOUS + +/datum/action/beastmaster_command_end_aggression/Trigger(trigger_flags) + . = ..() + if(!ishuman(owner)) return - cool_down = world.time var/mob/living/carbon/human/H = owner - for (var/mob/living/simple_animal/hostile/beastmaster/B in H.beastmaster) - B.enemies = list() - B.target = null + + for(var/mob/living/minion in H.beastmaster_minions) + if(QDELETED(minion)) + continue + + var/datum/ai_controller/controller = minion.ai_controller + if(controller) + controller.CancelActions() + controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) + controller.clear_blackboard_key(BB_CURRENT_PET_TARGET) + controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + + var/list/enemies = controller.blackboard[BB_BEASTMASTER_ENEMIES_LIST] + if(enemies) + for(var/mob/living/enemy in enemies) + UnregisterSignal(enemy, COMSIG_LIVING_DEATH) + enemies.Cut() diff --git a/modular_darkpack/modules/beastmaster/code/beastmaster_ai.dm b/modular_darkpack/modules/beastmaster/code/beastmaster_ai.dm new file mode 100644 index 000000000000..ac7b2db26919 --- /dev/null +++ b/modular_darkpack/modules/beastmaster/code/beastmaster_ai.dm @@ -0,0 +1,80 @@ +/datum/ai_controller/basic_controller/beastmaster_summon + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/beastmaster_enemies, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/beastmaster_enemies, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + BB_BEASTMASTER_ENEMIES_LIST = list(), + ) + ai_movement = /datum/ai_movement/basic_avoidance + planning_subtrees = list( + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/pet_planning, + ) + +/datum/targeting_strategy/basic/beastmaster_enemies + +//this is an exact copy of the parent without faction logic. +/datum/targeting_strategy/basic/beastmaster_enemies/can_attack(mob/living/source, atom/movable/target, vision_range) + var/datum/ai_controller/basic_controller/our_controller = source.ai_controller + + if(isnull(our_controller)) + return FALSE + + if(isturf(target) || isnull(target)) + return FALSE + + if(isobj(target.loc)) + var/obj/container = target.loc + if(container.resistance_flags & INDESTRUCTIBLE) + return FALSE + + if(ismob(target)) + if(source.loc == target) + return FALSE + if(HAS_TRAIT(target, TRAIT_GODMODE)) + return FALSE + + if(vision_range && get_dist(source, target) > vision_range) + return FALSE + + if(!can_see(source, target, vision_range)) + return FALSE + + if(source.see_invisible < target.invisibility) + return FALSE + + if(!isturf(source.loc)) + return FALSE + + if(isturf(target.loc) && source.z != target.z) + return FALSE + + if(!isliving(target)) + return FALSE + + var/mob/living/living_target = target + + // don't attack friends + var/list/friends = our_controller.blackboard[BB_FRIENDS_LIST] + if(friends && (living_target in friends)) + return FALSE + + // check if we have a commanded target + var/mob/living/commanded_target = our_controller.blackboard[BB_CURRENT_PET_TARGET] + if(commanded_target) + if(living_target == commanded_target) + if(living_target.stat > our_controller.blackboard[BB_TARGET_MINIMUM_STAT]) + return FALSE + return TRUE + return FALSE + + // check if target is in our enemies list + var/list/enemies = our_controller.blackboard[BB_BEASTMASTER_ENEMIES_LIST] + if(enemies && length(enemies)) + if(living_target in enemies) + if(living_target.stat > our_controller.blackboard[BB_TARGET_MINIMUM_STAT]) + return FALSE + return TRUE + + return FALSE diff --git a/modular_darkpack/modules/beastmaster/code/beastmaster_commands.dm b/modular_darkpack/modules/beastmaster/code/beastmaster_commands.dm new file mode 100644 index 000000000000..7227053e6ec5 --- /dev/null +++ b/modular_darkpack/modules/beastmaster/code/beastmaster_commands.dm @@ -0,0 +1,229 @@ +/datum/pet_command/attack/beastmaster + targeting_strategy_key = BB_PET_TARGETING_STRATEGY + +/datum/pet_command/attack/beastmaster/on_target_set(mob/living/friend, atom/potential_target) + var/mob/living/parent = weak_parent.resolve() + if(!parent) + return FALSE + + // dont attack random atoms like sand + if(!isliving(potential_target)) + return FALSE + + var/mob/living/living_target = potential_target + + // an ai controller is necessary + if(!parent.ai_controller) + return FALSE + + // don't attack friends + var/list/friends = parent.ai_controller.blackboard[BB_FRIENDS_LIST] + if(friends && (living_target in friends)) + to_chat(friend, span_warning("[parent] refuses to attack [living_target]!")) + return FALSE + + // don't attack the summoner + if(living_target == friend) + to_chat(friend, span_warning("[parent] refuses to attack you!")) + return FALSE + + // don't attack dead things + if(living_target.stat == DEAD) + return FALSE + + // add to enemies list for persistent targeting + var/list/enemies = parent.ai_controller.blackboard[BB_BEASTMASTER_ENEMIES_LIST] + if(!islist(enemies)) + enemies = list() + parent.ai_controller.blackboard[BB_BEASTMASTER_ENEMIES_LIST] = enemies + + if(!(living_target in enemies)) + enemies += living_target + RegisterSignal(living_target, COMSIG_LIVING_DEATH, PROC_REF(on_enemy_death), override = TRUE) + + parent.ai_controller.set_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET, living_target) + parent.ai_controller.set_blackboard_key(BB_CURRENT_PET_TARGET, living_target) + parent.ai_controller.set_blackboard_key(BB_ACTIVE_PET_COMMAND, src) + parent.visible_message(span_warning("[parent] follows [friend]'s gesture towards [living_target] [pointed_reaction]!")) + return TRUE + +/datum/pet_command/attack/beastmaster/execute_action(datum/ai_controller/controller) + var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + + // if current target is invalid, find a new one from enemies list + if(!target || target.stat == DEAD) + var/list/enemies = controller.blackboard[BB_BEASTMASTER_ENEMIES_LIST] + if(enemies && length(enemies)) + for(var/mob/living/enemy in enemies) + if(!QDELETED(enemy) && enemy.stat != DEAD) + target = enemy + controller.set_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET, target) + controller.set_blackboard_key(BB_CURRENT_PET_TARGET, target) + break + + // no valid targets, clear everything + if(!target) + controller.clear_blackboard_key(BB_CURRENT_PET_TARGET) + controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) + + // get owner and check their follow/stay state + var/mob/living/pawn = controller.pawn + var/list/friends = controller.blackboard[BB_FRIENDS_LIST] + if(friends && length(friends)) + //the master should be the first friend in the list + var/mob/living/carbon/human/owner = friends[1] + if(ishuman(owner)) + //check whether they were following or staying before and then return to that after all enemies are defeated + var/datum/action/beastmaster_command_toggle_follow/toggle = locate() in owner.actions + var/datum/component/obeys_commands/obeys = owner.minion_command_components[pawn] + if(toggle && obeys) + if(toggle.is_following) + var/datum/pet_command/follow/follow_cmd = obeys.available_commands["Follow"] + follow_cmd?.set_command_active(pawn, owner) + else + var/datum/pet_command/idle/stay_cmd = obeys.available_commands["Stay"] + stay_cmd?.set_command_active(pawn, owner) + + return + + // attack the target + controller.queue_behavior(attack_behaviour, BB_BASIC_MOB_CURRENT_TARGET, targeting_strategy_key) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/pet_command/attack/beastmaster/proc/on_enemy_death(mob/living/dead_enemy) + SIGNAL_HANDLER + var/mob/living/parent = weak_parent.resolve() + if(!parent?.ai_controller) + return + + // remove from enemies list + var/list/enemies = parent.ai_controller.blackboard[BB_BEASTMASTER_ENEMIES_LIST] + if(enemies) + enemies -= dead_enemy + + UnregisterSignal(dead_enemy, COMSIG_LIVING_DEATH) + + // if this was our current target, find next target, if there is one + if(parent.ai_controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] == dead_enemy) + var/mob/living/new_target = null + + // find the next enemy + if(enemies && length(enemies)) + for(var/mob/living/enemy in enemies) + if(!QDELETED(enemy) && enemy.stat != DEAD) + new_target = enemy + break + + if(new_target) + // theres a new target so plan your attack + parent.ai_controller.set_blackboard_key(BB_CURRENT_PET_TARGET, new_target) + parent.ai_controller.set_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET, new_target) + parent.ai_controller.CancelActions() + parent.ai_controller.able_to_plan = TRUE + else + // no more enemies, clear and return to previous behavior + parent.ai_controller.clear_blackboard_key(BB_CURRENT_PET_TARGET) + parent.ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) + + var/list/friends = parent.ai_controller.blackboard[BB_FRIENDS_LIST] + if(friends && length(friends)) + var/mob/living/carbon/human/owner = friends[1] + if(ishuman(owner)) + var/datum/action/beastmaster_command_toggle_follow/toggle = locate() in owner.actions + var/datum/component/obeys_commands/obeys = owner.minion_command_components[parent] + if(toggle && obeys) + if(toggle.is_following) + var/datum/pet_command/follow/follow_cmd = obeys.available_commands["Follow"] + follow_cmd?.set_command_active(parent, owner) + else + var/datum/pet_command/idle/stay_cmd = obeys.available_commands["Stay"] + stay_cmd?.set_command_active(parent, owner) + +/datum/pet_command/free/beastmaster + +/datum/pet_command/free/beastmaster/execute_action(datum/ai_controller/controller) + // clear all commands + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + controller.clear_blackboard_key(BB_CURRENT_PET_TARGET) + controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) + controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + + // clear enemies list and unregister signals + var/list/enemies = controller.blackboard[BB_BEASTMASTER_ENEMIES_LIST] + if(enemies) + for(var/mob/living/enemy in enemies) + UnregisterSignal(enemy, COMSIG_LIVING_DEATH) + enemies.Cut() + + controller.CancelActions() + return + +/datum/pet_command/befriend_target + command_name = "Befriend" + command_desc = "Command your pet to befriend someone you click on." + radial_icon = 'modular_darkpack/modules/beastmaster/icons/radial_beastmaster.dmi' + radial_icon_state = "friend" + speech_commands = list("befriend", "friend") + command_feedback = "wags tail" + +/datum/pet_command/befriend_target/set_command_active(mob/living/parent, mob/living/commander, radial_command = FALSE) + if(!pet_able_to_respond()) + return FALSE + + if(command_feedback) + parent.balloon_alert_to_viewers("[command_feedback]") + + if(!radial_command) + return TRUE + + RegisterSignal(commander, COMSIG_MOB_CLICKON, PROC_REF(click_on_target)) + commander.client?.mouse_override_icon = 'icons/effects/mouse_pointers/pet_paw.dmi' + commander.update_mouse_pointer() + return TRUE + +/datum/pet_command/befriend_target/on_target_set(mob/living/friend, atom/potential_target) + var/mob/living/parent = weak_parent.resolve() + if(!parent) + return FALSE + + if(!isliving(potential_target)) + return FALSE + + var/mob/living/living_target = potential_target + + var/list/friends = parent.ai_controller.blackboard[BB_FRIENDS_LIST] + if(friends && (living_target in friends)) + to_chat(friend, span_notice("[parent] is already friends with [living_target]!")) + return FALSE + + parent.befriend(living_target) + + //tell all the other summons to befriend this guy too + if(ishuman(friend)) + var/mob/living/carbon/human/H = friend + for(var/mob/living/other_minion in H.beastmaster_minions) + if(other_minion == parent || QDELETED(other_minion)) + continue + other_minion.befriend(living_target) + + //remove this guy from the enemies list if we're queued up to attack them + var/list/enemies = parent.ai_controller.blackboard[BB_BEASTMASTER_ENEMIES_LIST] + if(enemies && (living_target in enemies)) + enemies -= living_target + UnregisterSignal(living_target, COMSIG_LIVING_DEATH) + + //and if theyre the current target remove that too + if(parent.ai_controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] == living_target) + parent.ai_controller.clear_blackboard_key(BB_CURRENT_PET_TARGET) + parent.ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) + parent.ai_controller.CancelActions() + + parent.visible_message(span_notice("[parent] follows [friend]'s gesture and befriends [living_target]!")) + return TRUE + +/datum/pet_command/befriend_target/retrieve_command_text(atom/living_pet, atom/target) + return isnull(target) ? null : "signals [living_pet] to befriend [target]!" + +/datum/pet_command/befriend_target/execute_action(datum/ai_controller/controller) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + return SUBTREE_RETURN_FINISH_PLANNING diff --git a/modular_darkpack/modules/beastmaster/code/beastmaster_globals.dm b/modular_darkpack/modules/beastmaster/code/beastmaster_globals.dm deleted file mode 100644 index 9663175ebc3b..000000000000 --- a/modular_darkpack/modules/beastmaster/code/beastmaster_globals.dm +++ /dev/null @@ -1,2 +0,0 @@ -/// List of all "beasts" (controllable summons) that exist in the beastmaster subsystem -GLOBAL_LIST_EMPTY(beast_list) diff --git a/modular_darkpack/modules/beastmaster/code/beastmaster_interactions.dm b/modular_darkpack/modules/beastmaster/code/beastmaster_interactions.dm deleted file mode 100644 index ac46c5cc9193..000000000000 --- a/modular_darkpack/modules/beastmaster/code/beastmaster_interactions.dm +++ /dev/null @@ -1,45 +0,0 @@ -/mob/living/carbon/human/attack_hand(mob/user) - if(user) - if(user.a_intent != INTENT_HELP) - for(var/mob/living/simple_animal/hostile/beastmaster/B in beastmaster) - B.add_beastmaster_enemies(user) - . = ..() - -/mob/living/carbon/human/attack_animal(mob/user) - if(user) - for(var/mob/living/simple_animal/hostile/beastmaster/B in beastmaster) - B.add_beastmaster_enemies(user) - . = ..() - -/mob/living/carbon/human/on_hit(obj/projectile/P) - . = ..() - if(P) - if(P.firer) - for(var/mob/living/simple_animal/hostile/beastmaster/B in beastmaster) - B.add_beastmaster_enemies(P.firer) - -/mob/living/carbon/human/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) - . = ..() - if(throwingdatum) - if(throwingdatum.thrower) - for(var/mob/living/simple_animal/hostile/beastmaster/B in beastmaster) - B.add_beastmaster_enemies(throwingdatum.thrower) - -/mob/living/carbon/human/attackby(obj/item/W, mob/living/user, params) - . = ..() - if(user) - if(W.force) - for(var/mob/living/simple_animal/hostile/beastmaster/B in beastmaster) - B.add_beastmaster_enemies(user) - -/mob/living/carbon/human/grabbedby(mob/living/carbon/user, supress_message = FALSE) - . = ..() - for(var/mob/living/simple_animal/hostile/beastmaster/B in beastmaster) - B.add_beastmaster_enemies(user) - -/mob/living/carbon/human/pointed(atom/A as mob|obj|turf in view(client.view, src)) - if(..()) - if(isliving(A)) - for(var/mob/living/simple_animal/hostile/beastmaster/B in beastmaster) - B.add_beastmaster_enemies(A) -// B.GiveTarget(A) diff --git a/modular_darkpack/modules/beastmaster/code/beastmaster_minion_management.dm b/modular_darkpack/modules/beastmaster/code/beastmaster_minion_management.dm new file mode 100644 index 000000000000..174f17144070 --- /dev/null +++ b/modular_darkpack/modules/beastmaster/code/beastmaster_minion_management.dm @@ -0,0 +1,110 @@ +//beastmaster commands list. some are from the parent, some are custom and from beastmaster_commands.dm +#define BEASTMASTER_COMMANDS list(\ + /datum/pet_command/idle,\ + /datum/pet_command/follow/start_active,\ + /datum/pet_command/attack/beastmaster,\ + /datum/pet_command/protect_owner,\ + /datum/pet_command/free/beastmaster,\ + /datum/pet_command/befriend_target,\ +) + +/mob/living/carbon/human/proc/add_beastmaster_minion(mob/living/minion_or_type, turf/spawn_location) + //first, make sure the beastmaster_minions list is accurate + for(var/mob/living/minion in beastmaster_minions) + if(QDELETED(minion) || minion.stat == DEAD) + beastmaster_minions -= minion + minion_command_components -= minion + + //limit of (leadership) + 1 + var/max_minions = st_get_stat(STAT_LEADERSHIP) + 1 + if(length(beastmaster_minions) >= max_minions) + to_chat(src, span_warning("You cannot control more than [max_minions] minion[max_minions > 1 ? "s" : ""]!")) + return FALSE + + //does the mob exist? if not, spawn it. if its already spawned in, just reference them + var/mob/living/minion + if(ispath(minion_or_type, /mob/living)) + minion = new minion_or_type(spawn_location || get_turf(src)) + else if(isliving(minion_or_type)) + minion = minion_or_type + else + return FALSE + + //all mobs that we want to control need an ai_controller. if they don't have it - they just cant be controlled. + if(!minion.ai_controller) + to_chat(src, span_warning("[minion] cannot be commanded!")) + if(ispath(minion_or_type)) + qdel(minion) + return FALSE + + //check if there was already a component for this + var/datum/component/obeys_commands/old_component = minion.GetComponent(/datum/component/obeys_commands) + if(old_component) + qdel(old_component) + + //now we add the obeys commands component and befriend the beastmaster + var/datum/component/obeys_commands/new_component = minion.AddComponent(/datum/component/obeys_commands, BEASTMASTER_COMMANDS) + minion_command_components[minion] = new_component + minion.befriend(src) + + // befriend all existing minions and share their friends + for(var/mob/living/other_minion in beastmaster_minions) + minion.befriend(other_minion) + other_minion.befriend(minion) + + // share all friends from existing minions to new minion + var/list/other_friends = other_minion.ai_controller?.blackboard[BB_FRIENDS_LIST] + if(other_friends) + for(var/mob/living/shared_friend in other_friends) + if(shared_friend == minion || shared_friend == other_minion || shared_friend == src) + continue + minion.befriend(shared_friend) + + //if we didnt have beastmaster minions before, then register beastmaster signals. + var/had_minions = length(beastmaster_minions) + beastmaster_minions += minion + RegisterSignal(minion, COMSIG_LIVING_DEATH, PROC_REF(on_minion_death)) + + if(!had_minions) + register_beastmaster_signals() + + to_chat(src, span_notice("You bind [minion] to your will!")) + return TRUE + +//when the minion dies we need to remove them from beastmaster_minions, and if there are no more minions, remove the signals from the master. +/mob/living/carbon/human/proc/on_minion_death(mob/living/minion) + SIGNAL_HANDLER + beastmaster_minions -= minion + minion_command_components -= minion + UnregisterSignal(minion, COMSIG_LIVING_DEATH) + + if(!length(beastmaster_minions)) + unregister_beastmaster_signals() + +/mob/living/carbon/human/proc/remove_beastmaster_minion(mob/living/minion) + if(!minion) + return + + //unfriend from all other minions and the owner + for(var/mob/living/other_minion in beastmaster_minions) + if(other_minion == minion) + continue + minion.unfriend(other_minion) + other_minion.unfriend(minion) + + minion.unfriend(src) + + //delete the obeys commands component + var/datum/component/obeys_commands/component = minion_command_components[minion] + if(component) + qdel(component) + + //remove them from the owner's minion's list and unregister signals if the list is now empty + beastmaster_minions -= minion + minion_command_components -= minion + UnregisterSignal(minion, COMSIG_LIVING_DEATH) + + if(!length(beastmaster_minions)) + unregister_beastmaster_signals() + +#undef BEASTMASTER_COMMANDS diff --git a/modular_darkpack/modules/beastmaster/code/beastmaster_signals.dm b/modular_darkpack/modules/beastmaster/code/beastmaster_signals.dm new file mode 100644 index 000000000000..577f59d5487e --- /dev/null +++ b/modular_darkpack/modules/beastmaster/code/beastmaster_signals.dm @@ -0,0 +1,64 @@ +//register pointing signals and grant actions on the owner - this allows them to use the attack command. +/mob/living/carbon/human/proc/register_beastmaster_signals() + if(!GetComponent(/datum/component/beastmaster_defender)) + AddComponent(/datum/component/beastmaster_defender) + + if(!locate(/datum/action/beastmaster_command_toggle_follow) in actions) + var/datum/action/beastmaster_command_toggle_follow/toggle_follow = new() + toggle_follow.Grant(src) + var/datum/action/beastmaster_command_end_aggression/endaggro = new() + endaggro.Grant(src) + +/mob/living/carbon/human/proc/unregister_beastmaster_signals() + var/datum/component/beastmaster_defender/component = GetComponent(/datum/component/beastmaster_defender) + if(component) + qdel(component) + + //remove action buttons + for(var/datum/action/beastmaster_cmd in actions) + if(istype(beastmaster_cmd, /datum/action/beastmaster_command_toggle_follow) || \ + istype(beastmaster_cmd, /datum/action/beastmaster_command_end_aggression)) + beastmaster_cmd.Remove(src) + +/datum/component/beastmaster_defender/Initialize() + if(!ishuman(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, COMSIG_MOVABLE_POINTED, PROC_REF(on_beastmaster_point)) + +/datum/component/beastmaster_defender/Destroy() + UnregisterSignal(parent, COMSIG_MOVABLE_POINTED) + return ..() + +/datum/component/beastmaster_defender/proc/on_beastmaster_point(datum/source, atom/pointed_at, obj/effect/temp_visual/point/point, intentional) + SIGNAL_HANDLER + + var/atom/target = pointed_at + + //latest /tg/ pull makes it so that pointing at something out of reach registers as the turf rather than whatever you point at. i discovered this through debug messages + //so lets instead just grab the mobs on top of the turf. + if(isturf(pointed_at)) + for(var/mob/living/L in pointed_at) + target = L + break + + if(!isliving(target)) + return + + var/mob/living/carbon/human/H = parent + var/mob/living/living_target = target + + for(var/mob/living/minion in H.beastmaster_minions) + if(QDELETED(minion) || !minion.ai_controller) + continue + + var/datum/component/obeys_commands/obeys = H.minion_command_components[minion] + if(!obeys) + continue + + var/datum/pet_command/attack/attack_command = obeys.available_commands["Attack"] + if(!attack_command) + continue + + //stop everything we're doing if the beastmaster points at an enemy - its time to attack + minion.ai_controller.CancelActions() + attack_command.on_target_set(H, living_target) diff --git a/modular_darkpack/modules/beastmaster/code/beastmaster_subsystem.dm b/modular_darkpack/modules/beastmaster/code/beastmaster_subsystem.dm deleted file mode 100644 index 90d03c0f5cb1..000000000000 --- a/modular_darkpack/modules/beastmaster/code/beastmaster_subsystem.dm +++ /dev/null @@ -1,36 +0,0 @@ -SUBSYSTEM_DEF(beastmastering) - name = "Beastmastering" - init_order = INIT_ORDER_DEFAULT - wait = 10 - priority = FIRE_PRIORITY_NPC - - var/list/currentrun = list() - -/datum/controller/subsystem/beastmastering/stat_entry(msg) - var/list/activelist = GLOB.beast_list - msg = "BEASTS:[length(activelist)]" - return ..() - -/datum/controller/subsystem/beastmastering/fire(resumed = FALSE) - - if (!resumed) - var/list/activelist = GLOB.beast_list - src.currentrun = activelist.Copy() - - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - - while(currentrun.len) - var/mob/living/simple_animal/hostile/beastmaster/NPC = currentrun[currentrun.len] - --currentrun.len - - if (QDELETED(NPC)) // Some issue causes nulls to get into this list some times. This keeps it running, but the bug is still there. - GLOB.npc_list -= NPC - GLOB.alive_npc_list -= NPC - log_world("Found a null in npc list!") - continue - - //NPC.observed_by_player() - if(MC_TICK_CHECK) - return - NPC.handle_automated_beasting() diff --git a/modular_darkpack/modules/beastmaster/icons/radial_beastmaster.dmi b/modular_darkpack/modules/beastmaster/icons/radial_beastmaster.dmi new file mode 100644 index 000000000000..10764436b60a Binary files /dev/null and b/modular_darkpack/modules/beastmaster/icons/radial_beastmaster.dmi differ diff --git a/modular_darkpack/modules/bitcoinminer/code/bitcoinminer.dm b/modular_darkpack/modules/bitcoinminer/code/bitcoinminer.dm new file mode 100644 index 000000000000..f995ba1aa7d0 --- /dev/null +++ b/modular_darkpack/modules/bitcoinminer/code/bitcoinminer.dm @@ -0,0 +1,92 @@ +/obj/machinery/bitcoin_miner + name = "bitcoin miner" + desc = "It's a rig designed to mine cryptocurrency with a monitor connected to it.\nIt has an output for withdrawing the cash obtained from mining, somehow." + icon = 'modular_darkpack/modules/bitcoinminer/icons/bitcoinminer.dmi' + icon_state = "miner_off" + density = TRUE + var/active = FALSE + var/starting = FALSE + var/money_stored = 0 + var/money_per_tick_min = 1 + var/money_per_tick_max = 2 + +/obj/machinery/bitcoin_miner/Initialize(mapload) + . = ..() + update_appearance() + +/obj/machinery/bitcoin_miner/process(seconds_per_tick) + if(active) + money_stored += rand(money_per_tick_min, money_per_tick_max) * seconds_per_tick + else + STOP_PROCESSING(SSobj, src) + +/obj/machinery/bitcoin_miner/update_icon_state() + icon_state = active ? "miner_on" : "miner_off" + if(starting) + icon_state = "miner_starting" + return ..() + +/obj/machinery/bitcoin_miner/examine(mob/user) + . = ..() + if(active && in_range(user, src)) + . += span_notice("It currently has [money_stored / 222] BTC converted into $[money_stored]") // division by 222 to replicate 2015 BTC prices + . += span_notice("Alt+Click to turn \the [src] off.") + if(starting) + . += span_notice("It appears to be starting.") + if(!active && !starting) + . += span_notice("It appears to be off.") + +/obj/machinery/bitcoin_miner/proc/toggle_on(mob/user) + starting = TRUE + playsound(src, 'sound/machines/computer/computer_start.ogg', 40) + update_appearance() + sleep(5 SECONDS) + starting = FALSE + active = TRUE + update_appearance() + START_PROCESSING(SSobj, src) + +/obj/machinery/bitcoin_miner/proc/toggle_off(mob/user) + active = FALSE + playsound(src, 'sound/machines/computer/computer_start.ogg', 40) + update_appearance() + STOP_PROCESSING(SSobj, src) + +/obj/machinery/bitcoin_miner/Destroy() + toggle_off() + return ..() + +/obj/machinery/bitcoin_miner/proc/dump_loot(mob/user) + if(money_stored > 0) + var/money_to_spawn = min(money_stored, /obj/item/stack/dollar::max_amount) + new /obj/item/stack/dollar(drop_location(), money_to_spawn) + money_stored -= money_to_spawn + playsound(src, 'sound/machines/eject.ogg', 30) + to_chat(user, span_notice("You withdraw [MONEY_SYMBOL][money_to_spawn] from \the [src]!")) + else + to_chat(user, span_notice("The balance is empty!")) + +/obj/machinery/bitcoin_miner/interact(mob/user) + . = ..() + if(!in_range(user, src)) + return + + if(!active) + if(starting) + to_chat(user, span_warning("\the [src] is starting!")) + return + if(tgui_alert(user, "Would you like to turn \the [src] on?", "Mining", list("Yes", "No")) == "Yes") + to_chat(user, span_notice("You turn \the [src] on.")) + toggle_on(user) + else + dump_loot(user) + +/obj/machinery/bitcoin_miner/click_alt(mob/user) + . = ..() + if(!in_range(user, src)) + return + + if(active) + if(tgui_alert(user, "Would you like to turn \the [src] off?", "Mining", list("Yes", "No")) == "Yes") + to_chat(user, span_notice("You turn \the [src] off.")) + toggle_off() diff --git a/modular_darkpack/modules/bitcoinminer/icons/bitcoinminer.dmi b/modular_darkpack/modules/bitcoinminer/icons/bitcoinminer.dmi new file mode 100644 index 000000000000..84e0661b53c1 Binary files /dev/null and b/modular_darkpack/modules/bitcoinminer/icons/bitcoinminer.dmi differ diff --git a/modular_darkpack/modules/blood_drinking/code/bite_helper_procs.dm b/modular_darkpack/modules/blood_drinking/code/bite_helper_procs.dm index ae133a29a31b..f94d98de04bc 100644 --- a/modular_darkpack/modules/blood_drinking/code/bite_helper_procs.dm +++ b/modular_darkpack/modules/blood_drinking/code/bite_helper_procs.dm @@ -1,8 +1,10 @@ //Wrapper function for adjusting a kindred/ghoul's blood pool -/mob/living/proc/adjustBloodPool(blood_delta, on_spawn = FALSE) +/mob/living/proc/adjust_blood_pool(amount, updating_health = TRUE, on_spawn) if(on_spawn) bloodpool = 0 - bloodpool = clamp(bloodpool+blood_delta, 0, maxbloodpool) + bloodpool = clamp(bloodpool+amount, 0, maxbloodpool) + if(updating_health) + update_blood_hud() //runs a bite animation for biting people and biting people and biting p /mob/living/carbon/human/proc/add_bite_animation() diff --git a/modular_darkpack/modules/blood_drinking/code/drinksomeblood.dm b/modular_darkpack/modules/blood_drinking/code/drinksomeblood.dm index 0aae822adf64..894985d9eee0 100644 --- a/modular_darkpack/modules/blood_drinking/code/drinksomeblood.dm +++ b/modular_darkpack/modules/blood_drinking/code/drinksomeblood.dm @@ -32,7 +32,7 @@ mob.apply_status_effect(/datum/status_effect/kissed) return - mob.adjustBloodPool(-1) + mob.adjust_blood_pool(-1) suckbar.icon_state = "[round(14*(mob.bloodpool/mob.maxbloodpool))]" if(ishuman(mob)) @@ -48,7 +48,7 @@ H.reagents.trans_to(src, min(10, H.reagents.total_volume), transferred_by = mob, methods = INGEST) if(HAS_TRAIT(src, TRAIT_PAINFUL_VAMPIRE_KISS)) - mob.adjustBruteLoss(20, TRUE) + mob.adjust_brute_loss(20, TRUE) //Ventrue can suck on normal people, but not homeless people and animals. //BLOOD_QUALITY_LOV - 1, BLOOD_QUALITY_NORMAL - 2, BLOOD_QUALITY_HIGH - 3. Blue blood gives +1 to suction @@ -63,20 +63,19 @@ if(iskindred(mob)) to_chat(src, span_userdanger("[mob]'s blood tastes HEAVENLY...")) - adjustBruteLoss(-25, TRUE) - adjustFireLoss(-25, TRUE) + adjust_brute_loss(-25, TRUE) + adjust_fire_loss(-25, TRUE) else to_chat(src, span_warning("You sip some BLOOD from your victim. It feels good.")) var/drink_mod = calculate_drink_modifier(mob) if(drink_mod) - adjustBloodPool(drink_mod*max(1, mob.bloodquality-1)) - adjustBruteLoss(-10, TRUE) - adjustFireLoss(-10, TRUE) + adjust_blood_pool(drink_mod*max(1, mob.bloodquality-1)) + adjust_brute_loss(-10, TRUE) + adjust_fire_loss(-10, TRUE) update_damage_overlays() update_health_hud() - update_blood_hud() if(mob.bloodpool <= 0) handle_drink_dry(mob) diff --git a/modular_darkpack/modules/blood_drinking/code/movable_screens/blood_hud.dm b/modular_darkpack/modules/blood_drinking/code/movable_screens/blood_hud.dm index cf881589f1fd..0affecd57f17 100644 --- a/modular_darkpack/modules/blood_drinking/code/movable_screens/blood_hud.dm +++ b/modular_darkpack/modules/blood_drinking/code/movable_screens/blood_hud.dm @@ -1,27 +1,28 @@ -/atom/movable/screen/blood +#define ui_living_bloodpool "EAST-1:28,CENTER-4:14" +/atom/movable/screen/bloodpool name = "bloodpool" - icon = 'modular_darkpack/modules/blood_drinking/icons/bloodpool.dmi' + //icon = 'modular_darkpack/modules/blood_drinking/icons/bloodpool.dmi' + //32x32 version + icon = 'modular_darkpack/modules/blood_drinking/icons/old_bloodpool.dmi' icon_state = "blood0" + screen_loc = ui_living_bloodpool + mouse_over_pointer = MOUSE_HAND_POINTER -/atom/movable/screen/blood/Click() - if(iscarbon(usr)) - var/mob/living/carbon/human/BD = usr - BD.update_blood_hud() - if(BD.bloodpool > 0) - to_chat(BD, span_notice("You've got [BD.bloodpool]/[BD.maxbloodpool] blood points.")) +/atom/movable/screen/bloodpool/Click() + if(isliving(usr)) + var/mob/living/bloodbag = usr + bloodbag.update_blood_hud() + if(bloodbag.bloodpool > 0) + to_chat(bloodbag, span_notice("You've got [bloodbag.bloodpool]/[bloodbag.maxbloodpool] blood points.")) else - to_chat(BD, span_warning("You've got [BD.bloodpool]/[BD.maxbloodpool] blood points.")) + to_chat(bloodbag, span_warning("You've got [bloodbag.bloodpool]/[bloodbag.maxbloodpool] blood points.")) . = ..() /mob/living/proc/update_blood_hud() if(!client || !hud_used) return - maxbloodpool = 10+((13-generation)*3) - if(hud_used.blood_icon) - var/emm = round((bloodpool/maxbloodpool)*10) - if(emm > 10) - hud_used.blood_icon.icon_state = "blood10" - if(emm < 0) - hud_used.blood_icon.icon_state = "blood0" - else - hud_used.blood_icon.icon_state = "blood[emm]" + if(hud_used.bloodpool_icon) + var/emm = clamp(round((bloodpool/maxbloodpool)*10), 0, 10) + hud_used.bloodpool_icon.icon_state = "blood[emm]" + +#undef ui_living_bloodpool diff --git a/modular_darkpack/modules/blood_drinking/code/overfeeding/diablerie/adjust_generation.dm b/modular_darkpack/modules/blood_drinking/code/overfeeding/diablerie/adjust_generation.dm index 4116a6dc4d70..42a6c8697911 100644 --- a/modular_darkpack/modules/blood_drinking/code/overfeeding/diablerie/adjust_generation.dm +++ b/modular_darkpack/modules/blood_drinking/code/overfeeding/diablerie/adjust_generation.dm @@ -1,10 +1,11 @@ /mob/living/carbon/human/proc/adjust_generation(mob/living/carbon/human/victim) + var/datum/splat/vampire/kindred/kindred = iskindred(src) + var/generation = get_generation() + var/victim_generation = victim.get_generation() + var/new_generation = generation - if(victim.generation < generation) - new_generation = max(generation - 1, 7) - generation = new_generation + if(victim_generation < generation) + new_generation = max(generation - 1, MAX_TRUSTED_GENERATION) + kindred.set_generation(new_generation) - if(!GLOB.canon_event) - to_chat(src, span_warning("Cannot save generation preference; current round is not canon.")) - else - client.prefs.write_preference(GLOB.preference_entries[/datum/preference/numeric/generation], new_generation) + client.prefs.write_preference_midround(GLOB.preference_entries[/datum/preference/numeric/generation], new_generation) diff --git a/modular_darkpack/modules/blood_drinking/code/overfeeding/diablerie/handle_diablerie.dm b/modular_darkpack/modules/blood_drinking/code/overfeeding/diablerie/handle_diablerie.dm index 141e81816003..9a174730488f 100644 --- a/modular_darkpack/modules/blood_drinking/code/overfeeding/diablerie/handle_diablerie.dm +++ b/modular_darkpack/modules/blood_drinking/code/overfeeding/diablerie/handle_diablerie.dm @@ -1,38 +1,38 @@ -/mob/living/carbon/human/proc/handle_diablerie(var/mob/living/mob) - if(!ishuman(mob)) - CRASH("Tried to diablerize nonhuman vampire. Add handling for this!") - - var/mob/living/carbon/human/mob_human = mob +/mob/living/carbon/human/proc/handle_diablerie(mob/living/victim) AdjustHumanity(-1, 0) - if(mob_human.generation >= generation) - message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]") - log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].") - if(mob_human.client) + var/datum/splat/vampire/kindred/kindred = iskindred(src) + var/generation = get_generation() + var/victim_generation = victim.get_generation() + + if(victim_generation >= generation) + message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(victim)]") + log_attack("[key_name(src)] successfully Diablerized [key_name(victim)].") + if(victim.client) var/datum/brain_trauma/special/imaginary_friend/trauma = gain_trauma(/datum/brain_trauma/special/imaginary_friend) - trauma.friend.key = mob_human.key + trauma.friend.key = victim.key else var/start_prob = 10 if(HAS_TRAIT(src, TRAIT_DIABLERIE)) start_prob = 30 - if(prob(min(99, start_prob+((generation-mob_human.generation)*10)))) - to_chat(src, "[mob_human]'s SOUL OVERCOMES YOURS AND GAINS CONTROL OF YOUR BODY.") - message_admins("[ADMIN_LOOKUPFLW(src)] tried to Diablerize [ADMIN_LOOKUPFLW(mob)] and was overtaken.") - log_attack("[key_name(src)] tried to Diablerize [key_name(mob)] and was overtaken.") - generation = mob_human.generation - if(mob_human.mind) - mob_human.mind.transfer_to(src, TRUE) + if(prob(min(99, start_prob+((generation-victim_generation)*10)))) + to_chat(src, span_userdanger(span_bold("[victim]'s soul overcomes yours and gains control of your body!"))) + message_admins("[ADMIN_LOOKUPFLW(src)] tried to Diablerize [ADMIN_LOOKUPFLW(victim)] and was overtaken.") + log_attack("[key_name(src)] tried to Diablerize [key_name(victim)] and was overtaken.") + kindred.set_generation(victim_generation) + if(victim.mind) + victim.mind.transfer_to(src, TRUE) else death() return - message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]") - log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].") - if(mob_human.client) + message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(victim)]") + log_attack("[key_name(src)] successfully Diablerized [key_name(victim)].") + if(victim.client) var/datum/brain_trauma/special/imaginary_friend/trauma = gain_trauma(/datum/brain_trauma/special/imaginary_friend) - trauma.friend.key = mob_human.key + trauma.friend.key = victim.key make_diablerist() - adjustBruteLoss(-50, TRUE) - adjustFireLoss(-50, TRUE) - mob.death() + adjust_brute_loss(-50, TRUE) + adjust_fire_loss(-50, TRUE) + victim.death() diff --git a/modular_darkpack/modules/blood_drinking/code/overfeeding/diablerie/make_diablerist.dm b/modular_darkpack/modules/blood_drinking/code/overfeeding/diablerie/make_diablerist.dm index 952292a5b198..f10fcb5d7931 100644 --- a/modular_darkpack/modules/blood_drinking/code/overfeeding/diablerie/make_diablerist.dm +++ b/modular_darkpack/modules/blood_drinking/code/overfeeding/diablerie/make_diablerist.dm @@ -3,8 +3,6 @@ if(!client?.prefs) return - if(!GLOB.canon_event) - to_chat(src, span_warning("Cannot save diablerie preference; current round is not canon.")) - else - client.prefs.write_preference(GLOB.preference_entries[/datum/preference/toggle/diablerist], TRUE) + client.prefs.write_preference_midround(GLOB.preference_entries[/datum/preference/toggle/diablerist], TRUE) ADD_TRAIT(src, TRAIT_DIABLERIE, TRAIT_DIABLERIE) + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_AURA) diff --git a/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm b/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm index e153150339d3..51b97e3da053 100644 --- a/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm +++ b/modular_darkpack/modules/blood_drinking/code/vamp_bite.dm @@ -1,12 +1,12 @@ //this code is what should be called every time blood drinking is used on a character /mob/living/carbon/human/proc/vamp_bite() - src.update_blood_hud() + update_blood_hud() if(!COOLDOWN_FINISHED(src, drinkblood_use_cd) || !COOLDOWN_FINISHED(src, drinkblood_click_cd)) return COOLDOWN_START(src, drinkblood_click_cd, 1 SECONDS) - if(src.grab_state > GRAB_PASSIVE) - if(ishuman(src.pulling)) - var/mob/living/carbon/human/PB = src.pulling + if(grab_state > GRAB_PASSIVE) + if(ishuman(pulling)) + var/mob/living/carbon/human/PB = pulling if(isghoul(src)) if(!iskindred(PB)) SEND_SOUND(src, sound('modular_darkpack/modules/blood_drinking/sounds/need_blood.ogg', 0, 0, 75)) @@ -20,11 +20,11 @@ SEND_SOUND(src, sound('modular_darkpack/modules/blood_drinking/sounds/need_blood.ogg', 0, 0, 75)) to_chat(src, span_warning("Your Beast requires life, not the tepid swill of corpses.")) return - if(PB.blood_volume <= 50 && (!iskindred(src.pulling) || !iskindred(src))) + if(PB.blood_volume <= 50 && (!iskindred(pulling) || !iskindred(src))) SEND_SOUND(src, sound('modular_darkpack/modules/blood_drinking/sounds/need_blood.ogg', 0, 0, 75)) to_chat(src, span_warning("This vessel is empty. You'll have to find another.")) return - if(PB.bloodpool <= 0 && (!iskindred(src.pulling) || !iskindred(src))) + if(PB.bloodpool <= 0 && (!iskindred(pulling) || !iskindred(src))) SEND_SOUND(src, sound('modular_darkpack/modules/blood_drinking/sounds/need_blood.ogg', 0, 0, 75)) to_chat(src, span_warning("This vessel is empty. You'll have to find another.")) return @@ -33,16 +33,16 @@ if(isghoul(src)) PB.emote("scream") PB.add_bite_animation() - if(isliving(src.pulling)) + if(isliving(pulling)) if(!iskindred(src)) SEND_SOUND(src, sound('modular_darkpack/modules/blood_drinking/sounds/need_blood.ogg', 0, 0, 75)) to_chat(src, span_warning("You're not desperate enough to try that.")) return - var/mob/living/LV = src.pulling - if(LV.blood_volume <= 50 && (!iskindred(src.pulling) || !iskindred(src))) + var/mob/living/LV = pulling + if(LV.blood_volume <= 50 && (!iskindred(pulling) || !iskindred(src))) SEND_SOUND(src, sound('modular_darkpack/modules/blood_drinking/sounds/need_blood.ogg', 0, 0, 75)) to_chat(src, span_warning("This vessel is empty. You'll have to find another.")) - if(LV.bloodpool <= 0 && (!iskindred(src.pulling) || !iskindred(src))) + if(LV.bloodpool <= 0 && (!iskindred(pulling) || !iskindred(src))) SEND_SOUND(src, sound('modular_darkpack/modules/blood_drinking/sounds/need_blood.ogg', 0, 0, 75)) to_chat(src, span_warning("This vessel is empty. You'll have to find another.")) return @@ -50,7 +50,7 @@ SEND_SOUND(src, sound('modular_darkpack/modules/blood_drinking/sounds/need_blood.ogg', 0, 0, 75)) to_chat(src,span_warning("Your Beast requires life, not the tepid swill of corpses.")) return - var/skipface = (src.wear_mask && (src.wear_mask.flags_inv & HIDEFACE)) || (src.head && (src.head.flags_inv & HIDEFACE)) + var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) if(!skipface) if(!HAS_TRAIT(src, TRAIT_BLOODY_LOVER)) playsound(src, 'modular_darkpack/modules/blood_drinking/sounds/drinkblood1.ogg', 50, TRUE) @@ -60,4 +60,4 @@ else playsound(src, 'modular_darkpack/modules/blood_drinking/sounds/kiss.ogg', 50, TRUE) LV.visible_message(span_italics(span_bold("[src] kisses [LV]!")), span_userlove(span_bold("[src] kisses you!"))) - src.drinksomeblood(LV, TRUE) + drinksomeblood(LV, TRUE) diff --git a/modular_darkpack/modules/blood_drinking/icons/old_bloodpool.dmi b/modular_darkpack/modules/blood_drinking/icons/old_bloodpool.dmi new file mode 100644 index 000000000000..bb21453228b1 Binary files /dev/null and b/modular_darkpack/modules/blood_drinking/icons/old_bloodpool.dmi differ diff --git a/modular_darkpack/modules/books/code/bookcases.dm b/modular_darkpack/modules/books/code/bookcases.dm new file mode 100644 index 000000000000..6ce9e8a480c8 --- /dev/null +++ b/modular_darkpack/modules/books/code/bookcases.dm @@ -0,0 +1,11 @@ +/obj/structure/bookcase/random/kindred + name = "bookcase (Kindred)" + random_category = BOOK_CATEGORY_KINDRED + +/obj/structure/bookcase/random/lupine + name = "bookcase (Lupine)" + random_category = BOOK_CATEGORY_LUPINE + +/obj/structure/bookcase/random/kueijin + name = "bookcase (Kuei-Jin)" + random_category = BOOK_CATEGORY_KUEIJIN diff --git a/modular_darkpack/modules/brazier/code/brazier.dm b/modular_darkpack/modules/brazier/code/brazier.dm new file mode 100644 index 000000000000..d57841ffbd61 --- /dev/null +++ b/modular_darkpack/modules/brazier/code/brazier.dm @@ -0,0 +1,51 @@ +/obj/structure/brazier + name = "brazier" + desc = "A metal pan atop stone brick, meant to hold fire. It is gas-powered, with a strange insignia around the gas knob center." + icon = 'modular_darkpack/modules/brazier/icons/brazier.dmi' + icon_state = "brazier" + layer = OBJ_LAYER + anchored = TRUE + density = TRUE + resistance_flags = FIRE_PROOF | LAVA_PROOF + light_range = 0 + light_power = 0 + light_color = "null" + var/lit = FALSE + +/obj/structure/brazier/attack_hand(mob/living/carbon/human/user, list/modifiers) + . = ..() + if(.) + return + + if(lit) + turn_off(user) + else + turn_on(user) + +/obj/structure/brazier/proc/turn_on(mob/user) + if(lit) + return + + lit = TRUE + icon_state = "brazier_lit" + light_range = 5 + light_power = 3 + light_color = "#ffa35c" + playsound(src, 'modular_darkpack/modules/brazier/sounds/pilotlight.ogg', 75, TRUE) + set_light(light_range, light_power, light_color) + + if(user) + to_chat(user, span_notice("You turn the knob, lighting the [name].")) + user.visible_message(span_notice("[user] turns the knob, lighting the [name]."), null, null, 3) + +/obj/structure/brazier/proc/turn_off(mob/user) + if(!lit) + return + + lit = FALSE + icon_state = "brazier" + set_light(0) + + if(user) + to_chat(user, span_notice("You turn the knob backwards, extinguishing the [name].")) + user.visible_message(span_notice("[user] extinguishes the [name]."), null, null, 3) diff --git a/modular_darkpack/modules/brazier/icons/brazier.dmi b/modular_darkpack/modules/brazier/icons/brazier.dmi new file mode 100644 index 000000000000..99a24147a71a Binary files /dev/null and b/modular_darkpack/modules/brazier/icons/brazier.dmi differ diff --git a/modular_darkpack/modules/brazier/sounds/pilotlight.ogg b/modular_darkpack/modules/brazier/sounds/pilotlight.ogg new file mode 100644 index 000000000000..cb16408cb6b6 Binary files /dev/null and b/modular_darkpack/modules/brazier/sounds/pilotlight.ogg differ diff --git a/modular_darkpack/modules/cargo/code/box_move.dm b/modular_darkpack/modules/cargo/code/box_move.dm index 18120a3c3cb8..dd28e53985f3 100644 --- a/modular_darkpack/modules/cargo/code/box_move.dm +++ b/modular_darkpack/modules/cargo/code/box_move.dm @@ -2,15 +2,15 @@ name = "cargo box" desc = "Special deliever." icon_state = "box" - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' - righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' + icon = 'modular_darkpack/modules/cargo/icons/box.dmi' + lefthand_file = 'modular_darkpack/modules/cargo/icons/lefthand.dmi' + righthand_file = 'modular_darkpack/modules/cargo/icons/righthand.dmi' w_class = WEIGHT_CLASS_HUGE /obj/structure/cargo_take name = "cargo" desc = "Take and place boxes." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/cargo/icons/box.dmi' icon_state = "box_take" layer = BELOW_OBJ_LAYER anchored = TRUE @@ -33,7 +33,7 @@ /obj/structure/cargo_put name = "cargo" desc = "Take and place boxes." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/cargo/icons/box.dmi' icon_state = "box_put" layer = BELOW_OBJ_LAYER anchored = TRUE diff --git a/modular_darkpack/modules/cargo/code/supply_packs.dm b/modular_darkpack/modules/cargo/code/supply_packs.dm index 8667186a0b1b..577d2c8ea60a 100644 --- a/modular_darkpack/modules/cargo/code/supply_packs.dm +++ b/modular_darkpack/modules/cargo/code/supply_packs.dm @@ -70,11 +70,11 @@ desc = "Customized fertilizer mixed for the superior homegrown botanist." cost = 500 contains = list( - /obj/item/reagent_containers/glass/bottle/nutrient/rh, - /obj/item/reagent_containers/glass/bottle/nutrient/rh, - /obj/item/reagent_containers/glass/bottle/nutrient/rh, - /obj/item/reagent_containers/glass/bottle/nutrient/rh, - /obj/item/reagent_containers/glass/bottle/nutrient/rh, + /obj/item/reagent_containers/cup/bottle/nutrient/rh, + /obj/item/reagent_containers/cup/bottle/nutrient/rh, + /obj/item/reagent_containers/cup/bottle/nutrient/rh, + /obj/item/reagent_containers/cup/bottle/nutrient/rh, + /obj/item/reagent_containers/cup/bottle/nutrient/rh, ) crate_name = "hydro crate" @@ -82,20 +82,14 @@ /datum/supply_pack/vampire/weed_supplies desc = "Contains a bailer and some seeds. No trays." cost = 100 - contains = list(/obj/item/bailer, /obj/item/weedseed, /obj/item/weedseed, /obj/item/weedseed, /obj/item/weedseed, /obj/item/weedseed) - crate_name = "hydro crate" - -/datum/supply_pack/vampire/weed_supplies - desc = "Contains a bailer and some seeds. No trays." - cost = 100 - contains = list(/obj/item/bailer, /obj/item/weedseed, /obj/item/weedseed, /obj/item/weedseed, /obj/item/weedseed, /obj/item/weedseed) + contains = list(/obj/item/reagent_containers/cup/watering_can/metal, /obj/item/seeds/cannabis, /obj/item/seeds/cannabis, /obj/item/seeds/cannabis, /obj/item/seeds/cannabis, /obj/item/seeds/cannabis) crate_name = "hydro crate" /datum/supply_pack/vampire/weed_tray - name = "Weed Tray" - desc = "Contains a tray of weed." + name = "Hydroponics Tray" + desc = "Contains a tray for growing plants." cost = 300 - contains = list(/obj/structure/weedshit/buyable) + contains = list(/obj/machinery/hydroponics/simple/plastic/unanchored) crate_name = "weed crate" /datum/supply_pack/vampire/methlab @@ -365,97 +359,97 @@ name = "Ammo (9mm)" desc = "Contains a box of 9mm ammunition." cost = 200 - contains = list(/obj/item/ammo_box/vampire/c9mm, /obj/item/ammo_box/vampire/c9mm) + contains = list(/obj/item/ammo_box/darkpack/c9mm, /obj/item/ammo_box/darkpack/c9mm) crate_name = "ammo crate" /datum/supply_pack/vampire/ammo12g name = "Ammo (12g, slug)" desc = "Contains a box of 12 gauge shotgun slugs." cost = 400 - contains = list(/obj/item/ammo_box/vampire/c12g, /obj/item/ammo_box/vampire/c12g) + contains = list(/obj/item/ammo_box/darkpack/c12g, /obj/item/ammo_box/darkpack/c12g) crate_name = "ammo crate" /datum/supply_pack/vampire/ammo12gbuck name = "Ammo (12g, buckshot)" desc = "Contains a box of 12g 00 buckshot shells." cost = 400 - contains = list(/obj/item/ammo_box/vampire/c12g/buck, /obj/item/ammo_box/vampire/c12g/buck) + contains = list(/obj/item/ammo_box/darkpack/c12g/buck, /obj/item/ammo_box/darkpack/c12g/buck) crate_name = "ammo crate" /datum/supply_pack/vampire/ammo545 name = "Ammo (5.45)" desc = "Contains a box of 5.45 ammunition." cost = 500 - contains = list(/obj/item/ammo_box/vampire/c545, /obj/item/ammo_box/vampire/c545) + contains = list(/obj/item/ammo_box/darkpack/c545, /obj/item/ammo_box/darkpack/c545) crate_name = "ammo crate" /datum/supply_pack/vampire/ammo44 name = "Ammo (.44)" desc = "Contains a box of .44 ammunition." cost = 600 - contains = list(/obj/item/ammo_box/vampire/c44, /obj/item/ammo_box/vampire/c44) + contains = list(/obj/item/ammo_box/darkpack/c44, /obj/item/ammo_box/darkpack/c44) crate_name = "ammo crate" /datum/supply_pack/vampire/ammo556 name = "Ammo (5.56)" desc = "Contains a box of 5.56 ammunition." cost = 1500 - contains = list(/obj/item/ammo_box/vampire/c556, /obj/item/ammo_box/vampire/c556) + contains = list(/obj/item/ammo_box/darkpack/c556, /obj/item/ammo_box/darkpack/c556) crate_name = "ammo crate" /datum/supply_pack/vampire/ammo9/silver name = "Ammo (9mm, silver)" desc = "Contains a box of silver 9mm ammunition." cost = 2000 - contains = list(/obj/item/ammo_box/vampire/c9mm/silver) + contains = list(/obj/item/ammo_box/darkpack/c9mm/silver) crate_name = "ammo crate" /datum/supply_pack/vampire/ammo44/silver name = "Ammo (.44, silver)" desc = "Contains a box of silver .44 ammunition." cost = 2000 - contains = list(/obj/item/ammo_box/vampire/c44/silver) + contains = list(/obj/item/ammo_box/darkpack/c44/silver) crate_name = "ammo crate" /datum/supply_pack/vampire/ammo45/silver name = "Ammo (.45, silver)" desc = "Contains a box of silver .45 ammunition." cost = 2000 - contains = list(/obj/item/ammo_box/vampire/c45acp/silver) + contains = list(/obj/item/ammo_box/darkpack/c45acp/silver) crate_name = "ammo crate" /datum/supply_pack/vampire/ammo556/silver name = "Ammo (5.56, silver)" desc = "Contains a box of silver 5.56 ammunition." cost = 3000 - contains = list(/obj/item/ammo_box/vampire/c556/silver) + contains = list(/obj/item/ammo_box/darkpack/c556/silver) /datum/supply_pack/vampire/ammo50 name = "Ammo (.50)" desc = "Contains a box of .50 ammunition." cost = 2500 - contains = list(/obj/item/ammo_box/vampire/c50) + contains = list(/obj/item/ammo_box/darkpack/c50) crate_name = "ammo crate" /datum/supply_pack/vampire/ammo556 name = "Ammo (5.56)" desc = "Contains a box of 5.56 ammunition." cost = 1500 - contains = list(/obj/item/ammo_box/vampire/c556) + contains = list(/obj/item/ammo_box/darkpack/c556) crate_name = "ammo crate" /datum/supply_pack/vampire/ammo556/incendiart name = "Ammo (5.56 incendiary)" desc = "Contains a box of incendiary 5.56 ammunition." cost = 4500 - contains = list(/obj/item/ammo_box/vampire/c556/incendiary) + contains = list(/obj/item/ammo_box/darkpack/c556/incendiary) crate_name = "ammo crate" /datum/supply_pack/vampire/ammobolt name = "Ammo (bolts)" desc = "Contains three boxes of crossbow ammunition." cost = 600 - contains = list(/obj/item/ammo_box/vampire/arrows, /obj/item/ammo_box/vampire/arrows, /obj/item/ammo_box/vampire/arrows) + contains = list(/obj/item/ammo_box/darkpack/arrows, /obj/item/ammo_box/darkpack/arrows, /obj/item/ammo_box/darkpack/arrows) crate_name = "ammo crate" /datum/supply_pack/vampire/magazine_colt1911 diff --git a/modular_darkpack/modules/cargo/icons/box.dmi b/modular_darkpack/modules/cargo/icons/box.dmi new file mode 100644 index 000000000000..958f84264da1 Binary files /dev/null and b/modular_darkpack/modules/cargo/icons/box.dmi differ diff --git a/modular_darkpack/modules/cargo/icons/lefthand.dmi b/modular_darkpack/modules/cargo/icons/lefthand.dmi new file mode 100644 index 000000000000..1bbad9facf0d Binary files /dev/null and b/modular_darkpack/modules/cargo/icons/lefthand.dmi differ diff --git a/modular_darkpack/modules/cargo/icons/righthand.dmi b/modular_darkpack/modules/cargo/icons/righthand.dmi new file mode 100644 index 000000000000..1bbad9facf0d Binary files /dev/null and b/modular_darkpack/modules/cargo/icons/righthand.dmi differ diff --git a/modular_darkpack/modules/cars/code/car.dm b/modular_darkpack/modules/cars/code/car.dm index c41809ae31d2..ec31a53891ce 100644 --- a/modular_darkpack/modules/cars/code/car.dm +++ b/modular_darkpack/modules/cars/code/car.dm @@ -116,7 +116,7 @@ create_storage(storage_type = car_storage_type) atom_storage.set_real_location(trunk) - // TODO: [Rebase] see about reimplementing this sprite for cars + // DARKPACK TODO - see about reimplementing this sprite for cars /* headlight_image = new(src) headlight_image.icon = 'icons/effects/light_overlays/light_cone_car.dmi' @@ -199,7 +199,7 @@ can_used.stored_gasoline = max(0, can_used.stored_gasoline-gas_to_transfer) gas = min(CAR_TANK_MAX, gas+gas_to_transfer) to_chat(user, span_notice("You transfer [gas_to_transfer] fuel to [src].")) - playsound(loc, 'modular_darkpack/master_files/sounds/gas_fill.ogg', 25, TRUE) + playsound(loc, 'modular_darkpack/master_files/sounds/effects/gas_fill.ogg', 25, TRUE) /obj/darkpack_car/proc/try_repair(mob/living/user, obj/item/tool) if(atom_integrity >= max_integrity) @@ -213,14 +213,14 @@ span_notice("You begin repairing [src]. Stop at any time to only partially repair it.")) if(do_after(user, time_to_repair SECONDS, src, interaction_key = DOAFTER_SOURCE_CAR)) atom_integrity = max_integrity - playsound(src, 'modular_darkpack/master_files/sounds/repair.ogg', 50, TRUE) + playsound(src, 'modular_darkpack/master_files/sounds/effects/repair.ogg', 50, TRUE) user.visible_message(span_notice("[user] repairs [src]."), \ span_notice("You finish repairing all the dents on [src].")) color = "#ffffff" return TRUE else - take_damage((world.time - start_time) * -2 / 5) //partial repair - playsound(src, 'modular_darkpack/master_files/sounds/repair.ogg', 50, TRUE) + repair_damage((world.time - start_time) * 2 / 5) //partial repair + playsound(src, 'modular_darkpack/master_files/sounds/effects/repair.ogg', 50, TRUE) user.visible_message(span_notice("[user] repairs [src]."), \ span_notice("You repair some of the dents on [src].")) color = "#ffffff" @@ -230,10 +230,12 @@ if(!locked) to_chat(user, span_warning("The [src] is already unlocked.")) return - for(var/mob/living/carbon/human/npc/police/P in oviewers(7, src)) + for(var/mob/living/carbon/human/npc/police/P in oviewers(DEFAULT_SIGHT_DISTANCE, src)) P.Aggro(user) log_game("[user] tried lockpicking [src]") var/total_lockpicking = user.st_get_stat(STAT_LARCENY) + if(total_lockpicking <= 0) + to_chat(span_warning("How do I do this...?")) if(do_after(user, 10 SECONDS, src, interaction_key = DOAFTER_SOURCE_CAR)) if(!locked) return @@ -281,7 +283,7 @@ if(!driver && !length(passengers) && COOLDOWN_FINISHED(src, beep_cooldown) && locked) COOLDOWN_START(src, beep_cooldown, 7 SECONDS) playsound(src, 'modular_darkpack/modules/cars/sounds/signal.ogg', 50, FALSE) - for(var/mob/living/carbon/human/npc/police/P in oviewers(7, src)) + for(var/mob/living/carbon/human/npc/police/P in oviewers(DEFAULT_SIGHT_DISTANCE, src)) P.Aggro(user) if(prob(10) && locked) @@ -417,7 +419,7 @@ user.forceMove(src) visible_message(span_notice("[user] enters [src]."), \ span_notice("You enter [src].")) - playsound(src, 'modular_darkpack/master_files/sounds/door.ogg', 50, TRUE) + playsound(src, 'modular_darkpack/master_files/sounds/effects/door/door.ogg', 50, TRUE) //Dump out all living from the car /obj/darkpack_car/proc/empty_car() @@ -452,7 +454,7 @@ if(dumpe?.client) dumpe.client.pixel_x = 0 dumpe.client.pixel_y = 0 - playsound(src, 'modular_darkpack/master_files/sounds/door.ogg', 50, TRUE) + playsound(src, 'modular_darkpack/master_files/sounds/effects/door/door.ogg', 50, TRUE) for(var/datum/action/darkpack_car/C in dumpe.actions) qdel(C) diff --git a/modular_darkpack/modules/cars/code/car_actions.dm b/modular_darkpack/modules/cars/code/car_actions.dm index dd52e4b86cd7..ae17bf67e3b9 100644 --- a/modular_darkpack/modules/cars/code/car_actions.dm +++ b/modular_darkpack/modules/cars/code/car_actions.dm @@ -71,7 +71,7 @@ //vamp_car.balloon_alert(owner, trunk_datum.locked ? "locked" : "unlocked") to_chat(owner, span_notice("You [trunk_datum.locked ? "locked" : "unlocked"] [vamp_car]'s baggage.")) - playsound(vamp_car, 'modular_darkpack/master_files/sounds/door.ogg', 50, TRUE) + playsound(vamp_car, 'modular_darkpack/master_files/sounds/effects/door/door.ogg', 50, TRUE) /datum/action/darkpack_car/engine name = "Toggle Engine" @@ -132,6 +132,6 @@ if(owner?.client) owner.client.pixel_x = 0 owner.client.pixel_y = 0 - playsound(owned_car, 'modular_darkpack/master_files/sounds/door.ogg', 50, TRUE) + playsound(owned_car, 'modular_darkpack/master_files/sounds/effects/door/door.ogg', 50, TRUE) for(var/datum/action/darkpack_car/C in owner.actions) qdel(C) diff --git a/modular_darkpack/modules/cars/code/gas.dm b/modular_darkpack/modules/cars/code/gas.dm index 268d9a4166e7..14622eb367bc 100644 --- a/modular_darkpack/modules/cars/code/gas.dm +++ b/modular_darkpack/modules/cars/code/gas.dm @@ -1,4 +1,4 @@ -/* TODO: [Rebase] - Gas should be handled as a reagent +/* // DARKPACK TODO - Gas should be handled as a reagent /datum/reagent/gasoline name = "Gasoline" color = "#b85614" @@ -49,7 +49,7 @@ return ITEM_INTERACT_FAILURE stored_gasoline = max(0, stored_gasoline-50) new /obj/effect/decal/cleanable/gasoline(get_turf(interacting_with)) - playsound(get_turf(src), 'modular_darkpack/modules/deprecated/sounds/gas_splat.ogg', 50, TRUE) + playsound(get_turf(src), 'modular_darkpack/modules/cars/sounds/gas_splat.ogg', 50, TRUE) return ITEM_INTERACT_SUCCESS /obj/item/gas_can/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) @@ -60,7 +60,7 @@ return stored_gasoline = max(0, stored_gasoline-50) H.fire_stacks = min(10, H.fire_stacks+10) - playsound(get_turf(H), 'modular_darkpack/modules/deprecated/sounds/gas_splat.ogg', 50, TRUE) + playsound(get_turf(H), 'modular_darkpack/modules/cars/sounds/gas_splat.ogg', 50, TRUE) user.visible_message(span_warning("[user] covers [target] in something flammable!")) /obj/effect/decal/cleanable/gasoline @@ -72,6 +72,7 @@ smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_SPILL canSmoothWith = SMOOTH_GROUP_SPILL + SMOOTH_GROUP_WALLS + resistance_flags = UNACIDABLE | ACID_PROOF //mouse_opacity = MOUSE_OPACITY_TRANSPARENT beauty = -50 alpha = 64 @@ -88,41 +89,45 @@ if(isliving(AM)) var/mob/living/L = AM if(L.on_fire) - var/obj/effect/fire/F = locate() in get_turf(src) + var/obj/effect/abstract/turf_fire/F = locate() in get_turf(src) if(!F) - new /obj/effect/fire(get_turf(src)) - ..(AM) + new /obj/effect/abstract/turf_fire(get_turf(src)) + . = ..() */ /obj/effect/decal/cleanable/gasoline/Initialize() . = ..() - /* - var/turf/T = get_turf(src) - if(istype(T, /turf/open/floor)) - var/turf/open/floor/F = T - F.spread_chance = 100 - F.burn_material += 100 - */ + var/turf/open/my_turf = get_turf(src) + if(istype(my_turf)) + my_turf.flammability += 5 if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH(src) QUEUE_SMOOTH_NEIGHBORS(src) /obj/effect/decal/cleanable/gasoline/Destroy() + var/turf/open/my_turf = get_turf(src) + if(istype(my_turf)) + my_turf.flammability -= 5 // Technicly no validtiy for if its the same turf we started on. Making something less flamible is a nothing burger tho QUEUE_SMOOTH_NEIGHBORS(src) return ..() -/* /obj/effect/decal/cleanable/gasoline/fire_act(exposed_temperature, exposed_volume) - var/obj/effect/fire/F = locate() in loc - if(!F) - new /obj/effect/fire(loc) - ..() -*/ + var/turf/open/gas_turf = get_turf(src) + if(isopenturf(gas_turf)) + gas_turf.ignite_turf(30 + gas_turf.flammability) + addtimer(CALLBACK(src, PROC_REF(ignite_others)), 0.5 SECONDS) + . = ..() + +/obj/effect/decal/cleanable/gasoline/proc/ignite_others() + for(var/obj/effect/decal/cleanable/gasoline/oil in range(1, get_turf(src))) + if(prob(25)) + continue + oil.fire_act() /obj/effect/decal/cleanable/gasoline/attackby(obj/item/I, mob/living/user) var/attacked_by_hot_thing = I.get_temperature() if(attacked_by_hot_thing) - visible_message("[user] tries to ignite [src] with [I]!", "You try to ignite [src] with [I].") + visible_message(span_warning("[user] tries to ignite [src] with [I]!"), span_warning("You try to ignite [src] with [I].")) log_combat(user, src, (attacked_by_hot_thing < 480) ? "tried to ignite" : "ignited", I) fire_act(attacked_by_hot_thing) return @@ -141,7 +146,7 @@ /obj/structure/fuelstation/click_alt(mob/user) if(stored_money > 0) say("Money refunded.") - var/money_to_spawn = min(stored_money, 1000) + var/money_to_spawn = min(stored_money, /obj/item/stack/dollar::max_amount) new /obj/item/stack/dollar(loc, money_to_spawn) stored_money -= money_to_spawn return CLICK_ACTION_SUCCESS @@ -163,6 +168,6 @@ var/money_to_spend = round(gas_to_dispense/20) G.stored_gasoline = min(1000, G.stored_gasoline+gas_to_dispense) stored_money = max(0, stored_money-money_to_spend) - playsound(loc, 'modular_darkpack/master_files/sounds/gas_fill.ogg', 50, TRUE) + playsound(loc, 'modular_darkpack/master_files/sounds/effects/gas_fill.ogg', 50, TRUE) to_chat(user, span_notice("You fill [I].")) say("Gas filled.") diff --git a/modular_darkpack/modules/cars/code/subtypes.dm b/modular_darkpack/modules/cars/code/subtypes.dm index 92ebd4323798..39a754de7c41 100644 --- a/modular_darkpack/modules/cars/code/subtypes.dm +++ b/modular_darkpack/modules/cars/code/subtypes.dm @@ -31,28 +31,25 @@ . = ..() /obj/darkpack_car/rand/camarilla - access = "camarilla" - icon_state = "6" + access = LOCKACCESS_CAMARILLA /obj/darkpack_car/retro/rand/camarilla - access = "camarilla" - icon_state = "5" + access = LOCKACCESS_CAMARILLA + +/obj/darkpack_car/retro/rand/voivodate + access = "voivodate_citizen" /obj/darkpack_car/rand/anarch - access = "anarch" - icon_state = "6" + access = LOCKACCESS_ANARCH /obj/darkpack_car/retro/rand/anarch - access = "anarch" - icon_state = "5" + access = LOCKACCESS_ANARCH /obj/darkpack_car/rand/clinic - access = "clinic" - icon_state = "6" + access = LOCKACCESS_CLINIC /obj/darkpack_car/retro/rand/clinic - access = "clinic" - icon_state = "5" + access = LOCKACCESS_CLINIC /obj/darkpack_car/limousine icon_state = "limo" @@ -62,17 +59,20 @@ /obj/darkpack_car/limousine/giovanni icon_state = "giolimo" - access = "giovanni" + access = LOCKACCESS_GIOVANNI /obj/darkpack_car/limousine/camarilla - icon_state = "limo" + access = LOCKACCESS_CAMARILLA + +/obj/darkpack_car/limousine/voivodate + access = "seer_voivodate" /obj/darkpack_car/police icon_state = "police" max_passengers = 3 dir = WEST beep_sound = 'modular_darkpack/modules/deprecated/sounds/migalka.ogg' - access = "police" + access = LOCKACCESS_POLICE light_system = OVERLAY_LIGHT light_range = 6 light_power = 6 @@ -89,7 +89,7 @@ /obj/darkpack_car/police/ranger icon_state = "ranger" - access = "nps" + access = LOCKACCESS_PARK_RANGER primary_light_color = "#ffa500" secondary_light_color = "#ff8c00" @@ -114,7 +114,7 @@ icon_state = "taxi" max_passengers = 3 dir = WEST - access = "taxi" + access = LOCKACCESS_TAXI /obj/darkpack_car/track icon_state = "track" @@ -134,5 +134,16 @@ /obj/darkpack_car/track/ambulance icon_state = "ambulance" - access = "clinic" + access = LOCKACCESS_CLINIC car_storage_type = /datum/storage/car/van + +/obj/darkpack_car/endroncar + icon_state = "endron" + max_passengers = 4 + access = LOCKACCESS_PENTEX + +/obj/darkpack_car/endrontruck + icon_state = "endrontruck" + max_passengers = 6 + access = LOCKACCESS_PENTEX + car_storage_type = /datum/storage/car/truck diff --git a/modular_darkpack/modules/cars/icons/cars.dmi b/modular_darkpack/modules/cars/icons/cars.dmi index 491b355c19ed..c0868a6e6fc1 100644 Binary files a/modular_darkpack/modules/cars/icons/cars.dmi and b/modular_darkpack/modules/cars/icons/cars.dmi differ diff --git a/modular_darkpack/modules/deprecated/sounds/gas_splat.ogg b/modular_darkpack/modules/cars/sounds/gas_splat.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/gas_splat.ogg rename to modular_darkpack/modules/cars/sounds/gas_splat.ogg diff --git a/modular_darkpack/modules/chairs/code/chairs.dm b/modular_darkpack/modules/chairs/code/chairs.dm new file mode 100644 index 000000000000..f2d7bf3d68bf --- /dev/null +++ b/modular_darkpack/modules/chairs/code/chairs.dm @@ -0,0 +1,136 @@ +// FOUR LEGGED CHAIRS / OBJECTS + +/obj/structure/chair/darkpack + icon = 'modular_darkpack/modules/chairs/icons/chairs.dmi' + icon_state = "chair" + item_chair = /obj/item/chair/darkpack + +/obj/structure/chair/darkpack/blue + icon_state = "chair_blue" + item_chair = /obj/item/chair/darkpack/blue + +/obj/structure/chair/darkpack/green + icon_state = "chair_green" + item_chair = /obj/item/chair/darkpack/green + +/obj/structure/chair/darkpack/red + icon_state = "chair_red" + item_chair = /obj/item/chair/darkpack/red + +// FOUR LEGGED CHAIRS / ITEMS + +/obj/item/chair/darkpack + icon = 'modular_darkpack/modules/chairs/icons/chairs.dmi' + icon_state = "chair_toppled" + inhand_icon_state = "chair" + origin_type = /obj/structure/chair/darkpack + +/obj/item/chair/darkpack/blue + icon_state = "chair_blue_toppled" + origin_type = /obj/structure/chair/darkpack/blue + +/obj/item/chair/darkpack/green + icon_state = "chair_green_toppled" + origin_type = /obj/structure/chair/darkpack/green + +/obj/item/chair/darkpack/red + icon_state = "chair_red_toppled" + origin_type = /obj/structure/chair/darkpack/red + +// PLASTIC CHAIR / OBJECTS + +/obj/structure/chair/plastic/darkpack + icon = 'modular_darkpack/modules/chairs/icons/chairs.dmi' + icon_state = "plastic_chair" + name = "plastic chair" + item_chair = /obj/item/chair/plastic/darkpack + +// PLASTIC CHAIR / ITEMS + +/obj/item/chair/plastic/darkpack + name = "plastic chair" + icon = 'modular_darkpack/modules/chairs/icons/chairs.dmi' + icon_state = "folded_chair" + origin_type = /obj/structure/chair/plastic/darkpack + +// OFFICE CHAIRS / OBJECTS + +/obj/structure/chair/office/darkpack + icon_state = "officechair" + icon = 'modular_darkpack/modules/chairs/icons/chairs.dmi' + +/obj/structure/chair/office/darkpack/blue + icon_state = "officechair_blue" + +/obj/structure/chair/office/darkpack/green + icon_state = "officechair_green" + +/obj/structure/chair/office/darkpack/red + icon_state = "officechair_red" + +// BARSTOOLS / OBJECTS + +/obj/structure/chair/stool/bar/darkpack + icon = 'modular_darkpack/modules/chairs/icons/chairs.dmi' + icon_state = "bar" + item_chair = /obj/item/chair/stool/bar/darkpack + +/obj/structure/chair/stool/bar/darkpack/red + icon_state = "bar_red" + item_chair = /obj/item/chair/stool/bar/darkpack/red + +// BARSTOOLS / ITEMS + +/obj/item/chair/stool/bar/darkpack + icon = 'modular_darkpack/modules/chairs/icons/chairs.dmi' + icon_state = "bar_toppled" + origin_type = /obj/structure/chair/stool/bar/darkpack + +/obj/item/chair/stool/bar/darkpack/red + icon_state = "bar_red_toppled" + origin_type = /obj/structure/chair/stool/bar/darkpack/red + +// WOODEN CHAIRS / OBJECTS + +/obj/structure/chair/wood/darkpack + icon = 'modular_darkpack/modules/chairs/icons/chairs.dmi' + icon_state = "wooden_chair" + resistance_flags = FLAMMABLE + item_chair = /obj/item/chair/wood/darkpack + +/obj/structure/chair/wood/darkpack/red + icon = 'modular_darkpack/modules/chairs/icons/chairs.dmi' + icon_state = "wooden_chair_red" + resistance_flags = FLAMMABLE + item_chair = /obj/item/chair/wood/darkpack/red + +// WOODEN CHAIRS / ITEMS + +/obj/item/chair/wood/darkpack + icon = 'modular_darkpack/modules/chairs/icons/chairs.dmi' + icon_state = "wooden_chair_toppled" + inhand_icon_state = "woodenchair" + origin_type = /obj/structure/chair/wood/darkpack + +/obj/item/chair/wood/darkpack/red + icon_state = "wooden_chair_red_toppled" + inhand_icon_state = "woodenchair" + origin_type = /obj/structure/chair/wood/darkpack/red + +// COMFY CHAIRS / OBJECTS + +/obj/structure/chair/comfy/darkpack + icon = 'modular_darkpack/modules/chairs/icons/chairs.dmi' + icon_state = "comfy" + +/obj/structure/chair/comfy/darkpack/dark + icon_state = "comfy_dark" + +/obj/structure/chair/comfy/darkpack/blue + icon_state = "comfy_blue" + +/obj/structure/chair/comfy/darkpack/green + icon_state = "comfy_green" + +/obj/structure/chair/comfy/darkpack/red + icon_state = "comfy_red" diff --git a/modular_darkpack/modules/chairs/icons/chairs.dmi b/modular_darkpack/modules/chairs/icons/chairs.dmi new file mode 100644 index 000000000000..bc7892693823 Binary files /dev/null and b/modular_darkpack/modules/chairs/icons/chairs.dmi differ diff --git a/modular_darkpack/modules/city_map/code/city_map.dm b/modular_darkpack/modules/city_map/code/city_map.dm deleted file mode 100644 index 512a169279a7..000000000000 --- a/modular_darkpack/modules/city_map/code/city_map.dm +++ /dev/null @@ -1,121 +0,0 @@ -/obj/structure/vampmap - name = "\improper map" - desc = "Locate yourself now." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' - icon_state = "map" - plane = GAME_PLANE - layer = ABOVE_MOB_LAYER - anchored = TRUE - density = TRUE - -/obj/structure/vampmap/attack_hand(mob/user) - . = ..() - var/dat = {" - - "} - var/obj/damap/DAMAP = new(user) - var/obj/damap/supply/SU = new(user) - var/obj/damap/church/CH = new(user) - var/obj/damap/graveyard/GR = new(user) - var/obj/damap/hotel/HO = new(user) - var/obj/damap/tower/TO = new(user) - var/obj/damap/clean/CL = new(user) - var/obj/damap/theatre/TH = new(user) - var/obj/damap/bar/BA = new(user) - var/obj/damap/hospital/HS = new(user) - var/obj/overlay/AM = new(DAMAP) - AM.icon = 'modular_darkpack/modules/deprecated/icons/disciplines.dmi' - AM.icon_state = "target" - AM.layer = ABOVE_HUD_LAYER - AM.pixel_x = x-4 - AM.pixel_y = y-4 - DAMAP.overlays |= AM - dat += "
    [icon2html(getFlatIcon(DAMAP), user)]

    " - dat += "
    [icon2html(getFlatIcon(SU), user)] - Railway Station;

    " - dat += "
    [icon2html(getFlatIcon(CH), user)] - Catholic Church;

    " - dat += "
    [icon2html(getFlatIcon(GR), user)] - City Graveyard;

    " - dat += "
    [icon2html(getFlatIcon(HO), user)] - Hotel \"Cock Roach\";

    " - dat += "
    [icon2html(getFlatIcon(TO), user)] - Millenium Tower;

    " - dat += "
    [icon2html(getFlatIcon(CL), user)] - Cleaning Services;

    " - dat += "
    [icon2html(getFlatIcon(TH), user)] - National Theatre;

    " - dat += "
    [icon2html(getFlatIcon(BA), user)] - Bar \"Big Shoe\";

    " - dat += "
    [icon2html(getFlatIcon(HS), user)] - City Hospital.
    " - user << browse(dat, "window=map;size=400x600;border=1;can_resize=0;can_minimize=0") - onclose(user, "map", src) - qdel(DAMAP) - qdel(AM) - qdel(SU) - qdel(CH) - qdel(GR) - qdel(HO) - qdel(TO) - qdel(CL) - qdel(TH) - qdel(BA) - qdel(HS) - -/obj/damap - icon = 'modular_darkpack/modules/deprecated/icons/map.dmi' - icon_state = "map" - plane = GAME_PLANE - layer = ABOVE_NORMAL_TURF_LAYER - -/obj/damap/supply - icon = 'modular_darkpack/modules/deprecated/icons/disciplines.dmi' - icon_state = "supply" - plane = GAME_PLANE - layer = ABOVE_NORMAL_TURF_LAYER - -/obj/damap/church - icon = 'modular_darkpack/modules/deprecated/icons/disciplines.dmi' - icon_state = "church" - plane = GAME_PLANE - layer = ABOVE_NORMAL_TURF_LAYER - -/obj/damap/graveyard - icon = 'modular_darkpack/modules/deprecated/icons/disciplines.dmi' - icon_state = "graveyard" - plane = GAME_PLANE - layer = ABOVE_NORMAL_TURF_LAYER - -/obj/damap/hotel - icon = 'modular_darkpack/modules/deprecated/icons/disciplines.dmi' - icon_state = "hotel" - plane = GAME_PLANE - layer = ABOVE_NORMAL_TURF_LAYER - -/obj/damap/tower - icon = 'modular_darkpack/modules/deprecated/icons/disciplines.dmi' - icon_state = "tower" - plane = GAME_PLANE - layer = ABOVE_NORMAL_TURF_LAYER - -/obj/damap/clean - icon = 'modular_darkpack/modules/deprecated/icons/disciplines.dmi' - icon_state = "clean" - plane = GAME_PLANE - layer = ABOVE_NORMAL_TURF_LAYER - -/obj/damap/theatre - icon = 'modular_darkpack/modules/deprecated/icons/disciplines.dmi' - icon_state = "theatre" - plane = GAME_PLANE - layer = ABOVE_NORMAL_TURF_LAYER - -/obj/damap/bar - icon = 'modular_darkpack/modules/deprecated/icons/disciplines.dmi' - icon_state = "bar" - plane = GAME_PLANE - layer = ABOVE_NORMAL_TURF_LAYER - -/obj/damap/hospital - icon = 'modular_darkpack/modules/deprecated/icons/disciplines.dmi' - icon_state = "hospital" - plane = GAME_PLANE - layer = ABOVE_NORMAL_TURF_LAYER diff --git a/modular_darkpack/modules/city_time/code/city_time_subsystem.dm b/modular_darkpack/modules/city_time/code/city_time_subsystem.dm index 13d8da241bd6..6af4924b5855 100644 --- a/modular_darkpack/modules/city_time/code/city_time_subsystem.dm +++ b/modular_darkpack/modules/city_time/code/city_time_subsystem.dm @@ -22,9 +22,9 @@ SUBSYSTEM_DEF(city_time) var/shifting_colors = FALSE /datum/controller/subsystem/city_time/Initialize(start_timeofday) - . = ..() time_till_daytime = CONFIG_GET(number/time_till_day) time_till_roundend = CONFIG_GET(number/time_till_roundend) + return SS_INIT_SUCCESS /datum/controller/subsystem/city_time/fire() if(station_time_passed() > time_till_daytime - 30 MINUTES && !first_warning && !shifting_colors) diff --git a/modular_darkpack/modules/city_time/code/moonlight.dm b/modular_darkpack/modules/city_time/code/moonlight.dm index 49c922c99d60..44f682ec7291 100644 --- a/modular_darkpack/modules/city_time/code/moonlight.dm +++ b/modular_darkpack/modules/city_time/code/moonlight.dm @@ -25,6 +25,13 @@ GLOB.starlight -= target UnregisterSignal(target, COMSIG_TURF_CHANGE) +// Adds around a full minute to load westfield mall on my machine. Not optimal +/* +/turf/open/openspace/Initialize(mapload) + . = ..() + add_moonlight() +*/ + /turf/open/misc/Initialize(mapload) . = ..() add_moonlight() diff --git a/modular_darkpack/modules/city_time/code/wrist_watch.dm b/modular_darkpack/modules/city_time/code/wrist_watch.dm index 8087c5b19949..0af823222149 100644 --- a/modular_darkpack/modules/city_time/code/wrist_watch.dm +++ b/modular_darkpack/modules/city_time/code/wrist_watch.dm @@ -1,5 +1,5 @@ -/obj/item/cockclock - name = "\improper wrist watch" +/obj/item/watch + name = "wrist watch" desc = "A portable device to check time." icon = 'modular_darkpack/modules/city_time/icons/clock.dmi' worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' @@ -8,11 +8,11 @@ w_class = WEIGHT_CLASS_SMALL armor_type = /datum/armor/card_id resistance_flags = FIRE_PROOF | ACID_PROOF - slot_flags = ITEM_SLOT_GLOVES | ITEM_SLOT_ID + slot_flags = ITEM_SLOT_GLOVES ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - custom_price = 20 + custom_price = 20 // ECONOMY -/obj/item/cockclock/examine(mob/user) +/obj/item/watch/examine(mob/user) . = ..() . += "The watch reads: [station_time_timestamp("hh:mm:ss, MMM DD")]" . += "That should make it [station_time_timestamp("Day")]" diff --git a/modular_darkpack/modules/city_traits/code/negative_traits.dm b/modular_darkpack/modules/city_traits/code/negative_traits.dm new file mode 100644 index 000000000000..1f0ff9742bd6 --- /dev/null +++ b/modular_darkpack/modules/city_traits/code/negative_traits.dm @@ -0,0 +1,48 @@ +/datum/station_trait/thunder_storm + name = "Thunder Storm" + trait_type = STATION_TRAIT_NEGATIVE + can_revert = FALSE + + darkpack_allowed = TRUE + newspaper_message = "Expect a pretty fierce storm tonight." + newspaper_chance = 75 + +/datum/station_trait/thunder_storm/on_round_start() + . = ..() + SSweather.run_weather(/datum/weather/rain_storm/endless) + +/datum/weather/rain_storm/endless + name = "endless rain" + probability = 0 + target_trait = ZTRAIT_STATION + turf_weather_chance = 0.0001 + turf_thunder_chance = THUNDER_CHANCE_VERY_RARE + weather_flags = parent_type::weather_flags | WEATHER_ENDLESS + +/datum/station_trait/foggy_night + name = "Foggy Night" + trait_type = STATION_TRAIT_NEGATIVE + + darkpack_allowed = TRUE + newspaper_message = "Forecasts predict foggy driving conditions, make sure to use your high beams." + newspaper_chance = 60 + +/datum/station_trait/foggy_night/on_round_start() + . = ..() + set_starlight(null, GLOB.starlight_range*0.8, GLOB.starlight_power*0.5) + +/datum/station_trait/faulty_power_grid + name = "Faulty power grid" + trait_type = STATION_TRAIT_NEGATIVE + can_revert = FALSE + darkpack_allowed = TRUE + +/datum/station_trait/faulty_power_grid/on_round_start() + . = ..() + // Fuck I hate it, rework fusebox code + for(var/obj/fusebox/broken_box in world) + if(prob(75)) + continue + broken_box.damaged += rand(50, 200) + broken_box.check_damage() + diff --git a/modular_darkpack/modules/city_traits/code/netural_traits.dm b/modular_darkpack/modules/city_traits/code/netural_traits.dm new file mode 100644 index 000000000000..dadd5140664e --- /dev/null +++ b/modular_darkpack/modules/city_traits/code/netural_traits.dm @@ -0,0 +1,73 @@ +// inspired* by Fallout NV's Wild Wasteland Trait +// TODO: Make this do anything lol +/* +/datum/station_trait/wild_masquerade + name = "Wild Masquerade" + weight = 1 + trait_to_give = STATION_TRAIT_WILD_MASQUERADE + darkpack_allowed = TRUE +*/ + +/datum/station_trait/filled_trash + name = "Trash Man Strike" + weight = 5 + cost = STATION_TRAIT_COST_MINIMAL + blacklist = list(/datum/station_trait/empty_trash) + trait_to_give = STATION_TRAIT_FILLED_MAINT + // This station trait is checked when loot drops initialize, so it's too late + can_revert = FALSE + + darkpack_allowed = TRUE + newspaper_message = "The local trash mans union has gone on strike, dont except your trash taken out this week." + newspaper_chance = 90 + +/datum/station_trait/empty_trash + name = "Trash Day" + weight = 5 + cost = STATION_TRAIT_COST_MINIMAL + blacklist = list(/datum/station_trait/filled_trash) + trait_to_give = STATION_TRAIT_EMPTY_MAINT + // This station trait is checked when loot drops initialize, so it's too late + can_revert = FALSE + + darkpack_allowed = TRUE + +/datum/station_trait/infestation + name = "Rat Infestation" + weight = 5 + cost = STATION_TRAIT_COST_MINIMAL + blacklist = list(/datum/station_trait/pest_control) + trait_to_give = STATION_TRAIT_INFESTATION + darkpack_allowed = TRUE + +/datum/station_trait/infestation/revert() + for(var/obj/structure/ladder/manhole/down/manhole_entrance in world) + var/spawner = manhole_entrance.GetComponent(/datum/component/spawner) + if(spawner) + qdel(spawner) + return ..() + +/datum/station_trait/pest_control + name = "Pest Control" + weight = 5 + cost = STATION_TRAIT_COST_MINIMAL + blacklist = list(/datum/station_trait/infestation) + trait_to_give = STATION_TRAIT_PEST_CONTROL + darkpack_allowed = TRUE + +/datum/station_trait/stray_migration + name = "Stray migration" + weight = 5 + cost = STATION_TRAIT_COST_LOW + trait_to_give = STATION_TRAIT_PEST_CONTROL + darkpack_allowed = TRUE + +// DARKPACK TODO - Not touching this till npc outfit refactor +/datum/station_trait/cosplay_convention + name = "Cosplay convention" + weight = 3 + trait_to_give = STATION_TRAIT_COSPLAY_CONVENTION + + darkpack_allowed = TRUE + newspaper_message = "A \"cosplay\" convention is being run in the local city center." + newspaper_chance = 90 diff --git a/modular_darkpack/modules/city_traits/code/positive_traits.dm b/modular_darkpack/modules/city_traits/code/positive_traits.dm new file mode 100644 index 000000000000..4fa6ecac98cf --- /dev/null +++ b/modular_darkpack/modules/city_traits/code/positive_traits.dm @@ -0,0 +1,21 @@ +// TODO: Need to tie into bloodpool usage? Hunger? +/datum/station_trait/red_star + name = "Anthelios, the Red Star" + trait_type = STATION_TRAIT_POSITIVE + trait_to_give = STATION_TRAIT_RED_STAR + weight = 1 + darkpack_allowed = TRUE + +/datum/station_trait/full_moon + name = "Full Moon" + trait_type = STATION_TRAIT_POSITIVE + weight = 2 + + darkpack_allowed = TRUE + newspaper_message = "The moon the brighest it will be this month!" + newspaper_chance = 95 + +/datum/station_trait/full_moon/on_round_start() + . = ..() + GLOB.moon_state = "Full" + set_starlight(null, GLOB.starlight_range*1.2, GLOB.starlight_power*1.2) diff --git a/modular_darkpack/modules/city_traits/readme.md b/modular_darkpack/modules/city_traits/readme.md new file mode 100644 index 000000000000..438f4cc187a3 --- /dev/null +++ b/modular_darkpack/modules/city_traits/readme.md @@ -0,0 +1,41 @@ +https://github.com/DarkPack13/SecondCity/pull/153 + +## \ <!--Title of your addition.--> + +Module ID: CITY_TRAITS<!-- Uppercase, UNDERSCORE_CONNECTED name of your module, that you use to mark files. This is so people can case-sensitive search for your edits, if any. --> + +### Description: +Station traits but City. + +<!-- Here, try to describe what your PR does, what features it provides and any other directly useful information. --> + +### TG Proc/File Changes: + +- N/A +<!-- If you edited any core procs, you should list them here. You should specify the files and procs you changed. +E.g: +- `code/modules/mob/living.dm`: `proc/overriden_proc`, `var/overriden_var` + --> + +### Modular Overrides: + +- N/A +<!-- If you added a new modular override (file or code-wise) for your module, you should list it here. Code files should specify what procs they changed, in case of multiple modules using the same file. +E.g: +- `modular_nova/master_files/sound/my_cool_sound.ogg` +- `modular_nova/master_files/code/my_modular_override.dm`: `proc/overriden_proc`, `var/overriden_var` + --> + +### Defines: + +- `code/__DEFINES/~darkpack/traits/declarations.dm`: `STATION_TRAIT_RED_STAR`, `STATION_TRAIT_WILD_MASQUERADE`, `STATION_TRAIT_INFESTATION`, `STATION_TRAIT_PEST_CONTROL`, `STATION_TRAIT_STRAY_MIGRATION`, `STATION_TRAIT_COSPLAY_CONVENTION` +<!-- If you needed to add any defines, mention the files you added those defines in, along with the name of the defines. --> + +### Included files that are not contained in this module: + +- N/A +<!-- Likewise, be it a non-modular file or a modular one that's not contained within the folder belonging to this specific module, it should be mentioned here. Good examples are icons or sounds that are used between multiple modules, or other such edge-cases. --> + +### Credits: + +FalloutFalcon diff --git a/modular_darkpack/modules/closets/code/security.dm b/modular_darkpack/modules/closets/code/security.dm new file mode 100644 index 000000000000..bc49f74c13d3 --- /dev/null +++ b/modular_darkpack/modules/closets/code/security.dm @@ -0,0 +1,4 @@ +/obj/structure/closet/secure_closet/weapons + name = "armory weapon locker" + req_access = list(ACCESS_WEAPONS) + icon_state = "tac" diff --git a/modular_darkpack/modules/clothes/code/back.dm b/modular_darkpack/modules/clothes/code/back.dm new file mode 100644 index 000000000000..969c25bbe47f --- /dev/null +++ b/modular_darkpack/modules/clothes/code/back.dm @@ -0,0 +1,40 @@ +/obj/item/storage/backpack/satchel + var/icon_hidden = FALSE + +/obj/item/storage/backpack/satchel/Initialize(mapload) + . = ..() + register_context() + +/obj/item/storage/backpack/satchel/proc/conceal(mob/user) + icon_hidden = !icon_hidden + worn_icon_state = icon_hidden ? "nothing" : initial(worn_icon_state) + + to_chat(user, span_notice("You [icon_hidden ? "conceal" : "reveal"] [src].</span>")) + + user.update_worn_back() + + + +/obj/item/storage/backpack/satchel/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + . = ..() + if(!ishuman(user)) // You're not a *dog*, are you? + return ..() + + var/mob/living/carbon/human/H = user + if(src == H.back && H.w_uniform && !user.get_active_held_item()) + context[SCREENTIP_CONTEXT_ALT_RMB] = "[icon_hidden ? "Reveal" : "Conceal"]" + + return CONTEXTUAL_SCREENTIP_SET + +/obj/item/storage/backpack/satchel/click_alt_secondary(mob/user) + if(!ishuman(user)) // You're not a *dog*, are you? + return ..() + + var/obj/item/storage/backpack/satchel/S = src + var/mob/living/carbon/human/H = user + if(S == H.back && H.w_uniform && !user.get_active_held_item()) // Make sure the bag is on our back, we have clothes on, and there isn't anything in our hands + S.add_fingerprint(H) + S.conceal(H) + return COMPONENT_NO_AFTERATTACK + else // It's not on our back AND/OR we don't have clothes AND/OR we have something in our hands + return ..() diff --git a/modular_darkpack/modules/clothes/code/belt.dm b/modular_darkpack/modules/clothes/code/belt.dm index ac593927a60a..c664ac7eccaa 100644 --- a/modular_darkpack/modules/clothes/code/belt.dm +++ b/modular_darkpack/modules/clothes/code/belt.dm @@ -1,28 +1,89 @@ -/obj/item/storage/belt/holster/detective/vampire +/datum/storage/holster/darkpack + max_slots = 2 // Pistol + a mag // TODO: Gridventory + max_total_storage = 16 + open_sound = 'sound/items/handling/holster_open.ogg' + open_sound_vary = TRUE +/datum/storage/holster/darkpack/New(atom/parent, max_slots, max_specific_storage, max_total_storage, rustle_sound, remove_rustle_sound, list/holdables) + . = ..() + if(length(holdables)) + set_holdable(holdables) + return + + set_holdable(list( + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/gun/ballistic/revolver, + /obj/item/ammo_box/magazine, + /obj/item/ammo_box/darkpack/c9mm/moonclip + )) + +/obj/item/storage/belt/holster/detective/darkpack // TODO: Get unique sprites for these name = "holster" desc = "a holster for your gun." - component_type = /datum/component/storage/concrete/vtm/holster + storage_type = /datum/storage/holster/darkpack -/obj/item/storage/belt/holster/detective/vampire/police +/obj/item/storage/belt/holster/detective/darkpack/police desc = "standard issue holster for standard issue sidearms." -/obj/item/storage/belt/holster/detective/vampire/police/PopulateContents() - new /obj/item/ammo_box/vampire/c9mm/moonclip(src) - new /obj/item/ammo_box/vampire/c9mm/moonclip(src) +/obj/item/storage/belt/holster/detective/darkpack/police/PopulateContents() + new /obj/item/ammo_box/darkpack/c9mm/moonclip(src) + new /obj/item/ammo_box/darkpack/c9mm/moonclip(src) new /obj/item/gun/ballistic/revolver/darkpack/snub(src) -/obj/item/storage/belt/holster/detective/vampire/officer +/obj/item/storage/belt/holster/detective/darkpack/officer -/obj/item/storage/belt/holster/detective/vampire/officer/PopulateContents() +/obj/item/storage/belt/holster/detective/darkpack/officer/PopulateContents() new /obj/item/gun/ballistic/automatic/pistol/darkpack/glock19(src) new /obj/item/ammo_box/magazine/glock9mm(src) new /obj/item/ammo_box/magazine/glock9mm(src) -/obj/item/storage/belt/holster/detective/vampire/fbi +/obj/item/storage/belt/holster/detective/darkpack/fbi -/obj/item/storage/belt/holster/detective/vampire/fbi/PopulateContents() +/obj/item/storage/belt/holster/detective/darkpack/fbi/PopulateContents() new /obj/item/gun/ballistic/automatic/pistol/darkpack/glock21(src) new /obj/item/ammo_box/magazine/glock45acp(src) new /obj/item/ammo_box/magazine/glock45acp(src) +/obj/item/storage/belt/holster/detective/darkpack/endron + +/obj/item/storage/belt/holster/detective/darkpack/endron/PopulateContents() + new /obj/item/gun/ballistic/automatic/pistol/darkpack/glock19(src) + new /obj/item/ammo_box/magazine/glock9mm(src) + +/obj/item/storage/belt/security/police + name = "duty belt" + desc = "A black leather belt for holding patrol gear." + storage_type = /datum/storage/security_belt/darkpack + +/obj/item/storage/belt/security/police/PopulateContents() + new /obj/item/gun/energy/taser/darkpack(src) + new /obj/item/gun/ballistic/automatic/pistol/darkpack/m1911(src) + +/obj/item/storage/belt/security/police/swat + +/obj/item/storage/belt/security/police/swat/full/PopulateContents() + new /obj/item/gun/energy/taser/darkpack(src) + new /obj/item/reagent_containers/spray/pepper(src) + new /obj/item/restraints/handcuffs(src) + new /obj/item/ammo_box/magazine/darkpack556(src) + new /obj/item/ammo_box/magazine/darkpack556(src) +/datum/storage/security_belt/darkpack/New(atom/parent, max_slots, max_specific_storage, max_total_storage, rustle_sound, remove_rustle_sound) + . = ..() + set_holdable(list( + /obj/item/ammo_box, + /obj/item/ammo_casing, + /obj/item/assembly/flash/handheld, + /obj/item/clothing/glasses, + /obj/item/clothing/gloves, + /obj/item/flashlight/seclite, + /obj/item/food/donut, + /obj/item/grenade, + /obj/item/holosign_creator/security, + /obj/item/knife/combat, + /obj/item/melee/baton, + /obj/item/radio, + /obj/item/reagent_containers/spray/pepper, + /obj/item/restraints/handcuffs, + /obj/item/restraints/legcuffs/bola, + /obj/item/gun/energy/taser, + )) diff --git a/modular_darkpack/modules/clothes/code/hands.dm b/modular_darkpack/modules/clothes/code/hands.dm index a2709a3cd6ce..43cd2515166d 100644 --- a/modular_darkpack/modules/clothes/code/hands.dm +++ b/modular_darkpack/modules/clothes/code/hands.dm @@ -71,4 +71,12 @@ icon_state = "latex" armor_type = /datum/armor/anti_acid_gloves - +/obj/item/clothing/gloves/vampire/white + name = "white gloves" + desc = "A pair of fine, white gloves, a symbol of of cleanliness and quality, and not much else. Getting them dirty shows how unprofessional you are." + icon_state = "white_gloves" + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + resistance_flags = NONE diff --git a/modular_darkpack/modules/clothes/code/head.dm b/modular_darkpack/modules/clothes/code/head.dm index 6a1d3248ca9c..734741c7fc10 100644 --- a/modular_darkpack/modules/clothes/code/head.dm +++ b/modular_darkpack/modules/clothes/code/head.dm @@ -228,6 +228,7 @@ desc = "A thermoplastic hard helmet used to protect the head from injury." icon_state = "hardhat" armor_type = /datum/armor/construction_helmet + custom_price = 50 /datum/armor/construction_helmet melee = 20 @@ -320,14 +321,14 @@ flags_inv = HIDEEARS|HIDEHAIR /obj/item/clothing/head/vampire/pentex_yellowhardhat - name = "Endron hardhat" - desc = "A yellow hardhat. This one has an Endron International logo on it!" + name = "\improper " + MAIN_EVIL_COMPANY + " hardhat" + desc = "A yellow hardhat. This one has an " + MAIN_EVIL_COMPANY + " logo on it!" icon_state = "pentex_hardhat_yellow" flags_inv = HIDEHAIR /obj/item/clothing/head/vampire/pentex_whitehardhat - name = "Endron hardhat" - desc = "A white hardhat. This one has an Endron International logo on it!" + name = "\improper " + MAIN_EVIL_COMPANY + " hardhat" + desc = "A white hardhat. This one has an " + MAIN_EVIL_COMPANY + " logo on it!" icon_state = "pentex_hardhat_white" flags_inv = HIDEHAIR @@ -336,3 +337,43 @@ desc = "A black beret with a mysterious golden insigna bearing a spiral." icon_state = "pentex_beret" flags_inv = HIDEHAIR + +/obj/item/clothing/head/vampire/blackbag + name = "black bag" + desc = "Used by kidnappers, sadists, and three letter agencies. Easily fits over the head to obscure vision." + icon_state = "black_bag" + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR + + flash_protect = FLASH_PROTECTION_WELDER + tint = 3 + +/obj/item/clothing/head/vampire/blackbag/equipped(mob/living/carbon/human/user, slot) + . = ..() + if(slot == ITEM_SLOT_HEAD) + user.become_blind("blindfold_[REF(src)]") + +/obj/item/clothing/head/vampire/blackbag/dropped(mob/living/carbon/human/user) + . = ..() + user.cure_blind("blindfold_[REF(src)]") + +/obj/item/clothing/head/vampire/blackbag/attack(mob/living/target, mob/living/user) + var/obj/item/clothing/head/H = target.get_item_by_slot(ITEM_SLOT_HEAD) + if(H?.clothing_flags & SNUG_FIT) + to_chat(user, span_warning("You can't fit the blackbag over [target.p_their()] headgear!")) + return + if(do_after(user, 0.5 SECONDS, target)) //Mainly to prevent black_bagging mid combat. + target.visible_message(span_warning("[user] forces [src] onto [target]'s head!")) + to_chat(target, span_bolddanger("[target] forces [src] onto your head!")) + target.emote("scream") + target.Stun(0.5 SECONDS) + + target.dropItemToGround(H) + target.equip_to_slot_if_possible(src, ITEM_SLOT_HEAD) + +/obj/item/clothing/head/beret/black + name = "black beret" + desc = "A black beret, perfect for war veterans and dark, brooding, anti-hero mimes." + icon_state = "beret" + greyscale_config = /datum/greyscale_config/beret + greyscale_config_worn = /datum/greyscale_config/beret/worn + greyscale_colors = "#3f3c40" diff --git a/modular_darkpack/modules/clothes/code/mask.dm b/modular_darkpack/modules/clothes/code/mask.dm index f54d3bd7d687..1f4da1ecf5eb 100644 --- a/modular_darkpack/modules/clothes/code/mask.dm +++ b/modular_darkpack/modules/clothes/code/mask.dm @@ -11,8 +11,11 @@ w_class = WEIGHT_CLASS_NORMAL flags_cover = MASKCOVERSMOUTH | PEPPERPROOF resistance_flags = NONE + custom_price = 30 /obj/item/clothing/mask/vampire + // This USED to be the default resperatior for wod13 moved that to /obj/item/clothing/mask/gas/vampire + abstract_type = /obj/item/clothing/mask/vampire flags_inv = HIDEFACE | HIDEFACIALHAIR | HIDESNOUT icon = 'modular_darkpack/modules/clothes/icons/clothing.dmi' worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' @@ -86,3 +89,7 @@ flags_inv = HIDEFACE flags_cover = NONE +/obj/item/clothing/mask/vampire/fomori_chaser + name = "scary mask" + desc = "Do you like scary movies?" + icon_state = "chaser" diff --git a/modular_darkpack/modules/clothes/code/suit.dm b/modular_darkpack/modules/clothes/code/suit.dm index 1442d1ec4f10..3376195694af 100644 --- a/modular_darkpack/modules/clothes/code/suit.dm +++ b/modular_darkpack/modules/clothes/code/suit.dm @@ -282,6 +282,27 @@ acid = 10 wound = 35 +/obj/item/clothing/suit/vampire/jacket/better/armored + name = "armored leather jacket" + armor_type = /datum/armor/armored_jackets + +/datum/armor/armored_jackets + melee = 50 + bullet = 50 + laser = 50 + energy = 10 + bomb = 40 + bio = 0 + fire = 40 + acid = 10 + wound = 25 + +/obj/item/clothing/suit/vampire/trench/alt/armored + name = "armored trenchcoat" + icon_state = "trench2" + max_integrity = 1000; + armor_type = /datum/armor/armored_jackets + /obj/item/clothing/suit/vampire/trench name = "trenchcoat" desc = "Best noir clothes for night. Provides some kind of protection." @@ -501,16 +522,21 @@ desc = "A traditional robe worn by priests of the Orthodox faith." icon_state = "vestments" +/obj/item/clothing/suit/vampire/dutch + name = "dutch's jacket" + desc = "For those long nights on the beach in Tahiti." + icon_state = "DutchJacket" + //Pentex Overwear /obj/item/clothing/suit/vampire/pentex_labcoat - name = "Endron labcoat" - desc = "A crisp white labcoat. This one has the Endron International logo stiched onto the breast!" + name = "\improper " + MAIN_EVIL_COMPANY + " labcoat" + desc = "A crisp white labcoat. This one has the " + MAIN_EVIL_COMPANY + " International logo stiched onto the breast!" icon_state = "pentex_closedlabcoat" armor_type = /datum/armor/labcoat /obj/item/clothing/suit/vampire/pentex_labcoat_alt - name = "Endron labcoat" - desc = "A crisp white labcoat. This one has a green trim and the Endron International logo stiched onto the breast!" + name = "\improper " + MAIN_EVIL_COMPANY + " labcoat" + desc = "A crisp white labcoat. This one has a green trim and the " + MAIN_EVIL_COMPANY + " International logo stiched onto the breast!" icon_state = "pentex_labcoat_alt" armor_type = /datum/armor/labcoat diff --git a/modular_darkpack/modules/clothes/code/under.dm b/modular_darkpack/modules/clothes/code/under.dm index dca5e05cae50..58945a5784a3 100644 --- a/modular_darkpack/modules/clothes/code/under.dm +++ b/modular_darkpack/modules/clothes/code/under.dm @@ -1,4 +1,5 @@ /obj/item/clothing/under/vampire + abstract_type = /obj/item/clothing/under/vampire desc = "Some clothes." name = "clothes" has_sensor = NO_SENSORS @@ -231,7 +232,15 @@ /obj/item/clothing/under/vampire/police name = "police uniform" - desc = "The clothes of the boys in blue. Did you know that 44% of Cops have heard of Pentex? Google 44% of Cops for more information." + /* + * I did like a fair bit of research tracking down the statistic, 44% was the original value here but I cant find anything supporting that, + * The commonly thrown around number of 40% is from + * Johnson, L.B. (1991). On the front lines: Police stress and family well-being. Hearing before the Select Committee on Children, Youth, and Families House of Representatives: 102 Congress First Session May 20 (p. 32-48). Washington DC: US Government Printing Office. + * Most other stuides get lower numbers e.g + * Neidig, P.H., Russell, H.E. & Seng, A.F. (1992). Interspousal aggression in law enforcement families: A preliminary investigation. Police Studies, Vol. 15 (1), p. 30-38. + * Anyway im done doing research for this joke. - Fallcon + */ + desc = "The clothes of the boys in blue. Did you know that 40% of Cops have heard of " + EVIL_COMPANY + "? Google 40% of Cops for more information." icon_state = "police" /obj/item/clothing/under/vampire/police/long @@ -267,6 +276,26 @@ desc = "Some sterile clothes." icon_state = "nurse" +/obj/item/clothing/under/vampire/nurse/nurseb + name = "black nurse scrubs" + desc = "Some sterile clothes." + icon_state = "nurseb" + +/obj/item/clothing/under/vampire/nurse/nurseg + name = "green nurse scrubs" + desc = "Some sterile clothes." + icon_state = "nurseg" + +/obj/item/clothing/under/vampire/nurse/nursep + name = "pink nurse scrubs" + desc = "Some sterile clothes." + icon_state = "nursep" + +/obj/item/clothing/under/vampire/nurse/nursec + name = "cyan nurse scrubs" + desc = "Some sterile clothes." + icon_state = "nursec" + /obj/item/clothing/under/vampire/graveyard desc = "There'll be some GRAVE consequences for taking this off!" icon_state = "graveyard" @@ -369,7 +398,7 @@ /obj/item/clothing/under/vampire/primogen_toreador name = "white suit" - desc = "Say good night to the bad guy!." + desc = "Say good night to the bad guy!" icon_state = "toreador_male" /obj/item/clothing/under/vampire/primogen_toreador/female @@ -416,30 +445,40 @@ icon_state = "pentex_janitor" /obj/item/clothing/under/vampire/pentex_shortsleeve - name = "Endron polo-shirt" - desc = "An Endron International employee uniform. This one is a nice polo!" + name = "\improper " + MAIN_EVIL_COMPANY + " polo-shirt" + desc = "An " + MAIN_EVIL_COMPANY + " International employee uniform. This one is a nice polo!" icon_state = "pentex_shortsleeve" /obj/item/clothing/under/vampire/pentex_longleeve - name = "Endron shirt" - desc = "An Endron International employee uniform. This one has sleeves!" + name = "\improper " + MAIN_EVIL_COMPANY + " shirt" + desc = "An " + MAIN_EVIL_COMPANY + " International employee uniform. This one has sleeves!" icon_state = "pentex_longsleeve" /obj/item/clothing/under/vampire/pentex_turtleneck - name = "Endron turtleneck" - desc = "An Endron International employee uniform. This one is a nice turtleneck!" + name = "\improper " + MAIN_EVIL_COMPANY + " turtleneck" + desc = "An " + MAIN_EVIL_COMPANY + " International employee uniform. This one is a nice turtleneck!" icon_state = "pentex_turtleneck" /obj/item/clothing/under/vampire/pentex_suit - name = "Endron suit" - desc = "A nice suit with a green dress-shirt. This one has an Endron International tag on it!" + name = "\improper " + MAIN_EVIL_COMPANY + " suit" + desc = "A nice suit with a green dress-shirt. This one has an " + MAIN_EVIL_COMPANY + " International tag on it!" icon_state = "pentex_suit" /obj/item/clothing/under/vampire/pentex_suitskirt - name = "Endron suitskirt" - desc = "A nice suitskirt with a green dress-shirt. This one has an Endron International tag on it!" + name = "\improper " + MAIN_EVIL_COMPANY + " suitskirt" + desc = "A nice suitskirt with a green dress-shirt. This one has an " + MAIN_EVIL_COMPANY + " International tag on it!" icon_state = "pentex_suitskirt" +/obj/item/clothing/under/vampire/pentex_executive_suit + name = "\improper " + MAIN_EVIL_COMPANY + " executive suit" + desc = "A white designer suit with a green dress shirt. This one has an " + MAIN_EVIL_COMPANY + " International tag on it!" + icon_state = "pentex_executivesuit" + +/obj/item/clothing/under/vampire/pentex_executiveskirt + name = "\improper " + MAIN_EVIL_COMPANY + " executive suitskirt" + desc = "A white designer suitskirt with a green dress shirt. This one has an " + MAIN_EVIL_COMPANY + " International tag on it!" + icon_state = "pentex_executiveskirt" + /obj/item/clothing/under/vampire/pentex_executive_suit name = "Endron executive suit" desc = "A white designer suit with a green dress shirt. This one has an Endron International tag on it!" @@ -451,5 +490,3 @@ icon_state = "pentex_executiveskirt" - - diff --git a/modular_darkpack/modules/clothes/icons/clothing.dmi b/modular_darkpack/modules/clothes/icons/clothing.dmi index 25fd9a75f316..7bc7f8d22c48 100644 Binary files a/modular_darkpack/modules/clothes/icons/clothing.dmi and b/modular_darkpack/modules/clothes/icons/clothing.dmi differ diff --git a/modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi b/modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi index 4b83bd927d60..ccd6a2d41d2d 100644 Binary files a/modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi and b/modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi differ diff --git a/modular_darkpack/modules/clothes/icons/worn.dmi b/modular_darkpack/modules/clothes/icons/worn.dmi index 8c028144c6d3..4384806e4751 100644 Binary files a/modular_darkpack/modules/clothes/icons/worn.dmi and b/modular_darkpack/modules/clothes/icons/worn.dmi differ diff --git a/modular_darkpack/modules/combat/code/blocking/blocking.dm b/modular_darkpack/modules/combat/code/blocking/blocking.dm deleted file mode 100644 index 73d4df2df073..000000000000 --- a/modular_darkpack/modules/combat/code/blocking/blocking.dm +++ /dev/null @@ -1,139 +0,0 @@ -/mob/living/carbon/human/toggle_move_intent(mob/living/user) - if (blocking && move_intent == MOVE_INTENT_WALK) - return - - . = ..() - -/mob/living/carbon/human/proc/SwitchBlocking() - if(!blocking) - visible_message(span_warning("[src] prepares to block."), span_warning("You prepare to block.")) - blocking = TRUE - if(hud_used) - hud_used.block_icon.icon_state = "act_block_on" - clear_parrying() - remove_overlay(FIGHT_LAYER) - var/mutable_appearance/block_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "block", -FIGHT_LAYER) - overlays_standing[FIGHT_LAYER] = block_overlay - apply_overlay(FIGHT_LAYER) - last_move_intent = move_intent - if(move_intent == MOVE_INTENT_RUN) - toggle_move_intent(src) - else - to_chat(src, span_warning("You lower your defense.")) - remove_overlay(FIGHT_LAYER) - blocking = FALSE - if(move_intent != last_move_intent) - toggle_move_intent(src) - if(hud_used) - hud_used.block_icon.icon_state = "act_block_off" - -/mob/living/carbon/human/attackby(obj/item/W, mob/living/user, params) - if(user.blocking) - return - if(getStaminaLoss() >= 50 && blocking) - SwitchBlocking() - if(CheckFrenzyMove() && blocking) - SwitchBlocking() - if(user.a_intent == INTENT_GRAB && ishuman(user)) - var/mob/living/carbon/human/ZIG = user - if(ZIG.getStaminaLoss() < 50 && !ZIG.CheckFrenzyMove()) - ZIG.parry_class = W.w_class - ZIG.Parry(src) - return - if(user == parrying && user != src) - if(W.w_class == parry_class) - user.apply_damage(60, STAMINA) - if(W.w_class == parry_class-1 || W.w_class == parry_class+1) - user.apply_damage(30, STAMINA) - else - user.apply_damage(10, STAMINA) - user.do_attack_animation(src) - visible_message(span_danger("[src] parries the attack!"), span_danger("You parry the attack!")) - playsound(src, 'modular_darkpack/modules/deprecated/sounds/parried.ogg', 70, TRUE) - clear_parrying() - return - if(HAS_TRAIT(src, TRAIT_ENHANCED_MELEE_DODGE)) - apply_damage(3, STAMINA) - user.do_attack_animation(src) - playsound(src, 'sound/items/weapons/tap.ogg', 70, TRUE) - emote("flip") - visible_message(span_danger("[src] dodges the attack!"), span_danger("You dodge the attack!")) - return - if(blocking) - if(istype(W, /obj/item/melee)) - var/obj/item/melee/WEP = W - var/obj/item/bodypart/assexing = get_bodypart("[(active_hand_index % 2 == 0) ? "r" : "l" ]_arm") - if(istype(get_active_held_item(), /obj/item)) - var/obj/item/IT = get_active_held_item() - if(IT.w_class >= W.w_class) - apply_damage(10, STAMINA) - user.do_attack_animation(src) - playsound(src, 'sound/items/weapons/tap.ogg', 70, TRUE) - visible_message(span_danger("[src] blocks the attack!"), span_danger("You block the attack!")) - if(incapacitated(TRUE, TRUE) && blocking) - SwitchBlocking() - return - else - var/hand_damage = max(WEP.force - IT.force/2, 1) - playsound(src, WEP.hitsound, 70, TRUE) - apply_damage(hand_damage, WEP.damtype, assexing) - apply_damage(30, STAMINA) - user.do_attack_animation(src) - visible_message(span_warning("[src] weakly blocks the attack!"), span_warning("You weakly block the attack!")) - if(incapacitated(TRUE, TRUE) && blocking) - SwitchBlocking() - return - else - playsound(src, WEP.hitsound, 70, TRUE) - apply_damage(round(WEP.force/2), WEP.damtype, assexing) - apply_damage(30, STAMINA) - user.do_attack_animation(src) - visible_message(span_warning("[src] blocks the attack with [gender == MALE ? "his" : "her"] bare hands!"), span_warning("You block the attack with your bare hands!")) - if(incapacitated(TRUE, TRUE) && blocking) - SwitchBlocking() - return - . = ..() - -/mob/living/carbon/human/attack_hand(mob/user) - if(getStaminaLoss() >= 50 && blocking) - SwitchBlocking() - if(CheckFrenzyMove() && blocking) - SwitchBlocking() - if(user.a_intent == INTENT_HARM && HAS_TRAIT(src, TRAIT_ENHANCED_MELEE_DODGE)) - playsound(src, 'sound/items/weapons/tap.ogg', 70, TRUE) - apply_damage(3, STAMINA) - user.do_attack_animation(src) - emote("flip") - visible_message(span_danger("[src] dodges the punch!"), span_danger("You dodge the punch!")) - return - if(user.a_intent == INTENT_HARM && blocking) - playsound(src, 'sound/items/weapons/tap.ogg', 70, TRUE) - apply_damage(10, STAMINA) - user.do_attack_animation(src) - visible_message(span_danger("[src] blocks the punch!"), span_danger("You block the punch!")) - if(incapacitated(TRUE, TRUE) && blocking) - SwitchBlocking() - return - . = ..() - -/mob/living/carbon/human/proc/Parry(mob/M) - if(!pulledby && !parrying && world.time-parry_cd >= 30 && M != src) - parrying = M - if(blocking) - SwitchBlocking() - visible_message(span_warning("[src] prepares to parry [M]'s next attack."), span_warning("You prepare to parry [M]'s next attack.")) - playsound(src, 'modular_darkpack/modules/deprecated/sounds/parry.ogg', 70, TRUE) - remove_overlay(FIGHT_LAYER) - var/mutable_appearance/parry_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "parry", -FIGHT_LAYER) - overlays_standing[FIGHT_LAYER] = parry_overlay - apply_overlay(FIGHT_LAYER) - parry_cd = world.time - spawn(10) - clear_parrying() - return - -/mob/living/carbon/human/proc/clear_parrying() - if(parrying) - parrying = null - remove_overlay(FIGHT_LAYER) - to_chat(src, span_warning("You lower your defense.")) diff --git a/modular_darkpack/modules/combat/code/blocking/blocking_hud.dm b/modular_darkpack/modules/combat/code/blocking/blocking_hud.dm deleted file mode 100644 index ff42d661d543..000000000000 --- a/modular_darkpack/modules/combat/code/blocking/blocking_hud.dm +++ /dev/null @@ -1,13 +0,0 @@ -/atom/movable/screen/block - name = "block" - icon = 'modular_darkpack/modules/deprecated/icons/ui/buttons_wide.dmi' - icon_state = "act_block_off" - layer = HUD_LAYER - plane = HUD_PLANE - -/atom/movable/screen/block/Click() - if (ishuman(usr)) - var/mob/living/carbon/human/BL = usr - BL.SwitchBlocking() - - . = ..() diff --git a/modular_darkpack/modules/combat/code/blocking/blocking_keybind.dm b/modular_darkpack/modules/combat/code/blocking/blocking_keybind.dm deleted file mode 100644 index f609a83e0040..000000000000 --- a/modular_darkpack/modules/combat/code/blocking/blocking_keybind.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/keybinding/human/block - hotkey_keys = list("C") - name = "enable_blocking" - full_name = " Enable or disable blocking mod" - description = "Toggles blocking mode for combat" - keybind_signal = COMSIG_KB_HUMAN_BLOCK - -/datum/keybinding/human/block/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - H.SwitchBlocking() - return TRUE diff --git a/modular_darkpack/modules/combat/code/face_target.dm b/modular_darkpack/modules/combat/code/face_target.dm deleted file mode 100644 index 79602041a17c..000000000000 --- a/modular_darkpack/modules/combat/code/face_target.dm +++ /dev/null @@ -1,9 +0,0 @@ -/atom/MouseEntered(location,control,params) - if(isturf(src) || ismob(src) || isobj(src)) - if(loc && iscarbon(usr)) - var/mob/living/carbon/H = usr - if(H.a_intent == INTENT_HARM) - if(!H.IsSleeping() && !H.IsUnconscious() && !H.IsParalyzed() && !H.IsKnockdown() && !H.IsStun() && !HAS_TRAIT(H, TRAIT_RESTRAINED)) - H.face_atom(src) - H.harm_focus = H.dir - diff --git a/modular_darkpack/modules/computers/code/computer.dm b/modular_darkpack/modules/computers/code/computer.dm index 1b04c90348ef..4fe138f09ffb 100644 --- a/modular_darkpack/modules/computers/code/computer.dm +++ b/modular_darkpack/modules/computers/code/computer.dm @@ -175,7 +175,7 @@ GLOBAL_LIST_EMPTY(vampire_computers) C.icon_state = "computermessage" else C.say("Announcement sent.") - for(var/obj/item/vamp/phone/P in GLOB.phones_list) + for(var/obj/item/smartphone/P in GLOB.phones_list) P.say("New announcement!") return TRUE if("delete_email") diff --git a/modular_darkpack/modules/curtains/code/curtains.dm b/modular_darkpack/modules/curtains/code/curtains.dm new file mode 100644 index 000000000000..0df2c4de8312 --- /dev/null +++ b/modular_darkpack/modules/curtains/code/curtains.dm @@ -0,0 +1,3 @@ +/obj/structure/curtain/cloth/fancy/mechanical/luxurious + icon_type = "bounty" + icon_state = "bounty-open" diff --git a/modular_darkpack/modules/dancing/code/dancing.dm b/modular_darkpack/modules/dancing/code/dancing.dm index 18ce470ca573..0a77a2160da9 100644 --- a/modular_darkpack/modules/dancing/code/dancing.dm +++ b/modular_darkpack/modules/dancing/code/dancing.dm @@ -46,7 +46,7 @@ initial_matrix.Translate(-3,0) animate(M, transform = initial_matrix, time = 1, loop = 0) sleep(0.1 SECONDS) - // TODO: [Rebase] reimplement dwarf/tower + // DARKPACK TODO - reimplement dwarf/tower //M.lying_fix() M.dancing = FALSE @@ -86,6 +86,6 @@ initial_matrix.Translate(-3,0) animate(M, transform = initial_matrix, time = 1, loop = 0) sleep(0.1 SECONDS) - // TODO: [Rebase] reimplement dwarf/tower + // DARKPACK TODO - reimplement dwarf/tower //M.lying_fix() M.dancing = FALSE diff --git a/modular_darkpack/modules/decor/code/bench.dm b/modular_darkpack/modules/decor/code/bench.dm new file mode 100644 index 000000000000..4874b23c36e7 --- /dev/null +++ b/modular_darkpack/modules/decor/code/bench.dm @@ -0,0 +1,46 @@ +/// Create colored subtypes for BENCHES +#define COLORED_BENCH(path, color_name, bench_color) \ +path/middle/color_name {\ + color = bench_color; \ +} \ +path/right/color_name {\ + color = bench_color; \ +} \ +path/left/color_name {\ + color = bench_color; \ +} + +//Icons by -Jay- (hyphenjayhyphen) 7/30/25 +/obj/structure/chair/sofa/city_bench + name = "bench" + has_armrest = FALSE + icon_state = null + icon = 'modular_darkpack/modules/decor/icons/bench.dmi' + +/obj/structure/chair/sofa/city_bench/wood + desc = "A comfy wooden bench." + icon_state = "wood" + +/obj/structure/chair/sofa/city_bench/wood/left + icon_state = "wood_left" + +/obj/structure/chair/sofa/city_bench/wood/right + icon_state = "wood_right" + +/obj/structure/chair/sofa/city_bench/metal + name = "metal bench" + desc = "An uncomfortable metal bench." + icon_state = "metal" + +/obj/structure/chair/sofa/city_bench/metal/left + icon_state = "metal_left" + +/obj/structure/chair/sofa/city_bench/metal/right + icon_state = "metal_right" + +COLORED_BENCH(/obj/structure/chair/sofa/city_bench/metal, black, COLOR_DARK) +COLORED_BENCH(/obj/structure/chair/sofa/city_bench/metal, yellow, "#af7d28") +COLORED_BENCH(/obj/structure/chair/sofa/city_bench/metal, blue, COLOR_TRAM_BLUE) +COLORED_BENCH(/obj/structure/chair/sofa/city_bench/metal, puce, COLOR_PUCE) + +#undef COLORED_BENCH diff --git a/modular_darkpack/modules/decor/code/city_map.dm b/modular_darkpack/modules/decor/code/city_map.dm new file mode 100644 index 000000000000..35b5b82f4ba3 --- /dev/null +++ b/modular_darkpack/modules/decor/code/city_map.dm @@ -0,0 +1,33 @@ +/obj/structure/city_map + name = "\improper map" + desc = "Locate yourself now." + icon = 'modular_darkpack/modules/decor/icons/city_map.dmi' + icon_state = "map" + anchored = TRUE + density = TRUE + var/page_link = "Map" + +/obj/structure/city_map/Initialize(mapload) + . = ..() + AddElement(/datum/element/contextual_screentip_bare_hands, lmb_text = "Navigate", rmb_text = "Open Map") + +/obj/structure/city_map/attack_hand(mob/user) + . = ..() + if(check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + icon_state = "[initial(icon_state)]-snow" + if(!isliving(user)) + return TRUE + var/mob/living/navigator = user + navigator.navigate() + +/obj/structure/city_map/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + var/wiki_url = CONFIG_GET(string/wikiurl) + if(!wiki_url) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + var/confirmation = (alert(user, "View the map on the wiki?", "[src]", "Yes", "No")) + if(confirmation == "Yes") + DIRECT_OUTPUT(user, link("[wiki_url]/[page_link]")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/modular_darkpack/modules/decor/code/decals.dm b/modular_darkpack/modules/decor/code/decals.dm index 49e9ca858000..2e4681d4adfa 100644 --- a/modular_darkpack/modules/decor/code/decals.dm +++ b/modular_darkpack/modules/decor/code/decals.dm @@ -1,85 +1,210 @@ +/obj/effect/decal/snow_overlay + name = "snow" + icon = 'modular_darkpack/modules/decor/icons/decals.dmi' + icon_state = "snow_overlay" + alpha = 200 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/effect/decal/coastline + name = "water" + icon = 'modular_darkpack/modules/decor/icons/decals.dmi' + icon_state = "coastline" + +/obj/effect/decal/coastline/corner + icon_state = "coastline_corner" + +/obj/effect/decal/shadow + name = "shadow" + icon = 'modular_darkpack/modules/decor/icons/decals.dmi' + icon_state = "shadow" + +/obj/effect/decal/shadow/NeverShouldHaveComeHere(turf/here_turf) + return FALSE + +/obj/effect/decal/shadow/Initialize(mapload) + . = ..() + if(istype(loc, /turf/open/openspace)) + forceMove(get_step(src, NORTH)) + pixel_y = -32 + +/obj/effect/decal/shadow/low + icon_state = "shadow_low" + +/obj/effect/decal/support + name = "support" + icon = 'modular_darkpack/modules/decor/icons/decals.dmi' + icon_state = "support" + +/obj/effect/decal/support/NeverShouldHaveComeHere(turf/here_turf) + return FALSE + +/obj/effect/decal/rugs + name = "rugs" + icon = 'modular_darkpack/modules/decor/icons/decals.dmi' + icon_state = "rugs" + +/obj/effect/decal/rugs/Initialize(mapload) + . = ..() + icon_state = "rugs[rand(1, 11)]" + +// Turf decals, init behavoir is all before the parent call as the parent call is what bakes them into the turf so icon updates need to happen before that. + /obj/effect/turf_decal/asphalt name = "asphalt" - icon = 'modular_darkpack/modules/deprecated/icons/tiles.dmi' + icon = 'modular_darkpack/modules/decor/icons/decals.dmi' icon_state = "decal1" - mouse_opacity = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/effect/turf_decal/asphalt/Initialize(mapload) - . = ..() icon_state = "decal[rand(1, 24)]" - update_icon() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - alpha = 25 - -/obj/effect/decal/snow_overlay - name = "snow" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "snow_overlay" - alpha = 200 - mouse_opacity = 0 + if(check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + alpha = 25 + . = ..() /obj/effect/turf_decal/asphaltline name = "asphalt" - icon = 'modular_darkpack/modules/deprecated/icons/tiles.dmi' + icon = 'modular_darkpack/modules/decor/icons/decals.dmi' icon_state = "line" - mouse_opacity = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT layer = TURF_DECAL_LAYER /obj/effect/turf_decal/asphaltline/alt icon_state = "line_alt" /obj/effect/turf_decal/asphaltline/Initialize(mapload) - . = ..() icon_state = "[initial(icon_state)][rand(1, 3)]" - update_icon() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "[initial(icon_state)][rand(1, 3)]-snow" + if(check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + icon_state = "[initial(icon_state)][rand(1, 3)]-snow" + . = ..() /obj/effect/turf_decal/crosswalk name = "asphalt" - icon = 'modular_darkpack/modules/deprecated/icons/tiles.dmi' + icon = 'modular_darkpack/modules/decor/icons/decals.dmi' icon_state = "crosswalk1" - mouse_opacity = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/effect/turf_decal/crosswalk/Initialize(mapload) - . = ..() icon_state = "crosswalk[rand(1, 3)]" - update_icon() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "crosswalk[rand(1, 3)]-snow" + if(check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + icon_state = "crosswalk[rand(1, 3)]-snow" + . = ..() /obj/effect/turf_decal/stock name = "stock" - icon = 'modular_darkpack/modules/deprecated/icons/tiles.dmi' + icon = 'modular_darkpack/modules/decor/icons/decals.dmi' icon_state = "stock" - mouse_opacity = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/effect/turf_decal/bordur name = "sidewalk" - icon = 'modular_darkpack/modules/deprecated/icons/tiles.dmi' + icon = 'modular_darkpack/modules/decor/icons/decals.dmi' icon_state = "border" - mouse_opacity = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/effect/turf_decal/bordur/inverse + name = "sidewalk" + icon = 'modular_darkpack/modules/decor/icons/decals.dmi' + icon_state = "border_inverse" + mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/effect/turf_decal/bordur/Initialize(mapload) + if(check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + icon_state = "[initial(icon_state)]-snow" . = ..() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "[initial(icon_state)]-snow" -// footstep = FOOTSTEP_SNOW -// barefootstep = FOOTSTEP_SNOW -// clawfootstep = FOOTSTEP_SNOW -// heavyfootstep = FOOTSTEP_SNOW /obj/effect/turf_decal/bordur/corner icon_state = "border_corner" + +/obj/effect/turf_decal/bordur/corner/inverse // DARKPACK TODO: needs a snow sprite + icon_state = "border_corner_inverse" + +/obj/effect/turf_decal/bordur/end + icon_state = "border_end" + +/*/obj/effect/turf_decal/bordur/end/inverse // DARKPACK TODO: Needs a sprite and a snow sprite + icon_state = "border_end_inverse"*/ + +/obj/effect/turf_decal/darkpack + name = "detail" + abstract_type = /obj/effect/turf_decal/darkpack + icon = 'modular_darkpack/modules/decor/icons/natural_turf_borders.dmi' + // To pass checks + icon_state = "vampdirt_side" + +/obj/effect/turf_decal/darkpack/dirt + icon_state = "vampdirt_side" + +/obj/effect/turf_decal/darkpack/dirt/corner + icon_state = "vampdirt_corner" + +/obj/effect/turf_decal/darkpack/sand + icon_state = "vampbeach_side" + +/obj/effect/turf_decal/darkpack/sand/corner + icon_state = "vampbeach_corner" + +/obj/effect/turf_decal/darkpack/grass + icon_state = "vampgrass_side" + +/obj/effect/turf_decal/darkpack/grass/corner + icon_state = "vampgrass_corner" + +/obj/effect/turf_decal/darkpack/rough + icon_state = "rough_side" + +/obj/effect/turf_decal/darkpack/rough/corner + icon_state = "rough_corner" + +/obj/effect/turf_decal/darkpack/cave + icon_state = "cave_side" + +/obj/effect/turf_decal/darkpack/cave/corner + icon_state = "cave_corner" + + + +/obj/effect/turf_decal/siding/grey + color = "#636363" + +/obj/effect/turf_decal/siding/grey/corner + icon_state = "siding_plain_corner" + +/obj/effect/turf_decal/siding/grey/inner_corner + icon_state = "siding_plain_corner_inner" + +/obj/effect/turf_decal/siding/grey/end + icon_state = "siding_plain_end" + + +/obj/effect/turf_decal/siding/dark_purple + color = "#570090" + +/obj/effect/turf_decal/siding/dark_purple/corner + icon_state = "siding_plain_corner" + +/obj/effect/turf_decal/siding/dark_purple/inner_corner + icon_state = "siding_plain_corner_inner" + +/obj/effect/turf_decal/siding/dark_purple/end + icon_state = "siding_plain_end" + + +/obj/effect/turf_decal/siding/beige + color = "#6e635a" + +/obj/effect/turf_decal/siding/beige/corner + icon_state = "siding_plain_corner" + +/obj/effect/turf_decal/siding/beige/inner_corner + icon_state = "siding_plain_corner_inner" + +/obj/effect/turf_decal/siding/beige/end + icon_state = "siding_plain_end" diff --git a/modular_darkpack/modules/decor/code/decor.dm b/modular_darkpack/modules/decor/code/decor.dm index 05bacc250606..6d04261b04af 100644 --- a/modular_darkpack/modules/decor/code/decor.dm +++ b/modular_darkpack/modules/decor/code/decor.dm @@ -1,16 +1,7 @@ -/obj/effect/decal/rugs - name = "rugs" - icon = 'modular_darkpack/modules/deprecated/icons/tiles.dmi' - icon_state = "rugs" - -/obj/effect/decal/rugs/Initialize(mapload) - . = ..() - icon_state = "rugs[rand(1, 11)]" - /obj/structure/vampfence name = "\improper fence" desc = "Protects places from walking in." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/fence.dmi' icon_state = "fence" layer = ABOVE_ALL_MOB_LAYER anchored = TRUE @@ -57,11 +48,10 @@ /obj/structure/lamppost/Initialize(mapload) . = ..() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "[initial(icon_state)]-snow" + if(check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + icon_state = "[initial(icon_state)]-snow" switch(number_of_lamps) if(1) new_light(get_step(loc, dir)) @@ -91,7 +81,7 @@ /obj/effect/decal/lamplight alpha = 0 -// TODO: [Rebase] Fix lol. +// DARKPACK TODO - Fix lol. /obj/effect/decal/lamplight/NeverShouldHaveComeHere(turf/here_turf) return FALSE @@ -133,23 +123,18 @@ /obj/structure/trafficlight/Initialize(mapload) . = ..() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "[initial(icon_state)]-snow" + if(check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + icon_state = "[initial(icon_state)]-snow" -//I should make these slow to move /obj/structure/closet/crate/dumpster name = "dumpster" desc = "Holds garbage inside." icon = 'modular_darkpack/master_files/icons/obj/storage/crates32x32.dmi' icon_state = "garbage" base_icon_state = "garbage" - plane = GAME_PLANE - layer = ABOVE_ALL_MOB_LAYER - anchored = TRUE - density = TRUE + drag_slowdown = 3 var/internal_trash_chance = 75 var/external_trash_chance = 10 @@ -158,11 +143,10 @@ icon_state = "garbageopen" . = ..() //Letting you clear the snow by opening and closing it is acctually pretty flavor - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "[initial(icon_state)]-snow" + if(check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + icon_state = "[base_icon_state]-snow" /obj/structure/closet/crate/dumpster/PopulateContents() if(prob(internal_trash_chance)) @@ -180,7 +164,7 @@ /obj/structure/trashbag name = "trash bags" desc = "Enough trashbags to block your way." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/trash.dmi' icon_state = "garbage1" density = TRUE anchored = TRUE @@ -196,35 +180,32 @@ /obj/structure/hotelbanner name = "banner" desc = "It says H O T E L." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/city_sign.dmi' icon_state = "banner" - layer = ABOVE_ALL_MOB_LAYER anchored = TRUE density = TRUE /obj/structure/hotelbanner/Initialize(mapload) . = ..() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "[initial(icon_state)]-snow" + if(check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + icon_state = "[initial(icon_state)]-snow" /obj/structure/arc name = "chinatown arc" desc = "Cool chinese architecture." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/chinatown.dmi' icon_state = "ark1" layer = ABOVE_ALL_MOB_LAYER anchored = TRUE /obj/structure/arc/Initialize(mapload) . = ..() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "[initial(icon_state)]-snow" + if(check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + icon_state = "[initial(icon_state)]-snow" /obj/structure/arc/add icon_state = "ark2" @@ -232,21 +213,21 @@ /obj/structure/trad name = "traditional lamp" desc = "Cool chinese lamp." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/chinatown.dmi' icon_state = "trad" layer = ABOVE_ALL_MOB_LAYER anchored = TRUE /obj/structure/vampipe name = "pipes" - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/pipes.dmi' icon_state = "piping1" layer = ABOVE_ALL_MOB_LAYER anchored = TRUE /obj/structure/vamproofwall name = "wall" - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/roofwall.dmi' icon_state = "the_wall" layer = ABOVE_ALL_MOB_LAYER anchored = TRUE @@ -254,17 +235,16 @@ /obj/structure/hydrant name = "hydrant" desc = "Used for firefighting." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/hydrant.dmi' icon_state = "hydrant" anchored = TRUE /obj/structure/hydrant/Initialize(mapload) . = ..() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "[initial(icon_state)]-snow" + if(check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + icon_state = "[initial(icon_state)]-snow" /obj/structure/hydrant/mouse_drop_receive(atom/dropped, mob/user, params) if(HAS_TRAIT(user, TRAIT_DWARF)) //Only lean on the fire hydrant if we are smol @@ -274,20 +254,21 @@ /obj/structure/roadblock name = "\improper road block" desc = "Protects places from walking in." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/barriers.dmi' icon_state = "roadblock" - layer = ABOVE_ALL_MOB_LAYER anchored = TRUE density = TRUE /obj/structure/roadblock/alt icon_state = "barrier" +// DARKPACK TODO - Does not pass the sniff test of being a decal. Make a structure /obj/effect/decal/painting name = "painting" - icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' + icon = 'modular_darkpack/modules/decor/icons/paintings.dmi' icon_state = "painting1" - layer = ABOVE_ALL_MOB_LAYER + plane = GAME_PLANE + layer = SIGN_LAYER /obj/effect/decal/painting/second icon_state = "painting2" @@ -306,62 +287,10 @@ pixel_w = -16 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF -/obj/structure/roadsign - name = "road sign" - desc = "Do not drive your car cluelessly." - icon = 'modular_darkpack/modules/deprecated/icons/32x48.dmi' - icon_state = "stop" - layer = ABOVE_ALL_MOB_LAYER - anchored = TRUE - -/obj/structure/roadsign/stop - name = "stop sign" - icon_state = "stop" - -/obj/structure/roadsign/noparking - name = "no parking sign" - icon_state = "noparking" - -/obj/structure/roadsign/nopedestrian - name = "no pedestrian sign" - icon_state = "nopedestrian" - -/obj/structure/roadsign/busstop - name = "bus stop sign" - icon_state = "busstop" - -/obj/structure/roadsign/speedlimit - name = "speed limit sign" - icon_state = "speed50" - -/obj/structure/roadsign/speedlimit40 - name = "speed limit sign" - icon_state = "speed40" - -/obj/structure/roadsign/speedlimit25 - name = "speed limit sign" - icon_state = "speed25" - -/obj/structure/roadsign/warningtrafficlight - name = "traffic light warning sign" - icon_state = "warningtrafficlight" - -/obj/structure/roadsign/warningpedestrian - name = "pedestrian warning sign" - icon_state = "warningpedestrian" - -/obj/structure/roadsign/parking - name = "parking sign" - icon_state = "parking" - -/obj/structure/roadsign/crosswalk - name = "crosswalk sign" - icon_state = "crosswalk" - /obj/structure/barrels name = "barrel" desc = "Storage some liquids." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/barrels.dmi' icon_state = "barrel1" layer = ABOVE_ALL_MOB_LAYER anchored = TRUE @@ -377,7 +306,7 @@ /obj/structure/bricks name = "bricks" desc = "Building material." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/alleyway.dmi' icon_state = "bricks" layer = ABOVE_ALL_MOB_LAYER anchored = TRUE @@ -385,9 +314,12 @@ /obj/effect/decal/pallet name = "pallet" - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/alleyway.dmi' icon_state = "under1" +/obj/effect/decal/pallet/NeverShouldHaveComeHere(turf/here_turf) + return FALSE + /obj/effect/decal/pallet/Initialize(mapload) . = ..() icon_state = "under[rand(1, 2)]" @@ -395,7 +327,7 @@ /obj/cargotrain name = "cargocrate" desc = "It delivers a lot of things." - icon = 'modular_darkpack/modules/deprecated/icons/containers.dmi' + icon = 'modular_darkpack/modules/decor/icons/containers.dmi' icon_state = "1" anchored = TRUE density = FALSE @@ -420,7 +352,7 @@ /obj/cargocrate name = "cargocrate" desc = "It delivers a lot of things." - icon = 'modular_darkpack/modules/deprecated/icons/containers.dmi' + icon = 'modular_darkpack/modules/decor/icons/containers.dmi' icon_state = "1" anchored = TRUE @@ -461,7 +393,7 @@ /obj/structure/marketplace name = "stock market" desc = "Recent stocks visualization." - icon = 'modular_darkpack/modules/deprecated/icons/stonks.dmi' + icon = 'modular_darkpack/modules/decor/icons/stonks.dmi' icon_state = "marketplace" anchored = TRUE density = TRUE @@ -476,7 +408,7 @@ /obj/underplate name = "underplate" - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/restaurant.dmi' icon_state = "underplate" layer = TABLE_LAYER anchored = TRUE @@ -560,8 +492,8 @@ /obj/structure/fire_barrel name = "barrel" desc = "Some kind of light and warm source..." - icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' - icon_state = "barrel" + icon = 'modular_darkpack/modules/decor/icons/barrels.dmi' + icon_state = "firebarrel" anchored = TRUE density = TRUE @@ -572,7 +504,7 @@ /obj/structure/fountain name = "fountain" desc = "Gothic water structure." - icon = 'modular_darkpack/modules/deprecated/icons/fountain.dmi' + icon = 'modular_darkpack/modules/decor/icons/fountain.dmi' icon_state = "fountain" anchored = TRUE density = TRUE @@ -668,7 +600,7 @@ /obj/structure/bath name = "bath" desc = "Not big enough for hiding in." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/bathroom.dmi' icon_state = "tub" layer = ABOVE_ALL_MOB_LAYER anchored = TRUE @@ -678,11 +610,11 @@ /obj/weapon_showcase name = "weapon showcase" desc = "Look, a gun." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/showcase.dmi' icon_state = "showcase" density = TRUE anchored = TRUE - layer = ABOVE_ALL_MOB_LAYER + layer = BELOW_OBJ_LAYER resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF /obj/weapon_showcase/Initialize(mapload) @@ -714,7 +646,7 @@ /obj/structure/bury_pit name = "bury pit" desc = "You can bury someone here." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/bury_pit.dmi' icon_state = "pit0" layer = ABOVE_OPEN_TURF_LAYER anchored = TRUE @@ -722,7 +654,7 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF var/burying = FALSE -// TODO: [Rebase] +// DARKPACK TODO - reimplement /* /obj/structure/bury_pit/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/shovel/vamp)) @@ -759,12 +691,13 @@ /obj/structure/fluff/tv name = "\improper TV" desc = "A slightly battered looking TV. Various infomercials play on a loop, accompanied by a jaunty tune." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/television.dmi' icon_state = "tv_news" /obj/structure/fluff/tv/order name = "order screen" desc = "A slightly battered looking TV. It shows a menu to order from." + icon = 'modular_darkpack/modules/decor/icons/restaurant.dmi' icon_state = "order1" /obj/structure/fluff/tv/order/one @@ -784,3 +717,8 @@ /obj/structure/fluff/tv/order/random/Initialize(mapload) . = ..() icon_state = "order[rand(1,4)]" + +/obj/structure/projector + name = "projector" + icon = 'icons/obj/machines/stationary_camera.dmi' + icon_state = "camera" diff --git a/modular_darkpack/modules/decor/code/flora.dm b/modular_darkpack/modules/decor/code/flora.dm index 32a248ce9ccf..a2d95a2412c1 100644 --- a/modular_darkpack/modules/decor/code/flora.dm +++ b/modular_darkpack/modules/decor/code/flora.dm @@ -9,11 +9,13 @@ /obj/structure/flora/tree/vamp/Initialize(mapload) . = ..() icon_state = "tree[rand(1, 11)]" - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "[initial(icon_state)][rand(1, 11)]-snow" + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + if(check_holidays(FESTIVE_SEASON)) + icon_state = "[initial(icon_state)][rand(1, 11)]-snow" + + AddElement(/datum/element/swaying, sway_angle = 4, sway_time = 4 SECONDS, pivot_offset = 48) + /obj/structure/flora/tree/vamp/get_seethrough_map() return SEE_THROUGH_MAP_DEFAULT @@ -22,6 +24,7 @@ if(!burned) burned = TRUE icon_state = "dead[rand(1, 3)]" + animate(src, transform = null, time = 1 SECONDS, loop = 1) /obj/structure/flora/tree/vamp/pine name = "pine" @@ -32,13 +35,21 @@ /obj/structure/flora/tree/vamp/pine/Initialize(mapload) . = ..() icon_state = "pine[rand(1, 4)]" - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "pine[rand(1, 4)]-snow" - if(prob(2)) - burnshit() + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + if(check_holidays(FESTIVE_SEASON)) + icon_state = "pine[rand(1, 4)]-snow" + if(prob(2)) + burnshit() + + if(!burned) + AddElement(/datum/element/swaying, sway_angle = 4, sway_time = 6 SECONDS, pivot_offset = 128) + +/obj/structure/flora/tree/vamp/pine/burnshit() + if(!burned) + burned = TRUE + icon_state = "dead[rand(1, 5)]" + animate(src, transform = null, time = 1 SECONDS, loop = 1) /obj/structure/flora/tree/vamp/pine/get_seethrough_map() return SEE_THROUGH_MAP_THREE_X_THREE @@ -47,3 +58,150 @@ if(!burned) burned = TRUE icon_state = "dead[rand(1, 5)]" + + +/obj/structure/flora/grass/tall + icon_state = "tallgrass_1" + icon = 'modular_darkpack/modules/decor/icons/flora32x48.dmi' + +/obj/structure/flora/grass/tall/style_2 + icon_state = "tallgrass_2" + +/obj/structure/flora/grass/tall/style_3 + icon_state = "tallgrass_3" + +/obj/structure/flora/grass/tall/style_4 + icon_state = "tallgrass_4" + +/obj/structure/flora/grass/tall/style_random/Initialize(mapload) + . = ..() + icon_state = "tallgrass_[rand(1, 4)]" + update_appearance() + +/obj/structure/flora/grass/tall/dry + icon_state = "drytallgrass_1" + +/obj/structure/flora/grass/tall/dry/style_2 + icon_state = "drytallgrass_2" + +/obj/structure/flora/grass/tall/dry/style_3 + icon_state = "drytallgrass_3" + +/obj/structure/flora/grass/tall/dry/style_4 + icon_state = "drytallgrass_4" + +/obj/structure/flora/grass/tall/dry/style_random/Initialize(mapload) + . = ..() + icon_state = "drytallgrass_[rand(1, 4)]" + update_appearance() + +/obj/structure/flora/grass/short + icon_state = "grass_1" + icon = 'modular_darkpack/modules/decor/icons/flora32x48.dmi' + +/obj/structure/flora/grass/short/style_2 + icon_state = "grass_2" + +/obj/structure/flora/grass/short/style_3 + icon_state = "grass_3" + +/obj/structure/flora/grass/short/style_4 + icon_state = "grass_4" + +/obj/structure/flora/grass/short/style_random/Initialize(mapload) + . = ..() + icon_state = "grass_[rand(1, 4)]" + update_appearance() + +/obj/structure/flora/bush/redflower + icon_state = "redplant_1" + icon = 'modular_darkpack/modules/decor/icons/flora32x48.dmi' + +/obj/structure/flora/bush/redflower/style_2 + icon_state = "redplant_2" + +/obj/structure/flora/bush/redflower/style_3 + icon_state = "redplant_3" + +/obj/structure/flora/bush/redflower/style_4 + icon_state = "redplant_4" + +/obj/structure/flora/bush/redflower/style_random/Initialize(mapload) + . = ..() + icon_state = "redplant_[rand(1, 4)]" + update_appearance() + + +/obj/structure/flora/rock/darkpack + icon_state = "rock1" + icon = 'modular_darkpack/modules/decor/icons/flora.dmi' + +/obj/structure/flora/rock/darkpack/Initialize(mapload) + . = ..() + icon_state = "rock[rand(1, 9)]" + +/obj/structure/flora/rock/pile/darkpack + icon_state = "smallrock1" + icon = 'modular_darkpack/modules/decor/icons/flora.dmi' + +/obj/structure/flora/rock/pile/darkpack/Initialize(mapload) + . = ..() + icon_state = "smallrock[rand(1, 6)]" + +/obj/structure/flora/rock/darkpack_big + icon_state = "rock1" + icon = 'modular_darkpack/modules/decor/icons/flora64x64.dmi' + pixel_w = -16 + +/obj/structure/flora/rock/darkpack_big/Initialize(mapload) + . = ..() + icon_state = "rock[rand(1, 4)]" + +/obj/structure/flora/rock/stalagmite + icon_state = "stalagmite1" + icon = 'modular_darkpack/modules/decor/icons/flora64x64.dmi' + pixel_w = -16 + +/obj/structure/flora/rock/stalagmite/Initialize(mapload) + . = ..() + icon_state = "stalagmite[rand(1, 5)]" + + +/obj/effect/spawner/random/flora + icon_state = "flower" + abstract_type = /obj/effect/spawner/random/flora + +/obj/effect/spawner/random/flora/all + loot = list( + /obj/effect/spawner/random/flora/grass = 5, + /obj/effect/spawner/random/flora/bushes = 2, + /obj/effect/spawner/random/flora/rocks = 1 + ) + +/obj/effect/spawner/random/flora/grass + loot = list( + /obj/structure/flora/bush/fullgrass/style_random = 3, + /obj/structure/flora/bush/sparsegrass/style_random = 2, + /obj/structure/flora/bush/lavendergrass/style_random = 2, + /obj/structure/flora/bush/style_random = 1 + ) + +/obj/effect/spawner/random/flora/bushes + loot = list( + /obj/structure/flora/grass/tall/style_random = 4, + /obj/structure/flora/grass/short/style_random = 3, + /obj/structure/flora/bush/fullgrass/style_random = 2, + /obj/structure/flora/grass/tall/dry/style_random = 1, + /obj/structure/flora/bush/redflower/style_random = 1, + ) + +/obj/effect/spawner/random/flora/rocks + loot = list(/obj/structure/flora/rock/pile/darkpack = 5, /obj/structure/flora/rock/darkpack = 1) + +/obj/effect/spawner/random/flora/flowers + loot = list( + /obj/structure/flora/bush/lavendergrass/style_random = 1, + /obj/structure/flora/bush/flowers_yw/style_random = 1, + /obj/structure/flora/bush/flowers_br/style_random = 1, + /obj/structure/flora/bush/flowers_pp/style_random = 1 + ) diff --git a/modular_darkpack/modules/decor/code/posters.dm b/modular_darkpack/modules/decor/code/posters.dm index 644aab792193..a370538754a5 100644 --- a/modular_darkpack/modules/decor/code/posters.dm +++ b/modular_darkpack/modules/decor/code/posters.dm @@ -6,33 +6,53 @@ /obj/structure/sign/poster/city_large/wotw icon_state = "war_of_the_worlds" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city_large/wotw, 32) + /obj/structure/sign/poster/city_large/wotw/old icon_state = "war_of_the_worlds_old" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city_large/wotw/old, 32) + /obj/structure/sign/poster/city_large/lod icon_state = "land_of_dead" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city_large/lod, 32) + /obj/structure/sign/poster/city_large/lod/old icon_state = "land_of_dead_old" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city_large/lod/old, 32) + /obj/structure/sign/poster/city_large/electra icon_state = "electra" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city_large/electra, 32) + /obj/structure/sign/poster/city_large/electra/old icon_state = "electra_old" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city_large/electra/old, 32) + /obj/structure/sign/poster/city_large/cursed icon_state = "cursed" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city_large/cursed, 32) + /obj/structure/sign/poster/city_large/cursed/old icon_state = "cursed_old" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city_large/cursed/old, 32) + /obj/structure/sign/poster/city_large/blade icon_state = "blade" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city_large/blade, 32) + /obj/structure/sign/poster/city_large/blade/old icon_state = "blade_old" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city_large/blade/old, 32) + /obj/structure/sign/poster/city name = "movie" icon = 'modular_darkpack/modules/decor/icons/poster.dmi' @@ -43,62 +63,94 @@ name = "Lacuna Coil" icon_state = "poster_1" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/lacunacoil, 32) + /obj/structure/sign/poster/city/vesuvius name = "Vesuvius" icon_state = "poster_2" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/vesuvius, 32) + /obj/structure/sign/poster/city/redlady name = "Red Lady" icon_state = "poster_3" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/redlady, 32) + /obj/structure/sign/poster/city/car name = "Buy a Car" icon_state = "poster_4" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/car, 32) + /obj/structure/sign/poster/city/ministry name = "Ministry" icon_state = "poster_5" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/ministry, 32) + /obj/structure/sign/poster/city/blade name = "Blade" icon_state = "poster_6" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/blade, 32) + /obj/structure/sign/poster/city/bloodrayne name = "Bloodrayne" icon_state = "poster_7" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/bloodrayne, 32) + /obj/structure/sign/poster/city/gravitykills name = "Gravity Kills" icon_state = "poster_8" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/gravitykills, 32) + /obj/structure/sign/poster/city/genitorturers name = "Genitorturers" icon_state = "poster_9" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/genitorturers, 32) + /obj/structure/sign/poster/city/chiasm name = "Chiasm" icon_state = "poster_10" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/chiasm, 32) + /obj/structure/sign/poster/city/darlingvioletta name = "Darling Violetta" icon_state = "poster_11" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/darlingvioletta, 32) + /obj/structure/sign/poster/city/tiamat name = "Tiamat" icon_state = "poster_12" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/tiamat, 32) + /obj/structure/sign/poster/city/pixies name = "Pixies" icon_state = "poster_13" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/pixies, 32) + /obj/structure/sign/poster/city/diemydarling name = "Die My Darling!" icon_state = "poster_14" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/diemydarling, 32) + /obj/structure/sign/poster/city/dmc name = "Devil May Cry" icon_state = "poster_15" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/dmc, 32) + /obj/structure/sign/poster/city/kish name = "King and Jester" icon_state = "poster_16" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/city/kish, 32) diff --git a/modular_darkpack/modules/decor/code/road_signs.dm b/modular_darkpack/modules/decor/code/road_signs.dm new file mode 100644 index 000000000000..569560d7c9d5 --- /dev/null +++ b/modular_darkpack/modules/decor/code/road_signs.dm @@ -0,0 +1,51 @@ +/obj/structure/roadsign + name = "road sign" + desc = "Do not drive your car cluelessly." + icon = 'modular_darkpack/modules/decor/icons/road_signs.dmi' + icon_state = "stop" + layer = ABOVE_ALL_MOB_LAYER + anchored = TRUE + +/obj/structure/roadsign/stop + name = "stop sign" + icon_state = "stop" + +/obj/structure/roadsign/noparking + name = "no parking sign" + icon_state = "noparking" + +/obj/structure/roadsign/nopedestrian + name = "no pedestrian sign" + icon_state = "nopedestrian" + +/obj/structure/roadsign/busstop + name = "bus stop sign" + icon_state = "busstop" + +/obj/structure/roadsign/speedlimit + name = "speed limit sign" + icon_state = "speed50" + +/obj/structure/roadsign/speedlimit40 + name = "speed limit sign" + icon_state = "speed40" + +/obj/structure/roadsign/speedlimit25 + name = "speed limit sign" + icon_state = "speed25" + +/obj/structure/roadsign/warningtrafficlight + name = "traffic light warning sign" + icon_state = "warningtrafficlight" + +/obj/structure/roadsign/warningpedestrian + name = "pedestrian warning sign" + icon_state = "warningpedestrian" + +/obj/structure/roadsign/parking + name = "parking sign" + icon_state = "parking" + +/obj/structure/roadsign/crosswalk + name = "crosswalk sign" + icon_state = "crosswalk" diff --git a/modular_darkpack/modules/decor/code/rocks.dm b/modular_darkpack/modules/decor/code/rocks.dm deleted file mode 100644 index 53ba17954a6a..000000000000 --- a/modular_darkpack/modules/decor/code/rocks.dm +++ /dev/null @@ -1,56 +0,0 @@ -/obj/structure/vamprocks - name = "rock" - desc = "Rokk." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' - icon_state = "rock1" - layer = ABOVE_ALL_MOB_LAYER - anchored = TRUE - density = TRUE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF - -/obj/structure/vamprocks/Initialize(mapload) - . = ..() - icon_state = "rock[rand(1, 9)]" - -/obj/structure/small_vamprocks - name = "rock" - desc = "Rokk." - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' - icon_state = "smallrock1" - layer = ABOVE_ALL_MOB_LAYER - anchored = TRUE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF - -/obj/structure/small_vamprocks/Initialize(mapload) - . = ..() - icon_state = "smallrock[rand(1, 6)]" - -/obj/structure/big_vamprocks - name = "rock" - desc = "Rokk." - icon = 'modular_darkpack/modules/deprecated/icons/64x64.dmi' - icon_state = "rock1" - layer = ABOVE_ALL_MOB_LAYER - anchored = TRUE - density = TRUE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF - pixel_w = -16 - -/obj/structure/big_vamprocks/Initialize(mapload) - . = ..() - icon_state = "rock[rand(1, 4)]" - -/obj/structure/stalagmite - name = "stalagmite" - desc = "Rokk." - icon = 'modular_darkpack/modules/deprecated/icons/64x64.dmi' - icon_state = "stalagmite1" - layer = ABOVE_ALL_MOB_LAYER - anchored = TRUE - density = TRUE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF - pixel_w = -16 - -/obj/structure/stalagmite/Initialize(mapload) - . = ..() - icon_state = "stalagmite[rand(1, 5)]" diff --git a/modular_darkpack/modules/decor/code/signs_city.dm b/modular_darkpack/modules/decor/code/signs_city.dm index cc09c9076f72..c44c63cdd210 100644 --- a/modular_darkpack/modules/decor/code/signs_city.dm +++ b/modular_darkpack/modules/decor/code/signs_city.dm @@ -3,15 +3,20 @@ icon = 'modular_darkpack/modules/decor/icons/city_sign.dmi' /obj/structure/sign/city/police_department - name = CITY_POLICE_DEPARTMENT + name = "\improper " + CITY_POLICE_DEPARTMENT + " sign" desc = "Stop right there you criminal scum! Nobody can break the law on my watch!!" icon_state = "police" pixel_z = 40 +// DARKPACK TODO - This uses directionals for all of its sprite states for some reason +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/police_department, 32) + /obj/structure/sign/city/order name = "order sign" icon_state = "order" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/order, 32) + /obj/structure/sign/city/hotel name = "sign" desc = "It says H O T E L." @@ -19,15 +24,17 @@ //plane = GAME_PLANE layer = ABOVE_ALL_MOB_LAYER +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/hotel, 0) + /obj/structure/sign/city/hotel/Initialize(mapload) . = ..() set_light(3, 3, "#8e509e") - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "[initial(icon_state)]-snow" + if(check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + icon_state = "[initial(icon_state)]-snow" +// DARKPACK TODO - This uses directionals for all of its sprite states for some reason /obj/structure/sign/city/millenium name = "sign" desc = "It says M I L L E N I U M." @@ -36,6 +43,8 @@ layer = ABOVE_ALL_MOB_LAYER anchored = TRUE +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/millenium, 0) + /obj/structure/sign/city/millenium/Initialize(mapload) . = ..() set_light(3, 3, "#4299bb") @@ -48,14 +57,15 @@ layer = ABOVE_ALL_MOB_LAYER anchored = TRUE +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/anarch, 0) + /obj/structure/sign/city/anarch/Initialize(mapload) . = ..() set_light(3, 3, "#ffffff") - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "[initial(icon_state)]-snow" + if(check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + icon_state = "[initial(icon_state)]-snow" /obj/structure/sign/city/chinese name = "sign" @@ -65,20 +75,28 @@ layer = ABOVE_ALL_MOB_LAYER anchored = TRUE +// DARKPACK TODO - This uses directionals for all of its sprite states for some reason +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/chinese, 0) + /obj/structure/sign/city/chinese/Initialize(mapload) . = ..() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "[initial(icon_state)]-snow" + if(check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + icon_state = "[initial(icon_state)]-snow" /obj/structure/sign/city/chinese/alt icon_state = "chinese2" +// DARKPACK TODO - This uses directionals for all of its sprite states for some reason +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/chinese/alt, 0) + /obj/structure/sign/city/chinese/alt2 icon_state = "chinese3" +// DARKPACK TODO - This uses directionals for all of its sprite states for some reason +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/chinese/alt2, 0) + /obj/structure/sign/city/strip_club name = "sign" desc = "It says DO RA. Maybe it's some kind of strip club..." @@ -87,7 +105,9 @@ layer = ABOVE_ALL_MOB_LAYER anchored = TRUE pixel_w = -8 - pixel_z = 32 + //pixel_z = 32 + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/strip_club, 32) /obj/structure/sign/city/strip_club/Initialize(mapload) . = ..() @@ -101,6 +121,8 @@ layer = ABOVE_ALL_MOB_LAYER anchored = TRUE +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/cabaret_sign, 32) + /obj/structure/sign/city/cabaret_sign/Initialize(mapload) . = ..() set_light(3, 2, "#d98aec") @@ -108,6 +130,8 @@ /obj/structure/sign/city/cabaret_sign/two icon_state = "et" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/cabaret_sign/two, 32) + /obj/structure/sign/city/store icon = 'modular_darkpack/modules/decor/icons/store_sign.dmi' icon_state = "bacotell" @@ -119,12 +143,50 @@ desc = "Eat some precious tacos and pizza!" icon_state = "bacotell" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/store/bacotell, 32) + /obj/structure/sign/city/store/bubway name = "BubWay" desc = "Eat some precious burgers and pizza!" icon_state = "bubway" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/store/bubway, 32) + /obj/structure/sign/city/store/gummaguts name = "Gumma Guts" desc = "Eat some precious chicken nuggets and donuts!" icon_state = "gummaguts" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/store/gummaguts, 32) + +/obj/structure/sign/city/skateshop + name = "Beralta Skateshop" + icon_state = "beralta1" + desc = "Bowell Beralta, apart from having a very unfortunate name, is one of the biggest names in authentic knock-off skateboards." + +/obj/structure/sign/city/skateshop/two + icon_state = "beralta2" + +/obj/structure/sign/city/skateshop/three + icon_state = "beralta3" + +/obj/structure/sign/city/skateshop/four + icon_state = "beralta4" +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/skateshop, 32) +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/skateshop/two, 32) +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/skateshop/three, 32) +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/skateshop/four, 32) + +/obj/structure/sign/city/store/reddragon + name = "Red Dragon" + desc = "Eat yummy-yummy flame fire noodles!" + icon_state = "reddragon" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/store/reddragon, 32) + +/obj/structure/sign/city/store/otolleys + name = "O\'Tolleys" + desc = "O-o-o Oh Toll-ees, Families Welcome!" + icon_state = "otolleys" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/city/store/otolleys, 32) diff --git a/modular_darkpack/modules/decor/code/swaying.dm b/modular_darkpack/modules/decor/code/swaying.dm new file mode 100644 index 000000000000..9257f407ef24 --- /dev/null +++ b/modular_darkpack/modules/decor/code/swaying.dm @@ -0,0 +1,48 @@ +/datum/element/swaying + var/sway_angle + var/sway_time + var/pivot_offset + +/datum/element/swaying/Attach(atom/target, sway_angle = 4, sway_time = 2 SECONDS, pivot_offset = 0) + . = ..() + src.sway_angle = sway_angle + src.sway_time = sway_time + src.pivot_offset = pivot_offset + + var/atom/atom_target = target + var/area/target_area = get_area(atom_target) + + if(!istype(target_area) || !target_area.outdoors) + return + + start_swaying(atom_target) + +/datum/element/swaying/proc/start_swaying(atom/target) + var/matrix/M1 = matrix() + var/matrix/M2 = matrix() + + if(pivot_offset) + M1.Translate(0, pivot_offset) + M1.Turn(sway_angle) + M1.Translate(0, -pivot_offset) + + M2.Translate(0, pivot_offset) + M2.Turn(-sway_angle) + M2.Translate(0, -pivot_offset) + else + M1.Turn(sway_angle) + M2.Turn(-sway_angle) + + if(prob(50)) + animate(target, transform = M1, time = sway_time, loop = -1, easing = SINE_EASING, delay = rand(1, 15)) + animate(transform = M2, time = sway_time) + else + animate(target, transform = M2, time = sway_time, loop = -1, easing = SINE_EASING, delay = rand(1, 15)) + animate(transform = M1, time = sway_time) + +/datum/element/swaying/Detach(atom/target) + . = ..() + if(isatom(target)) + animate(target) + var/atom/atom_target = target + atom_target.transform = matrix() diff --git a/modular_darkpack/modules/decor/code/tables.dm b/modular_darkpack/modules/decor/code/tables.dm index 4178094e0b64..d8152fe73aff 100644 --- a/modular_darkpack/modules/decor/code/tables.dm +++ b/modular_darkpack/modules/decor/code/tables.dm @@ -1,24 +1,3 @@ -/obj/structure/table/bacotell - name = "countertop" - desc = "A corperate countertop for serving food." - icon = 'icons/obj/smooth_structures/darkpack/bacotell_table.dmi' - icon_state = "bacotell_table-0" - base_icon_state = "bacotell_table" - smoothing_groups = SMOOTH_GROUP_BACO_TABLES - canSmoothWith = SMOOTH_GROUP_BACO_TABLES - max_integrity = 200 - can_flip = FALSE - -/obj/structure/table/bubway - name = "countertop" - desc = "A corperate countertop for serving food." - icon = 'icons/obj/smooth_structures/darkpack/bubway_table.dmi' - icon_state = "bubway_table-0" - base_icon_state = "bubway_table" - smoothing_groups = SMOOTH_GROUP_BUB_TABLES - canSmoothWith = SMOOTH_GROUP_BUB_TABLES - max_integrity = 200 - can_flip = FALSE /obj/structure/table/modern name = "modern table" @@ -33,3 +12,79 @@ buildstackamount = 1 smoothing_groups = SMOOTH_GROUP_ABDUCTOR_TABLES canSmoothWith = SMOOTH_GROUP_ABDUCTOR_TABLES + +/obj/structure/table/countertop + name = "countertop" + desc = "A countertop with a solid base." + icon = 'icons/obj/smooth_structures/darkpack/bubway_table.dmi' + icon_state = "bubway_table-0" + base_icon_state = "bubway_table" + abstract_type = /obj/structure/table/countertop + max_integrity = 200 + can_flip = FALSE + +/obj/structure/table/countertop/bubway + desc = "A corperate countertop for serving food." + icon = 'icons/obj/smooth_structures/darkpack/bubway_table.dmi' + icon_state = "bubway_table-0" + base_icon_state = "bubway_table" + smoothing_groups = SMOOTH_GROUP_BUB_TABLES + canSmoothWith = SMOOTH_GROUP_BUB_TABLES + + +/obj/structure/table/countertop/bacotell + desc = "A corperate countertop for serving food." + icon = 'icons/obj/smooth_structures/darkpack/bacotell_table.dmi' + icon_state = "bacotell_table-0" + base_icon_state = "bacotell_table" + smoothing_groups = SMOOTH_GROUP_BACO_TABLES + canSmoothWith = SMOOTH_GROUP_BACO_TABLES + +/obj/structure/table/countertop/beige + icon = 'icons/obj/smooth_structures/beigetop_table.dmi' + icon_state = "beigetop_table-0" + base_icon_state = "beigetop_table" + smoothing_groups = SMOOTH_GROUP_COLOR_COUNTERTOP + canSmoothWith = SMOOTH_GROUP_COLOR_COUNTERTOP + +/obj/structure/table/countertop/black + icon = 'icons/obj/smooth_structures/blacktop_table.dmi' + icon_state = "blacktop_table-0" + base_icon_state = "blacktop_table" + smoothing_groups = SMOOTH_GROUP_COLOR_COUNTERTOP + canSmoothWith = SMOOTH_GROUP_COLOR_COUNTERTOP + +/obj/structure/table/countertop/green + icon = 'icons/obj/smooth_structures/greentop_table.dmi' + icon_state = "greentop_table-0" + base_icon_state = "greentop_table" + smoothing_groups = SMOOTH_GROUP_COLOR_COUNTERTOP + canSmoothWith = SMOOTH_GROUP_COLOR_COUNTERTOP + +/obj/structure/table/countertop/purple + icon = 'icons/obj/smooth_structures/purpletop_table.dmi' + icon_state = "purpletop_table-0" + base_icon_state = "purpletop_table" + smoothing_groups = SMOOTH_GROUP_COLOR_COUNTERTOP + canSmoothWith = SMOOTH_GROUP_COLOR_COUNTERTOP + +/obj/structure/table/countertop/red + icon = 'icons/obj/smooth_structures/redtop_table.dmi' + icon_state = "redtop_table-0" + base_icon_state = "redtop_table" + smoothing_groups = SMOOTH_GROUP_COLOR_COUNTERTOP + canSmoothWith = SMOOTH_GROUP_COLOR_COUNTERTOP + +/obj/structure/table/countertop/teal + icon = 'icons/obj/smooth_structures/tealtop_table.dmi' + icon_state = "tealtop_table-0" + base_icon_state = "tealtop_table" + smoothing_groups = SMOOTH_GROUP_COLOR_COUNTERTOP + canSmoothWith = SMOOTH_GROUP_COLOR_COUNTERTOP + +/obj/structure/table/countertop/yellow + icon = 'icons/obj/smooth_structures/yellowtop_table.dmi' + icon_state = "yellowtop_table-0" + base_icon_state = "yellowtop_table" + smoothing_groups = SMOOTH_GROUP_COLOR_COUNTERTOP + canSmoothWith = SMOOTH_GROUP_COLOR_COUNTERTOP diff --git a/modular_darkpack/modules/decor/code/trash.dm b/modular_darkpack/modules/decor/code/trash.dm index 62180f391f91..75ce8f8a5d07 100644 --- a/modular_darkpack/modules/decor/code/trash.dm +++ b/modular_darkpack/modules/decor/code/trash.dm @@ -1,7 +1,7 @@ /obj/effect/decal/cleanable/trash name = "trash" - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/decor/icons/trash.dmi' icon_state = "trash1" clean_type = CLEAN_TYPE_HARD_DECAL @@ -11,7 +11,7 @@ /obj/effect/decal/cleanable/litter name = "litter" - icon = 'modular_darkpack/modules/deprecated/icons/tiles.dmi' + icon = 'modular_darkpack/modules/decor/icons/trash.dmi' icon_state = "paper1" clean_type = CLEAN_TYPE_HARD_DECAL @@ -21,7 +21,7 @@ /obj/effect/decal/cleanable/cardboard name = "cardboard" - icon = 'modular_darkpack/modules/deprecated/icons/tiles.dmi' + icon = 'modular_darkpack/modules/decor/icons/trash.dmi' icon_state = "cardboard1" clean_type = CLEAN_TYPE_HARD_DECAL diff --git a/modular_darkpack/modules/decor/code/vents.dm b/modular_darkpack/modules/decor/code/vents.dm index c3e11909c124..6405e5f69540 100644 --- a/modular_darkpack/modules/decor/code/vents.dm +++ b/modular_darkpack/modules/decor/code/vents.dm @@ -6,14 +6,14 @@ layer = ABOVE_ALL_MOB_LAYER anchored = TRUE density = TRUE + var/can_be_snowy = TRUE /obj/structure/roofstuff/Initialize(mapload) . = ..() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "[initial(icon_state)]-snow" + if(can_be_snowy && check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + icon_state = "[initial(icon_state)]-snow" /obj/structure/roofstuff/alt1 icon_state = "roof2" @@ -31,6 +31,7 @@ icon_state = "vent-0" base_icon_state = "vent" smoothing_groups = SMOOTH_GROUP_VENTS + can_be_snowy = FALSE /obj/structure/roofstuff/vent/south icon_state = "vent-3" diff --git a/modular_darkpack/modules/decor/icons/alleyway.dmi b/modular_darkpack/modules/decor/icons/alleyway.dmi new file mode 100644 index 000000000000..de627629cffc Binary files /dev/null and b/modular_darkpack/modules/decor/icons/alleyway.dmi differ diff --git a/modular_darkpack/modules/decor/icons/barrels.dmi b/modular_darkpack/modules/decor/icons/barrels.dmi new file mode 100644 index 000000000000..dded7dffd318 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/barrels.dmi differ diff --git a/modular_darkpack/modules/decor/icons/barriers.dmi b/modular_darkpack/modules/decor/icons/barriers.dmi new file mode 100644 index 000000000000..4a216215f048 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/barriers.dmi differ diff --git a/modular_darkpack/modules/decor/icons/bathroom.dmi b/modular_darkpack/modules/decor/icons/bathroom.dmi new file mode 100644 index 000000000000..31b86ff92dd2 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/bathroom.dmi differ diff --git a/modular_darkpack/modules/decor/icons/bench.dmi b/modular_darkpack/modules/decor/icons/bench.dmi new file mode 100644 index 000000000000..a287b2e8b846 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/bench.dmi differ diff --git a/modular_darkpack/modules/decor/icons/building_icons.dmi b/modular_darkpack/modules/decor/icons/building_icons.dmi new file mode 100644 index 000000000000..888cab551bf5 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/building_icons.dmi differ diff --git a/modular_darkpack/modules/decor/icons/bury_pit.dmi b/modular_darkpack/modules/decor/icons/bury_pit.dmi new file mode 100644 index 000000000000..961313554e67 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/bury_pit.dmi differ diff --git a/modular_darkpack/modules/decor/icons/cabaret.dmi b/modular_darkpack/modules/decor/icons/cabaret.dmi index 61eba0385e16..d238b7120e45 100644 Binary files a/modular_darkpack/modules/decor/icons/cabaret.dmi and b/modular_darkpack/modules/decor/icons/cabaret.dmi differ diff --git a/modular_darkpack/modules/decor/icons/chinatown.dmi b/modular_darkpack/modules/decor/icons/chinatown.dmi new file mode 100644 index 000000000000..6b6744f1baef Binary files /dev/null and b/modular_darkpack/modules/decor/icons/chinatown.dmi differ diff --git a/modular_darkpack/modules/decor/icons/city_map.dmi b/modular_darkpack/modules/decor/icons/city_map.dmi new file mode 100644 index 000000000000..3e5517a82e61 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/city_map.dmi differ diff --git a/modular_darkpack/modules/decor/icons/city_sign.dmi b/modular_darkpack/modules/decor/icons/city_sign.dmi index f3e8d52699e6..0fca3a80b062 100644 Binary files a/modular_darkpack/modules/decor/icons/city_sign.dmi and b/modular_darkpack/modules/decor/icons/city_sign.dmi differ diff --git a/modular_darkpack/modules/decor/icons/containers.dmi b/modular_darkpack/modules/decor/icons/containers.dmi new file mode 100644 index 000000000000..ee669afe5ed0 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/containers.dmi differ diff --git a/modular_darkpack/modules/decor/icons/decals.dmi b/modular_darkpack/modules/decor/icons/decals.dmi new file mode 100644 index 000000000000..392056f5aa1c Binary files /dev/null and b/modular_darkpack/modules/decor/icons/decals.dmi differ diff --git a/modular_darkpack/modules/decor/icons/fence.dmi b/modular_darkpack/modules/decor/icons/fence.dmi new file mode 100644 index 000000000000..b1ec24ff2bef Binary files /dev/null and b/modular_darkpack/modules/decor/icons/fence.dmi differ diff --git a/modular_darkpack/modules/decor/icons/flora.dmi b/modular_darkpack/modules/decor/icons/flora.dmi new file mode 100644 index 000000000000..1a9d10258be3 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/flora.dmi differ diff --git a/modular_darkpack/modules/decor/icons/flora32x48.dmi b/modular_darkpack/modules/decor/icons/flora32x48.dmi new file mode 100644 index 000000000000..912c2249974f Binary files /dev/null and b/modular_darkpack/modules/decor/icons/flora32x48.dmi differ diff --git a/modular_darkpack/modules/decor/icons/flora64x64.dmi b/modular_darkpack/modules/decor/icons/flora64x64.dmi new file mode 100644 index 000000000000..498f839e2ade Binary files /dev/null and b/modular_darkpack/modules/decor/icons/flora64x64.dmi differ diff --git a/modular_darkpack/modules/decor/icons/fountain.dmi b/modular_darkpack/modules/decor/icons/fountain.dmi new file mode 100644 index 000000000000..59088464e27c Binary files /dev/null and b/modular_darkpack/modules/decor/icons/fountain.dmi differ diff --git a/modular_darkpack/modules/decor/icons/hydrant.dmi b/modular_darkpack/modules/decor/icons/hydrant.dmi new file mode 100644 index 000000000000..2091e7380d25 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/hydrant.dmi differ diff --git a/modular_darkpack/modules/decor/icons/lamppost.dmi b/modular_darkpack/modules/decor/icons/lamppost.dmi index 0af54af14a30..5eb41ef2e719 100644 Binary files a/modular_darkpack/modules/decor/icons/lamppost.dmi and b/modular_darkpack/modules/decor/icons/lamppost.dmi differ diff --git a/modular_darkpack/modules/decor/icons/natural_turf_borders.dmi b/modular_darkpack/modules/decor/icons/natural_turf_borders.dmi new file mode 100644 index 000000000000..a45cfe472e95 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/natural_turf_borders.dmi differ diff --git a/modular_darkpack/modules/decor/icons/paintings.dmi b/modular_darkpack/modules/decor/icons/paintings.dmi new file mode 100644 index 000000000000..10c9334cc17c Binary files /dev/null and b/modular_darkpack/modules/decor/icons/paintings.dmi differ diff --git a/modular_darkpack/modules/decor/icons/pipes.dmi b/modular_darkpack/modules/decor/icons/pipes.dmi new file mode 100644 index 000000000000..f1ca0efa95e4 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/pipes.dmi differ diff --git a/modular_darkpack/modules/decor/icons/restaurant.dmi b/modular_darkpack/modules/decor/icons/restaurant.dmi new file mode 100644 index 000000000000..6803bf443b60 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/restaurant.dmi differ diff --git a/modular_darkpack/modules/decor/icons/road_signs.dmi b/modular_darkpack/modules/decor/icons/road_signs.dmi new file mode 100644 index 000000000000..66d92a20f2c6 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/road_signs.dmi differ diff --git a/modular_darkpack/modules/decor/icons/roofwall.dmi b/modular_darkpack/modules/decor/icons/roofwall.dmi new file mode 100644 index 000000000000..7b4d907d0d30 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/roofwall.dmi differ diff --git a/modular_darkpack/modules/decor/icons/showcase.dmi b/modular_darkpack/modules/decor/icons/showcase.dmi new file mode 100644 index 000000000000..7ff049f1585f Binary files /dev/null and b/modular_darkpack/modules/decor/icons/showcase.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/stonks.dmi b/modular_darkpack/modules/decor/icons/stonks.dmi similarity index 100% rename from modular_darkpack/modules/deprecated/icons/stonks.dmi rename to modular_darkpack/modules/decor/icons/stonks.dmi diff --git a/modular_darkpack/modules/decor/icons/store_sign.dmi b/modular_darkpack/modules/decor/icons/store_sign.dmi index 9415a361709b..050417a896ef 100644 Binary files a/modular_darkpack/modules/decor/icons/store_sign.dmi and b/modular_darkpack/modules/decor/icons/store_sign.dmi differ diff --git a/modular_darkpack/modules/decor/icons/television.dmi b/modular_darkpack/modules/decor/icons/television.dmi new file mode 100644 index 000000000000..5cfc37b2b5c7 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/television.dmi differ diff --git a/modular_darkpack/modules/decor/icons/trash.dmi b/modular_darkpack/modules/decor/icons/trash.dmi new file mode 100644 index 000000000000..9eaa281aadd5 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/trash.dmi differ diff --git a/modular_darkpack/modules/delivery/code/delivery_datums.dm b/modular_darkpack/modules/delivery/code/delivery_datums.dm index 439323d993c2..56dda93b7864 100644 --- a/modular_darkpack/modules/delivery/code/delivery_datums.dm +++ b/modular_darkpack/modules/delivery/code/delivery_datums.dm @@ -190,7 +190,7 @@ picked_dispenser.set_light(1) delivery_dispensers.Add(picked_dispenser) animate(picked_dispenser,alpha = 255,time = 5 SECONDS) - picked_dispenser.mouse_opacity = 1 + picked_dispenser.mouse_opacity = MOUSE_OPACITY_ICON return 1 /datum/delivery_datum/proc/assign_receivers(ammount) @@ -221,7 +221,7 @@ crate_number -= 1 animate(receiver,alpha = 255, time = 5 SECONDS) receiver.set_light(2) - receiver.mouse_opacity = 1 + receiver.mouse_opacity = MOUSE_OPACITY_ICON /datum/delivery_datum/proc/assign_garage() if(!delivery_employer_tag) return 0 diff --git a/modular_darkpack/modules/delivery/code/delivery_obj/delivery_map_defines.dm b/modular_darkpack/modules/delivery/code/delivery_obj/delivery_map_defines.dm index ee0f64d18436..55e188c5c39c 100644 --- a/modular_darkpack/modules/delivery/code/delivery_obj/delivery_map_defines.dm +++ b/modular_darkpack/modules/delivery/code/delivery_obj/delivery_map_defines.dm @@ -8,7 +8,7 @@ /obj/structure/delivery_board/oops_office name = "OOPS delivery assigment board" delivery_employer_tag = "oops" - desc = "The OOPS Delivery Service is said to be ran by the same forces that established and maintain the San Francisco nightly delivery market and the ones ultimately setting and surprisingly, diligently following their own rules per securing the surplus of each night's crate 'trade'. Contracts taken from this board will aid the OOPS service in maintaining the market for everyone involved, however this will also have the side effect of filling the coffers of the powers running the company for their unknown ends." + desc = "The OOPS Delivery Service is said to be ran by the same forces that established and maintain the " + CITY_NAME + " nightly delivery market and the ones ultimately setting and surprisingly, diligently following their own rules per securing the surplus of each night's crate 'trade'. Contracts taken from this board will aid the OOPS service in maintaining the market for everyone involved, however this will also have the side effect of filling the coffers of the powers running the company for their unknown ends." /area/vtm/interior/delivery/oops_office name = "OOPS delivery office" @@ -26,7 +26,7 @@ /obj/structure/vampdoor/glass/mt_office name = "Millenium Tower delivery garage" - lock_id = "millenium_delivery" + lock_id = LOCKACCESS_JAZZ_CLUB_DELIVERY lockpick_difficulty = 12 /obj/structure/delivery_board/mt_office @@ -68,7 +68,7 @@ /obj/structure/vampdoor/glass/bar_office name = "Bar delivery garage" - lock_id = "bar_delivery" + lock_id = LOCKACCESS_BAR_DELIVERY lockpick_difficulty = 12 /obj/structure/delivery_board/bar_office diff --git a/modular_darkpack/modules/delivery/code/delivery_objs.dm b/modular_darkpack/modules/delivery/code/delivery_objs.dm index 2143a5aa7934..dab1678b0674 100644 --- a/modular_darkpack/modules/delivery/code/delivery_objs.dm +++ b/modular_darkpack/modules/delivery/code/delivery_objs.dm @@ -239,7 +239,7 @@ "green" = 0, ) animate(src, alpha = 0, time = 5 SECONDS) - mouse_opacity = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT set_light(0) /obj/structure/delivery_receiver/proc/check_deliveries() @@ -249,7 +249,7 @@ /obj/structure/delivery_receiver/Initialize(mapload) . = ..() alpha = 0 - mouse_opacity = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT GLOB.delivery_available_receivers.Add(src) name = "[initial(name)] - [capitalize(chute_name)]" @@ -303,7 +303,7 @@ . = ..() GLOB.delivery_available_dispensers.Add(src) alpha = 0 - mouse_opacity = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT name = "[initial(name)] - [capitalize(chute_name)]]" /obj/structure/delivery_dispenser/Destroy() @@ -316,7 +316,7 @@ light_color = initial(light_color) set_light(0) animate(src,alpha = 0,5 SECONDS) - mouse_opacity = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/structure/delivery_dispenser/proc/dispense_cargo(obj/truck_key, turf/target_turf) if(!truck_key) return diff --git a/modular_darkpack/modules/deprecated/code/runtime_town_types.dm b/modular_darkpack/modules/deprecated/code/runtime_town_types.dm index 80905cba9c78..a8900d9b36a6 100644 --- a/modular_darkpack/modules/deprecated/code/runtime_town_types.dm +++ b/modular_darkpack/modules/deprecated/code/runtime_town_types.dm @@ -1,26 +1,4 @@ -// TODO: [Rebase] This file should not exist and is only so we can save runtime town - -/obj/item/arcane_tome - icon = 'icons/effects/mapping_helpers.dmi' - icon_state = "merge_conflict_marker" - -/obj/item/molotov - icon = 'icons/effects/mapping_helpers.dmi' - icon_state = "merge_conflict_marker" - -/obj/item/vampire_flamethrower - icon = 'icons/effects/mapping_helpers.dmi' - icon_state = "merge_conflict_marker" - -/obj/lombard - icon_state = "sell" - icon = 'modular_darkpack/modules/retail/icons/vendors_shops.dmi' -/obj/lombard/blackmarket - -/obj/machinery/atm - icon = 'modular_darkpack/modules/economy/icons/atm.dmi' - icon_state = "atm" - +// DARKPACK TODO - This file should not exist and is only so we can save runtime town /obj/machinery/computer/order_console/mining/restricted/police icon = 'icons/effects/mapping_helpers.dmi' icon_state = "merge_conflict_marker" @@ -29,11 +7,14 @@ icon_state = "merge_conflict_marker" /obj/vampire_computer + name = "old computer" + desc = "For some reason its just stuck on the lock screen and all the buttons dont seem to do anything... (We have yet to reimplement vampire computers! Sorry!)" icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' icon_state = "computer" + /obj/vampire_computer/prince icon_state = "computerprince" -/obj/item/vamp/phone/street - icon = 'modular_darkpack/modules/phones/icons/phone.dmi' - icon_state = "payphone" +/obj/vampire_computer/box + icon = 'icons/obj/machines/computer.dmi' + icon_state = "oldcomp" diff --git a/modular_darkpack/modules/deprecated/icons/32x48.dmi b/modular_darkpack/modules/deprecated/icons/32x48.dmi index fbe8fe5e5080..f29a6a2c7af1 100644 Binary files a/modular_darkpack/modules/deprecated/icons/32x48.dmi and b/modular_darkpack/modules/deprecated/icons/32x48.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/32x64.dmi b/modular_darkpack/modules/deprecated/icons/32x64.dmi index c34c4be67e9d..e45a25172d10 100644 Binary files a/modular_darkpack/modules/deprecated/icons/32x64.dmi and b/modular_darkpack/modules/deprecated/icons/32x64.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/48x32.dmi b/modular_darkpack/modules/deprecated/icons/48x32.dmi index 46e3b9ee5687..e56b3d176e4b 100644 Binary files a/modular_darkpack/modules/deprecated/icons/48x32.dmi and b/modular_darkpack/modules/deprecated/icons/48x32.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/48x48.dmi b/modular_darkpack/modules/deprecated/icons/48x48.dmi index a75753f72808..91e622fc89a1 100644 Binary files a/modular_darkpack/modules/deprecated/icons/48x48.dmi and b/modular_darkpack/modules/deprecated/icons/48x48.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/64x32.dmi b/modular_darkpack/modules/deprecated/icons/64x32.dmi index 1880084b377d..79288b15c309 100644 Binary files a/modular_darkpack/modules/deprecated/icons/64x32.dmi and b/modular_darkpack/modules/deprecated/icons/64x32.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/64x64.dmi b/modular_darkpack/modules/deprecated/icons/64x64.dmi index fcc002857f12..5e6f366dc3cc 100644 Binary files a/modular_darkpack/modules/deprecated/icons/64x64.dmi and b/modular_darkpack/modules/deprecated/icons/64x64.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/96x96megafauna.dmi b/modular_darkpack/modules/deprecated/icons/96x96megafauna.dmi new file mode 100644 index 000000000000..2dad81ed74b4 Binary files /dev/null and b/modular_darkpack/modules/deprecated/icons/96x96megafauna.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/UI/ui.dmi b/modular_darkpack/modules/deprecated/icons/UI/ui.dmi index e90460616008..c0bd3bdc866a 100644 Binary files a/modular_darkpack/modules/deprecated/icons/UI/ui.dmi and b/modular_darkpack/modules/deprecated/icons/UI/ui.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/UI/ui90x38.dmi b/modular_darkpack/modules/deprecated/icons/UI/ui90x38.dmi deleted file mode 100644 index dc452f982b72..000000000000 Binary files a/modular_darkpack/modules/deprecated/icons/UI/ui90x38.dmi and /dev/null differ diff --git a/modular_darkpack/modules/deprecated/icons/containers.dmi b/modular_darkpack/modules/deprecated/icons/containers.dmi deleted file mode 100644 index 799dc2b80d52..000000000000 Binary files a/modular_darkpack/modules/deprecated/icons/containers.dmi and /dev/null differ diff --git a/modular_darkpack/modules/deprecated/icons/disciplines.dmi b/modular_darkpack/modules/deprecated/icons/disciplines.dmi index b7cabeee46a4..d6907212bff8 100644 Binary files a/modular_darkpack/modules/deprecated/icons/disciplines.dmi and b/modular_darkpack/modules/deprecated/icons/disciplines.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/doors.dmi b/modular_darkpack/modules/deprecated/icons/doors.dmi index 68067baaf6f0..7c8b50960e7a 100644 Binary files a/modular_darkpack/modules/deprecated/icons/doors.dmi and b/modular_darkpack/modules/deprecated/icons/doors.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/effects/landmarks_static.dmi b/modular_darkpack/modules/deprecated/icons/effects/landmarks_static.dmi index 174d856d5fce..1dc35947ad47 100644 Binary files a/modular_darkpack/modules/deprecated/icons/effects/landmarks_static.dmi and b/modular_darkpack/modules/deprecated/icons/effects/landmarks_static.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/fog.dmi b/modular_darkpack/modules/deprecated/icons/fog.dmi deleted file mode 100644 index fe7f905964e4..000000000000 Binary files a/modular_darkpack/modules/deprecated/icons/fog.dmi and /dev/null differ diff --git a/modular_darkpack/modules/deprecated/icons/fountain.dmi b/modular_darkpack/modules/deprecated/icons/fountain.dmi deleted file mode 100644 index 06497148c13f..000000000000 Binary files a/modular_darkpack/modules/deprecated/icons/fountain.dmi and /dev/null differ diff --git a/modular_darkpack/modules/deprecated/icons/gate.dmi b/modular_darkpack/modules/deprecated/icons/gate.dmi deleted file mode 100644 index 92b0debce83e..000000000000 Binary files a/modular_darkpack/modules/deprecated/icons/gate.dmi and /dev/null differ diff --git a/modular_darkpack/modules/deprecated/icons/icons.dmi b/modular_darkpack/modules/deprecated/icons/icons.dmi index eb636f6ed8ab..3a354cb74f7d 100644 Binary files a/modular_darkpack/modules/deprecated/icons/icons.dmi and b/modular_darkpack/modules/deprecated/icons/icons.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/id_items.dmi b/modular_darkpack/modules/deprecated/icons/id_items.dmi deleted file mode 100644 index bb9ad3273942..000000000000 Binary files a/modular_darkpack/modules/deprecated/icons/id_items.dmi and /dev/null differ diff --git a/modular_darkpack/modules/deprecated/icons/id_onfloors.dmi b/modular_darkpack/modules/deprecated/icons/id_onfloors.dmi deleted file mode 100644 index 1625c84af29b..000000000000 Binary files a/modular_darkpack/modules/deprecated/icons/id_onfloors.dmi and /dev/null differ diff --git a/modular_darkpack/modules/deprecated/icons/items.dmi b/modular_darkpack/modules/deprecated/icons/items.dmi index 22374b4df89d..6211aa1f7d17 100644 Binary files a/modular_darkpack/modules/deprecated/icons/items.dmi and b/modular_darkpack/modules/deprecated/icons/items.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/lefthand.dmi b/modular_darkpack/modules/deprecated/icons/lefthand.dmi index e326ca5aa25c..9c33b096f198 100644 Binary files a/modular_darkpack/modules/deprecated/icons/lefthand.dmi and b/modular_darkpack/modules/deprecated/icons/lefthand.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/mobs.dmi b/modular_darkpack/modules/deprecated/icons/mobs.dmi index b55dbf5b8b27..dcfb14e01392 100644 Binary files a/modular_darkpack/modules/deprecated/icons/mobs.dmi and b/modular_darkpack/modules/deprecated/icons/mobs.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/onfloor.dmi b/modular_darkpack/modules/deprecated/icons/onfloor.dmi index 2cb6e580fa54..ca35715ff39c 100644 Binary files a/modular_darkpack/modules/deprecated/icons/onfloor.dmi and b/modular_darkpack/modules/deprecated/icons/onfloor.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/plants.dmi b/modular_darkpack/modules/deprecated/icons/plants.dmi deleted file mode 100644 index 75173057bc9d..000000000000 Binary files a/modular_darkpack/modules/deprecated/icons/plants.dmi and /dev/null differ diff --git a/modular_darkpack/modules/deprecated/icons/props.dmi b/modular_darkpack/modules/deprecated/icons/props.dmi index 4f7484df040e..990637ecb4d7 100644 Binary files a/modular_darkpack/modules/deprecated/icons/props.dmi and b/modular_darkpack/modules/deprecated/icons/props.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/righthand.dmi b/modular_darkpack/modules/deprecated/icons/righthand.dmi index 0c6324a18cdd..b90d65d356b0 100644 Binary files a/modular_darkpack/modules/deprecated/icons/righthand.dmi and b/modular_darkpack/modules/deprecated/icons/righthand.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/tiles.dmi b/modular_darkpack/modules/deprecated/icons/tiles.dmi deleted file mode 100644 index 55994c53bf3a..000000000000 Binary files a/modular_darkpack/modules/deprecated/icons/tiles.dmi and /dev/null differ diff --git a/modular_darkpack/modules/deprecated/icons/torpor.dmi b/modular_darkpack/modules/deprecated/icons/torpor.dmi new file mode 100644 index 000000000000..a7570da9cf44 Binary files /dev/null and b/modular_darkpack/modules/deprecated/icons/torpor.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/weed.dmi b/modular_darkpack/modules/deprecated/icons/weed.dmi deleted file mode 100644 index 16618764baa9..000000000000 Binary files a/modular_darkpack/modules/deprecated/icons/weed.dmi and /dev/null differ diff --git a/modular_darkpack/modules/deprecated/sounds/grief.ogg b/modular_darkpack/modules/deprecated/sounds/grief.ogg deleted file mode 100644 index 8262031e2cb0..000000000000 Binary files a/modular_darkpack/modules/deprecated/sounds/grief.ogg and /dev/null differ diff --git a/modular_darkpack/modules/deprecated/sounds/killscream.ogg b/modular_darkpack/modules/deprecated/sounds/killscream.ogg deleted file mode 100644 index f74cab655d87..000000000000 Binary files a/modular_darkpack/modules/deprecated/sounds/killscream.ogg and /dev/null differ diff --git a/modular_darkpack/modules/deprecated/sounds/prepare-thyself.ogg b/modular_darkpack/modules/deprecated/sounds/prepare_thyself.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/prepare-thyself.ogg rename to modular_darkpack/modules/deprecated/sounds/prepare_thyself.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/povorotnik.ogg b/modular_darkpack/modules/deprecated/sounds/ticking.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/povorotnik.ogg rename to modular_darkpack/modules/deprecated/sounds/ticking.ogg diff --git a/modular_darkpack/modules/doors/code/helpers/door_access.dm b/modular_darkpack/modules/doors/code/helpers/door_access.dm new file mode 100644 index 000000000000..f35c80f1c855 --- /dev/null +++ b/modular_darkpack/modules/doors/code/helpers/door_access.dm @@ -0,0 +1,197 @@ +/obj/effect/mapping_helpers/door/access + layer = DOOR_ACCESS_HELPER_LAYER + icon = 'modular_darkpack/modules/doors/icons/mapping_helpers.dmi' + icon_state = "access_helper" + var/lock_id + +/obj/effect/mapping_helpers/door/access/payload(obj/structure/vampdoor/payload) + payload.lock_id = lock_id + +/obj/effect/mapping_helpers/door/access/all + name = "all access" + desc = "Any keys can lock or unlock this door." + lock_id = LOCKACCESS_ALL + +/obj/effect/mapping_helpers/door/access/camarilla + icon_state = "access_helper_cam" + lock_id = LOCKACCESS_CAMARILLA + +/obj/effect/mapping_helpers/door/access/prince + icon_state = "access_helper_cam" + lock_id = LOCKACCESS_PRINCE + +/obj/effect/mapping_helpers/door/access/primogen + icon_state = "access_helper_cam" + lock_id = LOCKACCESS_PRIMOGEN + + +/obj/effect/mapping_helpers/door/access/banu + icon_state = "access_helper_cam" + lock_id = LOCKACCESS_BANU + +/obj/effect/mapping_helpers/door/access/strip + icon_state = "access_helper_cam" + lock_id = LOCKACCESS_STRIP + +/obj/effect/mapping_helpers/door/access/chantry + icon_state = "access_helper_cam" + lock_id = LOCKACCESS_CHANTRY + +/obj/effect/mapping_helpers/door/access/clerk + icon_state = "access_helper_cam" + lock_id = LOCKACCESS_CLERK + + +/obj/effect/mapping_helpers/door/access/bankboss + lock_id = LOCKACCESS_BANKBOSS + +/obj/effect/mapping_helpers/door/access/bank + lock_id = LOCKACCESS_BANK + + +/obj/effect/mapping_helpers/door/access/theatre + lock_id = LOCKACCESS_THEATRE + +/obj/effect/mapping_helpers/door/access/jazz_club + lock_id = LOCKACCESS_JAZZ_CLUB + +/obj/effect/mapping_helpers/door/access/jazz_club_delivery + lock_id = LOCKACCESS_JAZZ_CLUB_DELIVERY + + +/obj/effect/mapping_helpers/door/access/director + lock_id = LOCKACCESS_DIRECTOR + +/obj/effect/mapping_helpers/door/access/clinic + lock_id = LOCKACCESS_CLINIC + + +/obj/effect/mapping_helpers/door/access/primogen_ventrue + lock_id = LOCKACCESS_PRIMOGEN_VENTRUE + +/obj/effect/mapping_helpers/door/access/ventrue + lock_id = LOCKACCESS_VENTRUE + + +/obj/effect/mapping_helpers/door/access/primogen_toreador + lock_id = LOCKACCESS_PRIMOGEN_TOREADOR + +/obj/effect/mapping_helpers/door/access/toreador + lock_id = LOCKACCESS_TOREADOR + + +/obj/effect/mapping_helpers/door/access/primogen_malkavian + lock_id = LOCKACCESS_MALK_PRIMOGEN + +/obj/effect/mapping_helpers/door/access/malkavian + lock_id = LOCKACCESS_MALK + + +/obj/effect/mapping_helpers/door/access/primogen_brujah + lock_id = LOCKACCESS_PRIMOGEN_BRUJAH + +/obj/effect/mapping_helpers/door/access/brujah + lock_id = LOCKACCESS_BRUJAH + + +/obj/effect/mapping_helpers/door/access/primogen_nosferatu + lock_id = LOCKACCESS_PRIMOGEN_NOSFERATU + +/obj/effect/mapping_helpers/door/access/nosferatu + lock_id = LOCKACCESS_NOSFERATU + + +/obj/effect/mapping_helpers/door/access/giovanni + lock_id = LOCKACCESS_GIOVANNI + +/obj/effect/mapping_helpers/door/access/daughters + lock_id = LOCKACCESS_DAUGHTERS + +/obj/effect/mapping_helpers/door/access/cappadocian + lock_id = LOCKACCESS_CAPPADOCIAN + +/obj/effect/mapping_helpers/door/access/salubri + lock_id = LOCKACCESS_SALUBRI + +/obj/effect/mapping_helpers/door/access/old_clan_tzimisce + lock_id = LOCKACCESS_OLD_CLAN_TZI + +/obj/effect/mapping_helpers/door/access/baali + lock_id = LOCKACCESS_BAALI + +/obj/effect/mapping_helpers/door/access/lasombra + lock_id = LOCKACCESS_LASOMBRA + +/obj/effect/mapping_helpers/door/access/sabbat + lock_id = LOCKACCESS_SABBAT + + +/obj/effect/mapping_helpers/door/access/anarch + icon_state = "access_helper_bar" + lock_id = LOCKACCESS_ANARCH + +/obj/effect/mapping_helpers/door/access/bar + icon_state = "access_helper_bar" + lock_id = LOCKACCESS_BAR + +/obj/effect/mapping_helpers/door/access/bar_delivery + icon_state = "access_helper_bar" + lock_id = LOCKACCESS_BAR_DELIVERY + + +/obj/effect/mapping_helpers/door/access/supply + lock_id = LOCKACCESS_SUPPLY + +/obj/effect/mapping_helpers/door/access/graveyard + lock_id = LOCKACCESS_GRAVEYARD + +/obj/effect/mapping_helpers/door/access/church + lock_id = LOCKACCESS_CHURCH + +/obj/effect/mapping_helpers/door/access/taxi + lock_id = LOCKACCESS_TAXI + + +/obj/effect/mapping_helpers/door/access/triad + lock_id = LOCKACCESS_TRAID + +/obj/effect/mapping_helpers/door/access/cleaning + lock_id = LOCKACCESS_CLEANING + +/obj/effect/mapping_helpers/door/access/laundromat + lock_id = LOCKACCESS_LAUNDROMAT + + +/obj/effect/mapping_helpers/door/access/police + lock_id = LOCKACCESS_POLICE + +/obj/effect/mapping_helpers/door/access/dispatch + lock_id = LOCKACCESS_DISPATCH + +/obj/effect/mapping_helpers/door/access/police_secure + lock_id = LOCKACCESS_POLICE_SECURE + +/obj/effect/mapping_helpers/door/access/police_chief + lock_id = LOCKACCESS_POLICE_CHIEF + + +/obj/effect/mapping_helpers/door/access/wolftech + lock_id = LOCKACCESS_WOLFTECH + +/obj/effect/mapping_helpers/door/access/park_ranger + lock_id = LOCKACCESS_PARK_RANGER + +/obj/effect/mapping_helpers/door/access/coggie + lock_id = LOCKACCESS_COGGIE + +/obj/effect/mapping_helpers/door/access/pentex + lock_id = LOCKACCESS_PENTEX + +/obj/effect/mapping_helpers/door/access/pentex_leader + lock_id = LOCKACCESS_PENTEX_LEADER + +/obj/effect/mapping_helpers/door/access/npc + icon_state = "access_helper_rand" + +/obj/effect/mapping_helpers/door/access/npc/payload(obj/structure/vampdoor/payload) + payload.lock_id = "npc[rand(1, 20)]" diff --git a/modular_darkpack/modules/doors/code/helpers/door_helpers.dm b/modular_darkpack/modules/doors/code/helpers/door_helpers.dm new file mode 100644 index 000000000000..9bc73dbb6cff --- /dev/null +++ b/modular_darkpack/modules/doors/code/helpers/door_helpers.dm @@ -0,0 +1,110 @@ +//door helpers +/obj/effect/mapping_helpers/door + abstract_type = /obj/effect/mapping_helpers/door + layer = DOOR_HELPER_LAYER + late = TRUE + +/obj/effect/mapping_helpers/door/Initialize(mapload) + . = ..() + if(!mapload) + log_mapping("[src] spawned outside of mapload!") + return + + var/obj/structure/vampdoor/door = locate(/obj/structure/vampdoor) in loc + if(!door) + log_mapping("[src] failed to find a door at [AREACOORD(src)]") + return + + payload(door) + +/obj/effect/mapping_helpers/door/LateInitialize() + var/obj/structure/vampdoor/door = locate(/obj/structure/vampdoor) in loc + if(!door) + qdel(src) + return + + late_payload(door) + qdel(src) + +/obj/effect/mapping_helpers/door/proc/payload(obj/structure/vampdoor/payload) + return + +/obj/effect/mapping_helpers/door/proc/late_payload(obj/structure/vampdoor/payload) + return + +/obj/effect/mapping_helpers/door/autoname + name = "door autoname helper" + icon_state = "airlock_autoname" + +/obj/effect/mapping_helpers/door/autoname/late_payload(obj/structure/vampdoor/payload) + . = ..() + payload.name = get_area_name(src, TRUE) + +/obj/effect/mapping_helpers/door/lock + icon_state = "start_locked" + icon = 'modular_darkpack/modules/doors/icons/mapping_helpers.dmi' + +/obj/effect/mapping_helpers/door/lock/payload(obj/structure/vampdoor/payload) + payload.locked = TRUE + +/obj/effect/mapping_helpers/door/unlock + icon_state = "start_unlocked" + icon = 'modular_darkpack/modules/doors/icons/mapping_helpers.dmi' + +/obj/effect/mapping_helpers/door/unlock/payload(obj/structure/vampdoor/payload) + payload.locked = FALSE + +/obj/effect/mapping_helpers/door/toggle_lock + icon_state = "toggle_locked" + icon = 'modular_darkpack/modules/doors/icons/mapping_helpers.dmi' + +/obj/effect/mapping_helpers/door/toggle_lock/payload(obj/structure/vampdoor/payload) + payload.locked = !payload.locked + + +/obj/effect/mapping_helpers/door/lock_difficulty + icon_state = "locklevel_easy" + icon = 'modular_darkpack/modules/doors/icons/mapping_helpers.dmi' + var/lock_difficulty + +/obj/effect/mapping_helpers/door/lock_difficulty/payload(obj/structure/vampdoor/payload) + payload.lockpick_difficulty = lock_difficulty + +/obj/effect/mapping_helpers/door/lock_difficulty/one + icon_state = "locklevel_trivial" + lock_difficulty = 1 + +/obj/effect/mapping_helpers/door/lock_difficulty/two + icon_state = "locklevel_trivial" + lock_difficulty = 2 + +/obj/effect/mapping_helpers/door/lock_difficulty/three + icon_state = "locklevel_trivial" + lock_difficulty = 3 + +/obj/effect/mapping_helpers/door/lock_difficulty/four + icon_state = "locklevel_trivial" + lock_difficulty = 4 + +/obj/effect/mapping_helpers/door/lock_difficulty/five + icon_state = "locklevel_trivial" + lock_difficulty = 5 + +/obj/effect/mapping_helpers/door/lock_difficulty/six + lock_difficulty = 6 + +/obj/effect/mapping_helpers/door/lock_difficulty/seven + icon_state = "locklevel_medium" + lock_difficulty = 7 + +/obj/effect/mapping_helpers/door/lock_difficulty/eight + icon_state = "locklevel_hard" + lock_difficulty = 8 + +/obj/effect/mapping_helpers/door/lock_difficulty/nine + icon_state = "locklevel_harder" + lock_difficulty = 9 + +/obj/effect/mapping_helpers/door/lock_difficulty/ten + icon_state = "locklevel_hardest" + lock_difficulty = 10 diff --git a/modular_darkpack/modules/doors/code/keys/keys.dm b/modular_darkpack/modules/doors/code/keys/keys.dm index 9c783869a39a..b8b33e824d8c 100644 --- a/modular_darkpack/modules/doors/code/keys/keys.dm +++ b/modular_darkpack/modules/doors/code/keys/keys.dm @@ -1,8 +1,9 @@ /obj/item/vamp/keys - name = "\improper keys" + name = "keys" desc = "Those can open some doors." icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' icon_state = "keys" + gender = PLURAL item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_TINY armor_type = /datum/armor/keys @@ -21,154 +22,194 @@ //===========================VAMPIRE KEYS=========================== /obj/item/vamp/keys/camarilla name = "\improper Camarilla keys" - accesslocks = list("camarilla") + accesslocks = list(LOCKACCESS_CAMARILLA) color = "#bd3327" /obj/item/vamp/keys/prince name = "prince's keys" accesslocks = list( - "camarilla", - "prince", - "clerk", - "chantry", - "theatre", - "milleniumCommon", - "primogen", - "millenium_delivery", + LOCKACCESS_CAMARILLA, + LOCKACCESS_PRINCE, + LOCKACCESS_CLERK, + LOCKACCESS_CHANTRY, + LOCKACCESS_THEATRE, + LOCKACCESS_JAZZ_CLUB, + LOCKACCESS_PRIMOGEN, + LOCKACCESS_JAZZ_CLUB_DELIVERY, ) color = "#bd3327" - /obj/item/vamp/keys/sheriff name = "sheriff's keys" accesslocks = list( - "camarilla", - "prince", - "theatre", - "milleniumCommon", - "primogen", - "clerk", - "millenium_delivery", + LOCKACCESS_CAMARILLA, + LOCKACCESS_PRINCE, + LOCKACCESS_THEATRE, + LOCKACCESS_JAZZ_CLUB, + LOCKACCESS_PRIMOGEN, + LOCKACCESS_CLERK, + LOCKACCESS_JAZZ_CLUB_DELIVERY, ) color = "#bd3327" /obj/item/vamp/keys/clerk name = "clerk's keys" accesslocks = list( - "camarilla", - "clerk", - "theatre", - "milleniumCommon", - "primogen", - "millenium_delivery", + LOCKACCESS_CAMARILLA, + LOCKACCESS_CLERK, + LOCKACCESS_THEATRE, + LOCKACCESS_JAZZ_CLUB, + LOCKACCESS_PRIMOGEN, + LOCKACCESS_JAZZ_CLUB_DELIVERY, ) color = "#bd3327" /obj/item/vamp/keys/camarilla name = "\improper Millenium Tower keys" accesslocks = list( - "milleniumCommon", - "clerk", - "camarilla", - "millenium_delivery", + LOCKACCESS_JAZZ_CLUB, + LOCKACCESS_CLERK, + LOCKACCESS_CAMARILLA, + LOCKACCESS_JAZZ_CLUB_DELIVERY, ) + color = "#bd3327" + +/obj/item/vamp/keys/camarilla/ghoul + name = "\improper Millenium Tower Employee keys" + accesslocks = list( + LOCKACCESS_JAZZ_CLUB, + LOCKACCESS_CLERK, + LOCKACCESS_CAMARILLA + ) + color = "#bd3327" /obj/item/vamp/keys/archive name = "archive keys" accesslocks = list( - "chantry" + LOCKACCESS_CHANTRY ) /obj/item/vamp/keys/regent name = "very archival keys" accesslocks = list( - "chantry", - "milleniumCommon", - "primogen", - "camarilla", - "millenium_delivery", + LOCKACCESS_CHANTRY, + LOCKACCESS_JAZZ_CLUB, + LOCKACCESS_PRIMOGEN, + LOCKACCESS_CAMARILLA, + LOCKACCESS_JAZZ_CLUB_DELIVERY, ) /obj/item/vamp/keys/anarch name = "anarch keys" accesslocks = list( - "anarch", - "bar_delivery", + LOCKACCESS_BAR, + LOCKACCESS_ANARCH, + LOCKACCESS_BAR_DELIVERY, ) color = "#434343" /obj/item/vamp/keys/bar name = "barkeeper keys" accesslocks = list( - "bar", - "anarch", - "bar_delivery", + LOCKACCESS_BAR, + LOCKACCESS_ANARCH, + LOCKACCESS_BAR_DELIVERY, + ) + color = "#434343" + +/obj/item/vamp/keys/anarch_limited + name = "barkeeper keys" + accesslocks = list( + LOCKACCESS_BAR ) color = "#434343" /obj/item/vamp/keys/giovanni name = "mafia keys" accesslocks = list( - "giovanni", - "bianchiBank" + LOCKACCESS_GIOVANNI, + LOCKACCESS_BANK ) /obj/item/vamp/keys/capo name = "capo keys" accesslocks = list( - "bankboss", - "bianchiBank", - "giovanni" + LOCKACCESS_BANKBOSS, + LOCKACCESS_BANK, + LOCKACCESS_GIOVANNI ) /obj/item/vamp/keys/baali name = "satanic keys" accesslocks = list( - "baali" + LOCKACCESS_BAALI + ) + +/obj/item/vamp/keys/lasombra + name = "dark keys" + accesslocks = list( + LOCKACCESS_LASOMBRA, + LOCKACCESS_KYASID, + LOCKACCESS_CHURCH + ) + color = "#290355" + +/obj/item/vamp/keys/lasombra/primogen + name = "really dark keys" + accesslocks = list( + LOCKACCESS_LASOMBRA, + LOCKACCESS_KYASID, + LOCKACCESS_CHURCH, + LOCKACCESS_PRIMOGEN, + LOCKACCESS_PRIMOGEN_LASOMBRA, + LOCKACCESS_JAZZ_CLUB, + LOCKACCESS_THEATRE, + LOCKACCESS_CAMARILLA ) + color = "#4b039c" /obj/item/vamp/keys/daughters name = "eclectic keys" accesslocks = list( - "daughters" + LOCKACCESS_DAUGHTERS ) /obj/item/vamp/keys/salubri name = "conspiracy keys" accesslocks = list( - "salubri" + LOCKACCESS_SALUBRI ) /obj/item/vamp/keys/old_clan_tzimisce name = "regal keys" accesslocks = list( - "old_clan_tzimisce" + LOCKACCESS_OLD_CLAN_TZI ) /obj/item/vamp/keys/malkav name = "insane keys" accesslocks = list( - "malkav" + LOCKACCESS_MALK ) color = "#8cc4ff" /obj/item/vamp/keys/malkav/primogen name = "really insane keys" accesslocks = list( - "primMalkav", - "malkav", - "primogen", - "milleniumCommon", - "camarilla", - "millenium_delivery", + LOCKACCESS_MALK_PRIMOGEN, + LOCKACCESS_MALK, + LOCKACCESS_PRIMOGEN, + LOCKACCESS_JAZZ_CLUB, + LOCKACCESS_CAMARILLA, + LOCKACCESS_JAZZ_CLUB_DELIVERY, ) color = "#2c92ff" /obj/item/vamp/keys/toreador name = "sexy keys" accesslocks = list( - "toreador", + LOCKACCESS_TOREADOR, "toreador1", "toreador2", "toreador3", @@ -179,157 +220,171 @@ /obj/item/vamp/keys/banuhaqim name = "just keys" accesslocks = list( - "banuhaqim" + LOCKACCESS_BANU ) color = "#06053d" /obj/item/vamp/keys/toreador/primogen name = "really sexy keys" accesslocks = list( - "primToreador", - "toreador", - "primogen", - "milleniumCommon", - "camarilla", - "millenium_delivery", + LOCKACCESS_PRIMOGEN_TOREADOR, + LOCKACCESS_TOREADOR, + LOCKACCESS_PRIMOGEN, + LOCKACCESS_JAZZ_CLUB, + LOCKACCESS_CAMARILLA, + LOCKACCESS_JAZZ_CLUB_DELIVERY, ) color = "#ff2fc4" /obj/item/vamp/keys/nosferatu name = "ugly keys" accesslocks = list( - "nosferatu" + LOCKACCESS_NOSFERATU ) color = "#93bc8e" /obj/item/vamp/keys/nosferatu/primogen name = "really ugly keys" accesslocks = list( - "primNosferatu", - "nosferatu", - "primogen", - "milleniumCommon", - "camarilla", - "millenium_delivery", + LOCKACCESS_PRIMOGEN_NOSFERATU, + LOCKACCESS_NOSFERATU, + LOCKACCESS_PRIMOGEN, + LOCKACCESS_JAZZ_CLUB, + LOCKACCESS_CAMARILLA, + LOCKACCESS_JAZZ_CLUB_DELIVERY, ) color = "#367c31" /obj/item/vamp/keys/brujah name = "punk keys" accesslocks = list( - "brujah" + LOCKACCESS_BRUJAH ) color = "#ecb586" /obj/item/vamp/keys/brujah/primogen name = "really punk keys" accesslocks = list( - "primBrujah", - "brujah", - "primogen", - "milleniumCommon", - "camarilla" + LOCKACCESS_PRIMOGEN_BRUJAH, + LOCKACCESS_BRUJAH, + LOCKACCESS_PRIMOGEN, + LOCKACCESS_JAZZ_CLUB, + LOCKACCESS_CAMARILLA ) color = "#ec8f3e" /obj/item/vamp/keys/ventrue name = "businessy keys" accesslocks = list( - "ventrue", - "milleniumCommon" + LOCKACCESS_VENTRUE, + LOCKACCESS_JAZZ_CLUB ) color = "#f6ffa7" /obj/item/vamp/keys/ventrue/primogen name = "really businessy keys" accesslocks = list( - "primVentrue", - "ventrue", - "milleniumCommon", - "primogen", - "camarilla", - "millenium_delivery", + LOCKACCESS_PRIMOGEN_VENTRUE, + LOCKACCESS_VENTRUE, + LOCKACCESS_JAZZ_CLUB, + LOCKACCESS_PRIMOGEN, + LOCKACCESS_CAMARILLA, + LOCKACCESS_JAZZ_CLUB_DELIVERY, ) color = "#e8ff29" +/obj/item/vamp/keys/cappadocian + name = "eroded keys" + accesslocks = list( + LOCKACCESS_CAPPADOCIAN + ) + color = "#99620e" + +/obj/item/vamp/keys/sabbat + name = "dirty keys" + accesslocks = list( + LOCKACCESS_SABBAT + ) + color = "#6a2e1d" + //===========================CLINIC KEYS=========================== /obj/item/vamp/keys/clinic name = "clinic keys" accesslocks = list( - "clinic" + LOCKACCESS_CLINIC ) /obj/item/vamp/keys/clinics_director name = "clinic director keys" accesslocks = list( - "clinic", - "director" + LOCKACCESS_CLINIC, + LOCKACCESS_DIRECTOR ) //===========================POLICE KEYS=========================== /obj/item/vamp/keys/police name = "police keys" accesslocks = list( - "police" + LOCKACCESS_POLICE ) /obj/item/vamp/keys/dispatch name = "dispatcher keys" accesslocks = list( - "dispatch" + LOCKACCESS_DISPATCH ) /obj/item/vamp/keys/police/secure name = "sergeant police keys" accesslocks = list( - "police", - "police_secure" + LOCKACCESS_POLICE, + LOCKACCESS_POLICE_SECURE ) /obj/item/vamp/keys/police/secure/chief name = "\improper Chief of Police keys" accesslocks = list( - "dispatch", - "police", - "police_secure", - "police_chief" + LOCKACCESS_DISPATCH, + LOCKACCESS_POLICE, + LOCKACCESS_POLICE_SECURE, + LOCKACCESS_POLICE_CHIEF ) //===========================GAROU KEYS=========================== /obj/item/vamp/keys/nps - name = "Park Service keys" + name = "\improper Park Service keys" accesslocks = list( - "nps" + LOCKACCESS_PARK_RANGER ) color = "#1e7531" /obj/item/vamp/keys/techstore - name = "Tech Store keys" + name = "tech store keys" accesslocks = list( - "wolftech" + LOCKACCESS_WOLFTECH ) color = "#466a72" /obj/item/vamp/keys/pentex - name = "Endron Facility keys" + name = "\improper " + MAIN_EVIL_COMPANY + " facility keys" accesslocks = list( - "pentex" + LOCKACCESS_PENTEX ) color = "#062e03" /obj/item/vamp/keys/pentex/leader - name = "Endron Management keys" + name = "\improper " + MAIN_EVIL_COMPANY + " management keys" accesslocks = list( - "pentex", - "pentexleader" + LOCKACCESS_PENTEX, + LOCKACCESS_PENTEX_LEADER ) color = "#062e03" /obj/item/vamp/keys/children_of_gaia - name = "Food Pantry keys" + name = "food pantry keys" accesslocks = list( - "coggie" + LOCKACCESS_COGGIE ) color = "#339933" @@ -338,44 +393,51 @@ /obj/item/vamp/keys/triads name = "rusty keys" accesslocks = list( - "triad", - "laundromat" + LOCKACCESS_TRAID, + LOCKACCESS_LAUNDROMAT ) /obj/item/vamp/keys/graveyard name = "graveyard keys" accesslocks = list( - "graveyard" + LOCKACCESS_GRAVEYARD ) /obj/item/vamp/keys/cleaning name = "cleaning keys" accesslocks = list( - "cleaning" + LOCKACCESS_CLEANING ) /obj/item/vamp/keys/church name = "church keys" accesslocks = list( - "church" + LOCKACCESS_CHURCH ) /obj/item/vamp/keys/supply name = "supply keys" accesslocks = list( - "supply" + LOCKACCESS_SUPPLY ) color = "#434343" /obj/item/vamp/keys/strip name = "strip keys" accesslocks = list( - "strip" + LOCKACCESS_STRIP ) /obj/item/vamp/keys/taxi name = "taxi keys" accesslocks = list( - "taxi" + LOCKACCESS_TAXI ) color = "#fffb8b" + +/obj/item/vamp/keys/apartment + name = "apartment keys" + desc = "The key to someone's home. Hope it's not lost." + accesslocks = list( + "apartment" + ) diff --git a/modular_darkpack/modules/doors/code/shutters.dm b/modular_darkpack/modules/doors/code/shutters.dm new file mode 100644 index 000000000000..191cef57fbc3 --- /dev/null +++ b/modular_darkpack/modules/doors/code/shutters.dm @@ -0,0 +1,9 @@ +/obj/machinery/door/poddoor/shutters/armory + name = "armory shutters" + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + id = 10 + +/obj/machinery/door/poddoor/shutters/bankvault + name = "vault shutters" + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + id = 11 diff --git a/modular_darkpack/modules/doors/code/vampdoor.dm b/modular_darkpack/modules/doors/code/vampdoor.dm index 315c0076e8fc..dfc51d2aa88f 100644 --- a/modular_darkpack/modules/doors/code/vampdoor.dm +++ b/modular_darkpack/modules/doors/code/vampdoor.dm @@ -5,13 +5,13 @@ icon = 'modular_darkpack/modules/deprecated/icons/doors.dmi' icon_state = "door-1" base_icon_state = "door" - plane = GAME_PLANE - layer = ABOVE_ALL_MOB_LAYER + layer = MAP_SWITCH(CLOSED_DOOR_LAYER, OPEN_DOOR_LAYER) pixel_w = -16 anchored = TRUE density = TRUE opacity = TRUE + flags_1 = IGNORE_TURF_PIXEL_OFFSET_1 pass_flags_self = PASSDOORS max_integrity = 350 @@ -23,16 +23,20 @@ var/closed = TRUE var/locked = FALSE var/door_broken = FALSE - var/door_layer = ABOVE_ALL_MOB_LAYER + var/door_layer = CLOSED_DOOR_LAYER var/lock_id = null - var/glass = FALSE var/lockpick_timer = LOCKTIMER_1 - var/lockpick_difficulty = LOCKDIFFICULTY_1 + var/lockpick_difficulty = 6 - var/open_sound = 'modular_darkpack/modules/deprecated/sounds/door_open.ogg' - var/close_sound = 'modular_darkpack/modules/deprecated/sounds/door_close.ogg' - var/lock_sound = 'modular_darkpack/modules/deprecated/sounds/door_locked.ogg' + var/open_sound = 'modular_darkpack/modules/doors/sounds/door_open.ogg' + var/close_sound = 'modular_darkpack/modules/doors/sounds/door_close.ogg' + var/lock_sound = 'modular_darkpack/modules/doors/sounds/door_locked.ogg' var/burnable = FALSE + /// Whether to grant an apartment_key + var/grant_apartment_key = FALSE + var/apartment_key_amount = 1 + /// The type of a key the resident will get + var/apartment_key_type /obj/structure/vampdoor/Initialize(mapload) . = ..() @@ -56,6 +60,10 @@ if(-INFINITY to LOCKDIFFICULTY_2) //LOCKDIFFICULTY_1 is basically the minimum so we can just do LOCKTIMER_1 from -INFINITY lockpick_timer = LOCKTIMER_1 +/obj/structure/vampdoor/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + return !density || !locked + +// DARKPACK TODO - examinetext on these doors /* Examine text will need to be reworked but im not sure on the probailites for rolls considering botches as well. /obj/structure/vampdoor/examine(mob/user) . = ..() @@ -123,7 +131,7 @@ fix_door() /obj/structure/vampdoor/proc/break_door(mob/user) - playsound(get_turf(src), 'modular_darkpack/modules/doors/sounds/get_bent.ogg', 100, FALSE) + playsound(get_turf(src), 'modular_darkpack/master_files/sounds/effects/door/get_bent.ogg', 100, FALSE) var/obj/item/shield/door/broken_door = new(get_turf(src)) broken_door.icon_state = base_icon_state if(user) @@ -133,7 +141,7 @@ desc = "An empty door frame. Someone removed the door by force. A special door repair kit should be able to fix this." door_broken = TRUE set_density(FALSE) - opacity = 0 + set_opacity(FALSE) layer = OPEN_DOOR_LAYER closed = FALSE locked = FALSE @@ -145,8 +153,8 @@ desc = initial(desc) door_broken = FALSE set_density(TRUE) - if(!glass) - opacity = 1 + if(initial(opacity)) + set_opacity(TRUE) layer = ABOVE_ALL_MOB_LAYER closed = TRUE locked = FALSE @@ -179,7 +187,7 @@ playsound(src, close_sound, 75, TRUE) icon_state = "[base_icon_state]-1" set_density(TRUE) - if(!glass) + if(initial(opacity)) set_opacity(TRUE) layer = ABOVE_ALL_MOB_LAYER to_chat(user, span_notice("You close [src].")) @@ -190,6 +198,8 @@ . = ..() if(.) return + if(try_award_apartment_key(user)) + return var/mob/living/living_user = user if(door_broken) to_chat(user, span_warning("There is no door to use here.")) @@ -198,13 +208,17 @@ if(ishuman(user)) var/mob/living/carbon/human/human_user = user if(human_user.st_get_stat(STAT_STRENGTH) > 5) - if((human_user.st_get_stat(STAT_STRENGTH) * 2) >= lockpick_difficulty) - proc_unlock(50) - break_door(human_user) + if((human_user.st_get_stat(STAT_STRENGTH)) >= lockpick_difficulty) + to_chat(human_user, span_danger("You wind up a big punch to break down the door...")) + if(do_after(human_user, 3 SECONDS, src)) + proc_unlock(50) + break_door(human_user) + else + to_chat(human_user, span_danger("You must be standing next to the door to break it down.")) else pixel_z = pixel_z+rand(-1, 1) pixel_w = pixel_w+rand(-1, 1) - playsound(get_turf(src), 'modular_darkpack/modules/doors/sounds/get_bent.ogg', 50, TRUE) + playsound(get_turf(src), 'modular_darkpack/master_files/sounds/effects/door/get_bent.ogg', 50, TRUE) proc_unlock(5) to_chat(user, span_warning("You aren't strong enough to break it down!")) addtimer(CALLBACK(src, PROC_REF(reset_transform)), 2) @@ -214,6 +228,8 @@ playsound(src, 'modular_darkpack/modules/doors/sounds/knock.ogg', 75, TRUE) addtimer(CALLBACK(src, PROC_REF(reset_transform)), 2) else + if(try_award_apartment_key(user)) + return if(locked) playsound(src, lock_sound, 75, TRUE) to_chat(user, span_warning("[src] is locked!")) @@ -242,6 +258,10 @@ if(try_keys(user, found_key)) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(lock_id == LOCKACCESS_ALL) + if(try_keys(user, need_key = FALSE)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!has_keys) to_chat(user, span_warning("You need a key to lock/unlock this door!")) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -272,10 +292,13 @@ if(door_broken) to_chat(user, span_warning("There is no door to pick here.")) return + if(user.st_get_stat(STAT_LARCENY) <= 0) + to_chat(user, span_warning("How do I do this...?")) + return if(locked) proc_unlock(5) playsound(src, 'modular_darkpack/modules/doors/sounds/hack.ogg', 100, TRUE) - for(var/mob/living/carbon/human/npc/police/P in oviewers(7, src)) + for(var/mob/living/carbon/human/npc/police/P in oviewers(DEFAULT_SIGHT_DISTANCE, src)) P.Aggro(user) var/total_lockpicking = user.st_get_stat(STAT_LARCENY) if(do_after(user, lockpick_timer, src, interaction_key = DOAFTER_SOURCE_DOOR)) @@ -302,13 +325,17 @@ playsound(src, 'modular_darkpack/modules/doors/sounds/hack.ogg', 100, TRUE) return TRUE -/obj/structure/vampdoor/proc/try_keys(mob/living/user, obj/item/vamp/keys/key_used) +/obj/structure/vampdoor/proc/try_keys(mob/living/user, obj/item/vamp/keys/key_used, need_key = TRUE) /* if(key_used != user.get_active_hand()) if(!do_after(human_user, 0.5 SECONDS, src, interaction_key = DOAFTER_SOURCE_DOOR)) return */ - to_chat(user, span_notice("You try [key_used] against [src]")) + if(need_key) + to_chat(user, span_notice("You try [key_used] against [src]")) + else + to_chat(user, span_notice("You try to unlock [src]")) + if(door_broken) to_chat(user,span_warning("There is no door to open/close here.")) return @@ -327,9 +354,58 @@ proc_unlock("key") locked = FALSE return TRUE + if(!need_key) + playsound(src, lock_sound, 75, TRUE) + if(!locked) + to_chat(user, "[src] is now locked.") + locked = TRUE + else + to_chat(user, "[src] is now unlocked.") + proc_unlock("key") + locked = FALSE + return TRUE /obj/structure/vampdoor/proc/reset_transform() pixel_z = initial(pixel_z) pixel_w = initial(pixel_w) + +/obj/structure/vampdoor/proc/try_award_apartment_key(mob/user) + if(!grant_apartment_key) + return FALSE + if(!lock_id) + return FALSE + if(!ishuman(user)) + return FALSE + var/mob/living/carbon/human/human = user + if(human.received_apartment_key) + return FALSE + var/alert = tgui_alert(user, "Is this my apartment?", "Apartment", list("Yes", "No")) + if(alert != "Yes") + return + if(!grant_apartment_key) + return + var/spare_key = tgui_alert(user, "Do I have an extra spare key?", "Apartment", list("Yes", "No")) + if(!grant_apartment_key) + return + if(spare_key == "Yes") + apartment_key_amount = 2 + else + apartment_key_amount = 1 + for(var/i in 1 to apartment_key_amount) + var/obj/item/vamp/keys/key + if(apartment_key_type) + key = new apartment_key_type(get_turf(human)) + else + key = new /obj/item/vamp/keys(get_turf(human)) + key.accesslocks = list("[lock_id]") + human.put_in_hands(key) + human.received_apartment_key = TRUE + grant_apartment_key = FALSE + if(apartment_key_amount > 1) + to_chat(human, span_notice("They're just where I left them...")) + else + to_chat(human, span_notice("It's just where I left it...")) + return TRUE + #undef DOAFTER_SOURCE_DOOR diff --git a/modular_darkpack/modules/doors/code/vampdoor_glass.dm b/modular_darkpack/modules/doors/code/vampdoor_glass.dm index 8b62eddbc1f3..56df36b19497 100644 --- a/modular_darkpack/modules/doors/code/vampdoor_glass.dm +++ b/modular_darkpack/modules/doors/code/vampdoor_glass.dm @@ -1,35 +1,27 @@ -/obj/structure/vampdoor/glass +/obj/structure/vampdoor/glass // Blue door with dual glass panels + name = "glass door" icon_state = "glass_blue-1" opacity = FALSE base_icon_state = "glass_blue" - glass = TRUE - burnable = TRUE /obj/structure/vampdoor/glass/clerk - lock_id = "clerk" + lock_id = LOCKACCESS_CLERK lockpick_difficulty = 12 locked = TRUE -/obj/structure/vampdoor/glass/prince - icon_state = "glass-1" - base_icon_state = "glass" - locked = TRUE - lock_id = "prince" - lockpick_difficulty = 12 - /obj/structure/vampdoor/glass/banu_haqim - lock_id = "banuhaqim" + lock_id = LOCKACCESS_BANU locked = TRUE /obj/structure/vampdoor/glass/bianchi_bank name = "bianchi executive office door" - lock_id = "bankboss" + lock_id = LOCKACCESS_BANKBOSS lockpick_difficulty = 23 locked = TRUE /obj/structure/vampdoor/glass/clinic locked = TRUE - lock_id = "clinic" + lock_id = LOCKACCESS_CLINIC lockpick_difficulty = 4 /obj/structure/vampdoor/glass/clinic/high_security @@ -37,16 +29,16 @@ /obj/structure/vampdoor/glass/laundromat name = "Laundromat" - lock_id = "laundromat" + lock_id = LOCKACCESS_LAUNDROMAT lockpick_difficulty = 7 /obj/structure/vampdoor/glass/nightwolf name = "Nightwolf Tech" - lock_id = "wolftech" + lock_id = LOCKACCESS_WOLFTECH lockpick_difficulty = 12 /obj/structure/vampdoor/glass/pentex - lock_id = "pentex" + lock_id = LOCKACCESS_PENTEX lockpick_difficulty = 12 locked = TRUE @@ -57,15 +49,15 @@ locked = FALSE /obj/structure/vampdoor/glass/primogen_toreador - lock_id = "primToreador" + lock_id = LOCKACCESS_PRIMOGEN_TOREADOR lockpick_difficulty = 14 /obj/structure/vampdoor/glass/police_chief locked = TRUE - lock_id = "police_chief" + lock_id = LOCKACCESS_POLICE_CHIEF lockpick_difficulty = 21 /obj/structure/vampdoor/glass/jazz_club name = "Jazz Club" - lock_id = "milleniumCommon" + lock_id = LOCKACCESS_JAZZ_CLUB lockpick_difficulty = 8 diff --git a/modular_darkpack/modules/doors/code/vampdoor_misc.dm b/modular_darkpack/modules/doors/code/vampdoor_misc.dm deleted file mode 100644 index 896cec200c33..000000000000 --- a/modular_darkpack/modules/doors/code/vampdoor_misc.dm +++ /dev/null @@ -1,84 +0,0 @@ -/obj/structure/vampdoor/old - icon_state = "old-1" - base_icon_state = "old" - -/obj/structure/vampdoor/simple - icon_state = "cam-1" - base_icon_state = "cam" - -/obj/structure/vampdoor/reinf - icon_state = "reinf-1" - base_icon_state = "reinf" - -/obj/structure/vampdoor/camarilla - icon_state = "cam-1" - base_icon_state = "cam" - locked = TRUE - lock_id = "camarilla" - lockpick_difficulty = 8 - -/obj/structure/vampdoor/daughters - icon_state = "wood-1" - base_icon_state = "wood" - locked = TRUE - lock_id = "daughters" - burnable = TRUE - lockpick_difficulty = 10 - -/obj/structure/vampdoor/graveyard - icon_state = "oldwood-1" - base_icon_state = "oldwood" - locked = TRUE - lock_id = "graveyard" - burnable = TRUE - lockpick_difficulty = 2 - -/obj/structure/vampdoor/church - icon_state = "oldwood-1" - base_icon_state = "oldwood" - locked = TRUE - lock_id = "church" - burnable = TRUE - lockpick_difficulty = 10 - -/obj/structure/vampdoor/cleaning - icon_state = "reinf-1" - base_icon_state = "reinf" - locked = TRUE - lock_id = "cleaning" - lockpick_difficulty = 4 - -/obj/structure/vampdoor/chantry - icon_state = "old-1" - base_icon_state = "old" - locked = TRUE - lock_id = "chantry" - lockpick_difficulty = 10 - -/obj/structure/vampdoor/anarch - icon_state = "cam-1" - base_icon_state = "cam" - locked = TRUE - lock_id = "anarch" - lockpick_difficulty = 10 - -/obj/structure/vampdoor/bar - icon_state = "cam-1" - base_icon_state = "cam" - locked = TRUE - lock_id = "bar" - lockpick_difficulty = 10 - -/obj/structure/vampdoor/supply - icon_state = "cam-1" - base_icon_state = "cam" - locked = TRUE - lock_id = "supply" - lockpick_difficulty = 8 - -/obj/structure/vampdoor/strip - icon_state = "cam-1" - base_icon_state = "cam" - locked = TRUE - lock_id = "strip" - lockpick_difficulty = 4 diff --git a/modular_darkpack/modules/doors/code/vampdoor_npc.dm b/modular_darkpack/modules/doors/code/vampdoor_npc.dm index 891a33a79a7f..89f60ab73fac 100644 --- a/modular_darkpack/modules/doors/code/vampdoor_npc.dm +++ b/modular_darkpack/modules/doors/code/vampdoor_npc.dm @@ -1,4 +1,4 @@ -/obj/structure/vampdoor/npc +/obj/structure/vampdoor/wood/npc // Random access wooden door icon_state = "wood-1" base_icon_state = "wood" locked = TRUE @@ -6,6 +6,6 @@ burnable = TRUE lockpick_difficulty = 4 -/obj/structure/vampdoor/npc/Initialize(mapload) +/obj/structure/vampdoor/wood/npc/Initialize(mapload) . = ..() lock_id = "npc[rand(1, 20)]" diff --git a/modular_darkpack/modules/doors/code/vampdoor_old.dm b/modular_darkpack/modules/doors/code/vampdoor_old.dm new file mode 100644 index 000000000000..b739bea2dd0e --- /dev/null +++ b/modular_darkpack/modules/doors/code/vampdoor_old.dm @@ -0,0 +1,19 @@ +/obj/structure/vampdoor/old // Blue utility door with a vent. // TODO: Atmos passthrough var for when/if atmos is implemented + name = "old door" + icon_state = "old-1" + base_icon_state = "old" + +/obj/structure/vampdoor/old/chantry + locked = TRUE + lock_id = LOCKACCESS_CHANTRY + lockpick_difficulty = 10 + +/obj/structure/vampdoor/old/graveyard + locked = TRUE + lock_id = LOCKACCESS_GRAVEYARD + lockpick_difficulty = 2 + +/obj/structure/vampdoor/old/church + locked = TRUE + lock_id = LOCKACCESS_CHURCH + lockpick_difficulty = 10 diff --git a/modular_darkpack/modules/doors/code/vampdoor_oldwood.dm b/modular_darkpack/modules/doors/code/vampdoor_oldwood.dm new file mode 100644 index 000000000000..0732aaf422fa --- /dev/null +++ b/modular_darkpack/modules/doors/code/vampdoor_oldwood.dm @@ -0,0 +1,34 @@ +/obj/structure/vampdoor/oldwood // Six paneled wooden door with peeling green paint + name = "old wooden door" + icon_state = "oldwood-1" + base_icon_state = "oldwood" + burnable = TRUE + // open_sound = 'modular_darkpack/modules/doors/sounds/wood_open.ogg' + // close_sound = 'modular_darkpack/modules/doors/sounds/wood_close.ogg' + lock_sound = 'modular_darkpack/modules/doors/sounds/wood_locked.ogg' + +/obj/structure/vampdoor/oldwood/chantry + lock_id = LOCKACCESS_CHANTRY + lockpick_difficulty = 12 + locked = TRUE + +/obj/structure/vampdoor/oldwood/baali + locked = TRUE + lock_id = LOCKACCESS_BAALI + lockpick_difficulty = 8 + +/obj/structure/vampdoor/oldwood/salubri + locked = TRUE + lock_id = LOCKACCESS_SALUBRI + lockpick_difficulty = 8 + +/obj/structure/vampdoor/oldwood/clan_tzimisce + locked = TRUE + lock_id = LOCKACCESS_OLD_CLAN_TZI + lockpick_difficulty = 8 + +/obj/structure/vampdoor/oldwood/children_of_gaia + locked = TRUE + lock_id = "coggie" + lockpick_difficulty = 10 + diff --git a/modular_darkpack/modules/doors/code/vampdoor_police.dm b/modular_darkpack/modules/doors/code/vampdoor_police.dm deleted file mode 100644 index d5388135ff01..000000000000 --- a/modular_darkpack/modules/doors/code/vampdoor_police.dm +++ /dev/null @@ -1,28 +0,0 @@ -/obj/structure/vampdoor/dispatch - icon_state = "cam-1" - base_icon_state = "cam" - locked = TRUE - lock_id = "dispatch" - lockpick_difficulty = 5 - -/obj/structure/vampdoor/police - icon_state = "cam-1" - base_icon_state = "cam" - locked = TRUE - lock_id = "police" - lockpick_difficulty = 6 - -/obj/structure/vampdoor/police/secure - icon_state = "cam-1" - base_icon_state = "cam" - locked = TRUE - lock_id = "police_secure" - lockpick_difficulty = 21 - -/obj/structure/vampdoor/prison - icon_state = "prison-1" - base_icon_state = "prison" - locked = TRUE - glass = TRUE - lock_id = "police" - lockpick_difficulty = 6 diff --git a/modular_darkpack/modules/doors/code/vampdoor_prison.dm b/modular_darkpack/modules/doors/code/vampdoor_prison.dm new file mode 100644 index 000000000000..651d567cddc4 --- /dev/null +++ b/modular_darkpack/modules/doors/code/vampdoor_prison.dm @@ -0,0 +1,4 @@ +/obj/structure/vampdoor/prison // Metal bar door, such as for prison or sewers + name = "security door" + icon_state = "prison-1" + base_icon_state = "prison" diff --git a/modular_darkpack/modules/doors/code/vampdoor_reinf.dm b/modular_darkpack/modules/doors/code/vampdoor_reinf.dm new file mode 100644 index 000000000000..c56162833065 --- /dev/null +++ b/modular_darkpack/modules/doors/code/vampdoor_reinf.dm @@ -0,0 +1,14 @@ +/obj/structure/vampdoor/reinf // Blue three-paneled door + name = "reinforced door" + icon_state = "reinf-1" + base_icon_state = "reinf" + +/obj/structure/vampdoor/reinf/cleaning + locked = TRUE + lock_id = LOCKACCESS_CLEANING + lockpick_difficulty = 4 + +/obj/structure/vampdoor/reinf/setite_high_sec + locked = TRUE + lock_id = "setite" + lockpick_difficulty = 15 diff --git a/modular_darkpack/modules/doors/code/vampdoor_simple.dm b/modular_darkpack/modules/doors/code/vampdoor_simple.dm new file mode 100644 index 000000000000..f815132f8be3 --- /dev/null +++ b/modular_darkpack/modules/doors/code/vampdoor_simple.dm @@ -0,0 +1,55 @@ + +/obj/structure/vampdoor/simple // Green metal door + name = "simple door" + icon_state = "cam-1" + base_icon_state = "cam" + +/obj/structure/vampdoor/simple/camarilla + locked = TRUE + lock_id = LOCKACCESS_CAMARILLA + lockpick_difficulty = 8 + +/obj/structure/vampdoor/simple/anarch + locked = TRUE + lock_id = LOCKACCESS_ANARCH + lockpick_difficulty = 10 + +/obj/structure/vampdoor/simple/bar + locked = TRUE + lock_id = LOCKACCESS_BAR + lockpick_difficulty = 10 + +/obj/structure/vampdoor/simple/supply + locked = TRUE + lock_id = LOCKACCESS_SUPPLY + lockpick_difficulty = 8 + +/obj/structure/vampdoor/simple/strip + locked = TRUE + lock_id = LOCKACCESS_STRIP + lockpick_difficulty = 4 + +/obj/structure/vampdoor/simple/dispatch + locked = TRUE + lock_id = LOCKACCESS_DISPATCH + lockpick_difficulty = 5 + +/obj/structure/vampdoor/simple/police + locked = TRUE + lock_id = LOCKACCESS_POLICE + lockpick_difficulty = 6 + +/obj/structure/vampdoor/simple/police/secure + locked = TRUE + lock_id = LOCKACCESS_POLICE_SECURE + lockpick_difficulty = 21 + +/obj/structure/vampdoor/simple/setite + locked = TRUE + lock_id = "setite" + lockpick_difficulty = 10 + +/obj/structure/vampdoor/simple/food_pantry + locked = TRUE + lock_id = "coggie" + lockpick_difficulty = 4 diff --git a/modular_darkpack/modules/doors/code/vampdoor_vault.dm b/modular_darkpack/modules/doors/code/vampdoor_vault.dm new file mode 100644 index 000000000000..6e637aecba55 --- /dev/null +++ b/modular_darkpack/modules/doors/code/vampdoor_vault.dm @@ -0,0 +1,8 @@ +// TODO: [Rebase] - Make vaults a subtype of vampdoor? Some of the 'force this door open' snowflake code could be used for normal doors. +/*/obj/structure/vampdoor/vault // Huge metal behemoth of a door with a large crank instead of a handle + name = "Vault Door" + desc = "A heavy duty door that looks like it could withstand a lot of punishment." + icon = 'modular_darkpack/modules/deprecated/icons/doors.dmi' + icon_state = "vault-1" + base_icon_state = "vault" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF*/ diff --git a/modular_darkpack/modules/doors/code/vampdoor_wood.dm b/modular_darkpack/modules/doors/code/vampdoor_wood.dm index ded24a4904b7..e9f03f879ecc 100644 --- a/modular_darkpack/modules/doors/code/vampdoor_wood.dm +++ b/modular_darkpack/modules/doors/code/vampdoor_wood.dm @@ -1,15 +1,20 @@ -/obj/structure/vampdoor/wood +/obj/structure/vampdoor/wood // Six paneled plain wooden door + name = "wooden door" icon_state = "wood-1" base_icon_state = "wood" burnable = TRUE + // Sounds kinda ass cause its really squeaky + // open_sound = 'modular_darkpack/modules/doors/sounds/wood_open.ogg' + // close_sound = 'modular_darkpack/modules/doors/sounds/wood_close.ogg' + lock_sound = 'modular_darkpack/modules/doors/sounds/wood_locked.ogg' /obj/structure/vampdoor/wood/strip - lock_id = "strip" + lock_id = LOCKACCESS_STRIP lockpick_difficulty = 8 /obj/structure/vampdoor/wood/giovanni locked = TRUE - lock_id = "giovanni" + lock_id = LOCKACCESS_GIOVANNI lockpick_difficulty = 8 /obj/structure/vampdoor/wood/giovanni/high_security @@ -17,7 +22,7 @@ /obj/structure/vampdoor/wood/pentex locked = TRUE - lock_id = "pentex" + lock_id = LOCKACCESS_PENTEX lockpick_difficulty = 16 /obj/structure/vampdoor/wood/madman @@ -28,7 +33,7 @@ /obj/structure/vampdoor/wood/theatre name = "Theatre" locked = TRUE - lock_id = "theatre" + lock_id = LOCKACCESS_THEATRE lockpick_difficulty = 15 /obj/structure/vampdoor/wood/theatre/unlocked @@ -36,5 +41,36 @@ /obj/structure/vampdoor/wood/jazz_club name = "Jazz Club" - lock_id = "milleniumCommon" + lock_id = LOCKACCESS_JAZZ_CLUB + lockpick_difficulty = 8 + +/obj/structure/vampdoor/wood/daughters + locked = TRUE + lock_id = LOCKACCESS_DAUGHTERS + lockpick_difficulty = 10 + +/obj/structure/vampdoor/wood/nps + locked = TRUE + lock_id = LOCKACCESS_PARK_RANGER + lockpick_difficulty = 12 + +/obj/structure/vampdoor/wood/apartment + locked = TRUE + grant_apartment_key = TRUE + apartment_key_type = /obj/item/vamp/keys/apartment + lockpick_difficulty = 8 + +/obj/structure/vampdoor/wood/apartment/Initialize() + . = ..() + if(grant_apartment_key && !lock_id) + lock_id = "[rand(1,9999999)]" // I know, not foolproof + +/obj/structure/vampdoor/wood/millennium_common + locked = TRUE + lock_id = LOCKACCESS_JAZZ_CLUB + lockpick_difficulty = 12 + +/obj/structure/vampdoor/wood/sabbat + locked = TRUE + lock_id = LOCKACCESS_SABBAT lockpick_difficulty = 8 diff --git a/modular_darkpack/modules/doors/code/vampdoor_wood_old.dm b/modular_darkpack/modules/doors/code/vampdoor_wood_old.dm deleted file mode 100644 index dba2daef7e3a..000000000000 --- a/modular_darkpack/modules/doors/code/vampdoor_wood_old.dm +++ /dev/null @@ -1,23 +0,0 @@ -/obj/structure/vampdoor/wood/old - icon_state = "oldwood-1" - base_icon_state = "oldwood" - -/obj/structure/vampdoor/wood/old/chantry - lock_id = "chantry" - lockpick_difficulty = 12 - locked = TRUE - -/obj/structure/vampdoor/wood/old/baali - locked = TRUE - lock_id = "baali" - lockpick_difficulty = 8 - -/obj/structure/vampdoor/wood/old/salubri - locked = TRUE - lock_id = "salubri" - lockpick_difficulty = 8 - -/obj/structure/vampdoor/wood/old/clan_tzimisce - locked = TRUE - lock_id = "old_clan_tzimisce" - lockpick_difficulty = 8 diff --git a/modular_darkpack/modules/doors/code/vampdoor_woodglass.dm b/modular_darkpack/modules/doors/code/vampdoor_woodglass.dm new file mode 100644 index 000000000000..159841a67ac1 --- /dev/null +++ b/modular_darkpack/modules/doors/code/vampdoor_woodglass.dm @@ -0,0 +1,13 @@ +/obj/structure/vampdoor/woodglass // Wooden door with dual glass panels + name = "wooden glass door" + icon_state = "glass-1" + base_icon_state = "glass" + opacity = FALSE + // open_sound = 'modular_darkpack/modules/doors/sounds/wood_open.ogg' + // close_sound = 'modular_darkpack/modules/doors/sounds/wood_close.ogg' + lock_sound = 'modular_darkpack/modules/doors/sounds/wood_locked.ogg' + +/obj/structure/vampdoor/woodglass/prince + locked = TRUE + lock_id = LOCKACCESS_PRINCE + lockpick_difficulty = 12 diff --git a/modular_darkpack/modules/doors/icons/mapping_helpers.dmi b/modular_darkpack/modules/doors/icons/mapping_helpers.dmi new file mode 100644 index 000000000000..b428bfd76d8f Binary files /dev/null and b/modular_darkpack/modules/doors/icons/mapping_helpers.dmi differ diff --git a/modular_darkpack/modules/doors/readme.md b/modular_darkpack/modules/doors/readme.md new file mode 100644 index 000000000000..d9a60d2757af --- /dev/null +++ b/modular_darkpack/modules/doors/readme.md @@ -0,0 +1,41 @@ +<!-- This should be copy-pasted into the root of your module folder as readme.md --> + +## \<Doors> <!--Title of your addition.--> + +Module ID: DOORS<!-- Uppercase, UNDERSCORE_CONNECTED name of your module, that you use to mark files. This is so people can case-sensitive search for your edits, if any. --> + +### Description: + +<!-- Here, try to describe what your PR does, what features it provides and any other directly useful information. --> + +### TG Proc/File Changes: + +- N/A +<!-- If you edited any core procs, you should list them here. You should specify the files and procs you changed. +E.g: +- `code/modules/mob/living.dm`: `proc/overriden_proc`, `var/overriden_var` + --> +- `tools/maplint/lints/wall_stacking.yml` : Added doors to banned type + +### Modular Overrides: + +- N/A +<!-- If you added a new modular override (file or code-wise) for your module, you should list it here. Code files should specify what procs they changed, in case of multiple modules using the same file. +E.g: +- `modular_nova/master_files/sound/my_cool_sound.ogg` +- `modular_nova/master_files/code/my_modular_override.dm`: `proc/overriden_proc`, `var/overriden_var` + --> + +### Defines: + +- N/A +<!-- If you needed to add any defines, mention the files you added those defines in, along with the name of the defines. --> + +### Included files that are not contained in this module: + +- tools/maplint/lints/~darkpack_multiple_doors.yml +<!-- Likewise, be it a non-modular file or a modular one that's not contained within the folder belonging to this specific module, it should be mentioned here. Good examples are icons or sounds that are used between multiple modules, or other such edge-cases. --> + +### Credits: + +<!-- Here go the credits to you, dear coder, and in case of collaborative work or ports, credits to the original source of the code. --> diff --git a/modular_darkpack/modules/deprecated/sounds/door_close.ogg b/modular_darkpack/modules/doors/sounds/door_close.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/door_close.ogg rename to modular_darkpack/modules/doors/sounds/door_close.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/door_locked.ogg b/modular_darkpack/modules/doors/sounds/door_locked.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/door_locked.ogg rename to modular_darkpack/modules/doors/sounds/door_locked.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/door_open.ogg b/modular_darkpack/modules/doors/sounds/door_open.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/door_open.ogg rename to modular_darkpack/modules/doors/sounds/door_open.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/wood_close.ogg b/modular_darkpack/modules/doors/sounds/wood_close.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/wood_close.ogg rename to modular_darkpack/modules/doors/sounds/wood_close.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/wood_locked.ogg b/modular_darkpack/modules/doors/sounds/wood_locked.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/wood_locked.ogg rename to modular_darkpack/modules/doors/sounds/wood_locked.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/wood_open.ogg b/modular_darkpack/modules/doors/sounds/wood_open.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/wood_open.ogg rename to modular_darkpack/modules/doors/sounds/wood_open.ogg diff --git a/modular_darkpack/modules/drugs/code/bloodpacks/cokepack.dm b/modular_darkpack/modules/drugs/code/bloodpacks/cokepack.dm index fab2681c54ea..0ed5ffb37902 100644 --- a/modular_darkpack/modules/drugs/code/bloodpacks/cokepack.dm +++ b/modular_darkpack/modules/drugs/code/bloodpacks/cokepack.dm @@ -34,13 +34,12 @@ icon_state = "blood0" inhand_icon_state = "blood0" name = "\improper drinkable blood pack (empty)" - M.bloodpool = min(M.maxbloodpool, M.bloodpool+amount_of_bloodpoints) - M.adjustBruteLoss(-20, TRUE) - M.adjustFireLoss(-20, TRUE) + M.adjust_blood_pool(amount_of_bloodpoints) + M.adjust_brute_loss(-20, TRUE) + M.adjust_fire_loss(-20, TRUE) M.update_damage_overlays() M.update_health_hud() if(iskindred(M)) - M.update_blood_hud() H.reagents.trans_to(M, min(10, H.reagents.total_volume), transfered_by = H, methods = INGEST) //calling the earlier variable to transfer to target, M playsound(M.loc,'sound/items/drink.ogg', 50, TRUE) return diff --git a/modular_darkpack/modules/drugs/code/bloodpacks/methpack.dm b/modular_darkpack/modules/drugs/code/bloodpacks/methpack.dm index 13405c08a0ff..f3bcb3d9d75b 100644 --- a/modular_darkpack/modules/drugs/code/bloodpacks/methpack.dm +++ b/modular_darkpack/modules/drugs/code/bloodpacks/methpack.dm @@ -34,13 +34,12 @@ icon_state = "blood0" inhand_icon_state = "blood0" name = "\improper drinkable blood pack (empty)" - M.bloodpool = min(M.maxbloodpool, M.bloodpool+amount_of_bloodpoints) - M.adjustBruteLoss(-20, TRUE) - M.adjustFireLoss(-20, TRUE) + M.adjust_blood_pool(amount_of_bloodpoints) + M.adjust_brute_loss(-20, TRUE) + M.adjust_fire_loss(-20, TRUE) M.update_damage_overlays() M.update_health_hud() if(iskindred(M)) - M.update_blood_hud() H.reagents.trans_to(M, min(10, H.reagents.total_volume), transfered_by = H, methods = INGEST) //calling the earlier variable to transfer to target, M playsound(M.loc,'sound/items/drink.ogg', 50, TRUE) return diff --git a/modular_darkpack/modules/drugs/code/bloodpacks/morphpack.dm b/modular_darkpack/modules/drugs/code/bloodpacks/morphpack.dm index a146f3460e5c..e22b9dc6f5c0 100644 --- a/modular_darkpack/modules/drugs/code/bloodpacks/morphpack.dm +++ b/modular_darkpack/modules/drugs/code/bloodpacks/morphpack.dm @@ -34,9 +34,9 @@ icon_state = "blood0" inhand_icon_state = "blood0" name = "\improper drinkable blood pack (empty)" - M.bloodpool = min(M.maxbloodpool, M.bloodpool+amount_of_bloodpoints) - M.adjustBruteLoss(-20, TRUE) - M.adjustFireLoss(-20, TRUE) + M.adjust_blood_pool(amount_of_bloodpoints) + M.adjust_brute_loss(-20, TRUE) + M.adjust_fire_loss(-20, TRUE) M.update_damage_overlays() M.update_health_hud() if(iskindred(M)) diff --git a/modular_darkpack/modules/drugs/code/meth/baggie.dm b/modular_darkpack/modules/drugs/code/meth/baggie.dm index 94d706e35027..85f26aec529c 100644 --- a/modular_darkpack/modules/drugs/code/meth/baggie.dm +++ b/modular_darkpack/modules/drugs/code/meth/baggie.dm @@ -2,7 +2,7 @@ name = "small plastic bag" icon_state = "package_empty" icon = 'modular_darkpack/modules/drugs/icons/items.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/drugs/icons/onfloor.dmi') /obj/item/reagent_containers/cup/glass/baggie/meth name = "blue package" diff --git a/modular_darkpack/modules/drugs/code/meth/methlab.dm b/modular_darkpack/modules/drugs/code/meth/methlab.dm index dc61ffd86bad..32788f044eb6 100644 --- a/modular_darkpack/modules/drugs/code/meth/methlab.dm +++ b/modular_darkpack/modules/drugs/code/meth/methlab.dm @@ -1,4 +1,4 @@ -// TODO: [Rebase] Convert this to a chem heater or chem mixer? +// DARKPACK TODO - Convert this to a chem heater or chem mixer? /obj/structure/methlab name = "chemical laboratory" desc = "\"Jesse... It's not about style, it's about science...\"" diff --git a/modular_darkpack/modules/drugs/code/meth/pills.dm b/modular_darkpack/modules/drugs/code/meth/pills.dm index fb0746e0ff0e..c54ef0a93081 100644 --- a/modular_darkpack/modules/drugs/code/meth/pills.dm +++ b/modular_darkpack/modules/drugs/code/meth/pills.dm @@ -27,12 +27,6 @@ icon_state = "pill9" list_reagents = list(/datum/reagent/drug/placebatol = 10) -/obj/item/storage/pill_bottle/estrogen - name = "estrogen pill bottle" - desc = "There are boobs on the top." - spawn_count = 5 - spawn_type = /obj/item/reagent_containers/applicator/pill/placebatol - /obj/item/storage/pill_bottle/unknown name = "unknown pill bottle" desc = "Its unlabeled and its unclear what they would acctually treat." diff --git a/modular_darkpack/modules/drugs/code/weed/bailer.dm b/modular_darkpack/modules/drugs/code/weed/bailer.dm deleted file mode 100644 index 8665628e5925..000000000000 --- a/modular_darkpack/modules/drugs/code/weed/bailer.dm +++ /dev/null @@ -1,14 +0,0 @@ -/obj/item/bailer - name = "bailer" - desc = "Best for flora!" - icon_state = "bailer" - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - w_class = WEIGHT_CLASS_SMALL - var/amount_of_water = 10 - -/obj/item/bailer/examine(mob/user) - . = ..() - if(!amount_of_water) - . += span_warning("[src] is empty!") - else - . += span_notice("It has [amount_of_water]/10 unit[amount_of_water == 1 ? "" : "s"] of water left.") diff --git a/modular_darkpack/modules/drugs/code/weed/bong.dm b/modular_darkpack/modules/drugs/code/weed/bong.dm index f2f758c9038a..401cf1f0609f 100644 --- a/modular_darkpack/modules/drugs/code/weed/bong.dm +++ b/modular_darkpack/modules/drugs/code/weed/bong.dm @@ -1,10 +1,14 @@ /obj/item/bong name = "bong" desc = "Technically known as a water pipe." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' + icon = 'modular_darkpack/modules/drugs/icons/items.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/drugs/icons/onfloor.dmi') icon_state = "bulbulator" - inhand_icon_state = "bulbulator" - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + + light_range = 1 + light_color = LIGHT_COLOR_FIRE + light_system = OVERLAY_LIGHT + light_on = FALSE ///The icon state when the bong is lit var/icon_on = "bulbulator" @@ -20,9 +24,9 @@ var/moan_chance = 0 ///Max units able to be stored inside the bong - var/chem_volume = 30 + var/chem_volume = 100 ///Is it filled? - var/packed_item = FALSE + var/packeditem = FALSE ///How many reagents do we transfer each use? var/reagent_transfer_per_use = 0 @@ -33,70 +37,57 @@ . = ..() create_reagents(chem_volume, INJECTABLE | NO_REACT) -/obj/item/bong/attackby(obj/item/used_item, mob/user, params) - if(istype(used_item, /obj/item/food/grown)) - var/obj/item/food/grown/grown_item = used_item - if(packed_item) - to_chat(user, span_warning("Already packed!")) - return - if(!HAS_TRAIT(grown_item, TRAIT_DRIED)) - to_chat(user, span_warning("Needs to be dried!")) +/obj/item/bong/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) + if((istype(attacking_item, /obj/item/food/grown) || istype(attacking_item, /obj/item/food/drug))) + if(packeditem) + to_chat(user, span_warning("It is already packed!")) return - to_chat(user, span_notice("You stuff [grown_item] into [src].")) - bong_hits = max_hits - packed_item = TRUE - if(grown_item.reagents) - grown_item.reagents.trans_to(src, grown_item.reagents.total_volume) - reagent_transfer_per_use = reagents.total_volume / max_hits - qdel(grown_item) - else if(istype(used_item, /obj/item/weedpack)) //for hash/dabs - if(packed_item) - to_chat(user, span_warning("Already packed!")) + + if(istype(attacking_item, /obj/item/food/grown) && !HAS_TRAIT(attacking_item, TRAIT_DRIED)) + to_chat(user, span_warning("It has to be dried first!")) return - to_chat(user, span_notice("You stuff [used_item] into [src].")) + + to_chat(user, span_notice("You stuff [attacking_item] into [src].")) bong_hits = max_hits - packed_item = TRUE - var/obj/item/food/grown/cannabis/W = new(loc) - if(W.reagents) - W.reagents.trans_to(src, W.reagents.total_volume) + packeditem = attacking_item.name + update_name() + if(attacking_item.reagents) + attacking_item.reagents.trans_to(src, attacking_item.reagents.total_volume, transferred_by = user) reagent_transfer_per_use = reagents.total_volume / max_hits - qdel(W) - qdel(used_item) + qdel(attacking_item) else - var/lighting_text = used_item.ignition_effect(src, user) + var/lighting_text = attacking_item.ignition_effect(src, user) if(!lighting_text) return ..() if(bong_hits <= 0) to_chat(user, span_warning("Nothing to smoke!")) return ..() light(lighting_text) - name = "lit [initial(name)]" /obj/item/bong/attack_self(mob/user) var/turf/location = get_turf(user) if(lit) user.visible_message(span_notice("[user] puts out [src]."), span_notice("You put out [src].")) - lit = FALSE - icon_state = icon_off - inhand_icon_state = icon_off + put_out() else if(!lit && bong_hits > 0) to_chat(user, span_notice("You empty [src] onto [location].")) new /obj/effect/decal/cleanable/ash(location) - packed_item = FALSE - bong_hits = 0 - reagents.clear_reagents() + empty_out() return -/obj/item/bong/attack(mob/hit_mob, mob/user, def_zone) - if(!packed_item || !lit) +/obj/item/bong/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) + if(!packeditem || !lit) return - hit_mob.visible_message(span_notice("[user] starts [hit_mob == user ? "taking a hit from [src]." : "forcing [hit_mob] to take a hit from [src]!"]", "[hit_mob == user ? "<span class='notice'>You start taking a hit from [src].") : span_danger("[user] starts forcing you to take a hit from [src]!")]") - playsound(src, 'modular_darkpack/modules/deprecated/sounds/heatdam.ogg', 50, TRUE) - if(!do_after(user, 40, src)) + target_mob.visible_message( + span_notice("[user] starts [target_mob == user ? "taking a hit from [src]." : "forcing [target_mob] to take a hit from [src]!"]"), + "[target_mob == user ? span_notice("You start taking a hit from [src].") : span_danger("[user] starts forcing you to take a hit from [src]!")]" + ) + playsound(src, 'modular_darkpack/modules/drugs/sounds/heatdam.ogg', 50, TRUE) + if(!do_after(user, 4 SECONDS, src)) return - to_chat(hit_mob, span_notice("You finish taking a hit from [src].")) + to_chat(target_mob, span_notice("You finish taking a hit from [src].")) if(reagents.total_volume) - reagents.trans_to(hit_mob, reagent_transfer_per_use, methods = VAPOR) + reagents.trans_to(target_mob, reagent_transfer_per_use, methods = INHALE, ignore_stomach = TRUE) bong_hits-- var/turf/open/pos = get_turf(src) if(istype(pos)) @@ -104,29 +95,25 @@ spawn_cloud(pos, smoke_range) if(moan_chance > 0) if(prob(moan_chance)) - playsound(hit_mob, pick('modular_darkpack/modules/deprecated/sounds/lungbust_moan1.ogg','modular_darkpack/modules/deprecated/sounds/lungbust_moan2.ogg', 'modular_darkpack/modules/deprecated/sounds/lungbust_moan3.ogg'), 50, TRUE) - hit_mob.emote("moan") + playsound(target_mob, pick('modular_darkpack/modules/drugs/sounds/lungbust_moan1.ogg','modular_darkpack/modules/drugs/sounds/lungbust_moan2.ogg', 'modular_darkpack/modules/drugs/sounds/lungbust_moan3.ogg'), 50, TRUE) + target_mob.emote("moan") else - playsound(hit_mob, pick('modular_darkpack/modules/deprecated/sounds/lungbust_cough1.ogg','modular_darkpack/modules/deprecated/sounds/lungbust_cough2.ogg'), 50, TRUE) - hit_mob.emote("cough") + playsound(target_mob, pick('modular_darkpack/modules/drugs/sounds/lungbust_cough1.ogg','modular_darkpack/modules/drugs/sounds/lungbust_cough2.ogg'), 50, TRUE) + target_mob.emote("cough") if(bong_hits <= 0) - to_chat(hit_mob, span_warning("Out of uses!")) - lit = FALSE - packed_item = FALSE - icon_state = icon_off - inhand_icon_state = icon_off - name = "[initial(name)]" - reagents.clear_reagents() //just to make sure + to_chat(target_mob, span_warning("Out of uses!")) + put_out() + empty_out() /obj/item/bong/proc/light(flavor_text = null) if(lit) return if(!(flags_1 & INITIALIZED_1)) icon_state = icon_on - inhand_icon_state = icon_on return lit = TRUE - name = "lit [name]" + name = "lit [initial(name)]" + set_light_on(TRUE) if(reagents.get_reagent_amount(/datum/reagent/toxin/plasma)) // the plasma explodes when exposed to fire var/datum/effect_system/reagents_explosion/explosion = new() @@ -145,10 +132,19 @@ reagents.flags &= ~(NO_REACT) reagents.handle_reactions() icon_state = icon_on - inhand_icon_state = icon_on if(flavor_text) - var/turf/bong_turf = get_turf(src) - bong_turf.visible_message(flavor_text) + visible_message(flavor_text) + +/obj/item/bong/proc/put_out() + set_light_on(FALSE) + lit = FALSE + name = "[initial(name)]" + icon_state = icon_off + +/obj/item/bong/proc/empty_out() + packeditem = FALSE + bong_hits = 0 + reagents.clear_reagents() //just to make sure /obj/item/bong/proc/spawn_cloud(turf/open/location, smoke_range) var/list/turfs_affected = list(location) diff --git a/modular_darkpack/modules/effects/code/fake_steam.dm b/modular_darkpack/modules/drugs/code/weed/fake_steam.dm similarity index 99% rename from modular_darkpack/modules/effects/code/fake_steam.dm rename to modular_darkpack/modules/drugs/code/weed/fake_steam.dm index 9c5346ef46bd..561d5a545fdd 100644 --- a/modular_darkpack/modules/effects/code/fake_steam.dm +++ b/modular_darkpack/modules/drugs/code/weed/fake_steam.dm @@ -1,6 +1,7 @@ #define MAX_FAKE_STEAM_STAGES 5 #define STAGE_DOWN_TIME (10 SECONDS) +#define FAKE_STEAM_TARGET_ALPHA 204 /// Fake steam effect /obj/effect/abstract/fake_steam @@ -25,13 +26,9 @@ return stage_down() -#define FAKE_STEAM_TARGET_ALPHA 204 - /obj/effect/abstract/fake_steam/proc/update_alpha() alpha = FAKE_STEAM_TARGET_ALPHA * (current_stage / MAX_FAKE_STEAM_STAGES) -#undef FAKE_STEAM_TARGET_ALPHA - /obj/effect/abstract/fake_steam/proc/stage_down() if(!current_stage) qdel(src) @@ -46,6 +43,6 @@ next_stage_down = world.time + STAGE_DOWN_TIME update_alpha() -#undef STAGE_DOWN_TIME #undef MAX_FAKE_STEAM_STAGES - +#undef STAGE_DOWN_TIME +#undef FAKE_STEAM_TARGET_ALPHA diff --git a/modular_darkpack/modules/drugs/code/weed/gear.dm b/modular_darkpack/modules/drugs/code/weed/gear.dm new file mode 100644 index 000000000000..d877331185f0 --- /dev/null +++ b/modular_darkpack/modules/drugs/code/weed/gear.dm @@ -0,0 +1,39 @@ +/obj/item/reagent_containers/cup/watering_can/metal + icon = 'modular_darkpack/modules/drugs/icons/items.dmi' + icon_state = "bailer" + +//SanFran community garden stuff +/obj/structure/closet/crate/wooden/communitygardens + desc = null + abstract_type = /obj/structure/closet/crate/wooden/communitygardens + +/obj/structure/closet/crate/wooden/communitygardens/Initialize(mapload) + . = ..() + if(isnull(desc)) + desc = "It's marked with the [CITY_NAME] City Council stamp" + +/obj/structure/closet/crate/wooden/communitygardens/tools + name = "community garden tools" + +/obj/structure/closet/crate/wooden/communitygardens/tools/PopulateContents() + new /obj/item/storage/bag/plants(src) + new /obj/item/clothing/gloves/botanic_leather(src) + new /obj/item/reagent_containers/cup/bottle/nutrient/rh(src) + new /obj/item/reagent_containers/spray/weedspray(src) + new /obj/item/reagent_containers/spray/pestspray(src) + new /obj/item/cultivator/rake(src) + new /obj/item/hatchet/wooden(src) + new /obj/item/secateurs(src) + new /obj/item/reagent_containers/cup/watering_can/metal(src) + new /obj/item/soil_sack(src) + new /obj/item/soil_sack(src) + +/obj/structure/closet/crate/wooden/communitygardens/seeds + name = "community garden seeds" + +/obj/structure/closet/crate/wooden/communitygardens/seeds/PopulateContents() + new /obj/item/seeds/cabbage(src) + new /obj/item/seeds/peas(src) + new /obj/item/seeds/potato(src) + new /obj/item/seeds/soya(src) + new /obj/item/seeds/tomato(src) diff --git a/modular_darkpack/modules/drugs/code/weed/hydroponics.dm b/modular_darkpack/modules/drugs/code/weed/hydroponics.dm deleted file mode 100644 index 65a75f00c7d9..000000000000 --- a/modular_darkpack/modules/drugs/code/weed/hydroponics.dm +++ /dev/null @@ -1,84 +0,0 @@ -/obj/structure/weedshit - name = "hydroponics" - desc = "Definitely not for the weed." - icon = 'modular_darkpack/modules/deprecated/icons/weed.dmi' - icon_state = "soil_dry0" - plane = GAME_PLANE - layer = ABOVE_ALL_MOB_LAYER - anchored = TRUE - density = TRUE - var/wet = FALSE - var/growth_stage = 0 - var/health = 3 - -/obj/structure/weedshit/buyable - anchored = FALSE - -/obj/structure/weedshit/examine(mob/user) - . = ..() - . += span_notice("Alt-click to [anchored ? "un" : ""]secure [src] [anchored ? "from" : "to"] the ground.") - if(!wet) - . += span_warning("[src] is dry!") - if(growth_stage == 5) - . += span_warning("The crop is dead!") - else - if(health <= 2) - . += span_warning("The crop is looking unhealthy.") - -/obj/structure/weedshit/attack_hand(mob/user, params) - . = ..() - if(growth_stage == 5) - growth_stage = 0 - health = 3 - to_chat(user, span_notice("You rip the rotten weed out of [src].")) - if(growth_stage == 4) - growth_stage = 1 - to_chat(user, span_notice("You pull the grown weed out of [src].")) - var/mob/living/carbon/human/H = user - var/amount = clamp(SSroll.storyteller_roll(H.st_get_stat(STAT_INTELLIGENCE), 6, TRUE) - 1, 1, 4) - for(var/i = 1 to amount) - new /obj/item/food/vampire/weed(get_turf(user)) - update_weed_icon() - -/obj/structure/weedshit/click_alt(mob/user) - if(!user.Adjacent(src)) - return - to_chat(user, span_notice("You start [anchored ? "unsecuring" : "securing"] [src] [anchored ? "from" : "to"] the ground.")) - if(do_after(user, 15)) - if(anchored) - to_chat(user, span_notice("You unsecure [src] from the ground.")) - anchored = FALSE - return - else - to_chat(user, span_notice("You secure [src] to the ground.")) - anchored = TRUE - return - -/obj/structure/weedshit/attackby(obj/item/W, mob/living/user, params) - if(istype(W, /obj/item/bailer)) - var/obj/item/bailer/B = W - if(B.amount_of_water) - B.amount_of_water = max(0, B.amount_of_water-1) - wet = TRUE - to_chat(user, span_notice("You fill [src] with water.")) - playsound(src, 'sound/effects/refill.ogg', 50, TRUE) - else - to_chat(user, span_warning("[W] is empty!")) - if(istype(W, /obj/item/weedseed)) - if(growth_stage == 0) - health = 3 - growth_stage = 1 - qdel(W) - update_weed_icon() - return - -/obj/structure/weedshit/Initialize(mapload) - . = ..() - GLOB.weed_list += src - -/obj/structure/weedshit/Destroy() - . = ..() - GLOB.weed_list -= src - -/obj/structure/weedshit/proc/update_weed_icon() - icon_state = "soil[wet ? "" : "_dry"][growth_stage]" diff --git a/modular_darkpack/modules/drugs/code/weed/tray.dm b/modular_darkpack/modules/drugs/code/weed/tray.dm new file mode 100644 index 000000000000..00b52633835d --- /dev/null +++ b/modular_darkpack/modules/drugs/code/weed/tray.dm @@ -0,0 +1,49 @@ +// A unpowered varient of a hydroponics tray. +/obj/machinery/hydroponics/simple + abstract_type = /obj/machinery/hydroponics/simple + icon = 'modular_darkpack/modules/drugs/icons/tray.dmi' + icon_state = null + circuit = null + use_power = NO_POWER_USE + unwrenchable = TRUE + self_sustaining_overlay_icon_state = null + +/obj/machinery/hydroponics/simple/update_status_light_overlays() + if(waterlevel > 10) + . += mutable_appearance('modular_darkpack/modules/drugs/icons/tray.dmi', "tray_wet") + return // Has no lights + +/obj/machinery/hydroponics/simple/click_ctrl(mob/user) + return CLICK_ACTION_BLOCKING //Soil has no electricity. + +/obj/machinery/hydroponics/simple/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) + return NONE + +/obj/machinery/hydroponics/simple/base_item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(default_deconstruction_crowbar(tool, TRUE)) + return + + return ..() + +/obj/machinery/hydroponics/simple/wooden + name = "wooden planter box" + desc = "A wooden plant tray" + icon_state = "wooden_tray" + plant_offset_y = 2 + +/obj/machinery/hydroponics/simple/wooden/on_deconstruction() + new /obj/item/stack/sheet/mineral/wood(drop_location(), 5) + return TRUE + +/obj/machinery/hydroponics/simple/plastic + name = "plastic planter box" + desc = "A plastic plant tray" + icon_state = "plastic_tray" + plant_offset_y = 3 + +/obj/machinery/hydroponics/simple/plastic/on_deconstruction() + new /obj/item/stack/sheet/plastic(drop_location(), 5) + return TRUE + +/obj/machinery/hydroponics/simple/plastic/unanchored + anchored = FALSE diff --git a/modular_darkpack/modules/drugs/code/weed/weed.dm b/modular_darkpack/modules/drugs/code/weed/weed.dm deleted file mode 100644 index feec66245b08..000000000000 --- a/modular_darkpack/modules/drugs/code/weed/weed.dm +++ /dev/null @@ -1,15 +0,0 @@ -/obj/item/food/vampire/weed - name = "leaf" - desc = "Green and smelly..." - icon_state = "weed" - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - bite_consumption = 5 - tastes = list("cat piss" = 4, "weed" = 2) - foodtypes = VEGETABLES - food_reagents = list(/datum/reagent/drug/cannabis = 20, /datum/reagent/toxin/lipolicide = 20) - eat_time = 10 - -/obj/item/food/vampire/weed/Initialize(mapload) - . = ..() - AddComponent(/datum/component/selling, 25, "weed", TRUE, -1, 7) diff --git a/modular_darkpack/modules/drugs/code/weed/weed_crafting.dm b/modular_darkpack/modules/drugs/code/weed/weed_crafting.dm deleted file mode 100644 index 435f42f9cfe0..000000000000 --- a/modular_darkpack/modules/drugs/code/weed/weed_crafting.dm +++ /dev/null @@ -1,15 +0,0 @@ -/datum/crafting_recipe/weedpack - name = "Sort Weed" - time = 10 - reqs = list(/obj/item/food/vampire/weed = 1) - result = /obj/item/weedpack - always_available = TRUE - category = CAT_DRUGS - -/datum/crafting_recipe/weed_blunt - name = "Roll Blunt" - time = 10 - reqs = list(/obj/item/weedpack = 1, /obj/item/paper = 1) - result = /obj/item/clothing/mask/cigarette/rollie/cannabis - always_available = TRUE - category = CAT_DRUGS diff --git a/modular_darkpack/modules/drugs/code/weed/weed_subsystem.dm b/modular_darkpack/modules/drugs/code/weed/weed_subsystem.dm deleted file mode 100644 index be6643775c64..000000000000 --- a/modular_darkpack/modules/drugs/code/weed/weed_subsystem.dm +++ /dev/null @@ -1,20 +0,0 @@ -SUBSYSTEM_DEF(weed) - name = "Weed Growth" - init_order = INIT_ORDER_DEFAULT - wait = 1800 - priority = FIRE_PRIORITY_VERYLOW - -/datum/controller/subsystem/weed/fire() - for(var/obj/structure/weedshit/W in GLOB.weed_list) - if(W.growth_stage != 0 && W.growth_stage != 5) - if(!W.wet) - if(W.health) - W.health = max(0, W.health-1) - else - W.growth_stage = 5 - else if(W.health) - if(prob(33)) - W.wet = FALSE - W.health = min(3, W.health+1) - W.growth_stage = min(4, W.growth_stage+1) - W.update_weed_icon() diff --git a/modular_darkpack/modules/drugs/code/weed/weedpack.dm b/modular_darkpack/modules/drugs/code/weed/weedpack.dm deleted file mode 100644 index cbfb15ebaf9d..000000000000 --- a/modular_darkpack/modules/drugs/code/weed/weedpack.dm +++ /dev/null @@ -1,11 +0,0 @@ -/obj/item/weedpack - name = "green package" - desc = "Green and smelly..." - icon_state = "package_weed" - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - w_class = WEIGHT_CLASS_SMALL - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - -/obj/item/weedpack/Initialize(mapload) - . = ..() - AddComponent(/datum/component/selling, 60, "weed_pack", TRUE, -1, 7) diff --git a/modular_darkpack/modules/drugs/code/weed/weedseed.dm b/modular_darkpack/modules/drugs/code/weed/weedseed.dm deleted file mode 100644 index 05c7213e398b..000000000000 --- a/modular_darkpack/modules/drugs/code/weed/weedseed.dm +++ /dev/null @@ -1,6 +0,0 @@ -/obj/item/weedseed - name = "seed" - desc = "Green and smelly..." - icon_state = "seed" - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - w_class = WEIGHT_CLASS_SMALL diff --git a/modular_darkpack/modules/drugs/icons/growing.dmi b/modular_darkpack/modules/drugs/icons/growing.dmi new file mode 100644 index 000000000000..26543d3577c5 Binary files /dev/null and b/modular_darkpack/modules/drugs/icons/growing.dmi differ diff --git a/modular_darkpack/modules/drugs/icons/items.dmi b/modular_darkpack/modules/drugs/icons/items.dmi index 9d1d16bbbd68..8de07adca726 100644 Binary files a/modular_darkpack/modules/drugs/icons/items.dmi and b/modular_darkpack/modules/drugs/icons/items.dmi differ diff --git a/modular_darkpack/modules/drugs/icons/onfloor.dmi b/modular_darkpack/modules/drugs/icons/onfloor.dmi new file mode 100644 index 000000000000..e6ec4120af8a Binary files /dev/null and b/modular_darkpack/modules/drugs/icons/onfloor.dmi differ diff --git a/modular_darkpack/modules/drugs/icons/tray.dmi b/modular_darkpack/modules/drugs/icons/tray.dmi new file mode 100644 index 000000000000..b502f81361ef Binary files /dev/null and b/modular_darkpack/modules/drugs/icons/tray.dmi differ diff --git a/modular_darkpack/modules/deprecated/sounds/heatdam.ogg b/modular_darkpack/modules/drugs/sounds/heatdam.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/heatdam.ogg rename to modular_darkpack/modules/drugs/sounds/heatdam.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/lungbust_cough1.ogg b/modular_darkpack/modules/drugs/sounds/lungbust_cough1.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/lungbust_cough1.ogg rename to modular_darkpack/modules/drugs/sounds/lungbust_cough1.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/lungbust_cough2.ogg b/modular_darkpack/modules/drugs/sounds/lungbust_cough2.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/lungbust_cough2.ogg rename to modular_darkpack/modules/drugs/sounds/lungbust_cough2.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/lungbust_moan1.ogg b/modular_darkpack/modules/drugs/sounds/lungbust_moan1.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/lungbust_moan1.ogg rename to modular_darkpack/modules/drugs/sounds/lungbust_moan1.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/lungbust_moan2.ogg b/modular_darkpack/modules/drugs/sounds/lungbust_moan2.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/lungbust_moan2.ogg rename to modular_darkpack/modules/drugs/sounds/lungbust_moan2.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/lungbust_moan3.ogg b/modular_darkpack/modules/drugs/sounds/lungbust_moan3.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/lungbust_moan3.ogg rename to modular_darkpack/modules/drugs/sounds/lungbust_moan3.ogg diff --git a/modular_darkpack/modules/dwelling/code/obj_dwelling.dm b/modular_darkpack/modules/dwelling/code/obj_dwelling.dm index e3b9d132f2ea..7d0e55cd4487 100644 --- a/modular_darkpack/modules/dwelling/code/obj_dwelling.dm +++ b/modular_darkpack/modules/dwelling/code/obj_dwelling.dm @@ -169,7 +169,7 @@ if("major") to_chat(user, span_notice("Both the door and the security system are top notch. Robbing this house is risky but should carry a decent reward. If triggered, the security system will need to be reset every thirty seconds.")) if("moderate") - to_chat(user, span_notice("The door and security system seem average for San Francisco. Robbing this house carries a moderate risk and moderate rewards. If triggered, the security system will need to be reset every two minutes. ")) + to_chat(user, span_notice("The door and security system seem average for [CITY_NAME]. Robbing this house carries a moderate risk and moderate rewards. If triggered, the security system will need to be reset every two minutes. ")) if("minor") to_chat(user, span_notice("The door and security system seem to be of poor quality. Robbing this house should provide minor rewards, but the security system can be disabled completely.")) area_reference.cased_by.Add(user) @@ -270,12 +270,7 @@ /obj/structure/vtm/dwelling_alarm/proc/contact_cops() //Contains the actual act of yelling at cops var/randomized_response_time = rand(1 SECONDS, 30 SECONDS) sleep(randomized_response_time) - for(var/obj/item/police_radio/radio in GLOB.police_radios) - radio.announce_crime("burglary", get_turf(src)) - for(var/obj/machinery/p25transceiver/police/transceiver in GLOB.p25_transceivers) - if(transceiver.p25_network == "police") - transceiver.announce_crime("burglary", get_turf(src)) - break + SEND_SIGNAL(SSdcs, COMSIG_GLOB_REPORT_CRIME, CRIME_BURGLARY, get_turf(src)) /obj/structure/vtm/dwelling_alarm/proc/alarm_trigger() //Starts the alarm for the house, calls cops area_reference.alarm_trigerred = 1 diff --git a/modular_darkpack/modules/economy/code/account.dm b/modular_darkpack/modules/economy/code/account.dm index 6475e88fedf0..d9ea1635d3d5 100644 --- a/modular_darkpack/modules/economy/code/account.dm +++ b/modular_darkpack/modules/economy/code/account.dm @@ -39,3 +39,26 @@ else times_used_without_pin += 1 return TRUE + +/// Your bank account ID, can't get into it without it +/datum/memory/key/bank_pin + var/remembered_id + +/datum/memory/key/bank_pin/New( + datum/mind/memorizer_mind, + atom/protagonist, + atom/deuteragonist, + atom/antagonist, + remembered_id, +) + src.remembered_id = remembered_id + return ..() + +/datum/memory/key/bank_pin/get_names() + return list("The bank pin of [protagonist_name], [remembered_id].") + +/datum/memory/key/bank_pin/get_starts() + return list( + "[protagonist_name] flexing their last brain cells, proudly showing their lucky numbers [remembered_id].", + "[remembered_id]. The numbers mason, what do they mean!?", + ) diff --git a/modular_darkpack/modules/economy/code/atm.dm b/modular_darkpack/modules/economy/code/atm.dm index a0674865a9ef..a5ec55400a22 100644 --- a/modular_darkpack/modules/economy/code/atm.dm +++ b/modular_darkpack/modules/economy/code/atm.dm @@ -1,42 +1,58 @@ /obj/machinery/atm - name = "ATM Machine" - desc = "Check your balance or make a transaction" + name = "\improper ATM machine" + desc = "Check your balance or make a transaction." icon = 'modular_darkpack/modules/economy/icons/atm.dmi' icon_state = "atm" anchored = TRUE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF - var/logged_in = FALSE - var/entered_code - var/atm_balance = 0 - var/obj/item/card/credit/current_card = null - //light_system = STATIC_LIGHT + max_integrity = 250 + damage_deflection = 20 + light_color = COLOR_GREEN light_range = 2 - light_power = 1 - light_on = TRUE -/obj/machinery/atm/attackby(obj/item/P, mob/user, params) - if(is_creditcard(P)) + circuit = /obj/item/circuitboard/machine/atm + + var/logged_in = FALSE + var/total_stored_cash = 0 + var/inserted_cash = 0 + // Just because there is account selected does not nesicarrly indicate logged_in is true. (you still have to enter your pin) + var/datum/bank_account/logged_account + +/obj/machinery/atm/Initialize(mapload) + . = ..() + if(mapload) + total_stored_cash = rand(1000, 10000) + +/obj/machinery/atm/on_deconstruction(disassembled) + dump_cash() + SEND_SIGNAL(SSdcs, COMSIG_GLOB_REPORT_CRIME, CRIME_ATM_TAMPERING, get_turf(src)) + +/obj/machinery/atm/examine(mob/user) + . = ..() + if(logged_account) + . += span_notice("The screen is active with an account logged in.") + +/obj/machinery/atm/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(is_creditcard(tool)) + var/obj/item/card/credit/card = tool if(logged_in) to_chat(user, span_notice("Someone is already logged in.")) - return - current_card = P + return ITEM_INTERACT_BLOCKING + logged_account = card.registered_account to_chat(user, span_notice("Card swiped.")) - return - - else if(iscash(P)) + return ITEM_INTERACT_SUCCESS + else if(iscash(tool)) if(!logged_in) to_chat(user, span_notice("You need to be logged in.")) - return - else - atm_balance += P.get_item_credit_value() - to_chat(user, span_notice("You have deposited [P.get_item_credit_value()] dollars into the ATM. The ATM now holds [atm_balance] dollars.")) - qdel(P) - return + return ITEM_INTERACT_BLOCKING + var/value = tool.get_item_credit_value() + inserted_cash += value + to_chat(user, span_notice("You have deposited [value] dollars into [src]. [src] now holds [inserted_cash] dollars.")) + qdel(tool) + return ITEM_INTERACT_SUCCESS /obj/machinery/atm/ui_interact(mob/user, datum/tgui/ui) - . = ..() ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "Atm", name) @@ -44,39 +60,19 @@ /obj/machinery/atm/ui_data(mob/user) var/list/data = list() - var/list/accounts = list() - - for(var/account_id in SSeconomy.bank_accounts_by_id) - var/datum/bank_account/account = SSeconomy.bank_accounts_by_id[account_id] - if(!account) - continue - if(account && account.account_holder) - accounts += list( - list("account_holder" = account.account_holder - ) - ) - else - accounts += list( - list( - "account_holder" = "Unnamed Account" - ) - ) - data["logged_in"] = logged_in - data["card"] = current_card ? TRUE : FALSE - data["entered_code"] = entered_code - data["atm_balance"] = atm_balance - data["bank_account_list"] = json_encode(accounts) - if(current_card) - data["account_balance"] = current_card.registered_account.account_balance - data["account_holder"] = current_card.registered_account.account_holder - data["account_id"] = current_card.registered_account.account_id - data["bank_pin"] = current_card.registered_account.bank_pin + data["card"] = logged_account ? TRUE : FALSE + data["inserted_cash"] = inserted_cash + if(logged_account) + data["account_balance"] = logged_account.account_balance + data["account_holder"] = logged_account.account_holder + data["account_id"] = logged_account.account_id + data["bank_pin"] = logged_account.bank_pin else - data["account_balance"] = 0 - data["account_holder"] = "" - data["account_id"] = "" - data["bank_pin"] = "" + data["account_balance"] = null + data["account_holder"] = null + data["account_id"] = null + data["bank_pin"] = null return data @@ -84,69 +80,69 @@ . = ..() if(.) return + if(!logged_account) + to_chat(usr, span_notice("You need to swipe your card before interacting with [src].")) + return FALSE switch(action) if("login") - if(params["bank_pin"] == current_card.registered_account.bank_pin) + if(params["bank_pin"] == logged_account.bank_pin) logged_in = TRUE return TRUE else return FALSE if("logout") logged_in = FALSE - entered_code = "" - current_card = null + logged_account = null return TRUE if("withdraw") - var/amount = text2num(params["withdraw_amount"]) - if(amount != round(amount)) - to_chat(usr, "<span class='notice'>Withdraw amount must be a round number.") - else if(current_card.registered_account.account_balance < amount) - to_chat(usr, span_notice("Insufficient funds.")) - else - while(amount > 0) - var/drop_amount = min(amount, 1000) - var/obj/item/stack/dollar/cash = new /obj/item/stack/dollar(loc, drop_amount) - to_chat(usr, span_notice("You have withdrawn [drop_amount] dollars.")) - try_put_in_hand(cash, usr) - amount -= drop_amount - current_card.registered_account.account_balance -= drop_amount + var/amount = round(text2num(params["withdraw_amount"])) + dispense_cash(amount, usr) return TRUE - if("transfer") - var/amount = text2num(params["transfer_amount"]) - if(!amount || amount <= 0) - to_chat(usr, span_notice("Invalid transfer amount.")) - return FALSE - - var/target_account_id = params["target_account"] - if(!target_account_id) - to_chat(usr, span_notice("Invalid target account ID.")) - return FALSE - - var/datum/bank_account/target_account = SSeconomy.bank_accounts_by_id[target_account_id] - - if(!target_account) - to_chat(usr, span_notice("Invalid target account.")) - return FALSE - if(current_card.registered_account.account_balance < amount) - to_chat(usr, span_notice("Insufficient funds.")) - return FALSE - - current_card.registered_account.account_balance -= amount - target_account.account_balance += amount - to_chat(usr, span_notice("You have transferred [amount] dollars to account [target_account.account_holder].")) - return TRUE - if("change_pin") var/new_pin = params["new_pin"] - current_card.registered_account.bank_pin = new_pin + logged_account.bank_pin = new_pin return TRUE if("deposit") - if(atm_balance > 0) - current_card.registered_account.account_balance += atm_balance - to_chat(usr, span_notice("You have deposited [atm_balance] dollars into your card. Your new balance is [current_card.registered_account.account_balance] dollars.")) - atm_balance = 0 + if(inserted_cash > 0) + logged_account.adjust_money(inserted_cash, "ATM: Deposit") + to_chat(usr, span_notice("You have deposited [inserted_cash] dollars into your card. Your new balance is [logged_account.account_balance] dollars.")) + total_stored_cash += inserted_cash + inserted_cash = 0 return TRUE - else - to_chat(usr, span_notice("The ATM is empty. Nothing to deposit.")) + to_chat(usr, span_notice("[src] is empty. Nothing to deposit.")) return TRUE + +/obj/machinery/atm/proc/dispense_cash(amount, mob/user) + if(logged_account.account_balance < amount) + to_chat(usr, span_notice("Insufficient funds.")) + return + var/amount_drawn = 0 + while(amount > 0) + var/drop_amount = min(amount, 1000) + if(drop_amount > total_stored_cash) + to_chat(user, span_notice("[src] has maxed out its withdraw limit")) + break + var/obj/item/stack/dollar/cash = new(loc, drop_amount) + to_chat(user, span_notice("You have withdrawn [drop_amount] dollars.")) + try_put_in_hand(cash, user) + amount -= drop_amount + total_stored_cash -= drop_amount + amount_drawn += drop_amount + logged_account.adjust_money(-amount_drawn, "ATM: Withdraw") + +/obj/machinery/atm/proc/dump_cash() + while(total_stored_cash > 0) + var/drop_amount = min(total_stored_cash, 1000) + new /obj/item/stack/dollar(loc, drop_amount) + total_stored_cash -= drop_amount + +/obj/item/circuitboard/machine/atm + name = "\improper ATM Machine" + greyscale_colors = CIRCUIT_COLOR_GENERIC + build_path = /obj/machinery/atm + req_components = list( + /obj/item/stack/sheet/glass = 1, + /datum/stock_part/servo = 2, + ) + diff --git a/modular_darkpack/modules/economy/code/credit_card.dm b/modular_darkpack/modules/economy/code/credit_card.dm index cc173a82f3f6..800834ca3cd2 100644 --- a/modular_darkpack/modules/economy/code/credit_card.dm +++ b/modular_darkpack/modules/economy/code/credit_card.dm @@ -8,6 +8,7 @@ w_class = WEIGHT_CLASS_SMALL resistance_flags = FIRE_PROOF | ACID_PROOF ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + slot_flags = NONE var/registered_name var/datum/bank_account/registered_account @@ -72,7 +73,7 @@ /obj/item/card/credit/GetCreditCard() return src -/datum/outfit/job/post_equip(mob/living/carbon/human/user, visuals_only = FALSE) +/datum/outfit/job/vampire/post_equip(mob/living/carbon/human/user, visuals_only = FALSE) . = ..() var/obj/item/storage/backpack/b = locate() in user diff --git a/modular_darkpack/modules/economy/code/selling/lombard.dm b/modular_darkpack/modules/economy/code/selling/lombard.dm index 4bae1a02c2d0..0a1926c0fb41 100644 --- a/modular_darkpack/modules/economy/code/selling/lombard.dm +++ b/modular_darkpack/modules/economy/code/selling/lombard.dm @@ -147,11 +147,11 @@ to_chat(user, span_warning("[black_market ? "This" : "The pawnshop"] doesn't accept [selling_comp.illegal ? "illegal" : "legal"] goods.")) return - if(!user.CanReach(src)) + if(!src.IsReachableBy(user)) to_chat(user, span_warning("You're too far from [src]!")) return - if(!user.CanReach(sold)) + if(!sold.IsReachableBy(user)) to_chat(user, span_warning("You can't reach [sold]!")) return @@ -172,7 +172,7 @@ // Humanity loss warning for bulk sales if(selling_comp.humanity_loss && ishuman(user)) var/mob/living/carbon/human/H = user - var/datum/species/human/kindred/vampirism = H.dna.species + var/datum/splat/vampire/kindred/vampirism = iskindred(H) if(!iskindred(H) || !vampirism.enlightenment) var/humanity_loss_modifier = HAS_TRAIT(H, TRAIT_SENSITIVE_HUMANITY) ? 2 : 1 var/total_humanity_risk = length(items_to_sell) * humanity_loss_modifier * selling_comp.humanity_loss @@ -187,7 +187,7 @@ if(choice == "No") return - if(!user.CanReach(src) || !user.CanReach(sold)) + if(!src.IsReachableBy(user) || !sold.IsReachableBy(user)) return var/list/sold_items = sell_multiple_items(items_to_sell, user) diff --git a/modular_darkpack/modules/economy/code/selling/selling.dm b/modular_darkpack/modules/economy/code/selling/selling.dm index 7c5127c26892..5b7140e4dd46 100644 --- a/modular_darkpack/modules/economy/code/selling/selling.dm +++ b/modular_darkpack/modules/economy/code/selling/selling.dm @@ -56,7 +56,7 @@ // If we found a seller and they're on Enlightenment path, no warning if(seller && iskindred(seller)) - var/datum/species/human/kindred/vampirism = seller.dna.species + var/datum/splat/vampire/kindred/vampirism = iskindred(seller) if(vampirism.enlightenment) return span_notice("You've sold [parent]!") diff --git a/modular_darkpack/modules/economy/code/stocks_license.dm b/modular_darkpack/modules/economy/code/stocks_license.dm index e85e4cf9e106..df35dd249fa9 100644 --- a/modular_darkpack/modules/economy/code/stocks_license.dm +++ b/modular_darkpack/modules/economy/code/stocks_license.dm @@ -15,11 +15,11 @@ if(name == "unidentified stocks trading license") if(ishuman(user)) var/mob/living/carbon/human/H = user - var/obj/item/stocks_license/CR = get_fuckin_card_number(H.true_real_name) + var/obj/item/stocks_license/CR = get_fuckin_card_number(H.real_name) if(CR) return - name = "[H.true_real_name]'s stocks trading license" - whose = H.true_real_name + name = "[H.real_name]'s stocks trading license" + whose = H.real_name /obj/item/stocks_license/Initialize(mapload) . = ..() diff --git a/modular_darkpack/modules/economy/readme.md b/modular_darkpack/modules/economy/readme.md index 88d0ce79cb44..489347fece62 100644 --- a/modular_darkpack/modules/economy/readme.md +++ b/modular_darkpack/modules/economy/readme.md @@ -18,7 +18,7 @@ E.g: --> - `code/game/objects/items/cards_ids.dm`: `proc/obj/item/card/id/Initialize`, `proc/obj/item/card/id/examine` -- `code/modules/jobs/job_types/_job.dm`: `proc/datum/outfit/job/post_equip` +- `code/modules/jobs/job_types/_job.dm`: `proc/datum/outfit/job/vampire/post_equip` - `modular_darkpack/master_files/code/modules/economy/account.dm`: `/datum/bank_account/New` ### Modular Overrides: diff --git a/modular_darkpack/modules/effects/code/reflection.dm b/modular_darkpack/modules/effects/code/reflection.dm index 894e5d7b0cfc..efac56a60303 100644 --- a/modular_darkpack/modules/effects/code/reflection.dm +++ b/modular_darkpack/modules/effects/code/reflection.dm @@ -1,7 +1,7 @@ /obj/effect/reflection name = "reflection" appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE - mouse_opacity = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT vis_flags = VIS_HIDE layer = ABOVE_OBJ_LAYER var/alpha_icon = 'icons/obj/watercloset.dmi' diff --git a/modular_darkpack/modules/electricity/code/fusebox.dm b/modular_darkpack/modules/electricity/code/fusebox.dm index 6712e4bf4b46..ec09bb1e89df 100644 --- a/modular_darkpack/modules/electricity/code/fusebox.dm +++ b/modular_darkpack/modules/electricity/code/fusebox.dm @@ -4,6 +4,7 @@ desc = "Power the controlled area with pure electricity." icon = 'modular_darkpack/modules/electricity/icons/electricity.dmi' icon_state = "fusebox" + base_icon_state = "fusebox" layer = SIGN_LAYER anchored = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF @@ -15,19 +16,31 @@ var/open = FALSE //Repairing var for the loop var/repairing = FALSE + //Soundloop for Transformers + var/datum/looping_sound/generator/soundloop -/obj/fusebox/update_icon(updates) +/obj/fusebox/update_icon_state() . = ..() if(damaged > 100) - icon_state = "fusebox_open" + icon_state = "[base_icon_state]_off" else - icon_state = "fusebox" + icon_state = base_icon_state + +/obj/fusebox/proc/update_sound_state() + if(!isnull(soundloop)) + if(damaged > 100) + soundloop.stop() + else + soundloop.start(src) /obj/fusebox/proc/check_damage(mob/living/user) if(damaged > 100 && !open) open = TRUE var/area/power_area = get_area(src) - power_area.requires_power = TRUE + power_area.power_light = FALSE + power_area.power_equip = FALSE + power_area.power_environ = FALSE + power_area.power_change() power_area.fire_controled = FALSE var/datum/effect_system/spark_spread/local_spark = new /datum/effect_system/spark_spread local_spark.set_up(5, 1, get_turf(src)) @@ -37,20 +50,25 @@ playsound(loc, 'modular_darkpack/modules/electricity/sounds/generator_break.ogg', 100, TRUE) user?.electrocute_act(50, src, siemens_coeff = 1, flags = NONE) update_icon() + update_sound_state() /obj/fusebox/attackby(obj/item/I, mob/living/user, params) if(I.tool_behaviour == TOOL_WIRECUTTER) if(!repairing) repairing = TRUE if(do_after(user, 10 SECONDS, src)) - icon_state = "fusebox" damaged = 0 + update_icon_state() + update_sound_state() playsound(get_turf(src),'modular_darkpack/modules/electricity/sounds/fusebox_fix.ogg', 50, FALSE) - var/area/A = get_area(src) - A.requires_power = FALSE - if(initial(A.fire_controled)) - A.fire_controled = TRUE - for(var/obj/machinery/light/L in A) + var/area/power_area = get_area(src) + power_area.power_light = TRUE + power_area.power_equip = TRUE + power_area.power_environ = TRUE + power_area.power_change() + if(initial(power_area.fire_controled)) + power_area.fire_controled = TRUE + for(var/obj/machinery/light/L in power_area) L.update(FALSE) repairing = FALSE else @@ -60,3 +78,16 @@ if(I.force) damaged += I.force check_damage(user) + +// transformers (another type of fusebox) +/obj/fusebox/transformer + name = "transformer" + icon_state = "sstation" + base_icon_state = "sstation" + pixel_y = 0 + density = 1 + +/obj/fusebox/transformer/Initialize(mapload) + . = ..() + soundloop = new(src, TRUE) + diff --git a/modular_darkpack/modules/electricity/icons/electricity.dmi b/modular_darkpack/modules/electricity/icons/electricity.dmi index ce56a354eec3..972a11bf4869 100644 Binary files a/modular_darkpack/modules/electricity/icons/electricity.dmi and b/modular_darkpack/modules/electricity/icons/electricity.dmi differ diff --git a/modular_darkpack/modules/elevators/code/elevator.dm b/modular_darkpack/modules/elevators/code/elevator.dm new file mode 100644 index 000000000000..4b94f9f1ed73 --- /dev/null +++ b/modular_darkpack/modules/elevators/code/elevator.dm @@ -0,0 +1,55 @@ +/obj/machinery/door/airlock/elevator + name = "elevator door" + icon = 'modular_darkpack/modules/elevators/icons/doorleft.dmi' + icon_state = "closed" + abstract_type = /obj/machinery/door/airlock/elevator + doorOpen = 'modular_darkpack/modules/elevators/sounds/elevatoropen.ogg' + doorClose = 'modular_darkpack/modules/elevators/sounds/elevatorclose.ogg' + doorDeni = null + + overlays_file = null + +/obj/machinery/door/airlock/elevator/Initialize(mapload) // I took this from transport_module.dm and the comment there says 'linter and stuff' so I hope this fixes my checks + if(!isnull(transport_linked_id)) + elevator_mode = TRUE + return ..() + +/obj/machinery/door/airlock/elevator/left + icon = 'modular_darkpack/modules/elevators/icons/doorleft.dmi' + assemblytype = /obj/structure/door_assembly/elevator/left + +/obj/machinery/door/airlock/elevator/right + icon = 'modular_darkpack/modules/elevators/icons/doorright.dmi' + assemblytype = /obj/structure/door_assembly/elevator/right + +/obj/machinery/door/airlock/elevator/multi_tile + icon = 'modular_darkpack/modules/elevators/icons/doordouble.dmi' + assemblytype = /obj/structure/door_assembly/elevator/multi_tile + multi_tile = TRUE + +/obj/machinery/door/airlock/elevator/multi_tile/setDir(newdir) + . = ..() + set_bounds() + +/obj/structure/door_assembly/elevator + name = "door assembly" + base_name = "elevator door" + icon = 'modular_darkpack/modules/elevators/icons/doorleft.dmi' + icon_state = "construction" + abstract_type = /obj/structure/door_assembly/elevator + overlays_file = null + anchored = FALSE + density = TRUE + +/obj/structure/door_assembly/elevator/left + icon = 'modular_darkpack/modules/elevators/icons/doorleft.dmi' + +/obj/structure/door_assembly/elevator/right + icon = 'modular_darkpack/modules/elevators/icons/doorright.dmi' + +/obj/structure/door_assembly/elevator/multi_tile + name = "door assembly" + icon = 'modular_darkpack/modules/elevators/icons/doordouble.dmi' + airlock_type = /obj/machinery/door/airlock/elevator/multi_tile + dir = EAST + multi_tile = TRUE diff --git a/modular_darkpack/modules/elevators/icons/buttons.dmi b/modular_darkpack/modules/elevators/icons/buttons.dmi new file mode 100644 index 000000000000..0d311ddf3bbe Binary files /dev/null and b/modular_darkpack/modules/elevators/icons/buttons.dmi differ diff --git a/modular_darkpack/modules/elevators/icons/doordouble.dmi b/modular_darkpack/modules/elevators/icons/doordouble.dmi new file mode 100644 index 000000000000..2f474971f5f4 Binary files /dev/null and b/modular_darkpack/modules/elevators/icons/doordouble.dmi differ diff --git a/modular_darkpack/modules/elevators/icons/doorleft.dmi b/modular_darkpack/modules/elevators/icons/doorleft.dmi new file mode 100644 index 000000000000..fdb05cfeaaf2 Binary files /dev/null and b/modular_darkpack/modules/elevators/icons/doorleft.dmi differ diff --git a/modular_darkpack/modules/elevators/icons/doorright.dmi b/modular_darkpack/modules/elevators/icons/doorright.dmi new file mode 100644 index 000000000000..4350d468c2af Binary files /dev/null and b/modular_darkpack/modules/elevators/icons/doorright.dmi differ diff --git a/modular_darkpack/modules/elevators/sounds/elevatorclose.ogg b/modular_darkpack/modules/elevators/sounds/elevatorclose.ogg new file mode 100644 index 000000000000..0ca63cc4c6e6 Binary files /dev/null and b/modular_darkpack/modules/elevators/sounds/elevatorclose.ogg differ diff --git a/modular_darkpack/modules/elevators/sounds/elevatoropen.ogg b/modular_darkpack/modules/elevators/sounds/elevatoropen.ogg new file mode 100644 index 000000000000..7728a614d28b Binary files /dev/null and b/modular_darkpack/modules/elevators/sounds/elevatoropen.ogg differ diff --git a/modular_darkpack/modules/fire/code/fire.dm b/modular_darkpack/modules/fire/code/fire.dm index ce9856fca650..40ff5f634040 100644 --- a/modular_darkpack/modules/fire/code/fire.dm +++ b/modular_darkpack/modules/fire/code/fire.dm @@ -1,212 +1,264 @@ -SUBSYSTEM_DEF(die_in_a_fire) - name = "Die In A Fire" - init_order = INIT_ORDER_DEFAULT - wait = 10 - priority = FIRE_PRIORITY_DEFAULT +#define TURF_FIRE_REQUIRED_TEMP (T0C+10) +#define TURF_FIRE_TEMP_BASE (T0C+100) +#define TURF_FIRE_POWER_LOSS_ON_LOW_TEMP 7 +#define TURF_FIRE_TEMP_INCREMENT_PER_POWER 3 +#define TURF_FIRE_VOLUME 150 +#define TURF_FIRE_MAX_POWER 50 + +#define TURF_FIRE_ENERGY_PER_BURNED_OXY_MOL 30000 +#define TURF_FIRE_BURN_RATE_BASE 0.12 +#define TURF_FIRE_BURN_RATE_PER_POWER 0.02 +#define TURF_FIRE_BURN_CARBON_DIOXIDE_MULTIPLIER 0.75 +#define TURF_FIRE_BURN_MINIMUM_OXYGEN_REQUIRED 0.5 +#define TURF_FIRE_BURN_PLAY_SOUND_EFFECT_CHANCE 6 + +/// Minimum fire power required to spread to other turfs +#define TURF_FIRE_MIN_POWER_TO_SPREAD 20 +/// Multiplier for the probability of spreading to adjacent tiles and how much power the new fires have +#define TURF_FIRE_SPREAD_RATE 0.3 + +#define TURF_FIRE_STATE_SMALL 1 +#define TURF_FIRE_STATE_MEDIUM 2 +#define TURF_FIRE_STATE_LARGE 3 + +/obj/effect/abstract/turf_fire + icon = 'modular_darkpack/modules/fire/icons/turf_fire.dmi' + base_icon_state = "red" + icon_state = "red_small" + layer = BELOW_OPEN_DOOR_LAYER + anchored = TRUE + move_resist = INFINITY + light_range = 1.5 + light_power = 1.5 + light_color = LIGHT_COLOR_FIRE + mouse_opacity = FALSE + /// How much power have we got. This is treated like fuel, be it flamethrower liquid or any random thing you could come up with + var/fire_power = 20 + /// If false, it does not interact with atmos. + var/interact_with_atmos = TRUE - var/list/currentrun = list() + /// If false, it will not lose power by itself. Mainly for adminbus events or mapping. + var/passive_loss = TRUE -/datum/controller/subsystem/die_in_a_fire/fire(resumed = FALSE) - if (!resumed) - var/list/activelist = GLOB.fires_list - src.currentrun = activelist.Copy() + /// Visual state of the fire. Kept track to not do too many updates. + var/current_fire_state - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun + /// the list of allowed colors, if fire_color doesn't match, we store the color in hex_color instead and we color the fire based on hex instead + var/list/allowed_colors = list("red", "blue", "green", "white") - while(currentrun.len) - var/obj/effect/fire/F = currentrun[currentrun.len] - --currentrun.len + /// If we are using a custom hex color, which color are we using? + var/hex_color - if (QDELETED(F)) // Some issue causes nulls to get into this list some times. This keeps it running, but the bug is still there. - GLOB.fires_list -= F - log_world("Found a null in fires list!") - continue +///All the subtypes are for adminbussery and or mapping +/obj/effect/abstract/turf_fire/magical + interact_with_atmos = FALSE + passive_loss = FALSE - //NPC.observed_by_player() - if(MC_TICK_CHECK) - return - F.handle_automated_spread() +/obj/effect/abstract/turf_fire/small + fire_power = 10 -/obj/effect/fire - name = "fire" - icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' - icon_state = "fire" - layer = FLY_LAYER - anchored = TRUE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - var/stage = 1 - plane = ABOVE_LIGHTING_PLANE - layer = ABOVE_LIGHTING_LAYER - -/obj/structure - var/pepeled = FALSE - -/obj/structure/proc/pepel() - if(!pepeled) - pepeled = TRUE - color = "#808080" - -/obj/effect/fire/proc/handle_automated_spread() - playsound(get_turf(src), 'modular_darkpack/modules/deprecated/sounds/fire.ogg', 80, TRUE) - var/area/AR = get_area(src) - if(AR.fire_controled) - AR.fire_extinguishment() - for(var/obj/effect/decal/cleanable/gasoline/G in loc) - qdel(G) - for(var/mob/living/L in loc) - L.fire_stacks += 5 - L.IgniteMob() - L.apply_damage(10*stage, BURN, BODY_ZONE_CHEST) - for(var/obj/machinery/light/M in loc) - if(M.status != LIGHT_BROKEN && M.status != LIGHT_EMPTY) - M.break_light_tube() - for(var/obj/S in loc) - var/breakable = TRUE - if(S.resistance_flags & INDESTRUCTIBLE) - breakable = FALSE - if(breakable) - S.fire_act(1000) - if(istype(S, /obj/structure/flora/tree/vamp)) - var/obj/structure/flora/tree/vamp/T = S - T.burnshit() -// if(!isitem(S)) -// S.take_damage(10*stage, BURN, MELEE, 1) - for(var/obj/effect/decal/cleanable/blood/B in loc) - B.dry() - for(var/obj/structure/vampdoor/V in loc) - if(V.burnable) - V.break_door() - V.color = "#808080" - var/total_burn = 0 - if(istype(get_turf(src), /turf/open/floor)) - var/turf/open/floor/A = get_turf(src) - A.burn_material = max(0, A.burn_material-(1*stage)) - total_burn += A.burn_material - if(prob(A.spread_chance)) - change_stage(min(3, stage+1)) - if(A.burn_material == 0) - new /obj/effect/decal/cleanable/fire_ash(A) - A.spread_chance = initial(A.spread_chance) - if(total_burn) - for(var/turf/open/floor/A in range(1, src)) - var/obj/structure/vampdoor/V = locate() in A - var/allowed_to_spread = FALSE - - if(!V) - allowed_to_spread = TRUE - else - if(!V.opacity) - allowed_to_spread = TRUE - if(V.burnable) - allowed_to_spread = TRUE - - if(allowed_to_spread) - if(A != loc && A.burn_material) - var/obj/effect/fire/F = locate() in A - if(!F && prob(A.spread_chance)) - playsound(get_turf(A), 'modular_darkpack/modules/deprecated/sounds/spread.ogg', 80, TRUE) - var/obj/effect/fire/R = new(A) - R.color = color - else - qdel(src) - -/obj/effect/fire/Crossed(atom/movable/AM, oldloc) - . = ..() - if(isliving(AM)) - var/mob/living/L = AM - L.fire_stacks += 5 - L.IgniteMob() +/obj/effect/abstract/turf_fire/small/magical + interact_with_atmos = FALSE + passive_loss = FALSE -/obj/effect/fire/Initialize(mapload) - . = ..() +/obj/effect/abstract/turf_fire/inferno + fire_power = 30 - set_light(3, 2, "#ffa800") - GLOB.fires_list += src +/obj/effect/abstract/turf_fire/inferno/magical + interact_with_atmos = FALSE + passive_loss = FALSE -/obj/effect/fire/Destroy() +/obj/effect/abstract/turf_fire/Initialize(mapload, power, fire_color) . = ..() + var/turf/open/open_turf = loc + if(open_turf.turf_fire) + return INITIALIZE_HINT_QDEL + + /* + var/datum/gas_mixture/environment = open_turf.air + var/oxy = environment.get_moles(GAS_O2) + if (oxy < TURF_FIRE_BURN_MINIMUM_OXYGEN_REQUIRED) + return INITIALIZE_HINT_QDEL + */ + + particles = new /particles/smoke/turf_fire + + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + + if(!fire_color) + base_icon_state = "red" + else if(fire_color in allowed_colors) + base_icon_state = fire_color + else + hex_color = fire_color + color = fire_color + base_icon_state = "greyscale" + + switch(base_icon_state) //switches light color depdning on the flame color + if("greyscale") + light_color = hex_color + if("red") + light_color = LIGHT_COLOR_FIRE + if("blue") + light_color = LIGHT_COLOR_CYAN + if("green") + light_color = LIGHT_COLOR_GREEN + else + light_color = COLOR_VERY_LIGHT_GRAY + + open_turf.turf_fire = src + START_PROCESSING(SSturf_fire, src) + if(power) + fire_power = min(TURF_FIRE_MAX_POWER, power) + UpdateFireState() + + if(!mapload) + playsound(src, 'modular_darkpack/modules/fire/sounds/spread.ogg', 80, TRUE) + +/obj/effect/abstract/turf_fire/Destroy() + var/turf/open/open_turf = loc + open_turf.turf_fire = null + STOP_PROCESSING(SSturf_fire, src) + return ..() + +/obj/effect/abstract/turf_fire/proc/process_waste() + var/turf/open/open_turf = loc + if(open_turf.planetary_atmos) + return TRUE + + /* + var/datum/gas_mixture/cached_air = open_turf.air + + var/oxy = cached_air.get_moles(GAS_O2) + if (oxy < TURF_FIRE_BURN_MINIMUM_OXYGEN_REQUIRED) + return FALSE + + var/temperature = cached_air.return_temperature() + var/old_heat_capacity = cached_air.heat_capacity() + + var/burn_rate = TURF_FIRE_BURN_RATE_BASE + fire_power * TURF_FIRE_BURN_RATE_PER_POWER + burn_rate = max(oxy, burn_rate) + + cached_air.adjust_moles(GAS_O2, -burn_rate) + + cached_air.adjust_moles(GAS_CO2, burn_rate * TURF_FIRE_BURN_CARBON_DIOXIDE_MULTIPLIER) + + var/new_heat_capacity = cached_air.heat_capacity() + var/energy_released = burn_rate * TURF_FIRE_ENERGY_PER_BURNED_OXY_MOL + cached_air.adjust_heat((temperature * old_heat_capacity + energy_released) / new_heat_capacity) + + open_turf.air_update_turf() + */ + return TRUE + +/obj/effect/abstract/turf_fire/process(seconds_per_tick) + var/turf/current_turf = loc + if(!isopenturf(current_turf)) //This can happen, how I'm not sure + qdel(src) + return + var/turf/open/open_turf = loc + if(open_turf.active_hotspot) //If we have an active hotspot, let it do the damage instead and lets not loose power + return + if(interact_with_atmos) + if(!process_waste()) + qdel(src) + return - set_light(0) - GLOB.fires_list -= src - -/obj/effect/fire/proc/change_stage(stag) - switch(stag) - if(0) + if(passive_loss) + if(open_turf.air.return_temperature() < TURF_FIRE_REQUIRED_TEMP) + fire_power -= TURF_FIRE_POWER_LOSS_ON_LOW_TEMP + //var/area/fire_area = get_area(src) + //if(fire_area.active_weather?.fire_suppression) + // fire_power -= fire_area.active_weather.fire_suppression + fire_power = min(fire_power + open_turf.flammability - 1, TURF_FIRE_MAX_POWER) + if(fire_power <= 0) qdel(src) - if(1) - stage = 1 - icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' - if(2) - stage = 2 - icon = 'modular_darkpack/modules/deprecated/icons/32x48.dmi' - if(3) - stage = 3 - icon = 'modular_darkpack/modules/deprecated/icons/64x64.dmi' - -/turf/open/floor/Initialize(mapload) + return + for(var/turf/open/turf_to_spread in open_turf.atmos_adjacent_turfs) + if(turf_to_spread.turf_fire) + continue + if(fire_power + turf_to_spread.flammability < TURF_FIRE_MIN_POWER_TO_SPREAD) + continue + if(!prob(turf_to_spread.flammability * fire_power * TURF_FIRE_SPREAD_RATE)) + continue + turf_to_spread.ignite_turf(fire_power * TURF_FIRE_SPREAD_RATE) + UpdateFireState() + + open_turf.hotspot_expose(TURF_FIRE_TEMP_BASE + (TURF_FIRE_TEMP_INCREMENT_PER_POWER*fire_power), TURF_FIRE_VOLUME) + for(var/atom/movable/burning_atom as anything in open_turf) + fire_power += burning_atom.fire_act(TURF_FIRE_TEMP_BASE + (TURF_FIRE_TEMP_INCREMENT_PER_POWER*fire_power), TURF_FIRE_VOLUME) + if(interact_with_atmos) + if(prob(fire_power)) + open_turf.burn_tile() + if(prob(TURF_FIRE_BURN_PLAY_SOUND_EFFECT_CHANCE)) + playsound(open_turf, 'sound/effects/comfyfire.ogg', 40, TRUE) + +/obj/effect/abstract/turf_fire/proc/on_entered(datum/source, atom/movable/atom_crossing) + var/turf/open/open_turf = loc + if(open_turf.active_hotspot) //If we have an active hotspot, let it do the damage instead + return + atom_crossing.fire_act(TURF_FIRE_TEMP_BASE + (TURF_FIRE_TEMP_INCREMENT_PER_POWER*fire_power), TURF_FIRE_VOLUME) + return + +/obj/effect/abstract/turf_fire/extinguish() . = ..() - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(!V.outdoors) - spread_chance += 10 - -/turf/open - var/spread_chance = 3 - var/burn_material = 3 - -/turf/open/floor/plating/granite - spread_chance = 0 - burn_material = 0 - -/turf/open/floor/plating/parquetry - spread_chance = 10 - burn_material = 20 - -/turf/open/misc/grass/vamp - spread_chance = 10 - burn_material = 10 - -/turf/open/floor/plating/vampcarpet - spread_chance = 10 - burn_material = 20 - -/turf/open/floor/carpet - spread_chance = 20 - burn_material = 20 - -/turf/open/misc/dirt/vamp - spread_chance = 5 - burn_material = 5 - -/turf/open/floor/plating/church - spread_chance = 10 - burn_material = 10 - -/turf/open/floor/plating/saint - spread_chance = 10 - burn_material = 10 - -/turf/open/floor/plating/vampwood - spread_chance = 10 - burn_material = 10 - -/turf/open/misc/beach/vamp - spread_chance = 1 - burn_material = 1 - -/turf/open/water - spread_chance = 0 - burn_material = 0 - -/turf/open/water/vamp_sewer - spread_chance = 20 - burn_material = 20 - -/turf/open/floor/plating/vampcanal - spread_chance = 5 - burn_material = 5 - -/turf/open/floor/plating/vampcanalplating - spread_chance = 5 - burn_material = 5 + qdel(src) + +/obj/effect/abstract/turf_fire/proc/AddPower(power) + fire_power = min(TURF_FIRE_MAX_POWER, fire_power + power) + UpdateFireState() + +/obj/effect/abstract/turf_fire/proc/UpdateFireState() + var/new_state + switch(fire_power) + if(0 to 10) + new_state = TURF_FIRE_STATE_SMALL + if(11 to 24) + new_state = TURF_FIRE_STATE_MEDIUM + if(25 to INFINITY) + new_state = TURF_FIRE_STATE_LARGE + + if(new_state == current_fire_state) + return + current_fire_state = new_state + + switch(current_fire_state) + if(TURF_FIRE_STATE_SMALL) + icon_state = "[base_icon_state]_small" + light_range = 1.5 + if(TURF_FIRE_STATE_MEDIUM) + icon_state = "[base_icon_state]_medium" + light_range = 2 + if(TURF_FIRE_STATE_LARGE) + icon_state = "[base_icon_state]_big" + light_range = 3 + + update_light() + +/particles/smoke/turf_fire + spawning = 0.5 // don't turn this up or forest fires cause way too much lag + position = generator(GEN_SPHERE, 16, 24, NORMAL_RAND) + +#undef TURF_FIRE_REQUIRED_TEMP +#undef TURF_FIRE_TEMP_BASE +#undef TURF_FIRE_POWER_LOSS_ON_LOW_TEMP +#undef TURF_FIRE_TEMP_INCREMENT_PER_POWER +#undef TURF_FIRE_VOLUME +#undef TURF_FIRE_MAX_POWER + +#undef TURF_FIRE_MIN_POWER_TO_SPREAD +#undef TURF_FIRE_SPREAD_RATE + +#undef TURF_FIRE_ENERGY_PER_BURNED_OXY_MOL +#undef TURF_FIRE_BURN_RATE_BASE +#undef TURF_FIRE_BURN_RATE_PER_POWER +#undef TURF_FIRE_BURN_CARBON_DIOXIDE_MULTIPLIER +#undef TURF_FIRE_BURN_MINIMUM_OXYGEN_REQUIRED +#undef TURF_FIRE_BURN_PLAY_SOUND_EFFECT_CHANCE + +#undef TURF_FIRE_STATE_SMALL +#undef TURF_FIRE_STATE_MEDIUM +#undef TURF_FIRE_STATE_LARGE diff --git a/modular_darkpack/modules/fire/code/fire_globals.dm b/modular_darkpack/modules/fire/code/fire_globals.dm deleted file mode 100644 index 5d0538a86f3d..000000000000 --- a/modular_darkpack/modules/fire/code/fire_globals.dm +++ /dev/null @@ -1,2 +0,0 @@ -/// All snowflake fire effects on the map -GLOBAL_LIST_EMPTY(fires_list) diff --git a/modular_darkpack/modules/fire/code/molotov.dm b/modular_darkpack/modules/fire/code/molotov.dm new file mode 100644 index 000000000000..f9d9e1b5246a --- /dev/null +++ b/modular_darkpack/modules/fire/code/molotov.dm @@ -0,0 +1,42 @@ +/obj/item/molotov + name = "molotov cocktail" + desc = "A throwing weapon used to ignite things, typically filled with an accelerant. Recommended highly by rioters and revolutionaries. Light and toss." + icon_state = "molotov" + icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') + w_class = WEIGHT_CLASS_SMALL + var/active = FALSE + var/explode_timer + +/obj/item/molotov/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) + +/obj/item/molotov/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + explode() + +/obj/item/molotov/attackby(obj/item/I, mob/user, params) + if(I.get_temperature() && !active) + activate() + +/obj/item/molotov/proc/activate(mob/user) + active = TRUE + log_bomber(user, "has primed a", src, "for detonation") + icon_state = "molotov_flamed" + + explode_timer = addtimer(CALLBACK(src, PROC_REF(explode)), rand(15 SECONDS, 45 SECONDS), TIMER_STOPPABLE | TIMER_DELETE_ME) + +/obj/item/molotov/proc/explode() + deltimer(explode_timer) + + var/turf/explode_location = get_turf(src) + + for(var/turf/open/floor in circle_view_turfs(explode_location, 2)) + new /obj/effect/decal/cleanable/gasoline(floor) + + if(active) + explode_location.ignite_turf(30) + + playsound(explode_location, 'modular_darkpack/modules/fire/sounds/explode.ogg', 100, TRUE) + qdel(src) diff --git a/modular_darkpack/modules/fire/code/object_interactions.dm b/modular_darkpack/modules/fire/code/object_interactions.dm new file mode 100644 index 000000000000..2fbf8aae1115 --- /dev/null +++ b/modular_darkpack/modules/fire/code/object_interactions.dm @@ -0,0 +1,45 @@ +// All the code for interacting with other objects that doesnt require master_files + +/turf/proc/ignite_turf(power, fire_color = "red") + return SEND_SIGNAL(src, COMSIG_TURF_IGNITED, power, fire_color) + +/turf/proc/extinguish_turf() + return + +/turf/open/ignite_turf(power, fire_color) + . = ..() + if(. & SUPPRESS_FIRE) + return + if(turf_fire) + turf_fire.AddPower(power) + return + if(isgroundlessturf(src)) + return + new /obj/effect/abstract/turf_fire(src, power, fire_color) + +/turf/open/extinguish_turf(cooling_power = 1.2) + if(!air) + return + if(!active_hotspot && !turf_fire) + return + // Cooling down the turf ONLY when there was a fire is just really strange behavoir + //air.temperature = min(max(min(air.temperature-(cooling_power*1000), air.temperature/cooling_power), T0C), air.temperature) // the outer min temperature check is for weird phenomena like freon combustion + //temperature = clamp(min(temperature-(cooling_power*1000), temperature/cooling_power), T20C, temperature) // turfs normally don't go below T20C so I'll just clamp it to that in case of weird phenomena. + //air.react(src) + if(active_hotspot) + qdel(active_hotspot) + if(turf_fire) + qdel(turf_fire) + +/turf/open/misc/grass/burn_tile() + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) + return TRUE + +/turf/open/misc/dirt/burn_tile() + return FALSE + +/obj/structure/flora/fire_act(exposed_temperature, exposed_volume) + . = ..() + var/turf/open/plant_turf = get_turf(src) + if(isopenturf(plant_turf) && prob(plant_turf.flammability >= 1)) + plant_turf.ignite_turf(fuel_power + plant_turf.flammability) diff --git a/modular_darkpack/modules/fire/code/sprinkler.dm b/modular_darkpack/modules/fire/code/sprinkler.dm new file mode 100644 index 000000000000..d5ce70881bb3 --- /dev/null +++ b/modular_darkpack/modules/fire/code/sprinkler.dm @@ -0,0 +1,104 @@ +/obj/effect/temp_visual/rain + icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon_state = "rain" + duration = 2 SECONDS + +/datum/looping_sound/sprinkler + mid_sounds = list('modular_darkpack/modules/deprecated/sounds/rain.ogg' = 1) + mid_length = 7 SECONDS + volume = 50 + +/obj/machinery/sprinkler + name = "fire sprinkler" + icon = 'modular_darkpack/modules/fire/icons/sprinkler.dmi' + icon_state = "sprinkler" + layer = ABOVE_ALL_MOB_LAYER + pixel_y = 8 + var/fire_detection_range = 1 + var/current_spray_range = 1 + var/sprinkler_spray_range = 6 + + var/has_water_reclaimer = TRUE + var/last_fire_detection + /// If the sprinkler triggers and is triggered my the area being set to on fire + var/area_managed = FALSE + var/datum/looping_sound/sprinkler/looping_sound + +/obj/machinery/sprinkler/Initialize(mapload) + . = ..() + looping_sound = new(src) + create_reagents(20) + if(src.has_water_reclaimer) + reagents.add_reagent(/datum/reagent/water, 20) + AddComponent(/datum/component/seethrough, SEE_THROUGH_MAP_DEFAULT) + //AddComponent(/datum/component/plumbing/simple_demand) + + for(var/turf/open/open_turf in RANGE_TURFS(fire_detection_range, src)) + RegisterSignals(open_turf, list(COMSIG_ATOM_FIRE_ACT, COMSIG_TURF_HOTSPOT_EXPOSE, COMSIG_TURF_IGNITED), PROC_REF(fire_act_listener)) + + +/obj/machinery/sprinkler/proc/fire_act_listener() + SIGNAL_HANDLER + + trigger_sprinkler() + +/obj/machinery/sprinkler/fire_act(exposed_temperature, exposed_volume) + trigger_sprinkler() + . = ..() + +/obj/machinery/sprinkler/process(seconds_per_tick) + if(has_water_reclaimer) + reagents.add_reagent(/datum/reagent/water, 2.5 * seconds_per_tick) + + if(is_active()) + looping_sound.start() + for(var/turf/open/turf in circle_view_turfs(src, current_spray_range)) + reagents.expose(turf, TOUCH, current_spray_range/sprinkler_spray_range) + new /obj/effect/temp_visual/rain(turf) + for(var/atom/movable/stuff in circle_view(src, current_spray_range)) + reagents.expose(stuff, TOUCH, current_spray_range/sprinkler_spray_range) + + reagents.remove_all(1 * seconds_per_tick) + current_spray_range = min(sprinkler_spray_range, current_spray_range + 2) + else + looping_sound.stop() + current_spray_range = 1 + update_overlays() + +/obj/machinery/sprinkler/update_overlays() + . = ..() + if(is_active()) + . += mutable_appearance('modular_darkpack/modules/fire/icons/sprinkler.dmi', "sprinkler_water") + +/obj/machinery/sprinkler/proc/trigger_sprinkler() + last_fire_detection = world.time + + if(!area_managed) + return + var/area/my_area = get_area(src) + if(my_area) + my_area.set_fire_effect(TRUE, AREA_FAULT_AUTOMATIC, name) + my_area.alarm_manager.send_alarm(ALARM_FIRE, src) + spawn(30 SECONDS) + my_area.set_fire_effect(FALSE) + my_area.alarm_manager.clear_alarm(ALARM_FIRE, my_area) + +/obj/machinery/sprinkler/proc/is_active() + if(last_fire_detection && (last_fire_detection + 15 SECONDS > world.time)) + return TRUE + + if(!area_managed) + return + var/area/my_area = get_area(src) + if(my_area) + return my_area.fire + +/obj/machinery/sprinkler/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) + . = ..() + var/msg = weapon.ignition_effect(src, user) + if(msg) + visible_message(msg) + trigger_sprinkler() + +/obj/machinery/sprinkler/area_managed + area_managed = TRUE diff --git a/modular_darkpack/modules/fire/code/turf_fire_subsystem.dm b/modular_darkpack/modules/fire/code/turf_fire_subsystem.dm new file mode 100644 index 000000000000..5c3939c5a1b0 --- /dev/null +++ b/modular_darkpack/modules/fire/code/turf_fire_subsystem.dm @@ -0,0 +1,4 @@ +PROCESSING_SUBSYSTEM_DEF(turf_fire) + name = "Turf Fire" + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + wait = 1 SECONDS diff --git a/modular_darkpack/modules/fire/icons/sprinkler.dmi b/modular_darkpack/modules/fire/icons/sprinkler.dmi new file mode 100644 index 000000000000..3c3595d6009e Binary files /dev/null and b/modular_darkpack/modules/fire/icons/sprinkler.dmi differ diff --git a/modular_darkpack/modules/fire/icons/turf_fire.dmi b/modular_darkpack/modules/fire/icons/turf_fire.dmi new file mode 100644 index 000000000000..c36026c1464a Binary files /dev/null and b/modular_darkpack/modules/fire/icons/turf_fire.dmi differ diff --git a/modular_darkpack/modules/fire/readme.md b/modular_darkpack/modules/fire/readme.md new file mode 100644 index 000000000000..c2627de1c953 --- /dev/null +++ b/modular_darkpack/modules/fire/readme.md @@ -0,0 +1,42 @@ +<!-- This should be copy-pasted into the root of your module folder as readme.md --> + +https://github.com/DarkPack13/SecondCity/pull/78 + +## Fire <!--Title of your addition.--> + +Module ID: TURF_FIRE <!-- Uppercase, UNDERSCORE_CONNECTED name of your module, that you use to mark files. This is so people can case-sensitive search for your edits, if any. --> + +### Description: + +<!-- Here, try to describe what your PR does, what features it provides and any other directly useful information. --> + +### TG Proc/File Changes: + +- N/A +<!-- If you edited any core procs, you should list them here. You should specify the files and procs you changed. +E.g: +- `code/modules/mob/living.dm`: `proc/overriden_proc`, `var/overriden_var` + --> + +### Modular Overrides: + +- N/A +<!-- If you added a new modular override (file or code-wise) for your module, you should list it here. Code files should specify what procs they changed, in case of multiple modules using the same file. +E.g: +- `modular_nova/master_files/sound/my_cool_sound.ogg` +- `modular_nova/master_files/code/my_modular_override.dm`: `proc/overriden_proc`, `var/overriden_var` + --> + +### Defines: + +- `code/__DEFINES/~darkpack/dcs/fire_signals.dm` +<!-- If you needed to add any defines, mention the files you added those defines in, along with the name of the defines. --> + +### Included files that are not contained in this module: + +- N/A +<!-- Likewise, be it a non-modular file or a modular one that's not contained within the folder belonging to this specific module, it should be mentioned here. Good examples are icons or sounds that are used between multiple modules, or other such edge-cases. --> + +### Credits: + +<!-- Here go the credits to you, dear coder, and in case of collaborative work or ports, credits to the original source of the code. --> diff --git a/modular_darkpack/modules/fire/sounds/explode.ogg b/modular_darkpack/modules/fire/sounds/explode.ogg new file mode 100644 index 000000000000..3f626988af39 Binary files /dev/null and b/modular_darkpack/modules/fire/sounds/explode.ogg differ diff --git a/modular_darkpack/modules/deprecated/sounds/fire.ogg b/modular_darkpack/modules/fire/sounds/fire.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/fire.ogg rename to modular_darkpack/modules/fire/sounds/fire.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/spread.ogg b/modular_darkpack/modules/fire/sounds/spread.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/spread.ogg rename to modular_darkpack/modules/fire/sounds/spread.ogg diff --git a/modular_darkpack/modules/fishing/code/fishing.dm b/modular_darkpack/modules/fishing/code/fishing.dm index 4006c2563517..5100253f0814 100644 --- a/modular_darkpack/modules/fishing/code/fishing.dm +++ b/modular_darkpack/modules/fishing/code/fishing.dm @@ -1,45 +1,93 @@ -/obj/item/food/fish - desc = "Marine life." - icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') +/obj/item/fish/darkpack + abstract_type = /obj/item/fish/darkpack + desc = "marine life" + icon = 'modular_darkpack/modules/fishing/icons/fish.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/fishing/icons/fish_onfloor.dmi') w_class = WEIGHT_CLASS_SMALL - eatsound = 'modular_darkpack/modules/food/sounds/eat.ogg' - tastes = list("fish" = 1) - food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 3) - foodtypes = RAW | MEAT + //eatsound = 'modular_darkpack/modules/food/sounds/eat.ogg' -/obj/item/food/fish/shark +/obj/item/fish/darkpack/shark name = "leopard shark" - icon_state = "fish1" + icon_state = "shark" + icon = 'modular_darkpack/modules/fishing/icons/fish48x32.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/fishing/icons/fish_onfloor.dmi') + base_pixel_w = -16 + pixel_w = -16 + fish_id = "darkpack_shark" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + + average_size = 60 + average_weight = 1400 + stable_population = 4 + + dedicated_in_aquarium_icon_state = "fish_greyscale" + aquarium_vc_color = "#33302e" + sprite_width = 5 + sprite_height = 3 -/obj/item/food/fish/shark/Initialize(mapload) +/obj/item/fish/darkpack/shark/Initialize(mapload) . = ..() AddComponent(/datum/component/selling, 100, "fish", FALSE) -/obj/item/food/fish/tune - name = "tuna" - icon_state = "fish2" +/obj/item/fish/darkpack/tuna + name = "bluefin tuna" + icon_state = "fish" + fish_id = "darkpack_tuna" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + num_fillets = 2 + + stable_population = 9 + average_size = 50 + average_weight = 600 + + dedicated_in_aquarium_icon_state = "fish_greyscale" + aquarium_vc_color = "#33302e" + sprite_width = 5 + sprite_height = 3 -/obj/item/food/fish/tune/Initialize(mapload) +/obj/item/fish/darkpack/tuna/Initialize(mapload) . = ..() AddComponent(/datum/component/selling, 40, "fish", FALSE) -/obj/item/food/fish/catfish - name = "catfish" - icon_state = "fish3" +/obj/item/fish/darkpack/catfish + name = "channel catfish" + icon_state = "catfish" + fish_id = "darkpack_catfish" + required_fluid_type = AQUARIUM_FLUID_SALTWATER -/obj/item/food/fish/catfish/Initialize(mapload) + stable_population = 9 + average_size = 55 + average_weight = 800 + + dedicated_in_aquarium_icon_state = "fish_greyscale" + aquarium_vc_color = "#33302e" + sprite_width = 5 + sprite_height = 3 + +/obj/item/fish/darkpack/catfish/Initialize(mapload) . = ..() AddComponent(/datum/component/selling, 20, "fish", FALSE) -/obj/item/food/fish/crab - name = "crab" - icon_state = "fish4" +/obj/item/fish/darkpack/crab + name = "dungeness crab" + icon_state = "crab" + fillet_type = /obj/item/food/meat/slab/rawcrab + fish_id = "darkpack_crab" + required_fluid_type = AQUARIUM_FLUID_SALTWATER + + stable_population = 8 + average_size = 50 + average_weight = 600 + + dedicated_in_aquarium_icon_state = "crab_small" + sprite_height = 6 + sprite_width = 10 -/obj/item/food/fish/crab/Initialize(mapload) +/obj/item/fish/darkpack/crab/Initialize(mapload) . = ..() AddComponent(/datum/component/selling, 70, "fish", FALSE) +/* /obj/item/fishing_rod name = "fishing rod" icon_state = "fishing" @@ -79,23 +127,24 @@ catching = TRUE user.isfishing = TRUE playsound(loc, 'modular_darkpack/modules/deprecated/sounds/catching.ogg', 50, FALSE) - if(do_mob(user, src, 15 SECONDS)) + if(do_after(user, 15 SECONDS, src)) catching = FALSE user.isfishing = FALSE var/diceroll = rand(1, 20) - var/IT + var/obj/item/fish/darkpack/new_fish if(diceroll <= 5) - IT = /obj/item/food/fish/tune + new_fish = /obj/item/fish/darkpack/tuna else if(diceroll <= 10) - IT = /obj/item/food/fish/catfish + new_fish = /obj/item/fish/darkpack/catfish else if(diceroll <= 15) - IT = /obj/item/food/fish/crab + new_fish = /obj/item/fish/darkpack/crab else - IT = /obj/item/food/fish/shark - new IT(user.loc) + new_fish = /obj/item/fish/darkpack/shark + new new_fish(user.loc) playsound(loc, 'modular_darkpack/modules/deprecated/sounds/catched.ogg', 50, FALSE) else catching = FALSE user.isfishing = FALSE return . = ..() +*/ diff --git a/modular_darkpack/modules/fishing/icons/fish.dmi b/modular_darkpack/modules/fishing/icons/fish.dmi new file mode 100644 index 000000000000..3df64db41845 Binary files /dev/null and b/modular_darkpack/modules/fishing/icons/fish.dmi differ diff --git a/modular_darkpack/modules/fishing/icons/fish48x32.dmi b/modular_darkpack/modules/fishing/icons/fish48x32.dmi new file mode 100644 index 000000000000..238d5fcb683f Binary files /dev/null and b/modular_darkpack/modules/fishing/icons/fish48x32.dmi differ diff --git a/modular_darkpack/modules/fishing/icons/fish_onfloor.dmi b/modular_darkpack/modules/fishing/icons/fish_onfloor.dmi new file mode 100644 index 000000000000..273e07c85b0b Binary files /dev/null and b/modular_darkpack/modules/fishing/icons/fish_onfloor.dmi differ diff --git a/modular_darkpack/modules/flags/code/flags.dm b/modular_darkpack/modules/flags/code/flags.dm index 6d4f6a552fc6..998c8f7dd8db 100644 --- a/modular_darkpack/modules/flags/code/flags.dm +++ b/modular_darkpack/modules/flags/code/flags.dm @@ -1,8 +1,8 @@ /obj/structure/sign/flag name = "blank flag" desc = "The flag of nothing. It has nothing on it. Magnificient." - buildable_sign = FALSE custom_materials = null + buildable_sign = FALSE mouse_drag_pointer = MOUSE_ACTIVE_POINTER var/item_flag = /obj/item/sign/flag @@ -30,6 +30,7 @@ desc = "The folded flag of nothing. It has nothing on it. Beautiful." icon_state = "folded_coder" icon = 'modular_darkpack/modules/flags/icons/flags.dmi' + custom_materials = null sign_path = /obj/structure/sign/flag is_editable = FALSE @@ -52,15 +53,21 @@ icon_state = "flag_usa" icon = 'modular_darkpack/modules/flags/icons/flags.dmi' +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/usa, 32) + /obj/structure/sign/flag/california name = "flag of California" desc = "The flag of the great State of California. Eureka!" icon_state = "flag_california" icon = 'modular_darkpack/modules/flags/icons/flags.dmi' +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/california, 32) + /obj/structure/sign/flag/california/rare var/always = FALSE +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/califorina/rare, 32) + /obj/structure/sign/flag/california/rare/Initialize(mapload) . = ..() if(prob(1) || always) @@ -74,68 +81,92 @@ icon_state = "flag_britain" icon = 'modular_darkpack/modules/flags/icons/flags.dmi' +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/britain, 32) + /obj/structure/sign/flag/france name = "flag of France" desc = "The flag of the French Republic. Liberte, egalite, fraternite!" icon_state = "flag_france" icon = 'modular_darkpack/modules/flags/icons/flags.dmi' +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/france, 32) + /obj/structure/sign/flag/germany name = "flag of Germany" desc = "The flag of the Federal Republic of Germany." icon_state = "flag_germany" icon = 'modular_darkpack/modules/flags/icons/flags.dmi' +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/germany, 32) + /obj/structure/sign/flag/spain name = "flag of Spain" desc = "The flag of the Kingdom of Spain. Plus ultra!" icon_state = "flag_spain" icon = 'modular_darkpack/modules/flags/icons/flags.dmi' +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/spain, 32) + /obj/structure/sign/flag/italy name = "flag of Italy" desc = "The flag of the Republic of Italy." icon_state = "flag_italy" icon = 'modular_darkpack/modules/flags/icons/flags.dmi' +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/italy, 32) + /obj/structure/sign/flag/vatican name = "flag of the Vatican" desc = "The flag of Vatican City." icon_state = "flag_vatican" icon = 'modular_darkpack/modules/flags/icons/flags.dmi' +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/vatican, 32) + /obj/structure/sign/flag/russia name = "flag of Russia" desc = "The flag of the Russian Federation." icon_state = "flag_russia" icon = 'modular_darkpack/modules/flags/icons/flags.dmi' +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/russia, 32) + /obj/structure/sign/flag/soviet name = "flag of the Soviet Union" desc = "The flag of the Union of Socialist Soviet Republics. Workers of the world, unite!" icon_state = "flag_soviet" icon = 'modular_darkpack/modules/flags/icons/flags.dmi' +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/soviet, 32) + /obj/structure/sign/flag/china name = "flag of China" desc = "The flag of the People's Republic of China." icon_state = "flag_china" icon = 'modular_darkpack/modules/flags/icons/flags.dmi' +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/china, 32) + /obj/structure/sign/flag/taiwan name = "flag of Taiwan" desc = "The flag of the Republic of China." icon_state = "flag_taiwan" icon = 'modular_darkpack/modules/flags/icons/flags.dmi' +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/taiwan, 32) + /obj/structure/sign/flag/japan name = "flag of Japan" desc = "The flag of the State of Japan." icon_state = "flag_japan" icon = 'modular_darkpack/modules/flags/icons/flags.dmi' +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/japan, 32) + /obj/structure/sign/flag/anarchy name = "anarchist flag" desc = "The flag of the anarchist movement." icon_state = "flag_anarchy" icon = 'modular_darkpack/modules/flags/icons/flags.dmi' + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/anarchy, 32) diff --git a/modular_darkpack/modules/flags/code/pride_flags.dm b/modular_darkpack/modules/flags/code/pride_flags.dm index 93d5385834c8..9ad665653923 100644 --- a/modular_darkpack/modules/flags/code/pride_flags.dm +++ b/modular_darkpack/modules/flags/code/pride_flags.dm @@ -3,6 +3,8 @@ desc = "You probably shouldn't be seeing this. Yell at the coders about it." icon = 'modular_darkpack/modules/flags/icons/pride_flags.dmi' +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/pride, 32) + /obj/structure/sign/flag/pride/click_alt(mob/user) var/init_icon_state = initial(icon_state) if(icon_state == init_icon_state) @@ -17,36 +19,48 @@ icon_state = "flag_pride" item_flag = /obj/item/sign/flag/pride/gay +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/pride/gay, 32) + /obj/structure/sign/flag/pride/ace name = "asexual pride flag" desc = "The flag of asexual pride." icon_state = "flag_ace" item_flag = /obj/item/sign/flag/pride/ace +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/pride/ace, 32) + /obj/structure/sign/flag/pride/bi name = "bisexual pride flag" desc = "The flag of bisexual pride." icon_state = "flag_bi" item_flag = /obj/item/sign/flag/pride/bi +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/pride/bi, 32) + /obj/structure/sign/flag/pride/lesbian name = "lesbian pride flag" desc = "The flag of lesbian pride." icon_state = "flag_lesbian" item_flag = /obj/item/sign/flag/pride/lesbian +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/pride/lesbian, 32) + /obj/structure/sign/flag/pride/pan name = "pansexual pride flag" desc = "The flag of pansexual pride." icon_state = "flag_pan" item_flag = /obj/item/sign/flag/pride/pan +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/pride/pan, 32) + /obj/structure/sign/flag/pride/trans name = "trans pride flag" desc = "The flag of trans pride." icon_state = "flag_trans" item_flag = /obj/item/sign/flag/pride/trans +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/pride/trans, 32) + // FOLDED /obj/item/sign/flag/pride diff --git a/modular_darkpack/modules/flavor_text/code/config.dm b/modular_darkpack/modules/flavor_text/code/config.dm new file mode 100644 index 000000000000..e8fd6750ca17 --- /dev/null +++ b/modular_darkpack/modules/flavor_text/code/config.dm @@ -0,0 +1,3 @@ +// If the server has NSFW content enabled. +/datum/config_entry/flag/nsfw_content + diff --git a/modular_darkpack/modules/flavor_text/code/custom_examine_text.dm b/modular_darkpack/modules/flavor_text/code/custom_examine_text.dm new file mode 100644 index 000000000000..03f7e7e98b78 --- /dev/null +++ b/modular_darkpack/modules/flavor_text/code/custom_examine_text.dm @@ -0,0 +1,8 @@ +/mob/living/carbon/human/verb/set_custom_examine_text() + set name = "Set Custom Examine Text" + set category = "IC" + set desc = "Set a custom examine message to what your character is doing at the moment." + + var/new_text = tgui_input_text(src, "Set your new custom examine text.", "Examine Text", custom_examine_message, MAX_MESSAGE_LEN, TRUE) + + custom_examine_message = new_text diff --git a/modular_darkpack/modules/flavor_text/code/examine.dm b/modular_darkpack/modules/flavor_text/code/examine.dm new file mode 100644 index 000000000000..73938bce8372 --- /dev/null +++ b/modular_darkpack/modules/flavor_text/code/examine.dm @@ -0,0 +1,91 @@ +/mob/living/carbon + ///The Examine Panel TGUI. + var/datum/examine_panel/examine_panel_tgui + //Custom examine text, set via IC verb. + var/custom_examine_message = null + +/datum/examine_panel + /// Mob that the examine panel belongs to. + var/mob/living/carbon/holder + +/datum/examine_panel/ui_state(mob/user) + return GLOB.always_state + +/datum/examine_panel/ui_close(mob/user) + // If this is an examine preview dummy, clean it up. + if(istype(holder, /mob/living/carbon/human/dummy)) + qdel(holder) + + +/datum/examine_panel/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ExaminePanel") + ui.open() + + +/datum/examine_panel/ui_data(mob/user) + var/list/data = list() + + var/flavor_text = "" + var/character_notes = "" + var/obscured + var/name = "" + var/headshot = "" + // Whether or not the viewing user wants to see potential NSFW content in the holder's examine panel + var/nsfw_content = user.client?.prefs.read_preference(/datum/preference/toggle/nsfw_content_pref) + var/flavor_text_nsfw = "" + var/ooc_notes = "" + var/show_flavor_text_when_masked = user.client?.prefs.read_preference(/datum/preference/toggle/show_flavor_text_when_masked) + + if(ishuman(holder)) + var/mob/living/carbon/human/holder_human = holder + obscured = holder_human.obscured_slots & HIDEFACE + + //Check if the mob is obscured, then continue to headshot + if(isobserver(user) || show_flavor_text_when_masked || !obscured) + headshot = holder_human.dna.features[EXAMINE_DNA_HEADSHOT] + flavor_text = holder_human.dna.features[EXAMINE_DNA_FLAVOR_TEXT] + flavor_text_nsfw = holder.dna.features[EXAMINE_DNA_NSFW_FLAVOR_TEXT] + ooc_notes = holder.dna.features[EXAMINE_DNA_OOC_NOTES] + character_notes = holder.dna.features[EXAMINE_DNA_CHARACTER_NOTES] + name = holder.name + else if(obscured || !holder_human.dna) + flavor_text = "Obscured" + flavor_text_nsfw = "Obscured" + character_notes = "Obscured" + ooc_notes = "Obscured" + name = "Unknown" + + data["obscured"] = obscured ? TRUE : FALSE + data["character_name"] = name + data["flavor_text"] = flavor_text + data["flavor_text_nsfw"] = CONFIG_GET(flag/nsfw_content) ? flavor_text_nsfw : null + data["ooc_notes"] = CONFIG_GET(flag/nsfw_content) ? ooc_notes : null + data["character_notes"] = character_notes + data["headshot"] = headshot + data["nsfw_content"] = nsfw_content ? TRUE : FALSE + return data + +/mob/living/carbon/proc/flavor_text_creation() + var/flavor_text_to_show + var/preview_text = copytext_char(dna.features[EXAMINE_DNA_FLAVOR_TEXT], 1, FLAVOR_PREVIEW_LIMIT) + // What examine_tgui.dm uses to determine if flavor text appears as "Obscured". + var/face_obscured = obscured_slots & HIDEFACE + if(!face_obscured || (face_obscured && client?.prefs.read_preference(/datum/preference/toggle/show_flavor_text_when_masked))) + flavor_text_to_show = span_notice("[preview_text]... <a href='byond://?src=[REF(src)];view_flavortext=1;'>\[Look closer?\]</a>") + + return flavor_text_to_show + +/mob/living/carbon/human/dummy/proc/setup_examine_preview(mob/living/carbon/user) + examine_panel_tgui.holder = user + +/mob/living/carbon/Topic(href, href_list) + if(href_list["view_flavortext"]) + // The examine preview dummy will be cleaned up once the user closes the TGUI window. + var/mob/living/carbon/human/dummy/mannequin = generate_or_wait_for_human_dummy() + if(!mannequin.examine_panel_tgui) + mannequin.examine_panel_tgui = new() + mannequin.setup_examine_preview(src) + mannequin.examine_panel_tgui.ui_interact(usr) + ..() diff --git a/modular_darkpack/modules/flavor_text/code/preferences.dm b/modular_darkpack/modules/flavor_text/code/preferences.dm new file mode 100644 index 000000000000..c6e1c0e249bb --- /dev/null +++ b/modular_darkpack/modules/flavor_text/code/preferences.dm @@ -0,0 +1,125 @@ +/////////////////////////////////////////////////////////////////////////// + +/datum/preference/text/headshot + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "headshot" + maximum_value_length = MAX_MESSAGE_LEN + ///How much time between the informational chat messages? + var/cooldown_duration = 1 MINUTES + ///Handles the informational chat message timer. + COOLDOWN_DECLARE(headshot_cooldown) + ///Assoc list of ckeys and their links, used to cut down on chat spam + var/list/stored_links = list() + var/static/link_regex = regex("files.catbox.moe|images2.imgbox.com|i.gyazo.com") + var/static/list/valid_extensions = list("jpg", "png", "jpeg") // Regex works fine, if you know how it works + +/datum/preference/text/headshot/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + target?.dna.features[EXAMINE_DNA_HEADSHOT] = value + +/datum/preference/text/headshot/is_valid(value) + if(!length(value)) + return TRUE + + var/find_index = findtext(value, "https://") + if(find_index != 1) + to_chat(usr, span_warning("Your link must be https!")) + return + + if(!findtext(value, ".")) + to_chat(usr, span_warning("Invalid link!")) + return + var/list/value_split = splittext(value, ".") + + // extension will always be the last entry + var/extension = value_split[length(value_split)] + if(!(extension in valid_extensions)) + to_chat(usr, span_warning("The image must be one of the following extensions: '[english_list(valid_extensions)]'")) + return + + find_index = findtext(value, link_regex) + if(find_index != 9) + to_chat(usr, span_warning("The image must be hosted on one of the following sites: 'Gyazo (i.gyazo.com), Catbox (catbox.moe), Imgbox (images2.imgbox.com)'")) + return + + if(stored_links[usr.ckey] && stored_links[usr.ckey][type] != value && COOLDOWN_FINISHED(src, headshot_cooldown)) + COOLDOWN_START(src, headshot_cooldown, cooldown_duration) + to_chat(usr, span_notice("Please use a SFW image of the head and shoulder area to maintain immersion level. Think of it as a headshot for your ID. Lastly, [span_bold("do not use a real life photo or use any image that is less than serious.")]")) + to_chat(usr, span_notice("If the photo doesn't show up properly in-game, ensure that it's a direct image link that opens properly in a browser.")) + to_chat(usr, span_notice("Keep in mind that the photo will be downsized to 250x250 pixels, so the more square the photo, the better it will look.")) + log_game("[usr] has set their Headshot image to '[value]'.") + + apply_headshot(value) + return TRUE + +/datum/preference/text/headshot/proc/apply_headshot(value) + if(isnull(stored_links[usr?.ckey])) + stored_links[usr?.ckey] = list() + stored_links[usr?.ckey][type] = value + return TRUE + +/////////////////////////////////////////////////////////////////////////// + +/datum/preference/text/flavor_text + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "flavor_text" + maximum_value_length = MAX_FLAVOR_LEN + +/datum/preference/text/flavor_text/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + target.dna.features[EXAMINE_DNA_FLAVOR_TEXT] = value + +/////////////////////////////////////////////////////////////////////////// + +/datum/preference/text/nsfw_flavor_text + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "nsfw_flavor_text" + maximum_value_length = MAX_FLAVOR_LEN + +/datum/preference/text/nsfw_flavor_text/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + if(CONFIG_GET(flag/nsfw_content)) + target.dna.features[EXAMINE_DNA_NSFW_FLAVOR_TEXT] = value + +/datum/preference/text/nsfw_flavor_text/is_accessible(datum/preferences/preferences) + . = ..() + if(!.) + return FALSE + + if(CONFIG_GET(flag/nsfw_content) && preferences.read_preference(/datum/preference/toggle/nsfw_content_pref)) + return TRUE + + return FALSE + +/////////////////////////////////////////////////////////////////////////// + +/datum/preference/text/character_notes + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "character_notes" + maximum_value_length = MAX_FLAVOR_LEN + +/datum/preference/text/character_notes/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + target.dna.features[EXAMINE_DNA_CHARACTER_NOTES] = value + +/////////////////////////////////////////////////////////////////////////// + +/datum/preference/text/ooc_notes + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "ooc_notes" + maximum_value_length = MAX_FLAVOR_LEN + +/datum/preference/text/ooc_notes/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + if(CONFIG_GET(flag/nsfw_content)) + target.dna.features[EXAMINE_DNA_OOC_NOTES] = value + +/datum/preference/text/ooc_notes/is_accessible(datum/preferences/preferences) + . = ..() + if(!.) + return FALSE + + if(CONFIG_GET(flag/nsfw_content) && preferences.read_preference(/datum/preference/toggle/nsfw_content_pref)) + return TRUE + + return FALSE diff --git a/modular_darkpack/modules/flavor_text/code/preferences/masked_flavor_text_preference.dm b/modular_darkpack/modules/flavor_text/code/preferences/masked_flavor_text_preference.dm new file mode 100644 index 000000000000..6441f7844a79 --- /dev/null +++ b/modular_darkpack/modules/flavor_text/code/preferences/masked_flavor_text_preference.dm @@ -0,0 +1,8 @@ +/datum/preference/toggle/show_flavor_text_when_masked + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_key = "show_flavor_text_when_masked" + savefile_identifier = PREFERENCE_CHARACTER + default_value = FALSE + +/datum/preference/toggle/show_flavor_text_when_masked/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/modular_darkpack/modules/flavor_text/code/preferences/nsfw_content_preference.dm b/modular_darkpack/modules/flavor_text/code/preferences/nsfw_content_preference.dm new file mode 100644 index 000000000000..4f012fdd4c28 --- /dev/null +++ b/modular_darkpack/modules/flavor_text/code/preferences/nsfw_content_preference.dm @@ -0,0 +1,15 @@ +/datum/preference/toggle/nsfw_content_pref + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "nsfw_content_pref" + savefile_identifier = PREFERENCE_PLAYER + default_value = FALSE + +/datum/preference/toggle/nsfw_content_pref/is_accessible(datum/preferences/preferences) + . = ..() + if(!.) + return FALSE + + if(CONFIG_GET(flag/nsfw_content)) + return TRUE + + return FALSE diff --git a/modular_darkpack/modules/flavor_text/code/preferences/record_preferences.dm b/modular_darkpack/modules/flavor_text/code/preferences/record_preferences.dm new file mode 100644 index 000000000000..2402f77b8225 --- /dev/null +++ b/modular_darkpack/modules/flavor_text/code/preferences/record_preferences.dm @@ -0,0 +1,45 @@ +// All of these are handled in datacore, so we dont apply it to the human. +/datum/preference/text/medical + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "medical_record" + maximum_value_length = MAX_FLAVOR_LEN + +/datum/preference/text/medical/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + return FALSE + +///////////////////////////////////////////////////////////////////////////////////////////// + +/datum/preference/text/criminal + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "criminal_record" + maximum_value_length = MAX_FLAVOR_LEN + +/datum/preference/text/criminal/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + return FALSE + +///////////////////////////////////////////////////////////////////////////////////////////// + +/datum/preference/text/exploitable + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "exploitable_info" + maximum_value_length = MAX_FLAVOR_LEN + +/datum/preference/text/exploitable/create_default_value() + return EXPLOITABLE_DEFAULT_TEXT + +/datum/preference/text/exploitable/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + return FALSE + +///////////////////////////////////////////////////////////////////////////////////////////// + +/datum/preference/text/background + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "background_info" + maximum_value_length = MAX_FLAVOR_LEN + +/datum/preference/text/background/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + return FALSE diff --git a/modular_darkpack/modules/flavor_text/code/record.dm b/modular_darkpack/modules/flavor_text/code/record.dm new file mode 100644 index 000000000000..2a461173399a --- /dev/null +++ b/modular_darkpack/modules/flavor_text/code/record.dm @@ -0,0 +1,9 @@ +/datum/record/crew + /// Contains their background information. + var/background_information + /// Contains their exploitable information. + var/exploitable_information + /// Contains their own custom past medical records. + var/past_medical_records + /// Contains their own custom past criminal records. + var/past_criminal_records diff --git a/modular_darkpack/modules/flavor_text/readme.md b/modular_darkpack/modules/flavor_text/readme.md new file mode 100644 index 000000000000..eec5fc83b395 --- /dev/null +++ b/modular_darkpack/modules/flavor_text/readme.md @@ -0,0 +1,29 @@ +https://github.com/DarkPack13/SecondCity/pull/185 + +## Flavor Text + +Module ID: FLAVOR_TEXT + +### Description: + +Everything that the code has to do with flavor texts. + +### TG Proc/File Changes: + +- N/A + +### Modular Overrides: + +- N/A + +### Defines: + +- `code/__DEFINES/~darkpack/flavor_text.dm` + +### Included files that are not contained in this module: + +- N/A + +### Credits: + +XeonMations diff --git a/modular_darkpack/modules/font_adjustments/font_procs.dm b/modular_darkpack/modules/font_adjustments/font_procs.dm index 2806499d8a4a..db98a0f22da0 100644 --- a/modular_darkpack/modules/font_adjustments/font_procs.dm +++ b/modular_darkpack/modules/font_adjustments/font_procs.dm @@ -1,19 +1,20 @@ //this file holds text and character replacement stuff, like the malk madness speech /proc/spooky_font_replace(input) //mostly used for malkavians if(!input) - return + input = " " + CRASH("spooky_font_replace called without input!") var/list/replacements = list( - "a" = "𝙖", "A" = "𝘼", - "d" = pick("𝓭","𝓓"), "D" = "𝓓", - "e" = "𝙚", "E" = "𝙀", - "i" = "𝙞", "I" = pick("ノ", "𝐼"), - "l" = pick("𝙇","l"), "L" = pick("𝙇","𝓛"), - "n" = "𝙣", "N" = pick("𝓝","𝙉"), - "o" = "𝙤", "O" = "𝙊", - "s" = "𝘴", "S" = "𝙎", - "u" = "𝙪", "U" = "𝙐", - "v" = "𝐯", "V" = "𝓥", + "a" = "𝙖", "A" = "𝘼", + "d" = pick("𝓭","𝓓"), "D" = "𝓓", + "e" = "𝙚", "E" = "𝙀", + "i" = "𝙞", "I" = pick("ノ", "𝐼"), + "l" = pick("𝙇", "l", "\\"), "L" = pick("𝙇", "𝓛","\\"), + "n" = "𝙣", "N" = pick("𝓝", "𝙉"), + "o" = "𝙤", "O" = "𝙊", + "s" = "𝘴", "S" = "𝙎", + "u" = "𝙪", "U" = "𝙐", + "v" = "𝐯", "V" = "𝓥", ) for(var/letter in replacements) input = replacetextEx(input, letter, replacements[letter]) diff --git a/modular_darkpack/modules/food/code/drinks.dm b/modular_darkpack/modules/food/code/drinks.dm index 5e31fd5521dd..91857b98641e 100644 --- a/modular_darkpack/modules/food/code/drinks.dm +++ b/modular_darkpack/modules/food/code/drinks.dm @@ -30,18 +30,34 @@ icon_state = "beer_blue" list_reagents = list(/datum/reagent/consumable/ethanol/beer/light = 25, /datum/reagent/toxin/amatoxin = 5) +// DARKPACK TODO - Typhon's Beer /obj/item/reagent_containers/cup/glass/bottle/beer/vampire/typhon name = "Typhon's Beer" desc = "A sanguine drink to sate those of vampiric tastes" icon_state = "typhon" -// foodtype = SANGUINE -// list_reagents = list(/datum/reagent/consumable/ethanol/beer/typhon = 30) + //foodtype = SANGUINE + list_reagents = list(/datum/reagent/consumable/ethanol/beer/typhon = 30) + +/datum/reagent/consumable/ethanol/beer/typhon + name = "Typhon's Beer" + description = "An alcoholic beverage brewed with a sicekningly addictive sanguine taste" + color = "#660000" + nutriment_factor = 1 * REAGENTS_METABOLISM + boozepwr = 50 + taste_description = "blood sweet" + //glass_name = "glass of sanquine beer" + //glass_desc = "A freezing pint of vitae." + +/datum/reagent/consumable/ethanol/beer/typhon/on_mob_life(mob/living/carbon/M) + if(iskindred(M)) + M.adjust_blood_pool(0.25) + if(isghoul(M)) + M.adjust_blood_pool(1) + return ..() -/* /obj/item/reagent_containers/cup/glass/bottle/beer/vampire/typhon/attack(mob/living/M, mob/user, def_zone) . = ..() - reagents.trans_to(M, gulp_size, transfered_by = user, methods = VAMPIRE) -*/ + reagents.trans_to(M, gulp_size, transferred_by = user) /obj/item/reagent_containers/cup/glass/vampirecola name = "two liter cola bottle" @@ -53,6 +69,7 @@ list_reagents = list(/datum/reagent/consumable/space_cola = 100) volume = 100 age_restricted = FALSE + custom_price = 2 // ECONOMY /obj/item/reagent_containers/cup/glass/vampirecola/blue desc = "Pep Cola. Put some pep in your step" @@ -68,6 +85,7 @@ isGlass = FALSE list_reagents = list(/datum/reagent/water = 50) age_restricted = FALSE + custom_price = 2 // ECONOMY /obj/item/reagent_containers/cup/soda_cans/vampirecola name = "cola" @@ -111,6 +129,7 @@ desc = "More milk..." icon = 'modular_darkpack/modules/food/icons/items.dmi' ONFLOOR_ICON_HELPER('modular_darkpack/modules/food/icons/food_onfloor.dmi') + custom_price = 4 // ECONOMY /obj/item/reagent_containers/condiment/milk/malk desc = "a carton of fish-brand milk, a subsidary of malk incorporated." @@ -122,3 +141,4 @@ ONFLOOR_ICON_HELPER('modular_darkpack/modules/food/icons/food_onfloor.dmi') icon_state = "mixingbowl" custom_materials = list(/datum/material/glass=500) + custom_price = 10 // ECONOMY diff --git a/modular_darkpack/modules/food/code/food.dm b/modular_darkpack/modules/food/code/food.dm index ed18ffacc8d3..dc7b8d798ec5 100644 --- a/modular_darkpack/modules/food/code/food.dm +++ b/modular_darkpack/modules/food/code/food.dm @@ -13,13 +13,13 @@ custom_price = 3 food_flags = FOOD_BITE_SPRITE -/obj/item/food/donut/plain +/obj/item/food/donut/plain // DARKPACK TODO: unique onfloors for variants icon = 'modular_darkpack/modules/food/icons/items.dmi' ONFLOOR_ICON_HELPER('modular_darkpack/modules/food/icons/food_onfloor.dmi') custom_price = 1 food_flags = FOOD_BITE_SPRITE -/obj/item/food/donut/choco +/obj/item/food/donut/choco // DARKPACK TODO: unique onfloors for variants icon = 'modular_darkpack/modules/food/icons/items.dmi' ONFLOOR_ICON_HELPER('modular_darkpack/modules/food/icons/food_onfloor.dmi') custom_price = 1 @@ -76,68 +76,6 @@ icon = 'modular_darkpack/modules/food/icons/items.dmi' ONFLOOR_ICON_HELPER('modular_darkpack/modules/food/icons/food_onfloor.dmi') -/obj/item/food/chocolatebar - icon_state = "bar2" - icon = 'modular_darkpack/modules/food/icons/items.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/food/icons/food_onfloor.dmi') - custom_price = 1 - trash_type = /obj/item/trash/vampirebar - tastes = list("chocolate" = 1) - food_flags = FOOD_BITE_SPRITE - -/obj/item/food/chocolatebar/proc/open_bar(mob/user) - to_chat(user, span_notice("You pull back the wrapper of \the [src].")) - playsound(user.loc, 'sound/items/foodcanopen.ogg', 50) - icon_state = "bar1" - reagents.flags |= OPENCONTAINER - -/obj/item/food/chocolatebar/attack_self(mob/user) - if(!is_drainable()) - open_bar(user) - return ..() - -/obj/item/food/chocolatebar/attack(mob/living/M, mob/user, def_zone) - if (!is_drainable()) - to_chat(user, span_warning("[src]'s wrapper hasn't been opened!")) - return FALSE - return ..() - -/obj/item/trash/vampirecrisps - name = "chips wrapper" - icon_state = "crisps0" - icon = 'modular_darkpack/modules/food/icons/items.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/food/icons/food_onfloor.dmi') - -/obj/item/food/vampire/crisps - name = "chips" - desc = "\"Days\" chips... Crispy!" - icon_state = "crisps2" - trash_type = /obj/item/trash/vampirecrisps - bite_consumption = 1 - food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/sugar = 3, /datum/reagent/consumable/salt = 1) - junkiness = 10 - tastes = list("salt" = 1, "crisps" = 1) - food_flags = FOOD_IN_CONTAINER | FOOD_BITE_SPRITE - foodtypes = JUNKFOOD | FRIED - //eatsound = 'modular_darkpack/modules/depricated/sounds/crisp.ogg' - -/obj/item/food/vampire/crisps/proc/open_crisps(mob/user) - to_chat(user, span_notice("You pull back the wrapper of \the [src].")) - playsound(user.loc, 'sound/items/foodcanopen.ogg', 50) - icon_state = "crisps1" - reagents.flags |= OPENCONTAINER - -/obj/item/food/vampire/crisps/attack_self(mob/user) - if(!is_drainable()) - open_crisps(user) - return ..() - -/obj/item/food/vampire/crisps/attack(mob/living/M, mob/user, def_zone) - if (!is_drainable()) - to_chat(user, span_warning("[src]'s wrapper hasn't been opened!")) - return FALSE - return ..() - /obj/item/food/vampire/icecream name = "ice cream" desc = "Taste the childhood." diff --git a/modular_darkpack/modules/food/code/recipes.dm b/modular_darkpack/modules/food/code/recipes.dm index ed0b12ed1f2c..40134234447f 100644 --- a/modular_darkpack/modules/food/code/recipes.dm +++ b/modular_darkpack/modules/food/code/recipes.dm @@ -1,7 +1,17 @@ /datum/crafting_recipe/typhon_brew - name = "Thyphon's Brew" + name = "Typhon's Brew" reqs = list(/obj/item/reagent_containers/cup/glass/bottle/beer/vampire = 1, /datum/reagent/blood/vitae = 200) result = /obj/item/reagent_containers/cup/glass/bottle/beer/vampire/typhon time = 1 SECONDS - category = CAT_DRUGS - always_available = FALSE + category = CAT_CHEMISTRY + +/datum/crafting_recipe/typhon_brew/is_recipe_available(mob/user) + if(!ishuman(user)) + return FALSE + //var/mob/living/carbon/human/H = user + /*for(var/datum/action/A in H.actions) DARKPACK TODO: Serpentis + if(istype(A, /datum/action/discipline/serpentis)) + return TRUE + */ + return FALSE + diff --git a/modular_darkpack/modules/food/code/structure.dm b/modular_darkpack/modules/food/code/structure.dm index 827d6095ee36..c6db7cb4c5a5 100644 --- a/modular_darkpack/modules/food/code/structure.dm +++ b/modular_darkpack/modules/food/code/structure.dm @@ -13,4 +13,4 @@ /obj/machinery/reagentgrinder/kitchen name = "kitchen mixer" - beaker_type = /obj/item/reagent_containers/glass/mixing_bowl + //beaker_type = /obj/item/reagent_containers/glass/mixing_bowl diff --git a/modular_darkpack/modules/food/icons/food_onfloor.dmi b/modular_darkpack/modules/food/icons/food_onfloor.dmi index 896036fb26f1..0051988c03d2 100644 Binary files a/modular_darkpack/modules/food/icons/food_onfloor.dmi and b/modular_darkpack/modules/food/icons/food_onfloor.dmi differ diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm index a84f975d1005..7114b5fe08da 100644 --- a/modular_darkpack/modules/frenzy/code/frenzy.dm +++ b/modular_darkpack/modules/frenzy/code/frenzy.dm @@ -80,21 +80,7 @@ toggle_move_intent(src) set_glide_size(DELAY_TO_GLIDE_SIZE(cached_multiplicative_slowdown)) - var/atom/fear - for(var/obj/effect/fire/F in GLOB.fires_list) - if(get_dist(src, F) < 7 && F.z == src.z) - if(get_dist(src, F) < 6) - fear = F - if(get_dist(src, F) < 5) - fear = F - if(get_dist(src, F) < 4) - fear = F - if(get_dist(src, F) < 3) - fear = F - if(get_dist(src, F) < 2) - fear = F - if(get_dist(src, F) < 1) - fear = F + var/atom/fear = get_closest_atom(/obj/effect/abstract/turf_fire, view(7, src), src) // if(!fear && !frenzy_target) // return @@ -140,13 +126,13 @@ /mob/living/carbon/proc/get_frenzy_targets() var/list/targets = list() if(iskindred(src)) - for(var/mob/living/L in oviewers(7, src)) + for(var/mob/living/L in oviewers(DEFAULT_SIGHT_DISTANCE, src)) if(!iskindred(L) && L.bloodpool && L.stat != DEAD) targets += L if(L == frenzy_target) return L else - for(var/mob/living/L in oviewers(7, src)) + for(var/mob/living/L in oviewers(DEFAULT_SIGHT_DISTANCE, src)) if(L.stat != DEAD) targets += L if(L == frenzy_target) diff --git a/modular_darkpack/modules/ghoul/code/ghoul_species.dm b/modular_darkpack/modules/ghoul/code/ghoul_species.dm index bcac00899fe0..8ae1173176a3 100644 --- a/modular_darkpack/modules/ghoul/code/ghoul_species.dm +++ b/modular_darkpack/modules/ghoul/code/ghoul_species.dm @@ -2,21 +2,24 @@ name = "Ghoul" plural_form = "Ghouls" id = SPECIES_GHOUL + changesource_flags = MIRROR_BADMIN + +/mob/living/carbon/human/species/ghoul + race = /datum/species/human/ghoul /datum/species/human/ghoul/prepare_human_for_preview(mob/living/carbon/human/human) - human.set_haircolor("#362925", update = FALSE) - human.set_hairstyle("Nitori", update = TRUE) - human.set_eye_color("#006600") - human.undershirt = "Shirt (Peace)" + human.set_haircolor("#ac151d", update = FALSE) + human.set_hairstyle("Long Fringe", update = TRUE) + human.set_eye_color("#2D4118") + human.undershirt = "Tank Top (Fire)" human.update_body() /datum/species/human/ghoul/on_species_gain(mob/living/carbon/human/new_ghoul, datum/species/old_species, pref_load, regenerate_icons = TRUE) . = ..() - var/datum/discipline/bloodheal/giving_bloodheal = new(1) - new_ghoul.give_discipline(giving_bloodheal) + + new_ghoul.make_ghoul() /datum/species/human/ghoul/on_species_loss(mob/living/carbon/human/old_ghoul, datum/species/new_species, pref_load) - for(var/datum/action/A in old_ghoul.actions) - if(A.vampiric) - A.Remove(old_ghoul) - return ..() + . = ..() + + old_ghoul.remove_splat(/datum/splat/vampire/ghoul) diff --git a/modular_darkpack/modules/government/code/passport.dm b/modular_darkpack/modules/government/code/passport.dm index 9314a26e31b4..f873d22efd5b 100644 --- a/modular_darkpack/modules/government/code/passport.dm +++ b/modular_darkpack/modules/government/code/passport.dm @@ -1,6 +1,35 @@ +// DARKPACK TODO - We should support selecting something other then a passport, e.g: driver licenses + +/datum/quirk/illegal_identity + name = "Illegal Identity" + desc = "Illegal immigrant? Died legally? Born a wolf? The cops aren't happy." + value = 0 + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_HIDE_FROM_SCAN + icon = FA_ICON_PERSON_CIRCLE_QUESTION + mob_trait = TRAIT_ILLEGAL_IDENTITY + gain_text = span_warning("You feel legally unprepared.") + lose_text = span_notice("You feel bureaucratically legitimate.") + medical_record_text = "Patient is not checked in with valid identification." + // excluded_clans = list(CLAN_RAVNOS) // DARKPACK TODO - RAVNOS - (They are forced to take this) + +/datum/quirk/illegal_identity/add() + . = ..() + if(!ishuman(quirk_holder)) + return + var/mob/living/carbon/human/criminal = quirk_holder + var/obj/item/passport/passport = locate() in criminal // In pockets + if(!passport && criminal.back) + passport = locate() in criminal.back // In backpack + if(passport && passport.owner == criminal.real_name) + passport.link_human(criminal) + +/datum/loadout_item/pocket_items/passport + name = "Passport" + item_path = /obj/item/passport + /obj/item/passport - name = "\improper fake passport" - desc = "Just some book with words, none of real identity here." + name = "passport" + desc = "A book with someone's license, photo, and identifying information. Don't lose it!" icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' icon_state = "passport1" @@ -8,15 +37,51 @@ slot_flags = ITEM_SLOT_ID ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - var/clozed = TRUE + var/closed = TRUE + /// String of who the owner of the passport. + var/owner = "" + + /// If the ID is a counterfit. + var/fake = FALSE + /// If the NAME does not belong to the person. + var/fake_itentity = FALSE + +/obj/item/passport/Initialize(mapload) + . = ..() + var/mob/living/carbon/human/user = null + if(ishuman(loc)) // In pockets + user = loc + else if(ishuman(loc?.loc)) // In backpack + user = loc + if(user) + // Init and equiping via loadout are both too soon to be able to catch the illegal identity quirk + link_human(user) + +/obj/item/passport/proc/link_human(mob/living/carbon/human/user) + if(HAS_TRAIT(user, TRAIT_ILLEGAL_IDENTITY)) + fake = TRUE + fake_itentity = TRUE + + if(fake_itentity) + owner = user.generate_random_mob_name(TRUE) + else + owner = user.real_name + +/obj/item/passport/examine(mob/user) + . = ..() + // DARKPACK TODO - STATS - (Make this a perception+investigation roll when we have retrying check standeridization) + if(!closed && owner) + . += span_notice("It reads as belonging to [owner].") + if(fake) + . += span_notice("It looks like a crude counterfeit.") /obj/item/passport/attack_self(mob/user) . = ..() - if(clozed) - clozed = FALSE + if(closed) + closed = FALSE icon_state = "passport0" to_chat(user, span_notice("You open [src].")) else - clozed = TRUE + closed = TRUE icon_state = "passport1" to_chat(user, span_notice("You close [src].")) diff --git a/modular_darkpack/modules/graveyard/code/graveyard.dm b/modular_darkpack/modules/graveyard/code/graveyard.dm new file mode 100644 index 000000000000..2b1822e2d93f --- /dev/null +++ b/modular_darkpack/modules/graveyard/code/graveyard.dm @@ -0,0 +1,284 @@ +/mob/living/basic/zombie/darkpack + name = "Shambling Corpse" + desc = "When there is no more room in Hell, the dead will walk on Earth." + icon = 'modular_darkpack/modules/graveyard/icons/zombies.dmi' + icon_state = "zombie" + icon_living = "zombie" + icon_dead = "zombie_dead" + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + maxHealth = 50 + health = 50 + melee_damage_lower = 21 + melee_damage_upper = 21 + obj_damage = 2 + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'modular_darkpack/modules/deprecated/sounds/zombuzi.ogg' + status_flags = CANPUSH + basic_mob_flags = DEL_ON_DEATH + speed = 1 + faction = list("zombie") + ai_controller = /datum/ai_controller/basic_controller/zombie/darkpack + outfit = null + + var/obj/vampgrave/source_grave + +/mob/living/basic/zombie/darkpack/Initialize(mapload) + . = ..() + // the parent is causing them to appear as space station 13 zombies - this removes that. + icon = 'modular_darkpack/modules/graveyard/icons/zombies.dmi' + icon_state = icon_living + cut_overlays() + update_body() + AddElement(/datum/element/ai_retaliate) + +/mob/living/basic/zombie/darkpack/Destroy() + if(source_grave) + source_grave.spawned_zombies -= src + source_grave = null + return ..() + +// need a custom targeting strategy so they don't kill other zombies +/datum/targeting_strategy/basic/zombie_darkpack + +/datum/targeting_strategy/basic/zombie_darkpack/can_attack(mob/living/basic/basic_mob, atom/target, vision_range) + if(istype(target, /mob/living/basic/zombie/darkpack)) + return FALSE + + // don't break down the fence - just try to break the gate + if(istype(target, /obj/structure/vampfence/rich)) + return FALSE + + if(istype(target, /obj/structure/vampgate)) + return TRUE + + // use the parent class for everything else + return ..() + +// planning subtree specifically for finding and targeting vampire gates +/datum/ai_planning_subtree/find_and_attack_vampgate + var/scan_range = 9 + +/datum/ai_planning_subtree/find_and_attack_vampgate/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/basic/zombie = controller.pawn + + var/atom/current_target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + + // if we're attacking a gate, use the targeting strategy to find nearby living mobs. + if(istype(current_target, /obj/structure/vampgate)) + var/datum/targeting_strategy/targeter = GET_TARGETING_STRATEGY(controller.blackboard[BB_TARGETING_STRATEGY]) + if(targeter) + for(var/mob/living/potential_target in oview(controller.blackboard[BB_VISION_RANGE], zombie)) + if(targeter.can_attack(zombie, potential_target, controller.blackboard[BB_VISION_RANGE])) + // if we can attack the potential target clear the gate from the list and attack the nearby living thing. + controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) + return + + // if we already have a living current target don't run this + if(isliving(current_target)) + return + + // if we currently have a mob target from the blackboard then don't run this + if(controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) + return + + // is there a nearby vampgate? + for(var/obj/structure/vampgate/gate in oview(scan_range, zombie)) + if(!gate.gate_broken) + // theres one, kill it + controller.set_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET, gate) + controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + return + +// AI controller for darkpack zombies +/datum/ai_controller/basic_controller/zombie/darkpack + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/zombie_darkpack, + BB_TARGET_MINIMUM_STAT = DEAD, + BB_VISION_RANGE = 9, + ) + 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_and_attack_vampgate, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/obj/vampgrave + icon = 'modular_darkpack/modules/graveyard/icons/graves.dmi' + icon_state = "grave1" + name = "grave" + plane = GAME_PLANE + layer = ABOVE_NORMAL_TURF_LAYER + anchored = TRUE + density = TRUE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF + + var/spawn_interval = 15 MINUTES + var/max_zombies_per_grave = 2 + var/list/spawned_zombies = list() + +/obj/vampgrave/Initialize(mapload) + . = ..() + randomize_appearance() + addtimer(CALLBACK(src, PROC_REF(try_spawn_zombie)), spawn_interval, TIMER_STOPPABLE | TIMER_LOOP) + +//they have the indestructible flag so this should never happen but just in case +/obj/vampgrave/Destroy() + spawned_zombies.Cut() + return ..() + +/obj/vampgrave/proc/try_spawn_zombie() + + clean_zombie_list() + + if(length(spawned_zombies) >= max_zombies_per_grave) + return + + spawn_zombie() + +/* +/obj/vampgrave/proc/should_spawn() + // Check if graveyard keeper is online + for(var/mob/living/carbon/human/H in GLOB.player_list) + if(H.client && H.mind?.assigned_role == /datum/job/graveyard_keeper) + return TRUE + return FALSE +*/ + +/obj/vampgrave/proc/clean_zombie_list() + for(var/mob/living/basic/zombie/darkpack/Z in spawned_zombies) + if(QDELETED(Z)) + spawned_zombies -= Z + +/obj/vampgrave/proc/spawn_zombie() + var/mob/living/basic/zombie/darkpack/Z = new(loc) + Z.source_grave = src + spawned_zombies += Z + + visible_message(span_danger("The ground at [src] stirs as something claws its way out!")) + +/obj/vampgrave/proc/randomize_appearance() + icon_state = "grave[rand(1, 10)]" + if(check_holidays(CHRISTMAS) && is_outdoors()) + icon_state += "-snow" + +/obj/vampgrave/proc/is_outdoors() + if(!istype(get_area(src), /area/vtm)) + return FALSE + var/area/vtm/V = get_area(src) + return V.outdoors + +/obj/structure/vampgate + name = "Graveyard Gate" + desc = "It opens and closes." + icon = 'modular_darkpack/modules/graveyard/icons/gate.dmi' + icon_state = "gate" + pixel_w = -32 + anchored = TRUE + density = TRUE + opacity = FALSE + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF | INDESTRUCTIBLE + max_integrity = 500 + + var/repairing = FALSE + var/gate_broken = FALSE + +/obj/structure/vampgate/Initialize(mapload) + . = ..() + atom_integrity = max_integrity + +/obj/structure/vampgate/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) + // dont take more damage if its already broken + if(gate_broken) + return + + // manually reduce integrity, if we dont do this and rely only on parent functions, it will qdel at < 0 integrity + atom_integrity = max(0, atom_integrity - damage_amount) + + if(sound_effect) + playsound(get_turf(src), 'modular_darkpack/master_files/sounds/effects/door/get_bent.ogg', 100, FALSE) + + shake_gate() + + if(atom_integrity <= 0) + break_open() + +/obj/structure/vampgate/atom_destruction(damage_flag) + .=..() + break_open() + +/obj/structure/vampgate/proc/shake_gate() + pixel_z += rand(-1, 1) + pixel_w += rand(-1, 1) + addtimer(CALLBACK(src, PROC_REF(reset_position)), 0.2 SECONDS) + +/obj/structure/vampgate/proc/reset_position() + pixel_z = initial(pixel_z) + pixel_w = initial(pixel_w) + +/obj/structure/vampgate/proc/break_open() + if(gate_broken) + return + + gate_broken = TRUE + density = FALSE + icon_state = "gate-open" + atom_integrity = 0 + visible_message(span_boldwarning("[src] breaks open!")) + +/obj/structure/vampgate/examine(mob/user) + . = ..() + + if(gate_broken) + . += span_boldwarning("The gate is broken open!") + return + + var/health_percent = round(get_integrity_percentage() * 100) + + switch(health_percent) + if(0 to 25) + . += span_boldwarning("Integrity: [atom_integrity]/[max_integrity] - Critically damaged!") + if(26 to 50) + . += span_warning("Integrity: [atom_integrity]/[max_integrity] - Heavily damaged") + if(51 to 75) + . += span_notice("Integrity: [atom_integrity]/[max_integrity] - Moderately damaged") + if(76 to INFINITY) + . += span_notice("Integrity: [atom_integrity]/[max_integrity] - Good condition") + +/obj/structure/vampgate/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + . = ..() + if(istype(tool, /obj/item/melee/vamp/tire)) + attempt_repair(user) + return TRUE + + return ..() + +/obj/structure/vampgate/proc/attempt_repair(mob/living/user) + if(repairing) + to_chat(user, span_warning("Someone is already repairing [src]!")) + return + + if(atom_integrity >= max_integrity) + to_chat(user, span_notice("[src] is already fully repaired.")) + return + + repairing = TRUE + + if(do_after(user, 5 SECONDS, src)) + repair_damage(50) + + if(atom_integrity > 0 && gate_broken) + gate_broken = FALSE + density = TRUE + icon_state = "gate" + visible_message(span_notice("[src] is repaired and closed!")) + + playsound(src, 'modular_darkpack/master_files/sounds/effects/repair.ogg', 50, TRUE) + to_chat(user, span_notice("You repair some damage on [src]. ([atom_integrity]/[max_integrity])")) + else + to_chat(user, span_warning("You stop repairing [src].")) + + repairing = FALSE diff --git a/modular_darkpack/modules/graveyard/code/graveyard_area.dm b/modular_darkpack/modules/graveyard/code/graveyard_area.dm index 6978d08649f9..8c03394b7d26 100644 --- a/modular_darkpack/modules/graveyard/code/graveyard_area.dm +++ b/modular_darkpack/modules/graveyard/code/graveyard_area.dm @@ -2,7 +2,7 @@ name = "Graveyard" icon_state = "graveyard" ambience_index = AMBIENCE_OFFICE - ambient_buzz = 'modular_darkpack/modules/ambience/sounds/hollywood.ogg' + musictracks = list('modular_darkpack/modules/ambience/sounds/music/infected_warehouse.ogg') outdoors = TRUE zone_type = ZONE_NO_MASQUERADE @@ -11,3 +11,4 @@ icon_state = "interior" outdoors = FALSE zone_type = ZONE_NO_MASQUERADE + musictracks = list('modular_darkpack/modules/ambience/sounds/music/enterlair.ogg') diff --git a/modular_darkpack/modules/graveyard/code/graveyard_globals.dm b/modular_darkpack/modules/graveyard/code/graveyard_globals.dm deleted file mode 100644 index 3fa60b1859ad..000000000000 --- a/modular_darkpack/modules/graveyard/code/graveyard_globals.dm +++ /dev/null @@ -1,5 +0,0 @@ -/// The graveyard's gate that the graveyard keeper must protect from zombies -GLOBAL_DATUM(vampgate, /obj/structure/vampgate) - -/// Zombies in the graveyard -GLOBAL_LIST_EMPTY(zombie_list) diff --git a/modular_darkpack/modules/graveyard/code/graveyard_subsystem.dm b/modular_darkpack/modules/graveyard/code/graveyard_subsystem.dm deleted file mode 100644 index bd134accc95b..000000000000 --- a/modular_darkpack/modules/graveyard/code/graveyard_subsystem.dm +++ /dev/null @@ -1,71 +0,0 @@ -SUBSYSTEM_DEF(graveyard) - name = "Graveyard" - init_order = INIT_ORDER_DEFAULT - wait = 3000 - priority = FIRE_PRIORITY_DEFAULT - - var/alive_zombies = 0 //MAX - 20, respawn every 5 minutes - var/lost_points = 0 - var/clear_runs = 0 - var/list/graves = list() - - var/total_good = 0 - var/total_bad = 0 - -/datum/controller/subsystem/graveyard/fire() - var/continue_the_shift = FALSE - for(var/mob/living/carbon/human/L in GLOB.player_list) - if(L.mind) - if(L.mind.assigned_role == "Graveyard Keeper") - if(L.client) - continue_the_shift = TRUE - if(!continue_the_shift) - return - if(alive_zombies < 10) - for(var/mob/living/carbon/human/L in GLOB.player_list) - if(L.mind) - if(L.mind.assigned_role == "Graveyard Keeper") - if(L.client) - to_chat(L, "WALKING DEAD ARE RISING...") - for(var/i in 1 to 30-alive_zombies) - var/atom/grave = pick(graves) - new /mob/living/simple_animal/hostile/zombie(grave.loc) - alive_zombies = max(0, alive_zombies+1) - clear_runs = max(0, clear_runs+1) - else - lost_points = max(0, lost_points+1) - clear_runs = 0 - - if(clear_runs > 2) - clear_runs = 0 - for(var/mob/living/carbon/human/L in GLOB.player_list) - if(L.mind) - if(L.mind.assigned_role == "Graveyard Keeper") - if(L.client && L.key) - total_good += 1 - -/obj/vampgrave - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' - icon_state = "grave1" - name = "grave" - plane = GAME_PLANE - layer = ABOVE_NORMAL_TURF_LAYER - anchored = TRUE - density = TRUE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF - -/obj/vampgrave/Initialize(mapload) - . = ..() - - SSgraveyard.graves += src - icon_state = "grave[rand(1, 10)]" - if (check_holidays(CHRISTMAS)) - if (istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if (V.outdoors) - icon_state = "grave[rand(1, 10)]-snow" - -/obj/vampgrave/Destroy() - SSgraveyard.graves -= src - - . = ..() diff --git a/modular_darkpack/modules/graveyard/code/zombie_subsystem.dm b/modular_darkpack/modules/graveyard/code/zombie_subsystem.dm deleted file mode 100644 index 30b261613f40..000000000000 --- a/modular_darkpack/modules/graveyard/code/zombie_subsystem.dm +++ /dev/null @@ -1,101 +0,0 @@ -SUBSYSTEM_DEF(zombiepool) - name = "Zombie Pool" - flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND - priority = FIRE_PRIORITY_VERYLOW - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - wait = 20 - - var/list/currentrun = list() - -/datum/controller/subsystem/zombiepool/stat_entry(msg) - var/list/activelist = GLOB.zombie_list - msg = "ZOMBIES:[length(activelist)]" - return ..() - -/datum/controller/subsystem/zombiepool/fire(resumed = FALSE) - - if (!resumed) - var/list/activelist = GLOB.zombie_list - src.currentrun = activelist.Copy() - - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - - while(currentrun.len) - var/mob/living/simple_animal/hostile/zombie/Z = currentrun[currentrun.len] - --currentrun.len - - if (QDELETED(Z)) // Some issue causes nulls to get into this list some times. This keeps it running, but the bug is still there. - GLOB.zombie_list -= Z - log_world("Found a null in npc list!") - continue - - //NPC.observed_by_player() - if(MC_TICK_CHECK) - return - Z.handle_automated_patriotification() - -/obj/structure/vampgate - name = "Graveyard Gate" - desc = "It opens and closes." - icon = 'modular_darkpack/modules/deprecated/icons/gate.dmi' - icon_state = "gate" - plane = GAME_PLANE - layer = ABOVE_ALL_MOB_LAYER - pixel_w = -32 - anchored = TRUE - density = TRUE - opacity = FALSE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF - var/punches_to_break = 500 - var/repairing = FALSE - -/obj/structure/vampgate/proc/punched() - playsound(get_turf(src), 'modular_darkpack/modules/deprecated/sounds/get_bent.ogg', 100, FALSE) - pixel_z = pixel_z+rand(-1, 1) - pixel_w = pixel_w+rand(-1, 1) - punches_to_break = max(0, punches_to_break-1) - spawn(2) - pixel_z = initial(pixel_z) - pixel_w = initial(pixel_w) - if(punches_to_break == 0) - density = FALSE - icon_state = "gate-open" - -/obj/structure/vampgate/examine(mob/user) - . = ..() - var/total_health = round((100/initial(punches_to_break))*punches_to_break) - switch(total_health) - if(0 to 25) - . += span_warning("<b>Density: [punches_to_break]/[initial(punches_to_break)]</b>") - if(26 to 50) - . += span_warning("Density: [punches_to_break]/[initial(punches_to_break)]") - if(51 to 75) - . += span_notice("Density: [punches_to_break]/[initial(punches_to_break)]") - if(76 to 100) - . += span_notice("<b>Density: [punches_to_break]/[initial(punches_to_break)]</b>") - -/obj/structure/vampgate/Initialize(mapload) - . = ..() - GLOB.vampgate = src - -/obj/structure/vampgate/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/melee/vamp/tire)) - if(!repairing) - repairing = TRUE - if(do_mob(user, src, 5 SECONDS)) - punches_to_break = min(punches_to_break+5, initial(punches_to_break)) - if(punches_to_break) - set_density(TRUE) - icon_state = "gate" - playsound(src, 'modular_darkpack/master_files/sounds/repair.ogg', 50, TRUE) - to_chat(user, span_notice("You repair some dents on [src].")) - repairing = FALSE - else - to_chat(user, span_warning("You failed to repair [src].")) - repairing = FALSE - return - else - if(I.force) - punched() - ..() diff --git a/modular_darkpack/modules/graveyard/icons/gate.dmi b/modular_darkpack/modules/graveyard/icons/gate.dmi new file mode 100644 index 000000000000..cd65fa70eebc Binary files /dev/null and b/modular_darkpack/modules/graveyard/icons/gate.dmi differ diff --git a/modular_darkpack/modules/graveyard/icons/graves.dmi b/modular_darkpack/modules/graveyard/icons/graves.dmi new file mode 100644 index 000000000000..ef896e3ddabd Binary files /dev/null and b/modular_darkpack/modules/graveyard/icons/graves.dmi differ diff --git a/modular_darkpack/modules/graveyard/icons/zombies.dmi b/modular_darkpack/modules/graveyard/icons/zombies.dmi new file mode 100644 index 000000000000..eed310f38598 Binary files /dev/null and b/modular_darkpack/modules/graveyard/icons/zombies.dmi differ diff --git a/modular_darkpack/modules/greebles/code/fake_platforms.dm b/modular_darkpack/modules/greebles/code/fake_platforms.dm new file mode 100644 index 000000000000..e744b959c235 --- /dev/null +++ b/modular_darkpack/modules/greebles/code/fake_platforms.dm @@ -0,0 +1,107 @@ +#define FAKE_PLATFORM_HELPER(platform_type) \ + /obj/fake_platform/##platform_type { \ + icon_state = #platform_type; \ + } \ + /obj/fake_platform/##platform_type/double{ \ + icon_state = #platform_type + "_double"; \ + } \ + /obj/fake_platform/##platform_type/easyclimb { \ + density = FALSE; \ + climbable = FALSE; \ + } \ + /obj/fake_platform/##platform_type/double/easyclimb { \ + density = FALSE; \ + climbable = FALSE; \ + } \ + /obj/fake_platform/##platform_type/noclimb { \ + climbable = FALSE; \ + } \ + /obj/fake_platform/##platform_type/double/noclimb { \ + climbable = FALSE; \ + } + +/obj/fake_platform + name = "platform" + desc = "Don't stub your toe." + icon = 'modular_darkpack/modules/greebles/icons/fake_platforms.dmi' + abstract_type = /obj/fake_platform + flags_1 = ON_BORDER_1 + obj_flags = CAN_BE_HIT | BLOCKS_CONSTRUCTION_DIR | IGNORE_DENSITY + density = TRUE + anchored = TRUE + dir = NORTH + pass_flags_self = LETPASSTHROW|PASSSTRUCTURE + // layer = BELOW_CATWALK_LAYER + + var/climbable = TRUE + +/obj/fake_platform/Initialize(mapload) + . = ..() + if(climbable) + AddElement(/datum/element/climbable) + + if(density && flags_1 & ON_BORDER_1) // blocks normal movement from and to the direction it's facing. + var/static/list/loc_connections = list( + COMSIG_ATOM_EXIT = PROC_REF(on_exit), + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/fake_platform/CanPass(atom/movable/mover, border_dir) + . = ..() + if(border_dir & dir) + return . || mover.throwing || (mover.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) + return TRUE + +/obj/fake_platform/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + if(!(to_dir & dir)) + return TRUE + return ..() + +/obj/fake_platform/proc/on_exit(datum/source, atom/movable/leaving, direction) + SIGNAL_HANDLER + + if(leaving == src) + return // Let's not block ourselves. + + if(!(direction & dir)) + return + + if (!density) + return + + if (leaving.throwing) + return + + if (leaving.movement_type & (PHASING|MOVETYPES_NOT_TOUCHING_GROUND)) + return + + if (leaving.move_force >= MOVE_FORCE_EXTREMELY_STRONG) + return + + leaving.Bump(src) + return COMPONENT_ATOM_BLOCK_EXIT + +FAKE_PLATFORM_HELPER(wallpaper) +FAKE_PLATFORM_HELPER(grey) +FAKE_PLATFORM_HELPER(grey) +FAKE_PLATFORM_HELPER(light) +FAKE_PLATFORM_HELPER(asylum) +FAKE_PLATFORM_HELPER(asylum_clean) +FAKE_PLATFORM_HELPER(club) +FAKE_PLATFORM_HELPER(cheap) +FAKE_PLATFORM_HELPER(green) +FAKE_PLATFORM_HELPER(stripe) +FAKE_PLATFORM_HELPER(rich) +FAKE_PLATFORM_HELPER(rich_alt) +FAKE_PLATFORM_HELPER(stone) +FAKE_PLATFORM_HELPER(stone_dual) +FAKE_PLATFORM_HELPER(dgreen) +FAKE_PLATFORM_HELPER(dred) +FAKE_PLATFORM_HELPER(gold) +FAKE_PLATFORM_HELPER(gold_alt) +FAKE_PLATFORM_HELPER(gold_simple) +FAKE_PLATFORM_HELPER(necro) +FAKE_PLATFORM_HELPER(padded) +FAKE_PLATFORM_HELPER(lightpadded) + +#undef FAKE_PLATFORM_HELPER diff --git a/modular_darkpack/modules/greebles/icons/fake_platforms.dmi b/modular_darkpack/modules/greebles/icons/fake_platforms.dmi new file mode 100644 index 000000000000..26a2b8ba50c6 Binary files /dev/null and b/modular_darkpack/modules/greebles/icons/fake_platforms.dmi differ diff --git a/modular_darkpack/modules/guestbook/code/adjective_preference.dm b/modular_darkpack/modules/guestbook/code/adjective_preference.dm new file mode 100644 index 000000000000..183f81d93dbd --- /dev/null +++ b/modular_darkpack/modules/guestbook/code/adjective_preference.dm @@ -0,0 +1,16 @@ +/datum/preference/choiced/adjective_preference + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES + priority = PREFERENCE_PRIORITY_TABLETOP + savefile_key = "adjective_preference" + savefile_identifier = PREFERENCE_CHARACTER + main_feature_name = "Adjective" + can_randomize = TRUE + +/datum/preference/choiced/adjective_preference/init_possible_values() + return assoc_to_keys(GLOB.preference_adjectives) + +/datum/preference/choiced/adjective_preference/create_default_value() + return pick(assoc_to_keys(GLOB.preference_adjectives)) + +/datum/preference/choiced/adjective_preference/apply_to_human(mob/living/carbon/human/target, value) + target.visible_adjective = value diff --git a/modular_darkpack/modules/guestbook/code/guestbook.dm b/modular_darkpack/modules/guestbook/code/guestbook.dm new file mode 100644 index 000000000000..1e81b8ae6f78 --- /dev/null +++ b/modular_darkpack/modules/guestbook/code/guestbook.dm @@ -0,0 +1,162 @@ +/** + * THE GUESTBOOK DATUM + * + * Essentially, this datum handles the people that a given human knows, + * to handle getting the correct names on examine and saycode. + */ +/datum/guestbook + /// Associative list of known guests, real_name = known_name + var/list/known_names + +/datum/guestbook/Destroy(force) + known_names = null + return ..() + +/datum/guestbook/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Guestbook", "[user.real_name]'s Guestbook") + ui.set_autoupdate(FALSE) + ui.open() + +/datum/guestbook/ui_state(mob/user) + return GLOB.always_state + +/datum/guestbook/ui_data(mob/user) + var/list/data = list() + var/list/names = list() + for(var/real_name in known_names) + var/given_name = LAZYACCESS(known_names, real_name) + names += list(list("real_name" = real_name, "given_name" = given_name)) + data["names"] = names + return data + +/datum/guestbook/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return . + switch(action) + if("rename_guest") + var/real_name = params["real_name"] + var/new_name = params["new_name"] + new_name = reject_bad_name(new_name, max_length = 42) + if(!new_name) + to_chat(usr, span_warning("That's a pretty terrible name. <i>You can do better</i>.")) + return FALSE + if(!rename_guest(usr, null, real_name, new_name, silent = FALSE)) + return FALSE + return TRUE + if("delete_guest") + var/real_name = params["real_name"] + if(!remove_guest(usr, null, real_name, silent = FALSE)) + return FALSE + return TRUE + +/datum/guestbook/proc/try_add_guest(mob/user, mob/living/carbon/human/guest, silent = FALSE) + if(user == guest) + if(!silent) + to_chat(user, span_warning("That's you! You already know yourself plenty.")) + return FALSE + if(!visibility_checks(user, guest, silent)) + return FALSE + var/given_name = tgui_input_text(user, "What name do you want to give to [guest]?", "Guestbook Name", "", max_length = 42) + if(!given_name) + if(!silent) + to_chat(user, span_warning("Nevermind.")) + return FALSE + given_name = reject_bad_name(given_name) + if(!given_name) + if(!silent) + to_chat(user, span_warning("That's a pretty terrible name.")) + return FALSE + if(!visibility_checks(user, guest, silent)) + return FALSE + if(LAZYACCESS(known_names, guest.real_name)) + if(!rename_guest(user, guest, guest.real_name, given_name, silent)) + return FALSE + else + if(!add_guest(user, guest, guest.real_name, given_name, silent)) + return FALSE + return TRUE + +/datum/guestbook/proc/add_guest(mob/user, mob/living/carbon/guest, real_name, given_name, silent = TRUE) + //Already exists, should be handled by rename_guest() + var/existing_name = LAZYACCESS(known_names, real_name) + if(existing_name) + if(!silent) + to_chat(user, span_warning("You already know them as \"[existing_name]\".")) + return FALSE + LAZYADDASSOC(known_names, real_name, given_name) + if(!silent) + to_chat(user, span_notice("You memorize the face of [guest] as \"[given_name]\".")) + return TRUE + +/datum/guestbook/proc/rename_guest(mob/user, mob/living/carbon/guest, real_name, given_name, silent = TRUE) + var/old_name = LAZYACCESS(known_names, real_name) + if(!old_name) + return FALSE + known_names[real_name] = given_name + if(!silent) + to_chat(user, span_notice("You re-memorize the face of \"[old_name]\" as \"[given_name]\".")) + return TRUE + +/datum/guestbook/proc/try_remove_guest(mob/user, mob/living/carbon/human/guest, silent = FALSE) + if(user == guest) + if(!silent) + to_chat(user, span_warning("That's you! You'll never forget yourself.")) + return + if(!visibility_checks(user, guest, silent)) + return FALSE + var/face_name = guest.get_face_name() + if(!remove_guest(user, guest, face_name, silent)) + return FALSE + return TRUE + +/datum/guestbook/proc/remove_guest(mob/user, mob/living/carbon/guest, real_name, silent = TRUE) + //Already exists, should be handled by rename_guest() + var/existing_name = LAZYACCESS(known_names, real_name) + if(!existing_name) + if(!silent) + to_chat(user, span_warning("You don't know them in the first place.")) + return FALSE + LAZYREMOVE(known_names, real_name) + if(!silent) + to_chat(user, span_notice("You forget the face of \"[existing_name]\".")) + return TRUE + +/datum/guestbook/proc/get_known_name(mob/user, mob/living/carbon/guest, real_name) + if(user == guest) + return real_name + return LAZYACCESS(known_names, real_name) + +/datum/guestbook/proc/visibility_checks(mob/user, mob/living/carbon/human/guest, silent = FALSE) + if(QDELETED(guest)) + if(!silent) + to_chat(user, span_warning("What?")) + return FALSE + var/mob/living/living_user = user + if(istype(living_user) && !can_see(living_user, guest, 7)) + if(!silent) + to_chat(user, span_warning("You can't see them!")) + return FALSE + var/face_name = guest.get_face_name() + if((face_name == "Unknown")) + if(!silent) + to_chat(user, span_warning("You can't see their face very well!")) + return FALSE + if(get_dist(user, guest) > 4) + if(!silent) + to_chat(user, span_warning("You need to take a closer look at them!")) + return FALSE + return TRUE + +/mob/living/carbon/human/proc/attempt_guestbook_add(datum/source, atom/A) + SIGNAL_HANDLER + + if(!ishuman(A) || in_range(A, src)) + return + var/mob/living/carbon/human/targeted_human = A + if(!targeted_human.mind?.guestbook) + return + INVOKE_ASYNC(mind.guestbook, TYPE_PROC_REF(/datum/guestbook, try_add_guest), src, targeted_human, FALSE) + return COMSIG_MOB_CANCEL_CLICKON diff --git a/modular_darkpack/modules/guestbook/code/human_helpers.dm b/modular_darkpack/modules/guestbook/code/human_helpers.dm new file mode 100644 index 000000000000..e880665e2a61 --- /dev/null +++ b/modular_darkpack/modules/guestbook/code/human_helpers.dm @@ -0,0 +1,36 @@ +/mob/living/carbon/human/proc/get_gender() + var/visible_gender = get_visible_gender() + switch(visible_gender) + if(MALE) + visible_gender = "Man" + if(FEMALE) + visible_gender = "Woman" + else + visible_gender = "Person" + return visible_gender + +/mob/living/carbon/human/proc/get_age() + switch(age) + if(70 to INFINITY) + return "Geriatric" + if(60 to 70) + return "Elderly" + if(50 to 60) + return "Old" + if(40 to 50) + return "Middle-Aged" + if(24 to 40) + return "" //not necessary because this is basically the most common age range + if(18 to 24) + return "Young" + else + return "Puzzling" + +/mob/living/carbon/human/proc/get_generic_name(prefixed = FALSE, lowercase = FALSE) + var/visible_skin = GLOB.skin_tone_names[skin_tone] ? "[GLOB.skin_tone_names[skin_tone]] " : null + var/visible_gender = get_gender() + var/visible_age = get_age() + var/final_string = "[visible_adjective ? "[visible_adjective] " : null][visible_age ? "[visible_age] " : null][visible_skin][visible_gender]" + if(prefixed) + final_string = "\A [final_string]" + return lowercase ? lowertext(final_string) : final_string diff --git a/modular_darkpack/modules/guestbook/code/mob.dm b/modular_darkpack/modules/guestbook/code/mob.dm new file mode 100644 index 000000000000..5043dd07f95f --- /dev/null +++ b/modular_darkpack/modules/guestbook/code/mob.dm @@ -0,0 +1,12 @@ +///Shows guestbook tgui window +/mob/verb/guestbook() + set name = "Guestbook" + set category = "IC" + set desc = "View your character's Guestbook." + if(!mind) + var/fail_message = "You have no mind!" + if(isobserver(src)) + fail_message += " You have to be in the current round at some point to have one." + to_chat(src, span_warning(fail_message)) + return + mind.guestbook.ui_interact(usr) diff --git a/modular_darkpack/modules/guestbook/code/persistent_guestbooks.dm b/modular_darkpack/modules/guestbook/code/persistent_guestbooks.dm new file mode 100644 index 000000000000..e5e2e5e46619 --- /dev/null +++ b/modular_darkpack/modules/guestbook/code/persistent_guestbooks.dm @@ -0,0 +1,15 @@ +///Saves all guestbooks for everyone's original characters +/datum/controller/subsystem/persistence/proc/save_guestbooks() + for(var/i in GLOB.joined_player_list) + var/mob/living/carbon/human/ending_human = get_mob_by_ckey(i) + if(!istype(ending_human) || !ending_human.mind?.original_character_slot_index) + continue + + var/mob/living/carbon/human/original_human = ending_human.mind.original_character.resolve() + + if(!original_human) + continue + + if(original_human == ending_human) + original_human.client.prefs.guestbook_names = original_human.mind.guestbook.known_names + original_human.client.prefs.save_character() diff --git a/modular_darkpack/modules/guestbook/readme.md b/modular_darkpack/modules/guestbook/readme.md new file mode 100644 index 000000000000..3c97853ea5e3 --- /dev/null +++ b/modular_darkpack/modules/guestbook/readme.md @@ -0,0 +1,41 @@ +https://github.com/DarkPack13/SecondCity/pull/421 + +## \<Guestbooks> + +Module ID: GUESTBOOK + +### Description: + +This module is for guestbooks, our system that allows people to not know everyone off the bat and set custom names that are persistent across rounds. + +### TG Proc/File Changes: + +- `code/game/say.dm` +- `code/modules/mob/living/carbon/human/human_helpers.dm` +- `code/modules/unit_tests/surgeries.dm` +- `code/modules/unit_tests/changeling.dm` +- `code/controllers/subsystem/persistence/_persistence.dm` + +### Modular Overrides: + +- `modular_darkpack/master_files/code/datums/mind/_mind.dm` +- `modular_darkpack/master_files/code/modules/mob/living/carbon/human/init_signals.dm` +- `modular_darkpack/master_files/code/modules/client/preferences_savefile.dm` + +### Defines: + +- `code/__DEFINES/~darkpack/guestbook.dm` + +### Included files that are not contained in this module: + +- `tgui/packages/tgui/interfaces/Guestbook.tsx` + +### Other module changes: + +- `modular_darkpack/modules/jobs/code/_jobs.dm` + +### Credits: + +thgvr +meemofcourse +XeonMations diff --git a/modular_darkpack/modules/hair/code/sprite_accessories.dm b/modular_darkpack/modules/hair/code/sprite_accessories.dm new file mode 100644 index 000000000000..04273d2b1d93 --- /dev/null +++ b/modular_darkpack/modules/hair/code/sprite_accessories.dm @@ -0,0 +1,584 @@ +/datum/sprite_accessory/hair/darkpack + abstract_type = /datum/sprite_accessory/hair/darkpack + icon = 'modular_darkpack/master_files/icons/mob/human/human_face.dmi' + +/datum/sprite_accessory/hair/darkpack/africanpigtails + name = "African Pigtails" + icon_state = "hair_africanpigtails" + +/datum/sprite_accessory/hair/darkpack/afropuffdouble + name = "Afro Puff (Double)" + icon_state = "hair_afropuffdouble" + +/datum/sprite_accessory/hair/darkpack/afropuffleft + name = "Afro Puff (Left)" + icon_state = "hair_afropuffleft" + +/datum/sprite_accessory/hair/darkpack/afropuffright + name = "Afro Puff (Right)" + icon_state = "hair_afropuffright" + +/datum/sprite_accessory/hair/darkpack/amazon + name = "Amazon" + icon_state = "hair_amazon" + +/datum/sprite_accessory/hair/darkpack/baum + name = "Baum" + icon_state = "hair_baum" + +/datum/sprite_accessory/hair/darkpack/bangsblunt + name = "Bangs (Blunt)" + icon_state = "hair_bluntbangs" + +/datum/sprite_accessory/hair/darkpack/bangsbluntalt + name = "Bangs (Blunt, Alt)" + icon_state = "hair_bluntbangs_alt" + +/datum/sprite_accessory/hair/darkpack/bangsdiagonal + name = "Bangs (Diagonal)" + icon_state = "hair_diagonal_bangs" + +/datum/sprite_accessory/hair/darkpack/bangsdiagonalalt + name = "Bangs (Diagonal Alt)" + icon_state = "hair_diagonal_bangs_alt" + +/datum/sprite_accessory/hair/darkpack/bangsfluffy + name = "Bangs (Fluffy)" + icon_state = "hair_fluffy_bangs" + +/datum/sprite_accessory/hair/darkpack/beachwave + name = "Beachwave" + icon_state = "hair_beachwave" + +/datum/sprite_accessory/hair/darkpack/bedheadlonger + name = "Longest Bedhead" + icon_state = "hair_longer_bedhead" + +/datum/sprite_accessory/hair/darkpack/beehive3 + name = "Beehive 3" + icon_state = "hair_beehive2" + +/datum/sprite_accessory/hair/darkpack/bobcutovereyeone + name = "Bobcut (Over Eye 1)" + icon_state = "hair_bobcut_over_eye_1" + +/datum/sprite_accessory/hair/darkpack/bobcutovereyetwo + name = "Bobcut (Over Eye 2)" + icon_state = "hair_bobcut_over_eye_2" + +/datum/sprite_accessory/hair/darkpack/bobcutovereyethree + name = "Bobcut (Over Eye 3)" + icon_state = "hair_bobcut_over_eye_3" + +/datum/sprite_accessory/hair/darkpack/bobcutalt + name = "Bobcut (Alt)" + icon_state = "hair_bobcutalt" + +/datum/sprite_accessory/hair/darkpack/bonnie + name = "Bonnie" + icon_state = "hair_bonnie" + +/datum/sprite_accessory/hair/darkpack/bonnielong + name = "Bonnie (Long)" + icon_state = "hair_bonnie_long" + +/datum/sprite_accessory/hair/darkpack/bonnieshort + name = "Bonnie (Short)" + icon_state = "hair_bonnie_short" + +/datum/sprite_accessory/hair/darkpack/bonnietwo + name = "Bonnie 2" + icon_state = "hair_bonnie_2" + +/datum/sprite_accessory/hair/darkpack/bonnietwolong + name = "Bonnie 2 (Long)" + icon_state = "hair_bonnie_2_long" + +/datum/sprite_accessory/hair/darkpack/bonnietwoshort + name = "Bonnie 2 (Short)" + icon_state = "hair_bonnie_2_short" + +/datum/sprite_accessory/hair/darkpack/braidedfronttwo + name = "Braided Front 2" + icon_state = "hair_braided_front" + +/datum/sprite_accessory/hair/darkpack/mediumbraid + name = "Braid (Medium)" + icon_state = "hair_mediumbraid" + +/datum/sprite_accessory/hair/darkpack/bun4 + name = "Bun Head 4" + icon_state = "hair_bunhead4" + +/datum/sprite_accessory/hair/darkpack/lowbun + name = "Bun (Low)" + icon_state = "hair_low_bun" + +/datum/sprite_accessory/hair/darkpack/tribun + name = "Bun (Triple)" + icon_state = "hair_tri_bun" + +/datum/sprite_accessory/hair/darkpack/tribunlong + name = "Bun (Triple, Long)" + icon_state = "hair_tri_bun_long" + +/datum/sprite_accessory/hair/darkpack/combed + name = "Combed" + icon_state = "hair_combed" + +/datum/sprite_accessory/hair/darkpack/combedbob + name = "Combed Bob" + icon_state = "hair_combedbob" + +/datum/sprite_accessory/hair/darkpack/cornrowsalt + name = "Cornrows Alt" + icon_state = "hair_rows1" + +/datum/sprite_accessory/hair/darkpack/cornrowsaltlong + name = "Cornrows Alt Long" + icon_state = "hair_rows2" + +/datum/sprite_accessory/hair/darkpack/cotton + name = "Cotton" + icon_state = "hair_cotton" + +/datum/sprite_accessory/hair/darkpack/cottonalt + name = "Cotton (Alt)" + icon_state = "hair_cottonalt" + +/datum/sprite_accessory/hair/darkpack/country + name = "Country" + icon_state = "hair_country_s" + +/datum/sprite_accessory/hair/darkpack/curly + name = "Curly" + icon_state = "hair_curly" + +/datum/sprite_accessory/hair/darkpack/dave + name = "Dave" + icon_state = "hair_dave" + +/datum/sprite_accessory/hair/darkpack/dawn + name = "Dawn" + icon_state = "hair_dawn" + +/datum/sprite_accessory/hair/darkpack/dreadlockslong + name = "Dreadlocks (Long)" + icon_state = "hair_dreadlocks_long" + +/datum/sprite_accessory/hair/darkpack/emolong + name = "Emo (Long)" + icon_state = "hair_emolong" + +/datum/sprite_accessory/hair/darkpack/emoshort + name = "Emo (Short)" + icon_state = "hair_emoshort" + +/datum/sprite_accessory/hair/darkpack/fingerwave + name = "Fingerwave" + icon_state = "hair_fingerwave" + +/datum/sprite_accessory/hair/darkpack/fluffy + name = "Fluffy" + icon_state = "hair_fluffy" + +/datum/sprite_accessory/hair/darkpack/fluffylong + name = "Fluffy (Long)" + icon_state = "hair_fluffy_long" + +/datum/sprite_accessory/hair/darkpack/fluffyshort + name = "Fluffy (Short)" + icon_state = "hair_fluffy_short" + +/datum/sprite_accessory/hair/darkpack/froofylong + name = "Froofy (Long)" + icon_state = "hair_froofylong" + +/datum/sprite_accessory/hair/darkpack/geisha + name = "Geisha" + icon_state = "hair_geisha" + +/datum/sprite_accessory/hair/darkpack/gentlebun + name = "Gentle (Bun)" + icon_state = "hair_gentle_bun" + +/datum/sprite_accessory/hair/darkpack/gentleduobun + name = "Gentle (Duo Bun)" + icon_state = "hair_gentle_duo_bun" + +/datum/sprite_accessory/hair/darkpack/gentletwentyone + name = "Gentle 21" + icon_state = "hair_gentle21" + +/datum/sprite_accessory/hair/darkpack/glammetal + name = "Glammetal" + icon_state = "hair_glammetal" + +/datum/sprite_accessory/hair/darkpack/gloomymedium + name = "Gloomy (Medium)" + icon_state = "hair_gloomy_medium" + +/datum/sprite_accessory/hair/darkpack/gloomylong + name = "Gloomy (Long)" + icon_state = "hair_gloomy_long" + +/datum/sprite_accessory/hair/darkpack/gloomylonger + name = "Gloomy (Longer)" + icon_state = "hair_gloomy_longer" + +/datum/sprite_accessory/hair/darkpack/grande + name = "Grande" + icon_state = "hair_grande" + +/datum/sprite_accessory/hair/darkpack/hairfre + name = "Hairfre" + icon_state = "hair_hairfre" + +/datum/sprite_accessory/hair/darkpack/halfbang3 + name = "Half-banged Hair 3" + icon_state = "hair_halfbangalt" + +/datum/sprite_accessory/hair/darkpack/halfshave + name = "Half-shave" + icon_state = "hair_halfshave" + +/datum/sprite_accessory/hair/darkpack/halfshaved2 + name = "Half-shave 2" + icon_state = "hair_halfshaved2" + +/datum/sprite_accessory/hair/darkpack/halfshaveglam + name = "Half-shave (Glamorous)" + icon_state = "hair_halfshave_glamorous" + +/datum/sprite_accessory/hair/darkpack/halfshavelong + name = "Half-shave (Long)" + icon_state = "hair_halfshave_long" + +/datum/sprite_accessory/hair/darkpack/halfshavemessy + name = "Half-shave (Messy)" + icon_state = "hair_halfshave_messy" + +/datum/sprite_accessory/hair/darkpack/halfshavemessylong + name = "Halfshave (Messy, Long)" + icon_state = "hair_halfshave_messylong" + +/datum/sprite_accessory/hair/darkpack/holotuber + name = "Holotuber" + icon_state = "hair_holo_tuber" + +/datum/sprite_accessory/hair/darkpack/inari + name = "Inari" + icon_state = "hair_inari" + +/datum/sprite_accessory/hair/darkpack/jay + name = "Jay" + icon_state = "hair_jay" + +/datum/sprite_accessory/hair/darkpack/jessica + name = "Jessica" + icon_state = "hair_jessica" + +/datum/sprite_accessory/hair/darkpack/kobenione + name = "Kobeni 1" + icon_state = "hair_kobeni_1" + +/datum/sprite_accessory/hair/darkpack/kobenitwo + name = "Kobeni 2" + icon_state = "hair_kobeni_2" + +/datum/sprite_accessory/hair/darkpack/lila + name = "Lila" + icon_state = "hair_lila" + +/datum/sprite_accessory/hair/darkpack/long4 + name = "Long Hair 4" + icon_state = "hair_long4" + +/datum/sprite_accessory/hair/darkpack/longovereyealt + name = "Long Over Eye (Alt)" + icon_state = "hair_longovereye_alt" + +/datum/sprite_accessory/hair/darkpack/longsidepartstraight + name = "Long Side Part (Straight)" + icon_state = "hair_longsidepartstraight" + +/datum/sprite_accessory/hair/darkpack/looseslicked + name = "Loose Slicked" + icon_state = "hair_loose_slicked" + +/datum/sprite_accessory/hair/darkpack/luxurious + name = "Luxurious" + icon_state = "hair_luxurious" + +/datum/sprite_accessory/hair/darkpack/luxuriousalt + name = "Luxurious (Alt)" + icon_state = "hair_luxurious_alt" + +/datum/sprite_accessory/hair/darkpack/mcsqueeb + name = "McSqueeb" + icon_state = "hair_mcsqueeb" + +/datum/sprite_accessory/hair/darkpack/shortmohawk + name = "Mohawk (Short)" + icon_state = "hair_mohawkshort" + +/datum/sprite_accessory/hair/darkpack/morning + name = "Morning" + icon_state = "hair_morning" + +/datum/sprite_accessory/hair/darkpack/newyou + name = "New You" + icon_state = "hair_newyou" + +/datum/sprite_accessory/hair/darkpack/nia + name = "Nia" + icon_state = "hair_nia" + +/datum/sprite_accessory/hair/darkpack/overearone + name = "Over Ear 1" + icon_state = "hair_over_ear_1" + +/datum/sprite_accessory/hair/darkpack/overeartwo + name = "Over Ear 2" + icon_state = "hair_over_ear_2" + +/datum/sprite_accessory/hair/darkpack/overeye + name = "Over Eye (Alt)" + icon_state = "hair_over_eye" + +/datum/sprite_accessory/hair/darkpack/shortovereyealt + name = "Over Eye (Short Alt)" + icon_state = "hair_shortovereyealt" + +/datum/sprite_accessory/hair/darkpack/phoenix + name = "Phoenix" + icon_state = "hair_phoenix" + +/datum/sprite_accessory/hair/darkpack/phoenixhalfshaven + name = "Phoenix (Half-Shaven)" + icon_state = "hair_phoenix_half_shaven" + +/datum/sprite_accessory/hair/darkpack/pigtail3 + name = "Pigtails 4" + icon_state = "hair_pigtails3" + +/datum/sprite_accessory/hair/darkpack/ponytail8 + name = "Ponytail 8" + icon_state = "hair_ponytailf" + +/datum/sprite_accessory/hair/darkpack/ponytailalt + name = "Ponytail (Alt)" + icon_state = "hair_ponytailalt" + +/datum/sprite_accessory/hair/darkpack/lowponytail + name = "Ponytail (Low)" + icon_state = "hair_low_ponytail" + +/datum/sprite_accessory/hair/darkpack/simpleponytail + name = "Ponytail (Simple)" + icon_state = "hair_simple_ponytail" + +/datum/sprite_accessory/hair/darkpack/simpleponytailalt + name = "Ponytail (Simple Alt)" + icon_state = "hair_simple_ponytail_alt" + +/datum/sprite_accessory/hair/darkpack/ponytailthin + name = "Ponytail (Thin)" + icon_state = "hair_thin_ponytail" + +/datum/sprite_accessory/hair/darkpack/ponytailthinlong + name = "Ponytail (Thin, Long)" + icon_state = "hair_thin_ponytail_long" + +/datum/sprite_accessory/hair/darkpack/poofytwo + name = "Poofy 2" + icon_state = "hair_poofy2" + +/datum/sprite_accessory/hair/darkpack/pyotr + name = "Pyotr" + icon_state = "hair_pyotr" + +/datum/sprite_accessory/hair/darkpack/ribbonbraid + name = "Ribbon Braid" + icon_state = "hair_ribbonbraid" + +/datum/sprite_accessory/hair/darkpack/ringtails + name = "Ringtails" + icon_state = "hair_ring_tails" + +/datum/sprite_accessory/hair/darkpack/runner + name = "Runner" + icon_state = "hair_runner" + +/datum/sprite_accessory/hair/darkpack/runnerbun + name = "Runner (Bun)" + icon_state = "hair_runner_bun" + +/datum/sprite_accessory/hair/darkpack/sabitsuki + name = "Sabitsuki" + icon_state = "hair_sabitsuki" + +/datum/sprite_accessory/hair/darkpack/scully + name = "Scully" + icon_state = "hair_scully" + +/datum/sprite_accessory/hair/darkpack/shavedmanbun + name = "Shaved (Manbun)" + icon_state = "hair_shavedmanbun" + +/datum/sprite_accessory/hair/darkpack/shorthair8 + name = "Short Hair 8" + icon_state = "hair_shorthair4" + +/datum/sprite_accessory/hair/darkpack/shorttassles + name = "Short Tassles" + icon_state = "hair_short_tassles" + +/datum/sprite_accessory/hair/darkpack/shy + name = "Shy" + icon_state = "hair_shy" + +/datum/sprite_accessory/hair/darkpack/simple + name = "Simple" + icon_state = "hair_simple" + +/datum/sprite_accessory/hair/darkpack/simplelong + name = "Simple (Long)" + icon_state = "hair_simple_long" + +/datum/sprite_accessory/hair/darkpack/simpleshort + name = "Simple (Short)" + icon_state = "hair_simple_short" + +/datum/sprite_accessory/hair/darkpack/simpleponytail + name = "Simple (Ponytail)" + icon_state = "hair_simpleponytail" + +/datum/sprite_accessory/hair/darkpack/simpleponytailshort + name = "Simple (Ponytail, Short)" + icon_state = "hair_simpleponytail_short" + +/datum/sprite_accessory/hair/darkpack/sleaze + name = "Sleaze" + icon_state = "hair_sleaze" + +/datum/sprite_accessory/hair/darkpack/slightlymessy + name = "Slightly Messy" + icon_state = "hair_slightlymessy" + +/datum/sprite_accessory/hair/darkpack/spicy + name = "Spicy" + icon_state = "hair_spicy" + +/datum/sprite_accessory/hair/darkpack/spikey + name = "Spikey" + icon_state = "hair_spikey2" + +/datum/sprite_accessory/hair/darkpack/spikeylong + name = "Spikey (Long)" + icon_state = "hair_spikey_long" + +/datum/sprite_accessory/hair/darkpack/stacy + name = "Stacy" + icon_state = "hair_stacy" + +/datum/sprite_accessory/hair/darkpack/stacybun + name = "Stacy (Bun)" + icon_state = "hair_stacy_bun" + +/datum/sprite_accessory/hair/darkpack/strict + name = "Strict" + icon_state = "hair_strict" + +/datum/sprite_accessory/hair/darkpack/strictlong + name = "Strict (Long)" + icon_state = "hair_strict_long" + +/datum/sprite_accessory/hair/darkpack/strictshort + name = "Strict (Short)" + icon_state = "hair_strict_short" + +/datum/sprite_accessory/hair/darkpack/thefamilyman + name = "The Family Man" + icon_state = "hair_thefamilyman" + +/datum/sprite_accessory/hair/darkpack/toriyama + name = "Toriyama" + icon_state = "hair_toriyama" + +/datum/sprite_accessory/hair/darkpack/twintailstwo + name = "Twintails 2" + icon_state = "hair_twintails_2" + +/datum/sprite_accessory/hair/darkpack/twintailstwolong + name = "Twintails 2 (Long)" + icon_state = "hair_twintails_2_long" + +/datum/sprite_accessory/hair/darkpack/twintailstwoshort + name = "Twintails 2 (Short)" + icon_state = "hair_twintails_2_short" + +/datum/sprite_accessory/hair/darkpack/twintailsfloorlength + name = "Twintails (Floorlength)" + icon_state = "hair_twintail_floor" + +/datum/sprite_accessory/hair/darkpack/upwards + name = "Upwards" + icon_state = "hair_upwards" + +/datum/sprite_accessory/hair/darkpack/longeralt + name = "Very Long Hair (Alt)" + icon_state = "hair_longeralt" + +/datum/sprite_accessory/hair/darkpack/veryshortovereyealt + name = "Very Short Over Eye (Alt)" + icon_state = "hair_veryshortovereye" + +/datum/sprite_accessory/hair/darkpack/victory + name = "Victory" + icon_state = "hair_victory" + +/datum/sprite_accessory/hair/darkpack/violet + name = "Violet" + icon_state = "hair_violet" + +/datum/sprite_accessory/hair/darkpack/violetponytail + name = "Violet (Ponytail)" + icon_state = "hair_violet_ponytail" + +/datum/sprite_accessory/hair/darkpack/viper + name = "Viper" + icon_state = "hair_viper" + +/datum/sprite_accessory/hair/darkpack/wife + name = "Wife" + icon_state = "hair_wife" + +/datum/sprite_accessory/hair/darkpack/zoey + name = "Zoey" + icon_state = "hair_zoey" + +///ORIGINAL +/datum/sprite_accessory/hair/ziegler + name = "Ziegler" + icon_state = "hair_ziegler" + +///ORIGINAL +/datum/sprite_accessory/hair/verybadlycut + name = "Very Badly Cut" + icon_state = "hair_verybadlycut" + +///ORIGINAL +/datum/sprite_accessory/hair/nitori + name = "Nitori" + icon_state = "hair_nitori" + +///ORIGINAL +/datum/sprite_accessory/hair/chinbob + name = "Chinbob" + icon_state = "hair_chinbob" + +///ORIGINAL +/datum/sprite_accessory/hair/allthefuzz + name = "All The Fuzz" + icon_state = "hair_allthefuzz" diff --git a/modular_darkpack/modules/html/dementation/css/chaos.css b/modular_darkpack/modules/html/dementation/css/chaos.css new file mode 100644 index 000000000000..0eeab654ea76 --- /dev/null +++ b/modular_darkpack/modules/html/dementation/css/chaos.css @@ -0,0 +1,104 @@ +@keyframes move { + 100% { + transform: translate3d(0, 0, 1px) rotate(360deg); + } +} + +body { + width: 80%; + height: 80%; + overflow: scroll; +} + +.whitetext { + color: white; + width: 90%; + margin-left: 5%; +} + +.background { + position: fixed; + width: 100vw; + height: 100vh; + top: 0; + left: 0; + background: #06030a; + overflow: hidden; +} + +.background span { + width: 1vmin; + height: 1vmin; + border-radius: 1vmin; + backface-visibility: hidden; + position: absolute; + animation: move; + animation-duration: 50; + animation-timing-function: linear; + animation-iteration-count: infinite; +} + + +.background span:nth-child(0) { + color: #583C87; + top: 80%; + left: 25%; + animation-duration: 6s; + animation-delay: -1s; + transform-origin: -7vw -9vh; + box-shadow: -2vmin 0 1.0749931528524765vmin currentColor; +} +.background span:nth-child(1) { + color: #FFACAC; + top: 100%; + left: 6%; + animation-duration: 6s; + animation-delay: -1s; + transform-origin: 24vw 17vh; + box-shadow: -2vmin 0 0.9919208112195508vmin currentColor; +} +.background span:nth-child(2) { + color: #E45A84; + top: 89%; + left: 69%; + animation-duration: 6s; + animation-delay: -1s; + transform-origin: 8vw -11vh; + box-shadow: 2vmin 0 1.2111111803764998vmin currentColor; +} +.background span:nth-child(3) { + color: #583C87; + top: 94%; + left: 39%; + animation-duration: 6s; + animation-delay: -1s; + transform-origin: 2vw -1vh; + box-shadow: -2vmin 0 0.7300966174833036vmin currentColor; +} +.background span:nth-child(4) { + color: #E45A84; + top: 73%; + left: 53%; + animation-duration: 6s; + animation-delay: -1s; + transform-origin: -2vw -1vh; + box-shadow: -2vmin 0 0.9294391787830284vmin currentColor; +} +.background span:nth-child(5) { + color: #E45A84; + top: 63%; + left: 78%; + animation-duration: 6s; + animation-delay: -1s; + transform-origin: 12vw -15vh; + box-shadow: 2vmin 0 0.47078694146324207vmin currentColor; +} +.background span:nth-child(6) { + color: #E45A84; + top: 5%; + left: 59%; + animation-duration: 6s; + animation-delay: -1s; + transform-origin: -18vw -13vh; + box-shadow: 2vmin 0 1.0556933825119206vmin currentColor; +} diff --git a/modular_darkpack/modules/human_visuals/code/extra_human_sprites.dm b/modular_darkpack/modules/human_visuals/code/extra_human_sprites.dm index d6c3adc157dc..7a03eb93a3de 100644 --- a/modular_darkpack/modules/human_visuals/code/extra_human_sprites.dm +++ b/modular_darkpack/modules/human_visuals/code/extra_human_sprites.dm @@ -14,6 +14,7 @@ // If no base sprite is supplied, get a default from either the species or the Clan if (!sprite_name) + var/datum/vampire_clan/clan = get_clan() if (clan?.alt_sprite && !ignore_clan) sprite_name = clan.alt_sprite greyscale = clan.alt_sprite_greyscale diff --git a/modular_darkpack/modules/human_visuals/code/shadows.dm b/modular_darkpack/modules/human_visuals/code/shadows.dm deleted file mode 100644 index 33e8b7415eb5..000000000000 --- a/modular_darkpack/modules/human_visuals/code/shadows.dm +++ /dev/null @@ -1,16 +0,0 @@ -/mob/living/carbon/human/toggle_resting() - . = ..() - - update_shadow() - -/mob/living/carbon/human/proc/update_shadow() - if (body_position != LYING_DOWN) - if (overlays_standing[UNDERSHADOW_LAYER]) - return - var/mutable_appearance/lying_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "shadow", -UNDERSHADOW_LAYER) - lying_overlay.pixel_z = -4 - lying_overlay.alpha = 64 - overlays_standing[UNDERSHADOW_LAYER] = lying_overlay - apply_overlay(UNDERSHADOW_LAYER) - else if (overlays_standing[UNDERSHADOW_LAYER]) - remove_overlay(UNDERSHADOW_LAYER) diff --git a/modular_darkpack/modules/jobs/code/_departments.dm b/modular_darkpack/modules/jobs/code/_departments.dm new file mode 100644 index 000000000000..3359cb7ff6d8 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/_departments.dm @@ -0,0 +1,131 @@ +/datum/job_department/citizen + department_name = DEPARTMENT_CITIZEN + department_bitflags = DEPARTMENT_BITFLAG_CITIZEN + // Don't add department_head! citizens names should not be in bold. + +/// A special prince only department, for use by the preferences menu +/datum/job_department/prince + department_name = DEPARTMENT_PRINCE + department_bitflags = DEPARTMENT_BITFLAG_PRINCE + department_head = /datum/job/vampire/prince + +/datum/job_department/camarilla + department_name = DEPARTMENT_CAMARILLA + department_bitflags = DEPARTMENT_BITFLAG_CAMARILLA + department_head = /datum/job/vampire/prince + department_experience_type = EXP_TYPE_CAMARILLA + display_order = 1 + label_class = "camarilla" + ui_color = "#6681a5" + +/datum/job_department/church + department_name = DEPARTMENT_CHURCH + department_bitflags = DEPARTMENT_BITFLAG_CHURCH + department_head = /datum/job/vampire/prince + department_experience_type = EXP_TYPE_CHURCH + display_order = 1 + label_class = "church" + ui_color = "#8c66a5" + +/datum/job_department/clinic + department_name = DEPARTMENT_CLINIC + department_bitflags = DEPARTMENT_BITFLAG_CLINIC + department_head = /datum/job/vampire/primogen_malkavian + department_experience_type = EXP_TYPE_CLINIC + display_order = 1 + label_class = "clinic" + ui_color = "#6681a5" + +/datum/job_department/anarch + department_name = DEPARTMENT_ANARCH + department_bitflags = DEPARTMENT_BITFLAG_ANARCH + department_head = /datum/job/vampire/baron + department_experience_type = EXP_TYPE_ANARCH + display_order = 1 + label_class = "anarch" + ui_color = "#a56666" + +/datum/job_department/supply + department_name = DEPARTMENT_SUPPLY + department_bitflags = DEPARTMENT_BITFLAG_SUPPLY + department_head = /datum/job/vampire/dealer + department_experience_type = EXP_TYPE_WAREHOUSE + display_order = 1 + label_class = "supply" + ui_color = "#a58866" + +/datum/job_department/strip_club + department_name = DEPARTMENT_STRIP_CLUB + department_bitflags = DEPARTMENT_BITFLAG_STRIP_CLUB + department_head = /datum/job/vampire/primogen_toreador + department_experience_type = EXP_TYPE_CLUB + display_order = 1 + label_class = "strip_club" + ui_color = "#a566a5ff" + +/datum/job_department/giovanni + department_name = DEPARTMENT_GIOVANNI + department_bitflags = DEPARTMENT_BITFLAG_GIOVANNI + department_head = /datum/job/vampire/capo + department_experience_type = EXP_TYPE_GIOVANNI + display_order = 1 + label_class = "giovanni" + ui_color = "#66a569ff" + +/datum/job_department/police + department_name = DEPARTMENT_POLICE + department_bitflags = DEPARTMENT_BITFLAG_POLICE + department_head = /datum/job/vampire/police_chief + department_experience_type = EXP_TYPE_POLICE + display_order = 1 + label_class = "police" + ui_color = "#6a6288ff" + +/datum/job_department/sabbat + department_name = DEPARTMENT_SABBAT + department_bitflags = DEPARTMENT_BITFLAG_SABBAT + department_head = /datum/job/vampire/sabbatductus + department_experience_type = EXP_TYPE_SABBAT + display_order = 1 + label_class = "sabbat" + ui_color = "#4e4e4eff" + +/datum/job_department/chantry + department_name = DEPARTMENT_CHANTRY + department_bitflags = DEPARTMENT_BITFLAG_CHANTRY + department_head = /datum/job/vampire/regent + department_experience_type = EXP_TYPE_CHANTRY + display_order = 1 + label_class = "chantry" + ui_color = "#a56666ff" + +/datum/job_department/manor + department_name = DEPARTMENT_MANOR + department_bitflags = DEPARTMENT_BITFLAG_MANOR + department_head = /datum/job/vampire/voivode + department_experience_type = EXP_TYPE_MANOR + display_order = 1 + label_class = "manor" + ui_color = "#a066a5ff" + +/datum/job_department/city_services + department_name = DEPARTMENT_CITY_SERVICES + department_bitflags = DEPARTMENT_BITFLAG_CITY_SERVICES + +/datum/job_department/gaia + department_name = DEPARTMENT_GAIA + department_bitflags = DEPARTMENT_BITFLAG_GAIA + department_head = /datum/job/vampire/councillor + department_experience_type = EXP_TYPE_GAIA + display_order = 1 + label_class = "gaia" + ui_color = "#b4bd64" + +/datum/job_department/pentex + department_name = DEPARTMENT_PENTEX + department_bitflags = DEPARTMENT_BITFLAG_PENTEX + department_head = /datum/job/vampire/branch_lead + department_experience_type = EXP_TYPE_SPIRAL + display_order = 1 + label_class = "pentex" + ui_color = COLOR_ENDRON_GREEN diff --git a/modular_darkpack/modules/jobs/code/_job_assignment.dm b/modular_darkpack/modules/jobs/code/_job_assignment.dm new file mode 100644 index 000000000000..ba22ac53b952 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/_job_assignment.dm @@ -0,0 +1,58 @@ +/* + * Runs an extended suite of eligibility checks to make sure the player can take the requested job. + * + * Checks: + * * Species Availability + * * Species Slots + * * Whitelist - TODO + * * Kindred Age + * * Kindred Generation + * * Kindred Clan + * + * Arguments: + * * player - The player to check for job eligibility. + * * possible_job - The job to check for eligibility against. + * * debug_prefix - Logging prefix for the job_debug log entries. For example, GRJ during give_random_job or DO during divide_occupations. + * * add_job_to_log - If TRUE, appends the job type to the log entry. If FALSE, does not. Set to FALSE when check is part of iterating over players for a specific job, set to TRUE when check is part of iterating over jobs for a specific player and you don't want extra log entry spam. + */ +/datum/controller/subsystem/job/proc/check_job_eligibility_darkpack(mob/dead/new_player/player, datum/job/possible_job, debug_prefix = "", add_job_to_log = FALSE) + var/client/player_client = GET_CLIENT(player) + var/datum/species/player_species = GLOB.species_prototypes[player_client.prefs.read_preference(/datum/preference/choiced/species)] + var/player_species_id = player_species.id + + if(!(player_species_id in possible_job.allowed_species)) + job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_SPECIES, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + return JOB_UNAVAILABLE_SPECIES + + if(possible_job.species_slots[player_species_id] == 0) + job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_SPECIES_SLOTS, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + return JOB_UNAVAILABLE_SPECIES_SLOTS + + /* + if(possible_job.whitelisted) + job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_WHITELIST, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + return JOB_UNAVAILABLE_WHITELIST + */ + + if(player_species_id != SPECIES_KINDRED) + return JOB_AVAILABLE + // Beyond this point, we know our species is a kindred. + + if((player_client.prefs.read_preference(/datum/preference/numeric/immortal_age) < possible_job.minimum_immortal_age)) + job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_KINDRED_AGE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + return JOB_UNAVAILABLE_KINDRED_AGE + + if((player_client.prefs.read_preference(/datum/preference/numeric/generation) > possible_job.minimal_generation)) + job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_KINDRED_GENERATION, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + return JOB_UNAVAILABLE_KINDRED_GENERATION + + var/datum/vampire_clan/clan = get_vampire_clan(player_client.prefs.read_preference(/datum/preference/choiced/vampire_clan)) + if(possible_job.allowed_clans && !(clan.id in possible_job.allowed_clans)) + job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_KINDRED_CLAN, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + return JOB_UNAVAILABLE_KINDRED_CLAN + if(possible_job.disallowed_clans && (clan.id in possible_job.disallowed_clans)) + job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_KINDRED_CLAN, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + return JOB_UNAVAILABLE_KINDRED_CLAN + + return JOB_AVAILABLE + diff --git a/modular_darkpack/modules/jobs/code/_jobs.dm b/modular_darkpack/modules/jobs/code/_jobs.dm new file mode 100644 index 000000000000..dcbac58c0326 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/_jobs.dm @@ -0,0 +1,77 @@ +// Default vampire base type. +/datum/job + ///Minimum vampire Generation necessary to do this job. + var/minimal_generation = HIGHEST_GENERATION_LIMIT + ///Minimum Masquerade level necessary to do this job. + var/minimal_masquerade = 0 + /// Character must be at least this age (in years) since embrace (chronological_age - age) to join as role. + var/minimum_immortal_age = 0 + + ///List of species that are allowed to do this job. + var/list/allowed_species = list(SPECIES_HUMAN, SPECIES_GHOUL, SPECIES_KINDRED) + ///List of species that are limited to a certain amount of that species doing this job. + var/list/species_slots = list(SPECIES_HUMAN = -1, SPECIES_GHOUL = -1, SPECIES_KINDRED = -1) + ///List of Clans that are allowed to do this job. + var/list/allowed_clans + ///List of Clans that are disallowed to do this job. + var/list/disallowed_clans + ///If this job requires whitelisting before it can be selected for characters. + var/whitelisted = FALSE + + // Only for display in memories + var/list/known_contacts = null + + ///Guestbook flags, to establish who knowns who etc + var/guestbook_flags = NONE + +// Default vampire job outfits. +/datum/outfit/job/vampire + uniform = /obj/item/clothing/under/color/grey + id = null + ears = null + belt = null + back = /obj/item/storage/backpack + shoes = /obj/item/clothing/shoes/sneakers/black + box = null + pda_slot = null + +/datum/outfit/job/vampire/post_equip(mob/living/carbon/human/user, visuals_only = FALSE) + . = ..() + var/obj/item/smartphone/phone = locate() in user.contents + if(phone) + phone.owner_weakref = WEAKREF(user) + phone.update_initialized_contacts() + +/datum/job/after_spawn(mob/living/spawned, client/player_client) + . = ..() + if(!(guestbook_flags & GUESTBOOK_FORGETMENOT)) + for(var/mob/player_mob as anything in GLOB.player_list) + if((player_mob == spawned) || !player_mob.mind?.assigned_role) + continue + var/datum/job/player_mob_job = player_mob.mind.assigned_role + var/list/common_departments = player_mob_job.departments_list & departments_list //wonky + //if we satisfy at least one condition, add us to their guestbook + if(player_mob_job.guestbook_flags & GUESTBOOK_OMNISCIENT || \ + ((player_mob_job.guestbook_flags & GUESTBOOK_JOB) && (player_mob_job.type == src.type)) || \ + ((player_mob_job.guestbook_flags & GUESTBOOK_DEPARTMENT) && length(common_departments))) + player_mob.mind.guestbook.add_guest(player_mob, spawned, spawned.mind.name, spawned.mind.name, silent = TRUE) + //if we satisfy at least one condition, add them to our guestbook + if(guestbook_flags & GUESTBOOK_OMNISCIENT || \ + ((guestbook_flags & GUESTBOOK_JOB) && (src.type == player_mob_job.type)) || \ + ((guestbook_flags & GUESTBOOK_DEPARTMENT) && length(common_departments))) + spawned.mind.guestbook.add_guest(spawned, player_mob, player_mob.mind.name, player_mob.mind.name, silent = TRUE) + +/** + * This type is used to indicate a lack of a job. + * The mind variable assigned_role will point here by default. + * As any other job datum, this is a singleton. + **/ + +/datum/job/vampire/unassigned + title = JOB_ORDINARY_CITIZEN + rpg_title = "Peasant" + + +/// Returns information pertaining to this job's radio. +/datum/job/vampire/get_radio_information() + return diff --git a/modular_darkpack/modules/jobs/code/anarchs/baron.dm b/modular_darkpack/modules/jobs/code/anarchs/baron.dm index 2875bb7f5397..4efba4267b1e 100644 --- a/modular_darkpack/modules/jobs/code/anarchs/baron.dm +++ b/modular_darkpack/modules/jobs/code/anarchs/baron.dm @@ -1,59 +1,36 @@ - -/datum/job/vamp/barkeeper - title = "Baron" - department_head = list("Justicar") - faction = "Vampire" +/datum/job/vampire/baron + title = JOB_BARON + faction = FACTION_CITY total_positions = 1 spawn_positions = 1 supervisors = "the Anarchs and the Traditions" - selection_color = "#434343" - - outfit = /datum/outfit/job/barkeeper - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_BARKEEPER - bounty_types = CIV_JOB_DRINK - -// minimal_generation = 11 //Uncomment when players get exp enough - - my_contact_is_important = TRUE - known_contacts = list( - "Prince", - "Sheriff", - "Dealer", - "Bouncer", - "Emissary", - "Sweeper" + config_tag = "BARON" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/baron + + display_order = JOB_DISPLAY_ORDER_BARON + department_for_prefs = /datum/job_department/anarch + departments_list = list( + /datum/job_department/anarch, ) - v_duty = "You lead the Anarchs in the City. A Camarilla faction that values freedom and individuality. While not a fan of the traditions, you still respect the Masquerade." + known_contacts = list("Bouncer", "Emissary", "Sweeper", "Prince", "Sheriff") + allowed_clans = list(VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_BAALI, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_CAITIFF, VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_SETITE) + allowed_species = list(SPECIES_KINDRED) + description = "You lead the Anarchs in the City. A Camarilla faction that values freedom and individuality. While not a fan of the traditions, you still respect the Masquerade." minimal_masquerade = 3 - allowed_species = list("Vampire") - allowed_bloodlines = list("Daughters of Cacophony", "Baali", "Banu Haqim", "Caitiff", "True Brujah", "Brujah", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Ventrue", "Lasombra", "Gargoyle", "Ministry") -/datum/outfit/job/barkeeper +/datum/outfit/job/vampire/baron name = "Baron" - jobtype = /datum/job/vamp/barkeeper + jobtype = /datum/job/vampire/baron - id = /obj/item/card/id/baron + id = /obj/item/card/baron + ears = /obj/item/radio/headset/darkpack glasses = /obj/item/clothing/glasses/vampire/sun uniform = /obj/item/clothing/under/vampire/bar suit = /obj/item/clothing/suit/vampire/jacket/better shoes = /obj/item/clothing/shoes/vampire gloves = /obj/item/clothing/gloves/vampire/work - l_pocket = /obj/item/vamp/phone/barkeeper + l_pocket = /obj/item/smartphone/baron r_pocket = /obj/item/vamp/keys/bar - backpack_contents = list(/obj/item/passport=1, /obj/item/phone_book=1, /obj/item/cockclock=1, /obj/item/flashlight=1, /obj/item/card/credit=1) - -/datum/outfit/job/barkeeper/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == FEMALE) - uniform = /obj/item/clothing/under/vampire/bar/female - shoes = /obj/item/clothing/shoes/vampire/heels - -/obj/effect/landmark/start/barkeeper - name = "Baron" - icon_state = "Barkeeper" + backpack_contents = list(/obj/item/phone_book=1, /obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/anarchs/bouncer.dm b/modular_darkpack/modules/jobs/code/anarchs/bouncer.dm deleted file mode 100644 index 2a4d68ef17b3..000000000000 --- a/modular_darkpack/modules/jobs/code/anarchs/bouncer.dm +++ /dev/null @@ -1,45 +0,0 @@ - -/datum/job/vamp/bruiser - title = "Bruiser" - department_head = list("Baron") - faction = "Vampire" - total_positions = 7 - spawn_positions = 7 - supervisors = "the Baron" - selection_color = "#434343" - - outfit = /datum/outfit/job/bruiser - - access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) - minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - - mind_traits = list(TRAIT_DONUT_LOVER) - liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) - - display_order = JOB_DISPLAY_ORDER_BRUISER - my_contact_is_important = TRUE - known_contacts = list("Baron","Bouncer","Emissary","Sweeper") - allowed_bloodlines = list("Daughters of Cacophony", "True Brujah", "Brujah", "Nosferatu", "Gangrel", "Toreador", "Tremere", "Malkavian", "Banu Haqim", "Tzimisce", "Caitiff", "Ventrue", "Lasombra", "Gargoyle", "Kiasyd", "Cappadocian", "Ministry", "Salubri") - - v_duty = "You are the enforcer of the Anarchs. The baron is always in need of muscle power. Enforce the Traditions - in the anarch way." - minimal_masquerade = 2 - -/datum/outfit/job/bruiser - name = "Bruiser" - jobtype = /datum/job/vamp/bruiser - - id = /obj/item/card/id/bruiser - uniform = /obj/item/clothing/under/vampire/bouncer - suit = /obj/item/clothing/suit/vampire/jacket - shoes = /obj/item/clothing/shoes/vampire/jackboots - r_pocket = /obj/item/vamp/keys/anarch - l_pocket = /obj/item/vamp/phone/anarch - r_hand = /obj/item/melee/baseball_bat/vamp - backpack_contents = list(/obj/item/passport=1, /obj/item/cockclock=1, /obj/item/vampire_stake=3, /obj/item/flashlight=1, /obj/item/vamp/keys/hack=1, /obj/item/card/credit=1) - - -/obj/effect/landmark/start/bruiser - name = "Bruiser" - icon_state = "Bouncer" diff --git a/modular_darkpack/modules/jobs/code/anarchs/bruiser.dm b/modular_darkpack/modules/jobs/code/anarchs/bruiser.dm new file mode 100644 index 000000000000..cc1e21be2876 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/anarchs/bruiser.dm @@ -0,0 +1,35 @@ +/datum/job/vampire/bruiser + title = JOB_BRUISER + faction = FACTION_CITY + total_positions = 7 + spawn_positions = 7 + supervisors = SUPERVISOR_BARON + config_tag = "BRUISER" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/bruiser + + display_order = JOB_DISPLAY_ORDER_BRUISER + department_for_prefs = /datum/job_department/anarch + departments_list = list( + /datum/job_department/anarch, + ) + + known_contacts = list("Baron", "Bouncer", "Emissary", "Sweeper") + allowed_clans = list(VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_CAITIFF, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD, VAMPIRE_CLAN_CAPPADOCIAN, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_SALUBRI) + allowed_species = list(SPECIES_KINDRED) + description = "You are the enforcer of the Anarchs. The baron is always in need of muscle power. Enforce the Traditions - in the anarch way." + minimal_masquerade = 2 + +/datum/outfit/job/vampire/bruiser + name = "Bruiser" + jobtype = /datum/job/vampire/bruiser + + id = /obj/item/card/bruiser + ears = /obj/item/radio/headset/darkpack + uniform = /obj/item/clothing/under/vampire/bouncer + suit = /obj/item/clothing/suit/vampire/jacket + shoes = /obj/item/clothing/shoes/vampire/jackboots + r_pocket = /obj/item/vamp/keys/anarch + l_pocket = /obj/item/smartphone/bruiser + r_hand = /obj/item/melee/baseball_bat/vamp + backpack_contents = list(/obj/item/vampire_stake=3, /obj/item/vamp/keys/hack=1, /obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/anarchs/emissary.dm b/modular_darkpack/modules/jobs/code/anarchs/emissary.dm index 98755fa1bebf..e681a3048b64 100644 --- a/modular_darkpack/modules/jobs/code/anarchs/emissary.dm +++ b/modular_darkpack/modules/jobs/code/anarchs/emissary.dm @@ -1,46 +1,34 @@ - -/datum/job/vamp/emissary - title = "Emissary" - department_head = list("Baron") - faction = "Vampire" +/datum/job/vampire/emissary + title = JOB_EMISSARY + faction = FACTION_CITY total_positions = 1 spawn_positions = 1 - supervisors = "the Baron" - selection_color = "#434343" - - outfit = /datum/outfit/job/emissary - - access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) - minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - - mind_traits = list(TRAIT_DONUT_LOVER) - liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + supervisors = SUPERVISOR_BARON + config_tag = "EMISSARY" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/emissary display_order = JOB_DISPLAY_ORDER_EMISSARY - my_contact_is_important = TRUE - known_contacts = list("Baron","Bouncer","Emissary","Sweeper","Prince","Sheriff") - allowed_bloodlines = list("Daughters of Cacophony", "True Brujah", "Brujah", "Nosferatu", "Gangrel", "Tremere", "Toreador", "Malkavian", "Banu Haqim", "Tzimisce", "Caitiff", "Ventrue", "Lasombra", "Gargoyle", "Kiasyd", "Cappadocian", "Ministry", "Salubri") - - v_duty = "You are a diplomat for the anarchs. Make deals, keep the peace, all through words, not violence. But the latter may come to pass if the former fails." + department_for_prefs = /datum/job_department/anarch + departments_list = list( + /datum/job_department/anarch, + ) + + known_contacts = list("Baron", "Bouncer", "Emissary", "Sweeper", "Prince", "Sheriff") + allowed_clans = list(VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_CAITIFF, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD, VAMPIRE_CLAN_CAPPADOCIAN, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_SALUBRI) + allowed_species = list(SPECIES_KINDRED) + description = "You are a diplomat for the anarchs. Make deals, keep the peace, all through words, not violence. But the latter may come to pass if the former fails." minimal_masquerade = 2 -/datum/outfit/job/emissary +/datum/outfit/job/vampire/emissary name = "emissary" - jobtype = /datum/job/vamp/emissary + jobtype = /datum/job/vampire/emissary - id = /obj/item/card/id/emissary + id = /obj/item/card/emissary + ears = /obj/item/radio/headset/darkpack uniform = /obj/item/clothing/under/vampire/bouncer suit = /obj/item/clothing/suit/vampire/jacket shoes = /obj/item/clothing/shoes/vampire/jackboots r_pocket = /obj/item/vamp/keys/anarch - l_pocket = /obj/item/vamp/phone/anarch - backpack_contents = list(/obj/item/passport=1, /obj/item/cockclock=1, /obj/item/flashlight=1, /obj/item/vamp/keys/hack=1, /obj/item/card/credit/rich=1) - -/datum/outfit/job/emissary/pre_equip(mob/living/carbon/human/H) - ..() - -/obj/effect/landmark/start/emissary - name = "Emissary" - icon_state = "Bouncer" + l_pocket = /obj/item/smartphone/emissary + backpack_contents = list(/obj/item/vamp/keys/hack=1, /obj/item/card/credit/rich=1) diff --git a/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm b/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm index 5facc9e42cf4..4525b68e3680 100644 --- a/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm +++ b/modular_darkpack/modules/jobs/code/anarchs/sweeper.dm @@ -1,43 +1,34 @@ - -/datum/job/vamp/sweeper - title = "Sweeper" - department_head = list("Baron") - faction = "Vampire" +/datum/job/vampire/sweeper + title = JOB_SWEEPER + faction = FACTION_CITY total_positions = 3 spawn_positions = 3 - supervisors = "the Baron" - selection_color = "#434343" - - outfit = /datum/outfit/job/sweeper - - access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) - minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - - mind_traits = list(TRAIT_DONUT_LOVER) - liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + supervisors = SUPERVISOR_BARON + config_tag = "SWEEPER" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/sweeper display_order = JOB_DISPLAY_ORDER_SWEEPER - my_contact_is_important = TRUE - known_contacts = list("Baron","Bouncer","Emissary","Sweeper") - allowed_bloodlines = list("Daughters of Cacophony", "True Brujah", "Brujah", "Nosferatu", "Gangrel", "Tremere", "Toreador", "Malkavian", "Banu Haqim", "Tzimisce", "Caitiff", "Ventrue", "Lasombra", "Gargoyle", "Kiasyd", "Cappadocian", "Ministry", "Salubri") - - v_duty = "You are the observer of the anarchs. You watch out for any new kindred, suspicious individuals, and any new rumors near the anarch turf, and then report it to your anarchs." + department_for_prefs = /datum/job_department/anarch + departments_list = list( + /datum/job_department/anarch, + ) + + known_contacts = list("Baron", "Bouncer", "Emissary", "Sweeper") + allowed_clans = list(VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_CAITIFF, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD, VAMPIRE_CLAN_CAPPADOCIAN, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_SALUBRI) + allowed_species = list(SPECIES_KINDRED) + description = "You are the observer of the anarchs. You watch out for any new kindred, suspicious individuals, and any new rumors near the anarch turf, and then report it to your anarchs." minimal_masquerade = 2 -/datum/outfit/job/sweeper +/datum/outfit/job/vampire/sweeper name = "Sweeper" - jobtype = /datum/job/vamp/sweeper + jobtype = /datum/job/vampire/sweeper - id = /obj/item/card/id/sweeper + id = /obj/item/card/sweeper + ears = /obj/item/radio/headset/darkpack uniform = /obj/item/clothing/under/vampire/bouncer suit = /obj/item/clothing/suit/vampire/jacket shoes = /obj/item/clothing/shoes/vampire/jackboots r_pocket = /obj/item/vamp/keys/anarch - l_pocket = /obj/item/vamp/phone/anarch - backpack_contents = list(/obj/item/passport=1, /obj/item/cockclock=1, /obj/item/flashlight=1, /obj/item/vamp/keys/hack=1, /obj/item/card/credit=1, /obj/item/binoculars = 1) - -/obj/effect/landmark/start/sweeper - name = "Sweeper" - icon_state = "Bouncer" + l_pocket = /obj/item/smartphone/sweeper + backpack_contents = list(/obj/item/vamp/keys/hack=1, /obj/item/card/credit=1, /obj/item/binoculars = 1) diff --git a/modular_darkpack/modules/jobs/code/anarchs/tapster.dm b/modular_darkpack/modules/jobs/code/anarchs/tapster.dm new file mode 100644 index 000000000000..d93e96a11fea --- /dev/null +++ b/modular_darkpack/modules/jobs/code/anarchs/tapster.dm @@ -0,0 +1,34 @@ +/datum/job/vampire/tapster + title = JOB_TAPSTER + faction = FACTION_CITY + total_positions = 2 + spawn_positions = 2 + supervisors = SUPERVISOR_BARON_PUBLIC + config_tag = "TAPSTER" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/tapster + + display_order = JOB_DISPLAY_ORDER_TAPSTER + department_for_prefs = /datum/job_department/anarch + departments_list = list( + /datum/job_department/anarch, + ) + + known_contacts = list("Baron", "Bouncer", "Emissary", "Sweeper") + allowed_species = list(SPECIES_HUMAN, SPECIES_GHOUL) + species_slots = list(SPECIES_HUMAN = 2, SPECIES_GHOUL = 2) + description = "You are a bartender of the local biker hangout. Serve the eclectic clients that pass through, and try not to ask too many questions." + minimal_masquerade = 0 + +/datum/outfit/job/vampire/tapster + name = "Tapster" + jobtype = /datum/job/vampire/tapster + + id = /obj/item/card/tapster + uniform = /obj/item/clothing/under/vampire/bouncer + suit = /obj/item/clothing/suit/vampire/jacket + shoes = /obj/item/clothing/shoes/vampire/jackboots + r_pocket = /obj/item/vamp/keys/anarch_limited + l_pocket = /obj/item/smartphone/tapster + r_hand = /obj/item/melee/baseball_bat/vamp + backpack_contents = list(/obj/item/vamp/keys/hack=1, /obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/archivist.dm b/modular_darkpack/modules/jobs/code/archivist.dm deleted file mode 100644 index 699debc754d9..000000000000 --- a/modular_darkpack/modules/jobs/code/archivist.dm +++ /dev/null @@ -1,49 +0,0 @@ - -/datum/job/vamp/archivist - title = "Chantry Archivist" - department_head = list("Prince") - faction = "Vampire" - total_positions = 4 - spawn_positions = 4 - supervisors = "the Traditions and the Regent" - selection_color = "#ab2508" - - outfit = /datum/outfit/job/archivist - - access = list(ACCESS_LIBRARY, ACCESS_AUX_BASE, ACCESS_MINING_STATION) - minimal_access = list(ACCESS_LIBRARY, ACCESS_AUX_BASE, ACCESS_MINING_STATION) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - exp_type_department = EXP_TYPE_TREMERE - - display_order = JOB_DISPLAY_ORDER_ARCHIVIST - - v_duty = "Keep a census of events and provide information to neonates. Listen to the Regent Carefully. Study blood magic and protect the chantry." - minimal_masquerade = 3 - allowed_species = list("Vampire") - allowed_bloodlines = list("Tremere", "Gargoyle") - known_contacts = list("Tremere Regent") - -/datum/outfit/job/archivist - name = "Archivist" - jobtype = /datum/job/vamp/archivist - - id = /obj/item/card/id/archive - glasses = /obj/item/clothing/glasses/vampire/perception - shoes = /obj/item/clothing/shoes/vampire - gloves = /obj/item/clothing/gloves/vampire/latex - uniform = /obj/item/clothing/under/vampire/archivist - r_pocket = /obj/item/vamp/keys/archive - l_pocket = /obj/item/vamp/phone/archivist - accessory = /obj/item/clothing/accessory/pocketprotector/full - backpack_contents = list(/obj/item/passport=1, /obj/item/cockclock=1, /obj/item/flashlight=1, /obj/item/arcane_tome=1, /obj/item/card/credit=1, /obj/item/scythe/vamp=1) - -/datum/outfit/job/archivist/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == FEMALE) - uniform = /obj/item/clothing/under/vampire/archivist/female - shoes = /obj/item/clothing/shoes/vampire/heels - -/obj/effect/landmark/start/archivist - name = "Archivist" - icon_state = "Archivist" diff --git a/modular_darkpack/modules/jobs/code/bogatyr.dm b/modular_darkpack/modules/jobs/code/bogatyr.dm deleted file mode 100644 index 19698e2f9251..000000000000 --- a/modular_darkpack/modules/jobs/code/bogatyr.dm +++ /dev/null @@ -1,52 +0,0 @@ - -/datum/job/vamp/bogatyr - title = "Bogatyr" - department_head = list("Voivode") - faction = "Vampire" - total_positions = 4 - spawn_positions = 4 - supervisors = " the Laws of Hospitality" - selection_color = "#953d2d" - - outfit = /datum/outfit/job/bogatyr - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_BOGATYR - exp_type_department = EXP_TYPE_TZIMISCE - - allowed_species = list("Vampire") - allowed_bloodlines = list("Old Clan Tzimisce") - minimal_generation = 13 //Uncomment when players get exp enough - - v_duty = "Whether you are of Voivode-in-Waiting's blood or if you've been honored, you are one of the Kin of the Voivode. Protect your Family, as your Family would protect you." - minimal_masquerade = 2 - my_contact_is_important = TRUE - known_contacts = list("Prince", "Baron", "Sheriff") - -/datum/outfit/job/bogatyr/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == FEMALE) - uniform = /obj/item/clothing/under/vampire/bogatyr/female - shoes = /obj/item/clothing/shoes/vampire/heels - - -/datum/outfit/job/bogatyr - name = "Bogatyr" - jobtype = /datum/job/vamp/bogatyr - id = /obj/item/card/id/bogatyr - //glasses = /obj/item/clothing/glasses/vampire/yellow - uniform = /obj/item/clothing/under/vampire/bogatyr - //suit = /obj/item/clothing/suit/vampire/jacket/punk - shoes = /obj/item/clothing/shoes/vampire/jackboots - head = /obj/item/clothing/head/vampire/bogatyr - suit = /obj/item/clothing/suit/vampire/bogatyr - belt = /obj/item/storage/belt/sheath/vamp/sword - l_pocket = /obj/item/vamp/phone - //r_pocket = /obj/item/cockclock - backpack_contents = list(/obj/item/vamp/keys/old_clan_tzimisce=1, /obj/item/fireaxe/vamp=1, /obj/item/passport=1, /obj/item/flashlight=1, /obj/item/card/credit=1) - -/obj/effect/landmark/start/bogatyr - name = "Bogatyr" diff --git a/modular_darkpack/modules/jobs/code/caitiff.dm b/modular_darkpack/modules/jobs/code/caitiff.dm deleted file mode 100644 index 66f5906c72b7..000000000000 --- a/modular_darkpack/modules/jobs/code/caitiff.dm +++ /dev/null @@ -1,70 +0,0 @@ -/datum/outfit/job/caitiff - name = "Caitiff" - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/flashlight - id = /obj/item/cockclock - backpack_contents = list(/obj/item/passport=1, /obj/item/vampire_stake=1, /obj/item/vamp/keys/hack=1) - -/datum/outfit/job/caitiff/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == MALE) - shoes = /obj/item/clothing/shoes/vampire - if(H.clan) - if(H.clan.male_clothes) - uniform = H.clan.male_clothes - else - shoes = /obj/item/clothing/shoes/vampire/heels - if(H.clan) - if(H.clan.female_clothes) - uniform = H.clan.female_clothes - -/datum/outfit/job/caitiff/post_equip(mob/living/carbon/human/H) - ..() - if(H.mind) - H.mind.add_antag_datum(/datum/antagonist/caitiff) - - var/list/landmarkslist = list() - for(var/obj/effect/landmark/start/S in GLOB.start_landmarks_list) - if(S.name == name) - landmarkslist += S - var/obj/effect/landmark/start/D = pick(landmarkslist) - H.forceMove(D.loc) - - var/my_name = "Tyler" - if(H.gender == MALE) - my_name = pick(GLOB.first_names_male) - else - my_name = pick(GLOB.first_names_female) - var/my_surname = pick(GLOB.last_names) - H.fully_replace_character_name(null,"[my_name] [my_surname]") - -/obj/effect/landmark/start/caitiff - name = "Caitiff" - delete_after_roundstart = FALSE - -/datum/antagonist/caitiff - name = "Caitiff" - roundend_category = "caitiffs" - antagpanel_category = "Caitiff" - job_rank = ROLE_TRAITOR - antag_moodlet = /datum/mood_event/focused - antag_hud_type = ANTAG_HUD_TRAITOR - antag_hud_name = "traitor" - -/datum/antagonist/caitiff/on_gain() - owner.special_role = src - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = owner - kill_objective.find_target() - objectives += kill_objective - owner.current.playsound_local(get_turf(owner.current), 'modular_darkpack/modules/deprecated/sounds/sad_start.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) - return ..() - -/datum/antagonist/caitiff/on_removal() - ..() - to_chat(owner.current,span_userdanger("You are no longer the Caitiff!")) - owner.special_role = null - -/datum/antagonist/caitiff/greet() - to_chat(owner.current, span_alertsyndie("You are the Caitiff.")) - owner.announce_objectives() diff --git a/modular_darkpack/modules/jobs/code/camarilla/harpy.dm b/modular_darkpack/modules/jobs/code/camarilla/harpy.dm new file mode 100644 index 000000000000..f94cb0d88f04 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/camarilla/harpy.dm @@ -0,0 +1,44 @@ +/datum/job/vampire/harpy + title = JOB_HARPY + description = "You are an expert on the nightlife of Cainite society. Acting as one of the chief advisors on all things related to boons and diplomacy, the Prince defers quite the amount of judgement to you. Don't squander it." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 3 + spawn_positions = 3 + supervisors = SUPERVISOR_PRINCE + config_tag = "HARPY" + req_admin_notify = 1 + minimal_player_age = 10 + exp_requirements = 180 + exp_required_type = EXP_TYPE_CAMARILLA + exp_required_type_department = EXP_TYPE_CAMARILLA + exp_granted_type = EXP_TYPE_CAMARILLA + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/harpy + + display_order = JOB_DISPLAY_ORDER_HARPY + department_for_prefs = /datum/job_department/camarilla + departments_list = list( + /datum/job_department/camarilla, + ) + + minimal_generation = 12 //Uncomment when players get exp enough + minimal_masquerade = 5 + + allowed_species = list(SPECIES_KINDRED) + + known_contacts = list("Prince","Sheriff","Tremere Regent","Dealer","Emissary","Baron","Primogens") + + allowed_clans = list(VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD) + +/datum/outfit/job/vampire/harpy + name = "Harpy" + jobtype = /datum/job/vampire/harpy + + ears = /obj/item/radio/headset/darkpack + id = /obj/item/card/clerk/harpy + uniform = /obj/item/clothing/under/vampire/clerk + shoes = /obj/item/clothing/shoes/vampire/brown + l_pocket = /obj/item/smartphone/harpy + r_pocket = /obj/item/vamp/keys/clerk + backpack_contents = list(/obj/item/phone_book=1, /obj/item/card/credit/seneschal=1) diff --git a/modular_darkpack/modules/jobs/code/camarilla/hound.dm b/modular_darkpack/modules/jobs/code/camarilla/hound.dm new file mode 100644 index 000000000000..5bf26817656a --- /dev/null +++ b/modular_darkpack/modules/jobs/code/camarilla/hound.dm @@ -0,0 +1,42 @@ +/datum/job/vampire/hound + title = JOB_HOUND + description = "You are the Prince's enforcer. You report to the Sheriff and uphold the Traditions." + auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY + faction = FACTION_CITY + total_positions = 7 + spawn_positions = 7 + supervisors = SUPERVISOR_SHERIFF + minimal_player_age = 7 + exp_requirements = 20 + exp_required_type = EXP_TYPE_CAMARILLA + exp_required_type_department = EXP_TYPE_CAMARILLA + exp_granted_type = EXP_TYPE_CAMARILLA + config_tag = "HOUND" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/hound + + display_order = JOB_DISPLAY_ORDER_HOUND + department_for_prefs = /datum/job_department/camarilla + departments_list = list( + /datum/job_department/camarilla, + ) + + minimal_masquerade = 3 + allowed_species = list(SPECIES_KINDRED, SPECIES_GHOUL) + allowed_clans = list(VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_GIOVANNI, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD, VAMPIRE_CLAN_CAPPADOCIAN, VAMPIRE_CLAN_TZIMISCE) + + known_contacts = list("Prince", "Sheriff") + +/datum/outfit/job/vampire/hound + name = "Hound" + jobtype = /datum/job/vampire/hound + + ears = /obj/item/radio/headset/darkpack + id = /obj/item/card/camarilla + uniform = /obj/item/clothing/under/vampire/hound + gloves = /obj/item/clothing/gloves/vampire/work + suit = /obj/item/clothing/suit/vampire/trench + shoes = /obj/item/clothing/shoes/vampire + r_pocket = /obj/item/vamp/keys/camarilla + l_pocket = /obj/item/smartphone/hound + backpack_contents = list(/obj/item/vampire_stake=3, /obj/item/masquerade_contract=1, /obj/item/vamp/keys/hack=1, /obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/banu_haqim.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/banu_haqim.dm new file mode 100644 index 000000000000..16a33fa2c8cb --- /dev/null +++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/banu_haqim.dm @@ -0,0 +1,44 @@ +/datum/job/vampire/primogen_banu + title = JOB_PRIMOGEN_BANU_HAQIM + description = "Offer your infinite knowledge to Prince of the City, while overseeing the Banu Haqim in the city. Monitor their contracts and ensure they remain true to the ways of the Clan. You have an official cover with the Police Department as a local civilian consultant, ensure things run smoothly, on either end." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = SUPERVISOR_TRADITIONS + req_admin_notify = 1 + minimal_player_age = 14 + exp_requirements = 180 + exp_required_type = EXP_TYPE_CAMARILLA + exp_required_type_department = EXP_TYPE_CAMARILLA + exp_granted_type = EXP_TYPE_CAMARILLA + config_tag = "PRIMOGEN_BANU_HAQIM" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/banuprim + + display_order = JOB_DISPLAY_ORDER_BANU + department_for_prefs = /datum/job_department/camarilla + departments_list = list( + /datum/job_department/camarilla, + ) + + minimal_generation = 12 + minimum_immortal_age = 50 + minimal_masquerade = 5 + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_BANU_HAQIM) + + known_contacts = list("Prince") + +/datum/outfit/job/vampire/banuprim + name = "Primogen Banu Haqim" + jobtype = /datum/job/vampire/primogen_banu + + ears = /obj/item/radio/headset/darkpack + id = /obj/item/card/primogen + glasses = /obj/item/clothing/glasses/vampire/yellow + uniform = /obj/item/clothing/under/vampire/turtleneck_navy + suit = /obj/item/clothing/suit/vampire/jacket + shoes = /obj/item/clothing/shoes/vampire/jackboots + l_pocket = /obj/item/smartphone/banu_primo + backpack_contents = list(/obj/item/vamp/keys/banuhaqim=1, /obj/item/card/credit/elder=1, /obj/item/card/whip, /obj/item/card/steward, /obj/item/card/myrmidon) diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/lasombra.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/lasombra.dm new file mode 100644 index 000000000000..c955ce3a7eaf --- /dev/null +++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/lasombra.dm @@ -0,0 +1,45 @@ +/datum/job/vampire/primogen_lasombra + title = JOB_PRIMOGEN_LASOMBRA + description = "Offer your infinite knowledge to Prince of the City. Monitor those of your Clan and your lesser cousins, while holding a Court of Blood as need be, for all it takes for the Camarilla to turn on you is one mistake. You and Your Clan were given a domain in the local Church and in the vicinity of a swarm of Lupines, keep matters under control." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = SUPERVISOR_TRADITIONS + req_admin_notify = 1 + minimal_player_age = 14 + exp_requirements = 180 + exp_required_type = EXP_TYPE_CAMARILLA + exp_required_type_department = EXP_TYPE_CAMARILLA + exp_granted_type = EXP_TYPE_CAMARILLA + config_tag = "PRIMOGEN_LASOMBRA" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/lasombraprim + + display_order = JOB_DISPLAY_ORDER_LASOMBRA + department_for_prefs = /datum/job_department/camarilla + departments_list = list( + /datum/job_department/camarilla, + /datum/job_department/church, + ) + + minimal_generation = 12 + minimum_immortal_age = 50 + minimal_masquerade = 5 + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_LASOMBRA) + + known_contacts = list("Prince") + +/datum/outfit/job/vampire/lasombraprim + name = "Primogen Lasombra" + jobtype = /datum/job/vampire/primogen_lasombra + + ears = /obj/item/radio/headset/darkpack + id = /obj/item/card/primogen + glasses = /obj/item/clothing/glasses/vampire/sun + uniform = /obj/item/clothing/under/vampire/turtleneck_black + suit = /obj/item/clothing/suit/vampire/trench + shoes = /obj/item/clothing/shoes/vampire/jackboots + l_pocket = /obj/item/smartphone/lasombra_primo + backpack_contents = list(/*/obj/item/vamp/keys/lasombra/primogen=1,*/ /obj/item/card/credit/elder=1, /obj/item/card/whip, /obj/item/card/steward, /obj/item/card/myrmidon) diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/malkavian.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/malkavian.dm new file mode 100644 index 000000000000..947ba13eede8 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/malkavian.dm @@ -0,0 +1,46 @@ +/datum/job/vampire/primogen_malkavian + title = JOB_PRIMOGEN_MALKAVIAN + description = "Offer your infinite knowledge to Prince of the City. You likely have a hold over the local hospital, make good use of it and ensure the blood bags remain available." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = SUPERVISOR_TRADITIONS + req_admin_notify = 1 + minimal_player_age = 14 + exp_requirements = 180 + exp_required_type = EXP_TYPE_CAMARILLA + exp_required_type_department = EXP_TYPE_CAMARILLA + exp_granted_type = EXP_TYPE_CAMARILLA + config_tag = "PRIMOGEN_MALKAVIAN" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/malkav + + display_order = JOB_DISPLAY_ORDER_MALKAVIAN + department_for_prefs = /datum/job_department/camarilla + departments_list = list( + /datum/job_department/camarilla, + /datum/job_department/clinic, + ) + + minimal_generation = 12 + minimum_immortal_age = 5 // Actually Malkavian Primo is whoever showed for work that day. Crazy bunch. + minimal_masquerade = 5 + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_MALKAVIAN) + + known_contacts = list("Prince") + +/datum/outfit/job/vampire/malkav + name = "Primogen Malkavian" + jobtype = /datum/job/vampire/primogen_malkavian + + ears = /obj/item/radio/headset/darkpack + id = /obj/item/card/primogen + glasses = /obj/item/clothing/glasses/vampire/sun + uniform = /obj/item/clothing/under/vampire/primogen_malkavian + suit = /obj/item/clothing/suit/vampire/trench/malkav + shoes = /obj/item/clothing/shoes/vampire/jackboots + head = /obj/item/clothing/head/vampire/malkav + l_pocket = /obj/item/smartphone/malkavian_primo + backpack_contents = list(/obj/item/vamp/keys/malkav/primogen=1, /obj/item/card/credit/elder=1, /obj/item/card/whip, /obj/item/card/steward, /obj/item/card/myrmidon) diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/nosferatu.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/nosferatu.dm new file mode 100644 index 000000000000..bdb0bbd59af0 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/nosferatu.dm @@ -0,0 +1,46 @@ +/datum/job/vampire/primogen_nosferatu + title = JOB_PRIMOGEN_NOSFERATU + description = "Offer your infinite knowledge to Prince of the City, and run the warren, your domain watches over the sewers." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = SUPERVISOR_TRADITIONS + req_admin_notify = 1 + minimal_player_age = 14 + exp_requirements = 180 + exp_required_type = EXP_TYPE_CAMARILLA + exp_required_type_department = EXP_TYPE_CAMARILLA + exp_granted_type = EXP_TYPE_CAMARILLA + config_tag = "PRIMOGEN_NOSFERATU" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/nosferatu + + display_order = JOB_DISPLAY_ORDER_NOSFERATU + department_for_prefs = /datum/job_department/camarilla + departments_list = list( + /datum/job_department/camarilla, + /datum/job_department/city_services + ) + + minimal_generation = 12 + minimum_immortal_age = 15 + minimal_masquerade = 5 + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_NOSFERATU) + + known_contacts = list("Prince") + +/datum/outfit/job/vampire/nosferatu + name = "Primogen Nosferatu" + jobtype = /datum/job/vampire/primogen_nosferatu + + ears = /obj/item/radio/headset/darkpack + id = /obj/item/card/primogen + mask = /obj/item/clothing/mask/vampire/shemagh + glasses = /obj/item/clothing/glasses/vampire/sun + uniform = /obj/item/clothing/under/vampire/suit + suit = /obj/item/clothing/suit/vampire/trench + shoes = /obj/item/clothing/shoes/vampire + l_pocket = /obj/item/smartphone/nosferatu_primo + backpack_contents = list(/obj/item/vamp/keys/nosferatu/primogen=1, /obj/item/card/credit/elder=1, /obj/item/card/whip, /obj/item/card/steward, /obj/item/card/myrmidon) diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/toreador.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/toreador.dm new file mode 100644 index 000000000000..b9a1fa61c668 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/toreador.dm @@ -0,0 +1,45 @@ +/datum/job/vampire/primogen_toreador + title = JOB_PRIMOGEN_TOREADOR + description = "Offer your infinite knowledge to Prince of the City. Take care of the Strip Club and its Elysium, for it is your domain and a social center within the city." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = SUPERVISOR_TRADITIONS + req_admin_notify = 1 + minimal_player_age = 14 + exp_requirements = 180 + exp_required_type = EXP_TYPE_CAMARILLA + exp_required_type_department = EXP_TYPE_CAMARILLA + exp_granted_type = EXP_TYPE_CAMARILLA + config_tag = "PRIMOGEN_TOREADOR" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/toreador + + display_order = JOB_DISPLAY_ORDER_TOREADOR + department_for_prefs = /datum/job_department/camarilla + departments_list = list( + /datum/job_department/camarilla, + /datum/job_department/strip_club, + ) + + minimal_generation = 12 + minimum_immortal_age = 50 + minimal_masquerade = 5 + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_TOREADOR) + + known_contacts = list("Prince") + +/datum/outfit/job/vampire/toreador + name = "Primogen Toreador" + jobtype = /datum/job/vampire/primogen_toreador + + ears = /obj/item/radio/headset/darkpack + id = /obj/item/card/primogen + glasses = /obj/item/clothing/glasses/vampire/sun + uniform = /obj/item/clothing/under/vampire/primogen_toreador + suit = /obj/item/clothing/suit/vampire/trench/alt + shoes = /obj/item/clothing/shoes/vampire + l_pocket = /obj/item/smartphone/toreador_primo + backpack_contents = list(/obj/item/vamp/keys/toreador/primogen=1, /obj/item/card/credit/elder=1, /obj/item/card/whip, /obj/item/card/steward, /obj/item/card/myrmidon, /*/obj/item/gun/ballistic/automatic/vampire/beretta/toreador=1,*/ /obj/item/ammo_box/magazine/semi9mm/toreador=1) diff --git a/modular_darkpack/modules/jobs/code/camarilla/primogens/ventrue.dm b/modular_darkpack/modules/jobs/code/camarilla/primogens/ventrue.dm new file mode 100644 index 000000000000..6f694e92a25b --- /dev/null +++ b/modular_darkpack/modules/jobs/code/camarilla/primogens/ventrue.dm @@ -0,0 +1,44 @@ +/datum/job/vampire/primogen_ventrue + title = JOB_PRIMOGEN_VENTRUE + description = "Offer your infinite knowledge to Prince of the City. Maintain the local Jazz Club, in front of the Tower, and its Elysium." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = SUPERVISOR_TRADITIONS + req_admin_notify = 1 + minimal_player_age = 14 + exp_requirements = 180 + exp_required_type = EXP_TYPE_CAMARILLA + exp_required_type_department = EXP_TYPE_CAMARILLA + exp_granted_type = EXP_TYPE_CAMARILLA + config_tag = "PRIMOGEN_VENTRUE" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/ventrue + + display_order = JOB_DISPLAY_ORDER_VENTRUE + department_for_prefs = /datum/job_department/camarilla + departments_list = list( + /datum/job_department/camarilla, + ) + + minimal_generation = 12 + minimum_immortal_age = 50 + minimal_masquerade = 5 + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_VENTRUE) + + known_contacts = list("Prince") + +/datum/outfit/job/vampire/ventrue + name = "Primogen Ventrue" + jobtype = /datum/job/vampire/primogen_ventrue + + ears = /obj/item/radio/headset/darkpack + id = /obj/item/card/primogen + glasses = /obj/item/clothing/glasses/vampire/sun + uniform = /obj/item/clothing/under/vampire/suit + suit = /obj/item/clothing/suit/vampire/trench + shoes = /obj/item/clothing/shoes/vampire + l_pocket = /obj/item/smartphone/ventrue_primo + backpack_contents = list(/obj/item/vamp/keys/ventrue/primogen=1, /obj/item/card/credit/elder=1, /obj/item/card/whip, /obj/item/card/steward, /obj/item/card/myrmidon) diff --git a/modular_darkpack/modules/jobs/code/camarilla/prince.dm b/modular_darkpack/modules/jobs/code/camarilla/prince.dm new file mode 100644 index 000000000000..6fb82ff0dfec --- /dev/null +++ b/modular_darkpack/modules/jobs/code/camarilla/prince.dm @@ -0,0 +1,57 @@ +/datum/job/vampire/prince + title = JOB_PRINCE + description = "You are the top dog of this city. You hold Praxis over " + CITY_NAME + ", and your word is law. Make sure the Masquerade is upheld, and your status is respected." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = SUPERVISOR_TRADITIONS + req_admin_notify = 1 + minimal_player_age = 14 + exp_requirements = 180 + exp_required_type = EXP_TYPE_CAMARILLA + exp_required_type_department = EXP_TYPE_CAMARILLA + exp_granted_type = EXP_TYPE_CAMARILLA + config_tag = "PRINCE" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/prince + + display_order = JOB_DISPLAY_ORDER_PRINCE + department_for_prefs = /datum/job_department/prince + departments_list = list( + /datum/job_department/camarilla, + ) + + minimal_generation = 10 + minimum_immortal_age = 75 + minimal_masquerade = 5 + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_BANU_HAQIM) + + known_contacts = list( + "Sheriff", + "Seneschal", + "Dealer", + "Tremere Regent", + "Primogens", + "Baron", + "Voivode" + ) + +/datum/job/vampire/prince/get_captaincy_announcement(mob/living/captain) + return "Prince [captain.real_name] is in the city!" + +/datum/outfit/job/vampire/prince + name = "Prince" + jobtype = /datum/job/vampire/prince + + ears = /obj/item/radio/headset/darkpack + id = /obj/item/card/prince + glasses = /obj/item/clothing/glasses/vampire/sun + gloves = /obj/item/clothing/gloves/vampire/latex + uniform = /obj/item/clothing/under/vampire/prince + suit = /obj/item/clothing/suit/vampire/trench/alt + shoes = /obj/item/clothing/shoes/vampire + l_pocket = /obj/item/smartphone/prince + r_pocket = /obj/item/vamp/keys/prince + backpack_contents = list(/obj/item/gun/ballistic/automatic/pistol/darkpack/deagle=1, /obj/item/phone_book=1, /obj/item/masquerade_contract=1, /obj/item/card/credit/prince=1) diff --git a/modular_darkpack/modules/jobs/code/camarilla/seneschal.dm b/modular_darkpack/modules/jobs/code/camarilla/seneschal.dm new file mode 100644 index 000000000000..40f9fcedc3a6 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/camarilla/seneschal.dm @@ -0,0 +1,42 @@ +/datum/job/vampire/clerk + title = JOB_SENESCHAL + description = "You are the right hand man or woman of the most powerful vampire in the city. The Camarilla trusts you to run the city, even in their stead." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = SUPERVISOR_PRINCE + req_admin_notify = 1 + minimal_player_age = 10 + exp_requirements = 180 + exp_required_type = EXP_TYPE_CAMARILLA + exp_required_type_department = EXP_TYPE_CAMARILLA + exp_granted_type = EXP_TYPE_CAMARILLA + config_tag = "SENESCHAL" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/clerk + + display_order = JOB_DISPLAY_ORDER_CLERK + department_for_prefs = /datum/job_department/camarilla + departments_list = list( + /datum/job_department/camarilla, + ) + + minimal_generation = 12 + minimal_masquerade = 5 + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_GIOVANNI, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD) + + known_contacts = list("Prince","Sheriff","Tremere Regent","Dealer","Primogens") + +/datum/outfit/job/vampire/clerk + name = "Seneschal" + jobtype = /datum/job/vampire/clerk + + ears = /obj/item/radio/headset/darkpack + id = /obj/item/card/clerk + uniform = /obj/item/clothing/under/vampire/clerk + shoes = /obj/item/clothing/shoes/vampire/brown + l_pocket = /obj/item/smartphone/seneschal + r_pocket = /obj/item/vamp/keys/clerk + backpack_contents = list(/obj/item/phone_book=1, /obj/item/card/credit/seneschal=1) diff --git a/modular_darkpack/modules/jobs/code/camarilla/sheriff.dm b/modular_darkpack/modules/jobs/code/camarilla/sheriff.dm new file mode 100644 index 000000000000..8d86d226dd8e --- /dev/null +++ b/modular_darkpack/modules/jobs/code/camarilla/sheriff.dm @@ -0,0 +1,50 @@ +/datum/job/vampire/sheriff + title = JOB_SHERIFF + description = "Protect the Prince and the Masquerade. You are their sword." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = SUPERVISOR_PRINCE + req_admin_notify = 1 + minimal_player_age = 14 + exp_requirements = 120 + exp_required_type = EXP_TYPE_CAMARILLA + exp_required_type_department = EXP_TYPE_CAMARILLA + exp_granted_type = EXP_TYPE_CAMARILLA + config_tag = "SHERIFF" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/sheriff + + display_order = JOB_DISPLAY_ORDER_SHERIFF + department_for_prefs = /datum/job_department/camarilla + departments_list = list( + /datum/job_department/camarilla, + ) + + minimal_generation = 12 + minimal_masquerade = 5 + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_GIOVANNI, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_LASOMBRA) + + known_contacts = list("Prince","Seneschal","Dealer") + +/datum/outfit/job/vampire/sheriff + name = "Sheriff" + jobtype = /datum/job/vampire/sheriff + + ears = /obj/item/radio/headset/darkpack + id = /obj/item/card/sheriff + uniform = /obj/item/clothing/under/vampire/sheriff + belt = /obj/item/storage/belt/sheath/vamp/rapier + shoes = /obj/item/clothing/shoes/vampire/jackboots + suit = /obj/item/clothing/suit/vampire/vest + gloves = /obj/item/clothing/gloves/vampire/leather + glasses = /obj/item/clothing/glasses/vampire/sun + r_pocket = /obj/item/vamp/keys/sheriff + l_pocket = /obj/item/smartphone/sheriff + backpack_contents = list(/obj/item/gun/ballistic/automatic/pistol/darkpack/deagle=1, /obj/item/vampire_stake=3, /obj/item/masquerade_contract=1, /obj/item/card/credit/elder=1) + +/datum/outfit/job/vampire/sheriff/pre_equip(mob/living/carbon/human/H) + . = ..() + H.ignores_warrant = TRUE diff --git a/modular_darkpack/modules/jobs/code/camarilla/tower_employee.dm b/modular_darkpack/modules/jobs/code/camarilla/tower_employee.dm new file mode 100644 index 000000000000..14bb1fe1393a --- /dev/null +++ b/modular_darkpack/modules/jobs/code/camarilla/tower_employee.dm @@ -0,0 +1,34 @@ +/datum/job/vampire/towerwork + title = JOB_TOWERWORK + faction = FACTION_CITY + total_positions = 4 + spawn_positions = 4 + supervisors = SUPERVISOR_SENESCHAL_PUBLIC + exp_granted_type = EXP_TYPE_CAMARILLA + config_tag = "TOWER_EMPLOYEE" + outfit = /datum/outfit/job/vampire/towerwork + job_flags = CITY_JOB_FLAGS + display_order = JOB_DISPLAY_ORDER_TOWERWORK + department_for_prefs = /datum/job_department/camarilla + departments_list = list( + /datum/job_department/camarilla, + ) + + known_contacts = list("Prince", "Sheriff", "Seneschal") + allowed_species = list(SPECIES_HUMAN, SPECIES_GHOUL, SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_TRUE_BRUJAH, VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_GARGOYLE, VAMPIRE_CLAN_KIASYD, VAMPIRE_CLAN_CAPPADOCIAN, VAMPIRE_CLAN_TZIMISCE) + description = "You work directly for the Millenium Tower and its administrative staff in a variety of ways, you may even be a personal retainer of one of the top three, to the point that any oddities that you may see over night or hear are either things you are already aware or you simply laugh them off and try not to think about it." + minimal_masquerade = 4 + +/datum/outfit/job/vampire/towerwork + name = "Tower Employee" + jobtype = /datum/job/vampire/towerwork + + id = /obj/item/card/tower_employee + uniform = /obj/item/clothing/under/vampire/hound + gloves = /obj/item/clothing/gloves/vampire/work + suit = /obj/item/clothing/suit/vampire/trench + shoes = /obj/item/clothing/shoes/vampire + r_pocket = /obj/item/vamp/keys/camarilla/ghoul + l_pocket = /obj/item/smartphone/tower_employee + backpack_contents = list(/obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/citizen.dm b/modular_darkpack/modules/jobs/code/citizen.dm deleted file mode 100644 index 9b6e0220adeb..000000000000 --- a/modular_darkpack/modules/jobs/code/citizen.dm +++ /dev/null @@ -1,56 +0,0 @@ - -/datum/job/vamp/citizen - title = "Citizen" - faction = "Vampire" - total_positions = -1 - spawn_positions = -1 - supervisors = "the Traditions" - selection_color = "#df7058" - access = list() //See /datum/job/assistant/get_access() - minimal_access = list() //See /datum/job/assistant/get_access() - outfit = /datum/outfit/job/citizen - antag_rep = 7 - paycheck = PAYCHECK_ASSISTANT // Get a job. Job reassignment changes your paycheck now. Get over it. - - access = list(ACCESS_MAINT_TUNNELS) - liver_traits = list(TRAIT_GREYTIDE_METABOLISM) - - paycheck_department = ACCOUNT_CIV - display_order = JOB_DISPLAY_ORDER_CITIZEN - - allowed_species = list("Vampire", "Ghoul", "Human", "Werewolf", "Kuei-Jin") - - v_duty = "Follow the traditions of the Camarilla. Obey the Prince and their authority. The city belongs to him. Aligning yourself with your clan members would be of benefit." - duty = "Obey the authorities... Or don't. You are up late tonight for one reason or another." - minimal_masquerade = 0 - allowed_bloodlines = list("True Brujah", "Daughters of Cacophony", "Salubri", "Baali", "Brujah", "Tremere", "Ventrue", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Giovanni", "Ministry", "Tzimisce", "Lasombra", "Caitiff", "Old Clan Tzimisce", "Kiasyd", "Cappadocian", "Gargoyle") - -/datum/outfit/job/citizen - name = "Citizen" - jobtype = /datum/job/vamp/citizen - l_pocket = /obj/item/vamp/phone - id = /obj/item/cockclock - -/datum/outfit/job/citizen/pre_equip(mob/living/carbon/human/H) - ..() - if(H.clan) - if(H.gender == MALE) - shoes = /obj/item/clothing/shoes/vampire - if(H.clan.male_clothes) - uniform = H.clan.male_clothes - else - shoes = /obj/item/clothing/shoes/vampire/heels - if(H.clan.female_clothes) - uniform = H.clan.female_clothes - else - uniform = /obj/item/clothing/under/vampire/emo - if(H.gender == MALE) - shoes = /obj/item/clothing/shoes/vampire - else - shoes = /obj/item/clothing/shoes/vampire/heels - - backpack_contents = list(/obj/item/passport, /obj/item/flashlight, /obj/item/card/credit) - -/obj/effect/landmark/start/citizen - name = "Citizen" - icon_state = "Assistant" diff --git a/modular_darkpack/modules/jobs/code/clinic/director.dm b/modular_darkpack/modules/jobs/code/clinic/director.dm new file mode 100644 index 000000000000..1570e5c88c2a --- /dev/null +++ b/modular_darkpack/modules/jobs/code/clinic/director.dm @@ -0,0 +1,39 @@ +/datum/job/vampire/clinic_director + title = JOB_CLINIC_DIRECTOR + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = "the Camarilla or the Anarchs" + exp_required_type_department = EXP_TYPE_CLINIC + config_tag = "CLINIC_DIRECTOR" + outfit = /datum/outfit/job/vampire/clinic_director + job_flags = CITY_JOB_FLAGS + display_order = JOB_DISPLAY_ORDER_CLINICS_DIRECTOR + department_for_prefs = /datum/job_department/clinic + departments_list = list( + /datum/job_department/clinic, + ) + + description = "Keep Saint John's clinic up and running. Collect blood by helping mortals at the Clinic." + allowed_species = list(SPECIES_KINDRED, SPECIES_GHOUL, SPECIES_HUMAN) + allowed_clans = list(VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_SALUBRI, VAMPIRE_CLAN_BAALI, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_GIOVANNI, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_CAITIFF, VAMPIRE_CLAN_KIASYD) + +/datum/outfit/job/vampire/clinic_director + name = "Clinic Director" + jobtype = /datum/job/vampire/clinic_director + + ears = /obj/item/radio/headset/darkpack + id = /obj/item/card/clinic/director + uniform = /obj/item/clothing/under/vampire/nurse + shoes = /obj/item/clothing/shoes/vampire/white + suit = /obj/item/clothing/suit/vampire/labcoat/director + gloves = /obj/item/clothing/gloves/vampire/latex + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/vamp/keys/clinics_director + backpack_contents = list(/obj/item/card/credit=1, /obj/item/storage/medkit/darkpack/doctor=1) + + backpack = /obj/item/storage/backpack + satchel = /obj/item/storage/backpack/satchel + duffelbag = /obj/item/storage/backpack/duffelbag + + skillchips = list(/obj/item/skillchip/entrails_reader) diff --git a/modular_darkpack/modules/jobs/code/clinic/doctor.dm b/modular_darkpack/modules/jobs/code/clinic/doctor.dm new file mode 100644 index 000000000000..074853aea59d --- /dev/null +++ b/modular_darkpack/modules/jobs/code/clinic/doctor.dm @@ -0,0 +1,37 @@ +/datum/job/vampire/doctor + title = JOB_DOCTOR + faction = FACTION_CITY + total_positions = 4 + spawn_positions = 4 + supervisors = "the Camarilla or the Anarchs" + exp_required_type_department = EXP_TYPE_CLINIC + config_tag = "DOCTOR" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/clinic_doctor + + display_order = JOB_DISPLAY_ORDER_DOCTOR + department_for_prefs = /datum/job_department/clinic + departments_list = list( + /datum/job_department/clinic, + ) + + description = "Help your fellow kindred in all matters medicine related. Sell blood. Keep your human colleagues ignorant." + allowed_species = list(SPECIES_KINDRED, SPECIES_GHOUL, SPECIES_HUMAN) + allowed_clans = list(VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY, VAMPIRE_CLAN_SALUBRI, VAMPIRE_CLAN_BAALI, VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_BANU_HAQIM, VAMPIRE_CLAN_GIOVANNI, VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_TZIMISCE, VAMPIRE_CLAN_LASOMBRA, VAMPIRE_CLAN_CAITIFF, VAMPIRE_CLAN_KIASYD) + known_contacts = list("Clinic Director") + +/datum/outfit/job/vampire/clinic_doctor + name = "Doctor" + jobtype = /datum/job/vampire/doctor + + ears = /obj/item/radio/headset/darkpack + id = /obj/item/card/clinic + uniform = /obj/item/clothing/under/vampire/nurse + shoes = /obj/item/clothing/shoes/vampire/white + suit = /obj/item/clothing/suit/vampire/labcoat + gloves = /obj/item/clothing/gloves/vampire/latex + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/vamp/keys/clinic + backpack_contents = list(/obj/item/card/credit=1, /obj/item/storage/medkit/darkpack/doctor=1) + + skillchips = list(/obj/item/skillchip/entrails_reader) diff --git a/modular_darkpack/modules/jobs/code/dealer.dm b/modular_darkpack/modules/jobs/code/dealer.dm deleted file mode 100644 index 557320f13b85..000000000000 --- a/modular_darkpack/modules/jobs/code/dealer.dm +++ /dev/null @@ -1,54 +0,0 @@ - -/datum/job/vamp/dealer - title = "Dealer" - department_head = list("Yourself") - faction = "Vampire" - total_positions = 1 - spawn_positions = 1 - supervisors = "None. You are beholden only to yourself." - selection_color = "#edc009" - exp_type_department = EXP_TYPE_WAREHOUSE // This is so the jobs menu can work properly - - outfit = /datum/outfit/job/dealer - - access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT, ACCESS_AUX_BASE) - minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT, ACCESS_AUX_BASE) - paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_CAR - - liver_traits = list(TRAIT_PRETENDER_ROYAL_METABOLISM) - - display_order = JOB_DISPLAY_ORDER_DEALER - bounty_types = CIV_JOB_RANDOM - -// minimal_generation = 12 //Uncomment when players get exp enough - - my_contact_is_important = TRUE - known_contacts = list("Prince","Seneschal", "Sheriff", "Baron") - allowed_bloodlines = list("True Brujah", "Brujah", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Tzimisce", "Caitiff", "Ventrue", "Ministry", "Kiasyd", "Cappadocian") - - v_duty = "You provide both legal and illegal supplies to those that get busy during the night. You are your own man yet you know people are out for you. Time to buckle in..." - minimal_masquerade = 3 - allowed_species = list("Vampire", "Werewolf", "Kuei-Jin") - -/datum/outfit/job/dealer - name = "Dealer" - jobtype = /datum/job/vamp/dealer - - id = /obj/item/card/id/dealer - uniform = /obj/item/clothing/under/vampire/suit - shoes = /obj/item/clothing/shoes/vampire/brown - glasses = /obj/item/clothing/glasses/vampire/sun - l_pocket = /obj/item/vamp/phone/dealer - r_pocket = /obj/item/vamp/keys/supply - backpack_contents = list(/obj/item/passport=1, /obj/item/cockclock=1, /obj/item/flashlight=1, /obj/item/card/credit/rich=1) - -/datum/outfit/job/dealer/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == FEMALE) - uniform = /obj/item/clothing/under/vampire/suit/female - shoes = /obj/item/clothing/shoes/vampire/heels/red - -/obj/effect/landmark/start/dealer - name = "Dealer" - icon_state = "Dealer" diff --git a/modular_darkpack/modules/jobs/code/dispatcher.dm b/modular_darkpack/modules/jobs/code/dispatcher.dm deleted file mode 100644 index 7cf80c2e1b97..000000000000 --- a/modular_darkpack/modules/jobs/code/dispatcher.dm +++ /dev/null @@ -1,34 +0,0 @@ - -/datum/job/vamp/dispatcher - title = "Emergency Dispatcher" - faction = "Vampire" - total_positions = 2 - spawn_positions = 2 - supervisors = " the SF local government." - selection_color = "#7e7e7e" - - outfit = /datum/outfit/job/dispatcher - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_POLICE - exp_type_department = EXP_TYPE_POLICE - - allowed_species = list("Ghoul", "Human") - species_slots = list("Ghoul" = 1) - - duty = "Report emergencies to the correct emergency service." - minimal_masquerade = 0 - known_contacts = list("Police Chief") - - -/datum/outfit/job/dispatcher - name = "Dispatcher" - jobtype = /datum/job/vamp/dispatcher - uniform = /obj/item/clothing/under/vampire/office - ears = /obj/item/p25radio/police/dispatch - shoes = /obj/item/clothing/shoes/vampire/businessblack - gloves = /obj/item/cockclock - id = /obj/item/card/id/government - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/vamp/keys/dispatch - backpack_contents = list(/obj/item/passport=1, /obj/item/card/credit=1, /obj/item/flashlight=1) diff --git a/modular_darkpack/modules/jobs/code/doctor.dm b/modular_darkpack/modules/jobs/code/doctor.dm deleted file mode 100644 index 9a5f2a9ed72d..000000000000 --- a/modular_darkpack/modules/jobs/code/doctor.dm +++ /dev/null @@ -1,106 +0,0 @@ - -/datum/job/vamp/vdoctor - title = "Doctor" - department_head = list("Clinic Director") - faction = "Vampire" - total_positions = 4 - spawn_positions = 4 - supervisors = "the Camarilla or the Anarchs" - selection_color = "#80D0F4" - exp_type_department = EXP_TYPE_CLINIC - - - outfit = /datum/outfit/job/vdoctor - - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_PHARMACY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_PHARMACY) - paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_MED - - liver_traits = list(TRAIT_MEDICAL_METABOLISM) - - allowed_species = list("Vampire", "Ghoul", "Human", "Werewolf", "Kuei-Jin") - display_order = JOB_DISPLAY_ORDER_DOCTOR - bounty_types = CIV_JOB_MED - - v_duty = "Help your fellow kindred in all matters medicine related. Sell blood. Keep your human colleagues ignorant." - duty = "Collect blood by helping mortals at the Clinic." - allowed_bloodlines = list("Daughters of Cacophony", "Salubri", "Baali", "Brujah", "Tremere", "Ventrue", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Giovanni", "Ministry", "Tzimisce", "Lasombra", "Caitiff", "Kiasyd") - known_contacts = list("Clinic Director") - -/datum/outfit/job/vdoctor - name = "Doctor" - jobtype = /datum/job/vamp/vdoctor - - ears = /obj/item/p25radio - id = /obj/item/card/id/clinic - uniform = /obj/item/clothing/under/vampire/nurse - shoes = /obj/item/clothing/shoes/vampire/white - suit = /obj/item/clothing/suit/vampire/labcoat - gloves = /obj/item/clothing/gloves/vampire/latex - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/vamp/keys/clinic - backpack_contents = list(/obj/item/passport=1, /obj/item/cockclock=1, /obj/item/flashlight=1, /obj/item/card/credit=1, /obj/item/storage/medkit/darkpack/doctor=1) - - backpack = /obj/item/storage/backpack - satchel = /obj/item/storage/backpack/satchel - duffelbag = /obj/item/storage/backpack/duffelbag - - skillchips = list(/obj/item/skillchip/entrails_reader, /obj/item/skillchip/quickcarry) - -/obj/effect/landmark/start/vdoctor - name = "Doctor" - icon_state = "Doctor" - - -/datum/job/vamp/vdirector - title = "Clinic Director" - department_head = list("Seneschal") - faction = "Vampire" - total_positions = 1 - spawn_positions = 1 - supervisors = "the Camarilla or the Anarchs" - selection_color = "#80D0F4" - exp_type_department = EXP_TYPE_CLINIC - - - outfit = /datum/outfit/job/vdirector - - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_PHARMACY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_PHARMACY) - paycheck = PAYCHECK_COMMAND - paycheck_department = ACCOUNT_MED - - liver_traits = list(TRAIT_MEDICAL_METABOLISM) - - allowed_species = list("Vampire", "Ghoul", "Human", "Werewolf") - display_order = JOB_DISPLAY_ORDER_CLINICS_DIRECTOR - bounty_types = CIV_JOB_MED - - v_duty = "Keep Saint John's clinic up and running. Sell blood. Keep your human colleagues ignorant." - duty = "Keep Saint John's clinic up and running. Collect blood by helping mortals at the Clinic." - allowed_bloodlines = list("Daughters of Cacophony", "Salubri", "Baali", "Brujah", "Tremere", "Ventrue", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Giovanni", "Ministry", "Tzimisce", "Lasombra", "Caitiff", "Kiasyd") - -/datum/outfit/job/vdirector - name = "Clinic Director" - jobtype = /datum/job/vamp/vdirector - - ears = /obj/item/p25radio - id = /obj/item/card/id/clinic/director - uniform = /obj/item/clothing/under/vampire/nurse - shoes = /obj/item/clothing/shoes/vampire/white - suit = /obj/item/clothing/suit/vampire/labcoat/director - gloves = /obj/item/clothing/gloves/vampire/latex - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/vamp/keys/clinics_director - backpack_contents = list(/obj/item/passport=1, /obj/item/cockclock=1, /obj/item/flashlight=1, /obj/item/card/credit=1, /obj/item/storage/medkit/darkpack/doctor=1) - - backpack = /obj/item/storage/backpack - satchel = /obj/item/storage/backpack/satchel - duffelbag = /obj/item/storage/backpack/duffelbag - - skillchips = list(/obj/item/skillchip/entrails_reader, /obj/item/skillchip/quickcarry) - -/obj/effect/landmark/start/vdirector - name = "Director" - icon_state = "Doctor" diff --git a/modular_darkpack/modules/jobs/code/event/national_guard.dm b/modular_darkpack/modules/jobs/code/event/national_guard.dm new file mode 100644 index 000000000000..30e1a66fe572 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/event/national_guard.dm @@ -0,0 +1,217 @@ +/datum/outfit/job/vampire/national_guard + name = "National Guard Soldier" + ears = /obj/item/radio/headset/darkpack/military + uniform = /obj/item/clothing/under/vampire/military_fatigues + mask = /obj/item/clothing/mask/vampire/balaclava + r_pocket = /obj/item/flashlight + l_pocket = /obj/item/ammo_box/magazine/darkpackaug + shoes = /obj/item/clothing/shoes/vampire/jackboots + belt = /obj/item/gun/ballistic/automatic/darkpack/aug + suit = /obj/item/clothing/suit/vampire/vest/army + head = /obj/item/clothing/head/vampire/army + backpack_contents = list( + /obj/item/ammo_box/magazine/darkpackaug = 3, + /obj/item/gun/ballistic/automatic/pistol/darkpack/beretta = 1 + ) + +/datum/antagonist/national_guard/proc/equip_national_guard() + var/list/landmarkslist = list() + for(var/obj/effect/landmark/start/S in GLOB.start_landmarks_list) + if(S.name == name) + landmarkslist += S + var/mob/living/carbon/human/H = new(pick(landmarkslist)) + H.equipOutfit(national_guard_outfit) + H.st_set_stat(5, STAT_STAMINA) + H.st_set_stat(5, STAT_LARCENY) + H.st_set_stat(4, STAT_STRENGTH) + H.ignores_warrant = TRUE + +/datum/antagonist/national_guard/proc/offer_loadout() + var/list/loadouts = list( + "Flamethrower", + "EOD", + "Medic", + "Sniper", + "Ammo Carrier" + ) + var/loadout_type = input(owner.current, "Choose your loadout:", "Loadout Selection") in loadouts + switch(loadout_type) + if("Flamethrower") + owner.current.put_in_r_hand(new /obj/item/liquid_flamethrower(owner.current)) + owner.current.put_in_l_hand(new /obj/item/gas_can/full(owner.current)) + if("EOD") + owner.current.put_in_r_hand(new /obj/item/clothing/suit/vampire/eod(owner.current)) + owner.current.put_in_l_hand(new /obj/item/clothing/head/vampire/eod(owner.current)) + if("Medic") + owner.current.put_in_r_hand(new /obj/item/storage/medkit/darkpack/combat(owner.current)) + if("Sniper") + owner.current.put_in_r_hand(new /obj/item/gun/ballistic/automatic/darkpack/sniper(owner.current)) + owner.current.put_in_l_hand(new /obj/item/ammo_box/darkpack/c556(owner.current)) + if("Ammo Carrier") + owner.current.put_in_r_hand(new /obj/item/ammo_box/darkpack/c556/incendiary(owner.current)) + owner.current.put_in_l_hand(new /obj/item/ammo_box/darkpack/c556/incendiary(owner.current)) + +/datum/antagonist/national_guard + name = "National Guard" + roundend_category = "national guard" + antagpanel_category = "National Guard" + pref_flag = ROLE_NATIONAL_GUARD + antag_hud_name = "synd" + antag_moodlet = /datum/mood_event/focused + show_to_ghosts = TRUE + var/always_new_team = FALSE + var/datum/team/national_guard/national_guard_team + var/national_guard_outfit = /datum/outfit/job/vampire/national_guard + var/custom_objective + +/datum/antagonist/national_guard/sergeant + name = "National Guard Sergeant" + always_new_team = TRUE + var/title + +/datum/antagonist/national_guard/on_gain() + var/mob/living/carbon/human/guard_character = owner.current + guard_character.randomize_human_appearance() + forge_objectives() + equip_national_guard() + give_alias() + offer_loadout() + return ..() + +/datum/antagonist/national_guard/on_removal() + ..() + to_chat(owner.current, span_userdanger("You are no longer in the National Guard!")) + +/datum/antagonist/national_guard/greet() + to_chat(owner.current, span_alertsyndie("You're in the national guard.")) + to_chat(owner, span_notice("You are a [national_guard_team ? national_guard_team.national_guard_name : "national guard"] soldier!")) + owner.announce_objectives() + + +/datum/antagonist/national_guard/proc/give_alias() + var/my_name = "Tyler" + var/list/military_ranks = list("Private", "Private First Class", "Specialist", "Corporal") + var/selected_rank = pick(military_ranks) + if(owner.current.gender == MALE) + my_name = pick(GLOB.first_names_male) + else + my_name = pick(GLOB.first_names_female) + var/my_surname = pick(GLOB.last_names) + owner.current.fully_replace_character_name(null,"[selected_rank] [my_name] [my_surname]") + +/datum/antagonist/national_guard/forge_objectives() + spawn(2 SECONDS) + if(national_guard_team) + objectives |= national_guard_team.objectives + +/datum/antagonist/national_guard/sergeant/give_alias() + var/my_name = "Tyler" + if(owner.current.gender == MALE) + my_name = pick(GLOB.first_names_male) + else + my_name = pick(GLOB.first_names_female) + var/my_surname = pick(GLOB.last_names) + owner.current.fully_replace_character_name(null,"Sergeant [my_name] [my_surname]") + +/datum/team/national_guard/antag_listing_name() + if(national_guard_name) + return "[national_guard_name] Soldiers" + else + return "Soldiers" + + +/datum/antagonist/national_guard/sergeant/greet() + to_chat(owner, "<B>You are the leading sergeant for this mission. You are responsible for guiding your team's operation.</B>") + to_chat(owner, "<B>If you feel you are not up to this task, give your command to another soldier.</B>") + owner.announce_objectives() + addtimer(CALLBACK(src, PROC_REF(national_guardteam_name_assign)), 1) + +/datum/antagonist/national_guard/sergeant/proc/national_guardteam_name_assign() + if(!national_guard_team) + return + national_guard_team.rename_team(ask_name()) + +/datum/antagonist/national_guard/sergeant/proc/ask_name() + var/randomname = pick(GLOB.last_names) + var/newname = stripped_input(owner.current,"You are the sergeant. Please choose a name for your team.", "Name change",randomname) + if (!newname) + newname = randomname + else + newname = reject_bad_name(newname) + if(!newname) + newname = randomname + +/datum/antagonist/national_guard/create_team(datum/team/national_guard/new_team) + if(!new_team) + if(!always_new_team) + for(var/datum/antagonist/national_guard/N in GLOB.antagonists) + if(!N.owner) + stack_trace("Antagonist datum without owner in GLOB.antagonists: [N]") + continue + national_guard_team = new /datum/team/national_guard + national_guard_team.update_objectives() + return + if(!istype(national_guard_team)) + stack_trace("Wrong team type passed to [type] initialization.") + national_guard_team = new_team + +/datum/antagonist/national_guard/admin_add(datum/mind/new_owner,mob/admin) + new_owner.assigned_role = ROLE_NATIONAL_GUARD + new_owner.add_antag_datum(src) + message_admins("[key_name_admin(admin)] has national guard'd [key_name_admin(new_owner)].") + log_admin("[key_name(admin)] has national guard'd [key_name(new_owner)].") + +/datum/team/national_guard/proc/rename_team(new_name) + national_guard_name = new_name + name = "[national_guard_name] Team" + +/datum/objective/national_guard + name = "national_guard" + explanation_text = "Follow the orders of your sergeant." + martyr_compatible = TRUE + +/proc/national_guard_name() + var/name = "" + + // Prefix + name += pick("Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel", "India", "Juliet", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa", "Quebec", "Romeo", "Sierra", "Tango", "Uniform", "Victor", "Whiskey", "X-ray", "Yankee", "Zulu") + + // Suffix + if (prob(80)) + name += " " + + // Full + if(prob(60)) + name += pick("Squad", "Team", "Unit", "Group", "Section", "Element", "Detachment") + // Broken + else + name += pick("-", "*", "") + name += "Ops" + +/datum/team/national_guard + var/national_guard_name + var/core_objective = /datum/objective/national_guard + member_name = "National Guard Operative" + var/memorized_code + var/list/team_discounts + var/obj/item/nuclear_challenge/war_button + +/datum/team/national_guard/New() + ..() + national_guard_name = national_guard_name() + +/datum/team/national_guard/proc/update_objectives() + if(core_objective) + var/datum/objective/O = new core_objective + O.team = src + objectives += O + +/datum/team/national_guard/roundend_report() + var/list/parts = list() + parts += span_header("[national_guard_name] Operatives:") + + var/text = "<br>[span_header("The national guard were:")]" + text += printplayerlist(members) + parts += text + + return "<div class='panel redborder'>[parts.Join("<br>")]</div>" diff --git a/modular_darkpack/modules/jobs/code/event/swat.dm b/modular_darkpack/modules/jobs/code/event/swat.dm new file mode 100644 index 000000000000..d5bc506a5abb --- /dev/null +++ b/modular_darkpack/modules/jobs/code/event/swat.dm @@ -0,0 +1,196 @@ +/datum/outfit/job/vampire/swat + name = "Swat Officer" + ears = /obj/item/radio/headset/darkpack/police + uniform = /obj/item/clothing/under/vampire/police/utility + mask = /obj/item/clothing/mask/vampire/balaclava + r_pocket = /obj/item/flashlight + l_pocket = /obj/item/vamp/keys/police + shoes = /obj/item/clothing/shoes/vampire/jackboots + belt = /obj/item/storage/belt/security/police/swat + suit = /obj/item/clothing/suit/vampire/vest/police + head = /obj/item/clothing/head/vampire/helmet + id = /obj/item/card/police + backpack_contents = list( + /obj/item/ammo_box/magazine/darkpack556 = 4, + /obj/item/storage/medkit/darkpack/ifak = 1, + /obj/item/vamp/keys/hack=2 + ) + r_hand = /obj/item/gun/ballistic/automatic/darkpack/ar15 + +/datum/antagonist/swat/proc/equip_swat() + var/list/landmarkslist = list() + for(var/obj/effect/landmark/start/S in GLOB.start_landmarks_list) + if(S.name == name) + landmarkslist += S + var/mob/living/carbon/human/H = new(pick(landmarkslist)) + H.equipOutfit(swat_outfit) + H.st_set_stat(5, STAT_LARCENY) + H.st_set_stat(4, STAT_STRENGTH) + H.ignores_warrant = TRUE + +/datum/antagonist/swat + name = "Swat Officer" + roundend_category = "Swat" + antagpanel_category = "Swat" + pref_flag = ROLE_SWAT + antag_hud_name = "synd" + antag_moodlet = /datum/mood_event/focused + show_to_ghosts = TRUE + var/always_new_team = FALSE + var/datum/team/swat/swat_team + var/swat_outfit = /datum/outfit/job/vampire/swat + var/custom_objective + +/datum/antagonist/swat/team_leader + name = "Swat Team Leader" + always_new_team = TRUE + var/title + +/datum/antagonist/swat/on_gain() + var/mob/living/carbon/human/swat_character = owner.current + swat_character.randomize_human_appearance() + forge_objectives() + equip_swat() + give_alias() + return ..() + +/datum/antagonist/swat/on_removal() + ..() + to_chat(owner.current,span_userdanger("You are no longer in the Special Weapons and Tactics squad!")) + +/datum/antagonist/swat/greet() + to_chat(owner.current, span_alertsyndie("You're in the Special Weapons and Tactics squad.")) + to_chat(owner, span_notice("You are a [swat_team ? swat_team.swat_name : "swat"] officer!")) + spawn(3 SECONDS) + owner.announce_objectives() + + +/datum/antagonist/swat/proc/give_alias() + var/my_name = "Tyler" + var/list/swat_ranks = list("Private", "Private First Class", "Lance Corporal", "Corporal") + var/selected_rank = pick(swat_ranks) + if(owner.current.gender == MALE) + my_name = pick(GLOB.first_names_male) + else + my_name = pick(GLOB.first_names_female) + var/my_surname = pick(GLOB.last_names) + owner.current.fully_replace_character_name(null,"[selected_rank] [my_name] [my_surname]") + +/datum/antagonist/swat/forge_objectives() + spawn(2 SECONDS) + if(swat_team) + objectives |= swat_team.objectives + +/datum/antagonist/swat/leader/give_alias() + var/my_name = "Tyler" + if(owner.current.gender == MALE) + my_name = pick(GLOB.first_names_male) + else + my_name = pick(GLOB.first_names_female) + var/my_surname = pick(GLOB.last_names) + owner.current.fully_replace_character_name(null,"Squad Leader [my_name] [my_surname]") + +/datum/team/swat/antag_listing_name() + if(swat_name) + return "[swat_name] Officers" + else + return "Officers" + + +/datum/antagonist/swat/leader/greet() + to_chat(owner, "<B>You are the SWAT Officer in charge of this mission. You are responsible for guiding your team's operation.</B>") + to_chat(owner, "<B>If you feel you are not up to this task, give your command to another officer.</B>") + spawn(3 SECONDS) + owner.announce_objectives() + addtimer(CALLBACK(src, PROC_REF(swatteam_name_assign)), 1) + +/datum/antagonist/swat/leader/proc/swatteam_name_assign() + if(!swat_team) + return + swat_team.rename_team(ask_name()) + +/datum/antagonist/swat/leader/proc/ask_name() + var/randomname = pick(GLOB.last_names) + var/newname = stripped_input(owner.current,"You are the squa leader. Please choose a name for your team.", "Name change",randomname) + if (!newname) + newname = randomname + else + newname = reject_bad_name(newname) + if(!newname) + newname = randomname + +/datum/antagonist/swat/create_team(datum/team/swat/new_team) + if(!new_team) + if(!always_new_team) + for(var/datum/antagonist/swat/N in GLOB.antagonists) + if(!N.owner) + stack_trace("Antagonist datum without owner in GLOB.antagonists: [N]") + continue + swat_team = new /datum/team/swat + swat_team.update_objectives() + return + if(!istype(swat_team)) + stack_trace("Wrong team type passed to [type] initialization.") + swat_team = new_team + +/datum/antagonist/swat/admin_add(datum/mind/new_owner,mob/admin) + new_owner.assigned_role = ROLE_SWAT + new_owner.add_antag_datum(src) + message_admins("[key_name_admin(admin)] has swat'd [key_name_admin(new_owner)].") + log_admin("[key_name(admin)] has swat'd [key_name(new_owner)].") + +/datum/team/swat/proc/rename_team(new_name) + swat_name = new_name + name = "[swat_name] Team" + +/proc/swat_name() + var/name = "" + + // Prefix + name += pick("Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel", "India", "Juliet", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa", "Quebec", "Romeo", "Sierra", "Tango", "Uniform", "Victor", "Whiskey", "X-ray", "Yankee", "Zulu") + + // Suffix + if (prob(80)) + name += " " + + // Full + if(prob(60)) + name += pick("Squad", "Team", "Unit", "Group", "Section", "Element", "Detachment") + // Broken + else + name += pick("-", "*", "") + name += "Ops" + + return name + +/datum/objective/swat + name = "swat" + explanation_text = "Follow the orders of your commander." + martyr_compatible = TRUE + +/datum/team/swat + var/swat_name + var/core_objective = /datum/objective/swat + member_name = "Swat Officer" + +/datum/team/swat/New() + ..() + swat_name = swat_name() + +/datum/team/swat/proc/update_objectives() + if(core_objective) + var/datum/objective/O = new core_objective + O.team = src + objectives += O + + +/datum/team/swat/roundend_report() + var/list/parts = list() + parts += span_header("[swat_name] Operatives:") + + var/text = "<br>[span_header("The SWAT were:")]" + text += printplayerlist(members) + parts += text + + return "<div class='panel redborder'>[parts.Join("<br>")]</div>" + diff --git a/modular_darkpack/modules/jobs/code/fbi.dm b/modular_darkpack/modules/jobs/code/fbi.dm deleted file mode 100644 index 8c7298f698b0..000000000000 --- a/modular_darkpack/modules/jobs/code/fbi.dm +++ /dev/null @@ -1,47 +0,0 @@ - -/datum/job/vamp/fbi - title = "Federal Investigator" - department_head = list("Federal Bureau of Investigation") - faction = "Vampire" - total_positions = 2 - spawn_positions = 2 - supervisors = " the FBI" - selection_color = "#1a1d8a" - - outfit = /datum/outfit/job/fbi - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_ARMORY, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_FBI - exp_type_department = EXP_TYPE_NATIONAL_SECURITY - - allowed_species = list("Human") - minimal_generation = 13 - - duty = "Enforce the Law." - minimal_masquerade = 0 - my_contact_is_important = FALSE - known_contacts = list("Police Chief") - -/datum/outfit/job/fbi - name = "Federal Investigator" - jobtype = /datum/job/vamp/fbi - - ears = /obj/item/p25radio/police/government - uniform = /obj/item/clothing/under/vampire/office - shoes = /obj/item/clothing/shoes/vampire - suit = /obj/item/clothing/suit/vampire/jacket/fbi - belt = /obj/item/storage/belt/holster/detective/vampire/fbi - id = /obj/item/card/id/police/fbi - gloves = /obj/item/clothing/gloves/vampire/investigator - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/radio/cop - l_hand = /obj/item/vamp/keys/police - r_hand = /obj/item/police_radio - backpack_contents = list(/obj/item/card/id/police/sergeant=1, /obj/item/passport=1, /obj/item/camera/detective=1, /obj/item/camera_film=1, /obj/item/taperecorder=1, /obj/item/tape=1, /obj/item/card/credit=1, /obj/item/ammo_box/vampire/c45acp=1, /obj/item/storage/medkit/darkpack/ifak=1) - -/datum/outfit/job/fbi/post_equip(mob/living/carbon/human/agent) - ..() - agent.ignores_warrant = TRUE diff --git a/modular_darkpack/modules/jobs/code/garou/councillor.dm b/modular_darkpack/modules/jobs/code/garou/councillor.dm new file mode 100644 index 000000000000..aa1049002985 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/garou/councillor.dm @@ -0,0 +1,44 @@ +/datum/job/vampire/councillor + title = JOB_GAROU_COUNCIL + description = "Veterans of the Garou Nation with the highest esteem, your word within the " + SEPT_NAME + " is law. Make sure the Litany is upheld, and that your caern does not fall prey to the Wyrm." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 3 + spawn_positions = 3 + supervisors = SUPERVISOR_LITANY + req_admin_notify = 1 + minimal_player_age = 25 + exp_requirements = 180 + exp_required_type = EXP_TYPE_GAIA + exp_required_type_department = EXP_TYPE_GAIA + exp_granted_type = EXP_TYPE_GAIA + config_tag = "COUNCILLOR" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/councillor + + allowed_species = list(SPECIES_GAROU) +// allowed_tribes = list(TRIBE_GAIA) + + display_order = JOB_DISPLAY_ORDER_COUNCIL + department_for_prefs = /datum/job_department/gaia + departments_list = list( + /datum/job_department/gaia, + ) + + known_contacts = list( + "Truthcatcher", + "Warder", + "Wyrmfoe", + "Guardian" + ) + +/datum/outfit/job/vampire/councillor + name = "Sept Councillor" + jobtype = /obj/item/card/park_ranger/oversight + + id = /obj/item/card/park_ranger/oversight + uniform = /obj/item/clothing/under/vampire/turtleneck_white + suit = /obj/item/clothing/suit/vampire/coat/winter/alt + shoes = /obj/item/clothing/shoes/vampire/jackboots/work + l_pocket = /obj/item/smartphone // DARKPACK TODO - Garou phone network. Glasswalkers only? + backpack_contents = list(/obj/item/gun/ballistic/automatic/pistol/darkpack/deagle=1, /obj/item/phone_book=1, /obj/item/card/credit/rich=1) diff --git a/modular_darkpack/modules/jobs/code/garou/guardian.dm b/modular_darkpack/modules/jobs/code/garou/guardian.dm new file mode 100644 index 000000000000..7d8c33fbeeda --- /dev/null +++ b/modular_darkpack/modules/jobs/code/garou/guardian.dm @@ -0,0 +1,47 @@ +/datum/job/vampire/guardian + title = JOB_GAROU_GUARDIAN + description = "You are the bottom of the Sept's pecking order, but also the frontline offense and defense, serving directly under the Warder and Wyrmfoe to ensure the caern's safety and well-being." + auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY + faction = FACTION_CITY + total_positions = 3 + spawn_positions = 3 + supervisors = /datum/job/vampire/warder + req_admin_notify = 1 + minimal_player_age = 25 + exp_requirements = 50 + exp_required_type = EXP_TYPE_GAIA + exp_required_type_department = EXP_TYPE_GAIA + exp_granted_type = EXP_TYPE_GAIA + config_tag = "GUARDIAN" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/guardian + + allowed_species = list(SPECIES_GAROU) +// allowed_tribes = list(TRIBE_GAIA) + + display_order = JOB_DISPLAY_ORDER_GUARDIAN + department_for_prefs = /datum/job_department/gaia + departments_list = list( + /datum/job_department/gaia, + ) + + known_contacts = list( + "Councillor", + "Truthcatcher", + "Warder", + "Wyrmfoe" + ) + +/datum/outfit/job/vampire/guardian + name = "Sept Guardian" + jobtype = /datum/job/vampire/guardian + + id = /obj/item/card/park_ranger + uniform = /obj/item/clothing/under/vampire/biker + shoes = /obj/item/clothing/shoes/vampire/jackboots + head = /obj/item/clothing/head/vampire/baseballcap + belt = /obj/item/melee/baton/vamp + gloves = /obj/item/clothing/gloves/vampire/leather + suit = /obj/item/clothing/suit/vampire/jacket + l_pocket = /obj/item/smartphone + backpack_contents = list(/obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/garou/truthcatcher.dm b/modular_darkpack/modules/jobs/code/garou/truthcatcher.dm new file mode 100644 index 000000000000..32275d4c8e7b --- /dev/null +++ b/modular_darkpack/modules/jobs/code/garou/truthcatcher.dm @@ -0,0 +1,47 @@ +/datum/job/vampire/truthcatcher + title = JOB_GAROU_TRUTHCATCHER + description = "You are the most highly regarded Philodox within the Sept, granted the honor of being the ultimate arbitrator. It is your duty to meditate matters within the Sept. Enact your judgement upon anyone who violates the Litany." + auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = SUPERVISOR_LITANY + req_admin_notify = 1 + minimal_player_age = 25 + exp_requirements = 100 + exp_required_type = EXP_TYPE_GAIA + exp_required_type_department = EXP_TYPE_GAIA + exp_granted_type = EXP_TYPE_GAIA + config_tag = "TRUTHCATCHER" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/trutchcatcher + + allowed_species = list(SPECIES_GAROU) +// allowed_tribes = list(TRIBE_GAIA) +// allowed_auspice = list(AUSPICE_PHILODOX) + + display_order = JOB_DISPLAY_ORDER_TRUTHCATCHER + department_for_prefs = /datum/job_department/gaia + departments_list = list( + /datum/job_department/gaia, + ) + + known_contacts = list( + "Councillor", + "Warder", + "Wyrmfoe", + "Guardian" + ) + +/datum/outfit/job/vampire/trutchcatcher + name = "Sept Truthcatcher" + jobtype = /datum/job/vampire/truthcatcher + + id = /obj/item/card/park_ranger/guide + uniform = /obj/item/clothing/under/vampire/office + suit = /obj/item/clothing/suit/vampire/coat/winter/alt + gloves = /obj/item/clothing/gloves/vampire/work + shoes = /obj/item/clothing/shoes/vampire/jackboots/work + l_pocket = /obj/item/smartphone + backpack_contents = list(/obj/item/phone_book=1, /obj/item/veil_contract, /obj/item/card/credit/rich=1) + diff --git a/modular_darkpack/modules/jobs/code/garou/warder.dm b/modular_darkpack/modules/jobs/code/garou/warder.dm new file mode 100644 index 000000000000..620ee4ba70ed --- /dev/null +++ b/modular_darkpack/modules/jobs/code/garou/warder.dm @@ -0,0 +1,49 @@ +/datum/job/vampire/warder + title = JOB_GAROU_WARDER + description = "You are the most respected Ahroun within the" + SEPT_NAME + ", granted the honor of coordinating the caern's security. The Wyrmfoe and Guardians answer to you." + auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = SUPERVISOR_LITANY + req_admin_notify = 1 + minimal_player_age = 25 + exp_requirements = 100 + exp_required_type = EXP_TYPE_GAIA + exp_required_type_department = EXP_TYPE_GAIA + exp_granted_type = EXP_TYPE_GAIA + config_tag = "WARDER" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/warder + + allowed_species = list(SPECIES_GAROU) +// allowed_tribes = list(TRIBE_GAIA) +// allowed_auspice = list(AUSPICE_AHROUN) + + display_order = JOB_DISPLAY_ORDER_WARDER + department_for_prefs = /datum/job_department/gaia + departments_list = list( + /datum/job_department/gaia, + ) + + known_contacts = list( + "Councillor", + "Truthcatcher", + "Wyrmfoe", + "Guardian" + ) + +/datum/outfit/job/vampire/warder + name = "Sept Warder" + jobtype = /datum/job/vampire/warder + + id = /obj/item/card/park_ranger/leader + uniform = /obj/item/clothing/under/vampire/biker + shoes = /obj/item/clothing/shoes/vampire/jackboots + gloves = /obj/item/clothing/gloves/vampire/work + head = /obj/item/clothing/head/vampire/cowboy + belt = /obj/item/storage/belt/sheath/vamp/sabre + suit = /obj/item/clothing/suit/vampire/vest/medieval + glasses = /obj/item/clothing/glasses/vampire/sun + l_pocket = /obj/item/smartphone + backpack_contents = list(/obj/item/gun/ballistic/automatic/pistol/darkpack/deagle=1, /obj/item/veil_contract, /obj/item/card/credit/rich=1) diff --git a/modular_darkpack/modules/jobs/code/garou/wyrmfoe.dm b/modular_darkpack/modules/jobs/code/garou/wyrmfoe.dm new file mode 100644 index 000000000000..c005317d7f47 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/garou/wyrmfoe.dm @@ -0,0 +1,45 @@ +/datum/job/vampire/wyrmfoe + title = JOB_GAROU_WYRMFOE + description = "You are the Warder's right hand, a promising tactician in your own right, granted the honor of coordinating the Sept's more offensive actions. " + auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = SUPERVISOR_LITANY + req_admin_notify = 1 + minimal_player_age = 25 + exp_requirements = 100 + exp_required_type = EXP_TYPE_GAIA + exp_required_type_department = EXP_TYPE_GAIA + exp_granted_type = EXP_TYPE_GAIA + config_tag = "WYRMFOE" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/wyrmfoe + + allowed_species = list(SPECIES_GAROU) +// allowed_tribes = list(TRIBE_GAIA) + + display_order = JOB_DISPLAY_ORDER_WYRMFOE + department_for_prefs = /datum/job_department/gaia + departments_list = list( + /datum/job_department/gaia, + ) + + known_contacts = list( + "Councillor", + "Truthcatcher", + "Wyrmfoe", + "Guardian" + ) + +/datum/outfit/job/vampire/wyrmfoe + name = "Sept Wyrmfoe" + jobtype = /datum/job/vampire/wyrmfoe + + id = /obj/item/card/park_ranger/biologist + uniform = /obj/item/clothing/under/vampire/mechanic + suit = /obj/item/clothing/suit/vampire/labcoat + gloves = /obj/item/clothing/gloves/vampire/work + shoes = /obj/item/clothing/shoes/vampire/jackboots/work + l_pocket = /obj/item/smartphone + backpack_contents = list(/obj/item/phone_book=1, /obj/item/card/credit/rich=1) diff --git a/modular_darkpack/modules/jobs/code/giovanni.dm b/modular_darkpack/modules/jobs/code/giovanni.dm deleted file mode 100644 index 332486036b30..000000000000 --- a/modular_darkpack/modules/jobs/code/giovanni.dm +++ /dev/null @@ -1,137 +0,0 @@ -/datum/job/vamp/giovannielder - title = "Capo" - department_head = list("Uncle Augie") - faction = "Vampire" - total_positions = 1 - spawn_positions = 1 - supervisors = "the Family and the Traditions" - selection_color = "#cb4aad" - - outfit = /datum/outfit/job/giovannielder - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_GIOVANNI - exp_type_department = EXP_TYPE_GIOVANNI - - minimal_generation = 11 //Uncomment when players get exp enough - - v_duty = "Pure blood runs through your veins and, with it, old power. Throughout your long life you have learnt to hold onto two things and never let go: money, and family." - minimal_masquerade = 0 - allowed_species = list("Vampire") - allowed_bloodlines = list("Giovanni", "Cappadocian") - -/datum/outfit/job/giovannielder - name = "Capo" - jobtype = /datum/job/vamp/giovannielder - - id = /obj/item/cockclock - glasses = /obj/item/clothing/glasses/vampire/sun - uniform = /obj/item/clothing/under/vampire/suit - suit = /obj/item/clothing/suit/vampire/trench - shoes = /obj/item/clothing/shoes/vampire - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/vamp/keys/capo - backpack_contents = list(/obj/item/passport=1, /obj/item/flashlight=1, /obj/item/card/credit/giovanniboss=1) - -/datum/outfit/job/giovannielder/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == FEMALE) - uniform = /obj/item/clothing/under/vampire/suit/female - shoes = /obj/item/clothing/shoes/vampire/heels - -/obj/effect/landmark/start/giovannielder - name = "Capo" - -/datum/job/vamp/giovanni - title = "La Squadra" - department_head = list("Capo") - faction = "Vampire" - total_positions = 10 - spawn_positions = 10 - supervisors = "the Family and the Traditions" - selection_color = "#cb4aad" - - outfit = /datum/outfit/job/giovanni - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_GIOVANNI - exp_type_department = EXP_TYPE_GIOVANNI - - v_duty = "Whether born or Embraced into the family, you are one of the Giovanni. Be you a necromancer, financier or lowly fledgling, remember that so long as you stand with your family, they too will stand with you." - minimal_masquerade = 0 - allowed_species = list("Vampire") - allowed_bloodlines = list("Giovanni", "Cappadocian") - -/datum/outfit/job/giovanni - name = "La Squadra" - jobtype = /datum/job/vamp/giovanni - - id = /obj/item/cockclock - glasses = /obj/item/clothing/glasses/vampire/sun - uniform = /obj/item/clothing/under/vampire/suit - suit = /obj/item/clothing/suit/vampire/trench - shoes = /obj/item/clothing/shoes/vampire - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/vamp/keys/giovanni - backpack_contents = list(/obj/item/passport=1, /obj/item/flashlight=1, /obj/item/card/credit/rich=1) - -/datum/outfit/job/giovanni/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == FEMALE) - uniform = /obj/item/clothing/under/vampire/suit/female - shoes = /obj/item/clothing/shoes/vampire/heels - -/obj/effect/landmark/start/giovanni - name = "La Squadra" - -/datum/job/vamp/giovannimafia - title = "La Famiglia" - department_head = list("Capo") - faction = "Vampire" - total_positions = 10 - spawn_positions = 10 - supervisors = "the Family" - selection_color = "#cb4aad" - - outfit = /datum/outfit/job/giovannimafia - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_GIOVANNI - exp_type_department = EXP_TYPE_GIOVANNI - -// minimal_generation = 11 //Uncomment when players get exp enough - - allowed_species = list("Ghoul", "Human") - duty = "Your family is a strange one. Maybe you are strange too, because sitting next to your great uncles as an equal is something you are greatly interested in." - minimal_masquerade = 0 - - -/datum/outfit/job/giovannimafia - name = "La Famiglia" - jobtype = /datum/job/vamp/giovannimafia - id = /obj/item/cockclock - glasses = /obj/item/clothing/glasses/vampire/sun - uniform = /obj/item/clothing/under/vampire/suit - suit = /obj/item/clothing/suit/vampire/trench - shoes = /obj/item/clothing/shoes/vampire - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/vamp/keys/giovanni - backpack_contents = list(/obj/item/passport=1, /obj/item/flashlight=1, /obj/item/card/credit=1) - -/datum/outfit/job/giovannimafia/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == FEMALE) - uniform = /obj/item/clothing/under/vampire/suit/female - shoes = /obj/item/clothing/shoes/vampire/heels - -/obj/effect/landmark/start/giovannimafia - name = "La Famiglia" diff --git a/modular_darkpack/modules/jobs/code/giovanni/capo.dm b/modular_darkpack/modules/jobs/code/giovanni/capo.dm new file mode 100644 index 000000000000..ab7441f8493d --- /dev/null +++ b/modular_darkpack/modules/jobs/code/giovanni/capo.dm @@ -0,0 +1,32 @@ +/datum/job/vampire/capo + title = JOB_CAPO + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = "the Family and the Traditions" + config_tag = "CAPO" + outfit = /datum/outfit/job/vampire/capo + job_flags = CITY_JOB_FLAGS + display_order = JOB_DISPLAY_ORDER_GIOVANNI + exp_required_type_department = EXP_TYPE_GIOVANNI + department_for_prefs = /datum/job_department/giovanni + departments_list = list( + /datum/job_department/giovanni, + ) + + description = "Pure blood runs through your veins and, with it, old power. Throughout your long life you have learnt to hold onto two things and never let go: money, and family." + minimal_masquerade = 0 + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_GIOVANNI, VAMPIRE_CLAN_CAPPADOCIAN) + +/datum/outfit/job/vampire/capo + name = "Capo" + jobtype = /datum/job/vampire/capo + + glasses = /obj/item/clothing/glasses/vampire/sun + uniform = /obj/item/clothing/under/vampire/suit + suit = /obj/item/clothing/suit/vampire/trench + shoes = /obj/item/clothing/shoes/vampire + l_pocket = /obj/item/smartphone/giovanni_capo + r_pocket = /obj/item/vamp/keys/capo + backpack_contents = list(/obj/item/card/credit/giovanniboss=1) diff --git a/modular_darkpack/modules/jobs/code/giovanni/la_famiglia.dm b/modular_darkpack/modules/jobs/code/giovanni/la_famiglia.dm new file mode 100644 index 000000000000..8d3a080efa09 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/giovanni/la_famiglia.dm @@ -0,0 +1,31 @@ +/datum/job/vampire/famiglia + title = JOB_LA_FAMIGLIA + faction = FACTION_CITY + total_positions = 10 + spawn_positions = 10 + supervisors = "the Family or your Spouse" + config_tag = "LA_FAMIGLIA" + outfit = /datum/outfit/job/vampire/famiglia + job_flags = CITY_JOB_FLAGS + display_order = JOB_DISPLAY_ORDER_GIOVANNI + exp_required_type_department = EXP_TYPE_GIOVANNI + department_for_prefs = /datum/job_department/giovanni + departments_list = list( + /datum/job_department/giovanni, + ) + + allowed_species = list(SPECIES_GHOUL, SPECIES_HUMAN, SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_BRUJAH, VAMPIRE_CLAN_VENTRUE, VAMPIRE_CLAN_NOSFERATU, VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL, VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_MALKAVIAN, VAMPIRE_CLAN_LASOMBRA) + description = "Your family is a strange one. Maybe you are strange too, because sitting next to your great uncles as an equal is something you are greatly interested in." + minimal_masquerade = 0 + +/datum/outfit/job/vampire/famiglia + name = "La Famiglia" + jobtype = /datum/job/vampire/famiglia + glasses = /obj/item/clothing/glasses/vampire/sun + uniform = /obj/item/clothing/under/vampire/suit + suit = /obj/item/clothing/suit/vampire/trench + shoes = /obj/item/clothing/shoes/vampire + l_pocket = /obj/item/smartphone/giovanni_famiglia + r_pocket = /obj/item/vamp/keys/giovanni + backpack_contents = list(/obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/giovanni/la_squadra.dm b/modular_darkpack/modules/jobs/code/giovanni/la_squadra.dm new file mode 100644 index 000000000000..06f5fce78273 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/giovanni/la_squadra.dm @@ -0,0 +1,32 @@ +/datum/job/vampire/squadra + title = JOB_LA_SQUADRA + faction = FACTION_CITY + total_positions = 10 + spawn_positions = 10 + supervisors = "the Family and the Traditions" + config_tag = "LA_SQUADRA" + outfit = /datum/outfit/job/vampire/squadra + job_flags = CITY_JOB_FLAGS + display_order = JOB_DISPLAY_ORDER_GIOVANNI + exp_required_type_department = EXP_TYPE_GIOVANNI + department_for_prefs = /datum/job_department/giovanni + departments_list = list( + /datum/job_department/giovanni, + ) + + description = "Whether born or Embraced into the family, you are one of the Giovanni. Be you a necromancer, financier or lowly fledgling, remember that so long as you stand with your family, they too will stand with you." + minimal_masquerade = 0 + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_GIOVANNI) + +/datum/outfit/job/vampire/squadra + name = "La Squadra" + jobtype = /datum/job/vampire/squadra + + glasses = /obj/item/clothing/glasses/vampire/sun + uniform = /obj/item/clothing/under/vampire/suit + suit = /obj/item/clothing/suit/vampire/trench + shoes = /obj/item/clothing/shoes/vampire + l_pocket = /obj/item/smartphone/giovanni_squadra + r_pocket = /obj/item/vamp/keys/giovanni + backpack_contents = list(/obj/item/card/credit/rich=1) diff --git a/modular_darkpack/modules/jobs/code/graveyard_keeper.dm b/modular_darkpack/modules/jobs/code/graveyard_keeper.dm deleted file mode 100644 index 5b239cfdf75a..000000000000 --- a/modular_darkpack/modules/jobs/code/graveyard_keeper.dm +++ /dev/null @@ -1,50 +0,0 @@ - -/datum/job/vamp/graveyard - title = "Graveyard Keeper" - department_head = list("Seneschal") - faction = "Vampire" - total_positions = 6 - spawn_positions = 6 - supervisors = "the Camarilla or the Anarchs" - selection_color = "#e3e3e3" - exp_type_department = EXP_TYPE_SERVICES - - - outfit = /datum/outfit/job/graveyard - - access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_AUX_BASE) - minimal_access = list(ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM, ACCESS_AUX_BASE) - paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_CAR - - display_order = JOB_DISPLAY_ORDER_GRAVEYARD - bounty_types = CIV_JOB_MINE - - v_duty = "A vile curse has gripped the dead of this city. You must keep the graveyard clean and the Masquerade intact." - minimal_masquerade = 0 - allowed_species = list("Vampire", "Ghoul", "Kuei-Jin") - allowed_bloodlines = list("True Brujah", "Daughters of Cacophony", "Salubri", "Baali", "Brujah", "Tremere", "Ventrue", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Giovanni", "Ministry", "Tzimisce", "Lasombra", "Caitiff", "Cappadocian") - -/datum/outfit/job/graveyard - name = "Graveyard Keeper" - jobtype = /datum/job/vamp/graveyard - - id = /obj/item/card/id/graveyard - shoes = /obj/item/clothing/shoes/vampire/jackboots -// gloves = /obj/item/clothing/gloves/color/black - uniform = /obj/item/clothing/under/vampire/graveyard - suit = /obj/item/clothing/suit/vampire/trench - glasses = /obj/item/clothing/glasses/vampire/yellow - gloves = /obj/item/clothing/gloves/vampire/work - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/vamp/keys/graveyard - r_hand = /obj/item/shovel/vamp - backpack_contents = list(/obj/item/passport=1, /obj/item/cockclock=1, /obj/item/flashlight=1, /obj/item/card/credit=1, /obj/item/scythe/vamp=1) - - backpack = /obj/item/storage/backpack - satchel = /obj/item/storage/backpack/satchel - duffelbag = /obj/item/storage/backpack/duffelbag - -/obj/effect/landmark/start/graveyardkeeper - name = "Graveyard Keeper" - icon_state = "Graveyard Keeper" diff --git a/modular_darkpack/modules/jobs/code/hound.dm b/modular_darkpack/modules/jobs/code/hound.dm deleted file mode 100644 index 42587ceedb3a..000000000000 --- a/modular_darkpack/modules/jobs/code/hound.dm +++ /dev/null @@ -1,58 +0,0 @@ - -/datum/job/vamp/hound - title = "Hound" - auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY - department_head = list("Prince") - faction = "Vampire" - total_positions = 7 - spawn_positions = 7 - supervisors = "the Sheriff" - selection_color = "#bd3327" - minimal_player_age = 7 - exp_requirements = 300 - exp_type = EXP_TYPE_CREW - - outfit = /datum/outfit/job/hound - - access = list(ACCESS_MAINT_TUNNELS, ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MECH_SECURITY, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MECH_SECURITY, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access() - paycheck = PAYCHECK_HARD - paycheck_department = ACCOUNT_SEC - - mind_traits = list(TRAIT_DONUT_LOVER) - liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) - - display_order = JOB_DISPLAY_ORDER_HOUND - bounty_types = CIV_JOB_SEC - known_contacts = list("Prince", "Sheriff") - - v_duty = "You are the Prince's enforcer. You report to the Sheriff and uphold the Traditions." - minimal_masquerade = 4 - allowed_bloodlines = list("True Brujah", "Daughters of Cacophony", "Brujah", "Tremere", "Ventrue", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Giovanni", "Ministry", "Lasombra", "Gargoyle", "Kiasyd", "Cappadocian") - -/datum/outfit/job/hound - name = "Hound" - jobtype = /datum/job/vamp/hound - - ears = /obj/item/p25radio - id = /obj/item/card/id/camarilla - uniform = /obj/item/clothing/under/vampire/hound - gloves = /obj/item/clothing/gloves/vampire/work - suit = /obj/item/clothing/suit/vampire/trench - shoes = /obj/item/clothing/shoes/vampire - r_pocket = /obj/item/vamp/keys/camarilla - l_pocket = /obj/item/vamp/phone/camarilla - backpack_contents = list(/obj/item/passport=1, /obj/item/cockclock=1, /obj/item/vampire_stake=3, /obj/item/flashlight=1, /obj/item/masquerade_contract=1, /obj/item/vamp/keys/hack=1, /obj/item/card/credit=1) - - backpack = /obj/item/storage/backpack - satchel = /obj/item/storage/backpack/satchel - duffelbag = /obj/item/storage/backpack/duffelbag - - implants = list(/obj/item/implant/mindshield) - -/datum/outfit/job/hound/pre_equip(mob/living/carbon/human/H) - ..() - -/obj/effect/landmark/start/hound - name = "Hound" - icon_state = "Hound" diff --git a/modular_darkpack/modules/jobs/code/hunter.dm b/modular_darkpack/modules/jobs/code/hunter.dm deleted file mode 100644 index 13f5c2ed69bc..000000000000 --- a/modular_darkpack/modules/jobs/code/hunter.dm +++ /dev/null @@ -1,99 +0,0 @@ -/datum/outfit/job/hunter - name = "Hunter" - uniform = /obj/item/clothing/under/vampire/graveyard - r_pocket = /obj/item/flashlight - id = /obj/item/card/id/hunter - shoes = /obj/item/clothing/shoes/vampire/jackboots - l_pocket = /obj/item/vamp/keys/church - backpack_contents = list( - /obj/item/storage/book/bible = 1, - /obj/item/vampire_stake = 3, - /obj/item/molotov = 1, - /obj/item/gas_can/full = 1, - /obj/item/vamp/keys/hack=1 - ) - -/datum/outfit/job/hunter/post_equip(mob/living/carbon/human/H) - ..() - H.set_species(/datum/species/human) - H.set_clan(null) - H.generation = 13 - var/my_name = "Tyler" - if(H.gender == MALE) - my_name = pick(GLOB.first_names_male) - else - my_name = pick(GLOB.first_names_female) - var/my_surname = pick(GLOB.last_names) - H.fully_replace_character_name(null,"[my_name] [my_surname]") - for(var/datum/action/A in H.actions) - if(A.vampiric) - A.Remove(H) - H.thaumaturgy_knowledge = FALSE - var/obj/item/organ/eyes/NV = new() - NV.Insert(H, TRUE, FALSE) - if(H.mind) - H.mind.add_antag_datum(/datum/antagonist/hunter) - - var/list/landmarkslist = list() - for(var/obj/effect/landmark/start/S in GLOB.start_landmarks_list) - if(S.name == name) - landmarkslist += S - var/obj/effect/landmark/start/D = pick(landmarkslist) - H.forceMove(D.loc) - - var/list/loadouts = list("Fire Fighter", "EOD Suit", "Holy Presence") - spawn() - var/loadout_type = input(H, "Choose the Lord's gift for you:", "Loadout") as anything in loadouts - switch(loadout_type) - if("Fire Master") - H.equip_to_slot_or_del(new /obj/item/clothing/head/vampire/helmet(H), ITEM_SLOT_HEAD) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/vampire/vest(H), ITEM_SLOT_OCLOTHING) - H.put_in_r_hand(new /obj/item/vampire_flamethrower(H)) - H.put_in_l_hand(new /obj/item/fireaxe/vamp(H)) - if("EOD Suit") - H.equip_to_slot_or_del(new /obj/item/clothing/suit/vampire/eod(H), ITEM_SLOT_OCLOTHING) - H.equip_to_slot_or_del(new /obj/item/clothing/head/vampire/eod(H), ITEM_SLOT_HEAD) - H.put_in_r_hand(new /obj/item/gun/ballistic/shotgun/vampire(H)) - H.put_in_l_hand(new /obj/item/ammo_box/vampire/c12g(H)) - if("Holy Presence") - H.equip_to_slot_or_del(new /obj/item/clothing/suit/vampire/vest/army(H), ITEM_SLOT_OCLOTHING) - H.put_in_r_hand(new /obj/item/chainsaw/vamp(H)) - H.resistant_to_disciplines = TRUE - to_chat(H, "<b>You are no longer vulnerable to vampire blood powers...</b>") - -/obj/effect/landmark/start/hunter - name = "Hunter" - delete_after_roundstart = FALSE - -/datum/antagonist/hunter - name = "Hunter" - roundend_category = "hunters" - antagpanel_category = "Hunter" - job_rank = ROLE_OPERATIVE - antag_hud_type = ANTAG_HUD_OPS - antag_hud_name = "synd" - antag_moodlet = /datum/mood_event/focused - show_to_ghosts = TRUE - -/datum/antagonist/hunter/on_gain() - owner.holy_role = HOLY_ROLE_PRIEST - add_antag_hud(ANTAG_HUD_OPS, "synd", owner.current) - owner.special_role = src - var/datum/objective/custom/custom_objective = new - custom_objective.owner = owner - custom_objective.explanation_text = "Exterminate all evil spirits in the city. Let the Hunt begin!" - objectives += custom_objective - var/datum/objective/martyr/die_objective = new - die_objective.owner = owner - objectives += die_objective - owner.current.playsound_local(get_turf(owner.current), 'modular_darkpack/modules/deprecated/sounds/orthodox_start.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) - return ..() - -/datum/antagonist/hunter/on_removal() - ..() - to_chat(owner.current,span_userdanger("You are no longer the Hunter!")) - owner.special_role = null - -/datum/antagonist/hunter/greet() - to_chat(owner.current, span_alertsyndie("You are the Hunter.")) - owner.announce_objectives() diff --git a/modular_darkpack/modules/jobs/code/janitor.dm b/modular_darkpack/modules/jobs/code/janitor.dm deleted file mode 100644 index 54b9d6d402c0..000000000000 --- a/modular_darkpack/modules/jobs/code/janitor.dm +++ /dev/null @@ -1,41 +0,0 @@ - -/datum/job/vamp/vjanitor - title = "Street Janitor" - department_head = list("Prince") - faction = "Vampire" - total_positions = 6 - spawn_positions = 6 - supervisors = "the Camarilla." - selection_color = "#e3e3e3" - - outfit = /datum/outfit/job/vjanitor - - access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - - allowed_species = list("Vampire", "Ghoul", "Human") - - display_order = JOB_DISPLAY_ORDER_STREETJAN - allowed_bloodlines = list("True Brujah", "Daughters of Cacophony", "Salubri", "Baali", "Brujah", "Tremere", "Ventrue", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Giovanni", "Ministry", "Tzimisce", "Lasombra", "Caitiff") - - v_duty = "Clean up all traces of Masquerade violations as the Camarilla has instructed you to." - duty = "Keep the streets clean. You are paid to keep your mouth shut about the things you see." - minimal_masquerade = 0 - -/datum/outfit/job/vjanitor - name = "Street Janitor" - jobtype = /datum/job/vamp/vjanitor - - id = /obj/item/card/id/cleaning - uniform = /obj/item/clothing/under/vampire/janitor - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/vamp/keys/cleaning - shoes = /obj/item/clothing/shoes/vampire/jackboots/work - gloves = /obj/item/clothing/gloves/vampire/cleaning - backpack_contents = list(/obj/item/passport=1, /obj/item/cockclock=1, /obj/item/flashlight=1, /obj/item/vamp/keys/hack=1, /obj/item/card/credit=1) - -/obj/effect/landmark/start/vjanitor - name = "Street Janitor" - icon_state = "Street Janitor" diff --git a/modular_darkpack/modules/jobs/code/job_items.dm b/modular_darkpack/modules/jobs/code/job_items.dm new file mode 100644 index 000000000000..58d0f9974f1d --- /dev/null +++ b/modular_darkpack/modules/jobs/code/job_items.dm @@ -0,0 +1,365 @@ + +/obj/item/card/prince + name = "leader badge" + desc = "King in the castle!" + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "prince_id" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + +/obj/item/card/sheriff + name = "head security badge" + desc = "A badge which shows honour and dedication." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "head_sec_badge" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + +/obj/item/card/camarilla + name = "security badge" + desc = "A badge which shows honour and dedication." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "sec_badge" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + +/obj/item/card/clerk + name = "clerk badge" + desc = "A badge which shows buerocracy qualification." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "red_id" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "red_id" + +/obj/item/card/clerk/harpy + name = "public relations manager badge" + desc = "A badge which denotes the wearer as a PR Manager of Transamerica." + +/obj/item/card/tower_employee + name = "Millenium Tower Employee ID" + desc = "An ID showing employment with the Millenium Tower - Maybe they give you free donuts." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "green_id" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "green_id" + +/obj/item/card/bruiser + name = "bruiser badge" + desc = "A badge which shows grit." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "bruiser_badge" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "bruiser_badge" + +/obj/item/card/sweeper + name = "sweeper badge" + desc = "A badge which shows perspective." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "sweeper_badge" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "sweeper_badge" + +/obj/item/card/emissary + name = "emissary badge" + desc = "A badge which shows a favored voice, interlaced with gold thread." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "emissary_badge" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "emissary_badge" + +/obj/item/card/baron + name = "eagle badge" + desc = "The badge of a leader. The eagle stands proud, surrounded by the gold of their nest." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "eagle_badge" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "eagle_badge" + +/obj/item/card/tapster + name = "bartender badge" + desc = "A badge displaying a beverage glass." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "tapster_badge" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + ONFLOOR_ICONSTATE_HELPER("brusier_badge") + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "bruiser_badge" + +/obj/item/card/clinic + name = "medical badge" + desc = "A badge which shows medical qualification." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "green_id" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + +/obj/item/card/clinic/director + name = "clinic director's badge" + desc = "A badge which shows not only medical qualification, but also an authority over the clinic." + +/obj/item/card/archive + name = "scholar badge" + desc = "A badge which shows a love of culture." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "grey_id" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + +/obj/item/card/regent + name = "erudite scholar badge" + desc = "A badge which shows a deep understanding of culture." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "regent_id" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + ONFLOOR_ICONSTATE_HELPER("grey_id") + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + +/obj/item/card/cleaning + name = "janitor badge" + desc = "A badge which shows cleaning employment." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "blue_card" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "blue_card" + +/obj/item/card/graveyard + name = "keeper badge" + desc = "A badge which shows graveyard employment." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "blue_card" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + +/obj/item/card/dealer + name = "business badge" + desc = "A badge which shows business." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "red_card" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + +/obj/item/card/supplytech + name = "technician badge" + desc = "A badge which shows supply employment." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "supply_badge" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "head_sec_badge" + +/obj/item/card/hunter + name = "cross" + desc = "When you come into the land that the Lord your God is giving you, you must not learn to imitate the abhorrent practices of those nations. No one shall be found among you who makes a son or daughter pass through fire, or who practices divination, or is a soothsayer, or an augur, or a sorcerer, or one who casts spells, or who consults ghosts or spirits, or who seeks oracles from the dead. For whoever does these things is abhorrent to the Lord; it is because of such abhorrent practices that the Lord your God is driving them out before you (Deuteronomy 18:9-12)." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "hunter_badge" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + COOLDOWN_DECLARE(detonation_timer) + +/obj/item/card/hunter/attack_self(mob/user) + . = ..() + if(!COOLDOWN_FINISHED(src, detonation_timer)) + return + if(!user.mind) + return + if(user.mind.holy_role != HOLY_ROLE_PRIEST) + return + COOLDOWN_START(src, detonation_timer, 30 SECONDS) + do_sparks(rand(5, 9), FALSE, user) + playsound(user.loc, 'modular_darkpack/modules/jobs/sounds/cross.ogg', 100, FALSE, 8, 0.9) + for(var/mob/living/M in get_hearers_in_view(4, src)) + bang(get_turf(src), M, user) + +/obj/item/card/hunter/proc/bang(turf/turf, mob/living/living_mob, mob/living/user) + if(living_mob.stat == DEAD) //They're dead! + return + living_mob.show_message(span_warning(span_bold("GOD SEES YOU!")), MSG_AUDIBLE) + + if(HAS_TRAIT(living_mob, TRAIT_REPELLED_BY_HOLINESS)) + living_mob.emote("scream") + living_mob.pointed(user) + + var/distance = max(0, get_dist(get_turf(src), turf)) + if(living_mob.flash_act(affect_silicon = 1)) + living_mob.Paralyze(max(10/max(1, distance), 5)) + living_mob.Knockdown(max(100/max(1, distance), 40)) + +/obj/item/card/hunter/attack(mob/living/target, mob/living/user) + . = ..() + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + return + if(!COOLDOWN_FINISHED(src, detonation_timer)) + return + if(HAS_TRAIT(target, TRAIT_REPELLED_BY_HOLINESS)) + COOLDOWN_START(src, detonation_timer, 30 SECONDS) + lightningbolt(target) + to_chat(target, span_userdanger("The gods have punished you for your sins!")) + + +// POLICE +/obj/item/card/police + name = "police officer badge" + desc = "Sponsored by the Government." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "police_badge" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "police_badge" + +/obj/item/card/government + name = "emergency dispatcher badge" + desc = "Sponsored by the Government." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "red_id" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "red_id" + +/obj/item/card/police/sergeant + name = "police sergeant badge" + desc = "Sponsored by the Government. This one seems slightly more worn down than all the others." + +/obj/item/card/police/chief + name = "police chief badge" + desc = "Sponsored by the Government. This one has a chrome plated finish." + +/obj/item/card/police/fbi + name = "fbi special agent badge" + desc = "Sponsored by the Government. This one has all the bells and whistles." + + +// CULTISTS +/obj/item/card/bahari + name = "cultist badge" + desc = "This shows your devotion to the dark mother." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "id14" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "police_badge" + +/obj/item/card/noddist + name = "cultist badge" + desc = "This shows your devotion to the dark father." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "id15" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "police_badge" + +//TZIMISCE ROLES +/obj/item/card/voivode + name = "ancient badge" + desc = "You have to wear this filthy thing to be recognized." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "id12" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "head_sec_badge" + +/obj/item/card/bogatyr + name = "dusty badge" + desc = "You have to wear this because the Voivode wants you to." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "id12" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "head_sec_badge" + +// PRIMOGEN STUFF +/obj/item/card/primogen + name = "mysterious primogen badge" + desc = "Sponsored by the Shadow Government." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "id12" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "head_sec_badge" + +/obj/item/card/whip + name = "primogen's whip badge" + desc = "This badge shows your servitude to an important person." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "onyx_badge" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "onyx_badge" + +/obj/item/card/steward + name = "primogen's steward badge" + desc = "This badge shows you're very good at taking care of someone else's property." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "emerald_badge" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "emerald_badge" + +/obj/item/card/myrmidon + name = "primogen's myrmidon badge" + desc = "A badge which shows you're responsible enough to protect someone important but not responsible enough to protect the most important." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "ruby_badge" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "ruby_badge" + +/obj/item/card/park_ranger + name = "Park Ranger badge" + desc = "Only you can prevent forest fires." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "grey_id" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "grey_id" + +/obj/item/card/park_ranger/oversight + name = "NPS Oversight Committee badge" + desc = "You have been out in the woods to know that you arent afraid of anything but one specific topic out there. Leadership." + +/obj/item/card/park_ranger/leader + name = "Lead Park Ranger badge" + desc = "These are your woods and your lands. Keep them safe." + +/obj/item/card/park_ranger/guide + name = "Park Guide badge" + desc = "Remember, Dire Wolves arent real, as far as you tell people." + +/obj/item/card/park_ranger/biologist + name = "NPS Biologist badge" + desc = "You love the outdoors? Good, you are now taking care of a wide outdoors area." + +/obj/item/card/pentex + name = "\improper " + MAIN_EVIL_COMPANY + " employee badge" + desc = "Congratulations, wagie." + icon = 'modular_darkpack/modules/jobs/icons/id_items.dmi' + icon_state = "green_id" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/jobs/icons/id_onfloors.dmi') + worn_icon = 'modular_darkpack/modules/jobs/icons/id_worn.dmi' + worn_icon_state = "green_id" + +/obj/item/card/pentex/branch_lead + name = "\improper " + MAIN_EVIL_COMPANY + " Branch Lead badge" + desc = "How bad can I be?" + +/obj/item/card/pentex/executive + name = "\improper " + MAIN_EVIL_COMPANY + " Executive card" + desc = "All the customers are buying." + +/obj/item/card/pentex/affairs + name = "\improper " + MAIN_EVIL_COMPANY + " Internal Affairs card" + desc = "And the Lawyers are denying." + +/obj/item/card/pentex/secchief + name = "\improper " + MAIN_EVIL_COMPANY + " Chief of Security badge" + desc = "Its not illegal if nobody finds out about it. Now if only " + MAIN_EVIL_COMPANY + " would pay for a single tank for you." + +/obj/item/card/pentex/sec + name = "\improper " + MAIN_EVIL_COMPANY + " Security Agent badge" + desc = "Corporate Security, a step above a mall cop. Better paid than a real cop." diff --git a/modular_darkpack/modules/jobs/code/jobs.dm b/modular_darkpack/modules/jobs/code/jobs.dm deleted file mode 100644 index 6fef8203d786..000000000000 --- a/modular_darkpack/modules/jobs/code/jobs.dm +++ /dev/null @@ -1,453 +0,0 @@ -//ID - -/obj/item/card/id/prince/click_alt(mob/user) - return - -/obj/item/card/id/sheriff/click_alt(mob/user) - return - -/obj/item/card/id/camarilla/click_alt(mob/user) - return - -/obj/item/card/id/clerk/click_alt(mob/user) - return - -/obj/item/card/id/anarch/click_alt(mob/user) - return - -/obj/item/card/id/clinic/click_alt(mob/user) - return - -/obj/item/card/id/archive/click_alt(mob/user) - return - -/obj/item/card/id/cleaning/click_alt(mob/user) - return - -/obj/item/card/id/dealer/click_alt(mob/user) - return - -/obj/item/card/id/supplytech/click_alt(mob/user) - return - -/obj/item/card/id/hunter/click_alt(mob/user) - return - -/obj/item/card/id/primogen/click_alt(mob/user) - return - -/obj/item/card/id/police/click_alt(mob/user) - return - -/obj/item/card/id/hunter - var/last_detonated = 0 - -/obj/item/card/id/hunter/attack_self(mob/user) - . = ..() - if(last_detonated+300 > world.time) - return - if(!user.mind) - return - if(user.mind.holy_role != HOLY_ROLE_PRIEST) - return - last_detonated = world.time - do_sparks(rand(5, 9), FALSE, user) - playsound(user.loc, 'modular_darkpack/modules/deprecated/sounds/cross.ogg', 100, FALSE, 8, 0.9) - for(var/mob/living/M in get_hearers_in_view(4, user.loc)) - bang(get_turf(M), M, user) - -/obj/item/card/id/hunter/proc/bang(turf/T, mob/living/M, mob/living/user) - if(M.stat == DEAD) //They're dead! - return - var/mob/living/carbon/human/H - if(ishuman(M)) - H = M - if(H) - for(var/obj/item/card/id/hunter/HUNT in H.contents) - if(H.mind) - if(H.mind.holy_role == HOLY_ROLE_PRIEST) - return - if (HAS_TRAIT(H, TRAIT_REPELLED_BY_HOLINESS)) - H.emote("scream") - H.pointed(user) - M.show_message(span_warning("<b>GOD SEES YOU!</b>"), MSG_AUDIBLE) - var/distance = max(0,get_dist(get_turf(src),T)) - - if(M.flash_act(affect_silicon = 1)) - M.Immobilize(max(10/max(1,distance), 5)) - -/obj/item/card/id/hunter/attack(mob/living/target, mob/living/user) - . = ..() - if(HAS_TRAIT(user, TRAIT_PACIFISM)) - return - if(last_detonated+300 > world.time) - return - if(iskindred(target)) - var/mob/living/carbon/human/H = target - if (HAS_TRAIT(H, TRAIT_REPELLED_BY_HOLINESS)) - last_detonated = world.time - var/turf/lightning_source = get_step(get_step(H, NORTH), NORTH) - lightning_source.Beam(H, icon_state="lightning[rand(1,12)]", time = 5) - H.adjustFireLoss(100) - H.electrocution_animation(50) - to_chat(H, span_userdanger("The God has punished you for your sins!"), confidential = TRUE) - -/obj/item/card/id/prince - name = "leader badge" - id_type_name = "leader badge" - desc = "King in the castle!" - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id6" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id6" - -/obj/item/card/id/sheriff - name = "head security badge" - id_type_name = "head security badge" - desc = "A badge which shows honour and dedication." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id4" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id4" - -/obj/item/card/id/camarilla - name = "security badge" - id_type_name = "security badge" - desc = "A badge which shows honour and dedication." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id3" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id3" - -/obj/item/card/id/clerk - name = "clerk badge" - id_type_name = "clerk badge" - desc = "A badge which shows buerocracy qualification." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id1" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id1" - -/obj/item/card/id/bruiser - name = "bruiser badge" - id_type_name = "bruiser badge" - desc = "A badge which shows grit." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "bruiser_badge" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "bruiser_badge" - -/obj/item/card/id/sweeper - name = "sweeper badge" - id_type_name = "sweeper badge" - desc = "A badge which shows perspective." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "sweeper_badge" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "sweeper_badge" - -/obj/item/card/id/emissary - name = "emissary badge" - id_type_name = "emissary badge" - desc = "A badge which shows a favored voice, interlaced with gold thread." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "emissary_badge" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "emissary_badge" - -/obj/item/card/id/baron - name = "eagle badge" - id_type_name = "eagle badge" - desc = "The badge of a leader. The eagle stands proud, surrounded by the gold of their nest." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "eagle_badge" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "eagle_badge" - -/obj/item/card/id/clinic - name = "medical badge" - id_type_name = "medical badge" - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY) - desc = "A badge which shows medical qualification." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id2" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id2" - -/obj/item/card/id/clinic/director - name = "clinic director's badge" - desc = "A badge which shows not only medical qualification, but also an authority over the clinic." - -/obj/item/card/id/archive - name = "scholar badge" - id_type_name = "scholar badge" - desc = "A badge which shows a love of culture." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id7" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id7" - -/obj/item/card/id/regent - name = "erudite scholar badge" - id_type_name = "erudite scholar badge" - desc = "A badge which shows a deep understanding of culture." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id7_regent" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id7_regent" - -/obj/item/card/id/cleaning - name = "janitor badge" - id_type_name = "janitor badge" - desc = "A badge which shows cleaning employment." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id8" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id8" - -/obj/item/card/id/graveyard - name = "keeper badge" - id_type_name = "keeper badge" - desc = "A badge which shows graveyard employment." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id8" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id8" - -/obj/item/card/id/dealer - name = "business badge" - id_type_name = "business badge" - desc = "A badge which shows business." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id9" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id9" - -/obj/item/card/id/supplytech - name = "technician badge" - id_type_name = "technician badge" - desc = "A badge which shows supply employment." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id10" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id10" - -/obj/item/card/id/hunter - name = "cross" - id_type_name = "cross" - desc = "When you come into the land that the Lord your God is giving you, you must not learn to imitate the abhorrent practices of those nations. No one shall be found among you who makes a son or daughter pass through fire, or who practices divination, or is a soothsayer, or an augur, or a sorcerer, or one who casts spells, or who consults ghosts or spirits, or who seeks oracles from the dead. For whoever does these things is abhorrent to the Lord; it is because of such abhorrent practices that the Lord your God is driving them out before you (Deuteronomy 18:9-12)." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id11" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id11" - -/obj/item/card/id/primogen - name = "mysterious primogen badge" - id_type_name = "mysterious primogen badge" - desc = "Sponsored by the Shadow Government." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id12" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id12" - -/obj/item/card/id/police - name = "police officer badge" - id_type_name = "police officer badge" - desc = "Sponsored by the Government." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id13" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id13" - -/obj/item/card/id/government - name = "emergency dispatcher badge" - id_type_name = "emergency dispatcher badge" - desc = "Sponsored by the Government." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id1" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id1" - -/obj/item/card/id/police/sergeant - name = "police sergeant badge" - desc = "Sponsored by the Government. This one seems slightly more worn down than all the others." - -/obj/item/card/id/police/chief - name = "police chief badge" - desc = "Sponsored by the Government. This one has a chrome plated finish." - -/obj/item/card/id/police/fbi - name = "fbi special agent badge" - desc = "Sponsored by the Government. This one has all the bells and whistles." - -/obj/item/card/id/voivode - name = "ancient badge" - id_type_name ="ancient badge" - desc = "You have to wear this filthy thing to be recognized." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id12" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id12" - -/obj/item/card/id/bogatyr - name = "dusty badge" - id_type_name ="dusty badge" - desc = "You have to wear this because the Voivode wants you to." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id12" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id12" - - -/obj/item/card/id/bahari - name = "cultist badge" - id_type_name = "cultist badge" - desc = "This shows your devotion to the dark mother." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id14" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id14" - -/obj/item/card/id/noddist - name = "cultist badge" - id_type_name = "cultist badge" - desc = "This shows your devotion to the dark father." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id15" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id15" - -//TZIMISCE ROLES - -// PRIMOGEN STAFF (Distributed in game by Primogen) - -/obj/item/card/id/whip - name = "primogen's whip badge" - id_type_name = "whip badge" - desc = "This badge shows your servitude to an important person." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "onyxBadge" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "onyxBadge" - -/obj/item/card/id/steward - name = "primogen's steward badge" - id_type_name = "steward badge" - desc = "This badge shows you're very good at taking care of someone else's property." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "emeraldBadge" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "emeraldBadge" - -/obj/item/card/id/myrmidon - name = "primogen's myrmidon badge" - id_type_name = "myrmidon badge" - desc = "A badge which shows you're responsible enough to protect someone important but not responsible enough to protect the most important." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "rubyBadge" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "rubyBadge" diff --git a/modular_darkpack/modules/jobs/code/landmarks.dm b/modular_darkpack/modules/jobs/code/landmarks.dm new file mode 100644 index 000000000000..a6a8dce85547 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/landmarks.dm @@ -0,0 +1,143 @@ +#define JOB_START_HELPER(job_type, job_name) \ + /obj/effect/landmark/start/darkpack/##job_type { \ + name = ##job_name; \ + icon_state = ##job_name; \ + } + +/obj/effect/landmark/start/darkpack + name = "generic darkpack start" + desc = "Var-edit me if you're an idiot who doesn't like making subtypes!" + icon = 'modular_darkpack/modules/jobs/icons/landmarks.dmi' + +/* Anarchs */ +/obj/effect/landmark/start/darkpack/anarch + name = "generic anarch start" + +JOB_START_HELPER(anarch/baron, JOB_BARON) +JOB_START_HELPER(anarch/bruiser, JOB_BRUISER) +JOB_START_HELPER(anarch/emissary, JOB_EMISSARY) +JOB_START_HELPER(anarch/sweeper, JOB_SWEEPER) +JOB_START_HELPER(anarch/tapster, JOB_TAPSTER) + +/* Axe Gang */ +/obj/effect/landmark/start/darkpack/axe + name = "generic axe gang start" + +JOB_START_HELPER(axe/leader, JOB_AXE_LEADER) +JOB_START_HELPER(axe/gang, JOB_AXE_GANG) + +/* Supply */ +/obj/effect/landmark/start/darkpack/axe + name = "generic warehouse start" + +JOB_START_HELPER(supply/dealer, JOB_DEALER) +JOB_START_HELPER(supply/tech, JOB_SUPPLY_TECH) + +/* Camarilla */ +/obj/effect/landmark/start/darkpack/camarilla + name = "generic camarilla start" + +JOB_START_HELPER(camarilla/prince, JOB_PRINCE) +JOB_START_HELPER(camarilla/clerk, JOB_SENESCHAL) +JOB_START_HELPER(camarilla/sheriff, JOB_SHERIFF) +JOB_START_HELPER(camarilla/hound, JOB_HOUND) +JOB_START_HELPER(camarilla/harpy, JOB_HARPY) +JOB_START_HELPER(camarilla/towerwork, JOB_TOWERWORK) + +/* Primogen Council */ +/obj/effect/landmark/start/darkpack/primogen + name = "generic primogen start" + +JOB_START_HELPER(primogen/toreador, JOB_PRIMOGEN_TOREADOR) +JOB_START_HELPER(primogen/banu, JOB_PRIMOGEN_BANU_HAQIM) +JOB_START_HELPER(primogen/lasombra, JOB_PRIMOGEN_LASOMBRA) +JOB_START_HELPER(primogen/malkavian, JOB_PRIMOGEN_MALKAVIAN) +JOB_START_HELPER(primogen/nosferatu, JOB_PRIMOGEN_NOSFERATU) +JOB_START_HELPER(primogen/ventrue, JOB_PRIMOGEN_VENTRUE) + +/* Hospital */ +/obj/effect/landmark/start/darkpack/hospital + name = "generic hospital start" + +JOB_START_HELPER(hospital/clinic_director, JOB_CLINIC_DIRECTOR) +JOB_START_HELPER(hospital/doctor, JOB_DOCTOR) + +/* Government & Police */ +/obj/effect/landmark/start/darkpack/law_enforcement + name = "generic police start" + +JOB_START_HELPER(law_enforcement/national_guard, JOB_NATIONAL_GUARD) +JOB_START_HELPER(law_enforcement/swat, JOB_POLICE_SWAT) +JOB_START_HELPER(law_enforcement/chief, JOB_POLICE_CHIEF) +JOB_START_HELPER(law_enforcement/sergeant, JOB_POLICE_SERGEANT) +JOB_START_HELPER(law_enforcement/officer, JOB_POLICE_OFFICER) +JOB_START_HELPER(law_enforcement/dispatcher, JOB_EMERGENCY_DISPATCHER) +JOB_START_HELPER(law_enforcement/fbi, JOB_FEDERAL_INVESTIGATOR) + +/* Giovanni */ +/obj/effect/landmark/start/darkpack/hecata + name = "generic hecata start" + +JOB_START_HELPER(hecata/capo, JOB_CAPO) +JOB_START_HELPER(hecata/famiglia, JOB_LA_SQUADRA) +JOB_START_HELPER(hecata/squadra, JOB_LA_FAMIGLIA) + +/* Civilian */ +/obj/effect/landmark/start/darkpack/citizen + name = "generic citizen start" + +JOB_START_HELPER(citizen/citizen, JOB_CITIZEN) +JOB_START_HELPER(citizen/club_worker, JOB_CLUB_WORKER) +JOB_START_HELPER(citizen/janitor, JOB_STREET_JANITOR) +JOB_START_HELPER(citizen/priest, JOB_PRIEST) +JOB_START_HELPER(citizen/taxi, JOB_TAXI_DRIVER) +JOB_START_HELPER(citizen/graveyardkeeper, JOB_GRAVEYARD_KEEPER) + +/* Sabbat */ +/obj/effect/landmark/start/darkpack/sabbat + name = "generic sabbat start" + +JOB_START_HELPER(sabbat/ductus, JOB_SABBAT_DUCTUS) +JOB_START_HELPER(sabbat/pack, JOB_SABBAT_PACK) +JOB_START_HELPER(sabbat/priest, JOB_SABBAT_PRIEST) +JOB_START_HELPER(sabbat/sabbatist, JOB_SABBAT_SABBATIST) + +/* Chantry */ +/obj/effect/landmark/start/darkpack/chantry + name = "generic chantry start" + +JOB_START_HELPER(chantry/regent, JOB_CHANTRY_REGENT) +JOB_START_HELPER(chantry/archivist, JOB_CHANTRY_ARCHIVIST) +JOB_START_HELPER(chantry/gargoyle, JOB_CHANTRY_GARGOYLE) + +/* Forest Wolves */ +/obj/effect/landmark/start/darkpack/forest_wolves + name = "generic dog start" + +JOB_START_HELPER(forest_wolves/council, JOB_GAROU_COUNCIL) +JOB_START_HELPER(forest_wolves/warder, JOB_GAROU_WARDER) +JOB_START_HELPER(forest_wolves/catcher, JOB_GAROU_TRUTHCATCHER) +JOB_START_HELPER(forest_wolves/wyrmfoe, JOB_GAROU_WYRMFOE) +JOB_START_HELPER(forest_wolves/guardian, JOB_GAROU_GUARDIAN) + +/* Pentex */ +/obj/effect/landmark/start/darkpack/pentex + name = "generic evil dog start" + +JOB_START_HELPER(pentex/first_team, JOB_PENTEX_FIRST) +JOB_START_HELPER(pentex/lead, JOB_PENTEX_LEAD) +JOB_START_HELPER(pentex/executive, JOB_PENTEX_EXEC) +JOB_START_HELPER(pentex/affairs, JOB_PENTEX_AFFAIRS) +JOB_START_HELPER(pentex/secchief, JOB_PENTEX_SEC_CHIEF) +JOB_START_HELPER(pentex/sec, JOB_PENTEX_SEC) +JOB_START_HELPER(pentex/employee, JOB_PENTEX_EMPLOYEE) + +/* Voivodate */ +/obj/effect/landmark/start/darkpack/voivode + name = "generic voivodate start" + +JOB_START_HELPER(voivode/voivode, JOB_VOIVODE) +JOB_START_HELPER(voivode/bogatyr, JOB_BOGATYR) +JOB_START_HELPER(voivode/zadruga, JOB_ZADRUGA) + +#undef JOB_START_HELPER diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/citizen.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/citizen.dm new file mode 100644 index 000000000000..9e6b277b5344 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/miscelllaneous/citizen.dm @@ -0,0 +1,20 @@ +/datum/job/vampire/citizen + title = JOB_CITIZEN + description = "Obey the authorities... Or don't. You are up late tonight for one reason or another." + faction = FACTION_CITY + total_positions = -1 + spawn_positions = -1 + outfit = /datum/outfit/job/vampire/citizen + exp_granted_type = EXP_TYPE_KINDRED + config_tag = "CITIZEN" + display_order = JOB_DISPLAY_ORDER_CITIZEN + department_for_prefs = /datum/job_department/citizen + job_flags = CITY_JOB_FLAGS + allowed_species = list(SPECIES_KINDRED, SPECIES_GHOUL, SPECIES_HUMAN) + minimal_masquerade = 0 + +/datum/outfit/job/vampire/citizen + name = JOB_CITIZEN + jobtype = /datum/job/vampire/citizen + l_pocket = /obj/item/smartphone + backpack_contents = list(/obj/item/card/credit) diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/club_worker.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/club_worker.dm new file mode 100644 index 000000000000..f1ece87301fa --- /dev/null +++ b/modular_darkpack/modules/jobs/code/miscelllaneous/club_worker.dm @@ -0,0 +1,27 @@ +/datum/job/vampire/club_worker + title = JOB_CLUB_WORKER + faction = FACTION_CITY + total_positions = 4 + spawn_positions = 4 + supervisors = /datum/job/vampire/primogen_toreador + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/club_worker + config_tag = "CLUB_WORKER" + display_order = JOB_DISPLAY_ORDER_STRIP + exp_required_type_department = EXP_TYPE_CLUB + department_for_prefs = /datum/job_department/strip_club + departments_list = list( + /datum/job_department/strip_club + ) + + allowed_species = list(SPECIES_KINDRED, SPECIES_GHOUL, SPECIES_HUMAN) + + description = "Offer strip club services. Some of your clientele may be... Unusual, but you are either addicted to vampire bites, or bribed to listen little and say even less." + minimal_masquerade = 3 + +/datum/outfit/job/vampire/club_worker + name = "Stripper" + jobtype = /datum/job/vampire/citizen + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/vamp/keys/strip + backpack_contents = list(/obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/graveyard_keeper.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/graveyard_keeper.dm new file mode 100644 index 000000000000..44f58465a529 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/miscelllaneous/graveyard_keeper.dm @@ -0,0 +1,38 @@ +/datum/job/vampire/graveyard + title = JOB_GRAVEYARD_KEEPER + faction = FACTION_CITY + total_positions = 6 + spawn_positions = 6 + supervisors = "the Camarilla or the Anarchs" + exp_required_type_department = EXP_TYPE_SERVICES + config_tag = "GRAVEYARD_KEEPER" + outfit = /datum/outfit/job/vampire/graveyard + job_flags = CITY_JOB_FLAGS + display_order = JOB_DISPLAY_ORDER_GRAVEYARD + department_for_prefs = /datum/job_department/city_services + departments_list = list( + /datum/job_department/city_services, + ) + description = "A vile curse has gripped the dead of this city. You must keep the graveyard clean and the Masquerade intact." + minimal_masquerade = 0 + allowed_species = list(SPECIES_KINDRED, SPECIES_GHOUL) + +/datum/outfit/job/vampire/graveyard + name = "Graveyard Keeper" + jobtype = /datum/job/vampire/graveyard + + id = /obj/item/card/graveyard + shoes = /obj/item/clothing/shoes/vampire/jackboots + gloves = /obj/item/clothing/gloves/color/black + uniform = /obj/item/clothing/under/vampire/graveyard + suit = /obj/item/clothing/suit/vampire/trench + glasses = /obj/item/clothing/glasses/vampire/yellow + gloves = /obj/item/clothing/gloves/vampire/work + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/vamp/keys/graveyard + r_hand = /obj/item/shovel/vamp + backpack_contents = list(/obj/item/card/credit=1, /obj/item/scythe/vamp=1) + + backpack = /obj/item/storage/backpack + satchel = /obj/item/storage/backpack/satchel + duffelbag = /obj/item/storage/backpack/duffelbag diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/janitor.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/janitor.dm new file mode 100644 index 000000000000..4b230579a84f --- /dev/null +++ b/modular_darkpack/modules/jobs/code/miscelllaneous/janitor.dm @@ -0,0 +1,29 @@ +/datum/job/vampire/janitor + title = JOB_STREET_JANITOR + faction = FACTION_CITY + total_positions = 6 + spawn_positions = 6 + supervisors = SUPERVISOR_CAMARILLA + config_tag = "JANITOR" + outfit = /datum/outfit/job/vampire/janitor + job_flags = CITY_JOB_FLAGS + allowed_species = list(SPECIES_KINDRED, SPECIES_GHOUL, SPECIES_HUMAN) + department_for_prefs = /datum/job_department/city_services + departments_list = list( + /datum/job_department/city_services, + ) + display_order = JOB_DISPLAY_ORDER_STREETJAN + description = "Keep the streets clean. You are paid to keep your mouth shut about the things you see." + minimal_masquerade = 0 + +/datum/outfit/job/vampire/janitor + name = "Street Janitor" + jobtype = /datum/job/vampire/janitor + + id = /obj/item/card/cleaning + uniform = /obj/item/clothing/under/vampire/janitor + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/vamp/keys/cleaning + shoes = /obj/item/clothing/shoes/vampire/jackboots/work + gloves = /obj/item/clothing/gloves/vampire/cleaning + backpack_contents = list(/obj/item/vamp/keys/hack=1, /obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/priest.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/priest.dm new file mode 100644 index 000000000000..a1b4ab6aafe5 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/miscelllaneous/priest.dm @@ -0,0 +1,30 @@ +/datum/job/vampire/priest + title = JOB_PRIEST + faction = FACTION_CITY + total_positions = 2 + spawn_positions = 2 + supervisors = "God" + config_tag = "PRIEST" + outfit = /datum/outfit/job/vampire/priest + job_flags = CITY_JOB_FLAGS + display_order = JOB_DISPLAY_ORDER_PRIEST + exp_required_type_department = EXP_TYPE_CHURCH + department_for_prefs = /datum/job_department/church + departments_list = list( + /datum/job_department/church, + ) + allowed_species = list(SPECIES_HUMAN) + description = "Be the shepherd of the flock in " + CITY_NAME + ", lead them to salvation, piety and righteousness." + +/datum/outfit/job/vampire/priest + name = "Priest" + jobtype = /datum/job/vampire/priest + + uniform = /obj/item/clothing/under/vampire/graveyard + shoes = /obj/item/clothing/shoes/vampire/jackboots + id = /obj/item/card/hunter + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/flashlight + l_hand = /obj/item/vamp/keys/church + back = /obj/item/storage/backpack/satchel + backpack_contents = list(/obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/taxi.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/taxi.dm new file mode 100644 index 000000000000..8bbf4551d2ed --- /dev/null +++ b/modular_darkpack/modules/jobs/code/miscelllaneous/taxi.dm @@ -0,0 +1,30 @@ +/datum/job/vampire/taxi + title = JOB_TAXI_DRIVER + faction = FACTION_CITY + total_positions = 3 + spawn_positions = 3 + supervisors = SUPERVISOR_TRADITIONS + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/taxi + config_tag = "TAXI_DRIVER" + display_order = JOB_DISPLAY_ORDER_TAXI + exp_required_type_department = EXP_TYPE_SERVICES + department_for_prefs = /datum/job_department/city_services + departments_list = list( + /datum/job_department/city_services, + ) + allowed_species = list(SPECIES_KINDRED, SPECIES_GHOUL, SPECIES_HUMAN) + + description = "Drive people in the city." + minimal_masquerade = 0 + +/datum/outfit/job/vampire/taxi + name = "Taxi Driver" + jobtype = /datum/job/vampire/taxi + + glasses = /obj/item/clothing/glasses/vampire/sun + uniform = /obj/item/clothing/under/vampire/suit + shoes = /obj/item/clothing/shoes/vampire + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/vamp/keys/taxi + backpack_contents = list(/obj/item/card/credit=1, /obj/item/melee/vamp/tire=1) diff --git a/modular_darkpack/modules/jobs/code/national_guard.dm b/modular_darkpack/modules/jobs/code/national_guard.dm deleted file mode 100644 index 1b11aac1e95d..000000000000 --- a/modular_darkpack/modules/jobs/code/national_guard.dm +++ /dev/null @@ -1,385 +0,0 @@ -/datum/outfit/job/national_guard - name = "National Guard Soldier" - ears = /obj/item/p25radio/police/government - uniform = /obj/item/clothing/under/vampire/military_fatigues - mask = /obj/item/clothing/mask/vampire/balaclava - r_pocket = /obj/item/flashlight - l_pocket = /obj/item/ammo_box/magazine/darkpackaug - shoes = /obj/item/clothing/shoes/vampire/jackboots - belt = /obj/item/gun/ballistic/automatic/darkpack/aug - suit = /obj/item/clothing/suit/vampire/vest/army - head = /obj/item/clothing/head/vampire/army - backpack_contents = list( - /obj/item/ammo_box/magazine/darkpackaug = 3, - /obj/item/radio/military = 1, - /obj/item/gun/ballistic/automatic/pistol/darkpack/beretta=1 - ) - -/datum/antagonist/national_guard/proc/equip_national_guard() - var/mob/living/carbon/human/H = owner.current - if(!ishuman(owner.current)) - return - H.equipOutfit(national_guard_outfit) - H.set_species(/datum/species/human) - H.set_clan(null) - H.generation = 13 - H.ignores_warrant = TRUE - - for(var/datum/action/A in H.actions) - if(A.vampiric) - A.Remove(H) - H.thaumaturgy_knowledge = FALSE - var/obj/item/organ/eyes/NV = new() - NV.Insert(H, TRUE, FALSE) - - var/list/landmarkslist = list() - for(var/obj/effect/landmark/start/S in GLOB.start_landmarks_list) - if(S.name == name) - landmarkslist += S - var/obj/effect/landmark/start/D = pick(landmarkslist) - H.forceMove(D.loc) - -/datum/antagonist/national_guard/proc/offer_loadout() - var/list/loadouts = list( - "Flamethrower", - "EOD", - "Medic", - "Sniper", - "Ammo Carrier" - ) - var/loadout_type = input(owner.current, "Choose your loadout:", "Loadout Selection") in loadouts - switch(loadout_type) - if("Flamethrower") - owner.current.put_in_r_hand(new /obj/item/vampire_flamethrower(owner.current)) - owner.current.put_in_l_hand(new /obj/item/gas_can/full(owner.current)) - if("EOD") - owner.current.put_in_r_hand(new /obj/item/clothing/suit/vampire/eod(owner.current)) - owner.current.put_in_l_hand(new /obj/item/clothing/head/vampire/eod(owner.current)) - if("Medic") - owner.current.put_in_r_hand(new /obj/item/storage/medkit/darkpack/combat(owner.current)) - if("Sniper") - owner.current.put_in_r_hand(new /obj/item/gun/ballistic/automatic/darkpack/sniper(owner.current)) - owner.current.put_in_l_hand(new /obj/item/ammo_box/vampire/c556(owner.current)) - if("Ammo Carrier") - owner.current.put_in_r_hand(new /obj/item/ammo_box/vampire/c556/incendiary(owner.current)) - owner.current.put_in_l_hand(new /obj/item/ammo_box/vampire/c556/incendiary(owner.current)) - -/obj/effect/landmark/start/national_guard - name = "National Guard" - delete_after_roundstart = FALSE - -/datum/antagonist/national_guard - name = "National Guard" - roundend_category = "national guard" - antagpanel_category = "National Guard" - job_rank = ROLE_NATIONAL_GUARD - antag_hud_type = ANTAG_HUD_OPS - antag_hud_name = "synd" - antag_moodlet = /datum/mood_event/focused - show_to_ghosts = TRUE - var/always_new_team = FALSE - var/datum/team/national_guard/national_guard_team - var/national_guard_outfit = /datum/outfit/job/national_guard - var/custom_objective - -/datum/antagonist/national_guard/sergeant - name = "National Guard Sergeant" - always_new_team = TRUE - var/title - -/datum/antagonist/national_guard/on_gain() - randomize_appearance() - forge_objectives() - add_antag_hud(ANTAG_HUD_OPS, "synd", owner.current) - owner.special_role = src - equip_national_guard() - give_alias() - offer_loadout() - return ..() - -/datum/antagonist/national_guard/on_removal() - ..() - to_chat(owner.current,span_userdanger("You are no longer in the National Guard!")) - owner.special_role = null - -/datum/antagonist/national_guard/greet() - to_chat(owner.current, span_alertsyndie("You're in the national guard.")) - to_chat(owner, span_notice("You are a [national_guard_team ? national_guard_team.national_guard_name : "national guard"] soldier!")) - owner.announce_objectives() - - -/datum/antagonist/national_guard/proc/give_alias() - var/my_name = "Tyler" - var/list/military_ranks = list("Private", "Private First Class", "Specialist", "Corporal") - var/selected_rank = pick(military_ranks) - if(owner.current.gender == MALE) - my_name = pick(GLOB.first_names_male) - else - my_name = pick(GLOB.first_names_female) - var/my_surname = pick(GLOB.last_names) - owner.current.fully_replace_character_name(null,"[selected_rank] [my_name] [my_surname]") - -/datum/antagonist/national_guard/proc/forge_objectives() - if(national_guard_team) - objectives |= national_guard_team.objectives - -/datum/antagonist/national_guard/sergeant/give_alias() - var/my_name = "Tyler" - if(owner.current.gender == MALE) - my_name = pick(GLOB.first_names_male) - else - my_name = pick(GLOB.first_names_female) - var/my_surname = pick(GLOB.last_names) - owner.current.fully_replace_character_name(null,"Sergeant [my_name] [my_surname]") - -/datum/team/national_guard/antag_listing_name() - if(national_guard_name) - return "[national_guard_name] Soldiers" - else - return "Soldiers" - - -/datum/antagonist/national_guard/sergeant/greet() - to_chat(owner, "<B>You are the leading sergeant for this mission. You are responsible for guiding your team's operation.</B>") - to_chat(owner, "<B>If you feel you are not up to this task, give your command to another soldier.</B>") - owner.announce_objectives() - addtimer(CALLBACK(src, PROC_REF(national_guardteam_name_assign)), 1) - -/datum/antagonist/national_guard/sergeant/proc/national_guardteam_name_assign() - if(!national_guard_team) - return - national_guard_team.rename_team(ask_name()) - -/datum/antagonist/national_guard/sergeant/proc/ask_name() - var/randomname = pick(GLOB.last_names) - var/newname = stripped_input(owner.current,"You are the sergeant. Please choose a name for your team.", "Name change",randomname) - if (!newname) - newname = randomname - else - newname = reject_bad_name(newname) - if(!newname) - newname = randomname - -/datum/antagonist/national_guard/create_team(datum/team/national_guard/new_team) - if(!new_team) - if(!always_new_team) - for(var/datum/antagonist/national_guard/N in GLOB.antagonists) - if(!N.owner) - stack_trace("Antagonist datum without owner in GLOB.antagonists: [N]") - continue - national_guard_team = new /datum/team/national_guard - national_guard_team.update_objectives() - return - if(!istype(national_guard_team)) - stack_trace("Wrong team type passed to [type] initialization.") - national_guard_team = new_team - -/datum/antagonist/national_guard/admin_add(datum/mind/new_owner,mob/admin) - new_owner.assigned_role = ROLE_NATIONAL_GUARD - new_owner.add_antag_datum(src) - message_admins("[key_name_admin(admin)] has national guard'd [key_name_admin(new_owner)].") - log_admin("[key_name(admin)] has national guard'd [key_name(new_owner)].") - -/datum/random_gen/national_guard - var/hair_colors = list("040404", //Black - "120b05", //Dark Brown - "342414", //Brown - "554433", //Light Brown - "695c3b", //Dark Blond - "ad924e", //Blond - "dac07f", //Light Blond - "802400", //Ginger - "a5380e", //Ginger alt - "ffeace", //Albino - "650b0b", //Punk Red - "14350e", //Punk Green - "080918") //Punk Blue - - var/male_hair = list("Balding Hair", - "Bedhead", - "Bedhead 2", - "Bedhead 3", - "Boddicker", - "Business Hair", - "Business Hair 2", - "Business Hair 3", - "Business Hair 4", - "Coffee House", - "Combover", - "Crewcut", - "Father", - "Flat Top", - "Gelled Back", - "Joestar", - "Keanu Hair", - "Oxton", - "Volaju") - - var/male_facial = list("Beard (Abraham Lincoln)", - "Beard (Chinstrap)", - "Beard (Full)", - "Beard (Cropped Fullbeard)", - "Beard (Hipster)", - "Beard (Neckbeard)", - "Beard (Three o Clock Shadow)", - "Beard (Five o Clock Shadow)", - "Beard (Seven o Clock Shadow)", - "Moustache (Hulk Hogan)", - "Moustache (Watson)", - "Sideburns (Elvis)", - "Sideburns") - - var/female_hair = list("Ahoge", - "Long Bedhead", - "Beehive", - "Beehive 2", - "Bob Hair", - "Bob Hair 2", - "Bob Hair 3", - "Bob Hair 4", - "Bobcurl", - "Braided", - "Braided Front", - "Braid (Short)", - "Braid (Low)", - "Bun Head", - "Bun Head 2", - "Bun Head 3", - "Bun (Large)", - "Bun (Tight)", - "Double Bun", - "Emo", - "Emo Fringe", - "Feather", - "Gentle", - "Long Hair 1", - "Long Hair 2", - "Long Hair 3", - "Long Over Eye", - "Long Emo", - "Long Fringe", - "Ponytail", - "Ponytail 2", - "Ponytail 3", - "Ponytail 4", - "Ponytail 5", - "Ponytail 6", - "Ponytail 7", - "Ponytail (High)", - "Ponytail (Short)", - "Ponytail (Long)", - "Ponytail (Country)", - "Ponytail (Fringe)", - "Poofy", - "Short Hair Rosa", - "Shoulder-length Hair", - "Volaju") - -/datum/antagonist/national_guard/proc/randomize_appearance() - var/datum/random_gen/national_guard/h_gen = new - var/mob/living/carbon/human/H = owner.current - H.gender = pick(MALE, FEMALE) - H.body_type = H.gender - - H.age = rand(18, 36) - H.name = H.real_name - H.dna.real_name = H.real_name - - H.set_haircolor(pick(h_gen.hair_colors)) - H.set_facial_haircolor(H.hair_color) - if(H.gender == MALE) - H.set_hairstyle(pick(h_gen.male_hair)) - if(prob(25) || H.age >= 25) - H.set_facial_hairstyle(pick(h_gen.male_facial)) - else - H.set_facial_hairstyle("Shaved") - else - H.set_hairstyle(pick(h_gen.female_hair)) - H.set_facial_hairstyle("Shaved") - - H.set_eye_color(random_eye_color()) - - H.underwear = random_underwear(H.gender) - if(prob(50)) - H.underwear_color = organ_eyes.eye_color - if(prob(50) || H.gender == FEMALE) - H.undershirt = random_undershirt(H.gender) - if(prob(25)) - H.socks = random_socks() - - H.update_body() - -/datum/team/national_guard/proc/rename_team(new_name) - national_guard_name = new_name - name = "[national_guard_name] Team" - -/datum/team/national_guard - var/national_guard_name - var/core_objective = /datum/objective/national_guard - member_name = "National Guard Operative" - var/memorized_code - var/list/team_discounts - var/obj/item/nuclear_challenge/war_button - -/datum/team/national_guard/New() - ..() - national_guard_name = national_guard_name() - -/datum/team/national_guard/proc/update_objectives() - if(core_objective) - var/datum/objective/O = new core_objective - O.team = src - objectives += O - - -/datum/team/national_guard/roundend_report() - var/list/parts = list() - parts += span_header("[national_guard_name] Operatives:") - - var/text = "<br>[span_header("The national guard were:")]" - text += printplayerlist(members) - parts += text - - return "<div class='panel redborder'>[parts.Join("<br>")]</div>" - - - - -////////////////////////////////////////////// -// // -// NATIONAL GUARD SQUAD (MIDROUND) // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/midround/from_ghosts/national_guard - name = "National Guard Squad" - antag_flag = ROLE_NATIONAL_GUARD - antag_datum = /datum/antagonist/national_guard - required_candidates = 1 - weight = 5 - cost = 35 - requirements = list(90,90,90,80,60,40,30,20,10,10) - var/list/operative_cap = list(2,2,3,3,4,5,5,5,5,5) - var/datum/team/national_guard/national_guard_team - flags = HIGHLANDER_RULESET - -/datum/dynamic_ruleset/midround/from_ghosts/national_guard/acceptable(population=0, threat=0) - indice_pop = min(operative_cap.len, round(living_players.len/5)+1) - required_candidates = max(5, operative_cap[indice_pop]) - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/national_guard/ready(forced = FALSE) - if (required_candidates > (dead_players.len + list_observers.len)) - return FALSE - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/national_guard/finish_setup(mob/new_character, index) - new_character.mind.special_role = "National Guard" - new_character.mind.assigned_role = "National Guard" - if (index == 1) // Our first guy is the leader - var/datum/antagonist/national_guard/sergeant/new_role = new - national_guard_team = new_role.national_guard_team - new_character.mind.add_antag_datum(new_role) - else - return ..() - diff --git a/modular_darkpack/modules/jobs/code/pentex/affairs.dm b/modular_darkpack/modules/jobs/code/pentex/affairs.dm new file mode 100644 index 000000000000..d36ce8757667 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/pentex/affairs.dm @@ -0,0 +1,51 @@ +/datum/job/vampire/affairs + title = JOB_PENTEX_AFFAIRS + description = "You are the internal affairs agent operating for " + MAIN_EVIL_COMPANY + ". You know the bloody and vile needs commanded of destruction will lead to jeopardy, and your duty is to see excellence on task rewarded and acknowledged, and curb the invariable atrocities that could endanger the greater plans of Pentex." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = "the Board and the Branch Lead" + req_admin_notify = 1 + minimal_player_age = 25 + exp_requirements = 150 + exp_required_type = EXP_TYPE_SPIRAL + exp_required_type_department = EXP_TYPE_SPIRAL + exp_granted_type = EXP_TYPE_SPIRAL + config_tag = "PENTEX_AFFAIRS" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/affairs + + allowed_species = list(SPECIES_GAROU) +// allowed_tribes = list(TRIBE_WYRM, TRIBE_RONIN) + minimal_masquerade = 5 + + display_order = JOB_DISPLAY_ORDER_AFFAIRS + department_for_prefs = /datum/job_department/pentex + departments_list = list( + /datum/job_department/pentex, + ) + + known_contacts = list( + JOB_PENTEX_LEAD, + JOB_PENTEX_EXEC, + JOB_PENTEX_SEC_CHIEF + ) + +// minimal_renownrank = 3 + paycheck = PAYCHECK_COMMAND + paycheck_department = ACCOUNT_SEC + + liver_traits = list(TRAIT_ROYAL_METABOLISM) + +/datum/outfit/job/vampire/affairs + name = JOB_PENTEX_AFFAIRS + jobtype = /datum/job/vampire/affairs + +// ears = /obj/item/p25radio + id = /obj/item/card/pentex/affairs + uniform = /obj/item/clothing/under/vampire/pentex_suit + shoes = /obj/item/clothing/shoes/vampire/businessblack + l_pocket = /obj/item/smartphone // /affairsagent - todo subtype + r_pocket = /obj/item/vamp/keys/pentex + backpack_contents = list(/obj/item/phone_book=1, /obj/item/veil_contract, /obj/item/card/credit/rich=1) diff --git a/modular_darkpack/modules/jobs/code/pentex/branch_lead.dm b/modular_darkpack/modules/jobs/code/pentex/branch_lead.dm new file mode 100644 index 000000000000..66ba23a61853 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/pentex/branch_lead.dm @@ -0,0 +1,53 @@ +/datum/job/vampire/branch_lead + title = JOB_PENTEX_LEAD + description = "You are the current branch leader for " + MAIN_EVIL_COMPANY + " , operating out of San Francisco. Your job is to fuel production and keep your clowns in line." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = "the Board" + req_admin_notify = 1 + minimal_player_age = 25 + exp_requirements = 180 + exp_required_type = EXP_TYPE_SPIRAL + exp_required_type_department = EXP_TYPE_SPIRAL + exp_granted_type = EXP_TYPE_SPIRAL + config_tag = "PENTEX_BRANCH_LEAD" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/branch_lead + + allowed_species = list(SPECIES_GAROU, SPECIES_KINDRED, SPECIES_HUMAN) +// allowed_tribes = list(TRIBE_WYRM, TRIBE_RONIN) + allowed_clans = VAMPIRE_CLAN_ALL + minimal_masquerade = 5 + + display_order = JOB_DISPLAY_ORDER_BRANCH_LEAD + department_for_prefs = /datum/job_department/pentex + departments_list = list( + /datum/job_department/pentex, + ) + + known_contacts = list( + JOB_PENTEX_EXEC, + JOB_PENTEX_AFFAIRS, + JOB_PENTEX_SEC_CHIEF + ) + +// minimal_renownrank = 4 + paycheck = PAYCHECK_COMMAND + paycheck_department = ACCOUNT_SEC + + liver_traits = list(TRAIT_ROYAL_METABOLISM) + +/datum/outfit/job/vampire/branch_lead + name = MAIN_EVIL_COMPANY + " Branch Lead" + jobtype = /datum/job/vampire/branch_lead + +// ears = /obj/item/p25radio + id = /obj/item/card/pentex/branch_lead + uniform = /obj/item/clothing/under/vampire/pentex_executive_suit + shoes = /obj/item/clothing/shoes/vampire/businessblack + suit = /obj/item/clothing/suit/vampire/pentex_labcoat_alt + l_pocket = /obj/item/smartphone // /branch_lead - TODO: phone subtype + r_pocket = /obj/item/vamp/keys/pentex + backpack_contents = list(/obj/item/gun/ballistic/automatic/pistol/darkpack/deagle=1, /obj/item/phone_book=1, /obj/item/card/credit/prince=1) diff --git a/modular_darkpack/modules/jobs/code/pentex/employee.dm b/modular_darkpack/modules/jobs/code/pentex/employee.dm new file mode 100644 index 000000000000..33304e1ccbbf --- /dev/null +++ b/modular_darkpack/modules/jobs/code/pentex/employee.dm @@ -0,0 +1,52 @@ +/datum/job/vampire/employee + title = JOB_PENTEX_EMPLOYEE + description = "You are an employee for " + MAIN_EVIL_COMPANY + ", operating out of San Francisco. Your bosses can be a little strange; give credence to the security team and executives for tasks on the night shift, and avoid getting negative attention from the branch manager or internal affairs." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 3 + spawn_positions = 3 + supervisors = "the Board and the Branch Lead" + req_admin_notify = 1 + minimal_player_age = 25 + exp_requirements = 50 + exp_required_type = EXP_TYPE_SPIRAL + exp_required_type_department = EXP_TYPE_SPIRAL + exp_granted_type = EXP_TYPE_SPIRAL + config_tag = "PENTEX_EMPLOYEE" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/employee + + allowed_species = list(SPECIES_GAROU, SPECIES_KINDRED, SPECIES_HUMAN) +// allowed_tribes = list(TRIBE_WYRM, TRIBE_RONIN) + allowed_clans = VAMPIRE_CLAN_ALL + minimal_masquerade = 3 + + display_order = JOB_DISPLAY_ORDER_EMPLOYEE + department_for_prefs = /datum/job_department/pentex + departments_list = list( + /datum/job_department/pentex, + ) + + known_contacts = list( + JOB_PENTEX_LEAD, + JOB_PENTEX_EXEC, + JOB_PENTEX_AFFAIRS + ) + + paycheck = PAYCHECK_CREW + paycheck_department = ACCOUNT_SEC + + liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + +/datum/outfit/job/vampire/employee + name = JOB_PENTEX_EMPLOYEE + jobtype = /datum/job/vampire/employee + +// ears = /obj/item/p25radio + id = /obj/item/card/pentex + uniform = /obj/item/clothing/under/vampire/pentex_longleeve + gloves = /obj/item/clothing/gloves/vampire/work + shoes = /obj/item/clothing/shoes/vampire + r_pocket = /obj/item/vamp/keys/pentex + l_pocket = /obj/item/smartphone // /employee - todo subtype + backpack_contents = list(/obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/pentex/executive.dm b/modular_darkpack/modules/jobs/code/pentex/executive.dm new file mode 100644 index 000000000000..693257b6cf49 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/pentex/executive.dm @@ -0,0 +1,52 @@ +/datum/job/vampire/executive + title = JOB_PENTEX_EXEC + description = "You are an acting executive for " + MAIN_EVIL_COMPANY + " operating out of San Francisco. With discretion to the Branch Leader, a position you may aim for, your job is to fuel production and expand operations." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = "the Board and the Branch Lead" + req_admin_notify = 1 + minimal_player_age = 25 + exp_requirements = 150 + exp_required_type = EXP_TYPE_SPIRAL + exp_required_type_department = EXP_TYPE_SPIRAL + exp_granted_type = EXP_TYPE_SPIRAL + config_tag = "PENTEX_EXECUTIVE" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/executive + + allowed_species = list(SPECIES_GAROU, SPECIES_KINDRED) +// allowed_tribes = list(TRIBE_WYRM, TRIBE_RONIN) + allowed_clans = VAMPIRE_CLAN_ALL + minimal_masquerade = 4 + + display_order = JOB_DISPLAY_ORDER_EXECUTIVE + department_for_prefs = /datum/job_department/pentex + departments_list = list( + /datum/job_department/pentex, + ) + + known_contacts = list( + JOB_PENTEX_LEAD, + JOB_PENTEX_AFFAIRS, + JOB_PENTEX_SEC_CHIEF + ) + +// minimal_renownrank = 3 + paycheck = PAYCHECK_COMMAND + paycheck_department = ACCOUNT_SEC + + liver_traits = list(TRAIT_ROYAL_METABOLISM) + +/datum/outfit/job/vampire/executive + name = JOB_PENTEX_EXEC + jobtype = /datum/job/vampire/executive + +// ears = /obj/item/p25radio + id = /obj/item/card/pentex/executive + uniform = /obj/item/clothing/under/vampire/pentex_executive_suit + shoes = /obj/item/clothing/shoes/vampire/businessblack + l_pocket = /obj/item/smartphone // /pentex_exec - todo: subtype + r_pocket = /obj/item/vamp/keys/pentex + backpack_contents = list(/obj/item/phone_book=1, /obj/item/card/credit/seneschal=1) diff --git a/modular_darkpack/modules/jobs/code/pentex/sec.dm b/modular_darkpack/modules/jobs/code/pentex/sec.dm new file mode 100644 index 000000000000..d12f51eca24f --- /dev/null +++ b/modular_darkpack/modules/jobs/code/pentex/sec.dm @@ -0,0 +1,55 @@ +/datum/job/vampire/pentex_sec + title = JOB_PENTEX_SEC + description = "You are an acting security for " + MAIN_EVIL_COMPANY + ", operating out of San Francisco. Under the chief of security's direction, your job is to keep the complex free of nosy meddlers, pick up contract violators, and to assist the chief in tackling threats to corporate assets." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 2 + spawn_positions = 2 + supervisors = "the Board, Branch Lead, and Chief of Security" + req_admin_notify = 1 + minimal_player_age = 25 + exp_requirements = 100 + exp_required_type = EXP_TYPE_SPIRAL + exp_required_type_department = EXP_TYPE_SPIRAL + exp_granted_type = EXP_TYPE_SPIRAL + config_tag = "PENTEX_SEC" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/pentex_sec + + allowed_species = list(SPECIES_GAROU, SPECIES_KINDRED, SPECIES_HUMAN) +// allowed_tribes = list(TRIBE_WYRM, TRIBE_RONIN) + allowed_clans = VAMPIRE_CLAN_ALL + minimal_masquerade = 3 + + display_order = JOB_DISPLAY_ORDER_PENTEX_SEC + department_for_prefs = /datum/job_department/pentex + departments_list = list( + /datum/job_department/pentex, + ) + + known_contacts = list( + JOB_PENTEX_LEAD, + JOB_PENTEX_EXEC, + JOB_PENTEX_AFFAIRS, + JOB_PENTEX_SEC_CHIEF + ) + + paycheck = PAYCHECK_CREW + paycheck_department = ACCOUNT_SEC + + liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + +/datum/outfit/job/vampire/pentex_sec + name = JOB_PENTEX_SEC + jobtype = /datum/job/vampire/pentex_sec + +// ears = /obj/item/p25radio + id = /obj/item/card/pentex/sec + uniform = /obj/item/clothing/under/vampire/pentex_shortsleeve + shoes = /obj/item/clothing/shoes/vampire/jackboots + gloves = /obj/item/clothing/gloves/vampire/work + suit = /obj/item/clothing/suit/vampire/vest + belt = /obj/item/storage/belt/holster/detective/darkpack/endron + l_pocket = /obj/item/smartphone // /sec - todo subtype + r_pocket = /obj/item/vamp/keys/pentex + backpack_contents = list(/obj/item/phone_book=1, /obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/pentex/secchief.dm b/modular_darkpack/modules/jobs/code/pentex/secchief.dm new file mode 100644 index 000000000000..5a025cc9c5b6 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/pentex/secchief.dm @@ -0,0 +1,57 @@ +/datum/job/vampire/secchief + title = JOB_PENTEX_SEC_CHIEF + description = "You are an acting chief of security for the Endron Oil Refinery, operating out of San Francisco. With discretion to the Branch Leader, your job is to keep the complex and it's proprietary information with the help of your security team, and to turn over contract violators to internal affairs or the executives." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = "the Board and the Branch Lead" + req_admin_notify = 1 + minimal_player_age = 25 + exp_requirements = 150 + exp_required_type = EXP_TYPE_SPIRAL + exp_required_type_department = EXP_TYPE_SPIRAL + exp_granted_type = EXP_TYPE_SPIRAL + config_tag = "PENTEX_SECCHIEF" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/secchief + + allowed_species = list(SPECIES_GAROU, SPECIES_KINDRED) +// allowed_tribes = list(TRIBE_WYRM, TRIBE_RONIN) + allowed_clans = VAMPIRE_CLAN_ALL + minimal_masquerade = 4 + + display_order = JOB_DISPLAY_ORDER_SECCHIEF + department_for_prefs = /datum/job_department/pentex + departments_list = list( + /datum/job_department/pentex, + ) + + known_contacts = list( + JOB_PENTEX_LEAD, + JOB_PENTEX_EXEC, + JOB_PENTEX_AFFAIRS + ) + +// minimal_renownrank = 3 + paycheck = PAYCHECK_COMMAND + paycheck_department = ACCOUNT_SEC + + liver_traits = list(TRAIT_ROYAL_METABOLISM) + +/datum/outfit/job/vampire/secchief + name = "Endron Chief of Security" + jobtype = /datum/job/vampire/secchief + +// ears = /obj/item/p25radio + id = /obj/item/card/pentex/secchief + uniform = /obj/item/clothing/under/vampire/pentex_turtleneck + shoes = /obj/item/clothing/shoes/vampire/jackboots + gloves = /obj/item/clothing/gloves/vampire/work + head = /obj/item/clothing/head/vampire/pentex_beret + suit = /obj/item/clothing/suit/vampire/vest + belt = /obj/item/storage/belt/holster/detective/darkpack/endron + glasses = /obj/item/clothing/glasses/vampire/sun + l_pocket = /obj/item/smartphone // /secchief - todo subtype + r_pocket = /obj/item/vamp/keys/pentex + backpack_contents = list(/obj/item/gun/ballistic/automatic/pistol/darkpack/deagle=1, /obj/item/phone_book=1, /obj/item/veil_contract, /obj/item/card/credit/rich=1) diff --git a/modular_darkpack/modules/jobs/code/police.dm b/modular_darkpack/modules/jobs/code/police.dm deleted file mode 100644 index 1e0804358801..000000000000 --- a/modular_darkpack/modules/jobs/code/police.dm +++ /dev/null @@ -1,135 +0,0 @@ - -/datum/job/vamp/police_officer - title = "Police Officer" - department_head = list("Police Department") - faction = "Vampire" - total_positions = 5 - spawn_positions = 5 - supervisors = " the SFPD Chief and your Sergeant." - selection_color = "#7e7e7e" - - outfit = /datum/outfit/job/police_officer - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_ARMORY, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_POLICE - exp_type_department = EXP_TYPE_POLICE - - allowed_species = list("Ghoul", "Human") - species_slots = list("Ghoul" = 2) - - duty = "Enforce the Law." - minimal_masquerade = 0 - my_contact_is_important = FALSE - known_contacts = list("Police Chief") - -/datum/outfit/job/police_officer - name = "Police Officer" - jobtype = /datum/job/vamp/police_officer - - ears = /obj/item/p25radio/police - uniform = /obj/item/clothing/under/vampire/police - shoes = /obj/item/clothing/shoes/vampire/jackboots - suit = /obj/item/clothing/suit/vampire/vest/police - belt = /obj/item/storage/belt/holster/detective/vampire/police - gloves = /obj/item/cockclock - id = /obj/item/card/id/police - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/vamp/keys/police - backpack_contents = list(/obj/item/passport=1, /obj/item/card/credit=1, /obj/item/ammo_box/vampire/c9mm = 1, /obj/item/restraints/handcuffs = 1, /obj/item/melee/baton/vamp = 1, /obj/item/storage/medkit/darkpack/ifak = 1) - -/datum/job/vamp/police_sergeant - title = "Police Sergeant" - department_head = list("Police Department") - faction = "Vampire" - total_positions = 2 - spawn_positions = 2 - supervisors = " the SFPD Chief" - selection_color = "#7e7e7e" - - outfit = /datum/outfit/job/police_sergeant - - access = list(ACCESS_HYDROPONICS, ACCESS_ARMORY, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_HARD - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_POLICE_SERGEANT - exp_type_department = EXP_TYPE_POLICE - - allowed_species = list("Human") - - duty = "Enforce the law. Keep the officers in line. Follow what the Chief says." - minimal_masquerade = 0 - my_contact_is_important = FALSE - known_contacts = list("Police Chief") - -/datum/outfit/job/police_sergeant - name = "Police Sergeant" - jobtype = /datum/job/vamp/police_sergeant - - ears = /obj/item/p25radio/police/supervisor - uniform = /obj/item/clothing/under/vampire/police - shoes = /obj/item/clothing/shoes/vampire/jackboots - suit = /obj/item/clothing/suit/vampire/vest/police/sergeant - belt = /obj/item/storage/belt/holster/detective/vampire/officer - gloves = /obj/item/cockclock - id = /obj/item/card/id/police/sergeant - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/vamp/keys/police/secure - backpack_contents = list(/obj/item/passport=1, /obj/item/card/credit=1, /obj/item/ammo_box/vampire/c9mm = 1, /obj/item/restraints/handcuffs = 1, /obj/item/melee/baton/vamp = 1, /obj/item/storage/medkit/darkpack/ifak = 1) - -/datum/job/vamp/police_chief - title = "Police Chief" - department_head = list("Police Department") - faction = "Vampire" - total_positions = 1 - spawn_positions = 1 - supervisors = " the SFPD" - selection_color = "#7e7e7e" - - outfit = /datum/outfit/job/police_chief - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_ARMORY, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_COMMAND - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_POLICE_CHIEF - exp_type_department = EXP_TYPE_POLICE - - allowed_species = list("Human") - - duty = "Underpaid, overworked, and understrength. Do your best to keep the order in San Francisco. Keep the officers in line." - minimal_masquerade = 0 - my_contact_is_important = FALSE -// known_contacts = list("Investigator") - -/datum/outfit/job/police_chief - name = "Police Chief" - jobtype = /datum/job/vamp/police_chief - - ears = /obj/item/p25radio/police/command - uniform = /obj/item/clothing/under/vampire/police - shoes = /obj/item/clothing/shoes/vampire/jackboots - suit = /obj/item/clothing/suit/vampire/vest/police/chief - belt = /obj/item/storage/belt/holster/detective/vampire/officer - gloves = /obj/item/cockclock - id = /obj/item/card/id/police/chief - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/vamp/keys/police/secure/chief - backpack_contents = list(/obj/item/passport=1, /obj/item/card/credit=1, /obj/item/ammo_box/vampire/c9mm = 1, /obj/item/restraints/handcuffs = 1, /obj/item/melee/baton/vamp = 1, /obj/item/storage/medkit/darkpack/ifak = 1) - -/datum/outfit/job/police_officer/post_equip(mob/living/carbon/human/H) - ..() - H.ignores_warrant = TRUE - -/datum/outfit/job/police_chief/post_equip(mob/living/carbon/human/H) - ..() - var/datum/martial_art/martial_art = new /datum/martial_art/cqc - H.ignores_warrant = TRUE - martial_art.teach(H) - -/datum/outfit/job/police_sergeant/post_equip(mob/living/carbon/human/H) - ..() - H.ignores_warrant = TRUE diff --git a/modular_darkpack/modules/jobs/code/police/chief.dm b/modular_darkpack/modules/jobs/code/police/chief.dm new file mode 100644 index 000000000000..8fff969c9d1b --- /dev/null +++ b/modular_darkpack/modules/jobs/code/police/chief.dm @@ -0,0 +1,40 @@ +/datum/job/vampire/police_chief + title = JOB_POLICE_CHIEF + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = " the SFPD" + config_tag = "POLICE_CHIEF" + outfit = /datum/outfit/job/vampire/police_chief + job_flags = CITY_JOB_FLAGS + display_order = JOB_DISPLAY_ORDER_POLICE_CHIEF + exp_required_type_department = EXP_TYPE_POLICE + department_for_prefs = /datum/job_department/police + departments_list = list( + /datum/job_department/police, + ) + + allowed_species = list(SPECIES_HUMAN) + + description = "Underpaid, overworked, and understrength. Do your best to keep the order in " + CITY_NAME + ". Keep the officers in line." + minimal_masquerade = 0 + +/datum/outfit/job/vampire/police_chief + name = "Police Chief" + jobtype = /datum/job/vampire/police_chief + + ears = /obj/item/radio/headset/darkpack/police + uniform = /obj/item/clothing/under/vampire/police + shoes = /obj/item/clothing/shoes/vampire/jackboots + suit = /obj/item/clothing/suit/vampire/vest/police/chief + belt = /obj/item/storage/belt/holster/detective/darkpack/officer + id = /obj/item/card/police/chief + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/vamp/keys/police/secure/chief + backpack_contents = list(/obj/item/card/credit=1, /obj/item/ammo_box/darkpack/c9mm = 1, /obj/item/restraints/handcuffs = 1, /obj/item/melee/baton/vamp = 1, /obj/item/storage/medkit/darkpack/ifak = 1) + +/datum/outfit/job/vampire/police_chief/post_equip(mob/living/carbon/human/H) + . = ..() + var/datum/martial_art/martial_art = new /datum/martial_art/cqc + H.ignores_warrant = TRUE + martial_art.teach(H) diff --git a/modular_darkpack/modules/jobs/code/police/dispatcher.dm b/modular_darkpack/modules/jobs/code/police/dispatcher.dm new file mode 100644 index 000000000000..e7ef9e54bc53 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/police/dispatcher.dm @@ -0,0 +1,34 @@ +/datum/job/vampire/dispatcher + title = JOB_EMERGENCY_DISPATCHER + faction = FACTION_CITY + total_positions = 2 + spawn_positions = 2 + supervisors = " the SF local government." + config_tag = "DISPATCHER" + outfit = /datum/outfit/job/vampire/dispatcher + job_flags = CITY_JOB_FLAGS + display_order = JOB_DISPLAY_ORDER_POLICE + exp_required_type_department = EXP_TYPE_POLICE + department_for_prefs = /datum/job_department/police + departments_list = list( + /datum/job_department/police, + /datum/job_department/clinic, + ) + + allowed_species = list(SPECIES_GHOUL, SPECIES_HUMAN) + species_slots = list(SPECIES_GHOUL = 1) + + description = "Report emergencies to the correct emergency service." + minimal_masquerade = 0 + known_contacts = list("Police Chief") + +/datum/outfit/job/vampire/dispatcher + name = "Dispatcher" + jobtype = /datum/job/vampire/dispatcher + uniform = /obj/item/clothing/under/vampire/office + ears = /obj/item/radio/headset/darkpack + shoes = /obj/item/clothing/shoes/vampire/businessblack + id = /obj/item/card/government + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/vamp/keys/dispatch + backpack_contents = list(/obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/police/fbi.dm b/modular_darkpack/modules/jobs/code/police/fbi.dm new file mode 100644 index 000000000000..136164ef0f5a --- /dev/null +++ b/modular_darkpack/modules/jobs/code/police/fbi.dm @@ -0,0 +1,40 @@ +/datum/job/vampire/fbi + title = JOB_FEDERAL_INVESTIGATOR + faction = FACTION_CITY + total_positions = 2 + spawn_positions = 2 + supervisors = " the FBI" + config_tag = "FEDERAL_AGENT" + outfit = /datum/outfit/job/vampire/fbi + job_flags = CITY_JOB_FLAGS + display_order = JOB_DISPLAY_ORDER_FBI + exp_required_type_department = EXP_TYPE_NATIONAL_SECURITY + department_for_prefs = /datum/job_department/police + departments_list = list( + /datum/job_department/police, + ) + + allowed_species = list(SPECIES_HUMAN) + description = "Enforce the Law." + minimal_masquerade = 0 + + known_contacts = list("Police Chief") + +/datum/outfit/job/vampire/fbi + name = "Federal Investigator" + jobtype = /datum/job/vampire/fbi + + ears = /obj/item/radio/headset/darkpack + uniform = /obj/item/clothing/under/vampire/office + shoes = /obj/item/clothing/shoes/vampire + suit = /obj/item/clothing/suit/vampire/jacket/fbi + belt = /obj/item/storage/belt/holster/detective/darkpack/fbi + id = /obj/item/card/police/fbi + gloves = /obj/item/clothing/gloves/vampire/investigator + l_pocket = /obj/item/smartphone + l_hand = /obj/item/vamp/keys/police + backpack_contents = list(/obj/item/card/police/sergeant=1, /obj/item/camera/detective=1, /obj/item/camera_film=1, /obj/item/taperecorder=1, /obj/item/tape=1, /obj/item/card/credit=1, /obj/item/ammo_box/darkpack/c45acp=1, /obj/item/storage/medkit/darkpack/ifak=1) + +/datum/outfit/job/vampire/fbi/post_equip(mob/living/carbon/human/agent) + ..() + agent.ignores_warrant = TRUE diff --git a/modular_darkpack/modules/jobs/code/police/police.dm b/modular_darkpack/modules/jobs/code/police/police.dm new file mode 100644 index 000000000000..bb3cef043456 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/police/police.dm @@ -0,0 +1,41 @@ +/datum/job/vampire/police_officer + title = JOB_POLICE_OFFICER + faction = FACTION_CITY + total_positions = 5 + spawn_positions = 5 + supervisors = SUPERVISOR_POLICE_CHIEF_AND_SERGEANT + config_tag = "POLICE_OFFICER" + outfit = /datum/outfit/job/vampire/police_officer + job_flags = CITY_JOB_FLAGS + display_order = JOB_DISPLAY_ORDER_POLICE + exp_required_type_department = EXP_TYPE_POLICE + department_for_prefs = /datum/job_department/police + departments_list = list( + /datum/job_department/police, + ) + + allowed_species = list(SPECIES_GHOUL, SPECIES_HUMAN) + species_slots = list(SPECIES_GHOUL = 2) + + description = "Enforce the Law." + minimal_masquerade = 0 + + known_contacts = list("Police Chief") + +/datum/outfit/job/vampire/police_officer + name = "Police Officer" + jobtype = /datum/job/vampire/police_officer + + ears = /obj/item/radio/headset/darkpack/police + uniform = /obj/item/clothing/under/vampire/police + shoes = /obj/item/clothing/shoes/vampire/jackboots + suit = /obj/item/clothing/suit/vampire/vest/police + belt = /obj/item/storage/belt/security/police + id = /obj/item/card/police + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/vamp/keys/police + backpack_contents = list(/obj/item/card/credit=1, /obj/item/ammo_box/darkpack/c9mm = 1, /obj/item/restraints/handcuffs = 1, /obj/item/melee/baton/vamp = 1, /obj/item/storage/medkit/darkpack/ifak = 1) + +/datum/outfit/job/vampire/police_officer/post_equip(mob/living/carbon/human/H) + ..() + H.ignores_warrant = TRUE diff --git a/modular_darkpack/modules/jobs/code/police/sergeant.dm b/modular_darkpack/modules/jobs/code/police/sergeant.dm new file mode 100644 index 000000000000..8957e68d88c9 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/police/sergeant.dm @@ -0,0 +1,40 @@ +/datum/job/vampire/police_sergeant + title = JOB_POLICE_SERGEANT + faction = FACTION_CITY + total_positions = 2 + spawn_positions = 2 + supervisors = SUPERVISOR_POLICE_CHIEF + config_tag = "POLICE_SERGEANT" + outfit = /datum/outfit/job/vampire/police_sergeant + job_flags = CITY_JOB_FLAGS + display_order = JOB_DISPLAY_ORDER_POLICE_SERGEANT + exp_required_type_department = EXP_TYPE_POLICE + department_for_prefs = /datum/job_department/police + departments_list = list( + /datum/job_department/police, + ) + + allowed_species = list(SPECIES_HUMAN) + + description = "Enforce the law. Keep the officers in line. Follow what the Chief says." + minimal_masquerade = 0 + + known_contacts = list("Police Chief") + +/datum/outfit/job/vampire/police_sergeant + name = "Police Sergeant" + jobtype = /datum/job/vampire/police_sergeant + + ears = /obj/item/radio/headset/darkpack/police + uniform = /obj/item/clothing/under/vampire/police + shoes = /obj/item/clothing/shoes/vampire/jackboots + suit = /obj/item/clothing/suit/vampire/vest/police/sergeant + belt = /obj/item/storage/belt/holster/detective/darkpack/officer + id = /obj/item/card/police/sergeant + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/vamp/keys/police/secure + backpack_contents = list(/obj/item/card/credit=1, /obj/item/ammo_box/darkpack/c9mm = 1, /obj/item/restraints/handcuffs = 1, /obj/item/melee/baton/vamp = 1, /obj/item/storage/medkit/darkpack/ifak = 1) + +/datum/outfit/job/vampire/police_sergeant/post_equip(mob/living/carbon/human/H) + ..() + H.ignores_warrant = TRUE diff --git a/modular_darkpack/modules/jobs/code/priest.dm b/modular_darkpack/modules/jobs/code/priest.dm deleted file mode 100644 index b81e2d8ca4d4..000000000000 --- a/modular_darkpack/modules/jobs/code/priest.dm +++ /dev/null @@ -1,69 +0,0 @@ - -/datum/job/vamp/priest - title = "Priest" - department_head = list("Bishop") - faction = "Vampire" - total_positions = 2 - spawn_positions = 2 - supervisors = "God" - selection_color = "#fff700" - - outfit = /datum/outfit/job/priest - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_PRIEST - exp_type_department = EXP_TYPE_CHURCH - - allowed_species = list("Human") - minimal_generation = 13 - - duty = "Be the shepherd of the flock in San Francisco, lead them to salvation, piety and righteousness." - v_duty = "The mortals believe you to be their savior. The kindred look at you with suspicion. Yours is the charge of this church." - minimal_masquerade = 0 - my_contact_is_important = FALSE - -/datum/outfit/job/priest - name = "Priest" - jobtype = /datum/job/vamp/priest - - uniform = /obj/item/clothing/under/vampire/graveyard - shoes = /obj/item/clothing/shoes/vampire/jackboots - id = /obj/item/card/id/hunter - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/flashlight - l_hand = /obj/item/vamp/keys/church - back = /obj/item/storage/backpack/satchel - backpack_contents = list(/obj/item/passport=1, /obj/item/card/credit=1) - -/datum/outfit/job/priest/pre_equip(mob/living/carbon/human/H) - ..() - add_verb(H, /datum/job/vampire/priest/verb/choose_special) - -/datum/job/vampire/priest/verb/choose_special() - set category = "Priest" - set name = "Choose Special" - set desc = "Select Priest special ability." - var/list/loadouts = list("Numina", "True Faith") - spawn() - var/mob/living/carbon/human/H = src - if(is_species(H, /datum/species/human)) - if(H.client) - var/loadout_type = input(H, "Choose what makes you special:", "Loadout") as anything in loadouts - remove_verb(H, /datum/job/vampire/priest/verb/choose_special) - switch(loadout_type) - if("Numina") - to_chat(H, span_alertsyndie("You have been blessed with psychic powers. They make you extraordinary among mortals, yet you still fear the horrors lurking unknown.")) - var/obj/effect/proc_holder/spell/targeted/numina_freeze/n_freeze = new(H) - var/obj/effect/proc_holder/spell/self/numina_heal/n_heal = new(H) - H.mind.AddSpell(n_freeze) - H.mind.AddSpell(n_heal) - if("True Faith") - H.mind.holy_role = HOLY_ROLE_PRIEST - H.resistant_to_disciplines = TRUE - to_chat(H, span_alertsyndie("Your faith in God is made of iron. None could shake it, and even in the darkest moments it holds you up.")) - -/obj/effect/landmark/start/priest - name = "Priest" diff --git a/modular_darkpack/modules/jobs/code/primogen.dm b/modular_darkpack/modules/jobs/code/primogen.dm deleted file mode 100644 index 14db550b1d8c..000000000000 --- a/modular_darkpack/modules/jobs/code/primogen.dm +++ /dev/null @@ -1,227 +0,0 @@ -/datum/job/vamp/primogen_malkavian - title = "Primogen Malkavian" - department_head = list("Justicar") - faction = "Vampire" - total_positions = 1 - spawn_positions = 1 - supervisors = " the Traditions" - selection_color = "#4f0404" - - outfit = /datum/outfit/job/malkav - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_MALKAVIAN - exp_type_department = EXP_TYPE_COUNCIL - - allowed_species = list("Vampire") - allowed_bloodlines = list("Malkavian") - minimal_generation = 10 - - v_duty = "Offer your infinite knowledge to Prince of the City." - minimal_masquerade = 5 - my_contact_is_important = TRUE - known_contacts = list("Prince") - -/datum/outfit/job/malkav - name = "Primogen Malkavian" - jobtype = /datum/job/vamp/primogen_malkavian - - ears = /obj/item/p25radio - id = /obj/item/card/id/primogen - glasses = /obj/item/clothing/glasses/vampire/sun - uniform = /obj/item/clothing/under/vampire/primogen_malkavian - suit = /obj/item/clothing/suit/vampire/trench/malkav - shoes = /obj/item/clothing/shoes/vampire/jackboots - head = /obj/item/clothing/head/vampire/malkav - l_pocket = /obj/item/vamp/phone/malkavian - r_pocket = /obj/item/cockclock - backpack_contents = list(/obj/item/vamp/keys/malkav/primogen=1, /obj/item/vamp/keys/clinic, /obj/item/passport=1, /obj/item/flashlight=1, /obj/item/card/credit/elder=1, /obj/item/card/id/whip, /obj/item/card/id/steward, /obj/item/card/id/myrmidon) - -/datum/outfit/job/malkav/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == FEMALE) - suit = null - head = null - uniform = /obj/item/clothing/under/vampire/primogen_malkavian/female - shoes = /obj/item/clothing/shoes/vampire/heels - -/datum/job/vamp/primogen_nosferatu - title = "Primogen Nosferatu" - department_head = list("Justicar") - faction = "Vampire" - total_positions = 1 - spawn_positions = 1 - supervisors = " the Traditions" - selection_color = "#4f0404" - - outfit = /datum/outfit/job/nosferatu - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_NOSFERATU - exp_type_department = EXP_TYPE_COUNCIL - - allowed_species = list("Vampire") - allowed_bloodlines = list("Nosferatu") - minimal_generation = 10 - - v_duty = "Offer your infinite knowledge to Prince of the City." - minimal_masquerade = 5 - my_contact_is_important = TRUE - known_contacts = list("Prince") - -/datum/outfit/job/nosferatu - name = "Primogen Nosferatu" - jobtype = /datum/job/vamp/primogen_nosferatu - - id = /obj/item/card/id/primogen - mask = /obj/item/clothing/mask/vampire/shemagh - glasses = /obj/item/clothing/glasses/vampire/sun - uniform = /obj/item/clothing/under/vampire/suit - suit = /obj/item/clothing/suit/vampire/trench - shoes = /obj/item/clothing/shoes/vampire - l_pocket = /obj/item/vamp/phone/nosferatu - r_pocket = /obj/item/cockclock - backpack_contents = list(/obj/item/vamp/keys/nosferatu/primogen=1, /obj/item/passport=1, /obj/item/flashlight=1, /obj/item/card/credit/elder=1, /obj/item/card/id/whip, /obj/item/card/id/steward, /obj/item/card/id/myrmidon) - -/datum/outfit/job/nosferatu/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == FEMALE) - shoes = /obj/item/clothing/shoes/vampire/heels - -/datum/job/vamp/primogen_ventrue - title = "Primogen Ventrue" - department_head = list("Justicar") - faction = "Vampire" - total_positions = 1 - spawn_positions = 1 - supervisors = " the Traditions" - selection_color = "#4f0404" - - outfit = /datum/outfit/job/ventrue - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_VENTRUE - exp_type_department = EXP_TYPE_COUNCIL - - allowed_species = list("Vampire") - allowed_bloodlines = list("Ventrue") - minimal_generation = 10 - - v_duty = "Offer your infinite knowledge to Prince of the City." - minimal_masquerade = 5 - my_contact_is_important = TRUE - known_contacts = list("Prince") - -/datum/outfit/job/ventrue - name = "Primogen Ventrue" - jobtype = /datum/job/vamp/primogen_ventrue - - id = /obj/item/card/id/primogen - glasses = /obj/item/clothing/glasses/vampire/sun - uniform = /obj/item/clothing/under/vampire/suit - suit = /obj/item/clothing/suit/vampire/trench - shoes = /obj/item/clothing/shoes/vampire - l_pocket = /obj/item/vamp/phone/ventrue - r_pocket = /obj/item/cockclock - backpack_contents = list(/obj/item/vamp/keys/ventrue/primogen=1, /obj/item/passport=1, /obj/item/flashlight=1, /obj/item/card/credit/elder=1, /obj/item/card/id/whip, /obj/item/card/id/steward, /obj/item/card/id/myrmidon) - -/datum/outfit/job/ventrue/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == FEMALE) - shoes = /obj/item/clothing/shoes/vampire/heels - -/datum/job/vamp/primogen_toreador - title = "Primogen Toreador" - department_head = list("Justicar") - faction = "Vampire" - total_positions = 1 - spawn_positions = 1 - supervisors = " the Traditions" - selection_color = "#4f0404" - - outfit = /datum/outfit/job/toreador - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_TOREADOR - exp_type_department = EXP_TYPE_COUNCIL - - allowed_species = list("Vampire") - allowed_bloodlines = list("Toreador") - minimal_generation = 10 - - v_duty = "Offer your infinite knowledge to Prince of the City." - minimal_masquerade = 5 - my_contact_is_important = TRUE - known_contacts = list("Prince") - -/datum/outfit/job/toreador - name = "Primogen Toreador" - jobtype = /datum/job/vamp/primogen_toreador - - id = /obj/item/card/id/primogen - glasses = /obj/item/clothing/glasses/vampire/sun - uniform = /obj/item/clothing/under/vampire/primogen_toreador - suit = /obj/item/clothing/suit/vampire/trench/alt - shoes = /obj/item/clothing/shoes/vampire - l_pocket = /obj/item/vamp/phone/toreador - r_pocket = /obj/item/cockclock - backpack_contents = list(/obj/item/vamp/keys/toreador/primogen=1, /obj/item/passport=1, /obj/item/flashlight=1, /obj/item/card/credit/elder=1, /obj/item/card/id/whip, /obj/item/card/id/steward, /obj/item/card/id/myrmidon, /obj/item/gun/ballistic/automatic/pistol/darkpack/beretta/toreador=1, /obj/item/ammo_box/magazine/semi9mm/toreador=1) - -/datum/outfit/job/toreador/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == FEMALE) - uniform = /obj/item/clothing/under/vampire/primogen_toreador/female - shoes = /obj/item/clothing/shoes/vampire/heels/red - - -/datum/job/vamp/primogen_brujah - title = "Primogen Brujah" - department_head = list("Justicar") - faction = "Vampire" - total_positions = 1 - spawn_positions = 1 - supervisors = " the Traditions" - selection_color = "#4f0404" - - outfit = /datum/outfit/job/brujah - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_BRUJAH - exp_type_department = EXP_TYPE_COUNCIL - - allowed_species = list("Vampire") - allowed_bloodlines = list("Brujah") - minimal_generation = 10 - - v_duty = "Offer your infinite knowledge to Prince of the City." - minimal_masquerade = 5 - my_contact_is_important = TRUE - known_contacts = list("Prince") - -/datum/outfit/job/brujah - name = "Primogen Brujah" - jobtype = /datum/job/vamp/primogen_brujah - - id = /obj/item/card/id/primogen - glasses = /obj/item/clothing/glasses/vampire/yellow - uniform = /obj/item/clothing/under/vampire/punk - suit = /obj/item/clothing/suit/vampire/jacket/punk - shoes = /obj/item/clothing/shoes/vampire/jackboots - l_pocket = /obj/item/vamp/phone/brujah - r_pocket = /obj/item/cockclock - backpack_contents = list(/obj/item/vamp/keys/brujah/primogen=1, /obj/item/instrument/eguitar/vamp=1, /obj/item/passport=1, /obj/item/flashlight=1, /obj/item/card/credit/elder=1, /obj/item/card/id/whip, /obj/item/card/id/steward, /obj/item/card/id/myrmidon) diff --git a/modular_darkpack/modules/jobs/code/prince.dm b/modular_darkpack/modules/jobs/code/prince.dm deleted file mode 100644 index e2b8ee45e2a6..000000000000 --- a/modular_darkpack/modules/jobs/code/prince.dm +++ /dev/null @@ -1,80 +0,0 @@ -/datum/job/vamp/prince - title = "Prince" - auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY - department_head = list("Justicar") - faction = "Vampire" - total_positions = 1 - spawn_positions = 1 - supervisors = "the Camarilla and the Traditions" - selection_color = "#bd3327" - req_admin_notify = 1 - minimal_player_age = 14 - exp_requirements = 180 - exp_type = EXP_TYPE_CREW - exp_type_department = EXP_TYPE_CAMARILLIA - - outfit = /datum/outfit/job/prince - - access = list() //See get_access() - minimal_access = list() //See get_access() - paycheck = PAYCHECK_COMMAND - paycheck_department = ACCOUNT_SEC - - liver_traits = list(TRAIT_ROYAL_METABOLISM) - - display_order = JOB_DISPLAY_ORDER_PRINCE - - minimal_generation = 10 //Uncomment when players get exp enough - minimal_masquerade = 5 - allowed_species = list("Vampire") - allowed_bloodlines = list("Tremere", "Ventrue", "Nosferatu", "Toreador", "Malkavian", "Brujah", "Lasombra", "Gangrel", "True Brujah") - - my_contact_is_important = TRUE - known_contacts = list( - "Sheriff", - "Seneschal", - "Dealer", - "Tremere Regent", - "Primogens", - "Baron" - ) - - v_duty = "You are the top dog of this city. You hold Praxis over San Francisco, and your word is law. Make sure the Masquerade is upheld, and your status is respected." - -/datum/job/vamp/prince/announce(mob/living/carbon/human/H) - ..() - SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(minor_announce), "Prince [H.real_name] is in the city!")) - -/datum/outfit/job/prince - name = "Prince" - jobtype = /datum/job/vamp/prince - - ears = /obj/item/p25radio - id = /obj/item/card/id/prince - glasses = /obj/item/clothing/glasses/vampire/sun - gloves = /obj/item/clothing/gloves/vampire/latex - uniform = /obj/item/clothing/under/vampire/prince - suit = /obj/item/clothing/suit/vampire/trench/alt - shoes = /obj/item/clothing/shoes/vampire - l_pocket = /obj/item/vamp/phone/prince - r_pocket = /obj/item/vamp/keys/prince - backpack_contents = list(/obj/item/gun/ballistic/automatic/pistol/darkpack/deagle=1, /obj/item/phone_book=1, /obj/item/passport=1, /obj/item/cockclock=1, /obj/item/flashlight=1, /obj/item/masquerade_contract=1, /obj/item/card/credit/prince=1) - - - backpack = /obj/item/storage/backpack - satchel = /obj/item/storage/backpack/satchel - duffelbag = /obj/item/storage/backpack/duffelbag - - implants = list(/obj/item/implant/mindshield) -// accessory = /obj/item/clothing/accessory/medal/gold/captain - -/datum/outfit/job/prince/pre_equip(mob/living/carbon/human/H) - ..() - H.ignores_warrant = TRUE - if(H.gender == FEMALE) - uniform = /obj/item/clothing/under/vampire/prince/female - shoes = /obj/item/clothing/shoes/vampire/heels - -/obj/effect/landmark/start/prince - name = "Prince" - icon_state = "Prince" diff --git a/modular_darkpack/modules/jobs/code/regent.dm b/modular_darkpack/modules/jobs/code/regent.dm deleted file mode 100644 index 95a6d67ef6ae..000000000000 --- a/modular_darkpack/modules/jobs/code/regent.dm +++ /dev/null @@ -1,51 +0,0 @@ - -/datum/job/vamp/regent - title = "Chantry Regent" - department_head = list("Prince") - faction = "Vampire" - total_positions = 1 - spawn_positions = 1 - supervisors = "the Pyramid" - selection_color = "#ab2508" - - outfit = /datum/outfit/job/regent - - access = list(ACCESS_LIBRARY, ACCESS_AUX_BASE, ACCESS_MINING_STATION) - minimal_access = list(ACCESS_LIBRARY, ACCESS_AUX_BASE, ACCESS_MINING_STATION) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - exp_type_department = EXP_TYPE_TREMERE - - my_contact_is_important = TRUE - display_order = JOB_DISPLAY_ORDER_REGENT - v_duty = "Lead the Chantry. You serve as both the Regent and Tremere Primogen. You report to the Tremere Lord of this region first, Prince second." - minimal_masquerade = 4 - minimal_generation = 10 - allowed_species = list("Vampire") - allowed_bloodlines = list("Tremere") - known_contacts = list("Prince") - -/datum/outfit/job/regent - name = "Chantry Regent" - jobtype = /datum/job/vamp/regent - - id = /obj/item/card/id/regent - glasses = /obj/item/clothing/glasses/vampire/perception - suit = /obj/item/clothing/suit/vampire/trench/archive - shoes = /obj/item/clothing/shoes/vampire - gloves = /obj/item/clothing/gloves/vampire/latex - uniform = /obj/item/clothing/under/vampire/archivist - r_pocket = /obj/item/vamp/keys/regent - l_pocket = /obj/item/vamp/phone/tremere - accessory = /obj/item/clothing/accessory/pocketprotector/full - backpack_contents = list(/obj/item/passport=1, /obj/item/phone_book=1, /obj/item/cockclock=1, /obj/item/flashlight=1, /obj/item/arcane_tome=1, /obj/item/card/credit/elder=1, /obj/item/scythe/vamp=1) - -/datum/outfit/job/regent/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == FEMALE) - uniform = /obj/item/clothing/under/vampire/archivist/female - shoes = /obj/item/clothing/shoes/vampire/heels - -/obj/effect/landmark/start/regent - name = "Chantry Regent" - icon_state = "Archivist" diff --git a/modular_darkpack/modules/jobs/code/sabbat.dm b/modular_darkpack/modules/jobs/code/sabbat.dm deleted file mode 100644 index d9307a35d6ab..000000000000 --- a/modular_darkpack/modules/jobs/code/sabbat.dm +++ /dev/null @@ -1,76 +0,0 @@ -/datum/outfit/job/sabbatist - name = "Sabbatist" - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/flashlight - suit = /obj/item/clothing/suit/vampire/trench - id = /obj/item/cockclock - backpack_contents = list(/obj/item/passport=1, /obj/item/vampire_stake=3, /obj/item/gun/ballistic/revolver/darkpack/magnum=1, /obj/item/knife/vamp=1, /obj/item/vamp/keys/hack=1, /obj/item/scythe/vamp=1) - -/datum/outfit/job/sabbatist/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == MALE) - shoes = /obj/item/clothing/shoes/vampire - if(H.clan) - if(H.clan.male_clothes) - uniform = H.clan.male_clothes - else - shoes = /obj/item/clothing/shoes/vampire/heels - if(H.clan) - if(H.clan.female_clothes) - uniform = H.clan.female_clothes - -/datum/outfit/job/sabbatist/post_equip(mob/living/carbon/human/H) - ..() - if(H.mind) - H.mind.add_antag_datum(/datum/antagonist/sabbatist) - GLOB.sabbatites += H - - var/my_name = "Tyler" - if(H.gender == MALE) - my_name = pick(GLOB.first_names_male) - else - my_name = pick(GLOB.first_names_female) - var/my_surname = pick(GLOB.last_names) - H.fully_replace_character_name(null,"[my_name] [my_surname]") - - var/list/landmarkslist = list() - for(var/obj/effect/landmark/start/S in GLOB.start_landmarks_list) - if(S.name == name) - landmarkslist += S - var/obj/effect/landmark/start/D = pick(landmarkslist) - H.forceMove(D.loc) - -/obj/effect/landmark/start/sabbatist - name = "Sabbatist" - delete_after_roundstart = FALSE - -/datum/antagonist/sabbatist - name = "Sabbatist" - roundend_category = "sabbattites" - antagpanel_category = FACTION_SABBAT - job_rank = ROLE_REV - antag_moodlet = /datum/mood_event/revolution - antag_hud_type = ANTAG_HUD_REV - antag_hud_name = "rev" - -/datum/antagonist/sabbatist/on_gain() - add_antag_hud(ANTAG_HUD_REV, "rev", owner.current) - owner.special_role = src - var/datum/objective/custom/custom_objective = new - custom_objective.owner = owner - custom_objective.explanation_text = "Sow chaos, maim, butcher and kill. When you're done The Ivory Tower should be but a distant memory." - objectives += custom_objective - var/datum/objective/survive/survive_objective = new - survive_objective.owner = owner - objectives += survive_objective - owner.current.playsound_local(get_turf(owner.current), 'modular_darkpack/modules/deprecated/sounds/evil_start.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) - return ..() - -/datum/antagonist/sabbatist/on_removal() - ..() - to_chat(owner.current,span_userdanger("You are no longer the part of Sabbat!")) - owner.special_role = null - -/datum/antagonist/sabbatist/greet() - to_chat(owner.current, span_alertsyndie("You are the part of Sabbat.")) - owner.announce_objectives() diff --git a/modular_darkpack/modules/jobs/code/sabbat/ductus.dm b/modular_darkpack/modules/jobs/code/sabbat/ductus.dm new file mode 100644 index 000000000000..434ec4258978 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/sabbat/ductus.dm @@ -0,0 +1,31 @@ +/datum/job/vampire/sabbatductus + title = JOB_SABBAT_DUCTUS + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = "Caine" + config_tag = "SABBAT_DUCTUS" + outfit = /datum/outfit/job/vampire/sabbatductus + allowed_species = list(SPECIES_KINDRED) + job_flags = CITY_JOB_FLAGS + exp_required_type_department = EXP_TYPE_SABBAT + department_for_prefs = /datum/job_department/sabbat + departments_list = list( + /datum/job_department/sabbat, + ) + + description = "You are a Ductus and Pack Leader of your Sabbat pack. You are charged with rebellion against the Elders and the Camarilla, against the Jyhad, against the Masquerade and the Traditions, and the recognition of Caine as the true Dark Father of all Kindred kind. NOTE: BY PLAYING THIS ROLE YOU AGREE TO AND HAVE READ THE SERVER'S RULES ON ESCALATION FOR ANTAGS. KEEP THINGS INTERESTING AND ENGAGING FOR BOTH SIDES. KILLING PLAYERS JUST BECAUSE YOU CAN MAY RESULT IN A ROLEBAN." + minimal_masquerade = 0 + display_order = JOB_DISPLAY_ORDER_SABBATDUCTUS + whitelisted = TRUE + +/datum/outfit/job/vampire/sabbatductus + name = "Sabbat Ductus" + jobtype = /datum/job/vampire/sabbatductus + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/vamp/keys/sabbat + +/datum/outfit/job/vampire/sabbatductus/pre_equip(mob/living/carbon/human/H) + . = ..() + if(H.mind) + H.mind.add_antag_datum(/datum/antagonist/sabbatist) diff --git a/modular_darkpack/modules/jobs/code/sabbat/pack.dm b/modular_darkpack/modules/jobs/code/sabbat/pack.dm new file mode 100644 index 000000000000..57cf56b5e727 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/sabbat/pack.dm @@ -0,0 +1,42 @@ +/datum/job/vampire/sabbatpack + title = JOB_SABBAT_PACK + faction = FACTION_CITY + total_positions = 2 + spawn_positions = 2 + supervisors = "Caine" + config_tag = "SABBAT_PACK" + outfit = /datum/outfit/job/vampire/sabbatpack + job_flags = CITY_JOB_FLAGS + allowed_species = list(SPECIES_KINDRED) + + exp_required_type_department = EXP_TYPE_SABBAT + department_for_prefs = /datum/job_department/sabbat + departments_list = list( + /datum/job_department/sabbat, + ) + + description = "You are a member of the Sabbat. You are charged with rebellion against the Elders and the Camarilla, against the Jyhad, against the Masquerade and the Traditions, and the recognition of Caine as the true Dark Father of all Kindred kind. NOTE: BY PLAYING THIS ROLE YOU AGREE TO AND HAVE READ THE SERVER'S RULES ON ESCALATION FOR ANTAGS. KEEP THINGS INTERESTING AND ENGAGING FOR BOTH SIDES. KILLING PLAYERS JUST BECAUSE YOU CAN MAY RESULT IN A ROLEBAN." + minimal_masquerade = 0 + display_order = JOB_DISPLAY_ORDER_SABBATPACK + whitelisted = TRUE + +/datum/outfit/job/vampire/sabbatpack + name = "Sabbat Pack" + jobtype = /datum/job/vampire/sabbatpack + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/vamp/keys/sabbat + +/datum/outfit/job/vampire/sabbatpack/pre_equip(mob/living/carbon/human/H) + . = ..() + if(H.mind) + H.mind.add_antag_datum(/datum/antagonist/sabbatist) + +// keeping this for lateparty sabbat +/datum/antagonist/sabbatist + name = "Sabbatist" + roundend_category = "sabbattites" + antagpanel_category = FACTION_SABBAT + pref_flag = ROLE_REV + antag_moodlet = /datum/mood_event/revolution + antag_hud_name = "rev" + diff --git a/modular_darkpack/modules/jobs/code/sabbat/priest.dm b/modular_darkpack/modules/jobs/code/sabbat/priest.dm new file mode 100644 index 000000000000..94696bc52740 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/sabbat/priest.dm @@ -0,0 +1,135 @@ +/datum/job/vampire/sabbatpriest + title = JOB_SABBAT_PRIEST + faction = FACTION_CITY + total_positions = 2 + spawn_positions = 2 + supervisors = "Caine" + config_tag = "SABBAT_PRIEST" + outfit = /datum/outfit/job/vampire/sabbatpriest + allowed_species = list(SPECIES_KINDRED) + job_flags = CITY_JOB_FLAGS + exp_required_type_department = EXP_TYPE_SABBAT + department_for_prefs = /datum/job_department/sabbat + departments_list = list( + /datum/job_department/sabbat, + ) + + description = "You are the Sabbat Priest. You are charged with the supervision of the ritae of your pack. You also serve as the second-in-command to the Ductus. Consecrate the Vaulderie for new Sabbat, consult your tome for rites to aid your pack, and ensure the Sabbat live on in Caine's favor. NOTE: BY PLAYING THIS ROLE YOU AGREE TO AND HAVE READ THE SERVER'S RULES ON ESCALATION FOR ANTAGS. KEEP THINGS INTERESTING AND ENGAGING FOR BOTH SIDES. KILLING PLAYERS JUST BECAUSE YOU CAN MAY RESULT IN A ROLEBAN." + minimal_masquerade = 0 + display_order = JOB_DISPLAY_ORDER_SABBATPRIEST + whitelisted = TRUE + +/datum/outfit/job/vampire/sabbatpriest + name = "Sabbat Priest" + jobtype = /datum/job/vampire/sabbatpriest + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/vamp/keys/sabbat + +/datum/outfit/job/vampire/sabbatpriest/pre_equip(mob/living/carbon/human/H) + ..() + if(H.mind) + H.mind.add_antag_datum(/datum/antagonist/sabbatist) + +/obj/item/sabbat_priest_tome + name = "Sabbat Priest's Tome" + desc = "A tome adorned with the symbol of the Sabbat." + icon = 'modular_darkpack/modules/jobs/icons/sabbat.dmi' + icon_state = "sabbat-tome" + +/datum/sabbat_ritae/ritae_description + var/name = "Ritae Description" + var/desc = "Ritae Description" + +/datum/sabbat_ritae/ritae_description/pack_credo + name = "Pack Credo" + desc = "We are the Sword of Caine. We do not bow to the Masquerade. We are not slaves to the Elders, nor tools of the Antediluvians. Through blood and fire, we prepare for Gehenna. We act not in secrecy, but in strength, united as one Pack. Death to traitors. Death to tyrants. Caine wills it.\n" + +/datum/sabbat_ritae/ritae_description/vaulderie_info + name = "The Vaulderie" + desc = "The Vaulderie is a ritual by which a vinculum is established among a pack. It establishes a low level, communal blood bond among its participants. It severs blood bonds, reminding all Cainites to be free from the Elders who usurped Caine. Perform this ritual via the Vaulderie Goblet or Silver Goblet. Each member must drip their vitae into the cup, which is then shared among all participants.\n" + +/datum/sabbat_ritae/ritae_description/shovelhead_info + name = "Creation Rites" + desc = "The Creation Rites we are often slandered for. A Cainite makes their way into the True Sabbat by conquering their fear of fire and death in our lair, walking straight through our campfire. In times of desperation, however, and especially if we feel the need to embrace en masse, we may use the 'shovelhead method', embracing new Cainites and digging them into a shallow grave, awakening their frenzy, their Beast, their true nature... \n" + +/datum/sabbat_ritae/ritae_description/monomacy_info + name = "Monomacy" + desc = "The Rite of Monomacy is a rite which calls two Sabbat Cainites to duel when they may not settle their dispute peacefully or rationally. The challenger uses the Monomacy Circle Rune located within our lair to call the challenged to combat, where the challenged may accept, or decline, the duel. The Priest must decide whether or not the dispute is worthy of monomacy. The challenged Cainite gets to decide the terms of the duel, such as weapons, disciplines allowed or not, torpor or final death, and location... The Priest has ultimate power of the ritae, and the pack, always, and may declare certain duels as null and void.\n" + +/datum/sabbat_ritae/ritae_description/bloodbath_info + name = "Blood Bath" + desc = "The Rite of the Blood Bath is the rite by which the Priest may select a new Ductus, usually taking place after the previous Ductus was challenged to Monomacy. Each Sabbat Cainite who wishes to serve the new Ductus approaches our bathtub, and contributes a large amount of vitae using the ritual knife. The new Ductus then bathes in the blood of the pack which recognizes them, where the Priest then uses the Tome on the bathtub, and upon exiting the bathtub, the Priest is to scoop up the blood in a Vaulderie Goblet, for all to drink of, consecrating the new Pack formation's vinculum. \n" + +/datum/sabbat_ritae/ritae_description/war_party_hunt_info + name = "War Party" + desc = "The Ritus of the War Party may be invoked by using the War Party totem, fashioned from an Elder Cainite's skull. Its dark power calls upon all who have taken part of the Vaulderie in the city to return to our lair to discuss plans for a War Party, where we may strike at the heretics, the pretenders, and the cowards who hide behind the Masquerade. The Elders betrayed Caine, and we are his vengeance made flesh.\n" + +/datum/sabbat_ritae/ritae_description/blood_feast_info + name = "Blood Feast" + desc = "The Blood Feast is a rite of celebration held by the pack, usually when any formal gathering is declared. Each of our Cainites, with the Priest being able to choose whether or not they participate, leaves in a competition for the hunt. Woe unto the Cainite who brings some foul beggar with blood that tastes of dirt. This Rite shall be a competition, to see who may offer the most worthy morsel to the communal pack, whether that is a nosy police officer, a Rogue Sabbat Cainite, or a worthy heretical Cainite for diablerie, the strength of the pack shall be shown, and we shall all feast this night. \n" + +/datum/sabbat_ritae/ritae_description/wild_hunt_info + name = "Wild Hunt" + desc = "None may defy Caine - especially not those who have undertaken the Vaulderie! Traitors and defectors to Caine and the Sabbat shall be struck down with a rightful war party, along with any who know of their treachery. Diablerie, burning them atop our ritual fire with a stake still in their putrid heart, or mutilation may take place, before they are sentenced to death. None may defy Caine, and none may escape Caine's vengeance, not the Elders of the Camarilla or traitors to the pack.\n " + +/obj/item/sabbat_priest_tome/attack_self(mob/living/carbon/human/user) + if(!user.mind || !is_sabbatist(user)) + to_chat(user, "You feel nothing when you touch this tome.") + return + + var/is_priest = is_sabbat_priest(user) + + var/original_icon_state = icon_state + icon_state = "[original_icon_state]-open" + addtimer(CALLBACK(src, PROC_REF(close_book)), 10 SECONDS) + + to_chat(user, "These are the Auctoritas Ritae given to you by Caine.") + + // Define all ritae datums + var/list/ritae_datums = list( + "Pack Credo" = new /datum/sabbat_ritae/ritae_description/pack_credo(), + "Vaulderie" = new /datum/sabbat_ritae/ritae_description/vaulderie_info(), + "Shovelhead" = new /datum/sabbat_ritae/ritae_description/shovelhead_info(), + "Monomacy" = new /datum/sabbat_ritae/ritae_description/monomacy_info(), + "Blood Bath" = new /datum/sabbat_ritae/ritae_description/bloodbath_info(), + "War Party" = new /datum/sabbat_ritae/ritae_description/war_party_hunt_info(), + "Blood Feast" = new /datum/sabbat_ritae/ritae_description/blood_feast_info(), + "Wild Hunt" = new /datum/sabbat_ritae/ritae_description/wild_hunt_info() + ) + + var/list/ritae_options = list() + + // Everyone can see "Pack Credo" + if(is_priest) + ritae_options += "Pack Credo (Edit)" + else + ritae_options += "Pack Credo" + + // Only Priests can see other ritae + if(is_priest) + for(var/name in ritae_datums) + if(name != "Pack Credo") + ritae_options += name + + var/choice = tgui_input_list(user, "Select a Rite to learn about:", "Sabbat Ritae", ritae_options) + if(!choice) + return + + if(choice == "Pack Credo (Edit)") + var/datum/sabbat_ritae/ritae_description/pack_credo/credo = ritae_datums["Pack Credo"] + to_chat(user, span_cult("<b>Pack Credo:</b>")) + to_chat(user, span_cult("[credo.desc]")) + + var/new_credo = tgui_input_text(user, "Enter your interpretation of the Sabbat's goals:", "Edit Pack Credo", credo.desc) + if(new_credo && new_credo != credo.desc) + credo.desc = new_credo + to_chat(user, span_cult("You update your pack's interpretation of the Sabbat Credo.")) + return + + var/datum/sabbat_ritae/ritae_description/ritus = ritae_datums[choice] + if(ritus) + to_chat(user, span_cult("<b>[ritus.name]:</b>")) + to_chat(user, span_cult("[ritus.desc]")) + +/obj/item/sabbat_priest_tome/proc/close_book() + icon_state = initial(icon_state) diff --git a/modular_darkpack/modules/jobs/code/sabbat/sabbat.dm b/modular_darkpack/modules/jobs/code/sabbat/sabbat.dm new file mode 100644 index 000000000000..25862dbab5c3 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/sabbat/sabbat.dm @@ -0,0 +1,35 @@ +/datum/outfit/job/vampire/sabbatist + name = JOB_SABBAT_SABBATIST + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/flashlight + suit = /obj/item/clothing/suit/vampire/trench + backpack_contents = list(/obj/item/vampire_stake=3, /obj/item/gun/ballistic/revolver/darkpack/magnum=1, /obj/item/knife/vamp=1, /obj/item/vamp/keys/hack=1, /obj/item/scythe/vamp=1, /obj/item/vamp/keys/sabbat=1) + +/datum/outfit/job/vampire/sabbatist/post_equip(mob/living/carbon/human/H) + ..() + if(H.mind) + H.mind.add_antag_datum(/datum/antagonist/sabbatist) + GLOB.sabbatites += H + + var/list/landmarkslist = list() + for(var/obj/effect/landmark/start/S in GLOB.start_landmarks_list) + if(S.name == name) + landmarkslist += S + var/obj/effect/landmark/start/D = pick(landmarkslist) + H.forceMove(D.loc) + +/datum/antagonist/sabbatist + name = "Sabbatist" + roundend_category = "sabbattites" + antagpanel_category = FACTION_SABBAT + pref_flag = ROLE_SABBAT + antag_moodlet = /datum/mood_event/revolution + antag_hud_name = "rev" + +/datum/antagonist/sabbatist/on_removal() + to_chat(owner.current, span_userdanger("You are no longer the part of Sabbat!")) + return ..() + +/datum/antagonist/sabbatist/greet() + to_chat(owner.current, span_alertsyndie("You are now part of the Sabbat.")) + owner.announce_objectives() diff --git a/modular_darkpack/modules/jobs/code/seneschal.dm b/modular_darkpack/modules/jobs/code/seneschal.dm deleted file mode 100644 index 2d3a6a4f6d00..000000000000 --- a/modular_darkpack/modules/jobs/code/seneschal.dm +++ /dev/null @@ -1,73 +0,0 @@ - -/datum/job/vamp/clerk - title = "Seneschal" - auto_deadmin_role_flags = DEADMIN_POSITION_HEAD - department_head = list("Prince") - head_announce = list(RADIO_CHANNEL_SUPPLY, RADIO_CHANNEL_SERVICE) - faction = "Vampire" - total_positions = 1 - spawn_positions = 1 - supervisors = "the prince" - selection_color = "#bd3327" - req_admin_notify = 1 - minimal_player_age = 10 - exp_requirements = 180 - exp_type = EXP_TYPE_CREW - exp_type_department = EXP_TYPE_NEUTRALS - - outfit = /datum/outfit/job/clerk - - access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS, - ACCESS_MEDICAL, ACCESS_PSYCHOLOGY, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, - ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, - ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER, - ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, - ACCESS_MECH_MINING, ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY, ACCESS_MECH_MEDICAL, - ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_AUX_BASE, ACCESS_TELEPORTER) - minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS, - ACCESS_MEDICAL, ACCESS_PSYCHOLOGY, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, - ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, - ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER, - ACCESS_MECH_MINING, ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY, ACCESS_MECH_MEDICAL, - ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, - ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_AUX_BASE, ACCESS_TELEPORTER) - paycheck = PAYCHECK_COMMAND - paycheck_department = ACCOUNT_SRV - bounty_types = CIV_JOB_RANDOM - - liver_traits = list(TRAIT_ROYAL_METABOLISM) - - display_order = JOB_DISPLAY_ORDER_CLERK - -// minimal_generation = 12 //Uncomment when players get exp enough - minimal_masquerade = 5 - - my_contact_is_important = TRUE - known_contacts = list("Prince","Sheriff","Tremere Regent","Dealer","Primogens") - - v_duty = "You are the right hand man or woman of the most powerful vampire in the city. The Camarilla trusts you to run the city, even in their stead." - duty = "You are the right hand man or woman of the most powerful vampire in the city. The Camarilla trusts you to run the city, even in their stead." - allowed_bloodlines = list("Daughters of Cacophony", "True Brujah", "Brujah", "Tremere", "Ventrue", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Giovanni", "Ministry", "Lasombra", "Gargoyle", "Kiasyd") - -/datum/outfit/job/clerk - name = "Seneschal" - jobtype = /datum/job/vamp/clerk - - ears = /obj/item/p25radio - id = /obj/item/card/id/clerk - uniform = /obj/item/clothing/under/vampire/clerk - shoes = /obj/item/clothing/shoes/vampire/brown -// head = /obj/item/clothing/head/hopcap - l_pocket = /obj/item/vamp/phone/clerk - r_pocket = /obj/item/vamp/keys/clerk - backpack_contents = list(/obj/item/passport=1, /obj/item/phone_book=1, /obj/item/cockclock=1, /obj/item/flashlight=1, /obj/item/card/credit/seneschal=1) - -/datum/outfit/job/clerk/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == FEMALE) - uniform = /obj/item/clothing/under/vampire/clerk/female - shoes = /obj/item/clothing/shoes/vampire/heels - -/obj/effect/landmark/start/clerk - name = "Seneschal" - icon_state = "Clerk" diff --git a/modular_darkpack/modules/jobs/code/sheriff.dm b/modular_darkpack/modules/jobs/code/sheriff.dm deleted file mode 100644 index 15d17fe57f60..000000000000 --- a/modular_darkpack/modules/jobs/code/sheriff.dm +++ /dev/null @@ -1,77 +0,0 @@ -/datum/job/vamp/sheriff - title = "Sheriff" - auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY - department_head = list("Prince") - head_announce = list(RADIO_CHANNEL_SECURITY) - faction = "Vampire" - total_positions = 1 - spawn_positions = 1 - supervisors = "the prince" - selection_color = "#bd3327" - req_admin_notify = 1 - minimal_player_age = 14 - exp_requirements = 300 - exp_type = EXP_TYPE_CREW - exp_type_department = EXP_TYPE_CAMARILLIA - - outfit = /datum/outfit/job/sheriff - - mind_traits = list(TRAIT_DONUT_LOVER) - liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM, TRAIT_ROYAL_METABOLISM) - - access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MECH_SECURITY, - ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_AUX_BASE, - ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, ACCESS_EVA, ACCESS_TELEPORTER, - ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MECH_SECURITY, - ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_AUX_BASE, - ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, ACCESS_EVA, - ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) - paycheck = PAYCHECK_COMMAND - paycheck_department = ACCOUNT_SEC - - display_order = JOB_DISPLAY_ORDER_SHERIFF - bounty_types = CIV_JOB_SEC - - minimal_generation = 12 //Uncomment when players get exp enough - minimal_masquerade = 5 - allowed_species = list("Vampire") - allowed_bloodlines = list("True Brujah", "Brujah", "Tremere", "Ventrue", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Giovanni", "Ministry", "Lasombra") - - my_contact_is_important = TRUE - known_contacts = list("Prince","Seneschal","Dealer") - - v_duty = "Protect the Prince and the Masquerade. You are their sword." - -/datum/outfit/job/sheriff - name = "Sheriff" - jobtype = /datum/job/vamp/sheriff - - ears = /obj/item/p25radio - id = /obj/item/card/id/sheriff - uniform = /obj/item/clothing/under/vampire/sheriff - belt = /obj/item/storage/belt/sheath/vamp/rapier - shoes = /obj/item/clothing/shoes/vampire/jackboots - suit = /obj/item/clothing/suit/vampire/vest - gloves = /obj/item/clothing/gloves/vampire/leather -// head = /obj/item/clothing/head/hos/beret - glasses = /obj/item/clothing/glasses/vampire/sun - r_pocket = /obj/item/vamp/keys/sheriff - l_pocket = /obj/item/vamp/phone/sheriff - backpack_contents = list(/obj/item/gun/ballistic/automatic/pistol/darkpack/deagle=1, /obj/item/vampire_stake=3, /obj/item/passport=1, /obj/item/cockclock=1, /obj/item/flashlight=1, /obj/item/masquerade_contract=1, /obj/item/card/credit/elder=1) - - backpack = /obj/item/storage/backpack - satchel = /obj/item/storage/backpack/satchel - duffelbag = /obj/item/storage/backpack/duffelbag - - implants = list(/obj/item/implant/mindshield) - -/datum/outfit/job/sheriff/pre_equip(mob/living/carbon/human/H) - ..() - H.ignores_warrant = TRUE - if(H.gender == FEMALE) - uniform = /obj/item/clothing/under/vampire/sheriff/female - -/obj/effect/landmark/start/sheriff - name = "Sheriff" - icon_state = "Sheriff" diff --git a/modular_darkpack/modules/jobs/code/stripper.dm b/modular_darkpack/modules/jobs/code/stripper.dm deleted file mode 100644 index ac9f1ed3a479..000000000000 --- a/modular_darkpack/modules/jobs/code/stripper.dm +++ /dev/null @@ -1,44 +0,0 @@ - -/datum/job/vamp/strip - title = "Stripper" - faction = "Vampire" - total_positions = 4 - spawn_positions = 4 - supervisors = "the Camarilla or the Anarchs" - selection_color = "#e3e3e3" - access = list() - minimal_access = list() - outfit = /datum/outfit/job/strip - antag_rep = 7 - paycheck = PAYCHECK_ASSISTANT // Get a job. Job reassignment changes your paycheck now. Get over it. - exp_type_department = EXP_TYPE_SERVICES - - paycheck_department = ACCOUNT_CIV - display_order = JOB_DISPLAY_ORDER_STRIP - allowed_species = list("Vampire", "Ghoul", "Human", "Werewolf", "Kuei-Jin") - - v_duty = "Offer strip club services to humans, undead or anything else that walks through the door." - duty = "Offer strip club services. Some of your clientele may be... Unusual, but you are either addicted to vampire bites, or bribed to listen little and say even less." - minimal_masquerade = 3 - allowed_bloodlines = list("True Brujah", "Daughters of Cacophony", "Salubri", "Baali", "Brujah", "Tremere", "Ventrue", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Giovanni", "Ministry", "Tzimisce", "Lasombra", "Caitiff", "Kiasyd") - -/datum/outfit/job/strip - name = "Stripper" - jobtype = /datum/job/vamp/citizen - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/vamp/keys/strip - id = /obj/item/cockclock - backpack_contents = list(/obj/item/passport=1, /obj/item/flashlight=1, /obj/item/card/credit=1) - -/datum/outfit/job/strip/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == MALE) - shoes = /obj/item/clothing/shoes/vampire/white - uniform = /obj/item/clothing/under/vampire/slickback - else - shoes = /obj/item/clothing/shoes/vampire/heels - uniform = /obj/item/clothing/under/vampire/burlesque - -/obj/effect/landmark/start/strip - name = "Strip" - icon_state = "Assistant" diff --git a/modular_darkpack/modules/jobs/code/supply/dealer.dm b/modular_darkpack/modules/jobs/code/supply/dealer.dm new file mode 100644 index 000000000000..12671e3288c6 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/supply/dealer.dm @@ -0,0 +1,33 @@ +/datum/job/vampire/dealer + title = "Dealer" + faction = FACTION_CITY + total_positions = 2 + spawn_positions = 2 + supervisors = "nobody. You are beholden only to yourself." + config_tag = "DEALER" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/dealer + + display_order = JOB_DISPLAY_ORDER_DEALER + exp_required_type_department = EXP_TYPE_WAREHOUSE + department_for_prefs = /datum/job_department/supply + departments_list = list( + /datum/job_department/supply, + ) + + known_contacts = list("Prince", "Seneschal", "Sheriff", "Baron") + allowed_species = list(SPECIES_HUMAN) + species_slots = list(SPECIES_HUMAN = 1) + + description = "You provide both legal and illegal supplies to those that get busy during the night. You are your own person yet you know people are out for you. Time to buckle in..." + minimal_masquerade = 0 + +/datum/outfit/job/vampire/dealer + name = "Dealer" + jobtype = /datum/job/vampire/dealer + uniform = /obj/item/clothing/under/vampire/suit + shoes = /obj/item/clothing/shoes/vampire/jackboots + id = /obj/item/card/dealer + l_pocket = /obj/item/smartphone/dealer + r_pocket = /obj/item/vamp/keys/supply + backpack_contents = list(/obj/item/card/credit/rich=1, /obj/item/hatchet) diff --git a/modular_darkpack/modules/jobs/code/supply/supply_tech.dm b/modular_darkpack/modules/jobs/code/supply/supply_tech.dm new file mode 100644 index 000000000000..9a2d7f370c0c --- /dev/null +++ b/modular_darkpack/modules/jobs/code/supply/supply_tech.dm @@ -0,0 +1,31 @@ +/datum/job/vampire/supply + title = "Supply Technician" + faction = FACTION_CITY + total_positions = 8 + spawn_positions = 8 + supervisors = "the Dealer" + config_tag = "SUPPLY" + job_flags = CITY_JOB_FLAGS + outfit = /datum/outfit/job/vampire/supply_tech + + display_order = JOB_DISPLAY_ORDER_SUPPLY + exp_required_type_department = EXP_TYPE_WAREHOUSE + department_for_prefs = /datum/job_department/supply + departments_list = list( + /datum/job_department/supply, + ) + + allowed_species = list(SPECIES_KINDRED, SPECIES_GHOUL, SPECIES_HUMAN) + + description = "You work at the warehouse, moving boxes and selling not-quite legal goods to anyone who has the money." + minimal_masquerade = 0 + +/datum/outfit/job/vampire/supply_tech + name = "Supply Technician" + jobtype = /datum/job/vampire/supply + uniform = /obj/item/clothing/under/vampire/suit + shoes = /obj/item/clothing/shoes/vampire/jackboots + id = /obj/item/card/supplytech + l_pocket = /obj/item/smartphone/supply_tech + r_pocket = /obj/item/vamp/keys/supply + backpack_contents = list(/obj/item/card/credit=1, /obj/item/clothing/mask/vampire/balaclava =1, /obj/item/gun/ballistic/automatic/pistol/darkpack/beretta=2,/obj/item/ammo_box/magazine/semi9mm=2, /obj/item/knife/vamp) diff --git a/modular_darkpack/modules/jobs/code/supply_assistant.dm b/modular_darkpack/modules/jobs/code/supply_assistant.dm deleted file mode 100644 index 20c27f458b96..000000000000 --- a/modular_darkpack/modules/jobs/code/supply_assistant.dm +++ /dev/null @@ -1,45 +0,0 @@ - -/datum/job/vamp/supply - title = "Supply Technician" - department_head = list("Dealer") - faction = "Vampire" - total_positions = 4 - spawn_positions = 4 - supervisors = "the Dealer" - selection_color = "#edc009" - exp_type_department = EXP_TYPE_WAREHOUSE - - outfit = /datum/outfit/job/supply - - access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM, ACCESS_MECH_MINING) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_CAR - display_order = JOB_DISPLAY_ORDER_SUPPLY - bounty_types = CIV_JOB_RANDOM - allowed_species = list("Vampire", "Ghoul", "Human", "Kuei-Jin") - known_contacts = list("Dealer") - allowed_bloodlines = list("True Brujah", "Daughters of Cacophony", "Brujah", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Tzimisce", "Caitiff", "Lasombra", "Gargoyle", "Kiasyd", "Cappadocian") - - v_duty = "You work for the Dealer, or are a part of their coterie. They pay well and the job is easy. Don't disappoint them." - duty = "Though your boss is odd and only works late night hours, they pay you well enough that you avoid questioning it." - minimal_masquerade = 2 - -/datum/outfit/job/supply - name = "Supply Technician" - jobtype = /datum/job/vamp/supply - - id = /obj/item/card/id/supplytech - uniform = /obj/item/clothing/under/vampire/supply - gloves = /obj/item/clothing/gloves/vampire/work - l_pocket = /obj/item/vamp/phone/supply_tech - r_pocket = /obj/item/vamp/keys/supply - shoes = /obj/item/clothing/shoes/vampire/jackboots - backpack_contents = list(/obj/item/passport=1, /obj/item/phone_book=1, /obj/item/cockclock=1, /obj/item/flashlight=1, /obj/item/card/credit=1) - -/datum/outfit/job/supply/pre_equip(mob/living/carbon/human/H) - ..() - -/obj/effect/landmark/start/supplytechnician - name = "Supply Technician" - icon_state = "Supply Technician" diff --git a/modular_darkpack/modules/jobs/code/swat.dm b/modular_darkpack/modules/jobs/code/swat.dm deleted file mode 100644 index ede30bc484b0..000000000000 --- a/modular_darkpack/modules/jobs/code/swat.dm +++ /dev/null @@ -1,366 +0,0 @@ -/datum/outfit/job/swat - name = "Swat Officer" - ears = /obj/item/p25radio/police/tactical - uniform = /obj/item/clothing/under/vampire/police/utility - mask = /obj/item/clothing/mask/vampire/balaclava - r_pocket = /obj/item/flashlight - l_pocket = /obj/item/vamp/keys/police - shoes = /obj/item/clothing/shoes/vampire/jackboots - belt = /obj/item/gun/ballistic/automatic/darkpack/ar15 - suit = /obj/item/clothing/suit/vampire/vest/police - head = /obj/item/clothing/head/vampire/helmet - id = /obj/item/card/id/police - backpack_contents = list( - /obj/item/ammo_box/magazine/darkpack556 = 4, - /obj/item/radio/cop = 1, - /obj/item/storage/medkit/darkpack/ifak = 1, - /obj/item/vamp/keys/hack=2 - ) - -/datum/antagonist/swat/proc/equip_swat() - var/mob/living/carbon/human/H = owner.current - if(!ishuman(owner.current)) - return - H.equipOutfit(swat_outfit) - H.set_species(/datum/species/human) - H.set_clan(null) - H.generation = 13 - H.st_set_stat(5, STAT_LARCENY) - H.st_set_stat(4, STAT_STRENGTH) - H.ignores_warrant = TRUE - - for(var/datum/action/A in H.actions) - if(A.vampiric) - A.Remove(H) - H.thaumaturgy_knowledge = FALSE - var/obj/item/organ/eyes/NV = new() - NV.Insert(H, TRUE, FALSE) - - var/list/landmarkslist = list() - for(var/obj/effect/landmark/start/S in GLOB.start_landmarks_list) - if(S.name == name) - landmarkslist += S - var/obj/effect/landmark/start/D = pick(landmarkslist) - H.forceMove(D.loc) - -/obj/effect/landmark/start/swat - name = "Swat Officer" - delete_after_roundstart = FALSE - -/datum/antagonist/swat - name = "Swat Officer" - roundend_category = "Swat" - antagpanel_category = "Swat" - job_rank = ROLE_SWAT - antag_hud_type = ANTAG_HUD_OPS - antag_hud_name = "synd" - antag_moodlet = /datum/mood_event/focused - show_to_ghosts = TRUE - var/always_new_team = FALSE - var/datum/team/swat/swat_team - var/swat_outfit = /datum/outfit/job/swat - var/custom_objective - -/datum/antagonist/swat/team_leader - name = "Swat Team Leader" - always_new_team = TRUE - var/title - -/datum/antagonist/swat/on_gain() - randomize_appearance() - forge_objectives() - add_antag_hud(ANTAG_HUD_OPS, "synd", owner.current) - owner.special_role = src - equip_swat() - give_alias() - return ..() - -/datum/antagonist/swat/on_removal() - ..() - to_chat(owner.current,span_userdanger("You are no longer in the Special Weapons and Tactics squad!")) - owner.special_role = null - -/datum/antagonist/swat/greet() - to_chat(owner.current, span_alertsyndie("You're in the Special Weapons and Tactics squad.")) - to_chat(owner, span_notice("You are a [swat_team ? swat_team.swat_name : "swat"] officer!")) - spawn(3 SECONDS) - owner.announce_objectives() - - -/datum/antagonist/swat/proc/give_alias() - var/my_name = "Tyler" - var/list/swat_ranks = list("Private", "Private First Class", "Lance Corporal", "Corporal") - var/selected_rank = pick(swat_ranks) - if(owner.current.gender == MALE) - my_name = pick(GLOB.first_names_male) - else - my_name = pick(GLOB.first_names_female) - var/my_surname = pick(GLOB.last_names) - owner.current.fully_replace_character_name(null,"[selected_rank] [my_name] [my_surname]") - -/datum/antagonist/swat/proc/forge_objectives() - spawn(2 SECONDS) - if(swat_team) - objectives |= swat_team.objectives - -/datum/antagonist/swat/leader/give_alias() - var/my_name = "Tyler" - if(owner.current.gender == MALE) - my_name = pick(GLOB.first_names_male) - else - my_name = pick(GLOB.first_names_female) - var/my_surname = pick(GLOB.last_names) - owner.current.fully_replace_character_name(null,"Squad Leader [my_name] [my_surname]") - -/datum/team/swat/antag_listing_name() - if(swat_name) - return "[swat_name] Officers" - else - return "Officers" - - -/datum/antagonist/swat/leader/greet() - to_chat(owner, "<B>You are the SWAT Officer in charge of this mission. You are responsible for guiding your team's operation.</B>") - to_chat(owner, "<B>If you feel you are not up to this task, give your command to another officer.</B>") - spawn(3 SECONDS) - owner.announce_objectives() - addtimer(CALLBACK(src, PROC_REF(swatteam_name_assign)), 1) - -/datum/antagonist/swat/leader/proc/swatteam_name_assign() - if(!swat_team) - return - swat_team.rename_team(ask_name()) - -/datum/antagonist/swat/leader/proc/ask_name() - var/randomname = pick(GLOB.last_names) - var/newname = stripped_input(owner.current,"You are the squa leader. Please choose a name for your team.", "Name change",randomname) - if (!newname) - newname = randomname - else - newname = reject_bad_name(newname) - if(!newname) - newname = randomname - -/datum/antagonist/swat/create_team(datum/team/swat/new_team) - if(!new_team) - if(!always_new_team) - for(var/datum/antagonist/swat/N in GLOB.antagonists) - if(!N.owner) - stack_trace("Antagonist datum without owner in GLOB.antagonists: [N]") - continue - swat_team = new /datum/team/swat - swat_team.update_objectives() - return - if(!istype(swat_team)) - stack_trace("Wrong team type passed to [type] initialization.") - swat_team = new_team - -/datum/antagonist/swat/admin_add(datum/mind/new_owner,mob/admin) - new_owner.assigned_role = ROLE_SWAT - new_owner.add_antag_datum(src) - message_admins("[key_name_admin(admin)] has swat'd [key_name_admin(new_owner)].") - log_admin("[key_name(admin)] has swat'd [key_name(new_owner)].") - -/datum/random_gen/swat - var/hair_colors = list("040404", //Black - "120b05", //Dark Brown - "342414", //Brown - "554433", //Light Brown - "695c3b", //Dark Blond - "ad924e", //Blond - "dac07f", //Light Blond - "802400", //Ginger - "a5380e", //Ginger alt - "ffeace", //Albino - "650b0b", //Punk Red - "14350e", //Punk Green - "080918") //Punk Blue - - var/male_hair = list("Balding Hair", - "Bedhead", - "Bedhead 2", - "Bedhead 3", - "Boddicker", - "Business Hair", - "Business Hair 2", - "Business Hair 3", - "Business Hair 4", - "Coffee House", - "Combover", - "Crewcut", - "Father", - "Flat Top", - "Gelled Back", - "Joestar", - "Keanu Hair", - "Oxton", - "Volaju") - - var/male_facial = list("Beard (Abraham Lincoln)", - "Beard (Chinstrap)", - "Beard (Full)", - "Beard (Cropped Fullbeard)", - "Beard (Hipster)", - "Beard (Neckbeard)", - "Beard (Three o Clock Shadow)", - "Beard (Five o Clock Shadow)", - "Beard (Seven o Clock Shadow)", - "Moustache (Hulk Hogan)", - "Moustache (Watson)", - "Sideburns (Elvis)", - "Sideburns") - - var/female_hair = list("Ahoge", - "Long Bedhead", - "Beehive", - "Beehive 2", - "Bob Hair", - "Bob Hair 2", - "Bob Hair 3", - "Bob Hair 4", - "Bobcurl", - "Braided", - "Braided Front", - "Braid (Short)", - "Braid (Low)", - "Bun Head", - "Bun Head 2", - "Bun Head 3", - "Bun (Large)", - "Bun (Tight)", - "Double Bun", - "Emo", - "Emo Fringe", - "Feather", - "Gentle", - "Long Hair 1", - "Long Hair 2", - "Long Hair 3", - "Long Over Eye", - "Long Emo", - "Long Fringe", - "Ponytail", - "Ponytail 2", - "Ponytail 3", - "Ponytail 4", - "Ponytail 5", - "Ponytail 6", - "Ponytail 7", - "Ponytail (High)", - "Ponytail (Short)", - "Ponytail (Long)", - "Ponytail (Country)", - "Ponytail (Fringe)", - "Poofy", - "Short Hair Rosa", - "Shoulder-length Hair", - "Volaju") - -/datum/antagonist/swat/proc/randomize_appearance() - var/datum/random_gen/swat/h_gen = new - var/mob/living/carbon/human/H = owner.current - - H.name = H.real_name - H.dna.real_name = H.real_name - H.gender = pick(MALE, FEMALE) - H.body_type = H.gender - H.age = rand(18, 36) - - H.set_haircolor(pick(h_gen.hair_colors)) - H.set_facial_haircolor(H.hair_color) - if(H.gender == MALE) - H.set_hairstyle(pick(h_gen.male_hair)) - if(prob(25) || H.age >= 25) - H.set_faical_hairstyle(pick(h_gen.male_facial)) - else - H.set_facial_hairstyle("Shaved") - else - H.set_hairstyle(pick(h_gen.female_hair)) - H.set_facial_hairstyle("Shaved") - - H.set_eye_color(random_eye_color()) - - H.underwear = random_underwear(H.gender) - if(prob(50)) - H.underwear_color = organ_eyes.eye_color - if(prob(50) || H.gender == FEMALE) - H.undershirt = random_undershirt(H.gender) - if(prob(25)) - H.socks = random_socks() - - H.update_body() - -/datum/team/swat/proc/rename_team(new_name) - swat_name = new_name - name = "[swat_name] Team" - -/datum/team/swat - var/swat_name - var/core_objective = /datum/objective/swat - member_name = "Swat Officer" - var/memorized_code - var/list/team_discounts - var/obj/item/nuclear_challenge/war_button - -/datum/team/swat/New() - ..() - swat_name = swat_name() - -/datum/team/swat/proc/update_objectives() - if(core_objective) - var/datum/objective/O = new core_objective - O.team = src - objectives += O - - -/datum/team/swat/roundend_report() - var/list/parts = list() - parts += span_header("[swat_name] Operatives:") - - var/text = "<br>[span_header("The SWAT were:")]" - text += printplayerlist(members) - parts += text - - return "<div class='panel redborder'>[parts.Join("<br>")]</div>" - - - - -////////////////////////////////////////////// -// // -// SWAT (MIDROUND) // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/midround/from_ghosts/swat - name = "Swat Officer" - antag_flag = ROLE_SWAT - antag_datum = /datum/antagonist/swat - required_candidates = 1 - weight = 5 - cost = 35 - requirements = list(90,90,90,80,60,40,30,20,10,10) - var/list/operative_cap = list(2,2,3,3,4,5,5,5,5,5) - var/datum/team/swat/swat_team - flags = HIGHLANDER_RULESET - -/datum/dynamic_ruleset/midround/from_ghosts/swat/acceptable(population=0, threat=0) - indice_pop = min(operative_cap.len, round(living_players.len/5)+1) - required_candidates = max(5, operative_cap[indice_pop]) - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/swat/ready(forced = FALSE) - if (required_candidates > (dead_players.len + list_observers.len)) - return FALSE - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/swat/finish_setup(mob/new_character, index) - new_character.mind.special_role = "Swat Officer" - new_character.mind.assigned_role = "Swat Officer" - if (index == 1) // Our first guy is the leader - var/datum/antagonist/swat/leader/new_role = new - swat_team = new_role.swat_team - new_character.mind.add_antag_datum(new_role) - else - return ..() - diff --git a/modular_darkpack/modules/jobs/code/taxi.dm b/modular_darkpack/modules/jobs/code/taxi.dm deleted file mode 100644 index e7360ec2dbea..000000000000 --- a/modular_darkpack/modules/jobs/code/taxi.dm +++ /dev/null @@ -1,62 +0,0 @@ -/datum/job/vamp/taxi - title = "Taxi Driver" - department_head = list("Justicar") - faction = "Vampire" - total_positions = 3 - spawn_positions = 3 - supervisors = " the Traditions" - selection_color = "#e3e3e3" - - outfit = /datum/outfit/job/taxi - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_TAXI - exp_type_department = EXP_TYPE_SERVICES - - allowed_species = list("Vampire", "Ghoul", "Human", "Werewolf", "Kuei-Jin") - - v_duty = "Drive people in the city." - duty = "Drive people in the city." - minimal_masquerade = 0 - allowed_bloodlines = list("Daughters of Cacaphony", "Salubri", "Baali", "Brujah", "Tremere", "Ventrue", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Giovanni", "Ministry", "Tzimisce", "Lasombra", "Caitiff", "Kiasyd", "Cappadocian") - -/datum/job/vamp/taxi/after_spawn(mob/living/H, mob/M, latejoin = FALSE) - ..() - H.taxist = TRUE - -/datum/outfit/job/taxi - name = "Taxi Driver" - jobtype = /datum/job/vamp/taxi - - id = /obj/item/cockclock - glasses = /obj/item/clothing/glasses/vampire/sun - uniform = /obj/item/clothing/under/vampire/suit - shoes = /obj/item/clothing/shoes/vampire - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/vamp/keys/taxi - backpack_contents = list(/obj/item/passport=1, /obj/item/flashlight=1, /obj/item/card/credit=1, /obj/item/melee/vamp/tire=1) - -/datum/outfit/job/taxi/pre_equip(mob/living/carbon/human/H) - ..() - if(H.clan) - if(H.gender == MALE) - shoes = /obj/item/clothing/shoes/vampire - if(H.clan.male_clothes) - uniform = H.clan.male_clothes - else - shoes = /obj/item/clothing/shoes/vampire/heels - if(H.clan.female_clothes) - uniform = H.clan.female_clothes - else - if(H.gender == MALE) - shoes = /obj/item/clothing/shoes/vampire - uniform = /obj/item/clothing/under/vampire/sport - else - shoes = /obj/item/clothing/shoes/vampire/heels - uniform = /obj/item/clothing/under/vampire/red - -/obj/effect/landmark/start/taxi - name = "Taxi Driver" diff --git a/modular_darkpack/modules/jobs/code/tremere/archivist.dm b/modular_darkpack/modules/jobs/code/tremere/archivist.dm new file mode 100644 index 000000000000..976a464ec7a1 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/tremere/archivist.dm @@ -0,0 +1,35 @@ +/datum/job/vampire/archivist + title = JOB_CHANTRY_ARCHIVIST + faction = FACTION_CITY + total_positions = 4 + spawn_positions = 4 + supervisors = SUPERVISOR_REGENT + config_tag = "CHANTRY_ARCHIVIST" + outfit = /datum/outfit/job/vampire/archivist + job_flags = CITY_JOB_FLAGS + exp_required_type_department = EXP_TYPE_CHANTRY + department_for_prefs = /datum/job_department/chantry + departments_list = list( + /datum/job_department/chantry, + ) + display_order = JOB_DISPLAY_ORDER_ARCHIVIST + + description = "Keep a census of events and provide information to neonates. Listen to the Regent Carefully. Study blood magic and protect the chantry." + minimal_masquerade = 3 + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_TREMERE) + known_contacts = list("Tremere Regent") + +/datum/outfit/job/vampire/archivist + name = "Archivist" + jobtype = /datum/job/vampire/archivist + + id = /obj/item/card/archive + glasses = /obj/item/clothing/glasses/vampire/perception + shoes = /obj/item/clothing/shoes/vampire + gloves = /obj/item/clothing/gloves/vampire/latex + uniform = /obj/item/clothing/under/vampire/archivist + r_pocket = /obj/item/vamp/keys/archive + l_pocket = /obj/item/smartphone/archivist + accessory = /obj/item/clothing/accessory/pocketprotector/full + backpack_contents = list(/obj/item/ritual_tome/arcane=1, /obj/item/card/credit=1, /obj/item/scythe/vamp=1) diff --git a/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm b/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm new file mode 100644 index 000000000000..cf274f5b33cb --- /dev/null +++ b/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm @@ -0,0 +1,41 @@ +/datum/job/vampire/gargoyle + title = JOB_CHANTRY_GARGOYLE + faction = FACTION_CITY + total_positions = 5 + spawn_positions = 5 + supervisors = SUPERVISOR_REGENT + config_tag = "CHANTRY_GARGOYLE" + outfit = /datum/outfit/job/vampire/gargoyle + job_flags = CITY_JOB_FLAGS + exp_required_type_department = EXP_TYPE_CHANTRY + department_for_prefs = /datum/job_department/chantry + departments_list = list( + /datum/job_department/chantry, + ) + display_order = JOB_DISPLAY_ORDER_GARGOYLE + + description = "An agent of the Chantry, you are a Tremere Gargoyle who was made legally having existed before their creation was banned. Serve the Regent well!" + minimal_masquerade = 3 + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_GARGOYLE) + known_contacts = list("Tremere Regent") + +/datum/outfit/job/vampire/gargoyle + name = "Chantry Gargoyle" + jobtype = /datum/job/vampire/gargoyle + + id = /obj/item/card/archive + glasses = /obj/item/clothing/glasses/vampire/red + shoes = /obj/item/clothing/shoes/vampire + gloves = /obj/item/clothing/gloves/vampire/work + uniform = /obj/item/clothing/under/vampire/turtleneck_black + suit = /obj/item/clothing/suit/hooded/robes/tremere + mask = /obj/item/clothing/mask/vampire/venetian_mask + r_pocket = /obj/item/vamp/keys/archive + l_pocket = /obj/item/smartphone/gargoyle + accessory = /obj/item/clothing/accessory/pocketprotector/full + backpack_contents = list( + /obj/item/ritual_tome/arcane = 1, + /obj/item/card/credit = 1, + /obj/item/scythe/vamp = 1, + ) diff --git a/modular_darkpack/modules/jobs/code/tremere/regent.dm b/modular_darkpack/modules/jobs/code/tremere/regent.dm new file mode 100644 index 000000000000..8b8804aca824 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/tremere/regent.dm @@ -0,0 +1,38 @@ +/datum/job/vampire/regent + title = JOB_CHANTRY_REGENT + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = SUPERVISOR_CAMARILLA + config_tag = "CHANTRY_REGENT" + outfit = /datum/outfit/job/vampire/regent + job_flags = CITY_JOB_FLAGS + exp_required_type_department = EXP_TYPE_CHANTRY + department_for_prefs = /datum/job_department/chantry + departments_list = list( + /datum/job_department/chantry, + ) + display_order = JOB_DISPLAY_ORDER_REGENT + + description = "Lead the Chantry. You serve as both the Regent and Tremere Primogen. You report to the Tremere Lord of this region first, Prince second." + minimal_masquerade = 4 + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_TREMERE, VAMPIRE_CLAN_GARGOYLE) + + known_contacts = list("Prince") + +/datum/outfit/job/vampire/regent + name = "Chantry Regent" + jobtype = /datum/job/vampire/regent + + id = /obj/item/card/regent + glasses = /obj/item/clothing/glasses/vampire/perception + suit = /obj/item/clothing/suit/vampire/trench/archive + shoes = /obj/item/clothing/shoes/vampire + gloves = /obj/item/clothing/gloves/vampire/latex + uniform = /obj/item/clothing/under/vampire/archivist + r_pocket = /obj/item/vamp/keys/regent + l_pocket = /obj/item/smartphone/tremere_regent + accessory = /obj/item/clothing/accessory/pocketprotector/full + backpack_contents = list(/obj/item/phone_book=1, /obj/item/ritual_tome/arcane=1, /obj/item/card/credit/elder=1, /obj/item/scythe/vamp=1) + diff --git a/modular_darkpack/modules/jobs/code/triad.dm b/modular_darkpack/modules/jobs/code/triad.dm deleted file mode 100644 index c4cb454a58cf..000000000000 --- a/modular_darkpack/modules/jobs/code/triad.dm +++ /dev/null @@ -1,48 +0,0 @@ - -/datum/job/vamp/triad_soldier - title = "Triad Soldier" - department_head = list("Triad Leadership") - faction = "Vampire" - total_positions = 8 - spawn_positions = 8 - supervisors = " the Triads" - selection_color = "#bb9d3d" - - outfit = /datum/outfit/job/triad_soldier - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_TRIAD_GANGSTER - exp_type_department = EXP_TYPE_GANG - - allowed_species = list("Human", "Werewolf", "Kuei-Jin") - minimal_generation = 13 - - duty = "Make money, do drugs, fight law. Your hideout is the laundromat in Chinatown." - minimal_masquerade = 0 - my_contact_is_important = FALSE - -/datum/outfit/job/triad_soldier/pre_equip(mob/living/carbon/human/H) - ..() - H.grant_language(/datum/language/cantonese) - if(H.gender == FEMALE) - uniform = /obj/item/clothing/under/vampire/suit/female - shoes = /obj/item/clothing/shoes/vampire/heels - -/datum/outfit/job/triad_soldier - name = "Triad Soldier" - jobtype = /datum/job/vamp/triad_soldier - uniform = /obj/item/clothing/under/vampire/suit - shoes = /obj/item/clothing/shoes/vampire/jackboots -// suit = /obj/item/clothing/suit/vampire/vest -// belt = /obj/item/melee/classic_baton - id = /obj/item/cockclock -// gloves = /obj/item/cockclock -// id = /obj/item/card/id/police - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/flashlight - l_hand = /obj/item/vamp/keys/triads -// r_hand = /obj/item/police_radio - backpack_contents = list(/obj/item/passport=1, /obj/item/card/credit=1, /obj/item/clothing/mask/vampire/balaclava =1, /obj/item/gun/ballistic/automatic/pistol/darkpack/beretta=2,/obj/item/ammo_box/magazine/semi9mm=2, /obj/item/knife/vamp) diff --git a/modular_darkpack/modules/jobs/code/tzimisce/bogatyr.dm b/modular_darkpack/modules/jobs/code/tzimisce/bogatyr.dm new file mode 100644 index 000000000000..8cbca177ec46 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/tzimisce/bogatyr.dm @@ -0,0 +1,38 @@ + +/datum/job/vampire/bogatyr + title = JOB_BOGATYR + faction = FACTION_CITY + total_positions = 4 + spawn_positions = 4 + supervisors = " the Laws of Hospitality" + config_tag = "BOGATYR" + outfit = /datum/outfit/job/vampire/bogatyr + job_flags = CITY_JOB_FLAGS + exp_required_type_department = EXP_TYPE_MANOR + department_for_prefs = /datum/job_department/manor + departments_list = list( + /datum/job_department/manor, + ) + display_order = JOB_DISPLAY_ORDER_BOGATYR + + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_TZIMISCE) + + description = "Whether you are of Voivode-in-Waiting's blood or if you've been honored, you are one of the Kin of the Voivode. Protect your Family, as your Family would protect you." + minimal_masquerade = 2 + + known_contacts = list("Prince", "Baron", "Sheriff") + +/datum/outfit/job/vampire/bogatyr + name = "Bogatyr" + jobtype = /datum/job/vampire/bogatyr + id = /obj/item/card/bogatyr + glasses = /obj/item/clothing/glasses/vampire/yellow + uniform = /obj/item/clothing/under/vampire/bogatyr + suit = /obj/item/clothing/suit/vampire/jacket/punk + shoes = /obj/item/clothing/shoes/vampire/jackboots + head = /obj/item/clothing/head/vampire/bogatyr + suit = /obj/item/clothing/suit/vampire/bogatyr + belt = /obj/item/storage/belt/sheath/vamp/sword + l_pocket = /obj/item/smartphone/bogatyr + backpack_contents = list(/obj/item/vamp/keys/old_clan_tzimisce=1, /obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/tzimisce/voivode.dm b/modular_darkpack/modules/jobs/code/tzimisce/voivode.dm new file mode 100644 index 000000000000..f27bc59670bf --- /dev/null +++ b/modular_darkpack/modules/jobs/code/tzimisce/voivode.dm @@ -0,0 +1,35 @@ +/datum/job/vampire/voivode + title = JOB_VOIVODE + faction = FACTION_CITY + total_positions = 1 + spawn_positions = 1 + supervisors = " the Laws of Hospitality" + config_tag = "VOIVODE" + outfit = /datum/outfit/job/vampire/voivode + job_flags = CITY_JOB_FLAGS + exp_required_type_department = EXP_TYPE_MANOR + department_for_prefs = /datum/job_department/manor + departments_list = list( + /datum/job_department/manor, + ) + display_order = JOB_DISPLAY_ORDER_VOIVODE + + allowed_species = list(SPECIES_KINDRED) + allowed_clans = list(VAMPIRE_CLAN_TZIMISCE) + + description = "You are a Childe of the Voivode-in-Waiting, the ancient Tzimisce Elder who has rested beneath the Earth for an age longer than the city that now rests on their bones. Honor them in all your actions, and remember that you walk with their favor." + minimal_masquerade = 2 + + known_contacts = list("Prince", "Baron", "Sheriff") + +/datum/outfit/job/vampire/voivode + name = "Voivode" + jobtype = /datum/job/vampire/voivode + id = /obj/item/card/voivode + glasses = /obj/item/clothing/glasses/vampire/yellow + uniform = /obj/item/clothing/under/vampire/voivode + suit = /obj/item/clothing/suit/vampire/trench/voivode + shoes = /obj/item/clothing/shoes/vampire/jackboots + belt = /obj/item/storage/belt/sheath/vamp/sword + l_pocket = /obj/item/smartphone/voivode + backpack_contents = list(/obj/item/vamp/keys/old_clan_tzimisce=1, /obj/item/instrument/eguitar/vamp=1, /obj/item/card/credit/elder=1) diff --git a/modular_darkpack/modules/jobs/code/tzimisce/zadruga.dm b/modular_darkpack/modules/jobs/code/tzimisce/zadruga.dm new file mode 100644 index 000000000000..a8f0a97c16e5 --- /dev/null +++ b/modular_darkpack/modules/jobs/code/tzimisce/zadruga.dm @@ -0,0 +1,32 @@ +/datum/job/vampire/zadruga + title = JOB_ZADRUGA + faction = FACTION_CITY + total_positions = 2 + spawn_positions = 2 + supervisors = " the Laws of Hospitality" + config_tag = "ZADRUGA" + outfit = /datum/outfit/job/vampire/zadruga + job_flags = CITY_JOB_FLAGS + exp_required_type_department = EXP_TYPE_MANOR + department_for_prefs = /datum/job_department/manor + departments_list = list( + /datum/job_department/manor, + ) + display_order = JOB_DISPLAY_ORDER_ZADRUGA + + allowed_species = list(SPECIES_GHOUL) + description = "You were born in servitude to the Master of the Manor: your father served the Voivode, as did his father. Now, you carry their blood, and with it their responsibilities." + minimal_masquerade = 2 + + known_contacts = list("Prince", "Baron", "Sheriff") + +/datum/outfit/job/vampire/zadruga + name = "Zadruga" + jobtype = /datum/job/vampire/zadruga + id = /obj/item/card/bogatyr + glasses = /obj/item/clothing/glasses/vampire/yellow + uniform = /obj/item/clothing/under/vampire/bogatyr + suit = /obj/item/clothing/suit/vampire/jacket/punk + shoes = /obj/item/clothing/shoes/vampire/jackboots + l_pocket = /obj/item/smartphone/zadruga + backpack_contents = list(/obj/item/vamp/keys/old_clan_tzimisce=1, /obj/item/card/credit=1) diff --git a/modular_darkpack/modules/jobs/code/voivode.dm b/modular_darkpack/modules/jobs/code/voivode.dm deleted file mode 100644 index c598a67b62e6..000000000000 --- a/modular_darkpack/modules/jobs/code/voivode.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/job/vamp/voivode - title = "Voivode" - department_head = list("Eldest") - faction = "Vampire" - total_positions = 1 - spawn_positions = 1 - supervisors = " the Laws of Hospitality" - selection_color = "#953d2d" - - outfit = /datum/outfit/job/voivode - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_VOIVODE - exp_type_department = EXP_TYPE_TZIMISCE - - allowed_species = list("Vampire") - allowed_bloodlines = list("Old Clan Tzimisce") - minimal_generation = 10 - - v_duty = "You are a Childe of the Voivode-in-Waiting, the ancient Tzimisce Elder who has rested beneath the Earth for an age longer than the city that now rests on their bones. Honor them in all your actions, and remember that you walk with their favor." - minimal_masquerade = 2 - my_contact_is_important = TRUE - known_contacts = list("Prince", "Baron", "Sheriff") - - - -/datum/outfit/job/voivode - name = "Voivode" - jobtype = /datum/job/vamp/voivode - id = /obj/item/card/id/voivode - //glasses = /obj/item/clothing/glasses/vampire/yellow - uniform = /obj/item/clothing/under/vampire/voivode - suit = /obj/item/clothing/suit/vampire/trench/voivode - shoes = /obj/item/clothing/shoes/vampire/jackboots - belt = /obj/item/storage/belt/sheath/vamp/sword - l_pocket = /obj/item/vamp/phone - //r_pocket = - backpack_contents = list(/obj/item/vamp/keys/old_clan_tzimisce=1, /obj/item/instrument/eguitar/vamp=1, /obj/item/passport=1, /obj/item/flashlight=1, /obj/item/card/credit/elder=1) - -/obj/effect/landmark/start/voivode - name = "Voivode" diff --git a/modular_darkpack/modules/jobs/code/zadruga.dm b/modular_darkpack/modules/jobs/code/zadruga.dm deleted file mode 100644 index bbf43248a597..000000000000 --- a/modular_darkpack/modules/jobs/code/zadruga.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/job/vamp/zadruga - title = "Zadruga" - department_head = list("Voivode") - faction = "Ghoul" //[Lucifernix] - Change this to vampire when I actually fix this. - total_positions = 2 - spawn_positions = 2 - supervisors = " the Laws of Hospitality" - selection_color = "#953d2d" - - outfit = /datum/outfit/job/zadruga - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_THEATRE) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_ZADRUGA - exp_type_department = EXP_TYPE_TZIMISCE - - //ghoul_only = TRUE - //allowed_bloodlines = list("Old Clan Tzimisce", "Tzimisce") - //minimal_generation = 7 //Uncomment when players get exp enough - - duty = "You were born in servitude to the Master of the Manor: your father served the Voivode, as did his father. Now, you carry their blood, and with it their responsibilities." - minimal_masquerade = 2 - my_contact_is_important = FALSE - known_contacts = list("Prince", "Baron", "Sheriff") - - - - -/datum/outfit/job/zadruga - name = "zadruga" - jobtype = /datum/job/vamp/zadruga - id = /obj/item/card/id/bogatyr - //glasses = /obj/item/clothing/glasses/vampire/yellow - uniform = /obj/item/clothing/under/vampire/bogatyr - //suit = /obj/item/clothing/suit/vampire/jacket/punk - shoes = /obj/item/clothing/shoes/vampire/jackboots - l_pocket = /obj/item/vamp/phone - //r_pocket = /obj/item/cockclock - backpack_contents = list(/obj/item/vamp/keys/old_clan_tzimisce=1, /obj/item/passport=1, /obj/item/flashlight=1, /obj/item/card/credit=1) - -/obj/effect/landmark/start/zadruga - name = "Zadruga" diff --git a/modular_darkpack/modules/jobs/icons/id_items.dmi b/modular_darkpack/modules/jobs/icons/id_items.dmi new file mode 100644 index 000000000000..e01590536e47 Binary files /dev/null and b/modular_darkpack/modules/jobs/icons/id_items.dmi differ diff --git a/modular_darkpack/modules/jobs/icons/id_onfloors.dmi b/modular_darkpack/modules/jobs/icons/id_onfloors.dmi new file mode 100644 index 000000000000..096979083a33 Binary files /dev/null and b/modular_darkpack/modules/jobs/icons/id_onfloors.dmi differ diff --git a/modular_darkpack/modules/jobs/icons/id_worn.dmi b/modular_darkpack/modules/jobs/icons/id_worn.dmi new file mode 100644 index 000000000000..06cf5b8660ce Binary files /dev/null and b/modular_darkpack/modules/jobs/icons/id_worn.dmi differ diff --git a/modular_darkpack/modules/jobs/icons/landmarks.dmi b/modular_darkpack/modules/jobs/icons/landmarks.dmi new file mode 100644 index 000000000000..9432fb87b7ab Binary files /dev/null and b/modular_darkpack/modules/jobs/icons/landmarks.dmi differ diff --git a/modular_darkpack/modules/jobs/icons/sabbat.dmi b/modular_darkpack/modules/jobs/icons/sabbat.dmi new file mode 100644 index 000000000000..d80ae9d151a7 Binary files /dev/null and b/modular_darkpack/modules/jobs/icons/sabbat.dmi differ diff --git a/modular_darkpack/modules/deprecated/sounds/cross.ogg b/modular_darkpack/modules/jobs/sounds/cross.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/cross.ogg rename to modular_darkpack/modules/jobs/sounds/cross.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/evil_start.ogg b/modular_darkpack/modules/jobs/sounds/evil_start.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/evil_start.ogg rename to modular_darkpack/modules/jobs/sounds/evil_start.ogg diff --git a/modular_darkpack/modules/jumping/code/jumper_component.dm b/modular_darkpack/modules/jumping/code/jumper_component.dm index 0e301713d2e0..c67c9c3721ea 100644 --- a/modular_darkpack/modules/jumping/code/jumper_component.dm +++ b/modular_darkpack/modules/jumping/code/jumper_component.dm @@ -68,6 +68,9 @@ if(istype(target, /atom/movable/screen)) return + if(get_turf(jumper) == get_turf(target)) // We can't jump on ourselves + return + if(!COOLDOWN_FINISHED(src, jump_cooldown)) to_chat(jumper, span_notice("You can't jump so soon!")) return @@ -80,6 +83,9 @@ /datum/config_entry/flag/jump_slowdown // Config datum /mob/living/proc/post_jump_slowdown(duration) + if(duration < 1) + duration = 1 + add_movespeed_modifier(/datum/movespeed_modifier/post_jump) addtimer(CALLBACK(src, PROC_REF(remove_movespeed_modifier), /datum/movespeed_modifier/post_jump), duration) @@ -112,9 +118,9 @@ if(jumper.combat_mode && get_dist(jumper.loc, target) <= 3 && strength >= 8) addtimer(CALLBACK(src, PROC_REF(jump_boom), jumper),(distance * 0.5)) jumper.visible_message(span_danger("[jumper] takes a mighty leap that shatters \the [adjusted_target] where they land!")) - jumper.adjustStaminaLoss(20) + jumper.adjust_stamina_loss(20) else - jumper.adjustStaminaLoss(10) + jumper.adjust_stamina_loss(10) jumper.visible_message(span_danger("[jumper] jumps towards [adjusted_target].")) var/turf/start_T = get_turf(jumper.loc) //Get the start and target tile for the descriptors diff --git a/modular_darkpack/modules/kindred_species/code/give_vitae.dm b/modular_darkpack/modules/kindred_species/code/give_vitae.dm index b16013d8643b..8d475ed527ec 100644 --- a/modular_darkpack/modules/kindred_species/code/give_vitae.dm +++ b/modular_darkpack/modules/kindred_species/code/give_vitae.dm @@ -37,7 +37,7 @@ owner.visible_message(span_danger("[owner] finishes pouring blood into \the [target_atom][ismob(target_atom) ? "'s mouth" : null]!"), span_info("You finish pouring blood into \the [target_atom][ismob(target_atom) ? "'s mouth" : null].")) owner.log_message("poured their vitae into [key_name(target_atom)].", LOG_GAME) message_admins("[ADMIN_LOOKUPFLW(carbon_owner)] poured their vitae into [ADMIN_LOOKUPFLW(target_atom)].") - carbon_owner.bloodpool = max(carbon_owner.bloodpool - 1, 0) - carbon_owner.transfer_blood_to(target_atom, 100, TRUE, TRUE) + carbon_owner.adjust_blood_pool(-1) + target_atom.reagents.add_reagent(/datum/reagent/blood/vitae, 100) target_atom.reagents.expose(target_atom, INGEST, 1, FALSE) return TRUE diff --git a/modular_darkpack/modules/kindred_species/code/kindred_species.dm b/modular_darkpack/modules/kindred_species/code/kindred_species.dm index 676cc9b190f9..a9f610b8e301 100644 --- a/modular_darkpack/modules/kindred_species/code/kindred_species.dm +++ b/modular_darkpack/modules/kindred_species/code/kindred_species.dm @@ -1,222 +1,37 @@ -/** - * This is the splat (supernatural type, game line in the World of Darkness) container - * for all vampire-related code. I think this is stupid and I don't want any of this to - * be the way it is, but if we're going to work with the code that's been written then - * my advice is to centralise all stuff directly relating to vampires to here if it isn't - * already in another organisational structure. - * - * The same applies to other splats, like /datum/species/garou or /datum/species/ghoul. - * Halfsplats like ghouls are going to share some code with their fullsplats (vampires). - * I dunno what to do about this except a reorganisation to make this stuff actually good. - * The plan right now is to create a /datum/splat parent type and then have everything branch - * from there, but that's for the future. - */ - /datum/species/human/kindred name = "Kindred" plural_form = "Kindred" id = SPECIES_KINDRED examine_limb_id = SPECIES_HUMAN + // Character creation buttons will not display if these traits aren't here inherent_traits = list( TRAIT_USES_SKINTONES, - TRAIT_LIMBATTACHMENT, - TRAIT_NOHUNGER, - TRAIT_NOBREATH, - TRAIT_NOCRITDAMAGE, - TRAIT_RADIMMUNE, - TRAIT_CAN_ENTER_TORPOR, TRAIT_VTM_MORALITY, TRAIT_VTM_CLANS, TRAIT_UNAGING, - TRAIT_NO_DNA_COPY, - TRAIT_DRINKS_BLOOD ) - inherent_biotypes = MOB_UNDEAD | MOB_HUMANOID changesource_flags = MIRROR_BADMIN - coldmod = 0.25 - heatmod = 2 - mutanttongue = /obj/item/organ/tongue/kindred - exotic_bloodtype = BLOOD_TYPE_KINDRED - var/datum/vampire_clan/clan - var/enlightenment - COOLDOWN_DECLARE(torpor_timer) /mob/living/carbon/human/species/kindred race = /datum/species/human/kindred -/datum/species/human/kindred/prepare_human_for_preview(mob/living/carbon/human/human) - human.set_haircolor("#333333", update = FALSE) - human.set_hairstyle("Undercut Left", update = TRUE) - human.set_eye_color("#ff0000") - human.undershirt = "T-Shirt (Red)" - human.update_body() -// human.equipOutfit(/datum/outfit/job/prince) // ! Uncomment when vampjobs are done - -/datum/species/human/kindred/on_species_gain(mob/living/carbon/human/new_kindred, datum/species/old_species, pref_load, regenerate_icons = TRUE) +/datum/species/human/kindred/on_species_gain(mob/living/carbon/human/human_who_gained_species, datum/species/old_species, pref_load, regenerate_icons, replace_missing) . = ..() - if(pref_load) - GLOB.kindred_list |= new_kindred - - var/datum/action/cooldown/mob_cooldown/give_vitae/vitae = new() - vitae.Grant(new_kindred) - - var/datum/action/cooldown/blood_power/bloodpower = new() - bloodpower.Grant(new_kindred) - - // TODO: [Rebase] reimplement these vars and the actions - /* - var/datum/action/vampireinfo/infor = new() - infor.host = new_kindred - infor.Grant(new_kindred) - - add_verb(new_kindred, TYPE_VERB_REF(/mob/living/carbon/human, teach_discipline)) - */ - - //this needs to be adjusted to be more accurate for blood spending rates - var/datum/discipline/bloodheal/giving_bloodheal = new(clamp(11 - new_kindred.generation, 1, 10)) - new_kindred.give_discipline(giving_bloodheal) - - //vampires die instantly upon having their heart removed - RegisterSignal(new_kindred, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(handle_lose_organ)) - - //vampires don't die while in crit, they just slip into torpor after 2 minutes of being critted - RegisterSignal(new_kindred, SIGNAL_ADDTRAIT(TRAIT_CRITICAL_CONDITION), PROC_REF(handle_enter_critical_condition)) - - //vampires resist vampire bites better than mortals - RegisterSignal(new_kindred, COMSIG_MOB_VAMPIRE_SUCKED, PROC_REF(on_vampire_bitten)) - - // Apply bashing damage resistance - RegisterSignal(new_kindred, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, PROC_REF(damage_resistance)) - - RegisterSignal(new_kindred, COMSIG_HUMAN_ON_HANDLE_BLOOD, PROC_REF(kindred_blood)) - - // TODO: [Rebase] reimplement choosing disciplines - new_kindred.give_discipline(new /datum/discipline/celerity(5)) - new_kindred.give_discipline(new /datum/discipline/potence(5)) - new_kindred.give_discipline(new /datum/discipline/fortitude(5)) + human_who_gained_species.make_kindred() /datum/species/human/kindred/on_species_loss(mob/living/carbon/human/human, datum/species/new_species, pref_load) . = ..() - if(pref_load) - GLOB.kindred_list -= human - - human.set_clan() - - UnregisterSignal(human, COMSIG_CARBON_LOSE_ORGAN) - UnregisterSignal(human, SIGNAL_ADDTRAIT(TRAIT_CRITICAL_CONDITION)) - UnregisterSignal(human, COMSIG_MOB_VAMPIRE_SUCKED) - UnregisterSignal(human, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS) - UnregisterSignal(human, COMSIG_HUMAN_ON_HANDLE_BLOOD) - - // TODO: [Rebase] reimplement vampire actions - /* - for (var/datum/action/vampireinfo/VI in human.actions) - VI.Remove(human) - */ - - for (var/datum/action/A in human.actions) - if (A.vampiric) - A.Remove(human) - -/datum/species/human/kindred/proc/damage_resistance(datum/source, list/damage_mods, damage_amount, damagetype, def_zone, sharpness, attack_direction, obj/item/attacking_item) - SIGNAL_HANDLER + human.remove_splat(/datum/splat/vampire/kindred) - // Kindred take half "bashing" damage, which is normally blunt damage but includes pointy things like bullets because they're undead - if ((damagetype == BRUTE) && (sharpness != SHARP_EDGED)) - damage_mods += 0.5 - -/** - * Signal handler for lose_organ to near-instantly kill Kindred whose hearts have been removed. - * - * Arguments: - * * source - The Kindred whose organ has been removed. - * * organ - The organ which has been removed. - */ -/datum/species/human/kindred/proc/handle_lose_organ(mob/living/carbon/human/source, obj/item/organ/organ) - SIGNAL_HANDLER - - if (!istype(organ, /obj/item/organ/heart)) - return - // You don't want the character preview going sideways, and they lose organs a lot - if (isdummy(source)) - return - - addtimer(CALLBACK(src, PROC_REF(lose_heart), source, organ), 0.5 SECONDS) - -/datum/species/human/kindred/proc/lose_heart(mob/living/carbon/human/source, obj/item/organ/heart/heart) - if (source.get_organ_by_type(/obj/item/organ/heart)) - return - - source.death() - -/datum/species/human/kindred/proc/handle_enter_critical_condition(mob/living/carbon/human/source) - SIGNAL_HANDLER - - to_chat(source, span_warning("You can feel yourself slipping into Torpor. You can use succumb to immediately sleep...")) - addtimer(CALLBACK(source, TYPE_PROC_REF(/mob/living/carbon/human, torpor), "damage"), 2 MINUTES) - -/datum/species/human/kindred/proc/slip_into_torpor(mob/living/carbon/human/kindred) - if (!kindred || (kindred.stat == DEAD)) - return - if (kindred.stat < SOFT_CRIT) - return - - kindred.torpor("damage") - -/** - * On being bit by a vampire - * - * This handles vampire bite sleep immunity and any future special interactions. - */ -/datum/species/human/kindred/proc/on_vampire_bitten(datum/source, mob/living/carbon/being_bitten) - SIGNAL_HANDLER - - return COMPONENT_RESIST_VAMPIRE_KISS - - -/obj/item/organ/tongue/kindred - liked_foodtypes = NONE - disliked_foodtypes = NONE - // All food except raw meat is disgusting to Kindred - toxic_foodtypes = ~(GORE | MEAT | RAW) - -/proc/get_vamp_skin_color(value = "albino") - switch(value) - if("caucasian1") - return "vamp1" - if("caucasian2") - return "vamp2" - if("caucasian3") - return "vamp3" - if("latino") - return "vamp4" - if("mediterranean") - return "vamp5" - if("asian1") - return "vamp6" - if("asian2") - return "vamp7" - if("arab") - return "vamp8" - if("indian") - return "vamp9" - if("african1") - return "vamp10" - if("african2") - return "vamp11" - else - return value - - -/datum/species/human/kindred/proc/kindred_blood(mob/living/carbon/human/kindred, seconds_per_tick, times_fired) - SIGNAL_HANDLER - - if(kindred.stat == DEAD) - return HANDLE_BLOOD_HANDLED - - return HANDLE_BLOOD_NO_NUTRITION_DRAIN|HANDLE_BLOOD_NO_OXYLOSS +/datum/species/human/kindred/prepare_human_for_preview(mob/living/carbon/human/human) + human.set_haircolor("#333333", update = FALSE) + human.set_hairstyle("Undercut Left", update = TRUE) + human.set_eye_color("#ff0000") + human.undershirt = "T-Shirt (Red)" + human.update_body() + human.equipOutfit(/datum/outfit/job/vampire/prince, TRUE) /datum/species/human/kindred/get_species_description() return "Blood sucking vampires of the dark realm!" diff --git a/modular_darkpack/modules/kindred_species/code/preferences/clan.dm b/modular_darkpack/modules/kindred_species/code/preferences/clan.dm index 8524f818c937..463849f230b2 100644 --- a/modular_darkpack/modules/kindred_species/code/preferences/clan.dm +++ b/modular_darkpack/modules/kindred_species/code/preferences/clan.dm @@ -9,7 +9,7 @@ should_generate_icons = TRUE /datum/preference/choiced/vampire_clan/init_possible_values() - // TODO: [Rebase] implement whitelisting + // DARKPACK TODO - implement whitelisting return assoc_to_keys(GLOB.vampire_clan_list) /datum/preference/choiced/vampire_clan/icon_for(value) diff --git a/modular_darkpack/modules/kindred_species/code/preferences/diablerist.dm b/modular_darkpack/modules/kindred_species/code/preferences/diablerist.dm index b00725b0e37f..b3b5d6bc2779 100644 --- a/modular_darkpack/modules/kindred_species/code/preferences/diablerist.dm +++ b/modular_darkpack/modules/kindred_species/code/preferences/diablerist.dm @@ -2,7 +2,7 @@ category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_key = "diablerist" savefile_identifier = PREFERENCE_CHARACTER - priority = PREFERENCE_PRIORITY_TABLETOP + priority = PREFERENCE_PRIORITY_WORLD_OF_DARKNESS relevant_inherent_trait = TRAIT_DRINKS_BLOOD default_value = FALSE diff --git a/modular_darkpack/modules/kindred_species/code/preferences/generation.dm b/modular_darkpack/modules/kindred_species/code/preferences/generation.dm index a30ea1efeffa..52853a2cff0e 100644 --- a/modular_darkpack/modules/kindred_species/code/preferences/generation.dm +++ b/modular_darkpack/modules/kindred_species/code/preferences/generation.dm @@ -2,10 +2,10 @@ category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_key = "generation" savefile_identifier = PREFERENCE_CHARACTER - priority = PREFERENCE_PRIORITY_TABLETOP + priority = PREFERENCE_PRIORITY_WORLD_OF_DARKNESS relevant_inherent_trait = TRAIT_DRINKS_BLOOD - minimum = 7 - maximum = 13 + minimum = MAX_PUBLIC_GENERATION + maximum = HIGHEST_GENERATION_LIMIT /datum/preference/numeric/generation/apply_to_human(mob/living/carbon/human/target, value) - target.generation = value + iskindred(target)?.set_generation(value) diff --git a/modular_darkpack/modules/kindred_species/code/preferences/morality.dm b/modular_darkpack/modules/kindred_species/code/preferences/morality.dm index b024d1c8019c..53ba101a6cd4 100644 --- a/modular_darkpack/modules/kindred_species/code/preferences/morality.dm +++ b/modular_darkpack/modules/kindred_species/code/preferences/morality.dm @@ -1,8 +1,8 @@ /datum/preference/choiced/vtm_morality - savefile_key = "vtm_morality_path" + savefile_key = "morality_path" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - priority = PREFERENCE_PRIORITY_WORLD_OF_DARKNESS + priority = PREFERENCE_PRIORITY_TABLETOP main_feature_name = "Path" relevant_inherent_trait = TRAIT_VTM_MORALITY must_have_relevant_trait = TRUE @@ -18,5 +18,4 @@ if (value != "Enlightenment") return - var/datum/species/human/kindred/kindred_species = target.dna.species - kindred_species.enlightenment = TRUE + iskindred(target)?.enlightenment = TRUE diff --git a/modular_darkpack/modules/kindred_species/code/torpor.dm b/modular_darkpack/modules/kindred_species/code/torpor.dm index 6f5015f58a39..7d662134d2be 100644 --- a/modular_darkpack/modules/kindred_species/code/torpor.dm +++ b/modular_darkpack/modules/kindred_species/code/torpor.dm @@ -1,5 +1,5 @@ -/mob/living/proc/torpor(source) - if (HAS_TRAIT(src, TRAIT_TORPOR)) +/mob/living/proc/torpor(source, force) + if(HAS_TRAIT(src, TRAIT_TORPOR)) return fakedeath(source) @@ -7,33 +7,32 @@ to_chat(src, span_danger("You have fallen into Torpor. Use the button in the top right to learn more, or attempt to wake up.")) throw_alert(ALERT_UNTORPOR, /atom/movable/screen/alert/untorpor) ADD_TRAIT(src, TRAIT_TORPOR, source) - if (iskindred(src)) + if(iskindred(src) && !force) var/mob/living/carbon/human/vampire = src - var/datum/species/human/kindred/vampire_species = vampire.dna.species - COOLDOWN_START(vampire_species, torpor_timer, 5 MINUTES) + var/datum/splat/vampire/kindred/vampirism = iskindred(vampire) + COOLDOWN_START(vampirism, torpor_timer, 5 MINUTES) -/mob/living/proc/cure_torpor(source) - if (!HAS_TRAIT(src, TRAIT_TORPOR)) +/mob/living/proc/cure_torpor(source, force) + if(!HAS_TRAIT_FROM(src, TRAIT_TORPOR, source)) return // Heal to a tiny bit above crit, with less severe damage types being healed first var/amount_to_heal = HEALTH_THRESHOLD_CRIT + 5 - health - if (amount_to_heal > 0) + if((amount_to_heal > 0) && !force) heal_ordered_damage(amount_to_heal, list(STAMINA, OXY, BRUTE, TOX, BURN)) cure_fakedeath(source) clear_alert(ALERT_UNTORPOR) REMOVE_TRAIT(src, TRAIT_TORPOR, source) - if (iskindred(src)) - to_chat(src, span_notice("You have awoken from your Torpor.")) + to_chat(src, span_notice("You have awoken from your Torpor.")) /mob/living/proc/untorpor() - if (!HAS_TRAIT(src, TRAIT_TORPOR)) + if(!HAS_TRAIT(src, TRAIT_TORPOR)) return - if (iskindred(src)) - if (bloodpool > 0) - bloodpool -= 1 + if(iskindred(src)) + if(bloodpool > 0) + adjust_blood_pool(-1) cure_torpor() to_chat(src, span_notice("You have awoken from your Torpor.")) else @@ -47,25 +46,29 @@ /atom/movable/screen/alert/untorpor/Click() . = ..() - if (!.) + if(!.) return - if (!isliving(owner)) + if(!isliving(owner)) return var/mob/living/living_owner = owner - if (living_owner.stat == DEAD) + if(living_owner.stat == DEAD) to_chat(living_owner, span_warning("You have suffered Final Death. You will not wake up.")) return - if (iskindred(living_owner)) + if(iskindred(living_owner)) var/mob/living/carbon/human/vampire = living_owner - var/datum/species/human/kindred/kindred_species = vampire.dna.species - if (COOLDOWN_FINISHED(kindred_species, torpor_timer) && (vampire.bloodpool > 0)) + var/datum/splat/vampire/kindred/vampirism = iskindred(vampire) + if(!COOLDOWN_STARTED(vampirism, torpor_timer)) + to_chat(owner, span_purple(span_italics("You are in Torpor, the sleep of death that vampires go into when injured, starved, or exhausted."))) + to_chat(owner, span_danger(span_italics("You will re-awaken once the stake in your heart is removed by an outside source."))) + return + if(COOLDOWN_FINISHED(vampirism, torpor_timer) && (vampire.bloodpool > 0)) vampire.untorpor() else - to_chat(owner, span_purple("<i>You are in Torpor, the sleep of death that vampires go into when injured, starved, or exhausted.</i>")) + to_chat(owner, span_purple(span_italics("You are in Torpor, the sleep of death that vampires go into when injured, starved, or exhausted."))) if (vampire.bloodpool > 0) - to_chat(owner, span_purple("<i>You will be able to awaken in <b>[DisplayTimeText(COOLDOWN_TIMELEFT(kindred_species, torpor_timer))]</b>.</i>")) + to_chat(owner, span_purple(span_italics("You will be able to awaken in <b>[DisplayTimeText(COOLDOWN_TIMELEFT(vampirism, torpor_timer))]</b>."))) else - to_chat(owner, span_danger("<i>You will not be able to re-awaken, because you have no blood available to do so.</i>")) + to_chat(owner, span_danger(span_italics("You will not be able to re-awaken, because you have no blood available to do so."))) diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/__vampire_clan.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/__vampire_clan.dm index 32b27d6e57b3..59d4197c139e 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/__vampire_clan.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/__vampire_clan.dm @@ -1,19 +1,22 @@ /datum/vampire_clan + abstract_type = /datum/vampire_clan /// Name of the Clan var/name /// Identifier in sprites for the Clan var/id /// Description of the Clan var/desc + /// The icon for this clan. Used in preferences. + var/icon /// Description of the Clan's supernatural curse var/curse /// List of Disciplines that are innate to this Clan - var/list/clan_disciplines + var/list/clan_disciplines = list() /// List of Disciplines that are rejected by this Clan - var/list/restricted_disciplines + var/list/restricted_disciplines = list() /// List of traits that are applied to members of this Clan - var/list/clan_traits + var/list/clan_traits = list() /// The Clan's unique body sprite var/alt_sprite @@ -44,7 +47,7 @@ var/enlightenment /// If this Clan needs a whitelist to select and play - var/whitelisted + var/whitelisted = FALSE /** * Applies Clan-specific effects to the mob @@ -83,6 +86,11 @@ if (joining_round) RegisterSignal(vampire, COMSIG_MOB_LOGIN, PROC_REF(on_join_round), override = TRUE) + for(var/discipline in clan_disciplines) + // DARKPACK TODO - reimplement choosing disciplines + if(ispath(discipline, /datum/discipline)) + vampire.give_st_power(discipline, 5) + /** * Undoes the effects of on_gain to more or less * remove the effects of gaining the Clan. By default, @@ -103,7 +111,7 @@ if (alt_sprite) vampire.set_body_sprite(ignore_clan = TRUE) - // TODO: [Rebase] reimplement clan accessories + // DARKPACK TODO - reimplement clan accessories /* // Remove Clan accessories if (vampire.client?.prefs?.clan_accessory) @@ -153,7 +161,7 @@ * * joining_round - If this Clan is being given at roundstart and should call on_join_round */ /mob/living/carbon/human/proc/set_clan(setting_clan, joining_round) - var/datum/vampire_clan/previous_clan = clan + var/datum/vampire_clan/previous_clan = get_clan() // Convert IDs and typepaths to singletons, or just directly assign if already singleton var/datum/vampire_clan/new_clan = get_vampire_clan(setting_clan) @@ -161,11 +169,23 @@ // Handle losing Clan previous_clan?.on_lose(src) - clan = new_clan + var/datum/splat/vampire/kindred/kindred = iskindred(src) + if (!kindred) + return + + kindred.clan = new_clan // Clan's been cleared, don't apply effects if (!new_clan) return // Gaining Clan effects - clan.on_gain(src, joining_round) + kindred.clan.on_gain(src, joining_round) + +/mob/living/proc/get_clan() + RETURN_TYPE(/datum/vampire_clan) + + return iskindred(src)?.clan + +/mob/living/proc/is_clan(clan_type) + return istype(get_clan(), clan_type) diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clan_globals.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clan_globals.dm index 6f40373fe42b..864a5eb1dbbb 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clan_globals.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clan_globals.dm @@ -3,7 +3,7 @@ GLOBAL_LIST_INIT(vampire_clan_list, init_vampire_clan_list()) /proc/init_vampire_clan_list() var/list/clan_list = list() - for (var/datum/vampire_clan/clan_type as anything in subtypesof(/datum/vampire_clan)) + for (var/datum/vampire_clan/clan_type as anything in valid_subtypesof(/datum/vampire_clan)) clan_list[initial(clan_type.name)] = clan_type clan_list = sort_list(clan_list) return clan_list @@ -13,7 +13,7 @@ GLOBAL_LIST_INIT_TYPED(vampire_clans, /datum/vampire_clan, init_vampire_clans()) /proc/init_vampire_clans() var/list/clan_list = list() - for (var/datum/vampire_clan/clan_type as anything in subtypesof(/datum/vampire_clan)) + for (var/datum/vampire_clan/clan_type as anything in valid_subtypesof(/datum/vampire_clan)) clan_list[clan_type] = new clan_type clan_list = sort_list(clan_list) return clan_list diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clan_mark_pref.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clan_mark_pref.dm new file mode 100644 index 000000000000..1e6dc8d76b22 --- /dev/null +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clan_mark_pref.dm @@ -0,0 +1,36 @@ +/datum/preference/external_choiced/clan_mark + savefile_key = "clan_mark" + savefile_identifier = PREFERENCE_CHARACTER + priority = PREFERENCE_PRIORITY_REQUIRES_CLAN + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES + +/datum/preference/external_choiced/clan_mark/has_relevant_feature(datum/preferences/preferences) + var/clan_type = preferences.read_preference(/datum/preference/choiced/vampire_clan) + var/datum/vampire_clan/clan = get_vampire_clan(clan_type) + if(!clan) + return FALSE + if(clan.accessories) + return TRUE + +/datum/preference/external_choiced/clan_mark/get_choices(datum/preferences/preferences) + if(!preferences) + return list("none") + var/clan_type = preferences.read_preference(/datum/preference/choiced/vampire_clan) + var/datum/vampire_clan/clan = get_vampire_clan(clan_type) + if(!clan || !clan.accessories) + return list("none") + return clan.accessories + +/datum/preference/external_choiced/clan_mark/create_informed_default_value(datum/preferences/preferences) + return pick(get_choices(preferences)) + +/datum/preference/external_choiced/clan_mark/apply_to_human(mob/living/carbon/human/target, value) + if(!value) + return + var/datum/vampire_clan/clan = target.get_clan() + if(!length(clan?.accessories)) + return + target.remove_overlay(clan.accessories_layers[value]) + var/mutable_appearance/acc_overlay = mutable_appearance('modular_darkpack/modules/kindred_species/icons/features.dmi', value, -clan.accessories_layers[value]) + target.overlays_standing[clan.accessories_layers[value]] = acc_overlay + target.apply_overlay(clan.accessories_layers[value]) diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/baali/baali.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/baali/baali.dm index 18ad0238f2cd..80703a177225 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/baali/baali.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/baali/baali.dm @@ -2,14 +2,15 @@ name = "Baali" id = VAMPIRE_CLAN_BAALI desc = "The Baali are a bloodline of vampires associated with demon worship. Because of their affinity with the unholy, the Baali are particularly vulnerable to holy iconography, holy ground and holy water. They are highly vulnerable to True Faith." + icon = "baali" curse = "Fear of the Religion." - /* + clan_disciplines = list( /datum/discipline/obfuscate, - /datum/discipline/presence, - /datum/discipline/daimonion + ///datum/discipline/presence, + ///datum/discipline/daimonion ) - */ + clan_traits = list( TRAIT_REPELLED_BY_HOLINESS ) diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/banu_haqim.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/banu_haqim.dm index b9eb71d6c75a..173dfa30a5df 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/banu_haqim.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/banu_haqim.dm @@ -2,14 +2,13 @@ name = "Banu Haqim" id = VAMPIRE_CLAN_BANU_HAQIM desc = "Banu Haqim, also known as Assamites, are traditionally seen by Western Kindred as dangerous assassins and diablerists, but in truth they are guardians, warriors, and scholars who seek to distance themselves from the Jyhad." + icon = "banu_haqim" curse = "Blood Addiction." - /* clan_disciplines = list( /datum/discipline/celerity, /datum/discipline/obfuscate, /datum/discipline/quietus ) - */ clan_traits = list( TRAIT_VITAE_ADDICTION ) diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/brujah.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/brujah.dm index 4459b38ae49b..3448a30b636b 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/brujah.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/brujah.dm @@ -2,14 +2,13 @@ name = "Brujah" id = VAMPIRE_CLAN_BRUJAH desc = "The Brujah are a clan of radicals and troublemakers, Embracing those willing to put someone in their place if the situation calls for it. Most see themselves as warriors with a cause, and these Rebels are guided by their passions, strength, and dedication to their ideals — whatever those may be." + icon = "brujah" curse = "Increased frenzy chances and time." - /* clan_disciplines = list( /datum/discipline/celerity, /datum/discipline/potence, /datum/discipline/presence ) - */ clan_traits = list( TRAIT_LONGER_FRENZY ) diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/caitiff.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/caitiff.dm index 8a34d9c43208..4e72da1d616c 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/caitiff.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/caitiff.dm @@ -2,6 +2,7 @@ name = "Caitiff" id = VAMPIRE_CLAN_CAITIFF desc = "Caitiffs are rare Cainites who do not officially belong to any clan. These vampires have no inherent clan weakness, but no inherent disciplines as well. None of the typical clan markers apply to them. Although the Caitiff have manifested throughout history, they tend to do so more frequently among the higher generations, such that the terms \"Caitiff\" and \"Thin-blooded\" are often considered synonymous. While there is considerable overlap, not all Caitiff are thin-bloods." + icon = "caitiff" curse = "None." clan_disciplines = list() male_clothes = /obj/item/clothing/under/vampire/homeless diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/cappadocian.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/cappadocian.dm index 76a4cb2f0db6..f1d3ae52b17c 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/cappadocian.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/cappadocian.dm @@ -2,14 +2,13 @@ name = "Cappadocian" id = VAMPIRE_CLAN_CAPPADOCIAN desc = "A presumed-to-be-extinct Clan of necromancers, the Cappadocians studied death specifically in the physical world. The Giovanni were Embraced into their line to help further their studies into the underworld. They were rewarded with Diablerie and the destruction of their Clan and founder." + icon = "cappadocian" curse = "Extremely corpselike appearance that worsens with age." - /* clan_disciplines = list( /datum/discipline/auspex, /datum/discipline/fortitude, /datum/discipline/necromancy ) - */ alt_sprite = "rotten1" alt_sprite_greyscale = TRUE diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/doc.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/doc.dm index 8235b1d21f8a..888cebebe4b5 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/doc.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/doc.dm @@ -2,14 +2,13 @@ name = "Daughters of Cacophony" id = VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY desc = "Currently composed mostly of women (due to the associated difficulty in educating someone with the vocal range of most males), the Daughters practice Melpominee, a Discipline which allows the Daughters to invoke strange effects through singing. The Daughters are the choralistes par excellence of the undead, and hosting a gathering of them is worth high prestige for the Toreador." + icon = "daughters_of_cacophony" curse = "Hear more than should." - /* clan_disciplines = list( /datum/discipline/fortitude, - /datum/discipline/melpominee, + // /datum/discipline/melpominee, /datum/discipline/presence ) - */ male_clothes = /obj/item/clothing/under/vampire/sexy female_clothes = /obj/item/clothing/under/vampire/toreador/female enlightenment = FALSE diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/gangrel.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/gangrel.dm index 05d6f89fccb6..61921edc61e3 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/gangrel.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/gangrel.dm @@ -2,19 +2,25 @@ name = "Gangrel" id = VAMPIRE_CLAN_GANGREL desc = "Often closer to beasts than other vampires, the Gangrel style themselves apex predators. These Ferals prowl the wilds as easily as the urban jungle, and no clan of vampires can match their ability to endure, survive, and thrive in any environment. Often fiercely territorial, their shapeshifting abilities even give the undead pause." + icon = "gangrel" curse = "Start with lower humanity." - /* clan_disciplines = list( /datum/discipline/animalism, /datum/discipline/fortitude, /datum/discipline/protean ) - */ start_humanity = 6 male_clothes = /obj/item/clothing/under/vampire/gangrel female_clothes = /obj/item/clothing/under/vampire/gangrel/female - // TODO: [Rebase] re-add Clan accessories - /* accessories = list("beast_legs", "beast_tail", "beast_tail_and_legs", "none") - accessories_layers = list("beast_legs" = UNICORN_LAYER, "beast_tail" = UNICORN_LAYER, "beast_tail_and_legs" = UNICORN_LAYER, "none" = UNICORN_LAYER) - */ + accessories_layers = list("beast_legs" = BODY_ADJ_LAYER, "beast_tail" = BODY_ADJ_LAYER, "beast_tail_and_legs" = BODY_ADJ_LAYER, "none" = BODY_ADJ_LAYER) + +/datum/vampire_clan/gangrel/city + name = "City Gangrel" + id = VAMPIRE_CLAN_CITY_GANGREL + icon = "city_gangrel" + clan_disciplines = list( + /datum/discipline/celerity, + /datum/discipline/obfuscate, + /datum/discipline/protean + ) diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/gargoyle.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/gargoyle.dm index 8838e3034dc9..73969d1eed76 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/gargoyle.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/gargoyle.dm @@ -2,13 +2,13 @@ name = "Gargoyle" id = VAMPIRE_CLAN_GARGOYLE desc = "The Gargoyles are a vampiric bloodline created by the Tremere as their servitors. Although technically not a Tremere bloodline, the bloodline is largely under their control. In the Final Nights, Gargoyle populations seem to be booming; this is largely because older, free Gargoyles are coming out of hiding to join the Camarilla, because more indentured Gargoyles break free from the clutches of the Tremere, and because the free Gargoyles have also begun to Embrace more mortals on their own." + icon = "gargoyle" curse = "All Gargoyles, much like the Nosferatu, are hideous to look at, a byproduct of their occult origins (and the varied Kindred stock from which they originate). This means that Gargoyles, just like the Nosferatu, have to hide their existence from common mortals, as their mere appearance is a breach of the Masquerade. In addition, the nature of the bloodline's origin manifests itself in the fact that Gargoyles are highly susceptible to mind control of any source. This weakness is intentional; a flaw placed into all Gargoyles by the Tremere in the hope that it would make them easier to control (and less likely to rebel)." - /* clan_disciplines = list( /datum/discipline/fortitude, /datum/discipline/potence, - /datum/discipline/visceratika - )*/ + // /datum/discipline/visceratika + ) clan_traits = list( TRAIT_CANNOT_RESIST_MIND_CONTROL, TRAIT_MASQUERADE_VIOLATING_FACE @@ -16,9 +16,27 @@ alt_sprite = "gargoyle" male_clothes = /obj/item/clothing/under/vampire/malkavian female_clothes = /obj/item/clothing/under/vampire/malkavian - //default_accessory = "gargoyle_full" - //accessories = list("gargoyle_full", "gargoyle_left", "gargoyle_right", "gargoyle_broken", "gargoyle_round", "none") - //accessories_layers = list("gargoyle_full" = UNICORN_LAYER, "gargoyle_left" = UNICORN_LAYER, "gargoyle_right" = UNICORN_LAYER, "gargoyle_broken" = UNICORN_LAYER, "gargoyle_round" = UNICORN_LAYER, "none" = UNICORN_LAYER) + default_accessory = "gargoyle_full" + accessories = list( + "gargoyle_full", + "gargoyle_left", + "gargoyle_right", + "gargoyle_broken", + "gargoyle_round", + "gargoyle_oni", + "gargoyle_devil", + "none" + ) + accessories_layers = list( + "gargoyle_full" = BODY_FRONT_LAYER, + "gargoyle_left" = BODY_FRONT_LAYER, + "gargoyle_right" = BODY_FRONT_LAYER, + "gargoyle_broken" = BODY_FRONT_LAYER, + "gargoyle_round" = BODY_FRONT_LAYER, + "gargoyle_oni" = BODY_FRONT_LAYER, + "gargoyle_devil" = BODY_FRONT_LAYER, + "none" = BODY_FRONT_LAYER + ) whitelisted = TRUE /datum/vampire_clan/gargoyle/on_gain(mob/living/carbon/human/H) @@ -27,3 +45,9 @@ //H.dna.species.wings_icon = "Gargoyle" //H.dna.species.GiveSpeciesFlight(H) H.physiology.brute_mod = 0.8 + + //H.remove_overlay(BODY_ADJ_LAYER) + var/mutable_appearance/acc_overlay = mutable_appearance('modular_darkpack/modules/kindred_species/icons/features.dmi', "gargoyle_legs_n_tails", -BODY_ADJ_LAYER) + H.overlays_standing[BODY_ADJ_LAYER] = acc_overlay + H.apply_overlay(BODY_ADJ_LAYER) + ADD_TRAIT(H, TRAIT_WEAK_TO_DOMINATE, VAMPIRE_CLAN_GARGOYLE) diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/giovanni.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/giovanni.dm index 79d6926c5373..c176a7a922d9 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/giovanni.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/giovanni.dm @@ -2,21 +2,20 @@ name = "Giovanni" id = VAMPIRE_CLAN_GIOVANNI desc = "The Giovanni are the usurpers of Clan Cappadocian and one of the youngest clans. The Giovanni has historically been both a clan and a family. They Embrace almost exclusively within their family, and are heavily focused on the goals of money and necromantic power." + icon = "giovanni" curse = "Harmful bites." - /* clan_disciplines = list( /datum/discipline/potence, /datum/discipline/dominate, /datum/discipline/necromancy - )*/ + ) clan_traits = list( TRAIT_PAINFUL_VAMPIRE_KISS ) male_clothes = /obj/item/clothing/under/vampire/suit female_clothes = /obj/item/clothing/under/vampire/suit/female - whitelisted = FALSE /datum/vampire_clan/giovanni/on_join_round(mob/living/carbon/human/H) . = ..() - //H.grant_language(/datum/language/italian) // TODO: [Rebase] LANGUAGES + //H.grant_language(/datum/language/italian) // DARKPACK TODO - LANGUAGES diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/kiasyd/kiasyd.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/kiasyd/kiasyd.dm index ce3fd98731bb..83944f36d595 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/kiasyd/kiasyd.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/kiasyd/kiasyd.dm @@ -2,13 +2,14 @@ name = "Kiasyd" id = VAMPIRE_CLAN_KIASYD desc = "The Kiasyd are a bloodline of the Lasombra founded after a mysterious \"accident\" involving the Lasombra Marconius of Strasbourg. The \"accident\", involving faeries and the blood of \"Zeernebooch, a god of the Underworld\", resulted in Marconius gaining several feet in height, turning chalky white and developing large, elongated black eyes." + icon = "kiasyd" curse = "At a glance they look unsettling or perturbing to most, their appearance closely resembles fae from old folklore. Kiasyd are also in some way connected with changelings and they are vulnerable to cold iron." - /* + clan_disciplines = list( /datum/discipline/dominate, /datum/discipline/obtenebration, - /datum/discipline/mytherceria - )*/ + ///datum/discipline/mytherceria + ) clan_traits = list( TRAIT_MASQUERADE_VIOLATING_EYES ) @@ -17,8 +18,8 @@ male_clothes = /obj/item/clothing/under/vampire/archivist female_clothes = /obj/item/clothing/under/vampire/archivist whitelisted = TRUE - //accessories = list("fae_ears", "none") - //accessories_layers = list("fae_ears" = UPPER_EARS_LAYER, "none" = UPPER_EARS_LAYER) + accessories = list("fae_ears", "none") + accessories_layers = list("fae_ears" = BODY_FRONT_LAYER, "none" = BODY_FRONT_LAYER) /datum/vampire_clan/kiasyd/on_gain(mob/living/carbon/human/vampire, joining_round) . = ..() @@ -30,8 +31,8 @@ H.add_quirk(/datum/quirk/tower) */ - var/obj/item/organ/eyes/night_vision/NV = new() - NV.Insert(vampire, TRUE, DELETE_IF_REPLACED) + var/obj/item/organ/eyes/kiasyd/weird_eyes = new() + weird_eyes.Insert(vampire, TRUE, DELETE_IF_REPLACED) /datum/vampire_clan/kiasyd/on_lose(mob/living/carbon/human/vampire) . = ..() @@ -52,3 +53,7 @@ var/obj/item/clothing/glasses/vampire/sun/new_glasses = new(H.loc) H.equip_to_appropriate_slot(new_glasses, TRUE) + +/obj/item/organ/eyes/kiasyd + // DARKPACK TODO - requires https://github.com/tgstation/tgstation/pull/94242 + // eye_icon_state = "kiasyd" diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/lasombra.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/lasombra.dm deleted file mode 100644 index 3bab302273fe..000000000000 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/lasombra.dm +++ /dev/null @@ -1,25 +0,0 @@ -/datum/vampire_clan/lasombra - name = "Lasombra" - id = VAMPIRE_CLAN_LASOMBRA - desc = "The Lasombra exist for their own success, fighting for personal victories rather than solely for a crown to wear or a throne to sit upon. They believe that might makes right, and are willing to sacrifice anything to achieve their goals. A clan that uses spirituality as a tool rather than seeking honest enlightenment, their fickle loyalties are currently highlighted by half their clan's defection from the Sabbat." - curse = "Technology refuse." - /* - clan_disciplines = list( - /datum/discipline/potence, - /datum/discipline/dominate, - /datum/discipline/obtenebration - ) - */ - clan_traits = list( - TRAIT_REJECTED_BY_TECHNOLOGY, - TRAIT_NO_MIRROR_REFLECTION - ) - male_clothes = /obj/item/clothing/under/vampire/emo - female_clothes = /obj/item/clothing/under/vampire/business - enlightenment = TRUE - -/datum/vampire_clan/lasombra/on_gain(mob/living/carbon/human/H) - . = ..() - - H.vis_flags |= VIS_HIDE - H.faction |= VAMPIRE_CLAN_LASOMBRA diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/lasombra/creatures.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/lasombra/creatures.dm new file mode 100644 index 000000000000..d03a82a7e2ff --- /dev/null +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/lasombra/creatures.dm @@ -0,0 +1,39 @@ +/mob/living/basic/lasombra + name = "shadow abomination" + desc = "A ferocious, fang-bearing creature that resembles a spider." + icon = 'modular_darkpack/modules/npc/icons/shadow_guard.dmi' + icon_state = "shadow" + icon_living = "shadow" + mob_biotypes = MOB_SPIRIT + basic_mob_flags = DEL_ON_DEATH + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + speed = -1 + maxHealth = 100 + health = 100 + obj_damage = 50 + melee_damage_lower = 20 + melee_damage_upper = 20 + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/items/weapons/bite.ogg' + speak_emote = list("gnashes") + faction = list(VAMPIRE_CLAN_LASOMBRA) + pressure_resistance = 200 + bloodpool = 0 + maxbloodpool = 0 + bloodquality = BLOOD_QUALITY_LOW + +/mob/living/basic/lasombra/better + icon_state = "shadow2" + icon_living = "shadow2" + maxHealth = 200 + health = 200 + melee_damage_lower = 50 + melee_damage_upper = 50 + +/mob/living/basic/lasombra/hostile + faction = list(FACTION_HOSTILE) + +/mob/living/basic/lasombra/better/hostile + faction = list(FACTION_HOSTILE) diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/lasombra/lasombra.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/lasombra/lasombra.dm new file mode 100644 index 000000000000..7fa83da27dbc --- /dev/null +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/lasombra/lasombra.dm @@ -0,0 +1,25 @@ +/datum/vampire_clan/lasombra + name = "Lasombra" + id = VAMPIRE_CLAN_LASOMBRA + desc = "The Lasombra exist for their own success, fighting for personal victories rather than solely for a crown to wear or a throne to sit upon. They believe that might makes right, and are willing to sacrifice anything to achieve their goals. A clan that uses spirituality as a tool rather than seeking honest enlightenment, their fickle loyalties are currently highlighted by half their clan's defection from the Sabbat." + icon = "lasombra" + curse = "Technology refuse." + clan_disciplines = list( + /datum/discipline/potence, + /datum/discipline/dominate, + /datum/discipline/obtenebration + ) + clan_traits = list( + TRAIT_REJECTED_BY_TECHNOLOGY, + TRAIT_NO_MIRROR_REFLECTION + ) + male_clothes = /obj/item/clothing/under/vampire/emo + female_clothes = /obj/item/clothing/under/vampire/business + enlightenment = TRUE + clan_keys = /obj/item/vamp/keys/lasombra + +/datum/vampire_clan/lasombra/on_gain(mob/living/carbon/human/H) + . = ..() + + H.vis_flags |= VIS_HIDE + H.faction |= VAMPIRE_CLAN_LASOMBRA diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/malkavian.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/malkavian.dm deleted file mode 100644 index a49eac4d9061..000000000000 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/malkavian.dm +++ /dev/null @@ -1,116 +0,0 @@ -/datum/vampire_clan/malkavian - name = "Malkavian" - id = VAMPIRE_CLAN_MALKAVIAN - desc = "Derided as Lunatics by other vampires, the Blood of the Malkavians lets them perceive and foretell truths hidden from others. Like the �wise madmen� of poetry their fractured perspective stems from seeing too much of the world at once, from understanding too deeply, and feeling emotions that are just too strong to bear." - curse = "Insanity." - /* - clan_disciplines = list( - /datum/discipline/auspex, - /datum/discipline/dementation, - /datum/discipline/obfuscate - )*/ - male_clothes = /obj/item/clothing/under/vampire/malkavian - female_clothes = /obj/item/clothing/under/vampire/malkavian/female - clan_keys = /obj/item/vamp/keys/malkav - - var/list/mob/living/madness_network - -/datum/vampire_clan/malkavian/on_gain(mob/living/carbon/human/vampire) - . = ..() - - var/datum/action/cooldown/malk_hivemind/hivemind = new() - var/datum/action/cooldown/malk_speech/malk_font = new() - hivemind.Grant(vampire) - malk_font.Grant(vampire) - - // Madness Network handling - LAZYADD(madness_network, vampire) - RegisterSignal(vampire, COMSIG_MOB_SAY, PROC_REF(handle_say), override = TRUE) - RegisterSignal(vampire, COMSIG_MOVABLE_HEAR, PROC_REF(handle_hear), override = TRUE) - -/datum/vampire_clan/malkavian/on_lose(mob/living/carbon/human/vampire) - . = ..() - - for (var/datum/action/cooldown/malkavian_action in vampire.actions) - if (!istype(malkavian_action, /datum/action/cooldown/malk_hivemind) && !istype(malkavian_action, /datum/action/cooldown/malk_speech)) - continue - malkavian_action.Remove(vampire) - - // Remove Madness Network - LAZYREMOVE(madness_network, vampire) - UnregisterSignal(vampire, COMSIG_MOB_SAY) - UnregisterSignal(vampire, COMSIG_MOVABLE_HEAR) - -/datum/vampire_clan/malkavian/proc/handle_say(mob/living/source, list/speech_args) - SIGNAL_HANDLER - - if (!prob(20)) - return - - say_in_madness_network(speech_args[SPEECH_MESSAGE]) - -/datum/vampire_clan/malkavian/proc/handle_hear(mob/living/source, list/hearing_args) - SIGNAL_HANDLER - - if (!prob(3)) - return - - say_in_madness_network(hearing_args[HEARING_RAW_MESSAGE]) - -/datum/vampire_clan/malkavian/proc/say_in_madness_network(message) - for (var/mob/living/malkavian in madness_network) - to_chat(malkavian, span_ghostalert(message)) - -/datum/action/cooldown/malk_hivemind - name = "Hivemind" - desc = "Talk" - button_icon_state = "hivemind" - check_flags = AB_CHECK_CONSCIOUS - vampiric = TRUE - cooldown_time = 5 SECONDS - -/datum/action/cooldown/malk_hivemind/Trigger(mob/clicker, trigger_flags, atom/target) - . = ..() - if(!IsAvailable()) - return - - var/datum/vampire_clan/malkavian/clan_malkavian = get_vampire_clan(VAMPIRE_CLAN_MALKAVIAN) - if (!(clicker in clan_malkavian.madness_network)) - return - - var/new_thought = stripped_input(clicker, "Have any thoughts about this, buddy?") - if (!new_thought) - return - - StartCooldown() - clan_malkavian.say_in_madness_network(new_thought) - - message_admins("[ADMIN_LOOKUPFLW(usr)] said \"[new_thought]\" through the Madness Network.") - log_game("[key_name(usr)] said \"[new_thought]\" through the Madness Network.") - -/datum/action/cooldown/malk_speech - name = "Madness Speech" - desc = "Unleash your innermost thoughts" - button_icon_state = "malk_speech" - check_flags = AB_CHECK_CONSCIOUS - vampiric = TRUE - cooldown_time = 5 MINUTES - -/datum/action/cooldown/malk_speech/Trigger(mob/clicker, trigger_flags, atom/target) - . = ..() - var/mad_speak = FALSE - if(IsAvailable()) - mad_speak = tgui_input_text(clicker, "What revelations do we wish to convey?", encode = FALSE) - if(CAN_BYPASS_FILTER(clicker) ? null : is_ic_filtered(mad_speak)) - //before we inadvertently obfuscate the message to pass filters, filter it first. - //as funny as malkavians saying "amogus" would be, the filter also includes slurs... how unfortunate. - to_chat(clicker, span_warning("That message contained a word prohibited in IC chat! Consider reviewing the server rules.\n<span replaceRegex='show_filtered_ic_chat'>\"[mad_speak]\"</span>")) - SSblackbox.record_feedback("tally", "ic_blocked_words", 1, lowertext(config.ic_filter_regex.match)) - return - - if(mad_speak) - StartCooldown() - // replace some letters to make the font more closely resemble that of vtm: bloodlines' malkavian dialogue - // big thanks to Metek for helping me condense this from a bunch of ugly regex replace procs - mad_speak = spooky_font_replace(mad_speak) - clicker.say(mad_speak, spans = list(SPAN_SANS)) // say() handles sanitation on its own diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/malkavian/malkavian.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/malkavian/malkavian.dm new file mode 100644 index 000000000000..952b1eef03cf --- /dev/null +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/malkavian/malkavian.dm @@ -0,0 +1,110 @@ +/datum/vampire_clan/malkavian + name = "Malkavian" + id = VAMPIRE_CLAN_MALKAVIAN + desc = "Derided as Lunatics by other vampires, the Blood of the Malkavians lets them perceive and foretell truths hidden from others. Like the �wise madmen� of poetry their fractured perspective stems from seeing too much of the world at once, from understanding too deeply, and feeling emotions that are just too strong to bear." + icon = "malkavian" + curse = "Insanity." + clan_disciplines = list( + /datum/discipline/auspex, + /datum/discipline/dementation, + /datum/discipline/obfuscate + ) + male_clothes = /obj/item/clothing/under/vampire/malkavian + female_clothes = /obj/item/clothing/under/vampire/malkavian/female + clan_keys = /obj/item/vamp/keys/malkav + var/list/mob/living/madness_network + +/datum/vampire_clan/malkavian/on_gain(mob/living/carbon/human/vampire) + . = ..() + + var/datum/action/cooldown/malk_hivemind/hivemind = new(vampire) + var/datum/action/cooldown/malk_speech/malk_font = new(vampire) + hivemind.Grant(vampire) + malk_font.Grant(vampire) + vampire.add_quirk(/datum/quirk/derangement) + + // Madness Network handling + LAZYADD(madness_network, vampire) + RegisterSignal(vampire, COMSIG_MOB_SAY, PROC_REF(handle_say), override = TRUE) + RegisterSignal(vampire, COMSIG_MOVABLE_HEAR, PROC_REF(handle_hear), override = TRUE) + +/datum/vampire_clan/malkavian/on_lose(mob/living/carbon/human/vampire) + . = ..() + + for (var/datum/action/cooldown/malkavian_action in vampire.actions) + if (!istype(malkavian_action, /datum/action/cooldown/malk_hivemind) && !istype(malkavian_action, /datum/action/cooldown/malk_speech)) + continue + malkavian_action.Remove(vampire) + + // Remove Madness Network + LAZYREMOVE(madness_network, vampire) + UnregisterSignal(vampire, COMSIG_MOB_SAY) + UnregisterSignal(vampire, COMSIG_MOVABLE_HEAR) + +/datum/vampire_clan/malkavian/proc/handle_say(mob/living/source, list/speech_args) + SIGNAL_HANDLER + + if (!prob(20)) + return + + say_in_madness_network(speech_args[SPEECH_MESSAGE]) + +/datum/vampire_clan/malkavian/proc/handle_hear(mob/living/source, list/hearing_args) + SIGNAL_HANDLER + + if(!prob(3)) + return + + say_in_madness_network(hearing_args[HEARING_RAW_MESSAGE]) + +/datum/vampire_clan/malkavian/proc/say_in_madness_network(message) + for (var/mob/living/malkavian in madness_network) + to_chat(malkavian, span_ghostalert(message)) + +/datum/action/cooldown/malk_hivemind + name = "Hivemind" + desc = "Talk" + button_icon = 'modular_darkpack/master_files/icons/hud/actions.dmi' + button_icon_state = "hivemind" + check_flags = AB_CHECK_CONSCIOUS + vampiric = TRUE + cooldown_time = 5 SECONDS + +/datum/action/cooldown/malk_hivemind/Trigger(mob/clicker, trigger_flags, atom/target) + . = ..() + var/mob/living/carbon/human/malk = clicker + if (!malk.is_clan(/datum/vampire_clan/malkavian)) + return + var/datum/vampire_clan/malkavian/clan_malkavian = malk.get_clan() + var/new_thought = tgui_input_text(clicker, "Malkavian Hivemind") + if(!new_thought) + return + StartCooldown() + clan_malkavian.say_in_madness_network(new_thought) + message_admins("[ADMIN_LOOKUPFLW(usr)] said \"[new_thought]\" through the Madness Network.") + log_game("[key_name(usr)] said \"[new_thought]\" through the Madness Network.") + +/datum/action/cooldown/malk_speech + name = "Madness Speech" + desc = "Unleash your innermost thoughts" + button_icon = 'modular_darkpack/master_files/icons/hud/actions.dmi' + button_icon_state = "malk_speech" + check_flags = AB_CHECK_CONSCIOUS + vampiric = TRUE + cooldown_time = 5 SECONDS + +/datum/action/cooldown/malk_speech/Trigger(mob/clicker, trigger_flags, atom/target) + . = ..() + var/malkavian_spans = list("singing", "bold") + var/mad_speak = tgui_input_text(clicker, "Malkavian Speech", encode = FALSE) + if(CAN_BYPASS_FILTER(clicker) ? null : is_ic_filtered(mad_speak)) + //before we inadvertently obfuscate the message to pass filters, filter it first. + //as funny as malkavians saying "amogus" would be, the filter also includes slurs... how unfortunate. + to_chat(clicker, span_warning("That message contained a word prohibited in IC chat! Consider reviewing the server rules.\n<span replaceRegex='show_filtered_ic_chat'>\"[mad_speak]\"</span>")) + SSblackbox.record_feedback("tally", "ic_blocked_words", 1, lowertext(config.ic_filter_regex.match)) + return + if(!mad_speak) + return + StartCooldown() + mad_speak = spooky_font_replace(mad_speak) // replace some letters to make the font more closely resemble that of vtm: bloodlines' malkavian dialogue + clicker.say(mad_speak, spans = list(malkavian_spans)) diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/nosferatu.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/nosferatu.dm index b427bed701fc..b92a34b6176e 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/nosferatu.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/nosferatu.dm @@ -2,22 +2,22 @@ name = "Nosferatu" id = VAMPIRE_CLAN_NOSFERATU desc = "The Nosferatu wear their curse on the outside. Their bodies horribly twisted and deformed through the Embrace, they lurk on the fringes of most cities, acting as spies and brokers of information. Using animals and their own supernatural capacity to hide, nothing escapes the eyes of the so-called Sewer Rats." + icon = "nosferatu" curse = "Masquerade-violating appearance." alt_sprite = "nosferatu" - /* clan_disciplines = list( /datum/discipline/animalism, /datum/discipline/potence, /datum/discipline/obfuscate - )*/ + ) clan_traits = list( TRAIT_MASQUERADE_VIOLATING_FACE, TRAIT_VENTCRAWLER_ALWAYS ) male_clothes = /obj/item/clothing/under/vampire/nosferatu female_clothes = /obj/item/clothing/under/vampire/nosferatu/female - //accessories = list("nosferatu_ears", "none") - //accessories_layers = list("nosferatu_ears" = UPPER_EARS_LAYER, "none" = UPPER_EARS_LAYER) + accessories = list("nosferatu_ears", "none") + accessories_layers = list("nosferatu_ears" = BODY_FRONT_LAYER, "none" = BODY_FRONT_LAYER) default_accessory = "nosferatu_ears" clan_keys = /obj/item/vamp/keys/nosferatu diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/old_clan_tzimisce.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/old_clan_tzimisce.dm index b2a784f1c9c6..cdbaab74e797 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/old_clan_tzimisce.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/old_clan_tzimisce.dm @@ -1,14 +1,14 @@ /datum/vampire_clan/old_clan_tzimisce name = "Old Clan Tzimisce" id = VAMPIRE_CLAN_OLD_CLAN_TZIMISCE - desc = " The Old Clan Tzimisce are a small group of Fiends who predate the use of fleshcrafting. They regard Vicissitude as a disease of the soul, and refuse to learn or employ it. In most other respects, though, they resemble the rest of the Clan." + desc = "The Old Clan Tzimisce are a small group of Fiends who predate the use of fleshcrafting. They regard Vicissitude as a disease of the soul, and refuse to learn or employ it. In most other respects, though, they resemble the rest of the Clan." + icon = "old_clan_tzimisce" curse = "Grounded to material domain." - /* clan_disciplines = list( /datum/discipline/auspex, /datum/discipline/animalism, /datum/discipline/dominate - )*/ + ) male_clothes = /obj/item/clothing/under/vampire/sport female_clothes = /obj/item/clothing/under/vampire/red enlightenment = TRUE diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/salubri.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/salubri.dm index 1ce2b9d5bdef..afb4b00d3df6 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/salubri.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/salubri.dm @@ -2,14 +2,13 @@ name = "Salubri" id = VAMPIRE_CLAN_SALUBRI desc = "The Salubri are one of the original 13 clans of the vampiric descendants of Caine. Salubri believe that vampiric existence is torment from which Golconda or death is the only escape. Consequently, the modern Salubri would Embrace, teach a childe the basics of the route, leave clues for the childe to follow to achieve Golconda, and then have their childe diablerize them." + icon = "salubri" curse = "Hunted and consensual feeding." - /* clan_disciplines = list( /datum/discipline/auspex, /datum/discipline/fortitude, - /datum/discipline/valeren + // /datum/discipline/valeren ) - */ clan_traits = list( TRAIT_CONSENSUAL_FEEDING_ONLY, TRAIT_IRRESISTIBLE_VITAE @@ -17,5 +16,4 @@ male_clothes = /obj/item/clothing/under/vampire/salubri female_clothes = /obj/item/clothing/under/vampire/salubri/female enlightenment = FALSE - whitelisted = FALSE clan_keys = /obj/item/vamp/keys/salubri diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/setite.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/setite.dm index 6f148757a185..c0d68f9357be 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/setite.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/setite.dm @@ -2,18 +2,17 @@ name = "Setite" id = VAMPIRE_CLAN_SETITE desc = "The Followers of Set, also called the Ministry of Set, Ministry, or Setites, are a clan of vampires who believe their founder was the Egyptian god Set." + icon = "followers_of_set" curse = "Decreased moving speed in lighted areas." - /* clan_disciplines = list( /datum/discipline/obfuscate, /datum/discipline/presence, - /datum/discipline/serpentis - )*/ + // /datum/discipline/serpentis + ) male_clothes = /obj/item/clothing/under/vampire/slickback female_clothes = /obj/item/clothing/under/vampire/burlesque /datum/vampire_clan/setite/on_gain(mob/living/carbon/human/vampire, joining_round) . = ..() //vampire.add_quirk(/datum/quirk/lightophobia) - var/obj/item/organ/eyes/night_vision/NV = new() - NV.Insert(vampire, TRUE, DELETE_IF_REPLACED) + diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/toreador.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/toreador.dm index 6d6f018d7090..6455df31f0ba 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/toreador.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/toreador.dm @@ -2,14 +2,13 @@ name = "Toreador" id = VAMPIRE_CLAN_TOREADOR desc = "Known for their seductive nature, enthralling demeanor, and eloquent grace to the point of obsession, Toreador vampires Embrace artists and lovers into their ranks, forever trying to stir their own deadened hearts. Supernaturally graceful and charming, the Divas are always looking for the next thrill, leaving a detritus of discarded lovers and victims in their wake." + icon = "toreador" curse = "Doubled humanity changes." - /* clan_disciplines = list( /datum/discipline/auspex, /datum/discipline/celerity, /datum/discipline/presence ) - */ clan_traits = list( TRAIT_SENSITIVE_HUMANITY ) diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tremere.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tremere.dm index dee8159f8d07..4d0186f461ea 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tremere.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tremere.dm @@ -2,13 +2,12 @@ name = "Tremere" id = VAMPIRE_CLAN_TREMERE desc = "The arcane Clan Tremere were once a house of mortal mages who sought immortality but found only undeath. As vampires, they’ve perfected ways to bend their own Blood to their will, employing their sorceries to master and ensorcel both the mortal and vampire world. Their power makes them valuable, but few vampires trust their scheming ways." + icon = "tremere" curse = "Blood magic." - /* clan_disciplines = list( /datum/discipline/auspex, /datum/discipline/dominate, /datum/discipline/thaumaturgy ) - */ male_clothes = /obj/item/clothing/under/vampire/tremere female_clothes = /obj/item/clothing/under/vampire/tremere/female diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/true_brujah.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/true_brujah.dm index 3d33a5cf5272..42fb68a33ddd 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/true_brujah.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/true_brujah.dm @@ -2,16 +2,15 @@ name = "True Brujah" id = VAMPIRE_CLAN_TRUE_BRUJAH desc = "The True Brujah are a bloodline of Clan Brujah that claim to be descendants of the original Antediluvian founder of the lineage and not his diablerist/childe Troile. They are also noted for their calm, detached behavior, which puts them in contrast to the main lineage who are known for their rather short, violent tempers and anti-establishment attitudes. " + icon = "true_brujah" curse = "Absence of passion." - /* clan_disciplines = list( /datum/discipline/potence, /datum/discipline/presence, /datum/discipline/temporis ) - */ enlightenment = TRUE male_clothes = /obj/item/clothing/under/vampire/rich female_clothes = /obj/item/clothing/under/vampire/business - //restricted_disciplines = list(/datum/discipline/celerity) + restricted_disciplines = list(/datum/discipline/celerity) whitelisted = TRUE diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/crafting_recipes.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/crafting_recipes.dm index 40429fdfd4bc..56527f7a8559 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/crafting_recipes.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/crafting_recipes.dm @@ -1,4 +1,4 @@ - +/* // DARKPACK TODO - requires vicissitude material to pass unit tests. /datum/crafting_recipe/tzi_trench name = "Leather-Bone Trenchcoat (Armor)" time = 50 @@ -17,14 +17,19 @@ name = "Better Eyes (Nightvision)" time = 50 reqs = list(/obj/item/stack/human_flesh = 15, /obj/item/organ/eyes = 1) - result = /obj/item/organ/eyes/night_vision + result = /obj/item/organ/eyes/night_vision/tzimisce category = CAT_TZIMISCE +/obj/item/organ/eyes/night_vision/tzimisce + low_light_cutoff = list(15, 6, 8) + medium_light_cutoff = list(35, 20, 25) + high_light_cutoff = list(50, 40, 40) + /datum/crafting_recipe/tzi_implant name = "Implanting Flesh Device" time = 50 reqs = list(/obj/item/stack/human_flesh = 10, /obj/item/knife/vamp = 1, /obj/item/reagent_containers/blood = 1) - result = /obj/item/autosurgeon // DARKPACK TODO: Tzimisce autosurgeon + result = /obj/item/autosurgeon // DARKPACK TODO - Tzimisce autosurgeon category = CAT_TZIMISCE /datum/crafting_recipe/tzi_floor @@ -33,13 +38,15 @@ reqs = list(/obj/item/stack/human_flesh = 1, /obj/item/guts = 1) result = /obj/effect/decal/gut_floor category = CAT_TZIMISCE + crafting_flags = CRAFT_ON_SOLID_GROUND|CRAFT_CHECK_DENSITY /datum/crafting_recipe/tzi_wall name = "Flesh Wall" time = 50 reqs = list(/obj/item/stack/human_flesh = 2) - result = /turf/closed/wall/mineral/iron // DARKPACK TODO: Tzimisce walls + result = /turf/closed/wall/mineral/iron // DARKPACK TODO - Tzimisce walls category = CAT_TZIMISCE + crafting_flags = CRAFT_CHECK_DENSITY /datum/crafting_recipe/tzi_stool name = "Arm Stool" @@ -61,6 +68,7 @@ reqs = list(/obj/item/stack/human_flesh = 5, /obj/item/bodypart/arm/right = 1, /obj/item/bodypart/arm/left = 1, /obj/item/spine = 1, /obj/item/guts = 1) result = /mob/living/basic/fister category = CAT_TZIMISCE + crafting_flags = CRAFT_CHECK_DENSITY /datum/crafting_recipe/tzi_tanker name = "Fat Abomination" @@ -68,3 +76,5 @@ reqs = list(/obj/item/stack/human_flesh = 10, /obj/item/bodypart/arm/right = 1, /obj/item/bodypart/arm/left = 1, /obj/item/bodypart/leg/right = 1, /obj/item/bodypart/leg/left = 1, /obj/item/spine = 1, /obj/item/guts = 2) result = /mob/living/basic/tanker category = CAT_TZIMISCE + crafting_flags = CRAFT_CHECK_DENSITY +*/ diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/creatures.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/creatures.dm index ad489e92abdb..7e2f2193cde1 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/creatures.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/creatures.dm @@ -1,12 +1,11 @@ - -/mob/living/basic/biter +/mob/living/basic/szlachta name = "biter" desc = "A ferocious, fang-bearing creature that resembles a spider." icon = 'modular_darkpack/modules/deprecated/icons/mobs.dmi' icon_state = "biter" icon_living = "biter" icon_dead = "biter_dead" - mob_biotypes = MOB_ORGANIC|MOB_BEAST + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID butcher_results = list(/obj/item/stack/human_flesh = 1) response_help_continuous = "pets" response_help_simple = "pet" @@ -28,34 +27,12 @@ bloodpool = 2 maxbloodpool = 2 -/mob/living/basic/biter/lasombra - name = "shadow abomination" - mob_biotypes = MOB_SPIRIT - icon_state = "shadow" - icon_living = "shadow" - basic_mob_flags = DEL_ON_DEATH - maxHealth = 100 - health = 100 - bloodpool = 0 - maxbloodpool = 0 - faction = list(VAMPIRE_CLAN_LASOMBRA) - -/mob/living/basic/biter/lasombra/better - icon_state = "shadow2" - icon_living = "shadow2" - maxHealth = 200 - health = 200 - melee_damage_lower = 50 - melee_damage_upper = 50 - -/mob/living/basic/fister +/mob/living/basic/szlachta/fister name = "fister" - desc = "True abomination walking on both hands." - icon = 'modular_darkpack/modules/deprecated/icons/mobs.dmi' + desc = "A true abomination walking on both hands." icon_state = "fister" icon_living = "fister" icon_dead = "fister_dead" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID maxHealth = 125 health = 125 butcher_results = list(/obj/item/stack/human_flesh = 2) @@ -66,19 +43,15 @@ attack_sound = 'sound/items/weapons/punch1.ogg' combat_mode = TRUE status_flags = CANPUSH - faction = list(VAMPIRE_CLAN_TZIMISCE) - bloodquality = BLOOD_QUALITY_LOW bloodpool = 5 maxbloodpool = 5 -/mob/living/basic/tanker +/mob/living/basic/szlachta/tanker name = "tanker" - desc = "The peak of abominations armor. Unbelievably undamagable..." - icon = 'modular_darkpack/modules/deprecated/icons/mobs.dmi' + desc = "The peak of abominable armor. Unbelievably undamagable..." icon_state = "tanker" icon_living = "tanker" icon_dead = "tanker_dead" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID maxHealth = 350 health = 350 butcher_results = list(/obj/item/stack/human_flesh = 4) @@ -88,51 +61,11 @@ attack_verb_simple = "slash" attack_sound = 'sound/items/weapons/slash.ogg' combat_mode = TRUE - faction = list(VAMPIRE_CLAN_TZIMISCE) - bloodquality = BLOOD_QUALITY_LOW bloodpool = 7 maxbloodpool = 7 -/mob/living/basic/gangrel - name = "Gangrel Form" - desc = "The peak of abominations armor. Unbelievably undamagable..." - icon = 'modular_darkpack/modules/deprecated/icons/32x48.dmi' - icon_state = "gangrel_f" - icon_living = "gangrel_f" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - mob_size = MOB_SIZE_HUGE - speed = -0.4 - maxHealth = 400 - health = 400 - butcher_results = list(/obj/item/stack/human_flesh = 10) - melee_damage_lower = 40 - melee_damage_upper = 40 - attack_verb_continuous = "slashes" - attack_verb_simple = "slash" - attack_sound = 'sound/items/weapons/slash.ogg' - combat_mode = TRUE - bloodpool = 10 - maxbloodpool = 10 - held_items = list(null, null) - -/mob/living/basic/gangrel/better - maxHealth = 500 - health = 500 - melee_damage_lower = 45 - melee_damage_upper = 45 - speed = -0.6 - -/mob/living/basic/gangrel/best - icon_state = "gangrel_m" - icon_living = "gangrel_m" - maxHealth = 600 - health = 600 - melee_damage_lower = 55 - melee_damage_upper = 55 - speed = -0.8 - /mob/living/basic/tzimisce_beast - name = "Tzimisce Beast Form" + name = "tzimisce beast form" desc = "The peak of abominations armor. Unbelievably undamagable..." icon = 'modular_darkpack/modules/deprecated/icons/64x64.dmi' icon_state = "weretzi" @@ -155,7 +88,7 @@ maxbloodpool = 10 /mob/living/basic/bloodcrawler - name = "Tzimisce Blood Form" + name = "tzimisce blood form" desc = "The peak of abominations. Unbelievably undamagable..." icon = 'modular_darkpack/modules/deprecated/icons/mobs.dmi' icon_state = "liquid" @@ -172,13 +105,13 @@ bloodpool = 20 maxbloodpool = 20 -/mob/living/basic/biter/hostile +/mob/living/basic/szlachta/hostile faction = list(FACTION_HOSTILE) -/mob/living/basic/fister/hostile +/mob/living/basic/szlachta/fister/hostile faction = list(FACTION_HOSTILE) -/mob/living/basic/tanker/hostile +/mob/living/basic/szlachta/tanker/hostile faction = list(FACTION_HOSTILE) /mob/living/basic/bloodcrawler diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/needs_home_soil.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/needs_home_soil.dm index fd9a11d837da..b195d6b4b1ba 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/needs_home_soil.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/needs_home_soil.dm @@ -40,7 +40,7 @@ return var/mob/living/lacking_soil = parent - lacking_soil.bloodpool = clamp(lacking_soil.bloodpool - 1, 0, lacking_soil.maxbloodpool) + lacking_soil.adjust_blood_pool(-1) to_chat(lacking_soil, span_warning("You are missing your home soil. Being without it weakens you...")) @@ -51,8 +51,8 @@ var/mob/living/lacking_soil = parent lacking_soil.apply_damage(0.25 * lacking_soil.getMaxHealth(), AGGRAVATED) // Currently nonfunctional, will be fixed in the splat rework - lacking_soil.maxbloodpool = max(lacking_soil.maxbloodpool - 3, 8) - lacking_soil.bloodpool = clamp(lacking_soil.bloodpool - 3, 0, lacking_soil.maxbloodpool) + // lacking_soil.maxbloodpool = max(lacking_soil.maxbloodpool - 3, 8) + lacking_soil.adjust_blood_pool(-3) to_chat(lacking_soil, span_danger("Your home soil has been destroyed! Its loss debilitates you.")) diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/tzimisce.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/tzimisce.dm index cf8d3c4bc0ec..166b2881454d 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/tzimisce.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/tzimisce/tzimisce.dm @@ -3,17 +3,16 @@ id = VAMPIRE_CLAN_TZIMISCE desc = "If someone were to call a Tzimisce inhuman and sadistic, the Tzimisce would probably commend them for their perspicacity, and then demonstrate that their mortal definition of sadism was laughably inadequate. The Tzimisce have left the human condition behind gladly, and now focus on transcending the limitations of the vampiric state. At a casual glance or a brief conversation, a Tzimisce appears to be one of the more pleasant vampires. Polite, intelligent, and inquisitive, they seem a stark contrast to the howling Sabbat mobs or even the apparently more humane Brujah or Nosferatu. However, upon closer inspection, it becomes clear that this is merely a mask hiding something alien and monstrous." curse = "Grounded to material domain." - /* clan_disciplines = list( /datum/discipline/auspex, /datum/discipline/animalism, - /datum/discipline/vicissitude - )*/ + // /datum/discipline/vicissitude + ) male_clothes = /obj/item/clothing/under/vampire/sport female_clothes = /obj/item/clothing/under/vampire/red enlightenment = TRUE - //accessories = list("spines", "spines_slim", "animal_skull", "none") - //accessories_layers = list("spines" = UNICORN_LAYER, "spines_slim" = UNICORN_LAYER, "animal_skull" = UNICORN_LAYER, "none" = UNICORN_LAYER) + accessories = list("spines", "spines_slim", "animal_skull", "none") + accessories_layers = list("spines" = BODY_ADJ_LAYER, "spines_slim" = BODY_ADJ_LAYER, "animal_skull" = BODY_ADJ_LAYER, "none" = BODY_ADJ_LAYER) /datum/action/cooldown/spell/shapeshift/tzimisce name = "Tzimisce Form" diff --git a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/ventrue.dm b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/ventrue.dm index a895fcfe9b13..11c439c44e6e 100644 --- a/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/ventrue.dm +++ b/modular_darkpack/modules/kindred_species/code/vampire_clan/clans/ventrue.dm @@ -2,14 +2,13 @@ name = "Ventrue" id = VAMPIRE_CLAN_VENTRUE desc = "The Ventrue are not called the Clan of Kings for nothing. Carefully choosing their progeny from mortals familiar with power, wealth, and influence, the Ventrue style themselves the aristocrats of the vampire world. Their members are expected to assume command wherever possible, and they’re willing to endure storms for the sake of leading from the front." + icon = "ventrue" curse = "Low-rank and animal blood is disgusting." - /* clan_disciplines = list( /datum/discipline/dominate, /datum/discipline/fortitude, /datum/discipline/presence ) - */ clan_traits = list( TRAIT_FEEDING_RESTRICTION ) diff --git a/modular_darkpack/modules/kindred_species/code/vampireinfo.dm b/modular_darkpack/modules/kindred_species/code/vampireinfo.dm deleted file mode 100644 index 7f8792316166..000000000000 --- a/modular_darkpack/modules/kindred_species/code/vampireinfo.dm +++ /dev/null @@ -1,170 +0,0 @@ -/datum/action/vampireinfo - name = "About Me" - desc = "Check assigned role, clan, generation, humanity, masquerade, known disciplines, known contacts etc." - button_icon_state = "masquerade" - check_flags = NONE - var/mob/living/carbon/human/host - -/datum/action/vampireinfo/Trigger(trigger_flags) - if(host) - var/dat = {" - <style type="text/css"> - - body { - padding: 5px; - background-color: #090909; color: white; - } - - </style> - "} - dat += "<p><center><h2>Memories</h2></center></p>" - dat += "<p>[icon2html(getFlatIcon(host), host)]I am " - if(host.real_name) - dat += "[host.real_name]," - if(!host.real_name) - dat += "Unknown," - if(host.clan) - dat += " the [host.clan.name]" - if(!host.clan) - dat += " the caitiff" - - if(host.mind) - - if(host.mind.assigned_role) - if(host.mind.special_role) - dat += ", carrying the [host.mind.assigned_role] (<font color=red>[host.mind.special_role]</font>) role." - else - dat += ", carrying the [host.mind.assigned_role] role." - if(!host.mind.assigned_role) - dat += "." - dat += "</p>" - if(host.mind.enslaved_to) - dat += "<p>My Regnant is [host.mind.enslaved_to], I should obey their wants.</p>" - var/datum/bank_account/account = host.account_id ? SSeconomy.bank_accounts_by_id["[host.account_id]"] : null - if(account) - dat += "<b>My bank pin is: [account.bank_pin]</b><BR>" - var/obj/keypad/armory/armory = find_keypad(/obj/keypad/armory) - if(armory && (host.mind.assigned_role == "Prince" || host.mind.assigned_role == "Sheriff" || host.mind.assigned_role == "Seneschal")) - dat += "<p>The pincode for the armory keypad is<b>: [armory.pincode]</b></p>" - var/obj/keypad/panic_room/panic = find_keypad(/obj/keypad/panic_room) - if(panic && (host.mind.assigned_role == "Prince" || host.mind.assigned_role == "Sheriff" || host.mind.assigned_role == "Seneschal")) - dat += "<p>The pincode for the panic room keypad is<b>: [panic.pincode]</b></p>" - var/obj/structure/vaultdoor/pincode/bank/bankdoor = find_door_pin(/obj/structure/vaultdoor/pincode/bank) - if(bankdoor && (host.mind.assigned_role == "Capo")) - dat += "<p>The pincode for the bank vault is <b>: [bankdoor.pincode]</b></p>" - if(bankdoor && (host.mind.assigned_role == "La Squadra")) - if(prob(50)) - dat += "<p>The pincode for the bank vault is: [bankdoor.pincode]</b></p>" - else - dat += "<p>Unfortunately you don't know the vault code.</b></p>" - if(host.generation) - dat += "</p>I'm from the [host.generation] generation.</p>" - if(host.mind.special_role) - for(var/datum/antagonist/A in host.mind.antag_datums) - if(A.objectives) - dat += "<p>[printobjectives(A.objectives)]</p>" - var/masquerade_level = " followed the Masquerade Tradition perfectly." - switch(host.masquerade) - if(4) - masquerade_level = " broke the Masquerade rule once." - if(3) - masquerade_level = " made a couple of Masquerade breaches." - if(2) - masquerade_level = " provoked a moderate Masquerade breach." - if(1) - masquerade_level = " almost ruined the Masquerade." - if(0) - masquerade_level = "'m danger to the Masquerade and my own kind." - dat += "<p>Camarilla thinks I[masquerade_level]</p>" - var/humanity = "I'm out of my mind." - var/enlight = FALSE - if(host.client?.prefs?.enlightenment) - enlight = TRUE - - if(!enlight) - switch(host.humanity) - if(8 to 10) - humanity = "I'm saintly." - if(7) - humanity = "I feel as human as when I lived." - if(5 to 6) - humanity = "I'm feeling distant from my humanity." - if(4) - humanity = "I don't feel any compassion for the Kine anymore." - if(2 to 3) - humanity = "I feel hunger for <b>BLOOD</b>. My humanity is slipping away." - if(1) - humanity = "Blood. Feed. Hunger. It gnaws. Must <b>FEED!</b>" - - else - switch(host.humanity) - if(8 to 10) - humanity = "I'm <b>ENLIGHTENED</b>, my <b>BEAST</b> and I are in complete harmony." - if(7) - humanity = "I've made great strides in co-existing with my beast." - if(5 to 6) - humanity = "I'm starting to learn how to share this unlife with my beast." - if(4) - humanity = "I'm still new to my path, but I'm learning." - if(2 to 3) - humanity = "I'm a complete novice to my path." - if(1) - humanity = "I'm losing control over my beast!" - - dat += "<p>[humanity]</p>" - - if(host.clan.name == "Brujah") - if(GLOB.brujahname != "") - if(host.real_name != GLOB.brujahname) - dat += "<p> My primogen is: [GLOB.brujahname].</p>" - if(host.clan.name == "Malkavian") - if(GLOB.malkavianname != "") - if(host.real_name != GLOB.malkavianname) - dat += "<p> My primogen is: [GLOB.malkavianname].</p>" - if(host.clan.name == "Nosferatu") - if(GLOB.nosferatuname != "") - if(host.real_name != GLOB.nosferatuname) - dat += "<p> My primogen is: [GLOB.nosferatuname].</p>" - if(host.clan.name == "Toreador") - if(GLOB.toreadorname != "") - if(host.real_name != GLOB.toreadorname) - dat += "<p> My primogen is: [GLOB.toreadorname].</p>" - if(host.clan.name == "Ventrue") - if(GLOB.ventruename != "") - if(host.real_name != GLOB.ventruename) - dat += "<p> My primogen is: [GLOB.ventruename].</p>" - - if(host.hud_used) - dat += "<p><b>Known disciplines:</b><BR>" - for(var/datum/action/discipline/D in host.actions) - if(D.discipline) - dat += "[D.discipline.name] [D.discipline.level] - [D.discipline.desc]<BR>" - dat += "</p>" - if(host.Myself) - if(host.Myself.Friend) - if(host.Myself.Friend.owner) - dat += "<p><b>My friend's name is [host.Myself.Friend.owner.true_real_name].</b><BR>" - if(host.Myself.Friend.phone_number) - dat += "Their number is [host.Myself.Friend.phone_number].<BR>" - if(host.Myself.Friend.friend_text) - dat += "[host.Myself.Friend.friend_text]</p>" - if(host.Myself.Enemy) - if(host.Myself.Enemy.owner) - dat += "<p><b>My nemesis is [host.Myself.Enemy.owner.true_real_name]!</b><BR>" - if(host.Myself.Enemy.enemy_text) - dat += "[host.Myself.Enemy.enemy_text]</p>" - if(host.Myself.Lover) - if(host.Myself.Lover.owner) - dat += "<p><b>I'm in love with [host.Myself.Lover.owner.true_real_name].</b><BR>" - if(host.Myself.Lover.phone_number) - dat += "Their number is [host.Myself.Lover.phone_number].<BR>" - if(host.Myself.Lover.lover_text) - dat += "[host.Myself.Lover.lover_text]</p>" - - if(length(host.knowscontacts) > 0) - dat += "<p><b>I know some other of my kind in this city. Need to check my phone, there definetely should be:</b><BR>" - for(var/i in host.knowscontacts) - dat += "-[i] contact<BR>" - dat += "</p>" - host << browse(HTML_SKELETON(dat), "window=vampire;size=400x450;border=1;can_resize=1;can_minimize=0") - onclose(host, "vampire", src) diff --git a/modular_darkpack/modules/kindred_species/icons/features.dmi b/modular_darkpack/modules/kindred_species/icons/features.dmi new file mode 100644 index 000000000000..f2d85e8f4e1d Binary files /dev/null and b/modular_darkpack/modules/kindred_species/icons/features.dmi differ diff --git a/modular_darkpack/modules/kindred_species/icons/vampire_clans.dmi b/modular_darkpack/modules/kindred_species/icons/vampire_clans.dmi index 331860eca460..210a3e466840 100644 Binary files a/modular_darkpack/modules/kindred_species/icons/vampire_clans.dmi and b/modular_darkpack/modules/kindred_species/icons/vampire_clans.dmi differ diff --git a/modular_darkpack/modules/deprecated/sounds/burning_death.ogg b/modular_darkpack/modules/kindred_species/sounds/burning_death.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/burning_death.ogg rename to modular_darkpack/modules/kindred_species/sounds/burning_death.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/final_death.ogg b/modular_darkpack/modules/kindred_species/sounds/final_death.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/final_death.ogg rename to modular_darkpack/modules/kindred_species/sounds/final_death.ogg diff --git a/modular_darkpack/modules/languages/code/languages/arabic.dm b/modular_darkpack/modules/languages/code/languages/arabic.dm new file mode 100644 index 000000000000..f01686eab231 --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/arabic.dm @@ -0,0 +1,21 @@ +/datum/language/arabic + name = "Arabic" + desc = "A lyrical language known across the Middle East." + flags = TONGUELESS_SPEECH + key = "a" + space_chance = 30 + syllables = list( + "al", "ba", "ta", "tha", "ja", "ha", "kha", "da", "dha", + "ra", "za", "sa", "sha", "ma", "na", "fa", "qa", "ka", + "la", "ya", "wa", "ain", "ghain", "ib", "il", "im", "in", + "ar", "as", "at", "ah", "aw", "ay", "af", "aj", "ak", + "ad", "an", "am", "is", "ir", "it", "ih", "ik", "ul", + "um", "un", "ur", "ut", "ah", "ab", "uq", "uf", "uz", + "ash", "ikh", "ahm", "ism", "min", "lah", "hub", "nah", + "tam", "rah", "jal", "san", "dar", "nur", "kal", "yam", + "bir", "mar", "bar", "sah" + ) + icon_state = "arabic" + default_priority = 90 + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/armenian.dm b/modular_darkpack/modules/languages/code/languages/armenian.dm new file mode 100644 index 000000000000..8709258cc476 --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/armenian.dm @@ -0,0 +1,26 @@ +/datum/language/armenian + name = "Armenian" + desc = "Armenian is spoken by those in the Armenian Highlands in Western Asia." + flags = TONGUELESS_SPEECH + key = "n" + space_chance = 100 + sentence_chance = 10 + between_word_sentence_chance = 10 + between_word_space_chance = 75 + additional_syllable_low = -2 + additional_syllable_high = -1 + // Words instead of syllables + syllables = list( + "es","du","na","menk'","duk'","nrank'","ays","ayn","aysteġ","aynteġ","ov","inč'","orteġ","ur", + "erb","inč'pes","oč'","bolor","šat","oroš","k'ič'","uriš","mek","mec","erkar","kin","ptuġ", + "aryun","inchʿbes","etʿe","isgabes","paytsʿ","orovhedev","imanal","mdadzel","khosel","vad", + "eridasart","keghetsʿig","parev","byz","vaxenal","aprel","p'orel","ergel","cov","ōr","tari", + "čišt","et'e","ew","u","meǰ","sarsap'","ch'ghjik","hugharkavorut'yun","par","hambuyr","sirel", + "merrnel","shun","zhanik'ner","sakayn","miasin","ch'merrats","anmah","haverzhakan","tariner", + "zhamanak","vard","karot","vazel","shshuk","stverayin","gaghtni","hzor","aryunahosel","tarrapel", + "shnorhakalut'yun","ktsats","sarsap'eli","chanaparhordut'yun","t'argmanel","khelagar" + ) + icon_state = "armenian" + default_priority = 90 + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/cantonese.dm b/modular_darkpack/modules/languages/code/languages/cantonese.dm new file mode 100644 index 000000000000..aaf7e575bd9b --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/cantonese.dm @@ -0,0 +1,23 @@ +/datum/language/cantonese + name = "Cantonese" + desc = "A dialect commonly spoken in Hong Kong." + key = "c" + flags = TONGUELESS_SPEECH + space_chance = 50 + syllables = list( + "de","yi","sì","bù","le","zài","rén","you", "wo", "ta","zhè", " gè","men","zhong","lái","sàng","guó","wèi","zi", + "ni","dì","chu","dào", "ye","sí","nián","de", "jiù", "nà", "yào", "xià", "yi","seng", "huì","zì", "zhe", + "qù", "zhi", "guò","jia","xué","duì","ke","ta"," li","hòu","xiao", "me", "xin", "duo", "tian", "ér", "néng", "hao", + "dou", "rán","méi", "rì","yú","qi","hái","fa","chéng","sì","zhi","zuò","dang", "xiang","kàn", "wén", "wú", "kai", + "sou","sí", "yòng", "zhu", "xíng","fang","yòu","rú","qián", "suo","ben","jiàn","jing","tóu", "miàn", "gong", "tóng", + "san", "yi", "lao", "cóng", "dòng", "liang", "cháng","er","nei","xùn","bó","hài","hái","hún","pò", "xiàn","ma","ban", "pán", + "lián","gé","ér", "r", "ba","chi" + ) + icon_state = "cantonese" + default_priority = 90 + + mutual_understanding = list( + /datum/language/mandarin = 50, + ) + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/english.dm b/modular_darkpack/modules/languages/code/languages/english.dm new file mode 100644 index 000000000000..2f43ccc71d51 --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/english.dm @@ -0,0 +1,26 @@ +// 'basic' language; spoken by default. +// Modular override to make it easier to treat as the default. +/datum/language/common + name = "English" + desc = "Lingua franca of the world." + + icon_state = "english" + + // Removes the mandarin that common had because this is english lol + syllables = list( + "al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", + "le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", + "ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", + "his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", + ) + + mutual_understanding = list( + /datum/language/beachbum = 33, // Lol I guess I can leave this + /datum/language/spanish = 25, + /datum/language/french = 10, + /datum/language/german = 10, + /datum/language/latin = 10, + /datum/language/greek = 10, + ) + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/farsi.dm b/modular_darkpack/modules/languages/code/languages/farsi.dm new file mode 100644 index 000000000000..f45f077f481c --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/farsi.dm @@ -0,0 +1,28 @@ +/datum/language/farsi + name = "Persian" + desc = "Persian (or Farsi) is spoken by some residents of San Francisco. It is common in and around Iran and Afghanistan." + flags = TONGUELESS_SPEECH + key = "F" + space_chance = 100 + sentence_chance = 10 + between_word_sentence_chance = 10 + between_word_space_chance = 75 + additional_syllable_low = -2 + additional_syllable_high = -1 + // Words instead of syllables + syllables = list( + "zaman","haalaa","salám","elef","est","eshgh","baleh","nah","ketáb","dídan","kār","solh", + "omíd","ve","máh","shab","garmá","man","shma","to","ma","chegoneh","cheh","cheh zamani", + "seps","az","koja","keh","ki","in","anja","inja","kolmeh","ba in hal","ema","o","aneya", + "tars","sag","nishesa","daria","siast","khon","khonerizi","mard","zan","mokhlogh", + "zandegi","morg","mardan","nish zadan","tarsan","kuh","raqs","mohbat","gomshodeh","raz", + "sayeh","ramz","ghtel","dostan","khiant","gol rez","atash","shkar","bah","bosteh", + "bedon","dakhal","balidan","moghodas","khafash","namira","ghza","khanavadeh","shodan", + "pol","kamak","ebdit","faghat","cpehmeh","npargoz","cpehmisheh","nist","bud","nabud", + "pes","migovid","jigh","eger","ya","ol","saleya","safar","toghof","dashtan","roye", + "nazdik","taghariban","dandannpana" + ) + icon_state = "farsi" + default_priority = 90 + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/french.dm b/modular_darkpack/modules/languages/code/languages/french.dm new file mode 100644 index 000000000000..a86c6530b6d0 --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/french.dm @@ -0,0 +1,24 @@ +/datum/language/french + name = "French" + desc = "A romantic and refined language spoken in France and beyond." + key = "f" + flags = TONGUELESS_SPEECH + space_chance = 40 + syllables = list( + "ou", "on", "an", "in", "un", "ai", "oi", "au", "eu", "ch", + "je", "tu", "il", "elle", "que", "qui", "me", "se", "te", "ve", + "ca", "ce", "ci", "co", "fa", "fe", "fi", "lo", "la", "li", + "ro", "ra", "re", "ri", "vo", "va", "ve", "po", "pe", "pi", + "no", "na", "ne", "mo", "ma", "ta", "te", "to", "so", "se", + "jo", "ja", "che", "tra", "ble", "tre", "clo", "cla", "cro", "fra" + ) + icon_state = "french" + default_priority = 90 + + mutual_understanding = list( + /datum/language/common = 10, + /datum/language/greek = 10, + /datum/language/latin = 10, + ) + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/garou_tongue.dm b/modular_darkpack/modules/languages/code/languages/garou_tongue.dm new file mode 100644 index 000000000000..de269801637b --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/garou_tongue.dm @@ -0,0 +1,31 @@ +/datum/language/garou_tongue + name = "Garou Tongue" + desc = "A guttural and pitchy language also known as 'High Tongue', the language of the Garou capable of being learned and spoken by Garou. It is hard to speak in human form." + key = "w" + flags = TONGUELESS_SPEECH + space_chance = 40 + syllables = list( + "to", "lo", "of", "li", "ka", "ha", "he", "ah", "ny", "ro", + "li", "me", "ad", "he", "ah", "um", "co", "ga", "gar", "fa", + "el", "ra", "ia", "of", "os", "ra", "ta", "na", "ga", "ho", + "lu", "lu", "fe", "zi", "mo", "sha", "ru", "te", "vo", "ni", + "xa", "jo", "da", "ku", "pe", "su", "yo", "ve", "mi", "ba" + ) + icon_state = "garou" + default_priority = 10 + +/datum/language/primal_tongue + name = "Primal Tongue" + desc = "A language inherently known to all Garou breeds at birth, able to be spoken only in Lupus, Crinos and Hispo forms." + key = "p" + flags = TONGUELESS_SPEECH + space_chance = 40 + syllables = list ( + "gra", "grr", "gru", "gha", "sha", "zho", "yip", "whu", "zar", "ruk", + "kra", "hya", "tza", "ska", "yrr", "fru", "thra", "hwo", "vra", "snar", + "kru", "pha", "gha", "hro", "tzo", "wha", "brak", "thru", "chur", "dra", + "vru", "sna", "yru", "hru", "yla", "fro", "rik", "zru", "skra", "zhu", + "kro", "thro", "zyi", "sha", "hza", "mru", "wru", "bruk", "hka", "tza" + ) + icon_state = "garou" + default_priority = 10 diff --git a/modular_darkpack/modules/languages/code/languages/german.dm b/modular_darkpack/modules/languages/code/languages/german.dm new file mode 100644 index 000000000000..c88492c7ee08 --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/german.dm @@ -0,0 +1,25 @@ +/datum/language/german + name = "German" + desc = "A precise and powerful language spoken in Germany and beyond." + key = "g" + flags = TONGUELESS_SPEECH + space_chance = 30 + syllables = list( + "al", "an", "auf", "aus", "bei", "da", "de", "di", "do", "du", + "ein", "es", "fa", "fe", "ge", "ha", "he", "hi", "in", "ja", + "ka", "ko", "la", "le", "li", "ma", "me", "mi", "mo", "na", + "ne", "ni", "no", "ob", "ra", "re", "ri", "ro", "sa", "se", + "so", "ta", "te", "ti", "to", "um", "un", "ver", "vor", "wa", + "we", "wi", "wo", "zu", "acht", "ich", "du", "sie", "wir", + "von", "mit", "gut", "schon", "lang", "zeit", "haus", "mann", + "frau", "kind", "brot", "wasser", "bier", "kaffee", "kuh", "kat", + "hund", "tag", "nacht", "ja", "nein", "bitte", "danke", "lieben", "fragen" + ) + icon_state = "german" + default_priority = 90 + + mutual_understanding = list( + /datum/language/common = 10, + ) + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/greek.dm b/modular_darkpack/modules/languages/code/languages/greek.dm new file mode 100644 index 000000000000..58abcf897cf2 --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/greek.dm @@ -0,0 +1,26 @@ +/datum/language/greek + name = "Greek" + desc = "The language from the land of marble and philosophy." + key = "k" + flags = TONGUELESS_SPEECH + space_chance = 40 + syllables = list( + "αι","αν","απ","ας","εί","ει","ης","ια","κα","να","ου","πο","στ","τα","τη","το","ου","αι","τα","κα","να","στ","σε","από","και","δ","γ","φ","ψ","του","προ","μέν", + "δεν","της","από","ρα","ά","έ","ε","ο","ρ","τ","ά","κ","ή", "α","σ","ε","ζ","τ","τ","ικ","χ","α","π","δ","β","τής","θα" + ) + icon_state = "greek" //Courtesy of Agate. I had made my own but lost it while shuffling files around. F + default_priority = 90 + always_use_default_namelist = TRUE + + //But Mci, why do you have some letters in here more than once? Becuase they have a frequency level of fucking /ten/ percent across the /whole/ language. It's gonna be a common letter. + //Or, you know. I pasted it more than once by accident and since I'm dumb and doing this in DM I can't tell. + //Seriously it looks like a barcode. + + //On the upside, it's all in lowercase now so it shouldn't look like greek people are always SCREAMING AT THE TOP OF THEIR LUNGS + + mutual_understanding = list( + /datum/language/common = 10, + /datum/language/french = 10, + ) + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/hebrew.dm b/modular_darkpack/modules/languages/code/languages/hebrew.dm new file mode 100644 index 000000000000..9716f875237b --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/hebrew.dm @@ -0,0 +1,16 @@ +/datum/language/hebrew + name = "Hebrew" + desc = "The language of the ancient Hebrews." + key = "h" + space_chance = 50 + syllables = list( + "sha", "vu", "nah", "ha", "yom", "ma", "cha", "ar", "et", "mol", "lua", + "ch", "na", "sh", "ni", "yah", "bes", "ol", "hish", "ev", "la", "ot", "la", + "khe", "tza", "chak", "hak", "hin", "hok", "lir", "tov", "yef", "yfe", + "cho", "ar", "kas", "kal", "ra", "lom", "im", "'", "'", "'", "'", "bok", + "erev", "shlo", "lo", "ta", "im", "yom" + ) + icon_state = "hebrew" + default_priority = 90 + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/irish.dm b/modular_darkpack/modules/languages/code/languages/irish.dm new file mode 100644 index 000000000000..4e17085468a3 --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/irish.dm @@ -0,0 +1,22 @@ +/datum/language/irish + name = "Irish" + desc = "The melodic language spoken by the Irish." + flags = TONGUELESS_SPEECH + key = "I" + space_chance = 50 + syllables = list( + "ús", "mar", "ea", "ai", "áin", "íl", "áil", "an", "oi", "deir", + "uai", "sha", "sio", "lla", "tui", "nis", "te", "tea", "cru", "óir", + "ch", "tch", "ach", "go", "hiom", "dh", "bh", "cú", "sé", "aei", + "ba", "ní", "lim", "bha", "bhn", "eas", "nga", "úil", "éir", "fao", + "mo", "mhu", "uir", "úir", "ín", "ano", "ámh", "éimh", "obh", "nne", + "dor", "cha", "sor", "sao", "rs", "se", "fái", "séi", "oí", "che", + ) + icon_state = "irish" + default_priority = 90 + + mutual_understanding = list( + /datum/language/scottish = 25 + ) + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/italian.dm b/modular_darkpack/modules/languages/code/languages/italian.dm new file mode 100644 index 000000000000..80525edb7be1 --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/italian.dm @@ -0,0 +1,26 @@ +/datum/language/italian + name = "Italian" + desc = "A melodic and expressive language spoken across Italy." + flags = TONGUELESS_SPEECH + key = "i" + space_chance = 40 + syllables = list( + "al", "ba", "be", "bi", "bo", "bu", "ca", "ce", "ci", "co", "cu", + "da", "de", "di", "do", "du", "fa", "fe", "fi", "fo", "fu", + "ga", "ge", "gi", "go", "gu", "la", "le", "li", "lo", "lu", + "ma", "me", "mi", "mo", "mu", "na", "ne", "ni", "no", "nu", + "pa", "pe", "pi", "po", "pu", "ra", "re", "ri", "ro", "ru", + "sa", "se", "si", "so", "su", "ta", "te", "ti", "to", "tu", + "va", "ve", "vi", "vo", "vu", "za", "ze", "zi", "zo", "zu", + "gli", "chi", "que", "qua", "sto", "tre", "ver", "con", "per", "and", + "zio", "zio", "cia", "zio", "gli", "pia", "zza", "tor", "ino", "gra" + ) + icon_state = "italian" + default_priority = 90 + + mutual_understanding = list( + /datum/language/spanish = 75, + /datum/language/latin = 10, + ) + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/japanese.dm b/modular_darkpack/modules/languages/code/languages/japanese.dm new file mode 100644 index 000000000000..ce096c34ef9e --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/japanese.dm @@ -0,0 +1,25 @@ +/datum/language/japanese + name = "Japanese" + desc = "A language spoken in the land of the rising sun." + key = "j" + flags = TONGUELESS_SPEECH + space_chance = 20 + syllables = list( + "ka", "ki", "ku", "ke", "ko", "sa", "shi", "su", "se", "so", + "ta", "chi", "tsu", "te", "to", "na", "ni", "nu", "ne", "no", + "ha", "hi", "fu", "he", "ho", "ma", "mi", "mu", "me", "mo", + "ya", "yu", "yo", "ra", "ri", "ru", "re", "ro", "wa", "wo", + "ga", "gi", "gu", "ge", "go", "za", "ji", "zu", "ze", "zo", + "da", "de", "do", "ba", "bi", "bu", "be", "bo", "pa", "pi", + "pu", "pe", "po", "kya", "kyu", "kyo", "sha", "shu", "sho", + "cha", "chu", "cho", "nya", "nyu", "nyo", "hya", "hyu", "hyo", + "mya", "myu", "myo", "rya", "ryu", "ryo", "tsu", "n" + ) + icon_state = "japanese" + default_priority = 90 + + mutual_understanding = list( + /datum/language/korean = 25, + ) + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/korean.dm b/modular_darkpack/modules/languages/code/languages/korean.dm new file mode 100644 index 000000000000..63e84d7e5f51 --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/korean.dm @@ -0,0 +1,33 @@ +/datum/language/korean + name = "Korean" + desc = "Korean is spoken in Korea, as well as being the eighth most spoken language in San Francisco." + flags = TONGUELESS_SPEECH + key = "K" + space_chance = 100 + sentence_chance = 10 + between_word_sentence_chance = 10 + between_word_space_chance = 75 + additional_syllable_low = -2 + additional_syllable_high = -1 + // Words instead of syllables + syllables = list( + "geureochiman","na","geona","geurigo","go","geuraeseo","seo","nikka","myeon","wa","wihae", + "geuttae","kkeudeopda","keuda","meolda","gabyeopda","gwayeon","jal","bammada","imi", + "bijeongsangjeok","areumdapda","gimanjeok","chimyeongjeok","joyonghada","yak","an","bak", + "ap","sok","igeo","geugeo","jeogeo","yeogi","geogi","geubun","noe","geu","geu nyeo","uri", + "geu dul","nado","sigan","namja","bangbeop","saramdeul","insaeng","nal","il","jeonhwa", + "bam","jip","saenggak","don","ireum","abeoji","jangso","neukkim","yeoja","maeum","gajok", + "munje","huimang","jugeum","kkeut","gihoi","pi","sinloe","myeongryeong","bit","joyonghan", + "gamgak","gongpo","beomjoe","yeonghon","bagjwi","mulda","heubhyeolgwi","geulimja", + "nollaun","bagjwi","gae","agmong","jeongchi","sal-in","daenseu","gippeum","eummo", + "miseuteoli","godaeui","eondedeu","gwisin","nongjang","eolyeoun","yeohaenghada", + "jadongcha","daeyang","agma","gyohoe","malttug","sanyangkkun","dallida","doju","chaeg","jinsil" + ) + icon_state = "korean" + default_priority = 90 + + mutual_understanding = list( + /datum/language/japanese = 25, + ) + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/latin.dm b/modular_darkpack/modules/languages/code/languages/latin.dm new file mode 100644 index 000000000000..bc791ba4151b --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/latin.dm @@ -0,0 +1,28 @@ +/datum/language/latin + name = "Latin" + desc = "An ancient and complex language once spoken by the rulers of empires." + flags = TONGUELESS_SPEECH + key = "l" + space_chance = 33 + syllables = list( + "al", "am", "ar", "as", "at", "ca", "ce", "ci", "co", "cu", + "de", "di", "do", "du", "en", "es", "et", "fa", "fi", "fo", + "ga", "ge", "gi", "go", "gu", "ha", "he", "hi", "ho", "hu", + "in", "is", "it", "la", "le", "li", "lo", "lu", "ma", "me", + "mi", "mo", "mu", "na", "ne", "ni", "no", "nu", "pa", "pe", + "pi", "po", "pu", "ra", "re", "ri", "ro", "ru", "sa", "se", + "si", "so", "su", "ta", "te", "ti", "to", "tu", "um", "us", + "va", "ve", "vi", "vo", "vu", "ae", "au", "ct", "or", "ur", + "ex", "im", "ob", "sub", "ad", "per", "qua", "qui", "prae", "pro" + ) + icon_state = "latin" + default_priority = 90 + + mutual_understanding = list( + /datum/language/common = 10, + /datum/language/spanish = 10, + /datum/language/french = 10, + /datum/language/italian = 10, + ) + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/mandarin.dm b/modular_darkpack/modules/languages/code/languages/mandarin.dm new file mode 100644 index 000000000000..61883e1bf674 --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/mandarin.dm @@ -0,0 +1,23 @@ +/datum/language/mandarin + name = "Mandarin" + desc = "A dialect commonly spoken in China." + key = "m" + flags = TONGUELESS_SPEECH + space_chance = 70 + syllables = list( + "de","yī","shì","bù","le","zài","rén","yǒu", "wǒ", "tā","zhè", " gè","men","zhōng","lái","shàng","guó","wèi","zǐ", + "nǐ","dì","chū","dào", "yě","shí","nián","de", "jiù", "nà", "yào", "xià", "yǐ","shēng", "huì","zì", "zhe", + "qù", "zhī", "guò","jiā","xué","duì","kě","tā"," lǐ","hòu","xiǎo", "me", "xīn", "duō", "tiān", "ér", "néng", "hǎo", + "dōu", "rán","méi", "rì","yú","qǐ","hái","fā","chéng","shì","zhǐ","zuò","dāng", "xiǎng","kàn", "wén", "wú", "kāi", + "shǒu","shí", "yòng", "zhǔ", "xíng","fāng","yòu","rú","qián", "suǒ","běn","jiàn","jīng","tóu", "miàn", "gōng", "tóng", "ā","ē", + "sān", "yǐ", "lǎo", "cóng", "dòng", "liǎng", "cháng", "wan","kuei", "guǐ","jin", "huáng", "sān", "cān", "shēn", "cēn","nǎo","péng", + "xiū","liào","zhù","jí", "lù", "xiàng" + ) + icon_state = "chinese" + default_priority = 90 + + mutual_understanding = list( + /datum/language/cantonese = 50, + ) + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/russian.dm b/modular_darkpack/modules/languages/code/languages/russian.dm new file mode 100644 index 000000000000..8a9679faf545 --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/russian.dm @@ -0,0 +1,39 @@ +/datum/language/russian + name = "Russian" + desc = "The language of Mother Russia." + key = "r" + flags = TONGUELESS_SPEECH + space_chance = 40 + syllables = list( + "da", "net", "blin", "suka", "ho", "ya", "ty", "on", "ona", "vy", "oni", + "mo", "do", "po", "na", "za", "ot", "pod", "mi", "vi", "re", "ko", "vo", + "lo", "bo", "go", "ni", "ra", "va", "ka", "pa", "ga", "la", "ba", "ma", + "so", "sto", "pro", "chto", "zlo", "dro", "pra", "svo", "kto", "ili", + "ova", "e", "ya", "on", "to", "vo", "da", "ne", "no", "li", "mu", "ko", + "me", "te", "chi", "sha", "ska", "ski", "ova", "cha", "nya", "rya", "zha" + ) + icon_state = "russian" + default_priority = 90 + + restricted = FALSE + +// Overides so the BODA machine uses real russian +/datum/language_holder/spinwarder + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/russian = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/russian = list(LANGUAGE_ATOM), + ) + selected_language = /datum/language/russian + +/datum/language_holder/spinwarder_exclusive + understood_languages = list( + /datum/language/russian = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/russian = list(LANGUAGE_ATOM), + ) + selected_language = /datum/language/russian diff --git a/modular_darkpack/modules/languages/code/languages/scottish.dm b/modular_darkpack/modules/languages/code/languages/scottish.dm new file mode 100644 index 000000000000..5ab34649ae25 --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/scottish.dm @@ -0,0 +1,22 @@ +/datum/language/scottish + name = "Scottish" + desc = "The bold language spoken by the Scottish." + flags = TONGUELESS_SPEECH + key = "s" + space_chance = 40 + syllables = list( + "'s", "na'", "nan", "a", "ài", "fhi", "shi", "nbh", "oi", "thu", + "ghl", "do", "mon", "aid", "dhe", "dha", "iar", "aidh", "gun", "chl", + "lhu", "inn", "sead", "ceit", "aoi", "rea", "tha", "meas", "lub", "barr", + "eadh", "oir", "chr", "thi", "sam", "hrad", "aire", "tion", "ùib", "ail", + "èir", "èi", "à", "anns", "mho", "dhei", "readh", "fàs", "gho", "uidh", + "rui", "each", "sios", "nai", "ch", "th", "àrn", "bhar", "dhu", "tua" + ) + icon_state = "scottish" + default_priority = 90 + + mutual_understanding = list( + /datum/language/irish = 25 + ) + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/spanish.dm b/modular_darkpack/modules/languages/code/languages/spanish.dm new file mode 100644 index 000000000000..8282adc79fb8 --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/spanish.dm @@ -0,0 +1,24 @@ +/datum/language/spanish + name = "Español" + desc = "A romantic and widely spoken world language." + key = "e" + flags = TONGUELESS_SPEECH + space_chance = 40 + syllables = list( + "cha", "che", "chi", "cho", "chu", "lla", "lle", "lli", "llo", "llu", + "ña", "ñe", "ño", "ñi", "nu", "que", "qui", "ro", "ri", "rá", + "to", "te", "ta", "lo", "la", "po", "pe", "pa", "mo", "ma", + "no", "na", "su", "sa", "le", "li", "ca", "ce", "ci", "co", + "de", "di", "du", "go", "gu", "ve", "va", "bo", "ba", "lu", + "re", "ru", "fi", "fo", "fa", "ya", "yo", "za", "zo", "ze" + ) + icon_state = "spanish" + default_priority = 90 + + mutual_understanding = list( + /datum/language/italian = 75, + /datum/language/common = 25, + /datum/language/latin = 10, + ) + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/tagalog.dm b/modular_darkpack/modules/languages/code/languages/tagalog.dm new file mode 100644 index 000000000000..cbfde2039c6d --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/tagalog.dm @@ -0,0 +1,28 @@ +/datum/language/tagalog + name = "Tagalog" + desc = "Filipino is the most common form of the Tagalog language in the Philippines, and is fourth most spoken language in San Francisco." + flags = TONGUELESS_SPEECH + key = "t" + space_chance = 100 + sentence_chance = 10 + between_word_sentence_chance = 10 + between_word_space_chance = 75 + additional_syllable_low = -2 + additional_syllable_high = -1 + // Words instead of syllables + syllables = list( + "na","ang","sa","ng","ay","at","mga","hindi","ko","ni", + "si","siya","isa","niya","ako","mo","pa","kung","may","kaniya", + "wala","ya","ito","sabi","din","nang","naman","iyon","ba","akin", + "ano", "lang","sila","alam","o","kita","ngunit","nila","pero","kayo", + "nasa","babae","laki","sino", "oo","taon","kata","wan","tila","guro", + "kapag","lan","awa","kaysa","lit", "katu","taka","ni","loko","bini", + "kulong","luma","lingkod","kaba","nung", "kapal","hiwa","tau","liw","gi", + "lupit","kagat","ginh","api","subo","tikim","niki","aso","pangil","lto", + "tayan","pagp","yaw","-ibig","dum","dugo","ating","buhay","madla","hayop", + "mga","takot" + ) + icon_state = "tagalog" + default_priority = 90 + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/code/languages/welsh.dm b/modular_darkpack/modules/languages/code/languages/welsh.dm new file mode 100644 index 000000000000..3289c08a9bc6 --- /dev/null +++ b/modular_darkpack/modules/languages/code/languages/welsh.dm @@ -0,0 +1,18 @@ +/datum/language/welsh + name = "Welsh" + desc = "The flowing language spoken by the Welsh." + flags = TONGUELESS_SPEECH + key = "W" + space_chance = 30 + syllables = list( + "ad", "dwi'", "tydi'", "rwy'", "yll", "yn", "ydw", "ffi'", "ysg", "ac", + "ac", "mae", "sawl", "êt", "â", "î", "ôl", "ô", "sneg", "sgw", + "di'", "y", "cin", "io", "ard", "der", "cho", "og", "chwa", "war", + "ddi", "boe", "ond", "rhe", "nhw", "pawb", "awb", "mew", "fi", "yny", + "dwy", "bry", "afa", "cwp", "cym", "fyd", "ots", "dde", "hyd", "ffo", + "ffr", "ind", "nog", "gwe", "cwn", "cyf", "eil", "ll", "wch", "aed" + ) + icon_state = "welsh" + default_priority = 90 + + restricted = FALSE diff --git a/modular_darkpack/modules/languages/readme.md b/modular_darkpack/modules/languages/readme.md new file mode 100644 index 000000000000..aececd9751ae --- /dev/null +++ b/modular_darkpack/modules/languages/readme.md @@ -0,0 +1,49 @@ +https://github.com/DarkPack13/SecondCity/pull/174 + +## Languages <!--Title of your addition.--> + +Module ID: LANGUAGES <!-- Uppercase, UNDERSCORE_CONNECTED name of your module, that you use to mark files. This is so people can case-sensitive search for your edits, if any. --> + +### Description: +Languages from earth instead of space. + +Includes partial ports of: +https://github.com/WorldOfDarknessXIII/World-of-Darkness-13/pull/177 +https://github.com/WorldOfDarknessXIII/World-of-Darkness-13/pull/212 +https://github.com/WorldOfDarknessXIII/World-of-Darkness-13/pull/411 (Minus the removal of old TG langs as its extreamly non-modular) +https://github.com/WorldOfDarknessXIII/World-of-Darkness-13/pull/491 +https://github.com/RequiemSS13/RequiemSS13/pull/339 +https://github.com/The-Final-Nights/The-Final-Nights/pull/832 +<!-- Here, try to describe what your PR does, what features it provides and any other directly useful information. --> + +### TG Proc/File Changes: + +- Many Changes, all marked with the Module ID +<!-- If you edited any core procs, you should list them here. You should specify the files and procs you changed. +E.g: +- `code/modules/mob/living.dm`: `proc/overriden_proc`, `var/overriden_var` + --> + +### Modular Overrides: + +- `modular_darkpack/master_files/icons/ui/chat/language.dmi` +<!-- If you added a new modular override (file or code-wise) for your module, you should list it here. Code files should specify what procs they changed, in case of multiple modules using the same file. +E.g: +- `modular_nova/master_files/sound/my_cool_sound.ogg` +- `modular_nova/master_files/code/my_modular_override.dm`: `proc/overriden_proc`, `var/overriden_var` + --> + +### Defines: + +- N/A +<!-- If you needed to add any defines, mention the files you added those defines in, along with the name of the defines. --> + +### Included files that are not contained in this module: + +- N/A +<!-- Likewise, be it a non-modular file or a modular one that's not contained within the folder belonging to this specific module, it should be mentioned here. Good examples are icons or sounds that are used between multiple modules, or other such edge-cases. --> + +### Credits: + +FalloutFalcon, LofiOtter, Cerebulon +<!-- Here go the credits to you, dear coder, and in case of collaborative work or ports, credits to the original source of the code. --> diff --git a/modular_darkpack/modules/latejoin_antagonists/code/latejoin_subsystem.dm b/modular_darkpack/modules/latejoin_antagonists/code/latejoin_subsystem.dm index 80bf0dccd5ac..19ba24f28b90 100644 --- a/modular_darkpack/modules/latejoin_antagonists/code/latejoin_subsystem.dm +++ b/modular_darkpack/modules/latejoin_antagonists/code/latejoin_subsystem.dm @@ -14,7 +14,7 @@ SUBSYSTEM_DEF(bad_guys_party) var/list/candidates = list() var/max_candidates = 0 - var/datum/outfit/job/Next = null + var/datum/outfit/job/vampire/Next = null var/go_on_next_fire = FALSE var/setted_up = FALSE @@ -49,7 +49,7 @@ SUBSYSTEM_DEF(bad_guys_party) threat = min(100, threat+60) max_candidates = 1 go_on_next_fire = TRUE - Next = new /datum/outfit/job/caitiff() + Next = new /datum/outfit/job/vampire/caitiff() setting = null if("sabbat") if(Next) @@ -57,7 +57,7 @@ SUBSYSTEM_DEF(bad_guys_party) threat = min(100, threat+30) max_candidates = 2 go_on_next_fire = TRUE - Next = new /datum/outfit/job/sabbatist() + Next = new /datum/outfit/job/vampire/sabbatist() setting = null if("hunter") if(Next) @@ -65,7 +65,7 @@ SUBSYSTEM_DEF(bad_guys_party) threat = min(100, threat+60) max_candidates = 5 go_on_next_fire = TRUE - Next = new /datum/outfit/job/hunter() + Next = new /datum/outfit/job/vampire/hunter() setting = null else if(setting == null) switch(level) @@ -77,7 +77,7 @@ SUBSYSTEM_DEF(bad_guys_party) threat = min(100, threat+60) max_candidates = 1 go_on_next_fire = TRUE - Next = new /datum/outfit/job/caitiff() + Next = new /datum/outfit/job/vampire/caitiff() else //sabbat if(Next) @@ -85,7 +85,7 @@ SUBSYSTEM_DEF(bad_guys_party) threat = min(100, threat+30) max_candidates = 2 go_on_next_fire = TRUE - Next = new /datum/outfit/job/sabbatist() + Next = new /datum/outfit/job/vampire/sabbatist() if(2) if(prob(30)) //sabbat @@ -94,7 +94,7 @@ SUBSYSTEM_DEF(bad_guys_party) threat = min(100, threat+90) max_candidates = 4 go_on_next_fire = TRUE - Next = new /datum/outfit/job/sabbatist() + Next = new /datum/outfit/job/vampire/sabbatist() else //hunt if(Next) @@ -102,7 +102,7 @@ SUBSYSTEM_DEF(bad_guys_party) threat = min(100, threat+60) max_candidates = 2 go_on_next_fire = TRUE - Next = new /datum/outfit/job/hunter() + Next = new /datum/outfit/job/vampire/hunter() /*if(3) if(prob(50)) //hunt @@ -111,7 +111,7 @@ SUBSYSTEM_DEF(bad_guys_party) threat = min(100, threat+60) max_candidates = 2 go_on_next_fire = TRUE - Next = new /datum/outfit/job/hunter() + Next = new /datum/outfit/job/vampire/hunter() else //sabbat if(Next) @@ -119,7 +119,7 @@ SUBSYSTEM_DEF(bad_guys_party) threat = min(100, threat+90) max_candidates = 3 go_on_next_fire = TRUE - Next = new /datum/outfit/job/sabbatist()*/ + Next = new /datum/outfit/job/vampire/sabbatist()*/ /mob/dead/new_player/proc/ForceLateSpawn() if(SSticker.late_join_disabled) diff --git a/modular_darkpack/modules/loadout/code/categories/heads.dm b/modular_darkpack/modules/loadout/code/categories/heads.dm index 660239ab2679..d299ef0353e4 100644 --- a/modular_darkpack/modules/loadout/code/categories/heads.dm +++ b/modular_darkpack/modules/loadout/code/categories/heads.dm @@ -68,7 +68,7 @@ /datum/loadout_item/head/cowboy_hat name = "Cowboy Hat" - item_path = /obj/item/clothing/head/vampire/cowboy + item_path = /obj/item/clothing/head/vampire/cowboy/armorless /datum/loadout_item/head/top_hat name = "Top Hat" diff --git a/modular_darkpack/modules/loadout/code/categories/neck.dm b/modular_darkpack/modules/loadout/code/categories/neck.dm index 741c418ddeaf..977bd6a7abc6 100644 --- a/modular_darkpack/modules/loadout/code/categories/neck.dm +++ b/modular_darkpack/modules/loadout/code/categories/neck.dm @@ -1,7 +1,4 @@ // Scarf -//datum/loadout_item/scarf - //subtype_path = /datum/loadout_item/neck/scarf - /datum/loadout_item/neck/scarf name = "Scarf (White)" item_path = /obj/item/clothing/neck/vampire/scarf/white @@ -22,34 +19,6 @@ name = "Scarf (Green)" item_path = /obj/item/clothing/neck/vampire/scarf/green -/datum/loadout_item/neck/scarf_greyscale - name = "Scarf (Colorable)" - item_path = /obj/item/clothing/neck/scarf - -/datum/loadout_item/neck/greyscale_large - name = "Scarf (Large, Colorable)" - item_path = /obj/item/clothing/neck/large_scarf - -/datum/loadout_item/neck/greyscale_larger - name = "Scarf (Larger, Colorable)" - item_path = /obj/item/clothing/neck/infinity_scarf - -// Tie -/datum/loadout_item/neck/tie - abstract_type = /datum/loadout_item/neck/tie - -/datum/loadout_item/neck/tie/black - name = "Tie (Black)" - item_path = /obj/item/clothing/neck/tie/black - -/datum/loadout_item/neck/tie/red - name = "Tie (Red)" - item_path = /obj/item/clothing/neck/tie/red - -/datum/loadout_item/neck/tie/blue - name = "Tie (Blue)" - item_path = /obj/item/clothing/neck/tie/blue - // Misc /datum/loadout_item/neck/prayer_beads name = "Prayer Beads" diff --git a/modular_darkpack/modules/loadout/code/categories/pocket_items.dm b/modular_darkpack/modules/loadout/code/categories/pocket_items.dm index 26c62ce299eb..395352b31744 100644 --- a/modular_darkpack/modules/loadout/code/categories/pocket_items.dm +++ b/modular_darkpack/modules/loadout/code/categories/pocket_items.dm @@ -1,85 +1,41 @@ -/datum/loadout_category/general - category_name = "General" - category_ui_icon = FA_ICON_VEST - type_to_generate = /datum/loadout_item/general - tab_order = /datum/loadout_category/head::tab_order + 1 - -/datum/loadout_item/general - abstract_type = /datum/loadout_item/general - -// Dice -/datum/loadout_item/general/d20 - name = "d20" - item_path = /obj/item/dice/d20 - -// Lipsticks -/datum/loadout_item/general/lipstick_black - name = "Lipstick (Black)" - item_path = /obj/item/lipstick/black - -/datum/loadout_item/general/lipstick_red - name = "Lipstick (Red)" - item_path = /obj/item/lipstick - // Lighters -/datum/loadout_item/general/cheap_lighter +/datum/loadout_item/pocket_items/cheap_lighter name = "Lighter (Cheap)" item_path = /obj/item/lighter/greyscale -/datum/loadout_item/general/zippo_lighter - name = "Lighter (Zippo)" - item_path = /obj/item/lighter - // Pens -/datum/loadout_item/general/pen +/datum/loadout_item/pocket_items/pen name = "Pen (Black)" item_path = /obj/item/pen -/datum/loadout_item/general/pen_fourcolor +/datum/loadout_item/pocket_items/pen_fourcolor name = "Pen (Four Color)" item_path = /obj/item/pen/fourcolor -/datum/loadout_item/general/pen_fountain +/datum/loadout_item/pocket_items/pen_fountain name = "Pen (Fountain)" item_path = /obj/item/pen/fountain // Cards -/datum/loadout_item/general/card_playing - name = "Deck of Cards (Playing)" - item_path = /obj/item/toy/cards/deck - -/datum/loadout_item/general/card_tarot +/datum/loadout_item/pocket_items/card_tarot name = "Deck of Cards (Tarot)" item_path = /obj/item/toy/cards/deck/tarot -/datum/loadout_item/general/card_kotahi - name = "Deck of Cards (Kotahi)" - item_path = /obj/item/toy/cards/deck/kotahi - // Misc -/datum/loadout_item/general/spray_can +/datum/loadout_item/pocket_items/spray_can name = "Spray Can" item_path = /obj/item/toy/crayon/spraycan -/datum/loadout_item/general/hair_spray - name = "Hair Spray" - item_path = /obj/item/dyespray +/datum/loadout_item/pocket_items/flashlight + name = "Flashlight" + item_path = /obj/item/flashlight -/datum/loadout_item/general/pride - name = "Pride Pin" - item_path = /obj/item/clothing/accessory/pride - can_be_reskinned = TRUE - -/datum/loadout_item/general/flashlight - name = "Flashlight" - item_path = /obj/item/flashlight +/datum/loadout_item/pocket_items/wristwatch + name = "Wrist watch" + item_path = /obj/item/watch /* -/datum/loadout_item/general/phone - name = "Phone" - item_path = /obj/item/vamp/phone - -/datum/loadout_item/general/wristwatch - name = "Wrist watch" - item_path = /obj/item/cockclock +/datum/loadout_item/pocket_items/phone + name = "Phone" + item_path = /obj/item/smartphone */ diff --git a/modular_darkpack/modules/loadout/code/categories/suit.dm b/modular_darkpack/modules/loadout/code/categories/suit.dm index 9bf77d4287eb..2230f7af7601 100644 --- a/modular_darkpack/modules/loadout/code/categories/suit.dm +++ b/modular_darkpack/modules/loadout/code/categories/suit.dm @@ -1,9 +1,10 @@ -/datum/loadout_category/suit +/datum/loadout_category/suits category_name = "Outerwear" - category_ui_icon = FA_ICON_SHIRT + category_ui_icon = FA_ICON_USER_SECRET type_to_generate = /datum/loadout_item/suit tab_order = /datum/loadout_category/head::tab_order + 10 +/* /datum/loadout_item/suit abstract_type = /datum/loadout_item/suit @@ -11,6 +12,7 @@ if(outfit.suit) LAZYADD(outfit.backpack_contents, outfit.suit) outfit.suit = item_path +*/ // Coats /datum/loadout_item/suit/coat @@ -100,3 +102,43 @@ /datum/loadout_item/suit/letterman_red name = "Letterman (Red)" item_path = /obj/item/clothing/suit/jacket/letterman_syndie + +// Robes +/datum/loadout_item/suit/robes + abstract_type = /datum/loadout_item/suit/robes + +/datum/loadout_item/suit/robes/white + name = "Robes (White)" + item_path = /obj/item/clothing/suit/hooded/robes + +/datum/loadout_item/suit/robes/black + name = "Robes (Black)" + item_path = /obj/item/clothing/suit/hooded/robes/black + +/datum/loadout_item/suit/robes/grey + name = "Robes (Grey)" + item_path = /obj/item/clothing/suit/hooded/robes/grey + +/datum/loadout_item/suit/robes/darkred + name = "Robes (Dark Red)" + item_path = /obj/item/clothing/suit/hooded/robes/darkred + +/datum/loadout_item/suit/robes/yellow + name = "Robes (Yellow)" + item_path = /obj/item/clothing/suit/hooded/robes/yellow + +/datum/loadout_item/suit/robes/green + name = "Robes (Green)" + item_path = /obj/item/clothing/suit/hooded/robes/green + +/datum/loadout_item/suit/robes/Red + name = "Robes (Red)" + item_path = /obj/item/clothing/suit/hooded/robes/red + +/datum/loadout_item/suit/robes/purple + name = "Robes (Purple)" + item_path = /obj/item/clothing/suit/hooded/robes/purple + +/datum/loadout_item/suit/robes/blue + name = "Robes (Blue)" + item_path = /obj/item/clothing/suit/hooded/robes/blue diff --git a/modular_darkpack/modules/looc/code/keybinds.dm b/modular_darkpack/modules/looc/code/keybinds.dm new file mode 100644 index 000000000000..f8fecbf535da --- /dev/null +++ b/modular_darkpack/modules/looc/code/keybinds.dm @@ -0,0 +1,13 @@ +/datum/keybinding/client/communication/looc + hotkey_keys = list("L") + name = LOOC_CHANNEL + full_name = "Local OOC (LOOC)" + keybind_signal = COMSIG_KB_CLIENT_LOOC_DOWN + +/datum/keybinding/client/communication/looc/down(client/user, turf/target, mousepos_x, mousepos_y) + . = ..() + if(.) + return + winset(user, null, "command=[user.tgui_say_create_open_command(LOOC_CHANNEL)]") + winset(user, "tgui_say.browser", "focus=true") + return TRUE diff --git a/modular_darkpack/modules/looc/code/looc_preference.dm b/modular_darkpack/modules/looc/code/looc_preference.dm new file mode 100644 index 000000000000..6dc13bf54024 --- /dev/null +++ b/modular_darkpack/modules/looc/code/looc_preference.dm @@ -0,0 +1,11 @@ +/datum/preference/toggle/see_looc + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + default_value = TRUE + savefile_key = "looc_admin_pref" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/toggle/see_looc/is_accessible(datum/preferences/preferences) + if(!..(preferences)) + return FALSE + + return is_admin(preferences.parent) diff --git a/modular_darkpack/modules/looc/code/verbs.dm b/modular_darkpack/modules/looc/code/verbs.dm new file mode 100644 index 000000000000..cd36a0f0af45 --- /dev/null +++ b/modular_darkpack/modules/looc/code/verbs.dm @@ -0,0 +1,93 @@ +#define LOOC_RANGE 7 + +/client/verb/looc(msg as text) + set name = "LOOC" + set desc = "Local OOC, seen only by those in view." + set category = "OOC" + + looc_message(msg) + +/client/verb/looc_wallpierce(msg as text) + set name = "LOOC (Wallpierce)" + set desc = "Local OOC, seen by anyone within 7 tiles of you." + set category = "OOC" + + looc_message(msg, TRUE) + +/client/proc/looc_message(msg, wall_pierce) + if(GLOB.say_disabled) + to_chat(usr, span_danger("Speech is currently admin-disabled.")) + return + + if(!mob) + return + + msg = copytext_char(sanitize(msg), 1, MAX_MESSAGE_LEN) + if(!msg) + return + + if(!holder) + if(!GLOB.looc_allowed) + to_chat(src, span_danger("LOOC is globally muted.")) + return + if(handle_spam_prevention(msg, MUTE_OOC)) + return + if(findtext(msg, "byond://")) + to_chat(src, span_boldannounce("<B>Advertising other servers is not allowed.</B>")) + log_admin("[key_name(src)] has attempted to advertise in LOOC: [msg]") + return + if(prefs.muted & MUTE_LOOC) + to_chat(src, span_danger("You cannot use LOOC (muted).")) + return + if(is_banned_from(ckey, BAN_LOOC)) + to_chat(src, span_warning("You are LOOC banned!")) + return + if(mob.stat == DEAD && CONFIG_GET(flag/disable_ghost_looc)) + to_chat(src, span_danger("You cannot use LOOC while dead.")) + return + if(isdead(mob) && CONFIG_GET(flag/disable_ghost_looc)) + to_chat(src, span_danger("You cannot use LOOC while ghosting.")) + return + + msg = emoji_parse(msg) + + mob.log_talk(msg, LOG_OOC, tag = "LOOC") + var/list/heard + if(wall_pierce) + heard = get_hearers_in_range(LOOC_RANGE, mob) + else + heard = get_hearers_in_view(LOOC_RANGE, mob) + + //so the ai can post looc text + if(istype(mob, /mob/living/silicon/ai)) + var/mob/living/silicon/ai/ai = mob + if(wall_pierce) + heard = get_hearers_in_range(LOOC_RANGE, ai.eyeobj) + else + heard = get_hearers_in_view(LOOC_RANGE, ai.eyeobj) + //so the ai can see looc text + for(var/mob/living/silicon/ai/ai as anything in GLOB.ai_list) + if(ai.client && !(ai in heard) && (ai.eyeobj in heard)) + heard += ai + + var/list/admin_seen = list() + for(var/mob/hearing in heard) + if(!hearing.client) + continue + var/client/hearing_client = hearing.client + if(hearing_client.holder) + admin_seen[hearing_client] = TRUE + continue //they are handled after that + + if(isobserver(hearing)) + continue //Also handled later. + + to_chat(hearing_client, span_looc(span_prefix("LOOC[wall_pierce ? " (WALL PIERCE)" : ""]:</span> <EM>[src.mob.name]:</EM> <span class='message'>[msg]"))) + + for(var/client/admin_client in GLOB.admins) + if(admin_seen[admin_client]) + to_chat(admin_client, span_looc("[ADMIN_FLW(usr)] <span class='prefix'>LOOC[wall_pierce ? " (WALL PIERCE)" : ""]:</span> <EM>[src.key]/[src.mob.name]:</EM> <span class='message'>[msg]</span>")) + else if(admin_client.prefs.read_preference(/datum/preference/toggle/see_looc)) + to_chat(admin_client, span_rlooc("[ADMIN_FLW(usr)] <span class='prefix'>(R)LOOC[wall_pierce ? " (WALL PIERCE)" : ""]:</span> <EM>[src.key]/[src.mob.name]:</EM> <span class='message'>[msg]</span>")) + +#undef LOOC_RANGE diff --git a/modular_darkpack/modules/looc/readme.md b/modular_darkpack/modules/looc/readme.md new file mode 100644 index 000000000000..b91806f14dad --- /dev/null +++ b/modular_darkpack/modules/looc/readme.md @@ -0,0 +1,53 @@ +https://github.com/DarkPack13/SecondCity/pull/424 + +## \<LOCAL OUT OF CHARACTER> + +Module ID: LOOC + +### Description: + +### TG Proc/File Changes: + +- `code/datums/keybinding/living.dm` +- `code/modules/admin/verbs/admin.dm` +- `code/modules/admin/verbs/admingame.dm` +- `code/modules/admin/sql_ban_system.dm` +- `code/modules/tgui_input/say_modal/modal.dm` +- `code/modules/tgui_input/say_modal/speech.dm` +- `tgui/packages/tgui-panel/chat/constants.ts` +- `tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss` +- `tgui/packages/tgui-panel/styles/tgchat/chat-light.scss` +- `tgui/packages/tgui-say/styles/colors.scss` +- `tgui/packages/tgui-say/ChannelIterator.test.ts` +- `tgui/packages/tgui-say/ChannelIterator.ts` + +### Modular Overrides: + +- `modular_darkpack/master_files/code/_globalvars/configuration.dm` +- `modular_darkpack/master_files/code/controllers/configuration/entries/general.dm` + +### Defines: + +- `code/__DEFINES/~darkpack/banning.dm` +- `code/__DEFINES/~darkpack/keybinding.dm` +- `code/__DEFINES/admin.dm` +- `code/__DEFINES/chat.dm` +- `code/__DEFINES/span.dm` +- `code/__DEFINES/speech_channels.dm` + +### Included files that are not contained in this module: + +- `tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkpack_looc.tsx` +- `config/darkpack_config.txt` + +### Credits: + +XeonMations +Gandalf2k15 +Azarak +Seris02 +ZephyrTFA +Zonespace27 +Vishenka0704 +LT3 +KannaLisvern diff --git a/modular_darkpack/modules/mannequin/code/mannequin_species.dm b/modular_darkpack/modules/mannequin/code/mannequin_species.dm deleted file mode 100644 index 7f509e4c9258..000000000000 --- a/modular_darkpack/modules/mannequin/code/mannequin_species.dm +++ /dev/null @@ -1,68 +0,0 @@ -/datum/species/vamp_mannequin - name = "mannequin" - id = "mannequin" - species_traits = list(NOEYESPRITES,NOBLOOD,NO_UNDERWEAR) - inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NOHUNGER,TRAIT_NOBREATH,TRAIT_TOXIMMUNE,TRAIT_NOCRITDAMAGE,TRAIT_ADVANCEDTOOLUSER,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE) - inherent_biotypes = MOB_HUMANOID - payday_modifier = 0.75 - siemens_coeff = 0 - punchdamagelow = 5 - punchdamagehigh = 5 - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC - damage_overlay_type = "" - meat = /obj/item/food/meat/slab/human/mutant/golem - sexes = 1 - limbs_id = "mannequin" - use_skintones = FALSE - -/datum/species/vamp_mannequin/on_species_gain(mob/living/carbon/human/C) - . = ..() - C.status_flags |= GODMODE - C.skin_tone = "albino" - C.dna.species.limbs_id = "mannequin" - C.update_body_parts() - C.update_body() - C.update_icon() - C.dna.real_name = "mannequin" - C.real_name = "mannequin" - C.true_real_name = "mannequin" - C.real_name = "mannequin" - -/datum/species/vamp_mannequin/check_roundstart_eligible() - return FALSE - -/datum/species/vamp_mannequin/spec_life(mob/living/carbon/human/H) - . = ..() - var/turf/T = get_turf(H) - var/light_amount = T.get_lumcount() - var/area/vtm/V = get_area(H) - if(!V.outdoors) - if(light_amount < 0.2) - do_spooky(H) - else - walk_to(H, 0) - else - walk_to(H, 0) - -/datum/species/vamp_mannequin/proc/do_spooky(mob/living/carbon/human/man) - for(var/mob/living/L in range(7, man)) - if(L.client) - man.face_atom(L) - if(prob(50)) - walk_to(man, L, 0, man.cached_multiplicative_slowdown) - - for(var/mob/living/carbon/human/H in range(1, man)) - if(H.client) - if(!H.lock_on_by_mannequin) - H.lock_on_by_mannequin = TRUE - man.forceMove(get_turf(H)) - if(get_dist(man, H) < 2) - var/obj/item/bodypart/affected = H.get_bodypart(pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - if(affected != null) - man.visible_message("[man] slices off [H]'s [affected]!", span_notice("You slice [man]'s [affected] off.")) - affected.dismember(BRUTE) - H.lock_on_by_mannequin = FALSE - - if(prob(33)) - var/turf/T = get_step(man, pick(NORTH, SOUTH, WEST, EAST)) - step_to(man,T,0) diff --git a/modular_darkpack/modules/mannequin/code/mannequin_subtypes.dm b/modular_darkpack/modules/mannequin/code/mannequin_subtypes.dm new file mode 100644 index 000000000000..049a2952688f --- /dev/null +++ b/modular_darkpack/modules/mannequin/code/mannequin_subtypes.dm @@ -0,0 +1,47 @@ +/obj/structure/mannequin/plastic/napoleon + starting_items = list( + /obj/item/clothing/head/vampire/napoleon, + /obj/item/clothing/under/vampire/napoleon, + /obj/item/clothing/shoes/vampire/jackboots/high + ) + +/obj/structure/mannequin/plastic/conquistador + starting_items = list( + /obj/item/clothing/head/vampire/helmet/spain, + /obj/item/clothing/shoes/vampire/jackboots/work, + /obj/item/clothing/under/vampire/tremere, + /obj/item/clothing/suit/vampire/vest/medieval + ) + +/obj/structure/mannequin/plastic/cowboy + starting_items = list( + /obj/item/clothing/head/vampire/cowboy, + /obj/item/clothing/shoes/vampire/brown, + /obj/item/clothing/under/vampire/bouncer, + /obj/item/clothing/suit/vampire/trench/alt + ) + +/obj/structure/mannequin/plastic/fancy/Initialize(mapload) + if(prob(75)) + starting_items += pick(list( + /obj/item/clothing/under/vampire/ventrue, + /obj/item/clothing/under/vampire/ventrue/female, + /obj/item/clothing/under/vampire/fancy_gray, + /obj/item/clothing/under/vampire/fancy_red, + /obj/item/clothing/under/vampire/leatherpants, + )) + . = ..() + +/obj/structure/mannequin/plastic/punk/Initialize(mapload) + if(prob(75)) + starting_items += pick(list( + /obj/item/clothing/under/vampire/punk, + /obj/item/clothing/under/vampire/black, + /obj/item/clothing/under/vampire/red, + /obj/item/clothing/under/vampire/gothic, + /obj/item/clothing/under/vampire/brujah, + /obj/item/clothing/under/vampire/brujah/female, + /obj/item/clothing/under/vampire/gangrel, + /obj/item/clothing/under/vampire/gangrel/female, + )) + . = ..() diff --git a/modular_darkpack/modules/mapping_helpers/code/viewport_helper.dm b/modular_darkpack/modules/mapping_helpers/code/viewport_helper.dm new file mode 100644 index 000000000000..115ca1f0d1a1 --- /dev/null +++ b/modular_darkpack/modules/mapping_helpers/code/viewport_helper.dm @@ -0,0 +1,19 @@ +#if !defined(CBT) +/obj/effect/mapping_helpers/viewport_helper + name = "viewport helper" + desc = "If you see this, the maptainers are all dead or dying. Mappers! Make sure to delete this later." + icon = 'modular_darkpack/modules/mapping_helpers/icons/viewport_helper.dmi' + icon_state = "viewport" + layer = INFINITY + pixel_x = -288 + pixel_y = -224 + +/obj/effect/mapping_helpers/viewport_helper/Initialize(mapload) + . = ..() + if(mapload) + CRASH("Viewport helper at X:[x], Y:[y]") + qdel(src) + +/obj/effect/mapping_helpers/viewport_helper/transparent + icon_state = "transparent" +#endif diff --git a/modular_darkpack/modules/mapping_helpers/icons/viewport_helper.dmi b/modular_darkpack/modules/mapping_helpers/icons/viewport_helper.dmi new file mode 100644 index 000000000000..92b8431be928 Binary files /dev/null and b/modular_darkpack/modules/mapping_helpers/icons/viewport_helper.dmi differ diff --git a/modular_darkpack/modules/masquerade/code/blood_hunt_skull.dm b/modular_darkpack/modules/masquerade/code/blood_hunt_skull.dm index e457e80d11e3..a5e1b9110b5f 100644 --- a/modular_darkpack/modules/masquerade/code/blood_hunt_skull.dm +++ b/modular_darkpack/modules/masquerade/code/blood_hunt_skull.dm @@ -50,17 +50,17 @@ to_chat(user, span_danger("There is no such name in the city!")) /obj/item/blood_hunt/proc/start_hunt(mob/user, mob/target, reason) - to_chat(user, span_warning("You add [target] to the Hunted list.")) + to_chat(user, span_warning("You add [target.real_name] to the Hunted list.")) RegisterSignals(target, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING, COMSIG_LIVING_GIBBED), PROC_REF(complete_hunt)) - log_game("[user] started a bloodhunt on [target] for: [reason]") - message_admins("[ADMIN_LOOKUPFLW(user)]] started a bloodhunt on [target] for: [reason]") + log_game("[user.real_name] started a bloodhunt on [target.real_name] for: [reason]") + message_admins("[ADMIN_LOOKUPFLW(user)]] started a bloodhunt on [target.real_name] for: [reason]") target.start_blood_hunt(reason) /obj/item/blood_hunt/proc/end_hunt(mob/user, mob/target) - to_chat(user, span_warning("You remove [target] from the Hunted list.")) + to_chat(user, span_warning("You remove [target.real_name] from the Hunted list.")) UnregisterSignal(target, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING, COMSIG_LIVING_GIBBED)) - log_game("[user] ended a bloodhunt on [target].") - message_admins("[ADMIN_LOOKUPFLW(user)]] ended a bloodhunt on [target].") + log_game("[user.real_name] ended a bloodhunt on [target.real_name].") + message_admins("[ADMIN_LOOKUPFLW(user)]] ended a bloodhunt on [target.real_name].") target.clear_blood_hunt() /obj/item/blood_hunt/proc/complete_hunt(mob/target) diff --git a/modular_darkpack/modules/masquerade/code/components/masquerade_hud.dm b/modular_darkpack/modules/masquerade/code/components/masquerade_hud.dm index 35a00473bcc3..a16c09483ca0 100644 --- a/modular_darkpack/modules/masquerade/code/components/masquerade_hud.dm +++ b/modular_darkpack/modules/masquerade/code/components/masquerade_hud.dm @@ -1,5 +1,3 @@ -#define HUD_LIST_MASQUERADE "masquerade" - //Component that adds an exclamation mark to things that have caused you to breach the masquerade. /datum/component/masquerade_hud dupe_mode = COMPONENT_DUPE_ALLOWED @@ -25,21 +23,15 @@ /datum/component/masquerade_hud/Destroy(force) UnregisterSignal(parent, COMSIG_MASQUERADE_HUD_DELETE) masquerade_breacher?.images -= new_masquerade_image + remove_image_from_client(new_masquerade_image, masquerade_breacher) masquerade_breacher = null new_masquerade_image = null - ..() + return ..() /datum/component/masquerade_hud/proc/create_masquerade_overlay() SIGNAL_HANDLER var/atom/atom_parent = parent - if(!atom_parent.hud_list) - atom_parent.hud_list = list() - - if(!atom_parent.hud_list[HUD_LIST_MASQUERADE]) - atom_parent.hud_list[HUD_LIST_MASQUERADE] = image(icon = 'icons/obj/storage/closet.dmi', loc = atom_parent, icon_state = "cardboard_special", layer = ABOVE_ALL_MOB_LAYER, pixel_z = 32) - atom_parent.hud_list[HUD_LIST_MASQUERADE].appearance_flags |= TILE_BOUND - new_masquerade_image = atom_parent.hud_list[HUD_LIST_MASQUERADE] - masquerade_breacher?.images |= new_masquerade_image - -#undef HUD_LIST_MASQUERADE + if(!new_masquerade_image) + new_masquerade_image = image(icon = 'icons/obj/storage/closet.dmi', loc = atom_parent, icon_state = "cardboard_special", layer = ABOVE_ALL_MOB_LAYER, pixel_z = 32) + add_image_to_client(new_masquerade_image, masquerade_breacher) diff --git a/modular_darkpack/modules/masquerade/code/components/violation_observer.dm b/modular_darkpack/modules/masquerade/code/components/violation_observer.dm index af0ba3b37b7f..310051b6cca8 100644 --- a/modular_darkpack/modules/masquerade/code/components/violation_observer.dm +++ b/modular_darkpack/modules/masquerade/code/components/violation_observer.dm @@ -25,7 +25,7 @@ /datum/component/violation_observer/proc/on_observed_violation(atom/source, mob/living/player_breacher) SIGNAL_HANDLER - if(!source || !player_breacher || ishumanbasic(player_breacher)) //Humans cant break the masquerade. Because reasons. + if(!source || !player_breacher || ismundane(player_breacher)) //Humans cant break the masquerade. Because reasons. return if(isliving(source)) @@ -33,9 +33,16 @@ if(!INCAPACITATED_IGNORING(mob_parent, INCAPABLE_RESTRAINTS)) mob_parent.face_atom(player_breacher) source.observe_masquerade_violation(player_breacher) - source.AddComponent(/datum/component/masquerade_hud, player_breacher) - breached_players |= player_breacher + var/mutable_appearance/alert = mutable_appearance('icons/obj/storage/closet.dmi', "cardboard_special") + SET_PLANE_EXPLICIT(alert, ABOVE_LIGHTING_PLANE, source) + var/atom/movable/flick_visual/exclamation = source.flick_overlay_view(alert, 1 SECONDS) + exclamation.alpha = 0 + exclamation.pixel_x = -source.pixel_x + animate(exclamation, pixel_z = 32, alpha = 255, time = 0.5 SECONDS, easing = ELASTIC_EASING) + + source.AddComponent(/datum/component/masquerade_hud, player_breacher) + breached_players += player_breacher SSmasquerade.masquerade_breach(source, player_breacher, (isliving(source) ? MASQUERADE_REASON_NPC : MASQUERADE_REASON_OBJECT)) /datum/component/violation_observer/proc/on_masquerade_violation_reinforced(atom/source, mob/living/player_breacher) @@ -56,8 +63,7 @@ breached_players -= player_breacher /atom/proc/observe_masquerade_violation(player_breacher) - do_alert_animation() - /* TODO: [Rebase] - GAROU + /* // DARKPACK TODO - GAROU if(isgarou(player_breacher) || iswerewolf(player_breacher)) to_chat(player_breacher, span_userdanger(span_bold("VEIL VIOLATION"))) SEND_SOUND(player_breacher, sound('code/modules/wod13/sounds/veil_violation.ogg', 0, 0, 75)) @@ -67,7 +73,7 @@ to_chat(player_breacher, span_userdanger(span_bold("MASQUERADE VIOLATION"))) /atom/proc/observe_masquerade_reinforce(player_breacher) - /* TODO: [Rebase] - GAROU + /* // DARKPACK TODO - GAROU if(isgarou(player_breacher) || iswerewolf(player_breacher)) SEND_SOUND(player_breacher, sound('code/modules/wod13/sounds/humanity_gain.ogg', 0, 0, 75)) to_chat(player_breacher, span_big(span_boldnicegreen("VEIL REINFORCEED"))) diff --git a/modular_darkpack/modules/masquerade/code/fields/violation_check_aoe.dm b/modular_darkpack/modules/masquerade/code/fields/violation_check_aoe.dm index f6d599e013c5..4caacadb9de5 100644 --- a/modular_darkpack/modules/masquerade/code/fields/violation_check_aoe.dm +++ b/modular_darkpack/modules/masquerade/code/fields/violation_check_aoe.dm @@ -62,8 +62,6 @@ /datum/proximity_monitor/advanced/violation_check_aoe/proc/violation_observer_breach_callback(mob/living/source) SIGNAL_HANDLER - if(!GLOB.canon_event) - return var/mob/living/host_mob = host if(host_mob.incapacitated || host_mob.stat >= SOFT_CRIT || host_mob.IsSleeping() || host_mob.IsParalyzed()) return diff --git a/modular_darkpack/modules/masquerade/code/human.dm b/modular_darkpack/modules/masquerade/code/human.dm index 21e14b3062c4..5727f9f344dc 100644 --- a/modular_darkpack/modules/masquerade/code/human.dm +++ b/modular_darkpack/modules/masquerade/code/human.dm @@ -3,8 +3,8 @@ ADD_TRAIT(src, TRAIT_HUNTED, "bloodhunt") SSbloodhunt.update_alert() for(var/player_mob in GLOB.kindred_list) - to_chat(player_mob, span_bold("The Blood Hunt after <span class='warning'>[real_name]</span> has been announced! <br> Reason: [reason]")) - SEND_SOUND(player_mob, sound('modular_darkpack/modules/masquerade/sound/announce.ogg')) + to_chat(player_mob, span_bold("The Blood Hunt after [span_warning("[real_name]")] has been announced! <br>Reason: [reason]")) + SEND_SOUND(player_mob, sound('modular_darkpack/master_files/sounds/announce.ogg')) /mob/proc/clear_blood_hunt() @@ -12,5 +12,5 @@ REMOVE_TRAIT(src, TRAIT_HUNTED, "bloodhunt") SSbloodhunt.update_alert() for(var/player_mob in GLOB.kindred_list) - to_chat(player_mob, span_bold("The Blood Hunt after <span class='green'>[real_name]</span> is over!")) - SEND_SOUND(player_mob, sound('modular_darkpack/modules/masquerade/sound/announce.ogg')) + to_chat(player_mob, span_bold("The Blood Hunt after [span_green("[real_name]")] is over!")) + SEND_SOUND(player_mob, sound('modular_darkpack/master_files/sounds/announce.ogg')) diff --git a/modular_darkpack/modules/masquerade/code/logging_machine.dm b/modular_darkpack/modules/masquerade/code/logging_machine.dm index e6523076117d..3e0f2fafc00b 100644 --- a/modular_darkpack/modules/masquerade/code/logging_machine.dm +++ b/modular_darkpack/modules/masquerade/code/logging_machine.dm @@ -92,7 +92,8 @@ stop_sound() break var/obj/phone = saved_logs[1][2] - SEND_SIGNAL(phone, COMSIG_ALL_MASQUERADE_REINFORCE) + if(phone) + SEND_SIGNAL(phone, COMSIG_ALL_MASQUERADE_REINFORCE) saved_logs -= list(saved_logs[1]) //Clear the oldest logs first. stop_sound() diff --git a/modular_darkpack/modules/masquerade/code/masquerade_admin.dm b/modular_darkpack/modules/masquerade/code/masquerade_admin.dm index ff2316118b77..bf92ab41d942 100644 --- a/modular_darkpack/modules/masquerade/code/masquerade_admin.dm +++ b/modular_darkpack/modules/masquerade/code/masquerade_admin.dm @@ -1,7 +1,5 @@ /mob/living/carbon/human/proc/AdjustMasquerade(value, reason = "debug") - if(!issupernatural(src)) - return - if(!GLOB.canon_event) + if(ismundane(src)) return switch(value) diff --git a/modular_darkpack/modules/masquerade/code/masquerade_contract.dm b/modular_darkpack/modules/masquerade/code/masquerade_contract.dm index a9132853c488..9cc5010d2339 100644 --- a/modular_darkpack/modules/masquerade/code/masquerade_contract.dm +++ b/modular_darkpack/modules/masquerade/code/masquerade_contract.dm @@ -31,18 +31,18 @@ if(!GLOB.masquerade_breakers_list) to_chat(user, span_info("No available Masquerade breakers in city...")) -/* TODO: [Rebase] - GAROU /obj/item/veil_contract name = "\improper brass pocketwatch" desc = "A posh looking pocketwatch." - icon = 'icons/obj/items_and_weapons.dmi' - onflooricon = 'code/modules/wod13/onfloor.dmi' + icon = 'modular_darkpack/modules/masquerade/icons/masquerade_contract.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/masquerade/icons/onfloor.dmi') icon_state = "pocketwatch" item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_SMALL armor_type = /datum/armor/masquerade_contract resistance_flags = FIRE_PROOF | ACID_PROOF +/* // DARKPACK TODO - GAROU /obj/item/veil_contract/attack_self(mob/user) . = ..() if(!isgarou(user)) diff --git a/modular_darkpack/modules/masquerade/code/masquerade_landmark.dm b/modular_darkpack/modules/masquerade/code/masquerade_landmark.dm index ce2a12ff2c47..3d47c93ac5b7 100644 --- a/modular_darkpack/modules/masquerade/code/masquerade_landmark.dm +++ b/modular_darkpack/modules/masquerade/code/masquerade_landmark.dm @@ -4,6 +4,7 @@ /obj/effect/landmark/latejoin_masquerade/Initialize(mapload) . = ..() + REGISTER_REQUIRED_MAP_ITEM(1, INFINITY) GLOB.masquerade_latejoin += src /obj/effect/landmark/latejoin_masquerade/Destroy() diff --git a/modular_darkpack/modules/masquerade/code/pref_masquerade.dm b/modular_darkpack/modules/masquerade/code/pref_masquerade.dm index 7f87cef3c74d..be40602cd272 100644 --- a/modular_darkpack/modules/masquerade/code/pref_masquerade.dm +++ b/modular_darkpack/modules/masquerade/code/pref_masquerade.dm @@ -1,5 +1,5 @@ /datum/preference/numeric/masquerade - category = PREFERENCE_CATEGORY_MANUALLY_RENDERED // TODO: [Rebase] - Render this somewhere + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED // DARKPACK TODO - Render this somewhere savefile_key = "masquerade" savefile_identifier = PREFERENCE_CHARACTER minimum = 1 diff --git a/modular_darkpack/modules/masquerade/code/subsystem/bloodhunt.dm b/modular_darkpack/modules/masquerade/code/subsystem/bloodhunt.dm index 51077faafc04..1a8ad01681ba 100644 --- a/modular_darkpack/modules/masquerade/code/subsystem/bloodhunt.dm +++ b/modular_darkpack/modules/masquerade/code/subsystem/bloodhunt.dm @@ -33,6 +33,9 @@ SUBSYSTEM_DEF(bloodhunt) /atom/movable/screen/alert/bloodhunt/Destroy() STOP_PROCESSING(SSprocessing, src) + angle = null + blood_target = null + selected_target = null return ..() /atom/movable/screen/alert/bloodhunt/Click() diff --git a/modular_darkpack/modules/masquerade/code/subsystem/masquerade.dm b/modular_darkpack/modules/masquerade/code/subsystem/masquerade.dm index 691a8bb2f805..57a0a15eb27a 100644 --- a/modular_darkpack/modules/masquerade/code/subsystem/masquerade.dm +++ b/modular_darkpack/modules/masquerade/code/subsystem/masquerade.dm @@ -43,8 +43,6 @@ SUBSYSTEM_DEF(masquerade) * reason - Optional, the reason for the breach. For example, */ /datum/controller/subsystem/masquerade/proc/masquerade_reinforce(atom/source, mob/living/player_breacher, reason) - if(!GLOB.canon_event) - return . = FALSE for(var/masquerade_breach as anything in masquerade_breachers) var/breach_sources = masquerade_breach[2] @@ -69,11 +67,11 @@ SUBSYSTEM_DEF(masquerade) . = TRUE break if(player_breacher.masquerade_score == 5) //Doesn't matter if they weren't in one of these lists. - // TODO: [Rebase] - GAROU + // DARKPACK TODO - GAROU //GLOB.veil_breakers_list -= player_breacher GLOB.masquerade_breakers_list -= player_breacher - /* TODO: [Rebase] - GAROU + /* // DARKPACK TODO - GAROU if(isgarou(player_breacher) || iswerewolf(player_breacher)) var/random_renown = pick("Honor","Wisdom","Glory") switch(random_renown) @@ -95,15 +93,13 @@ SUBSYSTEM_DEF(masquerade) * reason - The reason for the breach. For example, */ /datum/controller/subsystem/masquerade/proc/masquerade_breach(atom/source, mob/living/player_breacher, reason) - if(!GLOB.canon_event) - return log_game("[player_breacher] has caused a masquerade breach in front of [source] by [reason]") var/pre_breach_score = player_breacher.masquerade_score if(pre_breach_score == 0) return player_breacher.masquerade_score = max(0, player_breacher.masquerade_score - 1) masquerade_breachers += list(list(player_breacher, source, reason)) - // TODO: [Rebase] - GAROU + // DARKPACK TODO - GAROU //if(isgarou(player_breacher) || iswerewolf(player_breacher)) // GLOB.veil_breakers_list |= player_breacher //else @@ -123,7 +119,7 @@ SUBSYSTEM_DEF(masquerade) /datum/controller/subsystem/masquerade/proc/save_persistent_masquerade(mob/living/player_breacher) var/datum/preferences/preferences = GLOB.preferences_datums[ckey(player_breacher.key)] if(preferences) - preferences.write_preference(GLOB.preference_entries[/datum/preference/numeric/masquerade], player_breacher.masquerade_score) + preferences.write_preference_midround(GLOB.preference_entries[/datum/preference/numeric/masquerade], player_breacher.masquerade_score) preferences.save_character() // This is for clearing the round's masquerade because a player matrix'd @@ -132,7 +128,7 @@ SUBSYSTEM_DEF(masquerade) if((player_breacher in masquerade_breach)) masquerade_breachers -= list(masquerade_breach) masquerade_level = min(MASQUERADE_MAX_LEVEL, masquerade_level + 1) - // TODO: [Rebase] - GAROU + // DARKPACK TODO - GAROU //if(isgarou(player_breacher) || iswerewolf(player_breacher)) // GLOB.veil_breakers_list -= player_breacher //else @@ -143,13 +139,13 @@ SUBSYSTEM_DEF(masquerade) // This is for checking if a joined player should be on the breachers list. /datum/controller/subsystem/masquerade/proc/masquerade_breacher_check(mob/living/player_breacher) if(player_breacher.masquerade_score < 5) - // TODO: [Rebase] - GAROU + // DARKPACK TODO - GAROU //if(isgarou(player_breacher) || iswerewolf(player_breacher)) // GLOB.veil_breakers_list |= player_breacher //else GLOB.masquerade_breakers_list |= player_breacher else - // TODO: [Rebase] - GAROU + // DARKPACK TODO - GAROU //if(isgarou(player_breacher) || iswerewolf(player_breacher)) // GLOB.veil_breakers_list -= player_breacher //else diff --git a/modular_darkpack/modules/masquerade/code/word_checker.dm b/modular_darkpack/modules/masquerade/code/word_checker.dm index c9727e0d15e7..3e25d0371d38 100644 --- a/modular_darkpack/modules/masquerade/code/word_checker.dm +++ b/modular_darkpack/modules/masquerade/code/word_checker.dm @@ -1,25 +1,23 @@ #define MASQUERADE_FILTER_CHECK(T) (SSmasquerade.masquerade_breaching_phrase_regex && findtext(T, SSmasquerade.masquerade_breaching_phrase_regex)) -/mob/living/carbon/human/npc/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range) +/mob/living/carbon/human/npc/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range, source) if(stat >= SOFT_CRIT) return ..() - //if(issabbat(src)) //Because sabbatists are idiots. - // return ..() - var/treated_message = translate_language(speaker, message_language, raw_message, spans, message_mods) if(lowertext(MASQUERADE_FILTER_CHECK(treated_message))) SEND_SIGNAL(src, COMSIG_SEEN_MASQUERADE_VIOLATION, speaker) - ..() + return ..() + +/obj/item/smartphone/proc/handle_hearing(datum/source, list/hearing_args) + SIGNAL_HANDLER -/* DARKPACK TODO: PHONES -/obj/item/vamp/phone/handle_hearing(datum/source, list/hearing_args) - if(online && talking) - if(istype(hearing_args[HEARING_SPEAKER], /obj/phonevoice)) - return ..() + if(current_state == PHONE_IN_CALL) + if(istype(hearing_args[HEARING_SPEAKER], /atom/movable/virtualspeaker)) + return + var/message = compose_message(hearing_args[HEARING_SPEAKER], hearing_args[HEARING_LANGUAGE], hearing_args[HEARING_RAW_MESSAGE], hearing_args[HEARING_RADIO_FREQ], hearing_args[HEARING_RADIO_FREQ_NAME], hearing_args[HEARING_RADIO_FREQ_COLOR], hearing_args[HEARING_SPANS], hearing_args[HEARING_MESSAGE_MODE], FALSE) + SSmasquerade.log_phone_message(message, source) if(lowertext(MASQUERADE_FILTER_CHECK(hearing_args[HEARING_RAW_MESSAGE]))) SEND_SIGNAL(src, COMSIG_SEEN_MASQUERADE_VIOLATION, hearing_args[HEARING_SPEAKER]) - ..() -*/ #undef MASQUERADE_FILTER_CHECK diff --git a/modular_darkpack/modules/masquerade/readme.md b/modular_darkpack/modules/masquerade/readme.md index 9e2397cf9d89..28f8c0dd8d2f 100644 --- a/modular_darkpack/modules/masquerade/readme.md +++ b/modular_darkpack/modules/masquerade/readme.md @@ -13,7 +13,7 @@ This module handles everything related to the masquerade, veil or whatnot. ### Modular Overrides: - `/mob/living/carbon/human/npc/Hear()` -- `/obj/item/vamp/phone/handle_hearing()` +- `/obj/item/smartphone/handle_hearing()` - `modular_darkpack/master_files/code/modules/mob/living/var/masquerade_timer` ### Defines: diff --git a/modular_darkpack/modules/matrix/code/job.dm b/modular_darkpack/modules/matrix/code/job.dm index f7d9af2c6d07..ab4edb7338ae 100644 --- a/modular_darkpack/modules/matrix/code/job.dm +++ b/modular_darkpack/modules/matrix/code/job.dm @@ -1,19 +1,11 @@ -/datum/controller/subsystem/job/proc/FreeRole(rank) - if(!rank) +/datum/controller/subsystem/job/proc/FreeRole(mob/living/carbon/despawning_mob) + var/datum/job/job_datum = despawning_mob.mind.assigned_role + if(!job_datum) return - job_debug("Freeing role: [rank]") - var/datum/job/job = get_job(rank) - if(!job) - return FALSE - job.current_positions = max(0, job.current_positions - 1) + job_debug("Freeing role: [job_datum.title]") + job_datum.current_positions = max(0, job_datum.current_positions - 1) -/// Used for clocking back in, re-claiming the previously freed role. Returns false if no slot is available. -/datum/controller/subsystem/job/proc/OccupyRole(rank) - if(!rank) - return FALSE - job_debug("Occupying role: [rank]") - var/datum/job/job = get_job(rank) - if(!job || job.current_positions >= job.total_positions) - return FALSE - job.current_positions = job.current_positions + 1 - return TRUE + var/datum/species/player_species = despawning_mob.dna?.species + var/player_species_id = player_species?.id + if(job_datum.species_slots[player_species_id] >= 0) + job_datum.species_slots[player_species_id] = job_datum.species_slots[player_species_id] + 1 diff --git a/modular_darkpack/modules/matrix/code/matrix.dm b/modular_darkpack/modules/matrix/code/matrix.dm index 4d2ee714b4a1..0107ffbe8746 100644 --- a/modular_darkpack/modules/matrix/code/matrix.dm +++ b/modular_darkpack/modules/matrix/code/matrix.dm @@ -34,6 +34,10 @@ return TRUE ADMIN_VERB_AND_CONTEXT_MENU(matrix_mob_verb, R_ADMIN, "Matrix Mob", "Matrix (despawn) a mob.", ADMIN_CATEGORY_GAME, mob/living/target in world) + var/confirm = tgui_alert(user, "Are you sure you want to matrix this mob?", "Confirm", list("Yes", "No")) + if(confirm != "Yes") + return + var/turf/target_turf = get_turf(target) var/message = "[key_name(user)] has matrixed [target] ([target.type]) at [AREACOORD(target_turf)]" message_admins(message) @@ -46,7 +50,7 @@ ADMIN_VERB_AND_CONTEXT_MENU(matrix_mob_verb, R_ADMIN, "Matrix Mob", "Matrix (des message_admins("[ADMIN_LOOKUP(despawning_mob)] has exited through the matrix.") log_game("[despawning_mob] has exited through the matrix.") - SSjob.FreeRole(despawning_mob.mind.assigned_role) + SSjob.FreeRole(despawning_mob) GLOB.joined_player_list -= despawning_mob.ckey diff --git a/modular_darkpack/modules/mob_spawners/code/citizen.dm b/modular_darkpack/modules/mob_spawners/code/citizen.dm new file mode 100644 index 000000000000..44f2d8bb2762 --- /dev/null +++ b/modular_darkpack/modules/mob_spawners/code/citizen.dm @@ -0,0 +1,56 @@ + +/datum/outfit/civillian1 + name = "civillian" + uniform = /obj/item/clothing/under/vampire/sport + shoes = /obj/item/clothing/shoes/vampire/sneakers + gloves = /obj/item/watch + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/flashlight + l_hand = /obj/item/vamp/keys/npc/fix + back = /obj/item/storage/backpack/satchel + +/datum/outfit/civillian2 + name = "civillian" + uniform = /obj/item/clothing/under/vampire/office + shoes = /obj/item/clothing/shoes/vampire + gloves = /obj/item/watch + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/flashlight + l_hand = /obj/item/vamp/keys/npc/fix + back = /obj/item/storage/backpack/satchel + +/datum/outfit/civillian3 + name = "civillian" + uniform = /obj/item/clothing/under/vampire/emo + shoes = /obj/item/clothing/shoes/vampire + gloves = /obj/item/watch + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/flashlight + l_hand = /obj/item/vamp/keys/npc/fix + back = /obj/item/storage/backpack/satchel + +/datum/outfit/civillian4 + name = "civillian" + uniform = /obj/item/clothing/under/vampire/bandit + shoes = /obj/item/clothing/shoes/vampire/jackboots + gloves = /obj/item/watch + l_pocket = /obj/item/smartphone + r_pocket = /obj/item/flashlight + l_hand = /obj/item/vamp/keys/npc/fix + back = /obj/item/storage/backpack/satchel + +/obj/effect/mob_spawn/corpse/human/ciz1 + name = "Citizen" + outfit = /datum/outfit/civillian1 + +/obj/effect/mob_spawn/corpse/human/ciz2 + name = "Citizen" + outfit = /datum/outfit/civillian2 + +/obj/effect/mob_spawn/corpse/human/ciz3 + name = "Citizen" + outfit = /datum/outfit/civillian3 + +/obj/effect/mob_spawn/corpse/human/ciz4 + name = "Citizen" + outfit = /datum/outfit/civillian4 diff --git a/modular_darkpack/modules/mob_spawners/code/corpses/citizen_corpses.dm b/modular_darkpack/modules/mob_spawners/code/corpses/citizen_corpses.dm deleted file mode 100644 index 2ba666c07190..000000000000 --- a/modular_darkpack/modules/mob_spawners/code/corpses/citizen_corpses.dm +++ /dev/null @@ -1,19 +0,0 @@ -/obj/effect/mob_spawn/human/corpse/ciz1 - name = "Citizen" - id_job = "Citizen" - outfit = /datum/outfit/civillian1 - -/obj/effect/mob_spawn/human/corpse/ciz2 - name = "Citizen" - id_job = "Citizen" - outfit = /datum/outfit/civillian2 - -/obj/effect/mob_spawn/human/corpse/ciz3 - name = "Citizen" - id_job = "Citizen" - outfit = /datum/outfit/civillian3 - -/obj/effect/mob_spawn/human/corpse/ciz4 - name = "Citizen" - id_job = "Citizen" - outfit = /datum/outfit/civillian4 diff --git a/modular_darkpack/modules/mob_spawners/code/ghost_roles/chaplain_role.dm b/modular_darkpack/modules/mob_spawners/code/ghost_roles/chaplain_role.dm deleted file mode 100644 index b65dfb513fd9..000000000000 --- a/modular_darkpack/modules/mob_spawners/code/ghost_roles/chaplain_role.dm +++ /dev/null @@ -1,35 +0,0 @@ -/obj/effect/mob_spawn/human/achaplain - name = "a chaplain" - desc = "A humming sleeper with a silhouetted occupant inside. Its stasis function is broken and it's likely being used as a bed." - mob_name = "a chaplain" - icon = 'icons/obj/lavaland/spawners.dmi' - icon_state = "cryostasis_sleeper" - outfit = /datum/outfit/achaplain - roundstart = FALSE - death = FALSE - random = FALSE - mob_species = /datum/species/human - short_desc = "You were guarding the Church, but then..." - flavour_text = "You are a man of true Faith, but people in this city are not. You should protect the House of God..." - assignedrole = "Chaplain" - -/obj/effect/mob_spawn/human/achaplain/special(mob/living/new_spawn) - var/my_name = "Tyler" - if(new_spawn.gender == MALE) - my_name = pick(GLOB.first_names_male) - else - my_name = pick(GLOB.first_names_female) - var/my_surname = pick(GLOB.last_names) - new_spawn.fully_replace_character_name(null,"[my_name] [my_surname]") - new_spawn.mind.holy_role = HOLY_ROLE_PRIEST - -/datum/outfit/achaplain - name = "chaplain" - uniform = /obj/item/clothing/under/vampire/graveyard - shoes = /obj/item/clothing/shoes/vampire/jackboots - id = /obj/item/card/id/hunter - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/flashlight - l_hand = /obj/item/vamp/keys/church - r_hand = /obj/item/gun/ballistic/shotgun/vampire - back = /obj/item/storage/backpack/satchel diff --git a/modular_darkpack/modules/mob_spawners/code/ghost_roles/citizen_role.dm b/modular_darkpack/modules/mob_spawners/code/ghost_roles/citizen_role.dm deleted file mode 100644 index 566ca463d8b0..000000000000 --- a/modular_darkpack/modules/mob_spawners/code/ghost_roles/citizen_role.dm +++ /dev/null @@ -1,78 +0,0 @@ -/obj/effect/mob_spawn/human/citizen - name = "just a civilian" - desc = "A humming sleeper with a silhouetted occupant inside. Its stasis function is broken and it's likely being used as a bed." - mob_name = "a civillian" - icon = 'icons/obj/mining_zones/spawners.dmi' - icon_state = "cryostasis_sleeper" - outfit = /datum/outfit/civillian1 - roundstart = FALSE - death = FALSE - random = FALSE - mob_species = /datum/species/human - short_desc = "You just woke up from strange noises outside. This city is totally cursed..." - flavour_text = "Each day you notice some weird shit going at night. Each day, new corpses, new missing people, new police-don't-give-a-fuck. This time you definitely should go and see the mysterious powers of the night... or not? You are too afraid because you are not aware of it." - assignedrole = "Civillian" - -/obj/effect/mob_spawn/human/citizen/Initialize(mapload) - . = ..() - if(prob(50)) - qdel(src) - return - var/arrpee = rand(1,4) - switch(arrpee) - if(2) - outfit = /datum/outfit/civillian2 - if(3) - outfit = /datum/outfit/civillian3 - if(4) - outfit = /datum/outfit/civillian4 - -/obj/effect/mob_spawn/human/citizen/special(mob/living/new_spawn) - var/my_name = "Tyler" - if(new_spawn.gender == MALE) - my_name = pick(GLOB.first_names_male) - else - my_name = pick(GLOB.first_names_female) - var/my_surname = pick(GLOB.last_names) - new_spawn.fully_replace_character_name(null,"[my_name] [my_surname]") - - -/datum/outfit/civillian1 - name = "civillian" - uniform = /obj/item/clothing/under/vampire/sport - shoes = /obj/item/clothing/shoes/vampire/sneakers - id = /obj/item/cockclock - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/flashlight - l_hand = /obj/item/vamp/keys/npc/fix - back = /obj/item/storage/backpack/satchel - -/datum/outfit/civillian2 - name = "civillian" - uniform = /obj/item/clothing/under/vampire/office - shoes = /obj/item/clothing/shoes/vampire - id = /obj/item/cockclock - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/flashlight - l_hand = /obj/item/vamp/keys/npc/fix - back = /obj/item/storage/backpack/satchel - -/datum/outfit/civillian3 - name = "civillian" - uniform = /obj/item/clothing/under/vampire/emo - shoes = /obj/item/clothing/shoes/vampire - id = /obj/item/cockclock - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/flashlight - l_hand = /obj/item/vamp/keys/npc/fix - back = /obj/item/storage/backpack/satchel - -/datum/outfit/civillian4 - name = "civillian" - uniform = /obj/item/clothing/under/vampire/bandit - shoes = /obj/item/clothing/shoes/vampire/jackboots - id = /obj/item/cockclock - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/flashlight - l_hand = /obj/item/vamp/keys/npc/fix - back = /obj/item/storage/backpack/satchel diff --git a/modular_darkpack/modules/mob_spawners/code/ghost_roles/police_role.dm b/modular_darkpack/modules/mob_spawners/code/ghost_roles/police_role.dm deleted file mode 100644 index faae84937073..000000000000 --- a/modular_darkpack/modules/mob_spawners/code/ghost_roles/police_role.dm +++ /dev/null @@ -1,36 +0,0 @@ -/obj/effect/mob_spawn/human/police - name = "a police officer" - desc = "A humming sleeper with a silhouetted occupant inside. Its stasis function is broken and it's likely being used as a bed." - mob_name = "a police officer" - icon = 'icons/obj/lavaland/spawners.dmi' - icon_state = "cryostasis_sleeper" - outfit = /datum/outfit/policeofficer - roundstart = FALSE - death = FALSE - random = FALSE - mob_species = /datum/species/human - short_desc = "You worked a simple night shift, but then..." - flavour_text = "You woke up on your regular night shift and noticed something strange happening in the city. Only man interested in finding the truth is you..." - assignedrole = "Police Officer" - -/obj/effect/mob_spawn/human/police/special(mob/living/new_spawn) - var/my_name = "Tyler" - if(new_spawn.gender == MALE) - my_name = pick(GLOB.first_names_male) - else - my_name = pick(GLOB.first_names_female) - var/my_surname = pick(GLOB.last_names) - new_spawn.fully_replace_character_name(null,"[my_name] [my_surname]") - -/datum/outfit/policeofficer - name = "police officer" - uniform = /obj/item/clothing/under/vampire/police - shoes = /obj/item/clothing/shoes/vampire/jackboots - suit = /obj/item/clothing/suit/vampire/vest - belt = /obj/item/melee/classic_baton - id = /obj/item/cockclock - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/radio/cop - l_hand = /obj/item/vamp/keys/police - r_hand = /obj/item/police_radio - back = /obj/item/storage/backpack/satchel diff --git a/modular_darkpack/modules/mob_spawners/code/ghost_roles/security_guard_role.dm b/modular_darkpack/modules/mob_spawners/code/ghost_roles/security_guard_role.dm deleted file mode 100644 index e6a69e22ee81..000000000000 --- a/modular_darkpack/modules/mob_spawners/code/ghost_roles/security_guard_role.dm +++ /dev/null @@ -1,49 +0,0 @@ -/obj/effect/mob_spawn/human/chunkguard - name = "Millenium Tower Security Guard" - desc = "A humming sleeper with a silhouetted occupant inside. Its stasis function is broken and it's likely being used as a bed." - mob_name = "a Millenium Tower Security Guard" - icon = 'icons/obj/lavaland/spawners.dmi' - icon_state = "cryostasis_sleeper" - outfit = /datum/outfit/chunk - roundstart = FALSE - death = FALSE - random = FALSE - mob_species = /datum/species/human - short_desc = "You are working the night shift on Millenium Towers, just like any other night...." - flavour_text = "You are up late protecting Millenium Towers on behalf of your pasty-faced, but filthy rich, boss. Come to think of it, you only ever see him at night..." - assignedrole = "Millenium Tower Secuity Guard" - -/obj/effect/mob_spawn/human/chunkguard/special(mob/living/new_spawn) - var/my_name = "Tyler" - if(new_spawn.gender == MALE) - my_name = pick(GLOB.first_names_male) - else - my_name = pick(GLOB.first_names_female) - var/my_surname = pick(GLOB.last_names) - new_spawn.fully_replace_character_name(null,"[my_name] [my_surname]") - -/datum/outfit/chunk - name = "Security Guard Chunk" - uniform = /obj/item/clothing/under/vampire/guard - shoes = /obj/item/clothing/shoes/vampire - belt = /obj/item/gun/ballistic/automatic/pistol/darkpack/m1911 - l_pocket = /obj/item/vamp/phone - r_pocket = /obj/item/vamp/keys/camarilla - back = /obj/item/storage/backpack/satchel - backpack_contents = list(/obj/item/flashlight=1, /obj/item/card/credit=1,/obj/item/food/donut/plain=5,/obj/item/card/id/chunk=1) - -/obj/item/card/id/chunk - name = "Millenium Tower Security ID" - id_type_name = "Security ID" - desc = "An ID showing propensity for donuts" - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "id2" - inhand_icon_state = "card-id" - lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - worn_icon_state = "id2" - -/obj/item/card/id/chunk/click_alt(mob/user) - return diff --git a/modular_darkpack/modules/mob_spawners/code/ghost_roles/triad_role.dm b/modular_darkpack/modules/mob_spawners/code/ghost_roles/triad_role.dm deleted file mode 100644 index 4bd141bad71f..000000000000 --- a/modular_darkpack/modules/mob_spawners/code/ghost_roles/triad_role.dm +++ /dev/null @@ -1,23 +0,0 @@ -/obj/effect/mob_spawn/human/triad_soldier - name = "a triad soldier" - desc = "A humming sleeper with a silhouetted occupant inside. Its stasis function is broken and it's likely being used as a bed." - mob_name = "a triad soldier" - icon = 'icons/obj/lavaland/spawners.dmi' - icon_state = "cryostasis_sleeper" - outfit = /datum/outfit/job/triad_soldier - roundstart = FALSE - death = FALSE - random = FALSE - mob_species = /datum/species/human - short_desc = "You were sleeping. But you can't anymore." - flavour_text = "You woke up because of the stupid washing machines. Probably better that you go and check what the gang's up to..." - assignedrole = "Triad Soldier" - -/obj/effect/mob_spawn/human/triad_soldier/special(mob/living/new_spawn) - var/my_name = "Tyler" - if(new_spawn.gender == MALE) - my_name = pick(GLOB.first_names_male_triad) - else - my_name = pick(GLOB.first_names_female_triad) - var/my_surname = pick(GLOB.last_names_triad) - new_spawn.fully_replace_character_name(null,"[my_name] [my_surname]") diff --git a/modular_darkpack/modules/mobs/pets/dog.dm b/modular_darkpack/modules/mobs/pets/dog.dm deleted file mode 100644 index b38e1076b25c..000000000000 --- a/modular_darkpack/modules/mobs/pets/dog.dm +++ /dev/null @@ -1,26 +0,0 @@ -/mob/living/basic/pet/dog/darkpack - name = "\improper dog" - real_name = "dog" - icon_state = "dog1" - desc = "That's an ouppy." - base_icon_state = "dog" - icon = 'modular_darkpack/master_files/icons/mobs/simple/pets.dmi' - var/random_dog_color = TRUE - mobility_flags = MOBILITY_FLAGS_REST_CAPABLE_DEFAULT - -/mob/living/basic/pet/dog/darkpack/Initialize(mapload) - . = ..() - add_verb(src, /mob/living/proc/toggle_resting) - if(random_dog_color) - var/id = rand(1, 6) - icon_state = "[base_icon_state][id]" - icon_living = "[base_icon_state][id]" - icon_dead = "[base_icon_state][id]_dead" - -/mob/living/basic/pet/dog/darkpack/update_icon_state() - . = ..() - if(stat != DEAD) - if(resting) - icon_state = "[icon_living]_rest" - else - icon_state = "[icon_living]" diff --git a/modular_darkpack/modules/npc/code/human/__npc.dm b/modular_darkpack/modules/npc/code/human/__npc.dm index 7daca10c4120..1a1d4b4d3b1e 100644 --- a/modular_darkpack/modules/npc/code/human/__npc.dm +++ b/modular_darkpack/modules/npc/code/human/__npc.dm @@ -7,6 +7,9 @@ // NPCs normally walk around slowly move_intent = MOVE_INTENT_WALK + // NPC humans get the area of effect, player humans dont. + violation_aoe = TRUE + /// Until we do a full NPC refactor (see: rewriting every single bit of code) /// use this to determine NPC weapons and their chances to spawn with them -- assuming you want the NPC to do that /// Otherwise just set it under the NPC's type as @@ -14,7 +17,7 @@ /// my_backup_weapon = type_path /// This only determines my_weapon, you set my_backup_weapon yourself /// The last entry in the list for a type of NPC should always have 100 as the index - // TODO: [Rebase] reimplement weapons + // DARKPACK TODO - reimplement weapons /* var/static/list/role_weapons_chances = list( BANDIT_TYPE_NPC = list( @@ -37,7 +40,7 @@ var/aggressive = FALSE var/last_antagonised = 0 var/mob/living/danger_source - var/obj/effect/fire/afraid_of_fire + var/obj/effect/abstract/turf_fire/afraid_of_fire var/mob/living/last_attacker var/last_health = 100 var/mob/living/last_damager @@ -84,23 +87,18 @@ GLOB.npc_list += src GLOB.alive_npc_list += src + AddElement(/datum/element/relay_attackers) + RegisterSignal(src, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(handle_attacked)) + // Annoy the NPC when pushed around RegisterSignal(src, COMSIG_LIVING_MOB_BUMPED, PROC_REF(handle_bumped)) - // Aggro the NPC when shoved - RegisterSignal(src, COMSIG_LIVING_DISARM_HIT, PROC_REF(handle_shoved)) // Be annoyed if helped RegisterSignal(src, COMSIG_CARBON_HELP_ACT, PROC_REF(handle_helped)) - // Aggro if shot or hit by any projectile - RegisterSignal(src, COMSIG_PROJECTILE_ON_HIT, PROC_REF(handle_projectile_hit)) - - // NPC humans get the area of effect, player humans dont. This is a fucky way of doing this. - qdel(GetComponent(/datum/component/violation_observer)) - AddComponent(/datum/component/violation_observer, TRUE) return INITIALIZE_HINT_LATELOAD /mob/living/carbon/human/npc/LateInitialize(mapload) - // TODO: [Rebase] reimplement weapons + // DARKPACK TODO - reimplement weapons /* if (role_weapons_chances.Find(type)) for(var/weapon in role_weapons_chances[type]) @@ -126,11 +124,23 @@ register_sticky_item(my_backup_weapon) /mob/living/carbon/human/npc/Destroy() + QDEL_NULL(socialrole) + danger_source = null + QDEL_NULL(afraid_of_fire) + last_attacker = null + last_damager = null + walktarget = null + tupik_loc = null + my_weapon_type = null + my_weapon = null + my_backup_weapon_type = null + my_backup_weapon = null + spotted_bodies = null + drop_on_death_list = null GLOB.npc_list -= src GLOB.alive_npc_list -= src - SShumannpcpool.npclost() - - . = ..() + SShumannpcpool.try_repopulate() + return ..() //====================Sticky Item Handling==================== /mob/living/carbon/human/npc/proc/register_sticky_item(obj/item/my_item) @@ -150,12 +160,6 @@ REMOVE_TRAIT(dropping_item, TRAIT_NODROP, NPC_ITEM_TRAIT) dropItemToGround(dropping_item, TRUE) -//If an npc's item has TRAIT_NODROP, we NEVER drop it, even if it is forced. -/mob/living/carbon/human/npc/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) - if (I && HAS_TRAIT(I, TRAIT_NODROP)) - return FALSE - - . = ..() //============================================================ /mob/living/carbon/human/npc/proc/realistic_say(message) @@ -206,6 +210,14 @@ phrase = pick(socialrole.female_phrases) realistic_say(phrase) +/mob/living/carbon/human/npc/proc/handle_attacked(datum/source, atom/attacker, attack_flags) + // Only aggro nearby npcs if its lethal. + if(!(attack_flags & (ATTACKER_STAMINA_ATTACK|ATTACKER_SHOVING))) + for(var/mob/living/carbon/human/npc/nearby_npcs in oviewers(DEFAULT_SIGHT_DISTANCE, src)) + nearby_npcs.Aggro(attacker) + SEND_SIGNAL(SSdcs, COMSIG_GLOB_REPORT_CRIME, CRIME_FIREFIGHT, get_turf(src)) + Aggro(attacker, TRUE) + /mob/living/carbon/human/npc/proc/handle_bumped(mob/living/carbon/human/npc/source, mob/living/bumping) SIGNAL_HANDLER @@ -214,6 +226,10 @@ source.Annoy(bumping) +/mob/living/carbon/human/npc/proc/handle_helped(mob/living/carbon/human/npc/source, mob/living/helper) + SIGNAL_HANDLER + + source.Annoy(helper) /mob/living/carbon/human/npc/Move(NewLoc, direct) if (!can_npc_move()) @@ -230,84 +246,30 @@ . = ..() -/mob/living/carbon/human/npc/attack_hand(mob/user, list/modifiers) - if (!isliving(user)) - return - var/mob/living/hit_by = user - - if (hit_by.combat_mode) - for (var/mob/living/carbon/human/npc/NEPIC in oviewers(7, src)) - NEPIC.Aggro(user) - Aggro(user, TRUE) - - . = ..() - -/mob/living/carbon/human/npc/proc/handle_helped(mob/living/carbon/human/npc/source, mob/living/helper) - SIGNAL_HANDLER - - source.Annoy(helper) - -/mob/living/carbon/human/npc/proc/handle_shoved(mob/living/carbon/human/npc/source, mob/living/attacker, zone_targeted, obj/item/weapon) - SIGNAL_HANDLER - - INVOKE_ASYNC(source, PROC_REF(Aggro), attacker, TRUE) - -/mob/living/carbon/human/npc/proc/handle_projectile_hit(mob/living/carbon/human/npc/source, atom/movable/firer, atom/target, angle, hit_limb, blocked, pierce_hit) - SIGNAL_HANDLER - - if (!isliving(firer)) - return - - for (var/mob/living/carbon/human/npc/NEPIC in oviewers(7, src)) - INVOKE_ASYNC(NEPIC, PROC_REF(Aggro), firer) - INVOKE_ASYNC(src, PROC_REF(Aggro), firer, TRUE) - - // TODO: [Rebase] reimplement P25 radios and crime stuff - /* - var/witness_count - - for (var/mob/living/carbon/human/npc/NEPIC in viewers(7, usr)) - if (NEPIC?.stat != DEAD) - witness_count++ - if (witness_count > 1) - for (var/obj/item/police_radio/radio in GLOB.police_radios) - radio.announce_crime("victim", get_turf(src)) - for (var/obj/machinery/p25transceiver/police/radio in GLOB.p25_transceivers) - if (radio.p25_network == "police") - radio.announce_crime("victim", get_turf(src)) - break - */ - -/mob/living/carbon/human/npc/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) - . = ..() - if(throwingdatum?.thrower && (AM.throwforce > 5 || (AM.throwforce && src.health < src.maxHealth))) - Aggro(throwingdatum.thrower, TRUE) - -/mob/living/carbon/human/npc/attackby(obj/item/W, mob/living/user, params) - . = ..() - - if (!user) - return - if (!W.force || ((W.force <= 5) && (health >= maxHealth))) - return - - for (var/mob/living/carbon/human/npc/NEPIC in oviewers(7, src)) - NEPIC.Aggro(user) - Aggro(user, TRUE) - /mob/living/carbon/human/npc/grabbedby(mob/living/carbon/user, supress_message = FALSE) . = ..() last_grab = world.time /mob/living/carbon/human/npc/ghoulificate(mob/owner) - set waitfor = FALSE - var/mob/dead/observer/candidate = SSpolling.poll_ghosts_for_target("Do you want to play as [owner]`s ghoul?", check_jobban = ROLE_GHOUL, role = ROLE_GHOUL, poll_time = 15 SECONDS, checked_target = src, alert_pic = src) deadchat_broadcast(span_ghostalert("[owner] is ghoulificating [src]."), owner, src) - if(isnull(candidate)) - return FALSE - message_admins("[key_name_admin(candidate)] has became a ghoul by [key_name_admin(owner)].") - ghostize(FALSE) - PossessByPlayer(candidate.key) + + AddComponent(\ + /datum/component/ghost_direct_control,\ + ban_type = ROLE_GHOUL,\ + poll_candidates = TRUE,\ + role_name = "[owner]'s ghoul",\ + poll_length = 30 SECONDS,\ + poll_question = "Do you want to play as [owner]'s ghoul?",\ + + assumed_control_message = "You are now [owner]'s ghoul!",\ + after_assumed_control = CALLBACK(src, PROC_REF(ghoul_player_controlled), owner)\ + ) + + //poll_ignore_key = POLL_IGNORE_GHOUL, + . = ..() return TRUE + +/mob/living/carbon/human/npc/proc/ghoul_player_controlled(mob/owner) + message_admins("[key_name_admin(src)] has became a ghoul by [key_name_admin(owner)].") diff --git a/modular_darkpack/modules/npc/code/human/npc_human_subsystem.dm b/modular_darkpack/modules/npc/code/human/npc_human_subsystem.dm index c3ecbe18e215..10887de97b85 100644 --- a/modular_darkpack/modules/npc/code/human/npc_human_subsystem.dm +++ b/modular_darkpack/modules/npc/code/human/npc_human_subsystem.dm @@ -1,12 +1,20 @@ SUBSYSTEM_DEF(humannpcpool) name = "Human NPC Pool" - flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND + flags = SS_POST_FIRE_TIMING|SS_BACKGROUND priority = FIRE_PRIORITY_NPC runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - wait = 30 + wait = 0.3 SECONDS + + dependencies = list( + /datum/controller/subsystem/mapping, + /datum/controller/subsystem/atoms, + ) var/list/currentrun = list() - var/npc_max = 220 + +/datum/controller/subsystem/humannpcpool/Initialize() + try_repopulate() + return SS_INIT_SUCCESS /datum/controller/subsystem/humannpcpool/stat_entry(msg) var/list/activelist = GLOB.npc_list @@ -31,11 +39,11 @@ SUBSYSTEM_DEF(humannpcpool) return NPC.handle_automated_movement() -/datum/controller/subsystem/humannpcpool/proc/npclost() +/datum/controller/subsystem/humannpcpool/proc/try_repopulate() if (!length(GLOB.npc_spawn_points)) return - while (length(GLOB.alive_npc_list) < npc_max) + while (length(GLOB.alive_npc_list) < SSmapping.current_map.max_npcs) var/atom/chosen_spawn_point = pick(GLOB.npc_spawn_points) var/creating_npc = pick( /mob/living/carbon/human/npc/police, \ diff --git a/modular_darkpack/modules/npc/code/human/npc_movement.dm b/modular_darkpack/modules/npc/code/human/npc_movement.dm index a2e6ae6223c2..e05c0b233c94 100644 --- a/modular_darkpack/modules/npc/code/human/npc_movement.dm +++ b/modular_darkpack/modules/npc/code/human/npc_movement.dm @@ -1,4 +1,6 @@ /obj/effect/landmark/npc_spawn_point + icon = 'modular_darkpack/modules/deprecated/icons/effects/landmarks_static.dmi' + icon_state = "spawn" /obj/effect/landmark/npc_spawn_point/Initialize(mapload) . = ..() @@ -50,7 +52,7 @@ /mob/living/carbon/human/npc/death() GLOB.alive_npc_list -= src - SShumannpcpool.npclost() + SShumannpcpool.try_repopulate() GLOB.move_manager.stop_looping(src) if (!last_attacker || (get_dist(src, last_attacker) >= 10) || key || hostile) @@ -60,7 +62,6 @@ var/mob/living/simple_animal/hostile/HS = last_attacker if(HS.my_creator) HS.my_creator.AdjustHumanity(-1, 0) - HS.my_creator.last_nonraid = world.time HS.my_creator.killed_count += 1 if(!HS.my_creator.warrant && !HS.my_creator.ignores_warrant) if(HS.my_creator.killed_count >= 5) @@ -73,7 +74,6 @@ else if (ishuman(last_attacker)) var/mob/living/carbon/human/HM = last_attacker HM.AdjustHumanity(-1, 0) - HM.last_nonraid = world.time HM.killed_count += 1 if(!HM.warrant && !HM.ignores_warrant) if(HM.killed_count >= 5) @@ -122,7 +122,7 @@ face_atom(T) step_to(src, T, 0) - if (!walktarget && old_movement) + if (!walktarget || old_movement) return if (observed_by_player()) return @@ -135,7 +135,7 @@ if(iswallturf(location)) return location for(var/atom/A in location) - // TODO: [Rebase] reimplement decor + // DARKPACK TODO - reimplement decor /* if(A.density && !istype(A, /obj/structure/lamppost)) return location @@ -240,7 +240,7 @@ return TRUE /mob/living/carbon/human/npc/proc/observed_by_player() - for (var/mob/observing_mob in viewers(7, src)) + for (var/mob/observing_mob in viewers(DEFAULT_SIGHT_DISTANCE, src)) if (!observing_mob.client) continue return TRUE @@ -263,15 +263,7 @@ return // Checks for fire, clearing the stored fire if none is in view - // TODO: [Rebase] reimplement fire - /* - var/seeing_fire - for (var/obj/effect/fire/seen_fire in view(7, src)) - afraid_of_fire = seen_fire - seeing_fire = TRUE - if (!seeing_fire) - afraid_of_fire = null - */ + afraid_of_fire = locate(/obj/effect/abstract/turf_fire) in view(DEFAULT_SIGHT_DISTANCE, src) // Combat behaviour if (danger_source) @@ -280,7 +272,7 @@ GLOB.move_manager.move_away(src, danger_source, 10, cached_multiplicative_slowdown) else // Criminals will attack anyone, others will only attack non-police - // TODO: [Rebase] reimplement IDs + // DARKPACK TODO - reimplement IDs /* var/obj/item/card/id/id_card = danger_source.get_idcard(FALSE) if (!istype(id_card, /obj/item/card/id/police) || is_criminal) @@ -306,18 +298,13 @@ end_combat() // Running away from fire behaviour - // TODO: [Rebase] reimplement fire - /* else if (afraid_of_fire) GLOB.move_manager.move_away(src, afraid_of_fire, 10, cached_multiplicative_slowdown) if (prob(25)) emote("scream") - */ // Walking around behaviour else if (walktarget && !staying) - if (prob(25)) - toggle_move_intent(src) GLOB.move_manager.move_to(src, walktarget, 0, cached_multiplicative_slowdown) if (!has_weapon || danger_source || !spawned_weapon) diff --git a/modular_darkpack/modules/npc/code/human/npc_types/bouncers/__bouncer.dm b/modular_darkpack/modules/npc/code/human/npc_types/bouncers/__bouncer.dm index 87b266cf4b37..ab7e28d2e9df 100644 --- a/modular_darkpack/modules/npc/code/human/npc_types/bouncers/__bouncer.dm +++ b/modular_darkpack/modules/npc/code/human/npc_types/bouncers/__bouncer.dm @@ -38,7 +38,7 @@ /mob/living/carbon/human/npc/bouncer/Initialize(mapload) .=..() - if(src.type == /mob/living/carbon/human/npc/bouncer) + if(mapload && src.type == /mob/living/carbon/human/npc/bouncer) CRASH("Bouncer created using default type, please use a child of this type in mapping.") AssignSocialRole(our_role) @@ -51,9 +51,16 @@ if(SSbouncer_barriers.vip_barrier_perms?[protected_zone_id]) linked_perm = SSbouncer_barriers.vip_barrier_perms[protected_zone_id] linked_perm.add_bouncer(src) - else if(SSbouncer_barriers.initialized) + else if(mapload && SSbouncer_barriers.initialized) CRASH("A Bouncer was created for vip_barrier_perms that were not loaded!") +/mob/living/carbon/human/npc/bouncer/Destroy() + if(linked_perm) + linked_perm.linked_bouncers -= src + linked_perm = null + + return ..() + /mob/living/carbon/human/npc/bouncer/on_knockedout_trait_gain(datum/source) ..() set_is_guarding_false() @@ -146,10 +153,10 @@ if(can_be_reasoned_with() && in_range(src, user)) var/list/interact_options = list( - "Persuade for Entry" = image(icon = 'icons/obj/dice.dmi', icon_state = "d10")) + "Persuade for Entry" = image(icon = 'icons/obj/toys/dice.dmi', icon_state = "d10")) var/obj/item/held_item = user.get_active_held_item() - if(held_item && istype(held_item,/obj/item/card/id/police)) + if(held_item && istype(held_item, /obj/item/card/police)) interact_options["Show Badge"] = image(icon = held_item.icon, icon_state = held_item.icon_state) var/picked_option = show_radial_menu(user, src, interact_options, radius = 38, require_near = TRUE) switch(picked_option) diff --git a/modular_darkpack/modules/npc/code/human/npc_types/bouncers/bouncer_endron.dm b/modular_darkpack/modules/npc/code/human/npc_types/bouncers/bouncer_endron.dm new file mode 100644 index 000000000000..672d0ce6bda1 --- /dev/null +++ b/modular_darkpack/modules/npc/code/human/npc_types/bouncers/bouncer_endron.dm @@ -0,0 +1,18 @@ +/mob/living/carbon/human/npc/bouncer/endron + our_role = /datum/socialrole/bouncer/endron + protected_zone_id = "endron" + +/mob/living/carbon/human/npc/bouncer/endron/endron_2 + our_role = /datum/socialrole/bouncer/endron/endron_2 + protected_zone_id = "endron_2" + +/mob/living/carbon/human/npc/bouncer/endron/endron_backdoor + protected_zone_id = "endron_backdoor" + +/mob/living/carbon/human/npc/bouncer/endron/endron_lab + our_role = /datum/socialrole/bouncer/endron/endron_lab + protected_zone_id = "endron_lab" + +/mob/living/carbon/human/npc/bouncer/endron/endron_lab_2 + our_role = /datum/socialrole/bouncer/endron/endron_lab_2 + protected_zone_id = "endron_lab_2" diff --git a/modular_darkpack/modules/npc/code/human/npc_types/endron/endron_npcs.dm b/modular_darkpack/modules/npc/code/human/npc_types/endron/endron_npcs.dm new file mode 100644 index 000000000000..6ab28b61cd3e --- /dev/null +++ b/modular_darkpack/modules/npc/code/human/npc_types/endron/endron_npcs.dm @@ -0,0 +1,31 @@ +/mob/living/carbon/human/npc/endronsecurity + staying = TRUE + max_stat = 4 + my_weapon_type = /obj/item/gun/ballistic/automatic/darkpack/mp5 + my_backup_weapon_type = /obj/item/melee/baton/vamp + +/mob/living/carbon/human/npc/endronsecurity/Initialize() + . = ..() + AssignSocialRole(/datum/socialrole/endronsecurity) + +/mob/living/carbon/human/npc/endronlabsecurity + staying = TRUE + + max_stat = 4 + my_weapon_type = /obj/item/gun/ballistic/automatic/darkpack/mp5 + my_backup_weapon_type = /obj/item/melee/baton/vamp + +/mob/living/carbon/human/npc/endronlabsecurity/Initialize() + . = ..() + AssignSocialRole(/datum/socialrole/endronlabsecurity) + +/mob/living/carbon/human/npc/endronexecsecurity + staying = TRUE + + max_stat = 4 + my_weapon_type = /obj/item/gun/ballistic/automatic/pistol/darkpack/deagle + my_backup_weapon_type = /obj/item/melee/baton/vamp + +/mob/living/carbon/human/npc/endronexecsecurity/Initialize() + . = ..() + AssignSocialRole(/datum/socialrole/endronexecsecurity) diff --git a/modular_darkpack/modules/npc/code/human/npc_types/police.dm b/modular_darkpack/modules/npc/code/human/npc_types/police.dm index 4fecde205789..f24983e024c1 100644 --- a/modular_darkpack/modules/npc/code/human/npc_types/police.dm +++ b/modular_darkpack/modules/npc/code/human/npc_types/police.dm @@ -24,3 +24,17 @@ continue Aggro(H, FALSE) + +/* // DARKPACK TODO: create a police npc that just stands there +/mob/living/carbon/human/npc/police/static + fights_anyway = TRUE + staying = TRUE + max_stat = 4 + my_backup_weapon_type = /obj/item/melee/classic_baton/vampire + +/mob/living/carbon/human/npc/police/Initialize() + . = ..() + if(prob(66)) + set_body_model(FAT_BODY_MODEL) + AssignSocialRole(/datum/socialrole/police) +*/ diff --git a/modular_darkpack/modules/npc/code/human/socialroles/__socialrole.dm b/modular_darkpack/modules/npc/code/human/socialroles/__socialrole.dm index eedbc3123412..be49354b0308 100644 --- a/modular_darkpack/modules/npc/code/human/socialroles/__socialrole.dm +++ b/modular_darkpack/modules/npc/code/human/socialroles/__socialrole.dm @@ -240,15 +240,12 @@ fully_replace_character_name(name, real_name) - storyteller_stat_holder.randomize_attributes(1, max_stat) - storyteller_stat_holder.randomize_abilities(0, max_stat) - maxHealth = round(initial(maxHealth)+(initial(maxHealth)/3)*(st_get_stat(STAT_STAMINA))) health = round(initial(health)+(initial(health)/3)*(st_get_stat(STAT_STAMINA))) last_health = health is_criminal = socialrole.is_criminal - if (check_holidays(CHRISTMAS)) + if (check_holidays(FESTIVE_SEASON)) if (!length(socialrole.suits)) socialrole.suits = list( /obj/item/clothing/suit/vampire/coat/winter, @@ -271,6 +268,7 @@ var/list/m_names = list() var/list/f_names = list() var/list/s_names = list() + var/random_name if(socialrole.male_names) m_names = socialrole.male_names else @@ -298,11 +296,13 @@ set_facial_hairstyle(pick(socialrole.male_facial)) else set_facial_hairstyle("Shaved") - real_name = "[pick(m_names)] [pick(s_names)]" + random_name = "[pick(m_names)] [pick(s_names)]" + fully_replace_character_name(newname = random_name) else set_hairstyle(pick(socialrole.female_hair)) set_facial_hairstyle("Shaved") - real_name = "[pick(f_names)] [pick(s_names)]" + random_name = "[pick(f_names)] [pick(s_names)]" + fully_replace_character_name(newname = random_name) set_eye_color(random_eye_color()) diff --git a/modular_darkpack/modules/npc/code/human/socialroles/bandit.dm b/modular_darkpack/modules/npc/code/human/socialroles/bandit.dm index 5b158a02bac5..c844a20283c6 100644 --- a/modular_darkpack/modules/npc/code/human/socialroles/bandit.dm +++ b/modular_darkpack/modules/npc/code/human/socialroles/bandit.dm @@ -84,7 +84,7 @@ /obj/item/clothing/head/vampire/beanie/black ) pockets = list( - /obj/item/stack/dollar/rand, + // /obj/item/stack/dollar/rand, /obj/item/vamp/keys/hack ) diff --git a/modular_darkpack/modules/npc/code/human/socialroles/endronsecurity.dm b/modular_darkpack/modules/npc/code/human/socialroles/endronsecurity.dm new file mode 100644 index 000000000000..03c239ba6371 --- /dev/null +++ b/modular_darkpack/modules/npc/code/human/socialroles/endronsecurity.dm @@ -0,0 +1,284 @@ +/datum/socialrole/endronlabsecurity + s_tones = list( + "albino", + "caucasian1", + "caucasian2", + "caucasian3" + ) + + min_age = 18 + max_age = 55 + male_names = null + surnames = null + + hair_colors = list( + "040404", //Black + "120b05", //Dark Brown + "342414", //Brown + "554433", //Light Brown + "695c3b", //Dark Blond + "ad924e", //Blond + "dac07f", //Light Blond + "802400", //Ginger + "a5380e", //Ginger alt + "ffeace", //Albino + "650b0b", //Punk Red + "14350e", //Punk Green + "080918" //Punk Blue + ) + male_hair = list( + "Balding Hair", + "Bedhead", + "Bedhead 2", + "Bedhead 3", + "Boddicker", + "Business Hair", + "Business Hair 2", + "Business Hair 3", + "Business Hair 4", + "Coffee House", + "Combover", + "Crewcut", + "Father", + "Flat Top", + "Gelled Back", + "Joestar", + "Keanu Hair", + "Oxton", + "Volaju" + ) + male_facial = list( + "Beard (Abraham Lincoln)", + "Beard (Chinstrap)", + "Beard (Full)", + "Beard (Cropped Fullbeard)", + "Beard (Hipster)", + "Beard (Neckbeard)", + "Beard (Three o Clock Shadow)", + "Beard (Five o Clock Shadow)", + "Beard (Seven o Clock Shadow)", + "Moustache (Hulk Hogan)", + "Moustache (Watson)", + "Sideburns (Elvis)", + "Sideburns", + "Shaved" + ) + + shoes = list(/obj/item/clothing/shoes/vampire/jackboots) + uniforms = list(/obj/item/clothing/under/vampire/pentex_janitor) + pockets = list(/obj/item/vamp/keys/npc, /obj/item/stack/dollar/rand) + gloves = list(/obj/item/clothing/gloves/vampire/latex) + suits = list(/obj/item/clothing/suit/vampire/vest) + glasses = list(/obj/item/clothing/glasses/vampire/sun) + hats = list(/obj/item/clothing/head/beret/black) + masks = list(/obj/item/clothing/mask/gas/explorer) + + neutral_phrases = list( + "No loitering.", + "I get paid to keep people like you out of here.", + "I could go for some wolf-meat right about now.", + "Like the uniform?", + "Hey, catch me later, I'll buy you a beer." + ) + random_phrases = list( + "It's been a real quiet night.", + "My brothers and father work for Endron, too." + ) + answer_phrases = list("I need some coffee.") + help_phrases = list( + "It's go time!", + "Stop right there!!", + "Drop your weapon!", + "Freeze!!", + "Not just a mall cop, you know!" + ) + +/datum/socialrole/endronexecsecurity + s_tones = list( + "albino", + "caucasian1", + "caucasian2", + "caucasian3" + ) + + min_age = 18 + max_age = 45 + male_names = null + surnames = null + + hair_colors = list( + "040404", //Black + "120b05", //Dark Brown + "342414", //Brown + "554433", //Light Brown + "695c3b", //Dark Blond + "ad924e", //Blond + "dac07f", //Light Blond + "802400", //Ginger + "a5380e", //Ginger alt + "ffeace", //Albino + "650b0b", //Punk Red + "14350e", //Punk Green + "080918" //Punk Blue + ) + male_hair = list( + "Balding Hair", + "Bedhead", + "Bedhead 2", + "Bedhead 3", + "Boddicker", + "Business Hair", + "Business Hair 2", + "Business Hair 3", + "Business Hair 4", + "Coffee House", + "Combover", + "Crewcut", + "Father", + "Flat Top", + "Gelled Back", + "Joestar", + "Keanu Hair", + "Oxton", + "Volaju" + ) + male_facial = list( + "Beard (Abraham Lincoln)", + "Beard (Chinstrap)", + "Beard (Full)", + "Beard (Cropped Fullbeard)", + "Beard (Hipster)", + "Beard (Neckbeard)", + "Beard (Three o Clock Shadow)", + "Beard (Five o Clock Shadow)", + "Beard (Seven o Clock Shadow)", + "Moustache (Hulk Hogan)", + "Moustache (Watson)", + "Sideburns (Elvis)", + "Sideburns", + "Shaved" + ) + + shoes = list(/obj/item/clothing/shoes/vampire/jackboots) + uniforms = list(/obj/item/clothing/under/vampire/pentex_suit) + pockets = list(/obj/item/vamp/keys/npc, /obj/item/stack/dollar/rand) + gloves = list(/obj/item/clothing/gloves/vampire/work) + suits = list(/obj/item/clothing/suit/vampire/vest) + glasses = list(/obj/item/clothing/glasses/night) + hats = list(/obj/item/clothing/head/vampire/pentex_beret) + masks = list(/obj/item/clothing/mask/gas/sechailer) + + neutral_phrases = list( + "No loitering.", + "I get paid to keep people like you out of here.", + "I could go for some wolf-meat right about now.", + "Like the uniform?", + "Hey, catch me later, I'll buy you a beer." + ) + random_phrases = list( + "It's been a real quiet night.", + "My brothers and father work for Endron, too." + ) + answer_phrases = list("I need some coffee.") + help_phrases = list( + "It's go time!", + "Stop right there!!", + "Drop your weapon!", + "Freeze!!", + "Not just a mall cop, you know!" + ) + +/datum/socialrole/endronsecurity + s_tones = list( + "albino", + "caucasian1", + "caucasian2", + "caucasian3" + ) + + min_age = 18 + max_age = 55 + male_names = null + surnames = null + + hair_colors = list( + "040404", //Black + "120b05", //Dark Brown + "342414", //Brown + "554433", //Light Brown + "695c3b", //Dark Blond + "ad924e", //Blond + "dac07f", //Light Blond + "802400", //Ginger + "a5380e", //Ginger alt + "ffeace", //Albino + "650b0b", //Punk Red + "14350e", //Punk Green + "080918" //Punk Blue + ) + male_hair = list( + "Balding Hair", + "Bedhead", + "Bedhead 2", + "Bedhead 3", + "Boddicker", + "Business Hair", + "Business Hair 2", + "Business Hair 3", + "Business Hair 4", + "Coffee House", + "Combover", + "Crewcut", + "Father", + "Flat Top", + "Gelled Back", + "Joestar", + "Keanu Hair", + "Oxton", + "Volaju" + ) + male_facial = list( + "Beard (Abraham Lincoln)", + "Beard (Chinstrap)", + "Beard (Full)", + "Beard (Cropped Fullbeard)", + "Beard (Hipster)", + "Beard (Neckbeard)", + "Beard (Three o Clock Shadow)", + "Beard (Five o Clock Shadow)", + "Beard (Seven o Clock Shadow)", + "Moustache (Hulk Hogan)", + "Moustache (Watson)", + "Sideburns (Elvis)", + "Sideburns", + "Shaved" + ) + + shoes = list(/obj/item/clothing/shoes/vampire/jackboots) + uniforms = list(/obj/item/clothing/under/vampire/pentex_turtleneck) + pockets = list(/obj/item/vamp/keys/npc, /obj/item/stack/dollar/rand) + gloves = list(/obj/item/clothing/gloves/vampire/work) + suits = list(/obj/item/clothing/suit/vampire/vest) + glasses = list(/obj/item/clothing/glasses/vampire/sun) + hats = list(/obj/item/clothing/head/beret/black) + masks = list(/obj/item/clothing/mask/vampire/balaclava) + + neutral_phrases = list( + "No loitering.", + "I get paid to keep people like you out of here.", + "I could go for some wolf-meat right about now.", + "Like the uniform?", + "Hey, catch me later, I'll buy you a beer." + ) + random_phrases = list( + "It's been a real quiet night.", + "My brothers and father work for Endron, too." + ) + answer_phrases = list("I need some coffee.") + help_phrases = list( + "It's go time!", + "Stop right there!!", + "Drop your weapon!", + "Freeze!!", + "Not just a mall cop, you know!" + ) diff --git a/modular_darkpack/modules/npc/code/human/socialroles/guard.dm b/modular_darkpack/modules/npc/code/human/socialroles/guard.dm index a99ae2f99521..6e763b549244 100644 --- a/modular_darkpack/modules/npc/code/human/socialroles/guard.dm +++ b/modular_darkpack/modules/npc/code/human/socialroles/guard.dm @@ -68,7 +68,7 @@ shoes = list(/obj/item/clothing/shoes/vampire) uniforms = list(/obj/item/clothing/under/vampire/guard) - pockets = list(/obj/item/vamp/keys/npc, /obj/item/stack/dollar/rand) + // pockets = list(/obj/item/vamp/keys/npc, /obj/item/stack/dollar/rand) neutral_phrases = list( "No loitering.", diff --git a/modular_darkpack/modules/npc/code/human/socialroles/police.dm b/modular_darkpack/modules/npc/code/human/socialroles/police.dm index d820d483ccf9..090afed6fb32 100644 --- a/modular_darkpack/modules/npc/code/human/socialroles/police.dm +++ b/modular_darkpack/modules/npc/code/human/socialroles/police.dm @@ -93,7 +93,7 @@ uniforms = list(/obj/item/clothing/under/vampire/police) hats = list(/obj/item/clothing/head/vampire/police) suits = list(/obj/item/clothing/suit/vampire/vest/police) - pockets = list(/obj/item/stack/dollar/rand) + // pockets = list(/obj/item/stack/dollar/rand) male_phrases = list( "I see you.", diff --git a/modular_darkpack/modules/npc/code/human/socialroles/richfemale.dm b/modular_darkpack/modules/npc/code/human/socialroles/richfemale.dm index 60c0ca59c9c7..21898bc459da 100644 --- a/modular_darkpack/modules/npc/code/human/socialroles/richfemale.dm +++ b/modular_darkpack/modules/npc/code/human/socialroles/richfemale.dm @@ -58,8 +58,8 @@ uniforms = list(/obj/item/clothing/under/vampire/business) pockets = list( /obj/item/vamp/keys/npc, - /obj/item/stack/dollar/fifty, - /obj/item/stack/dollar/hundred + // /obj/item/stack/dollar/fifty, + // /obj/item/stack/dollar/hundred ) female_phrases = list( diff --git a/modular_darkpack/modules/npc/code/human/socialroles/richmale.dm b/modular_darkpack/modules/npc/code/human/socialroles/richmale.dm index cc23043125ae..e67f5e38a3f0 100644 --- a/modular_darkpack/modules/npc/code/human/socialroles/richmale.dm +++ b/modular_darkpack/modules/npc/code/human/socialroles/richmale.dm @@ -58,8 +58,8 @@ inhand_items = list(/obj/item/storage/briefcase) pockets = list( /obj/item/vamp/keys/npc, - /obj/item/stack/dollar/fifty, - /obj/item/stack/dollar/hundred + // /obj/item/stack/dollar/fifty, + // /obj/item/stack/dollar/hundred ) male_phrases = list( diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/__shop.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/__shop.dm index 47657bbbd38d..2d22c86c64e1 100644 --- a/modular_darkpack/modules/npc/code/human/socialroles/shop/__shop.dm +++ b/modular_darkpack/modules/npc/code/human/socialroles/shop/__shop.dm @@ -81,7 +81,7 @@ uniforms = list(/obj/item/clothing/under/vampire/mechanic) pockets = list( /obj/item/vamp/keys/npc, - /obj/item/stack/dollar/rand + // /obj/item/stack/dollar/rand ) male_phrases = list( diff --git a/modular_darkpack/modules/npc/code/human/socialroles/shop/illegal.dm b/modular_darkpack/modules/npc/code/human/socialroles/shop/illegal.dm index 13c1f34a26de..a7657a396225 100644 --- a/modular_darkpack/modules/npc/code/human/socialroles/shop/illegal.dm +++ b/modular_darkpack/modules/npc/code/human/socialroles/shop/illegal.dm @@ -2,7 +2,7 @@ masks = list(/obj/item/clothing/mask/vampire/balaclava) shoes = list(/obj/item/clothing/shoes/vampire/sneakers) uniforms = list(/obj/item/clothing/under/vampire/emo) - pockets = list(/obj/item/stack/dollar/rand) + // pockets = list(/obj/item/stack/dollar/rand) male_phrases = list( "Pss... wanna try some weed?", diff --git a/modular_darkpack/modules/npc/code/human/socialroles/usualfemale.dm b/modular_darkpack/modules/npc/code/human/socialroles/usualfemale.dm index c79396e0e6a8..33a67b316759 100644 --- a/modular_darkpack/modules/npc/code/human/socialroles/usualfemale.dm +++ b/modular_darkpack/modules/npc/code/human/socialroles/usualfemale.dm @@ -94,7 +94,7 @@ ) pockets = list( /obj/item/vamp/keys/npc, - /obj/item/stack/dollar/rand + // /obj/item/stack/dollar/rand ) female_phrases = list( diff --git a/modular_darkpack/modules/npc/code/human/socialroles/usualmale.dm b/modular_darkpack/modules/npc/code/human/socialroles/usualmale.dm index d979ccca7d76..fdcd21ba712b 100644 --- a/modular_darkpack/modules/npc/code/human/socialroles/usualmale.dm +++ b/modular_darkpack/modules/npc/code/human/socialroles/usualmale.dm @@ -87,7 +87,7 @@ ) pockets = list( /obj/item/vamp/keys/npc, - /obj/item/stack/dollar/rand + // /obj/item/stack/dollar/rand ) male_phrases = list( diff --git a/modular_darkpack/modules/npc/code/nonhuman/beastmaster/bat.dm b/modular_darkpack/modules/npc/code/nonhuman/beastmaster/bat.dm deleted file mode 100644 index df7c905ce518..000000000000 --- a/modular_darkpack/modules/npc/code/nonhuman/beastmaster/bat.dm +++ /dev/null @@ -1,16 +0,0 @@ -/mob/living/basic/bat/vampire - name = "bat" - desc = "It's a bat." - - basic_mob_flags = DEL_ON_DEATH - - icon = 'modular_darkpack/modules/npc/icons/bat.dmi' - icon_state = "bat" - icon_living = "bat" - icon_dead = "bat_dead" - icon_gib = "bat_dead" - attack_sound = 'modular_darkpack/modules/npc/sound/rat.ogg' - - maxHealth = 10 - health = 10 - speed = -0.8 diff --git a/modular_darkpack/modules/npc/code/nonhuman/beastmaster/blood_guard.dm b/modular_darkpack/modules/npc/code/nonhuman/beastmaster/blood_guard.dm index e74ca925aa0a..7fed6a849a48 100644 --- a/modular_darkpack/modules/npc/code/nonhuman/beastmaster/blood_guard.dm +++ b/modular_darkpack/modules/npc/code/nonhuman/beastmaster/blood_guard.dm @@ -19,23 +19,8 @@ maxbloodpool = 1 faction = list(VAMPIRE_CLAN_TREMERE) - ai_controller = /datum/ai_controller/basic_controller/blood_guard + ai_controller = /datum/ai_controller/basic_controller/beastmaster_summon /mob/living/basic/blood_guard/Initialize(mapload) . = ..() AddElement(/datum/element/ai_retaliate) - -///nothing unique, just retaliation. -/datum/ai_controller/basic_controller/blood_guard - blackboard = list( - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, - ) - - ai_traits = PASSIVE_AI_FLAGS - ai_movement = /datum/ai_movement/basic_avoidance - idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking - - planning_subtrees = list( - /datum/ai_planning_subtree/target_retaliate, - /datum/ai_planning_subtree/basic_melee_attack_subtree, - ) diff --git a/modular_darkpack/modules/npc/code/nonhuman/beastmaster/necromancy_zombies.dm b/modular_darkpack/modules/npc/code/nonhuman/beastmaster/necromancy_zombies.dm new file mode 100644 index 000000000000..636e395339f9 --- /dev/null +++ b/modular_darkpack/modules/npc/code/nonhuman/beastmaster/necromancy_zombies.dm @@ -0,0 +1,175 @@ +/mob/living/basic/beastmaster/giovanni_zombie + name = "Shambling Corpse" + desc = "When there is no more room in hell, the dead will walk on Earth." + icon = 'modular_darkpack/modules/npc/icons/necromancy_zombies.dmi' + icon_state = "zombie" + icon_living = "zombie" + icon_dead = "zombie_dead" + mob_biotypes = MOB_UNDEAD + maxHealth = 35 + health = 35 + speed = 1 + melee_damage_lower = 12 + melee_damage_upper = 12 + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/mobs/non-humanoids/dog/growl1.ogg' + status_flags = CANPUSH + basic_mob_flags = DEL_ON_DEATH + combat_mode = TRUE + faction = list(VAMPIRE_CLAN_GIOVANNI) + ai_controller = /datum/ai_controller/basic_controller/beastmaster_summon + +/mob/living/basic/beastmaster/giovanni_zombie/Initialize(mapload) + . = ..() + AddElement(/datum/element/ai_retaliate) + var/datum/component/obeys_commands/old = GetComponent(/datum/component/obeys_commands) + if(old) + qdel(old) + +/mob/living/basic/beastmaster/giovanni_zombie/level1 // Low health, low damage distraction unit + name = "drone" + desc = "A mindless, tormented wraith." + icon = 'modular_darkpack/modules/npc/icons/necromancy_zombies.dmi' + icon_state = "ghost_animated" + icon_living = "ghost_animated" + mob_biotypes = MOB_UNDEAD + response_help_continuous = "passes through" + response_help_simple = "pass through" + speed = 2 + maxHealth = 60 + health = 60 + melee_damage_lower = 15 + melee_damage_upper = 15 + attack_verb_continuous = "grips" + attack_verb_simple = "grip" + attack_sound = 'sound/effects/hallucinations/growl1.ogg' + death_message = "wails, disintegrating into a pile of ectoplasm!" + light_system = OVERLAY_LIGHT + light_range = 1 + light_power = 2 + speak_emote = list("weeps") + +/mob/living/basic/beastmaster/giovanni_zombie/level1/Initialize(mapload) + . = ..() + AddElement(/datum/element/death_drops, /obj/item/ectoplasm) + +/mob/living/basic/beastmaster/giovanni_zombie/level2 // Fragile, low-damage harass, rat equivalent + name = "parassita" + desc = "A skittering something of a myriad digits and small, sharp teeth." + icon = 'modular_darkpack/modules/npc/icons/necromancy_zombies.dmi' + icon_state = "ratzombie" + icon_living = "ratzombie" + response_help_continuous = "shoos away" + response_help_simple = "shoo away" + response_disarm_continuous = "knocks aside" + response_disarm_simple = "knock aside" + response_harm_continuous = "stamps" + response_harm_simple = "stamp" + can_be_held = TRUE + density = FALSE + speed = 0 + maxHealth = 20 + health = 20 + melee_damage_lower = 8 + melee_damage_upper = 14 + attack_verb_continuous = "nibbles" + attack_verb_simple = "nibble" + attack_sound = 'modular_darkpack/modules/npc/sound/rat.ogg' + speak_emote = list("squeaks") + death_message = "rapidly shrivels up!" + +/mob/living/basic/beastmaster/giovanni_zombie/level2/Initialize(mapload) + . = ..() + pixel_w = rand(-8, 8) + pixel_z = rand(-8, 8) + +/mob/living/basic/beastmaster/giovanni_zombie/level3 // Middling dog-level threat + name = "compagno" + desc = "Four legs and a menacing set of jaws is all this shambling thing shares with a canine." + icon = 'modular_darkpack/modules/npc/icons/necromancy_zombies.dmi' + icon_state = "dogzombie" + icon_living = "dogzombie" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "drags aside" + response_disarm_simple = "drag aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + speed = 0 + maxHealth = 80 + health = 80 + melee_damage_lower = 20 + melee_damage_upper = 30 + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'modular_darkpack/modules/deprecated/sounds/dog.ogg' + speak_emote = list("borks") + death_message = "falls apart in a pile of fur and bones!" + +/mob/living/basic/beastmaster/giovanni_zombie/level4 // Tanky, but slowed bruiser + name = "verme" + desc = "Husk of a man, puppeteered by some sadistic force." + icon = 'modular_darkpack/modules/npc/icons/necromancy_zombies.dmi' + icon_state = "manzombie" + icon_living = "manzombie" + response_help_continuous = "shakes hands with" + response_help_simple = "shake hands with" + response_disarm_continuous = "pushes away" + response_disarm_simple = "push away" + response_harm_continuous = "punches" + response_harm_simple = "punch" + speed = 1.5 + maxHealth = 120 + health = 120 + melee_damage_lower = 25 + melee_damage_upper = 35 + attack_verb_continuous = "batters" + attack_verb_simple = "batter" + attack_sound = 'modular_darkpack/modules/deprecated/sounds/zombuzi.ogg' + speak_emote = list("rasps") + death_message = "decays away into fine paste!" + +/mob/living/basic/beastmaster/giovanni_zombie/level5 // Chonkmaster, only really Tzimisce mobs can provide material + name = "patrigno" + desc = "A nauseating mountain of putrid flesh. On its face - a jolly smirk immortalized with rigor mortis." + icon = 'modular_darkpack/modules/npc/icons/necromancy_zombies.dmi' + icon_state = "fatzombie" + icon_living = "fatzombie" + response_help_continuous = "pats down" + response_help_simple = "pat down" + response_disarm_continuous = "tries to push" + response_disarm_simple = "try to push" + response_harm_continuous = "slaps" + response_harm_simple = "slap" + speed = 3 + maxHealth = 300 + health = 300 + melee_damage_lower = 40 + melee_damage_upper = 50 + attack_verb_continuous = "slams into" + attack_verb_simple = "slam into" + attack_sound = 'modular_darkpack/modules/powers/sounds/heavypunch.ogg' + speak_emote = list("gurgles") + death_message = "collapses down into a rancid puddle!" + +/* +/mob/living/basic/beastmaster/giovanni_zombie/level1/Initialize(mapload) + . = ..() + give_player() + +/mob/living/basic/beastmaster/giovanni_zombie/proc/give_player() + set waitfor = FALSE + var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as summoned ghost?", null, null, null, 50, src) + for(var/mob/dead/observer/G in GLOB.player_list) + if(G.key) + to_chat(G, span_ghostalert("Someone is summoning a ghost!")) + if(LAZYLEN(candidates)) + var/mob/dead/observer/C = pick(candidates) + name = C.name + key = C.key + visible_message(span_danger("[src] rises with fresh soul!")) + return TRUE + visible_message(span_warning("[src] remains unsouled...")) + return FALSE +*/ diff --git a/modular_darkpack/modules/npc/code/nonhuman/beastmaster/shadow_guard.dm b/modular_darkpack/modules/npc/code/nonhuman/beastmaster/shadow_guard.dm index 129e2fe1f1ed..8de13c532654 100644 --- a/modular_darkpack/modules/npc/code/nonhuman/beastmaster/shadow_guard.dm +++ b/modular_darkpack/modules/npc/code/nonhuman/beastmaster/shadow_guard.dm @@ -1,5 +1,5 @@ /mob/living/basic/shadow_guard - name = "shadow abomination" + name = "heart of silence" desc = "A shadow given life, creature of fathomless..." icon = 'modular_darkpack/modules/npc/icons/shadow_guard.dmi' icon_state = "shadow2" @@ -8,8 +8,8 @@ basic_mob_flags = DEL_ON_DEATH speed = 0 - maxHealth = 200 - health = 200 + maxHealth = 150 + health = 150 obj_damage = 50 melee_damage_lower = 20 @@ -22,23 +22,9 @@ bloodpool = 1 maxbloodpool = 1 - ai_controller = /datum/ai_controller/basic_controller/shadow_guard + ai_controller = /datum/ai_controller/basic_controller/beastmaster_summon /mob/living/basic/shadow_guard/Initialize(mapload) . = ..() AddElement(/datum/element/ai_retaliate) -///nothing unique, just retaliation. -/datum/ai_controller/basic_controller/shadow_guard - blackboard = list( - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, - ) - - ai_traits = PASSIVE_AI_FLAGS - ai_movement = /datum/ai_movement/basic_avoidance - idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking - - planning_subtrees = list( - /datum/ai_planning_subtree/target_retaliate, - /datum/ai_planning_subtree/basic_melee_attack_subtree, - ) diff --git a/modular_darkpack/modules/npc/code/nonhuman/friendly/bird.dm b/modular_darkpack/modules/npc/code/nonhuman/friendly/bird.dm new file mode 100644 index 000000000000..6fc446e9eb8e --- /dev/null +++ b/modular_darkpack/modules/npc/code/nonhuman/friendly/bird.dm @@ -0,0 +1,119 @@ +/mob/living/basic/corvid + name = "corvid" + desc = "Caw." + abstract_type = /mob/living/basic/corvid + mob_biotypes = MOB_ORGANIC|MOB_BEAST + icon_state = "black" + icon_living = "black" + icon_dead = "black" + icon = 'modular_darkpack/modules/npc/icons/corvid.dmi' + density = FALSE + butcher_results = list(/obj/item/food/meat/slab/chicken = 1) + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "pecks" + response_harm_simple = "peck" + attack_verb_continuous = "pecks" + attack_verb_simple = "peck" + friendly_verb_continuous = "headbutts" + friendly_verb_simple = "headbutt" + verb_say = "caws" + verb_exclaim = "squawks" + verb_yell = "shrieks" + speak_emote = list("caws") + health = 20 + maxHealth = 20 + pass_flags = PASSTABLE | PASSMOB + mob_size = MOB_SIZE_SMALL + mob_biotypes = MOB_ORGANIC|MOB_BEAST + gold_core_spawnable = FRIENDLY_SPAWN + basic_mob_flags = FLIP_ON_DEATH + + ai_controller = /datum/ai_controller/basic_controller/corvid + + var/sprite_color = "black" + var/sprite_eye_color = "#FFFFFF" + +/mob/living/basic/corvid/Initialize(mapload) + . = ..() + add_verb(src, /mob/living/proc/toggle_resting) + var/datum/action/innate/togglecorvidflight/toggleflight = new() + toggleflight.Grant(src) + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/pet_bonus, "caw") + AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) + +/mob/living/basic/corvid/update_icon_state() + . = ..() + if(stat == DEAD) + return + if(HAS_TRAIT(src, TRAIT_MOVE_FLYING)) + icon_state = "[sprite_color]_flying" + else if(resting) + icon_state = "[sprite_color]_rest" + else + icon_state = "[sprite_color]" + +/mob/living/basic/corvid/update_overlays() + . = ..() + + var/mutable_appearance/eyes_overlay = mutable_appearance(icon, "eyes[HAS_TRAIT(src, TRAIT_MOVE_FLYING) ? "_flying" : ""]") + SET_PLANE(eyes_overlay, ABOVE_LIGHTING_PLANE, src) + eyes_overlay.color = sprite_eye_color + // eyes_overlay.layer = ABOVE_LIGHTING_LAYER + . += eyes_overlay + +/datum/action/innate/togglecorvidflight // this action handles corvid forms toggle their flight, and swaps their sprite to be of the relevant type, I'm making it a gift because it's also what Hispo is under + name = "Toggle Flight" + desc = "Unfurl or withdraw your wings, toggling your ability to fly" + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_IMMOBILE + button_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "flight" + +/datum/action/innate/togglecorvidflight/Trigger(mob/clicker, trigger_flags) + var/mob/living/basic/corvid/corvid = owner + if(!istype(corvid)) + return + // Consider giving them instant do after for moving up and down z levels but require time to get into the air + // if(!do_after(src, 0.5 SECONDS, timed_action_flags = IGNORE_USER_LOC_CHANGE)) + // return + if (!(HAS_TRAIT(corvid, TRAIT_MOVE_FLYING))) + to_chat(corvid, span_notice("You beat your wings and begin to hover gently above the ground...")) + corvid.set_resting(FALSE, TRUE) + // sadly, "is flying animal" does not give us flying traits when life() is called, only during VV or upon Init. We're doing this the hard way. + // the corax sprites already animate up-and-down bobbing, no need to float + corvid.add_traits(list(TRAIT_MOVE_FLYING, TRAIT_NO_FLOATING_ANIM), ACTION_TRAIT) + // we set this while we wait for the icons to update, otherwise there is latency + else + to_chat(corvid, span_notice("You settle gently back onto the ground...")) + corvid.remove_traits(list(TRAIT_MOVE_FLYING, TRAIT_NO_FLOATING_ANIM), ACTION_TRAIT) + + corvid.update_icon(UPDATE_ICON) + +/datum/emote/corvid + mob_type_allowed_typecache = /mob/living/basic/corvid + mob_type_blacklist_typecache = list() + +/datum/emote/corvid/caw + key = "caw" + key_third_person = "caws" + message = "caws!" + emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE + vary = TRUE + sound = 'modular_darkpack/modules/npc/sound/caw.ogg' + +/mob/living/basic/corvid/crow + name = "crow" + desc = "Unlike a raven, it has a fan shaped tail." + +/mob/living/basic/corvid/raven + name = "raven" + desc = "Unlike a crow, it has a wedge shaped tail." + verb_say = "gronks" + speak_emote = list("gronks") + +/mob/living/basic/corvid/raven/Initialize(mapload) + . = ..() + update_transform(1.2) diff --git a/modular_darkpack/modules/npc/code/nonhuman/friendly/bird_ai.dm b/modular_darkpack/modules/npc/code/nonhuman/friendly/bird_ai.dm new file mode 100644 index 000000000000..c2858c2c4a87 --- /dev/null +++ b/modular_darkpack/modules/npc/code/nonhuman/friendly/bird_ai.dm @@ -0,0 +1,38 @@ +/datum/ai_controller/basic_controller/corvid + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_traits = PASSIVE_AI_FLAGS + 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/random_speech/corvid, + /datum/ai_planning_subtree/find_and_hunt_target/find_shiney, + ) + +/datum/ai_planning_subtree/random_speech/corvid + speech_chance = 5 + speak = list("Caw!") + sound = list('modular_darkpack/modules/npc/sound/caw.ogg') + emote_hear = list("Caws.") + +/datum/ai_planning_subtree/find_and_hunt_target/find_shiney + target_key = BB_LOW_PRIORITY_HUNTING_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/find_shiney + finding_behavior = /datum/ai_behavior/find_hunt_target/find_shiney + hunt_targets = list(/obj/item/ammo_casing, /obj/item/watch, /obj/item/vamp/keys, /obj/item/vtm_artifact, /obj/item/knife) + hunt_range = 10 + +/datum/ai_behavior/find_hunt_target/find_shiney + +/datum/ai_behavior/find_hunt_target/find_shiney/valid_dinner(mob/living/source, obj/item/shiney, radius) + return can_see(source, shiney, radius) + +/datum/ai_behavior/hunt_target/find_shiney + +/datum/ai_behavior/hunt_target/find_shiney/target_caught(mob/living/hunter, obj/item/shiney) + hunter.start_pulling(shiney) diff --git a/modular_darkpack/modules/mobs/pets/cat.dm b/modular_darkpack/modules/npc/code/nonhuman/friendly/cat.dm similarity index 100% rename from modular_darkpack/modules/mobs/pets/cat.dm rename to modular_darkpack/modules/npc/code/nonhuman/friendly/cat.dm diff --git a/modular_darkpack/modules/npc/code/nonhuman/friendly/dog.dm b/modular_darkpack/modules/npc/code/nonhuman/friendly/dog.dm new file mode 100644 index 000000000000..2edddd5b0560 --- /dev/null +++ b/modular_darkpack/modules/npc/code/nonhuman/friendly/dog.dm @@ -0,0 +1,51 @@ +/mob/living/basic/pet/dog/darkpack + name = "\improper dog" + real_name = "dog" + icon_state = "dog1" + desc = "That's an ouppy." + base_icon_state = "dog" + icon = 'modular_darkpack/master_files/icons/mobs/simple/pets.dmi' + var/random_dog_color = TRUE + var/color_id = 1 + mobility_flags = MOBILITY_FLAGS_REST_CAPABLE_DEFAULT + +/mob/living/basic/pet/dog/darkpack/Initialize(mapload) + . = ..() + add_verb(src, /mob/living/proc/toggle_resting) + if(random_dog_color) + color_id = rand(1, 6) + icon_state = "[base_icon_state][color_id]" + icon_living = "[base_icon_state][color_id]" + icon_dead = "[base_icon_state][color_id]_dead" + +/mob/living/basic/pet/dog/darkpack/update_icon_state() + . = ..() + if(stat != DEAD) + if(resting) + icon_state = "[icon_living]_rest" + else + icon_state = "[icon_living]" + +/mob/living/basic/pet/dog/darkpack/ginger + color_id = 1 + random_dog_color = FALSE + +/mob/living/basic/pet/dog/darkpack/white + color_id = 2 + random_dog_color = FALSE + +/mob/living/basic/pet/dog/darkpack/black + color_id = 3 + random_dog_color = FALSE + +/mob/living/basic/pet/dog/darkpack/gray + color_id = 4 + random_dog_color = FALSE + +/mob/living/basic/pet/dog/darkpack/red + color_id = 5 + random_dog_color = FALSE + +/mob/living/basic/pet/dog/darkpack/gray + color_id = 6 + random_dog_color = FALSE diff --git a/modular_darkpack/modules/npc/code/nonhuman/friendly/spawners.dm b/modular_darkpack/modules/npc/code/nonhuman/friendly/spawners.dm new file mode 100644 index 000000000000..b5d918bf4141 --- /dev/null +++ b/modular_darkpack/modules/npc/code/nonhuman/friendly/spawners.dm @@ -0,0 +1,38 @@ +/obj/effect/spawner/random/trash/rat + name = "sewer rats" + icon = 'modular_darkpack/modules/npc/icons/rat.dmi' + icon_state = "random" + spawn_loot_chance = 50 + spawn_loot_count = null + loot = list(/mob/living/basic/mouse/vampire = 1) + +/obj/effect/spawner/random/trash/rat/Initialize(mapload) + if(isnull(spawn_loot_count)) + spawn_loot_count = rand(1, 3) + + if(HAS_TRAIT(SSstation, STATION_TRAIT_INFESTATION)) + spawn_loot_count = FLOOR(spawn_loot_count * 1.5, 1) + spawn_loot_chance = FLOOR(spawn_loot_chance * 1.5, 1) + + else if(HAS_TRAIT(SSstation, STATION_TRAIT_PEST_CONTROL)) + spawn_loot_count = FLOOR(spawn_loot_count * 0.5, 1) + spawn_loot_chance = FLOOR(spawn_loot_chance * 0.5, 1) + . = ..() + +/obj/effect/spawner/random/stray_animal + name = "stray animal" + icon = 'modular_darkpack/master_files/icons/mobs/simple/pets.dmi' + icon_state = "random" + spawn_loot_chance = 50 + loot = list( + /mob/living/basic/pet/cat/darkpack = 9, + /mob/living/basic/pet/dog/darkpack = 1, + /mob/living/basic/corvid/crow = 1, + /mob/living/basic/corvid/raven = 1, + /mob/living/basic/mouse/vampire = 1 + ) + +/obj/effect/spawner/random/stray_animal/Initialize(mapload) + if(HAS_TRAIT(SSstation, STATION_TRAIT_STRAY_MIGRATION)) + spawn_loot_chance = FLOOR(spawn_loot_chance * 2, 1) + . = ..() diff --git a/modular_darkpack/modules/npc/code/nonhuman/hostile/abyss_tentacle.dm b/modular_darkpack/modules/npc/code/nonhuman/hostile/abyss_tentacle.dm new file mode 100644 index 000000000000..9a2f9d647770 --- /dev/null +++ b/modular_darkpack/modules/npc/code/nonhuman/hostile/abyss_tentacle.dm @@ -0,0 +1,225 @@ +// Global list to track mobs grabbed by any tentacle +var/global/list/global_tentacle_grabs = list() + +/mob/living/basic/abyss_tentacle + name = "abyssal tentacle" + desc = "A shadowy tentacle from the abyss that seeks to grab and crush its prey." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "goliath_tentacle_wiggle" + icon_living = "goliath_tentacle_wiggle" + icon_dead = "goliath_tentacle_retract" + color = rgb(0,0,0) + layer = BELOW_MOB_LAYER + density = FALSE + maxHealth = 120 + health = 120 + see_in_dark = 10 + + melee_damage_lower = 10 + melee_damage_upper = 10 + attack_verb_continuous = "crushes" + attack_verb_simple = "crush" + attack_sound = 'sound/items/weapons/punch1.ogg' + speak_emote = list("writhes") + basic_mob_flags = DEL_ON_DEATH + mobility_flags = NONE + + + environment_smash = ENVIRONMENT_SMASH_NONE + + var/mob/living/carbon/human/owner + var/mob/living/grabbed_mob = null + var/list/recently_released = list() + var/aggro_mode = "Aggressive" + COOLDOWN_DECLARE(grab_cooldown) + COOLDOWN_DECLARE(damage_cooldown) + ai_controller = /datum/ai_controller/basic_controller/abyss_tentacle + +/datum/ai_controller/basic_controller/abyss_tentacle + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + ai_movement = /datum/ai_movement/complete_stop + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/tentacle_grab_and_crush, + ) + +/datum/ai_planning_subtree/tentacle_grab_and_crush + +/datum/ai_planning_subtree/tentacle_grab_and_crush/SelectBehaviors(datum/ai_controller/controller, delta_time) + var/mob/living/basic/abyss_tentacle/tentacle = controller.pawn + if(!istype(tentacle)) + return + + if(tentacle.aggro_mode == "Passive") + if(tentacle.grabbed_mob) + tentacle.release_grabbed_mob() + return + + if(tentacle.grabbed_mob) + if(tentacle.aggro_mode == "Aggressive") + controller.queue_behavior(/datum/ai_behavior/tentacle_crush_victim) + return SUBTREE_RETURN_FINISH_PLANNING + + var/mob/living/target = find_valid_grab_target(tentacle) + if(target) + controller.queue_behavior(/datum/ai_behavior/tentacle_grab_target, target) + return SUBTREE_RETURN_FINISH_PLANNING + + return + + +/datum/ai_planning_subtree/tentacle_grab_and_crush/proc/find_valid_grab_target(mob/living/basic/abyss_tentacle/tentacle) + for(var/mob/living/potential_target in oview(2, tentacle)) + //dont attack our owner, dead things, other tentacles, things being grabbed by tentacles, or things recently released + if(potential_target == tentacle.owner) + continue + if(potential_target.stat == DEAD) + continue + if(istype(potential_target, /mob/living/basic/abyss_tentacle)) + continue + if(potential_target in global.global_tentacle_grabs) + continue + if(potential_target in tentacle.recently_released) + continue + + return potential_target + return null + +/datum/ai_behavior/tentacle_grab_target + action_cooldown = 2 SECONDS + +/datum/ai_behavior/tentacle_grab_target/setup(datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/target = target_key + if(!istype(target)) + return FALSE + return TRUE + +/datum/ai_behavior/tentacle_grab_target/perform(seconds_per_tick, datum/ai_controller/controller, mob/living/target) + . = ..() + var/mob/living/basic/abyss_tentacle/tentacle = controller.pawn + + if(!istype(tentacle)) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + + tentacle.grab_mob(target) + + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED + +/datum/ai_behavior/tentacle_crush_victim + action_cooldown = 5 SECONDS + +/datum/ai_behavior/tentacle_crush_victim/perform(seconds_per_tick, datum/ai_controller/controller) + . = ..() + var/mob/living/basic/abyss_tentacle/tentacle = controller.pawn + + if(!istype(tentacle) || !tentacle.grabbed_mob) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + + tentacle.grabbed_mob.apply_damage(40, BRUTE) + to_chat(tentacle.grabbed_mob, span_danger("The tentacle tightens its grip, crushing you!")) + playsound(tentacle, 'sound/mobs/non-humanoids/venus_trap/venus_trap_hurt.ogg', 50, FALSE) + + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED + +/mob/living/basic/abyss_tentacle/Initialize(mapload, mob/living/summoner) + . = ..() + if(summoner) + owner = summoner + if(owner?.tentacle_aggro_mode) + aggro_mode = owner.tentacle_aggro_mode + +/mob/living/basic/abyss_tentacle/Destroy() + if(owner) + var/datum/splat/vampire/vampire = does_use_disciplines(owner) + var/datum/discipline_power/obtenebration/arms_of_the_abyss/power = vampire.get_discipline_power(/datum/discipline_power/obtenebration/arms_of_the_abyss) + power.active_tentacles -= src + + . = ..() + +/mob/living/basic/abyss_tentacle/proc/grab_mob(mob/living/target) + // More checks + if(target == owner || istype(target, /mob/living/basic/abyss_tentacle)) + return + if(target in global.global_tentacle_grabs) + return + if(grabbed_mob) + return + if(target.client) + to_chat(target, span_userdanger("A shadowy tentacle grabs you!")) + visible_message(span_danger("[src] grabs hold of [target]!")) + + playsound(/mob/living/basic/abyss_tentacle, 'sound/misc/moist_impact.ogg', 50, FALSE) + target.Stun(5) + target.forceMove(get_turf(src)) + target.set_tentacle_grab(src) + + if(aggro_mode == "Control") + target.mobility_flags &= ~(MOBILITY_STAND | MOBILITY_MOVE) + target.set_resting(TRUE, TRUE, TRUE) + to_chat(target, span_userdanger("The tentacle forces you to the ground!")) + + grabbed_mob = target + global.global_tentacle_grabs += target + + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_grabbed_mob_move)) + +/mob/living/basic/abyss_tentacle/proc/release_mob(mob/living/target, add_cooldown = TRUE) + if(target == grabbed_mob) + grabbed_mob = null + global.global_tentacle_grabs -= target + target.Stun(0) + target.clear_tentacle_grab() + + if(aggro_mode == "Control") + target.mobility_flags |= (MOBILITY_STAND | MOBILITY_MOVE) + target.set_resting(FALSE, TRUE, TRUE) + + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + to_chat(target, span_notice("The tentacle releases you!")) + + if(add_cooldown) + recently_released += target + addtimer(CALLBACK(src, PROC_REF(remove_from_recently_released), target), 10 SECONDS) + +/mob/living/basic/abyss_tentacle/proc/remove_from_recently_released(mob/living/target) + recently_released -= target + +/mob/living/basic/abyss_tentacle/proc/release_grabbed_mob() + if(grabbed_mob) + release_mob(grabbed_mob, FALSE) + +/mob/living/basic/abyss_tentacle/proc/on_grabbed_mob_move(mob/living/source, atom/old_loc, movement_dir, forced) + SIGNAL_HANDLER + + if(!source || QDELETED(source)) + return + + if(get_dist(source, src) > 0) + if(world.time >= source.escape_attempt) + source.escape_attempt = world.time + 5 SECONDS + var/rollcheck = SSroll.storyteller_roll(source.st_get_stat(STAT_STRENGTH), 6, list(source), numerical = FALSE) + if(rollcheck == ROLL_SUCCESS) + to_chat(source, span_notice("You break free from the tentacle's grasp!")) + release_mob(source, TRUE) + return + + else if(rollcheck == ROLL_BOTCH || rollcheck == ROLL_FAILURE) + to_chat(source, span_warning("You struggle against the tentacle but can't break free!")) + + source.visible_message(span_danger("The tentacle pulls [source] back!")) + source.forceMove(get_turf(src)) + +/mob/living/basic/abyss_tentacle/death() + visible_message(span_danger("[src] retracts back into the shadows!")) + release_grabbed_mob() + . = ..() + +/mob/living/proc/set_tentacle_grab(obj/tentacle) + grabbed_by_tentacle = tentacle + +/mob/living/proc/clear_tentacle_grab() + grabbed_by_tentacle = null + escape_attempt = 0 diff --git a/modular_darkpack/modules/npc/code/nonhuman/hostile/bear.dm b/modular_darkpack/modules/npc/code/nonhuman/hostile/bear.dm index ee698445c2b2..95c0bfc097d6 100644 --- a/modular_darkpack/modules/npc/code/nonhuman/hostile/bear.dm +++ b/modular_darkpack/modules/npc/code/nonhuman/hostile/bear.dm @@ -9,3 +9,6 @@ health = 850 melee_damage_lower = 40 melee_damage_upper = 40 //Good luck lol + mob_size = MOB_SIZE_LARGE + pixel_x = -16 + base_pixel_x = -16 diff --git a/modular_darkpack/modules/npc/icons/bat.dmi b/modular_darkpack/modules/npc/icons/bat.dmi deleted file mode 100644 index 9dd826c23587..000000000000 Binary files a/modular_darkpack/modules/npc/icons/bat.dmi and /dev/null differ diff --git a/modular_darkpack/modules/npc/icons/corvid.dmi b/modular_darkpack/modules/npc/icons/corvid.dmi new file mode 100644 index 000000000000..71f5c11099ef Binary files /dev/null and b/modular_darkpack/modules/npc/icons/corvid.dmi differ diff --git a/modular_darkpack/modules/npc/icons/deer.dmi b/modular_darkpack/modules/npc/icons/deer.dmi new file mode 100644 index 000000000000..0ae1f5970607 Binary files /dev/null and b/modular_darkpack/modules/npc/icons/deer.dmi differ diff --git a/modular_darkpack/modules/npc/icons/necromancy_zombies.dmi b/modular_darkpack/modules/npc/icons/necromancy_zombies.dmi new file mode 100644 index 000000000000..044dda3e9126 Binary files /dev/null and b/modular_darkpack/modules/npc/icons/necromancy_zombies.dmi differ diff --git a/modular_darkpack/modules/npc/icons/rat.dmi b/modular_darkpack/modules/npc/icons/rat.dmi index faf6b43c9640..f9231521dfed 100644 Binary files a/modular_darkpack/modules/npc/icons/rat.dmi and b/modular_darkpack/modules/npc/icons/rat.dmi differ diff --git a/modular_darkpack/modules/npc/readme.md b/modular_darkpack/modules/npc/readme.md index db0dacc2ea6d..e5910d0f11cc 100644 --- a/modular_darkpack/modules/npc/readme.md +++ b/modular_darkpack/modules/npc/readme.md @@ -1,4 +1,6 @@ https://github.com/DarkPack13/SecondCity/pull/96 +https://github.com/DarkPack13/SecondCity/pull/103 +https://github.com/DarkPack13/SecondCity/pull/156 ## \<NPC> @@ -26,4 +28,4 @@ This module handles everything related to darkpack non-player characters using T ### Credits: -XeonMations +XeonMations, KCartridge diff --git a/modular_darkpack/modules/npc/sound/caw.ogg b/modular_darkpack/modules/npc/sound/caw.ogg new file mode 100644 index 000000000000..f4248b02c065 Binary files /dev/null and b/modular_darkpack/modules/npc/sound/caw.ogg differ diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts.dm index 6060941c4324..3d201b8dae8e 100644 --- a/modular_darkpack/modules/occult_artifacts/code/artifacts.dm +++ b/modular_darkpack/modules/occult_artifacts/code/artifacts.dm @@ -34,6 +34,7 @@ var/true_desc = "Debug" var/identified = FALSE var/gained_boosts = FALSE + var/research_value = 0 /obj/item/vtm_artifact/proc/identify() if(!identified) @@ -57,6 +58,7 @@ true_name = "Weekapaug Thistle" true_desc = "Increases combat defense." icon_state = "w_thistle" + research_value = 10 /obj/item/vtm_artifact/weekapaug_thistle/get_powers() . = ..() @@ -86,32 +88,21 @@ true_desc = "Passive health regeneration." icon_state = "m_fetish" var/last_regen = 0 + research_value = 10 /obj/item/vtm_artifact/mummywrap_fetish/process(delta_time) . = ..() if(identified && owner) if(last_regen+60 < world.time) last_regen = world.time - owner.adjustBruteLoss(-5) - owner.adjustFireLoss(-5) - -/obj/item/vtm_artifact/saulocept - true_name = "Saulocept" - true_desc = "More experience points." - icon_state = "saulocept" - -/obj/item/vtm_artifact/saulocept/get_powers() - . = ..() - owner.experience_plus = 10 - -/obj/item/vtm_artifact/saulocept/remove_powers() - . = ..() - owner.experience_plus = 0 + owner.adjust_brute_loss(-5) + owner.adjust_fire_loss(-5) /obj/item/vtm_artifact/galdjum true_name = "Galdjum" true_desc = "Increases disciplines duration." icon_state = "galdjum" + research_value = 10 /obj/item/vtm_artifact/galdjum/get_powers() . = ..() @@ -128,6 +119,7 @@ true_name = "Fae Charm" true_desc = "Dexterity boost." icon_state = "fae_charm" + research_value = 35 /obj/item/vtm_artifact/fae_charm/get_powers() . = ..() @@ -141,6 +133,7 @@ true_name = "Heart of Eliza" true_desc = "Melee damage boost." icon_state = "h_eliza" + research_value = 30 /obj/item/vtm_artifact/heart_of_eliza/get_powers() . = ..() @@ -154,6 +147,7 @@ true_name = "Bloodstar" true_desc = "Increases Bloodpower duration." icon_state = "bloodstar" + research_value = 10 /obj/item/vtm_artifact/bloodstar/get_powers() . = ..() @@ -167,6 +161,7 @@ true_name = "Daimonori" true_desc = "Increases thaumaturgy damage." icon_state = "daimonori" + research_value = 20 /obj/item/vtm_artifact/daimonori/get_powers() . = ..() @@ -180,6 +175,7 @@ true_name = "Key of Alamut" true_desc = "Decreases incoming damage." icon_state = "k_alamut" + research_value = 30 /obj/item/vtm_artifact/key_of_alamut/get_powers() . = ..() @@ -202,6 +198,7 @@ true_desc = "Stores blood from every attack." icon_state = "o_chalice" var/stored_blood = 0 + research_value = 30 /obj/item/vtm_artifact/odious_chalice/examine(mob/user) . = ..() @@ -215,14 +212,73 @@ return if(!identified) return - M.adjustBruteLoss(-5*stored_blood, TRUE) - M.adjustFireLoss(-5*stored_blood, TRUE) + M.adjust_brute_loss(-5*stored_blood, TRUE) + M.adjust_fire_loss(-5*stored_blood, TRUE) M.update_damage_overlays() M.update_health_hud() M.update_blood_hud() playsound(M.loc,'sound/items/drink.ogg', 50, TRUE) return +/obj/item/vtm_artifact/bloodstone + true_name = "bloodstone" + true_desc = "A pulsing crimson stone that creates a mystical bond with its identifier." + icon = 'modular_darkpack/modules/paths/icons/bloodstone_artifact.dmi' + onflooricon = 'modular_darkpack/modules/paths/icons/bloodstone_artifact.dmi' + icon_state = "bloodstone" + var/datum/weakref/bound_identifier // Who identified it first + var/datum/action/bloodstone_track/tracking_action + research_value = 15 + +/obj/item/vtm_artifact/bloodstone/identify() + . = ..() + if(identified && !bound_identifier) + var/mob/living/carbon/human/user = usr + if(ishuman(user)) + bound_identifier = WEAKREF(user) + to_chat(user, span_warning("The bloodstone pulses with dark energy as it bonds to your essence. You will always know its location.")) + + tracking_action = new /datum/action/bloodstone_track(user, src) + tracking_action.Grant(user) + +/obj/item/vtm_artifact/bloodstone/Destroy() + if(tracking_action) + var/mob/living/carbon/human/user = bound_identifier.resolve() + if(user) + tracking_action.Remove(user) + QDEL_NULL(tracking_action) + bound_identifier = null + return ..() + +/datum/action/bloodstone_track + name = "Track Bloodstone" + desc = "Sense the location of your bound bloodstone." + button_icon = 'modular_darkpack/modules/paths/icons/bloodstone_artifact.dmi' + button_icon_state = "bloodstone_track" + check_flags = AB_CHECK_CONSCIOUS + var/datum/weakref/tracked_stone + +/datum/action/bloodstone_track/New(Target, obj/item/vtm_artifact/bloodstone/stone) + . = ..() + tracked_stone = WEAKREF(stone) + +/datum/action/bloodstone_track/Trigger(trigger_flags) + var/obj/item/vtm_artifact/bloodstone/bloodstone = tracked_stone.resolve() + if(!bloodstone) + to_chat(owner, span_warning("The bloodstone bond has been severed.")) + Remove(owner) + qdel(src) + return FALSE + + var/turf/stone_turf = get_turf(bloodstone) + if(!stone_turf) + to_chat(owner, span_warning("You cannot sense the bloodstone's location.")) + return FALSE + + var/area/stone_area = get_area(bloodstone) + to_chat(owner, span_notice("The bloodstone whispers its location: [stone_area.name] ([stone_turf.x], [stone_turf.y])")) + return TRUE + /obj/effect/spawner/random/occult name = "occult spawner" icon = 'modular_darkpack/modules/occult_artifacts/icons/artifacts.dmi' diff --git a/modular_darkpack/modules/paths/code/conjured_items.dm b/modular_darkpack/modules/paths/code/conjured_items.dm new file mode 100644 index 000000000000..f82620658754 --- /dev/null +++ b/modular_darkpack/modules/paths/code/conjured_items.dm @@ -0,0 +1,69 @@ +// conjured items subclassed as lighters to emit light +/obj/item/lighter/conjured + lit = TRUE + light_system = OVERLAY_LIGHT + light_on = TRUE + damtype = BURN + item_flags = DROPDEL + icon = 'modular_darkpack/modules/paths/icons/paths.dmi' + lefthand_file = 'modular_darkpack/modules/paths/icons/paths_inhand_lefthand.dmi' + righthand_file = 'modular_darkpack/modules/paths/icons/paths_inhand_righthand.dmi' + icon_state = "flame-on" + inhand_icon_state = "flame" + +// Override parent behavior so that they can't be turned off +/obj/item/lighter/conjured/attack_self(mob/user) + to_chat(user, span_notice("The supernatural flame cannot be extinguished by normal means.")) + return + +/obj/item/lighter/conjured/set_lit(new_lit) + if(!new_lit) + return + return ..() + +/obj/item/lighter/conjured/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, TRAIT_GENERIC) + set_light_on(TRUE) + +/obj/item/lighter/conjured/flame + light_range = 3 + light_power = 1 + light_color = COLOR_ORANGE + +/obj/item/lighter/conjured/flame/afterattack(atom/target, mob/living/user, proximity_flag, click_parameters) + if(proximity_flag && isliving(target)) + var/mob/living/L = target + if(prob(25)) + L.adjust_fire_stacks(1) + L.ignite_mob() + playsound(src, 'modular_darkpack/modules/paths/sounds/fireball.ogg', 25, TRUE) + + return ..() + +// Lure of Flames items +/obj/item/lighter/conjured/flame/candle + name = "conjured candle" + desc = "From your finger sprouts out the small flame of a candle." + icon_state = "candle" + inhand_icon_state = "candle" + force = 10 + +/obj/item/lighter/conjured/flame/palm_of_flame + name = "hand of flame" + desc = "Your hand burns with supernatural fire." + icon_state = "flame" + inhand_icon_state = "flame" + force = 25 + fancy = FALSE + +// Levinbolt items +/obj/item/lighter/conjured/levinbolt_arm + name = "illuminate" + desc = "Your arm surges with electricity!" + icon_state = "illuminate" + inhand_icon_state = "illuminate" + force = 15 + light_range = 2 + light_power = 1 + light_color = COLOR_WHITE diff --git a/modular_darkpack/modules/paths/code/occult_research.dm b/modular_darkpack/modules/paths/code/occult_research.dm new file mode 100644 index 000000000000..81473e77c2aa --- /dev/null +++ b/modular_darkpack/modules/paths/code/occult_research.dm @@ -0,0 +1,104 @@ +SUBSYSTEM_DEF(occult_research) + name = "Occult Research" + flags = SS_BACKGROUND|SS_NO_INIT + wait = 60 SECONDS // How often to process research points + var/base_research_rate = 0.5 // Base points per tick + var/necromancy_bonus = 0.5 + var/obtenebration_bonus = 0.5 + var/list/collected_blood //lazylist since i've noticed people haven't been using this feature so much + COOLDOWN_DECLARE(research_notification_cooldown) + +/datum/controller/subsystem/occult_research/fire(resumed = FALSE) + for(var/mob/living/carbon/human/H in GLOB.player_list) + if(!H.client) + continue + if(H.stat >= HARD_CRIT) + continue + if(!HAS_TRAIT(H, TRAIT_THAUMATURGY_KNOWLEDGE)) + continue + + process_research_points(H) + +/datum/controller/subsystem/occult_research/proc/process_research_points(mob/living/carbon/human/user) + var/research_gain = base_research_rate + + //if this thaumaturge has successfully learned the magics of an outsider clan, they gain a research bonus + for(var/datum/action/discipline/D in user.actions) + if(!D || !D.discipline) + continue + + switch(D.discipline.name) + if("Necromancy") + research_gain += necromancy_bonus + if("Obtenebration") + research_gain += obtenebration_bonus + + user.research_points += research_gain + + if(COOLDOWN_FINISHED(src, research_notification_cooldown)) + COOLDOWN_START(src, research_notification_cooldown, 10 MINUTES) + to_chat(user, span_notice("Your occult studies have yielded [research_gain] research points. Total: [user.research_points]")) + +/mob/living/carbon/human/proc/check_research_points() + set name = "Check Research Points" + set category = "IC" + set desc = "Check your current research point balance." + + if(!HAS_TRAIT(src, TRAIT_THAUMATURGY_KNOWLEDGE) && !HAS_TRAIT(src, TRAIT_NECROMANCY_KNOWLEDGE)) + to_chat(src, span_alert("You lack occult knowledge.")) + return + + to_chat(src, span_notice("You currently have [research_points] research points.")) + + +/datum/controller/subsystem/occult_research/proc/process_blood_collection(mob/living/carbon/human/caster, datum/reagent/blood/blood_sample) + if(!blood_sample || !blood_sample.data) + return + + var/blood_data = blood_sample.data + var/blood_species = blood_data["species"] + var/blood_name = blood_data["real_name"] + + var/list/allowed_species = list(SPECIES_KINDRED, /*PECIES_GAROU,*/ SPECIES_GHOUL/*, SPECIES_KUEI_JIN*/) + if(!(blood_species in allowed_species)) + return + + var/blood_identifier = "[blood_name]_[blood_species]" + + // check if the bloods already been collected + if(LAZYFIND(collected_blood, blood_identifier)) + to_chat(caster, span_notice("This blood was already identified.")) + return + + LAZYADD(collected_blood, blood_identifier) + + var/research_award = 0 + var/species_name = "" + var/research_message = "" + + switch(lowertext(blood_species)) + if(SPECIES_KINDRED) + var/generation = blood_data["generation"] + var/clan = blood_data["clan"] + research_award = (GHOUL_GENERATION - generation) * 5 + species_name = "Kindred" + research_message = "You gain new insights into the [species_name] from clan [clan]! You gain [research_award] research points." + /* + if(SPECIES_GAROU) + research_award = 30 + species_name = "Garou" + research_message = "You gain [research_award] research points." + */ + if(SPECIES_GHOUL) + research_award = 5 + species_name = "Ghoul" + research_message = "You gain [research_award] research points." + /* + if(SPECIES_KUEI_JIN) + research_award = 15 + species_name = "Kuei-Jin" + research_message = "You gain [research_award] research points." + */ + + caster.research_points += research_award + to_chat(caster, span_notice("[research_message]")) diff --git a/modular_darkpack/modules/paths/code/path.dm b/modular_darkpack/modules/paths/code/path.dm new file mode 100644 index 000000000000..0568daea7da6 --- /dev/null +++ b/modular_darkpack/modules/paths/code/path.dm @@ -0,0 +1,13 @@ +/datum/discipline/path + action_type = /datum/action/discipline/path + var/action_replaced = FALSE + selectable = FALSE //cant buy it as a ghoul + +/datum/action/discipline/path + check_flags = NONE + background_icon = 'modular_darkpack/modules/paths/icons/paths.dmi' + button_icon = 'modular_darkpack/modules/paths/icons/paths.dmi' + overlay_icon = 'modular_darkpack/modules/paths/icons/paths.dmi' + background_icon_state = "default" + button_icon_state = "default" + overlay_icon_state = "default" diff --git a/modular_darkpack/modules/paths/code/spellbooks/spellbooks.dm b/modular_darkpack/modules/paths/code/spellbooks/spellbooks.dm new file mode 100644 index 000000000000..a6c0cc4474d0 --- /dev/null +++ b/modular_darkpack/modules/paths/code/spellbooks/spellbooks.dm @@ -0,0 +1,199 @@ +/obj/item/path_spellbook + name = "path spellbook" + desc = "A default path spellbook. if you're seeing this ingame, please report to coders" + icon = 'modular_darkpack/modules/paths/icons/paths.dmi' + icon_state = "spellbook_unfinished" + drop_sound = 'sound/items/handling/book_drop.ogg' + pickup_sound = 'sound/items/handling/book_pickup.ogg' + var/activate_sound = 'modular_darkpack/modules/paths/sounds/open_book.ogg' + var/deactivate_sound = 'modular_darkpack/modules/paths/sounds/close_book.ogg' + + var/path_type = null + var/path_level = 1 + var/do_after_time = 30 SECONDS + + var/identified = FALSE + var/true_name = "" + var/true_desc = "" + + COOLDOWN_DECLARE(identify_failure_cooldown) + +/obj/item/path_spellbook/Initialize(mapload) + . = ..() + if(!identified) + true_name = name + true_desc = desc + name = "dusty forgotten tome" + desc = "This book is covered in dust and the pages appear worn. Its probably not important." + +/obj/item/path_spellbook/examine(mob/user) + . = ..() + if(!identified) + . += span_notice("You could try to clean off the dust to see what lies beneath.") + if(!COOLDOWN_FINISHED(src, identify_failure_cooldown)) + var/time_left = COOLDOWN_TIMELEFT(src, identify_failure_cooldown) / 10 + . += span_warning("You need to wait [time_left] seconds before trying again.") + +/obj/item/path_spellbook/attack_self(mob/living/carbon/human/user) + + if(!identified) + if(!COOLDOWN_FINISHED(src, identify_failure_cooldown)) + var/time_left = COOLDOWN_TIMELEFT(src, identify_failure_cooldown) / 10 + to_chat(user, span_warning("You need to wait [time_left] seconds before trying again.")) + return + if(do_after(user, 5 SECONDS)) + var/roll = SSroll.storyteller_roll(user.st_get_stat(STAT_INTELLIGENCE) + user.st_get_stat(STAT_OCCULT), path_level + 3, user, numerical = FALSE) + switch(roll) + if(ROLL_SUCCESS) + to_chat(user, span_cult("You wipe the dust off the previously irrelevant tome. Did someone misplace it from the Library?")) + src.identified = TRUE + name = true_name + desc = true_desc + return + else + to_chat(user, span_warning("You fail to figure out the real nature of the book and get distracted by more important matters. Maybe its a cookbook?")) + COOLDOWN_START(src, identify_failure_cooldown, 2 MINUTES) + return + return + + var/datum/splat/vampire/kindred/kindred = iskindred(user) + var/datum/discipline/existing_path_discipline = kindred?.get_discipline(path_type) + + if(!path_type) + to_chat(user, span_warning("This spellbook appears to be incomplete!")) + return + + if(iskindred(user)) + if(!HAS_TRAIT(user, TRAIT_THAUMATURGY_KNOWLEDGE)) + to_chat(user, span_warning("You must have knowledge of Thaumaturgy to use this book!")) + return + if(existing_path_discipline) + //Then we check if the level can be learned + if(path_level == existing_path_discipline.level) + // User already knows this level + to_chat(user, span_warning("You already know this book!")) + return + else if(path_level == existing_path_discipline.level + 1) + // The book's level is one higher than the user's current level + user.playsound_local(user, activate_sound, 50, FALSE) + else if (path_level > existing_path_discipline.level + 1) + // The book's level is too high for the user to learn + to_chat(user, span_warning("You must learn the previous book(s) first!")) + return + else if (path_level < existing_path_discipline.level) + // The book's level is lower than the user's current level + to_chat(user, span_warning("You already know a higher level of this path!")) + return + // If we reach here, the user does not know this path at all + if(path_level > 1 && !existing_path_discipline) + to_chat(user, span_warning("You must know the first level of this path before you can learn higher levels!")) + return + else if(path_level == 1 && !existing_path_discipline) + user.playsound_local(user, activate_sound, 50, FALSE) + else + to_chat(user, span_warning("This book is filled with gibberish and nonsense.")) + return + + var/original_icon_state = icon_state + icon_state = "[original_icon_state]-opened" + update_appearance() + + to_chat(user, span_notice("You begin studying the ancient texts...")) + + if(do_after(user, do_after_time, target = src)) + // Now checking the level again to assign the correct path level + if(!existing_path_discipline) + user.give_st_power(path_type, path_level) + to_chat(user, span_notice("The knowledge of [name] flows into your mind!")) + else + // If the user already knows the path, update the level + to_chat(user, span_notice("You have increased your knowledge of [name]!")) + + user.remove_st_power(path_type) + user.give_st_power(path_type, path_level) + + user.playsound_local(user, deactivate_sound, 50, FALSE) + qdel(src) + else + icon_state = original_icon_state + update_appearance() + to_chat(user, span_warning("Your concentration was broken!")) + + +/obj/item/occult_book + name = "occult book" + desc = "A default occult book. if you're seeing this ingame, please report to coders" + icon = 'modular_darkpack/modules/paths/icons/paths.dmi' + icon_state = "spellbook_unfinished" + var/do_after_time = 30 SECONDS + var/activate_sound = 'modular_darkpack/modules/paths/sounds/open_book.ogg' + var/deactivate_sound = 'modular_darkpack/modules/paths/sounds/close_book.ogg' + drop_sound = 'sound/items/handling/book_drop.ogg' + pickup_sound = 'sound/items/handling/book_pickup.ogg' + + // research vars overriden by subtypes + var/research_value = 10 + var/study_cooldown = 30 MINUTES + var/study_research_value = 50 + var/required_trait = TRAIT_THAUMATURGY_KNOWLEDGE + var/no_trait_message = "The text is incomprehensible to you without the proper knowledge." + var/cooldown_message = "You have recently studied this tome extensively. You need %TIME% more minutes before you can gain further insight from it." + var/study_start_message = "You begin studying the occult text..." + var/study_interrupted_message = "Your concentration was broken. You failed to absorb any meaningful knowledge from the text." + var/research_gain_message = "You gain %POINTS% research points from studying this tome!" + + // Flavor texts, must be overriden by subtypes + var/list/study_flavor_texts = list( + "You study the arcane text, gaining insight into occult mysteries.", + "Ancient knowledge flows from the pages into your mind.", + "The text reveals secrets of supernatural power and ritual." + ) + +/obj/item/occult_book/attack_self(mob/living/carbon/human/user) + if(!can_study(user)) + return ..() + + if(!check_cooldown(user)) + return + + begin_study(user) + return ..() + +/obj/item/occult_book/proc/can_study(mob/living/carbon/human/user) + if(!HAS_TRAIT(user, required_trait)) + to_chat(user, span_warning(no_trait_message)) + return FALSE + return TRUE + +/obj/item/occult_book/proc/check_cooldown(mob/living/carbon/human/user) + if(!COOLDOWN_FINISHED(src, study_cooldown)) + to_chat(user, span_warning(cooldown_message)) + return FALSE + return TRUE + +/obj/item/occult_book/proc/begin_study(mob/living/carbon/human/user) + var/original_icon_state = icon_state + icon_state = "[original_icon_state]-opened" + update_appearance() + + to_chat(user, span_notice(study_start_message)) + user.playsound_local(user, activate_sound, 50, FALSE) + + if(do_after(user, do_after_time, target = src)) + complete_study(user) + else + to_chat(user, span_warning(study_interrupted_message)) + + icon_state = original_icon_state + update_appearance() + +/obj/item/occult_book/proc/complete_study(mob/living/carbon/human/user) + user.research_points += study_research_value + var/flavor_text = pick(study_flavor_texts) + to_chat(user, span_cult(flavor_text)) + + var/formatted_message = replacetext(research_gain_message, "%POINTS%", "[study_research_value]") + to_chat(user, span_green(formatted_message)) + + COOLDOWN_START(src, study_cooldown, study_cooldown) + user.playsound_local(user, deactivate_sound, 50, FALSE) diff --git a/modular_darkpack/modules/paths/code/spellbooks/thaumaturgy/levinbolt_spellbooks.dm b/modular_darkpack/modules/paths/code/spellbooks/thaumaturgy/levinbolt_spellbooks.dm new file mode 100644 index 000000000000..1dc7baf6db96 --- /dev/null +++ b/modular_darkpack/modules/paths/code/spellbooks/thaumaturgy/levinbolt_spellbooks.dm @@ -0,0 +1,31 @@ +// levinbolt spellbooks +/obj/item/path_spellbook/levinbolt + name = "levinbolt spellbook" + desc = "A tome containing the secrets of channeling lightning through blood magic." + icon_state = "levinbolt_spellbook" + path_type = /datum/discipline/path/levinbolt + +/obj/item/path_spellbook/levinbolt/level1 + name = "levinbolt spellbook (level I)" + desc = "A basic tome teaching the fundamentals of lightning manipulation. Allows the Thaumaturge to cast 'Spark'. " + path_level = 1 + +/obj/item/path_spellbook/levinbolt/level2 + name = "levinbolt spellbook (level II)" + desc = "An intermediate tome revealing deeper secrets of electrical control. Allows the Thaumaturge to cast 'Illuminate'. " + path_level = 2 + +/obj/item/path_spellbook/levinbolt/level3 + name = "levinbolt spellbook (level III)" + desc = "An advanced tome containing dangerous lightning magic techniques. Allows the Thaumaturge to cast 'Power Array'." + path_level = 3 + +/obj/item/path_spellbook/levinbolt/level4 + name = "levinbolt spellbook (level IV)" + desc = "A master-level tome with devastating electrical powers. Allows the Thaumaturge to cast 'Zeus' Fury'." + path_level = 4 + +/obj/item/path_spellbook/levinbolt/level5 + name = "levinbolt spellbook (level V)" + desc = "The ultimate tome of lightning mastery, containing the most powerful electrical techniques. Allows the Thaumaturge to cast 'Eye of the Storm'." + path_level = 5 diff --git a/modular_darkpack/modules/paths/code/spellbooks/thaumaturgy/lure_of_flames_spellbooks.dm b/modular_darkpack/modules/paths/code/spellbooks/thaumaturgy/lure_of_flames_spellbooks.dm new file mode 100644 index 000000000000..0e1e3d8991d8 --- /dev/null +++ b/modular_darkpack/modules/paths/code/spellbooks/thaumaturgy/lure_of_flames_spellbooks.dm @@ -0,0 +1,31 @@ +// lure of flames spellbooks +/obj/item/path_spellbook/lure_of_flames + name = "lure of flames spellbook" + desc = "A tome containing the secrets of manipulating fire through blood magic." + icon_state = "flames_spellbook" + path_type = /datum/discipline/path/flames + +/obj/item/path_spellbook/lure_of_flames/level1 + name = "lure of flames spellbook (level I)" + desc = "A basic tome teaching the fundamentals of fire manipulation. Allows the Thaumaturge to cast 'Candle'." + path_level = 1 + +/obj/item/path_spellbook/lure_of_flames/level2 + name = "lure of flames spellbook (level II)" + desc = "An intermediate tome revealing deeper secrets of flame control. Allows the Thaumaturge to cast 'Palm of Flame'." + path_level = 2 + +/obj/item/path_spellbook/lure_of_flames/level3 + name = "lure of flames spellbook (level III)" + desc = "An advanced tome containing dangerous fire magic techniques. Allows the Thaumaturge to cast 'Campfire'." + path_level = 3 + +/obj/item/path_spellbook/lure_of_flames/level4 + name = "lure of flames spellbook (level IV)" + desc = "A master-level tome with devastating flame powers. Allows the Thaumaturge to cast 'Engulf'." + path_level = 4 + +/obj/item/path_spellbook/lure_of_flames/level5 + name = "lure of flames spellbook (level V)" + desc = "The ultimate tome of fire mastery, containing the most powerful flame techniques. Allows the Thaumaturge to cast 'Inferno'." + path_level = 5 diff --git a/modular_darkpack/modules/paths/code/spellbooks/thaumaturgy/research_spellbooks.dm b/modular_darkpack/modules/paths/code/spellbooks/thaumaturgy/research_spellbooks.dm new file mode 100644 index 000000000000..f489aa6ce342 --- /dev/null +++ b/modular_darkpack/modules/paths/code/spellbooks/thaumaturgy/research_spellbooks.dm @@ -0,0 +1,45 @@ +/obj/item/occult_book/veneficorum_artum_sanguis + name = "Veneficorum Artum Sanguis" + desc = "To the untrained eyes of Mortals and unknowing Kindred, this book appears to be some manner of Latin text, but those Kindred who truly know the history of the Tremere recognize the author - Inner Councilman Etrius of the Tremere. The Veneficorum - as it is called by most Magi of the Tremere, is the oldest and most foundational work of Thaumaturgical inquiry known to the Tremere, and chronicles the early experiments and exploits in the developments of Thaumaturgy. The work is thorough and explicit in its explanation of many procedures, rituals, and concepts of how to use Blood Magic. The Tremere guard all copies of this work extremely jealously - as they fear that any Kindred in posession of this work may use it to learn Thaumaturgy. This book is EXTREMELY RARE, with only a dozen or so copies ever being made of the original tome from Vienna." + research_value = 50 + study_cooldown = 30 MINUTES + study_research_value = 100 + icon_state = "veneficorum" + study_flavor_texts = list( + "You delve into Etrius's detailed explanations of blood manipulation, gaining deeper insight into the fundamental principles of Thaumaturgy.", + "The ancient text reveals secrets of ritual preparation and the proper channeling of vitae through arcane and Hermetic formulae.", + "You study the meticulously documented experiments on blood manipulation, understanding the precise movements and incantations required.", + "The Veneficorum details the hierarchical structure of Thaumaturgical power, explaining how the Tremere maintain their mystical dominance - such is the way of a Clan with power unmatched, and envied by all.", + "Ancient diagrams and formulae illuminate the connection between mortal blood and supernatural power, expanding your understanding of the Art.", + "You absorb Etrius's warnings about the dangers of improper blood magic, learning from the failures and catastrophes of early practitioners.", + "The text describes the creation of blood-based wards and protective circles, knowledge jealously guarded by the Tremere hierarchy.", + "You study the philosophical underpinnings of Thaumaturgy, understanding how will, blood, and ancient knowledge combine to reshape reality.", + "The book reveals the historical development of various Thaumaturgical paths, each built upon centuries of experimentation and refinement.", + "Ancient Latin passages describe the transformation of the Tremere from mortal mages to vampiric masters of blood sorcery.", + "Multiple passages detail the conflicts the Tremeres faced from all sides - their 'siege mentality' lasting to this day. Attacked on all sides by the Lupines, the Tzimisce, the Nosferatu, the Gangrel, and yet, the power of Thaumaturgy was our salvation. We must protect it at all costs.", + "'Go forth, young student, master the blood, master the will, study under your senior Magi, and bend reality to your will. Transcend. Evolve. Ensure the survival of our kind. Innovate. Expand. Conquer.' - A final note from Etrius at the end of this work" + ) + + + +/obj/item/occult_book/das_tiefe_geheimnis + name = "Das Tiefe Geheimnis" + desc = "Das Tiefe Geheimnis - this copy is an English translation, titled 'The Dark Secret'. The most common musings on blood magic Hermeticism, this book was written by Johann Kloepfer, a member of the Cologne Chantry, in the 15th century. Found in nearly every major Chantry, and studied at least once by virtually every Tremere, this book lays the foundation for the most common Paths (Blood and Lure of Flames), Rituals, and Principles of Thaumaturgy. Unfortunately, this work is known to have several glaring errors in its descriptions of some of the most common rituals, making the work useful only in a supplemental capacity. Many Tremere believe Kloepfer placed these ommissions intentionally to safeguard the art of Thaumaturgy from non-Tremere. Most copies, including this one, are littered with copious hand-written notes and corrections added by members over the centuries." + research_value = 20 + study_cooldown = 15 MINUTES + study_research_value = 50 + icon_state = "tiefe" + study_flavor_texts = list( + "You study Kloepfer's foundational explanations of the Path of Blood, cross-referencing the handwritten corrections in the margins.", + "The text details the basic principles of the Lure of Flames, though you notice several deliberate omissions that have been filled in by later scholars.", + "You examine the fundamental rituals described by Kloepfer, noting where centuries of Tremere have added their own insights and corrections.", + "The book's exploration of Hermetic principles provides a solid foundation, despite the intentional errors you've learned to identify.", + "Marginal notes from previous readers reveal the true incantations behind Kloepfer's deliberately obscured ritual descriptions.", + "You study the basic ward creation techniques, comparing Kloepfer's original text with the extensive annotations added over the centuries.", + "The fundamental theory of vitae manipulation becomes clearer as you cross-reference the original text with generations of scholarly corrections.", + "Kloepfer's discussion of Thaumaturgical hierarchy and apprenticeship provides insight into traditional Tremere teaching methods.", + "You decipher the intentionally cryptic passages about blood transmutation, aided by the copious notes left by previous students.", + "The text's exploration of basic protective circles and ritual preparation gives you a better grasp of foundational Thaumaturgy.", + "Annotations reveal the true nature of several 'errors' in Kloepfer's work, showing how the author protected Tremere secrets from outsiders.", + "You study the relationship between will, blood, and incantation as described in this cornerstone work of Thaumaturgical literature." + ) diff --git a/modular_darkpack/modules/paths/code/thaumaturgy_archives.dm b/modular_darkpack/modules/paths/code/thaumaturgy_archives.dm new file mode 100644 index 000000000000..14ce4b662515 --- /dev/null +++ b/modular_darkpack/modules/paths/code/thaumaturgy_archives.dm @@ -0,0 +1,325 @@ +/obj/structure/retail/occult + owner_needed = FALSE + desc = "Use your occult research to reap the benefits of safeguarded knowledge and artifacts." + + // Stock tracking - each item starts with 2 in stock, limited supply to cut down on powergaming + var/list/item_stock = list() + + products_list = list( + // SPELLBOOKS + new /datum/data/vending_product("Lure of Flames Spellbook (Level I)", /obj/item/path_spellbook/lure_of_flames/level1, 130), + new /datum/data/vending_product("Lure of Flames Spellbook (Level II)", /obj/item/path_spellbook/lure_of_flames/level2, 180), + new /datum/data/vending_product("Lure of Flames Spellbook (Level III)", /obj/item/path_spellbook/lure_of_flames/level3, 210), + new /datum/data/vending_product("Lure of Flames Spellbook (Level IV)", /obj/item/path_spellbook/lure_of_flames/level4, 240), + new /datum/data/vending_product("Lure of Flames Spellbook (Level V)", /obj/item/path_spellbook/lure_of_flames/level5, 270), + + new /datum/data/vending_product("Levinbolt Spellbook (Level I)", /obj/item/path_spellbook/levinbolt/level1, 130), + new /datum/data/vending_product("Levinbolt Spellbook (Level II)", /obj/item/path_spellbook/levinbolt/level2, 180), + new /datum/data/vending_product("Levinbolt Spellbook (Level III)", /obj/item/path_spellbook/levinbolt/level3, 210), + new /datum/data/vending_product("Levinbolt Spellbook (Level IV)", /obj/item/path_spellbook/levinbolt/level4, 240), + new /datum/data/vending_product("Levinbolt Spellbook (Level V)", /obj/item/path_spellbook/levinbolt/level5, 270), + + // ARTIFACTS + // Lower tier artifacts + new /datum/data/vending_product("Weekapaug Thistle", /obj/item/vtm_artifact/weekapaug_thistle, 75), + new /datum/data/vending_product("Mummywrap Fetish", /obj/item/vtm_artifact/mummywrap_fetish, 70), + new /datum/data/vending_product("Galdjum", /obj/item/vtm_artifact/galdjum, 70), + new /datum/data/vending_product("Bloodstar", /obj/item/vtm_artifact/bloodstar, 70), + + // Mid tier artifacts + new /datum/data/vending_product("Fae Charm", /obj/item/vtm_artifact/fae_charm, 120), + new /datum/data/vending_product("Daimonori", /obj/item/vtm_artifact/daimonori, 120), + new /datum/data/vending_product("Key of Alamut", /obj/item/vtm_artifact/key_of_alamut, 130), + new /datum/data/vending_product("Heart of Eliza", /obj/item/vtm_artifact/heart_of_eliza, 140), + new /datum/data/vending_product("Bloodstone", /obj/item/vtm_artifact/bloodstone, 140), + + // High tier artifacts + new /datum/data/vending_product("Odious Chalice", /obj/item/vtm_artifact/odious_chalice, 180), + +) + +/obj/structure/retail/occult/New() + . = ..() + //each item starts with 2 in stock + for(var/datum/data/vending_product/prize in products_list) + item_stock[prize.product_path] = 2 + +// are they antitribu? +/obj/structure/retail/occult/proc/has_purchase_privileges(datum/job/job) + return is_type_in_list(job, list(/datum/job/vampire/regent, + /datum/job/vampire/archivist, + /datum/job/vampire/hound, + /datum/job/vampire/sheriff, + /datum/job/vampire/clerk, + /datum/job/vampire/prince) + ) + +// find the regent +/obj/structure/retail/occult/proc/find_regent() + for(var/mob/living/carbon/human/H in GLOB.human_list) + if(istype(H.mind?.assigned_role, /datum/job/vampire/regent)) + return H + return null + +// find all archivists +/obj/structure/retail/occult/proc/find_archivists() + var/list/archivists = list() + for(var/mob/living/carbon/human/H in GLOB.human_list) + if(istype(H.mind?.assigned_role, /datum/job/vampire/archivist)) + archivists += H + return archivists + +// Non-Chantry non-Camarilla Tremeres, when spending their research points, give 30% of their purchase to the Regent, or distributed among all archivists +/obj/structure/retail/occult/proc/distribute_research_points(amount, purchaser_name, item_name) + var/tribute_amount = round(amount * 0.3) + var/mob/living/carbon/human/regent = find_regent() + + if(regent) + regent.research_points += tribute_amount + to_chat(regent, span_notice("The Archives channel [tribute_amount] research points to you from [purchaser_name]'s purchase of [item_name].")) + return + + var/list/archivists = find_archivists() + if(archivists.len > 0) + var/points_per_archivist = round(tribute_amount / archivists.len) + var/remaining_points = tribute_amount - (points_per_archivist * archivists.len) + + for(var/mob/living/carbon/human/archivist in archivists) + var/points_to_give = points_per_archivist + if(remaining_points > 0) + points_to_give++ + remaining_points-- + archivist.research_points += points_to_give + to_chat(archivist, span_notice("The Archives distribute [points_to_give] research points to you from [purchaser_name]'s purchase of [item_name].")) + + +/obj/structure/retail/occult/proc/increment_stock(item_path) + if(item_path in item_stock) + item_stock[item_path]++ + else + for(var/datum/data/vending_product/prize in products_list) + if(prize.product_path == item_path) + item_stock[item_path] = 1 + break + +// SpellbookVendor.jsx in tgui/interfaces +/obj/structure/retail/occult/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "SpellbookVendor", name) + ui.open() + +/obj/structure/retail/occult/ui_data(mob/user) + . = list() + .["user"] = list() + if(ishuman(user)) + var/mob/living/carbon/human/H = user + .["user"]["points"] = H.research_points + .["user"]["name"] = "[H.real_name]" + .["user"]["job"] = "[H.mind?.assigned_role.title]" + .["user"]["has_thaumaturgy"] = HAS_TRAIT(H, TRAIT_THAUMATURGY_KNOWLEDGE) + .["user"]["has_necromancy"] = HAS_TRAIT(H, TRAIT_NECROMANCY_KNOWLEDGE) + .["user"]["is_regent"] = istype(H.mind?.assigned_role, /datum/job/vampire/regent) + .["user"]["has_privileges"] = has_purchase_privileges(H.mind?.assigned_role) + else + .["user"]["points"] = 0 + .["user"]["name"] = "Unknown" + .["user"]["job"] = "Unknown" + .["user"]["has_thaumaturgy"] = FALSE + .["user"]["has_necromancy"] = FALSE + .["user"]["is_regent"] = FALSE + .["user"]["has_privileges"] = FALSE + + .["tremere_members"] = list() + for(var/mob/living/carbon/human/tremere_member in GLOB.human_list) + if(!tremere_member.mind) + continue + var/datum/job/role = tremere_member.mind.assigned_role + if(is_type_in_list(role, list(/datum/job/vampire/archivist, /datum/job/vampire/gargoyle, /datum/job/vampire/regent))) + .["tremere_members"] += list(list( + "name" = tremere_member.real_name, + "role" = role.title, + "points" = tremere_member.research_points, + "ref" = "\ref[tremere_member]" + )) + + + .["product_records"] = list() + for(var/datum/data/vending_product/prize in products_list) + var/stock_count = item_stock[prize.product_path] || 0 + var/obj/item/product_item = prize.product_path + var/list/product_data = list( + path = replacetext(replacetext("[prize.product_path]", "/obj/item/", ""), "/", "-"), + name = prize.name, + price = prize.price, + ref = REF(prize), + stock = stock_count, + available = (stock_count > 0), + icon = initial(product_item.icon), + icon_state = initial(product_item.icon_state) + ) + .["product_records"] += list(product_data) + +/obj/structure/retail/occult/ui_act(action, params) + if(action == "transfer_points") + return handle_point_transfer(action, params) + if(action == "seize_points") + return handle_point_seizure(action, params) + if(action != "purchase") + return ..() + + if(!ishuman(usr)) + return + + var/mob/living/carbon/human/H = usr + + if(!iskindred(usr)) + return + + var/datum/data/vending_product/prize = locate(params["ref"]) in products_list + var/current_stock = item_stock[prize.product_path] || 0 + if(current_stock <= 0) + to_chat(usr, span_alert("Error: [prize.name] is out of stock!")) + return + + if(prize.price > H.research_points) + to_chat(usr, span_alert("Error: Insufficient research points for [prize.name]! You need [prize.price] research points.")) + return + + H.research_points -= prize.price + + // Check if user is loyal to the chantry/camarilla - if not, award 30% tribute to leadership + var/datum/job/user_role = H.mind?.assigned_role + var/has_privileges = has_purchase_privileges(user_role) + + if(!has_privileges) + distribute_research_points(prize.price, H.real_name, prize.name) + to_chat(usr, span_notice("A portion of your research points flow through the Archives to the Chantry leadership as tribute.")) + + item_stock[prize.product_path]-- + + to_chat(usr, span_notice("The Archives emanate dark energy as it dispenses [prize.name]!")) + new prize.product_path(loc) + return TRUE + +//transfer research points +/obj/structure/retail/occult/proc/handle_point_transfer(action, params) + if(!ishuman(usr)) + return FALSE + + var/mob/living/carbon/human/sender = usr + var/target_ref = params["target_ref"] + var/amount = text2num(params["amount"]) + + if(!target_ref || !amount || amount <= 0) + to_chat(sender, span_alert("Error: Invalid transfer parameters!")) + return FALSE + + if(amount > sender.research_points) + to_chat(sender, span_alert("You don't have enough research points!")) + return FALSE + + var/mob/living/carbon/human/target = locate(target_ref) + + sender.research_points -= amount + target.research_points += amount + + to_chat(sender, span_notice("You transfer [amount] research points to [target.real_name] through the Archives' dark conduits.")) + to_chat(target, span_notice("The Archives whisper to you... [sender.real_name] has sent you [amount] research points.")) + + return TRUE + +//research point seizure +/obj/structure/retail/occult/proc/handle_point_seizure(action, params) + if(!ishuman(usr)) + return FALSE + + var/mob/living/carbon/human/regent = usr + + if(!istype(regent.mind?.assigned_role, /datum/job/vampire/regent)) + to_chat(regent, span_alert("Only the Regent may exercise such authority!")) + return FALSE + + var/target_ref = params["target_ref"] + var/amount = text2num(params["amount"]) + + if(!target_ref || !amount || amount <= 0) + to_chat(regent, span_alert("Error: Invalid seizure parameters!")) + return FALSE + + var/mob/living/carbon/human/target = locate(target_ref) + + var/actual_amount = min(amount, target.research_points) + + if(actual_amount <= 0) + to_chat(regent, span_alert("Target has no research points to seize!")) + return FALSE + + target.research_points -= actual_amount + regent.research_points += actual_amount + + to_chat(regent, span_notice("By your authority as Regent, you seize [actual_amount] research points from [target.real_name] through the Archives.")) + to_chat(target, span_warning("The Archives grow cold... Regent [regent.real_name] has seized [actual_amount] of your research points by right of authority.")) + + return TRUE + +//offer artifacts to the shop for research points AND increment stock +/obj/structure/retail/occult/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + . = ..() + if(istype(tool, /obj/item/vtm_artifact)) + var/obj/item/vtm_artifact/artifact = tool + + if(!ishuman(user)) + return ITEM_INTERACT_BLOCKING + + var/mob/living/carbon/human/H = user + + if(artifact.research_value <= 0) + to_chat(user, span_warning("The Archives find no value in this artifact.")) + return ITEM_INTERACT_BLOCKING + + H.research_points += artifact.research_value + + increment_stock(artifact.type) + + //when donating an artifact, increase stock of a random spellbook + increment_stock(pick( + /obj/item/path_spellbook/lure_of_flames/level1, + /obj/item/path_spellbook/lure_of_flames/level2, + /obj/item/path_spellbook/lure_of_flames/level3, + /obj/item/path_spellbook/lure_of_flames/level4, + /obj/item/path_spellbook/lure_of_flames/level5, + /obj/item/path_spellbook/levinbolt/level1, + /obj/item/path_spellbook/levinbolt/level2, + /obj/item/path_spellbook/levinbolt/level3, + /obj/item/path_spellbook/levinbolt/level4, + /obj/item/path_spellbook/levinbolt/level5)) + + if(artifact.research_value >= 20) + to_chat(user, span_nicegreen("The Archives hungrily consume the powerful artifact, granting you [artifact.research_value] research points and adding it to their collection!")) + else if(artifact.research_value >= 10) + to_chat(user, span_notice("The Archives absorb the artifact's essence, granting you [artifact.research_value] research points and cataloging its knowledge.")) + else + to_chat(user, span_notice("The Archives reluctantly accept the minor artifact, granting you [artifact.research_value] research points and filing it away.")) + + qdel(artifact) + return ITEM_INTERACT_SUCCESS + + if(istype(tool, /obj/item/path_spellbook)) + var/obj/item/path_spellbook/spellbook = tool + + if(!ishuman(user)) + return ITEM_INTERACT_BLOCKING + + var/mob/living/carbon/human/H = user + + var/research_reward = 5 // base reward modified by spellbook + H.research_points += research_reward + + increment_stock(spellbook.type) + + to_chat(user, span_notice("The Archives accept your spellbook, granting you [research_reward] research points and adding its knowledge to the collection.")) + + qdel(spellbook) + return ITEM_INTERACT_SUCCESS + diff --git a/modular_darkpack/modules/paths/icons/bloodstone_artifact.dmi b/modular_darkpack/modules/paths/icons/bloodstone_artifact.dmi new file mode 100644 index 000000000000..63328eb87cc3 Binary files /dev/null and b/modular_darkpack/modules/paths/icons/bloodstone_artifact.dmi differ diff --git a/modular_darkpack/modules/paths/icons/paths.dmi b/modular_darkpack/modules/paths/icons/paths.dmi new file mode 100644 index 000000000000..152271d3f9b5 Binary files /dev/null and b/modular_darkpack/modules/paths/icons/paths.dmi differ diff --git a/modular_darkpack/modules/paths/icons/paths_inhand_lefthand.dmi b/modular_darkpack/modules/paths/icons/paths_inhand_lefthand.dmi new file mode 100644 index 000000000000..3d852aea175d Binary files /dev/null and b/modular_darkpack/modules/paths/icons/paths_inhand_lefthand.dmi differ diff --git a/modular_darkpack/modules/paths/icons/paths_inhand_righthand.dmi b/modular_darkpack/modules/paths/icons/paths_inhand_righthand.dmi new file mode 100644 index 000000000000..200f3c5b9471 Binary files /dev/null and b/modular_darkpack/modules/paths/icons/paths_inhand_righthand.dmi differ diff --git a/modular_darkpack/modules/paths/sounds/close_book.ogg b/modular_darkpack/modules/paths/sounds/close_book.ogg new file mode 100644 index 000000000000..dd9d08d40c19 Binary files /dev/null and b/modular_darkpack/modules/paths/sounds/close_book.ogg differ diff --git a/modular_darkpack/modules/paths/sounds/fireball.ogg b/modular_darkpack/modules/paths/sounds/fireball.ogg new file mode 100644 index 000000000000..d706b1c9617f Binary files /dev/null and b/modular_darkpack/modules/paths/sounds/fireball.ogg differ diff --git a/modular_darkpack/modules/paths/sounds/open_book.ogg b/modular_darkpack/modules/paths/sounds/open_book.ogg new file mode 100644 index 000000000000..9dca8caf89f7 Binary files /dev/null and b/modular_darkpack/modules/paths/sounds/open_book.ogg differ diff --git a/modular_darkpack/modules/phones/code/_phone.dm b/modular_darkpack/modules/phones/code/_phone.dm new file mode 100644 index 000000000000..1b40a871bec3 --- /dev/null +++ b/modular_darkpack/modules/phones/code/_phone.dm @@ -0,0 +1,409 @@ +/obj/item/smartphone + name = "smartphone" + desc = "A portable device to call anyone you want." + icon = 'modular_darkpack/modules/phones/icons/phone.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/phones/icons/phone_onfloor.dmi') + icon_state = "phone" + inhand_icon_state = "phone" + lefthand_file = 'modular_darkpack/modules/phones/icons/lefthand.dmi' + righthand_file = 'modular_darkpack/modules/phones/icons/righthand.dmi' + item_flags = NOBLUDGEON + w_class = WEIGHT_CLASS_SMALL + resistance_flags = FIRE_PROOF | ACID_PROOF + + // Who owns this phone on initialization? + var/datum/weakref/owner_weakref + // There's a radio in my phone that calls me stud muffin. + var/obj/item/radio/phone_radio + // Cooldown for the phone call sound. + COOLDOWN_DECLARE(ringer_cooldown) + // Contacts the phone has saved. + var/list/contacts = list() + // Contacts the phone has blocked. + var/list/blocked_contacts = list() + // The phone history of the phone. + var/list/phone_history_list = list() + // Currently viewed newscaster channel. Used for IRC Announcements + var/obj/machinery/newscaster/irc_channel + // Do we have a SIM card? + var/obj/item/sim_card/sim_card + // There's a wiki in our phone. Literally. + var/obj/item/book/manual/wiki/wiki_book + // Phone flags, for things like if its open or if it has no sim card. + var/phone_flags = NONE + // The phone's current state. + VAR_PRIVATE/current_state = PHONE_AVAILABLE + // The number the phone has dialed. + var/dialed_number + // The frequency in use for a phone call. + var/secure_frequency + // Current sound to play when the phone is ringing. + var/call_sound = 'modular_darkpack/modules/phones/sounds/call.ogg' + // If the phone should play a sound when ringing. + var/ringer = TRUE + // If the phone shows balloon alerts when ringing. + var/vibration = TRUE + // If the phone's microphone is muted. + var/muted = FALSE + // ID of the timer that the phone uses for ringing. Deleted once the user denies a phone call or misses it. + var/phone_ringing_timer = null + // The phone number of the phone calling us. If any. + var/incoming_phone_number = null + + /// A list of associative lists with three indeces: NETWORK_ID, OUR_ROLE and USE_JOB_TITLE. So that contact_networks is populated on init. + var/list/contact_networks_pre_init = null + /// A list of contact networks to be added in. Order matters, as if members overlap they will only get the first contact. + var/list/contact_networks = null + var/important_contact_of = null + custom_price = 100 + +/obj/item/smartphone/Initialize(mapload) + . = ..() + GLOB.phones_list += src + if(!sim_card) + sim_card = new() + sim_card.phone_weakref = WEAKREF(src) + phone_radio = new(src) + phone_radio.keyslot = new + phone_radio.radio_noise = FALSE + phone_radio.canhear_range = 1 + irc_channel = new() + wiki_book = new() + become_hearing_sensitive(ROUNDSTART_TRAIT) + RegisterSignal(src, COMSIG_MOVABLE_HEAR, PROC_REF(handle_hearing)) + AddComponent(/datum/component/violation_observer, FALSE) + +/// Index to a define to point at a runtime-global list at compile-time. +#define NETWORK_ID 1 +/// Index to a string, for the contact title. +#define OUR_ROLE 2 +/// Index to a boolean, on whether to replace role with job title (or alt-title). +#define USE_JOB_TITLE 3 + +/obj/item/smartphone/proc/update_initialized_contacts() + var/mob/living/carbon/owner = owner_weakref.resolve() + if(LAZYLEN(contact_networks_pre_init)) + LAZYINITLIST(contact_networks) + for(var/list/contact_network_info as anything in contact_networks_pre_init) + var/list/network_contacts = GLOB.contact_networks[contact_network_info[NETWORK_ID]] + + var/our_role = contact_network_info[OUR_ROLE] + if(contact_network_info[USE_JOB_TITLE] && !isnull(owner) && owner?.job) + var/datum/job/job = SSjob.get_job(owner.job) + our_role = job.title + + var/datum/contact_network/contact_network = new(network_contacts, our_role) + contact_networks += contact_network + + var/datum/contact/our_contact = new(owner.real_name, sim_card.phone_number, our_role, WEAKREF(src)) + network_contacts |= our_contact + + for(var/obj/item/smartphone/P as anything in GLOB.phones_list) + P.update_contacts() + + if(important_contact_of && owner && sim_card.phone_number) + GLOB.important_contacts[important_contact_of] = new /datum/phonecontact(owner.real_name, sim_card.phone_number) + +#undef NETWORK_ID +#undef OUR_ROLE +#undef USE_JOB_TITLE + +/obj/item/smartphone/Destroy(force) + GLOB.phones_list -= src + for(var/datum/contact_network/contact_network as anything in contact_networks) + for(var/datum/contact/our_contact in contact_network.contacts) + if(our_contact.number == sim_card.phone_number) + contact_network.contacts -= our_contact + + lose_hearing_sensitivity(ROUNDSTART_TRAIT) + UnregisterSignal(src, COMSIG_MOVABLE_HEAR) + if(sim_card) + sim_card.phone_weakref = null + QDEL_NULL(sim_card) + if(phone_radio) + QDEL_NULL(phone_radio.keyslot) + QDEL_NULL(phone_radio) + if(irc_channel) + QDEL_NULL(irc_channel) + if(wiki_book) + QDEL_NULL(wiki_book) + return ..() + +/obj/item/smartphone/examine(mob/user) + . = ..() + . += span_notice("[EXAMINE_HINT("Interact")] to look at the screen.") + . += span_notice("[EXAMINE_HINT("Alt-Click")] or [EXAMINE_HINT("Right-Click")] to toggle the screen.") + if(sim_card) + . += span_notice("[EXAMINE_HINT("Ctrl-Click")] to remove [sim_card].") + else + . += span_notice("You can [EXAMINE_HINT("Insert")] a SIM card.") + +/obj/item/smartphone/attack_self(mob/user, modifiers) + . = ..() + if(!(phone_flags & PHONE_OPEN)) + toggle_screen(user) + ui_interact(user) + +/obj/item/smartphone/click_alt(mob/user) + if(!(user.is_holding(src))) + return CLICK_ACTION_BLOCKING + toggle_screen(user) + return CLICK_ACTION_SUCCESS + +/obj/item/smartphone/item_ctrl_click(mob/user) + if(!(user.is_holding(src))) + return CLICK_ACTION_BLOCKING + if(!sim_card) + balloon_alert(user, "no sim card!") + return CLICK_ACTION_BLOCKING + if(do_after(user, 2 SECONDS, src)) + balloon_alert(user, "you remove \the [sim_card]!") + switch(current_state) + if(PHONE_CALLING) + hang_up_phone_call(dialed_number) + if(PHONE_RINGING) + decline_phone_call() + if(PHONE_IN_CALL) + end_phone_call() + user.put_in_hands(sim_card) + sim_card.phone_weakref = null + sim_card = null + phone_flags |= PHONE_NO_SIM + return CLICK_ACTION_SUCCESS + return CLICK_ACTION_BLOCKING + +/obj/item/smartphone/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/sim_card)) + if(sim_card) + balloon_alert(user, "[sim_card] already installed!") + return FALSE + balloon_alert(user, "you insert \the [attacking_item]!") + sim_card = attacking_item + user.transferItemToLoc(attacking_item, src) + sim_card.phone_weakref = WEAKREF(src) + phone_flags &= ~PHONE_NO_SIM + return TRUE + return ..() + +/obj/item/smartphone/ui_status(mob/user, datum/ui_state/state) + if(!(phone_flags & PHONE_OPEN)) + return UI_CLOSE + return ..() + +/obj/item/smartphone/ui_interact(mob/user, datum/tgui/ui) + . = ..() + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Telephone") + ui.open() + +/obj/item/smartphone/ui_data(mob/user) + var/list/data = list() + data["my_number"] = sim_card ? sim_card.phone_number : "No SIM card inserted." + data["no_sim_card"] = (phone_flags & PHONE_NO_SIM) ? TRUE : FALSE + data["phone_in_call"] = (current_state == PHONE_IN_CALL) ? TRUE : FALSE + data["phone_ringing"] = (current_state == PHONE_RINGING) ? TRUE : FALSE + data["phone_calling"] = (current_state == PHONE_CALLING) ? TRUE : FALSE + data["ringer"] = ringer + data["vibration"] = vibration + data["speaker_mode"] = (phone_radio.canhear_range == 3) ? TRUE : FALSE + data["muted"] = muted + + var/list/published_numbers = list() + for(var/contact in SSphones.published_phone_numbers) + UNTYPED_LIST_ADD(published_numbers, list( + "name" = contact, + "number" = SSphones.published_phone_numbers[contact], + )) + published_numbers = sort_list(published_numbers) + data["published_numbers"] = published_numbers + + var/list/our_contacts = list() + for(var/datum/phonecontact/contact in contacts) + UNTYPED_LIST_ADD(our_contacts, list( + "name" = contact.name, + "number" = contact.number, + )) + our_contacts = sort_list(our_contacts) + data["our_contacts"] = our_contacts + + var/list/our_blocked_contacts = list() + for(var/datum/phonecontact/contact in blocked_contacts) + UNTYPED_LIST_ADD(our_blocked_contacts, list( + "name" = contact.name, + "number" = contact.number, + )) + our_blocked_contacts = sort_list(our_blocked_contacts) + data["our_blocked_contacts"] = our_blocked_contacts + + var/list/phone_history = list() + for(var/datum/phone_history/PH in phone_history_list) + UNTYPED_LIST_ADD(phone_history, list( + "type" = PH.call_type, + "type_tooltip" = PH.call_type_tooltip, + "name" = PH.name, + "number" = PH.number, + "time" = PH.time + )) + data["phone_history"] = phone_history + + data["calling_user"] = get_number_contact_name() + + data["time"] = time_to_twelve_hour(station_time(), format = "hh:mm") + data["date"] = station_time_timestamp("Day, Month DD, ") + "[CURRENT_STATION_YEAR]" + return data + +/obj/item/smartphone/ui_act(action, params, datum/tgui/ui) + . = ..() + if(.) + return + switch(action) + if("call") + start_phone_call(usr, params["number"]) + return TRUE + + if("hang") + if(current_state == PHONE_IN_CALL) + end_phone_call() + else + hang_up_phone_call(dialed_number) + return TRUE + + if("accept") + accept_phone_call(usr) + return TRUE + + if("decline") + decline_phone_call() + return TRUE + + if("publish_number") + var/name = tgui_input_text(usr, "Input name", "Publish Number") + if(!name) + to_chat(usr, span_danger("You must input a name to publish your number.")) + return + if(!sim_card) + to_chat(usr, span_danger("You must insert a SIM card to publish your number.")) + return + name = trim(copytext_char(sanitize(name), 1, MAX_MESSAGE_LEN)) + for(var/contact as anything in SSphones.published_phone_numbers) + if(SSphones.published_phone_numbers[contact] == sim_card.phone_number) + to_chat(usr, span_danger("Error: This number is already published.")) + return TRUE + SSphones.published_phone_numbers[name] = sim_card.phone_number + to_chat(usr, span_notice("Your number is now published.")) + return TRUE + + if("add_contact") + var/number = params["number"] + if(length(number) > 15) + to_chat(usr, span_danger("Entered number is too long")) + return + var/stripped_number = replacetext(number, " ", "") // remove spaces + var/new_contact_name = tgui_input_text(usr, "Input name", "Add Contact") + if(!new_contact_name) + to_chat(usr, span_danger("You must input a name to add a contact.")) + return + + var/datum/phonecontact/new_contact = new() + new_contact.number = "[stripped_number]" + new_contact.name = "[new_contact_name]" + contacts += new_contact + + return TRUE + + if("remove_contact") + var/name = params["name"] + for(var/datum/phonecontact/contact in contacts) + if(contact.name == name) + contacts -= contact + return TRUE + return FALSE + + if("block") + var/block_number = params["number"] + if(!block_number) + to_chat(usr, span_warning("You must provide a number.")) + if(length(block_number) > 15) + to_chat(usr, span_warning("Invalid number.")) + return + + var/datum/phonecontact/blocked_contact = new() + block_number = replacetext(block_number, " ", "") + blocked_contact.number = "[block_number]" + blocked_contact.name = "Blocked [length(blocked_contacts)+1]" + blocked_contacts += blocked_contact + return TRUE + + if("unblock") + var/result = params["name"] + for(var/datum/phonecontact/unblocked_contact in blocked_contacts) + if(unblocked_contact.name == result) + blocked_contacts -= unblocked_contact + return TRUE + return FALSE + + if("delete_call_history") + if(!length(phone_history_list)) + to_chat(usr, span_danger("You have no call history to delete.")) + return + + to_chat(usr, "Your total amount of history saved is: [length(phone_history_list)]") + var/number_of_deletions = tgui_input_number(usr, "Input the amount that you want to delete", "Deletion Amount", max_value = length(phone_history_list)) + if(!number_of_deletions) + return FALSE + + //Delete the call history depending on the amount inputed by the User + if(number_of_deletions > length(phone_history_list)) + //Verify if the requested amount in bigger than the history list. + to_chat(usr, "You cannot delete more items than the history contains.") + return FALSE + else + for(var/i in 1 to number_of_deletions) + //It will always delete the first item of the list, so the last logs are deleted first + var/item_to_remove = phone_history_list[1] + phone_history_list -= item_to_remove + to_chat(usr, "[number_of_deletions] call history entries were deleted. Remaining: [length(phone_history_list)]") + return TRUE + + if("terminal_sound") + if(ringer) + playsound(loc, 'sound/machines/terminal/terminal_select.ogg', 15, TRUE) + return TRUE + + if("silent") + ringer = !ringer + balloon_alert(usr, "ringer [ringer ? "on" : "off"]!") + return TRUE + + if("vibration") + vibration = !vibration + balloon_alert(usr, "vibration [vibration ? "on" : "off"]!") + return TRUE + + if("speaker") + if(phone_radio.canhear_range == 1) + phone_radio.canhear_range = 3 + balloon_alert(usr, "speaker on!") + else + phone_radio.canhear_range = 1 + balloon_alert(usr, "speaker off!") + return TRUE + + if("mute") + muted = !muted + phone_radio.set_listening(!muted) + balloon_alert(usr, "[muted ? "muted" : "unmuted"]!") + + if("wiki") + wiki_book.display_content(usr) + return FALSE + +/obj/item/smartphone/proc/toggle_screen(mob/user) + if(phone_flags & PHONE_OPEN) + phone_flags &= ~PHONE_OPEN + else + phone_flags |= PHONE_OPEN + icon_state = (phone_flags & PHONE_OPEN) ? "phone_on" : "phone" + inhand_icon_state = (phone_flags & PHONE_OPEN) ? "phone_on" : "phone" + update_icon() diff --git a/modular_darkpack/modules/phones/code/phone.dm b/modular_darkpack/modules/phones/code/phone.dm deleted file mode 100644 index 19ec713b1e77..000000000000 --- a/modular_darkpack/modules/phones/code/phone.dm +++ /dev/null @@ -1,1018 +0,0 @@ -/proc/create_unique_phone_number(exchange = 513) - if(length(GLOB.subscribers_numbers_list) < 1) - create_subscribers_numbers() - var/subscriber_code = pick(GLOB.subscribers_numbers_list) - GLOB.subscribers_numbers_list -= subscriber_code - return "[exchange][subscriber_code]" - -/proc/create_subscribers_numbers() - for(var/i in 1 to 9999) - var/ii = "0000" - switch(i) - if(1 to 9) - ii = "000[i]" - if(10 to 99) - ii = "00[i]" - if(100 to 999) - ii = "0[i]" - if(1000 to 9999) - ii = "[i]" - GLOB.subscribers_numbers_list += ii - -/obj/item/vamp/phone - name = "\improper phone" - desc = "A portable device to call anyone you want." - icon = 'modular_darkpack/modules/phones/icons/phone.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/phones/icons/phone_onfloor.dmi') - icon_state = "phone0" - inhand_icon_state = "phone0" - lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' - righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' - item_flags = NOBLUDGEON - flags_1 = HEAR_1 - w_class = WEIGHT_CLASS_SMALL - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) - resistance_flags = FIRE_PROOF | ACID_PROOF - - var/exchange_num = 513 - var/list/contacts = list() - var/blocked = FALSE - var/list/blocked_contacts = list() - var/closed = TRUE - var/owner = "" - var/number - var/obj/item/vamp/phone/online - var/talking = FALSE - var/choosed_number = "" - var/last_call = 0 - var/call_sound = 'modular_darkpack/modules/deprecated/sounds/call.ogg' - var/can_fold = 1 - var/interface = "Telephone" - var/silence = FALSE - var/toggle_published_contacts = FALSE - var/list/published_numbers_contacts = list() - var/list/phone_history_list = list() - - /// Phone icon states - var/open_state = "phone2" - var/closed_state = "phone1" - var/folded_state = "phone0" - -/obj/item/vamp/phone/Initialize(mapload) - . = ..() - RegisterSignal(src, COMSIG_MOVABLE_HEAR, PROC_REF(handle_hearing)) - if(!number || number == "") - if(ishuman(loc)) - var/mob/living/carbon/human/H_O = loc - owner = H_O.real_name - number = create_unique_phone_number(exchange_num) - GLOB.phone_numbers_list += number - GLOB.phones_list += src - if(ishuman(loc)) - var/mob/living/carbon/human/H = loc - if(H.Myself) - H.Myself.phone_number = number - - AddComponent(/datum/component/violation_observer, FALSE) - -/obj/item/vamp/phone/Destroy() - GLOB.phone_numbers_list -= number - GLOB.phones_list -= src - UnregisterSignal(src, COMSIG_MOVABLE_HEAR) - ..() - -/obj/item/vamp/phone/attack_hand(mob/user) - . = ..() - ui_interact(user) - -/obj/item/vamp/phone/interact(mob/user) - . = ..() - ui_interact(user) - -/obj/item/vamp/phone/ui_interact(mob/user, datum/tgui/ui) - . = ..() - - if(closed) - closed = FALSE - icon_state = open_state - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, interface, interface) - ui.open() - -/obj/item/vamp/phone/click_alt(mob/user) - if(can_fold && !closed) - closed = TRUE - icon_state = folded_state - talking = FALSE - if(online) - online.online = null - online.talking = FALSE - online = null - -/obj/item/vamp/phone/ui_data(mob/user) - var/list/data = list() - data["calling"] = FALSE - if(last_call+100 > world.time && !talking) - data["calling"] = TRUE - - data["online"] = online - data["talking"] = talking - data["my_number"] = choosed_number - data["choosed_number"] = choosed_number - if(online) - data["calling_user"] = "(+1 707) [online.number]" - for(var/datum/phonecontact/P in contacts) - if(P.number == online.number) - data["calling_user"] = P.name - - return data -/* -/obj/item/vamp/phone/proc/OpenMenu(mob/mobila) - var/dat = "<body><center><h2>Phone</h2><BR>" - if(last_call+100 > world.time && !talking) - dat += "Calling...<BR>" - dat += "<a href='byond://?src=[REF(src)];choice=hang'><b>Hang up</b></a><BR>" - else - if(online) - var/who_talking_with = "(+1 707) [online.number]" - for(var/datum/phonecontact/P in contacts) - if(P.number == online.number) - who_talking_with = P.name - if(talking) - dat += "Current call: [who_talking_with]<BR>" - dat += "<a href='byond://?src=[REF(src)];choice=hang'><b>Hang up</b></a><BR>" - else - dat += "[who_talking_with] is calling!<BR>" - dat += "<a href='byond://?src=[REF(src)];choice=accept'><b>Accept</b></a><BR>" - dat += "<a href='byond://?src=[REF(src)];choice=decline'><b>Decline</b></a><BR>" - else - if(number) - dat += "My number is (+1 707) [number]<BR>" - dat += "Typed number: [choosed_number]_<BR>" - dat += "<a href='byond://?src=[REF(src)];choice=1'>1</a>||<a href='byond://?src=[REF(src)];choice=2'>2</a>||<a href='byond://?src=[REF(src)];choice=3'>3</a><BR>" - dat += "<a href='byond://?src=[REF(src)];choice=4'>4</a>||<a href='byond://?src=[REF(src)];choice=5'>5</a>||<a href='byond://?src=[REF(src)];choice=6'>6</a><BR>" - dat += "<a href='byond://?src=[REF(src)];choice=7'>7</a>||<a href='byond://?src=[REF(src)];choice=8'>8</a>||<a href='byond://?src=[REF(src)];choice=9'>9</a><BR>" - dat += "<a href='byond://?src=[REF(src)];choice=space'>_</a>||<a href='byond://?src=[REF(src)];choice=0'>0</a>||<a href='byond://?src=[REF(src)];choice=cage'>#</a><BR>" - dat += "<a href='byond://?src=[REF(src)];choice=reset'>*</a><BR>" - dat += "<a href='byond://?src=[REF(src)];choice=call'><b>Call</b></a><BR>" - dat += "<a href='byond://?src=[REF(src)];choice=contacts'><b>Contacts</b></a><BR>" - dat += "<a href='byond://?src=[REF(src)];choice=add'><b>Add contact</b></a><BR>" - dat += "</center>" - dat += "Ambulance number is: 911<BR>" - dat += "Cleaning services number is: 700 4424<BR>" - dat += "</body>" - mobila << browse(dat, "window=phone;size=250x350;border=1;can_resize=0;can_minimize=0") - onclose(mobila, "phone", src) -*/ - -/obj/item/vamp/phone/ui_act(action, params) - . = ..() - if(.) - return -// var/mob/living/carbon/human/V = usr - - - switch(action) - if("hang") - last_call = 0 - if(talking) - talking = FALSE - if(online) - online.talking = FALSE - if(online) - if(!silence) - playsound(online, 'modular_darkpack/modules/deprecated/sounds/phonestop.ogg', 25, FALSE) - online.online = null - online = null - .= TRUE - if("accept") - if(online) - talking = TRUE - online.online = src - online.talking = TRUE - - var/datum/phonehistory/NEWH_caller = new() - var/datum/phonehistory/NEWH_being_called = new() - - //Being called History - NEWH_being_called.name = "Unknown" - for(var/datum/phonecontact/Contact in contacts) - if(Contact.number == online.number) - //Verify if they have a contact with the number if so, save their name - NEWH_being_called.name = Contact.name - break - NEWH_being_called.number = online.number - NEWH_being_called.time = "[station_time_timestamp("hh:mm")]" - NEWH_being_called.call_type = "I accepted the call" - phone_history_list += NEWH_being_called - - //Caller History - NEWH_caller.name = "Unknown" - for(var/datum/phonecontact/Contact in online.contacts) - if(Contact.number == number) - //Verify if they have a contact with the number if so, save their name - NEWH_caller.name = Contact.name - break - NEWH_caller.number = number - NEWH_caller.time = "[station_time_timestamp("hh:mm")]" - NEWH_caller.call_type = "They accepted the call" - online.phone_history_list += NEWH_caller - .= TRUE - if("decline") - talking = FALSE - if(online) - - if(!silence) - playsound(online, 'modular_darkpack/modules/deprecated/sounds/phonestop.ogg', 25, FALSE) - online.talking = FALSE - - - var/datum/phonehistory/NEWH_caller = new() - var/datum/phonehistory/NEWH_being_called = new() - - //Being called History - NEWH_being_called.name = "Unknown" - for(var/datum/phonecontact/Contact in contacts) - if(Contact.number == online.number) - //Verify if they have a contact with the number if so, save their name - NEWH_being_called.name = Contact.name - break - NEWH_being_called.number = online.number - NEWH_being_called.time = "[station_time_timestamp("hh:mm")]" - NEWH_being_called.call_type = "I declined the call" - phone_history_list += NEWH_being_called - - //Caller History - NEWH_caller.name = "Unknown" - for(var/datum/phonecontact/Contact in online.contacts) - if(Contact.number == number) - //Verify if they have a contact with the number if so, save their name - NEWH_caller.name = Contact.name - break - NEWH_caller.number = number - NEWH_caller.time = "[station_time_timestamp("hh:mm")]" - NEWH_caller.call_type = "They declined the call" - online.phone_history_list += NEWH_caller - - online.online = null - online = null - - .= TRUE - if("call") - choosed_number = replacetext(choosed_number, " ", "") - for(var/obj/item/vamp/phone/PHN in GLOB.phones_list) - //Loop through the Phone Global List - if(PHN.number == choosed_number) - // Verify if number wrote actually meets another PHN(Phone number) in the list - blocked = FALSE // Not blocked YET. - for(var/datum/phonecontact/BlockC in PHN.blocked_contacts) - // Loop through the blocked numbers in the PHN Blocked LIST - if(BlockC.number == number) - // Verify if the caller has their number blocked by the PHN - blocked = TRUE - // If he is, Blocked is TRUE. - to_chat(usr, span_notice("You have been blocked by this number.")) - break - // Stop loops once it is found - if(!blocked) - // If the Caller is not blocked and the PHN is flipped and they are not talking, then the call goes through. - if(!PHN.online && !PHN.talking) - last_call = world.time - online = PHN - PHN.online = src - Recall(online, usr) - var/datum/phonehistory/NEWH_caller = new() - var/datum/phonehistory/NEWH_being_called = new() - if(PHN.number == number) - //Verify if you are calling yourself - NEWH_caller.name = owner - NEWH_caller.call_type = "I called myself" - NEWH_caller.time = "[station_time_timestamp("hh:mm")]" - NEWH_caller.number = number - phone_history_list += NEWH_caller - else - //Caller History - NEWH_caller.name = "Unknown" - for(var/datum/phonecontact/Contact in contacts) - if(Contact.number == PHN.number) - //Verify if they have a contact with the number if so, save their name - NEWH_caller.name = Contact.name - break - NEWH_caller.number = PHN.number - NEWH_caller.time = "[station_time_timestamp("hh:mm")]" - NEWH_caller.call_type = "I called" - phone_history_list += NEWH_caller - - //Being Called History - NEWH_being_called.name = "Unknown" - for(var/datum/phonecontact/Contact in PHN.contacts) - if(Contact.number == number) - //Verify if they have a contact with the number if so, save their name - NEWH_being_called.name = Contact.name - break - NEWH_being_called.number = number - NEWH_being_called.time = "[station_time_timestamp("hh:mm")]" - NEWH_being_called.call_type = "They called me" - PHN.phone_history_list += NEWH_being_called - else - to_chat(usr, span_notice("Abonent is busy.")) - if(!online && !blocked) - // If the phone is not flipped or the phone user has left the city and they are not blocked. - if(choosed_number == "#111") - call_sound = 'modular_darkpack/modules/deprecated/sounds/call.ogg' - to_chat(usr, span_notice("Settings are now reset to default.")) - else if(choosed_number == "#228") - call_sound = 'modular_darkpack/modules/deprecated/sounds/nokia.ogg' - to_chat(usr, span_notice("Code activated.")) - else if(choosed_number == "#666") - call_sound = 'sound/voice/human/malescream_6.ogg' - to_chat(usr, span_notice("Code activated.")) - else if(choosed_number == "#34") - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - H.emote("moan") - to_chat(usr, span_notice("Code activated.")) - else - to_chat(usr, span_notice("Invalid number.")) - .= TRUE - if("contacts") - var/list/options = list("Add","Remove","Choose","Block", "Unblock", "My Number", "Publish Number", "Published Numbers", "Call History", "Delete Call History") - var/option = input(usr, "Select an option", "Contacts Option") as null|anything in options - var/result - switch(option) - if("Publish Number") - if (!islist(GLOB.published_numbers)) - GLOB.published_numbers = list() - if (!islist(GLOB.published_number_names)) - GLOB.published_number_names = list() - - var/name = input(usr, "Input name", "Publish Number") as null|text - if(name && src.number) - name = trim(copytext_char(sanitize(name), 1, MAX_MESSAGE_LEN)) - if(src.number in GLOB.published_numbers) - to_chat(usr, "<span class ='notice'>This number is already published.</span>") - else - GLOB.published_numbers += src.number - GLOB.published_number_names += name - to_chat(usr, span_notice("Your number is now published.")) - for(var/obj/item/vamp/phone/PHN in GLOB.phones_list) - //Gather all the Phones in the game to check if they got the toggle for published contacts - if(PHN.toggle_published_contacts == TRUE) - //If they got it, their published number will be added to those phones - var/datum/phonecontact/NEWC = new() - var/p_number = src.number - NEWC.number = "[p_number]" - NEWC.name = "[name]" - if(NEWC.number != PHN.number) - //Check if it is not your own number that you are adding to contacts - var/GOT_CONTACT = FALSE - for(var/datum/phonecontact/Contact in PHN.contacts) - if(Contact.number == NEWC.number) - //Check if the number is not already in your contact list - GOT_CONTACT = TRUE - break - if(!GOT_CONTACT) - PHN.contacts += NEWC - //to_chat(usr, span_notice("Published numbers: [GLOB.published_numbers]")) - //to_chat(usr, span_notice("Published names: [GLOB.published_number_names]")) - else - to_chat(usr, span_notice("You must input a name to publish your number.")) - - if ("Published Numbers") - var/list_length = min(length(GLOB.published_numbers), length(GLOB.published_number_names)) - for(var/i = 1 to list_length) - var/number = GLOB.published_numbers[i] - var/display_number_first = copytext(number, 1, 4) - var/display_number_second = copytext(number, 4, 8) - var/split_number = display_number_first + " " + display_number_second - var/name = GLOB.published_number_names[i] - to_chat(usr, "- [name]: [split_number]") - if("Add") - var/new_contact = input(usr, "Input phone number", "Add Contact") as null|text - if(new_contact) - new_contact = trim(copytext_char(sanitize(new_contact), 1, MAX_MESSAGE_LEN)) - var/datum/phonecontact/NEWC = new() - new_contact = replacetext(new_contact, " ", "") //Removes spaces - NEWC.number = "[new_contact]" - contacts += NEWC - var/new_contact_name = input(usr, "Input name", "Add Contact") as null|text - new_contact_name = trim(copytext_char(sanitize(new_contact_name), 1, MAX_MESSAGE_LEN)) - if(new_contact_name) - NEWC.name = "[new_contact_name]" - else - var/numbrr = length(contacts)+1 - NEWC.name = "Contact [numbrr]" - if("Remove") - var/list/removing = list() - for(var/datum/phonecontact/CNT_REMOVE in contacts) - removing += CNT_REMOVE.name - if(length(removing) >= 1) - result = input(usr, "Select a contact", "Contact Selection") as null|anything in removing - if(result) - for(var/datum/phonecontact/CNT_REMOVE in contacts) - if(CNT_REMOVE.name == result) - contacts -= CNT_REMOVE - if("Choose") - var/list/shit = list() - for(var/datum/phonecontact/CNTCT in contacts) - shit += CNTCT.name - if(length(shit) >= 1) - result = input(usr, "Select a contact", "Contact Selection") as null|anything in shit - if(result) - for(var/datum/phonecontact/CNTCT in contacts) - if(CNTCT.name == result) - if(CNTCT.number == "") - CNTCT.check_global_contacts() - if(CNTCT.number == "") - to_chat(usr, span_notice("Sorry, [CNTCT.name] does not have a number.")) - choosed_number = CNTCT.number - if("Block") - var/block_number = input(usr, "Input phone number", "Block Number") as text|null - if(block_number) - var/datum/phonecontact/BlockC = new() - block_number = replacetext(block_number, " ", "") //Removes spaces - BlockC.number = "[block_number]" - blocked_contacts += BlockC - var/block_contact_name = input(usr, "Input name", "Add name of the Blocked number") as text|null - if(block_contact_name) - BlockC.name = "[block_contact_name]" - else - var/number = length(blocked_contacts)+1 - BlockC.name = "Blocked [number]" - if("Unblock") - var/list/unblocking = list() - for(var/datum/phonecontact/CNT_UNBLOCK in blocked_contacts) - unblocking += CNT_UNBLOCK.name - if(length(unblocking) >= 1) - result = input(usr, "Select a blocked number", "Blocked Selection") as null|anything in unblocking - if(result) - for(var/datum/phonecontact/CNT_UNBLOCK in blocked_contacts) - if(CNT_UNBLOCK.name == result) - blocked_contacts -= CNT_UNBLOCK - if("Call History") - if(phone_history_list.len > 0) - for(var/datum/phonehistory/PH in phone_history_list) - //loop through the phone_history_list searching for a phonehistory datums and display them. - var/display_number_first = copytext(PH.number, 1, 4) - var/display_number_second = copytext(PH.number, 4, 8) - var/split_number = display_number_first + " " + display_number_second - to_chat(usr, "# [PH.call_type]: [PH.name] , [split_number] at [PH.time]") - else - to_chat(usr, "You have no call history.") //PSEUDO_M return to fix all this - if("Delete Call History") - if(phone_history_list.len > 0) - to_chat(usr, "Your total amount of history saved is: [phone_history_list.len]") - var/number_of_deletions = text2num(input(usr, "Input the amount that you want to delete", "Deletion Amount") as null|text) - //Delete the call history depending on the amount inputed by the User - if(number_of_deletions > phone_history_list.len) - // Verify if the requested amount in bigger than the history list. - to_chat(usr, "You cannot delete more items than the history contains.") - else - for(var/i = 1 to number_of_deletions) - //It will always delete the first item of the list, so the last logs are deleted first - var/item_to_remove = phone_history_list[1] - phone_history_list -= item_to_remove - to_chat(usr, "[number_of_deletions] call history entries were deleted. Remaining: [phone_history_list.len]") - - else - to_chat(usr, "You have no call history to delete it.") - if("My Number") - var/number_first_part = copytext(number, 1, 4) - var/number_second_part = copytext(number, 4, 8) - to_chat(usr, number_first_part + " " + number_second_part) - .= TRUE - if("settings") - //Wrench Icon, more focused on toggles or later more complex options. - var/list/options = list("Notifications and Sounds Toggle", "Published Numbers as Contacts Toggle") - var/option = input(usr, "Select a setting", "Settings Selection") as null|anything in options - switch(option) - if("Notifications and Sounds Toggle") - if(!silence) - //If it is true, it will check all the other sounds for phone and disable them - silence = TRUE - to_chat(usr, span_notice("Notifications and Sounds toggled off.")) - else - silence = FALSE - to_chat(usr, span_notice("Notifications and Sounds toggled on.")) - if ("Published Numbers as Contacts Toggle") - if(!toggle_published_contacts) - var/contacts_added_lenght = published_numbers_contacts.len - var/list_length = min(length(GLOB.published_numbers), length(GLOB.published_number_names)) - log_admin(contacts_added_lenght) - log_admin(list_length) - if(contacts_added_lenght < list_length) - // checks the size difference between the GLOB published list and the phone published list - var/ADDED_CONTACTS = 0 - to_chat(usr, span_notice("New contacts are being added to your contact list.")) - for(var/i = 1 to list_length) - var/number_v = GLOB.published_numbers[i] - var/name_v = GLOB.published_number_names[i] - var/datum/phonecontact/NEWC = new() - NEWC.number = "[number_v]" - NEWC.name = "[name_v]" - if(NEWC.number != number) - //Check if it is not your own number that you are adding to contacts - var/GOT_CONTACT = FALSE - for(var/datum/phonecontact/Contact in contacts) - //Check if the number is not already in your contact list - if(Contact.number == NEWC.number) - GOT_CONTACT = TRUE - break - if(!GOT_CONTACT) - contacts += NEWC - published_numbers_contacts += NEWC - ADDED_CONTACTS +=1 - if(ADDED_CONTACTS > 1) - to_chat(usr, span_notice("New contacts are added to your contact list.")) - else if(contacts_added_lenght == list_length) - to_chat(usr, span_notice("You have all the contacts in the published list already.")) - toggle_published_contacts = TRUE - to_chat(usr, span_notice("The toggle of the published numbers in contacts is active.")) - else - toggle_published_contacts = FALSE - to_chat(usr, span_notice("The toggle of the published numbers in contacts is disabled.")) - .= TRUE - if("keypad") - if(!silence) - playsound(loc, 'sound/machines/terminal_select.ogg', 15, TRUE) - switch(params["value"]) - if("C") - choosed_number = "" - .= TRUE - return - if("_") - choosed_number += " " - .= TRUE - return - - choosed_number += params["value"] - .= TRUE - - return FALSE - - -/obj/item/vamp/phone/proc/add_important_contacts() - var/mob/living/L - if(isliving(loc)) - L = loc - for(var/datum/phonecontact/PHNCNTCT in contacts) - if(PHNCNTCT.check_global_contacts()) - if(L) - to_chat(L, span_notice("Some important contacts in your phone work again.")) - -/*obj/item/vamp/phone/proc/publish_number(var/name) - var/list/entry = list("number" = src.number, "name" = name) - published_numbers |= entry - -/obj/item/vamp/phone/proc/view_published_numbers() - var/list/display = list() - for(var/list/entry in published_numbers) - display |= "[entry["name"]]: [entry["number"]] - return display"*/ - -/obj/item/vamp/phone/proc/Recall(obj/item/vamp/phone/abonent, mob/usar) - if(last_call+100 <= world.time && !talking) - last_call = 0 - if(online) - if(online.silence == FALSE) - playsound(src, 'modular_darkpack/modules/deprecated/sounds/phonestop.ogg', 25, FALSE) - online.online = null - online = null - if(!talking && online) - if(online.silence == FALSE) - playsound(src, 'modular_darkpack/modules/deprecated/sounds/phone.ogg', 10, FALSE) - playsound(online, online.call_sound, 25, FALSE) - addtimer(CALLBACK(src, PROC_REF(Recall), online, usar), 20) -// usar << browse(null, "window=phone") -// OpenMenu(usar) -/* -/obj/item/vamp/phone/Topic(href, href_list) - ..() - var/mob/living/U = usr - if(usr.canUseTopic(src, FALSE, FALSE, NO_TK) && !href_list["close"] && !closed) - switch(href_list["choice"]) - if("hang") - last_call = 0 - if(talking) - talking = FALSE - if(online) - online.talking = FALSE - if(online) - playsound(online, 'modular_darkpack/modules/deprecated/sounds/phonestop.ogg', 25, FALSE) - online.online = null - online = null - if("accept") - if(online) - talking = TRUE - online.online = src - online.talking = TRUE - for(var/mob/living/L in oviewers(online)) - L << browse(null, "window=phone") - online.OpenMenu(L) - if("decline") - talking = FALSE - if(online) - playsound(online, 'modular_darkpack/modules/deprecated/sounds/phonestop.ogg', 25, FALSE) - online.online = null - online.talking = FALSE - online = null - if("call") - for(var/obj/item/vamp/phone/PHN in GLOB.phones_list) - if(PHN.number == choosed_number) - if(!PHN.online && !PHN.talking) - last_call = world.time - online = PHN - PHN.online = src - Recall(online, usr) - else - to_chat(usr, span_notice("Abonent is busy.")) - if(online) - for(var/mob/living/L in oviewers(online)) - L << browse(null, "window=phone") - online.OpenMenu(L) - else - if(choosed_number == "#111") - call_sound = 'modular_darkpack/modules/deprecated/sounds/call.ogg' - to_chat(usr, span_notice("Settings are now reset to default.")) - else if(choosed_number == "#228") - call_sound = 'modular_darkpack/modules/deprecated/sounds/nokia.ogg' - to_chat(usr, span_notice("Code activated.")) - else if(choosed_number == "#666") - call_sound = 'sound/voice/human/malescream_6.ogg' - to_chat(usr, span_notice("Code activated.")) - else if(choosed_number == "#34") - usr << link("https://rule34.xxx/index.php?page=post&s=list&tags=werewolf") - to_chat(usr, span_notice("Code activated.")) - else - to_chat(usr, span_notice("Invalid number.")) - if("contacts") - var/list/shit = list() - for(var/datum/phonecontact/CNTCT in contacts) - shit += CNTCT.name - if(length(shit) >= 1) - var/result = input(usr, "Select a contact", "Contact Selection") as null|anything in shit - if(result) - for(var/datum/phonecontact/CNTCT in contacts) - if(CNTCT.name == result) - if(CNTCT.number == "") - CNTCT.check_global_contacts() - if(CNTCT.number == "") - to_chat(usr, span_notice("Sorry, [CNTCT.name] still got no actual number.")) - choosed_number = CNTCT.number - if("add") - var/new_contact = input(usr, "Input phone number", "Add Contact") as text|null - if(new_contact) - var/datum/phonecontact/NEWC = new() - NEWC.number = "[new_contact]" - contacts += NEWC - var/new_contact_name = input(usr, "Input name", "Add Contact") as text|null - if(new_contact_name) - NEWC.name = "[new_contact_name]" - else - var/numbrr = length(contacts)+1 - NEWC.name = "Contact [numbrr]" - if("1") - choosed_number += "1" - if("2") - choosed_number += "2" - if("3") - choosed_number += "3" - if("4") - choosed_number += "4" - if("5") - choosed_number += "5" - if("6") - choosed_number += "6" - if("7") - choosed_number += "7" - if("8") - choosed_number += "8" - if("9") - choosed_number += "9" - if("0") - choosed_number += "0" - if("space") - choosed_number += " " - if("cage") - choosed_number += "#" - if("reset") - choosed_number = "" - U << browse(null, "window=phone") - OpenMenu(usr) - playsound(loc, 'sound/machines/terminal_select.ogg', 15, TRUE) - else - U << browse(null, "window=phone") -*/ - - -/obj/item/vamp/phone/proc/handle_hearing(datum/source, list/hearing_args) - var/message = hearing_args[HEARING_RAW_MESSAGE] - if(online && talking) - if(hearing_args[HEARING_SPEAKER]) - if(isliving(hearing_args[HEARING_SPEAKER])) - var/voice_saying = "unknown voice" - var/spchspn = SPAN_ROBOT - switch(get_dist(src, hearing_args[HEARING_SPEAKER])) - if(3 to INFINITY) - return - if(1 to 2) - spchspn = "small" - else - spchspn = SPAN_ROBOT - if(ishuman(hearing_args[HEARING_SPEAKER])) - var/mob/living/carbon/human/SPK = hearing_args[HEARING_SPEAKER] - voice_saying = "[age2agedescription(SPK.age)] [SPK.gender] voice ([SPK.phonevoicetag])" - - // Speech will be scrambled if the speaker doesn't work well with technology - if (HAS_TRAIT(SPK, TRAIT_REJECTED_BY_TECHNOLOGY)) - message = scramble_lasombra_message(message) - playsound(online, 'modular_darkpack/modules/deprecated/sounds/lasombra_whisper.ogg', 50, FALSE) - else - playsound(online, 'modular_darkpack/modules/deprecated/sounds/phonetalk.ogg', 50, FALSE) - - var/obj/phonevoice/VOIC = new(online) - VOIC.name = voice_saying - VOIC.speech_span = spchspn - VOIC.say("[message]") - qdel(VOIC) - -/obj/item/vamp/phone/street - desc = "An ordinary street payphone" - onflooricon = null - icon_state = "payphone" - anchored = TRUE - number = "1447" - can_fold = 0 - - /// Phone icon states - open_state = "payphone" - closed_state = "payphone" - folded_state = "payphone" - -/obj/item/vamp/phone/clean - desc = "The usual phone of a cleaning company used to communicate with employees" - onflooricon = null - icon_state = "redphone" - anchored = TRUE - number = "700 4424" - can_fold = 0 - - open_state = "redphone" - closed_state = "redphone" - folded_state = "redphone" - -/obj/item/vamp/phone/emergency - desc = "The 911 dispatch phone" - onflooricon = null - icon_state = "redphone" - anchored = TRUE - number = "911" - can_fold = 0 - open_state = "redphone" - closed_state = "redphone" - folded_state = "redphone" - var/obj/machinery/p25transceiver/clinic_transceiver - var/obj/machinery/p25transceiver/police_transceiver - -/obj/item/vamp/phone/emergency/Initialize(mapload) - . = ..() - GLOB.phone_numbers_list += number - GLOB.phones_list += src - -/obj/item/vamp/phone/clean/Initialize(mapload) - . = ..() - GLOB.phone_numbers_list += number - GLOB.phones_list += src - -/// Phone Types - -/obj/item/vamp/phone/prince - exchange_num = 267 - -/obj/item/vamp/phone/prince/Initialize(mapload) - ..() - GLOB.princenumber = number - GLOB.princename = owner - var/datum/phonecontact/sheriff/SHERIFF = new() - contacts += SHERIFF - var/datum/phonecontact/clerk/CLERK = new() - contacts += CLERK - var/datum/phonecontact/barkeeper/BARKEEPER = new() - contacts += BARKEEPER - var/datum/phonecontact/tremere/REGENT = new() - contacts += REGENT - var/datum/phonecontact/dealer/DEALER = new() - contacts += DEALER - var/datum/phonecontact/malkavian/M = new() - contacts += M - var/datum/phonecontact/nosferatu/N = new() - contacts += N - var/datum/phonecontact/toreador/T = new() - contacts += T - var/datum/phonecontact/ventrue/V = new() - contacts += V - var/datum/phonecontact/brujah/B = new() - contacts += B - -/obj/item/vamp/phone/sheriff - exchange_num = 267 - -/obj/item/vamp/phone/sheriff/Initialize(mapload) - ..() - GLOB.sheriffnumber = number - GLOB.sheriffname = owner - var/datum/phonecontact/prince/PRINCE = new() - contacts += PRINCE - var/datum/phonecontact/clerk/CLERK = new() - contacts += CLERK - var/datum/phonecontact/dealer/DEALER = new() - contacts += DEALER - -/obj/item/vamp/phone/clerk - exchange_num = 267 - -/obj/item/vamp/phone/clerk/Initialize(mapload) - ..() - GLOB.clerknumber = number - GLOB.clerkname = owner - var/datum/phonecontact/prince/PRINCE = new() - contacts += PRINCE - var/datum/phonecontact/sheriff/SHERIFF = new() - contacts += SHERIFF - var/datum/phonecontact/tremere/REGENT = new() - contacts += REGENT - var/datum/phonecontact/dealer/DEALER = new() - contacts += DEALER - var/datum/phonecontact/malkavian/M = new() - contacts += M - var/datum/phonecontact/nosferatu/N = new() - contacts += N - var/datum/phonecontact/toreador/T = new() - contacts += T - var/datum/phonecontact/ventrue/V = new() - contacts += V - var/datum/phonecontact/brujah/B = new() - contacts += B - -/obj/item/vamp/phone/barkeeper - exchange_num = 485 - -/obj/item/vamp/phone/barkeeper/Initialize(mapload) - ..() - GLOB.barkeepernumber = number - GLOB.barkeepername = owner - var/datum/phonecontact/prince/PRINCE = new() - contacts += PRINCE - var/datum/phonecontact/dealer/DEALER = new() - contacts += DEALER - -/obj/item/vamp/phone/dealer - exchange_num = 485 - -/obj/item/vamp/phone/dealer/Initialize(mapload) - ..() - GLOB.dealernumber = number - GLOB.dealername = owner - var/datum/phonecontact/prince/PRINCE = new() - contacts += PRINCE - var/datum/phonecontact/sheriff/SHERIFF = new() - contacts += SHERIFF - var/datum/phonecontact/clerk/CLERK = new() - contacts += CLERK - var/datum/phonecontact/barkeeper/BARKEEPER = new() - contacts += BARKEEPER - -/obj/item/vamp/phone/supply_tech/Initialize(mapload) - ..() - var/datum/phonecontact/dealer/DEALER = new() - contacts += DEALER - -/obj/item/vamp/phone/camarilla - exchange_num = 267 - -/obj/item/vamp/phone/camarilla/Initialize(mapload) - ..() -// GLOB.dealernumber = number - var/datum/phonecontact/prince/PRINCE = new() - contacts += PRINCE - var/datum/phonecontact/clerk/CLERK = new() - contacts += CLERK - -/obj/item/vamp/phone/anarch - exchange_num = 485 - -/obj/item/vamp/phone/anarch/Initialize(mapload) - ..() -// GLOB.dealernumber = number - var/datum/phonecontact/barkeeper/BARKEEPER = new() - contacts += BARKEEPER - -/obj/item/vamp/phone/malkavian/Initialize(mapload) - ..() - GLOB.malkaviannumber = number - GLOB.malkavianname = owner - var/datum/phonecontact/prince/PRINCE = new() - contacts += PRINCE - var/datum/phonecontact/tremere/REGENT = new() - contacts += REGENT - var/datum/phonecontact/nosferatu/N = new() - contacts += N - var/datum/phonecontact/toreador/T = new() - contacts += T - var/datum/phonecontact/ventrue/V = new() - contacts += V - var/datum/phonecontact/brujah/B = new() - contacts += B - -/obj/item/vamp/phone/nosferatu/Initialize(mapload) - ..() - GLOB.nosferatunumber = number - GLOB.nosferatuname = owner - var/datum/phonecontact/prince/PRINCE = new() - contacts += PRINCE - var/datum/phonecontact/tremere/REGENT = new() - contacts += REGENT - var/datum/phonecontact/malkavian/M = new() - contacts += M - var/datum/phonecontact/toreador/T = new() - contacts += T - var/datum/phonecontact/ventrue/V = new() - contacts += V - var/datum/phonecontact/brujah/B = new() - contacts += B - -/obj/item/vamp/phone/toreador/Initialize(mapload) - ..() - GLOB.toreadornumber = number - GLOB.toreadorname = owner - var/datum/phonecontact/prince/PRINCE = new() - contacts += PRINCE - var/datum/phonecontact/tremere/REGENT = new() - contacts += REGENT - var/datum/phonecontact/malkavian/M = new() - contacts += M - var/datum/phonecontact/nosferatu/N = new() - contacts += N - var/datum/phonecontact/ventrue/V = new() - contacts += V - var/datum/phonecontact/brujah/B = new() - contacts += B - -/obj/item/vamp/phone/brujah/Initialize(mapload) - ..() - GLOB.brujahnumber = number - GLOB.brujahname = owner - var/datum/phonecontact/prince/PRINCE = new() - contacts += PRINCE - var/datum/phonecontact/tremere/REGENT = new() - contacts += REGENT - var/datum/phonecontact/malkavian/M = new() - contacts += M - var/datum/phonecontact/nosferatu/N = new() - contacts += N - var/datum/phonecontact/toreador/T = new() - contacts += T - var/datum/phonecontact/ventrue/V = new() - contacts += V - -/obj/item/vamp/phone/ventrue/Initialize(mapload) - ..() - GLOB.ventruenumber = number - GLOB.ventruename = owner - var/datum/phonecontact/prince/PRINCE = new() - contacts += PRINCE - var/datum/phonecontact/tremere/REGENT = new() - contacts += REGENT - var/datum/phonecontact/malkavian/M = new() - contacts += M - var/datum/phonecontact/nosferatu/N = new() - contacts += N - var/datum/phonecontact/toreador/T = new() - contacts += T - var/datum/phonecontact/brujah/B = new() - contacts += B - -/obj/item/vamp/phone/tremere/Initialize(mapload) - ..() - GLOB.tremerenumber = number - GLOB.tremerename = owner - var/datum/phonecontact/prince/PRINCE = new() - contacts += PRINCE - var/datum/phonecontact/malkavian/M = new() - contacts += M - var/datum/phonecontact/nosferatu/N = new() - contacts += N - var/datum/phonecontact/toreador/T = new() - contacts += T - var/datum/phonecontact/ventrue/V = new() - contacts += V - var/datum/phonecontact/brujah/B = new() - contacts += B - -/obj/item/vamp/phone/archivist/Initialize(mapload) - ..() - var/datum/phonecontact/tremere/REGENT = new() - contacts += REGENT - - diff --git a/modular_darkpack/modules/phones/code/phone_book.dm b/modular_darkpack/modules/phones/code/phone_book.dm index 2d52413b7bc5..f5d6b2b7ec5e 100644 --- a/modular_darkpack/modules/phones/code/phone_book.dm +++ b/modular_darkpack/modules/phones/code/phone_book.dm @@ -8,5 +8,5 @@ /obj/item/phone_book/attack_self(mob/user) . = ..() - for(var/i in GLOB.phone_numbers_list) - to_chat(user, "- [i]") + for(var/i as anything in SSphones.assigned_phone_numbers) + to_chat(user, "[SSphones.assigned_phone_numbers[i]]") diff --git a/modular_darkpack/modules/phones/code/phone_contact.dm b/modular_darkpack/modules/phones/code/phone_contact.dm index f4ba8ad7906d..49dacbaad15c 100644 --- a/modular_darkpack/modules/phones/code/phone_contact.dm +++ b/modular_darkpack/modules/phones/code/phone_contact.dm @@ -1,126 +1,33 @@ -/datum/phonecontact - var/name = "Unknown" - var/number = "" - var/name_check = "" - -/datum/phonecontact/New() - ..() - check_global_contacts() - -/datum/phonecontact/proc/check_global_contacts() - return FALSE -//Normal phones won't use check_global_contacts, they can't add any of GLOB contacts. -//Remember to set the job of the phone with "my_contact_is_important = TRUE", or the check_global_contacts proc won't get activate automatically - - -/datum/phonecontact/brujah - name = "Primogen Brujah" - -/datum/phonecontact/brujah/check_global_contacts() - if(number != GLOB.brujahnumber && name_check != GLOB.brujahname) - number = GLOB.brujahnumber - name = GLOB.brujahname + " - " + name - return TRUE - ..() - -/datum/phonecontact/malkavian - name = "Primogen Malkavian" - -/datum/phonecontact/malkavian/check_global_contacts() - if(number != GLOB.malkaviannumber && name_check != GLOB.malkavianname) - number = GLOB.malkaviannumber - name = GLOB.malkavianname + " - " + name - return TRUE - ..() - -/datum/phonecontact/nosferatu - name = "Primogen Nosferatu" - -/datum/phonecontact/nosferatu/check_global_contacts() - if(number != GLOB.nosferatunumber && name_check != GLOB.nosferatuname ) - number = GLOB.nosferatunumber - name = GLOB.nosferatuname + " - " + name - return TRUE - ..() - -/datum/phonecontact/toreador - name = "Primogen Toreador" - -/datum/phonecontact/toreador/check_global_contacts() - if(number != GLOB.toreadornumber && name_check != GLOB.toreadorname) - number = GLOB.toreadornumber - name = GLOB.toreadorname + " - " + name - return TRUE - ..() - -/datum/phonecontact/ventrue - name = "Primogen Ventrue" +/datum/contact_network + var/list/contacts = null + var/our_role = null -/datum/phonecontact/ventrue/check_global_contacts() - if(number != GLOB.ventruenumber && name_check != GLOB.ventruename) - number = GLOB.ventruenumber - name = GLOB.ventruename + " - " + name - return TRUE - ..() +/datum/contact_network/New(list/contacts, our_role) + src.contacts = contacts + src.our_role = our_role -/datum/phonecontact/prince - name = "Prince" - -/datum/phonecontact/prince/check_global_contacts() - if(number != GLOB.princenumber && name_check != GLOB.princename) - number = GLOB.princenumber - name = GLOB.princename + " - " + name - return TRUE - ..() - -/datum/phonecontact/sheriff - name = "Sheriff" - -/datum/phonecontact/sheriff/check_global_contacts() - if(number != GLOB.sheriffnumber && name_check != GLOB.sheriffname) - number = GLOB.sheriffnumber - name = GLOB.sheriffname + " - " + name - return TRUE - ..() - -/datum/phonecontact/clerk - name = "Seneschal" - -/datum/phonecontact/clerk/check_global_contacts() - if(number != GLOB.clerknumber && name_check != GLOB.clerkname) - number = GLOB.clerknumber - name = GLOB.clerkname + " - " + name - return TRUE - ..() - -/datum/phonecontact/barkeeper - name = "Baron" - -/datum/phonecontact/barkeeper/check_global_contacts() - if(number != GLOB.barkeepernumber && name_check != GLOB.barkeepername) - number = GLOB.barkeepernumber - name = GLOB.barkeepername + " - " + name - return TRUE - ..() - -/datum/phonecontact/dealer - name = "Dealer" - -/datum/phonecontact/dealer/check_global_contacts() - if(number != GLOB.dealernumber && name_check != GLOB.dealername) - number = GLOB.dealernumber - name = GLOB.dealername + " - " + name - return TRUE - ..() - -/datum/phonecontact/tremere - name = "Tremere Regent" - -/datum/phonecontact/tremere/check_global_contacts() - if(number != GLOB.tremerenumber && name_check != GLOB.tremerename) - number = GLOB.tremerenumber - name = GLOB.tremerename + " - " + name - return TRUE - ..() +/datum/contact + var/name = "Unknown" + var/number = null + var/role = null + var/datum/weakref/phone_ref = null + +/datum/contact/New(name, number, role, phone_ref) + if(!isnull(name)) + src.name = name + if(!isnull(number)) + src.number = number + if(!isnull(role)) + src.role = role + if(!isnull(phone_ref)) + src.phone_ref = phone_ref +/datum/phonecontact + var/name = "Unknown" + var/number = "" +/datum/phonecontact/New(name, number) + if(!isnull(name)) + src.name = name + if(!isnull(number)) + src.number = number diff --git a/modular_darkpack/modules/phones/code/phone_globals.dm b/modular_darkpack/modules/phones/code/phone_globals.dm deleted file mode 100644 index db176422b381..000000000000 --- a/modular_darkpack/modules/phones/code/phone_globals.dm +++ /dev/null @@ -1,9 +0,0 @@ -GLOBAL_LIST_EMPTY(subscribers_numbers_list) -/// Numbers of all existing phones -GLOBAL_LIST_EMPTY(phone_numbers_list) -/// All existing cellphones -GLOBAL_LIST_EMPTY(phones_list) -/// Phone numbers that have been made publicly known -GLOBAL_LIST_EMPTY(published_numbers) -/// Names attached to publicly known phone numbers -GLOBAL_LIST_EMPTY(published_number_names) diff --git a/modular_darkpack/modules/phones/code/phone_history.dm b/modular_darkpack/modules/phones/code/phone_history.dm index 8ae80e47459a..49c6c20adb4c 100644 --- a/modular_darkpack/modules/phones/code/phone_history.dm +++ b/modular_darkpack/modules/phones/code/phone_history.dm @@ -1,5 +1,6 @@ -/datum/phonehistory - var/name = "Unknown" +/datum/phone_history + var/name = "" var/number = "" var/time = "" var/call_type = "" + var/call_type_tooltip = "" diff --git a/modular_darkpack/modules/phones/code/phone_procs.dm b/modular_darkpack/modules/phones/code/phone_procs.dm new file mode 100644 index 000000000000..7b4f4d54c4dc --- /dev/null +++ b/modular_darkpack/modules/phones/code/phone_procs.dm @@ -0,0 +1,222 @@ +// Updates the phone's contacts, for when a new contact joins the game. +/obj/item/smartphone/proc/update_contacts() + for(var/datum/contact_network/contact_network as anything in contact_networks) + for(var/datum/contact/our_contact in contact_network.contacts) + if(our_contact.number == sim_card.phone_number) + continue + + var/already_in_contact = FALSE + for(var/datum/phonecontact/phone_contact as anything in contacts) + if(our_contact.number == phone_contact.number) + already_in_contact = TRUE + break + if(already_in_contact) + continue + + var/contact_name = "[our_contact.name] - [our_contact.role]" + var/new_phone_contact = new /datum/phonecontact(contact_name, our_contact.number) + contacts |= new_phone_contact + +// Gets the displayed contact's name if they are in contacts or published. If not, show the number. +/obj/item/smartphone/proc/get_number_contact_name() + var/output_user + var/calling = incoming_phone_number + if(dialed_number) + calling = dialed_number + // Default to the contact name calling the phone. + for(var/datum/phonecontact/contact in contacts) + if(contact.number == calling) + output_user = contact.name + // If we dont have a contact name, refer to the published listings. + if(!output_user) + for(var/contact as anything in SSphones.published_phone_numbers) + if(calling == SSphones.published_phone_numbers[contact]) + output_user = contact + // Not in our contacts or published listings? Then resolve to showing the phone number. + if(!output_user) + output_user = "+" + calling + return output_user + +// Helper proc to add a history log to the phone's records. +/obj/item/smartphone/proc/add_phone_call_history(call_type, call_type_tooltip) + var/datum/phone_history/new_contact = new() + new_contact.name = get_number_contact_name() + new_contact.number = dialed_number ? dialed_number : incoming_phone_number + new_contact.call_type = call_type + new_contact.call_type_tooltip = call_type_tooltip + new_contact.time = station_time_timestamp("hh:mm:ss") + phone_history_list += new_contact + +/obj/item/smartphone/proc/set_phone_state(new_state) + if(current_state == new_state) + return + current_state = new_state + + if(current_state == PHONE_AVAILABLE) + dialed_number = null + incoming_phone_number = null + if(current_state == PHONE_RINGING) + START_PROCESSING(SSprocessing, src) + + if(current_state == PHONE_IN_CALL || current_state == PHONE_AVAILABLE) + if(phone_ringing_timer) + deltimer(phone_ringing_timer) + STOP_PROCESSING(SSprocessing, src) + +/obj/item/smartphone/proc/check_missing_sim_card(mob/user) + if(phone_flags & PHONE_NO_SIM) + balloon_alert(user, "no SIM!") + return TRUE + return FALSE + +/obj/item/smartphone/proc/check_phone_busy(mob/user, obj/item/smartphone/calling_smartphone) + if(calling_smartphone.current_state > PHONE_AVAILABLE) + balloon_alert(user, "busy!") + return TRUE + if(calling_smartphone.sim_card?.phone_number == sim_card?.phone_number) + balloon_alert(user, "busy!") + return TRUE + return FALSE + +/////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Used for when the calling phone starts a phone call. +/obj/item/smartphone/proc/start_phone_call(mob/user, called_phone_number) + if(check_missing_sim_card(user)) + return + + var/obj/item/smartphone/calling_smartphone = SSphones.get_phone_from_number(called_phone_number) + if(!calling_smartphone) + return + if(check_phone_busy(user, calling_smartphone)) + return + dialed_number = called_phone_number + calling_smartphone.incoming_phone_number = sim_card.phone_number + calling_smartphone.receive_phone_call() + phone_ringing_timer = addtimer(CALLBACK(src, PROC_REF(set_phone_available)), TIME_TO_RING, TIMER_STOPPABLE | TIMER_DELETE_ME) + add_phone_call_history(PHONE_CALL_SENT, PHONE_CALL_SENT_TOOLTIP) + set_phone_state(PHONE_CALLING) + +// Used for when the receiving phone picks up a phone call. +/obj/item/smartphone/proc/accept_phone_call(mob/user) + if(check_missing_sim_card(user)) + return + add_phone_call_history(PHONE_CALL_ACCEPTED, PHONE_CALL_ACCEPTED_TOOLTIP) + establish_call_connection(incoming_phone_number) + +// Used for when the receiving phone declines a phone call. +/obj/item/smartphone/proc/decline_phone_call() + add_phone_call_history(PHONE_CALL_DECLINED, PHONE_CALL_DECLINED_TOOLTIP) + terminate_call_connection() + +// Used for when the receiving phone or the calling phone end the phone call after it has started. +/obj/item/smartphone/proc/end_phone_call() + add_phone_call_history(PHONE_CALL_ENDED, PHONE_CALL_ENDED_TOOLTIP) + terminate_call_connection() + +// Used for when the calling phone ends the phone call before the receiving phone picks up. +/obj/item/smartphone/proc/hang_up_phone_call(called_phone_number) + set_phone_state(PHONE_AVAILABLE) + var/obj/item/smartphone/calling_smartphone = SSphones.get_phone_from_number(called_phone_number) + if(!calling_smartphone) + return + calling_smartphone.miss_phone_call() + +// Used for when the receiving phone gets a notification that they are being called by incoming_phone_number. +/obj/item/smartphone/proc/receive_phone_call() + set_phone_state(PHONE_RINGING) + phone_ringing_timer = addtimer(CALLBACK(src, PROC_REF(miss_phone_call)), TIME_TO_RING, TIMER_STOPPABLE | TIMER_DELETE_ME) + add_phone_call_history(PHONE_CALL_RECEIVED, PHONE_CALL_RECEIVED_TOOLTIP) + +// Used for when the receiving phone fails to pick up the phone call in time. +/obj/item/smartphone/proc/miss_phone_call() + add_phone_call_history(PHONE_CALL_MISSED, PHONE_CALL_MISSED_TOOLTIP) + set_phone_state(PHONE_AVAILABLE) + +// General purpose failsafe of setting it to its proper state. +/obj/item/smartphone/proc/set_phone_available() + set_phone_state(PHONE_AVAILABLE) + +#define VIBRATION_LOOP_DURATION (1 SECONDS) + +// Only used to indicate to the receiving phone that they are being called. +/obj/item/smartphone/process(seconds_per_tick) + if(!COOLDOWN_FINISHED(src, ringer_cooldown)) + return + COOLDOWN_START(src, ringer_cooldown, 4 SECONDS) + if(vibration) + animate(src, pixel_w = 1, time = 0.1 SECONDS, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) + for(var/i in 1 to VIBRATION_LOOP_DURATION / (0.2 SECONDS)) //desired total duration divided by the iteration duration to give the necessary iteration count + animate(pixel_w = -2, time = 0.1 SECONDS, flags = ANIMATION_RELATIVE|ANIMATION_CONTINUE) + animate(pixel_w = 2, time = 0.1 SECONDS, flags = ANIMATION_RELATIVE|ANIMATION_CONTINUE) + animate(pixel_w = -1, time = 0.1 SECONDS, flags = ANIMATION_RELATIVE) + balloon_alert_to_viewers(pick("zzZz!", "ZZZT!", "zZzZ!", "Zzz...", "zzZ...", "ZzZZT!"), vision_distance = COMBAT_MESSAGE_RANGE) + if(ringer) + playsound(src, call_sound, 50, TRUE, 0, 2) + +#undef VIBRATION_LOOP_DURATION + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Internal only proc, used for establlishing a call connection. +/obj/item/smartphone/proc/establish_call_connection() + PROTECTED_PROC(TRUE) + + var/obj/item/smartphone/calling_smartphone = SSphones.get_phone_from_number(incoming_phone_number) + if(!calling_smartphone) + return + + // Establish a secure connection. + secure_frequency = SSphones.establish_secure_frequency() + calling_smartphone.secure_frequency = secure_frequency + + // Set the phone radios. + set_phone_radio(TRUE) + calling_smartphone.set_phone_radio(TRUE) + + // Set proper phone state. + set_phone_state(PHONE_IN_CALL) + calling_smartphone.set_phone_state(PHONE_IN_CALL) + + phone_radio.canhear_range = 1 + calling_smartphone.phone_radio.canhear_range = 1 + muted = FALSE + calling_smartphone.muted = FALSE + +// Internal only proc, used for ending a calll connection. +/obj/item/smartphone/proc/terminate_call_connection() + PROTECTED_PROC(TRUE) + + var/obj/item/smartphone/calling_smartphone = SSphones.get_phone_from_number(incoming_phone_number) + if(!calling_smartphone) + calling_smartphone = SSphones.get_phone_from_number(dialed_number) + if(!calling_smartphone) + return + + // Free up the secure connection. + SSphones.free_secure_frequency(secure_frequency) + secure_frequency = null + calling_smartphone.secure_frequency = null + + // Set the phone radios. + set_phone_radio(FALSE) + calling_smartphone.set_phone_radio(FALSE) + + // Set proper phone state. + set_phone_state(PHONE_AVAILABLE) + calling_smartphone.set_phone_state(PHONE_AVAILABLE) + +// Internal only proc, used for setting a phone's internal radio. +/obj/item/smartphone/proc/set_phone_radio(enabled) + PROTECTED_PROC(TRUE) + + if(enabled) + phone_radio.set_frequency(secure_frequency) + phone_radio.set_broadcasting(TRUE) + phone_radio.set_listening(TRUE) + else + phone_radio.set_frequency(0) + phone_radio.set_broadcasting(FALSE) + phone_radio.set_listening(FALSE) + phone_radio.recalculateChannels() + diff --git a/modular_darkpack/modules/phones/code/phone_subsystem.dm b/modular_darkpack/modules/phones/code/phone_subsystem.dm new file mode 100644 index 000000000000..3a51f2a759e9 --- /dev/null +++ b/modular_darkpack/modules/phones/code/phone_subsystem.dm @@ -0,0 +1,58 @@ +/** + * Subsystem that is responsible for handling the phone system. + * Generates a list of all phone numbers roundstart and lists them respectively to who needs them. + */ +SUBSYSTEM_DEF(phones) + name = "Phones" + flags = SS_NO_FIRE|SS_NO_INIT + + // Seven digits, always start with 5 + var/list/assigned_phone_numbers = list() + // List of frequencies in use + var/list/frequencies_in_use = list() + // Published phone numbers, with the key being what the user named the number. + var/list/published_phone_numbers = list() + +// Generates a random phone number from the available ranges, ten digits, starts with a 415 or 628. +/datum/controller/subsystem/phones/proc/random_number() + return "[pick("415","628")][rand(0,9)][rand(0,9)][rand(0,9)][rand(0,9)][rand(0,9)][rand(0,9)][rand(0,9)]" + +// Generates a random landline phone number from the available ranges, ten digits, starts with a 1415 or 1628. +/datum/controller/subsystem/phones/proc/random_landline_number() + return "1[pick("415","628")][rand(0,9)][rand(0,9)][rand(0,9)][rand(0,9)][rand(0,9)][rand(0,9)]" + +// If this ever cannot generate a unique number after 10 tries, we have a problem. +/datum/controller/subsystem/phones/proc/generate_phone_number(obj/item/sim_card/sim_card, landline = FALSE) + for(var/generation_attempt in 1 to 10) + var/randomly_generated_phone_number + if(landline) + randomly_generated_phone_number = random_landline_number() + else + randomly_generated_phone_number = random_number() + if(randomly_generated_phone_number in assigned_phone_numbers) + continue + assigned_phone_numbers[sim_card] = randomly_generated_phone_number + return randomly_generated_phone_number + CRASH("[src] failed to generate a unique phone number after 10 attempts.") + +// Returns a valid frequency for a phone to use for a phone call. +/datum/controller/subsystem/phones/proc/establish_secure_frequency() + var/frequency_to_use = USABLE_RADIO_FREQUENCY_FOR_PHONE_RANGE + while(frequency_to_use in frequencies_in_use) + frequency_to_use++ + frequencies_in_use += frequency_to_use + return frequency_to_use + +// Returns a valid frequency for a phone to use for a phone call. +/datum/controller/subsystem/phones/proc/free_secure_frequency(frequency_to_free) + frequencies_in_use -= frequency_to_free + return TRUE + +// Returns a reference to a phone from a phone number. +/datum/controller/subsystem/phones/proc/get_phone_from_number(phone_number) + var/obj/item/sim_card/gotten_sim_card + for(var/obj/item/sim_card/sim_card as anything in assigned_phone_numbers) + if(sim_card.phone_number == phone_number) + gotten_sim_card = sim_card + var/gotten_phone = gotten_sim_card?.phone_weakref?.resolve() + return gotten_phone diff --git a/modular_darkpack/modules/phones/code/phone_subtypes.dm b/modular_darkpack/modules/phones/code/phone_subtypes.dm new file mode 100644 index 000000000000..00a575b6d025 --- /dev/null +++ b/modular_darkpack/modules/phones/code/phone_subtypes.dm @@ -0,0 +1,234 @@ +/// Index to a define to point at a runtime-global list at compile-time. +#define NETWORK_ID 1 +/// Index to a string, for the contact title. +#define OUR_ROLE 2 +/// Index to a boolean, on whether to replace role with job title (or alt-title). +#define USE_JOB_TITLE 3 + +/obj/item/smartphone/prince + contact_networks_pre_init = list( + list(NETWORK_ID = MILLENIUM_TOWER_NETWORK, OUR_ROLE = "C.E.O.", USE_JOB_TITLE = FALSE) + , list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "TransAmerica Corporation C.E.O.", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/seneschal + contact_networks_pre_init = list( + list(NETWORK_ID = MILLENIUM_TOWER_NETWORK, OUR_ROLE = "C.O.O.", USE_JOB_TITLE = FALSE) + , list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "TransAmerica Corporation C.O.O", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/sheriff + contact_networks_pre_init = list( + list(NETWORK_ID = MILLENIUM_TOWER_NETWORK, OUR_ROLE = "Head of Security", USE_JOB_TITLE = FALSE) + , list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "Millenium Group Head of Security", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/harpy + contact_networks_pre_init = list( + list(NETWORK_ID = MILLENIUM_TOWER_NETWORK, OUR_ROLE = "Public Relations", USE_JOB_TITLE = FALSE) + , list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "Millenium Group Public Relations", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/hound + contact_networks_pre_init = list( + list(NETWORK_ID = MILLENIUM_TOWER_NETWORK, OUR_ROLE = "Tower Security", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/tower_employee + contact_networks_pre_init = list( + list(NETWORK_ID = MILLENIUM_TOWER_NETWORK, OUR_ROLE = "Tower Employee", USE_JOB_TITLE = TRUE) + ) + +// VENTRUE + +/obj/item/smartphone/ventrue_primo + important_contact_of = VAMPIRE_CLAN_VENTRUE + contact_networks_pre_init = list( + list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "Crown Blue Jazz Club Owner", USE_JOB_TITLE = FALSE) + ) + +// TOREADOR + +/obj/item/smartphone/toreador_primo + important_contact_of = VAMPIRE_CLAN_TOREADOR + contact_networks_pre_init = list( + list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "Rosebud Night Club Owner", USE_JOB_TITLE = FALSE) + ) + +// NOSFERATU + +/obj/item/smartphone/nosferatu_primo + important_contact_of = VAMPIRE_CLAN_NOSFERATU + contact_networks_pre_init = list( + list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "Utility Administrator", USE_JOB_TITLE = FALSE) + ) + +// MALKAVIAN + +/obj/item/smartphone/malkavian_primo + important_contact_of = VAMPIRE_CLAN_MALKAVIAN + contact_networks_pre_init = list( + list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "Hospital Administrator", USE_JOB_TITLE = FALSE) + ) + +// LASOMBRA + +/obj/item/smartphone/lasombra_primo + important_contact_of = VAMPIRE_CLAN_LASOMBRA + contact_networks_pre_init = list( + list(NETWORK_ID = LASOMBRA_NETWORK, OUR_ROLE = "Church Administrator", USE_JOB_TITLE = FALSE) + , list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "Church Administrator", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/lasombra_caretaker + contact_networks_pre_init = list( + list(NETWORK_ID = LASOMBRA_NETWORK, OUR_ROLE = "Church Caretaker", USE_JOB_TITLE = FALSE) + ) + +// BANU HAQIM + +/obj/item/smartphone/banu_primo + important_contact_of = VAMPIRE_CLAN_BANU_HAQIM + contact_networks_pre_init = list( + list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "SFPD Civilian Consultant", USE_JOB_TITLE = FALSE) + ) + +// TREMERE + +/obj/item/smartphone/tremere_regent + important_contact_of = VAMPIRE_CLAN_TREMERE + contact_networks_pre_init = list( + list(NETWORK_ID = TREMERE_NETWORK, OUR_ROLE = "Library Manager", USE_JOB_TITLE = FALSE) + , list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "Library Manager", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/archivist + contact_networks_pre_init = list( + list(NETWORK_ID = TREMERE_NETWORK, OUR_ROLE = "Library Archivist", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/gargoyle + contact_networks_pre_init = list( + list(NETWORK_ID = TREMERE_NETWORK, OUR_ROLE = "Library Maintenance", USE_JOB_TITLE = FALSE) + ) + +// GIOVANNI + +/obj/item/smartphone/giovanni_capo + important_contact_of = VAMPIRE_CLAN_GIOVANNI + contact_networks_pre_init = list( + list(NETWORK_ID = GIOVANNI_NETWORK, OUR_ROLE = "Bank Manager", USE_JOB_TITLE = FALSE) + , list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "Bank Manager", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/giovanni_squadra + contact_networks_pre_init = list( + list(NETWORK_ID = GIOVANNI_NETWORK, OUR_ROLE = "Bank Security", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/giovanni_famiglia + contact_networks_pre_init = list( + list(NETWORK_ID = GIOVANNI_NETWORK, OUR_ROLE = "Bank Employee", USE_JOB_TITLE = FALSE) + ) + +// TZMISCE + +/obj/item/smartphone/voivode + important_contact_of = VAMPIRE_CLAN_TZIMISCE + contact_networks_pre_init = list( + list(NETWORK_ID = TZMISCE_NETWORK, OUR_ROLE = "Lord of the Manor", USE_JOB_TITLE = FALSE) + , list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "Lord of the Manor", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/bogatyr + contact_networks_pre_init = list( + list(NETWORK_ID = TZMISCE_NETWORK, OUR_ROLE = "Resident of the Manor", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/zadruga + contact_networks_pre_init = list( + list(NETWORK_ID = TZMISCE_NETWORK, OUR_ROLE = "Servant of the Manor", USE_JOB_TITLE = FALSE) + ) + +// ANARCHS + +/obj/item/smartphone/baron + contact_networks_pre_init = list( + list(NETWORK_ID = ANARCH_NETWORK, OUR_ROLE = "Club Manager", USE_JOB_TITLE = FALSE) + , list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "Anarchy Rose Club Manager", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/emissary + contact_networks_pre_init = list( + list(NETWORK_ID = ANARCH_NETWORK, OUR_ROLE = "Club Representative", USE_JOB_TITLE = FALSE) + , list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "Anarchy Rose Club Representative", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/bruiser + contact_networks_pre_init = list( + list(NETWORK_ID = ANARCH_NETWORK, OUR_ROLE = "Club Bouncer", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/sweeper + contact_networks_pre_init = list( + list(NETWORK_ID = ANARCH_NETWORK, OUR_ROLE = "Club Bartender", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/liaison + contact_networks_pre_init = list( + list(NETWORK_ID = ANARCH_NETWORK, OUR_ROLE = "Club Promotor", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/tapster + contact_networks_pre_init = list( + list(NETWORK_ID = ANARCH_NETWORK, OUR_ROLE = "Club Bartender", USE_JOB_TITLE = FALSE) + ) + +// SUPPLY + +/obj/item/smartphone/supply_tech + contact_networks_pre_init = list( + list(NETWORK_ID = SUPPLY_NETWORK, OUR_ROLE = "Supply Technician", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/dealer + contact_networks_pre_init = list( + list(NETWORK_ID = SUPPLY_NETWORK, OUR_ROLE = "Supply Manager", USE_JOB_TITLE = FALSE), + list(NETWORK_ID = VAMPIRE_LEADER_NETWORK, OUR_ROLE = "Warehouse Manager", USE_JOB_TITLE = FALSE) + ) + +// ENDRON + +/obj/item/smartphone/endron_lead + contact_networks_pre_init = list( + list(NETWORK_ID = ENDRON_NETWORK, OUR_ROLE = "Endron Branch Lead", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/endron_exec + contact_networks_pre_init = list( + list(NETWORK_ID = ENDRON_NETWORK, OUR_ROLE = "Endron Executive", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/endron_affairs + contact_networks_pre_init = list( + list(NETWORK_ID = ENDRON_NETWORK, OUR_ROLE = "Endron Internal Affairs Agent", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/endron_sec_chief + contact_networks_pre_init = list( + list(NETWORK_ID = ENDRON_NETWORK, OUR_ROLE = "Endron Chief of Security", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/endron_security + contact_networks_pre_init = list( + list(NETWORK_ID = ENDRON_NETWORK, OUR_ROLE = "Endron Security Agent", USE_JOB_TITLE = FALSE) + ) + +/obj/item/smartphone/endron_employee + contact_networks_pre_init = list( + list(NETWORK_ID = ENDRON_NETWORK, OUR_ROLE = "Endron Employee", USE_JOB_TITLE = TRUE) + ) + +#undef NETWORK_ID +#undef OUR_ROLE +#undef USE_JOB_TITLE diff --git a/modular_darkpack/modules/phones/code/phone_voice.dm b/modular_darkpack/modules/phones/code/phone_voice.dm deleted file mode 100644 index 0d110a35da93..000000000000 --- a/modular_darkpack/modules/phones/code/phone_voice.dm +++ /dev/null @@ -1,35 +0,0 @@ -/obj/phonevoice - name = "unknown voice" - speech_span = SPAN_ROBOT - anchored = FALSE - density = FALSE - opacity = FALSE - -/obj/phonevoice/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) - if(message == "" || !message) - return - spans |= speech_span - if(!language) - language = get_selected_language() - send_speech(message, 2, src, , spans, message_language=language) -// speech_span = initial(speech_span) - -/proc/scramble_lasombra_message(message) - var/list/zalgo_letters = list( - "̨a", "̡b", "̢c", "̷d", "̶e", "̸f", "̹g", "̺h", "̻i", - "̼j", "̽k", "̾l", "̿m", "͈n", "͍o", "͎p", "q", "͕r", - "͓s", "͒t", "̱u", "̲v", "̳w", "͡x", "̨y", "̨z", "̨A", - "̨B", "̨C", "̨D", "̨E", "̨F", "̨G", "̨H", "̨I", "̨J", - "̨K", "̨L", "̨M", "̨N", "̨O", "̨P", "̨Q", "̨R", "̨S", - "̨T", "̨U", "̨V", "̨W", "̨X", "̨Y", "̨Z" - ) - - var/gibberish_message = "" - for(var/i = 1 to length(message)) - var/char = message[i] - // Randomize or replace characters with gibberish - if(prob(30)) // 30% chance to keep the original character - gibberish_message += char - else - gibberish_message += pick(zalgo_letters) // Replace with random gibberish letters - return gibberish_message diff --git a/modular_darkpack/modules/phones/code/sim_card.dm b/modular_darkpack/modules/phones/code/sim_card.dm new file mode 100644 index 000000000000..ebf0f4407844 --- /dev/null +++ b/modular_darkpack/modules/phones/code/sim_card.dm @@ -0,0 +1,72 @@ +/obj/item/sim_card + name = "\improper SIM card" + desc = "A SIM card with a phone number attached to it." + ONFLOOR_ICON_HELPER(null) + icon = 'icons/obj/devices/circuitry_n_data.dmi' + icon_state = "ssd_micro" + item_flags = NOBLUDGEON + w_class = WEIGHT_CLASS_SMALL + resistance_flags = FIRE_PROOF | ACID_PROOF + + var/phone_number = "" + var/datum/weakref/phone_weakref = null + +/obj/item/sim_card/Initialize(mapload) + . = ..() + if(!phone_number) + phone_number = SSphones.generate_phone_number(src) + +/obj/item/sim_card/Destroy(force) + . = ..() + SSphones.assigned_phone_numbers.Remove(src) + for(var/contact as anything in SSphones.published_phone_numbers) + if(SSphones.published_phone_numbers[contact] == phone_number) + SSphones.published_phone_numbers.Remove(src) + phone_weakref = null + +/obj/item/sim_card/examine(mob/user) + . = ..() + . += span_notice("[EXAMINE_HINT("Interact")] to crush it in your hands.") + +/obj/item/sim_card/attack_self(mob/user, modifiers) + . = ..() + + balloon_alert(user, "you start crushing [src]!") + if(do_after(user, 5 SECONDS, src)) + balloon_alert(user, "you crush [src]!") + new /obj/effect/decal/cleanable/blood/gibs/robot_debris/plastic(get_turf(user)) + qdel(src) + return TRUE + return FALSE + +/obj/effect/decal/cleanable/blood/gibs/robot_debris/plastic + name = "plastic debris" + desc = "It's a useless heap of junk..." + +//////////////////////////////////////////////////////////////////////////////////////// + +/obj/item/sim_card/emergency + name = "\improper Emergency Services SIM card" + desc = "A SIM card with the number of 911." + phone_number = "911" + +/obj/item/sim_card/emergency/Initialize(mapload) + SSphones.assigned_phone_numbers[src] = phone_number + . = ..() + +/obj/item/sim_card/cleaner + name = "\improper Cleaning Services SIM card" + desc = "A SIM card with the number of the cleaners." + phone_number = "1415444444" + +/obj/item/sim_card/cleaner/Initialize(mapload) + SSphones.assigned_phone_numbers[src] = phone_number + . = ..() + +/obj/item/sim_card/landline + name = "\improper Landline SIM card" + desc = "Please put me back into the payphone." + +/obj/item/sim_card/landline/Initialize(mapload) + phone_number = SSphones.generate_phone_number(src, TRUE) + . = ..() diff --git a/modular_darkpack/modules/phones/code/stationary_subtypes.dm b/modular_darkpack/modules/phones/code/stationary_subtypes.dm new file mode 100644 index 000000000000..723127447a9f --- /dev/null +++ b/modular_darkpack/modules/phones/code/stationary_subtypes.dm @@ -0,0 +1,53 @@ +/obj/item/smartphone/payphone + name = "payphone" + desc = "Ring ring. Ring ring. Ring ring." + ONFLOOR_ICON_HELPER(null) + icon = 'modular_darkpack/modules/phones/icons/phone.dmi' + icon_state = "payphone" + anchored = TRUE + +/obj/item/smartphone/payphone/Initialize(mapload) + sim_card = new /obj/item/sim_card/landline() + sim_card.phone_weakref = WEAKREF(src) + phone_flags |= PHONE_OPEN + . = ..() + +/obj/item/smartphone/payphone/attack_hand(mob/user, list/modifiers) + . = ..() + ui_interact(user) + +/obj/item/smartphone/clean + name = "cleaner phone" + desc = "The usual phone of a cleaning company used to communicate with employees" + ONFLOOR_ICON_HELPER(null) + icon = 'modular_darkpack/modules/phones/icons/phone.dmi' + icon_state = "phone_black" + anchored = TRUE + +/obj/item/smartphone/clean/Initialize(mapload) + sim_card = new /obj/item/sim_card/cleaner() + sim_card.phone_weakref = WEAKREF(src) + phone_flags |= PHONE_OPEN + . = ..() + +/obj/item/smartphone/clean/attack_hand(mob/user, list/modifiers) + . = ..() + ui_interact(user) + +/obj/item/smartphone/emergency + name = "911 dispatch phone" + desc = "A phone used for emergency calls." + ONFLOOR_ICON_HELPER(null) + icon = 'modular_darkpack/modules/phones/icons/phone.dmi' + icon_state = "phone_red" + anchored = TRUE + +/obj/item/smartphone/emergency/Initialize(mapload) + sim_card = new /obj/item/sim_card/emergency() + sim_card.phone_weakref = WEAKREF(src) + phone_flags |= PHONE_OPEN + . = ..() + +/obj/item/smartphone/emergency/attack_hand(mob/user, list/modifiers) + . = ..() + ui_interact(user) diff --git a/modular_darkpack/modules/phones/icons/chat_icon.dmi b/modular_darkpack/modules/phones/icons/chat_icon.dmi new file mode 100644 index 000000000000..1658d8db3a6f Binary files /dev/null and b/modular_darkpack/modules/phones/icons/chat_icon.dmi differ diff --git a/modular_darkpack/modules/phones/icons/lefthand.dmi b/modular_darkpack/modules/phones/icons/lefthand.dmi new file mode 100644 index 000000000000..af0ff54ee435 Binary files /dev/null and b/modular_darkpack/modules/phones/icons/lefthand.dmi differ diff --git a/modular_darkpack/modules/phones/icons/phone.dmi b/modular_darkpack/modules/phones/icons/phone.dmi index f4dd54a5ff9b..cd47b2b544cf 100644 Binary files a/modular_darkpack/modules/phones/icons/phone.dmi and b/modular_darkpack/modules/phones/icons/phone.dmi differ diff --git a/modular_darkpack/modules/phones/icons/phone_onfloor.dmi b/modular_darkpack/modules/phones/icons/phone_onfloor.dmi index a6915d3f9f11..6a3c9c97a0e9 100644 Binary files a/modular_darkpack/modules/phones/icons/phone_onfloor.dmi and b/modular_darkpack/modules/phones/icons/phone_onfloor.dmi differ diff --git a/modular_darkpack/modules/phones/icons/righthand.dmi b/modular_darkpack/modules/phones/icons/righthand.dmi new file mode 100644 index 000000000000..4a01bd10225d Binary files /dev/null and b/modular_darkpack/modules/phones/icons/righthand.dmi differ diff --git a/modular_darkpack/modules/phones/readme.md b/modular_darkpack/modules/phones/readme.md new file mode 100644 index 000000000000..352d0b4345de --- /dev/null +++ b/modular_darkpack/modules/phones/readme.md @@ -0,0 +1,32 @@ +https://github.com/DarkPack13/SecondCity/pull/227 + +## \<PHONES> + +Module ID: PHONES + +### Description: + +This module handles everything related to phones, contacts, sim cards, and so on. + +### TG Proc/File Changes: + +- N/A + +### Modular Overrides: + +- N/A + +### Defines: + +- `code/__DEFINES/~darkpack/phones.dm` + +### Included files that are not contained in this module: + +- `code/_globalvars/darkpack/lists/phone_contacts.dm` + +### Credits: + +XeonMations +Shadow for the initial TGUI work! +Marshmellow105 for inhand sprites + Sprite conversion! +Azlan (Github: SomeAngryMiner) for the sprites! diff --git a/modular_darkpack/modules/deprecated/sounds/call.ogg b/modular_darkpack/modules/phones/sounds/call.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/call.ogg rename to modular_darkpack/modules/phones/sounds/call.ogg diff --git a/modular_darkpack/modules/piano/code/stationary_pianos.dm b/modular_darkpack/modules/piano/code/stationary_pianos.dm new file mode 100644 index 000000000000..3d689605acd4 --- /dev/null +++ b/modular_darkpack/modules/piano/code/stationary_pianos.dm @@ -0,0 +1,3 @@ +/obj/structure/musician/piano + name = "piano" + desc = "This is a piano! A lovely instrument." diff --git a/modular_darkpack/modules/piano/icons/piano.dmi b/modular_darkpack/modules/piano/icons/piano.dmi new file mode 100644 index 000000000000..f685e98a4c88 Binary files /dev/null and b/modular_darkpack/modules/piano/icons/piano.dmi differ diff --git a/modular_darkpack/modules/pixel_shift/code/pixel_shift_component.dm b/modular_darkpack/modules/pixel_shift/code/pixel_shift_component.dm new file mode 100644 index 000000000000..8cdba0afe1ec --- /dev/null +++ b/modular_darkpack/modules/pixel_shift/code/pixel_shift_component.dm @@ -0,0 +1,181 @@ +#define SHIFTING_ITEMS 1 +#define SHIFTING_PARENT 2 +#define TILTING_PARENT 3 + +/datum/component/pixel_shift + dupe_mode = COMPONENT_DUPE_UNIQUE + //whether or not parent is shifting + var/shifting = FALSE + //how tilted the parent is + var/how_tilted + //the maximum amount of tilt parent can achieve + var/maximum_tilt = 45 + //the maximum amount we/an item can move + var/maximum_pixel_shift = 16 + //If we are shifted + var/is_shifted = FALSE + //Allows atoms entering Parent's turf to pass through freely from given directions + var/passthroughable = NONE + //Amount of shifting necessary to make the parent passthroughable + var/passthrough_threshold = 8 + +/datum/component/pixel_shift/Initialize(...) + . = ..() + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + +/datum/component/pixel_shift/RegisterWithParent() + RegisterSignal(parent, COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_DOWN, PROC_REF(item_pixel_shift_down)) + RegisterSignal(parent, COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_UP, PROC_REF(item_pixel_shift_up)) + RegisterSignal(parent, COMSIG_KB_MOB_PIXEL_SHIFT_DOWN, PROC_REF(pixel_shift_down)) + RegisterSignal(parent, COMSIG_KB_MOB_PIXEL_SHIFT_UP, PROC_REF(pixel_shift_up)) + RegisterSignal(parent, COMSIG_KB_MOB_PIXEL_TILT_DOWN, PROC_REF(pixel_tilt_down)) + RegisterSignal(parent, COMSIG_KB_MOB_PIXEL_TILT_UP, PROC_REF(pixel_tilt_up)) + RegisterSignals(parent, list(COMSIG_LIVING_RESET_PULL_OFFSETS, COMSIG_LIVING_SET_PULL_OFFSET, COMSIG_MOVABLE_MOVED), PROC_REF(unpixel_shift)) + RegisterSignal(parent, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, PROC_REF(pre_move_check)) + RegisterSignal(parent, COMSIG_LIVING_CAN_ALLOW_THROUGH, PROC_REF(check_passable)) +/datum/component/pixel_shift/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_DOWN, + COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_UP, + COMSIG_KB_MOB_PIXEL_TILT_DOWN, + COMSIG_KB_MOB_PIXEL_TILT_UP, + COMSIG_KB_MOB_PIXEL_SHIFT_DOWN, + COMSIG_KB_MOB_PIXEL_SHIFT_UP, + COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, + COMSIG_LIVING_RESET_PULL_OFFSETS, + COMSIG_LIVING_SET_PULL_OFFSET, + COMSIG_MOVABLE_MOVED, + COMSIG_LIVING_CAN_ALLOW_THROUGH, + )) + +//locks our movement when holding our keybinds +/datum/component/pixel_shift/proc/pre_move_check(mob/source, new_loc, direct) + SIGNAL_HANDLER + if(shifting) + pixel_shift(source, direct) + return COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE + +//procs for tilting parent + +/datum/component/pixel_shift/proc/pixel_tilt_down() + SIGNAL_HANDLER + shifting = TILTING_PARENT + return COMSIG_KB_ACTIVATED + +/datum/component/pixel_shift/proc/pixel_tilt_up() + SIGNAL_HANDLER + shifting = FALSE + +//Procs for shifting items + +/datum/component/pixel_shift/proc/item_pixel_shift_down() + SIGNAL_HANDLER + shifting = SHIFTING_ITEMS + return COMSIG_KB_ACTIVATED + +/datum/component/pixel_shift/proc/item_pixel_shift_up() + SIGNAL_HANDLER + shifting = FALSE + +//Procs for shifting mobs + +/// Checks if the parent is considered passthroughable from a direction. Projectiles will ignore the check and hit. +/datum/component/pixel_shift/proc/check_passable(mob/source, atom/movable/mover, border_dir) + SIGNAL_HANDLER + if(!isprojectile(mover) && !mover.throwing && passthroughable & border_dir) + return COMPONENT_LIVING_PASSABLE + +/// Activates Pixel Shift on Keybind down. Only Pixel Shift movement will be allowed. +/datum/component/pixel_shift/proc/pixel_shift_down() + SIGNAL_HANDLER + shifting = SHIFTING_PARENT + return COMSIG_KB_ACTIVATED + +/// Disables Pixel Shift on Keybind up. Allows to Move. +/datum/component/pixel_shift/proc/pixel_shift_up() + SIGNAL_HANDLER + shifting = FALSE + +/// Sets parent pixel offsets to default and deletes the component. +/datum/component/pixel_shift/proc/unpixel_shift() + SIGNAL_HANDLER + passthroughable = NONE + if(is_shifted) + var/mob/living/owner = parent + owner.remove_offsets(type) + owner.transform = turn(owner.transform, -how_tilted) + qdel(src) + +/// In-turf pixel movement which can allow things to pass through if the threshold is met. +/datum/component/pixel_shift/proc/pixel_shift(mob/source, direct) + passthroughable = NONE + var/mob/living/owner = parent + switch(shifting) + if(SHIFTING_ITEMS) + var/atom/pulled_atom = source.pulling + if(!isitem(pulled_atom)) + return + var/obj/item/pulled_item = pulled_atom + switch(direct) + if(NORTH) + if(pulled_item.pixel_y <= maximum_pixel_shift + pulled_item.base_pixel_y) + pulled_item.pixel_y++ + if(EAST) + if(pulled_item.pixel_x <= maximum_pixel_shift + pulled_item.base_pixel_x) + pulled_item.pixel_x++ + if(SOUTH) + if(pulled_item.pixel_y >= -maximum_pixel_shift + pulled_item.base_pixel_y) + pulled_item.pixel_y-- + if(WEST) + if(pulled_item.pixel_x >= -maximum_pixel_shift + pulled_item.base_pixel_x) + pulled_item.pixel_x-- + if(SHIFTING_PARENT) + switch(direct) + if(NORTH) + if(owner.pixel_y <= maximum_pixel_shift) + owner.pixel_y++ + owner.add_offsets(type, y_add = owner.pixel_y) + is_shifted = TRUE + if(EAST) + if(owner.pixel_x <= maximum_pixel_shift) + owner.pixel_x++ + owner.add_offsets(type, x_add = owner.pixel_x) + is_shifted = TRUE + if(SOUTH) + if(owner.pixel_y >= -maximum_pixel_shift) + owner.pixel_y-- + owner.add_offsets(type, y_add = owner.pixel_y) + is_shifted = TRUE + if(WEST) + if(owner.pixel_x >= -maximum_pixel_shift) + owner.pixel_x-- + owner.add_offsets(type, x_add = owner.pixel_x) + is_shifted = TRUE + if(TILTING_PARENT) + switch(direct) + if(EAST) + if(how_tilted <= maximum_tilt) + owner.transform = turn(owner.transform, 1) + how_tilted++ + is_shifted = TRUE + if(WEST) + if(how_tilted >= -maximum_tilt) + owner.transform = turn(owner.transform, -1) + how_tilted-- + is_shifted = TRUE + + // Yes, I know this sets it to true for everything if more than one is matched. + // Movement doesn't check diagonals, and instead just checks EAST or WEST, depending on where you are for those. + if(owner.pixel_y > passthrough_threshold) + passthroughable |= EAST | SOUTH | WEST + else if(owner.pixel_y < -passthrough_threshold) + passthroughable |= NORTH | EAST | WEST + if(owner.pixel_x > passthrough_threshold) + passthroughable |= NORTH | SOUTH | WEST + else if(owner.pixel_x < -passthrough_threshold) + passthroughable |= NORTH | EAST | SOUTH + +#undef SHIFTING_ITEMS +#undef SHIFTING_PARENT +#undef TILTING_PARENT diff --git a/modular_darkpack/modules/pixel_shift/code/pixel_shift_keybind.dm b/modular_darkpack/modules/pixel_shift/code/pixel_shift_keybind.dm new file mode 100644 index 000000000000..e6a1c666eea2 --- /dev/null +++ b/modular_darkpack/modules/pixel_shift/code/pixel_shift_keybind.dm @@ -0,0 +1,56 @@ +/datum/keybinding/mob/item_pixel_shift + hotkey_keys = list("Unbound") + name = "item_pixel_shift" + full_name = "Item Pixel Shift" + description = "Shift a pulled item's offset" + category = CATEGORY_MISC + keybind_signal = COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_DOWN + +/datum/keybinding/mob/item_pixel_shift/down(client/user) + . = ..() + if(.) + return + user.mob.AddComponent(/datum/component/pixel_shift) + SEND_SIGNAL(user.mob, COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_DOWN) + +/datum/keybinding/mob/item_pixel_shift/up(client/user) + . = ..() + SEND_SIGNAL(user.mob, COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_UP) + +/datum/keybinding/mob/pixel_shift + hotkey_keys = list("Unbound") + name = "pixel_shift" + full_name = "Pixel Shift" + description = "Shift your characters offset." + category = CATEGORY_MOVEMENT + keybind_signal = COMSIG_KB_MOB_PIXEL_SHIFT_DOWN + +/datum/keybinding/mob/pixel_shift/down(client/user) + . = ..() + if(.) + return + user.mob.AddComponent(/datum/component/pixel_shift) + SEND_SIGNAL(user.mob, COMSIG_KB_MOB_PIXEL_SHIFT_DOWN) + +/datum/keybinding/mob/pixel_shift/up(client/user) + . = ..() + SEND_SIGNAL(user.mob, COMSIG_KB_MOB_PIXEL_SHIFT_UP) + +/datum/keybinding/mob/pixel_tilting + hotkey_keys = list("Unbound") + name = "Pixel Tilting" + full_name = "Pixel Tilt" + description = "Shift a mob's rotational value" + category = CATEGORY_MOVEMENT + keybind_signal = COMSIG_KB_MOB_PIXEL_TILT_DOWN + +/datum/keybinding/mob/pixel_tilting/down(client/user) + . = ..() + if(.) + return + user.mob.AddComponent(/datum/component/pixel_shift) + SEND_SIGNAL(user.mob, COMSIG_KB_MOB_PIXEL_TILT_DOWN) + +/datum/keybinding/mob/pixel_tilting/up(client/user) + . = ..() + SEND_SIGNAL(user.mob, COMSIG_KB_MOB_PIXEL_TILT_UP) diff --git a/modular_darkpack/modules/pixel_shift/readme.md b/modular_darkpack/modules/pixel_shift/readme.md new file mode 100644 index 000000000000..d0eaf398772f --- /dev/null +++ b/modular_darkpack/modules/pixel_shift/readme.md @@ -0,0 +1,34 @@ +https://github.com/DarkPack13/SecondCity/pull/184 + +## Title: Pixel shifting for RP positioning + +MODULE ID: PIXEL_SHIFT + +### Description: + +Adds the ability for living mobs to shift their sprite to fit an RP situation better (standing against a wall for example). Not appended to proc due to it being a busy proc + +### TG Proc/File Changes: + +- N/A + +### Modular Overrides: + +- `modular_darkpack/master_files/code/modules/mob/living/living.dm`: `proc/set_pull_offsets`, `proc/reset_pull_offsets` +- `modular_darkpack/master_files/code/modules/mob/living/living_movement.dm`: `proc/CanAllowThrough` + +### Defines: + +- `code/__DEFINES/~darkpack/keybinding.dm`: `COMSIG_KB_MOB_PIXEL_SHIFT_DOWN`, `COMSIG_KB_MOB_PIXEL_SHIFT_UP`, `COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_DOWN`. `COMSIG_KB_MOB_ITEM_PIXEL_SHIFT_UP`, `COMSIG_KB_MOB_PIXEL_TILT_DOWN`, `COMSIG_KB_MOB_PIXEL_TILT_UP` +- `code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm`: `COMSIG_LIVING_SET_PULL_OFFSET`, `COMSIG_LIVING_RESET_PULL_OFFSETS`, `COMSIG_LIVING_CAN_ALLOW_THROUGH`, `COMPONENT_LIVING_PASSABLE` + +### Included files that are not contained in this module: + +- N/A + +### Credits: + +XeonMations - Porting +Azarak - Porting +Gandalf2k15 - Refactoring +Larentoun - Moved to Component diff --git a/modular_darkpack/modules/postal/code/postal.dm b/modular_darkpack/modules/postal/code/postal.dm index a14fb63b473a..489f15f05bc1 100644 --- a/modular_darkpack/modules/postal/code/postal.dm +++ b/modular_darkpack/modules/postal/code/postal.dm @@ -1,7 +1,7 @@ /obj/lettermachine name = "letter machine" desc = "Work as letterman! Find a job!" - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/postal/icons/letters.dmi' icon_state = "mail" density = TRUE anchored = TRUE @@ -11,13 +11,15 @@ var/money = 0 /obj/lettermachine/attack_hand(mob/living/user) + . = ..() + if(.) + return if(money >= 10) new /obj/item/letter(loc) say("New letter delivered!") money = max(0, money-10) else say("Not enough money on [src] balance!") - ..() /obj/lettermachine/attackby(obj/item/I, mob/user, params) if(iscash(I)) @@ -29,24 +31,24 @@ new /obj/item/stack/dollar(loc, 30) say("[I] delivered!") qdel(I) - return + return ..() /obj/lettermachine/examine(mob/user) . = ..() - . += "[src] contains <b>[money] dollars</b>." + . += span_info("It contains [money] dollars.") /obj/item/letter name = "letter" icon_state = "letter" - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' + icon = 'modular_darkpack/modules/postal/icons/letters.dmi' ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') w_class = WEIGHT_CLASS_SMALL - var/mob/living/carbon/human/mail_target + var/datum/weakref/mail_target_weakref /obj/item/mark name = "letter mark" icon_state = "mark" - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' + icon = 'modular_darkpack/modules/postal/icons/letters.dmi' ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') w_class = WEIGHT_CLASS_TINY @@ -57,19 +59,21 @@ if(alive.stat != DEAD) mail_recipients += alive if(length(mail_recipients)) - mail_target = pick(mail_recipients) + var/mob/mail_target = pick(mail_recipients) name = "letter ([mail_target.real_name])" + mail_target_weakref = WEAKREF(mail_target) /obj/item/letter/examine(mob/user) . = ..() - . += "This letter is adressed to <b>[mail_target.real_name]</b>" + var/mob/mail_target = mail_target_weakref.resolve() + . += "This letter is adressed to <b>[mail_target?.real_name]</b>" /obj/item/letter/attack_self(mob/user) . = ..() + var/mail_target = mail_target_weakref.resolve() if(user == mail_target) playsound(loc, 'sound/items/poster/poster_ripped.ogg', 50, TRUE) var/IT = pick( - /obj/item/storage/pill_bottle/estrogen, /obj/item/storage/pill_bottle/unknown, /obj/item/storage/pill_bottle/ephedrine, /obj/item/storage/pill_bottle/potassiodide, @@ -79,7 +83,7 @@ /obj/item/melee/vamp/tire, /obj/item/reagent_containers/blood, /obj/item/gun/ballistic/revolver/darkpack/snub, - /obj/item/vamp/keys/hack + /obj/item/vamp/keys/hack, ) new IT(user.loc) new /obj/item/mark(user.loc) diff --git a/modular_darkpack/modules/postal/icons/letters.dmi b/modular_darkpack/modules/postal/icons/letters.dmi new file mode 100644 index 000000000000..a6cef0c0b6cb Binary files /dev/null and b/modular_darkpack/modules/postal/icons/letters.dmi differ diff --git a/modular_darkpack/modules/powers/code/discipline/__discipline.dm b/modular_darkpack/modules/powers/code/discipline/__discipline.dm index 470a7e58536b..7d4b9516b63d 100644 --- a/modular_darkpack/modules/powers/code/discipline/__discipline.dm +++ b/modular_darkpack/modules/powers/code/discipline/__discipline.dm @@ -10,6 +10,8 @@ var/clan_restricted = FALSE ///The root type of the powers this Discipline uses. var/power_type = /datum/discipline_power + ///What action type this Discipline is connected to + var/action_type = /datum/action/discipline ///If this Discipline can be selected at all, or has special handling. var/selectable = TRUE @@ -32,12 +34,13 @@ //TODO: rework this and set_level to use proper loadouts instead of a default set every time /datum/discipline/New(level) all_powers = subtypesof(power_type) - if (!level) return - src.level = level - for (var/i in 1 to level) + var/amount = level // how many levels are we giving them + if(level > length(all_powers)) // the amount of disc levels we are trying to give is greater than the amount of subtypes that exist for it + amount = length(all_powers) // so only give what exists + for (var/i in 1 to amount) var/type_to_create = all_powers[i] var/datum/discipline_power/new_power = new type_to_create(src) known_powers += new_power diff --git a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm index e2c970e0e054..13a0d14b5dd0 100644 --- a/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm +++ b/modular_darkpack/modules/powers/code/discipline/__discipline_power.dm @@ -11,6 +11,8 @@ var/check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE /// How many blood points this power costs to activate var/vitae_cost = 1 + /// How many willpower points this power costs to activate + var/willpower_cost = 0 /// Bitflags determining what types of entities this power is allowed to target. NONE if self-targeting only. var/target_type = NONE /// How many tiles away this power can be used from. @@ -100,7 +102,13 @@ * this power's vitae cost. */ /datum/discipline_power/proc/can_afford() - return (owner.bloodpool >= vitae_cost) + if(vitae_cost) + if(!(owner.bloodpool >= /*(HAS_TRAIT(owner, TRAIT_DOUBLE_VITAE_COST) ? vitae_cost*2 :*/ vitae_cost)) + return FALSE + if(willpower_cost) + if(!owner.st_get_stat(STAT_TEMPORARY_WILLPOWER) >= willpower_cost) + return FALSE + return TRUE /** * Returns if this power can currently be activated @@ -160,7 +168,7 @@ //the user cannot afford the power's vitae expenditure if (!can_afford()) if (alert) - to_chat(owner, span_warning("You do not have enough blood to cast [src]!")) + do_afford_alert() return FALSE //the power's cooldown has not elapsed @@ -248,6 +256,11 @@ if (!can_activate_untargeted(alert)) return FALSE + if ((check_flags & DISC_CHECK_DIRECT_SEE) && !can_see(owner, target, range)) + if (alert) + to_chat(owner, span_warning("You cannot cast [src] without being in direct line of sight!")) + return FALSE + //self activated so target doesn't matter if (target_type == NONE) return TRUE @@ -399,7 +412,7 @@ SEND_SIGNAL(src, COMSIG_POWER_ACTIVATE, src, target) SEND_SIGNAL(owner, COMSIG_POWER_ACTIVATE, src, target) if (target) - SEND_SIGNAL(target, COMSIG_POWER_ACTIVATE_ON, src) + SEND_SIGNAL(target, COMSIG_POWER_ACTIVATE_ON, src, was_hostile_usage(target)) //make it active if it can only have one active instance at a time if (!multi_activate) @@ -415,8 +428,6 @@ do_effect_sound(target) - INVOKE_ASYNC(src, PROC_REF(do_npc_aggro), target) - INVOKE_ASYNC(src, PROC_REF(do_masquerade_violation), target) do_caster_notification(target) @@ -442,31 +453,21 @@ if (effect_sound) playsound(target ? target : owner, effect_sound, 50, FALSE) -// TODO: [Rebase] reimplement npcs /** * Overridable proc handling how the power aggravates NPCs * it's used on. */ -/datum/discipline_power/proc/do_npc_aggro(atom/target) - /* - if (aggravating && isnpc(target)) - var/mob/living/carbon/human/npc/npc = target - npc.Aggro(owner, hostile) - */ +/datum/discipline_power/proc/was_hostile_usage(atom/target) + if(aggravating) + return TRUE /** * Overridable proc handling Masquerade violations as a result * of using this power amongst NPCs. */ /datum/discipline_power/proc/do_masquerade_violation(atom/target) - /* if (violates_masquerade) - if (owner.CheckEyewitness(target ? target : owner, owner, 7, TRUE)) - //TODO: detach this from being a human - if (ishuman(owner)) - var/mob/living/carbon/human/human = owner - human.adjust_masquerade(-1) - */ + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) /** * Overridable proc handling the spending of resources (vitae/blood) @@ -475,7 +476,8 @@ */ /datum/discipline_power/proc/spend_resources() if (can_afford()) - owner.bloodpool = owner.bloodpool - vitae_cost + owner.adjust_blood_pool(-vitae_cost) + owner.st_set_stat(STAT_TEMPORARY_WILLPOWER, owner.st_get_stat(STAT_TEMPORARY_WILLPOWER) - willpower_cost) owner.update_action_buttons() return TRUE else @@ -690,7 +692,10 @@ return if (spend_resources()) - to_chat(owner, span_warning("[src] consumes your blood to stay active.")) + if(vitae_cost > 0) + to_chat(owner, span_warning("[src] consumes your blood to stay active.")) + if(willpower_cost > 0) + to_chat(owner, span_warning("[src] consumes your willpower to stay active.")) if (!duration_override) do_duration(target) else @@ -717,3 +722,13 @@ deltimer(duration_timers[to_clear]) duration_timers.Cut(to_clear, to_clear + 1) + + +// For certain discipline alerts, for example auspex 5 requiring willpower instead of blood points. +/datum/discipline_power/proc/do_afford_alert() + if(vitae_cost && willpower_cost) + to_chat(owner, span_warning("You do not have enough blood and or willpower to cast [src]!")) + else if(vitae_cost) + to_chat(owner, span_warning("You do not have enough blood to cast [src]!")) + else if(willpower_cost) + to_chat(owner, span_warning("You do not have enough willpower to cast [src]!")) diff --git a/modular_darkpack/modules/powers/code/discipline/animalism.dm b/modular_darkpack/modules/powers/code/discipline/animalism.dm index ab10c79f88e7..d9baea2fa6e6 100644 --- a/modular_darkpack/modules/powers/code/discipline/animalism.dm +++ b/modular_darkpack/modules/powers/code/discipline/animalism.dm @@ -7,166 +7,194 @@ /datum/discipline_power/animalism name = "Animalism power name" desc = "Animalism power description" - effect_sound = 'modular_darkpack/modules/deprecated/sounds/wolves.ogg' -//SUMMON RAT -/datum/discipline_power/animalism/summon_rat - name = "Skittering Critters" - desc = "Summons rats to follow you and gnaw on your enemies." +/datum/discipline_power/animalism/activate() + . = ..() - check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE | DISC_CHECK_LYING + if(!ishuman(owner)) + return - level = 1 - violates_masquerade = FALSE + for(var/mob/living/minion in owner.beastmaster_minions) + if(QDELETED(minion) || minion.stat == DEAD) + owner.beastmaster_minions -= minion + var/max_minions = owner.st_get_stat(STAT_LEADERSHIP) + 1 + if(length(owner.beastmaster_minions) >= max_minions) + var/mob/living/oldest = owner.beastmaster_minions[1] + if(oldest) + owner.remove_beastmaster_minion(oldest) + qdel(oldest) + + +//SUMMON RAT +/datum/discipline_power/animalism/summon_rat + name = "Summon Rat" + desc = "Summon a spectral rat to do your bidding." + level = 1 + violates_masquerade = TRUE cooldown_length = 8 SECONDS + check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE | DISC_CHECK_LYING /datum/discipline_power/animalism/summon_rat/activate() . = ..() - var/limit = min(2, level) + owner.st_get_stat(STAT_LEADERSHIP) - if(length(owner.beastmaster) >= limit) - var/mob/living/simple_animal/hostile/beastmaster/beast = pick(owner.beastmaster) - beast.death() - if(!length(owner.beastmaster)) - var/datum/action/beastmaster_stay/stay = new() - stay.Grant(owner) - var/datum/action/beastmaster_deaggro/deaggro = new() - deaggro.Grant(owner) - - var/mob/living/simple_animal/hostile/beastmaster/rat/rat = new(get_turf(owner)) - rat.my_creator = owner - owner.beastmaster |= rat - rat.beastmaster = owner + owner.add_beastmaster_minion(/mob/living/basic/mouse/vampire/summoned) //SUMMON CAT /datum/discipline_power/animalism/summon_cat - name = "Clawing Felines" - desc = "Summons very cute cats to accompany you in the night." - - check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE | DISC_CHECK_LYING - + name = "Summon Cat" + desc = "Summon a spectral cat to do your bidding." level = 2 - violates_masquerade = FALSE - + violates_masquerade = TRUE cooldown_length = 8 SECONDS + check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE | DISC_CHECK_LYING /datum/discipline_power/animalism/summon_cat/activate() . = ..() - var/limit = min(2, level) + owner.st_get_stat(STAT_LEADERSHIP) - if(length(owner.beastmaster) >= limit) - var/mob/living/simple_animal/hostile/beastmaster/beast = pick(owner.beastmaster) - beast.death() - if(!length(owner.beastmaster)) - var/datum/action/beastmaster_stay/stay = new() - stay.Grant(owner) - var/datum/action/beastmaster_deaggro/deaggro = new() - deaggro.Grant(owner) - - var/mob/living/simple_animal/hostile/beastmaster/cat/cat = new(get_turf(owner)) - cat.my_creator = owner - owner.beastmaster |= cat - cat.beastmaster = owner + owner.add_beastmaster_minion(/mob/living/basic/pet/cat/darkpack/summoned) //SUMMON WOLF -/* -/obj/effect/spectral_wolf - name = "Spectral Wolf" - desc = "Bites enemies in other dimensions." - icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' - icon_state = "wolf" - plane = GAME_PLANE - layer = ABOVE_ALL_MOB_LAYER -*/ - /datum/discipline_power/animalism/summon_wolf - name = "Spectral Wolf" - desc = "Summons a phantasmal wolf to attack the target." - - check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE | DISC_CHECK_LYING - + name = "Summon Wolf" + desc = "Summon a spectral wolf to do your bidding." level = 3 violates_masquerade = TRUE - cooldown_length = 8 SECONDS + check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE | DISC_CHECK_LYING /datum/discipline_power/animalism/summon_wolf/activate() . = ..() - var/limit = min(2, level) + owner.st_get_stat(STAT_LEADERSHIP) - if(length(owner.beastmaster) >= limit) - var/mob/living/simple_animal/hostile/beastmaster/beast = pick(owner.beastmaster) - beast.death() - if(!length(owner.beastmaster)) - var/datum/action/beastmaster_stay/stay = new() - stay.Grant(owner) - var/datum/action/beastmaster_deaggro/deaggro = new() - deaggro.Grant(owner) - - var/mob/living/simple_animal/hostile/beastmaster/dog = new(get_turf(owner)) - dog.my_creator = owner - owner.beastmaster |= dog - dog.beastmaster = owner + owner.add_beastmaster_minion(/mob/living/basic/pet/dog/darkpack/summoned) //SUMMON BAT /datum/discipline_power/animalism/summon_bat - name = "Bloodsucker's Communion" - desc = "Summons a swarm of bats to drain blood from the victim and transfer it to you." - - check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE | DISC_CHECK_LYING - + name = "Summon Bat" + desc = "Summon a spectral bat to do your bidding." level = 4 violates_masquerade = TRUE - cooldown_length = 8 SECONDS + check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE | DISC_CHECK_LYING /datum/discipline_power/animalism/summon_bat/activate() . = ..() - var/limit = min(2, level) + owner.st_get_stat(STAT_LEADERSHIP) - if(length(owner.beastmaster) >= limit) - var/mob/living/simple_animal/hostile/beastmaster/beast = pick(owner.beastmaster) - beast.death() - if(!length(owner.beastmaster)) - var/datum/action/beastmaster_stay/stay = new() - stay.Grant(owner) - var/datum/action/beastmaster_deaggro/deaggro = new() - deaggro.Grant(owner) - - var/mob/living/basic/bat/vampire/bat = new(get_turf(owner)) - bat.my_creator = owner - owner.beastmaster |= bat - bat.beastmaster = owner + owner.add_beastmaster_minion(/mob/living/basic/bat/summoned) -//RAT SHAPESHIFT -/obj/effect/proc_holder/spell/targeted/shapeshift/animalism +/datum/action/cooldown/spell/shapeshift/animalism name = "Animalism Form" - desc = "Take on the shape a rat." - charge_max = 5 SECONDS - cooldown_min = 5 SECONDS + desc = "Take on the shape of a rat." + button_icon_state = "shapeshift" + cooldown_time = 5 SECONDS + spell_requirements = NONE revert_on_death = TRUE die_with_shapeshifted_form = FALSE - shapeshift_type = /mob/living/basic/mouse/rat/vampire + convert_damage = TRUE + convert_damage_type = BRUTE + shapeshift_type = /mob/living/basic/mouse/rat + possible_shapes = list(/mob/living/basic/mouse/rat) +//RAT SHAPESHIFT /datum/discipline_power/animalism/rat_shapeshift name = "Skitter" desc = "Become one of the rats that crawl beneath the city." - check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE | DISC_CHECK_LYING - + level = 5 violates_masquerade = TRUE - cooldown_length = 8 SECONDS duration_length = 20 SECONDS - - var/obj/effect/proc_holder/spell/targeted/shapeshift/animalism/shapeshift + var/datum/action/cooldown/spell/shapeshift/animalism/shapeshift_spell + check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE | DISC_CHECK_LYING /datum/discipline_power/animalism/rat_shapeshift/activate() . = ..() - if(!shapeshift) - shapeshift = new(owner) - shapeshift.Shapeshift(owner) + if(!ishuman(owner)) + return + + if(!shapeshift_spell) + shapeshift_spell = new /datum/action/cooldown/spell/shapeshift/animalism() + shapeshift_spell.spell_requirements = NONE + shapeshift_spell.Grant(owner) + RegisterSignal(shapeshift_spell, COMSIG_ACTION_TRIGGER, PROC_REF(on_shapeshift_toggle)) + + shapeshift_spell.cast(owner) + +/datum/discipline_power/animalism/rat_shapeshift/proc/on_shapeshift_toggle(datum/source) + SIGNAL_HANDLER + if(!is_type_in_list(owner, shapeshift_spell.possible_shapes)) + addtimer(CALLBACK(src, PROC_REF(deactivate)), 0.1 SECONDS) /datum/discipline_power/animalism/rat_shapeshift/deactivate() . = ..() - if(owner.stat != DEAD) - shapeshift.Restore(shapeshift.myshape) + if(!owner || owner.stat == DEAD) + return + + if(shapeshift_spell && is_type_in_list(owner, shapeshift_spell.possible_shapes)) + shapeshift_spell.cast(owner) owner.Stun(1.5 SECONDS) + +/mob/living/basic/mouse/vampire/summoned + name = "rat" + desc = "A rat bound to its master's will." + ai_controller = /datum/ai_controller/basic_controller/beastmaster_summon + melee_damage_lower = 3 + melee_damage_upper = 8 + obj_damage = 10 + +/mob/living/basic/mouse/vampire/summoned/Initialize(mapload) + AddElement(/datum/element/ai_retaliate) + . = ..() + var/datum/component/obeys_commands/old = GetComponent(/datum/component/obeys_commands) + if(old) + qdel(old) + +/mob/living/basic/pet/cat/darkpack/summoned + name = "cat" + desc = "A cat bound to its master's will." + ai_controller = /datum/ai_controller/basic_controller/beastmaster_summon + melee_damage_lower = 5 + melee_damage_upper = 12 + obj_damage = 15 + +/mob/living/basic/pet/cat/darkpack/summoned/Initialize(mapload) + . = ..() + var/datum/component/obeys_commands/old = GetComponent(/datum/component/obeys_commands) + if(old) + qdel(old) + +/mob/living/basic/pet/dog/darkpack/summoned + name = "wolf" + desc = "A wolf bound to its master's will." + ai_controller = /datum/ai_controller/basic_controller/beastmaster_summon + basic_mob_flags = DEL_ON_DEATH + mob_biotypes = MOB_ORGANIC + speed = 0.35 + maxHealth = 80 + health = 80 + melee_damage_lower = 10 + melee_damage_upper = 20 + obj_damage = 20 + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'modular_darkpack/modules/deprecated/sounds/dog.ogg' + random_dog_color = FALSE + +/mob/living/basic/pet/dog/darkpack/summoned/Initialize(mapload) + . = ..() + var/datum/component/obeys_commands/old = GetComponent(/datum/component/obeys_commands) + if(old) + qdel(old) + +/mob/living/basic/bat/summoned + name = "bat" + desc = "A bat bound to its master's will." + ai_controller = /datum/ai_controller/basic_controller/beastmaster_summon + melee_damage_lower = 4 + melee_damage_upper = 10 + obj_damage = 10 + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + +/mob/living/basic/bat/summoned/Initialize(mapload) + . = ..() + var/datum/component/obeys_commands/old = GetComponent(/datum/component/obeys_commands) + if(old) + qdel(old) diff --git a/modular_darkpack/modules/powers/code/discipline/auspex.dm b/modular_darkpack/modules/powers/code/discipline/auspex.dm deleted file mode 100644 index 6606b56a4b18..000000000000 --- a/modular_darkpack/modules/powers/code/discipline/auspex.dm +++ /dev/null @@ -1,232 +0,0 @@ -/datum/discipline/auspex - name = "Auspex" - desc = "Allows to see entities, auras and their health through walls." - icon_state = "auspex" - power_type = /datum/discipline_power/auspex - -/datum/discipline_power/auspex - name = "Auspex power name" - desc = "Auspex power description" - - activate_sound = 'modular_darkpack/modules/deprecated/sounds/auspex.ogg' - deactivate_sound = 'modular_darkpack/modules/deprecated/sounds/auspex_deactivate.ogg' - -//HEIGHTENED SENSES -/datum/discipline_power/auspex/heightened_senses - name = "Heightened Senses" - desc = "Enhances your senses far past human limitations." - - level = 1 - check_flags = DISC_CHECK_CONSCIOUS - vitae_cost = 0 - - toggled = TRUE - -/datum/discipline_power/auspex/heightened_senses/activate() - . = ..() - owner.add_client_colour(/datum/client_colour/glass_colour/lightblue) - - ADD_TRAIT(owner, TRAIT_THERMAL_VISION, TRAIT_GENERIC) - ADD_TRAIT(owner, TRAIT_NIGHT_VISION, TRAIT_GENERIC) - - owner.update_sight() - -/datum/discipline_power/auspex/heightened_senses/deactivate() - . = ..() - owner.remove_client_colour(/datum/client_colour/glass_colour/lightblue) - - REMOVE_TRAIT(owner, TRAIT_THERMAL_VISION, TRAIT_GENERIC) - REMOVE_TRAIT(owner, TRAIT_NIGHT_VISION, TRAIT_GENERIC) - - owner.update_sight() - -//AURA PERCEPTION -/datum/discipline_power/auspex/aura_perception - name = "Aura Perception" - desc = "Allows you to perceive the auras of those near you." - - level = 2 - check_flags = DISC_CHECK_CONSCIOUS - vitae_cost = 0 - - toggled = TRUE - -/datum/discipline_power/auspex/aura_perception/activate() - . = ..() - owner.add_client_colour(/datum/client_colour/glass_colour/lightblue) - - var/datum/atom_hud/abductor_hud = GLOB.huds[DATA_HUD_ABDUCTOR] - abductor_hud.add_hud_to(owner) - - owner.update_sight() - -/datum/discipline_power/auspex/aura_perception/deactivate() - . = ..() - owner.remove_client_colour(/datum/client_colour/glass_colour/lightblue) - - var/datum/atom_hud/abductor_hud = GLOB.huds[DATA_HUD_ABDUCTOR] - abductor_hud.remove_hud_from(owner) - - owner.update_sight() - -//THE SPIRIT'S TOUCH -/datum/discipline_power/auspex/the_spirits_touch - name = "The Spirit's Touch" - desc = "Allows you to feel the physical wellbeing of those near you." - - level = 3 - check_flags = DISC_CHECK_CONSCIOUS - vitae_cost = 0 - - toggled = TRUE - -/datum/discipline_power/auspex/the_spirits_touch/activate() - . = ..() - owner.add_client_colour(/datum/client_colour/glass_colour/lightblue) - - var/datum/atom_hud/health_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - health_hud.add_hud_to(owner) - - owner.update_sight() - -/datum/discipline_power/auspex/the_spirits_touch/deactivate() - . = ..() - owner.remove_client_colour(/datum/client_colour/glass_colour/lightblue) - - var/datum/atom_hud/health_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - health_hud.remove_hud_from(owner) - - owner.update_sight() - -//TELEPATHY -/datum/discipline_power/auspex/telepathy - name = "Telepathy" - desc = "Feel the psychic resonances left on objects you can touch." - - level = 4 - check_flags = DISC_CHECK_CONSCIOUS - vitae_cost = 0 - - toggled = TRUE - -/datum/discipline_power/auspex/telepathy/activate() - . = ..() - owner.add_client_colour(/datum/client_colour/glass_colour/lightblue) - - owner.auspex_examine = TRUE - - owner.update_sight() - -/datum/discipline_power/auspex/telepathy/deactivate() - . = ..() - owner.remove_client_colour(/datum/client_colour/glass_colour/lightblue) - - owner.auspex_examine = FALSE - - owner.update_sight() - -//sobs loudly -//rework me -/atom/examine(mob/user) - . = ..() - if(ishuman(user)) - var/mob/living/carbon/human/Z = user - if(Z.auspex_examine) - if(!isturf(src) && !isobj(src) && !ismob(src)) - return - var/list/fingerprints = list() - var/list/blood = return_blood_DNA() - var/list/fibers = return_fibers() - var/list/reagents = list() - - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(!H.gloves) - fingerprints += md5(H.dna.uni_identity) - - else if(!ismob(src)) - fingerprints = return_fingerprints() - - - if(isturf(src)) - var/turf/T = src - // Only get reagents from non-mobs. - if(T.reagents && T.reagents.reagent_list.len) - - for(var/datum/reagent/R in T.reagents.reagent_list) - T.reagents[R.name] = R.volume - - // Get blood data from the blood reagent. - if(istype(R, /datum/reagent/blood)) - - if(R.data["blood_DNA"] && R.data["blood_type"]) - var/blood_DNA = R.data["blood_DNA"] - var/blood_type = R.data["blood_type"] - LAZYINITLIST(blood) - blood[blood_DNA] = blood_type - if(isobj(src)) - var/obj/T = src - // Only get reagents from non-mobs. - if(T.reagents && T.reagents.reagent_list.len) - - for(var/datum/reagent/R in T.reagents.reagent_list) - T.reagents[R.name] = R.volume - - // Get blood data from the blood reagent. - if(istype(R, /datum/reagent/blood)) - - if(R.data["blood_DNA"] && R.data["blood_type"]) - var/blood_DNA = R.data["blood_DNA"] - var/blood_type = R.data["blood_type"] - LAZYINITLIST(blood) - blood[blood_DNA] = blood_type - - // We gathered everything. Create a fork and slowly display the results to the holder of the scanner. - - var/found_something = FALSE - - // Fingerprints - if(length(fingerprints)) - to_chat(user, span_info("<B>Prints:</B>")) - for(var/finger in fingerprints) - to_chat(user, "[finger]") - found_something = TRUE - - // Blood - if (length(blood)) - to_chat(user, span_info("<B>Blood:</B>")) - found_something = TRUE - for(var/B in blood) - to_chat(user, "Type: <font color='red'>[blood[B]]</font> DNA (UE): <font color='red'>[B]</font>") - - //Fibers - if(length(fibers)) - to_chat(user, span_info("<B>Fibers:</B>")) - for(var/fiber in fibers) - to_chat(user, "[fiber]") - found_something = TRUE - - //Reagents - if(length(reagents)) - to_chat(user, span_info("<B>Reagents:</B>")) - for(var/R in reagents) - to_chat(user, "Reagent: <font color='red'>[R]</font> Volume: <font color='red'>[reagents[R]]</font>") - found_something = TRUE - - if(!found_something) - to_chat(user, "<I># No forensic traces found #</I>") // Don't display this to the holder user - return - -//PSYCHIC PROJECTION -/datum/discipline_power/auspex/psychic_projection - name = "Psychic Projection" - desc = "Leave your body behind and fly across the land." - - level = 5 - check_flags = DISC_CHECK_CONSCIOUS - vitae_cost = 1 - -/datum/discipline_power/auspex/psychic_projection/activate() - . = ..() - owner.ghostize(can_reenter_corpse = TRUE, aghosted = FALSE, auspex_ghosted = TRUE) - owner.soul_state = SOUL_PROJECTING diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm b/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm new file mode 100644 index 000000000000..dbe6f5ed2ef3 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm @@ -0,0 +1,113 @@ +/datum/atom_hud/data/auspex_aura + hud_icons = list(AUSPEX_AURA_HUD) + +/datum/component/aura + // A list of currently selected emotions by the player + var/current_aura = AURA_INNOCENT + +/datum/component/aura/RegisterWithParent() + . = ..() + var/mob/parent_mob = parent + var/datum/atom_hud/data/auspex_aura/target_hud = GLOB.huds[DATA_HUD_AUSPEX_AURAS] + target_hud.add_atom_to_hud(parent_mob) + + add_verb(parent_mob, /mob/verb/emotion_panel) + RegisterSignal(parent_mob, COMSIG_MOB_EMOTION_CHANGED, PROC_REF(update_emotions)) + RegisterSignal(parent_mob, COMSIG_MOB_UPDATE_AURA, PROC_REF(update_aura)) + update_aura() + +/datum/component/aura/UnregisterFromParent() + var/mob/parent_mob = parent + var/datum/atom_hud/data/auspex_aura/target_hud = GLOB.huds[DATA_HUD_AUSPEX_AURAS] + target_hud.remove_atom_from_hud(parent_mob) + + remove_verb(parent_mob, /mob/verb/emotion_panel) + UnregisterSignal(parent_mob, list(COMSIG_MOB_EMOTION_CHANGED, COMSIG_MOB_UPDATE_AURA)) + return ..() + +/datum/component/aura/proc/update_emotions(mob/changed_mob, new_emotion) + SIGNAL_HANDLER + + if(current_aura == new_emotion) + return + + current_aura = GLOB.aura_list[new_emotion] + update_aura() + +/datum/component/aura/proc/update_aura() + SIGNAL_HANDLER + + var/mob/parent_mob = parent + var/image/holder = parent_mob.hud_list[AUSPEX_AURA_HUD] + if(!holder) + holder = new + var/mutable_appearance/aura_appearance = mutable_appearance('modular_darkpack/modules/powers/icons/auras.dmi', "aura", ABOVE_MOB_LAYER, parent_mob, GAME_PLANE) + update_aura_colors(aura_appearance, holder) + update_aura_overlays(aura_appearance, holder) + update_aura_filters(aura_appearance, holder) + +/datum/component/aura/proc/is_color(input_text) + if(findtext(input_text, GLOB.is_color)) + return TRUE + return FALSE + +/datum/component/aura/proc/update_aura_colors(mutable_appearance/aura_appearance, image/holder) + var/output_color + if(is_color(current_aura)) + output_color = current_aura + else + output_color = null + + aura_appearance.color = output_color + holder.appearance = aura_appearance + + var/mob/parent_mob = parent + if(iskindred(parent_mob)) + var/icon/temporary_icon_holder = holder.appearance + var/mutable_appearance/aura_image = mutable_appearance(temporary_icon_holder, "aura", ABOVE_MOB_LAYER, parent_mob, GAME_PLANE) + + var/list/hsv_color_value = rgb2hsv(holder.color) + hsv_color_value[2] = hsv_color_value[2] * 0.7 // Reduce saturation for kindred + + aura_image.color = hsv2rgb(hsv_color_value) + holder.appearance = aura_image + + +/datum/component/aura/proc/update_aura_overlays(mutable_appearance/aura_appearance, image/holder) + holder.cut_overlays() + var/mob/parent_mob = parent + + if(HAS_TRAIT(parent_mob, TRAIT_DIABLERIE)) + var/image/diablerie_image = image('modular_darkpack/modules/powers/icons/auras.dmi', parent_mob, "diab", ABOVE_MOB_LAYER+1) + holder.add_overlay(diablerie_image) + + if(current_aura == AURA_ANXIOUS) + var/icon/temporary_icon_holder = icon('modular_darkpack/modules/powers/icons/auras.dmi', "aura") + var/icon/static_icon = getStaticIcon(temporary_icon_holder) + var/mutable_appearance/static_image = mutable_appearance(static_icon, "aura", ABOVE_MOB_LAYER+2, parent_mob, GAME_PLANE) + static_image.appearance_flags |= RESET_COLOR + holder.add_overlay(static_image) + + if(isghoul(parent_mob)) + var/icon/temporary_icon_holder = icon('modular_darkpack/modules/powers/icons/auras.dmi', "aurablotch") + var/mutable_appearance/aura_blotches = mutable_appearance(temporary_icon_holder, "aurablotch", ABOVE_MOB_LAYER+3, parent_mob, GAME_PLANE) + + var/list/hsv_color_value = rgb2hsv(aura_appearance.color) + hsv_color_value[2] = hsv_color_value[2] * 0.7 // Reduce saturation for ghouls + + var/icon/icon_mask = getIconMask(aura_blotches) + var/mutable_appearance/aura_icon = new(aura_appearance) + aura_icon.color = hsv2rgb(hsv_color_value) + aura_icon.add_filter("alpha_mask", 1, alpha_mask_filter(icon = icon_mask)) + holder.add_overlay(aura_icon) + + if(isavatar(parent_mob) || isobserver(parent_mob)) + holder.opacity = holder.opacity * 0.5 + +/datum/component/aura/proc/update_aura_filters(mutable_appearance/aura_appearance, image/holder) + var/mob/parent_mob = parent + + remove_wibbly_filters(holder) + if(HAS_TRAIT(parent_mob, TRAIT_IN_FRENZY)) + apply_wibbly_filters(holder) + diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm b/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm new file mode 100644 index 000000000000..fe37e1b9d5f5 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/auspex/auspex.dm @@ -0,0 +1,279 @@ +#define SENSE_VISION "Vision" +#define SENSE_HEARING "Hearing" +#define SENSE_SMELL "Smell" +#define SENSE_TASTE "Taste" +#define SENSE_TOUCH "Touch" + +/datum/discipline/auspex + name = "Auspex" + desc = "Allows to see entities, auras and their health through walls." + icon_state = "auspex" + power_type = /datum/discipline_power/auspex + +/datum/discipline_power/auspex + name = "Auspex power name" + desc = "Auspex power description" + + activate_sound = 'modular_darkpack/modules/powers/sounds/auspex/auspex.ogg' + deactivate_sound = 'modular_darkpack/modules/powers/sounds/auspex/auspex_deactivate.ogg' + +//HEIGHTENED SENSES +/datum/discipline_power/auspex/heightened_senses + name = "Heightened Senses" + desc = "Enhances your senses far past human limitations." + + level = 1 + check_flags = DISC_CHECK_CONSCIOUS + vitae_cost = 0 + cooldown_length = 1 TURNS + + toggled = TRUE + +/datum/discipline_power/auspex/heightened_senses/activate() + . = ..() + + var/list/chosen_sense = tgui_input_checkboxes(owner, "Choose a sense to heighten", "Heightened Senses", list( + SENSE_VISION, + SENSE_HEARING, + SENSE_SMELL, + SENSE_TASTE, + SENSE_TOUCH + )) + if(isnull(chosen_sense)) + deactivate() + return + var/list/output_senses = list() + for(var/list/sense as anything in chosen_sense) + output_senses += sense[1] + + if(SENSE_VISION in output_senses) + owner.client?.view_size?.setTo(2) // This increases the view size of the player by 2 tiles in each direction. I dont know why it's called Set if it Adds. + ADD_TRAIT(owner, TRAIT_REFLECTIVE_EYES, DISCIPLINE_TRAIT) + var/obj/item/organ/eyes/kindred_eyes = owner.get_organ_slot(ORGAN_SLOT_EYES) + if(kindred_eyes) + kindred_eyes.flash_protect = max(kindred_eyes.flash_protect += -2, FLASH_PROTECTION_HYPER_SENSITIVE) + if(SENSE_HEARING in output_senses) + ADD_TRAIT(owner, TRAIT_GOOD_HEARING, DISCIPLINE_TRAIT) + var/obj/item/organ/ears/kindred_ears = owner.get_organ_slot(ORGAN_SLOT_EARS) + kindred_ears.damage_multiplier = kindred_ears.damage_multiplier + 1 + if(SENSE_SMELL in output_senses) + owner.dna?.add_mutation(/datum/mutation/olfaction, DISCIPLINE_TRAIT) + if(SENSE_TASTE in output_senses) + ADD_TRAIT(owner, TRAIT_REAGENT_SCANNER, DISCIPLINE_TRAIT) + if(SENSE_TOUCH in output_senses) + RegisterSignals(owner, list(COMSIG_CARBON_HELP_ACT, COMSIG_ON_CARBON_SLIP, COMSIG_LIVING_DISARM_HIT, COMSIG_LIVING_TRYING_TO_PULL), PROC_REF(on_touch)) + owner.AddComponent(/datum/component/heartbeat_sensing, color_path = /datum/client_colour/psyker) + + owner.st_add_stat_mod(STAT_PERCEPTION, discipline.level, "heightened_senses") + +/datum/discipline_power/auspex/heightened_senses/deactivate() + . = ..() + // Smell + var/datum/mutation/mutation = owner.dna?.get_mutation(/datum/mutation/olfaction) + if(mutation) + owner.dna?.remove_mutation(mutation, mutation.sources) + // Hearing + REMOVE_TRAIT(owner, TRAIT_GOOD_HEARING, DISCIPLINE_TRAIT) + var/obj/item/organ/ears/kindred_ears = owner.get_organ_slot(ORGAN_SLOT_EARS) + kindred_ears.damage_multiplier = initial(kindred_ears.damage_multiplier) + // Vision + owner.client?.view_size?.resetToDefault() + REMOVE_TRAIT(owner, TRAIT_REFLECTIVE_EYES, DISCIPLINE_TRAIT) + var/obj/item/organ/eyes/kindred_eyes = owner.get_organ_slot(ORGAN_SLOT_EYES) + if(kindred_eyes) + kindred_eyes.flash_protect = max(kindred_eyes.flash_protect += 2, FLASH_PROTECTION_NONE) + // Taste + REMOVE_TRAIT(owner, TRAIT_REAGENT_SCANNER, DISCIPLINE_TRAIT) + // Touch + UnregisterSignal(owner, list(COMSIG_CARBON_HELP_ACT, COMSIG_ON_CARBON_SLIP, COMSIG_LIVING_DISARM_HIT, COMSIG_LIVING_TRYING_TO_PULL)) + qdel(owner.GetComponent(/datum/component/heartbeat_sensing)) + + owner.st_remove_stat_mod(STAT_PERCEPTION, "heightened_senses") + +/datum/discipline_power/auspex/heightened_senses/proc/on_touch(datum/source) + SIGNAL_HANDLER + + INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "shiver", forced = TRUE) + owner.Stun(0.5 SECONDS) + +//AURA PERCEPTION +/datum/discipline_power/auspex/aura_perception + name = "Aura Perception" + desc = "Allows you to perceive the auras of those near you." + + level = 2 + check_flags = DISC_CHECK_CONSCIOUS + duration_length = 1 SCENES + cooldown_length = 1 SCENES + vitae_cost = 0 + +/datum/discipline_power/auspex/aura_perception/activate() + . = ..() + var/datum/atom_hud/data/auspex_aura/target_hud = GLOB.huds[DATA_HUD_AUSPEX_AURAS] + target_hud.show_to(owner) + +/datum/discipline_power/auspex/aura_perception/deactivate() + . = ..() + var/datum/atom_hud/data/auspex_aura/target_hud = GLOB.huds[DATA_HUD_AUSPEX_AURAS] + target_hud.hide_from(owner) + +//THE SPIRIT'S TOUCH +/datum/discipline_power/auspex/the_spirits_touch + name = "The Spirit's Touch" + desc = "Allows you to feel the physical wellbeing of those near you." + + level = 3 + check_flags = DISC_CHECK_CONSCIOUS + vitae_cost = 0 + cooldown_length = 1 TURNS + + toggled = TRUE + +/datum/discipline_power/auspex/the_spirits_touch/activate() + . = ..() + + var/datum/atom_hud/health_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] + health_hud.show_to(owner) + owner.update_sight() + + RegisterSignal(owner, COMSIG_MOB_EXAMINING, PROC_REF(scan)) + +/datum/discipline_power/auspex/the_spirits_touch/deactivate() + . = ..() + + var/datum/atom_hud/health_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] + health_hud.hide_from(owner) + owner.update_sight() + + UnregisterSignal(owner, COMSIG_MOB_EXAMINING) + +/datum/discipline_power/auspex/the_spirits_touch/proc/scan(mob/user, atom/scanned_atom, list/examine_strings) + // Can scan items we hold and store + if(!(scanned_atom in user.get_all_contents())) + // Can remotely scan objects and mobs. + if((get_dist(scanned_atom, user) > 8) || (!(scanned_atom in view(8, user)))) + return TRUE + playsound(owner, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) + + // GATHER INFORMATION + + var/datum/detective_scanner_log/log_entry = new + + // Start gathering + + log_entry.scan_target = scanned_atom.name + + var/list/atom_fibers = GET_ATOM_FIBRES(scanned_atom) + if(length(atom_fibers)) + log_entry.add_data_entry(DETSCAN_CATEGORY_FIBER, atom_fibers.Copy()) + + var/list/blood = GET_ATOM_BLOOD_DNA(scanned_atom) + if(length(blood)) + log_entry.add_data_entry(DETSCAN_CATEGORY_BLOOD, blood.Copy()) + + if(ishuman(scanned_atom)) + var/mob/living/carbon/human/scanned_human = scanned_atom + if(!scanned_human.gloves) + log_entry.add_data_entry( + DETSCAN_CATEGORY_FINGERS, + rustg_hash_string(RUSTG_HASH_MD5, scanned_human.dna?.unique_identity) + ) + + else if(!ismob(scanned_atom)) + + var/list/atom_fingerprints = GET_ATOM_FINGERPRINTS(scanned_atom) + if(length(atom_fingerprints)) + log_entry.add_data_entry(DETSCAN_CATEGORY_FINGERS, atom_fingerprints.Copy()) + + // Only get reagents from non-mobs. + for(var/datum/reagent/present_reagent as anything in scanned_atom.reagents?.reagent_list) + log_entry.add_data_entry(DETSCAN_CATEGORY_REAGENTS, list(present_reagent.name = present_reagent.volume)) + + // Get blood data from the blood reagent. + if(!istype(present_reagent, /datum/reagent/blood)) + continue + + var/blood_DNA = present_reagent.data["blood_DNA"] + var/blood_type = present_reagent.data["blood_type"] + if(!blood_DNA || !blood_type) + continue + + log_entry.add_data_entry(DETSCAN_CATEGORY_BLOOD, list(blood_DNA = blood_type)) + + if(istype(scanned_atom, /obj/item/card/id)) + var/obj/item/card/id/user_id = scanned_atom + for(var/region in DETSCAN_ACCESS_ORDER()) + var/access_in_region = SSid_access.accesses_by_region[region] & user_id.GetAccess() + if(!length(access_in_region)) + continue + var/list/access_names = list() + for(var/access_num in access_in_region) + access_names += SSid_access.get_access_desc(access_num) + + log_entry.add_data_entry(DETSCAN_CATEGORY_ACCESS, list("[region]" = english_list(access_names))) + + // sends it off to be modified by the items + SEND_SIGNAL(scanned_atom, COMSIG_DETECTIVE_SCANNED, user, log_entry) + + // Perform sorting now, because probably this will be never modified + log_entry.sort_data_entries() + var/list/generated_report_text = log_entry.generate_report_text() + var/output_report = generated_report_text.Join() + + examine_strings += boxed_message(output_report) + return TRUE + +//TELEPATHY +/datum/discipline_power/auspex/telepathy + name = "Telepathy" + desc = "Project your thoughts into the mind of another." + + level = 4 + check_flags = DISC_CHECK_CONSCIOUS + target_type = TARGET_LIVING + vitae_cost = 0 + cooldown_length = 1 TURNS + range = 7 + +/datum/discipline_power/auspex/telepathy/activate(mob/living/target) + . = ..() + var/input_message = tgui_input_text(owner, "What message will you project to them?", max_length = MAX_MESSAGE_LEN, encode = FALSE) + if (!input_message) + return + + //sanitisation! + input_message = CAN_BYPASS_FILTER(owner) ? strip_html_full(input_message, MAX_MESSAGE_LEN) : input_message + var/list/filter_result = CAN_BYPASS_FILTER(owner) ? null : is_ooc_filtered(input_message) + if(filter_result) + REPORT_CHAT_FILTER_TO_USER(owner, filter_result) + log_filter("OOC", input_message, filter_result) + return + + log_directed_talk(owner, target, input_message, LOG_SAY, "Telepathy") + to_chat(owner, span_notice("You project your thoughts into [target]'s mind: [input_message]")) + to_chat(target, span_boldannounce("You hear a voice in your head: [input_message]")) + +//PSYCHIC PROJECTION +/datum/discipline_power/auspex/psychic_projection + name = "Psychic Projection" + desc = "Leave your body behind and fly across the land." + + willpower_cost = 1 + level = 5 + check_flags = DISC_CHECK_CONSCIOUS + vitae_cost = 0 + cooldown_length = 1 TURNS + +/datum/discipline_power/auspex/psychic_projection/activate() + . = ..() + var/roll = SSroll.storyteller_roll(owner.st_get_stat(STAT_PERCEPTION) + owner.st_get_stat(STAT_AWARENESS), 7, owner, owner, TRUE) + if(roll > 0) + owner.enter_avatar() + else + to_chat(owner, span_warning("Your mind fails to leave your body.")) + +#undef SENSE_VISION +#undef SENSE_HEARING +#undef SENSE_SMELL +#undef SENSE_TASTE +#undef SENSE_TOUCH diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/avatar/avatar.dm b/modular_darkpack/modules/powers/code/discipline/auspex/avatar/avatar.dm new file mode 100644 index 000000000000..e002ad15546d --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/auspex/avatar/avatar.dm @@ -0,0 +1,57 @@ +/mob/living/basic/avatar + name = "ghost" + desc = "A malevolent spirit." + icon = 'icons/mob/simple/mob.dmi' + icon_state = "ghost" + mob_biotypes = MOB_SPIRIT + incorporeal_move = INCORPOREAL_MOVE_AVATAR + invisibility = INVISIBILITY_REVENANT + see_invisible = INVISIBILITY_REVENANT + health = INFINITY // You cant kill a ghost + maxHealth = INFINITY + plane = GHOST_PLANE + sight = SEE_SELF + throwforce = 0 + + friendly_verb_continuous = "touches" + friendly_verb_simple = "touch" + response_help_continuous = "passes through" + response_help_simple = "pass through" + response_disarm_continuous = "swings through" + response_disarm_simple = "swing through" + response_harm_continuous = "punches through" + response_harm_simple = "punch through" + unsuitable_atmos_damage = 0 + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0) + habitable_atmos = null + minimum_survivable_temperature = 0 + maximum_survivable_temperature = INFINITY + + status_flags = NONE + density = FALSE + move_resist = MOVE_FORCE_OVERPOWERING + mob_size = MOB_SIZE_TINY + movement_type = GROUND | FLYING + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB + speed = 1 + hud_type = /datum/hud/avatar + +/mob/living/basic/avatar/Initialize(mapload) + . = ..() + + var/mob/body = loc + if(ismob(body)) + gender = body.gender + mind = body.mind //we don't transfer the mind but we keep a reference to it. + + abstract_move(get_turf(body)) + + AddElement(/datum/element/movetype_handler) + + ADD_TRAIT(src, TRAIT_HEAR_THROUGH_DARKNESS, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_GOOD_HEARING, INNATE_TRAIT) + +//We don't want to update the current var +//But we will still carry a mind. +/mob/living/basic/avatar/mind_initialize() + return diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/avatar/avatar_hud.dm b/modular_darkpack/modules/powers/code/discipline/auspex/avatar/avatar_hud.dm new file mode 100644 index 000000000000..29aa996bb35e --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/auspex/avatar/avatar_hud.dm @@ -0,0 +1,28 @@ + +/datum/hud/avatar/New(mob/owner) + ..() + var/atom/movable/screen/using + + using = new /atom/movable/screen/avatar/reenter_corpse(null, src) + using.screen_loc = ui_ghost_reenter_corpse + static_inventory += using + + floor_change = new /atom/movable/screen/floor_changer/vertical/ghost(null, src) + floor_change.screen_loc = ui_ghost_floor_changer + static_inventory += floor_change + +/datum/hud/avatar/show_hud(version = 0, mob/viewmob) + . = ..() + if(!.) + return + var/mob/screenmob = viewmob || mymob + screenmob.client.screen += static_inventory + +/atom/movable/screen/avatar/reenter_corpse + name = "Reenter corpse" + icon = 'icons/hud/screen_ghost.dmi' + icon_state = "reenter_corpse" + +/atom/movable/screen/avatar/reenter_corpse/Click() + var/mob/living/basic/avatar/G = usr + G.reenter_corpse() diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/avatar/avatar_verbs.dm b/modular_darkpack/modules/powers/code/discipline/auspex/avatar/avatar_verbs.dm new file mode 100644 index 000000000000..13938301f210 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/auspex/avatar/avatar_verbs.dm @@ -0,0 +1,43 @@ +/mob/living/basic/avatar/verb/reenter_corpse() + set name = "Re-enter Corpse" + + exit_avatar(force = FALSE) + +/mob/living/basic/avatar/proc/exit_avatar(force = FALSE) + if(!client) + return + if(!mind || QDELETED(mind.current)) + to_chat(src, span_warning("You have no body.")) + return + if((get_turf(src) != get_turf(mind.current)) && !force) + to_chat(src, span_warning("You must be at your body's location to re-enter it.")) + return + if(mind.current.key && !IS_FAKE_KEY(mind.current.key)) //makes sure we don't accidentally kick any clients + to_chat(usr, span_warning("Another consciousness is in your body...It is resisting you.")) + return + client.view_size.resetToDefault()//Let's reset so people can't become allseeing gods + SStgui.on_transfer(src, mind.current) // Transfer NanoUIs. + if(mind.current.stat == DEAD) + to_chat(src, span_warning("To leave your body again use the Ghost verb.")) + mind.current.PossessByPlayer(key) + mind.current.client.init_verbs() + qdel(src) + return TRUE + +/mob/living/basic/avatar/down() + set name = "Move Down" + set category = "IC" + + if(zMove(DOWN, z_move_flags = ZMOVE_FEEDBACK)) + to_chat(src, span_notice("You move down.")) + +/mob/living/basic/avatar/up() + set name = "Move Upwards" + set category = "IC" + + if(zMove(UP, z_move_flags = ZMOVE_FEEDBACK)) + to_chat(src, span_notice("You move upwards.")) + +/mob/living/basic/avatar/can_z_move(direction, turf/start, turf/destination, z_move_flags = NONE, mob/living/rider) + z_move_flags |= ZMOVE_IGNORE_OBSTACLES //avatars do not respect these FLOORS you speak so much of. + return ..() diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/avatar/mob_procs.dm b/modular_darkpack/modules/powers/code/discipline/auspex/avatar/mob_procs.dm new file mode 100644 index 000000000000..b3e0f26eca45 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/auspex/avatar/mob_procs.dm @@ -0,0 +1,11 @@ +/mob/proc/enter_avatar() + if(!key) + return + if(IS_FAKE_KEY(key)) // Skip aghosts. + return + + stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now + var/mob/living/basic/avatar/ghost = new(src) // Transfer safety to observer spawning proc. + SStgui.on_transfer(src, ghost) // Transfer NanoUIs. + ghost.PossessByPlayer(key) + ghost.client?.init_verbs() diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/emotion_panel.dm b/modular_darkpack/modules/powers/code/discipline/auspex/emotion_panel.dm new file mode 100644 index 000000000000..210b7f47aac9 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/auspex/emotion_panel.dm @@ -0,0 +1,11 @@ +///Shows a tgui window with memories +/mob/verb/emotion_panel() + set name = "Emotion Panel" + set category = "IC" + set desc = "Change your character's emotions." + + var/new_emotion = tgui_input_list(src, "What are you feeling?", "Feelings", GLOB.aura_list) + if(isnull(new_emotion)) + return FALSE + SEND_SIGNAL(src, COMSIG_MOB_EMOTION_CHANGED, new_emotion) + diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/heartbeat_sensing_component.dm b/modular_darkpack/modules/powers/code/discipline/auspex/heartbeat_sensing_component.dm new file mode 100644 index 000000000000..f35a3be780ce --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/auspex/heartbeat_sensing_component.dm @@ -0,0 +1,117 @@ +/datum/component/heartbeat_sensing + /// Time between heartbeat sensings. IMPORTANT!! The effective time in local and the effective time in live are very different. The second is noticeably slower. + var/cooldown_time = 1 SECONDS + /// Time for the image to start fading out. + var/image_expiry_time = 0.7 SECONDS + /// Time for the image to fade in. + var/fade_in_time = 0.2 SECONDS + /// Time for the image to fade out and delete itself. + var/fade_out_time = 0.3 SECONDS + /// Ref of the client color we give to the parent. + var/client_colour + /// A matrix that turns everything except #ffffff into pure blackness, used for our images (the outlines are #ffffff). + var/static/list/black_white_matrix = list(85, 85, 85, 0, 85, 85, 85, 0, 85, 85, 85, 0, 0, 0, 0, 1, -254, -254, -254, 0) + /// Associative list of receivers to lists of atoms they are rendering (those atoms are associated to data of the image and time they were rendered at). + var/list/receivers = list() + /// Cooldown for the heartbeat sensing. + COOLDOWN_DECLARE(cooldown_last) + +/datum/component/heartbeat_sensing/Initialize(cooldown_time, image_expiry_time, fade_in_time, fade_out_time, color_path) + . = ..() + var/mob/living/parent_mob = parent + if(!istype(parent_mob)) + return COMPONENT_INCOMPATIBLE + if(!isnull(cooldown_time)) + src.cooldown_time = cooldown_time + if(!isnull(image_expiry_time)) + src.image_expiry_time = image_expiry_time + if(!isnull(fade_in_time)) + src.fade_in_time = fade_in_time + if(!isnull(fade_out_time)) + src.fade_out_time = fade_out_time + if(ispath(color_path)) + client_colour = parent_mob.add_client_colour(color_path, "heartbeat_sensing_colour") + START_PROCESSING(SSfastprocess, src) + +/datum/component/heartbeat_sensing/Destroy(force) + STOP_PROCESSING(SSfastprocess, src) + QDEL_NULL(client_colour) + for(var/mob/living/echolocate_receiver as anything in receivers) + if(!echolocate_receiver.client) + continue + for(var/atom/rendered_atom as anything in receivers[echolocate_receiver]) + echolocate_receiver.client.images -= receivers[echolocate_receiver][rendered_atom]["image"] + receivers -= list(echolocate_receiver) + return ..() + +/datum/component/heartbeat_sensing/process() + var/mob/living/parent_mob = parent + if(parent_mob.stat == DEAD) + return + sense_heartbeat() + +/datum/component/heartbeat_sensing/proc/sense_heartbeat() + if(!COOLDOWN_FINISHED(src, cooldown_last)) + return + COOLDOWN_START(src, cooldown_last, cooldown_time) + var/mob/living/parent_mob = parent + if(isnull(receivers[parent_mob])) + receivers[parent_mob] = list() + for(var/mob/living/carbon/living_carbon in orange(parent_mob.client?.view, get_turf(parent_mob))) + var/obj/item/organ/heart/beating_heart = living_carbon.get_organ_slot(ORGAN_SLOT_HEART) + if(!istype(beating_heart) && !(beating_heart.is_beating())) + continue + show_heartbeat_image(living_carbon) + +/datum/component/heartbeat_sensing/proc/show_heartbeat_image(mob/living_mob) + var/current_time = "[world.time]" + show_image(generate_appearance(living_mob), living_mob, current_time) + addtimer(CALLBACK(src, PROC_REF(fade_images), current_time), image_expiry_time) + +/datum/component/heartbeat_sensing/proc/show_image(image/input_appearance, atom/input, current_time) + var/image/final_image = image(input_appearance) + final_image.layer += EFFECTS_LAYER + final_image.plane = FULLSCREEN_PLANE + final_image.loc = input + final_image.dir = input.dir + final_image.alpha = 0 + var/list/fade_ins = list(final_image) + for(var/mob/living/echolocate_receiver as anything in receivers) + if(echolocate_receiver == input) + continue + if(receivers[echolocate_receiver][input]) + var/previous_image = receivers[echolocate_receiver][input]["image"] + fade_ins |= previous_image + receivers[echolocate_receiver][input] = list("image" = previous_image, "time" = current_time) + else + if(echolocate_receiver.client) + echolocate_receiver.client.images += final_image + receivers[echolocate_receiver][input] = list("image" = final_image, "time" = current_time) + for(var/image_echo in fade_ins) + animate(image_echo, alpha = 255, time = fade_in_time) + +/datum/component/heartbeat_sensing/proc/generate_appearance(atom/input) + var/mutable_appearance/copied_appearance = new /mutable_appearance() + copied_appearance.appearance = input + copied_appearance.color = black_white_matrix + copied_appearance.filters += outline_filter(size = 1, color = COLOR_WHITE) + return copied_appearance + +/datum/component/heartbeat_sensing/proc/fade_images(from_when) + var/fade_outs = list() + for(var/mob/living/echolocate_receiver as anything in receivers) + for(var/atom/rendered_atom as anything in receivers[echolocate_receiver]) + if(receivers[echolocate_receiver][rendered_atom]["time"] <= from_when) + fade_outs |= receivers[echolocate_receiver][rendered_atom]["image"] + for(var/image_echo in fade_outs) + animate(image_echo, alpha = 0, time = fade_out_time) + addtimer(CALLBACK(src, PROC_REF(delete_images), from_when), fade_out_time) + +/datum/component/heartbeat_sensing/proc/delete_images(from_when) + for(var/mob/living/echolocate_receiver as anything in receivers) + for(var/atom/rendered_atom as anything in receivers[echolocate_receiver]) + if(receivers[echolocate_receiver][rendered_atom]["time"] <= from_when && echolocate_receiver.client) + echolocate_receiver.client.images -= receivers[echolocate_receiver][rendered_atom]["image"] + receivers[echolocate_receiver] -= rendered_atom + if(!length(receivers[echolocate_receiver])) + receivers -= echolocate_receiver diff --git a/modular_darkpack/modules/powers/code/discipline/bloodheal/bloodheal.dm b/modular_darkpack/modules/powers/code/discipline/bloodheal/bloodheal.dm index a8308a095ee1..c85c717a1785 100644 --- a/modular_darkpack/modules/powers/code/discipline/bloodheal/bloodheal.dm +++ b/modular_darkpack/modules/powers/code/discipline/bloodheal/bloodheal.dm @@ -77,11 +77,6 @@ owner.update_damage_overlays() owner.update_health_hud() -/datum/discipline_power/bloodheal/can_activate_untargeted(alert) - adjust_vitae_cost() - - . = ..() - /datum/discipline_power/bloodheal/spend_resources() adjust_vitae_cost() @@ -90,8 +85,8 @@ /datum/discipline_power/bloodheal/proc/adjust_vitae_cost() vitae_cost = initial(vitae_cost) //tally up damage - var/total_bashing_lethal_damage = owner.getBruteLoss() + owner.getToxLoss() + owner.getOxyLoss() - var/total_aggravated_damage = owner.getAggLoss() + owner.getFireLoss() + var/total_bashing_lethal_damage = owner.get_brute_loss() + owner.get_tox_loss() + owner.get_oxy_loss() + var/total_aggravated_damage = owner.get_agg_loss() + owner.get_fire_loss() //lower blood expenditure to what's necessary var/vitae_to_heal_bashing_lethal = ceil(total_bashing_lethal_damage / HEAL_BASHING_LETHAL_DAMAGE) diff --git a/modular_darkpack/modules/powers/code/discipline/celerity/celerity.dm b/modular_darkpack/modules/powers/code/discipline/celerity/celerity.dm index 78398b76221b..16d2d1584d66 100644 --- a/modular_darkpack/modules/powers/code/discipline/celerity/celerity.dm +++ b/modular_darkpack/modules/powers/code/discipline/celerity/celerity.dm @@ -14,11 +14,8 @@ /datum/discipline_power/celerity/proc/temporis_explode(datum/source, datum/discipline_power/power, atom/target) SIGNAL_HANDLER - // TODO: [Rebase] reimplement temporis - /* if (!istype(power, /datum/discipline_power/temporis/patience_of_the_norns) && !istype(power, /datum/discipline_power/temporis/clothos_gift)) return - */ to_chat(owner, span_userdanger("You try to use Temporis, but your active Celerity accelerates your temporal field out of your control!")) INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "scream") @@ -26,12 +23,6 @@ return POWER_CANCEL_ACTIVATION -/datum/discipline_power/celerity/proc/apply_passive_dexterity_bonus(bonus) - if (owner.st_get_stat_mod(STAT_DEXTERITY, "celerity") >= bonus) - return - - owner.st_add_stat_mod(STAT_DEXTERITY, bonus, "celerity") - //CELERITY 1 /datum/discipline_power/celerity/one name = "Celerity 1" @@ -53,18 +44,16 @@ . = ..() RegisterSignal(owner, COMSIG_POWER_PRE_ACTIVATION, PROC_REF(temporis_explode)) - owner.apply_status_effect(/datum/status_effect/celerity/one) /datum/discipline_power/celerity/one/deactivate() . = ..() UnregisterSignal(owner, COMSIG_POWER_PRE_ACTIVATION) - owner.remove_status_effect(/datum/status_effect/celerity/one) /datum/discipline_power/celerity/one/post_gain() - apply_passive_dexterity_bonus(1) + owner.st_add_stat_mod(STAT_DEXTERITY, 1, "Celerity") //CELERITY 2 /datum/discipline_power/celerity/two @@ -87,18 +76,16 @@ . = ..() RegisterSignal(owner, COMSIG_POWER_PRE_ACTIVATION, PROC_REF(temporis_explode)) - owner.apply_status_effect(/datum/status_effect/celerity/two) /datum/discipline_power/celerity/two/deactivate() . = ..() UnregisterSignal(owner, COMSIG_POWER_PRE_ACTIVATION) - owner.remove_status_effect(/datum/status_effect/celerity/two) /datum/discipline_power/celerity/two/post_gain() - apply_passive_dexterity_bonus(2) + owner.st_add_stat_mod(STAT_DEXTERITY, 2, "Celerity") //CELERITY 3 /datum/discipline_power/celerity/three @@ -121,18 +108,16 @@ . = ..() RegisterSignal(owner, COMSIG_POWER_PRE_ACTIVATION, PROC_REF(temporis_explode)) - owner.apply_status_effect(/datum/status_effect/celerity/three) /datum/discipline_power/celerity/three/deactivate() . = ..() UnregisterSignal(owner, COMSIG_POWER_PRE_ACTIVATION) - owner.remove_status_effect(/datum/status_effect/celerity/three) /datum/discipline_power/celerity/three/post_gain() - apply_passive_dexterity_bonus(3) + owner.st_add_stat_mod(STAT_DEXTERITY, 3, "Celerity") //CELERITY 4 /datum/discipline_power/celerity/four @@ -155,18 +140,16 @@ . = ..() RegisterSignal(owner, COMSIG_POWER_PRE_ACTIVATION, PROC_REF(temporis_explode)) - owner.apply_status_effect(/datum/status_effect/celerity/four) /datum/discipline_power/celerity/four/deactivate() . = ..() UnregisterSignal(owner, COMSIG_POWER_PRE_ACTIVATION) - owner.remove_status_effect(/datum/status_effect/celerity/four) /datum/discipline_power/celerity/four/post_gain() - apply_passive_dexterity_bonus(4) + owner.st_add_stat_mod(STAT_DEXTERITY, 4, "Celerity") //CELERITY 5 /datum/discipline_power/celerity/five @@ -189,15 +172,13 @@ . = ..() RegisterSignal(owner, COMSIG_POWER_PRE_ACTIVATION, PROC_REF(temporis_explode)) - owner.apply_status_effect(/datum/status_effect/celerity/five) /datum/discipline_power/celerity/five/deactivate() . = ..() UnregisterSignal(owner, COMSIG_POWER_PRE_ACTIVATION) - owner.remove_status_effect(/datum/status_effect/celerity/five) /datum/discipline_power/celerity/five/post_gain() - apply_passive_dexterity_bonus(5) + owner.st_add_stat_mod(STAT_DEXTERITY, 5, "Celerity") diff --git a/modular_darkpack/modules/powers/code/discipline/daimonion.dm b/modular_darkpack/modules/powers/code/discipline/daimonion.dm index 85b9695efb09..32b0c90667a1 100644 --- a/modular_darkpack/modules/powers/code/discipline/daimonion.dm +++ b/modular_darkpack/modules/powers/code/discipline/daimonion.dm @@ -58,7 +58,7 @@ //CONFLAGRATION /datum/discipline_power/daimonion/conflagration name = "Conflagration" - desc = "Turn your hands into deadly claws." + desc = "Fireball." level = 3 check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE @@ -69,16 +69,12 @@ duration_length = 30 SECONDS cooldown_length = 10 SECONDS +// DARKPACK TODO - Make it so this doesnt give you infinite 0 blood cost fireballs /datum/discipline_power/daimonion/conflagration/activate() . = ..() - owner.drop_all_held_items() - owner.put_in_r_hand(new /obj/item/knife/vamp/gangrel(owner)) - owner.put_in_l_hand(new /obj/item/knife/vamp/gangrel(owner)) /datum/discipline_power/daimonion/conflagration/deactivate() . = ..() - for(var/obj/item/knife/vamp/gangrel/claws in owner) - qdel(claws) /datum/discipline_power/daimonion/conflagration/post_gain() . = ..() @@ -117,7 +113,7 @@ cooldown_length = 10 SECONDS grouped_powers = list(/datum/discipline_power/daimonion/condemnation) - var/obj/effect/proc_holder/spell/targeted/shapeshift/bat/bat_shapeshift + var/datum/action/cooldown/spell/shapeshift/bat/bat_shapeshift /datum/discipline_power/daimonion/psychomachia/activate() . = ..() @@ -147,7 +143,7 @@ cooldown_length = 10 SECONDS grouped_powers = list(/datum/discipline_power/daimonion/psychomachia) - var/obj/effect/proc_holder/spell/targeted/shapeshift/bat/bat_shapeshift + var/datum/action/cooldown/spell/shapeshift/bat/bat_shapeshift /datum/discipline_power/daimonion/condemnation/activate() . = ..() diff --git a/modular_darkpack/modules/powers/code/discipline/dementation.dm b/modular_darkpack/modules/powers/code/discipline/dementation.dm index 366cbcb247d0..258c1126f48a 100644 --- a/modular_darkpack/modules/powers/code/discipline/dementation.dm +++ b/modular_darkpack/modules/powers/code/discipline/dementation.dm @@ -5,52 +5,78 @@ clan_restricted = TRUE power_type = /datum/discipline_power/dementation -/datum/discipline/dementation/post_gain() - . = ..() - owner.add_quirk(/datum/quirk/insanity) - /datum/discipline_power/dementation name = "Dementation power name" desc = "Dementation power description" activate_sound = 'modular_darkpack/modules/deprecated/sounds/insanity.ogg' -//PASSION +/datum/discipline_power/dementation/proc/remove_dementation_overlay(mob/living/carbon/human/target) + target.remove_overlay(MUTATIONS_LAYER) + +/* +From V20: +Passion +The vampire stirs his victim’s emotions, either +heightening them to a fevered pitch or blunting them +until the target is completely desensitized. The Cain- +ite may not choose which emotion is affected; she may +only amplify or dull emotions already present in the +target. In this way, a vampire can inflame mild irrita- +tion into quivering rage or atrophy true love into ca- +sual interest. + +System: The character talks to their victim, and +the vampire’s player rolls Charisma + Empathy (dif- +ficulty equals the victim’s Humanity or Path rating). +The number of successes determines the duration of +the altered state of feeling. Effects of this power might +include one- or two-point additions or subtractions +to difficulties of frenzy rolls, Virtue rolls, rolls to resist +Presence powers, etc +*/ /datum/discipline_power/dementation/passion name = "Passion" - desc = "Stir the deepest parts of your target to manipulate their psyche." - + desc = "Stir the deepest parts of your target to manipulate their psyche. Stuns target." level = 1 - check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_SPEAK target_type = TARGET_HUMAN range = 7 - multi_activate = TRUE - cooldown_length = 10 SECONDS - duration_length = 3 SECONDS - -/datum/discipline_power/dementation/passion/pre_activation_checks(mob/living/target) - var/mypower = owner.st_get_stat(STAT_CHARISMA) - var/theirpower = target.st_get_stat(STAT_WILLPOWER) - if(theirpower >= mypower) - to_chat(owner, span_warning("[target]'s mind is too powerful to corrupt!")) - return FALSE - return TRUE + cooldown_length = 2 TURNS + duration_length = 1 TURNS + vitae_cost = 1 + aggravating = TRUE + hostile = TRUE + var/dementation_phrase //will be filled when activated via tgui_input_text + +/datum/discipline_power/dementation/passion/pre_activation_checks(mob/living/carbon/human/target) + //var/theirpower = target.st_get_stat(STAT_MORALITY) + var/mypower = SSroll.storyteller_roll(owner.st_get_stat(STAT_CHARISMA) + target.st_get_stat(STAT_EMPATHY), 6, owner) + switch(mypower) + if(ROLL_FAILURE, ROLL_BOTCH) + to_chat(owner, span_warning("[target]'s mind is too powerful to influence!")) + return FALSE + if(ROLL_SUCCESS) + dementation_phrase = tgui_input_text(owner, "What will you say to [target] to stir their emotions?") + if(!dementation_phrase) + to_chat(owner, span_warning("You must say something to your target to influence their emotions.")) + return FALSE + return TRUE /datum/discipline_power/dementation/passion/activate(mob/living/carbon/human/target) . = ..() target.remove_overlay(MUTATIONS_LAYER) var/mutable_appearance/dementation_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "dementation", -MUTATIONS_LAYER) dementation_overlay.pixel_z = 1 - //what the fuck target.overlays_standing[MUTATIONS_LAYER] = dementation_overlay target.apply_overlay(MUTATIONS_LAYER) - - target.Stun(0.5 SECONDS) - target.emote("laugh") - to_chat(target, span_userdanger("<b>HAHAHAHAHAHAHAHAHAHAHAHA!!</b>")) - owner.playsound_local(get_turf(H), pick('sound/items/SitcomLaugh1.ogg', 'sound/items/SitcomLaugh2.ogg', 'sound/items/SitcomLaugh3.ogg'), 100, FALSE) + target.Stun(2 SECONDS) + target.emote(pick("laugh","scream","cry")) // pick a random emotion for them to experience + var/attack_text = spooky_font_replace(dementation_phrase) // malk-ify what the attacker said + owner.say(attack_text, spans = list("bold", "singing")) // the malk speech uses bold and singing spans + // TODO: when the derangement port is merged, update the sound paths here + //owner.playsound_local(get_turf(H), pick('sound/items/SitcomLaugh1.ogg', 'sound/items/SitcomLaugh2.ogg', 'sound/items/SitcomLaugh3.ogg'), 100, FALSE) if(target.body_position == STANDING_UP) target.toggle_resting() @@ -58,26 +84,67 @@ . = ..() target.remove_overlay(MUTATIONS_LAYER) -//THE HAUNTING + +/* +From V20: +The Haunting +The vampire manipulates the sensory centers of their +victim’s brain, flooding the victim’s senses with visions, +sounds, scents, or feelings that aren’t really there. The +images, regardless of the sense to which they appeal, +are only fleeting “glimpses,” barely perceptible to the +victim. The vampire using Dementation cannot con- +trol what the victim perceives, but may choose which +sense is affected. + +The “haunting” effects occur mainly when the vic- +tim is alone, and mostly at night. They may take the +form of the subject’s repressed fears, guilty memories, +or anything else that the Storyteller finds dramatically +appropriate. The effects are never pleasant or unobtru- +sive, however. The Storyteller should let her imagina- +tion run wild when describing these sensory impres- +sions; the victim may well feel as if she is going mad, or +as if the world is. + +System: After the vampire speaks to the victim, the +player spends a blood point and rolls Manipulation + +Subterfuge (difficulty of his victim’s Perception + Self- +Control/Instinct). The number of successes determines +the length of the sensory “visitations.” The precise ef- +fects are up to the Storyteller, though particularly ee- +rie or harrowing apparitions can certainly reduce dice +pools for a turn or two after the manifestation. +*/ /datum/discipline_power/dementation/the_haunting name = "The Haunting" desc = "Manipulate your target's senses, making them perceive what isn't there." - level = 2 - check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_SPEAK target_type = TARGET_HUMAN range = 7 - multi_activate = TRUE - cooldown_length = 10 SECONDS - duration_length = 3 SECONDS - -/datum/discipline_power/dementation/the_haunting/pre_activation_checks(mob/living/target) - var/mypower = owner.st_get_stat(STAT_CHARISMA) - var/theirpower = target.st_get_stat(STAT_WILLPOWER) - if(theirpower >= mypower) - to_chat(owner, span_warning("[target]'s mind is too powerful to corrupt!")) + vitae_cost = 1 + cooldown_length = 3 TURNS + duration_length = 2 TURNS //this determines how long the visual affected overlay will be applied to their mob sprite, not the hallucination duration + aggravating = TRUE + hostile = TRUE + var/mypower + var/dementation_phrase + +/datum/discipline_power/dementation/the_haunting/pre_activation_checks(mob/living/carbon/human/target) + var/resistence_stat = target.st_get_stat(STAT_SELF_CONTROL) + if(iskindred(target)) + var/datum/splat/vampire/kindred/target_species = iskindred(target) + resistence_stat = target.st_get_stat(target_species.enlightenment ? STAT_CONVICTION : STAT_SELF_CONTROL) + var/theirpower = target.st_get_stat(STAT_PERCEPTION) + resistence_stat + mypower = SSroll.storyteller_roll(owner.st_get_stat(STAT_MANIPULATION) + owner.st_get_stat(STAT_SUBTERFUGE), theirpower, owner, numerical = TRUE) + if(mypower <= 0) + to_chat(owner, span_warning("[target]'s mind is too powerful to influence!")) + return FALSE + dementation_phrase = tgui_input_text(owner, "What will you say to [target] to haunt them?") + if(!dementation_phrase) + to_chat(owner, span_warning("You must say something to your target to haunt them.")) return FALSE return TRUE @@ -86,135 +153,323 @@ target.remove_overlay(MUTATIONS_LAYER) var/mutable_appearance/dementation_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "dementation", -MUTATIONS_LAYER) dementation_overlay.pixel_z = 1 - //what the fuck target.overlays_standing[MUTATIONS_LAYER] = dementation_overlay target.apply_overlay(MUTATIONS_LAYER) - - target.hallucination += 50 - new /datum/hallucination/oh_yeah(target, TRUE) + target.cause_hallucination( \ + get_random_valid_hallucination_subtype(/datum/hallucination/delusion/preset), \ + "the haunting", \ + duration = 1 TURNS + (mypower SECONDS), \ + affects_us = FALSE, \ + affects_others = TRUE, \ + skip_nearby = FALSE, \ + ) + var/attack_text = spooky_font_replace(dementation_phrase) + owner.say(attack_text, spans = list("bold", "singing")) /datum/discipline_power/dementation/the_haunting/deactivate(mob/living/carbon/human/target) . = ..() target.remove_overlay(MUTATIONS_LAYER) -//EYES OF CHAOS +/* +From V20: +Eyes of Chaos +This peculiar power allows the vampire to take ad- +vantage of the fleeting clarity hidden in insanity. She +may scrutinize the “patterns” of a person’s soul, the +convolutions of a vampire’s inner nature, or even ran- +dom events in nature itself. The Kindred with this +power can discern the most well-hidden psychoses, or +gain insight into a person’s true self. Malkavians with +this power often have (or claim to have) knowledge of +the moves and countermoves of the great Jyhad, or the +patterns of fate. + +System: This power allows a vampire to determine a +person’s true Nature, among other things. The vampire +concentrates for a turn, then her player rolls Perception ++ Occult. The difficulty depends on the intricacy of the +pattern. Discerning the Nature of a stranger would be +difficulty 9, a casual acquaintance would be an 8, and +an established ally a 6. The vampire could also read +the message locked in a coded missive (difficulty 7), or +even see the doings of an invisible hand in such events +as the pattern of falling leaves (difficulty 6). Almost +anything might contain some hidden insight, no mat- +ter how trivial or meaningless. The patterns are pres- +ent in most things, but are often so intricate they can +keep a vampire spellbound for hours while she tries to +understand their message. + +This is a potent power, subject to adjudication. Sto- +rytellers, this power is an effective way to introduce +plot threads for a chronicle, reveal an overlooked clue, +foreshadow important events, or communicate critical +149VAMPIRE THE MASQUERADE 20th ANNIVERSARY EDITION +information a player seeks. Important to its use, though, +is delivering the information properly. Secrets revealed +via Eyes of Chaos are never simple facts; they’re tanta- +lizing symbols adrift in a sea of madness. Describe the +results of this power in terms of allegory: “The man +before you appears as a crude marionette, with garish +features painted in bright stage makeup, and strings +vanishing up into the night sky.” Avoid stating plainly, +“You learn that this ghoul is the minion of a powerful +Methuselah.” +*/ /datum/discipline_power/dementation/eyes_of_chaos name = "Eyes of Chaos" desc = "See the hidden patterns in the world and uncover people's true selves." - level = 3 - check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_SPEAK - target_type = TARGET_HUMAN + target_type = TARGET_HUMAN | TARGET_SELF range = 7 - multi_activate = TRUE - cooldown_length = 10 SECONDS - duration_length = 3 SECONDS - -/datum/discipline_power/dementation/eyes_of_chaos/pre_activation_checks(mob/living/target) - var/mypower = owner.st_get_stat(STAT_CHARISMA) - var/theirpower = target.st_get_stat(STAT_WILLPOWER) - if(theirpower >= mypower) - to_chat(owner, span_warning("[target]'s mind is too powerful to corrupt!")) + cooldown_length = 5 TURNS + duration_length = 1 TURNS + activate_sound = null // dont play a sound + vitae_cost = 5 + var/choice_options = list("Secrets", "Age") + var/datum/tgui_window/eyes_of_chaos_window + +/datum/discipline_power/dementation/eyes_of_chaos/proc/update_choices() + for(var/i in choice_options) + choice_options[i] = icon('icons/effects/effects.dmi', "quantum_sparks") + +/datum/discipline_power/dementation/eyes_of_chaos/proc/open_chaos_eyes_window(mob/living/carbon/human/target) + var/exploitable_information = sanitize_text(target.client?.prefs.read_preference(/datum/preference/text/exploitable)) + if(exploitable_information == EXPLOITABLE_DEFAULT_TEXT) //they havent set exploitable text + exploitable_information = "You do not detect any secrets." + eyes_of_chaos_window = new(owner.client, "eyes_of_chaos_window") + eyes_of_chaos_window.initialize( inline_html = "<div class='background'> \ + <div><center><p class='whitetext' > [target]'s Mind </p></center></div> \ + <div><p class='whitetext' >[exploitable_information]</p></div> \ + <span></span><span></span><span></span><span></span><span></span> \ + <span></span><span></span><span></span><span></span><span></span> \ + </div>", + inline_css = file("modular_darkpack/modules/html/dementation/css/chaos.css") + ) + +/datum/discipline_power/dementation/eyes_of_chaos/proc/display_select_menu(mob/living/carbon/human/target) + update_choices() + var/chosen_option = show_radial_menu(owner, target, choice_options, target, radius = 36, tooltips = TRUE) + if(!chosen_option) + return FALSE + if(!do_after(owner, 2 TURNS)) return FALSE - return TRUE - -/datum/discipline_power/dementation/eyes_of_chaos/activate(mob/living/carbon/human/target) - . = ..() - target.remove_overlay(MUTATIONS_LAYER) - var/mutable_appearance/dementation_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "dementation", -MUTATIONS_LAYER) - dementation_overlay.pixel_z = 1 - //what the fuck - target.overlays_standing[MUTATIONS_LAYER] = dementation_overlay - target.apply_overlay(MUTATIONS_LAYER) - target.Immobilize(2 SECONDS) - if(!HAS_TRAIT(target, TRAIT_KNOCKEDOUT) && !HAS_TRAIT(target, TRAIT_IMMOBILIZED) && !HAS_TRAIT(target, TRAIT_RESTRAINED)) - if(prob(50)) - dancefirst(target) - else - dancesecond(target) + switch(chosen_option) + if("Secrets") + open_chaos_eyes_window(target) + if("Age") + var/total_age = target.chronological_age + var/determined_age = "but can't seem to find anything." + if(total_age < 100) + determined_age = "[target] is less than a century old." + else if(total_age < 200) + determined_age = "[target] is in their second century." + else + determined_age = "[target] is an elder." + to_chat(owner, span_abductor("You search [target]'s mind for information about their age... [determined_age]")) + + +/datum/discipline_power/dementation/eyes_of_chaos/pre_activation_checks(mob/living/carbon/human/target) + var/mypower = SSroll.storyteller_roll(owner.st_get_stat(STAT_PERCEPTION) + owner.st_get_stat(STAT_OCCULT), 7, owner, numerical = FALSE) + switch(mypower) + if(ROLL_SUCCESS) + return TRUE + if(ROLL_FAILURE, ROLL_BOTCH) + to_chat(owner, span_warning("[target]'s mind resists you!")) + return FALSE -/datum/discipline_power/dementation/eyes_of_chaos/deactivate(mob/living/carbon/human/target) +/datum/discipline_power/dementation/eyes_of_chaos/activate(mob/living/carbon/human/target) . = ..() - target.remove_overlay(MUTATIONS_LAYER) + display_select_menu(target) + +/* +From V20: +Voice of Madness +By merely addressing their victims aloud, the Kindred +can drive targets into fits of blind rage or fear, forcing +them to abandon reason and higher thought. Victims +are plagued by hallucinations of their subconscious de- +mons, and try to flee or destroy their hidden shames. +Tragedy almost always follows in the wake of this pow- +er’s use, though offending Malkavians often claim that +they were merely encouraging people to act “according +to their natures.” Unfortunately for the vampire con- +cerned, he runs a very real risk of falling prey to their +own voice’s power. + +System: The player spends a blood point and makes +a Manipulation + Empathy roll (difficulty 7). One tar- +get is affected per success, although all potential vic- +tims must be listening to the vampire’s voice. +Affected victims fly immediately into frenzy or a +blind fear like Rötschreck. Kindred or other creatures +capable of frenzy, such as Lupines, may make a frenzy +check or Rötschreck test (Storyteller’s choice as to how +they are affected) at +2 difficulty to resist the power. +Mortals are automatically affected and don’t remember +their actions while berserk. The frenzy or fear lasts for +a scene, though vampires and Lupines may test as usual +to snap out of it. + +The vampire using Voice of Madness must also test +for frenzy or Rötschreck upon invoking this power, +though his difficulty to resist is one lower than nor- +mal. If the initial roll to invoke this power is a failure, +however, the roll to resist the frenzy is one higher than +normal. If the roll to invoke this power is a botch, the +frenzy or Rötschreck response is automatic. +*/ -//VOICE OF MADNESS /datum/discipline_power/dementation/voice_of_madness name = "Voice of Madness" desc = "Your voice becomes a source of utter insanity, affecting you and all those around you." - level = 4 - check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_SPEAK - target_type = TARGET_HUMAN - range = 7 - + target_type = NONE + range = 8 + vitae_cost = 1 multi_activate = TRUE - cooldown_length = 10 SECONDS - duration_length = 3 SECONDS - + cooldown_length = 5 TURNS + duration_length = 2 TURNS + hostile = TRUE + aggravating = TRUE + violates_masquerade = TRUE + var/dementation_phrase + var/successes + + +//DARKPACK TODO - frenzy. this power requires it + +/* +Affected victims fly immediately into frenzy or a +blind fear like Rötschreck. Kindred or other creatures +capable of frenzy, such as Lupines, may make a frenzy +check or Rötschreck test (Storyteller’s choice as to how +they are affected) at +2 difficulty to resist the power. + + +The vampire using Voice of Madness must also test +for frenzy or Rötschreck upon invoking this power, +though his difficulty to resist is one lower than normal. If the initial roll to invoke this power is a failure, +however, the roll to resist the frenzy is one higher than +normal. If the roll to invoke this power is a botch, the +frenzy or Rötschreck response is automatic. +*/ /datum/discipline_power/dementation/voice_of_madness/pre_activation_checks(mob/living/target) - var/mypower = owner.st_get_stat(STAT_CHARISMA) - var/theirpower = target.st_get_stat(STAT_WILLPOWER) - if(theirpower >= mypower) - to_chat(owner, span_warning("[target]'s mind is too powerful to corrupt!")) + successes = SSroll.storyteller_roll(owner.st_get_stat(STAT_MANIPULATION) + owner.st_get_stat(STAT_EMPATHY), 7, owner, numerical = TRUE) + if(successes >= 0) + dementation_phrase = tgui_input_text(owner, "What will you say to cause people nearby to flee?") + if(!dementation_phrase) + to_chat(owner, span_warning("You must say something to use this discipline.")) + return FALSE + return TRUE + if(successes <= 0) // failure or botch, see above comment return FALSE - return TRUE -/datum/discipline_power/dementation/voice_of_madness/activate(mob/living/carbon/human/target) - . = ..() - target.remove_overlay(MUTATIONS_LAYER) - var/mutable_appearance/dementation_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "dementation", -MUTATIONS_LAYER) - dementation_overlay.pixel_z = 1 - //what the fuck - target.overlays_standing[MUTATIONS_LAYER] = dementation_overlay - target.apply_overlay(MUTATIONS_LAYER) - //change this to something better than an 8 second instastun - new /datum/hallucination/death(target, TRUE) -/datum/discipline_power/dementation/voice_of_madness/deactivate(mob/living/carbon/human/target) +/datum/discipline_power/dementation/voice_of_madness/activate(mob/living/carbon/human/target) . = ..() - target.remove_overlay(MUTATIONS_LAYER) - + var/attack_text = spooky_font_replace(dementation_phrase) + owner.say(attack_text, spans = list("bold", "singing")) + var/list/potential_targets = list() + for(var/mob/living/carbon/human/hearer in (get_hearers_in_view(8, owner) - owner)) + if(!hearer.can_hear() || hearer.stat > CONSCIOUS) + continue + potential_targets += hearer + var/targets_affected = 0 + while(targets_affected < successes && length(potential_targets)) //affects one target per success + var/mob/living/carbon/human/chosen = pick(potential_targets) + potential_targets -= chosen + targets_affected++ + chosen.emote("scream") + GLOB.move_manager.move_away(moving = chosen, chasing = owner, max_dist = 10, timeout = (duration_length * 2), delay = chosen.cached_multiplicative_slowdown) + + chosen.remove_overlay(MUTATIONS_LAYER) + var/mutable_appearance/dementation_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "dementation", -MUTATIONS_LAYER) + dementation_overlay.pixel_z = 1 + chosen.overlays_standing[MUTATIONS_LAYER] = dementation_overlay + chosen.apply_overlay(MUTATIONS_LAYER) + addtimer(CALLBACK(src, PROC_REF(remove_dementation_overlay), chosen), duration_length) + +/* +From V20: +Total Insanity +The vampire coaxes the madness from the deepest +recesses of their target’s mind, focusing it into an over- +whelming wave of insanity. This power has driven +countless victims, vampire and mortal alike, to unfor- +tunate ends. + +System: The Kindred must gain their target’s undi- +vided attention for at least one full turn to enact this +power. The player spends a blood point and rolls Ma- +nipulation + Intimidation (difficulty of their victim’s +current Willpower points). If the roll is successful, the +victim is afflicted with five derangements of the Sto- +ryteller’s choice (see p. 290). The number of successes +determines the duration. +*/ //TOTAL INSANITY /datum/discipline_power/dementation/total_insanity name = "Total Insanity" desc = "Bring out the darkest parts of a person's psyche, bringing them to utter insanity." - level = 5 - - check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_SPEAK + vitae_cost = 1 + check_flags = DISC_CHECK_CAPABLE target_type = TARGET_HUMAN range = 7 - multi_activate = TRUE - cooldown_length = 10 SECONDS - duration_length = 3 SECONDS - -/datum/discipline_power/dementation/total_insanity/pre_activation_checks(mob/living/target) - var/mypower = owner.st_get_stat(STAT_CHARISMA) - var/theirpower = target.st_get_stat(STAT_WILLPOWER) - if(theirpower >= mypower) + cooldown_length = 5 TURNS + duration_length = 3 TURNS + aggravating = TRUE + hostile = TRUE + var/mypower + var/theirpower + var/mob/living/carbon/human/attack_target + +/datum/discipline_power/dementation/total_insanity/pre_activation_checks(mob/living/carbon/human/target) + theirpower = target.st_get_stat(STAT_TEMPORARY_WILLPOWER) + mypower = SSroll.storyteller_roll(owner.st_get_stat(STAT_MANIPULATION) + owner.st_get_stat(STAT_INTIMIDATION), theirpower, owner, numerical = TRUE) + if(mypower <= 0) to_chat(owner, span_warning("[target]'s mind is too powerful to corrupt!")) return FALSE return TRUE +/datum/discipline_power/dementation/total_insanity/proc/self_attack(iteration) + if(attack_target.stat > CONSCIOUS) + return + if(iteration <= 0) + return + attack_target.set_combat_mode(TRUE) + var/obj/item/held_item = attack_target.get_active_held_item() + if(held_item?.force) + attack_target.ClickOn(attack_target) + else + if(held_item) + attack_target.drop_all_held_items() + attack_target.ClickOn(attack_target) + addtimer(CALLBACK(src, PROC_REF(self_attack), iteration - 1), 1 SECONDS) + /datum/discipline_power/dementation/total_insanity/activate(mob/living/carbon/human/target) . = ..() - target.remove_overlay(MUTATIONS_LAYER) + attack_target = target + attack_target.remove_overlay(MUTATIONS_LAYER) var/mutable_appearance/dementation_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "dementation", -MUTATIONS_LAYER) dementation_overlay.pixel_z = 1 - //what the fuck - target.overlays_standing[MUTATIONS_LAYER] = dementation_overlay - target.apply_overlay(MUTATIONS_LAYER) - - var/datum/cb = CALLBACK(target, /mob/living/carbon/human/proc/attack_myself_command) - for(var/i in 1 to 20) - addtimer(cb, (i - 1) * 1.5 SECONDS) - -/datum/discipline_power/dementation/total_insanity/deactivate(mob/living/carbon/human/target) - . = ..() - target.remove_overlay(MUTATIONS_LAYER) + attack_target.overlays_standing[MUTATIONS_LAYER] = dementation_overlay + attack_target.apply_overlay(MUTATIONS_LAYER) + + addtimer(CALLBACK(src, PROC_REF(self_attack), max(mypower)), 0) // attack_target will attack themselves n times equaling the caster's manipulation + intimidation subtracted by the attack_target's willpower + attack_target.cause_hallucination( \ + get_random_valid_hallucination_subtype(/datum/hallucination/delusion/preset), \ + "total insanity", \ + duration = duration_length + (mypower SECONDS), \ + affects_us = FALSE, \ + affects_others = TRUE, \ + skip_nearby = FALSE, \ + ) + addtimer(CALLBACK(src, PROC_REF(remove_dementation_overlay), attack_target), duration_length + (mypower SECONDS)) diff --git a/modular_darkpack/modules/powers/code/discipline/dominate.dm b/modular_darkpack/modules/powers/code/discipline/dominate.dm deleted file mode 100644 index 21dbafcd97c1..000000000000 --- a/modular_darkpack/modules/powers/code/discipline/dominate.dm +++ /dev/null @@ -1,235 +0,0 @@ -/datum/discipline/dominate - name = "Dominate" - desc = "Supresses will of your targets and forces them to obey you, if their will is not more powerful than yours." - icon_state = "dominate" - power_type = /datum/discipline_power/dominate - -/datum/discipline/dominate/post_gain() - . = ..() - if(level >= 1) - var/obj/effect/proc_holder/spell/voice_of_god/voice_of_domination = new(owner) - owner.mind.AddSpell(voice_of_domination) - -/datum/discipline_power/dominate - name = "Dominate power name" - desc = "Dominate power description" - - activate_sound = 'modular_darkpack/modules/deprecated/sounds/dominate.ogg' - -/datum/discipline_power/dominate/activate(mob/living/target) - . = ..() - var/mob/living/carbon/human/TRGT - if(ishuman(target)) - TRGT = target - TRGT.remove_overlay(MUTATIONS_LAYER) - var/mutable_appearance/dominate_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "dominate", -MUTATIONS_LAYER) - dominate_overlay.pixel_z = 2 - TRGT.overlays_standing[MUTATIONS_LAYER] = dominate_overlay - TRGT.apply_overlay(MUTATIONS_LAYER) - spawn(2 SECONDS) - if(TRGT) - TRGT.remove_overlay(MUTATIONS_LAYER) - return TRUE - -/datum/movespeed_modifier/dominate - multiplicative_slowdown = 5 - -//COMMAND -/datum/discipline_power/dominate/command - name = "Command" - desc = "Speak one word and force others to obey." - - level = 1 - - check_flags = DISC_CHECK_CAPABLE|DISC_CHECK_SPEAK|DISC_CHECK_SEE - target_type = TARGET_LIVING - - multi_activate = TRUE - cooldown_length = 15 SECONDS - duration_length = 3 SECONDS - range = 7 - -/datum/discipline_power/dominate/command/pre_activation_checks(mob/living/target) - var/mypower = owner.st_get_stat(STAT_CHARISMA) - var/theirpower = target.st_get_stat(STAT_WILLPOWER) - - if (HAS_TRAIT(target, TRAIT_CANNOT_RESIST_MIND_CONTROL)) - return TRUE - - if((theirpower >= mypower) || (owner.generation > target.generation)) - to_chat(owner, span_warning("[target]'s mind is too powerful to dominate!")) - return FALSE - - return TRUE - -/datum/discipline_power/dominate/command/activate(mob/living/target) - . = ..() - to_chat(target, span_userdanger("<b>FORGET ABOUT IT</b>")) - owner.say("FORGET ABOUT IT!!") - ADD_TRAIT(target, TRAIT_BLIND, "dominate") - -/datum/discipline_power/dominate/command/deactivate(mob/living/target) - . = ..() - REMOVE_TRAIT(target, TRAIT_BLIND, "dominate") - -//MESMERIZE -/datum/discipline_power/dominate/mesmerize - name = "Mesmerize" - desc = "Plant a suggestion in a target's head and force them to obey it." - - level = 2 - - check_flags = DISC_CHECK_CAPABLE|DISC_CHECK_SPEAK|DISC_CHECK_SEE - target_type = TARGET_LIVING - - multi_activate = TRUE - cooldown_length = 15 SECONDS - range = 7 - -/datum/discipline_power/dominate/mesmerize/pre_activation_checks(mob/living/target) - var/mypower = owner.st_get_stat(STAT_CHARISMA) - var/theirpower = target.st_get_stat(STAT_WILLPOWER) - - if (HAS_TRAIT(target, TRAIT_CANNOT_RESIST_MIND_CONTROL)) - return TRUE - - if((theirpower >= mypower) || (owner.generation > target.generation)) - to_chat(owner, span_warning("[target]'s mind is too powerful to dominate!")) - return FALSE - - return TRUE - -/datum/discipline_power/dominate/mesmerize/activate(mob/living/target) - . = ..() - target.Immobilize(0.5 SECONDS) - if(target.body_position == STANDING_UP) - to_chat(target, span_userdanger("<b>GET DOWN</b>")) - target.toggle_resting() - owner.say("GET DOWN!!") - else - to_chat(target, span_userdanger("<b>STAY DOWN</b>")) - owner.say("STAY DOWN!!") - -//THE FORGETFUL MIND -/datum/discipline_power/dominate/the_forgetful_mind - name = "The Forgetful Mind" - desc = "Invade a person's mind and recreate their memories." - - level = 3 - - check_flags = DISC_CHECK_CAPABLE|DISC_CHECK_SPEAK|DISC_CHECK_SEE - target_type = TARGET_LIVING - - multi_activate = TRUE - cooldown_length = 15 SECONDS - duration_length = 3 SECONDS - range = 7 - -/datum/discipline_power/dominate/the_forgetful_mind/pre_activation_checks(mob/living/target) - var/mypower = owner.st_get_stat(STAT_CHARISMA) - var/theirpower = target.st_get_stat(STAT_WILLPOWER) - - if (HAS_TRAIT(target, TRAIT_CANNOT_RESIST_MIND_CONTROL)) - return TRUE - - if((theirpower >= mypower) || (owner.generation > target.generation)) - to_chat(owner, span_warning("[target]'s mind is too powerful to dominate!")) - return FALSE - - return TRUE - -/datum/discipline_power/dominate/the_forgetful_mind/activate(mob/living/target) - . = ..() - to_chat(target, span_userdanger("<b>THINK TWICE</b>")) - owner.say("THINK TWICE!!") - target.add_movespeed_modifier(/datum/movespeed_modifier/dominate) - -/datum/discipline_power/dominate/the_forgetful_mind/deactivate(mob/living/target) - . = ..() - target.remove_movespeed_modifier(/datum/movespeed_modifier/dominate) - -//CONDITIONING -/datum/discipline_power/dominate/conditioning - name = "Conditioning" - desc = "Break a person's mind over time and bend them to your will." - - level = 4 - - check_flags = DISC_CHECK_CAPABLE|DISC_CHECK_SPEAK|DISC_CHECK_SEE - target_type = TARGET_LIVING - - multi_activate = TRUE - cooldown_length = 15 SECONDS - duration_length = 6 SECONDS - range = 7 - -/datum/discipline_power/dominate/conditioning/pre_activation_checks(mob/living/target) - var/mypower = owner.st_get_stat(STAT_CHARISMA) - var/theirpower = target.st_get_stat(STAT_WILLPOWER) - - if (HAS_TRAIT(target, TRAIT_CANNOT_RESIST_MIND_CONTROL)) - return TRUE - - if((theirpower >= mypower) || (owner.generation > target.generation)) - to_chat(owner, span_warning("[target]'s mind is too powerful to dominate!")) - return FALSE - - return TRUE - -/datum/discipline_power/dominate/conditioning/activate(mob/living/target) - . = ..() - to_chat(target, span_userdanger("<b>THINK TWICE</b>")) - owner.say("THINK TWICE!!") - target.add_movespeed_modifier(/datum/movespeed_modifier/dominate) - -/datum/discipline_power/dominate/conditioning/deactivate(mob/living/target) - . = ..() - target.remove_movespeed_modifier(/datum/movespeed_modifier/dominate) - -//POSSESSION -/datum/discipline_power/dominate/possession - name = "Possession" - desc = "Take full control of your target's mind and body." - - level = 5 - - check_flags = DISC_CHECK_CAPABLE|DISC_CHECK_SPEAK|DISC_CHECK_SEE - target_type = TARGET_HUMAN - - multi_activate = TRUE - cooldown_length = 15 SECONDS - range = 7 - -/datum/discipline_power/dominate/possession/pre_activation_checks(mob/living/target) - var/mypower = owner.st_get_stat(STAT_CHARISMA) - var/theirpower = target.st_get_stat(STAT_WILLPOWER) - - if (HAS_TRAIT(target, TRAIT_CANNOT_RESIST_MIND_CONTROL)) - return TRUE - - if((theirpower >= mypower) || (owner.generation > target.generation)) - to_chat(owner, span_warning("[target]'s mind is too powerful to dominate!")) - return FALSE - - return TRUE - -/datum/discipline_power/dominate/possession/activate(mob/living/carbon/human/target) - . = ..() - to_chat(target, span_userdanger("<b>YOU SHOULD HARM YOURSELF NOW</b>")) - owner.say("YOU SHOULD HARM YOURSELF NOW!!") - var/datum/cb = CALLBACK(target, /mob/living/carbon/human/proc/attack_myself_command) - for(var/i in 1 to 20) - addtimer(cb, (i - 1) * 1.5 SECONDS) - -/mob/living/carbon/human/proc/attack_myself_command() - if(!CheckFrenzyMove()) - a_intent = INTENT_HARM - var/obj/item/I = get_active_held_item() - if(I) - if(I.force) - ClickOn(src) - else - drop_all_held_items() - ClickOn(src) - else - ClickOn(src) diff --git a/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm new file mode 100644 index 000000000000..d0b0bceadca4 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/dominate/dominate.dm @@ -0,0 +1,544 @@ +#define TRAIT_MESMERIZED "mesmerized" + +/datum/discipline/dominate + name = "Dominate" + desc = "Suppresses will of your targets and forces them to obey you, if their will is not more powerful than yours." + icon_state = "dominate" + power_type = /datum/discipline_power/dominate + var/list/botched_targets //a lazylist of weakrefs + +/datum/discipline/dominate/post_gain() + . = ..() + if(level >= 4) + RegisterSignal(owner, COMSIG_MOB_EMOTE, PROC_REF(on_snap)) + +/datum/discipline/dominate/proc/on_snap(atom/source, datum/emote/emote_args) + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(handle_snap), source, emote_args) + +/datum/discipline/dominate/proc/handle_snap(atom/source, datum/emote/emote_args) + var/list/emote_list = list("snap", "snap2", "snap3", "whistle") + if(!emote_list.Find(emote_args.key)) + return + for(var/mob/living/carbon/human/target in get_hearers_in_view(6, owner)) + var/mob/living/carbon/human/conditioner = target.conditioner?.resolve() + if(conditioner != owner) + continue + switch(emote_args.key) + if("snap") + target.SetSleeping(0) + target.dir = get_dir(target, owner) + target.emote("me", 1, "faces towards <b>[owner]</b> attentively.", TRUE) + to_chat(target, span_danger("ATTENTION")) + if("snap2") + target.dir = get_dir(target, owner) + target.Immobilize(50) + target.emote("me",1,"flinches in response to <b>[owner]'s</b> snapping.", TRUE) + to_chat(target, span_danger("HALT")) + if("snap3") + target.Knockdown(50) + target.Immobilize(80) + target.emote("me",1,"'s knees buckle under the weight of their body.",TRUE) + target.do_jitter_animation(0.1 SECONDS) + to_chat(target, span_danger("DROP")) + if("whistle") + target.apply_status_effect(STATUS_EFFECT_AWE, owner) + to_chat(target, span_danger("HITHER")) + + +/datum/discipline_power/dominate + name = "Dominate power name" + desc = "Dominate power description" + + activate_sound = 'modular_darkpack/modules/powers/sounds/dominate.ogg' + +/datum/discipline_power/dominate/activate(mob/living/carbon/human/target) + . = ..() + + var/mob/living/carbon/human/dominate_target = target + dominate_target.remove_overlay(MUTATIONS_LAYER) + var/mutable_appearance/dominate_overlay = mutable_appearance('modular_darkpack/modules/powers/icons/dominate.dmi', "dominate", -MUTATIONS_LAYER) + dominate_overlay.pixel_z = 2 + dominate_target.overlays_standing[MUTATIONS_LAYER] = dominate_overlay + dominate_target.apply_overlay(MUTATIONS_LAYER) + + //dominate compels the target to have their gaze absolutely entrapped by the dominator + dominate_target.face_atom(owner) + to_chat(dominate_target, span_danger("You find yourself completely entranced by the stare of [owner]. You can't bring yourself to look away, call for help, or even attempt resistance. Pray that someone comes to save you by dragging or pushing you away.")) + owner.face_atom(dominate_target) + addtimer(CALLBACK(dominate_target, TYPE_PROC_REF(/mob/living/carbon/human, post_dominate_checks), dominate_target), 2 SECONDS) + return TRUE + +//dicerolling +//all dominate rolls involve rolling some stat against the victim's permanent willpower with many caveats. this proc rolls and considers those caveats +/datum/discipline_power/dominate/proc/dominate_check(mob/living/carbon/human/owner, mob/living/carbon/human/target, owner_stat, numerical = FALSE) + var/datum/discipline/dominate/parent_disc = discipline + + //someone has botched a dominate against this human + if(LAZYLEN(parent_disc.botched_targets)) + for(var/datum/weakref/ref in parent_disc.botched_targets) + var/mob/living/carbon/human/botched = ref.resolve() + if(!botched) + LAZYREMOVE(parent_disc.botched_targets, ref) + continue + if(botched == target) + to_chat(owner, span_warning("Your previous botched attempt has made [target] resistant to your Dominate for the rest of the night.")) + return FALSE + + //automatically succeed against my conditioned servant + var/mob/living/carbon/human/conditioner = target.conditioner?.resolve() + if(owner == conditioner) + if(numerical == TRUE) + return 8 + else + return TRUE + + if(HAS_TRAIT(target, TRAIT_CANNOT_RESIST_MIND_CONTROL)) + if(numerical == TRUE) + return 8 + else + return TRUE + + var/theirpower = target.st_get_stat(STAT_TEMPORARY_WILLPOWER) + var/mypower = SSroll.storyteller_roll(owner_stat, difficulty = theirpower, mobs_to_show_output = owner, numerical = TRUE) + + //tremere have built-in safeguards to easily dominate their stone servitors + var/mob/living/carbon/human/human_target = target + if(HAS_TRAIT(target, TRAIT_WEAK_TO_DOMINATE)) + theirpower -= 2 + + //wearing dark sunglasses makes it harder for the Dominator to capture the victim's gaze and raises difficulty -- v20 'Dominate' section titled 'Eye Contact' + var/total_tint = 0 + for(var/obj/item/clothing/worn_item in human_target.get_equipped_items(INCLUDE_ABSTRACT)) + total_tint += worn_item.tint + + if(total_tint > 0) + if(total_tint >= 2) + theirpower += 2 + else + theirpower += 1 + + //if anyone else tries to dominate my conditioned servant its much harder for them but not for me + if(target.conditioner?.resolve()) + theirpower += 3 + + //i've botched so now this person is immune to dominate for the rest of the round + if(mypower < 0) + LAZYADD(parent_disc.botched_targets, WEAKREF(target)) + to_chat(owner, span_warning("Your Dominate attempt has botched! [target] is now resistant to your Dominate for the rest of the night.")) + return FALSE + + var/datum/splat/vampire/kindred/owner_splat = iskindred(owner) + var/datum/splat/vampire/kindred/target_splat = iskindred(target) + if(target_splat) + if(owner_splat.generation > target_splat.generation) + to_chat(owner, span_warning("Your fail to dominate [target], as their blood is more potent than yours!")) + return FALSE + + if(numerical == TRUE) + return mypower + + //did we succeed or fail the roll + return (mypower > 0) + +//dominate involves capturing the victim's gaze, leaving them completely helpless as you hypnotically invade their mind. +/datum/discipline_power/dominate/proc/immobilize_target(mob/living/carbon/human/target, duration = 5 SECONDS) + ADD_TRAIT(target, TRAIT_IMMOBILIZED, TRAIT_GENERIC) + RegisterSignals(target, list(COMSIG_ATOM_ATTACKBY, COMSIG_MOB_ITEM_ATTACK, COMSIG_PROJECTILE_PREHIT), PROC_REF(on_target_attacked)) + if(do_after(owner, duration, target)) + release_target(target) + return TRUE + else + release_target(target) + return FALSE + +/datum/discipline_power/dominate/proc/on_target_attacked(datum/source) + SIGNAL_HANDLER + var/mob/living/carbon/human/target = source + release_target(target) + to_chat(owner, span_warning("Your concentration is broken as [target] is attacked!")) + to_chat(target, span_warning("The mental hold on you breaks as you're attacked!")) + +/datum/discipline_power/dominate/proc/release_target(mob/living/carbon/human/target) + UnregisterSignal(target, list(COMSIG_ATOM_ATTACKBY, COMSIG_MOB_ITEM_ATTACK, COMSIG_PROJECTILE_PREHIT)) + to_chat(target, span_danger("You feel your concentration become your own once more, able to look away from the commanding gaze.")) + REMOVE_TRAIT(target, TRAIT_IMMOBILIZED, TRAIT_GENERIC) + +/mob/living/carbon/human/proc/post_dominate_checks(mob/living/carbon/human/dominate_target) + dominate_target?.remove_overlay(MUTATIONS_LAYER) + +//COMMAND +/datum/discipline_power/dominate/command + name = "Command" + desc = "Speak one word and force others to obey." + level = 1 + check_flags = DISC_CHECK_SPEAK|DISC_CHECK_SEE|DISC_CHECK_DIRECT_SEE + target_type = TARGET_HUMAN + cooldown_length = 15 SECONDS + duration_length = 3 SECONDS + range = 7 + var/successes + var/custom_command = "" + +//successes for dominate 1 +/datum/discipline_power/dominate/command/proc/get_success_message(successes) + switch(successes) + if(1) + return "mild vigor and short duration" + if(2) + return "normal compulsion" + if(3) + return "moderate vigor and extended duration" + if(4) + return "great vigor and long duration" + if(5) + return "supernatural vigor" + else + return "immediate and vigorous completion" + +/datum/discipline_power/dominate/command/pre_activation_checks(mob/living/carbon/human/target) + successes = dominate_check(owner, target, owner.st_get_stat(STAT_MANIPULATION) + owner.st_get_stat(STAT_INTIMIDATION), numerical = TRUE) + if(successes > 0) + var/command_strength = get_success_message(successes) + to_chat(owner, span_notice("You have the power to Command your target with [command_strength]!")) + custom_command = tgui_input_text(owner, "Dominate Command", "What is your command?", encode = FALSE) + var/mob/living/carbon/human/conditioner = target.conditioner?.resolve() + if(owner != conditioner) + //v20 Dominate 'Command' section + if(length(splittext(custom_command, " ")) > 1) + to_chat(owner, span_warning("Commands must be only ONE word!")) + return FALSE + if(!custom_command) + return FALSE + return TRUE + + to_chat(owner, span_warning("[target] has resisted your domination!")) + do_cooldown(TRUE) + return FALSE + +/datum/discipline_power/dominate/command/activate(mob/living/carbon/human/target) + . = ..() + to_chat(owner, span_warning("You've successfully dominated [target]'s mind!")) + log_combat(owner, target, "Dominated with Command: [custom_command]") + owner.say(custom_command) + to_chat(target, span_big("[custom_command]")) + var/command_strength = get_success_message(successes) + to_chat(target, span_warning("[owner] has successfully dominated your mind with [successes] successes. You feel compelled to [custom_command] with [command_strength].")) + SEND_SOUND(target, sound('modular_darkpack/modules/powers/sounds/dominate.ogg')) + +// MESMERIZE +/datum/discipline_power/dominate/mesmerize + name = "Mesmerize" + desc = "Plant a hypnotic suggestion in a target's head that will repeatedly echo in their mind." + level = 2 + check_flags = DISC_CHECK_SPEAK|DISC_CHECK_SEE|DISC_CHECK_DIRECT_SEE + target_type = TARGET_HUMAN + cooldown_length = 30 SECONDS + range = 7 + var/custom_message = "" + var/pulse_interval + var/datum/weakref/current_target_ref + var/datum/weakref/end_action_ref + var/pulse_active = FALSE + +/datum/discipline_power/dominate/mesmerize/pre_activation_checks(mob/living/carbon/human/target) + //you can't mesmerize someone already mesmerized + if(HAS_TRAIT(target, TRAIT_MESMERIZED)) + to_chat(owner, span_warning("[target] is already under a hypnotic suggestion!")) + return FALSE + + if(pulse_active) + to_chat(owner, span_warning("You already have an active mesmerization!")) + return FALSE + + var/successes = dominate_check(owner, target, owner.st_get_stat(STAT_MANIPULATION) + owner.st_get_stat(STAT_LEADERSHIP), numerical = TRUE) + if(successes > 0) + custom_message = tgui_input_text(owner, "Hypnotic Suggestion", "What hypnotic message will echo in their mind?", encode = FALSE) + if(!custom_message) + return FALSE + pulse_interval = successes + return TRUE + pulse_interval = 0 + do_cooldown(cooldown_length) + return FALSE + +/datum/discipline_power/dominate/mesmerize/activate(mob/living/carbon/human/target) + . = ..() + if(!immobilize_target(target, 10 SECONDS)) + to_chat(owner, span_warning("You have broken concentration with [target] while implanting your hypnosis!")) + return + target.throw_alert("mesmerize", /atom/movable/screen/alert/mesmerize) + log_combat(owner, target, "Dominated with Mesmerize: [custom_message]") + to_chat(owner, span_warning("You've successfully planted a hypnotic suggestion in [target]'s mind!")) + owner.say(custom_message) + to_chat(target, span_info("An urging, subconcious thought has entered your mind. Youre not sure how this happened - but it keeps pulsing, forcing your conscious thought to bend toward it.")) + to_chat(target, span_hypnophrase(custom_message)) + SEND_SOUND(target, sound('modular_darkpack/modules/powers/sounds/dominate.ogg')) + current_target_ref = WEAKREF(target) + ADD_TRAIT(target, TRAIT_MESMERIZED, TRAIT_GENERIC) + + //allow the dominator to end the mesmerization pulses early if the target completes the directive, assuming its an objective rather than a hypnotic suggestion (which is allowed) + var/datum/action/vampire/end_mesmerization/end_action = new(owner, src) + end_action.Grant(owner) + end_action_ref = WEAKREF(end_action) + pulse_active = TRUE + start_mesmerization_cycle(target) + +/datum/discipline_power/dominate/mesmerize/proc/start_mesmerization_cycle(mob/living/carbon/human/target) + if(!pulse_active) + return + + //the message pangs in the victim's mind every couple minutes depending on successes rolled. + var/interval_minutes = max(1, 5 - pulse_interval) + var/interval_deciseconds = interval_minutes * 60 * 10 + addtimer(CALLBACK(src, PROC_REF(mesmerization_pulse), target, interval_deciseconds, 1), interval_deciseconds) + +/datum/discipline_power/dominate/mesmerize/proc/mesmerization_pulse(mob/living/carbon/human/target, interval, pulse_count) + if(!pulse_active || !target || target.stat == DEAD) + if(target) + REMOVE_TRAIT(target, TRAIT_MESMERIZED, TRAIT_GENERIC) + cleanup_mesmerization() + return + + to_chat(target, span_hypnophrase("<font size='4'><b>[custom_message]</b></font>")) + SEND_SOUND(target, sound('modular_darkpack/modules/powers/sounds/dominate.ogg', volume = 30)) + + //once its pulsed 5 times, end the mesmerization. we don't need people seeing 'shit yourself' every minute til roundend. + if(pulse_count >= 5) + REMOVE_TRAIT(target, TRAIT_MESMERIZED, TRAIT_GENERIC) + to_chat(target, span_notice("The hypnotic suggestion's pulsing fades, either taking root, or fading silently as your concious slowly returns to its natural state.")) + cleanup_mesmerization() + return + + if(pulse_active) + addtimer(CALLBACK(src, PROC_REF(mesmerization_pulse), target, interval, pulse_count + 1), interval) + +//for use in the /datum/action/vampire/end_mesmerization +/datum/discipline_power/dominate/mesmerize/proc/force_end_mesmerization() + var/mob/living/carbon/human/current_target = current_target_ref?.resolve() + if(!current_target || !pulse_active) + return + pulse_active = FALSE + REMOVE_TRAIT(current_target, TRAIT_MESMERIZED, TRAIT_GENERIC) + to_chat(current_target, span_hypnophrase("<font size='4'><b>[custom_message]</b></font>")) + to_chat(current_target, span_notice("The hypnotic suggestion's pulsing fades, either taking root, or fading silently as your concious slowly returns to its natural state.")) + current_target.clear_alert("mesmerize") + cleanup_mesmerization() + +/datum/discipline_power/dominate/mesmerize/proc/cleanup_mesmerization() + var/mob/living/carbon/human/current_target = current_target_ref?.resolve() + pulse_active = FALSE + if(current_target) + current_target.clear_alert("mesmerize") + current_target_ref = null + var/datum/action/vampire/end_mesmerization/action = end_action_ref?.resolve() + if(action) + action.Remove(owner) + end_action_ref = null + +/datum/action/vampire/end_mesmerization + name = "End Mesmerization" + desc = "Forcibly end your active mesmerization effect." + button_icon_state = "dominate" + var/datum/discipline_power/dominate/mesmerize/linked_power + +/datum/action/vampire/end_mesmerization/New(Target, datum/discipline_power/dominate/mesmerize/power) + ..() + linked_power = power + +/datum/action/vampire/end_mesmerization/Trigger(trigger_flags) + if(!linked_power) + Remove(owner) + return + linked_power.force_end_mesmerization() + +// THE FORGETFUL MIND +/datum/discipline_power/dominate/the_forgetful_mind + name = "The Forgetful Mind" + desc = "Invade a person's mind and recreate their memories." + level = 3 + check_flags = DISC_CHECK_SPEAK|DISC_CHECK_SEE|DISC_CHECK_DIRECT_SEE + target_type = TARGET_HUMAN + cooldown_length = 1 MINUTES + duration_length = 3 SECONDS + range = 7 + var/custom_memory = "" + var/successes + +/datum/discipline_power/dominate/the_forgetful_mind/proc/get_success_message(successes) + switch(successes) + if(1) + return "a single memory is removed, and no alteration takes its place, leaving a void for the true memory to bubble up with the right circumstances" + if(2) + return "multiple memories may be permanently removed, but not altered, leaving a void for the true memories to potentially re-emerge with intense recollection" + if(3) + return "multiple memories may be permanently altered or removed, but without careful and precise alteration, the true memories may crawl forth much later" + if(4) + return "deep and intense alterations or removals may take place in the memory, changing entire events or conversations with great strength" + if(5) + return "entire periods of life and personality may be removed, altered or otherwise as the subconcious completely collapses" + if(6 to INFINITY) + return "there is no limit to the extent to which the memories may be affected, forever changing the memory beyond recognition. There is no hope." + + +/datum/discipline_power/dominate/the_forgetful_mind/pre_activation_checks(mob/living/carbon/human/target) + + successes = dominate_check(owner, target, owner.st_get_stat(STAT_WITS) + owner.st_get_stat(STAT_SUBTERFUGE), numerical = TRUE) + if(successes > 0) + var/mindwipe_strength = get_success_message(successes) + to_chat(owner, span_notice("Your hypnotic glare captures [target] to the point where [mindwipe_strength]")) + custom_memory = tgui_input_text(owner, "Memory Alteration", "What memory will you implant or alter?", encode = FALSE) + if(!custom_memory) + return FALSE + return TRUE + to_chat(owner, span_warning("[target] has resisted your domination!")) + do_cooldown(cooldown_length) + return FALSE + +/datum/discipline_power/dominate/the_forgetful_mind/activate(mob/living/carbon/human/target) + . = ..() + if(!immobilize_target(target, 10 SECONDS)) + to_chat(owner, span_danger("Youve broken concentration with [target] and your Domination fails...")) + return + log_combat(owner, target, "Dominated with The Forgetful Mind: [custom_memory]") + to_chat(owner, span_warning("You've successfully invaded [target]'s mind and altered their memories!")) + owner.say(custom_memory, forced = FALSE, bubble_type = SPEECH_BUBBLE_TYPE) + to_chat(target, span_hypnophrase(custom_memory)) + SEND_SOUND(target, sound('modular_darkpack/modules/powers/sounds/dominate.ogg')) + SEND_SIGNAL(target, COMSIG_ALL_MASQUERADE_REINFORCE) + var/mindwipe_strength = get_success_message(successes) + to_chat(target, span_warning("[owner] has successfully dominated your mind with [successes] success[successes == 1 ? "" : "es"]. Their hypnotism is so strong that [mindwipe_strength]")) + +// CONDITIONING +/datum/discipline_power/dominate/conditioning + name = "Conditioning" + desc = "Break a person's mind over time and bend them to your will." + level = 4 + check_flags = DISC_CHECK_SPEAK|DISC_CHECK_SEE|DISC_CHECK_DIRECT_SEE + target_type = TARGET_HUMAN + cooldown_length = 15 SECONDS + duration_length = 6 SECONDS + range = 2 + +/datum/discipline_power/dominate/conditioning/pre_activation_checks(mob/living/carbon/human/target) + + var/roll_success = dominate_check(owner, target, owner.st_get_stat(STAT_CHARISMA) + owner.st_get_stat(STAT_LEADERSHIP)) + if(!roll_success) + to_chat(owner, span_warning("[target]'s mind has resisted your domination!")) + do_cooldown(cooldown_length) + return roll_success + +/datum/discipline_power/dominate/conditioning/activate(mob/living/carbon/human/target) + . = ..() + target.dir = get_dir(target, owner) + to_chat(target, span_danger("LOOK AT ME")) + owner.say("Look at me.") + if(!immobilize_target(target, 20 SECONDS)) + to_chat(owner, span_warning("Your concentration was broken!")) + to_chat(target, span_notice("The oppressive mental presence suddenly withdraws.")) + return + target.conditioner = WEAKREF(owner) + target.throw_alert("conditioning", /atom/movable/screen/alert/conditioning) + to_chat(target, span_hypnophrase("Your mind is filled with thoughts surrounding [owner]. Their every word and gesture carries immense weight to you.")) + SEND_SOUND(target, sound('modular_darkpack/modules/powers/sounds/dominate.ogg')) + +// POSSESSION +/datum/discipline_power/dominate/possession + name = "Possession" + desc = "Take full control of your target's mind and body." + level = 5 + check_flags = DISC_CHECK_SPEAK|DISC_CHECK_SEE|DISC_CHECK_DIRECT_SEE + target_type = TARGET_HUMAN + cooldown_length = 5 MINUTES + range = 7 + var/datum/weakref/active_possession + +/datum/discipline_power/dominate/possession/pre_activation_checks(mob/living/carbon/human/target) + + if(iskindred(target) || isgarou(target)) //DARKPACK TODO: reimplement Kuei-Jin + to_chat(owner, span_warning("You cannot possess [iskindred(target) ? "another kindred" : "this creature - the beast within resists"]!")) + return FALSE + + if(target.possessed) + to_chat(owner, span_warning("This mortal is already possessed!")) + return FALSE + + var/roll_success = dominate_check(owner, target, owner.st_get_stat(STAT_CHARISMA) + owner.st_get_stat(STAT_INTIMIDATION)) + if(!roll_success) + to_chat(owner, span_warning("[target] has resisted your domination!")) + do_cooldown(cooldown_length) + return roll_success + +/datum/discipline_power/dominate/possession/activate(mob/living/carbon/human/target) + . = ..() + target.dir = get_dir(target, owner) + to_chat(target, span_danger("Your body freezes as an overwhelming presence invades your mind...")) + + to_chat(owner, span_warning("You begin weaving your consciousness into [target]'s mind...")) + + if(!immobilize_target(target, 30 SECONDS)) + to_chat(owner, span_warning("Your concentration was broken!")) + to_chat(target, span_notice("The oppressive mental presence suddenly withdraws.")) + return + var/datum/possession_controller/controller = new(owner, target, src) + active_possession = WEAKREF(controller) + to_chat(owner, span_warning("You have seized control of [target]'s body!")) + to_chat(target, span_danger("Your consciousness is violently displaced as another mind takes control!")) + target.possessed = TRUE + log_combat(owner, target, "Possessed via Dominate Possession") + SEND_SOUND(target, sound('modular_darkpack/modules/powers/sounds/dominate.ogg')) + +//AUTONOMIC MASTERY +/datum/discipline_power/dominate/autonomic_mastery + name = "Autonomic Mastery" + desc = "Control the Autonomic Systems of a target." + + level = 6 + + check_flags = DISC_CHECK_SPEAK|DISC_CHECK_SEE + target_type = TARGET_HUMAN + + cooldown_length = 15 SECONDS + range = 7 + +/datum/discipline_power/dominate/autonomic_mastery/pre_activation_checks(mob/living/carbon/human/target) + + var/roll_success = dominate_check(owner, target) + if(roll_success) + return TRUE + else + do_cooldown(cooldown_length) + return FALSE + +/datum/discipline_power/dominate/autonomic_mastery/activate(mob/living/carbon/human/target) + . = ..() + to_chat(owner, span_warning("You've successfully dominated [target]'s bodily functions!")) + var/list/orders = list("Sleep", "Wake", "Heart Attack", "Revive") + var/order = tgui_input_list(owner, "Select a Command","Command Selection", orders) + if(!order) + return + switch(order) + if("Sleep") + owner.say("Sleep") + target.Sleeping(200) + to_chat(target, span_danger("You feel suddenly exhausted")) + SEND_SOUND(target, sound('modular_darkpack/modules/powers/sounds/dominate.ogg')) + if("Wake") + owner.say("Wake") + target.SetSleeping(0) + to_chat(target, span_danger("You feel suddenly energetic")) + SEND_SOUND(target, sound('modular_darkpack/modules/powers/sounds/dominate.ogg')) + if("Heart Attack") + owner.say("Die") + target.adjust_stamina_loss(60, FALSE) + target.set_heartattack(TRUE) + to_chat(target, span_danger("You feel a terrible pain in your chest!")) + SEND_SOUND(target, sound('modular_darkpack/modules/powers/sounds/dominate.ogg')) + if("Revive") + owner.say("Live") + target.set_heartattack(FALSE) + to_chat(target, span_danger("You feel your heart pound!")) + target.revive() + SEND_SOUND(target, sound('modular_darkpack/modules/powers/sounds/dominate.ogg')) + +#undef TRAIT_MESMERIZED diff --git a/modular_darkpack/modules/powers/code/discipline/dominate/possession/possession_datums.dm b/modular_darkpack/modules/powers/code/discipline/dominate/possession/possession_datums.dm new file mode 100644 index 000000000000..c95eaa28b41b --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/dominate/possession/possession_datums.dm @@ -0,0 +1,148 @@ +/datum/possession_controller + var/datum/weakref/vampire_original + var/datum/weakref/mortal_body + var/datum/weakref/mortal_observer + var/possession_active = FALSE + +/datum/possession_controller/New(mob/living/carbon/human/vampire, mob/living/carbon/human/mortal) + vampire_original = WEAKREF(vampire) + mortal_body = WEAKREF(mortal) + start_possession() + +/datum/possession_controller/proc/start_possession() + var/mob/living/carbon/human/vamp = vampire_original?.resolve() + var/mob/living/carbon/human/mortal = mortal_body?.resolve() + + var/mob/living/possession_observer/observer = new(mortal, src) + mortal_observer = WEAKREF(observer) + observer.ckey = mortal.ckey + observer.name = mortal.real_name + observer.real_name = mortal.real_name + if(mortal.mind) + observer.mind = mortal.mind + + mortal.ckey = vamp.ckey + mortal.mind = vamp.mind + + var/datum/action/end_possession/end_action = new(src) + end_action.Grant(mortal) + + vamp.toggle_resting() + vamp.visible_message(span_warning("[vamp]'s eyes roll back and they collapse into a catatonic state!")) + possession_active = TRUE + RegisterSignal(mortal, COMSIG_LIVING_DEATH, PROC_REF(handle_death_during_possession)) + +/datum/possession_controller/proc/end_possession() + var/mob/living/carbon/human/vamp = vampire_original?.resolve() + var/mob/living/carbon/human/mortal = mortal_body?.resolve() + + if(mortal.stat == DEAD) + handle_death_during_possession() + return + + to_chat(vamp, span_warning("You withdraw from [mortal.real_name]'s mind and return to your own body.")) + + vamp.ckey = mortal.ckey + if(mortal.mind) + vamp.mind = mortal.mind + + var/mob/living/possession_observer/observer = mortal_observer?.resolve() + if(observer?.ckey) + mortal.ckey = observer.ckey + if(observer.mind) + mortal.mind = observer.mind + to_chat(mortal, span_notice("Your consciousness returns to your own body as the foreign presence withdraws.")) + log_combat(vamp, mortal, "Has ended their Possession ") + mortal.possessed = FALSE + cleanup() + UnregisterSignal(mortal, COMSIG_LIVING_DEATH) + +/datum/possession_controller/proc/handle_death_during_possession() + SIGNAL_HANDLER + var/mob/living/carbon/human/vamp = vampire_original?.resolve() + var/mob/living/carbon/human/mortal = mortal_body?.resolve() + var/mob/living/possession_observer/observer = mortal_observer?.resolve() + + to_chat(vamp, span_boldwarning("The death of your host body violently ejects you from their mind!")) + vamp.ckey = mortal.ckey + if(mortal.mind) + vamp.mind = mortal.mind + + vamp.adjust_brute_loss(50) + vamp.visible_message(span_danger("[vamp] suddenly convulses violently and falls into what appears to be a coma!")) + to_chat(vamp, span_boldwarning("The psychic shock of your host's death sends you into torpor!")) + vamp.torpor() + + if(observer) + to_chat(observer, span_boldwarning("Your body has died while you were displaced from it. You fade into oblivion...")) + observer.ghostize() + + cleanup() + +/datum/possession_controller/proc/cleanup() + var/mob/living/carbon/human/vamp = vampire_original?.resolve() + var/mob/living/carbon/human/mortal = mortal_body?.resolve() + var/mob/living/possession_observer/observer = mortal_observer?.resolve() + possession_active = FALSE + if(vamp) + for(var/datum/action/end_possession/action in vamp.actions) + action.controller = null + action.Remove(action.owner) + qdel(action) + if(mortal) + UnregisterSignal(mortal, COMSIG_LIVING_DEATH) + for(var/datum/action/end_possession/action in mortal.actions) + action.controller = null + action.Remove(action.owner) + qdel(action) + if(observer) + observer.controller = null + qdel(observer) + qdel(src) + +/mob/living/possession_observer + name = "displaced consciousness" + real_name = "displaced consciousness" + var/datum/weakref/possessed_body + var/datum/weakref/controller + +/mob/living/possession_observer/Initialize(mapload, datum/possession_controller/possessor) + if(iscarbon(loc)) + possessed_body = WEAKREF(loc) + controller = WEAKREF(possessor) + return ..() + +/mob/living/possession_observer/Login() + . = ..() + if(!. || !client) + return FALSE + to_chat(src, span_warning("Your consciousness has been displaced from your body by a supernatural force. You can only observe as another mind controls your physical form.")) + to_chat(src, span_notice("You are helpless to act, but can still observe and think. Pray that the intruder releases control soon...")) + +/mob/living/possession_observer/say(message,bubble_type,list/spans = list(),sanitize = TRUE,datum/language/language,ignore_spam = FALSE,forced,filterproof = FALSE,message_range = 7,datum/saymode/saymode,list/message_mods = list()) + to_chat(src, span_warning("You have no voice while displaced from your body!")) + return FALSE + +/mob/living/possession_observer/emote(act, m_type = null, message = null, intentional = FALSE) + to_chat(src, span_warning("You cannot express yourself while displaced from your body!")) + return FALSE + +/datum/action/end_possession + name = "End Possession" + desc = "Release control of the possessed body and return to your own." + button_icon_state = "possession_end" + check_flags = NONE + var/datum/weakref/controller + +/datum/action/end_possession/New(datum/possession_controller/possessor) + controller = WEAKREF(possessor) + ..() + +/datum/action/end_possession/Trigger(trigger_flags) + var/datum/possession_controller/possessor = controller?.resolve() + if(!possessor) + Remove(owner) + qdel(src) + return + possessor.end_possession() + return TRUE diff --git a/modular_darkpack/modules/powers/code/discipline/dominate/status_effects/conditioning_status_effect.dm b/modular_darkpack/modules/powers/code/discipline/dominate/status_effects/conditioning_status_effect.dm new file mode 100644 index 000000000000..0cc17249f9cc --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/dominate/status_effects/conditioning_status_effect.dm @@ -0,0 +1,4 @@ +/atom/movable/screen/alert/conditioning + name = "Conditioned" + desc = "Your mind has been broken and conditioned to obey." + icon_state = "hypnosis" diff --git a/modular_darkpack/modules/powers/code/discipline/dominate/status_effects/mesmerize_status_effect.dm b/modular_darkpack/modules/powers/code/discipline/dominate/status_effects/mesmerize_status_effect.dm new file mode 100644 index 000000000000..9df33a7a2a56 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/dominate/status_effects/mesmerize_status_effect.dm @@ -0,0 +1,4 @@ +/atom/movable/screen/alert/mesmerize + name = "Mesmerized" + desc = "A hypnotic suggestion pulses through your mind." + icon_state = "hypnosis" diff --git a/modular_darkpack/modules/powers/code/discipline/fortitude/fortitude.dm b/modular_darkpack/modules/powers/code/discipline/fortitude/fortitude.dm index bc019707e4de..b0fc61089dc7 100644 --- a/modular_darkpack/modules/powers/code/discipline/fortitude/fortitude.dm +++ b/modular_darkpack/modules/powers/code/discipline/fortitude/fortitude.dm @@ -11,12 +11,6 @@ activate_sound = 'modular_darkpack/modules/powers/sounds/fortitude_activate.ogg' deactivate_sound = 'modular_darkpack/modules/powers/sounds/fortitude_deactivate.ogg' -/datum/discipline_power/fortitude/proc/apply_passive_stamina_bonus(bonus) - if (owner.st_get_stat_mod(STAT_STAMINA, "fortitude") >= bonus) - return - - owner.st_add_stat_mod(STAT_STAMINA, bonus, "fortitude") - //FORTITUDE 1 /datum/discipline_power/fortitude/one name = "Fortitude 1" @@ -38,16 +32,14 @@ /datum/discipline_power/fortitude/one/activate() . = ..() - owner.apply_status_effect(/datum/status_effect/fortitude/one) /datum/discipline_power/fortitude/one/deactivate() . = ..() - owner.remove_status_effect(/datum/status_effect/fortitude/one) /datum/discipline_power/fortitude/one/post_gain() - apply_passive_stamina_bonus(1) + owner.st_add_stat_mod(STAT_STAMINA, 1, "Fortitude") //FORTITUDE 2 /datum/discipline_power/fortitude/two @@ -70,16 +62,14 @@ /datum/discipline_power/fortitude/two/activate() . = ..() - owner.apply_status_effect(/datum/status_effect/fortitude/two) /datum/discipline_power/fortitude/two/deactivate() . = ..() - owner.remove_status_effect(/datum/status_effect/fortitude/two) /datum/discipline_power/fortitude/two/post_gain() - apply_passive_stamina_bonus(2) + owner.st_add_stat_mod(STAT_STAMINA, 2, "Fortitude") //FORTITUDE 3 /datum/discipline_power/fortitude/three @@ -102,16 +92,14 @@ /datum/discipline_power/fortitude/three/activate() . = ..() - owner.apply_status_effect(/datum/status_effect/fortitude/three) /datum/discipline_power/fortitude/three/deactivate() . = ..() - owner.remove_status_effect(/datum/status_effect/fortitude/three) /datum/discipline_power/fortitude/three/post_gain() - apply_passive_stamina_bonus(3) + owner.st_add_stat_mod(STAT_STAMINA, 3, "Fortitude") //FORTITUDE 4 /datum/discipline_power/fortitude/four @@ -134,16 +122,14 @@ /datum/discipline_power/fortitude/four/activate() . = ..() - owner.apply_status_effect(/datum/status_effect/fortitude/four) /datum/discipline_power/fortitude/four/deactivate() . = ..() - owner.remove_status_effect(/datum/status_effect/fortitude/four) /datum/discipline_power/fortitude/four/post_gain() - apply_passive_stamina_bonus(4) + owner.st_add_stat_mod(STAT_STAMINA, 4, "Fortitude") //FORTITUDE 5 /datum/discipline_power/fortitude/five @@ -166,13 +152,11 @@ /datum/discipline_power/fortitude/five/activate() . = ..() - owner.apply_status_effect(/datum/status_effect/fortitude/five) /datum/discipline_power/fortitude/five/deactivate() . = ..() - owner.remove_status_effect(/datum/status_effect/fortitude/five) /datum/discipline_power/fortitude/five/post_gain() - apply_passive_stamina_bonus(5) + owner.st_add_stat_mod(STAT_STAMINA, 5, "Fortitude") diff --git a/modular_darkpack/modules/powers/code/discipline/healer_valeren.dm b/modular_darkpack/modules/powers/code/discipline/healer_valeren.dm index fe67f24500a5..5ba6aa8bda4f 100644 --- a/modular_darkpack/modules/powers/code/discipline/healer_valeren.dm +++ b/modular_darkpack/modules/powers/code/discipline/healer_valeren.dm @@ -48,8 +48,7 @@ /datum/discipline_power/valeren/anesthetic_touch/activate(mob/living/target) . = ..() //I'm not a fan of how punishing this is towards human players, but not my job to rework it - //refactor this when the species refactoring comes through - if (ishumanbasic(target)) + if (ismundane(target)) target.SetSleeping(15 SECONDS) else target.add_confusion(5) diff --git a/modular_darkpack/modules/powers/code/discipline/melpominee.dm b/modular_darkpack/modules/powers/code/discipline/melpominee.dm index 033559d2780e..f766537b3959 100644 --- a/modular_darkpack/modules/powers/code/discipline/melpominee.dm +++ b/modular_darkpack/modules/powers/code/discipline/melpominee.dm @@ -57,7 +57,7 @@ if (victim.overlays_standing[SAY_LAYER]) //ugly way to check for if the victim is currently typing base_difficulty += 2 - for (var/mob/living/hearer in (oviewers(7, target) - owner)) + for (var/mob/living/hearer in (oviewers(DEFAULT_SIGHT_DISTANCE, target) - owner)) if (!hearer.client) continue difficulty_malus = 0 @@ -116,7 +116,7 @@ /datum/discipline_power/melpominee/madrigal/activate() . = ..() - for(var/mob/living/carbon/human/listener in oviewers(7, owner)) + for(var/mob/living/carbon/human/listener in oviewers(DEFAULT_SIGHT_DISTANCE, owner)) listener.create_walk_to(2 SECONDS, owner) listener.remove_overlay(MUTATIONS_LAYER) @@ -151,7 +151,7 @@ /datum/discipline_power/melpominee/sirens_beckoning/activate() . = ..() - for(var/mob/living/carbon/human/listener in oviewers(7, owner)) + for(var/mob/living/carbon/human/listener in oviewers(DEFAULT_SIGHT_DISTANCE, owner)) listener.Stun(2 SECONDS) listener.remove_overlay(MUTATIONS_LAYER) @@ -181,7 +181,7 @@ /datum/discipline_power/melpominee/shattering_crescendo/activate() . = ..() - for(var/mob/living/carbon/human/listener in oviewers(7, owner)) + for(var/mob/living/carbon/human/listener in oviewers(DEFAULT_SIGHT_DISTANCE, owner)) listener.Stun(2 SECONDS) listener.apply_damage(50, BRUTE, BODY_ZONE_HEAD) diff --git a/modular_darkpack/modules/powers/code/discipline/mytherceria.dm b/modular_darkpack/modules/powers/code/discipline/mytherceria.dm index bfde7b7953f5..f1533f97c251 100644 --- a/modular_darkpack/modules/powers/code/discipline/mytherceria.dm +++ b/modular_darkpack/modules/powers/code/discipline/mytherceria.dm @@ -54,12 +54,10 @@ /datum/discipline_power/mytherceria/darkling_trickery/activate(mob/living/target) . = ..() - owner.enhanced_strip = TRUE target.show_inv(owner) /datum/discipline_power/mytherceria/darkling_trickery/deactivate(mob/living/target) . = ..() - owner.enhanced_strip = FALSE //GOBLINISM /datum/discipline_power/mytherceria/goblinism @@ -98,7 +96,7 @@ /obj/item/clothing/mask/facehugger/kiasyd/attack_hand(mob/user) if(iscarbon(user)) var/mob/living/carbon/C = user - C.adjustBruteLoss(5) + C.adjust_brute_loss(5) to_chat(user, span_warning("[src] bites!")) return . = ..() @@ -155,7 +153,7 @@ if(H.bloodpool < 1) to_chat(owner, span_warning("You don't have enough <b>BLOOD</b> to do that!")) return - H.bloodpool = max(H.bloodpool - 1, 0) + H.adjust_blood_pool(-1) switch(try_trap) if("Brutal") var/obj/mytherceria_trap/trap = new (get_turf(owner)) diff --git a/modular_darkpack/modules/powers/code/discipline/necromancy.dm b/modular_darkpack/modules/powers/code/discipline/necromancy.dm index dfdf1b96c86c..a36e79bd6b7e 100644 --- a/modular_darkpack/modules/powers/code/discipline/necromancy.dm +++ b/modular_darkpack/modules/powers/code/discipline/necromancy.dm @@ -1,3 +1,5 @@ +// necromancy zombies located in npc module, beastmaster/necromancy_zombies.dm + /datum/discipline/necromancy name = "Necromancy" desc = "Offers control over another, undead reality." @@ -7,263 +9,253 @@ /datum/discipline/necromancy/post_gain() . = ..() + owner.faction |= VAMPIRE_CLAN_GIOVANNI + var/datum/action/ritual_drawing/necromancy/ritualist = new() + ADD_TRAIT(owner, TRAIT_NECROMANCY_KNOWLEDGE, DISCIPLINE_TRAIT) + ritualist.Grant(owner) + ritualist.level = level + +/datum/discipline_power/necromancy/pre_activation_checks(mob/living/target) + . = ..() + return SSroll.storyteller_roll(owner.st_get_stat(STAT_WITS) + owner.st_get_stat(STAT_OCCULT), 6, owner) /datum/discipline_power/necromancy name = "Necromancy power name" desc = "Necromancy power description" - activate_sound = 'modular_darkpack/modules/deprecated/sounds/necromancy.ogg' - -//SEAL OF ABAMIXTRA -/datum/discipline_power/necromancy/seal_of_abamixtra - name = "Seal of Abamixtra" - desc = "Raise your enemies as ghosts under your command." +//SHROUDSIGHT +/datum/discipline_power/necromancy/shroudsight + name = "Shroudsight" + desc = "See in darkness clearly and see ghosts present." level = 1 - check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_FREE_HAND | DISC_CHECK_IMMOBILE - target_type = TARGET_MOB - range = 2 + check_flags = DISC_CHECK_CONSCIOUS + vitae_cost = 0 - aggravating = TRUE - hostile = TRUE - violates_masquerade = TRUE + activate_sound = 'modular_darkpack/modules/ritual_necromancy/sounds/necromancy1on.ogg' + deactivate_sound = 'modular_darkpack/modules/ritual_necromancy/sounds/necromancy1off.ogg' - cooldown_length = 5 SECONDS - grouped_powers = list( - /datum/discipline_power/necromancy/seal_of_abamixtra, - /datum/discipline_power/necromancy/shambling_hordes, - /datum/discipline_power/necromancy/baleful_exorcism, - /datum/discipline_power/necromancy/daemonic_possession - ) + toggled = TRUE -/datum/discipline_power/necromancy/seal_of_abamixtra/activate(mob/living/target) + +/datum/discipline_power/necromancy/shroudsight/activate() . = ..() - var/limit = 1 + owner.st_get_stat(STAT_LEADERSHIP) - if(length(owner.beastmaster) >= limit) - var/mob/living/simple_animal/hostile/beastmaster/beast = pick(owner.beastmaster) - beast.death() - if (target.stat == DEAD) - if(!length(owner.beastmaster)) - var/datum/action/beastmaster_stay/stay_action = new() - stay_action.Grant(owner) - var/datum/action/beastmaster_deaggro/deaggro_action = new() - deaggro_action.Grant(owner) - - var/mob/living/simple_animal/hostile/beastmaster/giovanni_zombie/zombie = new /mob/living/simple_animal/hostile/beastmaster/giovanni_zombie/level1(owner.loc) - zombie.my_creator = owner - owner.beastmaster |= zombie - zombie.beastmaster = owner - qdel(target) - else - target.apply_damage(5, BRUTE, owner.zone_selected) - target.apply_damage(6, AGGRAVATED, owner.zone_selected) - target.emote("scream") + ADD_TRAIT(owner, TRAIT_NIGHT_VISION, NECROMANCY_TRAIT) + ADD_TRAIT(owner, TRAIT_GHOST_VISION, NECROMANCY_TRAIT) + + owner.update_sight() + + to_chat(owner, span_notice("You peek beyond the Shroud.")) + +/datum/discipline_power/necromancy/shroudsight/deactivate() + . = ..() + + REMOVE_TRAIT(owner, TRAIT_NIGHT_VISION, NECROMANCY_TRAIT) + REMOVE_TRAIT(owner, TRAIT_GHOST_VISION, NECROMANCY_TRAIT) + + owner.update_sight() + + to_chat(owner, span_warning("Your vision returns to the mortal realm.")) -//AWAKEN THE HOMUNCULAR SERVANT -/datum/discipline_power/necromancy/awaken_the_homuncular_servant - name = "Awaken the Homuncular Servant" - desc = "Raise your enemies as reinforced zombies under your command." +//ETHEREAL HORDE +/datum/discipline_power/necromancy/ethereal_horde + name = "Ethereal Horde" + desc = "Summon a pair of Drones from the Shadowlands to defend you." level = 2 check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_FREE_HAND | DISC_CHECK_IMMOBILE - target_type = TARGET_MOB - range = 2 + vitae_cost = 1 + + effect_sound = 'modular_darkpack/modules/ritual_necromancy/sounds/necromancy2.ogg' - aggravating = TRUE - hostile = TRUE violates_masquerade = TRUE cooldown_length = 5 SECONDS grouped_powers = list( - /datum/discipline_power/necromancy/seal_of_abamixtra, - /datum/discipline_power/necromancy/shambling_hordes, - /datum/discipline_power/necromancy/baleful_exorcism, - /datum/discipline_power/necromancy/daemonic_possession + /datum/discipline_power/necromancy/ashes_to_ashes, + /datum/discipline_power/necromancy/cold_of_the_grave, + /datum/discipline_power/necromancy/shambling_horde ) -/datum/discipline_power/necromancy/awaken_the_homuncular_servant/activate(mob/living/target) - . = ..() - var/limit = 2 + owner.st_get_stat(STAT_LEADERSHIP) - if(length(owner.beastmaster) >= limit) - var/mob/living/simple_animal/hostile/beastmaster/beast = pick(owner.beastmaster) - beast.death() - - if (target.stat == DEAD) - if(!length(owner.beastmaster)) - var/datum/action/beastmaster_stay/stay_action = new() - stay_action.Grant(owner) - var/datum/action/beastmaster_deaggro/deaggro_action = new() - deaggro_action.Grant(owner) - - var/mob/living/simple_animal/hostile/beastmaster/giovanni_zombie/zombie = new /mob/living/simple_animal/hostile/beastmaster/giovanni_zombie/level2(owner.loc) - zombie.my_creator = owner - owner.beastmaster |= zombie - zombie.beastmaster = owner - qdel(target) - else - target.apply_damage(10, BRUTE, owner.zone_selected) - target.apply_damage(12, AGGRAVATED, owner.zone_selected) - target.emote("scream") - -/datum/discipline_power/necromancy/awaken_the_homuncular_servant/post_gain() +/datum/discipline_power/necromancy/ethereal_horde/activate() . = ..() - var/datum/action/ghost_hear/see_ghosts = new() - see_ghosts.Grant(owner) - -/datum/action/ghost_hear - name = "See Ghosts" - desc = "Allows you to see ghosts." - button_icon_state = "ghost" - check_flags = AB_CHECK_HANDS_BLOCKED | AB_CHECK_IMMOBILE | AB_CHECK_LYING | AB_CHECK_CONSCIOUS - vampiric = TRUE - var/datum/timedevent/loop_timer - var/duration_length = 15 SECONDS - -/datum/action/ghost_hear/Trigger() - . = ..() - if (loop_timer) - deactivate() - else - activate() - -/datum/action/ghost_hear/proc/activate() - if(!isliving(owner)) - return - var/mob/living/user = owner - if (user.bloodpool < 1) - to_chat(owner, span_warning("You don't have enough blood to peek into the Shadowlands!")) - return - user.bloodpool = max(user.bloodpool - 1, 0) - loop_timer = addtimer(CALLBACK(src, PROC_REF(refresh)), duration_length, TIMER_STOPPABLE | TIMER_DELETE_ME) - user.see_invisible = SEE_INVISIBLE_OBSERVER - to_chat(owner, span_notice("You peek beyond the Shroud to see ghosts.")) + //var/limit = 2 + owner.st_get_stat(STAT_LEADERSHIP) + //var/diff = limit - length(owner.beastmaster) + //if(diff <= 0) + //to_chat(owner, span_warning("The vitae cools - you cannot extend your will to any more followers.")) + //return -/datum/action/ghost_hear/proc/deactivate() - if(!isliving(owner)) - return - var/mob/living/user = owner - - deltimer(loop_timer) - loop_timer = null - user.see_invisible = initial(owner.see_invisible) - to_chat(owner, span_warning("Your vision returns to the mortal realm.")) - -/datum/action/ghost_hear/proc/refresh() - if(!isliving(owner)) - return - var/mob/living/user = owner + owner.visible_message(span_warning("Wailing shades step forth from [owner]'s shadow.")) + owner.add_beastmaster_minion(/mob/living/basic/beastmaster/giovanni_zombie/level1) + owner.add_beastmaster_minion(/mob/living/basic/beastmaster/giovanni_zombie/level1) + //if(diff != 1) + //var/mob/living/simple_animal/hostile/beastmaster/giovanni_zombie/zombie2 = new /mob/living/simple_animal/hostile/beastmaster/giovanni_zombie/level1(owner.loc) + //zombie2.my_creator = owner + //owner.beastmaster |= zombie2 + //zombie2.beastmaster_owner = owner - if (user.bloodpool >= 1) - user.bloodpool = max(user.bloodpool - 1, 0) - to_chat(owner, span_warning("Your ghost sight consumes blood to stay active...")) - loop_timer = addtimer(CALLBACK(src, PROC_REF(refresh)), duration_length, TIMER_STOPPABLE | TIMER_DELETE_ME) - else - deactivate() -//SHAMBLING HORDES -/datum/discipline_power/necromancy/shambling_hordes - name = "Shambling Hordes" - desc = "Raise your enemies as upgraded zombies under your command." +//ASHES TO ASHES +/datum/discipline_power/necromancy/ashes_to_ashes + name = "Ashes to Ashes" + desc = "Dissolve a corpse to gain its lifeforce, or steal such from a wraith." level = 3 check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_FREE_HAND | DISC_CHECK_IMMOBILE - target_type = TARGET_MOB - range = 2 + target_type = TARGET_MOB | TARGET_GHOST + range = 3 //to not wallbang people mid-surgery at the hospital + vitae_cost = 0 + + activate_sound = 'modular_darkpack/modules/ritual_necromancy/sounds/necromancy3.ogg' - aggravating = TRUE - hostile = TRUE violates_masquerade = TRUE - cooldown_length = 5 SECONDS + cooldown_length = 10 SECONDS grouped_powers = list( - /datum/discipline_power/necromancy/seal_of_abamixtra, - /datum/discipline_power/necromancy/awaken_the_homuncular_servant, - /datum/discipline_power/necromancy/baleful_exorcism, - /datum/discipline_power/necromancy/daemonic_possession + /datum/discipline_power/necromancy/ethereal_horde, + /datum/discipline_power/necromancy/cold_of_the_grave, + /datum/discipline_power/necromancy/shambling_horde ) -/datum/discipline_power/necromancy/shambling_hordes/activate(mob/living/target) +/datum/discipline_power/necromancy/ashes_to_ashes/activate(mob/target) . = ..() - var/limit = 3 + owner.st_get_stat(STAT_LEADERSHIP) - if(length(owner.beastmaster) >= limit) - var/mob/living/simple_animal/hostile/beastmaster/beast = pick(owner.beastmaster) - beast.death() - if (target.stat == DEAD) - if(!length(owner.beastmaster)) - var/datum/action/beastmaster_stay/stay_action = new() - stay_action.Grant(owner) - var/datum/action/beastmaster_deaggro/deaggro_action = new() - deaggro_action.Grant(owner) - - var/mob/living/simple_animal/hostile/beastmaster/giovanni_zombie/zombie = new /mob/living/simple_animal/hostile/beastmaster/giovanni_zombie/level3(owner.loc) - zombie.my_creator = owner - owner.beastmaster |= zombie - zombie.beastmaster = owner - qdel(target) - else - target.apply_damage(15, BRUTE, owner.zone_selected) - target.apply_damage(18, AGGRAVATED, owner.zone_selected) - target.emote("scream") + if(isavatar(target)) + to_chat(owner, span_warning("This spirit is yet linked to a corporeal form.")) // cant absorb auspex ghosts + return + + if (isobserver(target)) + var/mob/dead/observer/ghost = target + to_chat(target, span_notice("[owner] siphons your plasm; [owner.p_they()] steal from your being to sustain [owner.p_their()] own.")) + + if(!ghost.soul_taken) + to_chat(owner, span_warning("You've slaked your Hunger on a wraith's passion. You gain <b>BLOOD</b> and <b>A SOUL</b>.")) + owner.bloodpool = min(owner.bloodpool + 1, owner.maxbloodpool) + if(isliving(owner)) + owner.collected_souls += 1 + to_chat(owner, span_cult("You absorb the soul of the departed into your necromantic grimoire. It's essence can now assist you in your studies from beyond the Shroud...")) + + ghost.soul_taken = TRUE + else + to_chat(owner, span_warning("You've slaked your Hunger on a wraith's passion. You gain <b>BLOOD</b>, but its soul has already slipped away.")) + owner.bloodpool = min(owner.bloodpool + 1, owner.maxbloodpool) + return + + if (isliving(target) && target.stat == DEAD) + var/mob/living/dusted = target + owner.visible_message(span_warning("[owner] motions towards [target].")) + dusted.visible_message(span_danger("[target]'s body dissolves into dust before your very eyes!")) + to_chat(owner, span_warning("You've absorbed the body's residual lifeforce. You gain <b>BLOOD</b> and <b>A SOUL</b>.")) + dusted.dust() + owner.bloodpool = min(owner.bloodpool + 2, owner.maxbloodpool) // corpses = 2 blood + if(isliving(owner)) + owner.collected_souls += 1 + to_chat(owner, span_cult("You absorb the soul of the departed into your necromantic grimoire. It's essence can now assist you in your studies from beyond the Shroud...")) + return + + to_chat(owner, span_warning("Death has not yet claimed this one - there is nothing to pillage.")) -//BALEFUL EXORCISM -/datum/discipline_power/necromancy/baleful_exorcism - name = "Baleful Exorcism" - desc = "Raise your enemies as skeletons under your command." + +//COLD OF THE GRAVE +/datum/discipline_power/necromancy/cold_of_the_grave + name = "Cold of the Grave" + desc = "Place a chosen target, including yourself, into a corpse-like state." level = 4 check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_FREE_HAND | DISC_CHECK_IMMOBILE - target_type = TARGET_MOB - range = 2 + target_type = TARGET_SELF | TARGET_LIVING + range = 5 + vitae_cost = 1 + + effect_sound = 'modular_darkpack/modules/ritual_necromancy/sounds/necromancy4.ogg' aggravating = TRUE hostile = TRUE violates_masquerade = TRUE - cooldown_length = 5 SECONDS + multi_activate = TRUE + cooldown_length = 20 SECONDS + duration_length = 20 SECONDS grouped_powers = list( - /datum/discipline_power/necromancy/seal_of_abamixtra, - /datum/discipline_power/necromancy/awaken_the_homuncular_servant, - /datum/discipline_power/necromancy/shambling_hordes, - /datum/discipline_power/necromancy/daemonic_possession + /datum/discipline_power/necromancy/ethereal_horde, + /datum/discipline_power/necromancy/ashes_to_ashes, + /datum/discipline_power/necromancy/shambling_horde ) -/datum/discipline_power/necromancy/baleful_exorcism/activate(mob/living/target) +/datum/movespeed_modifier/corpsebuff + multiplicative_slowdown = 0.4 + +/datum/movespeed_modifier/corpsenerf + multiplicative_slowdown = 0.8 //lasts for a while + +/datum/discipline_power/necromancy/cold_of_the_grave/activate(mob/living/target) . = ..() - var/limit = 4 + owner.st_get_stat(STAT_LEADERSHIP) - if(length(owner.beastmaster) >= limit) - var/mob/living/simple_animal/hostile/beastmaster/beast = pick(owner.beastmaster) - beast.death() - if (target.stat == DEAD) - if(!length(owner.beastmaster)) - var/datum/action/beastmaster_stay/stay_action = new() - stay_action.Grant(owner) - var/datum/action/beastmaster_deaggro/deaggro_action = new() - deaggro_action.Grant(owner) - - var/mob/living/simple_animal/hostile/beastmaster/giovanni_zombie/zombie = new /mob/living/simple_animal/hostile/beastmaster/giovanni_zombie/level4(owner.loc) - zombie.my_creator = owner - owner.beastmaster |= zombie - zombie.beastmaster = owner - qdel(target) + owner.visible_message(span_warning("[owner] motions towards [target].")) + if(iscarbon(target)) + var/mob/living/carbon/human/corpsebuff = target + // removed iscathayan(target) || from line 183 DARKPACK TODO - readd KJs Kuei-Jin + if(iskindred(target) || iszombie(target)) //undead become spongier, but move slightly slower + corpsebuff.visible_message(span_danger("[target]'s body seizes with rigor mortis."), span_danger("Your senses dull to pain and everything else.")) + + for(var/obj/item/bodypart/part as anything in corpsebuff.bodyparts) + part.brute_modifier = max(0.2, part.brute_modifier - 0.3) + + ADD_TRAIT(corpsebuff, TRAIT_NOSOFTCRIT, NECROMANCY_TRAIT) + ADD_TRAIT(corpsebuff, TRAIT_NOHARDCRIT, NECROMANCY_TRAIT) + //ADD_TRAIT(corpsebuff, TRAIT_IGNOREDAMAGESLOWDOWN, NECROMANCY_TRAIT) + corpsebuff.add_movespeed_modifier(/datum/movespeed_modifier/corpsebuff) + corpsebuff.do_jitter_animation(2 SECONDS) + else //everyone else eats tox and CC + corpsebuff.visible_message(span_danger("[target]'s skin grays, terrible illness gripping [target.p_their()] body."), span_userdanger("You feel terribly sick.")) + corpsebuff.vomit() + + corpsebuff.apply_status_effect(/datum/status_effect/dizziness, 10 SECONDS) + + corpsebuff.apply_status_effect(/datum/status_effect/confusion, 10 SECONDS) + + corpsebuff.apply_damage(50, TOX) + corpsebuff.Stun(3 SECONDS) // ignored by tough flesh and shapeshifted werewolves + corpsebuff.add_movespeed_modifier(/datum/movespeed_modifier/corpsenerf) + corpsebuff.do_jitter_animation(2 SECONDS) + else - target.apply_damage(20, BRUTE, owner.zone_selected) - target.apply_damage(24, AGGRAVATED, owner.zone_selected) - target.emote("scream") + target.apply_damage(100, BRUTE) + target.visible_message(span_danger("[target] shrivels up and withers!")) + +/datum/discipline_power/necromancy/cold_of_the_grave/deactivate(mob/living/target) + . = ..() -//DAEMONIC POSSESSION -/datum/discipline_power/necromancy/daemonic_possession - name = "Daemonic Possession" - desc = "Raise your enemies as powerful zombies under your command." + if(iscarbon(target)) + var/mob/living/carbon/human/corpsebuff = target + // || iscathayan(target) removed that from line 211 DARKPACK TODO -- readd KJS Kuei-Jin + if(iskindred(target)) + corpsebuff.visible_message(span_notice("[target]'s body regains its luster."), span_notice("Feeling comes flooding back into your body.")) + for(var/obj/item/bodypart/part as anything in corpsebuff.bodyparts) + part.brute_modifier = initial(part.brute_modifier) + REMOVE_TRAIT(corpsebuff, TRAIT_NOSOFTCRIT, NECROMANCY_TRAIT) + REMOVE_TRAIT(corpsebuff, TRAIT_NOHARDCRIT, NECROMANCY_TRAIT) + //REMOVE_TRAIT(corpsebuff, TRAIT_IGNOREDAMAGESLOWDOWN, NECROMANCY_TRAIT) + corpsebuff.remove_movespeed_modifier(/datum/movespeed_modifier/corpsebuff) + else + corpsebuff.remove_movespeed_modifier(/datum/movespeed_modifier/corpsenerf) + corpsebuff.visible_message(span_notice("[target]'s body regains its luster."), span_notice("Your unnatural ailing abates.")) + + +//SHAMBLING HORDE +/datum/discipline_power/necromancy/shambling_horde + name = "Shambling Horde" + desc = "Raise savage zombies from corpses, their lethality determined by source material. Attack the living, and rebuild sentient undead." level = 5 check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_FREE_HAND | DISC_CHECK_IMMOBILE target_type = TARGET_MOB - range = 2 + range = 5 //less range than thaum, nerf if 2stronk + + effect_sound = 'modular_darkpack/modules/ritual_necromancy/sounds/necromancy5.ogg' aggravating = TRUE hostile = TRUE @@ -271,32 +263,51 @@ cooldown_length = 5 SECONDS grouped_powers = list( - /datum/discipline_power/necromancy/seal_of_abamixtra, - /datum/discipline_power/necromancy/awaken_the_homuncular_servant, - /datum/discipline_power/necromancy/shambling_hordes, - /datum/discipline_power/necromancy/baleful_exorcism + /datum/discipline_power/necromancy/ethereal_horde, + /datum/discipline_power/necromancy/ashes_to_ashes, + /datum/discipline_power/necromancy/cold_of_the_grave + ) -/datum/discipline_power/necromancy/daemonic_possession/activate(mob/living/target) +/datum/discipline_power/necromancy/shambling_horde/activate(mob/living/target) . = ..() - var/limit = 5 + owner.st_get_stat(STAT_LEADERSHIP) - if(length(owner.beastmaster) >= limit) - var/mob/living/simple_animal/hostile/beastmaster/beast = pick(owner.beastmaster) - beast.death() - + //var/limit = 2 + owner.st_get_stat(STAT_LEADERSHIP) + //var/diff = limit - length(owner.beastmaster) if (target.stat == DEAD) - if(!length(owner.beastmaster)) - var/datum/action/beastmaster_stay/stay_action = new() - stay_action.Grant(owner) - var/datum/action/beastmaster_deaggro/deaggro_action = new() - deaggro_action.Grant(owner) - - var/mob/living/simple_animal/hostile/beastmaster/giovanni_zombie/zombie = new /mob/living/simple_animal/hostile/beastmaster/giovanni_zombie/level5(owner.loc) - zombie.my_creator = owner - owner.beastmaster |= zombie - zombie.beastmaster = owner - qdel(target) + //to_chat(owner, span_warning("The vitae cools - you cannot extend your will to any more followers.")) + //return + owner.visible_message(span_warning("[owner] gestures over [target]'s carcass.")) + target.visible_message(span_danger("[target] twitches and rises, puppeteered by an invisible force.")) + if(iscarbon(target)) + owner.add_beastmaster_minion(/mob/living/basic/beastmaster/giovanni_zombie/level4) + qdel(target) + else + switch(target.maxHealth) + if (-INFINITY to 20) //rats and whatnot + owner.add_beastmaster_minion(/mob/living/basic/beastmaster/giovanni_zombie/level2) + qdel(target) + if (20 to 70) //cats and whatnot + owner.add_beastmaster_minion(/mob/living/basic/beastmaster/giovanni_zombie/level3) + qdel(target) + if (70 to 150) //dogs/biters and whatnot + owner.add_beastmaster_minion(/mob/living/basic/beastmaster/giovanni_zombie/level4) + qdel(target) + if (150 to INFINITY) //szlachta and whatnot + owner.add_beastmaster_minion(/mob/living/basic/beastmaster/giovanni_zombie/level5) + qdel(target) + + else if(iszombie(target)) + owner.visible_message(span_warning("[owner] aggressively gestures at [target]!")) + target.visible_message(span_warning("[target]'s flesh knits together'!"), span_danger("Your rotten flesh reconstitutes!")) + var/mob/living/carbon/human/zombie = target + zombie.heal_ordered_damage(120, list(BRUTE, TOX, BURN, AGGRAVATED, OXY, BRAIN)) + zombie.bloodpool = min(zombie.maxbloodpool, zombie.bloodpool+3) + if(length(zombie.all_wounds)) + var/datum/wound/wound = pick(zombie.all_wounds) + wound.remove_wound() else - target.apply_damage(25, BRUTE, owner.zone_selected) - target.apply_damage(30, AGGRAVATED, owner.zone_selected) + owner.visible_message(span_warning("[owner] aggressively gestures at [target]!")) + target.visible_message(span_warning("[target] is assaulted by necromantic energies!"), span_danger("You feel yourself rot from within!")) + target.apply_damage(55, AGGRAVATED, owner.zone_selected) // 1/5 of a 5-dot "healthbar" in aggravated damage, on level with thaumaturgy's average output target.emote("scream") + diff --git a/modular_darkpack/modules/powers/code/discipline/obfuscate.dm b/modular_darkpack/modules/powers/code/discipline/obfuscate.dm deleted file mode 100644 index 7fa4740a5108..000000000000 --- a/modular_darkpack/modules/powers/code/discipline/obfuscate.dm +++ /dev/null @@ -1,257 +0,0 @@ -#define COMBAT_COOLDOWN_LENGTH 45 SECONDS -#define REVEAL_COOLDOWN_LENGTH 15 SECONDS - -/datum/discipline/obfuscate - name = "Obfuscate" - desc = "Makes you less noticable for living and un-living beings." - icon_state = "obfuscate" - power_type = /datum/discipline_power/obfuscate - -/datum/discipline_power/obfuscate - name = "Obfuscate power name" - desc = "Obfuscate power description" - - activate_sound = 'modular_darkpack/modules/deprecated/sounds/obfuscate_activate.ogg' - deactivate_sound = 'modular_darkpack/modules/deprecated/sounds/obfuscate_deactivate.ogg' - - var/static/list/aggressive_signals = list( - COMSIG_MOB_ATTACK_HAND, - COMSIG_MOB_ATTACKED_HAND, - COMSIG_MOB_MELEE_SWING, - COMSIG_MOB_FIRED_GUN, - COMSIG_MOB_THREW_MOVABLE, - COMSIG_MOB_ATTACKING_MELEE, - COMSIG_MOB_ATTACKED_BY_MELEE, - ) - -/datum/discipline_power/obfuscate/proc/on_combat_signal(datum/source) - SIGNAL_HANDLER - - to_chat(owner, span_danger("Your Obfuscate falls away as you reveal yourself!")) - try_deactivate(direct = TRUE) - - deltimer(cooldown_timer) - cooldown_timer = addtimer(CALLBACK(src, PROC_REF(cooldown_expire)), COMBAT_COOLDOWN_LENGTH, TIMER_STOPPABLE | TIMER_DELETE_ME) - -/datum/discipline_power/obfuscate/proc/is_seen_check() - for (var/mob/living/viewer in oviewers(7, owner)) - //cats cannot stop you from Obfuscating - if (!istype(viewer, /mob/living/carbon) && !viewer.client) - continue - - //the corpses are not watching you - if (HAS_TRAIT(viewer, TRAIT_BLIND) || viewer.stat >= UNCONSCIOUS) - continue - - to_chat(owner, span_warning("You cannot use [src] while you're being observed!")) - return FALSE - - return TRUE - -//CLOAK OF SHADOWS -/datum/discipline_power/obfuscate/cloak_of_shadows - name = "Cloak of Shadows" - desc = "Meld into the shadows and stay unnoticed so long as you draw no attention." - - level = 1 - check_flags = DISC_CHECK_CAPABLE - vitae_cost = 0 - - toggled = TRUE - - grouped_powers = list( - /datum/discipline_power/obfuscate/cloak_of_shadows, - /datum/discipline_power/obfuscate/unseen_presence, - /datum/discipline_power/obfuscate/mask_of_a_thousand_faces, - /datum/discipline_power/obfuscate/vanish_from_the_minds_eye, - /datum/discipline_power/obfuscate/cloak_the_gathering - ) - -/datum/discipline_power/obfuscate/cloak_of_shadows/pre_activation_checks() - . = ..() - return is_seen_check() - -/datum/discipline_power/obfuscate/cloak_of_shadows/activate() - . = ..() - RegisterSignal(owner, aggressive_signals, PROC_REF(on_combat_signal), override = TRUE) - RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) - - for(var/mob/living/carbon/human/npc/NPC in GLOB.npc_list) - if (NPC.danger_source == owner) - NPC.danger_source = null - owner.alpha = 10 - -/datum/discipline_power/obfuscate/cloak_of_shadows/deactivate() - . = ..() - UnregisterSignal(owner, aggressive_signals) - UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) - - owner.alpha = 255 - -/datum/discipline_power/obfuscate/cloak_of_shadows/proc/handle_move(datum/source, atom/moving_thing, dir) - SIGNAL_HANDLER - - to_chat(owner, span_danger("Your [src] falls away as you move from your position!")) - try_deactivate(direct = TRUE) - - deltimer(cooldown_timer) - cooldown_timer = addtimer(CALLBACK(src, PROC_REF(cooldown_expire)), REVEAL_COOLDOWN_LENGTH, TIMER_STOPPABLE | TIMER_DELETE_ME) - -//UNSEEN PRESENCE -/datum/discipline_power/obfuscate/unseen_presence - name = "Unseen Presence" - desc = "Move among the crowds without ever being noticed. Achieve invisibility." - - level = 2 - check_flags = DISC_CHECK_CAPABLE - vitae_cost = 0 - - toggled = TRUE - - grouped_powers = list( - /datum/discipline_power/obfuscate/cloak_of_shadows, - /datum/discipline_power/obfuscate/unseen_presence, - /datum/discipline_power/obfuscate/mask_of_a_thousand_faces, - /datum/discipline_power/obfuscate/vanish_from_the_minds_eye, - /datum/discipline_power/obfuscate/cloak_the_gathering - ) - -/datum/discipline_power/obfuscate/unseen_presence/pre_activation_checks() - . = ..() - return is_seen_check() - -/datum/discipline_power/obfuscate/unseen_presence/activate() - . = ..() - RegisterSignal(owner, aggressive_signals, PROC_REF(on_combat_signal), override = TRUE) - RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) - - for(var/mob/living/carbon/human/npc/NPC in GLOB.npc_list) - if (NPC.danger_source == owner) - NPC.danger_source = null - - owner.alpha = 10 - -/datum/discipline_power/obfuscate/unseen_presence/deactivate() - . = ..() - UnregisterSignal(owner, aggressive_signals) - UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) - - owner.alpha = 255 - -//remove this when Mask of a Thousand Faces is made tabletop accurate -/datum/discipline_power/obfuscate/unseen_presence/proc/handle_move(datum/source, atom/moving_thing, dir) - SIGNAL_HANDLER - - if (owner.move_intent != MOVE_INTENT_WALK) - to_chat(owner, span_danger("Your [src] falls away as you move too quickly!")) - try_deactivate(direct = TRUE) - - deltimer(cooldown_timer) - cooldown_timer = addtimer(CALLBACK(src, PROC_REF(cooldown_expire)), REVEAL_COOLDOWN_LENGTH, TIMER_STOPPABLE | TIMER_DELETE_ME) - -//MASK OF A THOUSAND FACES -/datum/discipline_power/obfuscate/mask_of_a_thousand_faces - name = "Mask of a Thousand Faces" - desc = "Be noticed, but incorrectly. Hide your identity but nothing else." - - level = 3 - check_flags = DISC_CHECK_CAPABLE - - toggled = TRUE - - grouped_powers = list( - /datum/discipline_power/obfuscate/cloak_of_shadows, - /datum/discipline_power/obfuscate/unseen_presence, - /datum/discipline_power/obfuscate/mask_of_a_thousand_faces, - /datum/discipline_power/obfuscate/vanish_from_the_minds_eye, - /datum/discipline_power/obfuscate/cloak_the_gathering - ) - -/datum/discipline_power/obfuscate/mask_of_a_thousand_faces/pre_activation_checks() - . = ..() - return is_seen_check() - -/datum/discipline_power/obfuscate/mask_of_a_thousand_faces/activate() - . = ..() - RegisterSignal(owner, aggressive_signals, PROC_REF(on_combat_signal), override = TRUE) - - for(var/mob/living/carbon/human/npc/NPC in GLOB.npc_list) - if (NPC.danger_source == owner) - NPC.danger_source = null - owner.alpha = 10 - -/datum/discipline_power/obfuscate/mask_of_a_thousand_faces/deactivate() - . = ..() - UnregisterSignal(owner, aggressive_signals) - - owner.alpha = 255 - -//VANISH FROM THE MIND'S EYE -/datum/discipline_power/obfuscate/vanish_from_the_minds_eye - name = "Vanish from the Mind's Eye" - desc = "Disappear from plain view, and possibly wipe your past presence from recollection." - - level = 4 - check_flags = DISC_CHECK_CAPABLE - - toggled = TRUE - - grouped_powers = list( - /datum/discipline_power/obfuscate/cloak_of_shadows, - /datum/discipline_power/obfuscate/unseen_presence, - /datum/discipline_power/obfuscate/mask_of_a_thousand_faces, - /datum/discipline_power/obfuscate/vanish_from_the_minds_eye, - /datum/discipline_power/obfuscate/cloak_the_gathering - ) - -/datum/discipline_power/obfuscate/vanish_from_the_minds_eye/activate() - . = ..() - RegisterSignal(owner, aggressive_signals, PROC_REF(on_combat_signal), override = TRUE) - - for(var/mob/living/carbon/human/npc/NPC in GLOB.npc_list) - if (NPC.danger_source == owner) - NPC.danger_source = null - owner.alpha = 10 - -/datum/discipline_power/obfuscate/vanish_from_the_minds_eye/deactivate() - . = ..() - UnregisterSignal(owner, aggressive_signals) - - owner.alpha = 255 - -//CLOAK THE GATHERING -/datum/discipline_power/obfuscate/cloak_the_gathering - name = "Cloak the Gathering" - desc = "Hide yourself and others, scheme in peace." - - level = 5 - check_flags = DISC_CHECK_CAPABLE - vitae_cost = 0 - - toggled = TRUE - - grouped_powers = list( - /datum/discipline_power/obfuscate/cloak_of_shadows, - /datum/discipline_power/obfuscate/unseen_presence, - /datum/discipline_power/obfuscate/mask_of_a_thousand_faces, - /datum/discipline_power/obfuscate/vanish_from_the_minds_eye, - /datum/discipline_power/obfuscate/cloak_the_gathering - ) - -/datum/discipline_power/obfuscate/cloak_the_gathering/activate() - . = ..() - RegisterSignal(owner, aggressive_signals, PROC_REF(on_combat_signal), override = TRUE) - - for(var/mob/living/carbon/human/npc/NPC in GLOB.npc_list) - if (NPC.danger_source == owner) - NPC.danger_source = null - owner.alpha = 10 - -/datum/discipline_power/obfuscate/cloak_the_gathering/deactivate() - . = ..() - UnregisterSignal(owner, aggressive_signals) - - owner.alpha = 255 - -#undef COMBAT_COOLDOWN_LENGTH -#undef REVEAL_COOLDOWN_LENGTH diff --git a/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm new file mode 100644 index 000000000000..99e25cd1bbcb --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate.dm @@ -0,0 +1,362 @@ +#define COMBAT_COOLDOWN_LENGTH 45 SECONDS +#define REVEAL_COOLDOWN_LENGTH 15 SECONDS + +/datum/discipline/obfuscate + name = "Obfuscate" + desc = "Makes you less noticable for living and un-living beings." + icon_state = "obfuscate" + power_type = /datum/discipline_power/obfuscate + +/datum/discipline_power/obfuscate + name = "Obfuscate power name" + desc = "Obfuscate power description" + + activate_sound = 'modular_darkpack/modules/deprecated/sounds/obfuscate_activate.ogg' + deactivate_sound = 'modular_darkpack/modules/deprecated/sounds/obfuscate_deactivate.ogg' + + var/static/list/aggressive_signals = list( + COMSIG_MOB_ATTACK_HAND, + COMSIG_MOB_FIRED_GUN, + COMSIG_MOB_THROW, + COMSIG_PROJECTILE_PREHIT, + COMSIG_ATOM_ATTACKBY, + COMSIG_MOB_ITEM_ATTACK, + COMSIG_MOVABLE_SAY_QUOTE, + COMSIG_LIVING_GRAB + ) + +/datum/discipline_power/obfuscate/proc/on_discipline_activation(datum/source, datum/discipline_power/activated_power, atom/target) + SIGNAL_HANDLER + + if(istype(activated_power, /datum/discipline_power/obfuscate)) + return + + to_chat(owner, span_danger("Your Obfuscation falls away as you focus your blood on another discipline!")) + try_deactivate(direct = TRUE) + + deltimer(cooldown_timer) + cooldown_timer = addtimer(CALLBACK(src, PROC_REF(cooldown_expire)), COMBAT_COOLDOWN_LENGTH, TIMER_STOPPABLE | TIMER_DELETE_ME) + +/datum/discipline_power/obfuscate/proc/on_combat_signal(datum/source) + SIGNAL_HANDLER + + to_chat(owner, span_danger("Your Obfuscation falls away as you reveal yourself!")) + try_deactivate(direct = TRUE) + + deltimer(cooldown_timer) + cooldown_timer = addtimer(CALLBACK(src, PROC_REF(cooldown_expire)), COMBAT_COOLDOWN_LENGTH, TIMER_STOPPABLE | TIMER_DELETE_ME) + +/datum/discipline_power/obfuscate/proc/is_seen_check() + for (var/mob/living/viewer in oviewers(DEFAULT_SIGHT_DISTANCE, owner)) + //cats cannot stop you from Obfuscating + if (!istype(viewer, /mob/living/carbon) && !viewer.client) + continue + + //the corpses are not watching you + if (viewer.is_blind() || (viewer.stat >= UNCONSCIOUS)) + continue + + to_chat(owner, span_warning("You cannot use [src] while you're being observed!")) + return FALSE + + return TRUE + +//CLOAK OF SHADOWS +/datum/discipline_power/obfuscate/cloak_of_shadows + name = "Cloak of Shadows" + desc = "Meld into the shadows and stay unnoticed so long as you draw no attention." + + level = 1 + check_flags = DISC_CHECK_CAPABLE + vitae_cost = 0 + + toggled = TRUE + + grouped_powers = list( + /datum/discipline_power/obfuscate/unseen_presence, + /datum/discipline_power/obfuscate/vanish_from_the_minds_eye, + /datum/discipline_power/obfuscate/cloak_the_gathering + ) + +/datum/discipline_power/obfuscate/cloak_of_shadows/pre_activation_checks() + . = ..() + return is_seen_check() + +/datum/discipline_power/obfuscate/cloak_of_shadows/activate() + . = ..() + RegisterSignals(owner, aggressive_signals, PROC_REF(on_combat_signal)) + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) + RegisterSignal(owner, COMSIG_POWER_ACTIVATE, PROC_REF(on_discipline_activation)) + + for(var/mob/living/carbon/human/npc/NPC in GLOB.npc_list) + if (NPC.danger_source == owner) + NPC.danger_source = null + ADD_TRAIT(owner, TRAIT_OBFUSCATED, OBFUSCATE_TRAIT) + +/datum/discipline_power/obfuscate/cloak_of_shadows/deactivate() + . = ..() + UnregisterSignal(owner, aggressive_signals) + UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) + UnregisterSignal(owner, COMSIG_POWER_ACTIVATE) + + REMOVE_TRAIT(owner, TRAIT_OBFUSCATED, OBFUSCATE_TRAIT) + +/datum/discipline_power/obfuscate/cloak_of_shadows/proc/handle_move(datum/source, atom/moving_thing, dir) + SIGNAL_HANDLER + + to_chat(owner, span_danger("Your [src] falls away as you move from your position!")) + try_deactivate(direct = TRUE) + + deltimer(cooldown_timer) + cooldown_timer = addtimer(CALLBACK(src, PROC_REF(cooldown_expire)), REVEAL_COOLDOWN_LENGTH, TIMER_STOPPABLE | TIMER_DELETE_ME) + +//UNSEEN PRESENCE +/datum/discipline_power/obfuscate/unseen_presence + name = "Unseen Presence" + desc = "Move among the crowds without ever being noticed. Achieve invisibility." + + level = 2 + check_flags = DISC_CHECK_CAPABLE + vitae_cost = 0 + + toggled = TRUE + + grouped_powers = list( + /datum/discipline_power/obfuscate/cloak_of_shadows, + /datum/discipline_power/obfuscate/vanish_from_the_minds_eye, + /datum/discipline_power/obfuscate/cloak_the_gathering + ) + +/datum/discipline_power/obfuscate/unseen_presence/pre_activation_checks() + . = ..() + return is_seen_check() + +/datum/discipline_power/obfuscate/unseen_presence/activate() + . = ..() + RegisterSignals(owner, aggressive_signals, PROC_REF(on_combat_signal)) + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) + RegisterSignal(owner, COMSIG_POWER_ACTIVATE, PROC_REF(on_discipline_activation)) + + for(var/mob/living/carbon/human/npc/NPC in GLOB.npc_list) + if (NPC.danger_source == owner) + NPC.danger_source = null + + ADD_TRAIT(owner, TRAIT_OBFUSCATED, OBFUSCATE_TRAIT) + +/datum/discipline_power/obfuscate/unseen_presence/deactivate() + . = ..() + UnregisterSignal(owner, aggressive_signals) + UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) + UnregisterSignal(owner, COMSIG_POWER_ACTIVATE) + + REMOVE_TRAIT(owner, TRAIT_OBFUSCATED, OBFUSCATE_TRAIT) + +//remove this when Mask of a Thousand Faces is made tabletop accurate +/datum/discipline_power/obfuscate/unseen_presence/proc/handle_move(datum/source, atom/moving_thing, dir) + SIGNAL_HANDLER + + if (owner.move_intent != MOVE_INTENT_WALK) + to_chat(owner, span_danger("Your [src] falls away as you move too quickly!")) + try_deactivate(direct = TRUE) + + deltimer(cooldown_timer) + cooldown_timer = addtimer(CALLBACK(src, PROC_REF(cooldown_expire)), REVEAL_COOLDOWN_LENGTH, TIMER_STOPPABLE | TIMER_DELETE_ME) + +//MASK OF A THOUSAND FACES +/datum/discipline_power/obfuscate/mask_of_a_thousand_faces + name = "Mask of a Thousand Faces" + desc = "Be noticed, but incorrectly. Hide your identity but nothing else." + + level = 3 + check_flags = DISC_CHECK_CAPABLE + vitae_cost = 0 // vitae cost handled in activate() + + toggled = TRUE + grouped_powers = list( + /datum/discipline_power/obfuscate/cloak_of_shadows, + /datum/discipline_power/obfuscate/unseen_presence, + /datum/discipline_power/obfuscate/vanish_from_the_minds_eye, + /datum/discipline_power/obfuscate/cloak_the_gathering + ) + var/datum/splat/vampire/kindred/owner_splat + var/datum/dna/original_dna + var/original_name + var/original_sprite + var/original_sprite_greyscale + var/list/cached_targets + +//mask of a thousand faces is supposed to have varying levels of success based on successes rolled +/datum/discipline_power/obfuscate/mask_of_a_thousand_faces/proc/store_target_in_list(mob/examiner, atom/examined) + SIGNAL_HANDLER + if(!ishuman(examined) || examined == owner) + return + + var/mob/living/carbon/human/target = examined + var/image/target_image = image(target) + to_chat(owner, span_info("You get a good look at your target and memorize their features.")) + LAZYSET(cached_targets, target.name, list("image" = target_image, "target" = target)) + +/datum/discipline_power/obfuscate/mask_of_a_thousand_faces/post_gain() + . = ..() + RegisterSignal(owner, COMSIG_MOB_EXAMINATE, PROC_REF(store_target_in_list)) + +/datum/discipline_power/obfuscate/mask_of_a_thousand_faces/pre_activation_checks() + owner_splat = iskindred(owner) + if(!LAZYLEN(cached_targets)) + to_chat(owner, span_warning("You haven't gotten a good look at anyone - so you can't mimic anyone's face!")) + return FALSE + + if(!is_seen_check()) + return FALSE + + var/roll = SSroll.storyteller_roll(owner.st_get_stat(STAT_MANIPULATION) + owner.st_get_stat(STAT_PERFORMANCE), 7, owner) + if(roll == ROLL_SUCCESS) + return TRUE + + to_chat(owner, span_warning("You fail to focus your mind on the disguise.")) + return FALSE + +/datum/discipline_power/obfuscate/mask_of_a_thousand_faces/activate() + . = ..() + + var/list/display_targets = list() + for(var/target_name in cached_targets) + display_targets[target_name] = cached_targets[target_name]["image"] + + var/chosen_name = show_radial_menu(owner, owner, display_targets, radius = 40, require_near = TRUE, tooltips = TRUE) + if(!chosen_name) + try_deactivate(direct = TRUE) + return + + var/mob/living/carbon/human/target = cached_targets[chosen_name]["target"] + + if(!target) + to_chat(owner, span_warning("You can't recall [chosen_name]'s features clearly enough!")) + try_deactivate(direct = TRUE) + return + + var/appearance_difference = target.st_get_stat(STAT_APPEARANCE) - owner.st_get_stat(STAT_APPEARANCE) + owner.adjust_blood_pool(-max(appearance_difference, 1)) + + if(!original_dna) + original_dna = new /datum/dna() + owner.dna.copy_dna(original_dna, 0) + original_name = owner.name + if(owner_splat.clan?.alt_sprite) + original_sprite = owner_splat.clan.alt_sprite + original_sprite_greyscale = owner_splat.clan.alt_sprite_greyscale + else + original_sprite = SPECIES_HUMAN + original_sprite_greyscale = TRUE + + target.dna.copy_dna(owner.dna, 0) + var/datum/splat/vampire/kindred/target_splat = iskindred(target) + if(target_splat?.clan?.alt_sprite) + owner.set_body_sprite(target_splat.clan.alt_sprite, target_splat.clan.alt_sprite_greyscale, TRUE) + else + if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_FACE in owner_splat.clan.clan_traits)) + REMOVE_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, MAGIC_TRAIT) + if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_EYES in owner_splat.clan.clan_traits)) + REMOVE_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_EYES, MAGIC_TRAIT) + owner.set_body_sprite(SPECIES_HUMAN, TRUE, TRUE) + + owner.updateappearance(mutcolor_update = TRUE) + to_chat(owner, span_notice("You assume the appearance of [target.name].")) + + for(var/mob/living/carbon/human/npc/NPC in GLOB.npc_list) + if (NPC.danger_source == owner) + NPC.danger_source = null + +/datum/discipline_power/obfuscate/mask_of_a_thousand_faces/deactivate() + . = ..() + original_dna.copy_dna(owner.dna, 0) + owner.name = original_name + + if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_FACE in owner_splat.clan.clan_traits)) + ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, MAGIC_TRAIT) + if(owner_splat.clan && (TRAIT_MASQUERADE_VIOLATING_EYES in owner_splat.clan.clan_traits)) + ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_EYES, MAGIC_TRAIT) + + owner.set_body_sprite(original_sprite, original_sprite_greyscale, TRUE) + owner.updateappearance(mutcolor_update = TRUE) + to_chat(owner, span_notice("You assume your original form.")) + +//VANISH FROM THE MIND'S EYE +/datum/discipline_power/obfuscate/vanish_from_the_minds_eye + name = "Vanish from the Mind's Eye" + desc = "Disappear from plain view, and possibly wipe your past presence from recollection." + + level = 4 + check_flags = DISC_CHECK_CAPABLE + vitae_cost = 2 + + toggled = TRUE + + grouped_powers = list( + /datum/discipline_power/obfuscate/cloak_of_shadows, + /datum/discipline_power/obfuscate/unseen_presence, + /datum/discipline_power/obfuscate/cloak_the_gathering + ) + +/datum/discipline_power/obfuscate/vanish_from_the_minds_eye/pre_activation_checks(atom/target) + var/roll = SSroll.storyteller_roll(owner.st_get_stat(STAT_CHARISMA) + owner.st_get_stat(STAT_STEALTH), 6, owner) + if(roll == ROLL_SUCCESS) + return TRUE + return FALSE + +/datum/discipline_power/obfuscate/vanish_from_the_minds_eye/activate() + . = ..() + RegisterSignals(owner, aggressive_signals, PROC_REF(on_combat_signal)) + RegisterSignal(owner, COMSIG_POWER_ACTIVATE, PROC_REF(on_discipline_activation)) + + for(var/mob/living/carbon/human/npc/NPC in GLOB.npc_list) + if (NPC.danger_source == owner) + NPC.danger_source = null + if(prob(1)) + SEND_SIGNAL(SSmasquerade, COMSIG_PLAYER_MASQUERADE_REINFORCE, owner) + + ADD_TRAIT(owner, TRAIT_OBFUSCATED, OBFUSCATE_TRAIT) + +/datum/discipline_power/obfuscate/vanish_from_the_minds_eye/deactivate() + . = ..() + UnregisterSignal(owner, aggressive_signals) + UnregisterSignal(owner, COMSIG_POWER_ACTIVATE) + + REMOVE_TRAIT(owner, TRAIT_OBFUSCATED, OBFUSCATE_TRAIT) + +//CLOAK THE GATHERING +/datum/discipline_power/obfuscate/cloak_the_gathering + name = "Cloak the Gathering" + desc = "Hide yourself and others, scheme in peace." + + level = 5 + check_flags = DISC_CHECK_CAPABLE + vitae_cost = 0 + + toggled = TRUE + + grouped_powers = list( + /datum/discipline_power/obfuscate/cloak_of_shadows, + /datum/discipline_power/obfuscate/unseen_presence, + /datum/discipline_power/obfuscate/vanish_from_the_minds_eye, + ) + +/datum/discipline_power/obfuscate/cloak_the_gathering/activate() + . = ..() + RegisterSignals(owner, aggressive_signals, PROC_REF(on_combat_signal)) + RegisterSignal(owner, COMSIG_POWER_ACTIVATE, PROC_REF(on_discipline_activation)) + + for(var/mob/living/carbon/human/npc/NPC in GLOB.npc_list) + if (NPC.danger_source == owner) + NPC.danger_source = null + ADD_TRAIT(owner, TRAIT_OBFUSCATED, OBFUSCATE_TRAIT) + +/datum/discipline_power/obfuscate/cloak_the_gathering/deactivate() + . = ..() + UnregisterSignal(owner, aggressive_signals) + UnregisterSignal(owner, COMSIG_POWER_ACTIVATE) + + REMOVE_TRAIT(owner, TRAIT_OBFUSCATED, OBFUSCATE_TRAIT) + +#undef COMBAT_COOLDOWN_LENGTH +#undef REVEAL_COOLDOWN_LENGTH diff --git a/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate_helpers.dm b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate_helpers.dm new file mode 100644 index 000000000000..7eb4a44a0c67 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/obfuscate/obfuscate_helpers.dm @@ -0,0 +1,30 @@ +/// Called when [TRAIT_OBFUSCATED] is added to the mob. +/mob/living/proc/make_invisible(datum/source) + SIGNAL_HANDLER + animate(src, invisibility = OBFUSCATE_INVISIBILITY, time = 0.5 SECONDS) + add_obficon() + +/// Called when [TRAIT_OBFUSCATED] is removed from the mob. +/mob/living/proc/make_visible(datum/source) + SIGNAL_HANDLER + animate(src, invisibility = NONE, time = 0.5 SECONDS) + remove_obficon() + +/// Creating & Handling obfuscate indicator +/mob/living/proc/add_obficon() + if(!client) + return + var/image/icon = image('modular_darkpack/modules/powers/icons/obfuscate_shadow.dmi', src, "shadow", FLY_LAYER) + icon.alpha = 100 + icon.pixel_y = -4 + LAZYINITLIST(obf_icons) + obf_icons += icon + client.images |= icon + +/mob/living/proc/remove_obficon() + if(!client || !obf_icons) + return + for(var/image/I in obf_icons) + if(I in client.images) + client.images -= I + obf_icons = null diff --git a/modular_darkpack/modules/powers/code/discipline/obtenebration.dm b/modular_darkpack/modules/powers/code/discipline/obtenebration.dm index e3b40cd57475..538e00bbbc40 100644 --- a/modular_darkpack/modules/powers/code/discipline/obtenebration.dm +++ b/modular_darkpack/modules/powers/code/discipline/obtenebration.dm @@ -5,13 +5,29 @@ clan_restricted = TRUE power_type = /datum/discipline_power/obtenebration +/datum/discipline/obtenebration/post_gain() + . = ..() + var/datum/action/ritual_drawing/mysticism/mystic = new() + mystic.Grant(owner) + mystic.level = level + ADD_TRAIT(owner, TRAIT_MYSTICISM_KNOWLEDGE, DISCIPLINE_TRAIT) + + /datum/discipline_power/obtenebration name = "Obtenebration power name" desc = "Obtenebration power description" - effect_sound = 'sound/magic/voidblink.ogg' + effect_sound = 'sound/effects/magic/voidblink.ogg' + +/obj/item/ammo_casing/magic/tentacle/lasombra + projectile_type = /obj/projectile/tentacle/lasombra + icon_state = "" + +/obj/projectile/tentacle/lasombra + icon = 'icons/effects/beam.dmi' + damage_type = BURN + icon_state = "curse0" -//SHADOW PLAY /datum/discipline_power/obtenebration/shadow_play name = "Shadow Play" desc = "Manipulate shadows to block visibility." @@ -20,24 +36,45 @@ check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE target_type = TARGET_TURF | TARGET_MOB | TARGET_OBJ | TARGET_SELF range = 7 + vitae_cost = 1 multi_activate = TRUE - duration_length = 10 SECONDS - cooldown_length = 5 SECONDS + duration_length = 1 SCENES + cooldown_length = 1 TURNS - var/atom/movable/shadow + var/list/shadows = list() // A list of all active shadows + var/datum/action/clear_shadows/cbutton // The button to clear everything /datum/discipline_power/obtenebration/shadow_play/activate(target) . = ..() - shadow = new(target) - shadow.set_light(3, -7) + var/atom/movable/new_shadow = new(target) + new_shadow.set_light(discipline.level+2, -10) // Ideally, the shadows would be a special thing impenetrable by anyone but the user, but this works for now + shadows += new_shadow -/datum/discipline_power/obtenebration/shadow_play/deactivate(target) - . = ..() - if (shadow) - QDEL_NULL(shadow) + if(!cbutton) // Grant the button if it doesn't exist + cbutton = new(src) + cbutton.Grant(owner) + + addtimer(CALLBACK(src, .proc/remove_shadow, new_shadow), duration_length) // 3 minute timer per shadow + +/datum/discipline_power/obtenebration/shadow_play/proc/remove_shadow(atom/movable/old_shadow) + if(old_shadow && (old_shadow in shadows)) // Check if shadow still exists + shadows -= old_shadow + qdel(old_shadow) + + if(!length(shadows) && cbutton) // Remove the button if there are no shadows left + cbutton.Remove(owner) + QDEL_NULL(cbutton) + +/datum/discipline_power/obtenebration/shadow_play/proc/remove_all_shadows() + for(var/atom/movable/all_shadows in shadows) + qdel(all_shadows) + shadows.Cut() + + if(cbutton) + cbutton.Remove(owner) + QDEL_NULL(cbutton) -//SHROUD OF NIGHT /datum/discipline_power/obtenebration/shroud_of_night name = "Shroud of Night" desc = "Turn the shadows into appendages to pull your enemies." @@ -52,38 +89,73 @@ cooldown_length = 5 SECONDS +/datum/discipline_power/obtenebration/shroud_of_night/pre_activation_checks(atom/target) + if(SSroll.storyteller_roll(owner.st_get_stat(STAT_MANIPULATION) + owner.st_get_stat(STAT_OCCULT), 7, owner)) + return TRUE + return FALSE + /datum/discipline_power/obtenebration/shroud_of_night/activate(mob/living/target) . = ..() target.Stun(1 SECONDS) var/obj/item/ammo_casing/magic/tentacle/lasombra/casing = new (owner.loc) casing.fire_casing(target, owner, null, null, null, ran_zone(), 0, owner) -//ARMS OF THE ABYSS /datum/discipline_power/obtenebration/arms_of_the_abyss name = "Arms of the Abyss" desc = "Use shadows as your arms to harm and grab others from afar." level = 3 - check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_FREE_HAND | DISC_CHECK_IMMOBILE + check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE + target_type = TARGET_TURF + range = 7 violates_masquerade = TRUE + cooldown_length = 1 TURNS - cancelable = TRUE - duration_length = 30 SECONDS - cooldown_length = 15 SECONDS + var/list/active_tentacles = list() -/datum/discipline_power/obtenebration/arms_of_the_abyss/activate() +/datum/discipline_power/obtenebration/arms_of_the_abyss/activate(var/atom/target) . = ..() - owner.drop_all_held_items() - owner.put_in_r_hand(new /obj/item/knife/vamp/gangrel/lasombra(owner)) - owner.put_in_l_hand(new /obj/item/knife/vamp/gangrel/lasombra(owner)) - -/datum/discipline_power/obtenebration/arms_of_the_abyss/deactivate() - . = ..() - for(var/obj/item/knife/vamp/gangrel/lasombra/arm in owner.contents) - qdel(arm) + var/turf/target_turf = get_turf(target) + var/dice = (owner.st_get_stat(STAT_MANIPULATION) + owner.st_get_stat(STAT_OCCULT)) + + if(target_turf && target_turf.get_lumcount() <= 0.4) + // Remove any existing tentacles first + for(var/mob/living/basic/abyss_tentacle/T in active_tentacles) + if(T && !QDELETED(T)) + T.release_grabbed_mob() + qdel(T) + active_tentacles.Cut() + + var/roll = SSroll.storyteller_roll(dice, 7, owner, numerical = TRUE) + var/has_action = !!(locate(/datum/action/aggro_mode) in owner.actions) + + if(!has_action) + var/datum/action/aggro_mode/A = new() + A.Grant(owner) + + // Create tentacles based on successes + for(var/i in 1 to roll) + var/mob/living/basic/abyss_tentacle/new_tentacle + // For the first tentacle, use the target turf + if(i == 1 && !target_turf.is_blocked_turf(exclude_mobs = TRUE)) + new_tentacle = new /mob/living/basic/abyss_tentacle(target_turf, owner) + else + // For additional tentacles, find nearby valid turfs + var/list/open_turfs = list() + for(var/turf/T in orange(3, target_turf)) + if(!T.is_blocked_turf(exclude_mobs = TRUE) && T.get_lumcount() <= 0.4) + open_turfs += T + if(open_turfs.len) + new_tentacle = new /mob/living/basic/abyss_tentacle(pick(open_turfs), owner) + + // if we ended up making a new tentacle add it to our list + if(new_tentacle) + active_tentacles += new_tentacle + else + to_chat(usr, span_warning("The area is too bright for the shadows to manifest!")) + return FALSE -//BLACK METAMORPHOSIS /datum/discipline_power/obtenebration/black_metamorphosis name = "Black Metamorphosis" desc = "Fuse with your inner darkness, gaining shadowy armor." @@ -94,110 +166,224 @@ violates_masquerade = TRUE - cancelable = TRUE - duration_length = 15 SECONDS - cooldown_length = 10 SECONDS + toggled = TRUE + duration_length = 999 SCENES + + var/activating = FALSE + var/successful = FALSE + +/datum/discipline_power/obtenebration/black_metamorphosis/pre_activation_checks() + . = ..() + if(activating) // Prevent multi-activation while the do_after is ongoing + to_chat(owner, span_warning("You are already attempting to activate Black Metamorphosis!")) + return FALSE + + if(owner.get_generation() >= 10) + activating = TRUE + to_chat(owner, span_warning("Your body starts to meld with the shadows...")) + if(do_after(owner, 2 TURNS, timed_action_flags = (IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE | IGNORE_HELD_ITEM))) + return TRUE + else if(owner.get_generation() <= 9) + activating = TRUE + to_chat(owner, span_warning("Your body starts to rapidly meld with the shadows...")) + if(do_after(owner, 1 TURNS, timed_action_flags = (IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE | IGNORE_HELD_ITEM))) + return TRUE /datum/discipline_power/obtenebration/black_metamorphosis/activate() . = ..() - owner.physiology.damage_resistance += 60 - animate(owner, color = "#000000", time = 1 SECONDS, loop = 1) + activating = FALSE + var/roll = SSroll.storyteller_roll(owner.st_get_stat(STAT_MANIPULATION)/* + owner.st_get_stat(STAT_COURAGE)*/, 7, owner) + switch(roll) + if(ROLL_SUCCESS) + successful = TRUE + owner.physiology.damage_resistance += 60 + animate(owner, color = "#000000", time = 1 SECONDS, loop = 1) + to_chat(owner, span_green("You successfully fuse with the shadows!")) + if(ROLL_FAILURE) + to_chat(owner, span_warning("You fail to control the shadows!")) + deactivate() + if(ROLL_BOTCH) + owner.apply_damage(60, BRUTE) // 2 levels of lethal damage on a botch + to_chat(owner, span_danger("The shadows lash out at you as you fail to fuse with them!")) + deactivate() /datum/discipline_power/obtenebration/black_metamorphosis/deactivate() . = ..() - playsound(owner.loc, 'sound/magic/voidblink.ogg', 50, FALSE) + if(!successful) + return + to_chat(owner, span_notice("The shadows fall away from your body.")) + playsound(owner.loc, 'sound/effects/magic/voidblink.ogg', 50, FALSE) owner.physiology.damage_resistance -= 60 animate(owner, color = initial(owner.color), time = 1 SECONDS, loop = 1) -//TENEBROUS FORM /datum/discipline_power/obtenebration/tenebrous_form name = "Tenebrous Form" - desc = "Become a shadow and move without your physical form." + desc = "Become a shadow and resist all but fire, sunlight, and magic!" level = 5 check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_LYING + vitae_cost = 3 + duration_length = 999 SCENES + toggled = TRUE violates_masquerade = TRUE - cooldown_length = 20 SECONDS + cooldown_length = 1 TURNS + var/activating = FALSE + var/saved_brute_mod = 1 + var/saved_clone_mod = 1 + var/saved_stamina_mod = 1 + var/saved_brain_mod = 1 + var/saved_density - var/obj/effect/proc_holder/spell/targeted/shadowwalk/tenebrous_form_spell +/datum/discipline_power/obtenebration/tenebrous_form/pre_activation_checks() + . = ..() + if(activating) // Prevent multi-activation while the do_after is ongoing + to_chat(owner, span_warning("You are already attempting to activate Tenebrous Form!")) + return FALSE + + // do_after timer based on generation; gen 9 and below can spend more BP per turn, so it activates faster + if(owner.get_generation() >= 10) + activating = TRUE + to_chat(owner, span_warning("Your body slowly starts to turn into an inky blot of shadow...")) + if(do_after(owner, 3 TURNS, timed_action_flags = (IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE | IGNORE_HELD_ITEM))) + return TRUE + else if(owner.get_generation() == 9) + activating = TRUE + to_chat(owner, span_warning("Your body starts to turn into an inky blot of shadow...")) + if(do_after(owner, 2 TURNS, timed_action_flags = (IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE | IGNORE_HELD_ITEM))) + return TRUE + else if(owner.get_generation() <= 8) + activating = TRUE + to_chat(owner, span_warning("Your body rapidly starts to turn into an inky blot of shadow...")) + if(do_after(owner, 1 TURNS, timed_action_flags = (IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE | IGNORE_HELD_ITEM))) + return TRUE /datum/discipline_power/obtenebration/tenebrous_form/activate() . = ..() - if (!tenebrous_form_spell) - tenebrous_form_spell = new + activating = FALSE + playsound(owner.loc, 'sound/effects/magic/voidblink.ogg', 50, FALSE) + saved_brute_mod = owner.physiology.brute_mod + owner.physiology.brute_mod = 0 + //saved_clone_mod = owner.physiology.clone_mod + //owner.physiology.clone_mod = 0 + saved_stamina_mod = owner.physiology.stamina_mod + owner.physiology.stamina_mod = 0 + saved_brain_mod = owner.physiology.brain_mod + owner.physiology.brain_mod = 0 + animate(owner, color = "#000000", time = 1 SECONDS, loop = 1) + + ADD_TRAIT(owner, TRAIT_STUNIMMUNE, MAGIC_TRAIT) + ADD_TRAIT(owner, TRAIT_PUSHIMMUNE, MAGIC_TRAIT) + ADD_TRAIT(owner, TRAIT_NOBLOOD, MAGIC_TRAIT) + ADD_TRAIT(owner, TRAIT_PACIFISM, MAGIC_TRAIT) // Can't physically attack while in this form + //ADD_TRAIT(owner, TRAIT_MOVE_FLYING, MAGIC_TRAIT) // Flying to simulate being unaffected by gravity + ADD_TRAIT(owner, TRAIT_PASSDOOR, MAGIC_TRAIT) // Trait to phase through doors + owner.pass_flags |= PASSTABLE - tenebrous_form_spell.cast(user = owner) + saved_density = owner.density + owner.density = FALSE -/datum/discipline_power/obtenebration/tenebrous_form/post_gain() +/datum/discipline_power/obtenebration/tenebrous_form/deactivate() . = ..() - var/datum/action/mysticism/mystic = new() - owner.mysticism_knowledge = TRUE - mystic.Grant(owner) - mystic.level = level - owner.mind.teach_crafting_recipe(/datum/crafting_recipe/mystome) - -/datum/crafting_recipe/mystome - name = "Abyss Mysticism Tome" - time = 10 SECONDS - reqs = list(/obj/item/paper = 3, /obj/item/reagent_containers/blood = 1) - result = /obj/item/mystic_tome - always_available = FALSE - category = CAT_MISC - -/datum/action/mysticism - name = "Mysticism" - desc = "Abyss Mysticism rune drawing." - button_icon_state = "thaumaturgy" - check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_LYING|AB_CHECK_CONSCIOUS - vampiric = TRUE - var/drawing = FALSE - var/level = 1 - -/datum/action/mysticism/Trigger() + to_chat(owner, span_notice("You return to your normal form.")) + playsound(owner.loc, 'sound/effects/magic/voidblink.ogg', 50, FALSE) + owner.physiology.brute_mod = saved_brute_mod + //owner.physiology.clone_mod = saved_clone_mod + owner.physiology.stamina_mod = saved_stamina_mod + owner.physiology.brain_mod = saved_brain_mod + animate(owner, color = initial(owner.color), time = 1 SECONDS, loop = 1) + + REMOVE_TRAIT(owner, TRAIT_STUNIMMUNE, MAGIC_TRAIT) + REMOVE_TRAIT(owner, TRAIT_PUSHIMMUNE, MAGIC_TRAIT) + REMOVE_TRAIT(owner, TRAIT_NOBLOOD, MAGIC_TRAIT) + REMOVE_TRAIT(owner, TRAIT_PACIFISM, MAGIC_TRAIT) + //REMOVE_TRAIT(owner, TRAIT_MOVE_FLYING, MAGIC_TRAIT) + REMOVE_TRAIT(owner, TRAIT_PASSDOOR, MAGIC_TRAIT) + owner.pass_flags &= ~PASSTABLE + + owner.density = saved_density + +//ACTIONS + +// Aggro mode control for Arms of the Abyss +/datum/action/aggro_mode + name = "Tentacle Control" + desc = "Switches the aggro mode of your Arms of the Abyss" + button_icon = 'icons/hud/screen_glass.dmi' + button_icon_state = "harm" + var/current_mode = "Aggressive" + +/datum/action/aggro_mode/Trigger(trigger_flags) . = ..() - var/mob/living/carbon/human/H = owner - if(H.bloodpool < 2) - to_chat(H, span_warning("You need more <b>BLOOD</b> to do that!")) + if(!.) + return + + if(!owner || !isliving(owner)) return - if(drawing) + + var/mob/living/carbon/human/tentacle_owner = owner + + if(!istype(tentacle_owner)) return - if(istype(H.get_active_held_item(), /obj/item/mystic_tome)) - var/list/shit = list() - for(var/i in subtypesof(/obj/abyssrune)) - var/obj/abyssrune/R = new i(owner) - if(R.mystlevel <= level) - shit += i - qdel(R) - var/ritual = input(owner, "Choose rune to draw:", "Mysticism") as null|anything in shit - if(ritual) - drawing = TRUE - if(do_after(H, 3 SECONDS * max(1, 5 - H.mentality), H)) - drawing = FALSE - new ritual(H.loc) - H.bloodpool = max(H.bloodpool - 2, 0) - if(H.CheckEyewitness(H, H, 7, FALSE)) - H.adjust_masquerade(-1) - else - drawing = FALSE - else - var/list/shit = list() - for(var/i in subtypesof(/obj/abyssrune)) - var/obj/abyssrune/R = new i(owner) - if(R.mystlevel <= level) - shit += i - qdel(R) - var/ritual = input(owner, "Choose rune to draw (You need a Mystic Tome to reduce random):", "Mysticism") as null|anything in list("???") - if(ritual) - drawing = TRUE - if(do_after(H, 30*max(1, 5-H.mentality), H)) - drawing = FALSE - var/rune = pick(shit) - new rune(H.loc) - H.bloodpool = max(H.bloodpool - 2, 0) - if(H.CheckEyewitness(H, H, 7, FALSE)) - H.adjust_masquerade(-1) - else - drawing = FALSE + var/list/options = list( + "Aggressive" = "Aggressive (grab and damage targets)", + "Control" = "Control (grab and restrain without damage)", + "Passive" = "Passive (don't attack or grab)" + ) + + var/select = tgui_input_list(tentacle_owner, "Select tentacle behaviour", "Tentacle Mode", options) + if(!select || !tentacle_owner) + return + + current_mode = select + tentacle_owner.tentacle_aggro_mode = select + + // need to access the discipline_power so we can grab the list + var/datum/splat/vampire/vampire = does_use_disciplines(tentacle_owner) + var/datum/discipline_power/obtenebration/arms_of_the_abyss/abyss_power = vampire?.get_discipline_power(/datum/discipline_power/obtenebration/arms_of_the_abyss) + + var/tentacles = 0 + for(var/mob/living/basic/abyss_tentacle/T in abyss_power.active_tentacles) + if(T && !QDELETED(T)) + var/was_passive = (T.aggro_mode == "Passive") + T.aggro_mode = select + tentacles++ + + if(select == "Passive" && T.grabbed_mob) + T.release_grabbed_mob() + else if(was_passive && select != "Passive") + T.recently_released.Cut() + + if(tentacles) + to_chat(tentacle_owner, span_notice("You set your tentacle[tentacles == 1 ? "" : "s"] to [select] mode.")) + update_button_icon() + +/datum/action/aggro_mode/proc/update_button_icon() + switch(current_mode) + if("Aggressive") + button_icon_state = "harm" + if("Control") + button_icon_state = "grab" + if("Passive") + button_icon_state = "disarm" + build_all_button_icons() + +// Shadow removal button for Shadow Play +/datum/action/clear_shadows + name = "Clear Shadows" + desc = "Clears all currently active Shadow Play shadows" + button_icon = 'icons/mob/effects/genetics.dmi' + button_icon_state = "shadow_portal" + var/datum/discipline_power/obtenebration/shadow_play/power + +/datum/action/clear_shadows/New(Target) + . = ..() + power = Target + +/datum/action/clear_shadows/Trigger(trigger_flags) + if(!power) + return + power.remove_all_shadows() + return TRUE diff --git a/modular_darkpack/modules/powers/code/discipline/potence/potence.dm b/modular_darkpack/modules/powers/code/discipline/potence/potence.dm index b5febfc2461d..28b85b44c42d 100644 --- a/modular_darkpack/modules/powers/code/discipline/potence/potence.dm +++ b/modular_darkpack/modules/powers/code/discipline/potence/potence.dm @@ -11,12 +11,6 @@ activate_sound = 'modular_darkpack/modules/powers/sounds/potence_activate.ogg' deactivate_sound = 'modular_darkpack/modules/powers/sounds/potence_deactivate.ogg' -/datum/discipline_power/potence/proc/apply_passive_strength_bonus(bonus) - if (owner.st_get_stat_mod(STAT_STRENGTH, "potence") >= bonus) - return - - owner.st_add_stat_mod(STAT_STRENGTH, bonus, "potence") - //POTENCE 1 /datum/discipline_power/potence/one name = "Potence 1" @@ -47,7 +41,7 @@ owner.remove_status_effect(/datum/status_effect/potence/one) /datum/discipline_power/potence/one/post_gain() - apply_passive_strength_bonus(1) + owner.st_add_stat_mod(STAT_STRENGTH, 1, "Potence") //POTENCE 2 /datum/discipline_power/potence/two @@ -70,16 +64,14 @@ /datum/discipline_power/potence/two/activate() . = ..() - owner.apply_status_effect(/datum/status_effect/potence/two) /datum/discipline_power/potence/two/deactivate() . = ..() - owner.remove_status_effect(/datum/status_effect/potence/two) /datum/discipline_power/potence/two/post_gain() - apply_passive_strength_bonus(2) + owner.st_add_stat_mod(STAT_STRENGTH, 2, "Potence") //POTENCE 3 /datum/discipline_power/potence/three @@ -102,16 +94,14 @@ /datum/discipline_power/potence/three/activate() . = ..() - owner.apply_status_effect(/datum/status_effect/potence/three) /datum/discipline_power/potence/three/deactivate() . = ..() - owner.remove_status_effect(/datum/status_effect/potence/three) /datum/discipline_power/potence/three/post_gain() - apply_passive_strength_bonus(3) + owner.st_add_stat_mod(STAT_STRENGTH, 3, "Potence") //POTENCE 4 /datum/discipline_power/potence/four @@ -134,16 +124,14 @@ /datum/discipline_power/potence/four/activate() . = ..() - owner.apply_status_effect(/datum/status_effect/potence/four) /datum/discipline_power/potence/four/deactivate() . = ..() - owner.remove_status_effect(/datum/status_effect/potence/four) /datum/discipline_power/potence/four/post_gain() - apply_passive_strength_bonus(4) + owner.st_add_stat_mod(STAT_STRENGTH, 4, "Potence") //POTENCE 5 /datum/discipline_power/potence/five @@ -166,13 +154,11 @@ /datum/discipline_power/potence/five/activate() . = ..() - owner.apply_status_effect(/datum/status_effect/potence/five) /datum/discipline_power/potence/five/deactivate() . = ..() - owner.remove_status_effect(/datum/status_effect/potence/five) /datum/discipline_power/potence/five/post_gain() - apply_passive_strength_bonus(5) + owner.st_add_stat_mod(STAT_STRENGTH, 5, "Potence") diff --git a/modular_darkpack/modules/powers/code/discipline/presence.dm b/modular_darkpack/modules/powers/code/discipline/presence.dm deleted file mode 100644 index 6f025824e45d..000000000000 --- a/modular_darkpack/modules/powers/code/discipline/presence.dm +++ /dev/null @@ -1,244 +0,0 @@ -/datum/discipline/presence - name = "Presence" - desc = "Makes targets in radius more vulnerable to damages." - icon_state = "presence" - power_type = /datum/discipline_power/presence - -/datum/discipline_power/presence - name = "Presence power name" - desc = "Presence power description" - - activate_sound = 'modular_darkpack/modules/deprecated/sounds/presence_activate.ogg' - deactivate_sound = 'modular_darkpack/modules/deprecated/sounds/presence_deactivate.ogg' - -//AWE -/datum/discipline_power/presence/awe - name = "Awe" - desc = "Make those around you admire and want to be closer to you." - - level = 1 - - check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_SPEAK - target_type = TARGET_HUMAN - range = 7 - - multi_activate = TRUE - cooldown_length = 15 SECONDS - duration_length = 5 SECONDS - -/datum/discipline_power/presence/awe/pre_activation_checks(mob/living/target) - var/mypower = owner.st_get_stat(STAT_CHARISMA) - var/theirpower = target.st_get_stat(STAT_WILLPOWER) - if((theirpower >= mypower) || ((owner.generation - 3) >= target.generation)) - to_chat(owner, span_warning("[target]'s mind is too powerful to sway!")) - return FALSE - - return TRUE - -/datum/discipline_power/presence/awe/activate(mob/living/carbon/human/target) - . = ..() - target.remove_overlay(MUTATIONS_LAYER) - var/mutable_appearance/presence_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "presence", -MUTATIONS_LAYER) - presence_overlay.pixel_z = 1 - target.overlays_standing[MUTATIONS_LAYER] = presence_overlay - target.apply_overlay(MUTATIONS_LAYER) - - var/datum/cb = CALLBACK(target, /mob/living/carbon/human/proc/walk_to_caster, owner) - for(var/i in 1 to 30) - addtimer(cb, (i - 1) * target.cached_multiplicative_slowdown) - to_chat(target, span_userlove("<b>COME HERE</b>")) - owner.say("COME HERE!!") - -/datum/discipline_power/presence/awe/deactivate(mob/living/carbon/human/target) - . = ..() - target.remove_overlay(MUTATIONS_LAYER) - -/mob/living/carbon/human/proc/walk_to_caster(mob/living/step_to) - walk(src, 0) - if(!CheckFrenzyMove()) - set_glide_size(DELAY_TO_GLIDE_SIZE(cached_multiplicative_slowdown)) - step_to(src, step_to, 0) - face_atom(step_to) - -//DREAD GAZE -/datum/discipline_power/presence/dread_gaze - name = "Dread Gaze" - desc = "Incite fear in others through only your words and gaze." - - level = 2 - - check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_SPEAK - target_type = TARGET_HUMAN - range = 7 - - multi_activate = TRUE - cooldown_length = 15 SECONDS - duration_length = 5 SECONDS - -/datum/discipline_power/presence/dread_gaze/pre_activation_checks(mob/living/target) - var/mypower = owner.st_get_stat(STAT_CHARISMA) - var/theirpower = target.st_get_stat(STAT_WILLPOWER) - if((theirpower >= mypower) || ((owner.generation - 3) >= target.generation)) - to_chat(owner, span_warning("[target]'s mind is too powerful to sway!")) - return FALSE - - return TRUE - -/datum/discipline_power/presence/dread_gaze/activate(mob/living/carbon/human/target) - . = ..() - target.remove_overlay(MUTATIONS_LAYER) - var/mutable_appearance/presence_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "presence", -MUTATIONS_LAYER) - presence_overlay.pixel_z = 1 - target.overlays_standing[MUTATIONS_LAYER] = presence_overlay - target.apply_overlay(MUTATIONS_LAYER) - - target.Stun(1 SECONDS) - to_chat(target, span_userlove("<b>REST</b>")) - owner.say("REST!!") - if(target.body_position == STANDING_UP) - target.toggle_resting() - -/datum/discipline_power/presence/dread_gaze/deactivate(mob/living/carbon/human/target) - . = ..() - target.remove_overlay(MUTATIONS_LAYER) - -//ENTRANCEMENT -/datum/discipline_power/presence/entrancement - name = "Entrancement" - desc = "Manipulate minds by bending emotions to your will." - - level = 3 - - check_flags = DISC_CHECK_CAPABLE|DISC_CHECK_SPEAK - target_type = TARGET_HUMAN - range = 7 - - multi_activate = TRUE - cooldown_length = 15 SECONDS - duration_length = 5 SECONDS - -/datum/discipline_power/presence/entrancement/pre_activation_checks(mob/living/target) - var/mypower = owner.st_get_stat(STAT_CHARISMA) - var/theirpower = target.st_get_stat(STAT_WILLPOWER) - if((theirpower >= mypower) || ((owner.generation - 3) >= target.generation)) - to_chat(owner, span_warning("[target]'s mind is too powerful to sway!")) - return FALSE - - return TRUE - -/datum/discipline_power/presence/entrancement/activate(mob/living/carbon/human/target) - . = ..() - target.remove_overlay(MUTATIONS_LAYER) - var/mutable_appearance/presence_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "presence", -MUTATIONS_LAYER) - presence_overlay.pixel_z = 1 - target.overlays_standing[MUTATIONS_LAYER] = presence_overlay - target.apply_overlay(MUTATIONS_LAYER) - - var/obj/item/I1 = target.get_active_held_item() - var/obj/item/I2 = target.get_inactive_held_item() - to_chat(target, span_userlove("<b>PLEASE ME</b>")) - owner.say("PLEASE ME!!") - target.face_atom(owner) - target.do_jitter_animation(3 SECONDS) - target.Immobilize(1 SECONDS) - target.drop_all_held_items() - if(I1) - I1.throw_at(get_turf(owner), 3, 1, target) - if(I2) - I2.throw_at(get_turf(owner), 3, 1, target) - -/datum/discipline_power/presence/entrancement/deactivate(mob/living/carbon/human/target) - . = ..() - target.remove_overlay(MUTATIONS_LAYER) - -//SUMMON -/datum/discipline_power/presence/summon - name = "Summon" - desc = "Call anyone you've ever met to be by your side." - - level = 4 - - check_flags = DISC_CHECK_CAPABLE|DISC_CHECK_SPEAK - target_type = TARGET_HUMAN - range = 7 - - multi_activate = TRUE - cooldown_length = 15 SECONDS - duration_length = 5 SECONDS - -/datum/discipline_power/presence/summon/pre_activation_checks(mob/living/target) - var/mypower = owner.st_get_stat(STAT_CHARISMA) - var/theirpower = target.st_get_stat(STAT_WILLPOWER) - if((theirpower >= mypower) || ((owner.generation - 3) >= target.generation)) - to_chat(owner, span_warning("[target]'s mind is too powerful to sway!")) - return FALSE - - return TRUE - -/datum/discipline_power/presence/summon/activate(mob/living/carbon/human/target) - . = ..() - target.remove_overlay(MUTATIONS_LAYER) - var/mutable_appearance/presence_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "presence", -MUTATIONS_LAYER) - presence_overlay.pixel_z = 1 - target.overlays_standing[MUTATIONS_LAYER] = presence_overlay - target.apply_overlay(MUTATIONS_LAYER) - - to_chat(target, span_userlove("<b>FEAR ME</b>")) - owner.say("FEAR ME!!") - var/datum/cb = CALLBACK(target, TYPE_PROC_REF(/mob/living/carbon/human, step_away_caster), owner) - for(var/i in 1 to 30) - addtimer(cb, (i - 1) * target.cached_multiplicative_slowdown) - target.emote("scream") - target.do_jitter_animation(3 SECONDS) - -/datum/discipline_power/presence/summon/deactivate(mob/living/carbon/human/target) - . = ..() - target.remove_overlay(MUTATIONS_LAYER) - -/mob/living/carbon/human/proc/step_away_caster(mob/living/step_from) - walk(src, 0) - if(!CheckFrenzyMove()) - set_glide_size(DELAY_TO_GLIDE_SIZE(cached_multiplicative_slowdown)) - step_away(src, step_from, 99) - -//MAJESTY -/datum/discipline_power/presence/majesty - name = "Majesty" - desc = "Become so grand that others find it nearly impossible to disobey or harm you." - - level = 5 - - check_flags = DISC_CHECK_CAPABLE|DISC_CHECK_SPEAK - target_type = TARGET_HUMAN - range = 7 - - multi_activate = TRUE - cooldown_length = 15 SECONDS - duration_length = 5 SECONDS - -/datum/discipline_power/presence/majesty/pre_activation_checks(mob/living/target) - var/mypower = owner.st_get_stat(STAT_CHARISMA) - var/theirpower = target.st_get_stat(STAT_WILLPOWER) - if((theirpower >= mypower) || ((owner.generation - 3) >= target.generation)) - to_chat(owner, span_warning("[target]'s mind is too powerful to sway!")) - return FALSE - - return TRUE - -/datum/discipline_power/presence/majesty/activate(mob/living/carbon/human/target) - . = ..() - target.remove_overlay(MUTATIONS_LAYER) - var/mutable_appearance/presence_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "presence", -MUTATIONS_LAYER) - presence_overlay.pixel_z = 1 - target.overlays_standing[MUTATIONS_LAYER] = presence_overlay - target.apply_overlay(MUTATIONS_LAYER) - - to_chat(target, span_userlove("<b>UNDRESS YOURSELF</b>")) - owner.say("UNDRESS YOURSELF!!") - target.Immobilize(1 SECONDS) - for(var/obj/item/clothing/W in target.contents) - target.dropItemToGround(W, TRUE) - -/datum/discipline_power/presence/majesty/deactivate(mob/living/carbon/human/target) - . = ..() - target.remove_overlay(MUTATIONS_LAYER) diff --git a/modular_darkpack/modules/powers/code/discipline/presence/presence.dm b/modular_darkpack/modules/powers/code/discipline/presence/presence.dm new file mode 100644 index 000000000000..8399f172926c --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/presence/presence.dm @@ -0,0 +1,425 @@ +#define TRAIT_PRESENCE_IMMUNE "presence_immune" + +/datum/discipline/presence + name = "Presence" + desc = "Allows you to attract, sway, and control crowds through supernatural allure and emotional manipulation." + icon_state = "presence" + power_type = /datum/discipline_power/presence + +/datum/discipline/presence/post_gain() + . = ..() + ADD_TRAIT(owner, TRAIT_CHARMER, /datum/discipline/presence) + +/datum/discipline_power/presence + name = "Presence power name" + desc = "Presence power description" + activate_sound = 'modular_darkpack/modules/powers/sounds/presence_activate.ogg' + deactivate_sound = 'modular_darkpack/modules/powers/sounds/presence_deactivate.ogg' + +//lets not have people be able to cast this through walls + + +/datum/discipline_power/presence/proc/presence_check(mob/living/carbon/human/owner, mob/living/carbon/human/target, owner_stat, difficulty) + if(!ishuman(target)) + return FALSE + + if(HAS_TRAIT(target, TRAIT_PRESENCE_IMMUNE)) + to_chat(owner, span_warning("A presence attempt has botched against this person and they may no longer have Presence used on them for the rest of the night.")) + return FALSE + + //is the difficulty pre-defined? if not, its probably their willpower. + var/theirpower = difficulty || target.st_get_stat(STAT_TEMPORARY_WILLPOWER) + + var/successes = SSroll.storyteller_roll(owner_stat, difficulty = theirpower, mobs_to_show_output = owner, numerical = TRUE) + + //botch + if(successes < 0) + ADD_TRAIT(target, TRAIT_PRESENCE_IMMUNE, TRAIT_GENERIC) + to_chat(owner, span_warning("A presence attempt has botched against this person and they may no longer have Presence used on them for the rest of the night.")) + return FALSE + + //number of successes is rather critical for the efficacy of the power + return successes + +/datum/discipline_power/presence/proc/apply_presence_overlay(mob/living/carbon/target, resist_timer = 30 SECONDS) + target.remove_overlay(MUTATIONS_LAYER) + var/mutable_appearance/presence_overlay = mutable_appearance('modular_darkpack/modules/powers/icons/presence.dmi', "presence", -MUTATIONS_LAYER) + presence_overlay.pixel_z = 1 + target.overlays_standing[MUTATIONS_LAYER] = presence_overlay + target.apply_overlay(MUTATIONS_LAYER) + SEND_SOUND(target, sound('modular_darkpack/modules/powers/sounds/presence_activate.ogg')) + + // resist presence button - note to self, in the future, v20 states that the resister must continue to spend willpower if in the presence of the vamp + var/datum/action/resist_presence/resist_action = new(target) + resist_action.Grant(target) + + // remove the action after 20 seconds + addtimer(CALLBACK(resist_action, TYPE_PROC_REF(/datum/action, Remove), target), resist_timer) + +//used in awe - v20 book states that awe affects the targets of lowest willpower first if affecting multiple targets. +/datum/discipline_power/presence/proc/sort_targets_by_willpower(list/targets) + var/list/sorted = list() + for(var/mob/living/carbon/target in targets) + var/target_willpower = target.st_get_stat(STAT_TEMPORARY_WILLPOWER) + var/inserted = FALSE + + for(var/i = 1; i <= length(sorted); i++) + var/mob/living/carbon/existing = sorted[i] + if(target_willpower < existing.st_get_stat(STAT_TEMPORARY_WILLPOWER)) + sorted.Insert(i, target) + inserted = TRUE + break + + if(!inserted) + sorted += target + return sorted + +//datum/action to resist presence powers by burning a willpower point and making a difficulty 8 roll +/datum/action/resist_presence + name = "Resist Presence" + desc = "Burn a point of your temporary willpower to resist the effects of Presence." + button_icon = 'modular_darkpack/master_files/icons/hud/actions.dmi' + button_icon_state = "presence" + check_flags = AB_CHECK_CONSCIOUS + +/datum/action/resist_presence/Trigger(trigger_flags) + . = ..() + if(!.) + return FALSE + + var/mob/living/carbon/human/user = owner + if(!ishuman(user)) + return FALSE + + if(user.st_get_stat(STAT_TEMPORARY_WILLPOWER) <= 0) + to_chat(user, span_warning("You don't have any temporary willpower left to resist!")) + return FALSE + + user.st_set_stat(STAT_TEMPORARY_WILLPOWER, max((user.st_get_stat(STAT_TEMPORARY_WILLPOWER) - 1),0)) + to_chat(user, span_warning("You burn a point of willpower to resist the supernatural influence...")) + + var/roll_success = SSroll.storyteller_roll(user.st_get_stat(STAT_TEMPORARY_WILLPOWER), difficulty = 8, mobs_to_show_output = user) + + if(roll_success) + user.remove_overlay(MUTATIONS_LAYER) + user.clear_alert("entrancement") + to_chat(user, span_notice("You have succeeded in resisting the effects of Presence.")) + Remove(user) + return TRUE + else + to_chat(user, span_warning("Despite your efforts, the supernatural influence remains too strong!")) + return FALSE + +// AWE +/datum/discipline_power/presence/awe + name = "Awe" + desc = "Make those around you admire and want to be closer to you." + level = 1 + vitae_cost = 1 + check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_SPEAK + range = 7 + multi_activate = FALSE + cooldown_length = 15 SECONDS + duration_length = 10 SECONDS + vitae_cost = 1 + var/successes = 0 + var/list/affected_targets = list() + +/datum/discipline_power/presence/awe/pre_activation_checks() + .=..() + + //charisma + performance + successes = SSroll.storyteller_roll(owner.st_get_stat(STAT_CHARISMA) + owner.st_get_stat(STAT_PERFORMANCE), difficulty = 7, mobs_to_show_output = owner, numerical = TRUE) + if(successes > 0) + return TRUE + + to_chat(owner, span_warning("Your presence fails to captivate anyone around you.")) + do_cooldown(cooldown_length) + return FALSE + +/datum/discipline_power/presence/awe/activate() + . = ..() + + var/list/potential_targets = list() + for(var/mob/living/carbon/target in hearers(range, owner)) + if(target != owner) + potential_targets += target + + if(!length(potential_targets)) + to_chat(owner, span_warning("There is no one around to be awed by your presence.")) + return + + var/list/target_counts = list(1, 2, 6, 20, length(potential_targets)) //v20 core rulebook presence -> awe + var/targets_to_affect = target_counts[clamp(successes, 1, 5)] + + potential_targets = sort_targets_by_willpower(potential_targets) + affected_targets = list() + + for(var/i = 1; i <= min(targets_to_affect, length(potential_targets)); i++) + var/mob/living/carbon/target = potential_targets[i] + apply_presence_overlay(target) + to_chat(target, span_yellowteamradio("You feel extremely attracted to and persuaded by [owner]'s words, no matter what they're saying!")) + target.apply_status_effect(STATUS_EFFECT_AWE) + affected_targets += target + + var/affected_count = length(affected_targets) + if(affected_count > 0) + to_chat(owner, span_warning("Your commanding presence captivates [affected_count] [affected_count == 1 ? "person" : "people"] around you!")) + else + to_chat(owner, span_warning("Your presence fails to affect anyone around you.")) + +/datum/discipline_power/presence/awe/deactivate() + . = ..() + for(var/mob/living/carbon/target in affected_targets) + target.remove_overlay(MUTATIONS_LAYER) + affected_targets.Cut() + +// DREAD GAZE +/datum/discipline_power/presence/dread_gaze + name = "Dread Gaze" + desc = "Incite fear in others through only your words and gaze." + level = 2 + vitae_cost = 1 + check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_SPEAK | DISC_CHECK_DIRECT_SEE + target_type = TARGET_HUMAN + range = 7 + multi_activate = TRUE + cooldown_length = 15 SECONDS + duration_length = 10 SECONDS + vitae_cost = 1 //no mention of literally any cost for using this in v20 + var/successes = 0 + + +/datum/discipline_power/presence/dread_gaze/pre_activation_checks(mob/living/target) + + //charisma + intimidation, difficulty equal to the victims wits + courage + successes = presence_check(owner, target, owner.st_get_stat(STAT_CHARISMA) + owner.st_get_stat(STAT_INTIMIDATION), difficulty = (target.st_get_stat(STAT_WITS))) //+ target.st_get_stat(STAT_COURAGE))) + if(successes > 0) + return TRUE + + do_cooldown(cooldown_length) + return FALSE + +/datum/discipline_power/presence/dread_gaze/activate(mob/living/carbon/human/target) + . = ..() + apply_presence_overlay(target) + + if(successes <= 3) // already checked for above 0 in pre_activation + to_chat(target, span_userdanger("You are consumed with terror toward [owner]!")) + to_chat(owner, span_warning("You've struck terror into [target]'s heart with your dreadful gaze!")) + else + to_chat(target, span_userdanger("Overwhelming dread fills you! You must get away from [owner]!")) + to_chat(owner, span_warning("Your terrifying presence sends [target] fleeing in terror!")) + + //v20's 'dread gaze' section states that with 3 or more successes targets will find themselves scratching at the walls or fleeing against their will because they are so terrified. + //var/datum/cb = CALLBACK(target, TYPE_PROC_REF(/mob/living/carbon/human, step_away_caster), owner) + //for(var/i in 1 to 30) + //addtimer(cb, (i - 1) * target.total_multiplicative_slowdown()) + +/datum/discipline_power/presence/dread_gaze/deactivate(mob/living/carbon/human/target) + . = ..() + target.remove_overlay(MUTATIONS_LAYER) + +// ENTRANCEMENT +/datum/discipline_power/presence/entrancement + name = "Entrancement" + desc = "Manipulate minds by bending emotions to your will." + level = 3 + check_flags = DISC_CHECK_CAPABLE|DISC_CHECK_SPEAK | DISC_CHECK_DIRECT_SEE + target_type = TARGET_HUMAN + range = 7 + multi_activate = TRUE + cooldown_length = 3 MINUTES + duration_length = 5 SECONDS + vitae_cost = 1 + var/successes = 0 + +/datum/discipline_power/presence/entrancement/pre_activation_checks(mob/living/target) + + successes = presence_check(owner, target, owner.st_get_stat(STAT_APPEARANCE) + owner.st_get_stat(STAT_EMPATHY)) + if(successes > 0) + return TRUE + + do_cooldown(cooldown_length) + return FALSE + +/datum/discipline_power/presence/entrancement/activate(mob/living/carbon/human/target) + . = ..() + if(!.) + to_chat(owner, span_warning("[target] doesnt seem entranced by your words.")) + return + target.throw_alert("entrancement", /atom/movable/screen/alert/entrancement) + log_combat(owner, target, "Used Presence Entrancement") + + apply_presence_overlay(target, successes * 10 MINUTES) + to_chat(target, span_hypnophrase("You find yourself becoming completely entraced by [owner]. You are now their willing servant.")) + to_chat(target, span_info("You are now the willing servant of [owner]. You will seek to please them and fulfill their every desire, but this desire will fade soon.")) + addtimer(CALLBACK(src, PROC_REF(end_entrancement), target), successes * 30 MINUTES) // might be alot considering 5 successes is 5 ingame hours which is... most of a round. + +/datum/discipline_power/presence/entrancement/proc/end_entrancement(mob/living/carbon/human/target) + to_chat(target, span_hypnophrase("Your desire to fulfill [owner]'s every desire fades.")) + target.clear_alert("entrancement") + +/datum/discipline_power/presence/entrancement/deactivate(mob/living/carbon/human/target) + . = ..() + target.remove_overlay(MUTATIONS_LAYER) + +// SUMMON +/datum/discipline_power/presence/summon + name = "Summon" + desc = "Call anyone you've ever met to be by your side." + level = 4 + check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_SPEAK + range = 7 + multi_activate = TRUE + cooldown_length = 20 MINUTES //i can already see people using this ability to summon and kill upon arrival. this cooldown should help with that. + duration_length = 5 SECONDS + vitae_cost = 1 + var/successes = 0 + var/mob/living/carbon/human/summon_target + +/datum/discipline_power/presence/summon/pre_activation_checks(mob/living/target) + var/summon_target_name = tgui_input_text(owner, "Summon Target:", "Summon Target") + if(!summon_target_name) + return FALSE + summon_target_name = sanitize_name(summon_target_name) + + for(var/mob/living/carbon/human/H in GLOB.player_list) + if(H.real_name == summon_target_name) + summon_target = H + break + + if(!summon_target) + to_chat(owner, span_warning("You cannot sense anyone by that name.")) + return FALSE + + //this ability has a difficulty of 4 or 5 or something for people the summoner has met, and 8 for those they've only met briefly. + //i thought that was too low and the ability for the misuse of this disc caused me to raise it to 7 difficulty + successes = presence_check(owner, summon_target, owner.st_get_stat(STAT_CHARISMA) + owner.st_get_stat(STAT_SUBTERFUGE), 7) + if(successes > 0) + return TRUE + + do_cooldown(cooldown_length) + return FALSE + +/datum/discipline_power/presence/summon/activate(mob/living/carbon/human/target) + . = ..() + if(!. || !summon_target) + to_chat(owner, span_warning("Your summons failed to reach [summon_target ? summon_target.real_name : "your target"].")) + return + + apply_presence_overlay(summon_target, 5 MINUTES) + + var/turf/owner_turf = get_turf(owner) + var/location_info = "[get_area_name(owner_turf)], X:[owner_turf.x] Y:[owner_turf.y] Z:[owner_turf.z]" + to_chat(summon_target, span_yellowteamradio("[owner.real_name] is summoning you to their location. [owner.real_name] is currently at [location_info]")) + + //v20 presence -> 'summon' section for this flavortext + var/list/flavor_texts = list( + "You feel a faint pull towards [owner.real_name], approaching slowly and hesitantly.", + "You feel reluctantly compelled to seek out [owner.real_name], though obstacles easily deter you.", + "You feel a strong urge to go to [owner.real_name] with reasonable speed.", + "You feel compelled to rush to [owner.real_name] with haste, overcoming any obstacles in your way, but not endangering yourself.", + "You feel an overwhelming need to rush to [owner.real_name], doing anything to get to them." + ) + + var/flavor_index = clamp(successes, 1, 5) + to_chat(summon_target, span_yellowteamradio(flavor_texts[flavor_index])) + to_chat(summon_target, span_info("Summon only affects targets who have reasonably met the summoner. If you believe your character would reasonably have never met the summoner, this power is ineffective.")) + to_chat(owner, span_warning("You've successfully summoned [summon_target.real_name] to your presence! ([successes] success\s)")) + summon_target.do_jitter_animation(3 SECONDS) + +/datum/discipline_power/presence/summon/deactivate(mob/living/carbon/human/target) + . = ..() + summon_target?.remove_overlay(MUTATIONS_LAYER) + +// MAJESTY +/datum/discipline_power/presence/majesty + name = "Majesty" + desc = "Become so grand that others find it nearly impossible to disobey or harm you." + level = 5 + check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_SPEAK + range = 7 + multi_activate = TRUE + cooldown_length = 12 MINUTES + duration_length = 3 MINUTES + //willpower_cost = 1 + var/list/affected_targets = list() + +/datum/discipline_power/presence/majesty/pre_activation_checks(mob/living/target) + return TRUE + +/datum/discipline_power/presence/majesty/activate(mob/living/carbon/human/target) + . = ..() + affected_targets = list() + for(var/mob/living/carbon/human/hearer in get_hearers_in_view(range, owner)) + if(hearer == owner) + continue + + //'the victim must make a courage roll with a difficulty equal to the caster's charisma + intimidation to a maximum of 10' + var/hearer_successes = SSroll.storyteller_roll(hearer.st_get_stat(STAT_COURAGE), difficulty = owner.st_get_stat(STAT_CHARISMA) + owner.st_get_stat(STAT_INTIMIDATION), mobs_to_show_output = hearer, numerical = TRUE) + hearer_successes = max(0, hearer_successes) + + apply_presence_overlay(hearer, 3 MINUTES) + affected_targets[hearer] = hearer_successes + + to_chat(hearer, span_hypnophrase("You find yourself completely submitting to the Majesty of [owner]. Their every word is your utmost priority, every frown of displeasure crushing your soul. You find yourself humbling yourself entirely in their overwhelming presence.")) + + if(hearer_successes > 0) + to_chat(hearer, span_info("Despite the overwhelming presence, your will allows you to make [hearer_successes] contradictory action\s until youre allowed to leave [owner]'s company.")) + + var/total_affected = length(affected_targets) + to_chat(owner, span_warning(total_affected > 0 ? "Your Majesty overwhelms [total_affected] individual[total_affected == 1 ? "" : "s"] in your presence!" : "No one is present to witness your Majesty.")) + +/datum/discipline_power/presence/majesty/deactivate(mob/living/carbon/human/target) + . = ..() + for(var/mob/living/carbon/human/affected_target in affected_targets) + if(affected_target) + affected_target.remove_overlay(MUTATIONS_LAYER) + to_chat(affected_target, span_hypnophrase("The overwhelming presence of [owner] fades, and your will returns to normal.")) + affected_targets.Cut() + +// LOVE +/datum/discipline_power/presence/love + name = "Love" + desc = "Make someone enamored with you as if in a blood bond." + level = 6 + check_flags = DISC_CHECK_CAPABLE|DISC_CHECK_SPEAK + target_type = TARGET_HUMAN + range = 7 + cooldown_length = 15 SECONDS + var/presence_succeeded = FALSE + +/datum/discipline_power/presence/love/pre_activation_checks(mob/living/target) + + presence_succeeded = presence_check(owner, target) + if(presence_succeeded) + return TRUE + + do_cooldown(cooldown_length) + return FALSE + +/datum/discipline_power/presence/love/activate(mob/living/carbon/human/target) + . = ..() + if(presence_succeeded) + apply_presence_overlay(target) + //target.apply_status_effect(STATUS_EFFECT_INLOVE, owner) + to_chat(owner, span_warning("You've enthralled [target] with your presence, and bonded them to you!")) + else + to_chat(owner, span_warning("[target]'s mind has resisted your attempt to sway!")) + to_chat(target, span_warning("An overwhelming aura radiates from [owner], compelling your love… but you steel your heart and turn away from their unnatural allure.")) + +///mob/living/carbon/proc/walk_to_caster(mob/living/step_to) + //walk(src, 0) + //if(!CheckFrenzyMove()) + //set_glide_size(DELAY_TO_GLIDE_SIZE(total_multiplicative_slowdown())) + //step_to(src, step_to, 0) + //face_atom(step_to) + +///mob/living/carbon/human/proc/step_away_caster(mob/living/step_from) + //walk(src, 0) + //if(!CheckFrenzyMove()) + //set_glide_size(DELAY_TO_GLIDE_SIZE(total_multiplicative_slowdown())) + //step_away(src, step_from, 99) + +#undef TRAIT_PRESENCE_IMMUNE diff --git a/modular_darkpack/modules/powers/code/discipline/presence/status_effects/awe_status_effect.dm b/modular_darkpack/modules/powers/code/discipline/presence/status_effects/awe_status_effect.dm new file mode 100644 index 000000000000..6719fbd83652 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/presence/status_effects/awe_status_effect.dm @@ -0,0 +1,12 @@ +/datum/status_effect/awe //Used for powers that force a target to walk to you. + id = "awe" + status_type = STATUS_EFFECT_UNIQUE + duration = 5 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/awe + var/mob/living/carbon/human/source + +/atom/movable/screen/alert/status_effect/awe + name = "Awe" + desc = "That person sure seems alluring... I should get closer." + icon_state = "hypnosis" + diff --git a/modular_darkpack/modules/powers/code/discipline/presence/status_effects/entrancement_status_effect.dm b/modular_darkpack/modules/powers/code/discipline/presence/status_effects/entrancement_status_effect.dm new file mode 100644 index 000000000000..679bceb33b0b --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/presence/status_effects/entrancement_status_effect.dm @@ -0,0 +1,4 @@ +/atom/movable/screen/alert/entrancement + name = "Entranced" + desc = "You are completely entranced and compelled to serve." + icon_state = "hypnosis" diff --git a/modular_darkpack/modules/powers/code/discipline/protean.dm b/modular_darkpack/modules/powers/code/discipline/protean.dm deleted file mode 100644 index 0bb301eaaf0b..000000000000 --- a/modular_darkpack/modules/powers/code/discipline/protean.dm +++ /dev/null @@ -1,214 +0,0 @@ -/datum/discipline/protean - name = "Protean" - desc = "Lets your beast out, making you stronger and faster. Violates Masquerade." - icon_state = "protean" - clan_restricted = TRUE - power_type = /datum/discipline_power/protean - -/datum/discipline_power/protean - name = "Protean power name" - desc = "Protean power description" - - activate_sound = 'modular_darkpack/modules/deprecated/sounds/protean_activate.ogg' - deactivate_sound = 'modular_darkpack/modules/deprecated/sounds/protean_deactivate.ogg' - -//EYES OF THE BEAST -/datum/discipline_power/protean/eyes_of_the_beast - name = "Eyes of the Beast" - desc = "Let your eyes be a gateway to your Beast. Gain its eyes." - - level = 1 - - check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE - - violates_masquerade = TRUE - - cancelable = TRUE - duration_length = 20 SECONDS - cooldown_length = 20 SECONDS - - grouped_powers = list( - /datum/discipline_power/protean/feral_claws, - /datum/discipline_power/protean/earth_meld, - /datum/discipline_power/protean/shape_of_the_beast, - /datum/discipline_power/protean/mist_form - ) - -/datum/discipline_power/protean/eyes_of_the_beast/activate() - . = ..() - owner.drop_all_held_items() - owner.put_in_r_hand(new /obj/item/knife/vamp/gangrel(owner)) - owner.put_in_l_hand(new /obj/item/knife/vamp/gangrel(owner)) - owner.add_client_colour(/datum/client_colour/glass_colour/red) - -/datum/discipline_power/protean/eyes_of_the_beast/deactivate() - . = ..() - for(var/obj/item/knife/vamp/gangrel/G in owner.contents) - qdel(G) - owner.remove_client_colour(/datum/client_colour/glass_colour/red) - -//FERAL CLAWS -/datum/movespeed_modifier/protean2 - multiplicative_slowdown = -0.15 - -/datum/discipline_power/protean/feral_claws - name = "Feral Claws" - desc = "Become a predator and grow hideous talons." - - level = 2 - - check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE - - violates_masquerade = TRUE - - cancelable = TRUE - duration_length = 20 SECONDS - cooldown_length = 20 SECONDS - - grouped_powers = list( - /datum/discipline_power/protean/eyes_of_the_beast, - /datum/discipline_power/protean/earth_meld, - /datum/discipline_power/protean/shape_of_the_beast, - /datum/discipline_power/protean/mist_form - ) - -/datum/discipline_power/protean/feral_claws/activate() - . = ..() - owner.drop_all_held_items() - owner.put_in_r_hand(new /obj/item/knife/vamp/gangrel(owner)) - owner.put_in_l_hand(new /obj/item/knife/vamp/gangrel(owner)) - owner.add_client_colour(/datum/client_colour/glass_colour/red) - owner.add_movespeed_modifier(/datum/movespeed_modifier/protean2) - -/datum/discipline_power/protean/feral_claws/deactivate() - . = ..() - for(var/obj/item/knife/vamp/gangrel/G in owner.contents) - qdel(G) - owner.remove_client_colour(/datum/client_colour/glass_colour/red) - owner.remove_movespeed_modifier(/datum/movespeed_modifier/protean2) - -//EARTH MELD -/obj/effect/proc_holder/spell/targeted/shapeshift/gangrel - name = "Gangrel Form" - desc = "Take on the shape a wolf." - charge_max = 50 - cooldown_min = 5 SECONDS - revert_on_death = TRUE - die_with_shapeshifted_form = FALSE - shapeshift_type = /mob/living/simple_animal/hostile/gangrel - -/datum/discipline_power/protean/earth_meld - name = "Earth Meld" - desc = "Hide yourself in the earth itself." - - level = 3 - - check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE - - violates_masquerade = TRUE - - cancelable = TRUE - duration_length = 20 SECONDS - cooldown_length = 20 SECONDS - - grouped_powers = list( - /datum/discipline_power/protean/eyes_of_the_beast, - /datum/discipline_power/protean/feral_claws, - /datum/discipline_power/protean/shape_of_the_beast, - /datum/discipline_power/protean/mist_form - ) - - var/obj/effect/proc_holder/spell/targeted/shapeshift/gangrel/GA - -/datum/discipline_power/protean/earth_meld/activate() - . = ..() - if (!GA) - GA = new(owner) - owner.drop_all_held_items() - GA.Shapeshift(owner) - -/datum/discipline_power/protean/earth_meld/deactivate() - . = ..() - GA.Restore(GA.myshape) - owner.Stun(1.5 SECONDS) - owner.do_jitter_animation(30) - -//SHAPE OF THE BEAST -/obj/effect/proc_holder/spell/targeted/shapeshift/gangrel/better - shapeshift_type = /mob/living/simple_animal/hostile/gangrel/better - -/datum/discipline_power/protean/shape_of_the_beast - name = "Shape of the Beast" - desc = "Assume the form of an animal and retain your power." - - level = 4 - - check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE - - violates_masquerade = TRUE - - cancelable = TRUE - duration_length = 20 SECONDS - cooldown_length = 20 SECONDS - - grouped_powers = list( - /datum/discipline_power/protean/eyes_of_the_beast, - /datum/discipline_power/protean/feral_claws, - /datum/discipline_power/protean/earth_meld, - /datum/discipline_power/protean/mist_form - ) - - var/obj/effect/proc_holder/spell/targeted/shapeshift/gangrel/better/GA - -/datum/discipline_power/protean/shape_of_the_beast/activate() - . = ..() - if (!GA) - GA = new(owner) - owner.drop_all_held_items() - GA.Shapeshift(owner) - -/datum/discipline_power/protean/shape_of_the_beast/deactivate() - . = ..() - GA.Restore(GA.myshape) - owner.Stun(1 SECONDS) - owner.do_jitter_animation(15) - -//MIST FORM -/obj/effect/proc_holder/spell/targeted/shapeshift/gangrel/best - shapeshift_type = /mob/living/simple_animal/hostile/gangrel/best - -/datum/discipline_power/protean/mist_form - name = "Mist Form" - desc = "Dissipate your body and move as mist." - - level = 5 - - check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE - - violates_masquerade = TRUE - - cancelable = TRUE - duration_length = 20 SECONDS - cooldown_length = 20 SECONDS - - grouped_powers = list( - /datum/discipline_power/protean/eyes_of_the_beast, - /datum/discipline_power/protean/feral_claws, - /datum/discipline_power/protean/earth_meld, - /datum/discipline_power/protean/shape_of_the_beast - ) - - var/obj/effect/proc_holder/spell/targeted/shapeshift/gangrel/best/GA - -/datum/discipline_power/protean/mist_form/activate() - . = ..() - if (!GA) - GA = new(owner) - owner.drop_all_held_items() - GA.Shapeshift(owner) - -/datum/discipline_power/protean/mist_form/deactivate() - . = ..() - GA.Restore(GA.myshape) - owner.Stun(1 SECONDS) - owner.do_jitter_animation(15) diff --git a/modular_darkpack/modules/powers/code/discipline/protean/beast_form.dm b/modular_darkpack/modules/powers/code/discipline/protean/beast_form.dm new file mode 100644 index 000000000000..ae1eabc9f736 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/protean/beast_form.dm @@ -0,0 +1,72 @@ +/datum/action/cooldown/spell/shapeshift/gangrel/beast_form + name = "Gangrel Form" + desc = "Take on the shape of an animal." + + possible_shapes = list( + /mob/living/basic/bat/protean, + /mob/living/basic/pet/dog/darkpack/protean, // DARKPACK TODO - WOLF + ) + +/mob/living/basic/bat/protean + maxHealth = 300 + health = 300 + mob_size = MOB_SIZE_SMALL + +/mob/living/basic/pet/dog/darkpack/protean + maxHealth = 300 + health = 300 + melee_damage_lower = 20 + melee_damage_upper = 20 + +/mob/living/basic/bear/vampire/protean + maxHealth = 300 + health = 300 + melee_damage_lower = 20 + melee_damage_upper = 20 + +/datum/action/cooldown/spell/shapeshift/gangrel/beast_form/Grant(mob/grant_to) + . = ..() + if(ishuman(grant_to)) + var/mob/living/carbon/human/grant_to_human = grant_to + if(grant_to_human.is_clan(/datum/vampire_clan/gangrel)) + possible_shapes += list( + /mob/living/basic/bear/vampire/protean + ) + +/mob/living/basic/gangrel + name = "horrid form" + desc = "The pinnacle of bestial terror. Unbelievably tough." + icon = 'modular_darkpack/modules/deprecated/icons/32x48.dmi' + icon_state = "gangrel_f" + icon_living = "gangrel_f" + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + mob_size = MOB_SIZE_HUGE + speed = -0.4 + maxHealth = 275 + health = 275 + butcher_results = list(/obj/item/stack/human_flesh = 10) + melee_damage_lower = 30 + melee_damage_upper = 30 + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" + attack_sound = 'sound/items/weapons/slash.ogg' + combat_mode = TRUE + bloodpool = 10 + maxbloodpool = 10 + held_items = list(null, null) + +/mob/living/basic/gangrel/better + maxHealth = 325 + health = 325 + melee_damage_lower = 35 + melee_damage_upper = 35 + speed = -0.6 + +/mob/living/basic/gangrel/best + icon_state = "gangrel_m" + icon_living = "gangrel_m" + maxHealth = 400 + health = 400 + melee_damage_lower = 40 + melee_damage_upper = 40 + speed = -0.8 diff --git a/modular_darkpack/modules/powers/code/discipline/protean/claws.dm b/modular_darkpack/modules/powers/code/discipline/protean/claws.dm new file mode 100644 index 000000000000..e09ae5f731dc --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/protean/claws.dm @@ -0,0 +1,27 @@ +/obj/item/gangrel_claws + name = "claws" + desc = "Don't cut yourself accidentally." + icon_state = "gangrel" + icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi' + lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' + righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' + hitsound = 'sound/items/weapons/slash.ogg' + force = 1 TTRPG_DAMAGE + damtype = AGGRAVATED // Based on V20 + sharpness = SHARP_POINTY + armour_penetration = 40 + block_chance = 20 + item_flags = DROPDEL + masquerade_violating = TRUE + obj_flags = NONE + +/obj/item/gangrel_claws/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, INNATE_TRAIT) + +/obj/item/gangrel_claws/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) + . = ..() + // Based on V20 + if(isliving(user)) + var/mob/living/living_user = user + force = (living_user.st_get_stat(STAT_STRENGTH) + 1) TTRPG_DAMAGE diff --git a/modular_darkpack/modules/powers/code/discipline/protean/dirt_pile.dm b/modular_darkpack/modules/powers/code/discipline/protean/dirt_pile.dm new file mode 100644 index 000000000000..38f8ecdfe264 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/protean/dirt_pile.dm @@ -0,0 +1,37 @@ +/obj/effect/decal/dirt_pile // Should only be used for Earth Meld! + name = "disturbed earth" + icon = 'modular_darkpack/modules/powers/icons/dirt_pile.dmi' + icon_state = "dirt_pile" + alpha = 64 + var/expiring = FALSE + +/obj/effect/decal/dirt_pile/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(tool.tool_behaviour == TOOL_SHOVEL) + to_chat(user,"You begin to dig up the disturbed earth.") + if(!tool.use_tool(src, user, 2 SECONDS)) + return ITEM_INTERACT_BLOCKING + expiring = TRUE + for(var/mob/living/L in contents) + to_chat(L, span_warning("Your resting place is disturbed by [user]!")) + L.forceMove(get_turf(loc)) + L.Knockdown(3 SECONDS) // Get-up lag for anyone hiding in here + L.SetStun(0) // End the hider's stun to allow them to crawl + remove_dirt_pile() + return ITEM_INTERACT_SUCCESS + +/obj/effect/decal/dirt_pile/Initialize(mapload) + . = ..() + update_overlays() + +/obj/effect/decal/dirt_pile/update_overlays() + . = ..() + var/turf/my_turf = get_turf(src) + var/mutable_appearance/mask = new(my_turf.appearance) + mask.blend_mode = BLEND_MULTIPLY + . += mask + +/obj/effect/decal/dirt_pile/proc/remove_dirt_pile() + animate(src, alpha = 0, time = 1 SECONDS) // Fade out + spawn(3 SECONDS) + qdel(src) + diff --git a/modular_darkpack/modules/powers/code/discipline/protean/mist_form.dm b/modular_darkpack/modules/powers/code/discipline/protean/mist_form.dm new file mode 100644 index 000000000000..6c13c24ca572 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/protean/mist_form.dm @@ -0,0 +1,33 @@ +/datum/action/cooldown/spell/shapeshift/gangrel/mist + name = "Mist Form" + desc = "Dissipate your body and move as mist." + possible_shapes = list(/mob/living/basic/mist) + +/mob/living/basic/mist + name = "mist" + desc = "A cloud of mist." + icon = 'icons/effects/effects.dmi' + icon_state = "smoke" + icon_living = "smoke" + alpha = 128 + mob_biotypes = MOB_ORGANIC + density = FALSE + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB + mob_size = MOB_SIZE_TINY + speed = -0.2 + maxHealth = 400 + health = 400 + melee_damage_lower = 0 + melee_damage_upper = 0 + +/mob/living/basic/mist/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + AddElement(/datum/element/simple_flying) + +/mob/living/basic/mist/Move(NewLoc, direct) + . = ..() + var/obj/structure/vampdoor/V = locate() in NewLoc + if(V) + if(V.lockpick_difficulty <= 10) + forceMove(get_turf(V)) diff --git a/modular_darkpack/modules/powers/code/discipline/protean/protean.dm b/modular_darkpack/modules/powers/code/discipline/protean/protean.dm new file mode 100644 index 000000000000..35d28111eaae --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/protean/protean.dm @@ -0,0 +1,223 @@ +/datum/discipline/protean + name = "Protean" + desc = "Lets your beast out, making you stronger and faster. Violates Masquerade." + icon_state = "protean" + clan_restricted = TRUE + power_type = /datum/discipline_power/protean + +/datum/discipline_power/protean + name = "Protean power name" + desc = "Protean power description" + abstract_type = /datum/discipline_power/protean + + activate_sound = 'modular_darkpack/modules/deprecated/sounds/protean_activate.ogg' + deactivate_sound = 'modular_darkpack/modules/deprecated/sounds/protean_deactivate.ogg' + +//EYES OF THE BEAST // VTM5 Corebook, page 270 +/datum/discipline_power/protean/eyes_of_the_beast + name = "Eyes of the Beast" + desc = "Let your eyes be a gateway to your Beast. Gain its eyes." + + level = 1 + + check_flags = DISC_CHECK_CONSCIOUS + vitae_cost = 0 + violates_masquerade = FALSE + + toggled = TRUE + var/original_eye_color + +/datum/discipline_power/protean/eyes_of_the_beast/activate() + . = ..() + var/obj/item/organ/eyes/owners_eyes = owner.get_organ_by_type(/obj/item/organ/eyes) + ADD_TRAIT(owner, TRAIT_TRUE_NIGHT_VISION, type) + owners_eyes?.refresh() + owner.st_add_stat_mod(STAT_CHARISMA, -1, type) // 20th edition + owner.st_add_stat_mod(STAT_MANIPULATION, -1, type) // 20th edition + owner.st_add_stat_mod(STAT_APPEARANCE, -1, type) // 20th edition + owner.st_add_stat_mod(STAT_INTIMIDATION, 2, type) // 5th edition + owner.add_eye_color("#ff0000", EYE_COLOR_DISC) + +/datum/discipline_power/protean/eyes_of_the_beast/deactivate() + . = ..() + var/obj/item/organ/eyes/owners_eyes = owner.get_organ_by_type(/obj/item/organ/eyes) + REMOVE_TRAIT(owner, TRAIT_TRUE_NIGHT_VISION, type) + owners_eyes?.refresh() + owner.st_remove_stat_mod(STAT_CHARISMA, type) // 20th edition + owner.st_remove_stat_mod(STAT_MANIPULATION, type) // 20th edition + owner.st_remove_stat_mod(STAT_APPEARANCE, type) // 20th edition + owner.st_remove_stat_mod(STAT_INTIMIDATION, type) // 5th edition + owner.remove_eye_color(EYE_COLOR_DISC) + +/datum/discipline_power/protean/feral_claws + name = "Feral Claws" + desc = "Become a predator and grow hideous talons." + + level = 2 + + check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE + + violates_masquerade = TRUE + + toggled = TRUE + duration_length = 1 SCENES + + grouped_powers = list() + +/datum/discipline_power/protean/feral_claws/activate() + . = ..() + sleep(1 TURNS) + owner.drop_all_held_items() + owner.put_in_r_hand(new /obj/item/gangrel_claws(owner)) + owner.put_in_l_hand(new /obj/item/gangrel_claws(owner)) + +/datum/discipline_power/protean/feral_claws/deactivate() + . = ..() + for(var/obj/item/gangrel_claws/old_claws in owner.contents) + qdel(old_claws) + +//EARTH MELD +/datum/discipline_power/protean/earth_meld + name = "Earth Meld" + desc = "Hide yourself in the earth itself." + + level = 3 + + check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE + + violates_masquerade = TRUE + + cancelable = TRUE + duration_length = 1 SCENES + cooldown_length = 1 TURNS + + grouped_powers = list( + /datum/discipline_power/protean/shape_of_the_beast, + /datum/discipline_power/protean/mist_form + ) + var/obj/effect/decal/dirt_pile/D + +/datum/discipline_power/protean/earth_meld/proc/become_soil() + animate(owner, transform = matrix(), color = "#ffffff", time = 10) // Reset ourselves while we're invisible + D = new (get_turf(owner)) // Spawn some dirt + D.alpha = 64 // Subtle dirt + owner.forceMove(D) // Put ourselves inside the dirt + +/datum/discipline_power/protean/earth_meld/pre_activation_checks() + var/allowed_turfs = list( + /turf/open/misc, + ) + + if(!is_type_in_list(owner.loc, allowed_turfs)) // Check if the turf we're standing on is in allowed_turfs + to_chat(owner, span_warning("You can't meld into the ground here!")) + return FALSE + else + return TRUE + +/datum/discipline_power/protean/earth_meld/activate() + . = ..() + owner.drop_all_held_items() + owner.Stun(1 TURNS) // Dirt can't move, and neither can you! + animate(owner, transform = matrix()/4, color = "#35240b", time = 1 SECONDS) // Sink into the earth + addtimer(CALLBACK(src, PROC_REF(become_soil)), 1 SECONDS) + +/datum/discipline_power/protean/earth_meld/deactivate() + . = ..() + if(owner.IsStun()) + owner.SetStun(0) // End the ongoing stun + if(!D.expiring) // If D.expiring == 1, the following will occur anyways. + owner.Knockdown(1 TURNS) // Get-up lag + owner.forceMove(get_turf(D)) + D.remove_dirt_pile() + +//SHAPE OF THE BEAST +/datum/discipline_power/protean/shape_of_the_beast + name = "Shape of the Beast" + desc = "Assume the form of an animal and retain your power." + + level = 4 + + check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE + + violates_masquerade = TRUE + + cancelable = TRUE + duration_length = 1 SCENES + cooldown_length = 1 TURNS + + grouped_powers = list( + /datum/discipline_power/protean/earth_meld, + /datum/discipline_power/protean/mist_form + ) + + var/datum/action/cooldown/spell/shapeshift/gangrel/beast_form/gangy_form + +/datum/discipline_power/protean/shape_of_the_beast/activate() + . = ..() + if(gangy_form) + CRASH("[src] somehow already has a spell?") + owner.drop_all_held_items() + gangy_form = new(owner.mind) + gangy_form.Grant(owner) + gangy_form.Activate(owner) + RegisterSignal(owner, COMSIG_LIVING_RETURNED_FROM_SHAPESHIFT, PROC_REF(deactivate)) + +/datum/discipline_power/protean/shape_of_the_beast/deactivate() + UnregisterSignal(owner, COMSIG_LIVING_RETURNED_FROM_SHAPESHIFT) + . = ..() + gangy_form.Remove(owner) + QDEL_NULL(gangy_form) + owner.Stun(1 TURNS) + owner.do_jitter_animation(15) + +//MIST FORM +/datum/discipline_power/protean/mist_form + name = "Mist Form" + desc = "Dissipate your body and move as mist." + + level = 5 + + check_flags = DISC_CHECK_IMMOBILE | DISC_CHECK_CAPABLE + + violates_masquerade = TRUE + + cancelable = TRUE + duration_length = 1 SCENES + cooldown_length = 1 TURNS + + grouped_powers = list( + /datum/discipline_power/protean/earth_meld, + /datum/discipline_power/protean/shape_of_the_beast + ) + + var/datum/action/cooldown/spell/shapeshift/gangrel/mist/mist_form + +/datum/discipline_power/protean/mist_form/activate() + . = ..() + if(mist_form) + CRASH("[src] somehow already has a spell?") + owner.drop_all_held_items() + mist_form = new(owner.mind) + mist_form.Grant(owner) + mist_form.Activate(owner) + RegisterSignal(owner, COMSIG_LIVING_RETURNED_FROM_SHAPESHIFT, PROC_REF(deactivate)) + +/datum/discipline_power/protean/mist_form/deactivate() + UnregisterSignal(owner, COMSIG_LIVING_RETURNED_FROM_SHAPESHIFT) + . = ..() + mist_form.Remove(owner) + QDEL_NULL(mist_form) + owner.Stun(1 TURNS) + owner.do_jitter_animation(15) + +/datum/action/cooldown/spell/shapeshift/gangrel + abstract_type = /datum/action/cooldown/spell/shapeshift/gangrel + button_icon = 'modular_darkpack/modules/kindred_species/icons/vampire_clans.dmi' + button_icon_state = "gangrel" + background_icon = 'modular_darkpack/master_files/icons/mob/actions/backgrounds.dmi' + background_icon_state = "bg_discipline" + overlay_icon_state = null + spell_requirements = NONE + cooldown_time = 5 SECONDS + revert_on_death = TRUE + die_with_shapeshifted_form = FALSE diff --git a/modular_darkpack/modules/powers/code/discipline/quietus.dm b/modular_darkpack/modules/powers/code/discipline/quietus.dm deleted file mode 100644 index 5ba5870a4a2f..000000000000 --- a/modular_darkpack/modules/powers/code/discipline/quietus.dm +++ /dev/null @@ -1,215 +0,0 @@ -/datum/discipline/quietus - name = "Quietus" - desc = "Make a poison out of nowhere and forces all beings in range to mute, poison your touch, poison your weapon, poison your spit and make it acid. Violates Masquerade." - icon_state = "quietus" - clan_restricted = TRUE - power_type = /datum/discipline_power/quietus - -/datum/discipline_power/quietus - name = "Quietus power name" - desc = "Quietus power description" - - activate_sound = 'modular_darkpack/modules/deprecated/sounds/quietus.ogg' - -//SILENCE OF DEATH -/datum/discipline_power/quietus/silence_of_death - name = "Silence of Death" - desc = "Create an area of pure silence around you, confusing those within it." - - level = 1 - check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_LYING - - duration_length = 5 SECONDS - cooldown_length = 15 SECONDS - duration_override = TRUE - -/datum/discipline_power/quietus/silence_of_death/activate() - . = ..() - for(var/mob/living/carbon/human/H in viewers(7, owner)) - ADD_TRAIT(H, TRAIT_DEAF, "quietus") - if(H.get_confusion() < 15) - var/diff = 15 - H.get_confusion() - H.add_confusion(min(15, diff)) - addtimer(CALLBACK(src, PROC_REF(deactivate), H), duration_length) - -/datum/discipline_power/quietus/silence_of_death/deactivate(mob/living/carbon/human/deafened) - . = ..() - REMOVE_TRAIT(deafened, TRAIT_DEAF, "quietus") - -//SCORPION'S TOUCH -/obj/item/melee/touch_attack/quietus - name = "\improper poison touch" - desc = "This is kind of like when you rub your feet on a shag rug so you can zap your friends, only a lot less safe." - icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi' - catchphrase = null - on_use_sound = 'sound/magic/disintegrate.ogg' - icon_state = "quietus" - inhand_icon_state = "mansus" - -/obj/item/melee/touch_attack/quietus/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) - if(isliving(target)) - var/mob/living/L = target - L.adjustFireLoss(10) - L.AdjustKnockdown(3 SECONDS) - L.adjustStaminaLoss(50) - return ..() - -/datum/discipline_power/quietus/scorpions_touch - name = "Scorpion's Touch" - desc = "Create a powerful venom to apply to your enemies." - - level = 2 - check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_LYING | DISC_CHECK_FREE_HAND - - violates_masquerade = TRUE - - cooldown_length = 5 SECONDS - -/datum/discipline_power/quietus/scorpions_touch/activate() - . = ..() - owner.drop_all_held_items() - //this should probably be changed to a normal ranged attack - owner.put_in_active_hand(new /obj/item/melee/touch_attack/quietus(owner)) - -//DAGON'S CALL -/datum/discipline_power/quietus/dagons_call - name = "Dagon's Call" - desc = "Curse the last person you attacked to drown in their own blood." - - level = 3 - check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_LYING - - cooldown_length = 5 SECONDS - -/datum/discipline_power/quietus/dagons_call/activate() - . = ..() - if(owner.lastattacked) - if(isliving(owner.lastattacked)) - var/mob/living/L = owner.lastattacked - L.adjustStaminaLoss(80) - L.adjustFireLoss(10) - to_chat(owner, "You send your curse on [L], the last creature you attacked.") - else - to_chat(owner, "You don't seem to have last attacked soul earlier...") - return - else - to_chat(owner, "You don't seem to have last attacked soul earlier...") - return - -//BAAL'S CARESS -/datum/discipline_power/quietus/baals_caress - name = "Baal's Caress" - desc = "Transmute your vitae into a toxin that destroys all flesh it touches." - - level = 4 - check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_LYING | DISC_CHECK_FREE_HAND - vitae_cost = 3 - target_type = TARGET_OBJ - range = 1 - - violates_masquerade = TRUE - - cooldown_length = 15 SECONDS - -/datum/discipline_power/quietus/baals_caress/can_activate(atom/target, alert = FALSE) - . = ..() - - if (!istype(target, /obj/item/melee/vamp)) - if (alert) - to_chat(owner, span_warning("[src] can only be used on weapons!")) - return FALSE - var/obj/item/melee/vamp/weapon = target - - //ensure the target is a weapon with an edge to use the toxin with - if (!weapon.sharpness) - if (alert) - to_chat(owner, span_warning("[src] can only be used on bladed weapons!")) - return FALSE - - return . - -/datum/discipline_power/quietus/baals_caress/activate(obj/item/melee/vamp/target) - . = ..() - if(!target.quieted) - target.quieted = TRUE - target.armour_penetration = min(100, target.armour_penetration+30) - target.force += 20 - target.color = "#72b27c" - -//TASTE OF DEATH -/obj/projectile/quietus - name = "acid spit" - icon_state = "har4ok" - pass_flags = PASSTABLE - damage = 80 - damage_type = BURN - hitsound = 'sound/items/weapons/effects/searwall.ogg' - hitsound_wall = 'sound/items/weapons/effects/searwall.ogg' - ricochets_max = 0 - ricochet_chance = 0 - -/obj/item/gun/magic/quietus - name = "acid spit" - desc = "Spit poison on your targets." - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - icon_state = "har4ok" - item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL | NOBLUDGEON - flags_1 = NONE - w_class = WEIGHT_CLASS_HUGE - slot_flags = NONE - ammo_type = /obj/item/ammo_casing/magic/quietus - fire_sound = 'sound/effects/splat.ogg' - force = 0 - max_charges = 1 - fire_delay = 1 - throwforce = 0 //Just to be on the safe side - throw_range = 0 - throw_speed = 0 - item_flags = DROPDEL - -/obj/item/ammo_casing/magic/quietus - name = "acid spit" - desc = "A spit." - projectile_type = /obj/projectile/quietus - caliber = CALIBER_TENTACLE - firing_effect_type = null - item_flags = DROPDEL - -/obj/item/gun/magic/quietus/process_fire() - . = ..() - if(charges == 0) - qdel(src) -/* - playsound(target.loc, 'modular_darkpack/modules/deprecated/sounds/quietus.ogg', 50, TRUE) - target.Stun(5*level_casting) - if(level_casting >= 3) - if(target.bloodpool > 1) - var/transfered = max(1, target.bloodpool-3) - owner.adjust_blood_points(transfered) - target.adjust_blood_points(-transfered) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - H.remove_overlay(MUTATIONS_LAYER) - var/mutable_appearance/quietus_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "quietus", -MUTATIONS_LAYER) - H.overlays_standing[MUTATIONS_LAYER] = quietus_overlay - H.apply_overlay(MUTATIONS_LAYER) - spawn(5*level_casting) - H.remove_overlay(MUTATIONS_LAYER) -*/ - -/datum/discipline_power/quietus/taste_of_death - name = "Taste of Death" - desc = "Spit a glob of caustic blood at your enemies." - - level = 5 - check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_LYING | DISC_CHECK_FREE_HAND - - violates_masquerade = TRUE - - cooldown_length = 5 SECONDS - -/datum/discipline_power/quietus/taste_of_death/activate() - . = ..() - owner.drop_all_held_items() - //should be changed to a ranged attack targeting turfs - owner.put_in_active_hand(new /obj/item/gun/magic/quietus(owner)) diff --git a/modular_darkpack/modules/powers/code/discipline/quietus/components/baals_caress.dm b/modular_darkpack/modules/powers/code/discipline/quietus/components/baals_caress.dm new file mode 100644 index 000000000000..c9d8062362b8 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/quietus/components/baals_caress.dm @@ -0,0 +1,58 @@ +//The venom applied to a weapon from Quietus 4. +//It is described as changing the damage from a weapon to aggravated damage for each bloodpoint of vitae applied to the weapon as venom.alist +//It allows for a weapon to deal aggravated damage for each swing until charges = 0. +//We've added functionality for only the Banu Haqim whose poisoned the weapon to use it to prevent buffing entire armory's worth of weapons. + +/datum/component/baals_caress + var/datum/weakref/owner_ref + var/original_ap + var/original_damtype + var/original_color + var/charges + +/datum/component/baals_caress/Initialize(mob/owner, charges) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + var/obj/item/weapon = parent + + if(!weapon.sharpness) + return COMPONENT_INCOMPATIBLE + owner_ref = WEAKREF(owner) + src.charges = charges + original_ap = weapon.armour_penetration + original_damtype = weapon.damtype + original_color = weapon.color + weapon.armour_penetration = min(100, weapon.armour_penetration + 30) + weapon.damtype = AGGRAVATED + weapon.color = "#72b27c" + + return ..() + +/datum/component/baals_caress/RegisterWithParent() + RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(on_hit_living)) + RegisterSignal(parent, COMSIG_ITEM_PICKUP, PROC_REF(on_pickup)) + +/datum/component/baals_caress/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_PICKUP)) + + var/obj/item/weapon = parent + weapon.armour_penetration = original_ap + weapon.damtype = original_damtype + weapon.color = original_color + +/datum/component/baals_caress/proc/on_hit_living() + SIGNAL_HANDLER + charges-- + if(charges < 0) + qdel(src) + + +/datum/component/baals_caress/proc/on_pickup(obj/item/source, mob/living/user) + SIGNAL_HANDLER + var/mob/living/carbon/human/blade_owner = owner_ref?.resolve() + // hey banu haqim hound, poison all our blades before we go into battle! ARGHRGH MY HAND!!! + if(user != blade_owner) + to_chat(user, span_userdanger("The acidic ichor sears your hand!")) + user.apply_damage(20, BURN) + user.Paralyze(1 SECONDS) diff --git a/modular_darkpack/modules/powers/code/discipline/quietus/components/scorptions_touch.dm b/modular_darkpack/modules/powers/code/discipline/quietus/components/scorptions_touch.dm new file mode 100644 index 000000000000..549d1a1d7d64 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/quietus/components/scorptions_touch.dm @@ -0,0 +1,81 @@ +//SCORPION'S TOUCH +//The Scoprion's Touch venom from Quietus 2 +//It is designed to lower the target's stamina by poison_potency for poison_duration +//If the kindred reaches Stamina 0, they instantly enter torpor +//The target rolls does a contested roll to lower the poison_duration. if it reaches zero, they resist the poison. +//It is qdeleted after one strike, pass or fail. +/obj/item/melee/touch_attack/quietus + name = "\improper poison touch" + desc = "This is kind of like when you rub your feet on a shag rug so you can zap your friends, only a lot less safe." + icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi' + hitsound = 'sound/effects/magic/disintegrate.ogg' + icon_state = "quietus" + inhand_icon_state = "mansus" + +/obj/item/melee/touch_attack/quietus/Initialize(mapload, potency = 1, duration = 0) + . = ..() + AddComponent(/datum/component/scorpions_touch_poison, potency, duration) + +//COMPONENT FOR WEAPON +/datum/component/scorpions_touch_poison + var/poison_potency = 1 + var/poison_duration = 0 + +/datum/component/scorpions_touch_poison/Initialize(potency = 1, duration = 0) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + poison_potency = potency + poison_duration = duration + +/datum/component/scorpions_touch_poison/RegisterWithParent() + RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, PROC_REF(apply_poison)) + +/datum/component/scorpions_touch_poison/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_ITEM_AFTERATTACK) + +/datum/component/scorpions_touch_poison/proc/apply_poison(obj/item/source, atom/target, mob/user, list/modifiers, list/attack_modifiers) + SIGNAL_HANDLER + + if(!ishuman(target)) + return + + var/mob/living/carbon/human/victim = target + + // victim resists the posion with stamina + fortitude + var/resistance = SSroll.storyteller_roll(dice = (victim.st_get_stat(STAT_STAMINA)/* + victim.st_get_stat(STAT_FORTITUDE)*/), difficulty = 6, numerical = TRUE, mobs_to_show_output = victim) + + // each resistance success subtracts from the duration + var/effective_duration = max(0, poison_duration - resistance) + + if(effective_duration <= 0) + to_chat(victim, span_notice("You resist the poison!")) + to_chat(user, span_warning("[victim] resists your poison!")) + qdel(src) + return + + // stamina stat mod reduction goes here + victim.st_add_stat_mod(STAT_STAMINA, -poison_potency, "quietus") + addtimer(CALLBACK(src, PROC_REF(remove_poison), victim), poison_duration MINUTES) + + if(victim.st_get_stat(STAT_STAMINA) <= 0) + if(iskindred(victim)) + victim.torpor() + to_chat(victim, span_userdanger("Your body shuts down as the poison drains your very essence! You enter torpor!")) + to_chat(user, span_boldwarning("[victim] collapses into torpor!")) + else + // apply non transmittable disease to the mortal victim if they reach zero stamina + to_chat(victim, span_userdanger("You feel deathly ill as the poison ravages your body!")) + + victim.adjust_fire_loss(2 * poison_potency) + //victim.AdjustKnockdown(3 SECONDS) this is from the old code? + + to_chat(user, span_warning("Your venomous touch burns [victim]!")) + to_chat(victim, span_userdanger("You feel a burning poison sap your strength!")) + qdel(src) + +/datum/component/scorpions_touch_poison/proc/remove_poison(mob/living/carbon/human/victim) + if(!victim || QDELETED(victim)) + return + + victim.st_remove_stat_mod(STAT_STAMINA, "quietus") + to_chat(victim, span_notice("The poison's effects fade from your body.")) diff --git a/modular_darkpack/modules/powers/code/discipline/quietus/fields/silence_of_death_aoe.dm b/modular_darkpack/modules/powers/code/discipline/quietus/fields/silence_of_death_aoe.dm new file mode 100644 index 000000000000..5864674617d7 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/quietus/fields/silence_of_death_aoe.dm @@ -0,0 +1,72 @@ +//The AOE proximity monitor for Quietus 1 +//It is designed to apply the trait 'silenced' and 'mute' to all targets in its area + +/datum/proximity_monitor/advanced/silence_of_death + edge_is_a_field = TRUE + var/list/silenced_mobs + +/datum/proximity_monitor/advanced/silence_of_death/New(atom/_host, range, _ignore_if_not_on_turf = TRUE) + . = ..() + silenced_mobs = list() + if(ishuman(_host)) + ADD_TRAIT(_host, TRAIT_SILENCED, DISCIPLINE_TRAIT) + silenced_mobs |= _host + +/datum/proximity_monitor/advanced/silence_of_death/Destroy() + for(var/mob/living/carbon/human/H in silenced_mobs) + REMOVE_TRAIT(H, TRAIT_SILENCED, DISCIPLINE_TRAIT) + REMOVE_TRAIT(H, TRAIT_MUTE, DISCIPLINE_TRAIT) + silenced_mobs = null + return ..() + +/datum/proximity_monitor/advanced/silence_of_death/on_entered(turf/source, atom/movable/entered, turf/old_loc) + . = ..() + if(QDELETED(src)) + return + if(!isliving(entered)) + return + if(entered in silenced_mobs) + return + + var/mob/living/carbon/human/H = entered + ADD_TRAIT(H, TRAIT_SILENCED, DISCIPLINE_TRAIT) + + if(H != host) + ADD_TRAIT(H, TRAIT_MUTE, DISCIPLINE_TRAIT) + + H.adjust_confusion_up_to(15 SECONDS, 15 SECONDS) + + silenced_mobs |= H + +/datum/proximity_monitor/advanced/silence_of_death/on_uncrossed(turf/source, atom/movable/gone, direction) + . = ..() + if(QDELETED(src)) + return + if(!isliving(gone)) + return + if(!(gone in silenced_mobs)) + return + if(gone == host) + return + + var/mob/living/carbon/human/H = gone + REMOVE_TRAIT(H, TRAIT_SILENCED, DISCIPLINE_TRAIT) + REMOVE_TRAIT(H, TRAIT_MUTE, DISCIPLINE_TRAIT) + silenced_mobs -= H + +/datum/proximity_monitor/advanced/silence_of_death/on_z_change() + if(QDELETED(src)) + return + for(var/mob/living/carbon/human/H in silenced_mobs) + REMOVE_TRAIT(H, TRAIT_SILENCED, DISCIPLINE_TRAIT) + REMOVE_TRAIT(H, TRAIT_MUTE, DISCIPLINE_TRAIT) + silenced_mobs.Cut() + +/datum/proximity_monitor/advanced/silence_of_death/cleanup_field_turf(turf/target) + if(QDELETED(src)) + return + for(var/mob/living/carbon/human/H in target.contents) + if((H in silenced_mobs) && H != host) + REMOVE_TRAIT(H, TRAIT_SILENCED, DISCIPLINE_TRAIT) + REMOVE_TRAIT(H, TRAIT_MUTE, DISCIPLINE_TRAIT) + silenced_mobs -= H diff --git a/modular_darkpack/modules/powers/code/discipline/quietus/quietus.dm b/modular_darkpack/modules/powers/code/discipline/quietus/quietus.dm new file mode 100644 index 000000000000..890d3e897e55 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/quietus/quietus.dm @@ -0,0 +1,353 @@ +/datum/discipline/quietus + name = "Quietus" + desc = "The signature discipline of the Banu Haqim, Quietus allows the user to create poison and assassinate their targets quietly, maipulating their blood. Violates Masquerade." + icon_state = "quietus" + clan_restricted = TRUE + power_type = /datum/discipline_power/quietus + +/datum/discipline_power/quietus + name = "Quietus power name" + desc = "Quietus power description" + + activate_sound = 'modular_darkpack/modules/powers/sounds/quietus.ogg' // REPLACE THIS PRICE IS RIGHT ASS SOUND!!! + +//SILENCE OF DEATH +/datum/discipline_power/quietus/silence_of_death + name = "Silence of Death" + desc = "Create an area of pure silence around you, deafening the screams of your targets. This mystical silence radiates from your body, muting all noise within a 7 tile radius." + + level = 1 + check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_LYING + vitae_cost = 1 + cancelable = TRUE + + duration_length = 1 SCENES + cooldown_length = 2 SCENES + var/datum/proximity_monitor/advanced/silence_of_death/silence_field + +/datum/discipline_power/quietus/silence_of_death/activate() + . = ..() + silence_field = new(owner, 7, FALSE) + +/datum/discipline_power/quietus/silence_of_death/deactivate(atom/target, direct = FALSE) + . = ..() + QDEL_NULL(silence_field) + +//SCORPIONS TOUCH +/datum/discipline_power/quietus/scorpions_touch + name = "Scorpion's Touch" + desc = "Create a powerful venom to destroy your target's Stamina." + + level = 2 + check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_LYING | DISC_CHECK_FREE_HAND + vitae_cost = 0 + violates_masquerade = TRUE + cooldown_length = 1 MINUTES + var/blood_converted + var/debuff_duration + +/datum/discipline_power/quietus/scorpions_touch/pre_activation_checks(atom/target) + . = ..() + var/success_count = SSroll.storyteller_roll(dice = owner.st_get_stat(STAT_PERMANENT_WILLPOWER), difficulty = 6, mobs_to_show_output = owner, alert_atom = owner, numerical = TRUE) + + if(success_count <= 0) + to_chat(owner, span_warning("Your blood fails to transform into poison!")) + return FALSE + + switch(success_count) + if(1) + debuff_duration = 5 TURNS + if(2) + debuff_duration = 10 TURNS + if(3) + debuff_duration = 20 TURNS + if(4) + debuff_duration = 5 MINUTES + if(5 to INFINITY) + debuff_duration = 2 SCENES + + //the book says they can use however many dots in stamina they have to convert bloodpoints into poison just FYI + //so if this were to be lore accurate max_conversion would be owner.st_get_stat(STAT_STAMINA), but it also says 0 stamina = instant torpor so... + var/max_conversion = 2 // 2 bps max for the stat mod reduction since instantly torporing people is bad + var/list/bp_options = list() + for(var/i in 1 to min(max_conversion, owner.bloodpool)) + bp_options += i + + blood_converted = tgui_input_list(owner, "How many blood points will you use to create this toxin?", "Scorpion's Touch", bp_options) + if(!blood_converted) + return FALSE + + owner.adjust_blood_pool(-blood_converted) + + return TRUE + +/datum/discipline_power/quietus/scorpions_touch/activate() + . = ..() + var/obj/item/held_weapon = owner.get_active_held_item() + if(held_weapon && isitem(held_weapon)) + if(held_weapon.GetComponent(/datum/component/scorpions_touch_poison)) + to_chat(owner, span_warning("[held_weapon] is already poisoned!")) + return + + held_weapon.AddComponent(/datum/component/scorpions_touch_poison, blood_converted, debuff_duration) + to_chat(owner, span_notice("You coat [held_weapon] with your venomous blood!")) + else + owner.drop_all_held_items() + //Banu Haqim can 'spit' this venom too - perhaps throw the touch attack item...? + var/obj/item/melee/touch_attack/quietus/touch = new(owner.loc, blood_converted, debuff_duration) + owner.put_in_active_hand(touch) + +//DAGON'S CALL +/datum/discipline_power/quietus/dagons_call + name = "Dagon's Call" + desc = "Curse anyone you've touched in the last hour to drown in their own blood." + + level = 3 + check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_LYING + vitae_cost = 0 + //willpower_cost = 1 + cooldown_length = 5 SECONDS + + var/list/marked_targets = list() + +/datum/discipline_power/quietus/dagons_call/post_gain() + . = ..() + RegisterSignal(owner, COMSIG_HUMAN_PUNCHED, PROC_REF(on_punch)) + RegisterSignal(owner, COMSIG_HUMAN_GOT_PUNCHED, PROC_REF(on_punch)) + RegisterSignal(owner, COMSIG_CARBON_HELP_ACT, PROC_REF(on_touch)) + RegisterSignal(owner, COMSIG_CARBON_HELPED, PROC_REF(on_touch)) + +/datum/discipline_power/quietus/dagons_call/Destroy() + UnregisterSignal(owner, list(COMSIG_HUMAN_PUNCHED, COMSIG_CARBON_HELP_ACT, COMSIG_CARBON_HELPED)) + marked_targets.Cut() + return ..() + +/datum/discipline_power/quietus/dagons_call/proc/on_punch(datum/source, mob/living/carbon/human/victim) + SIGNAL_HANDLER + mark_target(victim) + +/datum/discipline_power/quietus/dagons_call/proc/on_touch(datum/source, mob/living/carbon/human/target) + SIGNAL_HANDLER + mark_target(target) + +/datum/discipline_power/quietus/dagons_call/proc/mark_target(mob/living/carbon/human/target) + if(!target || !ishuman(target) || target == owner) + return + + var/datum/weakref/target_ref = WEAKREF(target) + marked_targets[target_ref] = world.time + + to_chat(owner, span_notice("You mark [target] with your touch.")) + +/datum/discipline_power/quietus/dagons_call/proc/get_valid_targets() + var/list/valid = list() + var/current_time = world.time + + for(var/datum/weakref/target_ref as anything in marked_targets) + var/mark_time = marked_targets[target_ref] + + if(current_time - mark_time > 20 MINUTES) + marked_targets -= target_ref + continue + + var/mob/living/carbon/human/target = target_ref.resolve() + if(!target || QDELETED(target)) + marked_targets -= target_ref + continue + + valid[target] = mark_time + + return valid + +/datum/discipline_power/quietus/dagons_call/pre_activation_checks(atom/target) + . = ..() + + var/list/valid_targets = get_valid_targets() + + if(!length(valid_targets)) + to_chat(owner, span_warning("You haven't marked anyone with your touch yet!")) + return FALSE + + return TRUE + +/datum/discipline_power/quietus/dagons_call/activate() + . = ..() + + var/list/valid_targets = get_valid_targets() + var/list/target_names = list() + + for(var/mob/living/carbon/human/target as anything in valid_targets) + target_names[target.name] = target + + var/chosen_name = tgui_input_list(owner, "Choose your target:", "Dagon's Call", target_names) + if(!chosen_name) + return + + var/mob/living/carbon/human/victim = target_names[chosen_name] + strike_victim(victim) + +/datum/discipline_power/quietus/dagons_call/proc/strike_victim(mob/living/carbon/human/victim) + var/attacker_stamina = owner.st_get_stat(STAT_STAMINA) + var/victim_stamina = victim.st_get_stat(STAT_STAMINA) + var/victim_willpower = victim.st_get_stat(STAT_PERMANENT_WILLPOWER) + + var/attacker_successes = SSroll.storyteller_roll(attacker_stamina, victim_willpower, numerical = TRUE, mobs_to_show_output = owner) + + var/victim_successes = SSroll.storyteller_roll(victim_stamina, victim_willpower, numerical = TRUE, mobs_to_show_output = victim) + + var/net_successes = attacker_successes - victim_successes + + if(net_successes <= 0) + to_chat(owner, span_warning("[victim] resists Dargon's Call.")) + return + + victim.adjust_fire_loss(10 * net_successes) + + to_chat(owner, span_boldwarning("You invoke Dagon's Call on [victim], choking them with their own blood!")) + to_chat(victim, span_userdanger("Your blood vessels burst as you drown in your own blood!")) + + if(victim.stat != DEAD) + var/continue_call = tgui_alert(owner, "Continue Dagon's Call for 1 additional Willpower?", "Dagon's Call", list("Yes", "No")) + if(continue_call == "Yes" && owner.st_add_stat_mod(STAT_TEMPORARY_WILLPOWER, -1, "Dagon's Call")) //requires stat preferences pr + strike_victim(victim) + +//BAAL'S CARESS +/datum/discipline_power/quietus/baals_caress + name = "Baal's Caress" + desc = "Transmute your vitae into a toxin that destroys all flesh it touches." + + level = 4 + check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_LYING | DISC_CHECK_FREE_HAND + vitae_cost = 0 + target_type = TARGET_OBJ + range = 1 + + violates_masquerade = TRUE + + cooldown_length = 15 SECONDS + +/datum/discipline_power/quietus/baals_caress/can_activate(atom/target) + . = ..() + if(!isitem(target)) + to_chat(owner, span_warning("[src] can only be used on weapons!")) + return FALSE + + var/obj/item/weapon = target + + if(!weapon.sharpness) + to_chat(owner, span_warning("[src] can only be used on bladed weapons!")) + return FALSE + + if(weapon.GetComponent(/datum/component/baals_caress)) + to_chat(owner, span_warning("This weapon is already poisoned!")) + return FALSE + +/datum/discipline_power/quietus/baals_caress/activate(obj/item/melee/vamp/target) + . = ..() + + if(!ishuman(owner)) + return + + var/mob/living/carbon/human/user = owner + var/max_layers = user.bloodpool + + if(max_layers <= 0) + to_chat(owner, span_warning("You don't have any blood to coat the weapon with!")) + return + + var/layers = tgui_input_number(owner, "How many blood points do you want to use?", "Baal's Caress", 1, max_layers, 1) + if(!layers) + return + user.bloodpool -= layers + target.AddComponent(/datum/component/baals_caress, owner, layers) + to_chat(owner, span_notice("You imbue [target] with [layers] layer\s of your toxic vitae!")) + +//TASTE OF DEATH +/obj/projectile/quietus + name = "acid spit" + icon_state = "toxin" + pass_flags = PASSTABLE + damage = 60 + damage_type = BURN + hitsound = 'sound/items/weapons/effects/searwall.ogg' + hitsound_wall = 'sound/items/weapons/effects/searwall.ogg' + ricochets_max = 0 + ricochet_chance = 0 + +/obj/item/gun/magic/quietus + name = "acid spit" + desc = "Spit poison on your targets." + icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' + icon_state = "har4ok" + item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL | NOBLUDGEON + flags_1 = NONE + w_class = WEIGHT_CLASS_HUGE + slot_flags = NONE + ammo_type = /obj/item/ammo_casing/magic/quietus + fire_sound = 'sound/effects/splat.ogg' + force = 0 + max_charges = 1 + fire_delay = 1 + throwforce = 0 //Just to be on the safe side + throw_range = 0 + throw_speed = 0 + item_flags = DROPDEL + +/obj/item/ammo_casing/magic/quietus + name = "acid spit" + desc = "A spit." + projectile_type = /obj/projectile/quietus + caliber = CALIBER_TENTACLE + firing_effect_type = null + item_flags = DROPDEL + +/obj/item/gun/magic/quietus/process_fire() + . = ..() + if(charges == 0) + qdel(src) +/* + playsound(target.loc, 'modular_darkpack/modules/deprecated/sounds/quietus.ogg', 50, TRUE) + target.Stun(5*level_casting) + if(level_casting >= 3) + if(target.bloodpool > 1) + var/transfered = max(1, target.bloodpool-3) + owner.adjust_blood_points(transfered) + target.adjust_blood_points(-transfered) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + H.remove_overlay(MUTATIONS_LAYER) + var/mutable_appearance/quietus_overlay = mutable_appearance('modular_darkpack/modules/deprecated/icons/icons.dmi', "quietus", -MUTATIONS_LAYER) + H.overlays_standing[MUTATIONS_LAYER] = quietus_overlay + H.apply_overlay(MUTATIONS_LAYER) + spawn(5*level_casting) + H.remove_overlay(MUTATIONS_LAYER) +*/ + +/datum/discipline_power/quietus/taste_of_death + name = "Taste of Death" + desc = "Spit a glob of caustic blood at your enemies." + + level = 5 + check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_LYING | DISC_CHECK_FREE_HAND + + violates_masquerade = TRUE + + cooldown_length = 8 SECONDS + +/datum/discipline_power/quietus/taste_of_death/can_activate() + range = 3 + owner.st_get_stat(STAT_STRENGTH) + return ..() + +/datum/discipline_power/quietus/taste_of_death/pre_activation_checks(atom/target) + . = ..() + var/roll = SSroll.storyteller_roll(owner.st_get_stat(STAT_STAMINA) + owner.st_get_stat(STAT_ATHLETICS), 6, owner, numerical = FALSE) + if(roll == ROLL_SUCCESS) + return TRUE + else + return FALSE + +/datum/discipline_power/quietus/taste_of_death/activate() + . = ..() + owner.drop_all_held_items() + //should be changed to a ranged attack targeting turfs + owner.put_in_active_hand(new /obj/item/gun/magic/quietus(owner)) diff --git a/modular_darkpack/modules/powers/code/discipline/serpentis.dm b/modular_darkpack/modules/powers/code/discipline/serpentis.dm index df26842a5ce1..7540a0fc8c2e 100644 --- a/modular_darkpack/modules/powers/code/discipline/serpentis.dm +++ b/modular_darkpack/modules/powers/code/discipline/serpentis.dm @@ -92,8 +92,8 @@ /datum/discipline_power/serpentis/the_tongue_of_the_asp/activate(mob/living/target) . = ..() - target.bloodpool = max(target.bloodpool - 2, 0) - owner.bloodpool = min(owner.bloodpool + 2, owner.maxbloodpool) + target.adjust_blood_pool(-2) + owner.adjust_blood_pool(2) var/obj/item/ammo_casing/magic/tentacle/casing = new (get_turf(owner)) casing.fire_casing(target, owner, null, null, null, ran_zone(), 0, owner) qdel(casing) @@ -131,7 +131,7 @@ duration_length = 15 SECONDS cooldown_length = 30 SECONDS - var/obj/effect/proc_holder/spell/targeted/shapeshift/cobra/BC + var/datum/action/cooldown/spell/shapeshift/cobra/BC /datum/discipline_power/serpentis/the_form_of_the_cobra/activate() . = ..() @@ -145,14 +145,14 @@ owner.Stun(1.5 SECONDS) owner.do_jitter_animation(3 SECONDS) -/obj/effect/proc_holder/spell/targeted/shapeshift/cobra +/datum/action/cooldown/spell/shapeshift/cobra name = "Cobra" desc = "Take on the shape a beast." charge_max = 15 SECONDS cooldown_min = 15 SECONDS revert_on_death = TRUE die_with_shapeshifted_form = FALSE - shapeshift_type = /mob/living/simple_animal/hostile/cobra + possible_shapes = list(/mob/living/simple_animal/hostile/cobra) /mob/living/simple_animal/hostile/cobra name = "Cobra Form" @@ -200,7 +200,7 @@ owner.dna.species.inherent_traits |= TRAIT_STUNIMMUNE owner.dna.species.inherent_traits |= TRAIT_SLEEPIMMUNE owner.dna.species.inherent_traits |= TRAIT_NOSOFTCRIT - owner.stakeimmune = TRUE + ADD_TRAIT(owner, TRAIT_STAKE_IMMUNE, DISCIPLINE_TRAIT) urn = new(owner.loc) urn.own = owner var/obj/item/organ/heart/heart = owner.getorganslot(ORGAN_SLOT_HEART) @@ -210,7 +210,7 @@ owner.dna.species.inherent_traits -= TRAIT_STUNIMMUNE owner.dna.species.inherent_traits -= TRAIT_SLEEPIMMUNE owner.dna.species.inherent_traits -= TRAIT_NOSOFTCRIT - owner.stakeimmune = FALSE + REMOVE_TRAIT(owner, TRAIT_STAKE_IMMUNE, DISCIPLINE_TRAIT) for(var/obj/item/organ/heart/heart in urn) heart.forceMove(owner) heart.Insert(owner) diff --git a/modular_darkpack/modules/powers/code/discipline/temporis.dm b/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm similarity index 80% rename from modular_darkpack/modules/powers/code/discipline/temporis.dm rename to modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm index 78b650227952..839b6e4bb325 100644 --- a/modular_darkpack/modules/powers/code/discipline/temporis.dm +++ b/modular_darkpack/modules/powers/code/discipline/temporis/temporis.dm @@ -9,7 +9,11 @@ name = "Temporis power name" desc = "Temporis power description" - activate_sound = 'modular_darkpack/modules/deprecated/sounds/temporis.ogg' + activate_sound = 'modular_darkpack/modules/powers/sounds/temporis/temporis.ogg' + +/datum/discipline_power/temporis/activate() + . = ..() + ADD_TRAIT(owner, TRAIT_TIMEWARPER, DISCIPLINE_TRAIT) /datum/discipline_power/temporis/proc/celerity_explode(datum/source, datum/discipline_power/power, atom/target) SIGNAL_HANDLER @@ -34,7 +38,27 @@ /datum/discipline_power/temporis/hourglass_of_the_mind/activate() . = ..() - to_chat(owner, "<b>[station_time_timestamp("hh:mm")]</b>") + to_chat(owner, "<b>[station_time_timestamp("hh:mm:ss")]</b>") + + // Check range for targets with that have warped time this round and display them, if any exist + var/list/targets = list() + for(var/mob/living/carbon/human/target in view(range, owner)) + if(target == owner) + continue + if(HAS_TRAIT(target, TRAIT_TIMEWARPER)) + targets += target + if(targets.len) + var/target_list = "" + for(var/i = 1 to targets.len) + var/mob/living/carbon/human/target = targets[i] + target_list += target.name + if(i < targets.len - 1) + target_list += ", " + else if(i == targets.len - 1) + target_list += " and " + to_chat(owner, span_notice("[english_list(targets)] [targets.len == 1 ? "has" : "have"] temporal distortions around [targets.len == 1 ? "themself" : "themselves"].")) + else + to_chat(owner, span_notice("There are no temporal distortions nearby.")) //RECURRING CONTEMPLATION /datum/discipline_power/temporis/recurring_contemplation @@ -118,26 +142,11 @@ /datum/discipline_power/temporis/patience_of_the_norns/proc/temporis_visual(datum/discipline_power/temporis/source, atom/newloc, dir) SIGNAL_HANDLER - spawn() - var/obj/effect/temporis/temporis_visual = new(owner.loc) - temporis_visual.name = owner.name - temporis_visual.appearance = owner.appearance - temporis_visual.dir = owner.dir - animate(temporis_visual, pixel_x = rand(-32,32), pixel_y = rand(-32,32), alpha = 255, time = 1 SECONDS) - if(owner.CheckEyewitness(owner, owner, 7, FALSE)) - owner.adjust_masquerade(-1) - -/obj/effect/temporis - name = "Za Warudo" - desc = "..." - anchored = TRUE - -/obj/effect/temporis/Initialize(mapload) - . = ..() - spawn(0.5 SECONDS) - qdel(src) + new /obj/effect/temporis/patience_of_the_norns(owner.loc, owner) -//CLOTHO'S GIFT + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) + +//CLOTHOS GIFT /datum/discipline_power/temporis/clothos_gift name = "Clotho's Gift" desc = "Accelerate yourself through time and magnify your speed." @@ -169,14 +178,9 @@ /datum/discipline_power/temporis/clothos_gift/proc/temporis_visual(datum/discipline_power/temporis/source, atom/newloc, dir) SIGNAL_HANDLER - spawn() - var/obj/effect/temporis/temporis_visual = new(owner.loc) - temporis_visual.name = owner.name - temporis_visual.appearance = owner.appearance - temporis_visual.dir = owner.dir - animate(temporis_visual, pixel_x = rand(-32,32), pixel_y = rand(-32,32), alpha = 155, time = 0.5 SECONDS) - if(owner.CheckEyewitness(owner, owner, 7, FALSE)) - owner.adjust_masquerade(-1) + new /obj/effect/temporis/clothos_gift(owner.loc, owner) + + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) /datum/movespeed_modifier/temporis5 multiplicative_slowdown = -2.5 diff --git a/modular_darkpack/modules/powers/code/discipline/temporis/temporis_effects.dm b/modular_darkpack/modules/powers/code/discipline/temporis/temporis_effects.dm new file mode 100644 index 000000000000..d1be6f5b3570 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/temporis/temporis_effects.dm @@ -0,0 +1,24 @@ +/obj/effect/temporis + name = "Za Warudo" + desc = "..." + anchored = TRUE + var/effect_alpha = 255 + var/effect_fadeout = 1 SECONDS + +/obj/effect/temporis/Initialize(mapload, mob/living/creator) + . = ..() + + name = creator?.name + appearance = creator?.appearance + dir = creator?.dir + + animate(src, pixel_x = rand(-32,32), pixel_y = rand(-32,32), alpha = effect_alpha, time = effect_fadeout) + + // Delete this effect after half a second + QDEL_IN(src, effect_fadeout) + +/obj/effect/temporis/patience_of_the_norns + +/obj/effect/temporis/clothos_gift + effect_alpha = 155 + effect_fadeout = 0.5 SECONDS diff --git a/modular_darkpack/modules/powers/code/discipline/thaumaturgy.dm b/modular_darkpack/modules/powers/code/discipline/thaumaturgy.dm deleted file mode 100644 index fa3e5ab0e540..000000000000 --- a/modular_darkpack/modules/powers/code/discipline/thaumaturgy.dm +++ /dev/null @@ -1,348 +0,0 @@ -/datum/discipline/thaumaturgy - name = "Thaumaturgy" - desc = "Opens the secrets of blood magic and how you use it, allows to steal other's blood. Violates Masquerade." - icon_state = "thaumaturgy" - clan_restricted = TRUE - power_type = /datum/discipline_power/thaumaturgy - -/datum/discipline/thaumaturgy/post_gain() - . = ..() - owner.faction |= VAMPIRE_CLAN_TREMERE - if(level >= 1) - var/datum/action/thaumaturgy/thaumaturgy = new() - thaumaturgy.Grant(owner) - thaumaturgy.level = level - owner.thaumaturgy_knowledge = TRUE - if(level >= 3) - var/datum/action/bloodshield/bloodshield = new() - bloodshield.Grant(owner) - -/datum/discipline_power/thaumaturgy - name = "Thaumaturgy power name" - desc = "Thaumaturgy power description" - - check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_FREE_HAND - target_type = TARGET_LIVING - range = 7 - - activate_sound = 'modular_darkpack/modules/deprecated/sounds/thaum.ogg' - aggravating = TRUE - hostile = TRUE - violates_masquerade = TRUE - - cooldown_length = 5 SECONDS - multi_activate = TRUE - -//A TASTE FOR BLOOD -/obj/effect/projectile/tracer/thaumaturgy - name = "blood beam" - icon_state = "cult" - -/obj/effect/projectile/muzzle/thaumaturgy - name = "blood beam" - icon_state = "muzzle_cult" - -/obj/effect/projectile/impact/thaumaturgy - name = "blood beam" - icon_state = "impact_cult" - -/obj/projectile/thaumaturgy - name = "blood beam" - icon_state = "thaumaturgy" - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - damage = 5 - damage_type = BURN - hitsound = 'modular_darkpack/modules/deprecated/sounds/drinkblood1.ogg' - hitsound_wall = 'sound/items/weapons/effects/searwall.ogg' - flag = LASER - light_system = OVERLAY_LIGHT - light_range = 1 - light_power = 1 - light_color = COLOR_SOFT_RED - ricochets_max = 0 - ricochet_chance = 0 - tracer_type = /obj/effect/projectile/tracer/thaumaturgy - muzzle_type = /obj/effect/projectile/muzzle/thaumaturgy - impact_type = /obj/effect/projectile/impact/thaumaturgy - var/level = 1 - -/obj/projectile/thaumaturgy/on_hit(atom/target, blocked = FALSE, pierce_hit) - if(ishuman(firer)) - var/mob/living/carbon/human/VH = firer - if(isliving(target)) - var/mob/living/VL = target - if(isgarou(VL)) - if(VL.bloodpool >= 1 && VL.stat != DEAD) - var/sucked = min(VL.bloodpool, 2) - VL.bloodpool = max(VL.bloodpool - sucked, 0) - VL.apply_damage(45, BURN) - VL.visible_message(span_danger("[target]'s wounds spray boiling hot blood!"), span_userdanger("Your blood boils!")) - VL.add_splatter_floor(get_turf(target)) - VL.add_splatter_floor(get_turf(get_step(target, target.dir))) - if(!iskindred(target)) - if(VL.bloodpool >= 1 && VL.stat != DEAD) - var/sucked = min(VL.bloodpool, 2) - VL.bloodpool = max(VL.bloodpool - sucked, 0) - if(ishuman(VL)) - if(VL.bloodpool >= 1 && VL.stat != DEAD) - var/mob/living/carbon/human/VHL = VL - VHL.bloodpool = max(VHL.bloodpool - 1, 0) - else - if(VL.bloodpool >= 1) - var/sucked = min(VL.bloodpool, level) - VL.bloodpool = max(VL.bloodpool - sucked, 0) - VH.bloodpool = min(VH.bloodpool + sucked, VH.maxbloodpool) - -/datum/discipline_power/thaumaturgy/a_taste_for_blood - name = "A Taste for Blood" - desc = "Touch the blood of a subject and gain information about their bloodline." - - level = 1 - - grouped_powers = list( - /datum/discipline_power/thaumaturgy/blood_rage, - /datum/discipline_power/thaumaturgy/blood_of_potency, - /datum/discipline_power/thaumaturgy/theft_of_vitae, - /datum/discipline_power/thaumaturgy/cauldron_of_blood - ) - -/datum/discipline_power/thaumaturgy/a_taste_for_blood/activate(mob/living/target) - . = ..() - var/turf/start = get_turf(owner) - var/obj/projectile/thaumaturgy/H = new(start) - H.firer = owner - H.preparePixelProjectile(target, start) - H.fire(direct_target = target) - -//BLOOD RAGE -/datum/discipline_power/thaumaturgy/blood_rage - name = "Blood Rage" - desc = "Impose your will on another Kindred's vitae and force them to spend it as you wish." - - level = 2 - - grouped_powers = list( - /datum/discipline_power/thaumaturgy/a_taste_for_blood, - /datum/discipline_power/thaumaturgy/blood_of_potency, - /datum/discipline_power/thaumaturgy/theft_of_vitae, - /datum/discipline_power/thaumaturgy/cauldron_of_blood - ) - -/datum/discipline_power/thaumaturgy/blood_rage/activate(mob/living/target) - . = ..() - var/turf/start = get_turf(owner) - var/obj/projectile/thaumaturgy/H = new(start) - H.firer = owner - H.damage = 10 + owner.thaum_damage_plus - H.preparePixelProjectile(target, start) - H.level = 2 - H.fire(direct_target = target) - -//BLOOD OF POTENCY -/datum/discipline_power/thaumaturgy/blood_of_potency - name = "Blood of Potency" - desc = "Supernaturally thicken your vitae as if you were of a lower Generation." - - level = 3 - - grouped_powers = list( - /datum/discipline_power/thaumaturgy/a_taste_for_blood, - /datum/discipline_power/thaumaturgy/blood_rage, - /datum/discipline_power/thaumaturgy/theft_of_vitae, - /datum/discipline_power/thaumaturgy/cauldron_of_blood - ) - -/datum/discipline_power/thaumaturgy/blood_of_potency/activate(mob/living/target) - . = ..() - var/turf/start = get_turf(owner) - var/obj/projectile/thaumaturgy/H = new(start) - H.firer = owner - H.damage = 15 + owner.thaum_damage_plus - H.preparePixelProjectile(target, start) - H.level = 2 - H.fire(direct_target = target) - -//THEFT OF VITAE -/mob/living/proc/tremere_gib() - Stun(5 SECONDS) - new /obj/effect/temp_visual/tremere(loc, "gib") - animate(src, pixel_y = 16, color = "#ff0000", time = 5 SECONDS, loop = 1) - - spawn(5 SECONDS) - if(stat != DEAD) - death() - var/list/items = list() - items |= get_equipped_items(TRUE) - for(var/obj/item/I in items) - dropItemToGround(I) - drop_all_held_items() - spawn_gibs() - spawn_gibs() - spawn_gibs() - qdel(src) - -/datum/discipline_power/thaumaturgy/theft_of_vitae - name = "Theft of Vitae" - desc = "Draw your target's blood to you, supernaturally absorbing it as it flies." - - level = 4 - - effect_sound = 'modular_darkpack/modules/deprecated/sounds/vomit.ogg' - - grouped_powers = list( - /datum/discipline_power/thaumaturgy/a_taste_for_blood, - /datum/discipline_power/thaumaturgy/blood_rage, - /datum/discipline_power/thaumaturgy/blood_of_potency, - /datum/discipline_power/thaumaturgy/cauldron_of_blood - ) - -/datum/discipline_power/thaumaturgy/theft_of_vitae/activate(mob/living/target) - . = ..() - if(iscarbon(target)) - target.Stun(2.5 SECONDS) - target.visible_message(span_danger("[target] throws up!"), span_userdanger("You throw up!")) - target.add_splatter_floor(get_turf(target)) - target.add_splatter_floor(get_turf(get_step(target, target.dir))) - else - owner.bloodpool = min(owner.bloodpool + target.bloodpool, owner.maxbloodpool) - if(!istype(target, /mob/living/simple_animal/hostile/megafauna)) - target.tremere_gib() - -//CAULDRON OF BLOOD -/datum/discipline_power/thaumaturgy/cauldron_of_blood - name = "Cauldron of Blood" - desc = "Boil your target's blood in their body, killing almost anyone." - - level = 5 - - effect_sound = 'modular_darkpack/modules/deprecated/sounds/vomit.ogg' - - grouped_powers = list( - /datum/discipline_power/thaumaturgy/a_taste_for_blood, - /datum/discipline_power/thaumaturgy/blood_rage, - /datum/discipline_power/thaumaturgy/blood_of_potency, - /datum/discipline_power/thaumaturgy/theft_of_vitae - ) - -/datum/discipline_power/thaumaturgy/cauldron_of_blood/activate(mob/living/target) - . = ..() - if(iscarbon(target)) - target.Stun(2.5 SECONDS) - target.visible_message(span_danger("[target] throws up!"), span_userdanger("You throw up!")) - target.add_splatter_floor(get_turf(target)) - target.add_splatter_floor(get_turf(get_step(target, target.dir))) - else - owner.bloodpool = min(owner.bloodpool + target.bloodpool, owner.maxbloodpool) - if(!istype(target, /mob/living/simple_animal/hostile/megafauna)) - target.tremere_gib() - -//MISCELLANEOUS BULLSHIT -/datum/action/thaumaturgy - name = "Thaumaturgy" - desc = "Blood magic rune drawing." - button_icon_state = "thaumaturgy" - check_flags = AB_CHECK_HANDS_BLOCKED | AB_CHECK_IMMOBILE | AB_CHECK_LYING | AB_CHECK_CONSCIOUS - vampiric = TRUE - var/drawing = FALSE - var/level = 1 - -/datum/action/thaumaturgy/Trigger() - . = ..() - var/mob/living/carbon/human/H = owner - if(H.bloodpool < 2) - to_chat(H, span_warning("You need more <b>BLOOD</b> to do that!")) - return - if(drawing) - return - - if(istype(H.get_active_held_item(), /obj/item/arcane_tome)) - var/list/shit = list() - for(var/i in subtypesof(/obj/ritualrune)) - var/obj/ritualrune/R = new i(owner) - if(R.thaumlevel <= level) - shit += i - qdel(R) - var/ritual = input(owner, "Choose rune to draw:", "Thaumaturgy") as null|anything in shit - if(ritual) - drawing = TRUE - if(do_after(H, 3 SECONDS * max(1, 5 - H.mentality), H)) - drawing = FALSE - new ritual(H.loc) - H.bloodpool = max(H.bloodpool - 2, 0) - if(H.CheckEyewitness(H, H, 7, FALSE)) - H.adjust_masquerade(-1) - else - drawing = FALSE - else - var/list/shit = list() - for(var/i in subtypesof(/obj/ritualrune)) - var/obj/ritualrune/R = new i(owner) - if(R.thaumlevel <= level) - shit += i - qdel(R) - var/ritual = input(owner, "Choose rune to draw (You need an Arcane Tome to reduce random):", "Thaumaturgy") as null|anything in list("???") - if(ritual) - drawing = TRUE - if(do_after(H, 3 SECONDS * max(1, 5 - H.mentality), H)) - drawing = FALSE - var/rune = pick(shit) - new rune(H.loc) - H.bloodpool = max(H.bloodpool - 2, 0) - if(H.CheckEyewitness(H, H, 7, FALSE)) - H.adjust_masquerade(-1) - else - drawing = FALSE - -/datum/action/bloodshield - name = "Bloodshield" - desc = "Gain armor with blood." - button_icon_state = "bloodshield" - check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_LYING|AB_CHECK_CONSCIOUS - vampiric = TRUE - var/abuse_fix = 0 - -/datum/action/bloodshield/Trigger() - . = ..() - if((abuse_fix + 25 SECONDS) > world.time) - return - var/mob/living/carbon/human/H = owner - if(H.bloodpool < 2) - to_chat(owner, span_warning("You don't have enough <b>BLOOD</b> to do that!")) - return - H.bloodpool = max(H.bloodpool - 2, 0) - playsound(H.loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - abuse_fix = world.time - H.physiology.damage_resistance += 60 - animate(H, color = "#ff0000", time = 10, loop = 1) - if(H.CheckEyewitness(H, H, 7, FALSE)) - H.adjust_masquerade(-1) - spawn(15 SECONDS) - if(H) - playsound(H.loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - H.physiology.damage_resistance -= 60 - H.color = initial(H.color) - -/* -/datum/discipline/bloodshield - name = "Blood shield" - desc = "Boosts armor." - icon_state = "bloodshield" - cost = 2 - ranged = FALSE - delay = 15 SECONDS - activate_sound = 'modular_darkpack/modules/deprecated/sounds/thaum.ogg' - -/datum/discipline/bloodshield/activate(mob/living/target, mob/living/carbon/human/owner) - ..() - var/mod = level_casting - owner.physiology.armor.melee = owner.physiology.armor.melee+(15*mod) - owner.physiology.armor.bullet = owner.physiology.armor.bullet+(15*mod) - animate(owner, color = "#ff0000", time = 1 SECONDS, loop = 1) -// owner.color = "#ff0000" - spawn(delay+owner.discipline_time_plus) - if(owner) - playsound(owner.loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - owner.physiology.armor.melee = owner.physiology.armor.melee-(15*mod) - owner.physiology.armor.bullet = owner.physiology.armor.bullet-(15*mod) - owner.color = initial(owner.color) -*/ diff --git a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm new file mode 100644 index 000000000000..35964b698dae --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/path_of_blood.dm @@ -0,0 +1,308 @@ +/datum/discipline/thaumaturgy + name = "Thaumaturgy" + desc = "Opens the secrets of blood magic and how you use it, allows to steal other's blood. Violates Masquerade." + icon_state = "thaumaturgy" + clan_restricted = TRUE + power_type = /datum/discipline_power/thaumaturgy + +/datum/discipline/thaumaturgy/post_gain() + . = ..() + owner.faction |= VAMPIRE_CLAN_TREMERE + var/datum/action/ritual_drawing/thaumaturgy/thaumaturgy = new() + thaumaturgy.Grant(owner) + thaumaturgy.level = level + ADD_TRAIT(owner, TRAIT_THAUMATURGY_KNOWLEDGE, DISCIPLINE_TRAIT) + add_verb(owner, /mob/living/carbon/human/proc/check_research_points) + +/datum/discipline_power/thaumaturgy + name = "Thaumaturgy power name" + desc = "Thaumaturgy power description" + + activate_sound = 'modular_darkpack/modules/powers/sounds/thaum.ogg' + + check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_TORPORED + aggravating = TRUE + hostile = TRUE + violates_masquerade = TRUE + + cooldown_length = 1 TURNS + var/success_count + +/datum/discipline_power/thaumaturgy/activate(atom/target) + . = ..() + //Thaumaturgy powers have different effects based off the amount of successes. I dont want to copy paste the code, so this is being put here. + success_count = SSroll.storyteller_roll(dice = owner.st_get_stat(STAT_PERMANENT_WILLPOWER), difficulty = (level + 3), numerical = TRUE, mobs_to_show_output = owner) + if(success_count < 0) + thaumaturgy_botch_effect() + return TRUE + else if(success_count == 0) + to_chat(owner, span_notice("Your magic fizzles out!")) + return TRUE + return FALSE + +/datum/discipline_power/thaumaturgy/proc/thaumaturgy_botch_effect() + var/random_effect = rand(1, 3) + switch(random_effect) + if(1) + to_chat(owner, span_userdanger("You feel like something snapped inside of you!")) + //for(var/obj/item/bodypart/limb in owner.bodyparts) + ///var/type_wound = pick(list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/severe, /datum/wound/blunt/moderate)) TODO : chaz, wounds + //limb.force_wound_upwards(type_wound) + if(2) + to_chat(owner, span_userdanger("You feel like there's a sun inside of you!")) + owner.adjust_fire_stacks(5) + owner.ignite_mob() + if(3) + to_chat(owner, span_userdanger("You feel slightly less competent!")) + owner.st_add_stat_mod(STAT_TEMPORARY_WILLPOWER, -1, "thaummaturgy_failure") + +//------------------------------------------------------------------------------------------------ + +/datum/discipline_power/thaumaturgy/a_taste_for_blood + name = "A Taste for Blood" + desc = "Touch the blood of a subject and gain information about the subject." + + level = 1 + range = 1 + check_flags = DISC_CHECK_FREE_HAND | DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_TORPORED + target_type = TARGET_OBJ + aggravating = FALSE + hostile = FALSE + violates_masquerade = FALSE + + grouped_powers = list( + /datum/discipline_power/thaumaturgy/blood_rage, + /datum/discipline_power/thaumaturgy/theft_of_vitae, + /datum/discipline_power/thaumaturgy/cauldron_of_blood + ) + +// This'd also should show the last time the blood owner's person last fed, but we dont track that and I frankly dont want to. +/datum/discipline_power/thaumaturgy/a_taste_for_blood/activate(atom/target) + if(..()) + return + var/datum/reagent/blood/blood = target.reagents.has_reagent(/datum/reagent/blood) || target.reagents.has_reagent(/datum/reagent/blood/vitae) + if(!blood) + to_chat(owner, span_notice("This blood tastes bland.")) + return + + var/datum/weakref/donor_ref = blood.data["donor"] + if(!donor_ref) + to_chat(owner, span_notice("This blood tastes bland.")) + return + + var/mob/living/carbon/human/blood_owner = donor_ref.resolve() + if(!blood_owner) + to_chat(owner, span_notice("This blood tastes bland.")) + return + + var/list/message = list() + var/is_kindred = TRUE //For if we show the blood points part. + + if(success_count > 1) + if(iskindred(blood_owner)) + message += span_notice("The blood tastes like a kindred's blood.") + else + message += span_danger("The blood doesn't taste like that of a kindred's.") + is_kindred = FALSE + else + message += span_danger("The blood doesn't taste like that of a kindred's.") + is_kindred = FALSE + + if(!is_kindred) + to_chat(owner, boxed_message(jointext(message, "\n"))) + return + + var/blood_generation = blood_owner.get_generation() + if(success_count > 2) + message += span_notice("This blood tastes like that of the [blood_generation]\th generation.") + else + message += span_notice("This blood tastes like that of the [rand(LOWEST_GENERATION_LIMIT, blood_generation)]\th generation.") + + if(success_count > 3) + message += span_notice("The owner of the blood has [blood_owner.bloodpool] blood points left.") + else + message += span_notice("The owner of the blood has [rand(1, blood_owner.bloodpool)] blood points left.") + + if(success_count > 4) + if(HAS_TRAIT(blood_owner, TRAIT_DIABLERIE)) + message += span_danger("The owner of this blood has commmited the act of Diablerie in their past.") + else if(success_count <= 0) //Botches. + message += span_danger("The owner of this blood has commmited the act of Diablerie in their past.") + + to_chat(owner, boxed_message(jointext(message, "\n"))) + +//------------------------------------------------------------------------------------------------ + +/datum/discipline_power/thaumaturgy/blood_rage + name = "Blood Rage" + desc = "Impose your will on another Kindred's vitae and force them to spend it as you wish." + + effect_sound = 'sound/effects/magic/demon_consume.ogg' + + level = 2 + range = 1 + check_flags = DISC_CHECK_FREE_HAND | DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_TORPORED + target_type = TARGET_VAMPIRE | TARGET_SELF + aggravating = FALSE + hostile = FALSE + violates_masquerade = FALSE + + grouped_powers = list( + /datum/discipline_power/thaumaturgy/a_taste_for_blood, + /datum/discipline_power/thaumaturgy/theft_of_vitae, + /datum/discipline_power/thaumaturgy/cauldron_of_blood + ) + +// "Each success forces the subject to spend one blood point immediately in the way the caster desires" -v20 Core Rulebook +/datum/discipline_power/thaumaturgy/blood_rage/activate(mob/living/carbon/human/target) + if(..()) + return + var/datum/splat/vampire/kindred/vampirism = iskindred(target) // Get the vampire's splat + for(var/i in 1 to success_count) + var/datum/action/discipline/random_action = pick(vampirism.powers) + var/datum/discipline/random_discipline = random_action.discipline //Choose a random discipline that they have + var/datum/discipline_power/random_discipline_power = pick(random_discipline.known_powers) //Choose a random level of that discipline + random_discipline_power.activate(target) //Activate it at themselves. + + target.apply_status_effect(/datum/status_effect/blood_rage, target, success_count) + +//------------------------------------------------------------------------------------------------ + +/datum/discipline_power/thaumaturgy/blood_of_potency + name = "Blood of Potency" + desc = "Supernaturally thicken your vitae as if you were of a lower Generation." + + level = 3 + + duration_length = 0 // This power's length depends on the amount chosen by the user. + cooldown_override = TRUE // This power can only be used once per night. + + target_type = NONE + check_flags = DISC_CHECK_TORPORED + aggravating = FALSE + hostile = FALSE + violates_masquerade = FALSE + + grouped_powers = list() + var/activated = FALSE + +/datum/discipline_power/thaumaturgy/blood_of_potency/can_activate(atom/target, alert = FALSE) + . = ..() + if(activated) + if(alert) + to_chat(owner, span_warning("You cannot cast [src] more than once per night!")) + return FALSE + return TRUE + +/datum/discipline_power/thaumaturgy/blood_of_potency/activate() + if(..()) + return + var/current_generation = owner.get_generation() + if(current_generation <= 4) + to_chat(owner, span_warning("You can't make your blood any more powerful!")) + return + var/points_to_spend = success_count + var/chosen_generation + var/set_time + + var/list/generation_choices = list() + for(var/i in 1 to points_to_spend) + generation_choices += clamp((current_generation - i), 4, HIGHEST_GENERATION_LIMIT) //No becoming an Antediluvian. + chosen_generation = tgui_input_list(owner, "What Generation would you like to lower your blood's potency to?", "Generation", generation_choices, null) + + if(!chosen_generation) + chosen_generation = current_generation - 1 + + points_to_spend -= (current_generation - chosen_generation) + + var/list/time_choices = list() + for(var/i in 1 to points_to_spend) + time_choices += i + set_time = tgui_input_list(owner, "How many hours do you want this to last?", "Time", time_choices, 1) + if(!set_time) + set_time = 1 + + chosen_generation = max(BLOOD_POTENCY_GENERATION, chosen_generation) //Lowest im gonna let you go is BLOOD_POTENCY_GENERATION bucko + owner.apply_status_effect(/datum/status_effect/blood_of_potency, chosen_generation, set_time * 22 MINUTES) + activated = TRUE + +//------------------------------------------------------------------------------------------------ + +/datum/discipline_power/thaumaturgy/theft_of_vitae + name = "Theft of Vitae" + desc = "Draw your target's blood to you, supernaturally absorbing it as it flies." + + level = 4 + + vitae_cost = 0 //Since 1 success should give one vitae, balancing. + effect_sound = 'sound/effects/magic/enter_blood.ogg' + range = 8 // Within 50 feet (15 meters). + check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_TORPORED | DISC_CHECK_SEE | DISC_CHECK_DIRECT_SEE // The subject must be visible to the thaumaturge + target_type = TARGET_MOB + aggravating = TRUE + hostile = TRUE + violates_masquerade = TRUE + + grouped_powers = list( + /datum/discipline_power/thaumaturgy/a_taste_for_blood, + /datum/discipline_power/thaumaturgy/blood_rage, + /datum/discipline_power/thaumaturgy/cauldron_of_blood + ) + +/datum/discipline_power/thaumaturgy/theft_of_vitae/activate(mob/living/target) + if(..()) + return + + owner.Beam(BeamTarget = target, icon_state = "drainbeam", time = 1 SECONDS) + target.visible_message(span_danger("[target]'s blood streams out in a torrent towards [owner]!"), span_userdanger("Your blood streams out in a torrent towards [owner]!")) + if(iskindred(target) || isghoul(target)) + var/blood_taken = clamp(success_count, 0, target.bloodpool) + target.adjust_blood_pool(-blood_taken) + + var/blood_gained = blood_taken * max(1, target.bloodquality-1) + owner.adjust_blood_pool(blood_gained) + else + var/blood_coefficient = (5 / target.bloodpool) + // DARKPACK TODO - reimplement quirks -- potent blood + /* + if(HAS_TRAIT(target, TRAIT_POTENT_BLOOD)) + blood_coefficient *= 0.5 + */ + var/blood_taken = clamp(success_count, 0, target.bloodpool) + target.blood_volume = max (0, (target.blood_volume - (blood_taken * (70*blood_coefficient)))) + + var/blood_gained = blood_taken * max(1, target.bloodquality - 1) + owner.adjust_blood_pool(blood_gained) + +//------------------------------------------------------------------------------------------------ + +//CAULDRON OF BLOOD +/datum/discipline_power/thaumaturgy/cauldron_of_blood + name = "Cauldron of Blood" + desc = "Boil your target's blood in their body, killing almost anyone." + + level = 5 + range = 1 //The Kindred must touch the subject + check_flags = DISC_CHECK_FREE_HAND | DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_TORPORED + target_type = TARGET_MOB | TARGET_SELF + aggravating = TRUE + hostile = TRUE + violates_masquerade = TRUE + + grouped_powers = list( + /datum/discipline_power/thaumaturgy/a_taste_for_blood, + /datum/discipline_power/thaumaturgy/blood_rage, + /datum/discipline_power/thaumaturgy/theft_of_vitae + ) + +/datum/discipline_power/thaumaturgy/cauldron_of_blood/activate(mob/living/target) + if(..()) + return + + target.visible_message(span_danger("As [owner] touches [target], their body seems to boil!"), span_userdanger("As [owner] touches you, your body feels like it's boiling in a pool of lava!")) + playsound(target, pick('sound/effects/wounds/sizzle1.ogg', 'sound/effects/wounds/sizzle2.ogg'), 50, TRUE) + target.adjust_blood_pool(-success_count) + if(isnpc(target)) + target.apply_damage(success_count * 200 + owner.thaum_damage_plus, AGGRAVATED) //A single success kills any mortal + else + target.apply_damage(success_count * 40 + owner.thaum_damage_plus, AGGRAVATED) //8 successes = 320 aggravated damage, however this is diffulty 8 so more than 2 successes is rare. diff --git a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/paths/levinbolt.dm b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/paths/levinbolt.dm new file mode 100644 index 000000000000..4db40e6ac7af --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/paths/levinbolt.dm @@ -0,0 +1,521 @@ +/datum/discipline/path/levinbolt + name = "Path of the Levinbolt" + desc = "A rudimentary path of Thaumaturgy that allows the manipulation of lightning. Violates Masquerade." + icon_state = "levinbolt" + power_type = /datum/discipline_power/thaumaturgy/path/levinbolt + +/datum/discipline_power/thaumaturgy/path/levinbolt + name = "Path of the Levinbolt Power Name" + desc = "Path of the Levinbolt Power Description" + + effect_sound = 'sound/effects/magic/lightningbolt.ogg' + + var/light_range = 0 + var/light_power = 0 + var/light_color = null + var/electricity_overlay_state = null + +/datum/discipline_power/thaumaturgy/path/levinbolt/activate() + . = ..() + if(.) + return + + if(electricity_overlay_state) + var/mutable_appearance/electricity = mutable_appearance('icons/effects/effects.dmi', electricity_overlay_state, EFFECTS_LAYER) + owner.add_overlay(electricity) + + if(light_range && light_power) + owner.light_system = OVERLAY_LIGHT + owner.AddComponent(/datum/component/overlay_lighting, light_range, light_power, light_color, TRUE) + +/datum/discipline_power/thaumaturgy/path/levinbolt/deactivate() + . = ..() + + if(electricity_overlay_state && owner) + var/mutable_appearance/electricity = mutable_appearance('icons/effects/effects.dmi', electricity_overlay_state, EFFECTS_LAYER) + owner.cut_overlay(electricity) + + if(owner) + var/datum/component/overlay_lighting/light_comp = owner.GetComponent(/datum/component/overlay_lighting) + if(light_comp) + qdel(light_comp) + owner.light_system = initial(owner.light_system) + +/datum/discipline_power/thaumaturgy/path/levinbolt/Destroy() + if(owner) + var/datum/component/overlay_lighting/light_comp = owner.GetComponent(/datum/component/overlay_lighting) + if(light_comp) + qdel(light_comp) + owner.light_system = initial(owner.light_system) + return ..() + + +// levinbolt allows for the user to click on certain electronics, disabling them, like radios while people are still wearing them, warehouse computer, fuseboxes. +/datum/discipline_power/thaumaturgy/path/levinbolt/proc/levinbolt_target_click(mob/source, atom/target, params, include_radio_effects = FALSE) + if(!active || !toggled) + return + + if(!target || get_dist(owner, target) > 1) + return + + // disable radios, only used in levinbolt 3 and 5 + if(include_radio_effects && ishuman(target)) + var/mob/living/carbon/human/human_target = target + var/disabled_any = FALSE + + for(var/obj/item/I in human_target.get_head_slots()) + if(istype(I, /obj/item/radio/headset/darkpack)) + var/obj/item/radio/headset/darkpack/radio = I + if(radio.is_on()) + radio.set_on(FALSE) + human_target.visible_message( + span_warning("[human_target]'s [I.name] crackles violently and powers down!"), + span_warning("Your [I.name] crackles violently and powers down!"), + ) + playsound(human_target, 'sound/effects/sparks/sparks4.ogg', 60, TRUE) + disabled_any = TRUE + else + radio.set_on(TRUE) + human_target.visible_message( + span_warning("Electricity surges into [human_target]'s [I.name] - turning it on!"), + span_warning("Electricity surges into your radio - turning it on!"), + ) + playsound(human_target, 'sound/effects/sparks/sparks4.ogg', 60, TRUE) + disabled_any = TRUE + + if(disabled_any) + var/datum/effect_system/spark_spread/spark_system = new + spark_system.set_up(5, 1, get_turf(human_target)) + spark_system.start() + return TRUE + + // Warehouse computer 'hacking' + if(istype(target, /obj/machinery/computer/cargo/express)) + var/obj/machinery/computer/cargo/express/cargo_comp = target + cargo_comp.locked = !cargo_comp.locked + + // sparks + var/datum/effect_system/spark_spread/spark_system = new + spark_system.set_up(3, 1, get_turf(target)) + spark_system.start() + playsound(target, 'sound/effects/sparks/sparks4.ogg', 50, TRUE) + + owner.visible_message(span_warning("[owner] sends sparks of electricity into [target]!")) + return TRUE + + // Fusebox short-circuiting + if(istype(target, /obj/fusebox)) + var/obj/fusebox/fuse = target + + // Break the fusebox + fuse.damaged += 101 + fuse.check_damage(owner, TRUE) + + var/datum/effect_system/spark_spread/spark_system = new + spark_system.set_up(5, 1, get_turf(target)) + spark_system.start() + playsound(target, 'sound/effects/sparks/sparks2.ogg', 75, TRUE) + + owner.visible_message(span_warning("[owner] sends a surge of electricity into [target]!")) + + if(prob(15)) + owner.electrocute_act(10, target, siemens_coeff = 1, flags = NONE) + to_chat(owner, span_warning("Some of the electrical feedback hits you!")) + + return TRUE + + return FALSE + +//SPARK - Level 1 +/datum/discipline_power/thaumaturgy/path/levinbolt/one + name = "Spark" + desc = "Generate a small electrical discharge upon being struck, or target objects to disrupt their electronics." + + level = 1 + check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_CONSCIOUS + violates_masquerade = TRUE + toggled = TRUE + duration_length = 2 TURNS + + light_range = 2 + light_power = 1 + light_color = "#f1fdfd" + electricity_overlay_state = "electricity" + + grouped_powers = list( + /datum/discipline_power/thaumaturgy/path/levinbolt/three, + /datum/discipline_power/thaumaturgy/path/levinbolt/five + ) + +/datum/discipline_power/thaumaturgy/path/levinbolt/one/activate() + . = ..() + if(.) + try_deactivate() + return + + //signal for counterattack + RegisterSignal(owner, COMSIG_ATOM_ATTACKBY, PROC_REF(spark_counter)) + + //signal for disabling electronics + RegisterSignal(owner, COMSIG_MOB_CLICKON, PROC_REF(spark_target_click)) + + to_chat(owner, span_notice("Small sparks of electricity begin crackling around you! Youn can now disable certain electrical systems with just a touch - and attackers will sometimes feel a slight shock.")) + +/datum/discipline_power/thaumaturgy/path/levinbolt/one/deactivate() + . = ..() + UnregisterSignal(owner, COMSIG_ATOM_ATTACKBY) + UnregisterSignal(owner, COMSIG_MOB_CLICKON) + to_chat(owner, span_notice("The electricity around you fades away.")) + +/datum/discipline_power/thaumaturgy/path/levinbolt/one/proc/spark_counter(mob/source, obj/item/weapon, mob/living/attacker) + SIGNAL_HANDLER + + if(prob(30)) + attacker.adjust_jitter_up_to(4 SECONDS, 15) + if(ishuman(attacker)) + var/mob/living/carbon/human/H = attacker + H.electrocution_animation(40) + attacker.Stun(1 SECONDS) + +/datum/discipline_power/thaumaturgy/path/levinbolt/one/proc/spark_target_click(mob/source, atom/target, params) + SIGNAL_HANDLER + + return levinbolt_target_click(source, target, params, FALSE) + +//ILLUMINATE - Level 2 +/datum/discipline_power/thaumaturgy/path/levinbolt/two + name = "Illuminate" + desc = "Surge a moderate amount of energy into your hand." + level = 2 + violates_masquerade = TRUE + toggled = TRUE + duration_length = 2 TURNS + + var/list/conjured_illuminates = list() + +/datum/discipline_power/thaumaturgy/path/levinbolt/two/activate(mob/living/target) + . = ..() + if(.) + try_deactivate() + return + owner.drop_all_held_items() + + var/right_illuminate = new /obj/item/lighter/conjured/levinbolt_arm(owner) + var/left_illuminate = new /obj/item/lighter/conjured/levinbolt_arm(owner) + + owner.put_in_r_hand(right_illuminate) + owner.put_in_l_hand(left_illuminate) + + conjured_illuminates += WEAKREF(right_illuminate) + conjured_illuminates += WEAKREF(left_illuminate) + +/datum/discipline_power/thaumaturgy/path/levinbolt/two/deactivate() + . = ..() + for(var/datum/weakref/illuminate_ref in conjured_illuminates) + var/obj/item/lighter/conjured/levinbolt_arm/illuminate = illuminate_ref.resolve() + if(illuminate) + qdel(illuminate) + conjured_illuminates.Cut() + +//POWER ARRAY - Level 3 +/datum/discipline_power/thaumaturgy/path/levinbolt/three + name = "Power Array" + desc = "Discharge a greater amount of energy around yourself." + + level = 3 + check_flags = DISC_CHECK_CAPABLE | DISC_CHECK_CONSCIOUS + violates_masquerade = TRUE + toggled = TRUE + duration_length = 2 TURNS + + light_range = 3 + light_power = 2 + light_color = "#e9ffff" + electricity_overlay_state = "electricity3" + + grouped_powers = list( + /datum/discipline_power/thaumaturgy/path/levinbolt/one, + /datum/discipline_power/thaumaturgy/path/levinbolt/five + ) + +/datum/discipline_power/thaumaturgy/path/levinbolt/three/activate() + . = ..() + if(.) + try_deactivate() + return + //proc for counterattack + RegisterSignal(owner, COMSIG_ATOM_ATTACKBY, PROC_REF(power_array_counter)) + + //proc for clicking on objects to disable electronics + RegisterSignal(owner, COMSIG_MOB_CLICKON, PROC_REF(powerarray_target_click)) + + to_chat(owner, span_notice("Intense electricity surges around your entire body!")) + + +/datum/discipline_power/thaumaturgy/path/levinbolt/three/deactivate() + . = ..() + UnregisterSignal(owner, COMSIG_ATOM_ATTACKBY) + UnregisterSignal(owner, COMSIG_MOB_CLICKON) + to_chat(owner, span_notice("The electricity around your body dissipates.")) + +/datum/discipline_power/thaumaturgy/path/levinbolt/three/proc/power_array_counter(mob/source, obj/item/weapon, mob/living/attacker) + SIGNAL_HANDLER + + if(prob(30)) + addtimer(CALLBACK(attacker, TYPE_PROC_REF(/mob, emote), "scream"), 1) + if(ishuman(attacker)) + var/mob/living/carbon/human/H = attacker + H.electrocution_animation(40) + attacker.adjust_jitter_up_to(2 SECONDS, 15) + attacker.Stun(3 SECONDS) + attacker.adjust_fire_loss(30) + +/datum/discipline_power/thaumaturgy/path/levinbolt/three/proc/powerarray_target_click(mob/source, atom/target, params) + SIGNAL_HANDLER + + return levinbolt_target_click(source, target, params, TRUE) + + +//ZEUS' FURY - Level 4 +/datum/discipline_power/thaumaturgy/path/levinbolt/four + name = "Zeus' Fury" + desc = "Build up energy and direct it as arcs of lightning that chain between targets." + + level = 4 + cooldown_length = 30 SECONDS + violates_masquerade = TRUE + target_type = TARGET_LIVING + range = 7 + electricity_overlay_state = "lightning" + + var/static/mutable_appearance/electric_halo + +/datum/discipline_power/thaumaturgy/path/levinbolt/four/activate(mob/living/target) + . = ..() + if(.) + return + + owner.visible_message(span_danger("[owner.name] crackles with building electrical energy!"), + span_danger("You begin channeling Zeus' fury, electricity arcing around your body!")) + + electric_halo = electric_halo || mutable_appearance('icons/effects/effects.dmi', "electricity", EFFECTS_LAYER) + owner.add_overlay(electric_halo) + + if(do_after(owner, 3 SECONDS, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_HELD_ITEM))) + if(get_dist(owner, target) <= range) + execute_zeus_fury(target) + else + cancel_fury("Target moved out of range.") + else + cancel_fury("Channeling interrupted.") + +/datum/discipline_power/thaumaturgy/path/levinbolt/four/proc/execute_zeus_fury(mob/living/primary_target) + owner.cut_overlay(electric_halo) + + var/max_bounces = success_count // Lightning chain dependent upon successes - two successes, two targets hit + var/bolt_damage = 20 + (success_count * 4) + + playsound(get_turf(owner), 'sound/effects/magic/lightningbolt.ogg', min(50 + (success_count * 10), 100), TRUE, extrarange = success_count) + + // bolt of lightning to the first target + owner.Beam(primary_target, icon_state="lightning[rand(1,12)]", time = (5 + success_count)) + + chain_bolt(owner, primary_target, bolt_damage, max_bounces, list(owner)) + +// Proced each time a lightning bolt is sent +/datum/discipline_power/thaumaturgy/path/levinbolt/four/proc/chain_bolt(atom/origin, mob/living/current_target, bolt_energy, bounces_left, list/already_hit) + current_target.electrocute_act(bolt_energy, "Zeus' Fury", flags = SHOCK_NOGLOVES) + playsound(get_turf(current_target), 'sound/effects/magic/lightningshock.ogg', 60, TRUE) + + // Animation + current_target.adjust_jitter_up_to(5 SECONDS, 20 + (success_count * 5)) + if(ishuman(current_target)) + var/mob/living/carbon/human/H = current_target + H.electrocution_animation(40 + (success_count * 10)) + + // Better chance to stun with more successes + var/stun_chance = min(30 + (success_count * 15), 85) + if(bolt_energy >= 20 && prob(stun_chance)) + var/stun_duration = (success_count) SECONDS + current_target.Paralyze(stun_duration) + current_target.visible_message(span_warning("[current_target] convulses violently from the electrical shock!")) + + already_hit += current_target + + if(bounces_left <= 0) + return + + var/list/possible_targets = list() + for(var/mob/living/L in view(range, current_target)) + if(L in already_hit) + continue + possible_targets += L + + if(!possible_targets.len) + return + + // Pick closest target so the chain lightning is realistic + var/mob/living/next_target = null + var/shortest_distance = INFINITY //starts at infinity, then looks at each target and says 'is this distance shorter than the last guy' + for(var/mob/living/potential in possible_targets) + var/distance = get_dist(current_target, potential) + if(distance < shortest_distance) + shortest_distance = distance + next_target = potential + + if(next_target) + var/chain_delay = max(5 - success_count, 1) // slight delay for coolness + addtimer(CALLBACK(src, PROC_REF(continue_chain), current_target, next_target, bolt_energy, bounces_left, already_hit), chain_delay) + +//reduces damage and bounces_left for each subsequent bolt +/datum/discipline_power/thaumaturgy/path/levinbolt/four/proc/continue_chain(atom/origin, mob/living/next_target, bolt_energy, bounces_left, list/already_hit) + origin.Beam(next_target, icon_state="lightning[rand(1,12)]", time = (5 + success_count)) + // With more successes, damage loss per bounce is reduced + var/energy_retention = 0.8 + (success_count * 0.05) + var/reduced_energy = max(bolt_energy * energy_retention, 10) + + // Continue the chain, applying reduced damage and bounces, while retaining the already_hit list + chain_bolt(origin, next_target, reduced_energy, bounces_left - 1, already_hit) + +/datum/discipline_power/thaumaturgy/path/levinbolt/four/proc/cancel_fury(reason) + if(electric_halo) + owner.cut_overlay(electric_halo) + + to_chat(owner, span_warning("Zeus' Fury fizzles out. [reason]")) + +//EYE OF THE STORM - Level 5 +/datum/discipline_power/thaumaturgy/path/levinbolt/five + name = "Eye of the Storm" + desc = "Become charged with an incredible amount of energy." + + level = 5 + violates_masquerade = TRUE + toggled = TRUE + duration_length = 1 TURNS + vitae_cost = 2 + cooldown_length = 30 SECONDS + + light_range = 5 + light_power = 4 + light_color = "#e9ffff" + electricity_overlay_state = "electricity3" + + var/lightning_timer + var/spark_timer + + grouped_powers = list( + /datum/discipline_power/thaumaturgy/path/levinbolt/one, + /datum/discipline_power/thaumaturgy/path/levinbolt/three + ) + + +/datum/discipline_power/thaumaturgy/path/levinbolt/five/activate(atom/target) + . = ..() + if(.) + try_deactivate() + return + + //signal for clicking electronics to disable them + RegisterSignal(owner, COMSIG_CLICK, PROC_REF(storm_target_click)) + + //signal for counterattack from being struck + RegisterSignal(owner, COMSIG_ATOM_ATTACKBY, PROC_REF(storm_counter)) + + //create sparks every few seconds for coolness + spark_timer = addtimer(CALLBACK(src, PROC_REF(create_sparks)), 2 SECONDS, TIMER_STOPPABLE | TIMER_LOOP) + + //fire lightning bolt at a random nearby mob + lightning_timer = addtimer(CALLBACK(src, PROC_REF(fire_lightning_bolt)), 5 SECONDS, TIMER_STOPPABLE | TIMER_LOOP) + owner.visible_message(span_danger("[owner] becomes surrounded by crackling electrical energy!")) + to_chat(owner, span_notice("You feel incredible electrical power coursing through your body!")) + playsound(owner, 'sound/effects/sparks/sparks4.ogg', 75, TRUE) + +/datum/discipline_power/thaumaturgy/path/levinbolt/five/proc/create_sparks() + if(!owner) + return + + var/datum/effect_system/spark_spread/spark_system = new + spark_system.set_up(rand(3,7), 1, get_turf(owner)) + spark_system.start() + + if(prob(50)) + playsound(owner, pick('sound/effects/sparks/sparks1.ogg', 'sound/effects/sparks/sparks2.ogg', 'sound/effects/sparks/sparks3.ogg', 'sound/effects/sparks/sparks4.ogg'), 40, TRUE) + +/datum/discipline_power/thaumaturgy/path/levinbolt/five/proc/fire_lightning_bolt() + if(!owner) + return + + var/list/potential_targets = list() + for(var/mob/living/L in range(7, owner)) + if(L != owner && L.stat != DEAD) + potential_targets += L + + if(!length(potential_targets)) + return + + var/mob/living/target = pick(potential_targets) + + owner.Beam(target, icon_state="lightning[rand(1,12)]", time = 10) + + target.adjust_fire_loss(20) + target.adjust_jitter_up_to(3 SECONDS, 15) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + H.electrocution_animation(50) + + if(prob(60)) + target.Stun(1 SECONDS) + target.visible_message(span_warning("[target] convulses from the electrical shock!")) + + var/datum/effect_system/spark_spread/spark_system = new + spark_system.set_up(8, 1, get_turf(target)) + spark_system.start() + + owner.visible_message(span_danger("Lightning arcs from [owner] to [target]!")) + playsound(target, 'sound/effects/magic/lightningshock.ogg', 75, TRUE) + +/datum/discipline_power/thaumaturgy/path/levinbolt/five/proc/storm_counter(mob/source, obj/item/weapon, mob/living/attacker) + SIGNAL_HANDLER + + if(prob(40)) + return + attacker.adjust_jitter_up_to(3 SECONDS, 15) + if(ishuman(attacker)) + var/mob/living/carbon/human/H = attacker + H.electrocution_animation(60) + addtimer(CALLBACK(attacker, TYPE_PROC_REF(/mob, emote), "scream"), 1) + attacker.Stun(4 SECONDS) + attacker.electrocute_act(rand(10,20), owner, siemens_coeff = 1, flags = NONE) + var/datum/effect_system/spark_spread/spark_system = new + spark_system.set_up(5, 1, get_turf(attacker)) + spark_system.start() + playsound(attacker, 'sound/effects/sparks/sparks4.ogg', 60, TRUE) + +/datum/discipline_power/thaumaturgy/path/levinbolt/five/proc/storm_target_click(mob/source, atom/target, params) + SIGNAL_HANDLER + + return levinbolt_target_click(source, target, params, TRUE) + +/datum/discipline_power/thaumaturgy/path/levinbolt/five/deactivate() + if(!owner) + return + + UnregisterSignal(owner, list(COMSIG_CLICK, COMSIG_ATOM_ATTACKBY)) + + if(spark_timer) + deltimer(spark_timer) + spark_timer = null + if(lightning_timer) + deltimer(lightning_timer) + lightning_timer = null + + owner.visible_message(span_notice("The electrical energy around [owner] dissipates.")) + to_chat(owner, span_notice("The storm within you calms.")) + . = ..() + +/datum/discipline_power/thaumaturgy/path/levinbolt/five/Destroy() + if(spark_timer) + deltimer(spark_timer) + if(lightning_timer) + deltimer(lightning_timer) + . = ..() diff --git a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/paths/lure_of_flames.dm b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/paths/lure_of_flames.dm new file mode 100644 index 000000000000..41640ba1665d --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/paths/lure_of_flames.dm @@ -0,0 +1,334 @@ +/datum/discipline/path/flames + name = "Lure of Flames" + desc = "A mystical path of Thaumaturgy that allows the summoning of fire and flame. Violates Masquerade." + icon_state = "flames" + power_type = /datum/discipline_power/thaumaturgy/path/flames + + +/datum/discipline_power/thaumaturgy/path/flames + name = "Lure of Flames Power Name" + desc = "Lure of Flames Power Description" + + effect_sound = 'modular_darkpack/modules/paths/sounds/fireball.ogg' + var/ranged = FALSE + var/range_successes + var/flames_range + +//v20 core rulebook states that lure of flames can only conjure flames so far depending on successes. +/datum/discipline_power/thaumaturgy/path/flames/pre_activation_checks(atom/target, ranged) + . = ..() + if(src.ranged == FALSE) + return TRUE + range_successes = SSroll.storyteller_roll(dice = owner.st_get_stat(STAT_PERMANENT_WILLPOWER), difficulty = (level + 3), numerical = TRUE, mobs_to_show_output = owner) + switch(range_successes) + if(-INFINITY to 0) + to_chat(owner, "You fail to conjure flames anywhere further than your own hand.") + return FALSE + if(1) + flames_range = 2 + if(2) + flames_range = 3 + if(3) + flames_range = 5 + if(4 to INFINITY) + flames_range = 12 + to_chat(owner, span_cult("You have rolled [range_successes] successes and can conjure a flame [flames_range] tiles away.")) + + if (get_dist(owner, target) > flames_range) + to_chat(owner, span_warning("[target] is out of range!")) + return FALSE + +//CANDLE - LEVEL 1 +/datum/discipline_power/thaumaturgy/path/flames/one + name = "Candle" + desc = "Conjure a flame that is the size of a candle. Can be used as a lighter - not much else." + + level = 1 + violates_masquerade = TRUE + toggled = TRUE + + grouped_powers = list( + /datum/discipline_power/thaumaturgy/path/flames/two, + /datum/discipline_power/thaumaturgy/path/flames/three, + /datum/discipline_power/thaumaturgy/path/flames/four, + /datum/discipline_power/thaumaturgy/path/flames/five + ) + var/list/conjured_candles = list() + +/datum/discipline_power/thaumaturgy/path/flames/one/activate() + . = ..() + if(.) + try_deactivate() + return + owner.drop_all_held_items() + var/right_candle = new /obj/item/lighter/conjured/flame/candle(owner) + var/left_candle = new /obj/item/lighter/conjured/flame/candle(owner) + + owner.put_in_r_hand(right_candle) + owner.put_in_l_hand(left_candle) + + conjured_candles += WEAKREF(right_candle) + conjured_candles += WEAKREF(left_candle) + +/datum/discipline_power/thaumaturgy/path/flames/one/deactivate() + . = ..() + for(var/datum/weakref/candle_ref in conjured_candles) + var/obj/item/lighter/conjured/flame/candle/candle = candle_ref.resolve() + if(candle) + qdel(candle) + conjured_candles.Cut() + +//PALM OF FLAME - Level 2 +/datum/discipline_power/thaumaturgy/path/flames/two + name = "Palm of Flame" + desc = "Ignite your hands with supernatural fire, adding burn damage to your punches." + level = 2 + check_flags = DISC_CHECK_CAPABLE + violates_masquerade = TRUE + toggled = TRUE + duration_length = 2 TURNS + + + grouped_powers = list( + /datum/discipline_power/thaumaturgy/path/flames/one, + /datum/discipline_power/thaumaturgy/path/flames/three, + /datum/discipline_power/thaumaturgy/path/flames/four, + /datum/discipline_power/thaumaturgy/path/flames/five + ) + + var/list/conjured_flames = list() + +/datum/discipline_power/thaumaturgy/path/flames/two/activate() + . = ..() + if(.) + try_deactivate() + return + + owner.drop_all_held_items() + + var/right_flame = new /obj/item/lighter/conjured/flame/palm_of_flame(owner) + var/left_flame = new /obj/item/lighter/conjured/flame/palm_of_flame(owner) + + owner.put_in_r_hand(right_flame) + owner.put_in_l_hand(left_flame) + + conjured_flames += WEAKREF(right_flame) + conjured_flames += WEAKREF(left_flame) + +/datum/discipline_power/thaumaturgy/path/flames/two/deactivate() + . = ..() + for(var/datum/weakref/flame_ref in conjured_flames) + var/obj/item/lighter/conjured/flame/palm_of_flame/flame = flame_ref.resolve() + if(flame) + qdel(flame) + conjured_flames.Cut() + +//CAMPFIRE - Level 3 +/datum/discipline_power/thaumaturgy/path/flames/three + name = "Campfire" + desc = "Summon enough flame that would be in a campfire, and hurl it from your hands." + + level = 3 + cooldown_length = 5 SECONDS + violates_masquerade = TRUE + target_type = TARGET_LIVING + range = 10 + ranged = TRUE + + grouped_powers = list( + /datum/discipline_power/thaumaturgy/path/flames/one, + /datum/discipline_power/thaumaturgy/path/flames/two, + /datum/discipline_power/thaumaturgy/path/flames/four, + /datum/discipline_power/thaumaturgy/path/flames/five + ) + +/datum/discipline_power/thaumaturgy/path/flames/three/activate(mob/living/target) + . = ..() + if(.) + return + var/turf/start = get_turf(owner) + var/obj/projectile/flames/flamebolt/H = new(start) + H.firer = owner + H.damage = 25 + owner.thaum_damage_plus + success_count + H.level = 3 + var/angle = get_angle(owner, target) + H.fire(angle, target) + to_chat(target, span_danger("A bolt of searing flame flies toward you!")) + +//ENGULF - Level 4 +/datum/discipline_power/thaumaturgy/path/flames/four + name = "Engulf" + desc = "Surround your target in a raging inferno, dealing continuous burn damage." + + level = 4 + cooldown_length = 10 SECONDS + violates_masquerade = TRUE + target_type = TARGET_LIVING + range = 12 + ranged = TRUE + + grouped_powers = list( + /datum/discipline_power/thaumaturgy/path/flames/one, + /datum/discipline_power/thaumaturgy/path/flames/two, + /datum/discipline_power/thaumaturgy/path/flames/three, + /datum/discipline_power/thaumaturgy/path/flames/five + ) + +/datum/discipline_power/thaumaturgy/path/flames/four/activate(mob/living/target) + . = ..() + if(.) + return + + var/damage_amount = 25 + owner.thaum_damage_plus + success_count + target.adjust_fire_loss(damage_amount) + + target.adjust_fire_stacks(4 + success_count) + target.ignite_mob() + + to_chat(target, span_userdanger("You are engulfed in supernatural flames!")) + playsound(get_turf(target), effect_sound, 100, TRUE) + +//INFERNO - Level 5 +/datum/discipline_power/thaumaturgy/path/flames/five + name = "Inferno" + desc = "Unleash a devastating storm of fire that affects multiple targets in an area." + + level = 5 + cooldown_length = 20 SECONDS + violates_masquerade = TRUE + target_type = TARGET_TURF | TARGET_LIVING + range = 12 + ranged = TRUE + + grouped_powers = list( + /datum/discipline_power/thaumaturgy/path/flames/one, + /datum/discipline_power/thaumaturgy/path/flames/two, + /datum/discipline_power/thaumaturgy/path/flames/three, + /datum/discipline_power/thaumaturgy/path/flames/four + ) + +/datum/discipline_power/thaumaturgy/path/flames/five/activate(atom/target) + . = ..() + if(.) + return + + to_chat(owner, span_notice("You begin channeling a devastating firestorm...")) + + var/turf/center = get_turf(target) + + // minimum one tile away from the center, maximum 3 tiles away from the center + var/area_range = clamp(success_count, 1, 4) + + // create the inferno warning on all affected turfs in area_range from center + var/list/affected_turfs = list() + for(var/turf/T in range(area_range, center)) + affected_turfs += T + new /obj/effect/temp_visual/inferno_warning(T) + owner.visible_message(span_warning("Sparks begin to fly and the temperature begins to climb... what could be happening?!")) + + if(!do_after(owner, 4 SECONDS)) + to_chat(owner, span_warning("Your firestorm casting was interrupted!")) + for(var/turf/T in affected_turfs) // delete all inferno warnings if casting was interrupted + for(var/obj/effect/temp_visual/inferno_warning/W in T) + qdel(W) + return + + // damage dealt to those standing in the zone is based on successes and so are the fire stacks + var/base_damage = 20 + (success_count * 5) + owner.thaum_damage_plus + var/fire_stacks_amount = 3 + success_count + var/ignite_chance = min(60 + (success_count * 10), 95) // 60% base, +10% per success, max 95% + + // casting succeeded + for(var/turf/T in affected_turfs) + // remove inferno warning and insert the actual fire objects + for(var/obj/effect/temp_visual/inferno_warning/W in T) + qdel(W) + new /obj/effect/abstract/turf_fire(T) + + // Damage all mobs on each tile + for(var/mob/living/L in T) + if(L == owner) // Don't damage self - but caster still gets set on fire + continue + + L.adjust_fire_loss(base_damage) + + // Chance to ignite based on successes + if(prob(ignite_chance)) + L.adjust_fire_stacks(fire_stacks_amount) + L.ignite_mob() + + to_chat(L, span_userdanger("You are caught in a supernatural firestorm!")) + + playsound(center, effect_sound, 100, TRUE) + owner.visible_message(span_danger("[owner] unleashes a devastating firestorm!")) + + // Show success-based feedback to caster + switch(success_count) + if(1) + to_chat(owner, span_bolddanger("Your firestorm burns with modest intensity.")) + if(2) + to_chat(owner, span_bolddanger("Your firestorm rages with considerable power.")) + if(3 to INFINITY) + to_chat(owner, span_bolddanger("Your firestorm burns with devastating supernatural fury!")) + +// Warning overlay object +/obj/effect/temp_visual/inferno_warning + name = "impending inferno" + desc = "The air shimmers with dangerous heat. Something terrible is about to happen here!" + icon = 'icons/effects/fire.dmi' + icon_state = "fire" + alpha = 150 + duration = 2 SECONDS // Matches the channel time + +/obj/effect/temp_visual/inferno_warning/Initialize() + . = ..() + // pulsing animation + animate(src, alpha = 50, time = 10, loop = -1) + animate(alpha = 200, time = 10) + + // warning message sent to mobs that stand on the tile + RegisterSignal(loc, COMSIG_ATOM_ENTERED, PROC_REF(warn_entering_mob)) + +/obj/effect/temp_visual/inferno_warning/proc/warn_entering_mob(datum/source, atom/movable/entered) + SIGNAL_HANDLER + + if(isliving(entered)) + var/mob/living/L = entered + to_chat(L, span_warning("You feel intense supernatural heat building in this area!")) + +// Projectile for Flame Bolt +/obj/projectile/flames + name = "flame" + icon = 'icons/obj/weapons/guns/projectiles.dmi' + icon_state = "fireball" + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + damage = 20 + damage_type = BURN + hitsound_wall = 'sound/items/weapons/effects/searwall.ogg' + //flag = LASER + light_system = OVERLAY_LIGHT + light_range = 1 + light_power = 1 + light_color = COLOR_ORANGE + ricochets_max = 0 + ricochet_chance = 0 + var/level = 1 + +/obj/projectile/flames/flamebolt + name = "flame bolt" + damage = 20 + +/obj/projectile/flames/flamebolt/on_hit(atom/target, blocked = FALSE, pierce_hit) + . = ..() + if(!isliving(target)) + return + var/mob/living/L = target + // Chance to ignite target + if(prob(10)) + L.adjust_fire_stacks(2) + L.ignite_mob() + if(prob(10)) + var/target_turf = get_turf(L) + new /obj/effect/abstract/turf_fire(target_turf) + L.visible_message(span_danger("[target] is struck by supernatural flames!"), span_userdanger("You are burned by supernatural fire!")) + playsound(get_turf(target), 'modular_darkpack/modules/paths/sounds/fireball.ogg', 50, TRUE) diff --git a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/status_effects/blood_of_potency_effect.dm b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/status_effects/blood_of_potency_effect.dm new file mode 100644 index 000000000000..23fdca6b8b8c --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/status_effects/blood_of_potency_effect.dm @@ -0,0 +1,30 @@ +/datum/status_effect/blood_of_potency + id = "blood_of_potency" + duration = 30 MINUTES + status_type = STATUS_EFFECT_REFRESH + alert_type = /atom/movable/screen/alert/status_effect/blood_of_potency + var/stored_generation + +/datum/status_effect/blood_of_potency/on_creation(mob/living/new_owner, generation, time) + . = ..() + if(time) + duration = time + stored_generation = owner.get_generation() + iskindred(owner)?.set_generation(generation) + +/datum/status_effect/blood_of_potency/on_remove() + . = ..() + + //Can't do initial() due to it giving bad results. + iskindred(owner)?.set_generation(stored_generation) + stored_generation = null + + owner.update_blood_hud() + + if(owner.bloodpool > owner.maxbloodpool) + owner.bloodpool = owner.maxbloodpool + +/atom/movable/screen/alert/status_effect/blood_of_potency + name = "Blood of Potency" + desc = "You can feel your blood being stronger!" + icon_state = "blooddrunk" diff --git a/modular_darkpack/modules/powers/code/discipline/thaumaturgy/status_effects/blood_rage_status.dm b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/status_effects/blood_rage_status.dm new file mode 100644 index 000000000000..f55ce7e64b9c --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/thaumaturgy/status_effects/blood_rage_status.dm @@ -0,0 +1,18 @@ +/datum/status_effect/blood_rage + id = "blood_rage" + duration = 1 SCENES + status_type = STATUS_EFFECT_REFRESH + alert_type = /atom/movable/screen/alert/status_effect/blood_rage + +/datum/status_effect/blood_rage/on_creation(mob/living/new_owner, success_count) + . = ..() + //owner.frenzy_hardness += success_count DARKPACK TODO - reimplement frenzy + +/datum/status_effect/blood_rage/on_remove() + . = ..() + //owner.frenzy_hardness = initial(owner.frenzy_hardness) DARKPACK TODO - reimplement frenzy + +/atom/movable/screen/alert/status_effect/blood_rage + name = "Blood Rage" + desc = "You feel like you're going to lose it at any moment!" + icon_state = "blooddrunk" diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/fleshwalls.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/fleshwalls.dm new file mode 100644 index 000000000000..23112b415532 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/fleshwalls.dm @@ -0,0 +1,22 @@ + +/obj/structure/fleshwall + name = "flesh wall" + desc = "Wall from FLESH." + icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' + icon_state = "fleshwall" + plane = GAME_PLANE + layer = ABOVE_MOB_LAYER + anchored = TRUE + density = TRUE + max_integrity = 100 + +/obj/structure/tzijelly + name = "jelly thing" + desc = "an important part of the meat matrix." + icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' + icon_state = "tzijelly" + plane = GAME_PLANE + layer = ABOVE_MOB_LAYER + anchored = TRUE + density = TRUE + max_integrity = 100 diff --git a/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm b/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm index 69efb3a37b74..6054c713b9a6 100644 --- a/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm +++ b/modular_darkpack/modules/powers/code/discipline/vicissitude/vicissitude.dm @@ -8,6 +8,7 @@ /datum/discipline/vicissitude/post_gain() . = ..() owner.faction |= VAMPIRE_CLAN_TZIMISCE + ADD_TRAIT(owner, TRAIT_VICISSITUDE_KNOWLEDGE, DISCIPLINE_TRAIT) /datum/discipline_power/vicissitude name = "Vicissitude power name" @@ -374,7 +375,7 @@ duration_length = 20 SECONDS cooldown_length = 20 SECONDS - var/obj/effect/proc_holder/spell/targeted/shapeshift/tzimisce/horrid_form_shapeshift + var/datum/action/cooldown/spell/shapeshift/tzimisce/horrid_form_shapeshift /datum/discipline_power/vicissitude/horrid_form/activate() . = ..() @@ -408,7 +409,7 @@ duration_length = 20 SECONDS cooldown_length = 20 SECONDS - var/obj/effect/proc_holder/spell/targeted/shapeshift/bloodcrawler/bloodform_shapeshift + var/datum/action/cooldown/spell/shapeshift/bloodcrawler/bloodform_shapeshift /datum/discipline_power/vicissitude/bloodform/activate() . = ..() diff --git a/modular_darkpack/modules/powers/code/discipline/visceratika.dm b/modular_darkpack/modules/powers/code/discipline/visceratika.dm index 4f86f75ca495..9e22d5c54d7d 100644 --- a/modular_darkpack/modules/powers/code/discipline/visceratika.dm +++ b/modular_darkpack/modules/powers/code/discipline/visceratika.dm @@ -28,7 +28,7 @@ var/their_name = player.name if(ishuman(player)) var/mob/living/carbon/human/human_player = player - their_name = human_player.true_real_name + their_name = human_player.real_name to_chat(owner, "- [their_name]") //SCRY THE HEARTHSTONE diff --git a/modular_darkpack/modules/powers/code/discipline_actions.dm b/modular_darkpack/modules/powers/code/discipline_actions.dm index ad63010068fa..11f7985765f0 100644 --- a/modular_darkpack/modules/powers/code/discipline_actions.dm +++ b/modular_darkpack/modules/powers/code/discipline_actions.dm @@ -58,7 +58,10 @@ SIGNAL_REMOVETRAIT(TRAIT_PACIFISM), ) - RegisterSignals(owner, relevant_signals, TYPE_PROC_REF(/mob, update_action_buttons)) + RegisterSignals(owner, relevant_signals, PROC_REF(update_owner_action_buttons)) + +/datum/action/discipline/proc/update_owner_action_buttons() + owner.update_action_buttons() /datum/action/discipline/IsAvailable(feedback) return discipline.current_power.can_activate_untargeted(feedback) diff --git a/modular_darkpack/modules/powers/code/discipline_gain.dm b/modular_darkpack/modules/powers/code/discipline_gain.dm index bd82c22d82ba..15dba8e908c7 100644 --- a/modular_darkpack/modules/powers/code/discipline_gain.dm +++ b/modular_darkpack/modules/powers/code/discipline_gain.dm @@ -1,56 +1,3 @@ -/** - * Initialises Disciplines for new vampire mobs, applying effects and creating action buttons. - * - * If discipline_pref is true, it grabs all of the source's Disciplines from their preferences - * and applies those using the give_discipline() proc. If false, it instead grabs a given list - * of Discipline typepaths and initialises those for the character. Only works for ghouls and - * vampires. - * - * Arguments: - * * discipline_pref - Whether Disciplines will be taken from preferences. True by default. - * * disciplines - list of Discipline typepaths to grant if discipline_pref is false. - */ -/mob/living/carbon/human/proc/create_disciplines(discipline_pref = TRUE, list/disciplines) //EMBRACE BASIC - if ((dna.species.id == SPECIES_KINDRED) || (dna.species.id == SPECIES_GHOUL)) //only splats that have Disciplines qualify - var/list/datum/discipline/adding_disciplines = list() - - // TODO: [Rebase] reimplement Discipline selection? - /* - if (discipline_pref) //initialise player's own disciplines - for (var/i in 1 to client.prefs.discipline_types.len) - var/type_to_create = client.prefs.discipline_types[i] - var/level = client.prefs.discipline_levels[i] - var/datum/discipline/discipline = new type_to_create(level) - - //prevent Disciplines from being used if not whitelisted for them - if (discipline.clan_restricted) - if (!can_access_discipline(src, type_to_create)) - qdel(discipline) - continue - - adding_disciplines += discipline - else*/ if (disciplines.len) //initialise given disciplines - for (var/i in 1 to disciplines.len) - var/type_to_create = disciplines[i] - var/datum/discipline/discipline = new type_to_create(1) - adding_disciplines += discipline - - for (var/datum/discipline/discipline in adding_disciplines) - give_discipline(discipline) - -/** - * Creates an action button and applies post_gain effects of the given Discipline. - * - * Arguments: - * * discipline - Discipline datum that is being given to this mob. - */ -/mob/living/carbon/human/proc/give_discipline(datum/discipline/discipline) - if (discipline.level > 0) - var/datum/action/discipline/action = new(discipline) - action.Grant(src) - var/datum/species/human/species = dna.species - LAZYADD(species.disciplines, discipline) - /** * Checks a vampire for whitelist access to a Discipline. * @@ -79,7 +26,7 @@ qdel(discipline_object_checking) //first, check their Clan Disciplines to see if that gives them access - if (vampire_checking.clan.clan_disciplines.Find(discipline_checking)) + if (vampire_checking.get_clan().clan_disciplines.Find(discipline_checking)) return TRUE //next, go through all Clans to check if they have access to any with the Discipline @@ -87,7 +34,7 @@ var/datum/vampire_clan/clan_checking = new clan_type //skip this if they can't access it due to whitelists - // TODO: [Rebase] reimplement whitelisting + // DARKPACK TODO - reimplement whitelisting /* if (clan_checking.whitelisted) if (!SSwhitelists.is_whitelisted(checked_ckey = vampire_checking.ckey, checked_whitelist = clan_checking.name)) diff --git a/modular_darkpack/modules/powers/code/human.dm b/modular_darkpack/modules/powers/code/human.dm deleted file mode 100644 index 035b808c7fe5..000000000000 --- a/modular_darkpack/modules/powers/code/human.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/species/human - var/list/disciplines - -/** - * Accesses a certain Discipline that a person has. Null if not found. - * Human species since ghouls and kindred aren't subtypes of eachother. - * - * Arguments: - * * searched_discipline - Name or typepath of the Discipline being searched for. - */ -/datum/species/human/proc/get_discipline(searched_discipline) - for (var/datum/discipline/discipline in disciplines) - if (istype(discipline, searched_discipline)) - return discipline diff --git a/modular_darkpack/modules/powers/icons/auras.dmi b/modular_darkpack/modules/powers/icons/auras.dmi new file mode 100644 index 000000000000..2ef96f58195e Binary files /dev/null and b/modular_darkpack/modules/powers/icons/auras.dmi differ diff --git a/modular_darkpack/modules/powers/icons/dementation.dmi b/modular_darkpack/modules/powers/icons/dementation.dmi new file mode 100644 index 000000000000..173f78e60911 Binary files /dev/null and b/modular_darkpack/modules/powers/icons/dementation.dmi differ diff --git a/modular_darkpack/modules/powers/icons/dirt_pile.dmi b/modular_darkpack/modules/powers/icons/dirt_pile.dmi new file mode 100644 index 000000000000..68f8c72638a6 Binary files /dev/null and b/modular_darkpack/modules/powers/icons/dirt_pile.dmi differ diff --git a/modular_darkpack/modules/powers/icons/dominate.dmi b/modular_darkpack/modules/powers/icons/dominate.dmi new file mode 100644 index 000000000000..42fa335e9871 Binary files /dev/null and b/modular_darkpack/modules/powers/icons/dominate.dmi differ diff --git a/modular_darkpack/modules/powers/icons/obfuscate_shadow.dmi b/modular_darkpack/modules/powers/icons/obfuscate_shadow.dmi new file mode 100644 index 000000000000..d87e9feae2f4 Binary files /dev/null and b/modular_darkpack/modules/powers/icons/obfuscate_shadow.dmi differ diff --git a/modular_darkpack/modules/powers/icons/presence.dmi b/modular_darkpack/modules/powers/icons/presence.dmi new file mode 100644 index 000000000000..83f3758a3464 Binary files /dev/null and b/modular_darkpack/modules/powers/icons/presence.dmi differ diff --git a/modular_darkpack/modules/deprecated/sounds/auspex.ogg b/modular_darkpack/modules/powers/sounds/auspex/auspex.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/auspex.ogg rename to modular_darkpack/modules/powers/sounds/auspex/auspex.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/auspex_deactivate.ogg b/modular_darkpack/modules/powers/sounds/auspex/auspex_deactivate.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/auspex_deactivate.ogg rename to modular_darkpack/modules/powers/sounds/auspex/auspex_deactivate.ogg diff --git a/modular_darkpack/modules/powers/sounds/dementation/child_cry.ogg b/modular_darkpack/modules/powers/sounds/dementation/child_cry.ogg new file mode 100644 index 000000000000..39649d4bb1a4 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/child_cry.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/comic1.ogg b/modular_darkpack/modules/powers/sounds/dementation/comic1.ogg new file mode 100644 index 000000000000..28eeae88c9b8 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/comic1.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/comic2.ogg b/modular_darkpack/modules/powers/sounds/dementation/comic2.ogg new file mode 100644 index 000000000000..3681c07781c5 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/comic2.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/comic3.ogg b/modular_darkpack/modules/powers/sounds/dementation/comic3.ogg new file mode 100644 index 000000000000..031d0795d80f Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/comic3.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/comic4.ogg b/modular_darkpack/modules/powers/sounds/dementation/comic4.ogg new file mode 100644 index 000000000000..982895c314f3 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/comic4.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/evillaugh.ogg b/modular_darkpack/modules/powers/sounds/dementation/evillaugh.ogg new file mode 100644 index 000000000000..b7d8b6c7b47a Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/evillaugh.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/female_talk1.ogg b/modular_darkpack/modules/powers/sounds/dementation/female_talk1.ogg new file mode 100644 index 000000000000..ad8aa72e39e5 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/female_talk1.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/female_talk2.ogg b/modular_darkpack/modules/powers/sounds/dementation/female_talk2.ogg new file mode 100644 index 000000000000..43df7067af9a Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/female_talk2.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/female_talk3.ogg b/modular_darkpack/modules/powers/sounds/dementation/female_talk3.ogg new file mode 100644 index 000000000000..965b210b8a79 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/female_talk3.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/female_talk4.ogg b/modular_darkpack/modules/powers/sounds/dementation/female_talk4.ogg new file mode 100644 index 000000000000..190e924a984a Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/female_talk4.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/female_talk5.ogg b/modular_darkpack/modules/powers/sounds/dementation/female_talk5.ogg new file mode 100644 index 000000000000..dea55782d877 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/female_talk5.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/male_talk1.ogg b/modular_darkpack/modules/powers/sounds/dementation/male_talk1.ogg new file mode 100644 index 000000000000..261985a8074a Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/male_talk1.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/male_talk2.ogg b/modular_darkpack/modules/powers/sounds/dementation/male_talk2.ogg new file mode 100644 index 000000000000..232b25721a34 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/male_talk2.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/male_talk3.ogg b/modular_darkpack/modules/powers/sounds/dementation/male_talk3.ogg new file mode 100644 index 000000000000..37c51a951981 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/male_talk3.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/male_talk4.ogg b/modular_darkpack/modules/powers/sounds/dementation/male_talk4.ogg new file mode 100644 index 000000000000..f25339efd09a Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/male_talk4.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/male_talk5.ogg b/modular_darkpack/modules/powers/sounds/dementation/male_talk5.ogg new file mode 100644 index 000000000000..ebfca7df1791 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/male_talk5.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/male_talk6.ogg b/modular_darkpack/modules/powers/sounds/dementation/male_talk6.ogg new file mode 100644 index 000000000000..793a8039ab81 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/male_talk6.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/man_cry.ogg b/modular_darkpack/modules/powers/sounds/dementation/man_cry.ogg new file mode 100644 index 000000000000..069956878bba Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/man_cry.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/man_moan.ogg b/modular_darkpack/modules/powers/sounds/dementation/man_moan.ogg new file mode 100644 index 000000000000..c6d0aece0c40 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/man_moan.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/arsenic.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/arsenic.ogg new file mode 100644 index 000000000000..0f353ea4cfff Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/arsenic.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/asps.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/asps.ogg new file mode 100644 index 000000000000..4224cf963592 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/asps.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/atlantic.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/atlantic.ogg new file mode 100644 index 000000000000..17761de4c7e4 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/atlantic.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/beast.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/beast.ogg new file mode 100644 index 000000000000..338d234653c9 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/beast.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/blind.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/blind.ogg new file mode 100644 index 000000000000..58e060f01e88 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/blind.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/bone.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/bone.ogg new file mode 100644 index 000000000000..ce8985e43c55 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/bone.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/calf.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/calf.ogg new file mode 100644 index 000000000000..b6997aa4ee8f Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/calf.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/cemetery.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/cemetery.ogg new file mode 100644 index 000000000000..632688f67e43 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/cemetery.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/crouch.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/crouch.ogg new file mode 100644 index 000000000000..19dad4f9ab5e Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/crouch.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/daggers.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/daggers.ogg new file mode 100644 index 000000000000..7bb42566bbe7 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/daggers.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/dark_light.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/dark_light.ogg new file mode 100644 index 000000000000..236832586e52 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/dark_light.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/death.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/death.ogg new file mode 100644 index 000000000000..2e0451a25c30 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/death.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/die.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/die.ogg new file mode 100644 index 000000000000..5df6302b24b6 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/die.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/elkabo.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/elkabo.ogg new file mode 100644 index 000000000000..9204994f8c5e Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/elkabo.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/eyes.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/eyes.ogg new file mode 100644 index 000000000000..88386c870429 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/eyes.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/flame.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/flame.ogg new file mode 100644 index 000000000000..a21cbfc57988 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/flame.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/grave.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/grave.ogg new file mode 100644 index 000000000000..51d83fddc779 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/grave.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/heloise.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/heloise.ogg new file mode 100644 index 000000000000..88950ac8a1c0 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/heloise.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/hemlock.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/hemlock.ogg new file mode 100644 index 000000000000..79a727724f6e Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/hemlock.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/in_for_it.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/in_for_it.ogg new file mode 100644 index 000000000000..f8b7af2aacad Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/in_for_it.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/maggots.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/maggots.ogg new file mode 100644 index 000000000000..75b67e48e224 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/maggots.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/mistress.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/mistress.ogg new file mode 100644 index 000000000000..f33478e0d58c Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/mistress.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/moon.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/moon.ogg new file mode 100644 index 000000000000..54a1c54e30cc Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/moon.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/mother.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/mother.ogg new file mode 100644 index 000000000000..a98890fefd68 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/mother.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/not_fair.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/not_fair.ogg new file mode 100644 index 000000000000..ba5ef9a3bc6b Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/not_fair.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/pennies.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/pennies.ogg new file mode 100644 index 000000000000..8aed98650219 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/pennies.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/peppers.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/peppers.ogg new file mode 100644 index 000000000000..261818befe3a Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/peppers.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/putrid.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/putrid.ogg new file mode 100644 index 000000000000..82eaac344039 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/putrid.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/reaper.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/reaper.ogg new file mode 100644 index 000000000000..5d9470358f02 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/reaper.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/shadow.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/shadow.ogg new file mode 100644 index 000000000000..f6f8c6593dc1 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/shadow.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/souls.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/souls.ogg new file mode 100644 index 000000000000..9d4e035892a8 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/souls.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/swine.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/swine.ogg new file mode 100644 index 000000000000..5f385b6b2b0e Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/swine.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/tails.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/tails.ogg new file mode 100644 index 000000000000..d1042a87826a Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/tails.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/tallow.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/tallow.ogg new file mode 100644 index 000000000000..37871bda38a2 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/tallow.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/theyre_coming.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/theyre_coming.ogg new file mode 100644 index 000000000000..ce89d0e023cb Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/theyre_coming.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/tongues.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/tongues.ogg new file mode 100644 index 000000000000..3072d6eded7b Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/tongues.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/troubled.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/troubled.ogg new file mode 100644 index 000000000000..4559fe757fb7 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/troubled.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/two_mouths.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/two_mouths.ogg new file mode 100644 index 000000000000..b8251b97d709 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/two_mouths.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/speech/wishes_words.ogg b/modular_darkpack/modules/powers/sounds/dementation/speech/wishes_words.ogg new file mode 100644 index 000000000000..fd75068b9a68 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/speech/wishes_words.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/woman_cry.ogg b/modular_darkpack/modules/powers/sounds/dementation/woman_cry.ogg new file mode 100644 index 000000000000..5db98b541397 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/woman_cry.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dementation/woman_moan.ogg b/modular_darkpack/modules/powers/sounds/dementation/woman_moan.ogg new file mode 100644 index 000000000000..460c28720fa2 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dementation/woman_moan.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/dominate.ogg b/modular_darkpack/modules/powers/sounds/dominate.ogg new file mode 100644 index 000000000000..14926ad5332c Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/dominate.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/necromancy.ogg b/modular_darkpack/modules/powers/sounds/necromancy.ogg new file mode 100644 index 000000000000..09ad35772470 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/necromancy.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/presence_activate.ogg b/modular_darkpack/modules/powers/sounds/presence_activate.ogg new file mode 100644 index 000000000000..e700206f7c88 Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/presence_activate.ogg differ diff --git a/modular_darkpack/modules/powers/sounds/presence_deactivate.ogg b/modular_darkpack/modules/powers/sounds/presence_deactivate.ogg new file mode 100644 index 000000000000..6ff0b893ea3a Binary files /dev/null and b/modular_darkpack/modules/powers/sounds/presence_deactivate.ogg differ diff --git a/modular_darkpack/modules/deprecated/sounds/quietus.ogg b/modular_darkpack/modules/powers/sounds/quietus.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/quietus.ogg rename to modular_darkpack/modules/powers/sounds/quietus.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/temporis.ogg b/modular_darkpack/modules/powers/sounds/temporis/temporis.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/temporis.ogg rename to modular_darkpack/modules/powers/sounds/temporis/temporis.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/temporis end.ogg b/modular_darkpack/modules/powers/sounds/temporis/temporis_end.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/temporis end.ogg rename to modular_darkpack/modules/powers/sounds/temporis/temporis_end.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/thaum.ogg b/modular_darkpack/modules/powers/sounds/thaum.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/thaum.ogg rename to modular_darkpack/modules/powers/sounds/thaum.ogg diff --git a/modular_darkpack/modules/preferences/README.md b/modular_darkpack/modules/preferences/README.md new file mode 100644 index 000000000000..11e99c95d336 --- /dev/null +++ b/modular_darkpack/modules/preferences/README.md @@ -0,0 +1,38 @@ +https://github.com/NovaSector/NovaSector/pull/<!--PR Number--> + +## \<PREFERENCES> + +Module ID: PREFERENCES + +### Description: + +Module that pertains practically every addition to our preferences menu. + +### TG Proc/File Changes: + +- N/A +<!-- If you edited any core procs, you should list them here. You should specify the files and procs you changed. +E.g: +- `code/modules/mob/living.dm`: `proc/overriden_proc`, `var/overriden_var` + --> + +### Modular Overrides: + +- N/A +<!-- If you added a new modular override (file or code-wise) for your module, you should list it here. Code files should specify what procs they changed, in case of multiple modules using the same file. +E.g: +- `modular_nova/master_files/sound/my_cool_sound.ogg` +- `modular_nova/master_files/code/my_modular_override.dm`: `proc/overriden_proc`, `var/overriden_var` + --> + +### Defines: + +- N/A + +### Included files that are not contained in this module: + +- N/A + +### Credits: + +XeonMations diff --git a/modular_darkpack/modules/quirks/code/negative_quirks/derangement.dm b/modular_darkpack/modules/quirks/code/negative_quirks/derangement.dm new file mode 100644 index 000000000000..28598145d46a --- /dev/null +++ b/modular_darkpack/modules/quirks/code/negative_quirks/derangement.dm @@ -0,0 +1,114 @@ + +#define FLOOR_DISAPPEAR 3 SECONDS + +/datum/quirk/derangement + name = "Derangement" + desc = "Suffer from a permanent, incurable derangement that alters your perception." + icon = FA_ICON_HOUSE_MEDICAL_CIRCLE_EXCLAMATION + gain_text = span_hypnophrase("You feel off...") + lose_text = span_notice("You start to feel normal again...") + medical_record_text = "Patient suffers from a treatment-resistant mental illness." + value = -8 + hardcore_value = 6 + quirk_flags = QUIRK_PROCESSES + mob_trait = TRAIT_SHIFTY_EYES // they're deranged, so give them the trait that tells people around them about their crazy eyes + mail_goodies = list(/obj/effect/spawner/random/contraband/narcotics) // happy pills! :) + var/process_interval = 3 SECONDS + var/list/derangements + COOLDOWN_DECLARE(next_process) + +/datum/quirk/derangement/add() + derangements = subtypesof(/datum/hallucination/malk) + +/datum/quirk/derangement/process(seconds_per_tick) + if(!COOLDOWN_FINISHED(src, next_process)) + return + if(SPT_PROB(2, seconds_per_tick)) + quirk_holder.cause_hallucination( \ + pick(derangements), \ + "derangement", \ + ) + COOLDOWN_START(src, next_process, process_interval) + handle_malk_floors() + +// largely taken from https://github.com/The-Final-Nights/The-Final-Nights/pull/287 +// based on the work of maaacha +/datum/quirk/derangement/proc/handle_malk_floors() + if(!quirk_holder?.client) + return + //Floors go crazy go stupid + for(var/turf/open/floor in view(quirk_holder)) + if(!prob(7)) + continue + if(isgroundlessturf(floor)) + continue + handle_malk_floor(floor) + +/datum/quirk/derangement/proc/handle_malk_floor(turf/open/floor) + var/mutable_appearance/fake_floor = image(floor.icon, floor, floor.icon_state, floor.layer) + quirk_holder?.client.images += fake_floor + var/offset = pick(-3,-2, -1, 1, 2, 3) + var/disappearfirst = rand(1 SECONDS, 3 SECONDS) * abs(offset) + animate(fake_floor, pixel_y = offset, time = disappearfirst, flags = ANIMATION_RELATIVE) + addtimer(CALLBACK(src, PROC_REF(malk_floor_stage1), quirk_holder, offset, fake_floor), disappearfirst, TIMER_CLIENT_TIME) + +/datum/quirk/derangement/proc/malk_floor_stage1(mob/living/malk, offset, mutable_appearance/fake_floor) + animate(fake_floor, pixel_y = -offset, time = FLOOR_DISAPPEAR, flags = ANIMATION_RELATIVE) + addtimer(CALLBACK(src, PROC_REF(malk_floor_stage2), malk, fake_floor), FLOOR_DISAPPEAR, TIMER_CLIENT_TIME) + +/datum/quirk/derangement/proc/malk_floor_stage2(mob/living/malk, mutable_appearance/fake_floor) + malk.client?.images -= fake_floor + +/datum/hallucination/malk + +/datum/hallucination/malk/ambience + +/datum/hallucination/malk/ambience/start() + var/static/list/ambient_sounds = list( + 'modular_darkpack/modules/powers/sounds/dementation/comic1.ogg', + 'modular_darkpack/modules/powers/sounds/dementation/comic2.ogg', + 'modular_darkpack/modules/powers/sounds/dementation/comic3.ogg', + 'modular_darkpack/modules/powers/sounds/dementation/comic4.ogg', + 'modular_darkpack/modules/powers/sounds/dementation/man_cry.ogg', + 'modular_darkpack/modules/powers/sounds/dementation/woman_cry.ogg', + 'modular_darkpack/modules/powers/sounds/dementation/child_cry.ogg', + 'modular_darkpack/modules/powers/sounds/dementation/man_moan.ogg', // zombie like moaning sounds + 'modular_darkpack/modules/powers/sounds/dementation/woman_moan.ogg', + 'modular_darkpack/modules/powers/sounds/dementation/evillaugh.ogg' + ) + hallucinator.playsound_local(hallucinator, pick(ambient_sounds), vol = 20, vary = FALSE) + +/datum/hallucination/malk/object + var/static/list/audible_hallucinations = GLOB.derangement_phrases + +/datum/hallucination/malk/object/start() + var/list/objects = list() + + for(var/obj/object in view(hallucinator)) + if((object.invisibility > hallucinator.see_invisible) || !object.loc || !object.name) + continue + var/weight = 1 + if(isitem(object)) + weight = 3 + else if(isstructure(object)) + weight = 2 + else if(ismachinery(object)) + weight = 2 + objects[object] = weight + if(!objects.len) + return + objects -= hallucinator.contents + + var/obj/speaker = pick_weight(objects) + var/speech = pick(audible_hallucinations) + var/language = hallucinator.get_random_understood_language() + var/message = hallucinator.compose_message(speaker, language, speech) + hallucinator.playsound_local(hallucinator, audible_hallucinations[speech], vol = 20, vary = TRUE) + if(hallucinator.client.prefs.read_preference(/datum/preference/toggle/see_rc_emotes)) + hallucinator.create_chat_message(speaker, language, speech, spans = list(hallucinator.speech_span)) + to_chat(hallucinator, message) + + return TRUE + + +#undef FLOOR_DISAPPEAR diff --git a/modular_darkpack/modules/quirks/code/quirks.dm b/modular_darkpack/modules/quirks/code/quirks.dm index dc414b4c3081..76eff4cf1f62 100644 --- a/modular_darkpack/modules/quirks/code/quirks.dm +++ b/modular_darkpack/modules/quirks/code/quirks.dm @@ -196,7 +196,7 @@ Dancer dancesecond(owner) if(last_added_humanity+6000 < world.time) - for(var/obj/machinery/jukebox/J in range(7, owner)) + for(var/obj/machinery/jukebox/J in range(DEFAULT_SIGHT_DISTANCE, owner)) if(J.active) if(ishuman(owner)) var/mob/living/carbon/human/human = owner @@ -275,131 +275,6 @@ Dancer gain_text = "<span class='notice'>You feel gay.</span>" lose_text = "<span class='notice'>You don't feel gay anymore.</span>" -/datum/quirk/foreign - name = "Foreigner" - desc = "You don't know English language! If you don't know other languages - that means you don't know any." - value = -3 - gain_text = "<span class='notice'>The words being spoken around you don't make any sense." - lose_text = "<span class='notice'>You've developed fluency in English." - medical_record_text = "Patient does not speak English and may require an interpreter." - -/datum/quirk/foreign/add() - var/mob/living/carbon/H = quirk_holder - H.add_blocked_language(/datum/language/english) - -/datum/quirk/foreign/remove() - var/mob/living/carbon/H = quirk_holder - H.remove_blocked_language(/datum/language/english) - -/datum/quirk/espanol - name = "Espanol" - desc = "You know the Spanish language." - value = 1 - -/datum/quirk/espanol/add() - var/mob/living/carbon/H = quirk_holder - H.grant_language(/datum/language/espanol) - -/datum/quirk/chinese - name = "Mandarin" - desc = "You know Mandarin." - value = 1 - -/datum/quirk/chinese/add() - var/mob/living/carbon/H = quirk_holder - H.grant_language(/datum/language/mandarin) - -/datum/quirk/cantonese - name = "Cantonese" - desc = "You know Cantonese." - value = 1 - -/datum/quirk/cantonese/add() - var/mob/living/carbon/H = quirk_holder - H.grant_language(/datum/language/cantonese) - -/datum/quirk/russian - name = "Russian" - desc = "You know the Russian language." - value = 1 - -/datum/quirk/russian/add() - var/mob/living/carbon/H = quirk_holder - H.grant_language(/datum/language/russian) - -/datum/quirk/japanese - name = "Japanese" - desc = "You know the Japanese language." - value = 1 - -/datum/quirk/japanese/add() - var/mob/living/carbon/H = quirk_holder - H.grant_language(/datum/language/japanese) - -/datum/quirk/italian - name = "Italian" - desc = "You know the Italian language." - value = 1 - -/datum/quirk/italian/add() - var/mob/living/carbon/H = quirk_holder - H.grant_language(/datum/language/italian) - -/datum/quirk/german - name = "German" - desc = "You know the German language, FUR DAR FATERLAND!" - value = 1 - -/datum/quirk/german/add() - var/mob/living/carbon/H = quirk_holder - H.grant_language(/datum/language/german) - -/datum/quirk/latin - name = "Latin" - desc = "You know the ancient holy language OF THE ROMANS AND THE CLERGY!!" - value = 2 - -/datum/quirk/latin/add() - var/mob/living/carbon/H = quirk_holder - H.grant_language(/datum/language/latin) - -/datum/quirk/hebrew - name = "Hebrew" - desc = "You know the language of the ancient Hebrews!" - value = 1 - -/datum/quirk/hebrew/add() - var/mob/living/carbon/H = quirk_holder - H.grant_language(/datum/language/hebrew) - -/datum/quirk/french - name = "French" - desc = "You know the romantic language of the French." - value = 1 - -/datum/quirk/french/add() - var/mob/living/carbon/H = quirk_holder - H.grant_language(/datum/language/french) - -/datum/quirk/arabic - name = "Arabic" - desc = "You know the melodic language of the Middle East." - value = 1 - -/datum/quirk/arabic/add() - var/mob/living/carbon/H = quirk_holder - H.grant_language(/datum/language/arabic) - -/datum/quirk/greek - name = "Greek" - desc = "You know the romantic language of the Greeks." - value = 1 - -/datum/quirk/greek/add() - var/mob/living/carbon/H = quirk_holder - H.grant_language(/datum/language/greek) - - /datum/quirk/consumption name = "Consumption" desc = "Your blood is wrought with flesh eating bacteria that is literally eating you from inside out. You take some damage every random amount of time." @@ -411,7 +286,7 @@ Dancer /datum/quirk/consumption/on_process(delta_time) if(prob(5)) - quirk_holder.adjustBruteLoss(5, TRUE) + quirk_holder.adjust_brute_loss(5, TRUE) /datum/quirk/hunted name = "Sir You Are Being Hunted" diff --git a/modular_darkpack/modules/radios/code/admin_verb.dm b/modular_darkpack/modules/radios/code/admin_verb.dm new file mode 100644 index 000000000000..1151b5fc9206 --- /dev/null +++ b/modular_darkpack/modules/radios/code/admin_verb.dm @@ -0,0 +1,8 @@ +ADMIN_VERB(report_crime, R_ADMIN, "Report Crime", "Report a crime to be happening.", ADMIN_CATEGORY_EVENTS) + var/answer = tgui_input_list(user, "What kind of crime?", "Crime", list(CRIME_BURGLARY, CRIME_FIREFIGHT, CRIME_GUNSHOTS, CRIME_MURDER, CRIME_EMERGENCY)) + if(!answer) + return + SEND_SIGNAL(SSdcs, COMSIG_GLOB_REPORT_CRIME, answer, get_turf(user)) + to_chat(user, span_adminnotice("Crime reported: [answer]!")) + + BLACKBOX_LOG_ADMIN_VERB("Report Crime") diff --git a/modular_darkpack/modules/radios/code/p25_radio.dm b/modular_darkpack/modules/radios/code/p25_radio.dm deleted file mode 100644 index 52d6ca886301..000000000000 --- a/modular_darkpack/modules/radios/code/p25_radio.dm +++ /dev/null @@ -1,829 +0,0 @@ -// P25 Radio System - -GLOBAL_LIST_EMPTY(p25_radios) -GLOBAL_LIST_EMPTY(p25_transceivers) - -/obj/machinery/p25transceiver - name = "P25 transceiver" - desc = "A stationary P25 radio transceiver that handles radio connections." - icon = 'icons/obj/radio.dmi' - icon_state = "walkietalkie" - anchored = TRUE - density = TRUE - var/active = TRUE - var/list/connected_radios = list() - var/p25_network = "default" - var/list/registered_callsigns = list() - -/obj/machinery/p25transceiver/Initialize(mapload) - . = ..() - - GLOB.p25_transceivers += src - -/obj/machinery/p25transceiver/Destroy(force) - GLOB.p25_transceivers -= src - - . = ..() - - -/obj/machinery/p25transceiver/ui_interact(mob/user) - . = ..() - var/list/dat = list() - dat += "<div class='statusDisplay'>" - dat += "Status: [active ? span_good("ONLINE") : span_bad("OFFLINE")]<BR>" - dat += "<A href='byond:?src=[REF(src)];toggle=1'>[active ? "Turn Off" : "Turn On"]</A><BR><BR>" - dat += "<A href='byond:?src=[REF(src)];view_callsigns=1'>View Registered Callsigns</A>" - dat += "</div>" - - var/datum/browser/popup = new(user, "p25_transceiver", "[src.name]", 300, 220) - popup.set_content(dat.Join()) - popup.open() - -/obj/machinery/p25transceiver/ui_data(mob/user) - var/list/data = list() - data["active"] = active - data["registered_callsigns"] = list() - - var/list/sorted_callsigns = list() - for(var/callsign in registered_callsigns) - sorted_callsigns += callsign - sortTim(sorted_callsigns, /proc/cmp_numeric_asc) - - for(var/callsign in sorted_callsigns) - data["registered_callsigns"] += list(list( - "callsign" = callsign, - "name" = registered_callsigns[callsign] - )) - - return data - -/obj/machinery/p25transceiver/Topic(href, href_list) - if(..()) - return - if(!Adjacent(usr)) - return - - if(href_list["toggle"]) - if(active) - active = FALSE - to_chat(usr, span_notice("You deactivate [src].")) - for(var/obj/item/p25radio/R in connected_radios) - if(R.linked_network == p25_network) - playsound(R, 'sound/effects/radiodestatic.ogg', 50, FALSE) - for(var/mob/M in get_hearers_in_view(1, get_turf(R))) - to_chat(M, span_warning("The [R] emits a burst of static as it loses connection to the transceiver.")) - else - active = TRUE - to_chat(usr, span_notice("You activate [src].")) - for(var/obj/item/p25radio/R in connected_radios) - if(R.linked_network == p25_network) - playsound(R, 'sound/effects/radioonn.ogg', 50, FALSE) - for(var/mob/M in get_hearers_in_view(1, get_turf(R))) - to_chat(M, span_notice("The [R] chirps as it establishes connection to the transceiver.")) - update_icon() - - if(href_list["view_callsigns"]) - var/dat = "<div class='statusDisplay'>" - dat += "<B>Registered Callsigns:</B><BR>" - if(length(registered_callsigns)) - var/list/sorted_callsigns = list() - for(var/callsign in registered_callsigns) - var/num = text2num(callsign) - if(num) - sorted_callsigns += num - sortTim(sorted_callsigns, /proc/cmp_numeric_asc) - for(var/num in sorted_callsigns) - dat += "[num] - [registered_callsigns["[num]"]]<BR>" - else - dat += "No callsigns registered.<BR>" - dat += "</div>" - - var/datum/browser/popup = new(usr, "callsigns", "Registered Callsigns", 300, 300) - popup.set_content(dat) - popup.open() - - updateDialog() - -/obj/machinery/p25transceiver/proc/register_callsign(obj/item/p25radio/radio, callsign, mob/user) - if(!callsign || !istext(callsign)) - return "Invalid callsign format" - - var/validation_result = radio.register_callsign(callsign) - if(validation_result != TRUE) - return validation_result - - if(callsign in registered_callsigns) - return "Callsign [callsign] is already registered" - - registered_callsigns[callsign] = user.real_name - radio.callsign = callsign - - if(istype(src, /obj/machinery/p25transceiver/police)) - var/obj/machinery/p25transceiver/police/P = src - P.announce_status(radio, user, TRUE) - - return "Successfully registered callsign [callsign]" - -/obj/machinery/p25transceiver/proc/unregister_callsign(obj/item/p25radio/radio) - if(radio.callsign) - if(istype(src, /obj/machinery/p25transceiver/police)) - var/obj/machinery/p25transceiver/police/P = src - var/mob/user = null - for(var/mob/M in get_hearers_in_view(1, get_turf(radio))) - if(M.real_name == registered_callsigns[radio.callsign]) - user = M - break - if(user) - P.announce_status(radio, user, FALSE) - registered_callsigns -= radio.callsign - radio.callsign = null - -/obj/machinery/p25transceiver/attack_hand(mob/user) - ui_interact(user) - -/obj/machinery/p25transceiver/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/p25radio)) - if(!active) - to_chat(user, span_warning("[src] needs to be powered on first!")) - return - var/obj/item/p25radio/radio = W - if(radio.linked_network == p25_network) - unregister_callsign(radio) - radio.linked_network = null - radio.linked_transceiver = null - connected_radios -= radio - to_chat(user, span_notice("You unlink [W] from [src].")) - return - - var/new_callsign = input(user, "Enter a callsign for this radio:", "Register Callsign") as text|null - if(!new_callsign) - return - var/registration_result = register_callsign(radio, new_callsign, user) - if(registration_result != "Successfully registered callsign [new_callsign]") - to_chat(user, span_warning("[registration_result]")) - return - - radio.linked_network = p25_network - radio.linked_transceiver = src - connected_radios |= radio - to_chat(user, span_notice("You link [W] to [src] with callsign [new_callsign].")) - playsound(src, 'sound/effects/radioonn.ogg', 25, FALSE) - else - return ..() - -/obj/machinery/p25transceiver/proc/broadcast_message(message) - message = replacetext(message, "\[.*?]", "") - message = replacetext(message, "\\icon.*?\\]", "") - - message = replacetext(message, "\[<b>", "\[<b>TRANSCEIVER</b>\] \[<b>") - - for(var/mob/listener in get_hearers_in_view(7, get_turf(src))) - to_chat(listener, message) - -/obj/machinery/p25transceiver/proc/broadcast_to_network(message, network = src.p25_network, play_sound = 'sound/effects/radioclick.ogg', sound_volume = 30, check_dispatch = FALSE) - if(!active) - return FALSE - - broadcast_message(message) - - for(var/obj/item/p25radio/R in GLOB.p25_radios) - if(R.linked_network != network) - continue - if(!R.check_signal()) - continue - if(!R.receiving) - continue - if(check_dispatch && istype(R, /obj/item/p25radio/police)) - var/obj/item/p25radio/police/P = R - if(!P.dispatch_monitoring) - continue - - for(var/mob/listener in get_hearers_in_view(1, get_turf(R))) - to_chat(listener, message) - if(play_sound) - playsound(R, play_sound, sound_volume, FALSE) - return TRUE - -// ============================== -// Clinic/Tower Transceivers -// ============================== - -/obj/machinery/p25transceiver/clinic - name = "clinic P25 transceiver" - desc = "A P25 radio transceiver configured for clinic communications." - p25_network = "clinic" - -/obj/machinery/p25transceiver/tower - name = "tower P25 transceiver" - desc = "A P25 radio transceiver configured for general communications." - p25_network = "tower" - -// ============================== -// Police Transceiver -// ============================== - -/obj/machinery/p25policeportal - name = "police P25 linker" - desc = "A stationary P25 radio transceiver that handles radio connections." - icon = 'icons/obj/radio.dmi' - icon_state = "walkietalkie" - anchored = TRUE - density = TRUE - var/obj/machinery/p25transceiver/police/transceiver - -/obj/machinery/p25policeportal/LateInitialize(mapload) - . = ..() - for(var/obj/machinery/p25transceiver/P in GLOB.p25_transceivers) - if(P.p25_network == "police") - transceiver = P - break - -/obj/machinery/p25policeportal/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/p25radio)) - var/obj/item/p25radio/radio = W - if(radio.linked_network == transceiver.p25_network) - transceiver.unregister_callsign(radio) - radio.linked_network = null - radio.linked_transceiver = null - transceiver.connected_radios -= radio - to_chat(user, span_notice("You unlink [W] from [src].")) - return - - var/new_callsign = input(user, "Enter a callsign for this radio:", "Register Callsign") as text|null - if(!new_callsign) - return - var/registration_result = transceiver.register_callsign(radio, new_callsign, user) - if(registration_result != "Successfully registered callsign [new_callsign]") - to_chat(user, span_warning("[registration_result]")) - return - - radio.linked_network = transceiver.p25_network - radio.linked_transceiver = transceiver - transceiver.connected_radios |= radio - to_chat(user, span_notice("You link [W] to [transceiver] with callsign [new_callsign].")) - playsound(src, 'sound/effects/radioonn.ogg', 25, FALSE) - else - return ..() - -/obj/machinery/p25transceiver/police - name = "police P25 transceiver" - desc = "A P25 radio transceiver configured for police communications." - p25_network = "police" - var/last_emergency = 0 - var/emergency_cooldown = 600 - var/last_shooting = 0 - var/last_shooting_victims = 0 - var/last_status_change = 0 - var/status_cooldown = 100 - var/list/radio_emergency_cooldowns = list() - -/obj/machinery/p25transceiver/police/Topic(href, href_list) - if(..()) - return - if(!Adjacent(usr)) - return - - if(href_list["view_callsigns"]) - var/dat = "<div class='statusDisplay'>" - dat += "<B>Registered Callsigns:</B><BR><BR>" - - var/list/command_signs = list() - var/list/supervisor_signs = list() - var/list/patrol_signs = list() - var/list/dispatch_signs = list() - var/list/tactical_signs = list() - var/list/government_signs = list() - - for(var/callsign in registered_callsigns) - var/num = text2num(callsign) - if(!num) - continue - - if(num >= 1 && num <= 9) - command_signs += num - else if(num >= 10 && num <= 99) - supervisor_signs += num - else if(num >= 100 && num <= 499) - patrol_signs += num - else if(num >= 500 && num <= 599) - dispatch_signs += num - else if(num >= 600 && num <= 699) - tactical_signs += num - else if(num >= 700 && num <= 799) - government_signs += num - - if(length(command_signs)) - dat += "<B>Command (1-9):</B><BR>" - sortTim(command_signs, /proc/cmp_numeric_asc) - for(var/num in command_signs) - dat += "[num] - [registered_callsigns["[num]"]]<BR>" - dat += "<BR>" - - if(length(supervisor_signs)) - dat += "<B>Supervisors (10-99):</B><BR>" - sortTim(supervisor_signs, /proc/cmp_numeric_asc) - for(var/num in supervisor_signs) - dat += "[num] - [registered_callsigns["[num]"]]<BR>" - dat += "<BR>" - - if(length(patrol_signs)) - dat += "<B>Patrol (100-499):</B><BR>" - sortTim(patrol_signs, /proc/cmp_numeric_asc) - for(var/num in patrol_signs) - dat += "[num] - [registered_callsigns["[num]"]]<BR>" - dat += "<BR>" - - if(length(dispatch_signs)) - dat += "<B>Dispatch (500-599):</B><BR>" - sortTim(dispatch_signs, /proc/cmp_numeric_asc) - for(var/num in dispatch_signs) - dat += "[num] - [registered_callsigns["[num]"]]<BR>" - dat += "<BR>" - - if(length(tactical_signs)) - dat += "<B>Tactical (600-699):</B><BR>" - sortTim(tactical_signs, /proc/cmp_numeric_asc) - for(var/num in tactical_signs) - dat += "[num] - [registered_callsigns["[num]"]]<BR>" - dat += "<BR>" - - if(length(government_signs)) - dat += "<B>Government (700-799):</B><BR>" - sortTim(government_signs, /proc/cmp_numeric_asc) - for(var/num in government_signs) - dat += "[num] - [registered_callsigns["[num]"]]<BR>" - dat += "<BR>" - - if(!length(registered_callsigns)) - dat += "No callsigns registered.<BR>" - dat += "</div>" - - var/datum/browser/popup = new(usr, "callsigns", "Registered Callsigns", 400, 600) - popup.set_content(dat) - popup.open() - - updateDialog() - -/obj/machinery/p25transceiver/police/proc/broadcast_emergency(obj/item/p25radio/police/source) - if(!active || !source) - return FALSE - - var/current_time = world.time - if(radio_emergency_cooldowns[source] && current_time < radio_emergency_cooldowns[source]) - var/remaining = max(0, round((radio_emergency_cooldowns[source] - current_time)/10, 0.1)) - to_chat(usr, span_warning("The transceiver is still reconfiguring from the previous emergency alert! It will be available again in [remaining] seconds.")) - return FALSE - - radio_emergency_cooldowns[source] = current_time + emergency_cooldown - - var/turf/T = get_turf(source) - var/area/A = get_area(source) - var/coords = "[T.x], [T.y]" - var/prefix = source.get_prefix() - var/emergency_msg = "\[<b>[span_red("[prefix]-[source.callsign]")]</b>\]: [span_robot("<b><span class='red'>11-99 OFFICER NEEDS ASSISTANCE AT: [A.name] ([coords])")]</b></span>" - var/formatted = "[icon2html(source, world)] [emergency_msg]" - - return broadcast_to_network(formatted, "police", 'sound/effects/radioalert.ogg', 100) - -/obj/machinery/p25transceiver/police/proc/announce_crime(crime, atom/location) - if(!active || !location) - return - - var/area/A = get_area(location) - if(!A) - return - - var/coords = "[location.x]:[location.y]" - var/message = "" - var/should_announce = FALSE - - switch(crime) - if("shooting") - if(last_shooting + 50 < world.time) - last_shooting = world.time - message = "Gun shots at [A.name], [coords]" - should_announce = TRUE - if("victim") - if(last_shooting_victims + 50 < world.time) - last_shooting_victims = world.time - message = "Engaged combat at [A.name], wounded civillian, [coords]" - should_announce = TRUE - if("murder") - message = "Murder at [A.name], [coords]" - should_announce = TRUE - if("burglary") - message = "Burglary at [A.name], [coords]" - - if(should_announce) - var/formatted = "[icon2html(src, world)]\[<b>DISPATCH</b>\]: [span_robot("[message]")]" - broadcast_to_network(formatted, "police", 'sound/effects/radioclick.ogg', 10, TRUE) - -/obj/machinery/p25transceiver/police/proc/announce_status(obj/item/p25radio/radio, mob/user, connecting) - if(!active || !radio.callsign) - return - - if(istype(radio, /obj/item/p25radio/police)) - var/obj/item/p25radio/police/police_radio = radio - var/last_status_change = police_radio.last_status_change - if(world.time < last_status_change + police_radio.status_cooldown) - return - police_radio.last_status_change = world.time - else - return - - var/status_message = "[icon2html(src, world)]\[<b>DISPATCH</b>\]: [span_robot("[radio.callsign], [user.real_name], is [connecting ? "10-8" : "10-7"].")]" - broadcast_to_network(status_message, "police") - -// ============================== -// P25 Radio -// ============================== - -/obj/item/p25radio - name = "P25 radio" - desc = "A rugged, high-performance two-way radio designed for secure, clear communication in demanding environments, featuring a durable shoulder microphone for hands-free operation. Use .r to transmit through the radio and alt-click to toggle radio receiving." - icon = 'icons/obj/radio.dmi' - icon_state = "p25" - w_class = WEIGHT_CLASS_SMALL - slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_EARS - worn_icon = "blank" // needed so that weird pink default thing doesn't show up - worn_icon_state = "blank" // needed so that weird pink default thing doesn't show up - var/linked_network = null - var/obj/machinery/p25transceiver/linked_transceiver = null - var/callsign = null - flags_1 = HEAR_1 - var/receiving = TRUE - var/in_restricted_area = FALSE - var/powered = TRUE // New var to track power state - -/obj/item/p25radio/Initialize(mapload) - . = ..() - GLOB.p25_radios += src - -/obj/item/p25radio/Destroy() - GLOB.p25_radios -= src - return ..() - -/obj/item/p25radio/examine(mob/user) - . = ..() - if(linked_network) - . += span_notice("This radio is linked to the [linked_network] network.") - else - . += span_notice("This radio is not linked to any network. Click on a transceiver with it to link it.") - . += span_notice("The radio is currently [powered ? "ON" : "OFF"].") - -/obj/item/p25radio/proc/register_callsign(callsign) - if(!callsign || !istext(callsign)) - return "Invalid callsign format" - var/num = text2num(callsign) - if(!num) - return "Callsign must be a number" - if(length(callsign) != 3) - return "Callsign must be 3 digits" - return TRUE - -/obj/item/p25radio/proc/get_network_display_name() - switch(linked_network) - if("police") - return "Police Radio Transceiver" - if("clinic") - return "Clinic Radio Transceiver" - if("tower") - return "Tower Radio Transceiver" - else - return "Radio Transceiver" - -// restricted areas, add more if you don't want the p25s to work in that area. -/obj/item/p25radio/proc/is_in_valid_area(atom/A) - var/static/list/restricted_areas = list( - /area/vtm/sewer, - /area/vtm/sewer/nosferatu_town, - /area/vtm/sewer/old_clan_sanctum - ) - var/area/current_area = get_area(A) - for(var/restricted_type in restricted_areas) - if(istype(current_area, restricted_type)) - return FALSE - return TRUE - -/obj/item/p25radio/proc/get_prefix() - if(!callsign) - return null - switch(linked_network) - if("police") - return "PRT" - if("clinic") - return "CRT" - if("tower") - return "TRT" - else - return "RT" - -/obj/item/p25radio/proc/format_message(message) - if(!callsign) - return "[icon2html(src, world)] \[UNREGISTERED\]: [span_robot("\"[message]\"")]" - var/prefix = get_prefix() - return "[icon2html(src, world)] \[<b>[prefix]-[callsign]</b>\]: [span_robot("\"[message]\"")]" - -/obj/item/p25radio/proc/can_receive(atom/movable/speaker, message_mods) - if(!powered) - return FALSE - if(!linked_network) - return FALSE - if(!message_mods || !message_mods[RADIO_EXTENSION]) - return FALSE - if(!linked_transceiver?.active) - return FALSE - return TRUE - -/obj/item/p25radio/proc/check_signal() - var/currently_restricted = !is_in_valid_area(src) - - if(currently_restricted && !in_restricted_area) - for(var/mob/M in get_hearers_in_view(1, get_turf(src))) - to_chat(M, span_warning("The [src] emits a burst of static as it loses connection to the transceiver.")) - playsound(src, 'sound/effects/radiodestatic.ogg', 50, FALSE) - in_restricted_area = TRUE - return FALSE - else if(!currently_restricted && in_restricted_area) - for(var/mob/M in get_hearers_in_view(1, get_turf(src))) - to_chat(M, span_notice("The [src] chirps as it establishes connection to the transceiver.")) - playsound(src, 'sound/effects/radioonn.ogg', 50, FALSE) - in_restricted_area = FALSE - - if(currently_restricted || (linked_transceiver && !linked_transceiver.active)) - return FALSE - return TRUE - -/obj/item/p25radio/proc/can_transmit(mob/speaker) - if(!powered) - return FALSE - if(!speaker) - return FALSE - if(speaker.get_active_held_item() == src || speaker.get_inactive_held_item() == src || speaker.get_item_by_slot(ITEM_SLOT_BELT) == src || speaker.get_item_by_slot(ITEM_SLOT_EARS) == src) - return TRUE - return FALSE - -/obj/item/p25radio/proc/p25_talk_into(atom/movable/speaker, message, channel, list/spans, datum/language/language, list/message_mods = list()) - if(!linked_network) - if(ismob(speaker)) - to_chat(speaker, span_warning("The radio fails to transmit because it is not linked to a transceiver.")) - return NONE - - if(!ismob(speaker)) - return NONE - - var/mob/living/L = speaker - if(istype(L)) - if(L.stat > CONSCIOUS) - return NONE - - if(!can_transmit(speaker)) - return NONE - - if(!check_signal()) - if(!is_in_valid_area(src)) - to_chat(speaker, span_warning("The radio fails to transmit from this location!")) - else if(linked_transceiver && !linked_transceiver.active) - to_chat(speaker, span_warning("The radio fails to transmit because the transceiver has been disabled.")) - return ITALICS | REDUCE_RANGE - - if(isliving(speaker)) - if(L.get_item_by_slot(ITEM_SLOT_BELT) == src || L.get_item_by_slot(ITEM_SLOT_EARS) == src || L.get_active_held_item() == src || L.get_inactive_held_item() == src) - L.visible_message(span_notice("[L] talks into the [src]."), span_notice("You talk into the [src].")) - else - return FALSE - - playsound(src, 'sound/effects/radioclick.ogg', 30, FALSE) - - var/formatted = format_message(message) - if(check_signal()) - for(var/obj/item/p25radio/R in GLOB.p25_radios) - if(R.linked_network != linked_network) - continue - if(!R.check_signal()) - continue - if(!R.receiving) - continue - - for(var/mob/listener in get_hearers_in_view(1, get_turf(R))) - to_chat(listener, formatted) - - if(linked_transceiver) - linked_transceiver.broadcast_message(formatted) - - playsound(src, 'sound/effects/radioclick.ogg', 30, FALSE) - - return ITALICS | REDUCE_RANGE - -/obj/item/p25radio/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) - . = ..() - if(!can_receive(speaker, message_mods)) - return - - var/mob/living/speaker_mob = speaker - if(!istype(speaker_mob) || (speaker_mob.get_item_by_slot(ITEM_SLOT_BELT) != src && speaker_mob.get_item_by_slot(ITEM_SLOT_EARS) != src)) - return - - if(!check_signal()) - return - - var/formatted = format_message(raw_message) - for(var/mob/M in get_hearers_in_view(1, get_turf(src))) - to_chat(M, formatted) - playsound(src, 'sound/effects/radioclick.ogg', 30, FALSE) - -/obj/item/p25radio/click_alt(mob/user) - if(!user.canUseTopic(src, BE_CLOSE)) - return - powered = !powered - to_chat(user, span_notice("You turn the radio [powered ? "ON" : "OFF"].")) - playsound(src, 'sound/effects/radioonn.ogg', 100, FALSE) - -/obj/item/p25radio/Moved() - . = ..() - check_signal() - -/mob/living/Moved() - . = ..() - var/obj/item/p25radio/belt_radio = get_item_by_slot(ITEM_SLOT_BELT) - if(istype(belt_radio)) - belt_radio.check_signal() - var/obj/item/p25radio/ear_radio = get_item_by_slot(ITEM_SLOT_EARS) - if(istype(ear_radio)) - ear_radio.check_signal() - -// ============================== -//police radios, extra functionality cause they're cops -// ============================== - -/obj/item/p25radio/police - name = "P25 police radio" - desc = "A police-issue high-performance two-way radio designed for secure, clear communication in demanding environments, featuring a durable shoulder microphone for hands-free operation. Use .r to transmit and alt-click to toggle receiving, dispatch monitoring, or press your panic button." - var/dispatch_monitoring = TRUE - var/last_status_change = 0 - var/status_cooldown = 100 - -/obj/item/p25radio/police/Initialize(mapload) - . = ..() - GLOB.police_radios += src - -/obj/item/p25radio/police/Destroy() - GLOB.police_radios -= src - return ..() - -/obj/item/p25radio/police/examine(mob/user) - . = ..() - . += span_notice("Radio receiving is [receiving ? "enabled" : "disabled"]") - . += span_notice("Dispatch monitoring is [dispatch_monitoring ? "enabled" : "disabled"]") - var/turf/T = get_turf(user) - if(T) - . += "<b>Location:</b> [T.x]:[T.y]" - -/obj/item/p25radio/police/register_callsign(callsign) - if(!callsign || !istext(callsign)) - return "Invalid callsign format" - var/num = text2num(callsign) - if(!num) - return "Callsign must be a number" - if(num < 100 || num > 499) - return "Patrol callsign must be between 100 - 499" - return TRUE - -/obj/item/p25radio/police/click_alt(mob/user) - if(!user.canUseTopic(src, BE_CLOSE)) - return - - var/list/choices = list( - "Toggle Radio Power" = "power", - "Toggle Dispatch Monitoring" = "dispatch", - "Press Panic Button" = "emergency" - ) - - var/choice = input(user, "Select an option:", "[src]") as null|anything in choices - if(!choice || !user.canUseTopic(src, BE_CLOSE)) - return - - switch(choices[choice]) - if("power") - powered = !powered - to_chat(user, span_notice("You turn the radio [powered ? "ON" : "OFF"].")) - if("dispatch") - toggle_dispatch(user) - if("emergency") - trigger_emergency(user) - - playsound(src, 'sound/effects/radioonn.ogg', 100, FALSE) - -/obj/item/p25radio/police/proc/toggle_receiving(mob/user) - receiving = !receiving - to_chat(user, span_notice("You [receiving ? "enable" : "disable"] radio receiving.")) - -/obj/item/p25radio/police/proc/toggle_dispatch(mob/user) - dispatch_monitoring = !dispatch_monitoring - to_chat(user, span_notice("You [dispatch_monitoring ? "enable" : "disable"] dispatch monitoring.")) - -/obj/item/p25radio/police/proc/trigger_emergency(mob/user) - if(!linked_network || linked_network != "police") - to_chat(user, span_warning("Emergency alert only works on police network!")) - return - - if(!check_signal()) - if(!is_in_valid_area(src)) - to_chat(user, span_warning("The radio fails to transmit from this location!")) - else if(linked_transceiver && !linked_transceiver.active) - to_chat(user, span_warning("The radio crackles with static as it loses connection to the [get_network_display_name()].")) - return - - var/obj/machinery/p25transceiver/police/police_transceiver = linked_transceiver - if(!istype(police_transceiver)) - to_chat(user, span_warning("Emergency alert only works with police transceivers!")) - return - - if(!police_transceiver.broadcast_emergency(src)) - return - -/obj/item/p25radio/police/proc/announce_crime(crime, atom/location) - if(!linked_transceiver || !istype(linked_transceiver, /obj/machinery/p25transceiver/police)) - return - var/obj/machinery/p25transceiver/police/police_transceiver = linked_transceiver - police_transceiver.announce_crime(crime, location) - -// ============================== -// police radio subtypes, special callsigns -// ============================== - -// police command radio -/obj/item/p25radio/police/command - name = "P25 police command radio" - -/obj/item/p25radio/police/command/register_callsign(callsign) - if(!callsign || !istext(callsign)) - return "Invalid callsign format" - var/num = text2num(callsign) - if(!num) - return "Callsign must be a number" - if(num < 1 || num > 9) - return "Command callsign must be between 1-9" - callsign = "[num]" - return TRUE - -// police supervisor radio -/obj/item/p25radio/police/supervisor - name = "P25 police supervisor radio" - -/obj/item/p25radio/police/supervisor/register_callsign(callsign) - if(!callsign || !istext(callsign)) - return "Invalid callsign format" - var/num = text2num(callsign) - if(!num) - return "Callsign must be a number" - if(num < 10 || num > 99) - return "Supervisor callsign must be between 10-99" - callsign = "[num]" - return TRUE - -// police dispatch radio -/obj/item/p25radio/police/dispatch - name = "P25 police dispatch radio" - -/obj/item/p25radio/police/dispatch/register_callsign(callsign) - if(!callsign || !istext(callsign)) - return "Invalid callsign format" - var/num = text2num(callsign) - if(!num) - return "Callsign must be a number" - if(num < 500 || num > 599) - return "Dispatch callsign must be between 500-599" - return TRUE - -/obj/item/p25radio/police/dispatch/get_prefix() - return "DISPATCH" - -// SWAT Radio -/obj/item/p25radio/police/tactical - name = "P25 tactical radio" -/obj/item/p25radio/police/tactical/register_callsign(callsign) - if(!callsign || !istext(callsign)) - return "Invalid callsign format" - var/num = text2num(callsign) - if(!num) - return "Callsign must be a number" - if(num < 600 || num > 699) - return "Tactical callsign must be between 600-699" - callsign = "[num]" - return TRUE - -//national guard/FBI radio -/obj/item/p25radio/police/government - name = "P25 government radio" -/obj/item/p25radio/police/government/register_callsign(callsign) - if(!callsign || !istext(callsign)) - return "Invalid callsign format" - var/num = text2num(callsign) - if(!num) - return "Callsign must be a number" - if(num < 700 || num > 799) - return "Government callsign must be between 700-799" - callsign = "[num]" - return TRUE - diff --git a/modular_darkpack/modules/radios/code/police_radio.dm b/modular_darkpack/modules/radios/code/police_radio.dm deleted file mode 100644 index f4c8b04dc942..000000000000 --- a/modular_darkpack/modules/radios/code/police_radio.dm +++ /dev/null @@ -1,70 +0,0 @@ -/obj/item/police_radio - name = "dispatch frequency radio" - desc = "911, I'm stuck in my dishwasher and stepbrother is coming in my room..." - icon_state = "radio" - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - w_class = WEIGHT_CLASS_SMALL - var/last_shooting = 0 - var/last_shooting_victims = 0 - -/obj/item/police_radio/examine(mob/user) - . = ..() - var/turf/T = get_turf(user) - if(T) - . += "<b>Location:</b> [T.x]:[T.y] ([get_cardinal_direction(T.x, T.y)])" - -/proc/get_cardinal_direction(x, y) - var/direction = "" - var/center_x = (x >= 98 && x <= 158) - var/center_y = (y >= 98 && y <= 158) - if(center_x && center_y) - return "Central" - if(center_x) - direction = "" - else if(x >= 128) - direction += "East" - else - direction += "West" - if(center_y) - direction = "Central [direction]" - else if(y >= 128) - direction = "North [direction]" - else - direction = "South [direction]" - direction += " San Francisco" - return direction - -/obj/item/police_radio/proc/announce_crime(crime, atom/location) - var/area/crime_location = get_area(location) - var/direction = get_cardinal_direction(location.x, location.y) - var/message = "" - - switch(crime) - if("shooting") - if(last_shooting + 15 SECONDS < world.time) - last_shooting = world.time - message = "Citizens report hearing gunshots at [crime_location.name], to the [direction], [location.x]:[location.y]..." - if("victim") - if(last_shooting_victims + 15 SECONDS < world.time) - last_shooting_victims = world.time - message = "Active firefight in progress at [crime_location.name], wounded civilians, the [direction], [location.x]:[location.y]..." - if("murder") - message = "Murder at [crime_location.name], to the [direction], [location.x]:[location.y]..." - if("burglary") - message = "Burglary reported by automated security device at [crime_location.name], the [direction], [location.x]:[location.y]..." - - if(message != "") - for(var/obj/item/police_radio/radio in GLOB.police_radios) - radio.say(message) - -/obj/item/police_radio/proc/dispatcher_talk(said) - say(said) - -/obj/item/police_radio/Initialize(mapload) - . = ..() - GLOB.police_radios += src - -/obj/item/police_radio/Destroy() - . = ..() - GLOB.police_radios -= src diff --git a/modular_darkpack/modules/radios/code/radio.dm b/modular_darkpack/modules/radios/code/radio.dm new file mode 100644 index 000000000000..2cb3a7d09528 --- /dev/null +++ b/modular_darkpack/modules/radios/code/radio.dm @@ -0,0 +1,54 @@ +// Base radio type we use for our custom behaviors. +/obj/item/radio/headset/darkpack + name = "\improper P25 radio" + desc = "A portable radio headset operating on the P25 digital standard." + icon = 'modular_darkpack/modules/radios/icons/radio.dmi' + icon_state = "p25" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/radios/icons/onfloor.dmi') + freqlock = RADIO_FREQENCY_LOCKED + +// Military Radio +/obj/item/radio/headset/darkpack/military + name = "military radio" + radio_network = NETWORK_MILITARY + +/obj/item/radio/headset/darkpack/military/Initialize() + . = ..() + set_frequency(FREQ_MILITARY) + radio_id = rand(1, 999) // Since we wont have a tranceiver for these, we're just auto-assigning a random ID. This isn't foolproof. + +// Police Radio get a special button to call for backup. +/obj/item/radio/headset/darkpack/police + name = "police radio" + icon_state = "pp25" + COOLDOWN_DECLARE(emergency_cooldown) + +/obj/item/radio/headset/darkpack/police/Initialize() + . = ..() + register_context() + +/obj/item/radio/headset/darkpack/police/examine(mob/user) + . = ..() + var/turf/current_turf = get_turf(src) + . += span_info("GPS Location: " + english_list(list(current_turf.x, current_turf.y, current_turf.z), and_text = ", ")) + . += span_notice("It has a red button on the side to call for backup. It can be activated with [EXAMINE_HINT("Ctrl-Shift-Click")].") + +/obj/item/radio/headset/darkpack/police/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = NONE + if(isnull(held_item)) + context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB] = "Activate Emergency Backup Call" + return CONTEXTUAL_SCREENTIP_SET + +/obj/item/radio/headset/darkpack/police/click_ctrl_shift(mob/user) + var/confirmation_popup = tgui_alert(user, "Are you sure you want to send an emergency backup call?", "Emergency Backup Call", list("Cancel", "Confirm")) + if(confirmation_popup != "Confirm") + return + if(!COOLDOWN_FINISHED(src, emergency_cooldown)) + balloon_alert(user, "busy!") + return + if(radio_network != NETWORK_POLICE) + balloon_alert(user, "unconnected!") + return + user.balloon_alert_to_viewers("beep!", "activated!") + SEND_SIGNAL(SSdcs, COMSIG_GLOB_REPORT_CRIME, CRIME_EMERGENCY, get_turf(src)) + COOLDOWN_START(src, emergency_cooldown, 30 SECONDS) diff --git a/modular_darkpack/modules/radios/code/radio_globals.dm b/modular_darkpack/modules/radios/code/radio_globals.dm deleted file mode 100644 index 3147f4863955..000000000000 --- a/modular_darkpack/modules/radios/code/radio_globals.dm +++ /dev/null @@ -1,2 +0,0 @@ -/// All police radios in the city -GLOBAL_LIST_EMPTY(police_radios) diff --git a/modular_darkpack/modules/radios/code/tcomms_subtypes/anarch.dm b/modular_darkpack/modules/radios/code/tcomms_subtypes/anarch.dm new file mode 100644 index 000000000000..bc806b636ce7 --- /dev/null +++ b/modular_darkpack/modules/radios/code/tcomms_subtypes/anarch.dm @@ -0,0 +1,23 @@ +/obj/machinery/telecomms/server/presets/anarch + id = "Bar Server" + network = "global" + freq_listening = list(FREQ_ANARCH) + autolinkers = list("anarch") + +/obj/machinery/telecomms/server/presets/anarch/New() + . = ..() + frequency_infos["[FREQ_ANARCH]"] = list( + "name" = RADIO_CHANNEL_ANARCH, + "color" = RADIO_COLOR_ANARCH + ) + +/obj/machinery/telecomms/bus/darkpack/anarch + id = "Bar Bus" + network = "global" + freq_listening = list(FREQ_ANARCH) + autolinkers = list("anarch_processor", "anarch") + +/obj/machinery/telecomms/processor/darkpack/anarch + id = "Bar Processor" + network = "global" + autolinkers = list("anarch_processor") diff --git a/modular_darkpack/modules/radios/code/tcomms_subtypes/camarilla.dm b/modular_darkpack/modules/radios/code/tcomms_subtypes/camarilla.dm new file mode 100644 index 000000000000..dc897cd2e6be --- /dev/null +++ b/modular_darkpack/modules/radios/code/tcomms_subtypes/camarilla.dm @@ -0,0 +1,23 @@ +/obj/machinery/telecomms/server/presets/camarilla + id = "Tower Server" + network = "global" + freq_listening = list(FREQ_CAMARILLA) + autolinkers = list("camarilla") + +/obj/machinery/telecomms/server/presets/camarilla/New() + . = ..() + frequency_infos["[FREQ_CAMARILLA]"] = list( + "name" = RADIO_CHANNEL_CAMARILLA, + "color" = RADIO_COLOR_CAMARILLA + ) + +/obj/machinery/telecomms/bus/darkpack/camarilla + id = "Tower Bus" + network = "global" + freq_listening = list(FREQ_CAMARILLA) + autolinkers = list("camarilla_processor", "camarilla") + +/obj/machinery/telecomms/processor/darkpack/camarilla + id = "Tower Processor" + network = "global" + autolinkers = list("camarilla_processor") diff --git a/modular_darkpack/modules/radios/code/tcomms_subtypes/clinic.dm b/modular_darkpack/modules/radios/code/tcomms_subtypes/clinic.dm new file mode 100644 index 000000000000..92b6df5b305e --- /dev/null +++ b/modular_darkpack/modules/radios/code/tcomms_subtypes/clinic.dm @@ -0,0 +1,23 @@ +/obj/machinery/telecomms/server/presets/clinic + id = "Clinic Server" + network = "global" + freq_listening = list(FREQ_CLINIC) + autolinkers = list("clinic") + +/obj/machinery/telecomms/server/presets/clinic/New() + . = ..() + frequency_infos["[FREQ_CLINIC]"] = list( + "name" = RADIO_CHANNEL_CLINIC, + "color" = RADIO_COLOR_CLINIC + ) + +/obj/machinery/telecomms/bus/darkpack/clinic + id = "Clinic Bus" + network = "global" + freq_listening = list(FREQ_CLINIC) + autolinkers = list("clinic_processor", "clinic") + +/obj/machinery/telecomms/processor/darkpack/clinic + id = "Clinic Processor" + network = "global" + autolinkers = list("clinic_processor") diff --git a/modular_darkpack/modules/radios/code/tcomms_subtypes/endron.dm b/modular_darkpack/modules/radios/code/tcomms_subtypes/endron.dm new file mode 100644 index 000000000000..57d1c258a598 --- /dev/null +++ b/modular_darkpack/modules/radios/code/tcomms_subtypes/endron.dm @@ -0,0 +1,48 @@ +/obj/machinery/telecomms/server/presets/endron + id = "Endron Server" + network = "endron" + freq_listening = list(FREQ_ENDRON) + autolinkers = list("endron") + +/obj/machinery/telecomms/server/presets/endron/New() + . = ..() + frequency_infos["[FREQ_ENDRON]"] = list( + "name" = RADIO_CHANNEL_ENDRON, + "color" = RADIO_COLOR_ENDRON + ) + +/obj/machinery/telecomms/bus/darkpack/endron + id = "Endron Bus" + network = "endron" + freq_listening = list(FREQ_ENDRON) + autolinkers = list("endron_processor", "endron") + +/obj/machinery/telecomms/processor/darkpack/endron + id = "Endron Processor" + network = "endron" + autolinkers = list("endron_processor") + +/obj/machinery/telecomms/receiver/darkpack/endron + id = "Endron Communications Receiver" + network = "endron" + autolinkers = list("endron_receiver") + +/obj/machinery/telecomms/broadcaster/darkpack/endron + id = "Endron Communications Broadcaster" + network = "endron" + autolinkers = list("endron_broadcaster") + +/obj/machinery/telecomms/relay/darkpack/endron + id = "Endron Communications Relay" + network = "endron" + autolinkers = list("endron_relay") + +/obj/machinery/telecomms/hub/darkpack/endron + id = "Communications Hub" + network = "global" + autolinkers = list( + "endron_relay", + "endron_receiver", + "endron_broadcaster", + "endron", + ) diff --git a/modular_darkpack/modules/radios/code/tcomms_subtypes/global.dm b/modular_darkpack/modules/radios/code/tcomms_subtypes/global.dm new file mode 100644 index 000000000000..11fc92055fbb --- /dev/null +++ b/modular_darkpack/modules/radios/code/tcomms_subtypes/global.dm @@ -0,0 +1,34 @@ +/obj/machinery/telecomms/hub/darkpack + id = "Communications Hub" + network = "global" + autolinkers = list( + "relay", + "receiver", + "broadcaster", + "police", + "clinic", + "camarilla", + "anarch", + ) + +/obj/machinery/telecomms/receiver/darkpack + id = "Communications Receiver" + network = "global" + autolinkers = list("receiver") + +/obj/machinery/telecomms/broadcaster/darkpack + id = "Communications Broadcaster" + network = "global" + autolinkers = list("broadcaster") + +/obj/machinery/telecomms/relay/darkpack + id = "Communications Relay" + network = "global" + autolinkers = list("relay") + +// All in one public telecomms mainframe, used for when you dont want to have a tcomms setup on your map and still have radios working. +/obj/machinery/telecomms/allinone/public + name = "global telecommunications mainframe" + desc = "A mainframe that allows for the processing of priority radio telecommunications." + freq_listening = list(FREQ_POLICE, FREQ_CLINIC, FREQ_MILITARY, FREQ_CAMARILLA, FREQ_ANARCH, FREQ_ENDRON) + syndicate = TRUE diff --git a/modular_darkpack/modules/radios/code/tcomms_subtypes/military.dm b/modular_darkpack/modules/radios/code/tcomms_subtypes/military.dm new file mode 100644 index 000000000000..630113c20331 --- /dev/null +++ b/modular_darkpack/modules/radios/code/tcomms_subtypes/military.dm @@ -0,0 +1,5 @@ +/obj/machinery/telecomms/allinone/military + name = "military telecommunications mainframe" + desc = "A mainframe that allows for the processing of priority military telecommunications." + freq_listening = list(FREQ_MILITARY) + syndicate = TRUE diff --git a/modular_darkpack/modules/radios/code/tcomms_subtypes/police.dm b/modular_darkpack/modules/radios/code/tcomms_subtypes/police.dm new file mode 100644 index 000000000000..6abc51ca6468 --- /dev/null +++ b/modular_darkpack/modules/radios/code/tcomms_subtypes/police.dm @@ -0,0 +1,23 @@ +/obj/machinery/telecomms/server/presets/police + id = "Police Server" + network = "global" + freq_listening = list(FREQ_POLICE) + autolinkers = list("police") + +/obj/machinery/telecomms/server/presets/police/New() + . = ..() + frequency_infos["[FREQ_POLICE]"] = list( + "name" = RADIO_CHANNEL_POLICE, + "color" = RADIO_COLOR_POLICE + ) + +/obj/machinery/telecomms/bus/darkpack/police + id = "Police Bus" + network = "global" + freq_listening = list(FREQ_POLICE) + autolinkers = list("police_processor", "police") + +/obj/machinery/telecomms/processor/darkpack/police + id = "Police Processor" + network = "global" + autolinkers = list("police_processor") diff --git a/modular_darkpack/modules/radios/code/transceiver.dm b/modular_darkpack/modules/radios/code/transceiver.dm new file mode 100644 index 000000000000..0e38d34c234e --- /dev/null +++ b/modular_darkpack/modules/radios/code/transceiver.dm @@ -0,0 +1,159 @@ +/obj/machinery/radio_tranceiver + name = "radio transceiver" + desc = "A machine used for connecting and managing radios on its designated network." + icon = 'modular_darkpack/modules/radios/icons/radio.dmi' + icon_state = "walkietalkie" + density = TRUE + pass_flags = PASSTABLE + pass_flags_self = LETPASSTHROW + var/radio_network = "Unnamed Network" + var/radio_frequency = FREQ_COMMON + var/list/connected_radios = list() + +/obj/machinery/radio_tranceiver/Initialize(mapload) + . = ..() + register_context() + +/obj/machinery/radio_tranceiver/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(held_item?.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = anchored ? "Unsecure" : "Secure" + return CONTEXTUAL_SCREENTIP_SET + return ..() + +/obj/machinery/radio_tranceiver/examine(mob/user) + . = ..() + . += span_notice("It is currently connected and managing \the [radio_network].") + +/obj/machinery/radio_tranceiver/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/radio/headset/darkpack)) + return ..() + + if(user.st_get_stat(STAT_TECHNOLOGY) < 1) + to_chat(user, span_warning("You don't know how to operate this!")) + return ITEM_INTERACT_FAILURE + + var/obj/item/radio/headset/darkpack/radio = tool + if(radio.radio_id) + if("[radio.radio_id]" in connected_radios) + to_chat(user, span_notice("You unlink the [radio] from the [radio_network].")) + leave_network(radio) + playsound(src, 'modular_darkpack/modules/radios/sounds/radio_off.ogg', 60, TRUE) + return ITEM_INTERACT_SUCCESS + else + to_chat(user, span_notice("You can't link the [radio] to the [radio_network] because it is connected to the [radio.radio_network]!")) + return ITEM_INTERACT_SUCCESS + else + var/input_number = tgui_input_number(user = user, message = "Set Radio ID", title = "Enter a numerical ID to use for this network.", max_value = 999, min_value = 1, round_value = TRUE) + if(!input_number) + return ITEM_INTERACT_FAILURE + if("[input_number]" in connected_radios) + to_chat(user, span_warning("A radio with that ID is already connected to this network!")) + return ITEM_INTERACT_FAILURE + join_network(radio, input_number) + playsound(src, 'modular_darkpack/modules/radios/sounds/radio_on.ogg', 60, TRUE) + to_chat(user, span_notice("You link the [radio] to the [radio_network].")) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/radio_tranceiver/wrench_act(mob/living/user, obj/item/tool) + . = ..() + balloon_alert(user, "[anchored ? "un" : ""]securing...") + tool.play_tool_sound(src) + if(tool.use_tool(src, user, 1 TURNS)) + playsound(loc, 'sound/items/deconstruct.ogg', 50, vary = TRUE) + balloon_alert(user, "[anchored ? "un" : ""]secured") + set_anchored(!anchored) + return TRUE + +/obj/machinery/radio_tranceiver/proc/join_network(obj/item/radio/headset/darkpack/connected_radio, radio_id) + connected_radio.radio_id = radio_id + connected_radio.radio_network = radio_network + connected_radio.set_frequency(radio_frequency) + var/datum/weakref/radio_weakref = WEAKREF(connected_radio) + connected_radios["[radio_id]"] = radio_weakref + +/obj/machinery/radio_tranceiver/proc/leave_network(obj/item/radio/headset/darkpack/disconnected_radio) + disconnected_radio.radio_network = null + disconnected_radio.set_frequency(FREQ_COMMON) + connected_radios -= "[disconnected_radio.radio_id]" + disconnected_radio.radio_id = null + +/obj/machinery/radio_tranceiver/police + radio_network = NETWORK_POLICE + radio_frequency = FREQ_POLICE + var/obj/item/radio/headset/darkpack/police/radio + COOLDOWN_DECLARE(crime_reporting_cooldown) + +/obj/machinery/radio_tranceiver/police/Initialize(mapload) + . = ..() + radio = new() + join_network(radio, 911) + RegisterSignal(SSdcs, COMSIG_GLOB_REPORT_CRIME, PROC_REF(crime_reported)) + +/obj/machinery/radio_tranceiver/police/Destroy(force) + UnregisterSignal(SSdcs, COMSIG_GLOB_REPORT_CRIME) + QDEL_NULL(radio) + return ..() + +/obj/machinery/radio_tranceiver/police/proc/crime_reported(datum/source, crime, turf/location) + SIGNAL_HANDLER + + if(crime == CRIME_EMERGENCY) // Bypasses cooldown because of gameplay reasons. + radio.talk_into(radio, span_red("406 - EMERGENCY - BACKUP REQUIRED AT: [english_list(list(location.x, location.y, location.z, get_area_name(location, TRUE)), and_text = ", ")]."), FREQ_POLICE, list(SPAN_ROBOT, SPAN_COMMAND)) + + var/datum/signal/subspace/radio/signal = new(FREQ_POLICE, list()) + INVOKE_ASYNC(signal, TYPE_PROC_REF(/datum/signal/subspace/radio, send_to_receivers)) + log_message("Emergency alarm triggered at: [english_list(list(location.x, location.y, location.z, get_area_name(location, TRUE)), and_text = ", ")]", LOG_PDA) + return + + if(!COOLDOWN_FINISHED(src, crime_reporting_cooldown)) + return + COOLDOWN_START(src, crime_reporting_cooldown, 10 SECONDS) + switch(crime) + if(CRIME_GUNSHOTS) + radio.talk_into(radio, "Active gunshots have been reported at [get_area_name(location, TRUE)].", FREQ_POLICE, list(SPAN_ROBOT)) + if(CRIME_FIREFIGHT) + radio.talk_into(radio, "An active firefight in progress been reported at [get_area_name(location, TRUE)].", FREQ_POLICE, list(SPAN_ROBOT)) + if(CRIME_MURDER) + radio.talk_into(radio, "A murder has been reported at [get_area_name(location, TRUE)].", FREQ_POLICE, list(SPAN_ROBOT)) + if(CRIME_BURGLARY) + radio.talk_into(radio, "A burglary has been reported at [get_area_name(location, TRUE)].", FREQ_POLICE, list(SPAN_ROBOT)) + if(CRIME_ATM_TAMPERING) + radio.talk_into(radio, "An atm was broken into or otherwise tampered with at [get_area_name(location, TRUE)].", FREQ_POLICE, list(SPAN_ROBOT)) + +/datum/signal/subspace/radio + +/datum/signal/subspace/radio/New(frequency, data) // the frequency the signal is taking place on + src.frequency = frequency + src.data = data + +/datum/signal/subspace/radio/broadcast() + set waitfor = FALSE + + var/list/radios = list() + // Reaches any radios on the levels + var/list/all_radios_of_our_frequency = GLOB.all_radios["[frequency]"] + if(LAZYLEN(all_radios_of_our_frequency)) + radios = all_radios_of_our_frequency.Copy() + + for(var/obj/item/radio/subspace_radio in radios) + if(!subspace_radio.can_receive(frequency, RADIO_NO_Z_LEVEL_RESTRICTION)) + radios -= subspace_radio + + for(var/called_radio as anything in radios) + playsound(get_turf(called_radio), 'modular_darkpack/modules/radios/sounds/panic.ogg', 50, TRUE) + +/obj/machinery/radio_tranceiver/clinic + radio_network = NETWORK_CLINIC + radio_frequency = FREQ_CLINIC + +/obj/machinery/radio_tranceiver/camarilla + radio_network = NETWORK_CAMARILLA + radio_frequency = FREQ_CAMARILLA + +/obj/machinery/radio_tranceiver/anarch + radio_network = NETWORK_ANARCH + radio_frequency = FREQ_ANARCH + +/obj/machinery/radio_tranceiver/endron + radio_network = NETWORK_ENDRON + radio_frequency = FREQ_ENDRON diff --git a/modular_darkpack/modules/radios/icons/onfloor.dmi b/modular_darkpack/modules/radios/icons/onfloor.dmi new file mode 100644 index 000000000000..6c348704c694 Binary files /dev/null and b/modular_darkpack/modules/radios/icons/onfloor.dmi differ diff --git a/modular_darkpack/modules/radios/icons/radio.dmi b/modular_darkpack/modules/radios/icons/radio.dmi new file mode 100644 index 000000000000..a810f0552dbe Binary files /dev/null and b/modular_darkpack/modules/radios/icons/radio.dmi differ diff --git a/modular_darkpack/modules/radios/readme.md b/modular_darkpack/modules/radios/readme.md new file mode 100644 index 000000000000..75d028eae74d --- /dev/null +++ b/modular_darkpack/modules/radios/readme.md @@ -0,0 +1,60 @@ +https://github.com/DarkPack13/SecondCity/pull/432 + +## Title: Darkpack Radios + +MODULE ID: RADIOS + +### Description: + +Adds our own custom radios that use our guestbooks system for communication. + +### TG Proc/File Changes: + +- `code/_globalvars/admin.dm` +- `code/controllers/subsystem/blackbox.dm` +- `code/datums/brain_damage/imaginary_friend.dm` +- `code/game/machinery/doors/passworddoor.dm` +- `code/game/machinery/telecomms/machines/allinone.dm` +- `code/game/machinery/telecomms/broadcasting.dm` +- `code/game/machinery/telecomms/machine_interactions.dm` +- `code/game/machinery/hologram.dm` +- `code/game/objects/items/devices/radio/headset.dm` +- `code/game/objects/items/devices/radio/intercom.dm` +- `code/game/objects/items/devices/radio/radio.dm` +- `code/game/objects/items/devices/taperecorder.dm` +- `code/game/communications.dm` +- `code/game/say.dm` +- `code/modules/assembly/voice.dm` +- `code/modules/clothing/head/jobs.dm` +- `code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm` +- `code/modules/mob/dead/observer/observer_say.dm` +- `code/modules/mob/living/carbon/human/species_types/dullahan.dm` +- `code/modules/mob/living/silicon/ai/freelook/eye.dm` +- `code/modules/mob/living/living_say.dm` +- `code/modules/mod/mod_link.dm` +- `code/modules/projectiles/ammunition/_firing.dm` +- `code/modules/unit_tests/say.dm` +- `code/modules/wiremod/components/atom/hear.dm` +- `tgui/packages/tgui-panel/chat/constants.ts` +- `tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss` +- `tgui/packages/tgui-panel/styles/tgchat/chat-light.scss` +- `tgui/packages/tgui-say/styles/colors.scss` +- `tgui/packages/tgui-say/constants.ts` + +### Modular Overrides: + +- `modular_darkpack/master_files/code/game/objects/items/devices/radio/radio.dm` + +### Defines: + +- `code/__DEFINES/radio.dm` +- `code/__DEFINES/~darkpack/dcs/signals/signals_global.dm` +- `code/__DEFINES/~darkpack/crimes.dm` + +### Included files that are not contained in this module: + +- `tools/UpdatePaths/Scripts/DarkPack/432_radios.txt` + +### Credits: + +XeonMations diff --git a/modular_darkpack/modules/radios/sounds/panic.ogg b/modular_darkpack/modules/radios/sounds/panic.ogg new file mode 100644 index 000000000000..8eb1327f66e3 Binary files /dev/null and b/modular_darkpack/modules/radios/sounds/panic.ogg differ diff --git a/modular_darkpack/modules/radios/sounds/radio_off.ogg b/modular_darkpack/modules/radios/sounds/radio_off.ogg new file mode 100644 index 000000000000..9519416c87ab Binary files /dev/null and b/modular_darkpack/modules/radios/sounds/radio_off.ogg differ diff --git a/modular_darkpack/modules/radios/sounds/radio_on.ogg b/modular_darkpack/modules/radios/sounds/radio_on.ogg new file mode 100644 index 000000000000..95ef1128df3c Binary files /dev/null and b/modular_darkpack/modules/radios/sounds/radio_on.ogg differ diff --git a/modular_darkpack/modules/respawning/code/respawning.dm b/modular_darkpack/modules/respawning/code/respawning.dm deleted file mode 100644 index 5e2120fe682a..000000000000 --- a/modular_darkpack/modules/respawning/code/respawning.dm +++ /dev/null @@ -1,7 +0,0 @@ -// TODO: [Rebase] reimplement respawn timers -/mob/proc/can_respawn() - if (client?.ckey) - if (GLOB.respawn_timers[client.ckey]) - if ((GLOB.respawn_timers[client.ckey] + 10 MINUTES) > world.time) - return FALSE - return TRUE diff --git a/modular_darkpack/modules/respawning/code/respawning_globals.dm b/modular_darkpack/modules/respawning/code/respawning_globals.dm deleted file mode 100644 index ec43b62e053c..000000000000 --- a/modular_darkpack/modules/respawning/code/respawning_globals.dm +++ /dev/null @@ -1,4 +0,0 @@ -/// List of characters who have joined the round and not cryoed out -GLOBAL_LIST_EMPTY(fucking_joined) -/// Timers until people can respawn and re-enter the round -GLOBAL_LIST_EMPTY(respawn_timers) diff --git a/modular_darkpack/modules/retail/code/stores/antique_store.dm b/modular_darkpack/modules/retail/code/stores/antique_store.dm new file mode 100644 index 000000000000..14685095dbf1 --- /dev/null +++ b/modular_darkpack/modules/retail/code/stores/antique_store.dm @@ -0,0 +1,9 @@ +/obj/structure/retail/antique + desc = "A store where antique weapons are sold. Fedoras not included." + products_list = list( + new /datum/data/vending_product("katana", /obj/item/katana/vamp), + new /datum/data/vending_product("rapier", /obj/item/storage/belt/sheath/vamp/rapier), + new /datum/data/vending_product("spear", /obj/item/darkpack/spear), + new /datum/data/vending_product("sabre", /obj/item/storage/belt/sheath/vamp/sabre), + new /datum/data/vending_product("longsword", /obj/item/storage/belt/sheath/vamp/sword) + ) diff --git a/modular_darkpack/modules/retail/code/stores/black_market.dm b/modular_darkpack/modules/retail/code/stores/black_market.dm index d7589e4c9e3a..20ca6c5b2181 100644 --- a/modular_darkpack/modules/retail/code/stores/black_market.dm +++ b/modular_darkpack/modules/retail/code/stores/black_market.dm @@ -1,28 +1,28 @@ -// TODO: you should not be able to use credit here. -Fallcon +// DARKPACK TODO: you should not be able to use credit here. -Fallcon /obj/structure/retail/black_market products_list = list( - new /datum/data/vending_product("lighter", /obj/item/lighter/greyscale, 10), - new /datum/data/vending_product("zippo lighter", /obj/item/lighter, 20), - //new /datum/data/vending_product("Bailer", /obj/item/bailer, 20), - //new /datum/data/vending_product("Weed Seed", /obj/item/weedseed, 20), - //new /datum/data/vending_product("cannabis puff", /obj/item/clothing/mask/cigarette/rollie/cannabis, 40), - //new /datum/data/vending_product("bong", /obj/item/bong, 50), + new /datum/data/vending_product("lighter", /obj/item/lighter/greyscale, 10), + new /datum/data/vending_product("zippo lighter", /obj/item/lighter, 20), + new /datum/data/vending_product("Bailer", /obj/item/reagent_containers/cup/watering_can/metal, 20), + new /datum/data/vending_product("Weed Seed", /obj/item/seeds/cannabis, 20), + new /datum/data/vending_product("cannabis puff", /obj/item/cigarette/rollie/cannabis, 40), + new /datum/data/vending_product("bong", /obj/item/bong, 50), new /datum/data/vending_product("lockpick", /obj/item/vamp/keys/hack, 50), - new /datum/data/vending_product("LSD pill bottle", /obj/item/storage/pill_bottle/lsd, 50), - new /datum/data/vending_product("knife", /obj/item/knife/vamp, 85), + new /datum/data/vending_product("LSD pill bottle", /obj/item/storage/pill_bottle/lsd, 50), + new /datum/data/vending_product("knife", /obj/item/knife/vamp, 85), new /datum/data/vending_product("switchblade", /obj/item/switchblade/vamp, 85), - new /datum/data/vending_product("stake", /obj/item/vampire_stake, 100), + new /datum/data/vending_product("stake", /obj/item/vampire_stake, 100), new /datum/data/vending_product("Surgery dufflebag", /obj/item/storage/backpack/duffelbag/sec/surgery, 100), new /datum/data/vending_product("Handcuffs", /obj/item/restraints/handcuffs, 50), - //new /datum/data/vending_product("Black bag", /obj/item/clothing/head/vampire/blackbag, 50), - new /datum/data/vending_product("snub-nose revolver", /obj/item/gun/ballistic/revolver/darkpack/snub, 100), - //new /datum/data/vending_product("cannabis package", /obj/item/weedpack, 700), - new /datum/data/vending_product("morphine syringe", /obj/item/reagent_containers/syringe/contraband/morphine, 800), - new /datum/data/vending_product("meth package", /obj/item/reagent_containers/cup/glass/baggie/meth, 800), - new /datum/data/vending_product("cocaine package", /obj/item/reagent_containers/cup/glass/baggie/meth/cocaine, 800), - new /datum/data/vending_product("silver 9mm ammo", /obj/item/ammo_box/vampire/c9mm/silver, 5000), - new /datum/data/vending_product("silver .45 ACP ammo", /obj/item/ammo_box/vampire/c45acp/silver, 6000), - new /datum/data/vending_product("silver .44 ammo", /obj/item/ammo_box/vampire/c44/silver, 7000), - new /datum/data/vending_product("silver 5.56 ammo", /obj/item/ammo_box/vampire/c556/silver, 8000), - new /datum/data/vending_product("incendiary 5.56 ammo", /obj/item/ammo_box/vampire/c556/incendiary, 9000) + new /datum/data/vending_product("Black bag", /obj/item/clothing/head/vampire/blackbag, 50), + new /datum/data/vending_product("snub-nose revolver", /obj/item/gun/ballistic/revolver/darkpack/snub, 100), + new /datum/data/vending_product("cannabis package", /obj/item/food/grown/cannabis, 700), + new /datum/data/vending_product("morphine syringe", /obj/item/reagent_containers/syringe/contraband/morphine, 800), + new /datum/data/vending_product("meth package", /obj/item/reagent_containers/cup/glass/baggie/meth, 800), + new /datum/data/vending_product("cocaine package", /obj/item/reagent_containers/cup/glass/baggie/meth/cocaine, 800), + new /datum/data/vending_product("silver 9mm ammo", /obj/item/ammo_box/darkpack/c9mm/silver, 5000), + new /datum/data/vending_product("silver .45 ACP ammo", /obj/item/ammo_box/darkpack/c45acp/silver, 6000), + new /datum/data/vending_product("silver .44 ammo", /obj/item/ammo_box/darkpack/c44/silver, 7000), + new /datum/data/vending_product("silver 5.56 ammo", /obj/item/ammo_box/darkpack/c556/silver, 8000), + new /datum/data/vending_product("incendiary 5.56 ammo", /obj/item/ammo_box/darkpack/c556/incendiary, 9000) ) diff --git a/modular_darkpack/modules/retail/code/stores/camping_store.dm b/modular_darkpack/modules/retail/code/stores/camping_store.dm new file mode 100644 index 000000000000..ee8eb7578939 --- /dev/null +++ b/modular_darkpack/modules/retail/code/stores/camping_store.dm @@ -0,0 +1,24 @@ +/obj/structure/retail/camping + desc = "A store for camping supplies. Smores not included." + products_list = list( + new /datum/data/vending_product("camera film", /obj/item/camera_film), + new /datum/data/vending_product("hunting knife", /obj/item/knife/vamp), + new /datum/data/vending_product("tent stake", /obj/item/vampire_stake), + new /datum/data/vending_product("shovel", /obj/item/shovel/vamp), + new /datum/data/vending_product("fishing rod", /obj/item/fishing_rod), + new /datum/data/vending_product("hunting rifle magazine, 5.56",/obj/item/ammo_box/magazine/darkpack556/hunt), + new /datum/data/vending_product("pepperspray", /obj/item/reagent_containers/spray/pepper), + new /datum/data/vending_product("SNEKTEK Handheld Taser", /obj/item/melee/baton/security/handtaser), + new /datum/data/vending_product("beretta magazine", /obj/item/ammo_box/magazine/semi9mm), + new /datum/data/vending_product("binoculars", /obj/item/binoculars), + new /datum/data/vending_product("camera", /obj/item/camera), + new /datum/data/vending_product("9mm ammo box", /obj/item/ammo_box/darkpack/c9mm), + new /datum/data/vending_product("12ga shotgun shells, buckshot",/obj/item/ammo_box/darkpack/c12g/buck), + new /datum/data/vending_product("machete", /obj/item/claymore/machete), + new /datum/data/vending_product("hunting shotgun", /obj/item/gun/ballistic/shotgun/vampire), + new /datum/data/vending_product("beretta handgun", /obj/item/gun/ballistic/automatic/pistol/darkpack/beretta), + new /datum/data/vending_product("rescue fireaxe", /obj/item/fireaxe/vamp), + new /datum/data/vending_product("chainsaw", /obj/item/chainsaw/vamp), + new /datum/data/vending_product("hunting rifle", /obj/item/gun/ballistic/automatic/darkpack/huntrifle), + new /datum/data/vending_product("5.56 ammo", /obj/item/ammo_box/darkpack/c556), + ) diff --git a/modular_darkpack/modules/retail/code/stores/clothing_store.dm b/modular_darkpack/modules/retail/code/stores/clothing_store.dm index 104825043c0a..f4bb12163c40 100644 --- a/modular_darkpack/modules/retail/code/stores/clothing_store.dm +++ b/modular_darkpack/modules/retail/code/stores/clothing_store.dm @@ -95,7 +95,7 @@ new /datum/data/vending_product("blue scarf", /obj/item/clothing/neck/vampire/scarf/blue, 10), new /datum/data/vending_product("green scarf", /obj/item/clothing/neck/vampire/scarf/green, 10), new /datum/data/vending_product("white scarf", /obj/item/clothing/neck/vampire/scarf/white, 10), - //new /datum/data/vending_product("cross", /obj/item/card/id/hunter, 25), + new /datum/data/vending_product("cross", /obj/item/card/hunter, 25), new /datum/data/vending_product("duffelbag", /obj/item/storage/backpack/duffelbag, 100), new /datum/data/vending_product("backpack", /obj/item/storage/backpack, 100), new /datum/data/vending_product("satchel", /obj/item/storage/backpack/satchel, 100), diff --git a/modular_darkpack/modules/retail/code/stores/costume_store.dm b/modular_darkpack/modules/retail/code/stores/costume_store.dm index ac21ee1c7ea2..5bfd7082d2fa 100644 --- a/modular_darkpack/modules/retail/code/stores/costume_store.dm +++ b/modular_darkpack/modules/retail/code/stores/costume_store.dm @@ -1,26 +1,26 @@ /obj/structure/retail/costume_store desc = "Purchase a mask for that ugly mug." products_list = list( - new /datum/data/vending_product("balaclava", /obj/item/clothing/mask/vampire/balaclava, 10), - new /datum/data/vending_product("bear mask", /obj/item/clothing/mask/animal/small/bear, 13), - new /datum/data/vending_product("rat mask", /obj/item/clothing/mask/animal/small/rat, 10), - new /datum/data/vending_product("bee mask", /obj/item/clothing/mask/animal/small/bee, 12), - new /datum/data/vending_product("fox mask", /obj/item/clothing/mask/animal/small/fox, 10), - new /datum/data/vending_product("bat mask", /obj/item/clothing/mask/animal/small/bat, 15), - new /datum/data/vending_product("raven mask", /obj/item/clothing/mask/animal/small/raven, 20), - new /datum/data/vending_product("jackal mask", /obj/item/clothing/mask/animal/small/jackal, 20), - new /datum/data/vending_product("medical mask", /obj/item/clothing/mask/surgical, 10), - new /datum/data/vending_product("mummy mask", /obj/item/clothing/mask/mummy, 15), - new /datum/data/vending_product("scarecrow mask", /obj/item/clothing/mask/scarecrow, 10), - new /datum/data/vending_product("respirator", /obj/item/clothing/mask/vampire, 35), - new /datum/data/vending_product("black and gold luchador mask", /obj/item/clothing/mask/luchador, 10), - new /datum/data/vending_product("green luchador mask", /obj/item/clothing/mask/luchador/tecnicos, 10), - new /datum/data/vending_product("red and blue luchador mask", /obj/item/clothing/mask/luchador/rudos, 10), - new /datum/data/vending_product("Venetian mask", /obj/item/clothing/mask/vampire/venetian_mask, 30), - new /datum/data/vending_product("fancy Venetian mask", /obj/item/clothing/mask/vampire/venetian_mask/fancy, 200), - new /datum/data/vending_product("jester mask", /obj/item/clothing/mask/vampire/venetian_mask/jester, 50), - new /datum/data/vending_product("bloody mask", /obj/item/clothing/mask/vampire/venetian_mask/scary, 30), - new /datum/data/vending_product("comedy mask", /obj/item/clothing/mask/vampire/comedy, 25), - new /datum/data/vending_product("tragedy mask", /obj/item/clothing/mask/vampire/tragedy, 25), - new /datum/data/vending_product("shemagh", /obj/item/clothing/mask/vampire/shemagh, 20), + new /datum/data/vending_product("balaclava", /obj/item/clothing/mask/vampire/balaclava, 10), + new /datum/data/vending_product("bear mask", /obj/item/clothing/mask/animal/small/bear, 13), + new /datum/data/vending_product("rat mask", /obj/item/clothing/mask/animal/small/rat, 10), + new /datum/data/vending_product("bee mask", /obj/item/clothing/mask/animal/small/bee, 12), + new /datum/data/vending_product("fox mask", /obj/item/clothing/mask/animal/small/fox, 10), + new /datum/data/vending_product("bat mask", /obj/item/clothing/mask/animal/small/bat, 15), + new /datum/data/vending_product("raven mask", /obj/item/clothing/mask/animal/small/raven, 20), + new /datum/data/vending_product("jackal mask", /obj/item/clothing/mask/animal/small/jackal, 20), + new /datum/data/vending_product("medical mask", /obj/item/clothing/mask/surgical, 10), + new /datum/data/vending_product("mummy mask", /obj/item/clothing/mask/mummy, 15), + new /datum/data/vending_product("scarecrow mask", /obj/item/clothing/mask/scarecrow, 10), + new /datum/data/vending_product("respirator", /obj/item/clothing/mask/gas/vampire), + new /datum/data/vending_product("black and gold luchador mask", /obj/item/clothing/mask/luchador, 10), + new /datum/data/vending_product("green luchador mask", /obj/item/clothing/mask/luchador/tecnicos, 10), + new /datum/data/vending_product("red and blue luchador mask", /obj/item/clothing/mask/luchador/rudos, 10), + new /datum/data/vending_product("Venetian mask", /obj/item/clothing/mask/vampire/venetian_mask, 30), + new /datum/data/vending_product("fancy Venetian mask", /obj/item/clothing/mask/vampire/venetian_mask/fancy, 200), + new /datum/data/vending_product("jester mask", /obj/item/clothing/mask/vampire/venetian_mask/jester, 50), + new /datum/data/vending_product("bloody mask", /obj/item/clothing/mask/vampire/venetian_mask/scary, 30), + new /datum/data/vending_product("comedy mask", /obj/item/clothing/mask/vampire/comedy, 25), + new /datum/data/vending_product("tragedy mask", /obj/item/clothing/mask/vampire/tragedy, 25), + new /datum/data/vending_product("shemagh", /obj/item/clothing/mask/vampire/shemagh, 20), ) diff --git a/modular_darkpack/modules/retail/code/stores/flower_shop.dm b/modular_darkpack/modules/retail/code/stores/flower_shop.dm index 0e155af894f6..5bf443250d2a 100644 --- a/modular_darkpack/modules/retail/code/stores/flower_shop.dm +++ b/modular_darkpack/modules/retail/code/stores/flower_shop.dm @@ -2,17 +2,17 @@ name = "Community Garden" desc = "The only 24hr flower shop in SanFran." products_list = list( - new /datum/data/vending_product("Gardening Gloves", /obj/item/clothing/gloves/botanic_leather, 45), - new /datum/data/vending_product("Respirator", /obj/item/clothing/mask/vampire, 35), - new /datum/data/vending_product("Plant Bag", /obj/item/storage/bag/plants, 45), - new /datum/data/vending_product("Basic Fertilizer", /obj/item/reagent_containers/cup/bottle/nutrient/ez, 100), - new /datum/data/vending_product("Herbicide", /obj/item/reagent_containers/spray/weedspray, 25), - new /datum/data/vending_product("Pesticide", /obj/item/reagent_containers/spray/pestspray, 25), - new /datum/data/vending_product("Spade", /obj/item/shovel/spade, 100), - new /datum/data/vending_product("Wooden Bucket", /obj/item/reagent_containers/cup/bucket/wooden, 100), - new /datum/data/vending_product("Secateurs", /obj/item/secateurs, 100), - new /datum/data/vending_product("Garden Rake", /obj/item/cultivator/rake, 100), - new /datum/data/vending_product("Cultivator", /obj/item/cultivator, 100), + new /datum/data/vending_product("Gardening Gloves", /obj/item/clothing/gloves/botanic_leather, 45), + new /datum/data/vending_product("respirator", /obj/item/clothing/mask/gas/vampire), + new /datum/data/vending_product("Plant Bag", /obj/item/storage/bag/plants, 45), + new /datum/data/vending_product("Basic Fertilizer", /obj/item/reagent_containers/cup/bottle/nutrient/ez, 100), + new /datum/data/vending_product("Herbicide", /obj/item/reagent_containers/spray/weedspray, 25), + new /datum/data/vending_product("Pesticide", /obj/item/reagent_containers/spray/pestspray, 25), + new /datum/data/vending_product("Spade", /obj/item/shovel/spade, 100), + new /datum/data/vending_product("Wooden Bucket", /obj/item/reagent_containers/cup/bucket/wooden, 100), + new /datum/data/vending_product("Secateurs", /obj/item/secateurs, 100), + new /datum/data/vending_product("Garden Rake", /obj/item/cultivator/rake, 100), + new /datum/data/vending_product("Cultivator", /obj/item/cultivator, 100), new /datum/data/vending_product("Poppy seeds", /obj/item/seeds/poppy, 50), new /datum/data/vending_product("Sunflower seeds", /obj/item/seeds/sunflower, 50), new /datum/data/vending_product("Geranium seeds", /obj/item/seeds/poppy/geranium, 50), @@ -33,4 +33,6 @@ new /datum/data/vending_product("Soy seeds", /obj/item/seeds/soya, 50), new /datum/data/vending_product("Tomato seeds", /obj/item/seeds/tomato, 50), new /datum/data/vending_product("Fermentation Barrel", /obj/structure/fermenting_barrel, 230), + new /datum/data/vending_product("Soil sack", /obj/item/soil_sack), + new /datum/data/vending_product("Rich soil sack", /obj/item/soil_sack/rich), ) diff --git a/modular_darkpack/modules/retail/code/stores/gas_station.dm b/modular_darkpack/modules/retail/code/stores/gas_station.dm index 94ef8d1de64c..584b23385b40 100644 --- a/modular_darkpack/modules/retail/code/stores/gas_station.dm +++ b/modular_darkpack/modules/retail/code/stores/gas_station.dm @@ -1,26 +1,26 @@ /obj/structure/retail/gas_station products_list = list( - //new /datum/data/vending_product("full gas can", /obj/item/gas_can/full, 250), - new /datum/data/vending_product("tire iron", /obj/item/melee/vamp/tire, 50), + new /datum/data/vending_product("full gas can", /obj/item/gas_can/full, 250), + new /datum/data/vending_product("tire iron", /obj/item/melee/vamp/tire, 50), new /datum/data/vending_product("spray paint", /obj/item/toy/crayon/spraycan, 25), new /datum/data/vending_product("hair spray", /obj/item/dyespray, 10), - new /datum/data/vending_product("malboro", /obj/item/storage/fancy/cigarettes/cigpack_robust, 50), - new /datum/data/vending_product("malboro gold", /obj/item/storage/fancy/cigarettes/cigpack_robustgold, 80), - new /datum/data/vending_product("newport", /obj/item/storage/fancy/cigarettes/cigpack_xeno, 30), - new /datum/data/vending_product("camel", /obj/item/storage/fancy/cigarettes/dromedaryco, 30), - new /datum/data/vending_product("zippo lighter", /obj/item/lighter, 20), - new /datum/data/vending_product("lighter", /obj/item/lighter/greyscale, 10), + new /datum/data/vending_product("malboro", /obj/item/storage/fancy/cigarettes/cigpack_robust, 50), + new /datum/data/vending_product("malboro gold", /obj/item/storage/fancy/cigarettes/cigpack_robustgold, 80), + new /datum/data/vending_product("newport", /obj/item/storage/fancy/cigarettes/cigpack_xeno, 30), + new /datum/data/vending_product("camel", /obj/item/storage/fancy/cigarettes/dromedaryco, 30), + new /datum/data/vending_product("zippo lighter", /obj/item/lighter, 20), + new /datum/data/vending_product("lighter", /obj/item/lighter/greyscale, 10), new /datum/data/vending_product("chocolate bar", /obj/item/food/chocolatebar), - new /datum/data/vending_product("chips", /obj/item/food/vampire/crisps), + new /datum/data/vending_product("chips", /obj/item/food/chips), new /datum/data/vending_product("water bottle", /obj/item/reagent_containers/cup/glass/vampirewater), new /datum/data/vending_product("soda can", /obj/item/reagent_containers/cup/soda_cans/vampiresoda), new /datum/data/vending_product("two liter cola bottle", /obj/item/reagent_containers/cup/glass/vampirecola), new /datum/data/vending_product("cola can", /obj/item/reagent_containers/cup/soda_cans/vampirecola), new /datum/data/vending_product("summer thaw", /obj/item/reagent_containers/cup/soda_cans/summer_thaw), - new /datum/data/vending_product("milk", /obj/item/reagent_containers/condiment/milk, 5), - new /datum/data/vending_product("beer bottle", /obj/item/reagent_containers/cup/glass/bottle/beer/vampire, 10), - new /datum/data/vending_product("blue stripe", /obj/item/reagent_containers/cup/glass/bottle/beer/vampire/blue_stripe, 8), - new /datum/data/vending_product("candle pack", /obj/item/storage/fancy/candle_box, 12), - new /datum/data/vending_product("bruise pack", /obj/item/stack/medical/bruise_pack, 100), - new /datum/data/vending_product("respirator", /obj/item/clothing/mask/vampire, 35) + new /datum/data/vending_product("milk", /obj/item/reagent_containers/condiment/milk), + new /datum/data/vending_product("beer bottle", /obj/item/reagent_containers/cup/glass/bottle/beer/vampire), + new /datum/data/vending_product("blue stripe", /obj/item/reagent_containers/cup/glass/bottle/beer/vampire/blue_stripe), + new /datum/data/vending_product("candle pack", /obj/item/storage/fancy/candle_box, 12), + new /datum/data/vending_product("bruise pack", /obj/item/stack/medical/bruise_pack), + new /datum/data/vending_product("respirator", /obj/item/clothing/mask/gas/vampire) ) diff --git a/modular_darkpack/modules/retail/code/stores/general_store.dm b/modular_darkpack/modules/retail/code/stores/general_store.dm new file mode 100644 index 000000000000..0742e4ceda96 --- /dev/null +++ b/modular_darkpack/modules/retail/code/stores/general_store.dm @@ -0,0 +1,24 @@ +/obj/structure/retail/general + desc = "A general store for general needs." + products_list = list( + new /datum/data/vending_product("damp cleaning rag", /obj/item/rag), + new /datum/data/vending_product("cassette tapes", /obj/item/tape), + new /datum/data/vending_product("flashlight", /obj/item/flashlight), + new /datum/data/vending_product("cleaning mop", /obj/item/mop), + new /datum/data/vending_product("plastic bucket", /obj/item/reagent_containers/cup/bucket), + new /datum/data/vending_product("push broom", /obj/item/pushbroom), + new /datum/data/vending_product("plastic trash bags", /obj/item/storage/bag/trash), + new /datum/data/vending_product("screwdriver", /obj/item/screwdriver), + new /datum/data/vending_product("crowbar", /obj/item/crowbar), + new /datum/data/vending_product("wrench", /obj/item/wrench), + new /datum/data/vending_product("wirecutters", /obj/item/wirecutters), + new /datum/data/vending_product("handheld welder", /obj/item/weldingtool), + new /datum/data/vending_product("toner cartridge", /obj/item/toner/large), + new /datum/data/vending_product("construction hard hat", /obj/item/clothing/head/vampire/hardhat), + new /datum/data/vending_product("shaving razor", /obj/item/razor), + new /datum/data/vending_product("tape recorder", /obj/item/taperecorder), + new /datum/data/vending_product("baseball bat", /obj/item/melee/baseball_bat/vamp), + new /datum/data/vending_product("prepaid cell phone", /obj/item/smartphone), + new /datum/data/vending_product("box of light bulbs", /obj/item/storage/box/lights/mixed, 100), // price is different between hardware and general store + new /datum/data/vending_product("insulated gloves", /obj/item/clothing/gloves/color/yellow), + ) diff --git a/modular_darkpack/modules/retail/code/stores/grocery_store.dm b/modular_darkpack/modules/retail/code/stores/grocery_store.dm index 8ef586597c09..310937e00137 100644 --- a/modular_darkpack/modules/retail/code/stores/grocery_store.dm +++ b/modular_darkpack/modules/retail/code/stores/grocery_store.dm @@ -2,7 +2,7 @@ desc = "A small grocery store." products_list = list( new /datum/data/vending_product("chocolate bar", /obj/item/food/chocolatebar), - new /datum/data/vending_product("chips", /obj/item/food/vampire/crisps), + new /datum/data/vending_product("chips", /obj/item/food/chips), new /datum/data/vending_product("water bottle", /obj/item/reagent_containers/cup/glass/vampirewater), new /datum/data/vending_product("soda can", /obj/item/reagent_containers/cup/soda_cans/vampiresoda), new /datum/data/vending_product("two liter cola bottle", /obj/item/reagent_containers/cup/glass/vampirecola), diff --git a/modular_darkpack/modules/retail/code/stores/gun_store.dm b/modular_darkpack/modules/retail/code/stores/gun_store.dm index 52e457d1236d..2425998d3bb5 100644 --- a/modular_darkpack/modules/retail/code/stores/gun_store.dm +++ b/modular_darkpack/modules/retail/code/stores/gun_store.dm @@ -1,26 +1,25 @@ /obj/structure/retail/gun_store desc = "Boom! Booom!! BOOOOOOM!!!!" - products_list = list(new /datum/data/vending_product("magnum revolver", /obj/item/gun/ballistic/revolver/darkpack/magnum, 200), - new /datum/data/vending_product("Colt M1911", /obj/item/gun/ballistic/automatic/pistol/darkpack/m1911, 250), - new /datum/data/vending_product("Elite 92G", /obj/item/gun/ballistic/automatic/pistol/darkpack/beretta, 500), - new /datum/data/vending_product("desert eagle", /obj/item/gun/ballistic/automatic/pistol/darkpack/deagle, 600), + products_list = list(new /datum/data/vending_product("magnum revolver", /obj/item/gun/ballistic/revolver/darkpack/magnum, 200), + new /datum/data/vending_product("Colt M1911", /obj/item/gun/ballistic/automatic/pistol/darkpack/m1911, 250), + new /datum/data/vending_product("Elite 92G", /obj/item/gun/ballistic/automatic/pistol/darkpack/beretta, 500), + new /datum/data/vending_product("desert eagle", /obj/item/gun/ballistic/automatic/pistol/darkpack/deagle, 600), new /datum/data/vending_product("hunting rifle", /obj/item/gun/ballistic/automatic/darkpack/huntrifle, 2000), - new /datum/data/vending_product("fishing rod", /obj/item/fishing_rod, 200), - new /datum/data/vending_product("5.45 ammo", /obj/item/ammo_box/vampire/c545, 1000), - new /datum/data/vending_product(".45 ACP ammo", /obj/item/ammo_box/vampire/c45acp, 2100), - new /datum/data/vending_product("9mm ammo", /obj/item/ammo_box/vampire/c9mm, 600), - new /datum/data/vending_product(".44 ammo", /obj/item/ammo_box/vampire/c44, 800), - new /datum/data/vending_product("5.56 ammo", /obj/item/ammo_box/vampire/c556, 2000), + new /datum/data/vending_product("5.45 ammo", /obj/item/ammo_box/darkpack/c545, 1000), + new /datum/data/vending_product(".45 ACP ammo", /obj/item/ammo_box/darkpack/c45acp, 2100), + new /datum/data/vending_product("9mm ammo", /obj/item/ammo_box/darkpack/c9mm, 600), + new /datum/data/vending_product(".44 ammo", /obj/item/ammo_box/darkpack/c44, 800), + new /datum/data/vending_product("5.56 ammo", /obj/item/ammo_box/darkpack/c556, 2000), new /datum/data/vending_product("shotgun", /obj/item/gun/ballistic/shotgun/vampire, 900), - new /datum/data/vending_product("12ga shotgun shells, buckshot", /obj/item/ammo_box/vampire/c12g/buck, 400), - new /datum/data/vending_product("desert eagle magazine", /obj/item/ammo_box/magazine/m44, 100), - new /datum/data/vending_product("hunting rifle magazine, 5.56", /obj/item/ammo_box/magazine/darkpack556/hunt, 200), - new /datum/data/vending_product("9mm pistol magazine, 18 rounds", /obj/item/ammo_box/magazine/semi9mm, 100), - new /datum/data/vending_product("Colt M1911 magazine", /obj/item/ammo_box/magazine/darkpack45acp, 50), - new /datum/data/vending_product("knife", /obj/item/knife/vamp, 100), + new /datum/data/vending_product("12ga shotgun shells, buckshot", /obj/item/ammo_box/darkpack/c12g/buck, 400), + new /datum/data/vending_product("desert eagle magazine", /obj/item/ammo_box/magazine/m44, 100), + new /datum/data/vending_product("hunting rifle magazine, 5.56", /obj/item/ammo_box/magazine/darkpack556/hunt, 200), + new /datum/data/vending_product("9mm pistol magazine, 18 rounds", /obj/item/ammo_box/magazine/semi9mm, 100), + new /datum/data/vending_product("Colt M1911 magazine", /obj/item/ammo_box/magazine/darkpack45acp, 50), + new /datum/data/vending_product("knife", /obj/item/knife/vamp, 100), new /datum/data/vending_product("baseball bat", /obj/item/melee/baseball_bat/vamp, 200), - new /datum/data/vending_product("real katana", /obj/item/katana/vamp, 1500), + new /datum/data/vending_product("real katana", /obj/item/katana/vamp, 1500), new /datum/data/vending_product("machete", /obj/item/claymore/machete, 500), - //new /datum/data/vending_product("taser", /obj/item/melee/baton/handtaser, 250), + new /datum/data/vending_product("taser", /obj/item/melee/baton/security/handtaser, 250), new /datum/data/vending_product("pepperspray", /obj/item/reagent_containers/spray/pepper, 200), ) diff --git a/modular_darkpack/modules/retail/code/stores/hardware_store.dm b/modular_darkpack/modules/retail/code/stores/hardware_store.dm index 288c626f5b25..fdfa347bcdc6 100644 --- a/modular_darkpack/modules/retail/code/stores/hardware_store.dm +++ b/modular_darkpack/modules/retail/code/stores/hardware_store.dm @@ -1,11 +1,12 @@ /obj/structure/retail/hardware_store products_list = list( - //new /datum/data/vending_product("full gas can", /obj/item/gas_can/full, 250), - new /datum/data/vending_product("tire iron", /obj/item/melee/vamp/tire, 50), + new /datum/data/vending_product("full gas can", /obj/item/gas_can/full, 250), + new /datum/data/vending_product("tire iron", /obj/item/melee/vamp/tire, 50), new /datum/data/vending_product("lockpick", /obj/item/vamp/keys/hack, 50), - new /datum/data/vending_product("respirator", /obj/item/clothing/mask/vampire, 35), - new /datum/data/vending_product("baseball bat", /obj/item/melee/baseball_bat/vamp, 200), - new /datum/data/vending_product("knife", /obj/item/knife/vamp, 100), - new /datum/data/vending_product("fishing rod", /obj/item/fishing_rod, 200), - new /datum/data/vending_product("stake", /obj/item/vampire_stake, 100) + new /datum/data/vending_product("respirator", /obj/item/clothing/mask/gas/vampire), + new /datum/data/vending_product("baseball bat", /obj/item/melee/baseball_bat/vamp, 200), + new /datum/data/vending_product("knife", /obj/item/knife/vamp, 100), + new /datum/data/vending_product("fishing rod", /obj/item/fishing_rod, 200), + new /datum/data/vending_product("stake", /obj/item/vampire_stake, 100), + new /datum/data/vending_product("box of light bulbs", /obj/item/storage/box/lights/mixed, 80), ) diff --git a/modular_darkpack/modules/retail/code/stores/hot_ishu.dm b/modular_darkpack/modules/retail/code/stores/hot_ishu.dm index 781f82fe535a..9dc9793f197d 100644 --- a/modular_darkpack/modules/retail/code/stores/hot_ishu.dm +++ b/modular_darkpack/modules/retail/code/stores/hot_ishu.dm @@ -1,7 +1,7 @@ /obj/structure/retail/hot_ishu products_list = list( - //new /datum/data/vending_product("\"Vase\"", /obj/item/bong, 50), - //new /datum/data/vending_product("cross", /obj/item/card/id/hunter, 25), + new /datum/data/vending_product("\"Vase\"", /obj/item/bong, 50), + new /datum/data/vending_product("cross", /obj/item/card/hunter, 25), new /datum/data/vending_product("backpack", /obj/item/storage/backpack, 100), new /datum/data/vending_product("black grunge outfit", /obj/item/clothing/under/vampire/black, 20), new /datum/data/vending_product("burlesque outfit", /obj/item/clothing/under/vampire/burlesque, 15), diff --git a/modular_darkpack/modules/retail/code/stores/junkfood_menu.dm b/modular_darkpack/modules/retail/code/stores/junkfood_menu.dm index f4f13e5a3790..3714d3bb40e5 100644 --- a/modular_darkpack/modules/retail/code/stores/junkfood_menu.dm +++ b/modular_darkpack/modules/retail/code/stores/junkfood_menu.dm @@ -3,16 +3,16 @@ desc = "Purchase junkfood and crap." products_list = list( new /datum/data/vending_product("chocolate bar", /obj/item/food/chocolatebar), - new /datum/data/vending_product("chips", /obj/item/food/vampire/crisps), + new /datum/data/vending_product("chips", /obj/item/food/chips), new /datum/data/vending_product("water bottle", /obj/item/reagent_containers/cup/glass/vampirewater), new /datum/data/vending_product("soda can", /obj/item/reagent_containers/cup/soda_cans/vampiresoda), new /datum/data/vending_product("two liter cola bottle", /obj/item/reagent_containers/cup/glass/vampirecola), new /datum/data/vending_product("cola can", /obj/item/reagent_containers/cup/soda_cans/vampirecola), new /datum/data/vending_product("summer thaw", /obj/item/reagent_containers/cup/soda_cans/summer_thaw), - new /datum/data/vending_product("milk", /obj/item/reagent_containers/condiment/milk, 5), - new /datum/data/vending_product("beer bottle", /obj/item/reagent_containers/cup/glass/bottle/beer/vampire, 10), - new /datum/data/vending_product("blue stripe", /obj/item/reagent_containers/cup/glass/bottle/beer/vampire/blue_stripe, 8), - new /datum/data/vending_product("candle pack", /obj/item/storage/fancy/candle_box, 12), - new /datum/data/vending_product("bruise pack", /obj/item/stack/medical/bruise_pack, 100), - new /datum/data/vending_product("respirator", /obj/item/clothing/mask/vampire, 35) + new /datum/data/vending_product("milk", /obj/item/reagent_containers/condiment/milk), + new /datum/data/vending_product("beer bottle", /obj/item/reagent_containers/cup/glass/bottle/beer/vampire), + new /datum/data/vending_product("blue stripe", /obj/item/reagent_containers/cup/glass/bottle/beer/vampire/blue_stripe), + new /datum/data/vending_product("candle pack", /obj/item/storage/fancy/candle_box), + new /datum/data/vending_product("bruise pack", /obj/item/stack/medical/bruise_pack), + new /datum/data/vending_product("respirator", /obj/item/clothing/mask/gas/vampire) ) diff --git a/modular_darkpack/modules/retail/code/stores/library.dm b/modular_darkpack/modules/retail/code/stores/library.dm index 0cfee42d5f2e..35e73e71da31 100644 --- a/modular_darkpack/modules/retail/code/stores/library.dm +++ b/modular_darkpack/modules/retail/code/stores/library.dm @@ -1,7 +1,7 @@ /obj/structure/retail/library products_list = list( - //new /datum/data/vending_product("Bible", /obj/item/storage/book/bible, 20), - //new /datum/data/vending_product("Quran", /obj/item/vampirebook/quran, 20), + new /datum/data/vending_product("Bible", /obj/item/book/bible, 20), + new /datum/data/vending_product("Quran", /obj/item/vampirebook/quran, 20), new /datum/data/vending_product("black pen", /obj/item/pen, 5), new /datum/data/vending_product("four-color pen", /obj/item/pen/fourcolor, 10), new /datum/data/vending_product("fountain pen", /obj/item/pen/fountain, 15), diff --git a/modular_darkpack/modules/retail/code/stores/music_store.dm b/modular_darkpack/modules/retail/code/stores/music_store.dm new file mode 100644 index 000000000000..1be633d08995 --- /dev/null +++ b/modular_darkpack/modules/retail/code/stores/music_store.dm @@ -0,0 +1,15 @@ +/obj/structure/retail/music + desc = "A music store. If you play Stairway to Heaven..." + products_list = list( + new /datum/data/vending_product("accordian", /obj/item/instrument/accordion), + new /datum/data/vending_product("electric guitar", /obj/item/instrument/eguitar), + new /datum/data/vending_product("accoustic guitar", /obj/item/instrument/guitar), + new /datum/data/vending_product("hands free harmonica", /obj/item/instrument/harmonica), + new /datum/data/vending_product("saxophone", /obj/item/instrument/saxophone), + new /datum/data/vending_product("trombone", /obj/item/instrument/trombone), + new /datum/data/vending_product("violin", /obj/item/instrument/violin), + new /datum/data/vending_product("banjo", /obj/item/instrument/banjo), + new /datum/data/vending_product("electronic synth", /obj/item/instrument/piano_synth), + new /datum/data/vending_product("recorder", /obj/item/instrument/recorder), + new /datum/data/vending_product("glockeenspiel", /obj/item/instrument/glockenspiel) + ) diff --git a/modular_darkpack/modules/retail/code/stores/pharmacy.dm b/modular_darkpack/modules/retail/code/stores/pharmacy.dm index bf71a18f49b9..e82bc67eb947 100644 --- a/modular_darkpack/modules/retail/code/stores/pharmacy.dm +++ b/modular_darkpack/modules/retail/code/stores/pharmacy.dm @@ -1,10 +1,12 @@ /obj/structure/retail/pharmacy products_list = list( - new /datum/data/vending_product("bruise pack", /obj/item/stack/medical/bruise_pack, 100), - new /datum/data/vending_product("burn ointment", /obj/item/stack/medical/ointment, 100), + new /datum/data/vending_product("bruise pack", /obj/item/stack/medical/bruise_pack), + new /datum/data/vending_product("burn ointment", /obj/item/stack/medical/ointment), new /datum/data/vending_product("potassium iodide pill bottle", /obj/item/storage/pill_bottle/potassiodide, 100), new /datum/data/vending_product("latex gloves", /obj/item/clothing/gloves/vampire/latex, 150), new /datum/data/vending_product("iron pill bottle", /obj/item/storage/pill_bottle/iron, 150), - //new /datum/data/vending_product("ephedrine pill bottle", /obj/item/storage/pill_bottle/ephedrine, 200), - new /datum/data/vending_product("box of syringes", /obj/item/storage/box/syringes, 300) + new /datum/data/vending_product("inhaler canister", /obj/item/reagent_containers/inhaler_canister/albuterol/asthma, 150), + new /datum/data/vending_product("ephedrine pill bottle", /obj/item/storage/pill_bottle/ephedrine, 200), + new /datum/data/vending_product("box of syringes", /obj/item/storage/box/syringes, 300), + new /datum/data/vending_product("inhaler", /obj/item/inhaler/albuterol/asthma, 400) ) diff --git a/modular_darkpack/modules/retail/code/stores/skate_shop.dm b/modular_darkpack/modules/retail/code/stores/skate_shop.dm new file mode 100644 index 000000000000..6c105f6d1dd0 --- /dev/null +++ b/modular_darkpack/modules/retail/code/stores/skate_shop.dm @@ -0,0 +1,8 @@ +/obj/structure/retail/skate_shop + products_list = list( + new /datum/data/vending_product("skateboard", /obj/item/melee/skateboard), + new /datum/data/vending_product("cheap skateboard", /obj/item/melee/skateboard/improvised), + new /datum/data/vending_product("pro skateboard", /obj/item/melee/skateboard/pro), + new /datum/data/vending_product("rollershoes", /obj/item/clothing/shoes/wheelys), + new /datum/data/vending_product("rollerskates", /obj/item/clothing/shoes/wheelys/rollerskates) + ) diff --git a/modular_darkpack/modules/retail/code/stores/smoke_menu.dm b/modular_darkpack/modules/retail/code/stores/smoke_menu.dm index 7aa5a7855cd1..87383a4b3b70 100644 --- a/modular_darkpack/modules/retail/code/stores/smoke_menu.dm +++ b/modular_darkpack/modules/retail/code/stores/smoke_menu.dm @@ -1,8 +1,9 @@ // Use /obj/structure/retail/gas_station unless you really only want smokes /obj/structure/retail/smoke_menu - products_list = list(new /datum/data/vending_product("malboro", /obj/item/storage/fancy/cigarettes/cigpack_robust, 50), - new /datum/data/vending_product("newport", /obj/item/storage/fancy/cigarettes/cigpack_xeno, 30), - new /datum/data/vending_product("camel", /obj/item/storage/fancy/cigarettes/dromedaryco, 30), - new /datum/data/vending_product("zippo lighter", /obj/item/lighter, 20), - new /datum/data/vending_product("lighter", /obj/item/lighter/greyscale, 10) + products_list = list( + new /datum/data/vending_product("malboro", /obj/item/storage/fancy/cigarettes/cigpack_robust, 50), + new /datum/data/vending_product("newport", /obj/item/storage/fancy/cigarettes/cigpack_xeno, 30), + new /datum/data/vending_product("camel", /obj/item/storage/fancy/cigarettes/dromedaryco, 30), + new /datum/data/vending_product("zippo lighter", /obj/item/lighter, 20), + new /datum/data/vending_product("lighter", /obj/item/lighter/greyscale, 10) ) diff --git a/modular_darkpack/modules/retail/code/vending_product.dm b/modular_darkpack/modules/retail/code/vending_product.dm index ead8aa8ad525..44c37954bf53 100644 --- a/modular_darkpack/modules/retail/code/vending_product.dm +++ b/modular_darkpack/modules/retail/code/vending_product.dm @@ -12,7 +12,7 @@ CRASH("Retail product equipment path of [product_path] is not a valid path!") if(!price) - src.price = item.custom_price + src.price = item.custom_price || item.custom_premium_price var/icon_file = initial(item.icon) var/icon_state = initial(item.icon_state) diff --git a/modular_darkpack/modules/retail/icons/vendors_shops.dmi b/modular_darkpack/modules/retail/icons/vendors_shops.dmi index 8b02bb88953c..ca2d28f94424 100644 Binary files a/modular_darkpack/modules/retail/icons/vendors_shops.dmi and b/modular_darkpack/modules/retail/icons/vendors_shops.dmi differ diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/abyss_rune_drawing_action.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/abyss_rune_drawing_action.dm new file mode 100644 index 000000000000..6a21c16c046c --- /dev/null +++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/abyss_rune_drawing_action.dm @@ -0,0 +1,6 @@ +/datum/action/ritual_drawing/mysticism + name = "Mysticism" + desc = "Abyss Mysticism rune drawing." + button_icon_state = "mysticism" + rune_type = /obj/ritual_rune/abyss + tome_type = /obj/item/ritual_tome/abyss diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/abyss_tome.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/abyss_tome.dm new file mode 100644 index 000000000000..f964ed5abff4 --- /dev/null +++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/abyss_tome.dm @@ -0,0 +1,23 @@ +/obj/item/ritual_tome/abyss + name = "mystic tome" + desc = "The secrets of Abyss Mysticism..." + icon_state = "mystic" + icon = 'modular_darkpack/modules/ritual_abyss_mysticism/icons/abyss_mysticism_tome.dmi' + onflooricon = 'modular_darkpack/modules/ritual_abyss_mysticism/icons/abyss_mysticism_onfloor.dmi' + rune_type = /obj/ritual_rune/abyss + +/obj/item/ritual_tome/abyss/attack_self(mob/user) + if(!HAS_TRAIT(user, TRAIT_MYSTICISM_KNOWLEDGE)) + to_chat(user, span_cult("A very dark book in color whose appearance swallows up your vision. You find it impossible to decipher without proper guidance.")) + return + . = ..() + +/datum/crafting_recipe/mystome + name = "Abyss Mysticism Tome" + time = 10 SECONDS + reqs = list(/obj/item/paper = 3, /obj/item/reagent_containers/blood = 1) + result = /obj/item/ritual_tome/abyss + category = CAT_MISC + +/datum/crafting_recipe/mystome/is_recipe_available(mob/user) + return HAS_TRAIT(user, TRAIT_MYSTICISM_KNOWLEDGE) diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/__abyssrune.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/__abyssrune.dm new file mode 100644 index 000000000000..0fda8288f648 --- /dev/null +++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/__abyssrune.dm @@ -0,0 +1,7 @@ +/obj/ritual_rune/abyss + name = "abyss rune" + desc = "Learn the secrets of the Abyss, neonate..." + color = rgb(0, 0, 0) + word = "IDI NAH" + required_trait = TRAIT_MYSTICISM_KNOWLEDGE + activation_color = rgb(50, 50, 50) diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/artifact_identification.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/artifact_identification.dm new file mode 100644 index 000000000000..abf83ef17c4e --- /dev/null +++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/artifact_identification.dm @@ -0,0 +1,13 @@ +/obj/ritual_rune/abyss/identification + name = "occult items identification" + desc = "Identifies a single occult item" + icon_state = "rune4" + word = "WUS'ZAT" + cost = 1 + +/obj/ritual_rune/abyss/identification/complete() + for(var/obj/item/vtm_artifact/VA in loc) + VA.identify() + playsound(loc, 'sound/effects/magic/voidblink.ogg', 50, FALSE) + qdel(src) + return diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/blackout.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/blackout.dm new file mode 100644 index 000000000000..85a16f6b737e --- /dev/null +++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/blackout.dm @@ -0,0 +1,15 @@ +/obj/ritual_rune/abyss/blackout //not canon wod material, seemed a cool idea. + name = "blackout" + desc = "Destroys every wall light in range of the rune." + icon_state = "rune7" + word = "FYU'SES BLO'OUN" + level = 2 + cost = 1 + +//actual function of the rune +/obj/ritual_rune/abyss/blackout/complete() + for(var/obj/machinery/light/light_to_kill in range(7, src)) //for every light in a range of 7 (called i) + if(light_to_kill != LIGHT_BROKEN) //if it aint broke + light_to_kill.break_light_tube(0) //break it + playsound(get_turf(src), 'sound/effects/magic/voidblink.ogg', 50, FALSE) //make the funny void sound + qdel(src) //delete the rune diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/comforting_darkness.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/comforting_darkness.dm new file mode 100644 index 000000000000..13ca050141f7 --- /dev/null +++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/comforting_darkness.dm @@ -0,0 +1,66 @@ +/obj/ritual_rune/abyss/comforting_darkness + name = "comforting darkness" + desc = "Use the power of the abyss to mend the wounds of yourself and others." + icon_state = "rune8" + word = "KEYUR'AGA" + level = 2 + cost = 0 + var/static/list/roll_cache = list() + +/obj/ritual_rune/abyss/comforting_darkness/complete() + var/list/heal_targets = list() + var/turf/rune_location = get_turf(src) + var/mob/living/carbon/human/invoker = last_activator + var/dice = (invoker.st_get_stat(STAT_STAMINA) + invoker.st_get_stat(STAT_OCCULT)) + var/ckey = invoker.ckey + + // Can't use the ritual again until the debt is paid + if(invoker.has_status_effect(/datum/status_effect/blood_debt)) + to_chat(invoker, span_notice("The Abyss demands payment before you can draw on its power again!")) + return + + for(var/mob/living/carbon/human/target in rune_location) + if(iskindred(target)) + heal_targets |= target + + heal_targets |= invoker + + var/roll + var/spent_points + var/list/bpoptions = list() + + // Prevents the player from rerolling for free; initial roll is stored until the ritual is invoked + if(ckey in roll_cache) + roll = roll_cache[ckey] + else + roll = SSroll.storyteller_roll(dice, 8, invoker, numerical = TRUE) + roll_cache[ckey] = roll + + if(roll >= 1) + for(var/i in 1 to roll) + if(i <= invoker.bloodpool) + bpoptions += i + spent_points = tgui_input_list(invoker, "How many blood points would you like to spend? (60 healing per)", "Blood Points", bpoptions, null) + if(!spent_points) + return + invoker.bloodpool = max(invoker.bloodpool - spent_points, 0) + invoker.apply_status_effect(/datum/status_effect/blood_debt, 2 * spent_points) // Apply debuff with debt amount + for(var/mob/living/carbon/human/target in heal_targets) + target.heal_ordered_damage(60 * spent_points, list(BRUTE, TOX, OXY, STAMINA)) // Heals 2 levels of lethal/bashing per point spent + target.heal_ordered_damage(30 * spent_points, list(BURN, AGGRAVATED)) // Heals aggravated at half effectiveness, TTRPG-inaccurate implementation but necessary + + else if(roll == 0) + invoker.bloodpool = max(invoker.bloodpool - 1, 0) + qdel(src) + + else if(roll <= -1) + to_chat(invoker, span_warning("You lose focus, failing to control the darkness as it burns you!")) + invoker.bloodpool = max(invoker.bloodpool - 1, 0) + invoker.apply_damage(30, AGGRAVATED) + qdel(src) + + playsound(rune_location, 'sound/effects/magic/voidblink.ogg', 50, FALSE) + invoker.say("SANA'OSCURA") // Spanish for something along the lines of 'healing dark', spoken upon actual invocation of the rune. + + roll_cache -= ckey + qdel(src) diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/reflections_of_hollow_revelation.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/reflections_of_hollow_revelation.dm new file mode 100644 index 000000000000..b19ce18fa9ed --- /dev/null +++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/reflections_of_hollow_revelation.dm @@ -0,0 +1,175 @@ +/obj/ritual_rune/abyss/reflections_of_hollow_revelation + name = "reflections of hollow revelation" + desc = "Use a conjured Nocturne to spy on a target through nearby shadows" + icon_state = "teleport" + word = "" + level = 4 + cost = 1 + var/datum/action/close_window/end_action + var/mob/living/nocturne_user + var/obj/shadow_window/shadow_window + var/mob/living/carbon/human/window_target + var/isactive = FALSE + +/obj/ritual_rune/abyss/reflections_of_hollow_revelation/complete() + var/mob/living/user = usr + if(!user) + return + + if(isactive) + to_chat(user, span_warning("This Nocturne is already in use!")) + return + + // Target input + var/target_name = tgui_input_text(user, "Choose target name:", "Reflections of Hollow Revelation") + if(!target_name || !user.Adjacent(src)) + to_chat(user, span_warning("You must specify a target and remain close to the rune!")) + return + + user.say("VISTA'DE'SOMBRA") + + // Find the target + for(var/mob/living/carbon/human/targ in GLOB.player_list) + if(targ.real_name == target_name) + window_target = targ + break + + if(!window_target) + to_chat(user, span_warning("[target_name] not found.")) + return + + var/mypower = (user.st_get_stat(STAT_PERCEPTION) + user.st_get_stat(STAT_OCCULT)) + var/roll_result = SSroll.storyteller_roll(mypower, 7, user, numerical = FALSE) + switch(roll_result) + if(ROLL_SUCCESS) + scry_target(window_target, user) + playsound(user, 'sound/effects/magic/voidblink.ogg', 50, FALSE) + isactive = TRUE + if(ROLL_FAILURE) + qdel(src) + to_chat(user, span_warning("The Nocturne collapses!")) + if(ROLL_BOTCH) + qdel(src) + to_chat(user, span_warning("You feel drained...")) + for(var/datum/st_stat/stat as anything in subtypesof(/datum/st_stat)) + user.st_add_stat_mod(stat, -2, "reflections_of_hollow_revelation") + addtimer(CALLBACK(src, PROC_REF(restore_stats), user), 1 SCENES) + +/obj/ritual_rune/abyss/reflections_of_hollow_revelation/proc/restore_stats(mob/living/user) + for(var/datum/st_stat/stat as anything in subtypesof(/datum/st_stat)) + user.st_remove_stat_mod(stat, "reflections_of_hollow_revelation") + +/obj/ritual_rune/abyss/reflections_of_hollow_revelation/proc/scry_target(mob/living/carbon/human/target, mob/living/user) + // If the target has Obtenebration or Auspex, roll to see if they detect the shadows + if(iskindred(target)) + var/datum/splat/vampire/vampire = does_use_disciplines(target) + if(vampire?.get_discipline(/datum/discipline/obtenebration) || vampire?.get_discipline(/datum/discipline/auspex)) + var/theirpower = (user.st_get_stat(STAT_PERCEPTION) + user.st_get_stat(STAT_OCCULT)) + if(SSroll.storyteller_roll(theirpower, 8, target, numerical = FALSE) == ROLL_SUCCESS) + to_chat(target, span_warning("You notice the nearby shadows flicker... something is watching you.")) + + shadowview(target, user) + to_chat(user, span_notice("You peer through the shadows near [target.name]...")) + + addtimer(CALLBACK(src, PROC_REF(on_end),user), 1 SCENES) // 3 minute timer, AKA 1 Scene + +/obj/ritual_rune/abyss/reflections_of_hollow_revelation/proc/shadowview(mob/living/target, mob/user) + nocturne_user = user + //user.notransform = TRUE + + // Create camera + shadow_window = new(get_turf(target), src) + user.reset_perspective(shadow_window) + + // Give button to end viewing + end_action = new(src) + end_action.Grant(user) + + RegisterSignal(user, COMSIG_MOB_RESET_PERSPECTIVE, PROC_REF(on_end)) + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(check_target_distance)) + + to_chat(user, span_notice("You are now viewing through the shadows. Use the 'End Scrying' action to stop.")) + +/obj/ritual_rune/abyss/reflections_of_hollow_revelation/proc/check_target_distance() + SIGNAL_HANDLER + if(!window_target || !shadow_window) + return + + // Window closes when target leaves range + if(get_dist(window_target, shadow_window) > 7) + if(nocturne_user) + to_chat(nocturne_user, span_warning("The window closes as [window_target.name] moves away from the shadows.")) + on_end(nocturne_user) + +/obj/ritual_rune/abyss/reflections_of_hollow_revelation/proc/on_end(mob/user) + SIGNAL_HANDLER + if(user == nocturne_user) + close_window(user) + +/obj/ritual_rune/abyss/reflections_of_hollow_revelation/proc/close_window(mob/user) + if(!user) + return + + //user.notransform = FALSE + + if(user.client?.eye != user) + user.reset_perspective() + + if(end_action) + end_action.Remove(user) + QDEL_NULL(end_action) + + if(window_target) + UnregisterSignal(window_target, COMSIG_MOVABLE_MOVED) + + QDEL_NULL(shadow_window) + qdel(src) + UnregisterSignal(user, COMSIG_MOB_RESET_PERSPECTIVE) + + nocturne_user = null + to_chat(user, span_notice("You stop viewing through your summoned Nocturne.")) + playsound(user, 'sound/effects/magic/ethereal_exit.ogg', 50, FALSE) + +// Camera object +/obj/shadow_window + name = "Shadow" + desc = "A shadow..." + icon = 'icons/effects/effects.dmi' + icon_state = "" + invisibility = INVISIBILITY_ABSTRACT + layer = CAMERA_STATIC_PLANE + var/obj/ritual_rune/abyss/reflections_of_hollow_revelation/parent_rune + +/obj/shadow_window/Initialize(mapload, obj/ritual_rune/abyss/reflections_of_hollow_revelation/rune) + . = ..() + parent_rune = rune + +/obj/shadow_window/Destroy() + if(parent_rune && parent_rune.shadow_window == src) + parent_rune.shadow_window = null + parent_rune = null + return ..() + +// Action button +/datum/action/close_window + name = "End Scrying" + desc = "Stop viewing through the shadows" + button_icon = 'icons/mob/actions/actions_silicon.dmi' + button_icon_state = "camera_off" + var/obj/ritual_rune/abyss/reflections_of_hollow_revelation/parent_rune + +/datum/action/close_window/New(obj/ritual_rune/abyss/reflections_of_hollow_revelation/rune) + ..() + parent_rune = rune + +/datum/action/close_window/Trigger(trigger_flags) + if(!parent_rune || !usr) + return + parent_rune.close_window(usr) + +/datum/action/close_window/Remove(mob/user) + if(parent_rune && parent_rune.end_action == src) + parent_rune.end_action = null + parent_rune = null + . = ..() + qdel(src) diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/self_destruction.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/self_destruction.dm new file mode 100644 index 000000000000..81e723b88e96 --- /dev/null +++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/self_destruction.dm @@ -0,0 +1,9 @@ +/obj/ritual_rune/abyss/selfgib + name = "self destruction" + desc = "Meet the Final Death." + icon_state = "rune2" + word = "YNT FRM MCHGN FYNV DN THS B'FO" //'youre not from michigan if youve never done this before' + cost = 1 + +/obj/ritual_rune/abyss/selfgib/complete() + last_activator.death() diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/shadow_guardian.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/shadow_guardian.dm new file mode 100644 index 000000000000..9e0dabce96ee --- /dev/null +++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/rituals/shadow_guardian.dm @@ -0,0 +1,33 @@ +/obj/ritual_rune/abyss/heart_that_beats_in_silence + name = "the heart that beats in silence" + desc = "Creates a shadowy abomination to protect the Lasombra and his domain." + icon_state = "rune1" + word = "ANI UMRA" + level = 2 + cost = 1 + +/obj/ritual_rune/abyss/heart_that_beats_in_silence/complete() + var/mob/living/carbon/human/H = last_activator + var/dice = (last_activator.st_get_stat(STAT_INTELLIGENCE) + last_activator.st_get_stat(STAT_OCCULT)) + + var/roll = SSroll.storyteller_roll(dice, 6, last_activator, numerical = FALSE) + last_activator.apply_damage(30, AGGRAVATED) + + if(roll == ROLL_SUCCESS) + H.add_beastmaster_minion(/mob/living/basic/shadow_guard) + //BG.melee_damage_lower = BG.melee_damage_lower+activator_bonus + //BG.melee_damage_upper = BG.melee_damage_upper+activator_bonus + playsound(loc, 'sound/effects/magic/voidblink.ogg', 50, FALSE) + //if(length(H.beastmaster) > H.st_get_stat(STAT_OCCULT)) + //var/mob/living/simple_animal/hostile/beastmaster/B = pick(H.beastmaster) + //B.death() + qdel(src) + + else if(roll == ROLL_FAILURE) + qdel(src) + + else if(roll == ROLL_BOTCH) + to_chat(last_activator, span_warning("You lose control over the ritual!")) + last_activator.apply_damage(30, AGGRAVATED) + qdel(src) + diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/code/status_effects/blood_debt.dm b/modular_darkpack/modules/ritual_abyss_mysticism/code/status_effects/blood_debt.dm new file mode 100644 index 000000000000..d5ba071ee812 --- /dev/null +++ b/modular_darkpack/modules/ritual_abyss_mysticism/code/status_effects/blood_debt.dm @@ -0,0 +1,34 @@ +/datum/status_effect/blood_debt + id = "blood_debt" + duration = STATUS_EFFECT_PERMANENT + alert_type = /atom/movable/screen/alert/status_effect/blood_debt + var/debt_amount = 0 + var/initial_bloodpool = 0 + +/datum/status_effect/blood_debt/on_creation(mob/living/owner, spent) + debt_amount = spent + initial_bloodpool = owner.bloodpool + return ..() + +/datum/status_effect/blood_debt/tick() + . = ..() + var/blood_gained = owner.bloodpool - initial_bloodpool + + if(owner.bloodpool < initial_bloodpool) + initial_bloodpool = owner.bloodpool + + if(blood_gained > 0) + var/payment = min(blood_gained, debt_amount) + owner.bloodpool -= payment + debt_amount -= payment + initial_bloodpool = owner.bloodpool + + if(debt_amount <= 0) + qdel(src) + +/atom/movable/screen/alert/status_effect/blood_debt + name = "Blood Debt" + desc = "You cannot gain blood points until your debt is paid." + icon = 'modular_darkpack/modules/ritual_abyss_mysticism/icons/blood_debt_icon.dmi' + icon_state = "bhole3" + diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/icons/abyss_mysticism_onfloor.dmi b/modular_darkpack/modules/ritual_abyss_mysticism/icons/abyss_mysticism_onfloor.dmi new file mode 100644 index 000000000000..648bc77f9195 Binary files /dev/null and b/modular_darkpack/modules/ritual_abyss_mysticism/icons/abyss_mysticism_onfloor.dmi differ diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/icons/abyss_mysticism_tome.dmi b/modular_darkpack/modules/ritual_abyss_mysticism/icons/abyss_mysticism_tome.dmi new file mode 100644 index 000000000000..0671f4c7e92f Binary files /dev/null and b/modular_darkpack/modules/ritual_abyss_mysticism/icons/abyss_mysticism_tome.dmi differ diff --git a/modular_darkpack/modules/ritual_abyss_mysticism/icons/blood_debt_icon.dmi b/modular_darkpack/modules/ritual_abyss_mysticism/icons/blood_debt_icon.dmi new file mode 100644 index 000000000000..5dbb89a20c80 Binary files /dev/null and b/modular_darkpack/modules/ritual_abyss_mysticism/icons/blood_debt_icon.dmi differ diff --git a/modular_darkpack/modules/ritual_necromancy/code/necromancy_rune_drawing_action.dm b/modular_darkpack/modules/ritual_necromancy/code/necromancy_rune_drawing_action.dm new file mode 100644 index 000000000000..fe640e5b6e1f --- /dev/null +++ b/modular_darkpack/modules/ritual_necromancy/code/necromancy_rune_drawing_action.dm @@ -0,0 +1,6 @@ +/datum/action/ritual_drawing/necromancy + name = "Necroritualism" + desc = "Draw runes to perform Necromancy Rituals." + button_icon_state = "necroritualism" + rune_type = /obj/ritual_rune/necromancy + tome_type = /obj/item/ritual_tome/necromancy diff --git a/modular_darkpack/modules/ritual_necromancy/code/necromancy_tome.dm b/modular_darkpack/modules/ritual_necromancy/code/necromancy_tome.dm new file mode 100644 index 000000000000..867e24c951ed --- /dev/null +++ b/modular_darkpack/modules/ritual_necromancy/code/necromancy_tome.dm @@ -0,0 +1,71 @@ +/obj/item/ritual_tome/necromancy + name = "necromancy tome" + desc = "An old tome bound in peculiar leather." + icon_state = "necronomicon" + icon = 'modular_darkpack/modules/ritual_necromancy/icons/necromancy_tome.dmi' + onflooricon = 'modular_darkpack/modules/ritual_necromancy/icons/necromancy_tome_onfloor.dmi' + rune_type = /obj/ritual_rune/necromancy + var/list/products_list = list( + // placeholder, idea is that its similar to thaumaturgy archives + ) + +/obj/item/ritual_tome/necromancy/attack_self(mob/user) + if(!HAS_TRAIT(user, TRAIT_NECROMANCY_KNOWLEDGE)) + to_chat(user, span_cult("A Grimoire that contains etchings of many rituals and procedures. Sadly, you don't understand much of it.")) + return + ui_interact(user) + . = ..() + +// NecromancyVendor.jsx in tgui/interfaces +/obj/item/ritual_tome/necromancy/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "NecromancyVendor", name) + ui.open() + +/obj/item/ritual_tome/necromancy/ui_data(mob/user) + . = list() + .["user"] = list() + if(ishuman(user)) + var/mob/living/carbon/human/H = user + .["user"]["souls"] = H.collected_souls + .["user"]["name"] = "[H.name]" + .["user"]["job"] = "[H.mind?.assigned_role?.title]" + .["user"]["has_necromancy"] = HAS_TRAIT(H, TRAIT_NECROMANCY_KNOWLEDGE) + else if(isliving(user)) + var/mob/living/L = user + .["user"]["souls"] = L.collected_souls + .["user"]["name"] = "[L.name]" + .["user"]["job"] = "Unknown" + .["user"]["has_necromancy"] = FALSE + else + .["user"]["souls"] = 0 + .["user"]["name"] = "Unknown" + .["user"]["job"] = "Unknown" + .["user"]["has_necromancy"] = FALSE + +/obj/item/ritual_tome/necromancy/ui_act(action, params) + if(action != "purchase") + return ..() + + if(!HAS_TRAIT(usr, TRAIT_NECROMANCY_KNOWLEDGE)) + return FALSE + + var/mob/living/user = usr + + var/datum/data/vending_product/prize = locate(params["ref"]) in products_list + + user.collected_souls -= prize.price + to_chat(user, span_notice("The necromancy tome resonates with dark energy as it dispenses [prize.name]!")) + new prize.product_path(get_turf(user)) + return TRUE + +/datum/crafting_recipe/necrotome + name = "Necromantic Ritualism Tome" + time = 10 SECONDS + reqs = list(/obj/item/paper = 3, /obj/item/ectoplasm = 1) + result = /obj/item/ritual_tome/necromancy + category = CAT_MISC + +/datum/crafting_recipe/necrotome/is_recipe_available(mob/user) + return HAS_TRAIT(user, TRAIT_NECROMANCY_KNOWLEDGE) diff --git a/modular_darkpack/modules/ritual_necromancy/code/rituals/__necrorune.dm b/modular_darkpack/modules/ritual_necromancy/code/rituals/__necrorune.dm new file mode 100644 index 000000000000..b82e2f963c54 --- /dev/null +++ b/modular_darkpack/modules/ritual_necromancy/code/rituals/__necrorune.dm @@ -0,0 +1,7 @@ +/obj/ritual_rune/necromancy + name = "necromancy rune" + desc = "Death is only the beginning." + color = rgb(10, 128, 20) + word = "THURI'LLAH 'NHT" + required_trait = TRAIT_NECROMANCY_KNOWLEDGE + activation_color = rgb(72, 230, 106) diff --git a/modular_darkpack/modules/ritual_necromancy/code/rituals/callthehungrydead.dm b/modular_darkpack/modules/ritual_necromancy/code/rituals/callthehungrydead.dm new file mode 100644 index 000000000000..66cf90b9fe2d --- /dev/null +++ b/modular_darkpack/modules/ritual_necromancy/code/rituals/callthehungrydead.dm @@ -0,0 +1,42 @@ +/obj/ritual_rune/necromancy/question //No bloodpack requirement, but the wraiths aren't implied to owe answers. + name = "call the hungry dead" + desc = "Summon a wraith from the Shadowlands to converse." + icon_state = "rune4" + word = "METEH' GHM'IEN" + level = 2 + +/mob/living/basic/ghost/giovanni + maxHealth = 100 //Can be annoying right back if they're pestered for nothing. + health = 100 + melee_damage_lower = 30 + melee_damage_upper = 30 + faction = list(VAMPIRE_CLAN_GIOVANNI) + +/obj/ritual_rune/necromancy/question/complete() + var/text_question = tgui_input_text(last_activator, "Enter your summons to the wraiths:", "Call the Hungry Dead", encode = FALSE) + visible_message(span_notice("A call rings out to the dead from the rune...")) + var/mob/living/basic/ghost/TR = new(loc) + TR.AddComponent(\ + /datum/component/ghost_direct_control,\ + poll_candidates = TRUE,\ + role_name = "a Bound Wraith",\ + poll_length = 30 SECONDS,\ + poll_question = "Do you wish to speak to a necromancer?\nTheir summons is: [text_question]",\ + assumed_control_message = "You are an Ancestor Spirit summoned to answer: [text_question]",\ + after_assumed_control = CALLBACK(src, PROC_REF(ghost_name_prompt), TR)\ + ) + //TR.key = TR.key + //TR.name = TR.name + playsound(loc, 'modular_darkpack/modules/ritual_necromancy/sounds/necromancy2.ogg', 50, FALSE) + visible_message(span_notice("[TR.name] slowly fades into view over the rune...")) + qdel(src) + +/obj/ritual_rune/necromancy/question/proc/ghost_name_prompt(mob/living/basic/ghost/tremere/ghost_mob) + message_admins("[key_name_admin(ghost_mob)] has become a Bound Wraith.") + + var/choice = tgui_alert(ghost_mob, "Do you want to pick a new name as a Wraith?", "Wraith Choose Name", list("Yes", "No"), 10 SECONDS) + if(choice == "Yes") + var/chosen_ghost_name = tgui_input_text(ghost_mob, "What is your new name as a Wraith?", "Wraith Name Input") + if(chosen_ghost_name) + ghost_mob.real_name = chosen_ghost_name + ghost_mob.name = chosen_ghost_name diff --git a/modular_darkpack/modules/ritual_necromancy/code/rituals/death.dm b/modular_darkpack/modules/ritual_necromancy/code/rituals/death.dm new file mode 100644 index 000000000000..674cd2a247b4 --- /dev/null +++ b/modular_darkpack/modules/ritual_necromancy/code/rituals/death.dm @@ -0,0 +1,9 @@ +/obj/ritual_rune/necromancy/death + name = "death" + desc = "Instantly transport yourself to the Shadowlands." + icon_state = "rune2" + word = "Y'HO 'LLOH" + +/obj/ritual_rune/necromancy/death/complete() + last_activator.death() + qdel(src) diff --git a/modular_darkpack/modules/ritual_necromancy/code/rituals/fireprotection.dm b/modular_darkpack/modules/ritual_necromancy/code/rituals/fireprotection.dm new file mode 100644 index 000000000000..e9084e6d6de8 --- /dev/null +++ b/modular_darkpack/modules/ritual_necromancy/code/rituals/fireprotection.dm @@ -0,0 +1,40 @@ +/obj/ritual_rune/necromancy/fireprotection + name = "chill of oblivion" + desc = "Invite the cold of the Shadowlands into your soul to undo the body's fire-weakness. This profane blessing <b>taints the recipient's aura</b>." + icon_state = "rune1" + word = "DHAI'AD BHA'II DAWH'N" + level = 4 + +/obj/ritual_rune/necromancy/fireprotection/complete() + + var/list/valid_bodies = list() + + for(var/mob/living/carbon/human/targetbody in loc) + if(targetbody.stat == DEAD) + to_chat(usr, span_warning("The target is dead, the cold has long settled inside.")) + return + + else valid_bodies += targetbody + + if(valid_bodies.len < 1) + to_chat(usr, span_warning("The ritual's target must remain over the rune.")) + return + + var/mob/living/carbon/victim = pick(valid_bodies) + + if(victim.fakediablerist) + to_chat(usr, span_warning("The ritual's target has already been claimed by the cold.")) + return + + playsound(loc, 'sound/effects/ghost.ogg', 50, FALSE) + victim.emote("shiver") + victim.Immobilize(4 SECONDS) + + to_chat(victim, span_revendanger("Burning ice bleeds out of your soul and into everything else. Paralyzed, you stand in the cold as death lingers.")) + victim.fakediablerist = TRUE + //removing iscathayan from line 38 -- DAKPACK TODO -- readd KJs (iscathayan(victim)) + if(iskindred(victim) || iszombie(victim)) //made this a deduction rather than a flat set because of an artifact that independently changes damage mods + victim.dna.species.heatmod = max(0.5, victim.dna.species.heatmod-1) + else + victim.dna.species.heatmod = max(0.5, victim.dna.species.heatmod-0.5) + qdel(src) diff --git a/modular_darkpack/modules/ritual_necromancy/code/rituals/insight.dm b/modular_darkpack/modules/ritual_necromancy/code/rituals/insight.dm new file mode 100644 index 000000000000..6703d898181a --- /dev/null +++ b/modular_darkpack/modules/ritual_necromancy/code/rituals/insight.dm @@ -0,0 +1,57 @@ +/obj/ritual_rune/necromancy/insight + name = "insight" + desc = "Determine a cadaver's passing by questioning its soul." + icon_state = "rune6" + word = "IH'DET ULYSS RES'SAR" + level = 2 + +/obj/ritual_rune/necromancy/insight/complete() + + var/list/valid_bodies = list() + + for(var/mob/living/carbon/human/targetbody in loc) + if(targetbody == usr) + to_chat(usr, span_warning("You cannot invoke this ritual upon yourself.")) + return + else if(targetbody.stat == DEAD) + valid_bodies += targetbody + else + to_chat(usr, span_warning("The target lives still! Ask them yourself!")) + return + + if(valid_bodies.len < 1) + to_chat(usr, span_warning("There is no body that can undergo this Ritual.")) + return + + playsound(loc, 'modular_darkpack/modules/ritual_necromancy/sounds/necromancy1on.ogg', 50, FALSE) + + var/mob/living/carbon/victim = pick(valid_bodies) + + var/mob/dead/observer/victim_ghost = victim.last_mind + + var/permission = null + + if(isnpc(victim)) + to_chat(last_activator, span_notice("[victim.name] is a waning, base Drone. There is no greater knowledge to gleam from this one.")) + to_chat(last_activator, span_notice("<b>Damage taken:<b><br>BRUTE: [victim.get_brute_loss()]<br>OXY: [victim.get_oxy_loss()]<br>TOXIN: [victim.get_tox_loss()]<br>BURN: [victim.get_fire_loss()]<br>CLONE: [victim.get_agg_loss()]")) + to_chat(last_activator, span_notice("Last melee attacker: [victim.lastattacker]")) + qdel(src) + return + + if(victim_ghost) + permission = tgui_input_list(victim_ghost, "[last_activator.real_name] wishes to know of your passing. Will you give answers?", "Select", list("Yes","No","I don't recall"), "No", 1 MINUTES) + + if(permission == "Yes" && victim_ghost) + to_chat(last_activator, span_ghostalert("[victim.name]'s haunting whispers flood your mind...")) + var/deathdesc = tgui_input_text(victim_ghost, "", "How did you die?", "", 300, TRUE, TRUE, 5 MINUTES) + if(deathdesc == "") + to_chat(last_activator, span_warning("The Shroud is too thick, their whispers too raving to gleam anything useful.")) + else + to_chat(last_activator, span_ghostalert("<i>[deathdesc]</i>")) + //discount scanner + to_chat(last_activator, span_notice("<b>Damage taken:<b><br>BRUTE: [victim.get_brute_loss()]<br>OXY: [victim.get_oxy_loss()]<br>TOXIN: [victim.get_tox_loss()]<br>BURN: [victim.get_fire_loss()]<br>CLONE: [victim.get_agg_loss()]")) + to_chat(last_activator, span_notice("Last melee attacker: [victim.lastattacker]")) //guns behave weirdly + qdel(src) + + else if(permission == "No") + to_chat(last_activator, span_danger("The wraith turns from you. It will not surrender its secrets.")) diff --git a/modular_darkpack/modules/ritual_necromancy/code/rituals/locate.dm b/modular_darkpack/modules/ritual_necromancy/code/rituals/locate.dm new file mode 100644 index 000000000000..b39da747ab36 --- /dev/null +++ b/modular_darkpack/modules/ritual_necromancy/code/rituals/locate.dm @@ -0,0 +1,57 @@ +/obj/ritual_rune/necromancy/locate + name = "minestra di morte" + desc = "Verify a soul's status and try to divine its location." + icon_state = "rune5" + word = "UAH'V OUH'RAN" + level = 3 + sacrifices = list(/obj/item/shard) + +/obj/ritual_rune/necromancy/locate/complete() + + var/chosen_name = tgui_input_text(usr, "Invoke the true name of the soul you seek:", "Minestra di Morte") + var/target = find_target(chosen_name) + + if(!target) + to_chat(usr, span_warning("No such soul is present beyond the Shroud, nor here in the Skinlands!")) + return + + var/area/targetarea = get_area(target) + + if(isavatar(target)) + to_chat(usr, span_ghostalert("This soul has bridged the two realities - their astral projection wanders [targetarea.name].")) + playsound(loc, 'modular_darkpack/modules/ritual_necromancy/sounds/necromancy1on.ogg', 50, FALSE) + qdel(src) + return + + if(isobserver(target)) + to_chat(usr, span_ghostalert("This soul has departed the realm of the living - they wander [targetarea.name].")) + playsound(loc, 'modular_darkpack/modules/ritual_necromancy/sounds/necromancy1off.ogg', 50, FALSE) + qdel(src) + return + + if(isliving(target)) + var/mob/living/livetarget = target + if(livetarget.stat != DEAD) + to_chat(usr, span_ghostalert("This soul yet persists in the Skinlands at [targetarea.name].")) + playsound(loc, 'modular_darkpack/modules/ritual_necromancy/sounds/necromancy1on.ogg', 50, FALSE) + + if(livetarget.stat > SOFT_CRIT) + to_chat(usr, span_ghostalert("Their connection to this is realm weak, and fading. Death waits for them.")) + if(HAS_TRAIT(livetarget, TRAIT_NECROMANCY_KNOWLEDGE)) //other necromancers catch onto it if targeted + var/area/userarea = get_area(usr) + to_chat(livetarget, span_notice("A chill and a whisper. A fellow necromancer has sought out your soul - their own calling out from <b>[userarea.name]</b>.")) + qdel(src) + return + + if (livetarget.stat == DEAD) //for when they haven't ghosted yet + to_chat(usr, span_ghostalert("This soul remains caged to its perished vessel at [targetarea.name].")) + qdel(src) + return + +/obj/ritual_rune/necromancy/locate/proc/find_target(chosen_name) + var/mob/target_found + for(var/mob/target in GLOB.player_list) + if(target.real_name == chosen_name) + target_found = target + break + return target_found diff --git a/modular_darkpack/modules/ritual_necromancy/code/rituals/truth.dm b/modular_darkpack/modules/ritual_necromancy/code/rituals/truth.dm new file mode 100644 index 000000000000..2e3ddc6e940a --- /dev/null +++ b/modular_darkpack/modules/ritual_necromancy/code/rituals/truth.dm @@ -0,0 +1,49 @@ +/obj/ritual_rune/necromancy/truth + name = "call upon the shadow's grace" + desc = "Bring forth the shadows in your victim's mind and force out their darkest truths." + icon_state = "rune8" + word = "MIKHH' AHPP" + level = 3 + +/obj/ritual_rune/necromancy/truth/complete() + + var/list/valid_bodies = list() + + for(var/mob/living/carbon/human/targetbody in loc) + if(targetbody == usr) + to_chat(usr, span_warning("You cannot invoke this ritual upon yourself.")) + return + if(targetbody.stat == DEAD) + to_chat(usr, span_warning("The target is dead, and has taken its secrets to the grave!")) + return + else + valid_bodies += targetbody + + if(valid_bodies.len < 1) + to_chat(usr, span_warning("The ritual's victim must remain over the rune.")) + return + + var/mob/living/carbon/victim = pick(valid_bodies) + playsound(loc, 'modular_darkpack/modules/ritual_necromancy/sounds/necromancy1on.ogg', 50, FALSE) + + to_chat(usr, span_ghostalert("You sic [victim.name]'s shadow on [victim.p_them()]; [victim.p_they()] cannot lie to you now.")) + + playsound(victim,'sound/effects/hallucinations/veryfar_noise.ogg',50,TRUE) + playsound(victim,'sound/music/antag/bloodcult/ghost_whisper.ogg',50,TRUE) + + victim.emote("scream") + victim.AdjustKnockdown(2 SECONDS) + victim.do_jitter_animation(3 SECONDS) + + to_chat(victim, span_revenboldnotice("Your mouth snaps open, and whatever air you take in can't seem to stay.")) + to_chat(victim, span_revenboldnotice("All the dark secrets you harbor come spilling out before you can even recall them.")) + to_chat(victim, span_hypnophrase("YOU CANNOT LIE.")) + + visible_message(span_danger("[victim.name]'s shadow thrashes underneath [victim.p_them()], as if a separate being!")) + addtimer(CALLBACK(victim, TYPE_PROC_REF(/datum/necrorune/truth, wearoff), victim), 2 MINUTES) + qdel(src) + +/datum/necrorune/truth/proc/wearoff(mob/living/carbon/victim) + if(!victim) + return + to_chat(victim, span_notice("The grip on your soul relents, you feel in control over your secrets.")) diff --git a/modular_darkpack/modules/ritual_necromancy/code/rituals/zombie.dm b/modular_darkpack/modules/ritual_necromancy/code/rituals/zombie.dm new file mode 100644 index 000000000000..3322dacc6965 --- /dev/null +++ b/modular_darkpack/modules/ritual_necromancy/code/rituals/zombie.dm @@ -0,0 +1,92 @@ +/obj/ritual_rune/necromancy/zombie + name = "daemonic possession" + desc = "Place a wraith inside of a dead body and raise it as a sentient zombie." + icon_state = "rune7" + word = "GI'TI FOA'HP" + level = 5 + var/duration_length = 15 SECONDS + +/obj/ritual_rune/necromancy/zombie/complete() + + var/list/valid_bodies = list() + + for(var/mob/living/carbon/human/targetbody in loc) + if(targetbody == usr) + to_chat(usr, span_warning("You cannot invoke this ritual upon yourself.")) + return + else if(targetbody.stat == DEAD) + valid_bodies += targetbody + else + to_chat(usr, span_warning("The target lives still!")) + return + + if(valid_bodies.len < 1) + to_chat(usr, span_warning("There is no body that can undergo this Ritual.")) + return + + usr.visible_message(span_notice("[usr] begins chanting in vile tongues..."), span_notice("You begin the resurrection ritual.")) + playsound(loc, 'modular_darkpack/modules/ritual_necromancy/sounds/necromancy2.ogg', 50, FALSE) + + if(do_after(usr, duration_length, usr)) + + activated = TRUE + last_activator = usr + + var/mob/living/target_body = pick(valid_bodies) + + var/old_name = target_body.real_name + + // Transform the body into a zombie + if(!target_body || QDELETED(target_body) || target_body.stat > DEAD) + return + + // Remove any vampiric actions + for(var/datum/action/A in target_body.actions) + if(A.vampiric) + A.Remove(target_body) + + var/original_location = get_turf(target_body) + + // Revive the specimen and turn them into a zombie + target_body.revive(HEAL_ALL) + target_body.set_species(/datum/species/zombie) + target_body.real_name = old_name // the ritual for some reason is deleting their old name and replacing it with a random name. + target_body.name = old_name + target_body.update_name() + + if(target_body.loc != original_location) + target_body.forceMove(original_location) + + playsound(loc, 'modular_darkpack/modules/powers/sounds/necromancy.ogg', 50, FALSE) + + // Handle key assignment + if(!target_body.key) + target_body.AddComponent(\ + /datum/component/ghost_direct_control,\ + poll_candidates = TRUE,\ + role_name = "a Sentient Zombie",\ + poll_length = 30 SECONDS,\ + assumed_control_message = "You are a Sentient Zombie, a Wraith who has been mercifully granted a skinride by your master. Serve them well, and enjoy your taste of a life taken from you.",\ + after_assumed_control = CALLBACK(src, PROC_REF(on_zombie_possess), target_body),\ + ) + qdel(src) + return + + target_body.visible_message(span_ghostalert("[target_body.name] twitches to unlife!")) + qdel(src) + +/obj/ritual_rune/necromancy/zombie/proc/on_zombie_possess(mob/living/carbon/human/zombie) + zombie.visible_message(span_ghostalert("A Wraith posesses the corpse, [zombie.name] twitches to unlife!")) + ask_zombie_name(zombie) + qdel(src) + +/obj/ritual_rune/necromancy/zombie/proc/ask_zombie_name(mob/living/carbon/human/zombie) + var/choice = tgui_alert(zombie, "Do you want to pick a new name as a Zombie?", "Zombie Choose Name", list("Yes", "No"), 10 SECONDS) + if(choice == "Yes") + var/chosen_zombie_name = tgui_input_text(zombie, "What is your new name as a Zombie?", "Zombie Name Input") + if(chosen_zombie_name) + zombie.real_name = chosen_zombie_name + zombie.name = chosen_zombie_name + zombie.update_name() + else + return diff --git a/modular_darkpack/modules/ritual_necromancy/icons/necromancy_tome.dmi b/modular_darkpack/modules/ritual_necromancy/icons/necromancy_tome.dmi new file mode 100644 index 000000000000..e8795d90ae28 Binary files /dev/null and b/modular_darkpack/modules/ritual_necromancy/icons/necromancy_tome.dmi differ diff --git a/modular_darkpack/modules/ritual_necromancy/icons/necromancy_tome_onfloor.dmi b/modular_darkpack/modules/ritual_necromancy/icons/necromancy_tome_onfloor.dmi new file mode 100644 index 000000000000..9053aed9faa6 Binary files /dev/null and b/modular_darkpack/modules/ritual_necromancy/icons/necromancy_tome_onfloor.dmi differ diff --git a/modular_darkpack/modules/ritual_necromancy/sounds/necromancy1off.ogg b/modular_darkpack/modules/ritual_necromancy/sounds/necromancy1off.ogg new file mode 100644 index 000000000000..36e4b2174d1c Binary files /dev/null and b/modular_darkpack/modules/ritual_necromancy/sounds/necromancy1off.ogg differ diff --git a/modular_darkpack/modules/ritual_necromancy/sounds/necromancy1on.ogg b/modular_darkpack/modules/ritual_necromancy/sounds/necromancy1on.ogg new file mode 100644 index 000000000000..1aff82f69cf0 Binary files /dev/null and b/modular_darkpack/modules/ritual_necromancy/sounds/necromancy1on.ogg differ diff --git a/modular_darkpack/modules/ritual_necromancy/sounds/necromancy2.ogg b/modular_darkpack/modules/ritual_necromancy/sounds/necromancy2.ogg new file mode 100644 index 000000000000..11c9dff63efb Binary files /dev/null and b/modular_darkpack/modules/ritual_necromancy/sounds/necromancy2.ogg differ diff --git a/modular_darkpack/modules/ritual_necromancy/sounds/necromancy3.ogg b/modular_darkpack/modules/ritual_necromancy/sounds/necromancy3.ogg new file mode 100644 index 000000000000..72a577486415 Binary files /dev/null and b/modular_darkpack/modules/ritual_necromancy/sounds/necromancy3.ogg differ diff --git a/modular_darkpack/modules/ritual_necromancy/sounds/necromancy4.ogg b/modular_darkpack/modules/ritual_necromancy/sounds/necromancy4.ogg new file mode 100644 index 000000000000..bcbd6a43f723 Binary files /dev/null and b/modular_darkpack/modules/ritual_necromancy/sounds/necromancy4.ogg differ diff --git a/modular_darkpack/modules/ritual_necromancy/sounds/necromancy5.ogg b/modular_darkpack/modules/ritual_necromancy/sounds/necromancy5.ogg new file mode 100644 index 000000000000..095c4068c064 Binary files /dev/null and b/modular_darkpack/modules/ritual_necromancy/sounds/necromancy5.ogg differ diff --git a/modular_darkpack/modules/ritual_thaumaturgy/arcane_tome.dm b/modular_darkpack/modules/ritual_thaumaturgy/arcane_tome.dm new file mode 100644 index 000000000000..4d82950c01bc --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/arcane_tome.dm @@ -0,0 +1,23 @@ +/obj/item/ritual_tome/arcane + name = "arcane tome" + desc = "The secrets of Blood Magic..." + icon_state = "arcane" + icon = 'modular_darkpack/modules/ritual_thaumaturgy/icons/arcane_tome.dmi' + onflooricon = 'modular_darkpack/modules/ritual_thaumaturgy/icons/arcane_tome_onfloor.dmi' + rune_type = /obj/ritual_rune/thaumaturgy + +/obj/item/ritual_tome/arcane/attack_self(mob/user) + if(!HAS_TRAIT(user, TRAIT_THAUMATURGY_KNOWLEDGE)) + to_chat(user, span_cult("A book whose title is inscribed in latin and coated with various sigils and shapes. You'll need a teacher if you want to learn more. For some reason it wont open.")) + return + display_rituals() + +/datum/crafting_recipe/arctome + name = "Arcane Tome" + time = 10 SECONDS + reqs = list(/obj/item/paper = 3, /obj/item/reagent_containers/blood = 2) + result = /obj/item/ritual_tome/arcane + category = CAT_MISC + +/datum/crafting_recipe/arctome/is_recipe_available(mob/user) + return HAS_TRAIT(user, TRAIT_THAUMATURGY_KNOWLEDGE) diff --git a/modular_darkpack/modules/ritual_thaumaturgy/icons/arcane_tome.dmi b/modular_darkpack/modules/ritual_thaumaturgy/icons/arcane_tome.dmi new file mode 100644 index 000000000000..46e3473279af Binary files /dev/null and b/modular_darkpack/modules/ritual_thaumaturgy/icons/arcane_tome.dmi differ diff --git a/modular_darkpack/modules/ritual_thaumaturgy/icons/arcane_tome_onfloor.dmi b/modular_darkpack/modules/ritual_thaumaturgy/icons/arcane_tome_onfloor.dmi new file mode 100644 index 000000000000..ba2a6c492291 Binary files /dev/null and b/modular_darkpack/modules/ritual_thaumaturgy/icons/arcane_tome_onfloor.dmi differ diff --git a/modular_darkpack/modules/ritual_thaumaturgy/icons/spirit_chime.dmi b/modular_darkpack/modules/ritual_thaumaturgy/icons/spirit_chime.dmi new file mode 100644 index 000000000000..2f8b7d85886a Binary files /dev/null and b/modular_darkpack/modules/ritual_thaumaturgy/icons/spirit_chime.dmi differ diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/__thaumaturgyrune.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/__thaumaturgyrune.dm new file mode 100644 index 000000000000..2c34529669fa --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/__thaumaturgyrune.dm @@ -0,0 +1,7 @@ +/obj/ritual_rune/thaumaturgy + name = "tremere rune" + desc = "Learn the secrets of blood, neonate..." + color = rgb(128, 0, 0) + word = "IDI NAH" + required_trait = TRAIT_THAUMATURGY_KNOWLEDGE + activation_color = rgb(255, 64, 64) diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/artifact_identification.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/artifact_identification.dm new file mode 100644 index 000000000000..cd13f721556a --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/artifact_identification.dm @@ -0,0 +1,17 @@ +/obj/ritual_rune/thaumaturgy/identification + name = "occult artifact identification" + desc = "Identifies a single occult item." + icon_state = "rune4" + word = "IN'DAR" + +/obj/ritual_rune/thaumaturgy/identification/complete() + for(var/obj/item/vtm_artifact/VA in loc) + var/mob/living/carbon/human/identifier = usr + if(VA.identified) + to_chat(identifier, span_warning("You have already identified this artifact.")) + return + VA.identify() + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) + qdel(src) + return + diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_curse_rune.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_curse_rune.dm new file mode 100644 index 000000000000..11b56553c3f5 --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_curse_rune.dm @@ -0,0 +1,145 @@ +/obj/ritual_rune/thaumaturgy/curse + name = "blood curse" + desc = "Curse your enemies from afar. Place multiple hearts on the rune to increase the curse duration." + icon_state = "rune7" + word = "MAL'DICTO-SANGUINIS" + level = 5 + sacrifices = list() //checking for number of hearts in the function + var/channeling = FALSE + var/mob/living/channeler = null + var/curse_target = null + +/obj/ritual_rune/thaumaturgy/curse/complete() + if(!activated) + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) + color = rgb(255,0,0) + activated = TRUE + +/obj/ritual_rune/thaumaturgy/curse/attack_hand(mob/user) + if(!activated) + var/mob/living/L = user + if(!HAS_TRAIT(L, TRAIT_THAUMATURGY_KNOWLEDGE)) + return + L.say(word) + L.Immobilize(30) + last_activator = user + activator_bonus = L.thaum_damage_plus + animate(src, color = rgb(255, 64, 64), time = 10) + complete() + addtimer(CALLBACK(src, PROC_REF(start_curse), user), 1 SECONDS) + return + + // If already activated but not channeling, allow restarting + if(!channeling && last_activator == user) + start_curse(user) + return + + // only the activator can use the activated rune + if(last_activator != user) + to_chat(user, span_warning("You are not the one who activated this rune!")) + return + + // check if already channeling + if(channeling) + to_chat(user, span_warning("The curse is already being channeled!")) + return + +/obj/ritual_rune/thaumaturgy/curse/proc/start_curse(mob/user) + if(!user || !activated || channeling) + return + + // Count heart sacrifices + var/list/hearts = list() + for(var/obj/item/organ/heart/H in get_turf(src)) + hearts += H + + // at least one heart for the ritual + if(hearts.len == 0) + to_chat(user, span_warning("You need at least one heart to channel the curse!")) + return + + // target name input + var/target_name = tgui_input_text(user, "Choose target name:", "Curse Rune") + if(!target_name || !user.Adjacent(src)) // Check if user is still nearby + to_chat(user, span_warning("You must specify a target and remain close to the rune!")) + return + + // begin channeling + curse_target = target_name + channeler = user + channeling = TRUE + + // Begin the curse ritual + to_chat(user, span_warning("You begin channeling dark energy through [hearts.len] heart[hearts.len > 1 ? "s" : ""]...")) + channel_curse(hearts) + do_after(hearts.len * 5) + +/obj/ritual_rune/thaumaturgy/curse/proc/channel_curse(list/hearts) + if(!channeling || !channeler || !curse_target) + return + + if(!hearts.len) + to_chat(channeler, span_warning("No more hearts remain for the ritual!")) + channeling = FALSE + qdel(src) + return + + if(!channeler.Adjacent(src)) + to_chat(channeler, span_warning("The curse ritual has been interrupted because you moved away!")) + channeling = FALSE + return + + // Take the first heart + var/obj/item/organ/heart/heart = hearts[1] + if(!heart || QDELETED(heart) || heart.loc != get_turf(src)) + hearts -= heart + if(hearts.len > 0) + channel_curse(hearts) // Skip this heart and continue + else + to_chat(channeler, span_warning("The curse ritual has ended as no valid hearts remain!")) + channeling = FALSE + qdel(src) + return + + hearts -= heart + + // Apply visual effects + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 25, FALSE) + animate(src, color = rgb(255, 0, 0), time = 1.5) + animate(color = rgb(128, 0, 0), time = 1.5) + + // Find the target and apply damage + var/found_target = FALSE + for(var/mob/living/carbon/human/H in GLOB.player_list) + if(H.real_name == curse_target) + found_target = TRUE + H.adjust_agg_loss(25) + playsound(H.loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) + to_chat(H, span_warning("You feel dark energy tearing at your very being!")) + H.Stun(2) + break + + if(!found_target) + to_chat(channeler, span_warning("There is no one by that name in the city!")) + channeling = FALSE + qdel(heart) + return + + // Consume the heart + qdel(heart) + + // Display feedback + to_chat(channeler, span_warning("A heart is consumed by the ritual. [hearts.len] heart[hearts.len != 1 ? "s" : ""] remain[hearts.len != 1 ? "" : "s"].")) + + // If we still have hearts, continue the channel + if(hearts.len > 0) + // After 4 seconds, process the next heart + channeler.visible_message(span_warning("[channeler.name] continues channeling dark energy into the rune!")) + + addtimer(CALLBACK(src, PROC_REF(channel_curse), hearts), 4 SECONDS) + else + // after using all hearts + to_chat(channeler, span_warning("The last heart is consumed, completing the curse ritual!")) + channeling = FALSE + qdel(src) + diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_guardian_ritual.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_guardian_ritual.dm new file mode 100644 index 000000000000..e8cbec1d27f9 --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_guardian_ritual.dm @@ -0,0 +1,16 @@ +/obj/ritual_rune/thaumaturgy/blood_guardian + name = "blood guardian" + desc = "Creates the Blood Guardian to protect tremere or his domain." + icon_state = "rune1" + word = "UR'JOLA" + level = 3 + +/obj/ritual_rune/thaumaturgy/blood_guardian/complete() + var/mob/living/carbon/human/H = last_activator + H.add_beastmaster_minion(/mob/living/basic/blood_guard) + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) + if(length(H.beastmaster_minions) > 3+H.st_get_stat(STAT_LEADERSHIP)) + var/mob/living/basic/blood_guard/B = pick(H.beastmaster_minions) + B.death() + qdel(src) + diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_to_water.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_to_water.dm new file mode 100644 index 000000000000..dce145910988 --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_to_water.dm @@ -0,0 +1,10 @@ +/obj/ritual_rune/thaumaturgy/blood_to_water + name = "blood To water" + desc = "Purges all blood in range into the water." + icon_state = "rune8" + word = "CL-ENE" + +/obj/ritual_rune/thaumaturgy/blood_to_water/complete() + for(var/atom/A in range(7, src)) + A.wash(CLEAN_WASH) + qdel(src) diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_trap.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_trap.dm new file mode 100644 index 000000000000..e3ea4be8193e --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_trap.dm @@ -0,0 +1,26 @@ +/obj/ritual_rune/thaumaturgy/blood_trap + name = "blood trap" + desc = "Creates the Blood Trap to protect tremere or his domain." + icon_state = "rune2" + word = "DUH'K-A'U" + +/obj/ritual_rune/thaumaturgy/blood_trap/complete() + if(!activated) + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) + activated = TRUE + alpha = 28 + AddElement(/datum/element/connect_loc, list(COMSIG_ATOM_ENTERED = PROC_REF(on_crossed))) + +/obj/ritual_rune/thaumaturgy/blood_trap/proc/on_crossed(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) + SIGNAL_HANDLER + + if(isliving(arrived) && activated) + var/mob/living/L = arrived + L.adjust_fire_loss(50 + activator_bonus) + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) + qdel(src) + +/obj/ritual_rune/thaumaturgy/blood_trap/Destroy() + if(loc) + UnregisterSignal(loc, COMSIG_ATOM_ENTERED) + return ..() diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_wall.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_wall.dm new file mode 100644 index 000000000000..f994c00773b2 --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/blood_wall.dm @@ -0,0 +1,22 @@ +/obj/ritual_rune/thaumaturgy/blood_wall + name = "blood wall" + desc = "Creates the Blood Wall to protect tremere or his domain." + icon_state = "rune3" + word = "SOT'PY-O" + level = 2 + +/obj/ritual_rune/thaumaturgy/blood_wall/complete() + new /obj/structure/bloodwall(loc) + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) + qdel(src) + +/obj/structure/bloodwall + name = "blood wall" + desc = "Wall from BLOOD." + icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' + icon_state = "bloodwall" + plane = GAME_PLANE + layer = ABOVE_MOB_LAYER + anchored = TRUE + density = TRUE + max_integrity = 100 diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/bloodwalk.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/bloodwalk.dm new file mode 100644 index 000000000000..d17852990fe0 --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/bloodwalk.dm @@ -0,0 +1,95 @@ +/obj/ritual_rune/thaumaturgy/bloodwalk + name = "blood walk" + desc = "Trace the subject's lineage from a blood syringe." + icon_state = "rune7" + word = "Reveal thy bloodline for mine eyes." + level = 2 + +/obj/ritual_rune/thaumaturgy/bloodwalk/attack_hand(mob/living/user) + for(var/obj/item/reagent_containers/syringe/S in loc) + for(var/datum/reagent/blood/B in S.reagents.reagent_list) + var/blood_data = B.data + if(blood_data) + var/generation = blood_data["generation"] + var/clan = blood_data["clan"] + var/real_name = blood_data["real_name"] + var/message = generate_message(generation, clan, real_name) + to_chat(user, "[message]") + // Process blood collection for research points + if(ishuman(user)) + SSoccult_research.process_blood_collection(user, B) + + else + to_chat(user, "The blood speaks not; it is empty of power!") + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) + color = rgb(255,0,0) + activated = TRUE + qdel(src) + +/obj/ritual_rune/thaumaturgy/bloodwalk/proc/generate_message(generation, clan, real_name) + var/message = "" + message += "The owner of the blood's true name is [real_name].\n" + switch(generation) + if(4) + message += "The blood is incredibly ancient and powerful! It must be from an ancient Methuselah!\n" + if(5) + message += "The blood is incredibly ancient and powerful! It must be from a Methuselah!\n" + if(6) + message += "The blood is incredibly ancient and powerful! It must be from an Elder!\n" + if(7, 8, 9) + message += "The blood is powerful. It must come from an Ancilla or Elder!\n" + if(10, 11) + message += "The blood is of middling strength. It must come from someone young.\n" + if(12, 13) + message += "The blood is of waning strength. It must come from a neonate.\n" + else + if(generation >= 14) + message += "This is the vitae of a thinblood!\n" + //clan + // DARKPACK TODO - reimplement Old Clan Tzimisce, Setite, Nagaraja, and Salubri Warrior + clan = lowertext(clan) + switch(clan) + if(VAMPIRE_CLAN_TOREADOR, VAMPIRE_CLAN_DAUGHTERS_OF_CACOPHONY) + message += "The blood is sweet and rich. The owner must, too, be beautiful.\n" + if(VAMPIRE_CLAN_VENTRUE) + message += "The blood has kingly power in it, descending from Mithras or Hardestadt.\n" + if(VAMPIRE_CLAN_LASOMBRA) + message += "Cold and dark, this blood has a mystical connection to the Abyss.\n" + if(VAMPIRE_CLAN_TZIMISCE) + message += "The vitae is mutable and twisted. Is there any doubt to the cursed line it belongs to?\n" + if(VAMPIRE_CLAN_OLD_CLAN_TZIMISCE) + message += "This vitae is old and ancient. It reminds you of a more twisted and cursed blood...\n" + if(VAMPIRE_CLAN_GANGREL, VAMPIRE_CLAN_CITY_GANGREL) + message += "The blood emits a primal and feral aura. The same is likely of the owner.\n" + if(VAMPIRE_CLAN_MALKAVIAN) + message += "You can sense chaos and madness within this blood. It's owner must be maddened too.\n" + if(VAMPIRE_CLAN_BRUJAH) + message += "The blood is filled with passion and anger. So must be the owner of the blood.\n" + if(VAMPIRE_CLAN_NOSFERATU) + message += "The blood is foul and disgusting. Same must apply to the owner.\n" + if(VAMPIRE_CLAN_TREMERE) + message += "The blood is filled with the power of magic. The owner must be a thaumaturge.\n" + if(VAMPIRE_CLAN_BAALI) + message += "Tainted and corrupt. Vile and filthy. You see your reflection in the blood, but something else stares back.\n" + if(VAMPIRE_CLAN_BANU_HAQIM) + message += "Potent... deadly... and cursed. You know well the curse laid by Tremere on the assassins.\n" + if(VAMPIRE_CLAN_TRUE_BRUJAH) + message += "The blood is cold and static... It's hard to feel any emotion within it.\n" + if(VAMPIRE_CLAN_SALUBRI) + message += "The cursed blood of the Salubri! The owner of this blood must be slain.\n" + //if(VAMPIRE_CLAN_SALUBRI_WARRIOR) + //message += "The avatar of Samiel's vengeance stands before you, do you dare return their bitter hatred?\n" + if(VAMPIRE_CLAN_GIOVANNI, VAMPIRE_CLAN_CAPPADOCIAN) + message += "The blood is very cold and filled with death. The owner must be a necromancer.\n" + if(VAMPIRE_CLAN_KIASYD) + message += "The blood is filled with traces of fae magic.\n" + if(VAMPIRE_CLAN_GARGOYLE) + message += "The blood of our stone servants.\n" + if(VAMPIRE_CLAN_SETITE) + message += "Seduction and allure are in the blood. Ah, one of the snakes.\n" + //if(VAMPIRE_CLAN_NAGARAJA) + //message += "This blood has an unsettling hunger to it, cold and stained with death.\n" + else + message += "The blood's origin is hard to trace. Perhaps it is one of the clanless?\n" + + return message diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/chime_of_the_unseen_spirits.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/chime_of_the_unseen_spirits.dm new file mode 100644 index 000000000000..28c9f6e7d112 --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/chime_of_the_unseen_spirits.dm @@ -0,0 +1,224 @@ +// **************************************************************** CHIME OF UNSEEN SPIRITS ************************************************************* +/obj/ritual_rune/thaumaturgy/chime_of_unseen_spirits + name = "chime of unseen spirits" + desc = "Enchant a chime to reveal the presence of nearby spirits." + icon_state = "rune6" + word = "Sonitus occultorum." + level = 1 + +/obj/ritual_rune/thaumaturgy/chime_of_unseen_spirits/complete() + new /obj/item/spirit_chime(loc) + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) + qdel(src) + +// The spirit chime item itself +/obj/item/spirit_chime + name = "chime of unseen spirits" + desc = "A mystical chime that reacts to nearby spirits." + icon = 'modular_darkpack/modules/ritual_thaumaturgy/icons/spirit_chime.dmi' + icon_state = "bell" + anchored = FALSE + var/isplaced = FALSE + var/datum/proximity_monitor/advanced/spirit_chime/chime_field + var/ringing = FALSE + var/range = 10 + COOLDOWN_DECLARE(ring_cooldown) + +/obj/item/spirit_chime/attackby(obj/item/W, mob/user) + return ..() + +// Picking the chime back up +/obj/item/spirit_chime/attack_hand(mob/user) + if(!anchored) + return ..() + if(!do_after(user, 2 SECONDS, target = src)) + return + user.visible_message(span_notice("[user] retrieves the chime.")) + anchored = FALSE + user.put_in_active_hand(src) + isplaced = FALSE + +// Handles table placement (a bit awkwardly but wcyd) +/obj/item/spirit_chime/dropped(mob/user) + . = ..() + var/obj/structure/table/table = locate(/obj/structure/table) in get_turf(src) + if(table && !anchored) + if(!do_after(user, 2 SECONDS)) + return + + anchored = TRUE + icon = 'modular_darkpack/modules/ritual_thaumaturgy/icons/spirit_chime.dmi' + icon_state = "bell" + isplaced = TRUE + user.visible_message(span_notice("[user] places the bell on the table.")) + initial_check() + +/obj/item/spirit_chime/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!proximity_flag) + return + + // Handles wall placement + if(istype(target, /turf/closed/wall)) + var/turf/T = target + if(!do_after(user, 2 SECONDS)) + return + + var/obj/item/spirit_chime/placed_chime = new /obj/item/spirit_chime(T) + placed_chime.anchored = TRUE + placed_chime.icon = 'modular_darkpack/modules/ritual_thaumaturgy/icons/spirit_chime.dmi' + placed_chime.icon_state = "chime" + + // Grabs click parameters for placement. Totally unnecessary, but I thought it was nice. + var/list/params = params2list(click_parameters) + if(params["icon-x"] && params["icon-y"]) + var/click_x = text2num(params["icon-x"]) + var/click_y = text2num(params["icon-y"]) + placed_chime.pixel_x = click_x - 16 + placed_chime.pixel_y = click_y - 30 + + user.visible_message(span_notice("[user] hangs the chime on the wall.")) + placed_chime.isplaced = TRUE + qdel(src) + return + + // Handles floor placement + if(isturf(target)) + var/turf/T = target + if(!do_after(user, 2 SECONDS)) + return + + var/obj/item/spirit_chime/placed_chime = new /obj/item/spirit_chime(T) + placed_chime.anchored = TRUE + placed_chime.icon = 'modular_darkpack/modules/ritual_thaumaturgy/icons/spirit_chime.dmi' + placed_chime.icon_state = "bell" + + // Grabs click parameters for placement. Totally unnecessary, but I thought it was nice. + var/list/params = params2list(click_parameters) + if(params["icon-x"] && params["icon-y"]) + var/click_x = text2num(params["icon-x"]) + var/click_y = text2num(params["icon-y"]) + placed_chime.pixel_x = click_x - 16 + placed_chime.pixel_y = click_y - 16 + + user.visible_message(span_notice("[user] places the bell on the floor.")) + placed_chime.isplaced = TRUE + qdel(src) + return + +/obj/item/spirit_chime/Initialize() + . = ..() + // Sets up a field with a range of 10 + chime_field = new /datum/proximity_monitor/advanced/spirit_chime(src, range) + chime_field.recalculate_field(full_recalc = TRUE) + if(!ringing) + initial_check() + +/obj/item/spirit_chime/Destroy() + ringing = FALSE + QDEL_NULL(chime_field) + STOP_PROCESSING(SSprocessing, src) + return ..() + +/obj/item/spirit_chime/process(delta_time) + var/valid_targets = FALSE + if(!ringing || !isplaced || !chime_field) + ringing = FALSE + STOP_PROCESSING(SSprocessing, src) + return + for(var/mob/dead/observer/ghost in chime_field.tracked_mobs) // Check if there are still valid targets + if(valid_target(ghost)) + valid_targets = TRUE + break + for(var/mob/dead/observer/ghost in chime_field.tracked_mobs) + if(ghost.z != z || !valid_target(ghost) || get_dist(get_turf(src), get_turf(ghost)) > chime_field.current_range) // Check for invalid targets & out of range + chime_field.tracked_mobs -= ghost + if(!valid_targets) // End if no valid targets + ringing = FALSE + chime_field.tracked_mobs.Cut() + STOP_PROCESSING(SSprocessing, src) + return + if(COOLDOWN_FINISHED(src, ring_cooldown)) + ring() + COOLDOWN_START(src, ring_cooldown, 5 SECONDS) + +// The proimity monitor that creates the detection field +/datum/proximity_monitor/advanced/spirit_chime + edge_is_a_field = TRUE + var/list/tracked_mobs = list() + var/obj/item/spirit_chime/chime + +/datum/proximity_monitor/advanced/spirit_chime/New(host, range) + . = ..() + chime = host + +/datum/proximity_monitor/advanced/spirit_chime/field_turf_crossed(atom/movable/entered, turf/old_location, turf/new_location) // Handles when a mob enters the field + . = ..() + if(!chime.isplaced) + return + if(entered.z != chime.z) + return + if(valid_target(entered)) + if(!(entered in tracked_mobs)) + tracked_mobs |= entered + if(tracked_mobs.len == 1) // Starts ringing on the first target, continues until there are no more targets + chime.start_ringing() + else if(tracked_mobs.len < 1) + chime.stop_ringing() + if(!valid_target(entered)) + if(entered.orbiters) + for(var/mob/dead/observer/ghost in entered.get_all_orbiters()) // Check for orbiting ghosts in the field + if(valid_target(ghost)) + if(!(ghost in tracked_mobs)) + tracked_mobs |= ghost + if(tracked_mobs.len == 1) + chime.start_ringing() + else if(tracked_mobs.len < 1) + chime.stop_ringing() + +/datum/proximity_monitor/advanced/spirit_chime/field_turf_uncrossed(atom/movable/gone, turf/old_location, turf/new_location) // Handles when a mob leaves the field + . = ..() + if(!chime.isplaced) + return + if(gone in tracked_mobs) + tracked_mobs -= gone + if(gone.z != chime.z || !valid_target(gone)) + if(gone in tracked_mobs) + tracked_mobs -= gone + if(gone.orbiters) + for(var/mob/dead/observer/ghost in gone.get_all_orbiters()) + if(ghost in tracked_mobs) + tracked_mobs -= ghost + +// Procs +// DARKPACK TODO - chime get it working please +/obj/item/spirit_chime/proc/start_ringing() + if(ringing || !isplaced || !chime_field) + return + ringing = TRUE + START_PROCESSING(SSprocessing, src) + +/obj/item/spirit_chime/proc/stop_ringing() + ringing = FALSE + STOP_PROCESSING(SSprocessing, src) + +/obj/item/spirit_chime/proc/ring() + playsound(src, 'modular_darkpack/modules/ritual_thaumaturgy/sounds/spirit_chime_ring.ogg', 25, FALSE) + visible_message(span_notice("The chime rings out!"), vision_distance = range) + +/obj/item/spirit_chime/proc/initial_check() + for(var/mob/M in range(range, src)) + if(valid_target(M) && !(M in chime_field.tracked_mobs)) + chime_field.tracked_mobs |= M + if(chime_field.tracked_mobs.len > 0 && !ringing) + ringing = TRUE + START_PROCESSING(SSprocessing, src) + +/proc/valid_target(atom/movable/target) + if(istype(target, /mob/dead/observer)) + var/mob/dead/observer/ghost = target + if((ghost.mind) || isavatar(ghost)) // Checks only for ghosts of the dead & Auspex 5 avatars -- need to add an aghosted check + return TRUE + if(ghost.mind && ghost.orbiting) // Checks for orbiting ghosts + return TRUE + + return FALSE diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/deflection_wooden_doom.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/deflection_wooden_doom.dm new file mode 100644 index 000000000000..dff9cc439b6c --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/deflection_wooden_doom.dm @@ -0,0 +1,20 @@ +// **************************************************************** DEFLECTION OF THE WOODEN DOOM ************************************************************* + +//Deflection of the Wooden Doom ritual +//Protects you from being staked for a single hit. Is it useful? Marginally. But it is a level 1 rite. +/obj/ritual_rune/thaumaturgy/deflection_stake + name = "deflection of the wooden doom" + desc = "Shield your heart and splinter the enemy stake. Requires a stake." + icon_state = "rune7" + word = "Splinter, shatter, break the wooden doom." + level = 1 + sacrifices = list(/obj/item/vampire_stake) + +/obj/ritual_rune/thaumaturgy/deflection_stake/complete() + for(var/mob/living/carbon/human/H in loc) + if(!HAS_TRAIT(H, TRAIT_STAKE_RESISTANT)) + ADD_TRAIT(H, TRAIT_STAKE_RESISTANT, MAGIC_TRAIT) + qdel(src) + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) + color = rgb(255,0,0) + activated = TRUE diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/gargoyle_transformation.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/gargoyle_transformation.dm new file mode 100644 index 000000000000..6a277076db15 --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/gargoyle_transformation.dm @@ -0,0 +1,208 @@ +/obj/ritual_rune/thaumaturgy/gargoyle + name = "gargoyle transformation" + desc = "Create a Gargoyle from vampire bodies. One body creates a normal Gargoyle, two bodies create a perfect Gargoyle." + icon_state = "rune9" + word = "FORMA-GARGONEM" + level = 5 + var/duration_length = 60 SECONDS + +/obj/ritual_rune/thaumaturgy/gargoyle/complete() + // vampire bodies only + var/list/valid_bodies = list() + + for(var/mob/living/carbon/human/H in loc) + if(iskindred(H)) + if(H == usr) + to_chat(usr, span_warning("You may not turn yourself into a Gargoyle!")) + return + else if(H.is_clan(/datum/vampire_clan/gargoyle)) + to_chat(usr, span_warning("You may not use this ritual on a Gargoyle!")) + return + else if(H.stat > SOFT_CRIT) + valid_bodies += H + else + H.adjust_agg_loss(50) + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 10, FALSE) + to_chat(usr, "Your specimen must be incapacitated! The ritual has merely hurt them!") + return + + + if(valid_bodies.len < 1) + to_chat(usr, span_warning("The ritual requires at least one vampire body!")) + return + + // Begin the ritual + var/body_count = valid_bodies.len + to_chat(usr, span_notice("You begin invoking the ritual of Gargoyle Creation with [body_count] vampire bod[body_count == 1 ? "y" : "ies"]...")) + usr.visible_message(span_notice("[usr] begins invoking a ritual with [body_count] vampire bod[body_count == 1 ? "y" : "ies"]...")) + + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) + // DARKPACK TODO - vicissitude, when its reintroduced re-path this + playsound(loc, 'modular_darkpack/modules/deprecated/sounds/vicissitude.ogg', 50, FALSE) + + // Apply stun so that they cant just crawl away in crit - caster must also stay still + for(var/mob/living/carbon/human/H in valid_bodies) + H.Stun(600) + H.emote("twitch") + + // Start the transformation process + if(do_after(usr, duration_length, usr)) + activated = TRUE + last_activator = usr + + // Determine if we're creating a perfect gargoyle (2+ bodies) or regular (1 body) + var/perfect_gargoyle = (body_count >= 2) + + var/transformation_message + if(perfect_gargoyle) + transformation_message = span_cult("The bodies begin to merge and petrify into a massive stone form!") + else + transformation_message = span_cult("The body begins to petrify into a stone form!") + visible_message(transformation_message) + + // Complete the transformation + addtimer(CALLBACK(src, PROC_REF(gargoyle_transform), valid_bodies, perfect_gargoyle), 1 SECONDS) + else + to_chat(usr, span_warning("Your ritual was interrupted!")) + // Unstun the bodies if interrupted + for(var/mob/living/carbon/human/H in valid_bodies) + H.Stun(5) // Brief stun to recover + +/obj/ritual_rune/thaumaturgy/gargoyle/proc/gargoyle_transform(list/bodies, perfect_gargoyle = FALSE) + if(!bodies || bodies.len < 1) + return + + if(perfect_gargoyle) + // Create perfect gargoyle (2+ bodies) -- you'd have to frag two different kindred players to create a perfect gargoyle. + var/mob/living/basic/gargoyle/perfect/G = new /mob/living/basic/gargoyle/perfect(loc) + G.visible_message(span_cult("A massive perfect Gargoyle rises from the ritual!")) + + // Ensure perfect gargoyle is at full health + G.revive(TRUE) + G.health = G.maxHealth + + // Handle the other bodies + for(var/mob/living/carbon/human/H in bodies) + if(!QDELETED(H)) + for(var/datum/action/A in H.actions) + if(A && A.vampiric) + A.Remove(H) + + H.gib(FALSE, FALSE, TRUE) + + // Add ghost control component + G.AddComponent(\ + /datum/component/ghost_direct_control,\ + poll_candidates = TRUE,\ + role_name = "a Perfect Gargoyle",\ + poll_length = 30 SECONDS,\ + assumed_control_message = "You are a Perfect Gargoyle! A massive stone creation of Tremere magic.",\ + after_assumed_control = CALLBACK(src, PROC_REF(perfect_gargoyle_player_controlled), G)\ + ) + //poll_ignore_key = POLL_IGNORE_PERFECT_GARGOYLE, + + + // Set up timer to give AI if no one takes control + addtimer(CALLBACK(src, PROC_REF(perfect_gargoyle_check_ai), G, last_activator), 31 SECONDS) + + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) + playsound(loc, 'modular_darkpack/modules/deprecated/sounds/vicissitude.ogg', 50, FALSE) + else + // Create normal sentient gargoyle (1 body) + var/mob/living/carbon/human/target_body = bodies[1] + var/old_name = target_body.real_name + + // Transform the body into a gargoyle + if(!target_body || QDELETED(target_body) || target_body.stat > DEAD) + return + + // Remove any vampiric actions + for(var/datum/action/A in target_body.actions) + if(A && A.vampiric) + A.Remove(target_body) + + var/original_location = get_turf(target_body) + + // Revive the specimen and turn them into a gargoyle kindred + target_body.revive(TRUE) + target_body.adjust_agg_loss(-100) + target_body.make_kindred(clan = /datum/vampire_clan/gargoyle) + target_body.blood_bond(usr) + target_body.real_name = old_name // the ritual for some reason is deleting their old name and replacing it with a random name. + target_body.name = old_name + target_body.update_name() + + target_body.give_st_powers(target_body.get_clan().clan_disciplines) + + if(target_body.loc != original_location) + target_body.forceMove(original_location) + + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) + playsound(target_body.loc, 'modular_darkpack/modules/deprecated/sounds/vicissitude.ogg', 50, FALSE) + + // Handle key assignment + if(!target_body.key) + target_body.AddComponent(\ + /datum/component/ghost_direct_control,\ + poll_candidates = TRUE,\ + role_name = "a Sentient Gargoyle",\ + poll_length = 30 SECONDS,\ + + assumed_control_message = "You have been transformed into a Gargoyle!",\ + after_assumed_control = CALLBACK(src, PROC_REF(sentient_gargoyle_name_prompt), target_body)\ + ) + + //poll_ignore_key = POLL_IGNORE_SENTIENT_GARGOYLE, + + target_body.visible_message(span_cult("A Gargoyle rises from the ritual!")) + + qdel(src) + +/obj/ritual_rune/thaumaturgy/gargoyle/proc/perfect_gargoyle_player_controlled(mob/living/basic/gargoyle/perfect/G) + message_admins("[key_name_admin(G)] has become a Perfect Gargoyle.") + +/obj/ritual_rune/thaumaturgy/gargoyle/proc/perfect_gargoyle_check_ai(mob/living/basic/gargoyle/perfect/G, mob/living/carbon/human/activator) + // Check if someone took control, if not give it AI + if(!G || QDELETED(G)) + return + if(!G.key || !G.client) + G.ai_controller = new /datum/ai_controller/basic_controller/beastmaster_summon(G) + if(activator) + activator.add_beastmaster_minion(G) + +/obj/ritual_rune/thaumaturgy/gargoyle/proc/sentient_gargoyle_name_prompt(mob/living/carbon/human/target_body) + message_admins("[key_name_admin(target_body)] has become a Sentient Gargoyle.") + + var/choice = tgui_alert(target_body, "Do you want to pick a new name as a Gargoyle?", "Gargoyle Choose Name", list("Yes", "No"), 10 SECONDS) + if(choice == "Yes") + var/chosen_gargoyle_name = tgui_input_text(target_body, "What is your new name as a Gargoyle?", "Gargoyle Name Input") + if(chosen_gargoyle_name) + target_body.real_name = chosen_gargoyle_name + target_body.name = chosen_gargoyle_name + target_body.update_name() + +// Perfect Gargoyle definition +/mob/living/basic/gargoyle/perfect + name = "Perfect Gargoyle" + desc = "A massive stone-skinned monstrosity with enhanced strength and durability." + icon = 'modular_darkpack/modules/deprecated/icons/32x48.dmi' + icon_state = "gargoyle_m" + icon_living = "gargoyle_m" + mob_size = MOB_SIZE_LARGE + speed = -2 + maxHealth = 600 + health = 600 + //harm_intent_damage = 8 + melee_damage_lower = 35 + melee_damage_upper = 60 + attack_verb_continuous = "brutally crushes" + attack_verb_simple = "brutally crush" + attack_sound = 'sound/items/weapons/bladeslice.ogg' + bloodpool = 15 + maxbloodpool = 15 + ai_controller = null // Start with no AI, will be assigned if no player takes it + +/mob/living/basic/gargoyle/perfect/Initialize() + . = ..() + // Make the perfect gargoyle slightly larger + transform = transform.Scale(1.10, 1.10) diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/question_to_the_ancestors.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/question_to_the_ancestors.dm new file mode 100644 index 000000000000..d51f253c754c --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/question_to_the_ancestors.dm @@ -0,0 +1,51 @@ +/obj/ritual_rune/thaumaturgy/question + name = "question to the ancestors" + desc = "Summon souls from the dead. Ask a question and get answers. Requires a bloodpack." + icon_state = "rune5" + word = "VOCA-ANI'MA" + level = 3 + sacrifices = list(/obj/item/reagent_containers/blood) + +/mob/living/basic/ghost/tremere + maxHealth = 1 + health = 1 + melee_damage_lower = 1 + melee_damage_upper = 1 + faction = list(VAMPIRE_CLAN_TREMERE) + icon = 'modular_darkpack/modules/npc/icons/necromancy_zombies.dmi' + icon_state = "ghost_animated" + icon_living = "ghost_animated" + +/obj/ritual_rune/thaumaturgy/question/complete() + var/text_question = tgui_input_text(usr, "Enter your question to the Ancestors:", "Question to Ancestors") + if(!text_question) + return + + visible_message(span_notice("A call rings out to the dead from the [src.name] rune...")) + + var/mob/living/basic/ghost/tremere/TR = new(loc) + + TR.AddComponent(\ + /datum/component/ghost_direct_control,\ + poll_candidates = TRUE,\ + role_name = "an Ancestor Spirit",\ + poll_length = 30 SECONDS,\ + poll_question = "Do you wish to answer a question?\nThe question is: [text_question]",\ + assumed_control_message = "You are an Ancestor Spirit summoned to answer: [text_question]",\ + after_assumed_control = CALLBACK(src, PROC_REF(ghost_name_prompt), TR)\ + ) + + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) + qdel(src) + +/obj/ritual_rune/thaumaturgy/question/proc/ghost_name_prompt(mob/living/basic/ghost/tremere/ghost_mob) + message_admins("[key_name_admin(ghost_mob)] has become a Tremere Ghost.") + + var/choice = tgui_alert(ghost_mob, "Do you want to pick a new name as a Ghost?", "Ghost Choose Name", list("Yes", "No"), 10 SECONDS) + if(choice == "Yes") + var/chosen_ghost_name = tgui_input_text(ghost_mob, "What is your new name as a Ghost?", "Ghost Name Input") + if(chosen_ghost_name) + ghost_mob.real_name = chosen_ghost_name + ghost_mob.name = chosen_ghost_name + + //poll_ignore_key = POLL_IGNORE_ANCESTOR_SPIRIT, diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/self_gib.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/self_gib.dm new file mode 100644 index 000000000000..7ae180644481 --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/self_gib.dm @@ -0,0 +1,9 @@ +/obj/ritual_rune/thaumaturgy/selfgib + name = "self destruction" + desc = "Meet the Final Death." + icon_state = "rune2" + word = "CHNGE DA'WORD, GDBE" + +/obj/ritual_rune/thaumaturgy/selfgib/complete() + last_activator.death() + diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/teleport.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/teleport.dm new file mode 100644 index 000000000000..a46e499ae86c --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/teleport.dm @@ -0,0 +1,77 @@ +/obj/ritual_rune/thaumaturgy/teleport + name = "teleportation" + desc = "Move your body among the city streets. Requires a bloodpack." + icon_state = "rune6" + word = "CLAV'TRANSITUM" + level = 5 + sacrifices = list(/obj/item/reagent_containers/blood) + +/obj/ritual_rune/thaumaturgy/teleport/complete() + if(!activated) + activated = TRUE + color = rgb(255,255,255) + icon_state = "teleport" + +/obj/ritual_rune/thaumaturgy/teleport/attack_hand(mob/user) + ..() + if(activated) + if(last_activator != user) + to_chat(user, span_warning("You are not the one who activated this rune!")) + return + var/direction = tgui_input_list(user, "Choose direction:", "Teleportation Rune", list("North", "East", "South", "West")) + if(direction) + var/x_dir = user.x + var/y_dir = user.y + var/step = 1 + var/min_distance = 10 + var/max_distance = 20 + var/valid_destination = FALSE + var/turf/destination = null + + if(get_dist(src, user) > 1) + to_chat(user, span_warning("You moved away from the rune!")) + return + + // Move at least min_distance tiles in the chosen direction + while(step <= min_distance) + switch(direction) + if("North") + y_dir += 1 + if("East") + x_dir += 1 + if("South") + y_dir -= 1 + if("West") + x_dir -= 1 + step += 1 + + // Continue moving until a valid destination is found or max_distance is reached + while(step <= max_distance && !valid_destination) + switch(direction) + if("North") + y_dir += 1 + if("East") + x_dir += 1 + if("South") + y_dir -= 1 + if("West") + x_dir -= 1 + + if(x_dir < 15 || x_dir > 240 || y_dir < 15 || y_dir > 240) + to_chat(user, span_warning("You can't teleport outside the city!")) + return + + destination = locate(x_dir, y_dir, user.z) + if(destination && !istype(destination, /turf/open/space/basic) && !istype(destination, /turf/closed/wall/vampwall)) + valid_destination = TRUE + else + step += 1 + + if(valid_destination) + playsound(loc, 'modular_darkpack/modules/powers/sounds/thaum.ogg', 50, FALSE) + user.forceMove(destination) + qdel(src) + else + to_chat(user, span_warning("The spell fails as no destination is found!")) + + diff --git a/modular_darkpack/modules/ritual_thaumaturgy/sounds/spirit_chime_ring.ogg b/modular_darkpack/modules/ritual_thaumaturgy/sounds/spirit_chime_ring.ogg new file mode 100644 index 000000000000..9205d176108c Binary files /dev/null and b/modular_darkpack/modules/ritual_thaumaturgy/sounds/spirit_chime_ring.ogg differ diff --git a/modular_darkpack/modules/ritual_thaumaturgy/thaumaturgy_rune_drawing_action.dm b/modular_darkpack/modules/ritual_thaumaturgy/thaumaturgy_rune_drawing_action.dm new file mode 100644 index 000000000000..e969405371d6 --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/thaumaturgy_rune_drawing_action.dm @@ -0,0 +1,7 @@ +/datum/action/ritual_drawing/thaumaturgy + name = "Thaumaturgy" + desc = "Blood magic rune drawing." + button_icon_state = "thaumaturgy" + rune_type = /obj/ritual_rune/thaumaturgy + tome_type = /obj/item/ritual_tome/arcane + speed_stat = STAT_PERMANENT_WILLPOWER diff --git a/modular_darkpack/modules/round_status/code/admin_verb.dm b/modular_darkpack/modules/round_status/code/admin_verb.dm new file mode 100644 index 000000000000..6f189ca99fbb --- /dev/null +++ b/modular_darkpack/modules/round_status/code/admin_verb.dm @@ -0,0 +1,11 @@ +ADMIN_VERB(toggle_canon, R_ADMIN, "Toggle Canon", "Toggle the canon of the round.", ADMIN_CATEGORY_EVENTS) + GLOB.canon_event = !GLOB.canon_event + SEND_SOUND(world, sound('modular_darkpack/modules/round_status/sounds/canon.ogg', FALSE, FALSE, 25)) + if(GLOB.canon_event) + to_chat(world, "<b>THE ROUND IS NOW CANON. DATA WILL SAVE.</b>") + else + to_chat(world, "<b>THE ROUND IS NO LONGER CANON. DATA WILL NO LONGER SAVE. ROLEPLAY AND ESCALATION IS STILL EXPECTED.</b>") + message_admins("[key_name_admin(usr)] toggled the round's canonicity. The round is [GLOB.canon_event ? "now canon." : "no longer canon."]") + log_admin("[key_name(usr)] toggled the round's canonicity. The round is [GLOB.canon_event ? "now canon." : "no longer canon."]") + + BLACKBOX_LOG_ADMIN_VERB("Toggle Canon") diff --git a/modular_darkpack/modules/round_status/code/pref_code.dm b/modular_darkpack/modules/round_status/code/pref_code.dm new file mode 100644 index 000000000000..3a8dbf209171 --- /dev/null +++ b/modular_darkpack/modules/round_status/code/pref_code.dm @@ -0,0 +1,8 @@ +/// Wrapper for write_preference to prevent writing for non-canon events like EORG +/// Returns TRUE for a successful preference application. +/// Returns FALSE if it is invalid or the round was not canon. +/datum/preferences/proc/write_preference_midround(datum/preference/preference, preference_value) + if(!GLOB.canon_event) + to_chat(parent, span_warning("Cannot save preference: [preference.savefile_key]; current round is not canon.")) + return FALSE + return write_preference(preference, preference_value) diff --git a/modular_darkpack/modules/deprecated/sounds/canon.ogg b/modular_darkpack/modules/round_status/sounds/canon.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/canon.ogg rename to modular_darkpack/modules/round_status/sounds/canon.ogg diff --git a/modular_darkpack/modules/sabbat/code/sabbat_blood_bath.dm b/modular_darkpack/modules/sabbat/code/sabbat_blood_bath.dm new file mode 100644 index 000000000000..e8c5d7737ead --- /dev/null +++ b/modular_darkpack/modules/sabbat/code/sabbat_blood_bath.dm @@ -0,0 +1,140 @@ +/obj/structure/bath/sabbatbath + name = "sabbat bath" + desc = "A large ceremonial bath, commonly used in Sabbat rituals. It appears to be designed to hold blood." + icon_state = "tub" + can_buckle = TRUE + buckle_lying = 90 + layer = BELOW_MOB_LAYER + var/blood_level = 0 + var/max_blood = 500 + var/list/blood_donors = list() + +/obj/structure/bath/sabbatbath/Initialize() + . = ..() + create_reagents(max_blood, INJECTABLE) + update_icon() + +/obj/structure/bath/sabbatbath/examine(mob/user) + . = ..() + if(blood_level <= 0) + . += span_notice("The bath is empty.") + else + . += span_notice("The bath is filled with blood.") + + if(length(blood_donors) > 0) + . += span_notice("You can sense [length(blood_donors)] different blood donor[length(blood_donors) == 1 ? "" : "s"] in the mixture.") + +/obj/structure/bath/sabbatbath/update_icon() + . = ..() + // Change the sprite when it contains blood + if(blood_level > 0) + icon = 'modular_darkpack/modules/sabbat/icons/sabbat_blood_bath.dmi' + icon_state = "bath_full_blood" + else + icon = 'modular_darkpack/modules/decor/icons/bathroom.dmi' + icon_state = "tub" + +/obj/structure/bath/sabbatbath/attackby(obj/item/W, mob/living/carbon/user, params) + if(istype(W, /obj/item/sabbat_priest_tome)) + if(user.mind && is_sabbat_priest(user) && has_buckled_mobs()) + var/mob/living/buckled_mob = buckled_mobs[1] + if(buckled_mob.mind) + // First, demote any existing Ductus to regular Sabbat Pack + for(var/mob/living/carbon/human/H in GLOB.player_list) + if(H.mind && is_sabbat_ductus(H)) + H.mind.set_assigned_role(SSjob.get_job_type(/datum/job/vampire/sabbatpack)) + var/datum/antagonist/temp_antag = new() + //temp_antag.remove_antag_hud(ANTAG_HUD_REV, H) + //temp_antag.add_antag_hud(ANTAG_HUD_REV, "rev", H) + qdel(temp_antag) + + to_chat(H, span_cult("You feel your authority as Ductus slipping away... You are now a regular pack member...")) + // Then promote the new Ductus + buckled_mob.mind.set_assigned_role(SSjob.get_job_type(/datum/job/vampire/sabbatductus)) + var/datum/antagonist/temp_antag = new() + //temp_antag.add_antag_hud(ANTAG_HUD_REV, "rev_head", buckled_mob) + qdel(temp_antag) + // Notify all Sabbat members of the new Ductus + for(var/mob/living/carbon/human/sabbat_member in GLOB.player_list) + if(sabbat_member.mind && is_sabbatist(sabbat_member)) + to_chat(sabbat_member, span_cult("[buckled_mob] has been anointed as the new Ductus of the pack!")) + + to_chat(buckled_mob, span_cult("You have been anointed as the new Ductus of the pack!")) + return + if(istype(W, /obj/item/knife/vamp)) + playsound(loc,'sound/items/weapons/bladeslice.ogg', 50, FALSE) + if(do_after(user, 100)) + if(user.bloodpool <= 0) + to_chat(user, span_warning("You have no blood to donate!")) + return + + user.visible_message(span_notice("[user] cuts [user.p_their()] wrist and lets blood flow into the bath."), span_notice("You cut your wrist and let blood flow into the bath.")) + + var/amount_to_donate = min(user.bloodpool, 3) + + user.bloodpool -= amount_to_donate + + blood_level = min(blood_level + amount_to_donate, max_blood) + reagents.add_reagent(/datum/reagent/blood, amount_to_donate) + + if(!(user in blood_donors)) + blood_donors += user + + update_icon() + + return TRUE + else + to_chat(user, span_warning("You decide not to add your blood to the bathtub...")) + + // Handle vaulderie goblet specifically so that the Priest can use the tub's blood for vaulderie (part of the blood bath rite) + if(istype(W, /obj/item/reagent_containers/cup/silver_goblet/vaulderie_goblet)) + var/obj/item/reagent_containers/cup/silver_goblet/vaulderie_goblet/goblet = W + if(blood_level <= 0) + to_chat(user, span_warning("The bath is empty.")) + return + + var/transfer_amount = min(goblet.volume - goblet.reagents.total_volume, blood_level) + if(transfer_amount <= 0) + to_chat(user, span_warning("The goblet is already full.")) + return + + user.visible_message(span_notice("[user] scoops blood from the bath into [goblet]."), span_notice("You scoop blood from the bath into [goblet].")) + + reagents.trans_to(goblet, transfer_amount) + blood_level -= transfer_amount + + if(length(blood_donors) > 0) + goblet.blood_donors = blood_donors + + if(blood_level <= 0) + update_icon() + + return TRUE + + return ..() + +/obj/structure/bath/sabbatbath/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE) + . = ..() + if(. && blood_level > 0) + playsound(loc, 'modular_darkpack/modules/deprecated/sounds/catched.ogg', 50, FALSE) + if(do_after(user, 100)) + if(M == user) + M.visible_message(span_notice("[user] climbs into the blood-filled bath."), span_notice("You climb into the blood-filled bath.")) + else + M.visible_message(span_notice("[user] places [M] in the blood-filled bath."), span_notice("[user] places you in the blood-filled bath.")) + + +/obj/structure/bath/sabbatbath/user_unbuckle_mob(mob/living/buckled_mob, mob/user) + . = ..() + if(.) + if(buckled_mob == user) + buckled_mob.visible_message(span_notice("[buckled_mob] climbs out of the bath."), span_notice("You climb out of the bath.")) + else + buckled_mob.visible_message(span_notice("[user] pulls [buckled_mob] out of the bath."), span_notice("[user] pulls you out of the bath.")) + + // Create blood splatters as they exit + if(blood_level > 0 && ishuman(buckled_mob)) + var/turf/T = get_turf(src) + for(var/turf/adjacent in RANGE_TURFS(1, T)) + if(prob(40) && adjacent != T) + buckled_mob.add_splatter_floor(adjacent) diff --git a/modular_darkpack/modules/sabbat/code/sabbat_monomacy_rune.dm b/modular_darkpack/modules/sabbat/code/sabbat_monomacy_rune.dm new file mode 100644 index 000000000000..e9762c4ac3e0 --- /dev/null +++ b/modular_darkpack/modules/sabbat/code/sabbat_monomacy_rune.dm @@ -0,0 +1,69 @@ +#define MONOMACY_COOLDOWN_DURATION (10 MINUTES) + +/obj/sabbatrune + name = "Monomacy Rune" + desc = "Monomacy is the rite of resolving disputes among pack mates. Challenge that curr to a duel!" + icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' + icon_state = "rune9" + color = rgb(64, 64, 64) + anchored = TRUE + var/activated = FALSE + var/mob/living/last_activator + var/list/sacrifices = list() + var/MONOMACY_CHALLENGE_COOLDOWN + +/obj/sabbatrune/attack_hand(mob/living/user) + . = ..() + + if(!is_sabbatist(user)) + to_chat(user, span_warning("You do not understand the power of this rune.")) + return + + if(!COOLDOWN_FINISHED(src, MONOMACY_CHALLENGE_COOLDOWN)) + to_chat(user, span_warning("The rune is still cooling down from the last challenge.")) + return + + last_activator = user + issue_challenge(user) + +/obj/sabbatrune/proc/issue_challenge(mob/living/challenger) + var/challenged_name = tgui_input_text(challenger, "Enter the name of the person you wish to challenge to Monomacy:", "Monomacy Challenge") + if(!challenged_name) + return + + var/mob/living/target = null + for(var/mob/living/carbon/human/H in GLOB.player_list) + // if the target is not dead, is the challenger isnt targeting themselves, if the target is a sabbatist, and if one of the name datums match the name input + if(H.stat != DEAD && H != challenger && is_sabbatist(H) && (findtext(H.real_name, challenged_name) || findtext(H.name, challenged_name))) + target = H + + if(!target) + to_chat(challenger, span_cult("Could not find anyone with that name to challenge! Only members of the Sabbat may engage in Monomacy.")) + return + + + to_chat(challenger, span_cult("You have challenged [target.real_name] to a duel of Monomacy!")) + SEND_SOUND(challenger, sound('modular_darkpack/master_files/sounds/announce.ogg')) + + to_chat(target, span_cult("[challenger.real_name] challenges you to a duel of Monomacy! Return to the lair at once!")) + SEND_SOUND(target, sound('modular_darkpack/master_files/sounds/announce.ogg')) + + for(var/mob/living/carbon/human/M in viewers(7, src)) + if(M != challenger && M != target) + to_chat(M, span_cult("[challenger.real_name] has challenged [target.real_name] to a duel of Monomacy!")) + SEND_SOUND(M, sound('modular_darkpack/master_files/sounds/announce.ogg')) + + for(var/mob/living/carbon/human/priest in GLOB.player_list) + if(is_sabbat_priest(priest)) + to_chat(priest, span_cult("[challenger.real_name] has challenged [target.real_name] to a duel of Monomacy! Return to the lair at once to ensure Caine's will is done.")) + SEND_SOUND(priest, sound('modular_darkpack/master_files/sounds/announce.ogg')) + + animate(src, color = rgb(192, 192, 192), time = 2) + animate(color = rgb(64, 64, 64), time = 3) + playsound(src, 'sound/effects/magic/smoke.ogg', 20, TRUE) + + COOLDOWN_START(src, MONOMACY_CHALLENGE_COOLDOWN, MONOMACY_COOLDOWN_DURATION) + + log_game("[key_name(challenger)] has challenged [key_name(target)] to Monomacy via sabbatrune.") + +#undef MONOMACY_COOLDOWN_DURATION diff --git a/modular_darkpack/modules/sabbat/code/sabbat_war_party.dm b/modular_darkpack/modules/sabbat/code/sabbat_war_party.dm new file mode 100644 index 000000000000..6bf36d1925eb --- /dev/null +++ b/modular_darkpack/modules/sabbat/code/sabbat_war_party.dm @@ -0,0 +1,32 @@ +/obj/item/sabbat_war_party + name = "Sabbat War Party Totem" + desc = "A totem made from a Vampire's skull, made to summon all Sabbat packs to the Ductus' lair." + icon = 'modular_darkpack/modules/sabbat/icons/sabbat_war_party.dmi' + icon_state = "sabbat_warparty" + item_flags = NOBLUDGEON + w_class = WEIGHT_CLASS_SMALL + +/obj/item/sabbat_war_party/attack_self(mob/user) + . = ..() + + if(!ishuman(user)) + return + + var/mob/living/carbon/human/H = user + + if(!is_sabbat_ductus(user) && !is_sabbat_priest(user)) + to_chat(H, span_cult("Only the Ductus or the Priest may call a War Party from the Totem!")) + return + + var/choice = tgui_alert(H, "Do you wish to send a message to all Sabbat in the city instructing them to return to the Sabbat lair?", "Return", list("Yes", "No"), 10 SECONDS) + if(choice == "Yes") + + // Inform the user about the current status of the totem + to_chat(H, span_notice("The skull's eyes flare with crimson light as you invoke its power.")) + for(var/mob/living/carbon/human/sabbat_member in GLOB.player_list) + if(sabbat_member.mind && is_sabbatist(sabbat_member)) + to_chat(sabbat_member, span_cult("The Ductus calls all pack members back to the lair, return at once!")) + SEND_SOUND(sabbat_member, sound('modular_darkpack/master_files/sounds/announce.ogg')) + sabbat_member.emote("twitch") + else + to_chat(user, span_warning("You decide not to call a war party.")) diff --git a/modular_darkpack/modules/sabbat/code/vaulderie_goblet.dm b/modular_darkpack/modules/sabbat/code/vaulderie_goblet.dm new file mode 100644 index 000000000000..541d65510bf6 --- /dev/null +++ b/modular_darkpack/modules/sabbat/code/vaulderie_goblet.dm @@ -0,0 +1,148 @@ +/obj/item/reagent_containers/cup/silver_goblet + name = "silver goblet" + desc = "A gleaming goblet used in ancient vampire rites." + icon = 'modular_darkpack/modules/sabbat/icons/vaulderie_goblet.dmi' + icon_state = "pewter_cup" + w_class = WEIGHT_CLASS_TINY + force = 1 + throwforce = 1 + amount_per_transfer_from_this = 5 + custom_materials = list(/datum/material/iron=100) + possible_transfer_amounts = list(1, 5) + volume = 80 + spillable = TRUE + resistance_flags = FIRE_PROOF + var/list/blood_donors = list() + +/obj/item/reagent_containers/cup/silver_goblet/is_drainable() + return TRUE + +/obj/item/reagent_containers/cup/silver_goblet/Initialize(mapload) + . = ..() + blood_donors = list() + +/obj/item/reagent_containers/cup/silver_goblet/update_icon_state() + . = ..() + if(reagents && (reagents.has_reagent(/datum/reagent/blood) || reagents.has_reagent(/datum/reagent/blood/vitae))) + icon_state = "pewter_cup_filled_blood" + else + icon_state = "pewter_cup" + +/obj/item/reagent_containers/cup/silver_goblet/attack_self(mob/living/carbon/human/user) + if(!istype(user)) + return ..() + + var/is_vampire_species = FALSE + if(istype(user, /mob/living/carbon/human)) + if(iskindred(user)) + is_vampire_species = TRUE + + if(!is_vampire_species) + to_chat(user, span_warning("You have no urge to spill your blood into this cup.")) + return + + if(reagents.total_volume >= volume) + to_chat(user, span_warning("The [src] is already full!")) + return + + if(user.bloodpool < 2) + to_chat(user, span_warning("You don't have enough blood to spare!")) + return + + user.visible_message(span_notice("[user] prepares to cut their wrist to add blood to the [src]."), span_notice("You prepare to cut your wrist and add your blood to the [src].")) + + if(!do_after(user, 5 SECONDS, target = src)) + to_chat(user, span_warning("You decide not to add your blood to the [src].")) + return + + user.visible_message(span_notice("[user] cuts their wrist and lets blood drip into the [src]."), span_notice("You cut your wrist and let your blood flow into the [src].")) + + playsound(user, 'sound/items/weapons/bladeslice.ogg', 30, TRUE) + user.adjust_brute_loss(5) + + reagents.add_reagent(/datum/reagent/blood/vitae, 10) + user.bloodpool -= 2 + + if(!(user in blood_donors)) + blood_donors += user + + update_appearance() + +/obj/item/reagent_containers/cup/silver_goblet/try_drink(mob/living/target_mob, mob/living/user) + if(!reagents.has_reagent(/datum/reagent/blood) && !reagents.has_reagent(/datum/reagent/blood/vitae)) + return ..() + + var/is_vampire_species = FALSE + if(istype(target_mob, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = target_mob + if(iskindred(H)) + is_vampire_species = TRUE + + if(!is_vampire_species) + return ..() + + if(length(blood_donors) >= 2) + var/choice = tgui_alert(target_mob, "Do you wish to take part in the Vaulderie? This will bind you to the other participants, and remove any previous bonds... (This will cause your character to change sects to the Sabbat!)", "Vaulderie Ritual", list("Yes", "No"), 10 SECONDS) + if(choice != "Yes") + to_chat(target_mob, span_cult("You decide not to participate in the Vaulderie.")) + return ITEM_INTERACT_BLOCKING + + if(length(blood_donors) > 0 && (reagents.has_reagent(/datum/reagent/blood/vitae) || reagents.has_reagent(/datum/reagent/blood))) + for(var/mob/living/carbon/human/donor in blood_donors) + if(target_mob != donor) + to_chat(target_mob, span_warning("You feel a strange connection to <b>[donor]</b> forming as their blood mingles with yours!")) + to_chat(donor, span_notice("You sense that <b>[target_mob]</b> has consumed your blood and is now bound to you.")) + target_mob.visible_message(span_notice("[target_mob]'s eyes flash briefly as they become bound to [donor]."), span_notice("Your eyes flash as the blood bond forms.")) + playsound(target_mob, 'sound/effects/magic/smoke.ogg', 20, TRUE) + + if(length(blood_donors) > 1) + if(!is_sabbatist(target_mob)) + to_chat(target_mob, span_cult("You feel your previous blood bonds vanishing as you take part in the Vaulderie and join the Sabbat...")) + target_mob.mind.set_assigned_role(SSjob.get_job_type(/datum/job/vampire/sabbatpack)) + //var/datum/antagonist/temp_antag = new() + //qdel(temp_antag) + else + var/antag_transferred = FALSE + + for(var/mob/living/carbon/human/donor in blood_donors) + if(donor.mind && is_sabbatist(donor)) + if(target_mob.mind && !is_sabbatist(target_mob)) + to_chat(target_mob, span_warning("You feel a strange connection to [donor] as you drink their blood...")) + target_mob.mind.set_assigned_role(SSjob.get_job_type(/datum/job/vampire/sabbatpack)) + //var/datum/antagonist/temp_antag = new() + //qdel(temp_antag) + antag_transferred = TRUE + break + + if(antag_transferred) + to_chat(target_mob, span_cult("Your mind floods with alien thoughts and philosophies. You now serve the Sabbat!")) + + return ..() + +/obj/item/reagent_containers/cup/silver_goblet/on_reagent_change() + . = ..() + if(reagents.total_volume == 0) + blood_donors.Cut() + update_appearance() + +/obj/item/reagent_containers/cup/silver_goblet/afterattack(obj/target, mob/user, proximity) + if(!proximity || !check_allowed_items(target, 1)) + return + + if(target.is_refillable() && !istype(target, /obj/item/reagent_containers/cup/silver_goblet)) + if(reagents.total_volume > 0 && target.reagents.total_volume < target.reagents.maximum_volume) + blood_donors.Cut() + + return ..() + +/obj/item/reagent_containers/cup/silver_goblet/vaulderie_goblet + name = "Vaulderie Goblet" + desc = "An obsidian-black goblet used in ancient vampire rites." + icon_state = "vaulderie_goblet" + +/obj/item/reagent_containers/cup/silver_goblet/vaulderie_goblet/update_icon_state() + . = ..() + if(reagents && (reagents.has_reagent(/datum/reagent/blood) || reagents.has_reagent(/datum/reagent/blood/vitae))) + icon_state = "vaulderie_goblet_filled" + else + icon_state = "vaulderie_goblet" diff --git a/modular_darkpack/modules/sabbat/icons/sabbat_blood_bath.dmi b/modular_darkpack/modules/sabbat/icons/sabbat_blood_bath.dmi new file mode 100644 index 000000000000..4ae2a415999e Binary files /dev/null and b/modular_darkpack/modules/sabbat/icons/sabbat_blood_bath.dmi differ diff --git a/modular_darkpack/modules/sabbat/icons/sabbat_war_party.dmi b/modular_darkpack/modules/sabbat/icons/sabbat_war_party.dmi new file mode 100644 index 000000000000..9b74861354f9 Binary files /dev/null and b/modular_darkpack/modules/sabbat/icons/sabbat_war_party.dmi differ diff --git a/modular_darkpack/modules/sabbat/icons/vaulderie_goblet.dmi b/modular_darkpack/modules/sabbat/icons/vaulderie_goblet.dmi new file mode 100644 index 000000000000..39d31a104ae8 Binary files /dev/null and b/modular_darkpack/modules/sabbat/icons/vaulderie_goblet.dmi differ diff --git a/modular_darkpack/modules/splats/code/__splat.dm b/modular_darkpack/modules/splats/code/__splat.dm new file mode 100644 index 000000000000..b5e542a30d80 --- /dev/null +++ b/modular_darkpack/modules/splats/code/__splat.dm @@ -0,0 +1,36 @@ +/** + * # Splat + * + * A type of supernatural being (like vampires, werewolves, ghouls, etc.) that + * players can be. Has traits and actions that are inherent to all members + * of the splat. + * + * Also manages the supernatural powers of this splat that the owner has, but + * it's limited until future reworks improve powers. + */ +/datum/splat + abstract_type = /datum/splat + + /// Name of the splat + var/name + /// Description of what the splat is and what it does + var/desc + /// ID for trait sources and whatnot + var/id + + /// Traits possessed by all members of this splat + var/list/splat_traits + /// Actions possessed by all members of this splat + var/list/splat_actions + /// Biotypes possessed by all members of this splat + var/splat_biotypes + /// Base type of the powers that this splat has + var/power_type + + /// Splats that someone with this splat cannot gain + var/list/incompatible_splats + + /// Powers unique to this splat possessed by the owner + var/list/datum/action/powers + /// Mob this splat belongs to + var/mob/living/carbon/human/owner diff --git a/modular_darkpack/modules/splats/code/gaining_splats.dm b/modular_darkpack/modules/splats/code/gaining_splats.dm new file mode 100644 index 000000000000..f97ddda6bb89 --- /dev/null +++ b/modular_darkpack/modules/splats/code/gaining_splats.dm @@ -0,0 +1,71 @@ +/** + * Effects on gaining the splat. + * + * Overridable proc that handles all splat-specific behavior when the splat is + * gained. Called in assign() after the owner gained the splat and its traits, + * actions, and biotypes were added. + */ +/datum/splat/proc/on_gain() + return + +/** + * Assign this splat to a new owner. + * + * Fails if the new owner cannot be given the splat or a signal return cancels + * it. Proceeds to give the splat to the owner and add its traits, actions, and + * biotypes before applying on_gain() effects. Returns the splat on success. + * + * Arguments: + * * owner - Mob gaining the splat. + */ +/datum/splat/proc/assign(mob/living/owner) + SHOULD_NOT_OVERRIDE(TRUE) + + // Cannot add this splat, return null and let the calling proc handle it + if (!owner.is_splat_compatible(type)) + return + + // Allow for splat gain to also be prevented by a signal response + var/signal_return = SEND_SIGNAL(owner, COMSIG_LIVING_GAINING_SPLAT, src) + if (signal_return & SPLAT_PREVENT_GAIN) + return + SEND_SIGNAL(owner, COMSIG_LIVING_GAINED_SPLAT, src) + + src.owner = owner + LAZYADD(owner.splats, src) + + add_splat_traits() + add_actions() + add_biotypes() + + on_gain() + + return src + +/** + * Internal proc to add all of the splat's traits to the new owner on gain. + */ +/datum/splat/proc/add_splat_traits() + PRIVATE_PROC(TRUE) + + LAZYINITLIST(splat_traits) + owner.add_traits(splat_traits, id) + +/** + * Internal proc to add all of the splat's actions to the new owner on gain. + */ +/datum/splat/proc/add_actions() + PRIVATE_PROC(TRUE) + + for (var/adding_action in splat_actions) + var/datum/action/new_action = new adding_action + new_action.Grant(owner) + +/** + * Internal proc to add all of the splat's biotypes to the new owner on gain. + */ +/datum/splat/proc/add_biotypes() + PRIVATE_PROC(TRUE) + + for (var/adding_biotype in splat_biotypes) + owner.mob_biotypes |= adding_biotype diff --git a/modular_darkpack/modules/splats/code/is_splat_helpers.dm b/modular_darkpack/modules/splats/code/is_splat_helpers.dm new file mode 100644 index 000000000000..798b6947c93e --- /dev/null +++ b/modular_darkpack/modules/splats/code/is_splat_helpers.dm @@ -0,0 +1,16 @@ +/** + * How many splats the character has, can be treated as true/false + */ +/proc/issupernatural(mob/character) + if (!isliving(character)) + // Zero splats, this does not account for ghosts being supernatural + return 0 + + var/mob/living/living_character = character + return length(living_character.splats) + +/** + * If the character is not supernatural, ie has no splats + */ +/proc/ismundane(mob/character) + return !issupernatural(character) diff --git a/modular_darkpack/modules/splats/code/losing_splats.dm b/modular_darkpack/modules/splats/code/losing_splats.dm new file mode 100644 index 000000000000..356105d72b10 --- /dev/null +++ b/modular_darkpack/modules/splats/code/losing_splats.dm @@ -0,0 +1,112 @@ +/** + * Effects on losing the splat normally. + * + * Overridable proc that handles most splat-specific behavior when the splat is + * lost. Called in unassign() before any part of the splat is removed from the + * owner. Not called if the owner is being deleted. + */ +/datum/splat/proc/on_lose() + return + +/** + * Effects on losing the splat if the owner isn't null. + * + * Overridable proc that handles splat-specific behavior when the splat is lost. + * Called in unassign() before anything else whether or not the owner is being + * deleted. Should be used only for cleanup like removing the owner from a + * splat-specific global list. + */ +/datum/splat/proc/on_lose_or_destroy() + return + +/** + * Remove this splat from its owner. + * + * Fails if the owner is null, or cleans up the splat if the owner is being + * deleted. First applies on_lose() effects then removes all of the splat's + * traits, actions, and biotypes that were added in assign() before removing + * the splat entirely. + */ +/datum/splat/proc/unassign() + SHOULD_NOT_OVERRIDE(TRUE) + + if (owner) + on_lose_or_destroy() + + if (QDELETED(owner)) + owner = null + clear_powers() + return + + SEND_SIGNAL(owner, COMSIG_LIVING_LOSE_SPLAT, src) + + on_lose() + + clear_powers() + + remove_splat_traits() + remove_actions() + remove_biotypes() + + LAZYREMOVE(owner.splats, src) + owner = null + +/datum/splat/Destroy() + SHOULD_CALL_PARENT(TRUE) + + unassign() + + return ..() + +/** + * Internal proc to remove all of the traits added by this splat on lose. + */ +/datum/splat/proc/remove_splat_traits() + PRIVATE_PROC(TRUE) + + REMOVE_TRAITS_IN(owner, id) + +/** + * Internal proc to remove all of the actions added by this splat on lose. + * Checks for and skips actions that also belong to another splat. + */ +/datum/splat/proc/remove_actions() + PRIVATE_PROC(TRUE) + + // to make sure we don't remove another splat's actions + var/list/other_splat_actions = list() + for (var/datum/splat/splat in (owner.splats - src)) + other_splat_actions |= splat.splat_actions + + // actually remove the actions + for (var/removing_action in splat_actions) + if (removing_action in other_splat_actions) + continue + + for (var/datum/action/action in owner.actions) + if (!istype(action, removing_action)) + continue + + action.Remove(owner) + +/** + * Internal proc to remove all of the biotypes added by this splat on lose. + * Checks for and skips biotypes added by the owner's species or other splats. + */ +/datum/splat/proc/remove_biotypes() + PRIVATE_PROC(TRUE) + + // Make sure we don't remove biotypes they should have without the splat + var/skip_biotypes = NONE + for (var/datum/splat/splat in (owner.splats - src)) + skip_biotypes |= splat.splat_biotypes + if (ishuman(owner)) + var/mob/living/carbon/human/human_owner = owner + skip_biotypes |= human_owner.dna?.species?.inherent_biotypes + + // Remove the biotypes + for (var/biotype in splat_biotypes) + if (skip_biotypes & biotype) + continue + + owner.mob_biotypes &= ~biotype diff --git a/modular_darkpack/modules/splats/code/splat_management.dm b/modular_darkpack/modules/splats/code/splat_management.dm new file mode 100644 index 000000000000..da555294f827 --- /dev/null +++ b/modular_darkpack/modules/splats/code/splat_management.dm @@ -0,0 +1,54 @@ +/** + * Returns the instance of the given splat type possessed by the mob, or null + * if not found. + */ +/mob/proc/get_splat(splat_type) + RETURN_TYPE(/datum/splat) + + return + +/mob/living/get_splat(splat_type) + RETURN_TYPE(/datum/splat) + + return locate(splat_type) in splats + +/** + * Creates a new splat of the given type with the given arguments and assigns it + * to the mob. + */ +/mob/living/proc/add_splat(splat_type, ...) + RETURN_TYPE(/datum/splat) + + var/datum/splat/adding_splat + if (length(args) > 1) + adding_splat = new splat_type(arglist(args.Copy(2))) + else + adding_splat = new splat_type() + + return adding_splat.assign(src) + +/** + * Deletes the splat of the given type possessed by the mob. Returns TRUE if + * found and deleted, or false if not. + */ +/mob/living/proc/remove_splat(splat_type) + var/datum/splat/removing_splat = get_splat(splat_type) + if (removing_splat) + qdel(removing_splat) + return TRUE + + return FALSE + +/** + * Returns if the given splat type can be added to the mob or not. + * Incompatibilities are due to an existing splat clashing with it or the given + * splat type already being present. + */ +/mob/living/proc/is_splat_compatible(splat_type) + for (var/datum/splat/splat as anything in splats) + if (splat_type in splat.incompatible_splats) + return FALSE + if (splat.type == splat_type) + return FALSE + + return TRUE diff --git a/modular_darkpack/modules/splats/code/st_power_management.dm b/modular_darkpack/modules/splats/code/st_power_management.dm new file mode 100644 index 000000000000..18423915b9ec --- /dev/null +++ b/modular_darkpack/modules/splats/code/st_power_management.dm @@ -0,0 +1,96 @@ +/** + * Standardize this all when the power system is made universal, the procs + * have to be implemented on every subtype because powers are currently + * completely unrelated datums. + */ + +/datum/splat/proc/get_power(power_type) + RETURN_TYPE(/datum/action) + + CRASH("get_power() not implemented for [type]!") + +/datum/splat/proc/add_power(power_type, level) + CRASH("add_power() not implemented for [type]!") + +/datum/splat/proc/remove_power(power_type) + CRASH("remove_power() not implemented for [type]!") + +/datum/splat/proc/change_power_level(power_type, new_level) + CRASH("change_power_level() not implemented for [type]!") + +/** + * Internal proc to clean up all power instances owned by this splat. Called by + * unassign() on losing the splat. + */ +/datum/splat/proc/clear_powers() + PRIVATE_PROC(TRUE) + + QDEL_LAZYLIST(powers) + +/** + * Add a list of powers with certain levels to the mob. + * + * Defaults to level 1 if no corresponding level is given for a power. Adds the + * power to a splat that can support it, fails if no splats compatible with + * the power are found. + * + * Arguments: + * * power_types - List of powers to add to the mob. + * * levels - List of power levels to apply to the power of the same index. + */ +/mob/living/carbon/human/proc/give_st_powers(list/power_types, list/levels) + for (var/index in 1 to length(power_types)) + var/power_type = power_types[index] + + var/datum/splat/found_splat = get_splat_with_power_type(power_type) + if (!found_splat) + continue + + // Default to level 1 if none is supplied + var/level = length(levels) >= index ? levels[index] : 1 + + give_st_power(power_type, level) + +/** + * Add a power with a certain level to the mob. Fails if no splat compatible + * with the power is found + */ +/mob/living/carbon/human/proc/give_st_power(power_type, level = 1) + var/datum/splat/found_splat = get_splat_with_power_type(power_type) + if (!found_splat) + return FALSE + + return found_splat.add_power(power_type, level) + +/** + * Remove a power from the mob. + */ +/mob/living/carbon/human/proc/remove_st_power(power_type) + var/datum/splat/found_splat = get_splat_with_power_type(power_type) + if (!found_splat) + return FALSE + + return found_splat.remove_power(power_type) + +/** + * Change the level of a power the mob possesses. + */ +/mob/living/carbon/human/proc/change_st_power_level(power_type, new_level) + var/datum/splat/found_splat = get_splat_with_power_type(power_type) + if (!found_splat) + return FALSE + + return found_splat.change_power_level(power_type, new_level) + +/** + * Returns a splat the mob possesses that can use the given power type. Null if + * none found. + */ +/mob/living/proc/get_splat_with_power_type(power_type) + RETURN_TYPE(/datum/splat) + + for (var/datum/splat/checking_splat as anything in splats) + if (!ispath(power_type, checking_splat.power_type)) + continue + + return checking_splat diff --git a/modular_darkpack/modules/splats/readme.md b/modular_darkpack/modules/splats/readme.md new file mode 100644 index 000000000000..037817a65d1a --- /dev/null +++ b/modular_darkpack/modules/splats/readme.md @@ -0,0 +1,50 @@ +https://github.com/DarkPack13/SecondCity/pull/407 + +## \<Splats> + +Module ID: SPLATS + +### Description: + +A framework for supernatural types (splats) to replace the old species-based splat +code. Splats are the different kinds of supernatural creatures in the World of +Darkness like vampires, ghouls, werewolves, mages, and so on. + +Living mobs can have multiple splat datums, which can all: + +- Apply traits to their owners that determine different aspects of the supernatural + creature, like being immortal or weak to silver. +- Give their owners actions to represent innate supernatural abilities, like using + vampiric blood to heal or empower themselves. +- Optionally give their owners biotypes to represent fundamentally supernatural existences, + like being undead or a spirit. +- Manage which powers the owner is able to use and provide a way to easily interact + with them in code. +- Apply unique effects to their owners upon gaining them, which can easily be undone + when the splat is removed. +- Specify which splats can co-exist with them and dynamically approve or reject new + splats for unique cross-splat interactions like Abominations. + +### TG Proc/File Changes: + +- N/A + +### Modular Overrides: + +- [modular_darkpack/master_files/code/modules/mob/living/living_defines.dm](/modular_darkpack/master_files/code/modules/mob/living/living_defines.dm) + - `var/list/datum/splat/splats` +- [modular_darkpack/master_files/code/modules/mob/living/living.dm](/modular_darkpack/master_files/code/modules/mob/living/living.dm) + - `/mob/living/Destroy()` + +### Defines: + +- [code/\_\_DEFINES/~darkpack/splats.dm](/code/__DEFINES/~darkpack/splats.dm) +- [code/\_\_DEFINES/~darkpack/dcs/splat_signals.dm](/code/__DEFINES/~darkpack/dcs/splat_signals.dm) + +### Included files that are not contained in this module: + +- [modular_darkpack/modules/unit_tests/apply_all_splats.dm](/modular_darkpack/modules/unit_tests/apply_all_splats.dm) + +### Credits: + +@TheCarnalest diff --git a/modular_darkpack/modules/stock_market/code/stockexchange.dm b/modular_darkpack/modules/stock_market/code/stockexchange.dm new file mode 100644 index 000000000000..7caee042f5b8 --- /dev/null +++ b/modular_darkpack/modules/stock_market/code/stockexchange.dm @@ -0,0 +1,15 @@ +/obj/machinery/computer/stockexchange + name = "stock exchange computer" + desc = "A console that connects to the galactic stock market. Stocks trading involves substantial risk of loss and is not suitable for every cargo technician." + icon = 'icons/obj/machines/computer.dmi' + icon_state = "oldcomp" + icon_screen = "stock_computer" + icon_keyboard = "tram_controls" // this is the closest we can get to 'none'. its just nothing. + var/logged_in = "Millenium Stock Department" + var/vmode = 1 + interaction_flags_atom = INTERACT_ATOM_REQUIRES_DEXTERITY | INTERACT_ATOM_UI_INTERACT | INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_REQUIRES_ANCHORED + + light_color = LIGHT_COLOR_GREEN + +//i just removed all the stupid flavcode shit that was here. it was not worth looking at. +//DARKPACK TODO - Stock market rework diff --git a/modular_darkpack/modules/storyteller_dice/code/roll_storyteller_dice.dm b/modular_darkpack/modules/storyteller_dice/code/roll_storyteller_dice.dm deleted file mode 100644 index 5d653bb3bdfb..000000000000 --- a/modular_darkpack/modules/storyteller_dice/code/roll_storyteller_dice.dm +++ /dev/null @@ -1,149 +0,0 @@ -SUBSYSTEM_DEF(roll) - name = "Dice Rolling" - flags = SS_NO_INIT | SS_NO_FIRE - -/** - * Rolls a number of dice according to Storyteller system rules to find - * success or number of successes. - * - * Rolls a number of 10-sided dice, counting them as a "success" if - * they land on a number equal to or greater than the difficulty. Dice - * that land on 1 subtract a success from the total, and the minimum - * difficulty is 2. The number of successes is returned if numerical - * is true, or the roll outcome (botch, failure, success) as a defined - * number if false. - * - * Arguments: - * * dice - number of 10-sided dice to roll. - * * difficulty - the number that a dice must come up as to count as a success. - * * mobs_to_show_output - mobs shown the result - * * alert_atom - the atom over which balloon alerts should appear - * * numerical - whether the proc returns number of successes or outcome (botch, failure, success) - */ -/datum/controller/subsystem/roll/proc/storyteller_roll(dice = 1, difficulty = 6, list/mobs_to_show_output = list(), atom/alert_atom = null, numerical = FALSE) - var/list/rolled_dice = roll_dice(dice) - if(!islist(mobs_to_show_output)) - mobs_to_show_output = list(mobs_to_show_output) - var/list/output_text = list() - output_text += span_notice("Rolling [length(rolled_dice)] dice against difficulty [difficulty].\n") - var/success_count = count_success(rolled_dice, difficulty, output_text) - - var/output = roll_answer(success_count, numerical, output_text) - for(var/mob/player_mob as anything in mobs_to_show_output) - var/output_pref = player_mob.client?.prefs.read_preference(/datum/preference/choiced/dice_output) - - if(output_pref == DICE_OUTPUT_CHAT) - to_chat(player_mob, jointext(output_text, ""), trailing_newline = FALSE) - else if((output_pref == DICE_OUTPUT_BALLOON) && alert_atom) - if(success_count > 0) - alert_atom.balloon_alert(player_mob, "<span style='color: #14a833;'>[success_count]</span>", TRUE) - else - alert_atom.balloon_alert(player_mob, "<span style='color: #ff0000;'>[success_count]</span>", TRUE) - - if(numerical) - return success_count - - return output - -/datum/controller/subsystem/roll/proc/opposed_roll(mob/player_a, mob/player_b, dice_a = 1, dice_b = 1, show_player_a=TRUE, show_player_b=TRUE, atom/alert_atom = null, draw_goes_to_b=TRUE, numerical=FALSE) - var/list/roll_a = roll_dice(dice_a) - var/list/roll_b = roll_dice(dice_b) - var/success_count_a = count_success_no_output(roll_a) - var/success_count_b = count_success_no_output(roll_b) - - var/player_a_succeeded = FALSE - if(success_count_a > success_count_b || (success_count_a == success_count_b && !draw_goes_to_b)) - player_a_succeeded = TRUE - - if(alert_atom) - var/is_zero = ((success_count_a - success_count_b) == 0) - if(show_player_a) - var/alert_text - if(player_a_succeeded) - alert_text = "<span style='color: #14a833;'>[is_zero ?"":"+"][success_count_a - success_count_b]</span>" - else - alert_text = "<span style='color: #ff0000;'>[success_count_a - success_count_b]</span>" - alert_atom.balloon_alert(player_a, alert_text, TRUE) - if(show_player_b) - var/alert_text - if(!player_a_succeeded) - alert_text = "<span style='color: #14a833;'>[is_zero ?"":"+"][success_count_b - success_count_a]</span>" - else - alert_text = "<span style='color: #ff0000;'>[success_count_b - success_count_a]</span>" - alert_atom.balloon_alert(player_b, alert_text, TRUE) - - if(numerical) - return success_count_a - success_count_b - else - return player_a_succeeded - -/datum/controller/subsystem/roll/proc/roll_dice(dice, sides = 10) - dice = max(dice, 1) - var/list/rolled_dice = list() - for(var/i in 1 to dice) - rolled_dice += rand(1, sides) - return rolled_dice - -//Count the number of successes. -/datum/controller/subsystem/roll/proc/count_success(list/rolled_dice, difficulty = 6, output_text) - var/success_count = 0 - for(var/roll in rolled_dice) - if(roll >= difficulty) - output_text += span_nicegreen("[get_dice_char(roll)]") - success_count++ - else if(roll == 1) - output_text += span_bold(span_danger("[get_dice_char(roll)]")) - success_count-- - else - output_text += span_danger("[get_dice_char(roll)]") - output_text += " " - return success_count - -//Count the number of successes. -/datum/controller/subsystem/roll/proc/count_success_no_output(list/rolled_dice, difficulty = 6) - var/success_count = 0 - for(var/roll in rolled_dice) - if(roll >= difficulty) - success_count++ - else if(roll == 1) - success_count-- - return success_count - -/datum/controller/subsystem/roll/proc/roll_answer(success_count, numerical, output_text) - if(numerical) - return success_count - else - if(success_count < 0) - output_text += span_bold(span_danger(("\n Botch!"))) - return ROLL_BOTCH - else if(success_count == 0) - output_text += span_danger("\n Failure!") - return ROLL_FAILURE - else - output_text += span_nicegreen("\n Success!") - return ROLL_SUCCESS - -/datum/controller/subsystem/roll/proc/get_dice_char(input) - switch(input) - if(1) - return "❶" - if(2) - return "❷" - if(3) - return "❸" - if(4) - return "❹" - if(5) - return "❺" - if(6) - return "❻" - if(7) - return "❼" - if(8) - return "❽" - if(9) - return "❾" - if(10) - return "❿" - else - return "⓿" diff --git a/modular_darkpack/modules/storyteller_dice/code/roll_subsystem.dm b/modular_darkpack/modules/storyteller_dice/code/roll_subsystem.dm new file mode 100644 index 000000000000..b5cc9dee641c --- /dev/null +++ b/modular_darkpack/modules/storyteller_dice/code/roll_subsystem.dm @@ -0,0 +1,174 @@ +SUBSYSTEM_DEF(roll) + name = "Dice Rolling" + flags = SS_NO_FIRE + var/on_crit_extra_die_enabled = FALSE + var/on_crit_extra_success_enabled = FALSE + +/datum/controller/subsystem/roll/Initialize() + on_crit_extra_die_enabled = CONFIG_GET(flag/on_crit_additional_die) + on_crit_extra_success_enabled = CONFIG_GET(flag/on_crit_additional_success) + return SS_INIT_SUCCESS + +/** + * Rolls a number of dice according to Storyteller system rules to find + * success or number of successes. + * + * Rolls a number of 10-sided dice, counting them as a "success" if + * they land on a number equal to or greater than the difficulty. Dice + * that land on 1 subtract a success from the total, and the minimum + * difficulty is 2. The number of successes is returned if numerical + * is true, or the roll outcome (botch, failure, success) as a defined + * number if false. + * + * Arguments: + * * dice - number of 10-sided dice to roll. + * * difficulty - the number that a dice must come up as to count as a success. + * * mobs_to_show_output - mobs shown the result + * * alert_atom - the atom over which balloon alerts should appear + * * numerical - whether the proc returns number of successes or outcome (botch, failure, success) + */ +/datum/controller/subsystem/roll/proc/storyteller_roll(dice = 1, difficulty = 6, list/mobs_to_show_output = list(), atom/alert_atom = null, numerical = FALSE) + var/list/rolled_dice = roll_dice(dice) + if(!islist(mobs_to_show_output)) + mobs_to_show_output = list(mobs_to_show_output) + var/list/output_text = list() + output_text += span_notice("Rolling [length(rolled_dice)] dice against difficulty [difficulty].\n") + var/success_count = count_success(rolled_dice, difficulty, output_text) + + var/output = roll_answer(success_count, numerical, output_text) + for(var/mob/player_mob as anything in mobs_to_show_output) + var/output_pref = player_mob.client?.prefs.read_preference(/datum/preference/choiced/dice_output) + + if(output_pref == DICE_OUTPUT_CHAT) + to_chat(player_mob, jointext(output_text, ""), trailing_newline = FALSE) + else if((output_pref == DICE_OUTPUT_BALLOON) && alert_atom) + if(success_count > 0) + alert_atom.balloon_alert(player_mob, "<span style='color: #14a833;'>[success_count]</span>", TRUE) + else + alert_atom.balloon_alert(player_mob, "<span style='color: #ff0000;'>[success_count]</span>", TRUE) + + if(numerical) + return success_count + + return output + +/datum/controller/subsystem/roll/proc/opposed_roll(mob/player_a, mob/player_b, dice_a = 1, dice_b = 1, show_player_a=TRUE, show_player_b=TRUE, atom/alert_atom = null, draw_goes_to_b=TRUE, numerical=FALSE) + var/list/roll_a = roll_dice(dice_a) + var/list/roll_b = roll_dice(dice_b) + var/success_count_a = count_success_no_output(roll_a) + var/success_count_b = count_success_no_output(roll_b) + + var/player_a_succeeded = FALSE + if(success_count_a > success_count_b || (success_count_a == success_count_b && !draw_goes_to_b)) + player_a_succeeded = TRUE + + if(alert_atom) + var/is_zero = ((success_count_a - success_count_b) == 0) + if(show_player_a) + var/alert_text + if(player_a_succeeded) + alert_text = "<span style='color: #14a833;'>[is_zero ?"":"+"][success_count_a - success_count_b]</span>" + else + alert_text = "<span style='color: #ff0000;'>[success_count_a - success_count_b]</span>" + alert_atom.balloon_alert(player_a, alert_text, TRUE) + if(show_player_b) + var/alert_text + if(!player_a_succeeded) + alert_text = "<span style='color: #14a833;'>[is_zero ?"":"+"][success_count_b - success_count_a]</span>" + else + alert_text = "<span style='color: #ff0000;'>[success_count_b - success_count_a]</span>" + alert_atom.balloon_alert(player_b, alert_text, TRUE) + + if(numerical) + return success_count_a - success_count_b + else + return player_a_succeeded + +/datum/controller/subsystem/roll/proc/roll_dice(dice, sides = 10) + dice = max(dice, 1) + var/list/rolled_dice = list() + for(var/i in 1 to dice) + rolled_dice += rand(1, sides) + if(on_crit_extra_die_enabled) + var/extra_dice = 0 + for(var/roll in rolled_dice) + if(roll == 10) + extra_dice++ + for(var/i in 1 to extra_dice) + rolled_dice += rand(1, sides) + return rolled_dice + +//Count the number of successes. +/datum/controller/subsystem/roll/proc/count_success(list/rolled_dice, difficulty = 6, output_text) + var/success_count = 0 + for(var/roll in rolled_dice) + if(roll >= difficulty) + output_text += span_nicegreen("[get_dice_char(roll)]") + success_count++ + if(on_crit_extra_success_enabled) + if(roll == 10) + success_count++ + else if(roll == 1) + output_text += span_bold(span_danger("[get_dice_char(roll)]")) + success_count-- + else + output_text += span_danger("[get_dice_char(roll)]") + output_text += " " + return success_count + +//Count the number of successes. +/datum/controller/subsystem/roll/proc/count_success_no_output(list/rolled_dice, difficulty = 6) + var/success_count = 0 + for(var/roll in rolled_dice) + if(roll >= difficulty) + success_count++ + if(on_crit_extra_success_enabled) + if(roll == 10) + success_count++ + else if(roll == 1) + success_count-- + return success_count + +/datum/controller/subsystem/roll/proc/roll_answer(success_count, numerical, output_text) + if(numerical) + return success_count + else + if(success_count < 0) + output_text += span_bold(span_danger(("\n Botch!"))) + return ROLL_BOTCH + else if(success_count == 0) + output_text += span_danger("\n Failure!") + return ROLL_FAILURE + else + output_text += span_nicegreen("\n Success!") + return ROLL_SUCCESS + +/datum/controller/subsystem/roll/proc/get_dice_char(input) + switch(input) + if(1) + return "❶" + if(2) + return "❷" + if(3) + return "❸" + if(4) + return "❹" + if(5) + return "❺" + if(6) + return "❻" + if(7) + return "❼" + if(8) + return "❽" + if(9) + return "❾" + if(10) + return "❿" + else + return "⓿" + +//Config datums for exploding dice +/datum/config_entry/flag/on_crit_additional_success + +/datum/config_entry/flag/on_crit_additional_die diff --git a/modular_darkpack/modules/storyteller_stats/code/_st_stats.dm b/modular_darkpack/modules/storyteller_stats/code/_st_stats.dm index fc1382714e37..52c583e1d66c 100644 --- a/modular_darkpack/modules/storyteller_stats/code/_st_stats.dm +++ b/modular_darkpack/modules/storyteller_stats/code/_st_stats.dm @@ -1,27 +1,105 @@ - /datum/st_stat + //determines the base type for this class, so we don't add in empty types + abstract_type = /datum/st_stat + /// The name of the stat var/name = "" + /// The description of the stat, shown when hovering over it in the UI. var/description = "" - var/score = 0 - var/bonus_score = 0 - - //determines the base type for this class, so we don't add in empty types - var/base_type = /datum/st_stat - - //if a stat affects the hp pool, recalculate the hp of the mob when changed. - var/affects_health_pool = FALSE + /// The category this stat belongs to. For example, "Attribute" or "Ability". + var/category = "" + /// The subcategory this stat belongs to. For example, "Physical" or "Social". + var/subcategory = "" + /// The current score of this stat. + VAR_PROTECTED/score = 0 + /// Temporary bonus score applied to this stat from various ingame sources. + VAR_PROTECTED/bonus_score = 0 + /// The minimum score this stat can be. + var/min_score = 0 + /// The maximum score this stat can be. + var/max_score = 5 + /// The amount of freebie points that are required to increase this stat by 1 point. + var/freebie_point_cost = 0 + /// Flags for stats, such as if it affects health. + var/stat_flags = NONE + /// If the user can spend points on that stat. + var/editable = TRUE /// A dictionary of modifiers to this attribute. var/list/modifiers = list() + /// What score does this stat start out with at character creation. + var/starting_score = 0 + /// How many points are in this stat category that the player can use. Used in abstract classes only. + VAR_PROTECTED/points = 0 + /// How many freebie points were spent on this stat. Used in abstract classes only. + var/freebie_cost_spent = 0 + +// Score /datum/st_stat/proc/get_score(include_bonus = TRUE) + SHOULD_NOT_OVERRIDE(TRUE) if(include_bonus) return score + bonus_score else return score +/datum/st_stat/proc/get_bonus_score() + SHOULD_NOT_OVERRIDE(TRUE) + return bonus_score + +/datum/st_stat/proc/can_set_score(amount) + SHOULD_NOT_OVERRIDE(TRUE) + if((amount < min_score) || (amount > max_score)) + return FALSE + return TRUE + +// This proc is only ever supposed to be used in stat_pref_middleware.dm for preferences regarding increasing the stat. +/datum/st_stat/proc/can_increase_score(amount) + SHOULD_NOT_OVERRIDE(TRUE) + var/new_score = score + amount + if(new_score > max_score) + return FALSE + return TRUE + +// This proc is only ever supposed to be used in stat_pref_middleware.dm for preferences regarding decreasing the stat. +/datum/st_stat/proc/can_decrease_score(amount) + SHOULD_NOT_OVERRIDE(TRUE) + var/new_score = score - amount + if(new_score < min_score) + return FALSE + return TRUE + /datum/st_stat/proc/set_score(amount) - score = amount + SHOULD_NOT_OVERRIDE(TRUE) + if(!can_set_score(amount)) + return FALSE + score = clamp(amount, min_score, max_score) + return TRUE + +/datum/st_stat/proc/increase_score(amount) + SHOULD_NOT_OVERRIDE(TRUE) + if(!can_increase_score(amount)) + return FALSE + score = clamp(score + amount, min_score, max_score) + return TRUE + +/datum/st_stat/proc/decrease_score(amount) + SHOULD_NOT_OVERRIDE(TRUE) + if(!can_decrease_score(amount)) + return FALSE + score = clamp(score - amount, min_score, max_score) + return TRUE + +// Modifiers + +/datum/st_stat/proc/add_stat_mod(amount, source) + SHOULD_NOT_OVERRIDE(TRUE) + LAZYSET(modifiers, source, amount) + update_modifiers() + +/datum/st_stat/proc/remove_stat_mod(source) + SHOULD_NOT_OVERRIDE(TRUE) + LAZYREMOVE(modifiers, source) + update_modifiers() /datum/st_stat/proc/update_modifiers() SHOULD_NOT_OVERRIDE(TRUE) @@ -30,12 +108,61 @@ bonus_score += modifiers[source] bonus_score = clamp(bonus_score, 0, 10) -/datum/st_stat/proc/get_score_multiplier(low_mod = 0.25, high_mod = 2) - var/used_score = score + bonus_score - // used max_score when it exists - var/max_score = 5 - used_score = clamp(used_score, 0, max_score) +// Points + +/datum/st_stat/proc/get_points() + SHOULD_NOT_OVERRIDE(TRUE) + return points + +/datum/st_stat/proc/set_points(amount) + SHOULD_NOT_OVERRIDE(TRUE) + points = max(amount, 0) + return TRUE + +/datum/st_stat/proc/increase_points(amount) + SHOULD_NOT_OVERRIDE(TRUE) + points += amount + return TRUE - var/mult = low_mod + ((used_score / max_score) * (high_mod - low_mod)) +/datum/st_stat/proc/can_decrease_points(amount) + SHOULD_NOT_OVERRIDE(TRUE) + var/new_points = points - amount + if(new_points < 0) + return FALSE + return TRUE + +/datum/st_stat/proc/decrease_points(amount) + SHOULD_NOT_OVERRIDE(TRUE) + if(!can_decrease_points(amount)) + return FALSE + points -= amount + return TRUE + +// Freebie Points + +/datum/st_stat/proc/can_increase_freebie_points(amount) + SHOULD_NOT_OVERRIDE(TRUE) + if(freebie_cost_spent <= 0) + return FALSE + return TRUE - return mult +/datum/st_stat/proc/increase_freebie_points(amount) + SHOULD_NOT_OVERRIDE(TRUE) + points += amount + freebie_cost_spent -= amount + return TRUE + +/datum/st_stat/proc/can_decrease_freebie_points(amount) + SHOULD_NOT_OVERRIDE(TRUE) + var/new_points = points - amount + if(new_points < 0) + return FALSE + return TRUE + +/datum/st_stat/proc/decrease_freebie_points(amount) + SHOULD_NOT_OVERRIDE(TRUE) + if(!can_decrease_freebie_points(amount)) + return FALSE + points -= amount + freebie_cost_spent += amount + return TRUE diff --git a/modular_darkpack/modules/storyteller_stats/code/global_procs.dm b/modular_darkpack/modules/storyteller_stats/code/global_procs.dm new file mode 100644 index 000000000000..df54051c67d3 --- /dev/null +++ b/modular_darkpack/modules/storyteller_stats/code/global_procs.dm @@ -0,0 +1,18 @@ +/proc/create_new_stat_prefs(list/preference_storyteller_stats) + var/list/stats_list = list() + for(var/stat_path as anything in subtypesof(/datum/st_stat)) + var/datum/st_stat/stat = new stat_path() + stat_path = "[stat_path]" + stat.set_score(stat.starting_score) + stats_list[stat_path] = stat + preference_storyteller_stats = stats_list + update_middleware_stats(preference_storyteller_stats) + return preference_storyteller_stats + +// This entire snowflake code is done purely so that we can properly update stats that are based on other stats. +/proc/update_middleware_stats(list/preference_storyteller_stats) + var/datum/st_stat/stat_courage = preference_storyteller_stats["[STAT_COURAGE]"] + var/datum/st_stat/stat_permenant_willpower = preference_storyteller_stats["[STAT_PERMANENT_WILLPOWER]"] + stat_permenant_willpower.add_stat_mod(clamp(-(stat_permenant_willpower.get_score(include_bonus = FALSE) - 10), 0, stat_courage.get_score(include_bonus = TRUE)), "COURAGE") + var/datum/st_stat/stat_temporary_willpower = preference_storyteller_stats["[STAT_TEMPORARY_WILLPOWER]"] + stat_temporary_willpower.set_score(stat_permenant_willpower.get_score(include_bonus = TRUE)) diff --git a/modular_darkpack/modules/storyteller_stats/code/living_procs/recalculate_max_health.dm b/modular_darkpack/modules/storyteller_stats/code/living_procs/recalculate_max_health.dm deleted file mode 100644 index c2fc4d5b51bf..000000000000 --- a/modular_darkpack/modules/storyteller_stats/code/living_procs/recalculate_max_health.dm +++ /dev/null @@ -1,9 +0,0 @@ -//Function for updating a player's health based on their current stats. -//Player gets an increase to HP when there are buffs to their stamina. -/mob/living/proc/recalculate_max_health(var/initial = FALSE) - var/old_max_health = maxHealth - maxHealth = round(initial(maxHealth) + ((initial(maxHealth)/8) * st_get_stat(STAT_STAMINA))) - if(initial) - health = maxHealth - else if(health > 0) - health = max(health + maxHealth - old_max_health, 1) diff --git a/modular_darkpack/modules/storyteller_stats/code/living_procs/st_stat_wrappers.dm b/modular_darkpack/modules/storyteller_stats/code/living_procs/st_stat_wrappers.dm deleted file mode 100644 index e746551244ff..000000000000 --- a/modular_darkpack/modules/storyteller_stats/code/living_procs/st_stat_wrappers.dm +++ /dev/null @@ -1,48 +0,0 @@ -//wrapper for retrieving a st_stat datum from the storyteller stat holder -/mob/living/proc/st_get_stat_datum(stat_path) - RETURN_TYPE(/datum/st_stat) - if(!storyteller_stat_holder) - return null - return storyteller_stat_holder.get_stat_datum(stat_path) - -//wrapper for getting a stat in the storyteller stat holder -/mob/living/proc/st_get_stat(stat_path, include_bonus = TRUE) - if(!storyteller_stat_holder) - return 0 - return storyteller_stat_holder.get_stat(stat_path, include_bonus) - -/* -* wrapper for setting a stat's value in the storyteller stat holder -* Causes total hp recalculation if the modded stat affects the hp pool. -*/ -/mob/living/proc/st_set_stat(stat_path, amount) - if(storyteller_stat_holder) - storyteller_stat_holder.set_stat(stat_path, amount) - if(storyteller_stat_holder.is_health_affecting(stat_path)) - recalculate_max_health(TRUE) - -//wrapper for adding a stat modifier in the storyteller stat holder -/mob/living/proc/st_add_stat_mod(stat_path, amount, source) - if(!storyteller_stat_holder) - return - storyteller_stat_holder.add_stat_mod(stat_path, amount, source) - if(storyteller_stat_holder.is_health_affecting(stat_path)) - recalculate_max_health() - -//wrapper for removing a stat modifier in the storyteller stat holder -/mob/living/proc/st_remove_stat_mod(stat_path, source) - if(!storyteller_stat_holder) - return - storyteller_stat_holder.remove_stat_mod(stat_path, source) - if(storyteller_stat_holder.is_health_affecting(stat_path)) - recalculate_max_health() - -/mob/living/proc/st_get_stat_mod(stat_path, source) - if(!storyteller_stat_holder) - return - return storyteller_stat_holder.get_stat_mod(stat_path, source) - -/mob/living/proc/st_stat_multiplier(stat_path, low_mod, high_mod) - if(!storyteller_stat_holder) - return 1 - return storyteller_stat_holder.get_stat_multiplier(stat_path, low_mod, high_mod) diff --git a/modular_darkpack/modules/storyteller_stats/code/logging.dm b/modular_darkpack/modules/storyteller_stats/code/logging.dm new file mode 100644 index 000000000000..cbb0f8b63597 --- /dev/null +++ b/modular_darkpack/modules/storyteller_stats/code/logging.dm @@ -0,0 +1,2 @@ +/proc/log_stats(text, list/data) + logger.Log(LOG_CATEGORY_STATS, text, data) diff --git a/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/mob_procs.dm b/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/mob_procs.dm new file mode 100644 index 000000000000..1c0ea38d3bd1 --- /dev/null +++ b/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/mob_procs.dm @@ -0,0 +1,29 @@ +// Get a specific mob's stat from its stats list. +/mob/living/proc/st_get_stat(stat_path, include_bonus) + var/datum/st_stat/given_stat = storyteller_stats["[stat_path]"] + return given_stat?.get_score(include_bonus) + +// Set a specific mob's stat from its stats list. +/mob/living/proc/st_set_stat(stat_path, amount) + var/datum/st_stat/given_stat = storyteller_stats["[stat_path]"] + return given_stat?.set_score(amount) + +/mob/living/proc/st_add_stat_mod(stat_path, amount, source) + var/datum/st_stat/given_stat = storyteller_stats["[stat_path]"] + return given_stat?.add_stat_mod(amount, source) + +/mob/living/proc/st_remove_stat_mod(stat_path, source) + var/datum/st_stat/given_stat = storyteller_stats["[stat_path]"] + return given_stat?.remove_stat_mod(source) + +/datum/preferences/proc/apply_stats_from_prefs(mob/living/carbon/human/character) + character.storyteller_stats = preference_storyteller_stats.Copy() + update_modifiers_from_stats(character) + +/datum/preferences/proc/update_modifiers_from_stats(mob/living/carbon/human/character) + for(var/stat_typepath in character.storyteller_stats) + var/datum/st_stat/stat_datum = character.storyteller_stats[stat_typepath] + if(stat_datum.stat_flags & AFFECTS_HEALTH) + character.recalculate_max_health(initial = TRUE) + if(stat_datum.stat_flags & AFFECTS_SPEED) + character.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/dexterity, multiplicative_slowdown = -(character.st_get_stat(STAT_DEXTERITY) / 20)) diff --git a/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/movespeed_modifier.dm b/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/movespeed_modifier.dm new file mode 100644 index 000000000000..831fbd53bf75 --- /dev/null +++ b/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/movespeed_modifier.dm @@ -0,0 +1,4 @@ +/datum/movespeed_modifier/dexterity + multiplicative_slowdown = 0 + variable = TRUE + movetypes = GROUND diff --git a/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/recalculate_max_health.dm b/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/recalculate_max_health.dm new file mode 100644 index 000000000000..bf6f264b9637 --- /dev/null +++ b/modular_darkpack/modules/storyteller_stats/code/mob_affecting_adjustments/recalculate_max_health.dm @@ -0,0 +1,8 @@ +//Function for updating a player's health based on their current stats. +/mob/living/proc/recalculate_max_health(initial = FALSE) + var/old_max_health = maxHealth + maxHealth = round(initial(maxHealth) + ((initial(maxHealth)/8) * st_get_stat(STAT_STAMINA))) + if(initial) + health = maxHealth + else if(health > 0) + health = max(health + maxHealth - old_max_health, 1) diff --git a/modular_darkpack/modules/storyteller_stats/code/st_stats/_ability.dm b/modular_darkpack/modules/storyteller_stats/code/st_stats/_ability.dm deleted file mode 100644 index 56f0ff51a1cb..000000000000 --- a/modular_darkpack/modules/storyteller_stats/code/st_stats/_ability.dm +++ /dev/null @@ -1,2 +0,0 @@ -/datum/st_stat/ability - base_type = /datum/st_stat/ability diff --git a/modular_darkpack/modules/storyteller_stats/code/st_stats/_attribute.dm b/modular_darkpack/modules/storyteller_stats/code/st_stats/_attribute.dm deleted file mode 100644 index 7a29255c2565..000000000000 --- a/modular_darkpack/modules/storyteller_stats/code/st_stats/_attribute.dm +++ /dev/null @@ -1,3 +0,0 @@ -/datum/st_stat/attribute - score = 1 - base_type = /datum/st_stat/attribute diff --git a/modular_darkpack/modules/storyteller_stats/code/st_stats/_pooled.dm b/modular_darkpack/modules/storyteller_stats/code/st_stats/_pooled.dm deleted file mode 100644 index 8e756daae0d6..000000000000 --- a/modular_darkpack/modules/storyteller_stats/code/st_stats/_pooled.dm +++ /dev/null @@ -1,2 +0,0 @@ -/datum/st_stat/pooled - base_type = /datum/st_stat/pooled diff --git a/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_ability.dm b/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_ability.dm new file mode 100644 index 000000000000..53d29956d24e --- /dev/null +++ b/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_ability.dm @@ -0,0 +1,8 @@ +/datum/st_stat/ability + name = "Ability Points" + abstract_type = /datum/st_stat/ability + category = "Ability" + freebie_point_cost = FREEBIE_COST_ABILITY + points = 27 + +// 13 + 9 + 5 = 27 total points diff --git a/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_attribute.dm b/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_attribute.dm new file mode 100644 index 000000000000..a6afb3fd87c1 --- /dev/null +++ b/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_attribute.dm @@ -0,0 +1,10 @@ +/datum/st_stat/attribute + name = "Attribute Points" + abstract_type = /datum/st_stat/attribute + category = "Attribute" + starting_score = 1 + score = 1 + points = 15 + freebie_point_cost = FREEBIE_COST_ATTRIBUTE + +// 7 + 5 + 3 = 15 total points diff --git a/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_freebie.dm b/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_freebie.dm new file mode 100644 index 000000000000..0239e8f674e1 --- /dev/null +++ b/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_freebie.dm @@ -0,0 +1,5 @@ +/datum/st_stat/freebie + name = "Freebie Points" + abstract_type = /datum/st_stat/freebie + category = "Freebie" + points = 15 diff --git a/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_path.dm b/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_path.dm new file mode 100644 index 000000000000..25a8bfab8af7 --- /dev/null +++ b/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_path.dm @@ -0,0 +1,5 @@ +/datum/st_stat/morality_path + abstract_type = /datum/st_stat/morality_path + category = "Morality Path" + starting_score = 7 + freebie_point_cost = FREEBIE_COST_HUMANITY diff --git a/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_pooled.dm b/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_pooled.dm new file mode 100644 index 000000000000..5139754a1df3 --- /dev/null +++ b/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_pooled.dm @@ -0,0 +1,6 @@ +/datum/st_stat/pooled + abstract_type = /datum/st_stat/pooled + category = "Pooled" + min_score = 0 + max_score = 10 + freebie_point_cost = FREEBIE_COST_WILLPOWER diff --git a/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_virtue.dm b/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_virtue.dm new file mode 100644 index 000000000000..6805b7723f9f --- /dev/null +++ b/modular_darkpack/modules/storyteller_stats/code/st_stats/base_type/_virtue.dm @@ -0,0 +1,6 @@ +/datum/st_stat/virtue + name = "Virtue Points" + abstract_type = /datum/st_stat/virtue + category = "Virtue" + points = 7 + freebie_point_cost = FREEBIE_COST_VIRTUE diff --git a/modular_darkpack/modules/storyteller_stats/code/st_stats/default_abilities.dm b/modular_darkpack/modules/storyteller_stats/code/st_stats/default_abilities.dm index 34a397888371..501fca922bc3 100644 --- a/modular_darkpack/modules/storyteller_stats/code/st_stats/default_abilities.dm +++ b/modular_darkpack/modules/storyteller_stats/code/st_stats/default_abilities.dm @@ -1,92 +1,152 @@ // Talents /datum/st_stat/ability/alertness + subcategory = "Talents" name = "Alertness" + description = "Affects your character's intuition." /datum/st_stat/ability/athletics + subcategory = "Talents" name = "Athletics" + description = "Affects your character's physical wellbeing and endurance, as well as their ability to climb walls and jump." /datum/st_stat/ability/awareness + subcategory = "Talents" name = "Awareness" + description = "Affects your character's attention to extreme detail. Used in Auspex." /datum/st_stat/ability/brawl + subcategory = "Talents" name = "Brawl" + description = "Affects your character's fist-fighting ability and the 'floor' of your unarmed damage." /datum/st_stat/ability/empathy + subcategory = "Talents" name = "Empathy" + description = "Affects your character's ability to understand someone else's emotions and state of mind." /datum/st_stat/ability/expression + subcategory = "Talents" name = "Expression" + description = "Affects your character's ability to emote and express themselves." /datum/st_stat/ability/intimidation + subcategory = "Talents" name = "Intimidation" + description = "Affects your character's ability to persuade via coercion and violence. Used in Dominate, Presence and other mental and social disciplines." /datum/st_stat/ability/leadership + subcategory = "Talents" name = "Leadership" + description = "Affects your character's natural affinity to lead, direct, take responsibility, and strategize. Increases your maximum follower/minion limit." /datum/st_stat/ability/streetwise + subcategory = "Talents" name = "Streetwise" + description = "Affects your character's familiarity with the criminal underworld and connections to lower-income communities." /datum/st_stat/ability/subterfuge + subcategory = "Talents" name = "Subterfuge" + description = "Affects your character's ability to sabotage and strike with stealth and deception. Used in Dominate, Presence, and Obfuscate." // Skills /datum/st_stat/ability/animal_ken + subcategory = "Skills" name = "Animal Ken" + description = "Affects your character's affinity with animals and creatures." /datum/st_stat/ability/crafts + subcategory = "Skills" name = "Crafts" + description = "Affects your character's ability to craft certain items." /datum/st_stat/ability/drive + subcategory = "Skills" name = "Drive" + description = "Determines how well your character can drive. At 0 points, you won't be able to drive at all." /datum/st_stat/ability/etiquette + subcategory = "Skills" name = "Etiquette" + description = "Affects your character's ability to be perceived as pleasant in attitude." /datum/st_stat/ability/firearms + subcategory = "Skills" name = "Firearms" + description = "Affects your character's skill with guns. Lowers the recoil of certain weapons. Each dot grants a 10% chance you deal 40% more damage from each bullet you shoot to a maximum of 50%." /datum/st_stat/ability/larceny + subcategory = "Skills" name = "Larceny" + description = "Affects your character's ability to steal and lockpick. At 0 points, you won't be able to use lockpicks at all." /datum/st_stat/ability/melee + subcategory = "Skills" name = "Melee" + description = "Affects your character's damage with all melee weapons." /datum/st_stat/ability/performance + subcategory = "Skills" name = "Performance" + description = "Affects your character's ability to act with talent. Used in Presence and Obfuscate." /datum/st_stat/ability/stealth + subcategory = "Skills" name = "Stealth" + description = "Affects your character's ability to sneak and go unnoticed. Used in Obfuscate." /datum/st_stat/ability/survival + subcategory = "Skills" name = "Survival" + description = "Affects your character's ability to be survive on their own - whether thats in the wild or on cold, unforgiving city streets." // Knowledges /datum/st_stat/ability/academics + subcategory = "Knowledges" name = "Academics" + description = "Affects your character's familiarity with academics and literature. Affects how many languages your character knows. At 0 points, your character will only know one language." /datum/st_stat/ability/computer + subcategory = "Knowledges" name = "Computer" + description = "Affects your ability to use and interact with computerized devices. At 0 points, you won't be able to use a phone. At 1 point, you can use a phone, but not a computer." /datum/st_stat/ability/finance + subcategory = "Knowledges" name = "Finance" + description = "Affects your character's wealth and business acumen. Affects the starting balance of your character's bank account, as well as how much money they receive from selling items." /datum/st_stat/ability/investigation + subcategory = "Knowledges" name = "Investigation" + description = "Affects your character's ability to piece together observations to reach conclusions." /datum/st_stat/ability/law + subcategory = "Knowledges" name = "Law" + description = "Affects your character's familiarity with laws and policies in their appropriate contexts." /datum/st_stat/ability/medicine + subcategory = "Knowledges" name = "Medicine" + description = "Affects your character's knowledge of anatomy, medicine, and emergency first aid protocols. Used in Vicissitude." /datum/st_stat/ability/occult + subcategory = "Knowledges" name = "Occult" + description = "Affects your character's knowledge of esoteric and occult knowledge and concepts. Used in magic disciplines and affects your magical rituals." /datum/st_stat/ability/politics + subcategory = "Knowledges" name = "Politics" + description = "Affects your character's talent with regards to political manuevers." /datum/st_stat/ability/science + subcategory = "Knowledges" name = "Science" + description = "Affects your character's talent in the sciences, and their ability to synthesize chemicals." /datum/st_stat/ability/technology + subcategory = "Knowledges" name = "Technology" + description = "Affects your character's familiarity with machines, devices, and electrical systems." diff --git a/modular_darkpack/modules/storyteller_stats/code/st_stats/default_attributes.dm b/modular_darkpack/modules/storyteller_stats/code/st_stats/default_attributes.dm index 672625b7079d..45111e81a722 100644 --- a/modular_darkpack/modules/storyteller_stats/code/st_stats/default_attributes.dm +++ b/modular_darkpack/modules/storyteller_stats/code/st_stats/default_attributes.dm @@ -1,31 +1,46 @@ - -// Physical /datum/st_stat/attribute/strength name = "Strength" + description = "Affects your unarmed attack damage multiplier. Increases your chances to knock down an opponent in unarmed combat." + subcategory = "Physical" /datum/st_stat/attribute/dexterity name = "Dexterity" + description = "Affects your speed and melee weapon accuracy. Increases your defense against being knocked down in unarmed combat. Increases the speed of certain actions." + subcategory = "Physical" + stat_flags = AFFECTS_SPEED /datum/st_stat/attribute/stamina name = "Stamina" - affects_health_pool = TRUE + description = "Affects your maximum health. Used in Quietus." + subcategory = "Physical" + stat_flags = AFFECTS_HEALTH -// Social /datum/st_stat/attribute/charisma name = "Charisma" + description = "A character's ability to entice and please others through their personality. Used in Dementation, Dominate and Presence." + subcategory = "Social" /datum/st_stat/attribute/manipulation name = "Manipulation" + description = "A character's ability for self-expression in the interests of getting others to share their outlook or follow their whims. Used in social and mental disciplines." + subcategory = "Social" /datum/st_stat/attribute/appearance name = "Appearance" + description = "A measure of how well a character makes a first impression. Used in social disciplines and makes your character more attractive." + subcategory = "Social" -// Mental /datum/st_stat/attribute/perception name = "Perception" + description = "A character's ability to observe their environment. Increases your examine speed. Used in Auspex." + subcategory = "Mental" /datum/st_stat/attribute/intelligence name = "Intelligence" + description = "A character's grasp of facts and knowledge. It also governs a character's ability to reason, solve problems, and evaluate situations. Used in magic disciplines." + subcategory = "Mental" /datum/st_stat/attribute/wits name = "Wits" + description = "A character's ability to think on her feet and react quickly to a certain situation. It also reflects a character's general cleverness. Used in Necromancy." + subcategory = "Mental" diff --git a/modular_darkpack/modules/storyteller_stats/code/st_stats/default_pooled_stats.dm b/modular_darkpack/modules/storyteller_stats/code/st_stats/default_pooled_stats.dm index 93f1d96659a4..3ce5f2295cfe 100644 --- a/modular_darkpack/modules/storyteller_stats/code/st_stats/default_pooled_stats.dm +++ b/modular_darkpack/modules/storyteller_stats/code/st_stats/default_pooled_stats.dm @@ -1,5 +1,10 @@ -/datum/st_stat/pooled/blood_pool - name = "Blood Pool" +/datum/st_stat/pooled/permanent_willpower + name = "Permanent Willpower" + description = "A character's inner drive and competence at overcoming unfavorable odds. Used for Rolls." + freebie_point_cost = FREEBIE_COST_WILLPOWER + stat_flags = AFFECTS_STATS -/datum/st_stat/pooled/willpower - name = "Willpower" +/datum/st_stat/pooled/temporary_willpower + name = "Temporary Willpower" + description = "A character's inner drive and competence at overcoming unfavorable odds. Used for spendature." + editable = FALSE diff --git a/modular_darkpack/modules/storyteller_stats/code/st_stats/default_virtues.dm b/modular_darkpack/modules/storyteller_stats/code/st_stats/default_virtues.dm new file mode 100644 index 000000000000..93e0abde1c8a --- /dev/null +++ b/modular_darkpack/modules/storyteller_stats/code/st_stats/default_virtues.dm @@ -0,0 +1,26 @@ +/datum/st_stat/virtue/conscience + name = "Conscience" + starting_score = 1 //All vampires by default start out with this. + score = 1 + description = "Remorse and atonement for your moral transgressions. Requires Conviction to be zero." + +/datum/st_stat/virtue/self_control + name = "Self-Control" + starting_score = 1 //All vampires by default start out with this. + score = 1 + description = "Discipline and mastery over the Beast and other dark impulses. Requires Instinct to be zero." + +/datum/st_stat/virtue/conviction + name = "Conviction" + description = "Represents the reconciliation of the predatory urge with the character's capacity for atrocity. Where Conscience represents guilt, Conviction represents moral resolve and acceptance. Requires Conscience to be zero." + +/datum/st_stat/virtue/instinct + name = "Instinct" + description = "The ability to control the Beast by familiarity rather than denial. Requires Self-Control to be zero." + +/datum/st_stat/virtue/courage + name = "Courage" + description = "The quality that allows characters to stand in the face of fear or daunting adversity. It is bravery, mettle, and stoicism combined. Raises your Willpower by one." + starting_score = 1 + min_score = 1 + stat_flags = AFFECTS_STATS diff --git a/modular_darkpack/modules/storyteller_stats/code/stat_pref_middleware.dm b/modular_darkpack/modules/storyteller_stats/code/stat_pref_middleware.dm new file mode 100644 index 000000000000..cc20e72a60ca --- /dev/null +++ b/modular_darkpack/modules/storyteller_stats/code/stat_pref_middleware.dm @@ -0,0 +1,95 @@ +/datum/preference_middleware/stats + action_delegations = list( + "increase_stat" = PROC_REF(increase_stat), + "decrease_stat" = PROC_REF(decrease_stat), + "reset_stats" = PROC_REF(reset_stats) + ) + +/datum/preference_middleware/stats/get_ui_data(mob/user) + if(preferences.current_window != PREFERENCE_TAB_CHARACTER_PREFERENCES) + return list() + var/list/data = list() + data["stats"] = list() + for(var/typepath in preferences.preference_storyteller_stats) + var/datum/st_stat/stat = preferences.preference_storyteller_stats[typepath] + var/list/stat_data = list() + stat_data["name"] = stat.name + stat_data["desc"] = stat.description + stat_data["editable"] = stat.editable + stat_data["category"] = stat.category + stat_data["subcategory"] = stat.subcategory + stat_data["max_score"] = stat.max_score + stat_data["points"] = stat.get_points() + stat_data["score"] = stat.get_score(include_bonus = FALSE) + stat_data["bonus_score"] = stat.get_bonus_score() + stat_data["abstract_type"] = "[stat.abstract_type]" + data["stats"]["[stat.type]"] = stat_data + return data + +/datum/preference_middleware/stats/proc/increase_stat(list/params, mob/user) + SHOULD_NOT_SLEEP(TRUE) + + var/datum/st_stat/stat_path = preferences.preference_storyteller_stats[params["stat"]] + var/datum/st_stat/abstract_stat = preferences.preference_storyteller_stats["[stat_path.abstract_type]"] + var/datum/st_stat/freebie_point_stat = preferences.preference_storyteller_stats["[STAT_FREEBIE_POINTS]"] + var/old_value = stat_path.get_score(include_bonus = FALSE) + + + if(!stat_path.can_increase_score(1)) // Have we reached the max_score of the stat? + return FALSE // If we have, then return early. + + if((stat_path.get_score(include_bonus = FALSE) + 1) > stat_path.starting_score) + if(abstract_stat.can_decrease_points(1)) // Can we spend points on this stat? + abstract_stat.decrease_points(1) // Spend a point. + else + if(freebie_point_stat.can_decrease_freebie_points(stat_path.freebie_point_cost)) // Can we spend freebie points instead? + freebie_point_stat.decrease_freebie_points(stat_path.freebie_point_cost) // If we can spend freebie points, decrease them. + else + return FALSE // If we can't spend freebie points, then return early. + + stat_path.increase_score(1) // By this point we know we have spend either a point, or the appropriate freebie cost for this stat, and it is not max_score. So increase it by one. + + if(stat_path.stat_flags & AFFECTS_STATS) + update_middleware_stats(preferences.preference_storyteller_stats) + + + var/new_value = stat_path.get_score(include_bonus = FALSE) + var/log_text = "[key_name(user, TRUE, TRUE)] increased stat '[stat_path.name]' from [old_value] to [new_value]" + log_stats(log_text) + return TRUE + +/datum/preference_middleware/stats/proc/decrease_stat(list/params, mob/user) + SHOULD_NOT_SLEEP(TRUE) + + var/datum/st_stat/stat_path = preferences.preference_storyteller_stats[params["stat"]] + var/datum/st_stat/abstract_stat = preferences.preference_storyteller_stats["[stat_path.abstract_type]"] + var/datum/st_stat/freebie_point_stat = preferences.preference_storyteller_stats["[STAT_FREEBIE_POINTS]"] + var/old_value = stat_path.get_score(include_bonus = FALSE) + + if(!stat_path.can_decrease_score(1)) + return FALSE + + if((stat_path.get_score(include_bonus = FALSE) - 1) >= stat_path.starting_score) + if(freebie_point_stat.can_increase_freebie_points(stat_path.freebie_point_cost)) // Can we regain freebie points? + freebie_point_stat.increase_freebie_points(stat_path.freebie_point_cost) // Regain freebie points. + else + abstract_stat.increase_points(1) // Regain a score point. + + stat_path.decrease_score(1) // By this point we know we have regained either a point, or the appropriate freebie cost for this stat, and it is not min_score. So decrease it by one. + + if(stat_path.stat_flags & AFFECTS_STATS) + update_middleware_stats(preferences.preference_storyteller_stats) + + var/new_value = stat_path.get_score(include_bonus = FALSE) + var/log_text = "[key_name(user, TRUE, TRUE)] decreased stat '[stat_path.name]' from [old_value] to [new_value]" + log_stats(log_text) + return TRUE + +/datum/preference_middleware/stats/proc/reset_stats(list/params, mob/user) + SHOULD_NOT_SLEEP(TRUE) + + var/log_text = "[key_name(user, TRUE, TRUE)] reset all stats to default values" + log_stats(log_text) + preferences.preference_storyteller_stats = null + preferences.preference_storyteller_stats = create_new_stat_prefs(preferences.preference_storyteller_stats) + return TRUE diff --git a/modular_darkpack/modules/storyteller_stats/code/storyteller_stat_holder.dm b/modular_darkpack/modules/storyteller_stats/code/storyteller_stat_holder.dm deleted file mode 100644 index f37721fadc7b..000000000000 --- a/modular_darkpack/modules/storyteller_stats/code/storyteller_stat_holder.dm +++ /dev/null @@ -1,64 +0,0 @@ -/// This is the object used to store and manage a character's st_stats. -/datum/storyteller_stats - /// A dictionary of st_stats. K: path -> V: instance. - VAR_PRIVATE/list/st_stats = list() - -/datum/storyteller_stats/New() - . = ..() - for(var/datum/path as anything in subtypesof(/datum/st_stat)) - var/datum/st_stat/new_trait = new path - if(new_trait.type == new_trait.base_type) - qdel(new_trait) - continue - st_stats[path] = new_trait - -/datum/storyteller_stats/Destroy() - . = ..() - QDEL_LIST(st_stats) - -/// Return the total or pure score of the given stat. -/datum/storyteller_stats/proc/get_stat(stat_path, include_bonus = TRUE) - var/datum/st_stat/A = st_stats[stat_path] - return A.get_score(include_bonus) - -/// Sets the score of the given stat. -/datum/storyteller_stats/proc/set_stat(stat_path, amount) - var/datum/st_stat/A = st_stats[stat_path] - A.set_score(amount) - -/// Return the instance of the given stat. -/datum/storyteller_stats/proc/get_stat_datum(stat_path) - RETURN_TYPE(/datum/st_stat) - var/datum/st_stat/A = st_stats[stat_path] - return A - -/datum/storyteller_stats/proc/add_stat_mod(stat_path, amount, source) - var/datum/st_stat/A = get_stat_datum(stat_path) - LAZYSET(A.modifiers, source, amount) - A.update_modifiers() - -/datum/storyteller_stats/proc/remove_stat_mod(stat_path, source) - var/datum/st_stat/A = get_stat_datum(stat_path) - if(LAZYACCESS(A.modifiers, source)) - A.modifiers -= source - A.update_modifiers() - -/datum/storyteller_stats/proc/get_stat_mod(trait, source) - var/datum/st_stat/checking_trait = get_stat_datum(trait) - return LAZYACCESS(checking_trait.modifiers, source) - -/datum/storyteller_stats/proc/get_stat_multiplier(stat_path, low_mod, high_mod) - var/datum/st_stat/A = st_stats[stat_path] - return A.get_score_multiplier(low_mod, high_mod) - -/datum/storyteller_stats/proc/randomize_attributes(min_score, max_score) - for(var/datum/st_stat/attribute/A in st_stats) - A.set_score(rand(min_score, max_score)) - -/datum/storyteller_stats/proc/randomize_abilities(min_score, max_score) - for(var/datum/st_stat/ability/A in st_stats) - A.set_score(rand(min_score, max_score)) - -/datum/storyteller_stats/proc/is_health_affecting(stat_path) - var/datum/st_stat/A = get_stat_datum(stat_path) - return A.affects_health_pool diff --git a/modular_darkpack/modules/storyteller_stats/readme.md b/modular_darkpack/modules/storyteller_stats/readme.md index 163d678cea22..626104cfb123 100644 --- a/modular_darkpack/modules/storyteller_stats/readme.md +++ b/modular_darkpack/modules/storyteller_stats/readme.md @@ -1,40 +1,34 @@ https://github.com/DarkPack13/SecondCity/pull/38 https://github.com/DarkPack13/SecondCity/pull/58 +https://github.com/DarkPack13/SecondCity/pull/69 ## Storyteller stats -Module ID: STORYTELLER_STATS <!-- Uppercase, UNDERSCORE_CONNECTED name of your module, that you use to mark files. This is so people can case-sensitive search for your edits, if any. --> +Module ID: STORYTELLER_STATS ### Description: Not to be confused with TG traits. A stat system based heavily on WoD -<!-- Here, try to describe what your PR does, what features it provides and any other directly useful information. --> - ### TG Proc/File Changes: -- [code/modules/mob/living/living.dm](/code/modules/mob/living/living.dm): - - `/mob/living/Initialize(mapload)` -<!-- If you edited any core procs, you should list them here. You should specify the files and procs you changed. -E.g: -- `code/modules/mob/living.dm`: `proc/overriden_proc`, `var/overriden_var` - --> +- `modular_darkpack/master_files/code/modules/mob/living/living.dm` ### Modular Overrides: -- [modular_darkpack/master_files/code/modules/mob/living/living_defines.dm](/modular_darkpack/master_files/code/modules/mob/living/living_defines.dm): `var/datum/storyteller_stats/storyteller_stat_holder` -- [modular_darkpack/master_files/code/modules/mob/living/living.dm](/modular_darkpack/master_files/code/modules/mob/living/living.dm): `storyteller_stat_holder = new()` +- `modular_darkpack/master_files/code/modules/mob/living/living_defines.dm` +- `modular_darkpack/master_files/code/modules/mob/living/living.dm` ### Defines: -- [code/\_\_DEFINES/~darkpack/storyteller_stats.dm](/code/__DEFINES/~darkpack/storyteller_stats.dm): - - `STAT_###` Im not going to list all of them, but one for every trait following this format. +- `code/__DEFINES/~darkpack/storyteller_stats.dm` ### Included files that are not contained in this module: -- [code/__DEFINES/~darkpack/storyteller_stats.dm](code/__DEFINES/~darkpack/storyteller_stats.dm) -<!-- Likewise, be it a non-modular file or a modular one that's not contained within the folder belonging to this specific module, it should be mentioned here. Good examples are icons or sounds that are used between multiple modules, or other such edge-cases. --> +- N/A ### Credits: -<!-- Here go the credits to you, dear coder, and in case of collaborative work or ports, credits to the original source of the code. --> +FalloutFalcon +XeonMations +chazzyjazzy diff --git a/modular_darkpack/modules/strings/global_strings.dm b/modular_darkpack/modules/strings/global_strings.dm new file mode 100644 index 000000000000..49daf9ac494a --- /dev/null +++ b/modular_darkpack/modules/strings/global_strings.dm @@ -0,0 +1,43 @@ + +// associative list used by dementation and the derangement quirk +GLOBAL_LIST_INIT(derangement_phrases,list( + "Evil crouches" = 'modular_darkpack/modules/powers/sounds/dementation/speech/crouch.ogg', + "Death" = 'modular_darkpack/modules/powers/sounds/dementation/speech/death.ogg', + "DIE!" = 'modular_darkpack/modules/powers/sounds/dementation/speech/die.ogg', + "I smell a rancid grave" = 'modular_darkpack/modules/powers/sounds/dementation/speech/grave.ogg', + "Rustling robes of the Reaper" = 'modular_darkpack/modules/powers/sounds/dementation/speech/reaper.ogg', + "All are blind whose eyes are closed" = 'modular_darkpack/modules/powers/sounds/dementation/speech/blind.ogg', + "The drove is a terrible mistress" = 'modular_darkpack/modules/powers/sounds/dementation/speech/mistress.ogg', + "Wishes and words sprout from the same seed" = 'modular_darkpack/modules/powers/sounds/dementation/speech/wishes_words.ogg', + "A dark light from your death" = 'modular_darkpack/modules/powers/sounds/dementation/speech/dark_light.ogg', + "Hemlock for the deceivers" = 'modular_darkpack/modules/powers/sounds/dementation/speech/hemlock.ogg', + "It has two mouths to lick from" = 'modular_darkpack/modules/powers/sounds/dementation/speech/two_mouths.ogg', + "Deep of the Atlantic, dark, dreaming, sleeping" = 'modular_darkpack/modules/powers/sounds/dementation/speech/atlantic.ogg', + "Can't see, can't see! Where have my eyes gone to?" = 'modular_darkpack/modules/powers/sounds/dementation/speech/eyes.ogg', + "Heloise said you. Cranberry sauce. Hotel foxtrot" = 'modular_darkpack/modules/powers/sounds/dementation/speech/heloise.ogg', + "Stop doing that. Mother shan't be too pleased. None too pleased" = 'modular_darkpack/modules/powers/sounds/dementation/speech/mother.ogg', + "Those lips bleed a putrid poison" = 'modular_darkpack/modules/powers/sounds/dementation/speech/putrid.ogg', + "Rat tails, cat tails, coat tails, all tales" = 'modular_darkpack/modules/powers/sounds/dementation/speech/tails.ogg', + "It's not fair! I wanted to" = 'modular_darkpack/modules/powers/sounds/dementation/speech/not_fair.ogg', + "Pennies for your eyes in its pockets" = 'modular_darkpack/modules/powers/sounds/dementation/speech/pennies.ogg', + "Why is it troubled?" = 'modular_darkpack/modules/powers/sounds/dementation/speech/troubled.ogg', + "Ask about the free arsenic" = 'modular_darkpack/modules/powers/sounds/dementation/speech/arsenic.ogg', + "Blood brings the vicious beast" = 'modular_darkpack/modules/powers/sounds/dementation/speech/beast.ogg', + "I see daggers hang on his breath" = 'modular_darkpack/modules/powers/sounds/dementation/speech/daggers.ogg', + "Bone round in melody and word layed in rain" = 'modular_darkpack/modules/powers/sounds/dementation/speech/bone.ogg', + "Cemetery runoff congealing at the door" = 'modular_darkpack/modules/powers/sounds/dementation/speech/cemetery.ogg', + "Maggots love you. Trust me" = 'modular_darkpack/modules/powers/sounds/dementation/speech/maggots.ogg', + "Mast lay shrouded and the moon is melting" = 'modular_darkpack/modules/powers/sounds/dementation/speech/moon.ogg', + "Try the corpse in the oven with peppers and fur" = 'modular_darkpack/modules/powers/sounds/dementation/speech/peppers.ogg', + "Souls draped in rotten tatters and Father dances in the dark" = 'modular_darkpack/modules/powers/sounds/dementation/speech/souls.ogg', + "Make the tallow from the fat of a hangman" = 'modular_darkpack/modules/powers/sounds/dementation/speech/tallow.ogg', + "Bent like a calf for the butcher" = 'modular_darkpack/modules/powers/sounds/dementation/speech/calf.ogg', + "You're in for it now" = 'modular_darkpack/modules/powers/sounds/dementation/speech/in_for_it.ogg', + "They're coming" = 'modular_darkpack/modules/powers/sounds/dementation/speech/theyre_coming.ogg', + "It casts a crooked shadow" = 'modular_darkpack/modules/powers/sounds/dementation/speech/shadow.ogg', + "Elkabo, elkabo, pixy queen where all is green" = 'modular_darkpack/modules/powers/sounds/dementation/speech/elkabo.ogg', + "It's a tangle of asps" = 'modular_darkpack/modules/powers/sounds/dementation/speech/asps.ogg', + "Sealed with the kiss of swine" = 'modular_darkpack/modules/powers/sounds/dementation/speech/swine.ogg', + "A trick with two tongues" = 'modular_darkpack/modules/powers/sounds/dementation/speech/tongues.ogg', + "The very thought falls to the flame" = 'modular_darkpack/modules/powers/sounds/dementation/speech/flame.ogg' +)) diff --git a/modular_darkpack/modules/structures/code/elevator.dm b/modular_darkpack/modules/structures/code/elevator.dm deleted file mode 100644 index 4ab969c00e79..000000000000 --- a/modular_darkpack/modules/structures/code/elevator.dm +++ /dev/null @@ -1,181 +0,0 @@ -/obj/elevator_button_up - name = "elevator panel" - desc = "Call an elevator." - icon_state = "control" - icon = 'icons/obj/assemblies/new_assemblies.dmi' - anchored = TRUE - var/id = 1 - var/obj/elevator_button_down/D - var/list/doors = list() - var/here = FALSE - var/riding = FALSE - -/obj/elevator_button_up/Initialize(mapload) - . = ..() - for(var/obj/elevator_button_down/W in world) - if(W.id == id) - D = W - W.U = src - for(var/obj/elevator_door/E in range(3, src)) - doors += E - if(!E.density) - here = TRUE - -/obj/elevator_button_up/attack_hand(mob/user) - if(riding) - return - if(D.riding) - return - for(var/obj/elevator_door/E in doors) - E.close() - riding = TRUE - D.riding = TRUE - say("Moving...") - spawn(50) - for(var/mob/living/L in range(1, src)) - L.forceMove(D.loc) - for(var/obj/item/B in range(1, src)) - B.forceMove(D.loc) - for(var/obj/elevator_door/V in D.doors) - V.open() - D.say("Arrived.") - riding = FALSE - D.riding = FALSE - here = FALSE - D.here = TRUE - . = ..() - -/obj/elevator_button_down - name = "elevator panel" - desc = "Call an elevator." - icon_state = "control" - icon = 'icons/obj/assemblies/new_assemblies.dmi' - anchored = TRUE - var/id = 1 - var/obj/elevator_button_up/U - var/list/doors = list() - var/here = FALSE - var/riding = FALSE - -/obj/elevator_button_down/Initialize(mapload) - . = ..() - for(var/obj/elevator_button_up/W in world) - if(W.id == id) - U = W - W.D = src - for(var/obj/elevator_door/E in range(src, 3)) - doors += E - if(!E.density) - here = TRUE - -/obj/elevator_button_down/attack_hand(mob/user) - if(riding) - return - if(U.riding) - return - for(var/obj/elevator_door/E in doors) - E.close() - riding = TRUE - U.riding = TRUE - say("Moving...") - spawn(50) - for(var/mob/living/L in range(1, src)) - L.forceMove(U.loc) - for(var/obj/item/B in range(1, src)) - B.forceMove(U.loc) - for(var/obj/elevator_door/V in U.doors) - V.open() - U.say("Arrived.") - riding = FALSE - U.riding = FALSE - here = FALSE - U.here = TRUE - . = ..() - -/obj/elevator_button - name = "elevator button" - desc = "Call an elevator." - icon = 'icons/obj/assemblies/new_assemblies.dmi' - icon_state = "control" - var/id = 1 - var/obj/elevator_button_down/I = null - var/obj/elevator_button_up/O = null - -/obj/elevator_button/Initialize(mapload) - . = ..() - for(var/obj/elevator_button_up/W in range(3, src)) - if(W.id == id) - O = W - for(var/obj/elevator_button_down/D in range(3, src)) - if(D.id == id) - I = D - -/obj/elevator_button/attack_hand(mob/user) - if(I) - if(I.riding) - return - if(!I.here) - say("Elevator is called, please wait...") - for(var/obj/elevator_door/E in I.U.doors) - E.close() - I.riding = TRUE - I.U.riding = TRUE - spawn(50) - for(var/mob/living/L in range(1, I.U)) - L.forceMove(I.loc) - for(var/obj/item/B in range(1, I.U)) - B.forceMove(I.loc) - for(var/obj/elevator_door/V in I.doors) - V.open() - I.riding = FALSE - I.U.riding = FALSE - if(O) - if(O.riding) - return - if(!O.here) - say("Elevator is called, please wait...") - for(var/obj/elevator_door/E in O.D.doors) - E.close() - O.riding = TRUE - O.D.riding = TRUE - spawn(50) - for(var/mob/living/L in range(1, O.D)) - L.forceMove(O.loc) - for(var/obj/item/B in range(1, O.D)) - B.forceMove(O.loc) - for(var/obj/elevator_door/V in O.doors) - V.open() - O.riding = FALSE - O.D.riding = FALSE - . = ..() - -/obj/elevator_door - name = "elevator door" - icon = 'modular_darkpack/modules/deprecated/icons/doors.dmi' - icon_state = "elevator-0" - anchored = TRUE - density = FALSE - opacity = FALSE - plane = GAME_PLANE - layer = OPEN_DOOR_LAYER - pixel_w = -16 - -/obj/elevator_door/proc/close() - icon_state = "elevator-1" - set_density(TRUE) - opacity = TRUE - layer = ABOVE_ALL_MOB_LAYER - -/obj/elevator_door/proc/open() - icon_state = "elevator-0" - set_density(FALSE) - opacity = FALSE - layer = OPEN_DOOR_LAYER - -/obj/elevator_door/start_closed - name = "elevator door" - icon = 'modular_darkpack/modules/deprecated/icons/doors.dmi' - icon_state = "elevator-1" - density = TRUE - opacity = TRUE - layer = ABOVE_ALL_MOB_LAYER diff --git a/modular_darkpack/modules/taser/code/taser.dm b/modular_darkpack/modules/taser/code/taser.dm new file mode 100644 index 000000000000..24b6ca67d4e0 --- /dev/null +++ b/modular_darkpack/modules/taser/code/taser.dm @@ -0,0 +1,48 @@ +/obj/item/gun/energy/taser/darkpack + name = "V26 taser" + desc = "A less-than-lethal stun gun. Fires an electrode pair that will impale and electrocute noncompliant suspects." + icon = 'modular_darkpack/modules/taser/icons/taser.dmi' + icon_state = "taser_wod" + inhand_icon_state = null // TODO: Make inhands for these + ammo_type = list(/obj/item/ammo_casing/energy/electrode/darkpack) + charge_sections = 2 + + +/obj/item/ammo_casing/energy/electrode/darkpack + fire_sound = 'modular_darkpack/modules/taser/sounds/tasershock.ogg' + e_cost = LASER_SHOTS(4, STANDARD_CELL_CHARGE) + + +/obj/item/melee/baton/security/handtaser + name = "hand taser" + desc = "A portable taser for self-defense. Ineffective on corpses." + icon = 'modular_darkpack/modules/taser/icons/taser.dmi' + icon_state = "handtaser" + base_icon_state = "handtaser" + inhand_icon_state = null // TODO: Make inhands for these +// worn_icon_state = "baton" // TODO: make an onmob for this + force = 4 + armor_type = /datum/armor/none + throwforce = 2 + on_stun_sound = 'modular_darkpack/modules/taser/sounds/handtaser_activate.ogg' + active_changes_inhand = FALSE // TODO: different sprites for cells? + custom_price = 200 + + +/obj/item/melee/baton/security/handtaser/turn_on(mob/user) + active = TRUE + playsound(src, 'modular_darkpack/modules/taser/sounds/electric_zap.ogg', 75, TRUE, -1) + update_appearance() + toggle_light() + do_sparks(1, TRUE, src) + drop_sound = active_drop_sound + pickup_sound = active_pickup_sound + + +/obj/item/melee/baton/security/handtaser/turn_off() + active = FALSE + set_light_on(FALSE) + update_appearance() + playsound(src, 'modular_darkpack/modules/taser/sounds/electric_zap.ogg', 75, TRUE, -1) // TODO: Change the pitch of this or get a different sound + drop_sound = inactive_drop_sound + pickup_sound = inactive_pickup_sound diff --git a/modular_darkpack/modules/taser/icons/taser.dmi b/modular_darkpack/modules/taser/icons/taser.dmi new file mode 100644 index 000000000000..71fc874efccf Binary files /dev/null and b/modular_darkpack/modules/taser/icons/taser.dmi differ diff --git a/modular_darkpack/modules/taser/sounds/electric_zap.ogg b/modular_darkpack/modules/taser/sounds/electric_zap.ogg new file mode 100644 index 000000000000..e2da5f63cc84 Binary files /dev/null and b/modular_darkpack/modules/taser/sounds/electric_zap.ogg differ diff --git a/modular_darkpack/modules/taser/sounds/handtaser_activate.ogg b/modular_darkpack/modules/taser/sounds/handtaser_activate.ogg new file mode 100644 index 000000000000..26f289cb53f9 Binary files /dev/null and b/modular_darkpack/modules/taser/sounds/handtaser_activate.ogg differ diff --git a/modular_darkpack/modules/taser/sounds/tasershock.ogg b/modular_darkpack/modules/taser/sounds/tasershock.ogg new file mode 100644 index 000000000000..8e895f37301d Binary files /dev/null and b/modular_darkpack/modules/taser/sounds/tasershock.ogg differ diff --git a/modular_darkpack/modules/umbra/code/minesweeper.dm b/modular_darkpack/modules/umbra/code/minesweeper.dm index 0f4f255273e4..d8b2102efa1a 100644 --- a/modular_darkpack/modules/umbra/code/minesweeper.dm +++ b/modular_darkpack/modules/umbra/code/minesweeper.dm @@ -41,10 +41,10 @@ to_chat(user, span_revenwarning("Close... but the spirits do not punish you for this one.")) if(ROLL_FAILURE) to_chat(user, span_revendanger("Too close... Your mind feels uneasy from that.")) - user.adjustAggLoss(5) + user.adjust_agg_loss(5) if(ROLL_BOTCH) to_chat(user, span_revendanger("THE SPIRITS PUNISH YOU FOR THAT ONE.")) - user.adjustAggLoss(25) + user.adjust_agg_loss(25) return amount_of_bombs = nearby_mines() switch(amount_of_bombs) diff --git a/modular_darkpack/modules/unit_tests/_darkpack_unit_tests.dm b/modular_darkpack/modules/unit_tests/_darkpack_unit_tests.dm new file mode 100644 index 000000000000..9baffedb5530 --- /dev/null +++ b/modular_darkpack/modules/unit_tests/_darkpack_unit_tests.dm @@ -0,0 +1,36 @@ +#if defined(UNIT_TESTS) || defined(SPACEMAN_DMM) + +/// Asserts that a condition is true +/// If the condition is not true, fails the test +#define TEST_ASSERT(assertion, reason) if (!(assertion)) { return Fail("Assertion failed: [reason || "No reason"]", __FILE__, __LINE__) } + +/// Asserts that the two parameters passed are equal, fails otherwise +/// Optionally allows an additional message in the case of a failure +#define TEST_ASSERT_EQUAL(a, b, message) do { \ + var/lhs = ##a; \ + var/rhs = ##b; \ + if (lhs != rhs) { \ + return Fail("Expected [isnull(lhs) ? "null" : lhs] to be equal to [isnull(rhs) ? "null" : rhs].[message ? " [message]" : ""]", __FILE__, __LINE__); \ + } \ +} while (FALSE) + +/// Asserts that the two parameters passed are not equal, fails otherwise +/// Optionally allows an additional message in the case of a failure +#define TEST_ASSERT_NOTEQUAL(a, b, message) do { \ + var/lhs = ##a; \ + var/rhs = ##b; \ + if (lhs == rhs) { \ + return Fail("Expected [isnull(lhs) ? "null" : lhs] to not be equal to [isnull(rhs) ? "null" : rhs].[message ? " [message]" : ""]", __FILE__, __LINE__); \ + } \ +} while (FALSE) + +// BEGIN_INCLUDE +#include "apply_all_clans.dm" +#include "apply_all_splats.dm" +// END_INCLUDE + +#undef TEST_ASSERT +#undef TEST_ASSERT_EQUAL +#undef TEST_ASSERT_NOTEQUAL +//#undef TEST_FOCUS - This define is used by vscode unit test extension to pick specific unit tests to run and appended later so needs to be used out of scope here +#endif diff --git a/modular_darkpack/modules/unit_tests/apply_all_clans.dm b/modular_darkpack/modules/unit_tests/apply_all_clans.dm new file mode 100644 index 000000000000..2eb58711e47e --- /dev/null +++ b/modular_darkpack/modules/unit_tests/apply_all_clans.dm @@ -0,0 +1,20 @@ +// DARKPACK EDIT ADD START +/datum/unit_test/apply_all_clans + +/datum/unit_test/apply_all_clans/Run() + var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human/consistent) + + human.mock_client = new /datum/client_interface() + + human.make_kindred() + for(var/type in valid_subtypesof(/datum/vampire_clan)) + human.set_clan(type) + TEST_ASSERT(human.is_clan(type), "[type] was somehow not applied to the human") + + // Verify there is no extra bugs when missing a client + human.mock_client = null + for(var/type in valid_subtypesof(/datum/vampire_clan)) + human.set_clan(type) + TEST_ASSERT(human.is_clan(type), "[type] was somehow not applied to the human without a client") + +// DARKPACK EDIT ADD END diff --git a/modular_darkpack/modules/unit_tests/apply_all_splats.dm b/modular_darkpack/modules/unit_tests/apply_all_splats.dm new file mode 100644 index 000000000000..951b235893ae --- /dev/null +++ b/modular_darkpack/modules/unit_tests/apply_all_splats.dm @@ -0,0 +1,36 @@ +// Make sure there are no runtimes or other failures in adding and removing splats without arguments +/datum/unit_test/apply_all_splats + +/datum/unit_test/apply_all_splats/Run() + var/list/all_splat_types = valid_subtypesof(/datum/splat) + + // Create a mock NPC to apply splats to + var/mob/living/carbon/human/consistent/npc = EASY_ALLOCATE() + npc.mind_initialize() + test_applying_splats(npc, all_splat_types, "NPC") + + // Create a mock player to apply splats to + var/mob/living/carbon/human/consistent/player = EASY_ALLOCATE() + player.mind_initialize() + var/datum/client_interface/player_client = new() + player.mock_client = player_client + player_client.mob = player + player_client.prefs = new(player_client) + test_applying_splats(player, all_splat_types, "player") + +/datum/unit_test/apply_all_splats/proc/test_applying_splats(mob/living/carbon/human/dummy, list/splat_types, dummy_type) + for (var/splat_type in splat_types) + // Failing to add or get a splat will continue with others, failing to remove will cancel the entire test + var/datum/splat/adding_splat = dummy.add_splat(splat_type) + if (!adding_splat) + TEST_FAIL("Failed to add splat [splat_type] to mock [dummy_type].") + continue + + var/datum/splat/gotten_splat = dummy.get_splat(splat_type) + if (!gotten_splat) + TEST_FAIL("Failed to get previously added splat [splat_type] from mock [dummy_type].") + continue + + var/remove_success = dummy.remove_splat(splat_type) + TEST_ASSERT(remove_success, "Failed to remove splat [splat_type] from mock [dummy_type].") + diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/blood_power.dm b/modular_darkpack/modules/vampire_the_masquerade/code/blood_power.dm index 7fa5e29ff72f..e09b72c01779 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/blood_power.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/blood_power.dm @@ -56,9 +56,7 @@ human_owner.st_add_stat_mod(STAT_STAMINA, 2, "blood_power") var/cost = HAS_TRAIT(owner, TRAIT_HUNGRY) ? 3 : 2 - human_owner.bloodpool = max(0, human_owner.bloodpool - cost) - // TODO: [Rebase] reimplement the hud - //human_owner.update_blood_hud() + human_owner.adjust_blood_pool(cost) ADD_TRAIT(human_owner, TRAIT_IGNORESLOWDOWN, MAGIC_TRAIT) diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/blood_sorcery/mysticism.dm b/modular_darkpack/modules/vampire_the_masquerade/code/blood_sorcery/mysticism.dm deleted file mode 100644 index d1531609cc35..000000000000 --- a/modular_darkpack/modules/vampire_the_masquerade/code/blood_sorcery/mysticism.dm +++ /dev/null @@ -1,109 +0,0 @@ -/obj/item/mystic_tome - name = "mystic tome" - desc = "The secrets of Abyss Mysticism..." - icon_state = "mystic" - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - w_class = WEIGHT_CLASS_SMALL - var/list/rituals = list() - -/obj/item/mystic_tome/Initialize(mapload) - . = ..() - for(var/i in subtypesof(/obj/abyssrune)) - var/obj/abyssrune/R = new i(src) - rituals |= R - -/obj/item/mystic_tome/attack_self(mob/user) - . = ..() - for(var/obj/abyssrune/R in rituals) - if(R.sacrifice) - var/obj/item/I = new R.sacrifice(src) - to_chat(user, "[R.mystlevel] [R.name] - [R.desc] Requirements: [I].") - qdel(I) - else - to_chat(user, "[R.mystlevel] [R.name] - [R.desc]") - -/obj/abyssrune - name = "Lasombra Rune" - desc = "Learn the secrets of the Abyss, neonate..." - icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' - icon_state = "rune1" - color = rgb(0,0,0) - anchored = TRUE - var/word = "IDI NAH" - var/activator_bonus = 0 - var/activated = FALSE - var/mob/living/last_activator - var/mystlevel = 1 - var/sacrifice - -/obj/abyssrune/proc/complete() - return - -/obj/abyssrune/attack_hand(mob/user) - if(!activated) - var/mob/living/L = user - if(L.mysticism_knowledge) - L.say("[word]") - L.Immobilize(30) - last_activator = user - activator_bonus = L.thaum_damage_plus - if(sacrifice) - for(var/obj/item/I in get_turf(src)) - if(istype(I, sacrifice)) - qdel(I) - complete() - else - complete() - -/obj/abyssrune/click_alt(mob/user) - . = ..() - qdel(src) - -/obj/abyssrune/selfgib - name = "Self Destruction" - desc = "Meet the Final Death." - icon_state = "rune2" - word = "YNT FRM MCHGN FYNV DN THS B'FO" - -/obj/abyssrune/selfgib/complete() - last_activator.death() - -/obj/abyssrune/silent_heart - name = "Silently-Beating Heart" - desc = "Creates a shadowy abomination to protect the Lasombra and his domain." - icon_state = "rune1" - word = "ANI UMRA" - mystlevel = 3 - -/obj/abyssrune/silent_heart/complete() - var/mob/living/carbon/human/H = last_activator - if(!length(H.beastmaster)) - var/datum/action/beastmaster_stay/E1 = new() - E1.Grant(last_activator) - var/datum/action/beastmaster_deaggro/E2 = new() - E2.Grant(last_activator) - var/mob/living/basic/shadow_guard/BG = new(loc) - BG.beastmaster = last_activator - H.beastmaster |= BG - BG.my_creator = last_activator - BG.melee_damage_lower = BG.melee_damage_lower+activator_bonus - BG.melee_damage_upper = BG.melee_damage_upper+activator_bonus - playsound(loc, 'sound/magic/voidblink.ogg', 50, FALSE) - if(length(H.beastmaster) > 3+H.mentality) - var/mob/living/simple_animal/hostile/beastmaster/B = pick(H.beastmaster) - B.death() - qdel(src) - -/obj/abyssrune/identification - name = "Occult Items Identification" - desc = "Identificates single occult item" - icon_state = "rune4" - word = "WUS'ZAT" - -/obj/abyssrune/identification/complete() - for(var/obj/item/vtm_artifact/VA in loc) - VA.identificate() - playsound(loc, 'sound/magic/voidblink.ogg', 50, FALSE) - qdel(src) - return diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/blood_sorcery/pyramid.dm b/modular_darkpack/modules/vampire_the_masquerade/code/blood_sorcery/pyramid.dm deleted file mode 100644 index e7211804785c..000000000000 --- a/modular_darkpack/modules/vampire_the_masquerade/code/blood_sorcery/pyramid.dm +++ /dev/null @@ -1,476 +0,0 @@ -/obj/item/arcane_tome - name = "arcane tome" - desc = "The secrets of Blood Magic..." - icon_state = "arcane" - icon = 'modular_darkpack/modules/deprecated/icons/items.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - w_class = WEIGHT_CLASS_SMALL - is_magic = TRUE - var/list/rituals = list() - -/obj/item/arcane_tome/Initialize(mapload) - . = ..() - for(var/i in subtypesof(/obj/ritualrune)) - var/obj/ritualrune/R = new i(src) - rituals |= R - -/obj/item/arcane_tome/attack_self(mob/user) - . = ..() - for(var/obj/ritualrune/R in rituals) - if(R.sacrifices.len > 0) - var/list/required_items = list() - for(var/item_type in R.sacrifices) - var/obj/item/I = new item_type(src) - required_items += I.name - qdel(I) - var/required_list - if(required_items.len == 1) - required_list = required_items[1] - else - for(var/item_name in required_items) - required_list += (required_list == "" ? item_name : ", [item_name]") - to_chat(user, "[R.thaumlevel] [R.name] - [R.desc] Requirements: [required_list].") - else - to_chat(user, "[R.thaumlevel] [R.name] - [R.desc]") - -/obj/ritualrune - name = "Tremere Rune" - desc = "Learn the secrets of blood, neonate..." - icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' - icon_state = "rune1" - color = rgb(128,0,0) - anchored = TRUE - var/word = "IDI NAH" - var/activator_bonus = 0 - var/activated = FALSE - var/mob/living/last_activator - var/thaumlevel = 1 - var/list/sacrifices = list() - -/obj/ritualrune/proc/complete() - return - -/obj/ritualrune/attack_hand(mob/user) - if(!activated) - var/mob/living/L = user - if(L.thaumaturgy_knowledge) - L.say("[word]") - L.Immobilize(30) - last_activator = user - activator_bonus = L.thaum_damage_plus - if(sacrifices.len > 0) - var/list/found_items = list() - for(var/obj/item/I in get_turf(src)) - for(var/item_type in sacrifices) - if(istype(I, item_type)) - if(istype(I, /obj/item/reagent_containers/blood)) - var/obj/item/reagent_containers/blood/bloodpack = I - if(!bloodpack.empty) - found_items += I - break - else - found_items += I - break - - if(found_items.len == sacrifices.len) - for(var/obj/item/I in found_items) - qdel(I) - complete() - else - to_chat(user, "You lack the necessary sacrifices to complete the ritual. Found [found_items.len], required [sacrifices.len].") - else - complete() - -/obj/ritualrune/click_alt(mob/user) - . = ..() - qdel(src) - -/obj/ritualrune/selfgib - name = "Self Destruction" - desc = "Meet the Final Death." - icon_state = "rune2" - word = "CHNGE DA'WORD, GDBE" - -/obj/ritualrune/selfgib/complete() - last_activator.death() - -/obj/ritualrune/blood_guardian - name = "Blood Guardian" - desc = "Creates the Blood Guardian to protect tremere or his domain." - icon_state = "rune1" - word = "UR'JOLA" - thaumlevel = 3 - -/obj/ritualrune/blood_guardian/complete() - var/mob/living/carbon/human/H = last_activator - if(!length(H.beastmaster)) - var/datum/action/beastmaster_stay/E1 = new() - E1.Grant(last_activator) - var/datum/action/beastmaster_deaggro/E2 = new() - E2.Grant(last_activator) - var/mob/living/basic/blood_guard/BG = new(loc) - BG.beastmaster = last_activator - H.beastmaster |= BG - BG.my_creator = last_activator - BG.melee_damage_lower = BG.melee_damage_lower+activator_bonus - BG.melee_damage_upper = BG.melee_damage_upper+activator_bonus - playsound(loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - if(length(H.beastmaster) > 3+H.mentality) - var/mob/living/simple_animal/hostile/beastmaster/B = pick(H.beastmaster) - B.death() - qdel(src) - -/obj/ritualrune/blood_trap - name = "Blood Trap" - desc = "Creates the Blood Trap to protect tremere or his domain." - icon_state = "rune2" - word = "DUH'K-A'U" - -/obj/ritualrune/blood_trap/complete() - if(!activated) - playsound(loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - activated = TRUE - alpha = 28 - -/obj/ritualrune/blood_trap/Crossed(atom/movable/AM) - . = ..() - if(isliving(AM) && activated) - var/mob/living/L = AM - L.adjustFireLoss(50+activator_bonus) - playsound(loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - qdel(src) - -/obj/ritualrune/blood_wall - name = "Blood Wall" - desc = "Creates the Blood Wall to protect tremere or his domain." - icon_state = "rune3" - word = "SOT'PY-O" - thaumlevel = 2 - -/obj/ritualrune/blood_wall/complete() - new /obj/structure/bloodwall(loc) - playsound(loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - qdel(src) - -/obj/structure/bloodwall - name = "blood wall" - desc = "Wall from BLOOD." - icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' - icon_state = "bloodwall" - plane = GAME_PLANE - layer = ABOVE_MOB_LAYER - anchored = TRUE - density = TRUE - max_integrity = 100 - obj_integrity = 100 - -/obj/structure/fleshwall - name = "flesh wall" - desc = "Wall from FLESH." - icon = 'modular_darkpack/modules/deprecated/icons/icons.dmi' - icon_state = "fleshwall" - plane = GAME_PLANE - layer = ABOVE_MOB_LAYER - anchored = TRUE - density = TRUE - max_integrity = 100 - obj_integrity = 100 - -/obj/ritualrune/identification - name = "Identification Rune" - desc = "Identifies a single occult item." - icon_state = "rune4" - word = "IN'DAR" - -/obj/ritualrune/identification/complete() - for(var/obj/item/vtm_artifact/VA in loc) - VA.identificate() - playsound(loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - qdel(src) - return - -/obj/ritualrune/question - name = "Question to Ancestors Rune" - desc = "Summon souls from the dead. Ask a question and get answers. Requires a bloodpack." - icon_state = "rune5" - word = "TE-ME'LL" - thaumlevel = 3 - sacrifices = list(/obj/item/reagent_containers/blood) - -/mob/living/simple_animal/hostile/ghost/tremere - maxHealth = 1 - health = 1 - melee_damage_lower = 1 - melee_damage_upper = 1 - faction = list(VAMPIRE_CLAN_TREMERE) - -/obj/ritualrune/question/complete() - visible_message(span_notice("A call rings out to the dead from the [src.name] rune...")) - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you wish to answer a question? (You are allowed to spread meta information)", null, null, null, 10 SECONDS, src) - for(var/mob/dead/observer/G in GLOB.player_list) - if(G.key) - to_chat(G, span_ghostalert("Question rune has been triggered.")) - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) - var/mob/living/simple_animal/hostile/ghost/tremere/TR = new(loc) - TR.key = C.key - TR.name = C.name - playsound(loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - qdel(src) - else - visible_message(span_notice("No one answers the [src.name] rune's call.")) - -/obj/ritualrune/teleport - name = "Teleportation Rune" - desc = "Move your body among the city streets. Requires a bloodpack." - icon_state = "rune6" - word = "POR'TALE" - thaumlevel = 5 - sacrifices = list(/obj/item/reagent_containers/blood) - -/obj/ritualrune/teleport/complete() - if(!activated) - activated = TRUE - color = rgb(255,255,255) - icon_state = "teleport" - -/obj/ritualrune/teleport/attack_hand(mob/user) - . = ..() - if(activated) - if(last_activator != user) - to_chat(user, span_warning("You are not the one who activated this rune!")) - return - var/direction = input(user, "Choose direction:", "Teleportation Rune") in list("North", "East", "South", "West") - if(direction) - var/x_dir = user.x - var/y_dir = user.y - var/step = 1 - var/min_distance = 10 - var/max_distance = 20 - var/valid_destination = FALSE - var/turf/destination = null - - if(get_dist(src, user) > 1) - to_chat(user, span_warning("You moved away from the rune!")) - return - - // Move at least min_distance tiles in the chosen direction - while(step <= min_distance) - switch(direction) - if("North") - y_dir += 1 - if("East") - x_dir += 1 - if("South") - y_dir -= 1 - if("West") - x_dir -= 1 - step += 1 - - // Continue moving until a valid destination is found or max_distance is reached - while(step <= max_distance && !valid_destination) - switch(direction) - if("North") - y_dir += 1 - if("East") - x_dir += 1 - if("South") - y_dir -= 1 - if("West") - x_dir -= 1 - - if(x_dir < 20 || x_dir > 230 || y_dir < 20 || y_dir > 230) - to_chat(user, span_warning("You can't teleport outside the city!")) - return - - destination = locate(x_dir, y_dir, user.z) - if(destination && !istype(destination, /turf/open/space/basic) && !istype(destination, /turf/closed/wall/vampwall)) - valid_destination = TRUE - else - step += 1 - - if(valid_destination) - playsound(loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - user.forceMove(destination) - qdel(src) - else - to_chat(user, span_warning("The spell fails as no destination is found!")) - -/obj/ritualrune/curse - name = "Curse Rune" - desc = "Curse your enemies in distance. Requires a heart." - icon_state = "rune7" - word = "CUS-RE'S" - thaumlevel = 5 - sacrifices = list(/obj/item/organ/heart) - -/obj/ritualrune/curse/complete() - if(!activated) - playsound(loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - color = rgb(255,0,0) - activated = TRUE - -/obj/ritualrune/curse/attack_hand(mob/user) - . = ..() - var/cursed - if(activated) - var/namem = input(user, "Choose target name:", "Curse Rune") as text|null - qdel(src) - if(namem) - cursed = namem - for(var/mob/living/carbon/human/H in GLOB.player_list) - if(H.real_name == cursed) - H.adjustAggLoss(25) - playsound(H.loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - to_chat(H, span_warning("You feel someone repeating your name from the shadows...")) - H.Stun(10) - return - to_chat(user, span_warning("There is no such names in the city!")) - -/obj/ritualrune/blood_to_water - name = "Blood To Water" - desc = "Purges all blood in range into the water." - icon_state = "rune8" - word = "CL-ENE" - -/obj/ritualrune/blood_to_water/complete() - for(var/atom/A in range(7, src)) - A.wash(CLEAN_WASH) - qdel(src) - -/obj/ritualrune/gargoyle - name = "Gargoyle Transformation" - desc = "Create a Gargoyle." - icon_state = "rune9" - word = "GRORRR'RRR" - thaumlevel = 4 - -/obj/ritualrune/gargoyle/complete() - for(var/mob/living/carbon/human/H in loc) - if(H.stat > SOFT_CRIT) - for(var/datum/action/A in H.actions) - if(A.vampiric) - A.Remove(H) - H.revive(TRUE) - H.set_species(/datum/species/human/kindred) - H.set_clan(/datum/vampire_clan/gargoyle) - H.forceMove(get_turf(src)) - H.create_disciplines(FALSE, H.clan.clan_disciplines) - if(!H.key) - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you wish to play as Sentient Gargoyle?", null, null, null, 50, src) - for(var/mob/dead/observer/G in GLOB.player_list) - if(G.key) - to_chat(G, span_ghostalert("Gargoyle Transformation rune has been triggered.")) - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) - H.key = C.key -// Y.key = C.key -// Y.my_creator = last_activator - playsound(loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - qdel(src) - return - else - playsound(loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - H.adjustBruteLoss(25) - H.emote("scream") - return - -//Deflection of the Wooden Doom ritual -//Protects you from being staked for a single hit. Is it useful? Marginally. But it is a level 1 rite. -/obj/ritualrune/deflection_stake - name = "Deflection of the Wooden Doom" - desc = "Shield your heart and splinter the enemy stake. Requires a stake." - icon_state = "rune7" - word = "Splinter, shatter, break the wooden doom." - thaumlevel = 1 - sacrifices = list(/obj/item/vampire_stake) - -/obj/ritualrune/deflection_stake/complete() - for(var/mob/living/carbon/human/H in loc) - if(!HAS_TRAIT(H, TRAIT_STAKE_RESISTANT)) - ADD_TRAIT(H, TRAIT_STAKE_RESISTANT, MAGIC_TRAIT) - qdel(src) - playsound(loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - color = rgb(255,0,0) - activated = TRUE - -/obj/ritualrune/bloodwalk - name = "Blood Walk" - desc = "Trace the subject's lineage from a blood syringe." - icon_state = "rune7" - word = "Reveal thine bloodline for my eyes." - thaumlevel = 2 - -/obj/ritualrune/bloodwalk/attack_hand(mob/user) - for(var/obj/item/reagent_containers/syringe/S in loc) - for(var/datum/reagent/blood/B in S.reagents.reagent_list) - if(B.type == /datum/reagent/blood) - var/blood_data = B.data - if(blood_data) - var/generation = blood_data["generation"] - var/clan = blood_data["clan"] - - var/message = generate_message(generation, clan) - to_chat(user, "[message]") - else - to_chat(user, "The blood speaks not-it is empty of power!") - else - to_chat(user, "This reagent is lifeless, unworthy of the ritual!") - playsound(loc, 'modular_darkpack/modules/deprecated/sounds/thaum.ogg', 50, FALSE) - color = rgb(255,0,0) - activated = TRUE - qdel(src) - -/obj/ritualrune/bloodwalk/proc/generate_message(generation, clan) - var/message = "" - - if(generation == 4) - message += "The blood is incredibly ancient and powerful! It must be from an ancient Methuselah! " - else if(generation == 5) - message += "The blood is incredibly ancient and powerful! It must be from a Methuselah! " - else if(generation == 6) - message += "The blood is incredibly ancient and powerful! It must be from an Elder! " - else if(generation == 7 || generation == 8 || generation == 9) - message += "The blood is powerful. It must come from an Ancilla or Elder! " - else if(generation == 10 || generation == 11) - message += "The blood is of middling strength. It must come from someone young. " - else if(generation >=12) - message += "The blood is of waning strength. It must come from a neonate. " - - if(clan == "Toreador" || clan == "Daughters of Cacophony") - message += "The blood is sweet and rich. The owner must, too, be beautiful." - else if(clan == "Ventrue") - message += "The blood has kingly power in it, descending from Mithras or Hardestadt." - else if(clan == "Lasombra") - message += "Cold and dark, this blood has a mystical connection to the Abyss." - else if(clan == "Tzimisce") - message += "The vitae is mutable and twisted. Is there any doubt to the cursed line it belongs to?" - else if(clan == "Gangrel") - message += "The blood emits a primal and feral aura. The same is likely of the owner." - else if(clan == "Malkavian") - message += "You can sense chaos and madness within this blood. It's owner must be maddened too." - else if(clan == "Brujah") - message += "The blood is filled with passion and anger. So must be the owner of the blood." - else if(clan == "Nosferatu") - message += "The blood is foul and disgusting. Same must apply to the owner." - else if(clan == "Tremere") - message += "The blood is filled with the power of magic. The owner must be a thaumaturge." - else if(clan == "Baali") - message += "Tainted and corrupt. Vile and filthy. You see your reflection in the blood, but something else stares back." - else if(clan == "Assamite") - message += "Potent... Deadly... And cursed. You know well the curse laid by Tremere on the assassins." - else if(clan == "True Brujah") - message += "The blood is cold and static... It's hard to feel any emotion within it." - else if(clan == "Salubri") - message += "The cursed blood of the Salubri! The owner of this blood must be slain." - else if(clan == "Giovanni" || clan == "Cappadocian") - message += "The blood is very cold and filled with death. The owner must be a necromancer." - else if(clan == "Kiasyd") - message += "The blood is filled with traces of fae magic." - else if(clan == "Gargoyle") - message += "The blood of our stone servants." - else if(clan == "Setite") - message += "Seduction and allure are in the blood. Ah, one of the snakes." - else - message += "The blood's origin is hard to trace. Perhaps it is one of the clanless?" - return message diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/kindred/humanity.dm b/modular_darkpack/modules/vampire_the_masquerade/code/kindred/humanity.dm index 9b3596d5ff32..b776dd28c2fc 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/kindred/humanity.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/kindred/humanity.dm @@ -1,9 +1,8 @@ /mob/living/proc/AdjustHumanity(value, limit, forced) // Only vampires have a "working" morality system currently - if (!iskindred(src)) + var/datum/splat/vampire/kindred/vampirism = iskindred(src) + if (!vampirism) return - var/mob/living/carbon/human/vampire = src - var/datum/species/human/kindred/vampirism = vampire.dna.species // "Enlightenment" is essentially the Path of Pure Evil. Inverts Humanity changes and limits. var/is_enlightenment = vampirism.enlightenment diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/splats/__vampire_splat.dm b/modular_darkpack/modules/vampire_the_masquerade/code/splats/__vampire_splat.dm new file mode 100644 index 000000000000..3e4f87b29190 --- /dev/null +++ b/modular_darkpack/modules/vampire_the_masquerade/code/splats/__vampire_splat.dm @@ -0,0 +1,50 @@ +/datum/splat/vampire + abstract_type = /datum/splat/vampire + + power_type = /datum/discipline + +/datum/splat/vampire/proc/get_discipline_power(datum/discipline_power/discipline_power_type) + RETURN_TYPE(/datum/discipline_power) + + return get_discipline(discipline_power_type::discipline)?.get_power(discipline_power_type) + +/datum/splat/vampire/proc/get_discipline(discipline_type) + RETURN_TYPE(/datum/discipline) + + return get_power(discipline_type)?.discipline + +/datum/splat/vampire/get_power(power_type) + RETURN_TYPE(/datum/action/discipline) + + for (var/datum/action/discipline/found_action as anything in powers) + if (!istype(found_action.discipline, power_type)) + continue + + return found_action + +/datum/splat/vampire/add_power(power_type, level) + // Prevent duplicates + if (get_power(power_type)) + return FALSE + var/datum/discipline/new_discipline = new power_type(level) + var/datum/action/discipline/adding_action = new new_discipline.action_type(new_discipline) + adding_action.Grant(owner) + LAZYADD(powers, adding_action) + return TRUE + +/datum/splat/vampire/remove_power(power_type) + var/datum/action/discipline/found_action = get_power(power_type) + if (!found_action) + return FALSE + + LAZYREMOVE(powers, found_action) + qdel(found_action) + return TRUE + +/datum/splat/vampire/change_power_level(power_type, new_level) + var/datum/action/discipline/found_action = get_power(power_type) + if (!found_action) + return FALSE + + found_action.discipline.set_level(new_level) + return TRUE diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/ghoul_splat.dm b/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/ghoul_splat.dm new file mode 100644 index 000000000000..88e6fbedb6f6 --- /dev/null +++ b/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/ghoul_splat.dm @@ -0,0 +1,20 @@ +/datum/splat/vampire/ghoul + name = "Ghoul" + desc = "Mortals empowered by and addicted to the supernatural blood of \ + Kindred. While not as powerful as true Kindred, they retain their \ + humanity and suffer none of the weaknesses of the Kindred, making \ + them ideal servants to their domitors." + id = SPLAT_GHOUL + + splat_actions = list( + /datum/action/cooldown/blood_power, + ) + + /// The Kindred this ghoul is blood bonded to + var/mob/living/domitor + +/datum/splat/vampire/ghoul/New(mob/living/domitor) + src.domitor = domitor + +/datum/splat/vampire/ghoul/on_gain() + owner.give_st_power(/datum/discipline/bloodheal, 1) diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/make_ghoul.dm b/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/make_ghoul.dm new file mode 100644 index 000000000000..b711203a495a --- /dev/null +++ b/modular_darkpack/modules/vampire_the_masquerade/code/splats/ghoul_splat/make_ghoul.dm @@ -0,0 +1,4 @@ +/mob/living/proc/make_ghoul(mob/living/domitor) + RETURN_TYPE(/datum/splat/vampire/ghoul) + + return add_splat(/datum/splat/vampire/ghoul, domitor) diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/splats/is_vampire_helpers.dm b/modular_darkpack/modules/vampire_the_masquerade/code/splats/is_vampire_helpers.dm new file mode 100644 index 000000000000..a3f71c5dcdbf --- /dev/null +++ b/modular_darkpack/modules/vampire_the_masquerade/code/splats/is_vampire_helpers.dm @@ -0,0 +1,33 @@ +/** + * If the character is any kind of vampiric creature, named after the game line + */ +/proc/isvampiresplat(mob/character) + RETURN_TYPE(/datum/splat/vampire) + + return character.get_splat(/datum/splat/vampire) + +/** + * If the character has Vitae, readable wrapper for isvampiresplat() for checking Vitae + */ +/proc/has_vitae(mob/character) + RETURN_TYPE(/datum/splat/vampire) + + return isvampiresplat(character) + +/** + * If the character can learn and use Disciplines, readable wrapper for isvampiresplat() for Discipline uses + */ +/proc/does_use_disciplines(mob/character) + RETURN_TYPE(/datum/splat/vampire) + + return isvampiresplat(character) + +/proc/iskindred(mob/character) + RETURN_TYPE(/datum/splat/vampire/kindred) + + return character.get_splat(/datum/splat/vampire/kindred) + +/proc/isghoul(mob/character) + RETURN_TYPE(/datum/splat/vampire/ghoul) + + return character.get_splat(/datum/splat/vampire/ghoul) diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/generation.dm b/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/generation.dm new file mode 100644 index 000000000000..538661e56662 --- /dev/null +++ b/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/generation.dm @@ -0,0 +1,100 @@ +GLOBAL_LIST_INIT(bloodpool_by_gen, list( + 1000, // 1st (Caine, speculative) + 150, // 2nd (2nd Generation, speculative) + 100, // 3rd (Antediluvians, speculative) + 50, // 4th (Methuselahs) + 40, // 5th + 30, // 6th (Elders) + 20, // 7th + 15, // 8th + 14, // 9th (Ancillae) + 13, // 10th + 12, // 11th (Neonates) + 11, // 12th + 10, // 13th + 10, // 14th (Thin-Blooded) + 10, // 15th + 10 // 16th +)) + +GLOBAL_LIST_INIT(vitae_spending_rate_by_gen, list( + 10, // 1st (Caine, speculative) + 10, // 2nd (2nd Generation, speculative) + 10, // 3rd (Antediluvians, speculative) + 10, // 4th (Methuselahs) + 8, // 5th + 6, // 6th (Elders) + 4, // 7th + 3, // 8th + 2, // 9th (Ancillae) + 1, // 10th + 1, // 11th (Neonates) + 1, // 12th + 1, // 13th + 1, // 14th (Thin-Blooded) + 1, // 15th + 1 // 16th +)) + +/** + * Get the maximum bloodpool for the given Kindred Generation as per V20 p. 270 + * + * Arguments: + * * gen - Generation to check + */ +/proc/get_max_bloodpool(gen) + gen = clamp(gen, 1, length(GLOB.bloodpool_by_gen)) + return GLOB.bloodpool_by_gen[gen] + +/** + * Get the vitae spending rate for the given Kindred Generation as per V20 p. 270 + * + * Arguments: + * * gen - Generation to check + */ +/proc/get_vitae_spending_rate(gen) + gen = clamp(gen, 1, length(GLOB.vitae_spending_rate_by_gen)) + return GLOB.vitae_spending_rate_by_gen[gen] + +/** + * Get the mob's Generation if they're a Kindred, or their effective Generation + * if they're a Ghoul or some other splat. + */ +/mob/living/proc/get_generation() + var/datum/splat/vampire/kindred/kindred = iskindred(src) + if (!kindred) + return isghoul(src) ? GHOUL_GENERATION : HUMAN_GENERATION + + return kindred.generation + +/** + * Set the Kindred's Generation and update bloodpool size and vitae spending + * rates appropriately. + */ +/datum/splat/vampire/kindred/proc/set_generation(generation = DEFAULT_GENERATION) + src.generation = generation + + update_bloodpool_size() + + update_vitae_spending_rate() + +/** + * Internal proc to update bloodpool size on Generation change. + */ +/datum/splat/vampire/kindred/proc/update_bloodpool_size() + PRIVATE_PROC(TRUE) + + // Base human bloodpool + 3 for every Generation below 13 + owner.maxbloodpool = get_max_bloodpool(generation) + owner.bloodpool = clamp(owner.bloodpool, 0, owner.maxbloodpool) + owner.update_blood_hud() + +/** + * Internal proc to update vitae spending rate and its related abilities on + * Generation change. + */ +/datum/splat/vampire/kindred/proc/update_vitae_spending_rate() + PRIVATE_PROC(TRUE) + + vitae_spending_rate = get_vitae_spending_rate(generation) + owner.change_st_power_level(/datum/discipline/bloodheal, vitae_spending_rate) diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/kindred_splat.dm b/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/kindred_splat.dm new file mode 100644 index 000000000000..fc3669352700 --- /dev/null +++ b/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/kindred_splat.dm @@ -0,0 +1,193 @@ +/datum/splat/vampire/kindred + name = "Kindred" + desc = "Undead predators that have been feeding on humanity since stone was first turned into tools. \ + They use the powers of their stolen blood to control human societies." + id = SPLAT_KINDRED + + splat_traits = list( + TRAIT_LIMBATTACHMENT, + TRAIT_NOHUNGER, + TRAIT_NOBREATH, + TRAIT_NOCRITDAMAGE, + TRAIT_RADIMMUNE, + TRAIT_CAN_ENTER_TORPOR, + TRAIT_VTM_MORALITY, + TRAIT_VTM_CLANS, + TRAIT_UNAGING, + TRAIT_DRINKS_BLOOD + ) + splat_actions = list( + /datum/action/cooldown/mob_cooldown/give_vitae, + /datum/action/cooldown/blood_power, + ) + splat_biotypes = MOB_UNDEAD + + incompatible_splats = list( + /datum/splat/vampire/ghoul + ) + + /// How many generations away from the first vampire they are. Determines how much blood can be stored and used + var/generation + /// How quickly they can spend vitae. Depends on Generation and affects abilities like bloodheal + var/vitae_spending_rate + /// Which vampiric bloodline or Clan they fall into. Determines natural Disciplines. Singleton reference, never modify + var/datum/vampire_clan/clan + /// Which morality they follow, Humanity if false and Enlightenment if true + var/enlightenment + /// The Kindred who created this Kindred, null unless Embraced in-round + var/mob/living/sire + + /// Timer tracking how long before the Kindred can wake up from torpor + COOLDOWN_DECLARE(torpor_timer) + +/datum/splat/vampire/kindred/New(generation, clan, enlightenment = FALSE, mob/living/sire) + src.generation = generation + src.clan = clan + src.enlightenment = enlightenment + src.sire = sire + +/datum/splat/vampire/kindred/on_gain() + if (!isdummy(owner)) + GLOB.kindred_list |= owner + + // DARKPACK TODO - reimplement this action maybe + // add_verb(new_kindred, TYPE_VERB_REF(/mob/living/carbon/human, teach_discipline)) + + //this needs to be adjusted to be more accurate for blood spending rates + owner.give_st_power(/datum/discipline/bloodheal, clamp(11 - generation, 1, 10)) + + //vampires die instantly upon having their heart removed + RegisterSignal(owner, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(handle_lose_organ)) + + //vampires don't die while in crit, they just slip into torpor after 2 minutes of being critted + RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_CRITICAL_CONDITION), PROC_REF(handle_enter_critical_condition)) + + //vampires resist vampire bites better than mortals + RegisterSignal(owner, COMSIG_MOB_VAMPIRE_SUCKED, PROC_REF(on_vampire_bitten)) + + // Apply bashing damage resistance + RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, PROC_REF(damage_resistance)) + + // Prevent blood loss and regeneration effects + RegisterSignal(owner, COMSIG_HUMAN_ON_HANDLE_BLOOD, PROC_REF(kindred_blood)) + + // Make all food except raw meat repulsive + var/obj/item/organ/tongue/tongue = owner.get_organ_by_type(/obj/item/organ/tongue) + tongue?.liked_foodtypes = NONE + tongue?.disliked_foodtypes = NONE + tongue?.toxic_foodtypes = ~(GORE | MEAT | RAW) + + // Set blood type + owner.set_blood_type(BLOOD_TYPE_KINDRED) + + // Apply temperature damage modifiers + owner.physiology.heat_mod *= 2 + owner.physiology.cold_mod *= 0.25 + + // Initialize previously set Clan and Generation + set_generation(generation) + owner.set_clan(clan) + +/datum/splat/vampire/kindred/on_lose() + owner.set_clan(null) + + UnregisterSignal(owner, COMSIG_CARBON_LOSE_ORGAN) + UnregisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_CRITICAL_CONDITION)) + UnregisterSignal(owner, COMSIG_MOB_VAMPIRE_SUCKED) + UnregisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS) + UnregisterSignal(owner, COMSIG_HUMAN_ON_HANDLE_BLOOD) + + // Reset tongue + var/obj/item/organ/tongue/tongue = owner.get_organ_by_type(/obj/item/organ/tongue) + tongue?.liked_foodtypes = initial(tongue.liked_foodtypes) + tongue?.disliked_foodtypes = initial(tongue.disliked_foodtypes) + tongue?.toxic_foodtypes = initial(tongue.toxic_foodtypes) + + // Reset blood type + owner.set_blood_type() + + // Reset temperature damage modifiers + owner.physiology.heat_mod *= 0.5 + owner.physiology.cold_mod *= 4 + + // Reset bloodpool size from Generation + owner.maxbloodpool = initial(owner.maxbloodpool) + +/datum/splat/vampire/kindred/on_lose_or_destroy() + if (isdummy(owner)) + return + + GLOB.kindred_list -= owner + +/datum/splat/vampire/kindred/proc/damage_resistance(datum/source, list/damage_mods, damage_amount, damagetype, def_zone, sharpness, attack_direction, obj/item/attacking_item) + SIGNAL_HANDLER + + // Kindred take half "bashing" damage, which is normally blunt damage but includes pointy things like bullets because they're undead + if ((damagetype == BRUTE) && (sharpness != SHARP_EDGED)) + damage_mods += 0.5 + +/** + * Signal handler for COMSIG_CARBON_LOSE_ORGAN to near-instantly kill Kindred whose hearts have been removed. + * + * Arguments: + * * source - The Kindred whose organ has been removed. + * * organ - The organ which has been removed. + */ +/datum/splat/vampire/kindred/proc/handle_lose_organ(mob/living/carbon/human/source, obj/item/organ/organ) + SIGNAL_HANDLER + + if (!istype(organ, /obj/item/organ/heart)) + return + // You don't want the character preview going sideways, and they lose organs a lot + if (isdummy(source)) + return + + addtimer(CALLBACK(src, PROC_REF(lose_heart), source, organ), 0.5 SECONDS) + +/datum/splat/vampire/kindred/proc/lose_heart(mob/living/carbon/human/source, obj/item/organ/heart/heart) + if (source.get_organ_by_type(/obj/item/organ/heart)) + return + + source.death() + +/datum/splat/vampire/kindred/proc/handle_enter_critical_condition(mob/living/carbon/human/source) + SIGNAL_HANDLER + + to_chat(source, span_warning("You can feel yourself slipping into Torpor. You can use succumb to immediately sleep...")) + addtimer(CALLBACK(src, PROC_REF(slip_into_torpor), source), 2 MINUTES) + +/datum/splat/vampire/kindred/proc/slip_into_torpor(mob/living/carbon/human/kindred) + if (!kindred || (kindred.stat == DEAD)) + return + if (kindred.stat < SOFT_CRIT) + return + + kindred.torpor("damage") + +/** + * On being bit by a vampire + * + * This handles vampire bite sleep immunity and any future special interactions. + */ +/datum/splat/vampire/kindred/proc/on_vampire_bitten(datum/source, mob/living/carbon/being_bitten) + SIGNAL_HANDLER + + return COMPONENT_RESIST_VAMPIRE_KISS + +/datum/splat/vampire/kindred/proc/kindred_blood(mob/living/carbon/human/kindred, seconds_per_tick, times_fired) + SIGNAL_HANDLER + + if(kindred.stat == DEAD) + return HANDLE_BLOOD_HANDLED + + return HANDLE_BLOOD_NO_NUTRITION_DRAIN|HANDLE_BLOOD_NO_OXYLOSS + +/datum/splat/vampire/kindred/vv_edit_var(var_name, var_value) + switch (var_name) + if (NAMEOF(src, generation)) + if (var_value < LOWEST_GENERATION_LIMIT || var_value > HIGHEST_GENERATION_LIMIT) + return FALSE + + set_generation(var_value) + + return ..() diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/make_kindred.dm b/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/make_kindred.dm new file mode 100644 index 000000000000..44421fb3e4b5 --- /dev/null +++ b/modular_darkpack/modules/vampire_the_masquerade/code/splats/kindred_splat/make_kindred.dm @@ -0,0 +1,29 @@ +/** + * Makes the mob a Kindred with the given Generation, Clan, morality, and sire. + */ +/mob/living/proc/make_kindred(generation = DEFAULT_GENERATION, datum/vampire_clan/clan, enlightenment, mob/living/sire) + RETURN_TYPE(/datum/splat/vampire/kindred) + + return add_splat(/datum/splat/vampire/kindred, generation, clan, enlightenment, sire) + +/** + * Makes the mob a Kindred as if Embraced by another Kindred. + * + * Inherits Generation and Clan while always starting on Humanity morality. + * Small chance for the childe to be a Caitiff independent of the sire's Clan. + * + * Arguments: + * * sire - Kindred creating this Kindred + * * always_same_clan - If there should be no chance the childe is a Caitiff + */ +/mob/living/proc/make_kindred_from_sire(mob/living/sire, always_same_clan = FALSE) + RETURN_TYPE(/datum/splat/vampire/kindred) + + var/datum/splat/vampire/kindred/sire_splat = iskindred(sire) + + var/datum/vampire_clan/childe_clan = sire_splat.clan + // 5% chance of childer being Caitiff instead of their sire's Clan + if (!always_same_clan && prob(5)) + childe_clan = GLOB.vampire_clans[/datum/vampire_clan/caitiff] + + return make_kindred(sire_splat.generation + 1, childe_clan, FALSE, sire) diff --git a/modular_darkpack/modules/vaults/code/drill.dm b/modular_darkpack/modules/vaults/code/drill.dm index 07de6c0f3021..ba51215302e2 100644 --- a/modular_darkpack/modules/vaults/code/drill.dm +++ b/modular_darkpack/modules/vaults/code/drill.dm @@ -1,11 +1,11 @@ -/obj/item/vampire/drill +/obj/item/darkpack/drill name = "thermal drill" desc = "Guys! The thermal drill, go get it!" - icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' + icon = 'modular_darkpack/modules/vaults/icons/drill48x32.dmi' icon_state = "vaultdrill" inhand_icon_state = "vaultdrill" - lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' - righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' + lefthand_file = 'modular_darkpack/modules/vaults/icons/drill_lefthand.dmi' + righthand_file = 'modular_darkpack/modules/vaults/icons/drill_righthand.dmi' ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') w_class = WEIGHT_CLASS_HUGE force = 8 @@ -13,8 +13,7 @@ throw_range = 3 var/obj/structure/drill/origin_type = /obj/structure/drill - -/obj/item/vampire/drill/proc/plant(mob/user) +/obj/item/darkpack/drill/proc/plant(mob/user) var/turf/T = get_turf(loc) if(!isfloorturf(T)) to_chat(user, span_warning("You need ground to put this on!")) @@ -26,31 +25,30 @@ placed_drill.setDir(user.dir) qdel(src) -/obj/item/vampire/drill/attack_self(mob/user) +/obj/item/darkpack/drill/attack_self(mob/user) plant(user) /obj/structure/drill name = "thermal drill" desc = "Guys! The thermal drill, go get it!" - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/vaults/icons/drill.dmi' icon_state = "vaultdrill" anchored = TRUE density = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF layer = GASFIRE_LAYER max_integrity = 3000 - var/item_drill = /obj/item/vampire/drill // if null it can't be picked up + var/item_drill = /obj/item/darkpack/drill var/gas = 0 var/max_gas = 300 var/ready = FALSE var/active = FALSE var/attached_door = null - - var/drill_sound = 'modular_darkpack/modules/deprecated/sounds/vault_drilling.ogg' + var/drill_sound = 'modular_darkpack/modules/vaults/sounds/vault_drilling.ogg' /obj/structure/drill/proc/health_status() - if(obj_integrity < max_integrity) - switch(obj_integrity) + if(atom_integrity < max_integrity) + switch(atom_integrity) if(2500 to 3000) return "slightly damaged" if(2000 to 2500) @@ -66,62 +64,101 @@ . = ..() var/health_status = health_status() . += "[src] has [gas] gas left." - if(obj_integrity < max_integrity) + if(atom_integrity < max_integrity) . += span_notice("[src] is [health_status].") -/obj/structure/drill/mouse_drop_receive(over_object, src_location, over_location) +/obj/structure/drill/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params) + + //lifting onto myself to pick it up + if(over_object == user && Adjacent(user) && !active) + if(!item_drill) + return + + if(!do_after(user, 5 SECONDS, target = src)) + return + + user.visible_message(span_notice("[user] lifts [src]."), span_notice("You grab [src].")) + ready = FALSE + attached_door = null + var/obj/item/picked_drill = new item_drill(loc) + TransferComponents(picked_drill) + user.put_in_hands(picked_drill) + qdel(src) + return + + //putting it on the vault door + if(istype(over_object, /obj/structure/vaultdoor) && Adjacent(user) && !active) + var/obj/structure/vaultdoor/target_door = over_object + + if(target_door.is_broken) + to_chat(user, span_warning("The door is already broken!")) + return + + if(ISDIAGONALDIR(get_dir(src, over_object))) + to_chat(user, span_warning("The drill must be directly adjacent to the door, not diagonal!")) + return + + if(!do_after(user, 5 SECONDS, target = src)) + return + + ready = TRUE + attached_door = over_object + var/direction = get_dir(src, over_object) + switch(direction) + if(WEST) + dir = WEST + pixel_x = -17 + pixel_y = 21 + if(EAST) + dir = EAST + pixel_x = 17 + pixel_y = 21 + if(NORTH) + dir = NORTH + pixel_y = 30 + if(SOUTH) + dir = SOUTH + pixel_y = -5 + + user.visible_message(span_notice("[user] attaches [src] to [over_object].")) + +/obj/structure/drill/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/gas_can)) + var/obj/item/gas_can/can = tool + + if(can.stored_gasoline <= 0) + balloon_alert(user, "empty!") + return ITEM_INTERACT_BLOCKING + + var/gas_space = max_gas - gas + if(gas_space <= 0) + balloon_alert(user, "already full!") + return ITEM_INTERACT_BLOCKING + + var/transfer_amount = min(gas_space, can.stored_gasoline) + can.stored_gasoline -= transfer_amount + gas += transfer_amount + + balloon_alert(user, "filled [transfer_amount] gas") + return ITEM_INTERACT_SUCCESS + + return NONE + +/obj/structure/drill/update_overlays() . = ..() - if(over_object == usr && Adjacent(usr) && !active) - if(do_after(usr, 5 SECONDS)) - if(!item_drill || src.flags_1 & NODECONSTRUCT_1) - return - if(!usr.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, TRUE)) - return - usr.visible_message(span_notice("[usr] lifts \the [src.name]."), span_notice("You grab \the [src.name].")) - ready = FALSE - attached_door = null - var/obj/item/picked_drill = new item_drill(loc) - TransferComponents(picked_drill) - usr.put_in_hands(picked_drill) - qdel(src) - var/obj/structure/vaultdoor/target_door = over_object - if((istype(over_object, /obj/structure/vaultdoor)) && Adjacent(usr) && !ISDIAGONALDIR(get_dir(src, over_object)) && !active && !target_door.is_broken) - if(do_after(usr, 5 SECONDS)) - ready = TRUE - attached_door = over_object - var/direction = get_dir(src, over_object) - switch(direction) - if(WEST) - dir = WEST - pixel_x = -17 - pixel_y = 21 - if(EAST) - dir = EAST - pixel_x = 17 - pixel_y = 21 - if(NORTH) - dir = NORTH - pixel_y = 30 - if(SOUTH) - dir = SOUTH - pixel_y = -5 - -/obj/structure/drill/proc/update_effects() - var/mutable_appearance/sparks = mutable_appearance('modular_darkpack/modules/deprecated/icons/particle_effects.dmi', "welding_sparks", ABOVE_ALL_MOB_LAYER, ABOVE_LIGHTING_PLANE) + cut_overlays() if(active) + var/mutable_appearance/sparks = mutable_appearance('modular_darkpack/modules/deprecated/icons/particle_effects.dmi', "welding_sparks", ABOVE_ALL_MOB_LAYER, src, ABOVE_LIGHTING_PLANE) add_overlay(sparks) - else - cut_overlays() /obj/structure/drill/proc/process_drill() while(active && ready && gas > 0) playsound(src, drill_sound, 100, TRUE, ignore_walls = TRUE) - update_effects() + update_overlays() if(!attached_door || !istype(attached_door, /obj/structure/vaultdoor)) active = FALSE ready = FALSE - return var/obj/structure/vaultdoor/vault_door = attached_door @@ -130,18 +167,10 @@ if(vault_door.door_health <= 0) vault_door.break_open() active = FALSE - update_effects() + update_overlays() sleep(3 SECONDS) -/obj/structure/drill/attackby(obj/item/used_item, mob/living/user, params) - if(istype(used_item, /obj/item/gas_can/)) - var/gas_space = max_gas - gas - var/obj/item/gas_can/can = used_item - can.stored_gasoline -= gas_space - gas += gas_space - return - /obj/structure/drill/attack_hand(mob/user) . = ..() if(!ready) @@ -151,13 +180,13 @@ to_chat(user, span_warning("The drill is out of gas!")) return if(!active) - if(do_after(user, 5 SECONDS)) + if(do_after(user, 5 SECONDS, target = src)) active = TRUE process_drill() else - if(do_after(user, 2 SECONDS)) + if(do_after(user, 2 SECONDS, target = src)) active = FALSE - update_effects() + update_overlays() visible_message(span_warning("[src] shuts off!")) /obj/structure/drill/proc/handle_layer() diff --git a/modular_darkpack/modules/vaults/code/keypad.dm b/modular_darkpack/modules/vaults/code/keypad.dm index 20e8a35eb7e0..c3cb6ccc5cc2 100644 --- a/modular_darkpack/modules/vaults/code/keypad.dm +++ b/modular_darkpack/modules/vaults/code/keypad.dm @@ -7,54 +7,50 @@ /obj/keypad name = "keypad" desc = "Requires a password to open." - icon = 'icons/obj/terminals_vtm.dmi' + icon = 'modular_darkpack/modules/vaults/icons/keypad.dmi' icon_state = "keypad" - plane = GAME_PLANE - layer = CAR_LAYER + layer = SIGN_LAYER anchored = TRUE - var/obj/machinery/door/poddoor/shutters/connected_shutter resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF - var/x_pos = 0 - var/y_pos = 0 + var/list/connected_shutters = list() var/pincode var/id = 0 -/obj/keypad/proc/connect_to_shutter() - for(var/obj/machinery/door/poddoor/shutters/S in GLOB.machines) - if(S.id == id) - connected_shutter = S - break - -/proc/find_keypad(keypad_type) - // Evil in world but luckiely this is not ran super often. - for(var/obj/keypad/K in world) - if(istype(K, keypad_type)) - return K - return null - /obj/keypad/Initialize(mapload) . = ..() pincode = create_unique_pincode() return INITIALIZE_HINT_LATELOAD /obj/keypad/LateInitialize() - . = ..() - connect_to_shutter() + if(!id) + return + connect_to_shutters() -/obj/keypad/attack_hand(mob/user as mob) - var/choice = input(user, "Please choose an action.", "Keypad") as null|anything in list("Enter Pincode", "Close Shutter") - switch(choice) - if("Enter Pincode") - var/input_pincode = input(user, "Please enter the pincode.", "Keypad") as null|text - if(input_pincode && "[input_pincode]" == pincode) - to_chat(user, span_notice("Access Granted.")) - if(connected_shutter.density) - connected_shutter.open() - else - to_chat(user, "<span class ='notice'>Access Denied.</span>") - if("Close Shutter") - if(connected_shutter && !connected_shutter.density) - connected_shutter.close() +/obj/keypad/proc/connect_to_shutters() + for(var/obj/machinery/door/poddoor/shutters/S in range(20, src)) + if(S.id == id) + connected_shutters += S + +/obj/keypad/attack_hand(mob/user) + if(!length(connected_shutters)) + to_chat(user, span_warning("No connected shutters.")) + return + + var/choice = tgui_alert(user, "Enter pincode or close shutters?", "Keypad", list("Enter Pincode", "Close Shutters", "Cancel")) + if(choice == "Enter Pincode") + var/input = tgui_input_text(user, "Enter 5-digit pincode:", "Keypad") + if("[input]" == pincode) + to_chat(user, span_notice("ACCESS GRANTED")) + for(var/obj/machinery/door/poddoor/shutters/S in connected_shutters) + if(S.density) + INVOKE_ASYNC(S, TYPE_PROC_REF(/obj/machinery/door/poddoor/shutters, open)) + else + to_chat(user, span_warning("ACCESS DENIED")) + + else if(choice == "Close Shutters") + for(var/obj/machinery/door/poddoor/shutters/S in connected_shutters) + if(!S.density) + INVOKE_ASYNC(S, TYPE_PROC_REF(/obj/machinery/door/poddoor/shutters, close)) /obj/keypad/armory id = 10 diff --git a/modular_darkpack/modules/vaults/code/vaultdoors.dm b/modular_darkpack/modules/vaults/code/vaultdoors.dm index 05651944b5a6..0285d72eccdb 100644 --- a/modular_darkpack/modules/vaults/code/vaultdoors.dm +++ b/modular_darkpack/modules/vaults/code/vaultdoors.dm @@ -1,7 +1,7 @@ /obj/structure/vaultdoor - name = "Vault Door" + name = "vault door" desc = "A heavy duty door that looks like it could withstand a lot of punishment." - icon = 'modular_darkpack/modules/deprecated/icons/doors.dmi' + icon = 'modular_darkpack/modules/vaults/icons/vault.dmi' icon_state = "vault-1" base_icon_state = "vault" plane = GAME_PLANE @@ -21,59 +21,33 @@ var/is_broken = FALSE var/door_health = 100 - var/open_sound = 'modular_darkpack/modules/deprecated/sounds/vault_door_opening.ogg' - var/close_sound = 'modular_darkpack/modules/deprecated/sounds/vault_door_closing.ogg' - var/lock_sound = 'modular_darkpack/modules/deprecated/sounds/vault_door_lock.ogg' + var/open_sound = 'modular_darkpack/modules/vaults/sounds/vault_door_opening.ogg' + var/close_sound = 'modular_darkpack/modules/vaults/sounds/vault_door_closing.ogg' + var/lock_sound = 'modular_darkpack/modules/vaults/sounds/vault_door_lock.ogg' - //[Lucifernix] - Do the doors use keys, combination locks, or electric pin codes, or a mix of all three? - var/uses_key_lock = FALSE - var/uses_combination_lock = FALSE - var/uses_pincode_lock = FALSE + var/is_locked = FALSE - var/combination_locked = FALSE - var/pincode_locked = FALSE - var/key_locked = FALSE +/obj/structure/vaultdoor/pincode + name = "vault door" + desc = "A heavy duty door that looks like it could withstand a lot of punishment." /obj/structure/vaultdoor/pincode/bank + name = "bank vault door" + desc = "A massive reinforced vault door protecting the bank's reserves." + lock_id = "bank_vault" /obj/structure/vaultdoor/New() ..() - if(uses_pincode_lock) - pincode = create_unique_pincode() - pincode_locked = TRUE - if(uses_combination_lock) - combination_locked = TRUE - if(uses_key_lock) - key_locked = TRUE - -/obj/structure/vaultdoor/pincode - uses_pincode_lock = TRUE - -/obj/structure/vaultdoor/combination - uses_combination_lock = TRUE - -/obj/structure/vaultdoor/key - uses_key_lock = TRUE - -/obj/structure/vaultdoor/pincode_key - uses_pincode_lock = TRUE - uses_key_lock = TRUE - -/obj/structure/vaultdoor/pincode_combination_key - uses_pincode_lock = TRUE - uses_combination_lock = TRUE - uses_key_lock = TRUE + pincode = create_unique_pincode() + is_locked = TRUE /obj/structure/vaultdoor/attack_hand(mob/user) . = ..() - var/mob/living/door_user = user if(is_broken) return - if(is_locked() || key_locked) - if(uses_pincode_lock) - ui_interact() - if(door_user.a_intent != INTENT_HARM) - to_chat(user, span_warning("[src] is locked!")) + + if(is_locked) + ui_interact(user) return if(closed && !door_moving) @@ -85,11 +59,12 @@ if(is_broken) return is_broken = TRUE + is_locked = FALSE icon_state = "[brokenicon]-1" set_density(FALSE) opacity = FALSE layer = OPEN_DOOR_LAYER - visible_message("<span class='warning' style='color:red; font-size:20px;'><b>[src] breaks!</b></span>") + visible_message("<span class='warning' style='color:red; font-size:20px;'><b>[src] breaks open!</b></span>") /obj/structure/vaultdoor/proc/open_door(mob/user) playsound(src, open_sound, 75, TRUE) @@ -101,7 +76,7 @@ layer = OPEN_DOOR_LAYER to_chat(user, span_notice("You open [src].")) closed = FALSE - door_moving = FALSE + door_moving = FALSE /obj/structure/vaultdoor/proc/close_door(mob/user) for(var/atom/movable/door_blocker in src.loc) @@ -113,83 +88,30 @@ if(do_after(user, 4 SECONDS)) icon_state = "[base_icon_state]-1" set_density(TRUE) + opacity = TRUE layer = ABOVE_ALL_MOB_LAYER to_chat(user, span_notice("You close [src].")) closed = TRUE - door_moving = FALSE - -/obj/structure/vaultdoor/proc/is_locked() - return combination_locked || pincode_locked + is_locked = TRUE + to_chat(user, span_notice("[src] automatically locks.")) + playsound(src, lock_sound, 50, TRUE) + door_moving = FALSE /obj/structure/vaultdoor/examine(mob/user) . = ..() - . += span_notice("Pincode lock or combination lock can be re-locked with alt-click!") . += span_notice("Door health: [door_health]/100.") - if(is_locked() || key_locked) + + if(is_locked) . += span_warning("[src] is locked.") - if(uses_pincode_lock) - . += span_notice("[src] requires a pin code to unlock.") - if(uses_combination_lock) - . += span_notice("[src] requires a combination to unlock.") - if(uses_key_lock) - . += span_notice("[src] requires a key to unlock.") + . += span_notice("[src] uses a digital keypad lock.") -/obj/structure/vaultdoor/click_alt(mob/user) - . = ..() - if(is_broken) - return - if(!is_locked() && closed) - lock_door(user) - -/obj/structure/vaultdoor/proc/lock_door(mob/user) - if(uses_combination_lock && !combination_locked) - combination_locked = TRUE - to_chat(user, span_notice("You lock [src] with a combination lock.")) - else if (uses_pincode_lock && !pincode_locked) - pincode_locked = TRUE - to_chat(user, span_notice("You lock [src] with a pincode lock.")) - else if (combination_locked || pincode_locked) - to_chat(user, span_warning("[src] is already locked!")) - -/obj/structure/vaultdoor/attackby(obj/item/used_item, mob/living/user, params) - if(is_broken) +/obj/structure/vaultdoor/ui_interact(mob/user, datum/tgui/ui) + if(is_broken || !is_locked) return - if(istype(used_item, /obj/item/vamp/keys)) - var/obj/item/vamp/keys/key = used_item - if(key.accesslocks) - for(var/i in key.accesslocks) - if(i == lock_id) - if(uses_key_lock) - if(key_locked) - if(closed) - playsound(src, lock_sound, 75, TRUE) - if(do_after(user, 3 SECONDS)) - to_chat(user, "[src] is now unlocked.") - key_locked = FALSE - else - to_chat(user, "[src] is open and cannot be locked or unlocked.") - return - else - if(closed) - playsound(src, lock_sound, 75, TRUE) - if(do_after(user, 3 SECONDS)) - playsound(src, lock_sound, 75, TRUE) - to_chat(user, "[src] is now locked with keys.") - key_locked = TRUE - else - to_chat(user, "[src] is open and cannot be locked or unlocked.") - return - else - to_chat(user, span_warning("[src] can't be unlocked with these keys!")) -/obj/structure/vaultdoor/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) - if(is_broken) - return - if(!pincode_locked) - return - else if(!ui) + if(!ui) ui = new(user, src, "VaultDoor") ui.open() @@ -202,15 +124,16 @@ . = ..() if(.) return + if(action == "submit_pincode") if(params["pincode"] == pincode) - to_chat(usr, span_notice("Access Granted.")) - pincode_locked = FALSE + to_chat(usr, span_notice("ACCESS GRANTED.")) + is_locked = FALSE + playsound(src, 'sound/machines/terminal/terminal_success.ogg', 50, TRUE) else - to_chat(usr, span_notice("Access Denied.")) + to_chat(usr, span_warning("ACCESS DENIED.")) + playsound(src, 'sound/machines/terminal/terminal_error.ogg', 50, TRUE) . = TRUE - update_icon() - /proc/find_door_pin(door_type) for(var/obj/structure/vaultdoor/vdoor in world) diff --git a/modular_darkpack/modules/vaults/icons/drill.dmi b/modular_darkpack/modules/vaults/icons/drill.dmi new file mode 100644 index 000000000000..43229aa33806 Binary files /dev/null and b/modular_darkpack/modules/vaults/icons/drill.dmi differ diff --git a/modular_darkpack/modules/vaults/icons/drill48x32.dmi b/modular_darkpack/modules/vaults/icons/drill48x32.dmi new file mode 100644 index 000000000000..023968666ea9 Binary files /dev/null and b/modular_darkpack/modules/vaults/icons/drill48x32.dmi differ diff --git a/modular_darkpack/modules/vaults/icons/drill_lefthand.dmi b/modular_darkpack/modules/vaults/icons/drill_lefthand.dmi new file mode 100644 index 000000000000..b37ad803b735 Binary files /dev/null and b/modular_darkpack/modules/vaults/icons/drill_lefthand.dmi differ diff --git a/modular_darkpack/modules/vaults/icons/drill_righthand.dmi b/modular_darkpack/modules/vaults/icons/drill_righthand.dmi new file mode 100644 index 000000000000..b37ad803b735 Binary files /dev/null and b/modular_darkpack/modules/vaults/icons/drill_righthand.dmi differ diff --git a/modular_darkpack/modules/vaults/icons/keypad.dmi b/modular_darkpack/modules/vaults/icons/keypad.dmi new file mode 100644 index 000000000000..78d2951e6686 Binary files /dev/null and b/modular_darkpack/modules/vaults/icons/keypad.dmi differ diff --git a/modular_darkpack/modules/vaults/icons/vault.dmi b/modular_darkpack/modules/vaults/icons/vault.dmi new file mode 100644 index 000000000000..ae36dfe45028 Binary files /dev/null and b/modular_darkpack/modules/vaults/icons/vault.dmi differ diff --git a/modular_darkpack/modules/deprecated/sounds/vault_door_closing.ogg b/modular_darkpack/modules/vaults/sounds/vault_door_closing.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/vault_door_closing.ogg rename to modular_darkpack/modules/vaults/sounds/vault_door_closing.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/vault_door_lock.ogg b/modular_darkpack/modules/vaults/sounds/vault_door_lock.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/vault_door_lock.ogg rename to modular_darkpack/modules/vaults/sounds/vault_door_lock.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/vault_door_opening.ogg b/modular_darkpack/modules/vaults/sounds/vault_door_opening.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/vault_door_opening.ogg rename to modular_darkpack/modules/vaults/sounds/vault_door_opening.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/vault_drilling.ogg b/modular_darkpack/modules/vaults/sounds/vault_drilling.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/vault_drilling.ogg rename to modular_darkpack/modules/vaults/sounds/vault_drilling.ogg diff --git a/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_endron_role.dm b/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_endron_role.dm new file mode 100644 index 000000000000..fbec2425c412 --- /dev/null +++ b/modular_darkpack/modules/vip_areas/code/bouncer_roles/bouncer_endron_role.dm @@ -0,0 +1,49 @@ +// DARKPACK TODO - all these endron clothes + +/datum/socialrole/bouncer/endron + bouncer_weapon_type = /obj/item/gun/ballistic/automatic/darkpack/mp5 + bouncer_backup_weapon_type = /obj/item/melee/baton/vamp + shoes = list(/obj/item/clothing/shoes/vampire/jackboots) + //uniforms = list(/obj/item/clothing/under/pentex/pentex_turtleneck) + pockets = list(/obj/item/vamp/keys/npc, /obj/item/stack/dollar/rand) + gloves = list(/obj/item/clothing/gloves/vampire/work) + suits = list(/obj/item/clothing/suit/vampire/vest) + glasses = list(/obj/item/clothing/glasses/vampire/sun) + hats = list(/obj/item/clothing/head/beret/black) + masks = list(/obj/item/clothing/mask/vampire/balaclava) + +/datum/socialrole/bouncer/endron/endron_lab + bouncer_weapon_type = /obj/item/gun/ballistic/automatic/darkpack/mp5 + bouncer_backup_weapon_type = /obj/item/melee/baton/vamp + shoes = list(/obj/item/clothing/shoes/vampire/jackboots) + //uniforms = list(/obj/item/clothing/under/pentex/pentex_janitor) + pockets = list(/obj/item/vamp/keys/npc, /obj/item/stack/dollar/rand) + gloves = list(/obj/item/clothing/gloves/vampire/latex) + suits = list(/obj/item/clothing/suit/vampire/vest) + glasses = list(/obj/item/clothing/glasses/vampire/sun) + hats = list(/obj/item/clothing/head/beret/black) + masks = list(/obj/item/clothing/mask/gas/explorer) + +/datum/socialrole/bouncer/endron/endron_lab_2 + bouncer_weapon_type = /obj/item/gun/ballistic/automatic/darkpack/mp5 + bouncer_backup_weapon_type = /obj/item/melee/baton/vamp + shoes = list(/obj/item/clothing/shoes/vampire/jackboots) + //uniforms = list(/obj/item/clothing/under/pentex/pentex_janitor) + pockets = list(/obj/item/vamp/keys/npc, /obj/item/stack/dollar/rand) + gloves = list(/obj/item/clothing/gloves/vampire/latex) + suits = list(/obj/item/clothing/suit/vampire/vest) + glasses = list(/obj/item/clothing/glasses/vampire/sun) + hats = list(/obj/item/clothing/head/beret/black) + masks = list(/obj/item/clothing/mask/gas/explorer) + +/datum/socialrole/bouncer/endron/endron_2 + bouncer_weapon_type = /obj/item/gun/ballistic/automatic/pistol/darkpack/deagle + bouncer_backup_weapon_type = /obj/item/melee/baton/vamp + shoes = list(/obj/item/clothing/shoes/vampire/jackboots) + //uniforms = list(/obj/item/clothing/under/pentex/pentex_suit) + pockets = list(/obj/item/vamp/keys/npc, /obj/item/stack/dollar/rand) + gloves = list(/obj/item/clothing/gloves/vampire/work) + suits = list(/obj/item/clothing/suit/vampire/vest) + glasses = list(/obj/item/clothing/glasses/night) + hats = list(/obj/item/clothing/head/vampire/pentex_beret) + masks = list(/obj/item/clothing/mask/gas/sechailer) diff --git a/modular_darkpack/modules/vip_areas/code/vip_barriers/__vip_barrier.dm b/modular_darkpack/modules/vip_areas/code/vip_barriers/__vip_barrier.dm index 218fd2375a8a..d43c01dce6b8 100644 --- a/modular_darkpack/modules/vip_areas/code/vip_barriers/__vip_barrier.dm +++ b/modular_darkpack/modules/vip_areas/code/vip_barriers/__vip_barrier.dm @@ -1,6 +1,3 @@ - - - /obj/effect/vip_barrier name = "Basic Check Point" desc = "Not a real checkpoint." @@ -33,7 +30,7 @@ /obj/effect/vip_barrier/Initialize(mapload) . = ..() - if(src.type == /obj/effect/vip_barrier) + if(mapload && src.type == /obj/effect/vip_barrier) CRASH("VIP Barrier created using default type, please use a child of this type in mapping.") //we do this in an initialize so mappers do not have to code as much @@ -43,9 +40,16 @@ //spessman purity means I have to register a signal with myself, pain RegisterSignal(src, COMSIG_BARRIER_NOTIFY_GUARD_BLOCKED, PROC_REF(playBlockSound)) update_icon() - else if(SSbouncer_barriers.initialized) + else if(mapload && SSbouncer_barriers.initialized) CRASH("A VIP barrier was created for vip_barrier_perms that were not loaded!") +/obj/effect/vip_barrier/Destroy() + if(linked_perm) + linked_perm.linked_barriers -= src + linked_perm = null + return ..() + + /obj/effect/vip_barrier/CanPass(atom/movable/mover, turf/target) . = ..() var/entry_allowed = TRUE @@ -116,7 +120,7 @@ return - if(!do_mob(user, bouncer, max(5 SECONDS, social_bypass_time - (user.st_get_stat(STAT_CHARISMA) * 2 SECONDS)))) + if(!do_after(user, max(5 SECONDS, social_bypass_time - (user.st_get_stat(STAT_CHARISMA) * 2 SECONDS)), bouncer)) return @@ -139,7 +143,7 @@ /obj/effect/vip_barrier/proc/identify_cop(mob/living/carbon/human/user, used_badge = FALSE) - if(mean_to_cops && (used_badge || (user.wear_id && istype(user.wear_id,/obj/item/card/id/police)))) + if(mean_to_cops && (used_badge || (user.wear_id && istype(user.wear_id,/obj/item/card/police)))) return TRUE return FALSE @@ -150,6 +154,7 @@ update_icon() /obj/effect/vip_barrier/update_icon() + .=..() if(always_invisible) alpha = 0 return diff --git a/modular_darkpack/modules/vip_areas/code/vip_barriers/elysium_stripclub_barrier.dm b/modular_darkpack/modules/vip_areas/code/vip_barriers/elysium_stripclub_barrier.dm index 2d0b23b9e737..09e927811c1a 100644 --- a/modular_darkpack/modules/vip_areas/code/vip_barriers/elysium_stripclub_barrier.dm +++ b/modular_darkpack/modules/vip_areas/code/vip_barriers/elysium_stripclub_barrier.dm @@ -6,6 +6,6 @@ /obj/effect/vip_barrier/stripclub/check_entry_permission_custom(mob/living/carbon/human/entering_mob) - if(!ishumanbasic(entering_mob) || (entering_mob.mind && entering_mob.mind.assigned_role == "Stripper")) + if(issupernatural(entering_mob) || (entering_mob.mind && entering_mob.mind.assigned_role == "Stripper")) return TRUE return FALSE diff --git a/modular_darkpack/modules/vip_areas/code/vip_barriers/endron_barrier.dm b/modular_darkpack/modules/vip_areas/code/vip_barriers/endron_barrier.dm new file mode 100644 index 000000000000..dcce298a2bca --- /dev/null +++ b/modular_darkpack/modules/vip_areas/code/vip_barriers/endron_barrier.dm @@ -0,0 +1,22 @@ +/obj/effect/vip_barrier/endron + name = "\improper " + MAIN_EVIL_COMPANY + " checkpoint" + desc = "There's an employees only sign here." + protected_zone_id = "endron" + social_roll_difficulty = 7 + +/obj/effect/vip_barrier/endron/endron_2 + protected_zone_id = "endron_2" + +/obj/effect/vip_barrier/endron/endron_backdoor + protected_zone_id = "endron_backdoor" + +/obj/effect/vip_barrier/endron/endron_lab + protected_zone_id = "endron_lab" + +/obj/effect/vip_barrier/endron/endron_lab_2 + protected_zone_id = "endron_lab_2" + +/obj/effect/vip_barrier/endron/check_entry_permission_custom(mob/living/carbon/human/entering_mob) + if(entering_mob.mind && entering_mob.mind.assigned_role && (entering_mob.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_PENTEX)) + return TRUE + return FALSE diff --git a/modular_darkpack/modules/vip_areas/code/vip_barriers/giovanni_barrier.dm b/modular_darkpack/modules/vip_areas/code/vip_barriers/giovanni_barrier.dm index 902c0d32df45..def5c4521bed 100644 --- a/modular_darkpack/modules/vip_areas/code/vip_barriers/giovanni_barrier.dm +++ b/modular_darkpack/modules/vip_areas/code/vip_barriers/giovanni_barrier.dm @@ -5,6 +5,6 @@ social_roll_difficulty = 7 /obj/effect/vip_barrier/giovanni/check_entry_permission_custom(mob/living/carbon/human/entering_mob) - if(entering_mob.mind && entering_mob.mind.assigned_role && GLOB.giovanni_positions.Find(entering_mob.mind.assigned_role)) + if(entering_mob.mind && entering_mob.mind.assigned_role && (entering_mob.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_GIOVANNI)) return TRUE return FALSE diff --git a/modular_darkpack/modules/vip_areas/icons/barrier.dmi b/modular_darkpack/modules/vip_areas/icons/barrier.dmi index bde8598c3c45..5b725ad6a0a8 100644 Binary files a/modular_darkpack/modules/vip_areas/icons/barrier.dmi and b/modular_darkpack/modules/vip_areas/icons/barrier.dmi differ diff --git a/modular_darkpack/modules/vitae/code/blood_pack.dm b/modular_darkpack/modules/vitae/code/blood_pack.dm index 2b6813cba3d4..f82f58723bba 100644 --- a/modular_darkpack/modules/vitae/code/blood_pack.dm +++ b/modular_darkpack/modules/vitae/code/blood_pack.dm @@ -12,8 +12,10 @@ . = ..() update_appearance() -/obj/item/reagent_containers/blood/update_appearance(updates) +/obj/item/reagent_containers/blood/update_icon_state() . = ..() + if(!reagents) + return var/percent = round((reagents.total_volume / volume) * 100) switch(percent) if(76 to 100) diff --git a/modular_darkpack/modules/vitae/code/embracing.dm b/modular_darkpack/modules/vitae/code/embracing.dm index 0731612f803b..742487125462 100644 --- a/modular_darkpack/modules/vitae/code/embracing.dm +++ b/modular_darkpack/modules/vitae/code/embracing.dm @@ -19,16 +19,9 @@ childe.grab_ghost(force = TRUE) to_chat(childe, span_cult("You rise with a start! You feel a tremendous pulse echoing in your ears. As you focus your mind on it, you discover it to be the last few throbs of your heart beating until it slows to a halt. The warmth from your skin slowly fades until it settles to the ambient temperature around you...- and you are very hungry.")) - childe.set_species(/datum/species/human/kindred) - childe.set_clan(clan, FALSE) - childe.generation = initial(generation) + 1 - if(prob(5)) - childe.set_clan(/datum/vampire_clan/caitiff) + childe.make_kindred_from_sire(src) - childe.skin_tone = get_vamp_skin_color(childe.skin_tone) - childe.set_body_sprite() - - /* DARKPACK TODO: Commenting this out until preferences are properly finished. + /* // DARKPACK TODO - Commenting this out until preferences are properly finished. //Gives the Childe the src's first three Disciplines var/list/disciplines_to_give = list() var/discipline_number = 0 @@ -44,7 +37,7 @@ //addtimer(CALLBACK(childe, PROC_REF(embrace_persistence_confirmation)), 1 SECONDS) -/* DARKPACK TODO: GAROU +/* // DARKPACK TODO - GAROU /mob/living/carbon/human/proc/attempt_abomination_embrace(mob/living/carbon/human/childe, second_party_embrace) if(!(childe.auspice?.level)) //here be Abominations return @@ -74,7 +67,7 @@ return */ -/* DARKPACK TODO: PREFERENCES +/* // DARKPACK TODO - PREFERENCES /mob/living/carbon/human/proc/embrace_persistence_confirmation() var/response_v = tgui_input_list(src, "Do you wish to keep being a vampire on your save slot? (Yes will be a permanent choice and you can't go back!)", "Embrace", list("Yes", "No"), "No") //Verify if they accepted to save being a vampire diff --git a/modular_darkpack/modules/vitae/code/ghouling.dm b/modular_darkpack/modules/vitae/code/ghouling.dm index 164a1f6885e8..60db83b701f4 100644 --- a/modular_darkpack/modules/vitae/code/ghouling.dm +++ b/modular_darkpack/modules/vitae/code/ghouling.dm @@ -1,4 +1,4 @@ -/* DARKPACK TODO: PREFERENCES +/* // DARKPACK TODO - PREFERENCES /mob/living/carbon/human/proc/prompt_permenant_ghouling() var/response_g = tgui_input_list(src, "Do you wish to keep being a ghoul on your save slot?(Yes will be a permanent choice and you can't go back)", "Ghouling", list("Yes", "No"), "No") if(response_g == "Yes") @@ -16,7 +16,7 @@ */ /mob/living/carbon/human/proc/ghoulificate(mob/living/carbon/human/owner) - set_species(/datum/species/human/ghoul) + make_ghoul(owner) if(!mind) return send_ghoul_vitae_consumption_message(owner) diff --git a/modular_darkpack/modules/vitae/code/vitae.dm b/modular_darkpack/modules/vitae/code/vitae.dm index b0840ca8a59b..d3b1416c92df 100644 --- a/modular_darkpack/modules/vitae/code/vitae.dm +++ b/modular_darkpack/modules/vitae/code/vitae.dm @@ -14,12 +14,17 @@ var/datum/weakref/embracer_weakref = data["donor"] var/mob/living/carbon/human/embracer = embracer_weakref?.resolve() - //if(isgarou(victim)) //Are we a garou species? DARKPACK TODO: GAROU + //if(isgarou(victim)) //Are we a garou species? DARKPACK TODO - GAROU // attempt_abomination_embrace(childe) // victim.rollfrenzy() // return - if(ishumanbasic(victim) || isghoul(victim)) + if(methods & INGEST) + if(has_vitae(victim)) + //100u of vitae = 1bp, keeping consistent w/ give vitae action. 200u of normal blood = 1 bp + victim.adjust_blood_pool(reac_volume * 0.01) + + if(ismundane(victim) || isghoul(victim)) if(victim.stat == DEAD) if(!embracer) return @@ -38,6 +43,6 @@ /datum/reagent/blood/vitae/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - . = ..() if(isghoul(affected_mob) || iskindred(affected_mob)) - affected_mob.bloodpool = min(affected_mob.maxbloodpool, affected_mob.bloodpool + (100 / seconds_per_tick)) + return + return ..() diff --git a/modular_darkpack/modules/walls/code/decals.dm b/modular_darkpack/modules/walls/code/decals.dm deleted file mode 100644 index d93e18703ce3..000000000000 --- a/modular_darkpack/modules/walls/code/decals.dm +++ /dev/null @@ -1,23 +0,0 @@ -/obj/effect/decal/coastline - name = "water" - icon = 'modular_darkpack/modules/deprecated/icons/tiles.dmi' - icon_state = "coastline" - -/obj/effect/decal/coastline/corner - icon_state = "coastline_corner" - -/obj/effect/decal/shadow - name = "shadow" - icon = 'modular_darkpack/modules/deprecated/icons/tiles.dmi' - icon_state = "shadow" - -/obj/effect/decal/shadow/Initialize(mapload) - . = ..() - if(istype(loc, /turf/open/openspace)) - forceMove(get_step(src, NORTH)) - pixel_y = -32 - -/obj/effect/decal/support - name = "support" - icon = 'modular_darkpack/modules/deprecated/icons/tiles.dmi' - icon_state = "support" diff --git a/modular_darkpack/modules/walls/code/floors.dm b/modular_darkpack/modules/walls/code/floors.dm index ad072b609b5d..f6bf7d6f9ec8 100644 --- a/modular_darkpack/modules/walls/code/floors.dm +++ b/modular_darkpack/modules/walls/code/floors.dm @@ -1,3 +1,14 @@ +/turf/open/floor/plating/concrete + name = "concrete" + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "concrete1" + footstep = FOOTSTEP_SIDEWALK + barefootstep = FOOTSTEP_SIDEWALK + +/turf/open/floor/plating/concrete/Initialize(mapload) + . = ..() + icon_state = "concrete[rand(1, 4)]" + /turf/open/floor/plating/asphalt name = "asphalt" icon = 'modular_darkpack/modules/walls/icons/floors.dmi' @@ -7,27 +18,19 @@ /turf/open/floor/plating/asphalt/Initialize(mapload) . = ..() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - //initial_gas_mix = WINTER_DEFAULT_ATMOS - new /obj/effect/decal/snow_overlay(src) - footstep = FOOTSTEP_SNOW - barefootstep = FOOTSTEP_SNOW - heavyfootstep = FOOTSTEP_SNOW + var/area/my_area = loc + if(my_area.outdoors) + if(check_holidays(FESTIVE_SEASON)) + //initial_gas_mix = WINTER_DEFAULT_ATMOS + new /obj/effect/decal/snow_overlay(src) + footstep = FOOTSTEP_SNOW + barefootstep = FOOTSTEP_SNOW + heavyfootstep = FOOTSTEP_SNOW if(prob(50)) icon_state = "asphalt[rand(1, 3)]" - update_icon() if(prob(25)) new /obj/effect/turf_decal/asphalt(src) -/turf/open/floor/plating/asphalt/try_replace_tile(obj/item/stack/tile/T, mob/user, params) - return - -/turf/open/floor/plating/asphalt/ex_act(severity, target) - contents_explosion(severity, target) - /turf/open/floor/plating/sidewalkalt name = "sidewalk" icon = 'modular_darkpack/modules/walls/icons/floors.dmi' @@ -37,15 +40,14 @@ /turf/open/floor/plating/sidewalkalt/Initialize(mapload) . = ..() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - //initial_gas_mix = WINTER_DEFAULT_ATMOS - icon_state = "snow[rand(1, 14)]" - footstep = FOOTSTEP_SNOW - barefootstep = FOOTSTEP_SNOW - heavyfootstep = FOOTSTEP_SNOW + var/area/my_area = loc + if(my_area.outdoors) + if(check_holidays(FESTIVE_SEASON)) + //initial_gas_mix = WINTER_DEFAULT_ATMOS + icon_state = "snow[rand(1, 14)]" + footstep = FOOTSTEP_SNOW + barefootstep = FOOTSTEP_SNOW + heavyfootstep = FOOTSTEP_SNOW /turf/open/floor/plating/sidewalk name = "sidewalk" @@ -59,15 +61,14 @@ /turf/open/floor/plating/sidewalk/Initialize(mapload) . = ..() icon_state = "[base_icon_state][rand(1, number_of_variations)]" - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - //initial_gas_mix = WINTER_DEFAULT_ATMOS - icon_state = "snow[rand(1, 14)]" - footstep = FOOTSTEP_SNOW - barefootstep = FOOTSTEP_SNOW - heavyfootstep = FOOTSTEP_SNOW + var/area/my_area = loc + if(my_area.outdoors) + if(check_holidays(FESTIVE_SEASON)) + //initial_gas_mix = WINTER_DEFAULT_ATMOS + icon_state = "snow[rand(1, 14)]" + footstep = FOOTSTEP_SNOW + barefootstep = FOOTSTEP_SNOW + heavyfootstep = FOOTSTEP_SNOW /turf/open/floor/plating/sidewalk/poor icon_state = "sidewalk_poor1" @@ -92,15 +93,14 @@ /turf/open/floor/plating/roofwalk/Initialize(mapload) . = ..() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - //initial_gas_mix = WINTER_DEFAULT_ATMOS - icon_state = "snow[rand(1, 14)]" - footstep = FOOTSTEP_SNOW - barefootstep = FOOTSTEP_SNOW - heavyfootstep = FOOTSTEP_SNOW + var/area/my_area = loc + if(my_area.outdoors) + if(check_holidays(FESTIVE_SEASON)) + //initial_gas_mix = WINTER_DEFAULT_ATMOS + icon_state = "snow[rand(1, 14)]" + footstep = FOOTSTEP_SNOW + barefootstep = FOOTSTEP_SNOW + heavyfootstep = FOOTSTEP_SNOW //Airless version of this because they are used as a z-level 4 roof on a z-level 3 building, and since they aren't meant to be reached... /turf/open/floor/plating/roofwalk/no_air @@ -111,19 +111,6 @@ //OTHER TURFS -/turf/open/floor/plating/parquetry - name = "parquetry" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "parquet" - footstep = FOOTSTEP_PARKET - barefootstep = FOOTSTEP_PARKET - -/turf/open/floor/plating/parquetry/old - icon_state = "parquet-old" - -/turf/open/floor/plating/parquetry/rich - icon_state = "parquet-rich" - /turf/open/floor/plating/granite name = "granite" icon = 'modular_darkpack/modules/walls/icons/floors.dmi' @@ -134,159 +121,6 @@ /turf/open/floor/plating/granite/black icon_state = "granite-black" -/turf/open/floor/plating/concrete - name = "concrete" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "concrete1" - footstep = FOOTSTEP_SIDEWALK - barefootstep = FOOTSTEP_SIDEWALK - -/turf/open/floor/plating/concrete/Initialize(mapload) - . = ..() - icon_state = "concrete[rand(1, 4)]" - -/turf/open/misc/grass/vamp - name = "grass" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "grass1" - footstep = FOOTSTEP_TRAVA - barefootstep = FOOTSTEP_TRAVA - baseturfs = /turf/open/misc/dirt/vamp - initial_gas_mix = OPENTURF_DEFAULT_ATMOS - planetary_atmos = TRUE - - -/* -/turf/open/misc/grass/vamp/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/shovel/vamp)) - var/obj/structure/bury_pit/P = locate() in src - if(P) - if(!P.burying) - P.burying = TRUE - user.visible_message(span_warning("[user] starts to dig [src]"), span_warning("You start to dig [src].")) - if(do_mob(user, src, 10 SECONDS)) - P.burying = FALSE - if(P.icon_state == "pit0") - for(var/mob/living/L in src) - L.forceMove(P) - P.icon_state = "pit1" - user.visible_message(span_warning("[user] digs a hole in [src]."), span_warning("You dig a hole in [src].")) - else - for(var/mob/living/L in P) - L.forceMove(src) - P.icon_state = "pit0" - user.visible_message(span_warning("[user] digs a hole in [src]."), span_warning("You dig a hole in [src].")) - else - P.burying = FALSE - else - user.visible_message(span_warning("[user] starts to dig [src]"), span_warning("You start to dig [src].")) - if(do_mob(user, src, 10 SECONDS)) - if(!locate(/obj/structure/bury_pit) in src) - user.visible_message(span_warning("[user] digs a hole in [src]."), span_warning("You dig a hole in [src].")) - new /obj/structure/bury_pit(src) -*/ - -/turf/open/misc/grass/vamp/Initialize(mapload) - . = ..() - icon_state = "grass[rand(1, 3)]" - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - //initial_gas_mix = WINTER_DEFAULT_ATMOS - icon_state = "snow[rand(1, 14)]" - footstep = FOOTSTEP_SNOW - barefootstep = FOOTSTEP_SNOW - heavyfootstep = FOOTSTEP_SNOW - -/turf/open/floor/plating/vampcarpet - name = "carpet" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "carpet_black" - footstep = FOOTSTEP_PARKET - barefootstep = FOOTSTEP_PARKET - -/turf/open/misc/dirt/vamp - name = "dirt" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "dirt" - footstep = FOOTSTEP_ASPHALT - barefootstep = FOOTSTEP_ASPHALT - baseturfs = /turf/open/misc/dirt/vamp - initial_gas_mix = OPENTURF_DEFAULT_ATMOS - planetary_atmos = TRUE - -/* -/turf/open/misc/dirt/vamp/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/shovel/vamp)) - var/obj/structure/bury_pit/P = locate() in src - if(P) - if(!P.burying) - P.burying = TRUE - user.visible_message(span_warning("[user] starts to dig [src]"), span_warning("You start to dig [src].")) - if(do_mob(user, src, 10 SECONDS)) - P.burying = FALSE - if(P.icon_state == "pit0") - for(var/mob/living/L in src) - L.forceMove(P) - P.icon_state = "pit1" - user.visible_message(span_warning("[user] digs a hole in [src]."), span_warning("You dig a hole in [src].")) - else - for(var/mob/living/L in P) - L.forceMove(src) - P.icon_state = "pit0" - user.visible_message(span_warning("[user] digs a hole in [src]."), span_warning("You dig a hole in [src].")) - else - P.burying = FALSE - else - user.visible_message(span_warning("[user] starts to dig [src]"), span_warning("You start to dig [src].")) - if(do_mob(user, src, 10 SECONDS)) - if(!locate(/obj/structure/bury_pit) in src) - user.visible_message(span_warning("[user] digs a hole in [src]."), span_warning("You dig a hole in [src].")) - new /obj/structure/bury_pit(src) -*/ - -/turf/open/misc/dirt/vamp/Initialize(mapload) - . = ..() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - //initial_gas_mix = WINTER_DEFAULT_ATMOS - icon_state = "snow[rand(1, 14)]" - footstep = FOOTSTEP_SNOW - barefootstep = FOOTSTEP_SNOW - heavyfootstep = FOOTSTEP_SNOW - -/turf/open/misc/dirt/vamp/rails - name = "rails" - icon_state = "dirt_rails" - -/turf/open/misc/dirt/vamp/rails/Initialize(mapload) - . = ..() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - //initial_gas_mix = WINTER_DEFAULT_ATMOS - icon_state = "snow_rails" - footstep = FOOTSTEP_SNOW - barefootstep = FOOTSTEP_SNOW - heavyfootstep = FOOTSTEP_SNOW - -/turf/open/floor/plating/vampplating - name = "plating" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "plating" - footstep = FOOTSTEP_SIDEWALK - barefootstep = FOOTSTEP_SIDEWALK - -/turf/open/floor/plating/vampplating/mono - icon_state = "plating-mono" - -/turf/open/floor/plating/vampplating/stone - icon_state = "plating-stone" - /turf/open/floor/plating/rough name = "rough floor" icon = 'modular_darkpack/modules/walls/icons/floors.dmi' @@ -312,79 +146,65 @@ icon_state = "stone1" /turf/open/floor/plating/stone/Initialize(mapload) - .=..() + . = ..() icon_state = "cave[rand(1, 7)]" -/turf/open/floor/plating/toilet - name = "plating" +/turf/open/floor/plating/grate + name = "grate" icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "toilet1" - footstep = FOOTSTEP_PARKET - barefootstep = FOOTSTEP_PARKET + icon_state = "lattice_new" + footstep = FOOTSTEP_CATWALK -/turf/open/floor/plating/toilet/Initialize(mapload) - . = ..() - icon_state = "toilet[rand(1, 9)]" +/turf/open/floor/plating/grate/dirty + icon_state = "lattice_new_dirt" -/turf/open/floor/plating/circled - name = "fancy plating" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "circle1" - footstep = FOOTSTEP_PARKET - barefootstep = FOOTSTEP_PARKET +/turf/open/misc/grass/random + WHEN_MAP(icon = 'modular_darkpack/modules/walls/icons/floors.dmi') + WHEN_MAP(icon_state = "grass_autodec_all") + var/autodecor = /obj/effect/spawner/random/flora/all -/turf/open/floor/plating/circled/Initialize(mapload) - . = ..() - icon_state = "circle[rand(1, 8)]" +/turf/open/misc/grass/random/grass + WHEN_MAP(icon_state = "grass_autodec_grass") + autodecor = /obj/effect/spawner/random/flora/grass -/turf/open/floor/plating/church - name = "fancy plating" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "church1" - footstep = FOOTSTEP_PARKET - barefootstep = FOOTSTEP_PARKET +/turf/open/misc/grass/random/bushes + WHEN_MAP(icon_state = "grass_autodec_bushes") + autodecor = /obj/effect/spawner/random/flora/bushes -/turf/open/floor/plating/church/Initialize(mapload) - . = ..() - icon_state = "church[rand(1, 4)]" +/turf/open/misc/grass/random/rocks + WHEN_MAP(icon_state = "grass_autodec_rocks") + autodecor = /obj/effect/spawner/random/flora/rocks -/turf/open/floor/plating/saint - name = "fancy plating" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "saint1" - footstep = FOOTSTEP_PARKET - barefootstep = FOOTSTEP_PARKET +/turf/open/misc/grass/random/Initialize(mapload) + . = ..() + if(prob(33)) + new autodecor(src) -/turf/open/floor/plating/saint/Initialize(mapload) +/turf/open/misc/dirt/Initialize(mapload) . = ..() - icon_state = "saint[rand(1, 2)]" + var/area/my_area = loc + if(my_area.outdoors) + if(check_holidays(FESTIVE_SEASON)) + //initial_gas_mix = WINTER_DEFAULT_ATMOS + icon_state = "snow[rand(1, 14)]" + footstep = FOOTSTEP_SNOW + barefootstep = FOOTSTEP_SNOW + heavyfootstep = FOOTSTEP_SNOW -/turf/open/floor/plating/vampwood - name = "wood" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "bwood" - footstep = FOOTSTEP_PARKET - barefootstep = FOOTSTEP_PARKET +/turf/open/misc/dirt/rails + name = "rails" + icon_state = "dirt_rails" -/turf/open/floor/plating/vampwood/Initialize(mapload) +/turf/open/misc/dirt/rails/Initialize(mapload) . = ..() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - //initial_gas_mix = WINTER_DEFAULT_ATMOS - icon_state = "snow[rand(1, 14)]" - footstep = FOOTSTEP_SNOW - barefootstep = FOOTSTEP_SNOW - heavyfootstep = FOOTSTEP_SNOW - -// See about porting the apoc sprite for this -/turf/open/floor/plating/woodrough - name = "wood" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "bwood" - footstep = FOOTSTEP_PARKET - barefootstep = FOOTSTEP_PARKET + var/area/my_area = loc + if(my_area.outdoors) + if(check_holidays(FESTIVE_SEASON)) + //initial_gas_mix = WINTER_DEFAULT_ATMOS + icon_state = "snow_rails" + footstep = FOOTSTEP_SNOW + barefootstep = FOOTSTEP_SNOW + heavyfootstep = FOOTSTEP_SNOW /turf/open/misc/beach/vamp name = "sand" @@ -396,201 +216,19 @@ initial_gas_mix = OPENTURF_DEFAULT_ATMOS planetary_atmos = TRUE -/* -/turf/open/misc/beach/vamp/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/shovel/vamp)) - var/obj/structure/bury_pit/P = locate() in src - if(P) - if(!P.burying) - P.burying = TRUE - user.visible_message(span_warning("[user] starts to dig [src]"), span_warning("You start to dig [src].")) - if(do_mob(user, src, 10 SECONDS)) - P.burying = FALSE - if(P.icon_state == "pit0") - for(var/mob/living/L in src) - L.forceMove(P) - P.icon_state = "pit1" - user.visible_message(span_warning("[user] digs a hole in [src]."), span_warning("You dig a hole in [src].")) - else - for(var/mob/living/L in P) - L.forceMove(src) - P.icon_state = "pit0" - user.visible_message(span_warning("[user] digs a hole in [src]."), span_warning("You dig a hole in [src].")) - else - P.burying = FALSE - else - user.visible_message(span_warning("[user] starts to dig [src]"), span_warning("You start to dig [src].")) - if(do_mob(user, src, 10 SECONDS)) - if(!locate(/obj/structure/bury_pit) in src) - user.visible_message(span_warning("[user] digs a hole in [src]."), span_warning("You dig a hole in [src].")) - new /obj/structure/bury_pit(src) -*/ - /turf/open/misc/beach/vamp/Initialize(mapload) . = ..() icon_state = "sand[rand(1, 4)]" - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "snow[rand(1, 14)]" - -/turf/open/water/beach/vamp - name = "water" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "ocean" - baseturfs = /turf/open/water/beach/vamp - -/turf/open/water/beach/vamp/deep - name = "deep water" - desc = "Don't forget your life jacket." - immerse_overlay = "immerse_deep" - baseturfs = /turf/open/water/beach/vamp/deep - is_swimming_tile = TRUE - -//Make a pr to TG eventually adding acid from shiptest mabye. -/turf/open/water/acid/vamp - name = "goop" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "acid" - baseturfs = /turf/open/water/acid/vamp - light_color = "#1b7c4c" - light_range = 1 - light_power = 0.5 - -/turf/open/water/acid/vamp/Entered(atom/movable/AM) - if(acid_burn(AM)) - START_PROCESSING(SSobj, src) - -/turf/open/water/acid/vamp/proc/acid_burn(mob/living/L) - if(isliving(L)) - if(L.movement_type & FLYING) - return - L.apply_damage(10, AGGRAVATED) - L.apply_damage(30, TOX) - to_chat(L, span_warning("Your flesh burns!")) - -/turf/open/water/vamp_sewer - name = "sewage" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "shit" - -/* -/turf/open/water/vamp_sewer/Initialize(mapload) - . = ..() - if(prob(50)) - new /obj/effect/realistic_fog(src) -*/ - -/turf/open/water/vamp_sewer/border - icon_state = "shit_border" - -/turf/open/floor/plating/vampcanal - name = "plating" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "canal1" - footstep = FOOTSTEP_FLOOR - -// TODO: [Rebase] - Port https://github.com/ApocryphaXIII/ApocryphaXIII/pull/52 -/* -/turf/open/floor/plating/vampcanal/Enter(atom/movable/mover, atom/oldloc) - . = ..() - if(istype(mover, /mob/living/carbon/human)) - if(prob(10)) - new /mob/living/basic/mouse/rat/vampire(oldloc) -*/ - -/turf/open/floor/plating/vampcanal/Initialize(mapload) - . = ..() - icon_state = "canal[rand(1, 3)]" - -/turf/open/floor/plating/vampcanalplating - name = "plating" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "canal_plating1" - footstep = FOOTSTEP_PARKET - barefootstep = FOOTSTEP_PARKET - -// TODO: [Rebase] - Port https://github.com/ApocryphaXIII/ApocryphaXIII/pull/52 -/* -/turf/open/floor/plating/vampcanalplating/Enter(atom/movable/mover, atom/oldloc) - . = ..() - if(istype(mover, /mob/living/carbon/human)) - if(prob(10)) - new /mob/living/basic/mouse/rat/vampire(oldloc) -*/ - -/turf/open/floor/plating/vampcanalplating/Initialize(mapload) - . = ..() - icon_state = "canal_plating[rand(1, 4)]" + var/area/my_area = loc + if(my_area.outdoors) + if(check_holidays(FESTIVE_SEASON)) + icon_state = "snow[rand(1, 14)]" + footstep = FOOTSTEP_SNOW + barefootstep = FOOTSTEP_SNOW + heavyfootstep = FOOTSTEP_SNOW /turf/closed/indestructible/elevatorshaft name = "elevator shaft" desc = "Floors, floors, floors..." icon = 'modular_darkpack/modules/walls/icons/floors.dmi' icon_state = "black" - -/turf/open/floor/plating/bacotell - name = "plating" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "bacotell" - footstep = FOOTSTEP_SIDEWALK - barefootstep = FOOTSTEP_SIDEWALK - -/turf/open/floor/plating/gummaguts - name = "plating" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "gummaguts" - footstep = FOOTSTEP_SIDEWALK - barefootstep = FOOTSTEP_SIDEWALK - -//Code mostly taken from /obj/crystal_mass -/turf/open/water/bloodwave - gender = PLURAL - name = "blood" - icon = 'modular_darkpack/modules/walls/icons/floors.dmi' - icon_state = "blood" - baseturfs = /turf/open/water/bloodwave - immerse_overlay = "immerse_deep" - is_swimming_tile = TRUE - ///All dirs we can expand to - var/list/available_dirs = list(NORTH,SOUTH,EAST,WEST,DOWN) - ///Cooldown on the expansion process - COOLDOWN_DECLARE(wave_cooldown) - -/turf/open/water/bloodwave/Initialize(mapload, dir_to_remove) - . = ..() - set_light(1, 0.5, COLOR_MAROON) - if(mapload) - return - START_PROCESSING(SSsupermatter_cascade, src) - available_dirs -= dir_to_remove - -/turf/open/water/bloodwave/proc/start_flood() - SSsupermatter_cascade.can_fire = TRUE - SSsupermatter_cascade.cascade_initiated = TRUE - -/turf/open/water/bloodwave/process() - - if(!COOLDOWN_FINISHED(src, wave_cooldown)) - return - - if(!available_dirs || available_dirs.len <= 0) - return PROCESS_KILL - - COOLDOWN_START(src, wave_cooldown, rand(0, 2 SECONDS)) - - var/picked_dir = pick_n_take(available_dirs) - var/turf/next_turf = get_step_multiz(src, picked_dir) - - if(!next_turf || locate(/turf/open/water/bloodwave) in next_turf) - return - - for(var/atom/movable/checked_atom as anything in next_turf) - if(isliving(checked_atom)) - var/mob/living/checked_mob = checked_atom - checked_mob.death() - //else if(isitem(checked_atom)) - // qdel(checked_atom) - - new /turf/open/water/bloodwave(next_turf, get_dir(next_turf, src)) diff --git a/modular_darkpack/modules/walls/code/floors/carpets.dm b/modular_darkpack/modules/walls/code/floors/carpets.dm new file mode 100644 index 000000000000..6572126f49f6 --- /dev/null +++ b/modular_darkpack/modules/walls/code/floors/carpets.dm @@ -0,0 +1,84 @@ +/turf/open/floor/carpet/darkpack + icon = 'icons/obj/smooth_structures/darkpack/floor/carpet/redgoldcarpet.dmi' + icon_state = "redgoldcarpet-255" + base_icon_state = "redgoldcarpet" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET + canSmoothWith = SMOOTH_GROUP_CARPET + floor_tile = null + +// Shitty old carpet with no smoothing. +/turf/open/floor/carpet/darkpack/old + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "carpet_black" + smoothing_flags = NONE + +/turf/open/floor/carpet/darkpack/redsilver + icon = 'icons/obj/smooth_structures/darkpack/floor/carpet/redsilvercarpet.dmi' + icon_state = "redsilvercarpet-255" + base_icon_state = "redsilvercarpet" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_RED + canSmoothWith = SMOOTH_GROUP_CARPET_RED + +/turf/open/floor/carpet/darkpack/bluegold + icon = 'icons/obj/smooth_structures/darkpack/floor/carpet/bluegoldcarpet.dmi' + icon_state = "bluegoldcarpet-255" + base_icon_state = "bluegoldcarpet" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_BLUE + canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_BLUE + +/turf/open/floor/carpet/darkpack/bluesilver + icon = 'icons/obj/smooth_structures/darkpack/floor/carpet/bluesilvercarpet.dmi' + icon_state = "bluesilvercarpet-255" + base_icon_state = "bluesilvercarpet" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_BLUE + canSmoothWith = SMOOTH_GROUP_CARPET_BLUE + +/turf/open/floor/carpet/darkpack/cyan + icon = 'icons/obj/smooth_structures/darkpack/floor/carpet/cyancarpet.dmi' + icon_state = "cyancarpet-255" + base_icon_state = "cyancarpet" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_CYAN + canSmoothWith = SMOOTH_GROUP_CARPET_CYAN + +/turf/open/floor/carpet/darkpack/blackgold + icon = 'icons/obj/smooth_structures/darkpack/floor/carpet/blackgoldcarpet.dmi' + icon_state = "blackgoldcarpet-255" + base_icon_state = "blackgoldcarpet" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_BLACK + canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_BLACK + +/turf/open/floor/carpet/darkpack/blacksilver + icon = 'icons/obj/smooth_structures/darkpack/floor/carpet/blacksilvercarpet.dmi' + icon_state = "blacksilvercarpet-255" + base_icon_state = "blacksilvercarpet" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_BLACK + canSmoothWith = SMOOTH_GROUP_CARPET_BLACK + +/turf/open/floor/carpet/darkpack/purplegold + icon = 'icons/obj/smooth_structures/darkpack/floor/carpet/purplegoldcarpet.dmi' + icon_state = "purplegoldcarpet-255" + base_icon_state = "purplegoldcarpet" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_PURPLE + canSmoothWith = SMOOTH_GROUP_CARPET_PURPLE + +/turf/open/floor/carpet/darkpack/greengold + icon = 'icons/obj/smooth_structures/darkpack/floor/carpet/greengoldcarpet.dmi' + icon_state = "greengoldcarpet-255" + base_icon_state = "greengoldcarpet" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_GREEN + canSmoothWith = SMOOTH_GROUP_CARPET_GREEN + +/turf/open/floor/carpet/darkpack/orangesilver + icon = 'icons/obj/smooth_structures/darkpack/floor/carpet/orangesilvercarpet.dmi' + icon_state = "orangesilvercarpet-255" + base_icon_state = "orangesilvercarpet" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ORANGE + canSmoothWith = SMOOTH_GROUP_CARPET_ORANGE + +/turf/open/floor/carpet/darkpack/hotel + icon = 'icons/obj/smooth_structures/darkpack/floor/carpet/orangehotelcarpet.dmi' + icon_state = "orangehotelcarpet-255" + base_icon_state = "orangehotelcarpet" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_DONK + canSmoothWith = SMOOTH_GROUP_CARPET_DONK diff --git a/modular_darkpack/modules/walls/code/floors/tiles.dm b/modular_darkpack/modules/walls/code/floors/tiles.dm new file mode 100644 index 000000000000..1b1adc214ecb --- /dev/null +++ b/modular_darkpack/modules/walls/code/floors/tiles.dm @@ -0,0 +1,142 @@ +/turf/open/floor/city + abstract_type = /turf/open/floor/city + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + +/turf/open/floor/city/plating + name = "plating" + icon_state = "plating" + footstep = FOOTSTEP_PLATING + +/turf/open/floor/city/plating_mono + name = "plating" + icon_state = "plating-mono" + footstep = FOOTSTEP_PLATING + +/turf/open/floor/city/plating_stone + name = "plating" + icon_state = "plating-stone" + +/turf/open/floor/city/toilet + name = "plating" + icon_state = "toilet1" + +/turf/open/floor/city/toilet/Initialize(mapload) + . = ..() + icon_state = "toilet[rand(1, 9)]" + +/turf/open/floor/city/toilet/large + name = "plating" + icon_state = "toilet_large1" + +/turf/open/floor/city/toilet/large/Initialize(mapload) + . = ..() + icon_state = "toilet_large[rand(1, 9)]" + +/turf/open/floor/city/clinic + name = "plating" + icon_state = "clinic1" + +/turf/open/floor/city/clinic/Initialize(mapload) + . = ..() + icon_state = "clinic[rand(1, 9)]" + +/turf/open/floor/city/factory + name = "plating" + icon_state = "factory1" + +/turf/open/floor/city/factory/Initialize(mapload) + . = ..() + icon_state = "factory[rand(1, 9)]" + +/turf/open/floor/city/industrial + name = "plating" + icon_state = "industrial1" + +/turf/open/floor/city/industrial/Initialize(mapload) + . = ..() + icon_state = "industrial[rand(1, 9)]" + +/turf/open/floor/city/industrial/large + name = "plating" + icon_state = "industrial_large1" + +/turf/open/floor/city/industrial/large/Initialize(mapload) + . = ..() + icon_state = "industrial_large[rand(1, 9)]" + +/turf/open/floor/city/circled + name = "fancy plating" + icon_state = "circle1" + +/turf/open/floor/city/circled/Initialize(mapload) + . = ..() + icon_state = "circle[rand(1, 8)]" + +/turf/open/floor/city/circled/large + name = "fancy plating" + icon_state = "circle_large" + +/turf/open/floor/city/church + name = "fancy plating" + icon_state = "church1" + footstep = FOOTSTEP_PARKET + barefootstep = FOOTSTEP_PARKET + +/turf/open/floor/city/church/Initialize(mapload) + . = ..() + icon_state = "church[rand(1, 4)]" + +/turf/open/floor/city/saint + name = "fancy plating" + icon_state = "saint1" + footstep = FOOTSTEP_PARKET + barefootstep = FOOTSTEP_PARKET + +/turf/open/floor/city/saint/Initialize(mapload) + . = ..() + icon_state = "saint[rand(1, 2)]" + +/turf/open/floor/city/bacotell + name = "plating" + icon_state = "bacotell1" + base_icon_state = "bacotell" + +/turf/open/floor/city/bacotell/Initialize(mapload) + . = ..() + icon_state = "[base_icon_state][rand(1, 4)]" + +/turf/open/floor/city/gummaguts + name = "plating" + icon_state = "gummaguts" + base_icon_state = "gummaguts" + +/turf/open/floor/city/gummaguts/Initialize(mapload) + . = ..() + icon_state = "[base_icon_state][rand(1, 4)]" + +/turf/open/floor/iron/stairs/black + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "stairs_black" + base_icon_state = "stairs_black" + tiled_turf = FALSE + +/turf/open/floor/iron/stairs/black/left + icon_state = "stairs_black-l" + base_icon_state = "stairs_black-l" + +/turf/open/floor/iron/stairs/black/medium + icon_state = "stairs_black-m" + base_icon_state = "stairs_black-m" + +/turf/open/floor/iron/stairs/black/right + icon_state = "stairs_black-r" + base_icon_state = "stairs_black-r" + +/turf/open/floor/city/light // TODO: Make this work like code/game/turfs/open/floor/light_floor.dm + icon_state = "dancefloor" + base_icon_state = "dancefloor" + +/turf/open/floor/iron/stairs/ramp + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "ramp" + base_icon_state = "ramp" diff --git a/modular_darkpack/modules/walls/code/floors/water.dm b/modular_darkpack/modules/walls/code/floors/water.dm new file mode 100644 index 000000000000..e96f347e6202 --- /dev/null +++ b/modular_darkpack/modules/walls/code/floors/water.dm @@ -0,0 +1,94 @@ +/turf/open/water/river + name = "river" + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "ocean" + baseturfs = /turf/open/water/river + +/turf/open/water/beach/vamp + name = "ocean" + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "ocean" + baseturfs = /turf/open/water/beach/vamp + +/turf/open/water/beach/vamp/deep + name = "deep water" + desc = "Don't forget your life jacket." + immerse_overlay = "immerse_deep" + baseturfs = /turf/open/water/beach/vamp/deep + is_swimming_tile = TRUE + color = "#979797" + +//Make a pr to TG eventually adding acid from shiptest mabye. +/turf/open/water/acid + name = "goop" + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "acid" + light_color = "#1b7c4c" + light_range = 1 + light_power = 0.5 + baseturfs = /turf/open/water/acid + +/turf/open/water/acid/Entered(atom/movable/AM) + if(acid_burn(AM)) + START_PROCESSING(SSobj, src) + +/turf/open/water/acid/proc/acid_burn(mob/living/L) + if(isliving(L)) + if(L.movement_type & FLYING) + return + L.apply_damage(10, AGGRAVATED) + L.apply_damage(30, TOX) + to_chat(L, span_warning("Your flesh burns!")) + +//Code mostly taken from /obj/crystal_mass +/turf/open/water/bloodwave + gender = PLURAL + name = "blood" + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "blood" + light_color = COLOR_MAROON + light_range = 1 + light_power = 0.5 + baseturfs = /turf/open/water/bloodwave + immerse_overlay = "immerse_deep" + is_swimming_tile = TRUE + ///All dirs we can expand to + var/list/available_dirs = list(NORTH,SOUTH,EAST,WEST,DOWN) + ///Cooldown on the expansion process + COOLDOWN_DECLARE(wave_cooldown) + +/turf/open/water/bloodwave/Initialize(mapload, dir_to_remove) + . = ..() + if(mapload) + return + START_PROCESSING(SSsupermatter_cascade, src) + available_dirs -= dir_to_remove + +/turf/open/water/bloodwave/proc/start_flood() + SSsupermatter_cascade.can_fire = TRUE + SSsupermatter_cascade.cascade_initiated = TRUE + +/turf/open/water/bloodwave/process() + + if(!COOLDOWN_FINISHED(src, wave_cooldown)) + return + + if(!available_dirs || available_dirs.len <= 0) + return PROCESS_KILL + + COOLDOWN_START(src, wave_cooldown, rand(0, 2 SECONDS)) + + var/picked_dir = pick_n_take(available_dirs) + var/turf/next_turf = get_step_multiz(src, picked_dir) + + if(!next_turf || locate(/turf/open/water/bloodwave) in next_turf) + return + + for(var/atom/movable/checked_atom as anything in next_turf) + if(isliving(checked_atom)) + var/mob/living/checked_mob = checked_atom + checked_mob.death() + //else if(isitem(checked_atom)) + // qdel(checked_atom) + + new /turf/open/water/bloodwave(next_turf, get_dir(next_turf, src)) diff --git a/modular_darkpack/modules/walls/code/floors/wood.dm b/modular_darkpack/modules/walls/code/floors/wood.dm new file mode 100644 index 000000000000..71a0d3ce367a --- /dev/null +++ b/modular_darkpack/modules/walls/code/floors/wood.dm @@ -0,0 +1,46 @@ +// dwinters99 (carpenter) consulted for wood type paths + +// consider just fully removing these, it overlaps with FOOTSTEP_WOOD very hard +// and FOOTSTEP_WOOD sounds better imo +// footstep = FOOTSTEP_PARKET +// barefootstep = FOOTSTEP_PARKET + +/turf/open/floor/wood/rough + name = "wood flooring" + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "wood1" + base_icon_state = "wood" + floor_tile = null + +/turf/open/floor/wood/rough/Initialize(mapload) + . = ..() + icon_state = "[base_icon_state][rand(1, 12)]" + +/turf/open/floor/wood/herring + name = "fancy wood flooring" + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "woodd1" + base_icon_state = "woodd" + floor_tile = null + +/turf/open/floor/wood/herring/Initialize(mapload) + . = ..() + icon_state = "[base_icon_state][rand(1, 12)]" + +/turf/open/floor/wood/old + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "wood_old" + floor_tile = null + +/turf/open/floor/wood/smooth + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "wood_smooth" + floor_tile = null + +/turf/open/floor/wood/smooth/old + icon_state = "wood_smooth_old" + +/turf/open/floor/wood/ornate + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "wood_ornate" + floor_tile = null diff --git a/modular_darkpack/modules/walls/code/lattice.dm b/modular_darkpack/modules/walls/code/lattice.dm new file mode 100644 index 000000000000..385cc4a0b1e0 --- /dev/null +++ b/modular_darkpack/modules/walls/code/lattice.dm @@ -0,0 +1,18 @@ +/obj/structure/lattice/grate + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "lattice_grate" + base_icon_state = "lattice_grate" + + smoothing_flags = null + smoothing_groups = null + canSmoothWith = null + +/obj/structure/lattice/pentex + desc = "Looks sturdy enough and made of advanced materials." + icon = 'icons/obj/smooth_structures/darkpack/catwalk_pentex_opaque.dmi' + +/obj/structure/lattice/catwalk/borderless + icon = 'icons/obj/smooth_structures/darkpack/catwalk_borderless.dmi' + +/obj/structure/lattice/catwalk/borderless/smooth_walls + canSmoothWith = SMOOTH_GROUP_CATWALK + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CITY_WALL diff --git a/modular_darkpack/modules/walls/code/low_walls.dm b/modular_darkpack/modules/walls/code/low_walls.dm new file mode 100644 index 000000000000..970cf978b788 --- /dev/null +++ b/modular_darkpack/modules/walls/code/low_walls.dm @@ -0,0 +1,42 @@ + +/obj/structure/platform/lowwall + name = "low wall" + desc = "It's a lot like a wall, but lower." + icon = 'modular_darkpack/modules/walls/icons/lowwalls.dmi' + icon_state = "wall-0" + base_icon_state = "wall" + abstract_type = /obj/structure/platform/lowwall + max_integrity = 350 + smoothing_groups = SMOOTH_GROUP_CITY_LOW_WALL + canSmoothWith = SMOOTH_GROUP_CITY_LOW_WALL + var/window + +/obj/structure/platform/lowwall/Initialize(mapload) + . = ..() + if(window) + new window(loc) + +LOW_WALL_HELPER(rich, 'icons/obj/smooth_structures/darkpack/wall/rich/low_wall.dmi') + +LOW_WALL_HELPER(rich/old, 'icons/obj/smooth_structures/darkpack/wall/rich_old/low_wall.dmi') + +LOW_WALL_HELPER(brick_old, 'icons/obj/smooth_structures/darkpack/wall/brick_old/low_wall.dmi') + +LOW_WALL_HELPER(junk, 'icons/obj/smooth_structures/darkpack/wall/junk/low_wall.dmi') + +LOW_WALL_HELPER(junk/alt, 'icons/obj/smooth_structures/darkpack/wall/junk_alt/low_wall.dmi') + +LOW_WALL_HELPER(market, 'icons/obj/smooth_structures/darkpack/wall/market/low_wall.dmi') + +LOW_WALL_HELPER(old, 'icons/obj/smooth_structures/darkpack/wall/old/low_wall.dmi') + +LOW_WALL_HELPER(painted, 'icons/obj/smooth_structures/darkpack/wall/painted/low_wall.dmi') + +LOW_WALL_HELPER(brick, 'icons/obj/smooth_structures/darkpack/wall/brick/low_wall.dmi') + +LOW_WALL_HELPER(city, 'icons/obj/smooth_structures/darkpack/wall/city/low_wall.dmi') + +LOW_WALL_HELPER(bar, 'icons/obj/smooth_structures/darkpack/wall/bar/low_wall.dmi') + +LOW_WALL_HELPER(wood, 'icons/obj/smooth_structures/darkpack/wall/wood/low_wall.dmi') + diff --git a/modular_darkpack/modules/walls/code/sewer.dm b/modular_darkpack/modules/walls/code/sewer.dm new file mode 100644 index 000000000000..053ce1cf64e3 --- /dev/null +++ b/modular_darkpack/modules/walls/code/sewer.dm @@ -0,0 +1,53 @@ +/turf/open/floor/plating/canal + name = "plating" + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "canal1" + footstep = FOOTSTEP_FLOOR + +/turf/open/floor/plating/canal/Enter(atom/movable/mover, atom/oldloc) + . = ..() + var/mob/living/living_mover = mover + if(istype(living_mover) && living_mover.client) + if(prob(0.5)) + var/cap = CONFIG_GET(number/ratcap) + if(LAZYLEN(SSmobs.cheeserats) >= cap) + return + new /mob/living/basic/mouse/vampire(oldloc) + +/turf/open/floor/plating/canal/Initialize(mapload) + . = ..() + icon_state = "canal[rand(1, 3)]" + +/turf/open/floor/plating/canalplating + name = "plating" + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "canal_plating1" + footstep = FOOTSTEP_PARKET + barefootstep = FOOTSTEP_PARKET + +/turf/open/floor/plating/canalplating/Enter(atom/movable/mover, atom/oldloc) + . = ..() + var/mob/living/living_mover = mover + if(istype(living_mover) && living_mover.client) + if(prob(0.5)) + var/cap = CONFIG_GET(number/ratcap) + if(LAZYLEN(SSmobs.cheeserats) >= cap) + return + new /mob/living/basic/mouse/vampire(oldloc) + +/turf/open/floor/plating/canalplating/Initialize(mapload) + . = ..() + icon_state = "canal_plating[rand(1, 4)]" + +/turf/open/water/vamp_sewer + name = "sewage" + icon = 'modular_darkpack/modules/walls/icons/floors.dmi' + icon_state = "shit" + +/turf/open/water/vamp_sewer/Initialize(mapload) + . = ..() + if(prob(25)) + new /obj/effect/realistic_fog(src) + +/turf/open/water/vamp_sewer/border + icon_state = "shit_border" diff --git a/modular_darkpack/modules/walls/code/wallpaper.dm b/modular_darkpack/modules/walls/code/wallpaper.dm index 84476c7931ee..d169aa20f079 100644 --- a/modular_darkpack/modules/walls/code/wallpaper.dm +++ b/modular_darkpack/modules/walls/code/wallpaper.dm @@ -4,7 +4,7 @@ icon_state = "wallpaper" plane = GAME_PLANE layer = ABOVE_NORMAL_TURF_LAYER //WALLPAPER_LAYER dont work - mouse_opacity = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT // This sucks. Not within the scope of this pr to fix. /obj/effect/decal/wallpaper/NeverShouldHaveComeHere(turf/here_turf) diff --git a/modular_darkpack/modules/walls/code/walls.dm b/modular_darkpack/modules/walls/code/walls.dm index 8cb17f0bfdd1..4aa641980faf 100644 --- a/modular_darkpack/modules/walls/code/walls.dm +++ b/modular_darkpack/modules/walls/code/walls.dm @@ -1,21 +1,3 @@ -#define LOW_WALL_HELPER(wall_type) \ - /turf/closed/wall/##wall_type/low { \ - icon = 'modular_darkpack/modules/walls/icons/lowwalls.dmi'; \ - opacity = FALSE; \ - low = TRUE; \ - blocks_air = FALSE; \ - smoothing_groups = SMOOTH_GROUP_CITY_LOW_WALL; \ - canSmoothWith = SMOOTH_GROUP_CITY_LOW_WALL; \ - pass_flags_self = PASSTABLE | LETPASSTHROW; \ - } \ - /turf/closed/wall/##wall_type/low/window { \ - window = /obj/structure/window/fulltile; \ - } \ - /turf/closed/wall/##wall_type/low/window/reinforced { \ - window = /obj/structure/window/reinforced/fulltile; \ - } - - /obj/structure/window/fulltile icon = 'modular_darkpack/modules/deprecated/icons/obj/smooth_structures/window.dmi' @@ -30,7 +12,7 @@ plane = GAME_PLANE layer = ABOVE_ALL_MOB_LAYER anchored = TRUE - mouse_opacity = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/effect/wall_frill/Initialize(mapload) . = ..() @@ -55,6 +37,7 @@ icon = 'modular_darkpack/modules/walls/icons/walls.dmi' icon_state = "wall-0" base_icon_state = "wall" + abstract_type = /turf/closed/wall/vampwall opacity = TRUE density = TRUE smoothing_flags = SMOOTH_BITMASK @@ -65,8 +48,6 @@ var/obj/effect/wall_frill/wall_frill var/frill_icon = /obj/effect/wall_frill::icon - var/low = FALSE - var/window /turf/closed/wall/vampwall/attackby(obj/item/W, mob/user, params) return @@ -127,21 +108,11 @@ /turf/closed/wall/vampwall/Initialize(mapload) . = ..() - if(window) - new window(src) - else if(!low) - wall_frill = new(get_step(src, NORTH)) - wall_frill.icon = frill_icon - wall_frill.icon_state = icon_state - wall_frill.name = name - wall_frill.desc = desc - - if(low) - // Runtimes out the ass. - //AddComponent(/datum/component/climb_walkable) - AddElement(/datum/element/climbable) - // So. This is an obj only thing. Turf are really missing alot of code to make them act more like tables. - //AddElement(/datum/element/elevation, pixel_shift = 12) + wall_frill = new(get_step(src, NORTH)) + wall_frill.icon = frill_icon + wall_frill.icon_state = icon_state + wall_frill.name = name + wall_frill.desc = desc /turf/closed/wall/vampwall/set_smoothed_icon_state(new_junction) . = ..() @@ -153,197 +124,146 @@ if(wall_frill) qdel(wall_frill) -LOW_WALL_HELPER(vampwall) -/turf/closed/wall/vampwall/low/window - icon_state = "wall-window" - window = /obj/structure/window/fulltile - /turf/closed/wall/vampwall/rich name = "rich-looking wall" desc = "A huge chunk of expensive bricks used to separate rooms." - icon_state = "rich-0" - base_icon_state = "rich" + icon = 'icons/obj/smooth_structures/darkpack/wall/rich/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/rich/frill.dmi' -LOW_WALL_HELPER(vampwall/rich) -/turf/closed/wall/vampwall/rich/low/window - icon_state = "rich-window" -/turf/closed/wall/vampwall/rich/low/window/reinforced - icon_state = "rich-reinforced" +/turf/closed/wall/vampwall/rich/old + name = "old rich-looking wall" + desc = "A huge chunk of old bricks used to separate rooms." + icon = 'icons/obj/smooth_structures/darkpack/wall/rich_old/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/rich_old/frill.dmi' + +/turf/closed/wall/vampwall/brick_old + icon = 'icons/obj/smooth_structures/darkpack/wall/brick_old/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/brick_old/frill.dmi' /turf/closed/wall/vampwall/junk name = "junk brick wall" desc = "A huge chunk of dirty bricks used to separate rooms." - icon_state = "junk-0" - base_icon_state = "junk" - -LOW_WALL_HELPER(vampwall/junk) -/turf/closed/wall/vampwall/junk/low/window - icon_state = "junk-window" + icon = 'icons/obj/smooth_structures/darkpack/wall/junk/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/junk/frill.dmi' /turf/closed/wall/vampwall/junk/alt - icon_state = "junkalt-0" - base_icon_state = "junkalt" - -LOW_WALL_HELPER(vampwall/junk/alt) -/turf/closed/wall/vampwall/junk/alt/low/window - icon_state = "junkalt-window" + icon = 'icons/obj/smooth_structures/darkpack/wall/junk_alt/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/junk_alt/frill.dmi' /turf/closed/wall/vampwall/market name = "concrete wall" desc = "A huge chunk of concrete used to separate rooms." - icon_state = "market-0" - base_icon_state = "market" - -LOW_WALL_HELPER(vampwall/market) -/turf/closed/wall/vampwall/market/low/window - icon_state = "market-window" -/turf/closed/wall/vampwall/market/low/window/reinforced - icon_state = "market-reinforced" + icon = 'icons/obj/smooth_structures/darkpack/wall/market/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/market/frill.dmi' /turf/closed/wall/vampwall/old name = "old brick wall" desc = "A huge chunk of old bricks used to separate rooms." - icon_state = "old-0" - base_icon_state = "old" - -/turf/closed/wall/vampwall/old/low - icon = 'modular_darkpack/modules/walls/icons/lowwalls.dmi' - opacity = FALSE - low = TRUE - blocks_air = FALSE - smoothing_groups = SMOOTH_GROUP_CITY_LOW_WALL - canSmoothWith = SMOOTH_GROUP_CITY_LOW_WALL -/* Currently missing icon states for window -LOW_WALL_HELPER(vampwall/low) -/turf/closed/wall/vampwall/old/low/window - icon_state = "old-window" -/turf/closed/wall/vampwall/old/low/window/reinforced - icon_state = "old-reinforced" -*/ + icon = 'icons/obj/smooth_structures/darkpack/wall/old/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/old/frill.dmi' /turf/closed/wall/vampwall/painted name = "painted brick wall" desc = "A huge chunk of painted bricks used to separate rooms." - icon_state = "painted-0" - base_icon_state = "painted" - -LOW_WALL_HELPER(vampwall/painted) -/turf/closed/wall/vampwall/painted/low/window - icon_state = "painted-window" -/turf/closed/wall/vampwall/painted/low/window/reinforced - icon_state = "painted-reinforced" - -/turf/closed/wall/vampwall/rich/old - name = "old rich-looking wall" - desc = "A huge chunk of old bricks used to separate rooms." - icon_state = "theater-0" - base_icon_state = "theater" - -LOW_WALL_HELPER(vampwall/rich/old) -/turf/closed/wall/vampwall/rich/old/low/window - icon_state = "theater-window" -/turf/closed/wall/vampwall/rich/old/low/window/reinforced - icon_state = "theater-reinforced" + icon = 'icons/obj/smooth_structures/darkpack/wall/painted/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/painted/frill.dmi' /turf/closed/wall/vampwall/brick name = "brick wall" desc = "A huge chunk of bricks used to separate rooms." - icon_state = "brick-0" - base_icon_state = "brick" - -LOW_WALL_HELPER(vampwall/brick) -/turf/closed/wall/vampwall/brick/low/window - icon_state = "brick-window" + icon = 'icons/obj/smooth_structures/darkpack/wall/brick/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/brick/frill.dmi' -/turf/closed/wall/vampwall/rock - name = "rock wall" - desc = "A huge chunk of rocks separating whole territory." - icon_state = "rock-0" - base_icon_state = "rock" +/turf/closed/wall/vampwall/redbrick + name = "red brick wall" + desc = "A huge chunk of red bricks used to separate rooms." + icon = 'icons/obj/smooth_structures/darkpack/wall/red_brick/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/red_brick/frill.dmi' /turf/closed/wall/vampwall/city name = "wall" desc = "A huge chunk of concrete and bricks used to separate rooms." - icon_state = "city-0" - base_icon_state = "city" - -LOW_WALL_HELPER(vampwall/city) -/turf/closed/wall/vampwall/city/low/window - icon_state = "city-window" + icon = 'icons/obj/smooth_structures/darkpack/wall/city/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/city/frill.dmi' /turf/closed/wall/vampwall/metal name = "metal wall" desc = "A huge chunk of metal used to separate rooms." - icon_state = "metal-0" - base_icon_state = "metal" + icon = 'icons/obj/smooth_structures/darkpack/wall/metal/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/metal/frill.dmi' /turf/closed/wall/vampwall/metal/reinforced name = "reinforced metal wall" desc = "A huge chunk of reinforced metal used to separate rooms." - icon_state = "metalreinforced-0" - base_icon_state = "metalreinforced" + icon = 'icons/obj/smooth_structures/darkpack/wall/metal_reinforced/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/metal_reinforced/frill.dmi' /turf/closed/wall/vampwall/metal/alt name = "metal wall" desc = "A huge chunk of metal used to separate rooms." - icon_state = "metalalt-0" - base_icon_state = "metalalt" + icon = 'icons/obj/smooth_structures/darkpack/wall/metal_alt/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/metal_alt/frill.dmi' /turf/closed/wall/vampwall/metal/glass name = "metal wall" desc = "A huge chunk of metal used to separate rooms." - icon_state = "metalglass-0" - base_icon_state = "metalglass" + icon = 'icons/obj/smooth_structures/darkpack/wall/metal_glass/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/metal_glass/frill.dmi' opacity = FALSE /turf/closed/wall/vampwall/bar name = "dark brick wall" desc = "A huge chunk of bricks used to separate rooms." - icon_state = "bar-0" - base_icon_state = "bar" - -LOW_WALL_HELPER(vampwall/bar) -/turf/closed/wall/vampwall/bar/low/window - icon_state = "bar-window" + icon = 'icons/obj/smooth_structures/darkpack/wall/bar/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/bar/frill.dmi' /turf/closed/wall/vampwall/wood name = "wood wall" desc = "A huge chunk of dirty logs used to separate rooms." - icon_state = "wood-0" - base_icon_state = "wood" - -LOW_WALL_HELPER(vampwall/wood) -/turf/closed/wall/vampwall/wood/low/window - icon_state = "wood-window" + icon = 'icons/obj/smooth_structures/darkpack/wall/wood/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/wood/frill.dmi' /turf/closed/wall/vampwall/rust name = "rusty wall" desc = "A huge chunk of rusty metal used to separate rooms." - icon_state = "rust-0" - base_icon_state = "rust" + icon = 'icons/obj/smooth_structures/darkpack/wall/rust/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/rust/frill.dmi' /turf/closed/wall/vampwall/dirtywood name = "dirty wood wall" desc = "A huge chunk of brown metal used to separate rooms." - icon_state = "dirtywood-0" - base_icon_state = "dirtywood" + icon = 'icons/obj/smooth_structures/darkpack/wall/wood_dirty/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/wood_dirty/frill.dmi' /turf/closed/wall/vampwall/green name = "green wall" desc = "A huge chunk of green metal used to separate rooms." - icon_state = "green-0" - base_icon_state = "green" + icon = 'icons/obj/smooth_structures/darkpack/wall/green/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/green/frill.dmi' /turf/closed/wall/vampwall/rustbad name = "rusty wall" desc = "A huge chunk of rusty metal used to separate rooms." - icon_state = "rustbad-0" - base_icon_state = "rustbad" - -/turf/closed/wall/vampwall/redbrick - name = "red brick wall" - desc = "A huge chunk of red bricks used to separate rooms." - icon_state = "redbrick-0" - base_icon_state = "redbrick" + icon = 'icons/obj/smooth_structures/darkpack/wall/rustbad/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/rustbad/frill.dmi' -#undef LOW_WALL_HELPER +/turf/closed/wall/vampwall/rock + name = "rock wall" + desc = "A huge chunk of rocks separating whole territory." + //icon = 'icons/obj/smooth_structures/darkpack/wall/rock/wall.dmi' + icon = 'modular_darkpack/modules/walls/icons/rock_wall.dmi' // Unfortuante case where its autocutting is a bit lacking so I manually edit it. + frill_icon = 'icons/obj/smooth_structures/darkpack/wall/rock/frill.dmi' + +/* +/turf/closed/wall/vampwall/rock/brown + icon = 'icons/obj/smooth_structures/darkpack/mojave/rock_brown/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/mojave/rock_brown/frill.dmi' + +/turf/closed/wall/vampwall/rock/brown/full + icon = 'icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/mojave/rock_brown_full/frill.dmi' + +/turf/closed/wall/vampwall/mojave/brick + icon = 'icons/obj/smooth_structures/darkpack/mojave/brick/wall.dmi' + frill_icon = 'icons/obj/smooth_structures/darkpack/mojave/brick/frill.dmi' +*/ diff --git a/modular_darkpack/modules/walls/icons/floors.dmi b/modular_darkpack/modules/walls/icons/floors.dmi index 06701f031fa2..fe0a522995db 100644 Binary files a/modular_darkpack/modules/walls/icons/floors.dmi and b/modular_darkpack/modules/walls/icons/floors.dmi differ diff --git a/modular_darkpack/modules/walls/icons/lowwalls.dmi b/modular_darkpack/modules/walls/icons/lowwalls.dmi index 91c215cae685..57110b932d70 100644 Binary files a/modular_darkpack/modules/walls/icons/lowwalls.dmi and b/modular_darkpack/modules/walls/icons/lowwalls.dmi differ diff --git a/modular_darkpack/modules/walls/icons/rock_wall.dmi b/modular_darkpack/modules/walls/icons/rock_wall.dmi new file mode 100644 index 000000000000..748a73ef358e Binary files /dev/null and b/modular_darkpack/modules/walls/icons/rock_wall.dmi differ diff --git a/modular_darkpack/modules/walls/icons/wallfrills.dmi b/modular_darkpack/modules/walls/icons/wallfrills.dmi index 06ced017360d..e69be84a54a0 100644 Binary files a/modular_darkpack/modules/walls/icons/wallfrills.dmi and b/modular_darkpack/modules/walls/icons/wallfrills.dmi differ diff --git a/modular_darkpack/modules/walls/icons/walls.dmi b/modular_darkpack/modules/walls/icons/walls.dmi index d1a2e8f41242..448557ce5146 100644 Binary files a/modular_darkpack/modules/walls/icons/walls.dmi and b/modular_darkpack/modules/walls/icons/walls.dmi differ diff --git a/modular_darkpack/modules/walls/readme.md b/modular_darkpack/modules/walls/readme.md new file mode 100644 index 000000000000..2163ea8241b1 --- /dev/null +++ b/modular_darkpack/modules/walls/readme.md @@ -0,0 +1,42 @@ +<!-- This should be copy-pasted into the root of your module folder as readme.md --> + +https://github.com/NovaSector/NovaSector/pull/<!--PR Number--> + +## \<Title Walls> <!--Title of your addition.--> + +Module ID: WALLS <!-- Uppercase, UNDERSCORE_CONNECTED name of your module, that you use to mark files. This is so people can case-sensitive search for your edits, if any. --> + +### Description: +Cool and awesome 48x walls in 3/4 perspective. (also floor code for some reason) +<!-- Here, try to describe what your PR does, what features it provides and any other directly useful information. --> + +### TG Proc/File Changes: + +- N/A +<!-- If you edited any core procs, you should list them here. You should specify the files and procs you changed. +E.g: +- `code/modules/mob/living.dm`: `proc/overriden_proc`, `var/overriden_var` + --> + +### Modular Overrides: + +- N/A +<!-- If you added a new modular override (file or code-wise) for your module, you should list it here. Code files should specify what procs they changed, in case of multiple modules using the same file. +E.g: +- `modular_nova/master_files/sound/my_cool_sound.ogg` +- `modular_nova/master_files/code/my_modular_override.dm`: `proc/overriden_proc`, `var/overriden_var` + --> + +### Defines: + +- `code/__DEFINES/~darkpack/walls.dm`: LOW_WALL_HELPER +<!-- If you needed to add any defines, mention the files you added those defines in, along with the name of the defines. --> + +### Included files that are not contained in this module: + +- `icons/obj/smooth_structures/darkpack/wall/` +<!-- Likewise, be it a non-modular file or a modular one that's not contained within the folder belonging to this specific module, it should be mentioned here. Good examples are icons or sounds that are used between multiple modules, or other such edge-cases. --> + +### Credits: + +<!-- Here go the credits to you, dear coder, and in case of collaborative work or ports, credits to the original source of the code. --> diff --git a/modular_darkpack/modules/deprecated/sounds/asphalt1.ogg b/modular_darkpack/modules/walls/sounds/asphalt1.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/asphalt1.ogg rename to modular_darkpack/modules/walls/sounds/asphalt1.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/asphalt2.ogg b/modular_darkpack/modules/walls/sounds/asphalt2.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/asphalt2.ogg rename to modular_darkpack/modules/walls/sounds/asphalt2.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/parket1.ogg b/modular_darkpack/modules/walls/sounds/parket1.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/parket1.ogg rename to modular_darkpack/modules/walls/sounds/parket1.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/parket2.ogg b/modular_darkpack/modules/walls/sounds/parket2.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/parket2.ogg rename to modular_darkpack/modules/walls/sounds/parket2.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/parket3.ogg b/modular_darkpack/modules/walls/sounds/parket3.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/parket3.ogg rename to modular_darkpack/modules/walls/sounds/parket3.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/sidewalk1.ogg b/modular_darkpack/modules/walls/sounds/sidewalk1.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/sidewalk1.ogg rename to modular_darkpack/modules/walls/sounds/sidewalk1.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/sidewalk2.ogg b/modular_darkpack/modules/walls/sounds/sidewalk2.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/sidewalk2.ogg rename to modular_darkpack/modules/walls/sounds/sidewalk2.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/sidewalk3.ogg b/modular_darkpack/modules/walls/sounds/sidewalk3.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/sidewalk3.ogg rename to modular_darkpack/modules/walls/sounds/sidewalk3.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/snow1.ogg b/modular_darkpack/modules/walls/sounds/snow1.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/snow1.ogg rename to modular_darkpack/modules/walls/sounds/snow1.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/snow2.ogg b/modular_darkpack/modules/walls/sounds/snow2.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/snow2.ogg rename to modular_darkpack/modules/walls/sounds/snow2.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/trava1.ogg b/modular_darkpack/modules/walls/sounds/trava1.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/trava1.ogg rename to modular_darkpack/modules/walls/sounds/trava1.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/trava2.ogg b/modular_darkpack/modules/walls/sounds/trava2.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/trava2.ogg rename to modular_darkpack/modules/walls/sounds/trava2.ogg diff --git a/modular_darkpack/modules/deprecated/sounds/trava3.ogg b/modular_darkpack/modules/walls/sounds/trava3.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/trava3.ogg rename to modular_darkpack/modules/walls/sounds/trava3.ogg diff --git a/modular_darkpack/modules/weapons/code/ammostack.dm b/modular_darkpack/modules/weapons/code/ammostack.dm index 09b579c6104f..f47c5e2c17c8 100644 --- a/modular_darkpack/modules/weapons/code/ammostack.dm +++ b/modular_darkpack/modules/weapons/code/ammostack.dm @@ -15,6 +15,13 @@ damage = 20 armour_penetration = 2 +/obj/projectile/bullet/darkpack/vamp45acp/HP + name = "45acp hollow point bullet" + damage = 25 + armour_penetration = 0 + wound_bonus = 5 + wound_bonus = 5 + /obj/projectile/bullet/darkpack/vamp44 name = ".44 bullet" damage = 35 @@ -43,6 +50,13 @@ exposed_wound_bonus = 5 wound_bonus = -5 +/obj/projectile/bullet/darkpack/vamp46mm + name = "4.6mm bullet" + damage = 19 + armour_penetration = 30 + exposed_wound_bonus = 0 + wound_bonus = 0 + /obj/projectile/bullet/shotgun_slug/vamp name = "12g shotgun slug" damage = 70 @@ -50,6 +64,17 @@ exposed_wound_bonus = 10 wound_bonus = 5 +/obj/projectile/bullet/darkpack/rubber + name = "12g shotgun rubber shot" + damage = 5 + stamina = 50 + +/obj/projectile/bullet/darkpack/incap + name = "12g shotgun incapacitation shot" + damage = 15 + stamina = 80 + + /obj/projectile/bullet/shotgun_slug/vamp/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) @@ -99,7 +124,7 @@ icon_state = "9" base_icon_state = "9" icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') /obj/item/ammo_casing/vampire/c9mm name = "9mm bullet casing" @@ -122,6 +147,9 @@ icon_state = "45" base_icon_state = "45" +/obj/item/ammo_casing/vampire/c45acp/HP + projectile_type = /obj/projectile/bullet/darkpack/vamp45acp/HP + /obj/item/ammo_casing/vampire/c44 name = ".44 bullet casing" desc = "A .44 bullet casing." @@ -154,6 +182,14 @@ icon_state = "545" base_icon_state = "545" +/obj/item/ammo_casing/vampire/c46pdw + name = "4.6mm bullet casing" + desc = "A 4.6mm bullet casing." + caliber = CALIBER_46 + projectile_type = /obj/projectile/bullet/darkpack/vamp46mm + icon_state = "556" //placeholder sprite + base_icon_state = "556"//placeholder sprite + /obj/item/ammo_casing/vampire/c556mm/incendiary projectile_type = /obj/projectile/bullet/darkpack/vamp556mm/incendiary @@ -171,6 +207,18 @@ pellets = 8 variance = 25 +/obj/item/ammo_casing/vampire/c12g/rubber + desc = "A 12g shell casing." + projectile_type = /obj/projectile/bullet/darkpack/rubber + icon_state = "12r" + base_icon_state = "12r" + +/obj/item/ammo_casing/vampire/c12g/incap + desc = "A 12g shell casing." + projectile_type = /obj/projectile/bullet/darkpack/incap + icon_state = "12i" + base_icon_state = "12i" + /obj/item/ammo_casing/caseless/bolt name = "bolt" desc = "Welcome to the Middle Ages!" @@ -178,7 +226,7 @@ caliber = CALIBER_FOAM icon_state = "arrow" icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') harmful = TRUE /* @@ -213,25 +261,26 @@ . = ..() */ -/obj/item/ammo_box/vampire +/obj/item/ammo_box/darkpack icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') w_class = WEIGHT_CLASS_NORMAL ///9mm///////////// -/obj/item/ammo_box/vampire/c9mm +/obj/item/ammo_box/darkpack/c9mm name = "ammo box (9mm)" icon_state = "9box" ammo_type = /obj/item/ammo_casing/vampire/c9mm max_ammo = 100 + custom_price = 300 -/obj/item/ammo_box/vampire/c9mm/plus +/obj/item/ammo_box/darkpack/c9mm/plus name = "ammo box (9mm, +P)" desc = "a box of High Velocity (HV) ammo." ammo_type = /obj/item/ammo_casing/vampire/c9mm/plus -/obj/item/ammo_box/vampire/c9mm/moonclip +/obj/item/ammo_box/darkpack/c9mm/moonclip name = "ammo clip (9mm)" desc = "a 3 round clip to hold 9mm rounds. For once, calling it a clip is accurate." icon_state = "9moonclip" @@ -240,59 +289,76 @@ multiple_sprites = AMMO_BOX_PER_BULLET ////////////////// -/obj/item/ammo_box/vampire/c45acp +/obj/item/ammo_box/darkpack/c45acp name = "ammo box (.45 ACP)" icon_state = "45box" ammo_type = /obj/item/ammo_casing/vampire/c45acp max_ammo = 100 -/obj/item/ammo_box/vampire/c44 +/obj/item/ammo_box/darkpack/c45acp/HP + name = "ammo box (.45 ACP HP)" + ammo_type = /obj/item/ammo_casing/vampire/c45acp/HP + max_ammo = 100 + +/obj/item/ammo_box/darkpack/c44 name = "ammo box (.44)" icon_state = "44box" ammo_type = /obj/item/ammo_casing/vampire/c44 max_ammo = 60 -/obj/item/ammo_box/vampire/c50 +/obj/item/ammo_box/darkpack/c50 name = "ammo box (.50)" icon_state = "50box" ammo_type = /obj/item/ammo_casing/vampire/c50 max_ammo = 20 -/obj/item/ammo_box/vampire/c556 +/obj/item/ammo_box/darkpack/c556 name = "ammo box (5.56)" icon_state = "556box" ammo_type = /obj/item/ammo_casing/vampire/c556mm max_ammo = 60 + custom_price = 2000 -/obj/item/ammo_box/vampire/c545 +/obj/item/ammo_box/darkpack/c545 name = "ammo box (5.45)" icon_state = "545box" ammo_type = /obj/item/ammo_casing/vampire/c545mm max_ammo = 60 -/obj/item/ammo_box/vampire/c556/incendiary +/obj/item/ammo_box/darkpack/c556/incendiary name = "incendiary ammo box (5.56)" icon_state = "incendiary" ammo_type = /obj/item/ammo_casing/vampire/c556mm/incendiary -/obj/item/ammo_box/vampire/c12g +/obj/item/ammo_box/darkpack/c12g name = "ammo box (12g)" icon_state = "12box" ammo_type = /obj/item/ammo_casing/vampire/c12g max_ammo = 30 -/obj/item/ammo_box/vampire/c12g/buck +/obj/item/ammo_box/darkpack/c12g/buck name = "ammo box (12g, 00 buck)" icon_state = "12box_buck" ammo_type = /obj/item/ammo_casing/vampire/c12g/buck + custom_price = 400 + +/obj/item/ammo_box/darkpack/c12g/rubber + name = "ammo box (12g, rubber shot)" + icon_state = "12box_rubber" + ammo_type = /obj/item/ammo_casing/vampire/c12g/rubber + +/obj/item/ammo_box/darkpack/c12g/incap + name = "ammo box (12g, High Impact Incapacitation Round)" + icon_state = "12box_incap" + ammo_type = /obj/item/ammo_casing/vampire/c12g/incap -/obj/item/ammo_box/vampire/arrows +/obj/item/ammo_box/darkpack/arrows name = "ammo box (arrows)" icon_state = "arrows" ammo_type = /obj/item/ammo_casing/caseless/bolt max_ammo = 30 -// TODO: [Rebase] - Werewolf +// DARKPACK TODO - GAROU /* //obj/item/ammo_casing/vampire/c12g/buck/silver // name = "silver 12g shell casing" @@ -308,7 +374,7 @@ // adjust_gnosis(-1, M) // else // M.Stun(10) -// M.adjustBruteLoss(50, TRUE) +// M.adjust_brute_loss(50, TRUE) */ /obj/projectile/bullet/darkpack/vamp556mm/silver @@ -403,31 +469,31 @@ icon_state = "s556" base_icon_state = "s556" -/obj/item/ammo_box/vampire/c9mm/silver +/obj/item/ammo_box/darkpack/c9mm/silver name = "ammo box (9mm silver)" icon_state = "9box-silver" ammo_type = /obj/item/ammo_casing/vampire/c9mm/silver max_ammo = 100 -/obj/item/ammo_box/vampire/c45acp/silver +/obj/item/ammo_box/darkpack/c45acp/silver name = "ammo box (.45 ACP silver)" icon_state = "45box-silver" ammo_type = /obj/item/ammo_casing/vampire/c45acp/silver max_ammo = 100 -/obj/item/ammo_box/vampire/c44/silver +/obj/item/ammo_box/darkpack/c44/silver name = "ammo box (.44 silver)" icon_state = "44box-silver" ammo_type = /obj/item/ammo_casing/vampire/c44/silver max_ammo = 60 -/obj/item/ammo_box/vampire/c556/silver +/obj/item/ammo_box/darkpack/c556/silver name = "ammo box (5.56 silver)" icon_state = "556box-silver" ammo_type = /obj/item/ammo_casing/vampire/c556mm/silver max_ammo = 60 -//obj/item/ammo_box/vampire/c12g/buck/silver +//obj/item/ammo_box/darkpack/c12g/buck/silver // name = "ammo box (12g, 00 buck silver)" // icon_state = "s12box_buck" // ammo_type = /obj/item/ammo_casing/vampire/c12g/buck/silver diff --git a/modular_darkpack/modules/weapons/code/crafting_recipes.dm b/modular_darkpack/modules/weapons/code/crafting_recipes.dm index 0c4817611660..a2e8bb4f8cb0 100644 --- a/modular_darkpack/modules/weapons/code/crafting_recipes.dm +++ b/modular_darkpack/modules/weapons/code/crafting_recipes.dm @@ -1,6 +1,6 @@ /datum/crafting_recipe/stake name = "Stake" time = 50 - reqs = list(/obj/item/stack/sheet/mineral/wood = 5) + reqs = list(/obj/item/stack/sheet/mineral/wood = 2) result = /obj/item/vampire_stake category = CAT_WEAPON_MELEE diff --git a/modular_darkpack/modules/weapons/code/flamethrower.dm b/modular_darkpack/modules/weapons/code/flamethrower.dm index 55a7e3d15b47..1e56d6c6c5c1 100644 --- a/modular_darkpack/modules/weapons/code/flamethrower.dm +++ b/modular_darkpack/modules/weapons/code/flamethrower.dm @@ -1,4 +1,5 @@ -/obj/item/vampire_flamethrower +// TODO: [Rebase] - Gas should be handled as a reagent +/obj/item/liquid_flamethrower name = "flamethrower" desc = "Well fire weapon." icon_state = "flamethrower4" @@ -6,11 +7,29 @@ ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' + obj_flags = CONDUCTS_ELECTRICITY + force = 3 + throwforce = 10 + throw_speed = 1 + throw_range = 5 w_class = WEIGHT_CLASS_NORMAL - masquerade_violating = TRUE + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) + resistance_flags = FIRE_PROOF + trigger_guard = TRIGGER_GUARD_NORMAL + light_system = OVERLAY_LIGHT + light_color = LIGHT_COLOR_FLARE + light_range = 2 + light_power = 2 + light_on = FALSE + interaction_flags_click = NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING var/oil = 1000 + var/operating = FALSE -/obj/item/vampire_flamethrower/attackby(obj/item/W, mob/user, params) +/obj/item/liquid_flamethrower/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) + +/obj/item/liquid_flamethrower/attackby(obj/item/W, mob/user, params) . = ..() if(istype(W, /obj/item/gas_can)) var/obj/item/gas_can/G = W @@ -19,36 +38,46 @@ G.stored_gasoline = max(0, G.stored_gasoline-gas_to_transfer) oil = min(1000, oil+gas_to_transfer) if(oil) - playsound(get_turf(user), 'modular_darkpack/master_files/sounds/gas_fill.ogg', 50, TRUE) + playsound(get_turf(user), 'modular_darkpack/master_files/sounds/effects/gas_fill.ogg', 50, TRUE) to_chat(user, span_notice("You fill [src].")) icon_state = "flamethrower4" -/obj/item/vampire_flamethrower/examine(mob/user) +/obj/item/liquid_flamethrower/examine(mob/user) . = ..() . += "<b>Ammo:</b> [(oil/1000)*100]%" -/obj/item/vampire_flamethrower/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) +/obj/item/liquid_flamethrower/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) . = ..() -// if(flag) -// return -// if(ishuman(user)) -// if(!can_trigger_gun(user)) -// return if(HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You can't bring yourself to fire \the [src]! You don't want to risk harming anyone...")) - return + return ITEM_INTERACT_BLOCKING playsound(get_turf(user), 'modular_darkpack/modules/deprecated/sounds/flamethrower.ogg', 50, TRUE) visible_message(span_warning("[user] fires [src]!"), span_warning("You fire [src]!")) - if(user && user.get_active_held_item() == src) // Make sure our user is still holding us - var/turf/target_turf = get_turf(target) - if(target_turf) - var/turflist = getline(user, target_turf) - log_combat(user, target, "flamethrowered", src) - for(var/turf/open/floor/F in turflist) - if(F != user.loc) - if(oil) - new /obj/effect/decal/cleanable/gasoline(F) - oil = max(0, oil-10) - if(oil == 0) - icon_state = "flamethrower1" - new /obj/effect/fire(F) + var/turf/target_turf = get_turf(interacting_with) + if(target_turf) + var/turflist = get_line(user, target_turf) + log_combat(user, interacting_with, "flamethrowered", src) + flame_turf(turflist) + + return ITEM_INTERACT_SUCCESS + +/obj/item/liquid_flamethrower/proc/flame_turf(turflist) + if(operating) + return + operating = TRUE + var/turf/previousturf = get_turf(src) + for(var/turf/T in turflist) + if(T == previousturf) + continue //so we don't burn the tile we be standin on + var/list/turfs_sharing_with_prev = previousturf.get_atmos_adjacent_turfs(alldir=1) + if(!(T in turfs_sharing_with_prev)) + break + if(oil < 10) + icon_state = "flamethrower1" + return + oil = max(0, oil-10) + new /obj/effect/decal/cleanable/gasoline(T) + T.ignite_turf(30, "red") + sleep(0.1 SECONDS) + previousturf = T + operating = FALSE diff --git a/modular_darkpack/modules/weapons/code/guns.dm b/modular_darkpack/modules/weapons/code/guns.dm index 16ceb8f33bb9..027d8895a8ee 100644 --- a/modular_darkpack/modules/weapons/code/guns.dm +++ b/modular_darkpack/modules/weapons/code/guns.dm @@ -6,12 +6,12 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_guns.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') /* /obj/item/ammo_box/magazine/darkpack icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') */ //REVOLVERS @@ -29,7 +29,7 @@ icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi' lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') accepted_magazine_type = /obj/item/ammo_box/magazine/internal/cylinder/rev44 initial_caliber = CALIBER_44 fire_sound = 'modular_darkpack/modules/weapons/sounds/revolver.ogg' @@ -65,12 +65,12 @@ icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi' lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') /obj/item/ammo_box/magazine/m44 name = "handgun magazine (.44)" icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') icon_state = "deagle" ammo_type = /obj/item/ammo_casing/vampire/c44 caliber = CALIBER_44 @@ -90,7 +90,7 @@ /obj/item/ammo_box/magazine/m50 name = "handgun magazine (.50)" icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') icon_state = "deagle" ammo_type = /obj/item/ammo_casing/vampire/c50 caliber = CALIBER_50 @@ -108,7 +108,7 @@ /obj/item/ammo_box/magazine/darkpack45acp name = "pistol magazine (.45 ACP)" icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') icon_state = "m1911" ammo_type = /obj/item/ammo_casing/vampire/c45acp caliber = CALIBER_45 @@ -128,7 +128,7 @@ /obj/item/ammo_box/magazine/glock9mm name = "automatic pistol magazine (9mm)" icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') icon_state = "glock19" ammo_type = /obj/item/ammo_casing/vampire/c9mm caliber = CALIBER_9MM @@ -152,9 +152,9 @@ /obj/item/ammo_box/magazine/glock45acp name = "automatic pistol magazine (.45 ACP)" icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') icon_state = "glock21" - ammo_type = /obj/item/ammo_casing/vampire/c9mm + ammo_type = /obj/item/ammo_casing/vampire/c45acp caliber = CALIBER_45 max_ammo = 12 multiple_sprites = AMMO_BOX_FULL_EMPTY @@ -187,6 +187,7 @@ bolt_type = BOLT_TYPE_LOCKING fire_sound = 'modular_darkpack/modules/weapons/sounds/glock.ogg' fire_sound_volume = 75 + custom_price = 1200 /obj/item/gun/ballistic/automatic/pistol/darkpack/beretta/toreador name = "\improper Sword Series S 9mm" @@ -198,12 +199,13 @@ /obj/item/ammo_box/magazine/semi9mm name = "pistol magazine (9mm)" icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') icon_state = "semi9mm" ammo_type = /obj/item/ammo_casing/vampire/c9mm caliber = CALIBER_9MM max_ammo = 18 multiple_sprites = AMMO_BOX_FULL_EMPTY + custom_price = 200 /obj/item/ammo_box/magazine/semi9mm/toreador name = "custom pistol magazine (9mm)" @@ -213,7 +215,7 @@ /obj/item/ammo_box/magazine/darkpack9mm name = "uzi magazine (9mm)" icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') icon_state = "uzi" ammo_type = /obj/item/ammo_casing/vampire/c9mm caliber = CALIBER_9MM @@ -238,7 +240,7 @@ /obj/item/ammo_box/magazine/darkpack9mp5 name = "mp5 magazine (9mm)" icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') icon_state = "mp5" ammo_type = /obj/item/ammo_casing/vampire/c9mm caliber = CALIBER_9MM @@ -247,10 +249,10 @@ /obj/item/gun/ballistic/automatic/darkpack/mp5 name = "\improper HK MP5" - desc = "A lightweight, burst-fire submachine gun, for when you really want to do some dirty cool job. Uses 9mm rounds." + desc = "A lightweight submachine gun, for when you really want to do some dirty cool job. Uses 9mm rounds." icon_state = "mp5" icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') inhand_icon_state = "mp5" accepted_magazine_type = /obj/item/ammo_box/magazine/darkpack9mp5 burst_size = 4 @@ -261,10 +263,104 @@ rack_sound = 'sound/items/weapons/gun/pistol/slide_lock.ogg' fire_sound = 'modular_darkpack/modules/deprecated/sounds/mp5.ogg' +/obj/item/ammo_box/magazine/darkpack45smg + name = ".45 SMG magazine" + icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') + icon_state = "mac10" //uzi sprite placeholder + ammo_type = /obj/item/ammo_casing/vampire/c45acp + caliber = CALIBER_45 + max_ammo = 30 + multiple_sprites = AMMO_BOX_FULL_EMPTY + +/obj/item/gun/ballistic/automatic/darkpack/mac10 + name = "\improper Braddock .45" + desc = "A box filled with bullets. The high cyclic rate and low weight means it's only good for spraying and then praying. Uses .45 caliber rounds." + icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') + + icon_state = "mac10" + inhand_icon_state = "mac10" + accepted_magazine_type = /obj/item/ammo_box/magazine/darkpack45smg + burst_size = 7 //if any other gun has the same fire rate as this gun, increase this gun so its the new fastest + spread = 16 //spray and pray + burst_delay = 1 + recoil = 6 + bolt_type = BOLT_TYPE_OPEN + show_bolt_icon = FALSE + can_suppress = TRUE + mag_display = TRUE + rack_sound = 'sound/items/weapons/gun/pistol/slide_lock.ogg' + fire_sound = 'modular_darkpack/modules/weapons/sounds/mac10.ogg' // DARKPACK sound effect + + +/obj/item/ammo_box/magazine/darkpack45custom + name = ".45 custom magazine" + icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') + icon_state = "mac10" //uzi sprite placeholder + ammo_type = /obj/item/ammo_casing/vampire/c45acp + caliber = CALIBER_45 + max_ammo = 50 + multiple_sprites = AMMO_BOX_FULL_EMPTY + +/obj/item/gun/ballistic/automatic/darkpack/mac10/super + name = "\improper Cleaner Custom" + desc = "A .45 submachine gun with a suppressor installed on the tip, which helps balance it out when firing. Dark Blood magic has enabled the wire stock to be used" + icon = 'modular_darkpack/modules/deprecated/icons/64x32.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') + icon_state = "mac10_super" + recoil = 4 + spread = 8 //magic stock + suppressed = SUPPRESSED_QUIET + fire_sound = 'modular_darkpack/modules/weapons/sounds/mac10suppress.ogg' //mac-10 recording + suppressed_sound = 'modular_darkpack/modules/weapons/sounds/mac10suppress.ogg' + suppressed_volume = 70 + accepted_magazine_type = /obj/item/ammo_box/magazine/darkpack45custom + can_unsuppress = FALSE + +/obj/item/ammo_box/magazine/darkpack/c46pdw + name = "4.6mm MP7 magazine" + icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') + icon_state = "mp7" + ammo_type = /obj/item/ammo_casing/vampire/c46pdw + caliber = CALIBER_46 + max_ammo = 20 + multiple_sprites = AMMO_BOX_FULL_EMPTY + +/obj/item/ammo_box/magazine/darkpack/c46pdw/ext + name = "4.6mm MP7 extended magazine" + icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') + icon_state = "mp7" + ammo_type = /obj/item/ammo_casing/vampire/c46pdw + caliber = CALIBER_46 + max_ammo = 40 + multiple_sprites = AMMO_BOX_FULL_EMPTY + +/obj/item/gun/ballistic/automatic/darkpack/mp7 + name = "\improper HK MP7" + desc = "A Machine Pistol recently adopted by the German Military. Comes loaded with armor-piercing rounds, use responsibly." + icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') + + icon_state = "mp7" + inhand_icon_state = "mp7" + accepted_magazine_type = /obj/item/ammo_box/magazine/darkpack/c46pdw + burst_size = 3 + spread = 3 + recoil = 2 + bolt_type = BOLT_TYPE_LOCKING + show_bolt_icon = FALSE + mag_display = TRUE + rack_sound = 'sound/items/weapons/gun/pistol/slide_lock.ogg' + fire_sound = 'modular_darkpack/modules/deprecated/sounds/mp5.ogg' + /obj/item/ammo_box/magazine/darkpack556 name = "carbine magazine (5.56mm)" icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') icon_state = "rifle" ammo_type = /obj/item/ammo_casing/vampire/c556mm caliber = CALIBER_556 @@ -275,12 +371,13 @@ name = "rifle magazine (5.56mm)" icon_state = "hunt556" max_ammo = 20 + custom_price = 200 /obj/item/gun/ballistic/automatic/darkpack/ar15 - name = "\improper AR-15 Carbine" - desc = "A two-round burst 5.56 toploading carbine, designated 'AR-15'." + name = "\improper CAR-15 Carbine" + desc = "The black sexy assault rifle, designated 'CAR-15'." icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') icon_state = "rifle" inhand_icon_state = "rifle" worn_icon_state = "rifle" @@ -299,7 +396,7 @@ name = "hunting rifle" desc = "A semi-automatic hunting rifle, just like what your dad used to shoot. If your dad didn't go out to get milk, anyways." icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') worn_icon = 'icons/mob/clothing/back.dmi' icon_state = "huntrifle" inhand_icon_state = "huntrifle" @@ -314,11 +411,12 @@ mag_display = TRUE fire_sound = 'modular_darkpack/modules/deprecated/sounds/rifle.ogg' masquerade_violating = FALSE + custom_price = 2000 /obj/item/ammo_box/magazine/darkpack545 name = "rifle magazine (5.45mm)" icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') icon_state = "ak" ammo_type = /obj/item/ammo_casing/vampire/c545mm caliber = CALIBER_545 @@ -329,7 +427,7 @@ name = "\improper Kalashnikov's Automatic Rifle 74" desc = "Pretty old, but also easy fireable and cleanable by vodka.Uses 5.45 rounds." icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') worn_icon = 'icons/mob/clothing/back.dmi' icon_state = "ak74" inhand_icon_state = "ak74" @@ -349,7 +447,7 @@ /obj/item/ammo_box/magazine/darkpackaug name = "AUG magazine (5.56mm)" icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') icon_state = "aug" ammo_type = /obj/item/ammo_casing/vampire/c556mm caliber = CALIBER_556 @@ -358,9 +456,9 @@ /obj/item/gun/ballistic/automatic/darkpack/aug name = "\improper Steyr AUG-77" - desc = "A three-round burst 5.56 bullpup design, designated 'Steyr AUG-77'." + desc = "An Austrian 5.56 bullpup design, designated 'Steyr AUG-77'." icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') icon_state = "aug" inhand_icon_state = "aug" worn_icon_state = "aug" @@ -378,9 +476,9 @@ /obj/item/ammo_box/magazine/darkpackthompson name = "tommy gun magazine (.45 ACP)" - icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' icon_state = "thompson" - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') ammo_type = /obj/item/ammo_casing/vampire/c45acp caliber = CALIBER_45 max_ammo = 50 @@ -390,7 +488,7 @@ name = "\improper Thompson Submachine Gun" desc = "\"Mamma-mia, Mercurio! Yu shot 'im in da head, he can't speek now! Yu guappo, Mercurio, yu naturale guappo!\"" icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') icon_state = "thompson" inhand_icon_state = "thompson" w_class = WEIGHT_CLASS_NORMAL @@ -417,7 +515,7 @@ name = "sniper rifle" desc = "A long ranged weapon that does significant damage. No, you can't quickscope." icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') icon_state = "sniper" inhand_icon_state = "sniper" worn_icon_state = "sniper" @@ -444,6 +542,37 @@ actions_types = list() masquerade_violating = TRUE + +/obj/item/gun/ballistic/automatic/darkpack/autosniper //just a test, do not spawn + name = "auto-sniper rifle" + desc = "A semi-automatic marksman rifle. This particular model is very popular in video games as of late." + icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') + icon_state = "psg1" + inhand_icon_state = "psg1" + worn_icon_state = "sniper" + w_class = WEIGHT_CLASS_BULKY + accepted_magazine_type = /obj/item/ammo_box/magazine/darkpack556 //placeholder + bolt_wording = "bolt" + bolt_type = BOLT_TYPE_LOCKING + semi_auto = TRUE + + //zoomable = TRUE + //zoom_amt = 4 //It's known for having a shitty scope + //zoom_out_amt = 1 + + fire_sound = 'modular_darkpack/modules/deprecated/sounds/sniper.ogg' + fire_sound_volume = 90 + tac_reloads = TRUE + burst_size = 1 + fire_delay = 5 + spread = 2 + w_class = WEIGHT_CLASS_NORMAL + slot_flags = ITEM_SLOT_BACK + projectile_damage_multiplier = 1.5 + actions_types = list() + masquerade_violating = TRUE + /obj/item/ammo_box/magazine/internal/vampshotgun name = "shotgun internal magazine" ammo_type = /obj/item/ammo_casing/vampire/c12g @@ -459,7 +588,7 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_guns.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') w_class = WEIGHT_CLASS_BULKY icon_state = "pomp" inhand_icon_state = "pomp" @@ -472,11 +601,12 @@ recoil = 4 inhand_x_dimension = 32 inhand_y_dimension = 32 + custom_price = 1000 /obj/item/ammo_box/magazine/darkpackautoshot name = "shotgun magazine (12ga)" icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi') icon_state = "spas15" ammo_type = /obj/item/ammo_casing/vampire/c12g/buck caliber = CALIBER_SHOTGUN @@ -487,7 +617,7 @@ name = "\improper Jaegerspas-XV" desc = "A semi-automatic shotgun. It looks more like an assault rifle than a shotgun and fires at a deadly pace." icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') icon_state = "spas15" inhand_icon_state = "spas15" worn_icon_state = "rifle" @@ -511,7 +641,7 @@ icon = 'modular_darkpack/modules/deprecated/icons/48x32.dmi' lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') icon_state = "crossbow0" inhand_icon_state = "crossbow0" fire_delay = 16 diff --git a/modular_darkpack/modules/weapons/code/hardcase.dm b/modular_darkpack/modules/weapons/code/hardcase.dm new file mode 100644 index 000000000000..3ad47d38ef51 --- /dev/null +++ b/modular_darkpack/modules/weapons/code/hardcase.dm @@ -0,0 +1,38 @@ +/obj/item/storage/fancy/hardcase + name = "magazine hardcase" + desc = "A small metal hardcase designed to carry magazines." + icon = 'modular_darkpack/modules/weapons/icons/storage.dmi' + icon_state = "hardcasebox" + base_icon_state = "hardcasebox" + inhand_icon_state = "ammobox" + lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + + obj_flags = CONDUCTS_ELECTRICITY + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*5) + + storage_type = /datum/storage/hardcase + spawn_count = 4 + +/datum/storage/hardcase + max_slots = 4 + // screen_max_columns = 4 // DARKPACK TODO - GRIDVENTORY + // screen_max_rows = 4 // DARKPACK TODO - GRIDVENTORY + +/datum/storage/hardcase/New(atom/parent, max_slots, max_specific_storage, max_total_storage, rustle_sound, remove_rustle_sound) + . = ..() + // Old behavoir restricted to only the spawn_type mag. Changed to be any mag. + set_holdable(/obj/item/ammo_box/magazine) + +/obj/item/storage/fancy/hardcase/mag_556 + name = "5.56 magazine hardcase" + desc = "A small metal hardcase specifically designed to carry 5.56 magazines." + spawn_type = /obj/item/ammo_box/magazine/darkpack556 + +/obj/item/storage/fancy/hardcase/mag_mp5 + name = "mp5 magazine hardcase" + desc = "A small metal hardcase specifically designed to carry mp5 magazines." + spawn_type = /obj/item/ammo_box/magazine/darkpack9mp5 + diff --git a/modular_darkpack/modules/weapons/code/melee.dm b/modular_darkpack/modules/weapons/code/melee.dm index 7cdafb93394a..3c2d839afd22 100644 --- a/modular_darkpack/modules/weapons/code/melee.dm +++ b/modular_darkpack/modules/weapons/code/melee.dm @@ -2,8 +2,9 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') var/quieted = FALSE + custom_price = 1000 /obj/item/melee/vamp/Initialize(mapload) @@ -18,8 +19,9 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') pixel_w = -8 + custom_price = 1800 /obj/item/katana/vamp name = "katana" @@ -28,7 +30,7 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') pixel_w = -8 /obj/item/katana/vamp/Initialize(mapload) @@ -83,7 +85,7 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') icon_state = "rapier" @@ -99,11 +101,12 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') icon_state = "machete" inhand_icon_state = "machete" pixel_w = -8 masquerade_violating = FALSE + custom_price = 500 /obj/item/claymore/machete/Initialize(mapload) . = ..() @@ -116,12 +119,18 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') icon_state = "sabre" + var/value = 1000 // DARKPACK TODO: Move this up at some point. I hate the selling component with all my heart. /obj/item/melee/sabre/vamp/Initialize(mapload) . = ..() - AddComponent(/datum/component/selling, 1000, "sabre", FALSE) + AddComponent(/datum/component/selling, value, "sabre", FALSE) + +/obj/item/melee/sabre/vamp/training + name = "foam sabre" + force = 0 + value = 3 /obj/item/claymore/longsword name = "longsword" @@ -130,7 +139,7 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') icon_state = "longsword" inhand_icon_state = "longsword" @@ -139,6 +148,35 @@ . = ..() AddComponent(/datum/component/selling, 600, "longsword", FALSE) +/obj/item/claymore/longsword/keeper + name = "The Brother's Keeper" + desc = "The ancient yet classic weapon of times gone, this is a longsword. This exemplar is surprisingly well taken care of, despite its age, to the point that whatever blood or vitae it may have drawn in the past is not visible at all, while still functioning as well as it first did however long ago. Upon the flat side of this blade, a simple well-worn inscription is engraved in Latin. 'In Death, I Rise.'" + color = "#C0C0C0" + w_class = WEIGHT_CLASS_BULKY + force = 50 + block_chance = 45 + armour_penetration = 40 + sharpness = SHARP_EDGED + attack_verb_continuous = list("slashes", "cuts") + attack_verb_simple = list("slash", "cut") + hitsound = 'sound/items/weapons/rapierhit.ogg' + wound_bonus = 5 + resistance_flags = FIRE_PROOF + masquerade_violating = FALSE + //is_iron = FALSE DARKPACK TODO - Kiasyd + +/obj/item/claymore/longsword/keeper/afterattack(atom/target, mob/living/carbon/user, proximity) + . = ..() + /* DARKPACK TODO - WEREWOLF - (this is a silver longsword) + if(iswerewolf(target) || isgarou(target) && proximity) + var/mob/living/carbon/M = target + if(M.auspice.gnosis) + if(prob(50)) + adjust_gnosis(-1, M) + + M.apply_damage(25, CLONE) + M.apply_status_effect(STATUS_EFFECT_SILVER_SLOWDOWN) + */ /obj/item/melee/baseball_bat/vamp name = "baseball bat" @@ -147,9 +185,10 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') icon_state = "baseball" inhand_icon_state = "baseball" + custom_price = 50 /obj/item/melee/baseball_bat/vamp/Initialize(mapload) . = ..() @@ -168,7 +207,7 @@ desc = "Can be used as a tool or as a weapon." icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi' icon_state = "pipe" - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') force = 20 wound_bonus = 10 throwforce = 10 @@ -186,33 +225,24 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') + custom_price = 85 -/obj/item/knife/vamp/gangrel - name = "claws" - icon_state = "gangrel" - w_class = WEIGHT_CLASS_BULKY - force = 6 - armour_penetration = 100 //It's magical damage - block_chance = 20 - item_flags = DROPDEL - masquerade_violating = TRUE - obj_flags = NONE - -/obj/item/knife/vamp/gangrel/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) - if(isliving(target)) - var/mob/living/L = target - L.apply_damage(30, AGGRAVATED) - -/obj/item/knife/vamp/gangrel/lasombra +/obj/item/knife/vamp/lasombra_tentacle name = "shadow tentacle" force = 7 armour_penetration = 100 block_chance = 0 icon_state = "lasombra" + item_flags = DROPDEL masquerade_violating = TRUE + obj_flags = NONE -/obj/item/knife/vamp/gangrel/lasombra/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) +/obj/item/knife/vamp/lasombra_tentacle/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, INNATE_TRAIT) + +/obj/item/knife/vamp/lasombra_tentacle/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(isliving(target)) var/mob/living/L = target L.apply_damage(16, AGGRAVATED) @@ -223,7 +253,7 @@ desc = "Reap what they have sowed." icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi' icon_state = "handsickle" - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') force = 30 wound_bonus = -5 throwforce = 15 @@ -251,16 +281,12 @@ if(isliving(target)) var/mob/living/L = target L.AdjustKnockdown(4 SECONDS) - L.adjustStaminaLoss(50) + L.adjust_stamina_loss(50) L.Immobilize(3 SECONDS) if(L.body_position != LYING_DOWN) L.toggle_resting() return ..() -/obj/item/knife/vamp/gangrel/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT(type)) - /obj/item/chainsaw/vamp name = "chainsaw" desc = "A versatile power tool. Useful for limbing trees and delimbing humans." @@ -268,49 +294,8 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - -/obj/item/vampire_stake - name = "stake" - desc = "Paralyzes blank-bodies if aimed straight to the heart." - icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi' - worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - icon_state = "stake" - force = 10 -// wound_bonus = -10 - throwforce = 10 - attack_verb_continuous = list("pierces", "cuts") - attack_verb_simple = list("pierce", "cut") - hitsound = 'sound/items/weapons/bladeslice.ogg' - armour_penetration = 50 - sharpness = SHARP_EDGED - w_class = WEIGHT_CLASS_SMALL - custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) - -/obj/item/vampire_stake/attack(mob/living/target, mob/living/user) - . = ..() - if(HAS_TRAIT(user, TRAIT_PACIFISM)) - return - // TODO: [Rebase] reimplement werewolfs - /* - if(isgarou(target) || iswerewolf(target) || isanimal(target)) - return - */ - if(target.IsParalyzed() || target.IsKnockdown() || target.IsStun()) - return - if(!target.IsParalyzed() && iskindred(target) && !target.stakeimmune) - if(HAS_TRAIT(target, TRAIT_STAKE_RESISTANT)) - visible_message(span_warning("[user]'s stake splinters as it touches [target]'s heart!"), span_warning("Your stake splinters as it touches [target]'s heart!")) - REMOVE_TRAIT(target, TRAIT_STAKE_RESISTANT, MAGIC_TRAIT) - qdel(src) - else - visible_message(span_warning("[user] aims [src] straight to the [target]'s heart!"), span_warning("You aim [src] straight to the [target]'s heart!")) - if(do_after(user, 20, target)) - user.do_attack_animation(target) - visible_message(span_warning("[user] pierces [target]'s torso!"), span_warning("You pierce [target]'s torso!")) - target.Paralyze(1200) - target.Sleeping(1200) - qdel(src) + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') + custom_price = 2000 /obj/item/shovel/vamp name = "shovel" @@ -319,8 +304,9 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') icon_state = "shovel" + custom_price = 150 /obj/item/scythe/vamp name = "scythe" @@ -329,9 +315,10 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') icon_state = "kosa" inhand_icon_state = "kosa" + w_class = WEIGHT_CLASS_NORMAL /obj/item/instrument/eguitar/vamp name = "electric guitar" @@ -340,7 +327,7 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') icon_state = "rock0" inhand_icon_state = "rock0" @@ -358,7 +345,7 @@ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') /obj/item/melee/vamp/brick name = "Brick" @@ -367,7 +354,7 @@ icon_state = "red_brick" lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') w_class = WEIGHT_CLASS_NORMAL armour_penetration = 0 throwforce = 15 @@ -395,3 +382,32 @@ hitsound = 'sound/items/weapons/genhit1.ogg' //grid_width = 1 GRID_BOXES //grid_height = 1 GRID_BOXES + +//this should be a subtype of spear in the future but we lack the sprites +/obj/item/darkpack/spear + name = "spear" + desc = "A staple of warfare through centuries, the spear is great for poking at things." + icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi' + icon_state = "spear" + lefthand_file = 'modular_darkpack/modules/weapons/icons/melee_lefthand.dmi' + righthand_file = 'modular_darkpack/modules/weapons/icons/melee_righthand.dmi' + worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' + force = 45 + throwforce = 10 + w_class = WEIGHT_CLASS_BULKY + slot_flags = ITEM_SLOT_BACK + block_chance = 20 + armour_penetration = 60 + sharpness = SHARP_POINTY + attack_verb_continuous = list("stabs", "pokes") + attack_verb_simple = list("stab", "poke") + hitsound = 'sound/items/weapons/rapierhit.ogg' + wound_bonus = 5 + resistance_flags = FIRE_PROOF + masquerade_violating = FALSE + custom_price = 1200 + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') // DARKPACK EDIT ADD + +/obj/item/darkpack/spear/Initialize() + . = ..() + AddComponent(/datum/component/selling, 400, "spear", FALSE) diff --git a/modular_darkpack/modules/weapons/code/pliers.dm b/modular_darkpack/modules/weapons/code/pliers.dm new file mode 100644 index 000000000000..d31ad116ecf3 --- /dev/null +++ b/modular_darkpack/modules/weapons/code/pliers.dm @@ -0,0 +1,45 @@ +/obj/item/wirecutters/pliers + name = "dental pliers" + desc = "Meant for taking out teeth." + icon = 'modular_darkpack/modules/weapons/icons/pliers.dmi' + icon_state = "neat_ripper" + lefthand_file = 'modular_darkpack/modules/weapons/icons/melee_lefthand.dmi' + righthand_file = 'modular_darkpack/modules/weapons/icons/melee_righthand.dmi' + onflooricon_state = "neat_ripper" + inhand_icon_state = "neat_ripper" + toolspeed = 2 //isn't meant for cutting wires + /// If pulling fangs lasts for the entire ROUND or not. + var/permanent = TRUE + slot_flags = NONE + +/obj/item/wirecutters/pliers/bad_pliers + name = "pliers" + desc = "Meant for pulling wires but you could definetly crush something with these." + icon_state = "ripper" + onflooricon_state = "ripper" + inhand_icon_state = "ripper" + toolspeed = 1.2 //is an actual tool but can't actually cut + permanent = FALSE + +/obj/item/wirecutters/pliers/attack(mob/living/target, mob/living/user) + . = ..() + /* DARKPACK TODO - Merits/Flaws related to feeding + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + return + if(HAS_TRAIT(target, TRAIT_BABY_TEETH)) + visible_message(usr, span_warning("[user] can't pull out the canines of [target] because they are already deformed!")) + else + user.visible_message(span_warning("[user] takes [src] straight to the [target]'s canines!"), span_warning("You take [src] straight to the [target]'s canines!")) + if(!do_after(user, 30, target)) + return + user.do_attack_animation(target) + user.visible_message(span_warning("[user] rips out [target]'s canines!"), span_warning("You rip out [target]'s canines!")) + target.emote("scream") + if(target.has_quirk(/datum/quirk/permafangs)) + REMOVE_TRAIT(target, TRAIT_PERMAFANGS, ROUNDSTART_TRAIT) + if (permanent == TRUE) + target.apply_status_effect(STATUS_EFFECT_SEVERE_BABY_TEETH) + visible_message(span_warning("[user] stuff's in Bone putty into [target] to stop their canines from regrowing!")) + else + target.apply_status_effect(STATUS_EFFECT_BABY_TEETH) + */ diff --git a/modular_darkpack/modules/weapons/code/sheath.dm b/modular_darkpack/modules/weapons/code/sheath.dm index ad607e6a6655..e4386538fca6 100644 --- a/modular_darkpack/modules/weapons/code/sheath.dm +++ b/modular_darkpack/modules/weapons/code/sheath.dm @@ -1,12 +1,15 @@ /obj/item/storage/belt/sheath/vamp + name = "sheath" icon_state = "longsword_sheathe-full" + base_icon_state = "longsword_sheathe" worn_icon_state = "longsword_sheathe" //inhand_icon_state = "longsword_sheathe" icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi' //lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi' //righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi' worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') + ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') + custom_price = 1200 /obj/item/storage/belt/sheath/vamp/sabre desc = "An ornate sheath designed to hold an officer's blade." @@ -16,6 +19,7 @@ //inhand_icon_state = "sabre_sheathe" storage_type = /datum/storage/sabre_belt_vamp stored_blade = /obj/item/melee/sabre/vamp + custom_price = 1400 /obj/item/storage/belt/sheath/vamp/rapier desc = "An ornate sheath designed to hold a duelist's blade." @@ -34,6 +38,7 @@ //inhand_icon_state = "longsword_sheathe" storage_type = /datum/storage/sword_belt_vamp stored_blade = /obj/item/claymore/longsword + custom_price = 1600 /datum/storage/sabre_belt_vamp diff --git a/modular_darkpack/modules/weapons/code/stake.dm b/modular_darkpack/modules/weapons/code/stake.dm new file mode 100644 index 000000000000..4fd362479603 --- /dev/null +++ b/modular_darkpack/modules/weapons/code/stake.dm @@ -0,0 +1,70 @@ +/obj/item/vampire_stake + name = "stake" + desc = "Paralyzes blank-bodies if aimed straight to the heart." + icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi' + worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi' + icon_state = "stake" + force = 10 + throwforce = 10 + attack_verb_continuous = list("pierces", "cuts") + attack_verb_simple = list("pierce", "cut") + hitsound = 'sound/items/weapons/bladeslice.ogg' + armour_penetration = 50 + sharpness = SHARP_POINTY + w_class = WEIGHT_CLASS_SMALL + custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2) + custom_price = 100 + +/obj/item/vampire_stake/attack(mob/living/target, mob/living/user) + . = ..() + if(.) + return TRUE + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + return TRUE + + if(HAS_TRAIT(target, TRAIT_STAKE_IMMUNE) || HAS_TRAIT(target, TRAIT_STAKE_RESISTANT)) + visible_message(span_warning("[user]'s stake splinters as it touches [target]'s heart!"), span_warning("Your stake splinters as it touches [target]'s heart!")) + REMOVE_TRAIT(target, TRAIT_STAKE_RESISTANT, MAGIC_TRAIT) + qdel(src) + return TRUE + + visible_message(span_danger("[user] aims [src] straight to the [target]'s heart!"), span_danger("You aim [src] straight to the [target]'s heart!")) + if(!do_after(user, 1 TURNS, target)) + return TRUE + user.do_attack_animation(target) + visible_message(span_danger("[user] pierces [target]'s torso!"), span_danger("You pierce [target]'s torso!")) + + user.do_attack_animation(target, used_item = src) + var/datum/embedding/stake/embed = get_embed() + if(!istype(embed)) + embed = set_embed(/datum/embedding/stake) + force_embed(target, target.get_bodypart(BODY_ZONE_CHEST)) + return TRUE + +/datum/embedding/stake + embed_chance = 1 + fall_chance = 0 + pain_chance = 0 + jostle_chance = 0 + pain_mult = 0 + jostle_pain_mult = 0 + rip_time = 1 TURNS + ignore_throwspeed_threshold = TRUE + immune_traits = list(TRAIT_STAKE_RESISTANT, TRAIT_STAKE_IMMUNE) + +/datum/embedding/stake/set_owner(mob/living/carbon/victim, obj/item/bodypart/target_limb) + . = ..() + ADD_TRAIT(owner, TRAIT_STAKED, STAKE_TRAIT) + +/datum/embedding/stake/stop_embedding() + REMOVE_TRAIT(owner, TRAIT_STAKED, STAKE_TRAIT) + return ..() + +/datum/embedding/stake/can_embed(atom/movable/source, mob/living/carbon/victim, hit_zone, datum/thrownthing/throwingdatum) + . = ..() + if (!.) + return + var/obj/item/bodypart/affecting = victim.get_bodypart(hit_zone) || victim.bodyparts[1] + if (!IS_ORGANIC_LIMB(affecting)) + return FALSE + return TRUE diff --git a/modular_darkpack/modules/weapons/code/throwing.dm b/modular_darkpack/modules/weapons/code/throwing.dm deleted file mode 100644 index bc24d6df94dc..000000000000 --- a/modular_darkpack/modules/weapons/code/throwing.dm +++ /dev/null @@ -1,39 +0,0 @@ -/obj/item/molotov - name = "molotov cocktail" - desc = "Well fire weapon." - icon_state = "molotov" - icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/deprecated/icons/onfloor.dmi') - w_class = WEIGHT_CLASS_SMALL - masquerade_violating = TRUE - var/active = FALSE - var/explode_timer - -/obj/item/molotov/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - . = ..() - explode() - -/obj/item/molotov/attackby(obj/item/I, mob/user, params) - if(I.get_temperature() && !active) - activate() - -/obj/item/molotov/proc/activate(mob/user) - active = TRUE - log_bomber(user, "has primed a", src, "for detonation") - icon_state = "molotov_flamed" - - explode_timer = addtimer(CALLBACK(src, PROC_REF(explode)), rand(15 SECONDS, 45 SECONDS), TIMER_STOPPABLE | TIMER_DELETE_ME) - -/obj/item/molotov/proc/explode() - deltimer(explode_timer) - - var/atom/explode_location = get_turf(src) - - for(var/turf/open/floor/floor in range(2, explode_location)) - new /obj/effect/decal/cleanable/gasoline(floor) - - if(active) - new /obj/effect/fire(explode_location) - - playsound(explode_location, 'modular_darkpack/modules/deprecated/sounds/explode.ogg', 100, TRUE) - qdel(src) diff --git a/modular_darkpack/modules/weapons/icons/ammo.dmi b/modular_darkpack/modules/weapons/icons/ammo.dmi index 7ccf69ede5e1..23a96d75cd2e 100644 Binary files a/modular_darkpack/modules/weapons/icons/ammo.dmi and b/modular_darkpack/modules/weapons/icons/ammo.dmi differ diff --git a/modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi b/modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi new file mode 100644 index 000000000000..757282384b2c Binary files /dev/null and b/modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi differ diff --git a/modular_darkpack/modules/weapons/icons/melee_lefthand.dmi b/modular_darkpack/modules/weapons/icons/melee_lefthand.dmi new file mode 100644 index 000000000000..41636cffaa3a Binary files /dev/null and b/modular_darkpack/modules/weapons/icons/melee_lefthand.dmi differ diff --git a/modular_darkpack/modules/weapons/icons/melee_righthand.dmi b/modular_darkpack/modules/weapons/icons/melee_righthand.dmi new file mode 100644 index 000000000000..3b872170253f Binary files /dev/null and b/modular_darkpack/modules/weapons/icons/melee_righthand.dmi differ diff --git a/modular_darkpack/modules/weapons/icons/pliers.dmi b/modular_darkpack/modules/weapons/icons/pliers.dmi new file mode 100644 index 000000000000..478a65ff0464 Binary files /dev/null and b/modular_darkpack/modules/weapons/icons/pliers.dmi differ diff --git a/modular_darkpack/modules/weapons/icons/storage.dmi b/modular_darkpack/modules/weapons/icons/storage.dmi new file mode 100644 index 000000000000..b1f2a4ebfcc3 Binary files /dev/null and b/modular_darkpack/modules/weapons/icons/storage.dmi differ diff --git a/modular_darkpack/modules/weapons/icons/weapons.dmi b/modular_darkpack/modules/weapons/icons/weapons.dmi index b614b6504a76..febd40a6da78 100644 Binary files a/modular_darkpack/modules/weapons/icons/weapons.dmi and b/modular_darkpack/modules/weapons/icons/weapons.dmi differ diff --git a/modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi b/modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi new file mode 100644 index 000000000000..def44050ee79 Binary files /dev/null and b/modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi differ diff --git a/modular_darkpack/modules/weapons/icons/worn_melee.dmi b/modular_darkpack/modules/weapons/icons/worn_melee.dmi index 86e98ee61a18..12c8f1edb932 100644 Binary files a/modular_darkpack/modules/weapons/icons/worn_melee.dmi and b/modular_darkpack/modules/weapons/icons/worn_melee.dmi differ diff --git a/modular_darkpack/modules/weapons/readme.md b/modular_darkpack/modules/weapons/readme.md new file mode 100644 index 000000000000..9b8464ad7dc6 --- /dev/null +++ b/modular_darkpack/modules/weapons/readme.md @@ -0,0 +1,43 @@ +<!-- This should be copy-pasted into the root of your module folder as readme.md --> + +https://github.com/NovaSector/NovaSector/pull/<!--PR Number--> + +## \<Weapons> <!--Title of your addition.--> + +Module ID: WEAPONS<!-- Uppercase, UNDERSCORE_CONNECTED name of your module, that you use to mark files. This is so people can case-sensitive search for your edits, if any. --> + +### Description: +This module is should really be split into guns and melee. +<!-- Here, try to describe what your PR does, what features it provides and any other directly useful information. --> + +### TG Proc/File Changes: + +- N/A +<!-- If you edited any core procs, you should list them here. You should specify the files and procs you changed. +E.g: +- `code/modules/mob/living.dm`: `proc/overriden_proc`, `var/overriden_var` + --> + +### Modular Overrides: + +- N/A +<!-- If you added a new modular override (file or code-wise) for your module, you should list it here. Code files should specify what procs they changed, in case of multiple modules using the same file. +E.g: +- `modular_nova/master_files/sound/my_cool_sound.ogg` +- `modular_nova/master_files/code/my_modular_override.dm`: `proc/overriden_proc`, `var/overriden_var` + --> + +### Defines: + +- N/A +<!-- If you needed to add any defines, mention the files you added those defines in, along with the name of the defines. --> + +### Included files that are not contained in this module: + +- N/A +<!-- Likewise, be it a non-modular file or a modular one that's not contained within the folder belonging to this specific module, it should be mentioned here. Good examples are icons or sounds that are used between multiple modules, or other such edge-cases. --> + +### Credits: + +FalloutFalcon, Teragenic +<!-- Here go the credits to you, dear coder, and in case of collaborative work or ports, credits to the original source of the code. --> diff --git a/modular_darkpack/modules/weapons/sounds/mac10.ogg b/modular_darkpack/modules/weapons/sounds/mac10.ogg new file mode 100644 index 000000000000..d212868dd238 Binary files /dev/null and b/modular_darkpack/modules/weapons/sounds/mac10.ogg differ diff --git a/modular_darkpack/modules/weapons/sounds/mac10suppress.ogg b/modular_darkpack/modules/weapons/sounds/mac10suppress.ogg new file mode 100644 index 000000000000..354d94ad46fb Binary files /dev/null and b/modular_darkpack/modules/weapons/sounds/mac10suppress.ogg differ diff --git a/modular_darkpack/modules/weather/code/effects.dm b/modular_darkpack/modules/weather/code/effects.dm new file mode 100644 index 000000000000..e4d9b90174cf --- /dev/null +++ b/modular_darkpack/modules/weather/code/effects.dm @@ -0,0 +1,104 @@ +GLOBAL_LIST_EMPTY(rain_list) +GLOBAL_LIST_EMPTY(fog_list) +GLOBAL_LIST_EMPTY(snow_list) + +/obj/effect/realistic_fog + // Smaller sprite so you can use it in mapping without it sucking + icon = 'modular_darkpack/modules/weather/icons/fog.dmi' + icon_state = MAP_SWITCH("fog", "helper") + alpha = 0 + plane = GAME_PLANE + layer = SPACEVINE_LAYER + anchored = TRUE + density = FALSE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + pixel_w = -112 + pixel_z = -112 + var/alpha_lower = 5 + var/alpha_upper = 21 + +/obj/effect/realistic_fog/dense + alpha_lower = 10 + alpha_upper = 40 + +/obj/effect/realistic_fog/dense/strong + name = "very dense fog" + alpha_lower = 20 + alpha_upper = 80 + +/obj/effect/realistic_fog/dense/extreme + name = "extremely dense fog" + alpha_lower = 60 + alpha_upper = 252 // alpha_lower*4.2 + +/obj/effect/realistic_fog/Initialize(mapload) + . = ..() + animate(src, pixel_x = rand(-96, 96), pixel_y = rand(-96, 96), alpha = rand(alpha_lower, alpha_upper), transform = matrix()*rand(1, 3), transform = turn(matrix(), rand(0, 360)), time = rand(100, 200), loop = -1) + animate(transform = null, pixel_x = 0, pixel_y = 0, alpha = rand(alpha_lower, alpha_upper), time = rand(100, 200)) + +/obj/effect/realistic_fog/Destroy(force) + GLOB.fog_list -= src + . = ..() + +/obj/effect/new_rain + icon = 'modular_darkpack/modules/weather/icons/newweather.dmi' + icon_state = "rain1" + alpha = 0 + layer = ABOVE_ALL_MOB_LAYER + anchored = TRUE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + pixel_w = -16 + pixel_z = -32 + +/obj/effect/new_rain/Initialize(mapload) + . = ..() + icon_state = "rain[rand(1, 15)]" + var/matrix/M = new + M.Scale(0.5, 0.5) + transform = M + animate(src, alpha = 64, time = 30) + +/obj/effect/new_rain/Destroy(force) + GLOB.rain_list -= src + . = ..() + +/obj/effect/new_rain/Cross(atom/movable/crossed_atom) + . = ..() + if(isitem(crossed_atom) || isliving(crossed_atom)) + crossed_atom.wash(CLEAN_WASH) + +/obj/effect/new_snow + icon = 'modular_darkpack/modules/weather/icons/newweather.dmi' + icon_state = "snow1" + alpha = 0 + layer = ABOVE_ALL_MOB_LAYER + anchored = TRUE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + pixel_w = -16 + +/obj/effect/new_snow/Initialize(mapload) + . = ..() + icon_state = "snow[rand(1, 15)]" + animate(src, alpha = 128, time = 30) + +/obj/effect/new_snow/Destroy(force) + GLOB.snow_list -= src + . = ..() + +/area/proc/fog_setup() + for(var/turf/open/O in src) + var/obj/effect/realistic_fog/F = new(O) + GLOB.fog_list += F + CHECK_TICK // All of these are admin proc calls atm so this is fine. If its moved to any type of subsystem remove this + +/area/proc/rain_setup() + for(var/turf/open/O in src) + var/obj/effect/new_rain/R = new(O) + GLOB.rain_list += R + CHECK_TICK // All of these are admin proc calls atm so this is fine. If its moved to any type of subsystem remove this + +/area/proc/snow_setup() + for(var/turf/open/O in src) + var/obj/effect/new_snow/S = new(O) + GLOB.snow_list += S + CHECK_TICK // All of these are admin proc calls atm so this is fine. If its moved to any type of subsystem remove this diff --git a/modular_darkpack/modules/weather/code/weather.dm b/modular_darkpack/modules/weather/code/weather.dm index c95f35c880f8..fe22ba166763 100644 --- a/modular_darkpack/modules/weather/code/weather.dm +++ b/modular_darkpack/modules/weather/code/weather.dm @@ -1,10 +1,18 @@ +// Everything here should be worked into /datum/weather +GLOBAL_LIST_EMPTY(managed_weather) + +#define WEATHER_CLEAR "Clear" +#define WEATHER_RAIN "Rain" +#define WEATHER_SNOW "Snow" +#define WEATHER_FOG "Fog" + SUBSYSTEM_DEF(cityweather) name = "City Weather" init_order = INIT_ORDER_DEFAULT - wait = 600 + wait = 60 SECONDS priority = FIRE_PRIORITY_DEFAULT - var/current_weather = "Clear" //"Clear", "Rain" and "Fog" + var/current_weather = WEATHER_CLEAR //"Clear", "Rain" and "Fog" var/list/forecast = list() var/raining = FALSE var/fogging = FALSE @@ -38,37 +46,37 @@ SUBSYSTEM_DEF(cityweather) if(forecast[cityhour] != current_weather) current_weather = forecast[cityhour] switch(forecast[cityhour]) - if("Clear") + if(WEATHER_CLEAR) to_chat(world, "The night sky becomes clear...") if(raining) - for(var/obj/effect/vamp_weather/V in GLOB.rain_suka) + for(var/obj/effect/weather_manager/V in GLOB.managed_weather) V.invisibility = INVISIBILITY_MAXIMUM animate(V, transform = null, pixel_w = 0, pixel_z = 0, alpha = 255) raining = FALSE if(fogging) - for(var/obj/effect/vamp_weather/V in GLOB.rain_suka) + for(var/obj/effect/weather_manager/V in GLOB.managed_weather) V.invisibility = INVISIBILITY_MAXIMUM animate(V, transform = null, pixel_w = 0, pixel_z = 0, alpha = 255) fogging = FALSE if(snowing) - for(var/obj/effect/vamp_weather/V in GLOB.rain_suka) + for(var/obj/effect/weather_manager/V in GLOB.managed_weather) V.invisibility = INVISIBILITY_MAXIMUM animate(V, transform = null, pixel_w = 0, pixel_z = 0, alpha = 255) snowing = FALSE - if("Rain") + if(WEATHER_RAIN) to_chat(world, "Clouds are uniting on the sky, small raindrops irrigate the city...") raining = TRUE if(fogging) - for(var/obj/effect/vamp_weather/V in GLOB.rain_suka) + for(var/obj/effect/weather_manager/V in GLOB.managed_weather) V.invisibility = INVISIBILITY_MAXIMUM animate(V, transform = null, pixel_w = 0, pixel_z = 0, alpha = 255) fogging = FALSE if(snowing) - for(var/obj/effect/vamp_weather/V in GLOB.rain_suka) + for(var/obj/effect/weather_manager/V in GLOB.managed_weather) V.invisibility = INVISIBILITY_MAXIMUM animate(V, transform = null, pixel_w = 0, pixel_z = 0, alpha = 255) snowing = FALSE - for(var/obj/effect/vamp_weather/V in GLOB.rain_suka) + for(var/obj/effect/weather_manager/V in GLOB.managed_weather) V.invisibility = 0 animate(V, transform = null, pixel_w = 0, pixel_z = 0, alpha = 255) V.layer = SPACEVINE_LAYER @@ -80,20 +88,20 @@ SUBSYSTEM_DEF(cityweather) var/matrix/M = new M.Scale(0.5, 0.5) V.transform = M - if("Snow") + if(WEATHER_SNOW) to_chat(world, "Clouds are uniting on the sky, small snowflakes irrigate the city...") if(raining) - for(var/obj/effect/vamp_weather/V in GLOB.rain_suka) + for(var/obj/effect/weather_manager/V in GLOB.managed_weather) V.invisibility = INVISIBILITY_MAXIMUM animate(V, transform = null, pixel_w = 0, pixel_z = 0, alpha = 255) raining = FALSE if(fogging) - for(var/obj/effect/vamp_weather/V in GLOB.rain_suka) + for(var/obj/effect/weather_manager/V in GLOB.managed_weather) V.invisibility = INVISIBILITY_MAXIMUM animate(V, transform = null, pixel_w = 0, pixel_z = 0, alpha = 255) fogging = FALSE snowing = TRUE - for(var/obj/effect/vamp_weather/V in GLOB.rain_suka) + for(var/obj/effect/weather_manager/V in GLOB.managed_weather) V.invisibility = 0 animate(V, transform = null, pixel_w = 0, pixel_z = 0, alpha = 255) V.layer = SPACEVINE_LAYER @@ -102,20 +110,20 @@ SUBSYSTEM_DEF(cityweather) V.icon_state = "snow[rand(1, 15)]" V.pixel_w = -16 V.pixel_z = 0 - if("Fog") + if(WEATHER_FOG) to_chat(world, "Visibility range quickly decreases...") if(raining) - for(var/obj/effect/vamp_weather/V in GLOB.rain_suka) + for(var/obj/effect/weather_manager/V in GLOB.managed_weather) V.invisibility = INVISIBILITY_MAXIMUM animate(V, transform = null, pixel_w = 0, pixel_z = 0, alpha = 255) raining = FALSE fogging = TRUE if(snowing) - for(var/obj/effect/vamp_weather/V in GLOB.rain_suka) + for(var/obj/effect/weather_manager/V in GLOB.managed_weather) V.invisibility = INVISIBILITY_MAXIMUM animate(V, transform = null, pixel_w = 0, pixel_z = 0, alpha = 255) snowing = FALSE - for(var/obj/effect/vamp_weather/V in GLOB.rain_suka) + for(var/obj/effect/weather_manager/V in GLOB.managed_weather) V.invisibility = 0 animate(V, transform = null, pixel_w = 0, pixel_z = 0, alpha = 255) V.layer = SPACEVINE_LAYER @@ -134,13 +142,13 @@ SUBSYSTEM_DEF(cityweather) /datum/controller/subsystem/cityweather/proc/create_forecast() for(var/i in 1 to 9) forecast += i - var/weather = "Clear" + var/weather = WEATHER_CLEAR if(i != 1 && i != 9) if(prob(50)) - if(check_holidays(CHRISTMAS)) - weather = pick("Clear", "Snow", "Fog") + if(check_holidays(FESTIVE_SEASON)) + weather = pick(WEATHER_CLEAR, WEATHER_SNOW, WEATHER_FOG) else - weather = pick("Clear", "Rain", "Fog") + weather = pick(WEATHER_CLEAR, WEATHER_RAIN, WEATHER_FOG) forecast[i] = weather /datum/controller/subsystem/cityweather/proc/get_forecast(mob/user) @@ -168,80 +176,24 @@ SUBSYSTEM_DEF(cityweather) time = "05:00" to_chat(user, "[time], [weath]") -/obj/effect/realistic_fog - icon = 'modular_darkpack/modules/deprecated/icons/fog.dmi' - icon_state = "fog" - alpha = 0 - plane = GAME_PLANE - layer = SPACEVINE_LAYER - anchored = TRUE - density = FALSE - mouse_opacity = 0 - pixel_w = -96 - pixel_z = -96 - -/obj/effect/realistic_fog/Initialize(mapload) - . = ..() - animate(src, pixel_x = rand(-96, 96), pixel_y = rand(-96, 96), alpha = rand(5, 21), transform = matrix()*rand(1, 3), transform = turn(matrix(), rand(0, 360)), time = rand(100, 200), loop = -1) - animate(transform = null, pixel_x = 0, pixel_y = 0, alpha = rand(5, 21), time = rand(100, 200)) - -/obj/effect/new_rain - icon = 'modular_darkpack/modules/deprecated/icons/newweather.dmi' - icon_state = "rain1" - alpha = 0 +/obj/effect/weather_manager plane = GAME_PLANE layer = SPACEVINE_LAYER anchored = TRUE density = FALSE - mouse_opacity = 0 - pixel_w = -16 - pixel_z = -32 - -/obj/effect/new_rain/Initialize(mapload) - . = ..() - icon_state = "rain[rand(1, 15)]" - var/matrix/M = new - M.Scale(0.5, 0.5) - transform = M - animate(src, alpha = 64, time = 30) + mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/effect/new_rain/Cross(atom/movable/AM) +/obj/effect/weather_manager/Initialize(mapload) . = ..() - if(isitem(AM)) - AM.wash(CLEAN_WASH) - -/obj/effect/new_snow - icon = 'modular_darkpack/modules/deprecated/icons/newweather.dmi' - icon_state = "snow1" - alpha = 0 - plane = GAME_PLANE - layer = SPACEVINE_LAYER - anchored = TRUE - density = FALSE - mouse_opacity = 0 - pixel_w = -16 - -/obj/effect/new_snow/Initialize(mapload) - . = ..() - icon_state = "snow[rand(1, 15)]" - animate(src, alpha = 128, time = 30) - -/obj/effect/vamp_weather - plane = GAME_PLANE - layer = SPACEVINE_LAYER - anchored = TRUE - density = FALSE - mouse_opacity = 0 - -/obj/effect/vamp_weather/Initialize(mapload) - . = ..() - GLOB.rain_suka += src + GLOB.managed_weather += src /turf/open/Initialize(mapload) . = ..() - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - new /obj/effect/vamp_weather(src) - - + var/area/my_area = loc + if(istype(my_area, /area/vtm) && my_area.outdoors) + new /obj/effect/weather_manager(src) + +#undef WEATHER_CLEAR +#undef WEATHER_RAIN +#undef WEATHER_SNOW +#undef WEATHER_FOG diff --git a/modular_darkpack/modules/weather/icons/fog.dmi b/modular_darkpack/modules/weather/icons/fog.dmi new file mode 100644 index 000000000000..ae7b66747b66 Binary files /dev/null and b/modular_darkpack/modules/weather/icons/fog.dmi differ diff --git a/modular_darkpack/modules/deprecated/icons/newweather.dmi b/modular_darkpack/modules/weather/icons/newweather.dmi similarity index 100% rename from modular_darkpack/modules/deprecated/icons/newweather.dmi rename to modular_darkpack/modules/weather/icons/newweather.dmi diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/garou_species.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/garou_species.dm index be3525faa6bb..8a2d89fab2b9 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/garou_species.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/garou_species.dm @@ -17,88 +17,11 @@ selectable = TRUE var/glabro = FALSE -/datum/action/garouinfo - name = "About Me" - desc = "Check assigned role, auspice, generation, humanity, masquerade, known disciplines, known contacts etc." - button_icon_state = "masquerade" - check_flags = NONE - var/mob/living/carbon/human/host - -/datum/action/garouinfo/Trigger() - if(host) - var/dat = {" - <style type="text/css"> - - body { - padding: 5px; - background-color: #090909; color: white; - } - - </style> - "} - dat += "<p><center><h2>Memories</h2></center></p>" - dat += "<p>[icon2html(getFlatIcon(host), host)]I am " - if(host.real_name) - dat += "[host.real_name]," - if(!host.real_name) - dat += "Unknown," - dat += " [host.auspice.tribe] [host.auspice.base_breed]" - - if(host.mind) - - if(host.mind.assigned_role) - if(host.mind.special_role) - dat += ", carrying the [host.mind.assigned_role] (<font color=red>[host.mind.special_role]</font>) role." - else - dat += ", carrying the [host.mind.assigned_role] role." - if(!host.mind.assigned_role) - dat += "." - dat += "</p>" - if(host.account_id) - var/datum/bank_account/account = SSeconomy.bank_accounts_by_id["[host.account_id]"] - if(account) - dat += "<b>My bank pin is: [account.bank_pin]</b><BR>" - if(host.mind.special_role) - for(var/datum/antagonist/A in host.mind.antag_datums) - if(A.objectives) - dat += "<p>[printobjectives(A.objectives)]</p>" - - if(host.Myself) - if(host.Myself.Friend) - if(host.Myself.Friend.owner) - dat += "<p>My friend's name is [host.Myself.Friend.owner.true_real_name].</b><BR>" - if(host.Myself.Friend.phone_number) - dat += "Their number is [host.Myself.Friend.phone_number].<BR>" - if(host.Myself.Friend.friend_text) - dat += "[host.Myself.Friend.friend_text]</p>" - if(host.Myself.Enemy) - if(host.Myself.Enemy.owner) - dat += "<p><b>My nemesis is [host.Myself.Enemy.owner.true_real_name]!</b><BR>" - if(host.Myself.Enemy.enemy_text) - dat += "[host.Myself.Enemy.enemy_text]</p>" - if(host.Myself.Lover) - if(host.Myself.Lover.owner) - dat += "<p><b>I'm in love with [host.Myself.Lover.owner.true_real_name].</b><BR>" - if(host.Myself.Lover.phone_number) - dat += "Their number is [host.Myself.Lover.phone_number].<BR>" - if(host.Myself.Lover.lover_text) - dat += "[host.Myself.Lover.lover_text]</p>" - if(length(host.knowscontacts) > 0) - dat += "<p><b>I know some other of my kind in this city. Need to check my phone, there definetely should be:</b><BR>" - for(var/i in host.knowscontacts) - dat += "-[i] contact<BR>" - dat += "</p>" - host << browse(HTML_SKELETON(dat), "window=vampire;size=400x450;border=1;can_resize=1;can_minimize=0") - onclose(host, "vampire", src) - /datum/species/garou/on_species_gain(mob/living/carbon/human/C) . = ..() // ADD_TRAIT(C, TRAIT_NOBLEED, HIGHLANDER) C.update_body(0) C.last_experience = world.time+3000 - var/datum/action/garouinfo/infor = new() - infor.host = C - infor.Grant(C) var/datum/action/gift/glabro/glabro = new() glabro.Grant(C) var/datum/action/gift/rage_heal/GH = new() @@ -116,8 +39,6 @@ UnregisterSignal(C, COMSIG_MOB_VAMPIRE_SUCKED) UnregisterSignal(C.transformator.lupus_form, COMSIG_MOB_VAMPIRE_SUCKED) UnregisterSignal(C.transformator.crinos_form, COMSIG_MOB_VAMPIRE_SUCKED) - for(var/datum/action/garouinfo/VI in C.actions) - VI.Remove(C) for(var/datum/action/gift/G in C.actions) G.Remove(C) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/transformation.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/transformation.dm index 11d292af0327..3d6a546356d9 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/transformation.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/transformation.dm @@ -16,10 +16,10 @@ /obj/werewolf_holder/transformation/proc/transfer_damage(mob/living/carbon/first, mob/living/carbon/second) second.masquerade = first.masquerade var/percentage = (100/first.maxHealth)*second.maxHealth - second.adjustBruteLoss(round((first.getBruteLoss()/100)*percentage)-second.getBruteLoss()) - second.adjustFireLoss(round((first.getFireLoss()/100)*percentage)-second.getFireLoss()) - second.adjustToxLoss(round((first.getToxLoss()/100)*percentage)-second.getToxLoss()) - second.adjustAggLoss(round((first.getAggLoss()/100)*percentage)-second.getAggLoss()) + second.adjust_brute_loss(round((first.get_brute_loss()/100)*percentage)-second.get_brute_loss()) + second.adjust_fire_loss(round((first.get_fire_loss()/100)*percentage)-second.get_fire_loss()) + second.adjustToxLoss(round((first.get_tox_loss()/100)*percentage)-second.get_tox_loss()) + second.adjust_agg_loss(round((first.get_agg_loss()/100)*percentage)-second.get_agg_loss()) /obj/werewolf_holder/transformation/proc/trans_gender(mob/living/carbon/trans, form) if(!given_quirks) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/life.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/life.dm index 8ea7d20d1d47..9e9d2488e7f7 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/life.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/life.dm @@ -107,8 +107,6 @@ adjust_bodytemperature(BODYTEMP_HEATING_MAX) //If you're on fire, you heat up! /mob/living/carbon/proc/adjust_veil(var/amount) - if(!GLOB.canon_event) - return if(last_veil_adjusting+200 >= world.time) return if(amount > 0) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/lupus.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/lupus.dm index 07bb516df172..47bd2fc3a811 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/lupus.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/lupus.dm @@ -41,7 +41,7 @@ else icon_state = "[sprite_color]" - switch(getFireLoss()+getBruteLoss()) + switch(get_fire_loss()+get_brute_loss()) if(25 to 75) var/mutable_appearance/damage_overlay = mutable_appearance(icon, "damage1[laid_down ? "_rest" : ""]") add_overlay(damage_overlay) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/werewolf.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/werewolf.dm index 7b78bf4a0451..147c3341e3ce 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/werewolf.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/werewolf.dm @@ -100,6 +100,7 @@ /mob/living/carbon/werewolf/create_internal_organs() internal_organs += new /obj/item/organ/brain internal_organs += new /obj/item/organ/tongue + // DARKPACK TODO - Base type for night_vison eyes dont work. Make a subtype and fiddle with the values internal_organs += new /obj/item/organ/eyes/night_vision internal_organs += new /obj/item/organ/liver internal_organs += new /obj/item/organ/stomach @@ -157,7 +158,7 @@ update_icons() ///aliens are immune to stamina damage. -/mob/living/carbon/werewolf/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE) +/mob/living/carbon/werewolf/adjust_stamina_loss(amount, updating_health = 1, forced = FALSE) return FALSE ///aliens are immune to stamina damage. diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/werewolf_defense.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/werewolf_defense.dm index 9d6e1f083215..9af960232b13 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/werewolf_defense.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/werewolf_defense.dm @@ -33,17 +33,17 @@ var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) switch(M.melee_damage_type) if(BRUTE) - adjustBruteLoss(damage) + adjust_brute_loss(damage) if(BURN) - adjustFireLoss(damage) + adjust_fire_loss(damage) if(TOX) adjustToxLoss(damage) if(OXY) - adjustOxyLoss(damage) + adjust_oxy_loss(damage) if(AGGRAVATED) - adjustAggLoss(damage) + adjust_agg_loss(damage) if(STAMINA) - adjustStaminaLoss(damage) + adjust_stamina_loss(damage) /mob/living/carbon/werewolf/ex_act(severity, target, origin) if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src)) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/werewolf_update_icons.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/werewolf_update_icons.dm index 277785123ff1..0e73f2c2627c 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/werewolf_update_icons.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/garou/werewolf_mobs/werewolf_update_icons.dm @@ -27,7 +27,7 @@ var/mutable_appearance/scar_overlay = mutable_appearance(icon, "scar[sprite_scar][laid_down ? "_rest" : ""]") add_overlay(scar_overlay) - switch(getFireLoss()+getBruteLoss()) + switch(get_fire_loss()+get_brute_loss()) if(25 to 100) var/mutable_appearance/damage_overlay = mutable_appearance(icon, "damage1[laid_down ? "_rest" : ""]") add_overlay(damage_overlay) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts.dm index 7e33a231489a..96e5ce5ff812 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts.dm @@ -65,7 +65,7 @@ . = ..() if(inspired) if(stat != DEAD) - adjustBruteLoss(-10, TRUE) + adjust_brute_loss(-10, TRUE) var/obj/effect/celerity/C = new(get_turf(src)) C.appearance = appearance C.dir = dir @@ -347,12 +347,12 @@ var/mob/living/carbon/C = owner if(C.stat != DEAD) SEND_SOUND(owner, sound('modular_darkpack/modules/deprecated/sounds/rage_heal.ogg', 0, 0, 75)) - C.adjustBruteLoss(-40*C.auspice.level, TRUE) - C.adjustFireLoss(-30*C.auspice.level, TRUE) - C.adjustAggLoss(-10*C.auspice.level, TRUE) + C.adjust_brute_loss(-40*C.auspice.level, TRUE) + C.adjust_fire_loss(-30*C.auspice.level, TRUE) + C.adjust_agg_loss(-10*C.auspice.level, TRUE) C.adjustToxLoss(-10*C.auspice.level, TRUE) - C.adjustOxyLoss(-20*C.auspice.level, TRUE) - C.bloodpool = min(C.bloodpool + C.auspice.level, C.maxbloodpool) + C.adjust_oxy_loss(-20*C.auspice.level, TRUE) + C.adjust_blood_pool(C.auspice.level) C.blood_volume = min(C.blood_volume + 56 * C.auspice.level, BLOOD_VOLUME_NORMAL) if(ishuman(owner)) var/mob/living/carbon/human/BD = owner diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/glyphs.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/glyphs.dm new file mode 100644 index 000000000000..96afd70ec212 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/glyphs.dm @@ -0,0 +1,173 @@ +/// Inits GLOB.glyph_list +/proc/init_glyphs() + var/glyph_list = list() + for(var/path in subtypesof(/obj/effect/decal/garou_glyph)) + var/obj/effect/decal/garou_glyph/S = path + glyph_list[S.garou_name] = S + sort_list(glyph_list, GLOBAL_PROC_REF(cmp_typepaths_asc)) + return glyph_list + +/obj/item/charcoal_stick + name = "charcoal stick" + desc = "A piece of burnt charcoal." + icon = 'icons/obj/art/crayons.dmi' + icon_state = "crayonblack" + w_class = WEIGHT_CLASS_SMALL + // TODO: Needs a ear icon state + // slot_flags = ITEM_SLOT_EARS + +/obj/item/charcoal_stick/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) + // DARKPACK TODO - GAROU + //if(!isgarou(user)) + // return + + if(!GLOB.glyph_list.len) + to_chat(user, span_notice("There are no glyphs available.")) + return + + if(!isopenturf(target) || isgroundlessturf(target)) + return + + var/list/glyph_names = list() + + for(var/glyph in GLOB.glyph_list) + glyph_names += glyph + + var/choice = tgui_input_list(user, "Select a glyph to draw.", "Glyph Selection", glyph_names) + if(choice) + var/obj/effect/decal/garou_glyph/drawn_glyph = GLOB.glyph_list[choice] + if(drawn_glyph) + user.visible_message(span_notice("[user] starts to scrape a glyph into the ground..."), \ + span_notice("You begin to etch the spirals and lines of your chosen glyph...")) + + if(do_after(user, 5 SECONDS, target)) + new drawn_glyph.type(target) + user.visible_message(span_notice("[user] finishes up their rune."), \ + span_notice("You put the finishing touches on your rune, as it marks the ground before you.")) + else + user.visible_message(span_notice("[user] slips, smduges and ruins their glyph."), \ + span_notice("You mess it up, the glyph turning into nothing more than a smear upon the ground.")) + . = ..() + +/obj/effect/decal/garou_glyph + name = "odd glyph" + desc = "An odd collection of symbols drawn in what seems to be charcoal." + var/garou_name = "basic glyph" + var/garou_desc = "a basic glyph with no meaning." // This is shown to werewolves who examine the glyph in order to determine its true meaning. + anchored = TRUE + icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/glyphs.dmi' + icon_state = "garou" + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF + // Very likely not needed + // layer = SIGIL_LAYER + +/obj/effect/decal/garou_glyph/examine(mob/user) + . = ..() + // DARKPACK TODO - GAROU + /* + if(isgarou(user) || iswerewolf(user)) // If they're a werewolf, show them the true meaning of the glyph. + . += "<b>Name:</b> [garou_name]\n" + \ + "<b>Description:</b> [garou_desc]\n" + */ + +/obj/effect/decal/garou_glyph/wyrm + name = "creepy glyph" + garou_name = "wyrm glyph" + garou_desc = "A glyph that represents the Wyrm, a force of corruption and destruction." + icon_state = "wyrm" + +/obj/effect/decal/garou_glyph/vampire + name = "weird glyph" + garou_name = "vampire glyph" + garou_desc = "A glyph that represents the Kindred, leeches of the Weaver and Wyrm." + icon_state = "vampire" + +/obj/effect/decal/garou_glyph/kinfolk + name = "uncanny glyph" + garou_name = "kinfolk glyph" + garou_desc = "A glyph that represents the Kinfolk, the human relatives of the Garou." + icon_state = "kinfolk" + +/obj/effect/decal/garou_glyph/dance + name = "funky glyph" + garou_name = "dancing glyph" + garou_desc = "A glyph that represents the spiritual dancing of the Garou." + icon_state = "dance" + +/obj/effect/decal/garou_glyph/caern + name = "eerie glyph" + garou_name = "caern glyph" + garou_desc = "A glyph that represents the Caern, a sacred location that naturally flows with spiritual energy." + icon_state = "caern" + +/obj/effect/decal/garou_glyph/danger + name = "peculiar glyph" + garou_name = "danger glyph" + garou_desc = "A glyph that represents danger! Proceed with caution." + icon_state = "danger" + +/obj/effect/decal/garou_glyph/garou + name = "freakish glyph" + garou_name = "garou glyph" + garou_desc = "A glyph that represents the Garou, the warriors of Gaia." + icon_state = "garou" + +/obj/effect/decal/garou_glyph/conceal + name = "mysterious glyph" + garou_name = "conceal glyph" + garou_desc = "A glyph that represents the obfuscation of something. What may be hidden from you?" + icon_state = "conceal" + +/obj/effect/decal/garou_glyph/hive + name = "outlandish glyph" + garou_name = "hive glyph" + garou_desc = "A glyph that represents a Hive, the foul home of a Black Spiral Dancer pack." + icon_state = "hive" + +/obj/effect/decal/garou_glyph/howl + name = "unusual glyph" + garou_name = "howling glyph" + garou_desc = "A glyph that represents the natural song of the Garou, the howl." + icon_state = "howl" + +/obj/effect/decal/garou_glyph/remembrance + name = "morose glyph" + garou_name = "remembrance glyph" + garou_desc = "A glyph that represents the mourning and remembrance of the fallen." + icon_state = "remembrance" + +/obj/effect/decal/garou_glyph/watch + name = "odd glyph" + garou_name = "watch glyph" + garou_desc = "A glyph that marks something as in need of monitoring" + icon_state = "watch" + +/obj/effect/decal/garou_glyph/toxic + name = "foul glyph" + garou_name = "toxic glyph" + garou_desc = "A glyph that represents toxicity, the material corruption of the Wyrm on the Earth." + icon_state = "toxic" + +/obj/effect/decal/garou_glyph/dancers + name = "alien glyph" + garou_name = "\improper Black Spiral Dancer glyph" + garou_desc = "A glyph that represents the tribe of the Black Spiral Dancers." + icon_state = "black_spiral_dancers" + +/obj/effect/decal/garou_glyph/glasswalkers + name = "quirky glyph" + garou_name = "\improper Glasswalkers glyph" + garou_desc = "A glyph that represents the Glasswalkers tribe." + icon_state = "glasswalkers" + +/obj/effect/decal/garou_glyph/galestalkers + name = "abnormal glyph" + garou_name = "\improper Younger Brother glyph" + garou_desc = "A glyph that represents the Galestalkers tribe." + icon_state = "younger_brother" + +/obj/effect/decal/garou_glyph/war_against_wyrm + name = "terrifying glyph" + garou_name = "war against wyrm glyph" + garou_desc = "A glyph that represents the apocalyptic war of the Garou against the Wyrm." + icon_state = "war_against_wyrm" diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm index 683eddea1f7b..2c81d6f78eee 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm @@ -1,7 +1,7 @@ /obj/structure/werewolf_totem - name = "Tribe Totem" + name = "tribe totem" desc = "Gives power to all Garou of that tribe and steals it from others." - icon = 'modular_darkpack/modules/deprecated/icons/32x64.dmi' + icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/totems.dmi' icon_state = "glassw" plane = GAME_PLANE layer = SPACEVINE_LAYER @@ -18,6 +18,8 @@ var/turf/teleport_turf var/opening = FALSE +// DARKPACK TODO - GAROU - Fuck this not respecting normal integrity +/* /obj/structure/werewolf_totem/attackby(obj/item/I, mob/living/user, params) . = ..() if(I.force) @@ -89,25 +91,40 @@ overlays -= totem_light_overlay totem_light_overlay.icon_state = "[icon_state]_overlay" overlays |= totem_light_overlay +*/ /obj/structure/werewolf_totem/wendigo - name = "Wendigo Totem" + name = "\improper Wendigo totem" desc = "Gives power to all Garou of that tribe and steals it from others." icon_state = "wendigo" tribe = "Wendigo" totem_overlay_color = "#81ff4f" +/obj/structure/werewolf_totem/children_of_gaia + name = "Children of Gaia Totem" + desc = "Gives power to all Garou of that tribe and steals it from others." + icon_state = "wendigo" + tribe = "Children of Gaia" + totem_overlay_color = "#00CEC8" + +/obj/structure/werewolf_totem/bone_gnawer + name = "Bone Gnawer Totem" + desc = "Gives power to all Garou of that tribe and steals it from others." + icon_state = "wendigo" + tribe = "Bone Gnawers" + totem_overlay_color = "#FFA500" + /obj/structure/werewolf_totem/glasswalker - name = "Glasswalker Totem" + name = "\improper Glasswalker totem" desc = "Gives power to all Garou of that tribe and steals it from others." icon_state = "glassw" tribe = "Glasswalkers" totem_overlay_color = "#35b0ff" /obj/structure/werewolf_totem/spiral - name = "Spiral Totem" + name = "spiral totem" desc = "Gives power to all Garou of that tribe and steals it from others." - icon = 'modular_darkpack/modules/deprecated/icons/64x32.dmi' + icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/spiral_totem.dmi' icon_state = "spiral" tribe = "Black Spiral Dancers" totem_overlay_color = "#ff5235" @@ -117,6 +134,8 @@ icon_state = "x" var/tribe +// DARKPACK TODO - GAROU +/* /obj/structure/werewolf_totem/attack_hand(mob/user) . = ..() if(iswerewolf(user) || isgarou(user)) @@ -150,3 +169,4 @@ qdel(prev) else adjust_totem_health(round(C.melee_damage_lower/2)) +*/ diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/tribes.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/tribes.dm index b057d431e222..3c9c78421165 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/tribes.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/tribes.dm @@ -133,9 +133,9 @@ owner.visible_message(span_danger("[owner.name] crackles with heat!"), span_danger("You crackle with heat, charging up your Gift!")) if(do_after(owner, 3 SECONDS)) for(var/mob/living/L in orange(5, owner)) - L.adjustFireLoss(40) + L.adjust_fire_loss(40) for(var/turf/T in orange(4, get_turf(owner))) - var/obj/effect/fire/F = new(T) + var/obj/effect/abstract/turf_fire/F = new(T) spawn(5) qdel(F) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/werewolf_globals.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/werewolf_globals.dm index ac4043a45511..5fedbf24d242 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/werewolf_globals.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/werewolf_globals.dm @@ -3,3 +3,5 @@ GLOBAL_VAR_INIT(moon_state, pick("New", "Crescent", "Half", "Gibbous", "Full")) /// List of all Tribe totems GLOBAL_LIST_EMPTY(totems) + +GLOBAL_LIST_INIT(glyph_list, init_glyphs()) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/werewolf_hud.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/werewolf_hud.dm index e8124e0d6f4d..652ee0e5d886 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/werewolf_hud.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/werewolf_hud.dm @@ -225,7 +225,6 @@ . = ..() update_blood_hud() update_rage_hud() - update_auspex_hud() /mob/living/Initialize(mapload) . = ..() diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/icons/glyphs.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/glyphs.dmi new file mode 100644 index 000000000000..e266e1b437f0 Binary files /dev/null and b/modular_darkpack/modules/werewolf_the_apocalypse/icons/glyphs.dmi differ diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/icons/spiral_totem.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/spiral_totem.dmi new file mode 100644 index 000000000000..78e94f53ecbd Binary files /dev/null and b/modular_darkpack/modules/werewolf_the_apocalypse/icons/spiral_totem.dmi differ diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/icons/totems.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/totems.dmi new file mode 100644 index 000000000000..13f68616757d Binary files /dev/null and b/modular_darkpack/modules/werewolf_the_apocalypse/icons/totems.dmi differ diff --git a/modular_darkpack/modules/westfield_mall/code/mall_areas.dm b/modular_darkpack/modules/westfield_mall/code/mall_areas.dm new file mode 100644 index 000000000000..56b8ce6785d8 --- /dev/null +++ b/modular_darkpack/modules/westfield_mall/code/mall_areas.dm @@ -0,0 +1,150 @@ +/area/vtm/westfield_mall + name = "Mall Exterior" + outdoors = TRUE + icon_state = "outside" + icon = 'modular_darkpack/modules/westfield_mall/icons/mall_areas.dmi' + +/area/vtm/westfield_mall/skatepark + name = "Westfield Drive Skatepark" + icon_state = "skatepark" + +/area/vtm/westfield_mall/interior + name = "Westfield Mall" + icon_state = "interior" + ambience_index = AMBIENCE_OFFICE + outdoors = FALSE + +/area/vtm/westfield_mall/interior/skatepark + name = "Beralta Skateshop" + icon_state = "skatepark_interior" + +/area/vtm/westfield_mall/interior/maintenance + name = "Staff Only Area" + icon_state = "staffonly" + +/area/vtm/westfield_mall/interior/maintenance/basement + name = "Staff Only Area, Floor -1" + icon_state = "staffonly_basement" + +/area/vtm/westfield_mall/interior/maintenance/atrium + name = "Staff Only Area, Floor 2" + icon_state = "staffonly_atrium" + +/area/vtm/westfield_mall/interior/maintenance/roof + name = "Staff Only Area, Roof" + icon_state = "staffonly_roof" + +/area/vtm/westfield_mall/parking_lot + name = "Parking Lot" + icon_state = "parking" +/area/vtm/westfield_mall/interior/underground_parking + name = "Subterranean Parking Lot" + icon_state = "parking_interior" + +/area/vtm/westfield_mall/interior/bathroom + name = "\improper Public Restroom" + icon_state = "pooper" + +/area/vtm/westfield_mall/interior/foodcourt + name = "Penzera Foodcourt at Westfield" + icon_state = "foodcourt" + +/area/vtm/westfield_mall/interior/foodcourt/restaurant + name = "Combination Gummaguts Bubway Bacotell" + icon_state = "foodcourt2" + +/area/vtm/westfield_mall/interior/foodcourt/grocery + name = "Beffley's Green Grocer" + icon_state = "foodcourt3" + +/area/vtm/westfield_mall/interior/foodcourt/deli + name = "Lick Ur Chops Deli and Butcher" + icon_state = "foodcourt4" + +/area/vtm/westfield_mall/interior/arcade + name = "Master Controller Arcade" + icon_state = "arcade" + +/area/vtm/westfield_mall/interior/smokeshop + name = "Paqadube Smokestuff and Tobacco" + icon_state = "smoke_shop" + +/area/vtm/westfield_mall/interior/clothing_store + name = "Snarshals Clothing and Fabric" + icon_state = "clothing" +/area/vtm/westfield_mall/interior/hot_ishu + name = "Hot Ishu" + icon_state = "clothing_ishu" + +/area/vtm/westfield_mall/interior/camarilla + name = "Westfield Management" + icon_state = "camallrilla" + +/area/vtm/westfield_mall/interior/anarch + name = "Silchester & Thorne Body Art" + icon_state = "anarch" + +/area/vtm/westfield_mall/interior/chantry + name = "Noble's Books" + icon_state = "chantry" + +/area/vtm/westfield_mall/interior/vet_clinic + name = "Nottingham's Pet Emporium" + icon_state = "vet" + +/area/vtm/westfield_mall/interior/janitor + name = "Custodial Office" + icon_state = "janitor" + +/area/vtm/westfield_mall/interior/dojo + name = "Matrak Self-Defence" + icon_state = "dojo" + +/area/vtm/westfield_mall/interior/theatre + name = "Absolute Cinema" + icon_state = "arcade" + +/area/vtm/westfield_mall/interior/techshop + name = "Transistor Town Hobbyist Electronics" + icon_state = "tech" + +/area/vtm/westfield_mall/interior/bank + name = "Bianchi Banking Westfield Branch" + icon_state = "bank" + +/area/vtm/westfield_mall/interior/supply + name = "Trout Expert Store" + icon_state = "supply" + +/area/vtm/westfield_mall/interior/games_store + name = "Glamour Games" + icon_state = "arcade" + +/area/vtm/westfield_mall/interior/candy_store + name = "Rosie Confections" + icon_state = "arcade" + +/area/vtm/westfield_mall/interior/art_store + name = "The Drawn Line" + icon_state = "arcade" + +/area/vtm/westfield_mall/interior/groundskeeper_garage + name = "Groundskeeping Garage" + icon_state = "janitor" + +/area/vtm/westfield_mall/interior/groundskeeper_garage + name = "Groundskeeping Garage" + icon_state = "janitor" + +/area/vtm/westfield_mall/interior/law_office + name = "Venture Law LLC" + icon_state = "bank" + +/area/vtm/westfield_mall/interior/cave + name = "Forest Cave" + +/area/vtm/westfield_mall/forest + name = "Forest" + +/area/vtm/westfield_mall/interior/endron_logging + name = "Logging Facility" diff --git a/modular_darkpack/modules/westfield_mall/icons/mall_areas.dmi b/modular_darkpack/modules/westfield_mall/icons/mall_areas.dmi new file mode 100644 index 000000000000..43a2e107cecf Binary files /dev/null and b/modular_darkpack/modules/westfield_mall/icons/mall_areas.dmi differ diff --git a/modular_darkpack/modules/z_travel/code/manhole.dm b/modular_darkpack/modules/z_travel/code/manhole.dm index d344cc67bc5d..7bd98cb5338a 100644 --- a/modular_darkpack/modules/z_travel/code/manhole.dm +++ b/modular_darkpack/modules/z_travel/code/manhole.dm @@ -1,12 +1,12 @@ /obj/structure/ladder/manhole - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/z_travel/icons/z_travel.dmi' icon_state = "manhole" plane = GAME_PLANE layer = ABOVE_NORMAL_TURF_LAYER anchored = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF travel_time = 5 SECONDS - travel_sound = 'modular_darkpack/modules/deprecated/sounds/manhole.ogg' + travel_sound = 'modular_darkpack/modules/z_travel/sounds/manhole.ogg' requires_friend = TRUE static_appearance = TRUE @@ -24,8 +24,16 @@ /obj/structure/ladder/manhole/down/Initialize(mapload) . = ..() - if(check_holidays(CHRISTMAS)) - if(istype(get_area(src), /area/vtm)) - var/area/vtm/V = get_area(src) - if(V.outdoors) - icon_state = "[base_icon_state]-snow" + if(HAS_TRAIT(SSstation, STATION_TRAIT_INFESTATION)) + AddComponent(\ + /datum/component/spawner,\ + spawn_types = list(/mob/living/basic/mouse/vampire),\ + spawn_time = 15 MINUTES,\ + max_spawned = 1,\ + spawn_text = "crawls out from",\ + ) + + if(check_holidays(FESTIVE_SEASON)) + var/area/my_area = get_area(src) + if(istype(my_area) && my_area.outdoors) + icon_state = "[base_icon_state]-snow" diff --git a/modular_darkpack/modules/z_travel/code/transfer_point.dm b/modular_darkpack/modules/z_travel/code/transfer_point.dm index 49e3bc803eb0..2b77963fab27 100644 --- a/modular_darkpack/modules/z_travel/code/transfer_point.dm +++ b/modular_darkpack/modules/z_travel/code/transfer_point.dm @@ -1,7 +1,7 @@ GLOBAL_LIST_EMPTY(unallocted_transfer_points) /obj/transfer_point_vamp - icon = 'modular_darkpack/modules/deprecated/icons/props.dmi' + icon = 'modular_darkpack/modules/z_travel/icons/z_travel.dmi' icon_state = "matrix_go" name = "transfer point" plane = GAME_PLANE diff --git a/modular_darkpack/modules/z_travel/icons/z_travel.dmi b/modular_darkpack/modules/z_travel/icons/z_travel.dmi new file mode 100644 index 000000000000..930f0cc0e1e3 Binary files /dev/null and b/modular_darkpack/modules/z_travel/icons/z_travel.dmi differ diff --git a/modular_darkpack/modules/deprecated/sounds/manhole.ogg b/modular_darkpack/modules/z_travel/sounds/manhole.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/manhole.ogg rename to modular_darkpack/modules/z_travel/sounds/manhole.ogg diff --git a/modular_darkpack/readme.md b/modular_darkpack/readme.md index d165c53c5716..05b11c5b4846 100644 --- a/modular_darkpack/readme.md +++ b/modular_darkpack/readme.md @@ -242,7 +242,7 @@ In those cases, we've decided to apply the following convention, with examples: log_admin("[key_name(usr)] admin-called the emergency shuttle.") message_admins(span_adminnotice("[key_name_admin(usr)] admin-called the emergency shuttle.")) return - */ //DARKPACK EDIT REMOVAL END + */ // DARKPACK EDIT REMOVAL END ``` - **Change:** @@ -250,7 +250,8 @@ In those cases, we've decided to apply the following convention, with examples: ```byond if(SHUTTLE_STRANDED, SHUTTLE_ESCAPE, SHUTTLE_DISABLED) // DARKPACK EDIT CHANGE - ORIGINAL: if(SHUTTLE_STRANDED, SHUTTLE_ESCAPE) ``` - Adding `- ORIGINAL:` is optional but prefered. + + Adding `- ORIGINAL:` is optional but prefered. Example: Removal/addition combo. This is the preferred way of dealing with changes that span more than one line and have varying diff --git a/modular_darkpack/tools/ticked_file_enforcement/modular_darkpack_master_files.json b/modular_darkpack/tools/ticked_file_enforcement/modular_darkpack_master_files.json new file mode 100644 index 000000000000..bcc0095a0306 --- /dev/null +++ b/modular_darkpack/tools/ticked_file_enforcement/modular_darkpack_master_files.json @@ -0,0 +1,7 @@ +{ + "file": "tgstation.dme", + "scannable_directory": "modular_darkpack/master_files/", + "subdirectories": true, + "excluded_files": [], + "forbidden_includes": [] +} diff --git a/modular_darkpack/tools/ticked_file_enforcement/modular_darkpack_modules.json b/modular_darkpack/tools/ticked_file_enforcement/modular_darkpack_modules.json new file mode 100644 index 000000000000..cfc39ba547f6 --- /dev/null +++ b/modular_darkpack/tools/ticked_file_enforcement/modular_darkpack_modules.json @@ -0,0 +1,7 @@ +{ + "file": "tgstation.dme", + "scannable_directory": "modular_darkpack/modules/", + "subdirectories": true, + "excluded_files": [], + "forbidden_includes": ["modular_darkpack/modules/unit_tests/[!_]*.dm"] +} diff --git a/modular_darkpack/tools/ticked_file_enforcement/modular_darkpack_unit_tests.json b/modular_darkpack/tools/ticked_file_enforcement/modular_darkpack_unit_tests.json new file mode 100644 index 000000000000..e5313bec7ef6 --- /dev/null +++ b/modular_darkpack/tools/ticked_file_enforcement/modular_darkpack_unit_tests.json @@ -0,0 +1,7 @@ +{ + "file": "modular_darkpack/modules/unit_tests/_darkpack_unit_tests.dm", + "scannable_directory": "modular_darkpack/modules/unit_tests/", + "subdirectories": false, + "excluded_files": [], + "forbidden_includes": [] +} diff --git a/modular_zapoc/modules/carpets/code/carpets.dm b/modular_zapoc/modules/carpets/code/carpets.dm deleted file mode 100644 index 068395c6b324..000000000000 --- a/modular_zapoc/modules/carpets/code/carpets.dm +++ /dev/null @@ -1,76 +0,0 @@ -/turf/open/floor/carpet/apoc - icon = 'modular_zapoc/modules/carpets/icons/redgoldcarpet.dmi' - icon_state = "redgoldcarpet-255" - base_icon_state = "redgoldcarpet" - smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET - canSmoothWith = SMOOTH_GROUP_CARPET - -/turf/open/floor/carpet/apoc/redsilver - icon = 'modular_zapoc/modules/carpets/icons/redsilvercarpet.dmi' - icon_state = "redsilvercarpet-255" - base_icon_state = "redsilvercarpet" - smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_RED - canSmoothWith = SMOOTH_GROUP_CARPET_RED - -/turf/open/floor/carpet/apoc/bluegold - icon = 'modular_zapoc/modules/carpets/icons/bluegoldcarpet.dmi' - icon_state = "bluegoldcarpet-255" - base_icon_state = "bluegoldcarpet" - smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_BLUE - canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_BLUE - -/turf/open/floor/carpet/apoc/bluesilver - icon = 'modular_zapoc/modules/carpets/icons/bluesilvercarpet.dmi' - icon_state = "bluesilvercarpet-255" - base_icon_state = "bluesilvercarpet" - smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_BLUE - canSmoothWith = SMOOTH_GROUP_CARPET_BLUE - -/turf/open/floor/carpet/apoc/cyan - icon = 'modular_zapoc/modules/carpets/icons/cyancarpet.dmi' - icon_state = "cyancarpet-255" - base_icon_state = "cyancarpet" - smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_CYAN - canSmoothWith = SMOOTH_GROUP_CARPET_CYAN - -/turf/open/floor/carpet/apoc/blackgold - icon = 'modular_zapoc/modules/carpets/icons/blackgoldcarpet.dmi' - icon_state = "blackgoldcarpet-255" - base_icon_state = "blackgoldcarpet" - smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_BLACK - canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_BLACK - -/turf/open/floor/carpet/apoc/blacksilver - icon = 'modular_zapoc/modules/carpets/icons/blacksilvercarpet.dmi' - icon_state = "blacksilvercarpet-255" - base_icon_state = "blacksilvercarpet" - smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_BLACK - canSmoothWith = SMOOTH_GROUP_CARPET_BLACK - -/turf/open/floor/carpet/apoc/purplegold - icon = 'modular_zapoc/modules/carpets/icons/purplegoldcarpet.dmi' - icon_state = "purplegoldcarpet-255" - base_icon_state = "purplegoldcarpet" - smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_PURPLE - canSmoothWith = SMOOTH_GROUP_CARPET_PURPLE - -/turf/open/floor/carpet/apoc/greengold - icon = 'modular_zapoc/modules/carpets/icons/greengoldcarpet.dmi' - icon_state = "greengoldcarpet-255" - base_icon_state = "greengoldcarpet" - smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_GREEN - canSmoothWith = SMOOTH_GROUP_CARPET_GREEN - -/turf/open/floor/carpet/apoc/orangesilver - icon = 'modular_zapoc/modules/carpets/icons/orangesilvercarpet.dmi' - icon_state = "orangesilvercarpet-255" - base_icon_state = "orangesilvercarpet" - smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ORANGE - canSmoothWith = SMOOTH_GROUP_CARPET_ORANGE - -/turf/open/floor/carpet/apoc/hotel - icon = 'modular_zapoc/modules/carpets/icons/orangehotelcarpet.dmi' - icon_state = "orangehotelcarpet-255" - base_icon_state = "orangehotelcarpet" - smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_DONK - canSmoothWith = SMOOTH_GROUP_CARPET_DONK diff --git a/modular_zapoc/modules/carpets/icons/bluegoldcarpet.dmi b/modular_zapoc/modules/carpets/icons/bluegoldcarpet.dmi deleted file mode 100644 index 0bd84bba6db9..000000000000 Binary files a/modular_zapoc/modules/carpets/icons/bluegoldcarpet.dmi and /dev/null differ diff --git a/modular_zapoc/modules/carpets/icons/bluegoldcarpet.png.toml b/modular_zapoc/modules/carpets/icons/bluegoldcarpet.png.toml deleted file mode 100644 index 2df597b92b37..000000000000 --- a/modular_zapoc/modules/carpets/icons/bluegoldcarpet.png.toml +++ /dev/null @@ -1,2 +0,0 @@ -output_name = "blackgoldcarpet" -template = "bitmask/diagonal_32x32.toml" diff --git a/rust_g.dll b/rust_g.dll index ee66aafe9d3f..62c8ba24f015 100644 Binary files a/rust_g.dll and b/rust_g.dll differ diff --git a/sound/attributions.txt b/sound/attributions.txt index a45b2c7b5c4b..0c5877cccbeb 100644 --- a/sound/attributions.txt +++ b/sound/attributions.txt @@ -237,4 +237,6 @@ sound/mobs/non-humanoids/stoats/stoat_sound.ogg -- https://suche.tierstimmenarch sounds/mobs/humanoids/shadow/shadow_wail.ogg -- https://freesound.org/people/Robinhood76/sounds/585631/ -- License: Attribution 4.0 -sound/mobs/non-humanoids/roro/roro_warble.ogg -- Made by cutting, adjusting pitch, and adding echo of https://freesound.org/people/danlucaz/sounds/517734/ -- License: Creating Commons 0 \ No newline at end of file +sound/mobs/non-humanoids/roro/roro_warble.ogg -- Made by cutting, adjusting pitch, and adding echo of https://freesound.org/people/danlucaz/sounds/517734/ -- License: Creating Commons 0 + +sound/effects/goresplat.ogg -- https://freesound.org/people/ThefitzyG/sounds/414296/ -- License: Creative Commons 0 diff --git a/sound/effects/goresplat.ogg b/sound/effects/goresplat.ogg new file mode 100644 index 000000000000..4ada7d4f982c Binary files /dev/null and b/sound/effects/goresplat.ogg differ diff --git a/sound/effects/license.txt b/sound/effects/license.txt index 04bb7108d957..d55e035eb6a1 100644 --- a/sound/effects/license.txt +++ b/sound/effects/license.txt @@ -6,4 +6,14 @@ cartoon_pop.ogg by Tobiasz 'unfa' Karoń 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 +https://freesound.org/people/bbrocer/sounds/389511/ + +{ +soil_plop.ogg is made using: + +https://freesound.org/people/jorickhoofd/sounds/169551/ -- License: Attribution 4.0 +https://freesound.org/people/Ali_6868/sounds/384361/, -- License: Creative Commons 0 +https://freesound.org/people/lolamadeus/sounds/179341/, -- License: Creative Commons 0 +https://freesound.org/people/fthrll/sounds/522200/, -- License: Creative Commons 0 +https://freesound.org/people/Hankof/sounds/655630/, -- License: Creative Commons 0 +} \ No newline at end of file diff --git a/sound/effects/soil_plop.ogg b/sound/effects/soil_plop.ogg new file mode 100644 index 000000000000..6713bc1f36f7 Binary files /dev/null and b/sound/effects/soil_plop.ogg differ diff --git a/sound/items/cutlery/attribution.txt b/sound/items/cutlery/attribution.txt new file mode 100644 index 000000000000..9ee0e20ae82c --- /dev/null +++ b/sound/items/cutlery/attribution.txt @@ -0,0 +1 @@ +cutlery sounds made by grungussuss, license: CC-BY-SA \ No newline at end of file diff --git a/sound/items/cutlery/cutlery_drop1.ogg b/sound/items/cutlery/cutlery_drop1.ogg new file mode 100644 index 000000000000..1da05305b453 Binary files /dev/null and b/sound/items/cutlery/cutlery_drop1.ogg differ diff --git a/sound/items/cutlery/cutlery_drop2.ogg b/sound/items/cutlery/cutlery_drop2.ogg new file mode 100644 index 000000000000..04d580c9cac0 Binary files /dev/null and b/sound/items/cutlery/cutlery_drop2.ogg differ diff --git a/sound/items/cutlery/cutlery_drop3.ogg b/sound/items/cutlery/cutlery_drop3.ogg new file mode 100644 index 000000000000..cff9c5036373 Binary files /dev/null and b/sound/items/cutlery/cutlery_drop3.ogg differ diff --git a/sound/items/cutlery/cutlery_pickup1.ogg b/sound/items/cutlery/cutlery_pickup1.ogg new file mode 100644 index 000000000000..81954f866bdc Binary files /dev/null and b/sound/items/cutlery/cutlery_pickup1.ogg differ diff --git a/sound/items/cutlery/cutlery_pickup2.ogg b/sound/items/cutlery/cutlery_pickup2.ogg new file mode 100644 index 000000000000..a57f0ac38712 Binary files /dev/null and b/sound/items/cutlery/cutlery_pickup2.ogg differ diff --git a/sound/items/cutlery/cutlery_pickup3.ogg b/sound/items/cutlery/cutlery_pickup3.ogg new file mode 100644 index 000000000000..c005647b334d Binary files /dev/null and b/sound/items/cutlery/cutlery_pickup3.ogg differ diff --git a/sound/items/door_remote/attribution.txt b/sound/items/door_remote/attribution.txt new file mode 100644 index 000000000000..ceb5e3f219d9 --- /dev/null +++ b/sound/items/door_remote/attribution.txt @@ -0,0 +1 @@ +door_remote sounds made by grungussuss, license: CC-BY-SA \ No newline at end of file diff --git a/sound/items/door_remote/door_remote_action1.ogg b/sound/items/door_remote/door_remote_action1.ogg new file mode 100644 index 000000000000..6cd569e9c363 Binary files /dev/null and b/sound/items/door_remote/door_remote_action1.ogg differ diff --git a/sound/items/door_remote/door_remote_action2.ogg b/sound/items/door_remote/door_remote_action2.ogg new file mode 100644 index 000000000000..7f8b97b6b76e Binary files /dev/null and b/sound/items/door_remote/door_remote_action2.ogg differ diff --git a/sound/items/door_remote/door_remote_drop1.ogg b/sound/items/door_remote/door_remote_drop1.ogg new file mode 100644 index 000000000000..7286edb89ade Binary files /dev/null and b/sound/items/door_remote/door_remote_drop1.ogg differ diff --git a/sound/items/door_remote/door_remote_pick_up1.ogg b/sound/items/door_remote/door_remote_pick_up1.ogg new file mode 100644 index 000000000000..906ec4bcc79d Binary files /dev/null and b/sound/items/door_remote/door_remote_pick_up1.ogg differ diff --git a/sound/items/door_remote/door_remote_switch1.ogg b/sound/items/door_remote/door_remote_switch1.ogg new file mode 100644 index 000000000000..044674113e5b Binary files /dev/null and b/sound/items/door_remote/door_remote_switch1.ogg differ diff --git a/sound/items/door_remote/door_remote_switch2.ogg b/sound/items/door_remote/door_remote_switch2.ogg new file mode 100644 index 000000000000..e8bc9c111961 Binary files /dev/null and b/sound/items/door_remote/door_remote_switch2.ogg differ diff --git a/sound/items/door_remote/door_remote_switch3.ogg b/sound/items/door_remote/door_remote_switch3.ogg new file mode 100644 index 000000000000..c8311ad8b273 Binary files /dev/null and b/sound/items/door_remote/door_remote_switch3.ogg differ diff --git a/sound/items/food_plate/attribution.txt b/sound/items/food_plate/attribution.txt new file mode 100644 index 000000000000..d0f798f240ce --- /dev/null +++ b/sound/items/food_plate/attribution.txt @@ -0,0 +1 @@ +food plate sounds made by grungussuss, license: CC-BY-SA \ No newline at end of file diff --git a/sound/items/food_plate/food_plate_drop1.ogg b/sound/items/food_plate/food_plate_drop1.ogg new file mode 100644 index 000000000000..99245b3daf29 Binary files /dev/null and b/sound/items/food_plate/food_plate_drop1.ogg differ diff --git a/sound/items/food_plate/food_plate_drop2.ogg b/sound/items/food_plate/food_plate_drop2.ogg new file mode 100644 index 000000000000..fa977ec069bb Binary files /dev/null and b/sound/items/food_plate/food_plate_drop2.ogg differ diff --git a/sound/items/food_plate/food_plate_drop3.ogg b/sound/items/food_plate/food_plate_drop3.ogg new file mode 100644 index 000000000000..13a299bdb4de Binary files /dev/null and b/sound/items/food_plate/food_plate_drop3.ogg differ diff --git a/sound/items/food_plate/food_plate_pickup1.ogg b/sound/items/food_plate/food_plate_pickup1.ogg new file mode 100644 index 000000000000..ab29c1775ff0 Binary files /dev/null and b/sound/items/food_plate/food_plate_pickup1.ogg differ diff --git a/sound/items/food_plate/food_plate_pickup2.ogg b/sound/items/food_plate/food_plate_pickup2.ogg new file mode 100644 index 000000000000..9ee5f31e0602 Binary files /dev/null and b/sound/items/food_plate/food_plate_pickup2.ogg differ diff --git a/sound/items/food_plate/food_plate_pickup3.ogg b/sound/items/food_plate/food_plate_pickup3.ogg new file mode 100644 index 000000000000..d4442ee05a11 Binary files /dev/null and b/sound/items/food_plate/food_plate_pickup3.ogg differ diff --git a/sound/items/gas_mask/attribution.txt b/sound/items/gas_mask/attribution.txt new file mode 100644 index 000000000000..9f37f47c2061 --- /dev/null +++ b/sound/items/gas_mask/attribution.txt @@ -0,0 +1 @@ +gas mask sounds made by grungussuss, license: CC-BY-SA \ No newline at end of file diff --git a/sound/items/gas_mask/gas_mask_drop1.ogg b/sound/items/gas_mask/gas_mask_drop1.ogg new file mode 100644 index 000000000000..432e2492836c Binary files /dev/null and b/sound/items/gas_mask/gas_mask_drop1.ogg differ diff --git a/sound/items/gas_mask/gas_mask_drop2.ogg b/sound/items/gas_mask/gas_mask_drop2.ogg new file mode 100644 index 000000000000..e9e481f02412 Binary files /dev/null and b/sound/items/gas_mask/gas_mask_drop2.ogg differ diff --git a/sound/items/gas_mask/gas_mask_drop3.ogg b/sound/items/gas_mask/gas_mask_drop3.ogg new file mode 100644 index 000000000000..07e472208627 Binary files /dev/null and b/sound/items/gas_mask/gas_mask_drop3.ogg differ diff --git a/sound/items/gas_mask/gas_mask_equip1.ogg b/sound/items/gas_mask/gas_mask_equip1.ogg new file mode 100644 index 000000000000..eed02f89ca8e Binary files /dev/null and b/sound/items/gas_mask/gas_mask_equip1.ogg differ diff --git a/sound/items/gas_mask/gas_mask_equip2.ogg b/sound/items/gas_mask/gas_mask_equip2.ogg new file mode 100644 index 000000000000..7223ba50e57c Binary files /dev/null and b/sound/items/gas_mask/gas_mask_equip2.ogg differ diff --git a/sound/items/gas_mask/gas_mask_equip3.ogg b/sound/items/gas_mask/gas_mask_equip3.ogg new file mode 100644 index 000000000000..f0ae69dfc67c Binary files /dev/null and b/sound/items/gas_mask/gas_mask_equip3.ogg differ diff --git a/sound/items/gas_mask/gas_mask_pickup1.ogg b/sound/items/gas_mask/gas_mask_pickup1.ogg new file mode 100644 index 000000000000..89e5e2d5a6f3 Binary files /dev/null and b/sound/items/gas_mask/gas_mask_pickup1.ogg differ diff --git a/sound/items/gas_mask/gas_mask_pickup2.ogg b/sound/items/gas_mask/gas_mask_pickup2.ogg new file mode 100644 index 000000000000..1d94c5069952 Binary files /dev/null and b/sound/items/gas_mask/gas_mask_pickup2.ogg differ diff --git a/sound/items/gas_mask/gas_mask_pickup3.ogg b/sound/items/gas_mask/gas_mask_pickup3.ogg new file mode 100644 index 000000000000..45cf79393119 Binary files /dev/null and b/sound/items/gas_mask/gas_mask_pickup3.ogg differ diff --git a/sound/items/generic_device/attribution.txt b/sound/items/generic_device/attribution.txt new file mode 100644 index 000000000000..86532e8255b4 --- /dev/null +++ b/sound/items/generic_device/attribution.txt @@ -0,0 +1 @@ +generic_device sounds made by grungussuss, license: CC-BY-SA \ No newline at end of file diff --git a/sound/items/generic_device/generic_device_drop1.ogg b/sound/items/generic_device/generic_device_drop1.ogg new file mode 100644 index 000000000000..b2974510021c Binary files /dev/null and b/sound/items/generic_device/generic_device_drop1.ogg differ diff --git a/sound/items/generic_device/generic_device_drop2.ogg b/sound/items/generic_device/generic_device_drop2.ogg new file mode 100644 index 000000000000..a53ffc2f27a4 Binary files /dev/null and b/sound/items/generic_device/generic_device_drop2.ogg differ diff --git a/sound/items/generic_device/generic_device_drop3.ogg b/sound/items/generic_device/generic_device_drop3.ogg new file mode 100644 index 000000000000..d58e1dd736cc Binary files /dev/null and b/sound/items/generic_device/generic_device_drop3.ogg differ diff --git a/sound/items/generic_device/generic_device_drop4.ogg b/sound/items/generic_device/generic_device_drop4.ogg new file mode 100644 index 000000000000..440126beb178 Binary files /dev/null and b/sound/items/generic_device/generic_device_drop4.ogg differ diff --git a/sound/items/generic_device/generic_device_drop5.ogg b/sound/items/generic_device/generic_device_drop5.ogg new file mode 100644 index 000000000000..f272337c26e4 Binary files /dev/null and b/sound/items/generic_device/generic_device_drop5.ogg differ diff --git a/sound/items/generic_device/generic_device_pickup1.ogg b/sound/items/generic_device/generic_device_pickup1.ogg new file mode 100644 index 000000000000..8d0c89d628e3 Binary files /dev/null and b/sound/items/generic_device/generic_device_pickup1.ogg differ diff --git a/sound/items/generic_device/generic_device_pickup2.ogg b/sound/items/generic_device/generic_device_pickup2.ogg new file mode 100644 index 000000000000..91c443738f3d Binary files /dev/null and b/sound/items/generic_device/generic_device_pickup2.ogg differ diff --git a/sound/items/generic_device/generic_device_pickup3.ogg b/sound/items/generic_device/generic_device_pickup3.ogg new file mode 100644 index 000000000000..f6dd7cb8002d Binary files /dev/null and b/sound/items/generic_device/generic_device_pickup3.ogg differ diff --git a/sound/items/generic_device/generic_device_pickup4.ogg b/sound/items/generic_device/generic_device_pickup4.ogg new file mode 100644 index 000000000000..348d4976a079 Binary files /dev/null and b/sound/items/generic_device/generic_device_pickup4.ogg differ diff --git a/sound/items/generic_device/generic_device_pickup5.ogg b/sound/items/generic_device/generic_device_pickup5.ogg new file mode 100644 index 000000000000..f4ed65563e10 Binary files /dev/null and b/sound/items/generic_device/generic_device_pickup5.ogg differ diff --git a/sound/items/glasses/attribution.txt b/sound/items/glasses/attribution.txt new file mode 100644 index 000000000000..e8134c8786e5 --- /dev/null +++ b/sound/items/glasses/attribution.txt @@ -0,0 +1 @@ +glasses sounds made by grungussuss, license: CC-BY-SA diff --git a/sound/items/glasses/glasses_drop1.ogg b/sound/items/glasses/glasses_drop1.ogg new file mode 100644 index 000000000000..c8cb42808466 Binary files /dev/null and b/sound/items/glasses/glasses_drop1.ogg differ diff --git a/sound/items/glasses/glasses_drop2.ogg b/sound/items/glasses/glasses_drop2.ogg new file mode 100644 index 000000000000..41ca891e1245 Binary files /dev/null and b/sound/items/glasses/glasses_drop2.ogg differ diff --git a/sound/items/glasses/glasses_drop3.ogg b/sound/items/glasses/glasses_drop3.ogg new file mode 100644 index 000000000000..834888d47a20 Binary files /dev/null and b/sound/items/glasses/glasses_drop3.ogg differ diff --git a/sound/items/glasses/glasses_equip1.ogg b/sound/items/glasses/glasses_equip1.ogg new file mode 100644 index 000000000000..377454bec36b Binary files /dev/null and b/sound/items/glasses/glasses_equip1.ogg differ diff --git a/sound/items/glasses/glasses_equip2.ogg b/sound/items/glasses/glasses_equip2.ogg new file mode 100644 index 000000000000..71879d818723 Binary files /dev/null and b/sound/items/glasses/glasses_equip2.ogg differ diff --git a/sound/items/glasses/glasses_pickup1.ogg b/sound/items/glasses/glasses_pickup1.ogg new file mode 100644 index 000000000000..c70814f4610c Binary files /dev/null and b/sound/items/glasses/glasses_pickup1.ogg differ diff --git a/sound/items/glasses/glasses_pickup2.ogg b/sound/items/glasses/glasses_pickup2.ogg new file mode 100644 index 000000000000..e9fdee40c093 Binary files /dev/null and b/sound/items/glasses/glasses_pickup2.ogg differ diff --git a/sound/items/glasses/glasses_pickup3.ogg b/sound/items/glasses/glasses_pickup3.ogg new file mode 100644 index 000000000000..a7205035ec9b Binary files /dev/null and b/sound/items/glasses/glasses_pickup3.ogg differ diff --git a/sound/items/goggles/attribution.txt b/sound/items/goggles/attribution.txt new file mode 100644 index 000000000000..0724f8c60a55 --- /dev/null +++ b/sound/items/goggles/attribution.txt @@ -0,0 +1 @@ +goggles sounds made by grungussuss, license: CC-BY-SA \ No newline at end of file diff --git a/sound/items/goggles/goggles_drop1.ogg b/sound/items/goggles/goggles_drop1.ogg new file mode 100644 index 000000000000..c7aebbb9ad75 Binary files /dev/null and b/sound/items/goggles/goggles_drop1.ogg differ diff --git a/sound/items/goggles/goggles_drop2.ogg b/sound/items/goggles/goggles_drop2.ogg new file mode 100644 index 000000000000..b4744f960c58 Binary files /dev/null and b/sound/items/goggles/goggles_drop2.ogg differ diff --git a/sound/items/goggles/goggles_drop3.ogg b/sound/items/goggles/goggles_drop3.ogg new file mode 100644 index 000000000000..5fde0527e4f6 Binary files /dev/null and b/sound/items/goggles/goggles_drop3.ogg differ diff --git a/sound/items/goggles/goggles_equip1.ogg b/sound/items/goggles/goggles_equip1.ogg new file mode 100644 index 000000000000..2c95b4a504a8 Binary files /dev/null and b/sound/items/goggles/goggles_equip1.ogg differ diff --git a/sound/items/goggles/goggles_equip2.ogg b/sound/items/goggles/goggles_equip2.ogg new file mode 100644 index 000000000000..01f409c9350d Binary files /dev/null and b/sound/items/goggles/goggles_equip2.ogg differ diff --git a/sound/items/goggles/goggles_equip3.ogg b/sound/items/goggles/goggles_equip3.ogg new file mode 100644 index 000000000000..25ce1a89a404 Binary files /dev/null and b/sound/items/goggles/goggles_equip3.ogg differ diff --git a/sound/items/goggles/goggles_equip4.ogg b/sound/items/goggles/goggles_equip4.ogg new file mode 100644 index 000000000000..ac051748d3f3 Binary files /dev/null and b/sound/items/goggles/goggles_equip4.ogg differ diff --git a/sound/items/goggles/goggles_pickup1.ogg b/sound/items/goggles/goggles_pickup1.ogg new file mode 100644 index 000000000000..49a0cb54ae2f Binary files /dev/null and b/sound/items/goggles/goggles_pickup1.ogg differ diff --git a/sound/items/goggles/goggles_pickup2.ogg b/sound/items/goggles/goggles_pickup2.ogg new file mode 100644 index 000000000000..adbadd4b0631 Binary files /dev/null and b/sound/items/goggles/goggles_pickup2.ogg differ diff --git a/sound/items/goggles/goggles_pickup3.ogg b/sound/items/goggles/goggles_pickup3.ogg new file mode 100644 index 000000000000..b15dc127af42 Binary files /dev/null and b/sound/items/goggles/goggles_pickup3.ogg differ diff --git a/sound/items/hard_hat/attribution.txt b/sound/items/hard_hat/attribution.txt new file mode 100644 index 000000000000..8691b7d0b3f1 --- /dev/null +++ b/sound/items/hard_hat/attribution.txt @@ -0,0 +1 @@ + made by grungussuss, license: CC-BY-SA \ No newline at end of file diff --git a/sound/items/hard_hat/hard_hat_drop1.ogg b/sound/items/hard_hat/hard_hat_drop1.ogg new file mode 100644 index 000000000000..a70f72b7c683 Binary files /dev/null and b/sound/items/hard_hat/hard_hat_drop1.ogg differ diff --git a/sound/items/hard_hat/hard_hat_drop2.ogg b/sound/items/hard_hat/hard_hat_drop2.ogg new file mode 100644 index 000000000000..7bb8cb526f9f Binary files /dev/null and b/sound/items/hard_hat/hard_hat_drop2.ogg differ diff --git a/sound/items/hard_hat/hard_hat_drop3.ogg b/sound/items/hard_hat/hard_hat_drop3.ogg new file mode 100644 index 000000000000..8144638ae2e0 Binary files /dev/null and b/sound/items/hard_hat/hard_hat_drop3.ogg differ diff --git a/sound/items/hard_hat/hard_hat_drop4.ogg b/sound/items/hard_hat/hard_hat_drop4.ogg new file mode 100644 index 000000000000..83eaa7ea1ee8 Binary files /dev/null and b/sound/items/hard_hat/hard_hat_drop4.ogg differ diff --git a/sound/items/hard_hat/hard_hat_drop5.ogg b/sound/items/hard_hat/hard_hat_drop5.ogg new file mode 100644 index 000000000000..04d2c39a85a0 Binary files /dev/null and b/sound/items/hard_hat/hard_hat_drop5.ogg differ diff --git a/sound/items/hard_hat/hard_hat_equip1.ogg b/sound/items/hard_hat/hard_hat_equip1.ogg new file mode 100644 index 000000000000..643da4ba3f48 Binary files /dev/null and b/sound/items/hard_hat/hard_hat_equip1.ogg differ diff --git a/sound/items/hard_hat/hard_hat_equip2.ogg b/sound/items/hard_hat/hard_hat_equip2.ogg new file mode 100644 index 000000000000..db81731dc4fb Binary files /dev/null and b/sound/items/hard_hat/hard_hat_equip2.ogg differ diff --git a/sound/items/hard_hat/hard_hat_equip3.ogg b/sound/items/hard_hat/hard_hat_equip3.ogg new file mode 100644 index 000000000000..b568a4e31e91 Binary files /dev/null and b/sound/items/hard_hat/hard_hat_equip3.ogg differ diff --git a/sound/items/hard_hat/hard_hat_pickup1.ogg b/sound/items/hard_hat/hard_hat_pickup1.ogg new file mode 100644 index 000000000000..cbce12af8857 Binary files /dev/null and b/sound/items/hard_hat/hard_hat_pickup1.ogg differ diff --git a/sound/items/hard_hat/hard_hat_pickup2.ogg b/sound/items/hard_hat/hard_hat_pickup2.ogg new file mode 100644 index 000000000000..5cb352d29ce1 Binary files /dev/null and b/sound/items/hard_hat/hard_hat_pickup2.ogg differ diff --git a/sound/items/hard_hat/hard_hat_pickup3.ogg b/sound/items/hard_hat/hard_hat_pickup3.ogg new file mode 100644 index 000000000000..3b4bf47d6a1a Binary files /dev/null and b/sound/items/hard_hat/hard_hat_pickup3.ogg differ diff --git a/sound/items/hard_hat/hard_hat_pickup4.ogg b/sound/items/hard_hat/hard_hat_pickup4.ogg new file mode 100644 index 000000000000..158214df2750 Binary files /dev/null and b/sound/items/hard_hat/hard_hat_pickup4.ogg differ diff --git a/sound/items/hard_hat/hard_hat_pickup5.ogg b/sound/items/hard_hat/hard_hat_pickup5.ogg new file mode 100644 index 000000000000..81fc8ba8ebcb Binary files /dev/null and b/sound/items/hard_hat/hard_hat_pickup5.ogg differ diff --git a/sound/items/knife/attribution.txt b/sound/items/knife/attribution.txt new file mode 100644 index 000000000000..670d04e5209a --- /dev/null +++ b/sound/items/knife/attribution.txt @@ -0,0 +1 @@ +knife sounds made by grungussuss, license: CC-BY-SA \ No newline at end of file diff --git a/sound/items/knife/knife_drop1.ogg b/sound/items/knife/knife_drop1.ogg new file mode 100644 index 000000000000..c42c96ff42f4 Binary files /dev/null and b/sound/items/knife/knife_drop1.ogg differ diff --git a/sound/items/knife/knife_drop2.ogg b/sound/items/knife/knife_drop2.ogg new file mode 100644 index 000000000000..41a7bb28894b Binary files /dev/null and b/sound/items/knife/knife_drop2.ogg differ diff --git a/sound/items/knife/knife_drop3.ogg b/sound/items/knife/knife_drop3.ogg new file mode 100644 index 000000000000..edd938845de1 Binary files /dev/null and b/sound/items/knife/knife_drop3.ogg differ diff --git a/sound/items/knife/knife_pickup1.ogg b/sound/items/knife/knife_pickup1.ogg new file mode 100644 index 000000000000..b61b25b5745b Binary files /dev/null and b/sound/items/knife/knife_pickup1.ogg differ diff --git a/sound/items/knife/knife_pickup2.ogg b/sound/items/knife/knife_pickup2.ogg new file mode 100644 index 000000000000..afa278ade874 Binary files /dev/null and b/sound/items/knife/knife_pickup2.ogg differ diff --git a/sound/items/knife/knife_pickup3.ogg b/sound/items/knife/knife_pickup3.ogg new file mode 100644 index 000000000000..c3b0bbc3c31b Binary files /dev/null and b/sound/items/knife/knife_pickup3.ogg differ diff --git a/sound/items/knife/knife_slice1.ogg b/sound/items/knife/knife_slice1.ogg new file mode 100644 index 000000000000..505b37b48387 Binary files /dev/null and b/sound/items/knife/knife_slice1.ogg differ diff --git a/sound/items/knife/knife_slice2.ogg b/sound/items/knife/knife_slice2.ogg new file mode 100644 index 000000000000..12ebc62f6edb Binary files /dev/null and b/sound/items/knife/knife_slice2.ogg differ diff --git a/sound/items/knife/knife_slice3.ogg b/sound/items/knife/knife_slice3.ogg new file mode 100644 index 000000000000..70a6986515dc Binary files /dev/null and b/sound/items/knife/knife_slice3.ogg differ diff --git a/sound/items/knife/knife_slice4.ogg b/sound/items/knife/knife_slice4.ogg new file mode 100644 index 000000000000..24ae9cc2ac78 Binary files /dev/null and b/sound/items/knife/knife_slice4.ogg differ diff --git a/sound/items/knife/knife_slice5.ogg b/sound/items/knife/knife_slice5.ogg new file mode 100644 index 000000000000..f6e804a8f949 Binary files /dev/null and b/sound/items/knife/knife_slice5.ogg differ diff --git a/sound/items/knife/knife_slice6.ogg b/sound/items/knife/knife_slice6.ogg new file mode 100644 index 000000000000..17a0cf294acc Binary files /dev/null and b/sound/items/knife/knife_slice6.ogg differ diff --git a/sound/items/pot/attribution.txt b/sound/items/pot/attribution.txt new file mode 100644 index 000000000000..313416398a25 --- /dev/null +++ b/sound/items/pot/attribution.txt @@ -0,0 +1 @@ +pot sounds made by grungussuss, license: CC-BY-SA \ No newline at end of file diff --git a/sound/items/pot/pot_drop1.ogg b/sound/items/pot/pot_drop1.ogg new file mode 100644 index 000000000000..593fe43e04f8 Binary files /dev/null and b/sound/items/pot/pot_drop1.ogg differ diff --git a/sound/items/pot/pot_drop2.ogg b/sound/items/pot/pot_drop2.ogg new file mode 100644 index 000000000000..8dbdc48ce533 Binary files /dev/null and b/sound/items/pot/pot_drop2.ogg differ diff --git a/sound/items/pot/pot_drop3.ogg b/sound/items/pot/pot_drop3.ogg new file mode 100644 index 000000000000..57df371c7834 Binary files /dev/null and b/sound/items/pot/pot_drop3.ogg differ diff --git a/sound/items/pot/pot_pickup1.ogg b/sound/items/pot/pot_pickup1.ogg new file mode 100644 index 000000000000..c4e380a62564 Binary files /dev/null and b/sound/items/pot/pot_pickup1.ogg differ diff --git a/sound/items/pot/pot_pickup2.ogg b/sound/items/pot/pot_pickup2.ogg new file mode 100644 index 000000000000..29101a555ec6 Binary files /dev/null and b/sound/items/pot/pot_pickup2.ogg differ diff --git a/sound/items/pot/pot_pickup3.ogg b/sound/items/pot/pot_pickup3.ogg new file mode 100644 index 000000000000..3ac3c22a85b0 Binary files /dev/null and b/sound/items/pot/pot_pickup3.ogg differ diff --git a/sound/items/potted_plant/attribution.txt b/sound/items/potted_plant/attribution.txt new file mode 100644 index 000000000000..ded8cc3105d1 --- /dev/null +++ b/sound/items/potted_plant/attribution.txt @@ -0,0 +1 @@ +potted_plant sounds made by grungussuss, license: CC-BY-SA \ No newline at end of file diff --git a/sound/items/potted_plant/potted_plant_drop1.ogg b/sound/items/potted_plant/potted_plant_drop1.ogg new file mode 100644 index 000000000000..2d8df05a504c Binary files /dev/null and b/sound/items/potted_plant/potted_plant_drop1.ogg differ diff --git a/sound/items/potted_plant/potted_plant_drop2.ogg b/sound/items/potted_plant/potted_plant_drop2.ogg new file mode 100644 index 000000000000..a2fa1fb0c670 Binary files /dev/null and b/sound/items/potted_plant/potted_plant_drop2.ogg differ diff --git a/sound/items/potted_plant/potted_plant_drop3.ogg b/sound/items/potted_plant/potted_plant_drop3.ogg new file mode 100644 index 000000000000..38dc4da08f3e Binary files /dev/null and b/sound/items/potted_plant/potted_plant_drop3.ogg differ diff --git a/sound/items/potted_plant/potted_plant_drop4.ogg b/sound/items/potted_plant/potted_plant_drop4.ogg new file mode 100644 index 000000000000..0f2172e8fa7c Binary files /dev/null and b/sound/items/potted_plant/potted_plant_drop4.ogg differ diff --git a/sound/items/potted_plant/potted_plant_drop5.ogg b/sound/items/potted_plant/potted_plant_drop5.ogg new file mode 100644 index 000000000000..c85c29a1d049 Binary files /dev/null and b/sound/items/potted_plant/potted_plant_drop5.ogg differ diff --git a/sound/items/potted_plant/potted_plant_pickup1.ogg b/sound/items/potted_plant/potted_plant_pickup1.ogg new file mode 100644 index 000000000000..cdbdbbd462fc Binary files /dev/null and b/sound/items/potted_plant/potted_plant_pickup1.ogg differ diff --git a/sound/items/potted_plant/potted_plant_pickup2.ogg b/sound/items/potted_plant/potted_plant_pickup2.ogg new file mode 100644 index 000000000000..30092f908455 Binary files /dev/null and b/sound/items/potted_plant/potted_plant_pickup2.ogg differ diff --git a/sound/items/potted_plant/potted_plant_pickup3.ogg b/sound/items/potted_plant/potted_plant_pickup3.ogg new file mode 100644 index 000000000000..eb988e7bc0af Binary files /dev/null and b/sound/items/potted_plant/potted_plant_pickup3.ogg differ diff --git a/sound/items/potted_plant/potted_plant_pickup4.ogg b/sound/items/potted_plant/potted_plant_pickup4.ogg new file mode 100644 index 000000000000..b0c54529f90b Binary files /dev/null and b/sound/items/potted_plant/potted_plant_pickup4.ogg differ diff --git a/sound/items/potted_plant/potted_plant_pickup5.ogg b/sound/items/potted_plant/potted_plant_pickup5.ogg new file mode 100644 index 000000000000..0cb9622355b2 Binary files /dev/null and b/sound/items/potted_plant/potted_plant_pickup5.ogg differ diff --git a/sound/items/rolling_pin/attribution.txt b/sound/items/rolling_pin/attribution.txt new file mode 100644 index 000000000000..093952818827 --- /dev/null +++ b/sound/items/rolling_pin/attribution.txt @@ -0,0 +1 @@ +rolling pin sounds made by grungussuss, license: CC-BY-SA \ No newline at end of file diff --git a/sound/items/rolling_pin/rolling_pin_drop1.ogg b/sound/items/rolling_pin/rolling_pin_drop1.ogg new file mode 100644 index 000000000000..28005a5961c9 Binary files /dev/null and b/sound/items/rolling_pin/rolling_pin_drop1.ogg differ diff --git a/sound/items/rolling_pin/rolling_pin_drop2.ogg b/sound/items/rolling_pin/rolling_pin_drop2.ogg new file mode 100644 index 000000000000..6e874df0fe3b Binary files /dev/null and b/sound/items/rolling_pin/rolling_pin_drop2.ogg differ diff --git a/sound/items/rolling_pin/rolling_pin_drop3.ogg b/sound/items/rolling_pin/rolling_pin_drop3.ogg new file mode 100644 index 000000000000..5cb2abe4f0de Binary files /dev/null and b/sound/items/rolling_pin/rolling_pin_drop3.ogg differ diff --git a/sound/items/rolling_pin/rolling_pin_pickup1.ogg b/sound/items/rolling_pin/rolling_pin_pickup1.ogg new file mode 100644 index 000000000000..18982d3df6ef Binary files /dev/null and b/sound/items/rolling_pin/rolling_pin_pickup1.ogg differ diff --git a/sound/items/rolling_pin/rolling_pin_pickup2.ogg b/sound/items/rolling_pin/rolling_pin_pickup2.ogg new file mode 100644 index 000000000000..67a6b1015f62 Binary files /dev/null and b/sound/items/rolling_pin/rolling_pin_pickup2.ogg differ diff --git a/sound/items/rolling_pin/rolling_pin_pickup3.ogg b/sound/items/rolling_pin/rolling_pin_pickup3.ogg new file mode 100644 index 000000000000..78ef5fb196d0 Binary files /dev/null and b/sound/items/rolling_pin/rolling_pin_pickup3.ogg differ diff --git a/sound/items/rolling_pin/rolling_pin_rolling1.ogg b/sound/items/rolling_pin/rolling_pin_rolling1.ogg new file mode 100644 index 000000000000..67c7a1e7039b Binary files /dev/null and b/sound/items/rolling_pin/rolling_pin_rolling1.ogg differ diff --git a/sound/items/rolling_pin/rolling_pin_rolling2.ogg b/sound/items/rolling_pin/rolling_pin_rolling2.ogg new file mode 100644 index 000000000000..d7dc5efb126f Binary files /dev/null and b/sound/items/rolling_pin/rolling_pin_rolling2.ogg differ diff --git a/sound/items/rolling_pin/rolling_pin_rolling3.ogg b/sound/items/rolling_pin/rolling_pin_rolling3.ogg new file mode 100644 index 000000000000..e04bfb1935bd Binary files /dev/null and b/sound/items/rolling_pin/rolling_pin_rolling3.ogg differ diff --git a/sound/items/rolling_pin/rolling_pin_rolling4.ogg b/sound/items/rolling_pin/rolling_pin_rolling4.ogg new file mode 100644 index 000000000000..5d2a07911288 Binary files /dev/null and b/sound/items/rolling_pin/rolling_pin_rolling4.ogg differ diff --git a/sound/items/rolling_pin/rolling_pin_rolling5.ogg b/sound/items/rolling_pin/rolling_pin_rolling5.ogg new file mode 100644 index 000000000000..49fde6b9f895 Binary files /dev/null and b/sound/items/rolling_pin/rolling_pin_rolling5.ogg differ diff --git a/sound/items/rolling_pin/rolling_pin_rolling6.ogg b/sound/items/rolling_pin/rolling_pin_rolling6.ogg new file mode 100644 index 000000000000..836dc44f5721 Binary files /dev/null and b/sound/items/rolling_pin/rolling_pin_rolling6.ogg differ diff --git a/sound/items/tray/attribution.txt b/sound/items/tray/attribution.txt new file mode 100644 index 000000000000..7a9a0df19ae7 --- /dev/null +++ b/sound/items/tray/attribution.txt @@ -0,0 +1 @@ +tray sounds made by grungussuss, license: CC-BY-SA \ No newline at end of file diff --git a/sound/items/tray/tray_drop1.ogg b/sound/items/tray/tray_drop1.ogg new file mode 100644 index 000000000000..bb3651c42992 Binary files /dev/null and b/sound/items/tray/tray_drop1.ogg differ diff --git a/sound/items/tray/tray_drop2.ogg b/sound/items/tray/tray_drop2.ogg new file mode 100644 index 000000000000..aa435e0b1bc6 Binary files /dev/null and b/sound/items/tray/tray_drop2.ogg differ diff --git a/sound/items/tray/tray_drop3.ogg b/sound/items/tray/tray_drop3.ogg new file mode 100644 index 000000000000..861a9eaa5886 Binary files /dev/null and b/sound/items/tray/tray_drop3.ogg differ diff --git a/sound/items/tray/tray_insert1.ogg b/sound/items/tray/tray_insert1.ogg new file mode 100644 index 000000000000..29199ad8ed7c Binary files /dev/null and b/sound/items/tray/tray_insert1.ogg differ diff --git a/sound/items/tray/tray_insert2.ogg b/sound/items/tray/tray_insert2.ogg new file mode 100644 index 000000000000..7e1d4c132b03 Binary files /dev/null and b/sound/items/tray/tray_insert2.ogg differ diff --git a/sound/items/tray/tray_insert3.ogg b/sound/items/tray/tray_insert3.ogg new file mode 100644 index 000000000000..5cc881a97318 Binary files /dev/null and b/sound/items/tray/tray_insert3.ogg differ diff --git a/sound/items/tray/tray_pickup1.ogg b/sound/items/tray/tray_pickup1.ogg new file mode 100644 index 000000000000..5669f7e4f7ea Binary files /dev/null and b/sound/items/tray/tray_pickup1.ogg differ diff --git a/sound/items/tray/tray_pickup2.ogg b/sound/items/tray/tray_pickup2.ogg new file mode 100644 index 000000000000..cd5f501f06e5 Binary files /dev/null and b/sound/items/tray/tray_pickup2.ogg differ diff --git a/sound/items/tray/tray_pickup3.ogg b/sound/items/tray/tray_pickup3.ogg new file mode 100644 index 000000000000..29e1ffff0787 Binary files /dev/null and b/sound/items/tray/tray_pickup3.ogg differ diff --git a/sound/items/weapons/attributions.txt b/sound/items/weapons/attributions.txt index 6a7d58874db0..7be6a7d6d62b 100644 --- a/sound/items/weapons/attributions.txt +++ b/sound/items/weapons/attributions.txt @@ -2,3 +2,5 @@ rust_sower_armbomb.ogg - EnterTheJake rust_sower_explode.ogg - EnterTheJake } + +gun_mode_switch1.ogg made by grungussuss, license: CC-BY-SA \ No newline at end of file diff --git a/sound/items/weapons/gun/rifle/attributions.txt b/sound/items/weapons/gun/rifle/attributions.txt new file mode 100644 index 000000000000..2b2346b7d803 --- /dev/null +++ b/sound/items/weapons/gun/rifle/attributions.txt @@ -0,0 +1 @@ +Heavy SMG and the NAPAD smg sprite were both made by Trelus in GH pull request https://github.com/NovaSector/NovaSector/pull/4880 diff --git a/sound/items/weapons/gun/rifle/smg_heavy.ogg b/sound/items/weapons/gun/rifle/smg_heavy.ogg new file mode 100644 index 000000000000..77a11a524a78 Binary files /dev/null and b/sound/items/weapons/gun/rifle/smg_heavy.ogg differ diff --git a/sound/items/weapons/gun_mode_switch1.ogg b/sound/items/weapons/gun_mode_switch1.ogg new file mode 100644 index 000000000000..77724052482b Binary files /dev/null and b/sound/items/weapons/gun_mode_switch1.ogg differ diff --git a/sound/machines/airlock/airlock_latch_hiss.ogg b/sound/machines/airlock/airlock_latch_hiss.ogg new file mode 100644 index 000000000000..ac89921d0e1f Binary files /dev/null and b/sound/machines/airlock/airlock_latch_hiss.ogg differ diff --git a/sound/machines/airlock/attributions.txt b/sound/machines/airlock/attributions.txt new file mode 100644 index 000000000000..ab6ad4b9dc26 --- /dev/null +++ b/sound/machines/airlock/attributions.txt @@ -0,0 +1 @@ +airlock_latch_hiss.ogg is sourced from Usernameis1337 under a CC Attribution 4.0 license via https://freesound.org/people/Usernameis1337/sounds/632755/ diff --git a/sound/mobs/humanoids/moth/credit.txt b/sound/mobs/humanoids/moth/credit.txt index 7f64b72841e3..d010c0e03648 100644 --- a/sound/mobs/humanoids/moth/credit.txt +++ b/sound/mobs/humanoids/moth/credit.txt @@ -1,5 +1,9 @@ -"moth_flutter" modified from +"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 +who knows where the original moth scream noise was I sure as hell don't + +moth_chitter and moth_squeak were taken and edited by Sothanforax from +https://github.com/BeeStation/BeeStation-Hornet/tree/master/sound/emotes/moth +(CC-BY-SA-3.0) diff --git a/sound/mobs/humanoids/moth/moth_chitter.ogg b/sound/mobs/humanoids/moth/moth_chitter.ogg new file mode 100644 index 000000000000..45bac84425b9 Binary files /dev/null and b/sound/mobs/humanoids/moth/moth_chitter.ogg differ diff --git a/sound/mobs/humanoids/moth/moth_squeak.ogg b/sound/mobs/humanoids/moth/moth_squeak.ogg new file mode 100644 index 000000000000..f71d7f87c5a9 Binary files /dev/null and b/sound/mobs/humanoids/moth/moth_squeak.ogg differ diff --git a/sound/mobs/non-humanoids/stargazer/beam_loop_one.ogg b/sound/mobs/non-humanoids/stargazer/beam_loop_one.ogg new file mode 100644 index 000000000000..957fb4cd1756 Binary files /dev/null and b/sound/mobs/non-humanoids/stargazer/beam_loop_one.ogg differ diff --git a/sound/mobs/non-humanoids/stargazer/beam_loop_two.ogg b/sound/mobs/non-humanoids/stargazer/beam_loop_two.ogg new file mode 100644 index 000000000000..5d6d00044917 Binary files /dev/null and b/sound/mobs/non-humanoids/stargazer/beam_loop_two.ogg differ diff --git a/sound/mobs/non-humanoids/stargazer/beam_open.ogg b/sound/mobs/non-humanoids/stargazer/beam_open.ogg new file mode 100644 index 000000000000..1f99c32c61c7 Binary files /dev/null and b/sound/mobs/non-humanoids/stargazer/beam_open.ogg differ diff --git a/strings/1000_most_common.txt b/strings/1000_most_common.txt deleted file mode 100644 index adbe0f6fcf09..000000000000 --- a/strings/1000_most_common.txt +++ /dev/null @@ -1,1035 +0,0 @@ -a -able -about -above -accept -across -act -actually -add -admit -afraid -after -afternoon -again -against -age -ago -agree -ah -ahead -air -all -allow -almost -alone -along -already -alright -also -although -always -am -amaze -an -and -anger -angry -animal -annoy -another -answer -any -anymore -anyone -anything -anyway -apartment -apparently -appear -approach -are -area -aren't -arent -arm -around -arrive -as -ask -asleep -ass -at -attack -attempt -attention -aunt -avoid -away -baby -back -bad -bag -ball -band -bar -barely -bathroom -be -beat -beautiful -became -because -become -bed -bedroom -been -before -began -begin -behind -believe -bell -beside -besides -best -better -between -big -bit -bite -black -blink -block -blonde -blood -blue -blush -body -book -bore -both -bother -bottle -bottom -box -boy -boyfriend -brain -break -breakfast -breath -breathe -bright -bring -broke -broken -brother -brought -brown -brush -build -burn -burst -bus -business -busy -but -buy -by -call -calm -came -can -can't -cant -car -card -care -carefully -carry -case -cat -catch -caught -cause -cell -chair -chance -change -chase -check -cheek -chest -child -children -chuckle -city -class -clean -clear -climb -close -clothes -coffee -cold -college -color -come -comment -complete -completely -computer -concern -confuse -consider -continue -control -conversation -cool -corner -couch -could -couldn't -couldnt -counter -couple -course -cover -crack -crazy -cross -crowd -cry -cup -cut -cute -dad -damn -dance -dark -date -daughter -day -dead -deal -dear -death -decide -deep -definitely -desk -did -didn't -didnt -die -different -dinner -direction -disappear -do -doctor -does -doesn't -doesnt -dog -don't -done -dont -door -doubt -down -drag -draw -dream -dress -drink -drive -drop -drove -dry -during -each -ear -early -easily -easy -eat -edge -either -else -empty -end -enjoy -enough -enter -entire -escape -especially -even -evening -eventually -ever -every -everyone -everything -exactly -except -excite -exclaim -excuse -expect -explain -expression -eye -eyebrow -face -fact -fall -family -far -fast -father -fault -favorite -fear -feel -feet -fell -felt -few -field -fight -figure -fill -finally -find -fine -finger -finish -fire -first -fit -five -fix -flash -flip -floor -fly -focus -follow -food -foot -for -force -forget -form -forward -found -four -free -friend -from -front -frown -fuck -full -fun -funny -further -game -gasp -gave -gaze -gently -get -giggle -girl -girlfriend -give -given -glad -glance -glare -glass -go -God -gone -gonna -good -got -gotten -grab -great -green -greet -grey -grin -grip -groan -ground -group -grow -guard -guess -gun -guy -had -hadn't -hadnt -hair -half -hall -hallway -hand -handle -hang -happen -happy -hard -has -hate -have -haven't -havent -he -he'd -he's -head -hear -heard -heart -heavy -hed -held -hell -hello -help -her -here -herself -hes -hey -hi -hide -high -him -himself -his -hit -hold -home -hope -horse -hospital -hot -hour -house -how -however -hug -huge -huh -human -hundred -hung -hurry -hurt -I -I'd -I'll -I'm -I've -ice -Id -idea -if -ignore -Ill -Im -imagine -immediately -important -in -inside -instead -interest -interrupt -into -is -isn't -isnt -it -it's -its -its -Ive -jacket -jeans -jerk -job -join -joke -jump -just -keep -kept -key -kick -kid -kill -kind -kiss -kitchen -knee -knew -knock -know -known -lady -land -large -last -late -laugh -lay -lead -lean -learn -least -leave -led -left -leg -less -let -letter -lie -life -lift -light -like -line -lip -listen -little -live -lock -locker -long -look -lose -lost -lot -loud -love -low -lunch -mad -made -make -man -manage -many -mark -marry -match -matter -may -maybe -me -mean -meant -meet -memory -men -mention -met -middle -might -mind -mine -minute -mirror -miss -mom -moment -money -month -mood -more -morning -most -mother -mouth -move -movie -mr -mrs -much -mum -mumble -music -must -mutter -my -myself -name -near -nearly -neck -need -nervous -never -new -next -nice -night -no -nod -noise -none -normal -nose -not -note -nothing -notice -now -number -obviously -of -off -offer -office -often -oh -okay -old -on -once -one -only -onto -open -or -order -other -our -out -outside -over -own -pack -pain -paint -pair -pants -paper -parents -park -part -party -pass -past -pause -pay -people -perfect -perhaps -person -phone -pick -picture -piece -pink -piss -place -plan -play -please -pocket -point -police -pop -position -possible -power -practically -present -press -pretend -pretty -probably -problem -promise -pull -punch -push -put -question -quick -quickly -quiet -quietly -quite -race -rain -raise -ran -rang -rather -reach -read -ready -real -realize -really -reason -recognize -red -relationship -relax -remain -remember -remind -repeat -reply -respond -rest -return -ride -right -ring -road -rock -roll -room -rose -round -rub -run -rush -sad -safe -said -same -sat -save -saw -say -scare -school -scream -search -seat -second -see -seem -seen -self -send -sense -sent -serious -seriously -set -settle -seven -several -shadow -shake -share -she -she'd -she's -shed -shes -shift -shirt -shit -shock -shoe -shook -shop -short -shot -should -shoulder -shouldn't -shouldnt -shout -shove -show -shower -shrug -shut -sick -side -sigh -sight -sign -silence -silent -simply -since -single -sir -sister -sit -situation -six -skin -sky -slam -sleep -slightly -slip -slow -slowly -small -smell -smile -smirk -smoke -snap -so -soft -softly -some -somehow -someone -something -sometimes -somewhere -son -song -soon -sorry -sort -sound -space -speak -spend -spent -spoke -spot -stair -stand -star -stare -start -state -stay -step -stick -still -stomach -stood -stop -store -story -straight -strange -street -strong -struggle -stuck -student -study -stuff -stupid -such -suck -sudden -suddenly -suggest -summer -sun -suppose -sure -surprise -surround -sweet -table -take -taken -talk -tall -teacher -team -tear -teeth -tell -ten -than -thank -that -that's -thats -the -their -them -themselves -then -there -there's -theres -these -they -they'd -they're -theyd -theyre -thick -thing -think -third -this -those -though -thought -three -threw -throat -through -throw -tie -tight -time -tiny -tire -to -today -together -told -tomorrow -tone -tongue -tonight -too -took -top -totally -touch -toward -town -track -trail -train -tree -trip -trouble -TRUE -trust -truth -try -turn -TV -twenty -two -type -uncle -under -understand -until -up -upon -us -use -usual -usually -very -visit -voice -wait -wake -walk -wall -want -warm -warn -was -wasn't -wasnt -watch -water -wave -way -we -we'll -we're -we've -wear -week -weird -well -well -went -were -were -weren't -werent -wet -weve -what -what's -whatever -whats -when -where -whether -which -while -whisper -white -who -whole -why -wide -wife -will -wind -window -wipe -wish -with -within -without -woke -woman -women -won't -wonder -wont -wood -word -wore -work -world -worry -worse -would -wouldn't -wouldnt -wow -wrap -write -wrong -yeah -year -yell -yes -yet -you -you'd -you'll -you're -you've -youd -youll -young -your -youre -yourself -youve diff --git a/strings/1000_most_common_frequency.txt b/strings/1000_most_common_frequency.txt new file mode 100644 index 000000000000..51682289f7ff --- /dev/null +++ b/strings/1000_most_common_frequency.txt @@ -0,0 +1,1000 @@ +the +of +to +and +a +in +is +it +you +that +he +was +for +on +are +with +as +I +his +they +be +at +one +have +this +from +or +had +by +not +word +but +what +some +we +can +out +other +were +all +there +when +up +use +your +how +said +an +each +she +which +do +their +time +if +will +way +about +many +then +them +write +would +like +so +these +her +long +make +thing +see +him +two +has +look +more +day +could +go +come +did +number +sound +no +most +people +my +over +know +water +than +call +first +who +may +down +side +been +now +find +any +new +work +part +take +get +place +made +live +where +after +back +little +only +round +man +year +came +show +every +good +me +give +our +under +name +very +through +just +form +sentence +great +think +say +help +low +line +differ +turn +cause +much +mean +before +move +right +boy +old +too +same +tell +does +set +three +want +air +well +also +play +small +end +put +home +read +hand +port +large +spell +add +even +land +here +must +big +high +such +follow +act +why +ask +men +change +went +light +kind +off +need +house +picture +try +us +again +animal +point +mother +world +near +build +self +earth +father +head +stand +own +page +should +country +found +answer +school +grow +study +still +learn +plant +cover +food +sun +four +between +state +keep +eye +never +last +let +thought +city +tree +cross +farm +hard +start +might +story +saw +far +sea +draw +left +late +run +don't +while +press +close +night +real +life +few +north +open +seem +together +next +white +children +begin +got +walk +example +ease +paper +group +always +music +those +both +mark +often +letter +until +mile +river +car +feet +care +second +book +carry +took +science +eat +room +friend +began +idea +fish +mountain +stop +once +base +hear +horse +cut +sure +watch +color +face +wood +main +enough +plain +girl +usual +young +ready +above +ever +red +list +though +feel +talk +bird +soon +body +dog +family +direct +pose +leave +song +measure +door +product +black +short +numeral +class +wind +question +happen +complete +ship +area +half +rock +order +fire +south +problem +piece +told +knew +pass +since +top +whole +king +space +heard +best +hour +better +true +during +hundred +five +remember +step +early +hold +west +ground +interest +reach +fast +verb +sing +listen +six +table +travel +less +morning +ten +simple +several +vowel +toward +war +lay +against +pattern +slow +center +love +person +money +serve +appear +road +map +rain +rule +govern +pull +cold +notice +voice +unit +power +town +fine +certain +fly +fall +lead +cry +dark +machine +note +wait +plan +figure +star +box +noun +field +rest +correct +able +pound +done +beauty +drive +stood +contain +front +teach +week +final +gave +green +oh +quick +develop +ocean +warm +free +minute +strong +special +mind +behind +clear +tail +produce +fact +street +inch +multiply +nothing +course +stay +wheel +full +force +blue +object +decide +surface +deep +moon +island +foot +system +busy +test +record +boat +common +gold +possible +plane +stead +dry +wonder +laugh +thousand +ago +ran +check +game +shape +equate +hot +miss +brought +heat +snow +tire +bring +yes +distant +fill +east +paint +language +among +grand +ball +yet +wave +drop +heart +am +present +heavy +dance +engine +position +arm +wide +sail +material +size +vary +settle +speak +weight +general +ice +matter +circle +pair +include +divide +syllable +felt +perhaps +pick +sudden +count +square +reason +length +represent +art +subject +region +energy +hunt +probable +bed +brother +egg +ride +cell +believe +fraction +forest +sit +race +window +store +summer +train +sleep +prove +lone +leg +exercise +wall +catch +mount +wish +sky +board +joy +winter +sat +written +wild +instrument +kept +glass +grass +cow +job +edge +sign +visit +past +soft +fun +bright +gas +weather +month +million +bear +finish +happy +hope +flower +clothe +strange +gone +jump +baby +eight +village +meet +root +buy +raise +solve +metal +whether +push +seven +paragraph +third +shall +held +hair +describe +cook +floor +either +result +burn +hill +safe +cat +century +consider +type +law +bit +coast +copy +phrase +silent +tall +sand +soil +roll +temperature +finger +industry +value +fight +lie +beat +excite +natural +view +sense +ear +else +quite +broke +case +middle +kill +son +lake +moment +scale +loud +spring +observe +child +straight +consonant +nation +dictionary +milk +speed +method +organ +pay +age +section +dress +cloud +surprise +quiet +stone +tiny +climb +cool +design +poor +lot +experiment +bottom +key +iron +single +stick +flat +twenty +skin +smile +crease +hole +trade +melody +trip +office +receive +row +mouth +exact +symbol +die +least +trouble +shout +except +wrote +seed +tone +join +suggest +clean +break +lady +yard +rise +bad +blow +oil +blood +touch +grew +cent +mix +team +wire +cost +lost +brown +wear +garden +equal +sent +choose +fell +fit +flow +fair +bank +collect +save +control +decimal +gentle +woman +captain +practice +separate +difficult +doctor +please +protect +noon +whose +locate +ring +character +insect +caught +period +indicate +radio +spoke +atom +human +history +effect +electric +expect +crop +modern +element +hit +student +corner +party +supply +bone +rail +imagine +provide +agree +thus +capital +won't +chair +danger +fruit +rich +thick +soldier +process +operate +guess +necessary +sharp +wing +create +neighbor +wash +bat +rather +crowd +corn +compare +poem +string +bell +depend +meat +rub +tube +famous +dollar +stream +fear +sight +thin +triangle +planet +hurry +chief +colony +clock +mine +tie +enter +major +fresh +search +send +yellow +gun +allow +print +dead +spot +desert +suit +current +lift +rose +continue +block +chart +hat +sell +success +company +subtract +event +particular +deal +swim +term +opposite +wife +shoe +shoulder +spread +arrange +camp +invent +cotton +born +determine +quart +nine +truck +noise +level +chance +gather +shop +stretch +throw +shine +property +column +molecule +select +wrong +gray +repeat +require +broad +prepare +salt +nose +plural +anger +claim +continent +oxygen +sugar +death +pretty +skill +women +season +solution +magnet +silver +thank +branch +match +suffix +especially +fig +afraid +huge +sister +steel +discuss +forward +similar +guide +experience +score +apple +bought +led +pitch +coat +mass +card +band +rope +slip +win +dream +evening +condition +feed +tool +total +basic +smell +valley +nor +double +seat +arrive +master +track +parent +shore +division +sheet +substance +favor +connect +post +spend +chord +fat +glad +original +share +station +dad +bread +charge +proper +bar +offer +segment +slave +duck +instant +market +degree +populate +chick +dear +enemy +reply +drink +occur +support +speech +nature +range +steam +motion +path +liquid +log +meant +quotient +teeth +shell +neck diff --git a/strings/1400_most_common_alpha.txt b/strings/1400_most_common_alpha.txt new file mode 100644 index 000000000000..75032024b47b --- /dev/null +++ b/strings/1400_most_common_alpha.txt @@ -0,0 +1,1396 @@ +a +able +about +above +accept +across +act +actually +add +admit +afraid +after +afternoon +again +against +age +ago +agree +ah +ahead +air +all +allow +almost +alone +along +already +alright +also +although +always +am +amaze +among +an +and +anger +angry +animal +annoy +another +answer +any +anymore +anyone +anything +anyway +apartment +apparently +appear +apple +approach +are +area +aren't +arent +arm +around +arrange +arrive +art +as +ask +asleep +ass +at +atom +attack +attempt +attention +aunt +avoid +away +baby +back +bad +bag +ball +band +bank +bar +barely +base +basic +bat +bathroom +be +bear +beat +beautiful +beauty +became +because +become +bed +bedroom +been +before +began +begin +behind +believe +bell +beside +besides +best +better +between +big +bird +bit +bite +black +blink +block +blonde +blood +blow +blue +blush +board +boat +body +bone +book +bore +born +both +bother +bottle +bottom +bought +box +boy +boyfriend +brain +branch +bread +break +breakfast +breath +breathe +bright +bring +broad +broke +broken +brother +brought +brown +brush +build +burn +burst +bus +business +busy +but +buy +by +call +calm +came +camp +can +can't +cant +capital +captain +car +card +care +carefully +carry +case +cat +catch +caught +cause +cell +cent +center +century +certain +chair +chance +change +character +charge +chart +chase +check +cheek +chest +chick +chief +child +children +choose +chord +chuckle +circle +city +claim +class +clean +clear +climb +clock +close +clothe +clothes +cloud +coast +coat +coffee +cold +collect +college +colony +color +column +come +comment +common +company +compare +complete +completely +computer +concern +condition +confuse +connect +consider +consonant +contain +continent +continue +control +conversation +cook +cool +copy +corn +corner +correct +cost +cotton +couch +could +couldn't +couldnt +count +counter +country +couple +course +cover +cow +crack +crazy +crease +create +crop +cross +crowd +cry +cup +current +cut +cute +dad +damn +dance +danger +dark +date +daughter +day +dead +deal +dear +death +decide +decimal +deep +definitely +degree +depend +describe +desert +design +desk +determine +develop +dictionary +did +didn't +didnt +die +differ +different +difficult +dinner +direct +direction +disappear +discuss +distant +divide +division +do +doctor +does +doesn't +doesnt +dog +dollar +don't +done +dont +door +double +doubt +down +drag +draw +dream +dress +drink +drive +drop +drove +dry +duck +during +each +ear +early +earth +ease +easily +east +easy +eat +edge +effect +egg +eight +either +electric +element +else +empty +end +enemy +energy +engine +enjoy +enough +enter +entire +equal +equate +escape +especially +even +evening +event +eventually +ever +every +everyone +everything +exact +exactly +example +except +excite +exclaim +excuse +exercise +expect +experience +experiment +explain +expression +eye +eyebrow +face +fact +fair +fall +family +famous +far +farm +fast +fat +father +fault +favor +favorite +fear +feed +feel +feet +fell +felt +few +field +fig +fight +figure +fill +final +finally +find +fine +finger +finish +fire +first +fish +fit +five +fix +flash +flat +flip +floor +flow +flower +fly +focus +follow +food +foot +for +force +forest +forget +form +forward +found +four +fraction +free +fresh +friend +from +front +frown +fruit +fuck +full +fun +funny +further +game +garden +gas +gasp +gather +gave +gaze +general +gentle +gently +get +giggle +girl +girlfriend +give +given +glad +glance +glare +glass +go +god +gold +gone +gonna +good +got +gotten +govern +grab +grand +grass +gray +great +green +greet +grew +grey +grin +grip +groan +ground +group +grow +guard +guess +guide +gun +guy +had +hadn't +hadnt +hair +half +hall +hallway +hand +handle +hang +happen +happy +hard +has +hat +hate +have +haven't +havent +he +he'd +he's +head +hear +heard +heart +heat +heavy +hed +held +hell +hello +help +her +here +herself +hes +hey +hi +hide +high +hill +him +himself +his +history +hit +hold +hole +home +hope +horse +hospital +hot +hour +house +how +however +hug +huge +huh +human +hundred +hung +hunt +hurry +hurt +i +i'd +i'll +i'm +i've +ice +id +idea +if +ignore +ill +im +imagine +immediately +important +in +inch +include +indicate +industry +insect +inside +instant +instead +instrument +interest +interrupt +into +invent +iron +is +island +isn't +isnt +it +it's +its +ive +jacket +jeans +jerk +job +join +joke +joy +jump +just +keep +kept +key +kick +kid +kill +kind +king +kiss +kitchen +knee +knew +knock +know +known +lady +lake +land +language +large +last +late +laugh +law +lay +lead +lean +learn +least +leave +led +left +leg +length +less +let +letter +level +lie +life +lift +light +like +line +lip +liquid +list +listen +little +live +locate +lock +locker +log +lone +long +look +lose +lost +lot +loud +love +low +lunch +machine +mad +made +magnet +main +major +make +man +manage +many +map +mark +market +marry +mass +master +match +material +matter +may +maybe +me +mean +meant +measure +meat +meet +melody +memory +men +mention +met +metal +method +middle +might +mile +milk +million +mind +mine +minute +mirror +miss +mix +modern +molecule +mom +moment +money +month +mood +moon +more +morning +most +mother +motion +mount +mountain +mouth +move +movie +mr +mrs +much +multiply +mum +mumble +music +must +mutter +my +myself +name +nation +natural +nature +near +nearly +necessary +neck +need +neighbor +nervous +never +new +next +nice +night +nine +no +nod +noise +none +noon +nor +normal +north +nose +not +note +nothing +notice +noun +now +number +numeral +object +observe +obviously +occur +ocean +of +off +offer +office +often +oh +oil +okay +old +on +once +one +only +onto +open +operate +opposite +or +order +organ +original +other +our +out +outside +over +own +oxygen +pack +page +pain +paint +pair +pants +paper +paragraph +parent +parents +park +part +particular +party +pass +past +path +pattern +pause +pay +people +perfect +perhaps +period +person +phone +phrase +pick +picture +piece +pink +piss +pitch +place +plain +plan +plane +planet +plant +play +please +plural +pocket +poem +point +police +poor +pop +populate +port +pose +position +possible +post +pound +power +practically +practice +prepare +present +press +pretend +pretty +print +probable +probably +problem +process +produce +product +promise +proper +property +protect +prove +provide +pull +punch +push +put +quart +question +quick +quickly +quiet +quietly +quite +quotient +race +radio +rail +rain +raise +ran +rang +range +rather +reach +read +ready +real +realize +really +reason +receive +recognize +record +red +region +relationship +relax +remain +remember +remind +repeat +reply +represent +require +respond +rest +result +return +rich +ride +right +ring +rise +river +road +rock +roll +room +root +rope +rose +round +row +rub +rule +run +rush +sad +safe +said +sail +salt +same +sand +sat +save +saw +say +scale +scare +school +science +score +scream +sea +search +season +seat +second +section +see +seed +seem +seen +segment +select +self +sell +send +sense +sent +sentence +separate +serious +seriously +serve +set +settle +seven +several +shadow +shake +shall +shape +share +sharp +she +she'd +she's +shed +sheet +shell +shes +shift +shine +ship +shirt +shit +shock +shoe +shook +shop +shore +short +shot +should +shoulder +shouldn't +shouldnt +shout +shove +show +shower +shrug +shut +sick +side +sigh +sight +sign +silence +silent +silver +similar +simple +simply +since +sing +single +sir +sister +sit +situation +six +size +skill +skin +sky +slam +slave +sleep +slightly +slip +slow +slowly +small +smell +smile +smirk +smoke +snap +snow +so +soft +softly +soil +soldier +solution +solve +some +somehow +someone +something +sometimes +somewhere +son +song +soon +sorry +sort +sound +south +space +speak +special +speech +speed +spell +spend +spent +spoke +spot +spread +spring +square +stair +stand +star +stare +start +state +station +stay +stead +steam +steel +step +stick +still +stomach +stone +stood +stop +store +story +straight +strange +stream +street +stretch +string +strong +struggle +stuck +student +study +stuff +stupid +subject +substance +subtract +success +such +suck +sudden +suddenly +suffix +sugar +suggest +suit +summer +sun +supply +support +suppose +sure +surface +surprise +surround +sweet +swim +syllable +symbol +system +table +tail +take +taken +talk +tall +teach +teacher +team +tear +teeth +tell +temperature +ten +term +test +than +thank +that +that's +thats +the +their +them +themselves +then +there +there's +theres +these +they +they'd +they're +theyd +theyre +thick +thin +thing +think +third +this +those +though +thought +thousand +three +threw +throat +through +throw +thus +tie +tight +time +tiny +tire +to +today +together +told +tomorrow +tone +tongue +tonight +too +took +tool +top +total +totally +touch +toward +town +track +trade +trail +train +travel +tree +triangle +trip +trouble +truck +true +true +trust +truth +try +tube +turn +tv +twenty +two +type +uncle +under +understand +unit +until +up +upon +us +use +usual +usually +valley +value +vary +verb +very +view +village +visit +voice +vowel +wait +wake +walk +wall +want +war +warm +warn +was +wash +wasn't +wasnt +watch +water +wave +way +we +we'll +we're +we've +wear +weather +week +weight +weird +well +went +were +weren't +werent +west +wet +weve +what +what's +whatever +whats +wheel +when +where +whether +which +while +whisper +white +who +whole +whose +why +wide +wife +wild +will +win +wind +window +wing +winter +wipe +wire +wish +with +within +without +woke +woman +women +won't +wonder +wont +wood +word +wore +work +world +worry +worse +would +wouldn't +wouldnt +wow +wrap +write +written +wrong +wrote +yard +yeah +year +yell +yellow +yes +yet +you +you'd +you'll +you're +you've +youd +youll +young +your +youre +yourself +youve diff --git a/strings/modular_maps/safehouse.toml b/strings/modular_maps/safehouse.toml index 1abb0f6714f8..58128509f471 100644 --- a/strings/modular_maps/safehouse.toml +++ b/strings/modular_maps/safehouse.toml @@ -18,6 +18,9 @@ modules = ["ice.dmm"] [rooms.lavaland_boss] modules = ["lavaland_boss.dmm"] +[rooms.maintsafe] +modules = ["maintsafe.dmm"] + [rooms.mine] modules = ["mine.dmm"] diff --git a/strings/preference_adjectives.txt b/strings/preference_adjectives.txt new file mode 100644 index 000000000000..450e4c78901f --- /dev/null +++ b/strings/preference_adjectives.txt @@ -0,0 +1,114 @@ +Angsty +Awkward +Bedraggled +Blemished +Bony +Brawny +Breathtaking +Bruised +Bulky +Burly +Calm +Chaotic +Charming +Chubby +Coarse +Deformed +Delicate +Despondent +Dignified +Disgusting +Disturbing +Dull +Effeminate +Elegant +Emaciated +Energetic +Exasperated +Exotic +Faint +Feisty +Flabby +Flamboyant +Fragile +Frail +Frazzled +Friendly +Gap-toothed +Gaunt +Gentle +Gloomy +Gormless +Hawkish +Healthy +Hefty +Hobbling +Hyper +Imposing +Inscrutable +Jaded +Lax +Lean +Limp +Lithe +Lopsided +Lovely +Malnourished +Mangled +Masculine +Messy +Muscular +Nimble +Pathetic +Peppy +Petite +Pompous +Pugnacious +Quievering +Radical +Repulsive +Robust +Roguish +Rough +Scarred +Scrawny +Sculpted +Shifty +Shrewd +Sickly +Skittish +Sleek +Sleepy +Slender +Slimy +Slovenly +Sluggish +Sly +Smooth +Sniveling +Soulrendered +Spacy +Stiff +Stony +Stout +Strapping +Sturdy +Stylish +Swarthy +Tense +Tubular +Unattractive +Unblemished +Unhealthy +Unremarkable +Unsightly +Verbose +Vigorous +Waifish +Wilted +Wily +Withered +Worn-Out +Wrinkly +Zealous +Zesty diff --git a/strings/sillytips.txt b/strings/sillytips.txt index b652523bad04..fdf740f07a61 100644 --- a/strings/sillytips.txt +++ b/strings/sillytips.txt @@ -12,6 +12,7 @@ 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 +Gorillas can be killed by land mines placed along forest paths. 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? @@ -39,4 +40,3 @@ When a round ends nearly everything about it is lost forever, leave your salt be You can light a match with the heel of your boot. ...What's that? Friction matches went out of style in the 19th century? That's nonsense! You can win a pulse rifle from the arcade machine. Honest. Your sprite represents your hitbox, so that afro makes you easier to kill. The sacrifices we make for style. -Gorillas can be killed by land mines placed along forest paths. diff --git a/strings/tips.txt b/strings/tips.txt index 0eba101a1c07..37fd842d1dec 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -3,6 +3,8 @@ A Scientist will pay top dollar for your frogs! A thrown glass of water can make a slippery tile, allowing you to slow down your pursuers in a pinch. Anything you can light a cigarette with, you can use to cauterize a bleeding wound. Technically, that includes the Supermatter. +As a Bitrunner, upgrading your quantum server will increase rewards and reduce downtime. +As a Bitrunner, your avatar has a domain info ability which will give you clues to help complete virtual domains. As a Blobbernaut, you can communicate with overminds and other Blobbernauts via :b. As a Blobbernaut, your HUD shows your health and the core health of the overmind that created you. As a Botanist, you can combine production trait chemicals just like a Chemist. Hydrogen(grass) + water(peas) + sugar(grapes) equal mannitol! @@ -13,13 +15,14 @@ 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, Repurposed Glands will break bolas, disable stuns, and give you a hefty speed boost at the cost of the use of your arms - which includes the ability to open restricted airlocks. 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 Chemist, Holy Water and Potassium mixed together will create a HOLY explosion, with increased power scaling by amount used. If at least 75 units of both are used, the explosion will reveal, ignite, and paralyze any cultists, heretics, and revenants in sight. Do it! 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. -As a Chemist, Holy Water and Potassium mixed together will create a HOLY explosion, with increased power scaling by amount used. If at least 75 units of both are used, the explosion will reveal, ignite, and paralyze any cultists, heretics, and revenants in sight. Do it! As a Chemist, you can quickly make 100u plastic bottles directly from plastic sheets, alongside being able to make 120u plastic beakers in the lathe. The ChemMaster can produce infinite 30u glass bottles as well and if researched the medical techfab can make beakers with capacity ranging from 120u to 300u. As a Chemist, you can recharge your chemical dispenser with an inducer or by replacing its cell. As a Chemist, you will be expected to supply crew with certain chemicals. For example, Cryoxadone and Mannitol for the cryo tubes, Diethylamine and Saltpetre for botany, as well as healing pills and patches for the front desk. @@ -31,7 +34,9 @@ As a Cook, you can load your food into smartfridges and custom vending machines. As a Cook, you can rename your custom made food with a pen. As a Cultist, check the alert in the upper-right of your screen for all the details about your cult's current status and objective. As a Cultist, do not cause too much chaos before your objective is completed. If the shuttle gets called too soon, you may not have enough time to win. +As a Cultist, if you manage to sacrifice a Heretic, you will unlock one of three powerful and unique items to be created in every one of your cult's forges, archives, or altars. As a Cultist, the Blood Boil rune will deal massive amounts of brute damage to non-cultists, and some damage to fellow cultists of Nar'Sie nearby, but will create a fire where the rune stands on use. +As a Cultist, when you sacrifice a Heretic, they will be bound inside a powerful haunted longsword. Anyone can then unbind the blade, unlocking its powers and abilities, but also allowing the blade to act of its own free will. As a Cultist, your team starts off very weak, but if necessary can quickly convert everything they have into raw power. Make sure you have the numbers and equipment to support going loud, or the cult will fall flat on its face. As a Curator, you earn a 22% cut (divided by number of curators) of all credits spent on painting patronages. Turn others' patience and artistry skills into your own income! As a Cyborg, choose your model carefully, as only cutting and mending your reset wire will let you re-pick it. If possible, refrain from choosing a model until a situation that requires one occurs. @@ -41,43 +46,50 @@ As a Cyborg, you are impervious to fires and heat. If you are rogue, you can rel As a Drone, you can ping other drones to alert them of areas in the station in need of repair. As a Geneticist, becoming a hulk makes you capable of dealing high melee damage, stun-locking people, and punching through walls. However, you can't fire guns, will lose your hulk status if you go into critical condition, and are not considered a human by the AI while you are a hulk. As a Geneticist, T goes to A, and G goes to C. +As a Geneticist, you should usually save all mutations you unlock. Negative mutations will increase your genetic stability, allowing you to keep more positive mutations. As a Ghost, you can both start and join capture the flag games through the minigames menu, or by clicking on one of the team spawners, which can be found under the "Misc" section of the orbit menu. As a Ghost, you can double click on just about anything to follow it. Or just warp around! As a Ghost, you can see the inside of a container on the ground by clicking on it. -As a Heretic, you can locate an influence by dreaming about random objects around it when you sleep. As a Heretic, the Path of Ash focuses on stealth and disorientation, but as you progress, sheds this playstyle in favor of a more aggressive, fiery finale. -As a Heretic, the Path of Moon will literally drive people around you crazy - perhaps crazy enough to become your allies should you succeed. -As a Heretic, the Path of Lock is an Assistant's best friend, and can open many pathways. Including ones beyond the veil... -As a Heretic, the Path of Flesh allows you to raise an army by summoning ghouls and monsters from beyond the veil. Through ascension, you become a one-man army yourself. -As a Heretic, the Path of Void makes people wish they could scream in the vast emptiness of space or have a chance at escaping from you. In the end, the storm takes all. As a Heretic, the Path of Blade rewards your ability to fight, by making you better and better at it. Though ascension, you can become an ultimate dueling juggernaut. -As a Heretic, the Path of Rust is quite overt, but allows you to shrug of a lot of damage as everything around you slowly decays into nothing but rot and rust. As a Heretic, the Path of Cosmos allows you to take rightful ownership of the very space the crew treads on. And if they don't respect your status, calling in a friend from beyond should show them. +As a Heretic, the Path of Flesh allows you to raise an army by summoning ghouls and monsters from beyond the veil. Through ascension, you become a one-man army yourself. +As a Heretic, the Path of Lock is an Assistant's best friend, and can open many pathways. Including ones beyond the veil... +As a Heretic, the Path of Moon will literally drive people around you crazy - perhaps crazy enough to become your allies should you succeed. +As a Heretic, the Path of Rust is quite overt, but allows you to shrug of a lot of damage as everything around you slowly decays into nothing but rot and rust. +As a Heretic, the Path of Void makes people wish they could scream in the vast emptiness of space or have a chance at escaping from you. In the end, the storm takes all. +As a Heretic, you can also sacrifice cultists, rewarding you with a knowledge point and one of three unique, powerful rewards. +As a Heretic, you can locate an influence by dreaming about random objects around it when you sleep. As a Janitor Cyborg, you are the bane of all slaughter demons and even Bubblegum himself. Cleaning up blood stains will severely gimp them. As a Janitor, if someone steals your janicart, you can instead use your space cleaner spray, grenades, water sprayer, exact bloody revenge or order another from Cargo. As a Janitor, mousetraps can be used to create bombs or booby-trap containers. As a Janitor, you can command cleanbots by pointing at a tile and saying mop/clean. +As a Lawyer, try to negotiate with the Warden if sentences seem too high for the crime. +As a Lawyer, you can try to convince the Captain and Head of Security to hold trials for prisoners in the courtroom. As a Medical Cyborg, you can fully perform surgery and even augment people. +As a Medical Doctor, Saline-Glucose not only acts as a temporary boost to a patient's blood level, it also speeds blood regeneration! Perfect for drained patients! As a Medical Doctor, a shower can be used to help recover from sleep, unconsciousness, confusion, drowsiness, jitters, dizziness, and drunkness. As a Medical Doctor, almost every type of wound can be treated at least temporarily with gauze. When in doubt, wrap it up! +As a Medical Doctor, better environments make for faster surgeries. Perform surgery on an operating computer and using Sterilizine on the patient will speed up the process. As a Medical Doctor, corpses placed inside a freezer or morgue tray will have their organs frozen preventing decay. If you don't have time to revive multiple dead bodies, transfer them to the morgue temporarily! -As a Medical Doctor, corpses with the "...and their soul has departed" description no longer have a ghost attached to them and can't be revived. -As a Medical Doctor, Critical Slash wounds are one of the most dangerous conditions someone can have. Apply gauze, epipens, sutures, cauteries, whatever you can, as soon as possible! -As a Medical Doctor, Saline-Glucose not only acts as a temporary boost to a patient's blood level, it also speeds blood regeneration! Perfect for drained patients! -As a Medical Doctor, treating plasmamen is not impossible! Salbutamol stops them from suffocating and showers stop them from burning alive. You can even perform surgery on them by doing the procedure on a roller bed under a shower. Salbutamol and convermol do NOT heal their oxyloss damage. +As a Medical Doctor, corpses with the "...and their soul has departed" description no longer have a ghost attached to them - you can revive them, but no player will take control, making it largely pointless. +As a Medical Doctor, critical slash wounds are one of the most dangerous conditions someone can have. Apply gauze, epipens, sutures, cauteries, whatever you can, as soon as possible! +As a Medical Doctor, operating computers contain instructions on how to complete every surgery you could dream of. If you are ever confused, use one to guide you through the process. +As a Medical Doctor, treating Plasmamen is not impossible! Stasis machines will keep them from burning and suffocating while you perform necessary surgeries. If you don't have the luxury of one, you can use Salbutamol to prevent suffocation and keep them under a running shower to prevent fire. +As a Medical Doctor, try messing with the Virology lab sometime! 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 a Medical Doctor, unless your patient is in stasis, they will lose blood as you perform surgery on them - especially before you clamp bleeders. Keep an eye on their blood levels, work quickly, and most importantly don't forget to cauterize or suture them after you're finished! +As a Medical Doctor, when messing with viruses, remember that robotic organs can give immunity to disease effects and transmissibility. Make use of the inorganic biology symptom to bypass the protection. +As a Medical Doctor, while there's an pandemic, you only require small amounts of vaccine to heal a sick patient. Work with the Chemist to distribute your cures more efficiently. As a Medical Doctor, you can attempt to drain blood from a husk with a syringe to determine the cause. If you can extract blood, it was caused by extreme temperatures or lasers, if there is no blood to extract, you have confirmed the presence of changelings. +As a Medical Doctor, you can cure a heart attack by repeatedly shocking the victim with a defibrillator! As a Medical Doctor, you can deal with patients who have absurd amounts of wounds by putting them in cryo. This will slowly treat all of their wounds simultaneously, but is much slower than direct treatment. As a Medical Doctor, you can extract implants by holding an empty implant case in your offhand while performing the extraction step. As a Medical Doctor, you can point your penlight at people to create a medical hologram. This lets them know that you're coming to treat them. As a Medical Doctor, you can surgically implant or extract things from people's chests. This can range from putting in a bomb to pulling out an alien larva. As a Medical Doctor, you must target the correct limb and not be in combat mode when trying to perform surgery on someone. Right clicking your patient will intentionally fail the surgery step. -As a Medical Doctor, when messing with viruses, remember that robotic organs can give immunity to disease effects and transmissibility. Make use of the inorganic biology symptom to bypass the protection. -As a Medical Doctor, while there's an pandemic, you only require small amounts of vaccine to heal a sick patient. Work with the Chemist to distribute your cures more efficiently. -As a Medical Doctor, try messing with the virology lab sometime! 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 a Medical Doctor, you can cure a heart attack by repeatedly shocking the victim with a defibrillator! +As a Medical doctor, note that some species - such as Plasmamen or Jellypeople - lack flesh or bones. This will change how you perform surgery on them, allowing you to skip steps such as making incisions or sawing bones. As a Monkey, you can crawl through air or scrubber vents by alt+left clicking them. You must drop everything you are wearing and holding to do this, however. As a Monkey, you can still wear a few human items, such as backpacks, gas masks and hats, and still have two free hands. -As a Morph, you can talk while disguised, but your words have a chance of being slurred, giving you away! As a Nuclear Operative, communication is key! Use ; to speak to your fellow operatives and coordinate an attack plan. As a Nuclear Operative, stick together! While your equipment is robust, your fellow operatives are much better at saving your life: they can drag you away from danger while stunned and provide cover fire. As a Nuclear Operative, you might end up in a situation where the AI has bolted you into a room. Having some spare C4 in your pocket can save your life. @@ -109,15 +121,16 @@ As a Security Officer, examining someone while wearing sechuds or HUDsunglasses As a Security Officer, mindshield implants can only prevent someone from being turned into a cultist: unlike revolutionaries, it will not de-cult them if they have already been converted. As a Security Officer, remember that correlation does not equal causation. Someone may have just been at the wrong place at the wrong time! As a Security Officer, remember that you can attach a sec-lite to your disabler or your helmet! -As a Security Officer, your sechuds or HUDsunglasses can not only see crewmates' job assignments and criminal status, but also if they are mindshield implanted. You can tell by the flashing blue outline around their job icon. Use this to your advantage in a revolution to definitively tell who is on your side! -As a Security Officer, you have a special pen in your PDA that you can use to prompt people to surrender. This will stun them without the need to use a baton! As a Security Officer, you can treat or even cure a heart attack with repeated blows from a stunbaton. Emphasis on *repeated*. +As a Security Officer, you have a special pen in your PDA that you can use to prompt people to surrender. This will stun them without the need to use a baton! +As a Security Officer, your sechuds or HUDsunglasses can not only see crewmates' job assignments and criminal status, but also if they are mindshield implanted. You can tell by the flashing blue outline around their job icon. Use this to your advantage in a revolution to definitively tell who is on your side! As a Service Cyborg, your spray can knocks people down. However, it is blocked by masks and glasses. As a Shaft Miner, always have a GPS on you, so a fellow miner or cyborg can come to save you if you die. As a Shaft Miner, every monster on Lavaland has a pattern you can exploit to minimize damage from the encounters. As a Shaft Miner, the northern side of Lavaland has a lot more rare minerals than on the south. As a Shaft Miner, you can craft a variety of equipment from the local fauna. Bone axes, lava boats and ash drake armour are just a few of them! As a Shaft Miner, you can harvest goliath plates from goliaths and upgrade your explorer's suit, greatly reducing incoming melee damage. +As a Syndicate Monkey, you're explosively allergic to species transformations and should probably avoid them. As a Traitor, plasma can be injected into many things to sabotage them. Power cells, light bulbs, welding tools, cigars and e-cigs will all explode when used. As a Traitor, subverting the AI to serve you can make it an extremely powerful ally. However, be careful of the wording in the laws you give it, as it may use your poorly written laws against you! As a Traitor, the Captain and the Head of Security are two of the most difficult to kill targets on the station. If either one is your target, plan carefully. @@ -163,9 +176,9 @@ As the AI, you can emote to change the status displays near your core. Some emot 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. +As the Bartender, remember to set up the bar sign by walking up to it and clicking it! As the Bartender, the drinks you start with only give you the basics. If you want more advanced mixtures, look into working with chemistry, hydroponics, or even mining for things to grind up and throw in! As the Bartender, you can use a circular saw on your shotgun to make it easier to store. -As the Bartender, remember to set up the bar sign by walking up to it and clicking it! As the Blob, don't neglect the creation of factories. These create spores that carry your reagent and can chase crew members far further than you. Spores can also be rallied to swarm the crew and cause panic, and can even take over corpses to create much more dangerous blob zombies! As the Blob, keep your core some distance from space, as it is both expensive to expand onto space, easy to be attacked from, and does not count towards your win condition. Emitter platforms built in space are especially dangerous. As the Blob, removing strong blobs, resource nodes, factories, and nodes will give you 4, 15, 25, and 25 resources back, respectively. @@ -180,6 +193,7 @@ As the Captain, always take the nuclear disk and pinpointer with you every shift As the Captain, you are one of the highest priority targets on the station. Everything from revolutions, to nuclear operatives, to traitors that need to rob you of your unique lasgun or your life are things to worry about. As the Captain, you can purchase a new emergency shuttle using a communications console. Some require cash, while others give you cash in exchange. Keep in mind that purchasing dangerous shuttles may instigate the ire of your crew. As the Captain, you have absolute access and control over the station, but this does not mean that being a horrible person won't result in mutiny and a ban. +As the Captain, your sabre deals extra damage to Assistants (as long as they have their original liver). As the Chaplain, you are much more likely to get a response by praying to the gods than most people. To boost your chances, make altars with colorful crayon runes, lit candles, and wire art. As the Chaplain, your bible is also a container that can store small items. Depending on your god, your starting bible may come with a surprise! As the Chaplain, your null rod has anti magic functions: it can destroy cultist runes by hitting them, and it makes you immune to wizard spells and cult magic. @@ -188,17 +202,20 @@ As the Chief Engineer, you can rename areas or create entirely new ones using yo As the Chief Engineer, you can spy on and even forge PDA communications with the message monitor console! The key is in your office. As the Chief Medical Officer, coordinate and communicate with your doctors, chemists, and paramedics during a nuclear emergency, blob infestation, or some other crisis to keep people alive and fighting. As the Chief Medical Officer, your hypospray is like a refillable instant injection syringe that can hold 30 units as opposed to the standard 15. +As the Clown, click with one long balloon in hand onto another to create a balloon animal! Each combination of colours has its own unique result. As the Clown, eating bananas heals you slightly. Honk! As the Clown, if you lose your banana peel, you can still slip people with your PDA! Honk! As the Clown, if you're a Traitor and get an emag on sale (or convince another traitor), you can emag your Clown Car to unlock a variety of new functions, including the Siege Mode, which will allow you to launch your passengers, preferably directly into the Supermatter! Or into space. As the Clown, spice your gimmicks up! Nobody likes a one-trick pony. -As the Clown, click with one long balloon in hand onto another to create a balloon animal! Each combination of colours has its own unique result. As the Clown, you can use your stamp on a sheet of cardboard as the first step of making a honkbot. Fun for the whole crew! As the Clown, your Grail is the mineral bananium, which can be given to the Roboticist to build you a fun and robust mech beloved by everyone. -As the Curator, be sure to keep the shelves stocked and the library clean for crew. -As the Curator, you are not completely defenseless. Your whip easily disarms people, your laser pointer can blind humans and cyborgs, and you can hide items in wirecut books. +As the Coroner, remember completing an autopsy on a body will speed up any further surgeries. As multiple people can operate on a body at once, consider teaming up with your Medical Doctors to get bodies revived faster! +As the Coroner, remember that your autopsy scanner also works as an advanced health analyzer on right-click, but only for corpses. As the Coroner, you are more comfortable working on cadavers. You can perform autopsies or harvest organs from corpses a lot faster than your Medical Doctor counterparts. Work in tandem with them by helping prepare bodies for revival. As the Coroner, you can perform autopsies on corpses recovered from strange circumstances with your handheld autopsy scanner to discover how they died. By teaming up with a Detective, you can solve several cases together! +As the Coroner, your unique surgical tools are considered 'cruel implements', which speeds up surgery on corpses - slows it on not-yet-corpses. A few other items also have this classification. +As the Curator, be sure to keep the shelves stocked and the library clean for crew. +As the Curator, you are not completely defenseless. Your whip easily disarms people, your laser pointer can blind humans and cyborgs, and you can hide items in wirecut books. As the Detective, people leave fingerprints everywhere and on everything. With the exception of white latex, gloves will hide them. All is not lost, however, as gloves leave fibers specific to their kind such as black or nitrile, pointing to a general department. As the Detective, you can use your forensics scanner from a distance. Use this to scan boxes or other storage containers. As the Detective, your revolver can be loaded with .357 ammunition obtained from a hacked autolathe. Firing it has a decent chance to blow up your revolver. @@ -206,8 +223,6 @@ As the Head of Personnel, you are not higher ranking than other heads of staff, As the Head of Security, don't let the power go to your head. You may have high access, great equipment, and a miniature army at your side, but being a terrible person without a good reason is grounds for banning. As the Head of Security, you are expected to coordinate your security force to handle any threat that comes to the station. Sometimes it means making use of the armory to handle a blob, sometimes it means being ruthless during a revolution or cult. As the Head of Security, you can call for executions or forced cyborgization, but may require the Captain's approval. -As the Lawyer, try to negotiate with the Warden if sentences seem too high for the crime. -As the Lawyer, you can try to convince the Captain and Head of Security to hold trials for prisoners in the courtroom. As the Malfunctioning AI, look into flooding the station with plasma fires to kill off large portions of the crew, letting you pick off the remaining few with space suits who escaped. As the Malfunctioning AI, you can shunt to an APC if the situation gets bad. This disables your doomsday device if it is active. As the Malfunctioning AI, you should either order your cyborgs to dismantle the robotics console or blow it up yourself in order to protect them. @@ -224,17 +239,18 @@ As the Warden, you can implant criminals you suspect might re-offend with device As the Warden, you can use handcuffs on orange prisoner shoes to turn them into cuffed shoes, forcing prisoners to walk and potentially thwarting an escape. As the Warden, your duty is to be the watchdog of the brig and handler of prisoners when little is happening, and to hand out equipment and weapons to the security officers when a crisis strikes. Basketball requires focus. If you don't click on your target (player or hoop) you are more likely to miss. +Basketball requires skill. Spinning drains stamina, reduces accuracy, but gives resistance from disarm. Use it to dunk! Basketball requires stamina. The more you have, the less likely your ball will be stolen and the more likely you can steal from another player. Basketball requires strategy. The direction both players are facing affects disarms so having your back to another player that is trying to steal is ideal. -Basketball requires skill. Spinning drains stamina, reduces accuracy, but gives resistance from disarm. Use it to dunk! Basketball requires teamwork. Passing the ball with LMB is instant and costs no stamina. +Biological armor will protect your limb from a zombie's infective attack, unless the limb's more damaged than the armor value. Armor with thick material, such as firesuits and EVA suits, also partially protects, preventing at least the first attack from infection. Clicking on a windoor rather then bumping into it will keep it open, you can click it again to close it. Different weapons have different strengths. Some weapons, such as spears, floor tiles, and throwing stars, deal more damage when thrown compared to when attacked normally. -Spears are capable of breaking into secure lockers by striking them in melee! Don't be afraid to ask for help, whether from your peers or from admins. Experiment with different setups of the Supermatter engine to maximize output, but don't risk the crew's safety to do so! Felinids get temporarily distracted by laser pointers. Use this to your advantage when being pursued by one. Firesuits and winter coats offer mild protection from the cold, allowing you to spend longer periods of time near breaches and space than if wearing nothing at all. +First-aid analyzers double the speed of wound treatment on injuries, alongside giving out normal and improvised instructions for treatment. Glass shards can be welded to make glass, and iron rods can be welded to make iron. Ores can be welded too, but this takes a lot of fuel. Holding alt and left clicking a tile will allow you to see its contents in the top right window pane, which is much faster than holding shift and right clicking. If there's something you need from another department, try asking! This game isn't single-player and you'd be surprised what you can get accomplished together! @@ -243,18 +259,27 @@ If you knock into somebody while doing a wicked grind on a skateboard, they will If you need to drag multiple people either to safety or to space, bring a locker or crate over and stuff them all in before hauling them off. If you're bleeding, you can apply pressure to the limb by grabbing yourself while targeting the bleeding limb. This will slow you down and take up a hand, but it'll slow down how fast you lose blood. Note this won't help the bleeding clot any faster. If you're using hotkey mode, you can stop pulling things using H. +If you've come out of a surgery and your doctor forgot to cauterize or suture you, you can do it yourself - even with a lighter. In a pinch, stripping yourself naked will give you a sizeable resistance to being tackled. What do you value more, your freedom or your dignity? +In a pinch, you can reduce bleeding or burn infection with several commonplace reagents - flour, salt, saltwater can all be splashed onto the wound to stall for time, and tea can be drank for a boost to your body's defences. Laying down will help slow down bloodloss. Death will halt it entirely. Maintenance is full of equipment that is randomized every round. Look around and see if anything is worth using. +Modular computers are compatible with integrated circuits, but most of the program-dependent circuits require them to be open/backgrounded to work. To install circuits on stationary consoles, you need to toggle interaction with the frame with right-click first. Most job-related suit slot clothing can fit job-related items into it, such as the atmospheric technician's winter coat holding an RPD, or labcoats holding most medicine. +Most species have only 32 teeth for use in dental implants. Moths have none. Lizards have seventy five. Most things have special interactions with right, alt, shift, and control click. Experiment! On most clothing items that go in the suit 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 and organ damage. Sanity, darkness, blindfolds, earmuffs, tables, beds, and bedsheets affect the healing rate. +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. +Some items, when examined, are labeled as 'crafting components', which means you can smack them with another item to directly construct a recipe. Try using an igniter on a rod! 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. +Spears are capable of breaking into secure lockers by striking them in melee! 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! Suit storage units not only remove blood and dirt from clothing, but also radiation! +Surgery can be performed with a wide variety of tools not found in Medbay, but it'll drastically increase the time it takes and the risk of failure. However, you can offset the penalty by using sterilizing agents like alcohol or by performing it on a table or bed. +Syndicate Duffelbags are a lot quicker to zip and unzip, have significantly less slowdown, and can carry up to two of various bulky, objective-related items - such as fire axes, guns, or gibtonite. Examine them closely to see all the possibilities. The Chaplain can bless any container with water by hitting it with their bible. Holy water has a myriad of uses against both cults and large amounts of it are a great contributor to success against them. The P2P chat function found on tablet computers allows for a stealthy way to communicate with people. The resist button will allow you to resist out of handcuffs, being buckled to a chair or bed, out of locked lockers and more. Whenever you're stuck, try resisting! @@ -272,49 +297,30 @@ When in doubt about technical issues, clear your cache (byond launcher > cogwhee 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! Working out improves your fitness which increases your size and faster times to fireman carry. Remember that a quality diet and sleep are essential! +You can alt-click tank transfer valves to remove a tank from them. +You can automatically extract and retract arm implants by 'activating' the empty hand they're on. This includes integrated toolsets, cursed katanas, and vorpal scythes. +You can bake a birthday cake and then microwave it to create a legendary cake hat. You can then combine it with an energy sword to create an energy cake. You can catch thrown items by toggling on your throw mode with an empty hand active. You can change the control scheme by pressing tab. One is WASD, the other is the arrow keys. Keep in mind that hotkeys are also changed with this. You can cheat games by baking dice in microwaves to make them loaded. Cards can be seen with x-ray vision or be marked with either a pen or crayon to gain an edge. You can climb onto a table by dragging yourself onto one. This takes time and drops the items in your hands on the table. Clicking on a table that someone else is climbing onto will knock them down. +You can combine the Carpet reagent with various different reagents, such as Oil and Cyanide, to create unique carpet types. +You can craft peg limbs and crutches with wood for use in dire circumstances. The latter are also available in medical vendors. You can deconvert Cultists of Nar'Sie by feeding them large amounts of holy water. Unlike revolutionaries, implanting them with mindshield implants won't do it! You can drag other players onto yourself to open the strip menu, letting you remove their equipment or force them to wear something. Note that suits or helmets will block your access to the clothing beneath them, and that certain items take longer to strip or put on than others. +You can further the cycle of life by having two adult plushies play with eachother, creating a smaller junior child plushie. You can grab someone by holding Ctrl and clicking on them, then upgrade the grab by Ctrl-clicking on them once more. An aggressive grab will momentarily stun someone, allow you to place them on a table by clicking on it, or throw them by toggling on throwing. You can light a cigar on a supermatter crystal. You can move an item out of the way by dragging it and then clicking on an adjacent tile with an empty hand. You can pin your MODsuit module buttons to your action bar in the suit UI. +You can quickly remove radiation from items in a room by releasing water vapor into the air around them (including worn items). You can recolor certain items like jumpsuits and gloves in washing machines by also throwing in a crayon. +You can right click someone with wire cutters, jaws of life, and box cutters to instantly snap cablecuffs or zipties. The jaws can even instantly break handcuffs! You can screwdriver any non-chemical grenade to shorten fuses from 5 seconds, to 3 seconds, to instant boom! Nobody ever expects this. You can spray a fire extinguisher, throw items or fire a gun while floating through space to change your direction. Simply fire opposite to where you want to go. 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 can use a multitool in your hand to track the area's local APC. You can use an upgraded microwave to charge your PDA! -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. -Modular computers are compatible with integrated circuits, but most of the program-dependent circuits require them to be open/backgrounded to work. To install circuits on stationary consoles, you need to toggle interaction with the frame with right-click first. You don't need to destroy a Spacecoin machine to make your funds stop draining. Swiping your ID on it will stop the withdrawal. -As a Bitrunner, upgrading your quantum server will increase rewards and reduce downtime. -As a Bitrunner, your avatar has a domain info ability which will give you clues to help complete virtual domains. -You can right click someone with wire cutters, jaws of life, and box cutters to instantly snap cablecuffs or zipties. The jaws can even instantly break handcuffs! -You can alt-click tank transfer valves to remove a tank from them. -You can use a multitool in your hand to track the area's local APC. -Some items, when examined, are labeled as 'crafting components', which means you can smack them with another item to directly construct a recipe. Try using an igniter on a rod! -You can further the cycle of life by having two adult plushies play with eachother, creating a smaller junior child plushie. -Most species have only 32 teeth for use in dental implants. Moths have none. Lizards have seventy five. -As a Changeling, Repurposed Glands will break bolas, disable stuns, and give you a hefty speed boost at the cost of the use of your arms - which includes the ability to open restricted airlocks. -As a Geneticist, you should usually save all mutations you unlock. Negative mutations will increase your genetic stability, allowing you to keep more positive mutations. -You can craft peg limbs and crutches with wood for use in dire circumstances. The latter are also available in medical vendors. -As a Heretic, you can also sacrifice cultists, rewarding you with a knowledge point and one of three unique, powerful rewards. -As a Cultist, if you manage to sacrifice a Heretic, you will unlock one of three powerful and unique items to be created in every one of your cult's forges, archives, or altars. -As a Cultist, when you sacrifice a Heretic, they will be bound inside a powerful haunted longsword. Anyone can then unbind the blade, unlocking its powers and abilities, but also allowing the blade to act of its own free will. -As a Syndicate Monkey, you're explosively allergic to species transformations and should probably avoid them. -Biological armor will protect your limb from a zombie's infective attack, unless the limb's more damaged than the armor value. Armor with thick material, such as firesuits and EVA suits, also partially protects, preventing at least the first attack from infection. -In a pinch, you can reduce bleeding or burn infection with several commonplace reagents - flour, salt, saltwater can all be splashed onto the wound to stall for time, and tea can be drank for a boost to your body's defences. -First-aid analyzers double the speed of wound treatment on injuries, alongside giving out normal and improvised instructions for treatment. -Syndicate Duffelbags are a lot quicker to zip and unzip, have significantly less slowdown, and can carry up to two of various bulky, objective-related items - such as fire axes, guns, or gibtonite. Examine them closely to see all the possibilities. -The Coroner's surgical tools are considered 'cruel implements', which speeds up surgery on corpses but slows it on not-yet-corpses. A few other items also have it. -As a Coroner, remember that your autopsy scanner also works as an advanced health analyzer on right-click, but only for corpses. -As the Captain, your sabre deals extra damage to Assistants (as long as they have their original liver). -You can automatically extract and retract arm implants by 'activating' the empty hand they're on. This includes integrated toolsets, cursed katanas, and vorpal scythes. -You can combine the Carpet reagent with various different reagents, such as Oil and Cyanide, to create unique carpet types. -You can bake a birthday cake and then microwave it to create a legendary cake hat. You can then combine it with an energy sword to create an energy cake. -You can quickly remove radiation from items in a room by releasing water vapor into the air around them (including worn items). +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! diff --git a/tgstation.dme b/tgstation.dme index e747598a1372..31c00036873d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -102,6 +102,7 @@ #include "code\__DEFINES\explosions.dm" #include "code\__DEFINES\external_organs.dm" #include "code\__DEFINES\fantasy_affixes.dm" +#include "code\__DEFINES\files.dm" #include "code\__DEFINES\firealarm.dm" #include "code\__DEFINES\fish.dm" #include "code\__DEFINES\font_awesome_icons.dm" @@ -130,6 +131,7 @@ #include "code\__DEFINES\ipintel.dm" #include "code\__DEFINES\is_helpers.dm" #include "code\__DEFINES\jobs.dm" +#include "code\__DEFINES\jukebox.dm" #include "code\__DEFINES\keybinding.dm" #include "code\__DEFINES\lag_switch.dm" #include "code\__DEFINES\language.dm" @@ -207,6 +209,7 @@ #include "code\__DEFINES\regex.dm" #include "code\__DEFINES\religion.dm" #include "code\__DEFINES\research.dm" +#include "code\__DEFINES\reskin.dm" #include "code\__DEFINES\resonator.dm" #include "code\__DEFINES\revolution.dm" #include "code\__DEFINES\robots.dm" @@ -339,11 +342,13 @@ #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_lasertag.dm" #include "code\__DEFINES\dcs\signals\signals_lattice.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_lockable_storage.dm" #include "code\__DEFINES\dcs\signals\signals_market.dm" #include "code\__DEFINES\dcs\signals\signals_material_container.dm" #include "code\__DEFINES\dcs\signals\signals_medical.dm" @@ -370,6 +375,7 @@ #include "code\__DEFINES\dcs\signals\signals_spatial_grid.dm" #include "code\__DEFINES\dcs\signals\signals_species.dm" #include "code\__DEFINES\dcs\signals\signals_spell.dm" +#include "code\__DEFINES\dcs\signals\signals_status_effect.dm" #include "code\__DEFINES\dcs\signals\signals_storage.dm" #include "code\__DEFINES\dcs\signals\signals_subsystem.dm" #include "code\__DEFINES\dcs\signals\signals_swab.dm" @@ -415,34 +421,58 @@ #include "code\__DEFINES\~darkpack\aggravated_damage.dm" #include "code\__DEFINES\~darkpack\alerts.dm" #include "code\__DEFINES\~darkpack\areas.dm" +#include "code\__DEFINES\~darkpack\auras.dm" +#include "code\__DEFINES\~darkpack\banning.dm" +#include "code\__DEFINES\~darkpack\beastmaster.dm" #include "code\__DEFINES\~darkpack\branding.dm" +#include "code\__DEFINES\~darkpack\colors.dm" +#include "code\__DEFINES\~darkpack\combat.dm" +#include "code\__DEFINES\~darkpack\crimes.dm" #include "code\__DEFINES\~darkpack\darkpack_roles.dm" #include "code\__DEFINES\~darkpack\discipline.dm" #include "code\__DEFINES\~darkpack\do_afters.dm" #include "code\__DEFINES\~darkpack\economy.dm" #include "code\__DEFINES\~darkpack\factions.dm" +#include "code\__DEFINES\~darkpack\flavor_text.dm" +#include "code\__DEFINES\~darkpack\generations.dm" +#include "code\__DEFINES\~darkpack\guestbook.dm" #include "code\__DEFINES\~darkpack\guns.dm" +#include "code\__DEFINES\~darkpack\is_helpers.dm" +#include "code\__DEFINES\~darkpack\jobs.dm" #include "code\__DEFINES\~darkpack\keybinding.dm" +#include "code\__DEFINES\~darkpack\library.dm" +#include "code\__DEFINES\~darkpack\lock_access_defines.dm" #include "code\__DEFINES\~darkpack\lockpick_difficulty.dm" #include "code\__DEFINES\~darkpack\mapswitch.dm" #include "code\__DEFINES\~darkpack\masquerade.dm" #include "code\__DEFINES\~darkpack\miscellaneous.dm" #include "code\__DEFINES\~darkpack\mobs.dm" #include "code\__DEFINES\~darkpack\names.dm" -#include "code\__DEFINES\~darkpack\npc.dm" +#include "code\__DEFINES\~darkpack\phones.dm" +#include "code\__DEFINES\~darkpack\radio_networks.dm" +#include "code\__DEFINES\~darkpack\sight.dm" #include "code\__DEFINES\~darkpack\signals_kindred.dm" #include "code\__DEFINES\~darkpack\sound.dm" +#include "code\__DEFINES\~darkpack\splats.dm" #include "code\__DEFINES\~darkpack\status_effects_debuffs.dm" #include "code\__DEFINES\~darkpack\storyteller_dice.dm" #include "code\__DEFINES\~darkpack\storyteller_stats.dm" #include "code\__DEFINES\~darkpack\subsystems.dm" #include "code\__DEFINES\~darkpack\vampire_clan.dm" +#include "code\__DEFINES\~darkpack\walls.dm" +#include "code\__DEFINES\~darkpack\werewolf_auspice.dm" +#include "code\__DEFINES\~darkpack\werewolf_tribe.dm" +#include "code\__DEFINES\~darkpack\xp_and_freebie.dm" #include "code\__DEFINES\~darkpack\dcs\bouncer_signals.dm" +#include "code\__DEFINES\~darkpack\dcs\fire_signals.dm" #include "code\__DEFINES\~darkpack\dcs\gun_signals.dm" #include "code\__DEFINES\~darkpack\dcs\masquerade_signals.dm" #include "code\__DEFINES\~darkpack\dcs\power_signals.dm" #include "code\__DEFINES\~darkpack\dcs\signals_object.dm" +#include "code\__DEFINES\~darkpack\dcs\splat_signals.dm" #include "code\__DEFINES\~darkpack\dcs\vampire_signals.dm" +#include "code\__DEFINES\~darkpack\dcs\signals\signals_global.dm" +#include "code\__DEFINES\~darkpack\dcs\signals_mob\signals_mob.dm" #include "code\__DEFINES\~darkpack\dcs\signals_mob\signals_mob_living.dm" #include "code\__DEFINES\~darkpack\traits\declarations.dm" #include "code\__DEFINES\~darkpack\traits\macros.dm" @@ -452,6 +482,7 @@ #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_planes.dm" #include "code\__HELPERS\_string_lists.dm" +#include "code\__HELPERS\abstract_types.dm" #include "code\__HELPERS\admin.dm" #include "code\__HELPERS\ai.dm" #include "code\__HELPERS\announcements.dm" @@ -586,6 +617,7 @@ #include "code\_globalvars\darkpack\lists\ambience.dm" #include "code\_globalvars\darkpack\lists\masquerade.dm" #include "code\_globalvars\darkpack\lists\miscellaneous.dm" +#include "code\_globalvars\darkpack\lists\phone_contacts.dm" #include "code\_globalvars\lists\achievements.dm" #include "code\_globalvars\lists\ambience.dm" #include "code\_globalvars\lists\basic_ai.dm" @@ -602,6 +634,7 @@ #include "code\_globalvars\lists\ghost.dm" #include "code\_globalvars\lists\icons.dm" #include "code\_globalvars\lists\keybindings.dm" +#include "code\_globalvars\lists\languages.dm" #include "code\_globalvars\lists\maintenance_loot.dm" #include "code\_globalvars\lists\mapping.dm" #include "code\_globalvars\lists\mobs.dm" @@ -708,6 +741,7 @@ #include "code\controllers\subsystem\ban_cache.dm" #include "code\controllers\subsystem\blackbox.dm" #include "code\controllers\subsystem\blood_drying.dm" +#include "code\controllers\subsystem\cameras.dm" #include "code\controllers\subsystem\chat.dm" #include "code\controllers\subsystem\dbcore.dm" #include "code\controllers\subsystem\dcs.dm" @@ -838,6 +872,7 @@ #include "code\controllers\subsystem\processing\manufacturing.dm" #include "code\controllers\subsystem\processing\newplayer.dm" #include "code\controllers\subsystem\processing\obj.dm" +#include "code\controllers\subsystem\processing\personality.dm" #include "code\controllers\subsystem\processing\plumbing.dm" #include "code\controllers\subsystem\processing\priority_effects.dm" #include "code\controllers\subsystem\processing\processing.dm" @@ -924,6 +959,7 @@ #include "code\datums\actions\items\beam_rifle.dm" #include "code\datums\actions\items\beserk.dm" #include "code\datums\actions\items\boot_dash.dm" +#include "code\datums\actions\items\change_name.dm" #include "code\datums\actions\items\cult_dagger.dm" #include "code\datums\actions\items\hands_free.dm" #include "code\datums\actions\items\organ_action.dm" @@ -1063,13 +1099,11 @@ #include "code\datums\ai\monkey\monkey_behaviors.dm" #include "code\datums\ai\monkey\monkey_controller.dm" #include "code\datums\ai\monkey\monkey_subtrees.dm" -#include "code\datums\ai\monkey\punpun_subtrees.dm" #include "code\datums\ai\movement\_ai_movement.dm" #include "code\datums\ai\movement\ai_movement_basic_avoidance.dm" #include "code\datums\ai\movement\ai_movement_complete_stop.dm" #include "code\datums\ai\movement\ai_movement_dumb.dm" #include "code\datums\ai\movement\ai_movement_jps.dm" -#include "code\datums\ai\objects\mod.dm" #include "code\datums\ai\objects\vending_machines\vending_machine_behaviors.dm" #include "code\datums\ai\objects\vending_machines\vending_machine_controller.dm" #include "code\datums\ai\robot_customer\robot_customer_behaviors.dm" @@ -1128,6 +1162,7 @@ #include "code\datums\components\areabound.dm" #include "code\datums\components\armor_plate.dm" #include "code\datums\components\atmos_reaction_recorder.dm" +#include "code\datums\components\atom_mounted.dm" #include "code\datums\components\aura_healing.dm" #include "code\datums\components\bakeable.dm" #include "code\datums\components\banned_from_space.dm" @@ -1191,6 +1226,7 @@ #include "code\datums\components\effect_remover.dm" #include "code\datums\components\egg_layer.dm" #include "code\datums\components\electrified_buckle.dm" +#include "code\datums\components\empathy.dm" #include "code\datums\components\energized.dm" #include "code\datums\components\engraved.dm" #include "code\datums\components\evolutionary_leap.dm" @@ -1227,6 +1263,7 @@ #include "code\datums\components\hide_weather_planes.dm" #include "code\datums\components\holderloving.dm" #include "code\datums\components\holographic_nature.dm" +#include "code\datums\components\houlihan_teleport.dm" #include "code\datums\components\igniter.dm" #include "code\datums\components\infective.dm" #include "code\datums\components\ingredients_holder.dm" @@ -1261,6 +1298,7 @@ #include "code\datums\components\mirv.dm" #include "code\datums\components\mob_chain.dm" #include "code\datums\components\mob_harvest.dm" +#include "code\datums\components\monitored_area.dm" #include "code\datums\components\multiple_lives.dm" #include "code\datums\components\mutant_hands.dm" #include "code\datums\components\nuclear_bomb_operator.dm" @@ -1296,9 +1334,9 @@ #include "code\datums\components\regenerator.dm" #include "code\datums\components\religious_tool.dm" #include "code\datums\components\rename.dm" +#include "code\datums\components\reskinnable_atom.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" @@ -1346,10 +1384,8 @@ #include "code\datums\components\subtype_picker.dm" #include "code\datums\components\summoning.dm" #include "code\datums\components\supermatter_crystal.dm" -#include "code\datums\components\surgery_initiator.dm" #include "code\datums\components\swabbing.dm" #include "code\datums\components\swarming.dm" -#include "code\datums\components\table_smash.dm" #include "code\datums\components\tackle.dm" #include "code\datums\components\tactical.dm" #include "code\datums\components\takes_reagent_appearance.dm" @@ -1379,7 +1415,6 @@ #include "code\datums\components\usb_port.dm" #include "code\datums\components\vacuum.dm" #include "code\datums\components\vision_hurting.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" @@ -1411,21 +1446,21 @@ #include "code\datums\components\fantasy\suffixes.dm" #include "code\datums\components\fearful\effects.dm" #include "code\datums\components\fearful\fearful.dm" -#include "code\datums\components\fearful\sources.dm" #include "code\datums\components\fearful\terror_handler.dm" +#include "code\datums\components\fearful\sources\_sources.dm" +#include "code\datums\components\fearful\sources\phobia.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" #include "code\datums\components\pet_commands\pet_commands_basic.dm" #include "code\datums\components\plumbing\_plumbing.dm" +#include "code\datums\components\plumbing\automated_iv.dm" #include "code\datums\components\plumbing\buffer.dm" #include "code\datums\components\plumbing\chemical_acclimator.dm" #include "code\datums\components\plumbing\filter.dm" @@ -1471,6 +1506,7 @@ #include "code\datums\diseases\advance\advance.dm" #include "code\datums\diseases\advance\presets.dm" #include "code\datums\diseases\advance\symptoms\beard.dm" +#include "code\datums\diseases\advance\symptoms\bleeding.dm" #include "code\datums\diseases\advance\symptoms\chills.dm" #include "code\datums\diseases\advance\symptoms\choking.dm" #include "code\datums\diseases\advance\symptoms\confusion.dm" @@ -1494,6 +1530,7 @@ #include "code\datums\diseases\advance\symptoms\sneeze.dm" #include "code\datums\diseases\advance\symptoms\species.dm" #include "code\datums\diseases\advance\symptoms\symptoms.dm" +#include "code\datums\diseases\advance\symptoms\thermoregulation.dm" #include "code\datums\diseases\advance\symptoms\viral.dm" #include "code\datums\diseases\advance\symptoms\vision.dm" #include "code\datums\diseases\advance\symptoms\voice_change.dm" @@ -1555,6 +1592,7 @@ #include "code\datums\elements\corrupted_organ.dm" #include "code\datums\elements\crackable.dm" #include "code\datums\elements\crusher_loot.dm" +#include "code\datums\elements\cuffable_item.dm" #include "code\datums\elements\cuffsnapping.dm" #include "code\datums\elements\cult_eyes.dm" #include "code\datums\elements\cult_halo.dm" @@ -1572,6 +1610,7 @@ #include "code\datums\elements\digitalcamo.dm" #include "code\datums\elements\disarm_attack.dm" #include "code\datums\elements\door_pryer.dm" +#include "code\datums\elements\drag_activation.dm" #include "code\datums\elements\drag_pickup.dm" #include "code\datums\elements\dryable.dm" #include "code\datums\elements\earhealing.dm" @@ -1581,6 +1620,7 @@ #include "code\datums\elements\elevation.dm" #include "code\datums\elements\empprotection.dm" #include "code\datums\elements\envenomable_casing.dm" +#include "code\datums\elements\examine_lore.dm" #include "code\datums\elements\eyestab.dm" #include "code\datums\elements\falling_hazard.dm" #include "code\datums\elements\firestacker.dm" @@ -1589,6 +1629,7 @@ #include "code\datums\elements\floorloving.dm" #include "code\datums\elements\footstep.dm" #include "code\datums\elements\footstep_override.dm" +#include "code\datums\elements\force_move_pulled.dm" #include "code\datums\elements\forced_gravity.dm" #include "code\datums\elements\frozen.dm" #include "code\datums\elements\gags_recolorable.dm" @@ -1631,6 +1672,7 @@ #include "code\datums\elements\no_crit_hitting.dm" #include "code\datums\elements\noisy_movement.dm" #include "code\datums\elements\noticable_organ.dm" +#include "code\datums\elements\nullrod_core.dm" #include "code\datums\elements\obj_regen.dm" #include "code\datums\elements\on_hit_effect.dm" #include "code\datums\elements\only_pull_living.dm" @@ -1654,11 +1696,14 @@ #include "code\datums\elements\radiation_protected_clothing.dm" #include "code\datums\elements\radioactive.dm" #include "code\datums\elements\ranged_armour.dm" +#include "code\datums\elements\raptor_food.dm" +#include "code\datums\elements\reagent_scoopable_atom.dm" #include "code\datums\elements\reagents_heated_on_fire.dm" #include "code\datums\elements\reagents_item_heatable.dm" #include "code\datums\elements\regal_rat_minion.dm" #include "code\datums\elements\relay_attackers.dm" #include "code\datums\elements\ridable.dm" +#include "code\datums\elements\rotation.dm" #include "code\datums\elements\rust.dm" #include "code\datums\elements\selfknockback.dm" #include "code\datums\elements\series.dm" @@ -1677,8 +1722,10 @@ #include "code\datums\elements\squish_sound.dm" #include "code\datums\elements\strippable.dm" #include "code\datums\elements\structure_repair.dm" +#include "code\datums\elements\surgery_aid.dm" #include "code\datums\elements\swabbable.dm" #include "code\datums\elements\swimming_tile.dm" +#include "code\datums\elements\table_smash.dm" #include "code\datums\elements\tenacious.dm" #include "code\datums\elements\tiny_mob_hunter.dm" #include "code\datums\elements\tool_flash.dm" @@ -1784,13 +1831,15 @@ #include "code\datums\martial\boxing.dm" #include "code\datums\martial\cqc.dm" #include "code\datums\martial\junglearts.dm" -#include "code\datums\martial\krav_maga.dm" +#include "code\datums\martial\kaza_ruk.dm" #include "code\datums\martial\mushpunch.dm" #include "code\datums\martial\plasma_fist.dm" #include "code\datums\martial\psychotic_brawl.dm" #include "code\datums\martial\sleeping_carp.dm" #include "code\datums\martial\spiders_bite.dm" #include "code\datums\martial\wrestling.dm" +#include "code\datums\material\material_container.dm" +#include "code\datums\material\remote_materials.dm" #include "code\datums\materials\_material.dm" #include "code\datums\materials\alloys.dm" #include "code\datums\materials\basemats.dm" @@ -1811,6 +1860,7 @@ #include "code\datums\mood_events\area_events.dm" #include "code\datums\mood_events\axe_events.dm" #include "code\datums\mood_events\beauty_events.dm" +#include "code\datums\mood_events\death.dm" #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" @@ -1844,6 +1894,19 @@ #include "code\datums\mutations\touch.dm" #include "code\datums\mutations\void_magnet.dm" #include "code\datums\mutations\webbing.dm" +#include "code\datums\personality\_personality.dm" +#include "code\datums\personality\_personality_groups.dm" +#include "code\datums\personality\personality_preference.dm" +#include "code\datums\personality\reaction_generic.dm" +#include "code\datums\personality\reaction_to_animals.dm" +#include "code\datums\personality\reaction_to_art.dm" +#include "code\datums\personality\reaction_to_fear.dm" +#include "code\datums\personality\reaction_to_food.dm" +#include "code\datums\personality\reaction_to_groups.dm" +#include "code\datums\personality\reaction_to_job.dm" +#include "code\datums\personality\reaction_to_nt.dm" +#include "code\datums\personality\reaction_to_others.dm" +#include "code\datums\personality\reaction_to_recreation.dm" #include "code\datums\proximity_monitor\field.dm" #include "code\datums\proximity_monitor\proximity_monitor.dm" #include "code\datums\proximity_monitor\fields\ai_target_tracking.dm" @@ -1863,7 +1926,6 @@ #include "code\datums\quirks\negative_quirks\anosmia.dm" #include "code\datums\quirks\negative_quirks\asthma.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" @@ -1876,6 +1938,7 @@ #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\erratic.dm" #include "code\datums\quirks\negative_quirks\family_heirloom.dm" #include "code\datums\quirks\negative_quirks\fluoride_stare.dm" #include "code\datums\quirks\negative_quirks\food_allergy.dm" @@ -1888,6 +1951,7 @@ #include "code\datums\quirks\negative_quirks\indebted.dm" #include "code\datums\quirks\negative_quirks\insanity.dm" #include "code\datums\quirks\negative_quirks\light_drinker.dm" +#include "code\datums\quirks\negative_quirks\monophobia.dm" #include "code\datums\quirks\negative_quirks\mute.dm" #include "code\datums\quirks\negative_quirks\narcolepsy.dm" #include "code\datums\quirks\negative_quirks\nearsighted.dm" @@ -1911,11 +1975,9 @@ #include "code\datums\quirks\neutral_quirks\bald.dm" #include "code\datums\quirks\neutral_quirks\deviant_tastes.dm" #include "code\datums\quirks\neutral_quirks\evil.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" @@ -1923,11 +1985,9 @@ #include "code\datums\quirks\neutral_quirks\pineapple_hater.dm" #include "code\datums\quirks\neutral_quirks\pineapple_liker.dm" #include "code\datums\quirks\neutral_quirks\shifty_eyes.dm" -#include "code\datums\quirks\neutral_quirks\snob.dm" #include "code\datums\quirks\neutral_quirks\transhumanist.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\chip_connector.dm" #include "code\datums\quirks\positive_quirks\chipped.dm" @@ -1946,7 +2006,6 @@ #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\strong_stomach.dm" #include "code\datums\quirks\positive_quirks\tagger.dm" #include "code\datums\quirks\positive_quirks\throwing_arm.dm" @@ -1995,17 +2054,20 @@ #include "code\datums\status_effects\_status_effect_helpers.dm" #include "code\datums\status_effects\agent_pinpointer.dm" #include "code\datums\status_effects\buffs.dm" +#include "code\datums\status_effects\cuffed_item.dm" #include "code\datums\status_effects\death_sound.dm" #include "code\datums\status_effects\drug_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" #include "code\datums\status_effects\neutral.dm" +#include "code\datums\status_effects\reagent_effect.dm" #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\stop_drop_roll.dm" #include "code\datums\status_effects\buffs\stun_absorption.dm" +#include "code\datums\status_effects\buffs\xray.dm" #include "code\datums\status_effects\buffs\bioware\_bioware.dm" #include "code\datums\status_effects\buffs\bioware\circulation.dm" #include "code\datums\status_effects\buffs\bioware\cortex.dm" @@ -2034,7 +2096,6 @@ #include "code\datums\status_effects\debuffs\hooked.dm" #include "code\datums\status_effects\debuffs\jitteriness.dm" #include "code\datums\status_effects\debuffs\pacifism.dm" -#include "code\datums\status_effects\debuffs\phobia.dm" #include "code\datums\status_effects\debuffs\rust_corruption.dm" #include "code\datums\status_effects\debuffs\screen_blur.dm" #include "code\datums\status_effects\debuffs\screwy_hud.dm" @@ -2136,9 +2197,7 @@ #include "code\game\say.dm" #include "code\game\shuttle_engines.dm" #include "code\game\world.dm" -#include "code\game\area\ai_monitored.dm" #include "code\game\area\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" #include "code\game\area\areas\holodeck.dm" @@ -2150,6 +2209,7 @@ #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\ai.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" @@ -2257,6 +2317,8 @@ #include "code\game\machinery\wall_healer.dm" #include "code\game\machinery\washing_machine.dm" #include "code\game\machinery\wishgranter.dm" +#include "code\game\machinery\ai_core\_core.dm" +#include "code\game\machinery\ai_core\core_construction.dm" #include "code\game\machinery\camera\camera.dm" #include "code\game\machinery\camera\camera_construction.dm" #include "code\game\machinery\camera\motion.dm" @@ -2359,6 +2421,7 @@ #include "code\game\machinery\porta_turret\portable_turret.dm" #include "code\game\machinery\porta_turret\portable_turret_construct.dm" #include "code\game\machinery\porta_turret\portable_turret_cover.dm" +#include "code\game\machinery\porta_turret\turret_control.dm" #include "code\game\machinery\satellite\satellite.dm" #include "code\game\machinery\satellite\satellite_control.dm" #include "code\game\machinery\telecomms\broadcasting.dm" @@ -2379,7 +2442,6 @@ #include "code\game\objects\buckling.dm" #include "code\game\objects\empulse.dm" #include "code\game\objects\items.dm" -#include "code\game\objects\items_reskin.dm" #include "code\game\objects\obj_defense.dm" #include "code\game\objects\objs.dm" #include "code\game\objects\structures.dm" @@ -2419,6 +2481,7 @@ #include "code\game\objects\effects\anomalies\anomalies_hallucination.dm" #include "code\game\objects\effects\anomalies\anomalies_pyroclastic.dm" #include "code\game\objects\effects\anomalies\anomalies_vortex.dm" +#include "code\game\objects\effects\anomalies\anomalies_weather.dm" #include "code\game\objects\effects\decals\chemspray.dm" #include "code\game\objects\effects\decals\cleanable.dm" #include "code\game\objects\effects\decals\crayon.dm" @@ -2447,6 +2510,7 @@ #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\brimdust.dm" #include "code\game\objects\effects\particles\echo.dm" #include "code\game\objects\effects\particles\fire.dm" #include "code\game\objects\effects\particles\food.dm" @@ -2570,7 +2634,7 @@ #include "code\game\objects\items\pinpointer.dm" #include "code\game\objects\items\pitchfork.dm" #include "code\game\objects\items\plushes.dm" -#include "code\game\objects\items\pneumaticCannon.dm" +#include "code\game\objects\items\pneumatic_cannon.dm" #include "code\game\objects\items\powerfist.dm" #include "code\game\objects\items\puzzle_pieces.dm" #include "code\game\objects\items\reflex_hammer.dm" @@ -2583,6 +2647,7 @@ #include "code\game\objects\items\shooting_range.dm" #include "code\game\objects\items\shrapnel.dm" #include "code\game\objects\items\signs.dm" +#include "code\game\objects\items\skateboards.dm" #include "code\game\objects\items\skub.dm" #include "code\game\objects\items\soulscythe.dm" #include "code\game\objects\items\spear.dm" @@ -2750,7 +2815,7 @@ #include "code\game\objects\items\implants\implant_deathrattle.dm" #include "code\game\objects\items\implants\implant_explosive.dm" #include "code\game\objects\items\implants\implant_freedom.dm" -#include "code\game\objects\items\implants\implant_krav_maga.dm" +#include "code\game\objects\items\implants\implant_kaza_ruk.dm" #include "code\game\objects\items\implants\implant_mindshield.dm" #include "code\game\objects\items\implants\implant_misc.dm" #include "code\game\objects\items\implants\implant_spell.dm" @@ -2873,7 +2938,6 @@ #include "code\game\objects\items\tools\painter\airlock_painter.dm" #include "code\game\objects\items\tools\painter\decal_painter.dm" #include "code\game\objects\items\tools\painter\paintable_decals.dm" -#include "code\game\objects\structures\ai_core.dm" #include "code\game\objects\structures\aliens.dm" #include "code\game\objects\structures\bedsheet_bin.dm" #include "code\game\objects\structures\billboard.dm" @@ -2992,6 +3056,8 @@ #include "code\game\objects\structures\crates_lockers\crates\secure.dm" #include "code\game\objects\structures\crates_lockers\crates\syndicrate.dm" #include "code\game\objects\structures\crates_lockers\crates\wooden.dm" +#include "code\game\objects\structures\crates_lockers\crates\abandoned_crates\abandoned_crates.dm" +#include "code\game\objects\structures\crates_lockers\crates\abandoned_crates\abandoned_crates_loot.dm" #include "code\game\objects\structures\gym\punching_bag.dm" #include "code\game\objects\structures\gym\weight_machine.dm" #include "code\game\objects\structures\gym\weight_machine_action.dm" @@ -3100,6 +3166,7 @@ #include "code\modules\admin\poll_management.dm" #include "code\modules\admin\skill_panel.dm" #include "code\modules\admin\sound_emitter.dm" +#include "code\modules\admin\spawn_menu.dm" #include "code\modules\admin\sql_ban_system.dm" #include "code\modules\admin\sql_message_system.dm" #include "code\modules\admin\stickyban.dm" @@ -3178,6 +3245,7 @@ #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\jukebox_moderation.dm" #include "code\modules\admin\verbs\lawpanel.dm" #include "code\modules\admin\verbs\light_debug.dm" #include "code\modules\admin\verbs\list_exposer.dm" @@ -3238,7 +3306,6 @@ #include "code\modules\antagonists\abductor\abductee\abductee.dm" #include "code\modules\antagonists\abductor\abductee\abductee_objectives.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" @@ -3300,6 +3367,7 @@ #include "code\modules\antagonists\changeling\changeling_power.dm" #include "code\modules\antagonists\changeling\fallen_changeling.dm" #include "code\modules\antagonists\changeling\headslug_eggs.dm" +#include "code\modules\antagonists\changeling\powers\_biodegrade_bioacid.dm" #include "code\modules\antagonists\changeling\powers\absorb.dm" #include "code\modules\antagonists\changeling\powers\adrenaline.dm" #include "code\modules\antagonists\changeling\powers\augmented_eyesight.dm" @@ -3388,25 +3456,22 @@ #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\heretic_armor_knowledge.dm" #include "code\modules\antagonists\heretic\knowledge\lock_lore.dm" #include "code\modules\antagonists\heretic\knowledge\moon_lore.dm" #include "code\modules\antagonists\heretic\knowledge\rust_lore.dm" -#include "code\modules\antagonists\heretic\knowledge\side_ash_moon.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_lock_flesh.dm" -#include "code\modules\antagonists\heretic\knowledge\side_lock_moon.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" #include "code\modules\antagonists\heretic\knowledge\void_lore.dm" +#include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\reroll_targets.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_buff.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_curse.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_knowledge.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_map.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_moodlets.dm" +#include "code\modules\antagonists\heretic\knowledge\side_knowledge\tier_four.dm" +#include "code\modules\antagonists\heretic\knowledge\side_knowledge\tier_one.dm" +#include "code\modules\antagonists\heretic\knowledge\side_knowledge\tier_three.dm" +#include "code\modules\antagonists\heretic\knowledge\side_knowledge\tier_two.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" @@ -3418,6 +3483,7 @@ #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\crimson_cleave.dm" #include "code\modules\antagonists\heretic\magic\eldritch_blind.dm" #include "code\modules\antagonists\heretic\magic\eldritch_emplosion.dm" #include "code\modules\antagonists\heretic\magic\eldritch_shapeshift.dm" @@ -3435,7 +3501,6 @@ #include "code\modules\antagonists\heretic\magic\mirror_walk.dm" #include "code\modules\antagonists\heretic\magic\moon_parade.dm" #include "code\modules\antagonists\heretic\magic\moon_ringleader.dm" -#include "code\modules\antagonists\heretic\magic\moon_smile.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" @@ -3455,6 +3520,7 @@ #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\heretic_passive.dm" #include "code\modules\antagonists\heretic\status_effects\mark_effects.dm" #include "code\modules\antagonists\heretic\status_effects\void_chill.dm" #include "code\modules\antagonists\heretic\structures\carving_knife.dm" @@ -3727,6 +3793,7 @@ #include "code\modules\autowiki\pages\fishing.dm" #include "code\modules\autowiki\pages\soup.dm" #include "code\modules\autowiki\pages\stockparts.dm" +#include "code\modules\autowiki\pages\surgery.dm" #include "code\modules\autowiki\pages\techweb.dm" #include "code\modules\autowiki\pages\vending.dm" #include "code\modules\awaymissions\away_props.dm" @@ -3747,6 +3814,14 @@ #include "code\modules\awaymissions\mission_code\snowdin.dm" #include "code\modules\awaymissions\mission_code\stationCollision.dm" #include "code\modules\awaymissions\mission_code\undergroundoutpost45.dm" +#include "code\modules\awaymissions\mission_code\heretic\cbrn.dm" +#include "code\modules\awaymissions\mission_code\heretic\fake_items.dm" +#include "code\modules\awaymissions\mission_code\heretic\heretic.dm" +#include "code\modules\awaymissions\mission_code\heretic\heretic_gateway_guns.dm" +#include "code\modules\awaymissions\mission_code\heretic\heretic_gateway_misc.dm" +#include "code\modules\awaymissions\mission_code\heretic\heretic_gateway_spawners.dm" +#include "code\modules\awaymissions\mission_code\heretic\heretic_gateway_tram.dm" +#include "code\modules\awaymissions\mission_code\heretic\zlevel.dm" #include "code\modules\balloon_alert\balloon_alert.dm" #include "code\modules\basketball\basketball.dm" #include "code\modules\basketball\basketball_map_loading.dm" @@ -3821,6 +3896,7 @@ #include "code\modules\bitrunning\virtual_domain\domains\fredingtonfastingbear.dm" #include "code\modules\bitrunning\virtual_domain\domains\gondola_asteroid.dm" #include "code\modules\bitrunning\virtual_domain\domains\grassland_hunt.dm" +#include "code\modules\bitrunning\virtual_domain\domains\heretic_hunt.dm" #include "code\modules\bitrunning\virtual_domain\domains\hierophant.dm" #include "code\modules\bitrunning\virtual_domain\domains\island_brawl.dm" #include "code\modules\bitrunning\virtual_domain\domains\meta_central.dm" @@ -4027,14 +4103,17 @@ #include "code\modules\client\preferences\middleware\keybindings.dm" #include "code\modules\client\preferences\middleware\legacy_toggles.dm" #include "code\modules\client\preferences\middleware\names.dm" +#include "code\modules\client\preferences\middleware\personality.dm" #include "code\modules\client\preferences\middleware\quirks.dm" #include "code\modules\client\preferences\middleware\random.dm" #include "code\modules\client\preferences\middleware\species.dm" #include "code\modules\client\preferences\middleware\tts.dm" #include "code\modules\client\preferences\migrations\body_type_migration.dm" #include "code\modules\client\preferences\migrations\convert_to_json_savefile.dm" +#include "code\modules\client\preferences\migrations\human_tail_ears_migration.dm" #include "code\modules\client\preferences\migrations\legacy_sound_toggles_migration.dm" #include "code\modules\client\preferences\migrations\quirk_loadout_migration.dm" +#include "code\modules\client\preferences\migrations\quirk_personality_migration.dm" #include "code\modules\client\preferences\migrations\sound_checkboxes_migration.dm" #include "code\modules\client\preferences\migrations\tgui_prefs_migration.dm" #include "code\modules\client\preferences\migrations\tts_blip_migration.dm" @@ -4122,6 +4201,7 @@ #include "code\modules\clothing\masks\surgical.dm" #include "code\modules\clothing\neck\_neck.dm" #include "code\modules\clothing\neck\collar_bomb.dm" +#include "code\modules\clothing\neck\horrific_necktie.dm" #include "code\modules\clothing\outfits\ert.dm" #include "code\modules\clothing\outfits\event.dm" #include "code\modules\clothing\outfits\plasmaman.dm" @@ -4153,6 +4233,7 @@ #include "code\modules\clothing\spacesuits\softsuit.dm" #include "code\modules\clothing\spacesuits\specialops.dm" #include "code\modules\clothing\spacesuits\syndi.dm" +#include "code\modules\clothing\suits\_lasertag_components.dm" #include "code\modules\clothing\suits\_suits.dm" #include "code\modules\clothing\suits\ablativecoat.dm" #include "code\modules\clothing\suits\armor.dm" @@ -4175,6 +4256,7 @@ #include "code\modules\clothing\suits\wetfloor.dm" #include "code\modules\clothing\suits\wintercoats.dm" #include "code\modules\clothing\suits\wiz_robe.dm" +#include "code\modules\clothing\under\_suit_sensor.dm" #include "code\modules\clothing\under\_under.dm" #include "code\modules\clothing\under\color.dm" #include "code\modules\clothing\under\costume.dm" @@ -4217,8 +4299,11 @@ #include "code\modules\deathmatch\deathmatch_modifier.dm" #include "code\modules\debugging\debugger.dm" #include "code\modules\debugging\tracy.dm" +#include "code\modules\detectivework\detective_scan_category.dm" #include "code\modules\detectivework\evidence.dm" #include "code\modules\detectivework\scanner.dm" +#include "code\modules\detectivework\detective_scanner_data\detective_scanner_data_entry.dm" +#include "code\modules\detectivework\detective_scanner_data\detective_scanner_log_entry.dm" #include "code\modules\discord\accountlink.dm" #include "code\modules\discord\discord_embed.dm" #include "code\modules\discord\discord_link_record.dm" @@ -4293,6 +4378,7 @@ #include "code\modules\events\anomaly\anomaly_placer.dm" #include "code\modules\events\anomaly\anomaly_pyro.dm" #include "code\modules\events\anomaly\anomaly_vortex.dm" +#include "code\modules\events\anomaly\anomaly_weather.dm" #include "code\modules\events\ghost_role\_ghost_role.dm" #include "code\modules\events\ghost_role\operative.dm" #include "code\modules\events\ghost_role\sentience.dm" @@ -4472,6 +4558,7 @@ #include "code\modules\hallucination\hud_screw.dm" #include "code\modules\hallucination\ice_cube.dm" #include "code\modules\hallucination\inhand_fake_item.dm" +#include "code\modules\hallucination\malf_apc.dm" #include "code\modules\hallucination\mother.dm" #include "code\modules\hallucination\nearby_fake_item.dm" #include "code\modules\hallucination\on_fire.dm" @@ -4502,6 +4589,7 @@ #include "code\modules\hydroponics\seed_extractor.dm" #include "code\modules\hydroponics\seeds.dm" #include "code\modules\hydroponics\snail_overlay.dm" +#include "code\modules\hydroponics\soil.dm" #include "code\modules\hydroponics\unique_plant_genes.dm" #include "code\modules\hydroponics\beekeeping\bee_smoker.dm" #include "code\modules\hydroponics\beekeeping\beebox.dm" @@ -4754,6 +4842,7 @@ #include "code\modules\loadout\categories\neck.dm" #include "code\modules\loadout\categories\pocket.dm" #include "code\modules\loadout\categories\shoes.dm" +#include "code\modules\loadout\categories\suits.dm" #include "code\modules\logging\log_category.dm" #include "code\modules\logging\log_entry.dm" #include "code\modules\logging\log_holder.dm" @@ -4911,11 +5000,11 @@ #include "code\modules\mapping\space_management\zlevel_manager.dm" #include "code\modules\meteors\meteor_changeling.dm" #include "code\modules\meteors\meteor_dark_matteor.dm" +#include "code\modules\meteors\meteor_deflection.dm" #include "code\modules\meteors\meteor_mode_controller.dm" #include "code\modules\meteors\meteor_spawning.dm" #include "code\modules\meteors\meteor_types.dm" #include "code\modules\meteors\meteor_waves.dm" -#include "code\modules\mining\abandoned_crates.dm" #include "code\modules\mining\aux_base.dm" #include "code\modules\mining\fulton.dm" #include "code\modules\mining\machine_processing.dm" @@ -5156,6 +5245,9 @@ #include "code\modules\mob\living\basic\icemoon\wolf\wolf.dm" #include "code\modules\mob\living\basic\icemoon\wolf\wolf_ai.dm" #include "code\modules\mob\living\basic\icemoon\wolf\wolf_extras.dm" +#include "code\modules\mob\living\basic\illusion\illlusion_ai.dm" +#include "code\modules\mob\living\basic\illusion\illusion.dm" +#include "code\modules\mob\living\basic\illusion\illusion_subtypes.dm" #include "code\modules\mob\living\basic\jungle\venus_human_trap.dm" #include "code\modules\mob\living\basic\jungle\leaper\leaper.dm" #include "code\modules\mob\living\basic\jungle\leaper\leaper_abilities.dm" @@ -5207,10 +5299,10 @@ #include "code\modules\mob\living\basic\lavaland\mook\mook_village.dm" #include "code\modules\mob\living\basic\lavaland\node_drone\node_drone.dm" #include "code\modules\mob\living\basic\lavaland\raptor\_raptor.dm" -#include "code\modules\mob\living\basic\lavaland\raptor\baby_raptor.dm" #include "code\modules\mob\living\basic\lavaland\raptor\raptor_ai_behavior.dm" #include "code\modules\mob\living\basic\lavaland\raptor\raptor_ai_controller.dm" #include "code\modules\mob\living\basic\lavaland\raptor\raptor_ai_subtrees.dm" +#include "code\modules\mob\living\basic\lavaland\raptor\raptor_color.dm" #include "code\modules\mob\living\basic\lavaland\raptor\raptor_dex.dm" #include "code\modules\mob\living\basic\lavaland\raptor\raptor_egg.dm" #include "code\modules\mob\living\basic\lavaland\raptor\raptor_food_trough.dm" @@ -5509,10 +5601,12 @@ #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_core_display_picker.dm" #include "code\modules\mob\living\silicon\ai\ai_defense.dm" #include "code\modules\mob\living\silicon\ai\ai_defines.dm" #include "code\modules\mob\living\silicon\ai\ai_portrait_picker.dm" #include "code\modules\mob\living\silicon\ai\ai_say.dm" +#include "code\modules\mob\living\silicon\ai\ai_status_display_picker.dm" #include "code\modules\mob\living\silicon\ai\death.dm" #include "code\modules\mob\living\silicon\ai\emote.dm" #include "code\modules\mob\living\silicon\ai\examine.dm" @@ -5524,7 +5618,6 @@ #include "code\modules\mob\living\silicon\ai\robot_control.dm" #include "code\modules\mob\living\silicon\ai\vox_sounds.dm" #include "code\modules\mob\living\silicon\ai\ai_actions\remote_power.dm" -#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" #include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" #include "code\modules\mob\living\silicon\ai\freelook\eye.dm" #include "code\modules\mob\living\silicon\robot\death.dm" @@ -5551,7 +5644,6 @@ #include "code\modules\mob\living\simple_animal\bot\secbot.dm" #include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.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\ooze.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" @@ -5662,6 +5754,7 @@ #include "code\modules\modular_computers\file_system\programs\portrait_printer.dm" #include "code\modules\modular_computers\file_system\programs\powermonitor.dm" #include "code\modules\modular_computers\file_system\programs\radar.dm" +#include "code\modules\modular_computers\file_system\programs\raptordex.dm" #include "code\modules\modular_computers\file_system\programs\records.dm" #include "code\modules\modular_computers\file_system\programs\restock_tracker.dm" #include "code\modules\modular_computers\file_system\programs\robocontrol.dm" @@ -6313,55 +6406,8 @@ #include "code\modules\station_goals\meteor_shield.dm" #include "code\modules\station_goals\station_goal.dm" #include "code\modules\station_goals\vault_mutation.dm" -#include "code\modules\surgery\amputation.dm" -#include "code\modules\surgery\asthmatic_bypass.dm" -#include "code\modules\surgery\autopsy.dm" -#include "code\modules\surgery\blood_filter.dm" -#include "code\modules\surgery\bone_mending.dm" -#include "code\modules\surgery\brain_surgery.dm" -#include "code\modules\surgery\burn_dressing.dm" -#include "code\modules\surgery\cavity_implant.dm" -#include "code\modules\surgery\core_removal.dm" -#include "code\modules\surgery\coronary_bypass.dm" -#include "code\modules\surgery\dental_implant.dm" -#include "code\modules\surgery\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" -#include "code\modules\surgery\hepatectomy.dm" -#include "code\modules\surgery\implant_removal.dm" -#include "code\modules\surgery\limb_augmentation.dm" -#include "code\modules\surgery\lipoplasty.dm" -#include "code\modules\surgery\lobectomy.dm" -#include "code\modules\surgery\mechanic_steps.dm" -#include "code\modules\surgery\organ_manipulation.dm" -#include "code\modules\surgery\organic_steps.dm" -#include "code\modules\surgery\plastic_surgery.dm" -#include "code\modules\surgery\prosthetic_replacement.dm" -#include "code\modules\surgery\repair_puncture.dm" -#include "code\modules\surgery\revival.dm" -#include "code\modules\surgery\sleeper_protocol.dm" -#include "code\modules\surgery\stomachpump.dm" -#include "code\modules\surgery\surgery.dm" -#include "code\modules\surgery\surgery_helpers.dm" -#include "code\modules\surgery\surgery_step.dm" -#include "code\modules\surgery\tools.dm" -#include "code\modules\surgery\advanced\brainwashing.dm" -#include "code\modules\surgery\advanced\lobotomy.dm" -#include "code\modules\surgery\advanced\necrotic_revival.dm" -#include "code\modules\surgery\advanced\pacification.dm" -#include "code\modules\surgery\advanced\viral_bonding.dm" -#include "code\modules\surgery\advanced\wingreconstruction.dm" -#include "code\modules\surgery\advanced\bioware\bioware_surgery.dm" -#include "code\modules\surgery\advanced\bioware\cortex_folding.dm" -#include "code\modules\surgery\advanced\bioware\cortex_imprint.dm" -#include "code\modules\surgery\advanced\bioware\ligament_hook.dm" -#include "code\modules\surgery\advanced\bioware\ligament_reinforcement.dm" -#include "code\modules\surgery\advanced\bioware\muscled_veins.dm" -#include "code\modules\surgery\advanced\bioware\nerve_grounding.dm" -#include "code\modules\surgery\advanced\bioware\nerve_splicing.dm" -#include "code\modules\surgery\advanced\bioware\vein_threading.dm" +#include "code\modules\surgery\surgery_disks.dm" +#include "code\modules\surgery\surgery_tools.dm" #include "code\modules\surgery\bodyparts\_bodyparts.dm" #include "code\modules\surgery\bodyparts\bodypart_effects.dm" #include "code\modules\surgery\bodyparts\dismemberment.dm" @@ -6380,6 +6426,39 @@ #include "code\modules\surgery\bodyparts\species_parts\misc_bodyparts.dm" #include "code\modules\surgery\bodyparts\species_parts\moth_bodyparts.dm" #include "code\modules\surgery\bodyparts\species_parts\plasmaman_bodyparts.dm" +#include "code\modules\surgery\operations\_basic_surgery_state.dm" +#include "code\modules\surgery\operations\_operation.dm" +#include "code\modules\surgery\operations\operation_add_limb.dm" +#include "code\modules\surgery\operations\operation_amputation.dm" +#include "code\modules\surgery\operations\operation_asthma.dm" +#include "code\modules\surgery\operations\operation_autopsy.dm" +#include "code\modules\surgery\operations\operation_bioware.dm" +#include "code\modules\surgery\operations\operation_bone_repair.dm" +#include "code\modules\surgery\operations\operation_brainwash.dm" +#include "code\modules\surgery\operations\operation_cavity_implant.dm" +#include "code\modules\surgery\operations\operation_core.dm" +#include "code\modules\surgery\operations\operation_debride.dm" +#include "code\modules\surgery\operations\operation_dental.dm" +#include "code\modules\surgery\operations\operation_dissection.dm" +#include "code\modules\surgery\operations\operation_filter.dm" +#include "code\modules\surgery\operations\operation_generic.dm" +#include "code\modules\surgery\operations\operation_generic_basic.dm" +#include "code\modules\surgery\operations\operation_generic_mechanic.dm" +#include "code\modules\surgery\operations\operation_healing.dm" +#include "code\modules\surgery\operations\operation_implant_removal.dm" +#include "code\modules\surgery\operations\operation_lipo.dm" +#include "code\modules\surgery\operations\operation_lobotomy.dm" +#include "code\modules\surgery\operations\operation_organ_manip.dm" +#include "code\modules\surgery\operations\operation_organ_repair.dm" +#include "code\modules\surgery\operations\operation_pacify.dm" +#include "code\modules\surgery\operations\operation_plastic_surgery.dm" +#include "code\modules\surgery\operations\operation_pump.dm" +#include "code\modules\surgery\operations\operation_puncture.dm" +#include "code\modules\surgery\operations\operation_replace_limb.dm" +#include "code\modules\surgery\operations\operation_revival.dm" +#include "code\modules\surgery\operations\operation_virus.dm" +#include "code\modules\surgery\operations\operation_wing_repair.dm" +#include "code\modules\surgery\operations\operation_zombie.dm" #include "code\modules\surgery\organs\_organ.dm" #include "code\modules\surgery\organs\autosurgeon.dm" #include "code\modules\surgery\organs\helpers.dm" @@ -6443,6 +6522,7 @@ #include "code\modules\tgui\states\zlevel.dm" #include "code\modules\tgui_input\alert.dm" #include "code\modules\tgui_input\checkboxes.dm" +#include "code\modules\tgui_input\color.dm" #include "code\modules\tgui_input\keycombo.dm" #include "code\modules\tgui_input\list.dm" #include "code\modules\tgui_input\number.dm" @@ -6519,6 +6599,8 @@ #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\cars\golfcart\golfcart.dm" +#include "code\modules\vehicles\cars\golfcart\golfcart_rear.dm" #include "code\modules\vehicles\mecha\_mecha.dm" #include "code\modules\vehicles\mecha\mech_bay.dm" #include "code\modules\vehicles\mecha\mech_fabricator.dm" @@ -6764,26 +6846,67 @@ #include "interface\fonts\vcr_osd_mono.dm" #include "modular_darkpack\master_files\code\world.dm" #include "modular_darkpack\master_files\code\__HELPERS\maths.dm" +#include "modular_darkpack\master_files\code\_globalvars\configuration.dm" #include "modular_darkpack\master_files\code\_onclick\hud\hud.dm" +#include "modular_darkpack\master_files\code\_onclick\hud\living.dm" +#include "modular_darkpack\master_files\code\_onclick\hud\new_player.dm" +#include "modular_darkpack\master_files\code\controllers\configuration\entries\general.dm" #include "modular_darkpack\master_files\code\datums\actions\action.dm" #include "modular_darkpack\master_files\code\datums\components\dejavu.dm" +#include "modular_darkpack\master_files\code\datums\mapgen\woods_generator.dm" +#include "modular_darkpack\master_files\code\datums\mind\_mind.dm" +#include "modular_darkpack\master_files\code\datums\station_traits\_station_trait.dm" #include "modular_darkpack\master_files\code\game\area\areas.dm" #include "modular_darkpack\master_files\code\game\objects\items.dm" +#include "modular_darkpack\master_files\code\game\objects\items\trash.dm" +#include "modular_darkpack\master_files\code\game\objects\items\weaponry.dm" +#include "modular_darkpack\master_files\code\game\objects\items\devices\radio\radio.dm" +#include "modular_darkpack\master_files\code\game\objects\items\food\snacks.dm" +#include "modular_darkpack\master_files\code\game\objects\items\storage\fancy.dm" +#include "modular_darkpack\master_files\code\game\objects\structures\flora.dm" #include "modular_darkpack\master_files\code\game\objects\structures\ladders.dm" +#include "modular_darkpack\master_files\code\game\objects\structures\railings.dm" +#include "modular_darkpack\master_files\code\game\objects\structures\stairs.dm" #include "modular_darkpack\master_files\code\game\turfs\turf.dm" +#include "modular_darkpack\master_files\code\game\turfs\open\_open.dm" +#include "modular_darkpack\master_files\code\game\turfs\open\snow.dm" +#include "modular_darkpack\master_files\code\game\turfs\open\water.dm" +#include "modular_darkpack\master_files\code\game\turfs\open\floor\fancy_floor.dm" +#include "modular_darkpack\master_files\code\game\turfs\open\space\space.dm" +#include "modular_darkpack\master_files\code\modules\client\preferences_savefile.dm" #include "modular_darkpack\master_files\code\modules\client\preferences\_preference.dm" #include "modular_darkpack\master_files\code\modules\economy\account.dm" +#include "modular_darkpack\master_files\code\modules\fishing\sources\subtypes\structures.dm" +#include "modular_darkpack\master_files\code\modules\fishing\sources\subtypes\turfs.dm" +#include "modular_darkpack\master_files\code\modules\hydroponics\grown.dm" +#include "modular_darkpack\master_files\code\modules\logging\log_stats_preferences.dm" +#include "modular_darkpack\master_files\code\modules\mob\dead\observer\observer.dm" +#include "modular_darkpack\master_files\code\modules\mob\living\init_signals.dm" #include "modular_darkpack\master_files\code\modules\mob\living\living.dm" #include "modular_darkpack\master_files\code\modules\mob\living\living_defines.dm" +#include "modular_darkpack\master_files\code\modules\mob\living\living_movement.dm" +#include "modular_darkpack\master_files\code\modules\mob\living\basic\farm_animals\deer\deer.dm" #include "modular_darkpack\master_files\code\modules\mob\living\basic\space_fauna\ghost.dm" +#include "modular_darkpack\master_files\code\modules\mob\living\basic\vermin\space_bat.dm" +#include "modular_darkpack\master_files\code\modules\mob\living\carbon\carbon.dm" #include "modular_darkpack\master_files\code\modules\mob\living\carbon\carbon_defines.dm" -#include "modular_darkpack\master_files\code\modules\mob\living\carbon\carbon_movement.dm" +#include "modular_darkpack\master_files\code\modules\mob\living\carbon\examine.dm" +#include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\death.dm" +#include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\human.dm" +#include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\human_defines.dm" +#include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\init_signals.dm" #include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\initialize.dm" +#include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\life.dm" #include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\physiology.dm" +#include "modular_darkpack\master_files\code\modules\mob\living\carbon\human\species_types\zombies.dm" #include "modular_darkpack\master_files\code\modules\mob\living\simple_animal\hostile\hostile.dm" #include "modular_darkpack\master_files\code\modules\paperwork\fax.dm" +#include "modular_darkpack\master_files\code\modules\power\lighting\lighting_mapping_helpers.dm" #include "modular_darkpack\master_files\code\modules\projectiles\ammunition\_ammunition.dm" #include "modular_darkpack\master_files\code\modules\projectiles\projectile\bullets.dm" +#include "modular_darkpack\master_files\code\modules\rituals\code\ritual_rune.dm" +#include "modular_darkpack\master_files\code\modules\rituals\code\ritual_rune_drawing.dm" +#include "modular_darkpack\master_files\code\modules\rituals\code\ritual_tome.dm" #include "modular_darkpack\master_files\code\modules\surgery\bodyparts\_bodyparts.dm" #include "modular_darkpack\master_files\code\modules\surgery\bodyparts\organs\internal\_appendix.dm" #include "modular_darkpack\master_files\code\modules\surgery\bodyparts\organs\internal\_ears.dm" @@ -6794,20 +6917,37 @@ #include "modular_darkpack\master_files\code\modules\surgery\bodyparts\organs\internal\_stomach.dm" #include "modular_darkpack\master_files\code\modules\surgery\bodyparts\organs\internal\_tongue.dm" #include "modular_darkpack\master_files\code\modules\surgery\bodyparts\organs\internal\_vocal_chords.dm" +#include "modular_darkpack\master_files\code\modules\vending\cola.dm" +#include "modular_darkpack\master_files\code\modules\vending\snack.dm" +#include "modular_darkpack\master_files\code\turfs\open\grass.dm" +#include "modular_darkpack\master_files\code\turfs\open\planet.dm" #include "modular_darkpack\modules\aggravated_damage\code\damage_procs.dm" +#include "modular_darkpack\modules\ambience\code\music_subsystem.dm" +#include "modular_darkpack\modules\antediluvian_sarcophagus\code\sarcophagus.dm" +#include "modular_darkpack\modules\antediluvian_sarcophagus\code\the_antediluvian.dm" #include "modular_darkpack\modules\areas\code\__vtm.dm" #include "modular_darkpack\modules\areas\code\random_gen.dm" -#include "modular_darkpack\modules\areas\code\sewers.dm" +#include "modular_darkpack\modules\areas\code\zone_hud.dm" #include "modular_darkpack\modules\areas\code\interiors\__interior.dm" #include "modular_darkpack\modules\areas\code\interiors\anarch.dm" -#include "modular_darkpack\modules\areas\code\interiors\chantry.dm" #include "modular_darkpack\modules\areas\code\interiors\city_interiors.dm" #include "modular_darkpack\modules\areas\code\interiors\endron_facility.dm" +#include "modular_darkpack\modules\areas\code\interiors\forest.dm" +#include "modular_darkpack\modules\areas\code\interiors\garou.dm" +#include "modular_darkpack\modules\areas\code\interiors\library.dm" #include "modular_darkpack\modules\areas\code\interiors\millennium_tower.dm" +#include "modular_darkpack\modules\areas\code\interiors\sewers.dm" #include "modular_darkpack\modules\areas\code\outsides\__outside.dm" #include "modular_darkpack\modules\areas\code\outsides\city_outsides.dm" +#include "modular_darkpack\modules\areas\code\outsides\forest.dm" +#include "modular_darkpack\modules\ashtray\code\ashtray.dm" #include "modular_darkpack\modules\battering_ram\code\battering_ram.dm" -#include "modular_darkpack\modules\beastmaster\code\beastmaster_globals.dm" +#include "modular_darkpack\modules\beastmaster\code\beastmaster_actions.dm" +#include "modular_darkpack\modules\beastmaster\code\beastmaster_ai.dm" +#include "modular_darkpack\modules\beastmaster\code\beastmaster_commands.dm" +#include "modular_darkpack\modules\beastmaster\code\beastmaster_minion_management.dm" +#include "modular_darkpack\modules\beastmaster\code\beastmaster_signals.dm" +#include "modular_darkpack\modules\bitcoinminer\code\bitcoinminer.dm" #include "modular_darkpack\modules\blood_drinking\code\bite_helper_procs.dm" #include "modular_darkpack\modules\blood_drinking\code\bite_keybinding.dm" #include "modular_darkpack\modules\blood_drinking\code\drinksomeblood.dm" @@ -6821,8 +6961,10 @@ #include "modular_darkpack\modules\blood_drinking\code\overfeeding\diablerie\adjust_generation.dm" #include "modular_darkpack\modules\blood_drinking\code\overfeeding\diablerie\handle_diablerie.dm" #include "modular_darkpack\modules\blood_drinking\code\overfeeding\diablerie\make_diablerist.dm" +#include "modular_darkpack\modules\books\code\bookcases.dm" #include "modular_darkpack\modules\books\code\books.dm" #include "modular_darkpack\modules\brain_damage\code\phobia.dm" +#include "modular_darkpack\modules\brazier\code\brazier.dm" #include "modular_darkpack\modules\cargo\code\box_move.dm" #include "modular_darkpack\modules\cars\code\blocking_contents.dm" #include "modular_darkpack\modules\cars\code\car.dm" @@ -6830,6 +6972,7 @@ #include "modular_darkpack\modules\cars\code\car_subsystem.dm" #include "modular_darkpack\modules\cars\code\gas.dm" #include "modular_darkpack\modules\cars\code\subtypes.dm" +#include "modular_darkpack\modules\chairs\code\chairs.dm" #include "modular_darkpack\modules\city_time\code\admin_verbs.dm" #include "modular_darkpack\modules\city_time\code\city_time_subsystem.dm" #include "modular_darkpack\modules\city_time\code\clock_structure.dm" @@ -6837,6 +6980,12 @@ #include "modular_darkpack\modules\city_time\code\status_effects.dm" #include "modular_darkpack\modules\city_time\code\vote.dm" #include "modular_darkpack\modules\city_time\code\wrist_watch.dm" +#include "modular_darkpack\modules\city_traits\code\negative_traits.dm" +#include "modular_darkpack\modules\city_traits\code\netural_traits.dm" +#include "modular_darkpack\modules\city_traits\code\positive_traits.dm" +#include "modular_darkpack\modules\closets\code\security.dm" +#include "modular_darkpack\modules\clothes\code\back.dm" +#include "modular_darkpack\modules\clothes\code\belt.dm" #include "modular_darkpack\modules\clothes\code\eyes.dm" #include "modular_darkpack\modules\clothes\code\feet.dm" #include "modular_darkpack\modules\clothes\code\hands.dm" @@ -6845,27 +6994,38 @@ #include "modular_darkpack\modules\clothes\code\neck.dm" #include "modular_darkpack\modules\clothes\code\suit.dm" #include "modular_darkpack\modules\clothes\code\under.dm" +#include "modular_darkpack\modules\curtains\code\curtains.dm" #include "modular_darkpack\modules\dancing\code\dancing.dm" +#include "modular_darkpack\modules\decor\code\bench.dm" +#include "modular_darkpack\modules\decor\code\city_map.dm" #include "modular_darkpack\modules\decor\code\decals.dm" #include "modular_darkpack\modules\decor\code\decor.dm" #include "modular_darkpack\modules\decor\code\flora.dm" #include "modular_darkpack\modules\decor\code\posters.dm" #include "modular_darkpack\modules\decor\code\racks.dm" -#include "modular_darkpack\modules\decor\code\rocks.dm" +#include "modular_darkpack\modules\decor\code\road_signs.dm" #include "modular_darkpack\modules\decor\code\signs_city.dm" +#include "modular_darkpack\modules\decor\code\swaying.dm" #include "modular_darkpack\modules\decor\code\tables.dm" #include "modular_darkpack\modules\decor\code\trash.dm" #include "modular_darkpack\modules\decor\code\vents.dm" #include "modular_darkpack\modules\deprecated\code\runtime_town_types.dm" #include "modular_darkpack\modules\doors\code\door_item.dm" #include "modular_darkpack\modules\doors\code\door_repair_kit.dm" +#include "modular_darkpack\modules\doors\code\shutters.dm" #include "modular_darkpack\modules\doors\code\vampdoor.dm" #include "modular_darkpack\modules\doors\code\vampdoor_glass.dm" -#include "modular_darkpack\modules\doors\code\vampdoor_misc.dm" #include "modular_darkpack\modules\doors\code\vampdoor_npc.dm" -#include "modular_darkpack\modules\doors\code\vampdoor_police.dm" +#include "modular_darkpack\modules\doors\code\vampdoor_old.dm" +#include "modular_darkpack\modules\doors\code\vampdoor_oldwood.dm" +#include "modular_darkpack\modules\doors\code\vampdoor_prison.dm" +#include "modular_darkpack\modules\doors\code\vampdoor_reinf.dm" +#include "modular_darkpack\modules\doors\code\vampdoor_simple.dm" +#include "modular_darkpack\modules\doors\code\vampdoor_vault.dm" #include "modular_darkpack\modules\doors\code\vampdoor_wood.dm" -#include "modular_darkpack\modules\doors\code\vampdoor_wood_old.dm" +#include "modular_darkpack\modules\doors\code\vampdoor_woodglass.dm" +#include "modular_darkpack\modules\doors\code\helpers\door_access.dm" +#include "modular_darkpack\modules\doors\code\helpers\door_helpers.dm" #include "modular_darkpack\modules\doors\code\keys\keys.dm" #include "modular_darkpack\modules\doors\code\keys\keys_npc.dm" #include "modular_darkpack\modules\doors\code\keys\lockpick.dm" @@ -6874,7 +7034,12 @@ #include "modular_darkpack\modules\drugs\code\meth\methlab.dm" #include "modular_darkpack\modules\drugs\code\meth\pills.dm" #include "modular_darkpack\modules\drugs\code\meth\reagents.dm" +#include "modular_darkpack\modules\drugs\code\weed\bong.dm" +#include "modular_darkpack\modules\drugs\code\weed\fake_steam.dm" +#include "modular_darkpack\modules\drugs\code\weed\gear.dm" +#include "modular_darkpack\modules\drugs\code\weed\tray.dm" #include "modular_darkpack\modules\economy\code\account.dm" +#include "modular_darkpack\modules\economy\code\atm.dm" #include "modular_darkpack\modules\economy\code\credit_card.dm" #include "modular_darkpack\modules\economy\code\dollar.dm" #include "modular_darkpack\modules\economy\code\economy_globals.dm" @@ -6882,21 +7047,106 @@ #include "modular_darkpack\modules\economy\code\selling\selling.dm" #include "modular_darkpack\modules\electricity\code\fusebox.dm" #include "modular_darkpack\modules\electricity\code\generator.dm" -#include "modular_darkpack\modules\fire\code\fire_globals.dm" +#include "modular_darkpack\modules\elevators\code\elevator.dm" +#include "modular_darkpack\modules\fire\code\fire.dm" +#include "modular_darkpack\modules\fire\code\molotov.dm" +#include "modular_darkpack\modules\fire\code\object_interactions.dm" +#include "modular_darkpack\modules\fire\code\sprinkler.dm" +#include "modular_darkpack\modules\fire\code\turf_fire_subsystem.dm" +#include "modular_darkpack\modules\fishing\code\fishing.dm" #include "modular_darkpack\modules\flags\code\flags.dm" #include "modular_darkpack\modules\flags\code\loadout.dm" #include "modular_darkpack\modules\flags\code\pride_flags.dm" #include "modular_darkpack\modules\flags\code\recipes.dm" +#include "modular_darkpack\modules\flavor_text\code\config.dm" +#include "modular_darkpack\modules\flavor_text\code\custom_examine_text.dm" +#include "modular_darkpack\modules\flavor_text\code\examine.dm" +#include "modular_darkpack\modules\flavor_text\code\preferences.dm" +#include "modular_darkpack\modules\flavor_text\code\record.dm" +#include "modular_darkpack\modules\flavor_text\code\preferences\masked_flavor_text_preference.dm" +#include "modular_darkpack\modules\flavor_text\code\preferences\nsfw_content_preference.dm" +#include "modular_darkpack\modules\flavor_text\code\preferences\record_preferences.dm" #include "modular_darkpack\modules\font_adjustments\font_procs.dm" #include "modular_darkpack\modules\food\code\drinking_glass.dm" #include "modular_darkpack\modules\food\code\drinks.dm" #include "modular_darkpack\modules\food\code\food.dm" +#include "modular_darkpack\modules\food\code\recipes.dm" +#include "modular_darkpack\modules\food\code\structure.dm" #include "modular_darkpack\modules\ghoul\code\ghoul_species.dm" #include "modular_darkpack\modules\government\code\passport.dm" +#include "modular_darkpack\modules\graveyard\code\graveyard.dm" #include "modular_darkpack\modules\graveyard\code\graveyard_area.dm" -#include "modular_darkpack\modules\graveyard\code\graveyard_globals.dm" +#include "modular_darkpack\modules\greebles\code\fake_platforms.dm" +#include "modular_darkpack\modules\guestbook\code\adjective_preference.dm" +#include "modular_darkpack\modules\guestbook\code\guestbook.dm" +#include "modular_darkpack\modules\guestbook\code\human_helpers.dm" +#include "modular_darkpack\modules\guestbook\code\mob.dm" +#include "modular_darkpack\modules\guestbook\code\persistent_guestbooks.dm" +#include "modular_darkpack\modules\hair\code\sprite_accessories.dm" #include "modular_darkpack\modules\human_visuals\code\extra_human_sprites.dm" -#include "modular_darkpack\modules\human_visuals\code\shadows.dm" +#include "modular_darkpack\modules\jobs\code\_departments.dm" +#include "modular_darkpack\modules\jobs\code\_job_assignment.dm" +#include "modular_darkpack\modules\jobs\code\_jobs.dm" +#include "modular_darkpack\modules\jobs\code\job_items.dm" +#include "modular_darkpack\modules\jobs\code\landmarks.dm" +#include "modular_darkpack\modules\jobs\code\anarchs\baron.dm" +#include "modular_darkpack\modules\jobs\code\anarchs\bruiser.dm" +#include "modular_darkpack\modules\jobs\code\anarchs\emissary.dm" +#include "modular_darkpack\modules\jobs\code\anarchs\sweeper.dm" +#include "modular_darkpack\modules\jobs\code\anarchs\tapster.dm" +#include "modular_darkpack\modules\jobs\code\camarilla\harpy.dm" +#include "modular_darkpack\modules\jobs\code\camarilla\hound.dm" +#include "modular_darkpack\modules\jobs\code\camarilla\prince.dm" +#include "modular_darkpack\modules\jobs\code\camarilla\seneschal.dm" +#include "modular_darkpack\modules\jobs\code\camarilla\sheriff.dm" +#include "modular_darkpack\modules\jobs\code\camarilla\tower_employee.dm" +#include "modular_darkpack\modules\jobs\code\camarilla\primogens\banu_haqim.dm" +#include "modular_darkpack\modules\jobs\code\camarilla\primogens\lasombra.dm" +#include "modular_darkpack\modules\jobs\code\camarilla\primogens\malkavian.dm" +#include "modular_darkpack\modules\jobs\code\camarilla\primogens\nosferatu.dm" +#include "modular_darkpack\modules\jobs\code\camarilla\primogens\toreador.dm" +#include "modular_darkpack\modules\jobs\code\camarilla\primogens\ventrue.dm" +#include "modular_darkpack\modules\jobs\code\clinic\director.dm" +#include "modular_darkpack\modules\jobs\code\clinic\doctor.dm" +#include "modular_darkpack\modules\jobs\code\event\national_guard.dm" +#include "modular_darkpack\modules\jobs\code\event\swat.dm" +#include "modular_darkpack\modules\jobs\code\garou\councillor.dm" +#include "modular_darkpack\modules\jobs\code\garou\guardian.dm" +#include "modular_darkpack\modules\jobs\code\garou\truthcatcher.dm" +#include "modular_darkpack\modules\jobs\code\garou\warder.dm" +#include "modular_darkpack\modules\jobs\code\garou\wyrmfoe.dm" +#include "modular_darkpack\modules\jobs\code\giovanni\capo.dm" +#include "modular_darkpack\modules\jobs\code\giovanni\la_famiglia.dm" +#include "modular_darkpack\modules\jobs\code\giovanni\la_squadra.dm" +#include "modular_darkpack\modules\jobs\code\miscelllaneous\citizen.dm" +#include "modular_darkpack\modules\jobs\code\miscelllaneous\club_worker.dm" +#include "modular_darkpack\modules\jobs\code\miscelllaneous\graveyard_keeper.dm" +#include "modular_darkpack\modules\jobs\code\miscelllaneous\janitor.dm" +#include "modular_darkpack\modules\jobs\code\miscelllaneous\priest.dm" +#include "modular_darkpack\modules\jobs\code\miscelllaneous\taxi.dm" +#include "modular_darkpack\modules\jobs\code\pentex\affairs.dm" +#include "modular_darkpack\modules\jobs\code\pentex\branch_lead.dm" +#include "modular_darkpack\modules\jobs\code\pentex\employee.dm" +#include "modular_darkpack\modules\jobs\code\pentex\executive.dm" +#include "modular_darkpack\modules\jobs\code\pentex\sec.dm" +#include "modular_darkpack\modules\jobs\code\pentex\secchief.dm" +#include "modular_darkpack\modules\jobs\code\police\chief.dm" +#include "modular_darkpack\modules\jobs\code\police\dispatcher.dm" +#include "modular_darkpack\modules\jobs\code\police\fbi.dm" +#include "modular_darkpack\modules\jobs\code\police\police.dm" +#include "modular_darkpack\modules\jobs\code\police\sergeant.dm" +#include "modular_darkpack\modules\jobs\code\sabbat\ductus.dm" +#include "modular_darkpack\modules\jobs\code\sabbat\pack.dm" +#include "modular_darkpack\modules\jobs\code\sabbat\priest.dm" +#include "modular_darkpack\modules\jobs\code\sabbat\sabbat.dm" +#include "modular_darkpack\modules\jobs\code\supply\dealer.dm" +#include "modular_darkpack\modules\jobs\code\supply\supply_tech.dm" +#include "modular_darkpack\modules\jobs\code\tremere\archivist.dm" +#include "modular_darkpack\modules\jobs\code\tremere\gargoyle.dm" +#include "modular_darkpack\modules\jobs\code\tremere\regent.dm" +#include "modular_darkpack\modules\jobs\code\tzimisce\bogatyr.dm" +#include "modular_darkpack\modules\jobs\code\tzimisce\voivode.dm" +#include "modular_darkpack\modules\jobs\code\tzimisce\zadruga.dm" #include "modular_darkpack\modules\jumping\code\crack_effect.dm" #include "modular_darkpack\modules\jumping\code\jump_ui_button.dm" #include "modular_darkpack\modules\jumping\code\jumper_component.dm" @@ -6911,6 +7161,7 @@ #include "modular_darkpack\modules\kindred_species\code\vampire_clan\__vampire_clan.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clan_globals.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clan_helpers.dm" +#include "modular_darkpack\modules\kindred_species\code\vampire_clan\clan_mark_pref.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\banu_haqim.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\brujah.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\caitiff.dm" @@ -6919,8 +7170,6 @@ #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\gangrel.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\gargoyle.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\giovanni.dm" -#include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\lasombra.dm" -#include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\malkavian.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\nosferatu.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\old_clan_tzimisce.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\salubri.dm" @@ -6932,11 +7181,35 @@ #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\baali\baali.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\baali\holy_weakness.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\kiasyd\kiasyd.dm" +#include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\lasombra\creatures.dm" +#include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\lasombra\lasombra.dm" +#include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\malkavian\malkavian.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\tzimisce\crafting_recipes.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\tzimisce\creatures.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\tzimisce\needs_home_soil.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\tzimisce\objects.dm" #include "modular_darkpack\modules\kindred_species\code\vampire_clan\clans\tzimisce\tzimisce.dm" +#include "modular_darkpack\modules\languages\code\languages\arabic.dm" +#include "modular_darkpack\modules\languages\code\languages\armenian.dm" +#include "modular_darkpack\modules\languages\code\languages\cantonese.dm" +#include "modular_darkpack\modules\languages\code\languages\english.dm" +#include "modular_darkpack\modules\languages\code\languages\farsi.dm" +#include "modular_darkpack\modules\languages\code\languages\french.dm" +#include "modular_darkpack\modules\languages\code\languages\garou_tongue.dm" +#include "modular_darkpack\modules\languages\code\languages\german.dm" +#include "modular_darkpack\modules\languages\code\languages\greek.dm" +#include "modular_darkpack\modules\languages\code\languages\hebrew.dm" +#include "modular_darkpack\modules\languages\code\languages\irish.dm" +#include "modular_darkpack\modules\languages\code\languages\italian.dm" +#include "modular_darkpack\modules\languages\code\languages\japanese.dm" +#include "modular_darkpack\modules\languages\code\languages\korean.dm" +#include "modular_darkpack\modules\languages\code\languages\latin.dm" +#include "modular_darkpack\modules\languages\code\languages\mandarin.dm" +#include "modular_darkpack\modules\languages\code\languages\russian.dm" +#include "modular_darkpack\modules\languages\code\languages\scottish.dm" +#include "modular_darkpack\modules\languages\code\languages\spanish.dm" +#include "modular_darkpack\modules\languages\code\languages\tagalog.dm" +#include "modular_darkpack\modules\languages\code\languages\welsh.dm" #include "modular_darkpack\modules\loadout\code\categories\glasses.dm" #include "modular_darkpack\modules\loadout\code\categories\hands.dm" #include "modular_darkpack\modules\loadout\code\categories\heads.dm" @@ -6945,6 +7218,11 @@ #include "modular_darkpack\modules\loadout\code\categories\shoes.dm" #include "modular_darkpack\modules\loadout\code\categories\suit.dm" #include "modular_darkpack\modules\loadout\code\categories\uniform.dm" +#include "modular_darkpack\modules\looc\code\keybinds.dm" +#include "modular_darkpack\modules\looc\code\looc_preference.dm" +#include "modular_darkpack\modules\looc\code\verbs.dm" +#include "modular_darkpack\modules\mannequin\code\mannequin_subtypes.dm" +#include "modular_darkpack\modules\mapping_helpers\code\viewport_helper.dm" #include "modular_darkpack\modules\masquerade\code\blood_hunt_skull.dm" #include "modular_darkpack\modules\masquerade\code\human.dm" #include "modular_darkpack\modules\masquerade\code\logging_machine.dm" @@ -6962,8 +7240,7 @@ #include "modular_darkpack\modules\masquerade\code\subsystem\masquerade.dm" #include "modular_darkpack\modules\matrix\code\job.dm" #include "modular_darkpack\modules\matrix\code\matrix.dm" -#include "modular_darkpack\modules\mobs\pets\cat.dm" -#include "modular_darkpack\modules\mobs\pets\dog.dm" +#include "modular_darkpack\modules\mob_spawners\code\citizen.dm" #include "modular_darkpack\modules\npc\code\human\__npc.dm" #include "modular_darkpack\modules\npc\code\human\npc_aggression.dm" #include "modular_darkpack\modules\npc\code\human\npc_globals.dm" @@ -6984,8 +7261,14 @@ #include "modular_darkpack\modules\npc\code\human\npc_types\shop.dm" #include "modular_darkpack\modules\npc\code\human\npc_types\stripper.dm" #include "modular_darkpack\modules\npc\code\human\npc_types\walkby.dm" +#include "modular_darkpack\modules\npc\code\human\npc_types\bouncers\__bouncer.dm" +#include "modular_darkpack\modules\npc\code\human\npc_types\bouncers\bouncer_elysium.dm" +#include "modular_darkpack\modules\npc\code\human\npc_types\bouncers\bouncer_endron.dm" +#include "modular_darkpack\modules\npc\code\human\npc_types\bouncers\bouncer_giovanni.dm" +#include "modular_darkpack\modules\npc\code\human\npc_types\endron\endron_npcs.dm" #include "modular_darkpack\modules\npc\code\human\socialroles\__socialrole.dm" #include "modular_darkpack\modules\npc\code\human\socialroles\bandit.dm" +#include "modular_darkpack\modules\npc\code\human\socialroles\endronsecurity.dm" #include "modular_darkpack\modules\npc\code\human\socialroles\guard.dm" #include "modular_darkpack\modules\npc\code\human\socialroles\police.dm" #include "modular_darkpack\modules\npc\code\human\socialroles\poorfemale.dm" @@ -7001,45 +7284,120 @@ #include "modular_darkpack\modules\npc\code\human\socialroles\shop\garden.dm" #include "modular_darkpack\modules\npc\code\human\socialroles\shop\gummaguts.dm" #include "modular_darkpack\modules\npc\code\human\socialroles\shop\illegal.dm" -#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\bat.dm" #include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\blood_guard.dm" +#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\necromancy_zombies.dm" #include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\shadow_guard.dm" +#include "modular_darkpack\modules\npc\code\nonhuman\friendly\bird.dm" +#include "modular_darkpack\modules\npc\code\nonhuman\friendly\bird_ai.dm" +#include "modular_darkpack\modules\npc\code\nonhuman\friendly\cat.dm" +#include "modular_darkpack\modules\npc\code\nonhuman\friendly\dog.dm" #include "modular_darkpack\modules\npc\code\nonhuman\friendly\rat.dm" +#include "modular_darkpack\modules\npc\code\nonhuman\friendly\spawners.dm" +#include "modular_darkpack\modules\npc\code\nonhuman\hostile\abyss_tentacle.dm" #include "modular_darkpack\modules\npc\code\nonhuman\hostile\baali_guard.dm" #include "modular_darkpack\modules\npc\code\nonhuman\hostile\bear.dm" #include "modular_darkpack\modules\npc\code\nonhuman\hostile\werewolf.dm" #include "modular_darkpack\modules\occult_artifacts\code\artifacts.dm" #include "modular_darkpack\modules\onfloor_icons\code\apply_onfloor_icon_element.dm" #include "modular_darkpack\modules\onfloor_icons\code\dynamic_item_icon.dm" -#include "modular_darkpack\modules\phones\code\phone_globals.dm" +#include "modular_darkpack\modules\paths\code\conjured_items.dm" +#include "modular_darkpack\modules\paths\code\occult_research.dm" +#include "modular_darkpack\modules\paths\code\path.dm" +#include "modular_darkpack\modules\paths\code\thaumaturgy_archives.dm" +#include "modular_darkpack\modules\paths\code\spellbooks\spellbooks.dm" +#include "modular_darkpack\modules\paths\code\spellbooks\thaumaturgy\levinbolt_spellbooks.dm" +#include "modular_darkpack\modules\paths\code\spellbooks\thaumaturgy\lure_of_flames_spellbooks.dm" +#include "modular_darkpack\modules\paths\code\spellbooks\thaumaturgy\research_spellbooks.dm" +#include "modular_darkpack\modules\phones\code\_phone.dm" +#include "modular_darkpack\modules\phones\code\phone_book.dm" +#include "modular_darkpack\modules\phones\code\phone_contact.dm" +#include "modular_darkpack\modules\phones\code\phone_history.dm" +#include "modular_darkpack\modules\phones\code\phone_procs.dm" +#include "modular_darkpack\modules\phones\code\phone_subsystem.dm" +#include "modular_darkpack\modules\phones\code\phone_subtypes.dm" +#include "modular_darkpack\modules\phones\code\sim_card.dm" +#include "modular_darkpack\modules\phones\code\stationary_subtypes.dm" +#include "modular_darkpack\modules\piano\code\stationary_pianos.dm" +#include "modular_darkpack\modules\pixel_shift\code\pixel_shift_component.dm" +#include "modular_darkpack\modules\pixel_shift\code\pixel_shift_keybind.dm" +#include "modular_darkpack\modules\postal\code\postal.dm" #include "modular_darkpack\modules\powers\code\discipline_actions.dm" #include "modular_darkpack\modules\powers\code\discipline_gain.dm" -#include "modular_darkpack\modules\powers\code\human.dm" #include "modular_darkpack\modules\powers\code\discipline\__discipline.dm" #include "modular_darkpack\modules\powers\code\discipline\__discipline_power.dm" +#include "modular_darkpack\modules\powers\code\discipline\animalism.dm" +#include "modular_darkpack\modules\powers\code\discipline\dementation.dm" +#include "modular_darkpack\modules\powers\code\discipline\necromancy.dm" +#include "modular_darkpack\modules\powers\code\discipline\obtenebration.dm" #include "modular_darkpack\modules\powers\code\discipline\torpor.dm" +#include "modular_darkpack\modules\powers\code\discipline\auspex\aura_component.dm" +#include "modular_darkpack\modules\powers\code\discipline\auspex\auspex.dm" +#include "modular_darkpack\modules\powers\code\discipline\auspex\emotion_panel.dm" +#include "modular_darkpack\modules\powers\code\discipline\auspex\heartbeat_sensing_component.dm" +#include "modular_darkpack\modules\powers\code\discipline\auspex\avatar\avatar.dm" +#include "modular_darkpack\modules\powers\code\discipline\auspex\avatar\avatar_hud.dm" +#include "modular_darkpack\modules\powers\code\discipline\auspex\avatar\avatar_verbs.dm" +#include "modular_darkpack\modules\powers\code\discipline\auspex\avatar\mob_procs.dm" #include "modular_darkpack\modules\powers\code\discipline\bloodheal\bloodheal.dm" #include "modular_darkpack\modules\powers\code\discipline\celerity\afterimage.dm" #include "modular_darkpack\modules\powers\code\discipline\celerity\celerity.dm" #include "modular_darkpack\modules\powers\code\discipline\celerity\celerity_movespeed_modifier.dm" #include "modular_darkpack\modules\powers\code\discipline\celerity\celerity_status_effect.dm" +#include "modular_darkpack\modules\powers\code\discipline\dominate\dominate.dm" +#include "modular_darkpack\modules\powers\code\discipline\dominate\possession\possession_datums.dm" +#include "modular_darkpack\modules\powers\code\discipline\dominate\status_effects\conditioning_status_effect.dm" +#include "modular_darkpack\modules\powers\code\discipline\dominate\status_effects\mesmerize_status_effect.dm" #include "modular_darkpack\modules\powers\code\discipline\fortitude\fortitude.dm" #include "modular_darkpack\modules\powers\code\discipline\fortitude\fortitude_status_effect.dm" +#include "modular_darkpack\modules\powers\code\discipline\obfuscate\obfuscate.dm" +#include "modular_darkpack\modules\powers\code\discipline\obfuscate\obfuscate_helpers.dm" #include "modular_darkpack\modules\powers\code\discipline\potence\potence.dm" #include "modular_darkpack\modules\powers\code\discipline\potence\potence_status_effect.dm" +#include "modular_darkpack\modules\powers\code\discipline\presence\presence.dm" +#include "modular_darkpack\modules\powers\code\discipline\presence\status_effects\awe_status_effect.dm" +#include "modular_darkpack\modules\powers\code\discipline\presence\status_effects\entrancement_status_effect.dm" +#include "modular_darkpack\modules\powers\code\discipline\protean\beast_form.dm" +#include "modular_darkpack\modules\powers\code\discipline\protean\claws.dm" +#include "modular_darkpack\modules\powers\code\discipline\protean\dirt_pile.dm" +#include "modular_darkpack\modules\powers\code\discipline\protean\mist_form.dm" +#include "modular_darkpack\modules\powers\code\discipline\protean\protean.dm" +#include "modular_darkpack\modules\powers\code\discipline\quietus\quietus.dm" +#include "modular_darkpack\modules\powers\code\discipline\quietus\components\baals_caress.dm" +#include "modular_darkpack\modules\powers\code\discipline\quietus\components\scorptions_touch.dm" +#include "modular_darkpack\modules\powers\code\discipline\quietus\fields\silence_of_death_aoe.dm" +#include "modular_darkpack\modules\powers\code\discipline\temporis\temporis.dm" +#include "modular_darkpack\modules\powers\code\discipline\temporis\temporis_effects.dm" +#include "modular_darkpack\modules\powers\code\discipline\thaumaturgy\path_of_blood.dm" +#include "modular_darkpack\modules\powers\code\discipline\thaumaturgy\paths\levinbolt.dm" +#include "modular_darkpack\modules\powers\code\discipline\thaumaturgy\paths\lure_of_flames.dm" +#include "modular_darkpack\modules\powers\code\discipline\thaumaturgy\status_effects\blood_of_potency_effect.dm" +#include "modular_darkpack\modules\powers\code\discipline\thaumaturgy\status_effects\blood_rage_status.dm" +#include "modular_darkpack\modules\powers\code\discipline\vicissitude\fleshwalls.dm" #include "modular_darkpack\modules\powers\code\discipline\vicissitude\human_flesh.dm" -#include "modular_darkpack\modules\radios\code\radio_globals.dm" -#include "modular_darkpack\modules\respawning\code\respawning_globals.dm" +#include "modular_darkpack\modules\quirks\code\negative_quirks\derangement.dm" +#include "modular_darkpack\modules\radios\code\admin_verb.dm" +#include "modular_darkpack\modules\radios\code\radio.dm" +#include "modular_darkpack\modules\radios\code\transceiver.dm" +#include "modular_darkpack\modules\radios\code\tcomms_subtypes\anarch.dm" +#include "modular_darkpack\modules\radios\code\tcomms_subtypes\camarilla.dm" +#include "modular_darkpack\modules\radios\code\tcomms_subtypes\clinic.dm" +#include "modular_darkpack\modules\radios\code\tcomms_subtypes\endron.dm" +#include "modular_darkpack\modules\radios\code\tcomms_subtypes\global.dm" +#include "modular_darkpack\modules\radios\code\tcomms_subtypes\military.dm" +#include "modular_darkpack\modules\radios\code\tcomms_subtypes\police.dm" #include "modular_darkpack\modules\retail\code\_retail.dm" #include "modular_darkpack\modules\retail\code\vending_product.dm" +#include "modular_darkpack\modules\retail\code\stores\antique_store.dm" #include "modular_darkpack\modules\retail\code\stores\bacotell_menu.dm" #include "modular_darkpack\modules\retail\code\stores\black_market.dm" #include "modular_darkpack\modules\retail\code\stores\bubway_menu.dm" +#include "modular_darkpack\modules\retail\code\stores\camping_store.dm" #include "modular_darkpack\modules\retail\code\stores\clothing_store.dm" #include "modular_darkpack\modules\retail\code\stores\coffee_shop.dm" #include "modular_darkpack\modules\retail\code\stores\costume_store.dm" #include "modular_darkpack\modules\retail\code\stores\flower_shop.dm" #include "modular_darkpack\modules\retail\code\stores\gas_station.dm" +#include "modular_darkpack\modules\retail\code\stores\general_store.dm" #include "modular_darkpack\modules\retail\code\stores\grocery_store.dm" #include "modular_darkpack\modules\retail\code\stores\gummaguts_menu.dm" #include "modular_darkpack\modules\retail\code\stores\gun_store.dm" @@ -7047,30 +7405,112 @@ #include "modular_darkpack\modules\retail\code\stores\hot_ishu.dm" #include "modular_darkpack\modules\retail\code\stores\junkfood_menu.dm" #include "modular_darkpack\modules\retail\code\stores\library.dm" +#include "modular_darkpack\modules\retail\code\stores\music_store.dm" #include "modular_darkpack\modules\retail\code\stores\pharmacy.dm" +#include "modular_darkpack\modules\retail\code\stores\skate_shop.dm" #include "modular_darkpack\modules\retail\code\stores\smoke_menu.dm" +#include "modular_darkpack\modules\ritual_abyss_mysticism\code\abyss_rune_drawing_action.dm" +#include "modular_darkpack\modules\ritual_abyss_mysticism\code\abyss_tome.dm" +#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\__abyssrune.dm" +#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\artifact_identification.dm" +#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\blackout.dm" +#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\comforting_darkness.dm" +#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\reflections_of_hollow_revelation.dm" +#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\self_destruction.dm" +#include "modular_darkpack\modules\ritual_abyss_mysticism\code\rituals\shadow_guardian.dm" +#include "modular_darkpack\modules\ritual_abyss_mysticism\code\status_effects\blood_debt.dm" +#include "modular_darkpack\modules\ritual_necromancy\code\necromancy_rune_drawing_action.dm" +#include "modular_darkpack\modules\ritual_necromancy\code\necromancy_tome.dm" +#include "modular_darkpack\modules\ritual_necromancy\code\rituals\__necrorune.dm" +#include "modular_darkpack\modules\ritual_necromancy\code\rituals\callthehungrydead.dm" +#include "modular_darkpack\modules\ritual_necromancy\code\rituals\death.dm" +#include "modular_darkpack\modules\ritual_necromancy\code\rituals\fireprotection.dm" +#include "modular_darkpack\modules\ritual_necromancy\code\rituals\insight.dm" +#include "modular_darkpack\modules\ritual_necromancy\code\rituals\locate.dm" +#include "modular_darkpack\modules\ritual_necromancy\code\rituals\truth.dm" +#include "modular_darkpack\modules\ritual_necromancy\code\rituals\zombie.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\arcane_tome.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\thaumaturgy_rune_drawing_action.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\__thaumaturgyrune.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\artifact_identification.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\blood_curse_rune.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\blood_guardian_ritual.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\blood_to_water.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\blood_trap.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\blood_wall.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\bloodwalk.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\chime_of_the_unseen_spirits.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\deflection_wooden_doom.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\gargoyle_transformation.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\question_to_the_ancestors.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\self_gib.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\teleport.dm" +#include "modular_darkpack\modules\round_status\code\admin_verb.dm" +#include "modular_darkpack\modules\round_status\code\pref_code.dm" #include "modular_darkpack\modules\round_status\code\round_globals.dm" +#include "modular_darkpack\modules\sabbat\code\sabbat_blood_bath.dm" +#include "modular_darkpack\modules\sabbat\code\sabbat_monomacy_rune.dm" +#include "modular_darkpack\modules\sabbat\code\sabbat_war_party.dm" +#include "modular_darkpack\modules\sabbat\code\vaulderie_goblet.dm" +#include "modular_darkpack\modules\splats\code\__splat.dm" +#include "modular_darkpack\modules\splats\code\gaining_splats.dm" +#include "modular_darkpack\modules\splats\code\is_splat_helpers.dm" +#include "modular_darkpack\modules\splats\code\losing_splats.dm" +#include "modular_darkpack\modules\splats\code\splat_management.dm" +#include "modular_darkpack\modules\splats\code\st_power_management.dm" +#include "modular_darkpack\modules\stock_market\code\stockexchange.dm" #include "modular_darkpack\modules\storage\code\firstaidkit.dm" -#include "modular_darkpack\modules\storyteller_dice\code\roll_storyteller_dice.dm" +#include "modular_darkpack\modules\storyteller_dice\code\roll_subsystem.dm" #include "modular_darkpack\modules\storyteller_dice\code\rolling_pref.dm" #include "modular_darkpack\modules\storyteller_dice\code\verbs.dm" #include "modular_darkpack\modules\storyteller_stats\code\_st_stats.dm" -#include "modular_darkpack\modules\storyteller_stats\code\storyteller_stat_holder.dm" -#include "modular_darkpack\modules\storyteller_stats\code\living_procs\recalculate_max_health.dm" -#include "modular_darkpack\modules\storyteller_stats\code\living_procs\st_stat_wrappers.dm" -#include "modular_darkpack\modules\storyteller_stats\code\st_stats\_ability.dm" -#include "modular_darkpack\modules\storyteller_stats\code\st_stats\_attribute.dm" -#include "modular_darkpack\modules\storyteller_stats\code\st_stats\_pooled.dm" +#include "modular_darkpack\modules\storyteller_stats\code\global_procs.dm" +#include "modular_darkpack\modules\storyteller_stats\code\logging.dm" +#include "modular_darkpack\modules\storyteller_stats\code\stat_pref_middleware.dm" +#include "modular_darkpack\modules\storyteller_stats\code\mob_affecting_adjustments\mob_procs.dm" +#include "modular_darkpack\modules\storyteller_stats\code\mob_affecting_adjustments\movespeed_modifier.dm" +#include "modular_darkpack\modules\storyteller_stats\code\mob_affecting_adjustments\recalculate_max_health.dm" #include "modular_darkpack\modules\storyteller_stats\code\st_stats\default_abilities.dm" #include "modular_darkpack\modules\storyteller_stats\code\st_stats\default_attributes.dm" #include "modular_darkpack\modules\storyteller_stats\code\st_stats\default_pooled_stats.dm" +#include "modular_darkpack\modules\storyteller_stats\code\st_stats\default_virtues.dm" +#include "modular_darkpack\modules\storyteller_stats\code\st_stats\base_type\_ability.dm" +#include "modular_darkpack\modules\storyteller_stats\code\st_stats\base_type\_attribute.dm" +#include "modular_darkpack\modules\storyteller_stats\code\st_stats\base_type\_freebie.dm" +#include "modular_darkpack\modules\storyteller_stats\code\st_stats\base_type\_path.dm" +#include "modular_darkpack\modules\storyteller_stats\code\st_stats\base_type\_pooled.dm" +#include "modular_darkpack\modules\storyteller_stats\code\st_stats\base_type\_virtue.dm" +#include "modular_darkpack\modules\strings\global_strings.dm" +#include "modular_darkpack\modules\taser\code\taser.dm" #include "modular_darkpack\modules\toys\code\pigs.dm" #include "modular_darkpack\modules\toys\code\plushes.dm" #include "modular_darkpack\modules\umbra\code\minesweeper.dm" #include "modular_darkpack\modules\umbra\code\umbra.dm" #include "modular_darkpack\modules\umbra\code\umbra_globals.dm" +#include "modular_darkpack\modules\unit_tests\_darkpack_unit_tests.dm" #include "modular_darkpack\modules\vampire_the_masquerade\code\blood_power.dm" #include "modular_darkpack\modules\vampire_the_masquerade\code\kindred\humanity.dm" +#include "modular_darkpack\modules\vampire_the_masquerade\code\splats\__vampire_splat.dm" +#include "modular_darkpack\modules\vampire_the_masquerade\code\splats\is_vampire_helpers.dm" +#include "modular_darkpack\modules\vampire_the_masquerade\code\splats\ghoul_splat\ghoul_splat.dm" +#include "modular_darkpack\modules\vampire_the_masquerade\code\splats\ghoul_splat\make_ghoul.dm" +#include "modular_darkpack\modules\vampire_the_masquerade\code\splats\kindred_splat\generation.dm" +#include "modular_darkpack\modules\vampire_the_masquerade\code\splats\kindred_splat\kindred_splat.dm" +#include "modular_darkpack\modules\vampire_the_masquerade\code\splats\kindred_splat\make_kindred.dm" +#include "modular_darkpack\modules\vaults\code\drill.dm" +#include "modular_darkpack\modules\vaults\code\keypad.dm" +#include "modular_darkpack\modules\vaults\code\vaultdoors.dm" +#include "modular_darkpack\modules\vip_areas\code\bouncer_barrier_subsystem.dm" +#include "modular_darkpack\modules\vip_areas\code\vip_barrier_perm.dm" +#include "modular_darkpack\modules\vip_areas\code\bouncer_roles\bouncer_elysium_role.dm" +#include "modular_darkpack\modules\vip_areas\code\bouncer_roles\bouncer_endron_role.dm" +#include "modular_darkpack\modules\vip_areas\code\bouncer_roles\bouncer_giovanni_role.dm" +#include "modular_darkpack\modules\vip_areas\code\bouncer_roles\bouncer_mob_role.dm" +#include "modular_darkpack\modules\vip_areas\code\vip_barriers\__vip_barrier.dm" +#include "modular_darkpack\modules\vip_areas\code\vip_barriers\elysium_barrier.dm" +#include "modular_darkpack\modules\vip_areas\code\vip_barriers\elysium_stripclub_barrier.dm" +#include "modular_darkpack\modules\vip_areas\code\vip_barriers\endron_barrier.dm" +#include "modular_darkpack\modules\vip_areas\code\vip_barriers\giovanni_barrier.dm" #include "modular_darkpack\modules\vitae\code\blood_bond.dm" #include "modular_darkpack\modules\vitae\code\blood_pack.dm" #include "modular_darkpack\modules\vitae\code\embracing.dm" @@ -7078,17 +7518,30 @@ #include "modular_darkpack\modules\vitae\code\status_effect_blood_bond.dm" #include "modular_darkpack\modules\vitae\code\vitae.dm" #include "modular_darkpack\modules\vitae\code\vitae_blood_type.dm" -#include "modular_darkpack\modules\walls\code\decals.dm" #include "modular_darkpack\modules\walls\code\floors.dm" +#include "modular_darkpack\modules\walls\code\lattice.dm" +#include "modular_darkpack\modules\walls\code\low_walls.dm" +#include "modular_darkpack\modules\walls\code\sewer.dm" #include "modular_darkpack\modules\walls\code\wallpaper.dm" #include "modular_darkpack\modules\walls\code\walls.dm" +#include "modular_darkpack\modules\walls\code\floors\carpets.dm" +#include "modular_darkpack\modules\walls\code\floors\tiles.dm" +#include "modular_darkpack\modules\walls\code\floors\water.dm" +#include "modular_darkpack\modules\walls\code\floors\wood.dm" #include "modular_darkpack\modules\weapons\code\ammostack.dm" #include "modular_darkpack\modules\weapons\code\crafting_recipes.dm" +#include "modular_darkpack\modules\weapons\code\flamethrower.dm" #include "modular_darkpack\modules\weapons\code\guns.dm" +#include "modular_darkpack\modules\weapons\code\hardcase.dm" #include "modular_darkpack\modules\weapons\code\melee.dm" +#include "modular_darkpack\modules\weapons\code\pliers.dm" #include "modular_darkpack\modules\weapons\code\sheath.dm" +#include "modular_darkpack\modules\weapons\code\stake.dm" +#include "modular_darkpack\modules\weather\code\effects.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\glyphs.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\totems.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\werewolf_globals.dm" +#include "modular_darkpack\modules\westfield_mall\code\mall_areas.dm" #include "modular_darkpack\modules\z_travel\code\manhole.dm" #include "modular_darkpack\modules\z_travel\code\transfer_point.dm" -#include "modular_zapoc\modules\carpets\code\carpets.dm" // END_INCLUDE diff --git a/tgui/bun.lock b/tgui/bun.lock index acef62558fdd..aa3602085802 100644 --- a/tgui/bun.lock +++ b/tgui/bun.lock @@ -1,20 +1,21 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "tgui-workspace", "devDependencies": { - "@happy-dom/global-registrator": "^17.4.7", - "@rspack/cli": "^1.4.5", - "@rspack/core": "^1.4.5", + "@happy-dom/global-registrator": "^20.0.11", + "@rspack/cli": "^1.6.8", + "@rspack/core": "^1.6.8", "@types/bun": "^1.2.14", "@types/react": "^19.1.5", "@types/react-dom": "^19.1.5", "@types/webpack-env": "^1.18.8", "@types/wicg-file-system-access": "^2023.10.6", "css-loader": "^7.1.2", - "sass-embedded": "^1.89.2", - "sass-loader": "^16.0.5", + "sass-embedded": "^1.97.1", + "sass-loader": "^16.0.6", "typescript": "^5.8.3", }, }, @@ -22,7 +23,8 @@ "name": "common", "version": "4.3.1", "dependencies": { - "es-toolkit": "^1.39.3", + "es-toolkit": "^1.43.0", + "zod": "^4.2.0", }, }, "packages/tgfont": { @@ -40,16 +42,17 @@ "common": "workspace:*", "dateformat": "^5.0.3", "dompurify": "^3.2.5", - "es-toolkit": "^1.39.3", + "es-toolkit": "^1.43.0", "highlight.js": "^11.11.1", - "jotai": "^2.12.4", + "jotai": "^2.16.0", "js-yaml": "^4.1.0", "marked": "^15.0.11", "marked-base-url": "^1.1.6", "marked-smartypants": "^1.1.9", "react": "^19.1.0", "react-dom": "^19.1.0", - "tgui-core": "^5.3.1", + "react-json-tree": "^0.20.0", + "tgui-core": "^5.6.0", "tgui-dev-server": "workspace:*", }, }, @@ -68,12 +71,14 @@ "dependencies": { "common": "workspace:*", "dompurify": "^3.2.5", - "es-toolkit": "^1.39.3", + "es-toolkit": "^1.43.0", + "jotai": "^2.16.0", "react": "^19.1.0", "react-dom": "^19.1.0", "tgui": "workspace:*", - "tgui-core": "^5.3.1", + "tgui-core": "^5.6.0", "tgui-dev-server": "workspace:*", + "zod": "^4.2.1", }, }, "packages/tgui-say": { @@ -84,7 +89,7 @@ "react": "^19.1.0", "react-dom": "^19.1.0", "tgui": "workspace:*", - "tgui-core": "^5.3.1", + "tgui-core": "^5.6.0", }, }, "packages/tgui-setup": { @@ -101,11 +106,11 @@ "@discoveryjs/json-ext": ["@discoveryjs/json-ext@0.5.7", "", {}, "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw=="], - "@emnapi/core": ["@emnapi/core@1.4.4", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.3", "tslib": "^2.4.0" } }, "sha512-A9CnAbC6ARNMKcIcrQwq6HeHCjpcBZ5wSx4U01WXCqEKlrzB9F9315WDNHkrs2xbx7YjjSxbUYxuN6EQzpcY2g=="], + "@emnapi/core": ["@emnapi/core@1.7.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg=="], - "@emnapi/runtime": ["@emnapi/runtime@1.4.4", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg=="], + "@emnapi/runtime": ["@emnapi/runtime@1.7.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="], - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], "@floating-ui/core": ["@floating-ui/core@1.7.3", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="], @@ -117,7 +122,7 @@ "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], - "@happy-dom/global-registrator": ["@happy-dom/global-registrator@17.6.3", "", { "dependencies": { "happy-dom": "^17.6.3" } }, "sha512-SE8Mu6bdkgKENemVg20yMrKdYeAvVesQrLPVfNBKnhicCM3ylHV9oIDzDMxSFj3qYCrHrIWOZsItOXSafrM4Tw=="], + "@happy-dom/global-registrator": ["@happy-dom/global-registrator@20.0.11", "", { "dependencies": { "@types/node": "^20.0.0", "happy-dom": "^20.0.11" } }, "sha512-GqNqiShBT/lzkHTMC/slKBrvN0DsD4Di8ssBk4aDaVgEn+2WMzE6DXxq701ndSXj7/0cJ8mNT71pM7Bnrr6JRw=="], "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="], @@ -143,19 +148,19 @@ "@leichtgewicht/ip-codec": ["@leichtgewicht/ip-codec@2.0.5", "", {}, "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw=="], - "@module-federation/error-codes": ["@module-federation/error-codes@0.15.0", "", {}, "sha512-CFJSF+XKwTcy0PFZ2l/fSUpR4z247+Uwzp1sXVkdIfJ/ATsnqf0Q01f51qqSEA6MYdQi6FKos9FIcu3dCpQNdg=="], + "@module-federation/error-codes": ["@module-federation/error-codes@0.21.6", "", {}, "sha512-MLJUCQ05KnoVl8xd6xs9a5g2/8U+eWmVxg7xiBMeR0+7OjdWUbHwcwgVFatRIwSZvFgKHfWEiI7wsU1q1XbTRQ=="], - "@module-federation/runtime": ["@module-federation/runtime@0.15.0", "", { "dependencies": { "@module-federation/error-codes": "0.15.0", "@module-federation/runtime-core": "0.15.0", "@module-federation/sdk": "0.15.0" } }, "sha512-dTPsCNum9Bhu3yPOcrPYq0YnM9eCMMMNB1wuiqf1+sFbQlNApF0vfZxooqz3ln0/MpgE0jerVvFsLVGfqvC9Ug=="], + "@module-federation/runtime": ["@module-federation/runtime@0.21.6", "", { "dependencies": { "@module-federation/error-codes": "0.21.6", "@module-federation/runtime-core": "0.21.6", "@module-federation/sdk": "0.21.6" } }, "sha512-+caXwaQqwTNh+CQqyb4mZmXq7iEemRDrTZQGD+zyeH454JAYnJ3s/3oDFizdH6245pk+NiqDyOOkHzzFQorKhQ=="], - "@module-federation/runtime-core": ["@module-federation/runtime-core@0.15.0", "", { "dependencies": { "@module-federation/error-codes": "0.15.0", "@module-federation/sdk": "0.15.0" } }, "sha512-RYzI61fRDrhyhaEOXH3AgIGlHiot0wPFXu7F43cr+ZnTi+VlSYWLdlZ4NBuT9uV6JSmH54/c+tEZm5SXgKR2sQ=="], + "@module-federation/runtime-core": ["@module-federation/runtime-core@0.21.6", "", { "dependencies": { "@module-federation/error-codes": "0.21.6", "@module-federation/sdk": "0.21.6" } }, "sha512-5Hd1Y5qp5lU/aTiK66lidMlM/4ji2gr3EXAtJdreJzkY+bKcI5+21GRcliZ4RAkICmvdxQU5PHPL71XmNc7Lsw=="], - "@module-federation/runtime-tools": ["@module-federation/runtime-tools@0.15.0", "", { "dependencies": { "@module-federation/runtime": "0.15.0", "@module-federation/webpack-bundler-runtime": "0.15.0" } }, "sha512-kzFn3ObUeBp5vaEtN1WMxhTYBuYEErxugu1RzFUERD21X3BZ+b4cWwdFJuBDlsmVjctIg/QSOoZoPXRKAO0foA=="], + "@module-federation/runtime-tools": ["@module-federation/runtime-tools@0.21.6", "", { "dependencies": { "@module-federation/runtime": "0.21.6", "@module-federation/webpack-bundler-runtime": "0.21.6" } }, "sha512-fnP+ZOZTFeBGiTAnxve+axGmiYn2D60h86nUISXjXClK3LUY1krUfPgf6MaD4YDJ4i51OGXZWPekeMe16pkd8Q=="], - "@module-federation/sdk": ["@module-federation/sdk@0.15.0", "", {}, "sha512-PWiYbGcJrKUD6JZiEPihrXhV3bgXdll4bV7rU+opV7tHaun+Z0CdcawjZ82Xnpb8MCPGmqHwa1MPFeUs66zksw=="], + "@module-federation/sdk": ["@module-federation/sdk@0.21.6", "", {}, "sha512-x6hARETb8iqHVhEsQBysuWpznNZViUh84qV2yE7AD+g7uIzHKiYdoWqj10posbo5XKf/147qgWDzKZoKoEP2dw=="], - "@module-federation/webpack-bundler-runtime": ["@module-federation/webpack-bundler-runtime@0.15.0", "", { "dependencies": { "@module-federation/runtime": "0.15.0", "@module-federation/sdk": "0.15.0" } }, "sha512-i+3wu2Ljh2TmuUpsnjwZVupOVqV50jP0ndA8PSP4gwMKlgdGeaZ4VH5KkHAXGr2eiYUxYLMrJXz1+eILJqeGDg=="], + "@module-federation/webpack-bundler-runtime": ["@module-federation/webpack-bundler-runtime@0.21.6", "", { "dependencies": { "@module-federation/runtime": "0.21.6", "@module-federation/sdk": "0.21.6" } }, "sha512-7zIp3LrcWbhGuFDTUMLJ2FJvcwjlddqhWGxi/MW3ur1a+HaO8v5tF2nl+vElKmbG1DFLU/52l3PElVcWf/YcsQ=="], - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" } }, "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.7", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@tybys/wasm-util": "^0.10.1" } }, "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw=="], "@nozbe/microfuzz": ["@nozbe/microfuzz@1.0.0", "", {}, "sha512-XKIg/guk+s1tkPTkHch9hfGOWgsKojT7BqSQddXTppOfVr3SWQhhTCqbgQaPTbppf9gc2kFeG0gpBZZ612UXHA=="], @@ -163,43 +168,71 @@ "@npmcli/fs": ["@npmcli/fs@3.1.1", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg=="], + "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], + + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="], + + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw=="], + + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg=="], + + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ=="], + + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA=="], + + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q=="], + + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w=="], + + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg=="], + + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A=="], + + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg=="], + + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw=="], + + "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ=="], + + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="], + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], - "@rspack/binding": ["@rspack/binding@1.4.5", "", { "optionalDependencies": { "@rspack/binding-darwin-arm64": "1.4.5", "@rspack/binding-darwin-x64": "1.4.5", "@rspack/binding-linux-arm64-gnu": "1.4.5", "@rspack/binding-linux-arm64-musl": "1.4.5", "@rspack/binding-linux-x64-gnu": "1.4.5", "@rspack/binding-linux-x64-musl": "1.4.5", "@rspack/binding-wasm32-wasi": "1.4.5", "@rspack/binding-win32-arm64-msvc": "1.4.5", "@rspack/binding-win32-ia32-msvc": "1.4.5", "@rspack/binding-win32-x64-msvc": "1.4.5" } }, "sha512-hO7DrZMMOyzwK7EEYfHMJmWhsNjeYLr39pEnXOWeuCCcwus6e/QNSSf2m/2mSFf0JeINwQqHkA1JvJEZ5JSj6g=="], + "@rspack/binding": ["@rspack/binding@1.6.8", "", { "optionalDependencies": { "@rspack/binding-darwin-arm64": "1.6.8", "@rspack/binding-darwin-x64": "1.6.8", "@rspack/binding-linux-arm64-gnu": "1.6.8", "@rspack/binding-linux-arm64-musl": "1.6.8", "@rspack/binding-linux-x64-gnu": "1.6.8", "@rspack/binding-linux-x64-musl": "1.6.8", "@rspack/binding-wasm32-wasi": "1.6.8", "@rspack/binding-win32-arm64-msvc": "1.6.8", "@rspack/binding-win32-ia32-msvc": "1.6.8", "@rspack/binding-win32-x64-msvc": "1.6.8" } }, "sha512-lUeL4mbwGo+nqRKqFDCm9vH2jv9FNMVt1X8jqayWRcOCPlj/2UVMEFgqjR7Pp2vlvnTKq//31KbDBJmDZq31RQ=="], - "@rspack/binding-darwin-arm64": ["@rspack/binding-darwin-arm64@1.4.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-rK8mJ+85cXrGSTZvr5vqI17TDimAUWYjl0T+JEg5MTqRNbpyovbGHbrrsQyIicwaFOS1wWkaLrBolC/+/FLUeg=="], + "@rspack/binding-darwin-arm64": ["@rspack/binding-darwin-arm64@1.6.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-e8CTQtzaeGnf+BIzR7wRMUwKfIg0jd/sxMRc1Vd0bCMHBhSN9EsGoMuJJaKeRrSmy2nwMCNWHIG+TvT1CEKg+A=="], - "@rspack/binding-darwin-x64": ["@rspack/binding-darwin-x64@1.4.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-6eOhh18VD8x5+SJrs/K6XiDw+FYffzDMsI3Sz78mQW5xvHYzN3HJxIw7oG7UYXqF5I2yORmqvdxV1aAnv8Fc4g=="], + "@rspack/binding-darwin-x64": ["@rspack/binding-darwin-x64@1.6.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-ku1XpTEPt6Za11zhpFWhfwrTQogcgi9RJrOUVC4FESiPO9aKyd4hJ+JiPgLY0MZOqsptK6vEAgOip+uDVXrCpg=="], - "@rspack/binding-linux-arm64-gnu": ["@rspack/binding-linux-arm64-gnu@1.4.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-vnz5OItcPREgz+hVqx14HRf0aJQ7yI/2ZEbeTC+Y1JSCbeYAcu6NXYVXDwTOgCNOp1AdMR+rmItHWiJ7goI//Q=="], + "@rspack/binding-linux-arm64-gnu": ["@rspack/binding-linux-arm64-gnu@1.6.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-fvZX6xZPvBT8qipSpvkKMX5M7yd2BSpZNCZXcefw6gA3uC7LI3gu+er0LrDXY1PtPzVuHTyDx+abwWpagV3PiQ=="], - "@rspack/binding-linux-arm64-musl": ["@rspack/binding-linux-arm64-musl@1.4.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-E4dUEDpAsQ5jTvt8AXs0VY3vxTzSf07CM5zi797VaFzZzbcZqAoBmlAxYTSyl7/BgAxHSg8AYJS5c8l03vXM4w=="], + "@rspack/binding-linux-arm64-musl": ["@rspack/binding-linux-arm64-musl@1.6.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-++XMKcMNrt59HcFBLnRaJcn70k3X0GwkAegZBVpel8xYIAgvoXT5+L8P1ExId/yTFxqedaz8DbcxQnNmMozviw=="], - "@rspack/binding-linux-x64-gnu": ["@rspack/binding-linux-x64-gnu@1.4.5", "", { "os": "linux", "cpu": "x64" }, "sha512-XQxibZY+joqRfoJQwT1sfN68pRExOvJniWBUJfov6ShG/DFSVbMJ2UTwv5pbruIXA/lLnk7KblPdF8pO0WWQvw=="], + "@rspack/binding-linux-x64-gnu": ["@rspack/binding-linux-x64-gnu@1.6.8", "", { "os": "linux", "cpu": "x64" }, "sha512-tv3BWkTE1TndfX+DsE1rSTg8fBevCxujNZ3MlfZ22Wfy9x1FMXTJlWG8VIOXmaaJ1wUHzv8S7cE2YUUJ2LuiCg=="], - "@rspack/binding-linux-x64-musl": ["@rspack/binding-linux-x64-musl@1.4.5", "", { "os": "linux", "cpu": "x64" }, "sha512-bOZmkCZamOz/+D3AA3uHII3rLIx4WtPk+KbDe3nfIVHhgxUK1nmv0vHtKzDA5iplucJ4ha/Rx9TEFyRwnBJH0A=="], + "@rspack/binding-linux-x64-musl": ["@rspack/binding-linux-x64-musl@1.6.8", "", { "os": "linux", "cpu": "x64" }, "sha512-DCGgZ5/in1O3FjHWqXnDsncRy+48cMhfuUAAUyl0yDj1NpsZu9pP+xfGLvGcQTiYrVl7IH9Aojf1eShP/77WGA=="], - "@rspack/binding-wasm32-wasi": ["@rspack/binding-wasm32-wasi@1.4.5", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-LRyln0jg2FblwFQg+0lPVc/bvDeo3A3EVWQtsTtOwjb4cjAG/Zqo5Q0VobaJTKgBOF9eAHTo9IL92SSj433+Eg=="], + "@rspack/binding-wasm32-wasi": ["@rspack/binding-wasm32-wasi@1.6.8", "", { "dependencies": { "@napi-rs/wasm-runtime": "1.0.7" }, "cpu": "none" }, "sha512-VUwdhl/lI4m6o1OGCZ9JwtMjTV/yLY5VZTQdEPKb40JMTlmZ5MBlr5xk7ByaXXYHr6I+qnqEm73iMKQvg6iknw=="], - "@rspack/binding-win32-arm64-msvc": ["@rspack/binding-win32-arm64-msvc@1.4.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-JWc15Mof/aC41UQSZLwa6oEsPYaYCApW0152Abhnt27qir2pfqYcT5qWt26OJvFDJoe+KzpIG1H91yJviChYYw=="], + "@rspack/binding-win32-arm64-msvc": ["@rspack/binding-win32-arm64-msvc@1.6.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-23YX7zlOZlub+nPGDBUzktb4D5D6ETUAluKjXEeHIZ9m7fSlEYBnGL66YE+3t1DHXGd0OqsdwlvrNGcyo6EXDQ=="], - "@rspack/binding-win32-ia32-msvc": ["@rspack/binding-win32-ia32-msvc@1.4.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-PpyNunP8zC5AQtF3Pww7F41bwoJwmGzdJuv2lk/3l74UhjhT4Ac4/dmEaKiYeOr69PPlCtn7Des9VEFufYAZAQ=="], + "@rspack/binding-win32-ia32-msvc": ["@rspack/binding-win32-ia32-msvc@1.6.8", "", { "os": "win32", "cpu": "ia32" }, "sha512-cFgRE3APxrY4AEdooVk2LtipwNNT/9mrnjdC5lVbsIsz+SxvGbZR231bxDJEqP15+RJOaD07FO1sIjINFqXMEg=="], - "@rspack/binding-win32-x64-msvc": ["@rspack/binding-win32-x64-msvc@1.4.5", "", { "os": "win32", "cpu": "x64" }, "sha512-elzpVGJW0W9DTkfJ7JyvMyi2Rbot5Q6rVBBKSh0lRWhZE/LnDJ/1WkS/9yER8XPGjO7umP1hD72ML1SoBddXmA=="], + "@rspack/binding-win32-x64-msvc": ["@rspack/binding-win32-x64-msvc@1.6.8", "", { "os": "win32", "cpu": "x64" }, "sha512-cIuhVsZYd3o3Neo1JSAhJYw6BDvlxaBoqvgwRkG1rs0ExFmEmgYyG7ip9pFKnKNWph/tmW3rDYypmEfjs1is7g=="], - "@rspack/cli": ["@rspack/cli@1.4.5", "", { "dependencies": { "@discoveryjs/json-ext": "^0.5.7", "@rspack/dev-server": "~1.1.3", "colorette": "2.0.20", "exit-hook": "^4.0.0", "interpret": "^3.1.1", "rechoir": "^0.8.0", "webpack-bundle-analyzer": "4.10.2", "yargs": "17.7.2" }, "peerDependencies": { "@rspack/core": "^1.0.0-alpha || ^1.x" }, "bin": { "rspack": "bin/rspack.js" } }, "sha512-Y1gbX31GiURBany7kBconpI37jXc/hxILL17rx0+IxlmNcXnw1i/HXVKF+YbUFaFDtmI5A8wcAPzhFwhguUR6Q=="], + "@rspack/cli": ["@rspack/cli@1.6.8", "", { "dependencies": { "@discoveryjs/json-ext": "^0.5.7", "@rspack/dev-server": "~1.1.4", "exit-hook": "^4.0.0", "webpack-bundle-analyzer": "4.10.2" }, "peerDependencies": { "@rspack/core": "^1.0.0-alpha || ^1.x" }, "bin": { "rspack": "bin/rspack.js" } }, "sha512-pFMYsov8Av7bNWEU9l0HCTk2A5vOPaaZBkZSkCs68U07tkMOQ58IvUiC5Uy1B780bqE2jBt/b6yA41uNmXScZg=="], - "@rspack/core": ["@rspack/core@1.4.5", "", { "dependencies": { "@module-federation/runtime-tools": "0.15.0", "@rspack/binding": "1.4.5", "@rspack/lite-tapable": "1.0.1" }, "peerDependencies": { "@swc/helpers": ">=0.5.1" }, "optionalPeers": ["@swc/helpers"] }, "sha512-4OlxGQ4yPbAOYbVStMotaYrydm8r5VbLByrmQ34LNBYIDSmwaBmHQVMYGIesuGW681pr139XwInKvsoAoW6VTA=="], + "@rspack/core": ["@rspack/core@1.6.8", "", { "dependencies": { "@module-federation/runtime-tools": "0.21.6", "@rspack/binding": "1.6.8", "@rspack/lite-tapable": "1.1.0" }, "peerDependencies": { "@swc/helpers": ">=0.5.1" }, "optionalPeers": ["@swc/helpers"] }, "sha512-FolcIAH5FW4J2FET+qwjd1kNeFbCkd0VLuIHO0thyolEjaPSxw5qxG67DA7BZGm6PVcoiSgPLks1DL6eZ8c+fA=="], - "@rspack/dev-server": ["@rspack/dev-server@1.1.3", "", { "dependencies": { "chokidar": "^3.6.0", "http-proxy-middleware": "^2.0.9", "p-retry": "^6.2.0", "webpack-dev-server": "5.2.2", "ws": "^8.18.0" }, "peerDependencies": { "@rspack/core": "*" } }, "sha512-jWPeyiZiGpbLYGhwHvwxhaa4rsr8CQvsWkWslqeMLb2uXwmyy3UWjUR1q+AhAPnf0gs3lZoFZ1hjBQVecHKUvg=="], + "@rspack/dev-server": ["@rspack/dev-server@1.1.4", "", { "dependencies": { "chokidar": "^3.6.0", "http-proxy-middleware": "^2.0.9", "p-retry": "^6.2.0", "webpack-dev-server": "5.2.2", "ws": "^8.18.0" }, "peerDependencies": { "@rspack/core": "*" } }, "sha512-kGHYX2jYf3ZiHwVl0aUEPBOBEIG1aWleCDCAi+Jg32KUu3qr/zDUpCEd0wPuHfLEgk0X0xAEYCS6JMO7nBStNQ=="], - "@rspack/lite-tapable": ["@rspack/lite-tapable@1.0.1", "", {}, "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w=="], + "@rspack/lite-tapable": ["@rspack/lite-tapable@1.1.0", "", {}, "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw=="], "@trysound/sax": ["@trysound/sax@0.2.0", "", {}, "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], "@types/body-parser": ["@types/body-parser@1.19.6", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="], @@ -221,9 +254,11 @@ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + "@types/lodash": ["@types/lodash@4.17.21", "", {}, "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ=="], + "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="], - "@types/node": ["@types/node@24.0.12", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g=="], + "@types/node": ["@types/node@20.19.27", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug=="], "@types/node-forge": ["@types/node-forge@1.3.12", "", { "dependencies": { "@types/node": "*" } }, "sha512-a0ToKlRVnUw3aXKQq2F+krxZKq7B8LEQijzPn5RdFAMatARD2JX9o8FBpMXOOrjob0uc13aN+V/AXniOXW4d9A=="], @@ -251,6 +286,8 @@ "@types/webpack-env": ["@types/webpack-env@1.18.8", "", {}, "sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A=="], + "@types/whatwg-mimetype": ["@types/whatwg-mimetype@3.0.2", "", {}, "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA=="], + "@types/wicg-file-system-access": ["@types/wicg-file-system-access@2023.10.6", "", {}, "sha512-YO/183gNRzZFSdKu+ikkD7ambAj4PhgjFAF2A/Mw/7wroSF6ne8r804RkpZzqrJ/F6DO2/IYlQF/ULOZ/bhKyA=="], "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], @@ -353,10 +390,14 @@ "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], "colorjs.io": ["colorjs.io@0.5.2", "", {}, "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw=="], @@ -425,6 +466,8 @@ "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], + "detect-node": ["detect-node@2.1.0", "", {}, "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="], "dns-packet": ["dns-packet@5.6.1", "", { "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" } }, "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw=="], @@ -469,7 +512,7 @@ "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], - "es-toolkit": ["es-toolkit@1.39.7", "", {}, "sha512-ek/wWryKouBrZIjkwW2BFf91CWOIMvoy2AE5YYgUrfWsJQM2Su1LoLtrw8uusEpN9RfqLlV/0FVNjT0WMv8Bxw=="], + "es-toolkit": ["es-toolkit@1.43.0", "", {}, "sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], @@ -545,7 +588,7 @@ "handle-thing": ["handle-thing@2.0.1", "", {}, "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="], - "happy-dom": ["happy-dom@17.6.3", "", { "dependencies": { "webidl-conversions": "^7.0.0", "whatwg-mimetype": "^3.0.0" } }, "sha512-UVIHeVhxmxedbWPCfgS55Jg2rDfwf2BCKeylcPSqazLz5w3Kri7Q4xdBJubsr/+VUzFLh0VjIvh13RaDA2/Xug=="], + "happy-dom": ["happy-dom@20.0.11", "", { "dependencies": { "@types/node": "^20.0.0", "@types/whatwg-mimetype": "^3.0.2", "whatwg-mimetype": "^3.0.0" } }, "sha512-QsCdAUHAmiDeKeaNojb1OHOPF7NjcWPBR7obdu3NwH2a/oyQaLg5d0aaCy/9My6CdPChYF07dvz5chaXBGaD4g=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -599,15 +642,13 @@ "ini": ["ini@5.0.0", "", {}, "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw=="], - "interpret": ["interpret@3.1.1", "", {}, "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ=="], - "ip-address": ["ip-address@9.0.5", "", { "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" } }, "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g=="], "ipaddr.js": ["ipaddr.js@2.2.0", "", {}, "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA=="], - "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + "is-arrayish": ["is-arrayish@0.3.4", "", {}, "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA=="], - "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], @@ -637,7 +678,7 @@ "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], - "jotai": ["jotai@2.12.5", "", { "peerDependencies": { "@types/react": ">=17.0.0", "react": ">=17.0.0" }, "optionalPeers": ["@types/react", "react"] }, "sha512-G8m32HW3lSmcz/4mbqx0hgJIQ0ekndKWiYP7kWVKi0p6saLXdSoye+FZiOFyonnd7Q482LCzm8sMDl7Ar1NWDw=="], + "jotai": ["jotai@2.16.0", "", { "peerDependencies": { "@babel/core": ">=7.0.0", "@babel/template": ">=7.0.0", "@types/react": ">=17.0.0", "react": ">=17.0.0" }, "optionalPeers": ["@babel/core", "@babel/template", "@types/react", "react"] }, "sha512-NmkwPBet0SHQ28GBfEb10sqnbVOYyn6DL4iazZgGRDUKxSWL0iqcm+IK4TqTSFC2ixGk+XX2e46Wbv364a3cKg=="], "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], @@ -655,6 +696,8 @@ "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + "lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], "lru-cache": ["lru-cache@11.1.0", "", {}, "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A=="], @@ -725,6 +768,8 @@ "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], + "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], + "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], @@ -777,8 +822,6 @@ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - "path-scurry": ["path-scurry@2.0.0", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg=="], "path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], @@ -821,22 +864,22 @@ "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="], + "react-base16-styling": ["react-base16-styling@0.10.0", "", { "dependencies": { "@types/lodash": "^4.17.0", "color": "^4.2.3", "csstype": "^3.1.3", "lodash-es": "^4.17.21" } }, "sha512-H1k2eFB6M45OaiRru3PBXkuCcn2qNmx+gzLb4a9IPMR7tMH8oBRXU5jGbPDYG1Hz+82d88ED0vjR8BmqU3pQdg=="], + "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="], + "react-json-tree": ["react-json-tree@0.20.0", "", { "dependencies": { "@types/lodash": "^4.17.15", "react-base16-styling": "^0.10.0" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-h+f9fUNAxzBx1rbrgUF7+zSWKGHDtt2VPYLErIuB0JyKGnWgFMM21ksqQyb3EXwXNnoMW2rdE5kuAaubgGOx2Q=="], + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - "rechoir": ["rechoir@0.8.0", "", { "dependencies": { "resolve": "^1.20.0" } }, "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ=="], - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], "requires-port": ["requires-port@1.0.0", "", {}, "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="], - "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], - "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], "run-applescript": ["run-applescript@7.0.0", "", {}, "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A=="], @@ -847,41 +890,47 @@ "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], - "sass-embedded": ["sass-embedded@1.89.2", "", { "dependencies": { "@bufbuild/protobuf": "^2.5.0", "buffer-builder": "^0.2.0", "colorjs.io": "^0.5.0", "immutable": "^5.0.2", "rxjs": "^7.4.0", "supports-color": "^8.1.1", "sync-child-process": "^1.0.2", "varint": "^6.0.0" }, "optionalDependencies": { "sass-embedded-android-arm": "1.89.2", "sass-embedded-android-arm64": "1.89.2", "sass-embedded-android-riscv64": "1.89.2", "sass-embedded-android-x64": "1.89.2", "sass-embedded-darwin-arm64": "1.89.2", "sass-embedded-darwin-x64": "1.89.2", "sass-embedded-linux-arm": "1.89.2", "sass-embedded-linux-arm64": "1.89.2", "sass-embedded-linux-musl-arm": "1.89.2", "sass-embedded-linux-musl-arm64": "1.89.2", "sass-embedded-linux-musl-riscv64": "1.89.2", "sass-embedded-linux-musl-x64": "1.89.2", "sass-embedded-linux-riscv64": "1.89.2", "sass-embedded-linux-x64": "1.89.2", "sass-embedded-win32-arm64": "1.89.2", "sass-embedded-win32-x64": "1.89.2" }, "bin": { "sass": "dist/bin/sass.js" } }, "sha512-Ack2K8rc57kCFcYlf3HXpZEJFNUX8xd8DILldksREmYXQkRHI879yy8q4mRDJgrojkySMZqmmmW1NxrFxMsYaA=="], + "sass": ["sass@1.97.1", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A=="], + + "sass-embedded": ["sass-embedded@1.97.1", "", { "dependencies": { "@bufbuild/protobuf": "^2.5.0", "buffer-builder": "^0.2.0", "colorjs.io": "^0.5.0", "immutable": "^5.0.2", "rxjs": "^7.4.0", "supports-color": "^8.1.1", "sync-child-process": "^1.0.2", "varint": "^6.0.0" }, "optionalDependencies": { "sass-embedded-all-unknown": "1.97.1", "sass-embedded-android-arm": "1.97.1", "sass-embedded-android-arm64": "1.97.1", "sass-embedded-android-riscv64": "1.97.1", "sass-embedded-android-x64": "1.97.1", "sass-embedded-darwin-arm64": "1.97.1", "sass-embedded-darwin-x64": "1.97.1", "sass-embedded-linux-arm": "1.97.1", "sass-embedded-linux-arm64": "1.97.1", "sass-embedded-linux-musl-arm": "1.97.1", "sass-embedded-linux-musl-arm64": "1.97.1", "sass-embedded-linux-musl-riscv64": "1.97.1", "sass-embedded-linux-musl-x64": "1.97.1", "sass-embedded-linux-riscv64": "1.97.1", "sass-embedded-linux-x64": "1.97.1", "sass-embedded-unknown-all": "1.97.1", "sass-embedded-win32-arm64": "1.97.1", "sass-embedded-win32-x64": "1.97.1" }, "bin": { "sass": "dist/bin/sass.js" } }, "sha512-wH3CbOThHYGX0bUyqFf7laLKyhVWIFc2lHynitkqMIUCtX2ixH9mQh0bN7+hkUu5BFt/SXvEMjFbkEbBMpQiSQ=="], + + "sass-embedded-all-unknown": ["sass-embedded-all-unknown@1.97.1", "", { "dependencies": { "sass": "1.97.1" }, "cpu": [ "!arm", "!x64", "!arm64", ] }, "sha512-0au5gUNibfob7W/g+ycBx74O22CL8vwHiZdEDY6J0uzMkHPiSJk//h0iRf5AUnMArFHJjFd3urIiQIaoRKYa1Q=="], + + "sass-embedded-android-arm": ["sass-embedded-android-arm@1.97.1", "", { "os": "android", "cpu": "arm" }, "sha512-B5dlv4utJ+yC8ZpBeWTHwSZPVKRlqA8pcaD0FAzeNm/DelIFgQUQtt0UwgYoAI6wDIiie5uSVpMK9l2DaCbiBQ=="], - "sass-embedded-android-arm": ["sass-embedded-android-arm@1.89.2", "", { "os": "android", "cpu": "arm" }, "sha512-oHAPTboBHRZlDBhyRB6dvDKh4KvFs+DZibDHXbkSI6dBZxMTT+Yb2ivocHnctVGucKTLQeT7+OM5DjWHyynL/A=="], + "sass-embedded-android-arm64": ["sass-embedded-android-arm64@1.97.1", "", { "os": "android", "cpu": "arm64" }, "sha512-h62DmOiS2Jn87s8+8GhJcMerJnTKa1IsIa9iIKjLiqbAvBDKCGUs027RugZkM+Zx7I+vhPq86PUXBYZ9EkRxdw=="], - "sass-embedded-android-arm64": ["sass-embedded-android-arm64@1.89.2", "", { "os": "android", "cpu": "arm64" }, "sha512-+pq7a7AUpItNyPu61sRlP6G2A8pSPpyazASb+8AK2pVlFayCSPAEgpwpCE9A2/Xj86xJZeMizzKUHxM2CBCUxA=="], + "sass-embedded-android-riscv64": ["sass-embedded-android-riscv64@1.97.1", "", { "os": "android", "cpu": "none" }, "sha512-tGup88vgaXPnUHEgDMujrt5rfYadvkiVjRb/45FJTx2hQFoGVbmUXz5XqUFjIIbEjQ3kAJqp86A2jy11s43UiQ=="], - "sass-embedded-android-riscv64": ["sass-embedded-android-riscv64@1.89.2", "", { "os": "android", "cpu": "none" }, "sha512-HfJJWp/S6XSYvlGAqNdakeEMPOdhBkj2s2lN6SHnON54rahKem+z9pUbCriUJfM65Z90lakdGuOfidY61R9TYg=="], + "sass-embedded-android-x64": ["sass-embedded-android-x64@1.97.1", "", { "os": "android", "cpu": "x64" }, "sha512-CAzKjjzu90LZduye2O9+UGX1oScMyF5/RVOa5CxACKALeIS+3XL3LVdV47kwKPoBv5B1aFUvGLscY0CR7jBAbg=="], - "sass-embedded-android-x64": ["sass-embedded-android-x64@1.89.2", "", { "os": "android", "cpu": "x64" }, "sha512-BGPzq53VH5z5HN8de6jfMqJjnRe1E6sfnCWFd4pK+CAiuM7iw5Fx6BQZu3ikfI1l2GY0y6pRXzsVLdp/j4EKEA=="], + "sass-embedded-darwin-arm64": ["sass-embedded-darwin-arm64@1.97.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-tyDzspzh5PbqdAFGtVKUXuf0up6Lff3c1U8J7+4Y7jW6AWRBnq95vTzIIxfnNifGCTI2fW5e7GAZpYygKpNwcw=="], - "sass-embedded-darwin-arm64": ["sass-embedded-darwin-arm64@1.89.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-UCm3RL/tzMpG7DsubARsvGUNXC5pgfQvP+RRFJo9XPIi6elopY5B6H4m9dRYDpHA+scjVthdiDwkPYr9+S/KGw=="], + "sass-embedded-darwin-x64": ["sass-embedded-darwin-x64@1.97.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-FMrRuSPI2ICt2M2SYaLbiG4yxn86D6ae+XtrRdrrBMhWprAcB7Iyu67bgRzZkipMZNIKKeTR7EUvJHgZzi5ixQ=="], - "sass-embedded-darwin-x64": ["sass-embedded-darwin-x64@1.89.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-D9WxtDY5VYtMApXRuhQK9VkPHB8R79NIIR6xxVlN2MIdEid/TZWi1MHNweieETXhWGrKhRKglwnHxxyKdJYMnA=="], + "sass-embedded-linux-arm": ["sass-embedded-linux-arm@1.97.1", "", { "os": "linux", "cpu": "arm" }, "sha512-48VxaTUApLyx1NXFdZhKqI/7FYLmz8Ju3Ki2V/p+mhn5raHgAiYeFgn8O1WGxTOh+hBb9y3FdSR5a8MNTbmKMQ=="], - "sass-embedded-linux-arm": ["sass-embedded-linux-arm@1.89.2", "", { "os": "linux", "cpu": "arm" }, "sha512-leP0t5U4r95dc90o8TCWfxNXwMAsQhpWxTkdtySDpngoqtTy3miMd7EYNYd1znI0FN1CBaUvbdCMbnbPwygDlA=="], + "sass-embedded-linux-arm64": ["sass-embedded-linux-arm64@1.97.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-im80gfDWRivw9Su3r3YaZmJaCATcJgu3CsCSLodPk1b1R2+X/E12zEQayvrl05EGT9PDwTtuiqKgS4ND4xjwVg=="], - "sass-embedded-linux-arm64": ["sass-embedded-linux-arm64@1.89.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-2N4WW5LLsbtrWUJ7iTpjvhajGIbmDR18ZzYRywHdMLpfdPApuHPMDF5CYzHbS+LLx2UAx7CFKBnj5LLjY6eFgQ=="], + "sass-embedded-linux-musl-arm": ["sass-embedded-linux-musl-arm@1.97.1", "", { "os": "linux", "cpu": "arm" }, "sha512-FUFs466t3PVViVOKY/60JgLLtl61Pf7OW+g5BeEfuqVcSvYUECVHeiYHtX1fT78PEVa0h9tHpM6XpWti+7WYFA=="], - "sass-embedded-linux-musl-arm": ["sass-embedded-linux-musl-arm@1.89.2", "", { "os": "linux", "cpu": "arm" }, "sha512-Z6gG2FiVEEdxYHRi2sS5VIYBmp17351bWtOCUZ/thBM66+e70yiN6Eyqjz80DjL8haRUegNQgy9ZJqsLAAmr9g=="], + "sass-embedded-linux-musl-arm64": ["sass-embedded-linux-musl-arm64@1.97.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-kD35WSD9o0279Ptwid3Jnbovo1FYnuG2mayYk9z4ZI4mweXEK6vTu+tlvCE/MdF/zFKSj11qaxaH+uzXe2cO5A=="], - "sass-embedded-linux-musl-arm64": ["sass-embedded-linux-musl-arm64@1.89.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-nTyuaBX6U1A/cG7WJh0pKD1gY8hbg1m2SnzsyoFG+exQ0lBX/lwTLHq3nyhF+0atv7YYhYKbmfz+sjPP8CZ9lw=="], + "sass-embedded-linux-musl-riscv64": ["sass-embedded-linux-musl-riscv64@1.97.1", "", { "os": "linux", "cpu": "none" }, "sha512-ZgpYps5YHuhA2+KiLkPukRbS5298QObgUhPll/gm5i0LOZleKCwrFELpVPcbhsSBuxqji2uaag5OL+n3JRBVVg=="], - "sass-embedded-linux-musl-riscv64": ["sass-embedded-linux-musl-riscv64@1.89.2", "", { "os": "linux", "cpu": "none" }, "sha512-N6oul+qALO0SwGY8JW7H/Vs0oZIMrRMBM4GqX3AjM/6y8JsJRxkAwnfd0fDyK+aICMFarDqQonQNIx99gdTZqw=="], + "sass-embedded-linux-musl-x64": ["sass-embedded-linux-musl-x64@1.97.1", "", { "os": "linux", "cpu": "x64" }, "sha512-wcAigOyyvZ6o1zVypWV7QLZqpOEVnlBqJr9MbpnRIm74qFTSbAEmShoh8yMXBymzuVSmEbThxAwW01/TLf62tA=="], - "sass-embedded-linux-musl-x64": ["sass-embedded-linux-musl-x64@1.89.2", "", { "os": "linux", "cpu": "x64" }, "sha512-K+FmWcdj/uyP8GiG9foxOCPfb5OAZG0uSVq80DKgVSC0U44AdGjvAvVZkrgFEcZ6cCqlNC2JfYmslB5iqdL7tg=="], + "sass-embedded-linux-riscv64": ["sass-embedded-linux-riscv64@1.97.1", "", { "os": "linux", "cpu": "none" }, "sha512-9j1qE1ZrLMuGb+LUmBzw93Z4TNfqlRkkxjPVZy6u5vIggeSfvGbte7eRoYBNWX6SFew/yBCL90KXIirWFSGrlQ=="], - "sass-embedded-linux-riscv64": ["sass-embedded-linux-riscv64@1.89.2", "", { "os": "linux", "cpu": "none" }, "sha512-g9nTbnD/3yhOaskeqeBQETbtfDQWRgsjHok6bn7DdAuwBsyrR3JlSFyqKc46pn9Xxd9SQQZU8AzM4IR+sY0A0w=="], + "sass-embedded-linux-x64": ["sass-embedded-linux-x64@1.97.1", "", { "os": "linux", "cpu": "x64" }, "sha512-7nrLFYMH/UgvEgXR5JxQJ6y9N4IJmnFnYoDxN0nw0jUp+CQWQL4EJ4RqAKTGelneueRbccvt2sEyPK+X0KJ9Jg=="], - "sass-embedded-linux-x64": ["sass-embedded-linux-x64@1.89.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Ax7dKvzncyQzIl4r7012KCMBvJzOz4uwSNoyoM5IV6y5I1f5hEwI25+U4WfuTqdkv42taCMgpjZbh9ERr6JVMQ=="], + "sass-embedded-unknown-all": ["sass-embedded-unknown-all@1.97.1", "", { "dependencies": { "sass": "1.97.1" }, "os": [ "!linux", "!win32", "!darwin", "!android", ] }, "sha512-oPSeKc7vS2dx3ZJHiUhHKcyqNq0GWzAiR8zMVpPd/kVMl5ZfVyw+5HTCxxWDBGkX02lNpou27JkeBPCaneYGAQ=="], - "sass-embedded-win32-arm64": ["sass-embedded-win32-arm64@1.89.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-j96iJni50ZUsfD6tRxDQE2QSYQ2WrfHxeiyAXf41Kw0V4w5KYR/Sf6rCZQLMTUOHnD16qTMVpQi20LQSqf4WGg=="], + "sass-embedded-win32-arm64": ["sass-embedded-win32-arm64@1.97.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-L5j7J6CbZgHGwcfVedMVpM3z5MYeighcyZE8GF2DVmjWzZI3JtPKNY11wNTD/P9o1Uql10YPOKhGH0iWIXOT7Q=="], - "sass-embedded-win32-x64": ["sass-embedded-win32-x64@1.89.2", "", { "os": "win32", "cpu": "x64" }, "sha512-cS2j5ljdkQsb4PaORiClaVYynE9OAPZG/XjbOMxpQmjRIf7UroY4PEIH+Waf+y47PfXFX9SyxhYuw2NIKGbEng=="], + "sass-embedded-win32-x64": ["sass-embedded-win32-x64@1.97.1", "", { "os": "win32", "cpu": "x64" }, "sha512-rfaZAKXU8cW3E7gvdafyD6YtgbEcsDeT99OEiHXRT0UGFuXT8qCOjpAwIKaOA3XXr2d8S42xx6cXcaZ1a+1fgw=="], - "sass-loader": ["sass-loader@16.0.5", "", { "dependencies": { "neo-async": "^2.6.2" }, "peerDependencies": { "@rspack/core": "0.x || 1.x", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "optionalPeers": ["@rspack/core", "node-sass", "sass", "sass-embedded", "webpack"] }, "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw=="], + "sass-loader": ["sass-loader@16.0.6", "", { "dependencies": { "neo-async": "^2.6.2" }, "peerDependencies": { "@rspack/core": "0.x || 1.x", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "optionalPeers": ["@rspack/core", "node-sass", "sass", "sass-embedded", "webpack"] }, "sha512-sglGzId5gmlfxNs4gK2U3h7HlVRfx278YK6Ono5lwzuvi1jxig80YiuHkaDBVsYIKFhx8wN7XSCI0M2IDS/3qA=="], "sax": ["sax@1.4.1", "", {}, "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="], @@ -919,6 +968,8 @@ "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "simple-swizzle": ["simple-swizzle@0.2.4", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw=="], + "sirv": ["sirv@2.0.4", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ=="], "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], @@ -963,8 +1014,6 @@ "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - "svg-pathdata": ["svg-pathdata@7.2.0", "", {}, "sha512-qd+AxqMpfRrRQaWb2SrNFvn69cvl6piqY8TxhYl2Li1g4/LO5F9NJb5wI4vNwRryqgSgD43gYKLm/w3ag1bKvQ=="], "svg2ttf": ["svg2ttf@6.0.3", "", { "dependencies": { "@xmldom/xmldom": "^0.7.2", "argparse": "^2.0.1", "cubic2quad": "^1.2.1", "lodash": "^4.17.10", "microbuffer": "^1.0.0", "svgpath": "^2.1.5" }, "bin": { "svg2ttf": "svg2ttf.js" } }, "sha512-CgqMyZrbOPpc+WqH7aga4JWkDPso23EgypLsbQ6gN3uoPWwwiLjXvzgrwGADBExvCRJrWFzAeK1bSoSpE7ixSQ=="], @@ -991,7 +1040,7 @@ "tgui": ["tgui@workspace:packages/tgui"], - "tgui-core": ["tgui-core@5.3.1", "", { "dependencies": { "@floating-ui/react": "^0.27.16", "@nozbe/microfuzz": "^1.0.0" }, "peerDependencies": { "react": "^19.1.0", "react-dom": "^19.1.0" } }, "sha512-+8dDM4R2G6T1SpzpkRXGYc7YD+9ohqYjTV/4Zgcqc1I4Ld8bJH9vKHCQVbEAsHTCIjHsTBW4xnOpKyAx1gRB5w=="], + "tgui-core": ["tgui-core@5.6.0", "", { "dependencies": { "@floating-ui/react": "^0.27.16", "@nozbe/microfuzz": "^1.0.0" }, "peerDependencies": { "react": "^19.1.0", "react-dom": "^19.1.0" } }, "sha512-F1ezppIr0sLLaQDljOsp5lpESSnCzpnlTy0tY2U5y868it7Q5FpXKlpUeYHsRgVINWUi2O2KEOHBB7izJgIPAg=="], "tgui-dev-server": ["tgui-dev-server@workspace:packages/tgui-dev-server"], @@ -1039,7 +1088,7 @@ "undici": ["undici@6.21.3", "", {}, "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw=="], - "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], "unique-filename": ["unique-filename@3.0.0", "", { "dependencies": { "unique-slug": "^4.0.0" } }, "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g=="], @@ -1063,8 +1112,6 @@ "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], - "webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="], - "webpack-bundle-analyzer": ["webpack-bundle-analyzer@4.10.2", "", { "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", "acorn-walk": "^8.0.0", "commander": "^7.2.0", "debounce": "^1.2.1", "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", "html-escaper": "^2.0.2", "opener": "^1.5.2", "picocolors": "^1.0.0", "sirv": "^2.0.3", "ws": "^7.3.1" }, "bin": { "webpack-bundle-analyzer": "lib/bin/analyzer.js" } }, "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw=="], "webpack-dev-middleware": ["webpack-dev-middleware@7.4.2", "", { "dependencies": { "colorette": "^2.0.10", "memfs": "^4.6.0", "mime-types": "^2.1.31", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "peerDependencies": { "webpack": "^5.0.0" }, "optionalPeers": ["webpack"] }, "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA=="], @@ -1103,6 +1150,8 @@ "yerror": ["yerror@8.0.0", "", {}, "sha512-FemWD5/UqNm8ffj8oZIbjWXIF2KE0mZssggYpdaQkWDDgXBQ/35PNIxEuz6/YLn9o0kOxDBNJe8x8k9ljD7k/g=="], + "zod": ["zod@4.2.1", "", {}, "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw=="], + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], @@ -1111,12 +1160,38 @@ "@npmcli/agent/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "@types/body-parser/@types/node": ["@types/node@24.0.12", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g=="], + + "@types/bonjour/@types/node": ["@types/node@24.0.12", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g=="], + + "@types/connect/@types/node": ["@types/node@24.0.12", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g=="], + + "@types/connect-history-api-fallback/@types/node": ["@types/node@24.0.12", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g=="], + + "@types/express-serve-static-core/@types/node": ["@types/node@24.0.12", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g=="], + + "@types/http-proxy/@types/node": ["@types/node@24.0.12", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g=="], + + "@types/node-forge/@types/node": ["@types/node@24.0.12", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g=="], + + "@types/sax/@types/node": ["@types/node@24.0.12", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g=="], + + "@types/send/@types/node": ["@types/node@24.0.12", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g=="], + + "@types/serve-static/@types/node": ["@types/node@24.0.12", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g=="], + + "@types/sockjs/@types/node": ["@types/node@24.0.12", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g=="], + + "@types/ws/@types/node": ["@types/node@24.0.12", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g=="], + "accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], "body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + "bun-types/@types/node": ["@types/node@24.0.12", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g=="], + "cacache/fs-minipass": ["fs-minipass@3.0.3", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw=="], "cacache/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], @@ -1161,6 +1236,8 @@ "raw-body/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + "sass/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], @@ -1191,8 +1268,34 @@ "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + "@types/body-parser/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/bonjour/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/connect-history-api-fallback/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/connect/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/express-serve-static-core/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/http-proxy/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/node-forge/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/sax/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/send/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/serve-static/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/sockjs/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/ws/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "bun-types/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + "cacache/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], "cacache/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], @@ -1219,6 +1322,8 @@ "node-gyp/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + "sass/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "serve-index/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], diff --git a/tgui/docs/tgui-for-custom-html-popups.md b/tgui/docs/tgui-for-custom-html-popups.md index b666f3a1f54b..c98c40c7fa8d 100644 --- a/tgui/docs/tgui-for-custom-html-popups.md +++ b/tgui/docs/tgui-for-custom-html-popups.md @@ -39,17 +39,13 @@ TGUI in /tg/station codebase has `/datum/asset`, that packs scripts and styleshe ```dm window.initialize( - fancy = user.client.prefs.read_preference( - /datum/preference/toggle/tgui_fancy - ), assets = list( get_asset_datum(/datum/asset/simple/tgui), )) ``` -You can see two new arguments: +You can see new arguments: -- `fancy` - See [Fancy mode](#fancy-mode) - `assets` - This is a list of asset datums, and all JS and CSS in the assets will be loaded in the page. Using asset datums has a big benefit over including `<script>` and `<link>` in normal html popups; If your asset is not available for any reason at the moment (e.g. network is down or packet loss), tgui window will retry loading those assets multiple times. @@ -93,16 +89,6 @@ window.initialize( If you need to inline multiple JS or CSS files, you can concatenate them for now, and separate contents of each file with an `\n` symbol. _This can be a point of improvement (add support for file lists)_. -## Fancy mode - -You may have noticed the fancy mode in previous snippets: - -```dm -window.initialize(fancy = TRUE) -``` - -This removes the native window titlebar and border, which effectively turns window into a floating panel. TGUI heavily uses this option to draw completely custom, fancy windows. You can use it too, but not having the default titlebar limits usability of the browser window, since you can't even close it or drag around without implementing that functionality yourself. This mode might be useful for creating popups and tooltips. - ## Communication It is very often necessary to exchange data between DM and JS, and in vanilla BYOND programming it is a huge pain in the butt, because the `browse()` API is very convoluted, out of box it can send only strings, and sending data back to DM requires using hrefs. diff --git a/tgui/global.d.ts b/tgui/global.d.ts index cfc7920e8208..f5bcf0446d46 100644 --- a/tgui/global.d.ts +++ b/tgui/global.d.ts @@ -63,6 +63,11 @@ type ByondType = { */ strictMode: boolean; + /** + * The external URL for the IndexedDB IFrame to use as the origin + */ + storageCdn: string; + /** * Makes a BYOND call. * @@ -184,7 +189,7 @@ type ByondType = { * Object that provides access to Byond Skin API and is available in * any tgui application. */ -const Byond: ByondType; +const Byond: ByondType = {}; interface Window { Byond: ByondType; @@ -199,4 +204,6 @@ interface Window { hubStorage: Storage; domainStorage: Storage; serverStorage: Storage; + + __chatRenderer__: any; } diff --git a/tgui/package.json b/tgui/package.json index e3afee1f7792..5f863d607ab8 100644 --- a/tgui/package.json +++ b/tgui/package.json @@ -1,30 +1,30 @@ { - "private": true, "name": "tgui-workspace", "version": "6.0.0", - "packageManager": "bun@1.2.16", - "workspaces": [ - "packages/*" - ], - "scripts": { - "tgui:analyze": "rspack --analyze", - "tgui:build": "rspack build", - "tgui:dev": "bun --smol packages/tgui-dev-server/index.ts", - "tgui:test": "bun test", - "tgui:tsc": "tsc" - }, "devDependencies": { - "@happy-dom/global-registrator": "^17.4.7", - "@rspack/cli": "^1.4.5", - "@rspack/core": "^1.4.5", + "@happy-dom/global-registrator": "^20.0.11", + "@rspack/cli": "^1.6.8", + "@rspack/core": "^1.6.8", "@types/bun": "^1.2.14", "@types/react": "^19.1.5", "@types/react-dom": "^19.1.5", "@types/webpack-env": "^1.18.8", "@types/wicg-file-system-access": "^2023.10.6", "css-loader": "^7.1.2", - "sass-embedded": "^1.89.2", - "sass-loader": "^16.0.5", + "sass-embedded": "^1.97.1", + "sass-loader": "^16.0.6", "typescript": "^5.8.3" - } + }, + "packageManager": "bun@1.2.16", + "private": true, + "scripts": { + "tgui:analyze": "rspack --analyze", + "tgui:build": "rspack build", + "tgui:dev": "bun --smol packages/tgui-dev-server/index.ts", + "tgui:test": "bun test", + "tgui:tsc": "tsc" + }, + "workspaces": [ + "packages/*" + ] } diff --git a/tgui/packages/common/assets.ts b/tgui/packages/common/assets.ts new file mode 100644 index 000000000000..958d472ca4ec --- /dev/null +++ b/tgui/packages/common/assets.ts @@ -0,0 +1,30 @@ +const EXCLUDED_PATTERNS = [/v4shim/i]; + +export function loadStyleSheet(payload: string): void { + Byond.loadCss(payload); +} + +export function loadMappings( + payload: Record<string, string>, + /** Lets you insert your own independent asset map. */ + map: Record<string, string>, +): void { + for (const name in payload) { + // Skip anything that matches excluded patterns + if (EXCLUDED_PATTERNS.some((regex) => regex.test(name))) { + continue; + } + + const url = payload[name]; + const ext = name.split('.').pop(); + + map[name] = url; + + if (ext === 'css') { + Byond.loadCss(url); + } + if (ext === 'js') { + Byond.loadJs(url); + } + } +} diff --git a/tgui/packages/common/package.json b/tgui/packages/common/package.json index f40c3b79237f..c5419a7a6d2c 100644 --- a/tgui/packages/common/package.json +++ b/tgui/packages/common/package.json @@ -2,7 +2,8 @@ "name": "common", "version": "4.3.1", "dependencies": { - "es-toolkit": "^1.39.3" + "es-toolkit": "^1.43.0", + "zod": "^4.2.0" }, "private": true } diff --git a/tgui/packages/common/storage.ts b/tgui/packages/common/storage.ts index 427e8b8ffce5..1955fa8ab8e1 100644 --- a/tgui/packages/common/storage.ts +++ b/tgui/packages/common/storage.ts @@ -6,10 +6,12 @@ * @license MIT */ -export const IMPL_MEMORY = 0; export const IMPL_HUB_STORAGE = 1; +export const IMPL_IFRAME_INDEXED_DB = 2; -type StorageImplementation = typeof IMPL_MEMORY | typeof IMPL_HUB_STORAGE; +type StorageImplementation = + | typeof IMPL_HUB_STORAGE + | typeof IMPL_IFRAME_INDEXED_DB; type StorageBackend = { impl: StorageImplementation; @@ -31,57 +33,103 @@ const testHubStorage = testGeneric( () => window.hubStorage && !!window.hubStorage.getItem, ); -class MemoryBackend implements StorageBackend { - private store: Record<string, any>; +class HubStorageBackend implements StorageBackend { public impl: StorageImplementation; constructor() { - this.impl = IMPL_MEMORY; - this.store = {}; + this.impl = IMPL_HUB_STORAGE; } async get(key: string): Promise<any> { - return this.store[key]; + const value = await window.hubStorage.getItem(key); + if (typeof value === 'string') { + return JSON.parse(value); + } + return undefined; } async set(key: string, value: any): Promise<void> { - this.store[key] = value; + window.hubStorage.setItem(key, JSON.stringify(value)); } async remove(key: string): Promise<void> { - this.store[key] = undefined; + window.hubStorage.removeItem(key); } async clear(): Promise<void> { - this.store = {}; + window.hubStorage.clear(); } } -class HubStorageBackend implements StorageBackend { +class IFrameIndexedDbBackend implements StorageBackend { public impl: StorageImplementation; + private documentElement: HTMLIFrameElement; + private iframeWindow: Window; + constructor() { - this.impl = IMPL_HUB_STORAGE; + this.impl = IMPL_IFRAME_INDEXED_DB; + } + + async ready(): Promise<boolean | null> { + const iframe = document.createElement('iframe'); + iframe.style.display = 'none'; + iframe.src = Byond.storageCdn; + + const completePromise: Promise<boolean> = new Promise((resolve) => { + fetch(Byond.storageCdn, { method: "HEAD" }).then((response) => { + if (response.status !== 200) { + resolve(false); + } + + }).catch(() => { + resolve(false); + }) + + window.addEventListener('message', (message) => { + if (message.data === "ready") { + resolve(true); + } + }) + }); + + this.documentElement = document.body.appendChild(iframe); + if (!this.documentElement.contentWindow) { + return new Promise((res) => res(false)); + } + + this.iframeWindow = this.documentElement.contentWindow; + + return completePromise; } async get(key: string): Promise<any> { - const value = await window.hubStorage.getItem(key); - if (typeof value === 'string') { - return JSON.parse(value); - } - return undefined; + const promise = new Promise((resolve) => { + window.addEventListener('message', (message) => { + if (message.data.key && message.data.key === key) { + resolve(message.data.value); + } + }); + }); + + this.iframeWindow.postMessage({ type: 'get', key: key }, '*'); + return promise; } async set(key: string, value: any): Promise<void> { - window.hubStorage.setItem(key, JSON.stringify(value)); + this.iframeWindow.postMessage({ type: 'set', key: key, value: value }, '*'); } async remove(key: string): Promise<void> { - window.hubStorage.removeItem(key); + this.iframeWindow.postMessage({ type: 'remove', key: key }, '*'); } async clear(): Promise<void> { - window.hubStorage.clear(); + this.iframeWindow.postMessage({ type: 'clear' }, '*'); + } + + async destroy(): Promise<void> { + document.body.removeChild(this.documentElement); } } @@ -91,19 +139,69 @@ class HubStorageBackend implements StorageBackend { */ class StorageProxy implements StorageBackend { private backendPromise: Promise<StorageBackend>; - public impl: StorageImplementation = IMPL_MEMORY; + public impl: StorageImplementation = IMPL_IFRAME_INDEXED_DB; constructor() { this.backendPromise = (async () => { - if (testHubStorage()) { - return new HubStorageBackend(); - } - console.warn( - 'No supported storage backend found. Using in-memory storage.', - ); + // If we have not enabled byondstorage yet, we need to check + // if we can use the IFrame, or if we need to enable byondstorage + if (!testHubStorage()) { + + // If we have an IFrame URL we can use, and we haven't already enabled + // byondstorage, we should use the IFrame backend + if (Byond.storageCdn) { + const iframe = new IFrameIndexedDbBackend(); + + if ((await iframe.ready()) === true) { + if (await iframe.get('byondstorage-migrated')) return iframe; + + Byond.winset(null, 'browser-options', '+byondstorage'); + + await new Promise<void>((resolve) => { + document.addEventListener('byondstorageupdated', async () => { + setTimeout(() => { + const hub = new HubStorageBackend(); + + // Migrate these existing settings from byondstorage to the IFrame + for (const setting of ['panel-settings', 'chat-state', 'chat-messages']) { + hub + .get(setting) + .then((settings) => iframe.set(setting, settings)); + } + + iframe.set('byondstorage-migrated', true); + Byond.winset(null, 'browser-options', '-byondstorage'); + + resolve(); + }, 1); + }); + }); + + return iframe; + } + + iframe.destroy(); + }; + + // IFrame hasn't worked out for us, we'll need to enable byondstorage + Byond.winset(null, 'browser-options', '+byondstorage'); + + return new Promise((resolve) => { + const listener = () => { + document.removeEventListener('byondstorageupdated', listener); + + // This event is emitted *before* byondstorage is actually created + // so we have to wait a little bit before we can use it + setTimeout(() => resolve(new HubStorageBackend()), 1); + }; + + document.addEventListener('byondstorageupdated', listener); + }); + } - return new MemoryBackend(); + // byondstorage is already enabled, we can use it straight away + return new HubStorageBackend(); })(); } diff --git a/tgui/packages/common/type-safety.test.ts b/tgui/packages/common/type-safety.test.ts new file mode 100644 index 000000000000..f572a19781d8 --- /dev/null +++ b/tgui/packages/common/type-safety.test.ts @@ -0,0 +1,53 @@ +import { describe, it } from 'bun:test'; +import assert from 'node:assert/strict'; +import * as z from 'zod'; +import { smoothMerge } from './type-safety'; + +describe('smoothMerge', () => { + it('merges valid fields from source into target', () => { + const schema = z.object({ + a: z.string(), + b: z.number(), + }); + + const source = { a: 'hello', b: 'not a number', c: true }; + const target = { a: 'default', b: 42 }; + + const result = smoothMerge({ schema, source, target }); + assert.deepEqual(result, { a: 'hello', b: 42 }); + }); + + it('returns target if source is empty', () => { + const schema = z.object({ + a: z.string(), + }); + + const source = {}; + const target = { a: 'default' }; + const result = smoothMerge({ schema, source, target }); + assert.deepEqual(result, target); + }); + + it('completely ignores an object if its not in the schema', () => { + const schema = z.object({ + a: z.string(), + b: z.number(), + }); + + const source = { + c: 1, + d: [1, 2, 3], + }; + + const target = { + a: 'default', + b: 42, + }; + + const result = smoothMerge({ schema, source, target }); + assert.deepEqual(result, { + a: 'default', + b: 42, + }); + }); +}); diff --git a/tgui/packages/common/type-safety.ts b/tgui/packages/common/type-safety.ts new file mode 100644 index 000000000000..71e1c6aa5687 --- /dev/null +++ b/tgui/packages/common/type-safety.ts @@ -0,0 +1,56 @@ +import type { ZodObject } from 'zod'; + +type MergeInput<TObj> = { + /** + * A zod object. + * @see Writing a Zod Schema: https://zod.dev/basics + */ + schema: ZodObject<any>; + /** The input getting merged */ + source: Record<string, unknown>; + /** The defaults, which is the shape of the output */ + target: TObj; +}; + +/** + * Merges two objects together while validating the output against a zod schema. + * Different than just parsing - it does not throw errors, it simply discards + * invalid fields and invalid value types. + * + * @example + * + * ```ts + * const schema = z.object({ + * a: z.string(), + * b: z.number(), + * }); + * + * const source = { a: 'hello', b: 'not a number', c: true }; + * const target = { a: 'default', b: 42 }; + * + * const result = smoothMerge({ schema, source, target }); + * // result is { a: 'hello', b: 42 } + * ``` + */ +export function smoothMerge<TObj extends Record<string, unknown>>( + input: MergeInput<TObj>, +): TObj { + if (Object.keys(input.source).length === 0) return input.target; + + const validated = {}; + + for (const [key, value] of Object.entries(input.source)) { + // Skip keys that are not in the schema + if (!(key in input.schema.shape)) continue; + + const fieldSchema = input.schema.shape[key]; + const result = fieldSchema.safeParse(value); + + // Only assign fields which pass validation + if (result.success) { + validated[key] = result.data; + } + } + + return { ...input.target, ...validated }; +} diff --git a/tgui/packages/tgui-panel/Notifications.tsx b/tgui/packages/tgui-panel/Notifications.tsx index e46e6f98fa0c..9c87ca633a72 100644 --- a/tgui/packages/tgui-panel/Notifications.tsx +++ b/tgui/packages/tgui-panel/Notifications.tsx @@ -6,13 +6,15 @@ import { Flex } from 'tgui-core/components'; -export const Notifications = (props) => { +export function Notifications(props) { const { children } = props; + return <div className="Notifications">{children}</div>; -}; +} -const NotificationsItem = (props) => { +function NotificationsItem(props) { const { rightSlot, children } = props; + return ( <Flex align="center" className="Notification"> <Flex.Item className="Notification__content" grow={1}> @@ -23,6 +25,6 @@ const NotificationsItem = (props) => { )} </Flex> ); -}; +} Notifications.Item = NotificationsItem; diff --git a/tgui/packages/tgui-panel/Panel.tsx b/tgui/packages/tgui-panel/Panel.tsx index d79fd985fdb7..7ad6ebed3d0c 100644 --- a/tgui/packages/tgui-panel/Panel.tsx +++ b/tgui/packages/tgui-panel/Panel.tsx @@ -4,31 +4,33 @@ * @license MIT */ +import { useAtom, useAtomValue } from 'jotai'; import { Pane } from 'tgui/layouts'; import { Button, Section, Stack } from 'tgui-core/components'; - -import { NowPlayingWidget, useAudio } from './audio'; -import { ChatPanel, ChatTabs } from './chat'; -import { useGame } from './game'; +import { visibleAtom } from './audio/atoms'; +import { NowPlayingWidget } from './audio/NowPlayingWidget'; +import { ChatPanel } from './chat/ChatPanel'; +import { ChatTabs } from './chat/ChatTabs'; +import { useChatPersistence } from './chat/use-chat-persistence'; +import { gameAtom } from './game/atoms'; +import { useKeepAlive } from './game/use-keep-alive'; import { Notifications } from './Notifications'; -import { PingIndicator } from './ping'; +import { PingIndicator } from './ping/PingIndicator'; import { ReconnectButton } from './reconnect'; -import { SettingsPanel, useSettings } from './settings'; +import { settingsVisibleAtom } from './settings/atoms'; +import { SettingsPanel } from './settings/SettingsPanel'; +import { useSettings } from './settings/use-settings'; -export const Panel = (props) => { - const audio = useAudio(); - const settings = useSettings(); - const game = useGame(); - if (process.env.NODE_ENV !== 'production') { - const { useDebug, KitchenSink } = require('tgui/debug'); - const debug = useDebug(); - if (debug.kitchenSink) { - return <KitchenSink panel />; - } - } +export function Panel(props) { + const [audioVisible, setAudioVisible] = useAtom(visibleAtom); + const game = useAtomValue(gameAtom); + const { settings } = useSettings(); + const [settingsVisible, setSettingsVisible] = useAtom(settingsVisibleAtom); + useChatPersistence(); + useKeepAlive(); return ( - <Pane theme={settings.theme}> + <Pane theme={settings.theme} canSuspend={false}> <Stack fill vertical> <Stack.Item> <Section fitted> @@ -42,42 +44,40 @@ export const Panel = (props) => { <Stack.Item> <Button color="grey" - selected={audio.visible} + selected={audioVisible} icon="music" tooltip="Music player" tooltipPosition="bottom-start" - onClick={() => audio.toggle()} + onClick={() => setAudioVisible((v) => !v)} /> </Stack.Item> <Stack.Item> <Button - icon={settings.visible ? 'times' : 'cog'} - selected={settings.visible} - tooltip={ - settings.visible ? 'Close settings' : 'Open settings' - } + icon={settingsVisible ? 'times' : 'cog'} + selected={settingsVisible} + tooltip={settingsVisible ? 'Close settings' : 'Open settings'} tooltipPosition="bottom-start" - onClick={() => settings.toggle()} + onClick={() => setSettingsVisible((v) => !v)} /> </Stack.Item> </Stack> </Section> </Stack.Item> - {audio.visible && ( + {audioVisible && ( <Stack.Item> <Section> <NowPlayingWidget /> </Section> </Stack.Item> )} - {settings.visible && ( + {settingsVisible && ( <Stack.Item> <SettingsPanel /> </Stack.Item> )} <Stack.Item grow> <Section fill fitted position="relative"> - <Pane.Content scrollable> + <Pane.Content scrollable id="chat-pane"> <ChatPanel lineHeight={settings.lineHeight} /> </Pane.Content> <Notifications> @@ -99,4 +99,4 @@ export const Panel = (props) => { </Stack> </Pane> ); -}; +} diff --git a/tgui/packages/tgui-panel/app.tsx b/tgui/packages/tgui-panel/app.tsx new file mode 100644 index 000000000000..efe198ae3a75 --- /dev/null +++ b/tgui/packages/tgui-panel/app.tsx @@ -0,0 +1,12 @@ +import { Provider } from 'jotai'; +import { store } from './events/store'; +import { Panel } from './Panel'; + +/** Just an expandable wrapper for setup shenanigans and providers */ +export function App() { + return ( + <Provider store={store}> + <Panel /> + </Provider> + ); +} diff --git a/tgui/packages/tgui-panel/audio/NowPlayingWidget.jsx b/tgui/packages/tgui-panel/audio/NowPlayingWidget.jsx deleted file mode 100644 index 15f01d2628bc..000000000000 --- a/tgui/packages/tgui-panel/audio/NowPlayingWidget.jsx +++ /dev/null @@ -1,111 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { useDispatch, useSelector } from 'tgui/backend'; -import { Button, Collapsible, Flex, Knob, Section } from 'tgui-core/components'; -import { toFixed } from 'tgui-core/math'; - -import { useSettings } from '../settings'; -import { selectAudio } from './selectors'; - -export const NowPlayingWidget = (props) => { - const audio = useSelector(selectAudio), - dispatch = useDispatch(), - settings = useSettings(), - title = audio.meta?.title, - URL = audio.meta?.link, - Artist = audio.meta?.artist || 'Unknown Artist', - upload_date = audio.meta?.upload_date || 'Unknown Date', - album = audio.meta?.album || 'Unknown Album', - duration = audio.meta?.duration, - date = !Number.isNaN(upload_date) - ? upload_date?.substring(0, 4) + - '-' + - upload_date?.substring(4, 6) + - '-' + - upload_date?.substring(6, 8) - : upload_date; - - return ( - <Flex align="center"> - {(audio.playing && ( - <Flex.Item - mx={0.5} - grow={1} - style={{ - whiteSpace: 'nowrap', - overflow: 'hidden', - textOverflow: 'ellipsis', - }} - > - { - <Collapsible title={title || 'Unknown Track'} color={'blue'}> - <Section> - {URL !== 'Song Link Hidden' && ( - <Flex.Item grow={1} color="label"> - URL: <a href={URL}>{URL}</a> - </Flex.Item> - )} - <Flex.Item grow={1} color="label"> - Duration: {duration} - </Flex.Item> - {Artist !== 'Song Artist Hidden' && - Artist !== 'Unknown Artist' && ( - <Flex.Item grow={1} color="label"> - Artist: {Artist} - </Flex.Item> - )} - {album !== 'Song Album Hidden' && album !== 'Unknown Album' && ( - <Flex.Item grow={1} color="label"> - Album: {album} - </Flex.Item> - )} - {upload_date !== 'Song Upload Date Hidden' && - upload_date !== 'Unknown Date' && ( - <Flex.Item grow={1} color="label"> - Uploaded: {date} - </Flex.Item> - )} - </Section> - </Collapsible> - } - </Flex.Item> - )) || ( - <Flex.Item grow={1} color="label"> - Nothing to play. - </Flex.Item> - )} - {audio.playing && ( - <Flex.Item mx={0.5} fontSize="0.9em"> - <Button - tooltip="Stop" - icon="stop" - onClick={() => - dispatch({ - type: 'audio/stopMusic', - }) - } - /> - </Flex.Item> - )} - <Flex.Item mx={0.5} fontSize="0.9em"> - <Knob - minValue={0} - maxValue={1} - value={settings.adminMusicVolume} - step={0.0025} - stepPixelSize={1} - format={(value) => `${toFixed(value * 100)}%`} - onChange={(e, value) => - settings.update({ - adminMusicVolume: value, - }) - } - /> - </Flex.Item> - </Flex> - ); -}; diff --git a/tgui/packages/tgui-panel/audio/NowPlayingWidget.tsx b/tgui/packages/tgui-panel/audio/NowPlayingWidget.tsx new file mode 100644 index 000000000000..a89ae1e31c53 --- /dev/null +++ b/tgui/packages/tgui-panel/audio/NowPlayingWidget.tsx @@ -0,0 +1,108 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { useAtomValue } from 'jotai'; +import { Button, Collapsible, Flex, Knob, Section } from 'tgui-core/components'; +import { toFixed } from 'tgui-core/math'; +import { useSettings } from '../settings/use-settings'; +import { metaAtom, playingAtom } from './atoms'; +import { player } from './handlers'; + +export function NowPlayingWidget(props) { + const { settings, updateSettings } = useSettings(); + const meta = useAtomValue(metaAtom); + const { + album = 'Unknown Album', + artist = 'Unknown Artist', + duration, + link, + title, + upload_date = 'Unknown Data', + } = meta || {}; + + const playing = useAtomValue(playingAtom); + + const date = !Number.isNaN(upload_date) + ? upload_date?.substring(0, 4) + + '-' + + upload_date?.substring(4, 6) + + '-' + + upload_date?.substring(6, 8) + : upload_date; + + return ( + <Flex align="center"> + {playing ? ( + <Flex.Item + mx={0.5} + grow={1} + style={{ + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + }} + > + { + <Collapsible title={title || 'Unknown Track'} color="blue"> + <Section> + {link !== 'Song Link Hidden' && ( + <Flex.Item grow={1} color="label"> + URL: <a href={link}>{link}</a> + </Flex.Item> + )} + <Flex.Item grow={1} color="label"> + Duration: {duration} + </Flex.Item> + {artist !== 'Song Artist Hidden' && + artist !== 'Unknown Artist' && ( + <Flex.Item grow={1} color="label"> + Artist: {artist} + </Flex.Item> + )} + {album !== 'Song Album Hidden' && album !== 'Unknown Album' && ( + <Flex.Item grow={1} color="label"> + Album: {album} + </Flex.Item> + )} + {upload_date !== 'Song Upload Date Hidden' && + upload_date !== 'Unknown Date' && ( + <Flex.Item grow={1} color="label"> + Uploaded: {date} + </Flex.Item> + )} + </Section> + </Collapsible> + } + </Flex.Item> + ) : ( + <Flex.Item grow={1} color="label"> + Nothing to play. + </Flex.Item> + )} + {playing && ( + <Flex.Item mx={0.5} fontSize="0.9em"> + <Button tooltip="Stop" icon="stop" onClick={() => player.stop()} /> + </Flex.Item> + )} + <Flex.Item mx={0.5} fontSize="0.9em"> + <Knob + minValue={0} + maxValue={1} + value={settings.adminMusicVolume} + step={0.0025} + stepPixelSize={1} + format={(value) => `${toFixed(value * 100)}%`} + onChange={(e, value) => { + updateSettings({ + adminMusicVolume: value, + }); + player.setVolume(value); + }} + /> + </Flex.Item> + </Flex> + ); +} diff --git a/tgui/packages/tgui-panel/audio/atoms.ts b/tgui/packages/tgui-panel/audio/atoms.ts new file mode 100644 index 000000000000..eba7ab032749 --- /dev/null +++ b/tgui/packages/tgui-panel/audio/atoms.ts @@ -0,0 +1,22 @@ +import { atom } from 'jotai'; + +export type Meta = { + album: string; + artist: string; + duration: string; + link: string; + title: string; + upload_date: string; +}; + +export const playingAtom = atom(false); +export const visibleAtom = atom(false); +export const metaAtom = atom<Meta | null>(null); + +//------- Convenience --------------------------------------------------------// + +export const audioAtom = atom((get) => ({ + playing: get(playingAtom), + visible: get(visibleAtom), + meta: get(metaAtom), +})); diff --git a/tgui/packages/tgui-panel/audio/handlers.ts b/tgui/packages/tgui-panel/audio/handlers.ts new file mode 100644 index 000000000000..d23fb6eee122 --- /dev/null +++ b/tgui/packages/tgui-panel/audio/handlers.ts @@ -0,0 +1,39 @@ +import { store } from '../events/store'; +import { type Meta, metaAtom, playingAtom, visibleAtom } from './atoms'; +import { AudioPlayer } from './player'; + +export const player = new AudioPlayer(); + +player.onPlay(() => { + store.set(playingAtom, true); + store.set(visibleAtom, true); +}); + +player.onStop(() => { + store.set(playingAtom, false); + store.set(visibleAtom, false); + store.set(metaAtom, null); +}); + +type PlayPayload = { + url: string; + pitch: number; + start: number; + end: number; +} & Meta; + +export function playMusic(payload: PlayPayload): void { + const { url, ...options } = payload; + + player.play(url, options); + store.set(metaAtom, options); +} + +export function stopMusic(): void { + player.stop(); +} + +// settings/update and settings/load +export function setMusicVolume(volume: number): void { + player.setVolume(volume); +} diff --git a/tgui/packages/tgui-panel/audio/hooks.ts b/tgui/packages/tgui-panel/audio/hooks.ts deleted file mode 100644 index 2e9d830cb777..000000000000 --- a/tgui/packages/tgui-panel/audio/hooks.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { useDispatch, useSelector } from 'tgui/backend'; - -import { selectAudio } from './selectors'; - -export const useAudio = () => { - const state = useSelector(selectAudio); - const dispatch = useDispatch(); - return { - ...state, - toggle: () => dispatch({ type: 'audio/toggle' }), - }; -}; diff --git a/tgui/packages/tgui-panel/audio/index.ts b/tgui/packages/tgui-panel/audio/index.ts deleted file mode 100644 index ac7d4c2ca7f1..000000000000 --- a/tgui/packages/tgui-panel/audio/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -export { useAudio } from './hooks'; -export { audioMiddleware } from './middleware'; -export { NowPlayingWidget } from './NowPlayingWidget'; -export { audioReducer } from './reducer'; diff --git a/tgui/packages/tgui-panel/audio/middleware.js b/tgui/packages/tgui-panel/audio/middleware.js deleted file mode 100644 index ac49929aaa2b..000000000000 --- a/tgui/packages/tgui-panel/audio/middleware.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { AudioPlayer } from './player'; - -export const audioMiddleware = (store) => { - const player = new AudioPlayer(); - player.onPlay(() => { - store.dispatch({ type: 'audio/playing' }); - }); - player.onStop(() => { - store.dispatch({ type: 'audio/stopped' }); - }); - return (next) => (action) => { - const { type, payload } = action; - if (type === 'audio/playMusic') { - const { url, ...options } = payload; - player.play(url, options); - return next(action); - } - if (type === 'audio/stopMusic') { - player.stop(); - return next(action); - } - if (type === 'settings/update' || type === 'settings/load') { - const volume = payload?.adminMusicVolume; - if (typeof volume === 'number') { - player.setVolume(volume); - } - return next(action); - } - return next(action); - }; -}; diff --git a/tgui/packages/tgui-panel/audio/player.ts b/tgui/packages/tgui-panel/audio/player.ts index d82484709df9..f64b4f21afaf 100644 --- a/tgui/packages/tgui-panel/audio/player.ts +++ b/tgui/packages/tgui-panel/audio/player.ts @@ -91,7 +91,9 @@ export class AudioPlayer { logger.log('playback failed'); }); - this.onPlaySubscribers.forEach((subscriber) => subscriber()); + this.onPlaySubscribers.forEach((subscriber) => { + subscriber(); + }); } stop(): void { @@ -102,7 +104,9 @@ export class AudioPlayer { this.element.pause(); this.destroy(); - this.onStopSubscribers.forEach((subscriber) => subscriber()); + this.onStopSubscribers.forEach((subscriber) => { + subscriber(); + }); } setVolume(volume: number): void { diff --git a/tgui/packages/tgui-panel/audio/reducer.ts b/tgui/packages/tgui-panel/audio/reducer.ts deleted file mode 100644 index 17684060ffb8..000000000000 --- a/tgui/packages/tgui-panel/audio/reducer.ts +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -const initialState = { - visible: false, - playing: false, - track: null, -}; - -export const audioReducer = (state = initialState, action) => { - const { type, payload } = action; - if (type === 'audio/playing') { - return { - ...state, - visible: true, - playing: true, - }; - } - if (type === 'audio/stopped') { - return { - ...state, - visible: false, - playing: false, - }; - } - if (type === 'audio/playMusic') { - return { - ...state, - meta: payload, - }; - } - if (type === 'audio/stopMusic') { - return { - ...state, - visible: false, - playing: false, - meta: null, - }; - } - if (type === 'audio/toggle') { - return { - ...state, - visible: !state.visible, - }; - } - return state; -}; diff --git a/tgui/packages/tgui-panel/audio/selectors.ts b/tgui/packages/tgui-panel/audio/selectors.ts deleted file mode 100644 index 89cb8f136186..000000000000 --- a/tgui/packages/tgui-panel/audio/selectors.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -export const selectAudio = (state) => state.audio; diff --git a/tgui/packages/tgui-panel/chat/ChatPageSettings.tsx b/tgui/packages/tgui-panel/chat/ChatPageSettings.tsx index 463ec0c2dd54..5057cf22d405 100644 --- a/tgui/packages/tgui-panel/chat/ChatPageSettings.tsx +++ b/tgui/packages/tgui-panel/chat/ChatPageSettings.tsx @@ -4,7 +4,6 @@ * @license MIT */ -import { useDispatch, useSelector } from 'tgui/backend'; import { Button, Collapsible, @@ -13,20 +12,18 @@ import { Section, Stack, } from 'tgui-core/components'; - -import { - moveChatPageLeft, - moveChatPageRight, - removeChatPage, - toggleAcceptedType, - updateChatPage, -} from './actions'; import { MESSAGE_TYPES } from './constants'; -import { selectCurrentChatPage } from './selectors'; +import { useChatPages } from './use-chat-pages'; export function ChatPageSettings(props) { - const page = useSelector(selectCurrentChatPage); - const dispatch = useDispatch(); + const { + page, + moveChatLeft, + moveChatRight, + updateChatPage, + removeChatPage, + toggleAcceptedType, + } = useChatPages(); return ( <Section> @@ -37,13 +34,7 @@ export function ChatPageSettings(props) { color="blue" icon="angles-left" tooltip="Reorder tab to the left" - onClick={() => - dispatch( - moveChatPageLeft({ - pageId: page.id, - }), - ) - } + onClick={moveChatLeft} /> </Stack.Item> )} @@ -52,12 +43,9 @@ export function ChatPageSettings(props) { fluid value={page.name} onBlur={(value) => - dispatch( - updateChatPage({ - pageId: page.id, - name: value, - }), - ) + updateChatPage({ + name: value, + }) } /> </Stack.Item> @@ -67,13 +55,7 @@ export function ChatPageSettings(props) { color="blue" icon="angles-right" tooltip="Reorder tab to the right" - onClick={() => - dispatch( - moveChatPageRight({ - pageId: page.id, - }), - ) - } + onClick={moveChatRight} /> </Stack.Item> )} @@ -83,12 +65,9 @@ export function ChatPageSettings(props) { icon={page.hideUnreadCount ? 'bell-slash' : 'bell'} tooltip="Disables unread counter" onClick={() => - dispatch( - updateChatPage({ - pageId: page.id, - hideUnreadCount: !page.hideUnreadCount, - }), - ) + updateChatPage({ + hideUnreadCount: !page.hideUnreadCount, + }) } > Mute @@ -96,17 +75,7 @@ export function ChatPageSettings(props) { </Stack.Item> {!page.isMain && ( <Stack.Item> - <Button - color="red" - icon="times" - onClick={() => - dispatch( - removeChatPage({ - pageId: page.id, - }), - ) - } - > + <Button color="red" icon="times" onClick={removeChatPage}> Remove </Button> </Stack.Item> @@ -120,14 +89,7 @@ export function ChatPageSettings(props) { <Button.Checkbox key={typeDef.type} checked={page.acceptedTypes[typeDef.type]} - onClick={() => - dispatch( - toggleAcceptedType({ - pageId: page.id, - type: typeDef.type, - }), - ) - } + onClick={() => toggleAcceptedType(typeDef.type)} > {typeDef.name} </Button.Checkbox> @@ -139,14 +101,7 @@ export function ChatPageSettings(props) { <Button.Checkbox key={typeDef.type} checked={page.acceptedTypes[typeDef.type]} - onClick={() => - dispatch( - toggleAcceptedType({ - pageId: page.id, - type: typeDef.type, - }), - ) - } + onClick={() => toggleAcceptedType(typeDef.type)} > {typeDef.name} </Button.Checkbox> diff --git a/tgui/packages/tgui-panel/chat/ChatPanel.tsx b/tgui/packages/tgui-panel/chat/ChatPanel.tsx index b42086ccd56b..17171ddf81b0 100644 --- a/tgui/packages/tgui-panel/chat/ChatPanel.tsx +++ b/tgui/packages/tgui-panel/chat/ChatPanel.tsx @@ -4,84 +4,73 @@ * @license MIT */ -import { Component, createRef } from 'react'; +import { useAtom, useAtomValue } from 'jotai'; +import { useEffect, useRef } from 'react'; import { Button } from 'tgui-core/components'; -import { shallowDiffers } from 'tgui-core/react'; - +import { + chatPagesRecordAtom, + currentPageIdAtom, + scrollTrackingAtom, +} from './atom'; import { chatRenderer } from './renderer'; +import type { Page } from './types'; type Props = { fontSize?: string; - lineHeight: string; -}; - -type State = { - scrollTracking: boolean; + lineHeight: string | number; }; -export class ChatPanel extends Component<Props, State> { - ref: React.RefObject<HTMLDivElement | null>; - handleScrollTrackingChange: (value: boolean) => void; - - constructor(props) { - super(props); - this.ref = createRef(); - this.state = { - scrollTracking: true, - }; - this.handleScrollTrackingChange = (value) => - this.setState({ - scrollTracking: value, - }); - } +export function ChatPanel(props: Props) { + const ref = useRef<HTMLDivElement>(null); + const scrollTracking = useAtomValue(scrollTrackingAtom); + // Page stuff + const currentPageId = useAtomValue(currentPageIdAtom); + const [pagesRecord, setPagesRecord] = useAtom(chatPagesRecordAtom); - componentDidMount() { - chatRenderer.mount(this.ref.current); - chatRenderer.events.on( - 'scrollTrackingChanged', - this.handleScrollTrackingChange, - ); - this.componentDidUpdate(null); - } + /** Mounts the renderer */ + useEffect(() => { + if (ref.current) { + chatRenderer.mount(ref.current); + } + }, []); - componentWillUnmount() { - chatRenderer.events.off( - 'scrollTrackingChanged', - this.handleScrollTrackingChange, - ); - } + /** Resets unread count when scroll tracking is enabled */ + useEffect(() => { + if (scrollTracking) { + const draft: Page = { + ...pagesRecord[currentPageId], + unreadCount: 0, + }; - componentDidUpdate(prevProps) { - requestAnimationFrame(() => { - chatRenderer.ensureScrollTracking(); - }); - const shouldUpdateStyle = - !prevProps || shallowDiffers(this.props, prevProps); - if (shouldUpdateStyle) { - chatRenderer.assignStyle({ - width: '100%', - 'white-space': 'pre-wrap', - 'font-size': this.props.fontSize, - 'line-height': this.props.lineHeight, + setPagesRecord({ + ...pagesRecord, + [currentPageId]: draft, }); } - } + }, [scrollTracking]); + + /** Updates the style of the chat panel */ + useEffect(() => { + chatRenderer.assignStyle({ + width: '100%', + 'white-space': 'pre-wrap', + 'font-size': props.fontSize, + 'line-height': props.lineHeight, + }); + }, [props.fontSize, props.lineHeight]); - render() { - const { scrollTracking } = this.state; - return ( - <> - <div className="Chat" ref={this.ref} /> - {!scrollTracking && ( - <Button - className="Chat__scrollButton" - icon="arrow-down" - onClick={() => chatRenderer.scrollToBottom()} - > - Scroll to bottom - </Button> - )} - </> - ); - } + return ( + <> + <div className="Chat" ref={ref} /> + {!scrollTracking && ( + <Button + className="Chat__scrollButton" + icon="arrow-down" + onClick={() => chatRenderer.scrollToBottom()} + > + Scroll to bottom + </Button> + )} + </> + ); } diff --git a/tgui/packages/tgui-panel/chat/ChatTabs.tsx b/tgui/packages/tgui-panel/chat/ChatTabs.tsx index d20c5f999cad..7dc238a582a6 100644 --- a/tgui/packages/tgui-panel/chat/ChatTabs.tsx +++ b/tgui/packages/tgui-panel/chat/ChatTabs.tsx @@ -4,44 +4,46 @@ * @license MIT */ -import { useDispatch, useSelector } from 'tgui/backend'; +import { useAtom } from 'jotai'; import { Box, Button, Stack, Tabs } from 'tgui-core/components'; +import { settingsVisibleAtom } from '../settings/atoms'; +import { useChatPages } from './use-chat-pages'; -import { openChatSettings } from '../settings/actions'; -import { addChatPage, changeChatPage } from './actions'; -import { selectChatPages, selectCurrentChatPage } from './selectors'; +type UnreadCountWidgetProps = { + value: number; +}; + +function UnreadCountWidget(props: UnreadCountWidgetProps) { + const { value } = props; -function UnreadCountWidget({ value }: { value: number }) { return <Box className="UnreadCount">{Math.min(value, 99)}</Box>; } export function ChatTabs(props) { - const pages = useSelector(selectChatPages); - const currentPage = useSelector(selectCurrentChatPage); - const dispatch = useDispatch(); + const { addChatPage, changeChatPage, pages, pagesRecord, currentPageId } = + useChatPages(); + + const [, setSettingsVisible] = useAtom(settingsVisibleAtom); return ( <Stack align="center"> <Stack.Item> <Tabs scrollable textAlign="center"> - {pages.map((page) => ( - <Tabs.Tab - key={page.id} - selected={page === currentPage} - onClick={() => - dispatch( - changeChatPage({ - pageId: page.id, - }), - ) - } - > - {page.name} - {!page.hideUnreadCount && page.unreadCount > 0 && ( - <UnreadCountWidget value={page.unreadCount} /> - )} - </Tabs.Tab> - ))} + {pages.map((page) => { + const actual = pagesRecord[page]; + return ( + <Tabs.Tab + key={page} + selected={page === currentPageId} + onClick={() => changeChatPage(actual)} + > + {actual.name} + {!actual.hideUnreadCount && actual.unreadCount > 0 && ( + <UnreadCountWidget value={actual.unreadCount} /> + )} + </Tabs.Tab> + ); + })} </Tabs> </Stack.Item> <Stack.Item> @@ -49,8 +51,8 @@ export function ChatTabs(props) { color="transparent" icon="plus" onClick={() => { - dispatch(addChatPage()); - dispatch(openChatSettings()); + addChatPage(); + setSettingsVisible(true); }} /> </Stack.Item> diff --git a/tgui/packages/tgui-panel/chat/actions.js b/tgui/packages/tgui-panel/chat/actions.js deleted file mode 100644 index 0b6a73f659a7..000000000000 --- a/tgui/packages/tgui-panel/chat/actions.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { createAction } from 'common/redux'; - -import { createPage } from './model'; - -export const loadChat = createAction('chat/load'); -export const rebuildChat = createAction('chat/rebuild'); -export const clearChat = createAction('chat/clear'); -export const updateMessageCount = createAction('chat/updateMessageCount'); -export const addChatPage = createAction('chat/addPage', () => ({ - payload: createPage(), -})); -export const changeChatPage = createAction('chat/changePage'); -export const updateChatPage = createAction('chat/updatePage'); -export const toggleAcceptedType = createAction('chat/toggleAcceptedType'); -export const removeChatPage = createAction('chat/removePage'); -export const changeScrollTracking = createAction('chat/changeScrollTracking'); -export const saveChatToDisk = createAction('chat/saveToDisk'); -export const moveChatPageLeft = createAction('chat/movePageLeft'); -export const moveChatPageRight = createAction('chat/movePageRight'); diff --git a/tgui/packages/tgui-panel/chat/atom.ts b/tgui/packages/tgui-panel/chat/atom.ts new file mode 100644 index 000000000000..0f59adab527c --- /dev/null +++ b/tgui/packages/tgui-panel/chat/atom.ts @@ -0,0 +1,29 @@ +import { atom } from 'jotai'; +import { createMainPage } from './model'; + +export const mainPage = createMainPage(); + +export const versionAtom = atom(5); +export const scrollTrackingAtom = atom(true); +export const chatPagesAtom = atom([mainPage.id]); +export const currentPageIdAtom = atom(mainPage.id); +export const chatPagesRecordAtom = atom({ + [mainPage.id]: mainPage, +}); + +/** Chat has been initialized from storage */ +export const chatLoadedAtom = atom(false); + +export const allChatAtom = atom((get) => ({ + version: get(versionAtom), + currentPageId: get(currentPageIdAtom), + scrollTracking: get(scrollTrackingAtom), + pages: get(chatPagesAtom), + pageById: get(chatPagesRecordAtom), +})); + +export const currentPageAtom = atom((get) => { + const pageId = get(currentPageIdAtom); + const pagesById = get(chatPagesRecordAtom); + return pagesById[pageId]; +}); diff --git a/tgui/packages/tgui-panel/chat/constants.ts b/tgui/packages/tgui-panel/chat/constants.ts index c93d1c40e994..ad6ee916adc4 100644 --- a/tgui/packages/tgui-panel/chat/constants.ts +++ b/tgui/packages/tgui-panel/chat/constants.ts @@ -29,6 +29,7 @@ export const MESSAGE_TYPE_INFO = 'info'; export const MESSAGE_TYPE_WARNING = 'warning'; export const MESSAGE_TYPE_DEADCHAT = 'deadchat'; export const MESSAGE_TYPE_OOC = 'ooc'; +export const MESSAGE_TYPE_LOOC = 'looc'; // DARKPACK EDIT ADD export const MESSAGE_TYPE_ADMINPM = 'adminpm'; export const MESSAGE_TYPE_COMBAT = 'combat'; export const MESSAGE_TYPE_ADMINCHAT = 'adminchat'; @@ -39,8 +40,18 @@ export const MESSAGE_TYPE_ADMINLOG = 'adminlog'; export const MESSAGE_TYPE_ATTACKLOG = 'attacklog'; export const MESSAGE_TYPE_DEBUG = 'debug'; +type MessageType = { + type: string; + name: string; + description: string; +} & Partial<{ + selector: string; + important: boolean; + admin: boolean; +}>; + // Metadata for each message type -export const MESSAGE_TYPES = [ +export const MESSAGE_TYPES: MessageType[] = [ // Always-on types { type: MESSAGE_TYPE_SYSTEM, @@ -54,14 +65,14 @@ export const MESSAGE_TYPES = [ type: MESSAGE_TYPE_LOCALCHAT, name: 'Local', description: 'In-character local messages (say, emote, etc)', - selector: '.say, .emote', + selector: '.say, .emote, .looc', // DARKPACK EDIT, ORIGINAL: selector: '.say, .emote', }, { type: MESSAGE_TYPE_RADIO, name: 'Radio', description: 'All departments of radio messages', selector: - '.alert, .minorannounce, .syndradio, .centcomradio, .aiprivradio, .comradio, .secradio, .gangradio, .engradio, .medradio, .sciradio, .suppradio, .servradio, .radio, .deptradio, .binarysay, .resonate, .abductor, .alien, .changeling', + '.alert, .minorannounce, .syndradio, .centcomradio, .aiprivradio, .comradio, .secradio, .gangradio, .engradio, .medradio, .sciradio, .suppradio, .servradio, .radio, .deptradio, .binarysay, .resonate, .abductor, .alien, .changeling, .policeradio, .clinicradio, .militaryradio, .camarillaradio, .anarchradio, .endronradio', // DARKPACK EDIT, ORIGINAL: '.alert, .minorannounce, .syndradio, .centcomradio, .aiprivradio, .comradio, .secradio, .gangradio, .engradio, .medradio, .sciradio, .suppradio, .servradio, .radio, .deptradio, .binarysay, .resonate, .abductor, .alien, .changeling', }, { type: MESSAGE_TYPE_ENTERTAINMENT, @@ -95,6 +106,14 @@ export const MESSAGE_TYPES = [ description: 'The bluewall of global OOC messages', selector: '.ooc, .adminooc, .adminobserverooc, .oocplain', }, + // DARKPACK EDIT ADD START + { + type: MESSAGE_TYPE_LOOC, + name: 'LOOC', + description: 'All local OOC messages', + selector: '.looc, .rlooc', + }, + // DARKPACK EDIT ADD END { type: MESSAGE_TYPE_ADMINPM, name: 'Admin PMs', diff --git a/tgui/packages/tgui-panel/chat/handlers.ts b/tgui/packages/tgui-panel/chat/handlers.ts new file mode 100644 index 000000000000..189366775090 --- /dev/null +++ b/tgui/packages/tgui-panel/chat/handlers.ts @@ -0,0 +1,58 @@ +import * as z from 'zod'; +import { chatRenderer } from './renderer'; + +const sequences: number[] = []; +const sequences_requested: number[] = []; + +const messageSchema = z.object({ + sequence: z.number().int().nonnegative(), + content: z.any(), +}); + +type ChatMessage = z.infer<typeof messageSchema>; + +function pushMessage(message: ChatMessage): void { + sequences.push(message.sequence); + chatRenderer.processBatch([message.content]); +} + +export function chatMessage(payload: string): void { + let message: ChatMessage; + try { + const parsed = JSON.parse(payload); + message = messageSchema.parse(parsed); + } catch (err) { + console.error(err); + return; + } + + if (sequences.includes(message.sequence)) { + return; + } + + const sequences_count = sequences.length; + if (sequences_count <= 0) { + pushMessage(message); + return; + } + + if (sequences_requested.includes(message.sequence)) { + sequences_requested.splice( + sequences_requested.indexOf(message.sequence), + 1, + ); + pushMessage(message); + return; + } + + // if we are receiving a message we requested, we can stop reliability checks + const expected_sequence = sequences[sequences_count - 1] + 1; + if (message.sequence !== expected_sequence) { + for (let req = expected_sequence; req < message.sequence; req++) { + sequences_requested.push(req); + Byond.sendMessage('chat/resend', req); + } + } + + pushMessage(message); +} diff --git a/tgui/packages/tgui-panel/chat/helpers.ts b/tgui/packages/tgui-panel/chat/helpers.ts new file mode 100644 index 000000000000..b0c729d5371e --- /dev/null +++ b/tgui/packages/tgui-panel/chat/helpers.ts @@ -0,0 +1,79 @@ +import { storage } from 'common/storage'; +import { store } from '../events/store'; +import { + allChatAtom, + chatLoadedAtom, + chatPagesAtom, + chatPagesRecordAtom, + currentPageAtom, + scrollTrackingAtom, +} from './atom'; +import { MAX_PERSISTED_MESSAGES } from './constants'; +import { canPageAcceptType, serializeMessage } from './model'; +import { chatRenderer } from './renderer'; + +chatRenderer.events.on( + 'batchProcessed', + (countByType: Record<string, number>) => { + // Use this flag to workaround unread messages caused by + // loading them from storage. Side effect of that, is that + // message count can not be trusted, only unread count. + if (store.get(chatLoadedAtom)) { + updateMessageCount(countByType); + } + }, +); + +function updateMessageCount(countByType: Record<string, number>): void { + const pagesRecord = store.get(chatPagesRecordAtom); + const pages = store.get(chatPagesAtom); + const currentPage = store.get(currentPageAtom); + const scrollTracking = store.get(scrollTrackingAtom); + + const draftpagesRecord = { ...pagesRecord }; + + for (const pageId of pages) { + const page = pagesRecord[pageId]; + let unreadCount = 0; + + for (const type in countByType) { + /// Message does not belong here + if (!canPageAcceptType(page, type)) continue; + + // Current page scroll tracked + if (page === currentPage && scrollTracking) continue; + + // This page received the same message which we can read on the current + // page + if (page !== currentPage && canPageAcceptType(currentPage, type)) { + continue; + } + unreadCount += countByType[type]; + } + + if (unreadCount > 0) { + draftpagesRecord[page.id] = { + ...page, + unreadCount: page.unreadCount + unreadCount, + }; + } + } + + store.set(chatPagesRecordAtom, draftpagesRecord); +} + +export function saveChatToStorage(): void { + const fromIndex = Math.max( + 0, + chatRenderer.messages.length - MAX_PERSISTED_MESSAGES, + ); + + const messages = chatRenderer.messages + .slice(fromIndex) + .map((message) => serializeMessage(message)); + + const allChat = store.get(allChatAtom); + + storage.set('chat-state', allChat); + storage.set('chat-messages', messages); +} diff --git a/tgui/packages/tgui-panel/chat/index.ts b/tgui/packages/tgui-panel/chat/index.ts deleted file mode 100644 index d5ad6fa92161..000000000000 --- a/tgui/packages/tgui-panel/chat/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -export { ChatPageSettings } from './ChatPageSettings'; -export { ChatPanel } from './ChatPanel'; -export { ChatTabs } from './ChatTabs'; -export { chatMiddleware } from './middleware'; -export { chatReducer } from './reducer'; diff --git a/tgui/packages/tgui-panel/chat/middleware.ts b/tgui/packages/tgui-panel/chat/middleware.ts deleted file mode 100644 index 666d3f090e55..000000000000 --- a/tgui/packages/tgui-panel/chat/middleware.ts +++ /dev/null @@ -1,209 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import type { Store } from 'common/redux'; -import { storage } from 'common/storage'; -import DOMPurify from 'dompurify'; - -import { - addHighlightSetting, - importSettings, - loadSettings, - removeHighlightSetting, - updateHighlightSetting, - updateSettings, -} from '../settings/actions'; -import { selectSettings } from '../settings/selectors'; -import { - addChatPage, - changeChatPage, - changeScrollTracking, - clearChat, - loadChat, - moveChatPageLeft, - moveChatPageRight, - rebuildChat, - removeChatPage, - saveChatToDisk, - toggleAcceptedType, - updateMessageCount, -} from './actions'; -import { MAX_PERSISTED_MESSAGES, MESSAGE_SAVE_INTERVAL } from './constants'; -import { createMessage, serializeMessage } from './model'; -import { chatRenderer } from './renderer'; -import { selectChat, selectCurrentChatPage } from './selectors'; - -// List of blacklisted tags -const FORBID_TAGS = ['a', 'iframe', 'link', 'video']; - -const saveChatToStorage = async (store: Store) => { - const state = selectChat(store.getState()); - const fromIndex = Math.max( - 0, - chatRenderer.messages.length - MAX_PERSISTED_MESSAGES, - ); - const messages = chatRenderer.messages - .slice(fromIndex) - .map((message) => serializeMessage(message)); - storage.set('chat-state', state); - storage.set('chat-messages', messages); -}; - -const loadChatFromStorage = async (store: Store) => { - const [state, messages] = await Promise.all([ - storage.get('chat-state'), - storage.get('chat-messages'), - ]); - // Discard incompatible versions - if (state && state.version <= 4) { - store.dispatch(loadChat()); - return; - } - if (messages) { - for (const message of messages) { - if (message.html) { - message.html = DOMPurify.sanitize(message.html, { - FORBID_TAGS, - }); - } - } - const batch = [ - ...messages, - createMessage({ - type: 'internal/reconnected', - }), - ]; - chatRenderer.processBatch(batch, { - prepend: true, - }); - } - store.dispatch(loadChat(state)); -}; - -export const chatMiddleware = (store: Store) => { - let initialized = false; - let loaded = false; - const sequences: number[] = []; - const sequences_requested: number[] = []; - chatRenderer.events.on('batchProcessed', (countByType) => { - // Use this flag to workaround unread messages caused by - // loading them from storage. Side effect of that, is that - // message count can not be trusted, only unread count. - if (loaded) { - store.dispatch(updateMessageCount(countByType)); - } - }); - chatRenderer.events.on('scrollTrackingChanged', (scrollTracking) => { - store.dispatch(changeScrollTracking(scrollTracking)); - }); - return (next) => (action) => { - const { type, payload } = action; - const settings = selectSettings(store.getState()); - // Load the chat once settings are loaded - if (!initialized && settings.initialized) { - setInterval(() => { - saveChatToStorage(store); - }, MESSAGE_SAVE_INTERVAL); - initialized = true; - loadChatFromStorage(store); - } - if (type === 'chat/message') { - let payload_obj; - try { - payload_obj = JSON.parse(payload); - } catch (err) { - return; - } - - const sequence: number = payload_obj.sequence; - if (sequences.includes(sequence)) { - return; - } - - const sequence_count = sequences.length; - if (sequence_count > 0) { - if (sequences_requested.includes(sequence)) { - sequences_requested.splice(sequences_requested.indexOf(sequence), 1); - // if we are receiving a message we requested, we can stop reliability checks - } else { - // cannot do reliability if we don't have any messages - const expected_sequence = sequences[sequence_count - 1] + 1; - if (sequence !== expected_sequence) { - for ( - let requesting = expected_sequence; - requesting < sequence; - requesting++ - ) { - sequences_requested.push(requesting); - Byond.sendMessage('chat/resend', requesting); - } - } - } - } - - chatRenderer.processBatch([payload_obj.content]); - sequences.push(sequence); - return; - } - if (type === loadChat.type) { - next(action); - const page = selectCurrentChatPage(store.getState()); - chatRenderer.changePage(page); - chatRenderer.onStateLoaded(); - loaded = true; - return; - } - if ( - type === changeChatPage.type || - type === addChatPage.type || - type === removeChatPage.type || - type === toggleAcceptedType.type || - type === moveChatPageLeft.type || - type === moveChatPageRight.type - ) { - next(action); - const page = selectCurrentChatPage(store.getState()); - chatRenderer.changePage(page); - return; - } - if (type === rebuildChat.type) { - chatRenderer.rebuildChat(); - return next(action); - } - - if ( - type === updateSettings.type || - type === loadSettings.type || - type === addHighlightSetting.type || - type === removeHighlightSetting.type || - type === updateHighlightSetting.type || - type === importSettings.type - ) { - next(action); - const nextSettings = selectSettings(store.getState()); - chatRenderer.setHighlight( - nextSettings.highlightSettings, - nextSettings.highlightSettingById, - ); - - return; - } - if (type === 'roundrestart') { - // Save chat as soon as possible - saveChatToStorage(store); - return next(action); - } - if (type === saveChatToDisk.type) { - chatRenderer.saveToDisk(); - return; - } - if (type === clearChat.type) { - chatRenderer.clearChat(); - return; - } - return next(action); - }; -}; diff --git a/tgui/packages/tgui-panel/chat/migration.ts b/tgui/packages/tgui-panel/chat/migration.ts new file mode 100644 index 000000000000..578ed7ea8c1d --- /dev/null +++ b/tgui/packages/tgui-panel/chat/migration.ts @@ -0,0 +1,207 @@ +import { storage } from 'common/storage'; +import { store } from '../events/store'; +import { + chatPagesAtom, + chatPagesRecordAtom, + currentPageIdAtom, + mainPage, + versionAtom, +} from './atom'; +import { chatRenderer } from './renderer'; +import { + type Page, + type StoredChatSettings, + storedSettingsSchema, +} from './types'; + +function isRecord(value: unknown): value is Record<string, unknown> { + return !!value && typeof value === 'object' && !Array.isArray(value); +} + +function normalizePageById(input: Record<string, any>): { + pageById: Record<string, Page>; + idRemap: Record<string, string>; + dirty: boolean; +} { + const pageById: Record<string, Page> = {}; + const idRemap: Record<string, string> = {}; + let dirty = false; + + // Collapse duplicates and ensure keys match `page.id`. + for (const [key, rawPage] of Object.entries(input)) { + if (!isRecord(rawPage)) { + dirty = true; + continue; + } + + const page = rawPage as unknown as Page; + const pageId = typeof page.id === 'string' ? page.id : key; + + // Treat anything marked `isMain` or using the main id as the main page. + const desiredId = + page.isMain || pageId === mainPage.id || key === mainPage.id + ? mainPage.id + : pageId; + + if (desiredId !== key) { + idRemap[key] = desiredId; + dirty = true; + } + + // If the object claims a different id than its destination key, fix it. + const normalized: Page = { + ...page, + id: desiredId, + isMain: desiredId === mainPage.id ? true : page.isMain, + }; + + // If a duplicate exists, prefer the entry already under the correct key. + if (pageById[desiredId]) { + // Prefer whichever came from the correct key (stability). + const existingFromCorrectKey = desiredId in input; + const currentIsCorrectKey = key === desiredId; + if (currentIsCorrectKey && !existingFromCorrectKey) { + pageById[desiredId] = normalized; + } + dirty = true; + continue; + } + + pageById[desiredId] = normalized; + } + + return { pageById, idRemap, dirty }; +} + +function createOrderedPages( + storedPages: string[], + pageById: Record<string, any>, +): { pages: string[]; dirty: boolean } { + const pageIds = new Set(Object.keys(pageById)); + const pages: string[] = []; + const seen = new Set<string>(); + let dirty = false; + + for (const id of storedPages) { + if (!pageIds.has(id) || seen.has(id)) { + dirty = true; + continue; + } + seen.add(id); + pages.push(id); + } + + for (const id of Object.keys(pageById)) { + if (seen.has(id)) continue; + seen.add(id); + pages.push(id); + dirty = true; + } + + return { pages, dirty }; +} + +export function normalizeChatSettings(loaded: StoredChatSettings): { + settings: StoredChatSettings; + dirty: boolean; +} { + let dirty = false; + + // `pageById` is the source of truth. + const { + pageById: draft, + idRemap, + dirty: pageByIdDirty, + } = normalizePageById(loaded.pageById); + dirty ||= pageByIdDirty; + + if (!draft[mainPage.id]) { + draft[mainPage.id] = { ...mainPage }; + dirty = true; + } + + // Remap `pages` according to any id changes. + const remappedPages = loaded.pages.map((id) => idRemap[id] ?? id); + if (remappedPages.some((id, idx) => id !== loaded.pages[idx])) { + dirty = true; + } + + const { pages, dirty: pagesDirty } = createOrderedPages(remappedPages, draft); + dirty ||= pagesDirty; + + // Ensures at least one page exists. + const normalizedPages = pages.length ? pages : [mainPage.id]; + if (!pages.length) dirty = true; + + let currentPageId = idRemap[loaded.currentPageId] ?? loaded.currentPageId; + if (currentPageId !== loaded.currentPageId) dirty = true; + if (!draft[currentPageId]) { + currentPageId = normalizedPages[0]; + dirty = true; + } + + // Normalize per-page state. This is the canonical place where we + // compensate for older/broken stored settings. + const defaultFilters = mainPage.acceptedTypes; + for (const id of normalizedPages) { + const page = draft[id]; + if (!page) { + dirty = true; + continue; + } + + if (!page.acceptedTypes || typeof page.acceptedTypes !== 'object') { + page.acceptedTypes = {}; + dirty = true; + } + + for (const type of Object.keys(defaultFilters)) { + if (page.acceptedTypes[type] === undefined) { + page.acceptedTypes[type] = defaultFilters[type]; + dirty = true; + } + } + + // Avoid persisting and restoring unread counts. + if (page.unreadCount !== 0) { + page.unreadCount = 0; + dirty = true; + } + } + + return { + settings: { + ...loaded, + pages: normalizedPages, + currentPageId, + pageById: draft, + }, + dirty, + }; +} + +export function startChatStateMigration(state: StoredChatSettings): void { + const parsed = storedSettingsSchema.safeParse(state); + if (!parsed.success) { + console.error('Failed to parse stored chat settings:', parsed.error); + return; + } + const { settings: loaded, dirty: wasInconsistent } = normalizeChatSettings( + parsed.data, + ); + + if (wasInconsistent) { + console.error('Chat settings were inconsistent, rewriting to storage'); + console.log('Comparison, stored vs update:', state, loaded); + storage.set('chat-state', loaded); + } + + store.set(versionAtom, loaded.version); + store.set(chatPagesAtom, loaded.pages); + store.set(currentPageIdAtom, loaded.currentPageId); + store.set(chatPagesRecordAtom, loaded.pageById); + + chatRenderer.changePage(loaded.pageById[loaded.currentPageId]); + + console.log('Restored chat settings:', loaded); +} diff --git a/tgui/packages/tgui-panel/chat/model.js b/tgui/packages/tgui-panel/chat/model.js deleted file mode 100644 index 9d08f27ab02a..000000000000 --- a/tgui/packages/tgui-panel/chat/model.js +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { createUuid } from 'tgui-core/uuid'; - -import { MESSAGE_TYPE_INTERNAL, MESSAGE_TYPES } from './constants'; - -export const canPageAcceptType = (page, type) => - type.startsWith(MESSAGE_TYPE_INTERNAL) || page.acceptedTypes[type]; - -export const createPage = (obj) => { - const acceptedTypes = {}; - - for (const typeDef of MESSAGE_TYPES) { - acceptedTypes[typeDef.type] = !!typeDef.important; - } - - return { - isMain: false, - id: createUuid(), - name: 'New Tab', - acceptedTypes: acceptedTypes, - unreadCount: 0, - hideUnreadCount: false, - createdAt: Date.now(), - ...obj, - }; -}; - -export const createMainPage = () => { - const acceptedTypes = {}; - for (const typeDef of MESSAGE_TYPES) { - acceptedTypes[typeDef.type] = true; - } - return createPage({ - isMain: true, - name: 'Main', - acceptedTypes, - }); -}; - -export const createMessage = (payload) => ({ - createdAt: Date.now(), - ...payload, -}); - -export const serializeMessage = (message) => ({ - type: message.type, - text: message.text, - html: message.html, - times: message.times, - createdAt: message.createdAt, -}); - -export const isSameMessage = (a, b) => - (typeof a.text === 'string' && a.text === b.text) || - (typeof a.html === 'string' && a.html === b.html); diff --git a/tgui/packages/tgui-panel/chat/model.ts b/tgui/packages/tgui-panel/chat/model.ts new file mode 100644 index 000000000000..c0a0393dd1f1 --- /dev/null +++ b/tgui/packages/tgui-panel/chat/model.ts @@ -0,0 +1,85 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { createUuid } from 'tgui-core/uuid'; + +import { MESSAGE_TYPE_INTERNAL, MESSAGE_TYPES } from './constants'; +import type { Page } from './types'; + +export function canPageAcceptType(page: Page, type: string): boolean { + return type.startsWith(MESSAGE_TYPE_INTERNAL) || page.acceptedTypes[type]; +} + +export function createPage(obj: Record<string, unknown> = {}): Page { + const acceptedTypes = {}; + + for (const typeDef of MESSAGE_TYPES) { + acceptedTypes[typeDef.type] = !!typeDef.important; + } + + return { + isMain: false, + id: createUuid(), + name: 'New Tab', + acceptedTypes, + unreadCount: 0, + hideUnreadCount: false, + createdAt: Date.now(), + ...obj, + }; +} + +export function createMainPage(): Page { + const acceptedTypes = {}; + for (const typeDef of MESSAGE_TYPES) { + acceptedTypes[typeDef.type] = true; + } + return createPage({ + id: 'main', + isMain: true, + name: 'Main', + acceptedTypes, + }); +} + +export function createMessage( + payload: Record<string, unknown>, +): SerializedMessage { + return { createdAt: Date.now(), ...payload } as SerializedMessage; +} + +export function serializeMessage( + message: SerializedMessage, +): SerializedMessage { + return { + type: message.type, + text: message.text, + html: message.html, + times: message.times, + createdAt: message.createdAt, + }; +} + +export function isSameMessage( + a: SerializedMessage, + b: SerializedMessage, +): boolean { + return ( + (typeof a.text === 'string' && a.text === b.text) || + (typeof a.html === 'string' && a.html === b.html) + ); +} + +type SerializedMessage = { + type: string; + createdAt: number; +} & Partial<{ + text: string; + html: string; + times: number; + node: HTMLElement; + avoidHighlighting: boolean; +}>; diff --git a/tgui/packages/tgui-panel/chat/reducer.ts b/tgui/packages/tgui-panel/chat/reducer.ts deleted file mode 100644 index bf33554fceac..000000000000 --- a/tgui/packages/tgui-panel/chat/reducer.ts +++ /dev/null @@ -1,261 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { importSettings } from '../settings/actions'; -import { - addChatPage, - changeChatPage, - changeScrollTracking, - loadChat, - moveChatPageLeft, - moveChatPageRight, - removeChatPage, - toggleAcceptedType, - updateChatPage, - updateMessageCount, -} from './actions'; -import { canPageAcceptType, createMainPage } from './model'; -import type { Page } from './types'; - -const mainPage = createMainPage(); - -export const initialState = { - version: 5, - currentPageId: mainPage.id, - scrollTracking: true, - pages: [mainPage.id], - pageById: { - [mainPage.id]: mainPage, - }, -}; - -export const chatReducer = (state = initialState, action) => { - const { type, payload } = action; - if (type === loadChat.type) { - // Validate version and/or migrate state - if (payload?.version !== state.version) { - return state; - } - // Enable any filters that are not explicitly set, that are - // enabled by default on the main page. - // NOTE: This mutates acceptedTypes on the state. - for (const id of Object.keys(payload.pageById)) { - const page = payload.pageById[id]; - const filters = page.acceptedTypes; - const defaultFilters = mainPage.acceptedTypes; - for (const type of Object.keys(defaultFilters)) { - if (filters[type] === undefined) { - filters[type] = defaultFilters[type]; - } - } - } - // Reset page message counts - // NOTE: We are mutably changing the payload on the assumption - // that it is a copy that comes straight from the web storage. - for (const id of Object.keys(payload.pageById)) { - const page = payload.pageById[id]; - page.unreadCount = 0; - } - return { - ...state, - ...payload, - }; - } - if (type === changeScrollTracking.type) { - const scrollTracking = payload; - const nextState = { - ...state, - scrollTracking, - }; - if (scrollTracking) { - const pageId = state.currentPageId; - const page = { - ...state.pageById[pageId], - unreadCount: 0, - }; - nextState.pageById = { - ...state.pageById, - [pageId]: page, - }; - } - return nextState; - } - if (type === updateMessageCount.type) { - const countByType = payload; - const pages = state.pages.map((id) => state.pageById[id]); - const currentPage = state.pageById[state.currentPageId]; - const nextPageById = { ...state.pageById }; - for (const page of pages) { - let unreadCount = 0; - for (const type of Object.keys(countByType)) { - // Message does not belong here - if (!canPageAcceptType(page, type)) { - continue; - } - // Current page is scroll tracked - if (page === currentPage && state.scrollTracking) { - continue; - } - // This page received the same message which we can read - // on the current page. - if (page !== currentPage && canPageAcceptType(currentPage, type)) { - continue; - } - unreadCount += countByType[type]; - } - if (unreadCount > 0) { - nextPageById[page.id] = { - ...page, - unreadCount: page.unreadCount + unreadCount, - }; - } - } - return { - ...state, - pageById: nextPageById, - }; - } - if (type === addChatPage.type) { - return { - ...state, - currentPageId: payload.id, - pages: [...state.pages, payload.id], - pageById: { - ...state.pageById, - [payload.id]: payload, - }, - }; - } - if (type === importSettings.type) { - const pagesById: Record<string, Page>[] = payload.newPages; - if (!pagesById) { - return state; - } - const newPageIds: string[] = Object.keys(pagesById); - if (!newPageIds) { - return state; - } - - const nextState = { - ...state, - currentPageId: newPageIds[0], - pages: [...newPageIds], - pageById: { ...pagesById }, - }; - return nextState; - } - if (type === changeChatPage.type) { - const { pageId } = payload; - const page = { - ...state.pageById[pageId], - unreadCount: 0, - }; - return { - ...state, - currentPageId: pageId, - pageById: { - ...state.pageById, - [pageId]: page, - }, - }; - } - if (type === updateChatPage.type) { - const { pageId, ...update } = payload; - const page = { - ...state.pageById[pageId], - ...update, - }; - return { - ...state, - pageById: { - ...state.pageById, - [pageId]: page, - }, - }; - } - if (type === toggleAcceptedType.type) { - const { pageId, type } = payload; - const page = { ...state.pageById[pageId] }; - page.acceptedTypes = { ...page.acceptedTypes }; - page.acceptedTypes[type] = !page.acceptedTypes[type]; - return { - ...state, - pageById: { - ...state.pageById, - [pageId]: page, - }, - }; - } - if (type === removeChatPage.type) { - const { pageId } = payload; - const nextState = { - ...state, - pages: [...state.pages], - pageById: { - ...state.pageById, - }, - }; - delete nextState.pageById[pageId]; - nextState.pages = nextState.pages.filter((id) => id !== pageId); - if (nextState.pages.length === 0) { - nextState.pages.push(mainPage.id); - nextState.pageById[mainPage.id] = mainPage; - nextState.currentPageId = mainPage.id; - } - if (!nextState.currentPageId || nextState.currentPageId === pageId) { - nextState.currentPageId = nextState.pages[0]; - } - return nextState; - } - if (type === moveChatPageLeft.type) { - const { pageId } = payload; - const nextState = { - ...state, - pages: [...state.pages], - pageById: { - ...state.pageById, - }, - }; - const tmpPage = nextState.pageById[pageId]; - const fromIndex = nextState.pages.indexOf(tmpPage.id); - const toIndex = fromIndex - 1; - // don't ever move leftmost page - if (fromIndex > 0) { - // don't ever move anything to the leftmost page - if (toIndex > 0) { - const tmp = nextState.pages[fromIndex]; - nextState.pages[fromIndex] = nextState.pages[toIndex]; - nextState.pages[toIndex] = tmp; - } - } - return nextState; - } - - if (type === moveChatPageRight.type) { - const { pageId } = payload; - const nextState = { - ...state, - pages: [...state.pages], - pageById: { - ...state.pageById, - }, - }; - const tmpPage = nextState.pageById[pageId]; - const fromIndex = nextState.pages.indexOf(tmpPage.id); - const toIndex = fromIndex + 1; - // don't ever move leftmost page - if (fromIndex > 0) { - // don't ever move anything out of the array - if (toIndex < nextState.pages.length) { - const tmp = nextState.pages[fromIndex]; - nextState.pages[fromIndex] = nextState.pages[toIndex]; - nextState.pages[toIndex] = tmp; - } - } - return nextState; - } - return state; -}; diff --git a/tgui/packages/tgui-panel/chat/renderer.jsx b/tgui/packages/tgui-panel/chat/renderer.jsx deleted file mode 100644 index 4c30678367e8..000000000000 --- a/tgui/packages/tgui-panel/chat/renderer.jsx +++ /dev/null @@ -1,657 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { createRoot } from 'react-dom/client'; -import { createLogger } from 'tgui/logging'; -import { Tooltip } from 'tgui-core/components'; -import { EventEmitter } from 'tgui-core/events'; -import { classes } from 'tgui-core/react'; - -import { - COMBINE_MAX_MESSAGES, - COMBINE_MAX_TIME_WINDOW, - IMAGE_RETRY_DELAY, - IMAGE_RETRY_LIMIT, - IMAGE_RETRY_MESSAGE_AGE, - MAX_PERSISTED_MESSAGES, - MAX_VISIBLE_MESSAGES, - MESSAGE_PRUNE_INTERVAL, - MESSAGE_TYPE_INTERNAL, - MESSAGE_TYPE_UNKNOWN, - MESSAGE_TYPES, -} from './constants'; -import { canPageAcceptType, createMessage, isSameMessage } from './model'; -import { highlightNode, linkifyNode } from './replaceInTextNode'; - -const logger = createLogger('chatRenderer'); - -// We consider this as the smallest possible scroll offset -// that is still trackable. -const SCROLL_TRACKING_TOLERANCE = 24; - -// List of injectable component names to the actual type -export const TGUI_CHAT_COMPONENTS = { - Tooltip, -}; - -// List of injectable attibute names mapped to their proper prop -// We need this because attibutes don't support lowercase names -export const TGUI_CHAT_ATTRIBUTES_TO_PROPS = { - position: 'position', - content: 'content', -}; - -const findNearestScrollableParent = (startingNode) => { - const body = document.body; - let node = startingNode; - while (node && node !== body) { - // This definitely has a vertical scrollbar, because it reduces - // scrollWidth of the element. Might not work if element uses - // overflow: hidden. - if (node.scrollWidth < node.offsetWidth) { - return node; - } - node = node.parentNode; - } - return window; -}; - -const createHighlightNode = (text, color) => { - const node = document.createElement('span'); - node.className = 'Chat__highlight'; - node.setAttribute('style', `background-color:${color}`); - node.textContent = text; - return node; -}; - -const createMessageNode = () => { - const node = document.createElement('div'); - node.className = 'ChatMessage'; - return node; -}; - -const createReconnectedNode = () => { - const node = document.createElement('div'); - node.className = 'Chat__reconnected'; - return node; -}; - -const handleImageError = (e) => { - setTimeout(() => { - /** @type {HTMLImageElement} */ - const node = e.target; - if (!node) { - return; - } - const attempts = parseInt(node.getAttribute('data-reload-n'), 10) || 0; - if (attempts >= IMAGE_RETRY_LIMIT) { - logger.error(`failed to load an image after ${attempts} attempts`); - return; - } - const src = node.src; - node.src = null; - node.src = `${src}#${attempts}`; - node.setAttribute('data-reload-n', attempts + 1); - }, IMAGE_RETRY_DELAY); -}; - -/** - * Assigns a "times-repeated" badge to the message. - */ -const updateMessageBadge = (message) => { - const { node, times } = message; - if (!node || !times) { - // Nothing to update - return; - } - const foundBadge = node.querySelector('.Chat__badge'); - const badge = foundBadge || document.createElement('div'); - badge.textContent = times; - badge.className = classes(['Chat__badge', 'Chat__badge--animate']); - requestAnimationFrame(() => { - badge.className = 'Chat__badge'; - }); - if (!foundBadge) { - node.appendChild(badge); - } -}; - -class ChatRenderer { - constructor() { - /** @type {HTMLElement} */ - this.loaded = false; - /** @type {HTMLElement} */ - this.rootNode = null; - this.queue = []; - this.messages = []; - this.visibleMessages = []; - this.page = null; - this.events = new EventEmitter(); - // Scroll handler - /** @type {HTMLElement} */ - this.scrollNode = null; - this.scrollTracking = true; - this.lastScrollHeight = 0; - this.handleScroll = (type) => { - const node = this.scrollNode; - if (!node) { - return; - } - const height = node.scrollHeight; - const bottom = node.scrollTop + node.offsetHeight; - const scrollTracking = - Math.abs(height - bottom) < SCROLL_TRACKING_TOLERANCE || - this.lastScrollHeight === 0; - if (scrollTracking !== this.scrollTracking) { - this.scrollTracking = scrollTracking; - this.events.emit('scrollTrackingChanged', scrollTracking); - logger.debug('tracking', this.scrollTracking); - } - }; - this.ensureScrollTracking = () => { - if (this.scrollTracking) { - this.scrollToBottom(); - } - }; - // Periodic message pruning - setInterval(() => this.pruneMessages(), MESSAGE_PRUNE_INTERVAL); - } - - isReady() { - return this.loaded && this.rootNode && this.page; - } - - mount(node) { - // Mount existing root node on top of the new node - if (this.rootNode) { - node.appendChild(this.rootNode); - } - // Initialize the root node - else { - this.rootNode = node; - } - // Find scrollable parent - this.scrollNode = findNearestScrollableParent(this.rootNode); - this.scrollNode.addEventListener('scroll', this.handleScroll); - setTimeout(() => { - this.scrollToBottom(); - }); - // Flush the queue - this.tryFlushQueue(); - } - - onStateLoaded() { - this.loaded = true; - this.tryFlushQueue(); - } - - tryFlushQueue() { - if (this.isReady() && this.queue.length > 0) { - this.processBatch(this.queue); - this.queue = []; - } - } - - assignStyle(style = {}) { - for (const key of Object.keys(style)) { - this.rootNode.style.setProperty(key, style[key]); - } - } - - setHighlight(highlightSettings, highlightSettingById) { - this.highlightParsers = null; - if (!highlightSettings) { - return; - } - highlightSettings.map((id) => { - const setting = highlightSettingById[id]; - const text = setting.highlightText; - const highlightColor = setting.highlightColor; - const highlightWholeMessage = setting.highlightWholeMessage; - const matchWord = setting.matchWord; - const matchCase = setting.matchCase; - const allowedRegex = /^[a-zа-яё0-9_\-$/^[\s\]\\]+$/gi; - const regexEscapeCharacters = /[!#$%^&*)(+=.<>{}[\]:;'"|~`_\-\\/]/g; - const lines = String(text) - .split(',') - .map((str) => str.trim()) - .filter((str) => { - // Must be longer than one character - if (!str || str.length <= 1) return false; - - // Must be alphanumeric (with some punctuation) - const isValidFormat = - allowedRegex.test(str) || - (str.charAt(0) === '/' && str.charAt(str.length - 1) === '/'); - - // Reset lastIndex so it does not mess up the next word - allowedRegex.lastIndex = 0; - - return isValidFormat; - }); - let highlightWords; - let highlightRegex; - // Nothing to match, reset highlighting - if (lines.length === 0) { - return; - } - const regexExpressions = []; - // Organize each highlight entry into regex expressions and words - for (let line of lines) { - // Regex expression syntax is /[exp]/ - if (line.charAt(0) === '/' && line.charAt(line.length - 1) === '/') { - const expr = line.substring(1, line.length - 1); - // Check if this is more than one character - if (/^(\[.*\]|\\.|.)$/.test(expr)) { - continue; - } - regexExpressions.push(expr); - } else { - // Lazy init - 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'}`; - // 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) { - this.highlightParsers = []; - } - this.highlightParsers.push({ - highlightWords, - highlightRegex, - highlightColor, - highlightWholeMessage, - }); - }); - } - - scrollToBottom() { - // scrollHeight is always bigger than scrollTop and is - // automatically clamped to the valid range. - this.scrollNode.scrollTop = this.scrollNode.scrollHeight; - } - - changePage(page) { - if (!this.isReady()) { - this.page = page; - this.tryFlushQueue(); - return; - } - this.page = page; - // Fast clear of the root node - this.rootNode.textContent = ''; - this.visibleMessages = []; - // Re-add message nodes - const fragment = document.createDocumentFragment(); - let node; - for (const message of this.messages) { - if (canPageAcceptType(page, message.type)) { - node = message.node; - fragment.appendChild(node); - this.visibleMessages.push(message); - } - } - if (node) { - this.rootNode.appendChild(fragment); - node.scrollIntoView(); - } - } - - getCombinableMessage(predicate) { - const now = Date.now(); - const len = this.visibleMessages.length; - const from = len - 1; - const to = Math.max(0, len - COMBINE_MAX_MESSAGES); - for (let i = from; i >= to; i--) { - const message = this.visibleMessages[i]; - - const matches = - // Is not an internal message - !message.type.startsWith(MESSAGE_TYPE_INTERNAL) && - // Text payload must fully match - isSameMessage(message, predicate) && - // Must land within the specified time window - now < message.createdAt + COMBINE_MAX_TIME_WINDOW; - if (matches) { - return message; - } - } - return null; - } - - processBatch(batch, options = {}) { - const { prepend, notifyListeners = true } = options; - const now = Date.now(); - // Queue up messages until chat is ready - if (!this.isReady()) { - if (prepend) { - this.queue = [...batch, ...this.queue]; - } else { - this.queue = [...this.queue, ...batch]; - } - return; - } - // Store last scroll position - if (this.scrollNode) { - this.lastScrollHeight = this.scrollNode.scrollHeight; - } - // Insert messages - const fragment = document.createDocumentFragment(); - const countByType = {}; - let node; - for (const payload of batch) { - const message = createMessage(payload); - // Combine messages - const combinable = this.getCombinableMessage(message); - if (combinable) { - combinable.times = (combinable.times || 1) + 1; - updateMessageBadge(combinable); - continue; - } - // Reuse message node - if (message.node) { - node = message.node; - } - // Reconnected - else if (message.type === 'internal/reconnected') { - node = createReconnectedNode(); - } - // Create message node - else { - node = createMessageNode(); - // Payload is plain text - if (message.text) { - node.textContent = message.text; - } - // Payload is HTML - else if (message.html) { - node.innerHTML = message.html; - } else { - logger.error('Error: message is missing text payload', message); - } - // Get all nodes in this message that want to be rendered like jsx - const nodes = node.querySelectorAll('[data-component]'); - for (let i = 0; i < nodes.length; i++) { - const childNode = nodes[i]; - const targetName = childNode.getAttribute('data-component'); - // Let's pull out the attibute info we need - const outputProps = {}; - for (let j = 0; j < childNode.attributes.length; j++) { - const attribute = childNode.attributes[j]; - - let working_value = attribute.nodeValue; - // We can't do the "if it has no value it's truthy" trick - // Because getAttribute returns "", not null. Hate IE - if (working_value === '$true') { - working_value = true; - } else if (working_value === '$false') { - working_value = false; - } else if (!Number.isNaN(working_value)) { - const parsed_float = parseFloat(working_value); - if (!Number.isNaN(parsed_float)) { - working_value = parsed_float; - } - } - - let canon_name = attribute.nodeName.replace('data-', ''); - // html attributes don't support upper case chars, so we need to map - canon_name = TGUI_CHAT_ATTRIBUTES_TO_PROPS[canon_name]; - outputProps[canon_name] = working_value; - } - const oldHtml = { __html: childNode.innerHTML }; - while (childNode.firstChild) { - childNode.removeChild(childNode.firstChild); - } - const Element = TGUI_CHAT_COMPONENTS[targetName]; - - const reactRoot = createRoot(childNode); - - // biome-ignore-start lint/security/noDangerouslySetInnerHtml: ignore - reactRoot.render( - <Element {...outputProps}> - <span dangerouslySetInnerHTML={oldHtml} /> - </Element>, - childNode, - ); - // biome-ignore-end lint/security/noDangerouslySetInnerHtml: ignore - } - - // Highlight text - if (!message.avoidHighlighting && this.highlightParsers) { - this.highlightParsers.map((parser) => { - const highlighted = highlightNode( - node, - parser.highlightRegex, - parser.highlightWords, - (text) => createHighlightNode(text, parser.highlightColor), - ); - if (highlighted && parser.highlightWholeMessage) { - node.className += ' ChatMessage--highlighted'; - } - }); - } - // Linkify text - const linkifyNodes = node.querySelectorAll('.linkify'); - for (let i = 0; i < linkifyNodes.length; ++i) { - linkifyNode(linkifyNodes[i]); - } - // Assign an image error handler - if (now < message.createdAt + IMAGE_RETRY_MESSAGE_AGE) { - const imgNodes = node.querySelectorAll('img'); - for (let i = 0; i < imgNodes.length; i++) { - const imgNode = imgNodes[i]; - imgNode.addEventListener('error', handleImageError); - } - } - } - // Store the node in the message - message.node = node; - // Query all possible selectors to find out the message type - if (!message.type) { - const typeDef = MESSAGE_TYPES.find( - (typeDef) => typeDef.selector && node.querySelector(typeDef.selector), - ); - message.type = typeDef?.type || MESSAGE_TYPE_UNKNOWN; - } - updateMessageBadge(message); - if (!countByType[message.type]) { - countByType[message.type] = 0; - } - countByType[message.type] += 1; - // TODO: Detect duplicates - this.messages.push(message); - if (canPageAcceptType(this.page, message.type)) { - fragment.appendChild(node); - this.visibleMessages.push(message); - } - } - if (node) { - const firstChild = this.rootNode.childNodes[0]; - if (prepend && firstChild) { - this.rootNode.insertBefore(fragment, firstChild); - } else { - this.rootNode.appendChild(fragment); - } - if (this.scrollTracking) { - setTimeout(() => this.scrollToBottom()); - } - } - // Notify listeners that we have processed the batch - if (notifyListeners) { - this.events.emit('batchProcessed', countByType); - } - } - - pruneMessages() { - if (!this.isReady()) { - return; - } - // Delay pruning because user is currently interacting - // with chat history - if (!this.scrollTracking) { - logger.debug('pruning delayed'); - return; - } - // Visible messages - { - const messages = this.visibleMessages; - const fromIndex = Math.max(0, messages.length - MAX_VISIBLE_MESSAGES); - if (fromIndex > 0) { - this.visibleMessages = messages.slice(fromIndex); - for (let i = 0; i < fromIndex; i++) { - const message = messages[i]; - this.rootNode.removeChild(message.node); - // Mark this message as pruned - message.node = 'pruned'; - } - // Remove pruned messages from the message array - - this.messages = this.messages.filter( - (message) => message.node !== 'pruned', - ); - logger.log(`pruned ${fromIndex} visible messages`); - } - } - // All messages - { - const fromIndex = Math.max( - 0, - this.messages.length - MAX_PERSISTED_MESSAGES, - ); - if (fromIndex > 0) { - this.messages = this.messages.slice(fromIndex); - logger.log(`pruned ${fromIndex} stored messages`); - } - } - } - - rebuildChat() { - if (!this.isReady()) { - return; - } - // Make a copy of messages - const fromIndex = Math.max( - 0, - this.messages.length - MAX_PERSISTED_MESSAGES, - ); - const messages = this.messages.slice(fromIndex); - // Remove existing nodes - for (const message of messages) { - message.node = undefined; - } - // Fast clear of the root node - this.rootNode.textContent = ''; - this.messages = []; - this.visibleMessages = []; - // Repopulate the chat log - this.processBatch(messages, { - notifyListeners: false, - }); - } - - /** - * @clearChat - * @copyright 2023 - * @author Cheffie - * @link https://github.com/CheffieGithub - * @license MIT - */ - clearChat() { - const messages = this.visibleMessages; - this.visibleMessages = []; - for (let i = 0; i < messages.length; i++) { - const message = messages[i]; - this.rootNode.removeChild(message.node); - // Mark this message as pruned - message.node = 'pruned'; - } - // Remove pruned messages from the message array - this.messages = this.messages.filter( - (message) => message.node !== 'pruned', - ); - logger.log(`Cleared chat`); - } - - saveToDisk() { - // Compile currently loaded stylesheets as CSS text - let cssText = ''; - const styleSheets = document.styleSheets; - for (let i = 0; i < styleSheets.length; i++) { - const cssRules = styleSheets[i].cssRules; - for (let i = 0; i < cssRules.length; i++) { - const rule = cssRules[i]; - if (rule && typeof rule.cssText === 'string') { - cssText += `${rule.cssText}\n`; - } - } - } - cssText += 'body, html { background-color: #141414 }\n'; - // Compile chat log as HTML text - let messagesHtml = ''; - for (const message of this.visibleMessages) { - if (message.node) { - messagesHtml += `${message.node.outerHTML}\n`; - } - } - // Create a page - - const pageHtml = - '<!doctype html>\n' + - '<html>\n' + - '<head>\n' + - '<title>SS13 Chat Log\n' + - '\n' + - '\n' + - '\n' + - '
    \n' + - messagesHtml + - '
    \n' + - '\n' + - '\n'; - // Create and send a nice blob - const blob = new Blob([pageHtml], { type: 'text/plain' }); - const timestamp = new Date() - .toISOString() - .substring(0, 19) - .replace(/[-:]/g, '') - .replace('T', '-'); - Byond.saveBlob(blob, `ss13-chatlog-${timestamp}.html`, '.html'); - } -} - -// Make chat renderer global so that we can continue using the same -// instance after hot code replacement. -if (!window.__chatRenderer__) { - window.__chatRenderer__ = new ChatRenderer(); -} - -/** @type {ChatRenderer} */ -export const chatRenderer = window.__chatRenderer__; diff --git a/tgui/packages/tgui-panel/chat/renderer.tsx b/tgui/packages/tgui-panel/chat/renderer.tsx new file mode 100644 index 000000000000..5f46364e829d --- /dev/null +++ b/tgui/packages/tgui-panel/chat/renderer.tsx @@ -0,0 +1,649 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { createRoot } from 'react-dom/client'; +import { createLogger } from 'tgui/logging'; +import { Tooltip } from 'tgui-core/components'; +import { EventEmitter } from 'tgui-core/events'; +import { classes } from 'tgui-core/react'; +import { store } from '../events/store'; +import { scrollTrackingAtom } from './atom'; +import { + COMBINE_MAX_MESSAGES, + COMBINE_MAX_TIME_WINDOW, + IMAGE_RETRY_DELAY, + IMAGE_RETRY_LIMIT, + IMAGE_RETRY_MESSAGE_AGE, + MAX_PERSISTED_MESSAGES, + MAX_VISIBLE_MESSAGES, + MESSAGE_PRUNE_INTERVAL, + MESSAGE_TYPE_INTERNAL, + MESSAGE_TYPE_UNKNOWN, + MESSAGE_TYPES, +} from './constants'; +import { canPageAcceptType, createMessage, isSameMessage } from './model'; +import { highlightNode, linkifyNode } from './replaceInTextNode'; + +const logger = createLogger('chatRenderer'); + +// We consider this as the smallest possible scroll offset +// that is still trackable. +const SCROLL_TRACKING_TOLERANCE = 24; + +// List of injectable component names to the actual type +export const TGUI_CHAT_COMPONENTS = { + Tooltip, +}; + +// List of injectable attibute names mapped to their proper prop +// We need this because attibutes don't support lowercase names +export const TGUI_CHAT_ATTRIBUTES_TO_PROPS = { + position: 'position', + content: 'content', +}; + +function createHighlightNode(text, color) { + const node = document.createElement('span'); + node.className = 'Chat__highlight'; + node.setAttribute('style', `background-color:${color}`); + node.textContent = text; + return node; +} + +function createMessageNode() { + const node = document.createElement('div'); + node.className = 'ChatMessage'; + return node; +} + +function createReconnectedNode() { + const node = document.createElement('div'); + node.className = 'Chat__reconnected'; + return node; +} + +function handleImageError(e) { + setTimeout(() => { + /** @type {HTMLImageElement} */ + const node = e.target; + if (!node) { + return; + } + const attempts = parseInt(node.getAttribute('data-reload-n'), 10) || 0; + if (attempts >= IMAGE_RETRY_LIMIT) { + logger.error(`failed to load an image after ${attempts} attempts`); + return; + } + const src = node.src; + node.src = null; + node.src = `${src}#${attempts}`; + node.setAttribute('data-reload-n', attempts + 1); + }, IMAGE_RETRY_DELAY); +} + +/** + * Assigns a "times-repeated" badge to the message. + */ +function updateMessageBadge(message) { + const { node, times } = message; + if (!node || !times) { + // Nothing to update + return; + } + const foundBadge = node.querySelector('.Chat__badge'); + const badge = foundBadge || document.createElement('div'); + badge.textContent = times; + badge.className = classes(['Chat__badge', 'Chat__badge--animate']); + requestAnimationFrame(() => { + badge.className = 'Chat__badge'; + }); + if (!foundBadge) { + node.appendChild(badge); + } +} + +class ChatRenderer { + loaded: boolean; + rootNode: HTMLElement | null; + queue: Array; + messages: Array; + visibleMessages: Array; + page: any; + events: EventEmitter; + scrollNode: HTMLElement | null; + scrollTracking: boolean; + lastScrollHeight: number; + highlightParsers: Array | null; + handleScroll: (type: any) => void; + + constructor() { + this.loaded = false; + this.rootNode = null; + this.queue = []; + this.messages = []; + this.visibleMessages = []; + this.page = null; + this.events = new EventEmitter(); + // Scroll handler + + this.scrollNode = null; + this.scrollTracking = true; + this.lastScrollHeight = 0; + this.handleScroll = (evt) => { + const node = this.scrollNode; + if (!node) { + return; + } + const height = node.scrollHeight; + const bottom = node.scrollTop + node.offsetHeight; + const scrollTracking = + Math.abs(height - bottom) < SCROLL_TRACKING_TOLERANCE || + this.lastScrollHeight === 0; + if (scrollTracking !== this.scrollTracking) { + this.scrollTracking = scrollTracking; + store.set(scrollTrackingAtom, scrollTracking); + logger.debug('tracking', this.scrollTracking); + } + }; + // Periodic message pruning + setInterval(() => this.pruneMessages(), MESSAGE_PRUNE_INTERVAL); + } + + isReady() { + return this.loaded && this.rootNode && this.page; + } + + mount(node) { + // Mount existing root node on top of the new node + if (this.rootNode) { + node.appendChild(this.rootNode); + } + // Initialize the root node + else { + this.rootNode = node; + } + // Find scrollable parent + this.scrollNode = document.getElementById('chat-pane'); + this.scrollNode?.addEventListener('scroll', this.handleScroll); + setTimeout(() => { + this.scrollToBottom(); + }); + // Flush the queue + this.tryFlushQueue(); + } + + onStateLoaded() { + this.loaded = true; + this.tryFlushQueue(); + } + + tryFlushQueue() { + if (this.isReady() && this.queue.length > 0) { + this.processBatch(this.queue); + this.queue = []; + } + } + + assignStyle(style = {}) { + for (const key of Object.keys(style)) { + this.rootNode!.style.setProperty(key, style[key]); + } + } + + setHighlight(highlightSettings, highlightSettingById) { + this.highlightParsers = null; + if (!highlightSettings) { + return; + } + highlightSettings.forEach((id) => { + const setting = highlightSettingById[id]; + const text = setting.highlightText; + const highlightColor = setting.highlightColor; + const highlightWholeMessage = setting.highlightWholeMessage; + const matchWord = setting.matchWord; + const matchCase = setting.matchCase; + const allowedRegex = /^[a-zа-яё0-9_\-$/^[\s\]\\]+$/gi; + const regexEscapeCharacters = /[!#$%^&*)(+=.<>{}[\]:;'"|~`_\-\\/]/g; + const lines = String(text) + .split(',') + .map((str) => str.trim()) + .filter((str) => { + // Must be longer than one character + if (!str || str.length <= 1) return false; + + // Must be alphanumeric (with some punctuation) + const isValidFormat = + allowedRegex.test(str) || + (str.charAt(0) === '/' && str.charAt(str.length - 1) === '/'); + + // Reset lastIndex so it does not mess up the next word + allowedRegex.lastIndex = 0; + + return isValidFormat; + }); + let highlightWords; + let highlightRegex; + // Nothing to match, reset highlighting + if (lines.length === 0) { + return; + } + const regexExpressions: string[] = []; + // Organize each highlight entry into regex expressions and words + for (let line of lines) { + // Regex expression syntax is /[exp]/ + if (line.charAt(0) === '/' && line.charAt(line.length - 1) === '/') { + const expr = line.substring(1, line.length - 1); + // Check if this is more than one character + if (/^(\[.*\]|\\.|.)$/.test(expr)) { + continue; + } + regexExpressions.push(expr); + } else { + // Lazy init + 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'}`; + // 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) { + this.highlightParsers = []; + } + this.highlightParsers.push({ + highlightWords, + highlightRegex, + highlightColor, + highlightWholeMessage, + }); + }); + } + + scrollToBottom() { + // scrollHeight is always bigger than scrollTop and is + // automatically clamped to the valid range. + this.scrollNode!.scrollTop = this.scrollNode!.scrollHeight; + } + + changePage(page) { + if (!this.isReady()) { + this.page = page; + this.tryFlushQueue(); + return; + } + this.page = page; + // Fast clear of the root node + this.rootNode!.textContent = ''; + this.visibleMessages = []; + // Re-add message nodes + const fragment = document.createDocumentFragment(); + let node; + for (const message of this.messages) { + if (canPageAcceptType(page, message.type)) { + node = message.node; + fragment.appendChild(node); + this.visibleMessages.push(message); + } + } + if (node) { + this.rootNode!.appendChild(fragment); + node.scrollIntoView(); + } + } + + getCombinableMessage(predicate) { + const now = Date.now(); + const len = this.visibleMessages.length; + const from = len - 1; + const to = Math.max(0, len - COMBINE_MAX_MESSAGES); + for (let i = from; i >= to; i--) { + const message = this.visibleMessages[i]; + + const matches = + // Is not an internal message + !message.type.startsWith(MESSAGE_TYPE_INTERNAL) && + // Text payload must fully match + isSameMessage(message, predicate) && + // Must land within the specified time window + now < message.createdAt + COMBINE_MAX_TIME_WINDOW; + if (matches) { + return message; + } + } + return null; + } + + processBatch( + batch, + options: { prepend?: boolean; notifyListeners?: boolean } = {}, + ) { + const { prepend, notifyListeners = true } = options; + const now = Date.now(); + // Queue up messages until chat is ready + if (!this.isReady()) { + if (prepend) { + this.queue = [...batch, ...this.queue]; + } else { + this.queue = [...this.queue, ...batch]; + } + return; + } + // Store last scroll position + if (this.scrollNode) { + this.lastScrollHeight = this.scrollNode.scrollHeight; + } + // Insert messages + const fragment = document.createDocumentFragment(); + const countByType = {}; + let node; + for (const payload of batch) { + const message = createMessage(payload); + // Combine messages + const combinable = this.getCombinableMessage(message); + if (combinable) { + combinable.times = (combinable.times || 1) + 1; + updateMessageBadge(combinable); + continue; + } + // Reuse message node + if (message.node) { + node = message.node; + } + // Reconnected + else if (message.type === 'internal/reconnected') { + node = createReconnectedNode(); + } + // Create message node + else { + node = createMessageNode(); + // Payload is plain text + if (message.text) { + node.textContent = message.text; + } + // Payload is HTML + else if (message.html) { + node.innerHTML = message.html; + } else { + logger.error('Error: message is missing text payload', message); + } + // Get all nodes in this message that want to be rendered like jsx + const nodes = node.querySelectorAll('[data-component]'); + for (let i = 0; i < nodes.length; i++) { + const childNode = nodes[i]; + const targetName = childNode.getAttribute('data-component'); + // Let's pull out the attibute info we need + const outputProps = {}; + for (let j = 0; j < childNode.attributes.length; j++) { + const attribute = childNode.attributes[j]; + + let working_value = attribute.nodeValue; + // We can't do the "if it has no value it's truthy" trick + // Because getAttribute returns "", not null. Hate IE + if (working_value === '$true') { + working_value = true; + } else if (working_value === '$false') { + working_value = false; + } else if (!Number.isNaN(working_value)) { + const parsed_float = parseFloat(working_value); + if (!Number.isNaN(parsed_float)) { + working_value = parsed_float; + } + } + + let canon_name = attribute.nodeName.replace('data-', ''); + // html attributes don't support upper case chars, so we need to map + canon_name = TGUI_CHAT_ATTRIBUTES_TO_PROPS[canon_name]; + outputProps[canon_name] = working_value; + } + const oldHtml = { __html: childNode.innerHTML }; + while (childNode.firstChild) { + childNode.removeChild(childNode.firstChild); + } + const Element = TGUI_CHAT_COMPONENTS[targetName]; + + const reactRoot = createRoot(childNode); + + reactRoot.render( + + {/** biome-ignore lint/security/noDangerouslySetInnerHtml: its fine */} + + , + ); + } + + // Highlight text + if (!message.avoidHighlighting && this.highlightParsers) { + this.highlightParsers.forEach((parser) => { + const highlighted = highlightNode( + node, + parser.highlightRegex, + parser.highlightWords, + (text) => createHighlightNode(text, parser.highlightColor), + ); + if (highlighted && parser.highlightWholeMessage) { + node.className += ' ChatMessage--highlighted'; + } + }); + } + // Linkify text + const linkifyNodes = node.querySelectorAll('.linkify'); + for (let i = 0; i < linkifyNodes.length; ++i) { + linkifyNode(linkifyNodes[i]); + } + // Assign an image error handler + if (now < message.createdAt + IMAGE_RETRY_MESSAGE_AGE) { + const imgNodes = node.querySelectorAll('img'); + for (let i = 0; i < imgNodes.length; i++) { + const imgNode = imgNodes[i]; + imgNode.addEventListener('error', handleImageError); + } + } + } + // Store the node in the message + message.node = node; + // Query all possible selectors to find out the message type + if (!message.type) { + const typeDef = MESSAGE_TYPES.find( + (typeDef) => typeDef.selector && node.querySelector(typeDef.selector), + ); + message.type = typeDef?.type || MESSAGE_TYPE_UNKNOWN; + } + updateMessageBadge(message); + if (!countByType[message.type]) { + countByType[message.type] = 0; + } + countByType[message.type] += 1; + // TODO: Detect duplicates + this.messages.push(message); + if (canPageAcceptType(this.page, message.type)) { + fragment.appendChild(node); + this.visibleMessages.push(message); + } + } + if (node) { + const firstChild = this.rootNode!.childNodes[0]; + if (prepend && firstChild) { + this.rootNode!.insertBefore(fragment, firstChild); + } else { + this.rootNode!.appendChild(fragment); + } + if (this.scrollTracking) { + setTimeout(() => this.scrollToBottom()); + } + } + // Notify listeners that we have processed the batch + if (notifyListeners) { + this.events.emit('batchProcessed', countByType); + } + } + + pruneMessages() { + if (!this.isReady()) { + return; + } + // Delay pruning because user is currently interacting + // with chat history + if (!this.scrollTracking) { + logger.debug('pruning delayed'); + return; + } + // Visible messages + { + const messages = this.visibleMessages; + const fromIndex = Math.max(0, messages.length - MAX_VISIBLE_MESSAGES); + if (fromIndex > 0) { + this.visibleMessages = messages.slice(fromIndex); + for (let i = 0; i < fromIndex; i++) { + const message = messages[i]; + this.rootNode!.removeChild(message.node); + // Mark this message as pruned + message.node = 'pruned'; + } + // Remove pruned messages from the message array + + this.messages = this.messages.filter( + (message) => message.node !== 'pruned', + ); + logger.log(`pruned ${fromIndex} visible messages`); + } + } + // All messages + { + const fromIndex = Math.max( + 0, + this.messages.length - MAX_PERSISTED_MESSAGES, + ); + if (fromIndex > 0) { + this.messages = this.messages.slice(fromIndex); + logger.log(`pruned ${fromIndex} stored messages`); + } + } + } + + rebuildChat() { + if (!this.isReady()) { + return; + } + // Make a copy of messages + const fromIndex = Math.max( + 0, + this.messages.length - MAX_PERSISTED_MESSAGES, + ); + const messages = this.messages.slice(fromIndex); + // Remove existing nodes + for (const message of messages) { + message.node = undefined; + } + // Fast clear of the root node + this.rootNode!.textContent = ''; + this.messages = []; + this.visibleMessages = []; + // Repopulate the chat log + this.processBatch(messages, { + notifyListeners: false, + }); + } + + /** + * @clearChat + * @copyright 2023 + * @author Cheffie + * @link https://github.com/CheffieGithub + * @license MIT + */ + clearChat() { + const messages = this.visibleMessages; + this.visibleMessages = []; + for (let i = 0; i < messages.length; i++) { + const message = messages[i]; + this.rootNode!.removeChild(message.node); + // Mark this message as pruned + message.node = 'pruned'; + } + // Remove pruned messages from the message array + this.messages = this.messages.filter( + (message) => message.node !== 'pruned', + ); + logger.log(`Cleared chat`); + } + + saveToDisk() { + // Compile currently loaded stylesheets as CSS text + let cssText = ''; + const styleSheets = document.styleSheets; + for (let i = 0; i < styleSheets.length; i++) { + const cssRules = styleSheets[i].cssRules; + for (let i = 0; i < cssRules.length; i++) { + const rule = cssRules[i]; + if (rule && typeof rule.cssText === 'string') { + cssText += `${rule.cssText}\n`; + } + } + } + cssText += 'body, html { background-color: #141414 }\n'; + // Compile chat log as HTML text + let messagesHtml = ''; + for (const message of this.visibleMessages) { + if (message.node) { + messagesHtml += `${message.node.outerHTML}\n`; + } + } + // Create a page + + const pageHtml = + '\n' + + '\n' + + '\n' + + 'SS13 Chat Log\n' + + '\n' + + '\n' + + '\n' + + '
    \n' + + messagesHtml + + '
    \n' + + '\n' + + '\n'; + // Create and send a nice blob + const blob = new Blob([pageHtml], { type: 'text/plain' }); + const timestamp = new Date() + .toISOString() + .substring(0, 19) + .replace(/[-:]/g, '') + .replace('T', '-'); + Byond.saveBlob(blob, `ss13-chatlog-${timestamp}.html`, '.html'); + } +} + +// Make chat renderer global so that we can continue using the same +// instance after hot code replacement. +if (!window.__chatRenderer__) { + window.__chatRenderer__ = new ChatRenderer(); +} + +export const chatRenderer: ChatRenderer = window.__chatRenderer__; diff --git a/tgui/packages/tgui-panel/chat/selectors.ts b/tgui/packages/tgui-panel/chat/selectors.ts deleted file mode 100644 index 2e6f486e2a25..000000000000 --- a/tgui/packages/tgui-panel/chat/selectors.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { map } from 'es-toolkit/compat'; - -export const selectChat = (state) => state.chat; - -export const selectChatPages = (state) => - map(state.chat.pages, (id: string) => state.chat.pageById[id]); - -export const selectCurrentChatPage = (state) => - state.chat.pageById[state.chat.currentPageId]; - -export const selectChatPageById = (id) => (state) => state.chat.pageById[id]; diff --git a/tgui/packages/tgui-panel/chat/types.ts b/tgui/packages/tgui-panel/chat/types.ts index 91ab9fd3a7f0..b88354b5b233 100644 --- a/tgui/packages/tgui-panel/chat/types.ts +++ b/tgui/packages/tgui-panel/chat/types.ts @@ -1,3 +1,9 @@ +import * as z from 'zod'; + +export type ChatPages = { + chatPages: Record; +}; + export type Page = { isMain: boolean; id: string; @@ -7,3 +13,13 @@ export type Page = { hideUnreadCount: boolean; createdAt: number; }; + +export const storedSettingsSchema = z.object({ + version: z.number(), + scrollTracking: z.boolean(), + currentPageId: z.string(), + pages: z.array(z.string()), + pageById: z.record(z.string(), z.any()), +}); + +export type StoredChatSettings = z.infer; diff --git a/tgui/packages/tgui-panel/chat/use-chat-pages.ts b/tgui/packages/tgui-panel/chat/use-chat-pages.ts new file mode 100644 index 000000000000..aed20ee2e93f --- /dev/null +++ b/tgui/packages/tgui-panel/chat/use-chat-pages.ts @@ -0,0 +1,146 @@ +import { useAtom, useAtomValue } from 'jotai'; +import { + chatPagesAtom, + chatPagesRecordAtom, + currentPageAtom, + currentPageIdAtom, + mainPage, +} from './atom'; +import { createPage } from './model'; +import { chatRenderer } from './renderer'; +import type { Page } from './types'; + +/** Custom hook for handling chat pages state */ +export function useChatPages() { + const [pages, setPages] = useAtom(chatPagesAtom); + const [pagesRecord, setPagesRecord] = useAtom(chatPagesRecordAtom); + const [currentPageId, setCurrentPageId] = useAtom(currentPageIdAtom); + const page = useAtomValue(currentPageAtom); + + function addChatPage(): void { + const draft = createPage(); + + setCurrentPageId(draft.id); + setPages((prev) => [...prev, draft.id]); + setPagesRecord((prev) => ({ + ...prev, + [draft.id]: draft, + })); + + chatRenderer.changePage(draft); + } + + function changeChatPage(page: Page): void { + setCurrentPageId(page.id); + + const draft: Page = { + ...pagesRecord[page.id], + unreadCount: 0, + }; + + setPagesRecord({ + ...pagesRecord, + [page.id]: draft, + }); + + chatRenderer.changePage(draft); + } + + function moveChatLeft(): void { + const tmpPage = pagesRecord[currentPageId]; + const fromIndex = pages.indexOf(tmpPage.id); + const toIndex = fromIndex - 1; + + // don't ever move leftmost page + if (fromIndex <= 0) return; + // don't ever move anything to the leftmost page + if (toIndex <= 0) return; + + const draftPages = [...pages]; + const tmp = draftPages[fromIndex]; + draftPages[fromIndex] = draftPages[toIndex]; + draftPages[toIndex] = tmp; + + setPages(draftPages); + } + + function moveChatRight(): void { + const tmpPage = pagesRecord[currentPageId]; + const fromIndex = pages.indexOf(tmpPage.id); + const toIndex = fromIndex + 1; + + // don't ever move leftmost page + if (fromIndex <= 0) return; + // don't ever move anything out of the array + if (toIndex >= pages.length) return; + + const draftPages = [...pages]; + const tmp = draftPages[fromIndex]; + draftPages[fromIndex] = draftPages[toIndex]; + draftPages[toIndex] = tmp; + + setPages(draftPages); + } + + function removeChatPage(): void { + const nextPages = pages.filter((id) => id !== currentPageId); + + // Always keep at least the main page + const finalPages = nextPages.length > 0 ? nextPages : [mainPage.id]; + + const finalRecord = + nextPages.length > 0 + ? (Object.fromEntries( + finalPages.map((id) => [id, pagesRecord[id]]), + ) as Record) + : { [mainPage.id]: mainPage }; + + setPagesRecord(finalRecord); + setPages(finalPages); + setCurrentPageId(finalPages[0]); + chatRenderer.changePage(finalRecord[finalPages[0]]); + } + + function toggleAcceptedType(type: string): void { + const current = { ...pagesRecord[currentPageId] }; + + const draft: Page = { + ...current, + acceptedTypes: { + ...current.acceptedTypes, + [type]: !current.acceptedTypes[type], + }, + }; + + setPagesRecord({ + ...pagesRecord, + [currentPageId]: draft, + }); + } + + function updateChatPage(page: Partial): void { + const draft: Page = { + ...pagesRecord[currentPageId], + ...page, + }; + + setPagesRecord({ + ...pagesRecord, + [currentPageId]: draft, + }); + } + + return { + page, + pages, + pagesRecord, + currentPageId, + addChatPage, + changeChatPage, + moveChatLeft, + moveChatRight, + removeChatPage, + toggleAcceptedType, + updateChatPage, + }; +} diff --git a/tgui/packages/tgui-panel/chat/use-chat-persistence.ts b/tgui/packages/tgui-panel/chat/use-chat-persistence.ts new file mode 100644 index 000000000000..7d7c87bb5d17 --- /dev/null +++ b/tgui/packages/tgui-panel/chat/use-chat-persistence.ts @@ -0,0 +1,124 @@ +import { storage } from 'common/storage'; +import DOMPurify from 'dompurify'; +import { useAtom, useAtomValue } from 'jotai'; +import { useEffect } from 'react'; +import { settingsLoadedAtom } from '../settings/atoms'; +import { allChatAtom, chatLoadedAtom, versionAtom } from './atom'; +import { MESSAGE_SAVE_INTERVAL } from './constants'; +import { saveChatToStorage } from './helpers'; +import { startChatStateMigration } from './migration'; +import { createMessage } from './model'; +import { chatRenderer } from './renderer'; + +// List of blacklisted tags +const FORBID_TAGS = ['a', 'iframe', 'link', 'video']; + +/** + * Custom hook that initializes chat from local storage and periodically saves + * it back + */ +export function useChatPersistence() { + const version = useAtomValue(versionAtom); + const allChat = useAtomValue(allChatAtom); + + const [loaded, setLoaded] = useAtom(chatLoadedAtom); + const settingsLoaded = useAtomValue(settingsLoadedAtom); + + /** Loads chat + chat settings */ + useEffect(() => { + if (!loaded && settingsLoaded) { + async function fetchChat(): Promise { + console.log('Initializing chat'); + await loadChatFromStorage(); + + setLoaded(true); + chatRenderer.onStateLoaded(); + } + + fetchChat(); + } + }, [loaded, settingsLoaded, setLoaded]); + + /** Periodically saves chat + chat settings */ + useEffect(() => { + let saveInterval: NodeJS.Timeout; + + if (loaded) { + saveInterval = setInterval(saveChatToStorage, MESSAGE_SAVE_INTERVAL); + } + + return () => clearInterval(saveInterval); + }, [loaded]); + + /** Saves chat settings shortly after any settings change */ + useEffect(() => { + let timeout: NodeJS.Timeout; + + if (loaded) { + timeout = setTimeout(() => { + // Avoid persisting frequently-changing unread counts. + const pageById = Object.fromEntries( + Object.entries(allChat.pageById).map(([id, page]) => [ + id, + { + ...page, + unreadCount: 0, + }, + ]), + ); + + storage.set('chat-state', { + ...allChat, + pageById, + }); + }, 750); + } + + return () => clearTimeout(timeout); + }, [loaded, allChat]); + + async function loadChatFromStorage(): Promise { + const [state, messages] = await Promise.all([ + storage.get('chat-state'), + storage.get('chat-messages'), + ]); + + if (messages) { + handleMessages(messages); + } + + // Empty settings, set defaults + if (!state) { + console.log('Initialized chat with default settings'); + } else if (state && 'version' in state && state.version === version) { + console.log('Loaded chat state from storage:', state); + startChatStateMigration(state); + } else { + // Discard incompatible versions + console.log('Discarded incompatible chat state from storage:', state); + } + } + + function handleMessages(messages: any[]): void { + for (const message of messages) { + if (message.html) { + message.html = DOMPurify.sanitize(message.html, { + FORBID_TAGS, + }); + } + } + + const batch = [ + ...messages, + createMessage({ + type: 'internal/reconnected', + }), + ]; + + chatRenderer.processBatch(batch, { + prepend: true, + }); + + console.log(`Restored chat with ${messages.length} messages`); + } +} diff --git a/tgui/packages/tgui-panel/events/handlers/assets.ts b/tgui/packages/tgui-panel/events/handlers/assets.ts new file mode 100644 index 000000000000..fc814f9fd6cb --- /dev/null +++ b/tgui/packages/tgui-panel/events/handlers/assets.ts @@ -0,0 +1,8 @@ +import { loadMappings } from 'common/assets'; + +const loadedMappings = {} as Record; + +/** This just lets us load in our own independent map */ +export function handleLoadAssets(payload: Record): void { + loadMappings(payload, loadedMappings); +} diff --git a/tgui/packages/tgui-panel/events/handlers/roundrestart.ts b/tgui/packages/tgui-panel/events/handlers/roundrestart.ts new file mode 100644 index 000000000000..1bba7c1a12dc --- /dev/null +++ b/tgui/packages/tgui-panel/events/handlers/roundrestart.ts @@ -0,0 +1,8 @@ +import { saveChatToStorage } from '../../chat/helpers'; +import { roundRestartedAtAtom } from '../../game/atoms'; +import { store } from '../store'; + +export function roundrestart() { + store.set(roundRestartedAtAtom, Date.now()); + saveChatToStorage(); +} diff --git a/tgui/packages/tgui-panel/events/listeners.ts b/tgui/packages/tgui-panel/events/listeners.ts new file mode 100644 index 000000000000..06e6a4f554ad --- /dev/null +++ b/tgui/packages/tgui-panel/events/listeners.ts @@ -0,0 +1,28 @@ +import { loadStyleSheet } from 'common/assets'; +import { EventBus } from 'tgui-core/eventbus'; +import { playMusic, stopMusic } from '../audio/handlers'; +import { chatMessage } from '../chat/handlers'; +import { pingReply, pingSoft } from '../ping/handlers'; +import { + handleTelemetryData, + telemetryRequest, + testTelemetryCommand, +} from '../telemetry/handlers'; +import { handleLoadAssets } from './handlers/assets'; +import { roundrestart } from './handlers/roundrestart'; + +const listeners = { + 'asset/stylesheet': loadStyleSheet, + 'asset/mappings': handleLoadAssets, + 'audio/playMusic': playMusic, + 'audio/stopMusic': stopMusic, + 'chat/message': chatMessage, + 'ping/reply': pingReply, + 'ping/soft': pingSoft, + roundrestart, + 'telemetry/request': telemetryRequest, + testTelemetryCommand, + update: handleTelemetryData, +} as const; + +export const bus = new EventBus(listeners); diff --git a/tgui/packages/tgui-panel/events/store.ts b/tgui/packages/tgui-panel/events/store.ts new file mode 100644 index 000000000000..09a7aa5b3942 --- /dev/null +++ b/tgui/packages/tgui-panel/events/store.ts @@ -0,0 +1,3 @@ +import { createStore } from 'jotai'; + +export const store = createStore(); diff --git a/tgui/packages/tgui-panel/game/actions.ts b/tgui/packages/tgui-panel/game/actions.ts deleted file mode 100644 index e40014c44b04..000000000000 --- a/tgui/packages/tgui-panel/game/actions.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { createAction } from 'common/redux'; - -export const roundRestarted = createAction('roundrestart'); -export const connectionLost = createAction('game/connectionLost'); -export const connectionRestored = createAction('game/connectionRestored'); diff --git a/tgui/packages/tgui-panel/game/atoms.ts b/tgui/packages/tgui-panel/game/atoms.ts new file mode 100644 index 000000000000..148227074377 --- /dev/null +++ b/tgui/packages/tgui-panel/game/atoms.ts @@ -0,0 +1,40 @@ +import { atom } from 'jotai'; +import { lastPingedAtAtom } from '../ping/atoms'; +import { CONNECTION_LOST_AFTER } from './constants'; + +export const roundRestartedAtAtom = atom(null); + +/** + * Ticking clock atom. Only runs while something is subscribed to it. + * (And only after we’ve had at least one ping, see connectionLostAtAtom.) + */ +const nowAtom = atom(0); +nowAtom.onMount = (set) => { + set(Date.now()); + const id = setInterval(() => set(Date.now()), 1000); + return () => clearInterval(id); +}; + +/** + * Returns the timestamp at which we *became* "lost" (deadline), + * or null if we're not currently lost. + * + * Note: returns a stable value while lost, so `nowAtom` ticking won’t cause + * rerenders once lost (value stays equal). + */ +export const connectionLostAtAtom = atom((get) => { + const lastPingedAt = get(lastPingedAtAtom); + if (!lastPingedAt) return null; + + const now = get(nowAtom); + const deadline = lastPingedAt + CONNECTION_LOST_AFTER; + + return now >= deadline ? deadline : null; +}); + +//------- Convenience --------------------------------------------------------// + +export const gameAtom = atom((get) => ({ + roundRestartedAt: get(roundRestartedAtAtom), + connectionLostAt: get(connectionLostAtAtom), +})); diff --git a/tgui/packages/tgui-panel/game/hooks.ts b/tgui/packages/tgui-panel/game/hooks.ts deleted file mode 100644 index 40a74ff44a06..000000000000 --- a/tgui/packages/tgui-panel/game/hooks.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { useSelector } from 'tgui/backend'; - -import { selectGame } from './selectors'; - -export const useGame = () => { - return useSelector(selectGame); -}; diff --git a/tgui/packages/tgui-panel/game/index.ts b/tgui/packages/tgui-panel/game/index.ts deleted file mode 100644 index 3cca2e655778..000000000000 --- a/tgui/packages/tgui-panel/game/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -export { useGame } from './hooks'; -export { gameMiddleware } from './middleware'; -export { gameReducer } from './reducer'; diff --git a/tgui/packages/tgui-panel/game/middleware.js b/tgui/packages/tgui-panel/game/middleware.js deleted file mode 100644 index 1cf80a7ac63a..000000000000 --- a/tgui/packages/tgui-panel/game/middleware.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { pingSoft, pingSuccess } from '../ping/actions'; -import { connectionLost, connectionRestored, roundRestarted } from './actions'; -import { CONNECTION_LOST_AFTER } from './constants'; -import { selectGame } from './selectors'; - -const withTimestamp = (action) => ({ - ...action, - meta: { - ...action.meta, - now: Date.now(), - }, -}); - -export const gameMiddleware = (store) => { - let lastPingedAt; - - setInterval(() => { - const state = store.getState(); - if (!state) { - return; - } - const game = selectGame(state); - const pingsAreFailing = - lastPingedAt && Date.now() >= lastPingedAt + CONNECTION_LOST_AFTER; - if (!game.connectionLostAt && pingsAreFailing) { - store.dispatch(withTimestamp(connectionLost())); - } - if (game.connectionLostAt && !pingsAreFailing) { - store.dispatch(withTimestamp(connectionRestored())); - } - }, 1000); - - return (next) => (action) => { - const { type } = action; - - if (type === pingSuccess.type || type === pingSoft.type) { - lastPingedAt = Date.now(); - return next(action); - } - - if (type === roundRestarted.type) { - return next(withTimestamp(action)); - } - - return next(action); - }; -}; diff --git a/tgui/packages/tgui-panel/game/reducer.ts b/tgui/packages/tgui-panel/game/reducer.ts deleted file mode 100644 index c446db8f029b..000000000000 --- a/tgui/packages/tgui-panel/game/reducer.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { connectionLost } from './actions'; -import { connectionRestored } from './actions'; - -const initialState = { - // TODO: This is where round info should be. - roundId: null, - roundTime: null, - roundRestartedAt: null, - connectionLostAt: null, -}; - -export const gameReducer = (state = initialState, action) => { - const { type, meta } = action; - if (type === 'roundrestart') { - return { - ...state, - roundRestartedAt: meta.now, - }; - } - if (type === connectionLost.type) { - return { - ...state, - connectionLostAt: meta.now, - }; - } - if (type === connectionRestored.type) { - return { - ...state, - connectionLostAt: null, - }; - } - return state; -}; diff --git a/tgui/packages/tgui-panel/game/selectors.ts b/tgui/packages/tgui-panel/game/selectors.ts deleted file mode 100644 index a3b93b327d97..000000000000 --- a/tgui/packages/tgui-panel/game/selectors.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -export const selectGame = (state) => state.game; diff --git a/tgui/packages/tgui-panel/game/use-keep-alive.ts b/tgui/packages/tgui-panel/game/use-keep-alive.ts new file mode 100644 index 000000000000..5ad30e7a0fd4 --- /dev/null +++ b/tgui/packages/tgui-panel/game/use-keep-alive.ts @@ -0,0 +1,16 @@ +import { useAtomValue, useSetAtom } from 'jotai'; +import { useEffect } from 'react'; +import { lastPingedAtAtom } from '../ping/atoms'; +import { connectionLostAtAtom } from './atoms'; + +/** Custom hook that checks whether the panel is still receiving pings */ +export function useKeepAlive() { + // Ensure the derived atom (and thus the clock) is subscribed. + useAtomValue(connectionLostAtAtom); + + // Clears stale ping timestamp across HMR/reloads to avoid a one-frame “lost” flash. + const setLastPingedAt = useSetAtom(lastPingedAtAtom); + useEffect(() => { + setLastPingedAt(null); + }, [setLastPingedAt]); +} diff --git a/tgui/packages/tgui-panel/index.tsx b/tgui/packages/tgui-panel/index.tsx index 40e0685f4201..8ccc51fd16e1 100644 --- a/tgui/packages/tgui-panel/index.tsx +++ b/tgui/packages/tgui-panel/index.tsx @@ -4,50 +4,22 @@ * @license MIT */ -// Themes import './styles/main.scss'; import './styles/themes/light.scss'; -import { perf } from 'common/perf'; -import { combineReducers } from 'common/redux'; -import { setGlobalStore } from 'tgui/backend'; -import { captureExternalLinks } from 'tgui/links'; -import { render } from 'tgui/renderer'; -import { configureStore } from 'tgui/store'; +import { createRoot } from 'react-dom/client'; import { setupGlobalEvents } from 'tgui-core/events'; +import { captureExternalLinks } from 'tgui-core/links'; import { setupHotReloading } from 'tgui-dev-server/link/client'; - -import { audioMiddleware, audioReducer } from './audio'; -import { chatMiddleware, chatReducer } from './chat'; -import { gameMiddleware, gameReducer } from './game'; -import { Panel } from './Panel'; +import { App } from './app'; +import { bus } from './events/listeners'; import { setupPanelFocusHacks } from './panelFocus'; -import { pingMiddleware, pingReducer } from './ping'; -import { settingsMiddleware, settingsReducer } from './settings'; -import { telemetryMiddleware } from './telemetry'; -perf.mark('inception', window.performance?.timeOrigin); -perf.mark('init'); +const root = createRoot(document.getElementById('react-root')!); -const store = configureStore({ - reducer: combineReducers({ - audio: audioReducer, - chat: chatReducer, - game: gameReducer, - ping: pingReducer, - settings: settingsReducer, - }), - middleware: { - pre: [ - chatMiddleware, - pingMiddleware, - telemetryMiddleware, - settingsMiddleware, - audioMiddleware, - gameMiddleware, - ], - }, -}); +function render(component: React.ReactElement) { + root.render(component); +} function setupApp() { // Delay setup @@ -56,8 +28,6 @@ function setupApp() { return; } - setGlobalStore(store); - setupGlobalEvents({ ignoreWindowFocus: true, }); @@ -65,11 +35,10 @@ function setupApp() { setupPanelFocusHacks(); captureExternalLinks(); - // Re-render UI on store updates - store.subscribe(() => render()); + render(); // Dispatch incoming messages as store actions - Byond.subscribe((type, payload) => store.dispatch({ type, payload })); + Byond.subscribe((type, payload) => bus.dispatch({ type, payload })); // Unhide the panel Byond.winset('output_selector.legacy_output_selector', { @@ -87,21 +56,9 @@ function setupApp() { if (import.meta.webpackHot) { setupHotReloading(); - import.meta.webpackHot.accept( - [ - './audio', - './chat', - './game', - './Notifications', - './Panel', - './ping', - './settings', - './telemetry', - ], - () => { - render(); - }, - ); + import.meta.webpackHot.accept(['./app'], () => { + render(); + }); } } diff --git a/tgui/packages/tgui-panel/package.json b/tgui/packages/tgui-panel/package.json index b52f197f8699..5bc09bb73512 100644 --- a/tgui/packages/tgui-panel/package.json +++ b/tgui/packages/tgui-panel/package.json @@ -4,12 +4,14 @@ "dependencies": { "common": "workspace:*", "dompurify": "^3.2.5", - "es-toolkit": "^1.39.3", + "es-toolkit": "^1.43.0", + "jotai": "^2.16.0", "react": "^19.1.0", "react-dom": "^19.1.0", "tgui": "workspace:*", - "tgui-core": "^5.3.1", - "tgui-dev-server": "workspace:*" + "tgui-core": "^5.6.0", + "tgui-dev-server": "workspace:*", + "zod": "^4.2.1" }, "private": true } diff --git a/tgui/packages/tgui-panel/panelFocus.ts b/tgui/packages/tgui-panel/panelFocus.ts index 90cdf8363686..9706b4fc8fea 100644 --- a/tgui/packages/tgui-panel/panelFocus.ts +++ b/tgui/packages/tgui-panel/panelFocus.ts @@ -7,25 +7,30 @@ * @license MIT */ +import { vecLength, vecSubtract } from 'common/vector'; import { focusMap } from 'tgui/focus'; import { canStealFocus, globalEvents } from 'tgui-core/events'; -import { vecLength, vecSubtract } from 'tgui-core/vector'; // Empyrically determined number for the smallest possible // text you can select with the mouse. const MIN_SELECTION_DISTANCE = 10; -const deferredFocusMap = () => setTimeout(() => focusMap()); +function deferredFocusMap(): void { + setTimeout(focusMap); +} -export const setupPanelFocusHacks = () => { +export function setupPanelFocusHacks(): void { let focusStolen = false; let clickStartPos: number[] | null = null; + window.addEventListener('focusin', (e) => { focusStolen = canStealFocus(e.target as HTMLElement); }); + window.addEventListener('mousedown', (e) => { clickStartPos = [e.screenX, e.screenY]; }); + window.addEventListener('mouseup', (e) => { if (clickStartPos) { const clickEndPos = [e.screenX, e.screenY]; @@ -41,10 +46,11 @@ export const setupPanelFocusHacks = () => { deferredFocusMap(); } }); + globalEvents.on('keydown', (key) => { if (key.isModifierKey()) { return; } deferredFocusMap(); }); -}; +} diff --git a/tgui/packages/tgui-panel/ping/PingIndicator.tsx b/tgui/packages/tgui-panel/ping/PingIndicator.tsx index bd55d6443759..811966804e2b 100644 --- a/tgui/packages/tgui-panel/ping/PingIndicator.tsx +++ b/tgui/packages/tgui-panel/ping/PingIndicator.tsx @@ -4,25 +4,27 @@ * @license MIT */ -import { useSelector } from 'tgui/backend'; +import { useAtomValue } from 'jotai'; import { Color } from 'tgui-core/color'; import { Box } from 'tgui-core/components'; import { toFixed } from 'tgui-core/math'; +import { pingAtom } from './atoms'; -import { selectPing } from './selectors'; +export function PingIndicator(props) { + const ping = useAtomValue(pingAtom); -export const PingIndicator = (props) => { - const ping = useSelector(selectPing); const color = Color.lookup(ping.networkQuality, [ new Color(220, 40, 40), new Color(220, 200, 40), new Color(60, 220, 40), ]).toString(); + const roundtrip = ping.roundtrip ? toFixed(ping.roundtrip) : '--'; + return (
    {roundtrip}
    ); -}; +} diff --git a/tgui/packages/tgui-panel/ping/actions.ts b/tgui/packages/tgui-panel/ping/actions.ts deleted file mode 100644 index 27f103302c48..000000000000 --- a/tgui/packages/tgui-panel/ping/actions.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { createAction } from 'common/redux'; - -export const pingReply = createAction('ping/reply'); - -/** - * Soft ping from the server. - * It's intended to send periodic server-side metadata about the client, - * e.g. its AFK status. - */ -export const pingSoft = createAction('ping/soft'); - -export const pingSuccess = createAction('ping/success', (ping) => ({ - payload: { - lastId: ping.id, - roundtrip: (Date.now() - ping.sentAt) * 0.5, - }, -})); - -export const pingFail = createAction('ping/fail'); diff --git a/tgui/packages/tgui-panel/ping/atoms.ts b/tgui/packages/tgui-panel/ping/atoms.ts new file mode 100644 index 000000000000..bead7597446b --- /dev/null +++ b/tgui/packages/tgui-panel/ping/atoms.ts @@ -0,0 +1,11 @@ +import { atom } from 'jotai'; + +export type PingState = { + roundtrip: number | undefined; + roundtripAvg: number | undefined; + failCount: number; + networkQuality: number; +}; + +export const lastPingedAtAtom = atom(null); +export const pingAtom = atom({} as PingState); diff --git a/tgui/packages/tgui-panel/ping/handlers.ts b/tgui/packages/tgui-panel/ping/handlers.ts new file mode 100644 index 000000000000..819d28b05a4b --- /dev/null +++ b/tgui/packages/tgui-panel/ping/handlers.ts @@ -0,0 +1,38 @@ +import { store } from '../events/store'; +import { lastPingedAtAtom } from './atoms'; +import { pingSuccess, pings, sendPing } from './helpers'; + +type SoftPingPayload = { + afk: boolean; +}; + +/** + * Soft ping from the server. + * It's intended to send periodic server-side metadata about the client, + * e.g. its AFK status. + */ +export function pingSoft(payload: SoftPingPayload): void { + const { afk } = payload; + store.set(lastPingedAtAtom, Date.now()); + // On each soft ping where client is not flagged as afk, + // initiate a new ping. + if (!afk) { + sendPing(); + } +} + +type ReplyPingPayload = { + index: number; +}; + +export function pingReply(payload: ReplyPingPayload) { + const { index } = payload; + + const ping = pings[index]; + if (!ping) return; // This ping was already marked as failed due to timeout. + + pings[index] = null; + const roundtrip = (Date.now() - ping.sentAt) * 0.5; + + pingSuccess(roundtrip); +} diff --git a/tgui/packages/tgui-panel/ping/helpers.ts b/tgui/packages/tgui-panel/ping/helpers.ts new file mode 100644 index 000000000000..ff22c82abb4b --- /dev/null +++ b/tgui/packages/tgui-panel/ping/helpers.ts @@ -0,0 +1,74 @@ +import { scale } from 'tgui-core/math'; +import { store } from '../events/store'; +import { lastPingedAtAtom, pingAtom } from './atoms'; +import { + PING_QUEUE_SIZE, + PING_ROUNDTRIP_BEST, + PING_ROUNDTRIP_WORST, + PING_TIMEOUT, +} from './constants'; + +let index = 0; +export const pings: Ping[] = []; + +type Ping = { + index: number; + sentAt: number; +} | null; + +/** Sends a ping to byond */ +export function sendPing(): void { + for (let i = 0; i < PING_QUEUE_SIZE; i++) { + const ping = pings[i]; + if (ping && Date.now() - ping.sentAt > PING_TIMEOUT) { + pings[i] = null; + pingFail(); + } + } + + const ping = { index, sentAt: Date.now() }; + pings[index] = ping; + Byond.sendMessage('ping', { index }); + index = (index + 1) % PING_QUEUE_SIZE; +} + +export function pingSuccess(roundtrip: number): void { + const state = store.get(pingAtom); + const prevRoundtrip = state.roundtripAvg || roundtrip; + const roundtripAvg = Math.round(prevRoundtrip * 0.4 + roundtrip * 0.6); + + const networkQuality = + 1 - scale(roundtripAvg, PING_ROUNDTRIP_BEST, PING_ROUNDTRIP_WORST); + + store.set(pingAtom, { + roundtrip, + roundtripAvg, + failCount: 0, + networkQuality, + }); + + store.set(lastPingedAtAtom, Date.now()); +} + +export function pingFail(): void { + const state = store.get(pingAtom); + const { failCount = 0 } = state; + + const networkQuality = Math.max( + 0, + state.networkQuality - failCount / PING_QUEUE_SIZE, + ); + + const nextState = { + ...state, + failCount: failCount + 1, + networkQuality, + }; + + if (failCount > PING_QUEUE_SIZE) { + nextState.roundtrip = undefined; + nextState.roundtripAvg = undefined; + } + + store.set(pingAtom, nextState); +} diff --git a/tgui/packages/tgui-panel/ping/index.ts b/tgui/packages/tgui-panel/ping/index.ts deleted file mode 100644 index 1bbbe3ed344b..000000000000 --- a/tgui/packages/tgui-panel/ping/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -export { pingMiddleware } from './middleware'; -export { PingIndicator } from './PingIndicator'; -export { pingReducer } from './reducer'; diff --git a/tgui/packages/tgui-panel/ping/middleware.js b/tgui/packages/tgui-panel/ping/middleware.js deleted file mode 100644 index e5b593d822fd..000000000000 --- a/tgui/packages/tgui-panel/ping/middleware.js +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { pingFail, pingReply, pingSoft, pingSuccess } from './actions'; -import { PING_QUEUE_SIZE, PING_TIMEOUT } from './constants'; - -export const pingMiddleware = (store) => { - let initialized = false; - let index = 0; - const pings = []; - - const sendPing = () => { - for (let i = 0; i < PING_QUEUE_SIZE; i++) { - const ping = pings[i]; - if (ping && Date.now() - ping.sentAt > PING_TIMEOUT) { - pings[i] = null; - store.dispatch(pingFail()); - } - } - const ping = { index, sentAt: Date.now() }; - pings[index] = ping; - Byond.sendMessage('ping', { index }); - index = (index + 1) % PING_QUEUE_SIZE; - }; - - return (next) => (action) => { - const { type, payload } = action; - - if (!initialized) { - initialized = true; - sendPing(); - } - - if (type === pingSoft.type) { - const { afk } = payload; - // On each soft ping where client is not flagged as afk, - // initiate a new ping. - if (!afk) { - sendPing(); - } - return next(action); - } - - if (type === pingReply.type) { - const { index } = payload; - const ping = pings[index]; - // Received a timed out ping - if (!ping) { - return; - } - pings[index] = null; - return next(pingSuccess(ping)); - } - - return next(action); - }; -}; diff --git a/tgui/packages/tgui-panel/ping/reducer.ts b/tgui/packages/tgui-panel/ping/reducer.ts deleted file mode 100644 index 2a25c9d3c15b..000000000000 --- a/tgui/packages/tgui-panel/ping/reducer.ts +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { clamp01, scale } from 'tgui-core/math'; - -import { pingFail, pingSuccess } from './actions'; -import { - PING_MAX_FAILS, - PING_ROUNDTRIP_BEST, - PING_ROUNDTRIP_WORST, -} from './constants'; - -type PingState = { - roundtrip: number | undefined; - roundtripAvg: number | undefined; - failCount: number; - networkQuality: number; -}; - -export const pingReducer = (state = {} as PingState, action) => { - const { type, payload } = action; - - if (type === pingSuccess.type) { - const { roundtrip } = payload; - const prevRoundtrip = state.roundtripAvg || roundtrip; - const roundtripAvg = Math.round(prevRoundtrip * 0.4 + roundtrip * 0.6); - const networkQuality = - 1 - scale(roundtripAvg, PING_ROUNDTRIP_BEST, PING_ROUNDTRIP_WORST); - return { - roundtrip, - roundtripAvg, - failCount: 0, - networkQuality, - }; - } - - if (type === pingFail.type) { - const { failCount = 0 } = state; - const networkQuality = clamp01( - state.networkQuality - failCount / PING_MAX_FAILS, - ); - const nextState: PingState = { - ...state, - failCount: failCount + 1, - networkQuality, - }; - if (failCount > PING_MAX_FAILS) { - nextState.roundtrip = undefined; - nextState.roundtripAvg = undefined; - } - return nextState; - } - - return state; -}; diff --git a/tgui/packages/tgui-panel/ping/selectors.ts b/tgui/packages/tgui-panel/ping/selectors.ts deleted file mode 100644 index 1b8bfb4ee40f..000000000000 --- a/tgui/packages/tgui-panel/ping/selectors.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -export const selectPing = (state) => state.ping; diff --git a/tgui/packages/tgui-panel/reconnect.tsx b/tgui/packages/tgui-panel/reconnect.tsx index 4626ebb74e79..17b92cfcea85 100644 --- a/tgui/packages/tgui-panel/reconnect.tsx +++ b/tgui/packages/tgui-panel/reconnect.tsx @@ -11,10 +11,11 @@ setInterval(() => { }); }, 5000); -export const ReconnectButton = () => { +export function ReconnectButton() { if (!url) { return null; } + return ( <> @@ -189,7 +173,7 @@ export function SettingsGeneral(props) { accept=".json" tooltip="Import chat settings" icon="arrow-up-from-bracket" - onSelectFiles={(files) => importChatSettings(files)} + onSelectFiles={importChatSettings} > Import settings @@ -198,7 +182,7 @@ export function SettingsGeneral(props) { @@ -207,7 +191,7 @@ export function SettingsGeneral(props) { dispatch(clearChat())} + onClick={() => chatRenderer.clearChat()} > Clear chat diff --git a/tgui/packages/tgui-panel/settings/SettingsPanel.tsx b/tgui/packages/tgui-panel/settings/SettingsPanel.tsx index 68f69833bc5b..1efcfe8facfa 100644 --- a/tgui/packages/tgui-panel/settings/SettingsPanel.tsx +++ b/tgui/packages/tgui-panel/settings/SettingsPanel.tsx @@ -4,20 +4,20 @@ * @license MIT */ -import { useDispatch, useSelector } from 'tgui/backend'; import { Section, Stack, Tabs } from 'tgui-core/components'; - -import { ChatPageSettings } from '../chat'; -import { changeSettingsTab } from './actions'; +import { ChatPageSettings } from '../chat/ChatPageSettings'; import { SETTINGS_TABS } from './constants'; -import { selectActiveTab } from './selectors'; import { SettingsGeneral } from './SettingsGeneral'; import { SettingsStatPanel } from './SettingsStatPanel'; import { TextHighlightSettings } from './TextHighlight'; +import { useSettings } from './use-settings'; export function SettingsPanel(props) { - const activeTab = useSelector(selectActiveTab); - const dispatch = useDispatch(); + const { + settings: { view }, + updateSettings, + } = useSettings(); + const { activeTab } = view; return ( @@ -29,11 +29,12 @@ export function SettingsPanel(props) { key={tab.id} selected={tab.id === activeTab} onClick={() => - dispatch( - changeSettingsTab({ - tabId: tab.id, - }), - ) + updateSettings({ + view: { + ...view, + activeTab: tab.id, + }, + }) } > {tab.name} diff --git a/tgui/packages/tgui-panel/settings/SettingsStatPanel.tsx b/tgui/packages/tgui-panel/settings/SettingsStatPanel.tsx index 4502c52ae908..d4a28c1ab33a 100644 --- a/tgui/packages/tgui-panel/settings/SettingsStatPanel.tsx +++ b/tgui/packages/tgui-panel/settings/SettingsStatPanel.tsx @@ -1,4 +1,3 @@ -import { useDispatch, useSelector } from 'tgui/backend'; import { Button, LabeledList, @@ -9,19 +8,17 @@ import { } from 'tgui-core/components'; import { toFixed } from 'tgui-core/math'; import { capitalize } from 'tgui-core/string'; +import { useSettings } from './use-settings'; -import { updateSettings } from './actions'; -import { selectSettings } from './selectors'; +const tabViews = ['default', 'classic', 'scrollable']; -const TabsViews = ['default', 'classic', 'scrollable']; -const LinkedToChat = () => ( - Unlink Stat Panel from chat! -); +function LinkedToChat() { + return Unlink Stat Panel from chat!; +} export function SettingsStatPanel(props) { - const { statLinked, statFontSize, statTabsStyle } = - useSelector(selectSettings); - const dispatch = useDispatch(); + const { settings, updateSettings } = useSettings(); + const { statLinked, statFontSize, statTabsStyle } = settings; return (
    @@ -29,14 +26,12 @@ export function SettingsStatPanel(props) { - {TabsViews.map((view) => ( + {tabViews.map((view) => ( @@ -57,7 +52,7 @@ export function SettingsStatPanel(props) { unit="px" format={(value) => toFixed(value)} onChange={(e, value) => - dispatch(updateSettings({ statFontSize: value })) + updateSettings({ statFontSize: value }) } /> )} @@ -71,9 +66,7 @@ export function SettingsStatPanel(props) { fluid icon={statLinked ? 'unlink' : 'link'} color={statLinked ? 'bad' : 'good'} - onClick={() => - dispatch(updateSettings({ statLinked: !statLinked })) - } + onClick={() => updateSettings({ statLinked: !statLinked })} > {statLinked ? 'Unlink from chat' : 'Link to chat'} diff --git a/tgui/packages/tgui-panel/settings/TextHighlight.tsx b/tgui/packages/tgui-panel/settings/TextHighlight.tsx index 29d28b3647be..60c942979d97 100644 --- a/tgui/packages/tgui-panel/settings/TextHighlight.tsx +++ b/tgui/packages/tgui-panel/settings/TextHighlight.tsx @@ -1,4 +1,3 @@ -import { useDispatch, useSelector } from 'tgui/backend'; import { Box, Button, @@ -10,22 +9,15 @@ import { Stack, TextArea, } from 'tgui-core/components'; - -import { rebuildChat } from '../chat/actions'; -import { - addHighlightSetting, - removeHighlightSetting, - updateHighlightSetting, -} from './actions'; +import { chatRenderer } from '../chat/renderer'; import { WARN_AFTER_HIGHLIGHT_AMT } from './constants'; -import { - selectHighlightSettingById, - selectHighlightSettings, -} from './selectors'; +import { useHighlights } from './use-highlights'; export function TextHighlightSettings(props) { - const highlightSettings = useSelector(selectHighlightSettings); - const dispatch = useDispatch(); + const { + highlights: { highlightSettings }, + addHighlight, + } = useHighlights(); return (
    @@ -42,9 +34,7 @@ export function TextHighlightSettings(props) { @@ -60,7 +50,7 @@ export function TextHighlightSettings(props) { - @@ -73,8 +63,11 @@ export function TextHighlightSettings(props) { function TextHighlightSetting(props) { const { id, ...rest } = props; - const highlightSettingById = useSelector(selectHighlightSettingById); - const dispatch = useDispatch(); + const { + highlights: { highlightSettingById }, + updateHighlight, + removeHighlight, + } = useHighlights(); const { highlightColor, highlightText, @@ -90,13 +83,7 @@ function TextHighlightSetting(props) { @@ -106,12 +93,10 @@ function TextHighlightSetting(props) { checked={highlightWholeMessage} tooltip="If this option is selected, the entire message will be highlighted in yellow." onClick={() => - dispatch( - updateHighlightSetting({ - id: id, - highlightWholeMessage: !highlightWholeMessage, - }), - ) + updateHighlight({ + id, + highlightWholeMessage: !highlightWholeMessage, + }) } > Whole Message @@ -123,12 +108,10 @@ function TextHighlightSetting(props) { tooltipPosition="bottom-start" tooltip="If this option is selected, only exact matches (no extra letters before or after) will trigger. Not compatible with punctuation. Overriden if regex is used." onClick={() => - dispatch( - updateHighlightSetting({ - id: id, - matchWord: !matchWord, - }), - ) + updateHighlight({ + id, + matchWord: !matchWord, + }) } > Exact @@ -139,12 +122,10 @@ function TextHighlightSetting(props) { tooltip="If this option is selected, the highlight will be case-sensitive." checked={matchCase} onClick={() => - dispatch( - updateHighlightSetting({ - id: id, - matchCase: !matchCase, - }), - ) + updateHighlight({ + id, + matchCase: !matchCase, + }) } > Case @@ -158,12 +139,10 @@ function TextHighlightSetting(props) { placeholder="#ffffff" value={highlightColor} onBlur={(value) => - dispatch( - updateHighlightSetting({ - id: id, - highlightColor: value, - }), - ) + updateHighlight({ + id, + highlightColor: value, + }) } /> @@ -174,12 +153,10 @@ function TextHighlightSetting(props) { value={highlightText} placeholder="Put words to highlight here. Separate terms with commas, i.e. (term1, term2, term3)" onBlur={(value) => - dispatch( - updateHighlightSetting({ - id: id, - highlightText: value, - }), - ) + updateHighlight({ + id: id, + highlightText: value, + }) } /> diff --git a/tgui/packages/tgui-panel/settings/actions.ts b/tgui/packages/tgui-panel/settings/actions.ts deleted file mode 100644 index 3c4a13b45b01..000000000000 --- a/tgui/packages/tgui-panel/settings/actions.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { createAction } from 'common/redux'; - -import { createHighlightSetting } from './model'; - -export const updateSettings = createAction('settings/update'); -export const loadSettings = createAction('settings/load'); -export const changeSettingsTab = createAction('settings/changeTab'); -export const toggleSettings = createAction('settings/toggle'); -export const openChatSettings = createAction('settings/openChatTab'); -export const addHighlightSetting = createAction( - 'settings/addHighlightSetting', - () => ({ - payload: createHighlightSetting(), - }), -); -export const removeHighlightSetting = createAction( - 'settings/removeHighlightSetting', -); -export const updateHighlightSetting = createAction( - 'settings/updateHighlightSetting', -); -export const exportSettings = createAction('settings/export'); -export const importSettings = createAction( - 'settings/import', - (settings, pages) => ({ - payload: { newSettings: settings, newPages: pages }, - }), -); diff --git a/tgui/packages/tgui-panel/settings/atoms.ts b/tgui/packages/tgui-panel/settings/atoms.ts new file mode 100644 index 000000000000..d232ac8fad98 --- /dev/null +++ b/tgui/packages/tgui-panel/settings/atoms.ts @@ -0,0 +1,55 @@ +import { atom } from 'jotai'; +import { FONTS, SETTINGS_TABS } from './constants'; +import type { HighlightSetting, HighlightState, SettingsState } from './types'; + +export const defaultSettings: SettingsState = { + adminMusicVolume: 0.5, + fontFamily: FONTS[0], + fontSize: 13, + initialized: false, + lineHeight: 1.2, + statFontSize: 12, + statLinked: true, + statTabsStyle: 'default', + theme: 'light', + version: 1, + view: { + visible: false, + activeTab: SETTINGS_TABS[0].id, + }, +}; + +export const defaultHighlightSetting: HighlightSetting = { + id: 'default', + highlightText: '', + highlightColor: '#ffdd44', + highlightWholeMessage: true, + matchWord: false, + matchCase: false, +}; + +export const defaultHighlights: HighlightState = { + highlightSettings: ['default'], + highlightSettingById: { + default: defaultHighlightSetting, + }, + // Keep these two state vars for compatibility with other servers + highlightText: '', + highlightColor: '#ffdd44', + // END compatibility state vars +}; + +/** + * Separate from 'initialized' in settings. This is to keep chat from loading + * settings prior to settings being ready + */ +export const settingsLoadedAtom = atom(false); +export const settingsAtom = atom(defaultSettings); +export const settingsVisibleAtom = atom(false); + +export const highlightsAtom = atom(defaultHighlights); + +export const storedSettingsAtom = atom((get) => ({ + ...get(settingsAtom), + ...get(highlightsAtom), +})); diff --git a/tgui/packages/tgui-panel/settings/constants.ts b/tgui/packages/tgui-panel/settings/constants.ts index 3fd4e5c2e4ad..0e076fc07f63 100644 --- a/tgui/packages/tgui-panel/settings/constants.ts +++ b/tgui/packages/tgui-panel/settings/constants.ts @@ -4,6 +4,23 @@ * @license MIT */ +export const THEMES = ['light', 'dark'] as const; + +export const COLORS = { + DARK: { + BG_BASE: '#202020', + BG_SECOND: '#151515', + BUTTON: '#404040', + TEXT: '#A6A6A6', + }, + LIGHT: { + BG_BASE: '#EEEEEE', + BG_SECOND: '#FFFFFF', + BUTTON: '#FFFFFF', + TEXT: '#000000', + }, +} as const; + export const SETTINGS_TABS = [ { id: 'general', @@ -22,7 +39,7 @@ export const SETTINGS_TABS = [ id: 'statPanel', name: 'Stat Panel', }, -]; +] as const; export const FONTS_DISABLED = 'Default'; @@ -38,6 +55,6 @@ export const FONTS = [ 'Trebuchet MS', 'Courier New', 'Lucida Console', -]; +] as const; export const WARN_AFTER_HIGHLIGHT_AMT = 10; diff --git a/tgui/packages/tgui-panel/settings/helpers.ts b/tgui/packages/tgui-panel/settings/helpers.ts new file mode 100644 index 000000000000..5f02f47d32a7 --- /dev/null +++ b/tgui/packages/tgui-panel/settings/helpers.ts @@ -0,0 +1,85 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { FONTS_DISABLED } from './constants'; +import { setClientTheme } from './themes'; +import type { SettingsState } from './types'; + +let statFontTimer: NodeJS.Timeout; +let statTabsTimer: NodeJS.Timeout; +let overrideRule: HTMLStyleElement; +let overrideFontFamily: string | undefined; +let overrideFontSize: string; + +/** Updates the global CSS rule to override the font family and size. */ +function updateGlobalOverrideRule(): void { + let fontFamily = ''; + + if (overrideFontFamily !== undefined) { + fontFamily = `font-family: ${overrideFontFamily} !important;`; + } + + const constructedRule = `body * :not(.Icon) { + ${fontFamily} + }`; + + if (overrideRule === undefined) { + 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); +} + +function setGlobalFontSize( + fontSize: string | number, + statFontSize: string | number, + statLinked: boolean, +): void { + overrideFontSize = `${fontSize}px`; + + // Used solution from theme.ts + clearInterval(statFontTimer); + Byond.command( + `.output statbrowser:set_font_size ${statLinked ? fontSize : statFontSize}px`, + ); + statFontTimer = setTimeout(() => { + Byond.command( + `.output statbrowser:set_font_size ${statLinked ? fontSize : statFontSize}px`, + ); + }, 1500); +} + +function setGlobalFontFamily(fontFamily: string): void { + overrideFontFamily = fontFamily === FONTS_DISABLED ? undefined : fontFamily; +} + +function setStatTabsStyle(style: string): void { + clearInterval(statTabsTimer); + Byond.command(`.output statbrowser:set_tabs_style ${style}`); + statTabsTimer = setTimeout(() => { + Byond.command(`.output statbrowser:set_tabs_style ${style}`); + }, 1500); +} + +export function generalSettingsHandler(update: SettingsState): void { + // Set client theme + const theme = update?.theme; + if (theme) { + setClientTheme(theme); + } + + // Update stat panel settings + setStatTabsStyle(update.statTabsStyle); + + // Update global UI font size + setGlobalFontSize(update.fontSize, update.statFontSize, update.statLinked); + setGlobalFontFamily(update.fontFamily); + updateGlobalOverrideRule(); +} diff --git a/tgui/packages/tgui-panel/settings/hooks.ts b/tgui/packages/tgui-panel/settings/hooks.ts deleted file mode 100644 index b37b49a22c80..000000000000 --- a/tgui/packages/tgui-panel/settings/hooks.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { useDispatch, useSelector } from 'tgui/backend'; - -import { toggleSettings, updateSettings } from './actions'; -import { selectSettings } from './selectors'; - -export const useSettings = () => { - const settings = useSelector(selectSettings); - const dispatch = useDispatch(); - return { - ...settings, - visible: settings.view.visible, - toggle: () => dispatch(toggleSettings()), - update: (obj) => dispatch(updateSettings(obj)), - }; -}; diff --git a/tgui/packages/tgui-panel/settings/index.ts b/tgui/packages/tgui-panel/settings/index.ts deleted file mode 100644 index 7d5dcda427af..000000000000 --- a/tgui/packages/tgui-panel/settings/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -export { useSettings } from './hooks'; -export { settingsMiddleware } from './middleware'; -export { settingsReducer } from './reducer'; -export { SettingsPanel } from './SettingsPanel'; diff --git a/tgui/packages/tgui-panel/settings/middleware.ts b/tgui/packages/tgui-panel/settings/middleware.ts deleted file mode 100644 index ca1df55a69bf..000000000000 --- a/tgui/packages/tgui-panel/settings/middleware.ts +++ /dev/null @@ -1,148 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { storage } from 'common/storage'; - -import { setClientTheme } from '../themes'; -import { - addHighlightSetting, - exportSettings, - importSettings, - loadSettings, - removeHighlightSetting, - updateHighlightSetting, - updateSettings, -} from './actions'; -import { FONTS_DISABLED } from './constants'; -import { setDisplayScaling } from './scaling'; -import { selectSettings } from './selectors'; -import { exportChatSettings } from './settingsImExport'; - -let statFontTimer: NodeJS.Timeout; -let statTabsTimer: NodeJS.Timeout; -let overrideRule: HTMLStyleElement; -let overrideFontFamily: string | undefined; -let overrideFontSize: string; - -/** Updates the global CSS rule to override the font family and size. */ -function updateGlobalOverrideRule() { - let fontFamily = ''; - - if (overrideFontFamily !== undefined) { - fontFamily = `font-family: ${overrideFontFamily} !important;`; - } - - const constructedRule = `body * :not(.Icon) { - ${fontFamily} - }`; - - if (overrideRule === undefined) { - 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); -} - -function setGlobalFontSize( - fontSize: string, - statFontSize: string, - statLinked: boolean, -) { - overrideFontSize = `${fontSize}px`; - - // Used solution from theme.ts - clearInterval(statFontTimer); - Byond.command( - `.output statbrowser:set_font_size ${statLinked ? fontSize : statFontSize}px`, - ); - statFontTimer = setTimeout(() => { - Byond.command( - `.output statbrowser:set_font_size ${statLinked ? fontSize : statFontSize}px`, - ); - }, 1500); -} - -function setGlobalFontFamily(fontFamily: string) { - overrideFontFamily = fontFamily === FONTS_DISABLED ? undefined : fontFamily; -} - -function setStatTabsStyle(style: string) { - clearInterval(statTabsTimer); - Byond.command(`.output statbrowser:set_tabs_style ${style}`); - statTabsTimer = setTimeout(() => { - Byond.command(`.output statbrowser:set_tabs_style ${style}`); - }, 1500); -} - -export function settingsMiddleware(store) { - let initialized = false; - - return (next) => (action) => { - const { type, payload } = action; - - if (!initialized) { - initialized = true; - - setDisplayScaling(); - - storage.get('panel-settings').then((settings) => { - store.dispatch(loadSettings(settings)); - }); - } - if (type === exportSettings.type) { - const state = store.getState(); - const settings = selectSettings(state); - exportChatSettings(settings, state.chat.pageById); - return; - } - if ( - type !== updateSettings.type && - type !== loadSettings.type && - type !== addHighlightSetting.type && - type !== removeHighlightSetting.type && - type !== updateHighlightSetting.type && - type !== importSettings.type - ) { - return next(action); - } - - // Set client theme - const theme = payload?.theme; - if (theme) { - setClientTheme(theme); - } - - // Pass action to get an updated state - next(action); - - const settings = selectSettings(store.getState()); - - if (importSettings.type) { - setClientTheme(settings.theme); - } - - // Update stat panel settings - setStatTabsStyle(settings.statTabsStyle); - - // Update global UI font size - setGlobalFontSize( - settings.fontSize, - settings.statFontSize, - settings.statLinked, - ); - setGlobalFontFamily(settings.fontFamily); - updateGlobalOverrideRule(); - - // Save settings to the web storage - storage.set('panel-settings', settings); - - return; - }; -} diff --git a/tgui/packages/tgui-panel/settings/migration.ts b/tgui/packages/tgui-panel/settings/migration.ts new file mode 100644 index 000000000000..e08ad2693df9 --- /dev/null +++ b/tgui/packages/tgui-panel/settings/migration.ts @@ -0,0 +1,117 @@ +import { storage } from 'common/storage'; +import { smoothMerge } from 'common/type-safety'; +import { omit, pick } from 'es-toolkit'; +import { setMusicVolume } from '../audio/handlers'; +import { chatRenderer } from '../chat/renderer'; +import { store } from '../events/store'; +import { + defaultHighlightSetting, + type defaultHighlights, + defaultSettings, + highlightsAtom, + settingsAtom, +} from './atoms'; +import { generalSettingsHandler } from './helpers'; +import { + type HighlightState, + type MergedSettings, + type SettingsState, + settingsSchema, +} from './types'; + +/** Fixes issues with stored highlight settings */ +function migrateHighlights(next: HighlightState): HighlightState { + const draft: HighlightState = { ...next }; + + // Lazy init the list for compatibility reasons + if (!draft.highlightSettings) { + draft.highlightSettings = [defaultHighlightSetting.id]; + } + + if (!draft.highlightSettingById) { + draft.highlightSettingById = { + [defaultHighlightSetting.id]: defaultHighlightSetting, + }; + } + + // Compensating for mishandling of default highlight settings + if (!draft.highlightSettingById[defaultHighlightSetting.id]) { + draft.highlightSettings = [ + defaultHighlightSetting.id, + ...draft.highlightSettings, + ]; + draft.highlightSettingById[defaultHighlightSetting.id] = + defaultHighlightSetting; + } + + // Update the highlight settings for default highlight + // settings compatibility — don't overwrite existing values + const defaultHighlight = + draft.highlightSettingById[defaultHighlightSetting.id]; + + if (!defaultHighlight.highlightColor) { + defaultHighlight.highlightColor = + draft.highlightColor ?? defaultHighlightSetting.highlightColor; + } + + if (!defaultHighlight.highlightText) { + defaultHighlight.highlightText = + draft.highlightText ?? defaultHighlightSetting.highlightText; + } + + return draft; +} + +const highlightKeys: (keyof typeof defaultHighlights)[] = [ + 'highlightSettings', + 'highlightSettingById', + 'highlightText', + 'highlightColor', +] as const; + +/** A bit of a chunky procedural function. Handles imported and loaded settings */ +export function startSettingsMigration(next: MergedSettings): void { + // No stored settings found, initialize with defaults + if (!next) { + const initialized: SettingsState = { + ...defaultSettings, + initialized: true, + }; + storage.set('panel-settings', initialized); + store.set(settingsAtom, initialized); + console.log('Initialized settings with defaults.'); + return; + } + + // Split the merged object as we save in two different atoms + const settingsPart = omit(next, highlightKeys); + const highlightPart = pick(next, highlightKeys); + + const draftSettings = smoothMerge({ + source: settingsPart, + target: defaultSettings, + schema: settingsSchema, + }); + draftSettings.initialized = true; + draftSettings.view = defaultSettings.view; // Preserve view state + + generalSettingsHandler(draftSettings); + setMusicVolume(draftSettings.adminMusicVolume); + store.set(settingsAtom, draftSettings); + console.log('Migrated panel settings:', draftSettings); + + const migratedHighlights = migrateHighlights(highlightPart); + + // Just exit if no valid version was found + if (!next.version) { + storage.set('panel-settings', { ...draftSettings, ...migratedHighlights }); + return; + } + + chatRenderer.setHighlight( + migratedHighlights.highlightSettings, + migratedHighlights.highlightSettingById, + ); + store.set(highlightsAtom, migratedHighlights); + console.log('Migrated panel highlight settings:', migratedHighlights); +} diff --git a/tgui/packages/tgui-panel/settings/model.ts b/tgui/packages/tgui-panel/settings/model.ts deleted file mode 100644 index 9c86be37628e..000000000000 --- a/tgui/packages/tgui-panel/settings/model.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @file - */ -import { createUuid } from 'tgui-core/uuid'; - -export const createHighlightSetting = (obj?: Record) => ({ - id: createUuid(), - highlightText: '', - highlightColor: '#ffdd44', - highlightWholeMessage: true, - matchWord: false, - matchCase: false, - ...obj, -}); - -export const createDefaultHighlightSetting = (obj?: Record) => - createHighlightSetting({ - id: 'default', - ...obj, - }); diff --git a/tgui/packages/tgui-panel/settings/reducer.ts b/tgui/packages/tgui-panel/settings/reducer.ts deleted file mode 100644 index 4328f6530a4c..000000000000 --- a/tgui/packages/tgui-panel/settings/reducer.ts +++ /dev/null @@ -1,227 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { - addHighlightSetting, - changeSettingsTab, - importSettings, - loadSettings, - openChatSettings, - removeHighlightSetting, - toggleSettings, - updateHighlightSetting, - updateSettings, -} from './actions'; -import { FONTS, SETTINGS_TABS } from './constants'; -import { createDefaultHighlightSetting } from './model'; - -const defaultHighlightSetting = createDefaultHighlightSetting(); - -const initialState = { - version: 1, - fontSize: 13, - fontFamily: FONTS[0], - lineHeight: 1.2, - theme: 'light', - adminMusicVolume: 0.5, - // Keep these two state vars for compatibility with other servers - highlightText: '', - highlightColor: '#ffdd44', - // END compatibility state vars - highlightSettings: [defaultHighlightSetting.id], - highlightSettingById: { - [defaultHighlightSetting.id]: defaultHighlightSetting, - }, - view: { - visible: false, - activeTab: SETTINGS_TABS[0].id, - }, - initialized: false, - statLinked: true, - statFontSize: 12, - statTabsStyle: 'default', -} as const; - -export function settingsReducer( - state = initialState, - action: { type: string; payload: any }, -) { - const { type, payload } = action; - - switch (type) { - case updateSettings.type: - return { - ...state, - ...payload, - }; - - case loadSettings.type: { - { - // Validate version and/or migrate state - if (!payload?.version) { - const nextState = { - ...state, - ...payload, - }; - nextState.initialized = true; - return nextState; - } - - delete payload.view; - const nextState = { - ...state, - ...payload, - }; - nextState.initialized = true; - // Lazy init the list for compatibility reasons - if (!nextState.highlightSettings) { - nextState.highlightSettings = [defaultHighlightSetting.id]; - nextState.highlightSettingById[defaultHighlightSetting.id] = - defaultHighlightSetting; - } - // Compensating for mishandling of default highlight settings - else if (!nextState.highlightSettingById[defaultHighlightSetting.id]) { - nextState.highlightSettings = [ - defaultHighlightSetting.id, - ...nextState.highlightSettings, - ]; - nextState.highlightSettingById[defaultHighlightSetting.id] = - defaultHighlightSetting; - } - - // Update the highlight settings for default highlight - // settings compatibility - const highlightSetting = - nextState.highlightSettingById[defaultHighlightSetting.id]; - highlightSetting.highlightColor = nextState.highlightColor; - highlightSetting.highlightText = nextState.highlightText; - - return nextState; - } - } - - case importSettings.type: { - const newSettings = payload.newSettings; - if (!newSettings) { - return state; - } - const nextState = { - ...state, - ...newSettings, - }; - return nextState; - } - - case toggleSettings.type: { - return { - ...state, - view: { - ...state.view, - visible: !state.view.visible, - }, - }; - } - - case openChatSettings.type: { - return { - ...state, - view: { - ...state.view, - visible: true, - activeTab: 'chatPage', - }, - }; - } - - case changeSettingsTab.type: { - const { tabId } = payload; - - return { - ...state, - view: { - ...state.view, - activeTab: tabId, - }, - }; - } - - case addHighlightSetting.type: { - const highlightSetting = payload; - - return { - ...state, - highlightSettings: [...state.highlightSettings, highlightSetting.id], - highlightSettingById: { - ...state.highlightSettingById, - [highlightSetting.id]: highlightSetting, - }, - }; - } - - case removeHighlightSetting.type: { - const { id } = payload; - - const nextState = { - ...state, - highlightSettings: [...state.highlightSettings], - highlightSettingById: { - ...state.highlightSettingById, - }, - }; - - if (id === defaultHighlightSetting.id) { - nextState.highlightSettings[defaultHighlightSetting.id] = - defaultHighlightSetting; - } else { - delete nextState.highlightSettingById[id]; - nextState.highlightSettings = nextState.highlightSettings.filter( - (sid) => sid !== id, - ); - if (!nextState.highlightSettings.length) { - nextState.highlightSettings.push(defaultHighlightSetting.id); - nextState.highlightSettingById[defaultHighlightSetting.id] = - defaultHighlightSetting; - } - } - - return nextState; - } - - case updateHighlightSetting.type: { - const { id, ...settings } = payload; - - const nextState = { - ...state, - highlightSettings: [...state.highlightSettings], - highlightSettingById: { - ...state.highlightSettingById, - }, - }; - - // Transfer this data from the default highlight setting - // so they carry over to other servers - if (id === defaultHighlightSetting.id) { - if (settings.highlightText) { - nextState.highlightText = settings.highlightText; - } - if (settings.highlightColor) { - nextState.highlightColor = settings.highlightColor; - } - } - - if (nextState.highlightSettingById[id]) { - nextState.highlightSettingById[id] = { - ...nextState.highlightSettingById[id], - ...settings, - }; - } - - return nextState; - } - } - - return state; -} diff --git a/tgui/packages/tgui-panel/settings/selectors.ts b/tgui/packages/tgui-panel/settings/selectors.ts deleted file mode 100644 index 75f9ecb49883..000000000000 --- a/tgui/packages/tgui-panel/settings/selectors.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -export const selectSettings = (state) => state.settings; -export const selectActiveTab = (state) => state.settings.view.activeTab; -export const selectHighlightSettings = (state) => - state.settings.highlightSettings; -export const selectHighlightSettingById = (state) => - state.settings.highlightSettingById; diff --git a/tgui/packages/tgui-panel/settings/settingsImExport.ts b/tgui/packages/tgui-panel/settings/settingsImExport.ts index 1cc7ba9c6fa4..a0b061226c4a 100644 --- a/tgui/packages/tgui-panel/settings/settingsImExport.ts +++ b/tgui/packages/tgui-panel/settings/settingsImExport.ts @@ -1,12 +1,16 @@ -import { useDispatch } from 'tgui/backend'; +import { omit } from 'es-toolkit'; +import { chatPagesRecordAtom, mainPage } from '../chat/atom'; +import { startChatStateMigration } from '../chat/migration'; +import type { Page, StoredChatSettings } from '../chat/types'; +import { store } from '../events/store'; +import { storedSettingsAtom } from './atoms'; +import { startSettingsMigration } from './migration'; +import type { ExportedSettings } from './types'; -import type { Page } from '../chat/types'; -import { importSettings } from './actions'; +export function exportChatSettings(): void { + const chatPages = store.get(chatPagesRecordAtom); + const settings = store.get(storedSettingsAtom); -export function exportChatSettings( - settings: Record, - pages: Record[], -) { const opts: SaveFilePickerOptions = { id: `ss13-chatprefs-${Date.now()}`, suggestedName: `ss13-chatsettings-${new Date().toJSON().slice(0, 10)}.json`, @@ -18,9 +22,7 @@ export function exportChatSettings( ], }; - const pagesEntry = { chatPages: pages }; - - const exportObject = Object.assign(settings, pagesEntry); + const exportObject = { ...settings, chatPages }; window .showSaveFilePicker(opts) @@ -38,17 +40,53 @@ export function exportChatSettings( }); } -export function importChatSettings(settings: string | string[]) { - const dispatch = useDispatch(); - if (Array.isArray(settings)) { +export function importChatSettings(settings: string | string[]): void { + if (Array.isArray(settings)) return; + + let ourImport: ExportedSettings; + try { + ourImport = JSON.parse(settings); + } catch (err) { + console.error(err); return; } - const ourImport = JSON.parse(settings); - if (!ourImport?.version) { - return; + + const settingsPart = omit(ourImport, ['chatPages']); + + if ('chatPages' in ourImport && ourImport.chatPages) { + const chatPart = rebuildChatState(ourImport.chatPages); + if (chatPart) { + startChatStateMigration(chatPart); + } + } + + startSettingsMigration(settingsPart); +} + +/** Reconstructs chat settings from just the record */ +function rebuildChatState( + pageRecord: Record, +): StoredChatSettings | undefined { + const newPageIds: string[] = Object.keys(pageRecord); + if (newPageIds.length === 0) return; + + // Correct any missing keys from the import + const merged: Record = { ...pageRecord }; + for (const page of newPageIds) { + merged[page] = { + ...mainPage, + ...pageRecord[page], + unreadCount: 0, + }; } - const pageRecord = ourImport.chatPages; - delete ourImport.chatPages; - dispatch(importSettings(ourImport, pageRecord)); + const rebuiltState: StoredChatSettings = { + version: 1, + scrollTracking: true, + currentPageId: newPageIds[0], + pages: newPageIds, + pageById: merged, + }; + + return rebuiltState; } diff --git a/tgui/packages/tgui-panel/themes.ts b/tgui/packages/tgui-panel/settings/themes.ts similarity index 89% rename from tgui/packages/tgui-panel/themes.ts rename to tgui/packages/tgui-panel/settings/themes.ts index 5679c62d955c..e94aaf7be3ab 100644 --- a/tgui/packages/tgui-panel/themes.ts +++ b/tgui/packages/tgui-panel/settings/themes.ts @@ -4,22 +4,7 @@ * @license MIT */ -export const THEMES = ['light', 'dark']; - -const COLORS = { - DARK: { - BG_BASE: '#202020', - BG_SECOND: '#151515', - BUTTON: '#404040', - TEXT: '#A6A6A6', - }, - LIGHT: { - BG_BASE: '#EEEEEE', - BG_SECOND: '#FFFFFF', - BUTTON: '#FFFFFF', - TEXT: '#000000', - }, -}; +import { COLORS } from './constants'; let setClientThemeTimer: NodeJS.Timeout; @@ -33,7 +18,7 @@ let setClientThemeTimer: NodeJS.Timeout; * There's no way round it. We're essentially changing the skin by hand. * It's painful but it works, and is the way Lummox suggested. */ -export const setClientTheme = (name) => { +export function setClientTheme(name): void | Promise { // Transmit once for fast updates and again in a little while in case we won // the race against statbrowser init. clearInterval(setClientThemeTimer); @@ -43,9 +28,7 @@ export const setClientTheme = (name) => { }, 1500); const themeColor = COLORS[name.toUpperCase()]; - if (!themeColor) { - return; - } + if (!themeColor) return; return Byond.winset({ // Main windows @@ -94,4 +77,4 @@ export const setClientTheme = (name) => { 'input.background-color': themeColor.BG_SECOND, 'input.text-color': themeColor.TEXT, }); -}; +} diff --git a/tgui/packages/tgui-panel/settings/types.ts b/tgui/packages/tgui-panel/settings/types.ts new file mode 100644 index 000000000000..c47fac15a857 --- /dev/null +++ b/tgui/packages/tgui-panel/settings/types.ts @@ -0,0 +1,45 @@ +import * as z from 'zod'; +import type { ChatPages } from '../chat/types'; + +const viewSchema = z.object({ + activeTab: z.string(), + visible: z.boolean(), +}); + +export const settingsSchema = z.object({ + adminMusicVolume: z.number(), + fontFamily: z.string(), + fontSize: z.number(), + initialized: z.boolean(), + lineHeight: z.number(), + statFontSize: z.number(), + statLinked: z.boolean(), + statTabsStyle: z.string(), + theme: z.string(), + version: z.number(), + view: viewSchema, +}); + +export type HighlightSetting = { + highlightColor: string; + highlightText: string; + highlightWholeMessage: boolean; + id: string; + matchCase: boolean; + matchWord: boolean; +}; + +export type HighlightState = { + highlightSettings: string[]; + highlightSettingById: Record; + highlightText: string; + highlightColor: string; +}; + +export type SettingsState = z.infer; + +// Imported and loaded settings without chatpages +export interface MergedSettings extends SettingsState, HighlightState {} + +// Full exported settings with chatpages +export interface ExportedSettings extends MergedSettings, ChatPages {} diff --git a/tgui/packages/tgui-panel/settings/use-highlights.ts b/tgui/packages/tgui-panel/settings/use-highlights.ts new file mode 100644 index 000000000000..b96cf67b8e7a --- /dev/null +++ b/tgui/packages/tgui-panel/settings/use-highlights.ts @@ -0,0 +1,109 @@ +import { storage } from 'common/storage'; +import { useAtom, useAtomValue } from 'jotai'; +import { createUuid } from 'tgui-core/uuid'; +import { chatRenderer } from '../chat/renderer'; +import { defaultHighlightSetting, highlightsAtom, settingsAtom } from './atoms'; +import type { HighlightSetting, HighlightState } from './types'; + +/** Custom hook with utility functions for updating highlight settings */ +export function useHighlights() { + const [highlights, setHighlights] = useAtom(highlightsAtom); + const settings = useAtomValue(settingsAtom); + + function storeHighlights(update: HighlightState): void { + setHighlights(update); + storage.set('panel-settings', { + ...settings, + ...update, + }); + chatRenderer.setHighlight( + update.highlightSettings, + update.highlightSettingById, + ); + } + + function updateHighlight( + update: Partial & { id: string }, + ): void { + const { id } = update; + const current = highlights.highlightSettingById[id]; + if (!current) return; + + // Copies highlights and updates the specified setting + const draft: HighlightState['highlightSettingById'] = { + ...highlights.highlightSettingById, + [id]: { + ...current, + ...update, + }, + }; + + // Reconstruct the overall highlight structure + const newState: HighlightState = { + ...highlights, + highlightSettings: Object.keys(draft), + highlightSettingById: draft, + }; + + // Update state and persist to storage + storeHighlights(newState); + } + + function removeHighlight(id: string): void { + const draft: Record = {}; + // Rebuild the highlight settings without the specified id + for (const key in highlights.highlightSettingById) { + if (key !== id) { + draft[key] = highlights.highlightSettingById[key]; + } + } + + const draftKeys = highlights.highlightSettings.filter((key) => key !== id); + + // Ensure the default highlight setting always exists + if (id === defaultHighlightSetting.id) { + draft[defaultHighlightSetting.id] = defaultHighlightSetting; + draftKeys.unshift(defaultHighlightSetting.id); + } + + // Construct the updated highlight settings structure + const newState: HighlightState = { + ...highlights, + highlightSettingById: draft, + highlightSettings: draftKeys, + }; + + // Update state and persist to storage + storeHighlights(newState); + } + + function addHighlight(): void { + const draft: HighlightSetting = { + ...defaultHighlightSetting, + id: createUuid(), + }; + + // Append to the existing highlight settings + const updatedIds: HighlightState['highlightSettingById'] = { + ...highlights.highlightSettingById, + [draft.id]: draft, + }; + + // Reconstruct the overall highlight settings structure + const newState: HighlightState = { + ...highlights, + highlightSettings: [...highlights.highlightSettings, draft.id], + highlightSettingById: updatedIds, + }; + + // Update state and persist to storage + storeHighlights(newState); + } + + return { + highlights, + updateHighlight, + removeHighlight, + addHighlight, + }; +} diff --git a/tgui/packages/tgui-panel/settings/use-settings.ts b/tgui/packages/tgui-panel/settings/use-settings.ts new file mode 100644 index 000000000000..6422e735b2de --- /dev/null +++ b/tgui/packages/tgui-panel/settings/use-settings.ts @@ -0,0 +1,56 @@ +import { storage } from 'common/storage'; +import { useAtom, useAtomValue } from 'jotai'; +import { useEffect } from 'react'; +import { highlightsAtom, settingsAtom, settingsLoadedAtom } from './atoms'; +import { generalSettingsHandler } from './helpers'; +import { startSettingsMigration } from './migration'; +import { setDisplayScaling } from './scaling'; +import type { SettingsState } from './types'; + +/** Custom hook that handles loading and updating settings from storage. */ +export function useSettings() { + const [settings, setSettings] = useAtom(settingsAtom); + const highlights = useAtomValue(highlightsAtom); + + const [loaded, setLoaded] = useAtom(settingsLoadedAtom); + + /** Load and migrate settings */ + useEffect(() => { + if (loaded) return; + + async function fetchSettings(): Promise { + try { + const storedSettings = await storage.get('panel-settings'); + console.log('Loaded panel settings from storage:', storedSettings); + startSettingsMigration(storedSettings); + } catch (error) { + console.error('Failed to load panel settings:', error); + } + } + + fetchSettings(); + setDisplayScaling(); + setLoaded(true); + }, []); + + function storeSettings(update: SettingsState): void { + setSettings(update); + console.log('Updated panel settings:', update); + storage.set('panel-settings', { ...update, ...highlights }); + } + + /** Updates any set of keys. Offers type safety based on the selection */ + function updateSettings( + update: Record, + ): void { + const newSettings: SettingsState = { + ...settings, + ...update, + }; + + generalSettingsHandler(newSettings); + storeSettings(newSettings); + } + + return { settings, updateSettings }; +} diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss index 2d12e53226ab..99f0e74ead7e 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss @@ -407,6 +407,27 @@ em { color: hsl(157.1, 39.6%, 62.4%); } +// DARKPACK EDIT START +.policeradio { + color: hsl(210, 100%, 62%); +} +.clinicradio { + color: hsl(239, 100%, 73%); +} +.militaryradio { + color: hsl(93, 100%, 41%); +} +.camarillaradio { + color: hsl(300, 81%, 34%); +} +.anarchradio { + color: hsl(0, 57%, 46%); +} +.endronradio { + color: hsl(22, 100%, 50%); +} +// DARKPACK EDIT END + .yell { font-weight: bold; } @@ -925,7 +946,9 @@ em { } .drone { - color: hsl(60, 0.8%, 51.4%); + color: hsl(60, 100%, 50%); + background-color: hsl(287 62% 36%); + font-style: italic; } .monkey { @@ -1265,3 +1288,14 @@ $border-width-px: $border-width * 1px; ); } } + +/* DARKPACK EDIT ADD START */ + +.looc { + color: #d8b555; +} +.rlooc { + color: #b09448; +} + +/* DARKPACK EDIT ADD END */ diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss index 6484acc54f85..fb873112d418 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss @@ -414,6 +414,27 @@ em { color: hsl(157.1, 39.6%, 62.4%); } +// DARKPACK EDIT START +.policeradio { + color: hsl(210, 100%, 30%); +} +.clinicradio { + color: hsl(239, 94%, 38%); +} +.militaryradio { + color: hsl(93, 100%, 34%); +} +.camarillaradio { + color: hsl(300, 94%, 14%); +} +.anarchradio { + color: hsl(0, 93%, 40%); +} +.endronradio { + color: hsl(22, 98%, 42%); +} +// DARKPACK EDIT END + .yell { font-weight: bold; } @@ -929,7 +950,9 @@ h2.alert { } .drone { - color: hsl(60, 0.8%, 51.4%); + color: hsl(60 100% 50%); + background-color: hsl(287 62% 36%); + font-style: italic; } .monkey { @@ -1246,3 +1269,16 @@ $border-width-px: $border-width * 1px; ); } } + +/* DARKPACK EDIT ADD START */ + +.looc { + color: #6699cc; + font-weight: bold; +} +.rlooc { + color: #507294; + font-weight: bold; +} + +/* DARKPACK EDIT ADD END */ diff --git a/tgui/packages/tgui-panel/telemetry.js b/tgui/packages/tgui-panel/telemetry.js deleted file mode 100644 index 581d32f30697..000000000000 --- a/tgui/packages/tgui-panel/telemetry.js +++ /dev/null @@ -1,97 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { storage } from 'common/storage'; -import { createLogger } from 'tgui/logging'; - -const logger = createLogger('telemetry'); - -const MAX_CONNECTIONS_STORED = 10; - -const connectionsMatch = (a, b) => - a.ckey === b.ckey && - a.address === b.address && - a.computer_id === b.computer_id; - -export const telemetryMiddleware = (store) => { - let telemetry; - let wasRequestedWithPayload; - return (next) => (action) => { - const { type, payload } = action; - // Handle telemetry requests - if (type === 'telemetry/request') { - // Defer telemetry request until we have the actual telemetry - if (!telemetry) { - logger.debug('deferred'); - wasRequestedWithPayload = payload; - return; - } - logger.debug('sending'); - const limits = payload?.limits || {}; - // Trim connections according to the server limit - const connections = telemetry.connections.slice(0, limits.connections); - Byond.sendMessage('telemetry', { connections }); - return; - } - // For whatever reason we didn't get the telemetry, re-request - if (type === 'testTelemetryCommand') { - setTimeout(() => { - if (!telemetry) { - Byond.sendMessage('ready'); - } - }, 500); - } - // Keep telemetry up to date - if (type === 'backend/update') { - next(action); - (async () => { - // Extract client data - const client = payload?.config?.client; - if (!client) { - logger.error('backend/update payload is missing client data!'); - return; - } - // Load telemetry - if (!telemetry) { - telemetry = (await storage.get('telemetry')) || {}; - if (!telemetry.connections) { - telemetry.connections = []; - } - logger.debug('retrieved telemetry from storage', telemetry); - } - // Append a connection record - let telemetryMutated = false; - - const duplicateConnection = telemetry.connections.find((conn) => - connectionsMatch(conn, client), - ); - if (!duplicateConnection) { - telemetryMutated = true; - telemetry.connections.unshift(client); - if (telemetry.connections.length > MAX_CONNECTIONS_STORED) { - telemetry.connections.pop(); - } - } - // Save telemetry - if (telemetryMutated) { - logger.debug('saving telemetry to storage', telemetry); - storage.set('telemetry', telemetry); - } - // Continue deferred telemetry requests - if (wasRequestedWithPayload) { - const payload = wasRequestedWithPayload; - wasRequestedWithPayload = null; - store.dispatch({ - type: 'telemetry/request', - payload, - }); - } - })(); - return; - } - return next(action); - }; -}; diff --git a/tgui/packages/tgui-panel/telemetry/constants.ts b/tgui/packages/tgui-panel/telemetry/constants.ts new file mode 100644 index 000000000000..9c419e69586b --- /dev/null +++ b/tgui/packages/tgui-panel/telemetry/constants.ts @@ -0,0 +1 @@ +export const MAX_CONNECTIONS_STORED = 10; diff --git a/tgui/packages/tgui-panel/telemetry/handlers.ts b/tgui/packages/tgui-panel/telemetry/handlers.ts new file mode 100644 index 000000000000..e665c80af21f --- /dev/null +++ b/tgui/packages/tgui-panel/telemetry/handlers.ts @@ -0,0 +1,102 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { storage } from 'common/storage'; +import { createLogger } from 'tgui/logging'; +import { MAX_CONNECTIONS_STORED } from './constants'; +import { type ConnectionRecord, connectionsMatch } from './helpers'; + +type Telemetry = { + connections: ConnectionRecord[]; +}; + +type TelemetryRequestPayload = { + limits?: { + connections: number; + }; +}; + +const logger = createLogger('telemetry'); + +let telemetry: Telemetry | null = null; +let wasRequestedWithPayload; + +export function telemetryRequest(payload: TelemetryRequestPayload): void { + // Defer telemetry request until we have the actual telemetry + if (!telemetry) { + logger.debug('deferred telemetry'); + wasRequestedWithPayload = payload; + return; + } + + logger.debug('sending telemetry'); + const limits = payload?.limits?.connections; + // Trim connections according to the server limit + const connections = telemetry.connections.slice(0, limits); + Byond.sendMessage('telemetry', { connections }); +} + +export function testTelemetryCommand() { + setTimeout(() => { + if (!telemetry) { + Byond.sendMessage('ready'); + } + }, 500); +} + +type TelemetryUpdatePayload = { + config: { + client: ConnectionRecord; + }; +}; + +export async function handleTelemetryData( + payload: TelemetryUpdatePayload, +): Promise { + // Extract client data + const client = payload?.config?.client; + if (!client) { + logger.error('backend/update payload is missing client data!'); + return; + } + + // Load telemetry + if (!telemetry) { + const stored = await storage.get('telemetry'); + telemetry = { + connections: stored?.connections ?? [], + }; + logger.debug('Retrieved telemetry from storage', telemetry); + } + + // Append a connection record + let telemetryMutated = false; + + const duplicateConnection = telemetry!.connections.find((conn) => + connectionsMatch(conn, client), + ); + + if (!duplicateConnection) { + telemetryMutated = true; + telemetry!.connections.unshift(client); + if (telemetry!.connections.length > MAX_CONNECTIONS_STORED) { + telemetry!.connections.pop(); + } + } + + // Save telemetry + if (telemetryMutated) { + logger.debug('Saving telemetry to storage', telemetry); + storage.set('telemetry', telemetry); + } + + // Continue deferred telemetry requests + if (wasRequestedWithPayload) { + const deferred = wasRequestedWithPayload; + wasRequestedWithPayload = null; + telemetryRequest(deferred); + } +} diff --git a/tgui/packages/tgui-panel/telemetry/helpers.ts b/tgui/packages/tgui-panel/telemetry/helpers.ts new file mode 100644 index 000000000000..3ab6f992e57a --- /dev/null +++ b/tgui/packages/tgui-panel/telemetry/helpers.ts @@ -0,0 +1,16 @@ +export type ConnectionRecord = { + ckey: string; + address: string; + computer_id: string; +}; + +export function connectionsMatch( + a: ConnectionRecord, + b: ConnectionRecord, +): boolean { + return ( + a.ckey === b.ckey && + a.address === b.address && + a.computer_id === b.computer_id + ); +} diff --git a/tgui/packages/tgui-say/ChannelIterator.test.ts b/tgui/packages/tgui-say/ChannelIterator.test.ts index b57f0d0df74b..3dfbb0e84ab2 100644 --- a/tgui/packages/tgui-say/ChannelIterator.test.ts +++ b/tgui/packages/tgui-say/ChannelIterator.test.ts @@ -13,6 +13,9 @@ describe('ChannelIterator', () => { expect(channelIterator.current()).toBe('Say'); expect(channelIterator.next()).toBe('Radio'); expect(channelIterator.next()).toBe('Me'); + // DARKPACK EDIT ADD START + expect(channelIterator.next()).toBe('LOOC'); + // DARKPACK EDIT ADD END expect(channelIterator.next()).toBe('OOC'); expect(channelIterator.next()).toBe('Say'); // Admin is blacklisted so it should be skipped }); diff --git a/tgui/packages/tgui-say/ChannelIterator.ts b/tgui/packages/tgui-say/ChannelIterator.ts index 5d73730e51af..50eaf336672a 100644 --- a/tgui/packages/tgui-say/ChannelIterator.ts +++ b/tgui/packages/tgui-say/ChannelIterator.ts @@ -1,4 +1,4 @@ -export type Channel = 'Say' | 'Radio' | 'Me' | 'OOC' | 'Admin'; +export type Channel = 'Say' | 'Radio' | 'Me' | 'OOC' | 'Admin' | 'LOOC'; // DARKPACK EDIT, ORIGINAL: export type Channel = 'Say' | 'Radio' | 'Me' | 'OOC' | 'Admin'; /** * ### ChannelIterator @@ -8,9 +8,9 @@ export type Channel = 'Say' | 'Radio' | 'Me' | 'OOC' | 'Admin'; */ export class ChannelIterator { private index: number = 0; - private readonly channels: Channel[] = ['Say', 'Radio', 'Me', 'OOC', 'Admin']; + private readonly channels: Channel[] = ['Say', 'Radio', 'Me', 'LOOC', 'OOC', 'Admin']; // DARKPACK EDIT, ORIGINAL: private readonly channels: Channel[] = ['Say', 'Radio', 'Me', 'OOC', 'Admin']; private readonly blacklist: Channel[] = ['Admin']; - private readonly quiet: Channel[] = ['OOC', 'Admin']; + private readonly quiet: Channel[] = ['OOC', 'LOOC', 'Admin']; // DARKPACK EDIT, ORIGINAL: private readonly quiet: Channel[] = ['OOC', 'Admin']; public next(): Channel { if (this.blacklist.includes(this.channels[this.index])) { diff --git a/tgui/packages/tgui-say/TguiSay.tsx b/tgui/packages/tgui-say/TguiSay.tsx index fc3cdc2a34a6..0fdcab89d7c6 100644 --- a/tgui/packages/tgui-say/TguiSay.tsx +++ b/tgui/packages/tgui-say/TguiSay.tsx @@ -82,7 +82,11 @@ export function TguiSay() { setButtonContent(currentPrefix.current ?? iterator.current()); // Empty input, resets the channel - } else if (currentPrefix.current && iterator.isSay() && value?.length === 0) { + } else if ( + currentPrefix.current && + iterator.isSay() && + value?.length === 0 + ) { setCurrentPrefix(null); setButtonContent(iterator.current()); } @@ -152,6 +156,15 @@ export function TguiSay() { handleClose(); } + function handleSaveText(): void { + const iterator = channelIterator.current; + const currentValue = innerRef.current?.value; + + if (!currentValue || !iterator.isVisible()) return; + + messages.current.saveText(currentValue, iterator.current()); + } + function handleIncrementChannel(): void { const iterator = channelIterator.current; @@ -248,6 +261,7 @@ export function TguiSay() { Byond.subscribeTo('props', handleProps); Byond.subscribeTo('force', handleForceSay); Byond.subscribeTo('open', handleOpen); + Byond.subscribeTo('save', handleSaveText); }, []); /** Value has changed, we need to check if the size of the window is ok */ diff --git a/tgui/packages/tgui-say/constants.ts b/tgui/packages/tgui-say/constants.ts index 9520807fa76e..e76f5a59a89a 100644 --- a/tgui/packages/tgui-say/constants.ts +++ b/tgui/packages/tgui-say/constants.ts @@ -18,6 +18,7 @@ export enum LineLength { * Displays the name in the left button, tags a css class. */ export const RADIO_PREFIXES = { + /* // DARKPACK EDIT REMOVAL START ':a ': 'Hive', ':b ': 'io', ':c ': 'Cmd', @@ -26,10 +27,20 @@ export const RADIO_PREFIXES = { ':m ': 'Med', ':n ': 'Sci', ':o ': 'AI', + */ // DARKPACK EDIT REMOVAL END ':p ': 'Ent', + /* // DARKPACK EDIT REMOVAL START ':s ': 'Sec', ':t ': 'Synd', ':u ': 'Supp', ':v ': 'Svc', ':y ': 'CCom', + */ // DARKPACK EDIT REMOVAL END + // DARKPACK EDIT ADD START + ':s ': 'SFPD', + ':m ': 'SFMC', + ':a ': 'Army', + ':t ': 'Tow', + ':b ': 'Bar', + // DARKPACK EDIT ADD END } as const; diff --git a/tgui/packages/tgui-say/package.json b/tgui/packages/tgui-say/package.json index 47d64bc70e9c..45f81711e6d5 100644 --- a/tgui/packages/tgui-say/package.json +++ b/tgui/packages/tgui-say/package.json @@ -6,7 +6,7 @@ "react": "^19.1.0", "react-dom": "^19.1.0", "tgui": "workspace:*", - "tgui-core": "^5.3.1" + "tgui-core": "^5.6.0" }, "private": true } diff --git a/tgui/packages/tgui-say/styles/colors.scss b/tgui/packages/tgui-say/styles/colors.scss index 0ba363660bb4..0040672ce2a6 100644 --- a/tgui/packages/tgui-say/styles/colors.scss +++ b/tgui/packages/tgui-say/styles/colors.scss @@ -16,6 +16,14 @@ $_channel_map: ( 'Engi': hsl(17, 87.8%, 61.4%), 'Hive': hsl(300, 17.7%, 44.3%), 'io': hsl(209.6, 100%, 55.9%), + // DARKPAK EDIT ADD START + 'LOOC': hsl(20, 100%, 86%), + 'SFPD': hsl(210, 92%, 41%), + 'SFMC': hsl(172, 100%, 43%), + 'Army': hsl(120, 94%, 26%), + 'Tow': hsl(290, 94%, 44%), + 'Bar': hsl(357, 80%, 35%), + // DARKPACK EDIT ADD END 'Me': hsl(227, 63.5%, 60.2%), 'Med': hsl(202, 83.6%, 64.1%), 'OOC': hsl(47.9, 100%, 40%), diff --git a/tgui/packages/tgui-say/timers.ts b/tgui/packages/tgui-say/timers.ts index b13e09ede752..6b4a9f46f08b 100644 --- a/tgui/packages/tgui-say/timers.ts +++ b/tgui/packages/tgui-say/timers.ts @@ -17,6 +17,12 @@ export const byondMessages = { 1 * SECONDS, true, ), + saveText: debounce( + (entry: string, channel: Channel) => + Byond.sendMessage('save', { entry, channel }), + 1 * SECONDS, + true, + ), // Throttle: Prevents spamming the server typingMsg: throttle(() => Byond.sendMessage('typing'), 4 * SECONDS), } as const; diff --git a/tgui/packages/tgui-setup/helpers.js b/tgui/packages/tgui-setup/helpers.js index f4965d635b5d..61df7146a8f7 100644 --- a/tgui/packages/tgui-setup/helpers.js +++ b/tgui/packages/tgui-setup/helpers.js @@ -29,6 +29,7 @@ // Expose inlined metadata Byond.windowId = parseMetaTag('tgui:windowId'); + Byond.storageCdn = parseMetaTag('tgui:storagecdn'); // Backwards compatibility window.__windowId__ = Byond.windowId; diff --git a/tgui/packages/tgui/backend.ts b/tgui/packages/tgui/backend.ts index 83afa926022c..7a40ee4b8010 100644 --- a/tgui/packages/tgui/backend.ts +++ b/tgui/packages/tgui/backend.ts @@ -172,7 +172,6 @@ export const backendReducer = (state = initialState, action) => { }; export const backendMiddleware = (store) => { - let fancyState; let suspendInterval; return (next) => (action) => { @@ -218,23 +217,6 @@ export const backendMiddleware = (store) => { setTimeout(() => focusMap()); } - if (type === 'backend/update') { - const fancy = payload.config?.window?.fancy; - // Initialize fancy state - if (fancyState === undefined) { - fancyState = fancy; - } - // React to changes in fancy - else if (fancyState !== fancy) { - logger.log('changing fancy mode to', fancy); - fancyState = fancy; - Byond.winset(Byond.windowId, { - titlebar: !fancy, - 'can-resize': !fancy, - }); - } - } - // Resume on incoming update if (type === 'backend/update' && suspended) { // Show the payload @@ -353,9 +335,8 @@ const chunkSplitter = { export const sendAct = (action: string, payload: object = {}) => { // Validate that payload is an object // prettier-ignore - const isObject = typeof payload === 'object' - && payload !== null - && !Array.isArray(payload); + const isObject = + typeof payload === 'object' && payload !== null && !Array.isArray(payload); if (!isObject) { logger.error(`Payload for act() must be an object, got this:`, payload); return; @@ -400,7 +381,6 @@ type BackendState = { window: { key: string; size: [number, number]; - fancy: BooleanLike; locked: BooleanLike; scale: BooleanLike; }; diff --git a/tgui/packages/tgui/constants/theme.ts b/tgui/packages/tgui/constants/theme.ts new file mode 100644 index 000000000000..6b77ffd84d92 --- /dev/null +++ b/tgui/packages/tgui/constants/theme.ts @@ -0,0 +1,31 @@ +/** + * TGUI Base16 Theme + * Based on TGUI color scheme defined in css variables + * @see https://github.com/chriskempson/base16 + * @see https://github.com/tgstation/tgui-core/blob/main/styles/vars-colors.scss + */ +export const tgui16 = { + scheme: 'ntos16', + author: 'Aleksej Komarov et al., (https://github.com/tgstation)', + // Backgrounds / UI surfaces + base00: '#1A1A1A', + base01: '#313234', + base02: '#3a3a36', + base03: '#6b6b5b', + + // Foreground / text + base04: '#a59f85', + base05: '#f8f8f2', // default text (near white) + base06: '#f5f4f1', + base07: '#f9f8f5', + + // Accent colors + base08: '#f92672', + base09: '#fd971f', + base0A: '#f4bf75', + base0B: '#5BA626', // --color-good + base0C: '#a1efe4', + base0D: '#47739E', // blue primary + base0E: '#ae81ff', + base0F: '#cc6633', +} as const; diff --git a/tgui/packages/tgui/debug/KitchenSink.tsx b/tgui/packages/tgui/debug/KitchenSink.tsx index 3bfa77e513cd..ae63ddd0633c 100644 --- a/tgui/packages/tgui/debug/KitchenSink.tsx +++ b/tgui/packages/tgui/debug/KitchenSink.tsx @@ -4,62 +4,107 @@ * @license MIT */ import { useState } from 'react'; -import { Section, Stack, Tabs } from 'tgui-core/components'; - +import { JSONTree } from 'react-json-tree'; +import { Divider, NoticeBox, Section, Stack, Tabs } from 'tgui-core/components'; +import { useBackend } from '../backend'; +import { tgui16 } from '../constants/theme'; import { Pane, Window } from '../layouts'; -const r = import.meta.webpackContext('../', { - recursive: false, - include: /\.stories\.tsx$/, -}); +type Props = { + panel?: boolean; +}; -/** - * @returns {{ - * meta: { - * title: string, - * render: () => any, - * }, - * }[]} - */ -function getStories() { - return r.keys().map((path) => r(path)); +enum Tab { + Config = 'config', + Data = 'data', + Shared = 'shared', + Chunks = 'outgoingPayloadQueues', + Components = 'components', } -export function KitchenSink(props) { +const tabs = [ + { name: 'Config', value: Tab.Config }, + { name: 'Data', value: Tab.Data }, + { name: 'Shared', value: Tab.Shared }, + { name: 'Chunks', value: Tab.Chunks }, +] as const; + +export function KitchenSink(props: Props) { const { panel } = props; - const [pageIndex, setPageIndex] = useState(0); - const stories = getStories(); - if (stories.length === 0) { - return
    Loading stories...
    ; - } + const [activeTab, setActiveTab] = useState(Tab.Config); - const story = stories[pageIndex]; const Layout = panel ? Pane : Window; return ( - -
    - - {stories.map((story, i) => ( - setPageIndex(i)} - > - {story.meta.title} - - ))} - -
    + + + {tabs.map((tab) => ( + setActiveTab(tab.value)} + > + {tab.name} + + ))} + + setActiveTab(Tab.Components)} + > + Components + + + + + {activeTab === Tab.Components ? ( + + ) : ( + + )} - {story.meta.render()}
    ); } + +function ComponentsPage() { + return ( +
    + All component stories have been moved. + View them here{' '} + + https://tgstation.github.io/tgui-core + +
    + ); +} + +type TreeProps = { + tab: Tab; +}; + +function TreePage(props: TreeProps) { + const { tab } = props; + + const backend = useBackend(); + const inView = backend[tab]; + + return ( +
    +
    + +
    +
    + ); +} diff --git a/tgui/packages/tgui/debug/selectors.ts b/tgui/packages/tgui/debug/selectors.ts index 77d13f11b69a..079efb414824 100644 --- a/tgui/packages/tgui/debug/selectors.ts +++ b/tgui/packages/tgui/debug/selectors.ts @@ -5,5 +5,5 @@ */ export function selectDebug(state: Record) { - return state.debug; + return state?.debug; } diff --git a/tgui/packages/tgui/drag.ts b/tgui/packages/tgui/drag.ts index f56cb4382683..0d832217be1f 100644 --- a/tgui/packages/tgui/drag.ts +++ b/tgui/packages/tgui/drag.ts @@ -7,64 +7,118 @@ import { storage } from 'common/storage'; import { vecAdd, vecMultiply, vecScale, vecSubtract } from 'common/vector'; import type { BooleanLike } from 'tgui-core/react'; - import { createLogger } from './logging'; +type Point = [number, number]; +type GeometryPayload = Partial<{ + pos: string; + size: string; +}>; + const logger = createLogger('drag'); const pixelRatio = window.devicePixelRatio ?? 1; let windowKey = Byond.windowId; let dragging = false; let resizing = false; -let screenOffset: [number, number] = [0, 0]; -let screenOffsetPromise: Promise<[number, number]>; -let dragPointOffset: [number, number]; -let resizeMatrix: [number, number]; -let initialSize: [number, number]; -let size: [number, number]; +let screenOffset: Point = [0, 0]; +let screenOffsetPromise: Promise; +let dragPointOffset: Point; +let resizeMatrix: Point; +let initialSize: Point; +let size: Point; + +let winsetRaf: number | undefined; +let pendingWinset: GeometryPayload = {}; +let lastSentWinset: GeometryPayload = {}; + +/** Expends all stored winset calls in a single call. */ +function flushWinset(): void { + winsetRaf = undefined; + + const payload: GeometryPayload = {}; + if (pendingWinset.pos && pendingWinset.pos !== lastSentWinset.pos) { + payload.pos = pendingWinset.pos; + } + if (pendingWinset.size && pendingWinset.size !== lastSentWinset.size) { + payload.size = pendingWinset.size; + } + + pendingWinset = {}; + + if (payload.pos || payload.size) { + Byond.winset(Byond.windowId, payload); + lastSentWinset = { ...lastSentWinset, ...payload }; + } +} + +function scheduleWinset(): void { + if (winsetRaf !== undefined) { + return; + } + winsetRaf = requestAnimationFrame(flushWinset); +} + +function flushWinsetNow(): void { + if (winsetRaf !== undefined) { + cancelAnimationFrame(winsetRaf); + winsetRaf = undefined; + } + flushWinset(); +} // Set the window key -export const setWindowKey = (key: string): void => { +export function setWindowKey(key: string): void { windowKey = key; -}; +} // Get window position -export const getWindowPosition = (): [number, number] => [ - window.screenLeft * pixelRatio, - window.screenTop * pixelRatio, -]; +export function getWindowPosition(): Point { + return [window.screenLeft * pixelRatio, window.screenTop * pixelRatio]; +} // Get window size -export const getWindowSize = (): [number, number] => [ - window.innerWidth * pixelRatio, - window.innerHeight * pixelRatio, -]; +export function getWindowSize(): Point { + return [window.innerWidth * pixelRatio, window.innerHeight * pixelRatio]; +} // Set window position -export const setWindowPosition = (vec: [number, number]) => { +export function setWindowPosition(vec: Point): void { const byondPos = vecAdd(vec, screenOffset); - return Byond.winset(Byond.windowId, { + Byond.winset(Byond.windowId, { pos: `${byondPos[0]},${byondPos[1]}`, }); -}; +} + +function setWindowPositionBatched(vec: Point): void { + const byondPos = vecAdd(vec, screenOffset); + pendingWinset.pos = `${byondPos[0]},${byondPos[1]}`; + scheduleWinset(); +} // Set window size -const setWindowSize = (vec: [number, number]) => { - return Byond.winset(Byond.windowId, { +function setWindowSize(vec: Point): void { + Byond.winset(Byond.windowId, { size: `${vec[0]}x${vec[1]}`, }); -}; +} + +function setWindowSizeBatched(vec: Point): void { + pendingWinset.size = `${vec[0]}x${vec[1]}`; + scheduleWinset(); +} // Get screen position -const getScreenPosition = (): [number, number] => [ - 0 - screenOffset[0], - 0 - screenOffset[1], -]; +function getScreenPosition(): Point { + return [0 - screenOffset[0], 0 - screenOffset[1]]; +} // Get screen size -const getScreenSize = (): [number, number] => [ - window.screen.availWidth * pixelRatio, - window.screen.availHeight * pixelRatio, -]; +function getScreenSize(): Point { + return [ + window.screen.availWidth * pixelRatio, + window.screen.availHeight * pixelRatio, + ]; +} /** * Moves an item to the top of the recents array, and keeps its length @@ -74,11 +128,11 @@ const getScreenSize = (): [number, number] => [ * * Returns new recents and an item which was trimmed. */ -export const touchRecents = ( +export function touchRecents( recents: string[], touchedItem: string, limit = 50, -): [string[], string | undefined] => { +): [string[], string | undefined] { const nextRecents: string[] = [touchedItem]; let trimmedItem: string | undefined; for (let i = 0; i < recents.length; i++) { @@ -93,10 +147,10 @@ export const touchRecents = ( } } return [nextRecents, trimmedItem]; -}; +} // Store window geometry in local storage -const storeWindowGeometry = async () => { +export async function storeWindowGeometry(): Promise { logger.log('storing geometry'); const geometry = { pos: getWindowPosition(), @@ -112,19 +166,20 @@ const storeWindowGeometry = async () => { storage.remove(trimmedKey); } storage.set('geometries', geometries); -}; +} + +type RecallOptions = Partial<{ + pos: Point; + size: Point; + locked: BooleanLike; + scale: BooleanLike; +}>; // Recall window geometry from local storage and apply it -export const recallWindowGeometry = async ( - options: { - fancy?: BooleanLike; - pos?: [number, number]; - size?: [number, number]; - locked?: BooleanLike; - scale?: BooleanLike; - } = {}, -) => { - const geometry = options.fancy && (await storage.get(windowKey)); +export async function recallWindowGeometry( + options: RecallOptions = {}, +): Promise { + const geometry = await storage.get(windowKey); if (geometry) { logger.log('recalled geometry:', geometry); } @@ -175,10 +230,10 @@ export const recallWindowGeometry = async ( ); setWindowPosition(pos); } -}; +} // Setup draggable window -export const setupDrag = async () => { +export async function setupDrag(): Promise { // Calculate screen offset caused by the windows taskbar const windowPosition = getWindowPosition(); @@ -188,20 +243,18 @@ export const setupDrag = async () => { ]); screenOffset = await screenOffsetPromise; logger.debug('screen offset', screenOffset); -}; +} /** * Constraints window position to safe screen area, accounting for safe * margins which could be a system taskbar. */ -const constraintPosition = ( - pos: [number, number], - size: [number, number], -): [boolean, [number, number]] => { +function constraintPosition(pos: Point, size: Point): [boolean, Point] { const screenPos = getScreenPosition(); const screenSize = getScreenSize(); - const nextPos: [number, number] = [pos[0], pos[1]]; + const nextPos: Point = [pos[0], pos[1]]; let relocated = false; + for (let i = 0; i < 2; i++) { const leftBoundary = screenPos[i]; const rightBoundary = screenPos[i] + screenSize[i]; @@ -214,57 +267,59 @@ const constraintPosition = ( } } return [relocated, nextPos]; -}; +} // Start dragging the window -export const dragStartHandler = (event) => { +export function dragStartHandler(event): void { logger.log('drag start'); dragging = true; dragPointOffset = vecSubtract( [event.screenX * pixelRatio, event.screenY * pixelRatio], getWindowPosition(), - ) as [number, number]; + ) as Point; // Focus click target (event.target as HTMLElement)?.focus(); document.addEventListener('mousemove', dragMoveHandler); document.addEventListener('mouseup', dragEndHandler); dragMoveHandler(event); -}; +} // End dragging the window -const dragEndHandler = (event) => { +function dragEndHandler(event): void { logger.log('drag end'); dragMoveHandler(event); + flushWinsetNow(); document.removeEventListener('mousemove', dragMoveHandler); document.removeEventListener('mouseup', dragEndHandler); dragging = false; storeWindowGeometry(); -}; +} // Move the window while dragging -const dragMoveHandler = (event: MouseEvent) => { +function dragMoveHandler(event: MouseEvent): void { if (!dragging) { return; } event.preventDefault(); - setWindowPosition( + setWindowPositionBatched( vecSubtract( [event.screenX * pixelRatio, event.screenY * pixelRatio], dragPointOffset, - ) as [number, number], + ) as Point, ); -}; +} // Start resizing the window export const resizeStartHandler = - (x: number, y: number) => (event: MouseEvent) => { + (x: number, y: number) => + (event: MouseEvent): void => { resizeMatrix = [x, y]; logger.log('resize start', resizeMatrix); resizing = true; dragPointOffset = vecSubtract( [event.screenX * pixelRatio, event.screenY * pixelRatio], getWindowPosition(), - ) as [number, number]; + ) as Point; initialSize = getWindowSize(); // Focus click target (event.target as HTMLElement)?.focus(); @@ -274,17 +329,18 @@ export const resizeStartHandler = }; // End resizing the window -const resizeEndHandler = (event: MouseEvent) => { +function resizeEndHandler(event: MouseEvent): void { logger.log('resize end', size); resizeMoveHandler(event); + flushWinsetNow(); document.removeEventListener('mousemove', resizeMoveHandler); document.removeEventListener('mouseup', resizeEndHandler); resizing = false; storeWindowGeometry(); -}; +} // Move the window while resizing -const resizeMoveHandler = (event: MouseEvent) => { +function resizeMoveHandler(event: MouseEvent): void { if (!resizing) { return; } @@ -302,5 +358,5 @@ const resizeMoveHandler = (event: MouseEvent) => { // Sane window size values size[0] = Math.max(size[0], 150 * pixelRatio); size[1] = Math.max(size[1], 50 * pixelRatio); - setWindowSize(size); -}; + setWindowSizeBatched(size); +} diff --git a/tgui/packages/tgui/index.tsx b/tgui/packages/tgui/index.tsx index 7e98ffa7a550..5fa5ad10ae9f 100644 --- a/tgui/packages/tgui/index.tsx +++ b/tgui/packages/tgui/index.tsx @@ -10,11 +10,10 @@ import './styles/main.scss'; import { perf } from 'common/perf'; import { setupGlobalEvents } from 'tgui-core/events'; import { setupHotKeys } from 'tgui-core/hotkeys'; +import { captureExternalLinks } from 'tgui-core/links'; import { setupHotReloading } from 'tgui-dev-server/link/client'; - import { App } from './App'; import { setGlobalStore } from './backend'; -import { captureExternalLinks } from './links'; import { render } from './renderer'; import { configureStore } from './store'; diff --git a/tgui/packages/tgui/interfaces/AbandonedCrate.tsx b/tgui/packages/tgui/interfaces/AbandonedCrate.tsx new file mode 100644 index 000000000000..3498eb5cfd1e --- /dev/null +++ b/tgui/packages/tgui/interfaces/AbandonedCrate.tsx @@ -0,0 +1,101 @@ +import { Box, Button, NoticeBox, Section, Table } from 'tgui-core/components'; + +import { useBackend } from '../backend'; +import { Window } from '../layouts'; + +type Data = { + previous_attempts: Attempts[]; + attempts_left: number; +}; + +type Attempts = { + attempt: string; + bulls: number; + cows: number; +}; + +const check_attempts = (attempts_to_check: number) => { + return attempts_to_check === 1 + ? 'on next failed access attempt.' + : `after ${attempts_to_check} failed access attempts.`; +}; + +const BULLS_COWS_INFO = `Codes are made of a series of non-repeating digits. +Each wrong guess will return the number of correct digits in correct locations, +and the number of correct digits in incorrect locations.`; + +export const AbandonedCrate = (props) => { + const { data } = useBackend(); + const { previous_attempts, attempts_left } = data; + + return ( + + +
    + } + > + + Anti-Tamper Bomb will activate {check_attempts(attempts_left)} + + + {!!previous_attempts.length && ( + + + Attempt + + +
    +
    +
    +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/AccountingConsole/AuditScreen.tsx b/tgui/packages/tgui/interfaces/AccountingConsole/AuditScreen.tsx index d6799d9291f4..98a19e308b15 100644 --- a/tgui/packages/tgui/interfaces/AccountingConsole/AuditScreen.tsx +++ b/tgui/packages/tgui/interfaces/AccountingConsole/AuditScreen.tsx @@ -8,7 +8,7 @@ export const AuditScreen = () => { const { crashing, audit_log } = data; return ( -
    +
    {!!crashing && ( @@ -18,14 +18,22 @@ export const AuditScreen = () => { )} - Account - Cost - Location - Timestamp + + Account + + + Cost + + + Location + + + Timestamp + {audit_log.map((purchase, index) => ( - {purchase.account} + {purchase.account || '???'} {purchase.cost} cr diff --git a/tgui/packages/tgui/interfaces/AccountingConsole/FakeWindow.tsx b/tgui/packages/tgui/interfaces/AccountingConsole/FakeWindow.tsx index da9ee0865bcd..a885dc77efb5 100644 --- a/tgui/packages/tgui/interfaces/AccountingConsole/FakeWindow.tsx +++ b/tgui/packages/tgui/interfaces/AccountingConsole/FakeWindow.tsx @@ -31,7 +31,7 @@ export const FakeWindow = ( const { name, children, setScreenmode } = props; return ( - + diff --git a/tgui/packages/tgui/interfaces/AccountingConsole/Sort.tsx b/tgui/packages/tgui/interfaces/AccountingConsole/Sort.tsx index c8c8cc49ec75..c90513e660fa 100644 --- a/tgui/packages/tgui/interfaces/AccountingConsole/Sort.tsx +++ b/tgui/packages/tgui/interfaces/AccountingConsole/Sort.tsx @@ -30,6 +30,10 @@ export const SortButton = (props: SortButtonProps) => { otherSorter(SORTING.none); } }} + onContextMenu={() => { + act('typesound'); + setSorting(SORTING.none); + }} > {sorting === SORTING.ascending ? '^' : ''} {sorting === SORTING.descending ? 'v' : ''} diff --git a/tgui/packages/tgui/interfaces/AccountingConsole/UsersScreen.tsx b/tgui/packages/tgui/interfaces/AccountingConsole/UsersScreen.tsx index 271ecfb014a3..620f64af9bdb 100644 --- a/tgui/packages/tgui/interfaces/AccountingConsole/UsersScreen.tsx +++ b/tgui/packages/tgui/interfaces/AccountingConsole/UsersScreen.tsx @@ -47,7 +47,7 @@ export const UsersScreen = () => { }); return ( -
    +
    {!!crashing && ( @@ -59,7 +59,9 @@ export const UsersScreen = () => { - Account + + Account + { - Balance + + Balance + { - Job + + Assignment + { - Pay - Advances + + Pay + + + Advances + {accountsSorted.map((account, index) => ( { `${(value * 100).toFixed(1)}%`} onChange={(value) => act('change_pay_mod', { account_id: account.id, @@ -124,10 +136,10 @@ export const UsersScreen = () => { - {account.num_advances} + {account.num_advances} diff --git a/tgui/packages/tgui/interfaces/AccountingConsole/index.tsx b/tgui/packages/tgui/interfaces/AccountingConsole/index.tsx index 064e3eff952b..3e45671520fd 100644 --- a/tgui/packages/tgui/interfaces/AccountingConsole/index.tsx +++ b/tgui/packages/tgui/interfaces/AccountingConsole/index.tsx @@ -23,7 +23,7 @@ export const AccountingConsole = () => { : `Ian.${pic_file_format}`; return ( - + diff --git a/tgui/packages/tgui/interfaces/AiCoreDisplayPicker.tsx b/tgui/packages/tgui/interfaces/AiCoreDisplayPicker.tsx new file mode 100644 index 000000000000..93638310777f --- /dev/null +++ b/tgui/packages/tgui/interfaces/AiCoreDisplayPicker.tsx @@ -0,0 +1,135 @@ +import { useState } from 'react'; +import { + Box, + DmIcon, + Flex, + ImageButton, + Input, + Section, + Stack, +} from 'tgui-core/components'; +import { useBackend } from '../backend'; +import { Window } from '../layouts'; + +type CoreDisplayOption = { + name: string; + icon_state: string; + icon: string; +}; + +type CurrentIcon = { + icon: string; + icon_state: string; +}; + +type Data = { + current_display: string; + current_icon: CurrentIcon | null; + options: CoreDisplayOption[]; +}; + +export const AiCoreDisplayPicker = () => { + return ( + + + + + + ); +}; + +const AiCoreDisplayPickerContent = () => { + const { act, data } = useBackend(); + const { current_display, current_icon, options = [] } = data; + + const [searchTerm, setSearchTerm] = useState(''); + const [tiledView, setTiledView] = useState(false); + + // Filter options based on search term + const filteredOptions = options.filter((option) => + option.name.toLowerCase().includes(searchTerm.toLowerCase()), + ); + + return ( + + +
    + + {current_icon && ( + + + + + + )} + + + {current_display} + + + +
    +
    + + + setSearchTerm(value)} + fluid + /> + + + + + +
    + +
    +
    + + {filteredOptions.length === 0 && ( + + + No options found matching "{searchTerm}" + + + )} +
    +
    +
    + ); +}; + +const OptionsList = ({ options }: { options: CoreDisplayOption[] }) => { + const { act } = useBackend(); + + return ( + <> + {options.map((option) => ( + act('select_option', { option: option.name })} + imageSize={64} + tooltip={option.name} + > + {option.name} + + ))} + + ); +}; diff --git a/tgui/packages/tgui/interfaces/AiStatusDisplayPicker.tsx b/tgui/packages/tgui/interfaces/AiStatusDisplayPicker.tsx new file mode 100644 index 000000000000..6925d5bacaf7 --- /dev/null +++ b/tgui/packages/tgui/interfaces/AiStatusDisplayPicker.tsx @@ -0,0 +1,155 @@ +import { useState } from 'react'; +import { + Box, + DmIcon, + Flex, + ImageButton, + Input, + Section, + Stack, +} from 'tgui-core/components'; +import type { BooleanLike } from 'tgui-core/react'; +import { useBackend } from '../backend'; +import { Window } from '../layouts'; + +type StatusDisplayOption = { + name: string; + icon_state: string; + is_original: BooleanLike; + dmi: string; + icon: string; +}; + +type CurrentIcon = { + icon: string; + icon_state: string; +}; + +type Data = { + current_emotion: string; + current_icon: CurrentIcon | null; + options: StatusDisplayOption[]; +}; + +export const AiStatusDisplayPicker = () => { + return ( + + + + + + ); +}; + +const AiStatusDisplayPickerContent = () => { + const { act, data } = useBackend(); + const { current_emotion, current_icon, options = [] } = data; + + const [searchTerm, setSearchTerm] = useState(''); + + // Filter options based on search term + const filteredOptions = options.filter((option) => + option.name.toLowerCase().includes(searchTerm.toLowerCase()), + ); + + // Separate original emotions and new AI core options + const originalOptions = filteredOptions.filter( + (option) => option.is_original, + ); + const newOptions = filteredOptions.filter((option) => !option.is_original); + + return ( + + +
    + + {current_icon && ( + + + + + + )} + + + {current_emotion || 'No Selection'} + + + +
    +
    + + +
    + setSearchTerm(value)} + /> +
    +
    + + + + {originalOptions.length > 0 && ( + +
    + +
    +
    + )} + + {newOptions.length > 0 && ( + +
    + +
    +
    + )} + + {filteredOptions.length === 0 && ( + + + No options found matching "{searchTerm}" + + + )} +
    +
    +
    + ); +}; + +const OptionsList = ({ options }: { options: StatusDisplayOption[] }) => { + const { act } = useBackend(); + + return ( + <> + {options.map((option) => ( + act('select_option', { option: option.name })} + imageSize={64} + tooltip={option.name} + > + {option.name} + + ))} + + ); +}; diff --git a/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx b/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx index fb2a11e5f9a6..573984c924f4 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx @@ -1,9 +1,10 @@ +import '../styles/interfaces/AntagInfoHeretic.scss'; + import { useState } from 'react'; import { Box, Button, DmIcon, - Flex, Section, Stack, Tabs, @@ -12,6 +13,7 @@ import type { BooleanLike } from 'tgui-core/react'; import { useBackend } from '../backend'; import { Window } from '../layouts'; +import { logger } from '../logging'; import { type Objective, ObjectivePrintout, @@ -58,29 +60,58 @@ type Knowledge = { gainFlavor: string; cost: number; bgr: string; - disabled: BooleanLike; - finished: BooleanLike; + category?: ShopCategory; + depth: number; + done: BooleanLike; ascension: BooleanLike; + disabled: BooleanLike; + tooltip?: string; }; -type KnowledgeInfo = { - knowledge_tiers: KnowledgeTier[]; -}; +enum ShopCategory { + Tree = 'tree', + Shop = 'shop', + Draft = 'draft', + Start = 'start', +} type KnowledgeTier = { nodes: Knowledge[]; }; +type HereticPassive = { + name: string; + description: string[]; +}; + +type HereticPath = { + route: string; + complexity: string; + complexity_color: string; + description: string[]; + pros: string[]; + cons: string[]; + tips: string[]; + starting_knowledge: Knowledge; + preview_abilities: Knowledge[]; + passive: HereticPassive; +}; + type Info = { charges: number; total_sacrifices: number; ascended: BooleanLike; objectives: Objective[]; can_change_objective: BooleanLike; + paths: HereticPath[]; + knowledge_shop: Knowledge[]; + knowledge_tiers: KnowledgeTier[]; + passive_level: number; + points_to_aura: number; }; const IntroductionSection = (props) => { - const { data, act } = useBackend(); + const { data } = useBackend(); const { objectives, ascended, can_change_objective } = data; return ( @@ -150,6 +181,8 @@ const FlavorSection = () => { }; const GuideSection = () => { + const { data } = useBackend(); + const { points_to_aura } = data; return ( @@ -199,12 +232,28 @@ const GuideSection = () => { final ritual. Complete the ritual to become all powerful! + + WARNING! +
    Accumulating a total of {points_to_aura}  + knowledge points +  to manifest a visible aura of  + Mansus energy around you. Simply + gaining the points is sufficent, spending them will not trigger it. +
    + This aura will be visible to all those around you and will mark you as + a heretic. Consider the risks before accumulating too much knowledge! +
    + Keep in mind that using a  + Codex Cicatrix will also make you + very obvious as a heretic when draining  + influences +
    ); }; -const InformationSection = (props) => { +const InformationSection = () => { const { data } = useBackend(); const { charges, total_sacrifices, ascended } = data; return ( @@ -240,91 +289,37 @@ const InformationSection = (props) => { ); }; -const KnowledgeTree = (props) => { - const { data, act } = useBackend(); +const KnowledgeTree = () => { + const { data } = useBackend(); const { knowledge_tiers } = data; + const nodesToShow = knowledge_tiers.filter((tier) => tier.nodes.length > 0); + return (
    DAWN - {knowledge_tiers.length === 0 + {nodesToShow.length === 0 ? 'None!' - : knowledge_tiers.map((tier, i) => ( + : nodesToShow.map((tier, i) => ( - {tier.nodes.map((node) => ( - - - {!!node.ascension && ( - - DUSK - - )} - + ))} - +
    ))} @@ -333,64 +328,376 @@ const KnowledgeTree = (props) => { ); }; -const ResearchInfo = (props) => { - const { data } = useBackend(); +type KnowledgeNodeProps = { + node: Knowledge; + purchaseCategory?: ShopCategory; + can_buy?: BooleanLike; +}; + +const KnowledgeNode = (props: KnowledgeNodeProps) => { + const { node, can_buy = true, purchaseCategory } = props; + const { data, act } = useBackend(); const { charges } = data; + const isBuyable = can_buy && !node.done && !node.disabled; + + const iconState = () => { + if (!can_buy) { + return node.bgr; + } + if (node.done) { + return 'node_finished'; + } + if (charges < node.cost || node.disabled) { + return 'node_locked'; + } + return node.bgr; + }; + + return ( + + + {!!node.ascension && ( + + DUSK + + )} + + ); +}; + +const KnowledgeShop = () => { + const { data } = useBackend(); + const { knowledge_shop } = data; + + if (!knowledge_shop || knowledge_shop.length === 0) { + return null; + } + + return ( +
    + + + +
    + ); + + function Knowledges() { + // filter the list into being indexed by tier + const tiers: Knowledge[][] = knowledge_shop.reduce((acc, knowledge) => { + const tierIndex = knowledge.depth - 1; // depth starts at 1, so + if (!acc[tierIndex]) { + acc[tierIndex] = []; + } + acc[tierIndex].push(knowledge); + return acc; + }, [] as Knowledge[][]); + + return tiers?.map((tier, index) => ( + + Tier {index + 1} + + {tier.map((knowledge) => ( + + + + ))} + +
    +
    + )); + } +}; + +const ResearchInfo = () => { + const { data } = useBackend(); + const { charges, knowledge_shop } = data; + return ( - - + <> + You have {charges || 0}  knowledge point{charges !== 1 ? 's' : ''} {' '} to spend. + + + + + {knowledge_shop?.length && ( + + + + )} + + + ); +}; + +const PathInfo = ({ currentPath }: { currentPath?: HereticPath }) => { + const { data } = useBackend(); + const { paths } = data; + + const pathBoughtIndex = paths.findIndex( + (path) => currentPath && path.route === currentPath.route, + ); + + const [currentTab, setCurrentTab] = useState( + pathBoughtIndex !== -1 ? pathBoughtIndex : 0, + ); + + return ( + + {!currentPath && ( + + + {paths.map((path, index) => ( + setCurrentTab(index)} + > + {path.route} + + ))} + + + )} - + ); }; -export const AntagInfoHeretic = (props) => { +const PathContent = ({ + path, + isPathSelected, +}: { + path: HereticPath; + isPathSelected: boolean; +}) => { + const { data } = useBackend(); + const { passive_level } = data; + const { name, description } = path.passive; + return ( +
    {path.route}} + textAlign="center" + fill + scrollable + > + + {!isPathSelected && ( + +

    Choose Path:

    {' '} + +
    +

    + Complexity:{' '} + + {path.complexity} + +

    +
    +
    + )} + + + Description:{' '} + {path.description.map((line, index) => ( +
    {line}
    + ))} +
    + {(!isPathSelected && ( + + Passive: {name} +

    {description[0]}

    +
    + )) || ( + + + Passive: {name}, level: {passive_level} + + + {description.map((line, index) => ( + = index + 1 ? 'Passive--Active' : ''}`} + > + Level {index + 1} +
    + {line} +
    + ))} +
    +
    + )} + + {!isPathSelected && ( + <> + Guaranteed Abilities: + + {path.preview_abilities.map((ability) => ( + + + + ))} + + + )} + + {!isPathSelected && ( + <> + + Pros: +
    + {path.pros.map((pro, index) => ( +

    {pro}

    + ))} +
    +
    + + Cons: +
    + {path.cons.map((con, index) => ( +

    {con}

    + ))} +
    +
    + + )} + + {isPathSelected && ( + + Tips: +
      + {path.tips.map((tip, index) => ( +
    • {tip}
    • + ))} +
    +
    + )} +
    +
    + ); +}; + +export const AntagInfoHeretic = () => { const { data } = useBackend(); - const { ascended } = data; + const { ascended, knowledge_tiers, paths } = data; + + const [currentTab, setTab] = useState(1); + // only tiers has done variables set + const currentPath = paths.find((path) => + knowledge_tiers.some((tier) => + tier.nodes.some( + (node) => node.done && node.path === path.starting_knowledge.path, + ), + ), + ); - const [currentTab, setTab] = useState(0); + const tabs = [ + { label: 'Information', icon: 'info', content: }, + { + label: 'Path Info', + icon: 'info', + content: , + }, + { label: 'Research', icon: 'book', content: }, + ]; + + const currentTheme = () => { + if (currentPath?.route) { + return `Heretic theme-Heretic--${currentPath.route.replace(' ', '')}`; + } + return 'Heretic'; + }; return ( - - + + - setTab(0)} - > - Information - - setTab(1)} - > - Research - + {tabs.map((tab, index) => ( + setTab(index)} + > + {tab.label} + + ))} - - {(currentTab === 0 && ) || } - + {tabs[currentTab].content} diff --git a/tgui/packages/tgui/interfaces/AntagInfoSpy.tsx b/tgui/packages/tgui/interfaces/AntagInfoSpy.tsx index ea1e142de192..3549e9fafd8e 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoSpy.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoSpy.tsx @@ -56,7 +56,9 @@ export const AntagInfoSpy = () => {
    Work together or work against them: The choice is yours, but{' '} - you cannot share the rewards. + + the same bounty cannot be claimed twice. + diff --git a/tgui/packages/tgui/interfaces/Atm/AtmLogin.jsx b/tgui/packages/tgui/interfaces/Atm/AtmLogin.jsx deleted file mode 100644 index f4d3cdf1d7d4..000000000000 --- a/tgui/packages/tgui/interfaces/Atm/AtmLogin.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import { Button, Input, LabeledList, Section } from 'tgui-core/components'; - -import { useBackend } from '../../backend'; -import { useLocalState } from '../../backend'; -import { Window } from '../../layouts'; - -export const AtmLogin = (props) => { - const { act, data } = useBackend(); - const [entered_code, setEnteredCode] = useLocalState('login_code', ''); - - const { account_holder, code } = data; - - const handleLogin = () => { - act('login', { code: entered_code }); - }; - return ( - - -
    - - - setEnteredCode(value)} - placeholder="Enter code here" - /> - - -
    -
    -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/Atm/AtmLogin.tsx b/tgui/packages/tgui/interfaces/Atm/AtmLogin.tsx new file mode 100644 index 000000000000..c23bbde8b9b4 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Atm/AtmLogin.tsx @@ -0,0 +1,30 @@ +import { useState } from 'react'; +import { Button, Input, LabeledList, Section } from 'tgui-core/components'; +import { useBackend } from '../../backend'; + +import type { ATMData } from './types'; + +export const AtmLogin = (props) => { + const { act, data } = useBackend(); + const [entered_code, setEnteredCode] = useState(''); + + const handleLogin = () => { + act('login', { bank_pin: entered_code }); + }; + return ( +
    + + + + + + + + +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/Atm/AtmMain.jsx b/tgui/packages/tgui/interfaces/Atm/AtmMain.jsx deleted file mode 100644 index e6243711049f..000000000000 --- a/tgui/packages/tgui/interfaces/Atm/AtmMain.jsx +++ /dev/null @@ -1,208 +0,0 @@ -import { Box, Button, Input, LabeledList, Section } from 'tgui-core/components'; - -import { useBackend } from '../../backend'; -import { useLocalState } from '../../backend'; -import { Window } from '../../layouts'; - -export const AtmMain = (props) => { - const { act, data } = useBackend(); - const [transferAmount, setTransferAmount] = useLocalState( - 'transfer_amount', - '', - ); - const [withdrawAmount, setWithdrawAmount] = useLocalState( - 'withdraw_amount', - '', - ); - const [newPin, setNewPin] = useLocalState('new_pin', ''); - const [selectedAccount, setSelectedAccount] = useLocalState( - 'selected_account', - '', - ); - const [searchTerm, setSearchTerm] = useLocalState('search_term', ''); - const buttonStyle = { minWidth: '120px', flex: 3 }; - - const { - balance, - account_holder, - atm_balance, - bank_account_list = '[]', - } = data; - - let accounts = []; - try { - accounts = JSON.parse(bank_account_list); - if (!Array.isArray(accounts)) { - accounts = []; - } - } catch (error) { - console.error('Failed to parse bank account list', error); - } - - accounts = accounts.sort((a, b) => { - const nameA = (a.account_holder || '').toLowerCase(); - const nameB = (b.account_holder || '').toLowerCase(); - return nameA.localeCompare(nameB); - }); - - const filteredAccounts = accounts.filter((account) => - (account.account_holder || 'Unnamed Account') - .toLowerCase() - .includes(searchTerm.toLowerCase()), - ); - - const handleLogout = () => { - act('logout'); - }; - - const handleWithdraw = () => { - act('withdraw', { withdraw_amount: withdrawAmount }); - }; - - const handleTransfer = () => { - act('transfer', { - transfer_amount: transferAmount, - target_account: selectedAccount, - }); - }; - - const handleDeposit = () => { - act('deposit'); - }; - - const handleChangePin = () => { - act('change_pin', { new_pin: newPin }); - }; - - return ( - - -
    - - - {account_holder} - - {balance} - - {atm_balance} - - - - - -
    -
    -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/Atm/AtmMain.tsx b/tgui/packages/tgui/interfaces/Atm/AtmMain.tsx new file mode 100644 index 000000000000..7d58915db8c4 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Atm/AtmMain.tsx @@ -0,0 +1,84 @@ +import { useState } from 'react'; +import { Box, Button, Input, LabeledList, Section } from 'tgui-core/components'; + +import { useBackend } from '../../backend'; + +import type { ATMData } from './types'; + +export const AtmMain = (props) => { + const { act, data } = useBackend(); + const [withdrawAmount, setWithdrawAmount] = useState(''); + const [newPin, setNewPin] = useState(''); + + const { account_holder, atm_balance, account_balance } = data; + + const handleLogout = () => { + act('logout'); + }; + + const handleWithdraw = () => { + act('withdraw', { withdraw_amount: withdrawAmount }); + }; + + const handleDeposit = () => { + act('deposit'); + }; + + const handleChangePin = () => { + act('change_pin', { new_pin: newPin }); + }; + + return ( +
    + + + {account_holder} + + {account_balance} + {atm_balance} + + + + + + + + + + + + + + + + + + + + + + +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/Atm/index.jsx b/tgui/packages/tgui/interfaces/Atm/index.jsx deleted file mode 100644 index f86300e963e0..000000000000 --- a/tgui/packages/tgui/interfaces/Atm/index.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import { useBackend } from '../../backend'; -import { Window } from '../../layouts'; -import { AtmLogin } from './AtmLogin'; -import { AtmMain } from './AtmMain'; - -export const Atm = (props) => { - const { act, data } = useBackend(); - return ( - - {data.logged_in ? ( - - ) : ( - - )} - - ); -}; diff --git a/tgui/packages/tgui/interfaces/Atm/index.tsx b/tgui/packages/tgui/interfaces/Atm/index.tsx new file mode 100644 index 000000000000..d9a70b5e0207 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Atm/index.tsx @@ -0,0 +1,21 @@ +import { useBackend } from '../../backend'; +import { Window } from '../../layouts'; +import { AtmLogin } from './AtmLogin'; +import { AtmMain } from './AtmMain'; + +import type { ATMData } from './types'; + +export const Atm = (props) => { + const { act, data } = useBackend(); + return ( + + + {data.logged_in ? ( + + ) : ( + + )} + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/Atm/types.ts b/tgui/packages/tgui/interfaces/Atm/types.ts new file mode 100644 index 000000000000..f6a3470b234e --- /dev/null +++ b/tgui/packages/tgui/interfaces/Atm/types.ts @@ -0,0 +1,14 @@ +import type { BooleanLike } from 'tgui-core/react'; + +export type ATMData = { + logged_in: BooleanLike; + card: BooleanLike; + entered_code: string | number | null; + atm_balance: number; + + // These exist only when a card is inserted: + account_balance: number; + account_holder: string; + account_id: number; + bank_pin: string; +}; diff --git a/tgui/packages/tgui/interfaces/AutomatedAnnouncement.tsx b/tgui/packages/tgui/interfaces/AutomatedAnnouncement.tsx index 9ca71b634221..285d5ee01856 100644 --- a/tgui/packages/tgui/interfaces/AutomatedAnnouncement.tsx +++ b/tgui/packages/tgui/interfaces/AutomatedAnnouncement.tsx @@ -27,11 +27,12 @@ type AASConfigEntry = { type Data = { config_entries: AASConfigEntry[]; + max_announcement_len: number; }; export const AutomatedAnnouncement = (props) => { const { act, data } = useBackend(); - const { config_entries = [] } = data; + const { config_entries = [], max_announcement_len } = data; const [search, setSearch] = useState(''); @@ -130,6 +131,7 @@ export const AutomatedAnnouncement = (props) => { fluid value={announcementLine} disabled={!entry.modifiable} + maxLength={max_announcement_len} onBlur={(value) => act('Text', { entryRef: entry.entryRef, diff --git a/tgui/packages/tgui/interfaces/BeakerPanel.tsx b/tgui/packages/tgui/interfaces/BeakerPanel.tsx new file mode 100644 index 000000000000..de3cd5ade0ad --- /dev/null +++ b/tgui/packages/tgui/interfaces/BeakerPanel.tsx @@ -0,0 +1,321 @@ +import { useState } from 'react'; +import { + Button, + Dropdown, + NumberInput, + Section, + Stack, +} from 'tgui-core/components'; +import { capitalizeFirst } from 'tgui-core/string'; +import { useBackend } from '../backend'; +import { Window } from '../layouts'; + +type typePath = string; + +type Reagent = { + id: typePath; + text: string; +}; + +type ContainerType = { + id: typePath; + text: string; + volume: number; +}; + +type Data = { + reagents: Reagent[]; + containers: ContainerType[]; +}; + +type Container = { + type: typePath; + reagents: Record; +}; + +function makeContainerState(default_type: ContainerType) { + return useState({ + type: default_type.id, + reagents: {}, + }); +} + +function removeContainerReagent( + container: Container, + setContainer: (container: Container) => void, + reagent: typePath, +) { + const newReagents = { ...container.reagents }; + delete newReagents[reagent]; + setContainer({ ...container, reagents: newReagents }); +} + +function setContainerReagentVolume( + container: Container, + setContainer: (container: Container) => void, + reagent: typePath, + volume: number = 10, +) { + const newReagents = { ...container.reagents }; + newReagents[reagent] = volume; + setContainer({ ...container, reagents: newReagents }); +} + +function containerToSpawnInfo(container: Container) { + return { + container: container.type, + reagents: container.reagents, + }; +} + +function readableContainerType(container_type: ContainerType) { + return capitalizeFirst(`${container_type.text} (${container_type.volume}u)`); +} + +function readableReagentType(reagent: Reagent) { + return capitalizeFirst(reagent.text); +} + +function grenadeCheck(containers: Container[]) { + return containers.every((container) => container.type.includes('beaker')); +} + +type ContainerProps = { + container: Container; + number: number; + updateContainer: (container: Container) => void; + reagents: Reagent[]; + containers: ContainerType[]; +}; + +const ContainerSection = (props: ContainerProps) => { + const { container, number, updateContainer, reagents, containers } = props; + const { act } = useBackend(); + + const [setAddingReagent, setSetAddingReagent] = useState( + reagents[0].id, + ); + const [setAddingReagentVolume, setSetAddingReagentVolume] = + useState(50); + + return ( +
    + act('spawn', { spawn_info: containerToSpawnInfo(container) }) + } + > + Spawn + + } + > + + + ({ + displayText: readableContainerType(container), + value: container.id, + }))} + placeholder="Select Container Type" + selected={container.type} + displayText={readableContainerType( + containers.find((c) => c.id === container.type)!, + )} + onSelected={(value) => { + updateContainer({ ...container, type: value }); + }} + /> + + {Object.keys(container.reagents).map((reagent) => ( + + + + + + + { + setContainerReagentVolume( + container, + updateContainer, + reagent, + value, + ); + }} + /> + + +
    + ); +}; + +export const BeakerPanel = () => { + const { act, data } = useBackend(); + const { reagents, containers } = data; + + const [container_one, setContainerOne] = makeContainerState(containers[0]); + const [container_two, setContainerTwo] = makeContainerState(containers[0]); + const [grenadeTimer, setGrenadeTimer] = useState(5.0); + + const reagentsSorted = reagents.sort((a, b) => (a.text < b.text ? -1 : 1)); + const containersSorted = containers.sort((a, b) => + readableContainerType(a) < readableContainerType(b) ? -1 : 1, + ); + + return ( + + + + +
    + + + + + + Timer:  + { + setGrenadeTimer(value); + }} + /> + + + + Spawned containers will grow to fit all listed reagents! + + + +
    +
    + + + + + + + + + + +
    +
    +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/BluespaceLocator.tsx b/tgui/packages/tgui/interfaces/BluespaceLocator.tsx index e1a672c2576c..a2ad2d8729d6 100644 --- a/tgui/packages/tgui/interfaces/BluespaceLocator.tsx +++ b/tgui/packages/tgui/interfaces/BluespaceLocator.tsx @@ -1,19 +1,17 @@ -import { useState } from 'react'; -import { Icon, ProgressBar, Tabs } from 'tgui-core/components'; - +import { useEffect, useState } from 'react'; +import { Icon, Input } from 'tgui-core/components'; import { useBackend } from '../backend'; import { Window } from '../layouts'; type Data = { - telebeacons: Trackable[]; trackimplants: Trackable[]; trackingrange: number; }; type Trackable = { name: string; - distance: string; - direction: number; + distance: number; + direction: string; }; const DIRECTION_TO_ICON = { @@ -27,93 +25,298 @@ const DIRECTION_TO_ICON = { northwest: 315, } as const; -enum TAB { - Implant, - Beacon, -} - export const BluespaceLocator = (props) => { - const [tab, setTab] = useState(TAB.Implant); + const { data } = useBackend(); + const { trackimplants, trackingrange } = data; + const [selectedImplantName, setSelectedImplantName] = useState( + trackimplants.length > 0 ? trackimplants[0].name : null, + ); + const [searchQuery, setSearchQuery] = useState(''); + const [currentRotation, setCurrentRotation] = useState(0); - return ( - - - - setTab(TAB.Implant)} - > - Implants - - setTab(TAB.Beacon)} - > - Teleporter Beacons - - - {tab === TAB.Beacon && } - {tab === TAB.Implant && } - - + const filteredImplants = trackimplants.filter((implant) => + implant.name.toLowerCase().includes(searchQuery.toLowerCase()), ); -}; -const TeleporterBeacons = (props) => { - const { data } = useBackend(); - const { telebeacons } = data; + useEffect(() => { + if (filteredImplants.length > 0) { + if ( + !selectedImplantName || + !filteredImplants.some( + (implant) => implant.name === selectedImplantName, + ) + ) { + setSelectedImplantName(filteredImplants[0].name); + } + } else { + setSelectedImplantName(null); + } + }, [filteredImplants, selectedImplantName]); - return ( - <> - {telebeacons.map((beacon) => ( - - ))} - - ); -}; + const selectedImplant = + filteredImplants.find((implant) => implant.name === selectedImplantName) || + (filteredImplants.length > 0 ? filteredImplants[0] : null); -const TrackingImplants = (props) => { - const { data } = useBackend(); - const { trackimplants } = data; + useEffect(() => { + if (selectedImplant) { + if (selectedImplant.distance === 0) { + setCurrentRotation(0); + } else { + const targetRotation = DIRECTION_TO_ICON[selectedImplant.direction]; - return ( - <> - {trackimplants.map((implant) => ( - - ))} - - ); -}; + let shortestRotation = targetRotation - currentRotation; + if (shortestRotation > 180) shortestRotation -= 360; + if (shortestRotation < -180) shortestRotation += 360; -const SignalLocator = (props) => { - const { data } = useBackend(); - const { trackingrange } = data; - const { name, direction, distance } = props; + setCurrentRotation(currentRotation + shortestRotation); + } + } + }, [selectedImplant?.direction, selectedImplant?.distance]); + + const getArrowColor = (distance: number) => { + if (distance === 0) return 'green'; + if (distance > (trackingrange * 2) / 3) return 'red'; + if (distance > (trackingrange * 1) / 3) return 'orange'; + return 'green'; + }; + + if (trackimplants.length === 0) { + return ( + + +
    + +
    Bluespace signatures not detected
    +
    + No active tracking implants detected within operational range +
    +
    +
    +
    + ); + } return ( - - {name} - - + + +
    +
    +
    + {!searchQuery && ( + + )} + setSearchQuery(value)} + width="100%" + style={{ + paddingLeft: searchQuery ? '0.5rem' : '2rem', + }} + /> +
    +
    + {filteredImplants.map((implant) => ( +
    setSelectedImplantName(implant.name)} + > + + +
    + {implant.name} +
    + +
    + {[1, 2, 3].map((dot) => ( +
    + ))} +
    +
    + ))} +
    +
    + +
    + {filteredImplants.length === 0 ? ( +
    + +
    No targets matching search criteria
    +
    + ) : selectedImplant ? ( + <> + +
    +
    + {selectedImplant.name} +
    +
    + Distance: {selectedImplant.distance} +
    +
    + + ) : null} +
    +
    + + ); }; diff --git a/tgui/packages/tgui/interfaces/Cargo/CargoButtons.tsx b/tgui/packages/tgui/interfaces/Cargo/CargoButtons.tsx index 04b201017dd3..f069fd94f119 100644 --- a/tgui/packages/tgui/interfaces/Cargo/CargoButtons.tsx +++ b/tgui/packages/tgui/interfaces/Cargo/CargoButtons.tsx @@ -6,7 +6,7 @@ import type { CargoData } from './types'; export function CargoCartButtons(props) { const { act, data } = useBackend(); - const { cart = [], requestonly, can_send, can_approve_requests } = data; + const { cart = [], requestonly, can_send, can_approve_requests, displayed_currency_name } = data; let total = 0; let amount = 0; @@ -24,7 +24,7 @@ export function CargoCartButtons(props) { {amount === 0 && 'Cart is empty'} {amount === 1 && '1 item'} {amount >= 2 && `${amount} items`}{' '} - {total > 0 && `(${formatMoney(total)} cr)`} + {total > 0 && `(${formatMoney(total)}${displayed_currency_name})`} -
    -
    - {!recording && ( - - - - )} - {!recording && ( - + + + } > - Record - - )} - {recording && ( -
    + + +
    + {!recording && ( + + + + )} + {!recording && ( + + )} + {recording && ( + + )} + {recording && ( + + )} + + } > - Discard - - )} - {recording && ( - + ))} + {recipes.length === 0 && ( + No recipes. + )} + +
    +
    + +
    ( + + ))} > - Save - - )} - - } - > - - {Object.keys(recipes).map((recipe) => ( - - ))} - {recipes.length === 0 && No recipes.} - -
    -
    ( + + {data.chemicals.map((chemical) => ( + + + + ))} + +
    +
    + +
    ( + + ))} + > + {beaker || recording ? ( + + ) : ( + + No beaker loaded. + + + )} +
    +
    + + + {showReactionList && ( + +
    + + + + + setSearchTerm(value)} + /> + + + + + ))} + + + + +
    + + {filteredReactions.length > 0 ? ( + filteredReactions.map((reaction) => ( + + + + )) + ) : ( + No reactions found. + )} + +
    +
    +
    +
    +
    + )} + +
    +
    + ); +}; + +type ReagentDispenseButtonProps = { + chemical: DispensableReagent; + showPhCol?: boolean; + mainscreen?: boolean; + prefix?: string; +}; + +const ReagentDispenseButton = (props: ReagentDispenseButtonProps) => { + const { chemical, showPhCol, mainscreen, prefix } = props; + const { act, data } = useBackend(); + const { recipeReagents = [] } = data; + + return ( + + ); +}; + +type ReactionDisplayProps = { + reaction: ReagentReaction; + pinnedReactions: ReactionTypepath[]; + setPinnedReactions: (reactions: ReactionTypepath[]) => void; + setSearchTerm: (term: string) => void; +}; + +const ReactionDisplay = (props: ReactionDisplayProps) => { + const { reaction, pinnedReactions, setPinnedReactions } = props; + return ( + + + + - ))} - > - - {data.chemicals.map((chemical) => ( - - ))} - -
    -
    ( - - ))} + {reaction.name} + + + + + + + + + - -
    - - +
    + + + + + {reaction.reaction.required_reagents.map((reagent) => ( + + + + ))} + {reaction.reaction.required_catalysts.length > 0 && ( + <> + + + + {reaction.reaction.required_catalysts.map((catalyst) => ( + + + + ))} + + )} + + + + + {getTemperatureMessage( + reaction.reaction.lower_temperature, + reaction.reaction.upper_temperature, + )} + + + + + + {getPHMessage( + reaction.reaction.lower_ph, + reaction.reaction.upper_ph, + )} + + +
    + + + + ); +}; + +// if lower and upper are the same, return "at X degrees" +// if lower and upper are >300, return "heat to between X and Y degrees" +// if lower and upper are <300, return "cool to between X and Y degrees" +// if lower is <300 and upper is >300, return "keep between X and Y degrees" +function getTemperatureMessage(lower: number, upper: number): string { + if (lower === upper) { + return `Forms at ${lower}°K`; + } else if (lower > 300 && upper > 300) { + return `Heat between ${lower}°K-${upper}°K`; + } else if (lower < 300 && upper < 300) { + return `Cool between ${Math.min(upper, lower)}°K-${Math.max(upper, lower)}°K`; + } else { + return `Keep between ${lower}°K-${upper}°K`; + } +} + +// if lower and upper are the same, return "keep at pH X" +// else return "keep between pH X and Y" +function getPHMessage(lower: number, upper: number): string { + if (lower === upper) { + return `Keep at pH ${lower}`; + } else { + return `Keep between pH ${lower}-${upper}`; + } +} + +type ReactionComponentDisplayProps = { + reagentComponent: ReactionComponent; + setSearchTerm: (term: string) => void; + pinnedReactions: ReactionTypepath[]; + setPinnedReactions: (reactions: ReactionTypepath[]) => void; +}; + +// linkifies a reagent name in the reaction display +// if it's a base reagent, it will dispense it when clicked +// if it's another recipe, it will put that recipe in the search box +// if it's nothing, it's not a button +const ReactionComponentDisplay = (props: ReactionComponentDisplayProps) => { + const { + reagentComponent, + setSearchTerm, + pinnedReactions, + setPinnedReactions, + } = props; + const { data } = useBackend(); + const { chemicals, reaction_list } = data; + + // check if it's a base reagent + const baseReagent = chemicals.find( + (chem) => chem.title === reagentComponent.name, + ); + + if (baseReagent) { + return ( + + ); + } + + const reactionReagentList = reagentListToArray(reaction_list); + + // check if it's a recipe + const isRecipe = reactionReagentList + .filter((reaction) => { + return reaction.name === reagentComponent.name; + }) + .find((reaction) => reaction.name === reagentComponent.name); + + if (isRecipe) { + return ( + + ); + } + + // otherwise, just display the name + return ( + + ); +}; + +function formatReagentName(amount: number, name?: string) { + if (!name) return `${amount} part `; + + return `${amount} part${amount === 1 ? '' : 's'} ${name}`; +} + +const HorizontalBarWithText = (props: { text: string }) => { + const { text } = props; + return ( + + +
    +
    + {text} + +
    +
    +
    ); }; diff --git a/tgui/packages/tgui/interfaces/ChemHeater.tsx b/tgui/packages/tgui/interfaces/ChemHeater.tsx index fb76a4461b8f..665e579c353f 100644 --- a/tgui/packages/tgui/interfaces/ChemHeater.tsx +++ b/tgui/packages/tgui/interfaces/ChemHeater.tsx @@ -41,6 +41,7 @@ type Data = { acidicBufferVol: number; basicBufferVol: number; dispenseVolume: number; + hasBeakerInHand: BooleanLike; }; type ReactionDisplayProps = { @@ -192,6 +193,7 @@ export const ChemHeater = (props) => { dispenseVolume, upgradeLevel, activeReactions = [], + hasBeakerInHand, } = data; const isBeakerLoaded = beaker !== null; @@ -355,7 +357,12 @@ export const ChemHeater = (props) => { highDangerDisplay={upgradeLevel >= 2} /> )} - + ); diff --git a/tgui/packages/tgui/interfaces/ChemMaster.tsx b/tgui/packages/tgui/interfaces/ChemMaster.tsx index 77767a078bc6..35496244aab3 100644 --- a/tgui/packages/tgui/interfaces/ChemMaster.tsx +++ b/tgui/packages/tgui/interfaces/ChemMaster.tsx @@ -65,6 +65,7 @@ type Data = { selectedContainerRef: string; selectedContainerVolume: number; selectedContainerCategory?: string; + hasBeakerInHand: BooleanLike; }; export const ChemMaster = (props) => { @@ -107,6 +108,7 @@ const ChemMasterContent = (props: { categories, selectedContainerVolume, selectedContainerCategory, + hasBeakerInHand, } = data; const [itemCount, setItemCount] = useState(1); @@ -119,7 +121,7 @@ const ChemMasterContent = (props: {
    @@ -129,6 +131,20 @@ const ChemMasterContent = (props: { Eject + ) : ( + ) } > diff --git a/tgui/packages/tgui/interfaces/ColorPickerModal/Color.tsx b/tgui/packages/tgui/interfaces/ColorPickerModal/Color.tsx new file mode 100644 index 000000000000..e9eba731b84f --- /dev/null +++ b/tgui/packages/tgui/interfaces/ColorPickerModal/Color.tsx @@ -0,0 +1,334 @@ +/** + * @file + * @copyright 2023 itsmeow + * @license MIT + */ +import React, { useMemo, useRef } from 'react'; +import { + type HsvaColor, + hexToHsva, + hsvaToHslString, + hsvaToRgba, + rgbaToHsva, +} from 'tgui-core/color'; +import { Box, Button, type Interaction, Interactive, Pointer, Stack } from 'tgui-core/components'; +import { clamp } from 'tgui-core/math'; +import { classes } from 'tgui-core/react'; +import { colorList } from './ColorPresets'; + +interface ColorPresetsProps { + setColor: (color: HsvaColor) => void; + setShowPresets: (show: boolean) => void; +} + +export const ColorPresets: React.FC = React.memo( + ({ setColor, setShowPresets }) => { + return ( + <> + + + + {colorList.map((row, index) => ( + + + {row.map((entry) => ( + + setColor(hexToHsva(entry))} + > + + + + ))} + + + ))} + + + + ); + }, +); + +interface SaturationValueProps { + hsva: HsvaColor; + onChange: (newColor: Partial) => void; +} + +export const SaturationValue: React.FC = React.memo( + ({ hsva, onChange }) => { + const handleMove = (interaction: Interaction) => { + onChange({ + s: interaction.left * 100, + v: 100 - interaction.top * 100, + }); + }; + + const handleKey = (offset: Interaction) => { + onChange({ + s: clamp(hsva.s + offset.left * 100, 0, 100), + v: clamp(hsva.v - offset.top * 100, 0, 100), + }); + }; + + const containerStyle = useMemo( + () => ({ + backgroundColor: hsvaToHslString({ + h: hsva.h, + s: 100, + v: 100, + a: 1, + }), + }), + [hsva.h], + ); + + const containerRef = useRef(null); + + return ( +
    + + + +
    + ); + }, +); + +interface HueProps { + className?: string; + hue: number; + onChange: (newHue: Partial) => void; +} + +export const Hue: React.FC = React.memo( + ({ className, hue, onChange }) => { + const handleMove = (interaction: Interaction) => { + onChange({ h: 360 * interaction.left }); + }; + + const handleKey = (offset: Interaction) => { + onChange({ h: clamp(hue + offset.left * 360, 0, 360) }); + }; + + const nodeClassName = classes(['react-colorful__hue', className]); + const containerRef = useRef(null); + + return ( +
    + + + +
    + ); + }, +); + +interface SaturationProps { + className?: string; + color: HsvaColor; + onChange: (newSaturation: Partial) => void; +} + +export const Saturation: React.FC = React.memo( + ({ className, color, onChange }) => { + const handleMove = (interaction: Interaction) => { + onChange({ s: 100 * interaction.left }); + }; + + const handleKey = (offset: Interaction) => { + onChange({ s: clamp(color.s + offset.left * 100, 0, 100) }); + }; + + const nodeClassName = classes(['react-colorful__saturation', className]); + + const background = useMemo( + () => + `linear-gradient(to right, ${hsvaToHslString({ + h: color.h, + s: 0, + v: color.v, + a: 1, + })}, ${hsvaToHslString({ h: color.h, s: 100, v: color.v, a: 1 })})`, + [color], + ); + const containerRef = useRef(null); + + return ( +
    + + + +
    + ); + }, +); + +interface ValueProps { + className?: string; + color: HsvaColor; + onChange: (newValue: Partial) => void; +} + +export const Value: React.FC = React.memo( + ({ className, color, onChange }) => { + const handleMove = (interaction: Interaction) => { + onChange({ v: 100 * interaction.left }); + }; + + const handleKey = (offset: Interaction) => { + onChange({ + v: clamp(color.v + offset.left * 100, 0, 100), + }); + }; + + const nodeClassName = classes(['react-colorful__value', className]); + + const background = useMemo( + () => + `linear-gradient(to right, ${hsvaToHslString({ + h: color.h, + s: color.s, + v: 0, + a: 1, + })}, ${hsvaToHslString({ h: color.h, s: color.s, v: 100, a: 1 })})`, + [color], + ); + const containerRef = useRef(null); + + return ( +
    + + + +
    + ); + }, +); + +interface RGBSliderProps { + className?: string; + color: HsvaColor; + onChange: (newValue: HsvaColor) => void; + target: 'r' | 'g' | 'b'; +} + +export const RGBSlider: React.FC = React.memo( + ({ className, color, onChange, target }) => { + const rgb = hsvaToRgba(color); + + const setNewTarget = (value: number) => { + const newRgb = { ...rgb, [target]: value }; + onChange(rgbaToHsva(newRgb)); + }; + + const handleMove = (interaction: Interaction) => { + setNewTarget(255 * interaction.left); + }; + + const handleKey = (offset: Interaction) => { + setNewTarget(clamp(rgb[target] + offset.left * 255, 0, 255)); + }; + + const nodeClassName = classes([`react-colorful__${target}`, className]); + + const channels = { + r: `rgb(${Math.round(rgb.r)},0,0)`, + g: `rgb(0,${Math.round(rgb.g)},0)`, + b: `rgb(0,0,${Math.round(rgb.b)})`, + }; + + const selected = channels[target]; + const containerRef = useRef(null); + + return ( +
    + + + +
    + ); + }, +); diff --git a/tgui/packages/tgui/interfaces/ColorPickerModal/ColorPresets.tsx b/tgui/packages/tgui/interfaces/ColorPickerModal/ColorPresets.tsx new file mode 100644 index 000000000000..1384b5251f26 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ColorPickerModal/ColorPresets.tsx @@ -0,0 +1,210 @@ +// Used for the colour picker, and anything else that wants a list of preset colours. +export const colorList = [ + [ + '003366', + '336699', + '3366CC', + '003399', + '000099', + '0000CC', + '000066', + ], + [ + '006666', + '006699', + '0099CC', + '0066CC', + '0033CC', + '0000FF', + '3333FF', + '333399', + ], + [ + '008080', + '009999', + '33CCCC', + '00CCFF', + '0099FF', + '0066FF', + '3366FF', + '3333CC', + '666699', + ], + [ + '339966', + '00CC99', + '00FFCC', + '00FFFF', + '33CCFF', + '3399FF', + '6699FF', + '6666FF', + '6600FF', + '6600CC', + ], + [ + '339933', + '00CC66', + '00FF99', + '66FFCC', + '66FFFF', + '66CCFF', + '99CCFF', + '9999FF', + '9966FF', + '9933FF', + '9900FF', + ], + [ + '006600', + '00CC00', + '00FF00', + '66FF99', + '99FFCC', + 'CCFFFF', + 'CCECFF', + 'CCCCFF', + 'CC99FF', + 'CC66FF', + 'CC00FF', + '9900CC', + ], + [ + '003300', + '008000', + '33CC33', + '66FF66', + '99FF99', + 'CCFFCC', + 'FFFFFF', + 'FFCCFF', + 'FF99FF', + 'FF66FF', + 'FF00FF', + 'CC00CC', + '660066', + ], + [ + '336600', + '009900', + '66FF33', + '99FF66', + 'CCFF99', + 'FFFFCC', + 'FFCCCC', + 'FF99CC', + 'FF66CC', + 'FF33CC', + 'CC0099', + '800080', + ], + [ + '333300', + '669900', + '99FF33', + 'CCFF66', + 'FFFF99', + 'FFCC99', + 'FF9999', + 'FF6699', + 'FF3399', + 'CC3399', + '990099', + ], + [ + '666633', + '99CC00', + 'CCFF33', + 'FFFF66', + 'FFCC66', + 'FF9966', + 'FF7C80', + 'FF0066', + 'D60093', + '993366', + ], + [ + '808000', + 'CCCC00', + 'FFFF00', + 'FFCC00', + 'FF9933', + 'FF6600', + 'FF5050', + 'CC0066', + '660033', + ], + [ + '996633', + 'CC9900', + 'FF9900', + 'CC6600', + 'FF3300', + 'FF0000', + 'CC0000', + '990033', + ], + [ + '663300', + '996600', + 'CC3300', + '993300', + '990000', + '800000', + 'A50021', + ], + [ + 'F8F8F8', + 'DDDDDD', + 'B2B2B2', + '808080', + '5F5F5F', + '333333', + '1C1C1C', + '080808', + ], + [ + 'FFFFFF', + 'EAEAEA', + 'C0C0C0', + '969696', + '777777', + '4D4D4D', + '292929', + '111111', + '000000', + ], + [ + 'f0197d', + 'ff7f50', + 'ffe45e', + '21fa90', + '7df9ff', + '2ccaff', + '21649f', + '7b55dd', + 'b81fff', + 'ff5cad', + ], + [ + 'ffe2db', + 'ffd5cc', + 'feb8a0', + 'eaa78d', + 'e7a992', + 'd49487', + 'facca4', + 'e8b782', + 'ffc905', + ], + [ + 'c48c5e', + 'bd7740', + 'ab7968', + '8c553f', + '755246', + '86655b', + '754223', + '471b18', + ], +]; diff --git a/tgui/packages/tgui/interfaces/ColorPickerModal/ColorSetter.tsx b/tgui/packages/tgui/interfaces/ColorPickerModal/ColorSetter.tsx new file mode 100644 index 000000000000..5ff57bcf161e --- /dev/null +++ b/tgui/packages/tgui/interfaces/ColorPickerModal/ColorSetter.tsx @@ -0,0 +1,285 @@ +/** + * @file + * @copyright 2023 itsmeow + * @license MIT + */ +import React, { useCallback, useState } from 'react'; +import { + type HsvaColor, + hexToHsva, + hsvaToHex, + hsvaToRgba, + rgbaToHsva, +} from 'tgui-core/color'; +import { Box, Button, Stack, Tooltip } from 'tgui-core/components'; +import { InputButtons } from '../common/InputButtons'; +import { + ColorPresets, + Hue, + RGBSlider, + Saturation, + SaturationValue, + Value, +} from './Color'; +import { HexColorInput, TextSetter } from './TextSetter'; + +interface ColorSelectorProps { + color: HsvaColor; + setColor: React.Dispatch>; + defaultColor: string; +} + +export const ColorSelector: React.FC = React.memo( + ({ color, setColor, defaultColor }) => { + const handleChange = useCallback( + (params: Partial) => { + setColor((current) => ({ ...current, ...params })); + }, + [setColor], + ); + + const [showPresets, setShowPresets] = useState(false); + const rgb = hsvaToRgba(color); + const hexColor = hsvaToHex(color); + + return ( + + + + +
    + + +
    +
    + + + New + + + Current + +
    + + + + + + +
    + + + +
    +
    + + {showPresets ? ( + handleChange(c)} + setShowPresets={setShowPresets} + /> + ) : ( + + + + + Hex: + + + { + setColor(hexToHsva(value)); + }} + /> + + + + + + + + + + + + + + + + )} + +
    + ); + }, +); + +interface RowProps { + color: HsvaColor; + handleChange: (c: Partial) => void; +} + +const HueRow: React.FC = React.memo(({ color, handleChange }) => ( + + + + H: + + + + + + handleChange({ h: v })} + max={360} + unit="°" + /> + + + +)); + +const SaturationRow: React.FC = React.memo( + ({ color, handleChange }) => ( + + + + S: + + + + + + handleChange({ s: v })} + unit="%" + /> + + + + ), +); + +const ValueRow: React.FC = React.memo(({ color, handleChange }) => ( + + + + V: + + + + + + handleChange({ v })} + unit="%" + /> + + + +)); + +interface RGBRowProps { + color: HsvaColor; + handleChange: (c: HsvaColor) => void; +} + +const RedRow: React.FC = React.memo(({ color, handleChange }) => { + const rgb = hsvaToRgba(color); + return ( + + + + R: + + + + + + { + handleChange(rgbaToHsva({ ...rgb, r: v })); + }} + max={255} + /> + + + + ); +}); + +const GreenRow: React.FC = React.memo( + ({ color, handleChange }) => { + const rgb = hsvaToRgba(color); + return ( + + + + G: + + + + + + { + handleChange(rgbaToHsva({ ...rgb, g: v })); + }} + max={255} + /> + + + + ); + }, +); + +const BlueRow: React.FC = React.memo(({ color, handleChange }) => { + const rgb = hsvaToRgba(color); + return ( + + + + B: + + + + + + { + handleChange(rgbaToHsva({ ...rgb, b: v })); + }} + max={255} + /> + + + + ); +}); diff --git a/tgui/packages/tgui/interfaces/ColorPickerModal/TextSetter.tsx b/tgui/packages/tgui/interfaces/ColorPickerModal/TextSetter.tsx new file mode 100644 index 000000000000..839fb568b7f6 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ColorPickerModal/TextSetter.tsx @@ -0,0 +1,108 @@ +/** + * @file + * @copyright 2023 itsmeow + * @license MIT + */ +import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import { validHex } from 'tgui-core/color'; +import { Input, NumberInput } from 'tgui-core/components'; + +interface TextSetterProps { + value: number; + callback: (value: number) => void; + min?: number; + max?: number; + unit?: string; +} + +export const TextSetter: React.FC = React.memo( + ({ value, callback, min = 0, max = 100, unit }) => { + return ( + + ); + }, +); + +interface HexColorInputProps { + prefixed?: boolean; + alpha?: boolean; + color: string; + fluid?: boolean; + onChange: (newColor: string) => void; +} + +export const HexColorInput: React.FC = React.memo( + ({ alpha, color, fluid, onChange, ...rest }) => { + const initialColor = useMemo(() => { + const stripped = color + .replace(/[^0-9A-Fa-f]/g, '') + .substring(0, 6) + .toUpperCase(); + return stripped; + }, [color]); + + const [localValue, setLocalValue] = useState(initialColor); + + useEffect(() => { + setLocalValue(initialColor); + }, [initialColor]); + + const isValidFullHex = useCallback( + (val: string) => { + return validHex(val, alpha) && val.length === 6; + }, + [alpha], + ); + + const handleChangeEvent = (value: string) => { + const strippedValue = value + .replace(/[^0-9A-Fa-f]/g, '') + .substring(0, 6) + .toUpperCase(); + + setLocalValue(strippedValue); + + if (isValidFullHex(strippedValue)) { + onChange(strippedValue); + } + }; + + const commitOrRevert = useCallback(() => { + if (isValidFullHex(localValue)) { + onChange(localValue); + } else { + setLocalValue(initialColor); + } + }, [initialColor, isValidFullHex, localValue, onChange]); + + const handleBlur = () => { + commitOrRevert(); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter') { + commitOrRevert(); + (e.currentTarget as HTMLInputElement).blur(); + } + }; + + return ( + + ); + }, +); diff --git a/tgui/packages/tgui/interfaces/ColorPickerModal/index.tsx b/tgui/packages/tgui/interfaces/ColorPickerModal/index.tsx new file mode 100644 index 000000000000..5a3f0ebd50cf --- /dev/null +++ b/tgui/packages/tgui/interfaces/ColorPickerModal/index.tsx @@ -0,0 +1,78 @@ +/** + * @file + * @copyright 2023 itsmeow + * @license MIT + */ +import type React from 'react'; +import { useEffect, useState } from 'react'; +import { type HsvaColor, hexToHsva } from 'tgui-core/color'; +import { Autofocus, Box, Section, Stack } from 'tgui-core/components'; +import { useBackend } from '../../backend'; +import { Window } from '../../layouts'; +import { Loader } from '../common/Loader'; +import { ColorSelector } from './ColorSetter'; + +interface ColorPickerData { + autofocus: boolean; + buttons: string[]; + message: string; + large_buttons: boolean; + swapped_buttons: boolean; + timeout: number; + title: string; + default_color: string; +} + +type ColorPickerModalProps = any; + +export const ColorPickerModal: React.FC = () => { + const { data } = useBackend(); + const { timeout, message, autofocus, default_color = '#000000' } = data; + let { title } = data; + + const [selectedColor, setSelectedColor] = useState( + hexToHsva(default_color), + ); + + useEffect(() => { + setSelectedColor(hexToHsva(default_color)); + }, [default_color]); + + if (!title) { + title = 'Colour Editor'; + } + + return ( + + {!!timeout && } + + + {!!autofocus && } + {message && ( + +
    + + {message} + +
    +
    + )} + +
    + +
    +
    +
    +
    +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/CrewConsole.tsx b/tgui/packages/tgui/interfaces/CrewConsole.tsx index b89891ad9b8e..df24ce61c09b 100644 --- a/tgui/packages/tgui/interfaces/CrewConsole.tsx +++ b/tgui/packages/tgui/interfaces/CrewConsole.tsx @@ -16,20 +16,53 @@ const HEALTH_COLOR_BY_LEVEL = [ '#801308', ]; -const SORT_NAMES = { - ijob: 'Job', - name: 'Name', - area: 'Position', - health: 'Vitals', -}; - const STAT_LIVING = 0; const STAT_DEAD = 4; -const SORT_OPTIONS = ['health', 'ijob', 'name', 'area']; - const jobIsHead = (jobId: number) => jobId % 10 === 0; +const SORT_OPTIONS = [ + { + name: 'Job', + sort: (a: CrewSensor, b: CrewSensor) => { + return a.ijob - b.ijob; + } + }, + { + name: 'Name', + sort: (a: CrewSensor, b: CrewSensor) => { + if (a.name > b.name) return 1; + if (a.name < b.name) return -1; + return 0; + } + }, + { + name: 'Area', + sort: (a: CrewSensor, b: CrewSensor) => { + if (a.area === undefined) return 1; + if (b.area === undefined) return -1; + if (a.area > b.area) return 1; + if (a.area < b.area) return -1; + return 0; + } + }, + { + name: 'Vitals', + sort: (a: CrewSensor, b: CrewSensor) => { + if (a.life_status > b.life_status) return -1; + if (a.life_status < b.life_status) return 1; + + if (b.oxydam === undefined) return -1; + if (a.oxydam === undefined) return 1; + + if (a.health < b.health) return -1; + if (a.health > b.health) return 1; + + return 0; + } + } +]; + const jobToColor = (jobId: number) => { if (jobId === 0) { return COLORS.department.captain; @@ -68,22 +101,6 @@ const statToIcon = (life_status: number) => { return 'heartbeat'; }; -const healthSort = (a: CrewSensor, b: CrewSensor) => { - if (a.life_status > b.life_status) return -1; - if (a.life_status < b.life_status) return 1; - if (a.health < b.health) return -1; - if (a.health > b.health) return 1; - return 0; -}; - -const areaSort = (a: CrewSensor, b: CrewSensor) => { - a.area ??= '~'; - b.area ??= '~'; - if (a.area < b.area) return -1; - if (a.area > b.area) return 1; - return 0; -}; - const healthToAttribute = ( oxy: number, tox: number, @@ -147,36 +164,25 @@ const CrewTable = () => { const [sortAsc, setSortAsc] = useState(true); const [searchQuery, setSearchQuery] = useState(''); - const [sortBy, setSortBy] = useState(SORT_OPTIONS[0]); + const [indexOfSortingOption, setIndexOfSortingOption] = useState(0); const cycleSortBy = () => { - let idx = SORT_OPTIONS.indexOf(sortBy) + 1; - if (idx === SORT_OPTIONS.length) idx = 0; - setSortBy(SORT_OPTIONS[idx]); + setIndexOfSortingOption((indexOfSortingOption + 1) % SORT_OPTIONS.length); }; const nameSearch = createSearch(searchQuery, (crew: CrewSensor) => crew.name); - const sorted = sensors.filter(nameSearch).sort((a, b) => { - switch (sortBy) { - case 'name': - return sortAsc ? +(a.name > b.name) : +(b.name > a.name); - case 'ijob': - return sortAsc ? a.ijob - b.ijob : b.ijob - a.ijob; - case 'health': - return sortAsc ? healthSort(a, b) : healthSort(b, a); - case 'area': - return sortAsc ? areaSort(a, b) : areaSort(b, a); - default: - return 0; - } - }); + const sorted = sensors.filter(nameSearch).sort((a, b) => + sortAsc + ? SORT_OPTIONS[indexOfSortingOption].sort(a, b) + : SORT_OPTIONS[indexOfSortingOption].sort(b, a) + ); return (
    - +
    diff --git a/tgui/packages/tgui/interfaces/ExaminePanel.tsx b/tgui/packages/tgui/interfaces/ExaminePanel.tsx new file mode 100644 index 000000000000..bce30335d072 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ExaminePanel.tsx @@ -0,0 +1,187 @@ +// THIS IS A DARKPACK UI FILE +import { useState } from 'react'; + +import { resolveAsset } from '../assets'; +import { useBackend } from '../backend'; +import { Section, Stack, Tabs } from 'tgui-core/components'; +import type { BooleanLike } from 'tgui-core/react'; +import { Window } from '../layouts'; + +type ExamineData = { + character_name: string; + obscured: BooleanLike; + flavor_text: string; + flavor_text_nsfw: string; + headshot: string, + ooc_notes: string; + character_notes: string; + nsfw_content: BooleanLike; +} + +function formatURLs(text: string) { + if (!text) return; + const parts: React.ReactNode[] = []; + const regex = /https?:\/\/[^\s/$.?#].[^\s]*/gi; + let lastIndex = 0; + + text.replace(regex, (url: string, index: number) => { + parts.push(text.substring(lastIndex, index)); + parts.push( + + {url} + , + ); + lastIndex = index + url.length; + return url; + }); + + parts.push(text.substring(lastIndex)); + return
    {parts}
    ; +}; + +export const ExaminePanel = (props) => { + const [tabIndex, setTabIndex] = useState(1); + const [lowerTabIndex, setLowerTabIndex] = useState(1); + const { act, data } = useBackend(); + const { + character_name, + obscured, + flavor_text, + flavor_text_nsfw, + headshot, + ooc_notes, + character_notes, + nsfw_content, + } = data; + return ( + + + + +
    + +
    +
    + + + setTabIndex(1)} + > +
    + + {nsfw_content ? + setTabIndex(2)} + > +
    + + : null} + + {tabIndex === 1 && ( +
    + {formatURLs(flavor_text)} +
    + )} + {tabIndex === 2 && ( +
    + {formatURLs(flavor_text_nsfw)} +
    + )} + + setLowerTabIndex(1)} + > +
    + + {nsfw_content ? + setLowerTabIndex(2)} + > +
    + + : null} + + {lowerTabIndex === 1 && ( +
    + {formatURLs(character_notes)} +
    + )} + {lowerTabIndex === 2 && ( +
    + {formatURLs(ooc_notes)} +
    + )} + + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/ExodroneConsole.tsx b/tgui/packages/tgui/interfaces/ExodroneConsole.tsx index b7caeeb47734..8b819187d1dc 100644 --- a/tgui/packages/tgui/interfaces/ExodroneConsole.tsx +++ b/tgui/packages/tgui/interfaces/ExodroneConsole.tsx @@ -18,6 +18,7 @@ import { ProgressBar, Section, Stack, + Tooltip, } from 'tgui-core/components'; import { formatTime } from 'tgui-core/format'; import { capitalize } from 'tgui-core/string'; @@ -215,11 +216,7 @@ const SignalLostModal = (props) => { - @@ -279,39 +276,52 @@ const ToolSelectionModal = (props) => { const toolData = Object.keys(all_tools); return ( - - - Select Tool: - - - {(!!toolData && - toolData.map((tool_name) => ( - - - - ))) || ( - - + +
    { + setChoosingTools(false); + }} + /> + } + > + + {(!!toolData && + toolData.map((tool_name) => ( + + + + {' '} + + + )} + +
    ); }; @@ -325,32 +335,33 @@ const EquipmentBox = (props: { cargo: CargoData; drone: DroneData }) => { switch (cargo.type) { case 'tool': // Tool icon+Remove button if configurable return ( - + + + + - + {capitalize(cargo.name)} + {!!configurable && ( - + + {capitalize(cargo.name)} + - + - {
    -
    +
    setChoosingTools(true)} + /> + ) + } + > - {!!configurable && ( - - )} - - - + {cargo.map((cargo_element, index) => ( { ); }; -const DroneStatus = (props: { - drone_integrity: number; - drone_max_integrity: number; -}) => { - const { drone_integrity, drone_max_integrity } = props; - - return ( - - - Integrity: - - - - - - ); -}; - const NoSiteDimmer = () => { return ( @@ -560,12 +618,7 @@ const TravelTargetSelectionScreen = (props: { Cancel )} - - - + } > @@ -582,8 +635,9 @@ const TravelTargetSelectionScreen = (props: { ml={1} onClick={() => travel_to(null)} disabled={!can_travel} + icon={can_travel ? 'rocket' : 'triangle-exclamation'} > - {can_travel ? 'Launch!' : travel_error} + {can_travel ? 'Launch' : travel_error} } @@ -600,8 +654,9 @@ const TravelTargetSelectionScreen = (props: { ml={1} onClick={() => travel_to(destination.ref)} disabled={!can_travel} + icon={can_travel ? 'rocket' : 'triangle-exclamation'} > - {can_travel ? 'Launch!' : travel_error} + {can_travel ? 'Launch' : travel_error} } @@ -681,16 +736,7 @@ const ExplorationScreen = (props: { drone: DroneExploration & DroneData }) => { ); } return ( -
    - } - > +
    @@ -704,11 +750,21 @@ const ExplorationScreen = (props: { drone: DroneExploration & DroneData }) => { - + {site.events.map((e) => ( +
    @@ -728,16 +791,7 @@ const EventScreen = (props: { drone: DroneData; event: FullEventData }) => { const { drone, event } = props; return ( -
    - } - > +
    @@ -749,7 +803,9 @@ const EventScreen = (props: { drone: DroneData; event: FullEventData }) => { /> -
    {event.description}
    +
    + {event.description} +
    @@ -791,18 +847,7 @@ export const AdventureScreen = (props: { const rawData = adventure_data.raw_image; const imgSource = rawData ? rawData : resolveAsset(adventure_data.image); return ( -
    - ) - } - > +
    @@ -882,21 +927,25 @@ const ExodroneConsoleContent = (props) => { - + + + + + +
    + + {drone_log.map((log_line, ix) => ( + + {log_line} + + ))} + +
    +
    +
    - -
    - - {drone_log.map((log_line, ix) => ( - - {log_line} - - ))} - -
    -
    ); }; diff --git a/tgui/packages/tgui/interfaces/ExperimentConfigure.tsx b/tgui/packages/tgui/interfaces/ExperimentConfigure.tsx index 81602211c412..c6b8f52d654f 100644 --- a/tgui/packages/tgui/interfaces/ExperimentConfigure.tsx +++ b/tgui/packages/tgui/interfaces/ExperimentConfigure.tsx @@ -8,11 +8,11 @@ import { Table, Tooltip, } from 'tgui-core/components'; - +import type { BooleanLike } from 'tgui-core/react'; import { useBackend } from '../backend'; import { Window } from '../layouts'; -type Techweb = { +export type Techweb = { all_servers: string[]; ref: string; selected: number; @@ -20,13 +20,14 @@ type Techweb = { web_org: string; }; -type ExperimentData = { +export type ExperimentData = { description: string; name: string; performance_hint: string; progress: Stage[]; ref: string; - selected: number; + selected?: BooleanLike; + completed?: BooleanLike; tag: string; }; @@ -84,9 +85,14 @@ function ExperimentStageRow(props: ExperimentStageRowProps) { ); } -function TechwebServer(props) { +type TechwebServerProps = { + techwebs: Techweb[]; + can_select?: boolean; +}; + +export function TechwebServer(props: TechwebServerProps) { const { act } = useBackend(); - const { techwebs } = props; + const { techwebs, can_select = true } = props; return techwebs.map((server, index) => ( @@ -98,19 +104,21 @@ function TechwebServer(props) { {server.web_id} / {server.web_org} - - - + {can_select && ( + + + + )} @@ -126,23 +134,64 @@ function TechwebServer(props) { )); } -export function Experiment(props) { +type ExperimentTitleElementProps = { + selected: boolean; + ref: string; + can_select?: boolean; + children?: React.ReactNode; +}; + +function ExperimentTitleElement(props: ExperimentTitleElementProps) { const { act } = useBackend(); - const { exp } = props; + const { selected, ref, can_select = true, children } = props; + + if (!can_select) { + return ( + + {children} + + ); + } + + return ( + + ); +} + +type ExperimentProps = { + exp: ExperimentData; + children?: React.ReactNode; + can_select?: boolean; +}; + +export function Experiment(props: ExperimentProps) { + const { exp, children, can_select } = props; const { name, description, tag, selected, progress, performance_hint, ref } = exp; return ( - -
    - +
    {description} - {props.children} + {children} {progress.map((stage, idx) => ( diff --git a/tgui/packages/tgui/interfaces/Filteriffic.jsx b/tgui/packages/tgui/interfaces/Filteriffic.jsx deleted file mode 100644 index a82fecf8638e..000000000000 --- a/tgui/packages/tgui/interfaces/Filteriffic.jsx +++ /dev/null @@ -1,389 +0,0 @@ -import { map } from 'es-toolkit/compat'; -import { useState } from 'react'; -import { - Box, - Button, - Collapsible, - ColorBox, - Dropdown, - Input, - LabeledList, - NoticeBox, - NumberInput, - Section, -} from 'tgui-core/components'; -import { numberOfDecimalDigits, toFixed } from 'tgui-core/math'; - -import { useBackend } from '../backend'; -import { Window } from '../layouts'; - -const FilterIntegerEntry = (props) => { - const { value, name, filterName } = props; - const { act } = useBackend(); - return ( - - act('modify_filter_value', { - name: filterName, - new_data: { - [name]: value, - }, - }) - } - /> - ); -}; - -const FilterFloatEntry = (props) => { - const { value, name, filterName } = props; - const { act } = useBackend(); - const [step, setStep] = useState(0.01); - - return ( - <> - toFixed(value, numberOfDecimalDigits(step))} - width="80px" - onChange={(value) => - act('transition_filter_value', { - name: filterName, - new_data: { - [name]: value, - }, - }) - } - /> - - Step: - - toFixed(value, 4)} - width="70px" - onChange={(value) => setStep(value)} - /> - - ); -}; - -const FilterTextEntry = (props) => { - const { value, name, filterName } = props; - const { act } = useBackend(); - - return ( - - act('modify_filter_value', { - name: filterName, - new_data: { - [name]: value, - }, - }) - } - /> - ); -}; - -const FilterColorEntry = (props) => { - const { value, filterName, name } = props; - const { act } = useBackend(); - return ( - <> - - - } - > - {log_data - .map((log, index) => ( - - )) - .reverse()} - - )} - - - ); -}; - -const ForensicLog = ({ log, index }: { log: LogData; index: number }) => { - const { act } = useBackend(); - return ( -
    act('delete', { index })} - /> - } - > - {!log.Prints && !log.Fibers && !log.Blood && !log.Reagents ? ( - No forensic traces found. - ) : ( - - {log.Fibers && Object.keys(log.Fibers).length > 0 && ( - - {Object.keys(log.Fibers).map((fibers) => ( - - - {fibers} - - ))} - - )} - {log.Prints && Object.values(log.Prints).length > 0 && ( - - {Object.values(log.Prints).map((print) => ( - - - {print} - - ))} - - )} - {log.Blood && Object.keys(log.Blood).length > 0 && ( - - {Object.keys(log.Blood).map((dna) => ( - - - {`${dna}, ${log.Blood[dna]}`} - - ))} - - )} - {log.Reagents && Object.keys(log.Reagents)?.length > 0 && ( - - - {Object.keys(log.Reagents).map((reagent) => ( - - {`${log.Reagents[reagent]} u.`} - - ))} - - - )} - {log['ID Access'] && Object.keys(log['ID Access'])?.length > 0 && ( - - - {Object.keys(log['ID Access']).map((region) => ( - - {log['ID Access'][region]} - - ))} - - - )} - - )} -
    - ) as any; -}; diff --git a/tgui/packages/tgui/interfaces/ForensicScanner/ForensicLogs.tsx b/tgui/packages/tgui/interfaces/ForensicScanner/ForensicLogs.tsx new file mode 100644 index 000000000000..395eb3f48fd7 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ForensicScanner/ForensicLogs.tsx @@ -0,0 +1,181 @@ +import { Box, Button, Icon, LabeledList, Section } from 'tgui-core/components'; +import { capitalizeFirst } from 'tgui-core/string'; +import { useBackend } from '../../backend'; +import type { DataEntry, ForensicScannerData } from './types'; + +type ForensicLogsProps = { + dataEntries: DataEntry[]; + scanTarget: string; + scanTime: string; + index: number; +}; + +export function ForensicLogs(props: ForensicLogsProps) { + const { act, data } = useBackend(); + const { categories } = data; + const { dataEntries, scanTarget, scanTime, index } = props; + return ( +
    act('delete', { index })} + /> + } + > + {dataEntries.length === 0 ? ( + No forensic traces found. + ) : ( + + {dataEntries.map((dataEntry) => { + const category = categories[dataEntry.category]; + return ( + + + + ); + })} + + )} +
    + ); +} + +type ForensicLogProps = { + logCategoryId: string; + log: Record; + iconName: string; + iconColor: string; +}; + +function ForensicLog(props: ForensicLogProps) { + const { logCategoryId, log, iconName, iconColor } = props; + if (logCategoryId === 'Fingerprints') + return ( + + ); + + if (logCategoryId === 'Reagents') + return ( + + ); + + if (logCategoryId === 'Blood') + return ( + + ); + + if (logCategoryId === 'ID_Access') + return ( + + ); + + return ( + + ); +} + +type LogFormatterProprs = { + log: Record; + iconName: string; + iconColor: string; +}; + +function DefaultLogFormatter(props: LogFormatterProprs) { + const { log, iconName, iconColor } = props; + return ( + <> + {Object.entries(log).map(([key, value]) => ( + + + {value} + + ))} + + ); +} + +function BloodLogFormatter(props: LogFormatterProprs) { + const { log, iconName, iconColor } = props; + return ( + <> + {Object.entries(log).map(([key, value]) => ( + + + {`${key}, ${value}`} + + ))} + + ); +} + +function PrintsLogFormatter(props: LogFormatterProprs) { + const { log, iconName, iconColor } = props; + return ( + <> + {Object.entries(log).map(([key, value]) => ( + + + {value} + + ))} + + ); +} + +function ReagentsLogFormatter(props: LogFormatterProprs) { + const { log, iconName, iconColor } = props; + return ( + + {Object.keys(log).map((reagent) => ( + + + {reagent} + + } + > + {`${log[reagent]} u.`} + + ))} + + ); +} + +function IdAccessLogFormatter(props: LogFormatterProprs) { + const { log, iconName, iconColor } = props; + return ( + + {Object.keys(log).map((region) => ( + + + {region} + + } + > + {log[region]} + + ))} + + ); +} diff --git a/tgui/packages/tgui/interfaces/ForensicScanner/index.tsx b/tgui/packages/tgui/interfaces/ForensicScanner/index.tsx new file mode 100644 index 000000000000..cf00035e2bc6 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ForensicScanner/index.tsx @@ -0,0 +1,51 @@ +import { Button, NoticeBox, Section } from 'tgui-core/components'; +import { useBackend } from '../../backend'; +import { Window } from '../../layouts'; +import { ForensicLogs } from './ForensicLogs'; +import type { ForensicScannerData } from './types'; + +export function ForensicScanner() { + const { act, data } = useBackend(); + const { logs = [] } = data; + return ( + + + {logs.length === 0 ? ( + Log empty. + ) : ( +
    + act('clear')} + > + Clear logs + + + + } + > + {logs + .map((log, index) => ( + + )) + .reverse()} +
    + )} +
    +
    + ); +} diff --git a/tgui/packages/tgui/interfaces/ForensicScanner/types.tsx b/tgui/packages/tgui/interfaces/ForensicScanner/types.tsx new file mode 100644 index 000000000000..33ecfc07d487 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ForensicScanner/types.tsx @@ -0,0 +1,21 @@ +export type ForensicScannerData = { + logs: LogEntry[]; + categories: Record; +}; + +export type LogEntry = { + scanTarget: string; + scanTime: string; + dataEntries: DataEntry[]; +}; + +export type DataEntry = { + category: string; + data: Record; +}; + +export type ForensicScannerCategory = { + name: string; + uiIcon: string; + uiIconColor: string; +}; diff --git a/tgui/packages/tgui/interfaces/Guestbook.tsx b/tgui/packages/tgui/interfaces/Guestbook.tsx new file mode 100644 index 000000000000..5d3c3e7ad40c --- /dev/null +++ b/tgui/packages/tgui/interfaces/Guestbook.tsx @@ -0,0 +1,73 @@ +// THIS IS A DARKPACK UI FILE + +import { useBackend } from '../backend'; +import { Stack, Button, Input, Section, Box } from 'tgui-core/components'; +import { Window } from '../layouts'; +import { useState } from 'react'; + +type Info = { + names: NameData[]; +}; + +type NameData = { + real_name: string; + given_name: string; +}; + +export const Guestbook = (props, context) => { + const { act, data } = useBackend(); + const { names = [] } = data; + + const [lastNameBeforeEdit, setLastNameBeforeEdit] = useState('lastNameBeforeEdit'); + + return ( + + + {(!names.length &&
    {'No known names!'}
    ) || ( + + {names.map((name) => ( + +
    + + +
    +
    + ))} +
    + )} +
    +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/JobSelection.tsx b/tgui/packages/tgui/interfaces/JobSelection.tsx index 48356bfab98f..c3500c833e4c 100644 --- a/tgui/packages/tgui/interfaces/JobSelection.tsx +++ b/tgui/packages/tgui/interfaces/JobSelection.tsx @@ -202,7 +202,7 @@ export function JobSelection(props) { <> {shuttle_status && {shuttle_status}} - It is currently {round_duration} into the shift. + It is currently {round_duration} into the night. {/* DARKPACK EDIT, ORIGINAL: It is currently {round_duration} into the shift. */} } diff --git a/tgui/packages/tgui/interfaces/LibraryAdmin/BookListing.tsx b/tgui/packages/tgui/interfaces/LibraryAdmin/BookListing.tsx index 60221ab35708..4343334b0c5a 100644 --- a/tgui/packages/tgui/interfaces/LibraryAdmin/BookListing.tsx +++ b/tgui/packages/tgui/interfaces/LibraryAdmin/BookListing.tsx @@ -3,7 +3,7 @@ import { Box, NoticeBox, Stack } from 'tgui-core/components'; import { useBackend } from '../../backend'; import { Window } from '../../layouts'; import { PageSelect } from '../LibraryConsole/components/PageSelect'; -import { SearchAndDisplay } from '../LibraryConsole/components/Search'; +import { SearchAndDisplay } from './Search'; import type { LibraryAdminData } from './types'; export function BookListing(props) { diff --git a/tgui/packages/tgui/interfaces/LockedSafe.tsx b/tgui/packages/tgui/interfaces/LockedSafe.tsx index 7e553dc92080..ea72897abeb0 100644 --- a/tgui/packages/tgui/interfaces/LockedSafe.tsx +++ b/tgui/packages/tgui/interfaces/LockedSafe.tsx @@ -26,7 +26,7 @@ export const LockedSafe = (props) => { {!lock_code && 'No password set.'} {!!lock_code && (!locked ? 'Unlocked' : 'Locked')} - + diff --git a/tgui/packages/tgui/interfaces/MarkdownViewer.tsx b/tgui/packages/tgui/interfaces/MarkdownViewer.tsx index 8ad813c764a2..6de28f89dfa6 100644 --- a/tgui/packages/tgui/interfaces/MarkdownViewer.tsx +++ b/tgui/packages/tgui/interfaces/MarkdownViewer.tsx @@ -13,7 +13,7 @@ type MarkdownViewerData = { export const MarkdownViewer = (_: any) => { const { data } = useBackend(); return ( - + diff --git a/tgui/packages/tgui/interfaces/MassSpec.tsx b/tgui/packages/tgui/interfaces/MassSpec.tsx index 1b7d457153e4..51e092c4d753 100644 --- a/tgui/packages/tgui/interfaces/MassSpec.tsx +++ b/tgui/packages/tgui/interfaces/MassSpec.tsx @@ -37,6 +37,7 @@ type Data = { peakHeight: number; beaker1: Beaker; beaker2: Beaker; + hasBeakerInHand: BooleanLike; }; const GRAPH_MAX_WIDTH = 1060; @@ -53,6 +54,7 @@ export const MassSpec = (props) => { peakHeight, beaker1, beaker2, + hasBeakerInHand, } = data; const centerValue = (lowerRange + upperRange) / 2; @@ -106,17 +108,30 @@ export const MassSpec = (props) => {
    - { - - {beaker1.currentVolume} / {beaker1.maxVolume} units - - } + + {beaker1.currentVolume} / {beaker1.maxVolume} units + + ) : ( + ) } > @@ -132,17 +147,30 @@ export const MassSpec = (props) => {
    - { - - {beaker2.currentVolume} / {beaker2.maxVolume} units - - } + + {beaker2.currentVolume} / {beaker2.maxVolume} units + + ) : ( + ) } > diff --git a/tgui/packages/tgui/interfaces/MedicalRecords/RecordView.tsx b/tgui/packages/tgui/interfaces/MedicalRecords/RecordView.tsx index 41b43607803a..4be7d3dbd1f3 100644 --- a/tgui/packages/tgui/interfaces/MedicalRecords/RecordView.tsx +++ b/tgui/packages/tgui/interfaces/MedicalRecords/RecordView.tsx @@ -48,6 +48,7 @@ export const MedicalRecordView = (props) => { quirk_notes, rank, species, + past_medical_records, // DARKPACK EDIT - Flavor Text } = foundRecord; const minor_disabilities_array = getQuirkStrings(minor_disabilities); @@ -211,6 +212,13 @@ export const MedicalRecordView = (props) => { • {quirk} ))} + {/* DARKPACK EDIT START - Flavor Text */} + + + {past_medical_records || 'N/A'} + + + {/* DARKPACK EDIT END */}
    diff --git a/tgui/packages/tgui/interfaces/MedicalRecords/types.ts b/tgui/packages/tgui/interfaces/MedicalRecords/types.ts index 4b6422a92b85..f0465530d19d 100644 --- a/tgui/packages/tgui/interfaces/MedicalRecords/types.ts +++ b/tgui/packages/tgui/interfaces/MedicalRecords/types.ts @@ -27,6 +27,7 @@ export type MedicalRecord = { rank: string; species: string; trim: string; + past_medical_records: string; // DARKPACK EDIT - Flavor Text }; export type MedicalNote = { diff --git a/tgui/packages/tgui/interfaces/MessageMonitor.tsx b/tgui/packages/tgui/interfaces/MessageMonitor.tsx index 9218643a6df2..804ebb7a1ae3 100644 --- a/tgui/packages/tgui/interfaces/MessageMonitor.tsx +++ b/tgui/packages/tgui/interfaces/MessageMonitor.tsx @@ -72,7 +72,7 @@ const RequestLogsScreen = (props) => { Delete Message Stamp - Departament + Department Authentication {requests?.map((request) => ( diff --git a/tgui/packages/tgui/interfaces/NecromancyVendor.jsx b/tgui/packages/tgui/interfaces/NecromancyVendor.jsx new file mode 100644 index 000000000000..06ff604dbff8 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NecromancyVendor.jsx @@ -0,0 +1,127 @@ +//THIS IS A DARKPACK UI FILE +import { classes } from 'tgui-core/react'; +import { useBackend } from '../backend'; +import { Box, Button, Section, Table } from 'tgui-core/components'; +import { Window } from '../layouts'; + +export const NecromancyVendor = (props) => { + const { act, data } = useBackend(); + + const inventory = data.product_records || []; + + const getGreeting = () => { + if (data.user?.has_necromancy){ + return "Welcome, master of death and shadow..."; + } else { + return "The dead whisper of your arrival, mortal..."; + } + }; + + return ( + + +
    + {data.user && ( + + {getGreeting()} +
    + You have harvested + {data.user.souls} souls + from the living. +
    + )} +
    + +
    +
    + {inventory.map((product) => { + const canAfford = data.user && product.price <= data.user.souls; + + return ( + + + {' '} + {product.name} + + +
    + + {inventory.length === 0 && ( + + The codex lies empty... awaiting dark knowledge to fill its pages. + + )} + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/Newspaper.tsx b/tgui/packages/tgui/interfaces/Newspaper.tsx index 488675f52f3c..d30b9e535a34 100644 --- a/tgui/packages/tgui/interfaces/Newspaper.tsx +++ b/tgui/packages/tgui/interfaces/Newspaper.tsx @@ -14,6 +14,7 @@ type Data = { wanted_criminal: string | null; wanted_body: string | null; wanted_photo: string | null; + newspaper_company: string; // DARKPACK EDIT ADD }; type ChannelNames = { @@ -87,12 +88,11 @@ const NewspaperIntro = (props) => { return (
    + {/* DARKPACK EDIT START*/} - The Griffon - - - For use on Space Facilities only! + {data.newspaper_company} + {/* DARKPACK EDIT END*/} Table of Contents: {channels.map((channel) => ( @@ -120,9 +120,8 @@ const NewspaperChannel = (props) => { Channel made by: {individual_channel.author_name} - {channel_has_messages ? ( - <> - {individual_channel.channel_messages.map((message) => ( + {channel_has_messages + ? individual_channel.channel_messages.map((message) => ( <> { - ))} - - ) : ( - 'No feed stories stem from this channel...' - )} + )) + : 'No feed stories stem from this channel...'} ))}
    diff --git a/tgui/packages/tgui/interfaces/NtosRaptorDex.tsx b/tgui/packages/tgui/interfaces/NtosRaptorDex.tsx new file mode 100644 index 000000000000..e677f7c74492 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosRaptorDex.tsx @@ -0,0 +1,12 @@ +import { NtosWindow } from '../layouts'; +import { RaptorDexContent } from './RaptorDex'; + +export const NtosRaptorDex = (props) => { + return ( + + + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosScipaper.jsx b/tgui/packages/tgui/interfaces/NtosScipaper.jsx index 16ecad2e8375..1f099b42f907 100644 --- a/tgui/packages/tgui/interfaces/NtosScipaper.jsx +++ b/tgui/packages/tgui/interfaces/NtosScipaper.jsx @@ -196,7 +196,7 @@ const PaperPublishing = (props) => { icon="info-circle" /> {' Cooperation: '} -
    {gains[coopIndex - 1]}
    +
    {gains[coopIndex]}
    + } + > + + + + + + {techwebs.some((e) => e.selected) && ( + +
    + {experiments.length > 0 ? ( + experiments + .sort((a, b) => (a.name > b.name ? 1 : -1)) + .map((exp, i) => ( + + )) + ) : ( + No experiments found! + )} +
    +
    + )} +
    +
    + + ); +}; diff --git a/tgui/packages/tgui/interfaces/OperatingComputer/PatientStateView.tsx b/tgui/packages/tgui/interfaces/OperatingComputer/PatientStateView.tsx new file mode 100644 index 000000000000..64d2031639b2 --- /dev/null +++ b/tgui/packages/tgui/interfaces/OperatingComputer/PatientStateView.tsx @@ -0,0 +1,354 @@ +import { + AnimatedNumber, + Blink, + Button, + Icon, + LabeledList, + NoticeBox, + ProgressBar, + Section, + Stack, +} from 'tgui-core/components'; +import { capitalizeAll, capitalizeFirst } from 'tgui-core/string'; +import { useBackend, useSharedState } from '../../backend'; +import { type BodyZone, BodyZoneSelector } from '../common/BodyZoneSelector'; +import { extractSurgeryName } from './helpers'; +import { + ComputerTabs, + damageTypes, + type OperatingComputerData, + type PatientData, +} from './types'; + +type PatientStateViewProps = { + setTab: (tab: number) => void; + setSearchText: (text: string) => void; + pinnedOperations: string[]; + setPinnedOperations: (text: string[]) => void; +}; +export const PatientStateView = (props: PatientStateViewProps) => { + const { data } = useBackend(); + const { setTab, setSearchText, pinnedOperations, setPinnedOperations } = + props; + + const { has_table, patient } = data; + if (!has_table) { + return ( +
    + + No table detected + +
    + ); + } + if (!patient) { + return ( +
    + + No patient detected + +
    + ); + } + return ( +
    + + + + + + + + + + + +
    + ); +}; + +type PatientStateMainStateViewProps = { + patient: PatientData; +}; + +const PatientStateMainStateView = (props: PatientStateMainStateViewProps) => { + const { patient } = props; + + return ( + + + {patient.stat} + + + {patient.blood_type || 'Unable to determine blood type'} + + + = 0 ? 'good' : 'average'} + > + `${Math.round(value)}%`} + /> + + + + = patient.standard_blood_level * 0.7 + ? 'good' + : patient.blood_level >= patient.standard_blood_level * 0.45 + ? 'average' + : 'bad' + } + > + `${Math.round(value * 100)}%`} + /> + + + {damageTypes.map((type) => ( + + + + + + ))} + + ); +}; + +type PatientStateSurgeryStateViewProps = { + patient: PatientData; + target_zone: BodyZone; +}; + +const PatientStateSurgeryStateView = ( + props: PatientStateSurgeryStateViewProps, +) => { + const { act, data } = useBackend(); + const { patient, target_zone } = props; + + return ( + + + + zone !== target_zone && act('change_zone', { new_zone: zone }) + } + selectedZone={target_zone} + /> + + + + {patient.surgery_state.map((state) => ( + - {state} + ))} + + + + ); +}; + +type PatientStateNextOperationsViewProps = { + pinnedOperations: string[]; + setPinnedOperations: (text: string[]) => void; + setTab: (tab: number) => void; + setSearchText: (text: string) => void; +}; + +const PatientStateNextOperationsView = ( + props: PatientStateNextOperationsViewProps, +) => { + const { data } = useBackend(); + const { surgeries } = data; + const { pinnedOperations, setPinnedOperations, setTab, setSearchText } = + props; + + const possible_next_operations = surgeries.filter( + (operation) => operation.show_as_next, + ); + + const allTools = ['all tools'].concat( + possible_next_operations + .map((operation) => operation.tool_rec) + .flatMap((tool) => tool.split(' / ')) + .filter((tools, index, self) => self.indexOf(tools) === index), + ); + + const [filterByTool, setFilterByTool] = useSharedState( + 'filter_by_tool', + allTools[0], + ); + + if (pinnedOperations.length > 0) { + possible_next_operations.sort((a, b) => { + if ( + pinnedOperations.includes(a.name) && + !pinnedOperations.includes(b.name) + ) { + return -1; + } + if ( + !pinnedOperations.includes(a.name) && + pinnedOperations.includes(b.name) + ) { + return 1; + } + return 0; + }); + } + + possible_next_operations.sort((a, b) => (a.priority && !b.priority ? -1 : 1)); + + return ( +
    + setFilterByTool( + allTools[(allTools.indexOf(filterByTool) + 1) % allTools.length], + ) + } + onContextMenu={() => setFilterByTool(allTools[0])} + > + {capitalizeFirst(filterByTool)} + + } + > + + {possible_next_operations.length === 0 ? ( + + + No operations available + + + ) : ( + possible_next_operations + .filter( + (operation) => + filterByTool === allTools[0] || + operation.tool_rec.includes(filterByTool), + ) + .map((operation) => { + const { name, tool } = extractSurgeryName(operation, false); + return ( + + + + ); + }) + )} + +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/OperatingComputer/SurgeryProceduresView.tsx b/tgui/packages/tgui/interfaces/OperatingComputer/SurgeryProceduresView.tsx new file mode 100644 index 000000000000..20fc350c71f4 --- /dev/null +++ b/tgui/packages/tgui/interfaces/OperatingComputer/SurgeryProceduresView.tsx @@ -0,0 +1,238 @@ +import { + Box, + Button, + Collapsible, + Input, + Section, + Stack, +} from 'tgui-core/components'; +import { capitalizeAll, capitalizeFirst } from 'tgui-core/string'; +import { useBackend, useSharedState } from '../../backend'; +import { extractRequirementMap, extractSurgeryName } from './helpers'; +import type { OperatingComputerData, OperationData } from './types'; + +type SurgeryRequirementsInnerProps = { + cat_text: string; + cat_contents: string[]; +}; + +export const SurgeryRequirementsInner = ( + props: SurgeryRequirementsInnerProps, +) => { + const { cat_text, cat_contents } = props; + + return ( + + + {cat_text} + + + + {cat_contents.map((req, i) => ( + - {capitalizeFirst(req)} + ))} + + + + ); +}; + +type SurgeryProceduresViewProps = { + searchedSurgeries: OperationData[]; + searchText: string; + setSearchText: (text: string) => void; + pinnedOperations: string[]; + setPinnedOperations: (text: string[]) => void; +}; + +export const SurgeryProceduresView = (props: SurgeryProceduresViewProps) => { + const { data } = useBackend(); + const { surgeries } = data; + const { + searchedSurgeries, + searchText, + setSearchText, + pinnedOperations, + setPinnedOperations, + } = props; + const [sortType, setSortType] = useSharedState<'default' | 'name' | 'tool'>( + 'catalog_sort_type', + 'default', + ); + const [filterRobotic, setFilterRobotic] = useSharedState( + 'catalog_filter', + false, + ); + const rawSurgeryList = + searchedSurgeries.length > 0 ? searchedSurgeries : surgeries; + + const surgeryList = rawSurgeryList + .filter((surgery) => surgery.show_in_list) + .filter((surgery) => !filterRobotic || !surgery.mechanic) + .filter( + (surgery, index, self) => + index === self.findIndex((s) => s.name === surgery.name), + ); + + if (sortType === 'name') { + surgeryList.sort((a, b) => (a.name > b.name ? 1 : -1)); + } else if (sortType === 'tool') { + surgeryList.sort((a, b) => (a.tool_rec > b.tool_rec ? 1 : -1)); + } + + if (pinnedOperations.length > 0) { + surgeryList.sort((a, b) => { + if ( + pinnedOperations.includes(a.name) && + !pinnedOperations.includes(b.name) + ) { + return -1; + } + if ( + !pinnedOperations.includes(a.name) && + pinnedOperations.includes(b.name) + ) { + return 1; + } + return 0; + }); + } + + return ( +
    + + + + + } + > + {surgeryList.map((surgery) => { + const { name, tool, true_name } = extractSurgeryName(surgery, true); + + return ( + + + + + + +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/OperatingComputer/helpers.ts b/tgui/packages/tgui/interfaces/OperatingComputer/helpers.ts new file mode 100644 index 000000000000..a4e285741d3f --- /dev/null +++ b/tgui/packages/tgui/interfaces/OperatingComputer/helpers.ts @@ -0,0 +1,77 @@ +import { capitalizeFirst } from 'tgui-core/string'; +import type { OperationData } from './types'; + +export function extractSurgeryName( + operation: OperationData, + catalog: boolean, +): { name: string; tool: string; true_name?: string } { + // operation names may be "make incision", "lobotomy", or "disarticulation (amputation)" + const { name, tool_rec } = operation; + if (!name) { + return { name: 'Error Surgery', tool: 'Error' }; + } + const parenthesis = name.indexOf('('); + if (parenthesis === -1) { + return { name: capitalizeFirst(name), tool: tool_rec }; + } + const in_parenthesis = name.slice(parenthesis + 1, name.indexOf(')')).trim(); + if (!catalog) { + return { + name: capitalizeFirst(in_parenthesis), + tool: tool_rec, + }; + } + const out_parenthesis = capitalizeFirst(name.slice(0, parenthesis).trim()); + return { + name: capitalizeFirst(out_parenthesis), + tool: tool_rec, + true_name: capitalizeFirst(in_parenthesis), + }; +} + +export function extractRequirementMap( + surgery: OperationData, +): Record { + if (surgery.requirements?.length !== 4) { + return {}; // we can assert this never happens, but just in case... + } + const hard_requirements = surgery.requirements[0]; + const soft_requirements = surgery.requirements[1]; + const optional_requirements = surgery.requirements[2]; + const blocked_requirements = surgery.requirements[3]; + + // you *have* to have one of the soft requirements, so if there's only one... + if (soft_requirements.length === 1) { + hard_requirements.push(soft_requirements[0]); + soft_requirements.length = 0; + } + + const optional_title = () => { + if (optional_requirements.length === 1) { + if (hard_requirements.length === 0) return 'The following is optional:'; + return 'Additionally, the following is optional:'; + } + if (hard_requirements.length === 0) + return 'All of the following are optional:'; + return 'Additionally, all of the following are optional:'; + }; + + const blocked_title = () => { + if (blocked_requirements.length === 1) { + if (hard_requirements.length === 0) + return 'The following would block the procedure:'; + return 'However, the following would block the procedure:'; + } + if (hard_requirements.length === 0) + return 'Any of the following would block the procedure:'; + return 'However, any of the following would block the procedure:'; + }; + + return { + [`${hard_requirements.length === 1 ? 'The' : 'All of the'} following are required:`]: + hard_requirements, + 'Additionally, one of the following is required:': soft_requirements, + [optional_title()]: optional_requirements, + [blocked_title()]: blocked_requirements, + }; +} diff --git a/tgui/packages/tgui/interfaces/OperatingComputer/index.tsx b/tgui/packages/tgui/interfaces/OperatingComputer/index.tsx new file mode 100644 index 000000000000..ca4040fd9843 --- /dev/null +++ b/tgui/packages/tgui/interfaces/OperatingComputer/index.tsx @@ -0,0 +1,92 @@ +import '../../styles/interfaces/OperatingComputer.scss'; + +import { Section, Stack, Tabs } from 'tgui-core/components'; +import { useFuzzySearch } from 'tgui-core/fuzzysearch'; +import { useBackend, useSharedState } from '../../backend'; +import { Window } from '../../layouts'; +import { ExperimentView } from './ExperimentView'; +import { PatientStateView } from './PatientStateView'; +import { SurgeryProceduresView } from './SurgeryProceduresView'; +import { + ComputerTabs, + type OperatingComputerData, + type OperationData, +} from './types'; + +export const OperatingComputer = () => { + const [tab, setTab] = useSharedState('tab', 1); + const { data } = useBackend(); + const { surgeries } = data; + + const { query, setQuery, results } = useFuzzySearch({ + searchArray: surgeries, + matchStrategy: 'aggressive', + getSearchString: (item: OperationData) => `${item.name} ${item.tool_rec}`, + }); + + const [pinnedOperations, setPinnedOperations] = useSharedState( + 'pinned_operation', + [], + ); + + return ( + + + + + + setTab(1)} + > + Patient State + + setTab(2)} + > + Operation Catalog + + setTab(3)} + > + Experiments + + + + + {tab === ComputerTabs.PatientState && ( + + )} + {tab === ComputerTabs.OperationCatalog && ( + + )} + {tab === ComputerTabs.Experiments && } + + +
    + DefOS 1.0 © Nanotrasen-Deforest Corporation. All rights + reserved. +
    +
    +
    +
    +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/OperatingComputer/types.ts b/tgui/packages/tgui/interfaces/OperatingComputer/types.ts new file mode 100644 index 000000000000..5cc1e8ee1e2b --- /dev/null +++ b/tgui/packages/tgui/interfaces/OperatingComputer/types.ts @@ -0,0 +1,73 @@ +import type { BooleanLike } from 'tgui-core/react'; +import type { BodyZone } from '../common/BodyZoneSelector'; +import type { ExperimentData, Techweb } from '../ExperimentConfigure'; + +export type OperatingComputerData = { + has_table: BooleanLike; + patient?: PatientData; + target_zone: BodyZone; + // static data + surgeries: OperationData[]; + techwebs: Techweb[]; + experiments: ExperimentData[]; +}; + +export type PatientData = { + health: number; + blood_type: string; + stat: 'Conscious' | 'Unconscious' | 'Dead'; + statstate: 'good' | 'average' | 'bad'; + minHealth: number; + maxHealth: number; + bruteLoss: number; + fireLoss: number; + toxLoss: number; + oxyLoss: number; + blood_level: number; + standard_blood_level: number; + target_zone: BodyZone; + surgery_state: string[]; +}; + +export type OperationData = { + name: string; + desc: string; + tool_rec: string; + priority?: BooleanLike; + mechanic?: BooleanLike; + requirements?: string[][]; + // show operation as a recommended next step + show_as_next: BooleanLike; + // show operation in the full list + show_in_list: BooleanLike; +}; + +export type damageType = { + label: string; + type: 'bruteLoss' | 'fireLoss' | 'toxLoss' | 'oxyLoss'; +}; + +export const damageTypes: damageType[] = [ + { + label: 'Brute', + type: 'bruteLoss', + }, + { + label: 'Burn', + type: 'fireLoss', + }, + { + label: 'Toxin', + type: 'toxLoss', + }, + { + label: 'Respiratory', + type: 'oxyLoss', + }, +]; + +export enum ComputerTabs { + PatientState = 1, + OperationCatalog = 2, + Experiments = 3, +} diff --git a/tgui/packages/tgui/interfaces/OreRedemptionMachine.tsx b/tgui/packages/tgui/interfaces/OreRedemptionMachine.tsx index 21f3ace82b97..5beff394442b 100644 --- a/tgui/packages/tgui/interfaces/OreRedemptionMachine.tsx +++ b/tgui/packages/tgui/interfaces/OreRedemptionMachine.tsx @@ -157,7 +157,7 @@ function IDSection(props: IDSectionProps) { {user?.name || 'No Name Detected'} - + {user?.cash || 'No Balance Detected'} diff --git a/tgui/packages/tgui/interfaces/OutfitEditor.jsx b/tgui/packages/tgui/interfaces/OutfitEditor.jsx index 5bacf9e4adc9..003c623b69c8 100644 --- a/tgui/packages/tgui/interfaces/OutfitEditor.jsx +++ b/tgui/packages/tgui/interfaces/OutfitEditor.jsx @@ -131,7 +131,7 @@ const OutfitSlot = (props) => { // todo: intuitive way to clear items onClick={(e) => act(e.ctrlKey ? 'ctrlClick' : 'click', { slot })} > - + {name} diff --git a/tgui/packages/tgui/interfaces/PaiCard.tsx b/tgui/packages/tgui/interfaces/PaiCard.tsx index a20655f274d8..7817e3b0a083 100644 --- a/tgui/packages/tgui/interfaces/PaiCard.tsx +++ b/tgui/packages/tgui/interfaces/PaiCard.tsx @@ -36,6 +36,7 @@ type Pai = { name: string; transmit: BooleanLike; receive: BooleanLike; + leashed: BooleanLike; range: number; }; @@ -162,6 +163,7 @@ const PaiOptions = (props) => { name, transmit, receive, + leashed, range, }, } = data; @@ -194,10 +196,16 @@ const PaiOptions = (props) => { Toggle + + + - {emagged ? ( - '∞' - ) : ( - } - > - - - {localStorage.length} - - - - ); -}; diff --git a/tgui/packages/tgui/stories/Themes.stories.tsx b/tgui/packages/tgui/stories/Themes.stories.tsx deleted file mode 100644 index c73b2408fae9..000000000000 --- a/tgui/packages/tgui/stories/Themes.stories.tsx +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @file - * @copyright 2021 Aleksej Komarov - * @license MIT - */ - -import { Input, LabeledList, Section } from 'tgui-core/components'; - -import { useLocalState } from '../backend'; - -export const meta = { - title: 'Themes', - render: () => , -}; - -function Story() { - const [theme, setTheme] = useLocalState('kitchenSinkTheme', ''); - - return ( -
    - - - - - -
    - ); -} diff --git a/tgui/packages/tgui/stories/common.tsx b/tgui/packages/tgui/stories/common.tsx deleted file mode 100644 index 3810dc392720..000000000000 --- a/tgui/packages/tgui/stories/common.tsx +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @file - * @copyright 2021 Aleksej Komarov - * @license MIT - */ - -import { Box } from 'tgui-core/components'; - -export function BoxWithSampleText(props) { - return ( - - Jackdaws love my big sphinx of quartz. - - The wide electrification of the southern provinces will give a powerful - impetus to the growth of agriculture. - - - ); -} diff --git a/tgui/packages/tgui/styles/assets/bg-deforest.svg b/tgui/packages/tgui/styles/assets/bg-deforest.svg new file mode 100644 index 000000000000..018c2e984bd2 --- /dev/null +++ b/tgui/packages/tgui/styles/assets/bg-deforest.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/tgui/packages/tgui/assets/bg-vtm.svg b/tgui/packages/tgui/styles/assets/bg-vtm.svg similarity index 100% rename from tgui/packages/tgui/assets/bg-vtm.svg rename to tgui/packages/tgui/styles/assets/bg-vtm.svg diff --git a/tgui/packages/tgui/styles/interfaces/AntagInfoHeretic.scss b/tgui/packages/tgui/styles/interfaces/AntagInfoHeretic.scss new file mode 100644 index 000000000000..74b2b9852822 --- /dev/null +++ b/tgui/packages/tgui/styles/interfaces/AntagInfoHeretic.scss @@ -0,0 +1,193 @@ +.theme-Heretic { + --background-color: radial-gradient( + circle, + rgb(3, 3, 7) 54%, + rgb(9, 9, 26) 60%, + rgb(8, 5, 15) 80%, + rgb(13, 7, 26) 100% + ); + --background-color-title: radial-gradient( + circle, + rgb(3, 3, 7) 54%, + rgb(9, 9, 26) 60%, + rgb(8, 5, 15) 80%, + rgb(13, 7, 26) 100% + ); + + &--AshPath { + --background-color: radial-gradient( + circle, + rgba(24, 9, 9, 1) 54%, + rgba(31, 10, 10, 1) 60%, + rgba(46, 11, 11, 1) 80%, + rgba(47, 14, 14, 1) 100% + ); + --background-color-title: radial-gradient( + circle, + rgba(24, 9, 9, 1) 54%, + rgba(31, 10, 10, 1) 60%, + rgba(46, 11, 11, 1) 80%, + rgba(47, 14, 14, 1) 100% + ); + } + + &--RustPath { + // brown like poop + --background-color: radial-gradient( + circle, + rgba(120, 48, 9) 54%, + rgba(139, 48, 9) 60%, + rgb(150, 48, 9) 80%, + rgba(160, 48, 9) 100% + ); + --background-color-title: radial-gradient( + circle, + rgb(107, 48, 48) 54%, + rgb(211, 19, 19) 60%, + rgb(221, 84, 25) 80%, + rgb(230, 81, 12) 100% + ); + } + + &--FleshPath { + --background-color: radial-gradient( + circle, + rgb(153, 26, 26) 54%, + rgba(130, 9, 9, 1) 60%, + rgb(150, 33, 30) 80%, + rgb(141, 30, 26) 100% + ); + --background-color-title: radial-gradient( + circle, + rgb(100, 0, 0) 54%, + rgb(100, 2, 2) 60%, + rgba(150, 8, 5, 1) 80%, + rgb(200, 34, 0) 100% + ); + } + + &--VoidPath { + --background-color: radial-gradient( + circle, + rgb(13, 13, 66) 54%, + rgb(22, 22, 66) 60%, + rgb(25, 25, 99) 80%, + rgb(42, 42, 192) 100% + ); + --background-color-title: radial-gradient( + circle, + rgb(13, 13, 66) 54%, + rgb(22, 22, 66) 60%, + rgb(25, 25, 99) 80%, + rgb(42, 42, 192) 100% + ); + } + + &--BladePath { + --background-color: radial-gradient( + circle, + rgb(139, 141, 137) 54%, + rgb(139, 141, 137) 60%, + rgb(170, 188, 186) 80%, + rgba(185, 188, 182) 100% + ); + --background-color-title: radial-gradient( + circle, + rgb(139, 141, 137) 54%, + rgb(139, 141, 137) 60%, + rgb(170, 188, 186) 80%, + rgba(185, 188, 182) 100% + ); + } + + &--CosmicPath { + --background-color: radial-gradient( + circle, + rgb(78, 38, 110) 54%, + rgb(78, 38, 110) 60%, + rgb(78, 38, 110) 80%, + rgb(78, 38, 110) 100% + ); + --background-color-title: radial-gradient( + circle, + rgba(3, 3, 7, 1) 54%, + rgba(9, 9, 26, 1) 60%, + rgba(8, 5, 15, 1) 80%, + rgba(13, 7, 26, 1) 100% + ); + } + + &--LockPath { + --background-color: radial-gradient( + circle, + rgba(3, 3, 7, 1) 54%, + rgba(9, 9, 26, 1) 60%, + rgba(8, 5, 15, 1) 80%, + rgba(13, 7, 26, 1) 100% + ); + --background-color-title: radial-gradient( + circle, + rgba(3, 3, 7, 1) 54%, + rgba(9, 9, 26, 1) 60%, + rgba(8, 5, 15, 1) 80%, + rgba(13, 7, 26, 1) 100% + ); + } + + &--MoonPath { + --background-color: radial-gradient( + circle, + rgb(215, 179, 218) 54%, + rgb(163, 139, 165) 60%, + rgb(108, 92, 109) 80%, + rgba(13, 7, 26, 1) 100% + ); + --background-color-title: radial-gradient( + circle, + rgb(215, 179, 218) 54%, + rgb(163, 139, 165) 60%, + rgb(108, 92, 109) 80%, + rgba(13, 7, 26, 1) 100% + ); + } + + .TitleBar { + background: var(--background-color); + } + + .Window { + background: var(--background-color); + + &__content { + background-image: none; + } + } + + &--ascended { + --background-color: radial-gradient( + circle, + rgba(24, 9, 9, 1) 54%, + rgba(31, 10, 10, 1) 60%, + rgba(46, 11, 11, 1) 80%, + rgba(47, 14, 14, 1) 100% + ); + } +} + +.path-title { + padding: 0; + margin: 0; + text-align: center; +} + +.Passive { + margin: 0.5em 0; + background-color: #808080; + border-radius: 5px; + width: 50%; + padding: 0.5em; + + &--Active { + background-color: #62cc67; + } +} diff --git a/tgui/packages/tgui/styles/interfaces/Atm.scss b/tgui/packages/tgui/styles/interfaces/Atm.scss new file mode 100644 index 000000000000..77984634c59b --- /dev/null +++ b/tgui/packages/tgui/styles/interfaces/Atm.scss @@ -0,0 +1,40 @@ +.Atm__atm-column { + display: flex; + flex-direction: column; + align-items: stretch; + gap: 1rem; +} + +.Atm__atm-row { + display: flex; + align-items: center; + gap: 1rem; +} + +.Atm__atm-button { + min-width: 120px; + flex: 3; +} + +.Atm__account-list { + border: 1px solid #ccc; + border-radius: 4px; + padding: 8px; +} + +.Atm__account-item { + padding: 4px; + margin-bottom: 4px; + cursor: pointer; + border-radius: 4px; + + &.selected { + background-color: #007bff; + color: white; + } + + &:not(.selected) { + background-color: #f8f9fa; + color: black; + } +} diff --git a/tgui/packages/tgui/styles/interfaces/ColorPicker.scss b/tgui/packages/tgui/styles/interfaces/ColorPicker.scss new file mode 100644 index 000000000000..f9d9d3176955 --- /dev/null +++ b/tgui/packages/tgui/styles/interfaces/ColorPicker.scss @@ -0,0 +1,150 @@ +/** + * MIT License + * https://github.com/omgovich/react-colorful/ + * + * Copyright (c) 2020 Vlad Shilov + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +@use '../colors.scss'; +@use '../base.scss'; + +.react-colorful { + position: relative; + display: flex; + flex-direction: column; + width: 200px; + height: 200px; + user-select: none; + cursor: default; +} + +.react-colorful__saturation_value { + position: relative; + flex-grow: 1; + border-color: transparent; /* Fixes https://github.com/omgovich/react-colorful/issues/139 */ + border-bottom: 12px solid #000; + border-radius: 8px 8px 0 0; + background-image: + linear-gradient(to top, rgba(0, 0, 0, 255), rgba(0, 0, 0, 0)), + linear-gradient(to right, rgba(255, 255, 255, 255), rgba(255, 255, 255, 0)); +} + +.react-colorful__pointer-fill, +.react-colorful__alpha-gradient { + content: ''; + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + pointer-events: none; + border-radius: inherit; +} + +/* Improve elements rendering on light backgrounds */ +.react-colorful__alpha-gradient, +.react-colorful__saturation_value { + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.05); +} + +.react-colorful__hue, +.react-colorful__r, +.react-colorful__g, +.react-colorful__b, +.react-colorful__alpha, +.react-colorful__saturation, +.react-colorful__value { + position: relative; + height: 24px; +} + +.react-colorful__hue { + background: linear-gradient( + to right, + #f00 0%, + #ff0 17%, + #0f0 33%, + #0ff 50%, + #00f 67%, + #f0f 83%, + #f00 100% + ); +} + +.react-colorful__r { + background: linear-gradient(to right, #000, #f00); +} + +.react-colorful__g { + background: linear-gradient(to right, #000, #0f0); +} + +.react-colorful__b { + background: linear-gradient(to right, #000, #00f); +} + +/* Round bottom corners of the last element: `Hue` for `ColorPicker` or `Alpha` for `AlphaColorPicker` */ +.react-colorful__last-control { + border-radius: 0 0 8px 8px; +} + +.react-colorful__interactive { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + border-radius: inherit; + outline: none; + /* Don't trigger the default scrolling behavior when the event is originating from this element */ + touch-action: none; +} + +.react-colorful__pointer { + position: absolute; + z-index: 1; + box-sizing: border-box; + width: 28px; + height: 28px; + transform: translate(-50%, -50%); + background-color: #cfcfcf; + border: 2px solid #cfcfcf; + border-radius: 50%; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.4); +} + +.react-colorful__interactive:focus .react-colorful__pointer { + transform: translate(-50%, -50%) scale(1.1); + background-color: #fff; + border-color: #fff; +} + +/* Chessboard-like pattern for alpha related elements */ +.react-colorful__alpha, +.react-colorful__alpha-pointer { + background-color: #fff; + background-image: url('data:image/svg+xml,'); +} + +.react-colorful__saturation-pointer, +.react-colorful__value-pointer, +.react-colorful__hue-pointer, +.react-colorful__r-pointer, +.react-colorful__g-pointer, +.react-colorful__b-pointer { + z-index: 1; + width: 20px; + height: 20px; +} + +/* Display the saturation value pointer over the hue one */ +.react-colorful__saturation_value-pointer { + z-index: 3; +} diff --git a/tgui/packages/tgui/styles/interfaces/ExperimentConfigure.scss b/tgui/packages/tgui/styles/interfaces/ExperimentConfigure.scss index 1eff7049392a..c2135bc9b0e1 100644 --- a/tgui/packages/tgui/styles/interfaces/ExperimentConfigure.scss +++ b/tgui/packages/tgui/styles/interfaces/ExperimentConfigure.scss @@ -3,6 +3,10 @@ background: var(--color-black); border: var(--border-thickness-tiny) solid var(--color-primary); margin: var(--space-s) 0; + + &--selected { + border: var(--border-thickness-tiny) solid var(--button-background-selected); + } } .ExperimentTechwebServer__WebHeader { @@ -27,6 +31,26 @@ border-radius: 0; } +.ExperimentConfigure__ExperimentNameFakeButton { + background-color: var(--color-primary); + font-weight: bold; + border-radius: 0; + position: relative; + display: block; + margin-left: 0; + margin-right: 0; + white-space: nowrap; + line-height: var(--button-height); + padding: 0 var(--space-m); + margin-bottom: var(--space-xs); + border-radius: var(--button-border-radius); + outline: none; + &__content { + display: block; + align-self: stretch; + } +} + .ExperimentConfigure__ExperimentContent { /* prettier-ignore */ padding: var(--space-s) calc(var(--space-xl) * 1.5) var(--space-s) var(--space-s); @@ -34,7 +58,6 @@ .ExperimentStage__Indicator { font-weight: bold; - margin-right: var(--space-xl); text-align: center; } diff --git a/tgui/packages/tgui/styles/interfaces/NuclearBomb.scss b/tgui/packages/tgui/styles/interfaces/NuclearBomb.scss index ad729b510119..5aaee3191147 100644 --- a/tgui/packages/tgui/styles/interfaces/NuclearBomb.scss +++ b/tgui/packages/tgui/styles/interfaces/NuclearBomb.scss @@ -23,6 +23,8 @@ padding-left: 0 !important; padding-right: 0 !important; transition-duration: 0s; + border-style: outset !important; + border-color: var(--nuclear-beige); i.Icon { margin: 0; @@ -33,7 +35,7 @@ .Button__content { opacity: 0.75; - transform: translate(1px, 1px); + transform: translate(0px, 2px); } } } @@ -52,10 +54,18 @@ } } -.NuclearBomb__Button--1 { - background-color: hsl(50, 33%, 78%) !important; - border-color: hsl(50, 33%, 78%) !important; - color: hsl(50, 10%, 70%) !important; +.NuclearBomb__Button--1, +.NuclearBomb__Button--2, +.NuclearBomb__Button--3, +.NuclearBomb__Button--4, +.NuclearBomb__Button--5, +.NuclearBomb__Button--6, +.NuclearBomb__Button--7, +.NuclearBomb__Button--8, +.NuclearBomb__Button--9, +.NuclearBomb__Button--0 { + color: rgb(56, 52, 52); + background-color: var(--nuclear-beige) !important; } .NuclearBomb__Button--E { diff --git a/tgui/packages/tgui/styles/interfaces/OperatingComputer.scss b/tgui/packages/tgui/styles/interfaces/OperatingComputer.scss new file mode 100644 index 000000000000..b7b3cf03fbfc --- /dev/null +++ b/tgui/packages/tgui/styles/interfaces/OperatingComputer.scss @@ -0,0 +1,25 @@ +.theme-operating_computer { + .Layout__content { + background-image: url('../assets/bg-deforest.svg'); + background-size: 90%; + } + // Base + --color-base: hsl(150, 100%, 18%); + --color-primary: hsl(from var(--color-base) h s calc(l + 5)); + --color-border-primary: hsla(0, 0%, 100%, 0.75); + --secondary-lightness-adjustment: -10; + --base-gradient-spread: 0; + + // Components + --button-background-selected: hsl(0, 90.3%, 32.35%); + --button-background-caution: hsl(29.5, 90.95%, 39.02%); + --button-background-danger: hsl(61.15, 100%, 30.78%); + --button-border-radius: 0; + + --collapsible-background-selected: hsl(0, 90.3%, 32.35%); + --collapsible-background-caution: hsl(29.5, 90.95%, 39.02%); + --collapsible-background-danger: hsl(61.15, 100%, 30.78%); + + --progress-bar-background: hsla(0, 0%, 0%, 0.5); + --tab-background-selected: var(--color-base); +} diff --git a/tgui/packages/tgui/styles/interfaces/PreferencesMenu.scss b/tgui/packages/tgui/styles/interfaces/PreferencesMenu.scss index cff7b09fbe82..c7eeb3fdcd3e 100644 --- a/tgui/packages/tgui/styles/interfaces/PreferencesMenu.scss +++ b/tgui/packages/tgui/styles/interfaces/PreferencesMenu.scss @@ -14,6 +14,23 @@ $department_map: ( 'Science': colors.fg(var(--color-purple)), 'Service': var(--color-green), 'Silicon': var(--color-pink), + // DARKPACK EDIT ADD START + 'Prince': var(--color-orange), + 'Camarilla': var(--color-gold), + 'Anarch': var(--color-bad), + 'Church': var(--color-gray), + 'Chantry': var(--color-purple), + 'Clinic': var(--color-teal), + 'Warehouse': var(--color-brown), + 'Strip_Club': var(--color-violet), + 'Police': var(--color-blue), + 'Giovanni': var(--color-green), + 'Manor': var(--color-violet), + 'Sabbat': var(--color-grey), + 'Citizen': var(--color-light-grey), + 'City_Services': var(--color-white), + 'Garou_Nation': var(--color-olive), + 'Pentex': var(--color-green), // DARKPACK EDIT ADD END ); .ChoicedSelection { @@ -237,4 +254,85 @@ $department_map: ( } } } + + // DARKPACK EDIT ADD START + &__Stats { + // background-color: var(--color-base); + padding: var(--space-m); + overflow-y: auto; + + &__header { + display: flex; + justify-content: space-between; + align-items: center; + + b { + color: var(--color-red); + font-size: 1.1rem; + letter-spacing: 0.05em; + text-transform: uppercase; + } + + .reset-button { + background: transparent; + border: var(--border-thickness-small) solid var(--color-red); + color: var(--color-red); + padding: 0.25em 0.5em; + border-radius: var(--border-radius-medium); + cursor: var(--cursor-pointer); + transition: background var(--transition-time-fast) ease-in-out; + + &:hover { + background: var(--color-red); + color: var(--color-white); + } + } + } + + &__category { + margin-top: var(--space-l); + padding-top: var(--space-xs); + border-top: var(--border-thickness-tiny) solid hsla(0, 0%, 100%, 0.1); + + > b { + color: var(--color-red); + font-weight: bold; + text-transform: uppercase; + letter-spacing: 0.05em; + } + + &__subcategory { + margin-left: var(--space-m); + margin-top: var(--space-xs); + + > i { + color: var(--color-grey); + } + > .Stack { + display: grid !important; + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + } + .stat { + align-items: center; + + .stat-label { + color: var(--color-white); + flex: 1; + text-shadow: 0 0 2px hsla(0, 0%, 100%, 0.1); + } + + .stat-dots { + font-family: monospace; + font-size: 1.1em; + letter-spacing: 2px; + + .filled { + color: var(--color-red); + } + } + } + } + } + } + // DARKPACK EDIT ADD END } diff --git a/tgui/packages/tgui/styles/interfaces/Telephone.scss b/tgui/packages/tgui/styles/interfaces/Telephone.scss new file mode 100644 index 000000000000..562bd10d5480 --- /dev/null +++ b/tgui/packages/tgui/styles/interfaces/Telephone.scss @@ -0,0 +1,55 @@ +// THIS IS A DAKRPACK UI FILE + +@use 'sass:color'; +@use 'sass:meta'; + +.Telephone__PhoneScreen { + background: linear-gradient(45deg, #76a0f4, #8a7bd3); +} + +.Telephone__HomeButton { + cursor: pointer; + border-radius: 50px; + transition: background-color 0.4s ease-in-out; + vertical-align: middle; + + &:hover { + background-color: #ffffff50; + } +} + +.Telephone__CallOptionsGrid { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-template-rows: 1fr 1fr 1fr; + column-gap: 5%; + row-gap: 5%; +} + +.Telephone__NumpadGrid { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-template-rows: 1fr 1fr 1fr 1fr 1fr; + column-gap: 5%; + row-gap: 5%; +} + +.Telephone__NumpadButton { + cursor: pointer; + border-radius: 50px; + transition: background-color 0.4s ease-in-out; + vertical-align: middle; + + &:hover { + background-color: #0a05; + } +} + +.Telephone__ContactsElement { + cursor: pointer; + transition: background-color 0.2s ease-in-out; + + &:hover { + background-color: #d26f3850; + } +} diff --git a/tgui/packages/tgui/styles/main.scss b/tgui/packages/tgui/styles/main.scss index 93c0e6bf9bc4..a8d5d97270b3 100644 --- a/tgui/packages/tgui/styles/main.scss +++ b/tgui/packages/tgui/styles/main.scss @@ -18,6 +18,7 @@ // Interfaces @include meta.load-css('./interfaces/Accounting.scss'); @include meta.load-css('./interfaces/AlertModal.scss'); +@include meta.load-css('./interfaces/Atm.scss'); // DARKPACK EDIT ADD @include meta.load-css('./interfaces/Changelog.scss'); @include meta.load-css('./interfaces/CrewManifest.scss'); @include meta.load-css('./interfaces/Emojipedia.scss'); @@ -44,6 +45,8 @@ @include meta.load-css('./interfaces/Trophycase.scss'); @include meta.load-css('./interfaces/Uplink.scss'); @include meta.load-css('./interfaces/DetectiveBoard.scss'); +@include meta.load-css('./interfaces/Telephone.scss'); // DARKPACK EDIT ADD +@include meta.load-css('./interfaces/ColorPicker.scss'); // Layouts @include meta.load-css('./layouts/Layout.scss'); @@ -52,11 +55,11 @@ @include meta.load-css('./layouts/TitleBar.scss'); @include meta.load-css('./layouts/Window.scss'); -@include meta.load-css('highlight.js/scss/github-dark.scss'); +@include meta.load-css('~highlight.js/scss/a11y-dark.scss'); // NT Theme .Layout__content { - background-image: url('../assets/bg-vtm.svg'); // DARKPACK EDIT CHANGE - VtM theme + background-image: url('assets/bg-vtm.svg'); // DARKPACK EDIT CHANGE - VtM theme background-size: 70% 70%; background-position: center; background-repeat: no-repeat; diff --git a/tgui/public/helpers.min.js b/tgui/public/helpers.min.js index 872eebc8ee2f..6c5fc969b84b 100644 --- a/tgui/public/helpers.min.js +++ b/tgui/public/helpers.min.js @@ -1 +1 @@ -(function(){var hasOwn=Object.prototype.hasOwnProperty;var assign=function(target){for(var i=1;i0){url+="&"}var value=params[key];if(value===null||value===undefined){value=""}url+=encodeURIComponent(key)+"="+encodeURIComponent(value)}}}if(window.cef_to_byond){cef_to_byond("byond://"+url);return}if(url.length<2048){location.href="byond://"+url;return}var xhr=new XMLHttpRequest;xhr.open("GET",url);xhr.send()};Byond.callAsync=function(path,params){if(!window.Promise){throw new Error("Async calls require API level of ES2015 or later.")}var index=Byond.__callbacks__.length;var promise=new window.Promise((function(resolve){Byond.__callbacks__.push(resolve)}));Byond.call(path,assign({},params,{callback:"Byond.__callbacks__["+index+"]"}));return promise};Byond.topic=function(params){return Byond.call("",params)};Byond.command=function(command){return Byond.call("winset",{command:command})};Byond.winget=function(id,propName){if(id===null){id=""}var isArray=propName instanceof Array;var isSpecific=propName&&propName!=="*"&&!isArray;var promise=Byond.callAsync("winget",{id:id,property:isArray&&propName.join(",")||propName||"*"});if(isSpecific){promise=promise.then((function(props){return props[propName]}))}return promise};Byond.winset=function(id,propName,propValue){if(id===null){id=""}else if(typeof id==="object"){return Byond.call("winset",id)}var props={};if(typeof propName==="string"){props[propName]=propValue}else{assign(props,propName)}props.id=id;return Byond.call("winset",props)};Byond.parseJson=function(json){try{return JSON.parse(json,byondJsonReviver)}catch(err){throw new Error("JSON parsing error: "+(err&&err.message))}};Byond.sendMessage=function(type,payload){var message=typeof type==="string"?{type:type,payload:payload}:type;if(message.payload!==null&&message.payload!==undefined){message.payload=JSON.stringify(message.payload)}assign(message,{tgui:1,window_id:Byond.windowId});Byond.topic(message)};Byond.injectMessage=function(type,payload){window.update(JSON.stringify({type:type,payload:payload}))};Byond.subscribe=function(listener){window.update.flushQueue(listener);window.update.listeners.push(listener)};Byond.subscribeTo=function(type,listener){var _listener=function(_type,payload){if(_type===type){listener(payload)}};window.update.flushQueue(_listener);window.update.listeners.push(_listener)};var RETRY_ATTEMPTS=5;var RETRY_WAIT_INITIAL=500;var RETRY_WAIT_INCREMENT=500;var loadedAssetByUrl={};var isStyleSheetLoaded=function(node,url){var styleSheet=node.sheet;if(styleSheet){return styleSheet.rules.length>0}return false};var injectNode=function(node){if(!document.body){setTimeout((function(){injectNode(node)}));return}var refs=document.body.childNodes;var ref=refs[refs.length-1];ref.parentNode.insertBefore(node,ref.nextSibling)};var loadAsset=function(options){var url=options.url;var type=options.type;var sync=options.sync;var attempt=options.attempt||0;if(loadedAssetByUrl[url]){return}loadedAssetByUrl[url]=options;var retry=function(){if(attempt>=RETRY_ATTEMPTS){var errorMessage="Error: Failed to load the asset "+"'"+url+"' after several attempts.";if(type==="css"){errorMessage+=+"\nStylesheet was either not found, "+"or you're trying to load an empty stylesheet "+"that has no CSS rules in it."}throw new Error(errorMessage)}setTimeout((function(){loadedAssetByUrl[url]=null;options.attempt+=1;loadAsset(options)}),RETRY_WAIT_INITIAL+attempt*RETRY_WAIT_INCREMENT)};if(type==="js"){var node=document.createElement("script");node.type="text/javascript";node.crossOrigin="anonymous";node.src=url;if(sync){node.defer=true}else{node.async=true}node.onerror=function(){node.onerror=null;node.parentNode.removeChild(node);node=null;retry()};injectNode(node);return}if(type==="css"){var node=document.createElement("link");node.type="text/css";node.rel="stylesheet";node.crossOrigin="anonymous";node.href=url;if(!sync){node.media="only x"}var removeNodeAndRetry=function(){node.parentNode.removeChild(node);node=null;retry()};node.onerror=function(){node.onerror=null;removeNodeAndRetry()};node.onload=function(){node.onload=null;if(isStyleSheetLoaded(node,url)){node.media="all";return}removeNodeAndRetry()};injectNode(node);return}};Byond.loadJs=function(url,sync){loadAsset({url:url,sync:sync,type:"js"})};Byond.loadCss=function(url,sync){loadAsset({url:url,sync:sync,type:"css"})};Byond.saveBlob=function(blob,filename,ext){if(window.navigator.msSaveBlob){window.navigator.msSaveBlob(blob,filename)}else if(window.showSaveFilePicker){var accept={};accept[blob.type]=[ext];var opts={suggestedName:filename,types:[{description:"SS13 file",accept:accept}]};window.showSaveFilePicker(opts).then((function(file){return file.createWritable()})).then((function(file){return file.write(blob).then((function(){return file.close()}))})).catch((function(){}))}};Byond.iconRefMap={}})();window.onerror=function(msg,url,line,col,error){window.onerror.errorCount=(window.onerror.errorCount||0)+1;var stack=error&&error.stack;if(!stack){stack=msg+"\n at "+url+":"+line;if(col){stack+=":"+col}}stack=window.__augmentStack__(stack,error);if(Byond.strictMode){var errorRoot=document.getElementById("FatalError");var errorStack=document.getElementById("FatalError__stack");if(errorRoot){errorRoot.className="FatalError FatalError--visible";if(window.onerror.__stack__){window.onerror.__stack__+="\n\n"+stack}else{window.onerror.__stack__=stack}var textProp="textContent";errorStack[textProp]=window.onerror.__stack__}var setFatalErrorGeometry=function(){Byond.winset(Byond.windowId,{titlebar:true,"is-visible":true,"can-resize":true})};setFatalErrorGeometry();setInterval(setFatalErrorGeometry,1e3)}if(Byond.strictMode){Byond.sendMessage({type:"log",fatal:1,message:stack})}else if(window.onerror.errorCount<=1){stack+="\nWindow is in non-strict mode, future errors are suppressed.";Byond.sendMessage({type:"log",message:stack})}if(Byond.strictMode){window.update=function(){};window.update.queue=[]}return true};window.onunhandledrejection=function(e){var msg="UnhandledRejection";if(e.reason){msg+=": "+(e.reason.message||e.reason.description||e.reason);if(e.reason.stack){e.reason.stack="UnhandledRejection: "+e.reason.stack}}window.onerror(msg,null,null,null,e.reason)};window.__augmentStack__=function(stack,error){return stack+"\nUser Agent: "+navigator.userAgent};window.update=function(rawMessage){if(window.update.queueActive){window.update.queue.push(rawMessage);return}var message=Byond.parseJson(rawMessage);var listeners=window.update.listeners;for(var i=0;i0){url+="&"}var value=params[key];if(value===null||value===undefined){value=""}url+=encodeURIComponent(key)+"="+encodeURIComponent(value)}}}if(window.cef_to_byond){cef_to_byond("byond://"+url);return}if(url.length<2048){location.href="byond://"+url;return}var xhr=new XMLHttpRequest;xhr.open("GET",url);xhr.send()};Byond.callAsync=function(path,params){if(!window.Promise){throw new Error("Async calls require API level of ES2015 or later.")}var index=Byond.__callbacks__.length;var promise=new window.Promise(function(resolve){Byond.__callbacks__.push(resolve)});Byond.call(path,assign({},params,{callback:"Byond.__callbacks__["+index+"]"}));return promise};Byond.topic=function(params){return Byond.call("",params)};Byond.command=function(command){return Byond.call("winset",{command:command})};Byond.winget=function(id,propName){if(id===null){id=""}var isArray=propName instanceof Array;var isSpecific=propName&&propName!=="*"&&!isArray;var promise=Byond.callAsync("winget",{id:id,property:isArray&&propName.join(",")||propName||"*"});if(isSpecific){promise=promise.then(function(props){return props[propName]})}return promise};Byond.winset=function(id,propName,propValue){if(id===null){id=""}else if(typeof id==="object"){return Byond.call("winset",id)}var props={};if(typeof propName==="string"){props[propName]=propValue}else{assign(props,propName)}props.id=id;return Byond.call("winset",props)};Byond.parseJson=function(json){try{return JSON.parse(json,byondJsonReviver)}catch(err){throw new Error("JSON parsing error: "+(err&&err.message))}};Byond.sendMessage=function(type,payload){var message=typeof type==="string"?{type:type,payload:payload}:type;if(message.payload!==null&&message.payload!==undefined){message.payload=JSON.stringify(message.payload)}assign(message,{tgui:1,window_id:Byond.windowId});Byond.topic(message)};Byond.injectMessage=function(type,payload){window.update(JSON.stringify({type:type,payload:payload}))};Byond.subscribe=function(listener){window.update.flushQueue(listener);window.update.listeners.push(listener)};Byond.subscribeTo=function(type,listener){var _listener=function(_type,payload){if(_type===type){listener(payload)}};window.update.flushQueue(_listener);window.update.listeners.push(_listener)};var RETRY_ATTEMPTS=5;var RETRY_WAIT_INITIAL=500;var RETRY_WAIT_INCREMENT=500;var loadedAssetByUrl={};var isStyleSheetLoaded=function(node,url){var styleSheet=node.sheet;if(styleSheet){return styleSheet.rules.length>0}return false};var injectNode=function(node){if(!document.body){setTimeout(function(){injectNode(node)});return}var refs=document.body.childNodes;var ref=refs[refs.length-1];ref.parentNode.insertBefore(node,ref.nextSibling)};var loadAsset=function(options){var url=options.url;var type=options.type;var sync=options.sync;var attempt=options.attempt||0;if(loadedAssetByUrl[url]){return}loadedAssetByUrl[url]=options;var retry=function(){if(attempt>=RETRY_ATTEMPTS){var errorMessage="Error: Failed to load the asset "+"'"+url+"' after several attempts.";if(type==="css"){errorMessage+=+"\nStylesheet was either not found, "+"or you're trying to load an empty stylesheet "+"that has no CSS rules in it."}throw new Error(errorMessage)}setTimeout(function(){loadedAssetByUrl[url]=null;options.attempt+=1;loadAsset(options)},RETRY_WAIT_INITIAL+attempt*RETRY_WAIT_INCREMENT)};if(type==="js"){var node=document.createElement("script");node.type="text/javascript";node.crossOrigin="anonymous";node.src=url;if(sync){node.defer=true}else{node.async=true}node.onerror=function(){node.onerror=null;node.parentNode.removeChild(node);node=null;retry()};injectNode(node);return}if(type==="css"){var node=document.createElement("link");node.type="text/css";node.rel="stylesheet";node.crossOrigin="anonymous";node.href=url;if(!sync){node.media="only x"}var removeNodeAndRetry=function(){node.parentNode.removeChild(node);node=null;retry()};node.onerror=function(){node.onerror=null;removeNodeAndRetry()};node.onload=function(){node.onload=null;if(isStyleSheetLoaded(node,url)){node.media="all";return}removeNodeAndRetry()};injectNode(node);return}};Byond.loadJs=function(url,sync){loadAsset({url:url,sync:sync,type:"js"})};Byond.loadCss=function(url,sync){loadAsset({url:url,sync:sync,type:"css"})};Byond.saveBlob=function(blob,filename,ext){if(window.navigator.msSaveBlob){window.navigator.msSaveBlob(blob,filename)}else if(window.showSaveFilePicker){var accept={};accept[blob.type]=[ext];var opts={suggestedName:filename,types:[{description:"SS13 file",accept:accept}]};window.showSaveFilePicker(opts).then(function(file){return file.createWritable()}).then(function(file){return file.write(blob).then(function(){return file.close()})}).catch(function(){})}};Byond.iconRefMap={}})();window.onerror=function(msg,url,line,col,error){window.onerror.errorCount=(window.onerror.errorCount||0)+1;var stack=error&&error.stack;if(!stack){stack=msg+"\n at "+url+":"+line;if(col){stack+=":"+col}}stack=window.__augmentStack__(stack,error);if(Byond.strictMode){var errorRoot=document.getElementById("FatalError");var errorStack=document.getElementById("FatalError__stack");if(errorRoot){errorRoot.className="FatalError FatalError--visible";if(window.onerror.__stack__){window.onerror.__stack__+="\n\n"+stack}else{window.onerror.__stack__=stack}var textProp="textContent";errorStack[textProp]=window.onerror.__stack__}var setFatalErrorGeometry=function(){Byond.winset(Byond.windowId,{titlebar:true,"is-visible":true,"can-resize":true})};setFatalErrorGeometry();setInterval(setFatalErrorGeometry,1e3)}if(Byond.strictMode){Byond.sendMessage({type:"log",fatal:1,message:stack})}else if(window.onerror.errorCount<=1){stack+="\nWindow is in non-strict mode, future errors are suppressed.";Byond.sendMessage({type:"log",message:stack})}if(Byond.strictMode){window.update=function(){};window.update.queue=[]}return true};window.onunhandledrejection=function(e){var msg="UnhandledRejection";if(e.reason){msg+=": "+(e.reason.message||e.reason.description||e.reason);if(e.reason.stack){e.reason.stack="UnhandledRejection: "+e.reason.stack}}window.onerror(msg,null,null,null,e.reason)};window.__augmentStack__=function(stack,error){return stack+"\nUser Agent: "+navigator.userAgent};window.update=function(rawMessage){if(window.update.queueActive){window.update.queue.push(rawMessage);return}var message=Byond.parseJson(rawMessage);var listeners=window.update.listeners;for(var i=0;i + + + + + + + + diff --git a/tgui/public/tgui.html b/tgui/public/tgui.html index e9b8bd39c3fb..d11633f17227 100644 --- a/tgui/public/tgui.html +++ b/tgui/public/tgui.html @@ -6,6 +6,7 @@ + diff --git a/tgui/rspack.config.ts b/tgui/rspack.config.ts index 1fc0159d2fb3..12beda151188 100644 --- a/tgui/rspack.config.ts +++ b/tgui/rspack.config.ts @@ -99,7 +99,7 @@ export default defineConfig({ emitOnErrors: false, }, output: { - path: 'public', + path: path.resolve(dirname, 'public'), filename: '[name].bundle.js', chunkFilename: '[name].bundle.js', chunkLoadTimeout: 15000, diff --git a/tools/CreditsTool/CreditsTool.csproj b/tools/CreditsTool/CreditsTool.csproj index 68187a08154f..219eaeffc5c0 100644 --- a/tools/CreditsTool/CreditsTool.csproj +++ b/tools/CreditsTool/CreditsTool.csproj @@ -8,9 +8,10 @@ Exe CreditsTool CreditsTool - v4.6.1 + v4.8 512 true + AnyCPU @@ -20,7 +21,8 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 5 + false AnyCPU @@ -30,6 +32,7 @@ TRACE prompt 4 + false diff --git a/tools/CreditsTool/CreditsTool.exe b/tools/CreditsTool/CreditsTool.exe index da0187aaf7c3..62fb0c0a97ce 100644 Binary files a/tools/CreditsTool/CreditsTool.exe and b/tools/CreditsTool/CreditsTool.exe differ diff --git a/tools/CreditsTool/UpdateCreditsDMI.bat b/tools/CreditsTool/UpdateCreditsDMI.bat new file mode 100644 index 000000000000..0613860b0e8b --- /dev/null +++ b/tools/CreditsTool/UpdateCreditsDMI.bat @@ -0,0 +1,8 @@ +@echo off +REM If you hit github's rate limit, add a 3rd parameter here that is a github personal access token +CreditsTool.exe tgstation tgstation + +del "%~dp0\..\..\config\contributors.dmi" +call "%~dp0\..\bootstrap\python" credits.py %* +rmdir /s /q credit_pngs +pause diff --git a/tools/CreditsTool/UpdateCreditsDMI.sh b/tools/CreditsTool/UpdateCreditsDMI.sh deleted file mode 100644 index 89d24e1e8f85..000000000000 --- a/tools/CreditsTool/UpdateCreditsDMI.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -#If you hit github's rate limit, add a 3rd parameter here that is a github personal access token -./CreditsTool tgstation tgstation - -rm ../../icons/credits.dmi - -for filename in credit_pngs/*.png; do - realname=$(basename "$filename") - java -jar ../dmitool/dmitool.jar import ../../icons/credits.dmi "${realname%.*}" "$filename" -done - -rm -rf credit_pngs diff --git a/tools/CreditsTool/__init__.py b/tools/CreditsTool/__init__.py new file mode 100644 index 000000000000..4c3ef221370a --- /dev/null +++ b/tools/CreditsTool/__init__.py @@ -0,0 +1,247 @@ +# Tools for working with modern DreamMaker icon files (PNGs + metadata) + +import math +from PIL import Image +from PIL.PngImagePlugin import PngInfo + +DEFAULT_SIZE = 32, 32 +LOOP_UNLIMITED = 0 +LOOP_ONCE = 1 + +NORTH = 1 +SOUTH = 2 +EAST = 4 +WEST = 8 +SOUTHEAST = SOUTH | EAST +SOUTHWEST = SOUTH | WEST +NORTHEAST = NORTH | EAST +NORTHWEST = NORTH | WEST + +CARDINALS = [NORTH, SOUTH, EAST, WEST] +DIR_ORDER = [SOUTH, NORTH, EAST, WEST, SOUTHEAST, SOUTHWEST, NORTHEAST, NORTHWEST] +DIR_NAMES = { + 'SOUTH': SOUTH, + 'NORTH': NORTH, + 'EAST': EAST, + 'WEST': WEST, + 'SOUTHEAST': SOUTHEAST, + 'SOUTHWEST': SOUTHWEST, + 'NORTHEAST': NORTHEAST, + 'NORTHWEST': NORTHWEST, + **{str(x): x for x in DIR_ORDER}, + **{x: x for x in DIR_ORDER}, + '0': SOUTH, + None: SOUTH, +} + + +class Dmi: + version = "4.0" + + def __init__(self, width, height): + self.width = width + self.height = height + self.states = [] + + @classmethod + def from_file(cls, fname): + image = Image.open(fname) + if image.mode != 'RGBA': + image = image.convert('RGBA') + + # no metadata = regular image file + if 'Description' not in image.info: + dmi = Dmi(*image.size) + state = dmi.state("") + state.frame(image) + return dmi + + # read metadata + metadata = image.info['Description'] + line_iter = iter(metadata.splitlines()) + assert next(line_iter) == "# BEGIN DMI" + assert next(line_iter) == f"version = {cls.version}" + + dmi = Dmi(*DEFAULT_SIZE) + state = None + + for line in line_iter: + if line == "# END DMI": + break + key, value = line.lstrip().split(" = ") + if key == 'width': + dmi.width = int(value) + elif key == 'height': + dmi.height = int(value) + elif key == 'state': + state = dmi.state(unescape(value)) + elif key == 'dirs': + state.dirs = int(value) + elif key == 'frames': + state._nframes = int(value) + elif key == 'delay': + state.delays = [parse_num(x) for x in value.split(',')] + elif key == 'loop': + state.loop = int(value) + elif key == 'rewind': + state.rewind = parse_bool(value) + elif key == 'hotspot': + x, y, frm = [int(x) for x in value.split(',')] + state.hotspot(frm - 1, x, y) + elif key == 'movement': + state.movement = parse_bool(value) + else: + raise NotImplementedError(key) + + # cut image into frames + width, height = image.size + gridwidth = width // dmi.width + i = 0 + for state in dmi.states: + for frame in range(state._nframes): + for dir in range(state.dirs): + px = dmi.width * (i % gridwidth) + py = dmi.height * (i // gridwidth) + im = image.crop((px, py, px + dmi.width, py + dmi.height)) + assert im.size == (dmi.width, dmi.height) + state.frames.append(im) + i += 1 + state._nframes = None + + return dmi + + def state(self, *args, **kwargs): + s = State(self, *args, **kwargs) + self.states.append(s) + return s + + @property + def default_state(self): + return self.states[0] + + def get_state(self, name): + for state in self.states: + if state.name == name: + return state + raise KeyError(name) + + def _assemble_comment(self): + comment = "# BEGIN DMI\n" + comment += f"version = {self.version}\n" + comment += f"\twidth = {self.width}\n" + comment += f"\theight = {self.height}\n" + for state in self.states: + comment += f"state = {escape(state.name)}\n" + comment += f"\tdirs = {state.dirs}\n" + comment += f"\tframes = {state.framecount}\n" + if state.framecount > 1 and len(state.delays): # any(x != 1 for x in state.delays): + comment += "\tdelay = " + ",".join(map(str, state.delays)) + "\n" + if state.loop != 0: + comment += f"\tloop = {state.loop}\n" + if state.rewind: + comment += "\trewind = 1\n" + if state.movement: + comment += "\tmovement = 1\n" + if state.hotspots and any(state.hotspots): + current = None + for i, value in enumerate(state.hotspots): + if value != current: + x, y = value + comment += f"\thotspot = {x},{y},{i + 1}\n" + current = value + comment += "# END DMI" + return comment + + def to_file(self, filename, *, palette=False): + # assemble comment + comment = self._assemble_comment() + + # assemble spritesheet + W, H = self.width, self.height + num_frames = sum(len(state.frames) for state in self.states) + sqrt = math.ceil(math.sqrt(num_frames)) + output = Image.new('RGBA', (sqrt * W, math.ceil(num_frames / sqrt) * H)) + + i = 0 + for state in self.states: + for frame in state.frames: + output.paste(frame, ((i % sqrt) * W, (i // sqrt) * H)) + i += 1 + + # save + pnginfo = PngInfo() + pnginfo.add_text('Description', comment, zip=True) + if palette: + output = output.convert('P') + output.save(filename, 'png', optimize=True, pnginfo=pnginfo) + + +class State: + def __init__(self, dmi, name, *, loop=LOOP_UNLIMITED, rewind=False, movement=False, dirs=1): + self.dmi = dmi + self.name = name + self.loop = loop + self.rewind = rewind + self.movement = movement + self.dirs = dirs + + self._nframes = None # used during loading only + self.frames = [] + self.delays = [] + self.hotspots = None + + @property + def framecount(self): + if self._nframes is not None: + return self._nframes + else: + return len(self.frames) // self.dirs + + def frame(self, image, *, delay=1): + assert image.size == (self.dmi.width, self.dmi.height) + self.delays.append(delay) + self.frames.append(image) + + def hotspot(self, first_frame, x, y): + if self.hotspots is None: + self.hotspots = [None] * self.framecount + for i in range(first_frame, self.framecount): + self.hotspots[i] = x, y + + def _frame_index(self, frame=0, dir=None): + ofs = DIR_ORDER.index(DIR_NAMES[dir]) + if ofs >= self.dirs: + ofs = 0 + return frame * self.dirs + ofs + + def get_frame(self, *args, **kwargs): + return self.frames[self._frame_index(*args, **kwargs)] + + +def escape(text): + text = text.replace('\\', '\\\\') + text = text.replace('"', '\\"') + return f'"{text}"' + + +def unescape(text, quote='"'): + if text == 'null': + return None + if not (text.startswith(quote) and text.endswith(quote)): + raise ValueError(text) + text = text[1:-1] + text = text.replace('\\"', '"') + text = text.replace('\\\\', '\\') + return text + + +def parse_num(value): + if '.' in value: + return float(value) + return int(value) + + +def parse_bool(value): + if value not in ('0', '1'): + raise ValueError(value) + return value == '1' diff --git a/tools/CreditsTool/credits.py b/tools/CreditsTool/credits.py new file mode 100644 index 000000000000..a1cd54183843 --- /dev/null +++ b/tools/CreditsTool/credits.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +import os +from dmi import * + +new_file = Dmi(32, 32) +for file in os.listdir("./credit_pngs"): + filename = os.fsdecode(file) + new_icon = Dmi.from_file(f"./credit_pngs/{filename}") + new_icon.default_state.name = filename[:-4] + new_file.states.append(new_icon.default_state) + +new_file.to_file("../../config/contributors.dmi") diff --git a/tools/CreditsTool/remappings.txt b/tools/CreditsTool/remappings.txt index 5b12c9bffe21..46157313f897 100644 --- a/tools/CreditsTool/remappings.txt +++ b/tools/CreditsTool/remappings.txt @@ -8,13 +8,10 @@ tgstation-server Thanks for playing! optimumtact oranges -qustinnus Floyd / Qustinnus catalystfd __REMOVE__ TheVekter Vekter ChangelingRain Joan -NewSta1 NewSta theOperand Miauw -PraiseRatvar Frozenguy5 FuryMcFlurry Fury McFlurry vuonojenmustaturska Naksu praisenarsie Frozenguy5 @@ -27,4 +24,9 @@ Tharcoonvagh Tharcoon Rectification itseasytosee ATHATH ATH1909 trollbreeder troll breeder -BuffEngineering Buff Engineering \ No newline at end of file +BuffEngineering Buff Engineering +actions-user __REMOVE__ +dependabot[bot] __REMOVE__ +github-actions[bot] __REMOVE__ +tgstation-ci[bot] __REMOVE__ +comfyorange __REMOVE__ diff --git a/tools/DM Line counter.exe b/tools/DM Line counter.exe deleted file mode 100644 index d6b075d6313b..000000000000 Binary files a/tools/DM Line counter.exe and /dev/null differ diff --git a/tools/UpdatePaths/Scripts/93028_circuitboard_vending_donk.txt b/tools/UpdatePaths/Scripts/93028_circuitboard_vending_donk.txt new file mode 100644 index 000000000000..91ce45c2d656 --- /dev/null +++ b/tools/UpdatePaths/Scripts/93028_circuitboard_vending_donk.txt @@ -0,0 +1,2 @@ +/obj/item/circuitboard/machine/vending/donksnackvendor : @DELETE +/obj/item/circuitboard/machine/vending/donksofttoyvendor : @DELETE diff --git a/tools/UpdatePaths/Scripts/93198_alert_consoles.txt b/tools/UpdatePaths/Scripts/93198_alert_consoles.txt new file mode 100644 index 000000000000..18b83c2238a5 --- /dev/null +++ b/tools/UpdatePaths/Scripts/93198_alert_consoles.txt @@ -0,0 +1,2 @@ +/obj/machinery/computer/station_alert/station_only : /obj/machinery/computer/station_alert{@OLD} +/obj/effect/landmark/start/hangover/closet : /obj/effect/landmark/start/hangover{@OLD} diff --git a/tools/UpdatePaths/Scripts/93517_VendATray_BoardRemove.txt b/tools/UpdatePaths/Scripts/93517_VendATray_BoardRemove.txt new file mode 100644 index 000000000000..44aba7b2efc1 --- /dev/null +++ b/tools/UpdatePaths/Scripts/93517_VendATray_BoardRemove.txt @@ -0,0 +1 @@ +/obj/item/circuitboard/machine/vendatray : @DELETE \ No newline at end of file diff --git a/tools/UpdatePaths/Scripts/93537_replace_built_light.txt b/tools/UpdatePaths/Scripts/93537_replace_built_light.txt new file mode 100644 index 000000000000..9c308bff84f9 --- /dev/null +++ b/tools/UpdatePaths/Scripts/93537_replace_built_light.txt @@ -0,0 +1,11 @@ +/obj/machinery/light/built : /obj/machinery/light/empty{@OLD} +/obj/machinery/light/built/directional/north : /obj/machinery/light/empty/directional/north{@OLD} +/obj/machinery/light/built/directional/south : /obj/machinery/light/empty/directional/south{@OLD} +/obj/machinery/light/built/directional/east : /obj/machinery/light/empty/directional/east{@OLD} +/obj/machinery/light/built/directional/west : /obj/machinery/light/empty/directional/west{@OLD} + +/obj/machinery/light/small/built : /obj/machinery/light/small/empty{@OLD} +/obj/machinery/light/small/built/directional/north : /obj/machinery/light/small/empty/directional/north{@OLD} +/obj/machinery/light/small/built/directional/south : /obj/machinery/light/small/empty/directional/south{@OLD} +/obj/machinery/light/small/built/directional/east : /obj/machinery/light/small/empty/directional/east{@OLD} +/obj/machinery/light/small/built/directional/west : /obj/machinery/light/small/empty/directional/west{@OLD} diff --git a/tools/UpdatePaths/Scripts/93676_jetpack_repaths.txt b/tools/UpdatePaths/Scripts/93676_jetpack_repaths.txt new file mode 100644 index 000000000000..64728b2356d9 --- /dev/null +++ b/tools/UpdatePaths/Scripts/93676_jetpack_repaths.txt @@ -0,0 +1,7 @@ +/obj/item/tank/jetpack/oxygen : /obj/item/tank/jetpack{@OLD} + +/obj/item/tank/jetpack/oxygen/harness : /obj/item/tank/jetpack/harness{@OLD} + +/obj/item/tank/jetpack/oxygen/captain : /obj/item/tank/jetpack/captain{@OLD} + +/obj/item/tank/jetpack/oxygen/security : /obj/item/tank/jetpack/security{@OLD} \ No newline at end of file diff --git a/tools/UpdatePaths/Scripts/93704_monitored_area_refactor.txt b/tools/UpdatePaths/Scripts/93704_monitored_area_refactor.txt new file mode 100644 index 000000000000..092c2a5c30c7 --- /dev/null +++ b/tools/UpdatePaths/Scripts/93704_monitored_area_refactor.txt @@ -0,0 +1,13 @@ +/area/station/ai_monitored/command/nuke_storage/@SUBTYPES : /area/station/command/vault/@SUBTYPES{@OLD} +/area/station/ai_monitored/command/storage/eva/@SUBTYPES : /area/station/command/eva/@SUBTYPES{@OLD} +/area/station/ai_monitored/security/armory/@SUBTYPES : /area/station/security/armory/@SUBTYPES{@OLD} +/area/station/ai_monitored/turret_protected/ai_upload/@SUBTYPES : /area/station/ai/upload/chamber/@SUBTYPES{@OLD} +/area/station/ai_monitored/turret_protected/ai_upload_foyer/@SUBTYPES : /area/station/ai/upload/foyer/@SUBTYPES{@OLD} +/area/station/ai_monitored/turret_protected/ai/@SUBTYPES : /area/station/ai/satellite/chamber/@SUBTYPES{@OLD} +/area/station/ai_monitored/aisat/exterior/@SUBTYPES : /area/station/ai/satellite/exterior/@SUBTYPES{@OLD} +/area/station/ai_monitored/turret_protected/aisat/maint/@SUBTYPES : /area/station/ai/satellite/maintenance/@SUBTYPES{@OLD} +/area/station/ai_monitored/command/storage/satellite/@SUBTYPES : /area/station/ai/satellite/maintenance/storage/@SUBTYPES{@OLD} +/area/station/ai_monitored/turret_protected/aisat/@SUBTYPES : /area/station/ai/satellite/@SUBTYPES{@OLD} +/area/station/ai_monitored/turret_protected/aisat_interior/@SUBTYPES : /area/station/ai/satellite/interior/@SUBTYPES{@OLD} +/area/station/ai_monitored/turret_protected/ai_sat_ext_as/@SUBTYPES : /area/station/ai/exterior{@OLD} +/area/station/ai_monitored/turret_protected/ai_sat_ext_ap/@SUBTYPES : /area/station/ai/exterior{@OLD} diff --git a/tools/UpdatePaths/Scripts/93808_turret_control_varedited_iconstate.txt b/tools/UpdatePaths/Scripts/93808_turret_control_varedited_iconstate.txt new file mode 100644 index 000000000000..f90f797eab93 --- /dev/null +++ b/tools/UpdatePaths/Scripts/93808_turret_control_varedited_iconstate.txt @@ -0,0 +1 @@ +/obj/machinery/turretid{icon_state=@ANY} : /obj/machinery/turretid{@OLD;icon_state=@SKIP} diff --git a/tools/UpdatePaths/Scripts/93810_refactor_signposts.txt b/tools/UpdatePaths/Scripts/93810_refactor_signposts.txt new file mode 100644 index 000000000000..4a77f273a564 --- /dev/null +++ b/tools/UpdatePaths/Scripts/93810_refactor_signposts.txt @@ -0,0 +1 @@ +/obj/structure/no_effect_signpost/@SUBTYPES : /obj/structure/signpost/@SUBTYPES{@OLD} diff --git a/tools/UpdatePaths/Scripts/93873_aicore_refactor.txt b/tools/UpdatePaths/Scripts/93873_aicore_refactor.txt new file mode 100644 index 000000000000..aa15c612a0f2 --- /dev/null +++ b/tools/UpdatePaths/Scripts/93873_aicore_refactor.txt @@ -0,0 +1 @@ +/obj/structure/ai_core/deactivated/@SUBTYPES : /obj/structure/ai_core/@SUBTYPES{@OLD;state=5} diff --git a/tools/UpdatePaths/Scripts/93957_grilled_cheese.txt b/tools/UpdatePaths/Scripts/93957_grilled_cheese.txt new file mode 100644 index 000000000000..9b73fd986e78 --- /dev/null +++ b/tools/UpdatePaths/Scripts/93957_grilled_cheese.txt @@ -0,0 +1 @@ +/obj/item/food/sandwich/cheese/grilled : /obj/item/food/sandwich/grilled_cheese{@OLD} diff --git a/tools/UpdatePaths/Scripts/94014_captain_costumes.txt b/tools/UpdatePaths/Scripts/94014_captain_costumes.txt new file mode 100644 index 000000000000..5617337b629c --- /dev/null +++ b/tools/UpdatePaths/Scripts/94014_captain_costumes.txt @@ -0,0 +1,4 @@ +/obj/item/clothing/under/rank/captain/suit : /obj/item/clothing/under/costume/captain{@OLD} +/obj/item/clothing/under/rank/captain/suit/skirt : /obj/item/clothing/under/costume/captain/skirt{@OLD} +/obj/item/clothing/under/rank/civilian/head_of_personnel/suit : /obj/item/clothing/under/costume/head_of_personnel{@OLD} +/obj/item/clothing/under/rank/civilian/head_of_personnel/suit/skirt : /obj/item/clothing/under/costume/head_of_personnel/skirt{@OLD} diff --git a/tools/UpdatePaths/Scripts/94040_unres_mass_replacer.txt b/tools/UpdatePaths/Scripts/94040_unres_mass_replacer.txt new file mode 100644 index 000000000000..1bffc2d05bbc --- /dev/null +++ b/tools/UpdatePaths/Scripts/94040_unres_mass_replacer.txt @@ -0,0 +1,2 @@ +/obj/effect/mapping_helpers/airlock/unres : /obj/effect/mapping_helpers/airlock/unres/delayed{@OLD} +/obj/machinery/door/@SUBTYPES{unres_sensor=@ANY} : /obj/machinery/door/@SUBTYPES{@OLD;unres_sensor=@SKIP} diff --git a/tools/UpdatePaths/Scripts/94059_nantrasensign_directional.txt b/tools/UpdatePaths/Scripts/94059_nantrasensign_directional.txt new file mode 100644 index 000000000000..787946f7e4dd --- /dev/null +++ b/tools/UpdatePaths/Scripts/94059_nantrasensign_directional.txt @@ -0,0 +1,4 @@ +/obj/structure/sign/nanotrasen{dir = 1} : /obj/structure/sign/nanotrasen/directional/north +/obj/structure/sign/nanotrasen{dir = 2} : /obj/structure/sign/nanotrasen/directional/south +/obj/structure/sign/nanotrasen{dir = 4} : /obj/structure/sign/nanotrasen/directional/east +/obj/structure/sign/nanotrasen{dir = 8} : /obj/structure/sign/nanotrasen/directional/west diff --git a/tools/UpdatePaths/Scripts/94089_vibro_repaths.txt b/tools/UpdatePaths/Scripts/94089_vibro_repaths.txt new file mode 100644 index 000000000000..4ee856206b9d --- /dev/null +++ b/tools/UpdatePaths/Scripts/94089_vibro_repaths.txt @@ -0,0 +1,5 @@ +/obj/item/nullrod/claymore/spellblade : /obj/item/nullrod/vibro/spellblade{@OLD} + +/obj/item/nullrod/claymore/talking : /obj/item/nullrod/vibro/talking{@OLD} + +/obj/item/nullrod/claymore/talking/chainsword : /obj/item/nullrod/vibro/talking/chainsword{@OLD} \ No newline at end of file diff --git a/tools/UpdatePaths/Scripts/94139_granted_stamp.txt b/tools/UpdatePaths/Scripts/94139_granted_stamp.txt new file mode 100644 index 000000000000..0b7ae67377fc --- /dev/null +++ b/tools/UpdatePaths/Scripts/94139_granted_stamp.txt @@ -0,0 +1 @@ +/obj/item/stamp : /obj/item/stamp/granted{@OLD} \ No newline at end of file diff --git a/tools/UpdatePaths/Scripts/94181_directional_signs_2.txt b/tools/UpdatePaths/Scripts/94181_directional_signs_2.txt new file mode 100644 index 000000000000..2eb653862c9a --- /dev/null +++ b/tools/UpdatePaths/Scripts/94181_directional_signs_2.txt @@ -0,0 +1,15 @@ +/obj/structure/sign/warning{dir = 1} : /obj/structure/sign/warning/directional/north +/obj/structure/sign/warning{dir = 2} : /obj/structure/sign/warning/directional/south +/obj/structure/sign/warning{dir = 4} : /obj/structure/sign/warning/directional/east +/obj/structure/sign/warning{dir = 8} : /obj/structure/sign/warning/directional/west + +/obj/structure/sign/warning/radiation{dir = 1} : /obj/structure/sign/warning/radiation/directional/north +/obj/structure/sign/warning/radiation{dir = 2} : /obj/structure/sign/warning/radiation/directional/south +/obj/structure/sign/warning/radiation{dir = 4} : /obj/structure/sign/warning/radiation/directional/east +/obj/structure/sign/warning/radiation{dir = 8} : /obj/structure/sign/warning/radiation/directional/west + +/obj/structure/sign/warning/secure_area{dir = 1} : /obj/structure/sign/warning/secure_area/directional/north +/obj/structure/sign/warning/secure_area{dir = 2} : /obj/structure/sign/warning/secure_area/directional/south +/obj/structure/sign/warning/secure_area{dir = 4} : /obj/structure/sign/warning/secure_area/directional/east +/obj/structure/sign/warning/secure_area{dir = 8} : /obj/structure/sign/warning/secure_area/directional/west + diff --git a/tools/UpdatePaths/Scripts/94315_directional_signs_3.txt b/tools/UpdatePaths/Scripts/94315_directional_signs_3.txt new file mode 100644 index 000000000000..ade8617704bb --- /dev/null +++ b/tools/UpdatePaths/Scripts/94315_directional_signs_3.txt @@ -0,0 +1,9 @@ +/obj/structure/sign/departments/cargo{dir=1} : /obj/structure/sign/departments/cargo/directional/north +/obj/structure/sign/departments/cargo{dir=2} : /obj/structure/sign/departments/cargo/directional/south +/obj/structure/sign/departments/cargo{dir=4} : /obj/structure/sign/departments/cargo/directional/east +/obj/structure/sign/departments/cargo{dir=8} : /obj/structure/sign/departments/cargo/directional/west + +/obj/structure/sign/warning/vacuum/external{dir=1} : /obj/structure/sign/warning/vacuum/external/directional/north +/obj/structure/sign/warning/vacuum/external{dir=2} : /obj/structure/sign/warning/vacuum/external/directional/south +/obj/structure/sign/warning/vacuum/external{dir=4} : /obj/structure/sign/warning/vacuum/external/directional/east +/obj/structure/sign/warning/vacuum/external{dir=8} : /obj/structure/sign/warning/vacuum/external/directional/west diff --git a/tools/UpdatePaths/Scripts/Apoc/1_carpets.txt b/tools/UpdatePaths/Scripts/Apoc/1_carpets.txt deleted file mode 100644 index eab2ea08f495..000000000000 --- a/tools/UpdatePaths/Scripts/Apoc/1_carpets.txt +++ /dev/null @@ -1,2 +0,0 @@ -/turf/open/floor/carpet/vamp : /turf/open/floor/carpet/apoc -/turf/open/floor/carpet/vamp/@SUBTYPES : /turf/open/floor/carpet/apoc/@SUBTYPES diff --git a/tools/UpdatePaths/Scripts/DarkPack/000_map_compats.txt b/tools/UpdatePaths/Scripts/DarkPack/000_map_compats.txt index e0c17efe7215..167c06a5724c 100644 --- a/tools/UpdatePaths/Scripts/DarkPack/000_map_compats.txt +++ b/tools/UpdatePaths/Scripts/DarkPack/000_map_compats.txt @@ -3,7 +3,7 @@ # #66978 never made an updates path /obj/structure/flora/ausbushes : /obj/structure/flora/bush/style_random {@OLD} /obj/structure/flora/ausbushes/reedbush : /obj/structure/flora/bush/reed/style_random {@OLD} -/obj/structure/flora/ausbushes/leafybush : /obj/structure/flora/bush/leafy/style_random {@OLD} +/obj/structure/flora/ausbushes/leafybush : /obj/structure/flora/bush/leavy/style_random {@OLD} /obj/structure/flora/ausbushes/palebush : /obj/structure/flora/bush/stalky/style_random {@OLD} /obj/structure/flora/ausbushes/stalkybush : /obj/structure/flora/bush/stalky/style_random {@OLD} /obj/structure/flora/ausbushes/grassybush : /obj/structure/flora/bush/grassy/style_random {@OLD} @@ -18,6 +18,14 @@ /obj/structure/flora/ausbushes/sparsegrass : /obj/structure/flora/bush/sparsegrass/style_random {@OLD} /obj/structure/flora/ausbushes/fullgrass : /obj/structure/flora/bush/fullgrass/style_random {@OLD} /obj/structure/flora/stump : /obj/structure/flora/tree/stump +/obj/structure/flora/ausbushes/shortgrass : /obj/structure/flora/bush/style_random {@OLD} +/obj/structure/flora/ausbushes/tallgrass/dry : /obj/structure/flora/bush/style_random {@OLD} +/obj/structure/flora/junglebush : /obj/structure/flora/bush/style_random {@OLD} +/obj/structure/flora/junglebush/b : /obj/structure/flora/bush/style_random {@OLD} +/obj/structure/flora/junglebush/c : /obj/structure/flora/bush/style_random {@OLD} +/obj/structure/flora/junglebush/large : /obj/structure/flora/bush/style_random {@OLD} +/obj/structure/flora/rock/jungle : /obj/structure/flora/bush/style_random {@OLD} +/obj/structure/flora/rock/pile/largejungle : /obj/structure/flora/bush/style_random {@OLD} /obj/structure/fluff/hedge : /obj/structure/hedge {@OLD} /obj/structure/mopbucket : /obj/structure/mop_bucket {@OLD} @@ -43,3 +51,27 @@ /mob/living/simple_animal/deer : /mob/living/basic/deer /mob/living/simple_animal/cow : /mob/living/basic/cow /mob/living/simple_animal/hostile/cockroach : /mob/living/basic/cockroach/sewer + +# for some reasn our ghosts dont have /retaliate/ and thus arent caught by the ghost conversion txt... +/mob/living/simple_animal/hostile/ghost : /mob/living/basic/ghost +/mob/living/simple_animal/hostile/ghost/hostile : /mob/living/basic/ghost + +/obj/structure/extinguisher_cabinet{dir = @UNSET} : /obj/structure/extinguisher_cabinet/directional/north +/obj/structure/extinguisher_cabinet{dir = 1} : /obj/structure/extinguisher_cabinet/directional/north +/obj/structure/extinguisher_cabinet{dir = 2} : /obj/structure/extinguisher_cabinet/directional/south +/obj/structure/extinguisher_cabinet{dir = 4} : /obj/structure/extinguisher_cabinet/directional/east +/obj/structure/extinguisher_cabinet{dir = 8} : /obj/structure/extinguisher_cabinet/directional/west + +/obj/item/food/soup/stew : @DELETE +/obj/item/food/soup/vegetable : @DELETE +/obj/item/food/soup/bungocurry : @DELETE +/obj/item/food/chewable/spiderlollipop : /obj/item/food/spiderlollipop + +/obj/item/kitchen/knife/butcher : /obj/item/knife/butcher{@OLD} +/obj/item/kitchen/knife/plastic : /obj/item/knife/plastic{@OLD} +/obj/item/kitchen/knife/shiv : /obj/item/knife/shiv + +/obj/item/melee/classic_baton/telescopic : /obj/item/melee/baton/telescopic + + + diff --git a/tools/UpdatePaths/Scripts/DarkPack/000_sanity.txt b/tools/UpdatePaths/Scripts/DarkPack/000_sanity.txt index 8f2a1620844e..7393f0b1c58b 100644 --- a/tools/UpdatePaths/Scripts/DarkPack/000_sanity.txt +++ b/tools/UpdatePaths/Scripts/DarkPack/000_sanity.txt @@ -18,9 +18,8 @@ /obj/machinery/light/prince{dir = @UNSET} : /obj/machinery/light/prince/directional/north /obj/machinery/light/prince{dir = 1} : /obj/machinery/light/prince/directional/south /obj/machinery/light/prince{dir = 2} : /obj/machinery/light/prince/directional/north -/obj/machinery/light/prince{dir = 4} : /obj/machinery/light/prince/directional/east -/obj/machinery/light/prince{dir = 8} : /obj/machinery/light/prince/directional/west - +/obj/machinery/light/prince{dir = 4} : /obj/machinery/light/prince/directional/west +/obj/machinery/light/prince{dir = 8} : /obj/machinery/light/prince/directional/east # Fixing terrible mapping partices or linting fails @@ -28,8 +27,25 @@ /area/@SUBTYPES : /area/@SUBTYPES /obj/@SUBTYPES : /obj/@SUBTYPES{@OLD;layer=@SKIP} +/obj/@SUBTYPES : /obj/@SUBTYPES{@OLD;plane=@SKIP} /obj/structure/window : /obj/structure/window{@OLD;dir=@SKIP} /obj/structure/window/@SUBTYPES : /obj/structure/window/@SUBTYPES{@OLD;dir=@SKIP} /turf/closed/wall/vampwall/@SUBTYPES{density=0} : @OLD{@OLD;color="#BBBBBB"} + +/obj/structure/noticeboard : /obj/structure/noticeboard {@OLD;icon_state=@SKIP} + +/obj/item/kirbyplants {icon_state="plant0"} : /obj/item/kirbyplants/darkpack {@OLD;icon_state=@SKIP} +/obj/item/kirbyplants {icon_state="plant1"} : /obj/item/kirbyplants/darkpack/plant1 {@OLD;icon_state=@SKIP} +/obj/item/kirbyplants {icon_state="plant2"} : /obj/item/kirbyplants/darkpack/plant2 {@OLD;icon_state=@SKIP} +/obj/item/kirbyplants {icon_state="plant3"} : /obj/item/kirbyplants/darkpack/plant3 {@OLD;icon_state=@SKIP} +/obj/item/kirbyplants {icon_state="plant4"} : /obj/item/kirbyplants/darkpack/plant4 {@OLD;icon_state=@SKIP} +/obj/item/kirbyplants {icon_state="plant5"} : /obj/item/kirbyplants/darkpack/plant5 {@OLD;icon_state=@SKIP} + +/obj/structure/table/optable/optable2 : /obj/structure/table/optable {@OLD} + +/turf/open/floor/circuit/telecomms/airless : /turf/open/floor/circuit + +# WOD13 made them real gasmasks in some pr. +/obj/item/clothing/mask/vampire : /obj/item/clothing/mask/gas/vampire {@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/100_tzimisce_creatures.txt b/tools/UpdatePaths/Scripts/DarkPack/100_tzimisce_creatures.txt new file mode 100644 index 000000000000..0d8cf7203aa5 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/100_tzimisce_creatures.txt @@ -0,0 +1,7 @@ +/mob/living/simple_animal/hostile/beastmaster : @DELETE +/mob/living/simple_animal/hostile/biter : /mob/living/basic/szlachta +/mob/living/simple_animal/hostile/biter/hostile : /mob/living/basic/szlachta/hostile +/mob/living/simple_animal/hostile/fister : /mob/living/basic/szlachta/fister +/mob/living/simple_animal/hostile/fister/hostile : /mob/living/basic/szlachta/fister/hostile +/mob/living/simple_animal/hostile/tanker : /mob/living/basic/szlachta/tanker +/mob/living/simple_animal/hostile/tanker/hostile : /mob/living/basic/szlachta/tanker/hostile diff --git a/tools/UpdatePaths/Scripts/DarkPack/101_jobcode.txt b/tools/UpdatePaths/Scripts/DarkPack/101_jobcode.txt new file mode 100644 index 000000000000..6a60cea67999 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/101_jobcode.txt @@ -0,0 +1,2 @@ +/obj/item/card/id/@SUBTYPES : /obj/item/card/@SUBTYPES +/obj/item/cockclock : /obj/item/watch diff --git a/tools/UpdatePaths/Scripts/DarkPack/101_jobs.txt b/tools/UpdatePaths/Scripts/DarkPack/101_jobs.txt new file mode 100644 index 000000000000..1b3cd3a7df64 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/101_jobs.txt @@ -0,0 +1 @@ +/obj/effect/landmark/start/barkeeper : /obj/effect/landmark/start/baron {@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/147_belts_tasers.txt b/tools/UpdatePaths/Scripts/DarkPack/147_belts_tasers.txt new file mode 100644 index 000000000000..ae963c3c1357 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/147_belts_tasers.txt @@ -0,0 +1,8 @@ +/obj/item/storage/belt/holster/detective/vampire : /obj/item/storage/belt/holster/detective/darkpack {@OLD} +/obj/item/storage/belt/holster/detective/vampire/@SUBTYPES : /obj/item/storage/belt/holster/detective/darkpack/@SUBTYPES {@OLD} + +/obj/item/ammo_box/vampire : /obj/item/ammo_box/darkpack {@OLD} +/obj/item/ammo_box/vampire/@SUBTYPES : /obj/item/ammo_box/darkpack/@SUBTYPES {@OLD} + +/obj/item/gun/energy/taser/twoshot : /obj/item/gun/energy/taser/darkpack {@OLD} +/obj/item/melee/baton/handtaser : /obj/item/melee/baton/security/handtaser {@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/150_fish.txt b/tools/UpdatePaths/Scripts/DarkPack/150_fish.txt new file mode 100644 index 000000000000..21fb0e57ad27 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/150_fish.txt @@ -0,0 +1 @@ +/obj/item/food/fish/@SUBTYPES : /obj/item/fish/darkpack/@SUBTYPES {@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/187_delete_elevators.txt b/tools/UpdatePaths/Scripts/DarkPack/187_delete_elevators.txt new file mode 100644 index 000000000000..af31cc66132e --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/187_delete_elevators.txt @@ -0,0 +1,5 @@ +/obj/elevator_door : @DELETE +/obj/elevator_door/@SUBTYPES : @DELETE +/obj/elevator_button : /obj/machinery/button {@OLD} +/obj/elevator_button_down : /obj/machinery/button {@OLD} +/obj/elevator_button_up : @DELETE diff --git a/tools/UpdatePaths/Scripts/DarkPack/000_area_sanity_again.txt b/tools/UpdatePaths/Scripts/DarkPack/194_area_sanity_again.txt similarity index 100% rename from tools/UpdatePaths/Scripts/DarkPack/000_area_sanity_again.txt rename to tools/UpdatePaths/Scripts/DarkPack/194_area_sanity_again.txt diff --git a/tools/UpdatePaths/Scripts/DarkPack/199_smooth_walls.txt b/tools/UpdatePaths/Scripts/DarkPack/199_smooth_walls.txt new file mode 100644 index 000000000000..817e94318075 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/199_smooth_walls.txt @@ -0,0 +1,4 @@ +/turf/closed/wall/vampwall : /turf/closed/wall/vampwall/brick_old {@OLD} +/turf/closed/wall/vampwall/low : /turf/closed/wall/vampwall/brick_old/low {@OLD} +/turf/closed/wall/vampwall/low/window : /turf/closed/wall/vampwall/brick_old/low/window {@OLD} +/turf/closed/wall/vampwall/low/window/reinforced : /turf/closed/wall/vampwall/brick_old/low/window/reinforced {@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/205_store_tables.txt b/tools/UpdatePaths/Scripts/DarkPack/205_store_tables.txt new file mode 100644 index 000000000000..29070801437d --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/205_store_tables.txt @@ -0,0 +1,11 @@ +/obj/structure/rack/bubway : /obj/structure/table/countertop/bubway +/obj/structure/rack/bubway/@SUBTYPES : /obj/structure/table/countertop/bubway + +/obj/structure/rack/tacobell : /obj/structure/table/countertop/bacotell +/obj/structure/rack/tacobell/@SUBTYPES : /obj/structure/table/countertop/bacotell + +/obj/structure/table/bubway : /obj/structure/table/countertop/bubway +/obj/structure/table/bubway@SUBTYPES : /obj/structure/table/countertop/bubway + +/obj/structure/table/bacotell : /obj/structure/table/countertop/bacotell +/obj/structure/table/bacotell/@SUBTYPES : /obj/structure/table/countertop/bacotell diff --git a/tools/UpdatePaths/Scripts/DarkPack/206_weedshit.txt b/tools/UpdatePaths/Scripts/DarkPack/206_weedshit.txt new file mode 100644 index 000000000000..0c4528014c2f --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/206_weedshit.txt @@ -0,0 +1,6 @@ +/obj/item/weedseed : /obj/item/seeds/cannabis {@OLD} +/obj/item/food/vampire/weed : /obj/item/food/grown/cannabis {@OLD} +/obj/item/weedpack : /obj/item/food/grown/cannabis {@OLD} + +/obj/item/bailer : /obj/item/reagent_containers/cup/watering_can/metal {@OLD} +/obj/structure/weedshit : /obj/machinery/hydroponics/simple/plastic {@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/216_flora.txt b/tools/UpdatePaths/Scripts/DarkPack/216_flora.txt new file mode 100644 index 000000000000..acc3b26e85cf --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/216_flora.txt @@ -0,0 +1,12 @@ +/obj/structure/flora/ausbushes/tallgrass : /obj/structure/flora/grass/tall/style_random +/obj/structure/flora/ausbushes/tallgrass/dry : /obj/structure/flora/grass/tall/dry/style_random +/obj/structure/flora/ausbushes/shortgrass : /obj/structure/flora/grass/short/style_random +/obj/structure/flora/ausbushes/redflower : /obj/structure/flora/bush/redflower/style_random + +/turf/open/floor/plating/vampgrass/random : /turf/open/misc/grass/vamp/random +/turf/open/floor/plating/vampgrass/random/@SUBTYPES : /turf/open/misc/grass/vamp/random/@SUBTYPES + +/obj/structure/vamprocks : /obj/structure/flora/rock/darkpack +/obj/structure/small_vamprocks : /obj/structure/flora/rock/pile/darkpack +/obj/structure/big_vamprocks : /obj/structure/flora/rock/darkpack_big +/obj/structure/stalagmite : /obj/structure/flora/rock/stalagmite diff --git a/tools/UpdatePaths/Scripts/DarkPack/220_floors.txt b/tools/UpdatePaths/Scripts/DarkPack/220_floors.txt new file mode 100644 index 000000000000..bf363d508089 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/220_floors.txt @@ -0,0 +1,32 @@ +/turf/open/floor/plating/vampcanal : /turf/open/floor/plating/canal +/turf/open/floor/plating/vampcanalplating : /turf/open/floor/plating/canalplating + +/turf/open/floor/plating/woodrough : /turf/open/floor/wood/rough +/turf/open/floor/plating/woodfancy : /turf/open/floor/wood/herring +/turf/open/floor/plating/vampwood : /turf/open/floor/wood/old +/turf/open/floor/plating/parquetry : /turf/open/floor/wood/smooth +/turf/open/floor/plating/parquetry/old: /turf/open/floor/wood/smooth/old +/turf/open/floor/plating/parquetry/rich: /turf/open/floor/wood/ornate + +/turf/open/floor/plating/vampcarpet : /turf/open/floor/carpet/darkpack/old + +/turf/open/floor/plating/vampplating : /turf/open/floor/city/plating +/turf/open/floor/plating/vampplating/mono : /turf/open/floor/city/plating_mono +/turf/open/floor/plating/vampplating/stone : /turf/open/floor/city/plating_stone +/turf/open/floor/plating/toilet : /turf/open/floor/city/toilet +/turf/open/floor/plating/industrial : /turf/open/floor/city/industrial +/turf/open/floor/plating/circled : /turf/open/floor/city/circled +/turf/open/floor/plating/church : /turf/open/floor/city/church +/turf/open/floor/plating/saint : /turf/open/floor/city/saint +/turf/open/floor/plating/bacotell : /turf/open/floor/city/bacotell +/turf/open/floor/plating/gummaguts : /turf/open/floor/city/gummaguts + +/turf/open/floor/plating/vampcrossableocean : /turf/open/water/beach/vamp + +/turf/open/misc/dirt/vamp : /turf/open/misc/dirt +/turf/open/misc/dirt/vamp/@SUBTYPES : /turf/open/misc/dirt/@SUBTYPES +/turf/open/misc/grass/vamp : /turf/open/misc/grass +/turf/open/misc/grass/vamp/@SUBTYPES : /turf/open/misc/grass/@SUBTYPES + +/turf/open/floor/plating/bloodshit : /turf/open/water/bloodwave +/turf/open/water/acid/vamp : /turf/open/water/acid diff --git a/tools/UpdatePaths/Scripts/DarkPack/222_missing_updatepaths.txt b/tools/UpdatePaths/Scripts/DarkPack/222_missing_updatepaths.txt new file mode 100644 index 000000000000..400fe7879e00 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/222_missing_updatepaths.txt @@ -0,0 +1,49 @@ +/area/vtm/baywalk: /area/vtm/outside/baywalk +/area/vtm/substation : /area/vtm/inside/substation +/area/vtm/cabdepot : /area/vtm/interior/cabdepot +/area/vtm/church/interior : /area/vtm/interior/church +/area/vtm/church/interior/haven : /area/vtm/interior/church/haven +/area/vtm/church/interior/staff : /area/vtm/interior/church/staff +/area/vtm/financialdistrict/library : /area/vtm/interior/library +/area/vtm/fishermanswharf/ghetto : /area/vtm/outside/fishermanswharf/ghetto +/area/vtm/fishermanswharf/lower : /area/vtm/outside/fishermanswharf/lower +/area/vtm/fishermanswharf/industrial : /area/vtm/outside/fishermanswharf/industrial +/area/vtm/forest/caves : /area/vtm/interior/caves +/area/vtm/interior/giovanni/outside : /area/vtm/outside/giovanni/courtyard +/area/vtm/sewer/tzimisce_sanctum : /area/vtm/interior/tzimisce_sanctum +/area/vtm/sewer/@SUBTYPES : /area/vtm/interior/sewer/@SUBTYPES +/area/vtm/pacificheights/@SUBTYPES : /area/vtm/outside/pacificheights/@SUBTYPES +/area/vtm/substation : /area/vtm/interior/substation +/area/vtm/inside/substation : /area/vtm/interior/substation + +# Deleted landmarks are for landmarks with no job attached. +/obj/effect/landmark/start/assamite : @DELETE +/obj/effect/landmark/start/baali : @DELETE +/obj/effect/landmark/start/caitiff : @DELETE +/obj/effect/landmark/start/hunter : @DELETE +/obj/effect/landmark/start/kiasyd : @DELETE +/obj/effect/landmark/start/lasombra : @DELETE +/obj/effect/landmark/start/liaison : @DELETE +/obj/effect/landmark/start/nagaraja : @DELETE +/obj/effect/landmark/start/salubri : @DELETE + +# we're removing this mob spawner +/obj/effect/mob_spawn/human/chunkguard : @DELETE + +/obj/effect/mob_spawn/human/corpse/@SUBTYPES : /obj/effect/mob_spawn/corpse/human/@SUBTYPES + +# This item doesn't exist on TG anymore. +/obj/item/melee/rune_knife : @DELETE + +/obj/structure/railing/metal/corner : /obj/structure/railing/corner {@OLD} +/obj/structure/railing/metal : /obj/structure/railing {@OLD} + +/turf/open/floor/circuit/telecomms/normal_temp : /turf/open/floor/circuit + +/obj/structure/musician/piano/ipiano : /obj/structure/musician/piano/darkpack/ipiano + +/obj/structure/closet/crate/freezer/surplus_limbs/organs : /obj/structure/closet/crate/freezer/organ +/obj/structure/closet/crate/freezer/fridge : /obj/structure/closet/secure_closet/freezer/fridge/all_access + +/obj/structure/chair/sofa/old : /obj/structure/chair/sofa {@OLD} +/obj/structure/chair/sofa/old/@SUBTYPES : /obj/structure/chair/sofa/@SUBTYPES {@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/225_city_map.txt b/tools/UpdatePaths/Scripts/DarkPack/225_city_map.txt new file mode 100644 index 000000000000..88c43027e7b6 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/225_city_map.txt @@ -0,0 +1 @@ +/obj/structure/vampmap : /obj/structure/city_map diff --git a/tools/UpdatePaths/Scripts/DarkPack/227_phones.txt b/tools/UpdatePaths/Scripts/DarkPack/227_phones.txt new file mode 100644 index 000000000000..c75de75b5eea --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/227_phones.txt @@ -0,0 +1,6 @@ +/obj/item/vamp/phone/street : /obj/item/smartphone/payphone +/obj/item/vamp/phone/clean : /obj/item/smartphone/clean +/obj/item/vamp/phone/emergency : /obj/item/smartphone/emergency + +/obj/item/vamp/phone/@SUBTYPES : /obj/item/smartphone/@SUBTYPES {@OLD} +/obj/item/vamp/phone : /obj/item/smartphone {@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/235_chips.txt b/tools/UpdatePaths/Scripts/DarkPack/235_chips.txt new file mode 100644 index 000000000000..39b13a788617 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/235_chips.txt @@ -0,0 +1,2 @@ +/obj/item/trash/vampirecrisps : /obj/item/trash/chips {@OLD} +/obj/item/food/vampire/crisps : /obj/item/food/chips {@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/237_vampdoor_sanity.txt b/tools/UpdatePaths/Scripts/DarkPack/237_vampdoor_sanity.txt new file mode 100644 index 000000000000..389a2baf8985 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/237_vampdoor_sanity.txt @@ -0,0 +1,31 @@ +# Simple doors +/obj/structure/vampdoor/camarilla : /obj/structure/vampdoor/simple/camarilla{@OLD} +/obj/structure/vampdoor/anarch : /obj/structure/vampdoor/simple/anarch{@OLD} +/obj/structure/vampdoor/bar : /obj/structure/vampdoor/simple/bar{@OLD} +/obj/structure/vampdoor/supply : /obj/structure/vampdoor/simple/supply{@OLD} +/obj/structure/vampdoor/strip : /obj/structure/vampdoor/simple/strip{@OLD} +/obj/structure/vampdoor/dispatch : /obj/structure/vampdoor/simple/dispatch{@OLD} +/obj/structure/vampdoor/police : /obj/structure/vampdoor/simple/police{@OLD} +/obj/structure/vampdoor/police/secure : /obj/structure/vampdoor/simple/police/secure{@OLD} + +# Wood doors +/obj/structure/vampdoor/daughters : /obj/structure/vampdoor/wood/daughters{@OLD} +/obj/structure/vampdoor/npc : /obj/structure/vampdoor/wood/npc{@OLD} + +# Oldwood doors +/obj/structure/vampdoor/wood/old : /obj/structure/vampdoor/oldwood{@OLD} +/obj/structure/vampdoor/graveyard : /obj/structure/vampdoor/oldwood/graveyard{@OLD} +/obj/structure/vampdoor/church : /obj/structure/vampdoor/oldwood/church{@OLD} +/obj/structure/vampdoor/wood/old/chantry : /obj/structure/vampdoor/oldwood/chantry{@OLD} +/obj/structure/vampdoor/baali : /obj/structure/vampdoor/oldwood/baali {@OLD} +/obj/structure/vampdoor/salubri : /obj/structure/vampdoor/wood/old/salubri {@OLD} +/obj/structure/vampdoor/old_clan_tzimisce : /obj/structure/vampdoor/wood/old/clan_tzimisce {@OLD} + +# Reinf doors +/obj/structure/vampdoor/cleaning : /obj/structure/vampdoor/reinf/cleaning{@OLD} + +# Old doors +/obj/structure/vampdoor/chantry : /obj/structure/vampdoor/old/chantry{@OLD} + +# Woodglass doors +/obj/structure/vampdoor/glass/prince : /obj/structure/vampdoor/woodglass/prince{@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/274_tome_ritual_refactor.txt b/tools/UpdatePaths/Scripts/DarkPack/274_tome_ritual_refactor.txt new file mode 100644 index 000000000000..ea71f9db44d2 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/274_tome_ritual_refactor.txt @@ -0,0 +1,6 @@ +/obj/item/arcane_tome : /obj/item/ritual_tome/arcane +/obj/item/mystic_tome : /obj/item/ritual_tome/abyss +/obj/item/necromancy_tome : /obj/item/ritual_tome/necromancy +/obj/necrorune/@SUBTYPES : /obj/ritual_rune/necromancy/@SUBTYPES +/obj/abyssrune/@SUBTYPES :/obj/ritual_rune/abyss/@SUBTYPES +/obj/ritualrune/@SUBTYPES : /obj/ritual_rune/thaumaturgy/@SUBTYPES diff --git a/tools/UpdatePaths/Scripts/DarkPack/314_job_start_landmarks.txt b/tools/UpdatePaths/Scripts/DarkPack/314_job_start_landmarks.txt new file mode 100644 index 000000000000..beeae8a6f523 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/314_job_start_landmarks.txt @@ -0,0 +1,112 @@ +# A few of these are pulled out from the #222 update paths to only convert a type once or fix a mistake made in it. + +# Anarchs +/obj/effect/landmark/start/barkeeper : /obj/effect/landmark/start/darkpack/anarch/baron +/obj/effect/landmark/start/baron : /obj/effect/landmark/start/darkpack/anarch/baron +/obj/effect/landmark/start/bruiser : /obj/effect/landmark/start/darkpack/anarch/bruiser +/obj/effect/landmark/start/emissary : /obj/effect/landmark/start/darkpack/anarch/emissary +/obj/effect/landmark/start/sweeper : /obj/effect/landmark/start/darkpack/anarch/sweeper +/obj/effect/landmark/start/tapster : /obj/effect/landmark/start/darkpack/anarch/tapster + +# Axe Gang +/obj/effect/landmark/start/axe_leader : /obj/effect/landmark/start/darkpack/axe/leader +/obj/effect/landmark/start/axe_gang : /obj/effect/landmark/start/darkpack/axe/gang + +# Supply +/obj/effect/landmark/start/dealer : /obj/effect/landmark/start/darkpack/supply/dealer +/obj/effect/landmark/start/supply : /obj/effect/landmark/start/darkpack/supply/tech +/obj/effect/landmark/start/supplytechnician : /obj/effect/landmark/start/darkpack/supply/tech + +# Camarilla +/obj/effect/landmark/start/prince : /obj/effect/landmark/start/darkpack/camarilla/prince +/obj/effect/landmark/start/clerk : /obj/effect/landmark/start/darkpack/camarilla/clerk +/obj/effect/landmark/start/sheriff : /obj/effect/landmark/start/darkpack/camarilla/sheriff +/obj/effect/landmark/start/hound : /obj/effect/landmark/start/darkpack/camarilla/hound +/obj/effect/landmark/start/harpy : /obj/effect/landmark/start/darkpack/camarilla/harpy +/obj/effect/landmark/start/towerwork : /obj/effect/landmark/start/darkpack/camarilla/towerwork + +# Primogen Council +/obj/effect/landmark/start/citizen{name="Primogen Toreador"} : /obj/effect/landmark/start/darkpack/primogen/toreador + +# Banu and Lasombra starts are fixed on TFN but not APOC so these need to be duplicated +/obj/effect/landmark/start/primogen_banu : /obj/effect/landmark/start/darkpack/primogen/banu +/obj/effect/landmark/start/citizen{name="Primogen Banu Haqim"} : /obj/effect/landmark/start/darkpack/primogen/banu + +/obj/effect/landmark/start/primogen_lasombra : /obj/effect/landmark/start/darkpack/primogen/lasombra +/obj/effect/landmark/start/citizen{name="Primogen Lasombra"} : /obj/effect/landmark/start/darkpack/primogen/lasombra + +/obj/effect/landmark/start/citizen{name="Primogen Malkavian"} : /obj/effect/landmark/start/darkpack/primogen/malkavian +/obj/effect/landmark/start/citizen{name="Primogen Nosferatu"} : /obj/effect/landmark/start/darkpack/primogen/nosferatu +/obj/effect/landmark/start/citizen{name="Primogen Ventrue"} : /obj/effect/landmark/start/darkpack/primogen/ventrue + +# Hospital +/obj/effect/landmark/start/vdirector : /obj/effect/landmark/start/darkpack/hospital/clinic_director +/obj/effect/landmark/start/vdoctor : /obj/effect/landmark/start/darkpack/hospital/doctor +/obj/effect/landmark/start/clinic_director : /obj/effect/landmark/start/darkpack/hospital/clinic_director +/obj/effect/landmark/start/doctor : /obj/effect/landmark/start/darkpack/hospital/doctor + +# Government & Police +/obj/effect/landmark/start/national_guard : /obj/effect/landmark/start/darkpack/law_enforcement/national_guard +/obj/effect/landmark/start/swat : /obj/effect/landmark/start/darkpack/law_enforcement/swat +/obj/effect/landmark/start{name="Police Chief"} : /obj/effect/landmark/start/darkpack/law_enforcement/chief +/obj/effect/landmark/start{name="Police Sergeant"} : /obj/effect/landmark/start/darkpack/law_enforcement/sergeant +/obj/effect/landmark/start{name="Police Officer"} : /obj/effect/landmark/start/darkpack/law_enforcement/officer +/obj/effect/landmark/start{name="Emergency Dispatcher"} : /obj/effect/landmark/start/darkpack/law_enforcement/dispatcher +/obj/effect/landmark/start{name="Federal Investigator"} : /obj/effect/landmark/start/darkpack/law_enforcement/fbi + +# Giovanni +/obj/effect/landmark/start/giovannielder : /obj/effect/landmark/start/darkpack/hecata/capo +/obj/effect/landmark/start/giovanni : /obj/effect/landmark/start/darkpack/hecata/famiglia +/obj/effect/landmark/start/giovannimafia : /obj/effect/landmark/start/darkpack/hecata/squadra +/obj/effect/landmark/start/capo : /obj/effect/landmark/start/darkpack/hecata/capo +/obj/effect/landmark/start/famiglia : /obj/effect/landmark/start/darkpack/hecata/famiglia +/obj/effect/landmark/start/squadra : /obj/effect/landmark/start/darkpack/hecata/squadra +/obj/effect/landmark/start/graveyardkeeper : /obj/effect/landmark/start/darkpack/hecata/graveyardkeeper + +# Civilian +/obj/effect/landmark/start/citizen : /obj/effect/landmark/start/darkpack/citizen/citizen +/obj/effect/landmark/start/strip : /obj/effect/landmark/start/darkpack/citizen/club_worker +/obj/effect/landmark/start/club_worker : /obj/effect/landmark/start/darkpack/citizen/club_worker +/obj/effect/landmark/start/vjanitor : /obj/effect/landmark/start/darkpack/citizen/janitor +/obj/effect/landmark/start/janitor : /obj/effect/landmark/start/darkpack/citizen/janitor +/obj/effect/landmark/start/priest : /obj/effect/landmark/start/darkpack/citizen/priest +/obj/effect/landmark/start/taxi : /obj/effect/landmark/start/darkpack/citizen/taxi + +# Sabbat +/obj/effect/landmark/start/sabbatductus : /obj/effect/landmark/start/darkpack/sabbat/ductus +/obj/effect/landmark/start/sabbatpack : /obj/effect/landmark/start/darkpack/sabbat/pack +/obj/effect/landmark/start/sabbatpriest : /obj/effect/landmark/start/darkpack/sabbat/priest +/obj/effect/landmark/start/sabbatist : /obj/effect/landmark/start/darkpack/sabbat/sabbatist + +# Chantry +/obj/effect/landmark/start/regent : /obj/effect/landmark/start/darkpack/chantry/regent +/obj/effect/landmark/start/archivist : /obj/effect/landmark/start/darkpack/chantry/archivist +/obj/effect/landmark/start/gargoyle : /obj/effect/landmark/start/darkpack/chantry/gargoyle + +# Forest Wolves +/obj/effect/landmark/start/garou/glade/council : /obj/effect/landmark/start/darkpack/forest_wolves/council +/obj/effect/landmark/start/garou/glade/keeper : /obj/effect/landmark/start/darkpack/forest_wolves/keeper +/obj/effect/landmark/start/garou/glade/catcher : /obj/effect/landmark/start/darkpack/forest_wolves/catcher +/obj/effect/landmark/start/garou/glade/warder : /obj/effect/landmark/start/darkpack/forest_wolves/warder +/obj/effect/landmark/start/garou/glade/guardian : /obj/effect/landmark/start/darkpack/forest_wolves/guardian + +# City Wolves +/obj/effect/landmark/start/garou/painted/council : /obj/effect/landmark/start/darkpack/city_wolves/council +/obj/effect/landmark/start/garou/painted/keeper : /obj/effect/landmark/start/darkpack/city_wolves/keeper +/obj/effect/landmark/start/garou/painted/catcher : /obj/effect/landmark/start/darkpack/city_wolves/catcher +/obj/effect/landmark/start/garou/painted/warder : /obj/effect/landmark/start/darkpack/city_wolves/warder +/obj/effect/landmark/start/garou/painted/guardian : /obj/effect/landmark/start/darkpack/city_wolves/guardian + +# Pentex +/obj/effect/landmark/start/first_team : /obj/effect/landmark/start/darkpack/pentex/first_team +/obj/effect/landmark/start/garou/spiral/lead : /obj/effect/landmark/start/darkpack/pentex/lead +/obj/effect/landmark/start/garou/spiral/executive : /obj/effect/landmark/start/darkpack/pentex/executive +/obj/effect/landmark/start/garou/spiral/affairs : /obj/effect/landmark/start/darkpack/pentex/affairs +/obj/effect/landmark/start/garou/spiral/secchief : /obj/effect/landmark/start/darkpack/pentex/secchief +/obj/effect/landmark/start/garou/spiral/sec : /obj/effect/landmark/start/darkpack/pentex/sec +/obj/effect/landmark/start/garou/spiral/employee : /obj/effect/landmark/start/darkpack/pentex/employee + +# Voivodate +/obj/effect/landmark/start/voivode : /obj/effect/landmark/start/darkpack/voivode/voivode +/obj/effect/landmark/start/bogatyr : /obj/effect/landmark/start/darkpack/voivode/bogatyr +/obj/effect/landmark/start/zadruga : /obj/effect/landmark/start/darkpack/voivode/zadruga diff --git a/tools/UpdatePaths/Scripts/DarkPack/318_mall_pr.txt b/tools/UpdatePaths/Scripts/DarkPack/318_mall_pr.txt new file mode 100644 index 000000000000..536ee2c81739 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/318_mall_pr.txt @@ -0,0 +1,21 @@ +/turf/open/floor/plating/toilet/clinic : /turf/open/floor/city/clinic +/turf/open/floor/plating/industrial/factory : /turf/open/floor/city/factory + +/turf/open/floor/plating/vampplating/stairs/@SUBTYPES : /turf/open/floor/iron/stairs/@SUBTYPES + +/turf/open/floor/carpet/vamp/@SUBTYPES : /turf/open/floor/carpet/darkpack/@SUBTYPES + +/obj/effect/turf_decal/apoc/@SUBTYPES : /obj/effect/turf_decal/darkpack/@SUBTYPES {@OLD} + +/obj/structure/chair/green : /obj/structure/chair/darkpack/green {@OLD} +/obj/structure/chair/red : /obj/structure/chair/darkpack/red {@OLD} +/obj/structure/chair/blue : /obj/structure/chair/darkpack/blue {@OLD} +/obj/structure/chair/office/green : /obj/structure/chair/office/darkpack/green {@OLD} +/obj/structure/chair/office/red : /obj/structure/chair/office/darkpack/red {@OLD} +/obj/structure/chair/office/blue : /obj/structure/chair/office/darkpack/blue {@OLD} +/obj/item/chair/green : /obj/item/chair/darkpack/green {@OLD} +/obj/item/chair/red : /obj/item/chair/darkpack/red {@OLD} +/obj/item/chair/blue : /obj/item/chair/darkpack/blue {@OLD} +/obj/item/chair/office/green : /obj/item/chair/office/darkpack/green {@OLD} +/obj/item/chair/office/red : /obj/item/chair/office/darkpack/red {@OLD} +/obj/item/chair/office/blue : /obj/item/chair/office/darkpack/blue {@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/338_low_wall_platforms.txt b/tools/UpdatePaths/Scripts/DarkPack/338_low_wall_platforms.txt new file mode 100644 index 000000000000..27a765e950d4 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/338_low_wall_platforms.txt @@ -0,0 +1,38 @@ +/turf/closed/wall/vampwall/low : /obj/structure/platform/lowwall , /turf/open/floor/plating/rough +/turf/closed/wall/vampwall/low/@SUBTYPES : /obj/structure/platform/lowwall/@SUBTYPES , /turf/open/floor/plating/rough + +/turf/closed/wall/vampwall/rich/low : /obj/structure/platform/lowwall/rich , /turf/open/floor/plating/rough +/turf/closed/wall/vampwall/rich/low/@SUBTYPES : /obj/structure/platform/lowwall/rich/@SUBTYPES , /turf/open/floor/plating/rough + +/turf/closed/wall/vampwall/rich/old/low : /obj/structure/platform/lowwall/rich/old , /turf/open/floor/plating/rough +/turf/closed/wall/vampwall/rich/old/low/@SUBTYPES : /obj/structure/platform/lowwall/rich/old/@SUBTYPES , /turf/open/floor/plating/rough + +/turf/closed/wall/vampwall/brick_old/low : /obj/structure/platform/lowwall/brick_old , /turf/open/floor/plating/rough +/turf/closed/wall/vampwall/brick_old/low/@SUBTYPES : /obj/structure/platform/lowwall/brick_old/@SUBTYPES , /turf/open/floor/plating/rough + +/turf/closed/wall/vampwall/junk/low : /obj/structure/platform/lowwall/junk , /turf/open/floor/plating/rough +/turf/closed/wall/vampwall/junk/low/@SUBTYPES : /obj/structure/platform/lowwall/junk/@SUBTYPES , /turf/open/floor/plating/rough + +/turf/closed/wall/vampwall/junk/alt/low : /obj/structure/platform/lowwall/junk/alt , /turf/open/floor/plating/rough +/turf/closed/wall/vampwall/junk/alt/low/@SUBTYPES : /obj/structure/platform/lowwall/junk/alt/@SUBTYPES , /turf/open/floor/plating/rough + +/turf/closed/wall/vampwall/market/low : /obj/structure/platform/lowwall/market , /turf/open/floor/plating/rough +/turf/closed/wall/vampwall/market/low/@SUBTYPES : /obj/structure/platform/lowwall/market/@SUBTYPES , /turf/open/floor/plating/rough + +/turf/closed/wall/vampwall/old/low : /obj/structure/platform/lowwall/old , /turf/open/floor/plating/rough +/turf/closed/wall/vampwall/old/low/@SUBTYPES : /obj/structure/platform/lowwall/old/@SUBTYPES , /turf/open/floor/plating/rough + +/turf/closed/wall/vampwall/painted/low : /obj/structure/platform/lowwall/painted , /turf/open/floor/plating/rough +/turf/closed/wall/vampwall/painted/low/@SUBTYPES : /obj/structure/platform/lowwall/painted/@SUBTYPES , /turf/open/floor/plating/rough + +/turf/closed/wall/vampwall/brick/low : /obj/structure/platform/lowwall/brick , /turf/open/floor/plating/rough +/turf/closed/wall/vampwall/brick/low/@SUBTYPES : /obj/structure/platform/lowwall/brick/@SUBTYPES , /turf/open/floor/plating/rough + +/turf/closed/wall/vampwall/city/low : /obj/structure/platform/lowwall/city , /turf/open/floor/plating/rough +/turf/closed/wall/vampwall/city/low/@SUBTYPES : /obj/structure/platform/lowwall/city/@SUBTYPES , /turf/open/floor/plating/rough + +/turf/closed/wall/vampwall/bar/low : /obj/structure/platform/lowwall/bar , /turf/open/floor/plating/rough +/turf/closed/wall/vampwall/bar/low/@SUBTYPES : /obj/structure/platform/lowwall/bar/@SUBTYPES , /turf/open/floor/plating/rough + +/turf/closed/wall/vampwall/wood/low : /obj/structure/platform/lowwall/wood , /turf/open/floor/plating/rough +/turf/closed/wall/vampwall/wood/low/@SUBTYPES : /obj/structure/platform/lowwall/wood/@SUBTYPES , /turf/open/floor/plating/rough diff --git a/tools/UpdatePaths/Scripts/DarkPack/404_remove_artifact.txt b/tools/UpdatePaths/Scripts/DarkPack/404_remove_artifact.txt new file mode 100644 index 000000000000..e5259c788506 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/404_remove_artifact.txt @@ -0,0 +1 @@ +/obj/item/vtm_artifact/saulocept : @DELETE \ No newline at end of file diff --git a/tools/UpdatePaths/Scripts/DarkPack/423_mannequins.txt b/tools/UpdatePaths/Scripts/DarkPack/423_mannequins.txt new file mode 100644 index 000000000000..98557e7224fd --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/423_mannequins.txt @@ -0,0 +1,4 @@ +/mob/living/carbon/human/species/vamp_mannequin : /obj/structure/mannequin/plastic +/mob/living/carbon/human/species/vamp_mannequin/conquestador : /obj/structure/mannequin/plastic/conquistador +/mob/living/carbon/human/species/vamp_mannequin/cowboy : /obj/structure/mannequin/plastic/cowboy +/mob/living/carbon/human/species/vamp_mannequin/napoleon : /obj/structure/mannequin/plastic/napoleon diff --git a/tools/UpdatePaths/Scripts/DarkPack/425_pentex_endron_clothes.txt b/tools/UpdatePaths/Scripts/DarkPack/425_pentex_endron_clothes.txt new file mode 100644 index 000000000000..e545cb920d0b --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/425_pentex_endron_clothes.txt @@ -0,0 +1,24 @@ +/obj/item/clothing/head/pentex/pentex_beret : /obj/item/clothing/head/vampire/pentex_beret +/obj/item/clothing/head/pentex/pentex_whitehardhat : /obj/item/clothing/head/vampire/pentex_whitehardhat +/obj/item/clothing/head/pentex/pentex_yellowhardhat : /obj/item/clothing/head/vampire/pentex_yellowhardhat +/obj/item/clothing/suit/chaplainsuit/studentuni : /obj/item/clothing/suit/chaplainsuit/armor/studentuni +/obj/item/clothing/under/pentex/pentex_turtleneck : /obj/item/clothing/under/vampire/pentex_turtleneck +/obj/item/clothing/under/pentex/pentex_janitor : /obj/item/clothing/under/vampire/pentex_janitor +/obj/item/clothing/under/pentex/pentex_longleeve : /obj/item/clothing/under/vampire/pentex_longleeve +/obj/item/clothing/under/pentex/pentex_shortsleeve : /obj/item/clothing/under/vampire/pentex_shortsleeve +/obj/item/clothing/under/pentex/pentex_suit : /obj/item/clothing/under/vampire/pentex_suit +/obj/item/clothing/under/pentex/pentex_suit : /obj/item/clothing/under/vampire/pentex_suitskirt +/obj/item/clothing/under/suit/white_on_white : /obj/item/clothing/under/suit/white +/obj/item/clothing/suit/pentex/pentex_labcoat : /obj/item/clothing/suit/vampire/pentex_labcoat +/obj/item/clothing/suit/pentex/pentex_labcoat_alt : /obj/item/clothing/suit/vampire/pentex_labcoat_alt +/obj/item/reagent_containers/food/drinks/silver_goblet : /obj/item/reagent_containers/cup/silver_goblet +/obj/item/reagent_containers/food/drinks/silver_goblet/vaulderie_goblet : /obj/item/reagent_containers/cup/silver_goblet/vaulderie_goblet +/obj/structure/vampdoor/oldwood : /obj/structure/vampdoor/old +/obj/structure/vampdoor/oldwood/church : /obj/structure/vampdoor/old/church +/obj/structure/vampdoor/oldwood/graveyard : /obj/structure/vampdoor/old/graveyard +/obj/structure/vampdoor/children_of_gaia : /obj/structure/vampdoor/oldwood/children_of_gaia +/obj/structure/vampdoor/food_pantry : /obj/structure/vampdoor/simple/food_pantry +/obj/structure/vampdoor/nps : /obj/structure/vampdoor/wood/nps +/obj/structure/vampdoor/setite : /obj/structure/vampdoor/simple/setite +/obj/structure/vampdoor/setite/high_sec : /obj/structure/vampdoor/reinf/setite_high_sec +/obj/structure/vampdoor/wood/old/salubri : /obj/structure/vampdoor/oldwood/salubri diff --git a/tools/UpdatePaths/Scripts/DarkPack/432_radios.txt b/tools/UpdatePaths/Scripts/DarkPack/432_radios.txt new file mode 100644 index 000000000000..724077704971 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/432_radios.txt @@ -0,0 +1,9 @@ +/obj/item/p25radio : /obj/item/radio +/obj/item/p25radio/police : /obj/item/radio/headset/darkpack/police +# There should only be really one tranceiver for each faction. +/obj/machinery/p25policeportal : @DELETE +/obj/machinery/p25transceiver/anarch : /obj/machinery/radio_tranceiver/anarch +/obj/machinery/p25transceiver/clinic : /obj/machinery/radio_tranceiver/clinic +/obj/machinery/p25transceiver/endron : /obj/machinery/radio_tranceiver/endron +/obj/machinery/p25transceiver/police : /obj/machinery/radio_tranceiver/police +/obj/machinery/p25transceiver/tower : /obj/machinery/radio_tranceiver/camarilla diff --git a/tools/UpdatePaths/Scripts/DarkPack/437_missing_map_types.txt b/tools/UpdatePaths/Scripts/DarkPack/437_missing_map_types.txt new file mode 100644 index 000000000000..67f406eff016 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/437_missing_map_types.txt @@ -0,0 +1,15 @@ +/obj/structure/retail/grocery : /obj/structure/retail/grocery_store +/obj/item/fake_sarcophagus : /obj/fake_sarcophagus +/mob/living/carbon/human/npc/sabbat/@SUBTYPES : @DELETE +/obj/clinic_machine/pyxis : @DELETE +/obj/item/clothing/under/pentex/pentex_executive_suit : /obj/item/clothing/under/vampire/pentex_executive_suit +/obj/item/clothing/under/pentex/pentex_executiveskirt : /obj/item/clothing/under/vampire/pentex_executiveskirt +/obj/item/clothing/under/pentex/pentex_suitskirt : /obj/item/clothing/under/vampire/pentex_suitskirt +/obj/item/fish/darkpack/tune : /obj/item/fish/darkpack/tuna +/obj/item/ammo_box/magazine/vampmac10 : /obj/item/ammo_box/magazine/darkpack45smg +/obj/item/ammo_box/magazine/vamp556/hunt : /obj/item/ammo_box/magazine/darkpack556/hunt +/obj/item/gun/ballistic/vampire/mac10 : /obj/item/gun/ballistic/automatic/darkpack/mac10 +/obj/item/reagent_containers/cup/glass/beer/vampire : /obj/item/reagent_containers/cup/glass/bottle/beer/vampire +/obj/item/reagent_containers/cup/glass/beer/vampire/blue_stripe : /obj/item/reagent_containers/cup/glass/bottle/beer/vampire/blue_stripe +/obj/item/reagent_containers/cup/glass/beer/vampire/typhon : /obj/item/reagent_containers/cup/glass/bottle/beer/vampire/typhon +/obj/item/reagent_containers/cup/glass/bottle/vampirewater : /obj/item/reagent_containers/cup/glass/vampirewater diff --git a/tools/UpdatePaths/Scripts/DarkPack/454_ashtray.txt b/tools/UpdatePaths/Scripts/DarkPack/454_ashtray.txt new file mode 100644 index 000000000000..c1e28bc4d593 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/454_ashtray.txt @@ -0,0 +1,2 @@ +/obj/item/reagent_containers/glass/bowl/mushroom_bowl{name="ashtray"} : /obj/item/storage/ashtray {@OLD;name=@SKIP} +/obj/item/reagent_containers/glass/bowl/ash_tray : /obj/item/storage/ashtray {@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/492_apoc_types_extravaganza.txt b/tools/UpdatePaths/Scripts/DarkPack/492_apoc_types_extravaganza.txt new file mode 100644 index 000000000000..7c2d8a2f524a --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/492_apoc_types_extravaganza.txt @@ -0,0 +1,24 @@ +# Not an apoc type but GRRRRRR xeon +/mob/living/simple_animal/hostile/biter/lasombra : /mob/living/basic/lasombra +/mob/living/simple_animal/hostile/biter/lasombra/better : /mob/living/basic/lasombra/better + +# Turf decals +/obj/effect/turf_decal/apoc/vampbeach : /obj/effect/turf_decal/darkpack/sand +/obj/effect/turf_decal/apoc/vampbeach/corner : /obj/effect/turf_decal/darkpack/sand/corner +/obj/effect/turf_decal/apoc/vampdirt : /obj/effect/turf_decal/darkpack/dirt +/obj/effect/turf_decal/apoc/vampdirt/corner : /obj/effect/turf_decal/darkpack/dirt/corner +/obj/effect/turf_decal/apoc/vampgrass : /obj/effect/turf_decal/darkpack/grass +/obj/effect/turf_decal/apoc/vampgrass/corner : /obj/effect/turf_decal/darkpack/grass/corner +/obj/effect/turf_decal/apoc/rough : /obj/effect/turf_decal/darkpack/rough +/obj/effect/turf_decal/apoc/rough/corner : /obj/effect/turf_decal/darkpack/rough/corner +/obj/effect/turf_decal/apoc/cave : /obj/effect/turf_decal/darkpack/cave +/obj/effect/turf_decal/apoc/cave/corner : /obj/effect/turf_decal/darkpack/cave/corner + +# kitchen knives +/obj/item/kitchen/knife/butcher : /obj/item/knife/butcher +/obj/item/kitchen/knife/plastic : /obj/item/knife/plastic + +# misc +/obj/item/toy/mecha/fireripley : /obj/item/toy/mecha/firefighter +/obj/item/storage/fancy/hardcase : /obj/item/storage/fancy/hardcase/mag_mp5 +/obj/item/melee/classic_baton/telescopic : /obj/item/melee/baton/telescopic diff --git a/tools/UpdatePaths/Scripts/DarkPack/508_tfn_mpatypes.txt b/tools/UpdatePaths/Scripts/DarkPack/508_tfn_mpatypes.txt new file mode 100644 index 000000000000..adac612e4593 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/508_tfn_mpatypes.txt @@ -0,0 +1,66 @@ +/mob/living/simple_animal/pet/cat/vampire : /mob/living/basic/pet/cat/darkpack +/mob/living/basic/pet/cat/vampire : /mob/living/basic/pet/cat/darkpack +/mob/living/simple_animal/pet/cat/vampiretzi : /mob/living/basic/pet/cat/darkpack/tzi +/mob/living/basic/pet/cat/vampire/tzi : /mob/living/basic/pet/cat/darkpack/tzi +/mob/living/basic/pet/cat/vampiretzi : /mob/living/basic/pet/cat/darkpack/tzi +/mob/living/carbon/human/npc/police/static : @DELETE + +/obj/item/clothing/suit/costume/yakuza : /obj/item/clothing/suit/vampire/majima_jacket +/obj/item/clothing/suit/costume/nerdshirt : /obj/item/clothing/suit/costume/wellworn_shirt/wornout/graphic +/obj/item/clothing/suit/costume/ianshirt : /obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian +/obj/item/clothing/suit/costume/dutch : /obj/item/clothing/suit/vampire/dutch + +/obj/item/melee/vamp/longsword/keeper : /obj/item/claymore/longsword/keeper{@OLD} + +/obj/item/police_radio : @DELETE + +/obj/item/reagent_containers/cup/glass/meth : /obj/item/reagent_containers/cup/glass/baggie/meth +/obj/item/reagent_containers/cup/glass/meth/cocaine : /obj/item/reagent_containers/cup/glass/baggie/meth/cocaine +/obj/item/reagent_containers/cup/glass/silver_goblet/vaulderie_goblet : /obj/item/reagent_containers/cup/silver_goblet/vaulderie_goblet{@OLD} +/obj/item/reagent_containers/cup/glass/bottle/vampirecola/summer_thaw : /obj/item/reagent_containers/cup/soda_cans/summer_thaw + +/obj/item/storage/pill_bottle/estrogen : @DELETE +/obj/item/storage/fancy/hardcase/mp5 : /obj/item/storage/fancy/hardcase/mag_mp5 + +/obj/item/supplypod_beacon_origin : /obj/item/supplypod_beacon + +/obj/machinery/vending/cola/@SUBTYPES : /obj/machinery/vending/cola/@SUBTYPES +/obj/machinery/vending/snack/@SUBTYPES : /obj/machinery/vending/snack/@SUBTYPES + +/obj/machinery/computer/order_console/mining/fastfood/snacks : /obj/machinery/vending/snack{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/coffeevendor : /obj/machinery/vending/coffee{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/sodavendor : /obj/machinery/vending/cola{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/sodavendor/blue : /obj/machinery/vending/cola/blue{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/bacotell : /obj/structure/retail/bacotell_menu{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/bubway : /obj/structure/retail/bubway_menu{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/gummaguts : /obj/structure/retail/gummaguts_menu{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/products : /obj/structure/retail/junkfood_menu{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/smoking : /obj/structure/retail/smoke_menu{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/gas : /obj/structure/retail/gas_station{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/costumes : /obj/structure/retail/costume_store{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/clothing : /obj/structure/retail/clothing_store{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/illegal : /obj/structure/retail/black_market{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/antique : /obj/structure/retail/antique{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/camping : /obj/structure/retail/camping{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/deli : /obj/structure/retail/deli{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/general : /obj/structure/retail/general{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/grocery : /obj/structure/retail/grocery_store{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/library : /obj/structure/retail/library{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/music : /obj/structure/retail/music{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/occult : /obj/structure/retail/occult{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/pharmacy : /obj/structure/retail/pharmacy{@OLD} +/obj/machinery/computer/order_console/mining/fastfood/@SUBTYPES : /obj/structure/retail/@SUBTYPES{@OLD} + +/obj/machinery/fax/fbi : /obj/machinery/fax/admin/fbi + +/obj/machinery/light/small/pink : @DELETE + +/obj/projectile/bullet/reusable/gumball : @DELETE + +/obj/effect/landmark/start/darkpack/city_wolves/@SUBTYPES : @DELETE +/obj/effect/landmark/start/darkpack/forest_wolves/keeper : @DELETE +/obj/effect/landmark/start/darkpack/hecata/graveyardkeeper : /obj/effect/landmark/start/darkpack/citizen/graveyardkeeper + +/obj/item/stocks_license : @DELETE + +/obj/structure/musician/piano/darkpack/ipiano : /obj/structure/musician/piano{@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/67_doors.txt b/tools/UpdatePaths/Scripts/DarkPack/67_doors.txt deleted file mode 100644 index 21ee5821b7ef..000000000000 --- a/tools/UpdatePaths/Scripts/DarkPack/67_doors.txt +++ /dev/null @@ -1,3 +0,0 @@ -/obj/structure/vampdoor/baali : /obj/structure/vampdoor/wood/old/baali {@OLD} -/obj/structure/vampdoor/salubri : /obj/structure/vampdoor/wood/old/salubri {@OLD} -/obj/structure/vampdoor/old_clan_tzimisce : /obj/structure/vampdoor/wood/old/clan_tzimisce {@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/68_guns.txt b/tools/UpdatePaths/Scripts/DarkPack/68_guns.txt index 032804a8554c..7cc8f6185df4 100644 --- a/tools/UpdatePaths/Scripts/DarkPack/68_guns.txt +++ b/tools/UpdatePaths/Scripts/DarkPack/68_guns.txt @@ -15,6 +15,7 @@ /obj/item/ammo_box/magazine/vamp9mp5 : /obj/item/ammo_box/magazine/darkpack9mp5 {@OLD} /obj/item/ammo_box/magazine/vamp45acp : /obj/item/ammo_box/magazine/darkpack45acp {@OLD} /obj/item/ammo_box/magazine/vamp556 : /obj/item/ammo_box/magazine/darkpack556 {@OLD} +/obj/item/ammo_box/magazine/vamp556/@SUBTYPES : /obj/item/ammo_box/magazine/darkpack556/@SUBTYPES {@OLD} /obj/item/ammo_box/magazine/vamp545 : /obj/item/ammo_box/magazine/darkpack545 {@OLD} /obj/item/ammo_box/magazine/vampthompson : /obj/item/ammo_box/magazine/darkpackthompson {@OLD} /obj/item/ammo_box/magazine/vampaug : /obj/item/ammo_box/magazine/darkpackaug {@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/78_fire.txt b/tools/UpdatePaths/Scripts/DarkPack/78_fire.txt new file mode 100644 index 000000000000..18636d2219b3 --- /dev/null +++ b/tools/UpdatePaths/Scripts/DarkPack/78_fire.txt @@ -0,0 +1 @@ +/obj/item/vampire_flamethrower : /obj/item/liquid_flamethrower{@OLD} diff --git a/tools/UpdatePaths/Scripts/DarkPack/81_store_tables.txt b/tools/UpdatePaths/Scripts/DarkPack/81_store_tables.txt deleted file mode 100644 index 86bbe932964d..000000000000 --- a/tools/UpdatePaths/Scripts/DarkPack/81_store_tables.txt +++ /dev/null @@ -1,5 +0,0 @@ -/obj/structure/rack/bubway : /obj/structure/table/bubway -/obj/structure/rack/bubway/@SUBTYPES : /obj/structure/table/bubway - -/obj/structure/rack/tacobell : /obj/structure/table/bacotell -/obj/structure/rack/tacobell/@SUBTYPES : /obj/structure/table/bacotell diff --git a/tools/UpdatePaths/Scripts/DarkPack/96_nonhuman_NPC.txt b/tools/UpdatePaths/Scripts/DarkPack/96_nonhuman_NPC.txt index c380aa49cc77..aa1e8daff5a1 100644 --- a/tools/UpdatePaths/Scripts/DarkPack/96_nonhuman_NPC.txt +++ b/tools/UpdatePaths/Scripts/DarkPack/96_nonhuman_NPC.txt @@ -1,4 +1,4 @@ -/mob/living/simple_animal/hostile/beastmaster/rat/flying : /mob/living/basic/bat/vampire{@OLD} +/mob/living/simple_animal/hostile/beastmaster/rat/flying : /mob/living/basic/bat{@OLD} /mob/living/simple_animal/hostile/beastmaster/shadow_guard : /mob/living/basic/shadow_guard{@OLD} /mob/living/simple_animal/hostile/beastmaster/blood_guard : /mob/living/basic/blood_guard{@OLD} /mob/living/simple_animal/hostile/beastmaster/fireball : @DELETE diff --git a/tools/UpdatePaths/__main__.py b/tools/UpdatePaths/__main__.py index 477b1f125ae5..2715176451c1 100644 --- a/tools/UpdatePaths/__main__.py +++ b/tools/UpdatePaths/__main__.py @@ -177,9 +177,12 @@ def main(args): print("Using replacement:", args.update_source) updates = [args.update_source] else: - with open(args.update_source) as f: - updates = [line for line in f if line and not line.startswith("#") and not line.isspace()] - print(f"Using {len(updates)} replacements from file:", args.update_source) + updates = [] + for source in args.update_source: + with open(source) as f: + updates_from_file = [line for line in f if line and not line.startswith("#") and not line.isspace()] + print(f"Using {len(updates_from_file)} replacements from file:", source) + updates.extend(updates_from_file) if args.map: update_map(args.map, updates, verbose=args.verbose) @@ -191,10 +194,10 @@ def main(args): if __name__ == "__main__": prog = __spec__.name.replace('.__main__', '') if os.name == 'nt' and len(sys.argv) <= 1: - print("usage: drag-and-drop a path script .txt onto `Update Paths.bat`\n or") + print("usage: drag-and-drop one or more .txt path script onto `Update Paths.bat`\n or") parser = argparse.ArgumentParser(prog=prog, description=desc, formatter_class=argparse.RawTextHelpFormatter) - parser.add_argument("update_source", help="update file path / line of update notation") + parser.add_argument("update_source", nargs="+", help="update file path(s) / line of update notation") parser.add_argument("--map", "-m", help="path to update, defaults to all maps in maps directory") parser.add_argument("--directory", "-d", help="path to maps directory, defaults to _maps/") parser.add_argument("--inline", "-i", help="treat update source as update string instead of path", action="store_true") diff --git a/tools/autowiki/autowiki.js b/tools/autowiki/autowiki.js index 4144911a1f0c..0d2a4c1c4595 100644 --- a/tools/autowiki/autowiki.js +++ b/tools/autowiki/autowiki.js @@ -38,7 +38,7 @@ async function main() { const bot = new MWBot(); await bot.loginGetEditToken({ - apiUrl: "https://tgstation13.org/wiki/api.php", + apiUrl: "https://wiki.tgstation13.org/api.php", username: USERNAME, password: PASSWORD, }); diff --git a/tools/bootstrap/python b/tools/bootstrap/python index 0c8d70202060..46b146961a06 100755 --- a/tools/bootstrap/python +++ b/tools/bootstrap/python @@ -25,6 +25,12 @@ PythonDir="$Cache/python-$PythonVersion" PythonExe="$PythonDir/python.exe" Log="$Cache/last-command.log" +# function that prints an error message and exits +error_exit() { + echo "If you are seeing this message, please try to fix it by running tools/hooks/install.(bat/sh) again." + exit 1 +} + # If a portable Python for Windows is not present, search on $PATH. if [ "$(uname)" = "Linux" ] || [ ! -f "$PythonExe" ]; then # Strip the "App Execution Aliases" from $PATH. Even if the user installed @@ -55,7 +61,7 @@ if [ "$(uname)" = "Linux" ] || [ ! -f "$PythonExe" ]; then echo "Please install Python from https://www.python.org/downloads/ or using your system's package manager." fi echo - exit 1 + error_exit fi # Create a venv and activate it @@ -70,13 +76,14 @@ if [ "$(uname)" = "Linux" ] || [ ! -f "$PythonExe" ]; then PythonExe="$PythonDir/scripts/python3.exe"; else echo "bootstrap/python failed to find the python executable inside its virtualenv" - exit 1 + error_exit fi fi # Use pip to install our requirements if [ ! -f "$PythonDir/requirements.txt" ] || [ "$(b2sum < "$Sdk/requirements.txt")" != "$(b2sum < "$PythonDir/requirements.txt")" ]; then echo "Updating dependencies..." + "$PythonExe" -m ensurepip --default-pip "$PythonExe" -m pip install -U wheel "$PythonExe" -m pip install -U pip -r "$Sdk/requirements.txt" cp "$Sdk/requirements.txt" "$PythonDir/requirements.txt" diff --git a/tools/build/build.ts b/tools/build/build.ts index 00226787333d..787cb0f54d7d 100644 --- a/tools/build/build.ts +++ b/tools/build/build.ts @@ -22,7 +22,7 @@ export const DME_NAME = 'tgstation'; Juke.chdir('../..', import.meta.url); -const dependencies: Record = await Bun.file('dependencies.sh') +const dependencies: Record = await Bun.file('dependencies.sh') .text() .then(formatDeps) .catch((err) => { @@ -147,11 +147,10 @@ export const DmMapsIncludeTarget = new Juke.Target({ ...Juke.glob('_maps/shuttles/**/*.dmm'), ...Juke.glob('_maps/templates/**/*.dmm'), ]; - const content = - folders - .map((file) => file.replace('_maps/', '')) - .map((file) => `#include "${file}"`) - .join('\n') + '\n'; + const content = `${folders + .map((file) => file.replace('_maps/', '')) + .map((file) => `#include "${file}"`) + .join('\n')}\n`; fs.writeFileSync('_maps/templates.dm', content); }, }); @@ -412,6 +411,7 @@ export const TguiCleanTarget = new Juke.Target({ Juke.rm('tgui/public/*.{chunk,bundle,hot-update}.*'); Juke.rm('tgui/packages/tgfont/dist', { recursive: true }); Juke.rm('tgui/node_modules', { recursive: true }); + Juke.rm('tgui/packages/*/node_modules', { recursive: true }); }, }); diff --git a/tools/build/bun.lock b/tools/build/bun.lock index 92ec5f8022a2..5ea28f1ad344 100644 --- a/tools/build/bun.lock +++ b/tools/build/bun.lock @@ -1,18 +1,19 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "devDependencies": { - "@types/bun": "^1.2.16", + "@types/bun": "^1.3.5", }, }, }, "packages": { - "@types/bun": ["@types/bun@1.2.16", "", { "dependencies": { "bun-types": "1.2.16" } }, "sha512-1aCZJ/6nSiViw339RsaNhkNoEloLaPzZhxMOYEa7OzRzO41IGg5n/7I43/ZIAW/c+Q6cT12Vf7fOZOoVIzb5BQ=="], + "@types/bun": ["@types/bun@1.3.5", "", { "dependencies": { "bun-types": "1.3.5" } }, "sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w=="], "@types/node": ["@types/node@22.15.29", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ=="], - "bun-types": ["bun-types@1.2.16", "", { "dependencies": { "@types/node": "*" } }, "sha512-ciXLrHV4PXax9vHvUrkvun9VPVGOVwbbbBF/Ev1cXz12lyEZMoJpIJABOfPcN9gDJRaiKF9MVbSygLg4NXu3/A=="], + "bun-types": ["bun-types@1.3.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw=="], "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], } diff --git a/tools/build/lib/byond.ts b/tools/build/lib/byond.ts index 5a7e1786045a..1601bb4dcf10 100644 --- a/tools/build/lib/byond.ts +++ b/tools/build/lib/byond.ts @@ -1,11 +1,11 @@ -import fs from "node:fs"; -import path from "node:path"; -import Juke from "../juke/index.js"; -import { regQuery } from "./winreg"; -import Bun from "bun"; +import fs from 'node:fs'; +import path from 'node:path'; +import Bun from 'bun'; +import Juke from '../juke/index.js'; +import { regQuery } from './winreg'; /** Cached path to DM compiler */ -let dmPath; +let dmPath: string; async function getDmPath(namedVersion?: string | null): Promise { // Use specific named version @@ -18,14 +18,14 @@ async function getDmPath(namedVersion?: string | null): Promise { dmPath = await (async () => { // Search in array of paths const paths = [ - ...((process.env.DM_EXE && process.env.DM_EXE.split(",")) || []), + ...(process.env.DM_EXE?.split(',') || []), ...(await getDefaultNamedByondVersionPath()), - "C:\\Program Files\\BYOND\\bin\\dm.exe", - "C:\\Program Files (x86)\\BYOND\\bin\\dm.exe", - ["reg", "HKLM\\Software\\Dantom\\BYOND", "installpath"], - ["reg", "HKLM\\SOFTWARE\\WOW6432Node\\Dantom\\BYOND", "installpath"], + 'C:\\Program Files\\BYOND\\bin\\dm.exe', + 'C:\\Program Files (x86)\\BYOND\\bin\\dm.exe', + ['reg', 'HKLM\\Software\\Dantom\\BYOND', 'installpath'], + ['reg', 'HKLM\\SOFTWARE\\WOW6432Node\\Dantom\\BYOND', 'installpath'], ]; - const isFile = (path) => { + const isFile = (path: string) => { try { return fs.statSync(path).isFile(); } catch (err) { @@ -36,7 +36,7 @@ async function getDmPath(namedVersion?: string | null): Promise { // Resolve a registry key if (Array.isArray(path)) { const [_type, ...args] = path; - path = (await regQuery(args[0], args[1])) || ""; + path = (await regQuery(args[0], args[1])) || ''; } if (!path) { continue; @@ -45,15 +45,15 @@ async function getDmPath(namedVersion?: string | null): Promise { if (isFile(path)) { return path; } - if (isFile(path + "/dm.exe")) { - return path + "/dm.exe"; + if (isFile(`${path}/dm.exe`)) { + return `${path}/dm.exe`; } - if (isFile(path + "/bin/dm.exe")) { - return path + "/bin/dm.exe"; + if (isFile(`${path}/bin/dm.exe`)) { + return `${path}/bin/dm.exe`; } } // Default paths - return (process.platform === "win32" && "dm.exe") || "DreamMaker"; + return (process.platform === 'win32' && 'dm.exe') || 'DreamMaker'; })(); return dmPath; } @@ -63,7 +63,7 @@ async function getNamedByondVersionPath(namedVersion: string): Promise { const map_entry = all_entries.find((x) => x.name === namedVersion); if (map_entry === undefined) { Juke.logger.error( - `No named byond version with name "${namedVersion}" found.` + `No named byond version with name "${namedVersion}" found.`, ); throw new Juke.ExitCode(1); } @@ -72,7 +72,7 @@ async function getNamedByondVersionPath(namedVersion: string): Promise { async function getDefaultNamedByondVersionPath(): Promise { const all_entries = await getAllNamedDmVersions(false); - const map_entry = all_entries.find((x) => x.default == true); + const map_entry = all_entries.find((x) => x.default === true); if (map_entry === undefined) return []; return [map_entry.path]; } @@ -84,10 +84,10 @@ type NamedDmVersion = { }; let namedDmVersionList: NamedDmVersion[]; -export const NamedVersionFile = "tools/build/dm_versions.json"; +export const NamedVersionFile = 'tools/build/dm_versions.json'; async function getAllNamedDmVersions( - throw_on_fail: boolean + throw_on_fail: boolean, ): Promise { if (!namedDmVersionList) { if (!fs.existsSync(NamedVersionFile)) { @@ -121,25 +121,28 @@ type Option = Partial<{ export async function DreamMaker( dmeFile: string, - options: Option = {} + options: Option = {}, ): Promise { if (options.namedDmVersion !== null) { - Juke.logger.info("Using named byond version:", options.namedDmVersion); + Juke.logger.info('Using named byond version:', options.namedDmVersion); } const dmPath = await getDmPath(options.namedDmVersion); // Get project basename - const dmeBaseName = dmeFile.replace(/\.dme$/, ""); + const dmeBaseName = dmeFile.replace(/\.dme$/, ''); // Make sure output files are writable - const testOutputFile = (name) => { + const testOutputFile = (name: string) => { try { - fs.closeSync(fs.openSync(name, "r+")); - } catch (err) { - if (err && err.code === "ENOENT") { + fs.closeSync(fs.openSync(name, 'r+')); + } catch (err: unknown) { + if (!err || typeof err !== 'object' || !('code' in err)) { + throw err; + } + if (err.code === 'ENOENT') { return; } - if (err && err.code === "EBUSY") { + if (err.code === 'EBUSY') { Juke.logger.error( - `File '${name}' is locked by the DreamDaemon process.` + `File '${name}' is locked by the DreamDaemon process.`, ); Juke.logger.error(`Stop the currently running server and try again.`); throw new Juke.ExitCode(1); @@ -148,17 +151,17 @@ export async function DreamMaker( } }; - const testDmVersion = async (dmPath) => { + const testDmVersion = async (dmPath: string) => { const execReturn = await Juke.exec(dmPath, [], { silent: true, throw: false, }); const version = execReturn.combined.match( - `DM compiler version (\\d+)\\.(\\d+)` + `DM compiler version (\\d+)\\.(\\d+)`, ); if (version == null) { Juke.logger.error( - `Unexpected DreamMaker return, ensure "${dmPath}" is correct DM path.` + `Unexpected DreamMaker return, ensure "${dmPath}" is correct DM path.`, ); throw new Juke.ExitCode(1); } @@ -168,10 +171,10 @@ export async function DreamMaker( const minor = Number(version[2]); if ( major < requiredMajorVersion || - (major == requiredMajorVersion && minor < requiredMinorVersion) + (major === requiredMajorVersion && minor < requiredMinorVersion) ) { Juke.logger.error( - `${requiredMajorVersion}.${requiredMinorVersion} or later DM version required. Version ${major}.${minor} found at: ${dmPath}` + `${requiredMajorVersion}.${requiredMinorVersion} or later DM version required. Version ${major}.${minor} found at: ${dmPath}`, ); throw new Juke.ExitCode(1); } @@ -181,24 +184,24 @@ export async function DreamMaker( testOutputFile(`${dmeBaseName}.dmb`); testOutputFile(`${dmeBaseName}.rsc`); - const runWithWarningChecks = async (dmPath, args) => { + const runWithWarningChecks = async (dmPath: string, args: string[]) => { const execReturn = await Juke.exec(dmPath, args); if (options.warningsAsErrors) { const ignoredWarningCodes = options.ignoreWarningCodes ?? []; if (ignoredWarningCodes.length > 0) { Juke.logger.info( - "Ignored warning codes:", - ignoredWarningCodes.join(", ") + 'Ignored warning codes:', + ignoredWarningCodes.join(', '), ); } - const base_regex = "\\d+:warning( \\([a-z_]*\\))?:"; + const base_regex = '\\d+:warning( \\([a-z_]*\\))?:'; const with_ignores = `\\d+:warning( \\([a-z_]*\\))?:(?!(${ignoredWarningCodes .map((x) => `.*${x}.*$`) - .join("|")}))`; + .join('|')}))`; const reg = ignoredWarningCodes.length > 0 - ? new RegExp(with_ignores, "m") - : new RegExp(base_regex, "m"); + ? new RegExp(with_ignores, 'm') + : new RegExp(base_regex, 'm'); if (options.warningsAsErrors && execReturn.combined.match(reg)) { Juke.logger.error(`Compile warnings treated as errors`); throw new Juke.ExitCode(2); @@ -209,7 +212,7 @@ export async function DreamMaker( // Compile const { defines = [] } = options; if (defines && defines.length > 0) { - Juke.logger.info("Using defines:", defines.join(", ")); + Juke.logger.info('Using defines:', defines.join(', ')); } await runWithWarningChecks(dmPath, [ @@ -230,8 +233,8 @@ export async function DreamDaemon( const dmPath = await getDmPath(options.namedDmVersion); const baseDir = path.dirname(dmPath); const ddExeName = - process.platform === "win32" ? "dreamdaemon.exe" : "DreamDaemon"; - const ddExePath = baseDir === "." ? ddExeName : path.join(baseDir, ddExeName); + process.platform === 'win32' ? 'dreamdaemon.exe' : 'DreamDaemon'; + const ddExePath = baseDir === '.' ? ddExeName : path.join(baseDir, ddExeName); return Juke.exec(ddExePath, [options.dmbFile, ...args]); } diff --git a/tools/build/lib/download.ts b/tools/build/lib/download.ts index ec6e109148f4..b043de6c1be7 100644 --- a/tools/build/lib/download.ts +++ b/tools/build/lib/download.ts @@ -1,16 +1,16 @@ -import fs from "node:fs"; -import https from "node:https"; -import Juke from "../juke/index.js"; +import fs from 'node:fs'; +import https from 'node:https'; +import Juke from '../juke/index.js'; export function downloadFile(url: string, file: string): Promise { return new Promise((resolve, reject) => { const file_stream = fs.createWriteStream(file); https - .get(url, function (response) { + .get(url, (response) => { if (response.statusCode === 302 && response.headers.location) { file_stream.close(); downloadFile(response.headers.location, file).then(() => - resolve("ok"), + resolve('ok'), ); return; } @@ -25,12 +25,12 @@ export function downloadFile(url: string, file: string): Promise { response.pipe(file_stream); // after download completed close filestream - file_stream.on("finish", () => { + file_stream.on('finish', () => { file_stream.close(); - resolve("ok"); + resolve('ok'); }); }) - .on("error", (err) => { + .on('error', (err) => { file_stream.close(); Juke.logger.error(`Failed to download ${url}: ${err.message}`); reject(); diff --git a/tools/build/lib/helpers.ts b/tools/build/lib/helpers.ts index 8293a7b5801c..81f806021012 100644 --- a/tools/build/lib/helpers.ts +++ b/tools/build/lib/helpers.ts @@ -1,10 +1,10 @@ export function formatDeps(text: string): Record { return text - .split("\n") - .map((statement) => statement.replace("export", "").trim()) - .filter((value) => !(value === "" || value.startsWith("#"))) - .map((statement) => statement.split("=")) - .reduce((acc, kv_pair) => { + .split('\n') + .map((statement) => statement.replace('export', '').trim()) + .filter((value) => !(value === '' || value.startsWith('#'))) + .map((statement) => statement.split('=')) + .reduce((acc: Record, kv_pair) => { acc[kv_pair[0]] = kv_pair[1]; return acc; }, {}); diff --git a/tools/build/lib/winreg.ts b/tools/build/lib/winreg.ts index dc1a5d78316b..823146ecf3c9 100644 --- a/tools/build/lib/winreg.ts +++ b/tools/build/lib/winreg.ts @@ -8,14 +8,14 @@ * @license MIT */ -import { exec } from "node:child_process"; -import { promisify } from "node:util"; +import { exec } from 'node:child_process'; +import { promisify } from 'node:util'; export async function regQuery( path: string, key: string, -): Promise { - if (process.platform !== "win32") { +): Promise { + if (process.platform !== 'win32') { return; } try { @@ -26,11 +26,11 @@ export async function regQuery( if (indexOfKey === -1) { return; } - const indexOfEol = stdout.indexOf("\r\n", indexOfKey); + const indexOfEol = stdout.indexOf('\r\n', indexOfKey); if (indexOfEol === -1) { return; } - const indexOfValue = stdout.indexOf(" ", indexOfKey + keyPattern.length); + const indexOfValue = stdout.indexOf(' ', indexOfKey + keyPattern.length); if (indexOfValue === -1) { return; } diff --git a/tools/build/package.json b/tools/build/package.json index d0d45e6d14ea..c74af60bed72 100644 --- a/tools/build/package.json +++ b/tools/build/package.json @@ -2,6 +2,6 @@ "private": true, "type": "module", "devDependencies": { - "@types/bun": "^1.2.16" + "@types/bun": "^1.3.5" } } diff --git a/tools/maplint/README.md b/tools/maplint/README.md index 2e2a15bb1be9..f2dc26f09ff4 100644 --- a/tools/maplint/README.md +++ b/tools/maplint/README.md @@ -205,3 +205,21 @@ The all node may be added as a child to the when node to specify that it will be required_neighbors: - /obj/dogbed ``` + +### `skip_files` + +To skip processing this rule when the current filename start with a given path, either the start of a path, the full path (with extension), or regex matched. + +```yml +/area/template_noop: + banned_neighbors: + - /turf/open + - /obj + skip_files: + - _maps/templates + - _maps/minigame/deathmatch/OSHA_Violator.dmm + - pattern: "^_maps/templates/holodeck.*" +``` + +In this example, all files in '_maps/templates' (recursively), 'OSHA_Violator.dmm', and any regex matched files for 'temples/holodeck.' will be skipped for any other rules defined in this yml. + diff --git a/tools/maplint/lints/area_noop.yml b/tools/maplint/lints/area_noop.yml new file mode 100644 index 000000000000..c751e85381ba --- /dev/null +++ b/tools/maplint/lints/area_noop.yml @@ -0,0 +1,17 @@ +/area/template_noop: + banned_neighbors: + - /turf/baseturf_bottom + - /turf/baseturf_skipover + - /turf/closed + - /turf/cordon + - /turf/open + - /obj + skip_files: + - _maps/map_files/tramstation/maintenance_modules + - _maps/modular_generic + - _maps/shuttles/emergency_scrapheap + - _maps/templates + - _maps/minigame/deathmatch/OSHA_Violator.dmm + - _maps/minigame/deathmatch/maint_mania.dmm + - _maps/RandomRuins/IceRuins + - _maps/RandomRuins/LavaRuins diff --git a/tools/maplint/lints/posters_directionals.yml b/tools/maplint/lints/posters_directionals.yml deleted file mode 100644 index c93b89342829..000000000000 --- a/tools/maplint/lints/posters_directionals.yml +++ /dev/null @@ -1,5 +0,0 @@ -help: "Use the directional variants when possible." -/obj/structure/sign/poster: - banned_variables: - pixel_x: - pixel_y: diff --git a/tools/maplint/lints/wall_stacking.yml b/tools/maplint/lints/wall_stacking.yml index b9cd0a2e8096..9628cc6c8f4a 100644 --- a/tools/maplint/lints/wall_stacking.yml +++ b/tools/maplint/lints/wall_stacking.yml @@ -1,5 +1,6 @@ /turf/closed: banned_neighbors: + - /obj/structure/vampdoor - /obj/machinery/door/airlock - /obj/structure/lattice - /obj/structure/window diff --git a/tools/maplint/lints/~darkpack_multiple_doors.yml b/tools/maplint/lints/~darkpack_multiple_doors.yml new file mode 100644 index 000000000000..f5d97de8ae15 --- /dev/null +++ b/tools/maplint/lints/~darkpack_multiple_doors.yml @@ -0,0 +1,4 @@ +/obj/structure/vampdoor: + banned_neighbors: + - /obj/structure/vampdoor + diff --git a/tools/maplint/source/lint.py b/tools/maplint/source/lint.py index eee8408d5eb2..59c63be1d1c9 100644 --- a/tools/maplint/source/lint.py +++ b/tools/maplint/source/lint.py @@ -311,6 +311,7 @@ class Rules: required_neighbors: list[AtomNeighbor] = [] ignored_neighbors: list[AtomNeighbor] = [] when: Optional[When] = None + skip_files: list[Union[str, re.Pattern]] = [] def __init__(self, data): expect(isinstance(data, dict), "Lint rules must be a dictionary.") @@ -359,12 +360,38 @@ def __init__(self, data): if "when" in data: self.when = When(data.pop("when")) + if "skip_files" in data: + skip_files_data = data.pop("skip_files") + expect(isinstance(skip_files_data, list), "skip_files must be a list.") + self.skip_files = [] + for entry in skip_files_data: + if isinstance(entry, str): + self.skip_files.append(entry) + elif isinstance(entry, dict) and "pattern" in entry: + pattern = entry.pop("pattern") + self.skip_files.append(re.compile(pattern)) + expect(len(entry) == 0, f"Unknown key in skip_files entry: {', '.join(entry.keys())}.") + else: + raise MapParseError("skip_files entries must be strings or dicts with a 'pattern' key.") + expect(len(data) == 0, f"Unknown lint rules: {', '.join(data.keys())}.") def run(self, identified: Content, contents: list[Content], identified_index) -> list[MaplintError]: failures: list[MaplintError] = [] when_text = self.when.match_string() if self.when is not None else "" + if self.skip_files: + filename = getattr(identified, "filename", None) + if filename is not None: + norm = str(filename).replace("\\", "/") + for entry in self.skip_files: + if isinstance(entry, str): + if entry in norm: + return failures + else: + if entry.search(norm): + return failures + # If a when is present and is unmet, skip evaluation of this rule if self.when and not self.when.evaluate(identified): return failures diff --git a/tools/mapping_fix_template_noop_areas/fix_template_noop_in_maps.py b/tools/mapping_fix_template_noop_areas/fix_template_noop_in_maps.py new file mode 100644 index 000000000000..b59e78177c69 --- /dev/null +++ b/tools/mapping_fix_template_noop_areas/fix_template_noop_in_maps.py @@ -0,0 +1,133 @@ +import re +import sys +import subprocess +from pathlib import Path + +# ========================================================== +# REGEX +# ========================================================== +KEY_BLOCK_RE = re.compile( + r'"([^"]+)"\s*=\s*\((.*?)\)', + re.DOTALL +) + + +# ========================================================== +# GIT ROOT +# ========================================================== +def get_git_root(start_dir: Path) -> Path: + try: + out = subprocess.check_output( + ["git", "rev-parse", "--show-toplevel"], + cwd=start_dir, + stderr=subprocess.DEVNULL, + ) + return Path(out.decode().strip()) + except Exception as e: + raise SystemExit(f"Failed to determine git repo root: {e}") + + +# ========================================================== +# LOGIC +# ========================================================== +def block_needs_replacement(block: str) -> bool: + """ + A block needs replacement if: + - it contains /area/template_noop + - AND it has either an /obj OR a /turf that is not /turf/template_noop + """ + if "/area/template_noop" not in block: + return False + + has_obj = re.search(r'^\s*/obj/', block, re.MULTILINE) is not None + + has_non_template_turf = False + for m in re.finditer(r'^\s*(/turf[^\s,{]*)', block, re.MULTILINE): + turf_path = m.group(1) + if turf_path != "/turf/template_noop": + has_non_template_turf = True + break + + return has_obj or has_non_template_turf + + +def process_dmm(path: Path, git_root: Path) -> None: + text = path.read_text(encoding="utf8") + + changed = False + changed_keys = [] + + def repl(match: re.Match) -> str: + nonlocal changed + + key_name = match.group(1) + block = match.group(2) + + if not block_needs_replacement(block): + return match.group(0) + + new_block = block.replace("/area/template_noop", "/area/space/nearstation") + + if new_block == block: + return match.group(0) + + changed = True + changed_keys.append(key_name) + + return match.group(0).replace(block, new_block) + + new_text = KEY_BLOCK_RE.sub(repl, text) + + if changed: + path.write_text(new_text, encoding="utf8") + try: + rel = path.relative_to(git_root) + except ValueError: + rel = path + print(f"[{rel}] updated keys: {', '.join(changed_keys)}") + + +# ========================================================== +# MAIN +# ========================================================== +def main(): + if len(sys.argv) < 2: + print("Usage: python fix_template_noop_areas.py ") + print(" can be:") + print(" - relative to the git root (tgstation)") + print(" - or an absolute path") + sys.exit(1) + + script_dir = Path(__file__).resolve().parent + git_root = get_git_root(script_dir) + print(f"[INFO] Git root: {git_root}") + + arg_path = Path(sys.argv[1]) + + if arg_path.is_absolute(): + root_dir = arg_path + else: + root_dir = git_root / arg_path + + print(f"[INFO] Searching under: {root_dir}") + + if not root_dir.is_dir(): + raise SystemExit(f"[ERROR] Search path does not exist or is not a directory: {root_dir}") + + dmm_files = sorted(root_dir.rglob("*.dmm")) + total = len(dmm_files) + + if total == 0: + print(f"[INFO] No .dmm files found under {root_dir}") + return + + print(f"[INFO] Found {total} .dmm files") + + for idx, dmm in enumerate(dmm_files, start=1): + print(f"[INFO] ({idx}/{total}) Processing: {dmm}") + process_dmm(dmm, git_root) + + print("[INFO] Done.") + +if __name__ == "__main__": + main() diff --git a/tools/mapping_fix_template_noop_areas/launch_fix_template_noop_in_maps.bat b/tools/mapping_fix_template_noop_areas/launch_fix_template_noop_in_maps.bat new file mode 100644 index 000000000000..4565211de3cb --- /dev/null +++ b/tools/mapping_fix_template_noop_areas/launch_fix_template_noop_in_maps.bat @@ -0,0 +1,9 @@ +@echo off +setlocal + +set PY_SCRIPT=fix_template_noop_in_maps.py + +REM Example: search the SpaceRuins folder relative to git root +python "%PY_SCRIPT%" "_maps\RandomRuins\SpaceRuins" + +endlocal diff --git a/tools/requirements.txt b/tools/requirements.txt index b271fe9f5477..82347b13a29d 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -1,13 +1,13 @@ -pygit2==1.7.2 -bidict==0.22.0 -Pillow==9.3.0 +pygit2==1.19.0 +bidict==0.23.1 +Pillow==11.1.0 # changelogs -PyYaml==6.0.1 -beautifulsoup4==4.9.3 +PyYaml==6.0.3 +beautifulsoup4==4.14.3 # ezdb -mysql-connector-python==8.0.33 +mysql-connector-python==9.5.0 # icon cutter -numpy==1.26.0 +numpy==2.3.5 diff --git a/tools/tgs_scripts/PreCompile.sh b/tools/tgs_scripts/PreCompile.sh index 3810620a95cd..f11723e64db0 100755 --- a/tools/tgs_scripts/PreCompile.sh +++ b/tools/tgs_scripts/PreCompile.sh @@ -12,6 +12,36 @@ cd "$1" . dependencies.sh cd "$original_dir" +NEED_BUN_INSTALL=0 +if [ -x "$HOME/.bun/bin/bun" ]; then + export PATH="$HOME/.bun/bin:$PATH" +fi + +# If Bun is not present or older than BUN_VERSION, install using the official installer. +if ! command -v bun >/dev/null 2>&1; then + NEED_BUN_INSTALL=1 +else + INSTALLED_BUN_VERSION=$(bun --version) + if [ "$(printf '%s\n' "$BUN_VERSION" "$INSTALLED_BUN_VERSION" | sort -V | head -n1)" != "$BUN_VERSION" ]; then + NEED_BUN_INSTALL=1 + fi +fi + +if [ "$NEED_BUN_INSTALL" = "1" ]; then + echo "Installing Bun $BUN_VERSION..." + curl -fsSL https://bun.sh/install | bash + + if [ -x "$HOME/.bun/bin/bun" ]; then + export PATH="$HOME/.bun/bin:$PATH" + else + echo "ERROR: Bun installation failed; $HOME/.bun/bin/bun not found" + exit 1 + fi +fi + +INSTALLED_BUN_VERSION=$(bun --version) + +echo "Using bun $INSTALLED_BUN_VERSION (minimum required: $BUN_VERSION)" # update rust-g if [ ! -d "rust-g" ]; then diff --git a/tools/ticked_file_enforcement/schemas/modular_darkpack.json b/tools/ticked_file_enforcement/schemas/modular_darkpack.json deleted file mode 100644 index 3234a5c094ca..000000000000 --- a/tools/ticked_file_enforcement/schemas/modular_darkpack.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "file": "tgstation.dme", - "scannable_directory": "modular_darkpack/", - "subdirectories": true, - "excluded_files": [], - "forbidden_includes": [] -}